import { type Context } from '@opentelemetry/api' import { type ReadableSpan, type SpanProcessor, type Span, } from '@opentelemetry/sdk-trace-base' import { MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX } from '@multiplayer-app/session-recorder-common' import type { CrashBuffer } from '@multiplayer-app/session-recorder-common' /** * Implementation of the {@link SpanProcessor} that batches spans exported by * the SDK then pushes them to the exporter pipeline. */ export class CrashBufferSpanProcessor implements SpanProcessor { constructor( private readonly _crashBuffer: CrashBuffer | undefined, private readonly _serializeSpan: (span: ReadableSpan) => any, ) {} forceFlush(): Promise { return Promise.resolve() } onStart(_span: Span, _parentContext: Context): void { return } onEnd(span: ReadableSpan): void { const _spanContext = span.spanContext() const traceId = _spanContext.traceId // // Never buffer/export unsampled spans. // if ((_spanContext.traceFlags & TraceFlags.SAMPLED) === 0) { // return // } if (traceId.startsWith(MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX)) { if (this._crashBuffer) { this._crashBuffer.appendSpans([ { ts: span.startTime[0] * 1000 + span.startTime[1] / 1000000, span: this._serializeSpan(span), }, ]) } return } } shutdown(): Promise { return Promise.resolve() } }