@multiplayer-app/session-recorder-common 1.0.1-alpha.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js +1 -1
  2. package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
  3. package/dist/esm/exporters/SessionRecorderHttpLogsExporter.js +1 -1
  4. package/dist/esm/exporters/SessionRecorderHttpLogsExporter.js.map +1 -1
  5. package/dist/esm/exporters/SessionRecorderHttpTraceExporter.d.ts.map +1 -1
  6. package/dist/esm/exporters/SessionRecorderHttpTraceExporter.js +2 -4
  7. package/dist/esm/exporters/SessionRecorderHttpTraceExporter.js.map +1 -1
  8. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  9. package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js +1 -1
  10. package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
  11. package/dist/esnext/exporters/SessionRecorderHttpLogsExporter.js +1 -1
  12. package/dist/esnext/exporters/SessionRecorderHttpLogsExporter.js.map +1 -1
  13. package/dist/esnext/exporters/SessionRecorderHttpTraceExporter.d.ts.map +1 -1
  14. package/dist/esnext/exporters/SessionRecorderHttpTraceExporter.js +2 -4
  15. package/dist/esnext/exporters/SessionRecorderHttpTraceExporter.js.map +1 -1
  16. package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -1
  17. package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js +1 -1
  18. package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
  19. package/dist/src/exporters/SessionRecorderHttpLogsExporter.js +1 -1
  20. package/dist/src/exporters/SessionRecorderHttpLogsExporter.js.map +1 -1
  21. package/dist/src/exporters/SessionRecorderHttpTraceExporter.d.ts.map +1 -1
  22. package/dist/src/exporters/SessionRecorderHttpTraceExporter.js +2 -4
  23. package/dist/src/exporters/SessionRecorderHttpTraceExporter.js.map +1 -1
  24. package/package.json +1 -1
  25. package/src/exporters/SessionRecorderBrowserTraceExporter.ts +2 -2
  26. package/src/exporters/SessionRecorderHttpLogsExporter.ts +1 -1
  27. package/src/exporters/SessionRecorderHttpTraceExporter.ts +6 -5
