@foxglove/ws-protocol-examples
Version:
Foxglove WebSocket protocol examples
72 lines • 3.41 kB
JavaScript
;
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