diff --git a/http_server.ts b/http_server.ts index 9325e0b..2b5a8ec 100644 --- a/http_server.ts +++ b/http_server.ts @@ -1,11 +1,11 @@ -import http from "node:http"; - import { RemoteInfo } from "node:dgram"; import { createWriteStream } from "node:fs"; +import http from "node:http"; import { CommandsByValue } from "./datatypes.js"; import { create_LanSearch } from "./func_replacements.js"; import { hexdump } from "./hexdump.js"; +import { create_P2pAlive } from "./impl.js"; import { Handlers, makeSession } from "./server.js"; const s = makeSession( @@ -18,10 +18,11 @@ const s = makeSession( console.log(hexdump(msg.buffer, { ansi: options.ansi, ansiColor: 1 })); } Handlers[cmd](session, dv, rinfo); + session.lastReceivedPacket = Date.now(); }, (session) => { - // ther should be a better way of executing periodic status update requests - // per device + // ther should be a better way of executing periodic status update + // requests per device const int = setInterval(() => { let buf = new DataView(new Uint8Array(4).buffer); create_LanSearch(buf); @@ -52,6 +53,13 @@ s.eventEmitter.on("connect", (name: string, rinfo: RemoteInfo) => { console.log(`Connected to ${name} - ${rinfo.address}`); s.outgoingCommandId = 0; s.dst_ip = rinfo.address; + + const int = setInterval(() => { + let buf = create_P2pAlive(); + if (Date.now() - s.lastReceivedPacket > 500) { + s.send(buf); + } + }, 1000); }); const server = http.createServer((req, res) => { diff --git a/impl.ts b/impl.ts index ba2e73e..7da82f7 100644 --- a/impl.ts +++ b/impl.ts @@ -92,3 +92,10 @@ export const create_P2pRdy = (inbuf: DataView): DataView => { outbuf.add(4).writeByteArray(new Uint8Array(inbuf.readByteArray(P2PRDY_SIZE).buffer)); return outbuf; }; + +export const create_P2pAlive = (): DataView => { + const outbuf = new DataView(new Uint8Array(4).buffer); + outbuf.writeU16(Commands.P2PAlive); + outbuf.add(2).writeU16(0); + return outbuf; +}; diff --git a/server.ts b/server.ts index afb896a..bf55084 100644 --- a/server.ts +++ b/server.ts @@ -12,6 +12,7 @@ export type Session = { ticket: number[]; eventEmitter: EventEmitter; dst_ip: string; + lastReceivedPacket: number; }; export type PacketHandler = (session: Session, dv: DataView, rinfo: RemoteInfo) => void; @@ -49,6 +50,7 @@ export const makeSession = (cb: msgCb, connCb: connCb, options: opt): Session => const session: Session = { outgoingCommandId: 0, ticket: [0, 0, 0, 0], + lastReceivedPacket: 0, eventEmitter: new EventEmitter(), send: (msg: DataView) => { const raw = msg.readU16();