@newtalaria/browser 0.1.18 → 0.1.19
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 +62 -3
- package/dist/client.d.ts +12 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +499 -27
- package/dist/index.js.map +4 -4
- package/dist/talaria.browser.iife.js +481 -26
- package/dist/talaria.browser.iife.js.map +4 -4
- package/dist/transport/events.d.ts +4 -1
- package/dist/transport/events.d.ts.map +1 -1
- package/dist/types.d.ts +99 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/browser_context.d.ts +4 -3
- package/dist/utils/browser_context.d.ts.map +1 -1
- package/dist/utils/stacktrace.d.ts +35 -0
- package/dist/utils/stacktrace.d.ts.map +1 -0
- package/dist/utils/tags.d.ts +28 -0
- package/dist/utils/tags.d.ts.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -61,6 +61,35 @@ Every ingested event includes browser runtime tags (`browser.name`, `browser.ver
|
|
|
61
61
|
|
|
62
62
|
Optional init `tags` are merged into every captured event (per-call tags win on key conflict).
|
|
63
63
|
|
|
64
|
+
### Tags (low-cardinality dimensions)
|
|
65
|
+
|
|
66
|
+
Use **tags** for dimensions you will filter/group on (`feature`, `operation`, `service`, …). Put diagnostic fields (`business_id`, request payloads) in `extra` / capture context — not tags.
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
Talaria.init({
|
|
70
|
+
dsn: '…',
|
|
71
|
+
apiKey: '…',
|
|
72
|
+
environment: 'production',
|
|
73
|
+
tags: { service: 'admin-web', platform: 'web' },
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const checkout = Talaria.withTags({
|
|
77
|
+
feature: 'checkout',
|
|
78
|
+
operation: 'pay',
|
|
79
|
+
});
|
|
80
|
+
await checkout.captureMessage('Payment started', 'info');
|
|
81
|
+
await checkout.captureException(err, {
|
|
82
|
+
tags: { component: 'stripe' }, // merges on top of withTags
|
|
83
|
+
extra: { cart_id: 'abc123' }, // high-cardinality → extra
|
|
84
|
+
});
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Merge order (later wins):** automatic browser tags → init `tags` → `withTags` scope → per-call `context.tags`.
|
|
88
|
+
|
|
89
|
+
**Limits:** max 20 tags, key ≤64 (`[a-z0-9_.-]`), value ≤128, ~2KB total. Invalid keys are dropped. In non-production, high-cardinality-looking keys/values log a console warning.
|
|
90
|
+
|
|
91
|
+
Do **not** put `environment` / `release` in tags — use the first-class init fields.
|
|
92
|
+
|
|
64
93
|
`environment` must resolve to a wire value: `production` | `staging` | `development`. Common aliases are accepted (`test`/`uat` → `staging`, `prod`/`live` → `production`, `dev`/`local` → `development`), matching the PHP SDK. Invalid values throw at `init`. Permanent `events/ingest` 4xx responses disable further capture for that page session so misconfig cannot spin forever.
|
|
65
94
|
|
|
66
95
|
## Script tag (IIFE)
|
|
@@ -217,7 +246,7 @@ Both **`fetch`** and **`XMLHttpRequest`** are instrumented (`network.transport`:
|
|
|
217
246
|
|
|
218
247
|
We **do not** classify status 0 as `cors` — browsers do not expose that reliably. Tags include `network.party` (`first_party` \| `third_party`).
|
|
219
248
|
|
|
220
|
-
Promoted events use structured `extra` (server groups on method + host + path + kind + status)
|
|
249
|
+
Promoted events use structured `extra` (server groups on method + host + path + kind + status) plus a first-class `exception` with synthetic type `HttpError` | `NetworkError` | `TimeoutError`:
|
|
221
250
|
|
|
222
251
|
```json
|
|
223
252
|
{
|
|
@@ -231,11 +260,24 @@ Promoted events use structured `extra` (server groups on method + host + path +
|
|
|
231
260
|
},
|
|
232
261
|
"failure": { "kind": "network", "name": "TypeError", "message": "Failed to fetch" },
|
|
233
262
|
"network": { "party": "first_party", "durationMs": 842, "aborted": false, "ok": false },
|
|
234
|
-
"exception_class": "NetworkError",
|
|
235
263
|
"status_code": null
|
|
236
264
|
}
|
|
237
265
|
```
|
|
238
266
|
|
|
267
|
+
Wire `exception` (not `extra`):
|
|
268
|
+
|
|
269
|
+
```json
|
|
270
|
+
{
|
|
271
|
+
"values": [
|
|
272
|
+
{
|
|
273
|
+
"type": "NetworkError",
|
|
274
|
+
"value": "Network error: GET https://app.example.com/api/orders — TypeError: Failed to fetch",
|
|
275
|
+
"mechanism": { "type": "http", "handled": true, "synthetic": true }
|
|
276
|
+
}
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
239
281
|
Crawler UAs are tagged (`bot=true`, `bot.name=Baiduspider`) without inventing a browser name.
|
|
240
282
|
|
|
241
283
|
```ts
|
|
@@ -275,7 +317,21 @@ Hostname, pathname, full sanitized URL, and duration live in `extra` — not tag
|
|
|
275
317
|
|
|
276
318
|
#### Issue grouping (server)
|
|
277
319
|
|
|
278
|
-
Promoted network events set `
|
|
320
|
+
Promoted network events set first-class `exception.values[0].type` (`HttpError` \| `NetworkError` \| `TimeoutError`) and `extra.status_code`. The server fingerprints them on **method + hostname + pathname + failure kind + status** (not the human message), so query strings and volatile error text do not fragment Issues. See [`planning/fingerprints.md`](../../../planning/fingerprints.md) §6.4.
|
|
321
|
+
|
|
322
|
+
### Exceptions and stack frames
|
|
323
|
+
|
|
324
|
+
`captureException` sends:
|
|
325
|
+
|
|
326
|
+
| Field | Meaning |
|
|
327
|
+
| --- | --- |
|
|
328
|
+
| `platform` | Always `javascript` |
|
|
329
|
+
| `stackTrace` | Raw `Error.stack` string (kept for compatibility) |
|
|
330
|
+
| `exception.values[0]` | `type` = `err.name`, `value` = `err.message`, parsed `stacktrace.frames` (oldest → newest), `mechanism` |
|
|
331
|
+
|
|
332
|
+
Frames use wire field `functionName` (not `function`). `inApp` is **true** for same-origin frames (and `inAppOrigins` / `inAppAllowUrls`); **false** for cross-origin CDN/third-party scripts, `@newtalaria/browser`, `node_modules`, browser extensions, and `inAppDenyUrls`.
|
|
333
|
+
|
|
334
|
+
Global handlers set `mechanism.type` to `onerror` / `unhandledrejection` (`handled: false`). Manual captures default to `generic` (`handled: true`). Do **not** put `exception_class`, `file`, `line`, or `code` in `extra` — those belong on the exception / frame payload.
|
|
279
335
|
|
|
280
336
|
### Event timestamps
|
|
281
337
|
|
|
@@ -309,6 +365,9 @@ If replay upload runs before event ingest, `extra.sdk.queuedMs` records how long
|
|
|
309
365
|
| `failedRequestStatusCodes` | `[[500, 599]]` | Status codes/ranges to promote when origin is eligible |
|
|
310
366
|
| `failedRequestIgnoreUrls` | `[]` | URL substrings never promoted (Talaria `/events` + `/replays` always ignored) |
|
|
311
367
|
| `captureRequestQueryParameters` | `false` | Keep `?query` on network URLs after redaction (`includeNetworkUrlQuery` alias) |
|
|
368
|
+
| `inAppOrigins` | `[]` | Extra origins treated as app code for stack `inApp` (exact origin strings; same-origin always included) |
|
|
369
|
+
| `inAppAllowUrls` | `[]` | Path substrings or RegExps that force `inApp: true` |
|
|
370
|
+
| `inAppDenyUrls` | `[]` | Path substrings or RegExps that force `inApp: false` |
|
|
312
371
|
|
|
313
372
|
## Public API
|
|
314
373
|
|
package/dist/client.d.ts
CHANGED
|
@@ -49,6 +49,11 @@ export declare class TalariaClient {
|
|
|
49
49
|
getReplayId(): string | null;
|
|
50
50
|
captureException(error: unknown, context?: CaptureContext): Promise<void>;
|
|
51
51
|
captureMessage(message: string, level?: SeverityLevel, context?: CaptureContext): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Returns a scoped capture facade that merges [tags] into every event.
|
|
54
|
+
* Nested `withTags` calls merge further (later keys win).
|
|
55
|
+
*/
|
|
56
|
+
withTags(tags: Record<string, string>): ScopedTalaria;
|
|
52
57
|
flush(opts?: {
|
|
53
58
|
reason?: string;
|
|
54
59
|
keepalive?: boolean;
|
|
@@ -104,6 +109,7 @@ export declare class TalariaClient {
|
|
|
104
109
|
*/
|
|
105
110
|
private abortUnusableClip;
|
|
106
111
|
private stopUploadingAfterLimit;
|
|
112
|
+
private inAppFrameOptions;
|
|
107
113
|
private pruneRecentNetworkFailures;
|
|
108
114
|
private rememberNetworkFailure;
|
|
109
115
|
/**
|
|
@@ -125,4 +131,10 @@ export declare class TalariaClient {
|
|
|
125
131
|
private takeFittedSegment;
|
|
126
132
|
private finishOnServer;
|
|
127
133
|
}
|
|
134
|
+
/** Capture surface that inherits tags from `withTags`. */
|
|
135
|
+
export interface ScopedTalaria {
|
|
136
|
+
captureException(error: unknown, context?: CaptureContext): Promise<void>;
|
|
137
|
+
captureMessage(message: string, level?: SeverityLevel, context?: CaptureContext): Promise<void>;
|
|
138
|
+
withTags(tags: Record<string, string>): ScopedTalaria;
|
|
139
|
+
}
|
|
128
140
|
//# sourceMappingURL=client.d.ts.map
|
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,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -25,14 +25,19 @@ export declare const Talaria: {
|
|
|
25
25
|
init(options: TalariaInitOptions): void;
|
|
26
26
|
captureException(error: unknown, context?: CaptureContext): Promise<void>;
|
|
27
27
|
captureMessage(message: string, level?: SeverityLevel, context?: CaptureContext): Promise<void>;
|
|
28
|
+
withTags(tags: Record<string, string>): import("./client.js").ScopedTalaria;
|
|
28
29
|
getReplayId(): string | null;
|
|
29
30
|
flush(): Promise<void>;
|
|
30
31
|
close(): Promise<void>;
|
|
31
32
|
};
|
|
32
33
|
export { TalariaClient } from './client.js';
|
|
34
|
+
export type { ScopedTalaria } from './client.js';
|
|
35
|
+
export { mergeTags, normalizeTags, RESERVED_TAG_KEYS, } from './utils/tags.js';
|
|
33
36
|
export { computeErrorClipDeadlineMs, fitCompressedPrefix, isErrorClipBudgetExhausted, planOversizedRetry, } from './replay/fit_segment.js';
|
|
34
37
|
export { MAX_SEGMENTS_ERROR_CLIP, MAX_ERROR_CLIP_COMPRESSED_BYTES, TARGET_COMPRESSED_SEGMENT_BYTES, MAX_COMPRESSED_SEGMENT_BYTES, } from './replay/segment_buffer.js';
|
|
35
|
-
export type { CaptureContext, Environment, FailedRequestStatusCode, SeverityLevel, TalariaInitOptions, } from './types.js';
|
|
38
|
+
export type { CaptureContext, DebugImage, DebugMeta, Environment, ExceptionData, ExceptionMechanism, ExceptionValue, FailedRequestStatusCode, SeverityLevel, StackFrame, StackTrace, TalariaInitOptions, } from './types.js';
|
|
39
|
+
export { applySourceLocation, isInAppFrame, parseStackLine, parseStackTrace, resolvePageOrigin, } from './utils/stacktrace.js';
|
|
40
|
+
export type { InAppFrameOptions } from './utils/stacktrace.js';
|
|
36
41
|
export { REPLAY_CAPTURE_TAG, REPLAY_CAPTURE_REASON_TAG, } from './replay/capture_outcome.js';
|
|
37
42
|
export type { ReplayCaptureOutcome, ReplayCaptureReason, ReplayCaptureStatus, } from './replay/capture_outcome.js';
|
|
38
43
|
export default Talaria;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,OAAO;kBACJ,kBAAkB,GAAG,IAAI;4BAIf,OAAO,YAAY,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;4BAK9D,MAAM,UACP,aAAa,YACX,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;mBAID,MAAM,GAAG,IAAI;aAInB,OAAO,CAAC,IAAI,CAAC;aAIb,OAAO,CAAC,IAAI,CAAC;CAGvB,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,+BAA+B,EAC/B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,cAAc,EACd,WAAW,EACX,uBAAuB,EACvB,aAAa,EACb,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,eAAe,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,OAAO;kBACJ,kBAAkB,GAAG,IAAI;4BAIf,OAAO,YAAY,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;4BAK9D,MAAM,UACP,aAAa,YACX,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;mBAID,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;mBAItB,MAAM,GAAG,IAAI;aAInB,OAAO,CAAC,IAAI,CAAC;aAIb,OAAO,CAAC,IAAI,CAAC;CAGvB,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,+BAA+B,EAC/B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,uBAAuB,EACvB,aAAa,EACb,UAAU,EACV,UAAU,EACV,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,eAAe,OAAO,CAAC"}
|