History

Stabilize auth session cookies per server mode (#1898)

Julius Marminge committed 7 months ago

Commit 4ae9de31 parent 5fa09fa11 files · +212 −22Browse files

Showing the changes to scripts (2 of 11 files). Show all

Unified · Split

2 files
  1. scripts/dev-runner.test.ts +63 −10
  2. scripts/dev-runner.ts +21 −2
scripts/dev-runner.test.ts+63−10
@@ -5,6 +5,7 @@ import { assert, describe, it } from "@effect/vitest"; · 4 unmodified lines
55 import { Effect } from "effect";
66
77 import {
8+ checkPortAvailabilityOnHosts,
89 createDevRunnerEnv,
910 findFirstAvailableOffset,
1011 resolveModePortOffsets,
@@ -164,11 +165,11 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { · 153 unmodified lines
164165 const env = yield* createDevRunnerEnv({
165166 mode: "dev:desktop",
166167 baseEnv: {
167− T3CODE_PORT: "3773",
168+ T3CODE_PORT: "13773",
168169 T3CODE_MODE: "web",
169170 T3CODE_NO_BROWSER: "0",
170171 T3CODE_HOST: "0.0.0.0",
171− VITE_WS_URL: "ws://localhost:3773",
172+ VITE_WS_URL: "ws://localhost:13773",
172173 },
173174 serverOffset: 0,
174175 webOffset: 0,
@@ -193,6 +194,28 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { · 18 unmodified lines
193194 assert.equal(env.VITE_WS_URL, "ws://127.0.0.1:4222");
194195 }),
195196 );
197+
198+ it.effect("defaults dev server mode to the higher backend port range", () =>
199+ Effect.gen(function* () {
200+ const env = yield* createDevRunnerEnv({
201+ mode: "dev",
202+ baseEnv: {},
203+ serverOffset: 0,
204+ webOffset: 0,
205+ t3Home: undefined,
206+ noBrowser: undefined,
207+ autoBootstrapProjectFromCwd: undefined,
208+ logWebSocketEvents: undefined,
209+ host: undefined,
210+ port: undefined,
211+ devUrl: undefined,
212+ });
213+
214+ assert.equal(env.T3CODE_PORT, "13773");
215+ assert.equal(env.VITE_HTTP_URL, "http://localhost:13773");
216+ assert.equal(env.VITE_WS_URL, "ws://localhost:13773");
217+ }),
218+ );
196219 });
197220
198221 describe("findFirstAvailableOffset", () => {
@@ -211,7 +234,7 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { · 12 unmodified lines
211234
212235 it.effect("advances until all required ports are available", () =>
213236 Effect.gen(function* () {
214− const taken = new Set([3773, 5733, 3774, 5734]);
237+ const taken = new Set([13773, 5733, 13774, 5734]);
215238 const offset = yield* findFirstAvailableOffset({
216239 startOffset: 0,
217240 requireServerPort: true,
@@ -223,16 +246,46 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { · 5 unmodified lines
223246 }),
224247 );
225248
226− it.effect("allows offsets where only non-required ports exceed max", () =>
249+ it.effect("allows offsets where the non-required server port exceeds max", () =>
227250 Effect.gen(function* () {
228251 const offset = yield* findFirstAvailableOffset({
229− startOffset: 59_803,
230− requireServerPort: true,
231− requireWebPort: false,
252+ startOffset: 59_802,
253+ requireServerPort: false,
254+ requireWebPort: true,
232255 checkPortAvailability: () => Effect.succeed(true),
233256 });
234257
235− assert.equal(offset, 59_803);
258+ assert.equal(offset, 59_802);
259+ }),
260+ );
261+ });
262+
263+ describe("checkPortAvailabilityOnHosts", () => {
264+ it.effect("checks overlapping hosts sequentially to avoid self-interference", () =>
265+ Effect.gen(function* () {
266+ let inFlightCount = 0;
267+ const calls: Array<[number, string]> = [];
268+
269+ const available = yield* checkPortAvailabilityOnHosts(
270+ 13_773,
271+ ["127.0.0.1", "0.0.0.0", "::"],
272+ (port, host) =>
273+ Effect.promise(async () => {
274+ calls.push([port, host]);
275+ inFlightCount += 1;
276+ const overlapped = inFlightCount > 1;
277+ await Promise.resolve();
278+ inFlightCount -= 1;
279+ return !overlapped;
280+ }),
281+ );
282+
283+ assert.equal(available, true);
284+ assert.deepStrictEqual(calls, [
285+ [13_773, "127.0.0.1"],
286+ [13_773, "0.0.0.0"],
287+ [13_773, "::"],
288+ ]);
236289 }),
237290 );
238291 });
@@ -240,7 +293,7 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { · 1 unmodified line
240293 describe("resolveModePortOffsets", () => {
241294 it.effect("uses a shared fallback offset for dev mode", () =>
242295 Effect.gen(function* () {
243− const taken = new Set([3773, 5733]);
296+ const taken = new Set([13773, 5733]);
244297 const offsets = yield* resolveModePortOffsets({
245298 mode: "dev",
246299 startOffset: 0,
@@ -270,7 +323,7 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { · 23 unmodified lines
270323
271324 it.effect("shifts only server offset for dev:server", () =>
272325 Effect.gen(function* () {
273− const taken = new Set([3773]);
326+ const taken = new Set([13773]);
274327 const offsets = yield* resolveModePortOffsets({
275328 mode: "dev:server",
276329 startOffset: 0,
scripts/dev-runner.ts+21−2
@@ -9,11 +9,12 @@ import { Config, Data, Effect, Hash, Layer, Logger, Option, Path, Schema } from · 8 unmodified lines
99 import { Argument, Command, Flag } from "effect/unstable/cli";
1010 import { ChildProcess } from "effect/unstable/process";
1111
12−const BASE_SERVER_PORT = 3773;
12+const BASE_SERVER_PORT = 13773;
1313 const BASE_WEB_PORT = 5733;
1414 const MAX_HASH_OFFSET = 3000;
1515 const MAX_PORT = 65535;
1616 const DESKTOP_DEV_LOOPBACK_HOST = "127.0.0.1";
17+const DEV_PORT_PROBE_HOSTS = ["127.0.0.1", "0.0.0.0", "::1", "::"] as const;
1718
1819 export const DEFAULT_T3_HOME = Effect.map(Effect.service(Path.Path), (path) =>
1920 path.join(homedir(), ".t3"),
@@ -221,10 +222,28 @@ function portPairForOffset(offset: number): { · 201 unmodified lines
221222 };
222223 }
223224
225+export function checkPortAvailabilityOnHosts<R>(
226+ port: number,
227+ hosts: ReadonlyArray<string>,
228+ canListenOnHost: (port: number, host: string) => Effect.Effect<boolean, never, R>,
229+): Effect.Effect<boolean, never, R> {
230+ return Effect.gen(function* () {
231+ for (const host of hosts) {
232+ if (!(yield* canListenOnHost(port, host))) {
233+ return false;
234+ }
235+ }
236+
237+ return true;
238+ });
239+}
240+
224241 const defaultCheckPortAvailability: PortAvailabilityCheck<NetService> = (port) =>
225242 Effect.gen(function* () {
226243 const net = yield* NetService;
227− return yield* net.isPortAvailableOnLoopback(port);
244+ return yield* checkPortAvailabilityOnHosts(port, DEV_PORT_PROBE_HOSTS, (candidatePort, host) =>
245+ net.canListenOnHost(candidatePort, host),
246+ );
228247 });
229248
230249 interface FindFirstAvailableOffsetInput<R = NetService> {