@project-chip/matter.js 0.9.2 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/dist/cjs/CommissioningServer.d.ts.map +1 -1
  2. package/dist/cjs/CommissioningServer.js +0 -1
  3. package/dist/cjs/CommissioningServer.js.map +2 -2
  4. package/dist/cjs/MatterDevice.d.ts +3 -0
  5. package/dist/cjs/MatterDevice.d.ts.map +1 -1
  6. package/dist/cjs/MatterDevice.js +21 -7
  7. package/dist/cjs/MatterDevice.js.map +2 -2
  8. package/dist/cjs/behavior/AccessControl.js +2 -2
  9. package/dist/cjs/behavior/AccessControl.js.map +2 -2
  10. package/dist/cjs/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.d.ts +1 -0
  11. package/dist/cjs/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.d.ts.map +1 -1
  12. package/dist/cjs/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.js +14 -0
  13. package/dist/cjs/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.js.map +2 -2
  14. package/dist/cjs/behavior/definitions/operational-credentials/OperationalCredentialsServer.d.ts.map +1 -1
  15. package/dist/cjs/behavior/definitions/operational-credentials/OperationalCredentialsServer.js +11 -2
  16. package/dist/cjs/behavior/definitions/operational-credentials/OperationalCredentialsServer.js.map +2 -2
  17. package/dist/cjs/behavior/state/transaction/Transaction.d.ts +18 -18
  18. package/dist/cjs/certificate/CertificateManager.d.ts.map +1 -1
  19. package/dist/cjs/certificate/CertificateManager.js +1 -0
  20. package/dist/cjs/certificate/CertificateManager.js.map +2 -2
  21. package/dist/cjs/certificate/CertificationDeclarationManager.d.ts +1 -1
  22. package/dist/cjs/certificate/CertificationDeclarationManager.d.ts.map +1 -1
  23. package/dist/cjs/certificate/CertificationDeclarationManager.js +3 -2
  24. package/dist/cjs/certificate/CertificationDeclarationManager.js.map +2 -2
  25. package/dist/cjs/cluster/server/AccessControlServer.js.map +1 -1
  26. package/dist/cjs/cluster/server/AttributeServer.d.ts +9 -0
  27. package/dist/cjs/cluster/server/AttributeServer.d.ts.map +1 -1
  28. package/dist/cjs/cluster/server/AttributeServer.js +62 -0
  29. package/dist/cjs/cluster/server/AttributeServer.js.map +3 -3
  30. package/dist/cjs/cluster/server/ClusterServer.d.ts.map +1 -1
  31. package/dist/cjs/cluster/server/ClusterServer.js +8 -1
  32. package/dist/cjs/cluster/server/ClusterServer.js.map +2 -2
  33. package/dist/cjs/cluster/server/ClusterServerTypes.d.ts +3 -3
  34. package/dist/cjs/cluster/server/ClusterServerTypes.d.ts.map +1 -1
  35. package/dist/cjs/cluster/server/ClusterServerTypes.js.map +1 -1
  36. package/dist/cjs/cluster/server/EventServer.d.ts +8 -2
  37. package/dist/cjs/cluster/server/EventServer.d.ts.map +1 -1
  38. package/dist/cjs/cluster/server/EventServer.js +33 -7
  39. package/dist/cjs/cluster/server/EventServer.js.map +2 -2
  40. package/dist/cjs/cluster/server/OperationalCredentialsServer.d.ts.map +1 -1
  41. package/dist/cjs/cluster/server/OperationalCredentialsServer.js +31 -8
  42. package/dist/cjs/cluster/server/OperationalCredentialsServer.js.map +2 -2
  43. package/dist/cjs/common/FailsafeContext.d.ts +1 -0
  44. package/dist/cjs/common/FailsafeContext.d.ts.map +1 -1
  45. package/dist/cjs/common/FailsafeContext.js +16 -2
  46. package/dist/cjs/common/FailsafeContext.js.map +2 -2
  47. package/dist/cjs/crypto/Crypto.d.ts +1 -1
  48. package/dist/cjs/crypto/Crypto.d.ts.map +1 -1
  49. package/dist/cjs/crypto/Crypto.js +2 -2
  50. package/dist/cjs/crypto/Crypto.js.map +2 -2
  51. package/dist/cjs/device/LegacyInteractionServer.d.ts +2 -2
  52. package/dist/cjs/device/LegacyInteractionServer.d.ts.map +1 -1
  53. package/dist/cjs/device/LegacyInteractionServer.js +13 -1
  54. package/dist/cjs/device/LegacyInteractionServer.js.map +2 -2
  55. package/dist/cjs/fabric/Fabric.d.ts +1 -0
  56. package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
  57. package/dist/cjs/fabric/Fabric.js +5 -0
  58. package/dist/cjs/fabric/Fabric.js.map +2 -2
  59. package/dist/cjs/fabric/FabricManager.d.ts +1 -0
  60. package/dist/cjs/fabric/FabricManager.d.ts.map +1 -1
  61. package/dist/cjs/fabric/FabricManager.js +2 -1
  62. package/dist/cjs/fabric/FabricManager.js.map +2 -2
  63. package/dist/cjs/model/models/EventModel.d.ts +1 -0
  64. package/dist/cjs/model/models/EventModel.d.ts.map +1 -1
  65. package/dist/cjs/model/models/EventModel.js +3 -0
  66. package/dist/cjs/model/models/EventModel.js.map +2 -2
  67. package/dist/cjs/model/models/FieldModel.d.ts +1 -0
  68. package/dist/cjs/model/models/FieldModel.d.ts.map +1 -1
  69. package/dist/cjs/model/models/FieldModel.js +3 -0
  70. package/dist/cjs/model/models/FieldModel.js.map +2 -2
  71. package/dist/cjs/node/server/TransactionalInteractionServer.d.ts +2 -2
  72. package/dist/cjs/node/server/TransactionalInteractionServer.d.ts.map +1 -1
  73. package/dist/cjs/node/server/TransactionalInteractionServer.js +0 -2
  74. package/dist/cjs/node/server/TransactionalInteractionServer.js.map +2 -2
  75. package/dist/cjs/protocol/interaction/AttributeDataEncoder.d.ts +6 -3
  76. package/dist/cjs/protocol/interaction/AttributeDataEncoder.d.ts.map +1 -1
  77. package/dist/cjs/protocol/interaction/AttributeDataEncoder.js +14 -8
  78. package/dist/cjs/protocol/interaction/AttributeDataEncoder.js.map +2 -2
  79. package/dist/cjs/protocol/interaction/EventHandler.d.ts.map +1 -1
  80. package/dist/cjs/protocol/interaction/EventHandler.js +1 -3
  81. package/dist/cjs/protocol/interaction/EventHandler.js.map +2 -2
  82. package/dist/cjs/protocol/interaction/InteractionClient.js +1 -1
  83. package/dist/cjs/protocol/interaction/InteractionClient.js.map +2 -2
  84. package/dist/cjs/protocol/interaction/InteractionEndpointStructure.d.ts +3 -3
  85. package/dist/cjs/protocol/interaction/InteractionEndpointStructure.d.ts.map +1 -1
  86. package/dist/cjs/protocol/interaction/InteractionEndpointStructure.js +1 -0
  87. package/dist/cjs/protocol/interaction/InteractionEndpointStructure.js.map +2 -2
  88. package/dist/cjs/protocol/interaction/InteractionMessenger.d.ts +1 -1
  89. package/dist/cjs/protocol/interaction/InteractionMessenger.d.ts.map +1 -1
  90. package/dist/cjs/protocol/interaction/InteractionMessenger.js +11 -4
  91. package/dist/cjs/protocol/interaction/InteractionMessenger.js.map +2 -2
  92. package/dist/cjs/protocol/interaction/InteractionServer.d.ts +5 -6
  93. package/dist/cjs/protocol/interaction/InteractionServer.d.ts.map +1 -1
  94. package/dist/cjs/protocol/interaction/InteractionServer.js +44 -37
  95. package/dist/cjs/protocol/interaction/InteractionServer.js.map +2 -2
  96. package/dist/cjs/protocol/interaction/SubscriptionHandler.d.ts +31 -12
  97. package/dist/cjs/protocol/interaction/SubscriptionHandler.d.ts.map +1 -1
  98. package/dist/cjs/protocol/interaction/SubscriptionHandler.js +161 -69
  99. package/dist/cjs/protocol/interaction/SubscriptionHandler.js.map +3 -3
  100. package/dist/cjs/session/SecureSession.d.ts.map +1 -1
  101. package/dist/cjs/session/SecureSession.js +2 -1
  102. package/dist/cjs/session/SecureSession.js.map +2 -2
  103. package/dist/cjs/session/SessionManager.d.ts +2 -0
  104. package/dist/cjs/session/SessionManager.d.ts.map +1 -1
  105. package/dist/cjs/session/SessionManager.js +7 -0
  106. package/dist/cjs/session/SessionManager.js.map +2 -2
  107. package/dist/cjs/tlv/TlvArray.d.ts +2 -2
  108. package/dist/cjs/tlv/TlvArray.d.ts.map +1 -1
  109. package/dist/cjs/tlv/TlvArray.js +2 -2
  110. package/dist/cjs/tlv/TlvArray.js.map +2 -2
  111. package/dist/cjs/tlv/TlvNullable.d.ts +2 -2
  112. package/dist/cjs/tlv/TlvNullable.d.ts.map +1 -1
  113. package/dist/cjs/tlv/TlvNullable.js +2 -2
  114. package/dist/cjs/tlv/TlvNullable.js.map +2 -2
  115. package/dist/cjs/tlv/TlvObject.d.ts +2 -2
  116. package/dist/cjs/tlv/TlvObject.d.ts.map +1 -1
  117. package/dist/cjs/tlv/TlvObject.js +18 -12
  118. package/dist/cjs/tlv/TlvObject.js.map +2 -2
  119. package/dist/cjs/tlv/TlvSchema.d.ts +14 -2
  120. package/dist/cjs/tlv/TlvSchema.d.ts.map +1 -1
  121. package/dist/cjs/tlv/TlvSchema.js +2 -2
  122. package/dist/cjs/tlv/TlvSchema.js.map +2 -2
  123. package/dist/cjs/tlv/TlvWrapper.d.ts +2 -2
  124. package/dist/cjs/tlv/TlvWrapper.d.ts.map +1 -1
  125. package/dist/cjs/tlv/TlvWrapper.js +2 -2
  126. package/dist/cjs/tlv/TlvWrapper.js.map +2 -2
  127. package/dist/esm/CommissioningServer.d.ts.map +1 -1
  128. package/dist/esm/CommissioningServer.js +0 -1
  129. package/dist/esm/CommissioningServer.js.map +2 -2
  130. package/dist/esm/MatterDevice.d.ts +3 -0
  131. package/dist/esm/MatterDevice.d.ts.map +1 -1
  132. package/dist/esm/MatterDevice.js +21 -7
  133. package/dist/esm/MatterDevice.js.map +2 -2
  134. package/dist/esm/behavior/AccessControl.js +2 -2
  135. package/dist/esm/behavior/AccessControl.js.map +2 -2
  136. package/dist/esm/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.d.ts +1 -0
  137. package/dist/esm/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.d.ts.map +1 -1
  138. package/dist/esm/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.js +15 -1
  139. package/dist/esm/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.js.map +2 -2
  140. package/dist/esm/behavior/definitions/operational-credentials/OperationalCredentialsServer.d.ts.map +1 -1
  141. package/dist/esm/behavior/definitions/operational-credentials/OperationalCredentialsServer.js +11 -2
  142. package/dist/esm/behavior/definitions/operational-credentials/OperationalCredentialsServer.js.map +2 -2
  143. package/dist/esm/behavior/state/transaction/Transaction.d.ts +18 -18
  144. package/dist/esm/certificate/CertificateManager.d.ts.map +1 -1
  145. package/dist/esm/certificate/CertificateManager.js +1 -0
  146. package/dist/esm/certificate/CertificateManager.js.map +2 -2
  147. package/dist/esm/certificate/CertificationDeclarationManager.d.ts +1 -1
  148. package/dist/esm/certificate/CertificationDeclarationManager.d.ts.map +1 -1
  149. package/dist/esm/certificate/CertificationDeclarationManager.js +3 -2
  150. package/dist/esm/certificate/CertificationDeclarationManager.js.map +2 -2
  151. package/dist/esm/cluster/server/AccessControlServer.js.map +1 -1
  152. package/dist/esm/cluster/server/AttributeServer.d.ts +9 -0
  153. package/dist/esm/cluster/server/AttributeServer.d.ts.map +1 -1
  154. package/dist/esm/cluster/server/AttributeServer.js +69 -1
  155. package/dist/esm/cluster/server/AttributeServer.js.map +2 -2
  156. package/dist/esm/cluster/server/ClusterServer.d.ts.map +1 -1
  157. package/dist/esm/cluster/server/ClusterServer.js +9 -2
  158. package/dist/esm/cluster/server/ClusterServer.js.map +2 -2
  159. package/dist/esm/cluster/server/ClusterServerTypes.d.ts +3 -3
  160. package/dist/esm/cluster/server/ClusterServerTypes.d.ts.map +1 -1
  161. package/dist/esm/cluster/server/ClusterServerTypes.js.map +1 -1
  162. package/dist/esm/cluster/server/EventServer.d.ts +8 -2
  163. package/dist/esm/cluster/server/EventServer.d.ts.map +1 -1
  164. package/dist/esm/cluster/server/EventServer.js +33 -7
  165. package/dist/esm/cluster/server/EventServer.js.map +2 -2
  166. package/dist/esm/cluster/server/OperationalCredentialsServer.d.ts.map +1 -1
  167. package/dist/esm/cluster/server/OperationalCredentialsServer.js +31 -8
  168. package/dist/esm/cluster/server/OperationalCredentialsServer.js.map +2 -2
  169. package/dist/esm/common/FailsafeContext.d.ts +1 -0
  170. package/dist/esm/common/FailsafeContext.d.ts.map +1 -1
  171. package/dist/esm/common/FailsafeContext.js +17 -3
  172. package/dist/esm/common/FailsafeContext.js.map +2 -2
  173. package/dist/esm/crypto/Crypto.d.ts +1 -1
  174. package/dist/esm/crypto/Crypto.d.ts.map +1 -1
  175. package/dist/esm/crypto/Crypto.js +2 -2
  176. package/dist/esm/crypto/Crypto.js.map +2 -2
  177. package/dist/esm/device/LegacyInteractionServer.d.ts +2 -2
  178. package/dist/esm/device/LegacyInteractionServer.d.ts.map +1 -1
  179. package/dist/esm/device/LegacyInteractionServer.js +13 -1
  180. package/dist/esm/device/LegacyInteractionServer.js.map +2 -2
  181. package/dist/esm/fabric/Fabric.d.ts +1 -0
  182. package/dist/esm/fabric/Fabric.d.ts.map +1 -1
  183. package/dist/esm/fabric/Fabric.js +5 -0
  184. package/dist/esm/fabric/Fabric.js.map +2 -2
  185. package/dist/esm/fabric/FabricManager.d.ts +1 -0
  186. package/dist/esm/fabric/FabricManager.d.ts.map +1 -1
  187. package/dist/esm/fabric/FabricManager.js +2 -1
  188. package/dist/esm/fabric/FabricManager.js.map +2 -2
  189. package/dist/esm/model/models/EventModel.d.ts +1 -0
  190. package/dist/esm/model/models/EventModel.d.ts.map +1 -1
  191. package/dist/esm/model/models/EventModel.js +3 -0
  192. package/dist/esm/model/models/EventModel.js.map +2 -2
  193. package/dist/esm/model/models/FieldModel.d.ts +1 -0
  194. package/dist/esm/model/models/FieldModel.d.ts.map +1 -1
  195. package/dist/esm/model/models/FieldModel.js +3 -0
  196. package/dist/esm/model/models/FieldModel.js.map +2 -2
  197. package/dist/esm/node/server/TransactionalInteractionServer.d.ts +2 -2
  198. package/dist/esm/node/server/TransactionalInteractionServer.d.ts.map +1 -1
  199. package/dist/esm/node/server/TransactionalInteractionServer.js +0 -2
  200. package/dist/esm/node/server/TransactionalInteractionServer.js.map +2 -2
  201. package/dist/esm/protocol/interaction/AttributeDataEncoder.d.ts +6 -3
  202. package/dist/esm/protocol/interaction/AttributeDataEncoder.d.ts.map +1 -1
  203. package/dist/esm/protocol/interaction/AttributeDataEncoder.js +14 -8
  204. package/dist/esm/protocol/interaction/AttributeDataEncoder.js.map +2 -2
  205. package/dist/esm/protocol/interaction/EventHandler.d.ts.map +1 -1
  206. package/dist/esm/protocol/interaction/EventHandler.js +1 -3
  207. package/dist/esm/protocol/interaction/EventHandler.js.map +2 -2
  208. package/dist/esm/protocol/interaction/InteractionClient.js +1 -1
  209. package/dist/esm/protocol/interaction/InteractionClient.js.map +2 -2
  210. package/dist/esm/protocol/interaction/InteractionEndpointStructure.d.ts +3 -3
  211. package/dist/esm/protocol/interaction/InteractionEndpointStructure.d.ts.map +1 -1
  212. package/dist/esm/protocol/interaction/InteractionEndpointStructure.js +1 -0
  213. package/dist/esm/protocol/interaction/InteractionEndpointStructure.js.map +2 -2
  214. package/dist/esm/protocol/interaction/InteractionMessenger.d.ts +1 -1
  215. package/dist/esm/protocol/interaction/InteractionMessenger.d.ts.map +1 -1
  216. package/dist/esm/protocol/interaction/InteractionMessenger.js +11 -4
  217. package/dist/esm/protocol/interaction/InteractionMessenger.js.map +2 -2
  218. package/dist/esm/protocol/interaction/InteractionServer.d.ts +5 -6
  219. package/dist/esm/protocol/interaction/InteractionServer.d.ts.map +1 -1
  220. package/dist/esm/protocol/interaction/InteractionServer.js +44 -37
  221. package/dist/esm/protocol/interaction/InteractionServer.js.map +2 -2
  222. package/dist/esm/protocol/interaction/SubscriptionHandler.d.ts +31 -12
  223. package/dist/esm/protocol/interaction/SubscriptionHandler.d.ts.map +1 -1
  224. package/dist/esm/protocol/interaction/SubscriptionHandler.js +161 -69
  225. package/dist/esm/protocol/interaction/SubscriptionHandler.js.map +3 -3
  226. package/dist/esm/session/SecureSession.d.ts.map +1 -1
  227. package/dist/esm/session/SecureSession.js +2 -1
  228. package/dist/esm/session/SecureSession.js.map +2 -2
  229. package/dist/esm/session/SessionManager.d.ts +2 -0
  230. package/dist/esm/session/SessionManager.d.ts.map +1 -1
  231. package/dist/esm/session/SessionManager.js +7 -0
  232. package/dist/esm/session/SessionManager.js.map +2 -2
  233. package/dist/esm/tlv/TlvArray.d.ts +2 -2
  234. package/dist/esm/tlv/TlvArray.d.ts.map +1 -1
  235. package/dist/esm/tlv/TlvArray.js +2 -2
  236. package/dist/esm/tlv/TlvArray.js.map +2 -2
  237. package/dist/esm/tlv/TlvNullable.d.ts +2 -2
  238. package/dist/esm/tlv/TlvNullable.d.ts.map +1 -1
  239. package/dist/esm/tlv/TlvNullable.js +2 -2
  240. package/dist/esm/tlv/TlvNullable.js.map +2 -2
  241. package/dist/esm/tlv/TlvObject.d.ts +2 -2
  242. package/dist/esm/tlv/TlvObject.d.ts.map +1 -1
  243. package/dist/esm/tlv/TlvObject.js +19 -13
  244. package/dist/esm/tlv/TlvObject.js.map +2 -2
  245. package/dist/esm/tlv/TlvSchema.d.ts +14 -2
  246. package/dist/esm/tlv/TlvSchema.d.ts.map +1 -1
  247. package/dist/esm/tlv/TlvSchema.js +2 -2
  248. package/dist/esm/tlv/TlvSchema.js.map +2 -2
  249. package/dist/esm/tlv/TlvWrapper.d.ts +2 -2
  250. package/dist/esm/tlv/TlvWrapper.d.ts.map +1 -1
  251. package/dist/esm/tlv/TlvWrapper.js +2 -2
  252. package/dist/esm/tlv/TlvWrapper.js.map +2 -2
  253. package/package.json +3 -3
  254. package/src/CommissioningServer.ts +0 -1
  255. package/src/MatterDevice.ts +34 -7
  256. package/src/behavior/AccessControl.ts +2 -2
  257. package/src/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.ts +21 -1
  258. package/src/behavior/definitions/operational-credentials/OperationalCredentialsServer.ts +13 -0
  259. package/src/certificate/CertificateManager.ts +1 -2
  260. package/src/certificate/CertificationDeclarationManager.ts +2 -2
  261. package/src/cluster/server/AccessControlServer.ts +3 -3
  262. package/src/cluster/server/AttributeServer.ts +79 -1
  263. package/src/cluster/server/ClusterServer.ts +9 -2
  264. package/src/cluster/server/ClusterServerTypes.ts +3 -3
  265. package/src/cluster/server/EventServer.ts +57 -10
  266. package/src/cluster/server/OperationalCredentialsServer.ts +35 -5
  267. package/src/common/FailsafeContext.ts +19 -7
  268. package/src/crypto/Crypto.ts +1 -1
  269. package/src/device/LegacyInteractionServer.ts +15 -4
  270. package/src/fabric/Fabric.ts +6 -0
  271. package/src/fabric/FabricManager.ts +1 -0
  272. package/src/model/models/EventModel.ts +4 -0
  273. package/src/model/models/FieldModel.ts +4 -0
  274. package/src/node/server/TransactionalInteractionServer.ts +2 -4
  275. package/src/protocol/interaction/AttributeDataEncoder.ts +20 -9
  276. package/src/protocol/interaction/EventHandler.ts +1 -3
  277. package/src/protocol/interaction/InteractionClient.ts +1 -1
  278. package/src/protocol/interaction/InteractionEndpointStructure.ts +4 -4
  279. package/src/protocol/interaction/InteractionMessenger.ts +12 -3
  280. package/src/protocol/interaction/InteractionServer.ts +53 -52
  281. package/src/protocol/interaction/SubscriptionHandler.ts +215 -92
  282. package/src/session/SecureSession.ts +2 -1
  283. package/src/session/SessionManager.ts +9 -0
  284. package/src/tlv/TlvArray.ts +3 -3
  285. package/src/tlv/TlvNullable.ts +3 -3
  286. package/src/tlv/TlvObject.ts +20 -14
  287. package/src/tlv/TlvSchema.ts +17 -3
  288. package/src/tlv/TlvWrapper.ts +3 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tlv/TlvObject.ts"],
