zwave-js 14.2.0 → 14.3.0

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.
@@ -292,7 +292,7 @@ supported frequencies: ${[...this._supportedFrequencies].map(([region, name]) =>
292
292
  securityManager: destSecurityManager,
293
293
  securityManager2: destSecurityManager2,
294
294
  securityManagerLR: destSecurityManagerLR
295
- } = this.getSecurityManagers(mpdu.destinationNodeId));
295
+ } = await this.getSecurityManagers(mpdu.destinationNodeId));
296
296
  }
297
297
  const frameType = mpdu.headerType === import_core.MPDUHeaderType.Multicast ? "multicast" : destNodeId === import_core.NODE_ID_BROADCAST || destNodeId === import_core.NODE_ID_BROADCAST_LR ? "broadcast" : "singlecast";
298
298
  try {
@@ -315,7 +315,7 @@ supported frequencies: ${[...this._supportedFrequencies].map(([region, name]) =>
315
315
  capture.parsedFrame = frame;
316
316
  this.emit("frame", frame, capture.frameData);
317
317
  if (cc?.ccId === import_core.CommandClasses["Security 2"]) {
318
- const securityManagers = this.getSecurityManagers(mpdu.sourceNodeId);
318
+ const securityManagers = await this.getSecurityManagers(mpdu.sourceNodeId);
319
319
  const isLR = (0, import_core.isLongRangeNodeId)(mpdu.sourceNodeId) || (0, import_core.isLongRangeNodeId)(destNodeId);
320
320
  const senderSecurityManager = isLR ? securityManagers.securityManagerLR : securityManagers.securityManager2;
321
321
  const destSecurityManager3 = isLR ? destSecurityManagerLR : destSecurityManager2;
@@ -340,8 +340,8 @@ supported frequencies: ${[...this._supportedFrequencies].map(([region, name]) =>
340
340
  }
341
341
  }
342
342
  } else if (cc?.ccId === import_core.CommandClasses.Security && cc instanceof import_cc.SecurityCCNonceReport) {
343
- const senderSecurityManager = this.getSecurityManagers(mpdu.sourceNodeId).securityManager;
344
- const destSecurityManager3 = this.getSecurityManagers(destNodeId).securityManager;
343
+ const senderSecurityManager = (await this.getSecurityManagers(mpdu.sourceNodeId)).securityManager;
344
+ const destSecurityManager3 = (await this.getSecurityManagers(destNodeId)).securityManager;
345
345
  if (senderSecurityManager && destSecurityManager3) {
346
346
  senderSecurityManager.setNonce({
347
347
  issuer: mpdu.sourceNodeId,
@@ -449,7 +449,7 @@ supported frequencies: ${[...this._supportedFrequencies].map(([region, name]) =>
449
449
  await this.serial?.writeAsync(req.serialize());
450
450
  await this.waitForMessage((msg) => msg instanceof import_serial.ZnifferSetBaudRateResponse, 1e3);
451
451
  }
452
- getSecurityManagers(sourceNodeId) {
452
+ async getSecurityManagers(sourceNodeId) {
453
453
  if (this.securityManagers.has(sourceNodeId)) {
454
454
  return this.securityManagers.get(sourceNodeId);
455
455
  }
@@ -465,7 +465,7 @@ supported frequencies: ${[...this._supportedFrequencies].map(([region, name]) =>
465
465
  }
466
466
  let securityManager2;
467
467
  if (this._options.securityKeys && Object.keys(this._options.securityKeys).some((key) => key.startsWith("S2_") && key in import_core.SecurityClass && (0, import_core.securityClassIsS2)(import_core.SecurityClass[key]))) {
468
- securityManager2 = new import_core.SecurityManager2();
468
+ securityManager2 = await import_core.SecurityManager2.create();
469
469
  securityManager2.isDuplicateSinglecast = () => false;
470
470
  for (const secClass of [
471
471
  "S2_Unauthenticated",
@@ -475,19 +475,19 @@ supported frequencies: ${[...this._supportedFrequencies].map(([region, name]) =>
475
475
  ]) {
476
476
  const key = this._options.securityKeys[secClass];
477
477
  if (key) {
478
- securityManager2.setKey(import_core.SecurityClass[secClass], key);
478
+ await securityManager2.setKeyAsync(import_core.SecurityClass[secClass], key);
479
479
  }
480
480
  }
481
481
  }
482
482
  let securityManagerLR;
483
483
  if (this._options.securityKeysLongRange?.S2_AccessControl || this._options.securityKeysLongRange?.S2_Authenticated) {
484
- securityManagerLR = new import_core.SecurityManager2();
484
+ securityManagerLR = await import_core.SecurityManager2.create();
485
485
  securityManagerLR.isDuplicateSinglecast = () => false;
486
486
  if (this._options.securityKeysLongRange?.S2_AccessControl) {
487
- securityManagerLR.setKey(import_core.SecurityClass.S2_AccessControl, this._options.securityKeysLongRange.S2_AccessControl);
487
+ await securityManagerLR.setKeyAsync(import_core.SecurityClass.S2_AccessControl, this._options.securityKeysLongRange.S2_AccessControl);
488
488
  }
489
489
  if (this._options.securityKeysLongRange?.S2_Authenticated) {
490
- securityManagerLR.setKey(import_core.SecurityClass.S2_Authenticated, this._options.securityKeysLongRange.S2_Authenticated);
490
+ await securityManagerLR.setKeyAsync(import_core.SecurityClass.S2_Authenticated, this._options.securityKeysLongRange.S2_Authenticated);
491
491
  }
492
492
  }
493
493
  const ret = {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/zniffer/Zniffer.ts"],
4
- "sourcesContent": ["import {\n\tCommandClass,\n\tSecurity2CCMessageEncapsulation,\n\tSecurity2CCNonceGet,\n\tSecurity2CCNonceReport,\n\tSecurityCCNonceReport,\n} from \"@zwave-js/cc\";\nimport { DeviceConfig } from \"@zwave-js/config\";\nimport {\n\tCommandClasses,\n\ttype FrameType,\n\ttype LogConfig,\n\tMPDUHeaderType,\n\ttype MaybeNotKnown,\n\tNODE_ID_BROADCAST,\n\tNODE_ID_BROADCAST_LR,\n\ttype RSSI,\n\tSPANState,\n\tSecurityClass,\n\tSecurityManager,\n\tSecurityManager2,\n\ttype SecurityManagers,\n\ttype UnknownZWaveChipType,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tZWaveLogContainer,\n\tZnifferRegion,\n\tZnifferRegionLegacy,\n\tgetChipTypeAndVersion,\n\tisLongRangeNodeId,\n\tsecurityClassIsS2,\n} from \"@zwave-js/core\";\nimport { sdkVersionGte } from \"@zwave-js/core\";\nimport { type CCParsingContext, type HostIDs } from \"@zwave-js/host\";\nimport {\n\ttype ZWaveSerialPortImplementation,\n\ttype ZnifferDataMessage,\n\tZnifferFrameType,\n\tZnifferGetFrequenciesRequest,\n\tZnifferGetFrequenciesResponse,\n\tZnifferGetFrequencyInfoRequest,\n\tZnifferGetFrequencyInfoResponse,\n\tZnifferGetVersionRequest,\n\tZnifferGetVersionResponse,\n\tZnifferMessage,\n\tZnifferMessageType,\n\tZnifferSerialPort,\n\tZnifferSerialPortBase,\n\tZnifferSetBaudRateRequest,\n\tZnifferSetBaudRateResponse,\n\tZnifferSetFrequencyRequest,\n\tZnifferSetFrequencyResponse,\n\tZnifferSocket,\n\tZnifferStartRequest,\n\tZnifferStartResponse,\n\tZnifferStopRequest,\n\tZnifferStopResponse,\n\tisZWaveSerialPortImplementation,\n} from \"@zwave-js/serial\";\nimport {\n\tBytes,\n\tTypedEventEmitter,\n\tgetEnumMemberName,\n\tisEnumMember,\n\tnoop,\n\tnum2hex,\n\tpick,\n} from \"@zwave-js/shared\";\nimport {\n\ttype DeferredPromise,\n\tcreateDeferredPromise,\n} from \"alcalzone-shared/deferred-promise\";\nimport fs from \"node:fs/promises\";\nimport { type ZWaveOptions } from \"../driver/ZWaveOptions.js\";\nimport { ZnifferLogger } from \"../log/Zniffer.js\";\nimport {\n\ttype CorruptedFrame,\n\ttype Frame,\n\tbeamToFrame,\n\tmpduToFrame,\n\tparseBeamFrame,\n\tparseMPDU,\n\tznifferDataMessageToCorruptedFrame,\n} from \"./MPDU.js\";\n\nconst logo: string = `\n\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\n\u255A\u2550\u2550\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\n \u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\n \u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u255D \u2588\u2588\u2554\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588 \u2588\u2588\u2551 \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\n\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\n\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n`.trim();\n\nexport interface ZnifferEventCallbacks {\n\tready: () => void;\n\terror: (err: Error) => void;\n\tframe: (frame: Frame, rawData: Uint8Array) => void;\n\t\"corrupted frame\": (err: CorruptedFrame, rawData: Uint8Array) => void;\n}\n\nexport type ZnifferEvents = Extract<keyof ZnifferEventCallbacks, string>;\n\ninterface AwaitedThing<T> {\n\thandler: (thing: T) => void;\n\ttimeout?: NodeJS.Timeout;\n\tpredicate: (msg: T) => boolean;\n}\n\ntype AwaitedMessageEntry = AwaitedThing<ZnifferMessage>;\n\nexport interface ZnifferOptions {\n\t/**\n\t * Optional log configuration\n\t */\n\tlogConfig?: Partial<LogConfig>;\n\n\t/** Security keys for decrypting Z-Wave traffic */\n\tsecurityKeys?: ZWaveOptions[\"securityKeys\"];\n\t/** Security keys for decrypting Z-Wave Long Range traffic */\n\tsecurityKeysLongRange?: ZWaveOptions[\"securityKeysLongRange\"];\n\n\t/**\n\t * The RSSI values reported by the Zniffer are not actual RSSI values.\n\t * They can be converted to dBm, but the conversion is chip dependent and not documented for 700/800 series Zniffers.\n\t *\n\t * Set this option to `true` enable the conversion. Otherwise the raw values from the Zniffer will be used.\n\t */\n\tconvertRSSI?: boolean;\n\n\t/**\n\t * The frequency to initialize the Zniffer with. If not specified, the current setting will be kept.\n\t *\n\t * On 700/800 series Zniffers, this value matches the {@link ZnifferRegion}.\n\t *\n\t * On 400/500 series Zniffers, the value is firmware-specific.\n\t * Supported regions and their names have to be queried using the `getFrequencies` and `getFrequencyInfo(frequency)` commands.\n\t */\n\tdefaultFrequency?: number;\n\n\t/** Limit the number of frames that are kept in memory. */\n\tmaxCapturedFrames?: number;\n}\n\nfunction is700PlusSeries(\n\tchipType: string | UnknownZWaveChipType,\n): boolean {\n\tif (typeof chipType !== \"string\") {\n\t\treturn chipType.type >= 0x07;\n\t}\n\n\tconst chipTypeNumeric = getChipTypeAndVersion(chipType);\n\tif (chipTypeNumeric) {\n\t\treturn chipTypeNumeric.type >= 0x07;\n\t}\n\n\treturn false;\n}\n\nfunction tryConvertRSSI(\n\trssi: number,\n\tchipType: string | UnknownZWaveChipType,\n): number {\n\t// For 400/500 series, the conversion is documented in the Zniffer user guide.\n\t// The conversion for 700/800 series was reverse-engineered from the Zniffer firmware.\n\t// Here, we assume that only these two representations exist:\n\tif (is700PlusSeries(chipType)) {\n\t\treturn rssi * 4 - 256;\n\t} else {\n\t\treturn rssi * 1.5 - 153.5;\n\t}\n}\n\ninterface CapturedData {\n\ttimestamp: Date;\n\trawData: Uint8Array;\n\tframeData: Uint8Array;\n\tparsedFrame?: Frame | CorruptedFrame;\n}\n\nexport interface CapturedFrame {\n\ttimestamp: Date;\n\tframeData: Uint8Array;\n\tparsedFrame: Frame | CorruptedFrame;\n}\n\nexport class Zniffer extends TypedEventEmitter<ZnifferEventCallbacks> {\n\tpublic constructor(\n\t\tprivate port: string | ZWaveSerialPortImplementation,\n\t\toptions: ZnifferOptions = {},\n\t) {\n\t\tsuper();\n\n\t\t// Ensure the given serial port is valid\n\t\tif (\n\t\t\ttypeof port !== \"string\"\n\t\t\t&& !isZWaveSerialPortImplementation(port)\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The port must be a string or a valid custom serial port implementation!`,\n\t\t\t\tZWaveErrorCodes.Driver_InvalidOptions,\n\t\t\t);\n\t\t}\n\n\t\t// Initialize logging\n\t\tthis._logContainer = new ZWaveLogContainer(options.logConfig);\n\t\tthis.znifferLog = new ZnifferLogger(this, this._logContainer);\n\n\t\tthis._options = options;\n\n\t\tthis._active = false;\n\n\t\tthis.parsingContext = {\n\t\t\tgetHighestSecurityClass(\n\t\t\t\t_nodeId: number,\n\t\t\t): MaybeNotKnown<SecurityClass> {\n\t\t\t\treturn SecurityClass.S2_AccessControl;\n\t\t\t},\n\n\t\t\thasSecurityClass(\n\t\t\t\t_nodeId: number,\n\t\t\t\t_securityClass: SecurityClass,\n\t\t\t): MaybeNotKnown<boolean> {\n\t\t\t\t// We don't actually know. Attempt parsing with all security classes\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\tsetSecurityClass(\n\t\t\t\t_nodeId: number,\n\t\t\t\t_securityClass: SecurityClass,\n\t\t\t\t_granted: boolean,\n\t\t\t): void {\n\t\t\t\t// Do nothing\n\t\t\t},\n\n\t\t\tgetDeviceConfig(_nodeId: number): DeviceConfig | undefined {\n\t\t\t\t// Disable strict validation while parsing certain CCs\n\t\t\t\t// Most of this stuff isn't actually needed, only the compat flags...\n\t\t\t\treturn new DeviceConfig(\n\t\t\t\t\t\"unknown.json\",\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"UNKNOWN_MANUFACTURER\",\n\t\t\t\t\t0x0000,\n\t\t\t\t\t\"UNKNOWN_PRODUCT\",\n\t\t\t\t\t\"UNKNOWN_DESCRIPTION\",\n\t\t\t\t\t[],\n\t\t\t\t\t{\n\t\t\t\t\t\tmin: \"0.0\",\n\t\t\t\t\t\tmax: \"255.255\",\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\t// ...down here:\n\t\t\t\t\t{\n\t\t\t\t\t\tdisableStrictEntryControlDataValidation: true,\n\t\t\t\t\t\tdisableStrictMeasurementValidation: true,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate _options: ZnifferOptions;\n\n\t/** The serial port instance */\n\tprivate serial: ZnifferSerialPortBase | undefined;\n\tprivate parsingContext: Omit<\n\t\tCCParsingContext,\n\t\tkeyof HostIDs | \"sourceNodeId\" | \"frameType\" | keyof SecurityManagers\n\t>;\n\n\tprivate _destroyPromise: DeferredPromise<void> | undefined;\n\tprivate get wasDestroyed(): boolean {\n\t\treturn !!this._destroyPromise;\n\t}\n\n\tprivate _chipType: string | UnknownZWaveChipType | undefined;\n\n\tprivate _currentFrequency: number | undefined;\n\t/** The currently configured frequency */\n\tpublic get currentFrequency(): number | undefined {\n\t\treturn this._currentFrequency;\n\t}\n\n\tprivate _supportedFrequencies: Map<number, string> = new Map();\n\t/** A map of supported frequency identifiers and their names */\n\tpublic get supportedFrequencies(): ReadonlyMap<number, string> {\n\t\treturn this._supportedFrequencies;\n\t}\n\n\tprivate _logContainer: ZWaveLogContainer;\n\tprivate znifferLog: ZnifferLogger;\n\n\t/** The security managers for each node */\n\tprivate securityManagers: Map<number, {\n\t\tsecurityManager: SecurityManager | undefined;\n\t\tsecurityManager2: SecurityManager2 | undefined;\n\t\tsecurityManagerLR: SecurityManager2 | undefined;\n\t}> = new Map();\n\n\t/** A list of awaited messages */\n\tprivate awaitedMessages: AwaitedMessageEntry[] = [];\n\n\tprivate _active: boolean;\n\t/** Whether the Zniffer instance is currently capturing */\n\tpublic get active(): boolean {\n\t\treturn this._active;\n\t}\n\n\tprivate _capturedFrames: CapturedData[] = [];\n\n\t/** A list of raw captured frames that can be saved to a .zlf file later */\n\tpublic get capturedFrames(): Readonly<CapturedFrame>[] {\n\t\treturn this._capturedFrames.filter((f) => f.parsedFrame !== undefined)\n\t\t\t.map((f) => ({\n\t\t\t\ttimestamp: f.timestamp,\n\t\t\t\tframeData: f.frameData,\n\t\t\t\tparsedFrame: f.parsedFrame!,\n\t\t\t}));\n\t}\n\n\tpublic async init(): Promise<void> {\n\t\tif (this.wasDestroyed) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The Zniffer was destroyed. Create a new instance and initialize that one.\",\n\t\t\t\tZWaveErrorCodes.Driver_Destroyed,\n\t\t\t);\n\t\t}\n\n\t\t// Open the serial port\n\t\tif (typeof this.port === \"string\") {\n\t\t\tif (this.port.startsWith(\"tcp://\")) {\n\t\t\t\tconst url = new URL(this.port);\n\t\t\t\t// this.znifferLog.print(`opening serial port ${this.port}`);\n\t\t\t\tthis.serial = new ZnifferSocket(\n\t\t\t\t\t{\n\t\t\t\t\t\thost: url.hostname,\n\t\t\t\t\t\tport: parseInt(url.port),\n\t\t\t\t\t},\n\t\t\t\t\tthis._logContainer,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// this.znifferLog.print(`opening serial port ${this.port}`);\n\t\t\t\tthis.serial = new ZnifferSerialPort(\n\t\t\t\t\tthis.port,\n\t\t\t\t\tthis._logContainer,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// this.znifferLog.print(\n\t\t\t// \t\"opening serial port using the provided custom implementation\",\n\t\t\t// );\n\t\t\tthis.serial = new ZnifferSerialPortBase(\n\t\t\t\tthis.port,\n\t\t\t\tthis._logContainer,\n\t\t\t);\n\t\t}\n\t\tthis.serial\n\t\t\t.on(\"data\", this.serialport_onData.bind(this))\n\t\t\t.on(\"error\", (err) => {\n\t\t\t\tthis.emit(\"error\", err);\n\t\t\t});\n\n\t\tawait this.serial.open();\n\n\t\tthis.znifferLog.print(logo, \"info\");\n\n\t\tawait this.stop();\n\n\t\tconst versionInfo = await this.getVersion();\n\t\tthis._chipType = versionInfo.chipType;\n\t\tthis.znifferLog.print(\n\t\t\t`received Zniffer info:\n Chip type: ${\n\t\t\t\ttypeof versionInfo.chipType === \"string\"\n\t\t\t\t\t? versionInfo.chipType\n\t\t\t\t\t: `unknown (${num2hex(versionInfo.chipType.type)}, ${\n\t\t\t\t\t\tnum2hex(versionInfo.chipType.version)\n\t\t\t\t\t})`\n\t\t\t}\n Zniffer version: ${versionInfo.majorVersion}.${versionInfo.minorVersion}`,\n\t\t\t\"info\",\n\t\t);\n\n\t\tawait this.setBaudrate(0);\n\n\t\tconst freqs = await this.getFrequencies();\n\t\tthis._currentFrequency = freqs.currentFrequency;\n\t\tif (is700PlusSeries(this._chipType)) {\n\t\t\t// The frequencies match the ZnifferRegion enum\n\t\t\tfor (const freq of freqs.supportedFrequencies) {\n\t\t\t\tthis._supportedFrequencies.set(\n\t\t\t\t\tfreq,\n\t\t\t\t\tgetEnumMemberName(ZnifferRegion, freq),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// ... but there might be unknown regions. Query those from the Zniffer\n\t\t\tconst unknownRegions = freqs.supportedFrequencies.filter((f) =>\n\t\t\t\t!isEnumMember(ZnifferRegion, f)\n\t\t\t);\n\t\t\tfor (const freq of unknownRegions) {\n\t\t\t\tconst freqInfo = await this.getFrequencyInfo(freq);\n\t\t\t\tthis._supportedFrequencies.set(freq, freqInfo.frequencyName);\n\t\t\t}\n\t\t} else if (\n\t\t\t// Version 2.55+ supports querying the frequency names\n\t\t\tsdkVersionGte(\n\t\t\t\t`${versionInfo.majorVersion}.${versionInfo.minorVersion}`,\n\t\t\t\t\"2.55\",\n\t\t\t)\n\t\t) {\n\t\t\t// The frequencies are firmware-specific. Query them from the Zniffer\n\t\t\tfor (const freq of freqs.supportedFrequencies) {\n\t\t\t\tconst freqInfo = await this.getFrequencyInfo(freq);\n\t\t\t\tthis._supportedFrequencies.set(freq, freqInfo.frequencyName);\n\t\t\t}\n\t\t} else {\n\t\t\t// The frequencies match the ZnifferRegionLegacy enum, and their info cannot be queried\n\t\t\tfor (const freq of freqs.supportedFrequencies) {\n\t\t\t\tthis._supportedFrequencies.set(\n\t\t\t\t\tfreq,\n\t\t\t\t\tgetEnumMemberName(ZnifferRegionLegacy, freq),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.znifferLog.print(\n\t\t\t`received frequency info:\ncurrent frequency: ${\n\t\t\t\tthis._supportedFrequencies.get(freqs.currentFrequency)\n\t\t\t\t\t?? `unknown (${num2hex(freqs.currentFrequency)})`\n\t\t\t}\nsupported frequencies: ${\n\t\t\t\t[...this._supportedFrequencies].map(([region, name]) =>\n\t\t\t\t\t`\\n \u00B7 ${region.toString().padStart(2, \" \")}: ${name}`\n\t\t\t\t).join(\"\")\n\t\t\t}`,\n\t\t\t\"info\",\n\t\t);\n\n\t\tif (\n\t\t\ttypeof this._options.defaultFrequency === \"number\"\n\t\t\t&& freqs.currentFrequency !== this._options.defaultFrequency\n\t\t\t&& this._supportedFrequencies.has(this._options.defaultFrequency)\n\t\t) {\n\t\t\tawait this.setFrequency(this._options.defaultFrequency);\n\t\t}\n\n\t\tthis.emit(\"ready\");\n\t}\n\n\t/**\n\t * Is called when the serial port has received a Zniffer frame\n\t */\n\tprivate async serialport_onData(\n\t\tdata: Uint8Array,\n\t): Promise<void> {\n\t\tlet msg: ZnifferMessage | undefined;\n\t\ttry {\n\t\t\tmsg = ZnifferMessage.parse(data);\n\t\t} catch (e: any) {\n\t\t\tconsole.error(e);\n\t\t\treturn;\n\t\t}\n\n\t\tif (msg.type === ZnifferMessageType.Command) {\n\t\t\tthis.handleResponse(msg);\n\t\t} else {\n\t\t\tconst dataMsg = msg as ZnifferDataMessage;\n\t\t\tconst capture: CapturedData = {\n\t\t\t\ttimestamp: new Date(),\n\t\t\t\trawData: data,\n\t\t\t\tframeData: dataMsg.payload,\n\t\t\t};\n\t\t\tthis._capturedFrames.push(capture);\n\t\t\tif (\n\t\t\t\tthis._options.maxCapturedFrames != undefined\n\t\t\t\t&& this._capturedFrames.length > this._options.maxCapturedFrames\n\t\t\t) {\n\t\t\t\tthis._capturedFrames.shift();\n\t\t\t}\n\t\t\tawait this.handleDataMessage(dataMsg, capture);\n\t\t}\n\t}\n\n\t/**\n\t * Is called when a Request-type message was received\n\t */\n\tprivate handleResponse(msg: ZnifferMessage): void {\n\t\t// Check if we have a dynamic handler waiting for this message\n\t\tfor (const entry of this.awaitedMessages) {\n\t\t\tif (entry.predicate(msg)) {\n\t\t\t\t// We do\n\t\t\t\tentry.handler(msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Is called when a Request-type message was received\n\t */\n\tprivate async handleDataMessage(\n\t\tmsg: ZnifferDataMessage,\n\t\tcapture: CapturedData,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tlet convertedRSSI: RSSI | undefined;\n\t\t\tif (this._options.convertRSSI && this._chipType) {\n\t\t\t\tconvertedRSSI = tryConvertRSSI(\n\t\t\t\t\tmsg.rssiRaw,\n\t\t\t\t\tthis._chipType,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Short-circuit if we're dealing with beam frames\n\t\t\tif (\n\t\t\t\tmsg.frameType === ZnifferFrameType.BeamStart\n\t\t\t\t|| msg.frameType === ZnifferFrameType.BeamStop\n\t\t\t) {\n\t\t\t\tconst beam = parseBeamFrame(msg);\n\t\t\t\tbeam.frameInfo.rssi = convertedRSSI;\n\n\t\t\t\t// Emit the captured frame in a format that's easier to work with for applications.\n\t\t\t\tthis.znifferLog.beam(beam);\n\t\t\t\tconst frame = beamToFrame(beam);\n\t\t\t\tcapture.parsedFrame = frame;\n\t\t\t\tthis.emit(\"frame\", frame, capture.frameData);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Only handle messages with a valid checksum, expose the others as CRC errors\n\t\t\tif (!msg.checksumOK) {\n\t\t\t\tthis.znifferLog.crcError(msg);\n\t\t\t\tconst frame = znifferDataMessageToCorruptedFrame(msg);\n\t\t\t\tcapture.parsedFrame = frame;\n\t\t\t\tthis.emit(\"corrupted frame\", frame, capture.frameData);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst mpdu = parseMPDU(msg);\n\t\t\tmpdu.frameInfo.rssi = convertedRSSI;\n\n\t\t\t// Try to decode the CC while assuming the role of the receiver\n\t\t\tlet destSecurityManager: SecurityManager | undefined;\n\t\t\tlet destSecurityManager2: SecurityManager2 | undefined;\n\t\t\tlet destSecurityManagerLR: SecurityManager2 | undefined;\n\t\t\t// Only frames with a destination node id contains something that requires access to the own node ID\n\t\t\tlet destNodeId = 0xff;\n\n\t\t\tlet cc: CommandClass | undefined;\n\n\t\t\t// FIXME: Cache data => parsed CC, so we can understand re-transmitted S2 frames\n\n\t\t\tif (\n\t\t\t\tmpdu.payload.length > 0\n\t\t\t\t&& mpdu.headerType !== MPDUHeaderType.Acknowledgement\n\t\t\t) {\n\t\t\t\tif (\"destinationNodeId\" in mpdu) {\n\t\t\t\t\tdestNodeId = mpdu.destinationNodeId;\n\t\t\t\t\t({\n\t\t\t\t\t\tsecurityManager: destSecurityManager,\n\t\t\t\t\t\tsecurityManager2: destSecurityManager2,\n\t\t\t\t\t\tsecurityManagerLR: destSecurityManagerLR,\n\t\t\t\t\t} = this.getSecurityManagers(mpdu.destinationNodeId));\n\t\t\t\t}\n\n\t\t\t\t// TODO: Support parsing multicast S2 frames\n\t\t\t\tconst frameType: FrameType =\n\t\t\t\t\tmpdu.headerType === MPDUHeaderType.Multicast\n\t\t\t\t\t\t? \"multicast\"\n\t\t\t\t\t\t: (destNodeId === NODE_ID_BROADCAST\n\t\t\t\t\t\t\t\t|| destNodeId === NODE_ID_BROADCAST_LR)\n\t\t\t\t\t\t? \"broadcast\"\n\t\t\t\t\t\t: \"singlecast\";\n\t\t\t\ttry {\n\t\t\t\t\tcc = await CommandClass.parseAsync(\n\t\t\t\t\t\tmpdu.payload,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thomeId: mpdu.homeId,\n\t\t\t\t\t\t\townNodeId: destNodeId,\n\t\t\t\t\t\t\tsourceNodeId: mpdu.sourceNodeId,\n\t\t\t\t\t\t\tframeType,\n\t\t\t\t\t\t\tsecurityManager: destSecurityManager,\n\t\t\t\t\t\t\tsecurityManager2: destSecurityManager2,\n\t\t\t\t\t\t\tsecurityManagerLR: destSecurityManagerLR,\n\t\t\t\t\t\t\t...this.parsingContext,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\t// Ignore\n\t\t\t\t\tconsole.error(e.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.znifferLog.mpdu(mpdu, cc);\n\n\t\t\t// Emit the captured frame in a format that's easier to work with for applications.\n\t\t\tconst frame = mpduToFrame(mpdu, cc);\n\t\t\tcapture.parsedFrame = frame;\n\t\t\tthis.emit(\"frame\", frame, capture.frameData);\n\n\t\t\t// Update the security managers when nonces are exchanged, so we can\n\t\t\t// decrypt the communication\n\t\t\tif (cc?.ccId === CommandClasses[\"Security 2\"]) {\n\t\t\t\tconst securityManagers = this.getSecurityManagers(\n\t\t\t\t\tmpdu.sourceNodeId,\n\t\t\t\t);\n\t\t\t\tconst isLR = isLongRangeNodeId(mpdu.sourceNodeId)\n\t\t\t\t\t|| isLongRangeNodeId(destNodeId);\n\t\t\t\tconst senderSecurityManager = isLR\n\t\t\t\t\t? securityManagers.securityManagerLR\n\t\t\t\t\t: securityManagers.securityManager2;\n\t\t\t\tconst destSecurityManager = isLR\n\t\t\t\t\t? destSecurityManagerLR\n\t\t\t\t\t: destSecurityManager2;\n\n\t\t\t\tif (senderSecurityManager && destSecurityManager) {\n\t\t\t\t\tif (cc instanceof Security2CCNonceGet) {\n\t\t\t\t\t\t// Nonce Get -> all nonces are now invalid\n\t\t\t\t\t\tsenderSecurityManager.deleteNonce(destNodeId);\n\t\t\t\t\t\tdestSecurityManager.deleteNonce(mpdu.sourceNodeId);\n\t\t\t\t\t} else if (cc instanceof Security2CCNonceReport && cc.SOS) {\n\t\t\t\t\t\t// Nonce Report (SOS) -> We only know the receiver's nonce\n\t\t\t\t\t\tsenderSecurityManager.setSPANState(destNodeId, {\n\t\t\t\t\t\t\ttype: SPANState.LocalEI,\n\t\t\t\t\t\t\treceiverEI: cc.receiverEI!,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdestSecurityManager.storeRemoteEI(\n\t\t\t\t\t\t\tmpdu.sourceNodeId,\n\t\t\t\t\t\t\tcc.receiverEI!,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (cc instanceof Security2CCMessageEncapsulation) {\n\t\t\t\t\t\tconst senderEI = cc.getSenderEI();\n\t\t\t\t\t\tif (senderEI) {\n\t\t\t\t\t\t\t// The receiver should now have a valid SPAN state, since decoding the S2 CC updates it.\n\t\t\t\t\t\t\t// The security manager for the sender however, does not. Therefore, update it manually,\n\t\t\t\t\t\t\t// if the receiver SPAN is indeed valid.\n\n\t\t\t\t\t\t\tconst receiverSPANState = destSecurityManager\n\t\t\t\t\t\t\t\t.getSPANState(mpdu.sourceNodeId);\n\t\t\t\t\t\t\tif (receiverSPANState.type === SPANState.SPAN) {\n\t\t\t\t\t\t\t\tsenderSecurityManager.setSPANState(\n\t\t\t\t\t\t\t\t\tdestNodeId,\n\t\t\t\t\t\t\t\t\treceiverSPANState,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tcc?.ccId === CommandClasses.Security\n\t\t\t\t&& cc instanceof SecurityCCNonceReport\n\t\t\t) {\n\t\t\t\tconst senderSecurityManager =\n\t\t\t\t\tthis.getSecurityManagers(mpdu.sourceNodeId).securityManager;\n\t\t\t\tconst destSecurityManager =\n\t\t\t\t\tthis.getSecurityManagers(destNodeId).securityManager;\n\n\t\t\t\tif (senderSecurityManager && destSecurityManager) {\n\t\t\t\t\t// Both nodes have a shared nonce now\n\t\t\t\t\tsenderSecurityManager.setNonce(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tissuer: mpdu.sourceNodeId,\n\t\t\t\t\t\t\tnonceId: senderSecurityManager.getNonceId(\n\t\t\t\t\t\t\t\tcc.nonce,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnonce: cc.nonce,\n\t\t\t\t\t\t\treceiver: destNodeId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ free: true },\n\t\t\t\t\t);\n\n\t\t\t\t\tdestSecurityManager.setNonce(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tissuer: mpdu.sourceNodeId,\n\t\t\t\t\t\t\tnonceId: senderSecurityManager.getNonceId(\n\t\t\t\t\t\t\t\tcc.nonce,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnonce: cc.nonce,\n\t\t\t\t\t\t\treceiver: destNodeId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ free: true },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n\n\t/**\n\t * Waits until a certain serial message is received or a timeout has elapsed. Returns the received message.\n\t * @param timeout The number of milliseconds to wait. If the timeout elapses, the returned promise will be rejected\n\t * @param predicate A predicate function to test all incoming messages.\n\t */\n\tprivate waitForMessage<T extends ZnifferMessage>(\n\t\tpredicate: (msg: ZnifferMessage) => boolean,\n\t\ttimeout: number,\n\t): Promise<T> {\n\t\treturn new Promise<T>((resolve, reject) => {\n\t\t\tconst promise = createDeferredPromise<ZnifferMessage>();\n\t\t\tconst entry: AwaitedMessageEntry = {\n\t\t\t\tpredicate,\n\t\t\t\thandler: (msg) => promise.resolve(msg),\n\t\t\t\ttimeout: undefined,\n\t\t\t};\n\t\t\tthis.awaitedMessages.push(entry);\n\t\t\tconst removeEntry = () => {\n\t\t\t\tif (entry.timeout) clearTimeout(entry.timeout);\n\t\t\t\tconst index = this.awaitedMessages.indexOf(entry);\n\t\t\t\tif (index !== -1) this.awaitedMessages.splice(index, 1);\n\t\t\t};\n\t\t\t// When the timeout elapses, remove the wait entry and reject the returned Promise\n\t\t\tentry.timeout = setTimeout(() => {\n\t\t\t\tremoveEntry();\n\t\t\t\treject(\n\t\t\t\t\tnew ZWaveError(\n\t\t\t\t\t\t`Received no matching message within the provided timeout!`,\n\t\t\t\t\t\tZWaveErrorCodes.Controller_Timeout,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}, timeout);\n\t\t\t// When the promise is resolved, remove the wait entry and resolve the returned Promise\n\t\t\tvoid promise.then((cc) => {\n\t\t\t\tremoveEntry();\n\t\t\t\tresolve(cc as T);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async getVersion() {\n\t\tconst req = new ZnifferGetVersionRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<ZnifferGetVersionResponse>(\n\t\t\t(msg) => msg instanceof ZnifferGetVersionResponse,\n\t\t\t1000,\n\t\t);\n\n\t\treturn pick(res, [\"chipType\", \"majorVersion\", \"minorVersion\"]);\n\t}\n\n\tprivate async getFrequencies() {\n\t\tconst req = new ZnifferGetFrequenciesRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<ZnifferGetFrequenciesResponse>(\n\t\t\t(msg) => msg instanceof ZnifferGetFrequenciesResponse,\n\t\t\t1000,\n\t\t);\n\n\t\treturn pick(res, [\n\t\t\t\"currentFrequency\",\n\t\t\t\"supportedFrequencies\",\n\t\t]);\n\t}\n\n\tpublic async setFrequency(frequency: number): Promise<void> {\n\t\tconst req = new ZnifferSetFrequencyRequest({ frequency });\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tawait this.waitForMessage<ZnifferSetFrequencyResponse>(\n\t\t\t(msg) => msg instanceof ZnifferSetFrequencyResponse,\n\t\t\t1000,\n\t\t);\n\t\tthis._currentFrequency = frequency;\n\t}\n\n\tprivate async getFrequencyInfo(frequency: number) {\n\t\tconst req = new ZnifferGetFrequencyInfoRequest({ frequency });\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<ZnifferGetFrequencyInfoResponse>(\n\t\t\t(msg) =>\n\t\t\t\tmsg instanceof ZnifferGetFrequencyInfoResponse\n\t\t\t\t&& msg.frequency === frequency,\n\t\t\t1000,\n\t\t);\n\n\t\treturn pick(res, [\"numChannels\", \"frequencyName\"]);\n\t}\n\n\t/** Starts the capture and discards all previously captured frames */\n\tpublic async start(): Promise<void> {\n\t\tif (this.wasDestroyed) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The Zniffer is not ready or has been destroyed\",\n\t\t\t\tZWaveErrorCodes.Driver_NotReady,\n\t\t\t);\n\t\t}\n\n\t\tif (this._active) return;\n\t\tthis._capturedFrames = [];\n\t\tthis._active = true;\n\n\t\tconst req = new ZnifferStartRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tawait this.waitForMessage<ZnifferStartResponse>(\n\t\t\t(msg) => msg instanceof ZnifferStartResponse,\n\t\t\t1000,\n\t\t);\n\t}\n\n\tpublic async stop(): Promise<void> {\n\t\tif (!this._active) return;\n\t\tthis._active = false;\n\n\t\tif (!this.serial) return;\n\n\t\tconst req = new ZnifferStopRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tawait this.waitForMessage<ZnifferStopResponse>(\n\t\t\t(msg) => msg instanceof ZnifferStopResponse,\n\t\t\t1000,\n\t\t);\n\t}\n\n\tprivate async setBaudrate(baudrate: 0): Promise<void> {\n\t\tconst req = new ZnifferSetBaudRateRequest({ baudrate });\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tawait this.waitForMessage<ZnifferSetBaudRateResponse>(\n\t\t\t(msg) => msg instanceof ZnifferSetBaudRateResponse,\n\t\t\t1000,\n\t\t);\n\t}\n\n\tprivate getSecurityManagers(\n\t\tsourceNodeId: number,\n\t) {\n\t\tif (this.securityManagers.has(sourceNodeId)) {\n\t\t\treturn this.securityManagers.get(sourceNodeId)!;\n\t\t}\n\t\t// Initialize security\n\t\t// Set up the S0 security manager. We can only do that after the controller\n\t\t// interview because we need to know the controller node id.\n\t\tconst S0Key = this._options.securityKeys?.S0_Legacy;\n\t\tlet securityManager: SecurityManager | undefined;\n\t\tif (S0Key) {\n\t\t\t// this.znifferLog.print(\n\t\t\t// \t\"Network key for S0 configured, enabling S0 security manager...\",\n\t\t\t// );\n\t\t\tsecurityManager = new SecurityManager({\n\t\t\t\tnetworkKey: S0Key,\n\t\t\t\t// FIXME: Track nonces separately for each destination node\n\t\t\t\townNodeId: sourceNodeId,\n\t\t\t\tnonceTimeout: Number.POSITIVE_INFINITY,\n\t\t\t});\n\t\t\t// } else {\n\t\t\t// \tthis.znifferLog.print(\n\t\t\t// \t\t\"No network key for S0 configured, cannot decrypt communication from secure (S0) devices!\",\n\t\t\t// \t\t\"warn\",\n\t\t\t// \t);\n\t\t}\n\n\t\tlet securityManager2: SecurityManager2 | undefined;\n\t\tif (\n\t\t\tthis._options.securityKeys\n\t\t\t// Only set it up if we have security keys for at least one S2 security class\n\t\t\t&& Object.keys(this._options.securityKeys).some(\n\t\t\t\t(key) =>\n\t\t\t\t\tkey.startsWith(\"S2_\")\n\t\t\t\t\t&& key in SecurityClass\n\t\t\t\t\t&& securityClassIsS2((SecurityClass as any)[key]),\n\t\t\t)\n\t\t) {\n\t\t\t// this.znifferLog.print(\n\t\t\t// \t\"At least one network key for S2 configured, enabling S2 security manager...\",\n\t\t\t// );\n\t\t\tsecurityManager2 = new SecurityManager2();\n\t\t\t// Small hack: Zniffer does not care about S2 duplicates\n\t\t\tsecurityManager2.isDuplicateSinglecast = () => false;\n\n\t\t\t// Set up all keys\n\t\t\tfor (\n\t\t\t\tconst secClass of [\n\t\t\t\t\t\"S2_Unauthenticated\",\n\t\t\t\t\t\"S2_Authenticated\",\n\t\t\t\t\t\"S2_AccessControl\",\n\t\t\t\t\t\"S0_Legacy\",\n\t\t\t\t] as const\n\t\t\t) {\n\t\t\t\tconst key = this._options.securityKeys[secClass];\n\t\t\t\tif (key) {\n\t\t\t\t\tsecurityManager2.setKey(SecurityClass[secClass], key);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// } else {\n\t\t\t// \tthis.znifferLog.print(\n\t\t\t// \t\t\"No network key for S2 configured, cannot decrypt communication from secure (S2) devices!\",\n\t\t\t// \t\t\"warn\",\n\t\t\t// \t);\n\t\t}\n\n\t\tlet securityManagerLR: SecurityManager2 | undefined;\n\t\tif (\n\t\t\tthis._options.securityKeysLongRange?.S2_AccessControl\n\t\t\t|| this._options.securityKeysLongRange?.S2_Authenticated\n\t\t) {\n\t\t\t// this.znifferLog.print(\n\t\t\t// \t\"At least one network key for Z-Wave Long Range configured, enabling security manager...\",\n\t\t\t// );\n\t\t\tsecurityManagerLR = new SecurityManager2();\n\t\t\t// Small hack: Zniffer does not care about S2 duplicates\n\t\t\tsecurityManagerLR.isDuplicateSinglecast = () => false;\n\n\t\t\t// Set up all keys\n\t\t\tif (this._options.securityKeysLongRange?.S2_AccessControl) {\n\t\t\t\tsecurityManagerLR.setKey(\n\t\t\t\t\tSecurityClass.S2_AccessControl,\n\t\t\t\t\tthis._options.securityKeysLongRange.S2_AccessControl,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (this._options.securityKeysLongRange?.S2_Authenticated) {\n\t\t\t\tsecurityManagerLR.setKey(\n\t\t\t\t\tSecurityClass.S2_Authenticated,\n\t\t\t\t\tthis._options.securityKeysLongRange.S2_Authenticated,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// } else {\n\t\t\t// \tthis.znifferLog.print(\n\t\t\t// \t\t\"No network key for Z-Wave Long Range configured, cannot decrypt Long Range communication!\",\n\t\t\t// \t\t\"warn\",\n\t\t\t// \t);\n\t\t}\n\n\t\tconst ret = {\n\t\t\tsecurityManager,\n\t\t\tsecurityManager2,\n\t\t\tsecurityManagerLR,\n\t\t};\n\t\tthis.securityManagers.set(sourceNodeId, ret);\n\t\treturn ret;\n\t}\n\n\t/** Clears the list of captured frames */\n\tpublic clearCapturedFrames(): void {\n\t\tthis._capturedFrames = [];\n\t}\n\n\t/**\n\t * Get the captured frames in the official Zniffer application format.\n\t * @param frameFilter Optional predicate function to filter the frames included in the capture\n\t */\n\tpublic getCaptureAsZLFBuffer(\n\t\tframeFilter?: (frame: CapturedFrame) => boolean,\n\t): Uint8Array {\n\t\t// Mimics the current Zniffer software, without using features like sessions and comments\n\t\tconst header = new Bytes(2048).fill(0);\n\t\theader[0] = 0x68; // zniffer version\n\t\theader.writeUInt16BE(0x2312, 0x07fe); // checksum\n\t\tlet filteredFrames = this._capturedFrames;\n\t\tif (frameFilter) {\n\t\t\tfilteredFrames = filteredFrames.filter((f) =>\n\t\t\t\t// Always include Zniffer-protocol frames\n\t\t\t\tf.parsedFrame == undefined\n\t\t\t\t// Apply the filter to all other frames\n\t\t\t\t|| frameFilter({\n\t\t\t\t\tframeData: f.frameData,\n\t\t\t\t\tparsedFrame: f.parsedFrame,\n\t\t\t\t\ttimestamp: f.timestamp,\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t\treturn Bytes.concat([\n\t\t\theader,\n\t\t\t...filteredFrames.map(captureToZLFEntry),\n\t\t]);\n\t}\n\n\t/**\n\t * Saves the captured frames in a `.zlf` file that can be read by the official Zniffer application.\n\t * @param frameFilter Optional predicate function to filter the frames included in the capture\n\t */\n\tpublic async saveCaptureToFile(\n\t\tfilePath: string,\n\t\tframeFilter?: (frame: CapturedFrame) => boolean,\n\t): Promise<void> {\n\t\tawait fs.writeFile(filePath, this.getCaptureAsZLFBuffer(frameFilter));\n\t}\n\n\t/**\n\t * Terminates the Zniffer instance and closes the underlying serial connection.\n\t * Must be called under any circumstances.\n\t */\n\tpublic async destroy(): Promise<void> {\n\t\t// Ensure this is only called once and all subsequent calls block\n\t\tif (this._destroyPromise) return this._destroyPromise;\n\t\tthis._destroyPromise = createDeferredPromise();\n\n\t\tthis.znifferLog.print(\"Destroying Zniffer instance...\");\n\n\t\tif (this._active) {\n\t\t\tawait this.stop().catch(noop);\n\t\t}\n\n\t\tif (this.serial != undefined) {\n\t\t\t// Avoid spewing errors if the port was in the middle of receiving something\n\t\t\tthis.serial.removeAllListeners();\n\t\t\tif (this.serial.isOpen) await this.serial.close();\n\t\t\tthis.serial = undefined;\n\t\t}\n\n\t\tthis.znifferLog.print(\"Zniffer instance destroyed\");\n\n\t\t// destroy loggers as the very last thing\n\t\tthis._logContainer.destroy();\n\n\t\tthis._destroyPromise.resolve();\n\t}\n}\n\nfunction captureToZLFEntry(\n\tcapture: CapturedData,\n): Uint8Array {\n\tconst buffer = new Bytes(14 + capture.rawData.length).fill(0);\n\t// Convert the date to a .NET datetime\n\tlet ticks = BigInt(capture.timestamp.getTime()) * 10000n\n\t\t+ 621355968000000000n;\n\tticks = ticks | 4000000000000000n; // marks the time as .NET DateTimeKind.Local\n\n\tbuffer.writeBigUInt64LE(ticks, 0);\n\tconst direction = 0b0000_0000; // inbound, outbound would be 0b1000_0000\n\n\tbuffer[8] = direction | 0x01; // dir + session ID\n\tbuffer[9] = capture.rawData.length;\n\t// bytes 10-12 are empty\n\tbuffer.set(capture.rawData, 13);\n\tbuffer[buffer.length - 1] = 0xfe; // end of frame\n\treturn buffer;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\tCommandClass,\n\tSecurity2CCMessageEncapsulation,\n\tSecurity2CCNonceGet,\n\tSecurity2CCNonceReport,\n\tSecurityCCNonceReport,\n} from \"@zwave-js/cc\";\nimport { DeviceConfig } from \"@zwave-js/config\";\nimport {\n\tCommandClasses,\n\ttype FrameType,\n\ttype LogConfig,\n\tMPDUHeaderType,\n\ttype MaybeNotKnown,\n\tNODE_ID_BROADCAST,\n\tNODE_ID_BROADCAST_LR,\n\ttype RSSI,\n\tSPANState,\n\tSecurityClass,\n\tSecurityManager,\n\tSecurityManager2,\n\ttype SecurityManagers,\n\ttype UnknownZWaveChipType,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tZWaveLogContainer,\n\tZnifferRegion,\n\tZnifferRegionLegacy,\n\tgetChipTypeAndVersion,\n\tisLongRangeNodeId,\n\tsecurityClassIsS2,\n} from \"@zwave-js/core\";\nimport { sdkVersionGte } from \"@zwave-js/core\";\nimport { type CCParsingContext, type HostIDs } from \"@zwave-js/host\";\nimport {\n\ttype ZWaveSerialPortImplementation,\n\ttype ZnifferDataMessage,\n\tZnifferFrameType,\n\tZnifferGetFrequenciesRequest,\n\tZnifferGetFrequenciesResponse,\n\tZnifferGetFrequencyInfoRequest,\n\tZnifferGetFrequencyInfoResponse,\n\tZnifferGetVersionRequest,\n\tZnifferGetVersionResponse,\n\tZnifferMessage,\n\tZnifferMessageType,\n\tZnifferSerialPort,\n\tZnifferSerialPortBase,\n\tZnifferSetBaudRateRequest,\n\tZnifferSetBaudRateResponse,\n\tZnifferSetFrequencyRequest,\n\tZnifferSetFrequencyResponse,\n\tZnifferSocket,\n\tZnifferStartRequest,\n\tZnifferStartResponse,\n\tZnifferStopRequest,\n\tZnifferStopResponse,\n\tisZWaveSerialPortImplementation,\n} from \"@zwave-js/serial\";\nimport {\n\tBytes,\n\tTypedEventEmitter,\n\tgetEnumMemberName,\n\tisEnumMember,\n\tnoop,\n\tnum2hex,\n\tpick,\n} from \"@zwave-js/shared\";\nimport {\n\ttype DeferredPromise,\n\tcreateDeferredPromise,\n} from \"alcalzone-shared/deferred-promise\";\nimport fs from \"node:fs/promises\";\nimport { type ZWaveOptions } from \"../driver/ZWaveOptions.js\";\nimport { ZnifferLogger } from \"../log/Zniffer.js\";\nimport {\n\ttype CorruptedFrame,\n\ttype Frame,\n\tbeamToFrame,\n\tmpduToFrame,\n\tparseBeamFrame,\n\tparseMPDU,\n\tznifferDataMessageToCorruptedFrame,\n} from \"./MPDU.js\";\n\nconst logo: string = `\n\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\n\u255A\u2550\u2550\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\n \u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\n \u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u255D \u2588\u2588\u2554\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588 \u2588\u2588\u2551 \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\n\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\n\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n`.trim();\n\nexport interface ZnifferEventCallbacks {\n\tready: () => void;\n\terror: (err: Error) => void;\n\tframe: (frame: Frame, rawData: Uint8Array) => void;\n\t\"corrupted frame\": (err: CorruptedFrame, rawData: Uint8Array) => void;\n}\n\nexport type ZnifferEvents = Extract<keyof ZnifferEventCallbacks, string>;\n\ninterface AwaitedThing<T> {\n\thandler: (thing: T) => void;\n\ttimeout?: NodeJS.Timeout;\n\tpredicate: (msg: T) => boolean;\n}\n\ntype AwaitedMessageEntry = AwaitedThing<ZnifferMessage>;\n\nexport interface ZnifferOptions {\n\t/**\n\t * Optional log configuration\n\t */\n\tlogConfig?: Partial<LogConfig>;\n\n\t/** Security keys for decrypting Z-Wave traffic */\n\tsecurityKeys?: ZWaveOptions[\"securityKeys\"];\n\t/** Security keys for decrypting Z-Wave Long Range traffic */\n\tsecurityKeysLongRange?: ZWaveOptions[\"securityKeysLongRange\"];\n\n\t/**\n\t * The RSSI values reported by the Zniffer are not actual RSSI values.\n\t * They can be converted to dBm, but the conversion is chip dependent and not documented for 700/800 series Zniffers.\n\t *\n\t * Set this option to `true` enable the conversion. Otherwise the raw values from the Zniffer will be used.\n\t */\n\tconvertRSSI?: boolean;\n\n\t/**\n\t * The frequency to initialize the Zniffer with. If not specified, the current setting will be kept.\n\t *\n\t * On 700/800 series Zniffers, this value matches the {@link ZnifferRegion}.\n\t *\n\t * On 400/500 series Zniffers, the value is firmware-specific.\n\t * Supported regions and their names have to be queried using the `getFrequencies` and `getFrequencyInfo(frequency)` commands.\n\t */\n\tdefaultFrequency?: number;\n\n\t/** Limit the number of frames that are kept in memory. */\n\tmaxCapturedFrames?: number;\n}\n\nfunction is700PlusSeries(\n\tchipType: string | UnknownZWaveChipType,\n): boolean {\n\tif (typeof chipType !== \"string\") {\n\t\treturn chipType.type >= 0x07;\n\t}\n\n\tconst chipTypeNumeric = getChipTypeAndVersion(chipType);\n\tif (chipTypeNumeric) {\n\t\treturn chipTypeNumeric.type >= 0x07;\n\t}\n\n\treturn false;\n}\n\nfunction tryConvertRSSI(\n\trssi: number,\n\tchipType: string | UnknownZWaveChipType,\n): number {\n\t// For 400/500 series, the conversion is documented in the Zniffer user guide.\n\t// The conversion for 700/800 series was reverse-engineered from the Zniffer firmware.\n\t// Here, we assume that only these two representations exist:\n\tif (is700PlusSeries(chipType)) {\n\t\treturn rssi * 4 - 256;\n\t} else {\n\t\treturn rssi * 1.5 - 153.5;\n\t}\n}\n\ninterface CapturedData {\n\ttimestamp: Date;\n\trawData: Uint8Array;\n\tframeData: Uint8Array;\n\tparsedFrame?: Frame | CorruptedFrame;\n}\n\nexport interface CapturedFrame {\n\ttimestamp: Date;\n\tframeData: Uint8Array;\n\tparsedFrame: Frame | CorruptedFrame;\n}\n\nexport class Zniffer extends TypedEventEmitter<ZnifferEventCallbacks> {\n\tpublic constructor(\n\t\tprivate port: string | ZWaveSerialPortImplementation,\n\t\toptions: ZnifferOptions = {},\n\t) {\n\t\tsuper();\n\n\t\t// Ensure the given serial port is valid\n\t\tif (\n\t\t\ttypeof port !== \"string\"\n\t\t\t&& !isZWaveSerialPortImplementation(port)\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The port must be a string or a valid custom serial port implementation!`,\n\t\t\t\tZWaveErrorCodes.Driver_InvalidOptions,\n\t\t\t);\n\t\t}\n\n\t\t// Initialize logging\n\t\tthis._logContainer = new ZWaveLogContainer(options.logConfig);\n\t\tthis.znifferLog = new ZnifferLogger(this, this._logContainer);\n\n\t\tthis._options = options;\n\n\t\tthis._active = false;\n\n\t\tthis.parsingContext = {\n\t\t\tgetHighestSecurityClass(\n\t\t\t\t_nodeId: number,\n\t\t\t): MaybeNotKnown<SecurityClass> {\n\t\t\t\treturn SecurityClass.S2_AccessControl;\n\t\t\t},\n\n\t\t\thasSecurityClass(\n\t\t\t\t_nodeId: number,\n\t\t\t\t_securityClass: SecurityClass,\n\t\t\t): MaybeNotKnown<boolean> {\n\t\t\t\t// We don't actually know. Attempt parsing with all security classes\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\tsetSecurityClass(\n\t\t\t\t_nodeId: number,\n\t\t\t\t_securityClass: SecurityClass,\n\t\t\t\t_granted: boolean,\n\t\t\t): void {\n\t\t\t\t// Do nothing\n\t\t\t},\n\n\t\t\tgetDeviceConfig(_nodeId: number): DeviceConfig | undefined {\n\t\t\t\t// Disable strict validation while parsing certain CCs\n\t\t\t\t// Most of this stuff isn't actually needed, only the compat flags...\n\t\t\t\treturn new DeviceConfig(\n\t\t\t\t\t\"unknown.json\",\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"UNKNOWN_MANUFACTURER\",\n\t\t\t\t\t0x0000,\n\t\t\t\t\t\"UNKNOWN_PRODUCT\",\n\t\t\t\t\t\"UNKNOWN_DESCRIPTION\",\n\t\t\t\t\t[],\n\t\t\t\t\t{\n\t\t\t\t\t\tmin: \"0.0\",\n\t\t\t\t\t\tmax: \"255.255\",\n\t\t\t\t\t},\n\t\t\t\t\ttrue,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\t// ...down here:\n\t\t\t\t\t{\n\t\t\t\t\t\tdisableStrictEntryControlDataValidation: true,\n\t\t\t\t\t\tdisableStrictMeasurementValidation: true,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate _options: ZnifferOptions;\n\n\t/** The serial port instance */\n\tprivate serial: ZnifferSerialPortBase | undefined;\n\tprivate parsingContext: Omit<\n\t\tCCParsingContext,\n\t\tkeyof HostIDs | \"sourceNodeId\" | \"frameType\" | keyof SecurityManagers\n\t>;\n\n\tprivate _destroyPromise: DeferredPromise<void> | undefined;\n\tprivate get wasDestroyed(): boolean {\n\t\treturn !!this._destroyPromise;\n\t}\n\n\tprivate _chipType: string | UnknownZWaveChipType | undefined;\n\n\tprivate _currentFrequency: number | undefined;\n\t/** The currently configured frequency */\n\tpublic get currentFrequency(): number | undefined {\n\t\treturn this._currentFrequency;\n\t}\n\n\tprivate _supportedFrequencies: Map<number, string> = new Map();\n\t/** A map of supported frequency identifiers and their names */\n\tpublic get supportedFrequencies(): ReadonlyMap<number, string> {\n\t\treturn this._supportedFrequencies;\n\t}\n\n\tprivate _logContainer: ZWaveLogContainer;\n\tprivate znifferLog: ZnifferLogger;\n\n\t/** The security managers for each node */\n\tprivate securityManagers: Map<number, {\n\t\tsecurityManager: SecurityManager | undefined;\n\t\tsecurityManager2: SecurityManager2 | undefined;\n\t\tsecurityManagerLR: SecurityManager2 | undefined;\n\t}> = new Map();\n\n\t/** A list of awaited messages */\n\tprivate awaitedMessages: AwaitedMessageEntry[] = [];\n\n\tprivate _active: boolean;\n\t/** Whether the Zniffer instance is currently capturing */\n\tpublic get active(): boolean {\n\t\treturn this._active;\n\t}\n\n\tprivate _capturedFrames: CapturedData[] = [];\n\n\t/** A list of raw captured frames that can be saved to a .zlf file later */\n\tpublic get capturedFrames(): Readonly<CapturedFrame>[] {\n\t\treturn this._capturedFrames.filter((f) => f.parsedFrame !== undefined)\n\t\t\t.map((f) => ({\n\t\t\t\ttimestamp: f.timestamp,\n\t\t\t\tframeData: f.frameData,\n\t\t\t\tparsedFrame: f.parsedFrame!,\n\t\t\t}));\n\t}\n\n\tpublic async init(): Promise<void> {\n\t\tif (this.wasDestroyed) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The Zniffer was destroyed. Create a new instance and initialize that one.\",\n\t\t\t\tZWaveErrorCodes.Driver_Destroyed,\n\t\t\t);\n\t\t}\n\n\t\t// Open the serial port\n\t\tif (typeof this.port === \"string\") {\n\t\t\tif (this.port.startsWith(\"tcp://\")) {\n\t\t\t\tconst url = new URL(this.port);\n\t\t\t\t// this.znifferLog.print(`opening serial port ${this.port}`);\n\t\t\t\tthis.serial = new ZnifferSocket(\n\t\t\t\t\t{\n\t\t\t\t\t\thost: url.hostname,\n\t\t\t\t\t\tport: parseInt(url.port),\n\t\t\t\t\t},\n\t\t\t\t\tthis._logContainer,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// this.znifferLog.print(`opening serial port ${this.port}`);\n\t\t\t\tthis.serial = new ZnifferSerialPort(\n\t\t\t\t\tthis.port,\n\t\t\t\t\tthis._logContainer,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// this.znifferLog.print(\n\t\t\t// \t\"opening serial port using the provided custom implementation\",\n\t\t\t// );\n\t\t\tthis.serial = new ZnifferSerialPortBase(\n\t\t\t\tthis.port,\n\t\t\t\tthis._logContainer,\n\t\t\t);\n\t\t}\n\t\tthis.serial\n\t\t\t.on(\"data\", this.serialport_onData.bind(this))\n\t\t\t.on(\"error\", (err) => {\n\t\t\t\tthis.emit(\"error\", err);\n\t\t\t});\n\n\t\tawait this.serial.open();\n\n\t\tthis.znifferLog.print(logo, \"info\");\n\n\t\tawait this.stop();\n\n\t\tconst versionInfo = await this.getVersion();\n\t\tthis._chipType = versionInfo.chipType;\n\t\tthis.znifferLog.print(\n\t\t\t`received Zniffer info:\n Chip type: ${\n\t\t\t\ttypeof versionInfo.chipType === \"string\"\n\t\t\t\t\t? versionInfo.chipType\n\t\t\t\t\t: `unknown (${num2hex(versionInfo.chipType.type)}, ${\n\t\t\t\t\t\tnum2hex(versionInfo.chipType.version)\n\t\t\t\t\t})`\n\t\t\t}\n Zniffer version: ${versionInfo.majorVersion}.${versionInfo.minorVersion}`,\n\t\t\t\"info\",\n\t\t);\n\n\t\tawait this.setBaudrate(0);\n\n\t\tconst freqs = await this.getFrequencies();\n\t\tthis._currentFrequency = freqs.currentFrequency;\n\t\tif (is700PlusSeries(this._chipType)) {\n\t\t\t// The frequencies match the ZnifferRegion enum\n\t\t\tfor (const freq of freqs.supportedFrequencies) {\n\t\t\t\tthis._supportedFrequencies.set(\n\t\t\t\t\tfreq,\n\t\t\t\t\tgetEnumMemberName(ZnifferRegion, freq),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// ... but there might be unknown regions. Query those from the Zniffer\n\t\t\tconst unknownRegions = freqs.supportedFrequencies.filter((f) =>\n\t\t\t\t!isEnumMember(ZnifferRegion, f)\n\t\t\t);\n\t\t\tfor (const freq of unknownRegions) {\n\t\t\t\tconst freqInfo = await this.getFrequencyInfo(freq);\n\t\t\t\tthis._supportedFrequencies.set(freq, freqInfo.frequencyName);\n\t\t\t}\n\t\t} else if (\n\t\t\t// Version 2.55+ supports querying the frequency names\n\t\t\tsdkVersionGte(\n\t\t\t\t`${versionInfo.majorVersion}.${versionInfo.minorVersion}`,\n\t\t\t\t\"2.55\",\n\t\t\t)\n\t\t) {\n\t\t\t// The frequencies are firmware-specific. Query them from the Zniffer\n\t\t\tfor (const freq of freqs.supportedFrequencies) {\n\t\t\t\tconst freqInfo = await this.getFrequencyInfo(freq);\n\t\t\t\tthis._supportedFrequencies.set(freq, freqInfo.frequencyName);\n\t\t\t}\n\t\t} else {\n\t\t\t// The frequencies match the ZnifferRegionLegacy enum, and their info cannot be queried\n\t\t\tfor (const freq of freqs.supportedFrequencies) {\n\t\t\t\tthis._supportedFrequencies.set(\n\t\t\t\t\tfreq,\n\t\t\t\t\tgetEnumMemberName(ZnifferRegionLegacy, freq),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.znifferLog.print(\n\t\t\t`received frequency info:\ncurrent frequency: ${\n\t\t\t\tthis._supportedFrequencies.get(freqs.currentFrequency)\n\t\t\t\t\t?? `unknown (${num2hex(freqs.currentFrequency)})`\n\t\t\t}\nsupported frequencies: ${\n\t\t\t\t[...this._supportedFrequencies].map(([region, name]) =>\n\t\t\t\t\t`\\n \u00B7 ${region.toString().padStart(2, \" \")}: ${name}`\n\t\t\t\t).join(\"\")\n\t\t\t}`,\n\t\t\t\"info\",\n\t\t);\n\n\t\tif (\n\t\t\ttypeof this._options.defaultFrequency === \"number\"\n\t\t\t&& freqs.currentFrequency !== this._options.defaultFrequency\n\t\t\t&& this._supportedFrequencies.has(this._options.defaultFrequency)\n\t\t) {\n\t\t\tawait this.setFrequency(this._options.defaultFrequency);\n\t\t}\n\n\t\tthis.emit(\"ready\");\n\t}\n\n\t/**\n\t * Is called when the serial port has received a Zniffer frame\n\t */\n\tprivate async serialport_onData(\n\t\tdata: Uint8Array,\n\t): Promise<void> {\n\t\tlet msg: ZnifferMessage | undefined;\n\t\ttry {\n\t\t\tmsg = ZnifferMessage.parse(data);\n\t\t} catch (e: any) {\n\t\t\tconsole.error(e);\n\t\t\treturn;\n\t\t}\n\n\t\tif (msg.type === ZnifferMessageType.Command) {\n\t\t\tthis.handleResponse(msg);\n\t\t} else {\n\t\t\tconst dataMsg = msg as ZnifferDataMessage;\n\t\t\tconst capture: CapturedData = {\n\t\t\t\ttimestamp: new Date(),\n\t\t\t\trawData: data,\n\t\t\t\tframeData: dataMsg.payload,\n\t\t\t};\n\t\t\tthis._capturedFrames.push(capture);\n\t\t\tif (\n\t\t\t\tthis._options.maxCapturedFrames != undefined\n\t\t\t\t&& this._capturedFrames.length > this._options.maxCapturedFrames\n\t\t\t) {\n\t\t\t\tthis._capturedFrames.shift();\n\t\t\t}\n\t\t\tawait this.handleDataMessage(dataMsg, capture);\n\t\t}\n\t}\n\n\t/**\n\t * Is called when a Request-type message was received\n\t */\n\tprivate handleResponse(msg: ZnifferMessage): void {\n\t\t// Check if we have a dynamic handler waiting for this message\n\t\tfor (const entry of this.awaitedMessages) {\n\t\t\tif (entry.predicate(msg)) {\n\t\t\t\t// We do\n\t\t\t\tentry.handler(msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Is called when a Request-type message was received\n\t */\n\tprivate async handleDataMessage(\n\t\tmsg: ZnifferDataMessage,\n\t\tcapture: CapturedData,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tlet convertedRSSI: RSSI | undefined;\n\t\t\tif (this._options.convertRSSI && this._chipType) {\n\t\t\t\tconvertedRSSI = tryConvertRSSI(\n\t\t\t\t\tmsg.rssiRaw,\n\t\t\t\t\tthis._chipType,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Short-circuit if we're dealing with beam frames\n\t\t\tif (\n\t\t\t\tmsg.frameType === ZnifferFrameType.BeamStart\n\t\t\t\t|| msg.frameType === ZnifferFrameType.BeamStop\n\t\t\t) {\n\t\t\t\tconst beam = parseBeamFrame(msg);\n\t\t\t\tbeam.frameInfo.rssi = convertedRSSI;\n\n\t\t\t\t// Emit the captured frame in a format that's easier to work with for applications.\n\t\t\t\tthis.znifferLog.beam(beam);\n\t\t\t\tconst frame = beamToFrame(beam);\n\t\t\t\tcapture.parsedFrame = frame;\n\t\t\t\tthis.emit(\"frame\", frame, capture.frameData);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Only handle messages with a valid checksum, expose the others as CRC errors\n\t\t\tif (!msg.checksumOK) {\n\t\t\t\tthis.znifferLog.crcError(msg);\n\t\t\t\tconst frame = znifferDataMessageToCorruptedFrame(msg);\n\t\t\t\tcapture.parsedFrame = frame;\n\t\t\t\tthis.emit(\"corrupted frame\", frame, capture.frameData);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst mpdu = parseMPDU(msg);\n\t\t\tmpdu.frameInfo.rssi = convertedRSSI;\n\n\t\t\t// Try to decode the CC while assuming the role of the receiver\n\t\t\tlet destSecurityManager: SecurityManager | undefined;\n\t\t\tlet destSecurityManager2: SecurityManager2 | undefined;\n\t\t\tlet destSecurityManagerLR: SecurityManager2 | undefined;\n\t\t\t// Only frames with a destination node id contains something that requires access to the own node ID\n\t\t\tlet destNodeId = 0xff;\n\n\t\t\tlet cc: CommandClass | undefined;\n\n\t\t\t// FIXME: Cache data => parsed CC, so we can understand re-transmitted S2 frames\n\n\t\t\tif (\n\t\t\t\tmpdu.payload.length > 0\n\t\t\t\t&& mpdu.headerType !== MPDUHeaderType.Acknowledgement\n\t\t\t) {\n\t\t\t\tif (\"destinationNodeId\" in mpdu) {\n\t\t\t\t\tdestNodeId = mpdu.destinationNodeId;\n\t\t\t\t\t({\n\t\t\t\t\t\tsecurityManager: destSecurityManager,\n\t\t\t\t\t\tsecurityManager2: destSecurityManager2,\n\t\t\t\t\t\tsecurityManagerLR: destSecurityManagerLR,\n\t\t\t\t\t} = await this.getSecurityManagers(mpdu.destinationNodeId));\n\t\t\t\t}\n\n\t\t\t\t// TODO: Support parsing multicast S2 frames\n\t\t\t\tconst frameType: FrameType =\n\t\t\t\t\tmpdu.headerType === MPDUHeaderType.Multicast\n\t\t\t\t\t\t? \"multicast\"\n\t\t\t\t\t\t: (destNodeId === NODE_ID_BROADCAST\n\t\t\t\t\t\t\t\t|| destNodeId === NODE_ID_BROADCAST_LR)\n\t\t\t\t\t\t? \"broadcast\"\n\t\t\t\t\t\t: \"singlecast\";\n\t\t\t\ttry {\n\t\t\t\t\tcc = await CommandClass.parseAsync(\n\t\t\t\t\t\tmpdu.payload,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thomeId: mpdu.homeId,\n\t\t\t\t\t\t\townNodeId: destNodeId,\n\t\t\t\t\t\t\tsourceNodeId: mpdu.sourceNodeId,\n\t\t\t\t\t\t\tframeType,\n\t\t\t\t\t\t\tsecurityManager: destSecurityManager,\n\t\t\t\t\t\t\tsecurityManager2: destSecurityManager2,\n\t\t\t\t\t\t\tsecurityManagerLR: destSecurityManagerLR,\n\t\t\t\t\t\t\t...this.parsingContext,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\t// Ignore\n\t\t\t\t\tconsole.error(e.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.znifferLog.mpdu(mpdu, cc);\n\n\t\t\t// Emit the captured frame in a format that's easier to work with for applications.\n\t\t\tconst frame = mpduToFrame(mpdu, cc);\n\t\t\tcapture.parsedFrame = frame;\n\t\t\tthis.emit(\"frame\", frame, capture.frameData);\n\n\t\t\t// Update the security managers when nonces are exchanged, so we can\n\t\t\t// decrypt the communication\n\t\t\tif (cc?.ccId === CommandClasses[\"Security 2\"]) {\n\t\t\t\tconst securityManagers = await this.getSecurityManagers(\n\t\t\t\t\tmpdu.sourceNodeId,\n\t\t\t\t);\n\t\t\t\tconst isLR = isLongRangeNodeId(mpdu.sourceNodeId)\n\t\t\t\t\t|| isLongRangeNodeId(destNodeId);\n\t\t\t\tconst senderSecurityManager = isLR\n\t\t\t\t\t? securityManagers.securityManagerLR\n\t\t\t\t\t: securityManagers.securityManager2;\n\t\t\t\tconst destSecurityManager = isLR\n\t\t\t\t\t? destSecurityManagerLR\n\t\t\t\t\t: destSecurityManager2;\n\n\t\t\t\tif (senderSecurityManager && destSecurityManager) {\n\t\t\t\t\tif (cc instanceof Security2CCNonceGet) {\n\t\t\t\t\t\t// Nonce Get -> all nonces are now invalid\n\t\t\t\t\t\tsenderSecurityManager.deleteNonce(destNodeId);\n\t\t\t\t\t\tdestSecurityManager.deleteNonce(mpdu.sourceNodeId);\n\t\t\t\t\t} else if (cc instanceof Security2CCNonceReport && cc.SOS) {\n\t\t\t\t\t\t// Nonce Report (SOS) -> We only know the receiver's nonce\n\t\t\t\t\t\tsenderSecurityManager.setSPANState(destNodeId, {\n\t\t\t\t\t\t\ttype: SPANState.LocalEI,\n\t\t\t\t\t\t\treceiverEI: cc.receiverEI!,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdestSecurityManager.storeRemoteEI(\n\t\t\t\t\t\t\tmpdu.sourceNodeId,\n\t\t\t\t\t\t\tcc.receiverEI!,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (cc instanceof Security2CCMessageEncapsulation) {\n\t\t\t\t\t\tconst senderEI = cc.getSenderEI();\n\t\t\t\t\t\tif (senderEI) {\n\t\t\t\t\t\t\t// The receiver should now have a valid SPAN state, since decoding the S2 CC updates it.\n\t\t\t\t\t\t\t// The security manager for the sender however, does not. Therefore, update it manually,\n\t\t\t\t\t\t\t// if the receiver SPAN is indeed valid.\n\n\t\t\t\t\t\t\tconst receiverSPANState = destSecurityManager\n\t\t\t\t\t\t\t\t.getSPANState(mpdu.sourceNodeId);\n\t\t\t\t\t\t\tif (receiverSPANState.type === SPANState.SPAN) {\n\t\t\t\t\t\t\t\tsenderSecurityManager.setSPANState(\n\t\t\t\t\t\t\t\t\tdestNodeId,\n\t\t\t\t\t\t\t\t\treceiverSPANState,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tcc?.ccId === CommandClasses.Security\n\t\t\t\t&& cc instanceof SecurityCCNonceReport\n\t\t\t) {\n\t\t\t\tconst senderSecurityManager =\n\t\t\t\t\t(await this.getSecurityManagers(mpdu.sourceNodeId))\n\t\t\t\t\t\t.securityManager;\n\t\t\t\tconst destSecurityManager =\n\t\t\t\t\t(await this.getSecurityManagers(destNodeId))\n\t\t\t\t\t\t.securityManager;\n\n\t\t\t\tif (senderSecurityManager && destSecurityManager) {\n\t\t\t\t\t// Both nodes have a shared nonce now\n\t\t\t\t\tsenderSecurityManager.setNonce(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tissuer: mpdu.sourceNodeId,\n\t\t\t\t\t\t\tnonceId: senderSecurityManager.getNonceId(\n\t\t\t\t\t\t\t\tcc.nonce,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnonce: cc.nonce,\n\t\t\t\t\t\t\treceiver: destNodeId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ free: true },\n\t\t\t\t\t);\n\n\t\t\t\t\tdestSecurityManager.setNonce(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tissuer: mpdu.sourceNodeId,\n\t\t\t\t\t\t\tnonceId: senderSecurityManager.getNonceId(\n\t\t\t\t\t\t\t\tcc.nonce,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnonce: cc.nonce,\n\t\t\t\t\t\t\treceiver: destNodeId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ free: true },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n\n\t/**\n\t * Waits until a certain serial message is received or a timeout has elapsed. Returns the received message.\n\t * @param timeout The number of milliseconds to wait. If the timeout elapses, the returned promise will be rejected\n\t * @param predicate A predicate function to test all incoming messages.\n\t */\n\tprivate waitForMessage<T extends ZnifferMessage>(\n\t\tpredicate: (msg: ZnifferMessage) => boolean,\n\t\ttimeout: number,\n\t): Promise<T> {\n\t\treturn new Promise<T>((resolve, reject) => {\n\t\t\tconst promise = createDeferredPromise<ZnifferMessage>();\n\t\t\tconst entry: AwaitedMessageEntry = {\n\t\t\t\tpredicate,\n\t\t\t\thandler: (msg) => promise.resolve(msg),\n\t\t\t\ttimeout: undefined,\n\t\t\t};\n\t\t\tthis.awaitedMessages.push(entry);\n\t\t\tconst removeEntry = () => {\n\t\t\t\tif (entry.timeout) clearTimeout(entry.timeout);\n\t\t\t\tconst index = this.awaitedMessages.indexOf(entry);\n\t\t\t\tif (index !== -1) this.awaitedMessages.splice(index, 1);\n\t\t\t};\n\t\t\t// When the timeout elapses, remove the wait entry and reject the returned Promise\n\t\t\tentry.timeout = setTimeout(() => {\n\t\t\t\tremoveEntry();\n\t\t\t\treject(\n\t\t\t\t\tnew ZWaveError(\n\t\t\t\t\t\t`Received no matching message within the provided timeout!`,\n\t\t\t\t\t\tZWaveErrorCodes.Controller_Timeout,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}, timeout);\n\t\t\t// When the promise is resolved, remove the wait entry and resolve the returned Promise\n\t\t\tvoid promise.then((cc) => {\n\t\t\t\tremoveEntry();\n\t\t\t\tresolve(cc as T);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async getVersion() {\n\t\tconst req = new ZnifferGetVersionRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<ZnifferGetVersionResponse>(\n\t\t\t(msg) => msg instanceof ZnifferGetVersionResponse,\n\t\t\t1000,\n\t\t);\n\n\t\treturn pick(res, [\"chipType\", \"majorVersion\", \"minorVersion\"]);\n\t}\n\n\tprivate async getFrequencies() {\n\t\tconst req = new ZnifferGetFrequenciesRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<ZnifferGetFrequenciesResponse>(\n\t\t\t(msg) => msg instanceof ZnifferGetFrequenciesResponse,\n\t\t\t1000,\n\t\t);\n\n\t\treturn pick(res, [\n\t\t\t\"currentFrequency\",\n\t\t\t\"supportedFrequencies\",\n\t\t]);\n\t}\n\n\tpublic async setFrequency(frequency: number): Promise<void> {\n\t\tconst req = new ZnifferSetFrequencyRequest({ frequency });\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tawait this.waitForMessage<ZnifferSetFrequencyResponse>(\n\t\t\t(msg) => msg instanceof ZnifferSetFrequencyResponse,\n\t\t\t1000,\n\t\t);\n\t\tthis._currentFrequency = frequency;\n\t}\n\n\tprivate async getFrequencyInfo(frequency: number) {\n\t\tconst req = new ZnifferGetFrequencyInfoRequest({ frequency });\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<ZnifferGetFrequencyInfoResponse>(\n\t\t\t(msg) =>\n\t\t\t\tmsg instanceof ZnifferGetFrequencyInfoResponse\n\t\t\t\t&& msg.frequency === frequency,\n\t\t\t1000,\n\t\t);\n\n\t\treturn pick(res, [\"numChannels\", \"frequencyName\"]);\n\t}\n\n\t/** Starts the capture and discards all previously captured frames */\n\tpublic async start(): Promise<void> {\n\t\tif (this.wasDestroyed) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"The Zniffer is not ready or has been destroyed\",\n\t\t\t\tZWaveErrorCodes.Driver_NotReady,\n\t\t\t);\n\t\t}\n\n\t\tif (this._active) return;\n\t\tthis._capturedFrames = [];\n\t\tthis._active = true;\n\n\t\tconst req = new ZnifferStartRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tawait this.waitForMessage<ZnifferStartResponse>(\n\t\t\t(msg) => msg instanceof ZnifferStartResponse,\n\t\t\t1000,\n\t\t);\n\t}\n\n\tpublic async stop(): Promise<void> {\n\t\tif (!this._active) return;\n\t\tthis._active = false;\n\n\t\tif (!this.serial) return;\n\n\t\tconst req = new ZnifferStopRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tawait this.waitForMessage<ZnifferStopResponse>(\n\t\t\t(msg) => msg instanceof ZnifferStopResponse,\n\t\t\t1000,\n\t\t);\n\t}\n\n\tprivate async setBaudrate(baudrate: 0): Promise<void> {\n\t\tconst req = new ZnifferSetBaudRateRequest({ baudrate });\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tawait this.waitForMessage<ZnifferSetBaudRateResponse>(\n\t\t\t(msg) => msg instanceof ZnifferSetBaudRateResponse,\n\t\t\t1000,\n\t\t);\n\t}\n\n\tprivate async getSecurityManagers(\n\t\tsourceNodeId: number,\n\t) {\n\t\tif (this.securityManagers.has(sourceNodeId)) {\n\t\t\treturn this.securityManagers.get(sourceNodeId)!;\n\t\t}\n\t\t// Initialize security\n\t\t// Set up the S0 security manager. We can only do that after the controller\n\t\t// interview because we need to know the controller node id.\n\t\tconst S0Key = this._options.securityKeys?.S0_Legacy;\n\t\tlet securityManager: SecurityManager | undefined;\n\t\tif (S0Key) {\n\t\t\t// this.znifferLog.print(\n\t\t\t// \t\"Network key for S0 configured, enabling S0 security manager...\",\n\t\t\t// );\n\t\t\tsecurityManager = new SecurityManager({\n\t\t\t\tnetworkKey: S0Key,\n\t\t\t\t// FIXME: Track nonces separately for each destination node\n\t\t\t\townNodeId: sourceNodeId,\n\t\t\t\tnonceTimeout: Number.POSITIVE_INFINITY,\n\t\t\t});\n\t\t\t// } else {\n\t\t\t// \tthis.znifferLog.print(\n\t\t\t// \t\t\"No network key for S0 configured, cannot decrypt communication from secure (S0) devices!\",\n\t\t\t// \t\t\"warn\",\n\t\t\t// \t);\n\t\t}\n\n\t\tlet securityManager2: SecurityManager2 | undefined;\n\t\tif (\n\t\t\tthis._options.securityKeys\n\t\t\t// Only set it up if we have security keys for at least one S2 security class\n\t\t\t&& Object.keys(this._options.securityKeys).some(\n\t\t\t\t(key) =>\n\t\t\t\t\tkey.startsWith(\"S2_\")\n\t\t\t\t\t&& key in SecurityClass\n\t\t\t\t\t&& securityClassIsS2((SecurityClass as any)[key]),\n\t\t\t)\n\t\t) {\n\t\t\t// this.znifferLog.print(\n\t\t\t// \t\"At least one network key for S2 configured, enabling S2 security manager...\",\n\t\t\t// );\n\t\t\tsecurityManager2 = await SecurityManager2.create();\n\t\t\t// Small hack: Zniffer does not care about S2 duplicates\n\t\t\tsecurityManager2.isDuplicateSinglecast = () => false;\n\n\t\t\t// Set up all keys\n\t\t\tfor (\n\t\t\t\tconst secClass of [\n\t\t\t\t\t\"S2_Unauthenticated\",\n\t\t\t\t\t\"S2_Authenticated\",\n\t\t\t\t\t\"S2_AccessControl\",\n\t\t\t\t\t\"S0_Legacy\",\n\t\t\t\t] as const\n\t\t\t) {\n\t\t\t\tconst key = this._options.securityKeys[secClass];\n\t\t\t\tif (key) {\n\t\t\t\t\tawait securityManager2.setKeyAsync(\n\t\t\t\t\t\tSecurityClass[secClass],\n\t\t\t\t\t\tkey,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// } else {\n\t\t\t// \tthis.znifferLog.print(\n\t\t\t// \t\t\"No network key for S2 configured, cannot decrypt communication from secure (S2) devices!\",\n\t\t\t// \t\t\"warn\",\n\t\t\t// \t);\n\t\t}\n\n\t\tlet securityManagerLR: SecurityManager2 | undefined;\n\t\tif (\n\t\t\tthis._options.securityKeysLongRange?.S2_AccessControl\n\t\t\t|| this._options.securityKeysLongRange?.S2_Authenticated\n\t\t) {\n\t\t\t// this.znifferLog.print(\n\t\t\t// \t\"At least one network key for Z-Wave Long Range configured, enabling security manager...\",\n\t\t\t// );\n\t\t\tsecurityManagerLR = await SecurityManager2.create();\n\t\t\t// Small hack: Zniffer does not care about S2 duplicates\n\t\t\tsecurityManagerLR.isDuplicateSinglecast = () => false;\n\n\t\t\t// Set up all keys\n\t\t\tif (this._options.securityKeysLongRange?.S2_AccessControl) {\n\t\t\t\tawait securityManagerLR.setKeyAsync(\n\t\t\t\t\tSecurityClass.S2_AccessControl,\n\t\t\t\t\tthis._options.securityKeysLongRange.S2_AccessControl,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (this._options.securityKeysLongRange?.S2_Authenticated) {\n\t\t\t\tawait securityManagerLR.setKeyAsync(\n\t\t\t\t\tSecurityClass.S2_Authenticated,\n\t\t\t\t\tthis._options.securityKeysLongRange.S2_Authenticated,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// } else {\n\t\t\t// \tthis.znifferLog.print(\n\t\t\t// \t\t\"No network key for Z-Wave Long Range configured, cannot decrypt Long Range communication!\",\n\t\t\t// \t\t\"warn\",\n\t\t\t// \t);\n\t\t}\n\n\t\tconst ret = {\n\t\t\tsecurityManager,\n\t\t\tsecurityManager2,\n\t\t\tsecurityManagerLR,\n\t\t};\n\t\tthis.securityManagers.set(sourceNodeId, ret);\n\t\treturn ret;\n\t}\n\n\t/** Clears the list of captured frames */\n\tpublic clearCapturedFrames(): void {\n\t\tthis._capturedFrames = [];\n\t}\n\n\t/**\n\t * Get the captured frames in the official Zniffer application format.\n\t * @param frameFilter Optional predicate function to filter the frames included in the capture\n\t */\n\tpublic getCaptureAsZLFBuffer(\n\t\tframeFilter?: (frame: CapturedFrame) => boolean,\n\t): Uint8Array {\n\t\t// Mimics the current Zniffer software, without using features like sessions and comments\n\t\tconst header = new Bytes(2048).fill(0);\n\t\theader[0] = 0x68; // zniffer version\n\t\theader.writeUInt16BE(0x2312, 0x07fe); // checksum\n\t\tlet filteredFrames = this._capturedFrames;\n\t\tif (frameFilter) {\n\t\t\tfilteredFrames = filteredFrames.filter((f) =>\n\t\t\t\t// Always include Zniffer-protocol frames\n\t\t\t\tf.parsedFrame == undefined\n\t\t\t\t// Apply the filter to all other frames\n\t\t\t\t|| frameFilter({\n\t\t\t\t\tframeData: f.frameData,\n\t\t\t\t\tparsedFrame: f.parsedFrame,\n\t\t\t\t\ttimestamp: f.timestamp,\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t\treturn Bytes.concat([\n\t\t\theader,\n\t\t\t...filteredFrames.map(captureToZLFEntry),\n\t\t]);\n\t}\n\n\t/**\n\t * Saves the captured frames in a `.zlf` file that can be read by the official Zniffer application.\n\t * @param frameFilter Optional predicate function to filter the frames included in the capture\n\t */\n\tpublic async saveCaptureToFile(\n\t\tfilePath: string,\n\t\tframeFilter?: (frame: CapturedFrame) => boolean,\n\t): Promise<void> {\n\t\tawait fs.writeFile(filePath, this.getCaptureAsZLFBuffer(frameFilter));\n\t}\n\n\t/**\n\t * Terminates the Zniffer instance and closes the underlying serial connection.\n\t * Must be called under any circumstances.\n\t */\n\tpublic async destroy(): Promise<void> {\n\t\t// Ensure this is only called once and all subsequent calls block\n\t\tif (this._destroyPromise) return this._destroyPromise;\n\t\tthis._destroyPromise = createDeferredPromise();\n\n\t\tthis.znifferLog.print(\"Destroying Zniffer instance...\");\n\n\t\tif (this._active) {\n\t\t\tawait this.stop().catch(noop);\n\t\t}\n\n\t\tif (this.serial != undefined) {\n\t\t\t// Avoid spewing errors if the port was in the middle of receiving something\n\t\t\tthis.serial.removeAllListeners();\n\t\t\tif (this.serial.isOpen) await this.serial.close();\n\t\t\tthis.serial = undefined;\n\t\t}\n\n\t\tthis.znifferLog.print(\"Zniffer instance destroyed\");\n\n\t\t// destroy loggers as the very last thing\n\t\tthis._logContainer.destroy();\n\n\t\tthis._destroyPromise.resolve();\n\t}\n}\n\nfunction captureToZLFEntry(\n\tcapture: CapturedData,\n): Uint8Array {\n\tconst buffer = new Bytes(14 + capture.rawData.length).fill(0);\n\t// Convert the date to a .NET datetime\n\tlet ticks = BigInt(capture.timestamp.getTime()) * 10000n\n\t\t+ 621355968000000000n;\n\tticks = ticks | 4000000000000000n; // marks the time as .NET DateTimeKind.Local\n\n\tbuffer.writeBigUInt64LE(ticks, 0);\n\tconst direction = 0b0000_0000; // inbound, outbound would be 0b1000_0000\n\n\tbuffer[8] = direction | 0x01; // dir + session ID\n\tbuffer[9] = capture.rawData.length;\n\t// bytes 10-12 are empty\n\tbuffer.set(capture.rawData, 13);\n\tbuffer[buffer.length - 1] = 0xfe; // end of frame\n\treturn buffer;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_core", "frame", "destSecurityManager", "fs"]
7
7
  }
@@ -1,3 +1,3 @@
1
- export declare const PACKAGE_VERSION = "14.2.0";
1
+ export declare const PACKAGE_VERSION = "14.3.0";
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.2.0";
2
+ export const PACKAGE_VERSION = "14.3.0";
3
3
  export const PACKAGE_NAME = "zwave-js";
4
4
  //# sourceMappingURL=_version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Controller.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/Controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Controller.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/Controller.ts"],"names":[],"mappings":"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"}
@@ -33,7 +33,7 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
33
33
  return useValue ? value : void 0;
34
34
  };
35
35
  import { AssociationCC, ECDHProfiles, FLiRS2WakeUpTime, InclusionControllerCCComplete, InclusionControllerCCInitiate, InclusionControllerStatus, InclusionControllerStep, KEXFailType, KEXSchemes, ManufacturerSpecificCCValues, MultiChannelAssociationCC, Powerlevel, Security2CCKEXFail, Security2CCKEXGet, Security2CCKEXSet, Security2CCNetworkKeyGet, Security2CCNetworkKeyReport, Security2CCNetworkKeyVerify, Security2CCPublicKeyReport, Security2CCTransferEnd, Security2Command, SecurityCCNetworkKeySet, SecurityCCNonceGet, SecurityCCSchemeGet, SecurityCCSchemeInherit, VersionCCValues, VersionCommand, ZWaveProtocolCCAssignReturnRoute, ZWaveProtocolCCAssignReturnRoutePriority, ZWaveProtocolCCAssignSUCReturnRoute, ZWaveProtocolCCAssignSUCReturnRoutePriority, inclusionTimeouts, utils as ccUtils, } from "@zwave-js/cc";
36
- import { BasicDeviceClass, CommandClasses, ControllerRole, ControllerStatus, EMPTY_ROUTE, LongRangeChannel, MAX_NODES, NODE_ID_BROADCAST, NODE_ID_BROADCAST_LR, NOT_KNOWN, NodeIDType, NodeType, ProtocolType, Protocols, RFRegion, RouteKind, SecurityClass, SecurityManager, SecurityManager2, TransmitStatus, UNKNOWN_STATE, ValueDB, ZWaveError, ZWaveErrorCodes, ZWaveLibraryTypes, authHomeIdFromDSK, averageRSSI, computePRK, deriveTempKeys, dskFromString, dskToString, extractRawECDHPublicKey, generateECDHKeyPair, getChipTypeAndVersion, getHighestSecurityClass, importRawECDHPublicKey, indexDBsByNode, isEmptyRoute, isLongRangeNodeId, isValidDSK, isZWaveError, nwiHomeIdFromDSK, parseBitMask, sdkVersionGt, sdkVersionGte, sdkVersionLt, sdkVersionLte, securityClassIsS2, securityClassOrder, } from "@zwave-js/core";
36
+ import { BasicDeviceClass, CommandClasses, ControllerRole, ControllerStatus, EMPTY_ROUTE, LongRangeChannel, MAX_NODES, NODE_ID_BROADCAST, NODE_ID_BROADCAST_LR, NOT_KNOWN, NodeIDType, NodeType, ProtocolType, Protocols, RFRegion, RouteKind, SecurityClass, SecurityManager, SecurityManager2, TransmitStatus, UNKNOWN_STATE, ValueDB, ZWaveError, ZWaveErrorCodes, ZWaveLibraryTypes, authHomeIdFromDSK, averageRSSI, computePRKAsync, deriveTempKeysAsync, dskFromString, dskToString, extractRawECDHPublicKeySync, generateECDHKeyPairSync, getChipTypeAndVersion, getHighestSecurityClass, importRawECDHPublicKeySync, indexDBsByNode, isEmptyRoute, isLongRangeNodeId, isValidDSK, isZWaveError, nwiHomeIdFromDSK, parseBitMask, sdkVersionGt, sdkVersionGte, sdkVersionLt, sdkVersionLte, securityClassIsS2, securityClassOrder, } from "@zwave-js/core";
37
37
  import { BufferedNVMReader, NVM3, NVM3Adapter, NVM500, NVM500Adapter, migrateNVM, } from "@zwave-js/nvmedit";
38
38
  import { BootloaderChunkType, FunctionType, XModemMessageHeaders, } from "@zwave-js/serial";
39
39
  import { ApplicationUpdateRequestNodeAdded, ApplicationUpdateRequestNodeInfoReceived, ApplicationUpdateRequestNodeRemoved, ApplicationUpdateRequestSUCIdChanged, ApplicationUpdateRequestSmartStartHomeIDReceived, ApplicationUpdateRequestSmartStartLongRangeHomeIDReceived, } from "@zwave-js/serial/serialapi";
@@ -170,7 +170,7 @@ let ZWaveController = (() => {
170
170
  get dsk() {
171
171
  if (this._dsk == undefined) {
172
172
  const keyPair = this.driver.getLearnModeAuthenticatedKeyPair();
173
- const publicKey = extractRawECDHPublicKey(keyPair.publicKey);
173
+ const publicKey = extractRawECDHPublicKeySync(keyPair.publicKey);
174
174
  this._dsk = publicKey.subarray(0, 16);
175
175
  }
176
176
  return this._dsk;
@@ -2202,8 +2202,8 @@ let ZWaveController = (() => {
2202
2202
  const timerStartTAI2 = Date.now();
2203
2203
  // Generate ECDH key pair. We need to immediately send the other node our public key,
2204
2204
  // so it won't abort bootstrapping
2205
- const keyPair = generateECDHKeyPair();
2206
- const publicKey = extractRawECDHPublicKey(keyPair.publicKey);
2205
+ const keyPair = generateECDHKeyPairSync();
2206
+ const publicKey = extractRawECDHPublicKeySync(keyPair.publicKey);
2207
2207
  await api.sendPublicKey(publicKey);
2208
2208
  // After this, the node will start sending us a KEX SET every 10 seconds.
2209
2209
  // We won't be able to decode it until the DSK was verified
@@ -2246,11 +2246,11 @@ let ZWaveController = (() => {
2246
2246
  // After the user has verified the DSK, we can derive the shared secret
2247
2247
  // Z-Wave works with the "raw" keys, so this is a tad complicated
2248
2248
  const sharedSecret = crypto.diffieHellman({
2249
- publicKey: importRawECDHPublicKey(nodePublicKey),
2249
+ publicKey: importRawECDHPublicKeySync(nodePublicKey),
2250
2250
  privateKey: keyPair.privateKey,
2251
2251
  });
2252
2252
  // Derive temporary key from ECDH key pair - this will allow us to receive the node's KEX SET commands
2253
- const tempKeys = deriveTempKeys(computePRK(sharedSecret, publicKey, nodePublicKey));
2253
+ const tempKeys = await deriveTempKeysAsync(await computePRKAsync(sharedSecret, publicKey, nodePublicKey));
2254
2254
  securityManager.deleteNonce(node.id);
2255
2255
  securityManager.tempKeys.set(node.id, {
2256
2256
  keyCCM: tempKeys.tempKeyCCM,
@@ -5806,7 +5806,7 @@ let ZWaveController = (() => {
5806
5806
  * Is called when a RemoveNode request is received from the controller.
5807
5807
  * Handles and controls the exclusion process.
5808
5808
  */
5809
- handleLearnModeCallback(msg) {
5809
+ async handleLearnModeCallback(msg) {
5810
5810
  // not sure what to do with this message, we're not in learn mode
5811
5811
  if (this._currentLearnMode == undefined)
5812
5812
  return false;
@@ -5851,8 +5851,10 @@ let ZWaveController = (() => {
5851
5851
  if (wasJoining) {
5852
5852
  this._currentLearnMode = undefined;
5853
5853
  this.driver["_securityManager"] = undefined;
5854
- this.driver["_securityManager2"] = new SecurityManager2();
5855
- this.driver["_securityManagerLR"] = new SecurityManager2();
5854
+ this.driver["_securityManager2"] = await SecurityManager2
5855
+ .create();
5856
+ this.driver["_securityManagerLR"] = await SecurityManager2
5857
+ .create();
5856
5858
  this._nodes.clear();
5857
5859
  process.nextTick(() => this.afterJoiningNetwork().catch(noop));
5858
5860
  return true;
@@ -6101,8 +6103,8 @@ let ZWaveController = (() => {
6101
6103
  // otherwise generate a new one
6102
6104
  const keyPair = requiresAuthentication
6103
6105
  ? this.driver.getLearnModeAuthenticatedKeyPair()
6104
- : generateECDHKeyPair();
6105
- const publicKey = extractRawECDHPublicKey(keyPair.publicKey);
6106
+ : generateECDHKeyPairSync();
6107
+ const publicKey = extractRawECDHPublicKeySync(keyPair.publicKey);
6106
6108
  const transmittedPublicKey = Bytes.from(publicKey);
6107
6109
  if (requiresAuthentication) {
6108
6110
  // Authentication requires obfuscating the public key
@@ -6127,11 +6129,11 @@ let ZWaveController = (() => {
6127
6129
  }
6128
6130
  const includingNodePubKey = pubKeyReport.publicKey;
6129
6131
  const sharedSecret = crypto.diffieHellman({
6130
- publicKey: importRawECDHPublicKey(includingNodePubKey),
6132
+ publicKey: importRawECDHPublicKeySync(includingNodePubKey),
6131
6133
  privateKey: keyPair.privateKey,
6132
6134
  });
6133
6135
  // Derive temporary key from ECDH key pair - this will allow us to receive the node's KEX SET commands
6134
- const tempKeys = deriveTempKeys(computePRK(sharedSecret, includingNodePubKey, publicKey));
6136
+ const tempKeys = await deriveTempKeysAsync(await computePRKAsync(sharedSecret, includingNodePubKey, publicKey));
6135
6137
  securityManager.deleteNonce(bootstrappingNode.id);
6136
6138
  securityManager.tempKeys.set(bootstrappingNode.id, {
6137
6139
  keyCCM: tempKeys.tempKeyCCM,
@@ -6259,7 +6261,7 @@ let ZWaveController = (() => {
6259
6261
  }
6260
6262
  // Store the network key
6261
6263
  receivedKeys.set(securityClass, keyReport.networkKey);
6262
- securityManager.setKey(securityClass, keyReport.networkKey);
6264
+ await securityManager.setKeyAsync(securityClass, keyReport.networkKey);
6263
6265
  if (securityClass === SecurityClass.S0_Legacy) {
6264
6266
  // TODO: This is awkward to have here
6265
6267
  this.driver["_securityManager"] = new SecurityManager({