62 lines
2.2 KiB
JavaScript
62 lines
2.2 KiB
JavaScript
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');
|