@goliapkg/sentori-react-native 0.7.5 → 0.8.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/lib/bundle-info.d.ts +12 -0
- package/lib/bundle-info.d.ts.map +1 -0
- package/lib/bundle-info.js +73 -0
- package/lib/bundle-info.js.map +1 -0
- package/lib/capture.d.ts.map +1 -1
- package/lib/capture.js +6 -0
- package/lib/capture.js.map +1 -1
- package/lib/feature-flags.d.ts +9 -0
- package/lib/feature-flags.d.ts.map +1 -0
- package/lib/feature-flags.js +44 -0
- package/lib/feature-flags.js.map +1 -0
- package/lib/handlers/network.d.ts +9 -1
- package/lib/handlers/network.d.ts.map +1 -1
- package/lib/handlers/network.js +189 -18
- package/lib/handlers/network.js.map +1 -1
- package/lib/index.d.ts +18 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +19 -0
- package/lib/index.js.map +1 -1
- package/lib/init.d.ts +16 -1
- package/lib/init.d.ts.map +1 -1
- package/lib/init.js +26 -2
- package/lib/init.js.map +1 -1
- package/lib/launch-crash-guard.d.ts +37 -0
- package/lib/launch-crash-guard.d.ts.map +1 -0
- package/lib/launch-crash-guard.js +163 -0
- package/lib/launch-crash-guard.js.map +1 -0
- package/lib/measure.d.ts +4 -0
- package/lib/measure.d.ts.map +1 -0
- package/lib/measure.js +25 -0
- package/lib/measure.js.map +1 -0
- package/lib/metrics.d.ts +9 -0
- package/lib/metrics.d.ts.map +1 -0
- package/lib/metrics.js +64 -0
- package/lib/metrics.js.map +1 -0
- package/lib/rage-tap-detector.d.ts +8 -0
- package/lib/rage-tap-detector.d.ts.map +1 -0
- package/lib/rage-tap-detector.js +21 -0
- package/lib/rage-tap-detector.js.map +1 -0
- package/lib/rage-tap.d.ts +6 -0
- package/lib/rage-tap.d.ts.map +1 -0
- package/lib/rage-tap.js +35 -0
- package/lib/rage-tap.js.map +1 -0
- package/lib/transport.d.ts +12 -0
- package/lib/transport.d.ts.map +1 -1
- package/lib/transport.js +24 -0
- package/lib/transport.js.map +1 -1
- package/package.json +11 -3
- package/src/__tests__/feature-flags.test.ts +55 -0
- package/src/__tests__/measure.test.ts +45 -0
- package/src/__tests__/network-graphql.test.ts +75 -0
- package/src/__tests__/rage-tap.test.ts +38 -0
- package/src/bundle-info.ts +95 -0
- package/src/capture.ts +6 -0
- package/src/feature-flags.ts +47 -0
- package/src/handlers/network.ts +198 -18
- package/src/index.ts +29 -0
- package/src/init.ts +57 -2
- package/src/launch-crash-guard.ts +221 -0
- package/src/measure.ts +28 -0
- package/src/metrics.ts +74 -0
- package/src/rage-tap-detector.ts +26 -0
- package/src/rage-tap.tsx +48 -0
- package/src/transport.ts +32 -0
package/lib/transport.js
CHANGED
|
@@ -213,6 +213,30 @@ export const sendSessionPing = async (ingestUrl, token, ping) => {
|
|
|
213
213
|
// best-effort
|
|
214
214
|
}
|
|
215
215
|
};
|
|
216
|
+
/**
|
|
217
|
+
* v0.8.3 — flush a batched set of custom metrics. The host SDK
|
|
218
|
+
* batches recordMetric() calls into a fixed-size ring (drained on
|
|
219
|
+
* a timer + at next captureException) so a busy loop doesn't spin
|
|
220
|
+
* up one fetch per point. Best-effort, no retry.
|
|
221
|
+
*/
|
|
222
|
+
export const sendMetricsBatch = async (ingestUrl, token, metrics) => {
|
|
223
|
+
if (metrics.length === 0)
|
|
224
|
+
return;
|
|
225
|
+
try {
|
|
226
|
+
await fetch(`${ingestUrl}/v1/metrics:batch`, {
|
|
227
|
+
body: JSON.stringify({ metrics }),
|
|
228
|
+
headers: {
|
|
229
|
+
Authorization: `Bearer ${token}`,
|
|
230
|
+
'Content-Type': 'application/json',
|
|
231
|
+
'Sentori-Sdk': `react-native/${SDK_VERSION}`,
|
|
232
|
+
},
|
|
233
|
+
method: 'POST',
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// best-effort
|
|
238
|
+
}
|
|
239
|
+
};
|
|
216
240
|
/**
|
|
217
241
|
* v0.8.2 — submit a user-supplied bug report. Fire-and-forget; resolves
|
|
218
242
|
* with the server-assigned id on success or `null` on any failure.
|
package/lib/transport.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.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": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Sentori SDK for React Native \u2014 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",
|
|
@@ -52,12 +52,20 @@
|
|
|
52
52
|
},
|
|
53
53
|
"expo-modules-core": {
|
|
54
54
|
"optional": true
|
|
55
|
+
},
|
|
56
|
+
"expo-updates": {
|
|
57
|
+
"optional": true
|
|
58
|
+
},
|
|
59
|
+
"react-native-code-push": {
|
|
60
|
+
"optional": true
|
|
55
61
|
}
|
|
56
62
|
},
|
|
57
63
|
"optionalDependencies": {
|
|
58
64
|
"@react-native-async-storage/async-storage": ">=1.23",
|
|
59
65
|
"@react-native-community/netinfo": ">=11.0",
|
|
60
|
-
"expo-modules-core": ">=2.0"
|
|
66
|
+
"expo-modules-core": ">=2.0",
|
|
67
|
+
"expo-updates": ">=0.27",
|
|
68
|
+
"react-native-code-push": ">=8.0"
|
|
61
69
|
},
|
|
62
70
|
"devDependencies": {
|
|
63
71
|
"@types/bun": "latest",
|
|
@@ -68,6 +76,6 @@
|
|
|
68
76
|
"access": "public"
|
|
69
77
|
},
|
|
70
78
|
"dependencies": {
|
|
71
|
-
"@goliapkg/sentori-core": "0.
|
|
79
|
+
"@goliapkg/sentori-core": "0.8.0"
|
|
72
80
|
}
|
|
73
81
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { afterEach, describe, expect, test } from 'bun:test';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
__resetFeatureFlagsForTests,
|
|
5
|
+
clearAllFeatureFlags,
|
|
6
|
+
clearFeatureFlag,
|
|
7
|
+
getFeatureFlagSnapshot,
|
|
8
|
+
getFeatureFlags,
|
|
9
|
+
setFeatureFlag,
|
|
10
|
+
} from '../feature-flags';
|
|
11
|
+
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
__resetFeatureFlagsForTests();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
describe('feature flags', () => {
|
|
17
|
+
test('set / get round-trip', () => {
|
|
18
|
+
setFeatureFlag('checkout-v2', 'variant-a');
|
|
19
|
+
setFeatureFlag('shipping', 'fast');
|
|
20
|
+
expect(getFeatureFlags()).toEqual({ 'checkout-v2': 'variant-a', shipping: 'fast' });
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('clear removes only the named flag', () => {
|
|
24
|
+
setFeatureFlag('a', '1');
|
|
25
|
+
setFeatureFlag('b', '2');
|
|
26
|
+
clearFeatureFlag('a');
|
|
27
|
+
expect(getFeatureFlags()).toEqual({ b: '2' });
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('clearAll empties the map', () => {
|
|
31
|
+
setFeatureFlag('a', '1');
|
|
32
|
+
clearAllFeatureFlags();
|
|
33
|
+
expect(getFeatureFlags()).toEqual({});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('snapshot returns null when empty (so capture can elide the field)', () => {
|
|
37
|
+
expect(getFeatureFlagSnapshot()).toBeNull();
|
|
38
|
+
setFeatureFlag('x', 'y');
|
|
39
|
+
expect(getFeatureFlagSnapshot()).toEqual({ x: 'y' });
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('rejects oversize names / values silently', () => {
|
|
43
|
+
setFeatureFlag('x'.repeat(201), 'v');
|
|
44
|
+
setFeatureFlag('name', 'v'.repeat(201));
|
|
45
|
+
expect(getFeatureFlags()).toEqual({});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('respects the 50-flag cap but updates existing flags freely', () => {
|
|
49
|
+
for (let i = 0; i < 50; i++) setFeatureFlag(`flag-${i}`, 'a');
|
|
50
|
+
setFeatureFlag('flag-overflow', 'a'); // rejected silently
|
|
51
|
+
expect(Object.keys(getFeatureFlags()).length).toBe(50);
|
|
52
|
+
setFeatureFlag('flag-0', 'b'); // update — allowed
|
|
53
|
+
expect(getFeatureFlags()['flag-0']).toBe('b');
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { afterEach, describe, expect, test } from 'bun:test';
|
|
2
|
+
|
|
3
|
+
import { clearSpans, drainSpans } from '@goliapkg/sentori-core';
|
|
4
|
+
|
|
5
|
+
import { measureFn } from '../measure';
|
|
6
|
+
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
clearSpans();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
describe('measureFn', () => {
|
|
12
|
+
test('runs fn, returns result, emits an ok span', async () => {
|
|
13
|
+
const r = await measureFn('addToCart', async () => 42);
|
|
14
|
+
expect(r).toBe(42);
|
|
15
|
+
const spans = drainSpans();
|
|
16
|
+
expect(spans.length).toBe(1);
|
|
17
|
+
expect(spans[0]!.op).toBe('sentori.measureFn');
|
|
18
|
+
expect(spans[0]!.name).toBe('addToCart');
|
|
19
|
+
expect(spans[0]!.status).toBe('ok');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('supports sync fn too (Promise.resolve hides the difference)', async () => {
|
|
23
|
+
const r = await measureFn('syncJob', () => 'hello');
|
|
24
|
+
expect(r).toBe('hello');
|
|
25
|
+
expect(drainSpans()[0]!.status).toBe('ok');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('propagates thrown errors and marks span as error', async () => {
|
|
29
|
+
await expect(
|
|
30
|
+
measureFn('failing', async () => {
|
|
31
|
+
throw new Error('nope');
|
|
32
|
+
}),
|
|
33
|
+
).rejects.toThrow('nope');
|
|
34
|
+
const spans = drainSpans();
|
|
35
|
+
expect(spans.length).toBe(1);
|
|
36
|
+
expect(spans[0]!.status).toBe('error');
|
|
37
|
+
expect(spans[0]!.tags['error.message']).toBe('nope');
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('passes through caller tags', async () => {
|
|
41
|
+
await measureFn('withTags', async () => 'ok', { tags: { region: 'jp' } });
|
|
42
|
+
const spans = drainSpans();
|
|
43
|
+
expect(spans[0]!.tags.region).toBe('jp');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { afterEach, describe, expect, test } from 'bun:test';
|
|
2
|
+
|
|
3
|
+
import { parseGqlOpName } from '../handlers/network';
|
|
4
|
+
|
|
5
|
+
// v0.9.0 #11 — covers the GraphQL operation extraction logic. The
|
|
6
|
+
// patched fetch / XHR plumbing is exercised by manual smoke; this file
|
|
7
|
+
// nails the parser, which is the part with branchy logic.
|
|
8
|
+
|
|
9
|
+
afterEach(() => {
|
|
10
|
+
// nothing — parseGqlOpName is pure.
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
describe('parseGqlOpName', () => {
|
|
14
|
+
test('extracts operationName from a standard Apollo POST body', () => {
|
|
15
|
+
const body = JSON.stringify({
|
|
16
|
+
query: 'query UpdateCart($id:ID!){...}',
|
|
17
|
+
operationName: 'UpdateCart',
|
|
18
|
+
variables: { id: 'c-1' },
|
|
19
|
+
});
|
|
20
|
+
expect(parseGqlOpName(body)).toBe('UpdateCart');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('extracts operationName from a batched array body (Apollo Link Batch)', () => {
|
|
24
|
+
const body = JSON.stringify([
|
|
25
|
+
{ query: '...', operationName: 'FirstOp', variables: {} },
|
|
26
|
+
{ query: '...', operationName: 'SecondOp', variables: {} },
|
|
27
|
+
]);
|
|
28
|
+
expect(parseGqlOpName(body)).toBe('FirstOp');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('falls back to sniffing the query string when operationName is absent', () => {
|
|
32
|
+
const body = JSON.stringify({
|
|
33
|
+
query: 'mutation CompleteCheckout($id:ID!){...}',
|
|
34
|
+
});
|
|
35
|
+
expect(parseGqlOpName(body)).toBe('CompleteCheckout');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('sniffs application/graphql body (no JSON wrapper)', () => {
|
|
39
|
+
const body = 'query ListOrders {\n orders { id }\n}';
|
|
40
|
+
expect(parseGqlOpName(body)).toBe('ListOrders');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test('returns undefined for non-graphql JSON', () => {
|
|
44
|
+
const body = JSON.stringify({ hello: 'world' });
|
|
45
|
+
expect(parseGqlOpName(body)).toBeUndefined();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('returns undefined for malformed JSON', () => {
|
|
49
|
+
expect(parseGqlOpName('{not json')).toBeUndefined();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test('returns undefined for an empty body', () => {
|
|
53
|
+
expect(parseGqlOpName('')).toBeUndefined();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('rejects bodies larger than 8 KB', () => {
|
|
57
|
+
const big = JSON.stringify({
|
|
58
|
+
query: 'query Big {...}',
|
|
59
|
+
operationName: 'Big',
|
|
60
|
+
variables: { padding: 'x'.repeat(10_000) },
|
|
61
|
+
});
|
|
62
|
+
expect(parseGqlOpName(big)).toBeUndefined();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('rejects an operationName that is too long (>200 chars)', () => {
|
|
66
|
+
const long = 'A'.repeat(201);
|
|
67
|
+
const body = JSON.stringify({ query: 'q', operationName: long });
|
|
68
|
+
expect(parseGqlOpName(body)).toBeUndefined();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test('handles leading comments in raw query body', () => {
|
|
72
|
+
const body = '# a comment\n# another comment\nsubscription LiveTicker {...}';
|
|
73
|
+
expect(parseGqlOpName(body)).toBe('LiveTicker');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { describe, expect, test } from 'bun:test';
|
|
2
|
+
|
|
3
|
+
import { recordTap } from '../rage-tap-detector';
|
|
4
|
+
|
|
5
|
+
describe('recordTap', () => {
|
|
6
|
+
test('two fast taps do not trip rage', () => {
|
|
7
|
+
const m = new Map<number, number[]>();
|
|
8
|
+
expect(recordTap(m, 7, 0)).toBe(false);
|
|
9
|
+
expect(recordTap(m, 7, 200)).toBe(false);
|
|
10
|
+
expect(m.get(7)?.length).toBe(2);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('three fast taps on the same target trip rage', () => {
|
|
14
|
+
const m = new Map<number, number[]>();
|
|
15
|
+
recordTap(m, 7, 0);
|
|
16
|
+
recordTap(m, 7, 200);
|
|
17
|
+
expect(recordTap(m, 7, 400)).toBe(true);
|
|
18
|
+
// bucket cleared so the very next tap doesn't immediately re-trip
|
|
19
|
+
expect(m.get(7)).toBeUndefined();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('taps spread over > 800 ms do not trip', () => {
|
|
23
|
+
const m = new Map<number, number[]>();
|
|
24
|
+
recordTap(m, 7, 0);
|
|
25
|
+
recordTap(m, 7, 500);
|
|
26
|
+
expect(recordTap(m, 7, 1500)).toBe(false);
|
|
27
|
+
// only the last (since it landed > 800ms after the previous two)
|
|
28
|
+
expect(m.get(7)?.length).toBe(1);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('different targets do not pool', () => {
|
|
32
|
+
const m = new Map<number, number[]>();
|
|
33
|
+
recordTap(m, 1, 0);
|
|
34
|
+
recordTap(m, 2, 0);
|
|
35
|
+
recordTap(m, 3, 0);
|
|
36
|
+
expect(m.size).toBe(3);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// v0.9.0 #10 — EAS Update / CodePush awareness.
|
|
2
|
+
//
|
|
3
|
+
// At capture time we want to know which JS bundle the user is running:
|
|
4
|
+
// it's almost always an OTA update rather than the binary `release`,
|
|
5
|
+
// and crash spikes correlate to a specific bundle id rather than the
|
|
6
|
+
// app version. We try `expo-updates` first (EAS), then `react-native-
|
|
7
|
+
// code-push`, then nothing. All access is `require()`-shielded so the
|
|
8
|
+
// SDK still works when neither is installed.
|
|
9
|
+
//
|
|
10
|
+
// Cached at module load — bundle id doesn't change mid-session in
|
|
11
|
+
// either Expo or CodePush.
|
|
12
|
+
|
|
13
|
+
export type BundleInfo = {
|
|
14
|
+
/** Stable identifier — Expo `updateId` or CodePush `label`. */
|
|
15
|
+
id: string;
|
|
16
|
+
/** When the bundle was published. RFC 3339. */
|
|
17
|
+
deployedAt?: string;
|
|
18
|
+
/** Which OTA system reported it. */
|
|
19
|
+
source: 'codepush' | 'expo';
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
let _cached: BundleInfo | null | undefined;
|
|
23
|
+
|
|
24
|
+
export function getBundleInfo(): BundleInfo | null {
|
|
25
|
+
if (_cached !== undefined) return _cached;
|
|
26
|
+
_cached = detect();
|
|
27
|
+
return _cached;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function detect(): BundleInfo | null {
|
|
31
|
+
// Expo Updates first — most modern RN deployments are on EAS Update.
|
|
32
|
+
try {
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
34
|
+
const Updates = require('expo-updates') as {
|
|
35
|
+
commitTime?: Date | null;
|
|
36
|
+
isEmbeddedLaunch?: boolean;
|
|
37
|
+
manifest?: { id?: string; createdAt?: string };
|
|
38
|
+
updateId?: null | string;
|
|
39
|
+
};
|
|
40
|
+
const id = Updates.updateId ?? Updates.manifest?.id;
|
|
41
|
+
if (typeof id === 'string' && id.length > 0) {
|
|
42
|
+
const deployedAt = pickDeployedAt(Updates);
|
|
43
|
+
return { deployedAt, id, source: 'expo' };
|
|
44
|
+
}
|
|
45
|
+
} catch {
|
|
46
|
+
// expo-updates not installed
|
|
47
|
+
}
|
|
48
|
+
// CodePush fallback.
|
|
49
|
+
try {
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
51
|
+
const cp = require('react-native-code-push') as {
|
|
52
|
+
getCurrentPackage?: () => Promise<{
|
|
53
|
+
appVersion?: string;
|
|
54
|
+
label?: string;
|
|
55
|
+
packageHash?: string;
|
|
56
|
+
} | null>;
|
|
57
|
+
};
|
|
58
|
+
// `getCurrentPackage` is async; we don't block init. Schedule a
|
|
59
|
+
// background fetch + populate the cache. First-event-after-init
|
|
60
|
+
// may miss the bundle id; subsequent events will have it.
|
|
61
|
+
if (typeof cp.getCurrentPackage === 'function') {
|
|
62
|
+
void cp
|
|
63
|
+
.getCurrentPackage()
|
|
64
|
+
.then((pkg) => {
|
|
65
|
+
if (pkg && (pkg.label || pkg.packageHash)) {
|
|
66
|
+
_cached = {
|
|
67
|
+
id: pkg.label ?? pkg.packageHash!,
|
|
68
|
+
source: 'codepush',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
.catch(() => {
|
|
73
|
+
// ignore
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
} catch {
|
|
77
|
+
// not installed
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function pickDeployedAt(u: {
|
|
83
|
+
commitTime?: Date | null;
|
|
84
|
+
manifest?: { createdAt?: string };
|
|
85
|
+
}): string | undefined {
|
|
86
|
+
if (u.commitTime instanceof Date) return u.commitTime.toISOString();
|
|
87
|
+
const ts = u.manifest?.createdAt;
|
|
88
|
+
if (typeof ts === 'string') return ts;
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Test-only — reset cache. */
|
|
93
|
+
export function __resetBundleInfoForTests(): void {
|
|
94
|
+
_cached = undefined;
|
|
95
|
+
}
|
package/src/capture.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { sealTrail, shouldSample } from '@goliapkg/sentori-core';
|
|
2
2
|
|
|
3
3
|
import { addBreadcrumb, getBreadcrumbs } from './breadcrumbs';
|
|
4
|
+
import { getBundleInfo } from './bundle-info';
|
|
4
5
|
import { getConfig, isInitialized } from './config';
|
|
6
|
+
import { getFeatureFlagSnapshot } from './feature-flags';
|
|
5
7
|
import { symbolicateErrorViaMetro } from './handlers/dev-symbolicate';
|
|
6
8
|
import { captureScreenshot } from './handlers/screenshot';
|
|
7
9
|
import { markSessionErrored } from './session-tracker';
|
|
@@ -97,6 +99,8 @@ export const captureError = (error: Error, extras?: CaptureExtras): void => {
|
|
|
97
99
|
return;
|
|
98
100
|
}
|
|
99
101
|
|
|
102
|
+
const flags = getFeatureFlagSnapshot();
|
|
103
|
+
const bundle = getBundleInfo();
|
|
100
104
|
const event: Event = {
|
|
101
105
|
id: uuidV7(),
|
|
102
106
|
timestamp: new Date().toISOString(),
|
|
@@ -108,6 +112,8 @@ export const captureError = (error: Error, extras?: CaptureExtras): void => {
|
|
|
108
112
|
app: collectApp(config.release),
|
|
109
113
|
user: extras?.user ?? _user,
|
|
110
114
|
tags: extras?.tags,
|
|
115
|
+
...(flags ? { flags } : {}),
|
|
116
|
+
...(bundle ? { bundle } : {}),
|
|
111
117
|
breadcrumbs: getBreadcrumbs(),
|
|
112
118
|
error: errorToObject(error),
|
|
113
119
|
fingerprint: extras?.fingerprint,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// v0.9.0 #13 — feature-flag dimensionality.
|
|
2
|
+
//
|
|
3
|
+
// `sentori.setFeatureFlag(name, value)` is the dual of `setTag()` for
|
|
4
|
+
// experiment / flag state: distinct dashboard dimension, dense small
|
|
5
|
+
// strings, designed to be filtered/faceted on. Bugsnag's analog has
|
|
6
|
+
// proven surprisingly load-bearing. Implementation is a tiny in-memory
|
|
7
|
+
// map; every capture rides along the current snapshot.
|
|
8
|
+
//
|
|
9
|
+
// Constraints (silent — never throw):
|
|
10
|
+
// • name and value are strings, length 1..200
|
|
11
|
+
// • cap at 50 distinct flags to bound payload
|
|
12
|
+
// • already-set name can update (no cap check)
|
|
13
|
+
|
|
14
|
+
const MAX_FLAGS = 50;
|
|
15
|
+
const MAX_LEN = 200;
|
|
16
|
+
|
|
17
|
+
let _flags = new Map<string, string>();
|
|
18
|
+
|
|
19
|
+
export const setFeatureFlag = (name: string, value: string): void => {
|
|
20
|
+
if (typeof name !== 'string' || name.length === 0 || name.length > MAX_LEN) return;
|
|
21
|
+
if (typeof value !== 'string' || value.length > MAX_LEN) return;
|
|
22
|
+
if (_flags.size >= MAX_FLAGS && !_flags.has(name)) return;
|
|
23
|
+
_flags.set(name, value);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const clearFeatureFlag = (name: string): void => {
|
|
27
|
+
_flags.delete(name);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const clearAllFeatureFlags = (): void => {
|
|
31
|
+
_flags.clear();
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const getFeatureFlags = (): Record<string, string> => {
|
|
35
|
+
return Object.fromEntries(_flags);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/** Internal — capture.ts pulls a snapshot per event. Empty object
|
|
39
|
+
* collapses out of the payload via `Object.keys.length === 0` check. */
|
|
40
|
+
export const getFeatureFlagSnapshot = (): null | Record<string, string> => {
|
|
41
|
+
if (_flags.size === 0) return null;
|
|
42
|
+
return Object.fromEntries(_flags);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const __resetFeatureFlagsForTests = (): void => {
|
|
46
|
+
_flags.clear();
|
|
47
|
+
};
|