import { Hono } from 'hono' import { serve } from '@hono/node-server' import { stream, streamText, streamSSE } from 'hono/streaming' import { deleteCookie, getCookie, setCookie, } from 'hono/cookie' import * as fs from 'node:fs' import * as fsPromises from 'node:fs/promises' var background; var dirname = import.meta.dirname ?? new URL('.', import.meta.url).pathname; var auths = new Map(); var auths_dirty = false; try { for (let [k,v] of Object.entries(JSON.parse(fs.readFileSync(dirname+'/cookies.json')))) { auths.set(k, v); } auths_dirty = true; } catch {} async function saveCache() { if (!auths_dirty) return; glog("Saving cookies"); await fsPromises.writeFile(dirname+'/cookies.json', JSON.stringify(Object.fromEntries( [...auths.entries()].filter(([_,v]) => !v.prepping) ))); auths_dirty = false; } glog('sigmawall', dirname) for (let [key, mime] of [ ['background.png', 'image/png'], ['background.webp', 'image/webp'], ['background.jpeg', 'image/jpeg'], ['background.jpg', 'image/jpeg'], ['background.gif', 'image/gif'], ]) { try { var path = dirname + '/' + key; var mtime = Math.floor(fs.statSync(dirname + '/' + key).mtimeMs) var data = fs.readFileSync(path); var route = `/_sigmawall/${key}`; var url = `${route}?t=${mtime}`; background = { data, route, url, mime }; glog("Background image loaded", background); break; } catch {} } function randstr() { return [...crypto.getRandomValues(new Uint8Array(32))].map(e=>e.toString(16).padStart(2,0)).join(''); } var app = Object.assign(new Hono(), { port: 15345 }); function glog(...msg) { console.log(`[${(new Date()).toGMTString()}]`, ...msg); } function log(key, ...msg) { glog(`[${(key??'?'.repeat(64)).substr(0,8)}]`, ...msg) } app.all("*", async (c, next) => { var key; keyValid(getCookie(c, '_sigmawall_token')); log(getCookie(c, '_sigmawall_token'), 'Checking req', auths.get(getCookie(c, '_sigmawall_token'))); if ((key = auths.get(getCookie(c, '_sigmawall_token'))) && key.status) { keyValid(getCookie(c, '_sigmawall_token'), 10000); c.status(421); return c.text("Success"); } log(getCookie(c, '_sigmawall_token'), 'Verification required'); if (c.req.method != "GET") { log(getCookie(c, '_sigmawall_token'), 'Non-GET denied'); c.status(403); return c.text("Unauthorized"); } return next(); }); if (background) { app.get(background.route, async (c) => { c.header('Content-Type', background.mime); c.header('Cache-Control', 'public, max-age=604800, immutable'); c.header('Expires', (new Date(Date.now()+604800000).toGMTString())); return c.body(background.data); }); } var templ = str => `
Sorry but you pressed the get banned button return in ${(auth.expire - Date.now())/1000} seconds.`)); return; } else if (!auth) { key = randstr() log(getCookie(c, '_sigmawall_token'), 'Setting cookie', key); setCookie(c, '_sigmawall_token', key); c.req.raw.signal.addEventListener('abort', () => { running = false; closed = true; stream.abort(); }); boop(); (o => (o.users = 0, o.expire = Date.now() + 30*1000))(auths.get(key)); if (!closed) await stream.write(templ( ``+ `
Page should refresh automatically, if not refresh manually.` + `
Please note that sigmawall requires HTML streaming support to function, which is known to be present in the following browsers:
The following browsers are known not to support HTML streaming:
If you are using one of those browsers, consider links instead.
Verification ongoing in another window. Waiting...`)); return; } else { (o => o.users = (o.users ?? 0) + 1)(auths.get(key)); } boop(); nfinp(); c.req.raw.signal.addEventListener('abort', () => { log(key, 'Aborted'); closed = true; finf(); if (keyValid(key) && (o => o.prepping && !--o.users)(auths.get(key))) { log(key, 'Deleted'); auths.delete(key); } stream.abort(); }); var banner = newfunc(function() { banned = true; finf(); log(key, 'Foolish user banned'); auths_dirty = true; expsig(key); auths.set(key, { expire: Date.now()+1000*30, status: false }); if (verb) verb.remove(); this.remove(); banner = null; }); await stream.write(templ(`
click here if you want to get banned for 30 seconds.
otherwise, do as instructed. Trust the process
'+msg); } finally { conns--; } }); }); setInterval(async function() { for (let [k,v] of auths.entries()) { keyValid(k); } await saveCache(); }, 5000) var lastconns=-1; setInterval(function() { let prepauths = new Map([...auths.entries()].filter(e=>e[1].prepping)).size; let connsc = conns | prepauths | funcs.size; if (!(connsc == 0 && lastconns == 0)) glog(`${conns} connections.. ${prepauths} prepauths.. ${funcs.size} funcs`); lastconns = connsc; }, 5000); serve(app);