import { IngressCubit } from './ingress-cubit.js' import { createPluginContext } from 'atlibs/plugin-context/index.js' import { loadModule } from 'atlibs/run-module/index.js' // Wiring only. By default the page runs the `cargo wasm` build through the modules/ symlinks; // ?module=/ (or at://...) runs a published module record instead (its did:key is then keyed by // the record's at:// URI). // ?maxRequests=&lifetimeMs=&quietMs= fill the form, and &serve starts serving on load (a headless // tab: each log line also goes to the console): at once for the local module, after a confirm for a record. const QUERY = new URLSearchParams(location.search); const MODULE = QUERY.get('module'); const FIELDS = ['maxRequests', 'lifetimeMs', 'quietMs']; const WASM = new URL('./modules/ingress.wasm', import.meta.url); const ctx = createPluginContext({ id: 'ingress', settingsSchema: { didkeys: { type: 'secret' } } }); function localModule() { return Promise.all([ fetch(WASM).then((r) => r.arrayBuffer()), fetch(new URL('./modules/ingress.json', import.meta.url)).then((r) => r.json()), ]).then(([wasm, manifest]) => ({ module: new Uint8Array(wasm), calls: manifest.calls, didkey: manifest.didkey })); } const cubit = new IngressCubit({ ctx, module: MODULE ? loadModule(ctx, MODULE) : localModule(), id: MODULE ?? WASM.href }); const $ = (id) => document.getElementById(id); function render(state) { $('did').innerText = state.did ?? '...'; $('url').innerText = state.url ?? '...'; if (state.url) $('url').href = state.url; $('status').innerText = state.status; $('served').innerText = state.served; $('drops').innerText = state.drops; $('error').innerText = state.error ?? ''; $('start').disabled = state.status !== 'idle' && state.status !== 'done' && state.status !== 'error'; $('stop').disabled = state.status !== 'running'; $('log').replaceChildren(...state.log.map((line) => Object.assign(document.createElement('li'), { innerText: line }))); } document.addEventListener('DOMContentLoaded', async () => { cubit.subscribe(render); $('serve-form').onsubmit = (e) => { e.preventDefault(); const input = Object.fromEntries([...new FormData(e.target)].filter(([, v]) => String(v).trim() !== '')); cubit.start(input); }; $('stop').onclick = () => cubit.stop(); for (const field of FIELDS) if (QUERY.has(field)) $('serve-form')[field].value = QUERY.get(field); await cubit.init(); if (QUERY.has('serve') && (await cubit.mayAutoServe((message) => window.confirm(message)))) { cubit.subscribe((state, previous) => state.log[0] !== previous?.log[0] && state.log[0] && console.info(`ingress ${state.log[0]}`)); console.info(`ingress ${cubit.state.did} ${cubit.state.url}`); $('serve-form').requestSubmit(); } });