Optional replyId on send (API + MCP) — protocol-level threaded replies (#31)
CI / build + unit (push) Successful in 33s
CI / build + unit (push) Successful in 33s
This commit was merged in pull request #31.
This commit is contained in:
@@ -296,6 +296,64 @@ describe('MeshService send', () => {
|
||||
bridge.close();
|
||||
}
|
||||
});
|
||||
|
||||
it('sets Data.reply_id when replyId is given and leaves it unset otherwise', async () => {
|
||||
const bridge = await startBridge();
|
||||
process.env.MESH_HOST = '127.0.0.1';
|
||||
process.env.MESH_PORT = String(bridge.port);
|
||||
const svc = new MeshService();
|
||||
try {
|
||||
svc.onModuleInit();
|
||||
await waitFor(
|
||||
() => bridge.sockets.length === 1 && svc.status().connected,
|
||||
);
|
||||
|
||||
const out: Uint8Array[] = [];
|
||||
bridge.sockets[0].on('data', (c) => out.push(c));
|
||||
await svc.sendText(42, 'reply send', 42); // replyId = 42
|
||||
await svc.sendText(43, 'plain send');
|
||||
|
||||
const readOutbound = (): P.Mesh.MeshPacket[] => {
|
||||
const merged = new Uint8Array(out.reduce((n, c) => n + c.length, 0));
|
||||
let off = 0;
|
||||
for (const c of out) {
|
||||
merged.set(c, off);
|
||||
off += c.length;
|
||||
}
|
||||
const { packets } = extractFrames(merged);
|
||||
// outbound starts with the want_config_id frame — collect only text packets, in order
|
||||
return packets.flatMap((p) => {
|
||||
const tr = fromBinary(P.Mesh.ToRadioSchema, p);
|
||||
if (tr.payloadVariant?.case === 'packet')
|
||||
return [tr.payloadVariant.value];
|
||||
return [];
|
||||
});
|
||||
};
|
||||
|
||||
await waitFor(() => readOutbound().length === 2);
|
||||
const [replyPkt, plainPkt] = readOutbound();
|
||||
const replyData =
|
||||
replyPkt.payloadVariant?.case === 'decoded'
|
||||
? replyPkt.payloadVariant.value
|
||||
: undefined;
|
||||
expect(
|
||||
new TextDecoder().decode(replyData?.payload ?? new Uint8Array()),
|
||||
).toBe('reply send');
|
||||
expect(replyData?.replyId).toBe(42); // threaded reply to packet 42
|
||||
|
||||
const plainData =
|
||||
plainPkt.payloadVariant?.case === 'decoded'
|
||||
? plainPkt.payloadVariant.value
|
||||
: undefined;
|
||||
expect(
|
||||
new TextDecoder().decode(plainData?.payload ?? new Uint8Array()),
|
||||
).toBe('plain send');
|
||||
expect(plainData?.replyId).toBe(0); // omitted → proto3 default, not a reply
|
||||
} finally {
|
||||
svc.onModuleDestroy();
|
||||
bridge.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('MeshService node database', () => {
|
||||
|
||||
Reference in New Issue
Block a user