4
- "sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { UnexpectedDataError } from \"../common/MatterError.js\";\nimport { tryCatch } from \"../common/TryCatchHandler.js\";\nimport { ValidationError } from \"../common/ValidationError.js\";\nimport { Globals } from \"../model/index.js\";\nimport { Merge } from \"../util/Type.js\";\nimport { TlvAny } from \"./TlvAny.js\";\nimport { LengthConstraints } from \"./TlvArray.js\";\nimport { TlvTag, TlvType, TlvTypeLength } from \"./TlvCodec.js\";\nimport { TlvReader, TlvSchema, TlvWriter } from \"./TlvSchema.js\";\n\nexport interface FieldType<T> {\n id: number;\n schema: TlvSchema<T>;\n optional?: boolean;\n repeated?: boolean;\n fallback?: T;\n}\n\nexport interface RepeatedFieldType<T> extends FieldType<T> {\n repeated: true;\n minLength?: number;\n maxLength?: number;\n}\n\nexport interface OptionalFieldType<T> extends FieldType<T> {\n optional: true;\n}\n\nexport interface OptionalRepeatedFieldType<T> extends OptionalFieldType<T> {\n repeated: true;\n maxLength?: number;\n}\n\nexport type TlvFields = { [field: string]: FieldType<any> };\n\ntype MandatoryFieldNames<F extends TlvFields> = {\n [K in keyof F]: F[K] extends OptionalFieldType<any> ? never : K;\n}[keyof F];\ntype OptionalFieldNames<F extends TlvFields> = {\n [K in keyof F]: F[K] extends OptionalFieldType<any> ? K : never;\n}[keyof F];\ntype TypeFromField<F extends FieldType<any>> = F extends FieldType<infer T> ? T : never;\ntype TypeForMandatoryFields<F extends TlvFields, MF extends keyof F> = { [K in MF]: TypeFromField<F[K]> };\ntype TypeForOptionalFields<F extends TlvFields, MF extends keyof F> = { [K in MF]?: TypeFromField<F[K]> };\nexport type TypeFromFields<F extends TlvFields> = Merge<\n TypeForMandatoryFields<F, MandatoryFieldNames<F>>,\n TypeForOptionalFields<F, OptionalFieldNames<F>>\n>;\n\n/**\n * Schema to encode an object in TLV.\n *\n * @see {@link MatterSpecification.v10.Core} \u00A7 A.5.1 and \u00A7 A.11.4\n */\nexport class ObjectSchema<F extends TlvFields> extends TlvSchema<TypeFromFields<F>> {\n private readonly fieldById = new Array<{ name: string; field: FieldType<any> }>();\n\n constructor(\n private readonly fieldDefinitions: F,\n private readonly type: TlvType.Structure | TlvType.List = TlvType.Structure,\n private readonly allowProtocolSpecificTags = false,\n ) {\n super();\n\n // TODO Add sorting option to enforce order of fields in encoded TLV If Ty is Structure\n // Requirements @see {@link MatterSpecification.Core.v12} \u00A7 A.2.4\n for (const name in this.fieldDefinitions) {\n const field = this.fieldDefinitions[name];\n if (field.repeated && type !== TlvType.List) {\n throw new Error(\"Repeated fields are only allowed in TLV List.\");\n }\n this.fieldById[field.id] = { name, field };\n }\n }\n\n #encodeEntryToTlv(writer: TlvWriter, name: string, value: TypeFromFields<F>, forWriteInteraction?: boolean) {\n const { id, schema, optional: isOptional, repeated: isRepeated } = this.fieldDefinitions[name];\n const fieldValue = (value as any)[name];\n if (fieldValue === undefined) {\n if (!isOptional) {\n if (forWriteInteraction && id === <number>Globals.FabricIndex.id) {\n // FabricIndex field should not be included in encoded data for write interactions\n return;\n }\n throw new ValidationError(`Missing mandatory field ${name}`, name);\n }\n return;\n }\n if (isRepeated) {\n if (!Array.isArray(fieldValue)) {\n throw new ValidationError(`Repeated field ${name} should be an array.`, name);\n }\n for (const element of fieldValue) {\n schema.encodeTlvInternal(writer, element, { id }, forWriteInteraction);\n }\n } else {\n schema.encodeTlvInternal(writer, fieldValue, { id }, forWriteInteraction);\n }\n }\n\n /**\n * Encode the object as Structure, by the order of field definitions.\n */\n #encodeStructure(writer: TlvWriter, value: TypeFromFields<F>, forWriteInteraction?: boolean) {\n for (const name in this.fieldDefinitions) {\n this.#encodeEntryToTlv(writer, name, value, forWriteInteraction);\n }\n }\n\n /**\n * Encode the object as List, by the order of the fields in the object.\n */\n #encodeList(writer: TlvWriter, value: TypeFromFields<F>, forWriteInteraction?: boolean) {\n const encodedFields = new Set<string>();\n // Encode object fields\n for (const name of Object.keys(value)) {\n this.#encodeEntryToTlv(writer, name, value, forWriteInteraction);\n encodedFields.add(name);\n }\n // Verify the potentially missing fields\n for (const name in this.fieldDefinitions) {\n if (encodedFields.has(name)) continue;\n this.#encodeEntryToTlv(writer, name, value, forWriteInteraction);\n }\n }\n\n override encodeTlvInternal(\n writer: TlvWriter,\n value: TypeFromFields<F>,\n tag?: TlvTag,\n forWriteInteraction?: boolean,\n ): void {\n writer.writeTag({ type: this.type }, tag);\n\n if (this.type === TlvType.Structure) {\n // Encode in order of field definitions\n this.#encodeStructure(writer, value, forWriteInteraction);\n } else {\n this.#encodeList(writer, value, forWriteInteraction);\n }\n\n writer.writeTag({ type: TlvType.EndOfContainer });\n }\n\n override decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): TypeFromFields<F> {\n if (typeLength.type !== this.type)\n throw new UnexpectedDataError(`Unexpected type ${typeLength.type} (expected ${this.type}).`);\n const result: any = {};\n while (true) {\n const { tag: { profile, id } = {}, typeLength: elementTypeLength } = reader.readTagType();\n if (elementTypeLength.type === TlvType.EndOfContainer) break;\n if (profile !== undefined && !this.allowProtocolSpecificTags)\n throw new UnexpectedDataError(\"Structure element tags should be context-specific.\");\n if (id === undefined) throw new UnexpectedDataError(\"Structure element tags should have an id.\");\n const fieldName = this.fieldById[id];\n if (fieldName === undefined) {\n // Ignore unknown field by decoding it as raw TLV so we skip forward the proper length.\n TlvAny.decodeTlvInternalValue(reader, elementTypeLength);\n continue;\n }\n const { field, name } = fieldName;\n const decoded = field.schema.decodeTlvInternalValue(reader, elementTypeLength);\n if (field.repeated) {\n if (result[name] === undefined) {\n result[name] = [decoded];\n } else {\n result[name].push(decoded);\n }\n } else {\n result[name] = decoded;\n }\n }\n // Check mandatory fields and, if missing, populate with fallback value if defined.\n for (const name in this.fieldDefinitions) {\n const { optional, fallback, repeated } = this.fieldDefinitions[name];\n if (optional) continue;\n const value = result[name];\n if (value !== undefined) continue;\n if (fallback !== undefined) {\n if (repeated) {\n result[name] = [fallback];\n } else {\n result[name] = fallback;\n }\n }\n }\n return result as TypeFromFields<F>;\n }\n\n override validate(value: TypeFromFields<F>): void {\n for (const name in this.fieldDefinitions) {\n const { optional, schema, repeated: isRepeated } = this.fieldDefinitions[name];\n const data = (value as any)[name];\n if (data === undefined) {\n if (optional) {\n continue;\n }\n throw new ValidationError(`Missing mandatory field ${name}`, name);\n }\n if (isRepeated) {\n const { minLength = 2, maxLength = 65535 } = this.fieldDefinitions[name] as RepeatedFieldType<any>;\n if (!Array.isArray(data)) {\n throw new ValidationError(`Repeated field ${name} should be an array.`, name);\n }\n if (data.length > maxLength)\n throw new ValidationError(\n `Repeated field list for ${name} is too long: ${data.length}, max ${maxLength}.`,\n name,\n );\n if (data.length < minLength)\n throw new ValidationError(\n `Repeated field list for ${name} is too short: ${data.length}, min ${minLength}.`,\n name,\n );\n for (const element of data) {\n tryCatch(\n () => schema.validate(element),\n ValidationError,\n error => {\n error.fieldName = `${name}${error.fieldName !== undefined ? `.${error.fieldName}` : \"\"}`;\n throw error;\n },\n );\n }\n } else {\n tryCatch(\n () => schema.validate(data),\n ValidationError,\n error => {\n error.fieldName = `${name}${error.fieldName !== undefined ? `.${error.fieldName}` : \"\"}`;\n throw error;\n },\n );\n }\n }\n }\n\n override injectField(\n value: TypeFromFields<F>,\n fieldId: number,\n fieldValue: any,\n injectChecker: (fieldValue: any) => boolean,\n ): TypeFromFields<F> {\n for (const k in this.fieldDefinitions) {\n const field = this.fieldDefinitions[k] as FieldType<any>;\n\n if (field.id === fieldId) {\n if (injectChecker((value as any)[k])) {\n field.schema.validate(fieldValue); // Make sure type matches\n (value as any)[k] = fieldValue;\n }\n } else {\n (value as any)[k] = field.schema.injectField((value as any)[k], fieldId, fieldValue, injectChecker);\n }\n }\n return value;\n }\n\n override removeField(\n value: TypeFromFields<F>,\n fieldId: number,\n removeChecker: (fieldValue: any) => boolean,\n ): TypeFromFields<F> {\n for (const k in this.fieldDefinitions) {\n const field = this.fieldDefinitions[k] as FieldType<any>;\n\n if (field.id === fieldId) {\n if ((value as any)[k] !== undefined && removeChecker((value as any)[k])) {\n delete (value as any)[k];\n }\n } else {\n (value as any)[k] = field.schema.removeField((value as any)[k], fieldId, removeChecker);\n }\n }\n return value;\n }\n}\n\n/** Object TLV schema. */\nexport const TlvObject = <F extends TlvFields>(fields: F) => new ObjectSchema(fields, TlvType.Structure);\n\n/**\n * List TLV schema with all tagged entries.\n * List entries that can appear multiple times can be defined using TlvRepeatedField/TlvOptionalRepeatedField and are\n * represented as Arrays.\n * TODO: We represent Tlv Lists right now as named object properties. This formally does not match the spec, which\n * defines a list as a sequence of TLV elements with optional tag where the order matters. That's ok for now\n * (also with the help of \"Repeated Fields\") because it not makes any real difference for now for the current\n * existing data structures. We need to change once this changes.\n */\nexport const TlvTaggedList = <F extends TlvFields>(fields: F, allowProtocolSpecificTags = false) =>\n new ObjectSchema(fields, TlvType.List, allowProtocolSpecificTags);\n\n// TODO Implement a real TlvList schema that matches the spec to represent a ordered list of TLV elements with optional\n// tag.\n\n/**\n * Object TLV mandatory field. Optionally provide a fallback value to initialize the field value when devices omit\n * providing a value against the specifications or in special use cases. Make sure to use a value that is an equivalent\n * to the value being empty.\n */\nexport const TlvField = <T>(id: number, schema: TlvSchema<T>, fallback?: T) =>\n ({ id, schema, fallback, optional: false }) as FieldType<T>;\n\n/** Object TLV optional field. */\nexport const TlvOptionalField = <T>(id: number, schema: TlvSchema<T>) =>\n ({ id, schema, optional: true }) as OptionalFieldType<T>;\n\n/**\n * Object TLV mandatory field that can exist repeated in a TLV List structure. The order is preserved on encoding and\n * decoding.\n */\nexport const TlvRepeatedField = <T>(id: number, schema: TlvSchema<T>, lengthOptions?: LengthConstraints) => {\n const { minLength, maxLength, length } = lengthOptions ?? {};\n return {\n id,\n schema,\n optional: false,\n repeated: true,\n minLength: length ?? minLength,\n maxLength: length ?? maxLength,\n } as RepeatedFieldType<T[]>;\n};\n\n/**\n * Object TLV optional field that can exist repeated in a TLV List structure. The order is preserved on encoding and\n * decoding.\n */\nexport const TlvOptionalRepeatedField = <T>(\n id: number,\n schema: TlvSchema<T>,\n lengthOptions?: { maxLength: number },\n) => {\n const { maxLength } = lengthOptions ?? {};\n return {\n id,\n schema,\n optional: true,\n repeated: true,\n minLength: 0,\n maxLength,\n } as OptionalRepeatedFieldType<T[]>;\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\nimport { InternalError, UnexpectedDataError } from \"../common/MatterError.js\";\nimport { tryCatch } from \"../common/TryCatchHandler.js\";\nimport { ValidationError } from \"../common/ValidationError.js\";\nimport { Globals } from \"../model/index.js\";\nimport { Merge } from \"../util/Type.js\";\nimport { TlvAny } from \"./TlvAny.js\";\nimport { LengthConstraints } from \"./TlvArray.js\";\nimport { TlvTag, TlvType, TlvTypeLength } from \"./TlvCodec.js\";\nimport { TlvEncodingOptions, TlvReader, TlvSchema, TlvWriter } from \"./TlvSchema.js\";\n\nexport interface FieldType<T> {\n id: number;\n schema: TlvSchema<T>;\n optional?: boolean;\n repeated?: boolean;\n fallback?: T;\n}\n\nexport interface RepeatedFieldType<T> extends FieldType<T> {\n repeated: true;\n minLength?: number;\n maxLength?: number;\n}\n\nexport interface OptionalFieldType<T> extends FieldType<T> {\n optional: true;\n}\n\nexport interface OptionalRepeatedFieldType<T> extends OptionalFieldType<T> {\n repeated: true;\n maxLength?: number;\n}\n\nexport type TlvFields = { [field: string]: FieldType<any> };\n\ntype MandatoryFieldNames<F extends TlvFields> = {\n [K in keyof F]: F[K] extends OptionalFieldType<any> ? never : K;\n}[keyof F];\ntype OptionalFieldNames<F extends TlvFields> = {\n [K in keyof F]: F[K] extends OptionalFieldType<any> ? K : never;\n}[keyof F];\ntype TypeFromField<F extends FieldType<any>> = F extends FieldType<infer T> ? T : never;\ntype TypeForMandatoryFields<F extends TlvFields, MF extends keyof F> = { [K in MF]: TypeFromField<F[K]> };\ntype TypeForOptionalFields<F extends TlvFields, MF extends keyof F> = { [K in MF]?: TypeFromField<F[K]> };\nexport type TypeFromFields<F extends TlvFields> = Merge<\n TypeForMandatoryFields<F, MandatoryFieldNames<F>>,\n TypeForOptionalFields<F, OptionalFieldNames<F>>\n>;\n\n/**\n * Schema to encode an object in TLV.\n *\n * @see {@link MatterSpecification.v10.Core} \u00A7 A.5.1 and \u00A7 A.11.4\n */\nexport class ObjectSchema<F extends TlvFields> extends TlvSchema<TypeFromFields<F>> {\n private readonly fieldById = new Array<{ name: string; field: FieldType<any> }>();\n\n constructor(\n private readonly fieldDefinitions: F,\n private readonly type: TlvType.Structure | TlvType.List = TlvType.Structure,\n private readonly allowProtocolSpecificTags = false,\n ) {\n super();\n\n // TODO Add sorting option to enforce order of fields in encoded TLV If Ty is Structure\n // Requirements @see {@link MatterSpecification.Core.v12} \u00A7 A.2.4\n for (const name in this.fieldDefinitions) {\n const field = this.fieldDefinitions[name];\n if (field.repeated && type !== TlvType.List) {\n throw new Error(\"Repeated fields are only allowed in TLV List.\");\n }\n this.fieldById[field.id] = { name, field };\n }\n }\n\n #encodeEntryToTlv(writer: TlvWriter, name: string, value: TypeFromFields<F>, options?: TlvEncodingOptions) {\n const { id, schema, optional: isOptional, repeated: isRepeated } = this.fieldDefinitions[name];\n const { forWriteInteraction = false, allowMissingFieldsForNonFabricFilteredRead = false } = options ?? {};\n if (forWriteInteraction && allowMissingFieldsForNonFabricFilteredRead) {\n throw new InternalError(\n \"Encode options can not indicate a write interaction and a fabric filtered read interaction at the same time.\",\n );\n }\n const fieldValue = (value as any)[name];\n if (fieldValue === undefined) {\n if (!isOptional && !allowMissingFieldsForNonFabricFilteredRead) {\n if (forWriteInteraction && id === <number>Globals.FabricIndex.id) {\n // FabricIndex field should not be included in encoded data for write interactions\n return;\n }\n throw new ValidationError(`Missing mandatory field ${name}`, name);\n }\n return;\n }\n if (isRepeated) {\n if (!Array.isArray(fieldValue)) {\n throw new ValidationError(`Repeated field ${name} should be an array.`, name);\n }\n for (const element of fieldValue) {\n schema.encodeTlvInternal(writer, element, { id }, options);\n }\n } else {\n schema.encodeTlvInternal(writer, fieldValue, { id }, options);\n }\n }\n\n /**\n * Encode the object as Structure, by the order of field definitions.\n */\n #encodeStructure(writer: TlvWriter, value: TypeFromFields<F>, options?: TlvEncodingOptions) {\n for (const name in this.fieldDefinitions) {\n this.#encodeEntryToTlv(writer, name, value, options);\n }\n }\n\n /**\n * Encode the object as List, by the order of the fields in the object.\n */\n #encodeList(writer: TlvWriter, value: TypeFromFields<F>, options?: TlvEncodingOptions) {\n const encodedFields = new Set<string>();\n // Encode object fields\n for (const name of Object.keys(value)) {\n this.#encodeEntryToTlv(writer, name, value, options);\n encodedFields.add(name);\n }\n // Verify the potentially missing fields\n for (const name in this.fieldDefinitions) {\n if (encodedFields.has(name)) continue;\n this.#encodeEntryToTlv(writer, name, value, options);\n }\n }\n\n override encodeTlvInternal(\n writer: TlvWriter,\n value: TypeFromFields<F>,\n tag?: TlvTag,\n options?: TlvEncodingOptions,\n ): void {\n writer.writeTag({ type: this.type }, tag);\n\n if (this.type === TlvType.Structure) {\n // Encode in order of field definitions\n this.#encodeStructure(writer, value, options);\n } else {\n this.#encodeList(writer, value, options);\n }\n\n writer.writeTag({ type: TlvType.EndOfContainer });\n }\n\n override decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): TypeFromFields<F> {\n if (typeLength.type !== this.type)\n throw new UnexpectedDataError(`Unexpected type ${typeLength.type} (expected ${this.type}).`);\n const result: any = {};\n while (true) {\n const { tag: { profile, id } = {}, typeLength: elementTypeLength } = reader.readTagType();\n if (elementTypeLength.type === TlvType.EndOfContainer) break;\n if (profile !== undefined && !this.allowProtocolSpecificTags)\n throw new UnexpectedDataError(\"Structure element tags should be context-specific.\");\n if (id === undefined) throw new UnexpectedDataError(\"Structure element tags should have an id.\");\n const fieldName = this.fieldById[id];\n if (fieldName === undefined) {\n // Ignore unknown field by decoding it as raw TLV so we skip forward the proper length.\n TlvAny.decodeTlvInternalValue(reader, elementTypeLength);\n continue;\n }\n const { field, name } = fieldName;\n const decoded = field.schema.decodeTlvInternalValue(reader, elementTypeLength);\n if (field.repeated) {\n if (result[name] === undefined) {\n result[name] = [decoded];\n } else {\n result[name].push(decoded);\n }\n } else {\n result[name] = decoded;\n }\n }\n // Check mandatory fields and, if missing, populate with fallback value if defined.\n for (const name in this.fieldDefinitions) {\n const { optional, fallback, repeated } = this.fieldDefinitions[name];\n if (optional) continue;\n const value = result[name];\n if (value !== undefined) continue;\n if (fallback !== undefined) {\n if (repeated) {\n result[name] = [fallback];\n } else {\n result[name] = fallback;\n }\n }\n }\n return result as TypeFromFields<F>;\n }\n\n override validate(value: TypeFromFields<F>): void {\n for (const name in this.fieldDefinitions) {\n const { optional, schema, repeated: isRepeated } = this.fieldDefinitions[name];\n const data = (value as any)[name];\n if (data === undefined) {\n if (optional) {\n continue;\n }\n throw new ValidationError(`Missing mandatory field ${name}`, name);\n }\n if (isRepeated) {\n const { minLength = 2, maxLength = 65535 } = this.fieldDefinitions[name] as RepeatedFieldType<any>;\n if (!Array.isArray(data)) {\n throw new ValidationError(`Repeated field ${name} should be an array.`, name);\n }\n if (data.length > maxLength)\n throw new ValidationError(\n `Repeated field list for ${name} is too long: ${data.length}, max ${maxLength}.`,\n name,\n );\n if (data.length < minLength)\n throw new ValidationError(\n `Repeated field list for ${name} is too short: ${data.length}, min ${minLength}.`,\n name,\n );\n for (const element of data) {\n tryCatch(\n () => schema.validate(element),\n ValidationError,\n error => {\n error.fieldName = `${name}${error.fieldName !== undefined ? `.${error.fieldName}` : \"\"}`;\n throw error;\n },\n );\n }\n } else {\n tryCatch(\n () => schema.validate(data),\n ValidationError,\n error => {\n error.fieldName = `${name}${error.fieldName !== undefined ? `.${error.fieldName}` : \"\"}`;\n throw error;\n },\n );\n }\n }\n }\n\n override injectField(\n value: TypeFromFields<F>,\n fieldId: number,\n fieldValue: any,\n injectChecker: (fieldValue: any) => boolean,\n ): TypeFromFields<F> {\n for (const k in this.fieldDefinitions) {\n const field = this.fieldDefinitions[k] as FieldType<any>;\n\n if (field.id === fieldId) {\n if (injectChecker((value as any)[k])) {\n field.schema.validate(fieldValue); // Make sure type matches\n (value as any)[k] = fieldValue;\n }\n } else {\n (value as any)[k] = field.schema.injectField((value as any)[k], fieldId, fieldValue, injectChecker);\n }\n }\n return value;\n }\n\n override removeField(\n value: TypeFromFields<F>,\n fieldId: number,\n removeChecker: (fieldValue: any) => boolean,\n ): TypeFromFields<F> {\n for (const k in this.fieldDefinitions) {\n const field = this.fieldDefinitions[k] as FieldType<any>;\n\n if (field.id === fieldId) {\n if ((value as any)[k] !== undefined && removeChecker((value as any)[k])) {\n delete (value as any)[k];\n }\n } else {\n (value as any)[k] = field.schema.removeField((value as any)[k], fieldId, removeChecker);\n }\n }\n return value;\n }\n}\n\n/** Object TLV schema. */\nexport const TlvObject = <F extends TlvFields>(fields: F) => new ObjectSchema(fields, TlvType.Structure);\n\n/**\n * List TLV schema with all tagged entries.\n * List entries that can appear multiple times can be defined using TlvRepeatedField/TlvOptionalRepeatedField and are\n * represented as Arrays.\n * TODO: We represent Tlv Lists right now as named object properties. This formally does not match the spec, which\n * defines a list as a sequence of TLV elements with optional tag where the order matters. That's ok for now\n * (also with the help of \"Repeated Fields\") because it not makes any real difference for now for the current\n * existing data structures. We need to change once this changes.\n */\nexport const TlvTaggedList = <F extends TlvFields>(fields: F, allowProtocolSpecificTags = false) =>\n new ObjectSchema(fields, TlvType.List, allowProtocolSpecificTags);\n\n// TODO Implement a real TlvList schema that matches the spec to represent a ordered list of TLV elements with optional\n// tag.\n\n/**\n * Object TLV mandatory field. Optionally provide a fallback value to initialize the field value when devices omit\n * providing a value against the specifications or in special use cases. Make sure to use a value that is an equivalent\n * to the value being empty.\n */\nexport const TlvField = <T>(id: number, schema: TlvSchema<T>, fallback?: T) =>\n ({ id, schema, fallback, optional: false }) as FieldType<T>;\n\n/** Object TLV optional field. */\nexport const TlvOptionalField = <T>(id: number, schema: TlvSchema<T>) =>\n ({ id, schema, optional: true }) as OptionalFieldType<T>;\n\n/**\n * Object TLV mandatory field that can exist repeated in a TLV List structure. The order is preserved on encoding and\n * decoding.\n */\nexport const TlvRepeatedField = <T>(id: number, schema: TlvSchema<T>, lengthOptions?: LengthConstraints) => {\n const { minLength, maxLength, length } = lengthOptions ?? {};\n return {\n id,\n schema,\n optional: false,\n repeated: true,\n minLength: length ?? minLength,\n maxLength: length ?? maxLength,\n } as RepeatedFieldType<T[]>;\n};\n\n/**\n * Object TLV optional field that can exist repeated in a TLV List structure. The order is preserved on encoding and\n * decoding.\n */\nexport const TlvOptionalRepeatedField = <T>(\n id: number,\n schema: TlvSchema<T>,\n lengthOptions?: { maxLength: number },\n) => {\n const { maxLength } = lengthOptions ?? {};\n return {\n id,\n schema,\n optional: true,\n repeated: true,\n minLength: 0,\n maxLength,\n } as OptionalRepeatedFieldType<T[]>;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,17 +6,29 @@
6
6
  import { Schema } from "../schema/Schema.js";
