@multiplayer-app/session-recorder-common 1.0.1-alpha.0 → 1.0.1-alpha.2

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 (68) hide show
  1. package/dist/esm/SessionRecorderIdGenerator.d.ts +1 -6
  2. package/dist/esm/SessionRecorderIdGenerator.d.ts.map +1 -1
  3. package/dist/esm/SessionRecorderIdGenerator.js +3 -12
  4. package/dist/esm/SessionRecorderIdGenerator.js.map +1 -1
  5. package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.d.ts +15 -3
  6. package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
  7. package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js +26 -126
  8. package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
  9. package/dist/esm/index-browser.d.ts +0 -1
  10. package/dist/esm/index-browser.d.ts.map +1 -1
  11. package/dist/esm/index-browser.js +0 -1
  12. package/dist/esm/index-browser.js.map +1 -1
  13. package/dist/esm/index-node.d.ts +0 -1
  14. package/dist/esm/index-node.d.ts.map +1 -1
  15. package/dist/esm/index-node.js +0 -1
  16. package/dist/esm/index-node.js.map +1 -1
  17. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  18. package/dist/esnext/SessionRecorderIdGenerator.d.ts +1 -6
  19. package/dist/esnext/SessionRecorderIdGenerator.d.ts.map +1 -1
  20. package/dist/esnext/SessionRecorderIdGenerator.js +3 -11
  21. package/dist/esnext/SessionRecorderIdGenerator.js.map +1 -1
  22. package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.d.ts +15 -3
  23. package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
  24. package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js +27 -76
  25. package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
  26. package/dist/esnext/index-browser.d.ts +0 -1
  27. package/dist/esnext/index-browser.d.ts.map +1 -1
  28. package/dist/esnext/index-browser.js +0 -1
  29. package/dist/esnext/index-browser.js.map +1 -1
  30. package/dist/esnext/index-node.d.ts +0 -1
  31. package/dist/esnext/index-node.d.ts.map +1 -1
  32. package/dist/esnext/index-node.js +0 -1
  33. package/dist/esnext/index-node.js.map +1 -1
  34. package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -1
  35. package/dist/src/SessionRecorderIdGenerator.d.ts +1 -6
  36. package/dist/src/SessionRecorderIdGenerator.d.ts.map +1 -1
  37. package/dist/src/SessionRecorderIdGenerator.js +1 -9
  38. package/dist/src/SessionRecorderIdGenerator.js.map +1 -1
  39. package/dist/src/exporters/SessionRecorderBrowserTraceExporter.d.ts +15 -3
  40. package/dist/src/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
  41. package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js +27 -76
  42. package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
  43. package/dist/src/index-browser.d.ts +0 -1
  44. package/dist/src/index-browser.d.ts.map +1 -1
  45. package/dist/src/index-browser.js +1 -3
  46. package/dist/src/index-browser.js.map +1 -1
  47. package/dist/src/index-node.d.ts +0 -1
  48. package/dist/src/index-node.d.ts.map +1 -1
  49. package/dist/src/index-node.js +1 -3
  50. package/dist/src/index-node.js.map +1 -1
  51. package/package.json +3 -3
  52. package/src/SessionRecorderIdGenerator.ts +2 -21
  53. package/src/exporters/SessionRecorderBrowserTraceExporter.ts +55 -94
  54. package/src/index-browser.ts +0 -1
  55. package/src/index-node.ts +0 -1
  56. package/dist/esm/SessionRecorderJsonTraceSerializer.d.ts +0 -4
  57. package/dist/esm/SessionRecorderJsonTraceSerializer.d.ts.map +0 -1
  58. package/dist/esm/SessionRecorderJsonTraceSerializer.js +0 -94
  59. package/dist/esm/SessionRecorderJsonTraceSerializer.js.map +0 -1
  60. package/dist/esnext/SessionRecorderJsonTraceSerializer.d.ts +0 -4
  61. package/dist/esnext/SessionRecorderJsonTraceSerializer.d.ts.map +0 -1
  62. package/dist/esnext/SessionRecorderJsonTraceSerializer.js +0 -66
  63. package/dist/esnext/SessionRecorderJsonTraceSerializer.js.map +0 -1
  64. package/dist/src/SessionRecorderJsonTraceSerializer.d.ts +0 -4
  65. package/dist/src/SessionRecorderJsonTraceSerializer.d.ts.map +0 -1
  66. package/dist/src/SessionRecorderJsonTraceSerializer.js +0 -69
  67. package/dist/src/SessionRecorderJsonTraceSerializer.js.map +0 -1
  68. package/src/SessionRecorderJsonTraceSerializer.ts +0 -83
