@serfab/cadre-core 1.16.0 → 1.18.0
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/README.md +4 -3
- package/dist/bootstrap-peer-store-file.js +1 -1
- package/dist/bootstrap-peer-store.d.ts +1 -1
- package/dist/bootstrap-peer-store.js +4 -4
- package/dist/cadre-invite-protocol.d.ts +81 -142
- package/dist/cadre-invite-protocol.js +168 -458
- package/dist/cadre-invite-protocol.js.map +1 -1
- package/dist/cadre-join-request.d.ts +15 -2
- package/dist/cadre-join-request.js +22 -3
- package/dist/cadre-join-request.js.map +1 -1
- package/dist/cadre-node.d.ts +1089 -475
- package/dist/cadre-node.js +2170 -1037
- package/dist/cadre-node.js.map +1 -1
- package/dist/control-authorization.d.ts +36 -14
- package/dist/control-authorization.js +20 -3
- package/dist/control-authorization.js.map +1 -1
- package/dist/control-cohort.d.ts +88 -32
- package/dist/control-cohort.js +91 -33
- package/dist/control-cohort.js.map +1 -1
- package/dist/control-database.d.ts +856 -318
- package/dist/control-database.js +1422 -701
- package/dist/control-database.js.map +1 -1
- package/dist/control-formation-recorder.d.ts +46 -43
- package/dist/control-formation-recorder.js +77 -78
- package/dist/control-formation-recorder.js.map +1 -1
- package/dist/control-protocol-guard.d.ts +11 -4
- package/dist/control-protocol-guard.js +20 -5
- package/dist/control-protocol-guard.js.map +1 -1
- package/dist/control-schema-version.d.ts +97 -0
- package/dist/control-schema-version.js +225 -0
- package/dist/control-schema-version.js.map +1 -0
- package/dist/control-schema.d.ts +45 -5
- package/dist/control-schema.js +262 -78
- package/dist/control-schema.js.map +1 -1
- package/dist/control-write-retry.d.ts +45 -10
- package/dist/control-write-retry.js +92 -22
- package/dist/control-write-retry.js.map +1 -1
- package/dist/delegate-admission.d.ts +13 -0
- package/dist/delegate-admission.js +27 -0
- package/dist/delegate-admission.js.map +1 -1
- package/dist/ed25519-key.d.ts +10 -7
- package/dist/ed25519-key.js +23 -20
- package/dist/ed25519-key.js.map +1 -1
- package/dist/edge-node/config.d.ts +122 -0
- package/dist/edge-node/config.js +199 -0
- package/dist/edge-node/config.js.map +1 -0
- package/dist/edge-node/dissolve.d.ts +95 -0
- package/dist/edge-node/dissolve.js +184 -0
- package/dist/edge-node/dissolve.js.map +1 -0
- package/dist/edge-node/edge-join.d.ts +44 -0
- package/dist/edge-node/edge-join.js +227 -0
- package/dist/edge-node/edge-join.js.map +1 -0
- package/dist/edge-node/edge-node.d.ts +295 -0
- package/dist/edge-node/edge-node.js +704 -0
- package/dist/edge-node/edge-node.js.map +1 -0
- package/dist/edge-node/index.d.ts +18 -0
- package/dist/edge-node/index.js +18 -0
- package/dist/edge-node/index.js.map +1 -0
- package/dist/edge-node/join-credential.d.ts +11 -0
- package/dist/edge-node/join-credential.js +11 -0
- package/dist/edge-node/join-credential.js.map +1 -0
- package/dist/edge-node/lazy-raw-storage.d.ts +40 -0
- package/dist/edge-node/lazy-raw-storage.js +134 -0
- package/dist/edge-node/lazy-raw-storage.js.map +1 -0
- package/dist/edge-node/node-local.d.ts +60 -0
- package/dist/edge-node/node-local.js +58 -0
- package/dist/edge-node/node-local.js.map +1 -0
- package/dist/edge-node/options.d.ts +83 -0
- package/dist/edge-node/options.js +110 -0
- package/dist/edge-node/options.js.map +1 -0
- package/dist/edge-node/owner-grant.d.ts +41 -0
- package/dist/edge-node/owner-grant.js +38 -0
- package/dist/edge-node/owner-grant.js.map +1 -0
- package/dist/edge-node/platform.d.ts +140 -0
- package/dist/edge-node/platform.js +12 -0
- package/dist/edge-node/platform.js.map +1 -0
- package/dist/edge-node/strand-move.d.ts +115 -0
- package/dist/edge-node/strand-move.js +223 -0
- package/dist/edge-node/strand-move.js.map +1 -0
- package/dist/edge-node/strands.d.ts +28 -0
- package/dist/edge-node/strands.js +60 -0
- package/dist/edge-node/strands.js.map +1 -0
- package/dist/enrolled-machine-store.d.ts +3 -3
- package/dist/enrolled-machine-store.js +3 -3
- package/dist/formation-token.d.ts +48 -0
- package/dist/formation-token.js +26 -0
- package/dist/formation-token.js.map +1 -0
- package/dist/index.d.ts +27 -17
- package/dist/index.js +39 -17
- package/dist/index.js.map +1 -1
- package/dist/joined-strand-store.d.ts +29 -12
- package/dist/joined-strand-store.js +66 -27
- package/dist/joined-strand-store.js.map +1 -1
- package/dist/key-store.d.ts +9 -4
- package/dist/key-store.js +9 -4
- package/dist/key-store.js.map +1 -1
- package/dist/link-budget.d.ts +9 -7
- package/dist/link-budget.js +9 -7
- package/dist/link-budget.js.map +1 -1
- package/dist/machine-removal.d.ts +19 -39
- package/dist/machine-removal.js +24 -98
- package/dist/machine-removal.js.map +1 -1
- package/dist/member-redemption.d.ts +256 -0
- package/dist/member-redemption.js +490 -0
- package/dist/member-redemption.js.map +1 -0
- package/dist/membership-view.d.ts +91 -0
- package/dist/membership-view.js +110 -0
- package/dist/membership-view.js.map +1 -0
- package/dist/owner-anchor-sync.d.ts +4 -4
- package/dist/owner-anchor-sync.js +16 -15
- package/dist/owner-anchor-sync.js.map +1 -1
- package/dist/owner-grant-protocol.d.ts +251 -0
- package/dist/owner-grant-protocol.js +344 -0
- package/dist/owner-grant-protocol.js.map +1 -0
- package/dist/owner-key-export.d.ts +70 -0
- package/dist/owner-key-export.js +279 -0
- package/dist/owner-key-export.js.map +1 -0
- package/dist/owner-key-flows.d.ts +55 -0
- package/dist/owner-key-flows.js +60 -0
- package/dist/owner-key-flows.js.map +1 -0
- package/dist/owner-key-store.d.ts +31 -0
- package/dist/owner-key-store.js +81 -0
- package/dist/owner-key-store.js.map +1 -0
- package/dist/owner-keys.d.ts +78 -0
- package/dist/owner-keys.js +133 -0
- package/dist/owner-keys.js.map +1 -0
- package/dist/owner-signer.d.ts +54 -0
- package/dist/owner-signer.js +51 -0
- package/dist/owner-signer.js.map +1 -0
- package/dist/peer-addr-book.d.ts +10 -1
- package/dist/peer-addr-book.js +4 -3
- package/dist/peer-addr-book.js.map +1 -1
- package/dist/peer-authorization.d.ts +83 -18
- package/dist/peer-authorization.js +123 -53
- package/dist/peer-authorization.js.map +1 -1
- package/dist/peer-join-backfill.d.ts +89 -20
- package/dist/peer-join-backfill.js +265 -108
- package/dist/peer-join-backfill.js.map +1 -1
- package/dist/pending-join-runner.d.ts +48 -18
- package/dist/pending-join-runner.js +74 -56
- package/dist/pending-join-runner.js.map +1 -1
- package/dist/provider/rent-node.js +1 -1
- package/dist/provider/rent-node.js.map +1 -1
- package/dist/seed-bootstrap.d.ts +162 -133
- package/dist/seed-bootstrap.js +300 -283
- package/dist/seed-bootstrap.js.map +1 -1
- package/dist/seed-trust-policy.js +4 -4
- package/dist/strand-addr-protocol.d.ts +4 -1
- package/dist/strand-addr-protocol.js +8 -2
- package/dist/strand-addr-protocol.js.map +1 -1
- package/dist/strand-cohort.d.ts +3 -0
- package/dist/strand-cohort.js.map +1 -1
- package/dist/strand-database.d.ts +24 -2
- package/dist/strand-database.js +29 -6
- package/dist/strand-database.js.map +1 -1
- package/dist/strand-first-sync-gate.d.ts +176 -88
- package/dist/strand-first-sync-gate.js +288 -121
- package/dist/strand-first-sync-gate.js.map +1 -1
- package/dist/strand-formation-deadlines.d.ts +9 -9
- package/dist/strand-formation-deadlines.js +9 -9
- package/dist/strand-formation-manager.d.ts +23 -17
- package/dist/strand-formation-manager.js +46 -44
- package/dist/strand-formation-manager.js.map +1 -1
- package/dist/strand-formation-protocol.d.ts +5 -8
- package/dist/strand-formation-protocol.js +101 -16
- package/dist/strand-formation-protocol.js.map +1 -1
- package/dist/strand-instance-manager.d.ts +27 -18
- package/dist/strand-instance-manager.js +119 -50
- package/dist/strand-instance-manager.js.map +1 -1
- package/dist/strand-membership-reconciler.d.ts +16 -13
- package/dist/strand-membership-reconciler.js +30 -22
- package/dist/strand-membership-reconciler.js.map +1 -1
- package/dist/strand-membership-writer.d.ts +45 -22
- package/dist/strand-membership-writer.js +226 -131
- package/dist/strand-membership-writer.js.map +1 -1
- package/dist/strand-move.d.ts +6 -5
- package/dist/strand-move.js +36 -32
- package/dist/strand-move.js.map +1 -1
- package/dist/strand-peer-redial.js +2 -3
- package/dist/strand-peer-redial.js.map +1 -1
- package/dist/strand-revocation-enforcer.d.ts +134 -60
- package/dist/strand-revocation-enforcer.js +144 -71
- package/dist/strand-revocation-enforcer.js.map +1 -1
- package/dist/strand-solicitation.d.ts +50 -39
- package/dist/strand-solicitation.js +10 -3
- package/dist/strand-solicitation.js.map +1 -1
- package/dist/strand-watcher.d.ts +80 -13
- package/dist/strand-watcher.js +152 -48
- package/dist/strand-watcher.js.map +1 -1
- package/dist/table-change-watch.d.ts +63 -0
- package/dist/table-change-watch.js +209 -0
- package/dist/table-change-watch.js.map +1 -0
- package/dist/timeout-scheduler.d.ts +4 -3
- package/dist/timeout-scheduler.js +4 -3
- package/dist/timeout-scheduler.js.map +1 -1
- package/dist/types.d.ts +374 -150
- package/dist/types.js +4 -4
- package/dist/types.js.map +1 -1
- package/package.json +17 -8
- package/src/bootstrap-peer-store-file.ts +44 -44
- package/src/bootstrap-peer-store.ts +214 -214
- package/src/cadre-invite-protocol.ts +740 -1052
- package/src/cadre-join-request.ts +24 -3
- package/src/cadre-node.ts +2402 -1079
- package/src/control-authorization.ts +47 -14
- package/src/control-cohort.ts +204 -128
- package/src/control-database.ts +1749 -820
- package/src/control-formation-recorder.ts +359 -353
- package/src/control-protocol-guard.ts +23 -6
- package/src/control-schema-version.ts +301 -0
- package/src/control-schema.ts +273 -78
- package/src/control-write-retry.ts +641 -567
- package/src/delegate-admission.ts +351 -314
- package/src/ed25519-key.ts +174 -171
- package/src/edge-node/config.ts +277 -0
- package/src/edge-node/dissolve.ts +251 -0
- package/src/edge-node/edge-join.ts +319 -0
- package/src/edge-node/edge-node.ts +1045 -0
- package/src/edge-node/index.ts +59 -0
- package/src/edge-node/join-credential.ts +16 -0
- package/src/edge-node/lazy-raw-storage.ts +178 -0
- package/src/edge-node/node-local.ts +84 -0
- package/src/edge-node/options.ts +179 -0
- package/src/edge-node/owner-grant.ts +63 -0
- package/src/edge-node/platform.ts +151 -0
- package/src/edge-node/strand-move.ts +270 -0
- package/src/edge-node/strands.ts +72 -0
- package/src/enrolled-machine-store.ts +3 -3
- package/src/formation-token.ts +63 -0
- package/src/index.ts +899 -789
- package/src/joined-strand-store.ts +73 -28
- package/src/key-store.ts +10 -4
- package/src/link-budget.ts +9 -7
- package/src/machine-removal.ts +26 -111
- package/src/member-redemption.ts +649 -0
- package/src/membership-view.ts +144 -0
- package/src/owner-anchor-sync.ts +19 -18
- package/src/owner-grant-protocol.ts +547 -0
- package/src/owner-key-export.ts +348 -0
- package/src/owner-key-flows.ts +109 -0
- package/src/owner-key-store.ts +85 -0
- package/src/owner-keys.ts +178 -0
- package/src/owner-signer.ts +94 -0
- package/src/peer-addr-book.ts +4 -3
- package/src/peer-authorization.ts +558 -488
- package/src/peer-join-backfill.ts +971 -761
- package/src/pending-join-runner.ts +76 -53
- package/src/provider/rent-node.ts +1 -1
- package/src/seed-bootstrap.ts +343 -349
- package/src/seed-trust-policy.ts +4 -4
- package/src/strand-addr-protocol.ts +547 -538
- package/src/strand-cohort.ts +4 -0
- package/src/strand-database.ts +352 -319
- package/src/strand-first-sync-gate.ts +334 -133
- package/src/strand-formation-deadlines.ts +227 -227
- package/src/strand-formation-manager.ts +731 -725
- package/src/strand-formation-protocol.ts +122 -24
- package/src/strand-instance-manager.ts +2092 -2026
- package/src/strand-membership-reconciler.ts +33 -25
- package/src/strand-membership-writer.ts +2093 -1974
- package/src/strand-move.ts +50 -38
- package/src/strand-peer-redial.ts +2 -3
- package/src/strand-revocation-enforcer.ts +740 -654
- package/src/strand-solicitation.ts +61 -34
- package/src/strand-watcher.ts +175 -56
- package/src/table-change-watch.ts +285 -0
- package/src/timeout-scheduler.ts +29 -28
- package/src/types.ts +391 -152
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One way for cadre-core to be told that a control or strand table changed, so an idle loop
|
|
3
|
+
* can wait for a change instead of re-reading on a timer. Built on Quereus's
|
|
4
|
+
* `Database.watch`, which hears both a commit made on this `Database` and, through the
|
|
5
|
+
* Optimystic plugin's `notifyExternalChange` bridge, every change this node's storage takes
|
|
6
|
+
* in from elsewhere: a consensus commit it took part in as a cohort member, a block-transfer
|
|
7
|
+
* push such as join backfill, and a read-repair landing. Events are table-wide; there are no
|
|
8
|
+
* row keys.
|
|
9
|
+
*
|
|
10
|
+
* The consumer's `onChange` never runs inside a commit. The watch handler only sets flags
|
|
11
|
+
* and arms a timer, and runs are single-flight: changes inside the coalescing window share
|
|
12
|
+
* one run, a change during a run produces exactly one follow-up run, and a consumer's own
|
|
13
|
+
* `trigger` (start, retry backoff) and the backstop go through the same rule.
|
|
14
|
+
* `docs/architecture.md` → "Table change subscriptions" says what the seam does not hear,
|
|
15
|
+
* which is why consumers keep a backstop.
|
|
16
|
+
*/
|
|
17
|
+
import debug from 'debug';
|
|
18
|
+
import { defaultTimeoutScheduler } from './timeout-scheduler.js';
|
|
19
|
+
const log = debug('sereus:cadre:table-watch');
|
|
20
|
+
/**
|
|
21
|
+
* Default coalescing window. One local commit fires the watch twice (Quereus's own
|
|
22
|
+
* post-commit dispatch, then the plugin's storage event); this folds both into one run.
|
|
23
|
+
*/
|
|
24
|
+
export const TABLE_CHANGE_COALESCE_MS = 50;
|
|
25
|
+
/**
|
|
26
|
+
* Subscribe `onChange` to changes in `tables` (qualified `'Schema.Table'` names, e.g.
|
|
27
|
+
* `'CadreControl.Strand'`). Throws synchronously on a name that is not qualified, or a table
|
|
28
|
+
* that does not exist.
|
|
29
|
+
*
|
|
30
|
+
* NOTE: the plugin arms its storage bridge for a table on that table's first full
|
|
31
|
+
* initialization on this `Database`, so a table not yet touched hears local commits only,
|
|
32
|
+
* not replicated ones. Consumers' start runs touch their tables; the seam does not, because
|
|
33
|
+
* touching a never-written collection consults the network.
|
|
34
|
+
*
|
|
35
|
+
* NOTE: Quereus silently disposes a subscription whose table is dropped or altered. Control
|
|
36
|
+
* and strand schemas are fixed for a database's life (an app-schema attach adds `App` tables
|
|
37
|
+
* and alters no `Strand` one), so nothing re-subscribes; revisit if that stops holding.
|
|
38
|
+
*/
|
|
39
|
+
export function watchTables(db, tables, onChange, options) {
|
|
40
|
+
return new TableChangeWatcher({ db, tables }, onChange, options);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* {@link watchTables}' schedule — single-flight runs, `trigger`, the backstop — with no table
|
|
44
|
+
* subscription, for a consumer with no database to watch (tests, fakes).
|
|
45
|
+
*/
|
|
46
|
+
export function scheduleRuns(onChange, options) {
|
|
47
|
+
return new TableChangeWatcher(undefined, onChange, options);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The subscriptions one database owner has handed out, so its `close()` can dispose those
|
|
51
|
+
* still live — synchronously, ahead of its own awaits, so nothing a closing commit does
|
|
52
|
+
* schedules a run. (`Database.close()` disposes them too, but only after its own awaits.)
|
|
53
|
+
*/
|
|
54
|
+
export class TableWatchRegistry {
|
|
55
|
+
constructor() {
|
|
56
|
+
this.live = new Set();
|
|
57
|
+
}
|
|
58
|
+
watch(db, tables, onChange, options) {
|
|
59
|
+
const inner = watchTables(db, tables, onChange, options);
|
|
60
|
+
const tracked = {
|
|
61
|
+
trigger: delayMs => inner.trigger(delayMs),
|
|
62
|
+
dispose: () => {
|
|
63
|
+
this.live.delete(tracked);
|
|
64
|
+
inner.dispose();
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
this.live.add(tracked);
|
|
68
|
+
return tracked;
|
|
69
|
+
}
|
|
70
|
+
disposeAll() {
|
|
71
|
+
for (const watch of [...this.live]) {
|
|
72
|
+
watch.dispose();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
class TableChangeWatcher {
|
|
77
|
+
constructor(watched, onChange, options) {
|
|
78
|
+
this.onChange = onChange;
|
|
79
|
+
this.options = options;
|
|
80
|
+
/** The consumer's name for each watched table, by Quereus's lowercased `schema.table` key. */
|
|
81
|
+
this.names = new Map();
|
|
82
|
+
/**
|
|
83
|
+
* Every armed timer: the coalescing window, `trigger` delays and the backstop. Whichever
|
|
84
|
+
* fires first starts the run, and starting a run clears the rest.
|
|
85
|
+
*/
|
|
86
|
+
this.wakes = new Set();
|
|
87
|
+
this.running = false;
|
|
88
|
+
/** A timer fired while a run was in flight: one more run, a window after it settles. */
|
|
89
|
+
this.rerun = false;
|
|
90
|
+
this.disposed = false;
|
|
91
|
+
this.warnedThenable = false;
|
|
92
|
+
this.scheduler = options.scheduler ?? defaultTimeoutScheduler;
|
|
93
|
+
this.coalesceMs = options.coalesceMs ?? TABLE_CHANGE_COALESCE_MS;
|
|
94
|
+
this.subscription = watched && this.subscribe(watched);
|
|
95
|
+
this.armBackstop();
|
|
96
|
+
}
|
|
97
|
+
trigger(delayMs = 0) {
|
|
98
|
+
if (!this.disposed) {
|
|
99
|
+
this.arm(delayMs);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
dispose() {
|
|
103
|
+
if (this.disposed) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
this.disposed = true;
|
|
107
|
+
this.subscription?.unsubscribe();
|
|
108
|
+
this.clearWakes();
|
|
109
|
+
}
|
|
110
|
+
subscribe({ db, tables }) {
|
|
111
|
+
const watches = tables.map(fullTableWatch);
|
|
112
|
+
watches.forEach((watch, i) => this.names.set(tableKey(watch), tables[i]));
|
|
113
|
+
const scope = { watches, nonDeterministicSources: [], unboundParameters: [] };
|
|
114
|
+
// Returns undefined, so Quereus never awaits consumer work inside a commit.
|
|
115
|
+
return db.watch(scope, event => this.handleChange(event));
|
|
116
|
+
}
|
|
117
|
+
/** Runs inside the committing call, possibly under the control write lock: flags and a timer only. */
|
|
118
|
+
handleChange(event) {
|
|
119
|
+
if (this.disposed) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.coalesceWake ?? (this.coalesceWake = this.arm(this.coalesceMs));
|
|
123
|
+
for (const { watch } of event.matched) {
|
|
124
|
+
this.invalidate(this.names.get(tableKey(watch)) ?? tableKey(watch));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
invalidate(table) {
|
|
128
|
+
let result;
|
|
129
|
+
try {
|
|
130
|
+
result = this.options.onInvalidate?.(table);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
log('%s: onInvalidate threw for %s: %O', this.options.label, table, err);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (!this.warnedThenable && isThenable(result)) {
|
|
137
|
+
this.warnedThenable = true;
|
|
138
|
+
log('%s: misuse — onInvalidate returned a promise for %s; it is never awaited, and must only set a flag', this.options.label, table);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
arm(delayMs) {
|
|
142
|
+
const wake = { handle: undefined };
|
|
143
|
+
wake.handle = this.scheduler.setTimeout(() => this.fire(wake), delayMs);
|
|
144
|
+
this.wakes.add(wake);
|
|
145
|
+
return wake;
|
|
146
|
+
}
|
|
147
|
+
armBackstop() {
|
|
148
|
+
if (this.options.backstopMs !== undefined) {
|
|
149
|
+
this.arm(this.options.backstopMs);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
clearWakes() {
|
|
153
|
+
for (const wake of this.wakes) {
|
|
154
|
+
this.scheduler.clearTimeout(wake.handle);
|
|
155
|
+
}
|
|
156
|
+
this.wakes.clear();
|
|
157
|
+
this.coalesceWake = undefined;
|
|
158
|
+
}
|
|
159
|
+
fire(wake) {
|
|
160
|
+
if (!this.wakes.delete(wake)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (wake === this.coalesceWake) {
|
|
164
|
+
this.coalesceWake = undefined;
|
|
165
|
+
}
|
|
166
|
+
if (this.running) {
|
|
167
|
+
this.rerun = true;
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
this.clearWakes();
|
|
171
|
+
this.rerun = false;
|
|
172
|
+
this.running = true;
|
|
173
|
+
void this.run();
|
|
174
|
+
}
|
|
175
|
+
async run() {
|
|
176
|
+
try {
|
|
177
|
+
await this.onChange();
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
log('%s: change run failed: %O', this.options.label, err);
|
|
181
|
+
}
|
|
182
|
+
this.running = false;
|
|
183
|
+
this.settled();
|
|
184
|
+
}
|
|
185
|
+
settled() {
|
|
186
|
+
if (this.disposed) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (this.rerun) {
|
|
190
|
+
this.coalesceWake ?? (this.coalesceWake = this.arm(this.coalesceMs));
|
|
191
|
+
}
|
|
192
|
+
this.armBackstop();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function fullTableWatch(qualifiedTable) {
|
|
196
|
+
const [schema, table, ...rest] = qualifiedTable.split('.');
|
|
197
|
+
if (!schema || !table || rest.length > 0) {
|
|
198
|
+
throw new Error(`watchTables: '${qualifiedTable}' is not a qualified 'Schema.Table' name`);
|
|
199
|
+
}
|
|
200
|
+
return { table: { schema, table }, columns: 'all', scope: { kind: 'full' } };
|
|
201
|
+
}
|
|
202
|
+
/** Quereus's own matching key for a watched table. */
|
|
203
|
+
function tableKey(watch) {
|
|
204
|
+
return `${watch.table.schema}.${watch.table.table}`.toLowerCase();
|
|
205
|
+
}
|
|
206
|
+
function isThenable(value) {
|
|
207
|
+
return typeof value === 'object' && value !== null && typeof value.then === 'function';
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=table-change-watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-change-watch.js","sourceRoot":"","sources":["../src/table-change-watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The timer seam shared by the
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* The timer seam shared by the loops that re-arm themselves one step at a time — the
|
|
3
|
+
* membership reconciler's retry ladder (`strand-membership-reconciler.ts`) — and by the table
|
|
4
|
+
* change subscription's coalescing, trigger and backstop timers (`table-change-watch.ts`), on
|
|
5
|
+
* which the first-sync write gate's probes run (`strand-first-sync-gate.ts`). `setTimeout`
|
|
5
6
|
* rather than a repeating interval because the next step is armed only once the previous
|
|
6
7
|
* one settles, so a slow network read never stacks steps behind it, and because the delay
|
|
7
8
|
* can differ per step.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The timer seam shared by the
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* The timer seam shared by the loops that re-arm themselves one step at a time — the
|
|
3
|
+
* membership reconciler's retry ladder (`strand-membership-reconciler.ts`) — and by the table
|
|
4
|
+
* change subscription's coalescing, trigger and backstop timers (`table-change-watch.ts`), on
|
|
5
|
+
* which the first-sync write gate's probes run (`strand-first-sync-gate.ts`). `setTimeout`
|
|
5
6
|
* rather than a repeating interval because the next step is armed only once the previous
|
|
6
7
|
* one settles, so a slow network read never stacks steps behind it, and because the delay
|
|
7
8
|
* can differ per step.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeout-scheduler.js","sourceRoot":"","sources":["../src/timeout-scheduler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"timeout-scheduler.js","sourceRoot":"","sources":["../src/timeout-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,uBAAuB,GAAqB;IACvD,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,MAAiC,CAAC,KAAK,EAAE,EAAE,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAA4C,CAAC;CACrF,CAAC"}
|