@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
|
@@ -58,7 +58,7 @@ export class StorageBackendMemory extends SyncStorage implements CloneableStorag
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
get<T extends SupportedStorageTypes>(contexts: string[], key: string): T | undefined {
|
|
61
|
-
|
|
61
|
+
this.#assertInitialized();
|
|
62
62
|
if (!contexts.length || !key.length) throw new StorageError("Context and key must not be empty.");
|
|
63
63
|
return this.store[this.createContextKey(contexts)]?.[key];
|
|
64
64
|
}
|
|
@@ -77,7 +77,7 @@ export class StorageBackendMemory extends SyncStorage implements CloneableStorag
|
|
|
77
77
|
keyOrValues: string | Record<string, SupportedStorageTypes>,
|
|
78
78
|
value?: SupportedStorageTypes,
|
|
79
79
|
) {
|
|
80
|
-
|
|
80
|
+
this.#assertInitialized();
|
|
81
81
|
if (typeof keyOrValues === "string") {
|
|
82
82
|
this.#setKey(contexts, keyOrValues, value);
|
|
83
83
|
} else {
|
|
@@ -88,13 +88,13 @@ export class StorageBackendMemory extends SyncStorage implements CloneableStorag
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
delete(contexts: string[], key: string) {
|
|
91
|
-
|
|
91
|
+
this.#assertInitialized();
|
|
92
92
|
if (!contexts.length || !key.length) throw new StorageError("Context and key must not be empty.");
|
|
93
93
|
delete this.store[this.createContextKey(contexts)]?.[key];
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
keys(contexts: string[]) {
|
|
97
|
-
|
|
97
|
+
this.#assertInitialized();
|
|
98
98
|
if (!contexts.length) throw new StorageError("Context must not be empty!");
|
|
99
99
|
return Object.keys(this.store[this.createContextKey(contexts)] ?? {});
|
|
100
100
|
}
|
|
@@ -109,7 +109,7 @@ export class StorageBackendMemory extends SyncStorage implements CloneableStorag
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
contexts(contexts: string[]) {
|
|
112
|
-
|
|
112
|
+
this.#assertInitialized();
|
|
113
113
|
const contextKey = contexts.length ? this.createContextKey(contexts) : "";
|
|
114
114
|
const startContextKey = contextKey.length ? `${contextKey}.` : "";
|
|
115
115
|
const foundContexts = new Array<string>();
|
|
@@ -127,7 +127,7 @@ export class StorageBackendMemory extends SyncStorage implements CloneableStorag
|
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
clearAll(contexts: string[]) {
|
|
130
|
-
|
|
130
|
+
this.#assertInitialized();
|
|
131
131
|
const contextKey = this.createContextKey(contexts);
|
|
132
132
|
if (contextKey.length) {
|
|
133
133
|
delete this.store[contextKey];
|
|
@@ -139,4 +139,12 @@ export class StorageBackendMemory extends SyncStorage implements CloneableStorag
|
|
|
139
139
|
}
|
|
140
140
|
});
|
|
141
141
|
}
|
|
142
|
+
|
|
143
|
+
#assertInitialized() {
|
|
144
|
+
if (this.initialized) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
throw new StorageError("Storage is not initialized");
|
|
149
|
+
}
|
|
142
150
|
}
|
package/src/time/Time.ts
CHANGED
|
@@ -83,8 +83,8 @@ export class Time {
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
static register(timer: Timer) {
|
|
86
|
-
timer.elapsed = Diagnostic.elapsed();
|
|
87
86
|
registry.add(timer);
|
|
87
|
+
timer.elapsed = Diagnostic.elapsed();
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
static unregister(timer: Timer) {
|
|
@@ -137,6 +137,7 @@ export namespace Timer {
|
|
|
137
137
|
export class StandardTimer implements Timer {
|
|
138
138
|
#timerId: unknown;
|
|
139
139
|
#utility = false;
|
|
140
|
+
#intervalMs = -1;
|
|
140
141
|
isRunning = false;
|
|
141
142
|
|
|
142
143
|
get systemId() {
|
|
@@ -145,15 +146,29 @@ export class StandardTimer implements Timer {
|
|
|
145
146
|
|
|
146
147
|
constructor(
|
|
147
148
|
readonly name: string,
|
|
148
|
-
|
|
149
|
+
intervalMs: number,
|
|
149
150
|
private readonly callback: Timer.Callback,
|
|
150
151
|
readonly isPeriodic: boolean,
|
|
151
152
|
) {
|
|
153
|
+
this.intervalMs = intervalMs;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* The timer's interval.
|
|
158
|
+
*
|
|
159
|
+
* You can change this value but changes have no effect until the timer restarts.
|
|
160
|
+
*/
|
|
161
|
+
set intervalMs(intervalMs: number) {
|
|
152
162
|
if (intervalMs < 0 || intervalMs > 2147483647) {
|
|
153
163
|
throw new ImplementationError(
|
|
154
164
|
`Invalid intervalMs: ${intervalMs}. The value must be between 0 and 32-bit maximum value (2147483647)`,
|
|
155
165
|
);
|
|
156
166
|
}
|
|
167
|
+
this.#intervalMs = intervalMs;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
get intervalMs() {
|
|
171
|
+
return this.#intervalMs;
|
|
157
172
|
}
|
|
158
173
|
|
|
159
174
|
get utility() {
|
package/src/util/Cancelable.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import type { Logger } from "#log/Logger.js";
|
|
8
8
|
import { CanceledError } from "#MatterError.js";
|
|
9
|
-
import { errorOf } from "./Error.js";
|
|
9
|
+
import { asError, errorOf } from "./Error.js";
|
|
10
10
|
import { createPromise, MaybePromise } from "./Promises.js";
|
|
11
11
|
|
|
12
12
|
/**
|
|
@@ -81,13 +81,13 @@ export class CancelablePromise<T = void> implements Promise<T>, Cancelable {
|
|
|
81
81
|
/**
|
|
82
82
|
* Cancel the operation.
|
|
83
83
|
*/
|
|
84
|
-
cancel(reason:
|
|
84
|
+
cancel(reason: unknown = new CanceledError()) {
|
|
85
85
|
if (this.#isSettled) {
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
try {
|
|
90
|
-
this.onCancel(reason);
|
|
90
|
+
this.onCancel(asError(reason));
|
|
91
91
|
} catch (e) {
|
|
92
92
|
this.#reject(e);
|
|
93
93
|
}
|
package/src/util/Construction.ts
CHANGED
|
@@ -148,6 +148,8 @@ export interface Construction<T> extends Promise<T> {
|
|
|
148
148
|
*
|
|
149
149
|
* - Ensures the subject is fully initialized before closing.
|
|
150
150
|
*
|
|
151
|
+
* - Guards against closing multiple times; tertiary closes will wait for destruction.
|
|
152
|
+
*
|
|
151
153
|
* - Handles and logs errors, ensuring close() always completes successfully.
|
|
152
154
|
*
|
|
153
155
|
* - Makes destruction observable via {@link change} and {@link closed}.
|
|
@@ -437,11 +439,23 @@ export function Construction<const T extends Constructable>(
|
|
|
437
439
|
return invokeDestructor();
|
|
438
440
|
}
|
|
439
441
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
442
|
+
switch (status) {
|
|
443
|
+
case Lifecycle.Status.Initializing:
|
|
444
|
+
// Wait for initialization to complete, then close
|
|
445
|
+
return this.then(beginDestruction, beginDestruction);
|
|
446
|
+
|
|
447
|
+
case Lifecycle.Status.Destroying:
|
|
448
|
+
// Wait for previously initiated destruction to complete
|
|
449
|
+
return this.closed;
|
|
443
450
|
|
|
444
|
-
|
|
451
|
+
case Lifecycle.Status.Destroyed:
|
|
452
|
+
// Already destroyed
|
|
453
|
+
return;
|
|
454
|
+
|
|
455
|
+
default:
|
|
456
|
+
// Begin destruction
|
|
457
|
+
return beginDestruction();
|
|
458
|
+
}
|
|
445
459
|
},
|
|
446
460
|
|
|
447
461
|
finally(onfinally: () => void): Promise<T> {
|
package/src/util/Promises.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { asError } from "#util/Error.js";
|
|
10
|
-
import { InternalError,
|
|
10
|
+
import { InternalError, TimeoutError } from "../MatterError.js";
|
|
11
11
|
import { Time } from "../time/Time.js";
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -67,11 +67,7 @@ export function anyPromise<T>(promises: ((() => Promise<T>) | Promise<T>)[]): Pr
|
|
|
67
67
|
/**
|
|
68
68
|
* Thrown when a timed promise times out.
|
|
69
69
|
*/
|
|
70
|
-
export class PromiseTimeoutError extends
|
|
71
|
-
constructor(message = "Operation timed out") {
|
|
72
|
-
super(message);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
70
|
+
export class PromiseTimeoutError extends TimeoutError {}
|
|
75
71
|
|
|
76
72
|
/**
|
|
77
73
|
* Create a promise with a timeout.
|
|
@@ -109,7 +105,6 @@ export async function withTimeout<T>(
|
|
|
109
105
|
reject(asError(e));
|
|
110
106
|
return;
|
|
111
107
|
}
|
|
112
|
-
reject(new Error("Timer canceled promise, but no error was thrown"));
|
|
113
108
|
});
|
|
114
109
|
|
|
115
110
|
cancelTimer = () => {
|
package/src/util/String.ts
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { ImplementationError } from "#MatterError.js";
|
|
8
|
+
import { Bytes } from "./Bytes.js";
|
|
9
|
+
import { isObject } from "./Type.js";
|
|
10
|
+
|
|
7
11
|
export function capitalize<T extends string>(text: T) {
|
|
8
12
|
return (text[0].toUpperCase() + text.slice(1)) as Capitalize<T>;
|
|
9
13
|
}
|
|
@@ -246,3 +250,65 @@ export function describeList(setType: "and" | "or", ...entries: string[]) {
|
|
|
246
250
|
|
|
247
251
|
return text.join(" ");
|
|
248
252
|
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Serialize a structure to JS code that will recreate it. Supports a limited number of JS types. Makes no effort at
|
|
256
|
+
* pretty printing.
|
|
257
|
+
*/
|
|
258
|
+
export function serializeToJs(value: unknown) {
|
|
259
|
+
switch (typeof value) {
|
|
260
|
+
case "bigint":
|
|
261
|
+
return `0x${value.toString(16)}n`;
|
|
262
|
+
|
|
263
|
+
case "boolean":
|
|
264
|
+
return `${value}`;
|
|
265
|
+
|
|
266
|
+
case "number":
|
|
267
|
+
if (Number.isSafeInteger(value) && value > 10) {
|
|
268
|
+
return `0x${value.toString(16)}`;
|
|
269
|
+
}
|
|
270
|
+
return `${value}`;
|
|
271
|
+
|
|
272
|
+
case "string":
|
|
273
|
+
return JSON.stringify(value);
|
|
274
|
+
|
|
275
|
+
case "undefined":
|
|
276
|
+
return "undefined";
|
|
277
|
+
|
|
278
|
+
case "function":
|
|
279
|
+
case "symbol":
|
|
280
|
+
throw new ImplementationError(`Cannot serialize a ${typeof value}`);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (value instanceof Date) {
|
|
284
|
+
return `new Date(${JSON.stringify(value.toISOString)})`;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (value instanceof Uint8Array) {
|
|
288
|
+
return `b$\`${Bytes.toHex(value)}\``;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (value === null) {
|
|
292
|
+
return "null";
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (Array.isArray(value)) {
|
|
296
|
+
const parts = ["["];
|
|
297
|
+
for (const item of value) {
|
|
298
|
+
parts.push(serializeToJs(item), ",");
|
|
299
|
+
}
|
|
300
|
+
parts.push("]");
|
|
301
|
+
return parts.join("");
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if (!isObject(value)) {
|
|
305
|
+
throw new ImplementationError(`Cannot serialize a ${(value as any).constructor.name}`);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const parts = ["{"];
|
|
309
|
+
for (const key in value) {
|
|
310
|
+
parts.push(key, ":", serializeToJs(value[key]), ",");
|
|
311
|
+
}
|
|
312
|
+
parts.push("}");
|
|
313
|
+
return parts.join("");
|
|
314
|
+
}
|