@@ -1,21 +1,24 @@
1
1
  import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'
2
- import {
3
- OTLPExporterConfigBase,
4
- OTLPExporterBase,
5
- } from '@opentelemetry/otlp-exporter-base'
6
- import {
7
- createLegacyOtlpBrowserExportDelegate,
8
- } from '@opentelemetry/otlp-exporter-base/browser-http'
2
+ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
9
3
  import {
10
4
  MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,
11
5
  MULTIPLAYER_TRACE_DEBUG_PREFIX,
12
6
  MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,
13
7
  } from '../constants/constants.base'
14
8
 
15
- export interface SessionRecorderBrowserTraceExporterConfig
16
- extends OTLPExporterConfigBase {
9
+ export interface SessionRecorderBrowserTraceExporterConfig {
10
+ /** URL for the OTLP endpoint. Defaults to Multiplayer's default traces endpoint. */
11
+ url?: string
17
12
  /** API key for authentication. Required. */
18
13
  apiKey: string
14
+ /** Additional headers to include in requests */
15
+ headers?: Record<string, string>
16
+ /** Request timeout in milliseconds */
17
+ timeoutMillis?: number
18
+ /** Whether to use keep-alive connections */
19
+ keepAlive?: boolean
20
+ /** Maximum number of concurrent requests */
21
+ concurrencyLimit?: number
19
22
  /** Whether to use postMessage fallback for cross-origin requests */
20
23
  usePostMessageFallback?: boolean
21
24
  /** PostMessage type identifier */
@@ -29,10 +32,8 @@ export interface SessionRecorderBrowserTraceExporterConfig
29
32
  * Exports traces via HTTP to Multiplayer's OTLP endpoint with browser-specific optimizations
30
33
  * Only exports spans with trace IDs starting with Multiplayer prefixes
31
34
  */
32
- export class SessionRecorderBrowserTraceExporter
33
- extends OTLPExporterBase<ReadableSpan[]>
34
- implements SpanExporter {
35
-
35
+ export class SessionRecorderBrowserTraceExporter implements SpanExporter {
36
+ private exporter: OTLPTraceExporter
36
37
  private usePostMessage: boolean = false
37
38
  private readonly postMessageType: string
38
39
  private readonly postMessageTargetOrigin: string
@@ -43,93 +44,32 @@ export class SessionRecorderBrowserTraceExporter
43
44
  url = MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL,
44
45
  apiKey,
45
46
  headers = {},
47
+ timeoutMillis = 30000,
48
+ keepAlive = true,
49
+ concurrencyLimit = 20,
46
50
  postMessageType = 'MULTIPLAYER_SESSION_DEBUGGER_LIB',
47
51
  postMessageTargetOrigin = '*',
48
- ...restConfig
49
52
  } = config
50
53
 
51
- const _config = {
52
- ...restConfig,
54
+ this.config = {
55
+ ...config,
53
56
  url,
54
- headers: {
55
- 'Content-Type': 'application/x-protobuf',
56
- 'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0',
57
- 'Authorization': apiKey,
58
- ...headers,
59
- },
57
+ apiKey,
58
+ headers,
59
+ timeoutMillis,
60
+ keepAlive,
61
+ concurrencyLimit,
60
62
  }
61
-
62
- super(
63
- createLegacyOtlpBrowserExportDelegate(
64
- _config,
65
- {
66
- serializeRequest: (spans: ReadableSpan[]) => {
67
- // Create a simple trace service request structure
68
- const request = {
69
- resourceSpans: spans.map(span => ({
70
- resource: {
71
- attributes: Object.entries(span.resource.attributes).map(([key, value]) => ({
72
- key,
73
- value: { stringValue: String(value) },
74
- })),
75
- },
76
- scopeSpans: [{
77
- spans: [{
78
- traceId: span.spanContext().traceId,
79
- spanId: span.spanContext().spanId,
80
- parentSpanId: span.spanContext().spanId, // Using spanId as fallback
81
- name: span.name,
82
- kind: span.kind,
83
- startTimeUnixNano: span.startTime[0] * 1e9 + span.startTime[1],
84
- endTimeUnixNano: span.endTime ? span.endTime[0] * 1e9 + span.endTime[1] : undefined,
85
- attributes: Object.entries(span.attributes).map(([key, value]) => ({
86
- key,
87
- value: { stringValue: String(value) },
88
- })),
89
- events: span.events.map(event => ({
90
- timeUnixNano: event.time[0] * 1e9 + event.time[1],
91
- name: event.name,
92
- attributes: Object.entries(event.attributes || {}).map(([key, value]) => ({
93
- key,
94
- value: { stringValue: String(value) },
95
- })),
96
- })),
97
- links: span.links.map(link => ({
98
- traceId: link.context.traceId,
99
- spanId: link.context.spanId,
100
- attributes: Object.entries(link.attributes || {}).map(([key, value]) => ({
101
- key,
102
- value: { stringValue: String(value) },
103
- })),
104
- })),
105
- status: {
106
- code: span.status.code,
107
- message: span.status.message || '',
108
- },
109
- }],
110
- }],
111
- })),
112
- }
113
-
114
- const encoder = new TextEncoder()
115
- return encoder.encode(JSON.stringify(request))
116
- },
117
- deserializeResponse: (arg: Uint8Array) => {
118
- const decoder = new TextDecoder()
119
- return JSON.parse(decoder.decode(arg))
120
- },
121
- },
122
- 'v1/traces',
123
- { 'Content-Type': 'application/json' },
124
- ),
125
- )
126
-
127
- this.config = config
128
63
  this.postMessageType = postMessageType
129
64
  this.postMessageTargetOrigin = postMessageTargetOrigin
65
+
66
+ this.exporter = this._createExporter()
130
67
  }
131
68
 
132
- override export(spans: ReadableSpan[], resultCallback: (result: { code: number }) => void): void {
69
+ export(
70
+ spans: ReadableSpan[],
71
+ resultCallback: (result: { code: number }) => void,
72
+ ): void {
133
73
  // Filter spans to only include those with Multiplayer trace prefixes
134
74
  const filteredSpans = spans.filter(span => {
135
75
  const traceId = span.spanContext().traceId
@@ -148,7 +88,7 @@ export class SessionRecorderBrowserTraceExporter
148
88
  return
149
89
  }
150
90
 
151
- super.export(filteredSpans, (result) => {
91
+ this.exporter.export(filteredSpans, (result) => {
152
92
  if (result.code === 0) {
153
93
  resultCallback(result)
154
94
  } else if (this.config.usePostMessageFallback) {
@@ -160,8 +100,8 @@ export class SessionRecorderBrowserTraceExporter
160
100
  })
161
101
  }
162
102
 
163
- override shutdown(): Promise<void> {
164
- return Promise.resolve()
103
+ shutdown(): Promise<void> {
104
+ return this.exporter.shutdown()
165
105
  }
166
106
 
167
107
  private exportViaPostMessage(spans: ReadableSpan[], resultCallback: (result: { code: number }) => void): void {
@@ -199,7 +139,7 @@ export class SessionRecorderBrowserTraceExporter
199
139
  startTime: span.startTime,
200
140
  duration: span.duration,
201
141
  attributes: span.attributes,
202
- parentSpanId: spanContext.spanId, // Using spanId as parentSpanId is not available in newer versions
142
+ parentSpanId: span.parentSpanContext?.spanId,
203
143
  droppedAttributesCount: span.droppedAttributesCount,
204
144
  droppedEventsCount: span.droppedEventsCount,
205
145
  droppedLinksCount: span.droppedLinksCount,
@@ -209,4 +149,25 @@ export class SessionRecorderBrowserTraceExporter
209
149
  },
210
150
  }
211
151
  }
152
+
153
+ private _createExporter(): OTLPTraceExporter {
154
+ return new OTLPTraceExporter({
155
+ url: this.config.url,
156
+ headers: {
157
+ 'Content-Type': 'application/x-protobuf',
158
+ 'User-Agent': '@multiplayer-app/session-recorder-common/1.0.0',
159
+ 'authorization': this.config.apiKey,
160
+ ...(this.config.headers || {}),
161
+ },
162
+ timeoutMillis: this.config.timeoutMillis,
163
+ keepAlive: this.config.keepAlive,
164
+ concurrencyLimit: this.config.concurrencyLimit,
165
+ })
166
+ }
167
+
168
+ setApiKey(apiKey: string): void {
169
+ this.config.apiKey = apiKey
170
+
171
+ this.exporter = this._createExporter()
172
+ }
212
173
  }
@@ -1,6 +1,5 @@
1
1
  export * from './constants/constants.browser'
2
2
  export { SessionRecorderIdGenerator } from './SessionRecorderIdGenerator'
3
- export { SessionRecorderJsonTraceSerializer } from './SessionRecorderJsonTraceSerializer'
4
3
  export { SessionRecorderTraceIdRatioBasedSampler } from './SessionRecorderTraceIdRatioBasedSampler'
5
4
  export * as SessionRecorderSdk from './sdk'
6
5
  export * from './type'
package/src/index-node.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  export * from './constants/constants.node'
2
2
  export { SessionRecorderHttpInstrumentationHooksNode } from './instrumentations/SessionRecorderHttpInstrumentationHooksNode'
3
3
  export { SessionRecorderIdGenerator } from './SessionRecorderIdGenerator'
4
- export { SessionRecorderJsonTraceSerializer } from './SessionRecorderJsonTraceSerializer'
5
4
  export { SessionRecorderTraceIdRatioBasedSampler } from './SessionRecorderTraceIdRatioBasedSampler'
6
5
  export * as SessionRecorderSdk from './sdk'
7
6
  export * from './type'
@@ -1,4 +0,0 @@
1
- import { ReadableSpan } from '@opentelemetry/sdk-trace-base';
2
- import { IExportTraceServiceResponse, ISerializer } from '@opentelemetry/otlp-transformer';
3
- export declare const SessionRecorderJsonTraceSerializer: ISerializer<ReadableSpan[], IExportTraceServiceResponse>;
4
- //# sourceMappingURL=SessionRecorderJsonTraceSerializer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionRecorderJsonTraceSerializer.d.ts","sourceRoot":"","sources":["../../src/SessionRecorderJsonTraceSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EACL,2BAA2B,EAC3B,WAAW,EACZ,MAAM,iCAAiC,CAAA;AAMxC,eAAO,MAAM,kCAAkC,EAAE,WAAW,CAC5D,YAAY,EAAE,EACd,2BAA2B,CAsE1B,CAAA"}
@@ -1,94 +0,0 @@
1
- var __read = (this && this.__read) || function (o, n) {
2
- var m = typeof Symbol === "function" && o[Symbol.iterator];
3
- if (!m) return o;
4
- var i = m.call(o), r, ar = [], e;
5
- try {
6
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
7
- }
8
- catch (error) { e = { error: error }; }
9
- finally {
10
- try {
11
- if (r && !r.done && (m = i["return"])) m.call(i);
12
- }
13
- finally { if (e) throw e.error; }
14
- }
15
- return ar;
16
- };
17
- import { MULTIPLAYER_TRACE_DEBUG_PREFIX, MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX, } from './constants/constants.base';
18
- export var SessionRecorderJsonTraceSerializer = {
19
- serializeRequest: function (arg) {
20
- var filteredArg = arg.filter(function (span) {
21
- var traceId = span.spanContext().traceId;
22
- if (traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)
23
- || traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)) {
24
- return true;
25
- }
26
- return false;
27
- });
28
- // Create a simple trace service request structure
29
- var request = {
30
- resourceSpans: filteredArg.map(function (span) { return ({
31
- resource: {
32
- attributes: Object.entries(span.resource.attributes).map(function (_a) {
33
- var _b = __read(_a, 2), key = _b[0], value = _b[1];
34
- return ({
35
- key: key,
36
- value: { stringValue: String(value) },
37
- });
38
- }),
39
- },
40
- scopeSpans: [{
41
- spans: [{
42
- traceId: span.spanContext().traceId,
43
- spanId: span.spanContext().spanId,
44
- parentSpanId: span.spanContext().spanId, // Using spanId as fallback
45
- name: span.name,
46
- kind: span.kind,
47
- startTimeUnixNano: span.startTime[0] * 1e9 + span.startTime[1],
48
- endTimeUnixNano: span.endTime ? span.endTime[0] * 1e9 + span.endTime[1] : undefined,
49
- attributes: Object.entries(span.attributes).map(function (_a) {
50
- var _b = __read(_a, 2), key = _b[0], value = _b[1];
51
- return ({
52
- key: key,
53
- value: { stringValue: String(value) },
54
- });
55
- }),
56
- events: span.events.map(function (event) { return ({
57
- timeUnixNano: event.time[0] * 1e9 + event.time[1],
58
- name: event.name,
59
- attributes: Object.entries(event.attributes || {}).map(function (_a) {
60
- var _b = __read(_a, 2), key = _b[0], value = _b[1];
61
- return ({
62
- key: key,
63
- value: { stringValue: String(value) },
64
- });
65
- }),
66
- }); }),
67
- links: span.links.map(function (link) { return ({
68
- traceId: link.context.traceId,
69
- spanId: link.context.spanId,
70
- attributes: Object.entries(link.attributes || {}).map(function (_a) {
71
- var _b = __read(_a, 2), key = _b[0], value = _b[1];
72
- return ({
73
- key: key,
74
- value: { stringValue: String(value) },
75
- });
76
- }),
77
- }); }),
78
- status: {
79
- code: span.status.code,
80
- message: span.status.message || '',
81
- },
82
- }],
83
- }],
84
- }); }),
85
- };
86
- var encoder = new TextEncoder();
87
- return encoder.encode(JSON.stringify(request));
88
- },
89
- deserializeResponse: function (arg) {
90
- var decoder = new TextDecoder();
91
- return JSON.parse(decoder.decode(arg));
92
- },
93
- };
94
- //# sourceMappingURL=SessionRecorderJsonTraceSerializer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionRecorderJsonTraceSerializer.js","sourceRoot":"","sources":["../../src/SessionRecorderJsonTraceSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport {\n IExportTraceServiceResponse,\n ISerializer,\n} from '@opentelemetry/otlp-transformer'\nimport {\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,\n} from './constants/constants.base'\n\nexport const SessionRecorderJsonTraceSerializer: ISerializer<\nReadableSpan[],\nIExportTraceServiceResponse\n> = {\n serializeRequest: (arg: ReadableSpan[]) => {\n const filteredArg = arg.filter(span => {\n const traceId = span.spanContext().traceId\n\n if (\n traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)\n || traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)\n ) {\n return true\n }\n\n return false\n })\n\n // Create a simple trace service request structure\n const request = {\n resourceSpans: filteredArg.map(span => ({\n resource: {\n attributes: Object.entries(span.resource.attributes).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n },\n scopeSpans: [{\n spans: [{\n traceId: span.spanContext().traceId,\n spanId: span.spanContext().spanId,\n parentSpanId: span.spanContext().spanId, // Using spanId as fallback\n name: span.name,\n kind: span.kind,\n startTimeUnixNano: span.startTime[0] * 1e9 + span.startTime[1],\n endTimeUnixNano: span.endTime ? span.endTime[0] * 1e9 + span.endTime[1] : undefined,\n attributes: Object.entries(span.attributes).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n events: span.events.map(event => ({\n timeUnixNano: event.time[0] * 1e9 + event.time[1],\n name: event.name,\n attributes: Object.entries(event.attributes || {}).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n })),\n links: span.links.map(link => ({\n traceId: link.context.traceId,\n spanId: link.context.spanId,\n attributes: Object.entries(link.attributes || {}).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n })),\n status: {\n code: span.status.code,\n message: span.status.message || '',\n },\n }],\n }],\n })),\n }\n\n const encoder = new TextEncoder()\n return encoder.encode(JSON.stringify(request))\n },\n deserializeResponse: (arg: Uint8Array) => {\n const decoder = new TextDecoder()\n return JSON.parse(decoder.decode(arg)) as IExportTraceServiceResponse\n },\n}\n"]}
@@ -1,4 +0,0 @@
1
- import { ReadableSpan } from '@opentelemetry/sdk-trace-base';
2
- import { IExportTraceServiceResponse, ISerializer } from '@opentelemetry/otlp-transformer';
3
- export declare const SessionRecorderJsonTraceSerializer: ISerializer<ReadableSpan[], IExportTraceServiceResponse>;
4
- //# sourceMappingURL=SessionRecorderJsonTraceSerializer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionRecorderJsonTraceSerializer.d.ts","sourceRoot":"","sources":["../../src/SessionRecorderJsonTraceSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EACL,2BAA2B,EAC3B,WAAW,EACZ,MAAM,iCAAiC,CAAA;AAMxC,eAAO,MAAM,kCAAkC,EAAE,WAAW,CAC5D,YAAY,EAAE,EACd,2BAA2B,CAsE1B,CAAA"}
@@ -1,66 +0,0 @@
1
- import { MULTIPLAYER_TRACE_DEBUG_PREFIX, MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX, } from './constants/constants.base';
2
- export const SessionRecorderJsonTraceSerializer = {
3
- serializeRequest: (arg) => {
4
- const filteredArg = arg.filter(span => {
5
- const traceId = span.spanContext().traceId;
6
- if (traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)
7
- || traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)) {
8
- return true;
9
- }
10
- return false;
11
- });
12
- // Create a simple trace service request structure
13
- const request = {
14
- resourceSpans: filteredArg.map(span => ({
15
- resource: {
16
- attributes: Object.entries(span.resource.attributes).map(([key, value]) => ({
17
- key,
18
- value: { stringValue: String(value) },
19
- })),
20
- },
21
- scopeSpans: [{
22
- spans: [{
23
- traceId: span.spanContext().traceId,
24
- spanId: span.spanContext().spanId,
25
- parentSpanId: span.spanContext().spanId, // Using spanId as fallback
26
- name: span.name,
27
- kind: span.kind,
28
- startTimeUnixNano: span.startTime[0] * 1e9 + span.startTime[1],
29
- endTimeUnixNano: span.endTime ? span.endTime[0] * 1e9 + span.endTime[1] : undefined,
30
- attributes: Object.entries(span.attributes).map(([key, value]) => ({
31
- key,
32
- value: { stringValue: String(value) },
33
- })),
34
- events: span.events.map(event => ({
35
- timeUnixNano: event.time[0] * 1e9 + event.time[1],
36
- name: event.name,
37
- attributes: Object.entries(event.attributes || {}).map(([key, value]) => ({
38
- key,
39
- value: { stringValue: String(value) },
40
- })),
41
- })),
42
- links: span.links.map(link => ({
43
- traceId: link.context.traceId,
44
- spanId: link.context.spanId,
45
- attributes: Object.entries(link.attributes || {}).map(([key, value]) => ({
46
- key,
47
- value: { stringValue: String(value) },
48
- })),
49
- })),
50
- status: {
51
- code: span.status.code,
52
- message: span.status.message || '',
53
- },
54
- }],
55
- }],
56
- })),
57
- };
58
- const encoder = new TextEncoder();
59
- return encoder.encode(JSON.stringify(request));
60
- },
61
- deserializeResponse: (arg) => {
62
- const decoder = new TextDecoder();
63
- return JSON.parse(decoder.decode(arg));
64
- },
65
- };
66
- //# sourceMappingURL=SessionRecorderJsonTraceSerializer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionRecorderJsonTraceSerializer.js","sourceRoot":"","sources":["../../src/SessionRecorderJsonTraceSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport {\n IExportTraceServiceResponse,\n ISerializer,\n} from '@opentelemetry/otlp-transformer'\nimport {\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,\n} from './constants/constants.base'\n\nexport const SessionRecorderJsonTraceSerializer: ISerializer<\nReadableSpan[],\nIExportTraceServiceResponse\n> = {\n serializeRequest: (arg: ReadableSpan[]) => {\n const filteredArg = arg.filter(span => {\n const traceId = span.spanContext().traceId\n\n if (\n traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)\n || traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)\n ) {\n return true\n }\n\n return false\n })\n\n // Create a simple trace service request structure\n const request = {\n resourceSpans: filteredArg.map(span => ({\n resource: {\n attributes: Object.entries(span.resource.attributes).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n },\n scopeSpans: [{\n spans: [{\n traceId: span.spanContext().traceId,\n spanId: span.spanContext().spanId,\n parentSpanId: span.spanContext().spanId, // Using spanId as fallback\n name: span.name,\n kind: span.kind,\n startTimeUnixNano: span.startTime[0] * 1e9 + span.startTime[1],\n endTimeUnixNano: span.endTime ? span.endTime[0] * 1e9 + span.endTime[1] : undefined,\n attributes: Object.entries(span.attributes).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n events: span.events.map(event => ({\n timeUnixNano: event.time[0] * 1e9 + event.time[1],\n name: event.name,\n attributes: Object.entries(event.attributes || {}).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n })),\n links: span.links.map(link => ({\n traceId: link.context.traceId,\n spanId: link.context.spanId,\n attributes: Object.entries(link.attributes || {}).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n })),\n status: {\n code: span.status.code,\n message: span.status.message || '',\n },\n }],\n }],\n })),\n }\n\n const encoder = new TextEncoder()\n return encoder.encode(JSON.stringify(request))\n },\n deserializeResponse: (arg: Uint8Array) => {\n const decoder = new TextDecoder()\n return JSON.parse(decoder.decode(arg)) as IExportTraceServiceResponse\n },\n}\n"]}
@@ -1,4 +0,0 @@
1
- import { ReadableSpan } from '@opentelemetry/sdk-trace-base';
2
- import { IExportTraceServiceResponse, ISerializer } from '@opentelemetry/otlp-transformer';
3
- export declare const SessionRecorderJsonTraceSerializer: ISerializer<ReadableSpan[], IExportTraceServiceResponse>;
4
- //# sourceMappingURL=SessionRecorderJsonTraceSerializer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionRecorderJsonTraceSerializer.d.ts","sourceRoot":"","sources":["../../src/SessionRecorderJsonTraceSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EACL,2BAA2B,EAC3B,WAAW,EACZ,MAAM,iCAAiC,CAAA;AAMxC,eAAO,MAAM,kCAAkC,EAAE,WAAW,CAC5D,YAAY,EAAE,EACd,2BAA2B,CAsE1B,CAAA"}
@@ -1,69 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SessionRecorderJsonTraceSerializer = void 0;
4
- const constants_base_1 = require("./constants/constants.base");
5
- exports.SessionRecorderJsonTraceSerializer = {
6
- serializeRequest: (arg) => {
7
- const filteredArg = arg.filter(span => {
8
- const traceId = span.spanContext().traceId;
9
- if (traceId.startsWith(constants_base_1.MULTIPLAYER_TRACE_DEBUG_PREFIX)
10
- || traceId.startsWith(constants_base_1.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)) {
11
- return true;
12
- }
13
- return false;
14
- });
15
- // Create a simple trace service request structure
16
- const request = {
17
- resourceSpans: filteredArg.map(span => ({
18
- resource: {
19
- attributes: Object.entries(span.resource.attributes).map(([key, value]) => ({
20
- key,
21
- value: { stringValue: String(value) },
22
- })),
23
- },
24
- scopeSpans: [{
25
- spans: [{
26
- traceId: span.spanContext().traceId,
27
- spanId: span.spanContext().spanId,
28
- parentSpanId: span.spanContext().spanId, // Using spanId as fallback
29
- name: span.name,
30
- kind: span.kind,
31
- startTimeUnixNano: span.startTime[0] * 1e9 + span.startTime[1],
32
- endTimeUnixNano: span.endTime ? span.endTime[0] * 1e9 + span.endTime[1] : undefined,
33
- attributes: Object.entries(span.attributes).map(([key, value]) => ({
34
- key,
35
- value: { stringValue: String(value) },
36
- })),
37
- events: span.events.map(event => ({
38
- timeUnixNano: event.time[0] * 1e9 + event.time[1],
39
- name: event.name,
40
- attributes: Object.entries(event.attributes || {}).map(([key, value]) => ({
41
- key,
42
- value: { stringValue: String(value) },
43
- })),
44
- })),
45
- links: span.links.map(link => ({
46
- traceId: link.context.traceId,
47
- spanId: link.context.spanId,
48
- attributes: Object.entries(link.attributes || {}).map(([key, value]) => ({
49
- key,
50
- value: { stringValue: String(value) },
51
- })),
52
- })),
53
- status: {
54
- code: span.status.code,
55
- message: span.status.message || '',
56
- },
57
- }],
58
- }],
59
- })),
60
- };
61
- const encoder = new TextEncoder();
62
- return encoder.encode(JSON.stringify(request));
63
- },
64
- deserializeResponse: (arg) => {
65
- const decoder = new TextDecoder();
66
- return JSON.parse(decoder.decode(arg));
67
- },
68
- };
69
- //# sourceMappingURL=SessionRecorderJsonTraceSerializer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionRecorderJsonTraceSerializer.js","sourceRoot":"","sources":["../../src/SessionRecorderJsonTraceSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport {\n IExportTraceServiceResponse,\n ISerializer,\n} from '@opentelemetry/otlp-transformer'\nimport {\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,\n} from './constants/constants.base'\n\nexport const SessionRecorderJsonTraceSerializer: ISerializer<\nReadableSpan[],\nIExportTraceServiceResponse\n> = {\n serializeRequest: (arg: ReadableSpan[]) => {\n const filteredArg = arg.filter(span => {\n const traceId = span.spanContext().traceId\n\n if (\n traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)\n || traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)\n ) {\n return true\n }\n\n return false\n })\n\n // Create a simple trace service request structure\n const request = {\n resourceSpans: filteredArg.map(span => ({\n resource: {\n attributes: Object.entries(span.resource.attributes).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n },\n scopeSpans: [{\n spans: [{\n traceId: span.spanContext().traceId,\n spanId: span.spanContext().spanId,\n parentSpanId: span.spanContext().spanId, // Using spanId as fallback\n name: span.name,\n kind: span.kind,\n startTimeUnixNano: span.startTime[0] * 1e9 + span.startTime[1],\n endTimeUnixNano: span.endTime ? span.endTime[0] * 1e9 + span.endTime[1] : undefined,\n attributes: Object.entries(span.attributes).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n events: span.events.map(event => ({\n timeUnixNano: event.time[0] * 1e9 + event.time[1],\n name: event.name,\n attributes: Object.entries(event.attributes || {}).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n })),\n links: span.links.map(link => ({\n traceId: link.context.traceId,\n spanId: link.context.spanId,\n attributes: Object.entries(link.attributes || {}).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) },\n })),\n })),\n status: {\n code: span.status.code,\n message: span.status.message || '',\n },\n }],\n }],\n })),\n }\n\n const encoder = new TextEncoder()\n return encoder.encode(JSON.stringify(request))\n },\n deserializeResponse: (arg: Uint8Array) => {\n const decoder = new TextDecoder()\n return JSON.parse(decoder.decode(arg)) as IExportTraceServiceResponse\n },\n}\n"]}
@@ -1,83 +0,0 @@
1
- import { ReadableSpan } from '@opentelemetry/sdk-trace-base'
2
- import {
3
- IExportTraceServiceResponse,
4
- ISerializer,
5
- } from '@opentelemetry/otlp-transformer'
6
- import {
7
- MULTIPLAYER_TRACE_DEBUG_PREFIX,
8
- MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,
9
- } from './constants/constants.base'
10
-
11
- export const SessionRecorderJsonTraceSerializer: ISerializer<
12
- ReadableSpan[],
13
- IExportTraceServiceResponse
14
- > = {
15
- serializeRequest: (arg: ReadableSpan[]) => {
16
- const filteredArg = arg.filter(span => {
17
- const traceId = span.spanContext().traceId
18
-
19
- if (
20
- traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)
21
- || traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)
22
- ) {
23
- return true
24
- }
25
-
26
- return false
27
- })
28
-
29
- // Create a simple trace service request structure
30
- const request = {
31
- resourceSpans: filteredArg.map(span => ({
32
- resource: {
33
- attributes: Object.entries(span.resource.attributes).map(([key, value]) => ({
34
- key,
35
- value: { stringValue: String(value) },
36
- })),
37
- },
38
- scopeSpans: [{
39
- spans: [{
40
- traceId: span.spanContext().traceId,
41
- spanId: span.spanContext().spanId,
42
- parentSpanId: span.spanContext().spanId, // Using spanId as fallback
43
- name: span.name,
44
- kind: span.kind,
45
- startTimeUnixNano: span.startTime[0] * 1e9 + span.startTime[1],
46
- endTimeUnixNano: span.endTime ? span.endTime[0] * 1e9 + span.endTime[1] : undefined,
47
- attributes: Object.entries(span.attributes).map(([key, value]) => ({
48
- key,
49
- value: { stringValue: String(value) },
50
- })),
51
- events: span.events.map(event => ({
52
- timeUnixNano: event.time[0] * 1e9 + event.time[1],
53
- name: event.name,
54
- attributes: Object.entries(event.attributes || {}).map(([key, value]) => ({
55
- key,
56
- value: { stringValue: String(value) },
57
- })),
58
- })),
59
- links: span.links.map(link => ({
60
- traceId: link.context.traceId,
61
- spanId: link.context.spanId,
62
- attributes: Object.entries(link.attributes || {}).map(([key, value]) => ({
63
- key,
64
- value: { stringValue: String(value) },
65
- })),
66
- })),
67
- status: {
68
- code: span.status.code,
69
- message: span.status.message || '',
70
- },
71
- }],
72
- }],
73
- })),
74
- }
75
-
76
- const encoder = new TextEncoder()
77
- return encoder.encode(JSON.stringify(request))
78
- },
79
- deserializeResponse: (arg: Uint8Array) => {
80
- const decoder = new TextDecoder()
81
- return JSON.parse(decoder.decode(arg)) as IExportTraceServiceResponse
82
- },
83
- }