zwave-js 14.3.3 → 14.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/lib/_version.d.ts +1 -1
- package/build/cjs/lib/_version.js +1 -1
- package/build/cjs/lib/_version.js.map +1 -1
- package/build/cjs/lib/controller/Controller.js +66 -60
- package/build/cjs/lib/controller/Controller.js.map +1 -1
- package/build/cjs/lib/controller/ControllerStatistics.js +4 -0
- package/build/cjs/lib/controller/ControllerStatistics.js.map +1 -1
- package/build/cjs/lib/controller/FirmwareUpdateService.js +8 -0
- package/build/cjs/lib/controller/FirmwareUpdateService.js.map +1 -1
- package/build/cjs/lib/controller/MockControllerBehaviors.js +3 -0
- package/build/cjs/lib/controller/MockControllerBehaviors.js.map +1 -1
- package/build/cjs/lib/controller/NVMIO.js +7 -0
- package/build/cjs/lib/controller/NVMIO.js.map +1 -1
- package/build/cjs/lib/controller/NodeInformationFrame.js +2 -0
- package/build/cjs/lib/controller/NodeInformationFrame.js.map +1 -1
- package/build/cjs/lib/controller/ZWaveSDKVersions.js +3 -0
- package/build/cjs/lib/controller/ZWaveSDKVersions.js.map +1 -1
- package/build/cjs/lib/controller/utils.js +4 -0
- package/build/cjs/lib/controller/utils.js.map +1 -1
- package/build/cjs/lib/driver/Bootloader.js +4 -0
- package/build/cjs/lib/driver/Bootloader.js.map +1 -1
- package/build/cjs/lib/driver/Driver.js +63 -56
- package/build/cjs/lib/driver/Driver.js.map +1 -1
- package/build/cjs/lib/driver/DriverMock.js +6 -3
- package/build/cjs/lib/driver/DriverMock.js.map +1 -1
- package/build/cjs/lib/driver/MessageGenerators.js +26 -18
- package/build/cjs/lib/driver/MessageGenerators.js.map +1 -1
- package/build/cjs/lib/driver/NetworkCache.js +43 -23
- package/build/cjs/lib/driver/NetworkCache.js.map +1 -1
- package/build/cjs/lib/driver/Queue.js +6 -2
- package/build/cjs/lib/driver/Queue.js.map +1 -1
- package/build/cjs/lib/driver/SerialAPICommandMachine.js +45 -40
- package/build/cjs/lib/driver/SerialAPICommandMachine.js.map +1 -1
- package/build/cjs/lib/driver/StateMachineShared.js +5 -0
- package/build/cjs/lib/driver/StateMachineShared.js.map +1 -1
- package/build/cjs/lib/driver/Statistics.js +4 -0
- package/build/cjs/lib/driver/Statistics.js.map +1 -1
- package/build/cjs/lib/driver/Task.js +9 -2
- package/build/cjs/lib/driver/Task.js.map +1 -1
- package/build/cjs/lib/driver/Transaction.js +8 -4
- package/build/cjs/lib/driver/Transaction.js.map +1 -1
- package/build/cjs/lib/driver/TransportServiceMachine.js +9 -7
- package/build/cjs/lib/driver/TransportServiceMachine.js.map +1 -1
- package/build/cjs/lib/driver/UpdateConfig.js +8 -4
- package/build/cjs/lib/driver/UpdateConfig.js.map +1 -1
- package/build/cjs/lib/driver/UserAgent.js +4 -0
- package/build/cjs/lib/driver/UserAgent.js.map +1 -1
- package/build/cjs/lib/driver/mDNSDiscovery.js +2 -0
- package/build/cjs/lib/driver/mDNSDiscovery.js.map +1 -1
- package/build/cjs/lib/log/Driver.js +6 -2
- package/build/cjs/lib/log/Driver.js.map +1 -1
- package/build/cjs/lib/log/Zniffer.js +6 -2
- package/build/cjs/lib/log/Zniffer.js.map +1 -1
- package/build/cjs/lib/node/DeviceClass.js +4 -0
- package/build/cjs/lib/node/DeviceClass.js.map +1 -1
- package/build/cjs/lib/node/Endpoint.js +9 -5
- package/build/cjs/lib/node/Endpoint.js.map +1 -1
- package/build/cjs/lib/node/HealthCheck.js +6 -0
- package/build/cjs/lib/node/HealthCheck.js.map +1 -1
- package/build/cjs/lib/node/MockNodeBehaviors.js +2 -0
- package/build/cjs/lib/node/MockNodeBehaviors.js.map +1 -1
- package/build/cjs/lib/node/MultiCCAPIWrapper.js +10 -8
- package/build/cjs/lib/node/MultiCCAPIWrapper.js.map +1 -1
- package/build/cjs/lib/node/Node.js +51 -46
- package/build/cjs/lib/node/Node.js.map +1 -1
- package/build/cjs/lib/node/NodeReadyMachine.js +3 -1
- package/build/cjs/lib/node/NodeReadyMachine.js.map +1 -1
- package/build/cjs/lib/node/NodeStatistics.js +5 -0
- package/build/cjs/lib/node/NodeStatistics.js.map +1 -1
- package/build/cjs/lib/node/NodeStatusMachine.js +5 -2
- package/build/cjs/lib/node/NodeStatusMachine.js.map +1 -1
- package/build/cjs/lib/node/VirtualEndpoint.js +8 -4
- package/build/cjs/lib/node/VirtualEndpoint.js.map +1 -1
- package/build/cjs/lib/node/VirtualNode.js +7 -2
- package/build/cjs/lib/node/VirtualNode.js.map +1 -1
- package/build/cjs/lib/node/mixins/00_Base.js +4 -0
- package/build/cjs/lib/node/mixins/00_Base.js.map +1 -1
- package/build/cjs/lib/node/mixins/01_NetworkRole.js +4 -0
- package/build/cjs/lib/node/mixins/01_NetworkRole.js.map +1 -1
- package/build/cjs/lib/node/mixins/05_Security.js +7 -3
- package/build/cjs/lib/node/mixins/05_Security.js.map +1 -1
- package/build/cjs/lib/node/mixins/10_Events.js +4 -0
- package/build/cjs/lib/node/mixins/10_Events.js.map +1 -1
- package/build/cjs/lib/node/mixins/20_Status.js +4 -0
- package/build/cjs/lib/node/mixins/20_Status.js.map +1 -1
- package/build/cjs/lib/node/mixins/30_Wakeup.js +4 -0
- package/build/cjs/lib/node/mixins/30_Wakeup.js.map +1 -1
- package/build/cjs/lib/node/mixins/40_Values.js +4 -0
- package/build/cjs/lib/node/mixins/40_Values.js.map +1 -1
- package/build/cjs/lib/node/mixins/50_Endpoints.js +4 -0
- package/build/cjs/lib/node/mixins/50_Endpoints.js.map +1 -1
- package/build/cjs/lib/node/mixins/60_ScheduledPoll.js +4 -0
- package/build/cjs/lib/node/mixins/60_ScheduledPoll.js.map +1 -1
- package/build/cjs/lib/node/mixins/70_FirmwareUpdate.js +8 -3
- package/build/cjs/lib/node/mixins/70_FirmwareUpdate.js.map +1 -1
- package/build/cjs/lib/node/mixins/index.js +4 -0
- package/build/cjs/lib/node/mixins/index.js.map +1 -1
- package/build/cjs/lib/node/mockCCBehaviors/ColorSwitch.js +2 -1
- package/build/cjs/lib/node/mockCCBehaviors/ColorSwitch.js.map +1 -1
- package/build/cjs/lib/node/mockCCBehaviors/Configuration.js +2 -1
- package/build/cjs/lib/node/mockCCBehaviors/Configuration.js.map +1 -1
- package/build/cjs/lib/node/mockCCBehaviors/ScheduleEntryLock.js +2 -1
- package/build/cjs/lib/node/mockCCBehaviors/ScheduleEntryLock.js.map +1 -1
- package/build/cjs/lib/node/mockCCBehaviors/ThermostatSetpoint.js +3 -2
- package/build/cjs/lib/node/mockCCBehaviors/ThermostatSetpoint.js.map +1 -1
- package/build/cjs/lib/node/mockCCBehaviors/UserCode.js +3 -2
- package/build/cjs/lib/node/mockCCBehaviors/UserCode.js.map +1 -1
- package/build/cjs/lib/node/utils.js +22 -2
- package/build/cjs/lib/node/utils.js.map +1 -1
- package/build/cjs/lib/telemetry/deviceConfig.js +2 -0
- package/build/cjs/lib/telemetry/deviceConfig.js.map +1 -1
- package/build/cjs/lib/telemetry/statistics.js +3 -0
- package/build/cjs/lib/telemetry/statistics.js.map +1 -1
- package/build/cjs/lib/zniffer/MPDU.js +57 -0
- package/build/cjs/lib/zniffer/MPDU.js.map +1 -1
- package/build/cjs/lib/zniffer/Zniffer.js +10 -3
- package/build/cjs/lib/zniffer/Zniffer.js.map +1 -1
- package/build/cjs/mockServer.js +14 -0
- package/build/cjs/mockServer.js.map +1 -1
- package/build/esm/lib/_version.d.ts +1 -1
- package/build/esm/lib/_version.js +1 -1
- package/package.json +12 -12
|
@@ -5,6 +5,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
8
9
|
var __export = (target, all) => {
|
|
9
10
|
for (var name in all)
|
|
10
11
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -48,7 +49,7 @@ function createAndStartDriverWithMockPort(options = {}) {
|
|
|
48
49
|
record: true,
|
|
49
50
|
readyData: new Uint8Array()
|
|
50
51
|
});
|
|
51
|
-
const onSerialPortOpen = (_port) => {
|
|
52
|
+
const onSerialPortOpen = /* @__PURE__ */ __name((_port) => {
|
|
52
53
|
mockPort = import_mock.MockBinding.getInstance(portAddress);
|
|
53
54
|
if (!mockPort)
|
|
54
55
|
reject(new Error("Mock serial port is not open!"));
|
|
@@ -56,10 +57,10 @@ function createAndStartDriverWithMockPort(options = {}) {
|
|
|
56
57
|
resolve({
|
|
57
58
|
driver,
|
|
58
59
|
mockPort,
|
|
59
|
-
continueStartup: () => continuePromise.resolve()
|
|
60
|
+
continueStartup: /* @__PURE__ */ __name(() => continuePromise.resolve(), "continueStartup")
|
|
60
61
|
});
|
|
61
62
|
return continuePromise;
|
|
62
|
-
};
|
|
63
|
+
}, "onSerialPortOpen");
|
|
63
64
|
if (!driverOptions.logConfig) {
|
|
64
65
|
driverOptions.logConfig = {
|
|
65
66
|
enabled: false
|
|
@@ -78,6 +79,7 @@ function createAndStartDriverWithMockPort(options = {}) {
|
|
|
78
79
|
await driver.start();
|
|
79
80
|
});
|
|
80
81
|
}
|
|
82
|
+
__name(createAndStartDriverWithMockPort, "createAndStartDriverWithMockPort");
|
|
81
83
|
async function createAndStartTestingDriver(options = {}) {
|
|
82
84
|
const { beforeStartup, skipControllerIdentification = false, skipBootloaderCheck = true, skipNodeInterview = false, loadConfiguration = true, ...internalOptions } = options;
|
|
83
85
|
const testId = Math.round(Math.random() * 4294967295).toString(16).padStart(8, "0");
|
|
@@ -117,6 +119,7 @@ async function createAndStartTestingDriver(options = {}) {
|
|
|
117
119
|
continueStartup();
|
|
118
120
|
});
|
|
119
121
|
}
|
|
122
|
+
__name(createAndStartTestingDriver, "createAndStartTestingDriver");
|
|
120
123
|
// Annotate the CommonJS export names for ESM import in node:
|
|
121
124
|
0 && (module.exports = {
|
|
122
125
|
createAndStartDriverWithMockPort,
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/driver/DriverMock.ts"],
|
|
4
4
|
"sourcesContent": ["import type { ZWaveSerialPortBase } from \"@zwave-js/serial\";\nimport {\n\tMockBinding,\n\ttype MockPortBinding,\n\tSerialPortMock,\n} from \"@zwave-js/serial/mock\";\nimport { createDeferredPromise } from \"alcalzone-shared/deferred-promise\";\nimport fs from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport type { SerialPort } from \"serialport\";\nimport { Driver } from \"./Driver.js\";\nimport type { PartialZWaveOptions, ZWaveOptions } from \"./ZWaveOptions.js\";\n\nexport interface CreateAndStartDriverWithMockPortResult {\n\tdriver: Driver;\n\tcontinueStartup: () => void;\n\tmockPort: MockPortBinding;\n}\n\nexport interface CreateAndStartDriverWithMockPortOptions {\n\tportAddress: string;\n}\n\n/** Creates a real driver instance with a mocked serial port to enable end to end tests */\nexport function createAndStartDriverWithMockPort(\n\toptions:\n\t\t& Partial<CreateAndStartDriverWithMockPortOptions>\n\t\t& PartialZWaveOptions = {},\n): Promise<CreateAndStartDriverWithMockPortResult> {\n\tconst { portAddress = \"/tty/FAKE\", ...driverOptions } = options;\n\treturn new Promise(async (resolve, reject) => {\n\t\t// eslint-disable-next-line prefer-const\n\t\tlet driver: Driver;\n\t\tlet mockPort: MockPortBinding;\n\n\t\tMockBinding.reset();\n\t\tMockBinding.createPort(portAddress, {\n\t\t\trecord: true,\n\t\t\treadyData: new Uint8Array(),\n\t\t});\n\n\t\t// This will be called when the driver has opened the serial port\n\t\tconst onSerialPortOpen = (\n\t\t\t_port: ZWaveSerialPortBase,\n\t\t): Promise<void> => {\n\t\t\t// Extract the mock serial port\n\t\t\tmockPort = MockBinding.getInstance(portAddress)!;\n\t\t\tif (!mockPort) reject(new Error(\"Mock serial port is not open!\"));\n\n\t\t\t// And return the info to the calling code, giving it control over\n\t\t\t// continuing the driver startup.\n\t\t\tconst continuePromise = createDeferredPromise();\n\t\t\tresolve({\n\t\t\t\tdriver,\n\t\t\t\tmockPort,\n\t\t\t\tcontinueStartup: () => continuePromise.resolve(),\n\t\t\t});\n\n\t\t\treturn continuePromise;\n\t\t};\n\n\t\t// Usually we don't want logs in these tests\n\t\tif (!driverOptions.logConfig) {\n\t\t\tdriverOptions.logConfig = {\n\t\t\t\tenabled: false,\n\t\t\t};\n\t\t}\n\n\t\tconst testingHooks: ZWaveOptions[\"testingHooks\"] = {\n\t\t\t...driverOptions.testingHooks,\n\t\t\t// instruct the driver to use SerialPortMock as the serialport implementation\n\t\t\tserialPortBinding: SerialPortMock as unknown as typeof SerialPort,\n\t\t\tonSerialPortOpen,\n\t\t};\n\n\t\tdriver = new Driver(portAddress, {\n\t\t\t...driverOptions,\n\t\t\ttestingHooks,\n\t\t});\n\t\tawait driver.start();\n\t});\n}\n\nexport type CreateAndStartTestingDriverResult = Omit<\n\tCreateAndStartDriverWithMockPortResult,\n\t\"continueStartup\"\n>;\n\nexport interface CreateAndStartTestingDriverOptions {\n\tbeforeStartup: (mockPort: MockPortBinding) => void | Promise<void>;\n\t/**\n\t * Whether the controller identification should be skipped (default: false).\n\t * If not, a Mock controller must be available on the serial port.\n\t */\n\tskipControllerIdentification?: boolean;\n\t/**\n\t * Whether the node interview should be skipped (default: false).\n\t * If not, a Mock controller and/or mock nodes must be available on the serial port.\n\t */\n\tskipNodeInterview?: boolean;\n\n\t/**\n\t * Set this to true to skip checking if the controller is in bootloader mode (default: true)\n\t */\n\tskipBootloaderCheck?: boolean;\n\n\t/**\n\t * Whether configuration files should be loaded (default: true)\n\t */\n\tloadConfiguration?: boolean;\n\n\tportAddress: string;\n}\n\nexport async function createAndStartTestingDriver(\n\toptions:\n\t\t& Partial<CreateAndStartTestingDriverOptions>\n\t\t& PartialZWaveOptions = {},\n): Promise<CreateAndStartTestingDriverResult> {\n\tconst {\n\t\tbeforeStartup,\n\t\tskipControllerIdentification = false,\n\t\tskipBootloaderCheck = true,\n\t\tskipNodeInterview = false,\n\t\tloadConfiguration = true,\n\t\t...internalOptions\n\t} = options;\n\n\t// Use a new fake serial port for each test\n\tconst testId = Math.round(Math.random() * 0xffffffff)\n\t\t.toString(16)\n\t\t.padStart(8, \"0\");\n\tinternalOptions.portAddress ??= `/tty/FAKE${testId}`;\n\n\tif (skipControllerIdentification) {\n\t\tinternalOptions.testingHooks ??= {};\n\t\tinternalOptions.testingHooks.skipControllerIdentification = true;\n\t}\n\tif (skipNodeInterview) {\n\t\tinternalOptions.testingHooks ??= {};\n\t\tinternalOptions.testingHooks.skipNodeInterview = true;\n\t}\n\tif (!loadConfiguration) {\n\t\tinternalOptions.testingHooks ??= {};\n\t\tinternalOptions.testingHooks.loadConfiguration = false;\n\t}\n\tif (skipBootloaderCheck) {\n\t\tinternalOptions.testingHooks ??= {};\n\t\tinternalOptions.testingHooks.skipBootloaderCheck = true;\n\t}\n\n\t// TODO: Make sure we delete this from time to time\n\tconst cacheDir = path.join(tmpdir(), \"zwave-js-test-cache\", testId);\n\n\tinternalOptions.storage ??= {};\n\tinternalOptions.storage.cacheDir = cacheDir;\n\n\tconst { driver, continueStartup, mockPort } =\n\t\tawait createAndStartDriverWithMockPort(internalOptions);\n\n\tif (typeof beforeStartup === \"function\") {\n\t\tawait beforeStartup(mockPort);\n\t}\n\n\t// Make sure the mock FS gets restored when the driver is destroyed\n\tconst originalDestroy = driver.destroy.bind(driver);\n\tdriver.destroy = async () => {\n\t\tawait originalDestroy();\n\t\tawait fs.rm(cacheDir, { recursive: true, force: true });\n\t};\n\n\treturn new Promise((resolve) => {\n\t\tdriver.once(\"driver ready\", () => {\n\t\t\tresolve({ driver, mockPort });\n\t\t});\n\t\tcontinueStartup();\n\t});\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;;;;;AAAA,kBAIO;AACP,8BAAsC;AACtC,sBAAe;AACf,qBAAuB;AACvB,uBAAiB;AAEjB,oBAAuB;AAcjB,SAAU,iCACf,UAEyB,CAAA,GAAE;AAE3B,QAAM,EAAE,cAAc,aAAa,GAAG,cAAa,IAAK;AACxD,SAAO,IAAI,QAAQ,OAAO,SAAS,WAAU;AAE5C,QAAI;AACJ,QAAI;AAEJ,4BAAY,MAAK;AACjB,4BAAY,WAAW,aAAa;MACnC,QAAQ;MACR,WAAW,IAAI,WAAU;KACzB;AAGD,UAAM,mBAAmB,wBACxB,UACkB;AAElB,iBAAW,wBAAY,YAAY,WAAW;AAC9C,UAAI,CAAC;AAAU,eAAO,IAAI,MAAM,+BAA+B,CAAC;AAIhE,YAAM,sBAAkB,+CAAqB;AAC7C,cAAQ;QACP;QACA;QACA,iBAAiB,6BAAM,gBAAgB,QAAO,GAA7B;OACjB;AAED,aAAO;IACR,GAjByB;AAoBzB,QAAI,CAAC,cAAc,WAAW;AAC7B,oBAAc,YAAY;QACzB,SAAS;;IAEX;AAEA,UAAM,eAA6C;MAClD,GAAG,cAAc;;MAEjB,mBAAmB;MACnB;;AAGD,aAAS,IAAI,qBAAO,aAAa;MAChC,GAAG;MACH;KACA;AACD,UAAM,OAAO,MAAK;EACnB,CAAC;AACF;AAzDgB;AA0FhB,eAAsB,4BACrB,UAEyB,CAAA,GAAE;AAE3B,QAAM,EACL,eACA,+BAA+B,OAC/B,sBAAsB,MACtB,oBAAoB,OACpB,oBAAoB,MACpB,GAAG,gBAAe,IACf;AAGJ,QAAM,SAAS,KAAK,MAAM,KAAK,OAAM,IAAK,UAAU,EAClD,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AACjB,kBAAgB,gBAAgB,YAAY,MAAM;AAElD,MAAI,8BAA8B;AACjC,oBAAgB,iBAAiB,CAAA;AACjC,oBAAgB,aAAa,+BAA+B;EAC7D;AACA,MAAI,mBAAmB;AACtB,oBAAgB,iBAAiB,CAAA;AACjC,oBAAgB,aAAa,oBAAoB;EAClD;AACA,MAAI,CAAC,mBAAmB;AACvB,oBAAgB,iBAAiB,CAAA;AACjC,oBAAgB,aAAa,oBAAoB;EAClD;AACA,MAAI,qBAAqB;AACxB,oBAAgB,iBAAiB,CAAA;AACjC,oBAAgB,aAAa,sBAAsB;EACpD;AAGA,QAAM,WAAW,iBAAAA,QAAK,SAAK,uBAAM,GAAI,uBAAuB,MAAM;AAElE,kBAAgB,YAAY,CAAA;AAC5B,kBAAgB,QAAQ,WAAW;AAEnC,QAAM,EAAE,QAAQ,iBAAiB,SAAQ,IACxC,MAAM,iCAAiC,eAAe;AAEvD,MAAI,OAAO,kBAAkB,YAAY;AACxC,UAAM,cAAc,QAAQ;EAC7B;AAGA,QAAM,kBAAkB,OAAO,QAAQ,KAAK,MAAM;AAClD,SAAO,UAAU,YAAW;AAC3B,UAAM,gBAAe;AACrB,UAAM,gBAAAC,QAAG,GAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAI,CAAE;EACvD;AAEA,SAAO,IAAI,QAAQ,CAAC,YAAW;AAC9B,WAAO,KAAK,gBAAgB,MAAK;AAChC,cAAQ,EAAE,QAAQ,SAAQ,CAAE;IAC7B,CAAC;AACD,oBAAe;EAChB,CAAC;AACF;AA/DsB;",
|
|
6
6
|
"names": ["path", "fs"]
|
|
7
7
|
}
|
|
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
7
|
var __export = (target, all) => {
|
|
7
8
|
for (var name in all)
|
|
8
9
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -49,6 +50,7 @@ function maybePartialNodeUpdate(sent, received) {
|
|
|
49
50
|
const receivedCommand = (0, import_cc.getInnermostCommandClass)(received.command);
|
|
50
51
|
return sentCommand.isExpectedCCResponse(receivedCommand);
|
|
51
52
|
}
|
|
53
|
+
__name(maybePartialNodeUpdate, "maybePartialNodeUpdate");
|
|
52
54
|
async function waitForNodeUpdate(driver, msg, timeoutMs) {
|
|
53
55
|
try {
|
|
54
56
|
return await driver.waitForMessage((received) => msg.isExpectedNodeUpdate(received), timeoutMs, (received) => maybePartialNodeUpdate(msg, received));
|
|
@@ -56,16 +58,19 @@ async function waitForNodeUpdate(driver, msg, timeoutMs) {
|
|
|
56
58
|
throw new import_core.ZWaveError(`Timed out while waiting for a response from the node`, import_core.ZWaveErrorCodes.Controller_NodeTimeout);
|
|
57
59
|
}
|
|
58
60
|
}
|
|
61
|
+
__name(waitForNodeUpdate, "waitForNodeUpdate");
|
|
59
62
|
function getNodeUpdateTimeout(driver, msg, additionalCommandTimeoutMs = 0) {
|
|
60
63
|
const commandTimeMs = Math.ceil((msg.rtt ?? 0) / 1e6);
|
|
61
64
|
return commandTimeMs + driver.getReportTimeout(msg) + additionalCommandTimeoutMs;
|
|
62
65
|
}
|
|
63
|
-
|
|
66
|
+
__name(getNodeUpdateTimeout, "getNodeUpdateTimeout");
|
|
67
|
+
const simpleMessageGenerator = /* @__PURE__ */ __name(async function* (driver, ctx, msg, onMessageSent, additionalCommandTimeoutMs = 0) {
|
|
64
68
|
if ((0, import_serialapi.isSendData)(msg) && await driver.exceedsMaxPayloadLength(msg)) {
|
|
65
69
|
let fail2 = function() {
|
|
66
70
|
throw new import_core.ZWaveError("Cannot send this message because it would exceed the maximum payload length!", import_core.ZWaveErrorCodes.Controller_MessageTooLarge);
|
|
67
71
|
};
|
|
68
72
|
var fail = fail2;
|
|
73
|
+
__name(fail2, "fail");
|
|
69
74
|
if (msg.transmitOptions & import_core.TransmitOptions.Explore) {
|
|
70
75
|
msg.transmitOptions &= ~import_core.TransmitOptions.Explore;
|
|
71
76
|
if (await driver.exceedsMaxPayloadLength(msg)) {
|
|
@@ -99,8 +104,8 @@ const simpleMessageGenerator = async function* (driver, ctx, msg, onMessageSent,
|
|
|
99
104
|
return waitForNodeUpdate(driver, msg, timeout);
|
|
100
105
|
}
|
|
101
106
|
return result;
|
|
102
|
-
};
|
|
103
|
-
const maybeTransportServiceGenerator = async function* (driver, ctx, msg, onMessageSent, additionalCommandTimeoutMs) {
|
|
107
|
+
}, "simpleMessageGenerator");
|
|
108
|
+
const maybeTransportServiceGenerator = /* @__PURE__ */ __name(async function* (driver, ctx, msg, onMessageSent, additionalCommandTimeoutMs) {
|
|
104
109
|
if (typeof msg.command.nodeId !== "number") {
|
|
105
110
|
throw new import_core.ZWaveError("Cannot use the Transport Service message generator for multicast commands!", import_core.ZWaveErrorCodes.Argument_Invalid);
|
|
106
111
|
}
|
|
@@ -122,22 +127,22 @@ const maybeTransportServiceGenerator = async function* (driver, ctx, msg, onMess
|
|
|
122
127
|
const { unregister: unregisterHandler } = driver.registerCommandHandler((cc) => cc.nodeId === nodeId && (cc instanceof import_TransportServiceCC.TransportServiceCCSegmentWait || cc instanceof import_TransportServiceCC.TransportServiceCCSegmentRequest && cc.sessionId === sessionId), (cc) => {
|
|
123
128
|
unhandledResponses.push(cc);
|
|
124
129
|
});
|
|
125
|
-
const receivedSegmentWait = () => {
|
|
130
|
+
const receivedSegmentWait = /* @__PURE__ */ __name(() => {
|
|
126
131
|
const index = unhandledResponses.findIndex((cc) => cc instanceof import_TransportServiceCC.TransportServiceCCSegmentWait);
|
|
127
132
|
if (index >= 0) {
|
|
128
133
|
const cc = unhandledResponses[index];
|
|
129
134
|
unhandledResponses.splice(index, 1);
|
|
130
135
|
return cc;
|
|
131
136
|
}
|
|
132
|
-
};
|
|
133
|
-
const receivedSegmentRequest = () => {
|
|
137
|
+
}, "receivedSegmentWait");
|
|
138
|
+
const receivedSegmentRequest = /* @__PURE__ */ __name(() => {
|
|
134
139
|
const index = unhandledResponses.findIndex((cc) => cc instanceof import_TransportServiceCC.TransportServiceCCSegmentRequest);
|
|
135
140
|
if (index >= 0) {
|
|
136
141
|
const cc = unhandledResponses[index];
|
|
137
142
|
unhandledResponses.splice(index, 1);
|
|
138
143
|
return cc;
|
|
139
144
|
}
|
|
140
|
-
};
|
|
145
|
+
}, "receivedSegmentRequest");
|
|
141
146
|
let result;
|
|
142
147
|
try {
|
|
143
148
|
attempts: for (let attempt = 1; attempt <= 2; attempt++) {
|
|
@@ -240,7 +245,7 @@ const maybeTransportServiceGenerator = async function* (driver, ctx, msg, onMess
|
|
|
240
245
|
return waitForNodeUpdate(driver, msg, timeout);
|
|
241
246
|
}
|
|
242
247
|
return result;
|
|
243
|
-
};
|
|
248
|
+
}, "maybeTransportServiceGenerator");
|
|
244
249
|
async function* sendCommandGenerator(driver, ctx, command, onMessageSent, options) {
|
|
245
250
|
const msg = driver.createSendDataMessage(command, options);
|
|
246
251
|
const resp = yield* maybeTransportServiceGenerator(driver, ctx, msg, onMessageSent);
|
|
@@ -249,7 +254,8 @@ async function* sendCommandGenerator(driver, ctx, command, onMessageSent, option
|
|
|
249
254
|
return resp.command;
|
|
250
255
|
}
|
|
251
256
|
}
|
|
252
|
-
|
|
257
|
+
__name(sendCommandGenerator, "sendCommandGenerator");
|
|
258
|
+
const secureMessageGeneratorS0 = /* @__PURE__ */ __name(async function* (driver, ctx, msg, onMessageSent) {
|
|
253
259
|
if (typeof msg.command.nodeId !== "number") {
|
|
254
260
|
throw new import_core.ZWaveError("Cannot use the S0 message generator for multicast commands!", import_core.ZWaveErrorCodes.Argument_Invalid);
|
|
255
261
|
} else if (!(msg.command instanceof import_SecurityCC.SecurityCCCommandEncapsulation)) {
|
|
@@ -278,8 +284,8 @@ const secureMessageGeneratorS0 = async function* (driver, ctx, msg, onMessageSen
|
|
|
278
284
|
}
|
|
279
285
|
msg.command.nonce = nonce;
|
|
280
286
|
return yield* simpleMessageGenerator(driver, ctx, msg, onMessageSent, additionalTimeoutMs);
|
|
281
|
-
};
|
|
282
|
-
const secureMessageGeneratorS2 = async function* (driver, ctx, msg, onMessageSent) {
|
|
287
|
+
}, "secureMessageGeneratorS0");
|
|
288
|
+
const secureMessageGeneratorS2 = /* @__PURE__ */ __name(async function* (driver, ctx, msg, onMessageSent) {
|
|
283
289
|
if (!(0, import_serialapi.isSendData)(msg) || !(0, import_serialapi2.containsCC)(msg)) {
|
|
284
290
|
throw new import_core.ZWaveError("Cannot use the S2 message generator for a command that's not a SendData message!", import_core.ZWaveErrorCodes.Argument_Invalid);
|
|
285
291
|
} else if (typeof msg.command.nodeId !== "number") {
|
|
@@ -348,8 +354,8 @@ const secureMessageGeneratorS2 = async function* (driver, ctx, msg, onMessageSen
|
|
|
348
354
|
}
|
|
349
355
|
}
|
|
350
356
|
return response;
|
|
351
|
-
};
|
|
352
|
-
const secureMessageGeneratorS2Multicast = async function* (driver, ctx, msg, onMessageSent) {
|
|
357
|
+
}, "secureMessageGeneratorS2");
|
|
358
|
+
const secureMessageGeneratorS2Multicast = /* @__PURE__ */ __name(async function* (driver, ctx, msg, onMessageSent) {
|
|
353
359
|
if (!(0, import_serialapi.isSendData)(msg) || !(0, import_serialapi2.containsCC)(msg)) {
|
|
354
360
|
throw new import_core.ZWaveError("Cannot use the S2 multicast message generator for a command that's not a SendData message!", import_core.ZWaveErrorCodes.Argument_Invalid);
|
|
355
361
|
} else if (msg.command.isSinglecast()) {
|
|
@@ -437,7 +443,7 @@ const secureMessageGeneratorS2Multicast = async function* (driver, ctx, msg, onM
|
|
|
437
443
|
} else {
|
|
438
444
|
return response;
|
|
439
445
|
}
|
|
440
|
-
};
|
|
446
|
+
}, "secureMessageGeneratorS2Multicast");
|
|
441
447
|
function createMessageGenerator(driver, ctx, msg, onMessageSent) {
|
|
442
448
|
const resultPromise = (0, import_deferred_promise.createDeferredPromise)();
|
|
443
449
|
const generator = {
|
|
@@ -445,11 +451,11 @@ function createMessageGenerator(driver, ctx, msg, onMessageSent) {
|
|
|
445
451
|
// The transaction will set this field on creation
|
|
446
452
|
current: void 0,
|
|
447
453
|
self: void 0,
|
|
448
|
-
reset: () => {
|
|
454
|
+
reset: /* @__PURE__ */ __name(() => {
|
|
449
455
|
generator.current = void 0;
|
|
450
456
|
generator.self = void 0;
|
|
451
|
-
},
|
|
452
|
-
start: () => {
|
|
457
|
+
}, "reset"),
|
|
458
|
+
start: /* @__PURE__ */ __name(() => {
|
|
453
459
|
async function* gen() {
|
|
454
460
|
let implementation = simpleMessageGenerator;
|
|
455
461
|
if ((0, import_serialapi.isSendData)(msg)) {
|
|
@@ -492,12 +498,14 @@ function createMessageGenerator(driver, ctx, msg, onMessageSent) {
|
|
|
492
498
|
generator.reset();
|
|
493
499
|
return;
|
|
494
500
|
}
|
|
501
|
+
__name(gen, "gen");
|
|
495
502
|
generator.self = gen();
|
|
496
503
|
return generator.self;
|
|
497
|
-
}
|
|
504
|
+
}, "start")
|
|
498
505
|
};
|
|
499
506
|
return { resultPromise, generator };
|
|
500
507
|
}
|
|
508
|
+
__name(createMessageGenerator, "createMessageGenerator");
|
|
501
509
|
// Annotate the CommonJS export names for ESM import in node:
|
|
502
510
|
0 && (module.exports = {
|
|
503
511
|
createMessageGenerator,
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/driver/MessageGenerators.ts"],
|
|
4
4
|
"sourcesContent": ["import {\n\ttype CommandClass,\n\tMGRPExtension,\n\tMPANExtension,\n\tSecurity2CCMessageEncapsulation,\n\tSecurity2CCNonceGet,\n\tSecurity2CCNonceReport,\n\tSupervisionCC,\n\tSupervisionCCReport,\n\tSupervisionCommand,\n\tgetInnermostCommandClass,\n} from \"@zwave-js/cc\";\nimport {\n\tSecurityCCCommandEncapsulation,\n\tSecurityCCNonceGet,\n\ttype SecurityCCNonceReport,\n} from \"@zwave-js/cc/SecurityCC\";\nimport {\n\tMAX_SEGMENT_SIZE,\n\tRELAXED_TIMING_THRESHOLD,\n\ttype TransportServiceCC,\n\tTransportServiceCCFirstSegment,\n\tTransportServiceCCSegmentComplete,\n\tTransportServiceCCSegmentRequest,\n\tTransportServiceCCSegmentWait,\n\tTransportServiceCCSubsequentSegment,\n\tTransportServiceTimeouts,\n} from \"@zwave-js/cc/TransportServiceCC\";\nimport {\n\tCommandClasses,\n\tEncapsulationFlags,\n\tMessagePriority,\n\tNODE_ID_BROADCAST,\n\tSPANState,\n\tSecurityClass,\n\ttype SendCommandOptions,\n\ttype SupervisionResult,\n\tSupervisionStatus,\n\tTransmitOptions,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tmergeSupervisionResults,\n} from \"@zwave-js/core\";\nimport { type CCEncodingContext } from \"@zwave-js/host\";\nimport type { Message } from \"@zwave-js/serial\";\nimport {\n\ttype SendDataMessage,\n\tisSendData,\n\tisTransmitReport,\n} from \"@zwave-js/serial/serialapi\";\nimport { type ContainsCC, containsCC } from \"@zwave-js/serial/serialapi\";\nimport { getErrorMessage } from \"@zwave-js/shared\";\nimport { wait } from \"alcalzone-shared/async\";\nimport {\n\ttype DeferredPromise,\n\tcreateDeferredPromise,\n} from \"alcalzone-shared/deferred-promise\";\nimport type { Driver } from \"./Driver.js\";\nimport type { MessageGenerator } from \"./Transaction.js\";\n\nexport type MessageGeneratorImplementation<T extends Message> = (\n\t/** A reference to the driver */\n\tdriver: Driver,\n\tctx: CCEncodingContext,\n\t/** The \"primary\" message */\n\tmessage: T,\n\t/**\n\t * A hook to get notified about each sent message and the result of the Serial API call\n\t * without waiting for the message generator to finish completely.\n\t */\n\tonMessageSent: (msg: Message, result: Message | undefined) => void,\n\t/** Can be used to extend the timeout waiting for a response from a node to the sent message */\n\tadditionalCommandTimeoutMs?: number,\n) => AsyncGenerator<Message, Message, Message>;\n\nfunction maybePartialNodeUpdate(sent: Message, received: Message): boolean {\n\t// Some commands are returned in multiple segments, which may take longer than\n\t// the configured timeout.\n\tif (!containsCC(sent) || !containsCC(received)) {\n\t\treturn false;\n\t}\n\n\tif (sent.getNodeId() !== received.getNodeId()) return false;\n\n\tif (received.command.ccId === CommandClasses[\"Transport Service\"]) {\n\t\t// We don't know what's in there. It may be the expected update\n\t\treturn true;\n\t}\n\n\t// Let the sent CC test if the received one is a match.\n\t// These predicates don't check if the received CC is complete, we can use them here.\n\t// This also doesn't check for correct encapsulation, but that is good enough to refresh the timer.\n\tconst sentCommand = getInnermostCommandClass(sent.command);\n\tconst receivedCommand = getInnermostCommandClass(received.command);\n\treturn sentCommand.isExpectedCCResponse(receivedCommand);\n}\n\nexport async function waitForNodeUpdate<T extends Message>(\n\tdriver: Driver,\n\tmsg: Message,\n\ttimeoutMs: number,\n): Promise<T> {\n\ttry {\n\t\treturn await driver.waitForMessage<T>(\n\t\t\t(received) => msg.isExpectedNodeUpdate(received),\n\t\t\ttimeoutMs,\n\t\t\t(received) => maybePartialNodeUpdate(msg, received),\n\t\t);\n\t} catch {\n\t\tthrow new ZWaveError(\n\t\t\t`Timed out while waiting for a response from the node`,\n\t\t\tZWaveErrorCodes.Controller_NodeTimeout,\n\t\t);\n\t}\n}\n\nfunction getNodeUpdateTimeout(\n\tdriver: Driver,\n\tmsg: Message,\n\tadditionalCommandTimeoutMs = 0,\n): number {\n\tconst commandTimeMs = Math.ceil((msg.rtt ?? 0) / 1e6);\n\treturn (\n\t\tcommandTimeMs\n\t\t+ driver.getReportTimeout(msg)\n\t\t+ additionalCommandTimeoutMs\n\t);\n}\n\n/** A simple message generator that simply sends a message, waits for the ACK (and the response if one is expected) */\nexport const simpleMessageGenerator: MessageGeneratorImplementation<Message> =\n\tasync function*(\n\t\tdriver,\n\t\tctx,\n\t\tmsg,\n\t\tonMessageSent,\n\t\tadditionalCommandTimeoutMs = 0,\n\t) {\n\t\t// Make sure we can send this message\n\t\tif (isSendData(msg) && await driver.exceedsMaxPayloadLength(msg)) {\n\t\t\t// We use explorer frames by default, but this reduces the maximum payload length by 2 bytes compared to AUTO_ROUTE\n\t\t\t// Try disabling explorer frames for this message and see if it fits now.\n\t\t\tfunction fail(): never {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\"Cannot send this message because it would exceed the maximum payload length!\",\n\t\t\t\t\tZWaveErrorCodes.Controller_MessageTooLarge,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (msg.transmitOptions & TransmitOptions.Explore) {\n\t\t\t\tmsg.transmitOptions &= ~TransmitOptions.Explore;\n\t\t\t\tif (await driver.exceedsMaxPayloadLength(msg)) {\n\t\t\t\t\t// Still too large\n\t\t\t\t\tfail();\n\t\t\t\t}\n\t\t\t\tdriver.controllerLog.logNode(msg.getNodeId()!, {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"Disabling explorer frames for this message due to its size\",\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfail();\n\t\t\t}\n\t\t}\n\n\t\t// Pass this message to the send thread and wait for it to be sent\n\t\tlet result: Message;\n\t\t// At this point we can't have received a premature update\n\t\tmsg.prematureNodeUpdate = undefined;\n\n\t\ttry {\n\t\t\t// The yield can throw and must be handled here\n\t\t\tresult = yield msg;\n\n\t\t\t// Figure out how long the message took to be handled\n\t\t\tmsg.markAsCompleted();\n\n\t\t\tonMessageSent(msg, result);\n\t\t} catch (e) {\n\t\t\tmsg.markAsCompleted();\n\t\t\tthrow e;\n\t\t}\n\n\t\t// If the message was sent to a node and came back with a NOK callback,\n\t\t// we want to inspect the callback, for example to look at TX statistics\n\t\t// or update the node status.\n\t\t//\n\t\t// We now need to throw because the callback was passed through so we could inspect it.\n\t\tif (isTransmitReport(result) && !result.isOK()) {\n\t\t\t// Throw the message in order to short-circuit all possible generators\n\t\t\t// eslint-disable-next-line @typescript-eslint/only-throw-error\n\t\t\tthrow result;\n\t\t}\n\n\t\t// If the sent message expects an update from the node, wait for it\n\t\tif (msg.expectsNodeUpdate()) {\n\t\t\t// We might have received the update prematurely. In that case, return it.\n\t\t\tif (msg.prematureNodeUpdate) return msg.prematureNodeUpdate;\n\n\t\t\t// CommandTime is measured by the application\n\t\t\t// ReportTime timeout SHOULD be set to CommandTime + 1 second.\n\t\t\tconst timeout = getNodeUpdateTimeout(\n\t\t\t\tdriver,\n\t\t\t\tmsg,\n\t\t\t\tadditionalCommandTimeoutMs,\n\t\t\t);\n\t\t\treturn waitForNodeUpdate(driver, msg, timeout);\n\t\t}\n\n\t\treturn result;\n\t};\n\n/** A generator for singlecast SendData messages that automatically uses Transport Service when necessary */\nexport const maybeTransportServiceGenerator: MessageGeneratorImplementation<\n\tSendDataMessage & ContainsCC\n> = async function*(\n\tdriver,\n\tctx,\n\tmsg,\n\tonMessageSent,\n\tadditionalCommandTimeoutMs,\n) {\n\t// Make sure we can send this message\n\t/*if (!isSendData(msg) || !containsCC(msg)) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot use the Transport Service message generator for messages that are not SendData!\",\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t} else*/ if (typeof msg.command.nodeId !== \"number\") {\n\t\tthrow new ZWaveError(\n\t\t\t\"Cannot use the Transport Service message generator for multicast commands!\",\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t}\n\n\tconst node = msg.tryGetNode(driver);\n\tconst mayUseTransportService =\n\t\tnode?.supportsCC(CommandClasses[\"Transport Service\"])\n\t\t&& node.getCCVersion(CommandClasses[\"Transport Service\"]) >= 2;\n\n\tif (\n\t\t!mayUseTransportService || !(await driver.exceedsMaxPayloadLength(msg))\n\t) {\n\t\t// Transport Service isn't needed for this message\n\t\treturn yield* simpleMessageGenerator(\n\t\t\tdriver,\n\t\t\tctx,\n\t\t\tmsg,\n\t\t\tonMessageSent,\n\t\t\tadditionalCommandTimeoutMs,\n\t\t);\n\t}\n\n\t// Send the command split into multiple segments\n\tconst payload = await msg.serializeCCAsync(ctx);\n\tconst numSegments = Math.ceil(payload.length / MAX_SEGMENT_SIZE);\n\tconst segmentDelay = numSegments > RELAXED_TIMING_THRESHOLD\n\t\t? TransportServiceTimeouts.relaxedTimingDelayR2\n\t\t: 0;\n\tconst sessionId = driver.getNextTransportServiceSessionId();\n\tconst nodeId = msg.command.nodeId;\n\n\t// Since the command is never logged, we do it here\n\tdriver.driverLog.print(\n\t\t\"The following message is too large, using Transport Service to transmit it:\",\n\t);\n\tdriver.driverLog.logMessage(msg, {\n\t\tdirection: \"outbound\",\n\t});\n\n\t// I don't see an elegant way to wait for possible responses, so we just register a handler in the driver\n\t// and remember the received commands\n\tlet unhandledResponses: TransportServiceCC[] = [];\n\tconst { unregister: unregisterHandler } = driver.registerCommandHandler(\n\t\t(cc) =>\n\t\t\tcc.nodeId === nodeId\n\t\t\t&& (cc instanceof TransportServiceCCSegmentWait\n\t\t\t\t|| (cc instanceof TransportServiceCCSegmentRequest\n\t\t\t\t\t&& cc.sessionId === sessionId)),\n\t\t(cc) => {\n\t\t\tunhandledResponses.push(cc as TransportServiceCC);\n\t\t},\n\t);\n\n\tconst receivedSegmentWait = () => {\n\t\tconst index = unhandledResponses.findIndex(\n\t\t\t(cc) => cc instanceof TransportServiceCCSegmentWait,\n\t\t);\n\t\tif (index >= 0) {\n\t\t\tconst cc = unhandledResponses[\n\t\t\t\tindex\n\t\t\t] as TransportServiceCCSegmentWait;\n\t\t\tunhandledResponses.splice(index, 1);\n\t\t\treturn cc;\n\t\t}\n\t};\n\n\tconst receivedSegmentRequest = () => {\n\t\tconst index = unhandledResponses.findIndex(\n\t\t\t(cc) => cc instanceof TransportServiceCCSegmentRequest,\n\t\t);\n\t\tif (index >= 0) {\n\t\t\tconst cc = unhandledResponses[\n\t\t\t\tindex\n\t\t\t] as TransportServiceCCSegmentRequest;\n\t\t\tunhandledResponses.splice(index, 1);\n\t\t\treturn cc;\n\t\t}\n\t};\n\n\t// We have to deal with multiple messages, but can only return a single result.\n\t// Therefore we use the last one as the result.\n\tlet result!: Message;\n\n\ttry {\n\t\tattempts: for (let attempt = 1; attempt <= 2; attempt++) {\n\t\t\tdriver.controllerLog.logNode(nodeId, {\n\t\t\t\tmessage:\n\t\t\t\t\t`Beginning Transport Service TX session #${sessionId}...`,\n\t\t\t\tlevel: \"debug\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\n\t\t\t// Clear the list of unhandled responses\n\t\t\tunhandledResponses = [];\n\t\t\t// Fill the list of unsent segments\n\t\t\tconst unsentSegments = new Array(numSegments)\n\t\t\t\t.fill(0)\n\t\t\t\t.map((_, i) => i);\n\t\t\tlet didRetryLastSegment = false;\n\t\t\tlet isFirstTransferredSegment = true;\n\n\t\t\twhile (unsentSegments.length > 0) {\n\t\t\t\t// Wait if necessary\n\t\t\t\tif (isFirstTransferredSegment) {\n\t\t\t\t\tisFirstTransferredSegment = false;\n\t\t\t\t} else if (segmentDelay) {\n\t\t\t\t\tawait wait(segmentDelay, true);\n\t\t\t\t}\n\t\t\t\tconst segment = unsentSegments.shift()!;\n\n\t\t\t\tconst chunk = payload.subarray(\n\t\t\t\t\tsegment * MAX_SEGMENT_SIZE,\n\t\t\t\t\t(segment + 1) * MAX_SEGMENT_SIZE,\n\t\t\t\t);\n\t\t\t\tlet cc: TransportServiceCC;\n\t\t\t\tif (segment === 0) {\n\t\t\t\t\tcc = new TransportServiceCCFirstSegment({\n\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tdatagramSize: payload.length,\n\t\t\t\t\t\tpartialDatagram: chunk,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tcc = new TransportServiceCCSubsequentSegment({\n\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tdatagramSize: payload.length,\n\t\t\t\t\t\tdatagramOffset: segment * MAX_SEGMENT_SIZE,\n\t\t\t\t\t\tpartialDatagram: chunk,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst tmsg = driver.createSendDataMessage(cc, {\n\t\t\t\t\tautoEncapsulate: false,\n\t\t\t\t\tmaxSendAttempts: msg.maxSendAttempts,\n\t\t\t\t\ttransmitOptions: msg.transmitOptions,\n\t\t\t\t});\n\t\t\t\tresult = yield* simpleMessageGenerator(\n\t\t\t\t\tdriver,\n\t\t\t\t\tctx,\n\t\t\t\t\ttmsg,\n\t\t\t\t\tonMessageSent,\n\t\t\t\t);\n\n\t\t\t\tlet segmentComplete:\n\t\t\t\t\t| TransportServiceCCSegmentComplete\n\t\t\t\t\t| undefined = undefined;\n\t\t\t\t// After sending the last segment, wait for a SegmentComplete response, at the same time\n\t\t\t\t// give the node a chance to send a SegmentWait or SegmentRequest(s)\n\t\t\t\tif (segment === numSegments - 1) {\n\t\t\t\t\tsegmentComplete = await driver\n\t\t\t\t\t\t.waitForCommand<TransportServiceCCSegmentComplete>(\n\t\t\t\t\t\t\t(cc) =>\n\t\t\t\t\t\t\t\tcc.nodeId === nodeId\n\t\t\t\t\t\t\t\t&& cc\n\t\t\t\t\t\t\t\t\tinstanceof TransportServiceCCSegmentComplete\n\t\t\t\t\t\t\t\t&& cc.sessionId === sessionId,\n\t\t\t\t\t\t\tTransportServiceTimeouts.segmentCompleteR2,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.catch(() => undefined);\n\t\t\t\t}\n\n\t\t\t\tif (segmentComplete) {\n\t\t\t\t\t// We're done!\n\t\t\t\t\tdriver.controllerLog.logNode(nodeId, {\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`Transport Service TX session #${sessionId} complete`,\n\t\t\t\t\t\tlevel: \"debug\",\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\t\t\t\t\tbreak attempts;\n\t\t\t\t}\n\n\t\t\t\t// If we received a SegmentWait, we need to wait and restart\n\t\t\t\tconst segmentWait = receivedSegmentWait();\n\t\t\t\tif (segmentWait) {\n\t\t\t\t\tconst waitTime = segmentWait.pendingSegments * 100;\n\t\t\t\t\tdriver.controllerLog.logNode(nodeId, {\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`Restarting Transport Service TX session #${sessionId} in ${waitTime} ms...`,\n\t\t\t\t\t\tlevel: \"debug\",\n\t\t\t\t\t});\n\n\t\t\t\t\tawait wait(waitTime, true);\n\t\t\t\t\tcontinue attempts;\n\t\t\t\t}\n\n\t\t\t\t// If the node requested missing segments, add them to the list of unsent segments and continue transmitting\n\t\t\t\tlet segmentRequest:\n\t\t\t\t\t| TransportServiceCCSegmentRequest\n\t\t\t\t\t| undefined = undefined;\n\t\t\t\tlet readdedSegments = false;\n\t\t\t\twhile ((segmentRequest = receivedSegmentRequest())) {\n\t\t\t\t\tunsentSegments.push(\n\t\t\t\t\t\tsegmentRequest.datagramOffset / MAX_SEGMENT_SIZE,\n\t\t\t\t\t);\n\t\t\t\t\treaddedSegments = true;\n\t\t\t\t}\n\t\t\t\tif (readdedSegments) continue;\n\n\t\t\t\t// If we didn't receive anything after sending the last segment, retry the last segment\n\t\t\t\tif (segment === numSegments - 1) {\n\t\t\t\t\tif (didRetryLastSegment) {\n\t\t\t\t\t\tdriver.controllerLog.logNode(nodeId, {\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t`Transport Service TX session #${sessionId} failed`,\n\t\t\t\t\t\t\tlevel: \"debug\",\n\t\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak attempts;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Try the last segment again\n\t\t\t\t\t\tdriver.controllerLog.logNode(nodeId, {\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t`Transport Service TX session #${sessionId}: Segment Complete missing - re-transmitting last segment...`,\n\t\t\t\t\t\t\tlevel: \"debug\",\n\t\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdidRetryLastSegment = true;\n\t\t\t\t\t\tunsentSegments.unshift(segment);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} finally {\n\t\t// We're done, unregister the handler\n\t\tunregisterHandler();\n\t}\n\n\t// Transport Service CCs do not expect a node update and have no knowledge about the encapsulated CC.\n\t// Therefore we need to replicate the waiting from simpleMessageGenerator here\n\n\t// If the sent message expects an update from the node, wait for it\n\tif (msg.expectsNodeUpdate()) {\n\t\t// TODO: Figure out if we can handle premature updates with Transport Service CC\n\t\tconst timeout = getNodeUpdateTimeout(\n\t\t\tdriver,\n\t\t\tmsg,\n\t\t\tadditionalCommandTimeoutMs,\n\t\t);\n\t\treturn waitForNodeUpdate(driver, msg, timeout);\n\t}\n\n\treturn result;\n};\n\n/** A simple (internal) generator that simply sends a command, and optionally returns the response command */\nasync function* sendCommandGenerator<\n\tTResponse extends CommandClass = CommandClass,\n>(\n\tdriver: Driver,\n\tctx: CCEncodingContext,\n\tcommand: CommandClass,\n\tonMessageSent: (msg: Message, result: Message | undefined) => void,\n\toptions?: SendCommandOptions,\n) {\n\tconst msg = driver.createSendDataMessage(command, options);\n\n\tconst resp = yield* maybeTransportServiceGenerator(\n\t\tdriver,\n\t\tctx,\n\t\tmsg,\n\t\tonMessageSent,\n\t);\n\tif (resp && containsCC(resp)) {\n\t\tdriver.unwrapCommands(resp);\n\t\treturn resp.command as TResponse;\n\t}\n}\n\n/** A message generator for security encapsulated messages (S0) */\nexport const secureMessageGeneratorS0: MessageGeneratorImplementation<\n\tSendDataMessage & ContainsCC\n> = async function*(driver, ctx, msg, onMessageSent) {\n\t/*if (!isSendData(msg)) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot use the S0 message generator for a command that's not a SendData message!\",\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t} else*/ if (typeof msg.command.nodeId !== \"number\") {\n\t\tthrow new ZWaveError(\n\t\t\t\"Cannot use the S0 message generator for multicast commands!\",\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t} else if (!(msg.command instanceof SecurityCCCommandEncapsulation)) {\n\t\tthrow new ZWaveError(\n\t\t\t\"The S0 message generator can only be used for Security S0 command encapsulation!\",\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t}\n\n\t// Step 1: Acquire a nonce\n\tconst secMan = driver.securityManager!;\n\tconst nodeId = msg.command.nodeId;\n\tlet additionalTimeoutMs: number | undefined;\n\n\t// Try to get a free nonce before requesting a new one\n\tlet nonce: Uint8Array | undefined = secMan.getFreeNonce(nodeId);\n\tif (!nonce) {\n\t\t// No free nonce, request a new one\n\t\tconst cc = new SecurityCCNonceGet({\n\t\t\tnodeId: nodeId,\n\t\t\tendpointIndex: msg.command.endpointIndex,\n\t\t});\n\t\tconst nonceResp = yield* sendCommandGenerator<\n\t\t\tSecurityCCNonceReport\n\t\t>(\n\t\t\tdriver,\n\t\t\tctx,\n\t\t\tcc,\n\t\t\t(msg, result) => {\n\t\t\t\tadditionalTimeoutMs = Math.ceil(msg.rtt! / 1e6);\n\t\t\t\tonMessageSent(msg, result);\n\t\t\t},\n\t\t\t{\n\t\t\t\t// Only try getting a nonce once\n\t\t\t\tmaxSendAttempts: 1,\n\t\t\t},\n\t\t);\n\t\tif (!nonceResp) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"No nonce received from the node, cannot send secure command!\",\n\t\t\t\tZWaveErrorCodes.SecurityCC_NoNonce,\n\t\t\t);\n\t\t}\n\t\tnonce = nonceResp.nonce;\n\t}\n\tmsg.command.nonce = nonce;\n\n\t// Now send the actual secure command\n\treturn yield* simpleMessageGenerator(\n\t\tdriver,\n\t\tctx,\n\t\tmsg,\n\t\tonMessageSent,\n\t\tadditionalTimeoutMs,\n\t);\n};\n\n/** A message generator for security encapsulated messages (S2) */\nexport const secureMessageGeneratorS2: MessageGeneratorImplementation<\n\tSendDataMessage & ContainsCC\n> = async function*(driver, ctx, msg, onMessageSent) {\n\tif (!isSendData(msg) || !containsCC(msg)) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Cannot use the S2 message generator for a command that's not a SendData message!\",\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t} else if (typeof msg.command.nodeId !== \"number\") {\n\t\tthrow new ZWaveError(\n\t\t\t\"Cannot use the S2 message generator for multicast commands!\",\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t} else if (!(msg.command instanceof Security2CCMessageEncapsulation)) {\n\t\tthrow new ZWaveError(\n\t\t\t\"The S2 message generator can only be used for Security S2 command encapsulation!\",\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t}\n\n\tconst nodeId = msg.command.nodeId;\n\tconst secMan = driver.getSecurityManager2(nodeId)!;\n\tconst spanState = secMan.getSPANState(nodeId);\n\tlet additionalTimeoutMs: number | undefined;\n\n\t// We need a new nonce when there is no shared SPAN state, or the SPAN state is for a lower security class\n\t// than the command we want to send\n\tconst expectedSecurityClass = msg.command.securityClass\n\t\t?? driver.getHighestSecurityClass(nodeId);\n\n\tif (\n\t\tspanState.type === SPANState.None\n\t\t|| spanState.type === SPANState.LocalEI\n\t\t|| (spanState.type === SPANState.SPAN\n\t\t\t&& spanState.securityClass !== SecurityClass.Temporary\n\t\t\t&& spanState.securityClass !== expectedSecurityClass)\n\t) {\n\t\t// Request a new nonce\n\n\t\t// No free nonce, request a new one\n\t\tconst cc = new Security2CCNonceGet({\n\t\t\tnodeId: nodeId,\n\t\t\tendpointIndex: msg.command.endpointIndex,\n\t\t});\n\t\tconst nonceResp = yield* sendCommandGenerator<\n\t\t\tSecurity2CCNonceReport\n\t\t>(\n\t\t\tdriver,\n\t\t\tctx,\n\t\t\tcc,\n\t\t\t(msg, result) => {\n\t\t\t\tadditionalTimeoutMs = Math.ceil(msg.rtt! / 1e6);\n\t\t\t\tonMessageSent(msg, result);\n\t\t\t},\n\t\t\t{\n\t\t\t\t// Only try getting a nonce once\n\t\t\t\tmaxSendAttempts: 1,\n\t\t\t},\n\t\t);\n\t\tif (!nonceResp) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"No nonce received from the node, cannot send secure command!\",\n\t\t\t\tZWaveErrorCodes.Security2CC_NoSPAN,\n\t\t\t);\n\t\t}\n\n\t\t// Storing the nonce is not necessary, this will be done automatically when the nonce is received\n\t}\n\n\t// Now send the actual secure command\n\tlet response = yield* maybeTransportServiceGenerator(\n\t\tdriver,\n\t\tctx,\n\t\tmsg,\n\t\tonMessageSent,\n\t\tadditionalTimeoutMs,\n\t);\n\n\t// If we want to make sure that a node understood a SET-type S2-encapsulated message, we either need to use\n\t// Supervision and wait for the Supervision Report (handled by the simpleMessageGenerator), or we need to add a\n\t// short delay between commands and wait if a NonceReport is received.\n\t// However, in situations where timing is critical (e.g. S2 bootstrapping), verifyDelivery is set to false, and we don't do this.\n\tlet nonceReport: Security2CCNonceReport | undefined;\n\tif (\n\t\tisTransmitReport(response)\n\t\t&& msg.command.verifyDelivery\n\t\t&& !msg.command.expectsCCResponse()\n\t\t&& !msg.command.getEncapsulatedCC(\n\t\t\tCommandClasses.Supervision,\n\t\t\tSupervisionCommand.Get,\n\t\t)\n\t) {\n\t\tnonceReport = await driver\n\t\t\t.waitForCommand<Security2CCNonceReport>(\n\t\t\t\t(cc) =>\n\t\t\t\t\tcc.nodeId === nodeId\n\t\t\t\t\t&& cc instanceof Security2CCNonceReport,\n\t\t\t\t500,\n\t\t\t)\n\t\t\t.catch(() => undefined);\n\t} else if (\n\t\tcontainsCC(response)\n\t\t&& response.command instanceof Security2CCNonceReport\n\t) {\n\t\tnonceReport = response.command;\n\t}\n\n\tif (nonceReport) {\n\t\tif (nonceReport.SOS && nonceReport.receiverEI) {\n\t\t\t// The node couldn't decrypt the last command we sent it. Invalidate\n\t\t\t// the shared SPAN, since it did the same\n\t\t\tsecMan.storeRemoteEI(nodeId, nonceReport.receiverEI);\n\t\t}\n\t\tif (nonceReport.MOS) {\n\t\t\tconst multicastGroupId = msg.command.getMulticastGroupId();\n\t\t\tif (multicastGroupId != undefined) {\n\t\t\t\t// The node couldn't decrypt the previous S2 multicast. Tell it the MPAN (again)\n\t\t\t\tconst mpan = secMan.getInnerMPANState(multicastGroupId);\n\t\t\t\tif (mpan) {\n\t\t\t\t\t// Replace the MGRP extension with an MPAN extension\n\t\t\t\t\tmsg.command.extensions = msg.command.extensions.filter(\n\t\t\t\t\t\t(e) => !(e instanceof MGRPExtension),\n\t\t\t\t\t);\n\t\t\t\t\tmsg.command.extensions.push(\n\t\t\t\t\t\tnew MPANExtension({\n\t\t\t\t\t\t\tgroupId: multicastGroupId,\n\t\t\t\t\t\t\tinnerMPANState: mpan,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdriver.controllerLog.logNode(nodeId, {\n\t\t\tmessage:\n\t\t\t\t`failed to decode the message, retrying with SPAN extension...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\t// Send the message again\n\t\tmsg.prepareRetransmission();\n\t\tresponse = yield* maybeTransportServiceGenerator(\n\t\t\tdriver,\n\t\t\tctx,\n\t\t\tmsg,\n\t\t\tonMessageSent,\n\t\t\tadditionalTimeoutMs,\n\t\t);\n\n\t\tif (\n\t\t\tcontainsCC(response)\n\t\t\t&& response.command instanceof Security2CCNonceReport\n\t\t) {\n\t\t\t// No dice\n\t\t\tdriver.controllerLog.logNode(nodeId, {\n\t\t\t\tmessage:\n\t\t\t\t\t`failed to decode the message after re-transmission with SPAN extension, dropping the message.`,\n\t\t\t\tdirection: \"none\",\n\t\t\t\tlevel: \"warn\",\n\t\t\t});\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The node failed to decode the message.\",\n\t\t\t\tZWaveErrorCodes.Security2CC_CannotDecode,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn response;\n};\n\n/** A message generator for security encapsulated messages (S2 Multicast) */\nexport const secureMessageGeneratorS2Multicast: MessageGeneratorImplementation<\n\tSendDataMessage & ContainsCC\n> = async function*(driver, ctx, msg, onMessageSent) {\n\tif (!isSendData(msg) || !containsCC(msg)) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Cannot use the S2 multicast message generator for a command that's not a SendData message!\",\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t} else if (msg.command.isSinglecast()) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Cannot use the S2 multicast message generator for singlecast commands!\",\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t} else if (!(msg.command instanceof Security2CCMessageEncapsulation)) {\n\t\tthrow new ZWaveError(\n\t\t\t\"The S2 multicast message generator can only be used for Security S2 command encapsulation!\",\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t}\n\n\tconst groupId = msg.command.getMulticastGroupId();\n\tif (groupId == undefined) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Cannot use the S2 multicast message generator without a multicast group ID!\",\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t}\n\n\tconst secMan = driver.getSecurityManager2(msg.command.nodeId)!;\n\tconst group = secMan.getMulticastGroup(groupId);\n\tif (!group) {\n\t\tthrow new ZWaveError(\n\t\t\t`Multicast group ${groupId} does not exist!`,\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t}\n\n\t// Send the multicast command. We remember the transmit report and treat it as the result of the multicast command\n\tconst response = yield* simpleMessageGenerator(\n\t\tdriver,\n\t\tctx,\n\t\tmsg,\n\t\tonMessageSent,\n\t);\n\n\t// If a node in the group is out of sync, we need to transfer the MPAN state we're going to use for the next command.\n\t// Therefore increment the MPAN state now and not after the followups like the specs mention\n\tsecMan.tryIncrementMPAN(groupId);\n\n\t// Unwrap the command again, so we can make the following encapsulation depend on the target node\n\tdriver.unwrapCommands(msg);\n\tconst command = msg.command;\n\t// Remember the original encapsulation flags\n\tconst encapsulationFlags = command.encapsulationFlags;\n\n\t// In case someone sneaked a node ID into the group multiple times, remove duplicates for the singlecast followups\n\t// Otherwise, the node will increase its MPAN multiple times, going out of sync.\n\tconst distinctNodeIDs = [...new Set(group.nodeIDs)];\n\n\tconst supervisionResults: (SupervisionResult | undefined)[] = [];\n\n\t// Now do singlecast followups with every node in the group\n\tfor (const nodeId of distinctNodeIDs) {\n\t\t// Point the CC at the target node\n\t\t(command.nodeId as number) = nodeId;\n\t\t// Figure out if supervision should be used\n\t\tcommand.encapsulationFlags = encapsulationFlags;\n\t\tcommand.toggleEncapsulationFlag(\n\t\t\tEncapsulationFlags.Supervision,\n\t\t\tSupervisionCC.mayUseSupervision(driver, command),\n\t\t);\n\n\t\tconst scMsg = driver.createSendDataMessage(command, {\n\t\t\ttransmitOptions: msg.transmitOptions,\n\t\t\tmaxSendAttempts: msg.maxSendAttempts,\n\t\t});\n\t\t// The outermost command is a Security2CCMessageEncapsulation, we need to set the MGRP extension on this again\n\t\t(scMsg.command as Security2CCMessageEncapsulation).extensions.push(\n\t\t\tnew MGRPExtension({ groupId }),\n\t\t);\n\n\t\t// Reuse the S2 singlecast message generator for sending this new message\n\t\ttry {\n\t\t\tconst scResponse = yield* secureMessageGeneratorS2(\n\t\t\t\tdriver,\n\t\t\t\tctx,\n\t\t\t\tscMsg,\n\t\t\t\tonMessageSent,\n\t\t\t);\n\t\t\tif (\n\t\t\t\tcontainsCC(scResponse)\n\t\t\t\t&& scResponse.command\n\t\t\t\t\tinstanceof Security2CCMessageEncapsulation\n\t\t\t\t&& scResponse.command.hasMOSExtension()\n\t\t\t) {\n\t\t\t\t// The node understood the S2 singlecast followup, but told us that its MPAN is out of sync\n\n\t\t\t\tconst innerMPANState = secMan.getInnerMPANState(groupId);\n\t\t\t\t// This should always be defined, but better not throw unnecessarily here\n\t\t\t\tif (innerMPANState) {\n\t\t\t\t\tconst cc = new Security2CCMessageEncapsulation({\n\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\textensions: [\n\t\t\t\t\t\t\tnew MPANExtension({\n\t\t\t\t\t\t\t\tgroupId,\n\t\t\t\t\t\t\t\tinnerMPANState,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\t// Send it the MPAN\n\t\t\t\t\tyield* sendCommandGenerator(\n\t\t\t\t\t\tdriver,\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tcc,\n\t\t\t\t\t\tonMessageSent,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Seems we need these options or some nodes won't accept the nonce\n\t\t\t\t\t\t\ttransmitOptions: TransmitOptions.ACK\n\t\t\t\t\t\t\t\t| TransmitOptions.AutoRoute,\n\t\t\t\t\t\t\t// Only try sending a nonce once\n\t\t\t\t\t\t\tmaxSendAttempts: 1,\n\t\t\t\t\t\t\t// Nonce requests must be handled immediately\n\t\t\t\t\t\t\tpriority: MessagePriority.Immediate,\n\t\t\t\t\t\t\t// We don't want failures causing us to treat the node as asleep or dead\n\t\t\t\t\t\t\tchangeNodeStatusOnMissingACK: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Collect supervision results if possible\n\t\t\tif (containsCC(scResponse)) {\n\t\t\t\tconst supervisionReport = scResponse.command\n\t\t\t\t\t.getEncapsulatedCC(\n\t\t\t\t\t\tCommandClasses.Supervision,\n\t\t\t\t\t\tSupervisionCommand.Report,\n\t\t\t\t\t) as SupervisionCCReport | undefined;\n\n\t\t\t\tsupervisionResults.push(\n\t\t\t\t\tsupervisionReport?.toSupervisionResult(),\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tdriver.driverLog.print(getErrorMessage(e), \"error\");\n\t\t\t// TODO: Figure out how we got here, and what to do now.\n\t\t\t// In any case, keep going with the next nodes\n\t\t\t// Report that there was a failure, so the application can show it\n\t\t\tsupervisionResults.push({\n\t\t\t\tstatus: SupervisionStatus.Fail,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst finalSupervisionResult = mergeSupervisionResults(\n\t\tsupervisionResults,\n\t);\n\tif (finalSupervisionResult) {\n\t\t// We can return return information about the success of this multicast - so we should\n\t\t// TODO: Not sure if we need to \"wrap\" the response for something. For now, try faking it\n\t\tconst cc = new SupervisionCCReport({\n\t\t\tnodeId: NODE_ID_BROADCAST,\n\t\t\tsessionId: 0, // fake\n\t\t\tmoreUpdatesFollow: false, // fake\n\t\t\t...(finalSupervisionResult as any),\n\t\t});\n\t\tconst ret = new (driver.getSendDataSinglecastConstructor())({\n\t\t\tsourceNodeId: driver.ownNodeId,\n\t\t\tcommand: cc,\n\t\t});\n\t\treturn ret;\n\t} else {\n\t\treturn response;\n\t}\n};\n\nexport function createMessageGenerator<TResponse extends Message = Message>(\n\tdriver: Driver,\n\tctx: CCEncodingContext,\n\tmsg: Message,\n\tonMessageSent: (msg: Message, result: Message | undefined) => void,\n): {\n\tgenerator: MessageGenerator;\n\tresultPromise: DeferredPromise<TResponse>;\n} {\n\tconst resultPromise = createDeferredPromise<TResponse>();\n\n\tconst generator: MessageGenerator = {\n\t\tparent: undefined as any, // The transaction will set this field on creation\n\t\tcurrent: undefined,\n\t\tself: undefined,\n\t\treset: () => {\n\t\t\tgenerator.current = undefined;\n\t\t\tgenerator.self = undefined;\n\t\t},\n\t\tstart: () => {\n\t\t\tasync function* gen() {\n\t\t\t\t// Determine which message generator implementation should be used\n\t\t\t\tlet implementation: MessageGeneratorImplementation<Message> =\n\t\t\t\t\tsimpleMessageGenerator;\n\t\t\t\tif (isSendData(msg)) {\n\t\t\t\t\tif (!containsCC(msg)) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t\"Cannot create a message generator for a message that doesn't contain a command class\",\n\t\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tmsg.command instanceof Security2CCMessageEncapsulation\n\t\t\t\t\t) {\n\t\t\t\t\t\timplementation = (\n\t\t\t\t\t\t\tmsg.command.isSinglecast()\n\t\t\t\t\t\t\t\t? secureMessageGeneratorS2\n\t\t\t\t\t\t\t\t: secureMessageGeneratorS2Multicast\n\t\t\t\t\t\t) as MessageGeneratorImplementation<Message>;\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tmsg.command instanceof SecurityCCCommandEncapsulation\n\t\t\t\t\t) {\n\t\t\t\t\t\timplementation =\n\t\t\t\t\t\t\tsecureMessageGeneratorS0 as MessageGeneratorImplementation<\n\t\t\t\t\t\t\t\tMessage\n\t\t\t\t\t\t\t>;\n\t\t\t\t\t} else if (msg.command.isSinglecast()) {\n\t\t\t\t\t\timplementation =\n\t\t\t\t\t\t\tmaybeTransportServiceGenerator as MessageGeneratorImplementation<\n\t\t\t\t\t\t\t\tMessage\n\t\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Step through the generator so we can easily cancel it and don't\n\t\t\t\t// accidentally forget to unset this.current at the end\n\t\t\t\tconst gen = implementation(driver, ctx, msg, onMessageSent);\n\t\t\t\tlet sendResult: Message | undefined;\n\t\t\t\tlet result: Message | undefined;\n\t\t\t\twhile (true) {\n\t\t\t\t\t// This call passes the previous send result (if it exists already) to the generator and saves the\n\t\t\t\t\t// generated or returned message in `value`. When `done` is true, `value` contains the returned result of the message generator\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { value, done } = await gen.next(sendResult!);\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\tresult = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Pass the generated message to the driver and remember the result for the next iteration\n\t\t\t\t\t\tgenerator.current = value;\n\t\t\t\t\t\tsendResult = yield generator.current;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\t// There was an actual error, reject the transaction\n\t\t\t\t\t\t\tresultPromise.reject(e);\n\t\t\t\t\t\t} else if (isTransmitReport(e) && !e.isOK()) {\n\t\t\t\t\t\t\t// The generator was prematurely ended by throwing a NOK transmit report.\n\t\t\t\t\t\t\t// The driver may want to retry it, so reset the generator\n\t\t\t\t\t\t\tgenerator.reset();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// The generator was prematurely ended by throwing a Message\n\t\t\t\t\t\t\tresultPromise.resolve(e as TResponse);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresultPromise.resolve(result as TResponse);\n\t\t\t\tgenerator.reset();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tgenerator.self = gen();\n\t\t\treturn generator.self;\n\t\t},\n\t};\n\treturn { resultPromise, generator };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_serialapi", "fail", "cc", "msg", "gen"]
|
|
7
7
|
}
|
|
@@ -5,6 +5,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
8
9
|
var __export = (target, all) => {
|
|
9
10
|
for (var name in all)
|
|
10
11
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -45,13 +46,13 @@ var import_Types = require("../node/_Types.js");
|
|
|
45
46
|
const cacheKeys = {
|
|
46
47
|
controller: {
|
|
47
48
|
provisioningList: "controller.provisioningList",
|
|
48
|
-
associations: (groupId) => `controller.associations.${groupId}`,
|
|
49
|
-
securityKeys: (secClass) => `controller.securityKeys.${(0, import_shared.getEnumMemberName)(import_core.SecurityClass, secClass)}`,
|
|
50
|
-
securityKeysLongRange: (secClass) => `controller.securityKeyLongRange.${(0, import_shared.getEnumMemberName)(import_core.SecurityClass, secClass)}`,
|
|
49
|
+
associations: /* @__PURE__ */ __name((groupId) => `controller.associations.${groupId}`, "associations"),
|
|
50
|
+
securityKeys: /* @__PURE__ */ __name((secClass) => `controller.securityKeys.${(0, import_shared.getEnumMemberName)(import_core.SecurityClass, secClass)}`, "securityKeys"),
|
|
51
|
+
securityKeysLongRange: /* @__PURE__ */ __name((secClass) => `controller.securityKeyLongRange.${(0, import_shared.getEnumMemberName)(import_core.SecurityClass, secClass)}`, "securityKeysLongRange"),
|
|
51
52
|
privateKey: "controller.privateKey"
|
|
52
53
|
},
|
|
53
54
|
// TODO: somehow these functions should be combined with the pattern matching below
|
|
54
|
-
node: (nodeId) => {
|
|
55
|
+
node: /* @__PURE__ */ __name((nodeId) => {
|
|
55
56
|
const nodeBaseKey = `node.${nodeId}.`;
|
|
56
57
|
return {
|
|
57
58
|
_baseKey: nodeBaseKey,
|
|
@@ -67,64 +68,65 @@ const cacheKeys = {
|
|
|
67
68
|
nodeType: `${nodeBaseKey}nodeType`,
|
|
68
69
|
supportsSecurity: `${nodeBaseKey}supportsSecurity`,
|
|
69
70
|
supportsBeaming: `${nodeBaseKey}supportsBeaming`,
|
|
70
|
-
securityClass: (secClass) => `${nodeBaseKey}securityClasses.${(0, import_shared.getEnumMemberName)(import_core.SecurityClass, secClass)}`,
|
|
71
|
+
securityClass: /* @__PURE__ */ __name((secClass) => `${nodeBaseKey}securityClasses.${(0, import_shared.getEnumMemberName)(import_core.SecurityClass, secClass)}`, "securityClass"),
|
|
71
72
|
dsk: `${nodeBaseKey}dsk`,
|
|
72
|
-
endpoint: (index) => {
|
|
73
|
+
endpoint: /* @__PURE__ */ __name((index) => {
|
|
73
74
|
const endpointBaseKey = `${nodeBaseKey}endpoint.${index}.`;
|
|
74
75
|
const ccBaseKey = `${endpointBaseKey}commandClass.`;
|
|
75
76
|
return {
|
|
76
77
|
_baseKey: endpointBaseKey,
|
|
77
78
|
_ccBaseKey: ccBaseKey,
|
|
78
|
-
commandClass: (ccId) => {
|
|
79
|
+
commandClass: /* @__PURE__ */ __name((ccId) => {
|
|
79
80
|
const ccAsHex = (0, import_shared.num2hex)(ccId);
|
|
80
81
|
return `${ccBaseKey}${ccAsHex}`;
|
|
81
|
-
}
|
|
82
|
+
}, "commandClass")
|
|
82
83
|
};
|
|
83
|
-
},
|
|
84
|
+
}, "endpoint"),
|
|
84
85
|
hasSUCReturnRoute: `${nodeBaseKey}hasSUCReturnRoute`,
|
|
85
|
-
priorityReturnRoute: (destinationNodeId) => `${nodeBaseKey}priorityReturnRoute.${destinationNodeId}`,
|
|
86
|
+
priorityReturnRoute: /* @__PURE__ */ __name((destinationNodeId) => `${nodeBaseKey}priorityReturnRoute.${destinationNodeId}`, "priorityReturnRoute"),
|
|
86
87
|
prioritySUCReturnRoute: `${nodeBaseKey}priorityReturnRoute.SUC`,
|
|
87
|
-
customReturnRoutes: (destinationNodeId) => `${nodeBaseKey}customReturnRoutes.${destinationNodeId}`,
|
|
88
|
+
customReturnRoutes: /* @__PURE__ */ __name((destinationNodeId) => `${nodeBaseKey}customReturnRoutes.${destinationNodeId}`, "customReturnRoutes"),
|
|
88
89
|
customSUCReturnRoutes: `${nodeBaseKey}customReturnRoutes.SUC`,
|
|
89
90
|
defaultTransitionDuration: `${nodeBaseKey}defaultTransitionDuration`,
|
|
90
91
|
defaultVolume: `${nodeBaseKey}defaultVolume`,
|
|
91
92
|
lastSeen: `${nodeBaseKey}lastSeen`,
|
|
92
93
|
deviceConfigHash: `${nodeBaseKey}deviceConfigHash`
|
|
93
94
|
};
|
|
94
|
-
}
|
|
95
|
+
}, "node")
|
|
95
96
|
};
|
|
96
97
|
const cacheKeyUtils = {
|
|
97
|
-
nodeIdFromKey: (key) => {
|
|
98
|
+
nodeIdFromKey: /* @__PURE__ */ __name((key) => {
|
|
98
99
|
const match = /^node\.(?<nodeId>\d+)\./.exec(key);
|
|
99
100
|
if (match) {
|
|
100
101
|
return parseInt(match.groups.nodeId, 10);
|
|
101
102
|
}
|
|
102
|
-
},
|
|
103
|
-
nodePropertyFromKey: (key) => {
|
|
103
|
+
}, "nodeIdFromKey"),
|
|
104
|
+
nodePropertyFromKey: /* @__PURE__ */ __name((key) => {
|
|
104
105
|
const match = /^node\.\d+\.(?<property>[^\.]+)$/.exec(key);
|
|
105
106
|
return match?.groups?.property;
|
|
106
|
-
},
|
|
107
|
-
isEndpointKey: (key) => {
|
|
107
|
+
}, "nodePropertyFromKey"),
|
|
108
|
+
isEndpointKey: /* @__PURE__ */ __name((key) => {
|
|
108
109
|
return /endpoints\.(?<index>\d+)$/.test(key);
|
|
109
|
-
},
|
|
110
|
-
endpointIndexFromKey: (key) => {
|
|
110
|
+
}, "isEndpointKey"),
|
|
111
|
+
endpointIndexFromKey: /* @__PURE__ */ __name((key) => {
|
|
111
112
|
const match = /endpoints\.(?<index>\d+)$/.exec(key);
|
|
112
113
|
if (match) {
|
|
113
114
|
return parseInt(match.groups.index, 10);
|
|
114
115
|
}
|
|
115
|
-
},
|
|
116
|
-
destinationFromPriorityReturnRouteKey: (key) => {
|
|
116
|
+
}, "endpointIndexFromKey"),
|
|
117
|
+
destinationFromPriorityReturnRouteKey: /* @__PURE__ */ __name((key) => {
|
|
117
118
|
const match = /\.priorityReturnRoute\.(?<nodeId>\d+)$/.exec(key);
|
|
118
119
|
if (match) {
|
|
119
120
|
return parseInt(match.groups.nodeId, 10);
|
|
120
121
|
}
|
|
121
|
-
}
|
|
122
|
+
}, "destinationFromPriorityReturnRouteKey")
|
|
122
123
|
};
|
|
123
124
|
function tryParseInterviewStage(value) {
|
|
124
125
|
if ((typeof value === "string" || typeof value === "number") && value in import_Types.InterviewStage) {
|
|
125
126
|
return typeof value === "number" ? value : import_Types.InterviewStage[value];
|
|
126
127
|
}
|
|
127
128
|
}
|
|
129
|
+
__name(tryParseInterviewStage, "tryParseInterviewStage");
|
|
128
130
|
function tryParseDeviceClass(value) {
|
|
129
131
|
if ((0, import_typeguards.isObject)(value)) {
|
|
130
132
|
const { basic, generic, specific } = value;
|
|
@@ -133,6 +135,7 @@ function tryParseDeviceClass(value) {
|
|
|
133
135
|
}
|
|
134
136
|
}
|
|
135
137
|
}
|
|
138
|
+
__name(tryParseDeviceClass, "tryParseDeviceClass");
|
|
136
139
|
function tryParseSecurityClasses(value) {
|
|
137
140
|
if ((0, import_typeguards.isObject)(value)) {
|
|
138
141
|
const ret = /* @__PURE__ */ new Map();
|
|
@@ -144,11 +147,13 @@ function tryParseSecurityClasses(value) {
|
|
|
144
147
|
return ret;
|
|
145
148
|
}
|
|
146
149
|
}
|
|
150
|
+
__name(tryParseSecurityClasses, "tryParseSecurityClasses");
|
|
147
151
|
function tryParseNodeType(value) {
|
|
148
152
|
if (typeof value === "string" && value in import_core.NodeType) {
|
|
149
153
|
return import_core.NodeType[value];
|
|
150
154
|
}
|
|
151
155
|
}
|
|
156
|
+
__name(tryParseNodeType, "tryParseNodeType");
|
|
152
157
|
function tryParseProvisioningList(value) {
|
|
153
158
|
const ret = [];
|
|
154
159
|
if (!(0, import_typeguards.isArray)(value))
|
|
@@ -181,6 +186,7 @@ function tryParseProvisioningList(value) {
|
|
|
181
186
|
}
|
|
182
187
|
return ret;
|
|
183
188
|
}
|
|
189
|
+
__name(tryParseProvisioningList, "tryParseProvisioningList");
|
|
184
190
|
function isSerializedSecurityClass(value) {
|
|
185
191
|
if (typeof value === "number" && value in import_core.SecurityClass)
|
|
186
192
|
return true;
|
|
@@ -194,6 +200,7 @@ function isSerializedSecurityClass(value) {
|
|
|
194
200
|
}
|
|
195
201
|
return false;
|
|
196
202
|
}
|
|
203
|
+
__name(isSerializedSecurityClass, "isSerializedSecurityClass");
|
|
197
204
|
function tryParseSerializedSecurityClass(value) {
|
|
198
205
|
if (typeof value === "number" && value in import_core.SecurityClass)
|
|
199
206
|
return value;
|
|
@@ -206,14 +213,17 @@ function tryParseSerializedSecurityClass(value) {
|
|
|
206
213
|
}
|
|
207
214
|
}
|
|
208
215
|
}
|
|
216
|
+
__name(tryParseSerializedSecurityClass, "tryParseSerializedSecurityClass");
|
|
209
217
|
function isSerializedProvisioningEntryStatus(s) {
|
|
210
218
|
return typeof s === "string" && s in import_Inclusion.ProvisioningEntryStatus && typeof import_Inclusion.ProvisioningEntryStatus[s] === "number";
|
|
211
219
|
}
|
|
220
|
+
__name(isSerializedProvisioningEntryStatus, "isSerializedProvisioningEntryStatus");
|
|
212
221
|
function isSerializedProtocol(s) {
|
|
213
222
|
if (typeof s === "number" && s in import_core.Protocols)
|
|
214
223
|
return true;
|
|
215
224
|
return typeof s === "string" && s in import_core.Protocols && typeof import_core.Protocols[s] === "number";
|
|
216
225
|
}
|
|
226
|
+
__name(isSerializedProtocol, "isSerializedProtocol");
|
|
217
227
|
function tryParseSerializedProtocol(value) {
|
|
218
228
|
if (typeof value === "number" && value in import_core.Protocols)
|
|
219
229
|
return value;
|
|
@@ -223,6 +233,7 @@ function tryParseSerializedProtocol(value) {
|
|
|
223
233
|
}
|
|
224
234
|
}
|
|
225
235
|
}
|
|
236
|
+
__name(tryParseSerializedProtocol, "tryParseSerializedProtocol");
|
|
226
237
|
function tryParseDate(value) {
|
|
227
238
|
if (typeof value === "number") {
|
|
228
239
|
const ret = new Date(value);
|
|
@@ -230,6 +241,7 @@ function tryParseDate(value) {
|
|
|
230
241
|
return ret;
|
|
231
242
|
}
|
|
232
243
|
}
|
|
244
|
+
__name(tryParseDate, "tryParseDate");
|
|
233
245
|
function tryParseAssociationAddress(value) {
|
|
234
246
|
if ((0, import_typeguards.isObject)(value)) {
|
|
235
247
|
const { nodeId, endpoint } = value;
|
|
@@ -240,6 +252,7 @@ function tryParseAssociationAddress(value) {
|
|
|
240
252
|
return { nodeId, endpoint };
|
|
241
253
|
}
|
|
242
254
|
}
|
|
255
|
+
__name(tryParseAssociationAddress, "tryParseAssociationAddress");
|
|
243
256
|
function tryParseBuffer(value) {
|
|
244
257
|
if (typeof value === "string") {
|
|
245
258
|
try {
|
|
@@ -248,15 +261,18 @@ function tryParseBuffer(value) {
|
|
|
248
261
|
}
|
|
249
262
|
}
|
|
250
263
|
}
|
|
264
|
+
__name(tryParseBuffer, "tryParseBuffer");
|
|
251
265
|
function deserializeNetworkCacheValue(key, value) {
|
|
252
266
|
function ensureType(value2, type) {
|
|
253
267
|
if (typeof value2 === type)
|
|
254
268
|
return value2;
|
|
255
269
|
throw new import_core.ZWaveError(`Incorrect type ${typeof value2} for property "${key}"`, import_core.ZWaveErrorCodes.Driver_InvalidCache);
|
|
256
270
|
}
|
|
271
|
+
__name(ensureType, "ensureType");
|
|
257
272
|
function fail() {
|
|
258
273
|
throw new import_core.ZWaveError(`Failed to deserialize property "${key}"`, import_core.ZWaveErrorCodes.Driver_InvalidCache);
|
|
259
274
|
}
|
|
275
|
+
__name(fail, "fail");
|
|
260
276
|
switch (cacheKeyUtils.nodePropertyFromKey(key)) {
|
|
261
277
|
case "interviewStage": {
|
|
262
278
|
value = tryParseInterviewStage(value);
|
|
@@ -354,6 +370,7 @@ function deserializeNetworkCacheValue(key, value) {
|
|
|
354
370
|
}
|
|
355
371
|
return value;
|
|
356
372
|
}
|
|
373
|
+
__name(deserializeNetworkCacheValue, "deserializeNetworkCacheValue");
|
|
357
374
|
function serializeNetworkCacheValue(key, value) {
|
|
358
375
|
switch (cacheKeyUtils.nodePropertyFromKey(key)) {
|
|
359
376
|
case "interviewStage": {
|
|
@@ -420,6 +437,7 @@ function serializeNetworkCacheValue(key, value) {
|
|
|
420
437
|
}
|
|
421
438
|
return value;
|
|
422
439
|
}
|
|
440
|
+
__name(serializeNetworkCacheValue, "serializeNetworkCacheValue");
|
|
423
441
|
const legacyPaths = {
|
|
424
442
|
// These seem to duplicate the ones in cacheKeys, but this allows us to change
|
|
425
443
|
// something in the future without breaking migration
|
|
@@ -444,7 +462,7 @@ const legacyPaths = {
|
|
|
444
462
|
commandClass: {
|
|
445
463
|
// These are relative to the commandClasses object
|
|
446
464
|
name: `name`,
|
|
447
|
-
endpoint: (index) => `endpoints.${index}
|
|
465
|
+
endpoint: /* @__PURE__ */ __name((index) => `endpoints.${index}`, "endpoint")
|
|
448
466
|
}
|
|
449
467
|
};
|
|
450
468
|
async function migrateLegacyNetworkCache(homeId, networkCache, valueDB, storageDriver, cacheDir) {
|
|
@@ -460,6 +478,7 @@ async function migrateLegacyNetworkCache(homeId, networkCache, valueDB, storageD
|
|
|
460
478
|
if (val != void 0)
|
|
461
479
|
jsonl.set(targetKey, val);
|
|
462
480
|
}
|
|
481
|
+
__name(tryMigrate, "tryMigrate");
|
|
463
482
|
tryMigrate(cacheKeys.controller.provisioningList, legacy, legacyPaths.controller.provisioningList, tryParseProvisioningList);
|
|
464
483
|
if ((0, import_typeguards.isObject)(legacy.nodes)) {
|
|
465
484
|
for (const node of Object.values(legacy.nodes)) {
|
|
@@ -509,6 +528,7 @@ async function migrateLegacyNetworkCache(homeId, networkCache, valueDB, storageD
|
|
|
509
528
|
}
|
|
510
529
|
}
|
|
511
530
|
}
|
|
531
|
+
__name(migrateLegacyNetworkCache, "migrateLegacyNetworkCache");
|
|
512
532
|
// Annotate the CommonJS export names for ESM import in node:
|
|
513
533
|
0 && (module.exports = {
|
|
514
534
|
cacheKeyUtils,
|