@matter/general 0.15.1 → 0.15.2-alpha.0-20250704-2715344f0

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 (135) hide show
  1. package/dist/cjs/MatterError.d.ts +5 -0
  2. package/dist/cjs/MatterError.d.ts.map +1 -1
  3. package/dist/cjs/MatterError.js +3 -0
  4. package/dist/cjs/MatterError.js.map +1 -1
  5. package/dist/cjs/crypto/MockCrypto.d.ts +4 -0
  6. package/dist/cjs/crypto/MockCrypto.d.ts.map +1 -1
  7. package/dist/cjs/crypto/MockCrypto.js +37 -18
  8. package/dist/cjs/crypto/MockCrypto.js.map +1 -1
  9. package/dist/cjs/log/Diagnostic.js +8 -1
  10. package/dist/cjs/log/Diagnostic.js.map +1 -1
  11. package/dist/cjs/net/UdpChannel.d.ts +6 -1
  12. package/dist/cjs/net/UdpChannel.d.ts.map +1 -1
  13. package/dist/cjs/net/index.d.ts +1 -3
  14. package/dist/cjs/net/index.d.ts.map +1 -1
  15. package/dist/cjs/net/index.js +1 -3
  16. package/dist/cjs/net/index.js.map +1 -1
  17. package/dist/cjs/net/mock/MockNetwork.d.ts +8 -1
  18. package/dist/cjs/net/mock/MockNetwork.d.ts.map +1 -1
  19. package/dist/cjs/net/mock/MockNetwork.js +17 -8
  20. package/dist/cjs/net/mock/MockNetwork.js.map +1 -1
  21. package/dist/cjs/net/mock/MockRouter.d.ts +28 -0
  22. package/dist/cjs/net/mock/MockRouter.d.ts.map +1 -0
  23. package/dist/cjs/net/mock/MockRouter.js +46 -0
  24. package/dist/cjs/net/mock/MockRouter.js.map +6 -0
  25. package/dist/cjs/net/mock/MockUdpChannel.d.ts +6 -5
  26. package/dist/cjs/net/mock/MockUdpChannel.d.ts.map +1 -1
  27. package/dist/cjs/net/mock/MockUdpChannel.js +47 -21
  28. package/dist/cjs/net/mock/MockUdpChannel.js.map +1 -1
  29. package/dist/cjs/net/mock/NetworkSimulator.d.ts +6 -5
  30. package/dist/cjs/net/mock/NetworkSimulator.d.ts.map +1 -1
  31. package/dist/cjs/net/mock/NetworkSimulator.js +2 -37
  32. package/dist/cjs/net/mock/NetworkSimulator.js.map +1 -1
  33. package/dist/cjs/net/mock/index.d.ts +10 -0
  34. package/dist/cjs/net/mock/index.d.ts.map +1 -0
  35. package/dist/cjs/net/mock/index.js +27 -0
  36. package/dist/cjs/net/mock/index.js.map +6 -0
  37. package/dist/cjs/storage/StorageBackendMemory.d.ts.map +1 -1
  38. package/dist/cjs/storage/StorageBackendMemory.js +12 -6
  39. package/dist/cjs/storage/StorageBackendMemory.js.map +1 -1
  40. package/dist/cjs/time/Time.d.ts +7 -1
  41. package/dist/cjs/time/Time.d.ts.map +1 -1
  42. package/dist/cjs/time/Time.js +19 -7
  43. package/dist/cjs/time/Time.js.map +1 -1
  44. package/dist/cjs/util/Cancelable.d.ts +1 -1
  45. package/dist/cjs/util/Cancelable.d.ts.map +1 -1
  46. package/dist/cjs/util/Cancelable.js +1 -1
  47. package/dist/cjs/util/Cancelable.js.map +1 -1
  48. package/dist/cjs/util/Construction.d.ts +2 -0
  49. package/dist/cjs/util/Construction.d.ts.map +1 -1
  50. package/dist/cjs/util/Construction.js +9 -3
  51. package/dist/cjs/util/Construction.js.map +1 -1
  52. package/dist/cjs/util/Promises.d.ts +2 -3
  53. package/dist/cjs/util/Promises.d.ts.map +1 -1
  54. package/dist/cjs/util/Promises.js +1 -5
  55. package/dist/cjs/util/Promises.js.map +1 -1
  56. package/dist/cjs/util/String.d.ts +5 -0
  57. package/dist/cjs/util/String.d.ts.map +1 -1
  58. package/dist/cjs/util/String.js +51 -1
  59. package/dist/cjs/util/String.js.map +2 -2
  60. package/dist/esm/MatterError.d.ts +5 -0
  61. package/dist/esm/MatterError.d.ts.map +1 -1
  62. package/dist/esm/MatterError.js +3 -0
  63. package/dist/esm/MatterError.js.map +1 -1
  64. package/dist/esm/crypto/MockCrypto.d.ts +4 -0
  65. package/dist/esm/crypto/MockCrypto.d.ts.map +1 -1
  66. package/dist/esm/crypto/MockCrypto.js +37 -18
  67. package/dist/esm/crypto/MockCrypto.js.map +1 -1
  68. package/dist/esm/log/Diagnostic.js +8 -1
  69. package/dist/esm/log/Diagnostic.js.map +1 -1
  70. package/dist/esm/net/UdpChannel.d.ts +6 -1
  71. package/dist/esm/net/UdpChannel.d.ts.map +1 -1
  72. package/dist/esm/net/index.d.ts +1 -3
  73. package/dist/esm/net/index.d.ts.map +1 -1
  74. package/dist/esm/net/index.js +1 -3
  75. package/dist/esm/net/index.js.map +1 -1
  76. package/dist/esm/net/mock/MockNetwork.d.ts +8 -1
  77. package/dist/esm/net/mock/MockNetwork.d.ts.map +1 -1
  78. package/dist/esm/net/mock/MockNetwork.js +18 -9
  79. package/dist/esm/net/mock/MockNetwork.js.map +1 -1
  80. package/dist/esm/net/mock/MockRouter.d.ts +28 -0
  81. package/dist/esm/net/mock/MockRouter.d.ts.map +1 -0
  82. package/dist/esm/net/mock/MockRouter.js +26 -0
  83. package/dist/esm/net/mock/MockRouter.js.map +6 -0
  84. package/dist/esm/net/mock/MockUdpChannel.d.ts +6 -5
  85. package/dist/esm/net/mock/MockUdpChannel.d.ts.map +1 -1
  86. package/dist/esm/net/mock/MockUdpChannel.js +47 -21
  87. package/dist/esm/net/mock/MockUdpChannel.js.map +1 -1
  88. package/dist/esm/net/mock/NetworkSimulator.d.ts +6 -5
  89. package/dist/esm/net/mock/NetworkSimulator.d.ts.map +1 -1
  90. package/dist/esm/net/mock/NetworkSimulator.js +2 -37
  91. package/dist/esm/net/mock/NetworkSimulator.js.map +1 -1
  92. package/dist/esm/net/mock/index.d.ts +10 -0
  93. package/dist/esm/net/mock/index.d.ts.map +1 -0
  94. package/dist/esm/net/mock/index.js +10 -0
  95. package/dist/esm/net/mock/index.js.map +6 -0
  96. package/dist/esm/storage/StorageBackendMemory.d.ts.map +1 -1
  97. package/dist/esm/storage/StorageBackendMemory.js +12 -6
  98. package/dist/esm/storage/StorageBackendMemory.js.map +1 -1
  99. package/dist/esm/time/Time.d.ts +7 -1
  100. package/dist/esm/time/Time.d.ts.map +1 -1
  101. package/dist/esm/time/Time.js +19 -7
  102. package/dist/esm/time/Time.js.map +1 -1
  103. package/dist/esm/util/Cancelable.d.ts +1 -1
  104. package/dist/esm/util/Cancelable.d.ts.map +1 -1
  105. package/dist/esm/util/Cancelable.js +2 -2
  106. package/dist/esm/util/Cancelable.js.map +1 -1
  107. package/dist/esm/util/Construction.d.ts +2 -0
  108. package/dist/esm/util/Construction.d.ts.map +1 -1
  109. package/dist/esm/util/Construction.js +9 -3
  110. package/dist/esm/util/Construction.js.map +1 -1
  111. package/dist/esm/util/Promises.d.ts +2 -3
  112. package/dist/esm/util/Promises.d.ts.map +1 -1
  113. package/dist/esm/util/Promises.js +2 -6
  114. package/dist/esm/util/Promises.js.map +1 -1
  115. package/dist/esm/util/String.d.ts +5 -0
  116. package/dist/esm/util/String.d.ts.map +1 -1
  117. package/dist/esm/util/String.js +51 -1
  118. package/dist/esm/util/String.js.map +2 -2
  119. package/package.json +2 -2
  120. package/src/MatterError.ts +5 -0
  121. package/src/crypto/MockCrypto.ts +48 -20
  122. package/src/log/Diagnostic.ts +10 -1
  123. package/src/net/UdpChannel.ts +7 -3
  124. package/src/net/index.ts +1 -3
  125. package/src/net/mock/MockNetwork.ts +19 -9
  126. package/src/net/mock/MockRouter.ts +48 -0
  127. package/src/net/mock/MockUdpChannel.ts +55 -26
  128. package/src/net/mock/NetworkSimulator.ts +2 -46
  129. package/src/net/mock/index.ts +10 -0
  130. package/src/storage/StorageBackendMemory.ts +14 -6
  131. package/src/time/Time.ts +17 -2
  132. package/src/util/Cancelable.ts +3 -3
  133. package/src/util/Construction.ts +18 -4
  134. package/src/util/Promises.ts +2 -7
  135. package/src/util/String.ts +66 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Promises.d.ts","sourceRoot":"","sources":["../../../src/util/Promises.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAiB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG/D;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,KAAK;IAChC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CACpC,CAiBA;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAsBvF;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;gBACpC,OAAO,SAAwB;CAG9C;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,MAAM,CAAC,EAAE,eAAe,GAAG,CAAC,MAAM,IAAI,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAoDZ;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAE5D,eAAO,MAAM,YAAY;IACrB;;OAEG;OACA,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC;IAUtD;;;OAGG;SACE,CAAC,EAAE,EAAE,UAAU,EAAE,oBACR,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,YACzC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,WACxC,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GACnD,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;IAsCxB;;OAEG;UACG,CAAC,EAAE,OAAO,oBACF,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,eACtC,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAKhE;;OAEG;YACK,CAAC,YACK,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,cACvC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAC9C,YAAY,CAAC,CAAC,CAAC;;CA4DrB,CAAC"}
