@multiplayer-app/session-recorder-common 1.0.1-alpha.1 → 1.0.1-alpha.3
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 +6 -3
- package/dist/esm/SessionRecorderIdGenerator.d.ts.map +1 -1
- package/dist/esm/SessionRecorderIdGenerator.js +26 -41
- package/dist/esm/SessionRecorderIdGenerator.js.map +1 -1
- package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.d.ts +15 -3
- package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
- package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js +26 -126
- package/dist/esm/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esnext/SessionRecorderIdGenerator.d.ts +6 -3
- package/dist/esnext/SessionRecorderIdGenerator.d.ts.map +1 -1
- package/dist/esnext/SessionRecorderIdGenerator.js +21 -19
- package/dist/esnext/SessionRecorderIdGenerator.js.map +1 -1
- package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.d.ts +15 -3
- package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
- package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js +27 -76
- package/dist/esnext/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
- package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -1
- package/dist/src/SessionRecorderIdGenerator.d.ts +6 -3
- package/dist/src/SessionRecorderIdGenerator.d.ts.map +1 -1
- package/dist/src/SessionRecorderIdGenerator.js +21 -19
- package/dist/src/SessionRecorderIdGenerator.js.map +1 -1
- package/dist/src/exporters/SessionRecorderBrowserTraceExporter.d.ts +15 -3
- package/dist/src/exporters/SessionRecorderBrowserTraceExporter.d.ts.map +1 -1
- package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js +27 -76
- package/dist/src/exporters/SessionRecorderBrowserTraceExporter.js.map +1 -1
- package/package.json +3 -3
- package/src/SessionRecorderIdGenerator.ts +26 -23
- package/src/exporters/SessionRecorderBrowserTraceExporter.ts +55 -94
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IdGenerator } from '@opentelemetry/sdk-trace-base';
|
|
2
2
|
import { SessionType } from './type';
|
|
3
|
-
export declare class SessionRecorderIdGenerator
|
|
3
|
+
export declare class SessionRecorderIdGenerator implements IdGenerator {
|
|
4
4
|
sessionShortId: string;
|
|
5
5
|
sessionType: SessionType;
|
|
6
|
-
generateLongId
|
|
6
|
+
private generateLongId;
|
|
7
|
+
private generateShortId;
|
|
7
8
|
constructor();
|
|
9
|
+
generateTraceId(): string;
|
|
10
|
+
generateSpanId(): string;
|
|
8
11
|
setSessionId(sessionShortId: string, sessionType?: SessionType): void;
|
|
9
12
|
}
|
|
10
13
|
//# sourceMappingURL=SessionRecorderIdGenerator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionRecorderIdGenerator.d.ts","sourceRoot":"","sources":["../../src/SessionRecorderIdGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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;AAOpC,qBAAa,0BAA2B,YAAW,WAAW;IAC5D,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,eAAe,CAAc;;IASrC,eAAe,IAAI,MAAM;IAuBzB,cAAc,IAAI,MAAM;IAIxB,YAAY,CACV,cAAc,EAAE,MAAM,EACtB,WAAW,GAAE,WAA+B;CAK/C"}
|
|
@@ -1,54 +1,39 @@
|
|
|
1
|
-
var __extends = (this && this.__extends) || (function () {
|
|
2
|
-
var extendStatics = function (d, b) {
|
|
3
|
-
extendStatics = Object.setPrototypeOf ||
|
|
4
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
-
return extendStatics(d, b);
|
|
7
|
-
};
|
|
8
|
-
return function (d, b) {
|
|
9
|
-
if (typeof b !== "function" && b !== null)
|
|
10
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
-
extendStatics(d, b);
|
|
12
|
-
function __() { this.constructor = d; }
|
|
13
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
-
};
|
|
15
|
-
})();
|
|
16
|
-
import { RandomIdGenerator } from '@opentelemetry/sdk-trace-base';
|
|
17
1
|
import { SessionType } from './type';
|
|
18
2
|
import { MULTIPLAYER_TRACE_DEBUG_PREFIX, MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX, } from './constants/constants.base';
|
|
19
3
|
import { getIdGenerator } from './sdk';
|
|
20
|
-
var SessionRecorderIdGenerator = /** @class */ (function (
|
|
21
|
-
__extends(SessionRecorderIdGenerator, _super);
|
|
4
|
+
var SessionRecorderIdGenerator = /** @class */ (function () {
|
|
22
5
|
function SessionRecorderIdGenerator() {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
_this.generateTraceId = function () {
|
|
28
|
-
var traceId = _this.generateLongId();
|
|
29
|
-
if (_this.sessionShortId) {
|
|
30
|
-
var sessionTypePrefix = '';
|
|
31
|
-
switch (_this.sessionType) {
|
|
32
|
-
case SessionType.CONTINUOUS:
|
|
33
|
-
sessionTypePrefix = MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX;
|
|
34
|
-
break;
|
|
35
|
-
default:
|
|
36
|
-
sessionTypePrefix = MULTIPLAYER_TRACE_DEBUG_PREFIX;
|
|
37
|
-
}
|
|
38
|
-
var prefix = "".concat(sessionTypePrefix).concat(_this.sessionShortId);
|
|
39
|
-
var sessionTraceId = "".concat(prefix).concat(traceId.substring(prefix.length, traceId.length));
|
|
40
|
-
return sessionTraceId;
|
|
41
|
-
}
|
|
42
|
-
return traceId;
|
|
43
|
-
};
|
|
44
|
-
return _this;
|
|
6
|
+
this.generateLongId = getIdGenerator(16);
|
|
7
|
+
this.generateShortId = getIdGenerator(8);
|
|
8
|
+
this.sessionShortId = '';
|
|
9
|
+
this.sessionType = SessionType.PLAIN;
|
|
45
10
|
}
|
|
11
|
+
SessionRecorderIdGenerator.prototype.generateTraceId = function () {
|
|
12
|
+
var traceId = this.generateLongId();
|
|
13
|
+
if (this.sessionShortId) {
|
|
14
|
+
var sessionTypePrefix = '';
|
|
15
|
+
switch (this.sessionType) {
|
|
16
|
+
case SessionType.CONTINUOUS:
|
|
17
|
+
sessionTypePrefix = MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX;
|
|
18
|
+
break;
|
|
19
|
+
default:
|
|
20
|
+
sessionTypePrefix = MULTIPLAYER_TRACE_DEBUG_PREFIX;
|
|
21
|
+
}
|
|
22
|
+
var prefix = "".concat(sessionTypePrefix).concat(this.sessionShortId);
|
|
23
|
+
var sessionTraceId = "".concat(prefix).concat(traceId.substring(prefix.length, traceId.length));
|
|
24
|
+
return sessionTraceId;
|
|
25
|
+
}
|
|
26
|
+
return traceId;
|
|
27
|
+
};
|
|
28
|
+
SessionRecorderIdGenerator.prototype.generateSpanId = function () {
|
|
29
|
+
return this.generateShortId();
|
|
30
|
+
};
|
|
46
31
|
SessionRecorderIdGenerator.prototype.setSessionId = function (sessionShortId, sessionType) {
|
|
47
32
|
if (sessionType === void 0) { sessionType = SessionType.PLAIN; }
|
|
48
33
|
this.sessionShortId = sessionShortId;
|
|
49
34
|
this.sessionType = sessionType;
|
|
50
35
|
};
|
|
51
36
|
return SessionRecorderIdGenerator;
|
|
52
|
-
}(
|
|
37
|
+
}());
|
|
53
38
|
export { SessionRecorderIdGenerator };
|
|
54
39
|
//# sourceMappingURL=SessionRecorderIdGenerator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionRecorderIdGenerator.js","sourceRoot":"","sources":["../../src/SessionRecorderIdGenerator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SessionRecorderIdGenerator.js","sourceRoot":"","sources":["../../src/SessionRecorderIdGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,EACL,8BAA8B,EAC9B,yCAAyC,GAC1C,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAEtC;IAME;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,WAAW,GAAG,WAAW,CAAC,KAAK,CAAA;IACtC,CAAC;IAED,oDAAe,GAAf;QACE,IAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QAErC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,iBAAiB,GAAW,EAAE,CAAA;YAClC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;gBACzB,KAAK,WAAW,CAAC,UAAU;oBACzB,iBAAiB,GAAG,yCAAyC,CAAA;oBAC7D,MAAK;gBACP;oBACE,iBAAiB,GAAG,8BAA8B,CAAA;YACtD,CAAC;YAED,IAAM,MAAM,GAAG,UAAG,iBAAiB,SAAG,IAAI,CAAC,cAAc,CAAE,CAAA;YAE3D,IAAM,cAAc,GAAG,UAAG,MAAM,SAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAE,CAAA;YAErF,OAAO,cAAc,CAAA;QACvB,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,mDAAc,GAAd;QACE,OAAO,IAAI,CAAC,eAAe,EAAE,CAAA;IAC/B,CAAC;IAED,iDAAY,GAAZ,UACE,cAAsB,EACtB,WAA4C;QAA5C,4BAAA,EAAA,cAA2B,WAAW,CAAC,KAAK;QAE5C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;QACpC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;IACH,iCAAC;AAAD,CAAC,AA/CD,IA+CC","sourcesContent":["import { IdGenerator } from '@opentelemetry/sdk-trace-base'\nimport { SessionType } from './type'\nimport {\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,\n} from './constants/constants.base'\nimport { getIdGenerator } from './sdk'\n\nexport class SessionRecorderIdGenerator implements IdGenerator {\n sessionShortId: string\n sessionType: SessionType\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.sessionType = SessionType.PLAIN\n }\n\n generateTraceId(): string {\n const traceId = this.generateLongId()\n\n if (this.sessionShortId) {\n let sessionTypePrefix: string = ''\n switch (this.sessionType) {\n case SessionType.CONTINUOUS:\n sessionTypePrefix = MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX\n break\n default:\n sessionTypePrefix = MULTIPLAYER_TRACE_DEBUG_PREFIX\n }\n\n const prefix = `${sessionTypePrefix}${this.sessionShortId}`\n\n const sessionTraceId = `${prefix}${traceId.substring(prefix.length, traceId.length)}`\n\n return sessionTraceId\n }\n\n return traceId\n }\n\n generateSpanId(): string {\n return this.generateShortId()\n }\n\n setSessionId(\n sessionShortId: string,\n sessionType: SessionType = SessionType.PLAIN,\n ) {\n this.sessionShortId = sessionShortId\n this.sessionType = sessionType\n }\n}\n"]}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
export interface SessionRecorderBrowserTraceExporterConfig {
|
|
3
|
+
/** URL for the OTLP endpoint. Defaults to Multiplayer's default traces endpoint. */
|
|
4
|
+
url?: string;
|
|
4
5
|
/** API key for authentication. Required. */
|
|
5
6
|
apiKey: string;
|
|
7
|
+
/** Additional headers to include in requests */
|
|
8
|
+
headers?: Record<string, string>;
|
|
9
|
+
/** Request timeout in milliseconds */
|
|
10
|
+
timeoutMillis?: number;
|
|
11
|
+
/** Whether to use keep-alive connections */
|
|
12
|
+
keepAlive?: boolean;
|
|
13
|
+
/** Maximum number of concurrent requests */
|
|
14
|
+
concurrencyLimit?: number;
|
|
6
15
|
/** Whether to use postMessage fallback for cross-origin requests */
|
|
7
16
|
usePostMessageFallback?: boolean;
|
|
8
17
|
/** PostMessage type identifier */
|
|
@@ -15,7 +24,8 @@ export interface SessionRecorderBrowserTraceExporterConfig extends OTLPExporterC
|
|
|
15
24
|
* Exports traces via HTTP to Multiplayer's OTLP endpoint with browser-specific optimizations
|
|
16
25
|
* Only exports spans with trace IDs starting with Multiplayer prefixes
|
|
17
26
|
*/
|
|
18
|
-
export declare class SessionRecorderBrowserTraceExporter
|
|
27
|
+
export declare class SessionRecorderBrowserTraceExporter implements SpanExporter {
|
|
28
|
+
private exporter;
|
|
19
29
|
private usePostMessage;
|
|
20
30
|
private readonly postMessageType;
|
|
21
31
|
private readonly postMessageTargetOrigin;
|
|
@@ -27,5 +37,7 @@ export declare class SessionRecorderBrowserTraceExporter extends OTLPExporterBas
|
|
|
27
37
|
shutdown(): Promise<void>;
|
|
28
38
|
private exportViaPostMessage;
|
|
29
39
|
private _serializeSpan;
|
|
40
|
+
private _createExporter;
|
|
41
|
+
setApiKey(apiKey: string): void;
|
|
30
42
|
}
|
|
31
43
|
//# sourceMappingURL=SessionRecorderBrowserTraceExporter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionRecorderBrowserTraceExporter.d.ts","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderBrowserTraceExporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"SessionRecorderBrowserTraceExporter.d.ts","sourceRoot":"","sources":["../../../src/exporters/SessionRecorderBrowserTraceExporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAQ1E,MAAM,WAAW,yCAAyC;IACxD,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oEAAoE;IACpE,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,kCAAkC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gCAAgC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC;AAED;;;;GAIG;AACH,qBAAa,mCAAoC,YAAW,YAAY;IACtE,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAQ;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;gBAEtD,MAAM,EAAE,yCAAyC;IA2B7D,MAAM,CACJ,KAAK,EAAE,YAAY,EAAE,EACrB,cAAc,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACjD,IAAI;IA+BP,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,eAAe;IAevB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAKhC"}
|
|
@@ -1,18 +1,3 @@
|
|
|
1
|
-
var __extends = (this && this.__extends) || (function () {
|
|
2
|
-
var extendStatics = function (d, b) {
|
|
3
|
-
extendStatics = Object.setPrototypeOf ||
|
|
4
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
-
return extendStatics(d, b);
|
|
7
|
-
};
|
|
8
|
-
return function (d, b) {
|
|
9
|
-
if (typeof b !== "function" && b !== null)
|
|
10
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
-
extendStatics(d, b);
|
|
12
|
-
function __() { this.constructor = d; }
|
|
13
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
-
};
|
|
15
|
-
})();
|
|
16
1
|
var __assign = (this && this.__assign) || function () {
|
|
17
2
|
__assign = Object.assign || function(t) {
|
|
18
3
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
@@ -24,120 +9,21 @@ var __assign = (this && this.__assign) || function () {
|
|
|
24
9
|
};
|
|
25
10
|
return __assign.apply(this, arguments);
|
|
26
11
|
};
|
|
27
|
-
|
|
28
|
-
var t = {};
|
|
29
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
30
|
-
t[p] = s[p];
|
|
31
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
32
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
33
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
34
|
-
t[p[i]] = s[p[i]];
|
|
35
|
-
}
|
|
36
|
-
return t;
|
|
37
|
-
};
|
|
38
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
39
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
40
|
-
if (!m) return o;
|
|
41
|
-
var i = m.call(o), r, ar = [], e;
|
|
42
|
-
try {
|
|
43
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
44
|
-
}
|
|
45
|
-
catch (error) { e = { error: error }; }
|
|
46
|
-
finally {
|
|
47
|
-
try {
|
|
48
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
49
|
-
}
|
|
50
|
-
finally { if (e) throw e.error; }
|
|
51
|
-
}
|
|
52
|
-
return ar;
|
|
53
|
-
};
|
|
54
|
-
import { OTLPExporterBase, } from '@opentelemetry/otlp-exporter-base';
|
|
55
|
-
import { createLegacyOtlpBrowserExportDelegate, } from '@opentelemetry/otlp-exporter-base/browser-http';
|
|
12
|
+
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
56
13
|
import { MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL, MULTIPLAYER_TRACE_DEBUG_PREFIX, MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX, } from '../constants/constants.base';
|
|
57
14
|
/**
|
|
58
15
|
* Browser-specific trace exporter for Session Recorder
|
|
59
16
|
* Exports traces via HTTP to Multiplayer's OTLP endpoint with browser-specific optimizations
|
|
60
17
|
* Only exports spans with trace IDs starting with Multiplayer prefixes
|
|
61
18
|
*/
|
|
62
|
-
var SessionRecorderBrowserTraceExporter = /** @class */ (function (
|
|
63
|
-
__extends(SessionRecorderBrowserTraceExporter, _super);
|
|
19
|
+
var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
|
|
64
20
|
function SessionRecorderBrowserTraceExporter(config) {
|
|
65
|
-
|
|
66
|
-
var _a = config.url, url = _a === void 0 ? MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL : _a, apiKey = config.apiKey, _b = config.headers, headers = _b === void 0 ? {} : _b, _c = config.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
var request = {
|
|
72
|
-
resourceSpans: spans.map(function (span) { return ({
|
|
73
|
-
resource: {
|
|
74
|
-
attributes: Object.entries(span.resource.attributes).map(function (_a) {
|
|
75
|
-
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
76
|
-
return ({
|
|
77
|
-
key: key,
|
|
78
|
-
value: { stringValue: String(value) },
|
|
79
|
-
});
|
|
80
|
-
}),
|
|
81
|
-
},
|
|
82
|
-
scopeSpans: [{
|
|
83
|
-
spans: [{
|
|
84
|
-
traceId: span.spanContext().traceId,
|
|
85
|
-
spanId: span.spanContext().spanId,
|
|
86
|
-
parentSpanId: span.spanContext().spanId, // Using spanId as fallback
|
|
87
|
-
name: span.name,
|
|
88
|
-
kind: span.kind,
|
|
89
|
-
startTimeUnixNano: span.startTime[0] * 1e9 + span.startTime[1],
|
|
90
|
-
endTimeUnixNano: span.endTime ? span.endTime[0] * 1e9 + span.endTime[1] : undefined,
|
|
91
|
-
attributes: Object.entries(span.attributes).map(function (_a) {
|
|
92
|
-
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
93
|
-
return ({
|
|
94
|
-
key: key,
|
|
95
|
-
value: { stringValue: String(value) },
|
|
96
|
-
});
|
|
97
|
-
}),
|
|
98
|
-
events: span.events.map(function (event) { return ({
|
|
99
|
-
timeUnixNano: event.time[0] * 1e9 + event.time[1],
|
|
100
|
-
name: event.name,
|
|
101
|
-
attributes: Object.entries(event.attributes || {}).map(function (_a) {
|
|
102
|
-
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
103
|
-
return ({
|
|
104
|
-
key: key,
|
|
105
|
-
value: { stringValue: String(value) },
|
|
106
|
-
});
|
|
107
|
-
}),
|
|
108
|
-
}); }),
|
|
109
|
-
links: span.links.map(function (link) { return ({
|
|
110
|
-
traceId: link.context.traceId,
|
|
111
|
-
spanId: link.context.spanId,
|
|
112
|
-
attributes: Object.entries(link.attributes || {}).map(function (_a) {
|
|
113
|
-
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
114
|
-
return ({
|
|
115
|
-
key: key,
|
|
116
|
-
value: { stringValue: String(value) },
|
|
117
|
-
});
|
|
118
|
-
}),
|
|
119
|
-
}); }),
|
|
120
|
-
status: {
|
|
121
|
-
code: span.status.code,
|
|
122
|
-
message: span.status.message || '',
|
|
123
|
-
},
|
|
124
|
-
}],
|
|
125
|
-
}],
|
|
126
|
-
}); }),
|
|
127
|
-
};
|
|
128
|
-
var encoder = new TextEncoder();
|
|
129
|
-
return encoder.encode(JSON.stringify(request));
|
|
130
|
-
},
|
|
131
|
-
deserializeResponse: function (arg) {
|
|
132
|
-
var decoder = new TextDecoder();
|
|
133
|
-
return JSON.parse(decoder.decode(arg));
|
|
134
|
-
},
|
|
135
|
-
}, 'v1/traces', { 'Content-Type': 'application/json' })) || this;
|
|
136
|
-
_this.usePostMessage = false;
|
|
137
|
-
_this.config = config;
|
|
138
|
-
_this.postMessageType = postMessageType;
|
|
139
|
-
_this.postMessageTargetOrigin = postMessageTargetOrigin;
|
|
140
|
-
return _this;
|
|
21
|
+
this.usePostMessage = false;
|
|
22
|
+
var _a = config.url, url = _a === void 0 ? MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL : _a, apiKey = config.apiKey, _b = config.headers, headers = _b === void 0 ? {} : _b, _c = config.timeoutMillis, timeoutMillis = _c === void 0 ? 30000 : _c, _d = config.keepAlive, keepAlive = _d === void 0 ? true : _d, _e = config.concurrencyLimit, concurrencyLimit = _e === void 0 ? 20 : _e, _f = config.postMessageType, postMessageType = _f === void 0 ? 'MULTIPLAYER_SESSION_DEBUGGER_LIB' : _f, _g = config.postMessageTargetOrigin, postMessageTargetOrigin = _g === void 0 ? '*' : _g;
|
|
23
|
+
this.config = __assign(__assign({}, config), { url: url, apiKey: apiKey, headers: headers, timeoutMillis: timeoutMillis, keepAlive: keepAlive, concurrencyLimit: concurrencyLimit });
|
|
24
|
+
this.postMessageType = postMessageType;
|
|
25
|
+
this.postMessageTargetOrigin = postMessageTargetOrigin;
|
|
26
|
+
this.exporter = this._createExporter();
|
|
141
27
|
}
|
|
142
28
|
SessionRecorderBrowserTraceExporter.prototype.export = function (spans, resultCallback) {
|
|
143
29
|
var _this = this;
|
|
@@ -156,7 +42,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function (_super) {
|
|
|
156
42
|
this.exportViaPostMessage(filteredSpans, resultCallback);
|
|
157
43
|
return;
|
|
158
44
|
}
|
|
159
|
-
|
|
45
|
+
this.exporter.export(filteredSpans, function (result) {
|
|
160
46
|
if (result.code === 0) {
|
|
161
47
|
resultCallback(result);
|
|
162
48
|
}
|
|
@@ -170,7 +56,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function (_super) {
|
|
|
170
56
|
});
|
|
171
57
|
};
|
|
172
58
|
SessionRecorderBrowserTraceExporter.prototype.shutdown = function () {
|
|
173
|
-
return
|
|
59
|
+
return this.exporter.shutdown();
|
|
174
60
|
};
|
|
175
61
|
SessionRecorderBrowserTraceExporter.prototype.exportViaPostMessage = function (spans, resultCallback) {
|
|
176
62
|
var _this = this;
|
|
@@ -191,6 +77,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function (_super) {
|
|
|
191
77
|
}
|
|
192
78
|
};
|
|
193
79
|
SessionRecorderBrowserTraceExporter.prototype._serializeSpan = function (span) {
|
|
80
|
+
var _a;
|
|
194
81
|
var spanContext = span.spanContext();
|
|
195
82
|
return {
|
|
196
83
|
_spanContext: spanContext,
|
|
@@ -204,7 +91,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function (_super) {
|
|
|
204
91
|
startTime: span.startTime,
|
|
205
92
|
duration: span.duration,
|
|
206
93
|
attributes: span.attributes,
|
|
207
|
-
parentSpanId:
|
|
94
|
+
parentSpanId: (_a = span.parentSpanContext) === null || _a === void 0 ? void 0 : _a.spanId,
|
|
208
95
|
droppedAttributesCount: span.droppedAttributesCount,
|
|
209
96
|
droppedEventsCount: span.droppedEventsCount,
|
|
210
97
|
droppedLinksCount: span.droppedLinksCount,
|
|
@@ -214,7 +101,20 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function (_super) {
|
|
|
214
101
|
},
|
|
215
102
|
};
|
|
216
103
|
};
|
|
104
|
+
SessionRecorderBrowserTraceExporter.prototype._createExporter = function () {
|
|
105
|
+
return new OTLPTraceExporter({
|
|
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 || {})),
|
|
108
|
+
timeoutMillis: this.config.timeoutMillis,
|
|
109
|
+
keepAlive: this.config.keepAlive,
|
|
110
|
+
concurrencyLimit: this.config.concurrencyLimit,
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
SessionRecorderBrowserTraceExporter.prototype.setApiKey = function (apiKey) {
|
|
114
|
+
this.config.apiKey = apiKey;
|
|
115
|
+
this.exporter = this._createExporter();
|
|
116
|
+
};
|
|
217
117
|
return SessionRecorderBrowserTraceExporter;
|
|
218
|
-
}(
|
|
118
|
+
}());
|
|
219
119
|
export { SessionRecorderBrowserTraceExporter };
|
|
220
120
|
//# sourceMappingURL=SessionRecorderBrowserTraceExporter.js.map
|
|
@@ -1 +1 @@
|
|
|
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 {\n OTLPExporterConfigBase,\n OTLPExporterBase,\n} from '@opentelemetry/otlp-exporter-base'\nimport {\n createLegacyOtlpBrowserExportDelegate,\n} from '@opentelemetry/otlp-exporter-base/browser-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 extends OTLPExporterConfigBase {\n /** API key for authentication. Required. */\n apiKey: string\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\n extends OTLPExporterBase<ReadableSpan[]>\n implements SpanExporter {\n\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 postMessageType = 'MULTIPLAYER_SESSION_DEBUGGER_LIB',\n postMessageTargetOrigin = '*',\n ...restConfig\n } = config\n\n const _config = {\n ...restConfig,\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 ...headers,\n },\n }\n\n super(\n createLegacyOtlpBrowserExportDelegate(\n _config,\n {\n serializeRequest: (spans: ReadableSpan[]) => {\n // Create a simple trace service request structure\n const request = {\n resourceSpans: spans.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))\n },\n },\n 'v1/traces',\n { 'Content-Type': 'application/json' },\n ),\n )\n\n this.config = config\n this.postMessageType = postMessageType\n this.postMessageTargetOrigin = postMessageTargetOrigin\n }\n\n override 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 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 super.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 override shutdown(): Promise<void> {\n return Promise.resolve()\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: spanContext.spanId, // Using spanId as parentSpanId is not available in newer versions\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"]}
|
|
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/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"]}
|