@livestore/utils-dev 0.0.0-snapshot-218fbc8b9fe8fb6286b52193093802324ac5e617 → 0.0.0-snapshot-6d1da0d93ffe8144f36fc2ec57c22db22a1d18d8
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/dist/.tsbuildinfo.json +1 -1
- package/dist/node/WranglerDevServer/WranglerDevServer.d.ts +4 -2
- package/dist/node/WranglerDevServer/WranglerDevServer.d.ts.map +1 -1
- package/dist/node/WranglerDevServer/WranglerDevServer.js +46 -18
- package/dist/node/WranglerDevServer/WranglerDevServer.js.map +1 -1
- package/dist/node/WranglerDevServer/WranglerDevServer.test.js +5 -5
- package/dist/node/WranglerDevServer/WranglerDevServer.test.js.map +1 -1
- package/package.json +2 -2
- package/src/node/WranglerDevServer/WranglerDevServer.test.ts +8 -6
- package/src/node/WranglerDevServer/WranglerDevServer.ts +58 -22
|
@@ -25,9 +25,11 @@ export interface WranglerDevServer {
|
|
|
25
25
|
export interface StartWranglerDevServerArgs {
|
|
26
26
|
wranglerConfigPath?: string;
|
|
27
27
|
cwd: string;
|
|
28
|
-
port
|
|
28
|
+
/** The port to try first. The dev server may bind a different port if unavailable. */
|
|
29
|
+
preferredPort?: number;
|
|
29
30
|
/** @default false */
|
|
30
31
|
showLogs?: boolean;
|
|
32
|
+
inspectorPort?: number;
|
|
31
33
|
connectTimeout?: Duration.DurationInput;
|
|
32
34
|
}
|
|
33
35
|
declare const WranglerDevServerService_base: Effect.Service.Class<WranglerDevServerService, "WranglerDevServerService", {
|
|
@@ -35,7 +37,7 @@ declare const WranglerDevServerService_base: Effect.Service.Class<WranglerDevSer
|
|
|
35
37
|
port: number;
|
|
36
38
|
url: string;
|
|
37
39
|
processId: import("@effect/platform/CommandExecutor").ProcessId;
|
|
38
|
-
}, WranglerDevServerError, import("effect/Scope").Scope | HttpClient.HttpClient | import("@effect/platform/CommandExecutor").CommandExecutor>;
|
|
40
|
+
}, import("@livestore/utils/effect").UnknownError | WranglerDevServerError, import("effect/Scope").Scope | HttpClient.HttpClient | import("@effect/platform/CommandExecutor").CommandExecutor>;
|
|
39
41
|
}>;
|
|
40
42
|
/**
|
|
41
43
|
* WranglerDevServer as an Effect.Service.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WranglerDevServer.d.ts","sourceRoot":"","sources":["../../../src/node/WranglerDevServer/WranglerDevServer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WranglerDevServer.d.ts","sourceRoot":"","sources":["../../../src/node/WranglerDevServer/WranglerDevServer.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,QAAQ,EACR,MAAM,EAEN,UAAU,EAIV,MAAM,EAEP,MAAM,yBAAyB,CAAA;;;;;;;;AAIhC;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,2BAI1C;CAAG;AAEL;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAA;CACxC;;4BAYgB,0BAA0B;;;;;;AAV3C;;;;;;;;GAQG;AACH,qBAAa,wBAAyB,SAAQ,6BAsJ5C;CAAG"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { error } from 'node:console';
|
|
1
2
|
import * as path from 'node:path';
|
|
2
|
-
import { IS_CI } from '@livestore/utils';
|
|
3
|
-
import { Command, Duration, Effect, Exit, HttpClient, Schedule, Schema, Stream, } from '@livestore/utils/effect';
|
|
3
|
+
import { IS_CI, shouldNeverHappen } from '@livestore/utils';
|
|
4
|
+
import { Command, Duration, Effect, Exit, HttpClient, Option, Schedule, Schema, Stream, } from '@livestore/utils/effect';
|
|
4
5
|
import { getFreePort } from '@livestore/utils/node';
|
|
5
6
|
import { cleanupOrphanedProcesses, killProcessTree } from "./process-tree-manager.js";
|
|
6
7
|
/**
|
|
@@ -28,17 +29,18 @@ export class WranglerDevServerService extends Effect.Service()('WranglerDevServe
|
|
|
28
29
|
yield* cleanupOrphanedProcesses(['wrangler', 'workerd']).pipe(Effect.tap((result) => showLogs && (result.cleaned.length > 0 || result.failed.length > 0)
|
|
29
30
|
? Effect.logInfo(`Cleanup result: ${result.cleaned.length} cleaned, ${result.failed.length} failed`)
|
|
30
31
|
: Effect.void), Effect.ignore);
|
|
31
|
-
// Allocate port
|
|
32
|
-
const
|
|
32
|
+
// Allocate preferred port (Wrangler may bind a different one if unavailable)
|
|
33
|
+
const preferredPort = args.preferredPort ??
|
|
33
34
|
(yield* getFreePort.pipe(Effect.mapError((cause) => new WranglerDevServerError({ cause, message: 'Failed to get free port', port: -1 }))));
|
|
34
|
-
yield* Effect.annotateCurrentSpan({
|
|
35
|
+
yield* Effect.annotateCurrentSpan({ preferredPort });
|
|
35
36
|
// Resolve config path
|
|
36
37
|
const configPath = path.resolve(args.wranglerConfigPath ?? path.join(args.cwd, 'wrangler.toml'));
|
|
38
|
+
const inspectorPort = args.inspectorPort ?? (yield* getFreePort);
|
|
37
39
|
// Start wrangler process using Effect Command
|
|
38
|
-
const process = yield* Command.make('bunx', 'wrangler', 'dev', '--port', port.toString(), '--config', configPath).pipe(Command.workingDirectory(args.cwd), Command.stdout('pipe'), Command.stderr('pipe'), Command.start, Effect.catchAllCause((error) => new WranglerDevServerError({
|
|
40
|
+
const process = yield* Command.make('bunx', 'wrangler', 'dev', '--port', preferredPort.toString(), '--inspector-port', inspectorPort.toString(), '--config', configPath).pipe(Command.workingDirectory(args.cwd), Command.stdout('pipe'), Command.stderr('pipe'), Command.start, Effect.catchAllCause((error) => new WranglerDevServerError({
|
|
39
41
|
cause: error,
|
|
40
42
|
message: `Failed to start wrangler process in directory: ${args.cwd}`,
|
|
41
|
-
port,
|
|
43
|
+
port: preferredPort,
|
|
42
44
|
})), Effect.withSpan('WranglerDevServerService:startProcess'));
|
|
43
45
|
if (showLogs) {
|
|
44
46
|
yield* process.stderr.pipe(Stream.decodeText('utf8'), Stream.tapLogWithLabel('wrangler:stderr'), Stream.runDrain, Effect.forkScoped);
|
|
@@ -77,33 +79,59 @@ export class WranglerDevServerService extends Effect.Service()('WranglerDevServe
|
|
|
77
79
|
}
|
|
78
80
|
}).pipe(Effect.withSpan('WranglerDevServerService:cleanupProcess'), Effect.timeout('5 seconds'), // Don't let cleanup hang forever
|
|
79
81
|
Effect.ignoreLogged));
|
|
80
|
-
// Wait for server to be ready
|
|
81
|
-
yield* waitForReady({ stdout, showLogs });
|
|
82
|
-
const
|
|
82
|
+
// Wait for server to be ready and parse the actual bound host:port from stdout
|
|
83
|
+
const readyInfo = yield* waitForReady({ stdout, showLogs });
|
|
84
|
+
const actualPort = readyInfo.port;
|
|
85
|
+
const actualHost = readyInfo.host;
|
|
86
|
+
const url = `http://${actualHost}:${actualPort}`;
|
|
83
87
|
// Use longer timeout in CI environments to account for slower startup times
|
|
84
|
-
const defaultTimeout = Duration.seconds(IS_CI ?
|
|
88
|
+
const defaultTimeout = Duration.seconds(IS_CI ? 30 : 5);
|
|
85
89
|
yield* verifyHttpConnectivity({ url, showLogs, connectTimeout: args.connectTimeout ?? defaultTimeout });
|
|
86
90
|
if (showLogs) {
|
|
87
|
-
yield* Effect.logDebug(`Wrangler dev server ready and accepting connections on port ${
|
|
91
|
+
yield* Effect.logDebug(`Wrangler dev server ready and accepting connections on port ${actualPort} (preferred: ${preferredPort})`);
|
|
88
92
|
}
|
|
89
93
|
return {
|
|
90
|
-
port,
|
|
94
|
+
port: actualPort,
|
|
91
95
|
url,
|
|
92
96
|
processId,
|
|
93
97
|
};
|
|
94
98
|
}).pipe(Effect.withSpan('WranglerDevServerService', {
|
|
95
|
-
attributes: {
|
|
99
|
+
attributes: { preferredPort: args.preferredPort ?? 'auto', cwd: args.cwd },
|
|
96
100
|
})),
|
|
97
101
|
}) {
|
|
98
102
|
}
|
|
99
103
|
/**
|
|
100
104
|
* Waits for Wrangler server to be ready by monitoring stdout for "Ready on" message
|
|
101
105
|
*/
|
|
102
|
-
const waitForReady = ({ stdout, showLogs, }) => stdout.pipe(Stream.decodeText('utf8'), Stream.splitLines, Stream.tap((line) => (showLogs ? Effect.logDebug(`[wrangler] ${line}`) : Effect.void)),
|
|
103
|
-
|
|
104
|
-
|
|
106
|
+
const waitForReady = ({ stdout, showLogs, }) => stdout.pipe(Stream.decodeText('utf8'), Stream.splitLines, Stream.tap((line) => (showLogs ? Effect.logDebug(`[wrangler] ${line}`) : Effect.void)),
|
|
107
|
+
// Find the first readiness line and try to parse the port from it
|
|
108
|
+
Stream.filterMap((line) => {
|
|
109
|
+
if (line.includes('Ready on')) {
|
|
110
|
+
// Expect: "Ready on http://<host>:<port>"
|
|
111
|
+
const m = line.match(/https?:\/\/([^:\s]+):(\d+)/i);
|
|
112
|
+
if (!m)
|
|
113
|
+
return shouldNeverHappen('Could not parse host:port from Wrangler "Ready on" line', line);
|
|
114
|
+
const host = m[1];
|
|
115
|
+
const port = Number.parseInt(m[2], 10);
|
|
116
|
+
if (!Number.isFinite(port))
|
|
117
|
+
return shouldNeverHappen('Parsed non-finite port from Wrangler output', line);
|
|
118
|
+
return Option.some({ host, port });
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
return Option.none();
|
|
122
|
+
}
|
|
123
|
+
}), Stream.take(1), Stream.runHead, Effect.flatten, Effect.orElse(() => new WranglerDevServerError({
|
|
124
|
+
cause: 'WranglerReadyLineMissing',
|
|
125
|
+
message: 'Wrangler server did not emit a "Ready on" line',
|
|
105
126
|
port: 0,
|
|
106
|
-
}))
|
|
127
|
+
})), Effect.timeoutFail({
|
|
128
|
+
duration: '30 seconds',
|
|
129
|
+
onTimeout: () => new WranglerDevServerError({
|
|
130
|
+
cause: error,
|
|
131
|
+
message: 'Wrangler server failed to start within timeout',
|
|
132
|
+
port: 0,
|
|
133
|
+
}),
|
|
134
|
+
}));
|
|
107
135
|
/**
|
|
108
136
|
* Verifies the server is actually accepting HTTP connections by making a test request
|
|
109
137
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WranglerDevServer.js","sourceRoot":"","sources":["../../../src/node/WranglerDevServer/WranglerDevServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"WranglerDevServer.js","sourceRoot":"","sources":["../../../src/node/WranglerDevServer/WranglerDevServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,11 +25,11 @@ Vitest.describe('WranglerDevServer', { timeout: testTimeout }, () => {
|
|
|
25
25
|
expect(typeof server.processId).toBe('number');
|
|
26
26
|
expect(server.processId).toBeGreaterThan(0);
|
|
27
27
|
}).pipe(withBasicTest()(test)));
|
|
28
|
-
Vitest.scopedLive('should use specified port when provided', (test) => Effect.gen(function* () {
|
|
28
|
+
Vitest.scopedLive('should use specified port when provided', (test) => Effect.andThen(getFreePort, (port) => Effect.gen(function* () {
|
|
29
29
|
const server = yield* WranglerDevServerService;
|
|
30
|
-
expect(server.port).toBe(
|
|
31
|
-
expect(server.url).toBe(`http://localhost
|
|
32
|
-
}).pipe(withBasicTest({
|
|
30
|
+
expect(server.port).toBe(port);
|
|
31
|
+
expect(server.url).toBe(`http://localhost:${port}`);
|
|
32
|
+
}).pipe(withBasicTest({ preferredPort: port })(test))));
|
|
33
33
|
});
|
|
34
34
|
Vitest.describe('Resource Management', () => {
|
|
35
35
|
Vitest.scopedLive('should cleanup processes on scope close', (test) => Effect.gen(function* () {
|
|
@@ -173,7 +173,7 @@ Vitest.describe('WranglerDevServer', { timeout: testTimeout }, () => {
|
|
|
173
173
|
const server = yield* WranglerDevServerService;
|
|
174
174
|
expect(server.port).toBe(port);
|
|
175
175
|
expect(server.url).toBe(`http://localhost:${port}`);
|
|
176
|
-
}).pipe(withServiceTest({ port })(test))));
|
|
176
|
+
}).pipe(withServiceTest({ preferredPort: port })(test))));
|
|
177
177
|
});
|
|
178
178
|
});
|
|
179
179
|
//# sourceMappingURL=WranglerDevServer.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WranglerDevServer.test.js","sourceRoot":"","sources":["../../../src/node/WranglerDevServer/WranglerDevServer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC5F,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAEL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,wBAAwB,CAAA;AAE/B,MAAM,WAAW,GAAG,MAAM,CAAA;AAE1B,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC;IACzC,OAAO,EAAE,WAAW;IACpB,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK;CAChD,CAAC,CAAA;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAA4C,EAAE,EAAE,EAAE,CAC/E,wBAAwB,CAAC,OAAO,CAAC;IAC/B,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,WAAW;IACtC,GAAG,IAAI;CACR,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;AAE/C,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE;IAClE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACvC,MAAM,aAAa,GAAG,CAAC,OAA4C,EAAE,EAAE,EAAE,CACvE,MAAM,CAAC,eAAe,CAAC;YACrB,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SACjG,CAAC,CAAA;QAEJ,MAAM,CAAC,UAAU,CAAC,kDAAkD,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,wBAAwB,CAAA;YAE9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACtC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAA;YACpD,MAAM,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC9C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAC/B,CAAA;QAED,MAAM,CAAC,UAAU,CAAC,yCAAyC,EAAE,CAAC,IAAI,EAAE,EAAE,CACpE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,wBAAwB,CAAA;YAE9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"WranglerDevServer.test.js","sourceRoot":"","sources":["../../../src/node/WranglerDevServer/WranglerDevServer.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/utils-dev",
|
|
3
|
-
"version": "0.0.0-snapshot-
|
|
3
|
+
"version": "0.0.0-snapshot-6d1da0d93ffe8144f36fc2ec57c22db22a1d18d8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"./src/node-vitest/global.ts",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"@opentelemetry/sdk-metrics": "2.0.1",
|
|
20
20
|
"@opentelemetry/sdk-trace-base": "2.0.1",
|
|
21
21
|
"@opentelemetry/sdk-trace-node": "2.0.1",
|
|
22
|
-
"@livestore/utils": "0.0.0-snapshot-
|
|
22
|
+
"@livestore/utils": "0.0.0-snapshot-6d1da0d93ffe8144f36fc2ec57c22db22a1d18d8"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {},
|
|
25
25
|
"files": [
|
|
@@ -41,12 +41,14 @@ Vitest.describe('WranglerDevServer', { timeout: testTimeout }, () => {
|
|
|
41
41
|
)
|
|
42
42
|
|
|
43
43
|
Vitest.scopedLive('should use specified port when provided', (test) =>
|
|
44
|
-
Effect.
|
|
45
|
-
|
|
44
|
+
Effect.andThen(getFreePort, (port) =>
|
|
45
|
+
Effect.gen(function* () {
|
|
46
|
+
const server = yield* WranglerDevServerService
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
expect(server.port).toBe(port)
|
|
49
|
+
expect(server.url).toBe(`http://localhost:${port}`)
|
|
50
|
+
}).pipe(withBasicTest({ preferredPort: port })(test)),
|
|
51
|
+
),
|
|
50
52
|
)
|
|
51
53
|
})
|
|
52
54
|
|
|
@@ -261,7 +263,7 @@ Vitest.describe('WranglerDevServer', { timeout: testTimeout }, () => {
|
|
|
261
263
|
|
|
262
264
|
expect(server.port).toBe(port)
|
|
263
265
|
expect(server.url).toBe(`http://localhost:${port}`)
|
|
264
|
-
}).pipe(withServiceTest({ port })(test)),
|
|
266
|
+
}).pipe(withServiceTest({ preferredPort: port })(test)),
|
|
265
267
|
),
|
|
266
268
|
)
|
|
267
269
|
})
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import { error } from 'node:console'
|
|
1
2
|
import * as path from 'node:path'
|
|
2
|
-
import { IS_CI } from '@livestore/utils'
|
|
3
|
+
import { IS_CI, shouldNeverHappen } from '@livestore/utils'
|
|
3
4
|
import {
|
|
4
5
|
Command,
|
|
5
6
|
Duration,
|
|
6
7
|
Effect,
|
|
7
8
|
Exit,
|
|
8
9
|
HttpClient,
|
|
10
|
+
Option,
|
|
9
11
|
type PlatformError,
|
|
10
12
|
Schedule,
|
|
11
13
|
Schema,
|
|
@@ -38,9 +40,11 @@ export interface WranglerDevServer {
|
|
|
38
40
|
export interface StartWranglerDevServerArgs {
|
|
39
41
|
wranglerConfigPath?: string
|
|
40
42
|
cwd: string
|
|
41
|
-
port
|
|
43
|
+
/** The port to try first. The dev server may bind a different port if unavailable. */
|
|
44
|
+
preferredPort?: number
|
|
42
45
|
/** @default false */
|
|
43
46
|
showLogs?: boolean
|
|
47
|
+
inspectorPort?: number
|
|
44
48
|
connectTimeout?: Duration.DurationInput
|
|
45
49
|
}
|
|
46
50
|
|
|
@@ -68,27 +72,31 @@ export class WranglerDevServerService extends Effect.Service<WranglerDevServerSe
|
|
|
68
72
|
Effect.ignore, // Don't fail startup if cleanup fails
|
|
69
73
|
)
|
|
70
74
|
|
|
71
|
-
// Allocate port
|
|
72
|
-
const
|
|
73
|
-
args.
|
|
75
|
+
// Allocate preferred port (Wrangler may bind a different one if unavailable)
|
|
76
|
+
const preferredPort =
|
|
77
|
+
args.preferredPort ??
|
|
74
78
|
(yield* getFreePort.pipe(
|
|
75
79
|
Effect.mapError(
|
|
76
80
|
(cause) => new WranglerDevServerError({ cause, message: 'Failed to get free port', port: -1 }),
|
|
77
81
|
),
|
|
78
82
|
))
|
|
79
83
|
|
|
80
|
-
yield* Effect.annotateCurrentSpan({
|
|
84
|
+
yield* Effect.annotateCurrentSpan({ preferredPort })
|
|
81
85
|
|
|
82
86
|
// Resolve config path
|
|
83
87
|
const configPath = path.resolve(args.wranglerConfigPath ?? path.join(args.cwd, 'wrangler.toml'))
|
|
84
88
|
|
|
89
|
+
const inspectorPort = args.inspectorPort ?? (yield* getFreePort)
|
|
90
|
+
|
|
85
91
|
// Start wrangler process using Effect Command
|
|
86
92
|
const process = yield* Command.make(
|
|
87
93
|
'bunx',
|
|
88
94
|
'wrangler',
|
|
89
95
|
'dev',
|
|
90
96
|
'--port',
|
|
91
|
-
|
|
97
|
+
preferredPort.toString(),
|
|
98
|
+
'--inspector-port',
|
|
99
|
+
inspectorPort.toString(),
|
|
92
100
|
'--config',
|
|
93
101
|
configPath,
|
|
94
102
|
).pipe(
|
|
@@ -101,7 +109,7 @@ export class WranglerDevServerService extends Effect.Service<WranglerDevServerSe
|
|
|
101
109
|
new WranglerDevServerError({
|
|
102
110
|
cause: error,
|
|
103
111
|
message: `Failed to start wrangler process in directory: ${args.cwd}`,
|
|
104
|
-
port,
|
|
112
|
+
port: preferredPort,
|
|
105
113
|
}),
|
|
106
114
|
),
|
|
107
115
|
Effect.withSpan('WranglerDevServerService:startProcess'),
|
|
@@ -171,27 +179,32 @@ export class WranglerDevServerService extends Effect.Service<WranglerDevServerSe
|
|
|
171
179
|
),
|
|
172
180
|
)
|
|
173
181
|
|
|
174
|
-
// Wait for server to be ready
|
|
175
|
-
yield* waitForReady({ stdout, showLogs })
|
|
182
|
+
// Wait for server to be ready and parse the actual bound host:port from stdout
|
|
183
|
+
const readyInfo = yield* waitForReady({ stdout, showLogs })
|
|
176
184
|
|
|
177
|
-
const
|
|
185
|
+
const actualPort = readyInfo.port
|
|
186
|
+
const actualHost = readyInfo.host
|
|
187
|
+
const url = `http://${actualHost}:${actualPort}`
|
|
178
188
|
|
|
179
189
|
// Use longer timeout in CI environments to account for slower startup times
|
|
180
|
-
const defaultTimeout = Duration.seconds(IS_CI ?
|
|
190
|
+
const defaultTimeout = Duration.seconds(IS_CI ? 30 : 5)
|
|
191
|
+
|
|
181
192
|
yield* verifyHttpConnectivity({ url, showLogs, connectTimeout: args.connectTimeout ?? defaultTimeout })
|
|
182
193
|
|
|
183
194
|
if (showLogs) {
|
|
184
|
-
yield* Effect.logDebug(
|
|
195
|
+
yield* Effect.logDebug(
|
|
196
|
+
`Wrangler dev server ready and accepting connections on port ${actualPort} (preferred: ${preferredPort})`,
|
|
197
|
+
)
|
|
185
198
|
}
|
|
186
199
|
|
|
187
200
|
return {
|
|
188
|
-
port,
|
|
201
|
+
port: actualPort,
|
|
189
202
|
url,
|
|
190
203
|
processId,
|
|
191
204
|
} satisfies WranglerDevServer
|
|
192
205
|
}).pipe(
|
|
193
206
|
Effect.withSpan('WranglerDevServerService', {
|
|
194
|
-
attributes: {
|
|
207
|
+
attributes: { preferredPort: args.preferredPort ?? 'auto', cwd: args.cwd },
|
|
195
208
|
}),
|
|
196
209
|
),
|
|
197
210
|
}) {}
|
|
@@ -205,22 +218,45 @@ const waitForReady = ({
|
|
|
205
218
|
}: {
|
|
206
219
|
stdout: Stream.Stream<Uint8Array, PlatformError.PlatformError, never>
|
|
207
220
|
showLogs: boolean
|
|
208
|
-
}): Effect.Effect<
|
|
221
|
+
}): Effect.Effect<{ host: string; port: number }, WranglerDevServerError, never> =>
|
|
209
222
|
stdout.pipe(
|
|
210
223
|
Stream.decodeText('utf8'),
|
|
211
224
|
Stream.splitLines,
|
|
212
225
|
Stream.tap((line) => (showLogs ? Effect.logDebug(`[wrangler] ${line}`) : Effect.void)),
|
|
213
|
-
|
|
214
|
-
Stream.
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
226
|
+
// Find the first readiness line and try to parse the port from it
|
|
227
|
+
Stream.filterMap<string, { host: string; port: number }>((line) => {
|
|
228
|
+
if (line.includes('Ready on')) {
|
|
229
|
+
// Expect: "Ready on http://<host>:<port>"
|
|
230
|
+
const m = line.match(/https?:\/\/([^:\s]+):(\d+)/i)
|
|
231
|
+
if (!m) return shouldNeverHappen('Could not parse host:port from Wrangler "Ready on" line', line)
|
|
232
|
+
const host = m[1]! as string
|
|
233
|
+
const port = Number.parseInt(m[2]!, 10)
|
|
234
|
+
if (!Number.isFinite(port)) return shouldNeverHappen('Parsed non-finite port from Wrangler output', line)
|
|
235
|
+
return Option.some({ host, port } as const)
|
|
236
|
+
} else {
|
|
237
|
+
return Option.none()
|
|
238
|
+
}
|
|
239
|
+
}),
|
|
240
|
+
Stream.take(1),
|
|
241
|
+
Stream.runHead,
|
|
242
|
+
Effect.flatten,
|
|
243
|
+
Effect.orElse(
|
|
244
|
+
() =>
|
|
245
|
+
new WranglerDevServerError({
|
|
246
|
+
cause: 'WranglerReadyLineMissing',
|
|
247
|
+
message: 'Wrangler server did not emit a "Ready on" line',
|
|
248
|
+
port: 0,
|
|
249
|
+
}),
|
|
250
|
+
),
|
|
251
|
+
Effect.timeoutFail({
|
|
252
|
+
duration: '30 seconds',
|
|
253
|
+
onTimeout: () =>
|
|
218
254
|
new WranglerDevServerError({
|
|
219
255
|
cause: error,
|
|
220
256
|
message: 'Wrangler server failed to start within timeout',
|
|
221
257
|
port: 0,
|
|
222
258
|
}),
|
|
223
|
-
),
|
|
259
|
+
}),
|
|
224
260
|
)
|
|
225
261
|
|
|
226
262
|
/**
|