zwave-js 14.3.0 → 14.3.2

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 (44) hide show
  1. package/build/cjs/Utils.d.ts +1 -1
  2. package/build/cjs/Utils.js +6 -2
  3. package/build/cjs/Utils.js.map +2 -2
  4. package/build/cjs/index_safe.js.map +2 -2
  5. package/build/cjs/lib/_version.d.ts +1 -1
  6. package/build/cjs/lib/_version.js +1 -1
  7. package/build/cjs/lib/_version.js.map +1 -1
  8. package/build/cjs/lib/controller/FirmwareUpdateService.js +3 -6
  9. package/build/cjs/lib/controller/FirmwareUpdateService.js.map +3 -3
  10. package/build/cjs/lib/driver/Driver.js +1 -2
  11. package/build/cjs/lib/driver/Driver.js.map +2 -2
  12. package/build/cjs/lib/node/Node.d.ts +2 -1
  13. package/build/cjs/lib/node/Node.js +22 -9
  14. package/build/cjs/lib/node/Node.js.map +2 -2
  15. package/build/cjs/lib/node/mixins/70_FirmwareUpdate.js +3 -4
  16. package/build/cjs/lib/node/mixins/70_FirmwareUpdate.js.map +2 -2
  17. package/build/cjs/lib/telemetry/statistics.js +4 -4
  18. package/build/cjs/lib/telemetry/statistics.js.map +2 -2
  19. package/build/esm/Utils.d.ts +1 -1
  20. package/build/esm/Utils.d.ts.map +1 -1
  21. package/build/esm/Utils.js +1 -1
  22. package/build/esm/Utils.js.map +1 -1
  23. package/build/esm/index_safe.d.ts.map +1 -1
  24. package/build/esm/index_safe.js +1 -0
  25. package/build/esm/index_safe.js.map +1 -1
  26. package/build/esm/lib/_version.d.ts +1 -1
  27. package/build/esm/lib/_version.js +1 -1
  28. package/build/esm/lib/controller/FirmwareUpdateService.d.ts.map +1 -1
  29. package/build/esm/lib/controller/FirmwareUpdateService.js +5 -11
  30. package/build/esm/lib/controller/FirmwareUpdateService.js.map +1 -1
  31. package/build/esm/lib/driver/Driver.d.ts.map +1 -1
  32. package/build/esm/lib/driver/Driver.js +2 -3
  33. package/build/esm/lib/driver/Driver.js.map +1 -1
  34. package/build/esm/lib/node/Node.d.ts +2 -1
  35. package/build/esm/lib/node/Node.d.ts.map +1 -1
  36. package/build/esm/lib/node/Node.js +27 -9
  37. package/build/esm/lib/node/Node.js.map +1 -1
  38. package/build/esm/lib/node/mixins/70_FirmwareUpdate.d.ts.map +1 -1
  39. package/build/esm/lib/node/mixins/70_FirmwareUpdate.js +1 -2
  40. package/build/esm/lib/node/mixins/70_FirmwareUpdate.js.map +1 -1
  41. package/build/esm/lib/telemetry/statistics.d.ts.map +1 -1
  42. package/build/esm/lib/telemetry/statistics.js +7 -9
  43. package/build/esm/lib/telemetry/statistics.js.map +1 -1
  44. package/package.json +10 -10
@@ -30,7 +30,6 @@ var import_arrays = require("alcalzone-shared/arrays");
30
30
  var import_async = require("alcalzone-shared/async");
31
31
  var import_deferred_promise = require("alcalzone-shared/deferred-promise");
32
32
  var import_math = require("alcalzone-shared/math");
33
- var import_node_crypto = require("node:crypto");
34
33
  var import_Task = require("../../driver/Task.js");
35
34
  var import_ScheduledPoll = require("./60_ScheduledPoll.js");
