@indigoai-us/hq-cloud 6.15.95 → 6.15.96
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/sync/event-sync.d.ts +11 -3
- package/dist/sync/event-sync.d.ts.map +1 -1
- package/dist/sync/event-sync.js +189 -101
- package/dist/sync/event-sync.js.map +1 -1
- package/dist/sync/event-sync.test.js +140 -0
- package/dist/sync/event-sync.test.js.map +1 -1
- package/dist/sync/feature-flags.test.js +68 -1
- package/dist/sync/feature-flags.test.js.map +1 -1
- package/dist/sync/push-transport.d.ts +18 -0
- package/dist/sync/push-transport.d.ts.map +1 -1
- package/dist/sync/push-transport.js +40 -0
- package/dist/sync/push-transport.js.map +1 -1
- package/dist/sync/state-store.d.ts +2 -2
- package/dist/sync/state-store.d.ts.map +1 -1
- package/dist/sync/state-store.js +186 -68
- package/dist/sync/state-store.js.map +1 -1
- package/dist/sync/state-store.test.js +72 -1
- package/dist/sync/state-store.test.js.map +1 -1
- package/dist/watcher.d.ts +4 -0
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +31 -6
- package/dist/watcher.js.map +1 -1
- package/dist/watcher.test.js +53 -0
- package/dist/watcher.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -35,6 +35,43 @@ const moduleLoadFetch = globalThis.fetch;
|
|
|
35
35
|
const moduleLoadAbortController = globalThis.AbortController;
|
|
36
36
|
const successOutcomes = new WeakMap();
|
|
37
37
|
const failureOutcomes = new WeakMap();
|
|
38
|
+
/** Server code for accounts that are deliberately denied realtime sync. */
|
|
39
|
+
export const REALTIME_UNAVAILABLE_CODE = "REALTIME_UNAVAILABLE";
|
|
40
|
+
/**
|
|
41
|
+
* A server-directed, non-retryable realtime denial. The caller should remain
|
|
42
|
+
* poll-only rather than treating this as a transient transport failure.
|
|
43
|
+
*/
|
|
44
|
+
export class RealtimeUnavailableError extends Error {
|
|
45
|
+
code = REALTIME_UNAVAILABLE_CODE;
|
|
46
|
+
retryable = false;
|
|
47
|
+
status;
|
|
48
|
+
constructor(opts) {
|
|
49
|
+
super(`${opts.operation}: realtime unavailable`);
|
|
50
|
+
this.name = "RealtimeUnavailableError";
|
|
51
|
+
this.status = opts.status;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Best-effort classifier for the server's coded realtime denial response. */
|
|
55
|
+
export function realtimeUnavailableErrorForResponse(status, body, operation) {
|
|
56
|
+
let parsed;
|
|
57
|
+
try {
|
|
58
|
+
const value = JSON.parse(body);
|
|
59
|
+
if (value && typeof value === "object") {
|
|
60
|
+
parsed = value;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// A proxy/body corruption must retain the existing generic-error behavior.
|
|
65
|
+
}
|
|
66
|
+
if (parsed?.code === REALTIME_UNAVAILABLE_CODE ||
|
|
67
|
+
(status === 403 && parsed?.error === "realtime-unavailable")) {
|
|
68
|
+
return new RealtimeUnavailableError({ status, operation });
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
export function isRealtimeUnavailableError(error) {
|
|
73
|
+
return error instanceof RealtimeUnavailableError;
|
|
74
|
+
}
|
|
38
75
|
function redactPublishDiagnostic(value) {
|
|
39
76
|
return value
|
|
40
77
|
.replace(/(bearer\s+)[^\s,;]+/gi, "$1[redacted]")
|
|
@@ -207,6 +244,9 @@ export class HttpPushTransport {
|
|
|
207
244
|
});
|
|
208
245
|
if (!res.ok) {
|
|
209
246
|
const text = await res.text().catch(() => "");
|
|
247
|
+
const realtimeUnavailable = realtimeUnavailableErrorForResponse(res.status, text, `HttpPushTransport: POST ${this.pushPath}`);
|
|
248
|
+
if (realtimeUnavailable)
|
|
249
|
+
throw realtimeUnavailable;
|
|
210
250
|
throw new Error(`HttpPushTransport: POST ${this.pushPath} failed (${res.status})${text ? `: ${text}` : ""}`);
|
|
211
251
|
}
|
|
212
252
|
successOutcomes.set(event, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-transport.js","sourceRoot":"","sources":["../../src/sync/push-transport.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"push-transport.js","sourceRoot":"","sources":["../../src/sync/push-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,8 @@ export declare function setStateStoreReflinkCopyHookForTest(hook: (() => void) |
|
|
|
18
18
|
export declare function setStateStorePositionalWriteForTest(write: ((fd: number, bytes: Buffer, offset: number, length: number, position: number) => number) | undefined): void;
|
|
19
19
|
/** Test-only seam for rotation-claim PID write failures. */
|
|
20
20
|
export declare function setStateStoreRotationClaimWriteHookForTest(hook: (() => void) | undefined): void;
|
|
21
|
+
/** Test-only seam for a failure while releasing an acquired rotation claim. */
|
|
22
|
+
export declare function setStateStoreRotationClaimReleaseHookForTest(hook: (() => void) | undefined): void;
|
|
21
23
|
/** Test-only seam for proving same-process async lock waiters queue cooperatively. */
|
|
22
24
|
export declare function setStateStoreScopeLockAcquiredHookForTest(hook: (() => void | Promise<void>) | undefined): void;
|
|
23
25
|
/** Test-only seam for contention after async optimistic recovery completes. */
|
|
@@ -256,8 +258,6 @@ export declare class StateStore<T> {
|
|
|
256
258
|
private compactionPlan;
|
|
257
259
|
/** Materialise off-lock, then publish only if no writer advanced the source. */
|
|
258
260
|
private publishCompactionPlan;
|
|
259
|
-
/** Async locking counterpart for recovered async compaction. */
|
|
260
|
-
private publishCompactionPlanAsync;
|
|
261
261
|
private installGeneration;
|
|
262
262
|
}
|
|
263
263
|
//# sourceMappingURL=state-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/sync/state-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/sync/state-store.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/state-store.js
CHANGED
|
@@ -59,6 +59,7 @@ let afterGenerationStageHookForTest;
|
|
|
59
59
|
let reflinkCopyHookForTest;
|
|
60
60
|
let positionalWriteForTest;
|
|
61
61
|
let rotationClaimWriteHookForTest;
|
|
62
|
+
let rotationClaimReleaseHookForTest;
|
|
62
63
|
let scopeLockAcquiredHookForTest;
|
|
63
64
|
let scopeLockWriteHookForTest;
|
|
64
65
|
let afterOptimisticRecoveryHookForTest;
|
|
@@ -110,6 +111,10 @@ export function setStateStorePositionalWriteForTest(write) {
|
|
|
110
111
|
export function setStateStoreRotationClaimWriteHookForTest(hook) {
|
|
111
112
|
rotationClaimWriteHookForTest = hook;
|
|
112
113
|
}
|
|
114
|
+
/** Test-only seam for a failure while releasing an acquired rotation claim. */
|
|
115
|
+
export function setStateStoreRotationClaimReleaseHookForTest(hook) {
|
|
116
|
+
rotationClaimReleaseHookForTest = hook;
|
|
117
|
+
}
|
|
113
118
|
/** Test-only seam for proving same-process async lock waiters queue cooperatively. */
|
|
114
119
|
export function setStateStoreScopeLockAcquiredHookForTest(hook) {
|
|
115
120
|
scopeLockAcquiredHookForTest = hook;
|
|
@@ -474,12 +479,45 @@ export class StateStore {
|
|
|
474
479
|
async compactIfNeededAsync() {
|
|
475
480
|
const compacted = await withRotationClaimAsync(this.stateDir, async () => {
|
|
476
481
|
while (true) {
|
|
482
|
+
let resolveStaged;
|
|
483
|
+
let rejectStaged;
|
|
484
|
+
const stagedReady = new Promise((resolve, reject) => {
|
|
485
|
+
resolveStaged = resolve;
|
|
486
|
+
rejectStaged = reject;
|
|
487
|
+
});
|
|
488
|
+
let publish;
|
|
477
489
|
const plan = await withScopeLockAsync(this.stateDir, () => {
|
|
478
490
|
if (!this.refreshFromDisk())
|
|
479
491
|
return undefined;
|
|
480
492
|
if (!this.needsCompaction())
|
|
481
493
|
return null;
|
|
482
|
-
|
|
494
|
+
const captured = this.compactionPlan(this.state, this.generation, this.lastRecordSequence, this.walBytes);
|
|
495
|
+
// Reserve the next in-process turn before releasing append.lock.
|
|
496
|
+
// Staging remains outside that lock, but queued async appenders cannot
|
|
497
|
+
// invalidate this capture before its short publish section runs.
|
|
498
|
+
const deadline = Date.now() + (asyncLockTimeoutMsForTest ?? ASYNC_LOCK_TIMEOUT_MS);
|
|
499
|
+
publish = withInProcessAsyncScopeLock(this.stateDir, async () => {
|
|
500
|
+
const staged = await stagedReady;
|
|
501
|
+
try {
|
|
502
|
+
return await withScopeLockAsyncUnlocked(this.stateDir, () => {
|
|
503
|
+
if (!this.refreshFromDisk())
|
|
504
|
+
return false;
|
|
505
|
+
if (this.generation !== captured.sourceGeneration ||
|
|
506
|
+
this.lastRecordSequence !== captured.sourceSequence ||
|
|
507
|
+
this.walBytes !== captured.sourceWalBytes)
|
|
508
|
+
return false;
|
|
509
|
+
publishStagedGeneration(this.stateDir, staged);
|
|
510
|
+
writeCurrentPointer(this.stateDir, captured.next.generation);
|
|
511
|
+
pruneGenerations(this.stateDir, [captured.sourceGeneration, captured.next.generation]);
|
|
512
|
+
this.installGeneration(captured.next);
|
|
513
|
+
return true;
|
|
514
|
+
}, deadline);
|
|
515
|
+
}
|
|
516
|
+
finally {
|
|
517
|
+
discardStagedGeneration(staged);
|
|
518
|
+
}
|
|
519
|
+
}, true);
|
|
520
|
+
return captured;
|
|
483
521
|
});
|
|
484
522
|
if (plan === undefined) {
|
|
485
523
|
await this.recoverNewestGenerationOutsideLockAsync();
|
|
@@ -487,7 +525,23 @@ export class StateStore {
|
|
|
487
525
|
}
|
|
488
526
|
if (plan === null)
|
|
489
527
|
return false;
|
|
490
|
-
|
|
528
|
+
try {
|
|
529
|
+
const staged = stageGeneration(this.stateDir, this.scopeDigest, plan.next);
|
|
530
|
+
try {
|
|
531
|
+
afterGenerationStageHookForTest?.();
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
discardStagedGeneration(staged);
|
|
535
|
+
throw error;
|
|
536
|
+
}
|
|
537
|
+
resolveStaged(staged);
|
|
538
|
+
}
|
|
539
|
+
catch (error) {
|
|
540
|
+
rejectStaged(error);
|
|
541
|
+
await publish.catch(() => undefined);
|
|
542
|
+
throw error;
|
|
543
|
+
}
|
|
544
|
+
if (await publish)
|
|
491
545
|
return true;
|
|
492
546
|
}
|
|
493
547
|
});
|
|
@@ -625,8 +679,11 @@ export class StateStore {
|
|
|
625
679
|
recovered = true;
|
|
626
680
|
continue;
|
|
627
681
|
}
|
|
628
|
-
if (compact)
|
|
629
|
-
|
|
682
|
+
if (compact) {
|
|
683
|
+
// The record is already durable. Defer failed maintenance to a later
|
|
684
|
+
// append rather than rejecting this callback-originated write.
|
|
685
|
+
await this.compactIfNeededAsync().catch(() => undefined);
|
|
686
|
+
}
|
|
630
687
|
return result;
|
|
631
688
|
}
|
|
632
689
|
}
|
|
@@ -652,8 +709,11 @@ export class StateStore {
|
|
|
652
709
|
recovered = true;
|
|
653
710
|
continue;
|
|
654
711
|
}
|
|
655
|
-
if (compact)
|
|
656
|
-
|
|
712
|
+
if (compact) {
|
|
713
|
+
// The record is already durable. Defer failed maintenance to a later
|
|
714
|
+
// append rather than rejecting this callback-originated write.
|
|
715
|
+
await this.compactIfNeededAsync().catch(() => undefined);
|
|
716
|
+
}
|
|
657
717
|
return result.result;
|
|
658
718
|
}
|
|
659
719
|
}
|
|
@@ -899,29 +959,6 @@ export class StateStore {
|
|
|
899
959
|
discardStagedGeneration(staged);
|
|
900
960
|
}
|
|
901
961
|
}
|
|
902
|
-
/** Async locking counterpart for recovered async compaction. */
|
|
903
|
-
async publishCompactionPlanAsync(plan) {
|
|
904
|
-
const staged = stageGeneration(this.stateDir, this.scopeDigest, plan.next);
|
|
905
|
-
try {
|
|
906
|
-
afterGenerationStageHookForTest?.();
|
|
907
|
-
return await withScopeLockAsync(this.stateDir, () => {
|
|
908
|
-
if (!this.refreshFromDisk())
|
|
909
|
-
return false;
|
|
910
|
-
if (this.generation !== plan.sourceGeneration ||
|
|
911
|
-
this.lastRecordSequence !== plan.sourceSequence ||
|
|
912
|
-
this.walBytes !== plan.sourceWalBytes)
|
|
913
|
-
return false;
|
|
914
|
-
publishStagedGeneration(this.stateDir, staged);
|
|
915
|
-
writeCurrentPointer(this.stateDir, plan.next.generation);
|
|
916
|
-
pruneGenerations(this.stateDir, [plan.sourceGeneration, plan.next.generation]);
|
|
917
|
-
this.installGeneration(plan.next);
|
|
918
|
-
return true;
|
|
919
|
-
});
|
|
920
|
-
}
|
|
921
|
-
finally {
|
|
922
|
-
discardStagedGeneration(staged);
|
|
923
|
-
}
|
|
924
|
-
}
|
|
925
962
|
installGeneration(generation) {
|
|
926
963
|
this.generation = generation.generation;
|
|
927
964
|
this.state = generation.state;
|
|
@@ -1753,7 +1790,7 @@ function withScopeLock(dir, action) {
|
|
|
1753
1790
|
// A synchronous contender cannot let an in-process async holder make
|
|
1754
1791
|
// progress: Atomics.wait would park the event loop the holder needs to
|
|
1755
1792
|
// release append.lock. Fail before attempting the spin instead.
|
|
1756
|
-
if (
|
|
1793
|
+
if (inProcessAsyncScopeLockHolders.has(path.resolve(dir))) {
|
|
1757
1794
|
throw new StateStoreLockError(`in-process async holder for ${lockPath}`, {
|
|
1758
1795
|
reason: "in-process-async-holder",
|
|
1759
1796
|
});
|
|
@@ -1954,8 +1991,11 @@ function withRotationClaim(dir, action) {
|
|
|
1954
1991
|
}
|
|
1955
1992
|
return undefined;
|
|
1956
1993
|
}
|
|
1957
|
-
if (!isAlreadyExists(error)
|
|
1994
|
+
if (!isAlreadyExists(error))
|
|
1958
1995
|
return undefined;
|
|
1996
|
+
if (removeLeakedRotationClaim(claimPath) || removeDeadLock(claimPath))
|
|
1997
|
+
continue;
|
|
1998
|
+
return undefined;
|
|
1959
1999
|
}
|
|
1960
2000
|
}
|
|
1961
2001
|
if (fd === undefined)
|
|
@@ -1972,9 +2012,11 @@ function withRotationClaim(dir, action) {
|
|
|
1972
2012
|
fs.closeSync(fd);
|
|
1973
2013
|
}
|
|
1974
2014
|
try {
|
|
2015
|
+
rotationClaimReleaseHookForTest?.();
|
|
1975
2016
|
fs.unlinkSync(claimPath);
|
|
1976
2017
|
}
|
|
1977
2018
|
catch (error) {
|
|
2019
|
+
leakedRotationClaims.add(path.resolve(claimPath));
|
|
1978
2020
|
throw new Error(`state-store: cannot release ${claimPath}`, { cause: error });
|
|
1979
2021
|
}
|
|
1980
2022
|
if (actionError !== undefined)
|
|
@@ -2017,8 +2059,11 @@ async function withRotationClaimAsync(dir, action) {
|
|
|
2017
2059
|
}
|
|
2018
2060
|
return undefined;
|
|
2019
2061
|
}
|
|
2020
|
-
if (!isAlreadyExists(error)
|
|
2062
|
+
if (!isAlreadyExists(error))
|
|
2021
2063
|
return undefined;
|
|
2064
|
+
if (await removeLeakedRotationClaimAsync(claimPath) || await removeDeadLockAsync(claimPath))
|
|
2065
|
+
continue;
|
|
2066
|
+
return undefined;
|
|
2022
2067
|
}
|
|
2023
2068
|
}
|
|
2024
2069
|
if (fd === undefined)
|
|
@@ -2035,16 +2080,62 @@ async function withRotationClaimAsync(dir, action) {
|
|
|
2035
2080
|
fs.closeSync(fd);
|
|
2036
2081
|
}
|
|
2037
2082
|
try {
|
|
2083
|
+
rotationClaimReleaseHookForTest?.();
|
|
2038
2084
|
await fs.promises.unlink(claimPath);
|
|
2039
2085
|
}
|
|
2040
2086
|
catch (error) {
|
|
2087
|
+
leakedRotationClaims.add(path.resolve(claimPath));
|
|
2041
2088
|
throw new Error(`state-store: cannot release ${claimPath}`, { cause: error });
|
|
2042
2089
|
}
|
|
2043
2090
|
if (actionError !== undefined)
|
|
2044
2091
|
throw actionError;
|
|
2045
2092
|
return result;
|
|
2046
2093
|
}
|
|
2094
|
+
// A release failure occurs after the compactor has closed its fd, so a later
|
|
2095
|
+
// rotation may safely retry only the claim this process knows it left behind.
|
|
2096
|
+
// Do not treat every live-PID claim as ours: another active compactor could
|
|
2097
|
+
// still own it.
|
|
2098
|
+
const leakedRotationClaims = new Set();
|
|
2099
|
+
function removeLeakedRotationClaim(claimPath) {
|
|
2100
|
+
const key = path.resolve(claimPath);
|
|
2101
|
+
if (!leakedRotationClaims.has(key))
|
|
2102
|
+
return false;
|
|
2103
|
+
try {
|
|
2104
|
+
if (fs.readFileSync(claimPath, "utf8").trim() !== String(process.pid)) {
|
|
2105
|
+
leakedRotationClaims.delete(key);
|
|
2106
|
+
return false;
|
|
2107
|
+
}
|
|
2108
|
+
fs.unlinkSync(claimPath);
|
|
2109
|
+
}
|
|
2110
|
+
catch (error) {
|
|
2111
|
+
if (!isMissing(error)) {
|
|
2112
|
+
throw new StateStoreLockError(`cannot recover leaked ${claimPath}`, { cause: error });
|
|
2113
|
+
}
|
|
2114
|
+
}
|
|
2115
|
+
leakedRotationClaims.delete(key);
|
|
2116
|
+
return true;
|
|
2117
|
+
}
|
|
2118
|
+
async function removeLeakedRotationClaimAsync(claimPath) {
|
|
2119
|
+
const key = path.resolve(claimPath);
|
|
2120
|
+
if (!leakedRotationClaims.has(key))
|
|
2121
|
+
return false;
|
|
2122
|
+
try {
|
|
2123
|
+
if ((await fs.promises.readFile(claimPath, "utf8")).trim() !== String(process.pid)) {
|
|
2124
|
+
leakedRotationClaims.delete(key);
|
|
2125
|
+
return false;
|
|
2126
|
+
}
|
|
2127
|
+
await fs.promises.unlink(claimPath);
|
|
2128
|
+
}
|
|
2129
|
+
catch (error) {
|
|
2130
|
+
if (!isMissing(error)) {
|
|
2131
|
+
throw new StateStoreLockError(`cannot recover leaked ${claimPath}`, { cause: error });
|
|
2132
|
+
}
|
|
2133
|
+
}
|
|
2134
|
+
leakedRotationClaims.delete(key);
|
|
2135
|
+
return true;
|
|
2136
|
+
}
|
|
2047
2137
|
const inProcessAsyncScopeLocks = new Map();
|
|
2138
|
+
const inProcessAsyncScopeLockHolders = new Set();
|
|
2048
2139
|
/**
|
|
2049
2140
|
* Serialize async acquisitions for one process before they reach append.lock.
|
|
2050
2141
|
*
|
|
@@ -2053,25 +2144,43 @@ const inProcessAsyncScopeLocks = new Map();
|
|
|
2053
2144
|
* is created synchronously: no async owner can leave append.lock behind while
|
|
2054
2145
|
* the event loop runs a synchronous contender.
|
|
2055
2146
|
*/
|
|
2056
|
-
async function withInProcessAsyncScopeLock(dir, action) {
|
|
2147
|
+
async function withInProcessAsyncScopeLock(dir, action, priority = false) {
|
|
2057
2148
|
const key = path.resolve(dir);
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2149
|
+
let queue = inProcessAsyncScopeLocks.get(key);
|
|
2150
|
+
if (!queue) {
|
|
2151
|
+
queue = { active: false, priority: [], ordinary: [] };
|
|
2152
|
+
inProcessAsyncScopeLocks.set(key, queue);
|
|
2153
|
+
}
|
|
2154
|
+
const result = new Promise((resolve, reject) => {
|
|
2155
|
+
const entry = { action, resolve, reject };
|
|
2156
|
+
(priority ? queue.priority : queue.ordinary).push(entry);
|
|
2062
2157
|
});
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
if (inProcessAsyncScopeLocks.get(key) ===
|
|
2158
|
+
runNextInProcessAsyncScopeLock(key, queue);
|
|
2159
|
+
return result;
|
|
2160
|
+
}
|
|
2161
|
+
function runNextInProcessAsyncScopeLock(key, queue) {
|
|
2162
|
+
if (queue.active)
|
|
2163
|
+
return;
|
|
2164
|
+
const entry = queue.priority.shift() ?? queue.ordinary.shift();
|
|
2165
|
+
if (!entry) {
|
|
2166
|
+
if (inProcessAsyncScopeLocks.get(key) === queue) {
|
|
2072
2167
|
inProcessAsyncScopeLocks.delete(key);
|
|
2073
2168
|
}
|
|
2169
|
+
return;
|
|
2074
2170
|
}
|
|
2171
|
+
queue.active = true;
|
|
2172
|
+
void (async () => {
|
|
2173
|
+
try {
|
|
2174
|
+
entry.resolve(await entry.action());
|
|
2175
|
+
}
|
|
2176
|
+
catch (error) {
|
|
2177
|
+
entry.reject(error);
|
|
2178
|
+
}
|
|
2179
|
+
finally {
|
|
2180
|
+
queue.active = false;
|
|
2181
|
+
runNextInProcessAsyncScopeLock(key, queue);
|
|
2182
|
+
}
|
|
2183
|
+
})();
|
|
2075
2184
|
}
|
|
2076
2185
|
function openExclusiveAsync(lockPath) {
|
|
2077
2186
|
return new Promise((resolve, reject) => {
|
|
@@ -2084,36 +2193,42 @@ function openExclusiveAsync(lockPath) {
|
|
|
2084
2193
|
});
|
|
2085
2194
|
}
|
|
2086
2195
|
/** Acquire append.lock without yielding after this process owns the file. */
|
|
2087
|
-
async function withScopeLockAsync(dir, action) {
|
|
2196
|
+
async function withScopeLockAsync(dir, action, options = {}) {
|
|
2088
2197
|
// This deadline starts when the caller enters the same-process queue, not
|
|
2089
2198
|
// when it reaches the head. Otherwise each queued caller can spend a fresh
|
|
2090
2199
|
// timeout behind a live foreign lock, turning one contention window into an
|
|
2091
2200
|
// unbounded same-process backlog.
|
|
2092
2201
|
const deadline = Date.now() + (asyncLockTimeoutMsForTest ?? ASYNC_LOCK_TIMEOUT_MS);
|
|
2093
|
-
return withInProcessAsyncScopeLock(dir,
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2202
|
+
return withInProcessAsyncScopeLock(dir, () => withScopeLockAsyncUnlocked(dir, action, deadline), options.priority);
|
|
2203
|
+
}
|
|
2204
|
+
/** Run one already-queued async scope operation without yielding after lock ownership. */
|
|
2205
|
+
async function withScopeLockAsyncUnlocked(dir, action, deadline) {
|
|
2206
|
+
const lockPath = path.join(dir, "append.lock");
|
|
2207
|
+
const key = path.resolve(dir);
|
|
2208
|
+
let fd;
|
|
2209
|
+
while (fd === undefined) {
|
|
2210
|
+
if (Date.now() >= deadline) {
|
|
2211
|
+
throw new StateStoreLockError(`timed out acquiring ${lockPath}`);
|
|
2212
|
+
}
|
|
2213
|
+
try {
|
|
2214
|
+
fd = await openExclusiveAsync(lockPath);
|
|
2215
|
+
fs.writeFileSync(fd, String(process.pid));
|
|
2216
|
+
fs.fdatasyncSync(fd);
|
|
2217
|
+
}
|
|
2218
|
+
catch (error) {
|
|
2219
|
+
if (!isAlreadyExists(error)) {
|
|
2220
|
+
throw new StateStoreLockError(`cannot acquire ${lockPath}`, { cause: error });
|
|
2221
|
+
}
|
|
2222
|
+
if (await removeDeadLockAsync(lockPath))
|
|
2223
|
+
continue;
|
|
2097
2224
|
if (Date.now() >= deadline) {
|
|
2098
2225
|
throw new StateStoreLockError(`timed out acquiring ${lockPath}`);
|
|
2099
2226
|
}
|
|
2100
|
-
|
|
2101
|
-
fd = await openExclusiveAsync(lockPath);
|
|
2102
|
-
fs.writeFileSync(fd, String(process.pid));
|
|
2103
|
-
fs.fdatasyncSync(fd);
|
|
2104
|
-
}
|
|
2105
|
-
catch (error) {
|
|
2106
|
-
if (!isAlreadyExists(error)) {
|
|
2107
|
-
throw new StateStoreLockError(`cannot acquire ${lockPath}`, { cause: error });
|
|
2108
|
-
}
|
|
2109
|
-
if (await removeDeadLockAsync(lockPath))
|
|
2110
|
-
continue;
|
|
2111
|
-
if (Date.now() >= deadline) {
|
|
2112
|
-
throw new StateStoreLockError(`timed out acquiring ${lockPath}`);
|
|
2113
|
-
}
|
|
2114
|
-
await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS));
|
|
2115
|
-
}
|
|
2227
|
+
await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS));
|
|
2116
2228
|
}
|
|
2229
|
+
}
|
|
2230
|
+
inProcessAsyncScopeLockHolders.add(key);
|
|
2231
|
+
try {
|
|
2117
2232
|
let result;
|
|
2118
2233
|
let actionError;
|
|
2119
2234
|
try {
|
|
@@ -2138,7 +2253,10 @@ async function withScopeLockAsync(dir, action) {
|
|
|
2138
2253
|
if (actionError !== undefined)
|
|
2139
2254
|
throw actionError;
|
|
2140
2255
|
return result;
|
|
2141
|
-
}
|
|
2256
|
+
}
|
|
2257
|
+
finally {
|
|
2258
|
+
inProcessAsyncScopeLockHolders.delete(key);
|
|
2259
|
+
}
|
|
2142
2260
|
}
|
|
2143
2261
|
function removeDeadLock(lockPath) {
|
|
2144
2262
|
let contents;
|