1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import { Worker, WorkerEnvironment } from "../Workers/Worker.ts";
4import type { Dataset as AnalyticsEngineDatasetLike } from "./Dataset.ts";
5import {
6 DatasetError,
7 type DatasetClient,
8 type RuntimeAnalyticsEngineDataset,
9 WriteDataset,
10} from "./WriteDataset.ts";
11
12export const WriteDatasetBinding = Layer.effect(
13 WriteDataset,
14 Effect.gen(function* () {
15 const env = yield* WorkerEnvironment;
16 const host = yield* Worker;
17
18 return Effect.fn(function* (dataset: AnalyticsEngineDatasetLike) {
19 if (!globalThis.__ALCHEMY_RUNTIME__) {
20 yield* host.bind(dataset.name, {
21 bindings: [
22 {
23 type: "analytics_engine",
24 name: dataset.name,
25 dataset: dataset.dataset,
26 },
27 ],
28 });
29 }
30
31 const raw = Effect.sync(
32 () =>
33 (env as Record<string, RuntimeAnalyticsEngineDataset>)[dataset.name]!,
34 );
35
36 return {
37 raw,
38 writeDataPoint: (dataPoint) =>
39 raw.pipe(
40 Effect.flatMap((raw) =>
41 Effect.try({
42 try: () => raw.writeDataPoint(dataPoint),
43 catch: (error: any) =>
44 new DatasetError({
45 message: error?.message ?? "Unknown error",
46 cause: error,
47 }),
48 }),
49 ),
50 ),
51 } satisfies DatasetClient;
52 });
53 }),
54);