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.
Files changed (122) hide show
  1. package/build/cjs/lib/_version.d.ts +1 -1
  2. package/build/cjs/lib/_version.js +1 -1
  3. package/build/cjs/lib/_version.js.map +1 -1
  4. package/build/cjs/lib/controller/Controller.js +66 -60
  5. package/build/cjs/lib/controller/Controller.js.map +1 -1
  6. package/build/cjs/lib/controller/ControllerStatistics.js +4 -0
  7. package/build/cjs/lib/controller/ControllerStatistics.js.map +1 -1
  8. package/build/cjs/lib/controller/FirmwareUpdateService.js +8 -0
  9. package/build/cjs/lib/controller/FirmwareUpdateService.js.map +1 -1
  10. package/build/cjs/lib/controller/MockControllerBehaviors.js +3 -0
  11. package/build/cjs/lib/controller/MockControllerBehaviors.js.map +1 -1
  12. package/build/cjs/lib/controller/NVMIO.js +7 -0
  13. package/build/cjs/lib/controller/NVMIO.js.map +1 -1
  14. package/build/cjs/lib/controller/NodeInformationFrame.js +2 -0
  15. package/build/cjs/lib/controller/NodeInformationFrame.js.map +1 -1
  16. package/build/cjs/lib/controller/ZWaveSDKVersions.js +3 -0
  17. package/build/cjs/lib/controller/ZWaveSDKVersions.js.map +1 -1
  18. package/build/cjs/lib/controller/utils.js +4 -0
  19. package/build/cjs/lib/controller/utils.js.map +1 -1
  20. package/build/cjs/lib/driver/Bootloader.js +4 -0
  21. package/build/cjs/lib/driver/Bootloader.js.map +1 -1
  22. package/build/cjs/lib/driver/Driver.js +63 -56
  23. package/build/cjs/lib/driver/Driver.js.map +1 -1
  24. package/build/cjs/lib/driver/DriverMock.js +6 -3
  25. package/build/cjs/lib/driver/DriverMock.js.map +1 -1
  26. package/build/cjs/lib/driver/MessageGenerators.js +26 -18
  27. package/build/cjs/lib/driver/MessageGenerators.js.map +1 -1
  28. package/build/cjs/lib/driver/NetworkCache.js +43 -23
  29. package/build/cjs/lib/driver/NetworkCache.js.map +1 -1
  30. package/build/cjs/lib/driver/Queue.js +6 -2
  31. package/build/cjs/lib/driver/Queue.js.map +1 -1
  32. package/build/cjs/lib/driver/SerialAPICommandMachine.js +45 -40
  33. package/build/cjs/lib/driver/SerialAPICommandMachine.js.map +1 -1
  34. package/build/cjs/lib/driver/StateMachineShared.js +5 -0
  35. package/build/cjs/lib/driver/StateMachineShared.js.map +1 -1
  36. package/build/cjs/lib/driver/Statistics.js +4 -0
  37. package/build/cjs/lib/driver/Statistics.js.map +1 -1
  38. package/build/cjs/lib/driver/Task.js +9 -2
  39. package/build/cjs/lib/driver/Task.js.map +1 -1
  40. package/build/cjs/lib/driver/Transaction.js +8 -4
  41. package/build/cjs/lib/driver/Transaction.js.map +1 -1
  42. package/build/cjs/lib/driver/TransportServiceMachine.js +9 -7
  43. package/build/cjs/lib/driver/TransportServiceMachine.js.map +1 -1
  44. package/build/cjs/lib/driver/UpdateConfig.js +8 -4
  45. package/build/cjs/lib/driver/UpdateConfig.js.map +1 -1
  46. package/build/cjs/lib/driver/UserAgent.js +4 -0
  47. package/build/cjs/lib/driver/UserAgent.js.map +1 -1
  48. package/build/cjs/lib/driver/mDNSDiscovery.js +2 -0
  49. package/build/cjs/lib/driver/mDNSDiscovery.js.map +1 -1
  50. package/build/cjs/lib/log/Driver.js +6 -2
  51. package/build/cjs/lib/log/Driver.js.map +1 -1
  52. package/build/cjs/lib/log/Zniffer.js +6 -2
  53. package/build/cjs/lib/log/Zniffer.js.map +1 -1
  54. package/build/cjs/lib/node/DeviceClass.js +4 -0
  55. package/build/cjs/lib/node/DeviceClass.js.map +1 -1
  56. package/build/cjs/lib/node/Endpoint.js +9 -5
  57. package/build/cjs/lib/node/Endpoint.js.map +1 -1
  58. package/build/cjs/lib/node/HealthCheck.js +6 -0
  59. package/build/cjs/lib/node/HealthCheck.js.map +1 -1
  60. package/build/cjs/lib/node/MockNodeBehaviors.js +2 -0
  61. package/build/cjs/lib/node/MockNodeBehaviors.js.map +1 -1
  62. package/build/cjs/lib/node/MultiCCAPIWrapper.js +10 -8
  63. package/build/cjs/lib/node/MultiCCAPIWrapper.js.map +1 -1
  64. package/build/cjs/lib/node/Node.js +51 -46
  65. package/build/cjs/lib/node/Node.js.map +1 -1
  66. package/build/cjs/lib/node/NodeReadyMachine.js +3 -1
  67. package/build/cjs/lib/node/NodeReadyMachine.js.map +1 -1
  68. package/build/cjs/lib/node/NodeStatistics.js +5 -0
  69. package/build/cjs/lib/node/NodeStatistics.js.map +1 -1
  70. package/build/cjs/lib/node/NodeStatusMachine.js +5 -2
  71. package/build/cjs/lib/node/NodeStatusMachine.js.map +1 -1
  72. package/build/cjs/lib/node/VirtualEndpoint.js +8 -4
  73. package/build/cjs/lib/node/VirtualEndpoint.js.map +1 -1
  74. package/build/cjs/lib/node/VirtualNode.js +7 -2
  75. package/build/cjs/lib/node/VirtualNode.js.map +1 -1
  76. package/build/cjs/lib/node/mixins/00_Base.js +4 -0
  77. package/build/cjs/lib/node/mixins/00_Base.js.map +1 -1
  78. package/build/cjs/lib/node/mixins/01_NetworkRole.js +4 -0
  79. package/build/cjs/lib/node/mixins/01_NetworkRole.js.map +1 -1
  80. package/build/cjs/lib/node/mixins/05_Security.js +7 -3
  81. package/build/cjs/lib/node/mixins/05_Security.js.map +1 -1
  82. package/build/cjs/lib/node/mixins/10_Events.js +4 -0
  83. package/build/cjs/lib/node/mixins/10_Events.js.map +1 -1
  84. package/build/cjs/lib/node/mixins/20_Status.js +4 -0
  85. package/build/cjs/lib/node/mixins/20_Status.js.map +1 -1
  86. package/build/cjs/lib/node/mixins/30_Wakeup.js +4 -0
  87. package/build/cjs/lib/node/mixins/30_Wakeup.js.map +1 -1
  88. package/build/cjs/lib/node/mixins/40_Values.js +4 -0
  89. package/build/cjs/lib/node/mixins/40_Values.js.map +1 -1
  90. package/build/cjs/lib/node/mixins/50_Endpoints.js +4 -0
  91. package/build/cjs/lib/node/mixins/50_Endpoints.js.map +1 -1
  92. package/build/cjs/lib/node/mixins/60_ScheduledPoll.js +4 -0
  93. package/build/cjs/lib/node/mixins/60_ScheduledPoll.js.map +1 -1
  94. package/build/cjs/lib/node/mixins/70_FirmwareUpdate.js +8 -3
  95. package/build/cjs/lib/node/mixins/70_FirmwareUpdate.js.map +1 -1
  96. package/build/cjs/lib/node/mixins/index.js +4 -0
  97. package/build/cjs/lib/node/mixins/index.js.map +1 -1
  98. package/build/cjs/lib/node/mockCCBehaviors/ColorSwitch.js +2 -1
  99. package/build/cjs/lib/node/mockCCBehaviors/ColorSwitch.js.map +1 -1
  100. package/build/cjs/lib/node/mockCCBehaviors/Configuration.js +2 -1
  101. package/build/cjs/lib/node/mockCCBehaviors/Configuration.js.map +1 -1
  102. package/build/cjs/lib/node/mockCCBehaviors/ScheduleEntryLock.js +2 -1
  103. package/build/cjs/lib/node/mockCCBehaviors/ScheduleEntryLock.js.map +1 -1
  104. package/build/cjs/lib/node/mockCCBehaviors/ThermostatSetpoint.js +3 -2
  105. package/build/cjs/lib/node/mockCCBehaviors/ThermostatSetpoint.js.map +1 -1
  106. package/build/cjs/lib/node/mockCCBehaviors/UserCode.js +3 -2
  107. package/build/cjs/lib/node/mockCCBehaviors/UserCode.js.map +1 -1
  108. package/build/cjs/lib/node/utils.js +22 -2
  109. package/build/cjs/lib/node/utils.js.map +1 -1
  110. package/build/cjs/lib/telemetry/deviceConfig.js +2 -0
  111. package/build/cjs/lib/telemetry/deviceConfig.js.map +1 -1
  112. package/build/cjs/lib/telemetry/statistics.js +3 -0
  113. package/build/cjs/lib/telemetry/statistics.js.map +1 -1
  114. package/build/cjs/lib/zniffer/MPDU.js +57 -0
  115. package/build/cjs/lib/zniffer/MPDU.js.map +1 -1
  116. package/build/cjs/lib/zniffer/Zniffer.js +10 -3
  117. package/build/cjs/lib/zniffer/Zniffer.js.map +1 -1
  118. package/build/cjs/mockServer.js +14 -0
  119. package/build/cjs/mockServer.js.map +1 -1
  120. package/build/esm/lib/_version.d.ts +1 -1
  121. package/build/esm/lib/_version.js +1 -1
  122. 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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;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,CACxB,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,MAAM,gBAAgB,QAAO;OAC9C;AAED,aAAO;IACR;AAGA,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;AAiCA,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;",
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
- const simpleMessageGenerator = async function* (driver, ctx, msg, onMessageSent, additionalCommandTimeoutMs = 0) {
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
- const secureMessageGeneratorS0 = async function* (driver, ctx, msg, onMessageSent) {
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": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;AAAA,gBAWO;AACP,wBAIO;AACP,gCAUO;AACP,kBAcO;AAGP,uBAIO;AACP,IAAAA,oBAA4C;AAC5C,oBAAgC;AAChC,mBAAqB;AACrB,8BAGO;AAmBP,SAAS,uBAAuB,MAAe,UAAiB;AAG/D,MAAI,KAAC,8BAAW,IAAI,KAAK,KAAC,8BAAW,QAAQ,GAAG;AAC/C,WAAO;EACR;AAEA,MAAI,KAAK,UAAS,MAAO,SAAS,UAAS;AAAI,WAAO;AAEtD,MAAI,SAAS,QAAQ,SAAS,2BAAe,mBAAmB,GAAG;AAElE,WAAO;EACR;AAKA,QAAM,kBAAc,oCAAyB,KAAK,OAAO;AACzD,QAAM,sBAAkB,oCAAyB,SAAS,OAAO;AACjE,SAAO,YAAY,qBAAqB,eAAe;AACxD;AAEA,eAAsB,kBACrB,QACA,KACA,WAAiB;AAEjB,MAAI;AACH,WAAO,MAAM,OAAO,eACnB,CAAC,aAAa,IAAI,qBAAqB,QAAQ,GAC/C,WACA,CAAC,aAAa,uBAAuB,KAAK,QAAQ,CAAC;EAErD,QAAQ;AACP,UAAM,IAAI,uBACT,wDACA,4BAAgB,sBAAsB;EAExC;AACD;AAEA,SAAS,qBACR,QACA,KACA,6BAA6B,GAAC;AAE9B,QAAM,gBAAgB,KAAK,MAAM,IAAI,OAAO,KAAK,GAAG;AACpD,SACC,gBACE,OAAO,iBAAiB,GAAG,IAC3B;AAEJ;AAGO,MAAM,yBACZ,iBACC,QACA,KACA,KACA,eACA,6BAA6B,GAAC;AAG9B,UAAI,6BAAW,GAAG,KAAK,MAAM,OAAO,wBAAwB,GAAG,GAAG;AAGjE,QAASC,QAAT,WAAa;AACZ,YAAM,IAAI,uBACT,gFACA,4BAAgB,0BAA0B;IAE5C;AALS,eAAAA;AAMT,QAAI,IAAI,kBAAkB,4BAAgB,SAAS;AAClD,UAAI,mBAAmB,CAAC,4BAAgB;AACxC,UAAI,MAAM,OAAO,wBAAwB,GAAG,GAAG;AAE9C,QAAAA,MAAI;MACL;AACA,aAAO,cAAc,QAAQ,IAAI,UAAS,GAAK;QAC9C,SACC;QACD,OAAO;OACP;IACF,OAAO;AACN,MAAAA,MAAI;IACL;EACD;AAGA,MAAI;AAEJ,MAAI,sBAAsB;AAE1B,MAAI;AAEH,aAAS,MAAM;AAGf,QAAI,gBAAe;AAEnB,kBAAc,KAAK,MAAM;EAC1B,SAAS,GAAG;AACX,QAAI,gBAAe;AACnB,UAAM;EACP;AAOA,UAAI,mCAAiB,MAAM,KAAK,CAAC,OAAO,KAAI,GAAI;AAG/C,UAAM;EACP;AAGA,MAAI,IAAI,kBAAiB,GAAI;AAE5B,QAAI,IAAI;AAAqB,aAAO,IAAI;AAIxC,UAAM,UAAU,qBACf,QACA,KACA,0BAA0B;AAE3B,WAAO,kBAAkB,QAAQ,KAAK,OAAO;EAC9C;AAEA,SAAO;AACR;AAGM,MAAM,iCAET,iBACH,QACA,KACA,KACA,eACA,4BAA0B;AAQhB,MAAI,OAAO,IAAI,QAAQ,WAAW,UAAU;AACrD,UAAM,IAAI,uBACT,8EACA,4BAAgB,gBAAgB;EAElC;AAEA,QAAM,OAAO,IAAI,WAAW,MAAM;AAClC,QAAM,yBACL,MAAM,WAAW,2BAAe,mBAAmB,CAAC,KACjD,KAAK,aAAa,2BAAe,mBAAmB,CAAC,KAAK;AAE9D,MACC,CAAC,0BAA0B,CAAE,MAAM,OAAO,wBAAwB,GAAG,GACpE;AAED,WAAO,OAAO,uBACb,QACA,KACA,KACA,eACA,0BAA0B;EAE5B;AAGA,QAAM,UAAU,MAAM,IAAI,iBAAiB,GAAG;AAC9C,QAAM,cAAc,KAAK,KAAK,QAAQ,SAAS,0CAAgB;AAC/D,QAAM,eAAe,cAAc,qDAChC,mDAAyB,uBACzB;AACH,QAAM,YAAY,OAAO,iCAAgC;AACzD,QAAM,SAAS,IAAI,QAAQ;AAG3B,SAAO,UAAU,MAChB,6EAA6E;AAE9E,SAAO,UAAU,WAAW,KAAK;IAChC,WAAW;GACX;AAID,MAAI,qBAA2C,CAAA;AAC/C,QAAM,EAAE,YAAY,kBAAiB,IAAK,OAAO,uBAChD,CAAC,OACA,GAAG,WAAW,WACV,cAAc,2DACb,cAAc,8DACd,GAAG,cAAc,YACvB,CAAC,OAAM;AACN,uBAAmB,KAAK,EAAwB;EACjD,CAAC;AAGF,QAAM,sBAAsB,MAAK;AAChC,UAAM,QAAQ,mBAAmB,UAChC,CAAC,OAAO,cAAc,uDAA6B;AAEpD,QAAI,SAAS,GAAG;AACf,YAAM,KAAK,mBACV,KAAK;AAEN,yBAAmB,OAAO,OAAO,CAAC;AAClC,aAAO;IACR;EACD;AAEA,QAAM,yBAAyB,MAAK;AACnC,UAAM,QAAQ,mBAAmB,UAChC,CAAC,OAAO,cAAc,0DAAgC;AAEvD,QAAI,SAAS,GAAG;AACf,YAAM,KAAK,mBACV,KAAK;AAEN,yBAAmB,OAAO,OAAO,CAAC;AAClC,aAAO;IACR;EACD;AAIA,MAAI;AAEJ,MAAI;AACH,aAAU,UAAS,UAAU,GAAG,WAAW,GAAG,WAAW;AACxD,aAAO,cAAc,QAAQ,QAAQ;QACpC,SACC,2CAA2C,SAAS;QACrD,OAAO;QACP,WAAW;OACX;AAGD,2BAAqB,CAAA;AAErB,YAAM,iBAAiB,IAAI,MAAM,WAAW,EAC1C,KAAK,CAAC,EACN,IAAI,CAAC,GAAG,MAAM,CAAC;AACjB,UAAI,sBAAsB;AAC1B,UAAI,4BAA4B;AAEhC,aAAO,eAAe,SAAS,GAAG;AAEjC,YAAI,2BAA2B;AAC9B,sCAA4B;QAC7B,WAAW,cAAc;AACxB,oBAAM,mBAAK,cAAc,IAAI;QAC9B;AACA,cAAM,UAAU,eAAe,MAAK;AAEpC,cAAM,QAAQ,QAAQ,SACrB,UAAU,6CACT,UAAU,KAAK,0CAAgB;AAEjC,YAAI;AACJ,YAAI,YAAY,GAAG;AAClB,eAAK,IAAI,yDAA+B;YACvC;YACA;YACA,cAAc,QAAQ;YACtB,iBAAiB;WACjB;QACF,OAAO;AACN,eAAK,IAAI,8DAAoC;YAC5C;YACA;YACA,cAAc,QAAQ;YACtB,gBAAgB,UAAU;YAC1B,iBAAiB;WACjB;QACF;AAEA,cAAM,OAAO,OAAO,sBAAsB,IAAI;UAC7C,iBAAiB;UACjB,iBAAiB,IAAI;UACrB,iBAAiB,IAAI;SACrB;AACD,iBAAS,OAAO,uBACf,QACA,KACA,MACA,aAAa;AAGd,YAAI,kBAEW;AAGf,YAAI,YAAY,cAAc,GAAG;AAChC,4BAAkB,MAAM,OACtB,eACA,CAACC,QACAA,IAAG,WAAW,UACXA,eACS,+DACTA,IAAG,cAAc,WACrB,mDAAyB,iBAAiB,EAE1C,MAAM,MAAM,MAAS;QACxB;AAEA,YAAI,iBAAiB;AAEpB,iBAAO,cAAc,QAAQ,QAAQ;YACpC,SACC,iCAAiC,SAAS;YAC3C,OAAO;YACP,WAAW;WACX;AACD,gBAAM;QACP;AAGA,cAAM,cAAc,oBAAmB;AACvC,YAAI,aAAa;AAChB,gBAAM,WAAW,YAAY,kBAAkB;AAC/C,iBAAO,cAAc,QAAQ,QAAQ;YACpC,SACC,4CAA4C,SAAS,OAAO,QAAQ;YACrE,OAAO;WACP;AAED,oBAAM,mBAAK,UAAU,IAAI;AACzB,mBAAS;QACV;AAGA,YAAI,iBAEW;AACf,YAAI,kBAAkB;AACtB,eAAQ,iBAAiB,uBAAsB,GAAK;AACnD,yBAAe,KACd,eAAe,iBAAiB,0CAAgB;AAEjD,4BAAkB;QACnB;AACA,YAAI;AAAiB;AAGrB,YAAI,YAAY,cAAc,GAAG;AAChC,cAAI,qBAAqB;AACxB,mBAAO,cAAc,QAAQ,QAAQ;cACpC,SACC,iCAAiC,SAAS;cAC3C,OAAO;cACP,WAAW;aACX;AACD,kBAAM;UACP,OAAO;AAEN,mBAAO,cAAc,QAAQ,QAAQ;cACpC,SACC,iCAAiC,SAAS;cAC3C,OAAO;cACP,WAAW;aACX;AACD,kCAAsB;AACtB,2BAAe,QAAQ,OAAO;AAC9B;UACD;QACD;MACD;IACD;EACD;AAEC,sBAAiB;EAClB;AAMA,MAAI,IAAI,kBAAiB,GAAI;AAE5B,UAAM,UAAU,qBACf,QACA,KACA,0BAA0B;AAE3B,WAAO,kBAAkB,QAAQ,KAAK,OAAO;EAC9C;AAEA,SAAO;AACR;AAGA,gBAAgB,qBAGf,QACA,KACA,SACA,eACA,SAA4B;AAE5B,QAAM,MAAM,OAAO,sBAAsB,SAAS,OAAO;AAEzD,QAAM,OAAO,OAAO,+BACnB,QACA,KACA,KACA,aAAa;AAEd,MAAI,YAAQ,8BAAW,IAAI,GAAG;AAC7B,WAAO,eAAe,IAAI;AAC1B,WAAO,KAAK;EACb;AACD;AAGO,MAAM,2BAET,iBAAgB,QAAQ,KAAK,KAAK,eAAa;AAMxC,MAAI,OAAO,IAAI,QAAQ,WAAW,UAAU;AACrD,UAAM,IAAI,uBACT,+DACA,4BAAgB,gBAAgB;EAElC,WAAW,EAAE,IAAI,mBAAmB,mDAAiC;AACpE,UAAM,IAAI,uBACT,oFACA,4BAAgB,gBAAgB;EAElC;AAGA,QAAM,SAAS,OAAO;AACtB,QAAM,SAAS,IAAI,QAAQ;AAC3B,MAAI;AAGJ,MAAI,QAAgC,OAAO,aAAa,MAAM;AAC9D,MAAI,CAAC,OAAO;AAEX,UAAM,KAAK,IAAI,qCAAmB;MACjC;MACA,eAAe,IAAI,QAAQ;KAC3B;AACD,UAAM,YAAY,OAAO,qBAGxB,QACA,KACA,IACA,CAACC,MAAK,WAAU;AACf,4BAAsB,KAAK,KAAKA,KAAI,MAAO,GAAG;AAC9C,oBAAcA,MAAK,MAAM;IAC1B,GACA;;MAEC,iBAAiB;KACjB;AAEF,QAAI,CAAC,WAAW;AACf,YAAM,IAAI,uBACT,gEACA,4BAAgB,kBAAkB;IAEpC;AACA,YAAQ,UAAU;EACnB;AACA,MAAI,QAAQ,QAAQ;AAGpB,SAAO,OAAO,uBACb,QACA,KACA,KACA,eACA,mBAAmB;AAErB;AAGO,MAAM,2BAET,iBAAgB,QAAQ,KAAK,KAAK,eAAa;AAClD,MAAI,KAAC,6BAAW,GAAG,KAAK,KAAC,8BAAW,GAAG,GAAG;AACzC,UAAM,IAAI,uBACT,oFACA,4BAAgB,gBAAgB;EAElC,WAAW,OAAO,IAAI,QAAQ,WAAW,UAAU;AAClD,UAAM,IAAI,uBACT,+DACA,4BAAgB,gBAAgB;EAElC,WAAW,EAAE,IAAI,mBAAmB,4CAAkC;AACrE,UAAM,IAAI,uBACT,oFACA,4BAAgB,gBAAgB;EAElC;AAEA,QAAM,SAAS,IAAI,QAAQ;AAC3B,QAAM,SAAS,OAAO,oBAAoB,MAAM;AAChD,QAAM,YAAY,OAAO,aAAa,MAAM;AAC5C,MAAI;AAIJ,QAAM,wBAAwB,IAAI,QAAQ,iBACtC,OAAO,wBAAwB,MAAM;AAEzC,MACC,UAAU,SAAS,sBAAU,QAC1B,UAAU,SAAS,sBAAU,WAC5B,UAAU,SAAS,sBAAU,QAC7B,UAAU,kBAAkB,0BAAc,aAC1C,UAAU,kBAAkB,uBAC/B;AAID,UAAM,KAAK,IAAI,8BAAoB;MAClC;MACA,eAAe,IAAI,QAAQ;KAC3B;AACD,UAAM,YAAY,OAAO,qBAGxB,QACA,KACA,IACA,CAACA,MAAK,WAAU;AACf,4BAAsB,KAAK,KAAKA,KAAI,MAAO,GAAG;AAC9C,oBAAcA,MAAK,MAAM;IAC1B,GACA;;MAEC,iBAAiB;KACjB;AAEF,QAAI,CAAC,WAAW;AACf,YAAM,IAAI,uBACT,gEACA,4BAAgB,kBAAkB;IAEpC;EAGD;AAGA,MAAI,WAAW,OAAO,+BACrB,QACA,KACA,KACA,eACA,mBAAmB;AAOpB,MAAI;AACJ,UACC,mCAAiB,QAAQ,KACtB,IAAI,QAAQ,kBACZ,CAAC,IAAI,QAAQ,kBAAiB,KAC9B,CAAC,IAAI,QAAQ,kBACf,2BAAe,aACf,6BAAmB,GAAG,GAEtB;AACD,kBAAc,MAAM,OAClB,eACA,CAAC,OACA,GAAG,WAAW,UACX,cAAc,kCAClB,GAAG,EAEH,MAAM,MAAM,MAAS;EACxB,eACC,8BAAW,QAAQ,KAChB,SAAS,mBAAmB,kCAC9B;AACD,kBAAc,SAAS;EACxB;AAEA,MAAI,aAAa;AAChB,QAAI,YAAY,OAAO,YAAY,YAAY;AAG9C,aAAO,cAAc,QAAQ,YAAY,UAAU;IACpD;AACA,QAAI,YAAY,KAAK;AACpB,YAAM,mBAAmB,IAAI,QAAQ,oBAAmB;AACxD,UAAI,oBAAoB,QAAW;AAElC,cAAM,OAAO,OAAO,kBAAkB,gBAAgB;AACtD,YAAI,MAAM;AAET,cAAI,QAAQ,aAAa,IAAI,QAAQ,WAAW,OAC/C,CAAC,MAAM,EAAE,aAAa,wBAAc;AAErC,cAAI,QAAQ,WAAW,KACtB,IAAI,wBAAc;YACjB,SAAS;YACT,gBAAgB;WAChB,CAAC;QAEJ;MACD;IACD;AACA,WAAO,cAAc,QAAQ,QAAQ;MACpC,SACC;MACD,WAAW;KACX;AAGD,QAAI,sBAAqB;AACzB,eAAW,OAAO,+BACjB,QACA,KACA,KACA,eACA,mBAAmB;AAGpB,YACC,8BAAW,QAAQ,KAChB,SAAS,mBAAmB,kCAC9B;AAED,aAAO,cAAc,QAAQ,QAAQ;QACpC,SACC;QACD,WAAW;QACX,OAAO;OACP;AACD,YAAM,IAAI,uBACT,0CACA,4BAAgB,wBAAwB;IAE1C;EACD;AAEA,SAAO;AACR;AAGO,MAAM,oCAET,iBAAgB,QAAQ,KAAK,KAAK,eAAa;AAClD,MAAI,KAAC,6BAAW,GAAG,KAAK,KAAC,8BAAW,GAAG,GAAG;AACzC,UAAM,IAAI,uBACT,8FACA,4BAAgB,gBAAgB;EAElC,WAAW,IAAI,QAAQ,aAAY,GAAI;AACtC,UAAM,IAAI,uBACT,0EACA,4BAAgB,gBAAgB;EAElC,WAAW,EAAE,IAAI,mBAAmB,4CAAkC;AACrE,UAAM,IAAI,uBACT,8FACA,4BAAgB,gBAAgB;EAElC;AAEA,QAAM,UAAU,IAAI,QAAQ,oBAAmB;AAC/C,MAAI,WAAW,QAAW;AACzB,UAAM,IAAI,uBACT,+EACA,4BAAgB,gBAAgB;EAElC;AAEA,QAAM,SAAS,OAAO,oBAAoB,IAAI,QAAQ,MAAM;AAC5D,QAAM,QAAQ,OAAO,kBAAkB,OAAO;AAC9C,MAAI,CAAC,OAAO;AACX,UAAM,IAAI,uBACT,mBAAmB,OAAO,oBAC1B,4BAAgB,gBAAgB;EAElC;AAGA,QAAM,WAAW,OAAO,uBACvB,QACA,KACA,KACA,aAAa;AAKd,SAAO,iBAAiB,OAAO;AAG/B,SAAO,eAAe,GAAG;AACzB,QAAM,UAAU,IAAI;AAEpB,QAAM,qBAAqB,QAAQ;AAInC,QAAM,kBAAkB,CAAC,GAAG,IAAI,IAAI,MAAM,OAAO,CAAC;AAElD,QAAM,qBAAwD,CAAA;AAG9D,aAAW,UAAU,iBAAiB;AAEpC,YAAQ,SAAoB;AAE7B,YAAQ,qBAAqB;AAC7B,YAAQ,wBACP,+BAAmB,aACnB,wBAAc,kBAAkB,QAAQ,OAAO,CAAC;AAGjD,UAAM,QAAQ,OAAO,sBAAsB,SAAS;MACnD,iBAAiB,IAAI;MACrB,iBAAiB,IAAI;KACrB;AAEA,UAAM,QAA4C,WAAW,KAC7D,IAAI,wBAAc,EAAE,QAAO,CAAE,CAAC;AAI/B,QAAI;AACH,YAAM,aAAa,OAAO,yBACzB,QACA,KACA,OACA,aAAa;AAEd,cACC,8BAAW,UAAU,KAClB,WAAW,mBACF,6CACT,WAAW,QAAQ,gBAAe,GACpC;AAGD,cAAM,iBAAiB,OAAO,kBAAkB,OAAO;AAEvD,YAAI,gBAAgB;AACnB,gBAAM,KAAK,IAAI,0CAAgC;YAC9C;YACA,YAAY;cACX,IAAI,wBAAc;gBACjB;gBACA;eACA;;WAEF;AAGD,iBAAO,qBACN,QACA,KACA,IACA,eACA;;YAEC,iBAAiB,4BAAgB,MAC9B,4BAAgB;;YAEnB,iBAAiB;;YAEjB,UAAU,4BAAgB;;YAE1B,8BAA8B;WAC9B;QAEH;MACD;AAGA,cAAI,8BAAW,UAAU,GAAG;AAC3B,cAAM,oBAAoB,WAAW,QACnC,kBACA,2BAAe,aACf,6BAAmB,MAAM;AAG3B,2BAAmB,KAClB,mBAAmB,oBAAmB,CAAE;MAE1C;IACD,SAAS,GAAG;AACX,aAAO,UAAU,UAAM,+BAAgB,CAAC,GAAG,OAAO;AAIlD,yBAAmB,KAAK;QACvB,QAAQ,8BAAkB;OAC1B;IACF;EACD;AAEA,QAAM,6BAAyB,qCAC9B,kBAAkB;AAEnB,MAAI,wBAAwB;AAG3B,UAAM,KAAK,IAAI,8BAAoB;MAClC,QAAQ;MACR,WAAW;;MACX,mBAAmB;;MACnB,GAAI;KACJ;AACD,UAAM,MAAM,KAAK,OAAO,iCAAgC,GAAI;MAC3D,cAAc,OAAO;MACrB,SAAS;KACT;AACD,WAAO;EACR,OAAO;AACN,WAAO;EACR;AACD;AAEM,SAAU,uBACf,QACA,KACA,KACA,eAAkE;AAKlE,QAAM,oBAAgB,+CAAqB;AAE3C,QAAM,YAA8B;IACnC,QAAQ;;IACR,SAAS;IACT,MAAM;IACN,OAAO,MAAK;AACX,gBAAU,UAAU;AACpB,gBAAU,OAAO;IAClB;IACA,OAAO,MAAK;AACX,sBAAgB,MAAG;AAElB,YAAI,iBACH;AACD,gBAAI,6BAAW,GAAG,GAAG;AACpB,cAAI,KAAC,8BAAW,GAAG,GAAG;AACrB,kBAAM,IAAI,uBACT,wFACA,4BAAgB,gBAAgB;UAElC;AACA,cACC,IAAI,mBAAmB,2CACtB;AACD,6BACC,IAAI,QAAQ,aAAY,IACrB,2BACA;UAEL,WACC,IAAI,mBAAmB,kDACtB;AACD,6BACC;UAGF,WAAW,IAAI,QAAQ,aAAY,GAAI;AACtC,6BACC;UAGF;QACD;AAIA,cAAMC,OAAM,eAAe,QAAQ,KAAK,KAAK,aAAa;AAC1D,YAAI;AACJ,YAAI;AACJ,eAAO,MAAM;AAGZ,cAAI;AACH,kBAAM,EAAE,OAAO,KAAI,IAAK,MAAMA,KAAI,KAAK,UAAW;AAClD,gBAAI,MAAM;AACT,uBAAS;AACT;YACD;AAGA,sBAAU,UAAU;AACpB,yBAAa,MAAM,UAAU;UAC9B,SAAS,GAAG;AACX,gBAAI,aAAa,OAAO;AAEvB,4BAAc,OAAO,CAAC;YACvB,eAAW,mCAAiB,CAAC,KAAK,CAAC,EAAE,KAAI,GAAI;AAG5C,wBAAU,MAAK;AACf;YACD,OAAO;AAEN,4BAAc,QAAQ,CAAc;YACrC;AACA;UACD;QACD;AAEA,sBAAc,QAAQ,MAAmB;AACzC,kBAAU,MAAK;AACf;MACD;AAEA,gBAAU,OAAO,IAAG;AACpB,aAAO,UAAU;IAClB;;AAED,SAAO,EAAE,eAAe,UAAS;AAClC;",
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,