1import {
2 ArchiveAssetCreateUrlInput,
3 ArchiveError,
4 AssetCreateUrlResult,
5 type AssetResource,
6 type EnvironmentId,
7} from "@t3tools/contracts";
8import * as Effect from "effect/Effect";
9import * as Schema from "effect/Schema";
10import * as SubscriptionRef from "effect/SubscriptionRef";
11import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http";
12import * as HubConnection from "../connection/hub.ts";
13import { environmentEndpointUrl } from "../environment/endpoint.ts";
14
15const encodeInput = Schema.encodeEffect(Schema.toCodecJson(ArchiveAssetCreateUrlInput));
16export const fetchArchivedAssetUrl = Effect.fn("clientRuntime.state.fetchArchivedAssetUrl")(
17 function* (environmentId: EnvironmentId, resource: AssetResource) {
18 const hub = yield* HubConnection.HubConnection;
19 const connection = (yield* SubscriptionRef.get(hub.state)).connection;
20 if (!connection) return yield* new ArchiveError({ reason: "unavailable" });
21 const http = yield* HttpClient.HttpClient;
22 const result = yield* HttpClientRequest.post(
23 `${connection.httpBaseUrl}/api/archive/assets`,
24 ).pipe(
25 HttpClientRequest.setHeaders(yield* hub.headers),
26 HttpClientRequest.bodyJson(yield* encodeInput({ environmentId, resource })),
27 Effect.flatMap(http.execute),
28 Effect.provideService(FetchHttpClient.RequestInit, {
29 credentials: "include",
30 redirect: "error",
31 }),
32 Effect.flatMap(HttpClientResponse.filterStatusOk),
33 Effect.flatMap(HttpClientResponse.schemaBodyJson(AssetCreateUrlResult)),
34 Effect.timeout("10 seconds"),
35 );
36 return {
37 ...result,
38 relativeUrl: environmentEndpointUrl(connection.httpBaseUrl, result.relativeUrl),
39 };
40 },
41);