1
+ {"version":3,"file":"Promises.d.ts","sourceRoot":"","sources":["../../../src/util/Promises.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAiB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGhE;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,KAAK;IAChC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CACpC,CAiBA;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAsBvF;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;CAAG;AAExD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,MAAM,CAAC,EAAE,eAAe,GAAG,CAAC,MAAM,IAAI,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAmDZ;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAE5D,eAAO,MAAM,YAAY;IACrB;;OAEG;OACA,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC;IAUtD;;;OAGG;SACE,CAAC,EAAE,EAAE,UAAU,EAAE,oBACR,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,YACzC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,WACxC,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GACnD,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;IAsCxB;;OAEG;UACG,CAAC,EAAE,OAAO,oBACF,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,eACtC,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAKhE;;OAEG;YACK,CAAC,YACK,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,cACvC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAC9C,YAAY,CAAC,CAAC,CAAC;;CA4DrB,CAAC"}
@@ -6,7 +6,7 @@
6
6
  * SPDX-License-Identifier: Apache-2.0
7
7
  */
8
8
  import { asError } from "#util/Error.js";
9
- import { InternalError, MatterError } from "../MatterError.js";
9
+ import { InternalError, TimeoutError } from "../MatterError.js";
10
10
  import { Time } from "../time/Time.js";
11
11
  function createPromise() {
12
12
  let resolver, rejecter;
@@ -43,10 +43,7 @@ function anyPromise(promises) {
43
43
  }
44
44
  });