7
7
  import { ByteArray } from "../util/ByteArray.js";
8
8
  import { TlvTag, TlvToPrimitive, TlvTypeLength } from "./TlvCodec.js";
9
+ export type TlvEncodingOptions = {
10
+ /**
11
+ * When true, the fabricIndex field will be excluded from the TLV encoding for list entries.
12
+ * This flag must not be set together with the following flag.
13
+ */
14
+ forWriteInteraction?: boolean;
15
+ /**
16
+ * When true, mandatory field validation is skipped when encoding TLV for list entries.
17
+ * This flag must not be set together with the former flag.
18
+ */
19
+ allowMissingFieldsForNonFabricFilteredRead?: boolean;
20
+ };
9
21
  export declare abstract class TlvSchema<T> extends Schema<T, ByteArray> implements TlvSchema<T> {
10
22
  decodeInternal(encoded: ByteArray): T;
11
23
  encodeInternal(value: T): ByteArray;
12
- encodeTlv(value: T, forWriteInteraction?: boolean): TlvStream;
24
+ encodeTlv(value: T, options?: TlvEncodingOptions): TlvStream;
13
25
  decodeTlv(encoded: TlvStream): T;
14
26
  decodeTlvInternal(reader: TlvReader): {
15
27
  value: T;
16
28
  tag?: TlvTag;
17
29
  };
18
30
  abstract decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): T;
