diff --git a/apps/server/src/environment/DirectEndpoints.test.ts b/apps/server/src/environment/DirectEndpoints.test.ts index def0434140c3..2b022cd069d2 100644 --- a/apps/server/src/environment/DirectEndpoints.test.ts +++ b/apps/server/src/environment/DirectEndpoints.test.ts @@ -9,6 +9,7 @@ import * as Layer from "effect/Layer"; import * as Sink from "effect/Sink"; import * as Stream from "effect/Stream"; import * as HttpClient from "effect/http/HttpClient"; +import type * as HttpClientRequest from "effect/http/HttpClientRequest"; import * as HttpClientResponse from "effect/http/HttpClientResponse"; import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner"; import { describe, expect, it } from "vite-plus/test"; @@ -250,12 +251,24 @@ const layerTailscaleUp = Layer.succeed( ), ); +const T3_DESCRIPTOR_BODY = JSON.stringify({ + environmentId: "serve-test", + label: "Serve test", + platform: { os: "darwin", arch: "arm64" }, + serverVersion: "0.0.0-test", + capabilities: { repositoryIdentity: true }, +}); + +const serveProbeResponse = (request: HttpClientRequest.HttpClientRequest, status: number) => + HttpClientResponse.fromWeb( + request, + new Response(status === 200 ? T3_DESCRIPTOR_BODY : null, { status }), + ); + const layerServeProbe = (status: number) => Layer.succeed( HttpClient.HttpClient, - HttpClient.make((request) => - Effect.succeed(HttpClientResponse.fromWeb(request, new Response(null, { status }))), - ), + HttpClient.make((request) => Effect.succeed(serveProbeResponse(request, status))), ); const layerServeConfig = (host = "127.0.0.1") => @@ -320,9 +333,7 @@ describe("DirectEndpoints Tailscale Serve", () => { ) : Effect.void, ), - Effect.map((status) => - HttpClientResponse.fromWeb(request, new Response(null, { status })), - ), + Effect.map((status) => serveProbeResponse(request, status)), ), ), ), diff --git a/packages/tailscale/package.json b/packages/tailscale/package.json index 859aaaf70eed..63052f5ab7fb 100644 --- a/packages/tailscale/package.json +++ b/packages/tailscale/package.json @@ -13,6 +13,7 @@ "test": "vp test run --config ../../vite.config.ts --dir ." }, "dependencies": { + "@t3tools/contracts": "workspace:*", "@t3tools/shared": "workspace:*", "effect": "catalog:" }, diff --git a/packages/tailscale/src/tailscale.test.ts b/packages/tailscale/src/tailscale.test.ts index 2e4b7834506c..a1203fabb6d6 100644 --- a/packages/tailscale/src/tailscale.test.ts +++ b/packages/tailscale/src/tailscale.test.ts @@ -7,6 +7,7 @@ import * as Fiber from "effect/Fiber"; import * as Layer from "effect/Layer"; import * as Sink from "effect/Sink"; import * as Stream from "effect/Stream"; +import { HttpClient, HttpClientResponse } from "effect/http"; import * as TestClock from "effect/testing/TestClock"; import { ChildProcessSpawner } from "effect/process"; import * as HostProcess from "@t3tools/shared/HostProcess"; @@ -17,6 +18,7 @@ import { parseTailscaleServeRoutesTo, parseTailscaleSshEnabled, parseTailscaleStatus, + probeTailscaleHttpsEndpoint, readTailscaleSshEnabled, readTailscaleStatus, TailscaleCommandExitError, @@ -99,6 +101,27 @@ function layerMockSpawner( } describe("tailscale", () => { + it.effect("does not treat a non-T3 response on the HTTPS probe path as reachable", () => + Effect.gen(function* () { + for (const [body, status] of [ + ["