1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import {
4 makeKVNamespaceBinding,
5 type makeKVNamespaceHelpers,
6} from "./NamespaceBinding.ts";
7import { makeReadKVClient } from "./ReadNamespaceBinding.ts";
8import {
9 ReadWriteNamespace,
10 type ReadWriteNamespaceClient,
11} from "./ReadWriteNamespace.ts";
12import { makeWriteKVClient } from "./WriteNamespaceBinding.ts";
13
14/**
15 * Implementation of the {@link ReadWriteNamespace} binding that uses a
16 * Worker binding.
17 */
18export const ReadWriteNamespaceBinding = Layer.effect(
19 ReadWriteNamespace,
20 Effect.suspend(() =>
21 makeKVNamespaceBinding({ makeClient: makeReadWriteKVClient }),
22 ),
23);
24
25/** Build the read-write binding client from its read and write halves. */
26export const makeReadWriteKVClient = (
27 helpers: ReturnType<typeof makeKVNamespaceHelpers>,
28): ReadWriteNamespaceClient =>
29 ({
30 ...makeReadKVClient(helpers),
31 ...makeWriteKVClient(helpers),
32 }) as ReadWriteNamespaceClient;