@superblocksteam/sdk 2.0.156-next.3 → 2.0.156

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 (62) 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 -4
  4. package/dist/cli-replacement/automatic-upgrades.js.map +1 -1
  5. package/dist/cli-replacement/automatic-upgrades.test.js +1 -2
  6. package/dist/cli-replacement/automatic-upgrades.test.js.map +1 -1
  7. package/dist/cli-replacement/dev-s3-restore.test.mjs +2 -6
  8. package/dist/cli-replacement/dev-s3-restore.test.mjs.map +1 -1
  9. package/dist/cli-replacement/dev-startup-git-before-dbfs-order.test.mjs +2 -6
  10. package/dist/cli-replacement/dev-startup-git-before-dbfs-order.test.mjs.map +1 -1
  11. package/dist/cli-replacement/dev.d.mts +6 -6
  12. package/dist/cli-replacement/dev.d.mts.map +1 -1
  13. package/dist/cli-replacement/dev.interception.test.mjs +12 -12
  14. package/dist/cli-replacement/dev.interception.test.mjs.map +1 -1
  15. package/dist/cli-replacement/dev.mjs +42 -100
  16. package/dist/cli-replacement/dev.mjs.map +1 -1
  17. package/dist/dev-utils/dev-server.d.mts +1 -34
  18. package/dist/dev-utils/dev-server.d.mts.map +1 -1
  19. package/dist/dev-utils/dev-server.mjs +70 -69
  20. package/dist/dev-utils/dev-server.mjs.map +1 -1
  21. package/dist/telemetry/logging.js +1 -1
  22. package/dist/telemetry/logging.js.map +1 -1
  23. package/dist/telemetry/safe-stringify.d.ts.map +1 -1
  24. package/dist/telemetry/safe-stringify.js +9 -25
  25. package/dist/telemetry/safe-stringify.js.map +1 -1
  26. package/package.json +6 -10
  27. package/src/cli-replacement/automatic-upgrades.test.ts +1 -2
  28. package/src/cli-replacement/automatic-upgrades.ts +11 -4
  29. package/src/cli-replacement/dev-s3-restore.test.mts +2 -6
  30. package/src/cli-replacement/dev-startup-git-before-dbfs-order.test.mts +2 -6
  31. package/src/cli-replacement/dev.interception.test.mts +12 -12
  32. package/src/cli-replacement/dev.mts +56 -112
  33. package/src/dev-utils/dev-server.mts +88 -93
  34. package/src/telemetry/logging.ts +1 -1
  35. package/src/telemetry/safe-stringify.ts +10 -25
  36. package/test/safe-stringify.test.mts +0 -25
  37. package/tsconfig.tsbuildinfo +1 -1
  38. package/dist/cli-replacement/dev-startup-lock-acquisition.test.d.mts +0 -2
  39. package/dist/cli-replacement/dev-startup-lock-acquisition.test.d.mts.map +0 -1
  40. package/dist/cli-replacement/dev-startup-lock-acquisition.test.mjs +0 -487
  41. package/dist/cli-replacement/dev-startup-lock-acquisition.test.mjs.map +0 -1
  42. package/dist/dev-utils/dev-server.shutdown-lock.test.d.mts +0 -2
  43. package/dist/dev-utils/dev-server.shutdown-lock.test.d.mts.map +0 -1
  44. package/dist/dev-utils/dev-server.shutdown-lock.test.mjs +0 -48
  45. package/dist/dev-utils/dev-server.shutdown-lock.test.mjs.map +0 -1
  46. package/dist/dev-utils/fatal-process-barrier.d.mts +0 -71
  47. package/dist/dev-utils/fatal-process-barrier.d.mts.map +0 -1
  48. package/dist/dev-utils/fatal-process-barrier.mjs +0 -161
  49. package/dist/dev-utils/fatal-process-barrier.mjs.map +0 -1
  50. package/dist/dev-utils/fatal-process-barrier.spawn-fixture.d.mts +0 -2
  51. package/dist/dev-utils/fatal-process-barrier.spawn-fixture.d.mts.map +0 -1
  52. package/dist/dev-utils/fatal-process-barrier.spawn-fixture.mjs +0 -9
  53. package/dist/dev-utils/fatal-process-barrier.spawn-fixture.mjs.map +0 -1
  54. package/dist/dev-utils/fatal-process-barrier.test.d.mts +0 -2
  55. package/dist/dev-utils/fatal-process-barrier.test.d.mts.map +0 -1
  56. package/dist/dev-utils/fatal-process-barrier.test.mjs +0 -281
  57. package/dist/dev-utils/fatal-process-barrier.test.mjs.map +0 -1
  58. package/src/cli-replacement/dev-startup-lock-acquisition.test.mts +0 -573
  59. package/src/dev-utils/dev-server.shutdown-lock.test.mts +0 -58
  60. package/src/dev-utils/fatal-process-barrier.mts +0 -262
  61. package/src/dev-utils/fatal-process-barrier.spawn-fixture.mts +0 -12
  62. package/src/dev-utils/fatal-process-barrier.test.mts +0 -346
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=dev-startup-lock-acquisition.test.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-startup-lock-acquisition.test.d.mts","sourceRoot":"","sources":["../../src/cli-replacement/dev-startup-lock-acquisition.test.mts"],"names":[],"mappings":""}
@@ -1,487 +0,0 @@
1
- import * as fs from "node:fs/promises";
2
- import * as http from "node:http";
3
- import * as os from "node:os";
4
- import * as path from "node:path";
5
- import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
6
- const execMock = vi.fn();
7
- const execFileMock = vi.fn();
8
- vi.mock("node:child_process", () => ({
9
- default: { exec: execMock, execFile: execFileMock },
10
- exec: execMock,
11
- execFile: execFileMock,
12
- }));
13
- vi.mock("node:readline", () => ({
14
- default: {
15
- createInterface: vi.fn(() => ({ question: vi.fn(), close: vi.fn() })),
16
- },
17
- createInterface: vi.fn(() => ({ question: vi.fn(), close: vi.fn() })),
18
- }));
19
- vi.mock("fs-extra", () => ({
20
- default: {
21
- existsSync: vi.fn(() => true),
22
- readFileSync: vi.fn(() => "{}"),
23
- },
24
- }));
25
- vi.mock("package-manager-detector/detect", () => ({
26
- detect: vi.fn(async () => ({
27
- name: "npm",
28
- agent: "npm",
29
- version: "10.0.0",
30
- })),
31
- }));
32
- vi.mock("package-manager-detector", () => ({
33
- resolveCommand: vi.fn(() => ({
34
- command: "npm",
35
- args: ["install", "--fund=false", "--audit=false"],
36
- })),
37
- }));
38
- vi.mock("read-pkg", () => ({
39
- readPackage: vi.fn(async () => ({
40
- name: "test-app",
41
- dependencies: { "@superblocksteam/library": "1.0.0" },
42
- })),
43
- }));
44
- const mockLogger = {
45
- info: vi.fn(),
46
- warn: vi.fn(),
47
- error: vi.fn(),
48
- debug: vi.fn(),
49
- };
50
- vi.mock("../telemetry/logging.js", () => ({
51
- getLogger: () => mockLogger,
52
- getErrorMeta: vi.fn(() => ({})),
53
- }));
54
- vi.mock("../telemetry/index.js", () => ({
55
- getTracer: () => ({
56
- startActiveSpan: vi.fn(async (_name, fn) => fn({ end: vi.fn(), setStatus: vi.fn() })),
57
- }),
58
- isCloudPrem: false,
59
- shutdownTelemetry: vi.fn(async () => true),
60
- }));
61
- vi.mock("@opentelemetry/api", () => ({
62
- SpanStatusCode: { ERROR: 2 },
63
- }));
64
- vi.mock("colorette", () => ({
65
- green: (s) => s,
66
- }));
67
- vi.mock("@superblocksteam/shared", async (importOriginal) => ({
68
- // dev.mts now transitively loads @superblocksteam/shared (via the npm-error
69
- // classifier re-exported from vite-plugin-file-sync/npm-registry — APPS-4450),
70
- // pulling in many named exports (DeploymentTypeEnum, ISocket, …). Spread the
71
- // real module so the closed overrides below don't have to enumerate them.
72
- ...(await importOriginal()),
73
- buildGithubSuperblocksSyncWorkflow: vi.fn(),
74
- buildGithubSuperblocksSyncWorkflowFromBaseUrl: vi.fn(),
75
- ConflictError: class ConflictError extends Error {
76
- },
77
- DEFAULT_NON_GIT_BRANCH: "__non_git__",
78
- isGitHubRemoteUrl: vi.fn(() => false),
79
- NotFoundError: class NotFoundError extends Error {
80
- },
81
- SUPERBLOCKS_LIVE_GIT_BRANCH: "__live__",
82
- }));
83
- vi.mock("@superblocksteam/util", () => ({
84
- maskUnixSignals: async function maskUnixSignals(fn) {
85
- return fn();
86
- },
87
- }));
88
- vi.mock("@superblocksteam/vite-plugin-file-sync/ai-service", () => ({
89
- AiService: class {
90
- initialize = vi.fn(async () => undefined);
91
- notifyMigrationAppArtifactsReady = vi.fn();
92
- removeIntegrationCache = vi.fn(async () => undefined);
93
- remediateDeclaredDependencies = vi.fn(async () => undefined);
94
- chatSessionStore = { invalidateCache: vi.fn() };
95
- getNpmRegistryClient = mockGetNpmRegistryClient;
96
- },
97
- AiServiceFeatureFlags: class {
98
- static create = vi.fn(() => ({}));
99
- },
100
- SnapshotManager: class {
101
- executePendingRestore = vi.fn(async () => false);
102
- },
103
- hasEditLifecycleCapability: vi.fn(() => false),
104
- isSdkApiTemplate: vi.fn(() => false),
105
- stripResolvedFromLockfile: vi.fn(async () => undefined),
106
- }));
107
- vi.mock("@superblocksteam/vite-plugin-file-sync/npm-registry", () => ({
108
- shouldIgnoreInstallScripts: vi.fn(() => false),
109
- maybeWriteNpmrcForDir: vi.fn(async () => {
110
- // Delay before the log push so this test fails if syncHomeNpmrc is
111
- // fire-and-forget (initiation order alone would still look correct).
112
- await new Promise((resolve) => setTimeout(resolve, 5));
113
- startupOpLog.push("project-npmrc:maybeWriteNpmrcForDir");
114
- }),
115
- }));
116
- const { startupOpLog, buildMockGitService, mockGetNpmRegistryClient } = vi.hoisted(() => {
117
- const startupOpLog = [];
118
- const mockGetNpmRegistryClient = vi.fn(() => ({
119
- organizationId: "org-1",
120
- getConfig: vi.fn(async () => ({
121
- source: "not-configured",
122
- config: { configured: false },
123
- })),
124
- }));
125
- function buildMockGitService(cwd) {
126
- return {
127
- workDir: cwd,
128
- configure: vi.fn(async () => {
129
- startupOpLog.push("git:configure");
130
- }),
131
- init: vi.fn(async () => {
132
- startupOpLog.push("git:init");
133
- }),
134
- addRemote: vi.fn(async () => {
135
- startupOpLog.push("git:addRemote");
136
- }),
137
- fetch: vi.fn(async () => {
138
- startupOpLog.push("git:fetch");
139
- }),
140
- raw: vi.fn(async (args) => {
141
- const argv = Array.isArray(args) ? args : [args];
142
- startupOpLog.push(`git:raw:${argv.join(" ")}`);
143
- if (argv[0] === "ls-remote" && argv.includes("__live__")) {
144
- return "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef\trefs/heads/__live__\n";
145
- }
146
- if (argv[0] === "branch" && argv.includes("--show-current")) {
147
- return "__live__\n";
148
- }
149
- if (argv[0] === "commit") {
150
- return "";
151
- }
152
- return "";
153
- }),
154
- push: vi.fn(async () => {
155
- startupOpLog.push("git:push");
156
- }),
157
- getDefaultBranch: vi.fn(async () => "main"),
158
- getRemotes: vi.fn(async () => [
159
- { name: "origin", refs: { fetch: "https://example.test/repo.git" } },
160
- ]),
161
- remote: vi.fn(async () => {
162
- startupOpLog.push("git:remote");
163
- }),
164
- revparse: vi.fn(async (ref) => {
165
- startupOpLog.push(`git:revparse:${ref}`);
166
- return "abc123\n";
167
- }),
168
- checkout: vi.fn(async () => {
169
- startupOpLog.push("git:checkout");
170
- }),
171
- checkoutOrCreate: vi.fn(async () => {
172
- startupOpLog.push("git:checkoutOrCreate");
173
- }),
174
- };
175
- }
176
- return { startupOpLog, buildMockGitService, mockGetNpmRegistryClient };
177
- });
178
- vi.mock("@superblocksteam/vite-plugin-file-sync/git-service", () => ({
179
- createGitService: vi.fn((cwd) => {
180
- startupOpLog.push("createGitService");
181
- return buildMockGitService(cwd);
182
- }),
183
- }));
184
- const mockLockService = {
185
- acquireLock: vi.fn(async () => undefined),
186
- forceTakeover: vi.fn(async () => undefined),
187
- inspectLock: vi.fn(async () => ({
188
- ownerName: "someone@example.com",
189
- canForceTakeover: false,
190
- lockLifetimeMs: 60_000,
191
- timeSinceLastActivityMs: 0,
192
- })),
193
- setOnLockConflict: vi.fn(),
194
- relinquishLock: vi.fn(async () => undefined),
195
- notifyClosedByServer: vi.fn(async () => undefined),
196
- shutdownAndExit: vi.fn(async () => undefined),
197
- setIsRestarting: vi.fn(),
198
- isLocked: false,
199
- // The git-service mock below simulates a live/target branch mismatch, which
200
- // is what drives `ensureRuntimeDbfsBranchConsistency`. Both of the methods it
201
- // calls have to exist here or the first one throws a TypeError that an outer
202
- // catch swallows — leaving the suite green without ever having run the
203
- // interaction.
204
- isLockedWhenSettled: vi.fn(async () => false),
205
- switchBranch: vi.fn(async () => undefined),
206
- connectedUsers: [],
207
- wasRecentlyActive: false,
208
- timeSinceLastActivity: 0,
209
- };
210
- vi.mock("@superblocksteam/vite-plugin-file-sync/lock-service", () => ({
211
- LockService: class {
212
- acquireLock = mockLockService.acquireLock;
213
- forceTakeover = mockLockService.forceTakeover;
214
- inspectLock = mockLockService.inspectLock;
215
- setOnLockConflict = mockLockService.setOnLockConflict;
216
- relinquishLock = mockLockService.relinquishLock;
217
- notifyClosedByServer = mockLockService.notifyClosedByServer;
218
- shutdownAndExit = mockLockService.shutdownAndExit;
219
- setIsRestarting = mockLockService.setIsRestarting;
220
- isLocked = mockLockService.isLocked;
221
- isLockedWhenSettled = mockLockService.isLockedWhenSettled;
222
- switchBranch = mockLockService.switchBranch;
223
- connectedUsers = mockLockService.connectedUsers;
224
- wasRecentlyActive = mockLockService.wasRecentlyActive;
225
- timeSinceLastActivity = mockLockService.timeSinceLastActivity;
226
- },
227
- LockType: { CSB: "CSB", LOCAL: "LOCAL" },
228
- }));
229
- vi.mock("@superblocksteam/vite-plugin-file-sync/operation-queue", () => ({
230
- OperationQueue: class {
231
- enqueue = vi.fn(async (fn) => fn());
232
- },
233
- }));
234
- vi.mock("@superblocksteam/vite-plugin-file-sync/server-rpc", () => ({
235
- AutoConnectingRpcClient: class {
236
- },
237
- }));
238
- const mockSyncService = {
239
- downloadDirectory: vi.fn(async () => {
240
- startupOpLog.push("dbfs:downloadDirectory");
241
- }),
242
- uploadDirectory: vi.fn(async () => undefined),
243
- uploadDirectoryNowIfNeeded: vi.fn(async () => undefined),
244
- cancelPendingSync: vi.fn(),
245
- };
246
- vi.mock("@superblocksteam/vite-plugin-file-sync/sync-service", () => ({
247
- SyncService: class {
248
- downloadDirectory = mockSyncService.downloadDirectory;
249
- uploadDirectory = mockSyncService.uploadDirectory;
250
- uploadDirectoryNowIfNeeded = mockSyncService.uploadDirectoryNowIfNeeded;
251
- cancelPendingSync = mockSyncService.cancelPendingSync;
252
- },
253
- }));
254
- vi.mock("@superblocksteam/vite-plugin-file-sync/draft-interface", () => ({}));
255
- vi.mock("./version-detection.js", () => ({
256
- getCurrentCliVersion: vi.fn(async () => ({
257
- version: "2.0.0",
258
- alias: undefined,
259
- })),
260
- }));
261
- const mockCheckVersions = vi.fn(async () => ({
262
- cliUpdated: false,
263
- upgradePromises: [],
264
- }));
265
- vi.mock("./automatic-upgrades.js", () => ({
266
- checkVersionsAndWritePackageJson: (...args) => mockCheckVersions(...args),
267
- buildInstallEnv: (userconfigPath) => ({
268
- ...process.env,
269
- NPM_CONFIG_USERCONFIG: userconfigPath,
270
- PNPM_CONFIG_USERCONFIG: userconfigPath,
271
- }),
272
- }));
273
- // The home `~/.npmrc` writer (APPS-4231) is a best-effort step that runs
274
- // before auto-upgrade. Mock it out here so this test stays focused on the
275
- // git-before-DBFS ordering. The `AiService` mock above exposes a minimal
276
- // `getNpmRegistryClient()` stub so the call site doesn't `TypeError`
277
- // and silently swallow this mock.
278
- vi.mock("./home-npmrc.mjs", () => ({
279
- syncHomeNpmrc: vi.fn(async () => {
280
- // Longer delay than maybeWriteNpmrcForDir: if both run without await,
281
- // project pushes first and the order assertion fails.
282
- await new Promise((resolve) => setTimeout(resolve, 30));
283
- startupOpLog.push("home-npmrc:syncHomeNpmrc");
284
- return {
285
- outcome: "skipped-not-configured",
286
- path: "/tmp/.superblocks/npmrc",
287
- };
288
- }),
289
- superblocksNpmrcPath: vi.fn(() => "/tmp/.superblocks/npmrc"),
290
- superblocksLogsPath: vi.fn((appDir) => `${appDir}/.superblocks/logs`),
291
- }));
292
- vi.mock("./git-repo-setup.mjs", () => ({
293
- ensureRemoteHasDefaultBranch: vi.fn(async () => undefined),
294
- getGitErrorFields: vi.fn(() => ({})),
295
- }));
296
- const mockCreateDevServer = vi.fn(async () => http.createServer());
297
- vi.mock("../dev-utils/dev-server.mjs", () => ({
298
- createDevServer: (...args) => mockCreateDevServer(...args),
299
- }));
300
- vi.mock("../index.js", () => ({
301
- AUTO_UPGRADE_EXIT_CODE: 99,
302
- }));
303
- const SERVER_DBFS_HASH = "dbfs-head-after-clark";
304
- function buildMockSdk() {
305
- const hashLocalDirectory = vi
306
- .fn()
307
- .mockImplementationOnce(async () => {
308
- startupOpLog.push("sdk:hashLocalDirectory:before-dbfs");
309
- return { hash: "git-tree-without-uncommitted-clark-change" };
310
- })
311
- .mockImplementationOnce(async () => {
312
- startupOpLog.push("sdk:hashLocalDirectory:after-dbfs");
313
- return { hash: SERVER_DBFS_HASH };
314
- });
315
- return {
316
- hashLocalDirectory,
317
- dbfsGetApplicationDirectoryHash: vi.fn(async () => SERVER_DBFS_HASH),
318
- getApplicationGitConfig: vi.fn(async () => ({
319
- gitRemoteUrl: "https://github.com/example/superblocks-app.git",
320
- hasCredential: false,
321
- })),
322
- fetchCurrentUser: vi.fn(async () => ({
323
- user: {
324
- id: "user-1",
325
- name: "Test User",
326
- email: "test@example.com",
327
- currentOrganizationId: "org-1",
328
- },
329
- organizations: [{ id: "org-1", pluginExecutionVersions: {} }],
330
- flagBootstrap: {},
331
- })),
332
- getFeatureFlagsForCurrentUser: vi.fn(async () => ({
333
- devServerCloudInactivityTimeoutMinutes: () => 30,
334
- devServerLocalInactivityTimeoutMinutes: () => 30,
335
- enableSessionRecording: () => false,
336
- removeManualCommitsEnabled: () => false,
337
- })),
338
- getFeatureFlagsForUser: vi.fn(() => ({
339
- devServerCloudInactivityTimeoutMinutes: () => 30,
340
- devServerLocalInactivityTimeoutMinutes: () => 30,
341
- })),
342
- };
343
- }
344
- function buildDevOptions(cwd, overrides = {}) {
345
- return {
346
- cwd,
347
- downloadFirst: true,
348
- autoUpgradeMode: "skip-upgrade",
349
- applicationConfig: {
350
- id: "app-test",
351
- branchName: "main",
352
- },
353
- tokenConfig: {
354
- superblocksBaseUrl: "https://example.test",
355
- token: "test-token",
356
- },
357
- tokenManager: {
358
- getToken: vi.fn(() => "test-token"),
359
- onTokenRefresh: vi.fn(),
360
- updateToken: vi.fn(),
361
- getCurrentToken: vi.fn(() => "test-token"),
362
- },
363
- getCurrentToken: vi.fn(() => "test-token"),
364
- sdk: buildMockSdk(),
365
- ...overrides,
366
- };
367
- }
368
- function setupExecMock() {
369
- execMock.mockImplementation((_cmd, _opts, cb) => {
370
- startupOpLog.push("installPackages:exec");
371
- if (typeof _opts === "function") {
372
- _opts(null, {
373
- stdout: "installed",
374
- });
375
- }
376
- else if (cb) {
377
- cb(null, { stdout: "installed" });
378
- }
379
- });
380
- }
381
- describe("dev startup: who takes the live-edit lock, and when (ENG-6090)", () => {
382
- let testCwd;
383
- beforeEach(async () => {
384
- vi.clearAllMocks();
385
- delete process.env.SUPERBLOCKS_IS_CSB;
386
- mockGetNpmRegistryClient.mockImplementation(() => ({
387
- organizationId: "org-1",
388
- getConfig: vi.fn(async () => ({
389
- source: "not-configured",
390
- config: { configured: false },
391
- })),
392
- }));
393
- startupOpLog.length = 0;
394
- setupExecMock();
395
- mockCheckVersions.mockResolvedValue({
396
- cliUpdated: false,
397
- upgradePromises: [],
398
- });
399
- testCwd = await fs.mkdtemp(path.join(os.tmpdir(), "sb-dev-lock-acquire-"));
400
- const { readPackage } = await import("read-pkg");
401
- readPackage.mockResolvedValue({
402
- name: "test-app",
403
- dependencies: { "@superblocksteam/library": "1.0.0" },
404
- });
405
- });
406
- afterEach(async () => {
407
- await fs.rm(testCwd, { recursive: true, force: true });
408
- });
409
- it.each([
410
- ["cloud", "true"],
411
- ["local", undefined],
412
- ])("does not take the lock at boot on the %s path", async (_name, isCsb) => {
413
- if (isCsb) {
414
- process.env.SUPERBLOCKS_IS_CSB = isCsb;
415
- }
416
- const { dev } = await import("./dev.mjs");
417
- await dev(buildDevOptions(testCwd));
418
- // Nothing startup does is gated on holding the lock — not the DBFS
419
- // download, not the package install, not the hash upload. Taking it before
420
- // any client exists is holding it on behalf of nobody, which is the state
421
- // the startup no-socket watchdog existed to clean up. A local dev server
422
- // has no more claim to it at boot than a sandbox does: the browser tab
423
- // that has not opened yet is the client, not the process.
424
- expect(mockLockService.acquireLock).not.toHaveBeenCalled();
425
- expect(mockLockService.forceTakeover).not.toHaveBeenCalled();
426
- // ...and it still boots and serves.
427
- expect(mockSyncService.downloadDirectory).toHaveBeenCalled();
428
- expect(mockCreateDevServer).toHaveBeenCalled();
429
- });
430
- it("hands the conflict handler to the lock service instead of racing it at boot", async () => {
431
- const { dev } = await import("./dev.mjs");
432
- await dev(buildDevOptions(testCwd));
433
- // The reporting that used to wrap the boot-time acquire still exists; it is
434
- // wired to where acquisition actually happens now.
435
- expect(mockLockService.setOnLockConflict).toHaveBeenCalledWith(expect.any(Function));
436
- });
437
- it("reports a conflict without stopping the dev server", async () => {
438
- const { dev } = await import("./dev.mjs");
439
- mockLockService.inspectLock.mockResolvedValueOnce({
440
- ownerName: "someone@example.com",
441
- canForceTakeover: false,
442
- lockLifetimeMs: 120_000,
443
- timeSinceLastActivityMs: 0,
444
- });
445
- await dev(buildDevOptions(testCwd));
446
- const onConflict = mockLockService.setOnLockConflict.mock.calls[0][0];
447
- await onConflict(new Error("Another user is currently editing this app."));
448
- // Someone else holds it, so this client cannot edit — but the sandbox is
449
- // still serving preview and the lock does not decide how long it lives.
450
- expect(mockLockService.relinquishLock).not.toHaveBeenCalled();
451
- expect(mockLockService.shutdownAndExit).not.toHaveBeenCalled();
452
- expect(mockLogger.warn).toHaveBeenCalledWith(expect.stringContaining("Could not take the live-edit lock"));
453
- });
454
- it("stops on an unresolvable conflict under the VS Code extension", async () => {
455
- process.env.SUPERBLOCKS_VSCODE = "true";
456
- const { shutdownTelemetry } = await import("../telemetry/index.js");
457
- const exit = vi
458
- .spyOn(process, "exit")
459
- .mockImplementation(() => undefined);
460
- const { dev } = await import("./dev.mjs");
461
- await dev(buildDevOptions(testCwd));
462
- const onConflict = mockLockService.setOnLockConflict.mock.calls[0][0];
463
- await onConflict(new Error("Another user is currently editing this app."));
464
- // The extension answers a takeover prompt by restarting this command with
465
- // --force-takeover, and that hand-off has always ended with this process
466
- // gone. Staying up would leave the replacement fighting us for the port.
467
- expect(exit).toHaveBeenCalledWith(1);
468
- // Through the same teardown as the other two fatal exits, not
469
- // `shutdownAndExit`: that one exits synchronously from its own `finally`,
470
- // which made the span end and the telemetry flush below it unreachable —
471
- // so the trace for the conflict never left the process.
472
- expect(mockLockService.shutdownAndExit).not.toHaveBeenCalled();
473
- expect(mockLockService.relinquishLock).toHaveBeenCalled();
474
- expect(shutdownTelemetry).toHaveBeenCalled();
475
- exit.mockRestore();
476
- });
477
- it("honours an explicit force takeover at boot", async () => {
478
- process.env.SUPERBLOCKS_IS_CSB = "true";
479
- const { dev } = await import("./dev.mjs");
480
- // The one thing that still acquires at boot, and it is not lock-type
481
- // specific: someone asked for it by name.
482
- await dev(buildDevOptions(testCwd, { forceTakeover: true }));
483
- expect(mockLockService.forceTakeover).toHaveBeenCalled();
484
- expect(mockLockService.acquireLock).not.toHaveBeenCalled();
485
- });
486
- });
487
- //# sourceMappingURL=dev-startup-lock-acquisition.test.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-startup-lock-acquisition.test.mjs","sourceRoot":"","sources":["../../src/cli-replacement/dev-startup-lock-acquisition.test.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,MAAM,EACN,EAAE,EACF,EAAE,GAEH,MAAM,QAAQ,CAAC;AAEhB,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACzB,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC7B,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE;IACnD,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,YAAY;CACvB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,OAAO,EAAE;QACP,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;KACtE;IACD,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;CACtE,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,OAAO,EAAE;QACP,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QAC7B,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;KAChC;CACF,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,QAAQ;KAClB,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3B,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,eAAe,CAAC;KACnD,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,UAAU;QAChB,YAAY,EAAE,EAAE,0BAA0B,EAAE,OAAO,EAAE;KACtD,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,MAAM,UAAU,GAAG;IACjB,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;IACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;CACf,CAAC;AAEF,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU;IAC3B,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;CAChC,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChB,eAAe,EAAE,EAAE,CAAC,EAAE,CACpB,KAAK,EACH,KAAa,EACb,EAGsB,EACtB,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAC9C;KACF,CAAC;IACF,WAAW,EAAE,KAAK;IAClB,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC;CAC3C,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CAC7B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC;CACxB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IAC5D,4EAA4E;IAC5E,+EAA+E;IAC/E,6EAA6E;IAC7E,0EAA0E;IAC1E,GAAI,CAAC,MAAM,cAAc,EAAE,CAA6B;IACxD,kCAAkC,EAAE,EAAE,CAAC,EAAE,EAAE;IAC3C,6CAA6C,EAAE,EAAE,CAAC,EAAE,EAAE;IACtD,aAAa,EAAE,MAAM,aAAc,SAAQ,KAAK;KAAG;IACnD,sBAAsB,EAAE,aAAa;IACrC,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;IACrC,aAAa,EAAE,MAAM,aAAc,SAAQ,KAAK;KAAG;IACnD,2BAA2B,EAAE,UAAU;CACxC,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,eAAe,EAAE,KAAK,UAAU,eAAe,CAAC,EAAuB;QACrE,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;CACF,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE,CAAC,CAAC;IAClE,SAAS,EAAE;QACT,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1C,gCAAgC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,sBAAsB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;QACtD,6BAA6B,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7D,gBAAgB,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QAChD,oBAAoB,GAAG,wBAAwB,CAAC;KACjD;IACD,qBAAqB,EAAE;QACrB,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACnC;IACD,eAAe,EAAE;QACf,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;KAClD;IACD,0BAA0B,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;IAC9C,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;IACpC,yBAAyB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;CACxD,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE,CAAC,CAAC;IACpE,0BAA0B,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;IAC9C,qBAAqB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;QACtC,mEAAmE;QACnE,qEAAqE;QACrE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,YAAY,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC3D,CAAC,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,GACnE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;IACd,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,wBAAwB,GAAG,EAAE,CAAC,EAAE,CACpC,GAKc,EAAE,CAAC,CAAC;QAChB,cAAc,EAAE,OAAO;QACvB,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC5B,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;SAC9B,CAAC,CAAC;KACJ,CAAC,CACH,CAAC;IACF,SAAS,mBAAmB,CAAC,GAAW;QACtC,OAAO;YACL,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBAC1B,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACrC,CAAC,CAAC;YACF,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACrB,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChC,CAAC,CAAC;YACF,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBAC1B,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACrC,CAAC,CAAC;YACF,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACtB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC,CAAC;YACF,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;gBAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjD,YAAY,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;oBACzD,OAAO,iEAAiE,CAAC;gBAC3E,CAAC;gBACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAC5D,OAAO,YAAY,CAAC;gBACtB,CAAC;gBACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACzB,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YACF,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACrB,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChC,CAAC,CAAC;YACF,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;YAC3C,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAAE;aACrE,CAAC;YACF,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACvB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAClC,CAAC,CAAC;YACF,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;gBACpC,YAAY,CAAC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;gBACzC,OAAO,UAAU,CAAC;YACpB,CAAC,CAAC;YACF,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACzB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACpC,CAAC,CAAC;YACF,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACjC,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC5C,CAAC,CAAC;SACH,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,CAAC;AACzE,CAAC,CAAC,CAAC;AAEL,EAAE,CAAC,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE,CAAC,CAAC;IACnE,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAW,EAAE,EAAE;QACtC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACtC,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,MAAM,eAAe,GAAG;IACtB,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IACzC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IAC3C,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9B,SAAS,EAAE,qBAAqB;QAChC,gBAAgB,EAAE,KAAK;QACvB,cAAc,EAAE,MAAM;QACtB,uBAAuB,EAAE,CAAC;KAC3B,CAAC,CAAC;IACH,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC1B,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IAC5C,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IAClD,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IAC7C,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;IACxB,QAAQ,EAAE,KAAK;IACf,4EAA4E;IAC5E,8EAA8E;IAC9E,6EAA6E;IAC7E,uEAAuE;IACvE,eAAe;IACf,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC;IAC7C,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IAC1C,cAAc,EAAE,EAAE;IAClB,iBAAiB,EAAE,KAAK;IACxB,qBAAqB,EAAE,CAAC;CACzB,CAAC;AAEF,EAAE,CAAC,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE,CAAC,CAAC;IACpE,WAAW,EAAE;QACX,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC;QAC1C,aAAa,GAAG,eAAe,CAAC,aAAa,CAAC;QAC9C,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC;QAC1C,iBAAiB,GAAG,eAAe,CAAC,iBAAiB,CAAC;QACtD,cAAc,GAAG,eAAe,CAAC,cAAc,CAAC;QAChD,oBAAoB,GAAG,eAAe,CAAC,oBAAoB,CAAC;QAC5D,eAAe,GAAG,eAAe,CAAC,eAAe,CAAC;QAClD,eAAe,GAAG,eAAe,CAAC,eAAe,CAAC;QAClD,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC;QACpC,mBAAmB,GAAG,eAAe,CAAC,mBAAmB,CAAC;QAC1D,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC;QAC5C,cAAc,GAAG,eAAe,CAAC,cAAc,CAAC;QAChD,iBAAiB,GAAG,eAAe,CAAC,iBAAiB,CAAC;QACtD,qBAAqB,GAAG,eAAe,CAAC,qBAAqB,CAAC;KAC/D;IACD,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;CACzC,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE,CAAC,CAAC;IACvE,cAAc,EAAE;QACd,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAA0B,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;KAC7D;CACF,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE,CAAC,CAAC;IAClE,uBAAuB,EAAE;KAAQ;CAClC,CAAC,CAAC,CAAC;AAEJ,MAAM,eAAe,GAAG;IACtB,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;QAClC,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC9C,CAAC,CAAC;IACF,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IAC7C,0BAA0B,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IACxD,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC3B,CAAC;AAEF,EAAE,CAAC,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE,CAAC,CAAC;IACpE,WAAW,EAAE;QACX,iBAAiB,GAAG,eAAe,CAAC,iBAAiB,CAAC;QACtD,eAAe,GAAG,eAAe,CAAC,eAAe,CAAC;QAClD,0BAA0B,GAAG,eAAe,CAAC,0BAA0B,CAAC;QACxE,iBAAiB,GAAG,eAAe,CAAC,iBAAiB,CAAC;KACvD;CACF,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE9E,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3C,UAAU,EAAE,KAAK;IACjB,eAAe,EAAE,EAAqB;CACvC,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,gCAAgC,EAAE,CAChC,GAAG,IAA0C,EAC7C,EAAE,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,CAAC,cAAsB,EAAE,EAAE,CAAC,CAAC;QAC5C,GAAG,OAAO,CAAC,GAAG;QACd,qBAAqB,EAAE,cAAc;QACrC,sBAAsB,EAAE,cAAc;KACvC,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,yEAAyE;AACzE,0EAA0E;AAC1E,yEAAyE;AACzE,qEAAqE;AACrE,kCAAkC;AAClC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;QAC9B,sEAAsE;QACtE,sDAAsD;QACtD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACxD,YAAY,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC9C,OAAO;YACL,OAAO,EAAE,wBAAwB;YACjC,IAAI,EAAE,yBAAyB;SAChC,CAAC;IACJ,CAAC,CAAC;IACF,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC;IAC5D,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC,GAAG,MAAM,oBAAoB,CAAC;CAC9E,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,4BAA4B,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IAC1D,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;CACrC,CAAC,CAAC,CAAC;AAEJ,MAAM,mBAAmB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AACnE,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5C,eAAe,EAAE,CAAC,GAAG,IAA4C,EAAE,EAAE,CACnE,mBAAmB,CAAC,GAAG,IAAI,CAAC;CAC/B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,sBAAsB,EAAE,EAAE;CAC3B,CAAC,CAAC,CAAC;AAEJ,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEjD,SAAS,YAAY;IACnB,MAAM,kBAAkB,GAAG,EAAE;SAC1B,EAAE,EAAE;SACJ,sBAAsB,CAAC,KAAK,IAAI,EAAE;QACjC,YAAY,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC;IAC/D,CAAC,CAAC;SACD,sBAAsB,CAAC,KAAK,IAAI,EAAE;QACjC,YAAY,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEL,OAAO;QACL,kBAAkB;QAClB,+BAA+B,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,gBAAgB,CAAC;QACpE,uBAAuB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC1C,YAAY,EAAE,gDAAgD;YAC9D,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;QACH,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE;gBACJ,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,kBAAkB;gBACzB,qBAAqB,EAAE,OAAO;aAC/B;YACD,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,EAAE,CAAC;YAC7D,aAAa,EAAE,EAAE;SAClB,CAAC,CAAC;QACH,6BAA6B,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAChD,sCAAsC,EAAE,GAAG,EAAE,CAAC,EAAE;YAChD,sCAAsC,EAAE,GAAG,EAAE,CAAC,EAAE;YAChD,sBAAsB,EAAE,GAAG,EAAE,CAAC,KAAK;YACnC,0BAA0B,EAAE,GAAG,EAAE,CAAC,KAAK;SACxC,CAAC,CAAC;QACH,sBAAsB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACnC,sCAAsC,EAAE,GAAG,EAAE,CAAC,EAAE;YAChD,sCAAsC,EAAE,GAAG,EAAE,CAAC,EAAE;SACjD,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,YAAqC,EAAE;IAC3E,OAAO;QACL,GAAG;QACH,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,cAAc;QAC/B,iBAAiB,EAAE;YACjB,EAAE,EAAE,UAAU;YACd,UAAU,EAAE,MAAM;SACnB;QACD,WAAW,EAAE;YACX,kBAAkB,EAAE,sBAAsB;YAC1C,KAAK,EAAE,YAAY;SACpB;QACD,YAAY,EAAE;YACZ,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;YACnC,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;YACvB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;YACpB,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;SAC3C;QACD,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;QAC1C,GAAG,EAAE,YAAY,EAAE;QACnB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,aAAa;IACpB,QAAQ,CAAC,kBAAkB,CACzB,CACE,IAAY,EACZ,KAAc,EACd,EAAoD,EACpD,EAAE;QACF,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAC/B,KAAyD,CAAC,IAAI,EAAE;gBAC/D,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,EAAE,EAAE,CAAC;YACd,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC9E,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtC,wBAAwB,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;YACjD,cAAc,EAAE,OAAO;YACvB,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC5B,MAAM,EAAE,gBAAgB;gBACxB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;aAC9B,CAAC,CAAC;SACJ,CAAC,CAAC,CAAC;QACJ,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,aAAa,EAAE,CAAC;QAChB,iBAAiB,CAAC,iBAAiB,CAAC;YAClC,UAAU,EAAE,KAAK;YACjB,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;QAC3E,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAChD,WAAoB,CAAC,iBAAiB,CAAC;YACtC,IAAI,EAAE,UAAU;YAChB,YAAY,EAAE,EAAE,0BAA0B,EAAE,OAAO,EAAE;SACtD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,OAAO,EAAE,MAAM,CAAC;QACjB,CAAC,OAAO,EAAE,SAAS,CAAC;KACrB,CAAC,CAAC,+CAA+C,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACzE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,KAAK,CAAC;QACzC,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAE1C,MAAM,GAAG,CAAC,eAAe,CAAC,OAAO,CAAQ,CAAC,CAAC;QAE3C,mEAAmE;QACnE,2EAA2E;QAC3E,0EAA0E;QAC1E,yEAAyE;QACzE,uEAAuE;QACvE,0DAA0D;QAC1D,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC7D,oCAAoC;QACpC,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC7D,MAAM,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAE1C,MAAM,GAAG,CAAC,eAAe,CAAC,OAAO,CAAQ,CAAC,CAAC;QAE3C,4EAA4E;QAC5E,mDAAmD;QACnD,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAC5D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1C,eAAe,CAAC,WAAW,CAAC,qBAAqB,CAAC;YAChD,SAAS,EAAE,qBAAqB;YAChC,gBAAgB,EAAE,KAAK;YACvB,cAAc,EAAE,OAAO;YACvB,uBAAuB,EAAE,CAAC;SAC3B,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,eAAe,CAAC,OAAO,CAAQ,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,UAAU,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;QAE3E,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC9D,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC/D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAC1C,MAAM,CAAC,gBAAgB,CAAC,mCAAmC,CAAC,CAC7D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,MAAM,CAAC;QACxC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,EAAE;aACZ,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;aACtB,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAkB,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAE1C,MAAM,GAAG,CAAC,eAAe,CAAC,OAAO,CAAQ,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,UAAU,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;QAE3E,0EAA0E;QAC1E,yEAAyE;QACzE,yEAAyE;QACzE,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QACrC,8DAA8D;QAC9D,0EAA0E;QAC1E,yEAAyE;QACzE,wDAAwD;QACxD,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC/D,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC1D,MAAM,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,MAAM,CAAC;QACxC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAE1C,qEAAqE;QACrE,0CAA0C;QAC1C,MAAM,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAQ,CAAC,CAAC;QAEpE,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACzD,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=dev-server.shutdown-lock.test.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-server.shutdown-lock.test.d.mts","sourceRoot":"","sources":["../../src/dev-utils/dev-server.shutdown-lock.test.mts"],"names":[],"mappings":""}
@@ -1,48 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { handOverLockOnExit } from "./dev-server.mjs";
3
- /**
4
- * ENG-6128. The dev server's exit path used to drive the lock service through a
5
- * `shutdown({ serverInitiated })` that decided, inside the lock service, whether
6
- * to release. That flag is the dev server's knowledge, not the lock service's,
7
- * and getting it wrong in either direction is a live-edit outage: releasing a
8
- * lock the server has already reassigned takes the app away from the session
9
- * taking over, and failing to release on a normal exit makes the replacement
10
- * sandbox wait out the TTL.
11
- */
12
- describe("handOverLockOnExit", () => {
13
- const makeLockService = () => ({
14
- notifyClosedByServer: vi.fn(async () => undefined),
15
- relinquishLock: vi.fn(async () => undefined),
16
- });
17
- it("hands the lock back when the dev server is the one stopping", async () => {
18
- const lockService = makeLockService();
19
- await handOverLockOnExit(lockService, { serverInitiated: false });
20
- // Prompt release is the whole recovery story for this path: the heartbeat
21
- // dies with the process, so anything not released here blocks the
22
- // replacement sandbox for the two-minute TTL.
23
- expect(lockService.relinquishLock).toHaveBeenCalledOnce();
24
- expect(lockService.notifyClosedByServer).not.toHaveBeenCalled();
25
- });
26
- it("only notifies when the server closed the session", async () => {
27
- const lockService = makeLockService();
28
- await handOverLockOnExit(lockService, {
29
- serverInitiated: true,
30
- switchingTo: "local",
31
- initiatedByEmail: "someone@example.com",
32
- });
33
- // The server has already taken the lock — on a local↔cloud switch it now
34
- // belongs to the session taking over, so releasing would take it away from
35
- // them.
36
- expect(lockService.relinquishLock).not.toHaveBeenCalled();
37
- expect(lockService.notifyClosedByServer).toHaveBeenCalledWith({
38
- switchingTo: "local",
39
- initiatedByEmail: "someone@example.com",
40
- });
41
- });
42
- it("is a no-op when the dev server never had a lock service", async () => {
43
- // Startup can fail before the lock service exists, and the exit path still
44
- // runs.
45
- await expect(handOverLockOnExit(undefined, { serverInitiated: false })).resolves.toBeUndefined();
46
- });
47
- });
48
- //# sourceMappingURL=dev-server.shutdown-lock.test.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-server.shutdown-lock.test.mjs","sourceRoot":"","sources":["../../src/dev-utils/dev-server.shutdown-lock.test.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;;;;;;GAQG;AACH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;QAC7B,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QAClD,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;KAC7C,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QAEtC,MAAM,kBAAkB,CAAC,WAAW,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAElE,0EAA0E;QAC1E,kEAAkE;QAClE,8CAA8C;QAC9C,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAC1D,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QAEtC,MAAM,kBAAkB,CAAC,WAAW,EAAE;YACpC,eAAe,EAAE,IAAI;YACrB,WAAW,EAAE,OAAO;YACpB,gBAAgB,EAAE,qBAAqB;SACxC,CAAC,CAAC;QAEH,yEAAyE;QACzE,2EAA2E;QAC3E,QAAQ;QACR,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC1D,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC;YAC5D,WAAW,EAAE,OAAO;YACpB,gBAAgB,EAAE,qBAAqB;SACxC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,2EAA2E;QAC3E,QAAQ;QACR,MAAM,MAAM,CACV,kBAAkB,CAAC,SAAS,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAC1D,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,71 +0,0 @@
1
- export type FatalProcessHandler = "uncaughtException" | "unhandledRejection";
2
- export type FatalProcessListener = (...args: unknown[]) => void;
3
- /**
4
- * The slice of `process` this needs, so a test can emit a crash without arming
5
- * the real handlers and taking the runner down with them.
6
- */
7
- export type FatalProcessHost = {
8
- off: (event: string, handler: FatalProcessListener) => void;
9
- on: (event: string, handler: FatalProcessListener) => void;
10
- };
11
- export type FatalErrorMeta = {
12
- error: {
13
- kind: string;
14
- message: string;
15
- stack?: string;
16
- };
17
- };
18
- export type FatalProcessBarrierHooks = {
19
- isNonFatal?: (handler: FatalProcessHandler, reason: unknown) => boolean;
20
- /**
21
- * Runs after the fatal-exit line is written and before `exit(1)`. The server
22
- * path uses this for graceful shutdown. The early/preload path leaves it
23
- * unset.
24
- */
25
- onFatal?: (handler: FatalProcessHandler, reason: unknown) => void | Promise<void>;
26
- };
27
- export type FatalProcessBarrierOptions = FatalProcessBarrierHooks & {
28
- exit?: (code: number) => void;
29
- isWarm?: boolean;
30
- log?: (message: string, meta?: FatalErrorMeta) => void;
31
- process?: FatalProcessHost;
32
- };
33
- type BarrierState = {
34
- fatalHandled: boolean;
35
- hooks: {
36
- exit: (code: number) => void;
37
- isNonFatal?: FatalProcessBarrierHooks["isNonFatal"];
38
- isWarm: boolean;
39
- log: (message: string, meta?: FatalErrorMeta) => void;
40
- onFatal?: FatalProcessBarrierHooks["onFatal"];
41
- };
42
- off: () => void;
43
- };
44
- /**
45
- * Armed state lives on `globalThis`, not in a module-level WeakMap: the
46
- * packaged CLI loads TWO copies of this file (bin/run.js imports the
47
- * node_modules export; createDevServer uses the esbuild-bundled copy). A
48
- * per-module map would make the second call register a new listener pair
49
- * instead of attaching `isNonFatal` / `onFatal`, and the early copy would
50
- * `exit(1)` on recoverable Vite/socket errors before shutdown ran.
51
- */
52
- declare global {
53
- var __superblocksFatalProcessBarrierArmed: WeakMap<FatalProcessHost, BarrierState> | undefined;
54
- }
55
- /**
56
- * Arm process-level crash handlers once per host. A second call on the same
57
- * host is a no-op for listeners and updates hooks when the caller supplies them
58
- * (preload arms early; `createDevServer` later attaches shutdown). Shared
59
- * across the node_modules and esbuild copies of this module.
60
- */
61
- export declare function installFatalProcessBarrier(options?: FatalProcessBarrierOptions): () => void;
62
- export declare function isFatalProcessHandled(host?: FatalProcessHost): boolean;
63
- /** Exit code graceful shutdown should use so a crash is not reported as 0. */
64
- export declare function fatalAwareExitCode(host?: FatalProcessHost): number;
65
- /**
66
- * Child/warm entry: arm before oclif/`dev()` so a startup crash still writes
67
- * `event=dev_server_fatal_exit`. Safe to call again later from createDevServer.
68
- */
69
- export declare function installEarlyFatalProcessBarrier(): void;
70
- export {};
71
- //# sourceMappingURL=fatal-process-barrier.d.mts.map