@superblocksteam/sdk 2.0.151 → 2.0.152-next.1

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.
Files changed (84) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/cli-replacement/automatic-upgrades.d.ts.map +1 -1
  3. package/dist/cli-replacement/automatic-upgrades.js +8 -6
  4. package/dist/cli-replacement/automatic-upgrades.js.map +1 -1
  5. package/dist/cli-replacement/dev-s3-restore.test.mjs +1 -0
  6. package/dist/cli-replacement/dev-s3-restore.test.mjs.map +1 -1
  7. package/dist/cli-replacement/dev-startup-git-before-dbfs-order.test.mjs +1 -0
  8. package/dist/cli-replacement/dev-startup-git-before-dbfs-order.test.mjs.map +1 -1
  9. package/dist/cli-replacement/dev.d.mts +148 -1
  10. package/dist/cli-replacement/dev.d.mts.map +1 -1
  11. package/dist/cli-replacement/dev.interception.test.mjs +259 -4
  12. package/dist/cli-replacement/dev.interception.test.mjs.map +1 -1
  13. package/dist/cli-replacement/dev.mjs +429 -28
  14. package/dist/cli-replacement/dev.mjs.map +1 -1
  15. package/dist/client.billing-usage.test.js +25 -0
  16. package/dist/client.billing-usage.test.js.map +1 -1
  17. package/dist/client.d.ts +19 -0
  18. package/dist/client.d.ts.map +1 -1
  19. package/dist/client.js.map +1 -1
  20. package/dist/collect-sdk-apis.d.mts +61 -3
  21. package/dist/collect-sdk-apis.d.mts.map +1 -1
  22. package/dist/collect-sdk-apis.mjs +97 -6
  23. package/dist/collect-sdk-apis.mjs.map +1 -1
  24. package/dist/collect-sdk-apis.test.mjs +277 -1
  25. package/dist/collect-sdk-apis.test.mjs.map +1 -1
  26. package/dist/dev-utils/dev-server-metrics.d.mts +17 -0
  27. package/dist/dev-utils/dev-server-metrics.d.mts.map +1 -1
  28. package/dist/dev-utils/dev-server-metrics.dependency-failure.test.d.mts +2 -0
  29. package/dist/dev-utils/dev-server-metrics.dependency-failure.test.d.mts.map +1 -0
  30. package/dist/dev-utils/dev-server-metrics.dependency-failure.test.mjs +108 -0
  31. package/dist/dev-utils/dev-server-metrics.dependency-failure.test.mjs.map +1 -0
  32. package/dist/dev-utils/dev-server-metrics.mjs +16 -2
  33. package/dist/dev-utils/dev-server-metrics.mjs.map +1 -1
  34. package/dist/dev-utils/dev-server.d.mts +9 -0
  35. package/dist/dev-utils/dev-server.d.mts.map +1 -1
  36. package/dist/dev-utils/dev-server.mjs +44 -27
  37. package/dist/dev-utils/dev-server.mjs.map +1 -1
  38. package/dist/dev-utils/dev-server.status.test.mjs +31 -1
  39. package/dist/dev-utils/dev-server.status.test.mjs.map +1 -1
  40. package/dist/dev-utils/fatal-exit.d.mts +17 -4
  41. package/dist/dev-utils/fatal-exit.d.mts.map +1 -1
  42. package/dist/dev-utils/fatal-exit.mjs +4 -3
  43. package/dist/dev-utils/fatal-exit.mjs.map +1 -1
  44. package/dist/extract-api-integrations.d.mts +1 -1
  45. package/dist/extract-api-integrations.d.mts.map +1 -1
  46. package/dist/extract-api-integrations.mjs +1 -1
  47. package/dist/extract-api-integrations.mjs.map +1 -1
  48. package/dist/flag.d.ts +5 -0
  49. package/dist/flag.d.ts.map +1 -1
  50. package/dist/flag.js +7 -0
  51. package/dist/flag.js.map +1 -1
  52. package/dist/flag.test.js +18 -0
  53. package/dist/flag.test.js.map +1 -1
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/types/common.d.ts +1 -0
  58. package/dist/types/common.d.ts.map +1 -1
  59. package/dist/types/common.js.map +1 -1
  60. package/dist/vite-plugin-generate-api-build-manifest.d.mts.map +1 -1
  61. package/dist/vite-plugin-generate-api-build-manifest.mjs +46 -0
  62. package/dist/vite-plugin-generate-api-build-manifest.mjs.map +1 -1
  63. package/package.json +6 -6
  64. package/src/cli-replacement/automatic-upgrades.ts +8 -6
  65. package/src/cli-replacement/dev-s3-restore.test.mts +1 -0
  66. package/src/cli-replacement/dev-startup-git-before-dbfs-order.test.mts +1 -0
  67. package/src/cli-replacement/dev.interception.test.mts +334 -10
  68. package/src/cli-replacement/dev.mts +499 -33
  69. package/src/client.billing-usage.test.ts +26 -0
  70. package/src/client.ts +21 -0
  71. package/src/collect-sdk-apis.mts +141 -5
  72. package/src/collect-sdk-apis.test.mts +380 -1
  73. package/src/dev-utils/dev-server-metrics.dependency-failure.test.mts +149 -0
  74. package/src/dev-utils/dev-server-metrics.mts +25 -1
  75. package/src/dev-utils/dev-server.mts +52 -29
  76. package/src/dev-utils/dev-server.status.test.mts +42 -0
  77. package/src/dev-utils/fatal-exit.mts +18 -4
  78. package/src/extract-api-integrations.mts +3 -0
  79. package/src/flag.test.ts +21 -0
  80. package/src/flag.ts +8 -0
  81. package/src/index.ts +1 -0
  82. package/src/types/common.ts +1 -0
  83. package/src/vite-plugin-generate-api-build-manifest.mts +74 -4
  84. package/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.mts","sourceRoot":"","sources":["../../src/cli-replacement/dev.mts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAWtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AA0BzE,OAAO,EACL,KAAK,iBAAiB,EAKvB,MAAM,qDAAqD,CAAC;AAQ7D,OAAO,KAAK,EACV,mBAAmB,EACnB,2BAA2B,EAC3B,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AAMrB,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EACV,iBAAiB,EAEjB,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAwB3B,OAAO,EAIL,KAAK,mBAAmB,EAEzB,MAAM,6BAA6B,CAAC;AAoKrC;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAgBvE;AAkND,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,iBAAiB,CAAC,EAAE,iBAAiB,iBAuRtC;AAwED,oBAAY,wBAAwB;IAClC,IAAI,iBAAiB;IACrB,KAAK,kBAAkB;IACvB;;;;;;OAMG;IACH,aAAa,kBAAkB;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,MAAM,GACZ,IAAI,CAIN;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED;;;;oBAIoB;AACpB,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,SAAS,GAAG,MAAM,CAgCpB;AAED,wBAAsB,GAAG,CAAC,OAAO,EAAE;IAEjC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC;IAGzB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAG1C,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAG3C,MAAM,CAAC,EAAE,WAAW,CAAC;IAGrB,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,GAAG,EAAE,cAAc,CAAC;IAEpB,mGAAmG;IACnG,qBAAqB,CAAC,EAAE,2BAA2B,CAAC;IAEpD,uFAAuF;IACvF,cAAc,CAAC,EAAE,UAAU,CAAC;IAE5B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,oGAAoG;IACpG,gCAAgC,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE9D,8FAA8F;IAC9F,mCAAmC,CAAC,EAAE,OAAO,CAAC;CAC/C,iBAsrCA"}
