1import type { RelayEnvironmentStatusResponse } from "@t3tools/contracts/relay";
2import {
3 orchestrationProtocolCompatibilityError,
4 type EnvironmentConnectionPhase,
5} from "@t3tools/client-runtime/connection";
6import { relayOfflineReasonMessage } from "@t3tools/client-runtime/relay";
7
8export interface AvailableCloudEnvironmentPresentation {
9 readonly connectionError: string | null;
10 readonly connectionErrorTraceId: string | null;
11 readonly connectionState: EnvironmentConnectionPhase;
12 readonly statusText: string;
13}
14
15export function availableCloudEnvironmentPresentation(input: {
16 readonly isStatusPending: boolean;
17 readonly status: RelayEnvironmentStatusResponse | null;
18 readonly statusError: string | null;
19 readonly statusErrorTraceId: string | null;
20}): AvailableCloudEnvironmentPresentation {
21 const compatibilityError =
22 input.status?.descriptor === undefined
23 ? null
24 : orchestrationProtocolCompatibilityError(input.status.descriptor);
25 if (compatibilityError !== null) {
26 return {
27 connectionError: compatibilityError.message,
28 connectionErrorTraceId: null,
29 connectionState: "unsupported",
30 statusText: compatibilityError.message,
31 };
32 }
33 if (input.status?.status === "online") {
34 return {
35 connectionError: null,
36 connectionErrorTraceId: null,
37 connectionState: "available",
38 statusText: "Available · Relay online",
39 };
40 }
41
42 if (input.status?.status === "offline") {
43 const connectionError =
44 relayOfflineReasonMessage(input.status) ?? input.status.error ?? "Relay is offline.";
45 return {
46 connectionError,
47 connectionErrorTraceId: input.status.traceId ?? null,
48 connectionState: "error",
49 statusText: connectionError,
50 };
51 }
52
53 if (input.statusError) {
54 return {
55 connectionError: input.statusError,
56 connectionErrorTraceId: input.statusErrorTraceId,
57 connectionState: "error",
58 statusText: input.statusError,
59 };
60 }
61
62 return {
63 connectionError: null,
64 connectionErrorTraceId: null,
65 connectionState: "available",
66 statusText: input.isStatusPending
67 ? "Available · Checking relay status..."
68 : "Available · Relay status unknown",
69 };
70}