45
45
  }
46
- class PromiseTimeoutError extends MatterError {
47
- constructor(message = "Operation timed out") {
48
- super(message);
49
- }
46
+ class PromiseTimeoutError extends TimeoutError {
50
47
  }
51
48
  async function withTimeout(timeoutMs, promise, cancel) {
52
49
  let cancelFn;
@@ -68,7 +65,6 @@ async function withTimeout(timeoutMs, promise, cancel) {
68
65
  reject(asError(e));
69
66
  return;
70
67
  }
71
- reject(new Error("Timer canceled promise, but no error was thrown"));
72
68
  });
73
69
  cancelTimer = () => {
74
70
  timer.stop();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/util/Promises.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -36,4 +36,9 @@ export declare namespace serialize {
36
36
  * Create a human readable version of a list of items.
37
37
  */
38
38
  export declare function describeList(setType: "and" | "or", ...entries: string[]): string;
39
+ /**
40
+ * Serialize a structure to JS code that will recreate it. Supports a limited number of JS types. Makes no effort at
41
+ * pretty printing.
42
+ */
43
+ export declare function serializeToJs(value: unknown): string;
39
44
  //# sourceMappingURL=String.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"String.d.ts","sourceRoot":"","sources":["../../../src/util/String.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GACE,UAAU,CAAC,CAAC,CAAC,CAClE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,UAAQ,UA8DxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAM,UAgBvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,sBA8EnC;AAED,yBAAiB,SAAS,CAAC;IACvB;;OAEG;IACI,MAAM,SAAS,eAAsB,CAAC;IAE7C;;;OAGG;IACH,SAAgB,IAAI,CAAC,KAAK,EAAE,GAAG,OAU9B;IAED;;OAEG;IACH,SAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,WAgBrC;CACJ;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,UAkBvE"}
1
+ {"version":3,"file":"String.d.ts","sourceRoot":"","sources":["../../../src/util/String.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GACE,UAAU,CAAC,CAAC,CAAC,CAClE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,UAAQ,UA8DxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAM,UAgBvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,sBA8EnC;AAED,yBAAiB,SAAS,CAAC;IACvB;;OAEG;IACI,MAAM,SAAS,eAAsB,CAAC;IAE7C;;;OAGG;IACH,SAAgB,IAAI,CAAC,KAAK,EAAE,GAAG,OAU9B;IAED;;OAEG;IACH,SAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,WAgBrC;CACJ;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,UAkBvE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,UAwD3C"}
@@ -3,6 +3,9 @@
3
3
  * Copyright 2022-2025 Matter.js Authors
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
+ import { ImplementationError } from "#MatterError.js";
7
+ import { Bytes } from "./Bytes.js";
8
+ import { isObject } from "./Type.js";
6
9
  function capitalize(text) {
7
10
  return text[0].toUpperCase() + text.slice(1);
8
11
  }
@@ -178,11 +181,58 @@ function describeList(setType, ...entries) {
178
181
  }
179
182
  return text.join(" ");
180
183
  }
184
+ function serializeToJs(value) {
185
+ switch (typeof value) {
186
+ case "bigint":
187
+ return `0x${value.toString(16)}n`;
188
+ case "boolean":
189
+ return `${value}`;
190
+ case "number":
191
+ if (Number.isSafeInteger(value) && value > 10) {
192
+ return `0x${value.toString(16)}`;
193
+ }
194
+ return `${value}`;
195
+ case "string":
196
+ return JSON.stringify(value);
197
+ case "undefined":
198
+ return "undefined";
199
+ case "function":
200
+ case "symbol":
201
+ throw new ImplementationError(`Cannot serialize a ${typeof value}`);
202
+ }
203
+ if (value instanceof Date) {
204
+ return `new Date(${JSON.stringify(value.toISOString)})`;
205
+ }
206
+ if (value instanceof Uint8Array) {
207
+ return `b$\`${Bytes.toHex(value)}\``;
208
+ }
209
+ if (value === null) {
210
+ return "null";
211
+ }
212
+ if (Array.isArray(value)) {
213
+ const parts2 = ["["];
214
+ for (const item of value) {
215
+ parts2.push(serializeToJs(item), ",");
216
+ }
217
+ parts2.push("]");
218
+ return parts2.join("");
219
+ }
220
+ if (!isObject(value)) {
221
+ throw new ImplementationError(`Cannot serialize a ${value.constructor.name}`);
222
+ }
223
+ const parts = ["{"];
224
+ for (const key in value) {
225
+ parts.push(key, ":", serializeToJs(value[key]), ",");
226
+ }
227
+ parts.push("}");
228
+ return parts.join("");
229
+ }
181
230
  export {
182
231
  camelize,
183
232
  capitalize,
184
233
  decamelize,
185
234
  describeList,
186
- serialize
235
+ serialize,
236
+ serializeToJs
187
237
  };
188
238
  //# sourceMappingURL=String.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/util/String.ts"],
4
- "mappings": "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",
5
- "names": ["value", "serialize"]
4
+ "mappings": "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",
5
+ "names": ["value", "serialize", "parts"]
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/general",
3
- "version": "0.15.1",
3
+ "version": "0.15.2-alpha.0-20250704-2715344f0",
4
4
  "description": "Non-Matter support for Matter.js",
5
5
  "keywords": [
6
6
  "iot",
@@ -36,7 +36,7 @@
36
36
  "@noble/curves": "^1.9.2"
37
37
  },
38
38
  "devDependencies": {
39
- "@matter/testing": "0.15.1"
39
+ "@matter/testing": "0.15.2-alpha.0-20250704-2715344f0"
40
40
  },
41
41
  "files": [
42
42
  "dist/**/*",
@@ -170,6 +170,11 @@ export class UnexpectedDataError extends MatterError {}
170
170
  */
171
171
  export class ImplementationError extends MatterError {}
172
172
 
173
+ /**
174
+ * Thrown when a dynamic component cannot be loaded.
175
+ */
176
+ export class ImportError extends MatterError {}
177
+
173
178
  /**
174
179
  * Thrown for write attempts against immutable data.
175
180
  */
@@ -24,6 +24,11 @@ export interface MockCrypto extends Crypto {
24
24
  * The index of the random space. May be modified to adjust computations going forward.
25
25
  */
26
26
  index: number;
27
+
28
+ /**
29
+ * Control whether the implementation supplies normal randomness (false by default).
30
+ */
31
+ entropic: boolean;
27
32
  }
28
33
 
29
34
  export function MockCrypto(index: number = 0x80, implementation: new () => Crypto = StandardCrypto) {
@@ -33,32 +38,55 @@ export function MockCrypto(index: number = 0x80, implementation: new () => Crypt
33
38
 
34
39
  const crypto = new implementation();
35
40
 
36
- // Create random data consisting of index repeated
37
- crypto.randomBytes = function getRandomDataNONENTROPIC(length) {
38
- const result = new Uint8Array(length);
39
- result.fill(index);
40
- return result;
41
- };
41
+ const { randomBytes, createKeyPair } = crypto;
42
42
 
43
- // Ensure EC key generation uses our own "entropy" source rather than the platform's
44
- crypto.createKeyPair = function getRandomDataNONENTROPIC() {
45
- const privateBits = ec.mapHashToField(new Uint8Array(crypto.randomBytes(48)), ec.p256.CURVE.n);
46
- return Key({
47
- kty: KeyType.EC,
48
- crv: CurveType.p256,
49
- privateBits,
50
- }) as PrivateKey;
51
- };
43
+ Object.defineProperties(crypto, {
44
+ index: {
45
+ get() {
46
+ return index;
47
+ },
52
48
 
53
- Object.defineProperty(crypto, "index", {
54
- get() {
55
- return index;
49
+ set(newIndex: number) {
50
+ index = newIndex % 256;
51
+ },
56
52
  },
57
53
 
58
- set(newIndex: number) {
59
- index = newIndex % 256;
54
+ entropic: {
55
+ get() {
56
+ return crypto.randomBytes === randomBytes;
57
+ },
58
+
59
+ set(entropic: boolean) {
60
+ if (entropic) {
61
+ crypto.randomBytes = randomBytes;
62
+ crypto.createKeyPair = createKeyPair;
63
+ } else {
64
+ disableEntropy();
65
+ }
66
+ },
60
67
  },
61
68
  });
62
69
 
70
+ disableEntropy();
71
+
63
72
  return crypto as MockCrypto;
73
+
74
+ function disableEntropy() {
75
+ // Create random data consisting of index repeated
76
+ crypto.randomBytes = function getRandomDataNONENTROPIC(length) {
77
+ const result = new Uint8Array(length);
78
+ result.fill(index);
79
+ return result;
80
+ };
81
+
82
+ // Ensure EC key generation uses our own "entropy" source rather than the platform's
83
+ crypto.createKeyPair = function getRandomDataNONENTROPIC() {
84
+ const privateBits = ec.mapHashToField(new Uint8Array(crypto.randomBytes(48)), ec.p256.CURVE.n);
85
+ return Key({
86
+ kty: KeyType.EC,
87
+ crv: CurveType.p256,
88
+ privateBits,
89
+ }) as PrivateKey;
90
+ };
91
+ }
64
92
  }
@@ -569,8 +569,12 @@ function formatError(error: any, options: { messagePrefix?: string; parentStack?
569
569
  Diagnostic(Diagnostic.Presentation.Error, Diagnostic.squash(...messageDiagnostic)),
570
570
  );
571
571
 
572
- let cause, errors;
572
+ let cause, errors, secondary;
573
573
  if (typeof error === "object" && error !== null) {
574
+ if ("error" in error && "suppressed" in error) {
575
+ secondary = error.error;
576
+ error = error.suppressed;
577
+ }
574
578
  ({ cause, errors } = error);
575
579
  }
576
580
 
@@ -618,5 +622,10 @@ function formatError(error: any, options: { messagePrefix?: string; parentStack?
618
622
  );
619
623
  }
620
624
 
625
+ // We also render secondary errors from suppressed errors as subordinate to the parent.
626
+ if (secondary) {
627
+ list.push(Diagnostic.list([formatError(secondary, { messagePrefix: "Secondary error during disposal:" })]));
628
+ }
629
+
621
630
  return list as Diagnostic;
622
631
  }
@@ -24,11 +24,15 @@ export interface UdpChannel {
24
24
  maxPayloadSize: number;
25
25
  addMembership(address: string): MaybePromise<void>;
26
26
  dropMembership(address: string): MaybePromise<void>;
27
- onData(
28
- listener: (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Uint8Array) => void,
29
- ): TransportInterface.Listener;
27
+ onData(listener: UdpChannel.Callback): TransportInterface.Listener;
30
28
  send(host: string, port: number, data: Uint8Array): Promise<void>;
31
29
  close(): Promise<void>;
32
30
  get port(): number;
33
31
  supports(type: ChannelType, address?: string): boolean;
34
32
  }
33
+
34
+ export namespace UdpChannel {
35
+ export interface Callback {
36
+ (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Uint8Array): void;
37
+ }
38
+ }
package/src/net/index.ts CHANGED
@@ -5,9 +5,7 @@
5
5
  */
6
6
 
7
7
  export * from "./Channel.js";
8
- export * from "./mock/MockNetwork.js";
9
- export * from "./mock/MockUdpChannel.js";
10
- export * from "./mock/NetworkSimulator.js";
8
+ export * from "./mock/index.js";
11
9
  export * from "./NetInterface.js";
12
10
  export * from "./Network.js";
13
11
  export * from "./ServerAddress.js";
@@ -6,23 +6,26 @@
6
6
 
7
7
  import { ChannelType } from "#net/Channel.js";
8
8
  import { isIPv4 } from "../../util/Ip.js";
9
- import { Network, NetworkInterface, NetworkInterfaceDetails } from "../Network.js";
9
+ import { Network, NetworkError, NetworkInterface, NetworkInterfaceDetails } from "../Network.js";
10
10
  import { UdpChannelOptions } from "../UdpChannel.js";
11
+ import { MockRouter } from "./MockRouter.js";
11
12
  import { MockUdpChannel } from "./MockUdpChannel.js";
12
13
  import type { NetworkSimulator } from "./NetworkSimulator.js";
13
14
 
14
15
  export class MockNetwork extends Network {
16
+ readonly router = MockRouter();
15
17
  readonly #simulator: NetworkSimulator;
16
- readonly #mac: string;
17
- readonly #ipV4: string[];
18
- readonly #ipV6: string[];
18
+ readonly #intf: NetworkInterfaceDetails;
19
19
 
20
20
  constructor(simulator: NetworkSimulator, mac: string, ips: string[]) {
21
21
  super();
22
22
  this.#simulator = simulator;
23
- this.#mac = mac;
24
- this.#ipV4 = ips.filter(ip => isIPv4(ip));
25
- this.#ipV6 = ips.filter(ip => !isIPv4(ip));
23
+ this.#intf = {
24
+ mac,
25
+ ipV4: ips.filter(ip => isIPv4(ip)),
26
+ ipV6: ips.filter(ip => !isIPv4(ip)),
27
+ };
28
+ this.#simulator.router.add(this.router);
26
29
  }
27
30
 
28
31
  get simulator() {
@@ -33,8 +36,11 @@ export class MockNetwork extends Network {
33
36
  return [{ name: "fake0" }];
34
37
  }
35
38
 
36
- getIpMac(_netInterface: string): NetworkInterfaceDetails {
37
- return { mac: this.#mac, ipV4: this.#ipV4, ipV6: this.#ipV6 };
39
+ getIpMac(name: string): NetworkInterfaceDetails {
40
+ if (name !== "fake0") {
41
+ throw new NetworkError(`No such interface ${name}`);
42
+ }
43
+ return this.#intf;
38
44
  }
39
45
 
40
46
  override createUdpChannel(options: UdpChannelOptions) {
@@ -44,4 +50,8 @@ export class MockNetwork extends Network {
44
50
  supports(type: ChannelType, _address: string) {
45
51
  return type === ChannelType.UDP;
46
52
  }
53
+
54
+ override async close() {
55
+ this.#simulator.router.delete(this.router);
56
+ }
47
57
  }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { Logger } from "#log/Logger.js";
8
+
9
+ const logger = Logger.get("MockRouter");
10
+
11
+ export interface MockRouter extends MockRouter.Route {
12
+ add(route: MockRouter.Route): void;
13
+ delete(route: MockRouter.Route): void;
14
+ }
15
+
16
+ export function MockRouter() {
17
+ const routes = new Set<MockRouter.Route>();
18
+
19
+ const router = function router(packet: MockRouter.Packet) {
20
+ for (const route of routes) {
21
+ try {
22
+ route(packet);
23
+ } catch (e) {
24
+ logger.error("Unhandled error in network listener", e);
25
+ }
26
+ }
27
+ };
28
+
29
+ router.add = routes.add.bind(routes);
30
+ router.delete = routes.delete.bind(routes);
31
+
32
+ return router;
33
+ }
34
+
35
+ export namespace MockRouter {
36
+ export interface Packet {
37
+ kind: "udp";
38
+ sourceAddress: string;
39
+ sourcePort: number;
40
+ destAddress: string;
41
+ destPort: number;
42
+ payload: Uint8Array;
43
+ }
44
+
45
+ export interface Route {
46
+ (packet: Packet): void;
47
+ }
48
+ }
@@ -6,46 +6,75 @@
6
6
 
7
7
  import { ChannelType } from "#net/Channel.js";
8
8
  import { NetworkError } from "../Network.js";
9
- import { TransportInterface } from "../TransportInterface.js";
10
9
  import { MAX_UDP_MESSAGE_SIZE, UdpChannel, UdpChannelOptions } from "../UdpChannel.js";
11
10
  import { MockNetwork } from "./MockNetwork.js";
12
- import { NetworkSimulator } from "./NetworkSimulator.js";
11
+ import { MockRouter } from "./MockRouter.js";
13
12
 
14
13
  export class MockUdpChannel implements UdpChannel {
15
- readonly #netListeners = new Array<TransportInterface.Listener>();
16
- readonly #simulatedNetwork: NetworkSimulator;
17
- readonly #listeningAddress?: string;
18
- readonly #localAddress: string;
14
+ readonly #host: MockNetwork;
15
+ readonly #router = MockRouter();
16
+ readonly #sendFrom: string;
17
+ readonly #receiveFrom: Set<string>;
19
18
  readonly #listeningPort: number;
20
19
  readonly maxPayloadSize = MAX_UDP_MESSAGE_SIZE;
21
20
 
22
21
  constructor(network: MockNetwork, { listeningAddress, listeningPort, netInterface, type }: UdpChannelOptions) {
23
22
  const { ipV4, ipV6 } = network.getIpMac(netInterface ?? "fake0");
24
- const localAddress = type === "udp4" ? ipV4[0] : (ipV6[0] ?? ipV4[0]);
25
- if (localAddress === undefined) {
26
- throw new NetworkError("No matching IP on the specified interface");
23
+ let addresses = type === "udp4" ? ipV4 : ipV6;
24
+
25
+ this.#sendFrom = addresses[0];
26
+
27
+ if (listeningAddress !== undefined && listeningAddress !== "*") {
28
+ addresses = addresses.filter(addr => addr === listeningAddress);
27
29
  }
28
- this.#localAddress = localAddress;
29
- this.#simulatedNetwork = network.simulator;
30
- this.#listeningAddress = listeningAddress;
30
+
31
+ if (!addresses.length) {
32
+ throw new NetworkError(`No ${type} IP matches ${listeningAddress ?? "*"} on the specified interface`);
33
+ }
34
+
35
+ this.#host = network;
36
+ this.#receiveFrom = new Set(addresses);
31
37
  this.#listeningPort = listeningPort ?? 1024 + Math.floor(Math.random() * 64511); // Random port 1024-65535
38
+
39
+ network.router.add(this.#router);
32
40
  }
33
41
 
34
- onData(listener: (netInterface: string, peerAddress: string, peerPort: number, data: Uint8Array) => void) {
35
- const netListener = this.#simulatedNetwork.onUdpData(this.#listeningAddress, this.#listeningPort, listener);
36
- this.#netListeners.push(netListener);
37
- return netListener;
42
+ onData(listener: UdpChannel.Callback) {
43
+ const router = (packet: MockRouter.Packet) => {
44
+ if (packet.kind !== "udp") {
45
+ return;
46
+ }
47
+ if (!this.#receiveFrom.has(packet.destAddress)) {
48
+ return;
49
+ }
50
+ if (packet.destPort !== this.#listeningPort) {
51
+ return;
52
+ }
53
+ listener("fake0", packet.sourceAddress, packet.sourcePort, packet.payload);
54
+ };
55
+
56
+ this.#router.add(router);
57
+
58
+ return {
59
+ close: async () => {
60
+ this.#router.delete(router);
61
+ },
62
+ };
38
63
  }
39
64
 
40
- async send(host: string, port: number, data: Uint8Array) {
41
- this.#simulatedNetwork.sendUdp(this.#localAddress, this.#listeningPort, host, port, data);
65
+ async send(host: string, port: number, payload: Uint8Array) {
66
+ this.#host.simulator.router({
67
+ kind: "udp",
68
+ sourceAddress: this.#sendFrom,
69
+ sourcePort: this.#listeningPort,
70
+ destAddress: host,
71
+ destPort: port,
72
+ payload,
73
+ });
42
74
  }
43
75
 
44
76
  async close() {
45
- for (const netListener of this.#netListeners) {
46
- await netListener.close();
47
- }
48
- this.#netListeners.length = 0;
77
+ this.#host.router.delete(this.#router);
49
78
  }
50
79
 
51
80
  async [Symbol.asyncDispose]() {
@@ -60,11 +89,11 @@ export class MockUdpChannel implements UdpChannel {
60
89
  return type === ChannelType.UDP;
61
90
  }
62
91
 
63
- addMembership(_address: string): void {
64
- // No-op for mock channel
92
+ addMembership(address: string): void {
93
+ this.#receiveFrom.add(address);
65
94
  }
66
95
 
67
- dropMembership(_address: string): void {
68
- // No-op for mock channel
96
+ dropMembership(address: string): void {
97
+ this.#receiveFrom.delete(address);
69
98
  }
70
99
  }
@@ -4,55 +4,11 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { Logger } from "../../log/Logger.js";
8
- import { TransportInterface } from "../TransportInterface.js";
9
7
  import { MockNetwork } from "./MockNetwork.js";
10
-
11
- const logger = Logger.get("SimulatedNetwork");
8
+ import { MockRouter } from "./MockRouter.js";
12
9
 
13
10
  export class NetworkSimulator {
14
- private readonly listenersMap = new Map<string, Array<NetworkSimulator.Listener>>();
15
-
16
- onUdpData(
17
- host: string | undefined,
18
- port: number,
19
- listener: NetworkSimulator.Listener,
20
- ): TransportInterface.Listener {
21
- const ipPort = `${host ?? "*"}:${port}`;
22
- let listeners = this.listenersMap.get(ipPort);
23
- if (listeners === undefined) {
24
- listeners = new Array<NetworkSimulator.Listener>();
25
- this.listenersMap.set(ipPort, listeners);
26
- }
27
- listeners.push(listener);
28
- return {
29
- close: async () => this.offUdpData(host, port, listener),
30
- };
31
- }
32
-
33
- private offUdpData(host: string | undefined, port: number, listenerToRemove: NetworkSimulator.Listener) {
34
- const ipPort = `${host ?? "*"}:${port}`;
35
- const listeners = this.listenersMap.get(ipPort);
36
- if (listeners === undefined) return;
37
- const newListeners = listeners.filter(listener => listener !== listenerToRemove);
38
- if (newListeners.length === 0) {
39
- this.listenersMap.delete(ipPort);
40
- return;
41
- }
42
- this.listenersMap.set(ipPort, newListeners);
43
- }
44
-
45
- sendUdp(localAddress: string, localPort: number, remoteAddress: string, remotePort: number, data: Uint8Array) {
46
- [`${remoteAddress}:${remotePort}`, `*:${remotePort}`].forEach(ipPort =>
47
- this.listenersMap.get(ipPort)?.forEach(listener => {
48
- try {
49
- listener("fake0", localAddress, localPort, data);
50
- } catch (error) {
51
- logger.error(error);
52
- }
53
- }),
54
- );
55
- }
11
+ readonly router = MockRouter();
56
12
 
57
13
  addHost(lastIdentifierByte: number) {
58
14
  const byte = lastIdentifierByte.toString(16).padStart(2, "0");
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ export * from "./MockNetwork.js";
8
+ export * from "./MockRouter.js";
9
+ export * from "./MockUdpChannel.js";
10
+ export * from "./NetworkSimulator.js";