connectedComponents() { if (!this.cachedConnectedComponents) { let componentId = 1; const components = {}; R.toPairs(this.nodes).map(nameToConnection => nameToConnection[0]).forEach(node => { this.findConnectedComponent(componentId, node, components); componentId += 1; }); this.cachedConnectedComponents = components; } return this.cachedConnectedComponents; }
// Convert a Node to JSON without the .nodes list, which avoids recursively // calling .toJSON() on all child nodes. function shallowNodeToJson(node) { if (node.nodes) { return node.set('nodes', Node.createList()).toJSON(); } return node.toJSON(); }
/** * Called when a remote node disconnected (received DISCONNECT packet) * You can clean it from local registry. * * @param {String} nodeID * @param {Boolean} isUnexpected */ remoteNodeDisconnected(nodeID, isUnexpected) { return this.registry.nodes.disconnected(nodeID, isUnexpected); }
/** * Create a local Endpoint for private actions * * @param {Action} action * @returns {ActionEndpoint} * @memberof Registry */ createPrivateActionEndpoint(action) { return new ActionEndpoint(this, this.broker, this.nodes.localNode, action.service, action); }
it("should set lastHeartbeatTime", async () => { discoverer.logger.warn.mockClear(); registry.nodes.disconnected.mockClear(); discoverer.checkRemoteNodes(); expect(registry.nodes.disconnected).toBeCalledTimes(0); expect(discoverer.logger.warn).toBeCalledTimes(0); expect(node.lastHeartbeatTime).toBeDefined(); });
/** * Get a raw info list from nodes * * @returns {Array<Object>} * @memberof Registry */ getNodeRawList() { return this.nodes.toArray().map(node => node.rawInfo); }
it("should call discoverNode if unknown", async () => { discoverer.discoverNode.mockClear(); registry.nodes.get.mockClear(); node.heartbeat.mockClear(); discoverer.heartbeatReceived("node-9", {}); expect(registry.nodes.get).toBeCalledTimes(1); expect(registry.nodes.get).toBeCalledWith("node-9"); expect(discoverer.discoverNode).toBeCalledTimes(1); expect(discoverer.discoverNode).toBeCalledWith("node-9"); expect(node.heartbeat).toBeCalledTimes(0); });
it("check UDP server message handler if new node", () => { transporter.startUdpServer(); transporter.nodes.get = jest.fn(() => null); const node = {}; transporter.addOfflineNode = jest.fn(() => node); transporter.udpServer.__callbacks.message("node-2", "10.20.30.40", 12345); expect(node.udpAddress).toBe("10.20.30.40"); expect(transporter.nodes.get).toHaveBeenCalledTimes(1); expect(transporter.nodes.get).toHaveBeenCalledWith("node-2"); expect(transporter.addOfflineNode).toHaveBeenCalledTimes(1); expect(transporter.addOfflineNode).toHaveBeenCalledWith("node-2", "10.20.30.40", 12345); });
describe("Test Registry.processNodeInfo", () => { let broker = new ServiceBroker({ logger: false }); let registry = broker.registry; registry.nodes.processNodeInfo = jest.fn(); it("should call registry.nodes.processNodeInfo method", () => { let payload = {}; registry.processNodeInfo(payload); expect(registry.nodes.processNodeInfo).toHaveBeenCalledTimes(1); expect(registry.nodes.processNodeInfo).toHaveBeenCalledWith(payload); }); });
/** * Add a new node * * @param {String} id * @param {any} node * @memberof NodeCatalog */ add(id, node) { this.nodes.set(id, node); }
it("should call discoverNode if instanceID different", async () => { discoverer.discoverNode.mockClear(); registry.nodes.get.mockClear(); node.heartbeat.mockClear(); discoverer.heartbeatReceived("node-10", { instanceID: "iid-2" }); expect(discoverer.discoverNode).toBeCalledTimes(1); expect(discoverer.discoverNode).toBeCalledWith("node-10"); expect(node.heartbeat).toBeCalledTimes(0); });
it("should call sendNodeInfo if topic is 'DISCOVER' ", () => { broker.registry.nodes.processNodeInfo = jest.fn(); transit.discoverer.sendLocalNodeInfo = jest.fn(); let payload = { ver: "4", sender: "remote" }; transit.messageHandler("DISCOVER", { payload }); expect(transit.discoverer.sendLocalNodeInfo).toHaveBeenCalledTimes(1); expect(transit.discoverer.sendLocalNodeInfo).toHaveBeenCalledWith("remote"); });
/** * Check a node exist by nodeID * * @param {String} id * @returns * @memberof NodeCatalog */ has(id) { return this.nodes.has(id); }
/** * Get list of registered nodes * * @param {object} opts * @returns * @memberof Registry */ getNodeList(opts) { return this.nodes.list(opts); }
/** * Get a node by nodeID * * @param {String} id * @returns * @memberof NodeCatalog */ get(id) { return this.nodes.get(id); }