@zwave-js/cc 15.24.2 → 15.25.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/cc/AssociationCC.d.ts +1 -1
- package/build/cjs/cc/AssociationCC.js +6 -3
- package/build/cjs/cc/AssociationCC.js.map +2 -2
- package/build/cjs/cc/AssociationGroupInfoCC.js +6 -1
- package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
- package/build/cjs/cc/BarrierOperatorCC.js +1 -0
- package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
- package/build/cjs/cc/BinarySensorCC.js +1 -0
- package/build/cjs/cc/BinarySensorCC.js.map +2 -2
- package/build/cjs/cc/ColorSwitchCC.js +6 -2
- package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
- package/build/cjs/cc/ConfigurationCC.d.ts +14 -3
- package/build/cjs/cc/ConfigurationCC.js +65 -19
- package/build/cjs/cc/ConfigurationCC.js.map +2 -2
- package/build/cjs/cc/IndicatorCC.js +7 -3
- package/build/cjs/cc/IndicatorCC.js.map +2 -2
- package/build/cjs/cc/IrrigationCC.js +6 -2
- package/build/cjs/cc/IrrigationCC.js.map +2 -2
- package/build/cjs/cc/LanguageCC.js +2 -0
- package/build/cjs/cc/LanguageCC.js.map +2 -2
- package/build/cjs/cc/MeterCC.js +6 -1
- package/build/cjs/cc/MeterCC.js.map +2 -2
- package/build/cjs/cc/MultiChannelAssociationCC.d.ts +1 -1
- package/build/cjs/cc/MultiChannelAssociationCC.js +7 -4
- package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
- package/build/cjs/cc/MultiChannelCC.d.ts +1 -1
- package/build/cjs/cc/MultiChannelCC.js +4 -2
- package/build/cjs/cc/MultiChannelCC.js.map +2 -2
- package/build/cjs/cc/MultilevelSensorCC.js +7 -3
- package/build/cjs/cc/MultilevelSensorCC.js.map +2 -2
- package/build/cjs/cc/NodeNamingCC.js +3 -20
- package/build/cjs/cc/NodeNamingCC.js.map +2 -2
- package/build/cjs/cc/NotificationCC.js +10 -2
- package/build/cjs/cc/NotificationCC.js.map +2 -2
- package/build/cjs/cc/SceneControllerConfigurationCC.js +1 -0
- package/build/cjs/cc/SceneControllerConfigurationCC.js.map +2 -2
- package/build/cjs/cc/ScheduleEntryLockCC.js +3 -0
- package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
- package/build/cjs/cc/SecurityCC.d.ts +2 -2
- package/build/cjs/cc/SecurityCC.js +6 -4
- package/build/cjs/cc/SecurityCC.js.map +2 -2
- package/build/cjs/cc/ThermostatOperatingStateCC.d.ts +1 -1
- package/build/cjs/cc/ThermostatOperatingStateCC.js +2 -2
- package/build/cjs/cc/ThermostatOperatingStateCC.js.map +2 -2
- package/build/cjs/cc/ThermostatSetpointCC.js +8 -3
- package/build/cjs/cc/ThermostatSetpointCC.js.map +2 -2
- package/build/cjs/cc/TimeCC.js +1 -0
- package/build/cjs/cc/TimeCC.js.map +2 -2
- package/build/cjs/cc/TimeParametersCC.js +1 -0
- package/build/cjs/cc/TimeParametersCC.js.map +2 -2
- package/build/cjs/cc/TransportServiceCC.d.ts +0 -14
- package/build/cjs/cc/TransportServiceCC.js +0 -41
- package/build/cjs/cc/TransportServiceCC.js.map +2 -2
- package/build/cjs/cc/UserCodeCC.d.ts +2 -1
- package/build/cjs/cc/UserCodeCC.js +40 -1
- package/build/cjs/cc/UserCodeCC.js.map +2 -2
- package/build/cjs/cc/UserCredentialCC.d.ts +2 -2
- package/build/cjs/cc/UserCredentialCC.js +18 -2
- package/build/cjs/cc/UserCredentialCC.js.map +2 -2
- package/build/cjs/cc/VersionCC.js +12 -5
- package/build/cjs/cc/VersionCC.js.map +2 -2
- package/build/cjs/cc/WindowCoveringCC.js +8 -4
- package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
- package/build/cjs/cc/ZWaveProtocolCC.d.ts +2 -0
- package/build/cjs/cc/ZWaveProtocolCC.js +4 -0
- package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
- package/build/cjs/lib/CommandClass.d.ts +15 -6
- package/build/cjs/lib/CommandClass.js +10 -5
- package/build/cjs/lib/CommandClass.js.map +2 -2
- package/build/cjs/lib/serializers.js +1 -0
- package/build/cjs/lib/serializers.js.map +2 -2
- package/build/cjs/lib/traits.d.ts +16 -1
- package/build/esm/cc/AssociationCC.d.ts +1 -1
- package/build/esm/cc/AssociationCC.d.ts.map +1 -1
- package/build/esm/cc/AssociationCC.js +6 -3
- package/build/esm/cc/AssociationCC.js.map +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.js +9 -1
- package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
- package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
- package/build/esm/cc/BarrierOperatorCC.js +1 -0
- package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
- package/build/esm/cc/BinarySensorCC.d.ts.map +1 -1
- package/build/esm/cc/BinarySensorCC.js +1 -0
- package/build/esm/cc/BinarySensorCC.js.map +1 -1
- package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/ColorSwitchCC.js +6 -2
- package/build/esm/cc/ColorSwitchCC.js.map +1 -1
- package/build/esm/cc/ConfigurationCC.d.ts +14 -3
- package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/ConfigurationCC.js +98 -25
- package/build/esm/cc/ConfigurationCC.js.map +1 -1
- package/build/esm/cc/IndicatorCC.d.ts.map +1 -1
- package/build/esm/cc/IndicatorCC.js +8 -3
- package/build/esm/cc/IndicatorCC.js.map +1 -1
- package/build/esm/cc/IrrigationCC.d.ts.map +1 -1
- package/build/esm/cc/IrrigationCC.js +6 -2
- package/build/esm/cc/IrrigationCC.js.map +1 -1
- package/build/esm/cc/LanguageCC.d.ts.map +1 -1
- package/build/esm/cc/LanguageCC.js +4 -0
- package/build/esm/cc/LanguageCC.js.map +1 -1
- package/build/esm/cc/MeterCC.d.ts.map +1 -1
- package/build/esm/cc/MeterCC.js +6 -1
- package/build/esm/cc/MeterCC.js.map +1 -1
- package/build/esm/cc/MultiChannelAssociationCC.d.ts +1 -1
- package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -1
- package/build/esm/cc/MultiChannelAssociationCC.js +9 -4
- package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
- package/build/esm/cc/MultiChannelCC.d.ts +1 -1
- package/build/esm/cc/MultiChannelCC.d.ts.map +1 -1
- package/build/esm/cc/MultiChannelCC.js +4 -2
- package/build/esm/cc/MultiChannelCC.js.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.d.ts.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.js +7 -3
- package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
- package/build/esm/cc/NodeNamingCC.d.ts.map +1 -1
- package/build/esm/cc/NodeNamingCC.js +3 -22
- package/build/esm/cc/NodeNamingCC.js.map +1 -1
- package/build/esm/cc/NotificationCC.d.ts.map +1 -1
- package/build/esm/cc/NotificationCC.js +14 -2
- package/build/esm/cc/NotificationCC.js.map +1 -1
- package/build/esm/cc/SceneControllerConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/SceneControllerConfigurationCC.js +1 -0
- package/build/esm/cc/SceneControllerConfigurationCC.js.map +1 -1
- package/build/esm/cc/ScheduleEntryLockCC.d.ts.map +1 -1
- package/build/esm/cc/ScheduleEntryLockCC.js +5 -0
- package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
- package/build/esm/cc/SecurityCC.d.ts +2 -2
- package/build/esm/cc/SecurityCC.d.ts.map +1 -1
- package/build/esm/cc/SecurityCC.js +7 -4
- package/build/esm/cc/SecurityCC.js.map +1 -1
- package/build/esm/cc/ThermostatOperatingStateCC.d.ts +1 -1
- package/build/esm/cc/ThermostatOperatingStateCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatOperatingStateCC.js +2 -2
- package/build/esm/cc/ThermostatOperatingStateCC.js.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.js +10 -3
- package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
- package/build/esm/cc/TimeCC.d.ts.map +1 -1
- package/build/esm/cc/TimeCC.js +1 -0
- package/build/esm/cc/TimeCC.js.map +1 -1
- package/build/esm/cc/TimeParametersCC.d.ts.map +1 -1
- package/build/esm/cc/TimeParametersCC.js +1 -0
- package/build/esm/cc/TimeParametersCC.js.map +1 -1
- package/build/esm/cc/TransportServiceCC.d.ts +0 -14
- package/build/esm/cc/TransportServiceCC.d.ts.map +1 -1
- package/build/esm/cc/TransportServiceCC.js +1 -54
- package/build/esm/cc/TransportServiceCC.js.map +1 -1
- package/build/esm/cc/UserCodeCC.d.ts +2 -1
- package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
- package/build/esm/cc/UserCodeCC.js +48 -0
- package/build/esm/cc/UserCodeCC.js.map +1 -1
- package/build/esm/cc/UserCredentialCC.d.ts +2 -2
- package/build/esm/cc/UserCredentialCC.d.ts.map +1 -1
- package/build/esm/cc/UserCredentialCC.js +25 -2
- package/build/esm/cc/UserCredentialCC.js.map +1 -1
- package/build/esm/cc/VersionCC.d.ts.map +1 -1
- package/build/esm/cc/VersionCC.js +21 -6
- package/build/esm/cc/VersionCC.js.map +1 -1
- package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
- package/build/esm/cc/WindowCoveringCC.js +10 -6
- package/build/esm/cc/WindowCoveringCC.js.map +1 -1
- package/build/esm/cc/ZWaveProtocolCC.d.ts +2 -0
- package/build/esm/cc/ZWaveProtocolCC.d.ts.map +1 -1
- package/build/esm/cc/ZWaveProtocolCC.js +4 -0
- package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
- package/build/esm/lib/CommandClass.d.ts +15 -6
- package/build/esm/lib/CommandClass.d.ts.map +1 -1
- package/build/esm/lib/CommandClass.js +10 -5
- package/build/esm/lib/CommandClass.js.map +1 -1
- package/build/esm/lib/serializers.d.ts.map +1 -1
- package/build/esm/lib/serializers.js +3 -1
- package/build/esm/lib/serializers.js.map +1 -1
- package/build/esm/lib/traits.d.ts +16 -1
- package/build/esm/lib/traits.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src_gen/cc/TransportServiceCC.ts"],
|
|
4
|
-
"sourcesContent": ["import { CRC16_CCITT, CommandClasses, type GetValueDB, type MessageOrCCLogEntry, type SinglecastCC, type WithAddress, ZWaveError, ZWaveErrorCodes, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, type BytesView, buffer2hex } from \"@zwave-js/shared\";\nimport { type CCRaw, CommandClass } from \"../lib/CommandClass.js\";\nimport { CCCommand, commandClass, implementedVersion, } from \"../lib/CommandClassDecorators.js\";\nimport { TransportServiceCommand } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nexport const MAX_SEGMENT_SIZE = 39;\nexport const RELAXED_TIMING_THRESHOLD = 2;\n// TODO: Figure out how we know if communicating with R2 or R3\n/** @publicAPI */\nexport const TransportServiceTimeouts = {\n /** Waiting time before requesting a missing segment at data rate R2 */\n requestMissingSegmentR2: 800,\n /** Waiting time before requesting a missing segment at data rate R3 */\n requestMissingSegmentR3: 400,\n /** Waiting time before sending another datagram at data rate R2 */\n segmentCompleteR2: 1000,\n /** Waiting time before sending another datagram at data rate R3 */\n segmentCompleteR3: 500,\n /** Waiting time between segments when sending more than {@link RELAXED_TIMING_THRESHOLD} segments at data rate R2 */\n relaxedTimingDelayR2: 35,\n /** Waiting time between segments when sending more than {@link RELAXED_TIMING_THRESHOLD} segments at data rate R3 */\n relaxedTimingDelayR3: 15,\n};\n@commandClass(CommandClasses[\"Transport Service\"])\n@implementedVersion(2)\nexport class TransportServiceCC extends CommandClass implements SinglecastCC<TransportServiceCC> {\n declare ccCommand: TransportServiceCommand;\n declare nodeId: number;\n}\n// @publicAPI\nexport interface TransportServiceCCFirstSegmentOptions {\n datagramSize: number;\n sessionId: number;\n headerExtension?: BytesView | undefined;\n partialDatagram: BytesView;\n}\n/** @publicAPI */\nexport function isTransportServiceEncapsulation(command: CommandClass): command is TransportServiceCCFirstSegment | TransportServiceCCSubsequentSegment {\n return (command.ccId === CommandClasses[\"Transport Service\"]\n && (command.ccCommand === TransportServiceCommand.FirstSegment\n || command.ccCommand === TransportServiceCommand.SubsequentSegment));\n}\n@CCCommand(TransportServiceCommand.FirstSegment)\n// Handling expected responses is done by the RX state machine\nexport class TransportServiceCCFirstSegment extends TransportServiceCC {\n public constructor(options: WithAddress<TransportServiceCCFirstSegmentOptions>) {\n super(options);\n this.datagramSize = options.datagramSize;\n this.sessionId = options.sessionId;\n this.headerExtension = options.headerExtension;\n this.partialDatagram = options.partialDatagram;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TransportServiceCCFirstSegment {\n // Deserialization has already split the datagram size from the ccCommand.\n // Therefore we have one more payload byte\n validatePayload(raw.payload.length >= 6); // 2 bytes dgram size, 1 byte sessid/ext, 1+ bytes payload, 2 bytes checksum\n // Verify the CRC\n const headerBuffer = Bytes.from([\n CommandClasses[\"Transport Service\"],\n TransportServiceCommand.FirstSegment | raw.payload[0],\n ]);\n const ccBuffer = raw.payload.subarray(1, -2);\n let expectedCRC = CRC16_CCITT(headerBuffer);\n expectedCRC = CRC16_CCITT(ccBuffer, expectedCRC);\n const actualCRC = raw.payload.readUInt16BE(raw.payload.length - 2);\n validatePayload(expectedCRC === actualCRC);\n const datagramSize = raw.payload.readUInt16BE(0);\n const sessionId = raw.payload[2] >>> 4;\n let payloadOffset = 3;\n // If there is a header extension, read it\n const hasHeaderExtension = !!(raw.payload[2] & 0b1000);\n let headerExtension: BytesView | undefined;\n if (hasHeaderExtension) {\n const extLength = raw.payload[3];\n headerExtension = raw.payload.subarray(4, 4 + extLength);\n payloadOffset += 1 + extLength;\n }\n const partialDatagram: BytesView = raw.payload.subarray(payloadOffset, -2);\n // A node supporting the Transport Service Command Class, version 2\n // MUST NOT send Transport Service segments with the Payload field longer than 39 bytes.\n validatePayload(partialDatagram.length <= MAX_SEGMENT_SIZE);\n return new this({\n nodeId: ctx.sourceNodeId,\n datagramSize,\n sessionId,\n headerExtension,\n partialDatagram,\n });\n }\n public datagramSize: number;\n public sessionId: number;\n public headerExtension: BytesView | undefined;\n public partialDatagram: BytesView;\n public encapsulated!: CommandClass;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n // Transport Service re-uses the lower 3 bits of the ccCommand as payload\n this.ccCommand = (this.ccCommand & 248)\n | ((this.datagramSize >>> 8) & 0b111);\n const ext = !!this.headerExtension && this.headerExtension.length >= 1;\n this.payload = Bytes.from([\n this.datagramSize & 0xff,\n ((this.sessionId & 0b1111) << 4) | (ext ? 0b1000 : 0),\n ]);\n if (ext) {\n this.payload = Bytes.concat([\n this.payload,\n [this.headerExtension!.length],\n this.headerExtension!,\n ]);\n }\n this.payload = Bytes.concat([\n this.payload,\n this.partialDatagram,\n Bytes.alloc(2, 0), // checksum\n ]);\n // Compute and save the CRC16 in the payload\n // The CC header is included in the CRC computation\n const headerBuffer = Bytes.from([this.ccId, this.ccCommand]);\n let crc = CRC16_CCITT(headerBuffer);\n crc = CRC16_CCITT(this.payload.subarray(0, -2), crc);\n // Write the checksum into the last two bytes of the payload\n this.payload.writeUInt16BE(crc, this.payload.length - 2);\n return super.serialize(ctx);\n }\n public expectMoreMessages(): boolean {\n return true; // The FirstSegment message always expects more messages\n }\n public getPartialCCSessionId(): Record<string, any> | undefined {\n // Only use the session ID to identify the session, not the CC command\n return { ccCommand: undefined, sessionId: this.sessionId };\n }\n protected computeEncapsulationOverhead(): number {\n // Transport Service CC (first segment) adds 1 byte datagram size, 1 byte Session ID/..., 2 bytes checksum and (0 OR n+1) bytes header extension\n return (super.computeEncapsulationOverhead()\n + 4\n + (this.headerExtension?.length\n ? 1 + this.headerExtension.length\n : 0));\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"session ID\": this.sessionId,\n \"datagram size\": this.datagramSize,\n \"byte range\": `0...${this.partialDatagram.length - 1}`,\n payload: buffer2hex(this.partialDatagram),\n },\n };\n }\n}\n// @publicAPI\nexport interface TransportServiceCCSubsequentSegmentOptions extends TransportServiceCCFirstSegmentOptions {\n datagramOffset: number;\n}\n@CCCommand(TransportServiceCommand.SubsequentSegment)\n// Handling expected responses is done by the RX state machine\nexport class TransportServiceCCSubsequentSegment extends TransportServiceCC {\n public constructor(options: WithAddress<TransportServiceCCSubsequentSegmentOptions>) {\n super(options);\n this.datagramSize = options.datagramSize;\n this.datagramOffset = options.datagramOffset;\n this.sessionId = options.sessionId;\n this.headerExtension = options.headerExtension;\n this.partialDatagram = options.partialDatagram;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TransportServiceCCSubsequentSegment {\n // Deserialization has already split the datagram size from the ccCommand.\n // Therefore we have one more payload byte\n validatePayload(raw.payload.length >= 7); // 2 bytes dgram size, 1 byte sessid/ext/offset, 1 byte offset, 1+ bytes payload, 2 bytes checksum\n // Verify the CRC\n const headerBuffer = Bytes.from([\n CommandClasses[\"Transport Service\"],\n TransportServiceCommand.SubsequentSegment | raw.payload[0],\n ]);\n const ccBuffer = raw.payload.subarray(1, -2);\n let expectedCRC = CRC16_CCITT(headerBuffer);\n expectedCRC = CRC16_CCITT(ccBuffer, expectedCRC);\n const actualCRC = raw.payload.readUInt16BE(raw.payload.length - 2);\n validatePayload(expectedCRC === actualCRC);\n const datagramSize = raw.payload.readUInt16BE(0);\n const sessionId = raw.payload[2] >>> 4;\n const datagramOffset = ((raw.payload[2] & 0b111) << 8)\n + raw.payload[3];\n let payloadOffset = 4;\n // If there is a header extension, read it\n const hasHeaderExtension = !!(raw.payload[2] & 0b1000);\n let headerExtension: Bytes | undefined;\n if (hasHeaderExtension) {\n const extLength = raw.payload[4];\n headerExtension = raw.payload.subarray(5, 5 + extLength);\n payloadOffset += 1 + extLength;\n }\n const partialDatagram: Bytes = raw.payload.subarray(payloadOffset, -2);\n // A node supporting the Transport Service Command Class, version 2\n // MUST NOT send Transport Service segments with the Payload field longer than 39 bytes.\n validatePayload(partialDatagram.length <= MAX_SEGMENT_SIZE);\n return new this({\n nodeId: ctx.sourceNodeId,\n datagramSize,\n sessionId,\n datagramOffset,\n headerExtension,\n partialDatagram,\n });\n }\n public datagramSize: number;\n public datagramOffset: number;\n public sessionId: number;\n public headerExtension: BytesView | undefined;\n public partialDatagram: BytesView;\n // This can only be received\n private _encapsulated!: CommandClass;\n public get encapsulated(): CommandClass {\n return this._encapsulated;\n }\n public expectMoreMessages(session: [\n TransportServiceCCFirstSegment,\n ...TransportServiceCCSubsequentSegment[]\n ]): boolean {\n if (!(session[0] instanceof TransportServiceCCFirstSegment)) {\n // First segment is missing\n return true;\n }\n const datagramSize = session[0].datagramSize;\n const receivedBytes = Array.from<boolean>({ length: datagramSize })\n .fill(false);\n for (const segment of [...session, this]) {\n const offset = segment instanceof TransportServiceCCFirstSegment\n ? 0\n : segment.datagramOffset;\n for (let i = offset; i <= offset + segment.partialDatagram.length; i++) {\n receivedBytes[i] = true;\n }\n }\n // Expect more messages as long as we haven't received everything\n return receivedBytes.includes(false);\n }\n public getPartialCCSessionId(): Record<string, any> | undefined {\n // Only use the session ID to identify the session, not the CC command\n return { ccCommand: undefined, sessionId: this.sessionId };\n }\n public async mergePartialCCs(partials: [\n TransportServiceCCFirstSegment,\n ...TransportServiceCCSubsequentSegment[]\n ], ctx: CCParsingContext): Promise<void> {\n // Concat the CC buffers\n const datagram = new Bytes(this.datagramSize);\n for (const partial of [...partials, this]) {\n // Ensure that we don't try to write out-of-bounds\n const offset = partial instanceof TransportServiceCCFirstSegment\n ? 0\n : partial.datagramOffset;\n if (offset + partial.partialDatagram.length > datagram.length) {\n throw new ZWaveError(`The partial datagram offset and length in a segment are not compatible to the communicated datagram length`, ZWaveErrorCodes.PacketFormat_InvalidPayload);\n }\n datagram.set(partial.partialDatagram, offset);\n }\n // and deserialize the CC\n this._encapsulated = await CommandClass.parse(datagram, ctx);\n this._encapsulated.encapsulatingCC = this as any;\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n // Transport Service re-uses the lower 3 bits of the ccCommand as payload\n this.ccCommand = (this.ccCommand & 248)\n | ((this.datagramSize >>> 8) & 0b111);\n const ext = !!this.headerExtension && this.headerExtension.length >= 1;\n this.payload = Bytes.from([\n this.datagramSize & 0xff,\n ((this.sessionId & 0b1111) << 4)\n | (ext ? 0b1000 : 0)\n | ((this.datagramOffset >>> 8) & 0b111),\n this.datagramOffset & 0xff,\n ]);\n if (ext) {\n this.payload = Bytes.concat([\n this.payload,\n [this.headerExtension!.length],\n this.headerExtension!,\n ]);\n }\n this.payload = Bytes.concat([\n this.payload,\n this.partialDatagram,\n Bytes.alloc(2, 0), // checksum\n ]);\n // Compute and save the CRC16 in the payload\n // The CC header is included in the CRC computation\n const headerBuffer = Bytes.from([this.ccId, this.ccCommand]);\n let crc = CRC16_CCITT(headerBuffer);\n crc = CRC16_CCITT(this.payload.subarray(0, -2), crc);\n // Write the checksum into the last two bytes of the payload\n this.payload.writeUInt16BE(crc, this.payload.length - 2);\n return super.serialize(ctx);\n }\n protected computeEncapsulationOverhead(): number {\n // Transport Service CC (first segment) adds 1 byte datagram size, 1 byte Session ID/..., 1 byte offset, 2 bytes checksum and (0 OR n+1) bytes header extension\n return (super.computeEncapsulationOverhead()\n + 5\n + (this.headerExtension?.length\n ? 1 + this.headerExtension.length\n : 0));\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"session ID\": this.sessionId,\n \"datagram size\": this.datagramSize,\n \"byte range\": `${this.datagramOffset}...${this.datagramOffset + this.partialDatagram.length - 1}`,\n payload: buffer2hex(this.partialDatagram),\n },\n };\n }\n}\n// @publicAPI\nexport interface TransportServiceCCSegmentRequestOptions {\n sessionId: number;\n datagramOffset: number;\n}\n@CCCommand(TransportServiceCommand.SegmentRequest)\n// Handling expected responses is done by the RX state machine\nexport class TransportServiceCCSegmentRequest extends TransportServiceCC {\n public constructor(options: WithAddress<TransportServiceCCSegmentRequestOptions>) {\n super(options);\n this.sessionId = options.sessionId;\n this.datagramOffset = options.datagramOffset;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TransportServiceCCSegmentRequest {\n validatePayload(raw.payload.length >= 3);\n const sessionId = raw.payload[1] >>> 4;\n const datagramOffset = ((raw.payload[1] & 0b111) << 8)\n + raw.payload[2];\n return new this({\n nodeId: ctx.sourceNodeId,\n sessionId,\n datagramOffset,\n });\n }\n public sessionId: number;\n public datagramOffset: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([\n ((this.sessionId & 0b1111) << 4)\n | ((this.datagramOffset >>> 8) & 0b111),\n this.datagramOffset & 0xff,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"session ID\": this.sessionId,\n offset: this.datagramOffset,\n },\n };\n }\n}\n// @publicAPI\nexport interface TransportServiceCCSegmentCompleteOptions {\n sessionId: number;\n}\n@CCCommand(TransportServiceCommand.SegmentComplete)\nexport class TransportServiceCCSegmentComplete extends TransportServiceCC {\n public constructor(options: WithAddress<TransportServiceCCSegmentCompleteOptions>) {\n super(options);\n this.sessionId = options.sessionId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TransportServiceCCSegmentComplete {\n validatePayload(raw.payload.length >= 2);\n const sessionId = raw.payload[1] >>> 4;\n return new this({\n nodeId: ctx.sourceNodeId,\n sessionId,\n });\n }\n public sessionId: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([(this.sessionId & 0b1111) << 4]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"session ID\": this.sessionId },\n };\n }\n}\n// @publicAPI\nexport interface TransportServiceCCSegmentWaitOptions {\n pendingSegments: number;\n}\n@CCCommand(TransportServiceCommand.SegmentWait)\nexport class TransportServiceCCSegmentWait extends TransportServiceCC {\n public constructor(options: WithAddress<TransportServiceCCSegmentWaitOptions>) {\n super(options);\n this.pendingSegments = options.pendingSegments;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TransportServiceCCSegmentWait {\n validatePayload(raw.payload.length >= 2);\n const pendingSegments = raw.payload[1];\n return new this({\n nodeId: ctx.sourceNodeId,\n pendingSegments,\n });\n }\n public pendingSegments: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.pendingSegments]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"pending segments\": this.pendingSegments },\n };\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
4
|
+
"sourcesContent": ["import { CRC16_CCITT, CommandClasses, type GetValueDB, type MessageOrCCLogEntry, type SinglecastCC, type WithAddress, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, type BytesView, buffer2hex } from \"@zwave-js/shared\";\nimport { type CCRaw, CommandClass } from \"../lib/CommandClass.js\";\nimport { CCCommand, commandClass, implementedVersion, } from \"../lib/CommandClassDecorators.js\";\nimport { TransportServiceCommand } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nexport const MAX_SEGMENT_SIZE = 39;\nexport const RELAXED_TIMING_THRESHOLD = 2;\n// TODO: Figure out how we know if communicating with R2 or R3\n/** @publicAPI */\nexport const TransportServiceTimeouts = {\n /** Waiting time before requesting a missing segment at data rate R2 */\n requestMissingSegmentR2: 800,\n /** Waiting time before requesting a missing segment at data rate R3 */\n requestMissingSegmentR3: 400,\n /** Waiting time before sending another datagram at data rate R2 */\n segmentCompleteR2: 1000,\n /** Waiting time before sending another datagram at data rate R3 */\n segmentCompleteR3: 500,\n /** Waiting time between segments when sending more than {@link RELAXED_TIMING_THRESHOLD} segments at data rate R2 */\n relaxedTimingDelayR2: 35,\n /** Waiting time between segments when sending more than {@link RELAXED_TIMING_THRESHOLD} segments at data rate R3 */\n relaxedTimingDelayR3: 15,\n};\n@commandClass(CommandClasses[\"Transport Service\"])\n@implementedVersion(2)\nexport class TransportServiceCC extends CommandClass implements SinglecastCC<TransportServiceCC> {\n declare ccCommand: TransportServiceCommand;\n declare nodeId: number;\n}\n// @publicAPI\nexport interface TransportServiceCCFirstSegmentOptions {\n datagramSize: number;\n sessionId: number;\n headerExtension?: BytesView | undefined;\n partialDatagram: BytesView;\n}\n/** @publicAPI */\nexport function isTransportServiceEncapsulation(command: CommandClass): command is TransportServiceCCFirstSegment | TransportServiceCCSubsequentSegment {\n return (command.ccId === CommandClasses[\"Transport Service\"]\n && (command.ccCommand === TransportServiceCommand.FirstSegment\n || command.ccCommand === TransportServiceCommand.SubsequentSegment));\n}\n@CCCommand(TransportServiceCommand.FirstSegment)\n// Handling expected responses is done by the RX state machine\nexport class TransportServiceCCFirstSegment extends TransportServiceCC {\n public constructor(options: WithAddress<TransportServiceCCFirstSegmentOptions>) {\n super(options);\n this.datagramSize = options.datagramSize;\n this.sessionId = options.sessionId;\n this.headerExtension = options.headerExtension;\n this.partialDatagram = options.partialDatagram;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TransportServiceCCFirstSegment {\n // Deserialization has already split the datagram size from the ccCommand.\n // Therefore we have one more payload byte\n validatePayload(raw.payload.length >= 6); // 2 bytes dgram size, 1 byte sessid/ext, 1+ bytes payload, 2 bytes checksum\n // Verify the CRC\n const headerBuffer = Bytes.from([\n CommandClasses[\"Transport Service\"],\n TransportServiceCommand.FirstSegment | raw.payload[0],\n ]);\n const ccBuffer = raw.payload.subarray(1, -2);\n let expectedCRC = CRC16_CCITT(headerBuffer);\n expectedCRC = CRC16_CCITT(ccBuffer, expectedCRC);\n const actualCRC = raw.payload.readUInt16BE(raw.payload.length - 2);\n validatePayload(expectedCRC === actualCRC);\n const datagramSize = raw.payload.readUInt16BE(0);\n const sessionId = raw.payload[2] >>> 4;\n let payloadOffset = 3;\n // If there is a header extension, read it\n const hasHeaderExtension = !!(raw.payload[2] & 0b1000);\n let headerExtension: BytesView | undefined;\n if (hasHeaderExtension) {\n const extLength = raw.payload[3];\n headerExtension = raw.payload.subarray(4, 4 + extLength);\n payloadOffset += 1 + extLength;\n }\n const partialDatagram: BytesView = raw.payload.subarray(payloadOffset, -2);\n // A node supporting the Transport Service Command Class, version 2\n // MUST NOT send Transport Service segments with the Payload field longer than 39 bytes.\n validatePayload(partialDatagram.length <= MAX_SEGMENT_SIZE);\n return new this({\n nodeId: ctx.sourceNodeId,\n datagramSize,\n sessionId,\n headerExtension,\n partialDatagram,\n });\n }\n public datagramSize: number;\n public sessionId: number;\n public headerExtension: BytesView | undefined;\n public partialDatagram: BytesView;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n // Transport Service re-uses the lower 3 bits of the ccCommand as payload\n this.ccCommand = (this.ccCommand & 248)\n | ((this.datagramSize >>> 8) & 0b111);\n const ext = !!this.headerExtension && this.headerExtension.length >= 1;\n this.payload = Bytes.from([\n this.datagramSize & 0xff,\n ((this.sessionId & 0b1111) << 4) | (ext ? 0b1000 : 0),\n ]);\n if (ext) {\n this.payload = Bytes.concat([\n this.payload,\n [this.headerExtension!.length],\n this.headerExtension!,\n ]);\n }\n this.payload = Bytes.concat([\n this.payload,\n this.partialDatagram,\n Bytes.alloc(2, 0), // checksum\n ]);\n // Compute and save the CRC16 in the payload\n // The CC header is included in the CRC computation\n const headerBuffer = Bytes.from([this.ccId, this.ccCommand]);\n let crc = CRC16_CCITT(headerBuffer);\n crc = CRC16_CCITT(this.payload.subarray(0, -2), crc);\n // Write the checksum into the last two bytes of the payload\n this.payload.writeUInt16BE(crc, this.payload.length - 2);\n return super.serialize(ctx);\n }\n protected computeEncapsulationOverhead(): number {\n // Transport Service CC (first segment) adds 1 byte datagram size, 1 byte Session ID/..., 2 bytes checksum and (0 OR n+1) bytes header extension\n return (super.computeEncapsulationOverhead()\n + 4\n + (this.headerExtension?.length\n ? 1 + this.headerExtension.length\n : 0));\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"session ID\": this.sessionId,\n \"datagram size\": this.datagramSize,\n \"byte range\": `0...${this.partialDatagram.length - 1}`,\n payload: buffer2hex(this.partialDatagram),\n },\n };\n }\n}\n// @publicAPI\nexport interface TransportServiceCCSubsequentSegmentOptions extends TransportServiceCCFirstSegmentOptions {\n datagramOffset: number;\n}\n@CCCommand(TransportServiceCommand.SubsequentSegment)\n// Handling expected responses is done by the RX state machine\nexport class TransportServiceCCSubsequentSegment extends TransportServiceCC {\n public constructor(options: WithAddress<TransportServiceCCSubsequentSegmentOptions>) {\n super(options);\n this.datagramSize = options.datagramSize;\n this.datagramOffset = options.datagramOffset;\n this.sessionId = options.sessionId;\n this.headerExtension = options.headerExtension;\n this.partialDatagram = options.partialDatagram;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TransportServiceCCSubsequentSegment {\n // Deserialization has already split the datagram size from the ccCommand.\n // Therefore we have one more payload byte\n validatePayload(raw.payload.length >= 7); // 2 bytes dgram size, 1 byte sessid/ext/offset, 1 byte offset, 1+ bytes payload, 2 bytes checksum\n // Verify the CRC\n const headerBuffer = Bytes.from([\n CommandClasses[\"Transport Service\"],\n TransportServiceCommand.SubsequentSegment | raw.payload[0],\n ]);\n const ccBuffer = raw.payload.subarray(1, -2);\n let expectedCRC = CRC16_CCITT(headerBuffer);\n expectedCRC = CRC16_CCITT(ccBuffer, expectedCRC);\n const actualCRC = raw.payload.readUInt16BE(raw.payload.length - 2);\n validatePayload(expectedCRC === actualCRC);\n const datagramSize = raw.payload.readUInt16BE(0);\n const sessionId = raw.payload[2] >>> 4;\n const datagramOffset = ((raw.payload[2] & 0b111) << 8)\n + raw.payload[3];\n let payloadOffset = 4;\n // If there is a header extension, read it\n const hasHeaderExtension = !!(raw.payload[2] & 0b1000);\n let headerExtension: Bytes | undefined;\n if (hasHeaderExtension) {\n const extLength = raw.payload[4];\n headerExtension = raw.payload.subarray(5, 5 + extLength);\n payloadOffset += 1 + extLength;\n }\n const partialDatagram: Bytes = raw.payload.subarray(payloadOffset, -2);\n // A node supporting the Transport Service Command Class, version 2\n // MUST NOT send Transport Service segments with the Payload field longer than 39 bytes.\n validatePayload(partialDatagram.length <= MAX_SEGMENT_SIZE);\n return new this({\n nodeId: ctx.sourceNodeId,\n datagramSize,\n sessionId,\n datagramOffset,\n headerExtension,\n partialDatagram,\n });\n }\n public datagramSize: number;\n public datagramOffset: number;\n public sessionId: number;\n public headerExtension: BytesView | undefined;\n public partialDatagram: BytesView;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n // Transport Service re-uses the lower 3 bits of the ccCommand as payload\n this.ccCommand = (this.ccCommand & 248)\n | ((this.datagramSize >>> 8) & 0b111);\n const ext = !!this.headerExtension && this.headerExtension.length >= 1;\n this.payload = Bytes.from([\n this.datagramSize & 0xff,\n ((this.sessionId & 0b1111) << 4)\n | (ext ? 0b1000 : 0)\n | ((this.datagramOffset >>> 8) & 0b111),\n this.datagramOffset & 0xff,\n ]);\n if (ext) {\n this.payload = Bytes.concat([\n this.payload,\n [this.headerExtension!.length],\n this.headerExtension!,\n ]);\n }\n this.payload = Bytes.concat([\n this.payload,\n this.partialDatagram,\n Bytes.alloc(2, 0), // checksum\n ]);\n // Compute and save the CRC16 in the payload\n // The CC header is included in the CRC computation\n const headerBuffer = Bytes.from([this.ccId, this.ccCommand]);\n let crc = CRC16_CCITT(headerBuffer);\n crc = CRC16_CCITT(this.payload.subarray(0, -2), crc);\n // Write the checksum into the last two bytes of the payload\n this.payload.writeUInt16BE(crc, this.payload.length - 2);\n return super.serialize(ctx);\n }\n protected computeEncapsulationOverhead(): number {\n // Transport Service CC (first segment) adds 1 byte datagram size, 1 byte Session ID/..., 1 byte offset, 2 bytes checksum and (0 OR n+1) bytes header extension\n return (super.computeEncapsulationOverhead()\n + 5\n + (this.headerExtension?.length\n ? 1 + this.headerExtension.length\n : 0));\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"session ID\": this.sessionId,\n \"datagram size\": this.datagramSize,\n \"byte range\": `${this.datagramOffset}...${this.datagramOffset + this.partialDatagram.length - 1}`,\n payload: buffer2hex(this.partialDatagram),\n },\n };\n }\n}\n// @publicAPI\nexport interface TransportServiceCCSegmentRequestOptions {\n sessionId: number;\n datagramOffset: number;\n}\n@CCCommand(TransportServiceCommand.SegmentRequest)\n// Handling expected responses is done by the RX state machine\nexport class TransportServiceCCSegmentRequest extends TransportServiceCC {\n public constructor(options: WithAddress<TransportServiceCCSegmentRequestOptions>) {\n super(options);\n this.sessionId = options.sessionId;\n this.datagramOffset = options.datagramOffset;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TransportServiceCCSegmentRequest {\n validatePayload(raw.payload.length >= 3);\n const sessionId = raw.payload[1] >>> 4;\n const datagramOffset = ((raw.payload[1] & 0b111) << 8)\n + raw.payload[2];\n return new this({\n nodeId: ctx.sourceNodeId,\n sessionId,\n datagramOffset,\n });\n }\n public sessionId: number;\n public datagramOffset: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([\n ((this.sessionId & 0b1111) << 4)\n | ((this.datagramOffset >>> 8) & 0b111),\n this.datagramOffset & 0xff,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"session ID\": this.sessionId,\n offset: this.datagramOffset,\n },\n };\n }\n}\n// @publicAPI\nexport interface TransportServiceCCSegmentCompleteOptions {\n sessionId: number;\n}\n@CCCommand(TransportServiceCommand.SegmentComplete)\nexport class TransportServiceCCSegmentComplete extends TransportServiceCC {\n public constructor(options: WithAddress<TransportServiceCCSegmentCompleteOptions>) {\n super(options);\n this.sessionId = options.sessionId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TransportServiceCCSegmentComplete {\n validatePayload(raw.payload.length >= 2);\n const sessionId = raw.payload[1] >>> 4;\n return new this({\n nodeId: ctx.sourceNodeId,\n sessionId,\n });\n }\n public sessionId: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([(this.sessionId & 0b1111) << 4]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"session ID\": this.sessionId },\n };\n }\n}\n// @publicAPI\nexport interface TransportServiceCCSegmentWaitOptions {\n pendingSegments: number;\n}\n@CCCommand(TransportServiceCommand.SegmentWait)\nexport class TransportServiceCCSegmentWait extends TransportServiceCC {\n public constructor(options: WithAddress<TransportServiceCCSegmentWaitOptions>) {\n super(options);\n this.pendingSegments = options.pendingSegments;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TransportServiceCCSegmentWait {\n validatePayload(raw.payload.length >= 2);\n const pendingSegments = raw.payload[1];\n return new this({\n nodeId: ctx.sourceNodeId,\n pendingSegments,\n });\n }\n public pendingSegments: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.pendingSegments]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"pending segments\": this.pendingSegments },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type EndpointId, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, type SupervisionResult, type ValueID, type WithAddress } from "@zwave-js/core";
|
|
1
|
+
import { CommandClasses, type EndpointId, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, type SupervisionResult, type ValueID, type WithAddress } from "@zwave-js/core";
|
|
2
2
|
import { Bytes, type BytesView } from "@zwave-js/shared";
|
|
3
3
|
import { POLL_VALUE, PhysicalCCAPI, type PollValueImplementation, SET_VALUE, SET_VALUE_HOOKS, type SetValueImplementation, type SetValueImplementationHooksFactory } from "../lib/API.js";
|
|
4
4
|
import { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions } from "../lib/CommandClass.js";
|
|
@@ -39,6 +39,7 @@ export declare class UserCodeCCAPI extends PhysicalCCAPI {
|
|
|
39
39
|
}
|
|
40
40
|
export declare class UserCodeCC extends CommandClass {
|
|
41
41
|
ccCommand: UserCodeCommand;
|
|
42
|
+
determineRequiredCCInterviews(): readonly CommandClasses[];
|
|
42
43
|
interview(ctx: InterviewContext): Promise<void>;
|
|
43
44
|
refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void>;
|
|
44
45
|
/**
|
|
@@ -61,6 +61,7 @@ var import_API = require("../lib/API.js");
|
|
|
61
61
|
var import_CommandClass = require("../lib/CommandClass.js");
|
|
62
62
|
var import_CommandClassDecorators = require("../lib/CommandClassDecorators.js");
|
|
63
63
|
var import_Types = require("../lib/_Types.js");
|
|
64
|
+
var import_UserCredentialCC = require("./UserCredentialCC.js");
|
|
64
65
|
var import_CCValues_generated = require("./_CCValues.generated.js");
|
|
65
66
|
const { validateArgs_UserCodeCCAPI_get, validateArgs_UserCodeCCAPI_set, validateArgs_UserCodeCCAPI_setMany, validateArgs_UserCodeCCAPI_clear, validateArgs_UserCodeCCAPI_setKeypadMode, validateArgs_UserCodeCCAPI_setAdminCode } = __validateArgs;
|
|
66
67
|
function parseExtendedUserCode(payload) {
|
|
@@ -542,9 +543,40 @@ let UserCodeCC = (() => {
|
|
|
542
543
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
543
544
|
(0, import_tslib.__runInitializers)(_classThis, _classExtraInitializers);
|
|
544
545
|
}
|
|
546
|
+
determineRequiredCCInterviews() {
|
|
547
|
+
return [
|
|
548
|
+
...super.determineRequiredCCInterviews(),
|
|
549
|
+
// CL:0083.01.21.00.2 ff: The controlling node MUST only use ONE of
|
|
550
|
+
// the User Management Command Classes to control a supporting node,
|
|
551
|
+
// and cache which User Management CC is used for each node.
|
|
552
|
+
//
|
|
553
|
+
// We determine this by interviewing U3C first, and then optionally
|
|
554
|
+
// User Code CC.
|
|
555
|
+
import_core.CommandClasses["User Credential"]
|
|
556
|
+
];
|
|
557
|
+
}
|
|
545
558
|
async interview(ctx) {
|
|
546
559
|
const node = this.getNode(ctx);
|
|
547
560
|
const endpoint = this.getEndpoint(ctx);
|
|
561
|
+
if (endpoint.supportsCC(import_core.CommandClasses["User Credential"])) {
|
|
562
|
+
const u3cUsers = import_UserCredentialCC.UserCredentialCC.getSupportedUsersCached(ctx, endpoint);
|
|
563
|
+
if (u3cUsers == void 0) {
|
|
564
|
+
ctx.logNode(node.id, {
|
|
565
|
+
endpoint: this.endpointIndex,
|
|
566
|
+
message: "Cannot determine if the node uses User Credential CC for user management, skipping User Code CC interview...",
|
|
567
|
+
level: "warn"
|
|
568
|
+
});
|
|
569
|
+
return;
|
|
570
|
+
} else if (u3cUsers > 0) {
|
|
571
|
+
ctx.logNode(node.id, {
|
|
572
|
+
endpoint: this.endpointIndex,
|
|
573
|
+
message: "Node uses User Credential CC for user management, skipping User Code CC interview...",
|
|
574
|
+
direction: "none"
|
|
575
|
+
});
|
|
576
|
+
this.setInterviewComplete(ctx, true);
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
548
580
|
const api = import_API.CCAPI.create(import_core.CommandClasses["User Code"], ctx, endpoint).withOptions({
|
|
549
581
|
priority: import_core.MessagePriority.NodeQuery
|
|
550
582
|
});
|
|
@@ -585,13 +617,17 @@ let UserCodeCC = (() => {
|
|
|
585
617
|
setUserCodeMetadata.call(this, ctx, userId);
|
|
586
618
|
}
|
|
587
619
|
await this.refreshValues(ctx, {
|
|
588
|
-
queryAllUserCodes: ctx.getInterviewOptions()?.queryAllUserCodes ?? false
|
|
620
|
+
queryAllUserCodes: ctx.getInterviewOptions()?.queryAllUserCodes ?? false,
|
|
621
|
+
onProgress: /* @__PURE__ */ __name((completed, total) => node.reportInterviewProgress(completed, total), "onProgress")
|
|
589
622
|
});
|
|
590
623
|
this.setInterviewComplete(ctx, true);
|
|
591
624
|
}
|
|
592
625
|
async refreshValues(ctx, options) {
|
|
593
626
|
const node = this.getNode(ctx);
|
|
594
627
|
const endpoint = this.getEndpoint(ctx);
|
|
628
|
+
if (endpoint.supportsCC(import_core.CommandClasses["User Credential"]) && import_UserCredentialCC.UserCredentialCC.getSupportedUsersCached(ctx, endpoint) !== 0) {
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
595
631
|
const api = import_API.CCAPI.create(import_core.CommandClasses["User Code"], ctx, endpoint).withOptions({
|
|
596
632
|
priority: options?.priority ?? import_core.MessagePriority.NodeQuery
|
|
597
633
|
});
|
|
@@ -642,6 +678,7 @@ let UserCodeCC = (() => {
|
|
|
642
678
|
let nextUserId = 1;
|
|
643
679
|
while (nextUserId > 0 && nextUserId <= supportedUsers) {
|
|
644
680
|
const response = await api.get(nextUserId, true);
|
|
681
|
+
options?.onProgress?.(nextUserId, supportedUsers);
|
|
645
682
|
if (response) {
|
|
646
683
|
nextUserId = response.nextUserId;
|
|
647
684
|
} else {
|
|
@@ -656,6 +693,7 @@ let UserCodeCC = (() => {
|
|
|
656
693
|
} else {
|
|
657
694
|
for (let userId = 1; userId <= supportedUsers; userId++) {
|
|
658
695
|
await api.get(userId);
|
|
696
|
+
options?.onProgress?.(userId, supportedUsers);
|
|
659
697
|
}
|
|
660
698
|
}
|
|
661
699
|
}
|
|
@@ -674,6 +712,7 @@ let UserCodeCC = (() => {
|
|
|
674
712
|
});
|
|
675
713
|
for (let userId = 1; userId <= supportedUsers; userId++) {
|
|
676
714
|
await api.get(userId);
|
|
715
|
+
options?.onProgress?.(userId, supportedUsers);
|
|
677
716
|
}
|
|
678
717
|
}
|
|
679
718
|
}
|