@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
@@ -6,7 +6,7 @@
6
6
 
7
7
  import { MatterDevice } from "../../MatterDevice.js";
8
8
  import { AnyAttributeServer, FabricScopedAttributeServer } from "../../cluster/server/AttributeServer.js";
9
- import { EventServer } from "../../cluster/server/EventServer.js";
9
+ import { AnyEventServer, FabricSensitiveEventServer } from "../../cluster/server/EventServer.js";
10
10
  import { InternalError } from "../../common/MatterError.js";
11
11
  import { tryCatch, tryCatchAsync } from "../../common/TryCatchHandler.js";
12
12
  import { EventNumber } from "../../datatype/EventNumber.js";
@@ -17,9 +17,11 @@ import { NetworkError } from "../../net/Network.js";
17
17
  import { SecureSession } from "../../session/SecureSession.js";
18
18
  import { Time, Timer } from "../../time/Time.js";
19
19
  import { TlvSchema, TypeFromSchema } from "../../tlv/TlvSchema.js";
20
+ import { MaybePromise } from "../../util/Promises.js";
21
+ import { isObject } from "../../util/Type.js";
20
22
  import { RetransmissionLimitReachedError } from "../MessageExchange.js";
21
23
  import { AttributeReportPayload, EventReportPayload } from "./AttributeDataEncoder.js";
22
- import { EventHandler, EventStorageData } from "./EventHandler.js";
24
+ import { EventStorageData } from "./EventHandler.js";
23
25
  import { InteractionEndpointStructure } from "./InteractionEndpointStructure.js";
24
26
  import { InteractionServerMessenger } from "./InteractionMessenger.js";
