@matter/general 0.16.2-alpha.0-20260114-d3127faee → 0.16.2

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 (56) hide show
  1. package/dist/cjs/net/Network.d.ts +2 -0
  2. package/dist/cjs/net/Network.d.ts.map +1 -1
  3. package/dist/cjs/net/Network.js +3 -0
  4. package/dist/cjs/net/Network.js.map +1 -1
  5. package/dist/cjs/net/RetrySchedule.d.ts +1 -1
  6. package/dist/cjs/time/TimeUnit.d.ts +4 -0
  7. package/dist/cjs/time/TimeUnit.d.ts.map +1 -1
  8. package/dist/cjs/time/TimeUnit.js +2 -0
  9. package/dist/cjs/time/TimeUnit.js.map +1 -1
  10. package/dist/cjs/time/Timestamp.d.ts +1 -1
  11. package/dist/cjs/time/Timestamp.d.ts.map +1 -1
  12. package/dist/cjs/time/Timestamp.js +1 -1
  13. package/dist/cjs/time/Timestamp.js.map +1 -1
  14. package/dist/cjs/util/Scheduler.d.ts +68 -0
  15. package/dist/cjs/util/Scheduler.d.ts.map +1 -0
  16. package/dist/cjs/util/Scheduler.js +207 -0
  17. package/dist/cjs/util/Scheduler.js.map +6 -0
  18. package/dist/cjs/util/Semaphore.d.ts +0 -4
  19. package/dist/cjs/util/Semaphore.d.ts.map +1 -1
  20. package/dist/cjs/util/Semaphore.js.map +1 -1
  21. package/dist/cjs/util/index.d.ts +1 -0
  22. package/dist/cjs/util/index.d.ts.map +1 -1
  23. package/dist/cjs/util/index.js +1 -0
  24. package/dist/cjs/util/index.js.map +1 -1
  25. package/dist/esm/net/Network.d.ts +2 -0
  26. package/dist/esm/net/Network.d.ts.map +1 -1
  27. package/dist/esm/net/Network.js +3 -0
  28. package/dist/esm/net/Network.js.map +1 -1
  29. package/dist/esm/net/RetrySchedule.d.ts +1 -1
  30. package/dist/esm/time/TimeUnit.d.ts +4 -0
  31. package/dist/esm/time/TimeUnit.d.ts.map +1 -1
  32. package/dist/esm/time/TimeUnit.js +2 -0
  33. package/dist/esm/time/TimeUnit.js.map +1 -1
  34. package/dist/esm/time/Timestamp.d.ts +1 -1
  35. package/dist/esm/time/Timestamp.d.ts.map +1 -1
  36. package/dist/esm/time/Timestamp.js +1 -1
  37. package/dist/esm/time/Timestamp.js.map +1 -1
  38. package/dist/esm/util/Scheduler.d.ts +68 -0
  39. package/dist/esm/util/Scheduler.d.ts.map +1 -0
  40. package/dist/esm/util/Scheduler.js +187 -0
  41. package/dist/esm/util/Scheduler.js.map +6 -0
  42. package/dist/esm/util/Semaphore.d.ts +0 -4
  43. package/dist/esm/util/Semaphore.d.ts.map +1 -1
  44. package/dist/esm/util/Semaphore.js.map +1 -1
  45. package/dist/esm/util/index.d.ts +1 -0
  46. package/dist/esm/util/index.d.ts.map +1 -1
  47. package/dist/esm/util/index.js +1 -0
  48. package/dist/esm/util/index.js.map +1 -1
  49. package/package.json +2 -2
  50. package/src/net/Network.ts +2 -0
  51. package/src/net/RetrySchedule.ts +1 -1
  52. package/src/time/TimeUnit.ts +5 -0
  53. package/src/time/Timestamp.ts +1 -1
  54. package/src/util/Scheduler.ts +185 -0
  55. package/src/util/Semaphore.ts +0 -5
  56. package/src/util/index.ts +1 -0
@@ -50,7 +50,7 @@ class TimestampFormatError extends UnexpectedDataError {
50
50
  return new Date(timestamp);
51
51
  }
52
52
  Timestamp2.dateOf = dateOf;
