@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.
- package/dist/cjs/net/Network.d.ts +2 -0
- package/dist/cjs/net/Network.d.ts.map +1 -1
- package/dist/cjs/net/Network.js +3 -0
- package/dist/cjs/net/Network.js.map +1 -1
- package/dist/cjs/net/RetrySchedule.d.ts +1 -1
- package/dist/cjs/time/TimeUnit.d.ts +4 -0
- package/dist/cjs/time/TimeUnit.d.ts.map +1 -1
- package/dist/cjs/time/TimeUnit.js +2 -0
- package/dist/cjs/time/TimeUnit.js.map +1 -1
- package/dist/cjs/time/Timestamp.d.ts +1 -1
- package/dist/cjs/time/Timestamp.d.ts.map +1 -1
- package/dist/cjs/time/Timestamp.js +1 -1
- package/dist/cjs/time/Timestamp.js.map +1 -1
- package/dist/cjs/util/Scheduler.d.ts +68 -0
- package/dist/cjs/util/Scheduler.d.ts.map +1 -0
- package/dist/cjs/util/Scheduler.js +207 -0
- package/dist/cjs/util/Scheduler.js.map +6 -0
- package/dist/cjs/util/Semaphore.d.ts +0 -4
- package/dist/cjs/util/Semaphore.d.ts.map +1 -1
- package/dist/cjs/util/Semaphore.js.map +1 -1
- package/dist/cjs/util/index.d.ts +1 -0
- package/dist/cjs/util/index.d.ts.map +1 -1
- package/dist/cjs/util/index.js +1 -0
- package/dist/cjs/util/index.js.map +1 -1
- package/dist/esm/net/Network.d.ts +2 -0
- package/dist/esm/net/Network.d.ts.map +1 -1
- package/dist/esm/net/Network.js +3 -0
- package/dist/esm/net/Network.js.map +1 -1
- package/dist/esm/net/RetrySchedule.d.ts +1 -1
- package/dist/esm/time/TimeUnit.d.ts +4 -0
- package/dist/esm/time/TimeUnit.d.ts.map +1 -1
- package/dist/esm/time/TimeUnit.js +2 -0
- package/dist/esm/time/TimeUnit.js.map +1 -1
- package/dist/esm/time/Timestamp.d.ts +1 -1
- package/dist/esm/time/Timestamp.d.ts.map +1 -1
- package/dist/esm/time/Timestamp.js +1 -1
- package/dist/esm/time/Timestamp.js.map +1 -1
- package/dist/esm/util/Scheduler.d.ts +68 -0
- package/dist/esm/util/Scheduler.d.ts.map +1 -0
- package/dist/esm/util/Scheduler.js +187 -0
- package/dist/esm/util/Scheduler.js.map +6 -0
- package/dist/esm/util/Semaphore.d.ts +0 -4
- package/dist/esm/util/Semaphore.d.ts.map +1 -1
- package/dist/esm/util/Semaphore.js.map +1 -1
- package/dist/esm/util/index.d.ts +1 -0
- package/dist/esm/util/index.d.ts.map +1 -1
- package/dist/esm/util/index.js +1 -0
- package/dist/esm/util/index.js.map +1 -1
- package/package.json +2 -2
- package/src/net/Network.ts +2 -0
- package/src/net/RetrySchedule.ts +1 -1
- package/src/time/TimeUnit.ts +5 -0
- package/src/time/Timestamp.ts +1 -1
- package/src/util/Scheduler.ts +185 -0
- package/src/util/Semaphore.ts +0 -5
- package/src/util/index.ts +1 -0
|
@@ -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,
|
|
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;
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,oBAAoB;AAE7B,SAAS,YAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAE9B,MAAM,SAAS,OAAO,IAAI,WAAW;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/esm/util/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/esm/util/index.js
CHANGED
|
@@ -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
|
|
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
|
|
39
|
+
"@matter/testing": "0.16.2"
|
|
40
40
|
},
|
|
41
41
|
"files": [
|
|
42
42
|
"dist/**/*",
|
package/src/net/Network.ts
CHANGED
package/src/net/RetrySchedule.ts
CHANGED
package/src/time/TimeUnit.ts
CHANGED
package/src/time/Timestamp.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/util/Semaphore.ts
CHANGED
|
@@ -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";
|