@superblocksteam/sdk 2.0.151 → 2.0.152-next.0
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/.turbo/turbo-build.log +1 -1
- package/dist/cli-replacement/automatic-upgrades.d.ts.map +1 -1
- package/dist/cli-replacement/automatic-upgrades.js +8 -6
- package/dist/cli-replacement/automatic-upgrades.js.map +1 -1
- package/dist/cli-replacement/dev-s3-restore.test.mjs +1 -0
- package/dist/cli-replacement/dev-s3-restore.test.mjs.map +1 -1
- package/dist/cli-replacement/dev-startup-git-before-dbfs-order.test.mjs +1 -0
- package/dist/cli-replacement/dev-startup-git-before-dbfs-order.test.mjs.map +1 -1
- package/dist/cli-replacement/dev.d.mts +148 -1
- package/dist/cli-replacement/dev.d.mts.map +1 -1
- package/dist/cli-replacement/dev.interception.test.mjs +259 -4
- package/dist/cli-replacement/dev.interception.test.mjs.map +1 -1
- package/dist/cli-replacement/dev.mjs +429 -28
- package/dist/cli-replacement/dev.mjs.map +1 -1
- package/dist/client.billing-usage.test.js +25 -0
- package/dist/client.billing-usage.test.js.map +1 -1
- package/dist/client.d.ts +19 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/collect-sdk-apis.d.mts +61 -3
- package/dist/collect-sdk-apis.d.mts.map +1 -1
- package/dist/collect-sdk-apis.mjs +97 -6
- package/dist/collect-sdk-apis.mjs.map +1 -1
- package/dist/collect-sdk-apis.test.mjs +277 -1
- package/dist/collect-sdk-apis.test.mjs.map +1 -1
- package/dist/dev-utils/dev-server-metrics.d.mts +17 -0
- package/dist/dev-utils/dev-server-metrics.d.mts.map +1 -1
- package/dist/dev-utils/dev-server-metrics.dependency-failure.test.d.mts +2 -0
- package/dist/dev-utils/dev-server-metrics.dependency-failure.test.d.mts.map +1 -0
- package/dist/dev-utils/dev-server-metrics.dependency-failure.test.mjs +108 -0
- package/dist/dev-utils/dev-server-metrics.dependency-failure.test.mjs.map +1 -0
- package/dist/dev-utils/dev-server-metrics.mjs +16 -2
- package/dist/dev-utils/dev-server-metrics.mjs.map +1 -1
- package/dist/dev-utils/dev-server.d.mts +9 -0
- package/dist/dev-utils/dev-server.d.mts.map +1 -1
- package/dist/dev-utils/dev-server.mjs +44 -27
- package/dist/dev-utils/dev-server.mjs.map +1 -1
- package/dist/dev-utils/dev-server.status.test.mjs +31 -1
- package/dist/dev-utils/dev-server.status.test.mjs.map +1 -1
- package/dist/dev-utils/fatal-exit.d.mts +17 -4
- package/dist/dev-utils/fatal-exit.d.mts.map +1 -1
- package/dist/dev-utils/fatal-exit.mjs +4 -3
- package/dist/dev-utils/fatal-exit.mjs.map +1 -1
- package/dist/extract-api-integrations.d.mts +1 -1
- package/dist/extract-api-integrations.d.mts.map +1 -1
- package/dist/extract-api-integrations.mjs +1 -1
- package/dist/extract-api-integrations.mjs.map +1 -1
- package/dist/flag.d.ts +5 -0
- package/dist/flag.d.ts.map +1 -1
- package/dist/flag.js +7 -0
- package/dist/flag.js.map +1 -1
- package/dist/flag.test.js +18 -0
- package/dist/flag.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/common.d.ts +1 -0
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js.map +1 -1
- package/dist/vite-plugin-generate-api-build-manifest.d.mts.map +1 -1
- package/dist/vite-plugin-generate-api-build-manifest.mjs +46 -0
- package/dist/vite-plugin-generate-api-build-manifest.mjs.map +1 -1
- package/package.json +6 -6
- package/src/cli-replacement/automatic-upgrades.ts +8 -6
- package/src/cli-replacement/dev-s3-restore.test.mts +1 -0
- package/src/cli-replacement/dev-startup-git-before-dbfs-order.test.mts +1 -0
- package/src/cli-replacement/dev.interception.test.mts +334 -10
- package/src/cli-replacement/dev.mts +499 -33
- package/src/client.billing-usage.test.ts +26 -0
- package/src/client.ts +21 -0
- package/src/collect-sdk-apis.mts +141 -5
- package/src/collect-sdk-apis.test.mts +380 -1
- package/src/dev-utils/dev-server-metrics.dependency-failure.test.mts +149 -0
- package/src/dev-utils/dev-server-metrics.mts +25 -1
- package/src/dev-utils/dev-server.mts +52 -29
- package/src/dev-utils/dev-server.status.test.mts +42 -0
- package/src/dev-utils/fatal-exit.mts +18 -4
- package/src/extract-api-integrations.mts +3 -0
- package/src/flag.test.ts +21 -0
- package/src/flag.ts +8 -0
- package/src/index.ts +1 -0
- package/src/types/common.ts +1 -0
- package/src/vite-plugin-generate-api-build-manifest.mts +74 -4
- 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,
|
|
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:
|
|
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
|
-
|
|
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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"}
|