53
- function delta(from, to) {
53
+ function delta(from, to = Time.nowMs) {
54
54
  return to - from;
55
55
  }
56
56
  Timestamp2.delta = delta;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/time/Timestamp.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,2BAA2B;AAGpC,SAAS,YAAY;AAcd,SAAS,UACZ,QACuD;AACvD,MAAI,WAAW,QAAW;AACtB,WAAO,KAAK;AAAA,EAChB;AAEA,MAAI,OAAO,WAAW,UAAU;AAC5B,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC,GAAG;AAClC,YAAM,IAAI,qBAAqB,0BAA0B;AAAA,IAC7D;AAAA,EACJ,WAAW,OAAO,WAAW,YAAY,WAAW,QAAQ,kBAAkB,MAAM;AAChF,QAAI,CAAC,OAAO,SAAS,OAAO,QAAQ,CAAC,GAAG;AACpC,YAAM,IAAI,qBAAqB,wDAAwD;AAAA,IAC3F;AACA,aAAS,OAAO,QAAQ;AAAA,EAC5B,WAAW,OAAO,WAAW,UAAU;AACnC,aAAS,OAAO,MAAM;AAAA,EAC1B;AAEA,MAAI,OAAO,WAAW,UAAU;AAC5B,QAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC1B,YAAM,IAAI,qBAAqB,qCAAqC;AAAA,IACxE;AAAA,EACJ,OAAO;AACH,UAAM,IAAI,qBAAqB,uCAAuC,OAAO,MAAM,GAAG;AAAA,EAC1F;AAEA,SAAO;AACX;AAKO,MAAM,6BAA6B,oBAAoB;AAAC;AAAA,CAExD,CAAUA,eAAV;AASI,WAAS,YAAY,QAAgB;AACxC,WAAO,KAAK,MAAM,SAAS,GAAI;AAAA,EACnC;AAFO,EAAAA,WAAS;AAOT,WAAS,iBAAiB,QAAyB;AACtD,QAAI,OAAO,WAAW,UAAU;AAC5B,eAAS,OAAO,MAAM;AAAA,IAC1B;AACA,WAAOA,WAAU,SAAS,GAAI;AAAA,EAClC;AALO,EAAAA,WAAS;AAUT,EAAMA,WAAA,OAAOA,WAAU,CAAC;AAKxB,WAAS,OAAO,WAAsB;AACzC,WAAO,IAAI,KAAK,SAAS;AAAA,EAC7B;AAFO,EAAAA,WAAS;AAOT,WAAS,MAAM,MAAiB,IAAe;AAClD,WAAQ,KAAK;AAAA,EACjB;AAFO,EAAAA,WAAS;AAAA,GAtCH;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,2BAA2B;AAGpC,SAAS,YAAY;AAcd,SAAS,UACZ,QACuD;AACvD,MAAI,WAAW,QAAW;AACtB,WAAO,KAAK;AAAA,EAChB;AAEA,MAAI,OAAO,WAAW,UAAU;AAC5B,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC,GAAG;AAClC,YAAM,IAAI,qBAAqB,0BAA0B;AAAA,IAC7D;AAAA,EACJ,WAAW,OAAO,WAAW,YAAY,WAAW,QAAQ,kBAAkB,MAAM;AAChF,QAAI,CAAC,OAAO,SAAS,OAAO,QAAQ,CAAC,GAAG;AACpC,YAAM,IAAI,qBAAqB,wDAAwD;AAAA,IAC3F;AACA,aAAS,OAAO,QAAQ;AAAA,EAC5B,WAAW,OAAO,WAAW,UAAU;AACnC,aAAS,OAAO,MAAM;AAAA,EAC1B;AAEA,MAAI,OAAO,WAAW,UAAU;AAC5B,QAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC1B,YAAM,IAAI,qBAAqB,qCAAqC;AAAA,IACxE;AAAA,EACJ,OAAO;AACH,UAAM,IAAI,qBAAqB,uCAAuC,OAAO,MAAM,GAAG;AAAA,EAC1F;AAEA,SAAO;AACX;AAKO,MAAM,6BAA6B,oBAAoB;AAAC;AAAA,CAExD,CAAUA,eAAV;AASI,WAAS,YAAY,QAAgB;AACxC,WAAO,KAAK,MAAM,SAAS,GAAI;AAAA,EACnC;AAFO,EAAAA,WAAS;AAOT,WAAS,iBAAiB,QAAyB;AACtD,QAAI,OAAO,WAAW,UAAU;AAC5B,eAAS,OAAO,MAAM;AAAA,IAC1B;AACA,WAAOA,WAAU,SAAS,GAAI;AAAA,EAClC;AALO,EAAAA,WAAS;AAUT,EAAMA,WAAA,OAAOA,WAAU,CAAC;AAKxB,WAAS,OAAO,WAAsB;AACzC,WAAO,IAAI,KAAK,SAAS;AAAA,EAC7B;AAFO,EAAAA,WAAS;AAOT,WAAS,MAAM,MAAiB,KAAgB,KAAK,OAAO;AAC/D,WAAQ,KAAK;AAAA,EACjB;AAFO,EAAAA,WAAS;AAAA,GAtCH;",
5
5
  "names": ["Timestamp"]
6
6
  }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Timestamp } from "#time/Timestamp.js";