1
+ {"version":3,"file":"dev.d.mts","sourceRoot":"","sources":["../../src/cli-replacement/dev.mts"],"names":[],"mappings":"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"}
@@ -1,18 +1,19 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
2
  import { InitialInstallFailed, UpgradeFailed, } from "./dependency-install-classifier.mjs";
3
- import { handleStartupError } from "./dev.mjs";
3
+ import { flushTelemetryWithTimeout, handleStartupError, runFatalExitShutdown, upgradeCategoryCouldTaintTree, } from "./dev.mjs";
4
4
  // Mock the metrics module so we can assert recordInitialInstallFailure /
5
5
  // recordUpgradeFailure calls. vi.mock is hoisted, so we use vi.hoisted to
6
6
  // declare the spies before the factory.
7
- const { recordInitialInstallFailureMock, recordUpgradeFailureMock } = vi.hoisted(() => ({
7
+ const { recordInitialInstallFailureMock, recordUpgradeFailureMock, flushMock } = vi.hoisted(() => ({
8
8
  recordInitialInstallFailureMock: vi.fn(),
9
9
  recordUpgradeFailureMock: vi.fn(),
10
+ flushMock: vi.fn(),
10
11
  }));
11
12
  vi.mock("../dev-utils/dev-server-metrics.mjs", () => ({
12
13
  devServerMetrics: {
13
14
  recordInitialInstallFailure: recordInitialInstallFailureMock,
14
15
  recordUpgradeFailure: recordUpgradeFailureMock,
15
- flush: vi.fn(),
16
+ flush: flushMock,
16
17
  recordEndpoint: vi.fn(),
17
18
  recordSocketUpgrade: vi.fn(),
18
19
  recordViteEagerInit: vi.fn(),
@@ -21,10 +22,30 @@ vi.mock("../dev-utils/dev-server-metrics.mjs", () => ({
21
22
  recordWarmHandoff: vi.fn(),
22
23
  },
23
24
  }));
24
- const makeLogger = () => ({ error: () => { }, info: () => { }, warn: () => { } });
25
+ // The raced telemetry flush is the one piece of the fatal-exit path that talks
26
+ // to the OTel SDK, so it is stubbed to make both race outcomes reachable.
27
+ const { shutdownTelemetryMock } = vi.hoisted(() => ({
28
+ shutdownTelemetryMock: vi.fn(async () => true),
29
+ }));
30
+ vi.mock("../telemetry/index.js", async (importOriginal) => ({
31
+ ...(await importOriginal()),
32
+ shutdownTelemetry: shutdownTelemetryMock,
33
+ }));
34
+ // Annotated rather than cast so a new required `Logger` member breaks this file
35
+ // instead of being silently absent. `vi.fn()` over `() => {}` keeps every call
36
+ // assertable if a test ever needs to check what was logged.
37
+ const makeLogger = () => ({
38
+ debug: vi.fn(),
39
+ info: vi.fn(),
40
+ warn: vi.fn(),
41
+ error: vi.fn(),
42
+ });
25
43
  beforeEach(() => {
26
44
  recordInitialInstallFailureMock.mockClear();
27
45
  recordUpgradeFailureMock.mockClear();
46
+ flushMock.mockClear();
47
+ shutdownTelemetryMock.mockReset();
48
+ shutdownTelemetryMock.mockImplementation(async () => true);
28
49
  });
29
50
  describe("handleStartupError", () => {
30
51
  it("records + does NOT exit for InitialInstallFailed", () => {
@@ -68,6 +89,123 @@ describe("handleStartupError", () => {
68
89
  expect(decision).toBe("exit");
69
90
  expect(status.serverErrors).toHaveLength(0);
70
91
  });
92
+ // ENG-5297: in a disposable cloud sandbox the upgrade is an in-place
93
+ // `npm install` into the *live* node_modules, and the install manifest
94
+ // includes esbuild. A failed upgrade therefore kills the running esbuild
95
+ // service ("The service was stopped"), rejecting vitePromise — so
96
+ // "keep the current version" preserves a process that can no longer serve
97
+ // anything. Exiting hands the pod to SABS, which already reaps terminal pods
98
+ // (RestartPolicy: Never), instead of leaving a zombie answering 500s.
99
+ it("exits for UpgradeFailed in a disposable sandbox (live tree may be tainted)", () => {
100
+ const status = { serverErrors: [] };
101
+ const marker = new UpgradeFailed({
102
+ type: "dev-server/dependency-upgrade",
103
+ timestamp: "t",
104
+ category: "unknown",
105
+ currentVersion: "2.0.148",
106
+ targetVersion: "2.0.149",
107
+ rawError: "dependency upgrade failed (unknown)",
108
+ });
109
+ const decision = handleStartupError(marker, status, makeLogger(), {
110
+ disposableSandbox: true,
111
+ });
112
+ expect(decision).toBe("exit");
113
+ // The failure is still recorded so the exit is observable, not silent.
114
+ expect(status.serverErrors).toHaveLength(1);
115
+ // `outcome` distinguishes an exiting pod from one that merely degraded —
116
+ // without it a crash loop is indistinguishable from a quietly-degraded
117
+ // fleet.
118
+ expect(recordUpgradeFailureMock).toHaveBeenCalledWith(expect.objectContaining({ outcome: "exit" }));
119
+ // `record()` and `flush()` gate on the same `isTelemetryInitialized()`
120
+ // check with nothing async in between, so a `flush()` here can never drain
121
+ // the sample recorded a line earlier. The caller's `shutdownTelemetry()`
122
+ // is what actually forces the export.
123
+ expect(flushMock).not.toHaveBeenCalled();
124
+ });
125
+ // ENG-5336: exiting is the right call only when the failure could have
126
+ // mutated the on-disk tree. npm resolves the whole graph before it extracts
127
+ // anything, so a registry that refused/never answered the metadata fetch
128
+ // provably left `node_modules` — and the running esbuild service — untouched.
129
+ // These are also exactly the failures a registry outage produces, so exiting
130
+ // on them would take out every live-edit pod in the fleet at once, replacing
131
+ // them with pods that hit the same outage.
132
+ const RESOLUTION_PHASE_CATEGORIES = [
133
+ "not_in_registry",
134
+ "registry_auth_failed",
135
+ "registry_unreachable",
136
+ "tls_failed",
137
+ ];
138
+ // Every category the union names: the resolution-phase four plus the
139
+ // conservative default. Annotated rather than `as const` because a spread into
140
+ // a fresh literal widens `"unknown"` to `string` otherwise, which would take
141
+ // the type checking off `upgradeMarker` at the `it.each` below.
142
+ const ALL_UPGRADE_CATEGORIES = [...RESOLUTION_PHASE_CATEGORIES, "unknown"];
143
+ // Typing the parameter (rather than casting inside) is what keeps the
144
+ // `it.each` tables below checked end to end: a category added to either array
145
+ // that the marker cannot carry is a compile error, not a silent `any`.
146
+ const upgradeMarker = (category) => new UpgradeFailed({
147
+ type: "dev-server/dependency-upgrade",
148
+ timestamp: "t",
149
+ category,
150
+ currentVersion: "2.0.148",
151
+ targetVersion: "2.0.149",
152
+ rawError: `dependency upgrade failed (${category})`,
153
+ });
154
+ it.each(RESOLUTION_PHASE_CATEGORIES)("degrades in a disposable sandbox for the resolution-phase category '%s'", (category) => {
155
+ const status = { serverErrors: [] };
156
+ const decision = handleStartupError(upgradeMarker(category), status, makeLogger(), { disposableSandbox: true });
157
+ expect(decision).toBe("degrade");
158
+ expect(status.serverErrors).toHaveLength(1);
159
+ expect(recordUpgradeFailureMock).toHaveBeenCalledWith(expect.objectContaining({ category, outcome: "degrade" }));
160
+ });
161
+ it("still exits in a disposable sandbox for an unclassified failure", () => {
162
+ // ENG-5297 arrived as `category: "unknown"` — the conservative default
163
+ // must keep exiting, or this PR's whole reason for existing is undone.
164
+ const status = { serverErrors: [] };
165
+ expect(handleStartupError(upgradeMarker("unknown"), status, makeLogger(), {
166
+ disposableSandbox: true,
167
+ })).toBe("exit");
168
+ });
169
+ it.each(ALL_UPGRADE_CATEGORIES)("degrades on a developer machine regardless of category ('%s')", (category) => {
170
+ const status = { serverErrors: [] };
171
+ expect(handleStartupError(upgradeMarker(category), status, makeLogger(), {
172
+ disposableSandbox: false,
173
+ })).toBe("degrade");
174
+ expect(recordUpgradeFailureMock).toHaveBeenCalledWith(expect.objectContaining({ outcome: "degrade" }));
175
+ });
176
+ describe("upgradeCategoryCouldTaintTree", () => {
177
+ it.each(RESOLUTION_PHASE_CATEGORIES)("reports '%s' as unable to have touched the tree", (category) => {
178
+ expect(upgradeCategoryCouldTaintTree(category)).toBe(false);
179
+ });
180
+ it("defaults to 'could have tainted' for an unclassified failure", () => {
181
+ expect(upgradeCategoryCouldTaintTree("unknown")).toBe(true);
182
+ });
183
+ it("defaults to 'could have tainted' for a category it has never seen", () => {
184
+ // Conservative default: a future category must fail closed (exit), not
185
+ // silently inherit the degrade path. `string` is the real runtime contract
186
+ // here, since the payload crosses the socket — a category outside today's
187
+ // union cannot be put on an `UpgradeFailed` marker without an `as` cast,
188
+ // which is why this function takes the category rather than the marker.
189
+ expect(upgradeCategoryCouldTaintTree("brand_new")).toBe(true);
190
+ });
191
+ });
192
+ it("labels the degrade outcome and does not force a flush", () => {
193
+ const status = { serverErrors: [] };
194
+ const marker = new UpgradeFailed({
195
+ type: "dev-server/dependency-upgrade",
196
+ timestamp: "t",
197
+ category: "unknown",
198
+ currentVersion: "2.0.148",
199
+ targetVersion: "2.0.149",
200
+ rawError: "x",
201
+ });
202
+ handleStartupError(marker, status, makeLogger(), {
203
+ disposableSandbox: false,
204
+ });
205
+ expect(recordUpgradeFailureMock).toHaveBeenCalledWith(expect.objectContaining({ outcome: "degrade" }));
206
+ // A surviving process reaches the next export tick on its own.
207
+ expect(flushMock).not.toHaveBeenCalled();
208
+ });
71
209
  it("records + does NOT exit for UpgradeFailed (best-effort upgrade degrades)", () => {
72
210
  const status = { serverErrors: [] };
73
211
  const marker = new UpgradeFailed({
@@ -87,9 +225,126 @@ describe("handleStartupError", () => {
87
225
  category: "not_in_registry",
88
226
  npmErrorCode: "ETARGET",
89
227
  hasAnyRegistryConfigured: true,
228
+ outcome: "degrade",
90
229
  });
91
230
  // The upgrade failure must not be miscounted as an initial-install failure.
92
231
  expect(recordInitialInstallFailureMock).not.toHaveBeenCalled();
93
232
  });
94
233
  });
234
+ // ENG-5336: the two fatal-exit blocks in `dev()` depend on teardown steps that
235
+ // each talk to something that can fail or stop answering. Losing the lock
236
+ // release means the replacement sandbox's `acquireLock()` gets a ConflictError
237
+ // until the server-side TTL expires — and the replacement is the entire reason
238
+ // the exit path exists. `runFatalExitShutdown` is the shared, exported sequence
239
+ // those blocks call, so these are the guarantees the exit story rests on.
240
+ describe("runFatalExitShutdown", () => {
241
+ const stepTimeoutMs = 5000;
242
+ it("runs the steps in order: cache removal, then lock release", async () => {
243
+ const calls = [];
244
+ await runFatalExitShutdown({
245
+ logger: makeLogger(),
246
+ removeIntegrationCache: async () => {
247
+ calls.push("cache");
248
+ },
249
+ shutdownLockService: async () => {
250
+ calls.push("lock");
251
+ },
252
+ });
253
+ expect(calls).toEqual(["cache", "lock"]);
254
+ });
255
+ it("still releases the lock when cache removal rejects", async () => {
256
+ const shutdownLockService = vi.fn(async () => { });
257
+ await expect(runFatalExitShutdown({
258
+ logger: makeLogger(),
259
+ removeIntegrationCache: async () => {
260
+ throw new Error("ai-service IPC is gone");
261
+ },
262
+ shutdownLockService,
263
+ })).resolves.toBeUndefined();
264
+ expect(shutdownLockService).toHaveBeenCalledOnce();
265
+ });
266
+ it("still releases the lock when cache removal throws synchronously", async () => {
267
+ const shutdownLockService = vi.fn(async () => { });
268
+ await runFatalExitShutdown({
269
+ logger: makeLogger(),
270
+ removeIntegrationCache: () => {
271
+ throw new Error("sync boom");
272
+ },
273
+ shutdownLockService,
274
+ });
275
+ expect(shutdownLockService).toHaveBeenCalledOnce();
276
+ });
277
+ it("never rejects when the lock release itself rejects", async () => {
278
+ await expect(runFatalExitShutdown({
279
+ logger: makeLogger(),
280
+ shutdownLockService: async () => {
281
+ throw new Error("lock server unreachable");
282
+ },
283
+ })).resolves.toBeUndefined();
284
+ });
285
+ it("tolerates absent services (no ai-service / no lock service)", async () => {
286
+ await expect(runFatalExitShutdown({ logger: makeLogger() })).resolves.toBeUndefined();
287
+ });
288
+ // The hang is the ENG-5297 symptom itself: an unsettled await above the
289
+ // `finally { process.exit(1) }` leaves the pod Ready but zombied forever.
290
+ it("abandons a step that never settles and still runs the later steps", async () => {
291
+ vi.useFakeTimers();
292
+ try {
293
+ const shutdownLockService = vi.fn(async () => { });
294
+ const settled = vi.fn();
295
+ const done = runFatalExitShutdown({
296
+ logger: makeLogger(),
297
+ removeIntegrationCache: () => new Promise(() => { }),
298
+ shutdownLockService,
299
+ }).then(settled);
300
+ await vi.advanceTimersByTimeAsync(stepTimeoutMs - 1);
301
+ expect(shutdownLockService).not.toHaveBeenCalled();
302
+ await vi.advanceTimersByTimeAsync(2);
303
+ await done;
304
+ expect(shutdownLockService).toHaveBeenCalledOnce();
305
+ expect(settled).toHaveBeenCalledOnce();
306
+ }
307
+ finally {
308
+ vi.useRealTimers();
309
+ }
310
+ });
311
+ });
312
+ // Shared by the fatal-exit sequence above and the auto-upgrade CLI restart in
313
+ // `dev()`. It used to be duplicated at the restart site, and the copy never
314
+ // cleared its timeout timer — an armed 3s timer holds the event loop open for
315
+ // any caller that does not immediately `process.exit`.
316
+ describe("flushTelemetryWithTimeout", () => {
317
+ const flushTimeoutMs = 3000;
318
+ it("reports a completed flush and leaves no armed timer behind", async () => {
319
+ vi.useFakeTimers();
320
+ try {
321
+ await expect(flushTelemetryWithTimeout()).resolves.toBe(true);
322
+ expect(vi.getTimerCount()).toBe(0);
323
+ }
324
+ finally {
325
+ vi.useRealTimers();
326
+ }
327
+ });
328
+ it("reports a flush that did not run (telemetry never initialized)", async () => {
329
+ shutdownTelemetryMock.mockImplementation(async () => false);
330
+ await expect(flushTelemetryWithTimeout()).resolves.toBe(false);
331
+ });
332
+ // A stuck exporter must not wedge the exit: the timeout wins the race, the
333
+ // caller is told no flush happened, and the timer is still cleaned up.
334
+ it("gives up on a stuck exporter after the timeout and clears the timer", async () => {
335
+ vi.useFakeTimers();
336
+ try {
337
+ shutdownTelemetryMock.mockImplementation(() => new Promise(() => { }));
338
+ const pending = flushTelemetryWithTimeout();
339
+ await vi.advanceTimersByTimeAsync(flushTimeoutMs - 1);
340
+ expect(vi.getTimerCount()).toBe(1);
341
+ await vi.advanceTimersByTimeAsync(2);
342
+ await expect(pending).resolves.toBe(false);
343
+ expect(vi.getTimerCount()).toBe(0);
344
+ }
345
+ finally {
346
+ vi.useRealTimers();
347
+ }
348
+ });
349
+ });
95
350
  //# sourceMappingURL=dev.interception.test.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.interception.test.mjs","sourceRoot":"","sources":["../../src/cli-replacement/dev.interception.test.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.interception.test.mjs","sourceRoot":"","sources":["../../src/cli-replacement/dev.interception.test.mts"],"names":[],"mappings":"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"}