1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import { ReadWriteBucket } from "./ReadWriteBucket.ts";
4import { makeReadBucketClient } from "./ReadBucketHttp.ts";
5import { makeWriteBucketClient } from "./WriteBucketHttp.ts";
6import { makeStorageBinding, storageHttpLayer } from "./StorageBinding.ts";
7
8/**
9 * One injected or managed credential for both interfaces.
10 *
11 * @layer
12 * @product Bucket
13 * @provides ReadWriteBucket
14 */
15export const ReadWriteBucketHttp = Layer.effect(
16 ReadWriteBucket,
17 makeStorageBinding("storage:write").pipe(
18 Effect.map((bind) =>
19 Effect.fn(function* (...args: Parameters<typeof bind>) {
20 const client = yield* bind(...args);
21 return {
22 ...makeReadBucketClient(client),
23 ...makeWriteBucketClient(client),
24 };
25 }),
26 ),
27 ),
28).pipe(Layer.provide(storageHttpLayer));