| 1 | import { |
| 2 | ArchiveAssetCreateUrlInput, |
| 3 | ArchiveError, |
| 4 | AssetCreateUrlResult, |
| 5 | type AssetResource, |
| 6 | type EnvironmentId, |
| 7 | } from "@t3tools/contracts"; |
| 8 | import * as Effect from "effect/Effect"; |
| 9 | import * as Schema from "effect/Schema"; |
| 10 | import * as SubscriptionRef from "effect/SubscriptionRef"; |
| 11 | import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http"; |
| 12 | import * as HubConnection from "../connection/hub.ts"; |
| 13 | import { environmentEndpointUrl } from "../environment/endpoint.ts"; |
| 14 | |
| 15 | const encodeInput = Schema.encodeEffect(Schema.toCodecJson(ArchiveAssetCreateUrlInput)); |
| 16 | export 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 | ); |