@matter/general 0.15.1 → 0.15.2-alpha.0-20250703-2e16aba2b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/MatterError.d.ts +5 -0
- package/dist/cjs/MatterError.d.ts.map +1 -1
- package/dist/cjs/MatterError.js +3 -0
- package/dist/cjs/MatterError.js.map +1 -1
- package/dist/cjs/crypto/MockCrypto.d.ts +4 -0
- package/dist/cjs/crypto/MockCrypto.d.ts.map +1 -1
- package/dist/cjs/crypto/MockCrypto.js +37 -18
- package/dist/cjs/crypto/MockCrypto.js.map +1 -1
- package/dist/cjs/log/Diagnostic.js +8 -1
- package/dist/cjs/log/Diagnostic.js.map +1 -1
- package/dist/cjs/net/UdpChannel.d.ts +6 -1
- package/dist/cjs/net/UdpChannel.d.ts.map +1 -1
- package/dist/cjs/net/index.d.ts +1 -3
- package/dist/cjs/net/index.d.ts.map +1 -1
- package/dist/cjs/net/index.js +1 -3
- package/dist/cjs/net/index.js.map +1 -1
- package/dist/cjs/net/mock/MockNetwork.d.ts +8 -1
- package/dist/cjs/net/mock/MockNetwork.d.ts.map +1 -1
- package/dist/cjs/net/mock/MockNetwork.js +17 -8
- package/dist/cjs/net/mock/MockNetwork.js.map +1 -1
- package/dist/cjs/net/mock/MockRouter.d.ts +28 -0
- package/dist/cjs/net/mock/MockRouter.d.ts.map +1 -0
- package/dist/cjs/net/mock/MockRouter.js +46 -0
- package/dist/cjs/net/mock/MockRouter.js.map +6 -0
- package/dist/cjs/net/mock/MockUdpChannel.d.ts +6 -5
- package/dist/cjs/net/mock/MockUdpChannel.d.ts.map +1 -1
- package/dist/cjs/net/mock/MockUdpChannel.js +47 -21
- package/dist/cjs/net/mock/MockUdpChannel.js.map +1 -1
- package/dist/cjs/net/mock/NetworkSimulator.d.ts +6 -5
- package/dist/cjs/net/mock/NetworkSimulator.d.ts.map +1 -1
- package/dist/cjs/net/mock/NetworkSimulator.js +2 -37
- package/dist/cjs/net/mock/NetworkSimulator.js.map +1 -1
- package/dist/cjs/net/mock/index.d.ts +10 -0
- package/dist/cjs/net/mock/index.d.ts.map +1 -0
- package/dist/cjs/net/mock/index.js +27 -0
- package/dist/cjs/net/mock/index.js.map +6 -0
- package/dist/cjs/storage/StorageBackendMemory.d.ts.map +1 -1
- package/dist/cjs/storage/StorageBackendMemory.js +12 -6
- package/dist/cjs/storage/StorageBackendMemory.js.map +1 -1
- package/dist/cjs/time/Time.d.ts +7 -1
- package/dist/cjs/time/Time.d.ts.map +1 -1
- package/dist/cjs/time/Time.js +19 -7
- package/dist/cjs/time/Time.js.map +1 -1
- package/dist/cjs/util/Cancelable.d.ts +1 -1
- package/dist/cjs/util/Cancelable.d.ts.map +1 -1
- package/dist/cjs/util/Cancelable.js +1 -1
- package/dist/cjs/util/Cancelable.js.map +1 -1
- package/dist/cjs/util/Construction.d.ts +2 -0
- package/dist/cjs/util/Construction.d.ts.map +1 -1
- package/dist/cjs/util/Construction.js +9 -3
- package/dist/cjs/util/Construction.js.map +1 -1
- package/dist/cjs/util/Promises.d.ts +2 -3
- package/dist/cjs/util/Promises.d.ts.map +1 -1
- package/dist/cjs/util/Promises.js +1 -5
- package/dist/cjs/util/Promises.js.map +1 -1
- package/dist/cjs/util/String.d.ts +5 -0
- package/dist/cjs/util/String.d.ts.map +1 -1
- package/dist/cjs/util/String.js +51 -1
- package/dist/cjs/util/String.js.map +2 -2
- package/dist/esm/MatterError.d.ts +5 -0
- package/dist/esm/MatterError.d.ts.map +1 -1
- package/dist/esm/MatterError.js +3 -0
- package/dist/esm/MatterError.js.map +1 -1
- package/dist/esm/crypto/MockCrypto.d.ts +4 -0
- package/dist/esm/crypto/MockCrypto.d.ts.map +1 -1
- package/dist/esm/crypto/MockCrypto.js +37 -18
- package/dist/esm/crypto/MockCrypto.js.map +1 -1
- package/dist/esm/log/Diagnostic.js +8 -1
- package/dist/esm/log/Diagnostic.js.map +1 -1
- package/dist/esm/net/UdpChannel.d.ts +6 -1
- package/dist/esm/net/UdpChannel.d.ts.map +1 -1
- package/dist/esm/net/index.d.ts +1 -3
- package/dist/esm/net/index.d.ts.map +1 -1
- package/dist/esm/net/index.js +1 -3
- package/dist/esm/net/index.js.map +1 -1
- package/dist/esm/net/mock/MockNetwork.d.ts +8 -1
- package/dist/esm/net/mock/MockNetwork.d.ts.map +1 -1
- package/dist/esm/net/mock/MockNetwork.js +18 -9
- package/dist/esm/net/mock/MockNetwork.js.map +1 -1
- package/dist/esm/net/mock/MockRouter.d.ts +28 -0
- package/dist/esm/net/mock/MockRouter.d.ts.map +1 -0
- package/dist/esm/net/mock/MockRouter.js +26 -0
- package/dist/esm/net/mock/MockRouter.js.map +6 -0
- package/dist/esm/net/mock/MockUdpChannel.d.ts +6 -5
- package/dist/esm/net/mock/MockUdpChannel.d.ts.map +1 -1
- package/dist/esm/net/mock/MockUdpChannel.js +47 -21
- package/dist/esm/net/mock/MockUdpChannel.js.map +1 -1
- package/dist/esm/net/mock/NetworkSimulator.d.ts +6 -5
- package/dist/esm/net/mock/NetworkSimulator.d.ts.map +1 -1
- package/dist/esm/net/mock/NetworkSimulator.js +2 -37
- package/dist/esm/net/mock/NetworkSimulator.js.map +1 -1
- package/dist/esm/net/mock/index.d.ts +10 -0
- package/dist/esm/net/mock/index.d.ts.map +1 -0
- package/dist/esm/net/mock/index.js +10 -0
- package/dist/esm/net/mock/index.js.map +6 -0
- package/dist/esm/storage/StorageBackendMemory.d.ts.map +1 -1
- package/dist/esm/storage/StorageBackendMemory.js +12 -6
- package/dist/esm/storage/StorageBackendMemory.js.map +1 -1
- package/dist/esm/time/Time.d.ts +7 -1
- package/dist/esm/time/Time.d.ts.map +1 -1
- package/dist/esm/time/Time.js +19 -7
- package/dist/esm/time/Time.js.map +1 -1
- package/dist/esm/util/Cancelable.d.ts +1 -1
- package/dist/esm/util/Cancelable.d.ts.map +1 -1
- package/dist/esm/util/Cancelable.js +2 -2
- package/dist/esm/util/Cancelable.js.map +1 -1
- package/dist/esm/util/Construction.d.ts +2 -0
- package/dist/esm/util/Construction.d.ts.map +1 -1
- package/dist/esm/util/Construction.js +9 -3
- package/dist/esm/util/Construction.js.map +1 -1
- package/dist/esm/util/Promises.d.ts +2 -3
- package/dist/esm/util/Promises.d.ts.map +1 -1
- package/dist/esm/util/Promises.js +2 -6
- package/dist/esm/util/Promises.js.map +1 -1
- package/dist/esm/util/String.d.ts +5 -0
- package/dist/esm/util/String.d.ts.map +1 -1
- package/dist/esm/util/String.js +51 -1
- package/dist/esm/util/String.js.map +2 -2
- package/package.json +2 -2
- package/src/MatterError.ts +5 -0
- package/src/crypto/MockCrypto.ts +48 -20
- package/src/log/Diagnostic.ts +10 -1
- package/src/net/UdpChannel.ts +7 -3
- package/src/net/index.ts +1 -3
- package/src/net/mock/MockNetwork.ts +19 -9
- package/src/net/mock/MockRouter.ts +48 -0
- package/src/net/mock/MockUdpChannel.ts +55 -26
- package/src/net/mock/NetworkSimulator.ts +2 -46
- package/src/net/mock/index.ts +10 -0
- package/src/storage/StorageBackendMemory.ts +14 -6
- package/src/time/Time.ts +17 -2
- package/src/util/Cancelable.ts +3 -3
- package/src/util/Construction.ts +18 -4
- package/src/util/Promises.ts +2 -7
- 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,
|
|
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,
|
|
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
|
|
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": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,eAAe;AACxB,SAAS,eAAe,
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,eAAe;AACxB,SAAS,eAAe,oBAAoB;AAC5C,SAAS,YAAY;AAKd,SAAS,gBAId;AACE,MAAI,UAAU;AACd,QAAM,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AAChD,eAAW;AACX,eAAW;AAAA,EACf,CAAC;AAED,MAAI,CAAC,YAAY,CAAC,UAAU;AAExB,UAAM,IAAI,cAAc,uDAAuD;AAAA,EACnF;AAEA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAMO,SAAS,WAAc,UAA2D;AACrF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,QAAI,iBAAiB;AACrB,QAAI,cAAc;AAClB,eAAW,SAAS,UAAU;AAC1B,YAAM,UAAU,OAAO,UAAU,aAAa,MAAM,IAAI;AACxD,cACK,KAAK,WAAS;AACX,YAAI,CAAC,aAAa;AACd,wBAAc;AACd,kBAAQ,KAAK;AAAA,QACjB;AAAA,MACJ,CAAC,EACA,MAAM,YAAU;AACb;AACA,YAAI,CAAC,eAAe,mBAAmB,SAAS,QAAQ;AAEpD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,CAAC;AAAA,IACT;AAAA,EACJ,CAAC;AACL;AAKO,MAAM,4BAA4B,aAAa;AAAC;AAWvD,eAAsB,YAClB,WACA,SACA,QACU;AACV,MAAI;AACJ,MAAI,OAAO,WAAW,YAAY;AAC9B,eAAW;AAAA,EACf,WAAW,OAAO,QAAQ,UAAU,YAAY;AAC5C,eAAW,MAAM,OAAO,MAAM;AAAA,EAClC,OAAO;AACH,eAAW,MAAM;AACb,YAAM,IAAI,oBAAoB;AAAA,IAClC;AAAA,EACJ;AAEA,MAAI;AAGJ,QAAM,UAAU,IAAI,QAAc,CAAC,SAAS,WAAW;AACnD,UAAM,QAAQ,KAAK,SAAS,mBAAmB,WAAW,MAAM;AAC5D,UAAI;AACA,iBAAS;AAAA,MACb,SAAS,GAAG;AACR,eAAO,QAAQ,CAAC,CAAC;AACjB;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,kBAAc,MAAM;AAChB,YAAM,KAAK;AACX,cAAQ;AAAA,IACZ;AAEA,UAAM,MAAM;AAAA,EAChB,CAAC;AAED,MAAI;AAGJ,QAAM,WAAW,QAAQ;AAAA,IACrB,OAAK;AACD,oBAAc;AACd,eAAS;AAAA,IACb;AAAA,IACA,OAAK;AACD,oBAAc;AACd,YAAM;AAAA,IACV;AAAA,EACJ;AAGA,QAAM,QAAQ,IAAI,CAAC,SAAS,QAAQ,CAAC;AAErC,SAAO;AACX;AAcO,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA,EAIxB,GAAM,OAAiD;AAEnD,WACI,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA6B,SAAS,cAC9C,UAAU;AAAA,EAElB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KACI,UACA,SACA,QACqB;AACrB,QAAI,WAAW;AAEf,QAAI;AACA,UAAI;AACJ,UAAI,oBAAoB,UAAU;AAC9B,gBAAQ,SAAS;AAAA,MACrB,OAAO;AACH,gBAAQ;AAAA,MACZ;AACA,UAAI,aAAa,GAAG,KAAK,GAAG;AACxB,eAAO,MAAM;AAAA,UACT;AAAA,UACA,SACM,WAAS;AAGL,uBAAW;AAEX,mBAAO,SAAS,KAAK;AAAA,UACzB,IACA;AAAA,QACV;AAAA,MACJ;AACA,UAAI,SAAS;AACT,eAAO,QAAQ,KAAK;AAAA,MACxB;AAAA,IACJ,SAAS,GAAG;AACR,UAAI,UAAU,CAAC,UAAU;AACrB,eAAO,OAAO,CAAC;AAAA,MACnB;AACA,YAAM;AAAA,IACV;AAGA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MACI,UACA,YACF;AACE,WAAO,KAAK,KAAK,UAAU,QAAW,UAAU;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,QACI,UACA,WACe;AACf,QAAI;AACJ,QAAI;AACA,UAAI,OAAO,aAAa,YAAY;AAChC,iBAAU,SAAmC;AAAA,MACjD,OAAO;AACH,iBAAS;AAAA,MACb;AAAA,IACJ,UAAE;AACE,UAAI,aAAa,GAAG,MAAM,GAAG;AAEzB,YAAI,OAAQ,OAAwB,YAAY,YAAY;AAkBxD,mBAAU,OAAsB,QAAQ,SAAS;AAAA,QACrD,OAAO;AACH,mBAAS,OAAO;AAAA,YACZ,WACI,aAAa;AAAA,cACT,MAAM,YAAY;AAAA,cAClB,MAAM;AAAA,YACV;AAAA,YACJ,WACI,aAAa;AAAA,cACT,MAAM,YAAY;AAAA,cAClB,MAAM;AACF,sBAAM;AAAA,cACV;AAAA,YACJ;AAAA,UACR;AAAA,QACJ;AAAA,MACJ,OAAO;AAGH,cAAM,gBAAgB,YAAY;AAClC,YAAI,aAAa,GAAG,aAAa,GAAG;AAChC,gBAAM,eAAe;AACrB,mBAAS,cAAc,KAAK,MAAM,YAAY;AAAA,QAClD;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,CAAC,OAAO,WAAW,GAAG;AAC1B;AAEA,aAAa,WAAW,MAAM;",
|
|
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;
|
|
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"}
|
package/dist/esm/util/String.js
CHANGED
|
@@ -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": "AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
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.
|
|
3
|
+
"version": "0.15.2-alpha.0-20250703-2e16aba2b",
|
|
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.
|
|
39
|
+
"@matter/testing": "0.15.2-alpha.0-20250703-2e16aba2b"
|
|
40
40
|
},
|
|
41
41
|
"files": [
|
|
42
42
|
"dist/**/*",
|
package/src/MatterError.ts
CHANGED
|
@@ -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
|
*/
|
package/src/crypto/MockCrypto.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
set(newIndex: number) {
|
|
50
|
+
index = newIndex % 256;
|
|
51
|
+
},
|
|
56
52
|
},
|
|
57
53
|
|
|
58
|
-
|
|
59
|
-
|
|
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
|
}
|
package/src/log/Diagnostic.ts
CHANGED
|
@@ -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
|
}
|
package/src/net/UdpChannel.ts
CHANGED
|
@@ -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/
|
|
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 #
|
|
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.#
|
|
24
|
-
|
|
25
|
-
|
|
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(
|
|
37
|
-
|
|
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 {
|
|
11
|
+
import { MockRouter } from "./MockRouter.js";
|
|
13
12
|
|
|
14
13
|
export class MockUdpChannel implements UdpChannel {
|
|
15
|
-
readonly #
|
|
16
|
-
readonly #
|
|
17
|
-
readonly #
|
|
18
|
-
readonly #
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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:
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
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,
|
|
41
|
-
this.#
|
|
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
|
-
|
|
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(
|
|
64
|
-
|
|
92
|
+
addMembership(address: string): void {
|
|
93
|
+
this.#receiveFrom.add(address);
|
|
65
94
|
}
|
|
66
95
|
|
|
67
|
-
dropMembership(
|
|
68
|
-
|
|
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
|
-
|
|
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");
|