@goliapkg/sentori-react-native 1.2.0 → 1.3.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.
@@ -0,0 +1,112 @@
1
+ /**
2
+ * v2.3 W6.3 — Sentry-compatible API surface.
3
+ *
4
+ * Drop-in for code (or LLM-generated code) written against
5
+ * `@sentry/react-native`. Every Sentry call maps to exactly one
6
+ * Sentori-native call internally. Translation differences (e.g.
7
+ * `Sentry.setUser({ ip_address })` — Sentori never stores IP) fire
8
+ * a one-shot console hint at `info` level, deduplicated per
9
+ * (api, dropped_field).
10
+ *
11
+ * Why this exists: LLMs have seen a LOT of Sentry code; letting
12
+ * them write the same syntax against Sentori is one less thing
13
+ * Sentori asks the host to think about. Combined with the v2.3
14
+ * "free bonus" stance — host adds Sentori without unlearning
15
+ * anything.
16
+ *
17
+ * Usage:
18
+ *
19
+ * import * as Sentry from '@goliapkg/sentori-react-native/compat'
20
+ *
21
+ * Sentry.init({ dsn: 'https://<token>@<host>/<projectId>', ... })
22
+ * Sentry.captureException(err)
23
+ * Sentry.setUser({ id, email }) // email → linkBy.email (hashed)
24
+ *
25
+ * The compat layer holds NO state of its own — it's a thin shim
26
+ * over the same Sentori internals. Mixing `Sentry.*` and
27
+ * `sentori.*` calls in the same app works fine.
28
+ *
29
+ * See `docs/design/sdk-v2.3-redesign.md` §4 for the full
30
+ * translation table + design rationale.
31
+ */
32
+ type SentryInitOpts = {
33
+ dsn: string;
34
+ environment?: string;
35
+ release?: string;
36
+ tracesSampleRate?: number;
37
+ sampleRate?: number;
38
+ attachStacktrace?: boolean;
39
+ autoSessionTracking?: boolean;
40
+ /** Sentry's `debug: true` ≈ Sentori's `logLevel: 'debug'`. */
41
+ debug?: boolean;
42
+ /** Catch-all for fields Sentori either ignores or doesn't map yet. */
43
+ [other: string]: unknown;
44
+ };
45
+ export declare function init(opts: SentryInitOpts): void;
46
+ /** Sentry's severity values, surfaced as strings (Sentori only
47
+ * uses 5 levels). `Log` and `Critical` collapse to `'info'` and
48
+ * `'fatal'` respectively. */
49
+ export declare const Severity: {
50
+ Fatal: "fatal";
51
+ Critical: "fatal";
52
+ Error: "error";
53
+ Warning: "warning";
54
+ Log: "info";
55
+ Info: "info";
56
+ Debug: "debug";
57
+ };
58
+ type SentryLevelString = 'critical' | 'debug' | 'error' | 'fatal' | 'info' | 'log' | 'warning';
59
+ type SentryCaptureContext = {
60
+ tags?: Record<string, string>;
61
+ extra?: Record<string, unknown>;
62
+ level?: SentryLevelString;
63
+ fingerprint?: string[];
64
+ user?: SentrySetUserInput;
65
+ };
66
+ export declare function captureException(err: unknown, hint?: {
67
+ captureContext?: SentryCaptureContext;
68
+ } | SentryCaptureContext): void;
69
+ export declare function captureMessage(msg: string, levelOrCtx?: SentryCaptureContext | SentryLevelString): void;
70
+ type SentrySetUserInput = {
71
+ id?: string;
72
+ email?: string;
73
+ username?: string;
74
+ ip_address?: string;
75
+ segment?: string;
76
+ [other: string]: unknown;
77
+ } | null;
78
+ export declare function setUser(user: SentrySetUserInput): void;
79
+ export declare const setTag: (key: string, value: string) => void;
80
+ export declare const setTags: (record: Record<string, string>) => void;
81
+ type SentryBreadcrumb = {
82
+ category?: string;
83
+ message?: string;
84
+ level?: SentryLevelString;
85
+ type?: 'default' | 'error' | 'http' | 'info' | 'navigation' | 'query' | 'user' | string;
86
+ data?: Record<string, unknown>;
87
+ timestamp?: number;
88
+ };
89
+ export declare function addBreadcrumb(crumb: SentryBreadcrumb): void;
90
+ export { close, flush } from '../lifecycle';
91
+ type SentrySpanOpts = {
92
+ op?: string;
93
+ name?: string;
94
+ description?: string;
95
+ tags?: Record<string, string>;
96
+ };
97
+ export declare function startTransaction(opts: SentrySpanOpts): {
98
+ finish: (status?: 'cancelled' | 'error' | 'ok') => void;
99
+ setStatus: (status: 'cancelled' | 'error' | 'ok') => void;
100
+ setTag: (k: string, v: string) => void;
101
+ startChild: (childOpts: SentrySpanOpts) => unknown;
102
+ };
103
+ type ScopeProxy = {
104
+ setTag: (k: string, v: string) => void;
105
+ setTags: (rec: Record<string, string>) => void;
106
+ setUser: (u: SentrySetUserInput) => void;
107
+ setExtra: (k: string, v: unknown) => void;
108
+ setLevel: (l: SentryLevelString) => void;
109
+ };
110
+ export declare function withScope<T>(fn: (scope: ScopeProxy) => T): T;
111
+ export declare function configureScope(fn: (scope: ScopeProxy) => void): void;
112
+ //# sourceMappingURL=sentry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.d.ts","sourceRoot":"","sources":["../../src/compat/sentry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,326 @@
1
+ /**
2
+ * v2.3 W6.3 — Sentry-compatible API surface.
3
+ *
4
+ * Drop-in for code (or LLM-generated code) written against
5
+ * `@sentry/react-native`. Every Sentry call maps to exactly one
6
+ * Sentori-native call internally. Translation differences (e.g.
7
+ * `Sentry.setUser({ ip_address })` — Sentori never stores IP) fire
8
+ * a one-shot console hint at `info` level, deduplicated per
9
+ * (api, dropped_field).
10
+ *
11
+ * Why this exists: LLMs have seen a LOT of Sentry code; letting
12
+ * them write the same syntax against Sentori is one less thing
13
+ * Sentori asks the host to think about. Combined with the v2.3
14
+ * "free bonus" stance — host adds Sentori without unlearning
15
+ * anything.
16
+ *
17
+ * Usage:
18
+ *
19
+ * import * as Sentry from '@goliapkg/sentori-react-native/compat'
20
+ *
21
+ * Sentry.init({ dsn: 'https://<token>@<host>/<projectId>', ... })
22
+ * Sentry.captureException(err)
23
+ * Sentry.setUser({ id, email }) // email → linkBy.email (hashed)
24
+ *
25
+ * The compat layer holds NO state of its own — it's a thin shim
26
+ * over the same Sentori internals. Mixing `Sentry.*` and
27
+ * `sentori.*` calls in the same app works fine.
28
+ *
29
+ * See `docs/design/sdk-v2.3-redesign.md` §4 for the full
30
+ * translation table + design rationale.
31
+ */
32
+ import { logger } from '@goliapkg/sentori-core';
33
+ import { addBreadcrumb as nativeAddBreadcrumb } from '../breadcrumbs';
34
+ import { captureException as nativeCaptureException, captureMessage as nativeCaptureMessage, setTag as nativeSetTag, setTags as nativeSetTags, setUser as nativeSetUser, } from '../capture';
35
+ import { init as nativeInit } from '../init';
36
+ // ── one-shot warn dedup ───────────────────────────────────────────────────
37
+ const _warnedOnce = new Set();
38
+ function warnOnce(key, msg) {
39
+ if (_warnedOnce.has(key))
40
+ return;
41
+ _warnedOnce.add(key);
42
+ logger.info('compat', msg);
43
+ }
44
+ function parseDsn(dsn) {
45
+ // Sentry DSN shape: `https://<key>@<host>[:port][/<projectId>]`
46
+ // Sentori cares about `<key>` (must be `st_pk_…`) and `<host>`.
47
+ let url;
48
+ try {
49
+ url = new URL(dsn);
50
+ }
51
+ catch {
52
+ throw new Error(`Sentory compat: dsn is not a valid URL: ${dsn}`);
53
+ }
54
+ const key = url.username;
55
+ if (!key) {
56
+ throw new Error(`Sentory compat: dsn missing token in user-info component`);
57
+ }
58
+ if (!key.startsWith('st_pk_')) {
59
+ throw new Error(`Sentory compat: dsn token must start with 'st_pk_' (got prefix '${key.slice(0, 8)}…'). ` +
60
+ `Sentori does not parse Sentry-issued tokens — generate a Sentori project token via the dashboard.`);
61
+ }
62
+ // strip user-info to reconstruct the ingest origin
63
+ const ingestUrl = `${url.protocol}//${url.host}`;
64
+ return { token: key, ingestUrl };
65
+ }
66
+ // ── Sentry.init ───────────────────────────────────────────────────────────
67
+ export function init(opts) {
68
+ const { token, ingestUrl } = parseDsn(opts.dsn);
69
+ const sentoriOpts = {
70
+ token,
71
+ release: opts.release ?? '',
72
+ ingestUrl,
73
+ ...(opts.environment ? { environment: opts.environment } : {}),
74
+ sample: {
75
+ ...(opts.tracesSampleRate !== undefined ? { traces: opts.tracesSampleRate } : {}),
76
+ ...(opts.sampleRate !== undefined ? { errors: opts.sampleRate } : {}),
77
+ },
78
+ ...(opts.debug ? { logLevel: 'debug' } : {}),
79
+ };
80
+ // Empty release is the most common Sentry-init mistake; warn but
81
+ // continue.
82
+ if (!sentoriOpts.release) {
83
+ warnOnce('init:no-release', 'Sentry.init() with no `release` — Sentori requires release for grouping + drop-down menus to make sense. Set `release: "myapp@1.2.3"` for production cuts.');
84
+ // Sentori's init throws when release is empty; provide a
85
+ // reasonable fallback so the rest of the code path works in dev.
86
+ sentoriOpts.release = `unspecified@${Date.now()}`;
87
+ }
88
+ // Pass-through informational hints for ignored fields.
89
+ for (const ignored of [
90
+ 'attachStacktrace',
91
+ 'autoSessionTracking',
92
+ 'integrations',
93
+ 'beforeSend',
94
+ 'beforeBreadcrumb',
95
+ 'maxBreadcrumbs',
96
+ ]) {
97
+ if (ignored in opts) {
98
+ warnOnce(`init:ignored:${ignored}`, `Sentry.init({ ${ignored} }) ignored. ` +
99
+ `${getIgnoredHint(ignored)}`);
100
+ }
101
+ }
102
+ nativeInit(sentoriOpts);
103
+ }
104
+ function getIgnoredHint(field) {
105
+ switch (field) {
106
+ case 'attachStacktrace':
107
+ return 'Sentori always sends stack traces — no toggle.';
108
+ case 'autoSessionTracking':
109
+ return "Sentori sessions are on by default; toggle via `init({ capture: { sessions: true|false } })`.";
110
+ case 'integrations':
111
+ return 'Sentori uses `init({ capture: {...} })` toggles instead of Integration classes — see the docs.';
112
+ case 'beforeSend':
113
+ case 'beforeBreadcrumb':
114
+ return 'Sentori does not support an arbitrary beforeSend hook today. Server-side PII scrubbing is automatic.';
115
+ case 'maxBreadcrumbs':
116
+ return 'Sentori uses a fixed 100-slot ring buffer.';
117
+ default:
118
+ return '';
119
+ }
120
+ }
121
+ // ── Severity / level enum ─────────────────────────────────────────────────
122
+ /** Sentry's severity values, surfaced as strings (Sentori only
123
+ * uses 5 levels). `Log` and `Critical` collapse to `'info'` and
124
+ * `'fatal'` respectively. */
125
+ export const Severity = {
126
+ Fatal: 'fatal',
127
+ Critical: 'fatal',
128
+ Error: 'error',
129
+ Warning: 'warning',
130
+ Log: 'info',
131
+ Info: 'info',
132
+ Debug: 'debug',
133
+ };
134
+ function mapLevel(level) {
135
+ if (!level)
136
+ return undefined;
137
+ switch (level) {
138
+ case 'critical':
139
+ warnOnce('severity:critical', "Sentry.Severity.Critical → mapped to 'fatal' (Sentori's 5-level syslog-style scale).");
140
+ return 'fatal';
141
+ case 'log':
142
+ warnOnce('severity:log', "Sentry.Severity.Log → mapped to 'info' (Sentori's 5-level scale has no separate Log).");
143
+ return 'info';
144
+ default:
145
+ return level;
146
+ }
147
+ }
148
+ export function captureException(err, hint) {
149
+ // Sentry v8+ takes the context inline (Hint); earlier versions
150
+ // wrapped it in `{ captureContext: {...} }`. Accept both.
151
+ const ctx = (() => {
152
+ if (!hint)
153
+ return undefined;
154
+ if ('captureContext' in hint) {
155
+ return hint.captureContext;
156
+ }
157
+ return hint;
158
+ })();
159
+ if (ctx?.extra) {
160
+ warnOnce('captureException:extra', 'Sentry.captureException(err, { extra }) → `extra` mapped to `tags` (Sentori does not have a separate extra namespace).');
161
+ }
162
+ if (ctx?.user) {
163
+ // Apply the per-call user via setUser (Sentori takes the
164
+ // current scope user automatically).
165
+ setUser(ctx.user);
166
+ }
167
+ const mergedTags = {
168
+ ...(ctx?.tags ?? {}),
169
+ ...(ctx?.extra
170
+ ? Object.fromEntries(Object.entries(ctx.extra).map(([k, v]) => [k, String(v)]))
171
+ : {}),
172
+ };
173
+ nativeCaptureException(err, {
174
+ ...(Object.keys(mergedTags).length > 0 ? { tags: mergedTags } : {}),
175
+ ...(ctx?.fingerprint ? { fingerprint: ctx.fingerprint } : {}),
176
+ });
177
+ }
178
+ // ── captureMessage ────────────────────────────────────────────────────────
179
+ export function captureMessage(msg, levelOrCtx) {
180
+ let level;
181
+ let tags;
182
+ if (typeof levelOrCtx === 'string') {
183
+ level = mapLevel(levelOrCtx);
184
+ }
185
+ else if (levelOrCtx) {
186
+ level = mapLevel(levelOrCtx.level);
187
+ tags = levelOrCtx.tags;
188
+ }
189
+ nativeCaptureMessage(msg, {
190
+ ...(level ? { level } : {}),
191
+ ...(tags ? { tags } : {}),
192
+ });
193
+ }
194
+ export function setUser(user) {
195
+ if (user == null) {
196
+ nativeSetUser(null);
197
+ return;
198
+ }
199
+ const { id, email, username, ip_address, segment, ...rest } = user;
200
+ if (ip_address !== undefined) {
201
+ warnOnce('setUser:ip_address', 'Sentry.setUser({ ip_address }) → dropped. Sentori never stores IP (privacy by design).');
202
+ }
203
+ if (segment !== undefined) {
204
+ warnOnce('setUser:segment', 'Sentry.setUser({ segment }) → mapped to tag `user.segment`. Set via setTag for clarity.');
205
+ if (typeof segment === 'string')
206
+ nativeSetTag('user.segment', segment);
207
+ }
208
+ const linkBy = {};
209
+ if (email)
210
+ linkBy.email = email;
211
+ if (username)
212
+ linkBy.username = username;
213
+ // Surface any other fields the host bolted on (Sentry historically
214
+ // accepted arbitrary keys) — they pass through as tags.
215
+ for (const [k, v] of Object.entries(rest)) {
216
+ if (v !== undefined && v !== null)
217
+ nativeSetTag(`user.${k}`, String(v));
218
+ }
219
+ nativeSetUser({
220
+ ...(id ? { id } : {}),
221
+ ...(Object.keys(linkBy).length > 0 ? { linkBy } : {}),
222
+ });
223
+ }
224
+ // ── setTag / setTags ──────────────────────────────────────────────────────
225
+ // Re-export Sentori-native semantics; identical signatures.
226
+ export const setTag = nativeSetTag;
227
+ export const setTags = nativeSetTags;
228
+ function mapCategoryToType(category) {
229
+ if (!category)
230
+ return undefined;
231
+ if (['auth', 'click', 'gesture', 'input', 'touch', 'ui'].includes(category))
232
+ return 'user';
233
+ if (['fetch', 'http', 'xhr'].includes(category))
234
+ return 'net';
235
+ if (['nav', 'navigation', 'route'].includes(category))
236
+ return 'nav';
237
+ if (['console', 'log', 'sentry'].includes(category))
238
+ return 'log';
239
+ return 'custom';
240
+ }
241
+ function mapSentryType(t) {
242
+ if (!t)
243
+ return undefined;
244
+ switch (t) {
245
+ case 'http':
246
+ return 'net';
247
+ case 'navigation':
248
+ return 'nav';
249
+ case 'user':
250
+ case 'log':
251
+ case 'custom':
252
+ return t;
253
+ default:
254
+ return 'custom';
255
+ }
256
+ }
257
+ export function addBreadcrumb(crumb) {
258
+ if (!crumb.message) {
259
+ crumb.message = crumb.category ?? crumb.type ?? '(no message)';
260
+ }
261
+ if (crumb.category && !crumb.type) {
262
+ warnOnce('breadcrumb:category', 'Sentry.addBreadcrumb({ category }) → mapped to `type` via well-known table; the category string itself is preserved under `data.category`.');
263
+ }
264
+ // RN SDK shape: { type, data }. No top-level `message` —
265
+ // Sentry's message goes into data.message.
266
+ nativeAddBreadcrumb({
267
+ type: mapSentryType(crumb.type) ?? mapCategoryToType(crumb.category) ?? 'custom',
268
+ data: {
269
+ message: crumb.message,
270
+ ...(crumb.data ?? {}),
271
+ ...(crumb.category ? { category: crumb.category } : {}),
272
+ ...(crumb.level ? { level: mapLevel(crumb.level) } : {}),
273
+ },
274
+ });
275
+ }
276
+ // ── flush / close ─────────────────────────────────────────────────────────
277
+ // Re-export Sentori native flush + close — same signatures.
278
+ export { close, flush } from '../lifecycle';
279
+ // ── startTransaction / startSpan / withScope ──────────────────────────────
280
+ // Trace mapping is non-trivial (Sentry's transaction object exposes
281
+ // startChild, etc.). v2.3 ships a minimum-viable Sentry trace
282
+ // surface that supports startTransaction returning a Sentori Span
283
+ // object with a partial Sentry-style API (.startChild, .finish).
284
+ // Anything beyond that throws a clear error directing to the native
285
+ // `sentori.startSpan` / `sentori.withScopedSpan`.
286
+ import { startSpan } from '@goliapkg/sentori-core';
287
+ export function startTransaction(opts) {
288
+ warnOnce('startTransaction', 'Sentry.startTransaction() → mapped to sentori.startSpan() with op as name. Native equivalent: sentori.startTrace(name) or sentori.startSpan({ name }).');
289
+ const name = opts.name ?? opts.op ?? 'transaction';
290
+ const span = startSpan(name, {
291
+ parent: null,
292
+ tags: opts.tags,
293
+ });
294
+ return {
295
+ finish: (status) => span.finish({ status: status === 'ok' ? 'ok' : 'error' }),
296
+ setStatus: (status) => { span.setTag('status', status); },
297
+ setTag: (k, v) => { span.setTag(k, v); },
298
+ startChild: (childOpts) => {
299
+ return startSpan(childOpts.name ?? childOpts.op ?? 'child', {
300
+ tags: childOpts.tags,
301
+ });
302
+ },
303
+ };
304
+ }
305
+ function scopeProxy() {
306
+ return {
307
+ setTag: nativeSetTag,
308
+ setTags: nativeSetTags,
309
+ setUser,
310
+ setExtra: (k, v) => nativeSetTag(`extra.${k}`, String(v)),
311
+ setLevel: () => {
312
+ warnOnce('scope:setLevel', 'Sentry.withScope(s => s.setLevel(…)) → not supported. Sentori levels travel on capture call, not on scope.');
313
+ },
314
+ };
315
+ }
316
+ export function withScope(fn) {
317
+ // Sentori has no Hub; tags set inside `fn` persist (best-effort
318
+ // approximation of Sentry semantics). For most callers this is
319
+ // fine; tighter isolation needs an actual Hub which we don't ship.
320
+ warnOnce('withScope', 'Sentry.withScope() → tag mutations are NOT auto-reverted on scope exit. Use sentori.setTag/clearTags explicitly for tight isolation.');
321
+ return fn(scopeProxy());
322
+ }
323
+ export function configureScope(fn) {
324
+ fn(scopeProxy());
325
+ }
326
+ //# sourceMappingURL=sentry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.js","sourceRoot":"","sources":["../../src/compat/sentry.ts"],"names":[],"mappings":"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"}
package/lib/init.d.ts CHANGED
@@ -100,6 +100,16 @@ export type InitOptions = {
100
100
  * via `sentori.captureMessage()`. `null` / absent → keep all. */
101
101
  messages?: null | number;
102
102
  };
