zwave-js 15.2.0 → 15.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.
- package/build/cjs/index_browser.js.map +2 -2
- package/build/cjs/lib/_version.d.ts +1 -1
- package/build/cjs/lib/_version.js +1 -1
- package/build/cjs/lib/_version.js.map +1 -1
- package/build/cjs/lib/controller/Controller.js +5 -4
- package/build/cjs/lib/controller/Controller.js.map +2 -2
- package/build/cjs/lib/driver/Driver.d.ts +12 -2
- package/build/cjs/lib/driver/Driver.js +141 -108
- package/build/cjs/lib/driver/Driver.js.map +2 -2
- package/build/cjs/lib/driver/DriverMock.js +1 -1
- package/build/cjs/lib/driver/DriverMock.js.map +2 -2
- package/build/cjs/lib/driver/Queue.d.ts +1 -1
- package/build/cjs/lib/driver/Queue.js +1 -0
- package/build/cjs/lib/driver/Queue.js.map +2 -2
- package/build/cjs/lib/driver/mDNSDiscovery/node.d.ts +3 -0
- package/build/cjs/lib/driver/mDNSDiscovery/node.js +97 -0
- package/build/cjs/lib/driver/mDNSDiscovery/node.js.map +7 -0
- package/build/cjs/lib/driver/mDNSDiscovery/stub.d.ts +3 -0
- package/build/cjs/lib/driver/mDNSDiscovery/stub.js +33 -0
- package/build/cjs/lib/driver/mDNSDiscovery/stub.js.map +7 -0
- package/build/cjs/lib/driver/mDNSDiscovery.d.ts +1 -1
- package/build/cjs/lib/driver/mDNSDiscovery.js +2 -70
- package/build/cjs/lib/driver/mDNSDiscovery.js.map +3 -3
- package/build/cjs/lib/node/Node.js +3 -1
- package/build/cjs/lib/node/Node.js.map +2 -2
- package/build/cjs/lib/zniffer/Zniffer.js +3 -3
- package/build/cjs/lib/zniffer/Zniffer.js.map +2 -2
- package/build/cjs/package.json +30 -1
- package/build/esm/index_browser.d.ts.map +1 -1
- package/build/esm/index_browser.js +1 -0
- package/build/esm/index_browser.js.map +1 -1
- package/build/esm/lib/_version.d.ts +1 -1
- package/build/esm/lib/_version.js +1 -1
- package/build/esm/lib/controller/Controller.d.ts.map +1 -1
- package/build/esm/lib/controller/Controller.js +7 -7
- package/build/esm/lib/controller/Controller.js.map +1 -1
- package/build/esm/lib/driver/Driver.d.ts +12 -2
- package/build/esm/lib/driver/Driver.d.ts.map +1 -1
- package/build/esm/lib/driver/Driver.js +186 -146
- package/build/esm/lib/driver/Driver.js.map +1 -1
- package/build/esm/lib/driver/DriverMock.js +1 -1
- package/build/esm/lib/driver/DriverMock.js.map +1 -1
- package/build/esm/lib/driver/Queue.d.ts +1 -1
- package/build/esm/lib/driver/Queue.d.ts.map +1 -1
- package/build/esm/lib/driver/Queue.js +1 -0
- package/build/esm/lib/driver/Queue.js.map +1 -1
- package/build/esm/lib/driver/mDNSDiscovery/node.d.ts +3 -0
- package/build/esm/lib/driver/mDNSDiscovery/node.d.ts.map +1 -0
- package/build/esm/lib/driver/mDNSDiscovery/node.js +70 -0
- package/build/esm/lib/driver/mDNSDiscovery/node.js.map +1 -0
- package/build/esm/lib/driver/mDNSDiscovery/stub.d.ts +3 -0
- package/build/esm/lib/driver/mDNSDiscovery/stub.d.ts.map +1 -0
- package/build/esm/lib/driver/mDNSDiscovery/stub.js +5 -0
- package/build/esm/lib/driver/mDNSDiscovery/stub.js.map +1 -0
- package/build/esm/lib/driver/mDNSDiscovery.d.ts +1 -1
- package/build/esm/lib/driver/mDNSDiscovery.d.ts.map +1 -1
- package/build/esm/lib/driver/mDNSDiscovery.js +1 -69
- package/build/esm/lib/driver/mDNSDiscovery.js.map +1 -1
- package/build/esm/lib/node/Node.d.ts.map +1 -1
- package/build/esm/lib/node/Node.js +6 -2
- package/build/esm/lib/node/Node.js.map +1 -1
- package/build/esm/lib/zniffer/Zniffer.js +3 -3
- package/build/esm/lib/zniffer/Zniffer.js.map +1 -1
- package/build/esm/package.json +30 -1
- package/package.json +40 -11
|
@@ -183,9 +183,9 @@ class Zniffer extends import_shared.TypedEventTarget {
|
|
|
183
183
|
throw new import_core.ZWaveError("The Zniffer was destroyed. Create a new instance and initialize that one.", import_core.ZWaveErrorCodes.Driver_Destroyed);
|
|
184
184
|
}
|
|
185
185
|
this.bindings = {
|
|
186
|
-
fs: this._options.host?.fs ?? (await import("
|
|
187
|
-
serial: this._options.host?.serial ?? (await import("
|
|
188
|
-
log: this._options.host?.log ?? (await import("
|
|
186
|
+
fs: this._options.host?.fs ?? (await import("#default_bindings/fs")).fs,
|
|
187
|
+
serial: this._options.host?.serial ?? (await import("#default_bindings/serial")).serial,
|
|
188
|
+
log: this._options.host?.log ?? (await import("#default_bindings/log")).log
|
|
189
189
|
};
|
|
190
190
|
this._logContainer = this.bindings.log(this._options.logConfig);
|
|
191
191
|
this.znifferLog = new import_Zniffer.ZnifferLogger(this, this._logContainer);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/zniffer/Zniffer.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\ttype CCParsingContext,\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 HostIDs,\n\ttype LogConfig,\n\ttype LogContainer,\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\tZnifferLRChannelConfig,\n\tZnifferRegion,\n\tZnifferRegionLegacy,\n\tgetChipTypeAndVersion,\n\tisLongRangeNodeId,\n\tisZWaveError,\n\tsdkVersionGte,\n\tsecurityClassIsS2,\n} from \"@zwave-js/core\";\nimport {\n\ttype ZWaveSerialBindingFactory,\n\ttype ZWaveSerialPortImplementation,\n\ttype ZnifferDataMessage,\n\tZnifferFrameType,\n\tZnifferGetFrequenciesRequest,\n\tZnifferGetFrequenciesResponse,\n\tZnifferGetFrequencyInfoRequest,\n\tZnifferGetFrequencyInfoResponse,\n\tZnifferGetLRChannelConfigInfoRequest,\n\tZnifferGetLRChannelConfigInfoResponse,\n\tZnifferGetLRChannelConfigsRequest,\n\tZnifferGetLRChannelConfigsResponse,\n\tZnifferGetLRRegionsRequest,\n\tZnifferGetLRRegionsResponse,\n\tZnifferGetVersionRequest,\n\tZnifferGetVersionResponse,\n\tZnifferMessage,\n\tZnifferMessageType,\n\tZnifferSerialFrameType,\n\ttype ZnifferSerialStream,\n\tZnifferSerialStreamFactory,\n\tZnifferSetBaudRateRequest,\n\tZnifferSetBaudRateResponse,\n\tZnifferSetFrequencyRequest,\n\tZnifferSetFrequencyResponse,\n\tZnifferSetLRChannelConfigRequest,\n\tZnifferSetLRChannelConfigResponse,\n\tZnifferStartRequest,\n\tZnifferStartResponse,\n\tZnifferStopRequest,\n\tZnifferStopResponse,\n\tisZWaveSerialPortImplementation,\n\twrapLegacySerialBinding,\n} from \"@zwave-js/serial\";\nimport {\n\tBytes,\n\tTypedEventTarget,\n\tgetEnumMemberName,\n\tisAbortError,\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 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\thost?: ZWaveOptions[\"host\"];\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/**\n\t * The LR channel configuration to initialize the Zniffer with. If not specified, the current setting will be kept.\n\t *\n\t * This is only supported for 800 series Zniffers with LR support\n\t */\n\tdefaultLRChannelConfig?: ZnifferLRChannelConfig;\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 TypedEventTarget<ZnifferEventCallbacks> {\n\tpublic constructor(\n\t\tprivate port:\n\t\t\t| string\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\t| ZWaveSerialPortImplementation\n\t\t\t| ZWaveSerialBindingFactory,\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\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/**\n\t * The host bindings used to access file system etc.\n\t */\n\t// This is set during `init()` and should not be accessed before\n\tprivate bindings!: Omit<\n\t\tRequired<\n\t\t\tNonNullable<ZWaveOptions[\"host\"]>\n\t\t>,\n\t\t\"db\"\n\t>;\n\n\tprivate serialFactory: ZnifferSerialStreamFactory | undefined;\n\t/** The serial port instance */\n\tprivate serial: ZnifferSerialStream | undefined;\n\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 _lrRegions: Set<number> = new Set();\n\t/** A list regions that are Long Range capable */\n\tpublic get lrRegions(): ReadonlySet<number> {\n\t\treturn this._lrRegions;\n\t}\n\n\tprivate _currentLRChannelConfig: number | undefined;\n\t/** The currently configured Long Range channel configuration */\n\tpublic get currentLRChannelConfig(): number | undefined {\n\t\treturn this._currentLRChannelConfig;\n\t}\n\n\tprivate _supportedLRChannelConfigs: Map<number, string> = new Map();\n\t/** A map of supported Long Range channel configurations and their names */\n\tpublic get supportedLRChannelConfigs(): ReadonlyMap<number, string> {\n\t\treturn this._supportedLRChannelConfigs;\n\t}\n\n\t// This is set during `start()` and should not be accessed before\n\tprivate _logContainer!: LogContainer;\n\t// This is set during `start()` and should not be accessed before\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// Populate default bindings. This has to happen asynchronously, so the driver does not have a hard dependency\n\t\t// on Node.js internals\n\t\tthis.bindings = {\n\t\t\tfs: this._options.host?.fs\n\t\t\t\t?? (await import(\"@zwave-js/core/bindings/fs/node\")).fs,\n\t\t\tserial: this._options.host?.serial\n\t\t\t\t?? (await import(\"@zwave-js/serial/bindings/node\")).serial,\n\t\t\tlog: this._options.host?.log\n\t\t\t\t?? (await import(\"@zwave-js/core/bindings/log/node\")).log,\n\t\t};\n\n\t\t// Initialize logging\n\t\tthis._logContainer = this.bindings.log(this._options.logConfig);\n\t\tthis.znifferLog = new ZnifferLogger(this, this._logContainer);\n\n\t\t// Open the serial port\n\t\tlet binding: ZWaveSerialBindingFactory;\n\t\tif (typeof this.port === \"string\") {\n\t\t\tif (\n\t\t\t\ttypeof this.bindings.serial.createFactoryByPath === \"function\"\n\t\t\t) {\n\t\t\t\tthis.znifferLog.print(`opening serial port ${this.port}`);\n\t\t\t\tbinding = await this.bindings.serial.createFactoryByPath(\n\t\t\t\t\tthis.port,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\"This platform does not support creating a serial connection by path\",\n\t\t\t\t\tZWaveErrorCodes.Driver_Failed,\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (isZWaveSerialPortImplementation(this.port)) {\n\t\t\tthis.znifferLog.print(\n\t\t\t\t\"opening serial port using the provided custom implementation\",\n\t\t\t);\n\t\t\tthis.znifferLog.print(\n\t\t\t\t\"This is deprecated! Switch to the factory pattern instead.\",\n\t\t\t\t\"warn\",\n\t\t\t);\n\t\t\tbinding = wrapLegacySerialBinding(this.port);\n\t\t} else {\n\t\t\tthis.znifferLog.print(\n\t\t\t\t\"opening serial port using the provided custom factory\",\n\t\t\t);\n\t\t\tbinding = this.port;\n\t\t}\n\t\tthis.serialFactory = new ZnifferSerialStreamFactory(\n\t\t\tbinding,\n\t\t\tthis._logContainer,\n\t\t);\n\n\t\tthis.serial = await this.serialFactory.createStream();\n\t\tvoid this.handleSerialData(this.serial);\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\tif (\n\t\t\tsdkVersionGte(\n\t\t\t\t`${versionInfo.majorVersion}.${versionInfo.minorVersion}`,\n\t\t\t\t\"10.22\",\n\t\t\t)\n\t\t) {\n\t\t\t// Simplicity SDK 2024.6 added commands to query and configure LR channels\n\t\t\tfor (const region of await this.getLRRegions()) {\n\t\t\t\tthis._lrRegions.add(region);\n\t\t\t}\n\n\t\t\tconst channels = await this.getLRChannelConfigs();\n\t\t\tthis._currentLRChannelConfig = channels.currentConfig;\n\t\t\t// The channel configs match the ZnifferLRChannelConfig enum\n\t\t\tfor (const channel of channels.supportedConfigs) {\n\t\t\t\tthis._supportedLRChannelConfigs.set(\n\t\t\t\t\tchannel,\n\t\t\t\t\tgetEnumMemberName(ZnifferLRChannelConfig, channel),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// ... but there might be unknown configurations. Query those from the Zniffer\n\t\t\tconst unknownConfigs = channels.supportedConfigs.filter((f) =>\n\t\t\t\t!isEnumMember(ZnifferLRChannelConfig, f)\n\t\t\t);\n\t\t\tfor (const channel of unknownConfigs) {\n\t\t\t\tconst channelInfo = await this.getLRChannelConfigInfo(\n\t\t\t\t\tchannel,\n\t\t\t\t);\n\t\t\t\tthis._supportedLRChannelConfigs.set(\n\t\t\t\t\tchannel,\n\t\t\t\t\tchannelInfo.configName,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.znifferLog.print(\n\t\t\t\t`received LR channel info:\n\tcurrent channel: ${\n\t\t\t\t\tthis._supportedLRChannelConfigs.get(\n\t\t\t\t\t\tthis._currentLRChannelConfig,\n\t\t\t\t\t)\n\t\t\t\t\t\t?? `unknown (${num2hex(this._currentLRChannelConfig)})`\n\t\t\t\t}\n\tsupported channels: ${\n\t\t\t\t\t[...this._supportedLRChannelConfigs].map((\n\t\t\t\t\t\t[channel, name],\n\t\t\t\t\t) => `\\n \u00B7 ${channel.toString()}: ${name}`).join(\"\")\n\t\t\t\t}`,\n\t\t\t\t\"info\",\n\t\t\t);\n\n\t\t\tif (\n\t\t\t\tthis._lrRegions.has(this._currentFrequency)\n\t\t\t\t&& typeof this._options.defaultLRChannelConfig === \"number\"\n\t\t\t\t&& this._currentLRChannelConfig\n\t\t\t\t\t!== this._options.defaultLRChannelConfig\n\t\t\t\t&& this._supportedLRChannelConfigs.has(\n\t\t\t\t\tthis._options.defaultLRChannelConfig,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tawait this.setLRChannelConfig(\n\t\t\t\t\tthis._options.defaultLRChannelConfig,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.emit(\"ready\");\n\t}\n\n\tprivate async handleSerialData(serial: ZnifferSerialStream): Promise<void> {\n\t\ttry {\n\t\t\tfor await (const frame of serial.readable) {\n\t\t\t\tsetImmediate(() => {\n\t\t\t\t\tif (frame.type === ZnifferSerialFrameType.SerialAPI) {\n\t\t\t\t\t\tvoid this.serialport_onData(frame.data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Handle discarded data?\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tif (isAbortError(e)) {\n\t\t\t\treturn;\n\t\t\t} else if (\n\t\t\t\tisZWaveError(e) && e.code === ZWaveErrorCodes.Driver_Failed\n\t\t\t) {\n\t\t\t\tthis.emit(\"error\", e);\n\t\t\t\treturn this.destroy();\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\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.parse(\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\tprivate async getLRRegions() {\n\t\tconst req = new ZnifferGetLRRegionsRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<ZnifferGetLRRegionsResponse>(\n\t\t\t(msg) => msg instanceof ZnifferGetLRRegionsResponse,\n\t\t\t1000,\n\t\t);\n\n\t\treturn res.regions;\n\t}\n\n\tprivate async getLRChannelConfigs() {\n\t\tconst req = new ZnifferGetLRChannelConfigsRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<\n\t\t\tZnifferGetLRChannelConfigsResponse\n\t\t>(\n\t\t\t(msg) => msg instanceof ZnifferGetLRChannelConfigsResponse,\n\t\t\t1000,\n\t\t);\n\n\t\treturn pick(res, [\n\t\t\t\"currentConfig\",\n\t\t\t\"supportedConfigs\",\n\t\t]);\n\t}\n\n\tpublic async setLRChannelConfig(channelConfig: number): Promise<void> {\n\t\tif (\n\t\t\tthis._currentFrequency == undefined\n\t\t\t|| !this._lrRegions.has(this._currentFrequency)\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The LR channel configuration can only be set for LR regions!`,\n\t\t\t\tZWaveErrorCodes.Controller_NotSupported,\n\t\t\t);\n\t\t}\n\n\t\tconst req = new ZnifferSetLRChannelConfigRequest({ channelConfig });\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tawait this.waitForMessage<ZnifferSetLRChannelConfigResponse>(\n\t\t\t(msg) => msg instanceof ZnifferSetLRChannelConfigResponse,\n\t\t\t1000,\n\t\t);\n\t\tthis._currentLRChannelConfig = channelConfig;\n\t}\n\n\tprivate async getLRChannelConfigInfo(channelConfig: number) {\n\t\tconst req = new ZnifferGetLRChannelConfigInfoRequest({ channelConfig });\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<\n\t\t\tZnifferGetLRChannelConfigInfoResponse\n\t\t>(\n\t\t\t(msg) =>\n\t\t\t\tmsg instanceof ZnifferGetLRChannelConfigInfoResponse\n\t\t\t\t&& msg.channelConfig === channelConfig,\n\t\t\t1000,\n\t\t);\n\n\t\treturn pick(res, [\"numChannels\", \"configName\"]);\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.setKey(\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.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\tawait securityManagerLR.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 this.bindings.fs.writeFile(\n\t\t\tfilePath,\n\t\t\tthis.getCaptureAsZLFBuffer(frameFilter),\n\t\t);\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\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\ttype CCParsingContext,\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 HostIDs,\n\ttype LogConfig,\n\ttype LogContainer,\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\tZnifferLRChannelConfig,\n\tZnifferRegion,\n\tZnifferRegionLegacy,\n\tgetChipTypeAndVersion,\n\tisLongRangeNodeId,\n\tisZWaveError,\n\tsdkVersionGte,\n\tsecurityClassIsS2,\n} from \"@zwave-js/core\";\nimport {\n\ttype ZWaveSerialBindingFactory,\n\ttype ZWaveSerialPortImplementation,\n\ttype ZnifferDataMessage,\n\tZnifferFrameType,\n\tZnifferGetFrequenciesRequest,\n\tZnifferGetFrequenciesResponse,\n\tZnifferGetFrequencyInfoRequest,\n\tZnifferGetFrequencyInfoResponse,\n\tZnifferGetLRChannelConfigInfoRequest,\n\tZnifferGetLRChannelConfigInfoResponse,\n\tZnifferGetLRChannelConfigsRequest,\n\tZnifferGetLRChannelConfigsResponse,\n\tZnifferGetLRRegionsRequest,\n\tZnifferGetLRRegionsResponse,\n\tZnifferGetVersionRequest,\n\tZnifferGetVersionResponse,\n\tZnifferMessage,\n\tZnifferMessageType,\n\tZnifferSerialFrameType,\n\ttype ZnifferSerialStream,\n\tZnifferSerialStreamFactory,\n\tZnifferSetBaudRateRequest,\n\tZnifferSetBaudRateResponse,\n\tZnifferSetFrequencyRequest,\n\tZnifferSetFrequencyResponse,\n\tZnifferSetLRChannelConfigRequest,\n\tZnifferSetLRChannelConfigResponse,\n\tZnifferStartRequest,\n\tZnifferStartResponse,\n\tZnifferStopRequest,\n\tZnifferStopResponse,\n\tisZWaveSerialPortImplementation,\n\twrapLegacySerialBinding,\n} from \"@zwave-js/serial\";\nimport {\n\tBytes,\n\tTypedEventTarget,\n\tgetEnumMemberName,\n\tisAbortError,\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 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\thost?: ZWaveOptions[\"host\"];\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/**\n\t * The LR channel configuration to initialize the Zniffer with. If not specified, the current setting will be kept.\n\t *\n\t * This is only supported for 800 series Zniffers with LR support\n\t */\n\tdefaultLRChannelConfig?: ZnifferLRChannelConfig;\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 TypedEventTarget<ZnifferEventCallbacks> {\n\tpublic constructor(\n\t\tprivate port:\n\t\t\t| string\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\t| ZWaveSerialPortImplementation\n\t\t\t| ZWaveSerialBindingFactory,\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\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/**\n\t * The host bindings used to access file system etc.\n\t */\n\t// This is set during `init()` and should not be accessed before\n\tprivate bindings!: Omit<\n\t\tRequired<\n\t\t\tNonNullable<ZWaveOptions[\"host\"]>\n\t\t>,\n\t\t\"db\"\n\t>;\n\n\tprivate serialFactory: ZnifferSerialStreamFactory | undefined;\n\t/** The serial port instance */\n\tprivate serial: ZnifferSerialStream | undefined;\n\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 _lrRegions: Set<number> = new Set();\n\t/** A list regions that are Long Range capable */\n\tpublic get lrRegions(): ReadonlySet<number> {\n\t\treturn this._lrRegions;\n\t}\n\n\tprivate _currentLRChannelConfig: number | undefined;\n\t/** The currently configured Long Range channel configuration */\n\tpublic get currentLRChannelConfig(): number | undefined {\n\t\treturn this._currentLRChannelConfig;\n\t}\n\n\tprivate _supportedLRChannelConfigs: Map<number, string> = new Map();\n\t/** A map of supported Long Range channel configurations and their names */\n\tpublic get supportedLRChannelConfigs(): ReadonlyMap<number, string> {\n\t\treturn this._supportedLRChannelConfigs;\n\t}\n\n\t// This is set during `start()` and should not be accessed before\n\tprivate _logContainer!: LogContainer;\n\t// This is set during `start()` and should not be accessed before\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// Populate default bindings. This has to happen asynchronously, so the driver does not have a hard dependency\n\t\t// on Node.js internals\n\t\tthis.bindings = {\n\t\t\tfs: this._options.host?.fs\n\t\t\t\t?? (await import(\"#default_bindings/fs\")).fs,\n\t\t\tserial: this._options.host?.serial\n\t\t\t\t?? (await import(\"#default_bindings/serial\")).serial,\n\t\t\tlog: this._options.host?.log\n\t\t\t\t?? (await import(\"#default_bindings/log\")).log,\n\t\t};\n\n\t\t// Initialize logging\n\t\tthis._logContainer = this.bindings.log(this._options.logConfig);\n\t\tthis.znifferLog = new ZnifferLogger(this, this._logContainer);\n\n\t\t// Open the serial port\n\t\tlet binding: ZWaveSerialBindingFactory;\n\t\tif (typeof this.port === \"string\") {\n\t\t\tif (\n\t\t\t\ttypeof this.bindings.serial.createFactoryByPath === \"function\"\n\t\t\t) {\n\t\t\t\tthis.znifferLog.print(`opening serial port ${this.port}`);\n\t\t\t\tbinding = await this.bindings.serial.createFactoryByPath(\n\t\t\t\t\tthis.port,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\"This platform does not support creating a serial connection by path\",\n\t\t\t\t\tZWaveErrorCodes.Driver_Failed,\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (isZWaveSerialPortImplementation(this.port)) {\n\t\t\tthis.znifferLog.print(\n\t\t\t\t\"opening serial port using the provided custom implementation\",\n\t\t\t);\n\t\t\tthis.znifferLog.print(\n\t\t\t\t\"This is deprecated! Switch to the factory pattern instead.\",\n\t\t\t\t\"warn\",\n\t\t\t);\n\t\t\tbinding = wrapLegacySerialBinding(this.port);\n\t\t} else {\n\t\t\tthis.znifferLog.print(\n\t\t\t\t\"opening serial port using the provided custom factory\",\n\t\t\t);\n\t\t\tbinding = this.port;\n\t\t}\n\t\tthis.serialFactory = new ZnifferSerialStreamFactory(\n\t\t\tbinding,\n\t\t\tthis._logContainer,\n\t\t);\n\n\t\tthis.serial = await this.serialFactory.createStream();\n\t\tvoid this.handleSerialData(this.serial);\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\tif (\n\t\t\tsdkVersionGte(\n\t\t\t\t`${versionInfo.majorVersion}.${versionInfo.minorVersion}`,\n\t\t\t\t\"10.22\",\n\t\t\t)\n\t\t) {\n\t\t\t// Simplicity SDK 2024.6 added commands to query and configure LR channels\n\t\t\tfor (const region of await this.getLRRegions()) {\n\t\t\t\tthis._lrRegions.add(region);\n\t\t\t}\n\n\t\t\tconst channels = await this.getLRChannelConfigs();\n\t\t\tthis._currentLRChannelConfig = channels.currentConfig;\n\t\t\t// The channel configs match the ZnifferLRChannelConfig enum\n\t\t\tfor (const channel of channels.supportedConfigs) {\n\t\t\t\tthis._supportedLRChannelConfigs.set(\n\t\t\t\t\tchannel,\n\t\t\t\t\tgetEnumMemberName(ZnifferLRChannelConfig, channel),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// ... but there might be unknown configurations. Query those from the Zniffer\n\t\t\tconst unknownConfigs = channels.supportedConfigs.filter((f) =>\n\t\t\t\t!isEnumMember(ZnifferLRChannelConfig, f)\n\t\t\t);\n\t\t\tfor (const channel of unknownConfigs) {\n\t\t\t\tconst channelInfo = await this.getLRChannelConfigInfo(\n\t\t\t\t\tchannel,\n\t\t\t\t);\n\t\t\t\tthis._supportedLRChannelConfigs.set(\n\t\t\t\t\tchannel,\n\t\t\t\t\tchannelInfo.configName,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.znifferLog.print(\n\t\t\t\t`received LR channel info:\n\tcurrent channel: ${\n\t\t\t\t\tthis._supportedLRChannelConfigs.get(\n\t\t\t\t\t\tthis._currentLRChannelConfig,\n\t\t\t\t\t)\n\t\t\t\t\t\t?? `unknown (${num2hex(this._currentLRChannelConfig)})`\n\t\t\t\t}\n\tsupported channels: ${\n\t\t\t\t\t[...this._supportedLRChannelConfigs].map((\n\t\t\t\t\t\t[channel, name],\n\t\t\t\t\t) => `\\n \u00B7 ${channel.toString()}: ${name}`).join(\"\")\n\t\t\t\t}`,\n\t\t\t\t\"info\",\n\t\t\t);\n\n\t\t\tif (\n\t\t\t\tthis._lrRegions.has(this._currentFrequency)\n\t\t\t\t&& typeof this._options.defaultLRChannelConfig === \"number\"\n\t\t\t\t&& this._currentLRChannelConfig\n\t\t\t\t\t!== this._options.defaultLRChannelConfig\n\t\t\t\t&& this._supportedLRChannelConfigs.has(\n\t\t\t\t\tthis._options.defaultLRChannelConfig,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tawait this.setLRChannelConfig(\n\t\t\t\t\tthis._options.defaultLRChannelConfig,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.emit(\"ready\");\n\t}\n\n\tprivate async handleSerialData(serial: ZnifferSerialStream): Promise<void> {\n\t\ttry {\n\t\t\tfor await (const frame of serial.readable) {\n\t\t\t\tsetImmediate(() => {\n\t\t\t\t\tif (frame.type === ZnifferSerialFrameType.SerialAPI) {\n\t\t\t\t\t\tvoid this.serialport_onData(frame.data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Handle discarded data?\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tif (isAbortError(e)) {\n\t\t\t\treturn;\n\t\t\t} else if (\n\t\t\t\tisZWaveError(e) && e.code === ZWaveErrorCodes.Driver_Failed\n\t\t\t) {\n\t\t\t\tthis.emit(\"error\", e);\n\t\t\t\treturn this.destroy();\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\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.parse(\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\tprivate async getLRRegions() {\n\t\tconst req = new ZnifferGetLRRegionsRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<ZnifferGetLRRegionsResponse>(\n\t\t\t(msg) => msg instanceof ZnifferGetLRRegionsResponse,\n\t\t\t1000,\n\t\t);\n\n\t\treturn res.regions;\n\t}\n\n\tprivate async getLRChannelConfigs() {\n\t\tconst req = new ZnifferGetLRChannelConfigsRequest();\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<\n\t\t\tZnifferGetLRChannelConfigsResponse\n\t\t>(\n\t\t\t(msg) => msg instanceof ZnifferGetLRChannelConfigsResponse,\n\t\t\t1000,\n\t\t);\n\n\t\treturn pick(res, [\n\t\t\t\"currentConfig\",\n\t\t\t\"supportedConfigs\",\n\t\t]);\n\t}\n\n\tpublic async setLRChannelConfig(channelConfig: number): Promise<void> {\n\t\tif (\n\t\t\tthis._currentFrequency == undefined\n\t\t\t|| !this._lrRegions.has(this._currentFrequency)\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The LR channel configuration can only be set for LR regions!`,\n\t\t\t\tZWaveErrorCodes.Controller_NotSupported,\n\t\t\t);\n\t\t}\n\n\t\tconst req = new ZnifferSetLRChannelConfigRequest({ channelConfig });\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tawait this.waitForMessage<ZnifferSetLRChannelConfigResponse>(\n\t\t\t(msg) => msg instanceof ZnifferSetLRChannelConfigResponse,\n\t\t\t1000,\n\t\t);\n\t\tthis._currentLRChannelConfig = channelConfig;\n\t}\n\n\tprivate async getLRChannelConfigInfo(channelConfig: number) {\n\t\tconst req = new ZnifferGetLRChannelConfigInfoRequest({ channelConfig });\n\t\tawait this.serial?.writeAsync(req.serialize());\n\t\tconst res = await this.waitForMessage<\n\t\t\tZnifferGetLRChannelConfigInfoResponse\n\t\t>(\n\t\t\t(msg) =>\n\t\t\t\tmsg instanceof ZnifferGetLRChannelConfigInfoResponse\n\t\t\t\t&& msg.channelConfig === channelConfig,\n\t\t\t1000,\n\t\t);\n\n\t\treturn pick(res, [\"numChannels\", \"configName\"]);\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.setKey(\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.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\tawait securityManagerLR.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 this.bindings.fs.writeFile(\n\t\t\tfilePath,\n\t\t\tthis.getCaptureAsZLFBuffer(frameFilter),\n\t\t);\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\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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,gBAOO;AACP,oBAA6B;AAC7B,kBA2BO;AACP,oBAkCO;AACP,oBASO;AACP,8BAGO;AAEP,qBAA8B;AAC9B,kBAQO;AAEP,MAAM,OAAe;;;;;;;EAOnB,KAAI;AA6DN,SAAS,gBACR,UAAuC;AAEvC,MAAI,OAAO,aAAa,UAAU;AACjC,WAAO,SAAS,QAAQ;EACzB;AAEA,QAAM,sBAAkB,mCAAsB,QAAQ;AACtD,MAAI,iBAAiB;AACpB,WAAO,gBAAgB,QAAQ;EAChC;AAEA,SAAO;AACR;AAbS;AAeT,SAAS,eACR,MACA,UAAuC;AAKvC,MAAI,gBAAgB,QAAQ,GAAG;AAC9B,WAAO,OAAO,IAAI;EACnB,OAAO;AACN,WAAO,OAAO,MAAM;EACrB;AACD;AAZS;AA2BH,MAAO,gBAAgB,+BAAuC;EAhNpE,OAgNoE;;;EAE1D;EADT,YACS,MAKR,UAA0B,CAAA,GAAE;AAE5B,UAAK;AAPG,SAAA,OAAA;AAUR,QACC,OAAO,SAAS,YACb,KAAC,+CAAgC,IAAI,GACvC;AACD,YAAM,IAAI,uBACT,2EACA,4BAAgB,qBAAqB;IAEvC;AAEA,SAAK,WAAW;AAEhB,SAAK,UAAU;AAEf,SAAK,iBAAiB;MACrB,wBACC,SAAe;AAEf,eAAO,0BAAc;MACtB;MAEA,iBACC,SACA,gBAA6B;AAG7B,eAAO;MACR;MAEA,iBACC,SACA,gBACA,UAAiB;MAGlB;MAEA,gBAAgB,SAAe;AAG9B,eAAO,IAAI;UACV;UACA;UACA;UACA;UACA;UACA;UACA,CAAA;UACA;YACC,KAAK;YACL,KAAK;;UAEN;UACA;UACA;UACA;UACA;;UAEA;YACC,yCAAyC;YACzC,oCAAoC;;QACpC;MAEH;;EAEF;EAEQ;;;;;EAMA;EAOA;;EAEA;EAEA;EAKA;EACR,IAAY,eAAY;AACvB,WAAO,CAAC,CAAC,KAAK;EACf;EAEQ;EAEA;;EAER,IAAW,mBAAgB;AAC1B,WAAO,KAAK;EACb;EAEQ,wBAA6C,oBAAI,IAAG;;EAE5D,IAAW,uBAAoB;AAC9B,WAAO,KAAK;EACb;EAEQ,aAA0B,oBAAI,IAAG;;EAEzC,IAAW,YAAS;AACnB,WAAO,KAAK;EACb;EAEQ;;EAER,IAAW,yBAAsB;AAChC,WAAO,KAAK;EACb;EAEQ,6BAAkD,oBAAI,IAAG;;EAEjE,IAAW,4BAAyB;AACnC,WAAO,KAAK;EACb;;EAGQ;;EAEA;;EAGA,mBAIH,oBAAI,IAAG;;EAGJ,kBAAyC,CAAA;EAEzC;;EAER,IAAW,SAAM;AAChB,WAAO,KAAK;EACb;EAEQ,kBAAkC,CAAA;;EAG1C,IAAW,iBAAc;AACxB,WAAO,KAAK,gBAAgB,OAAO,CAAC,MAAM,EAAE,gBAAgB,MAAS,EACnE,IAAI,CAAC,OAAO;MACZ,WAAW,EAAE;MACb,WAAW,EAAE;MACb,aAAa,EAAE;MACd;EACJ;EAEO,MAAM,OAAI;AAChB,QAAI,KAAK,cAAc;AACtB,YAAM,IAAI,uBACT,6EACA,4BAAgB,gBAAgB;IAElC;AAIA,SAAK,WAAW;MACf,IAAI,KAAK,SAAS,MAAM,OACnB,MAAM,OAAO,sBAAsB,GAAG;MAC3C,QAAQ,KAAK,SAAS,MAAM,WACvB,MAAM,OAAO,0BAA0B,GAAG;MAC/C,KAAK,KAAK,SAAS,MAAM,QACpB,MAAM,OAAO,uBAAuB,GAAG;;AAI7C,SAAK,gBAAgB,KAAK,SAAS,IAAI,KAAK,SAAS,SAAS;AAC9D,SAAK,aAAa,IAAI,6BAAc,MAAM,KAAK,aAAa;AAG5D,QAAI;AACJ,QAAI,OAAO,KAAK,SAAS,UAAU;AAClC,UACC,OAAO,KAAK,SAAS,OAAO,wBAAwB,YACnD;AACD,aAAK,WAAW,MAAM,uBAAuB,KAAK,IAAI,EAAE;AACxD,kBAAU,MAAM,KAAK,SAAS,OAAO,oBACpC,KAAK,IAAI;MAEX,OAAO;AACN,cAAM,IAAI,uBACT,uEACA,4BAAgB,aAAa;MAE/B;IACD,eAAW,+CAAgC,KAAK,IAAI,GAAG;AACtD,WAAK,WAAW,MACf,8DAA8D;AAE/D,WAAK,WAAW,MACf,8DACA,MAAM;AAEP,oBAAU,uCAAwB,KAAK,IAAI;IAC5C,OAAO;AACN,WAAK,WAAW,MACf,uDAAuD;AAExD,gBAAU,KAAK;IAChB;AACA,SAAK,gBAAgB,IAAI,yCACxB,SACA,KAAK,aAAa;AAGnB,SAAK,SAAS,MAAM,KAAK,cAAc,aAAY;AACnD,SAAK,KAAK,iBAAiB,KAAK,MAAM;AAEtC,SAAK,WAAW,MAAM,MAAM,MAAM;AAElC,UAAM,KAAK,KAAI;AAEf,UAAM,cAAc,MAAM,KAAK,WAAU;AACzC,SAAK,YAAY,YAAY;AAC7B,SAAK,WAAW,MACf;qBAEC,OAAO,YAAY,aAAa,WAC7B,YAAY,WACZ,gBAAY,uBAAQ,YAAY,SAAS,IAAI,CAAC,SAC/C,uBAAQ,YAAY,SAAS,OAAO,CACrC,GACF;qBACkB,YAAY,YAAY,IAAI,YAAY,YAAY,IACtE,MAAM;AAGP,UAAM,KAAK,YAAY,CAAC;AAExB,UAAM,QAAQ,MAAM,KAAK,eAAc;AACvC,SAAK,oBAAoB,MAAM;AAC/B,QAAI,gBAAgB,KAAK,SAAS,GAAG;AAEpC,iBAAW,QAAQ,MAAM,sBAAsB;AAC9C,aAAK,sBAAsB,IAC1B,UACA,iCAAkB,2BAAe,IAAI,CAAC;MAExC;AAEA,YAAM,iBAAiB,MAAM,qBAAqB,OAAO,CAAC,MACzD,KAAC,4BAAa,2BAAe,CAAC,CAAC;AAEhC,iBAAW,QAAQ,gBAAgB;AAClC,cAAM,WAAW,MAAM,KAAK,iBAAiB,IAAI;AACjD,aAAK,sBAAsB,IAAI,MAAM,SAAS,aAAa;MAC5D;IACD;;UAEC,2BACC,GAAG,YAAY,YAAY,IAAI,YAAY,YAAY,IACvD,MAAM;MAEN;AAED,iBAAW,QAAQ,MAAM,sBAAsB;AAC9C,cAAM,WAAW,MAAM,KAAK,iBAAiB,IAAI;AACjD,aAAK,sBAAsB,IAAI,MAAM,SAAS,aAAa;MAC5D;IACD,OAAO;AAEN,iBAAW,QAAQ,MAAM,sBAAsB;AAC9C,aAAK,sBAAsB,IAC1B,UACA,iCAAkB,iCAAqB,IAAI,CAAC;MAE9C;IACD;AAEA,SAAK,WAAW,MACf;qBAEC,KAAK,sBAAsB,IAAI,MAAM,gBAAgB,KACjD,gBAAY,uBAAQ,MAAM,gBAAgB,CAAC,GAChD;yBAEC,CAAC,GAAG,KAAK,qBAAqB,EAAE,IAAI,CAAC,CAAC,QAAQ,IAAI,MACjD;SAAS,OAAO,SAAQ,EAAG,SAAS,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,EACrD,KAAK,EAAE,CACV,IACA,MAAM;AAGP,QACC,OAAO,KAAK,SAAS,qBAAqB,YACvC,MAAM,qBAAqB,KAAK,SAAS,oBACzC,KAAK,sBAAsB,IAAI,KAAK,SAAS,gBAAgB,GAC/D;AACD,YAAM,KAAK,aAAa,KAAK,SAAS,gBAAgB;IACvD;AAEA,YACC,2BACC,GAAG,YAAY,YAAY,IAAI,YAAY,YAAY,IACvD,OAAO,GAEP;AAED,iBAAW,UAAU,MAAM,KAAK,aAAY,GAAI;AAC/C,aAAK,WAAW,IAAI,MAAM;MAC3B;AAEA,YAAM,WAAW,MAAM,KAAK,oBAAmB;AAC/C,WAAK,0BAA0B,SAAS;AAExC,iBAAW,WAAW,SAAS,kBAAkB;AAChD,aAAK,2BAA2B,IAC/B,aACA,iCAAkB,oCAAwB,OAAO,CAAC;MAEpD;AAEA,YAAM,iBAAiB,SAAS,iBAAiB,OAAO,CAAC,MACxD,KAAC,4BAAa,oCAAwB,CAAC,CAAC;AAEzC,iBAAW,WAAW,gBAAgB;AACrC,cAAM,cAAc,MAAM,KAAK,uBAC9B,OAAO;AAER,aAAK,2BAA2B,IAC/B,SACA,YAAY,UAAU;MAExB;AAEA,WAAK,WAAW,MACf;oBAEC,KAAK,2BAA2B,IAC/B,KAAK,uBAAuB,KAEzB,gBAAY,uBAAQ,KAAK,uBAAuB,CAAC,GACtD;uBAEC,CAAC,GAAG,KAAK,0BAA0B,EAAE,IAAI,CACxC,CAAC,SAAS,IAAI,MACV;SAAS,QAAQ,SAAQ,CAAE,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,CACrD,IACA,MAAM;AAGP,UACC,KAAK,WAAW,IAAI,KAAK,iBAAiB,KACvC,OAAO,KAAK,SAAS,2BAA2B,YAChD,KAAK,4BACH,KAAK,SAAS,0BAChB,KAAK,2BAA2B,IAClC,KAAK,SAAS,sBAAsB,GAEpC;AACD,cAAM,KAAK,mBACV,KAAK,SAAS,sBAAsB;MAEtC;IACD;AAEA,SAAK,KAAK,OAAO;EAClB;EAEQ,MAAM,iBAAiB,QAA2B;AACzD,QAAI;AACH,uBAAiB,SAAS,OAAO,UAAU;AAC1C,qBAAa,MAAK;AACjB,cAAI,MAAM,SAAS,qCAAuB,WAAW;AACpD,iBAAK,KAAK,kBAAkB,MAAM,IAAI;UACvC,OAAO;UAEP;QACD,CAAC;MACF;IACD,SAAS,GAAG;AACX,cAAI,4BAAa,CAAC,GAAG;AACpB;MACD,eACC,0BAAa,CAAC,KAAK,EAAE,SAAS,4BAAgB,eAC7C;AACD,aAAK,KAAK,SAAS,CAAC;AACpB,eAAO,KAAK,QAAO;MACpB;AACA,YAAM;IACP;EACD;;;;EAKQ,MAAM,kBACb,MAAgB;AAEhB,QAAI;AACJ,QAAI;AACH,YAAM,6BAAe,MAAM,IAAI;IAChC,SAAS,GAAQ;AAChB,cAAQ,MAAM,CAAC;AACf;IACD;AAEA,QAAI,IAAI,SAAS,iCAAmB,SAAS;AAC5C,WAAK,eAAe,GAAG;IACxB,OAAO;AACN,YAAM,UAAU;AAChB,YAAM,UAAwB;QAC7B,WAAW,oBAAI,KAAI;QACnB,SAAS;QACT,WAAW,QAAQ;;AAEpB,WAAK,gBAAgB,KAAK,OAAO;AACjC,UACC,KAAK,SAAS,qBAAqB,UAChC,KAAK,gBAAgB,SAAS,KAAK,SAAS,mBAC9C;AACD,aAAK,gBAAgB,MAAK;MAC3B;AACA,YAAM,KAAK,kBAAkB,SAAS,OAAO;IAC9C;EACD;;;;EAKQ,eAAe,KAAmB;AAEzC,eAAW,SAAS,KAAK,iBAAiB;AACzC,UAAI,MAAM,UAAU,GAAG,GAAG;AAEzB,cAAM,QAAQ,GAAG;AACjB;MACD;IACD;EACD;;;;EAKQ,MAAM,kBACb,KACA,SAAqB;AAErB,QAAI;AACH,UAAI;AACJ,UAAI,KAAK,SAAS,eAAe,KAAK,WAAW;AAChD,wBAAgB,eACf,IAAI,SACJ,KAAK,SAAS;MAEhB;AAGA,UACC,IAAI,cAAc,+BAAiB,aAChC,IAAI,cAAc,+BAAiB,UACrC;AACD,cAAM,WAAO,4BAAe,GAAG;AAC/B,aAAK,UAAU,OAAO;AAGtB,aAAK,WAAW,KAAK,IAAI;AACzB,cAAMA,aAAQ,yBAAY,IAAI;AAC9B,gBAAQ,cAAcA;AACtB,aAAK,KAAK,SAASA,QAAO,QAAQ,SAAS;AAC3C;MACD;AAGA,UAAI,CAAC,IAAI,YAAY;AACpB,aAAK,WAAW,SAAS,GAAG;AAC5B,cAAMA,aAAQ,gDAAmC,GAAG;AACpD,gBAAQ,cAAcA;AACtB,aAAK,KAAK,mBAAmBA,QAAO,QAAQ,SAAS;AACrD;MACD;AAEA,YAAM,WAAO,uBAAU,GAAG;AAC1B,WAAK,UAAU,OAAO;AAGtB,UAAI;AACJ,UAAI;AACJ,UAAI;AAEJ,UAAI,aAAa;AAEjB,UAAI;AAIJ,UACC,KAAK,QAAQ,SAAS,KACnB,KAAK,eAAe,2BAAe,iBACrC;AACD,YAAI,uBAAuB,MAAM;AAChC,uBAAa,KAAK;AAClB,WAAC;YACA,iBAAiB;YACjB,kBAAkB;YAClB,mBAAmB;cAChB,MAAM,KAAK,oBAAoB,KAAK,iBAAiB;QAC1D;AAGA,cAAM,YACL,KAAK,eAAe,2BAAe,YAChC,cACC,eAAe,iCACb,eAAe,mCAClB,cACA;AACJ,YAAI;AACH,eAAK,MAAM,uBAAa,MACvB,KAAK,SACL;YACC,QAAQ,KAAK;YACb,WAAW;YACX,cAAc,KAAK;YACnB;YACA,iBAAiB;YACjB,kBAAkB;YAClB,mBAAmB;YACnB,GAAG,KAAK;WACR;QAEH,SAAS,GAAQ;AAEhB,kBAAQ,MAAM,EAAE,KAAK;QACtB;MACD;AAEA,WAAK,WAAW,KAAK,MAAM,EAAE;AAG7B,YAAM,YAAQ,yBAAY,MAAM,EAAE;AAClC,cAAQ,cAAc;AACtB,WAAK,KAAK,SAAS,OAAO,QAAQ,SAAS;AAI3C,UAAI,IAAI,SAAS,2BAAe,YAAY,GAAG;AAC9C,cAAM,mBAAmB,MAAM,KAAK,oBACnC,KAAK,YAAY;AAElB,cAAM,WAAO,+BAAkB,KAAK,YAAY,SAC5C,+BAAkB,UAAU;AAChC,cAAM,wBAAwB,OAC3B,iBAAiB,oBACjB,iBAAiB;AACpB,cAAMC,uBAAsB,OACzB,wBACA;AAEH,YAAI,yBAAyBA,sBAAqB;AACjD,cAAI,cAAc,+BAAqB;AAEtC,kCAAsB,YAAY,UAAU;AAC5C,YAAAA,qBAAoB,YAAY,KAAK,YAAY;UAClD,WAAW,cAAc,oCAA0B,GAAG,KAAK;AAE1D,kCAAsB,aAAa,YAAY;cAC9C,MAAM,sBAAU;cAChB,YAAY,GAAG;aACf;AACD,YAAAA,qBAAoB,cACnB,KAAK,cACL,GAAG,UAAW;UAEhB,WAAW,cAAc,2CAAiC;AACzD,kBAAM,WAAW,GAAG,YAAW;AAC/B,gBAAI,UAAU;AAKb,oBAAM,oBAAoBA,qBACxB,aAAa,KAAK,YAAY;AAChC,kBAAI,kBAAkB,SAAS,sBAAU,MAAM;AAC9C,sCAAsB,aACrB,YACA,iBAAiB;cAEnB;YACD;UACD;QACD;MACD,WACC,IAAI,SAAS,2BAAe,YACzB,cAAc,iCAChB;AACD,cAAM,yBACJ,MAAM,KAAK,oBAAoB,KAAK,YAAY,GAC/C;AACH,cAAMA,wBACJ,MAAM,KAAK,oBAAoB,UAAU,GACxC;AAEH,YAAI,yBAAyBA,sBAAqB;AAEjD,gCAAsB,SACrB;YACC,QAAQ,KAAK;YACb,SAAS,sBAAsB,WAC9B,GAAG,KAAK;aAGV;YACC,OAAO,GAAG;YACV,UAAU;aAEX,EAAE,MAAM,KAAI,CAAE;AAGf,UAAAA,qBAAoB,SACnB;YACC,QAAQ,KAAK;YACb,SAAS,sBAAsB,WAC9B,GAAG,KAAK;aAGV;YACC,OAAO,GAAG;YACV,UAAU;aAEX,EAAE,MAAM,KAAI,CAAE;QAEhB;MACD;IACD,SAAS,GAAQ;AAChB,cAAQ,MAAM,CAAC;IAChB;EACD;;;;;;EAOQ,eACP,WACA,SAAe;AAEf,WAAO,IAAI,QAAW,CAAC,SAAS,WAAU;AACzC,YAAM,cAAU,+CAAqB;AACrC,YAAM,QAA6B;QAClC;QACA,SAAS,wBAAC,QAAQ,QAAQ,QAAQ,GAAG,GAA5B;QACT,SAAS;;AAEV,WAAK,gBAAgB,KAAK,KAAK;AAC/B,YAAM,cAAc,6BAAK;AACxB,YAAI,MAAM;AAAS,uBAAa,MAAM,OAAO;AAC7C,cAAM,QAAQ,KAAK,gBAAgB,QAAQ,KAAK;AAChD,YAAI,UAAU;AAAI,eAAK,gBAAgB,OAAO,OAAO,CAAC;MACvD,GAJoB;AAMpB,YAAM,UAAU,WAAW,MAAK;AAC/B,oBAAW;AACX,eACC,IAAI,uBACH,6DACA,4BAAgB,kBAAkB,CAClC;MAEH,GAAG,OAAO;AAEV,WAAK,QAAQ,KAAK,CAAC,OAAM;AACxB,oBAAW;AACX,gBAAQ,EAAO;MAChB,CAAC;IACF,CAAC;EACF;EAEQ,MAAM,aAAU;AACvB,UAAM,MAAM,IAAI,uCAAwB;AACxC,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,MAAM,MAAM,KAAK,eACtB,CAAC,QAAQ,eAAe,yCACxB,GAAI;AAGL,eAAO,oBAAK,KAAK,CAAC,YAAY,gBAAgB,cAAc,CAAC;EAC9D;EAEQ,MAAM,iBAAc;AAC3B,UAAM,MAAM,IAAI,2CAA4B;AAC5C,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,MAAM,MAAM,KAAK,eACtB,CAAC,QAAQ,eAAe,6CACxB,GAAI;AAGL,eAAO,oBAAK,KAAK;MAChB;MACA;KACA;EACF;EAEO,MAAM,aAAa,WAAiB;AAC1C,UAAM,MAAM,IAAI,yCAA2B,EAAE,UAAS,CAAE;AACxD,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,KAAK,eACV,CAAC,QAAQ,eAAe,2CACxB,GAAI;AAEL,SAAK,oBAAoB;EAC1B;EAEQ,MAAM,iBAAiB,WAAiB;AAC/C,UAAM,MAAM,IAAI,6CAA+B,EAAE,UAAS,CAAE;AAC5D,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,MAAM,MAAM,KAAK,eACtB,CAAC,QACA,eAAe,iDACZ,IAAI,cAAc,WACtB,GAAI;AAGL,eAAO,oBAAK,KAAK,CAAC,eAAe,eAAe,CAAC;EAClD;EAEQ,MAAM,eAAY;AACzB,UAAM,MAAM,IAAI,yCAA0B;AAC1C,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,MAAM,MAAM,KAAK,eACtB,CAAC,QAAQ,eAAe,2CACxB,GAAI;AAGL,WAAO,IAAI;EACZ;EAEQ,MAAM,sBAAmB;AAChC,UAAM,MAAM,IAAI,gDAAiC;AACjD,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,MAAM,MAAM,KAAK,eAGtB,CAAC,QAAQ,eAAe,kDACxB,GAAI;AAGL,eAAO,oBAAK,KAAK;MAChB;MACA;KACA;EACF;EAEO,MAAM,mBAAmB,eAAqB;AACpD,QACC,KAAK,qBAAqB,UACvB,CAAC,KAAK,WAAW,IAAI,KAAK,iBAAiB,GAC7C;AACD,YAAM,IAAI,uBACT,gEACA,4BAAgB,uBAAuB;IAEzC;AAEA,UAAM,MAAM,IAAI,+CAAiC,EAAE,cAAa,CAAE;AAClE,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,KAAK,eACV,CAAC,QAAQ,eAAe,iDACxB,GAAI;AAEL,SAAK,0BAA0B;EAChC;EAEQ,MAAM,uBAAuB,eAAqB;AACzD,UAAM,MAAM,IAAI,mDAAqC,EAAE,cAAa,CAAE;AACtE,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,MAAM,MAAM,KAAK,eAGtB,CAAC,QACA,eAAe,uDACZ,IAAI,kBAAkB,eAC1B,GAAI;AAGL,eAAO,oBAAK,KAAK,CAAC,eAAe,YAAY,CAAC;EAC/C;;EAGO,MAAM,QAAK;AACjB,QAAI,KAAK,cAAc;AACtB,YAAM,IAAI,uBACT,kDACA,4BAAgB,eAAe;IAEjC;AAEA,QAAI,KAAK;AAAS;AAClB,SAAK,kBAAkB,CAAA;AACvB,SAAK,UAAU;AAEf,UAAM,MAAM,IAAI,kCAAmB;AACnC,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,KAAK,eACV,CAAC,QAAQ,eAAe,oCACxB,GAAI;EAEN;EAEO,MAAM,OAAI;AAChB,QAAI,CAAC,KAAK;AAAS;AACnB,SAAK,UAAU;AAEf,QAAI,CAAC,KAAK;AAAQ;AAElB,UAAM,MAAM,IAAI,iCAAkB;AAClC,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,KAAK,eACV,CAAC,QAAQ,eAAe,mCACxB,GAAI;EAEN;EAEQ,MAAM,YAAY,UAAW;AACpC,UAAM,MAAM,IAAI,wCAA0B,EAAE,SAAQ,CAAE;AACtD,UAAM,KAAK,QAAQ,WAAW,IAAI,UAAS,CAAE;AAC7C,UAAM,KAAK,eACV,CAAC,QAAQ,eAAe,0CACxB,GAAI;EAEN;EAEQ,MAAM,oBACb,cAAoB;AAEpB,QAAI,KAAK,iBAAiB,IAAI,YAAY,GAAG;AAC5C,aAAO,KAAK,iBAAiB,IAAI,YAAY;IAC9C;AAIA,UAAM,QAAQ,KAAK,SAAS,cAAc;AAC1C,QAAI;AACJ,QAAI,OAAO;AAIV,wBAAkB,IAAI,4BAAgB;QACrC,YAAY;;QAEZ,WAAW;QACX,cAAc,OAAO;OACrB;IAMF;AAEA,QAAI;AACJ,QACC,KAAK,SAAS,gBAEX,OAAO,KAAK,KAAK,SAAS,YAAY,EAAE,KAC1C,CAAC,QACA,IAAI,WAAW,KAAK,KACjB,OAAO,iCACP,+BAAmB,0BAAsB,GAAG,CAAC,CAAC,GAElD;AAID,yBAAmB,MAAM,6BAAiB,OAAM;AAEhD,uBAAiB,wBAAwB,MAAM;AAG/C,iBACO,YAAY;QACjB;QACA;QACA;QACA;SAEA;AACD,cAAM,MAAM,KAAK,SAAS,aAAa,QAAQ;AAC/C,YAAI,KAAK;AACR,gBAAM,iBAAiB,OACtB,0BAAc,QAAQ,GACtB,GAAG;QAEL;MACD;IAMD;AAEA,QAAI;AACJ,QACC,KAAK,SAAS,uBAAuB,oBAClC,KAAK,SAAS,uBAAuB,kBACvC;AAID,0BAAoB,MAAM,6BAAiB,OAAM;AAEjD,wBAAkB,wBAAwB,MAAM;AAGhD,UAAI,KAAK,SAAS,uBAAuB,kBAAkB;AAC1D,cAAM,kBAAkB,OACvB,0BAAc,kBACd,KAAK,SAAS,sBAAsB,gBAAgB;MAEtD;AACA,UAAI,KAAK,SAAS,uBAAuB,kBAAkB;AAC1D,cAAM,kBAAkB,OACvB,0BAAc,kBACd,KAAK,SAAS,sBAAsB,gBAAgB;MAEtD;IAMD;AAEA,UAAM,MAAM;MACX;MACA;MACA;;AAED,SAAK,iBAAiB,IAAI,cAAc,GAAG;AAC3C,WAAO;EACR;;EAGO,sBAAmB;AACzB,SAAK,kBAAkB,CAAA;EACxB;;;;;EAMO,sBACN,aAA+C;AAG/C,UAAM,SAAS,IAAI,oBAAM,IAAI,EAAE,KAAK,CAAC;AACrC,WAAO,CAAC,IAAI;AACZ,WAAO,cAAc,MAAQ,IAAM;AACnC,QAAI,iBAAiB,KAAK;AAC1B,QAAI,aAAa;AAChB,uBAAiB,eAAe,OAAO,CAAC;;QAEvC,EAAE,eAAe,UAEd,YAAY;UACd,WAAW,EAAE;UACb,aAAa,EAAE;UACf,WAAW,EAAE;SACb;OAAC;IAEJ;AACA,WAAO,oBAAM,OAAO;MACnB;MACA,GAAG,eAAe,IAAI,iBAAiB;KACvC;EACF;;;;;EAMO,MAAM,kBACZ,UACA,aAA+C;AAE/C,UAAM,KAAK,SAAS,GAAG,UACtB,UACA,KAAK,sBAAsB,WAAW,CAAC;EAEzC;;;;;EAMO,MAAM,UAAO;AAEnB,QAAI,KAAK;AAAiB,aAAO,KAAK;AACtC,SAAK,sBAAkB,+CAAqB;AAE5C,SAAK,WAAW,MAAM,gCAAgC;AAEtD,QAAI,KAAK,SAAS;AACjB,YAAM,KAAK,KAAI,EAAG,MAAM,kBAAI;IAC7B;AAEA,QAAI,KAAK,UAAU,QAAW;AAE7B,UAAI,KAAK,OAAO;AAAQ,cAAM,KAAK,OAAO,MAAK;AAC/C,WAAK,SAAS;IACf;AAEA,SAAK,WAAW,MAAM,4BAA4B;AAGlD,SAAK,cAAc,QAAO;AAE1B,SAAK,gBAAgB,QAAO;EAC7B;;AAGD,SAAS,kBACR,SAAqB;AAErB,QAAM,SAAS,IAAI,oBAAM,KAAK,QAAQ,QAAQ,MAAM,EAAE,KAAK,CAAC;AAE5D,MAAI,QAAQ,OAAO,QAAQ,UAAU,QAAO,CAAE,IAAI,SAC/C;AACH,UAAQ,QAAQ;AAEhB,SAAO,iBAAiB,OAAO,CAAC;AAChC,QAAM,YAAY;AAElB,SAAO,CAAC,IAAI,YAAY;AACxB,SAAO,CAAC,IAAI,QAAQ,QAAQ;AAE5B,SAAO,IAAI,QAAQ,SAAS,EAAE;AAC9B,SAAO,OAAO,SAAS,CAAC,IAAI;AAC5B,SAAO;AACR;AAlBS;",
|
|
6
6
|
"names": ["frame", "destSecurityManager"]
|
|
7
7
|
}
|
package/build/cjs/package.json
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
1
|
{
|
|
2
|
-
"type": "commonjs"
|
|
2
|
+
"type": "commonjs",
|
|
3
|
+
"sideEffects": false,
|
|
4
|
+
"imports": {
|
|
5
|
+
"#default_bindings/fs": {
|
|
6
|
+
"@@dev": "@zwave-js/core/bindings/fs/node",
|
|
7
|
+
"node": "@zwave-js/core/bindings/fs/node",
|
|
8
|
+
"default": "@zwave-js/core/bindings/fs/stub"
|
|
9
|
+
},
|
|
10
|
+
"#default_bindings/serial": {
|
|
11
|
+
"@@dev": "@zwave-js/serial/bindings/node",
|
|
12
|
+
"node": "@zwave-js/serial/bindings/node",
|
|
13
|
+
"default": "@zwave-js/serial/bindings/stub"
|
|
14
|
+
},
|
|
15
|
+
"#default_bindings/db": {
|
|
16
|
+
"@@dev": "@zwave-js/core/bindings/db/jsonl",
|
|
17
|
+
"node": "@zwave-js/core/bindings/db/jsonl",
|
|
18
|
+
"default": "@zwave-js/core/bindings/db/stub"
|
|
19
|
+
},
|
|
20
|
+
"#default_bindings/log": {
|
|
21
|
+
"@@dev": "@zwave-js/core/bindings/log/node",
|
|
22
|
+
"node": "@zwave-js/core/bindings/log/node",
|
|
23
|
+
"default": "@zwave-js/core/bindings/log/stub"
|
|
24
|
+
},
|
|
25
|
+
"#mdns_discovery": {
|
|
26
|
+
"@@dev": "../../src/lib/driver/mDNSDiscovery/node.ts",
|
|
27
|
+
"require": "./lib/driver/mDNSDiscovery/node.js",
|
|
28
|
+
"node": "../esm/lib/driver/mDNSDiscovery/node.js",
|
|
29
|
+
"default": "../esm/lib/driver/mDNSDiscovery/stub.js"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
3
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index_browser.d.ts","sourceRoot":"","sources":["../../src/index_browser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index_browser.d.ts","sourceRoot":"","sources":["../../src/index_browser.ts"],"names":[],"mappings":"AAMA,OAAO,kBAAkB,CAAC;AAG1B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// organize-imports-ignore
|
|
2
2
|
/* @forbiddenImports sinon */
|
|
3
|
+
/* @forbiddenImports external */
|
|
3
4
|
// This module is the main entry point. Requiring reflect-metadata here avoids forgetting it
|
|
4
5
|
import "reflect-metadata";
|
|
5
6
|
// Export some frequently-used things and types - this also loads all CC files including metadata
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index_browser.js","sourceRoot":"","sources":["../../src/index_browser.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,6BAA6B;
|
|
1
|
+
{"version":3,"file":"index_browser.js","sourceRoot":"","sources":["../../src/index_browser.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,6BAA6B;AAC7B,gCAAgC;AAEhC,4FAA4F;AAC5F,OAAO,kBAAkB,CAAC;AAE1B,iGAAiG;AACjG,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -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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"}
|
|
@@ -1013,6 +1013,8 @@ let ZWaveController = (() => {
|
|
|
1013
1013
|
controllerValueDB.setValue(VersionCCValues.zWaveProtocolVersion.id, this._protocolVersion);
|
|
1014
1014
|
controllerValueDB.setMetadata(VersionCCValues.sdkVersion.id, VersionCCValues.sdkVersion.meta);
|
|
1015
1015
|
controllerValueDB.setValue(VersionCCValues.sdkVersion.id, this._sdkVersion);
|
|
1016
|
+
// Look up the device config afterwards
|
|
1017
|
+
await this.nodes.get(this._ownNodeId)?.["loadDeviceConfig"]();
|
|
1016
1018
|
}
|
|
1017
1019
|
createValueDBForNode(nodeId, ownKeys) {
|
|
1018
1020
|
return new ValueDB(nodeId, this.driver.valueDB, this.driver.metadataDB, ownKeys);
|
|
@@ -3095,7 +3097,7 @@ let ZWaveController = (() => {
|
|
|
3095
3097
|
this.driver.controllerLog.print("rebuilding routes aborted");
|
|
3096
3098
|
});
|
|
3097
3099
|
// Cancel all transactions that were created by the route rebuilding process
|
|
3098
|
-
this.driver.rejectTransactions((t) => t.message instanceof RequestNodeNeighborUpdateRequest
|
|
3100
|
+
void this.driver.rejectTransactions((t) => t.message instanceof RequestNodeNeighborUpdateRequest
|
|
3099
3101
|
|| t.message instanceof DeleteReturnRouteRequest
|
|
3100
3102
|
|| t.message instanceof AssignReturnRouteRequest);
|
|
3101
3103
|
this._rebuildRoutesProgress.clear();
|
|
@@ -5093,19 +5095,17 @@ let ZWaveController = (() => {
|
|
|
5093
5095
|
else {
|
|
5094
5096
|
await this.restoreNVMRaw500(convertedNVM, restoreProgress);
|
|
5095
5097
|
}
|
|
5096
|
-
this.driver.controllerLog.print("NVM backup restored");
|
|
5098
|
+
this.driver.controllerLog.print("NVM backup restored. Restarting to activate the restored backup...");
|
|
5097
5099
|
}
|
|
5098
|
-
|
|
5099
|
-
//
|
|
5100
|
+
catch {
|
|
5101
|
+
// If the process fails, at least turn the Z-Wave radio back on
|
|
5100
5102
|
await this.toggleRF(true);
|
|
5101
5103
|
}
|
|
5102
5104
|
// After restoring an NVM backup, the controller's capabilities may have changed.
|
|
5103
5105
|
// Also, we could be talking to different nodes than the cache file contains.
|
|
5104
5106
|
// Reset all info about all nodes, so they get re-interviewed.
|
|
5105
5107
|
this._nodes.clear();
|
|
5106
|
-
|
|
5107
|
-
// Just forcing a restart of the driver seems easier.
|
|
5108
|
-
await this.driver.softResetAndRestart("Restarting driver to activate restored NVM backup...", "Applying the NVM backup requires a driver restart!");
|
|
5108
|
+
await this.driver.softResetAndRestart();
|
|
5109
5109
|
}
|
|
5110
5110
|
/**
|
|
5111
5111
|
* Restores an NVM backup that was created with `backupNVMRaw`. The Z-Wave radio is turned off/on automatically.
|