@rushobservability/rum-sdk 0.1.0 → 0.2.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.
- package/README.md +70 -2
- package/dist/index.d.ts +124 -10
- package/dist/index.js +1 -45
- package/dist/index.js.map +1 -1
- package/dist/rush-rum.global.js +2 -0
- package/dist/rush-rum.global.js.map +1 -0
- package/package.json +15 -5
- package/dist/browser.d.ts +0 -11
- package/dist/browser.d.ts.map +0 -1
- package/dist/browser.js +0 -63
- package/dist/browser.js.map +0 -1
- package/dist/core.d.ts +0 -6
- package/dist/core.d.ts.map +0 -1
- package/dist/core.js +0 -115
- package/dist/core.js.map +0 -1
- package/dist/errors.d.ts +0 -2
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -32
- package/dist/errors.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/interactions.d.ts +0 -2
- package/dist/interactions.d.ts.map +0 -1
- package/dist/interactions.js +0 -24
- package/dist/interactions.js.map +0 -1
- package/dist/pageview.d.ts +0 -2
- package/dist/pageview.d.ts.map +0 -1
- package/dist/pageview.js +0 -51
- package/dist/pageview.js.map +0 -1
- package/dist/replay.d.ts +0 -9
- package/dist/replay.d.ts.map +0 -1
- package/dist/replay.js +0 -62
- package/dist/replay.js.map +0 -1
- package/dist/resources.d.ts +0 -2
- package/dist/resources.d.ts.map +0 -1
- package/dist/resources.js +0 -97
- package/dist/resources.js.map +0 -1
- package/dist/session.d.ts +0 -3
- package/dist/session.d.ts.map +0 -1
- package/dist/session.js +0 -39
- package/dist/session.js.map +0 -1
- package/dist/types.d.ts +0 -63
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/vitals.d.ts +0 -2
- package/dist/vitals.d.ts.map +0 -1
- package/dist/vitals.js +0 -22
- package/dist/vitals.js.map +0 -1
package/dist/pageview.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { pushEvent } from './core';
|
|
2
|
-
export function initPageViews() {
|
|
3
|
-
// Track initial page load
|
|
4
|
-
trackPageView();
|
|
5
|
-
// SPA navigation: history.pushState / replaceState
|
|
6
|
-
const origPush = history.pushState.bind(history);
|
|
7
|
-
const origReplace = history.replaceState.bind(history);
|
|
8
|
-
history.pushState = function (...args) {
|
|
9
|
-
origPush(...args);
|
|
10
|
-
trackPageView();
|
|
11
|
-
};
|
|
12
|
-
history.replaceState = function (...args) {
|
|
13
|
-
origReplace(...args);
|
|
14
|
-
trackPageView();
|
|
15
|
-
};
|
|
16
|
-
// Back/forward navigation
|
|
17
|
-
window.addEventListener('popstate', () => {
|
|
18
|
-
trackPageView();
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
function generateTraceId() {
|
|
22
|
-
const bytes = new Uint8Array(16);
|
|
23
|
-
crypto.getRandomValues(bytes);
|
|
24
|
-
return Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
25
|
-
}
|
|
26
|
-
function generateSpanId() {
|
|
27
|
-
const bytes = new Uint8Array(8);
|
|
28
|
-
crypto.getRandomValues(bytes);
|
|
29
|
-
return Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
30
|
-
}
|
|
31
|
-
function trackPageView() {
|
|
32
|
-
const traceId = generateTraceId();
|
|
33
|
-
const spanId = generateSpanId();
|
|
34
|
-
pushEvent({
|
|
35
|
-
event_type: 'pageview',
|
|
36
|
-
event_name: document.title,
|
|
37
|
-
duration_ms: getNavigationLoadTime(),
|
|
38
|
-
trace_id: traceId,
|
|
39
|
-
span_id: spanId,
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
function getNavigationLoadTime() {
|
|
43
|
-
if (typeof performance === 'undefined')
|
|
44
|
-
return 0;
|
|
45
|
-
const entries = performance.getEntriesByType('navigation');
|
|
46
|
-
if (entries.length > 0) {
|
|
47
|
-
return entries[0].loadEventEnd - entries[0].startTime;
|
|
48
|
-
}
|
|
49
|
-
return 0;
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=pageview.js.map
|
package/dist/pageview.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pageview.js","sourceRoot":"","sources":["../src/pageview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,MAAM,UAAU,aAAa;IAC3B,0BAA0B;IAC1B,aAAa,EAAE,CAAA;IAEf,mDAAmD;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEtD,OAAO,CAAC,SAAS,GAAG,UAAU,GAAG,IAAiC;QAChE,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAA;QACjB,aAAa,EAAE,CAAA;IACjB,CAAC,CAAA;IAED,OAAO,CAAC,YAAY,GAAG,UAAU,GAAG,IAAoC;QACtE,WAAW,CAAC,GAAG,IAAI,CAAC,CAAA;QACpB,aAAa,EAAE,CAAA;IACjB,CAAC,CAAA;IAED,0BAA0B;IAC1B,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE;QACvC,aAAa,EAAE,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IAC/B,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,OAAO,GAAG,eAAe,EAAE,CAAA;IACjC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAE/B,SAAS,CAAC;QACR,UAAU,EAAE,UAAU;QACtB,UAAU,EAAE,QAAQ,CAAC,KAAK;QAC1B,WAAW,EAAE,qBAAqB,EAAE;QACpC,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,MAAM;KAChB,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,qBAAqB;IAC5B,IAAI,OAAO,WAAW,KAAK,WAAW;QAAE,OAAO,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAkC,CAAA;IAC3F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACvD,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC"}
|
package/dist/replay.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session replay recorder — captures rrweb DOM snapshots and mutation events
|
|
3
|
-
* and streams them in chunks to the Rush replay ingest endpoint.
|
|
4
|
-
*
|
|
5
|
-
* Must be called only after `configure()` (i.e. inside `RushRUM.init`).
|
|
6
|
-
*/
|
|
7
|
-
import type { RushRUMConfig } from './types';
|
|
8
|
-
export declare function initReplay(config: RushRUMConfig): void;
|
|
9
|
-
//# sourceMappingURL=replay.d.ts.map
|
package/dist/replay.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAyC5C,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAyBtD"}
|
package/dist/replay.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { getSessionId } from './session';
|
|
2
|
-
const CHUNK_SIZE = 50; // flush after this many events
|
|
3
|
-
const FLUSH_INTERVAL_MS = 5000; // flush every 5 s regardless
|
|
4
|
-
let _config = null;
|
|
5
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
-
let _buffer = [];
|
|
7
|
-
let _chunkIdx = 0;
|
|
8
|
-
let _flushTimer = null;
|
|
9
|
-
function replayEndpoint() {
|
|
10
|
-
const cfg = _config;
|
|
11
|
-
if (cfg.replayEndpoint)
|
|
12
|
-
return cfg.replayEndpoint;
|
|
13
|
-
// Derive from the event ingest endpoint: replace /rum/ingest with /rum/replay/ingest
|
|
14
|
-
return cfg.endpoint.replace(/\/rum\/ingest$/, '/rum/replay/ingest');
|
|
15
|
-
}
|
|
16
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
|
-
function sendChunk(events) {
|
|
18
|
-
if (!_config || events.length === 0)
|
|
19
|
-
return;
|
|
20
|
-
const payload = {
|
|
21
|
-
session_id: getSessionId(),
|
|
22
|
-
app_name: _config.app.name,
|
|
23
|
-
chunk_idx: _chunkIdx++,
|
|
24
|
-
events,
|
|
25
|
-
};
|
|
26
|
-
fetch(replayEndpoint(), {
|
|
27
|
-
method: 'POST',
|
|
28
|
-
headers: { 'Content-Type': 'application/json' },
|
|
29
|
-
body: JSON.stringify(payload),
|
|
30
|
-
keepalive: true,
|
|
31
|
-
}).catch(() => { });
|
|
32
|
-
}
|
|
33
|
-
function flushBuffer() {
|
|
34
|
-
if (_buffer.length === 0)
|
|
35
|
-
return;
|
|
36
|
-
sendChunk(_buffer.splice(0));
|
|
37
|
-
}
|
|
38
|
-
export function initReplay(config) {
|
|
39
|
-
_config = config;
|
|
40
|
-
// Dynamically import rrweb so it doesn't bloat pages that don't enable replay
|
|
41
|
-
import('rrweb').then(({ record }) => {
|
|
42
|
-
record({
|
|
43
|
-
emit(event) {
|
|
44
|
-
_buffer.push(event);
|
|
45
|
-
if (_buffer.length >= CHUNK_SIZE) {
|
|
46
|
-
flushBuffer();
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
maskAllInputs: true, // mask form fields for privacy
|
|
50
|
-
maskTextSelector: '[data-pii]', // opt-in masking of PII text nodes
|
|
51
|
-
});
|
|
52
|
-
}).catch(() => {
|
|
53
|
-
// rrweb not installed — replay silently disabled
|
|
54
|
-
});
|
|
55
|
-
_flushTimer = setInterval(flushBuffer, FLUSH_INTERVAL_MS);
|
|
56
|
-
document.addEventListener('visibilitychange', () => {
|
|
57
|
-
if (document.visibilityState === 'hidden')
|
|
58
|
-
flushBuffer();
|
|
59
|
-
});
|
|
60
|
-
window.addEventListener('pagehide', flushBuffer);
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=replay.js.map
|
package/dist/replay.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,MAAM,UAAU,GAAG,EAAE,CAAA,CAAU,+BAA+B;AAC9D,MAAM,iBAAiB,GAAG,IAAK,CAAA,CAAC,6BAA6B;AAE7D,IAAI,OAAO,GAAyB,IAAI,CAAA;AACxC,8DAA8D;AAC9D,IAAI,OAAO,GAAU,EAAE,CAAA;AACvB,IAAI,SAAS,GAAG,CAAC,CAAA;AACjB,IAAI,WAAW,GAA0C,IAAI,CAAA;AAE7D,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAQ,CAAA;IACpB,IAAI,GAAG,CAAC,cAAc;QAAE,OAAO,GAAG,CAAC,cAAc,CAAA;IACjD,qFAAqF;IACrF,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAA;AACrE,CAAC;AAED,8DAA8D;AAC9D,SAAS,SAAS,CAAC,MAAa;IAC9B,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAC3C,MAAM,OAAO,GAAG;QACd,UAAU,EAAE,YAAY,EAAE;QAC1B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;QAC1B,SAAS,EAAE,SAAS,EAAE;QACtB,MAAM;KACP,CAAA;IACD,KAAK,CAAC,cAAc,EAAE,EAAE;QACtB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAC7B,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAqB,CAAC,CAAC,CAAA;AACvC,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAChC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC9C,OAAO,GAAG,MAAM,CAAA;IAEhB,8EAA8E;IAC9E,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,MAAM,CAAC;YACL,IAAI,CAAC,KAAK;gBACR,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACnB,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;oBACjC,WAAW,EAAE,CAAA;gBACf,CAAC;YACH,CAAC;YACD,aAAa,EAAE,IAAI,EAAM,+BAA+B;YACxD,gBAAgB,EAAE,YAAY,EAAE,mCAAmC;SACpE,CAAC,CAAA;IACJ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACZ,iDAAiD;IACnD,CAAC,CAAC,CAAA;IAEF,WAAW,GAAG,WAAW,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAA;IAEzD,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACjD,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ;YAAE,WAAW,EAAE,CAAA;IAC1D,CAAC,CAAC,CAAA;IACF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;AAClD,CAAC"}
|
package/dist/resources.d.ts
DELETED
package/dist/resources.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,IAAI,IAAI,CAGpC"}
|
package/dist/resources.js
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { pushEvent, getConfig } from './core';
|
|
2
|
-
export function initResources() {
|
|
3
|
-
patchFetch();
|
|
4
|
-
patchXHR();
|
|
5
|
-
}
|
|
6
|
-
function shouldTraceOrigin(url) {
|
|
7
|
-
const cfg = getConfig();
|
|
8
|
-
if (!cfg?.propagateTraces?.origins)
|
|
9
|
-
return false;
|
|
10
|
-
return cfg.propagateTraces.origins.some((re) => re.test(url));
|
|
11
|
-
}
|
|
12
|
-
function generateTraceId() {
|
|
13
|
-
const bytes = new Uint8Array(16);
|
|
14
|
-
crypto.getRandomValues(bytes);
|
|
15
|
-
return Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
16
|
-
}
|
|
17
|
-
function generateSpanId() {
|
|
18
|
-
const bytes = new Uint8Array(8);
|
|
19
|
-
crypto.getRandomValues(bytes);
|
|
20
|
-
return Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
21
|
-
}
|
|
22
|
-
function patchFetch() {
|
|
23
|
-
const origFetch = window.fetch.bind(window);
|
|
24
|
-
window.fetch = async function (input, init) {
|
|
25
|
-
const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
26
|
-
const start = performance.now();
|
|
27
|
-
let traceId = '';
|
|
28
|
-
let spanId = '';
|
|
29
|
-
if (shouldTraceOrigin(url)) {
|
|
30
|
-
traceId = generateTraceId();
|
|
31
|
-
spanId = generateSpanId();
|
|
32
|
-
const headers = new Headers(init?.headers);
|
|
33
|
-
headers.set('traceparent', `00-${traceId}-${spanId}-01`);
|
|
34
|
-
init = { ...init, headers };
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
const response = await origFetch(input, init);
|
|
38
|
-
const durationMs = performance.now() - start;
|
|
39
|
-
pushEvent({
|
|
40
|
-
event_type: 'resource',
|
|
41
|
-
event_name: url,
|
|
42
|
-
duration_ms: durationMs,
|
|
43
|
-
trace_id: traceId,
|
|
44
|
-
span_id: spanId,
|
|
45
|
-
attributes: JSON.stringify({ status: response.status, method: init?.method ?? 'GET' }),
|
|
46
|
-
});
|
|
47
|
-
return response;
|
|
48
|
-
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
const durationMs = performance.now() - start;
|
|
51
|
-
pushEvent({
|
|
52
|
-
event_type: 'resource',
|
|
53
|
-
event_name: url,
|
|
54
|
-
duration_ms: durationMs,
|
|
55
|
-
trace_id: traceId,
|
|
56
|
-
span_id: spanId,
|
|
57
|
-
error_message: err instanceof Error ? err.message : 'fetch failed',
|
|
58
|
-
error_type: 'NetworkError',
|
|
59
|
-
});
|
|
60
|
-
throw err;
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
function patchXHR() {
|
|
65
|
-
const origOpen = XMLHttpRequest.prototype.open;
|
|
66
|
-
const origSend = XMLHttpRequest.prototype.send;
|
|
67
|
-
XMLHttpRequest.prototype.open = function (method, url, ...rest) {
|
|
68
|
-
this.__wide_url = typeof url === 'string' ? url : url.href;
|
|
69
|
-
this.__wide_method = method;
|
|
70
|
-
return origOpen.apply(this, [method, url, ...rest]);
|
|
71
|
-
};
|
|
72
|
-
XMLHttpRequest.prototype.send = function (body) {
|
|
73
|
-
const url = this.__wide_url ?? '';
|
|
74
|
-
const method = this.__wide_method ?? 'GET';
|
|
75
|
-
const start = performance.now();
|
|
76
|
-
let traceId = '';
|
|
77
|
-
let spanId = '';
|
|
78
|
-
if (shouldTraceOrigin(url)) {
|
|
79
|
-
traceId = generateTraceId();
|
|
80
|
-
spanId = generateSpanId();
|
|
81
|
-
this.setRequestHeader('traceparent', `00-${traceId}-${spanId}-01`);
|
|
82
|
-
}
|
|
83
|
-
this.addEventListener('loadend', () => {
|
|
84
|
-
const durationMs = performance.now() - start;
|
|
85
|
-
pushEvent({
|
|
86
|
-
event_type: 'resource',
|
|
87
|
-
event_name: url,
|
|
88
|
-
duration_ms: durationMs,
|
|
89
|
-
trace_id: traceId,
|
|
90
|
-
span_id: spanId,
|
|
91
|
-
attributes: JSON.stringify({ status: this.status, method }),
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
return origSend.call(this, body);
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=resources.js.map
|
package/dist/resources.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
DELETED
package/dist/session.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAeA,wBAAgB,YAAY,IAAI,MAAM,CAmBrC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAInC"}
|
package/dist/session.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
const SESSION_KEY = 'rush_rum_sid';
|
|
2
|
-
const SESSION_TS_KEY = 'rush_rum_sts';
|
|
3
|
-
const TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
4
|
-
function generateId() {
|
|
5
|
-
if (typeof crypto !== 'undefined' && crypto.randomUUID) {
|
|
6
|
-
return crypto.randomUUID();
|
|
7
|
-
}
|
|
8
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
9
|
-
const r = (Math.random() * 16) | 0;
|
|
10
|
-
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
11
|
-
return v.toString(16);
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
export function getSessionId() {
|
|
15
|
-
try {
|
|
16
|
-
const stored = sessionStorage.getItem(SESSION_KEY);
|
|
17
|
-
const ts = sessionStorage.getItem(SESSION_TS_KEY);
|
|
18
|
-
const now = Date.now();
|
|
19
|
-
if (stored && ts && now - Number(ts) < TIMEOUT_MS) {
|
|
20
|
-
sessionStorage.setItem(SESSION_TS_KEY, String(now));
|
|
21
|
-
return stored;
|
|
22
|
-
}
|
|
23
|
-
const id = generateId();
|
|
24
|
-
sessionStorage.setItem(SESSION_KEY, id);
|
|
25
|
-
sessionStorage.setItem(SESSION_TS_KEY, String(now));
|
|
26
|
-
return id;
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
// sessionStorage not available (e.g. incognito overflow)
|
|
30
|
-
return generateId();
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
export function touchSession() {
|
|
34
|
-
try {
|
|
35
|
-
sessionStorage.setItem(SESSION_TS_KEY, String(Date.now()));
|
|
36
|
-
}
|
|
37
|
-
catch { /* ignore */ }
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=session.js.map
|
package/dist/session.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,cAAc,CAAA;AAClC,MAAM,cAAc,GAAG,cAAc,CAAA;AACrC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,aAAa;AAE/C,SAAS,UAAU;IACjB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC,UAAU,EAAE,CAAA;IAC5B,CAAC;IACD,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACnE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;QAClC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;QACzC,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAClD,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEtB,IAAI,MAAM,IAAI,EAAE,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC;YAClD,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;YACnD,OAAO,MAAM,CAAA;QACf,CAAC;QAED,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;QACvB,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QACvC,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QACnD,OAAO,EAAE,CAAA;IACX,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;QACzD,OAAO,UAAU,EAAE,CAAA;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5D,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/types.d.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
export interface RushRUMConfig {
|
|
2
|
-
endpoint: string;
|
|
3
|
-
app: {
|
|
4
|
-
name: string;
|
|
5
|
-
version?: string;
|
|
6
|
-
};
|
|
7
|
-
environment?: string;
|
|
8
|
-
user?: () => {
|
|
9
|
-
id?: string;
|
|
10
|
-
} | null;
|
|
11
|
-
sampleRate?: number;
|
|
12
|
-
trackWebVitals?: boolean;
|
|
13
|
-
trackErrors?: boolean;
|
|
14
|
-
trackInteractions?: boolean;
|
|
15
|
-
trackResources?: boolean;
|
|
16
|
-
trackPageViews?: boolean;
|
|
17
|
-
propagateTraces?: {
|
|
18
|
-
origins: RegExp[];
|
|
19
|
-
};
|
|
20
|
-
trackSessionReplay?: boolean;
|
|
21
|
-
/** Override the replay ingest endpoint (defaults to endpoint with /rum/replay/ingest) */
|
|
22
|
-
replayEndpoint?: string;
|
|
23
|
-
}
|
|
24
|
-
export interface RumMeta {
|
|
25
|
-
app_name: string;
|
|
26
|
-
app_version: string;
|
|
27
|
-
environment: string;
|
|
28
|
-
session_id: string;
|
|
29
|
-
user_id: string;
|
|
30
|
-
page_url: string;
|
|
31
|
-
page_path: string;
|
|
32
|
-
view_name: string;
|
|
33
|
-
referrer: string;
|
|
34
|
-
browser_name: string;
|
|
35
|
-
browser_version: string;
|
|
36
|
-
os_name: string;
|
|
37
|
-
os_version: string;
|
|
38
|
-
device_type: string;
|
|
39
|
-
screen_width: number;
|
|
40
|
-
screen_height: number;
|
|
41
|
-
}
|
|
42
|
-
export interface RumEvent {
|
|
43
|
-
event_type: string;
|
|
44
|
-
event_name?: string;
|
|
45
|
-
timestamp?: number;
|
|
46
|
-
vital_name?: string;
|
|
47
|
-
vital_value?: number;
|
|
48
|
-
vital_rating?: string;
|
|
49
|
-
error_message?: string;
|
|
50
|
-
error_stack?: string;
|
|
51
|
-
error_type?: string;
|
|
52
|
-
interaction_target?: string;
|
|
53
|
-
interaction_type?: string;
|
|
54
|
-
duration_ms?: number;
|
|
55
|
-
trace_id?: string;
|
|
56
|
-
span_id?: string;
|
|
57
|
-
attributes?: string;
|
|
58
|
-
}
|
|
59
|
-
export interface RumPayload {
|
|
60
|
-
meta: RumMeta;
|
|
61
|
-
events: RumEvent[];
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACnC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,eAAe,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IACvC,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,QAAQ,EAAE,CAAA;CACnB"}
|
package/dist/types.js
DELETED
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/vitals.d.ts
DELETED
package/dist/vitals.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vitals.d.ts","sourceRoot":"","sources":["../src/vitals.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,IAAI,IAAI,CAoBjC"}
|
package/dist/vitals.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { pushEvent } from './core';
|
|
2
|
-
export function initVitals() {
|
|
3
|
-
// Dynamic import so the SDK works even if web-vitals isn't available
|
|
4
|
-
import('web-vitals').then(({ onLCP, onCLS, onINP, onFCP, onTTFB }) => {
|
|
5
|
-
const report = (name) => (metric) => {
|
|
6
|
-
pushEvent({
|
|
7
|
-
event_type: 'web_vital',
|
|
8
|
-
vital_name: name,
|
|
9
|
-
vital_value: metric.value,
|
|
10
|
-
vital_rating: metric.rating,
|
|
11
|
-
});
|
|
12
|
-
};
|
|
13
|
-
onLCP(report('LCP'));
|
|
14
|
-
onCLS(report('CLS'));
|
|
15
|
-
onINP(report('INP'));
|
|
16
|
-
onFCP(report('FCP'));
|
|
17
|
-
onTTFB(report('TTFB'));
|
|
18
|
-
}).catch(() => {
|
|
19
|
-
// web-vitals not available — skip
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=vitals.js.map
|
package/dist/vitals.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vitals.js","sourceRoot":"","sources":["../src/vitals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,MAAM,UAAU,UAAU;IACxB,qEAAqE;IACrE,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;QACnE,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,MAAyC,EAAE,EAAE;YAC7E,SAAS,CAAC;gBACR,UAAU,EAAE,WAAW;gBACvB,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,MAAM,CAAC,KAAK;gBACzB,YAAY,EAAE,MAAM,CAAC,MAAM;aAC5B,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACpB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACpB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACpB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACxB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACZ,kCAAkC;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC"}
|