hikoutei 0.8.42 → 0.8.44
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/application/sync/service/SyncPollingSupervisor.d.ts +16 -0
- package/dist/application/sync/service/SyncPollingSupervisor.d.ts.map +1 -1
- package/dist/application/sync/service/SyncPollingSupervisor.js +24 -0
- package/dist/application/sync/service/SyncPollingSupervisor.js.map +1 -1
- package/dist/application/sync/service/effectSupervisor.d.ts.map +1 -1
- package/dist/application/sync/service/effectSupervisor.js +30 -1
- package/dist/application/sync/service/effectSupervisor.js.map +1 -1
- package/dist/application/sync/service/pollingSupervisor.d.ts +17 -0
- package/dist/application/sync/service/pollingSupervisor.d.ts.map +1 -1
- package/dist/application/sync/service/pollingSupervisor.js +50 -1
- package/dist/application/sync/service/pollingSupervisor.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,6 +7,18 @@ export interface SyncPollingSupervisorOptions<Report = unknown> {
|
|
|
7
7
|
readonly errorBackoffInitialMs?: number;
|
|
8
8
|
readonly errorBackoffMaxMs?: number;
|
|
9
9
|
readonly wait?: SyncPollingWait;
|
|
10
|
+
/**
|
|
11
|
+
* Deferral gate applied ONLY to the loop's FIRST pass (default: no gate).
|
|
12
|
+
*
|
|
13
|
+
* The first scheduled pass waits for this promise before any remote
|
|
14
|
+
* read starts, so a host can keep the first polling pass out of an
|
|
15
|
+
* initial drain on a shared request limiter. The gate is consulted once:
|
|
16
|
+
* after it resolves, passes keep the normal interval cadence. A gate
|
|
17
|
+
* that throws surfaces through the normal polling error path and is
|
|
18
|
+
* retried (with backoff) before any pass runs. Manual `runOnce()` calls
|
|
19
|
+
* are deliberately NOT gated: they are explicit caller-driven passes.
|
|
20
|
+
*/
|
|
21
|
+
readonly waitForFirstPass?: () => Promise<void>;
|
|
10
22
|
readonly onReport?: (report: Report) => void;
|
|
11
23
|
readonly onError?: (error: unknown) => void;
|
|
12
24
|
}
|
|
@@ -20,6 +32,8 @@ export declare class SyncPollingSupervisor<Report = unknown> {
|
|
|
20
32
|
private readonly errorBackoffInitialMs;
|
|
21
33
|
private readonly errorBackoffMaxMs;
|
|
22
34
|
private readonly wait;
|
|
35
|
+
private readonly waitForFirstPass;
|
|
36
|
+
private firstPassPending;
|
|
23
37
|
private readonly onReport;
|
|
24
38
|
private readonly onError;
|
|
25
39
|
private running;
|
|
@@ -31,6 +45,8 @@ export declare class SyncPollingSupervisor<Report = unknown> {
|
|
|
31
45
|
constructor(options: SyncPollingSupervisorOptions<Report>);
|
|
32
46
|
/** Starts the immediate-then-periodic polling loop. */
|
|
33
47
|
start(): void;
|
|
48
|
+
/** Returns whether a stop has been requested; used to interrupt gates. */
|
|
49
|
+
isStopping(): boolean;
|
|
34
50
|
/** Runs one pass or joins the pass already in flight. */
|
|
35
51
|
runOnce(): Promise<Report>;
|
|
36
52
|
/** Stops scheduling new polls and waits for the current remote read. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncPollingSupervisor.d.ts","sourceRoot":"","sources":["../../../../src/application/sync/service/SyncPollingSupervisor.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAMrD,KAAK,QAAQ,CAAC,MAAM,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpE,MAAM,WAAW,4BAA4B,CAAC,MAAM,GAAG,OAAO;IAC5D,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED;;;GAGG;AACH,qBAAa,qBAAqB,CAAC,MAAM,GAAG,OAAO;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,UAAU,CAA2B;gBAE1B,OAAO,EAAE,4BAA4B,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"SyncPollingSupervisor.d.ts","sourceRoot":"","sources":["../../../../src/application/sync/service/SyncPollingSupervisor.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAMrD,KAAK,QAAQ,CAAC,MAAM,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpE,MAAM,WAAW,4BAA4B,CAAC,MAAM,GAAG,OAAO;IAC5D,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;IAChC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED;;;GAGG;AACH,qBAAa,qBAAqB,CAAC,MAAM,GAAG,OAAO;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoC;IACrE,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,UAAU,CAA2B;gBAE1B,OAAO,EAAE,4BAA4B,CAAC,MAAM,CAAC;IAqBhE,uDAAuD;IAChD,KAAK,IAAI,IAAI;IAWpB,0EAA0E;IACnE,UAAU,IAAI,OAAO;IAI5B,yDAAyD;IAClD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAcjC,wEAAwE;IACjE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAed,OAAO;YA2BP,gBAAgB;IAoB9B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;CAOpB"}
|
|
@@ -12,6 +12,8 @@ export class SyncPollingSupervisor {
|
|
|
12
12
|
errorBackoffInitialMs;
|
|
13
13
|
errorBackoffMaxMs;
|
|
14
14
|
wait;
|
|
15
|
+
waitForFirstPass;
|
|
16
|
+
firstPassPending = false;
|
|
15
17
|
onReport;
|
|
16
18
|
onError;
|
|
17
19
|
running = false;
|
|
@@ -29,6 +31,8 @@ export class SyncPollingSupervisor {
|
|
|
29
31
|
throw new RangeError("poll maximum error backoff must be at least the initial backoff");
|
|
30
32
|
}
|
|
31
33
|
this.wait = options.wait ?? defaultWait;
|
|
34
|
+
this.waitForFirstPass = options.waitForFirstPass;
|
|
35
|
+
this.firstPassPending = options.waitForFirstPass !== undefined;
|
|
32
36
|
this.onReport = options.onReport;
|
|
33
37
|
this.onError = options.onError;
|
|
34
38
|
}
|
|
@@ -37,8 +41,17 @@ export class SyncPollingSupervisor {
|
|
|
37
41
|
if (this.running || !this.acceptingPasses)
|
|
38
42
|
return;
|
|
39
43
|
this.running = true;
|
|
44
|
+
// A stopped-and-restarted supervisor re-arms the first-pass gate: the
|
|
45
|
+
// loop never restarts (stop() is terminal for the accepting flag), but
|
|
46
|
+
// the flag is re-derived here so a fresh supervisor with a gate always
|
|
47
|
+
// consults it exactly once.
|
|
48
|
+
this.firstPassPending = this.waitForFirstPass !== undefined;
|
|
40
49
|
this.loopPromise = this.runLoop();
|
|
41
50
|
}
|
|
51
|
+
/** Returns whether a stop has been requested; used to interrupt gates. */
|
|
52
|
+
isStopping() {
|
|
53
|
+
return !this.acceptingPasses || !this.running;
|
|
54
|
+
}
|
|
42
55
|
/** Runs one pass or joins the pass already in flight. */
|
|
43
56
|
runOnce() {
|
|
44
57
|
if (!this.acceptingPasses) {
|
|
@@ -73,6 +86,17 @@ export class SyncPollingSupervisor {
|
|
|
73
86
|
let errorBackoff = this.errorBackoffInitialMs;
|
|
74
87
|
while (this.running) {
|
|
75
88
|
try {
|
|
89
|
+
if (this.firstPassPending && this.waitForFirstPass !== undefined) {
|
|
90
|
+
// The FIRST pass is deferred until the host gate resolves (for
|
|
91
|
+
// example the System_State drain readiness check). The flag is
|
|
92
|
+
// cleared only AFTER the gate resolves, so a throwing gate keeps
|
|
93
|
+
// the first pass pending through the normal error backoff; a
|
|
94
|
+
// stop() requested while the gate waits is honored right here.
|
|
95
|
+
await this.waitForFirstPass();
|
|
96
|
+
this.firstPassPending = false;
|
|
97
|
+
if (!this.running)
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
76
100
|
const report = await this.runOnce();
|
|
77
101
|
this.notifyReport(report);
|
|
78
102
|
errorBackoff = this.errorBackoffInitialMs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncPollingSupervisor.js","sourceRoot":"","sources":["../../../../src/application/sync/service/SyncPollingSupervisor.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,MAAM,gCAAgC,GAAG,KAAK,CAAC;AAC/C,MAAM,4BAA4B,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"SyncPollingSupervisor.js","sourceRoot":"","sources":["../../../../src/application/sync/service/SyncPollingSupervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effectSupervisor.d.ts","sourceRoot":"","sources":["../../../../src/application/sync/service/effectSupervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mFAAmF,CAAC;AAC/H,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAC;AACjG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAO1E,OAAO,
|
|
1
|
+
{"version":3,"file":"effectSupervisor.d.ts","sourceRoot":"","sources":["../../../../src/application/sync/service/effectSupervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mFAAmF,CAAC;AAC/H,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAC;AACjG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAO1E,OAAO,EAML,KAAK,sBAAsB,EAE5B,MAAM,mBAAmB,CAAC;AAmB3B,6EAA6E;AAC7E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACvD,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,8BAA8B,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC9C;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,2BAA2B,GACjC,sBAAsB,CAuGxB"}
|
|
@@ -12,10 +12,21 @@ import { runReconciliationScan, } from "../outbound/reconciliation/Reconciliatio
|
|
|
12
12
|
import { runUserInputCleanupScan } from "../outbound/reconciliation/CleanupScanner.js";
|
|
13
13
|
import { SYNC_PROJECTIONS } from "../sheetsContract/constants.js";
|
|
14
14
|
import { GOOGLE_SHEETS_API_DEFAULTS } from "../../../adapter/sheets/providers/google-sheets-api/constants.js";
|
|
15
|
-
import { createEffectWorkerSupervisor, APPEND_DISPATCH_THROTTLE_INTERVAL_MS, FAST_APPEND_BATCH_CANDIDATE_LIMIT, safeErrorMessage, } from "@hikoutei/ikisaki";
|
|
15
|
+
import { createEffectWorkerSupervisor, APPEND_DISPATCH_THROTTLE_INTERVAL_MS, FAST_APPEND_BATCH_CANDIDATE_LIMIT, readOutboxScanReadinessWithAdapter, safeErrorMessage, } from "@hikoutei/ikisaki";
|
|
16
16
|
import { SheetsEffectDispatcher } from "../outbound/SheetsEffectDispatcher.js";
|
|
17
17
|
/** Minimum delay between System_State reconciliation scans attached to the loop. */
|
|
18
18
|
const DEFAULT_RECONCILIATION_SCAN_INTERVAL_MS = 60_000;
|
|
19
|
+
/**
|
|
20
|
+
* Delay before the FIRST reconciliation scan for the real Google provider.
|
|
21
|
+
*
|
|
22
|
+
* A cold-start service opens with the whole initial backlog already in the
|
|
23
|
+
* outbox; an immediate scan would compete with the System_State drain on the
|
|
24
|
+
* shared request-start limiter. Delaying the first scan by one cadence (and
|
|
25
|
+
* additionally gating it on outbox drain readiness, see below) keeps the
|
|
26
|
+
* scanner out of the critical convergence path. Injected test providers keep
|
|
27
|
+
* the generic supervisor default of 0 (immediate first scan).
|
|
28
|
+
*/
|
|
29
|
+
const DEFAULT_INITIAL_RECONCILIATION_DELAY_MS = 60_000;
|
|
19
30
|
export function createEffectSupervisor(input) {
|
|
20
31
|
const { storage, mappings, provider, writer, effectWorkerId, options } = input;
|
|
21
32
|
// Periodic System_State reconciliation is a lazy repair net, not part of
|
|
@@ -80,6 +91,24 @@ export function createEffectSupervisor(input) {
|
|
|
80
91
|
workerId: effectWorkerId,
|
|
81
92
|
reconciliation: {
|
|
82
93
|
intervalMs: options.reconciliationIntervalMs ?? DEFAULT_RECONCILIATION_SCAN_INTERVAL_MS,
|
|
94
|
+
// Only the real Google Sheets provider starts with a large initial
|
|
95
|
+
// backlog; delay its first scan by one cadence so it cannot compete
|
|
96
|
+
// with the System_State drain on the shared limiter. Injected test
|
|
97
|
+
// providers keep the generic default (first scan immediately).
|
|
98
|
+
...(options.googleSheetsApi === undefined
|
|
99
|
+
? {}
|
|
100
|
+
: { initialReconciliationDelayMs: DEFAULT_INITIAL_RECONCILIATION_DELAY_MS }),
|
|
101
|
+
// First-scan gate: defer ONLY while normal claimable drain work is
|
|
102
|
+
// pending/processing/delivery_uncertain. A terminal failed head
|
|
103
|
+
// (repair-needed) must NEVER defer the scanner — the scanner is the
|
|
104
|
+
// repair net that supersedes the failed head, and deferring would
|
|
105
|
+
// wedge the stream forever. After the first scan the gate is no longer
|
|
106
|
+
// consulted, so busy-outbox scans keep the legacy lazy-repair
|
|
107
|
+
// behavior (isOutboxIdle stays omitted by design).
|
|
108
|
+
isFirstScanReady: async () => {
|
|
109
|
+
const readiness = await readOutboxScanReadinessWithAdapter(storage);
|
|
110
|
+
return readiness.status !== "busy";
|
|
111
|
+
},
|
|
83
112
|
// isOutboxIdle is optional on the supervisor contract and the scanner
|
|
84
113
|
// already defers while corrections are in flight, so it is omitted.
|
|
85
114
|
run: runSystemStateReconciliation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effectSupervisor.js","sourceRoot":"","sources":["../../../../src/application/sync/service/effectSupervisor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"effectSupervisor.js","sourceRoot":"","sources":["../../../../src/application/sync/service/effectSupervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,4 +23,21 @@ export interface CreatePollingSupervisorInput {
|
|
|
23
23
|
readonly options: InternalSyncServiceOptions;
|
|
24
24
|
}
|
|
25
25
|
export declare function createPollingSupervisor(input: CreatePollingSupervisorInput): SyncPollingSupervisor<MappedUserInputPollingReport>;
|
|
26
|
+
/**
|
|
27
|
+
* Waits (SQLite-only) until no claimable System_State drain work remains.
|
|
28
|
+
*
|
|
29
|
+
* Polls the kernel's System_State drain classification through the shared
|
|
30
|
+
* storage adapter — never the remote provider — until it reports `ready`
|
|
31
|
+
* or until `isStopping()` turns true (the loop's stop() is honored within
|
|
32
|
+
* one poll tick, so shutdown never waits for the drain). Only genuinely
|
|
33
|
+
* claimable System_State work (processing/delivery_uncertain effects and
|
|
34
|
+
* pending claimable heads) defers; terminal failed/conflict rows and the
|
|
35
|
+
* pending followers they block never defer, so a permanently stuck stream
|
|
36
|
+
* cannot stall the first polling pass forever.
|
|
37
|
+
*/
|
|
38
|
+
export declare function waitForSystemStateDrainReadiness(options: {
|
|
39
|
+
readonly storage: MikroOrmSqliteAdapter;
|
|
40
|
+
readonly isStopping: () => boolean;
|
|
41
|
+
readonly pollIntervalMs?: number;
|
|
42
|
+
}): Promise<void>;
|
|
26
43
|
//# sourceMappingURL=pollingSupervisor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pollingSupervisor.d.ts","sourceRoot":"","sources":["../../../../src/application/sync/service/pollingSupervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mFAAmF,CAAC;AAC/H,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AACvF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAC;AACjG,OAAO,KAAK,EACV,oBAAoB,EACpB,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,0FAA0F,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"pollingSupervisor.d.ts","sourceRoot":"","sources":["../../../../src/application/sync/service/pollingSupervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mFAAmF,CAAC;AAC/H,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AACvF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAC;AACjG,OAAO,KAAK,EACV,oBAAoB,EACpB,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,0FAA0F,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAcnE,6EAA6E;AAC7E,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,8BAA8B,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC9C;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,4BAA4B,GAClC,qBAAqB,CAAC,4BAA4B,CAAC,CAwDrD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC9D,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhB"}
|
|
@@ -10,7 +10,16 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { MAPPED_USER_INPUT_POLL_MODES, pollMappedUserInputWithMikroOrm, } from "../../../adapter/persistence/providers/mikro-orm/observation/MikroOrmUserInputPolling.js";
|
|
12
12
|
import { SyncPollingSupervisor } from "./SyncPollingSupervisor.js";
|
|
13
|
+
import { readSystemStateDrainReadinessWithAdapter } from "@hikoutei/ikisaki";
|
|
13
14
|
const DEFAULT_POLLING_FULL_SCAN_INTERVAL_MS = 60_000;
|
|
15
|
+
/**
|
|
16
|
+
* SQLite poll cadence for the first-pass System_State drain gate.
|
|
17
|
+
*
|
|
18
|
+
* While the gate is pending the loop performs one cheap outbox read per
|
|
19
|
+
* tick and nothing else; 250 ms keeps the first polling pass starting
|
|
20
|
+
* promptly after the drain without hammering SQLite.
|
|
21
|
+
*/
|
|
22
|
+
const FIRST_POLLING_PASS_READINESS_POLL_MS = 250;
|
|
14
23
|
export function createPollingSupervisor(input) {
|
|
15
24
|
const { storage, provider, mappings, writer, options } = input;
|
|
16
25
|
const pollingFullScanIntervalMs = options.pollingFullScanIntervalMs
|
|
@@ -43,11 +52,51 @@ export function createPollingSupervisor(input) {
|
|
|
43
52
|
lastSuccessfulFullScanAt = clock();
|
|
44
53
|
return report;
|
|
45
54
|
};
|
|
46
|
-
|
|
55
|
+
let supervisor;
|
|
56
|
+
supervisor = new SyncPollingSupervisor({
|
|
47
57
|
runPass: runPollingPass,
|
|
48
58
|
...(options.pollingIntervalMs === undefined ? {} : { intervalMs: options.pollingIntervalMs }),
|
|
59
|
+
// First-polling-pass gate: on a cold start the effect worker drains the
|
|
60
|
+
// initial System_State backlog while the first polling pass would
|
|
61
|
+
// otherwise compete with it on the shared request limiter. The loop's
|
|
62
|
+
// FIRST pass therefore waits (SQLite-only checks, stop-interruptible)
|
|
63
|
+
// until no claimable System_State drain work is left; terminal failed
|
|
64
|
+
// or conflict rows — and the pending followers they block — never
|
|
65
|
+
// defer, so a stuck stream cannot stall polling forever. After the
|
|
66
|
+
// first pass the gate is no longer consulted and the normal cadence
|
|
67
|
+
// (interval + safety full scans) is preserved. Manual runOnce() calls
|
|
68
|
+
// are caller-driven and bypass the gate.
|
|
69
|
+
waitForFirstPass: async () => {
|
|
70
|
+
await waitForSystemStateDrainReadiness({
|
|
71
|
+
storage,
|
|
72
|
+
isStopping: () => supervisor.isStopping(),
|
|
73
|
+
pollIntervalMs: FIRST_POLLING_PASS_READINESS_POLL_MS,
|
|
74
|
+
});
|
|
75
|
+
},
|
|
49
76
|
onReport: (report) => options.onPollingReport?.(report),
|
|
50
77
|
...(options.onPollingError === undefined ? {} : { onError: options.onPollingError }),
|
|
51
78
|
});
|
|
79
|
+
return supervisor;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Waits (SQLite-only) until no claimable System_State drain work remains.
|
|
83
|
+
*
|
|
84
|
+
* Polls the kernel's System_State drain classification through the shared
|
|
85
|
+
* storage adapter — never the remote provider — until it reports `ready`
|
|
86
|
+
* or until `isStopping()` turns true (the loop's stop() is honored within
|
|
87
|
+
* one poll tick, so shutdown never waits for the drain). Only genuinely
|
|
88
|
+
* claimable System_State work (processing/delivery_uncertain effects and
|
|
89
|
+
* pending claimable heads) defers; terminal failed/conflict rows and the
|
|
90
|
+
* pending followers they block never defer, so a permanently stuck stream
|
|
91
|
+
* cannot stall the first polling pass forever.
|
|
92
|
+
*/
|
|
93
|
+
export async function waitForSystemStateDrainReadiness(options) {
|
|
94
|
+
const pollIntervalMs = options.pollIntervalMs ?? FIRST_POLLING_PASS_READINESS_POLL_MS;
|
|
95
|
+
while (!options.isStopping()) {
|
|
96
|
+
const readiness = await readSystemStateDrainReadinessWithAdapter(options.storage);
|
|
97
|
+
if (readiness.status === "ready")
|
|
98
|
+
return;
|
|
99
|
+
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
100
|
+
}
|
|
52
101
|
}
|
|
53
102
|
//# sourceMappingURL=pollingSupervisor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pollingSupervisor.js","sourceRoot":"","sources":["../../../../src/application/sync/service/pollingSupervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,GAEhC,MAAM,0FAA0F,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"pollingSupervisor.js","sourceRoot":"","sources":["../../../../src/application/sync/service/pollingSupervisor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hikoutei",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.44",
|
|
4
4
|
"description": "Typed repository and safe write layer for Google Sheets-backed MVPs. SQLite-authoritative entity lifecycle with asynchronous Google Sheets projection.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|