7
+ import { Lifetime } from "./Lifetime.js";
8
+ import { MaybePromise } from "./Promises.js";
9
+ import { Semaphore } from "./Semaphore.js";
10
+ /**
11
+ * Task scheduler.
12
+ *
13
+ * Runs workers at a designated time.
14
+ */
15
+ export declare class Scheduler<T> {
16
+ #private;
17
+ constructor({ name, lifetime, timeOf, run, semaphore, }: Scheduler.Configuration<T>);
18
+ /**
19
+ * Schedule a worker.
20
+ */
21
+ add(worker: T): void;
22
+ /**
23
+ * Unschedule a worker.
24
+ */
25
+ delete(worker: T): void;
26
+ /**
27
+ * Update a worker's scheduled run time.
28
+ */
29
+ reschedule(worker: T): void;
30
+ /**
31
+ * Close.
32
+ *
33
+ * Stops accepting workers. Returns when all workers are complete.
34
+ */
35
+ close(): Promise<void>;
36
+ }
37
+ export declare namespace Scheduler {
38
+ interface Configuration<T> {
39
+ /**
40
+ * Name used for diagnostics.
41
+ *
42
+ * Defaults to "scheduler".
43
+ */
44
+ name?: string;
45
+ /**
46
+ * Owner lifetime.
47
+ *
48
+ * Defaults to process.
49
+ */
50
+ lifetime?: Lifetime.Owner;
51
+ /**
52
+ * Identify the scheduled time for a specific worker.
53
+ */
54
+ timeOf(worker: T): Timestamp;
55
+ /**
56
+ * Execute a worker.
57
+ */
58
+ run(worker: T, abort: AbortSignal): MaybePromise<void>;
59
+ /**
60
+ * If present, controls worker concurrency.
61
+ *
62
+ * Providing the semaphore here rather than using it within the worker prevents the worker from starting when no
63
+ * queue slot is available.
64
+ */
65
+ semaphore?: Semaphore;
66
+ }
67
+ }
68
+ //# sourceMappingURL=Scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../../src/util/Scheduler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI3C;;;;GAIG;AACH,qBAAa,SAAS,CAAC,CAAC;;gBAUR,EACR,IAAkB,EAClB,QAA2B,EAC3B,MAAM,EACN,GAAG,EACH,SAAS,GACZ,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;IAW7B;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,CAAC;IAOb;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,CAAC;IAIhB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,CAAC;IAKpB;;;;OAIG;IACG,KAAK;CA8Dd;AAED,yBAAiB,SAAS,CAAC;IACvB,UAAiB,aAAa,CAAC,CAAC;QAC5B;;;;WAIG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QAEd;;;;WAIG;QACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;QAE1B;;WAEG;QACH,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;QAE7B;;WAEG;QACH,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAEvD;;;;;WAKG;QACH,SAAS,CAAC,EAAE,SAAS,CAAC;KACzB;CACJ"}
@@ -0,0 +1,187 @@
1
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
2
+ var __typeError = (msg) => {
3
+ throw TypeError(msg);
4
+ };
5
+ var __using = (stack, value, async) => {
6
+ if (value != null) {
7
+ if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
8
+ var dispose, inner;
9
+ if (async) dispose = value[__knownSymbol("asyncDispose")];
10
+ if (dispose === void 0) {
11
+ dispose = value[__knownSymbol("dispose")];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") __typeError("Object not disposable");
15
+ if (inner) dispose = function() {
16
+ try {
17
+ inner.call(this);
18
+ } catch (e) {
19
+ return Promise.reject(e);
20
+ }
21
+ };
22
+ stack.push([async, dispose, value]);
23
+ } else if (async) {
24
+ stack.push([async]);
25
+ }
26
+ return value;
27
+ };
28
+ var __callDispose = (stack, error, hasError) => {
29
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
30
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
31
+ };
32
+ var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
33
+ var next = (it) => {
34
+ while (it = stack.pop()) {
35
+ try {
36
+ var result = it[1] && it[1].call(it[2]);
37
+ if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
38
+ } catch (e) {
39
+ fail(e);
40
+ }
41
+ }
42
+ if (hasError) throw error;
43
+ };
44
+ return next();
45
+ };
46
+ /**
47
+ * @license
48
+ * Copyright 2022-2026 Matter.js Authors
49
+ * SPDX-License-Identifier: Apache-2.0
50
+ */
51
+ import { Logger } from "#log/Logger.js";
52
+ import { ImplementationError } from "#MatterError.js";
53
+ import { Time } from "#time/Time.js";
54
+ import { Timestamp } from "#time/Timestamp.js";
55
+ import { Abort } from "./Abort.js";
56
+ import { asError } from "./Error.js";
57
+ import { Heap } from "./Heap.js";
58
+ import { Lifetime } from "./Lifetime.js";
59
+ import { BasicMultiplex } from "./Multiplex.js";
60
+ const logger = Logger.get("Scheduler");
61
+ class Scheduler {
62
+ #name;
63
+ #lifetime;
64
+ #timeOf;
65
+ #run;
66
+ #queue;
67
+ #abort = new Abort();
68
+ #workers = new BasicMultiplex();
69
+ #semaphore;
70
+ constructor({
71
+ name = "scheduler",
72
+ lifetime = Lifetime.process,
73
+ timeOf,
74
+ run,
75
+ semaphore
76
+ }) {
77
+ this.#name = name;
78
+ this.#lifetime = lifetime.join(this.#name);
79
+ this.#timeOf = timeOf;
80
+ this.#run = run;
81
+ this.#semaphore = semaphore;
82
+ this.#queue = new Heap(comparatorFor(timeOf));
83
+ this.#workers.add(this.#schedule());
84
+ }
85
+ /**
86
+ * Schedule a worker.
87
+ */
88
+ add(worker) {
89
+ if (this.#lifetime.isClosing) {
90
+ throw new ImplementationError(`Cannot schedule new work because ${this.#name} is closed`);
91
+ }
92
+ this.#queue.add(worker);
93
+ }
94
+ /**
95
+ * Unschedule a worker.
96
+ */
97
+ delete(worker) {
98
+ this.#queue.delete(worker);
99
+ }
100
+ /**
101
+ * Update a worker's scheduled run time.
102
+ */
103
+ reschedule(worker) {
104
+ this.#queue.delete(worker);
105
+ this.#queue.add(worker);
106
+ }
107
+ /**
108
+ * Close.
109
+ *
110
+ * Stops accepting workers. Returns when all workers are complete.
111
+ */
112
+ async close() {
113
+ var _stack = [];
114
+ try {
115
+ const _closing = __using(_stack, this.#lifetime.closing());
116
+ this.#abort();
117
+ await this.#workers;
118
+ } catch (_) {
119
+ var _error = _, _hasError = true;
120
+ } finally {
121
+ __callDispose(_stack, _error, _hasError);
122
+ }
123
+ }
124
+ /**
125
+ * Performs actual scheduling of workers.
126
+ */
127
+ async #schedule() {
128
+ while (!this.#abort.aborted) {
129
+ var _stack = [];
130
+ try {
131
+ const now = Time.nowMs;
132
+ let first = this.#queue.first;
133
+ let nextAt = first ? this.#timeOf(first) : void 0;
134
+ while (nextAt !== void 0 && nextAt <= now) {
135
+ if (this.#abort.aborted) {
136
+ return;
137
+ }
138
+ let slot;
139
+ if (this.#semaphore) {
140
+ slot = await this.#semaphore.obtainSlot(this.#abort);
141
+ if (this.#abort.aborted) {
142
+ return;
143
+ }
144
+ }
145
+ try {
146
+ this.#queue.shift();
147
+ const promise = this.#run(first, this.#abort.signal);
148
+ if (promise) {
149
+ let p = Promise.resolve(promise).catch(this.#unhandled.bind(this));
150
+ if (slot) {
151
+ p = p.finally(() => slot[Symbol.dispose]());
152
+ }
153
+ this.#workers.add(p);
154
+ } else {
155
+ slot?.[Symbol.dispose]();
156
+ }
157
+ } catch (e) {
158
+ slot?.[Symbol.dispose]();
159
+ this.#unhandled(e);
160
+ }
161
+ first = this.#queue.first;
162
+ nextAt = first ? this.#timeOf(first) : void 0;
163
+ }
164
+ const abort = __using(_stack, new Abort({
165
+ abort: this.#abort,
166
+ timeout: nextAt === void 0 ? void 0 : Timestamp.delta(now, nextAt)
167
+ }));
168
+ const _abortOnChange = __using(_stack, this.#queue.firstChanged.use((newFirst) => abort.if(newFirst !== first)));
169
+ await abort;
170
+ } catch (_) {
171
+ var _error = _, _hasError = true;
172
+ } finally {
173
+ __callDispose(_stack, _error, _hasError);
174
+ }
175
+ }
176
+ }
177
+ #unhandled(e) {
178
+ logger.error(`Unhandled error in ${this.#name} worker:`, asError(e));
179
+ }
180
+ }
181
+ function comparatorFor(timeOf) {
182
+ return (a, b) => timeOf(a) - timeOf(b);
183
+ }
184
+ export {
185
+ Scheduler
186
+ };
187
+ //# sourceMappingURL=Scheduler.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util/Scheduler.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -14,10 +14,6 @@ export interface WorkSlot extends Disposable {
14
14
  * This is called automatically when using `using` syntax.
15
15
  */
16
16
  close(): void;
17
- /**
18
- * Release the slot automatically when the object is garbage collected.
19
- */
20
- [Symbol.dispose](): void;
21
17
  }
