@superblocksteam/sdk 2.0.106-next.6 → 2.0.106
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/dev.d.mts +0 -3
- package/dist/cli-replacement/dev.d.mts.map +1 -1
- package/dist/cli-replacement/dev.mjs +0 -1
- package/dist/cli-replacement/dev.mjs.map +1 -1
- package/dist/dev-utils/dev-server.d.mts +1 -18
- package/dist/dev-utils/dev-server.d.mts.map +1 -1
- package/dist/dev-utils/dev-server.mjs +42 -113
- package/dist/dev-utils/dev-server.mjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/src/cli-replacement/dev.mts +0 -5
- package/src/dev-utils/dev-server.mts +47 -135
- package/src/index.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { existsSync } from "node:fs";
|
|
2
1
|
import type http from "node:http";
|
|
3
2
|
import net from "node:net";
|
|
4
3
|
import os from "node:os";
|
|
@@ -113,13 +112,6 @@ interface CreateDevServerOptions {
|
|
|
113
112
|
sdk?: SuperblocksSdk;
|
|
114
113
|
/** Explicitly provided base URL from the CLI; preferred over auth-file reads. */
|
|
115
114
|
superblocksBaseUrl?: string;
|
|
116
|
-
/**
|
|
117
|
-
* Pre-existing HTTP server from warm standby mode. When provided, the dev
|
|
118
|
-
* server attaches its Express app as a request handler on this server instead
|
|
119
|
-
* of creating a new one and calling listen(). This avoids the port gap that
|
|
120
|
-
* causes 502s from the gateway during the warm → full server transition.
|
|
121
|
-
*/
|
|
122
|
-
existingServer?: http.Server;
|
|
123
115
|
}
|
|
124
116
|
|
|
125
117
|
let httpServer: http.Server;
|
|
@@ -139,7 +131,6 @@ export async function createDevServer({
|
|
|
139
131
|
port,
|
|
140
132
|
sdk,
|
|
141
133
|
superblocksBaseUrl: explicitBaseUrl,
|
|
142
|
-
existingServer,
|
|
143
134
|
}: CreateDevServerOptions) {
|
|
144
135
|
const logger = getLogger(loggerOverride);
|
|
145
136
|
if (httpServer) {
|
|
@@ -393,21 +384,50 @@ export async function createDevServer({
|
|
|
393
384
|
}
|
|
394
385
|
}
|
|
395
386
|
|
|
396
|
-
logger.info("
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
try {
|
|
400
|
-
await vitePromise;
|
|
387
|
+
logger.info("Initializing dev server...");
|
|
388
|
+
if (isViteServerInitialized) {
|
|
389
|
+
logger.info("Dev server already initialized");
|
|
401
390
|
res.send(JSON.stringify(healthResponse));
|
|
402
|
-
|
|
403
|
-
logger.error(
|
|
404
|
-
"Vite server failed to initialize",
|
|
405
|
-
getErrorMeta(e as Error),
|
|
406
|
-
);
|
|
407
|
-
res
|
|
408
|
-
.status(500)
|
|
409
|
-
.send(JSON.stringify({ error: "Dev server failed to initialize" }));
|
|
391
|
+
return;
|
|
410
392
|
}
|
|
393
|
+
logger.info("Starting dev server");
|
|
394
|
+
isViteServerInitialized = true;
|
|
395
|
+
|
|
396
|
+
const featureFlags = await sdk?.getFeatureFlagsForCurrentUser();
|
|
397
|
+
|
|
398
|
+
// TODO(code-mode): should this include any validation checks, such as getting a token?
|
|
399
|
+
|
|
400
|
+
startVite({
|
|
401
|
+
port,
|
|
402
|
+
app,
|
|
403
|
+
root,
|
|
404
|
+
mode,
|
|
405
|
+
fsOperationQueue,
|
|
406
|
+
syncService,
|
|
407
|
+
lockService,
|
|
408
|
+
aiService,
|
|
409
|
+
gitService,
|
|
410
|
+
activateGitService,
|
|
411
|
+
snapshotManager,
|
|
412
|
+
checkAuthorization,
|
|
413
|
+
logger: loggerOverride,
|
|
414
|
+
httpServer,
|
|
415
|
+
superblocksBaseUrl: explicitBaseUrl || localToken?.superblocksBaseUrl,
|
|
416
|
+
features: {
|
|
417
|
+
enableSessionRecording: featureFlags?.enableSessionRecording() ?? false,
|
|
418
|
+
},
|
|
419
|
+
}).then(
|
|
420
|
+
(result) => {
|
|
421
|
+
logger.info("Dev server initialized");
|
|
422
|
+
viteResolve();
|
|
423
|
+
viteCreationResults = result;
|
|
424
|
+
res.send(JSON.stringify(healthResponse));
|
|
425
|
+
},
|
|
426
|
+
(e) => {
|
|
427
|
+
logger.error("Error initializing dev server", getErrorMeta(e));
|
|
428
|
+
viteReject(e);
|
|
429
|
+
},
|
|
430
|
+
);
|
|
411
431
|
});
|
|
412
432
|
|
|
413
433
|
app.post("/_sb_disconnect", authHandler, async (req, res) => {
|
|
@@ -480,13 +500,8 @@ export async function createDevServer({
|
|
|
480
500
|
timeSinceLastActivityMs: lockService.timeSinceLastActivity,
|
|
481
501
|
});
|
|
482
502
|
} else {
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
res.send({
|
|
486
|
-
isUserActive: false,
|
|
487
|
-
connectedUsers: [],
|
|
488
|
-
timeSinceLastActivityMs: 0,
|
|
489
|
-
});
|
|
503
|
+
logger.error("Lock service not found, rejecting request");
|
|
504
|
+
viteReject(new Error("Lock service not found, rejecting request"));
|
|
490
505
|
}
|
|
491
506
|
});
|
|
492
507
|
|
|
@@ -518,64 +533,9 @@ export async function createDevServer({
|
|
|
518
533
|
);
|
|
519
534
|
});
|
|
520
535
|
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
existingServer.removeAllListeners("request");
|
|
525
|
-
existingServer.on("request", app);
|
|
526
|
-
httpServer = existingServer;
|
|
527
|
-
logger.info(
|
|
528
|
-
`Attached full dev server to existing HTTP server on port ${port}`,
|
|
529
|
-
);
|
|
530
|
-
} else {
|
|
531
|
-
logger.info(`Starting HTTP server on port ${port}`);
|
|
532
|
-
httpServer = await app.listen(port);
|
|
533
|
-
logger.info(`HTTP server started successfully on port ${port}`);
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
// Start vite eagerly so it's ready (or nearly ready) by the time the editor
|
|
537
|
-
// connects via /_sb_connect. Previously vite was started lazily on first
|
|
538
|
-
// /_sb_connect, adding ~5s to perceived connection time.
|
|
539
|
-
if (!isViteServerInitialized) {
|
|
540
|
-
isViteServerInitialized = true;
|
|
541
|
-
logger.info("Eagerly starting vite server...");
|
|
542
|
-
|
|
543
|
-
const featureFlags = await sdk
|
|
544
|
-
?.getFeatureFlagsForCurrentUser()
|
|
545
|
-
.catch(() => undefined);
|
|
546
|
-
|
|
547
|
-
startVite({
|
|
548
|
-
port,
|
|
549
|
-
app,
|
|
550
|
-
root,
|
|
551
|
-
mode,
|
|
552
|
-
fsOperationQueue,
|
|
553
|
-
syncService,
|
|
554
|
-
lockService,
|
|
555
|
-
aiService,
|
|
556
|
-
gitService,
|
|
557
|
-
activateGitService,
|
|
558
|
-
snapshotManager,
|
|
559
|
-
checkAuthorization,
|
|
560
|
-
logger: loggerOverride,
|
|
561
|
-
httpServer,
|
|
562
|
-
superblocksBaseUrl: explicitBaseUrl || localToken?.superblocksBaseUrl,
|
|
563
|
-
features: {
|
|
564
|
-
enableSessionRecording: featureFlags?.enableSessionRecording() ?? false,
|
|
565
|
-
},
|
|
566
|
-
}).then(
|
|
567
|
-
(result) => {
|
|
568
|
-
logger.info("Vite server initialized eagerly");
|
|
569
|
-
viteResolve();
|
|
570
|
-
viteCreationResults = result;
|
|
571
|
-
},
|
|
572
|
-
(e) => {
|
|
573
|
-
logger.error("Error initializing vite server", getErrorMeta(e));
|
|
574
|
-
viteReject(e);
|
|
575
|
-
},
|
|
576
|
-
);
|
|
577
|
-
}
|
|
578
|
-
|
|
536
|
+
logger.info(`Starting HTTP server on port ${port}`);
|
|
537
|
+
httpServer = await app.listen(port);
|
|
538
|
+
logger.info(`HTTP server started successfully on port ${port}`);
|
|
579
539
|
return httpServer;
|
|
580
540
|
}
|
|
581
541
|
|
|
@@ -784,54 +744,6 @@ async function startVite({
|
|
|
784
744
|
});
|
|
785
745
|
}
|
|
786
746
|
|
|
787
|
-
/**
|
|
788
|
-
* Pre-warm the Vite dependency cache by creating and immediately closing a
|
|
789
|
-
* minimal Vite server. This populates `node_modules/.vite/deps` with
|
|
790
|
-
* pre-bundled dependencies so that `createDevServer` starts ~1-2s faster.
|
|
791
|
-
*
|
|
792
|
-
* Call this during warm standby phase while waiting for activation.
|
|
793
|
-
* Non-fatal — if it fails the activation-time Vite start still works,
|
|
794
|
-
* just without the cache benefit.
|
|
795
|
-
*/
|
|
796
|
-
export async function preWarmViteCache(root: string): Promise<void> {
|
|
797
|
-
const start = Date.now();
|
|
798
|
-
console.log("[warm] Pre-warming Vite dependency cache...");
|
|
799
|
-
try {
|
|
800
|
-
// Create a Vite server with optimizeDeps.noDiscovery so it only processes
|
|
801
|
-
// the deps listed in optimizeDeps.include (from vite.config) without
|
|
802
|
-
// scanning source files. This is faster and avoids hanging on HMR setup.
|
|
803
|
-
const server = await createServer({
|
|
804
|
-
root,
|
|
805
|
-
mode: "development",
|
|
806
|
-
server: { middlewareMode: true, hmr: false },
|
|
807
|
-
plugins: [tsconfigPaths()],
|
|
808
|
-
logLevel: "warn",
|
|
809
|
-
optimizeDeps: { noDiscovery: true },
|
|
810
|
-
});
|
|
811
|
-
// Poll for the dep cache directory instead of sleeping a fixed 500ms.
|
|
812
|
-
// Vite renames a temp dir to node_modules/.vite/deps once optimization
|
|
813
|
-
// completes; polling avoids both under-waiting (cache not committed) and
|
|
814
|
-
// over-waiting (wasted time on fast disks).
|
|
815
|
-
const depsDir = path.join(root, "node_modules", ".vite", "deps");
|
|
816
|
-
const maxWaitMs = 5_000;
|
|
817
|
-
const pollMs = 50;
|
|
818
|
-
const deadline = Date.now() + maxWaitMs;
|
|
819
|
-
while (!existsSync(depsDir) && Date.now() < deadline) {
|
|
820
|
-
await new Promise((r) => setTimeout(r, pollMs));
|
|
821
|
-
}
|
|
822
|
-
await server.close();
|
|
823
|
-
const cached = existsSync(depsDir);
|
|
824
|
-
console.log(
|
|
825
|
-
`[warm] Vite cache ${cached ? "warmed" : "not committed (timed out)"} in ${Date.now() - start}ms`,
|
|
826
|
-
);
|
|
827
|
-
} catch (error) {
|
|
828
|
-
console.warn(
|
|
829
|
-
`[warm] Vite cache pre-warm failed (non-fatal, ${Date.now() - start}ms):`,
|
|
830
|
-
error,
|
|
831
|
-
);
|
|
832
|
-
}
|
|
833
|
-
}
|
|
834
|
-
|
|
835
747
|
const DEFAULT_HMR_PORT = 24678;
|
|
836
748
|
|
|
837
749
|
function getFreePort() {
|
package/src/index.ts
CHANGED
|
@@ -64,7 +64,7 @@ export {
|
|
|
64
64
|
export { AUTO_UPGRADE_EXIT_CODE } from "./cli-replacement/automatic-upgrades.js";
|
|
65
65
|
export { RESTART_EXIT_CODE } from "./dev-utils/dev-server.mjs";
|
|
66
66
|
|
|
67
|
-
export { createDevServer
|
|
67
|
+
export { createDevServer } from "./dev-utils/dev-server.mjs";
|
|
68
68
|
|
|
69
69
|
export { TokenManager } from "./dev-utils/token-manager.js";
|
|
70
70
|
|