Send to by node name or broadcast sentinel (GET-free resolution via node DB) (#9)
CI / build + unit (push) Successful in 33s
CI / build + unit (push) Successful in 33s
This commit was merged in pull request #9.
This commit is contained in:
@@ -3,7 +3,7 @@ import * as P from '@meshtastic/protobufs';
|
||||
import * as net from 'node:net';
|
||||
import type { AddressInfo } from 'node:net';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { extractFrames, frame } from './codec.js';
|
||||
import { BROADCAST_ADDR, extractFrames, frame } from './codec.js';
|
||||
import { MeshService } from './mesh.service.js';
|
||||
|
||||
function startBridge(onSocket?: (s: net.Socket) => void): Promise<{
|
||||
@@ -612,3 +612,61 @@ describe('MeshService message history', () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('MeshService resolveDest', () => {
|
||||
it('resolves broadcast sentinels, numbers and names to node numbers', 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,
|
||||
);
|
||||
|
||||
bridge.sockets[0].write(nodeInfoFrame(KAMIL_NUM, kamilNodeInfo()));
|
||||
await waitFor(async () => (await svc.nodes()).length === 1);
|
||||
|
||||
expect(await svc.resolveDest(undefined)).toBe(BROADCAST_ADDR); // omitted → broadcast
|
||||
expect(await svc.resolveDest('')).toBe(BROADCAST_ADDR); // empty → broadcast
|
||||
expect(await svc.resolveDest('!b')).toBe(BROADCAST_ADDR);
|
||||
expect(await svc.resolveDest('BROADCAST')).toBe(BROADCAST_ADDR); // case-insensitive
|
||||
expect(await svc.resolveDest(42)).toBe(42); // number passthrough
|
||||
expect(await svc.resolveDest(String(KAMIL_NUM))).toBe(KAMIL_NUM); // numeric string
|
||||
expect(await svc.resolveDest('Kamil SP8MK/P')).toBe(KAMIL_NUM); // exact longName
|
||||
} finally {
|
||||
svc.onModuleDestroy();
|
||||
bridge.close();
|
||||
}
|
||||
});
|
||||
|
||||
it('throws for unknown names and invalid node numbers', 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,
|
||||
);
|
||||
|
||||
bridge.sockets[0].write(nodeInfoFrame(KAMIL_NUM, kamilNodeInfo()));
|
||||
await waitFor(async () => (await svc.nodes()).length === 1);
|
||||
|
||||
await expect(svc.resolveDest('zzz-nope')).rejects.toThrow(
|
||||
"no node matching 'zzz-nope'",
|
||||
);
|
||||
for (const bad of [0, -1, 42.5, BROADCAST_ADDR + 1]) {
|
||||
await expect(svc.resolveDest(bad)).rejects.toThrow(
|
||||
/invalid node number/,
|
||||
);
|
||||
}
|
||||
await expect(svc.resolveDest('0')).rejects.toThrow(/invalid node number/);
|
||||
} finally {
|
||||
svc.onModuleDestroy();
|
||||
bridge.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user