22
18
  /**
23
19
  * A queue that limits concurrent work using a slot-based approach.
@@ -1 +1 @@
1
- {"version":3,"file":"Semaphore.d.ts","sourceRoot":"","sources":["../../../src/util/Semaphore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAI7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKnC;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,UAAU;IACxC;;;OAGG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,qBAAa,SAAS;;gBAYN,KAAK,EAAE,MAAM,EAAE,WAAW,SAAI,EAAE,KAAK,WAAU;IAO3D;;;;;;;;;;OAUG;IACG,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsIzD;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,IAAI,KAAK,WAER;IAED;;OAEG;IACH,IAAI,OAAO,WAEV;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;CAMhB"}
1
+ {"version":3,"file":"Semaphore.d.ts","sourceRoot":"","sources":["../../../src/util/Semaphore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAI7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKnC;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,UAAU;IACxC;;;OAGG;IACH,KAAK,IAAI,IAAI,CAAC;CACjB;AAED;;;;;GAKG;AACH,qBAAa,SAAS;;gBAYN,KAAK,EAAE,MAAM,EAAE,WAAW,SAAI,EAAE,KAAK,WAAU;IAO3D;;;;;;;;;;OAUG;IACG,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsIzD;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,IAAI,KAAK,WAER;IAED;;OAEG;IACH,IAAI,OAAO,WAEV;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;CAMhB"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/util/Semaphore.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -35,6 +35,7 @@ export * from "./NamedHandler.js";
35
35
  export * from "./Number.js";
36
36
  export * from "./Observable.js";
37
37
  export * from "./Promises.js";
38
+ export * from "./Scheduler.js";
38
39
  export * from "./Semaphore.js";
39
40
  export * from "./serialize.js";
40
41
  export * from "./Set.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
@@ -35,6 +35,7 @@ export * from "./NamedHandler.js";
35
35
  export * from "./Number.js";
36
36
  export * from "./Observable.js";
37
37
  export * from "./Promises.js";
38
+ export * from "./Scheduler.js";
38
39
  export * from "./Semaphore.js";
39
40
  export * from "./serialize.js";
40
41
  export * from "./Set.js";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/util/index.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/general",
3
- "version": "0.16.2-alpha.0-20260114-d3127faee",
3
+ "version": "0.16.2",
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.2-alpha.0-20260114-d3127faee"
39
+ "@matter/testing": "0.16.2"
40
40
  },
41
41
  "files": [
42
42
  "dist/**/*",