36
35
  function isFirmwareUpdateOTATask(t) {
@@ -292,7 +291,7 @@ class FirmwareUpdateMixin extends import_ScheduledPoll.SchedulePollMixin {
292
291
  fcc.toggleEncapsulationFlag(import_core.EncapsulationFlags.Security, !!(command.encapsulationFlags & import_core.EncapsulationFlags.Security));
293
292
  const ccVersion = (0, import_cc.getEffectiveCCVersion)(this.driver, fcc);
294
293
  const fragmentSize = this.driver.computeNetCCPayloadSize(fcc) - 2 - (ccVersion >= 2 ? 2 : 0);
295
- const fragment = (0, import_node_crypto.randomBytes)(fragmentSize);
294
+ const fragment = (0, import_core.randomBytes)(fragmentSize);
296
295
  try {
297
296
  await this.sendCorruptedFirmwareUpdateReport(command.reportNumber, fragment);
298
297
  } catch {
@@ -400,7 +399,7 @@ class FirmwareUpdateMixin extends import_ScheduledPoll.SchedulePollMixin {
400
399
  message: `Received Firmware Update Get for an out-of-bounds fragment. Forcing the node to abort...`,
401
400
  direction: "inbound"
402
401
  });
403
- await this.sendCorruptedFirmwareUpdateReport(fragmentRequest.reportNumber, (0, import_node_crypto.randomBytes)(fragmentSize), nonSecureTransfer);
402
+ await this.sendCorruptedFirmwareUpdateReport(fragmentRequest.reportNumber, (0, import_core.randomBytes)(fragmentSize), nonSecureTransfer);
404
403
  break update;
405
404
  }
406
405
  request: for (let num = fragmentRequest.reportNumber; num < fragmentRequest.reportNumber + fragmentRequest.numReports; num++) {
@@ -410,7 +409,7 @@ class FirmwareUpdateMixin extends import_ScheduledPoll.SchedulePollMixin {
410
409
  }
411
410
  const fragment = data.subarray((num - 1) * fragmentSize, num * fragmentSize);
412
411
  if (abortContext.abort) {
413
- await this.sendCorruptedFirmwareUpdateReport(fragmentRequest.reportNumber, (0, import_node_crypto.randomBytes)(fragment.length), nonSecureTransfer);
412
+ await this.sendCorruptedFirmwareUpdateReport(fragmentRequest.reportNumber, (0, import_core.randomBytes)(fragment.length), nonSecureTransfer);
414
413
  break update;
415
414
  } else {
416
415
  if (this.hasPendingFirmwareUpdateFragment(num)) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/node/mixins/70_FirmwareUpdate.ts"],
4
- "sourcesContent": ["import {\n\ttype FirmwareUpdateMetaData,\n\tFirmwareUpdateMetaDataCC,\n\tFirmwareUpdateMetaDataCCGet,\n\ttype FirmwareUpdateMetaDataCCMetaDataGet,\n\tFirmwareUpdateMetaDataCCReport,\n\tFirmwareUpdateMetaDataCCRequestReport,\n\tFirmwareUpdateMetaDataCCStatusReport,\n\ttype FirmwareUpdateOptions,\n\ttype FirmwareUpdateProgress,\n\tFirmwareUpdateRequestStatus,\n\ttype FirmwareUpdateResult,\n\tFirmwareUpdateStatus,\n\tgetEffectiveCCVersion,\n} from \"@zwave-js/cc\";\nimport {\n\tCRC16_CCITT,\n\tCommandClasses,\n\tEncapsulationFlags,\n\ttype Firmware,\n\tSecurityClass,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tsecurityClassIsS2,\n\ttimespan,\n} from \"@zwave-js/core\";\nimport { containsCC } from \"@zwave-js/serial/serialapi\";\nimport { getEnumMemberName, throttle } from \"@zwave-js/shared\";\nimport { distinct } from \"alcalzone-shared/arrays\";\nimport { wait } from \"alcalzone-shared/async\";\nimport {\n\ttype DeferredPromise,\n\tcreateDeferredPromise,\n} from \"alcalzone-shared/deferred-promise\";\nimport { roundTo } from \"alcalzone-shared/math\";\nimport { randomBytes } from \"node:crypto\";\nimport {\n\ttype Task,\n\ttype TaskBuilder,\n\tTaskPriority,\n} from \"../../driver/Task.js\";\nimport { type Transaction } from \"../../driver/Transaction.js\";\nimport { SchedulePollMixin } from \"./60_ScheduledPoll.js\";\n\ninterface AbortFirmwareUpdateContext {\n\tabort: boolean;\n\ttooLateToAbort: boolean;\n\tabortPromise: DeferredPromise<boolean>;\n}\n\ntype PartialFirmwareUpdateResult =\n\t& Pick<FirmwareUpdateResult, \"status\" | \"waitTime\">\n\t& { success: boolean };\n\n/** Checks if a task belongs to a route rebuilding process */\nexport function isFirmwareUpdateOTATask(t: Task<unknown>): boolean {\n\treturn t.tag?.id === \"firmware-update-ota\";\n}\n\nexport interface NodeFirmwareUpdate {\n\t/**\n\t * Aborts an active firmware update process\n\t */\n\tabortFirmwareUpdate(): Promise<void>;\n\n\t/**\n\t * Performs an OTA firmware upgrade of one or more chips on this node.\n\t *\n\t * This method will resolve after the process has **COMPLETED**. Failure to start any one of the provided updates will throw an error.\n\t *\n\t * **WARNING: Use at your own risk! We don't take any responsibility if your devices don't work after an update.**\n\t *\n\t * @param updates An array of firmware updates that will be done in sequence\n\t *\n\t * @returns Whether all of the given updates were successful.\n\t */\n\tupdateFirmware(\n\t\tupdates: Firmware[],\n\t\toptions?: FirmwareUpdateOptions,\n\t): Promise<FirmwareUpdateResult>;\n\n\t/**\n\t * Returns whether a firmware update is in progress for this node.\n\t */\n\tisFirmwareUpdateInProgress(): boolean;\n}\n\nexport abstract class FirmwareUpdateMixin extends SchedulePollMixin\n\timplements NodeFirmwareUpdate\n{\n\tprivate _abortFirmwareUpdate: (() => Promise<void>) | undefined;\n\tpublic async abortFirmwareUpdate(): Promise<void> {\n\t\tif (!this._abortFirmwareUpdate) return;\n\t\tawait this._abortFirmwareUpdate();\n\t}\n\n\t// Stores the CRC of the previously transferred firmware image.\n\t// Allows detecting whether resuming is supported and where to continue in a multi-file transfer.\n\tprivate _previousFirmwareCRC: number | undefined;\n\n\t/** Is used to remember fragment requests that came in before they were able to be handled */\n\tprivate _firmwareUpdatePrematureRequest:\n\t\t| FirmwareUpdateMetaDataCCGet\n\t\t| undefined;\n\n\tpublic async updateFirmware(\n\t\tupdates: Firmware[],\n\t\toptions: FirmwareUpdateOptions = {},\n\t): Promise<FirmwareUpdateResult> {\n\t\tif (updates.length === 0) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`At least one update must be provided`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Check that each update has a buffer with at least 1 byte\n\t\tif (updates.some((u) => u.data.length === 0)) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`All firmware updates must have a non-empty data buffer`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Check that the targets are not duplicates\n\t\tif (\n\t\t\tdistinct(updates.map((u) => u.firmwareTarget ?? 0)).length\n\t\t\t\t!== updates.length\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The target of all provided firmware updates must be unique`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Don't start the process twice\n\t\tif (this.driver.controller.isFirmwareUpdateInProgress()) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: An OTW upgrade of the controller is in progress!`,\n\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t);\n\t\t}\n\n\t\t// Don't allow starting two firmware updates for the same node\n\t\tconst task = this.getUpdateFirmwareTask(updates, options);\n\t\tif (task instanceof Promise) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: A firmware update is already in progress for this node!`,\n\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t);\n\t\t}\n\n\t\t// Queue the task\n\t\treturn this.driver.scheduler.queueTask(task);\n\t}\n\n\tpublic isFirmwareUpdateInProgress(): boolean {\n\t\treturn !!this.driver.scheduler.findTask(isFirmwareUpdateOTATask);\n\t}\n\n\tprivate getUpdateFirmwareTask(\n\t\tupdates: Firmware[],\n\t\toptions: FirmwareUpdateOptions = {},\n\t): Promise<FirmwareUpdateResult> | TaskBuilder<FirmwareUpdateResult> {\n\t\tconst self = this;\n\n\t\t// This task should only run once at a time\n\t\tconst existingTask = this.driver.scheduler.findTask<\n\t\t\tFirmwareUpdateResult\n\t\t>((t) =>\n\t\t\tt.tag?.id === \"firmware-update-ota\"\n\t\t\t&& t.tag.nodeId === self.id\n\t\t);\n\t\tif (existingTask) return existingTask;\n\n\t\tlet keepAwake: boolean;\n\n\t\treturn {\n\t\t\t// Firmware updates cause a lot of traffic. Execute them in the background.\n\t\t\tpriority: TaskPriority.Lower,\n\t\t\ttag: { id: \"firmware-update-ota\", nodeId: self.id },\n\t\t\ttask: async function* firmwareUpdateTask() {\n\t\t\t\t// Keep battery powered nodes awake during the process\n\t\t\t\tkeepAwake = self.keepAwake;\n\t\t\t\tself.keepAwake = true;\n\n\t\t\t\t// Support aborting the update\n\t\t\t\tconst abortContext = {\n\t\t\t\t\tabort: false,\n\t\t\t\t\ttooLateToAbort: false,\n\t\t\t\t\tabortPromise: createDeferredPromise<boolean>(),\n\t\t\t\t};\n\n\t\t\t\tself._abortFirmwareUpdate = async () => {\n\t\t\t\t\tif (abortContext.tooLateToAbort) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`The firmware update was transmitted completely, cannot abort anymore.`,\n\t\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToAbort,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\tmessage: `Aborting firmware update...`,\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Trigger the abort\n\t\t\t\t\tabortContext.abort = true;\n\t\t\t\t\tconst aborted = await abortContext.abortPromise;\n\t\t\t\t\tif (!aborted) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`The node did not acknowledge the aborted update`,\n\t\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToAbort,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\tmessage: `Firmware update aborted`,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\t// Prepare the firmware update\n\t\t\t\tlet fragmentSizeSecure: number;\n\t\t\t\tlet fragmentSizeNonSecure: number;\n\t\t\t\tlet meta: FirmwareUpdateMetaData;\n\t\t\t\ttry {\n\t\t\t\t\tconst prepareResult = await self\n\t\t\t\t\t\t.prepareFirmwareUpdateInternal(\n\t\t\t\t\t\t\tupdates.map((u) => u.firmwareTarget ?? 0),\n\t\t\t\t\t\t\tabortContext,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// Handle early aborts\n\t\t\t\t\tif (abortContext.abort) {\n\t\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\tstatus: FirmwareUpdateStatus\n\t\t\t\t\t\t\t\t.Error_TransmissionFailed,\n\t\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update finished\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the firmware update was not aborted, prepareResult is definitely defined\n\t\t\t\t\t({\n\t\t\t\t\t\tfragmentSizeSecure,\n\t\t\t\t\t\tfragmentSizeNonSecure,\n\t\t\t\t\t\t...meta\n\t\t\t\t\t} = prepareResult!);\n\t\t\t\t} catch {\n\t\t\t\t\t// Not sure what the error is, but we'll label it \"transmission failed\"\n\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tstatus: FirmwareUpdateStatus.Error_TransmissionFailed,\n\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t};\n\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t// The resume and non-secure transfer features may not be supported by the node\n\t\t\t\t// If not, disable them, even though the application requested them\n\t\t\t\tif (!meta.supportsResuming) options.resume = false;\n\n\t\t\t\tconst securityClass = self.getHighestSecurityClass();\n\t\t\t\tconst isSecure = securityClass === SecurityClass.S0_Legacy\n\t\t\t\t\t|| securityClassIsS2(securityClass);\n\t\t\t\tif (!isSecure) {\n\t\t\t\t\t// The nonSecureTransfer option is only relevant for secure devices\n\t\t\t\t\toptions.nonSecureTransfer = false;\n\t\t\t\t} else if (!meta.supportsNonSecureTransfer) {\n\t\t\t\t\toptions.nonSecureTransfer = false;\n\t\t\t\t}\n\n\t\t\t\t// Throttle the progress emitter so applications can handle the load of events\n\t\t\t\tconst notifyProgress = throttle(\n\t\t\t\t\t(progress) =>\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update progress\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tprogress,\n\t\t\t\t\t\t),\n\t\t\t\t\t250,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\n\t\t\t\t// If resuming is supported and desired, try to figure out with which file to continue\n\t\t\t\tconst updatesWithChecksum = updates.map((u) => ({\n\t\t\t\t\t...u,\n\t\t\t\t\tchecksum: CRC16_CCITT(u.data),\n\t\t\t\t}));\n\t\t\t\tlet skipFinishedFiles = -1;\n\t\t\t\tlet shouldResume = options.resume\n\t\t\t\t\t&& self._previousFirmwareCRC != undefined;\n\t\t\t\tif (shouldResume) {\n\t\t\t\t\tskipFinishedFiles = updatesWithChecksum.findIndex(\n\t\t\t\t\t\t(u) => u.checksum === self._previousFirmwareCRC,\n\t\t\t\t\t);\n\t\t\t\t\tif (skipFinishedFiles === -1) shouldResume = false;\n\t\t\t\t}\n\n\t\t\t\t// Perform all firmware updates in sequence\n\t\t\t\tlet updateResult!: PartialFirmwareUpdateResult;\n\t\t\t\tlet conservativeWaitTime: number;\n\n\t\t\t\tconst totalBytes: number = updatesWithChecksum.reduce(\n\t\t\t\t\t(total, update) => total + update.data.length,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tlet sentBytesOfPreviousFiles = 0;\n\n\t\t\t\tfor (let i = 0; i < updatesWithChecksum.length; i++) {\n\t\t\t\t\tconst { firmwareTarget: target = 0, data, checksum } =\n\t\t\t\t\t\tupdatesWithChecksum[i];\n\n\t\t\t\t\tif (i < skipFinishedFiles) {\n\t\t\t\t\t\t// If we are resuming, skip this file since it was already done before\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Skipping already completed firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length})...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsentBytesOfPreviousFiles += data.length;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t`Updating firmware (part ${\n\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t} / ${updatesWithChecksum.length})...`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// For determining the initial fragment size, assume the node respects our choice.\n\t\t\t\t\t// If the node is not secure, these two values are identical anyways.\n\t\t\t\t\tlet fragmentSize = options.nonSecureTransfer\n\t\t\t\t\t\t? fragmentSizeNonSecure\n\t\t\t\t\t\t: fragmentSizeSecure;\n\n\t\t\t\t\t// Tell the node to start requesting fragments\n\t\t\t\t\tconst { resume, nonSecureTransfer } = yield* self\n\t\t\t\t\t\t.beginFirmwareUpdateInternal(\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\tmeta,\n\t\t\t\t\t\t\tfragmentSize,\n\t\t\t\t\t\t\tchecksum,\n\t\t\t\t\t\t\tshouldResume,\n\t\t\t\t\t\t\toptions.nonSecureTransfer,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// If the node did not accept non-secure transfer, revisit our choice of fragment size\n\t\t\t\t\tif (options.nonSecureTransfer && !nonSecureTransfer) {\n\t\t\t\t\t\tfragmentSize = fragmentSizeSecure;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the checksum, so we can resume if necessary\n\t\t\t\t\tself._previousFirmwareCRC = checksum;\n\n\t\t\t\t\tif (shouldResume) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Node ${\n\t\t\t\t\t\t\t\tresume ? \"accepted\" : \"did not accept\"\n\t\t\t\t\t\t\t} resuming the update...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (nonSecureTransfer) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Firmware will be transferred without encryption...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t\t// Listen for firmware update fragment requests and handle them\n\t\t\t\t\tupdateResult = yield* self.doFirmwareUpdateInternal(\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tfragmentSize,\n\t\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t\t\tabortContext,\n\t\t\t\t\t\t(fragment, total) => {\n\t\t\t\t\t\t\tconst progress: FirmwareUpdateProgress = {\n\t\t\t\t\t\t\t\tcurrentFile: i + 1,\n\t\t\t\t\t\t\t\ttotalFiles: updatesWithChecksum.length,\n\t\t\t\t\t\t\t\tsentFragments: fragment,\n\t\t\t\t\t\t\t\ttotalFragments: total,\n\t\t\t\t\t\t\t\tprogress: roundTo(\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t(sentBytesOfPreviousFiles\n\t\t\t\t\t\t\t\t\t\t\t+ Math.min(\n\t\t\t\t\t\t\t\t\t\t\t\tfragment * fragmentSize,\n\t\t\t\t\t\t\t\t\t\t\t\tdata.length,\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t/ totalBytes\n\t\t\t\t\t\t\t\t\t) * 100,\n\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tnotifyProgress(progress);\n\n\t\t\t\t\t\t\t// When this file is done, add the fragments to the total, so we can compute the total progress correctly\n\t\t\t\t\t\t\tif (fragment === total) {\n\t\t\t\t\t\t\t\tsentBytesOfPreviousFiles += data.length;\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// If we wait, wait a bit longer than the device told us, so it is actually ready to use\n\t\t\t\t\tconservativeWaitTime = self.driver\n\t\t\t\t\t\t.getConservativeWaitTimeAfterFirmwareUpdate(\n\t\t\t\t\t\t\tupdateResult.waitTime,\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (!updateResult.success) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\t\tmessage: `Firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length}) failed with status ${\n\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\tFirmwareUpdateStatus,\n\t\t\t\t\t\t\t\t\tupdateResult.status,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\t\t...updateResult,\n\t\t\t\t\t\t\twaitTime: undefined,\n\t\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update finished\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} else if (i < updatesWithChecksum.length - 1) {\n\t\t\t\t\t\t// Update succeeded, but we're not done yet\n\n\t\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\t\tmessage: `Firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length}) succeeded with status ${\n\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\tFirmwareUpdateStatus,\n\t\t\t\t\t\t\t\t\tupdateResult.status,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Continuing with next part in ${conservativeWaitTime} seconds...`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// If we've resumed the previous file, there's no need to resume the next one too\n\t\t\t\t\t\tshouldResume = false;\n\n\t\t\t\t\t\tyield () => wait(conservativeWaitTime * 1000, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// We're done. No need to resume this update\n\t\t\t\tself._previousFirmwareCRC = undefined;\n\n\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t...updateResult,\n\t\t\t\t\twaitTime: conservativeWaitTime!,\n\t\t\t\t\treInterview: true,\n\t\t\t\t};\n\n\t\t\t\t// After a successful firmware update, we want to interview sleeping nodes immediately,\n\t\t\t\t// so don't send them to sleep when they wake up\n\t\t\t\tkeepAwake = true;\n\n\t\t\t\tself._emit(\"firmware update finished\", self, result);\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tcleanup() {\n\t\t\t\tself._abortFirmwareUpdate = undefined;\n\t\t\t\tself._firmwareUpdatePrematureRequest = undefined;\n\n\t\t\t\t// Make sure that the keepAwake flag gets reset at the end\n\t\t\t\tself.keepAwake = keepAwake;\n\t\t\t\tif (!keepAwake) {\n\t\t\t\t\tsetImmediate(() => {\n\t\t\t\t\t\tself.driver.debounceSendNodeToSleep(self);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn Promise.resolve();\n\t\t\t},\n\t\t};\n\t}\n\n\t/** Prepares the firmware update of a single target by collecting the necessary information */\n\tprivate async prepareFirmwareUpdateInternal(\n\t\ttargets: number[],\n\t\tabortContext: AbortFirmwareUpdateContext,\n\t): Promise<\n\t\t| undefined\n\t\t| (FirmwareUpdateMetaData & {\n\t\t\tfragmentSizeSecure: number;\n\t\t\tfragmentSizeNonSecure: number;\n\t\t})\n\t> {\n\t\tconst api = this.commandClasses[\"Firmware Update Meta Data\"];\n\n\t\t// ================================\n\t\t// STEP 1:\n\t\t// Check if this update is possible\n\t\tconst meta = await api.getMetaData();\n\t\tif (!meta) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: The node did not respond in time!`,\n\t\t\t\tZWaveErrorCodes.Controller_NodeTimeout,\n\t\t\t);\n\t\t}\n\n\t\tfor (const target of targets) {\n\t\t\tif (target === 0) {\n\t\t\t\tif (!meta.firmwareUpgradable) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: The Z-Wave chip firmware is not upgradable!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_NotUpgradable,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (api.version < 3) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: The node does not support upgrading a different firmware target than 0!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_TargetNotFound,\n\t\t\t\t\t);\n\t\t\t\t} else if (\n\t\t\t\t\tmeta.additionalFirmwareIDs[target - 1] == undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: Firmware target #${target} not found on this node!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_TargetNotFound,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ================================\n\t\t// STEP 2:\n\t\t// Determine the fragment size\n\t\tconst fcc = new FirmwareUpdateMetaDataCC({ nodeId: this.id });\n\t\tfcc.toggleEncapsulationFlag(\n\t\t\tEncapsulationFlags.Security,\n\t\t\tthis.driver.isCCSecure(fcc.ccId, this.id),\n\t\t);\n\t\tconst maxGrossPayloadSizeSecure = this.driver\n\t\t\t.computeNetCCPayloadSize(\n\t\t\t\tfcc,\n\t\t\t);\n\t\tconst maxGrossPayloadSizeNonSecure = this.driver\n\t\t\t.computeNetCCPayloadSize(fcc, true);\n\n\t\tconst ccVersion = getEffectiveCCVersion(this.driver, fcc);\n\t\tconst maxNetPayloadSizeSecure = maxGrossPayloadSizeSecure\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\t\tconst maxNetPayloadSizeNonSecure = maxGrossPayloadSizeNonSecure\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\n\t\t// Use the smallest allowed payload\n\t\tconst fragmentSizeSecure = Math.min(\n\t\t\tmaxNetPayloadSizeSecure,\n\t\t\tmeta.maxFragmentSize ?? Number.POSITIVE_INFINITY,\n\t\t);\n\t\tconst fragmentSizeNonSecure = Math.min(\n\t\t\tmaxNetPayloadSizeNonSecure,\n\t\t\tmeta.maxFragmentSize ?? Number.POSITIVE_INFINITY,\n\t\t);\n\n\t\tif (abortContext.abort) {\n\t\t\tabortContext.abortPromise.resolve(true);\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\t...meta,\n\t\t\t\tfragmentSizeSecure,\n\t\t\t\tfragmentSizeNonSecure,\n\t\t\t};\n\t\t}\n\t}\n\n\tprotected async handleUnexpectedFirmwareUpdateGet(\n\t\tcommand: FirmwareUpdateMetaDataCCGet,\n\t): Promise<void> {\n\t\t// This method will only be called under two circumstances:\n\t\t// 1. The node is currently busy responding to a firmware update request -> remember the request\n\t\tif (this.isFirmwareUpdateInProgress()) {\n\t\t\tthis._firmwareUpdatePrematureRequest = command;\n\t\t\treturn;\n\t\t}\n\n\t\t// 2. No firmware update is in progress -> abort\n\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\tmessage:\n\t\t\t\t`Received Firmware Update Get, but no firmware update is in progress. Forcing the node to abort...`,\n\t\t\tdirection: \"inbound\",\n\t\t});\n\n\t\t// Since no update is in progress, we need to determine the fragment size again\n\t\tconst fcc = new FirmwareUpdateMetaDataCC({ nodeId: this.id });\n\t\tfcc.toggleEncapsulationFlag(\n\t\t\tEncapsulationFlags.Security,\n\t\t\t!!(command.encapsulationFlags & EncapsulationFlags.Security),\n\t\t);\n\t\tconst ccVersion = getEffectiveCCVersion(this.driver, fcc);\n\t\tconst fragmentSize = this.driver.computeNetCCPayloadSize(fcc)\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\t\tconst fragment = randomBytes(fragmentSize);\n\t\ttry {\n\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\tcommand.reportNumber,\n\t\t\t\tfragment,\n\t\t\t);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\t/** Kicks off a firmware update of a single target. Returns whether the node accepted resuming and non-secure transfer */\n\tprivate async *beginFirmwareUpdateInternal(\n\t\tdata: Uint8Array,\n\t\ttarget: number,\n\t\tmeta: FirmwareUpdateMetaData,\n\t\tfragmentSize: number,\n\t\tchecksum: number,\n\t\tresume: boolean | undefined,\n\t\tnonSecureTransfer: boolean | undefined,\n\t) {\n\t\tconst api = this.commandClasses[\"Firmware Update Meta Data\"];\n\n\t\t// ================================\n\t\t// STEP 3:\n\t\t// Start the update\n\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\tmessage: `Starting firmware update...`,\n\t\t\tdirection: \"outbound\",\n\t\t});\n\n\t\t// Request the node to start the upgrade\n\t\tawait api.requestUpdate({\n\t\t\t// TODO: Should manufacturer id and firmware id be provided externally?\n\t\t\tmanufacturerId: meta.manufacturerId,\n\t\t\tfirmwareId: target == 0\n\t\t\t\t? meta.firmwareId\n\t\t\t\t: meta.additionalFirmwareIDs[target - 1],\n\t\t\tfirmwareTarget: target,\n\t\t\tfragmentSize,\n\t\t\tchecksum,\n\t\t\tresume,\n\t\t\tnonSecureTransfer,\n\t\t});\n\t\t// Pause the task until the response is received, because that can take\n\t\t// up to a minute\n\t\tconst result: FirmwareUpdateMetaDataCCRequestReport = yield () =>\n\t\t\tthis.driver\n\t\t\t\t.waitForCommand<FirmwareUpdateMetaDataCCRequestReport>(\n\t\t\t\t\t(cc) =>\n\t\t\t\t\t\tcc instanceof FirmwareUpdateMetaDataCCRequestReport\n\t\t\t\t\t\t&& cc.nodeId === this.id,\n\t\t\t\t\t60000,\n\t\t\t\t);\n\n\t\tswitch (result.status) {\n\t\t\tcase FirmwareUpdateRequestStatus.Error_AuthenticationExpected:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: A manual authentication event (e.g. button push) was expected!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_BatteryLow:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: The battery level is too low!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus\n\t\t\t\t.Error_FirmwareUpgradeInProgress:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: A firmware upgrade is already in progress!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus\n\t\t\t\t.Error_InvalidManufacturerOrFirmwareID:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Invalid manufacturer or firmware id!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_InvalidHardwareVersion:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Invalid hardware version!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_NotUpgradable:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Firmware target #${target} is not upgradable!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_NotUpgradable,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_FragmentSizeTooLarge:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: The chosen fragment size is too large!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.OK:\n\t\t\t\t// All good, we have started!\n\t\t\t\t// Keep the node awake until the update is done.\n\t\t\t\tthis.keepAwake = true;\n\t\t}\n\n\t\treturn {\n\t\t\tresume: !!result.resume,\n\t\t\tnonSecureTransfer: !!result.nonSecureTransfer,\n\t\t};\n\t}\n\n\tprotected async handleFirmwareUpdateMetaDataGet(\n\t\tcommand: FirmwareUpdateMetaDataCCMetaDataGet,\n\t): Promise<void> {\n\t\tconst endpoint = this.getEndpoint(command.endpointIndex)\n\t\t\t?? this;\n\n\t\t// We are being queried, so the device may actually not support the CC, just control it.\n\t\t// Using the commandClasses property would throw in that case\n\t\tconst api = endpoint\n\t\t\t.createAPI(CommandClasses[\"Firmware Update Meta Data\"], false)\n\t\t\t.withOptions({\n\t\t\t\t// Answer with the same encapsulation as asked, but omit\n\t\t\t\t// Supervision as it shouldn't be used for Get-Report flows\n\t\t\t\tencapsulationFlags: command.encapsulationFlags\n\t\t\t\t\t& ~EncapsulationFlags.Supervision,\n\t\t\t});\n\n\t\t// We do not support the firmware to be upgraded.\n\t\tawait api.reportMetaData({\n\t\t\tmanufacturerId: this.driver.options.vendor?.manufacturerId\n\t\t\t\t?? 0xffff,\n\t\t\tfirmwareUpgradable: false,\n\t\t\thardwareVersion: this.driver.options.vendor?.hardwareVersion\n\t\t\t\t?? 0,\n\t\t});\n\t}\n\n\tprivate async sendCorruptedFirmwareUpdateReport(\n\t\treportNum: number,\n\t\tfragment: Uint8Array,\n\t\tnonSecureTransfer: boolean = false,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.commandClasses[\"Firmware Update Meta Data\"]\n\t\t\t\t.withOptions({\n\t\t\t\t\t// Only encapsulate if the transfer is secure\n\t\t\t\t\tautoEncapsulate: !nonSecureTransfer,\n\t\t\t\t})\n\t\t\t\t.sendFirmwareFragment(reportNum, true, fragment);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tprivate hasPendingFirmwareUpdateFragment(\n\t\tfragmentNumber: number,\n\t): boolean {\n\t\t// Avoid queuing duplicate fragments\n\t\tconst isCurrentFirmwareFragment = (t: Transaction) =>\n\t\t\tt.message.getNodeId() === this.id\n\t\t\t&& containsCC(t.message)\n\t\t\t&& t.message.command instanceof FirmwareUpdateMetaDataCCReport\n\t\t\t&& t.message.command.reportNumber === fragmentNumber;\n\n\t\treturn this.driver.hasPendingTransactions(\n\t\t\tisCurrentFirmwareFragment,\n\t\t);\n\t}\n\n\tprivate async *doFirmwareUpdateInternal(\n\t\tdata: Uint8Array,\n\t\tfragmentSize: number,\n\t\tnonSecureTransfer: boolean,\n\t\tabortContext: AbortFirmwareUpdateContext,\n\t\tonProgress: (fragment: number, total: number) => void,\n\t): AsyncGenerator<\n\t\tany,\n\t\tPartialFirmwareUpdateResult,\n\t\tany\n\t> {\n\t\tconst numFragments = Math.ceil(data.length / fragmentSize);\n\n\t\t// Make sure we're not responding to an outdated request immediately\n\t\tthis._firmwareUpdatePrematureRequest = undefined;\n\n\t\t// ================================\n\t\t// STEP 4:\n\t\t// Respond to fragment requests from the node\n\t\tupdate: while (true) {\n\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t// During ongoing firmware updates, it can happen that the next request is received before the callback for the previous response\n\t\t\t// is back. In that case we can immediately handle the premature request. Otherwise wait for the next request.\n\t\t\tlet fragmentRequest: FirmwareUpdateMetaDataCCGet;\n\t\t\tif (this._firmwareUpdatePrematureRequest) {\n\t\t\t\tfragmentRequest = this._firmwareUpdatePrematureRequest;\n\t\t\t\tthis._firmwareUpdatePrematureRequest = undefined;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tfragmentRequest = yield () =>\n\t\t\t\t\t\tthis.driver\n\t\t\t\t\t\t\t.waitForCommand<FirmwareUpdateMetaDataCCGet>(\n\t\t\t\t\t\t\t\t(cc) =>\n\t\t\t\t\t\t\t\t\tcc.nodeId === this.id\n\t\t\t\t\t\t\t\t\t&& cc\n\t\t\t\t\t\t\t\t\t\tinstanceof FirmwareUpdateMetaDataCCGet,\n\t\t\t\t\t\t\t\t// Wait up to 2 minutes for each fragment request.\n\t\t\t\t\t\t\t\t// Some users try to update devices with unstable connections, where 30s can be too short.\n\t\t\t\t\t\t\t\ttimespan.minutes(2),\n\t\t\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// In some cases it can happen that the device stops requesting update frames\n\t\t\t\t\t// We need to timeout the update in this case so it can be restarted\n\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\tmessage: `Firmware update timed out`,\n\t\t\t\t\t\tdirection: \"none\",\n\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t});\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tstatus: FirmwareUpdateStatus.Error_Timeout,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// When a node requests a firmware update fragment, it must be awake\n\t\t\tthis.markAsAwake();\n\n\t\t\tif (fragmentRequest.reportNumber > numFragments) {\n\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Received Firmware Update Get for an out-of-bounds fragment. Forcing the node to abort...`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\t\tfragmentRequest.reportNumber,\n\t\t\t\t\trandomBytes(fragmentSize),\n\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t);\n\t\t\t\t// This will cause the node to abort the process, wait for that\n\t\t\t\tbreak update;\n\t\t\t}\n\n\t\t\t// Actually send the requested frames\n\t\t\trequest: for (\n\t\t\t\tlet num = fragmentRequest.reportNumber;\n\t\t\t\tnum\n\t\t\t\t\t< fragmentRequest.reportNumber\n\t\t\t\t\t\t+ fragmentRequest.numReports;\n\t\t\t\tnum++\n\t\t\t) {\n\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t// Check if the node requested more fragments than are left\n\t\t\t\tif (num > numFragments) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst fragment = data.subarray(\n\t\t\t\t\t(num - 1) * fragmentSize,\n\t\t\t\t\tnum * fragmentSize,\n\t\t\t\t);\n\n\t\t\t\tif (abortContext.abort) {\n\t\t\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\t\t\tfragmentRequest.reportNumber,\n\t\t\t\t\t\trandomBytes(fragment.length),\n\t\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t\t);\n\t\t\t\t\t// This will cause the node to abort the process, wait for that\n\t\t\t\t\tbreak update;\n\t\t\t\t} else {\n\t\t\t\t\t// Avoid queuing duplicate fragments\n\t\t\t\t\tif (this.hasPendingFirmwareUpdateFragment(num)) {\n\t\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\t\tmessage: `Firmware fragment ${num} already queued`,\n\t\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue request;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`Sending firmware fragment ${num} / ${numFragments}`,\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\t\t\t\t\tconst isLast = num === numFragments;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this\n\t\t\t\t\t\t\t.commandClasses[\"Firmware Update Meta Data\"]\n\t\t\t\t\t\t\t.withOptions({\n\t\t\t\t\t\t\t\t// Only encapsulate if the transfer is secure\n\t\t\t\t\t\t\t\tautoEncapsulate: !nonSecureTransfer,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.sendFirmwareFragment(num, isLast, fragment);\n\n\t\t\t\t\t\tonProgress(num, numFragments);\n\n\t\t\t\t\t\t// If that was the last one wait for status report from the node and restart interview\n\t\t\t\t\t\tif (isLast) {\n\t\t\t\t\t\t\tabortContext.tooLateToAbort = true;\n\t\t\t\t\t\t\tbreak update;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// When transmitting fails, simply stop responding to this request and wait for the node to re-request the fragment\n\t\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t`Failed to send firmware fragment ${num} / ${numFragments}`,\n\t\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak request;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tyield; // Give the task scheduler time to do something else\n\n\t\t// ================================\n\t\t// STEP 5:\n\t\t// Finalize the update process\n\n\t\tconst statusReport:\n\t\t\t| FirmwareUpdateMetaDataCCStatusReport\n\t\t\t| undefined = yield () =>\n\t\t\t\tthis.driver\n\t\t\t\t\t.waitForCommand(\n\t\t\t\t\t\t(cc) =>\n\t\t\t\t\t\t\tcc.nodeId === this.id\n\t\t\t\t\t\t\t&& cc\n\t\t\t\t\t\t\t\tinstanceof FirmwareUpdateMetaDataCCStatusReport,\n\t\t\t\t\t\t// Wait up to 5 minutes. It should never take that long, but the specs\n\t\t\t\t\t\t// don't say anything specific\n\t\t\t\t\t\t5 * 60000,\n\t\t\t\t\t)\n\t\t\t\t\t.catch(() => undefined);\n\n\t\tif (abortContext.abort) {\n\t\t\tabortContext.abortPromise.resolve(\n\t\t\t\tstatusReport?.status\n\t\t\t\t\t=== FirmwareUpdateStatus.Error_TransmissionFailed,\n\t\t\t);\n\t\t}\n\n\t\tif (!statusReport) {\n\t\t\tthis.driver.controllerLog.logNode(\n\t\t\t\tthis.id,\n\t\t\t\t`The node did not acknowledge the completed update`,\n\t\t\t\t\"warn\",\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tstatus: FirmwareUpdateStatus.Error_Timeout,\n\t\t\t};\n\t\t}\n\n\t\tconst { status, waitTime } = statusReport;\n\n\t\t// Actually, OK_WaitingForActivation should never happen since we don't allow\n\t\t// delayed activation in the RequestGet command\n\t\tconst success = status >= FirmwareUpdateStatus.OK_WaitingForActivation;\n\n\t\treturn {\n\t\t\tsuccess,\n\t\t\tstatus,\n\t\t\twaitTime,\n\t\t};\n\t}\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\ttype FirmwareUpdateMetaData,\n\tFirmwareUpdateMetaDataCC,\n\tFirmwareUpdateMetaDataCCGet,\n\ttype FirmwareUpdateMetaDataCCMetaDataGet,\n\tFirmwareUpdateMetaDataCCReport,\n\tFirmwareUpdateMetaDataCCRequestReport,\n\tFirmwareUpdateMetaDataCCStatusReport,\n\ttype FirmwareUpdateOptions,\n\ttype FirmwareUpdateProgress,\n\tFirmwareUpdateRequestStatus,\n\ttype FirmwareUpdateResult,\n\tFirmwareUpdateStatus,\n\tgetEffectiveCCVersion,\n} from \"@zwave-js/cc\";\nimport {\n\tCRC16_CCITT,\n\tCommandClasses,\n\tEncapsulationFlags,\n\ttype Firmware,\n\tSecurityClass,\n\tZWaveError,\n\tZWaveErrorCodes,\n\trandomBytes,\n\tsecurityClassIsS2,\n\ttimespan,\n} from \"@zwave-js/core\";\nimport { containsCC } from \"@zwave-js/serial/serialapi\";\nimport { getEnumMemberName, throttle } from \"@zwave-js/shared\";\nimport { distinct } from \"alcalzone-shared/arrays\";\nimport { wait } from \"alcalzone-shared/async\";\nimport {\n\ttype DeferredPromise,\n\tcreateDeferredPromise,\n} from \"alcalzone-shared/deferred-promise\";\nimport { roundTo } from \"alcalzone-shared/math\";\nimport {\n\ttype Task,\n\ttype TaskBuilder,\n\tTaskPriority,\n} from \"../../driver/Task.js\";\nimport { type Transaction } from \"../../driver/Transaction.js\";\nimport { SchedulePollMixin } from \"./60_ScheduledPoll.js\";\n\ninterface AbortFirmwareUpdateContext {\n\tabort: boolean;\n\ttooLateToAbort: boolean;\n\tabortPromise: DeferredPromise<boolean>;\n}\n\ntype PartialFirmwareUpdateResult =\n\t& Pick<FirmwareUpdateResult, \"status\" | \"waitTime\">\n\t& { success: boolean };\n\n/** Checks if a task belongs to a route rebuilding process */\nexport function isFirmwareUpdateOTATask(t: Task<unknown>): boolean {\n\treturn t.tag?.id === \"firmware-update-ota\";\n}\n\nexport interface NodeFirmwareUpdate {\n\t/**\n\t * Aborts an active firmware update process\n\t */\n\tabortFirmwareUpdate(): Promise<void>;\n\n\t/**\n\t * Performs an OTA firmware upgrade of one or more chips on this node.\n\t *\n\t * This method will resolve after the process has **COMPLETED**. Failure to start any one of the provided updates will throw an error.\n\t *\n\t * **WARNING: Use at your own risk! We don't take any responsibility if your devices don't work after an update.**\n\t *\n\t * @param updates An array of firmware updates that will be done in sequence\n\t *\n\t * @returns Whether all of the given updates were successful.\n\t */\n\tupdateFirmware(\n\t\tupdates: Firmware[],\n\t\toptions?: FirmwareUpdateOptions,\n\t): Promise<FirmwareUpdateResult>;\n\n\t/**\n\t * Returns whether a firmware update is in progress for this node.\n\t */\n\tisFirmwareUpdateInProgress(): boolean;\n}\n\nexport abstract class FirmwareUpdateMixin extends SchedulePollMixin\n\timplements NodeFirmwareUpdate\n{\n\tprivate _abortFirmwareUpdate: (() => Promise<void>) | undefined;\n\tpublic async abortFirmwareUpdate(): Promise<void> {\n\t\tif (!this._abortFirmwareUpdate) return;\n\t\tawait this._abortFirmwareUpdate();\n\t}\n\n\t// Stores the CRC of the previously transferred firmware image.\n\t// Allows detecting whether resuming is supported and where to continue in a multi-file transfer.\n\tprivate _previousFirmwareCRC: number | undefined;\n\n\t/** Is used to remember fragment requests that came in before they were able to be handled */\n\tprivate _firmwareUpdatePrematureRequest:\n\t\t| FirmwareUpdateMetaDataCCGet\n\t\t| undefined;\n\n\tpublic async updateFirmware(\n\t\tupdates: Firmware[],\n\t\toptions: FirmwareUpdateOptions = {},\n\t): Promise<FirmwareUpdateResult> {\n\t\tif (updates.length === 0) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`At least one update must be provided`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Check that each update has a buffer with at least 1 byte\n\t\tif (updates.some((u) => u.data.length === 0)) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`All firmware updates must have a non-empty data buffer`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Check that the targets are not duplicates\n\t\tif (\n\t\t\tdistinct(updates.map((u) => u.firmwareTarget ?? 0)).length\n\t\t\t\t!== updates.length\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The target of all provided firmware updates must be unique`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Don't start the process twice\n\t\tif (this.driver.controller.isFirmwareUpdateInProgress()) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: An OTW upgrade of the controller is in progress!`,\n\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t);\n\t\t}\n\n\t\t// Don't allow starting two firmware updates for the same node\n\t\tconst task = this.getUpdateFirmwareTask(updates, options);\n\t\tif (task instanceof Promise) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: A firmware update is already in progress for this node!`,\n\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t);\n\t\t}\n\n\t\t// Queue the task\n\t\treturn this.driver.scheduler.queueTask(task);\n\t}\n\n\tpublic isFirmwareUpdateInProgress(): boolean {\n\t\treturn !!this.driver.scheduler.findTask(isFirmwareUpdateOTATask);\n\t}\n\n\tprivate getUpdateFirmwareTask(\n\t\tupdates: Firmware[],\n\t\toptions: FirmwareUpdateOptions = {},\n\t): Promise<FirmwareUpdateResult> | TaskBuilder<FirmwareUpdateResult> {\n\t\tconst self = this;\n\n\t\t// This task should only run once at a time\n\t\tconst existingTask = this.driver.scheduler.findTask<\n\t\t\tFirmwareUpdateResult\n\t\t>((t) =>\n\t\t\tt.tag?.id === \"firmware-update-ota\"\n\t\t\t&& t.tag.nodeId === self.id\n\t\t);\n\t\tif (existingTask) return existingTask;\n\n\t\tlet keepAwake: boolean;\n\n\t\treturn {\n\t\t\t// Firmware updates cause a lot of traffic. Execute them in the background.\n\t\t\tpriority: TaskPriority.Lower,\n\t\t\ttag: { id: \"firmware-update-ota\", nodeId: self.id },\n\t\t\ttask: async function* firmwareUpdateTask() {\n\t\t\t\t// Keep battery powered nodes awake during the process\n\t\t\t\tkeepAwake = self.keepAwake;\n\t\t\t\tself.keepAwake = true;\n\n\t\t\t\t// Support aborting the update\n\t\t\t\tconst abortContext = {\n\t\t\t\t\tabort: false,\n\t\t\t\t\ttooLateToAbort: false,\n\t\t\t\t\tabortPromise: createDeferredPromise<boolean>(),\n\t\t\t\t};\n\n\t\t\t\tself._abortFirmwareUpdate = async () => {\n\t\t\t\t\tif (abortContext.tooLateToAbort) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`The firmware update was transmitted completely, cannot abort anymore.`,\n\t\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToAbort,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\tmessage: `Aborting firmware update...`,\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Trigger the abort\n\t\t\t\t\tabortContext.abort = true;\n\t\t\t\t\tconst aborted = await abortContext.abortPromise;\n\t\t\t\t\tif (!aborted) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`The node did not acknowledge the aborted update`,\n\t\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToAbort,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\tmessage: `Firmware update aborted`,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\t// Prepare the firmware update\n\t\t\t\tlet fragmentSizeSecure: number;\n\t\t\t\tlet fragmentSizeNonSecure: number;\n\t\t\t\tlet meta: FirmwareUpdateMetaData;\n\t\t\t\ttry {\n\t\t\t\t\tconst prepareResult = await self\n\t\t\t\t\t\t.prepareFirmwareUpdateInternal(\n\t\t\t\t\t\t\tupdates.map((u) => u.firmwareTarget ?? 0),\n\t\t\t\t\t\t\tabortContext,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// Handle early aborts\n\t\t\t\t\tif (abortContext.abort) {\n\t\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\tstatus: FirmwareUpdateStatus\n\t\t\t\t\t\t\t\t.Error_TransmissionFailed,\n\t\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update finished\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the firmware update was not aborted, prepareResult is definitely defined\n\t\t\t\t\t({\n\t\t\t\t\t\tfragmentSizeSecure,\n\t\t\t\t\t\tfragmentSizeNonSecure,\n\t\t\t\t\t\t...meta\n\t\t\t\t\t} = prepareResult!);\n\t\t\t\t} catch {\n\t\t\t\t\t// Not sure what the error is, but we'll label it \"transmission failed\"\n\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tstatus: FirmwareUpdateStatus.Error_TransmissionFailed,\n\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t};\n\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t// The resume and non-secure transfer features may not be supported by the node\n\t\t\t\t// If not, disable them, even though the application requested them\n\t\t\t\tif (!meta.supportsResuming) options.resume = false;\n\n\t\t\t\tconst securityClass = self.getHighestSecurityClass();\n\t\t\t\tconst isSecure = securityClass === SecurityClass.S0_Legacy\n\t\t\t\t\t|| securityClassIsS2(securityClass);\n\t\t\t\tif (!isSecure) {\n\t\t\t\t\t// The nonSecureTransfer option is only relevant for secure devices\n\t\t\t\t\toptions.nonSecureTransfer = false;\n\t\t\t\t} else if (!meta.supportsNonSecureTransfer) {\n\t\t\t\t\toptions.nonSecureTransfer = false;\n\t\t\t\t}\n\n\t\t\t\t// Throttle the progress emitter so applications can handle the load of events\n\t\t\t\tconst notifyProgress = throttle(\n\t\t\t\t\t(progress) =>\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update progress\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tprogress,\n\t\t\t\t\t\t),\n\t\t\t\t\t250,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\n\t\t\t\t// If resuming is supported and desired, try to figure out with which file to continue\n\t\t\t\tconst updatesWithChecksum = updates.map((u) => ({\n\t\t\t\t\t...u,\n\t\t\t\t\tchecksum: CRC16_CCITT(u.data),\n\t\t\t\t}));\n\t\t\t\tlet skipFinishedFiles = -1;\n\t\t\t\tlet shouldResume = options.resume\n\t\t\t\t\t&& self._previousFirmwareCRC != undefined;\n\t\t\t\tif (shouldResume) {\n\t\t\t\t\tskipFinishedFiles = updatesWithChecksum.findIndex(\n\t\t\t\t\t\t(u) => u.checksum === self._previousFirmwareCRC,\n\t\t\t\t\t);\n\t\t\t\t\tif (skipFinishedFiles === -1) shouldResume = false;\n\t\t\t\t}\n\n\t\t\t\t// Perform all firmware updates in sequence\n\t\t\t\tlet updateResult!: PartialFirmwareUpdateResult;\n\t\t\t\tlet conservativeWaitTime: number;\n\n\t\t\t\tconst totalBytes: number = updatesWithChecksum.reduce(\n\t\t\t\t\t(total, update) => total + update.data.length,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tlet sentBytesOfPreviousFiles = 0;\n\n\t\t\t\tfor (let i = 0; i < updatesWithChecksum.length; i++) {\n\t\t\t\t\tconst { firmwareTarget: target = 0, data, checksum } =\n\t\t\t\t\t\tupdatesWithChecksum[i];\n\n\t\t\t\t\tif (i < skipFinishedFiles) {\n\t\t\t\t\t\t// If we are resuming, skip this file since it was already done before\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Skipping already completed firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length})...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsentBytesOfPreviousFiles += data.length;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t`Updating firmware (part ${\n\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t} / ${updatesWithChecksum.length})...`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// For determining the initial fragment size, assume the node respects our choice.\n\t\t\t\t\t// If the node is not secure, these two values are identical anyways.\n\t\t\t\t\tlet fragmentSize = options.nonSecureTransfer\n\t\t\t\t\t\t? fragmentSizeNonSecure\n\t\t\t\t\t\t: fragmentSizeSecure;\n\n\t\t\t\t\t// Tell the node to start requesting fragments\n\t\t\t\t\tconst { resume, nonSecureTransfer } = yield* self\n\t\t\t\t\t\t.beginFirmwareUpdateInternal(\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\tmeta,\n\t\t\t\t\t\t\tfragmentSize,\n\t\t\t\t\t\t\tchecksum,\n\t\t\t\t\t\t\tshouldResume,\n\t\t\t\t\t\t\toptions.nonSecureTransfer,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// If the node did not accept non-secure transfer, revisit our choice of fragment size\n\t\t\t\t\tif (options.nonSecureTransfer && !nonSecureTransfer) {\n\t\t\t\t\t\tfragmentSize = fragmentSizeSecure;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the checksum, so we can resume if necessary\n\t\t\t\t\tself._previousFirmwareCRC = checksum;\n\n\t\t\t\t\tif (shouldResume) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Node ${\n\t\t\t\t\t\t\t\tresume ? \"accepted\" : \"did not accept\"\n\t\t\t\t\t\t\t} resuming the update...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (nonSecureTransfer) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Firmware will be transferred without encryption...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t\t// Listen for firmware update fragment requests and handle them\n\t\t\t\t\tupdateResult = yield* self.doFirmwareUpdateInternal(\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tfragmentSize,\n\t\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t\t\tabortContext,\n\t\t\t\t\t\t(fragment, total) => {\n\t\t\t\t\t\t\tconst progress: FirmwareUpdateProgress = {\n\t\t\t\t\t\t\t\tcurrentFile: i + 1,\n\t\t\t\t\t\t\t\ttotalFiles: updatesWithChecksum.length,\n\t\t\t\t\t\t\t\tsentFragments: fragment,\n\t\t\t\t\t\t\t\ttotalFragments: total,\n\t\t\t\t\t\t\t\tprogress: roundTo(\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t(sentBytesOfPreviousFiles\n\t\t\t\t\t\t\t\t\t\t\t+ Math.min(\n\t\t\t\t\t\t\t\t\t\t\t\tfragment * fragmentSize,\n\t\t\t\t\t\t\t\t\t\t\t\tdata.length,\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t/ totalBytes\n\t\t\t\t\t\t\t\t\t) * 100,\n\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tnotifyProgress(progress);\n\n\t\t\t\t\t\t\t// When this file is done, add the fragments to the total, so we can compute the total progress correctly\n\t\t\t\t\t\t\tif (fragment === total) {\n\t\t\t\t\t\t\t\tsentBytesOfPreviousFiles += data.length;\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// If we wait, wait a bit longer than the device told us, so it is actually ready to use\n\t\t\t\t\tconservativeWaitTime = self.driver\n\t\t\t\t\t\t.getConservativeWaitTimeAfterFirmwareUpdate(\n\t\t\t\t\t\t\tupdateResult.waitTime,\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (!updateResult.success) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\t\tmessage: `Firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length}) failed with status ${\n\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\tFirmwareUpdateStatus,\n\t\t\t\t\t\t\t\t\tupdateResult.status,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\t\t...updateResult,\n\t\t\t\t\t\t\twaitTime: undefined,\n\t\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update finished\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} else if (i < updatesWithChecksum.length - 1) {\n\t\t\t\t\t\t// Update succeeded, but we're not done yet\n\n\t\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\t\tmessage: `Firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length}) succeeded with status ${\n\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\tFirmwareUpdateStatus,\n\t\t\t\t\t\t\t\t\tupdateResult.status,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Continuing with next part in ${conservativeWaitTime} seconds...`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// If we've resumed the previous file, there's no need to resume the next one too\n\t\t\t\t\t\tshouldResume = false;\n\n\t\t\t\t\t\tyield () => wait(conservativeWaitTime * 1000, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// We're done. No need to resume this update\n\t\t\t\tself._previousFirmwareCRC = undefined;\n\n\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t...updateResult,\n\t\t\t\t\twaitTime: conservativeWaitTime!,\n\t\t\t\t\treInterview: true,\n\t\t\t\t};\n\n\t\t\t\t// After a successful firmware update, we want to interview sleeping nodes immediately,\n\t\t\t\t// so don't send them to sleep when they wake up\n\t\t\t\tkeepAwake = true;\n\n\t\t\t\tself._emit(\"firmware update finished\", self, result);\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tcleanup() {\n\t\t\t\tself._abortFirmwareUpdate = undefined;\n\t\t\t\tself._firmwareUpdatePrematureRequest = undefined;\n\n\t\t\t\t// Make sure that the keepAwake flag gets reset at the end\n\t\t\t\tself.keepAwake = keepAwake;\n\t\t\t\tif (!keepAwake) {\n\t\t\t\t\tsetImmediate(() => {\n\t\t\t\t\t\tself.driver.debounceSendNodeToSleep(self);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn Promise.resolve();\n\t\t\t},\n\t\t};\n\t}\n\n\t/** Prepares the firmware update of a single target by collecting the necessary information */\n\tprivate async prepareFirmwareUpdateInternal(\n\t\ttargets: number[],\n\t\tabortContext: AbortFirmwareUpdateContext,\n\t): Promise<\n\t\t| undefined\n\t\t| (FirmwareUpdateMetaData & {\n\t\t\tfragmentSizeSecure: number;\n\t\t\tfragmentSizeNonSecure: number;\n\t\t})\n\t> {\n\t\tconst api = this.commandClasses[\"Firmware Update Meta Data\"];\n\n\t\t// ================================\n\t\t// STEP 1:\n\t\t// Check if this update is possible\n\t\tconst meta = await api.getMetaData();\n\t\tif (!meta) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: The node did not respond in time!`,\n\t\t\t\tZWaveErrorCodes.Controller_NodeTimeout,\n\t\t\t);\n\t\t}\n\n\t\tfor (const target of targets) {\n\t\t\tif (target === 0) {\n\t\t\t\tif (!meta.firmwareUpgradable) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: The Z-Wave chip firmware is not upgradable!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_NotUpgradable,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (api.version < 3) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: The node does not support upgrading a different firmware target than 0!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_TargetNotFound,\n\t\t\t\t\t);\n\t\t\t\t} else if (\n\t\t\t\t\tmeta.additionalFirmwareIDs[target - 1] == undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: Firmware target #${target} not found on this node!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_TargetNotFound,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ================================\n\t\t// STEP 2:\n\t\t// Determine the fragment size\n\t\tconst fcc = new FirmwareUpdateMetaDataCC({ nodeId: this.id });\n\t\tfcc.toggleEncapsulationFlag(\n\t\t\tEncapsulationFlags.Security,\n\t\t\tthis.driver.isCCSecure(fcc.ccId, this.id),\n\t\t);\n\t\tconst maxGrossPayloadSizeSecure = this.driver\n\t\t\t.computeNetCCPayloadSize(\n\t\t\t\tfcc,\n\t\t\t);\n\t\tconst maxGrossPayloadSizeNonSecure = this.driver\n\t\t\t.computeNetCCPayloadSize(fcc, true);\n\n\t\tconst ccVersion = getEffectiveCCVersion(this.driver, fcc);\n\t\tconst maxNetPayloadSizeSecure = maxGrossPayloadSizeSecure\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\t\tconst maxNetPayloadSizeNonSecure = maxGrossPayloadSizeNonSecure\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\n\t\t// Use the smallest allowed payload\n\t\tconst fragmentSizeSecure = Math.min(\n\t\t\tmaxNetPayloadSizeSecure,\n\t\t\tmeta.maxFragmentSize ?? Number.POSITIVE_INFINITY,\n\t\t);\n\t\tconst fragmentSizeNonSecure = Math.min(\n\t\t\tmaxNetPayloadSizeNonSecure,\n\t\t\tmeta.maxFragmentSize ?? Number.POSITIVE_INFINITY,\n\t\t);\n\n\t\tif (abortContext.abort) {\n\t\t\tabortContext.abortPromise.resolve(true);\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\t...meta,\n\t\t\t\tfragmentSizeSecure,\n\t\t\t\tfragmentSizeNonSecure,\n\t\t\t};\n\t\t}\n\t}\n\n\tprotected async handleUnexpectedFirmwareUpdateGet(\n\t\tcommand: FirmwareUpdateMetaDataCCGet,\n\t): Promise<void> {\n\t\t// This method will only be called under two circumstances:\n\t\t// 1. The node is currently busy responding to a firmware update request -> remember the request\n\t\tif (this.isFirmwareUpdateInProgress()) {\n\t\t\tthis._firmwareUpdatePrematureRequest = command;\n\t\t\treturn;\n\t\t}\n\n\t\t// 2. No firmware update is in progress -> abort\n\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\tmessage:\n\t\t\t\t`Received Firmware Update Get, but no firmware update is in progress. Forcing the node to abort...`,\n\t\t\tdirection: \"inbound\",\n\t\t});\n\n\t\t// Since no update is in progress, we need to determine the fragment size again\n\t\tconst fcc = new FirmwareUpdateMetaDataCC({ nodeId: this.id });\n\t\tfcc.toggleEncapsulationFlag(\n\t\t\tEncapsulationFlags.Security,\n\t\t\t!!(command.encapsulationFlags & EncapsulationFlags.Security),\n\t\t);\n\t\tconst ccVersion = getEffectiveCCVersion(this.driver, fcc);\n\t\tconst fragmentSize = this.driver.computeNetCCPayloadSize(fcc)\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\t\tconst fragment = randomBytes(fragmentSize);\n\t\ttry {\n\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\tcommand.reportNumber,\n\t\t\t\tfragment,\n\t\t\t);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\t/** Kicks off a firmware update of a single target. Returns whether the node accepted resuming and non-secure transfer */\n\tprivate async *beginFirmwareUpdateInternal(\n\t\tdata: Uint8Array,\n\t\ttarget: number,\n\t\tmeta: FirmwareUpdateMetaData,\n\t\tfragmentSize: number,\n\t\tchecksum: number,\n\t\tresume: boolean | undefined,\n\t\tnonSecureTransfer: boolean | undefined,\n\t) {\n\t\tconst api = this.commandClasses[\"Firmware Update Meta Data\"];\n\n\t\t// ================================\n\t\t// STEP 3:\n\t\t// Start the update\n\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\tmessage: `Starting firmware update...`,\n\t\t\tdirection: \"outbound\",\n\t\t});\n\n\t\t// Request the node to start the upgrade\n\t\tawait api.requestUpdate({\n\t\t\t// TODO: Should manufacturer id and firmware id be provided externally?\n\t\t\tmanufacturerId: meta.manufacturerId,\n\t\t\tfirmwareId: target == 0\n\t\t\t\t? meta.firmwareId\n\t\t\t\t: meta.additionalFirmwareIDs[target - 1],\n\t\t\tfirmwareTarget: target,\n\t\t\tfragmentSize,\n\t\t\tchecksum,\n\t\t\tresume,\n\t\t\tnonSecureTransfer,\n\t\t});\n\t\t// Pause the task until the response is received, because that can take\n\t\t// up to a minute\n\t\tconst result: FirmwareUpdateMetaDataCCRequestReport = yield () =>\n\t\t\tthis.driver\n\t\t\t\t.waitForCommand<FirmwareUpdateMetaDataCCRequestReport>(\n\t\t\t\t\t(cc) =>\n\t\t\t\t\t\tcc instanceof FirmwareUpdateMetaDataCCRequestReport\n\t\t\t\t\t\t&& cc.nodeId === this.id,\n\t\t\t\t\t60000,\n\t\t\t\t);\n\n\t\tswitch (result.status) {\n\t\t\tcase FirmwareUpdateRequestStatus.Error_AuthenticationExpected:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: A manual authentication event (e.g. button push) was expected!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_BatteryLow:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: The battery level is too low!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus\n\t\t\t\t.Error_FirmwareUpgradeInProgress:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: A firmware upgrade is already in progress!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus\n\t\t\t\t.Error_InvalidManufacturerOrFirmwareID:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Invalid manufacturer or firmware id!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_InvalidHardwareVersion:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Invalid hardware version!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_NotUpgradable:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Firmware target #${target} is not upgradable!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_NotUpgradable,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_FragmentSizeTooLarge:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: The chosen fragment size is too large!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.OK:\n\t\t\t\t// All good, we have started!\n\t\t\t\t// Keep the node awake until the update is done.\n\t\t\t\tthis.keepAwake = true;\n\t\t}\n\n\t\treturn {\n\t\t\tresume: !!result.resume,\n\t\t\tnonSecureTransfer: !!result.nonSecureTransfer,\n\t\t};\n\t}\n\n\tprotected async handleFirmwareUpdateMetaDataGet(\n\t\tcommand: FirmwareUpdateMetaDataCCMetaDataGet,\n\t): Promise<void> {\n\t\tconst endpoint = this.getEndpoint(command.endpointIndex)\n\t\t\t?? this;\n\n\t\t// We are being queried, so the device may actually not support the CC, just control it.\n\t\t// Using the commandClasses property would throw in that case\n\t\tconst api = endpoint\n\t\t\t.createAPI(CommandClasses[\"Firmware Update Meta Data\"], false)\n\t\t\t.withOptions({\n\t\t\t\t// Answer with the same encapsulation as asked, but omit\n\t\t\t\t// Supervision as it shouldn't be used for Get-Report flows\n\t\t\t\tencapsulationFlags: command.encapsulationFlags\n\t\t\t\t\t& ~EncapsulationFlags.Supervision,\n\t\t\t});\n\n\t\t// We do not support the firmware to be upgraded.\n\t\tawait api.reportMetaData({\n\t\t\tmanufacturerId: this.driver.options.vendor?.manufacturerId\n\t\t\t\t?? 0xffff,\n\t\t\tfirmwareUpgradable: false,\n\t\t\thardwareVersion: this.driver.options.vendor?.hardwareVersion\n\t\t\t\t?? 0,\n\t\t});\n\t}\n\n\tprivate async sendCorruptedFirmwareUpdateReport(\n\t\treportNum: number,\n\t\tfragment: Uint8Array,\n\t\tnonSecureTransfer: boolean = false,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.commandClasses[\"Firmware Update Meta Data\"]\n\t\t\t\t.withOptions({\n\t\t\t\t\t// Only encapsulate if the transfer is secure\n\t\t\t\t\tautoEncapsulate: !nonSecureTransfer,\n\t\t\t\t})\n\t\t\t\t.sendFirmwareFragment(reportNum, true, fragment);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tprivate hasPendingFirmwareUpdateFragment(\n\t\tfragmentNumber: number,\n\t): boolean {\n\t\t// Avoid queuing duplicate fragments\n\t\tconst isCurrentFirmwareFragment = (t: Transaction) =>\n\t\t\tt.message.getNodeId() === this.id\n\t\t\t&& containsCC(t.message)\n\t\t\t&& t.message.command instanceof FirmwareUpdateMetaDataCCReport\n\t\t\t&& t.message.command.reportNumber === fragmentNumber;\n\n\t\treturn this.driver.hasPendingTransactions(\n\t\t\tisCurrentFirmwareFragment,\n\t\t);\n\t}\n\n\tprivate async *doFirmwareUpdateInternal(\n\t\tdata: Uint8Array,\n\t\tfragmentSize: number,\n\t\tnonSecureTransfer: boolean,\n\t\tabortContext: AbortFirmwareUpdateContext,\n\t\tonProgress: (fragment: number, total: number) => void,\n\t): AsyncGenerator<\n\t\tany,\n\t\tPartialFirmwareUpdateResult,\n\t\tany\n\t> {\n\t\tconst numFragments = Math.ceil(data.length / fragmentSize);\n\n\t\t// Make sure we're not responding to an outdated request immediately\n\t\tthis._firmwareUpdatePrematureRequest = undefined;\n\n\t\t// ================================\n\t\t// STEP 4:\n\t\t// Respond to fragment requests from the node\n\t\tupdate: while (true) {\n\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t// During ongoing firmware updates, it can happen that the next request is received before the callback for the previous response\n\t\t\t// is back. In that case we can immediately handle the premature request. Otherwise wait for the next request.\n\t\t\tlet fragmentRequest: FirmwareUpdateMetaDataCCGet;\n\t\t\tif (this._firmwareUpdatePrematureRequest) {\n\t\t\t\tfragmentRequest = this._firmwareUpdatePrematureRequest;\n\t\t\t\tthis._firmwareUpdatePrematureRequest = undefined;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tfragmentRequest = yield () =>\n\t\t\t\t\t\tthis.driver\n\t\t\t\t\t\t\t.waitForCommand<FirmwareUpdateMetaDataCCGet>(\n\t\t\t\t\t\t\t\t(cc) =>\n\t\t\t\t\t\t\t\t\tcc.nodeId === this.id\n\t\t\t\t\t\t\t\t\t&& cc\n\t\t\t\t\t\t\t\t\t\tinstanceof FirmwareUpdateMetaDataCCGet,\n\t\t\t\t\t\t\t\t// Wait up to 2 minutes for each fragment request.\n\t\t\t\t\t\t\t\t// Some users try to update devices with unstable connections, where 30s can be too short.\n\t\t\t\t\t\t\t\ttimespan.minutes(2),\n\t\t\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// In some cases it can happen that the device stops requesting update frames\n\t\t\t\t\t// We need to timeout the update in this case so it can be restarted\n\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\tmessage: `Firmware update timed out`,\n\t\t\t\t\t\tdirection: \"none\",\n\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t});\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tstatus: FirmwareUpdateStatus.Error_Timeout,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// When a node requests a firmware update fragment, it must be awake\n\t\t\tthis.markAsAwake();\n\n\t\t\tif (fragmentRequest.reportNumber > numFragments) {\n\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Received Firmware Update Get for an out-of-bounds fragment. Forcing the node to abort...`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\t\tfragmentRequest.reportNumber,\n\t\t\t\t\trandomBytes(fragmentSize),\n\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t);\n\t\t\t\t// This will cause the node to abort the process, wait for that\n\t\t\t\tbreak update;\n\t\t\t}\n\n\t\t\t// Actually send the requested frames\n\t\t\trequest: for (\n\t\t\t\tlet num = fragmentRequest.reportNumber;\n\t\t\t\tnum\n\t\t\t\t\t< fragmentRequest.reportNumber\n\t\t\t\t\t\t+ fragmentRequest.numReports;\n\t\t\t\tnum++\n\t\t\t) {\n\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t// Check if the node requested more fragments than are left\n\t\t\t\tif (num > numFragments) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst fragment = data.subarray(\n\t\t\t\t\t(num - 1) * fragmentSize,\n\t\t\t\t\tnum * fragmentSize,\n\t\t\t\t);\n\n\t\t\t\tif (abortContext.abort) {\n\t\t\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\t\t\tfragmentRequest.reportNumber,\n\t\t\t\t\t\trandomBytes(fragment.length),\n\t\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t\t);\n\t\t\t\t\t// This will cause the node to abort the process, wait for that\n\t\t\t\t\tbreak update;\n\t\t\t\t} else {\n\t\t\t\t\t// Avoid queuing duplicate fragments\n\t\t\t\t\tif (this.hasPendingFirmwareUpdateFragment(num)) {\n\t\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\t\tmessage: `Firmware fragment ${num} already queued`,\n\t\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue request;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`Sending firmware fragment ${num} / ${numFragments}`,\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\t\t\t\t\tconst isLast = num === numFragments;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this\n\t\t\t\t\t\t\t.commandClasses[\"Firmware Update Meta Data\"]\n\t\t\t\t\t\t\t.withOptions({\n\t\t\t\t\t\t\t\t// Only encapsulate if the transfer is secure\n\t\t\t\t\t\t\t\tautoEncapsulate: !nonSecureTransfer,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.sendFirmwareFragment(num, isLast, fragment);\n\n\t\t\t\t\t\tonProgress(num, numFragments);\n\n\t\t\t\t\t\t// If that was the last one wait for status report from the node and restart interview\n\t\t\t\t\t\tif (isLast) {\n\t\t\t\t\t\t\tabortContext.tooLateToAbort = true;\n\t\t\t\t\t\t\tbreak update;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// When transmitting fails, simply stop responding to this request and wait for the node to re-request the fragment\n\t\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t`Failed to send firmware fragment ${num} / ${numFragments}`,\n\t\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak request;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tyield; // Give the task scheduler time to do something else\n\n\t\t// ================================\n\t\t// STEP 5:\n\t\t// Finalize the update process\n\n\t\tconst statusReport:\n\t\t\t| FirmwareUpdateMetaDataCCStatusReport\n\t\t\t| undefined = yield () =>\n\t\t\t\tthis.driver\n\t\t\t\t\t.waitForCommand(\n\t\t\t\t\t\t(cc) =>\n\t\t\t\t\t\t\tcc.nodeId === this.id\n\t\t\t\t\t\t\t&& cc\n\t\t\t\t\t\t\t\tinstanceof FirmwareUpdateMetaDataCCStatusReport,\n\t\t\t\t\t\t// Wait up to 5 minutes. It should never take that long, but the specs\n\t\t\t\t\t\t// don't say anything specific\n\t\t\t\t\t\t5 * 60000,\n\t\t\t\t\t)\n\t\t\t\t\t.catch(() => undefined);\n\n\t\tif (abortContext.abort) {\n\t\t\tabortContext.abortPromise.resolve(\n\t\t\t\tstatusReport?.status\n\t\t\t\t\t=== FirmwareUpdateStatus.Error_TransmissionFailed,\n\t\t\t);\n\t\t}\n\n\t\tif (!statusReport) {\n\t\t\tthis.driver.controllerLog.logNode(\n\t\t\t\tthis.id,\n\t\t\t\t`The node did not acknowledge the completed update`,\n\t\t\t\t\"warn\",\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tstatus: FirmwareUpdateStatus.Error_Timeout,\n\t\t\t};\n\t\t}\n\n\t\tconst { status, waitTime } = statusReport;\n\n\t\t// Actually, OK_WaitingForActivation should never happen since we don't allow\n\t\t// delayed activation in the RequestGet command\n\t\tconst success = status >= FirmwareUpdateStatus.OK_WaitingForActivation;\n\n\t\treturn {\n\t\t\tsuccess,\n\t\t\tstatus,\n\t\t\twaitTime,\n\t\t};\n\t}\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["result"]
7
7
  }
@@ -32,17 +32,17 @@ __export(statistics_exports, {
32
32
  sendStatistics: () => sendStatistics
33
33
  });
34
34
  module.exports = __toCommonJS(statistics_exports);
35
+ var import_core = require("@zwave-js/core");
35
36
  var import_shared = require("@zwave-js/shared");
36
37
  var import_typeguards = require("alcalzone-shared/typeguards");
37
- var crypto = __toESM(require("node:crypto"), 1);
38
38
  const apiToken = "ef58278d935ccb26307800279458484d";
39
39
  const statisticsUrl = `https://stats.zwave-js.io/statistics`;
40
40
  async function compileStatistics(driver, appInfo) {
41
41
  const salt = await driver.getUUID();
42
+ const hashInput = import_shared.Bytes.from(driver.controller.homeId.toString(16) + salt);
43
+ const hash = import_shared.Bytes.view(await (0, import_core.digest)("sha-256", hashInput)).toString("hex");
42
44
  return {
43
- // Salt and hash the homeId, so it cannot easily be tracked
44
- // It is no state secret, but since we're collecting it, make sure it is anonymous
45
- id: crypto.createHash("sha256").update(driver.controller.homeId.toString(16)).update(salt).digest("hex"),
45
+ id: hash,
46
46
  ...appInfo,
47
47
  devices: [...driver.controller.nodes.values()].map((node) => ({
48
48
  manufacturerId: node.manufacturerId != void 0 ? (0, import_shared.formatId)(node.manufacturerId) : "",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/telemetry/statistics.ts"],
4
- "sourcesContent": ["import { formatId } from \"@zwave-js/shared\";\nimport { isObject } from \"alcalzone-shared/typeguards\";\nimport * as crypto from \"node:crypto\";\nimport type { Driver } from \"../driver/Driver.js\";\n\nconst apiToken = \"ef58278d935ccb26307800279458484d\";\nconst statisticsUrl = `https://stats.zwave-js.io/statistics`;\n\nexport interface AppInfo {\n\tdriverVersion: string;\n\tapplicationName: string;\n\tapplicationVersion: string;\n\tnodeVersion: string;\n\tos: NodeJS.Platform;\n\tarch: string;\n}\n\nexport async function compileStatistics(\n\tdriver: Driver,\n\tappInfo: AppInfo,\n): Promise<Record<string, any>> {\n\tconst salt = await driver.getUUID();\n\treturn {\n\t\t// Salt and hash the homeId, so it cannot easily be tracked\n\t\t// It is no state secret, but since we're collecting it, make sure it is anonymous\n\t\tid: crypto\n\t\t\t.createHash(\"sha256\")\n\t\t\t.update(driver.controller.homeId!.toString(16))\n\t\t\t.update(salt)\n\t\t\t.digest(\"hex\"),\n\t\t...appInfo,\n\t\tdevices: [...driver.controller.nodes.values()].map((node) => ({\n\t\t\tmanufacturerId: node.manufacturerId != undefined\n\t\t\t\t? formatId(node.manufacturerId)\n\t\t\t\t: \"\",\n\t\t\tproductType: node.productType != undefined\n\t\t\t\t? formatId(node.productType)\n\t\t\t\t: \"\",\n\t\t\tproductId: node.productId != undefined\n\t\t\t\t? formatId(node.productId)\n\t\t\t\t: \"\",\n\t\t\tfirmwareVersion: node.firmwareVersion ?? \"\",\n\t\t})),\n\t};\n}\n\n/**\n * Sends the statistics to the statistics backend. Returns:\n * - `true` when sending succeeded\n * - The number of seconds to wait before trying again when hitting the rate limiter\n * - `false` for any other errors\n */\nexport async function sendStatistics(\n\tstatistics: Record<string, any>,\n): Promise<boolean | number> {\n\tconst { got } = await import(\"got\");\n\n\ttry {\n\t\tconst data = await got\n\t\t\t.post(statisticsUrl, {\n\t\t\t\tjson: { data: [statistics] },\n\t\t\t\theaders: { \"x-api-token\": apiToken },\n\t\t\t})\n\t\t\t.json();\n\t\tif (isObject(data) && typeof data.success === \"boolean\") {\n\t\t\treturn data.success;\n\t\t}\n\t\treturn false;\n\t} catch (e: any) {\n\t\tif (isObject(e.response) && e.response.status === 429) {\n\t\t\t// We've hit the rate limiter. Figure out when we may try again.\n\t\t\tif (\n\t\t\t\tisObject(e.response.headers)\n\t\t\t\t&& \"retry-after\" in e.response.headers\n\t\t\t) {\n\t\t\t\tconst retryAfter = parseInt(e.response.headers[\"retry-after\"]);\n\t\t\t\tif (Number.isInteger(retryAfter)) return retryAfter;\n\t\t\t}\n\t\t}\n\t\t// didn't work, try again later\n\t\treturn false;\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;AAAA,oBAAyB;AACzB,wBAAyB;AACzB,aAAwB;AAGxB,MAAM,WAAW;AACjB,MAAM,gBAAgB;AAWtB,eAAsB,kBACrB,QACA,SAAgB;AAEhB,QAAM,OAAO,MAAM,OAAO,QAAO;AACjC,SAAO;;;IAGN,IAAI,OACF,WAAW,QAAQ,EACnB,OAAO,OAAO,WAAW,OAAQ,SAAS,EAAE,CAAC,EAC7C,OAAO,IAAI,EACX,OAAO,KAAK;IACd,GAAG;IACH,SAAS,CAAC,GAAG,OAAO,WAAW,MAAM,OAAM,CAAE,EAAE,IAAI,CAAC,UAAU;MAC7D,gBAAgB,KAAK,kBAAkB,aACpC,wBAAS,KAAK,cAAc,IAC5B;MACH,aAAa,KAAK,eAAe,aAC9B,wBAAS,KAAK,WAAW,IACzB;MACH,WAAW,KAAK,aAAa,aAC1B,wBAAS,KAAK,SAAS,IACvB;MACH,iBAAiB,KAAK,mBAAmB;MACxC;;AAEJ;AAQA,eAAsB,eACrB,YAA+B;AAE/B,QAAM,EAAE,IAAG,IAAK,MAAM,OAAO,KAAK;AAElC,MAAI;AACH,UAAM,OAAO,MAAM,IACjB,KAAK,eAAe;MACpB,MAAM,EAAE,MAAM,CAAC,UAAU,EAAC;MAC1B,SAAS,EAAE,eAAe,SAAQ;KAClC,EACA,KAAI;AACN,YAAI,4BAAS,IAAI,KAAK,OAAO,KAAK,YAAY,WAAW;AACxD,aAAO,KAAK;IACb;AACA,WAAO;EACR,SAAS,GAAQ;AAChB,YAAI,4BAAS,EAAE,QAAQ,KAAK,EAAE,SAAS,WAAW,KAAK;AAEtD,cACC,4BAAS,EAAE,SAAS,OAAO,KACxB,iBAAiB,EAAE,SAAS,SAC9B;AACD,cAAM,aAAa,SAAS,EAAE,SAAS,QAAQ,aAAa,CAAC;AAC7D,YAAI,OAAO,UAAU,UAAU;AAAG,iBAAO;MAC1C;IACD;AAEA,WAAO;EACR;AACD;",
4
+ "sourcesContent": ["import { digest } from \"@zwave-js/core\";\nimport { Bytes, formatId } from \"@zwave-js/shared\";\nimport { isObject } from \"alcalzone-shared/typeguards\";\nimport type { Driver } from \"../driver/Driver.js\";\n\nconst apiToken = \"ef58278d935ccb26307800279458484d\";\nconst statisticsUrl = `https://stats.zwave-js.io/statistics`;\n\nexport interface AppInfo {\n\tdriverVersion: string;\n\tapplicationName: string;\n\tapplicationVersion: string;\n\tnodeVersion: string;\n\tos: NodeJS.Platform;\n\tarch: string;\n}\n\nexport async function compileStatistics(\n\tdriver: Driver,\n\tappInfo: AppInfo,\n): Promise<Record<string, any>> {\n\t// Salt and hash the homeId, so it cannot easily be tracked\n\t// It is no state secret, but since we're collecting it, make sure it is anonymous\n\tconst salt = await driver.getUUID();\n\tconst hashInput = Bytes.from(driver.controller.homeId!.toString(16) + salt);\n\tconst hash = Bytes.view(await digest(\"sha-256\", hashInput)).toString(\"hex\");\n\n\treturn {\n\t\tid: hash,\n\t\t...appInfo,\n\t\tdevices: [...driver.controller.nodes.values()].map((node) => ({\n\t\t\tmanufacturerId: node.manufacturerId != undefined\n\t\t\t\t? formatId(node.manufacturerId)\n\t\t\t\t: \"\",\n\t\t\tproductType: node.productType != undefined\n\t\t\t\t? formatId(node.productType)\n\t\t\t\t: \"\",\n\t\t\tproductId: node.productId != undefined\n\t\t\t\t? formatId(node.productId)\n\t\t\t\t: \"\",\n\t\t\tfirmwareVersion: node.firmwareVersion ?? \"\",\n\t\t})),\n\t};\n}\n\n/**\n * Sends the statistics to the statistics backend. Returns:\n * - `true` when sending succeeded\n * - The number of seconds to wait before trying again when hitting the rate limiter\n * - `false` for any other errors\n */\nexport async function sendStatistics(\n\tstatistics: Record<string, any>,\n): Promise<boolean | number> {\n\tconst { got } = await import(\"got\");\n\n\ttry {\n\t\tconst data = await got\n\t\t\t.post(statisticsUrl, {\n\t\t\t\tjson: { data: [statistics] },\n\t\t\t\theaders: { \"x-api-token\": apiToken },\n\t\t\t})\n\t\t\t.json();\n\t\tif (isObject(data) && typeof data.success === \"boolean\") {\n\t\t\treturn data.success;\n\t\t}\n\t\treturn false;\n\t} catch (e: any) {\n\t\tif (isObject(e.response) && e.response.status === 429) {\n\t\t\t// We've hit the rate limiter. Figure out when we may try again.\n\t\t\tif (\n\t\t\t\tisObject(e.response.headers)\n\t\t\t\t&& \"retry-after\" in e.response.headers\n\t\t\t) {\n\t\t\t\tconst retryAfter = parseInt(e.response.headers[\"retry-after\"]);\n\t\t\t\tif (Number.isInteger(retryAfter)) return retryAfter;\n\t\t\t}\n\t\t}\n\t\t// didn't work, try again later\n\t\treturn false;\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;AAAA,kBAAuB;AACvB,oBAAgC;AAChC,wBAAyB;AAGzB,MAAM,WAAW;AACjB,MAAM,gBAAgB;AAWtB,eAAsB,kBACrB,QACA,SAAgB;AAIhB,QAAM,OAAO,MAAM,OAAO,QAAO;AACjC,QAAM,YAAY,oBAAM,KAAK,OAAO,WAAW,OAAQ,SAAS,EAAE,IAAI,IAAI;AAC1E,QAAM,OAAO,oBAAM,KAAK,UAAM,oBAAO,WAAW,SAAS,CAAC,EAAE,SAAS,KAAK;AAE1E,SAAO;IACN,IAAI;IACJ,GAAG;IACH,SAAS,CAAC,GAAG,OAAO,WAAW,MAAM,OAAM,CAAE,EAAE,IAAI,CAAC,UAAU;MAC7D,gBAAgB,KAAK,kBAAkB,aACpC,wBAAS,KAAK,cAAc,IAC5B;MACH,aAAa,KAAK,eAAe,aAC9B,wBAAS,KAAK,WAAW,IACzB;MACH,WAAW,KAAK,aAAa,aAC1B,wBAAS,KAAK,SAAS,IACvB;MACH,iBAAiB,KAAK,mBAAmB;MACxC;;AAEJ;AAQA,eAAsB,eACrB,YAA+B;AAE/B,QAAM,EAAE,IAAG,IAAK,MAAM,OAAO,KAAK;AAElC,MAAI;AACH,UAAM,OAAO,MAAM,IACjB,KAAK,eAAe;MACpB,MAAM,EAAE,MAAM,CAAC,UAAU,EAAC;MAC1B,SAAS,EAAE,eAAe,SAAQ;KAClC,EACA,KAAI;AACN,YAAI,4BAAS,IAAI,KAAK,OAAO,KAAK,YAAY,WAAW;AACxD,aAAO,KAAK;IACb;AACA,WAAO;EACR,SAAS,GAAQ;AAChB,YAAI,4BAAS,EAAE,QAAQ,KAAK,EAAE,SAAS,WAAW,KAAK;AAEtD,cACC,4BAAS,EAAE,SAAS,OAAO,KACxB,iBAAiB,EAAE,SAAS,SAC9B;AACD,cAAM,aAAa,SAAS,EAAE,SAAS,QAAQ,aAAa,CAAC;AAC7D,YAAI,OAAO,UAAU,UAAU;AAAG,iBAAO;MAC1C;IACD;AAEA,WAAO;EACR;AACD;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- export { ProtocolDataRate, ProtocolType, ProtocolVersion, Protocols, QRCodeVersion, RouteProtocolDataRate, extractFirmware, guessFirmwareFileFormat, parseQRCodeString, rssiToString, } from "@zwave-js/core";
1
+ export { ProtocolDataRate, ProtocolType, ProtocolVersion, Protocols, QRCodeVersion, RouteProtocolDataRate, extractFirmware, extractFirmwareAsync, guessFirmwareFileFormat, parseQRCodeString, rssiToString, tryUnzipFirmwareFile, } from "@zwave-js/core";
2
2
  export type { Firmware, FirmwareFileFormat, QRProvisioningInformation, protocolDataRateToString, } from "@zwave-js/core";
3
3
  export { buffer2hex, formatId, getEnumMemberName, num2hex, } from "@zwave-js/shared/safe";
4
4
  export { createDefaultBehaviors as createDefaultMockControllerBehaviors } from "./lib/controller/MockControllerBehaviors.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Utils.d.ts","sourceRoot":"","sources":["../../src/Utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,GACZ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACX,QAAQ,EACR,kBAAkB,EAClB,yBAAyB,EACzB,wBAAwB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,OAAO,GACP,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,IAAI,oCAAoC,EAAE,MAAM,6CAA6C,CAAC;AAC7H,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EACN,8BAA8B,EAC9B,gCAAgC,EAChC,2BAA2B,EAC3B,6BAA6B,EAC7B,uBAAuB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,IAAI,8BAA8B,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"Utils.d.ts","sourceRoot":"","sources":["../../src/Utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,GACpB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACX,QAAQ,EACR,kBAAkB,EAClB,yBAAyB,EACzB,wBAAwB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,OAAO,GACP,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,IAAI,oCAAoC,EAAE,MAAM,6CAA6C,CAAC;AAC7H,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EACN,8BAA8B,EAC9B,gCAAgC,EAChC,2BAA2B,EAC3B,6BAA6B,EAC7B,uBAAuB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,IAAI,8BAA8B,EAAE,MAAM,iCAAiC,CAAC"}
@@ -1,4 +1,4 @@
1
- export { ProtocolDataRate, ProtocolType, ProtocolVersion, Protocols, QRCodeVersion, RouteProtocolDataRate, extractFirmware, guessFirmwareFileFormat, parseQRCodeString, rssiToString, } from "@zwave-js/core";
1
+ export { ProtocolDataRate, ProtocolType, ProtocolVersion, Protocols, QRCodeVersion, RouteProtocolDataRate, extractFirmware, extractFirmwareAsync, guessFirmwareFileFormat, parseQRCodeString, rssiToString, tryUnzipFirmwareFile, } from "@zwave-js/core";
2
2
  export { buffer2hex, formatId, getEnumMemberName, num2hex, } from "@zwave-js/shared/safe";
3
3
  export { createDefaultBehaviors as createDefaultMockControllerBehaviors } from "./lib/controller/MockControllerBehaviors.js";
4
4
  export { driverPresets } from "./lib/driver/ZWaveOptions.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../src/Utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,GACZ,MAAM,gBAAgB,CAAC;AAOxB,OAAO,EACN,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,OAAO,GACP,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,IAAI,oCAAoC,EAAE,MAAM,6CAA6C,CAAC;AAC7H,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EACN,8BAA8B,EAC9B,gCAAgC,EAChC,2BAA2B,EAC3B,6BAA6B,EAC7B,uBAAuB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,IAAI,8BAA8B,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../src/Utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,GACpB,MAAM,gBAAgB,CAAC;AAOxB,OAAO,EACN,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,OAAO,GACP,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,IAAI,oCAAoC,EAAE,MAAM,6CAA6C,CAAC;AAC7H,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EACN,8BAA8B,EAC9B,gCAAgC,EAChC,2BAA2B,EAC3B,6BAA6B,EAC7B,uBAAuB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,IAAI,8BAA8B,EAAE,MAAM,iCAAiC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index_safe.d.ts","sourceRoot":"","sources":["../../src/index_safe.ts"],"names":[],"mappings":"AAEA,cAAc,sBAAsB,CAAC;AAErC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index_safe.d.ts","sourceRoot":"","sources":["../../src/index_safe.ts"],"names":[],"mappings":"AAGA,cAAc,sBAAsB,CAAC;AAErC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  /* @forbiddenImports external */
2
+ // eslint-disable-next-line @zwave-js/no-forbidden-imports -- FIXME: This is actually wrong, but I need to get the release done
2
3
  export * from "./Controller_safe.js";
3
4
  // export * from "./Driver";
4
5
  export * from "./Error.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index_safe.js","sourceRoot":"","sources":["../../src/index_safe.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,cAAc,sBAAsB,CAAC;AACrC,4BAA4B;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index_safe.js","sourceRoot":"","sources":["../../src/index_safe.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,+HAA+H;AAC/H,cAAc,sBAAsB,CAAC;AACrC,4BAA4B;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC"}
@@ -1,3 +1,3 @@
1
- export declare const PACKAGE_VERSION = "14.3.0";
1
+ export declare const PACKAGE_VERSION = "14.3.2";
2
2
  export declare const PACKAGE_NAME = "zwave-js";
3
3
  //# sourceMappingURL=_version.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // This file is auto-generated by the codegen maintenance script
2
- export const PACKAGE_VERSION = "14.3.0";
2
+ export const PACKAGE_VERSION = "14.3.2";
3
3
  export const PACKAGE_NAME = "zwave-js";
4
4
  //# sourceMappingURL=_version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FirmwareUpdateService.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/FirmwareUpdateService.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,QAAQ,EAMb,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EACX,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAElB,MAAM,aAAa,CAAC;AAgHrB,MAAM,WAAW,iCAAiC;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAgCD;;;GAGG;AACH,wBAAsB,2BAA2B,CAChD,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,iCAAiC,GACxC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAsD/B;AAED,wBAAsB,sBAAsB,CAC3C,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAqEnB"}
1
+ {"version":3,"file":"FirmwareUpdateService.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/FirmwareUpdateService.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,QAAQ,EAOb,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EACX,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAElB,MAAM,aAAa,CAAC;AAkHrB,MAAM,WAAW,iCAAiC;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAgCD;;;GAGG;AACH,wBAAsB,2BAA2B,CAChD,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,iCAAiC,GACxC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAsD/B;AAED,wBAAsB,sBAAsB,CAC3C,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAqEnB"}
@@ -1,6 +1,5 @@
1
- import { RFRegion, ZWaveError, ZWaveErrorCodes, extractFirmware, guessFirmwareFileFormat, } from "@zwave-js/core";
2
- import { formatId } from "@zwave-js/shared";
3
- import crypto from "node:crypto";
1
+ import { RFRegion, ZWaveError, ZWaveErrorCodes, digest, extractFirmwareAsync, guessFirmwareFileFormat, } from "@zwave-js/core";
2
+ import { Bytes, formatId } from "@zwave-js/shared";
4
3
  function serviceURL() {
5
4
  return process.env.ZWAVEJS_FW_SERVICE_URL || "https://firmware.zwave-js.io";
6
5
  }
@@ -30,10 +29,7 @@ function cleanCache() {
30
29
  async function cachedGot(config) {
31
30
  // Replaces got's built-in cache functionality because it uses Keyv internally
32
31
  // which apparently has some issues: https://github.com/zwave-js/node-zwave-js/issues/5404
33
- const hash = crypto
34
- .createHash("sha256")
35
- .update(JSON.stringify(config.json))
36
- .digest("hex");
32
+ const hash = Bytes.view(await digest("sha-256", Bytes.from(JSON.stringify(config.json)))).toString("hex");
37
33
  const cacheKey = `${config.method}:${config.url.toString()}:${hash}`;
38
34
  // Return cached requests if they are not stale yet
39
35
  if (requestCache.has(cacheKey)) {
@@ -204,11 +200,9 @@ export async function downloadFirmwareUpdate(file) {
204
200
  }
205
201
  // Extract the raw data
206
202
  const format = guessFirmwareFileFormat(filename, rawData);
207
- const firmware = extractFirmware(rawData, format);
203
+ const firmware = await extractFirmwareAsync(rawData, format);
208
204
  // Ensure the hash matches
209
- const hasher = crypto.createHash("sha256");
210
- hasher.update(firmware.data);
211
- const actualHash = hasher.digest("hex");
205
+ const actualHash = Bytes.view(await digest("sha-256", firmware.data)).toString("hex");
212
206
  if (actualHash !== expectedHash) {
213
207
  throw new ZWaveError(`Integrity check failed. Expected hash ${expectedHash}, got ${actualHash}`, ZWaveErrorCodes.FWUpdateService_IntegrityCheckFailed);
214
208
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FirmwareUpdateService.js","sourceRoot":"","sources":["../../../../src/lib/controller/FirmwareUpdateService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FirmwareUpdateService.js","sourceRoot":"","sources":["../../../../src/lib/controller/FirmwareUpdateService.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Driver.d.ts","sourceRoot":"","sources":["../../../../src/lib/driver/Driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Driver.d.ts","sourceRoot":"","sources":["../../../../src/lib/driver/Driver.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { JsonlDB } from "@alcalzone/jsonl-db";
2
2
  import { CRC16CC, CRC16CCCommandEncapsulation, CommandClass, InvalidCC, KEXFailType, MultiChannelCC, NoOperationCC, Security2CC, Security2CCCommandsSupportedGet, Security2CCCommandsSupportedReport, Security2CCMessageEncapsulation, Security2CCNonceReport, Security2Command, SecurityCC, SecurityCCCommandEncapsulation, SecurityCCCommandEncapsulationNonceGet, SecurityCCCommandsSupportedGet, SecurityCCCommandsSupportedReport, SecurityCommand, SupervisionCC, SupervisionCCReport, TransportServiceCC, TransportServiceCCFirstSegment, TransportServiceCCSegmentComplete, TransportServiceCCSegmentRequest, TransportServiceCCSegmentWait, TransportServiceTimeouts, VersionCommand, WakeUpCCNoMoreInformation, WakeUpCCValues, getImplementedVersion, isEncapsulatingCommandClass, isMultiEncapsulatingCommandClass, isTransportServiceEncapsulation, } from "@zwave-js/cc";
3
3
  import { ConfigManager } from "@zwave-js/config";
4
- import { CommandClasses, ControllerLogger, ControllerRole, ControllerStatus, Duration, EncapsulationFlags, MAX_SUPERVISION_SESSION_ID, MAX_TRANSPORT_SERVICE_SESSION_ID, MPANState, MessagePriority, NUM_NODEMASK_BYTES, NodeIDType, RFRegion, SPANState, SecurityClass, SecurityManager, SecurityManager2, SupervisionStatus, TransactionState, TransmitOptions, TransmitStatus, ZWaveError, ZWaveErrorCodes, ZWaveLogContainer, deserializeCacheValue, extractRawECDHPrivateKeySync, generateECDHKeyPairSync, getCCName, highResTimestamp, isEncapsulationCC, isLongRangeNodeId, isMissingControllerACK, isMissingControllerCallback, isMissingControllerResponse, isZWaveError, keyPairFromRawECDHPrivateKeySync, messageRecordToLines, securityClassIsS2, securityClassOrder, serializeCacheValue, stripUndefined, timespan, wasControllerReset, } from "@zwave-js/core";
4
+ import { CommandClasses, ControllerLogger, ControllerRole, ControllerStatus, Duration, EncapsulationFlags, MAX_SUPERVISION_SESSION_ID, MAX_TRANSPORT_SERVICE_SESSION_ID, MPANState, MessagePriority, NUM_NODEMASK_BYTES, NodeIDType, RFRegion, SPANState, SecurityClass, SecurityManager, SecurityManager2, SupervisionStatus, TransactionState, TransmitOptions, TransmitStatus, ZWaveError, ZWaveErrorCodes, ZWaveLogContainer, deserializeCacheValue, extractRawECDHPrivateKeySync, generateECDHKeyPairSync, getCCName, highResTimestamp, isEncapsulationCC, isLongRangeNodeId, isMissingControllerACK, isMissingControllerCallback, isMissingControllerResponse, isZWaveError, keyPairFromRawECDHPrivateKeySync, messageRecordToLines, randomBytes, securityClassIsS2, securityClassOrder, serializeCacheValue, stripUndefined, timespan, wasControllerReset, } from "@zwave-js/core";
5
5
  import { BootloaderChunkType, FunctionType, Message, MessageHeaders, MessageType, XModemMessageHeaders, ZWaveSerialMode, ZWaveSerialPort, ZWaveSerialPortBase, ZWaveSocket, getDefaultPriority, hasNodeId, isSuccessIndicator, isZWaveSerialPortImplementation, } from "@zwave-js/serial";
6
6
  import { ApplicationUpdateRequest } from "@zwave-js/serial/serialapi";
7
7
  import { SerialAPIStartedRequest, SerialAPIWakeUpReason, } from "@zwave-js/serial/serialapi";
@@ -15,7 +15,6 @@ import { distinct } from "alcalzone-shared/arrays";
15
15
  import { wait } from "alcalzone-shared/async";
16
16
  import { createDeferredPromise, } from "alcalzone-shared/deferred-promise";
17
17
  import { isArray, isObject } from "alcalzone-shared/typeguards";
18
- import { randomBytes } from "node:crypto";
19
18
  import fs from "node:fs/promises";
20
19
  import os from "node:os";
21
20
  import path from "node:path";
@@ -1589,7 +1588,7 @@ export class Driver extends TypedEventEmitter {
1589
1588
  async getUUID() {
1590
1589
  // To anonymously identify a network, we create a unique ID and use it to salt the Home ID
1591
1590
  if (!this._valueDB.has("uuid")) {
1592
- this._valueDB.set("uuid", randomBytes(32).toString("hex"));
1591
+ this._valueDB.set("uuid", Bytes.view(randomBytes(32)).toString("hex"));
1593
1592
  }
1594
1593
  const ret = this._valueDB.get("uuid");
1595
1594
  return ret;