Something went wrong. Try again.
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950import assert from 'node:assert/strict';import http from 'node:http';import { once } from 'node:events';import { AvatarState } from '../dist/avatar-state.mjs';import { handleAvatarAPI } from '../avatar-api.mjs';
const store = new AvatarState();store.save = () => store.markSaved();const events = [], allowed = 'http://127.0.0.1:8766';const server = http.createServer((req, res) => handleAvatarAPI(req, res, { store, origins: new Set([allowed]), onChange: (value) => events.push(value), }),);server.listen(0, '127.0.0.1');await once(server, 'listening');const url = 'http://127.0.0.1:' + server.address().port;const post = (data, origin = allowed) => fetch(url, { method: 'POST', headers: { Origin: origin, 'Content-Type': 'application/json' }, body: JSON.stringify(data), });try { assert.equal((await (await fetch(url)).json()).id, 'rectangle'); assert.equal((await post({ id: 'ghost' }, 'https://untrusted.example')).status, 403); assert.equal(store.id, 'rectangle'); assert.equal((await post({ id: '../data' })).status, 400); const changed = await post({ id: 'ghost', settings: { hatGain: 2.5 } }); assert.equal(changed.status, 200); assert.equal((await changed.json()).values.ghost.hatGain, 2.5); assert.equal(events.length, 1); assert.equal((await post({ action: 'save' })).status, 200); assert.equal(store.saved.id, 'ghost'); store.save = () => { throw Error('disk unavailable'); }; assert.equal((await post({ action: 'save' })).status, 500); assert.equal(store.saved.values.ghost.hatGain, 2.5);} finally { server.closeAllConnections(); await new Promise((resolve) => server.close(resolve));}console.log( 'Avatar HTTP state, source-origin guard, validation, broadcasts and save failure passed.',);