1import * as Layer from "effect/Layer";
2import * as Tracer from "effect/Tracer";
3
4let delegate: Tracer.Tracer | null = null;
5
6/**
7 * Points the installed tracer at the exporter `configureClientTracing` just built,
8 * or at nothing while no exporter is configured.
9 */
10export function setDelegate(next: Tracer.Tracer | null): void {
11 delegate = next;
12}
13
14export function hasDelegate(): boolean {
15 return delegate !== null;
16}
17
18/**
19 * Installed once when the client runtime is built, before any exporter exists, so
20 * client spans keep flowing to whatever exporter is configured later on.
21 */
22export const layer = Layer.succeed(
23 Tracer.Tracer,
24 Tracer.make({
25 span(options) {
26 return delegate?.span(options) ?? new Tracer.NativeSpan(options);
27 },
28 }),
29);