UNPKG

@foxglove/ros1

Version:

Standalone TypeScript implementation of the ROS 1 (Robot Operating System) protocol with a pluggable transport layer

84 lines 3.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const nodejs_1 = require("@foxglove/xmlrpc/nodejs"); const RosMaster_1 = require("./RosMaster"); const RosNode_1 = require("./RosNode"); const TcpServerNode_1 = require("./nodejs/TcpServerNode"); const TcpSocketNode_1 = require("./nodejs/TcpSocketNode"); describe("RosNode", () => { it("Publishes and subscribes to topics and parameters", async () => { const rosMaster = new RosMaster_1.RosMaster(new nodejs_1.HttpServerNodejs()); await rosMaster.start("localhost"); const rosMasterUri = rosMaster.url(); expect(typeof rosMasterUri).toBe("string"); let errA; let errB; const nodeA = new RosNode_1.RosNode({ name: "/nodeA", hostname: "localhost", pid: 1, rosMasterUri, httpServer: new nodejs_1.HttpServerNodejs(), tcpSocketCreate: TcpSocketNode_1.TcpSocketNode.Create, tcpServer: await TcpServerNode_1.TcpServerNode.Listen({ host: "localhost" }), }); nodeA.on("error", (err) => (errA = err)); const nodeB = new RosNode_1.RosNode({ name: "/nodeB", hostname: "localhost", pid: 2, rosMasterUri, httpServer: new nodejs_1.HttpServerNodejs(), tcpSocketCreate: TcpSocketNode_1.TcpSocketNode.Create, tcpServer: await TcpServerNode_1.TcpServerNode.Listen({ host: "localhost" }), }); nodeB.on("error", (err) => (errB = err)); await nodeA.start(); const received = new Promise((r) => { nodeA .subscribe({ topic: "/a", dataType: "std_msgs/Bool" }) .on("message", (msg, data, pub) => { r([msg, data, pub]); }); }); await nodeB.start(); await nodeB.advertise({ topic: "/a", dataType: "std_msgs/Bool", messageDefinitionText: "bool data", latching: true, }); await nodeB.publish("/a", { data: true }); const [msg, data, pub] = await received; expect(msg.data).toEqual(true); expect(data).toHaveLength(1); expect(pub.connection.connected()).toEqual(true); expect(pub.connection.getTransportInfo().startsWith("TCPROS connection on port ")).toBe(true); expect(pub.connection.stats().bytesReceived).toEqual(143); expect(pub.connection.transportType()).toEqual("TCPROS"); expect(pub.connectionId).toEqual(0); expect(pub.subscription.md5sum).toEqual("*"); expect(pub.subscription.publishers().size).toEqual(1); expect(pub.subscription.receivedBytes()).toEqual(143); const initParamValue = await nodeB.subscribeParam("a"); expect(initParamValue).toBeUndefined(); const paramUpdated = new Promise((r) => { nodeB.on("paramUpdate", (args) => { r(args); }); }); await nodeA.setParameter("a", 42); const args = await paramUpdated; expect(args.callerId).toEqual("/nodeA"); expect(args.key).toEqual("a"); expect(args.value).toEqual(42); expect(args.prevValue).toBeUndefined(); nodeB.shutdown(); nodeA.shutdown(); await new Promise((r) => setTimeout(r, 100)); rosMaster.close(); expect(errA).toBeUndefined(); expect(errB).toBeUndefined(); }); }); //# sourceMappingURL=RosNode.test.js.map