103
+ /** v2.3 — canonical sampling field (renamed from `sampling`).
104
+ * Same shape; if both are passed, `sample` wins. The older
105
+ * `sampling` stays accepted indefinitely as a back-compat alias —
106
+ * this is the kind of rename that's only worth doing if it's
107
+ * also zero-cost for existing callers. */
108
+ sample?: {
109
+ errors?: null | number;
110
+ traces?: null | number;
111
+ messages?: null | number;
112
+ };
103
113
  /** v2.3 — Sentori SDK's own console output gate. Default `'warn'`:
104
114
  * SDK is silent unless something is genuinely broken (transport
105
115
  * sustained failure, native module not found, internal SDK
package/lib/init.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,UAAU,CAAC;AAerD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpE,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAUnF,OAAO,KAAK,EAAkB,cAAc,EAA2B,MAAM,SAAS,CAAC;AAIvF,MAAM,MAAM,WAAW,GAAG;IACxB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,OAAO,CAAC,EACJ,OAAO,GACP;YACE;;qEAEyD;YACzD,OAAO,CAAC,EAAE,OAAO,CAAC;SACnB,CAAC;QACN;;8DAEsD;QACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB;;;;;;;uBAOe;QACf,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB;;;6CAGqC;QACrC,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB;;;;6CAIqC;QACrC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;QACrC;;;;6CAIqC;QACrC,eAAe,CAAC,EAAE,OAAO,GAAG;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACrD;;;mEAG2D;QAC3D,MAAM,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG;YAAE,EAAE,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,KAAK,GAAG,WAAW,CAAA;SAAE,CAAC;QAC1E;;;;uCAI+B;QAC/B,cAAc,CAAC,EAAE,OAAO,GAAG;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACnE;;;6DAGqD;QACrD,SAAS,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;QACvC;;;sEAG8D;QAC9D,gBAAgB,CAAC,EAAE;YACjB,OAAO,EAAE,OAAO,CAAC;YACjB,qBAAqB,CAAC,EAAE,CACtB,IAAI,EAAE,OAAO,sBAAsB,EAAE,eAAe,KAElD,OAAO,sBAAsB,EAAE,iBAAiB,GAChD,OAAO,CAAC,OAAO,sBAAsB,EAAE,iBAAiB,CAAC,CAAC;YAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC;IACF;;;;;gEAK4D;IAC5D,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;QACvB;0EACkE;QAClE,QAAQ,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;KAC1B,CAAC;IACF;;;;8DAI0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,wBAAwB,EAAE,QAAQ,CAAC;IACrD;;iEAE6D;IAC7D,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACrC,CAAC;AAIF,eAAO,MAAM,IAAI,GAAI,SAAS,WAAW,KAAG,IA6N3C,CAAC;AAqBF,YAAY,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
package/lib/init.js CHANGED
@@ -50,9 +50,11 @@ export const init = (options) => {
50
50
  ingestUrl: options.ingestUrl ?? DEFAULT_INGEST_URL,
51
51
  enabled: true,
52
52
  screenshotsEnabled: options.capture?.screenshot === true,
53
- errorSampleRate: options.sampling?.errors ?? null,
54
- traceSampleRate: options.sampling?.traces ?? null,
55
- messageSampleRate: options.sampling?.messages ?? null,
53
+ // v2.3 — `sample` is the canonical name; `sampling` is the
54
+ // back-compat alias. If both are supplied, `sample` wins.
55
+ errorSampleRate: options.sample?.errors ?? options.sampling?.errors ?? null,
56
+ traceSampleRate: options.sample?.traces ?? options.sampling?.traces ?? null,
57
+ messageSampleRate: options.sample?.messages ?? options.sampling?.messages ?? null,
56
58
  sessionTrailEnabled: options.capture?.sessionTrail === true,
57
59
  });
58
60
  // Tell the native crash handler about the config so the JSON it writes
package/lib/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goliapkg/sentori-react-native",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Sentori SDK for React Native — JS-layer error capture, native crash handlers (iOS / Android), batched transport, fetch + react-navigation tracing.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://sentori.golia.jp",
@@ -22,6 +22,17 @@
22
22
  ],
23
23
  "main": "lib/index.js",
24
24
  "types": "lib/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./lib/index.d.ts",
28
+ "default": "./lib/index.js"
29
+ },
30
+ "./compat": {
31
+ "types": "./lib/compat/sentry.d.ts",
32
+ "default": "./lib/compat/sentry.js"
33
+ },
34
+ "./package.json": "./package.json"
35
+ },
25
36
  "bin": {
26
37
  "sentori-rn-upload-source-bundle": "bin/sentori-rn-upload-source-bundle.cjs"
27
38
  },
@@ -0,0 +1,482 @@
1
+ /**
2
+ * v2.3 W6.3 — Sentry-compatible API surface.
3
+ *
4
+ * Drop-in for code (or LLM-generated code) written against
5
+ * `@sentry/react-native`. Every Sentry call maps to exactly one
6
+ * Sentori-native call internally. Translation differences (e.g.
7
+ * `Sentry.setUser({ ip_address })` — Sentori never stores IP) fire
8
+ * a one-shot console hint at `info` level, deduplicated per
9
+ * (api, dropped_field).
10
+ *
11
+ * Why this exists: LLMs have seen a LOT of Sentry code; letting
12
+ * them write the same syntax against Sentori is one less thing
13
+ * Sentori asks the host to think about. Combined with the v2.3
14
+ * "free bonus" stance — host adds Sentori without unlearning
15
+ * anything.
16
+ *
17
+ * Usage:
18
+ *
19
+ * import * as Sentry from '@goliapkg/sentori-react-native/compat'
20
+ *
21
+ * Sentry.init({ dsn: 'https://<token>@<host>/<projectId>', ... })
22
+ * Sentry.captureException(err)
23
+ * Sentry.setUser({ id, email }) // email → linkBy.email (hashed)
24
+ *
25
+ * The compat layer holds NO state of its own — it's a thin shim
26
+ * over the same Sentori internals. Mixing `Sentry.*` and
27
+ * `sentori.*` calls in the same app works fine.
28
+ *
29
+ * See `docs/design/sdk-v2.3-redesign.md` §4 for the full
30
+ * translation table + design rationale.
31
+ */
32
+
33
+ import { logger } from '@goliapkg/sentori-core'
34
+
35
+ import { addBreadcrumb as nativeAddBreadcrumb } from '../breadcrumbs'
36
+ import {
37
+ captureException as nativeCaptureException,
38
+ captureMessage as nativeCaptureMessage,
39
+ setTag as nativeSetTag,
40
+ setTags as nativeSetTags,
41
+ setUser as nativeSetUser,
42
+ } from '../capture'
43
+ import { type InitOptions, init as nativeInit } from '../init'
44
+
45
+ // ── one-shot warn dedup ───────────────────────────────────────────────────
46
+
47
+ const _warnedOnce = new Set<string>()
48
+ function warnOnce(key: string, msg: string): void {
49
+ if (_warnedOnce.has(key)) return
50
+ _warnedOnce.add(key)
51
+ logger.info('compat', msg)
52
+ }
53
+
54
+ // ── DSN parsing ───────────────────────────────────────────────────────────
55
+
56
+ type SentryInitOpts = {
57
+ dsn: string
58
+ environment?: string
59
+ release?: string
60
+ tracesSampleRate?: number
61
+ sampleRate?: number
62
+ attachStacktrace?: boolean
63
+ autoSessionTracking?: boolean
64
+ /** Sentry's `debug: true` ≈ Sentori's `logLevel: 'debug'`. */
65
+ debug?: boolean
66
+ /** Catch-all for fields Sentori either ignores or doesn't map yet. */
67
+ [other: string]: unknown
68
+ }
69
+
70
+ function parseDsn(dsn: string): { token: string; ingestUrl: string } {
71
+ // Sentry DSN shape: `https://<key>@<host>[:port][/<projectId>]`
72
+ // Sentori cares about `<key>` (must be `st_pk_…`) and `<host>`.
73
+ let url: URL
74
+ try {
75
+ url = new URL(dsn)
76
+ } catch {
77
+ throw new Error(`Sentory compat: dsn is not a valid URL: ${dsn}`)
78
+ }
79
+ const key = url.username
80
+ if (!key) {
81
+ throw new Error(`Sentory compat: dsn missing token in user-info component`)
82
+ }
83
+ if (!key.startsWith('st_pk_')) {
84
+ throw new Error(
85
+ `Sentory compat: dsn token must start with 'st_pk_' (got prefix '${key.slice(0, 8)}…'). ` +
86
+ `Sentori does not parse Sentry-issued tokens — generate a Sentori project token via the dashboard.`,
87
+ )
88
+ }
89
+ // strip user-info to reconstruct the ingest origin
90
+ const ingestUrl = `${url.protocol}//${url.host}`
91
+ return { token: key, ingestUrl }
92
+ }
93
+
94
+ // ── Sentry.init ───────────────────────────────────────────────────────────
95
+
96
+ export function init(opts: SentryInitOpts): void {
97
+ const { token, ingestUrl } = parseDsn(opts.dsn)
98
+
99
+ const sentoriOpts: InitOptions = {
100
+ token,
101
+ release: opts.release ?? '',
102
+ ingestUrl,
103
+ ...(opts.environment ? { environment: opts.environment } : {}),
104
+ sample: {
105
+ ...(opts.tracesSampleRate !== undefined ? { traces: opts.tracesSampleRate } : {}),
106
+ ...(opts.sampleRate !== undefined ? { errors: opts.sampleRate } : {}),
107
+ },
108
+ ...(opts.debug ? { logLevel: 'debug' as const } : {}),
109
+ }
110
+
111
+ // Empty release is the most common Sentry-init mistake; warn but
112
+ // continue.
113
+ if (!sentoriOpts.release) {
114
+ warnOnce(
115
+ 'init:no-release',
116
+ 'Sentry.init() with no `release` — Sentori requires release for grouping + drop-down menus to make sense. Set `release: "myapp@1.2.3"` for production cuts.',
117
+ )
118
+ // Sentori's init throws when release is empty; provide a
119
+ // reasonable fallback so the rest of the code path works in dev.
120
+ sentoriOpts.release = `unspecified@${Date.now()}`
121
+ }
122
+
123
+ // Pass-through informational hints for ignored fields.
124
+ for (const ignored of [
125
+ 'attachStacktrace',
126
+ 'autoSessionTracking',
127
+ 'integrations',
128
+ 'beforeSend',
129
+ 'beforeBreadcrumb',
130
+ 'maxBreadcrumbs',
131
+ ]) {
132
+ if (ignored in opts) {
133
+ warnOnce(
134
+ `init:ignored:${ignored}`,
135
+ `Sentry.init({ ${ignored} }) ignored. ` +
136
+ `${getIgnoredHint(ignored)}`,
137
+ )
138
+ }
139
+ }
140
+
141
+ nativeInit(sentoriOpts)
142
+ }
143
+
144
+ function getIgnoredHint(field: string): string {
145
+ switch (field) {
146
+ case 'attachStacktrace':
147
+ return 'Sentori always sends stack traces — no toggle.'
148
+ case 'autoSessionTracking':
149
+ return "Sentori sessions are on by default; toggle via `init({ capture: { sessions: true|false } })`."
150
+ case 'integrations':
151
+ return 'Sentori uses `init({ capture: {...} })` toggles instead of Integration classes — see the docs.'
152
+ case 'beforeSend':
153
+ case 'beforeBreadcrumb':
154
+ return 'Sentori does not support an arbitrary beforeSend hook today. Server-side PII scrubbing is automatic.'
155
+ case 'maxBreadcrumbs':
156
+ return 'Sentori uses a fixed 100-slot ring buffer.'
157
+ default:
158
+ return ''
159
+ }
160
+ }
161
+
162
+ // ── Severity / level enum ─────────────────────────────────────────────────
163
+
164
+ /** Sentry's severity values, surfaced as strings (Sentori only
165
+ * uses 5 levels). `Log` and `Critical` collapse to `'info'` and
166
+ * `'fatal'` respectively. */
167
+ export const Severity = {
168
+ Fatal: 'fatal' as const,
169
+ Critical: 'fatal' as const,
170
+ Error: 'error' as const,
171
+ Warning: 'warning' as const,
172
+ Log: 'info' as const,
173
+ Info: 'info' as const,
174
+ Debug: 'debug' as const,
175
+ }
176
+
177
+ type SentryLevelString =
178
+ | 'critical'
179
+ | 'debug'
180
+ | 'error'
181
+ | 'fatal'
182
+ | 'info'
183
+ | 'log'
184
+ | 'warning'
185
+
186
+ type SentoriLevel = 'debug' | 'error' | 'fatal' | 'info' | 'warning'
187
+
188
+ function mapLevel(level: SentryLevelString | undefined): SentoriLevel | undefined {
189
+ if (!level) return undefined
190
+ switch (level) {
191
+ case 'critical':
192
+ warnOnce(
193
+ 'severity:critical',
194
+ "Sentry.Severity.Critical → mapped to 'fatal' (Sentori's 5-level syslog-style scale).",
195
+ )
196
+ return 'fatal'
197
+ case 'log':
198
+ warnOnce(
199
+ 'severity:log',
200
+ "Sentry.Severity.Log → mapped to 'info' (Sentori's 5-level scale has no separate Log).",
201
+ )
202
+ return 'info'
203
+ default:
204
+ return level as SentoriLevel
205
+ }
206
+ }
207
+
208
+ // ── captureException ──────────────────────────────────────────────────────
209
+
210
+ type SentryCaptureContext = {
211
+ tags?: Record<string, string>
212
+ extra?: Record<string, unknown>
213
+ level?: SentryLevelString
214
+ fingerprint?: string[]
215
+ user?: SentrySetUserInput
216
+ }
217
+
218
+ export function captureException(
219
+ err: unknown,
220
+ hint?: { captureContext?: SentryCaptureContext } | SentryCaptureContext,
221
+ ): void {
222
+ // Sentry v8+ takes the context inline (Hint); earlier versions
223
+ // wrapped it in `{ captureContext: {...} }`. Accept both.
224
+ const ctx: SentryCaptureContext | undefined = (() => {
225
+ if (!hint) return undefined
226
+ if ('captureContext' in (hint as { captureContext?: unknown })) {
227
+ return (hint as { captureContext?: SentryCaptureContext }).captureContext
228
+ }
229
+ return hint as SentryCaptureContext
230
+ })()
231
+
232
+ if (ctx?.extra) {
233
+ warnOnce(
234
+ 'captureException:extra',
235
+ 'Sentry.captureException(err, { extra }) → `extra` mapped to `tags` (Sentori does not have a separate extra namespace).',
236
+ )
237
+ }
238
+ if (ctx?.user) {
239
+ // Apply the per-call user via setUser (Sentori takes the
240
+ // current scope user automatically).
241
+ setUser(ctx.user)
242
+ }
243
+
244
+ const mergedTags = {
245
+ ...(ctx?.tags ?? {}),
246
+ ...(ctx?.extra
247
+ ? Object.fromEntries(
248
+ Object.entries(ctx.extra).map(([k, v]) => [k, String(v)]),
249
+ )
250
+ : {}),
251
+ }
252
+
253
+ nativeCaptureException(err as Error, {
254
+ ...(Object.keys(mergedTags).length > 0 ? { tags: mergedTags } : {}),
255
+ ...(ctx?.fingerprint ? { fingerprint: ctx.fingerprint } : {}),
256
+ })
257
+ }
258
+
259
+ // ── captureMessage ────────────────────────────────────────────────────────
260
+
261
+ export function captureMessage(
262
+ msg: string,
263
+ levelOrCtx?: SentryCaptureContext | SentryLevelString,
264
+ ): void {
265
+ let level: SentoriLevel | undefined
266
+ let tags: Record<string, string> | undefined
267
+ if (typeof levelOrCtx === 'string') {
268
+ level = mapLevel(levelOrCtx)
269
+ } else if (levelOrCtx) {
270
+ level = mapLevel(levelOrCtx.level)
271
+ tags = levelOrCtx.tags
272
+ }
273
+ nativeCaptureMessage(msg, {
274
+ ...(level ? { level } : {}),
275
+ ...(tags ? { tags } : {}),
276
+ })
277
+ }
278
+
279
+ // ── setUser ───────────────────────────────────────────────────────────────
280
+
281
+ type SentrySetUserInput = {
282
+ id?: string
283
+ email?: string
284
+ username?: string
285
+ ip_address?: string
286
+ segment?: string
287
+ [other: string]: unknown
288
+ } | null
289
+
290
+ export function setUser(user: SentrySetUserInput): void {
291
+ if (user == null) {
292
+ nativeSetUser(null)
293
+ return
294
+ }
295
+ const { id, email, username, ip_address, segment, ...rest } = user
296
+
297
+ if (ip_address !== undefined) {
298
+ warnOnce(
299
+ 'setUser:ip_address',
300
+ 'Sentry.setUser({ ip_address }) → dropped. Sentori never stores IP (privacy by design).',
301
+ )
302
+ }
303
+ if (segment !== undefined) {
304
+ warnOnce(
305
+ 'setUser:segment',
306
+ 'Sentry.setUser({ segment }) → mapped to tag `user.segment`. Set via setTag for clarity.',
307
+ )
308
+ if (typeof segment === 'string') nativeSetTag('user.segment', segment)
309
+ }
310
+
311
+ const linkBy: Record<string, string> = {}
312
+ if (email) linkBy.email = email
313
+ if (username) linkBy.username = username
314
+
315
+ // Surface any other fields the host bolted on (Sentry historically
316
+ // accepted arbitrary keys) — they pass through as tags.
317
+ for (const [k, v] of Object.entries(rest)) {
318
+ if (v !== undefined && v !== null) nativeSetTag(`user.${k}`, String(v))
319
+ }
320
+
321
+ nativeSetUser({
322
+ ...(id ? { id } : {}),
323
+ ...(Object.keys(linkBy).length > 0 ? { linkBy } : {}),
324
+ })
325
+ }
326
+
327
+ // ── setTag / setTags ──────────────────────────────────────────────────────
328
+
329
+ // Re-export Sentori-native semantics; identical signatures.
330
+ export const setTag = nativeSetTag
331
+ export const setTags = nativeSetTags
332
+
333
+ // ── addBreadcrumb ─────────────────────────────────────────────────────────
334
+
335
+ type SentryBreadcrumb = {
336
+ category?: string
337
+ message?: string
338
+ level?: SentryLevelString
339
+ type?: 'default' | 'error' | 'http' | 'info' | 'navigation' | 'query' | 'user' | string
340
+ data?: Record<string, unknown>
341
+ timestamp?: number
342
+ }
343
+
344
+ type SentoriBreadcrumbType = 'custom' | 'log' | 'nav' | 'net' | 'user'
345
+
346
+ function mapCategoryToType(category: string | undefined): SentoriBreadcrumbType | undefined {
347
+ if (!category) return undefined
348
+ if (['auth', 'click', 'gesture', 'input', 'touch', 'ui'].includes(category)) return 'user'
349
+ if (['fetch', 'http', 'xhr'].includes(category)) return 'net'
350
+ if (['nav', 'navigation', 'route'].includes(category)) return 'nav'
351
+ if (['console', 'log', 'sentry'].includes(category)) return 'log'
352
+ return 'custom'
353
+ }
354
+
355
+ function mapSentryType(t: string | undefined): SentoriBreadcrumbType | undefined {
356
+ if (!t) return undefined
357
+ switch (t) {
358
+ case 'http':
359
+ return 'net'
360
+ case 'navigation':
361
+ return 'nav'
362
+ case 'user':
363
+ case 'log':
364
+ case 'custom':
365
+ return t
366
+ default:
367
+ return 'custom'
368
+ }
369
+ }
370
+
371
+ export function addBreadcrumb(crumb: SentryBreadcrumb): void {
372
+ if (!crumb.message) {
373
+ crumb.message = crumb.category ?? crumb.type ?? '(no message)'
374
+ }
375
+ if (crumb.category && !crumb.type) {
376
+ warnOnce(
377
+ 'breadcrumb:category',
378
+ 'Sentry.addBreadcrumb({ category }) → mapped to `type` via well-known table; the category string itself is preserved under `data.category`.',
379
+ )
380
+ }
381
+ // RN SDK shape: { type, data }. No top-level `message` —
382
+ // Sentry's message goes into data.message.
383
+ nativeAddBreadcrumb({
384
+ type: mapSentryType(crumb.type) ?? mapCategoryToType(crumb.category) ?? 'custom',
385
+ data: {
386
+ message: crumb.message,
387
+ ...(crumb.data ?? {}),
388
+ ...(crumb.category ? { category: crumb.category } : {}),
389
+ ...(crumb.level ? { level: mapLevel(crumb.level) } : {}),
390
+ },
391
+ })
392
+ }
393
+
394
+ // ── flush / close ─────────────────────────────────────────────────────────
395
+
396
+ // Re-export Sentori native flush + close — same signatures.
397
+ export { close, flush } from '../lifecycle'
398
+
399
+ // ── startTransaction / startSpan / withScope ──────────────────────────────
400
+
401
+ // Trace mapping is non-trivial (Sentry's transaction object exposes
402
+ // startChild, etc.). v2.3 ships a minimum-viable Sentry trace
403
+ // surface that supports startTransaction returning a Sentori Span
404
+ // object with a partial Sentry-style API (.startChild, .finish).
405
+ // Anything beyond that throws a clear error directing to the native
406
+ // `sentori.startSpan` / `sentori.withScopedSpan`.
407
+
408
+ import { startSpan } from '@goliapkg/sentori-core'
409
+
410
+ type SentrySpanOpts = {
411
+ op?: string
412
+ name?: string
413
+ description?: string
414
+ tags?: Record<string, string>
415
+ }
416
+
417
+ export function startTransaction(opts: SentrySpanOpts): {
418
+ finish: (status?: 'cancelled' | 'error' | 'ok') => void
419
+ setStatus: (status: 'cancelled' | 'error' | 'ok') => void
420
+ setTag: (k: string, v: string) => void
421
+ startChild: (childOpts: SentrySpanOpts) => unknown
422
+ } {
423
+ warnOnce(
424
+ 'startTransaction',
425
+ 'Sentry.startTransaction() → mapped to sentori.startSpan() with op as name. Native equivalent: sentori.startTrace(name) or sentori.startSpan({ name }).',
426
+ )
427
+ const name = opts.name ?? opts.op ?? 'transaction'
428
+ const span = startSpan(name, {
429
+ parent: null,
430
+ tags: opts.tags,
431
+ })
432
+ return {
433
+ finish: (status) => span.finish({ status: status === 'ok' ? 'ok' : 'error' }),
434
+ setStatus: (status) => { span.setTag('status', status) },
435
+ setTag: (k, v) => { span.setTag(k, v) },
436
+ startChild: (childOpts) => {
437
+ return startSpan(childOpts.name ?? childOpts.op ?? 'child', {
438
+ tags: childOpts.tags,
439
+ })
440
+ },
441
+ }
442
+ }
443
+
444
+ // ── withScope / configureScope (no-op scoping; same state as native) ─────
445
+
446
+ type ScopeProxy = {
447
+ setTag: (k: string, v: string) => void
448
+ setTags: (rec: Record<string, string>) => void
449
+ setUser: (u: SentrySetUserInput) => void
450
+ setExtra: (k: string, v: unknown) => void
451
+ setLevel: (l: SentryLevelString) => void
452
+ }
453
+
454
+ function scopeProxy(): ScopeProxy {
455
+ return {
456
+ setTag: nativeSetTag,
457
+ setTags: nativeSetTags,
458
+ setUser,
459
+ setExtra: (k, v) => nativeSetTag(`extra.${k}`, String(v)),
460
+ setLevel: () => {
461
+ warnOnce(
462
+ 'scope:setLevel',
463
+ 'Sentry.withScope(s => s.setLevel(…)) → not supported. Sentori levels travel on capture call, not on scope.',
464
+ )
465
+ },
466
+ }
467
+ }
468
+
469
+ export function withScope<T>(fn: (scope: ScopeProxy) => T): T {
470
+ // Sentori has no Hub; tags set inside `fn` persist (best-effort
471
+ // approximation of Sentry semantics). For most callers this is
472
+ // fine; tighter isolation needs an actual Hub which we don't ship.
473
+ warnOnce(
474
+ 'withScope',
475
+ 'Sentry.withScope() → tag mutations are NOT auto-reverted on scope exit. Use sentori.setTag/clearTags explicitly for tight isolation.',
476
+ )
477
+ return fn(scopeProxy())
478
+ }
479
+
480
+ export function configureScope(fn: (scope: ScopeProxy) => void): void {
481
+ fn(scopeProxy())
482
+ }
package/src/init.ts CHANGED
@@ -130,6 +130,16 @@ export type InitOptions = {
130
130
  * via `sentori.captureMessage()`. `null` / absent → keep all. */
131
131
  messages?: null | number;
132
132
  };
