@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.
@@ -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":"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"}
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/sync/state-store.ts"],"names":[],"mappings":"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"}
@@ -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
- return this.compactionPlan(this.state, this.generation, this.lastRecordSequence, this.walBytes);
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
- if (await this.publishCompactionPlanAsync(plan))
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
- this.compact();
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
- this.compact();
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 (inProcessAsyncScopeLocks.has(path.resolve(dir))) {
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) || !removeDeadLock(claimPath))
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) || !(await removeDeadLockAsync(claimPath)))
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
- const predecessor = inProcessAsyncScopeLocks.get(key) ?? Promise.resolve();
2059
- let release;
2060
- const tail = new Promise((resolve) => {
2061
- release = resolve;
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
- const queueTail = predecessor.then(() => tail, () => tail);
2064
- inProcessAsyncScopeLocks.set(key, queueTail);
2065
- await predecessor.catch(() => undefined);
2066
- try {
2067
- return await action();
2068
- }
2069
- finally {
2070
- release();
2071
- if (inProcessAsyncScopeLocks.get(key) === queueTail) {
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, async () => {
2094
- const lockPath = path.join(dir, "append.lock");
2095
- let fd;
2096
- while (fd === undefined) {
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
- try {
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;