hikoutei 0.8.39 → 0.8.40

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Hikoutei.d.ts","sourceRoot":"","sources":["../../src/api/Hikoutei.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,EAEL,cAAc,EACd,KAAK,gCAAgC,EACtC,MAAM,aAAa,CAAC;AAYrB,sDAAsD;AACtD,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AA2CD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,+BAA+B,EACzC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,gCAAgC,CAAC,EAClE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAChC,QAAQ,CAEV;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GAC9D,MAAM,CAMR;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAmBlF;AAED;;;;;;;;GAQG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,QAAQ,CAAC,CAkBnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,QAAQ,CAAC,CA8BnB"}
1
+ {"version":3,"file":"Hikoutei.d.ts","sourceRoot":"","sources":["../../src/api/Hikoutei.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,EAEL,cAAc,EACd,KAAK,gCAAgC,EACtC,MAAM,aAAa,CAAC;AAuBrB,sDAAsD;AACtD,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AA+QD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,+BAA+B,EACzC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,gCAAgC,CAAC,EAClE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAChC,QAAQ,CAEV;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GAC9D,MAAM,CAMR;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAmBlF;AAED;;;;;;;;GAQG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,QAAQ,CAAC,CAkBnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,QAAQ,CAAC,CA8BnB"}
@@ -11,16 +11,36 @@ import { createEntityManager } from "./internalEntityManager.js";
11
11
  import { HIKOUTEI_ERROR_CODES, HikouteiError } from "./errors.js";
12
12
  import { getRegisteredEntityTokens, } from "./entity.js";
13
13
  import { resolveEntityDescriptors, } from "./internalEntityRegistry.js";
14
+ import { describeErrorForInternalLog, getHikouteiInternalLogger, logHikouteiInternalEvent, } from "../shared/observability/internalLog.js";
15
+ import { HIKOUTEI_LOG_COMPONENTS, HIKOUTEI_LOG_EVENTS, } from "../shared/observability/logEvents.js";
16
+ import { AsyncLocalStorage } from "node:async_hooks";
14
17
  /** Environment variable that supplies the default SQLite path. */
15
18
  const HIKOUTEI_DB_PATH_ENV = "HIKOUTEI_DB_PATH";
16
19
  /** SQLite path used when neither `dbName` nor the env var is set. */
17
20
  const DEFAULT_DB_PATH = "./hikoutei.sqlite";
21
+ const beforeCloseHookContext = new AsyncLocalStorage();
18
22
  class HikouteiImpl {
19
23
  provider;
20
24
  beforeClose;
21
25
  /** Root entity manager; call `fork()` before request or job-local work. */
22
26
  em;
23
- closed = false;
27
+ closeState = "open";
28
+ /**
29
+ * The single in-flight close attempt. Concurrent close() calls OUTSIDE
30
+ * the active beforeClose hook await this same promise, so cleanup runs
31
+ * exactly once per attempt and every caller observes the same outcome
32
+ * (single-flight). The shared promise represents the FULL close +
33
+ * process-logger-drain operation and settles only AFTER the drain
34
+ * completes (final safe step), so a close() that lands while the first
35
+ * attempt is still draining — including one arriving after
36
+ * performClose() succeeded but before the drain finished — awaits the
37
+ * SAME attempt until the drain is done instead of resolving early on
38
+ * the terminal marker or starting a second cleanup. A close() called
39
+ * from WITHIN the hook resolves immediately instead (MEDIUM 5:
40
+ * awaiting the pending attempt from the hook would self-deadlock). A
41
+ * failed attempt leaves the runtime retryable after the slot release.
42
+ */
43
+ closeAttempt;
24
44
  constructor(provider, descriptors, beforeClose) {
25
45
  this.provider = provider;
26
46
  this.beforeClose = beforeClose;
@@ -28,27 +48,200 @@ class HikouteiImpl {
28
48
  }
29
49
  /** Stops internal service work, then releases the local SQLite connection. */
30
50
  async close() {
31
- if (this.closed)
51
+ // Concurrent callers share the single in-flight attempt. This check
52
+ // comes BEFORE the terminal fast path so a caller that arrives after
53
+ // performClose() succeeded but while the final logger drain is still
54
+ // running awaits the SAME attempt (which settles only after drain)
55
+ // instead of resolving early on the closed marker — the shared
56
+ // promise represents the full close + drain operation.
57
+ if (this.closeAttempt !== undefined) {
58
+ // MEDIUM 5: a close awaited from within the ACTIVE beforeClose hook
59
+ // of THIS runtime must not await the pending attempt — the attempt
60
+ // cannot settle until the hook returns, so awaiting it would
61
+ // self-deadlock. The call resolves immediately: the close is already
62
+ // in progress and owned by the outer caller, so the hook must not
63
+ // rely on the reentrant promise for completion. The exemption is
64
+ // scoped to the OWNING runtime (runtime identity in the context) AND
65
+ // to the hook's execution window (`active`): a close() on a
66
+ // DIFFERENT runtime made from inside the hook, or a close() from a
67
+ // DETACHED callback (setImmediate/promise continuation) that runs
68
+ // AFTER the hook's execution window ended, is an ordinary concurrent
69
+ // call and shares that runtime's in-flight attempt, observing its
70
+ // exact outcome (Luna: the flag is cleared in `finally`, so the
71
+ // detached callback cannot bypass the close/drain attempt). Callers
72
+ // OUTSIDE any hook (no context store) keep sharing the attempt too.
73
+ const marker = beforeCloseHookContext.getStore();
74
+ if (marker !== undefined && marker.runtime === this && marker.active) {
75
+ return;
76
+ }
77
+ return this.closeAttempt;
78
+ }
79
+ // A successful close is terminal and idempotent: later calls resolve
80
+ // immediately without touching the provider again.
81
+ if (this.closeState === "closed")
32
82
  return;
33
- this.closed = true;
34
- let beforeCloseError;
83
+ let settleAttempt = () => { };
84
+ const attempt = new Promise((resolve, reject) => {
85
+ settleAttempt = (outcome) => {
86
+ if (outcome.ok)
87
+ resolve();
88
+ else
89
+ reject(outcome.error);
90
+ };
91
+ });
92
+ this.closeAttempt = attempt;
93
+ // The shared attempt is observed by concurrent callers outside the
94
+ // hook; when none exists, a failed attempt must not surface as an
95
+ // unhandled rejection. The no-op side handler marks the rejection
96
+ // handled for the runtime while those callers still receive the
97
+ // original rejection.
98
+ attempt.catch(() => undefined);
99
+ // The attempt's outcome is decided ONLY after the process logger
100
+ // drain completes (final safe step): the shared promise represents
101
+ // the full close + drain operation, so a concurrent caller awaiting
102
+ // it (including one that arrived while the drain was running) cannot
103
+ // proceed before every final event is on disk.
104
+ let failed = false;
105
+ let failure;
35
106
  try {
36
- await this.beforeClose?.();
107
+ await this.performClose();
37
108
  }
38
109
  catch (error) {
39
- beforeCloseError = error;
110
+ // Boolean flag, never `error !== undefined`: a hook or provider
111
+ // that throws `undefined` is still a FAILED attempt and the shared
112
+ // promise must reject, never resolve.
113
+ failed = true;
114
+ failure = error;
40
115
  }
41
116
  try {
42
- await this.provider.close();
117
+ // The soak collector reads the log file immediately after close();
118
+ // drain the process logger queue so every final event (including
119
+ // RUNTIME_CLOSED and any close-failure line) is on disk before the
120
+ // attempt settles. Drain is fail-open by contract, and even a
121
+ // throwing drain must never mask the close outcome — it is
122
+ // swallowed, never propagated.
123
+ await getHikouteiInternalLogger().drain();
124
+ }
125
+ catch {
126
+ // Fail-open: the drain exists to flush diagnostics, so its failure
127
+ // must not change the close outcome decided above.
128
+ }
129
+ // Settle the shared attempt with the ORIGINAL outcome so every
130
+ // concurrent caller observes exactly the same success or failure.
131
+ if (failed) {
132
+ settleAttempt({ ok: false, error: failure });
43
133
  }
44
- catch (providerError) {
45
- if (beforeCloseError !== undefined) {
46
- throw new AggregateError([beforeCloseError, providerError], "Hikoutei failed to stop internal work and close SQLite.");
134
+ else {
135
+ settleAttempt({ ok: true });
136
+ }
137
+ // Release the shared slot only after the attempt settled (final safe
138
+ // step). On success performClose() made the close terminal; on
139
+ // failure performClose() already returned the state to retryable
140
+ // "open", so the NEXT close() call after the slot release genuinely
141
+ // re-runs the cleanup. The original failure is rethrown unchanged to
142
+ // THIS caller after the slot release; concurrent callers already
143
+ // received it through the shared attempt.
144
+ this.closeAttempt = undefined;
145
+ if (failed)
146
+ throw failure;
147
+ }
148
+ /**
149
+ * Runs one full cleanup attempt (beforeClose + provider close).
150
+ *
151
+ * Marks the runtime terminally closed ONLY after the provider close
152
+ * succeeded. EVERY failure — a throwing beforeClose hook, a throwing
153
+ * provider close, or the aggregate of both — explicitly returns the
154
+ * state to retryable `open` before the original error is rethrown
155
+ * unchanged, so the next close() call genuinely re-runs the full
156
+ * cleanup instead of no-oping on a half-closed runtime.
157
+ */
158
+ async performClose() {
159
+ this.closeState = "closing";
160
+ try {
161
+ let beforeCloseFailed = false;
162
+ let beforeCloseError;
163
+ try {
164
+ const beforeClose = this.beforeClose;
165
+ if (beforeClose !== undefined) {
166
+ // MEDIUM 5: the hook runs inside the marked async context so a
167
+ // close() called from within it is recognized as reentrant for
168
+ // THIS runtime (and never awaits its own pending attempt). The
169
+ // stored runtime identity scopes the exemption: a cross-runtime
170
+ // close() made from the hook is not reentrant.
171
+ //
172
+ // Luna: the exemption is scoped to the hook's EXECUTION WINDOW.
173
+ // Detached setImmediate/promise callbacks scheduled by the hook
174
+ // retain the AsyncLocalStorage store after run() returns, so the
175
+ // active flag is cleared in `finally` once the hook's execution
176
+ // has ended — those callbacks' close() then awaits the same
177
+ // close/drain attempt instead of bypassing it. The flag is
178
+ // cleared even when the hook throws.
179
+ const marker = { runtime: this, active: true };
180
+ try {
181
+ await beforeCloseHookContext.run(marker, () => beforeClose());
182
+ }
183
+ finally {
184
+ marker.active = false;
185
+ }
186
+ }
47
187
  }
48
- throw providerError;
188
+ catch (error) {
189
+ // Boolean flag, never `error !== undefined`: a hook that throws
190
+ // `undefined` is still a FAILED hook and must keep the attempt
191
+ // failed and retryable instead of being treated as success.
192
+ beforeCloseFailed = true;
193
+ beforeCloseError = error;
194
+ }
195
+ try {
196
+ await this.provider.close();
197
+ }
198
+ catch (providerError) {
199
+ logHikouteiInternalEvent({
200
+ event: HIKOUTEI_LOG_EVENTS.RUNTIME_CLOSE_FAILED,
201
+ level: "error",
202
+ component: HIKOUTEI_LOG_COMPONENTS.RUNTIME,
203
+ ...describeErrorForInternalLog(providerError),
204
+ });
205
+ if (beforeCloseFailed) {
206
+ // Luna: the AggregateError preserves BOTH original failure
207
+ // values as-thrown — including a hook that throws `undefined`
208
+ // or `null`, which are legitimate thrown values. The errors
209
+ // array must never replace the original hook failure with a
210
+ // synthetic Error, so diagnostics can always inspect exactly
211
+ // what each stage threw.
212
+ throw new AggregateError([beforeCloseError, providerError], "Hikoutei failed to stop internal work and close SQLite.");
213
+ }
214
+ throw providerError;
215
+ }
216
+ if (beforeCloseFailed) {
217
+ logHikouteiInternalEvent({
218
+ event: HIKOUTEI_LOG_EVENTS.RUNTIME_CLOSE_FAILED,
219
+ level: "error",
220
+ component: HIKOUTEI_LOG_COMPONENTS.RUNTIME,
221
+ ...describeErrorForInternalLog(beforeCloseError),
222
+ });
223
+ // `throw beforeCloseError` is intentional: `undefined` is a
224
+ // legitimate thrown value and the rejection still marks the
225
+ // attempt failed (the caller's catch below returns the state to
226
+ // retryable open).
227
+ throw beforeCloseError;
228
+ }
229
+ this.closeState = "closed";
230
+ logHikouteiInternalEvent({
231
+ event: HIKOUTEI_LOG_EVENTS.RUNTIME_CLOSED,
232
+ level: "info",
233
+ component: HIKOUTEI_LOG_COMPONENTS.RUNTIME,
234
+ });
235
+ }
236
+ catch (error) {
237
+ // Explicit state transition for EVERY failure path (beforeClose or
238
+ // provider): the runtime returns to retryable `open` so the next
239
+ // close() re-runs the cleanup. The original error is rethrown
240
+ // unchanged; the shared-attempt slot was already released by the
241
+ // caller's finally block.
242
+ this.closeState = "open";
243
+ throw error;
49
244
  }
50
- if (beforeCloseError !== undefined)
51
- throw beforeCloseError;
52
245
  }
53
246
  }
54
247
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Hikoutei.js","sourceRoot":"","sources":["../../src/api/Hikoutei.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Hikoutei.js","sourceRoot":"","sources":["../../src/api/Hikoutei.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.39",
3
+ "version": "0.8.40",
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",