import { EnvironmentId } from "@t3tools/contracts";import { RelayEnvironmentStatusScope } from "@t3tools/contracts/relay";import { describe, expect, it } from "@effect/vitest";import * as Duration from "effect/Duration";import * as Effect from "effect/Effect";import * as Fiber from "effect/Fiber";import * as Layer from "effect/Layer";import * as TestClock from "effect/testing/TestClock"; import { MANAGED_RELAY_REQUEST_TIMEOUT_MS, ManagedRelayClient, ManagedRelayDpopSigner, managedRelayClientLayer, type ManagedRelayDpopProofInput,} from "./managedRelay.ts";import { remoteHttpClientLayer } from "./remote.ts"; function managedRelayTestLayer( fetchFn: typeof globalThis.fetch, relayUrl = "https://relay.example.test",) { const httpClientLayer = remoteHttpClientLayer(fetchFn); const signerLayer = Layer.succeed( ManagedRelayDpopSigner, ManagedRelayDpopSigner.of({ thumbprint: Effect.succeed("client-thumbprint"), createProof: (input: ManagedRelayDpopProofInput) => Effect.succeed(`proof:${input.url}`), }), ); return managedRelayClientLayer({ relayUrl, clientId: "t3-mobile", }).pipe(Layer.provide(signerLayer), Layer.provide(httpClientLayer));} describe("ManagedRelayClient", () => { it.effect("rejects unsafe relay URLs before sending credentials", () => { let requestCount = 0; const fetchFn = (() => { requestCount += 1; return Promise.resolve(Response.json({})); }) satisfies typeof globalThis.fetch; return Effect.gen(function* () { const relayClient = yield* ManagedRelayClient; const error = yield* relayClient .listEnvironments({ clerkToken: "clerk-token" }) .pipe(Effect.flip); expect(error).toMatchObject({ _tag: "ManagedRelayClientError", message: "Relay URL must be a secure absolute HTTPS origin.", }); expect(requestCount).toBe(0); }).pipe(Effect.provide(managedRelayTestLayer(fetchFn, "http://relay.example.test"))); }); it.effect("reuses usable DPoP tokens and refreshes cleared or expiring cache entries", () => { let tokenExchangeCount = 0; const fetchFn = ((input) => { const url = String(input); if (url.endsWith("/v1/client/dpop-token")) { tokenExchangeCount += 1; return Promise.resolve( Response.json({ access_token: `relay-token-${tokenExchangeCount}`, issued_token_type: "urn:ietf:params:oauth:token-type:access_token", token_type: "DPoP", expires_in: 10, scope: RelayEnvironmentStatusScope, }), ); } return Promise.resolve( Response.json({ environmentId: "env-1", endpoint: { httpBaseUrl: "https://desktop.example.test/", wsBaseUrl: "wss://desktop.example.test/ws", providerKind: "cloudflare_tunnel", }, status: "online", checkedAt: "2026-05-25T00:01:00.000Z", descriptor: { environmentId: "env-1", label: "Desktop", platform: { os: "darwin", arch: "arm64" }, serverVersion: "0.0.0-test", capabilities: { repositoryIdentity: true }, }, }), ); }) satisfies typeof globalThis.fetch; return Effect.gen(function* () { const relayClient = yield* ManagedRelayClient; const statusInput = { clerkToken: "clerk-token", scopes: [RelayEnvironmentStatusScope], environmentId: EnvironmentId.make("env-1"), } as const; yield* relayClient.getEnvironmentStatus(statusInput); yield* relayClient.getEnvironmentStatus(statusInput); expect(tokenExchangeCount).toBe(1); yield* TestClock.adjust(Duration.seconds(6)); yield* relayClient.getEnvironmentStatus(statusInput); expect(tokenExchangeCount).toBe(2); yield* relayClient.resetTokenCache; yield* relayClient.getEnvironmentStatus(statusInput); expect(tokenExchangeCount).toBe(3); }).pipe(Effect.provide(managedRelayTestLayer(fetchFn))); }); it.effect("times out stalled relay environment listing requests", () => { const fetchFn = (() => new Promise<Response>(() => undefined)) satisfies typeof globalThis.fetch; return Effect.gen(function* () { const relayClient = yield* ManagedRelayClient; const errorFiber = yield* relayClient .listEnvironments({ clerkToken: "clerk-token" }) .pipe(Effect.flip, Effect.forkScoped); yield* Effect.yieldNow; yield* TestClock.adjust(Duration.millis(MANAGED_RELAY_REQUEST_TIMEOUT_MS)); const error = yield* Fiber.join(errorFiber); expect(error).toMatchObject({ _tag: "ManagedRelayClientError", message: "Relay environment listing timed out.", }); }).pipe(Effect.provide(Layer.merge(TestClock.layer(), managedRelayTestLayer(fetchFn)))); }); it.effect("lists account devices through the Clerk bearer client endpoint", () => { const fetchFn = ((input, init) => { expect(String(input)).toBe("https://relay.example.test/v1/client/devices"); expect(init?.headers).toMatchObject({ authorization: "Bearer clerk-token", }); return Promise.resolve( Response.json({ devices: [ { deviceId: "device-1", label: "Julius's iPhone", platform: "ios", iosMajorVersion: 18, appVersion: "1.0.0", notifications: { enabled: false, notifyOnApproval: true, notifyOnInput: true, notifyOnCompletion: true, notifyOnFailure: true, }, liveActivities: { enabled: true, }, updatedAt: "2026-06-01T00:00:00.000Z", }, ], }), ); }) satisfies typeof globalThis.fetch; return Effect.gen(function* () { const relayClient = yield* ManagedRelayClient; const devices = yield* relayClient.listDevices({ clerkToken: "clerk-token" }); expect(devices).toMatchObject([ { deviceId: "device-1", label: "Julius's iPhone", notifications: { enabled: false, }, }, ]); }).pipe(Effect.provide(managedRelayTestLayer(fetchFn))); });});
import { EnvironmentId } from "@t3tools/contracts";
import { RelayEnvironmentStatusScope } from "@t3tools/contracts/relay";
import { describe, expect, it } from "@effect/vitest";
import * as Duration from "effect/Duration";
import * as Effect from "effect/Effect";
import * as Fiber from "effect/Fiber";
import * as Layer from "effect/Layer";
import * as TestClock from "effect/testing/TestClock";
import {
MANAGED_RELAY_REQUEST_TIMEOUT_MS,
ManagedRelayClient,
ManagedRelayDpopSigner,
managedRelayClientLayer,
type ManagedRelayDpopProofInput,
} from "./managedRelay.ts";
import { remoteHttpClientLayer } from "./remote.ts";
function managedRelayTestLayer(
fetchFn: typeof globalThis.fetch,
relayUrl = "https://relay.example.test",
) {
const httpClientLayer = remoteHttpClientLayer(fetchFn);
const signerLayer = Layer.succeed(
ManagedRelayDpopSigner,
ManagedRelayDpopSigner.of({
thumbprint: Effect.succeed("client-thumbprint"),
createProof: (input: ManagedRelayDpopProofInput) => Effect.succeed(`proof:${input.url}`),
}),
);
return managedRelayClientLayer({
relayUrl,
clientId: "t3-mobile",
}).pipe(Layer.provide(signerLayer), Layer.provide(httpClientLayer));
}
describe("ManagedRelayClient", () => {
it.effect("rejects unsafe relay URLs before sending credentials", () => {
let requestCount = 0;
const fetchFn = (() => {
requestCount += 1;
return Promise.resolve(Response.json({}));
}) satisfies typeof globalThis.fetch;
return Effect.gen(function* () {
const relayClient = yield* ManagedRelayClient;
const error = yield* relayClient
.listEnvironments({ clerkToken: "clerk-token" })
.pipe(Effect.flip);
expect(error).toMatchObject({
_tag: "ManagedRelayClientError",
message: "Relay URL must be a secure absolute HTTPS origin.",
});
expect(requestCount).toBe(0);
}).pipe(Effect.provide(managedRelayTestLayer(fetchFn, "http://relay.example.test")));
});
it.effect("reuses usable DPoP tokens and refreshes cleared or expiring cache entries", () => {
let tokenExchangeCount = 0;
const fetchFn = ((input) => {
const url = String(input);
if (url.endsWith("/v1/client/dpop-token")) {
tokenExchangeCount += 1;
return Promise.resolve(
Response.json({
access_token: `relay-token-${tokenExchangeCount}`,
issued_token_type: "urn:ietf:params:oauth:token-type:access_token",
token_type: "DPoP",
expires_in: 10,
scope: RelayEnvironmentStatusScope,
}),
);
}
return Promise.resolve(
Response.json({
environmentId: "env-1",
endpoint: {
httpBaseUrl: "https://desktop.example.test/",
wsBaseUrl: "wss://desktop.example.test/ws",
providerKind: "cloudflare_tunnel",
},
status: "online",
checkedAt: "2026-05-25T00:01:00.000Z",
descriptor: {
environmentId: "env-1",
label: "Desktop",
platform: { os: "darwin", arch: "arm64" },
serverVersion: "0.0.0-test",
capabilities: { repositoryIdentity: true },
},
}),
);
}) satisfies typeof globalThis.fetch;
return Effect.gen(function* () {
const relayClient = yield* ManagedRelayClient;
const statusInput = {
clerkToken: "clerk-token",
scopes: [RelayEnvironmentStatusScope],
environmentId: EnvironmentId.make("env-1"),
} as const;
yield* relayClient.getEnvironmentStatus(statusInput);
yield* relayClient.getEnvironmentStatus(statusInput);
expect(tokenExchangeCount).toBe(1);
yield* TestClock.adjust(Duration.seconds(6));
yield* relayClient.getEnvironmentStatus(statusInput);
expect(tokenExchangeCount).toBe(2);
yield* relayClient.resetTokenCache;
yield* relayClient.getEnvironmentStatus(statusInput);
expect(tokenExchangeCount).toBe(3);
}).pipe(Effect.provide(managedRelayTestLayer(fetchFn)));
});
it.effect("times out stalled relay environment listing requests", () => {
const fetchFn = (() =>
new Promise<Response>(() => undefined)) satisfies typeof globalThis.fetch;
return Effect.gen(function* () {
const relayClient = yield* ManagedRelayClient;
const errorFiber = yield* relayClient
.listEnvironments({ clerkToken: "clerk-token" })
.pipe(Effect.flip, Effect.forkScoped);
yield* Effect.yieldNow;
yield* TestClock.adjust(Duration.millis(MANAGED_RELAY_REQUEST_TIMEOUT_MS));
const error = yield* Fiber.join(errorFiber);
expect(error).toMatchObject({
_tag: "ManagedRelayClientError",
message: "Relay environment listing timed out.",
});
}).pipe(Effect.provide(Layer.merge(TestClock.layer(), managedRelayTestLayer(fetchFn))));
});
it.effect("lists account devices through the Clerk bearer client endpoint", () => {
const fetchFn = ((input, init) => {
expect(String(input)).toBe("https://relay.example.test/v1/client/devices");
expect(init?.headers).toMatchObject({
authorization: "Bearer clerk-token",
});
return Promise.resolve(
Response.json({
devices: [
{
deviceId: "device-1",
label: "Julius's iPhone",
platform: "ios",
iosMajorVersion: 18,
appVersion: "1.0.0",
notifications: {
enabled: false,
notifyOnApproval: true,
notifyOnInput: true,
notifyOnCompletion: true,
notifyOnFailure: true,
},
liveActivities: {
enabled: true,
},
updatedAt: "2026-06-01T00:00:00.000Z",
},
],
}),
);
}) satisfies typeof globalThis.fetch;
return Effect.gen(function* () {
const relayClient = yield* ManagedRelayClient;
const devices = yield* relayClient.listDevices({ clerkToken: "clerk-token" });
expect(devices).toMatchObject([
{
deviceId: "device-1",
label: "Julius's iPhone",
notifications: {
enabled: false,
},
},
]);
}).pipe(Effect.provide(managedRelayTestLayer(fetchFn)));
});
});