Open History to see the last commit
1// @effect-diagnostics anyUnknownInErrorContext:off layerMergeAllWithDependencies:off - Alchemy provider helpers expose framework-owned any requirements.
2import * as Alchemy from "alchemy";
3import * as Output from "alchemy/Output";
4import * as Axiom from "@alchemy.run/axiom";
5import * as Cloudflare from "@alchemy.run/cloudflare";
6import * as Drizzle from "@alchemy.run/drizzle";
7import * as Effect from "effect/Effect";
8import * as Layer from "effect/Layer";
9import * as Planetscale from "@alchemy.run/planetscale";
10
11import { PublishClientConfig, tokenDigest } from "./src/clientConfig.ts";
12import * as RelayDb from "./src/db.ts";
13import { MobileSourceMapsUploadCredentials, RelayObservability } from "./src/observability.ts";
14import { isPreviewStage } from "./src/previewStages.ts";
15import { PreviewTunnelSweep, PreviewTunnelSweepProvider } from "./src/previewTunnelSweep.ts";
16import { ManagedEndpointZone, RelayApiZone, RelayDeploymentConfig } from "./src/zone.ts";
17import * as RelayWorker from "./src/worker.ts";
18
19export default Alchemy.Stack(
20 "T3CodeRelay",
21 {
22 providers: Layer.mergeAll(
23 Axiom.providers(),
24 Cloudflare.providers(),
25 Drizzle.providers(),
26 Planetscale.providers(),
27 PreviewTunnelSweepProvider(),
28 ),
29 state: Cloudflare.state(),
30 },
31 Effect.gen(function* () {
32 const { stage } = yield* Alchemy.Stack;
33 const db = yield* RelayDb.PlanetscaleDatabase;
34 const hyperdrive = yield* RelayDb.RelayHyperdrive;
35 const managedEndpointZone = yield* ManagedEndpointZone.pipe(Effect.orDie);
36 const relayApiZone = yield* RelayApiZone.pipe(Effect.orDie);
37 const observability = yield* RelayObservability;
38 const mobileSourceMapsUploadCredentials = yield* MobileSourceMapsUploadCredentials;
39 const api = yield* RelayWorker.Api;
40 if (isPreviewStage(stage)) {
41 const { managedEndpointZoneName } = yield* RelayDeploymentConfig;
42 yield* PreviewTunnelSweep("PreviewTunnelSweep", {
43 stage,
44 tunnelZoneName: managedEndpointZoneName,
45 workerName: api.workerName,
46 });
47 }
48 yield* PublishClientConfig({
49 url: api.url,
50 mobileTracingUrl: observability.traces.otelTracesEndpoint,
51 mobileTracingDataset: observability.traces.name,
52 mobileTracingToken: observability.mobileIngestToken.token,
53 clientTracingUrl: observability.traces.otelTracesEndpoint,
54 clientTracingDataset: observability.traces.name,
55 clientTracingToken: observability.clientIngestToken.token,
56 tokenDigest: Output.map(
57 Output.all(observability.mobileIngestToken.token, observability.clientIngestToken.token),
58 tokenDigest,
59 ),
60 });
61
62 return {
63 databaseName: db.database.name,
64 databaseBranchName: db.branch?.name ?? "main",
65 hyperdriveName: hyperdrive.name,
66 workerName: api.workerName,
67 url: api.url,
68 relayApiZoneId: relayApiZone.zoneId,
69 managedEndpointZoneId: managedEndpointZone.zoneId,
70 mobileTracingUrl: observability.traces.otelTracesEndpoint,
71 mobileTracingDataset: observability.traces.name,
72 mobileTracingToken: observability.mobileIngestToken.token,
73 clientTracingUrl: observability.traces.otelTracesEndpoint,
74 clientTracingDataset: observability.traces.name,
75 clientTracingToken: observability.clientIngestToken.token,
76 mobileLogsDataset: observability.mobileLogs.name,
77 mobileMetricsDataset: observability.mobileMetrics.name,
78 mobileSourceMapsBucket: observability.mobileSourceMaps.bucketName,
79 // The MOBILE_SOURCEMAPS_R2 secret for GitHub Actions and EAS Build.
80 mobileSourceMapsUploadCredentials,
81 };
82 }).pipe(Effect.provide(RelayWorker.layer)),
83);