1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import { WriteBucket, type WriteBucketClient } from "./WriteBucket.ts";
4import { makeStorageBinding, storageHttpLayer } from "./StorageBinding.ts";
5
6export const makeWriteBucketClient = (
7 client: Effect.Success<
8 ReturnType<Effect.Success<ReturnType<typeof makeStorageBinding>>>
9 >,
10): WriteBucketClient => ({
11 put: client.put,
12 delete: client.delete,
13 deleteMany: client.deleteMany,
14 createMultipartUpload: client.createMultipartUpload,
15 uploadPart: client.uploadPart,
16 completeMultipartUpload: client.completeMultipartUpload,
17 abortMultipartUpload: client.abortMultipartUpload,
18 listMultipartUploads: client.listMultipartUploads,
19 listParts: client.listParts,
20 presignPut: (key, options) => client.presign(key, "PUT", options),
21});
22
23/**
24 * Use injected same-branch credentials, otherwise manage explicit read/write scopes.
25 *
26 * @layer
27 * @product Bucket
28 * @provides WriteBucket
29 */
30export const WriteBucketHttp = Layer.effect(
31 WriteBucket,
32 makeStorageBinding("storage:write").pipe(
33 Effect.map((bind) =>
34 Effect.fn(function* (...args: Parameters<typeof bind>) {
35 return makeWriteBucketClient(yield* bind(...args));
36 }),
37 ),
38 ),
39).pipe(Layer.provide(storageHttpLayer));