19
- abstract encodeTlvInternal(writer: TlvWriter, value: T, tag?: TlvTag, forWriteInteraction?: boolean): void;
31
+ abstract encodeTlvInternal(writer: TlvWriter, value: T, tag?: TlvTag, options?: TlvEncodingOptions): void;
20
32
  injectField(value: T, _fieldId: number, _fieldValue: any, _injectChecker: (fieldValue: any) => boolean): T;
21
33
  removeField(value: T, _fieldId: number, _removeChecker: (fieldValue: any) => boolean): T;
22
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TlvSchema.d.ts","sourceRoot":"","sources":["../../../src/tlv/TlvSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TlvSchema.d.ts","sourceRoot":"","sources":["../../../src/tlv/TlvSchema.ts"],"names":[],"mappings":"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"}
@@ -17,9 +17,9 @@ class TlvSchema extends Schema {
17
17
  this.encodeTlvInternal(writer, value);
18
18
  return writer.toByteArray();
19
19
  }
20
- encodeTlv(value, forWriteInteraction = false) {
20
+ encodeTlv(value, options) {
21
21
  const writer = new TlvArrayWriter();
22
- this.encodeTlvInternal(writer, value, void 0, forWriteInteraction);
22
+ this.encodeTlvInternal(writer, value, void 0, options);
23
23
  return writer.toTlvArray();
24
24
  }
25
25
  decodeTlv(encoded) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tlv/TlvSchema.ts"],
4
- "sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Schema } from \"../schema/Schema.js\";\nimport { ByteArray, Endian } from \"../util/ByteArray.js\";\nimport { DataReader } from \"../util/DataReader.js\";\nimport { DataWriter } from \"../util/DataWriter.js\";\nimport { TlvCodec, TlvTag, TlvToPrimitive, TlvTypeLength } from \"./TlvCodec.js\";\n\nexport abstract class TlvSchema<T> extends Schema<T, ByteArray> implements TlvSchema<T> {\n override decodeInternal(encoded: ByteArray): T {\n return this.decodeTlvInternal(new TlvByteArrayReader(encoded)).value;\n }\n\n override encodeInternal(value: T): ByteArray {\n const writer = new TlvByteArrayWriter();\n this.encodeTlvInternal(writer, value);\n return writer.toByteArray();\n }\n\n encodeTlv(value: T, forWriteInteraction = false): TlvStream {\n const writer = new TlvArrayWriter();\n this.encodeTlvInternal(writer, value, undefined, forWriteInteraction);\n return writer.toTlvArray();\n }\n\n decodeTlv(encoded: TlvStream): T {\n return this.decodeTlvInternal(new TlvArrayReader(encoded)).value;\n }\n\n decodeTlvInternal(reader: TlvReader): { value: T; tag?: TlvTag } {\n const { tag, typeLength } = reader.readTagType();\n return { tag, value: this.decodeTlvInternalValue(reader, typeLength) };\n }\n\n abstract decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): T;\n\n abstract encodeTlvInternal(writer: TlvWriter, value: T, tag?: TlvTag, forWriteInteraction?: boolean): void;\n\n injectField(value: T, _fieldId: number, _fieldValue: any, _injectChecker: (fieldValue: any) => boolean): T {\n return value;\n }\n\n removeField(value: T, _fieldId: number, _removeChecker: (fieldValue: any) => boolean): T {\n return value;\n }\n}\n\nexport type TlvStream = TlvElement<any>[];\n\nexport type TlvElement<T extends TlvTypeLength> = {\n tag?: TlvTag;\n typeLength: T;\n value?: TlvToPrimitive[T[\"type\"]];\n};\n\nexport class TlvArrayWriter implements TlvWriter {\n private readonly tlvArray = new Array<TlvElement<any>>();\n\n writeTag(typeLength: TlvTypeLength, tag?: TlvTag) {\n this.tlvArray.push({ tag, typeLength });\n }\n\n writePrimitive<T extends TlvTypeLength>(_typeLength: T, value: TlvToPrimitive[T[\"type\"]]) {\n this.tlvArray[this.tlvArray.length - 1].value = value;\n }\n\n toTlvArray() {\n return this.tlvArray;\n }\n}\n\nexport class TlvArrayReader implements TlvReader {\n private index = -1;\n\n constructor(private readonly tlvElements: TlvElement<any>[]) {}\n\n readTagType() {\n this.index++;\n return this.tlvElements[this.index];\n }\n\n readPrimitive<T extends TlvTypeLength, V = TlvToPrimitive[T[\"type\"]]>(_typeLength: T): V {\n return this.tlvElements[this.index].value;\n }\n}\n\n/** Type defined by the TLV schema. */\nexport type TypeFromSchema<S extends TlvSchema<any>> = S extends TlvSchema<infer T> ? T : never;\n\nexport interface TlvReader {\n readTagType(): { tag?: TlvTag; typeLength: TlvTypeLength };\n\n readPrimitive<T extends TlvTypeLength, V = TlvToPrimitive[T[\"type\"]]>(typeLength: T): V;\n}\n\nexport interface TlvWriter {\n writeTag(typeLength: TlvTypeLength, tag?: TlvTag): void;\n\n writePrimitive<T extends TlvTypeLength>(typeLength: T, value: TlvToPrimitive[T[\"type\"]]): void;\n}\n\nexport class TlvByteArrayWriter implements TlvWriter {\n private readonly writer = new DataWriter(Endian.Little);\n\n writeTag(typeLength: TlvTypeLength, tag?: TlvTag) {\n TlvCodec.writeTag(this.writer, typeLength, tag);\n }\n\n writePrimitive<T extends TlvTypeLength>(typeLength: T, value: TlvToPrimitive[T[\"type\"]]) {\n TlvCodec.writePrimitive(this.writer, typeLength, value);\n }\n\n toByteArray() {\n return this.writer.toByteArray();\n }\n}\n\nexport class TlvByteArrayReader implements TlvReader {\n private readonly reader: DataReader<Endian.Little>;\n\n constructor(byteArray: ByteArray) {\n this.reader = new DataReader(byteArray, Endian.Little);\n }\n\n readTagType() {\n return TlvCodec.readTagType(this.reader);\n }\n\n readPrimitive<T extends TlvTypeLength, V = TlvToPrimitive[T[\"type\"]]>(typeLength: T): V {\n return TlvCodec.readPrimitive(this.reader, typeLength);\n }\n}\n"],
5
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AACvB,SAAoB,cAAc;AAClC,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,gBAAuD;AAEzD,MAAe,kBAAqB,OAA6C;AAAA,EAC3E,eAAe,SAAuB;AAC3C,WAAO,KAAK,kBAAkB,IAAI,mBAAmB,OAAO,CAAC,EAAE;AAAA,EACnE;AAAA,EAES,eAAe,OAAqB;AACzC,UAAM,SAAS,IAAI,mBAAmB;AACtC,SAAK,kBAAkB,QAAQ,KAAK;AACpC,WAAO,OAAO,YAAY;AAAA,EAC9B;AAAA,EAEA,UAAU,OAAU,sBAAsB,OAAkB;AACxD,UAAM,SAAS,IAAI,eAAe;AAClC,SAAK,kBAAkB,QAAQ,OAAO,QAAW,mBAAmB;AACpE,WAAO,OAAO,WAAW;AAAA,EAC7B;AAAA,EAEA,UAAU,SAAuB;AAC7B,WAAO,KAAK,kBAAkB,IAAI,eAAe,OAAO,CAAC,EAAE;AAAA,EAC/D;AAAA,EAEA,kBAAkB,QAA+C;AAC7D,UAAM,EAAE,KAAK,WAAW,IAAI,OAAO,YAAY;AAC/C,WAAO,EAAE,KAAK,OAAO,KAAK,uBAAuB,QAAQ,UAAU,EAAE;AAAA,EACzE;AAAA,EAMA,YAAY,OAAU,UAAkB,aAAkB,gBAAiD;AACvG,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,OAAU,UAAkB,gBAAiD;AACrF,WAAO;AAAA,EACX;AACJ;AAUO,MAAM,eAAoC;AAAA,EAA1C;AACH,SAAiB,WAAW,IAAI,MAAuB;AAAA;AAAA,EAEvD,SAAS,YAA2B,KAAc;AAC9C,SAAK,SAAS,KAAK,EAAE,KAAK,WAAW,CAAC;AAAA,EAC1C;AAAA,EAEA,eAAwC,aAAgB,OAAkC;AACtF,SAAK,SAAS,KAAK,SAAS,SAAS,CAAC,EAAE,QAAQ;AAAA,EACpD;AAAA,EAEA,aAAa;AACT,WAAO,KAAK;AAAA,EAChB;AACJ;AAEO,MAAM,eAAoC;AAAA,EAG7C,YAA6B,aAAgC;AAAhC;AAF7B,SAAQ,QAAQ;AAAA,EAE8C;AAAA,EAE9D,cAAc;AACV,SAAK;AACL,WAAO,KAAK,YAAY,KAAK,KAAK;AAAA,EACtC;AAAA,EAEA,cAAsE,aAAmB;AACrF,WAAO,KAAK,YAAY,KAAK,KAAK,EAAE;AAAA,EACxC;AACJ;AAiBO,MAAM,mBAAwC;AAAA,EAA9C;AACH,SAAiB,SAAS,IAAI,WAAW,OAAO,MAAM;AAAA;AAAA,EAEtD,SAAS,YAA2B,KAAc;AAC9C,aAAS,SAAS,KAAK,QAAQ,YAAY,GAAG;AAAA,EAClD;AAAA,EAEA,eAAwC,YAAe,OAAkC;AACrF,aAAS,eAAe,KAAK,QAAQ,YAAY,KAAK;AAAA,EAC1D;AAAA,EAEA,cAAc;AACV,WAAO,KAAK,OAAO,YAAY;AAAA,EACnC;AACJ;AAEO,MAAM,mBAAwC;AAAA,EAGjD,YAAY,WAAsB;AAC9B,SAAK,SAAS,IAAI,WAAW,WAAW,OAAO,MAAM;AAAA,EACzD;AAAA,EAEA,cAAc;AACV,WAAO,SAAS,YAAY,KAAK,MAAM;AAAA,EAC3C;AAAA,EAEA,cAAsE,YAAkB;AACpF,WAAO,SAAS,cAAc,KAAK,QAAQ,UAAU;AAAA,EACzD;AACJ;",
4
+ "sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Schema } from \"../schema/Schema.js\";\nimport { ByteArray, Endian } from \"../util/ByteArray.js\";\nimport { DataReader } from \"../util/DataReader.js\";\nimport { DataWriter } from \"../util/DataWriter.js\";\nimport { TlvCodec, TlvTag, TlvToPrimitive, TlvTypeLength } from \"./TlvCodec.js\";\n\nexport type TlvEncodingOptions = {\n /**\n * When true, the fabricIndex field will be excluded from the TLV encoding for list entries.\n * This flag must not be set together with the following flag.\n */\n forWriteInteraction?: boolean;\n\n /**\n * When true, mandatory field validation is skipped when encoding TLV for list entries.\n * This flag must not be set together with the former flag.\n */\n allowMissingFieldsForNonFabricFilteredRead?: boolean;\n};\n\nexport abstract class TlvSchema<T> extends Schema<T, ByteArray> implements TlvSchema<T> {\n override decodeInternal(encoded: ByteArray): T {\n return this.decodeTlvInternal(new TlvByteArrayReader(encoded)).value;\n }\n\n override encodeInternal(value: T): ByteArray {\n const writer = new TlvByteArrayWriter();\n this.encodeTlvInternal(writer, value);\n return writer.toByteArray();\n }\n\n encodeTlv(value: T, options?: TlvEncodingOptions): TlvStream {\n const writer = new TlvArrayWriter();\n this.encodeTlvInternal(writer, value, undefined, options);\n return writer.toTlvArray();\n }\n\n decodeTlv(encoded: TlvStream): T {\n return this.decodeTlvInternal(new TlvArrayReader(encoded)).value;\n }\n\n decodeTlvInternal(reader: TlvReader): { value: T; tag?: TlvTag } {\n const { tag, typeLength } = reader.readTagType();\n return { tag, value: this.decodeTlvInternalValue(reader, typeLength) };\n }\n\n abstract decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): T;\n\n abstract encodeTlvInternal(writer: TlvWriter, value: T, tag?: TlvTag, options?: TlvEncodingOptions): void;\n\n injectField(value: T, _fieldId: number, _fieldValue: any, _injectChecker: (fieldValue: any) => boolean): T {\n return value;\n }\n\n removeField(value: T, _fieldId: number, _removeChecker: (fieldValue: any) => boolean): T {\n return value;\n }\n}\n\nexport type TlvStream = TlvElement<any>[];\n\nexport type TlvElement<T extends TlvTypeLength> = {\n tag?: TlvTag;\n typeLength: T;\n value?: TlvToPrimitive[T[\"type\"]];\n};\n\nexport class TlvArrayWriter implements TlvWriter {\n private readonly tlvArray = new Array<TlvElement<any>>();\n\n writeTag(typeLength: TlvTypeLength, tag?: TlvTag) {\n this.tlvArray.push({ tag, typeLength });\n }\n\n writePrimitive<T extends TlvTypeLength>(_typeLength: T, value: TlvToPrimitive[T[\"type\"]]) {\n this.tlvArray[this.tlvArray.length - 1].value = value;\n }\n\n toTlvArray() {\n return this.tlvArray;\n }\n}\n\nexport class TlvArrayReader implements TlvReader {\n private index = -1;\n\n constructor(private readonly tlvElements: TlvElement<any>[]) {}\n\n readTagType() {\n this.index++;\n return this.tlvElements[this.index];\n }\n\n readPrimitive<T extends TlvTypeLength, V = TlvToPrimitive[T[\"type\"]]>(_typeLength: T): V {\n return this.tlvElements[this.index].value;\n }\n}\n\n/** Type defined by the TLV schema. */\nexport type TypeFromSchema<S extends TlvSchema<any>> = S extends TlvSchema<infer T> ? T : never;\n\nexport interface TlvReader {\n readTagType(): { tag?: TlvTag; typeLength: TlvTypeLength };\n\n readPrimitive<T extends TlvTypeLength, V = TlvToPrimitive[T[\"type\"]]>(typeLength: T): V;\n}\n\nexport interface TlvWriter {\n writeTag(typeLength: TlvTypeLength, tag?: TlvTag): void;\n\n writePrimitive<T extends TlvTypeLength>(typeLength: T, value: TlvToPrimitive[T[\"type\"]]): void;\n}\n\nexport class TlvByteArrayWriter implements TlvWriter {\n private readonly writer = new DataWriter(Endian.Little);\n\n writeTag(typeLength: TlvTypeLength, tag?: TlvTag) {\n TlvCodec.writeTag(this.writer, typeLength, tag);\n }\n\n writePrimitive<T extends TlvTypeLength>(typeLength: T, value: TlvToPrimitive[T[\"type\"]]) {\n TlvCodec.writePrimitive(this.writer, typeLength, value);\n }\n\n toByteArray() {\n return this.writer.toByteArray();\n }\n}\n\nexport class TlvByteArrayReader implements TlvReader {\n private readonly reader: DataReader<Endian.Little>;\n\n constructor(byteArray: ByteArray) {\n this.reader = new DataReader(byteArray, Endian.Little);\n }\n\n readTagType() {\n return TlvCodec.readTagType(this.reader);\n }\n\n readPrimitive<T extends TlvTypeLength, V = TlvToPrimitive[T[\"type\"]]>(typeLength: T): V {\n return TlvCodec.readPrimitive(this.reader, typeLength);\n }\n}\n"],
5
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AACvB,SAAoB,cAAc;AAClC,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,gBAAuD;AAgBzD,MAAe,kBAAqB,OAA6C;AAAA,EAC3E,eAAe,SAAuB;AAC3C,WAAO,KAAK,kBAAkB,IAAI,mBAAmB,OAAO,CAAC,EAAE;AAAA,EACnE;AAAA,EAES,eAAe,OAAqB;AACzC,UAAM,SAAS,IAAI,mBAAmB;AACtC,SAAK,kBAAkB,QAAQ,KAAK;AACpC,WAAO,OAAO,YAAY;AAAA,EAC9B;AAAA,EAEA,UAAU,OAAU,SAAyC;AACzD,UAAM,SAAS,IAAI,eAAe;AAClC,SAAK,kBAAkB,QAAQ,OAAO,QAAW,OAAO;AACxD,WAAO,OAAO,WAAW;AAAA,EAC7B;AAAA,EAEA,UAAU,SAAuB;AAC7B,WAAO,KAAK,kBAAkB,IAAI,eAAe,OAAO,CAAC,EAAE;AAAA,EAC/D;AAAA,EAEA,kBAAkB,QAA+C;AAC7D,UAAM,EAAE,KAAK,WAAW,IAAI,OAAO,YAAY;AAC/C,WAAO,EAAE,KAAK,OAAO,KAAK,uBAAuB,QAAQ,UAAU,EAAE;AAAA,EACzE;AAAA,EAMA,YAAY,OAAU,UAAkB,aAAkB,gBAAiD;AACvG,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,OAAU,UAAkB,gBAAiD;AACrF,WAAO;AAAA,EACX;AACJ;AAUO,MAAM,eAAoC;AAAA,EAA1C;AACH,SAAiB,WAAW,IAAI,MAAuB;AAAA;AAAA,EAEvD,SAAS,YAA2B,KAAc;AAC9C,SAAK,SAAS,KAAK,EAAE,KAAK,WAAW,CAAC;AAAA,EAC1C;AAAA,EAEA,eAAwC,aAAgB,OAAkC;AACtF,SAAK,SAAS,KAAK,SAAS,SAAS,CAAC,EAAE,QAAQ;AAAA,EACpD;AAAA,EAEA,aAAa;AACT,WAAO,KAAK;AAAA,EAChB;AACJ;AAEO,MAAM,eAAoC;AAAA,EAG7C,YAA6B,aAAgC;AAAhC;AAF7B,SAAQ,QAAQ;AAAA,EAE8C;AAAA,EAE9D,cAAc;AACV,SAAK;AACL,WAAO,KAAK,YAAY,KAAK,KAAK;AAAA,EACtC;AAAA,EAEA,cAAsE,aAAmB;AACrF,WAAO,KAAK,YAAY,KAAK,KAAK,EAAE;AAAA,EACxC;AACJ;AAiBO,MAAM,mBAAwC;AAAA,EAA9C;AACH,SAAiB,SAAS,IAAI,WAAW,OAAO,MAAM;AAAA;AAAA,EAEtD,SAAS,YAA2B,KAAc;AAC9C,aAAS,SAAS,KAAK,QAAQ,YAAY,GAAG;AAAA,EAClD;AAAA,EAEA,eAAwC,YAAe,OAAkC;AACrF,aAAS,eAAe,KAAK,QAAQ,YAAY,KAAK;AAAA,EAC1D;AAAA,EAEA,cAAc;AACV,WAAO,KAAK,OAAO,YAAY;AAAA,EACnC;AACJ;AAEO,MAAM,mBAAwC;AAAA,EAGjD,YAAY,WAAsB;AAC9B,SAAK,SAAS,IAAI,WAAW,WAAW,OAAO,MAAM;AAAA,EACzD;AAAA,EAEA,cAAc;AACV,WAAO,SAAS,YAAY,KAAK,MAAM;AAAA,EAC3C;AAAA,EAEA,cAAsE,YAAkB;AACpF,WAAO,SAAS,cAAc,KAAK,QAAQ,UAAU;AAAA,EACzD;AACJ;",
6
6
  "names": []