133
+ /** v2.3 — canonical sampling field (renamed from `sampling`).
134
+ * Same shape; if both are passed, `sample` wins. The older
135
+ * `sampling` stays accepted indefinitely as a back-compat alias —
136
+ * this is the kind of rename that's only worth doing if it's
137
+ * also zero-cost for existing callers. */
138
+ sample?: {
139
+ errors?: null | number;
140
+ traces?: null | number;
141
+ messages?: null | number;
142
+ };
133
143
  /** v2.3 — Sentori SDK's own console output gate. Default `'warn'`:
134
144
  * SDK is silent unless something is genuinely broken (transport
135
145
  * sustained failure, native module not found, internal SDK
@@ -181,9 +191,11 @@ export const init = (options: InitOptions): void => {
181
191
  ingestUrl: options.ingestUrl ?? DEFAULT_INGEST_URL,
182
192
  enabled: true,
183
193
  screenshotsEnabled: options.capture?.screenshot === true,
184
- errorSampleRate: options.sampling?.errors ?? null,
185
- traceSampleRate: options.sampling?.traces ?? null,
186
- messageSampleRate: options.sampling?.messages ?? null,
194
+ // v2.3 — `sample` is the canonical name; `sampling` is the
195
+ // back-compat alias. If both are supplied, `sample` wins.
196
+ errorSampleRate: options.sample?.errors ?? options.sampling?.errors ?? null,
197
+ traceSampleRate: options.sample?.traces ?? options.sampling?.traces ?? null,
198
+ messageSampleRate: options.sample?.messages ?? options.sampling?.messages ?? null,
187
199
  sessionTrailEnabled: options.capture?.sessionTrail === true,
188
200
  });
189
201