@@ -104,7 +104,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
104
104
  SessionRecorderBrowserTraceExporter.prototype._createExporter = function () {
105
105
  return new OTLPTraceExporter({
106
106
  url: this.config.url,
107
- headers: __assign({ 'Content-Type': 'application/x-protobuf', 'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0', 'authorization': this.config.apiKey }, (this.config.headers || {})),
107
+ headers: __assign({ 'Content-Type': 'application/json', 'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0', 'Authorization': this.config.apiKey }, (this.config.headers || {})),
108
108
  timeoutMillis: this.config.timeoutMillis,
109
109
  keepAlive: this.config.keepAlive,
110
110
  concurrencyLimit: this.config.concurrencyLimit,
@@ -1 +1 @@
1
- {"version":3,"file":"SessionRecorderBrowserTraceExporter.js","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderBrowserTraceExporter.ts"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAC3E,OAAO,EACL,iDAAiD,EACjD,8BAA8B,EAC9B,yCAAyC,GAC1C,MAAM,6BAA6B,CAAA;AAuBpC;;;;GAIG;AACH;IAOE,6CAAY,MAAiD;QALrD,mBAAc,GAAY,KAAK,CAAA;QAOnC,IAAA,KAQE,MAAM,IAR+C,EAAvD,GAAG,mBAAG,iDAAiD,KAAA,EACvD,MAAM,GAOJ,MAAM,OAPF,EACN,KAME,MAAM,QANI,EAAZ,OAAO,mBAAG,EAAE,KAAA,EACZ,KAKE,MAAM,cALa,EAArB,aAAa,mBAAG,KAAK,KAAA,EACrB,KAIE,MAAM,UAJQ,EAAhB,SAAS,mBAAG,IAAI,KAAA,EAChB,KAGE,MAAM,iBAHa,EAArB,gBAAgB,mBAAG,EAAE,KAAA,EACrB,KAEE,MAAM,gBAF4C,EAApD,eAAe,mBAAG,kCAAkC,KAAA,EACpD,KACE,MAAM,wBADqB,EAA7B,uBAAuB,mBAAG,GAAG,KAAA,CACrB;QAEV,IAAI,CAAC,MAAM,yBACN,MAAM,KACT,GAAG,KAAA,EACH,MAAM,QAAA,EACN,OAAO,SAAA,EACP,aAAa,eAAA,EACb,SAAS,WAAA,EACT,gBAAgB,kBAAA,GACjB,CAAA;QACD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;QACtC,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAA;QAEtD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;IACxC,CAAC;IAED,oDAAM,GAAN,UACE,KAAqB,EACrB,cAAkD;QAFpD,iBAgCC;QA5BC,qEAAqE;QACrE,IAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,UAAA,IAAI;YACrC,IAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAA;YAC1C,OAAO,OAAO,CAAC,UAAU,CAAC,8BAA8B,CAAC;gBACvD,OAAO,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;QAEF,2CAA2C;QAC3C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YAC3B,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAA;YACxD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,UAAC,MAAM;YACzC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACtB,cAAc,CAAC,MAAM,CAAC,CAAA;YACxB,CAAC;iBAAM,IAAI,KAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;gBAC9C,KAAI,CAAC,cAAc,GAAG,IAAI,CAAA;gBAC1B,KAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAA;YAC1D,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,MAAM,CAAC,CAAA;YACxB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,sDAAQ,GAAR;QACE,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAA;IACjC,CAAC;IAEO,kEAAoB,GAA5B,UAA6B,KAAqB,EAAE,cAAkD;QAAtG,iBAmBC;QAlBC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YAC3B,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,CAChB;gBACE,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,IAAI,CAAC,eAAe;gBAC1B,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,UAAA,IAAI,IAAI,OAAA,KAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAzB,CAAyB,CAAC;aACtD,EACD,IAAI,CAAC,uBAAuB,CAC7B,CAAA;YACD,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;IAEO,4DAAc,GAAtB,UAAuB,IAAkB;;QACvC,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QACtC,OAAO;YACL,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,MAAA,IAAI,CAAC,iBAAiB,0CAAE,MAAM;YAC5C,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,QAAQ,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;gBACpC,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAAC,sBAAsB;aAC7D;SACF,CAAA;IACH,CAAC;IAEO,6DAAe,GAAvB;QACE,OAAO,IAAI,iBAAiB,CAAC;YAC3B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;YACpB,OAAO,aACL,cAAc,EAAE,wBAAwB,EACxC,YAAY,EAAE,gDAAgD,EAC9D,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,IAChC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAC/B;YACD,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;YACxC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAChC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;SAC/C,CAAC,CAAA;IACJ,CAAC;IAED,uDAAS,GAAT,UAAU,MAAc;QACtB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;QAE3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;IACxC,CAAC;IACH,0CAAC;AAAD,CAAC,AA1ID,IA0IC","sourcesContent":["import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport {\n MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,\n} from '../constants/constants.base'\n\nexport interface SessionRecorderBrowserTraceExporterConfig {\n /** URL for the OTLP endpoint. Defaults to Multiplayer's default traces endpoint. */\n url?: string\n /** API key for authentication. Required. */\n apiKey: string\n /** Additional headers to include in requests */\n headers?: Record<string, string>\n /** Request timeout in milliseconds */\n timeoutMillis?: number\n /** Whether to use keep-alive connections */\n keepAlive?: boolean\n /** Maximum number of concurrent requests */\n concurrencyLimit?: number\n /** Whether to use postMessage fallback for cross-origin requests */\n usePostMessageFallback?: boolean\n /** PostMessage type identifier */\n postMessageType?: string\n /** PostMessage target origin */\n postMessageTargetOrigin?: string\n}\n\n/**\n * Browser-specific trace exporter for Session Recorder\n * Exports traces via HTTP to Multiplayer's OTLP endpoint with browser-specific optimizations\n * Only exports spans with trace IDs starting with Multiplayer prefixes\n */\nexport class SessionRecorderBrowserTraceExporter implements SpanExporter {\n private exporter: OTLPTraceExporter\n private usePostMessage: boolean = false\n private readonly postMessageType: string\n private readonly postMessageTargetOrigin: string\n private readonly config: SessionRecorderBrowserTraceExporterConfig\n\n constructor(config: SessionRecorderBrowserTraceExporterConfig) {\n const {\n url = MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,\n apiKey,\n headers = {},\n timeoutMillis = 30000,\n keepAlive = true,\n concurrencyLimit = 20,\n postMessageType = 'MULTIPLAYER_SESSION_DEBUGGER_LIB',\n postMessageTargetOrigin = '*',\n } = config\n\n this.config = {\n ...config,\n url,\n apiKey,\n headers,\n timeoutMillis,\n keepAlive,\n concurrencyLimit,\n }\n this.postMessageType = postMessageType\n this.postMessageTargetOrigin = postMessageTargetOrigin\n\n this.exporter = this._createExporter()\n }\n\n export(\n spans: ReadableSpan[],\n resultCallback: (result: { code: number }) => void,\n ): void {\n // Filter spans to only include those with Multiplayer trace prefixes\n const filteredSpans = spans.filter(span => {\n const traceId = span.spanContext().traceId\n return traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX) ||\n traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)\n })\n\n // Only proceed if there are filtered spans\n if (filteredSpans.length === 0) {\n resultCallback({ code: 0 })\n return\n }\n\n if (this.usePostMessage) {\n this.exportViaPostMessage(filteredSpans, resultCallback)\n return\n }\n\n this.exporter.export(filteredSpans, (result) => {\n if (result.code === 0) {\n resultCallback(result)\n } else if (this.config.usePostMessageFallback) {\n this.usePostMessage = true\n this.exportViaPostMessage(filteredSpans, resultCallback)\n } else {\n resultCallback(result)\n }\n })\n }\n\n shutdown(): Promise<void> {\n return this.exporter.shutdown()\n }\n\n private exportViaPostMessage(spans: ReadableSpan[], resultCallback: (result: { code: number }) => void): void {\n if (typeof window === 'undefined') {\n resultCallback({ code: 1 })\n return\n }\n\n try {\n window.postMessage(\n {\n action: 'traces',\n type: this.postMessageType,\n payload: spans.map(span => this._serializeSpan(span)),\n },\n this.postMessageTargetOrigin,\n )\n resultCallback({ code: 0 })\n } catch (e) {\n resultCallback({ code: 1 })\n }\n }\n\n private _serializeSpan(span: ReadableSpan): any {\n const spanContext = span.spanContext()\n return {\n _spanContext: spanContext,\n name: span.name,\n kind: span.kind,\n links: span.links,\n ended: span.ended,\n events: span.events,\n status: span.status,\n endTime: span.endTime,\n startTime: span.startTime,\n duration: span.duration,\n attributes: span.attributes,\n parentSpanId: span.parentSpanContext?.spanId,\n droppedAttributesCount: span.droppedAttributesCount,\n droppedEventsCount: span.droppedEventsCount,\n droppedLinksCount: span.droppedLinksCount,\n resource: {\n attributes: span.resource.attributes,\n asyncAttributesPending: span.resource.asyncAttributesPending,\n },\n }\n }\n\n private _createExporter(): OTLPTraceExporter {\n return new OTLPTraceExporter({\n url: this.config.url,\n headers: {\n 'Content-Type': 'application/x-protobuf',\n 'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0',\n 'authorization': this.config.apiKey,\n ...(this.config.headers || {}),\n },\n timeoutMillis: this.config.timeoutMillis,\n keepAlive: this.config.keepAlive,\n concurrencyLimit: this.config.concurrencyLimit,\n })\n }\n\n setApiKey(apiKey: string): void {\n this.config.apiKey = apiKey\n\n this.exporter = this._createExporter()\n }\n}\n"]}
1
+ {"version":3,"file":"SessionRecorderBrowserTraceExporter.js","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderBrowserTraceExporter.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport {\n MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,\n} from '../constants/constants.base'\n\nexport interface SessionRecorderBrowserTraceExporterConfig {\n /** URL for the OTLP endpoint. Defaults to Multiplayer's default traces endpoint. */\n url?: string\n /** API key for authentication. Required. */\n apiKey: string\n /** Additional headers to include in requests */\n headers?: Record<string, string>\n /** Request timeout in milliseconds */\n timeoutMillis?: number\n /** Whether to use keep-alive connections */\n keepAlive?: boolean\n /** Maximum number of concurrent requests */\n concurrencyLimit?: number\n /** Whether to use postMessage fallback for cross-origin requests */\n usePostMessageFallback?: boolean\n /** PostMessage type identifier */\n postMessageType?: string\n /** PostMessage target origin */\n postMessageTargetOrigin?: string\n}\n\n/**\n * Browser-specific trace exporter for Session Recorder\n * Exports traces via HTTP to Multiplayer's OTLP endpoint with browser-specific optimizations\n * Only exports spans with trace IDs starting with Multiplayer prefixes\n */\nexport class SessionRecorderBrowserTraceExporter implements SpanExporter {\n private exporter: OTLPTraceExporter\n private usePostMessage: boolean = false\n private readonly postMessageType: string\n private readonly postMessageTargetOrigin: string\n private readonly config: SessionRecorderBrowserTraceExporterConfig\n\n constructor(config: SessionRecorderBrowserTraceExporterConfig) {\n const {\n url = MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,\n apiKey,\n headers = {},\n timeoutMillis = 30000,\n keepAlive = true,\n concurrencyLimit = 20,\n postMessageType = 'MULTIPLAYER_SESSION_DEBUGGER_LIB',\n postMessageTargetOrigin = '*',\n } = config\n\n this.config = {\n ...config,\n url,\n apiKey,\n headers,\n timeoutMillis,\n keepAlive,\n concurrencyLimit,\n }\n this.postMessageType = postMessageType\n this.postMessageTargetOrigin = postMessageTargetOrigin\n\n this.exporter = this._createExporter()\n }\n\n export(\n spans: ReadableSpan[],\n resultCallback: (result: { code: number }) => void,\n ): void {\n // Filter spans to only include those with Multiplayer trace prefixes\n const filteredSpans = spans.filter(span => {\n const traceId = span.spanContext().traceId\n return traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX) ||\n traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)\n })\n\n // Only proceed if there are filtered spans\n if (filteredSpans.length === 0) {\n resultCallback({ code: 0 })\n return\n }\n\n if (this.usePostMessage) {\n this.exportViaPostMessage(filteredSpans, resultCallback)\n return\n }\n\n this.exporter.export(filteredSpans, (result) => {\n if (result.code === 0) {\n resultCallback(result)\n } else if (this.config.usePostMessageFallback) {\n this.usePostMessage = true\n this.exportViaPostMessage(filteredSpans, resultCallback)\n } else {\n resultCallback(result)\n }\n })\n }\n\n shutdown(): Promise<void> {\n return this.exporter.shutdown()\n }\n\n private exportViaPostMessage(spans: ReadableSpan[], resultCallback: (result: { code: number }) => void): void {\n if (typeof window === 'undefined') {\n resultCallback({ code: 1 })\n return\n }\n\n try {\n window.postMessage(\n {\n action: 'traces',\n type: this.postMessageType,\n payload: spans.map(span => this._serializeSpan(span)),\n },\n this.postMessageTargetOrigin,\n )\n resultCallback({ code: 0 })\n } catch (e) {\n resultCallback({ code: 1 })\n }\n }\n\n private _serializeSpan(span: ReadableSpan): any {\n const spanContext = span.spanContext()\n return {\n _spanContext: spanContext,\n name: span.name,\n kind: span.kind,\n links: span.links,\n ended: span.ended,\n events: span.events,\n status: span.status,\n endTime: span.endTime,\n startTime: span.startTime,\n duration: span.duration,\n attributes: span.attributes,\n parentSpanId: span.parentSpanContext?.spanId,\n droppedAttributesCount: span.droppedAttributesCount,\n droppedEventsCount: span.droppedEventsCount,\n droppedLinksCount: span.droppedLinksCount,\n resource: {\n attributes: span.resource.attributes,\n asyncAttributesPending: span.resource.asyncAttributesPending,\n },\n }\n }\n\n private _createExporter(): OTLPTraceExporter {\n return new OTLPTraceExporter({\n url: this.config.url,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0',\n 'Authorization': this.config.apiKey,\n ...(this.config.headers || {}),\n },\n timeoutMillis: this.config.timeoutMillis,\n keepAlive: this.config.keepAlive,\n concurrencyLimit: this.config.concurrencyLimit,\n })\n }\n\n setApiKey(apiKey: string): void {\n this.config.apiKey = apiKey\n\n this.exporter = this._createExporter()\n }\n}\n"]}
@@ -22,7 +22,7 @@ var SessionRecorderHttpLogsExporter = /** @class */ (function (_super) {
22
22
  return _super.call(this, {
23
23
  url: url,
24
24
  headers: {
25
- 'Content-Type': 'application/x-protobuf',
25
+ 'Content-Type': 'application/json',
26
26
  'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0',
27
27
  'authorization': apiKey,
28
28
  },
@@ -1 +1 @@
1
- {"version":3,"file":"SessionRecorderHttpLogsExporter.js","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderHttpLogsExporter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AACxE,OAAO,EACL,+CAA+C,EAC/C,8BAA8B,EAC9B,yCAAyC,GAC1C,MAAM,6BAA6B,CAAA;AAepC;IAAqD,mDAAe;IAClE,yCAAY,MAA6C;QAErD,IAAA,KAKE,MAAM,IAL6C,EAArD,GAAG,mBAAG,+CAA+C,KAAA,EACrD,MAAM,GAIJ,MAAM,OAJF,EACN,KAGE,MAAM,cAHa,EAArB,aAAa,mBAAG,KAAK,KAAA,EACrB,KAEE,MAAM,UAFQ,EAAhB,SAAS,mBAAG,IAAI,KAAA,EAChB,KACE,MAAM,iBADa,EAArB,gBAAgB,mBAAG,EAAE,KAAA,CACb;QAEV,OAAA,MAAK,YAAC;YACJ,GAAG,KAAA;YACH,OAAO,EAAE;gBACP,cAAc,EAAE,wBAAwB;gBACxC,YAAY,EAAE,gDAAgD;gBAC9D,eAAe,EAAE,MAAM;aACxB;YACD,aAAa,eAAA;YACb,SAAS,WAAA;YACT,gBAAgB,kBAAA;SACjB,CAAC,SAAA;IACJ,CAAC;IAEQ,gDAAM,GAAf,UAAgB,IAAW,EAAE,cAAkD;QAC7E,IAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,UAAA,GAAG;;YAClC,IAAM,OAAO,GAAG,CAAA,MAAA,GAAG,CAAC,WAAW,0CAAE,OAAO,KAAI,GAAG,CAAC,OAAO,CAAA;YACvD,OAAO,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,8BAA8B,CAAC;gBACnE,OAAO,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;QAEF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YAC3B,OAAM;QACR,CAAC;QAED,gBAAK,CAAC,MAAM,YAAC,YAAY,EAAE,cAAc,CAAC,CAAA;IAC5C,CAAC;IACH,sCAAC;AAAD,CAAC,AArCD,CAAqD,eAAe,GAqCnE","sourcesContent":["import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'\nimport {\n MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_HTTP_URL,\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,\n} from '../constants/constants.base'\n\nexport interface SessionRecorderHttpLogsExporterConfig {\n /** The URL to send logs to. Defaults to MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_HTTP_URL */\n url?: string\n /** API key for authentication. Required. */\n apiKey: string\n /** Timeout for HTTP requests in milliseconds. Defaults to 30000 */\n timeoutMillis?: number\n /** Whether to keep the connection alive. Defaults to true */\n keepAlive?: boolean\n /** Maximum number of concurrent requests. Defaults to 20 */\n concurrencyLimit?: number\n}\n\nexport class SessionRecorderHttpLogsExporter extends OTLPLogExporter {\n constructor(config: SessionRecorderHttpLogsExporterConfig) {\n const {\n url = MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_HTTP_URL,\n apiKey,\n timeoutMillis = 30000,\n keepAlive = true,\n concurrencyLimit = 20,\n } = config\n\n super({\n url,\n headers: {\n 'Content-Type': 'application/x-protobuf',\n 'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0',\n 'authorization': apiKey,\n },\n timeoutMillis,\n keepAlive,\n concurrencyLimit,\n })\n }\n\n override export(logs: any[], resultCallback: (result: { code: number }) => void): void {\n const filteredLogs = logs.filter(log => {\n const traceId = log.spanContext?.traceId || log.traceId\n return traceId && (traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX) ||\n traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX))\n })\n\n if (filteredLogs.length === 0) {\n resultCallback({ code: 0 })\n return\n }\n\n super.export(filteredLogs, resultCallback)\n }\n}\n"]}
1
+ {"version":3,"file":"SessionRecorderHttpLogsExporter.js","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderHttpLogsExporter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AACxE,OAAO,EACL,+CAA+C,EAC/C,8BAA8B,EAC9B,yCAAyC,GAC1C,MAAM,6BAA6B,CAAA;AAepC;IAAqD,mDAAe;IAClE,yCAAY,MAA6C;QAErD,IAAA,KAKE,MAAM,IAL6C,EAArD,GAAG,mBAAG,+CAA+C,KAAA,EACrD,MAAM,GAIJ,MAAM,OAJF,EACN,KAGE,MAAM,cAHa,EAArB,aAAa,mBAAG,KAAK,KAAA,EACrB,KAEE,MAAM,UAFQ,EAAhB,SAAS,mBAAG,IAAI,KAAA,EAChB,KACE,MAAM,iBADa,EAArB,gBAAgB,mBAAG,EAAE,KAAA,CACb;QAEV,OAAA,MAAK,YAAC;YACJ,GAAG,KAAA;YACH,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,gDAAgD;gBAC9D,eAAe,EAAE,MAAM;aACxB;YACD,aAAa,eAAA;YACb,SAAS,WAAA;YACT,gBAAgB,kBAAA;SACjB,CAAC,SAAA;IACJ,CAAC;IAEQ,gDAAM,GAAf,UAAgB,IAAW,EAAE,cAAkD;QAC7E,IAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,UAAA,GAAG;;YAClC,IAAM,OAAO,GAAG,CAAA,MAAA,GAAG,CAAC,WAAW,0CAAE,OAAO,KAAI,GAAG,CAAC,OAAO,CAAA;YACvD,OAAO,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,8BAA8B,CAAC;gBACnE,OAAO,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;QAEF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YAC3B,OAAM;QACR,CAAC;QAED,gBAAK,CAAC,MAAM,YAAC,YAAY,EAAE,cAAc,CAAC,CAAA;IAC5C,CAAC;IACH,sCAAC;AAAD,CAAC,AArCD,CAAqD,eAAe,GAqCnE","sourcesContent":["import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'\nimport {\n MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_HTTP_URL,\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,\n} from '../constants/constants.base'\n\nexport interface SessionRecorderHttpLogsExporterConfig {\n /** The URL to send logs to. Defaults to MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_HTTP_URL */\n url?: string\n /** API key for authentication. Required. */\n apiKey: string\n /** Timeout for HTTP requests in milliseconds. Defaults to 30000 */\n timeoutMillis?: number\n /** Whether to keep the connection alive. Defaults to true */\n keepAlive?: boolean\n /** Maximum number of concurrent requests. Defaults to 20 */\n concurrencyLimit?: number\n}\n\nexport class SessionRecorderHttpLogsExporter extends OTLPLogExporter {\n constructor(config: SessionRecorderHttpLogsExporterConfig) {\n const {\n url = MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_HTTP_URL,\n apiKey,\n timeoutMillis = 30000,\n keepAlive = true,\n concurrencyLimit = 20,\n } = config\n\n super({\n url,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0',\n 'authorization': apiKey,\n },\n timeoutMillis,\n keepAlive,\n concurrencyLimit,\n })\n }\n\n override export(logs: any[], resultCallback: (result: { code: number }) => void): void {\n const filteredLogs = logs.filter(log => {\n const traceId = log.spanContext?.traceId || log.traceId\n return traceId && (traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX) ||\n traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX))\n })\n\n if (filteredLogs.length === 0) {\n resultCallback({ code: 0 })\n return\n }\n\n super.export(filteredLogs, resultCallback)\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SessionRecorderHttpTraceExporter.d.ts","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderHttpTraceExporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAO3E,MAAM,WAAW,sCAAsC;IACrD,+FAA+F;IAC/F,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;GAIG;AACH,qBAAa,gCAAiC,SAAQ,iBAAiB;gBACzD,MAAM,EAAE,sCAAsC;IAsBjD,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI;CAgBxF"}
1
+ {"version":3,"file":"SessionRecorderHttpTraceExporter.d.ts","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderHttpTraceExporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAO3E,MAAM,WAAW,sCAAsC;IACrD,+FAA+F;IAC/F,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;GAIG;AACH,qBAAa,gCAAiC,SAAQ,iBAAiB;gBACzD,MAAM,EAAE,sCAAsC;IAsBjD,MAAM,CACb,KAAK,EAAE,GAAG,EAAE,EACZ,cAAc,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACjD,IAAI;CAcR"}
@@ -27,9 +27,9 @@ var SessionRecorderHttpTraceExporter = /** @class */ (function (_super) {
27
27
  return _super.call(this, {
28
28
  url: url,
29
29
  headers: {
30
- 'Content-Type': 'application/x-protobuf',
30
+ 'Content-Type': 'application/json',
31
31
  'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0',
32
- 'authorization': apiKey,
32
+ 'Authorization': apiKey,
33
33
  },
34
34
  timeoutMillis: timeoutMillis,
35
35
  keepAlive: keepAlive,
@@ -37,13 +37,11 @@ var SessionRecorderHttpTraceExporter = /** @class */ (function (_super) {
37
37
  }) || this;
38
38
  }
39
39
  SessionRecorderHttpTraceExporter.prototype.export = function (spans, resultCallback) {
40
- // Filter spans to only include those with Multiplayer trace prefixes
41
40
  var filteredSpans = spans.filter(function (span) {
42
41
  var traceId = span.spanContext().traceId;
43
42
  return traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX) ||
44
43
  traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX);
45
44
  });
46
- // Only proceed if there are filtered spans
47
45
  if (filteredSpans.length === 0) {
48
46
  resultCallback({ code: 0 });
49
47
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"SessionRecorderHttpTraceExporter.js","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderHttpTraceExporter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAC3E,OAAO,EACL,iDAAiD,EACjD,8BAA8B,EAC9B,yCAAyC,GAC1C,MAAM,6BAA6B,CAAA;AAepC;;;;GAIG;AACH;IAAsD,oDAAiB;IACrE,0CAAY,MAA8C;QAEtD,IAAA,KAKE,MAAM,IAL+C,EAAvD,GAAG,mBAAG,iDAAiD,KAAA,EACvD,MAAM,GAIJ,MAAM,OAJF,EACN,KAGE,MAAM,cAHa,EAArB,aAAa,mBAAG,KAAK,KAAA,EACrB,KAEE,MAAM,UAFQ,EAAhB,SAAS,mBAAG,IAAI,KAAA,EAChB,KACE,MAAM,iBADa,EAArB,gBAAgB,mBAAG,EAAE,KAAA,CACb;QAEV,OAAA,MAAK,YAAC;YACJ,GAAG,KAAA;YACH,OAAO,EAAE;gBACP,cAAc,EAAE,wBAAwB;gBACxC,YAAY,EAAE,gDAAgD;gBAC9D,eAAe,EAAE,MAAM;aACxB;YACD,aAAa,eAAA;YACb,SAAS,WAAA;YACT,gBAAgB,kBAAA;SACjB,CAAC,SAAA;IACJ,CAAC;IAEQ,iDAAM,GAAf,UAAgB,KAAY,EAAE,cAAkD;QAC9E,qEAAqE;QACrE,IAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,UAAA,IAAI;YACrC,IAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAA;YAC1C,OAAO,OAAO,CAAC,UAAU,CAAC,8BAA8B,CAAC;gBACvD,OAAO,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;QAEF,2CAA2C;QAC3C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YAC3B,OAAM;QACR,CAAC;QAED,gBAAK,CAAC,MAAM,YAAC,aAAa,EAAE,cAAc,CAAC,CAAA;IAC7C,CAAC;IACH,uCAAC;AAAD,CAAC,AAvCD,CAAsD,iBAAiB,GAuCtE","sourcesContent":["import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport {\n MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,\n} from '../constants/constants.base'\n\nexport interface SessionRecorderHttpTraceExporterConfig {\n /** The URL to send traces to. Defaults to MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL */\n url?: string\n /** API key for authentication. Required. */\n apiKey: string\n /** Timeout for HTTP requests in milliseconds. Defaults to 30000 */\n timeoutMillis?: number\n /** Whether to keep the connection alive. Defaults to true */\n keepAlive?: boolean\n /** Maximum number of concurrent requests. Defaults to 20 */\n concurrencyLimit?: number\n}\n\n/**\n * HTTP trace exporter for Session Recorder\n * Exports traces via HTTP to Multiplayer's OTLP endpoint\n * Only exports spans with trace IDs starting with Multiplayer prefixes\n */\nexport class SessionRecorderHttpTraceExporter extends OTLPTraceExporter {\n constructor(config: SessionRecorderHttpTraceExporterConfig) {\n const {\n url = MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,\n apiKey,\n timeoutMillis = 30000,\n keepAlive = true,\n concurrencyLimit = 20,\n } = config\n\n super({\n url,\n headers: {\n 'Content-Type': 'application/x-protobuf',\n 'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0',\n 'authorization': apiKey,\n },\n timeoutMillis,\n keepAlive,\n concurrencyLimit,\n })\n }\n\n override export(spans: any[], resultCallback: (result: { code: number }) => void): void {\n // Filter spans to only include those with Multiplayer trace prefixes\n const filteredSpans = spans.filter(span => {\n const traceId = span.spanContext().traceId\n return traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX) ||\n traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)\n })\n\n // Only proceed if there are filtered spans\n if (filteredSpans.length === 0) {\n resultCallback({ code: 0 })\n return\n }\n\n super.export(filteredSpans, resultCallback)\n }\n}\n"]}
1
+ {"version":3,"file":"SessionRecorderHttpTraceExporter.js","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderHttpTraceExporter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAC3E,OAAO,EACL,iDAAiD,EACjD,8BAA8B,EAC9B,yCAAyC,GAC1C,MAAM,6BAA6B,CAAA;AAepC;;;;GAIG;AACH;IAAsD,oDAAiB;IACrE,0CAAY,MAA8C;QAEtD,IAAA,KAKE,MAAM,IAL+C,EAAvD,GAAG,mBAAG,iDAAiD,KAAA,EACvD,MAAM,GAIJ,MAAM,OAJF,EACN,KAGE,MAAM,cAHa,EAArB,aAAa,mBAAG,KAAK,KAAA,EACrB,KAEE,MAAM,UAFQ,EAAhB,SAAS,mBAAG,IAAI,KAAA,EAChB,KACE,MAAM,iBADa,EAArB,gBAAgB,mBAAG,EAAE,KAAA,CACb;QAEV,OAAA,MAAK,YAAC;YACJ,GAAG,KAAA;YACH,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,gDAAgD;gBAC9D,eAAe,EAAE,MAAM;aACxB;YACD,aAAa,eAAA;YACb,SAAS,WAAA;YACT,gBAAgB,kBAAA;SACjB,CAAC,SAAA;IACJ,CAAC;IAEQ,iDAAM,GAAf,UACE,KAAY,EACZ,cAAkD;QAElD,IAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,UAAA,IAAI;YACrC,IAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAA;YAC1C,OAAO,OAAO,CAAC,UAAU,CAAC,8BAA8B,CAAC;gBACvD,OAAO,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;QAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YAC3B,OAAM;QACR,CAAC;QAED,gBAAK,CAAC,MAAM,YAAC,aAAa,EAAE,cAAc,CAAC,CAAA;IAC7C,CAAC;IACH,uCAAC;AAAD,CAAC,AAxCD,CAAsD,iBAAiB,GAwCtE","sourcesContent":["import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport {\n MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,\n} from '../constants/constants.base'\n\nexport interface SessionRecorderHttpTraceExporterConfig {\n /** The URL to send traces to. Defaults to MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL */\n url?: string\n /** API key for authentication. Required. */\n apiKey: string\n /** Timeout for HTTP requests in milliseconds. Defaults to 30000 */\n timeoutMillis?: number\n /** Whether to keep the connection alive. Defaults to true */\n keepAlive?: boolean\n /** Maximum number of concurrent requests. Defaults to 20 */\n concurrencyLimit?: number\n}\n\n/**\n * HTTP trace exporter for Session Recorder\n * Exports traces via HTTP to Multiplayer's OTLP endpoint\n * Only exports spans with trace IDs starting with Multiplayer prefixes\n */\nexport class SessionRecorderHttpTraceExporter extends OTLPTraceExporter {\n constructor(config: SessionRecorderHttpTraceExporterConfig) {\n const {\n url = MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,\n apiKey,\n timeoutMillis = 30000,\n keepAlive = true,\n concurrencyLimit = 20,\n } = config\n\n super({\n url,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0',\n 'Authorization': apiKey,\n },\n timeoutMillis,\n keepAlive,\n concurrencyLimit,\n })\n }\n\n override export(\n spans: any[],\n resultCallback: (result: { code: number }) => void,\n ): void {\n const filteredSpans = spans.filter(span => {\n const traceId = span.spanContext().traceId\n return traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX) ||\n traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)\n })\n\n if (filteredSpans.length === 0) {\n resultCallback({ code: 0 })\n return\n }\n\n super.export(filteredSpans, resultCallback)\n }\n}\n"]}