import { create, toBinary } from '@bufbuild/protobuf'; import * as P from '@meshtastic/protobufs'; import * as net from 'node:net'; import type { AddressInfo } from 'node:net'; import { frame } from './codec.js'; /** In-process TCP stand-in for the meshtastic-serial-bridge; hands out accepted sockets. */ export function startBridge( onSocket?: (s: net.Socket) => void, ): Promise<{ port: number; sockets: net.Socket[]; close: () => void }> { const sockets: net.Socket[] = []; const server = net.createServer((socket) => { onSocket?.(socket); // attached at accept time, before any data can arrive sockets.push(socket); }); return new Promise((resolve) => { server.listen(0, '127.0.0.1', () => { resolve({ port: (server.address() as AddressInfo).port, sockets, close: () => server.close(), }); }); }); } export async function waitFor( cond: () => boolean | Promise, timeoutMs = 5000, ): Promise { const t0 = Date.now(); while (!(await cond())) { if (Date.now() - t0 > timeoutMs) throw new Error('timed out waiting'); await new Promise((r) => setTimeout(r, 10)); } } /** Plain-object NodeInfo fields (init shape, not the runtime message type) accepted by nodeInfoFrame. */ export interface NodeInfoFields { user?: { id?: string; longName?: string; shortName?: string; hwModel?: number; }; position?: { latitudeI?: number; longitudeI?: number; altitude?: number }; lastHeard?: number; deviceMetrics?: { batteryLevel?: number }; } export function nodeInfoFrame( num: number, fields?: NodeInfoFields, ): Uint8Array { const ni = create(P.Mesh.NodeInfoSchema, { num, ...fields }); return frame( toBinary( P.Mesh.FromRadioSchema, create(P.Mesh.FromRadioSchema, { payloadVariant: { case: 'nodeInfo', value: ni }, }), ), ); } export const KAMIL_NUM = 123456789; export function kamilNodeInfo(): NodeInfoFields { return { user: { id: '!kamil', longName: 'Kamil SP8MK/P', shortName: 'KK', hwModel: P.Mesh.HardwareModel.TBEAM, }, position: { latitudeI: 521049637, longitudeI: 209833152, altitude: 123 }, lastHeard: 1758000000, deviceMetrics: { batteryLevel: 87 }, }; }