@newtalaria/browser 0.1.10 → 0.1.12
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 +3 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/index.js +184 -1
- package/dist/index.js.map +4 -4
- package/dist/sdk_meta.d.ts +4 -0
- package/dist/sdk_meta.d.ts.map +1 -0
- package/dist/talaria.browser.iife.js +184 -1
- package/dist/talaria.browser.iife.js.map +4 -4
- package/dist/utils/browser_context.d.ts +28 -0
- package/dist/utils/browser_context.d.ts.map +1 -0
- package/dist/utils/browser_extension_noise.d.ts +11 -0
- package/dist/utils/browser_extension_noise.d.ts.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -53,7 +53,9 @@ await Talaria.flush();
|
|
|
53
53
|
await Talaria.close();
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
`Talaria.init` also installs `window.onerror` / `unhandledrejection` handlers unless you pass `disableDefaultIntegrations: true`. Opaque cross-origin `"Script error."` events (no usable `Error` object) are ignored by default.
|
|
56
|
+
`Talaria.init` also installs `window.onerror` / `unhandledrejection` handlers unless you pass `disableDefaultIntegrations: true`. Opaque cross-origin `"Script error."` events (no usable `Error` object) are ignored by default. Errors from browser extensions (`chrome-extension://`, `moz-extension://`, etc.) are also ignored.
|
|
57
|
+
|
|
58
|
+
Every ingested event includes browser runtime tags (`browser.name`, `browser.version`, `os.name`, `os.version`, `device`) and `extra.browser` / `extra.sdk` for triage.
|
|
57
59
|
|
|
58
60
|
Optional init `tags` are merged into every captured event (per-call tags win on key conflict).
|
|
59
61
|
|
package/dist/client.d.ts
CHANGED
|
@@ -34,6 +34,8 @@ export declare class TalariaClient {
|
|
|
34
34
|
private linkableReplayId;
|
|
35
35
|
/** Last error-clip paint/upload failure (cleared on successful segment 0). */
|
|
36
36
|
private lastReplayCaptureFailure;
|
|
37
|
+
/** Cached once per init for event tags/extra. */
|
|
38
|
+
private browserContext;
|
|
37
39
|
init(options: TalariaInitOptions): void;
|
|
38
40
|
getReplayId(): string | null;
|
|
39
41
|
captureException(error: unknown, context?: CaptureContext): Promise<void>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,aAAa,EACb,kBAAkB,EACnB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,21 @@ function createId() {
|
|
|
15
15
|
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
// src/utils/browser_extension_noise.ts
|
|
19
|
+
var EXTENSION_URL = /(?:chrome|moz|safari|safari-web|ms-browser)-extension:\/\//i;
|
|
20
|
+
var WEBKIT_MASKED = /webkit-masked-url:\/\/hidden\//i;
|
|
21
|
+
function isBrowserExtensionNoise(opts) {
|
|
22
|
+
const filename = opts.filename ?? "";
|
|
23
|
+
if (EXTENSION_URL.test(filename) || WEBKIT_MASKED.test(filename)) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
const stack = opts.stack ?? "";
|
|
27
|
+
if (EXTENSION_URL.test(stack) || WEBKIT_MASKED.test(stack)) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
18
33
|
// src/utils/opaque_script_error.ts
|
|
19
34
|
function isOpaqueCrossOriginScriptError(event) {
|
|
20
35
|
const msg = (event.message ?? "").trim();
|
|
@@ -23,6 +38,137 @@ function isOpaqueCrossOriginScriptError(event) {
|
|
|
23
38
|
return true;
|
|
24
39
|
}
|
|
25
40
|
|
|
41
|
+
// src/utils/browser_context.ts
|
|
42
|
+
function parseBrowserContext(ua = typeof navigator !== "undefined" ? navigator.userAgent : "", language = typeof navigator !== "undefined" ? navigator.language : "") {
|
|
43
|
+
const userAgent = ua || "";
|
|
44
|
+
const lang = language || "";
|
|
45
|
+
let name = "unknown";
|
|
46
|
+
let version = "";
|
|
47
|
+
const rules = [
|
|
48
|
+
{ name: "Edge", re: /Edg(?:e|A|iOS)?\/([\d.]+)/ },
|
|
49
|
+
{ name: "Opera", re: /OPR\/([\d.]+)/ },
|
|
50
|
+
{ name: "Samsung Internet", re: /SamsungBrowser\/([\d.]+)/ },
|
|
51
|
+
{ name: "Firefox", re: /Firefox\/([\d.]+)/ },
|
|
52
|
+
{ name: "Chrome", re: /(?:Chrome|CriOS)\/([\d.]+)/ },
|
|
53
|
+
{ name: "Safari", re: /Version\/([\d.]+).*Safari/ }
|
|
54
|
+
];
|
|
55
|
+
for (const rule2 of rules) {
|
|
56
|
+
const m = userAgent.match(rule2.re);
|
|
57
|
+
if (m) {
|
|
58
|
+
name = rule2.name;
|
|
59
|
+
version = m[1] ?? "";
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (name === "unknown" && /iPhone|iPad|iPod/.test(userAgent) && /AppleWebKit/.test(userAgent)) {
|
|
64
|
+
name = "Safari";
|
|
65
|
+
const m = userAgent.match(/OS ([\d_]+)/);
|
|
66
|
+
if (m?.[1]) version = m[1].replace(/_/g, ".");
|
|
67
|
+
}
|
|
68
|
+
let os = "unknown";
|
|
69
|
+
let osVersion = "";
|
|
70
|
+
const win = userAgent.match(/Windows NT ([\d.]+)/);
|
|
71
|
+
if (win) {
|
|
72
|
+
os = "Windows";
|
|
73
|
+
osVersion = win[1] ?? "";
|
|
74
|
+
} else {
|
|
75
|
+
const android = userAgent.match(/Android ([\d.]+)/);
|
|
76
|
+
if (android) {
|
|
77
|
+
os = "Android";
|
|
78
|
+
osVersion = android[1] ?? "";
|
|
79
|
+
} else {
|
|
80
|
+
const ios = userAgent.match(/(?:iPhone|iPad|iPod).*OS ([\d_]+)/);
|
|
81
|
+
if (ios) {
|
|
82
|
+
os = "iOS";
|
|
83
|
+
osVersion = (ios[1] ?? "").replace(/_/g, ".");
|
|
84
|
+
} else {
|
|
85
|
+
const mac = userAgent.match(/Mac OS X ([\d_]+)/);
|
|
86
|
+
if (mac) {
|
|
87
|
+
os = "macOS";
|
|
88
|
+
osVersion = (mac[1] ?? "").replace(/_/g, ".");
|
|
89
|
+
} else if (/CrOS/.test(userAgent)) {
|
|
90
|
+
os = "Chrome OS";
|
|
91
|
+
} else if (/Linux/.test(userAgent)) {
|
|
92
|
+
os = "Linux";
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
let device = "desktop";
|
|
98
|
+
if (/iPad|Tablet|Android(?!.*Mobile)/i.test(userAgent)) {
|
|
99
|
+
device = "tablet";
|
|
100
|
+
} else if (/Mobi|iPhone|iPod|Android.*Mobile/i.test(userAgent)) {
|
|
101
|
+
device = "mobile";
|
|
102
|
+
} else if (!userAgent) {
|
|
103
|
+
device = "unknown";
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
name,
|
|
107
|
+
version,
|
|
108
|
+
os,
|
|
109
|
+
osVersion,
|
|
110
|
+
device,
|
|
111
|
+
language: lang,
|
|
112
|
+
userAgent
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function browserContextTags(ctx) {
|
|
116
|
+
return {
|
|
117
|
+
"browser.name": ctx.name,
|
|
118
|
+
"browser.version": ctx.version || "unknown",
|
|
119
|
+
"os.name": ctx.os,
|
|
120
|
+
"os.version": ctx.osVersion || "unknown",
|
|
121
|
+
device: ctx.device
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async function collectBrowserContext() {
|
|
125
|
+
const base = parseBrowserContext();
|
|
126
|
+
const nav = typeof navigator !== "undefined" ? navigator : void 0;
|
|
127
|
+
const uad = nav?.userAgentData;
|
|
128
|
+
if (!uad) return base;
|
|
129
|
+
if (uad.mobile === true) base.device = "mobile";
|
|
130
|
+
if (uad.platform) {
|
|
131
|
+
const p = uad.platform;
|
|
132
|
+
if (/Windows/i.test(p)) base.os = "Windows";
|
|
133
|
+
else if (/macOS|Mac OS/i.test(p)) base.os = "macOS";
|
|
134
|
+
else if (/Android/i.test(p)) base.os = "Android";
|
|
135
|
+
else if (/iOS|iPhone/i.test(p)) base.os = "iOS";
|
|
136
|
+
else if (/Linux/i.test(p)) base.os = "Linux";
|
|
137
|
+
else if (/Chrome OS|Chromium OS/i.test(p)) base.os = "Chrome OS";
|
|
138
|
+
else base.os = p;
|
|
139
|
+
}
|
|
140
|
+
const brands = uad.brands ?? [];
|
|
141
|
+
const interesting = brands.find(
|
|
142
|
+
(b) => !/Not.?A.?Brand/i.test(b.brand) && !/Chromium/i.test(b.brand)
|
|
143
|
+
);
|
|
144
|
+
if (interesting) {
|
|
145
|
+
base.name = interesting.brand.replace(/^Google /, "");
|
|
146
|
+
base.version = interesting.version;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
if (typeof uad.getHighEntropyValues === "function") {
|
|
150
|
+
const hi = await uad.getHighEntropyValues([
|
|
151
|
+
"platformVersion",
|
|
152
|
+
"fullVersionList"
|
|
153
|
+
]);
|
|
154
|
+
if (hi.platformVersion) base.osVersion = hi.platformVersion;
|
|
155
|
+
const full = hi.fullVersionList?.find(
|
|
156
|
+
(b) => !/Not.?A.?Brand/i.test(b.brand) && !/Chromium/i.test(b.brand)
|
|
157
|
+
);
|
|
158
|
+
if (full) {
|
|
159
|
+
base.name = full.brand.replace(/^Google /, "");
|
|
160
|
+
base.version = full.version;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
} catch {
|
|
164
|
+
}
|
|
165
|
+
return base;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// src/sdk_meta.ts
|
|
169
|
+
var SDK_NAME = "@newtalaria/browser";
|
|
170
|
+
var SDK_VERSION = "0.1.12";
|
|
171
|
+
|
|
26
172
|
// src/transport/serverpod.ts
|
|
27
173
|
var ServerpodTransport = class {
|
|
28
174
|
constructor(options) {
|
|
@@ -13536,6 +13682,8 @@ var TalariaClient = class {
|
|
|
13536
13682
|
this.linkableReplayId = null;
|
|
13537
13683
|
/** Last error-clip paint/upload failure (cleared on successful segment 0). */
|
|
13538
13684
|
this.lastReplayCaptureFailure = null;
|
|
13685
|
+
/** Cached once per init for event tags/extra. */
|
|
13686
|
+
this.browserContext = null;
|
|
13539
13687
|
}
|
|
13540
13688
|
init(options) {
|
|
13541
13689
|
if (this.options) {
|
|
@@ -13558,6 +13706,10 @@ var TalariaClient = class {
|
|
|
13558
13706
|
this.errorClipDeadlineMs = null;
|
|
13559
13707
|
this.linkableReplayId = null;
|
|
13560
13708
|
this.lastReplayCaptureFailure = null;
|
|
13709
|
+
this.browserContext = parseBrowserContext();
|
|
13710
|
+
void collectBrowserContext().then((ctx) => {
|
|
13711
|
+
if (this.options) this.browserContext = ctx;
|
|
13712
|
+
});
|
|
13561
13713
|
this.buffer = new SegmentBuffer();
|
|
13562
13714
|
this.uploadChain = Promise.resolve();
|
|
13563
13715
|
this.sessionSampled = Math.random() < this.options.replaysSessionSampleRate;
|
|
@@ -13627,6 +13779,14 @@ var TalariaClient = class {
|
|
|
13627
13779
|
}
|
|
13628
13780
|
async captureException(error, context) {
|
|
13629
13781
|
const err = error instanceof Error ? error : new Error(typeof error === "string" ? error : "Unknown error");
|
|
13782
|
+
const filename = typeof context?.extra?.filename === "string" ? context.extra.filename : void 0;
|
|
13783
|
+
if (isBrowserExtensionNoise({
|
|
13784
|
+
message: err.message,
|
|
13785
|
+
stack: err.stack,
|
|
13786
|
+
filename
|
|
13787
|
+
})) {
|
|
13788
|
+
return;
|
|
13789
|
+
}
|
|
13630
13790
|
await this.capture({
|
|
13631
13791
|
message: err.message || err.name || "Error",
|
|
13632
13792
|
level: "error",
|
|
@@ -13720,6 +13880,7 @@ var TalariaClient = class {
|
|
|
13720
13880
|
this.closed = false;
|
|
13721
13881
|
this.linkableReplayId = null;
|
|
13722
13882
|
this.lastReplayCaptureFailure = null;
|
|
13883
|
+
this.browserContext = null;
|
|
13723
13884
|
}
|
|
13724
13885
|
onRrwebEvent(event) {
|
|
13725
13886
|
if (this.closed || !this.options) return;
|
|
@@ -13803,13 +13964,28 @@ var TalariaClient = class {
|
|
|
13803
13964
|
}
|
|
13804
13965
|
const tags = applyReplayCaptureTags(
|
|
13805
13966
|
{
|
|
13967
|
+
...this.browserContext ? browserContextTags(this.browserContext) : {},
|
|
13806
13968
|
...this.options.tags ?? {},
|
|
13807
13969
|
...args.context?.tags ?? {}
|
|
13808
13970
|
},
|
|
13809
13971
|
errorClipOutcome
|
|
13810
13972
|
);
|
|
13811
13973
|
const extra = mergeReplayCaptureExtra(
|
|
13812
|
-
|
|
13974
|
+
{
|
|
13975
|
+
...this.browserContext ? {
|
|
13976
|
+
browser: {
|
|
13977
|
+
name: this.browserContext.name,
|
|
13978
|
+
version: this.browserContext.version,
|
|
13979
|
+
os: this.browserContext.os,
|
|
13980
|
+
osVersion: this.browserContext.osVersion,
|
|
13981
|
+
device: this.browserContext.device,
|
|
13982
|
+
language: this.browserContext.language,
|
|
13983
|
+
userAgent: this.browserContext.userAgent
|
|
13984
|
+
}
|
|
13985
|
+
} : {},
|
|
13986
|
+
sdk: { name: SDK_NAME, version: SDK_VERSION },
|
|
13987
|
+
...args.context?.extra
|
|
13988
|
+
},
|
|
13813
13989
|
errorClipOutcome
|
|
13814
13990
|
);
|
|
13815
13991
|
try {
|
|
@@ -14033,6 +14209,13 @@ var TalariaClient = class {
|
|
|
14033
14209
|
const onError = (event) => {
|
|
14034
14210
|
if (isOpaqueCrossOriginScriptError(event)) return;
|
|
14035
14211
|
const error = event.error instanceof Error ? event.error : new Error(event.message || "window.onerror");
|
|
14212
|
+
if (isBrowserExtensionNoise({
|
|
14213
|
+
message: event.message || error.message,
|
|
14214
|
+
stack: error.stack,
|
|
14215
|
+
filename: event.filename
|
|
14216
|
+
})) {
|
|
14217
|
+
return;
|
|
14218
|
+
}
|
|
14036
14219
|
void this.captureException(error, {
|
|
14037
14220
|
extra: {
|
|
14038
14221
|
filename: event.filename,
|