7
7
  }
@@ -4,14 +4,14 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { TlvTag, TlvTypeLength } from "./TlvCodec.js";
7
- import { TlvReader, TlvSchema, TlvWriter } from "./TlvSchema.js";
7
+ import { TlvEncodingOptions, TlvReader, TlvSchema, TlvWriter } from "./TlvSchema.js";
8
8
  export declare class TlvWrapper<O, T> extends TlvSchema<O> {
9
9
  protected readonly underlyingSchema: TlvSchema<T>;
10
10
  protected readonly wrap: (object: O) => T;
11
11
  private readonly unwrap;
12
12
  constructor(underlyingSchema: TlvSchema<T>, wrap: (object: O) => T, unwrap: (value: T) => O);
13
13
  decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): O;
14
- encodeTlvInternal(writer: TlvWriter, value: O, tag?: TlvTag, forWriteInteraction?: boolean): void;
14
+ encodeTlvInternal(writer: TlvWriter, value: O, tag?: TlvTag, options?: TlvEncodingOptions): void;
15
15
  validate(value: O): void;
16
16
  }
17
17
  //# sourceMappingURL=TlvWrapper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TlvWrapper.d.ts","sourceRoot":"","sources":["../../../src/tlv/TlvWrapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEjE,qBAAa,UAAU,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAE1C,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC;IACjD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFJ,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,EAC9B,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EACxB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;IAKnC,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,GAAG,CAAC;IAIvE,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,OAAO,GAAG,IAAI;IAIjG,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;CAGpC"}