25
27
  import {
@@ -48,6 +50,7 @@ const logger = Logger.get("SubscriptionHandler");
48
50
 
49
51
  interface AttributePathWithValueVersion<T> {
50
52
  path: TypeFromSchema<typeof TlvAttributePath>;
53
+ attribute: AnyAttributeServer<T>;
51
54
  schema: TlvSchema<T>;
52
55
  value: T;
53
56
  version: number;
@@ -55,11 +58,28 @@ interface AttributePathWithValueVersion<T> {
55
58
 
56
59
  interface EventPathWithEventData<T> {
57
60
  path: TypeFromSchema<typeof TlvEventPath>;
61
+ event: AnyEventServer<any, any>;
58
62
  schema: TlvSchema<T>;
59
- event: EventStorageData<T>;
63
+ data: EventStorageData<T>;
60
64
  }
61
65
 
62
66
  export class SubscriptionHandler {
67
+ readonly subscriptionId: number;
68
+ private readonly session: SecureSession<any>;
69
+ private readonly endpointStructure: InteractionEndpointStructure;
70
+ private readonly attributeRequests?: TypeFromSchema<typeof TlvAttributePath>[];
71
+ private readonly dataVersionFilters?: TypeFromSchema<typeof TlvDataVersionFilter>[];
72
+ private readonly eventRequests?: TypeFromSchema<typeof TlvEventPath>[];
73
+ private readonly eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];
74
+ private readonly isFabricFiltered: boolean;
75
+ private readonly cancelCallback: () => void;
76
+ private readonly readAttribute: (path: AttributePath, attribute: AnyAttributeServer<any>) => Promise<any>;
77
+ private readonly readEvent: (
78
+ path: EventPath,
79
+ event: AnyEventServer<any, any>,
80
+ eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,
81
+ ) => Promise<EventStorageData<any>[]>;
82
+
63
83
  private lastUpdateTimeMs = 0;
64
84
  private updateTimer: Timer;
65
85
  private readonly sendDelayTimer: Timer;
@@ -75,7 +95,7 @@ export class SubscriptionHandler {
75
95
  private readonly eventListeners = new Map<
76
96
  string,
77
97
  {
78
- event: EventServer<any, any>;
98
+ event: AnyEventServer<any, any>;
79
99
  listener?: (newEvent: EventStorageData<any>) => void;
80
100
  }
81
101
  >();
@@ -91,22 +111,54 @@ export class SubscriptionHandler {
91
111
  private sendingUpdateInProgress = false;
92
112
  private sendNextUpdateImmediately = false;
93
113
  private sendUpdateErrorCounter = 0;
114
+ private attributeUpdatePromises = new Set<PromiseLike<void>>();
115
+
116
+ constructor(options: {
117
+ subscriptionId: number;
118
+ session: SecureSession<any>;
119
+ endpointStructure: InteractionEndpointStructure;
120
+ attributeRequests?: TypeFromSchema<typeof TlvAttributePath>[];
121
+ dataVersionFilters?: TypeFromSchema<typeof TlvDataVersionFilter>[];
122
+ eventRequests?: TypeFromSchema<typeof TlvEventPath>[];
123
+ eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];
124
+ isFabricFiltered: boolean;
125
+ minIntervalFloor: number;
126
+ maxIntervalCeiling: number;
127
+ cancelCallback: () => void;
128
+ subscriptionOptions: SubscriptionOptions.Configuration;
129
+ readAttribute: (path: AttributePath, attribute: AnyAttributeServer<any>) => Promise<any>;
130
+ readEvent: (
131
+ path: EventPath,
132
+ event: AnyEventServer<any, any>,
133
+ eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,
134
+ ) => Promise<EventStorageData<any>[]>;
135
+ }) {
136
+ const {
137
+ subscriptionId,
138
+ session,
139
+ endpointStructure,
140
+ attributeRequests,
141
+ dataVersionFilters,
142
+ eventRequests,
143
+ eventFilters,
144
+ isFabricFiltered,
145
+ minIntervalFloor,
146
+ maxIntervalCeiling,
147
+ cancelCallback,
148
+ subscriptionOptions,
149
+ } = options;
150
+ this.subscriptionId = subscriptionId;
151
+ this.session = session;
152
+ this.endpointStructure = endpointStructure;
153
+ this.attributeRequests = attributeRequests;
154
+ this.dataVersionFilters = dataVersionFilters;
155
+ this.eventRequests = eventRequests;
156
+ this.eventFilters = eventFilters;
157
+ this.isFabricFiltered = isFabricFiltered;
158
+ this.cancelCallback = cancelCallback;
159
+ this.readAttribute = options.readAttribute;
160
+ this.readEvent = options.readEvent;
94
161
 
95
- constructor(
96
- readonly subscriptionId: number,
97
- private readonly session: SecureSession<any>,
98
- private readonly endpointStructure: InteractionEndpointStructure,
99
- private readonly attributeRequests: TypeFromSchema<typeof TlvAttributePath>[] | undefined,
100
- private readonly dataVersionFilters: TypeFromSchema<typeof TlvDataVersionFilter>[] | undefined,
101
- private readonly eventRequests: TypeFromSchema<typeof TlvEventPath>[] | undefined,
102
- private readonly eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,
103
- private readonly eventHandler: EventHandler,
104
- private readonly isFabricFiltered: boolean,
105
- minIntervalFloor: number,
106
- maxIntervalCeiling: number,
107
- private readonly cancelCallback: () => void,
108
- subscriptionOptions: SubscriptionOptions.Configuration,
109
- ) {
110
162
  this.server = this.session.context;
111
163
  this.fabric = this.session.associatedFabric;
112
164
  this.peerNodeId = this.session.peerNodeId;
@@ -229,6 +281,7 @@ export class SubscriptionHandler {
229
281
  }
230
282
  if (attribute.isSubscribable) {
231
283
  // If subscribable register listener
284
+ // TODO: Move to state change listeners from behaviors to remove the dangling promise here
232
285
  const listener = (value: any, version: number) =>
233
286
  this.attributeChangeListener(path, attribute.schema, version, value);
234
287
  attribute.addValueChangeListener(listener);
@@ -349,16 +402,17 @@ export class SubscriptionHandler {
349
402
  * Newly added attributes are then treated ad "changed values" and will be sent as subscription data update to the
350
403
  * controller. The data of newly added events are not sent automatically.
351
404
  */
352
- updateSubscription() {
405
+ async updateSubscription() {
353
406
  const { newAttributes } = this.registerNewAttributes();
354
407
 
355
408
  for (const { path, attribute } of newAttributes) {
356
- const { version, value } = attribute.getWithVersion(this.session, true);
409
+ const { version, value } = await this.readAttribute(path, attribute);
357
410
 
358
411
  // We do not do any version filtering for attributes that are newly added to make sure controller gets
359
412
  // most current state
360
413
 
361
414
  this.outstandingAttributeUpdates.set(attributePathToId(path), {
415
+ attribute,
362
416
  path,
363
417
  schema: attribute.schema,
364
418
  version,
@@ -368,18 +422,20 @@ export class SubscriptionHandler {
368
422
 
369
423
  const { newEvents } = this.registerNewEvents();
370
424
  newEvents
371
- .flatMap(({ path, event: { schema } }): EventPathWithEventData<any>[] => {
425
+ .flatMap(({ path, event }): EventPathWithEventData<any>[] => {
372
426
  // But we use eventFilters because we do not want to send all events to the controller
373
- const matchingEvents = this.eventHandler.getEvents(path, this.eventFilters) ?? [];
374
- return matchingEvents.map(event => ({
427
+ const { schema } = event;
428
+ const matchingEvents = event.get(this.session, this.isFabricFiltered, undefined, this.eventFilters);
429
+ return matchingEvents.map(data => ({
430
+ event,
375
431
  schema,
376
432
  path,
377
- event,
433
+ data,
378
434
  }));
379
435
  })
380
436
  .sort((a, b) => {
381
- const eventNumberA = a.event?.eventNumber ?? EventNumber(0);
382
- const eventNumberB = b.event?.eventNumber ?? EventNumber(0);
437
+ const eventNumberA = a.data?.eventNumber ?? EventNumber(0);
438
+ const eventNumberB = b.data?.eventNumber ?? EventNumber(0);
383
439
  if (eventNumberA > eventNumberB) {
384
440
  return 1;
385
441
  } else if (eventNumberA < eventNumberB) {
@@ -457,8 +513,25 @@ export class SubscriptionHandler {
457
513
  this.sendNextUpdateImmediately = true;
458
514
  return;
459
515
  }
460
- const attributeUpdatesToSend = Array.from(this.outstandingAttributeUpdates.values());
516
+
517
+ // Get all outstanding updates, make sure the order is correct per endpoint and cluster
518
+ const attributeUpdatesToSend = new Array<AttributePathWithValueVersion<any>>();
519
+ const attributeUpdates: Record<string, AttributePathWithValueVersion<any>[]> = {};
520
+ Array.from(this.outstandingAttributeUpdates.values()).forEach(entry => {
521
+ const {
522
+ path: { nodeId, endpointId, clusterId },
523
+ } = entry;
524
+ const pathId = `${nodeId}-${endpointId}-${clusterId}`;
525
+ attributeUpdates[pathId] = attributeUpdates[pathId] ?? [];
526
+ attributeUpdates[pathId].push(entry);
527
+ });
461
528
  this.outstandingAttributeUpdates.clear();
529
+ Object.values(attributeUpdates).forEach(data =>
530
+ attributeUpdatesToSend.push(
531
+ ...data.sort(({ version: versionA }, { version: versionB }) => versionA - versionB),
532
+ ),
533
+ );
534
+
462
535
  const eventUpdatesToSend = Array.from(this.outstandingEventUpdates.values());
463
536
  this.outstandingEventUpdates.clear();
464
537
  this.lastUpdateTimeMs = Time.nowMs();
@@ -500,15 +573,7 @@ export class SubscriptionHandler {
500
573
  }
501
574
  }
502
575
 
503
- async sendInitialReport(
504
- messenger: InteractionServerMessenger,
505
- readAttribute: (path: AttributePath, attribute: AnyAttributeServer<any>) => Promise<any>,
506
- readEvent: (
507
- path: EventPath,
508
- event: EventServer<any, any>,
509
- eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,
510
- ) => Promise<EventStorageData<any>[]>,
511
- ) {
576
+ async sendInitialReport(messenger: InteractionServerMessenger) {
512
577
  this.updateTimer.stop();
513
578
 
514
579
  const { newAttributes, attributeErrors } = this.registerNewAttributes();
@@ -523,10 +588,11 @@ export class SubscriptionHandler {
523
588
  value: any;
524
589
  version: number;
525
590
  schema: TlvSchema<any>;
591
+ attribute: AnyAttributeServer<any>;
526
592
  }>();
527
593
  for (const { path, attribute } of newAttributes) {
528
594
  try {
529
- const { value, version } = await readAttribute(path, attribute);
595
+ const { value, version } = await this.readAttribute(path, attribute);
530
596
  if (value === undefined) continue;
531
597
 
532
598
  const { nodeId, endpointId, clusterId } = path;
@@ -540,13 +606,14 @@ export class SubscriptionHandler {
540
606
  continue;
541
607
  }
542
608
 
543
- attributes.push({ path, value, version, schema: attribute.schema });
609
+ attributes.push({ path, value, version, schema: attribute.schema, attribute });
544
610
  } catch (error) {
545
611
  logger.error(`Error reading attribute ${this.endpointStructure.resolveAttributeName(path)}:`, error);
546
612
  }
547
613
  }
548
614
  const attributeReportsPayload: AttributeReportPayload[] = attributes.map(
549
- ({ path, schema, value, version }) => ({
615
+ ({ path, schema, value, version, attribute }) => ({
616
+ hasFabricSensitiveData: attribute.hasFabricSensitiveData,
550
617
  attributeData: {
551
618
  path,
552
619
  dataVersion: version,
@@ -555,7 +622,12 @@ export class SubscriptionHandler {
555
622
  },
556
623
  }),
557
624
  );
558
- attributeErrors.forEach(attributeStatus => attributeReportsPayload.push({ attributeStatus }));
625
+ attributeErrors.forEach(attributeStatus =>
626
+ attributeReportsPayload.push({
627
+ hasFabricSensitiveData: false,
628
+ attributeStatus,
629
+ }),
630
+ );
559
631
 
560
632
  const { newEvents, eventErrors } = this.registerNewEvents();
561
633
 
@@ -564,12 +636,13 @@ export class SubscriptionHandler {
564
636
  for (const { path, event } of newEvents) {
565
637
  const { schema } = event;
566
638
  try {
567
- const matchingEvents = await readEvent(path, event, this.eventFilters);
639
+ const matchingEvents = await this.readEvent(path, event, this.eventFilters);
568
640
  if (matchingEvents.length === 0) {
569
641
  eventsFiltered = true;
570
642
  } else {
571
643
  matchingEvents.forEach(({ eventNumber, priority, epochTimestamp, data }) => {
572
644
  eventReportsPayload.push({
645
+ hasFabricSensitiveData: event.hasFabricSensitiveData,
573
646
  eventData: {
574
647
  path,
575
648
  eventNumber,
@@ -609,48 +682,82 @@ export class SubscriptionHandler {
609
682
  );
610
683
  }
611
684
 
612
- eventErrors.forEach(eventStatus => eventReportsPayload.push({ eventStatus }));
685
+ eventErrors.forEach(eventStatus =>
686
+ eventReportsPayload.push({
687
+ hasFabricSensitiveData: false,
688
+ eventStatus,
689
+ }),
690
+ );
613
691
 
614
692
  logger.debug(
615
693
  `Initialize Subscription with ${attributes.length} attributes and ${eventReportsPayload.length} events.`,
616
694
  );
617
695
  this.lastUpdateTimeMs = Time.nowMs();
618
696
 
619
- await messenger.sendDataReport({
620
- suppressResponse: false,
621
- subscriptionId: this.subscriptionId,
622
- interactionModelRevision: INTERACTION_MODEL_REVISION,
623
- attributeReportsPayload, // TODO Return compressed response once https://github.com/project-chip/connectedhomeip/issues/29359 is solved
624
- eventReportsPayload,
625
- });
697
+ await messenger.sendDataReport(
698
+ {
699
+ suppressResponse: false,
700
+ subscriptionId: this.subscriptionId,
701
+ interactionModelRevision: INTERACTION_MODEL_REVISION,
702
+ attributeReportsPayload, // TODO Return compressed response once https://github.com/project-chip/connectedhomeip/issues/29359 is solved
703
+ eventReportsPayload,
704
+ },
705
+ this.isFabricFiltered,
706
+ );
626
707
  }
627
708
 
628
- attributeChangeListener<T>(
629
- path: TypeFromSchema<typeof TlvAttributePath>,
709
+ attributeChangeListener<T>(path: AttributePath, schema: TlvSchema<T>, version: number, value: T) {
710
+ const changeResult = this.attributeChangeHandler(path, schema, version, value);
711
+ if (MaybePromise.is(changeResult)) {
712
+ const resolver = Promise.resolve(changeResult)
713
+ .catch(error => logger.error(`Error handling attribute change:`, error))
714
+ .finally(() => this.attributeUpdatePromises.delete(resolver));
715
+ this.attributeUpdatePromises.add(resolver);
716
+ }
717
+ }
718
+
719
+ attributeChangeHandler<T>(
720
+ path: AttributePath,
630
721
  schema: TlvSchema<T>,
631
722
  version: number,
632
723
  value: T,
633
- ) {
724
+ ): MaybePromise<void> {
634
725
  const attributeListenerData = this.attributeListeners.get(attributePathToId(path));
635
726
  if (attributeListenerData === undefined) return; // Ignore changes to attributes that are not subscribed to
636
727
 
637
728
  const { attribute } = attributeListenerData;
638
729
  if (attribute instanceof FabricScopedAttributeServer) {
639
730
  // We can not be sure what value we got for fabric filtered attributes (and from which fabric),
640
- // so get it again for this relevant fabric
731
+ // so get it again for this relevant fabric. This also makes sure that fabric sensitive fields are filtered
641
732
  // TODO: Maybe add try/catch when we add ACL handling and ignore the update if we can not get the value?
642
- value = attribute.get(this.session, this.isFabricFiltered);
733
+ return this.readAttribute(path, attribute).then(({ value }) => {
734
+ this.outstandingAttributeUpdates.set(attributePathToId(path), {
735
+ attribute,
736
+ path,
737
+ schema,
738
+ version,
739
+ value,
740
+ });
741
+ this.prepareDataUpdate();
742
+ });
643
743
  }
644
- this.outstandingAttributeUpdates.set(attributePathToId(path), { path, schema, version, value });
744
+ this.outstandingAttributeUpdates.set(attributePathToId(path), { attribute, path, schema, version, value });
645
745
  this.prepareDataUpdate();
646
746
  }
647
747
 
648
- eventChangeListener<T>(
649
- path: TypeFromSchema<typeof TlvEventPath>,
650
- schema: TlvSchema<T>,
651
- newEvent: EventStorageData<T>,
652
- ) {
653
- this.outstandingEventUpdates.add({ path, schema, event: newEvent });
748
+ eventChangeListener<T>(path: EventPath, schema: TlvSchema<T>, newEvent: EventStorageData<T>) {
749
+ const eventListenerData = this.eventListeners.get(eventPathToId(path));
750
+ if (eventListenerData === undefined) return; // Ignore changes to attributes that are not subscribed to
751
+
752
+ const { event } = eventListenerData;
753
+ if (event instanceof FabricSensitiveEventServer) {
754
+ const { data } = newEvent;
755
+ if (isObject(data) && "fabricIndex" in data && data.fabricIndex !== this.session.fabric?.fabricIndex) {
756
+ // Ignore events from different fabrics because events are kind of always fabric filtered
757
+ return;
758
+ }
759
+ }
760
+ this.outstandingEventUpdates.add({ event, path, schema, data: newEvent });
654
761
  if (path.isUrgent) {
655
762
  this.prepareDataUpdate();
656
763
  }
@@ -668,6 +775,11 @@ export class SubscriptionHandler {
668
775
 
669
776
  async cancel(flush = false, cancelledByPeer = false) {
670
777
  this.sendUpdatesActivated = false;
778
+ if (this.attributeUpdatePromises.size) {
779
+ const resolvers = [...this.attributeUpdatePromises.values()];
780
+ this.attributeUpdatePromises.clear();
781
+ await Promise.all(resolvers);
782
+ }
671
783
  this.updateTimer.stop();
672
784
  this.sendDelayTimer.stop();
673
785
  this.unregisterAttributeListeners(Array.from(this.attributeListeners.keys()));
@@ -705,38 +817,49 @@ export class SubscriptionHandler {
705
817
  await tryCatchAsync(
706
818
  async () => {
707
819
  if (attributes.length === 0 && events.length === 0) {
708
- await messenger.sendDataReport({
709
- suppressResponse: true, // suppressResponse ok for empty DataReports
710
- subscriptionId: this.subscriptionId,
711
- interactionModelRevision: INTERACTION_MODEL_REVISION,
712
- });
820
+ await messenger.sendDataReport(
821
+ {
822
+ suppressResponse: true, // suppressResponse ok for empty DataReports
823
+ subscriptionId: this.subscriptionId,
824
+ interactionModelRevision: INTERACTION_MODEL_REVISION,
825
+ },
826
+ this.isFabricFiltered,
827
+ );
713
828
  } else {
714
- await messenger.sendDataReport({
715
- suppressResponse: false,
716
- subscriptionId: this.subscriptionId,
717
- interactionModelRevision: INTERACTION_MODEL_REVISION,
718
- // TODO Return compressed response once https://github.com/project-chip/connectedhomeip/issues/29359 is solved
719
- attributeReportsPayload: attributes.map(({ path, schema, value, version }) => ({
720
- attributeData: {
721
- path,
722
- dataVersion: version,
723
- schema,
724
- payload: value,
725
- },
726
- })),
727
- eventReportsPayload: events.map(
728
- ({ path, schema, event: { eventNumber, priority, epochTimestamp, data } }) => ({
729
- eventData: {
730
- path,
731
- eventNumber,
732
- priority,
733
- epochTimestamp,
734
- schema,
735
- payload: data,
736
- },
829
+ await messenger.sendDataReport(
830
+ {
831
+ suppressResponse: false,
832
+ subscriptionId: this.subscriptionId,
833
+ interactionModelRevision: INTERACTION_MODEL_REVISION,
834
+ // TODO Return compressed response once https://github.com/project-chip/connectedhomeip/issues/29359 is solved
835
+ attributeReportsPayload: attributes.map(
836
+ ({ path, schema, value, version, attribute }) => ({
837
+ hasFabricSensitiveData: attribute.hasFabricSensitiveData,
838
+ attributeData: {
839
+ path,
840
+ dataVersion: version,
841
+ schema,
842
+ payload: value,
843
+ },
844
+ }),
845
+ ),
846
+ eventReportsPayload: events.map(({ path, schema, event, data }) => {
847
+ const { eventNumber, priority, epochTimestamp, data: payload } = data;
848
+ return {
849
+ hasFabricSensitiveData: event.hasFabricSensitiveData,
850
+ eventData: {
851
+ path,
852
+ eventNumber,
853
+ priority,
854
+ epochTimestamp,
855
+ schema,
856
+ payload,
857
+ },
858
+ };
737
859
  }),
738
- ),
739
- });
860
+ },
861
+ this.isFabricFiltered,
862
+ );
740
863
  }
741
864
  },
742
865
  StatusResponseError,
@@ -290,7 +290,8 @@ export class SecureSession<T> extends Session<T> {
290
290
  }
291
291
 
292
292
  async clearSubscriptions(flushSubscriptions = false) {
293
- for (const subscription of this.#subscriptions) {
293
+ const subscriptions = [...this.#subscriptions]; // get all values because subscriptions will remove themselves when cancelled
294
+ for (const subscription of subscriptions) {
294
295
  await subscription.cancel(flushSubscriptions);
295
296
  }
296
297
  this.#subscriptions.length = 0;
@@ -8,6 +8,7 @@ import { MatterFlowError } from "../common/MatterError.js";
8
8
  import { Crypto } from "../crypto/Crypto.js";
9
9
  import { CaseAuthenticatedTag } from "../datatype/CaseAuthenticatedTag.js";
10
10
  import { FabricId } from "../datatype/FabricId.js";
11
+ import { FabricIndex } from "../datatype/FabricIndex.js";
11
12
  import { NodeId } from "../datatype/NodeId.js";
12
13
  import { Fabric } from "../fabric/Fabric.js";
13
14
  import { Logger } from "../log/Logger.js";
@@ -343,6 +344,14 @@ export class SessionManager<ContextT> {
343
344
  }));
344
345
  }
345
346
 
347
+ async clearSubscriptionsForNode(fabricIndex: FabricIndex, nodeId: NodeId, flushSubscriptions?: boolean) {
348
+ for (const session of this.#sessions) {
349
+ if (session.fabric?.fabricIndex === fabricIndex && session.peerNodeId === nodeId) {
350
+ await session.clearSubscriptions(flushSubscriptions);
351
+ }
352
+ }
353
+ }
354
+
346
355
  async close() {
347
356
  await this.storeResumptionRecords();
348
357
  for (const session of this.#sessions) {
@@ -10,7 +10,7 @@ import { ValidationError } from "../common/ValidationError.js";
10
10
  import { deepCopy } from "../util/DeepCopy.js";
11
11
  import { serialize } from "../util/String.js";
12
12
  import { TlvTag, TlvType, TlvTypeLength } from "./TlvCodec.js";
13
- import { TlvReader, TlvSchema, TlvStream, TlvWriter } from "./TlvSchema.js";
13
+ import { TlvEncodingOptions, TlvReader, TlvSchema, TlvStream, TlvWriter } from "./TlvSchema.js";
14
14
 
15
15
  export type LengthConstraints = {
16
16
  minLength?: number;
@@ -38,9 +38,9 @@ export class ArraySchema<T> extends TlvSchema<T[]> {
38
38
  super();
39
39
  }
40
40
 
41
- override encodeTlvInternal(writer: TlvWriter, value: T[], tag?: TlvTag, forWriteInteraction?: boolean): void {
41
+ override encodeTlvInternal(writer: TlvWriter, value: T[], tag?: TlvTag, options?: TlvEncodingOptions): void {
42
42
  writer.writeTag({ type: TlvType.Array }, tag);
43
- value.forEach(element => this.elementSchema.encodeTlvInternal(writer, element, undefined, forWriteInteraction));
43
+ value.forEach(element => this.elementSchema.encodeTlvInternal(writer, element, undefined, options));
44
44
  writer.writeTag({ type: TlvType.EndOfContainer });
45
45
  }
46
46
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  import { ArraySchema } from "./TlvArray.js";
8
8
  import { TlvTag, TlvType, TlvTypeLength } from "./TlvCodec.js";
9
- import { TlvReader, TlvSchema, TlvWriter } from "./TlvSchema.js";
9
+ import { TlvEncodingOptions, TlvReader, TlvSchema, TlvWriter } from "./TlvSchema.js";
10
10
  import { StringSchema } from "./TlvString.js";
11
11
 
12
12
  /**
@@ -19,11 +19,11 @@ export class NullableSchema<T> extends TlvSchema<T | null> {
19
19
  super();
20
20
  }
21
21
 
22
- override encodeTlvInternal(writer: TlvWriter, value: T | null, tag?: TlvTag, forWriteInteraction?: boolean): void {
22
+ override encodeTlvInternal(writer: TlvWriter, value: T | null, tag?: TlvTag, options?: TlvEncodingOptions): void {
23
23
  if (value === null) {
24
24
  writer.writeTag({ type: TlvType.Null }, tag);
25
25
  } else {
26
- this.schema.encodeTlvInternal(writer, value, tag, forWriteInteraction);
26
+ this.schema.encodeTlvInternal(writer, value, tag, options);
27
27
  }
28
28
  }
29
29