@matter/general 0.16.0-alpha.0-20250930-05e6cc3f8 → 0.16.0-alpha.0-20251003-dc6d5523d

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 (178) hide show
  1. package/dist/cjs/MatterError.d.ts +2 -2
  2. package/dist/cjs/MatterError.d.ts.map +1 -1
  3. package/dist/cjs/MatterError.js +0 -1
  4. package/dist/cjs/MatterError.js.map +1 -1
  5. package/dist/cjs/crypto/Crypto.d.ts +1 -1
  6. package/dist/cjs/crypto/Crypto.d.ts.map +1 -1
  7. package/dist/cjs/crypto/Crypto.js.map +1 -1
  8. package/dist/cjs/crypto/NodeJsStyleCrypto.d.ts +2 -1
  9. package/dist/cjs/crypto/NodeJsStyleCrypto.d.ts.map +1 -1
  10. package/dist/cjs/crypto/NodeJsStyleCrypto.js +19 -1
  11. package/dist/cjs/crypto/NodeJsStyleCrypto.js.map +1 -1
  12. package/dist/cjs/crypto/StandardCrypto.d.ts +1 -1
  13. package/dist/cjs/crypto/StandardCrypto.d.ts.map +1 -1
  14. package/dist/cjs/crypto/StandardCrypto.js +3 -0
  15. package/dist/cjs/crypto/StandardCrypto.js.map +1 -1
  16. package/dist/cjs/environment/Environment.d.ts +12 -0
  17. package/dist/cjs/environment/Environment.d.ts.map +1 -1
  18. package/dist/cjs/environment/Environment.js +48 -7
  19. package/dist/cjs/environment/Environment.js.map +1 -1
  20. package/dist/cjs/environment/Environmental.d.ts +1 -1
  21. package/dist/cjs/environment/Environmental.d.ts.map +1 -1
  22. package/dist/cjs/environment/RuntimeService.d.ts +9 -2
  23. package/dist/cjs/environment/RuntimeService.d.ts.map +1 -1
  24. package/dist/cjs/environment/RuntimeService.js +10 -1
  25. package/dist/cjs/environment/RuntimeService.js.map +1 -1
  26. package/dist/cjs/net/AppAddress.d.ts +46 -0
  27. package/dist/cjs/net/AppAddress.d.ts.map +1 -0
  28. package/dist/cjs/net/AppAddress.js +117 -0
  29. package/dist/cjs/net/AppAddress.js.map +6 -0
  30. package/dist/cjs/net/Channel.d.ts +2 -2
  31. package/dist/cjs/net/Channel.d.ts.map +1 -1
  32. package/dist/cjs/net/{TransportInterface.d.ts → ConnectionlessTransport.d.ts} +9 -8
  33. package/dist/cjs/net/ConnectionlessTransport.d.ts.map +1 -0
  34. package/dist/cjs/net/{TransportInterface.js → ConnectionlessTransport.js} +9 -8
  35. package/dist/cjs/net/ConnectionlessTransport.js.map +6 -0
  36. package/dist/cjs/net/Network.d.ts +2 -2
  37. package/dist/cjs/net/Network.d.ts.map +1 -1
  38. package/dist/cjs/net/ServerAddress.d.ts +7 -2
  39. package/dist/cjs/net/ServerAddress.d.ts.map +1 -1
  40. package/dist/cjs/net/ServerAddress.js +20 -5
  41. package/dist/cjs/net/ServerAddress.js.map +1 -1
  42. package/dist/cjs/net/index.d.ts +3 -5
  43. package/dist/cjs/net/index.d.ts.map +1 -1
  44. package/dist/cjs/net/index.js +3 -5
  45. package/dist/cjs/net/index.js.map +1 -1
  46. package/dist/cjs/net/mock/MockNetwork.d.ts +1 -1
  47. package/dist/cjs/net/mock/MockNetwork.d.ts.map +1 -1
  48. package/dist/cjs/net/mock/MockUdpChannel.d.ts +1 -1
  49. package/dist/cjs/net/mock/MockUdpChannel.d.ts.map +1 -1
  50. package/dist/cjs/net/mock/MockUdpChannel.js +1 -1
  51. package/dist/{esm/net → cjs/net/udp}/UdpChannel.d.ts +3 -3
  52. package/dist/cjs/net/udp/UdpChannel.d.ts.map +1 -0
  53. package/dist/cjs/net/{UdpChannel.js.map → udp/UdpChannel.js.map} +1 -1
  54. package/dist/{esm/net → cjs/net/udp}/UdpInterface.d.ts +9 -10
  55. package/dist/cjs/net/udp/UdpInterface.d.ts.map +1 -0
  56. package/dist/cjs/net/{UdpInterface.js → udp/UdpInterface.js} +2 -2
  57. package/dist/cjs/net/{UdpInterface.js.map → udp/UdpInterface.js.map} +2 -2
  58. package/dist/{esm/net → cjs/net/udp}/UdpMulticastServer.d.ts +1 -1
  59. package/dist/cjs/net/udp/UdpMulticastServer.d.ts.map +1 -0
  60. package/dist/cjs/net/{UdpMulticastServer.js → udp/UdpMulticastServer.js} +5 -5
  61. package/dist/cjs/net/{UdpMulticastServer.js.map → udp/UdpMulticastServer.js.map} +1 -1
  62. package/dist/cjs/net/udp/index.d.ts +9 -0
  63. package/dist/cjs/net/udp/index.d.ts.map +1 -0
  64. package/dist/cjs/net/udp/index.js +26 -0
  65. package/dist/cjs/net/udp/index.js.map +6 -0
  66. package/dist/cjs/time/Duration.d.ts.map +1 -1
  67. package/dist/cjs/time/Duration.js +4 -1
  68. package/dist/cjs/time/Duration.js.map +1 -1
  69. package/dist/esm/MatterError.d.ts +2 -2
  70. package/dist/esm/MatterError.d.ts.map +1 -1
  71. package/dist/esm/MatterError.js +0 -1
  72. package/dist/esm/MatterError.js.map +1 -1
  73. package/dist/esm/crypto/Crypto.d.ts +1 -1
  74. package/dist/esm/crypto/Crypto.d.ts.map +1 -1
  75. package/dist/esm/crypto/Crypto.js.map +1 -1
  76. package/dist/esm/crypto/NodeJsStyleCrypto.d.ts +2 -1
  77. package/dist/esm/crypto/NodeJsStyleCrypto.d.ts.map +1 -1
  78. package/dist/esm/crypto/NodeJsStyleCrypto.js +19 -1
  79. package/dist/esm/crypto/NodeJsStyleCrypto.js.map +1 -1
  80. package/dist/esm/crypto/StandardCrypto.d.ts +1 -1
  81. package/dist/esm/crypto/StandardCrypto.d.ts.map +1 -1
  82. package/dist/esm/crypto/StandardCrypto.js +4 -1
  83. package/dist/esm/crypto/StandardCrypto.js.map +1 -1
  84. package/dist/esm/environment/Environment.d.ts +12 -0
  85. package/dist/esm/environment/Environment.d.ts.map +1 -1
  86. package/dist/esm/environment/Environment.js +48 -7
  87. package/dist/esm/environment/Environment.js.map +1 -1
  88. package/dist/esm/environment/Environmental.d.ts +1 -1
  89. package/dist/esm/environment/Environmental.d.ts.map +1 -1
  90. package/dist/esm/environment/RuntimeService.d.ts +9 -2
  91. package/dist/esm/environment/RuntimeService.d.ts.map +1 -1
  92. package/dist/esm/environment/RuntimeService.js +10 -1
  93. package/dist/esm/environment/RuntimeService.js.map +1 -1
  94. package/dist/esm/net/AppAddress.d.ts +46 -0
  95. package/dist/esm/net/AppAddress.d.ts.map +1 -0
  96. package/dist/esm/net/AppAddress.js +97 -0
  97. package/dist/esm/net/AppAddress.js.map +6 -0
  98. package/dist/esm/net/Channel.d.ts +2 -2
  99. package/dist/esm/net/Channel.d.ts.map +1 -1
  100. package/dist/esm/net/{TransportInterface.d.ts → ConnectionlessTransport.d.ts} +9 -8
  101. package/dist/esm/net/ConnectionlessTransport.d.ts.map +1 -0
  102. package/dist/esm/net/{TransportInterface.js → ConnectionlessTransport.js} +6 -5
  103. package/dist/esm/net/ConnectionlessTransport.js.map +6 -0
  104. package/dist/esm/net/Network.d.ts +2 -2
  105. package/dist/esm/net/Network.d.ts.map +1 -1
  106. package/dist/esm/net/ServerAddress.d.ts +7 -2
  107. package/dist/esm/net/ServerAddress.d.ts.map +1 -1
  108. package/dist/esm/net/ServerAddress.js +20 -5
  109. package/dist/esm/net/ServerAddress.js.map +1 -1
  110. package/dist/esm/net/index.d.ts +3 -5
  111. package/dist/esm/net/index.d.ts.map +1 -1
  112. package/dist/esm/net/index.js +3 -5
  113. package/dist/esm/net/index.js.map +1 -1
  114. package/dist/esm/net/mock/MockNetwork.d.ts +1 -1
  115. package/dist/esm/net/mock/MockNetwork.d.ts.map +1 -1
  116. package/dist/esm/net/mock/MockUdpChannel.d.ts +1 -1
  117. package/dist/esm/net/mock/MockUdpChannel.d.ts.map +1 -1
  118. package/dist/esm/net/mock/MockUdpChannel.js +1 -1
  119. package/dist/{cjs/net → esm/net/udp}/UdpChannel.d.ts +3 -3
  120. package/dist/esm/net/udp/UdpChannel.d.ts.map +1 -0
  121. package/dist/esm/net/{UdpChannel.js.map → udp/UdpChannel.js.map} +1 -1
  122. package/dist/{cjs/net → esm/net/udp}/UdpInterface.d.ts +9 -10
  123. package/dist/esm/net/udp/UdpInterface.d.ts.map +1 -0
  124. package/dist/esm/net/{UdpInterface.js → udp/UdpInterface.js} +2 -2
  125. package/dist/esm/net/{UdpInterface.js.map → udp/UdpInterface.js.map} +2 -2
  126. package/dist/{cjs/net → esm/net/udp}/UdpMulticastServer.d.ts +1 -1
  127. package/dist/esm/net/udp/UdpMulticastServer.d.ts.map +1 -0
  128. package/dist/esm/net/{UdpMulticastServer.js → udp/UdpMulticastServer.js} +5 -5
  129. package/dist/esm/net/{UdpMulticastServer.js.map → udp/UdpMulticastServer.js.map} +1 -1
  130. package/dist/esm/net/udp/index.d.ts +9 -0
  131. package/dist/esm/net/udp/index.d.ts.map +1 -0
  132. package/dist/esm/net/udp/index.js +9 -0
  133. package/dist/esm/net/udp/index.js.map +6 -0
  134. package/dist/esm/time/Duration.d.ts.map +1 -1
  135. package/dist/esm/time/Duration.js +4 -1
  136. package/dist/esm/time/Duration.js.map +1 -1
  137. package/package.json +2 -2
  138. package/src/MatterError.ts +6 -3
  139. package/src/crypto/Crypto.ts +3 -1
  140. package/src/crypto/NodeJsStyleCrypto.ts +24 -2
  141. package/src/crypto/StandardCrypto.ts +5 -2
  142. package/src/environment/Environment.ts +66 -8
  143. package/src/environment/Environmental.ts +1 -1
  144. package/src/environment/RuntimeService.ts +21 -2
  145. package/src/net/AppAddress.ts +136 -0
  146. package/src/net/Channel.ts +2 -2
  147. package/src/net/{TransportInterface.ts → ConnectionlessTransport.ts} +12 -8
  148. package/src/net/Network.ts +2 -2
  149. package/src/net/ServerAddress.ts +32 -7
  150. package/src/net/index.ts +3 -5
  151. package/src/net/mock/MockNetwork.ts +1 -1
  152. package/src/net/mock/MockUdpChannel.ts +1 -1
  153. package/src/net/{UdpChannel.ts → udp/UdpChannel.ts} +3 -3
  154. package/src/net/{UdpInterface.ts → udp/UdpInterface.ts} +7 -8
  155. package/src/net/{UdpMulticastServer.ts → udp/UdpMulticastServer.ts} +5 -5
  156. package/src/net/udp/index.ts +9 -0
  157. package/src/time/Duration.ts +8 -1
  158. package/dist/cjs/net/NetInterface.d.ts +0 -25
  159. package/dist/cjs/net/NetInterface.d.ts.map +0 -1
  160. package/dist/cjs/net/NetInterface.js +0 -42
  161. package/dist/cjs/net/NetInterface.js.map +0 -6
  162. package/dist/cjs/net/TransportInterface.d.ts.map +0 -1
  163. package/dist/cjs/net/TransportInterface.js.map +0 -6
  164. package/dist/cjs/net/UdpChannel.d.ts.map +0 -1
  165. package/dist/cjs/net/UdpInterface.d.ts.map +0 -1
  166. package/dist/cjs/net/UdpMulticastServer.d.ts.map +0 -1
  167. package/dist/esm/net/NetInterface.d.ts +0 -25
  168. package/dist/esm/net/NetInterface.d.ts.map +0 -1
  169. package/dist/esm/net/NetInterface.js +0 -22
  170. package/dist/esm/net/NetInterface.js.map +0 -6
  171. package/dist/esm/net/TransportInterface.d.ts.map +0 -1
  172. package/dist/esm/net/TransportInterface.js.map +0 -6
  173. package/dist/esm/net/UdpChannel.d.ts.map +0 -1
  174. package/dist/esm/net/UdpInterface.d.ts.map +0 -1
  175. package/dist/esm/net/UdpMulticastServer.d.ts.map +0 -1
  176. package/src/net/NetInterface.ts +0 -34
  177. /package/dist/cjs/net/{UdpChannel.js → udp/UdpChannel.js} +0 -0
  178. /package/dist/esm/net/{UdpChannel.js → udp/UdpChannel.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UdpMulticastServer.d.ts","sourceRoot":"","sources":["../../../../src/net/udp/UdpMulticastServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAKvC,OAAO,EAAE,OAAO,EAA2B,MAAM,eAAe,CAAC;AAKjE,MAAM,WAAW,yBAAyB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,kBAAkB;IAsDvB,QAAQ,CAAC,OAAO,EAAE,OAAO;IACzB,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS;WA3DhC,MAAM,CAAC,EAChB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,OAAO,GACV,EAAE,yBAAyB;IAuC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAKhC;IAEF,OAAO;IAUP,IAAI,YAAY,YAEf;IAED,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI;IAiBjF,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;YA+C1D,sBAAsB;IAQ9B,KAAK;CAKd"}
@@ -5,11 +5,11 @@
5
5
  */
6
6
  import { MatterAggregateError } from "#MatterError.js";
7
7
  import { Minutes } from "#time/TimeUnit.js";
8
- import { Logger } from "../log/Logger.js";
9
- import { Cache } from "../util/Cache.js";
10
- import { asError } from "../util/Error.js";
11
- import { isIPv4 } from "../util/Ip.js";
12
- import { NoAddressAvailableError } from "./Network.js";
8
+ import { Logger } from "../../log/Logger.js";
9
+ import { Cache } from "../../util/Cache.js";
10
+ import { asError } from "../../util/Error.js";
11
+ import { isIPv4 } from "../../util/Ip.js";
12
+ import { NoAddressAvailableError } from "../Network.js";
13
13
  const logger = Logger.get("UdpMulticastServer");
14
14
  class UdpMulticastServer {
15
15
  constructor(network, broadcastAddressIpv4, broadcastAddressIpv6, broadcastPort, serverIpv4, serverIpv6, netInterface) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/net/UdpMulticastServer.ts"],
3
+ "sources": ["../../../../src/net/udp/UdpMulticastServer.ts"],
4
4
  "mappings": "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",
5
5
  "names": ["netInterface"]
6
6
  }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export * from "./UdpChannel.js";
7
+ export * from "./UdpInterface.js";
8
+ export * from "./UdpMulticastServer.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/net/udp/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export * from "./UdpChannel.js";
7
+ export * from "./UdpInterface.js";
8
+ export * from "./UdpMulticastServer.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/net/udp/index.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;",
5
+ "names": []
6
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"Duration.d.ts","sourceRoot":"","sources":["../../../src/time/Duration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC;;;;;;;;;;GAUG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;AAEvD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,QAAQ,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,CAazE;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,mBAAmB;CAAG;AAE/D,yBAAiB,QAAQ,CAAC;IACtB;;OAEG;IACH,SAAgB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,YAK3C;IAED;;OAEG;IACH,SAAgB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,YAK3C;IAED;;OAEG;IACH,SAAgB,MAAM,CAAC,CAAC,SAAS,QAAQ,GAAG,SAAS,EACjD,QAAQ,EAAE,CAAC,GACZ,CAAC,SAAS,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAmDnD;IAED;;OAEG;IACH,SAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GA8CX,QAAQ,CAC9B;CACJ"}
1
+ {"version":3,"file":"Duration.d.ts","sourceRoot":"","sources":["../../../src/time/Duration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC;;;;;;;;;;GAUG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;AAEvD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,QAAQ,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,CAazE;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,mBAAmB;CAAG;AAE/D,yBAAiB,QAAQ,CAAC;IACtB;;OAEG;IACH,SAAgB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,YAK3C;IAED;;OAEG;IACH,SAAgB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,YAK3C;IAED;;OAEG;IACH,SAAgB,MAAM,CAAC,CAAC,SAAS,QAAQ,GAAG,SAAS,EACjD,QAAQ,EAAE,CAAC,GACZ,CAAC,SAAS,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAsDnD;IAED;;OAEG;IACH,SAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GA8CX,QAAQ,CAC9B;CACJ"}
@@ -34,6 +34,9 @@ class DurationFormatError extends UnexpectedDataError {
34
34
  }
35
35
  Duration2.min = min;
36
36
  function format(duration) {
37
+ if (duration === void 0) {
38
+ return void 0;
39
+ }
37
40
  let ms = duration;
38
41
  if (typeof ms !== "number" || !Number.isFinite(ms)) {
39
42
  return "invalid";
@@ -116,7 +119,7 @@ class DurationFormatError extends UnexpectedDataError {
116
119
  Duration2.parse = parse;
117
120
  })(Duration || (Duration = {}));
118
121
  function toPrecision(number, precision) {
119
- return number.toPrecision(precision).replace(/\.?0+/, "");
122
+ return number.toPrecision(precision).replace(/(\.\d*?[1-9])0+$/, "$1").replace(/\.0+$/, "");
120
123
  }
121
124
  export {
122
125
  Duration,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/time/Duration.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["Duration"]
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/general",
3
- "version": "0.16.0-alpha.0-20250930-05e6cc3f8",
3
+ "version": "0.16.0-alpha.0-20251003-dc6d5523d",
4
4
  "description": "Non-Matter support for Matter.js",
5
5
  "keywords": [
6
6
  "iot",
@@ -36,7 +36,7 @@
36
36
  "@noble/curves": "^2.0.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@matter/testing": "0.16.0-alpha.0-20250930-05e6cc3f8"
39
+ "@matter/testing": "0.16.0-alpha.0-20251003-dc6d5523d"
40
40
  },
41
41
  "files": [
42
42
  "dist/**/*",
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { MaybePromise } from "#util/Promises.js";
7
8
  import { decamelize } from "#util/String.js";
8
9
  import { errorOf } from "./util/Error.js";
9
10
 
@@ -232,16 +233,18 @@ export class MatterAggregateError extends AggregateError {
232
233
  /**
233
234
  * Wait for all promises to settle and throw an error if any of them reject as MatterAggregateError
234
235
  * (or extended class). Promise results are not returned.
235
- * TODO: Enhance the types between call and result to be better unwrapped
236
236
  */
237
- static async allSettled(promises: Iterable<unknown>, message = "Errors happened"): Promise<unknown[]> {
237
+ static async allSettled<T = unknown>(
238
+ promises: Iterable<MaybePromise<T>>,
239
+ message = "Errors happened",
240
+ ): Promise<T[]> {
238
241
  const results = await Promise.allSettled(promises);
239
242
  const errors = results.filter(result => result.status === "rejected").map(result => result.reason);
240
243
 
241
244
  if (errors.length) {
242
245
  throw new this(errors, message);
243
246
  }
244
- return (results as PromiseFulfilledResult<unknown>[]).map(result => result.value);
247
+ return (results as PromiseFulfilledResult<T>[]).map(result => result.value);
245
248
  }
246
249
  }
247
250
 
@@ -65,7 +65,9 @@ export abstract class Crypto {
65
65
  /**
66
66
  * Compute the SHA-256 hash of a buffer.
67
67
  */
68
- abstract computeSha256(data: Bytes | Bytes[]): MaybePromise<Bytes>;
68
+ abstract computeSha256(
69
+ data: Bytes | Bytes[] | ReadableStreamDefaultReader<Bytes> | AsyncIterator<Bytes>,
70
+ ): MaybePromise<Bytes>;
69
71
 
70
72
  /**
71
73
  * Create a key from a secret using PBKDF2.
@@ -4,8 +4,10 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { ImplementationError } from "#MatterError.js";
7
8
  import { Bytes } from "#util/Bytes.js";
8
9
  import { asError } from "#util/Error.js";
10
+ import { MaybePromise } from "#util/Promises.js";
9
11
  import { Identity } from "#util/Type.js";
10
12
  import {
11
13
  Crypto,
@@ -104,12 +106,32 @@ export class NodeJsStyleCrypto extends Crypto {
104
106
  };
105
107
  }
106
108
 
107
- computeSha256(data: Bytes | Bytes[]): Bytes {
109
+ async #hashAsyncIteratorData(hasher: NodeJsCryptoApi.Hash, iteratorFunc: () => Promise<IteratorResult<Bytes>>) {
110
+ while (true) {
111
+ const { value, done } = await iteratorFunc();
112
+ if (value === undefined || done) break;
113
+ hasher.update(Bytes.of(value));
114
+ }
115
+ }
116
+
117
+ computeSha256(
118
+ data: Bytes | Bytes[] | ReadableStreamDefaultReader<Bytes> | AsyncIterator<Bytes>,
119
+ ): MaybePromise<Bytes> {
108
120
  const hasher = this.#crypto.createHash(CRYPTO_HASH_ALGORITHM);
109
121
  if (Array.isArray(data)) {
110
122
  data.forEach(chunk => hasher.update(Bytes.of(chunk)));
111
- } else {
123
+ } else if (Bytes.isBytes(data)) {
112
124
  hasher.update(Bytes.of(data));
125
+ } else {
126
+ let iteratorFunc: () => Promise<IteratorResult<Bytes>>;
127
+ if ("read" in data && typeof data.read === "function") {
128
+ iteratorFunc = data.read.bind(data);
129
+ } else if ("next" in data && typeof data.next === "function") {
130
+ iteratorFunc = data.next.bind(data);
131
+ } else {
132
+ throw new ImplementationError("Invalid data type for computeSha256");
133
+ }
134
+ return this.#hashAsyncIteratorData(hasher, iteratorFunc).then(() => Bytes.of(hasher.digest()));
113
135
  }
114
136
  return Bytes.of(hasher.digest());
115
137
  }
@@ -7,7 +7,7 @@
7
7
 
8
8
  import { DerBigUint, DerCodec, DerError } from "#codec/DerCodec.js";
9
9
  import { Environment } from "#environment/Environment.js";
10
- import { ImplementationError } from "#MatterError.js";
10
+ import { ImplementationError, NotImplementedError } from "#MatterError.js";
11
11
  import { Bytes } from "#util/Bytes.js";
12
12
  import { MaybePromise } from "#util/Promises.js";
13
13
  import { describeList } from "#util/String.js";
@@ -96,10 +96,13 @@ export class StandardCrypto extends Crypto {
96
96
  });
97
97
  }
98
98
 
99
- computeSha256(buffer: Bytes | Bytes[]) {
99
+ computeSha256(buffer: Bytes | Bytes[] | ReadableStreamDefaultReader<Bytes> | AsyncIterator<Bytes>) {
100
100
  if (Array.isArray(buffer)) {
101
101
  buffer = Bytes.concat(...buffer);
102
102
  }
103
+ if (!Bytes.isBytes(buffer)) {
104
+ throw new NotImplementedError("Streamed SHA-256 computation is not supported in StandardCrypto");
105
+ }
103
106
  return this.#subtle.digest("SHA-256", Bytes.exclusive(buffer));
104
107
  }
105
108
 
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { InternalError } from "#MatterError.js";
7
8
  import { Instant } from "#time/TimeUnit.js";
8
9
  import { MaybePromise } from "#util/Promises.js";
9
10
  import { DiagnosticSource } from "../log/DiagnosticSource.js";
@@ -57,20 +58,39 @@ export class Environment {
57
58
  return mine !== undefined || (this.#parent?.has(type) ?? false);
58
59
  }
59
60
 
61
+ /**
62
+ * Determine if an environmental services is owned by this environment (not an ancestor).
63
+ */
64
+ owns(type: abstract new (...args: any[]) => any): boolean {
65
+ return !!this.#services?.get(type);
66
+ }
67
+
60
68
  /**
61
69
  * Access an environmental service.
62
70
  */
63
71
  get<T extends object>(type: abstract new (...args: any[]) => T): T {
64
- let instance = this.#services?.get(type) ?? this.#parent?.maybeGet(type);
72
+ const mine = this.#services?.get(type);
65
73
 
66
- if (instance !== undefined && instance !== null) {
67
- return instance as T;
74
+ if (mine !== undefined && mine !== null) {
75
+ return mine as T;
68
76
  }
69
77
 
70
- if (instance !== null) {
78
+ // When null then we do not have it and also do not want to inherit from parent
79
+ if (mine === undefined) {
80
+ let instance = this.#parent?.maybeGet(type);
81
+ if (instance !== undefined && instance !== null) {
82
+ // Parent has it, use it
83
+ return instance;
84
+ }
85
+
86
+ // ... otherwise try to create it
71
87
  if ((type as Environmental.Factory<T>)[Environmental.create]) {
72
- this.set(type, (instance = (type as any)[Environmental.create](this)));
73
- return instance as T;
88
+ instance = (type as any)[Environmental.create](this) as T;
89
+ if (!(instance instanceof type)) {
90
+ throw new InternalError(`Service creation did not produce instance of ${type.name}`);
91
+ }
92
+ this.set(type, instance);
93
+ return instance;
74
94
  }
75
95
  }
76
96
 
@@ -113,8 +133,17 @@ export class Environment {
113
133
  * @param type the class of the service to block
114
134
  */
115
135
  block(type: abstract new (...args: any[]) => any) {
116
- if (this.has(type)) {
117
- this.delete(type);
136
+ const instance = this.#services?.get(type);
137
+
138
+ if (instance !== undefined && instance !== null) {
139
+ this.#services?.delete(type);
140
+
141
+ this.#deleted.emit(type, instance);
142
+
143
+ const serviceEvents = this.#serviceEvents.get(type);
144
+ if (serviceEvents) {
145
+ serviceEvents.deleted.emit(instance);
146
+ }
118
147
  }
119
148
 
120
149
  this.#services?.set(type, null);
@@ -205,6 +234,35 @@ export class Environment {
205
234
  return events as Environmental.ServiceEvents<T>;
206
235
  }
207
236
 
237
+ /**
238
+ * Apply functions to a specific service type automatically.
239
+ *
240
+ * The environment invokes {@link added} immediately if the service is currently present. It then invokes
241
+ * {@link added} in the future if the service is added or replaced and/or {@link deleted} if the service is replaced
242
+ * or deleted.
243
+ */
244
+ applyTo<T extends Environmental.Factory<any>>(
245
+ type: T,
246
+ added?: (env: Environment, service: T) => MaybePromise<void>,
247
+ deleted?: (env: Environment, service: T) => MaybePromise<void>,
248
+ ) {
249
+ const events = this.eventsFor(type);
250
+
251
+ if (added) {
252
+ const existing = this.maybeGet(type);
253
+
254
+ if (existing) {
255
+ added(this, existing);
256
+ }
257
+
258
+ events.added.on(service => this.runtime.add(() => added(this, service)));
259
+ }
260
+
261
+ if (deleted) {
262
+ events.deleted.on(service => this.runtime.add(() => deleted(this, service)));
263
+ }
264
+ }
265
+
208
266
  /**
209
267
  * The default environment.
210
268
  *
@@ -27,7 +27,7 @@ export namespace Environmental {
27
27
  *
28
28
  * A "factory" is just a class with a static {@link create} method that performs instantiation.
29
29
  */
30
- export interface Factory<T extends object> {
30
+ export interface Factory<T extends object = object> {
31
31
  new (...args: any[]): T;
32
32
 
33
33
  /**
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { asError } from "#util/Error.js";
7
8
  import { Diagnostic } from "../log/Diagnostic.js";
8
9
  import { DiagnosticSource } from "../log/DiagnosticSource.js";
9
10
  import { Logger } from "../log/Logger.js";
@@ -36,7 +37,7 @@ export class RuntimeService implements Multiplex {
36
37
  }
37
38
 
38
39
  /**
39
- * Add a {@link Worker}.
40
+ * Add a {@link Worker}, either directly or by invoking an {@link Initiator}.
40
41
  *
41
42
  * The runtime considers itself "active" if there are one or more workers installed.
42
43
  *
@@ -46,11 +47,20 @@ export class RuntimeService implements Multiplex {
46
47
  * Once added, the {@link worker} is owned by the RuntimeService until closed, resolved or removed via
47
48
  * {@link delete}.
48
49
  */
49
- add(worker: RuntimeService.Worker | void) {
50
+ add(worker: RuntimeService.NewWorker) {
50
51
  if (!worker) {
51
52
  return;
52
53
  }
53
54
 
55
+ if (typeof worker === "function") {
56
+ try {
57
+ this.add(worker(this.#env));
58
+ } catch (e) {
59
+ this.#crash(asError(e));
60
+ }
61
+ return;
62
+ }
63
+
54
64
  if (this.#workers.has(worker)) {
55
65
  return;
56
66
  }
@@ -303,4 +313,13 @@ export namespace RuntimeService {
303
313
  */
304
314
  [label]?: unknown;
305
315
  }
316
+
317
+ /**
318
+ * A function that initiates work.
319
+ */
320
+ export interface Initiator {
321
+ (env: Environment): NewWorker;
322
+ }
323
+
324
+ export type NewWorker = Worker | Initiator | void;
306
325
  }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { Diagnostic } from "#log/Diagnostic.js";
8
+ import { NetworkError } from "./Network.js";
9
+
10
+ export class InvalidAppAddress extends NetworkError {}
11
+
12
+ /**
13
+ * An application network address.
14
+ *
15
+ * This is an OSI layer 7 address representable as an object or URL.
16
+ */
17
+ export class AppAddress extends URL {
18
+ constructor(definition: AppAddress.Definition) {
19
+ if (typeof definition === "object" && !(definition instanceof URL)) {
20
+ let protocol = definition.appProtocol;
21
+ let host;
22
+ if (definition.tls) {
23
+ protocol += "s";
24
+ }
25
+ if (definition.transport.kind === "unix") {
26
+ protocol += "+unix";
27
+ host = encodeURIComponent(definition.transport.path);
28
+ } else {
29
+ host = definition.transport.host;
30
+ if (definition.transport.port) {
31
+ host = `${host}:${definition.transport.port}`;
32
+ }
33
+ }
34
+ const path = definition.path ?? "/";
35
+ definition = `${protocol}://${host}${path}`;
36
+ }
37
+ try {
38
+ super(definition);
39
+ } catch (e) {
40
+ if (e instanceof SyntaxError) {
41
+ throw new InvalidAppAddress(`Invalid app address:${e.message}`);
42
+ }
43
+ throw e;
44
+ }
45
+ }
46
+
47
+ get [Diagnostic.value]() {
48
+ return this.toString();
49
+ }
50
+
51
+ get appProtocol() {
52
+ return this.protocol.replace(/[:+].*$/, "");
53
+ }
54
+
55
+ get isTls() {
56
+ switch (this.appProtocol) {
57
+ case "https":
58
+ case "mqtts":
59
+ case "wss":
60
+ return true;
61
+
62
+ case "mqtt":
63
+ // MQTT over WebSockets over TLS
64
+ return this.protocolModifiers.includes("wss");
65
+ }
66
+ return false;
67
+ }
68
+
69
+ get protocolModifiers() {
70
+ const segments = this.protocol.replace(/:$/, "").split("+");
71
+ segments.shift();
72
+ return segments;
73
+ }
74
+
75
+ get transport(): AppAddress.TransportAddress {
76
+ if (this.protocolModifiers.includes("unix")) {
77
+ return {
78
+ kind: "unix",
79
+ path: decodeURIComponent(this.hostname),
80
+ };
81
+ }
82
+
83
+ return {
84
+ kind: "ip",
85
+ host: this.hostname,
86
+ port: this.portNum,
87
+ };
88
+ }
89
+
90
+ get portNum() {
91
+ if (this.port !== "") {
92
+ return Number(this.port);
93
+ }
94
+ return 0;
95
+ }
96
+
97
+ get isWildcardHost() {
98
+ return this.host === "0.0.0.0" || this.host === "::";
99
+ }
100
+
101
+ get isWildcardPort() {
102
+ return this.port === "0";
103
+ }
104
+
105
+ static for(definition: AppAddress.Definition) {
106
+ if (definition instanceof AppAddress) {
107
+ return definition;
108
+ }
109
+
110
+ return new AppAddress(definition);
111
+ }
112
+ }
113
+
114
+ export namespace AppAddress {
115
+ export type Definition = Object | URL | string;
116
+
117
+ export type TransportAddress = IpTransportAddress | UnixSocketTransportAddress;
118
+
119
+ export interface IpTransportAddress {
120
+ kind: "ip";
121
+ host: string;
122
+ port: number;
123
+ }
124
+
125
+ export interface UnixSocketTransportAddress {
126
+ kind: "unix";
127
+ path: string;
128
+ }
129
+
130
+ export interface Object {
131
+ appProtocol: string;
132
+ transport: TransportAddress;
133
+ tls?: boolean;
134
+ path?: string;
135
+ }
136
+ }
@@ -3,7 +3,7 @@
3
3
  * Copyright 2022-2025 Matter.js Authors
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { ServerAddressIp } from "#net/ServerAddress.js";
6
+ import { ServerAddressUdp } from "#net/ServerAddress.js";
7
7
  import { isObject } from "#util/Type.js";
8
8
 
9
9
  export enum ChannelType {
@@ -32,7 +32,7 @@ export interface Channel<T> {
32
32
  }
33
33
 
34
34
  export interface IpNetworkChannel<T> extends Channel<T> {
35
- networkAddress: ServerAddressIp;
35
+ networkAddress: ServerAddressUdp;
36
36
  }
37
37
 
38
38
  export function isIpNetworkChannel<T>(channel: Channel<T>): channel is IpNetworkChannel<T> {
@@ -9,18 +9,19 @@ import { Environmental } from "#environment/Environmental.js";
9
9
  import { Bytes } from "#util/Bytes.js";
10
10
  import { BasicSet } from "#util/Set.js";
11
11
  import { Channel, ChannelType } from "./Channel.js";
12
+ import { ServerAddress } from "./ServerAddress.js";
12
13
 
13
14
  /**
14
- * A TransportInterface is a generic interface for sending and receiving data on an established incoming connection.
15
- * It cannot open new connections.
15
+ * A local network endpoint associated with a specific {@link ServerAddress} for a connectionless protocol.
16
16
  */
17
- export interface TransportInterface {
18
- onData(listener: (socket: Channel<Bytes>, data: Bytes) => void): TransportInterface.Listener;
17
+ export interface ConnectionlessTransport {
18
+ onData(listener: (socket: Channel<Bytes>, data: Bytes) => void): ConnectionlessTransport.Listener;
19
19
  close(): Promise<void>;
20
20
  supports(type: ChannelType, address?: string): boolean;
21
+ openChannel(address: ServerAddress): Promise<Channel<Bytes>>;
21
22
  }
22
23
 
23
- export namespace TransportInterface {
24
+ export namespace ConnectionlessTransport {
24
25
  export interface Listener {
25
26
  close(): Promise<void>;
26
27
  }
@@ -29,14 +30,16 @@ export namespace TransportInterface {
29
30
  /**
30
31
  * A collection of {@link TransportInterfaces} managed as a unit.
31
32
  */
32
- export class TransportInterfaceSet<T extends TransportInterface = TransportInterface> extends BasicSet<T> {
33
+ export class ConnectionlessTransportSet<
34
+ T extends ConnectionlessTransport = ConnectionlessTransport,
35
+ > extends BasicSet<T> {
33
36
  constructor(...initialInterfaces: T[]) {
34
37
  super(...initialInterfaces);
35
38
  }
36
39
 
37
40
  static [Environmental.create](env: Environment) {
38
- const instance = new TransportInterfaceSet();
39
- env.set(TransportInterfaceSet, instance);
41
+ const instance = new ConnectionlessTransportSet();
42
+ env.set(ConnectionlessTransportSet, instance);
40
43
  return instance;
41
44
  }
42
45
 
@@ -47,6 +50,7 @@ export class TransportInterfaceSet<T extends TransportInterface = TransportInter
47
50
  for (const transportInterface of this) {
48
51
  await transportInterface.close();
49
52
  }
53
+ this.clear();
50
54
  }
51
55
 
52
56
  /**
@@ -5,8 +5,8 @@
5
5
  */
6
6
 
7
7
  import { MatterError } from "../MatterError.js";
8
- import { MaybePromise } from "../util/Promises.js";
9
- import { UdpChannel, UdpChannelOptions } from "./UdpChannel.js";
8
+ import type { MaybePromise } from "../util/Promises.js";
9
+ import type { UdpChannel, UdpChannelOptions } from "./udp/UdpChannel.js";
10
10
 
11
11
  export class NetworkError extends MatterError {}
12
12