UNPKG

zwave-js

Version:

Z-Wave driver written entirely in JavaScript/TypeScript

715 lines (714 loc) 31.9 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var MockControllerBehaviors_exports = {}; __export(MockControllerBehaviors_exports, { createDefaultBehaviors: () => createDefaultBehaviors }); module.exports = __toCommonJS(MockControllerBehaviors_exports); var import_cc = require("@zwave-js/cc"); var import_ZWaveProtocolCC = require("@zwave-js/cc/ZWaveProtocolCC"); var import_core = require("@zwave-js/core"); var import_serialapi = require("@zwave-js/serial/serialapi"); var import_testing = require("@zwave-js/testing"); var import_async = require("alcalzone-shared/async"); var import_Testing = require("../../Testing.js"); var import_MockControllerState = require("./MockControllerState.js"); var import_NodeInformationFrame = require("./NodeInformationFrame.js"); function createLazySendDataPayload(controller, node, msg) { return async () => { try { const cmd = await import_cc.CommandClass.parse(msg.serializedCC, { sourceNodeId: controller.ownNodeId, __internalIsMockNode: true, ...node.encodingContext, ...node.securityManagers, // The frame type is always singlecast because the controller sends it to the node frameType: "singlecast" }); msg.command = cmd; return cmd; } catch (e) { if ((0, import_core.isZWaveError)(e)) { if (e.code === import_core.ZWaveErrorCodes.CC_NotImplemented) { try { const cmd = new import_cc.CommandClass({ nodeId: controller.ownNodeId, ccId: msg.payload[0], ccCommand: msg.payload[1], payload: msg.payload.subarray(2) }); msg.command = cmd; return cmd; } catch (e2) { console.error(e2.message); throw e2; } } else if (e.code === import_core.ZWaveErrorCodes.Deserialization_NotImplemented) { console.error(e.message); throw e; } } console.error(e); throw e; } }; } __name(createLazySendDataPayload, "createLazySendDataPayload"); const respondToGetControllerId = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.GetControllerIdRequest) { const ret = new import_serialapi.GetControllerIdResponse({ homeId: controller.homeId, ownNodeId: controller.ownNodeId }); await controller.sendMessageToHost(ret); return true; } } }; const respondToGetSerialApiCapabilities = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.GetSerialApiCapabilitiesRequest) { const ret = new import_serialapi.GetSerialApiCapabilitiesResponse({ ...controller.capabilities }); await controller.sendMessageToHost(ret); return true; } } }; const respondToGetControllerVersion = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.GetControllerVersionRequest) { const ret = new import_serialapi.GetControllerVersionResponse({ ...controller.capabilities }); await controller.sendMessageToHost(ret); return true; } } }; const respondToGetControllerCapabilities = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.GetControllerCapabilitiesRequest) { const ret = new import_serialapi.GetControllerCapabilitiesResponse({ ...controller.capabilities }); await controller.sendMessageToHost(ret); return true; } } }; const respondToGetSUCNodeId = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.GetSUCNodeIdRequest) { const sucNodeId = controller.capabilities.isStaticUpdateController ? controller.ownNodeId : controller.capabilities.sucNodeId; const ret = new import_serialapi.GetSUCNodeIdResponse({ sucNodeId }); await controller.sendMessageToHost(ret); return true; } } }; const respondToGetSerialApiInitData = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.GetSerialApiInitDataRequest) { const nodeIds = new Set(controller.nodes.keys()); nodeIds.add(controller.ownNodeId); const ret = new import_serialapi.GetSerialApiInitDataResponse({ zwaveApiVersion: controller.capabilities.zwaveApiVersion, isPrimary: !controller.capabilities.isSecondary, nodeType: import_core.NodeType.Controller, supportsTimers: controller.capabilities.supportsTimers, isSIS: controller.capabilities.isSISPresent && controller.capabilities.isStaticUpdateController, nodeIds: [...nodeIds], zwaveChipType: controller.capabilities.zwaveChipType }); await controller.sendMessageToHost(ret); return true; } } }; const respondToSoftReset = { onHostMessage(controller, msg) { if (msg instanceof import_serialapi.SoftResetRequest) { const ret = new import_serialapi.SerialAPIStartedRequest({ wakeUpReason: import_serialapi.SerialAPIWakeUpReason.SoftwareReset, watchdogEnabled: controller.capabilities.watchdogEnabled, isListening: true, ...(0, import_NodeInformationFrame.determineNIF)(), supportsLongRange: controller.capabilities.supportsLongRange }); setImmediate(async () => { await controller.sendMessageToHost(ret); }); return true; } } }; const respondToGetNodeProtocolInfo = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.GetNodeProtocolInfoRequest) { if (msg.requestedNodeId === controller.ownNodeId) { const ret = new import_serialapi.GetNodeProtocolInfoResponse({ ...(0, import_NodeInformationFrame.determineNIF)(), nodeType: import_core.NodeType.Controller, isListening: true, isFrequentListening: false, isRouting: true, supportsSecurity: false, supportsBeaming: true, supportedDataRates: [9600, 4e4, 1e5], optionalFunctionality: true, protocolVersion: 3 }); await controller.sendMessageToHost(ret); return true; } else if (controller.nodes.has(msg.requestedNodeId)) { const nodeCaps = controller.nodes.get(msg.requestedNodeId).capabilities; const ret = new import_serialapi.GetNodeProtocolInfoResponse({ ...nodeCaps }); await controller.sendMessageToHost(ret); return true; } } } }; const handleSendData = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.SendDataRequest) { const state = controller.state.get(import_MockControllerState.MockControllerStateKeys.CommunicationState); if (state != void 0 && state !== import_MockControllerState.MockControllerCommunicationState.Idle) { throw new Error("Received SendDataRequest while not idle"); } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Sending); const res = new import_serialapi.SendDataResponse({ wasSent: true }); await controller.sendMessageToHost(res); const node = controller.nodes.get(msg.getNodeId()); const lazyPayload = createLazySendDataPayload(controller, node, msg); const ackRequested = !!(msg.transmitOptions & import_core.TransmitOptions.ACK); const lazyFrame = (0, import_testing.createMockZWaveRequestFrame)(lazyPayload, { ackRequested }); const ackPromise = controller.sendToNode(node, lazyFrame); if (msg.callbackId !== 0) { controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.WaitingForNode); let ack = true; if (ackRequested) { try { const ackResult = await ackPromise; ack = !!ackResult?.ack; } catch (e) { if ((0, import_core.isZWaveError)(e) && e.code === import_core.ZWaveErrorCodes.Deserialization_NotImplemented) { console.error(e.message); throw e; } ack = false; } } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Idle); const cb = new import_serialapi.SendDataRequestTransmitReport({ callbackId: msg.callbackId, transmitStatus: ack ? import_core.TransmitStatus.OK : import_core.TransmitStatus.NoAck }); await controller.sendMessageToHost(cb); } else { controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Idle); } return true; } } }; const handleSendDataMulticast = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.SendDataMulticastRequest) { const state = controller.state.get(import_MockControllerState.MockControllerStateKeys.CommunicationState); if (state != void 0 && state !== import_MockControllerState.MockControllerCommunicationState.Idle) { throw new Error("Received SendDataMulticastRequest while not idle"); } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Sending); const res = new import_serialapi.SendDataMulticastResponse({ wasSent: true }); await controller.sendMessageToHost(res); const nodeIds = msg.nodeIds; const ackRequested = !!(msg.transmitOptions & import_core.TransmitOptions.ACK); const ackPromises = nodeIds.map((nodeId) => { const node = controller.nodes.get(nodeId); const lazyPayload = createLazySendDataPayload(controller, node, msg); const lazyFrame = (0, import_testing.createMockZWaveRequestFrame)(lazyPayload, { ackRequested }); const ackPromise = controller.sendToNode(node, lazyFrame); return ackPromise; }); if (msg.callbackId !== 0) { controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.WaitingForNode); let ack = true; if (ackRequested) { try { const ackResults = await Promise.all(ackPromises); ack = ackResults.every((result) => !!result?.ack); } catch (e) { if ((0, import_core.isZWaveError)(e) && e.code === import_core.ZWaveErrorCodes.Deserialization_NotImplemented) { console.error(e.message); throw e; } ack = false; } } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Idle); const cb = new import_serialapi.SendDataMulticastRequestTransmitReport({ callbackId: msg.callbackId, transmitStatus: ack ? import_core.TransmitStatus.OK : import_core.TransmitStatus.NoAck }); await controller.sendMessageToHost(cb); } else { controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Idle); } return true; } } }; const handleSendDataBridge = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.SendDataBridgeRequest) { const state = controller.state.get(import_MockControllerState.MockControllerStateKeys.CommunicationState); if (state != void 0 && state !== import_MockControllerState.MockControllerCommunicationState.Idle) { throw new Error("Received SendDataBridgeRequest while not idle"); } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Sending); const res = new import_serialapi.SendDataBridgeResponse({ wasSent: true }); await controller.sendMessageToHost(res); const node = controller.nodes.get(msg.getNodeId()); const lazyPayload = createLazySendDataPayload(controller, node, msg); const ackRequested = !!(msg.transmitOptions & import_core.TransmitOptions.ACK); const lazyFrame = (0, import_testing.createMockZWaveRequestFrame)(lazyPayload, { ackRequested }); const ackPromise = controller.sendToNode(node, lazyFrame); if (msg.callbackId !== 0) { controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.WaitingForNode); let ack = true; if (ackRequested) { try { const ackResult = await ackPromise; ack = !!ackResult?.ack; } catch (e) { if ((0, import_core.isZWaveError)(e) && e.code === import_core.ZWaveErrorCodes.Deserialization_NotImplemented) { console.error(e.message); throw e; } ack = false; } } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Idle); const cb = new import_serialapi.SendDataBridgeRequestTransmitReport({ callbackId: msg.callbackId, transmitStatus: ack ? import_core.TransmitStatus.OK : import_core.TransmitStatus.NoAck }); await controller.sendMessageToHost(cb); } else { controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Idle); } return true; } } }; const handleSendDataMulticastBridge = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.SendDataMulticastBridgeRequest) { const state = controller.state.get(import_MockControllerState.MockControllerStateKeys.CommunicationState); if (state != void 0 && state !== import_MockControllerState.MockControllerCommunicationState.Idle) { throw new Error("Received SendDataMulticastBridgeRequest while not idle"); } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Sending); const res = new import_serialapi.SendDataMulticastBridgeResponse({ wasSent: true }); await controller.sendMessageToHost(res); const nodeIds = msg.nodeIds; const ackRequested = !!(msg.transmitOptions & import_core.TransmitOptions.ACK); const ackPromises = nodeIds.map((nodeId) => { const node = controller.nodes.get(nodeId); const lazyPayload = createLazySendDataPayload(controller, node, msg); const lazyFrame = (0, import_testing.createMockZWaveRequestFrame)(lazyPayload, { ackRequested }); const ackPromise = controller.sendToNode(node, lazyFrame); return ackPromise; }); if (msg.callbackId !== 0) { controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.WaitingForNode); let ack = true; if (ackRequested) { try { const ackResults = await Promise.all(ackPromises); ack = ackResults.every((result) => !!result?.ack); } catch (e) { if ((0, import_core.isZWaveError)(e) && e.code === import_core.ZWaveErrorCodes.Deserialization_NotImplemented) { console.error(e.message); throw e; } ack = false; } } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Idle); const cb = new import_serialapi.SendDataMulticastBridgeRequestTransmitReport({ callbackId: msg.callbackId, transmitStatus: ack ? import_core.TransmitStatus.OK : import_core.TransmitStatus.NoAck }); await controller.sendMessageToHost(cb); } else { controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Idle); } return true; } } }; const handleRequestNodeInfo = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.RequestNodeInfoRequest) { const state = controller.state.get(import_MockControllerState.MockControllerStateKeys.CommunicationState); if (state != void 0 && state !== import_MockControllerState.MockControllerCommunicationState.Idle) { throw new Error("Received RequestNodeInfoRequest while not idle"); } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Sending); const node = controller.nodes.get(msg.getNodeId()); const command = new import_ZWaveProtocolCC.ZWaveProtocolCCRequestNodeInformationFrame({ nodeId: controller.ownNodeId }); const frame = (0, import_testing.createMockZWaveRequestFrame)(command, { ackRequested: false }); void controller.sendToNode(node, frame); const nodeInfoPromise = controller.expectNodeCC(node, (cc) => cc instanceof import_ZWaveProtocolCC.ZWaveProtocolCCNodeInformationFrame, { timeout: import_testing.MOCK_FRAME_ACK_TIMEOUT, // Prevent forwarding the NIF to the host. Otherwise it will mess with // the state tracking in the MockController. preventDefault: true }); const res = new import_serialapi.RequestNodeInfoResponse({ wasSent: true }); await controller.sendMessageToHost(res); controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.WaitingForNode); let cb; try { const nodeInfo = await nodeInfoPromise; cb = new import_serialapi.ApplicationUpdateRequestNodeInfoReceived({ nodeInformation: { ...nodeInfo, nodeId: nodeInfo.nodeId } }); } catch { cb = new import_serialapi.ApplicationUpdateRequestNodeInfoRequestFailed(); } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Idle); await controller.sendMessageToHost(cb); return true; } } }; async function transmitSUCReturnRoute(controller, node, callbackId, options) { const expectCallback = callbackId !== 0; const command = new import_ZWaveProtocolCC.ZWaveProtocolCCAssignSUCReturnRoute({ nodeId: node.id, destinationNodeId: controller.ownNodeId, routeIndex: 0, // don't care ...options }); const frame = (0, import_testing.createMockZWaveRequestFrame)(command, { ackRequested: expectCallback }); const ackPromise = controller.sendToNode(node, frame); let ack = false; if (expectCallback) { controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.WaitingForNode); try { const ackResult = await ackPromise; ack = !!ackResult?.ack; } catch { } } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Idle); return ack; } __name(transmitSUCReturnRoute, "transmitSUCReturnRoute"); const handleDeleteSUCReturnRoute = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.DeleteSUCReturnRouteRequest) { const state = controller.state.get(import_MockControllerState.MockControllerStateKeys.CommunicationState); if (state != void 0 && state !== import_MockControllerState.MockControllerCommunicationState.Idle) { throw new Error("Received DeleteSUCReturnRouteRequest while not idle"); } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Sending); const expectCallback = msg.callbackId !== 0; const node = controller.nodes.get(msg.getNodeId()); const response = new import_serialapi.DeleteSUCReturnRouteResponse({ wasExecuted: true }); await controller.sendMessageToHost(response); const ack = await transmitSUCReturnRoute( controller, node, msg.callbackId ?? 0, // Set the empty route { destinationSpeed: import_core.ZWaveDataRate["9k6"], destinationWakeUp: import_cc.WakeUpTime.None, repeaters: [] } ); if (expectCallback) { const transmitReport = new import_serialapi.DeleteSUCReturnRouteRequestTransmitReport({ callbackId: msg.callbackId, transmitStatus: ack ? import_core.TransmitStatus.OK : import_core.TransmitStatus.NoAck }); await controller.sendMessageToHost(transmitReport); } return true; } } }; const handleAssignSUCReturnRoute = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.AssignSUCReturnRouteRequest) { const state = controller.state.get(import_MockControllerState.MockControllerStateKeys.CommunicationState); if (state != void 0 && state !== import_MockControllerState.MockControllerCommunicationState.Idle) { throw new Error("Received AssignSUCReturnRouteRequest while not idle"); } controller.state.set(import_MockControllerState.MockControllerStateKeys.CommunicationState, import_MockControllerState.MockControllerCommunicationState.Sending); const expectCallback = msg.callbackId !== 0; const node = controller.nodes.get(msg.getNodeId()); const res = new import_serialapi.AssignSUCReturnRouteResponse({ wasExecuted: true }); await controller.sendMessageToHost(res); const ack = await transmitSUCReturnRoute( controller, node, msg.callbackId ?? 0, // Don't care about the actual settings here { destinationSpeed: import_core.ZWaveDataRate["100k"], destinationWakeUp: import_cc.WakeUpTime.None, repeaters: [] } ); if (expectCallback) { const cb = new import_serialapi.AssignSUCReturnRouteRequestTransmitReport({ callbackId: msg.callbackId, transmitStatus: ack ? import_core.TransmitStatus.OK : import_core.TransmitStatus.NoAck }); await controller.sendMessageToHost(cb); } return true; } } }; const handleAddNode = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.AddNodeToNetworkRequest) { const state = controller.state.get(import_MockControllerState.MockControllerStateKeys.InclusionState); const expectCallback = msg.callbackId !== 0; let cb; if (state === import_MockControllerState.MockControllerInclusionState.AddingNode) { if (msg.addNodeType === import_serialapi.AddNodeType.Stop) { controller.state.set(import_MockControllerState.MockControllerStateKeys.InclusionState, import_MockControllerState.MockControllerInclusionState.Idle); const pendingNode = controller.nodePendingInclusion; if (pendingNode) { cb = new import_serialapi.AddNodeToNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.AddNodeStatus.Done, nodeId: pendingNode.id }); controller.nodePendingInclusion = void 0; } else { cb = new import_serialapi.AddNodeToNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.AddNodeStatus.Failed }); } } else { cb = new import_serialapi.AddNodeToNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.AddNodeStatus.Failed }); } } else if (state === import_MockControllerState.MockControllerInclusionState.RemovingNode) { cb = new import_serialapi.AddNodeToNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.AddNodeStatus.Failed }); } else { controller.state.set(import_MockControllerState.MockControllerStateKeys.InclusionState, import_MockControllerState.MockControllerInclusionState.AddingNode); cb = new import_serialapi.AddNodeToNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.AddNodeStatus.Ready }); if (controller.nodePendingInclusion) { const { setup: testSpecificSetup, ...nodeOptions } = controller.nodePendingInclusion; const node = await import_testing.MockNode.create({ controller, ...nodeOptions }); node.defineBehavior(...(0, import_Testing.createDefaultMockNodeBehaviors)()); testSpecificSetup?.(node); const supportedCCs = [...node.implementedCCs].filter(([, info]) => info.isSupported && info.version > 0).map(([cc]) => cc); const nodeInfo = { nodeId: node.id, basicDeviceClass: node.capabilities.basicDeviceClass, genericDeviceClass: node.capabilities.genericDeviceClass, specificDeviceClass: node.capabilities.specificDeviceClass, supportedCCs }; void (async () => { await (0, import_async.wait)(10); const nodeFoundMsg = new import_serialapi.AddNodeToNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.AddNodeStatus.NodeFound }); await controller.sendMessageToHost(nodeFoundMsg); await (0, import_async.wait)(10); const addingSlaveMsg = new import_serialapi.AddNodeToNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.AddNodeStatus.AddingSlave, nodeInfo }); await controller.sendMessageToHost(addingSlaveMsg); await (0, import_async.wait)(10); controller.addNode(node); const protocolDoneMsg = new import_serialapi.AddNodeToNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.AddNodeStatus.ProtocolDone }); await controller.sendMessageToHost(protocolDoneMsg); })(); } } if (expectCallback && cb) { await controller.sendMessageToHost(cb); } return true; } } }; const handleRemoveNode = { async onHostMessage(controller, msg) { if (msg instanceof import_serialapi.RemoveNodeFromNetworkRequest) { const state = controller.state.get(import_MockControllerState.MockControllerStateKeys.InclusionState); const expectCallback = msg.callbackId !== 0; let cb; if (state === import_MockControllerState.MockControllerInclusionState.RemovingNode) { if (msg.removeNodeType === import_serialapi.RemoveNodeType.Stop) { controller.state.set(import_MockControllerState.MockControllerStateKeys.InclusionState, import_MockControllerState.MockControllerInclusionState.Idle); cb = new import_serialapi.RemoveNodeFromNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.RemoveNodeStatus.Failed }); } else { cb = new import_serialapi.RemoveNodeFromNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.RemoveNodeStatus.Failed }); } } else if (state === import_MockControllerState.MockControllerInclusionState.AddingNode) { cb = new import_serialapi.RemoveNodeFromNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.RemoveNodeStatus.Failed }); } else { controller.state.set(import_MockControllerState.MockControllerStateKeys.InclusionState, import_MockControllerState.MockControllerInclusionState.RemovingNode); cb = new import_serialapi.RemoveNodeFromNetworkRequestStatusReport({ callbackId: msg.callbackId, status: import_serialapi.RemoveNodeStatus.Ready }); } if (expectCallback && cb) { await controller.sendMessageToHost(cb); } return true; } } }; const forwardCommandClassesToHost = { async onNodeFrame(controller, node, frame) { if (frame.type === import_testing.MockZWaveFrameType.Request && frame.payload instanceof import_cc.CommandClass && !(frame.payload instanceof import_ZWaveProtocolCC.ZWaveProtocolCC)) { const msg = new import_serialapi.ApplicationCommandRequest({ command: frame.payload }); msg.getNodeId = () => node.id; await controller.sendMessageToHost(msg, node); return true; } } }; const forwardUnsolicitedNIF = { async onNodeFrame(controller, node, frame) { if (frame.type === import_testing.MockZWaveFrameType.Request && frame.payload instanceof import_ZWaveProtocolCC.ZWaveProtocolCCNodeInformationFrame) { const updateRequest = new import_serialapi.ApplicationUpdateRequestNodeInfoReceived({ nodeInformation: { ...frame.payload, nodeId: frame.payload.nodeId } }); await controller.sendMessageToHost(updateRequest, node); return true; } } }; function createDefaultBehaviors() { return [ respondToGetControllerId, respondToGetSerialApiCapabilities, respondToGetControllerVersion, respondToGetControllerCapabilities, respondToGetSUCNodeId, respondToGetSerialApiInitData, respondToSoftReset, respondToGetNodeProtocolInfo, handleSendData, handleSendDataMulticast, handleSendDataBridge, handleSendDataMulticastBridge, handleRequestNodeInfo, handleDeleteSUCReturnRoute, handleAssignSUCReturnRoute, handleAddNode, handleRemoveNode, forwardCommandClassesToHost, forwardUnsolicitedNIF ]; } __name(createDefaultBehaviors, "createDefaultBehaviors"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createDefaultBehaviors }); //# sourceMappingURL=MockControllerBehaviors.js.map