@@ -16,6 +16,8 @@ export class BindError extends NetworkError {}
16
16
 
17
17
  export class AddressInUseError extends BindError {}
18
18
 
19
+ export class AddressUnreachableError extends NetworkError {}
20
+
19
21
  export const STANDARD_MATTER_PORT = 5540;
20
22
 
21
23
  /**
@@ -68,7 +68,7 @@ export namespace RetrySchedule {
68
68
  /**
69
69
  * Overall timeout.
70
70
  *
71
- * Leave undefined to allow indefinite transmission.
71
+ * Leave undefined to allow unlimited retries.
72
72
  */
73
73
  readonly timeout?: Duration;
74
74
 
@@ -159,3 +159,8 @@ export const Days = TimeUnit("day", "d", 86_400_000);
159
159
  * A zero-length interval.
160
160
  */
161
161
  export const Instant = Millis(0);
162
+
163
+ /**
164
+ * An infinite interval.
165
+ */
166
+ export const Forever = Millis(Infinity);
@@ -96,7 +96,7 @@ export namespace Timestamp {
96
96
  /**
97
97
  * Compute the duration between two timestamps.
98
98
  */
99
- export function delta(from: Timestamp, to: Timestamp) {
99
+ export function delta(from: Timestamp, to: Timestamp = Time.nowMs) {
100
100
  return (to - from) as Duration;
101
101
  }
102
102
  }
@@ -0,0 +1,185 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { Logger } from "#log/Logger.js";
8
+ import { ImplementationError } from "#MatterError.js";
9
+ import { Time } from "#time/Time.js";
10
+ import { Timestamp } from "#time/Timestamp.js";
11
+ import { Abort } from "./Abort.js";
12
+ import { asError } from "./Error.js";
13
+ import { Heap } from "./Heap.js";
14
+ import { Lifetime } from "./Lifetime.js";
15
+ import { BasicMultiplex } from "./Multiplex.js";
16
+ import { MaybePromise } from "./Promises.js";
17
+ import { Semaphore } from "./Semaphore.js";
18
+
19
+ const logger = Logger.get("Scheduler");
20
+
21
+ /**
22
+ * Task scheduler.
23
+ *
24
+ * Runs workers at a designated time.
25
+ */
26
+ export class Scheduler<T> {
27
+ #name: string;
28
+ #lifetime: Lifetime;
29
+ #timeOf: Scheduler.Configuration<T>["timeOf"];
30
+ #run: Scheduler.Configuration<T>["run"];
31
+ #queue: Heap<T>;
32
+ #abort = new Abort();
33
+ #workers = new BasicMultiplex();
34
+ #semaphore?: Semaphore;
35
+
36
+ constructor({
37
+ name = "scheduler",
38
+ lifetime = Lifetime.process,
39
+ timeOf,
40
+ run,
41
+ semaphore,
42
+ }: Scheduler.Configuration<T>) {
43
+ this.#name = name;
44
+ this.#lifetime = lifetime.join(this.#name);
45
+ this.#timeOf = timeOf;
46
+ this.#run = run;
47
+ this.#semaphore = semaphore;
48
+
49
+ this.#queue = new Heap(comparatorFor(timeOf));
50
+ this.#workers.add(this.#schedule());
51
+ }
52
+
53
+ /**
54
+ * Schedule a worker.
55
+ */
56
+ add(worker: T) {
57
+ if (this.#lifetime.isClosing) {
58
+ throw new ImplementationError(`Cannot schedule new work because ${this.#name} is closed`);
59
+ }
60
+ this.#queue.add(worker);
61
+ }
62
+
63
+ /**
64
+ * Unschedule a worker.
65
+ */
66
+ delete(worker: T) {
67
+ this.#queue.delete(worker);
68
+ }
69
+
70
+ /**
71
+ * Update a worker's scheduled run time.
72
+ */
73
+ reschedule(worker: T) {
74
+ this.#queue.delete(worker);
75
+ this.#queue.add(worker);
76
+ }
77
+
78
+ /**
79
+ * Close.
80
+ *
81
+ * Stops accepting workers. Returns when all workers are complete.
82
+ */
83
+ async close() {
84
+ using _closing = this.#lifetime.closing();
85
+ this.#abort();
86
+ await this.#workers;
87
+ }
88
+
89
+ /**
90
+ * Performs actual scheduling of workers.
91
+ */
92
+ async #schedule() {
93
+ while (!this.#abort.aborted) {
94
+ // Activate workers that have no more delay
95
+ const now = Time.nowMs;
96
+ let first = this.#queue.first;
97
+ let nextAt = first ? this.#timeOf(first) : undefined;
98
+ while (nextAt !== undefined && nextAt <= now) {
99
+ if (this.#abort.aborted) {
100
+ return;
101
+ }
102
+
103
+ let slot: undefined | Disposable;
104
+ if (this.#semaphore) {
105
+ slot = await this.#semaphore.obtainSlot(this.#abort);
106
+ if (this.#abort.aborted) {
107
+ return;
108
+ }
109
+ }
110
+
111
+ try {
112
+ this.#queue.shift();
113
+ const promise = this.#run(first!, this.#abort.signal);
114
+ if (promise) {
115
+ let p = Promise.resolve(promise).catch(this.#unhandled.bind(this));
116
+ if (slot) {
117
+ p = p.finally(() => slot[Symbol.dispose]());
118
+ }
119
+ this.#workers.add(p);
120
+ } else {
121
+ slot?.[Symbol.dispose]();
122
+ }
123
+ } catch (e) {
124
+ slot?.[Symbol.dispose]();
125
+ this.#unhandled(e);
126
+ }
127
+
128
+ first = this.#queue.first;
129
+ nextAt = first ? this.#timeOf(first) : undefined;
130
+ }
131
+
132
+ // Wait for delay for next worker, abort or change in head of queue
133
+ using abort = new Abort({
134
+ abort: this.#abort,
135
+ timeout: nextAt === undefined ? undefined : Timestamp.delta(now, nextAt),
136
+ });
137
+ using _abortOnChange = this.#queue.firstChanged.use(newFirst => abort.if(newFirst !== first));
138
+ await abort;
139
+ }
140
+ }
141
+
142
+ #unhandled(e: unknown) {
143
+ logger.error(`Unhandled error in ${this.#name} worker:`, asError(e));
144
+ }
145
+ }
146
+
147
+ export namespace Scheduler {
148
+ export interface Configuration<T> {
149
+ /**
150
+ * Name used for diagnostics.
151
+ *
152
+ * Defaults to "scheduler".
153
+ */
154
+ name?: string;
155
+
156
+ /**
157
+ * Owner lifetime.
158
+ *
159
+ * Defaults to process.
160
+ */
161
+ lifetime?: Lifetime.Owner;
162
+
163
+ /**
164
+ * Identify the scheduled time for a specific worker.
165
+ */
166
+ timeOf(worker: T): Timestamp;
167
+
168
+ /**
169
+ * Execute a worker.
170
+ */
171
+ run(worker: T, abort: AbortSignal): MaybePromise<void>;
172
+
173
+ /**
174
+ * If present, controls worker concurrency.
175
+ *
176
+ * Providing the semaphore here rather than using it within the worker prevents the worker from starting when no
177
+ * queue slot is available.
178
+ */
179
+ semaphore?: Semaphore;
180
+ }
181
+ }
182
+
183
+ function comparatorFor<T>(timeOf: Scheduler.Configuration<T>["timeOf"]) {
184
+ return (a: T, b: T) => timeOf(a) - timeOf(b);
185
+ }
@@ -23,11 +23,6 @@ export interface WorkSlot extends Disposable {
23
23
  * This is called automatically when using `using` syntax.
24
24
  */
25
25
  close(): void;
26
-
27
- /**
28
- * Release the slot automatically when the object is garbage collected.
29
- */
30
- [Symbol.dispose](): void;
31
26
  }
32
27
 
33
28
  /**
package/src/util/index.ts CHANGED
@@ -36,6 +36,7 @@ export * from "./NamedHandler.js";
36
36
  export * from "./Number.js";
37
37
  export * from "./Observable.js";
38
38
  export * from "./Promises.js";
39
+ export * from "./Scheduler.js";
39
40
  export * from "./Semaphore.js";
40
41
  export * from "./serialize.js";
41
42
  export * from "./Set.js";