UNPKG

@foxglove/ws-protocol-examples

Version:

Foxglove WebSocket protocol examples

72 lines 3.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ws_protocol_1 = require("@foxglove/ws-protocol"); const commander_1 = require("commander"); const debug_1 = tslib_1.__importDefault(require("debug")); const ws_1 = require("ws"); const boxen_1 = tslib_1.__importDefault(require("../boxen")); const setupSigintHandler_1 = require("./util/setupSigintHandler"); const log = (0, debug_1.default)("foxglove:param-server"); debug_1.default.enable("foxglove:*"); async function main() { const server = new ws_protocol_1.FoxgloveServer({ name: "param-server", capabilities: [ws_protocol_1.ServerCapability.parameters, ws_protocol_1.ServerCapability.parametersSubscribe], }); const port = 8765; const ws = new ws_1.WebSocketServer({ port, handleProtocols: (protocols) => server.handleProtocols(protocols), }); (0, setupSigintHandler_1.setupSigintHandler)(log, ws); const paramStore = new Map([ ["/foo/bool_param", true], ["/foo/int_param", 123], ["/foo/float_param", 4.56], ["/foo/string_param", "hello"], ["/foo/int_list_param", [1, 2, 3]], ]); ws.on("listening", () => { void (0, boxen_1.default)(`📡 Server listening on localhost:${port}. To see data, visit:\n` + `https://app.foxglove.dev/~/view?ds=foxglove-websocket&ds.url=ws://localhost:${port}/`, { borderStyle: "round", padding: 1 }).then(log); }); ws.on("connection", (conn, req) => { const name = `${req.socket.remoteAddress}:${req.socket.remotePort}`; log("connection from %s via %s", name, req.url); server.handleConnection(conn, name); }); server.on("getParameters", ({ parameterNames, id }, clientConnection) => { if (parameterNames.length > 0) { log("Received a request to retrieve %d parameters.", parameterNames.length); const filteredParams = Array.from(paramStore.entries()) .filter(([name]) => parameterNames.includes(name)) .map(([name, value]) => ({ name, value })); server.publishParameterValues(filteredParams, id, clientConnection); } else { log("Received a request to retrieve all available parameters."); const allParams = Array.from(paramStore.entries()).map(([name, value]) => ({ name, value })); server.publishParameterValues(allParams, id, clientConnection); } }); server.on("setParameters", ({ parameters, id }, clientConnection) => { log("Received a request to set %d parameters.", parameters.length); parameters.forEach((p) => paramStore.set(p.name, p.value)); server.updateParameterValues(parameters); if (id) { // Send updated parameters to client const params = Array.from(paramStore.entries()) .filter(([name]) => parameters.find((p) => p.name === name)) .map(([name, value]) => ({ name, value })); server.publishParameterValues(params, id, clientConnection); } }); server.on("error", (err) => { log("server error: %o", err); }); } exports.default = new commander_1.Command("param-server") .description("holds a parameter store that can be queried and modified") .action(main); //# sourceMappingURL=param-server.js.map