1import type { TraceRecord, TraceSink } from "@t3tools/shared/observability";
2import * as Context from "effect/Context";
3import * as Effect from "effect/Effect";
4import * as Layer from "effect/Layer";
5
6export class BrowserTraceCollector extends Context.Service<
7 BrowserTraceCollector,
8 {
9 readonly record: (records: ReadonlyArray<TraceRecord>) => Effect.Effect<void>;
10 }
11>()("t3/observability/BrowserTraceCollector") {}
12
13/** @public Service construction is part of the canonical Effect module API. */
14export const make = (sink: TraceSink): BrowserTraceCollector["Service"] =>
15 BrowserTraceCollector.of({
16 record: (records) =>
17 Effect.sync(() => {
18 for (const record of records) {
19 sink.push(record);
20 }
21 }),
22 });
23
24export const layer = (sink: TraceSink) => Layer.succeed(BrowserTraceCollector, make(sink));