@project-chip/matter.js 0.9.1 → 0.9.3
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/dist/cjs/MatterDevice.d.ts +1 -0
- package/dist/cjs/MatterDevice.d.ts.map +1 -1
- package/dist/cjs/MatterDevice.js +3 -0
- package/dist/cjs/MatterDevice.js.map +2 -2
- package/dist/cjs/model/models/AttributeModel.d.ts +1 -0
- package/dist/cjs/model/models/AttributeModel.d.ts.map +1 -1
- package/dist/cjs/model/models/AttributeModel.js +3 -1
- package/dist/cjs/model/models/AttributeModel.js.map +2 -2
- package/dist/cjs/node/server/TransactionalInteractionServer.d.ts.map +1 -1
- package/dist/cjs/node/server/TransactionalInteractionServer.js +15 -2
- package/dist/cjs/node/server/TransactionalInteractionServer.js.map +2 -2
- package/dist/cjs/protocol/ChannelManager.js +1 -1
- package/dist/cjs/protocol/ChannelManager.js.map +2 -2
- package/dist/cjs/protocol/interaction/InteractionServer.d.ts +6 -0
- package/dist/cjs/protocol/interaction/InteractionServer.d.ts.map +1 -1
- package/dist/cjs/protocol/interaction/InteractionServer.js +79 -22
- package/dist/cjs/protocol/interaction/InteractionServer.js.map +2 -2
- package/dist/cjs/protocol/securechannel/SecureChannelProtocol.d.ts.map +1 -1
- package/dist/cjs/protocol/securechannel/SecureChannelProtocol.js +4 -2
- package/dist/cjs/protocol/securechannel/SecureChannelProtocol.js.map +2 -2
- package/dist/cjs/session/SecureSession.d.ts.map +1 -1
- package/dist/cjs/session/SecureSession.js +2 -1
- package/dist/cjs/session/SecureSession.js.map +2 -2
- package/dist/cjs/session/SessionManager.d.ts +1 -0
- package/dist/cjs/session/SessionManager.d.ts.map +1 -1
- package/dist/cjs/session/SessionManager.js +7 -0
- package/dist/cjs/session/SessionManager.js.map +2 -2
- package/dist/esm/MatterDevice.d.ts +1 -0
- package/dist/esm/MatterDevice.d.ts.map +1 -1
- package/dist/esm/MatterDevice.js +3 -0
- package/dist/esm/MatterDevice.js.map +2 -2
- package/dist/esm/model/models/AttributeModel.d.ts +1 -0
- package/dist/esm/model/models/AttributeModel.d.ts.map +1 -1
- package/dist/esm/model/models/AttributeModel.js +3 -1
- package/dist/esm/model/models/AttributeModel.js.map +2 -2
- package/dist/esm/node/server/TransactionalInteractionServer.d.ts.map +1 -1
- package/dist/esm/node/server/TransactionalInteractionServer.js +15 -2
- package/dist/esm/node/server/TransactionalInteractionServer.js.map +2 -2
- package/dist/esm/protocol/ChannelManager.js +1 -1
- package/dist/esm/protocol/ChannelManager.js.map +2 -2
- package/dist/esm/protocol/interaction/InteractionServer.d.ts +6 -0
- package/dist/esm/protocol/interaction/InteractionServer.d.ts.map +1 -1
- package/dist/esm/protocol/interaction/InteractionServer.js +79 -22
- package/dist/esm/protocol/interaction/InteractionServer.js.map +2 -2
- package/dist/esm/protocol/securechannel/SecureChannelProtocol.d.ts.map +1 -1
- package/dist/esm/protocol/securechannel/SecureChannelProtocol.js +4 -2
- package/dist/esm/protocol/securechannel/SecureChannelProtocol.js.map +2 -2
- package/dist/esm/session/SecureSession.d.ts.map +1 -1
- package/dist/esm/session/SecureSession.js +2 -1
- package/dist/esm/session/SecureSession.js.map +2 -2
- package/dist/esm/session/SessionManager.d.ts +1 -0
- package/dist/esm/session/SessionManager.d.ts.map +1 -1
- package/dist/esm/session/SessionManager.js +7 -0
- package/dist/esm/session/SessionManager.js.map +2 -2
- package/package.json +3 -3
- package/src/MatterDevice.ts +4 -0
- package/src/model/models/AttributeModel.ts +2 -0
- package/src/node/server/TransactionalInteractionServer.ts +21 -6
- package/src/protocol/ChannelManager.ts +1 -1
- package/src/protocol/interaction/InteractionServer.ts +91 -24
- package/src/protocol/securechannel/SecureChannelProtocol.ts +3 -1
- package/src/session/SecureSession.ts +2 -1
- package/src/session/SessionManager.ts +8 -0
|
@@ -80,6 +80,7 @@ export declare class MatterDevice {
|
|
|
80
80
|
session: Session<MatterDevice>;
|
|
81
81
|
channel: Channel<ByteArray>;
|
|
82
82
|
}>;
|
|
83
|
+
clearSubscriptionsForNode(peerNodeId: NodeId, flushSubscriptions?: boolean): Promise<void>;
|
|
83
84
|
close(): Promise<void>;
|
|
84
85
|
getActiveSessionInformation(): {
|
|
85
86
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatterDevice.d.ts","sourceRoot":"","sources":["../../src/MatterDevice.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MatterDevice.d.ts","sourceRoot":"","sources":["../../src/MatterDevice.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/MatterDevice.js
CHANGED
|
@@ -398,6 +398,9 @@ class MatterDevice {
|
|
|
398
398
|
}
|
|
399
399
|
return { session, channel: await networkInterface.openChannel(device.addresses[0]) };
|
|
400
400
|
}
|
|
401
|
+
async clearSubscriptionsForNode(peerNodeId, flushSubscriptions) {
|
|
402
|
+
await this.#sessionManager.clearSubscriptionsForNode(peerNodeId, flushSubscriptions);
|
|
403
|
+
}
|
|
401
404
|
async close() {
|
|
402
405
|
this.#isClosing = true;
|
|
403
406
|
await this.endCommissioning();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/MatterDevice.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Important note: This file is part of the legacy matter-node (internal) API and should not be used anymore directly!\n * Please use the new API classes!\n * @deprecated\n */\n\nimport {\n DEVICE_ANNOUNCEMENT_DURATION_MS,\n DEVICE_ANNOUNCEMENT_INTERVAL_MS,\n} from \"./behavior/definitions/administrator-commissioning/AdministratorCommissioningConstants.js\";\nimport { CommissioningOptions } from \"./behavior/system/commissioning/CommissioningOptions.js\";\nimport { AdministratorCommissioning } from \"./cluster/definitions/AdministratorCommissioningCluster.js\";\n\nimport { Channel } from \"./common/Channel.js\";\nimport { FailsafeContext } from \"./common/FailsafeContext.js\";\nimport { InstanceBroadcaster } from \"./common/InstanceBroadcaster.js\";\nimport { Lifecycle } from \"./common/Lifecycle.js\";\nimport { InternalError, MatterFlowError } from \"./common/MatterError.js\";\nimport { Scanner } from \"./common/Scanner.js\";\nimport { TransportInterface } from \"./common/TransportInterface.js\";\nimport { Crypto } from \"./crypto/Crypto.js\";\nimport { FabricIndex } from \"./datatype/FabricIndex.js\";\nimport { NodeId } from \"./datatype/NodeId.js\";\nimport { Fabric } from \"./fabric/Fabric.js\";\nimport { FabricAction, FabricManager } from \"./fabric/FabricManager.js\";\nimport { Diagnostic } from \"./log/Diagnostic.js\";\nimport { Logger } from \"./log/Logger.js\";\nimport { NetInterface, isNetworkInterface } from \"./net/NetInterface.js\";\nimport { NetworkError } from \"./net/Network.js\";\nimport { ChannelManager } from \"./protocol/ChannelManager.js\";\nimport { ExchangeManager } from \"./protocol/ExchangeManager.js\";\nimport { ProtocolHandler } from \"./protocol/ProtocolHandler.js\";\nimport { StatusCode, StatusResponseError } from \"./protocol/interaction/StatusCode.js\";\nimport { SecureChannelProtocol } from \"./protocol/securechannel/SecureChannelProtocol.js\";\nimport { Session } from \"./session/Session.js\";\nimport { ResumptionRecord, SessionManager } from \"./session/SessionManager.js\";\nimport { PaseServer } from \"./session/pase/PaseServer.js\";\nimport { StorageContext } from \"./storage/StorageContext.js\";\nimport { Time, Timer } from \"./time/Time.js\";\nimport { AsyncConstruction, asyncNew } from \"./util/AsyncConstruction.js\";\nimport { ByteArray } from \"./util/ByteArray.js\";\nimport { Mutex } from \"./util/Mutex.js\";\n\nconst logger = Logger.get(\"MatterDevice\");\n\nexport class MatterDevice {\n private readonly scanners = new Array<Scanner>();\n private readonly broadcasters = new Array<InstanceBroadcaster>();\n private readonly transportInterfaces = new Array<TransportInterface | NetInterface>();\n private readonly channelManager: ChannelManager;\n private readonly secureChannelProtocol = new SecureChannelProtocol(() => this.endCommissioning());\n private activeCommissioningMode = AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen;\n private activeCommissioningEndCallback?: () => void;\n private announceInterval: Timer;\n private announcementStartedTime: number | null = null;\n #isClosing = false;\n readonly #exchangeManager;\n readonly #fabricManager: FabricManager;\n readonly #sessionManager: SessionManager<MatterDevice>;\n #failsafeContext?: FailsafeContext;\n\n // Currently we do not put much effort into synchronizing announcements as it probably isn't really necessary. But\n // this mutex prevents automated announcements from piling up and allows us to ensure announcements are complete\n // on close\n #announcementMutex = new Mutex(this);\n #construction: AsyncConstruction<MatterDevice>;\n\n get construction() {\n return this.#construction;\n }\n\n static async create(\n sessionStorage: StorageContext,\n fabricStorage: StorageContext,\n getCommissioningConfig: () => CommissioningOptions.Configuration,\n minimumCaseSessionsPerFabricAndNode = 3,\n commissioningChangedCallback: (fabricIndex: FabricIndex, fabricAction: FabricAction) => void,\n sessionChangedCallback: (fabricIndex: FabricIndex) => void,\n ) {\n return asyncNew(\n MatterDevice,\n sessionStorage,\n fabricStorage,\n getCommissioningConfig,\n minimumCaseSessionsPerFabricAndNode,\n commissioningChangedCallback,\n sessionChangedCallback,\n );\n }\n\n constructor(\n readonly sessionStorage: StorageContext,\n readonly fabricStorage: StorageContext,\n private readonly getCommissioningConfig: () => CommissioningOptions.Configuration,\n minimumCaseSessionsPerFabricAndNode: number,\n private readonly commissioningChangedCallback: (fabricIndex: FabricIndex, fabricAction: FabricAction) => void,\n private readonly sessionChangedCallback: (fabricIndex: FabricIndex) => void,\n ) {\n this.channelManager = new ChannelManager(minimumCaseSessionsPerFabricAndNode);\n\n this.#fabricManager = new FabricManager(fabricStorage);\n\n this.#fabricManager.events.deleted.on(async fabric => {\n const { fabricIndex, rootNodeId } = fabric;\n // When fabric is removed, also remove the resumption record\n await this.#sessionManager.removeResumptionRecord(rootNodeId);\n this.commissioningChangedCallback(fabricIndex, FabricAction.Removed);\n if (this.#fabricManager.getFabrics().length === 0) {\n // Last fabric got removed, so expire all announcements\n await this.expireAllFabricAnnouncements();\n }\n });\n this.#fabricManager.events.updated.on(({ fabricIndex }) =>\n this.commissioningChangedCallback(fabricIndex, FabricAction.Updated),\n );\n\n this.#sessionManager = new SessionManager(this, sessionStorage);\n\n this.#exchangeManager = new ExchangeManager<MatterDevice>(this.#sessionManager, this.channelManager);\n\n this.addProtocolHandler(this.secureChannelProtocol);\n\n this.announceInterval = Time.getPeriodicTimer(\"Server node announcement\", DEVICE_ANNOUNCEMENT_INTERVAL_MS, () =>\n // Announcement needs to await a previous announcement because otherwise in testing at least announcement\n // may crash if started simultaneously\n this.#announcementMutex.run(() => this.announce()),\n );\n\n this.#sessionManager.sessionOpened.on(session => {\n if (session.fabric) {\n this.sessionChangedCallback(session.fabric.fabricIndex);\n }\n });\n\n this.#sessionManager.sessionClosed.on(async session => {\n if (!session.closingAfterExchangeFinished) {\n // Delayed closing is executed when exchange is closed\n await this.exchangeManager.closeSession(session);\n }\n const currentFabric = session.fabric;\n if (currentFabric !== undefined) {\n this.sessionChangedCallback(currentFabric.fabricIndex);\n }\n if (this.isClosing) {\n return;\n }\n // When a session closes, announce existing fabrics again so that controller can detect the device again.\n // When session was closed and no fabric exist anymore then this is triggering a factory reset in upper layer\n // and it would be not good to announce a commissionable device and then reset that again with the factory reset\n if (this.#fabricManager.getFabrics().length > 0 || !currentFabric) {\n await this.startAnnouncement();\n }\n });\n\n this.#sessionManager.subscriptionsChanged.on(session => {\n const currentFabric = session.fabric;\n if (currentFabric !== undefined) {\n this.sessionChangedCallback(currentFabric.fabricIndex);\n }\n });\n\n this.#construction = AsyncConstruction(this, async () => {\n await this.#fabricManager.initFromStorage();\n\n // Attach added events delayed because initialization from storage would else trigger it\n this.#fabricManager.events.added.on(({ fabricIndex }) =>\n this.commissioningChangedCallback(fabricIndex, FabricAction.Added),\n );\n\n await this.#sessionManager.initFromStorage(this.#fabricManager.getFabrics());\n });\n }\n\n get fabricManager() {\n return this.#fabricManager;\n }\n\n get sessionManager() {\n return this.#sessionManager;\n }\n\n get exchangeManager() {\n return this.#exchangeManager;\n }\n\n get failsafeContext() {\n this.assertFailSafeArmed();\n return this.#failsafeContext as FailsafeContext;\n }\n\n get isClosing() {\n return this.#isClosing;\n }\n\n async beginTimed(failsafeContext: FailsafeContext) {\n await failsafeContext.construction;\n\n this.#failsafeContext = failsafeContext;\n\n this.#fabricManager.events.added.on(fabric => {\n const fabrics = this.#fabricManager.getFabrics();\n this.sendFabricAnnouncements(fabrics, true).catch(error =>\n logger.warn(`Error sending Fabric announcement for Index ${fabric.fabricIndex}`, error),\n );\n logger.info(\"Announce done\", Diagnostic.dict({ fabric: fabric.fabricId, fabricIndex: fabric.fabricIndex }));\n });\n\n failsafeContext.commissioned.on(async () => await this.endCommissioning());\n\n failsafeContext.construction.change.on(status => {\n if (status === Lifecycle.Status.Destroyed) {\n this.#failsafeContext = undefined;\n }\n });\n }\n\n assertFailSafeArmed(message?: string) {\n if (this.isFailsafeArmed()) return;\n throw new StatusResponseError(\n message ?? \"Failsafe timer needs to be armed to execute this action.\",\n StatusCode.FailsafeRequired,\n );\n }\n\n isFailsafeArmed() {\n return this.#failsafeContext !== undefined;\n }\n\n addScanner(scanner: Scanner) {\n this.scanners.push(scanner);\n return this;\n }\n\n hasBroadcaster(broadcaster: InstanceBroadcaster) {\n return this.broadcasters.includes(broadcaster);\n }\n\n addBroadcaster(broadcaster: InstanceBroadcaster) {\n this.broadcasters.push(broadcaster);\n return this;\n }\n\n async deleteBroadcaster(broadcaster: InstanceBroadcaster) {\n const pos = this.broadcasters.findIndex(b => b === broadcaster);\n if (pos !== -1) {\n this.broadcasters.splice(pos, 1);\n await broadcaster.expireAllAnnouncements();\n }\n }\n\n addTransportInterface(transport: TransportInterface) {\n this.exchangeManager.addTransportInterface(transport);\n this.transportInterfaces.push(transport);\n return this;\n }\n\n async deleteTransportInterface(transport: TransportInterface) {\n const pos = this.transportInterfaces.findIndex(t => t === transport);\n if (pos !== -1) {\n this.transportInterfaces.splice(pos, 1);\n await transport.close();\n }\n }\n\n hasProtocolHandler(protocolId: number) {\n return this.exchangeManager.hasProtocolHandler(protocolId);\n }\n\n addProtocolHandler(protocol: ProtocolHandler<MatterDevice>) {\n this.exchangeManager.addProtocolHandler(protocol);\n return this;\n }\n\n async start() {\n await this.startAnnouncement();\n }\n\n async startAnnouncement() {\n if (this.isClosing) return;\n if (this.announceInterval.isRunning) {\n this.announceInterval.stop();\n }\n this.announcementStartedTime = Time.nowMs();\n this.announceInterval.start();\n await this.announce();\n }\n\n async expireAllFabricAnnouncements() {\n for (const broadcaster of this.broadcasters) {\n await broadcaster.expireAllAnnouncements();\n }\n }\n\n async announce(announceOnce = false) {\n if (!announceOnce) {\n // Stop announcement if duration is reached\n if (\n this.announcementStartedTime !== null &&\n Time.nowMs() - this.announcementStartedTime > DEVICE_ANNOUNCEMENT_DURATION_MS\n ) {\n await this.endCommissioning();\n logger.debug(\"Announcement duration reached, stop announcing\");\n return;\n }\n if (this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {\n // Re-Announce but do not re-set Fabrics\n for (const broadcaster of this.broadcasters) {\n await broadcaster.announce();\n }\n return;\n }\n }\n const fabrics = this.#fabricManager.getFabrics();\n if (fabrics.length) {\n let fabricsWithoutSessions = 0;\n for (const fabric of fabrics) {\n const session = this.#sessionManager.getSessionForNode(fabric, fabric.rootNodeId);\n if (session === undefined || !session.isSecure || session.numberOfActiveSubscriptions === 0) {\n fabricsWithoutSessions++;\n logger.debug(\"Announcing\", Diagnostic.dict({ fabric: fabric.fabricId }));\n }\n }\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setFabrics(fabrics);\n if (fabricsWithoutSessions > 0) {\n await broadcaster.announce();\n }\n }\n } else {\n // No fabric paired yet, so announce as \"ready for commissioning\"\n // And expire operational Fabric announcements (if fabric got just deleted)\n await this.expireAllFabricAnnouncements();\n await this.allowBasicCommissioning();\n }\n }\n\n private async announceAsCommissionable(\n mode: AdministratorCommissioning.CommissioningWindowStatus,\n activeCommissioningEndCallback?: () => void,\n discriminator?: number,\n ) {\n if (this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {\n throw new InternalError(\n `Commissioning window already open with different mode (${this.activeCommissioningMode})!`,\n );\n }\n if (this.activeCommissioningEndCallback !== undefined) {\n throw new InternalError(\"Commissioning window already open with different callback!\");\n }\n this.activeCommissioningMode = mode;\n if (activeCommissioningEndCallback !== undefined) {\n this.activeCommissioningEndCallback = activeCommissioningEndCallback;\n }\n // MDNS is sent in parallel\n // TODO - untracked promise\n this.sendCommissionableAnnouncement(mode, discriminator).catch(error =>\n logger.warn(\"Error sending announcement\", error),\n );\n }\n\n async sendCommissionableAnnouncement(\n mode: AdministratorCommissioning.CommissioningWindowStatus,\n discriminator?: number,\n ) {\n const commissioningConfig = this.getCommissioningConfig();\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setCommissionMode(\n mode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen ? 2 : 1,\n {\n ...commissioningConfig.productDescription,\n discriminator: discriminator ?? commissioningConfig.discriminator,\n },\n );\n }\n await this.startAnnouncement();\n }\n\n async getNextAvailableSessionId() {\n return this.#sessionManager.getNextAvailableSessionId();\n }\n\n findFabricFromDestinationId(destinationId: ByteArray, peerRandom: ByteArray) {\n return this.#fabricManager.findFabricFromDestinationId(destinationId, peerRandom);\n }\n\n async sendFabricAnnouncements(fabrics: Fabric[], expireCommissioningAnnouncement = false) {\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setFabrics(fabrics, expireCommissioningAnnouncement);\n await broadcaster.announce();\n }\n }\n\n getFabricByIndex(fabricIndex: FabricIndex) {\n return this.#fabricManager.getFabrics().find(fabric => fabric.fabricIndex === fabricIndex);\n }\n\n initiateExchange(fabric: Fabric, nodeId: NodeId, protocolId: number) {\n return this.exchangeManager.initiateExchange(fabric, nodeId, protocolId);\n }\n\n findResumptionRecordById(resumptionId: ByteArray) {\n return this.#sessionManager.findResumptionRecordById(resumptionId);\n }\n\n async saveResumptionRecord(resumptionRecord: ResumptionRecord) {\n return this.#sessionManager.saveResumptionRecord(resumptionRecord);\n }\n\n getFabrics() {\n return this.#fabricManager.getFabrics();\n }\n\n isCommissioned() {\n return !!this.#fabricManager.getFabrics().length;\n }\n\n async allowEnhancedCommissioning(\n discriminator: number,\n paseServer: PaseServer,\n commissioningEndCallback: () => void,\n ) {\n if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.BasicWindowOpen) {\n throw new MatterFlowError(\n \"Basic commissioning window is already open! Can not set Enhanced commissioning mode.\",\n );\n }\n\n this.secureChannelProtocol.setPaseCommissioner(paseServer);\n await this.announceAsCommissionable(\n AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen,\n commissioningEndCallback,\n discriminator,\n );\n }\n\n async allowBasicCommissioning(commissioningEndCallback?: () => void) {\n if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen) {\n throw new MatterFlowError(\n \"Enhanced commissioning window is already open! Can not set Basic commissioning mode.\",\n );\n }\n\n this.secureChannelProtocol.setPaseCommissioner(\n await PaseServer.fromPin(this.getCommissioningConfig().passcode, {\n iterations: 1000,\n salt: Crypto.get().getRandomData(32),\n }),\n );\n\n await this.announceAsCommissionable(\n AdministratorCommissioning.CommissioningWindowStatus.BasicWindowOpen,\n commissioningEndCallback,\n );\n }\n\n async endCommissioning() {\n logger.debug(\"Commissioning mode ended, stop announcements.\");\n // Remove PASE responder when we close enhanced commissioning window or node is commissioned\n if (\n this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen ||\n this.isCommissioned()\n ) {\n this.secureChannelProtocol.removePaseCommissioner();\n }\n this.activeCommissioningMode = AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen;\n this.announceInterval.stop();\n this.announcementStartedTime = null;\n if (this.activeCommissioningEndCallback !== undefined) {\n const activeCommissioningEndCallback = this.activeCommissioningEndCallback;\n this.activeCommissioningEndCallback = undefined;\n activeCommissioningEndCallback();\n }\n for (const broadcaster of this.broadcasters) {\n await broadcaster.expireCommissioningAnnouncement();\n }\n logger.info(\"All announcements expired\");\n }\n\n existsOpenPaseSession() {\n return !!this.#sessionManager.getPaseSession();\n }\n\n async findDevice(\n fabric: Fabric,\n nodeId: NodeId,\n timeOutSeconds = 5,\n ): Promise<undefined | { session: Session<MatterDevice>; channel: Channel<ByteArray> }> {\n // TODO: return the first not undefined answer or undefined\n const device = await this.scanners[0].findOperationalDevice(fabric, nodeId, timeOutSeconds);\n if (device === undefined) return undefined;\n const session = this.#sessionManager.getSessionForNode(fabric, nodeId);\n if (session === undefined) return undefined;\n // TODO: have the interface and scanner linked\n const networkInterface = this.transportInterfaces.find(netInterface => isNetworkInterface(netInterface));\n if (networkInterface === undefined || !isNetworkInterface(networkInterface)) {\n throw new NetworkError(\"No network interface found\");\n } // TODO meeehhh\n return { session, channel: await networkInterface.openChannel(device.addresses[0]) };\n }\n\n async close() {\n this.#isClosing = true;\n await this.endCommissioning();\n await this.#announcementMutex;\n for (const broadcaster of this.broadcasters) {\n await broadcaster.close();\n }\n if (this.#failsafeContext) {\n await this.#failsafeContext.close();\n this.#failsafeContext = undefined;\n }\n await this.exchangeManager.close();\n await this.#sessionManager.close();\n await this.channelManager.close();\n for (const transportInterface of this.transportInterfaces) {\n await transportInterface.close();\n }\n }\n\n getActiveSessionInformation() {\n return this.#sessionManager.getActiveSessionInformation();\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Important note: This file is part of the legacy matter-node (internal) API and should not be used anymore directly!\n * Please use the new API classes!\n * @deprecated\n */\n\nimport {\n DEVICE_ANNOUNCEMENT_DURATION_MS,\n DEVICE_ANNOUNCEMENT_INTERVAL_MS,\n} from \"./behavior/definitions/administrator-commissioning/AdministratorCommissioningConstants.js\";\nimport { CommissioningOptions } from \"./behavior/system/commissioning/CommissioningOptions.js\";\nimport { AdministratorCommissioning } from \"./cluster/definitions/AdministratorCommissioningCluster.js\";\n\nimport { Channel } from \"./common/Channel.js\";\nimport { FailsafeContext } from \"./common/FailsafeContext.js\";\nimport { InstanceBroadcaster } from \"./common/InstanceBroadcaster.js\";\nimport { Lifecycle } from \"./common/Lifecycle.js\";\nimport { InternalError, MatterFlowError } from \"./common/MatterError.js\";\nimport { Scanner } from \"./common/Scanner.js\";\nimport { TransportInterface } from \"./common/TransportInterface.js\";\nimport { Crypto } from \"./crypto/Crypto.js\";\nimport { FabricIndex } from \"./datatype/FabricIndex.js\";\nimport { NodeId } from \"./datatype/NodeId.js\";\nimport { Fabric } from \"./fabric/Fabric.js\";\nimport { FabricAction, FabricManager } from \"./fabric/FabricManager.js\";\nimport { Diagnostic } from \"./log/Diagnostic.js\";\nimport { Logger } from \"./log/Logger.js\";\nimport { NetInterface, isNetworkInterface } from \"./net/NetInterface.js\";\nimport { NetworkError } from \"./net/Network.js\";\nimport { ChannelManager } from \"./protocol/ChannelManager.js\";\nimport { ExchangeManager } from \"./protocol/ExchangeManager.js\";\nimport { ProtocolHandler } from \"./protocol/ProtocolHandler.js\";\nimport { StatusCode, StatusResponseError } from \"./protocol/interaction/StatusCode.js\";\nimport { SecureChannelProtocol } from \"./protocol/securechannel/SecureChannelProtocol.js\";\nimport { Session } from \"./session/Session.js\";\nimport { ResumptionRecord, SessionManager } from \"./session/SessionManager.js\";\nimport { PaseServer } from \"./session/pase/PaseServer.js\";\nimport { StorageContext } from \"./storage/StorageContext.js\";\nimport { Time, Timer } from \"./time/Time.js\";\nimport { AsyncConstruction, asyncNew } from \"./util/AsyncConstruction.js\";\nimport { ByteArray } from \"./util/ByteArray.js\";\nimport { Mutex } from \"./util/Mutex.js\";\n\nconst logger = Logger.get(\"MatterDevice\");\n\nexport class MatterDevice {\n private readonly scanners = new Array<Scanner>();\n private readonly broadcasters = new Array<InstanceBroadcaster>();\n private readonly transportInterfaces = new Array<TransportInterface | NetInterface>();\n private readonly channelManager: ChannelManager;\n private readonly secureChannelProtocol = new SecureChannelProtocol(() => this.endCommissioning());\n private activeCommissioningMode = AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen;\n private activeCommissioningEndCallback?: () => void;\n private announceInterval: Timer;\n private announcementStartedTime: number | null = null;\n #isClosing = false;\n readonly #exchangeManager;\n readonly #fabricManager: FabricManager;\n readonly #sessionManager: SessionManager<MatterDevice>;\n #failsafeContext?: FailsafeContext;\n\n // Currently we do not put much effort into synchronizing announcements as it probably isn't really necessary. But\n // this mutex prevents automated announcements from piling up and allows us to ensure announcements are complete\n // on close\n #announcementMutex = new Mutex(this);\n #construction: AsyncConstruction<MatterDevice>;\n\n get construction() {\n return this.#construction;\n }\n\n static async create(\n sessionStorage: StorageContext,\n fabricStorage: StorageContext,\n getCommissioningConfig: () => CommissioningOptions.Configuration,\n minimumCaseSessionsPerFabricAndNode = 3,\n commissioningChangedCallback: (fabricIndex: FabricIndex, fabricAction: FabricAction) => void,\n sessionChangedCallback: (fabricIndex: FabricIndex) => void,\n ) {\n return asyncNew(\n MatterDevice,\n sessionStorage,\n fabricStorage,\n getCommissioningConfig,\n minimumCaseSessionsPerFabricAndNode,\n commissioningChangedCallback,\n sessionChangedCallback,\n );\n }\n\n constructor(\n readonly sessionStorage: StorageContext,\n readonly fabricStorage: StorageContext,\n private readonly getCommissioningConfig: () => CommissioningOptions.Configuration,\n minimumCaseSessionsPerFabricAndNode: number,\n private readonly commissioningChangedCallback: (fabricIndex: FabricIndex, fabricAction: FabricAction) => void,\n private readonly sessionChangedCallback: (fabricIndex: FabricIndex) => void,\n ) {\n this.channelManager = new ChannelManager(minimumCaseSessionsPerFabricAndNode);\n\n this.#fabricManager = new FabricManager(fabricStorage);\n\n this.#fabricManager.events.deleted.on(async fabric => {\n const { fabricIndex, rootNodeId } = fabric;\n // When fabric is removed, also remove the resumption record\n await this.#sessionManager.removeResumptionRecord(rootNodeId);\n this.commissioningChangedCallback(fabricIndex, FabricAction.Removed);\n if (this.#fabricManager.getFabrics().length === 0) {\n // Last fabric got removed, so expire all announcements\n await this.expireAllFabricAnnouncements();\n }\n });\n this.#fabricManager.events.updated.on(({ fabricIndex }) =>\n this.commissioningChangedCallback(fabricIndex, FabricAction.Updated),\n );\n\n this.#sessionManager = new SessionManager(this, sessionStorage);\n\n this.#exchangeManager = new ExchangeManager<MatterDevice>(this.#sessionManager, this.channelManager);\n\n this.addProtocolHandler(this.secureChannelProtocol);\n\n this.announceInterval = Time.getPeriodicTimer(\"Server node announcement\", DEVICE_ANNOUNCEMENT_INTERVAL_MS, () =>\n // Announcement needs to await a previous announcement because otherwise in testing at least announcement\n // may crash if started simultaneously\n this.#announcementMutex.run(() => this.announce()),\n );\n\n this.#sessionManager.sessionOpened.on(session => {\n if (session.fabric) {\n this.sessionChangedCallback(session.fabric.fabricIndex);\n }\n });\n\n this.#sessionManager.sessionClosed.on(async session => {\n if (!session.closingAfterExchangeFinished) {\n // Delayed closing is executed when exchange is closed\n await this.exchangeManager.closeSession(session);\n }\n const currentFabric = session.fabric;\n if (currentFabric !== undefined) {\n this.sessionChangedCallback(currentFabric.fabricIndex);\n }\n if (this.isClosing) {\n return;\n }\n // When a session closes, announce existing fabrics again so that controller can detect the device again.\n // When session was closed and no fabric exist anymore then this is triggering a factory reset in upper layer\n // and it would be not good to announce a commissionable device and then reset that again with the factory reset\n if (this.#fabricManager.getFabrics().length > 0 || !currentFabric) {\n await this.startAnnouncement();\n }\n });\n\n this.#sessionManager.subscriptionsChanged.on(session => {\n const currentFabric = session.fabric;\n if (currentFabric !== undefined) {\n this.sessionChangedCallback(currentFabric.fabricIndex);\n }\n });\n\n this.#construction = AsyncConstruction(this, async () => {\n await this.#fabricManager.initFromStorage();\n\n // Attach added events delayed because initialization from storage would else trigger it\n this.#fabricManager.events.added.on(({ fabricIndex }) =>\n this.commissioningChangedCallback(fabricIndex, FabricAction.Added),\n );\n\n await this.#sessionManager.initFromStorage(this.#fabricManager.getFabrics());\n });\n }\n\n get fabricManager() {\n return this.#fabricManager;\n }\n\n get sessionManager() {\n return this.#sessionManager;\n }\n\n get exchangeManager() {\n return this.#exchangeManager;\n }\n\n get failsafeContext() {\n this.assertFailSafeArmed();\n return this.#failsafeContext as FailsafeContext;\n }\n\n get isClosing() {\n return this.#isClosing;\n }\n\n async beginTimed(failsafeContext: FailsafeContext) {\n await failsafeContext.construction;\n\n this.#failsafeContext = failsafeContext;\n\n this.#fabricManager.events.added.on(fabric => {\n const fabrics = this.#fabricManager.getFabrics();\n this.sendFabricAnnouncements(fabrics, true).catch(error =>\n logger.warn(`Error sending Fabric announcement for Index ${fabric.fabricIndex}`, error),\n );\n logger.info(\"Announce done\", Diagnostic.dict({ fabric: fabric.fabricId, fabricIndex: fabric.fabricIndex }));\n });\n\n failsafeContext.commissioned.on(async () => await this.endCommissioning());\n\n failsafeContext.construction.change.on(status => {\n if (status === Lifecycle.Status.Destroyed) {\n this.#failsafeContext = undefined;\n }\n });\n }\n\n assertFailSafeArmed(message?: string) {\n if (this.isFailsafeArmed()) return;\n throw new StatusResponseError(\n message ?? \"Failsafe timer needs to be armed to execute this action.\",\n StatusCode.FailsafeRequired,\n );\n }\n\n isFailsafeArmed() {\n return this.#failsafeContext !== undefined;\n }\n\n addScanner(scanner: Scanner) {\n this.scanners.push(scanner);\n return this;\n }\n\n hasBroadcaster(broadcaster: InstanceBroadcaster) {\n return this.broadcasters.includes(broadcaster);\n }\n\n addBroadcaster(broadcaster: InstanceBroadcaster) {\n this.broadcasters.push(broadcaster);\n return this;\n }\n\n async deleteBroadcaster(broadcaster: InstanceBroadcaster) {\n const pos = this.broadcasters.findIndex(b => b === broadcaster);\n if (pos !== -1) {\n this.broadcasters.splice(pos, 1);\n await broadcaster.expireAllAnnouncements();\n }\n }\n\n addTransportInterface(transport: TransportInterface) {\n this.exchangeManager.addTransportInterface(transport);\n this.transportInterfaces.push(transport);\n return this;\n }\n\n async deleteTransportInterface(transport: TransportInterface) {\n const pos = this.transportInterfaces.findIndex(t => t === transport);\n if (pos !== -1) {\n this.transportInterfaces.splice(pos, 1);\n await transport.close();\n }\n }\n\n hasProtocolHandler(protocolId: number) {\n return this.exchangeManager.hasProtocolHandler(protocolId);\n }\n\n addProtocolHandler(protocol: ProtocolHandler<MatterDevice>) {\n this.exchangeManager.addProtocolHandler(protocol);\n return this;\n }\n\n async start() {\n await this.startAnnouncement();\n }\n\n async startAnnouncement() {\n if (this.isClosing) return;\n if (this.announceInterval.isRunning) {\n this.announceInterval.stop();\n }\n this.announcementStartedTime = Time.nowMs();\n this.announceInterval.start();\n await this.announce();\n }\n\n async expireAllFabricAnnouncements() {\n for (const broadcaster of this.broadcasters) {\n await broadcaster.expireAllAnnouncements();\n }\n }\n\n async announce(announceOnce = false) {\n if (!announceOnce) {\n // Stop announcement if duration is reached\n if (\n this.announcementStartedTime !== null &&\n Time.nowMs() - this.announcementStartedTime > DEVICE_ANNOUNCEMENT_DURATION_MS\n ) {\n await this.endCommissioning();\n logger.debug(\"Announcement duration reached, stop announcing\");\n return;\n }\n if (this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {\n // Re-Announce but do not re-set Fabrics\n for (const broadcaster of this.broadcasters) {\n await broadcaster.announce();\n }\n return;\n }\n }\n const fabrics = this.#fabricManager.getFabrics();\n if (fabrics.length) {\n let fabricsWithoutSessions = 0;\n for (const fabric of fabrics) {\n const session = this.#sessionManager.getSessionForNode(fabric, fabric.rootNodeId);\n if (session === undefined || !session.isSecure || session.numberOfActiveSubscriptions === 0) {\n fabricsWithoutSessions++;\n logger.debug(\"Announcing\", Diagnostic.dict({ fabric: fabric.fabricId }));\n }\n }\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setFabrics(fabrics);\n if (fabricsWithoutSessions > 0) {\n await broadcaster.announce();\n }\n }\n } else {\n // No fabric paired yet, so announce as \"ready for commissioning\"\n // And expire operational Fabric announcements (if fabric got just deleted)\n await this.expireAllFabricAnnouncements();\n await this.allowBasicCommissioning();\n }\n }\n\n private async announceAsCommissionable(\n mode: AdministratorCommissioning.CommissioningWindowStatus,\n activeCommissioningEndCallback?: () => void,\n discriminator?: number,\n ) {\n if (this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {\n throw new InternalError(\n `Commissioning window already open with different mode (${this.activeCommissioningMode})!`,\n );\n }\n if (this.activeCommissioningEndCallback !== undefined) {\n throw new InternalError(\"Commissioning window already open with different callback!\");\n }\n this.activeCommissioningMode = mode;\n if (activeCommissioningEndCallback !== undefined) {\n this.activeCommissioningEndCallback = activeCommissioningEndCallback;\n }\n // MDNS is sent in parallel\n // TODO - untracked promise\n this.sendCommissionableAnnouncement(mode, discriminator).catch(error =>\n logger.warn(\"Error sending announcement\", error),\n );\n }\n\n async sendCommissionableAnnouncement(\n mode: AdministratorCommissioning.CommissioningWindowStatus,\n discriminator?: number,\n ) {\n const commissioningConfig = this.getCommissioningConfig();\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setCommissionMode(\n mode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen ? 2 : 1,\n {\n ...commissioningConfig.productDescription,\n discriminator: discriminator ?? commissioningConfig.discriminator,\n },\n );\n }\n await this.startAnnouncement();\n }\n\n async getNextAvailableSessionId() {\n return this.#sessionManager.getNextAvailableSessionId();\n }\n\n findFabricFromDestinationId(destinationId: ByteArray, peerRandom: ByteArray) {\n return this.#fabricManager.findFabricFromDestinationId(destinationId, peerRandom);\n }\n\n async sendFabricAnnouncements(fabrics: Fabric[], expireCommissioningAnnouncement = false) {\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setFabrics(fabrics, expireCommissioningAnnouncement);\n await broadcaster.announce();\n }\n }\n\n getFabricByIndex(fabricIndex: FabricIndex) {\n return this.#fabricManager.getFabrics().find(fabric => fabric.fabricIndex === fabricIndex);\n }\n\n initiateExchange(fabric: Fabric, nodeId: NodeId, protocolId: number) {\n return this.exchangeManager.initiateExchange(fabric, nodeId, protocolId);\n }\n\n findResumptionRecordById(resumptionId: ByteArray) {\n return this.#sessionManager.findResumptionRecordById(resumptionId);\n }\n\n async saveResumptionRecord(resumptionRecord: ResumptionRecord) {\n return this.#sessionManager.saveResumptionRecord(resumptionRecord);\n }\n\n getFabrics() {\n return this.#fabricManager.getFabrics();\n }\n\n isCommissioned() {\n return !!this.#fabricManager.getFabrics().length;\n }\n\n async allowEnhancedCommissioning(\n discriminator: number,\n paseServer: PaseServer,\n commissioningEndCallback: () => void,\n ) {\n if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.BasicWindowOpen) {\n throw new MatterFlowError(\n \"Basic commissioning window is already open! Can not set Enhanced commissioning mode.\",\n );\n }\n\n this.secureChannelProtocol.setPaseCommissioner(paseServer);\n await this.announceAsCommissionable(\n AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen,\n commissioningEndCallback,\n discriminator,\n );\n }\n\n async allowBasicCommissioning(commissioningEndCallback?: () => void) {\n if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen) {\n throw new MatterFlowError(\n \"Enhanced commissioning window is already open! Can not set Basic commissioning mode.\",\n );\n }\n\n this.secureChannelProtocol.setPaseCommissioner(\n await PaseServer.fromPin(this.getCommissioningConfig().passcode, {\n iterations: 1000,\n salt: Crypto.get().getRandomData(32),\n }),\n );\n\n await this.announceAsCommissionable(\n AdministratorCommissioning.CommissioningWindowStatus.BasicWindowOpen,\n commissioningEndCallback,\n );\n }\n\n async endCommissioning() {\n logger.debug(\"Commissioning mode ended, stop announcements.\");\n // Remove PASE responder when we close enhanced commissioning window or node is commissioned\n if (\n this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen ||\n this.isCommissioned()\n ) {\n this.secureChannelProtocol.removePaseCommissioner();\n }\n this.activeCommissioningMode = AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen;\n this.announceInterval.stop();\n this.announcementStartedTime = null;\n if (this.activeCommissioningEndCallback !== undefined) {\n const activeCommissioningEndCallback = this.activeCommissioningEndCallback;\n this.activeCommissioningEndCallback = undefined;\n activeCommissioningEndCallback();\n }\n for (const broadcaster of this.broadcasters) {\n await broadcaster.expireCommissioningAnnouncement();\n }\n logger.info(\"All announcements expired\");\n }\n\n existsOpenPaseSession() {\n return !!this.#sessionManager.getPaseSession();\n }\n\n async findDevice(\n fabric: Fabric,\n nodeId: NodeId,\n timeOutSeconds = 5,\n ): Promise<undefined | { session: Session<MatterDevice>; channel: Channel<ByteArray> }> {\n // TODO: return the first not undefined answer or undefined\n const device = await this.scanners[0].findOperationalDevice(fabric, nodeId, timeOutSeconds);\n if (device === undefined) return undefined;\n const session = this.#sessionManager.getSessionForNode(fabric, nodeId);\n if (session === undefined) return undefined;\n // TODO: have the interface and scanner linked\n const networkInterface = this.transportInterfaces.find(netInterface => isNetworkInterface(netInterface));\n if (networkInterface === undefined || !isNetworkInterface(networkInterface)) {\n throw new NetworkError(\"No network interface found\");\n } // TODO meeehhh\n return { session, channel: await networkInterface.openChannel(device.addresses[0]) };\n }\n\n async clearSubscriptionsForNode(peerNodeId: NodeId, flushSubscriptions?: boolean) {\n await this.#sessionManager.clearSubscriptionsForNode(peerNodeId, flushSubscriptions);\n }\n\n async close() {\n this.#isClosing = true;\n await this.endCommissioning();\n await this.#announcementMutex;\n for (const broadcaster of this.broadcasters) {\n await broadcaster.close();\n }\n if (this.#failsafeContext) {\n await this.#failsafeContext.close();\n this.#failsafeContext = undefined;\n }\n await this.exchangeManager.close();\n await this.#sessionManager.close();\n await this.channelManager.close();\n for (const transportInterface of this.transportInterfaces) {\n await transportInterface.close();\n }\n }\n\n getActiveSessionInformation() {\n return this.#sessionManager.getActiveSessionInformation();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -7,6 +7,7 @@ import { Mei } from "../../datatype/ManufacturerExtensibleIdentifier.js";
|
|
|
7
7
|
import { ElementTag } from "../definitions/index.js";
|
|
8
8
|
import { AttributeElement } from "../elements/index.js";
|
|
9
9
|
import { PropertyModel } from "./PropertyModel.js";
|
|
10
|
+
export declare const GLOBAL_IDS: Set<number>;
|
|
10
11
|
export declare class AttributeModel extends PropertyModel implements AttributeElement {
|
|
11
12
|
tag: AttributeElement.Tag;
|
|
12
13
|
id: Mei;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttributeModel.d.ts","sourceRoot":"","sources":["../../../../src/model/models/AttributeModel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,oDAAoD,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAW,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"AttributeModel.d.ts","sourceRoot":"","sources":["../../../../src/model/models/AttributeModel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,oDAAoD,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAW,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,eAAO,MAAM,UAAU,aAA4D,CAAC;AAQpF,qBAAa,cAAe,SAAQ,aAAc,YAAW,gBAAgB;IAChE,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAwB;IACjD,EAAE,EAAG,GAAG,CAAC;IAElB,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM;IAI1B,IAAa,iBAAiB,qBAI7B;IAED,IAAI,QAAQ,YAEX;IAED,IAAI,YAAY,YAEf;IAED,IAAI,KAAK,YAER;gBAEW,UAAU,EAAE,gBAAgB,CAAC,UAAU;IAQnD,MAAM,CAAC,GAAG,aAAwB;CACrC"}
|
|
@@ -18,7 +18,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var AttributeModel_exports = {};
|
|
20
20
|
__export(AttributeModel_exports, {
|
|
21
|
-
AttributeModel: () => AttributeModel
|
|
21
|
+
AttributeModel: () => AttributeModel,
|
|
22
|
+
GLOBAL_IDS: () => GLOBAL_IDS
|
|
22
23
|
});
|
|
23
24
|
module.exports = __toCommonJS(AttributeModel_exports);
|
|
24
25
|
var import_definitions = require("../definitions/index.js");
|
|
@@ -30,6 +31,7 @@ var import_PropertyModel = require("./PropertyModel.js");
|
|
|
30
31
|
* Copyright 2022-2024 Matter.js Authors
|
|
31
32
|
* SPDX-License-Identifier: Apache-2.0
|
|
32
33
|
*/
|
|
34
|
+
const GLOBAL_IDS = /* @__PURE__ */ new Set([65533, 65532, 65531, 65530, 65529, 65528]);
|
|
33
35
|
const globalIds = /* @__PURE__ */ new Set();
|
|
34
36
|
for (const element of Object.values(import_elements.Globals)) {
|
|
35
37
|
if (element.tag === import_definitions.ElementTag.Attribute) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/model/models/AttributeModel.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Mei } from \"../../datatype/ManufacturerExtensibleIdentifier.js\";\nimport { ElementTag } from \"../definitions/index.js\";\nimport { AttributeElement, Globals } from \"../elements/index.js\";\nimport { Model } from \"./Model.js\";\nimport { PropertyModel } from \"./PropertyModel.js\";\n\nconst globalIds = new Set<number>();\nfor (const element of Object.values(Globals)) {\n if (element.tag === ElementTag.Attribute) {\n globalIds.add(element.id);\n }\n}\n\nexport class AttributeModel extends PropertyModel implements AttributeElement {\n override tag: AttributeElement.Tag = AttributeElement.Tag;\n override id!: Mei;\n\n static isGlobal(id: number) {\n return globalIds.has(id);\n }\n\n override get isGlobalAttribute() {\n if (AttributeModel.isGlobal(this.id)) {\n return true;\n }\n }\n\n get writable() {\n return !this.fixed && this.effectiveAccess.writable;\n }\n\n get fabricScoped() {\n return !!this.effectiveAccess.fabric;\n }\n\n get fixed() {\n return !!this.effectiveQuality.fixed;\n }\n\n constructor(definition: AttributeElement.Properties) {\n super(definition);\n }\n\n static {\n Model.types[AttributeElement.Tag] = this;\n }\n\n static Tag = AttributeElement.Tag;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,yBAA2B;AAC3B,sBAA0C;AAC1C,mBAAsB;AACtB,2BAA8B;AAV9B;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Mei } from \"../../datatype/ManufacturerExtensibleIdentifier.js\";\nimport { ElementTag } from \"../definitions/index.js\";\nimport { AttributeElement, Globals } from \"../elements/index.js\";\nimport { Model } from \"./Model.js\";\nimport { PropertyModel } from \"./PropertyModel.js\";\n\n// Full set of global IDs per core spec 1.3\nexport const GLOBAL_IDS = new Set([0xfffd, 0xfffc, 0xfffb, 0xfffa, 0xfff9, 0xfff8]);\nconst globalIds = new Set<number>();\nfor (const element of Object.values(Globals)) {\n if (element.tag === ElementTag.Attribute) {\n globalIds.add(element.id);\n }\n}\n\nexport class AttributeModel extends PropertyModel implements AttributeElement {\n override tag: AttributeElement.Tag = AttributeElement.Tag;\n override id!: Mei;\n\n static isGlobal(id: number) {\n return globalIds.has(id);\n }\n\n override get isGlobalAttribute() {\n if (AttributeModel.isGlobal(this.id)) {\n return true;\n }\n }\n\n get writable() {\n return !this.fixed && this.effectiveAccess.writable;\n }\n\n get fabricScoped() {\n return !!this.effectiveAccess.fabric;\n }\n\n get fixed() {\n return !!this.effectiveQuality.fixed;\n }\n\n constructor(definition: AttributeElement.Properties) {\n super(definition);\n }\n\n static {\n Model.types[AttributeElement.Tag] = this;\n }\n\n static Tag = AttributeElement.Tag;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,yBAA2B;AAC3B,sBAA0C;AAC1C,mBAAsB;AACtB,2BAA8B;AAV9B;AAAA;AAAA;AAAA;AAAA;AAaO,MAAM,aAAa,oBAAI,IAAI,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,KAAM,CAAC;AAClF,MAAM,YAAY,oBAAI,IAAY;AAClC,WAAW,WAAW,OAAO,OAAO,uBAAO,GAAG;AAC1C,MAAI,QAAQ,QAAQ,8BAAW,WAAW;AACtC,cAAU,IAAI,QAAQ,EAAE;AAAA,EAC5B;AACJ;AAEO,MAAM,uBAAuB,mCAA0C;AAAA,EA0B1E,YAAY,YAAyC;AACjD,UAAM,UAAU;AA1BpB,SAAS,MAA4B,iCAAiB;AAAA,EA2BtD;AAAA,EAxBA,OAAO,SAAS,IAAY;AACxB,WAAO,UAAU,IAAI,EAAE;AAAA,EAC3B;AAAA,EAEA,IAAa,oBAAoB;AAC7B,QAAI,eAAe,SAAS,KAAK,EAAE,GAAG;AAClC,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,CAAC,KAAK,SAAS,KAAK,gBAAgB;AAAA,EAC/C;AAAA,EAEA,IAAI,eAAe;AACf,WAAO,CAAC,CAAC,KAAK,gBAAgB;AAAA,EAClC;AAAA,EAEA,IAAI,QAAQ;AACR,WAAO,CAAC,CAAC,KAAK,iBAAiB;AAAA,EACnC;AAAA,EAMA,OAAO;AACH,uBAAM,MAAM,iCAAiB,GAAG,IAAI;AAAA,EACxC;AAAA,EAEA;AAAA,SAAO,MAAM,iCAAiB;AAAA;AAClC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionalInteractionServer.d.ts","sourceRoot":"","sources":["../../../../src/node/server/TransactionalInteractionServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAMrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kEAAkE,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionalInteractionServer.d.ts","sourceRoot":"","sources":["../../../../src/node/server/TransactionalInteractionServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAMrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kEAAkE,CAAC;AAEvG,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAIxE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAE9E,OAAO,EAEH,YAAY,EACZ,aAAa,EAChB,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,mDAAmD,CAAC;AACnF,OAAO,EACH,aAAa,EACb,WAAW,EACX,SAAS,EACT,iBAAiB,EACpB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAY9C;;;;;;;;;;;GAWG;AACH,qBAAa,8BAA+B,SAAQ,iBAAiB;;gBASrD,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC;IA8BjD,CAAC,MAAM,CAAC,YAAY,CAAC;IAM3B,gBAAgB;IAID,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,YAAY,CAAC;IAiBpE,IAAI,SAAS,wBASZ;cAEwB,aAAa,CAClC,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAClC,QAAQ,EAAE,eAAe,CAAC,YAAY,CAAC,EACvC,cAAc,EAAE,OAAO,EACvB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,iBAAiB;;;;cAgBN,SAAS,CAC9B,IAAI,EAAE,SAAS,EACf,YAAY,EAAE,cAAc,CAAC,OAAO,cAAc,CAAC,EAAE,GAAG,SAAS,EACjE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAC5B,QAAQ,EAAE,eAAe,CAAC,YAAY,CAAC,EACvC,cAAc,EAAE,OAAO,EACvB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,iBAAiB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;IAsBpB,kBAAkB,CAC7B,QAAQ,EAAE,eAAe,CAAC,YAAY,CAAC,EACvC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,GACjB,OAAO,CAAC,aAAa,CAAC;cAWA,cAAc,CACnC,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,EAC/B,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,eAAe,CAAC,YAAY,CAAC,EACvC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,UAAQ,EACb,WAAW,CAAC,EAAE,OAAO;cA6BA,aAAa,CAClC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAChC,QAAQ,EAAE,eAAe,CAAC,YAAY,CAAC,EACvC,aAAa,EAAE,GAAG,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,UAAQ;;;;;;CAmCpB"}
|
|
@@ -60,6 +60,7 @@ var import_ActionTracer = require("../../behavior/context/ActionTracer.js");
|
|
|
60
60
|
var import_NodeActivity = require("../../behavior/context/NodeActivity.js");
|
|
61
61
|
var import_OnlineContext = require("../../behavior/context/server/OnlineContext.js");
|
|
62
62
|
var import_AccessControlServer = require("../../behavior/definitions/access-control/AccessControlServer.js");
|
|
63
|
+
var import_AccessControlCluster = require("../../cluster/definitions/AccessControlCluster.js");
|
|
63
64
|
var import_MatterError = require("../../common/MatterError.js");
|
|
64
65
|
var import_EndpointServer = require("../../endpoint/EndpointServer.js");
|
|
65
66
|
var import_EndpointLifecycle = require("../../endpoint/properties/EndpointLifecycle.js");
|
|
@@ -76,6 +77,8 @@ var import_ServerStore = require("./storage/ServerStore.js");
|
|
|
76
77
|
* SPDX-License-Identifier: Apache-2.0
|
|
77
78
|
*/
|
|
78
79
|
const activityKey = Symbol("activity");
|
|
80
|
+
const AclClusterId = import_AccessControlCluster.AccessControlCluster.id;
|
|
81
|
+
const AclAttributeId = import_AccessControlCluster.AccessControlCluster.attributes.acl.id;
|
|
79
82
|
class TransactionalInteractionServer extends import_InteractionServer.InteractionServer {
|
|
80
83
|
#endpointStructure;
|
|
81
84
|
#changeListener;
|
|
@@ -83,6 +86,7 @@ class TransactionalInteractionServer extends import_InteractionServer.Interactio
|
|
|
83
86
|
#activity;
|
|
84
87
|
#newActivityBlocked = false;
|
|
85
88
|
#aclServer;
|
|
89
|
+
#aclUpdateIsDelayed = false;
|
|
86
90
|
constructor(endpoint) {
|
|
87
91
|
const structure = new import_InteractionEndpointStructure.InteractionEndpointStructure();
|
|
88
92
|
super({
|
|
@@ -173,13 +177,22 @@ class TransactionalInteractionServer extends import_InteractionServer.Interactio
|
|
|
173
177
|
}).act(readEvent);
|
|
174
178
|
}
|
|
175
179
|
async handleWriteRequest(exchange, writeRequest, message) {
|
|
176
|
-
this.aclServer.aclUpdateDelayed = true;
|
|
177
180
|
const result = await super.handleWriteRequest(exchange, writeRequest, message);
|
|
178
|
-
this
|
|
181
|
+
if (this.#aclUpdateIsDelayed) {
|
|
182
|
+
this.aclServer.aclUpdateDelayed = false;
|
|
183
|
+
this.#aclUpdateIsDelayed = false;
|
|
184
|
+
}
|
|
179
185
|
return result;
|
|
180
186
|
}
|
|
181
187
|
async writeAttribute(path, attribute, value, exchange, message, endpoint, timed = false, isListWrite) {
|
|
182
188
|
const writeAttribute = () => super.writeAttribute(path, attribute, value, exchange, message, endpoint, timed, isListWrite);
|
|
189
|
+
if (path.endpointId === 0 && path.clusterId === AclClusterId && path.attributeId === AclAttributeId) {
|
|
190
|
+
this.aclServer.aclUpdateDelayed = true;
|
|
191
|
+
this.#aclUpdateIsDelayed = true;
|
|
192
|
+
} else if (this.#aclUpdateIsDelayed) {
|
|
193
|
+
this.aclServer.aclUpdateDelayed = false;
|
|
194
|
+
this.#aclUpdateIsDelayed = false;
|
|
195
|
+
}
|
|
183
196
|
return (0, import_OnlineContext.OnlineContext)({
|
|
184
197
|
activity: exchange[activityKey],
|
|
185
198
|
timed,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/node/server/TransactionalInteractionServer.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MatterDevice } from \"../../MatterDevice.js\";\nimport { AccessControl } from \"../../behavior/AccessControl.js\";\nimport { ActionContext } from \"../../behavior/context/ActionContext.js\";\nimport { ActionTracer } from \"../../behavior/context/ActionTracer.js\";\nimport { NodeActivity } from \"../../behavior/context/NodeActivity.js\";\nimport { OnlineContext } from \"../../behavior/context/server/OnlineContext.js\";\nimport { AccessControlServer } from \"../../behavior/definitions/access-control/AccessControlServer.js\";\nimport { AnyAttributeServer, AttributeServer } from \"../../cluster/server/AttributeServer.js\";\nimport { CommandServer } from \"../../cluster/server/CommandServer.js\";\nimport { EventServer } from \"../../cluster/server/EventServer.js\";\nimport { Message } from \"../../codec/MessageCodec.js\";\nimport { InternalError } from \"../../common/MatterError.js\";\nimport { Endpoint } from \"../../endpoint/Endpoint.js\";\nimport { EndpointInterface } from \"../../endpoint/EndpointInterface.js\";\nimport { EndpointServer } from \"../../endpoint/EndpointServer.js\";\nimport { EndpointLifecycle } from \"../../endpoint/properties/EndpointLifecycle.js\";\nimport { Diagnostic } from \"../../log/Diagnostic.js\";\nimport { MessageExchange } from \"../../protocol/MessageExchange.js\";\nimport { AccessDeniedError } from \"../../protocol/interaction/AccessControlManager.js\";\nimport { EventStorageData } from \"../../protocol/interaction/EventHandler.js\";\nimport { InteractionEndpointStructure } from \"../../protocol/interaction/InteractionEndpointStructure.js\";\nimport {\n InteractionServerMessenger,\n WriteRequest,\n WriteResponse,\n} from \"../../protocol/interaction/InteractionMessenger.js\";\nimport { TlvEventFilter } from \"../../protocol/interaction/InteractionProtocol.js\";\nimport {\n AttributePath,\n CommandPath,\n EventPath,\n InteractionServer,\n} from \"../../protocol/interaction/InteractionServer.js\";\nimport { TypeFromSchema } from \"../../tlv/TlvSchema.js\";\nimport { MaybePromise } from \"../../util/Promises.js\";\nimport { ServerNode } from \"../ServerNode.js\";\nimport { ServerStore } from \"./storage/ServerStore.js\";\n\nconst activityKey = Symbol(\"activity\");\n\ninterface WithActivity {\n [activityKey]?: NodeActivity.Activity;\n}\n\n/**\n * Wire up an InteractionServer that initializes an InvocationContext earlier than the cluster API supports.\n *\n * This is necessary for attributes because the ClusterServer attribute APIs are synchronous while transaction\n * management is asynchronous.\n *\n * It's not necessary for command handling because that API is entirely async. We do it here, however, just for the\n * sake of consistency.\n *\n * This could be integrated directly into InteractionServer but this further refactoring is probably warranted there\n * regardless. This keeps the touch light for now.\n */\nexport class TransactionalInteractionServer extends InteractionServer {\n #endpointStructure: InteractionEndpointStructure;\n #changeListener: (type: EndpointLifecycle.Change) => void;\n #endpoint: Endpoint<ServerNode.RootEndpoint>;\n #activity: NodeActivity;\n #newActivityBlocked = false;\n #aclServer?: AccessControlServer;\n\n constructor(endpoint: Endpoint<ServerNode.RootEndpoint>) {\n const structure = new InteractionEndpointStructure();\n\n super({\n eventHandler: endpoint.env.get(ServerStore).eventHandler,\n endpointStructure: structure,\n subscriptionOptions: endpoint.state.network.subscriptionOptions,\n });\n\n this.#activity = endpoint.env.get(NodeActivity);\n\n this.#endpoint = endpoint;\n this.#endpointStructure = structure;\n\n // TODO - rewrite element lookup so we don't need to build the secondary endpoint structure cache\n this.#updateStructure();\n this.#changeListener = type => {\n switch (type) {\n case EndpointLifecycle.Change.TreeReady:\n case EndpointLifecycle.Change.ClientsChanged:\n case EndpointLifecycle.Change.ServersChanged:\n case EndpointLifecycle.Change.Destroyed:\n this.#updateStructure();\n break;\n }\n };\n\n endpoint.lifecycle.changed.on(this.#changeListener);\n }\n\n async [Symbol.asyncDispose]() {\n this.#endpoint.lifecycle.changed.off(this.#changeListener);\n await this.close();\n this.#endpointStructure.close();\n }\n\n blockNewActivity() {\n this.#newActivityBlocked = true;\n }\n\n override async onNewExchange(exchange: MessageExchange<MatterDevice>) {\n // When closing, ignore anything newly incoming\n if (this.#newActivityBlocked || this.isClosing) {\n return;\n }\n\n // Activity tracking. This provides diagnostic information and prevents the server from shutting down whilst\n // the exchange is active\n using activity = this.#activity.begin(`session#${exchange.session.id.toString(16)}`);\n (exchange as WithActivity)[activityKey] = activity;\n\n // Delegate to InteractionServerMessenger\n return new InteractionServerMessenger(exchange)\n .handleRequest(this)\n .finally(() => delete (exchange as WithActivity)[activityKey]);\n }\n\n get aclServer() {\n if (this.#aclServer !== undefined) {\n return this.#aclServer;\n }\n const aclServer = this.#endpoint.act(agent => agent.get(AccessControlServer));\n if (MaybePromise.is(aclServer)) {\n throw new InternalError(\"AccessControlServer should already be initialized.\");\n }\n return (this.#aclServer = aclServer);\n }\n\n protected override async readAttribute(\n path: AttributePath,\n attribute: AnyAttributeServer<any>,\n exchange: MessageExchange<MatterDevice>,\n fabricFiltered: boolean,\n message: Message,\n endpoint: EndpointInterface,\n ) {\n const readAttribute = () => super.readAttribute(path, attribute, exchange, fabricFiltered, message, endpoint);\n\n return OnlineContext({\n activity: (exchange as WithActivity)[activityKey],\n fabricFiltered,\n message,\n session: exchange.session,\n tracer: this.#tracer,\n actionType: ActionTracer.ActionType.Read,\n endpoint,\n root: this.#endpoint,\n }).act(readAttribute);\n }\n\n protected override async readEvent(\n path: EventPath,\n eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,\n event: EventServer<any, any>,\n exchange: MessageExchange<MatterDevice>,\n fabricFiltered: boolean,\n message: Message,\n endpoint: EndpointInterface,\n ): Promise<EventStorageData<any>[]> {\n const readEvent = (context: ActionContext) => {\n if (!context.authorizedFor(event.readAcl, { cluster: path.clusterId } as AccessControl.Location)) {\n throw new AccessDeniedError(\n `Access to ${endpoint.number}/${Diagnostic.hex(path.clusterId)} denied on ${exchange.session.name}.`,\n );\n }\n return super.readEvent(path, eventFilters, event, exchange, fabricFiltered, message, endpoint);\n };\n\n return OnlineContext({\n activity: (exchange as WithActivity)[activityKey],\n fabricFiltered,\n message,\n session: exchange.session,\n tracer: this.#tracer,\n actionType: ActionTracer.ActionType.Read,\n endpoint,\n root: this.#endpoint,\n }).act(readEvent);\n }\n\n override async handleWriteRequest(\n exchange: MessageExchange<MatterDevice>,\n writeRequest: WriteRequest,\n message: Message,\n ): Promise<WriteResponse> {\n // TODO: This is a hack to prevent the ACL from updating while we are in the middle of a write transaction and will\n // be removed again once we somehow handle relevant sub transactions\n this.aclServer.aclUpdateDelayed = true;\n\n const result = await super.handleWriteRequest(exchange, writeRequest, message);\n\n this.aclServer.aclUpdateDelayed = false;\n return result;\n }\n\n protected override async writeAttribute(\n path: AttributePath,\n attribute: AttributeServer<any>,\n value: any,\n exchange: MessageExchange<MatterDevice>,\n message: Message,\n endpoint: EndpointInterface,\n timed = false,\n isListWrite?: boolean,\n ) {\n const writeAttribute = () =>\n super.writeAttribute(path, attribute, value, exchange, message, endpoint, timed, isListWrite);\n\n // TODO add handling for List writes that require sub transactions and remove the delayed ACL update\n return OnlineContext({\n activity: (exchange as WithActivity)[activityKey],\n timed,\n message,\n session: exchange.session,\n fabricFiltered: true,\n tracer: this.#tracer,\n actionType: ActionTracer.ActionType.Write,\n endpoint,\n root: this.#endpoint,\n }).act(writeAttribute);\n }\n\n protected override async invokeCommand(\n path: CommandPath,\n command: CommandServer<any, any>,\n exchange: MessageExchange<MatterDevice>,\n commandFields: any,\n message: Message,\n endpoint: EndpointInterface,\n timed = false,\n ) {\n const invokeCommand = (context: ActionContext) => {\n if (!context.authorizedFor(command.invokeAcl, { cluster: path.clusterId } as AccessControl.Location)) {\n throw new AccessDeniedError(\n `Access to ${endpoint.number}/${Diagnostic.hex(path.clusterId)} denied on ${exchange.session.name}.`,\n );\n }\n return super.invokeCommand(path, command, exchange, commandFields, message, endpoint, timed);\n };\n\n return OnlineContext({\n activity: (exchange as WithActivity)[activityKey],\n command: true,\n timed,\n message,\n session: exchange.session,\n tracer: this.#tracer,\n actionType: ActionTracer.ActionType.Invoke,\n endpoint,\n root: this.#endpoint,\n }).act(invokeCommand);\n }\n\n get #tracer() {\n if (this.#endpoint.env.has(ActionTracer)) {\n return this.#endpoint.env.get(ActionTracer);\n }\n }\n\n #updateStructure() {\n if (this.#endpoint.lifecycle.isTreeReady) {\n this.#endpointStructure.initializeFromEndpoint(EndpointServer.forEndpoint(this.#endpoint));\n }\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,0BAA6B;AAC7B,0BAA6B;AAC7B,2BAA8B;AAC9B,iCAAoC;
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MatterDevice } from \"../../MatterDevice.js\";\nimport { AccessControl } from \"../../behavior/AccessControl.js\";\nimport { ActionContext } from \"../../behavior/context/ActionContext.js\";\nimport { ActionTracer } from \"../../behavior/context/ActionTracer.js\";\nimport { NodeActivity } from \"../../behavior/context/NodeActivity.js\";\nimport { OnlineContext } from \"../../behavior/context/server/OnlineContext.js\";\nimport { AccessControlServer } from \"../../behavior/definitions/access-control/AccessControlServer.js\";\nimport { AccessControlCluster } from \"../../cluster/definitions/AccessControlCluster.js\";\nimport { AnyAttributeServer, AttributeServer } from \"../../cluster/server/AttributeServer.js\";\nimport { CommandServer } from \"../../cluster/server/CommandServer.js\";\nimport { EventServer } from \"../../cluster/server/EventServer.js\";\nimport { Message } from \"../../codec/MessageCodec.js\";\nimport { InternalError } from \"../../common/MatterError.js\";\nimport { Endpoint } from \"../../endpoint/Endpoint.js\";\nimport { EndpointInterface } from \"../../endpoint/EndpointInterface.js\";\nimport { EndpointServer } from \"../../endpoint/EndpointServer.js\";\nimport { EndpointLifecycle } from \"../../endpoint/properties/EndpointLifecycle.js\";\nimport { Diagnostic } from \"../../log/Diagnostic.js\";\nimport { MessageExchange } from \"../../protocol/MessageExchange.js\";\nimport { AccessDeniedError } from \"../../protocol/interaction/AccessControlManager.js\";\nimport { EventStorageData } from \"../../protocol/interaction/EventHandler.js\";\nimport { InteractionEndpointStructure } from \"../../protocol/interaction/InteractionEndpointStructure.js\";\nimport {\n InteractionServerMessenger,\n WriteRequest,\n WriteResponse,\n} from \"../../protocol/interaction/InteractionMessenger.js\";\nimport { TlvEventFilter } from \"../../protocol/interaction/InteractionProtocol.js\";\nimport {\n AttributePath,\n CommandPath,\n EventPath,\n InteractionServer,\n} from \"../../protocol/interaction/InteractionServer.js\";\nimport { TypeFromSchema } from \"../../tlv/TlvSchema.js\";\nimport { MaybePromise } from \"../../util/Promises.js\";\nimport { ServerNode } from \"../ServerNode.js\";\nimport { ServerStore } from \"./storage/ServerStore.js\";\n\nconst activityKey = Symbol(\"activity\");\n\ninterface WithActivity {\n [activityKey]?: NodeActivity.Activity;\n}\n\nconst AclClusterId = AccessControlCluster.id;\nconst AclAttributeId = AccessControlCluster.attributes.acl.id;\n\n/**\n * Wire up an InteractionServer that initializes an InvocationContext earlier than the cluster API supports.\n *\n * This is necessary for attributes because the ClusterServer attribute APIs are synchronous while transaction\n * management is asynchronous.\n *\n * It's not necessary for command handling because that API is entirely async. We do it here, however, just for the\n * sake of consistency.\n *\n * This could be integrated directly into InteractionServer but this further refactoring is probably warranted there\n * regardless. This keeps the touch light for now.\n */\nexport class TransactionalInteractionServer extends InteractionServer {\n #endpointStructure: InteractionEndpointStructure;\n #changeListener: (type: EndpointLifecycle.Change) => void;\n #endpoint: Endpoint<ServerNode.RootEndpoint>;\n #activity: NodeActivity;\n #newActivityBlocked = false;\n #aclServer?: AccessControlServer;\n #aclUpdateIsDelayed = false;\n\n constructor(endpoint: Endpoint<ServerNode.RootEndpoint>) {\n const structure = new InteractionEndpointStructure();\n\n super({\n eventHandler: endpoint.env.get(ServerStore).eventHandler,\n endpointStructure: structure,\n subscriptionOptions: endpoint.state.network.subscriptionOptions,\n });\n\n this.#activity = endpoint.env.get(NodeActivity);\n\n this.#endpoint = endpoint;\n this.#endpointStructure = structure;\n\n // TODO - rewrite element lookup so we don't need to build the secondary endpoint structure cache\n this.#updateStructure();\n this.#changeListener = type => {\n switch (type) {\n case EndpointLifecycle.Change.TreeReady:\n case EndpointLifecycle.Change.ClientsChanged:\n case EndpointLifecycle.Change.ServersChanged:\n case EndpointLifecycle.Change.Destroyed:\n this.#updateStructure();\n break;\n }\n };\n\n endpoint.lifecycle.changed.on(this.#changeListener);\n }\n\n async [Symbol.asyncDispose]() {\n this.#endpoint.lifecycle.changed.off(this.#changeListener);\n await this.close();\n this.#endpointStructure.close();\n }\n\n blockNewActivity() {\n this.#newActivityBlocked = true;\n }\n\n override async onNewExchange(exchange: MessageExchange<MatterDevice>) {\n // When closing, ignore anything newly incoming\n if (this.#newActivityBlocked || this.isClosing) {\n return;\n }\n\n // Activity tracking. This provides diagnostic information and prevents the server from shutting down whilst\n // the exchange is active\n using activity = this.#activity.begin(`session#${exchange.session.id.toString(16)}`);\n (exchange as WithActivity)[activityKey] = activity;\n\n // Delegate to InteractionServerMessenger\n return new InteractionServerMessenger(exchange)\n .handleRequest(this)\n .finally(() => delete (exchange as WithActivity)[activityKey]);\n }\n\n get aclServer() {\n if (this.#aclServer !== undefined) {\n return this.#aclServer;\n }\n const aclServer = this.#endpoint.act(agent => agent.get(AccessControlServer));\n if (MaybePromise.is(aclServer)) {\n throw new InternalError(\"AccessControlServer should already be initialized.\");\n }\n return (this.#aclServer = aclServer);\n }\n\n protected override async readAttribute(\n path: AttributePath,\n attribute: AnyAttributeServer<any>,\n exchange: MessageExchange<MatterDevice>,\n fabricFiltered: boolean,\n message: Message,\n endpoint: EndpointInterface,\n ) {\n const readAttribute = () => super.readAttribute(path, attribute, exchange, fabricFiltered, message, endpoint);\n\n return OnlineContext({\n activity: (exchange as WithActivity)[activityKey],\n fabricFiltered,\n message,\n session: exchange.session,\n tracer: this.#tracer,\n actionType: ActionTracer.ActionType.Read,\n endpoint,\n root: this.#endpoint,\n }).act(readAttribute);\n }\n\n protected override async readEvent(\n path: EventPath,\n eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,\n event: EventServer<any, any>,\n exchange: MessageExchange<MatterDevice>,\n fabricFiltered: boolean,\n message: Message,\n endpoint: EndpointInterface,\n ): Promise<EventStorageData<any>[]> {\n const readEvent = (context: ActionContext) => {\n if (!context.authorizedFor(event.readAcl, { cluster: path.clusterId } as AccessControl.Location)) {\n throw new AccessDeniedError(\n `Access to ${endpoint.number}/${Diagnostic.hex(path.clusterId)} denied on ${exchange.session.name}.`,\n );\n }\n return super.readEvent(path, eventFilters, event, exchange, fabricFiltered, message, endpoint);\n };\n\n return OnlineContext({\n activity: (exchange as WithActivity)[activityKey],\n fabricFiltered,\n message,\n session: exchange.session,\n tracer: this.#tracer,\n actionType: ActionTracer.ActionType.Read,\n endpoint,\n root: this.#endpoint,\n }).act(readEvent);\n }\n\n override async handleWriteRequest(\n exchange: MessageExchange<MatterDevice>,\n writeRequest: WriteRequest,\n message: Message,\n ): Promise<WriteResponse> {\n const result = await super.handleWriteRequest(exchange, writeRequest, message);\n\n // We delayed the ACL update during the write transaction, so we need to update it now that anything is written\n if (this.#aclUpdateIsDelayed) {\n this.aclServer.aclUpdateDelayed = false;\n this.#aclUpdateIsDelayed = false;\n }\n return result;\n }\n\n protected override async writeAttribute(\n path: AttributePath,\n attribute: AttributeServer<any>,\n value: any,\n exchange: MessageExchange<MatterDevice>,\n message: Message,\n endpoint: EndpointInterface,\n timed = false,\n isListWrite?: boolean,\n ) {\n const writeAttribute = () =>\n super.writeAttribute(path, attribute, value, exchange, message, endpoint, timed, isListWrite);\n\n if (path.endpointId === 0 && path.clusterId === AclClusterId && path.attributeId === AclAttributeId) {\n // This is a hack to prevent the ACL from updating while we are in the middle of a write transaction\n // and is needed because Acl should not become effective during writing of the ACL itself.\n this.aclServer.aclUpdateDelayed = true;\n this.#aclUpdateIsDelayed = true;\n } else if (this.#aclUpdateIsDelayed) {\n // Ok it seems that acl was written, but we now write another path, so we can update Acl attribute now\n this.aclServer.aclUpdateDelayed = false;\n this.#aclUpdateIsDelayed = false;\n }\n\n return OnlineContext({\n activity: (exchange as WithActivity)[activityKey],\n timed,\n message,\n session: exchange.session,\n fabricFiltered: true,\n tracer: this.#tracer,\n actionType: ActionTracer.ActionType.Write,\n endpoint,\n root: this.#endpoint,\n }).act(writeAttribute);\n }\n\n protected override async invokeCommand(\n path: CommandPath,\n command: CommandServer<any, any>,\n exchange: MessageExchange<MatterDevice>,\n commandFields: any,\n message: Message,\n endpoint: EndpointInterface,\n timed = false,\n ) {\n const invokeCommand = (context: ActionContext) => {\n if (!context.authorizedFor(command.invokeAcl, { cluster: path.clusterId } as AccessControl.Location)) {\n throw new AccessDeniedError(\n `Access to ${endpoint.number}/${Diagnostic.hex(path.clusterId)} denied on ${exchange.session.name}.`,\n );\n }\n return super.invokeCommand(path, command, exchange, commandFields, message, endpoint, timed);\n };\n\n return OnlineContext({\n activity: (exchange as WithActivity)[activityKey],\n command: true,\n timed,\n message,\n session: exchange.session,\n tracer: this.#tracer,\n actionType: ActionTracer.ActionType.Invoke,\n endpoint,\n root: this.#endpoint,\n }).act(invokeCommand);\n }\n\n get #tracer() {\n if (this.#endpoint.env.has(ActionTracer)) {\n return this.#endpoint.env.get(ActionTracer);\n }\n }\n\n #updateStructure() {\n if (this.#endpoint.lifecycle.isTreeReady) {\n this.#endpointStructure.initializeFromEndpoint(EndpointServer.forEndpoint(this.#endpoint));\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -48,7 +48,7 @@ class ChannelManager {
|
|
|
48
48
|
#findLeastActiveChannel(channels) {
|
|
49
49
|
let oldest = channels[0];
|
|
50
50
|
for (const channel of channels) {
|
|
51
|
-
if (channel.session.
|
|
51
|
+
if (channel.session.timestamp < oldest.session.timestamp) {
|
|
52
52
|
oldest = channel;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/protocol/ChannelManager.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Channel } from \"../common/Channel.js\";\nimport { MatterError } from \"../common/MatterError.js\";\nimport { tryCatchAsync } from \"../common/TryCatchHandler.js\";\nimport { NodeId } from \"../datatype/NodeId.js\";\nimport { Fabric } from \"../fabric/Fabric.js\";\nimport { Logger } from \"../log/Logger.js\";\nimport { SecureSession } from \"../session/SecureSession.js\";\nimport { Session } from \"../session/Session.js\";\nimport { ByteArray } from \"../util/ByteArray.js\";\nimport { MessageChannel } from \"./ExchangeManager.js\";\n\nconst logger = Logger.get(\"ChannelManager\");\n\nexport class NoChannelError extends MatterError {}\n\nexport class ChannelManager {\n readonly #channels = new Map<string, MessageChannel<any>[]>();\n readonly #paseChannels = new Map<Session<any>, MessageChannel<any>>();\n readonly #caseSessionsPerFabricAndNode: number;\n\n // TODO evaluate with controller the effects of limiting the entries just for FabricIndex and not also NodeId\n constructor(caseSessionsPerFabricAndNode = 3) {\n this.#caseSessionsPerFabricAndNode = caseSessionsPerFabricAndNode;\n }\n\n #getChannelKey(fabric: Fabric, nodeId: NodeId) {\n return `${fabric.fabricIndex}/${nodeId}`;\n }\n\n #findLeastActiveChannel(channels: MessageChannel<any>[]) {\n let oldest = channels[0];\n for (const channel of channels) {\n if (channel.session.
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,yBAA4B;AAC5B,6BAA8B;AAG9B,oBAAuB;AAIvB,6BAA+B;AAf/B;AAAA;AAAA;AAAA;AAAA;AAiBA,MAAM,SAAS,qBAAO,IAAI,gBAAgB;AAEnC,MAAM,uBAAuB,+BAAY;AAAC;AAE1C,MAAM,eAAe;AAAA,EACf,YAAY,oBAAI,IAAmC;AAAA,EACnD,gBAAgB,oBAAI,IAAuC;AAAA,EAC3D;AAAA;AAAA,EAGT,YAAY,+BAA+B,GAAG;AAC1C,SAAK,gCAAgC;AAAA,EACzC;AAAA,EAEA,eAAe,QAAgB,QAAgB;AAC3C,WAAO,GAAG,OAAO,WAAW,IAAI,MAAM;AAAA,EAC1C;AAAA,EAEA,wBAAwB,UAAiC;AACrD,QAAI,SAAS,SAAS,CAAC;AACvB,eAAW,WAAW,UAAU;AAC5B,UAAI,QAAQ,QAAQ,
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Channel } from \"../common/Channel.js\";\nimport { MatterError } from \"../common/MatterError.js\";\nimport { tryCatchAsync } from \"../common/TryCatchHandler.js\";\nimport { NodeId } from \"../datatype/NodeId.js\";\nimport { Fabric } from \"../fabric/Fabric.js\";\nimport { Logger } from \"../log/Logger.js\";\nimport { SecureSession } from \"../session/SecureSession.js\";\nimport { Session } from \"../session/Session.js\";\nimport { ByteArray } from \"../util/ByteArray.js\";\nimport { MessageChannel } from \"./ExchangeManager.js\";\n\nconst logger = Logger.get(\"ChannelManager\");\n\nexport class NoChannelError extends MatterError {}\n\nexport class ChannelManager {\n readonly #channels = new Map<string, MessageChannel<any>[]>();\n readonly #paseChannels = new Map<Session<any>, MessageChannel<any>>();\n readonly #caseSessionsPerFabricAndNode: number;\n\n // TODO evaluate with controller the effects of limiting the entries just for FabricIndex and not also NodeId\n constructor(caseSessionsPerFabricAndNode = 3) {\n this.#caseSessionsPerFabricAndNode = caseSessionsPerFabricAndNode;\n }\n\n #getChannelKey(fabric: Fabric, nodeId: NodeId) {\n return `${fabric.fabricIndex}/${nodeId}`;\n }\n\n #findLeastActiveChannel(channels: MessageChannel<any>[]) {\n let oldest = channels[0];\n for (const channel of channels) {\n if (channel.session.timestamp < oldest.session.timestamp) {\n oldest = channel;\n }\n }\n return oldest;\n }\n\n async setChannel(fabric: Fabric, nodeId: NodeId, channel: MessageChannel<any>) {\n const channelsKey = this.#getChannelKey(fabric, nodeId);\n const currentChannels = this.#channels.get(channelsKey) ?? [];\n if (currentChannels.length >= this.#caseSessionsPerFabricAndNode) {\n const oldestChannel = this.#findLeastActiveChannel(currentChannels);\n currentChannels.splice(currentChannels.indexOf(oldestChannel), 1);\n currentChannels.push(channel);\n this.#channels.set(channelsKey, currentChannels);\n\n // Should always be the case\n const { session } = oldestChannel;\n if (session.id !== oldestChannel.session.id) {\n logger.debug(\n `Existing channel for fabricIndex ${fabric.fabricIndex} and node ${nodeId} with session ${session.name} gets replaced. Consider former session already inactive and so close it.`,\n );\n await session.destroy(false, false);\n }\n logger.info(`Close oldest channel for fabric ${fabric.fabricIndex} node ${nodeId}`);\n await oldestChannel.close();\n } else {\n currentChannels.push(channel);\n this.#channels.set(channelsKey, currentChannels);\n }\n }\n\n getChannel(fabric: Fabric, nodeId: NodeId, session?: Session<any>) {\n let results = this.#channels.get(this.#getChannelKey(fabric, nodeId)) ?? [];\n if (session !== undefined) {\n results = results.filter(channel => channel.session.id === session.id);\n }\n if (results.length === 0) throw new NoChannelError(`Can't find a channel to node ${nodeId}`);\n return results[results.length - 1]; // Return the latest added channel\n }\n\n /**\n * Returns the last established session for a Fabric and Node\n */\n getChannelForSession(session: Session<any>) {\n if (session.isSecure && !session.isPase) {\n const secureSession = session as SecureSession<any>;\n const fabric = secureSession.fabric;\n const nodeId = secureSession.peerNodeId;\n if (fabric === undefined) {\n return this.#paseChannels.get(session);\n }\n return this.getChannel(fabric, nodeId, session);\n }\n return this.#paseChannels.get(session);\n }\n\n async removeAllNodeChannels(fabric: Fabric, nodeId: NodeId) {\n const channelsKey = this.#getChannelKey(fabric, nodeId);\n const channelsToRemove = this.#channels.get(channelsKey) ?? [];\n for (const channel of channelsToRemove) {\n await channel.close();\n }\n }\n\n async removeChannel(fabric: Fabric, nodeId: NodeId, session: Session<any>) {\n const channelsKey = this.#getChannelKey(fabric, nodeId);\n const fabricChannels = this.#channels.get(channelsKey) ?? [];\n const channelEntry = fabricChannels.find(({ session: entrySession }) => entrySession.id === session.id);\n await channelEntry?.close();\n }\n\n private getOrCreateAsPaseChannel(byteArrayChannel: Channel<ByteArray>, session: Session<any>) {\n const msgChannel = new MessageChannel(\n byteArrayChannel,\n session,\n async () => void this.#paseChannels.delete(session),\n );\n this.#paseChannels.set(session, msgChannel);\n return msgChannel;\n }\n\n async getOrCreateChannel(byteArrayChannel: Channel<ByteArray>, session: Session<any>) {\n if (!session.isSecure) {\n return this.getOrCreateAsPaseChannel(byteArrayChannel, session);\n }\n const secureSession = session as SecureSession<any>;\n const fabric = secureSession.fabric;\n const nodeId = secureSession.peerNodeId;\n if (fabric === undefined) {\n return this.getOrCreateAsPaseChannel(byteArrayChannel, session);\n }\n\n return tryCatchAsync(\n async () => this.getChannel(fabric, nodeId, session),\n NoChannelError,\n async () => {\n const result = new MessageChannel(byteArrayChannel, session, async () =>\n this.removeChannel(fabric, nodeId, session),\n );\n await this.setChannel(fabric, nodeId, result);\n return result;\n },\n );\n }\n\n async close() {\n for (const channel of this.#paseChannels.values()) {\n await channel.close();\n }\n this.#paseChannels.clear();\n for (const channels of this.#channels.values()) {\n for (const channel of channels) {\n await channel.close();\n }\n }\n this.#channels.clear();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -25,8 +25,12 @@ import { InteractionRecipient, InteractionServerMessenger, InvokeRequest, Invoke
|
|
|
25
25
|
import { TlvAttributePath, TlvClusterPath, TlvEventFilter, TlvEventPath } from "./InteractionProtocol.js";
|
|
26
26
|
import { StatusCode } from "./StatusCode.js";
|
|
27
27
|
import { SubscriptionOptions } from "./SubscriptionOptions.js";
|
|
28
|
+
/** Protocol ID for the Interaction Protocol as per Matter specification. */
|
|
28
29
|
export declare const INTERACTION_PROTOCOL_ID = 1;
|
|
30
|
+
/** Backward compatible re-export for Interaction Model version we support currently. */
|
|
29
31
|
export declare const INTERACTION_MODEL_REVISION = 11;
|
|
32
|
+
/** Number of Invoke Path setting from our Interaction model implementation. */
|
|
33
|
+
export declare const MAX_PATHS_PER_INVOKE = 1;
|
|
30
34
|
export interface CommandPath {
|
|
31
35
|
nodeId?: NodeId;
|
|
32
36
|
endpointId: EndpointNumber;
|
|
@@ -62,6 +66,8 @@ export declare function commandPathToId({ endpointId, clusterId, commandId }: Co
|
|
|
62
66
|
export declare function attributePathToId({ endpointId, clusterId, attributeId }: TypeFromSchema<typeof TlvAttributePath>): string;
|
|
63
67
|
export declare function eventPathToId({ endpointId, clusterId, eventId }: TypeFromSchema<typeof TlvEventPath>): string;
|
|
64
68
|
export declare function clusterPathToId({ nodeId, endpointId, clusterId }: TypeFromSchema<typeof TlvClusterPath>): string;
|
|
69
|
+
export declare function validateReadAttributesPath(path: TypeFromSchema<typeof TlvAttributePath>, isGroupSession?: boolean): void;
|
|
70
|
+
export declare function validateReadEventPath(path: TypeFromSchema<typeof TlvEventPath>, isGroupSession?: boolean): void;
|
|
65
71
|
/**
|
|
66
72
|
* Translates interactions from the Matter protocol to Matter.js APIs.
|
|
67
73
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractionServer.d.ts","sourceRoot":"","sources":["../../../../src/protocol/interaction/InteractionServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EACH,kBAAkB,EAClB,eAAe,EAElB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAe,MAAM,6BAA6B,CAAC;AAKnE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"InteractionServer.d.ts","sourceRoot":"","sources":["../../../../src/protocol/interaction/InteractionServer.ts"],"names":[],"mappings":"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"}
|