@multiplayer-app/session-recorder-common 1.3.22 → 1.3.24
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.
- package/dist/esm/SessionRecorderIdGenerator.d.ts +3 -3
- package/dist/esm/SessionRecorderIdGenerator.d.ts.map +1 -1
- package/dist/esm/SessionRecorderIdGenerator.js +4 -5
- package/dist/esm/SessionRecorderIdGenerator.js.map +1 -1
- package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js +3 -3
- package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esnext/SessionRecorderIdGenerator.d.ts +3 -3
- package/dist/esnext/SessionRecorderIdGenerator.d.ts.map +1 -1
- package/dist/esnext/SessionRecorderIdGenerator.js +5 -5
- package/dist/esnext/SessionRecorderIdGenerator.js.map +1 -1
- package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js +4 -4
- package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
- package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -1
- package/dist/src/SessionRecorderIdGenerator.d.ts +3 -3
- package/dist/src/SessionRecorderIdGenerator.d.ts.map +1 -1
- package/dist/src/SessionRecorderIdGenerator.js +5 -5
- package/dist/src/SessionRecorderIdGenerator.js.map +1 -1
- package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js +3 -3
- package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
- package/package.json +1 -1
- package/src/SessionRecorderIdGenerator.ts +9 -7
- package/src/exporters/SessionRecorderBrowserTraceExporter.ts +8 -8
|
@@ -2,13 +2,13 @@ import { IdGenerator } from '@opentelemetry/sdk-trace-base';
|
|
|
2
2
|
import { SessionType } from './type';
|
|
3
3
|
export declare class SessionRecorderIdGenerator implements IdGenerator {
|
|
4
4
|
sessionShortId: string;
|
|
5
|
-
sessionType
|
|
6
|
-
clientId
|
|
5
|
+
sessionType?: SessionType;
|
|
6
|
+
clientId?: string;
|
|
7
7
|
private generateLongId;
|
|
8
8
|
private generateShortId;
|
|
9
9
|
constructor();
|
|
10
10
|
generateTraceId(): string;
|
|
11
11
|
generateSpanId(): string;
|
|
12
|
-
setSessionId(sessionShortId: string, sessionType
|
|
12
|
+
setSessionId(sessionShortId: string, sessionType: SessionType, clientId?: string): void;
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=SessionRecorderIdGenerator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionRecorderIdGenerator.d.ts","sourceRoot":"","sources":["../../src/SessionRecorderIdGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAMpC,qBAAa,0BAA2B,YAAW,WAAW;IAC5D,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"SessionRecorderIdGenerator.d.ts","sourceRoot":"","sources":["../../src/SessionRecorderIdGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAMpC,qBAAa,0BAA2B,YAAW,WAAW;IAC5D,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,eAAe,CAAc;;IAUrC,eAAe,IAAI,MAAM;IAoBzB,cAAc,IAAI,MAAM;IAIxB,YAAY,CACV,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,WAAW,EACxB,QAAQ,GAAE,MAAW;CAmBxB"}
|
|
@@ -7,13 +7,13 @@ var SessionRecorderIdGenerator = /** @class */ (function () {
|
|
|
7
7
|
this.generateShortId = getIdGenerator(8);
|
|
8
8
|
this.sessionShortId = '';
|
|
9
9
|
this.clientId = '';
|
|
10
|
-
this.sessionType
|
|
10
|
+
this.sessionType;
|
|
11
11
|
}
|
|
12
12
|
SessionRecorderIdGenerator.prototype.generateTraceId = function () {
|
|
13
13
|
var traceId = this.generateLongId();
|
|
14
|
-
if (!this.sessionShortId
|
|
15
|
-
&& !this.
|
|
16
|
-
|
|
14
|
+
if ((!this.sessionShortId
|
|
15
|
+
&& !this.clientId)
|
|
16
|
+
|| !this.sessionType) {
|
|
17
17
|
return traceId;
|
|
18
18
|
}
|
|
19
19
|
var sessionTypePrefix = MULTIPLAYER_TRACE_PREFIX_MAP[this.sessionType];
|
|
@@ -25,7 +25,6 @@ var SessionRecorderIdGenerator = /** @class */ (function () {
|
|
|
25
25
|
return this.generateShortId();
|
|
26
26
|
};
|
|
27
27
|
SessionRecorderIdGenerator.prototype.setSessionId = function (sessionShortId, sessionType, clientId) {
|
|
28
|
-
if (sessionType === void 0) { sessionType = SessionType.MANUAL; }
|
|
29
28
|
if (clientId === void 0) { clientId = ''; }
|
|
30
29
|
if (!clientId &&
|
|
31
30
|
[
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionRecorderIdGenerator.js","sourceRoot":"","sources":["../../src/SessionRecorderIdGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EACL,4BAA4B,GAC7B,MAAM,4BAA4B,CAAA;AAEnC;IAOE;QACE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;QACxC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAA;QACxB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"SessionRecorderIdGenerator.js","sourceRoot":"","sources":["../../src/SessionRecorderIdGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EACL,4BAA4B,GAC7B,MAAM,4BAA4B,CAAA;AAEnC;IAOE;QACE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;QACxC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAA;QACxB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,WAAW,CAAA;IAClB,CAAC;IAED,oDAAe,GAAf;QACE,IAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QAErC,IACE,CACE,CAAC,IAAI,CAAC,cAAc;eACjB,CAAC,IAAI,CAAC,QAAQ,CAClB;eACE,CAAC,IAAI,CAAC,WAAW,EACpB,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,IAAM,iBAAiB,GAAG,4BAA4B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACxE,IAAM,MAAM,GAAG,UAAG,iBAAiB,SAAG,CAAC,WAAW,CAAC,wBAAwB,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAG,IAAI,CAAC,cAAc,CAAE,CAAA;QAC/K,IAAM,cAAc,GAAG,UAAG,MAAM,SAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAE,CAAA;QAErF,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,mDAAc,GAAd;QACE,OAAO,IAAI,CAAC,eAAe,EAAE,CAAA;IAC/B,CAAC;IAED,iDAAY,GAAZ,UACE,cAAsB,EACtB,WAAwB,EACxB,QAAqB;QAArB,yBAAA,EAAA,aAAqB;QAErB,IACE,CAAC,QAAQ;YACT;gBACE,WAAW,CAAC,aAAa;gBACzB,WAAW,CAAC,wBAAwB;aACrC,CAAC,QAAQ,CAAC,WAAW,CAAC,EACvB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,oCAA6B;gBAC3C,WAAW,CAAC,aAAa;gBACzB,WAAW,CAAC,wBAAwB;aACrC,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAgB,CAAC,CAAA;QAC/B,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;QACpC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IACH,iCAAC;AAAD,CAAC,AA7DD,IA6DC","sourcesContent":["import { IdGenerator } from '@opentelemetry/sdk-trace-base'\nimport { SessionType } from './type'\nimport { getIdGenerator } from './sdk'\nimport {\n MULTIPLAYER_TRACE_PREFIX_MAP,\n} from './constants/constants.base'\n\nexport class SessionRecorderIdGenerator implements IdGenerator {\n sessionShortId: string\n sessionType?: SessionType\n clientId?: string\n private generateLongId: () => string\n private generateShortId: () => string\n\n constructor() {\n this.generateLongId = getIdGenerator(16)\n this.generateShortId = getIdGenerator(8)\n this.sessionShortId = ''\n this.clientId = ''\n this.sessionType\n }\n\n generateTraceId(): string {\n const traceId = this.generateLongId()\n\n if (\n (\n !this.sessionShortId\n && !this.clientId\n )\n || !this.sessionType\n ) {\n return traceId\n }\n\n const sessionTypePrefix = MULTIPLAYER_TRACE_PREFIX_MAP[this.sessionType]\n const prefix = `${sessionTypePrefix}${[SessionType.CONTINUOUS_SESSION_CACHE, SessionType.SESSION_CACHE].includes(this.sessionType) ? this.clientId : ''}${this.sessionShortId}`\n const sessionTraceId = `${prefix}${traceId.substring(prefix.length, traceId.length)}`\n\n return sessionTraceId\n }\n\n generateSpanId(): string {\n return this.generateShortId()\n }\n\n setSessionId(\n sessionShortId: string,\n sessionType: SessionType,\n clientId: string = '',\n ) {\n if (\n !clientId &&\n [\n SessionType.SESSION_CACHE,\n SessionType.CONTINUOUS_SESSION_CACHE,\n ].includes(sessionType)\n ) {\n throw new Error(`Client ID is required for ${[\n SessionType.SESSION_CACHE,\n SessionType.CONTINUOUS_SESSION_CACHE,\n ].join(', ')} session types`)\n }\n\n this.sessionShortId = sessionShortId\n this.sessionType = sessionType\n this.clientId = clientId\n }\n}\n"]}
|
|
@@ -10,7 +10,7 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
return __assign.apply(this, arguments);
|
|
11
11
|
};
|
|
12
12
|
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
13
|
-
import { MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL, MULTIPLAYER_TRACE_DEBUG_PREFIX, MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX } from '../constants/constants.base';
|
|
13
|
+
import { MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL, MULTIPLAYER_TRACE_DEBUG_PREFIX, MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX, } from '../constants/constants.base';
|
|
14
14
|
/**
|
|
15
15
|
* Browser-specific trace exporter for Session Recorder
|
|
16
16
|
* Exports traces via HTTP to Multiplayer's OTLP endpoint with browser-specific optimizations
|
|
@@ -77,7 +77,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
|
|
|
77
77
|
window.postMessage({
|
|
78
78
|
action: 'traces',
|
|
79
79
|
type: this.postMessageType,
|
|
80
|
-
payload: spans.map(function (span) { return _this.serializeSpan(span); })
|
|
80
|
+
payload: spans.map(function (span) { return _this.serializeSpan(span); }),
|
|
81
81
|
}, this.postMessageTargetOrigin);
|
|
82
82
|
resultCallback({ code: 0 });
|
|
83
83
|
}
|
|
@@ -95,7 +95,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
|
|
|
95
95
|
headers: __assign(__assign({ 'Content-Type': 'application/json' }, (this.config.apiKey ? { Authorization: this.config.apiKey } : {})), (this.config.headers || {})),
|
|
96
96
|
timeoutMillis: this.config.timeoutMillis,
|
|
97
97
|
keepAlive: this.config.keepAlive,
|
|
98
|
-
concurrencyLimit: this.config.concurrencyLimit
|
|
98
|
+
concurrencyLimit: this.config.concurrencyLimit,
|
|
99
99
|
});
|
|
100
100
|
};
|
|
101
101
|
SessionRecorderBrowserTraceExporter.prototype.setApiKey = function (apiKey) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionRecorderBrowserTraceExporter.js","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderBrowserTraceExporter.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAC3E,OAAO,EACL,iDAAiD,EACjD,8BAA8B,EAC9B,yCAAyC,
|
|
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 { ExportResult } from '@opentelemetry/core'\n\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 keepAlive,\n timeoutMillis,\n concurrencyLimit,\n }\n this.postMessageType = postMessageType\n this.postMessageTargetOrigin = postMessageTargetOrigin\n\n this.exporter = this._createExporter()\n }\n\n export(spans: ReadableSpan[], 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 (\n traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX) ||\n traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)\n )\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 exportBuffer(spans: ReadableSpan[]): Promise<ExportResult | undefined> {\n return new Promise((resolve) => {\n this.exporter.export(spans, (result) => {\n resolve(result)\n })\n })\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 serializeSpan(span: ReadableSpan): any {\n const spanContext = span.spanContext()\n return {\n ...span,\n _spanContext: spanContext,\n }\n }\n\n private _createExporter(): OTLPTraceExporter {\n return new OTLPTraceExporter({\n url: this.config.url,\n headers: {\n 'Content-Type': 'application/json',\n ...(this.config.apiKey ? { 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 this.exporter = this._createExporter()\n }\n}\n"]}
|