import assert from 'node:assert/strict'; import fs from 'node:fs'; import vm from 'node:vm'; const source = fs.readFileSync(new URL('../www/core/binary_protocol.js', import.meta.url), 'utf8'); const context = vm.createContext({ ArrayBuffer, DataView, Float32Array, Number }); vm.runInContext(source.replaceAll('export function', 'function'), context, { filename: 'binary_protocol.js', }); function spectroPacket() { const buffer = new ArrayBuffer(28); const view = new DataView(buffer); view.setUint32(0, 0x50585350, true); view.setUint32(4, 42, true); view.setUint32(8, 48000, true); view.setUint32(12, 8192, true); view.setUint32(16, 2, true); view.setFloat32(20, -80, true); view.setFloat32(24, -12.5, true); return buffer; } function visualsPacket() { const buffer = new ArrayBuffer(64); const view = new DataView(buffer); view.setUint32(0, 0x50585653, true); view.setUint16(4, 1, true); view.setUint16(6, 3, true); view.setUint32(8, 7, true); view.setUint32(12, 2, true); view.setUint32(16, 2, true); view.setUint16(20, 1, true); view.setUint32(24, 5, true); view.setUint32(28, 48000, true); [-0.5, 0.25, 0.5, -0.25, -0.5, 0.5, -0.25, 0.25] .forEach((value, index) => view.setFloat32(32 + index * 4, value, true)); return buffer; } const spectro = context.decodePhoenixSpectroBuffer(spectroPacket()); assert.equal(spectro.seq, 42); assert.equal(spectro.sampleRate, 48000); assert.equal(spectro.fftSize, 8192); assert.deepEqual(Array.from(spectro.bins), [-80, -12.5]); const visual = context.decodePhoenixVisualsBuffer(visualsPacket()); assert.equal(visual.seq, 7); assert.deepEqual(Array.from(visual.left), [-0.5, 0.5]); assert.deepEqual(Array.from(visual.right), [0.25, -0.25]); assert.equal(visual.wave.columns, 2); assert.equal(visual.wave.channels, 1); assert.deepEqual(Array.from(visual.wave.data), [-0.5, 0.5, -0.25, 0.25]); assert.equal(context.decodePhoenixSpectroBuffer(spectroPacket().slice(0, 24)), null); assert.equal(context.decodePhoenixVisualsBuffer(visualsPacket().slice(0, 60)), null); const wrongVersion = visualsPacket(); new DataView(wrongVersion).setUint16(4, 2, true); assert.equal(context.decodePhoenixVisualsBuffer(wrongVersion), null); console.log('binary protocol regression tests passed');