1
+ {"version":3,"file":"TlvWrapper.d.ts","sourceRoot":"","sources":["../../../src/tlv/TlvWrapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAErF,qBAAa,UAAU,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAE1C,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC;IACjD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFJ,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,EAC9B,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EACxB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;IAKnC,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,GAAG,CAAC;IAIvE,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAIhG,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;CAGpC"}
@@ -14,8 +14,8 @@ class TlvWrapper extends TlvSchema {
14
14
  decodeTlvInternalValue(reader, typeLength) {
15
15
  return this.unwrap(this.underlyingSchema.decodeTlvInternalValue(reader, typeLength));
16
16
  }
17
- encodeTlvInternal(writer, value, tag, forWriteInteraction) {
18
- this.underlyingSchema.encodeTlvInternal(writer, this.wrap(value), tag, forWriteInteraction);
17
+ encodeTlvInternal(writer, value, tag, options) {
18
+ this.underlyingSchema.encodeTlvInternal(writer, this.wrap(value), tag, options);
19
19
  }
20
20
  validate(value) {
21
21
  this.underlyingSchema.validate(this.wrap(value));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tlv/TlvWrapper.ts"],
4
- "sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { TlvTag, TlvTypeLength } from \"./TlvCodec.js\";\nimport { TlvReader, TlvSchema, TlvWriter } from \"./TlvSchema.js\";\n\nexport class TlvWrapper<O, T> extends TlvSchema<O> {\n constructor(\n protected readonly underlyingSchema: TlvSchema<T>,\n protected readonly wrap: (object: O) => T,\n private readonly unwrap: (value: T) => O,\n ) {\n super();\n }\n\n override decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): O {\n return this.unwrap(this.underlyingSchema.decodeTlvInternalValue(reader, typeLength));\n }\n\n override encodeTlvInternal(writer: TlvWriter, value: O, tag?: TlvTag, forWriteInteraction?: boolean): void {\n this.underlyingSchema.encodeTlvInternal(writer, this.wrap(value), tag, forWriteInteraction);\n }\n\n override validate(value: O): void {\n this.underlyingSchema.validate(this.wrap(value));\n }\n}\n"],
5
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAoB,iBAA4B;AAEzC,MAAM,mBAAyB,UAAa;AAAA,EAC/C,YACuB,kBACA,MACF,QACnB;AACE,UAAM;AAJa;AACA;AACF;AAAA,EAGrB;AAAA,EAES,uBAAuB,QAAmB,YAA8B;AAC7E,WAAO,KAAK,OAAO,KAAK,iBAAiB,uBAAuB,QAAQ,UAAU,CAAC;AAAA,EACvF;AAAA,EAES,kBAAkB,QAAmB,OAAU,KAAc,qBAAqC;AACvG,SAAK,iBAAiB,kBAAkB,QAAQ,KAAK,KAAK,KAAK,GAAG,KAAK,mBAAmB;AAAA,EAC9F;AAAA,EAES,SAAS,OAAgB;AAC9B,SAAK,iBAAiB,SAAS,KAAK,KAAK,KAAK,CAAC;AAAA,EACnD;AACJ;",
4
+ "sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { TlvTag, TlvTypeLength } from \"./TlvCodec.js\";\nimport { TlvEncodingOptions, TlvReader, TlvSchema, TlvWriter } from \"./TlvSchema.js\";\n\nexport class TlvWrapper<O, T> extends TlvSchema<O> {\n constructor(\n protected readonly underlyingSchema: TlvSchema<T>,\n protected readonly wrap: (object: O) => T,\n private readonly unwrap: (value: T) => O,\n ) {\n super();\n }\n\n override decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): O {\n return this.unwrap(this.underlyingSchema.decodeTlvInternalValue(reader, typeLength));\n }\n\n override encodeTlvInternal(writer: TlvWriter, value: O, tag?: TlvTag, options?: TlvEncodingOptions): void {\n this.underlyingSchema.encodeTlvInternal(writer, this.wrap(value), tag, options);\n }\n\n override validate(value: O): void {\n this.underlyingSchema.validate(this.wrap(value));\n }\n}\n"],
5
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAwC,iBAA4B;AAE7D,MAAM,mBAAyB,UAAa;AAAA,EAC/C,YACuB,kBACA,MACF,QACnB;AACE,UAAM;AAJa;AACA;AACF;AAAA,EAGrB;AAAA,EAES,uBAAuB,QAAmB,YAA8B;AAC7E,WAAO,KAAK,OAAO,KAAK,iBAAiB,uBAAuB,QAAQ,UAAU,CAAC;AAAA,EACvF;AAAA,EAES,kBAAkB,QAAmB,OAAU,KAAc,SAAoC;AACtG,SAAK,iBAAiB,kBAAkB,QAAQ,KAAK,KAAK,KAAK,GAAG,KAAK,OAAO;AAAA,EAClF;AAAA,EAES,SAAS,OAAgB;AAC9B,SAAK,iBAAiB,SAAS,KAAK,KAAK,KAAK,CAAC;AAAA,EACnD;AACJ;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@project-chip/matter.js",
3
- "version": "0.9.2",
3
+ "version": "0.9.4",
4
4
  "description": "Matter protocol in pure js",
5
5
  "keywords": [
6
6
  "iot",
@@ -36,7 +36,7 @@
36
36
  "@noble/curves": "^1.4.0"
37
37
  },
38
38
  "devDependencies": {
39
- "@project-chip/matter.js-tools": "0.9.2",
39
+ "@project-chip/matter.js-tools": "0.9.4",
40
40
  "@types/chai": "^4.3.12",
41
41
  "@types/mocha": "^10.0.6",
42
42
  "@types/wtfnode": "^0.7.3",
@@ -169,5 +169,5 @@
169
169
  "publishConfig": {
170
170
  "access": "public"
171
171
  },
172
- "gitHead": "d638f16736899f69cc752581454960c9dc1904d2"
172
+ "gitHead": "eb59507fb8188184dd65c593b093e8d21b813ce7"
173
173
  }
@@ -549,7 +549,6 @@ export class CommissioningServer extends MatterNode {
549
549
 
550
550
  this.interactionServer = new LegacyInteractionServer({
551
551
  endpointStructure: this.endpointStructure,
552
- eventHandler: this.eventHandler,
553
552
  subscriptionOptions: {
554
553
  maxIntervalSeconds: this.options.subscriptionMaxIntervalSeconds,
555
554
  minIntervalSeconds: this.options.subscriptionMinIntervalSeconds,
@@ -56,6 +56,7 @@ export class MatterDevice {
56
56
  private readonly channelManager: ChannelManager;
57
57
  private readonly secureChannelProtocol = new SecureChannelProtocol(() => this.endCommissioning());
58
58
  private activeCommissioningMode = AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen;
59
+ private activeCommissioningDiscriminator?: number;
59
60
  private activeCommissioningEndCallback?: () => void;
60
61
  private announceInterval: Timer;
61
62
  private announcementStartedTime: number | null = null;
@@ -115,6 +116,8 @@ export class MatterDevice {
115
116
  // Last fabric got removed, so expire all announcements
116
117
  await this.expireAllFabricAnnouncements();
117
118
  }
119
+ // If a commissioning window is open then we reannounce this because it was ended as fabric got added
120
+ this.reAnnounceAsCommissionable();
118
121
  });
119
122
  this.#fabricManager.events.updated.on(({ fabricIndex }) =>
120
123
  this.commissioningChangedCallback(fabricIndex, FabricAction.Updated),
@@ -143,18 +146,25 @@ export class MatterDevice {
143
146
  // Delayed closing is executed when exchange is closed
144
147
  await this.exchangeManager.closeSession(session);
145
148
  }
146
- const currentFabric = session.fabric;
147
- if (currentFabric !== undefined) {
148
- this.sessionChangedCallback(currentFabric.fabricIndex);
149
+
150
+ const currentFabricIndex = session.fabric?.fabricIndex;
151
+ if (currentFabricIndex !== undefined) {
152
+ this.sessionChangedCallback(currentFabricIndex);
149
153
  }
154
+
150
155
  if (this.isClosing) {
151
156
  return;
152
157
  }
158
+
159
+ // Verify if the session associated fabric still exists
160
+ const existingSessionFabric =
161
+ currentFabricIndex === undefined ? undefined : this.getFabricByIndex(currentFabricIndex)?.fabricIndex;
162
+
153
163
  // When a session closes, announce existing fabrics again so that controller can detect the device again.
154
164
  // When session was closed and no fabric exist anymore then this is triggering a factory reset in upper layer
155
165
  // and it would be not good to announce a commissionable device and then reset that again with the factory reset
156
- if (this.#fabricManager.getFabrics().length > 0 || !currentFabric) {
157
- await this.startAnnouncement();
166
+ if (this.#fabricManager.getFabrics().length > 0 || session.isPase || !existingSessionFabric) {
167
+ this.startAnnouncement().catch(error => logger.warn(`Error while announcing`, error));
158
168
  }
159
169
  });
160
170
 
@@ -293,7 +303,7 @@ export class MatterDevice {
293
303
 
294
304
  async expireAllFabricAnnouncements() {
295
305
  for (const broadcaster of this.broadcasters) {
296
- await broadcaster.expireAllAnnouncements();
306
+ await broadcaster.expireFabricAnnouncement();
297
307
  }
298
308
  }
299
309
 
@@ -328,7 +338,10 @@ export class MatterDevice {
328
338
  }
329
339
  for (const broadcaster of this.broadcasters) {
330
340
  await broadcaster.setFabrics(fabrics);
331
- if (fabricsWithoutSessions > 0) {
341
+ if (
342
+ fabricsWithoutSessions > 0 ||
343
+ this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen
344
+ ) {
332
345
  await broadcaster.announce();
333
346
  }
334
347
  }
@@ -354,6 +367,7 @@ export class MatterDevice {
354
367
  throw new InternalError("Commissioning window already open with different callback!");
355
368
  }
356
369
  this.activeCommissioningMode = mode;
370
+ this.activeCommissioningDiscriminator = discriminator;
357
371
  if (activeCommissioningEndCallback !== undefined) {
358
372
  this.activeCommissioningEndCallback = activeCommissioningEndCallback;
359
373
  }
@@ -364,6 +378,15 @@ export class MatterDevice {
364
378
  );
365
379
  }
366
380
 
381
+ reAnnounceAsCommissionable() {
382
+ if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {
383
+ return;
384
+ }
385
+ this.sendCommissionableAnnouncement(this.activeCommissioningMode, this.activeCommissioningDiscriminator).catch(
386
+ error => logger.warn("Error sending announcement", error),
387
+ );
388
+ }
389
+
367
390
  async sendCommissionableAnnouncement(
368
391
  mode: AdministratorCommissioning.CommissioningWindowStatus,
369
392
  discriminator?: number,
@@ -504,6 +527,10 @@ export class MatterDevice {
504
527
  return { session, channel: await networkInterface.openChannel(device.addresses[0]) };
505
528
  }
506
529
 
530
+ async clearSubscriptionsForNode(fabricIndex: FabricIndex, peerNodeId: NodeId, flushSubscriptions?: boolean) {
531
+ await this.#sessionManager.clearSubscriptionsForNode(fabricIndex, peerNodeId, flushSubscriptions);
532
+ }
533
+
507
534
  async close() {
508
535
  this.#isClosing = true;
509
536
  await this.endCommissioning();
@@ -271,7 +271,7 @@ function dataEnforcerFor(schema: Schema): AccessControl {
271
271
  }
272
272
 
273
273
  if (location?.owningFabric && location.owningFabric !== session.fabric) {
274
- throw new WriteError(
274
+ throw new ReadError(
275
275
  location,
276
276
  "Permission denied: Owning/accessing fabric mismatch",
277
277
  StatusCode.UnsupportedAccess,
@@ -291,7 +291,7 @@ function dataEnforcerFor(schema: Schema): AccessControl {
291
291
  return false;
292
292
  }
293
293
 
294
- if (session.fabricFiltered && location?.owningFabric && location.owningFabric !== session.fabric) {
294
+ if (location?.owningFabric && location.owningFabric !== session.fabric) {
295
295
  return false;
296
296
  }
297
297
 
@@ -5,9 +5,10 @@
5
5
  */
6
6
 
7
7
  import { FailsafeContext } from "../../../common/FailsafeContext.js";
8
- import { Lifecycle } from "../../../common/Lifecycle.js";
8
+ import { Lifecycle, UnsupportedDependencyError } from "../../../common/Lifecycle.js";
9
9
  import { Endpoint } from "../../../endpoint/Endpoint.js";
10
10
  import { Fabric } from "../../../fabric/Fabric.js";
11
+ import { FabricManager } from "../../../fabric/FabricManager.js";
11
12
  import { Node } from "../../../node/Node.js";
12
13
  import { Immutable } from "../../../util/Type.js";
13
14
  import { NetworkCommissioningBehavior } from "../network-commissioning/NetworkCommissioningBehavior.js";
@@ -101,6 +102,25 @@ export class ServerNodeFailsafeContext extends FailsafeContext {
101
102
  });
102
103
  }
103
104
 
105
+ override async rollback() {
106
+ if (!this.fabricIndex && this.hasRootCert) {
107
+ // Update the fabric details if needed (like Trusted Root certificates)
108
+ // Only if fabric was not added because else all data gets updated anyway
109
+ try {
110
+ const fabricManager = this.#node.env.get(FabricManager);
111
+ fabricManager.events.failsafeClosed.emit();
112
+ } catch (error) {
113
+ // UnsupportedDependencyError can happen when the node closes.
114
+ // Then data are refreshed on next start anyway, so ignore this case
115
+ if (!(error instanceof UnsupportedDependencyError)) {
116
+ throw error;
117
+ }
118
+ }
119
+ }
120
+
121
+ return super.rollback();
122
+ }
123
+
104
124
  /*
105
125
  override async restoreFabric() {
106
126
  await super.restoreFabric();
@@ -12,6 +12,7 @@ import { MatterFabricInvalidAdminSubjectError } from "../../../common/FailsafeCo
12
12
  import { MatterFabricConflictError } from "../../../common/FailsafeTimer.js";
13
13
  import { MatterFlowError, UnexpectedDataError } from "../../../common/MatterError.js";
14
14
  import { ValidationError } from "../../../common/ValidationError.js";
15
+ import { CryptoVerifyError } from "../../../crypto/Crypto.js";
15
16
  import { FabricIndex } from "../../../datatype/FabricIndex.js";
16
17
  import { Endpoint } from "../../../endpoint/Endpoint.js";
17
18
  import { Fabric, PublicKeyError } from "../../../fabric/Fabric.js";
@@ -169,6 +170,7 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
169
170
  debugText: error.message,
170
171
  };
171
172
  } else if (
173
+ error instanceof CryptoVerifyError ||
172
174
  error instanceof CertificateError ||
173
175
  error instanceof ValidationError ||
174
176
  error instanceof UnexpectedDataError
@@ -411,6 +413,7 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
411
413
  } catch (error) {
412
414
  logger.info("setting root certificate failed", error);
413
415
  if (
416
+ error instanceof CryptoVerifyError ||
414
417
  error instanceof CertificateError ||
415
418
  error instanceof ValidationError ||
416
419
  error instanceof UnexpectedDataError
@@ -419,6 +422,11 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
419
422
  }
420
423
  throw error;
421
424
  }
425
+
426
+ const fabrics = this.endpoint.env.get(FabricManager).getFabrics();
427
+ const trustedRootCertificates = fabrics.map(fabric => fabric.rootCert);
428
+ trustedRootCertificates.push(rootCaCertificate);
429
+ this.state.trustedRootCertificates = trustedRootCertificates;
422
430
  }
423
431
 
424
432
  async #updateFabrics() {
@@ -474,11 +482,16 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
474
482
  this.agent.get(CommissioningBehavior).handleFabricChange(fabricIndex, FabricAction.Removed);
475
483
  }
476
484
 
485
+ async #handleFailsafeClosed() {
486
+ await this.#updateFabrics();
487
+ }
488
+
477
489
  async #nodeOnline() {
478
490
  const fabricManager = this.endpoint.env.get(FabricManager);
479
491
  this.reactTo(fabricManager.events.added, this.#handleAddedFabric);
480
492
  this.reactTo(fabricManager.events.updated, this.#handleUpdatedFabric);
481
493
  this.reactTo(fabricManager.events.deleted, this.#handleRemovedFabric);
494
+ this.reactTo(fabricManager.events.failsafeClosed, this.#handleFailsafeClosed, { lock: true });
482
495
  await this.#updateFabrics();
483
496
  }
484
497
  }
@@ -800,8 +800,7 @@ export class CertificateManager {
800
800
  );
801
801
  }
802
802
 
803
- // Root cert is self signed anyway, so we do not need to verify it with itself
804
- //Crypto.verify(PublicKey(rootCert.ellipticCurvePublicKey), this.rootCertToAsn1(rootCert), rootCert.signature);
803
+ Crypto.verify(PublicKey(rootCert.ellipticCurvePublicKey), this.rootCertToAsn1(rootCert), rootCert.signature);
805
804
  }
806
805
 
807
806
  /**
@@ -31,7 +31,7 @@ const TestCMS_SignerPrivateKey = ByteArray.fromHex("AEF3484116E9481EC57BE0472DF4
31
31
  const TestCMS_SignerSubjectKeyIdentifier = ByteArray.fromHex("62FA823359ACFAA9963E1CFA140ADDF504F37160");
32
32
 
33
33
  export class CertificationDeclarationManager {
34
- static generate(vendorId: VendorId, productId: number) {
34
+ static generate(vendorId: VendorId, productId: number, provisional = false) {
35
35
  const certificationElements = TlvCertificationDeclaration.encode({
36
36
  formatVersion: 1,
37
37
  vendorId,
@@ -41,7 +41,7 @@ export class CertificationDeclarationManager {
41
41
  securityLevel: 0,
42
42
  securityInformation: 0,
43
43
  versionNumber: 1,
44
- certificationType: 0,
44
+ certificationType: provisional ? 1 : 0, // 0 = Test, 1 = Provisional/In certification, 2 = official
45
45
  });
46
46
 
47
47
  return CertificateManager.CertificationDeclarationToAsn1(
@@ -28,16 +28,16 @@ import {
28
28
  } from "./AttributeServer.js";
29
29
  import { ClusterServer } from "./ClusterServer.js";
30
30
  import { ClusterServerHandlers } from "./ClusterServerTypes.js";
31
- import { EventServer } from "./EventServer.js";
31
+ import { FabricSensitiveEventServer } from "./EventServer.js";
32
32
 
33
33
  const logger = Logger.get("AccessControlClusterServer");
34
34
 
35
35
  export const AccessControlClusterHandler: () => ClusterServerHandlers<typeof AccessControlCluster> = () => {
36
36
  let accessControlEntryChangedEvent:
37
- | EventServer<AccessControl.AccessControlEntryChangedEvent, SyncStorage>
37
+ | FabricSensitiveEventServer<AccessControl.AccessControlEntryChangedEvent, SyncStorage>
38
38
  | undefined = undefined;
39
39
  let accessControlExtensionChangedEvent:
40
- | EventServer<AccessControl.AccessControlExtensionChangedEvent, SyncStorage>
40
+ | FabricSensitiveEventServer<AccessControl.AccessControlExtensionChangedEvent, SyncStorage>
41
41
  | undefined = undefined;
42
42
 
43
43
  return {