@nativescript-community/sentry 4.6.18 → 4.6.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.
@@ -0,0 +1,645 @@
1
+ import { Application, Utils } from '@nativescript/core';
2
+ import { android as androidApp } from '@nativescript/core/application';
3
+ import { Status } from '@sentry/types';
4
+ import { convertNativescriptFramesToSentryFrames, parseErrorStack } from './integrations/debugsymbolicator';
5
+ import { rewriteFrameIntegration } from './sdk';
6
+ export var NSSentry;
7
+ (function (NSSentry) {
8
+ NSSentry.nativeClientAvailable = true;
9
+ NSSentry.nativeTransport = true;
10
+ let frameMetricsAggregator;
11
+ function eventLevel(level) {
12
+ switch (level) {
13
+ case 'fatal':
14
+ return io.sentry.SentryLevel.FATAL;
15
+ case 'warning':
16
+ return io.sentry.SentryLevel.WARNING;
17
+ case 'info':
18
+ case 'log':
19
+ return io.sentry.SentryLevel.INFO;
20
+ case 'debug':
21
+ return io.sentry.SentryLevel.DEBUG;
22
+ default:
23
+ return io.sentry.SentryLevel.ERROR;
24
+ }
25
+ }
26
+ function getNativeHashMap(obj) {
27
+ if (!obj) {
28
+ return null;
29
+ }
30
+ const map = new java.util.HashMap();
31
+ Object.keys(obj).forEach((k) => {
32
+ map.put(k, obj[k]);
33
+ });
34
+ return map;
35
+ }
36
+ function getJSHashMap(obj) {
37
+ if (!obj) {
38
+ return null;
39
+ }
40
+ const result = {};
41
+ let value, pair, key;
42
+ const it = obj.entrySet().iterator();
43
+ while (it.hasNext()) {
44
+ pair = it.next();
45
+ value = pair.getValue();
46
+ key = pair.getKey();
47
+ if (value instanceof java.util.HashMap) {
48
+ result[key] = getJSHashMap(value);
49
+ }
50
+ else if (value instanceof java.lang.Number) {
51
+ result[key] = value.doubleValue();
52
+ }
53
+ else if (value && value.hasOwnProperty('length')) {
54
+ result[key] = Array.from({ length: value.length }).map((v, i) => value[i]);
55
+ }
56
+ else {
57
+ result[key] = value;
58
+ }
59
+ }
60
+ return result;
61
+ }
62
+ function getUser(user) {
63
+ const nUser = new io.sentry.protocol.User();
64
+ if (user.email) {
65
+ nUser.setEmail(user.email);
66
+ }
67
+ if (user.userID) {
68
+ nUser.setId(user.userID);
69
+ }
70
+ else if (user.userId) {
71
+ nUser.setId(user.userId);
72
+ }
73
+ else if (user.id) {
74
+ nUser.setId(user.id);
75
+ }
76
+ if (user.username) {
77
+ nUser.setUsername(user.username);
78
+ }
79
+ if (user.extra) {
80
+ nUser.setOthers(getNativeHashMap(user.extra));
81
+ }
82
+ return nUser;
83
+ }
84
+ const mJsModuleIdPattern = new RegExp('(?:^|[/\\\\])(\\d+\\.js)$');
85
+ function stackFrameToModuleId(frame) {
86
+ if (!!frame.file) {
87
+ const matcher = mJsModuleIdPattern.exec(frame.file);
88
+ if (matcher) {
89
+ return matcher[1] + ':';
90
+ }
91
+ }
92
+ return '';
93
+ }
94
+ function convertToNativeStacktrace(stack) {
95
+ if (!stack) {
96
+ return null;
97
+ }
98
+ const nStackTrace = new io.sentry.protocol.SentryStackTrace();
99
+ const frames = new java.util.ArrayList();
100
+ for (let i = 0; i < stack.length; i++) {
101
+ const frame = stack[i];
102
+ const fileName = frame.file || frame.filename || '';
103
+ const methodName = frame.methodName || frame.function || '';
104
+ const lineNumber = frame.lineNumber || frame.lineno || 0;
105
+ const column = frame.column || frame.colno || 0;
106
+ const stackFrame = new io.sentry.protocol.SentryStackFrame();
107
+ stackFrame.setModule('');
108
+ stackFrame.setFunction(methodName.length > 0 ? methodName.split('.').pop() : methodName);
109
+ stackFrame.setFilename(stackFrameToModuleId(frame));
110
+ stackFrame.setLineno(new java.lang.Integer(lineNumber));
111
+ stackFrame.setColno(new java.lang.Integer(column));
112
+ stackFrame.setAbsPath(fileName);
113
+ stackFrame.setPlatform('javascript');
114
+ stackFrame.setInApp(new java.lang.Boolean(frame.in_app || false));
115
+ frames.add(stackFrame);
116
+ }
117
+ nStackTrace.setFrames(frames);
118
+ return nStackTrace;
119
+ }
120
+ function addExceptionInterface(nEvent, type, value, stack) {
121
+ const exceptions = nEvent.getExceptions() || new java.util.ArrayList();
122
+ const nException = new io.sentry.protocol.SentryException();
123
+ nException.setType(type);
124
+ nException.setValue(value);
125
+ nException.setModule('');
126
+ // nException.setModule('com.tns');
127
+ nException.setThreadId(new java.lang.Long(java.lang.Thread.currentThread().getId()));
128
+ nException.setStacktrace(convertToNativeStacktrace(stack));
129
+ exceptions.add(nException);
130
+ nEvent.setExceptions(exceptions);
131
+ }
132
+ async function sendEvent(event) {
133
+ try {
134
+ // Process and convert deprecated levels
135
+ const nEvent = new io.sentry.SentryEvent();
136
+ if (event.event_id) {
137
+ nEvent.setEventId(new io.sentry.protocol.SentryId(event.event_id));
138
+ }
139
+ if (event.breadcrumbs) {
140
+ const breadcrumbs = event.breadcrumbs;
141
+ const eventBreadcrumbs = new java.util.ArrayList();
142
+ for (let i = 0; i < breadcrumbs.length; i++) {
143
+ const breadcrumb = breadcrumbs[i];
144
+ const nBreadcumb = new io.sentry.Breadcrumb();
145
+ if (breadcrumb.category) {
146
+ nBreadcumb.setCategory(breadcrumb.category);
147
+ }
148
+ if (breadcrumb.type) {
149
+ const typeString = breadcrumb.type.toUpperCase();
150
+ try {
151
+ nBreadcumb.setType(typeString);
152
+ }
153
+ catch (e) {
154
+ // don't copy over invalid breadcrumb 'type' value
155
+ }
156
+ }
157
+ if (breadcrumb.level) {
158
+ nBreadcumb.setLevel(eventLevel(breadcrumb.level));
159
+ }
160
+ try {
161
+ if (breadcrumb.data) {
162
+ Object.keys(breadcrumb.data).forEach((k) => {
163
+ let value = breadcrumb.data[k];
164
+ // in case a `status_code` entry got accidentally stringified as a float
165
+ if (k === 'status_code' && typeof value === 'string' && value.endsWith('.0')) {
166
+ value = value.replace('.0', '');
167
+ }
168
+ else if (typeof value === 'boolean') {
169
+ value = new java.lang.Boolean(value);
170
+ }
171
+ else if (typeof value === 'number') {
172
+ value = value.toString();
173
+ }
174
+ else if (Array.isArray(value)) {
175
+ value = new org.json.JSONArray(JSON.stringify(value));
176
+ }
177
+ else if (value && typeof value === 'object') {
178
+ value = new org.json.JSONObject(JSON.stringify(value));
179
+ }
180
+ nBreadcumb.setData(k, value);
181
+ });
182
+ }
183
+ }
184
+ catch (e) {
185
+ console.warn('Discarded breadcrumb.data since it was not an object');
186
+ }
187
+ if (breadcrumb.message) {
188
+ nBreadcumb.setMessage(breadcrumb.message);
189
+ }
190
+ else {
191
+ nBreadcumb.setMessage('');
192
+ }
193
+ eventBreadcrumbs.add(i, nBreadcumb);
194
+ }
195
+ if (eventBreadcrumbs.size() > 0) {
196
+ nEvent.setBreadcrumbs(eventBreadcrumbs);
197
+ }
198
+ }
199
+ if (event.message) {
200
+ const nMsg = new io.sentry.protocol.Message();
201
+ nMsg.setMessage(event.message || '');
202
+ nEvent.setMessage(nMsg);
203
+ }
204
+ if (event.logger) {
205
+ nEvent.setLogger(event.logger);
206
+ }
207
+ if (event.user) {
208
+ nEvent.setUser(getUser(event.user));
209
+ }
210
+ if (event.extra) {
211
+ Object.keys(event.extra).forEach((k) => {
212
+ const value = event.extra[k];
213
+ nEvent.setExtra(k, typeof value === 'string' ? value : JSON.stringify(value));
214
+ });
215
+ }
216
+ if (event.fingerprint) {
217
+ const fingerprint = event.fingerprint;
218
+ const print = new java.util.ArrayList();
219
+ for (let i = 0; i < fingerprint.length; ++i) {
220
+ print.add(fingerprint[i]);
221
+ }
222
+ nEvent.setFingerprints(print);
223
+ }
224
+ if (event.tags) {
225
+ Object.keys(event.tags).forEach((k) => {
226
+ const value = event.tags[k];
227
+ nEvent.setTag(k, (value || 'INVALID_TAG').toString());
228
+ });
229
+ }
230
+ if (event.exception) {
231
+ const exceptionValues = event.exception.values;
232
+ const exception = exceptionValues[0];
233
+ if (exception.stacktrace) {
234
+ const stacktrace = exception.stacktrace;
235
+ const frames = stacktrace.frames;
236
+ if (exception.value) {
237
+ addExceptionInterface(nEvent, exception.type, exception.value, frames);
238
+ }
239
+ else {
240
+ // We use type/type here since this indicates an Unhandled Promise Rejection
241
+ // https://github.com/getsentry/react-native-sentry/issues/353
242
+ addExceptionInterface(nEvent, exception.type, exception.type, frames);
243
+ }
244
+ }
245
+ }
246
+ if (event.environment) {
247
+ nEvent.setEnvironment(event.environment);
248
+ }
249
+ if (event.platform) {
250
+ nEvent.setPlatform(event.platform);
251
+ }
252
+ if (event.release) {
253
+ nEvent.setRelease(event.release);
254
+ }
255
+ if (event.dist) {
256
+ nEvent.setDist(event.dist);
257
+ }
258
+ if (event.level) {
259
+ nEvent.setLevel(eventLevel(event.level));
260
+ }
261
+ if (event.contexts) {
262
+ Object.keys(event.contexts).forEach((k) => {
263
+ // const value = event.contexts[k];
264
+ // const context = new io.sentry.protocol.Contexts();
265
+ // nEvent.setTag(k, value || 'INVALID_TAG');
266
+ });
267
+ }
268
+ if (event.sdk) {
269
+ const sdk = event.sdk;
270
+ const nSdk = new io.sentry.protocol.SdkVersion();
271
+ nSdk.setName(sdk.name);
272
+ nSdk.setVersion(sdk.version);
273
+ if (sdk.integrations) {
274
+ const integrations = sdk.integrations;
275
+ for (let i = 0; i < integrations.length; ++i) {
276
+ nSdk.addIntegration(integrations[i]);
277
+ }
278
+ }
279
+ nEvent.setSdk(nSdk);
280
+ }
281
+ const id = io.sentry.Sentry.captureEvent(nEvent);
282
+ flush(0);
283
+ return { status: 'success', id };
284
+ }
285
+ catch (err) {
286
+ console.error('error sending sentry event', err, err.stack);
287
+ throw (err);
288
+ }
289
+ ;
290
+ }
291
+ NSSentry.sendEvent = sendEvent;
292
+ async function captureEnvelope(envelope) {
293
+ const installation = new java.io.File(nSentryOptions.getOutboxPath(), java.util.UUID.randomUUID().toString());
294
+ try {
295
+ const out = new java.io.FileOutputStream(installation);
296
+ out.write(new java.lang.String(envelope).getBytes(java.nio.charset.Charset.forName('UTF-8')));
297
+ }
298
+ catch (err) {
299
+ console.error('captureEnvelope error', err);
300
+ }
301
+ }
302
+ NSSentry.captureEnvelope = captureEnvelope;
303
+ function flush(timeout) {
304
+ io.sentry.Sentry.flush(timeout);
305
+ }
306
+ NSSentry.flush = flush;
307
+ let initialized = false;
308
+ let sentryOptions;
309
+ let nSentryOptions;
310
+ function addPackages(event, sdk) {
311
+ const eventSdk = event.getSdk();
312
+ if (eventSdk != null && eventSdk.getName() === 'sentry.javascript.react-native' && sdk != null) {
313
+ const sentryPackages = sdk.getPackages();
314
+ if (sentryPackages != null) {
315
+ for (let index = 0; index < sentryPackages.size(); index++) {
316
+ const sentryPackage = sentryPackages.get(index);
317
+ eventSdk.addPackage(sentryPackage.getName(), sentryPackage.getVersion());
318
+ }
319
+ }
320
+ const integrations = sdk.getIntegrations();
321
+ if (integrations != null) {
322
+ for (let index = 0; index < integrations.size(); index++) {
323
+ eventSdk.addIntegration(integrations.get(index));
324
+ }
325
+ }
326
+ event.setSdk(eventSdk);
327
+ }
328
+ }
329
+ function startWithDsnString(dsnString, options = {}) {
330
+ return new Promise((resolve, reject) => {
331
+ if (initialized) {
332
+ resolve({ status: Status.Failed });
333
+ return;
334
+ }
335
+ try {
336
+ io.sentry.android.core.SentryAndroid.init(Utils.android.getApplicationContext(), new io.sentry.Sentry.OptionsConfiguration({
337
+ configure(config) {
338
+ // config.setLogger(new io.sentry.SystemOutLogger());
339
+ try {
340
+ config.setDsn(dsnString);
341
+ if (options.maxBreadcrumbs) {
342
+ config.setMaxBreadcrumbs(options.maxBreadcrumbs);
343
+ }
344
+ if (!!options.environment) {
345
+ config.setEnvironment(options.environment);
346
+ }
347
+ else {
348
+ config.setEnvironment('javascript');
349
+ }
350
+ if (!!options.debug) {
351
+ io.sentry.Sentry.setLevel(io.sentry.SentryLevel.DEBUG);
352
+ config.setDebug(new java.lang.Boolean(options.debug));
353
+ // config.setDiagnosticLevel(io.sentry.SentryLevel.DEBUG);
354
+ }
355
+ if (!!options.release) {
356
+ config.setRelease(options.release);
357
+ }
358
+ if (!!options.dist) {
359
+ config.setDist(options.dist);
360
+ }
361
+ if (options.enableAutoSessionTracking !== undefined) {
362
+ config.setEnableAutoSessionTracking(options.enableAutoSessionTracking);
363
+ }
364
+ if (options.sessionTrackingIntervalMillis !== undefined) {
365
+ config.setSessionTrackingIntervalMillis(options.sessionTrackingIntervalMillis);
366
+ }
367
+ if (options.enableNdkScopeSync !== undefined) {
368
+ config.setEnableScopeSync(options.enableNdkScopeSync);
369
+ }
370
+ if (options.attachStacktrace !== undefined) {
371
+ config.setAttachStacktrace(options.attachStacktrace);
372
+ }
373
+ if (options.attachThreads !== undefined) {
374
+ // JS use top level stacktraces and android attaches Threads which hides them so
375
+ // by default we hide.
376
+ config.setAttachThreads(options.attachThreads);
377
+ }
378
+ if (options.sendDefaultPii !== undefined) {
379
+ config.setSendDefaultPii(options.sendDefaultPii);
380
+ }
381
+ if (options.enableAutoPerformanceTracking === true) {
382
+ frameMetricsAggregator = new androidx.core.app.FrameMetricsAggregator();
383
+ const currentActivity = Application.android.foregroundActivity;
384
+ if (frameMetricsAggregator != null && currentActivity != null) {
385
+ try {
386
+ frameMetricsAggregator.add(currentActivity);
387
+ }
388
+ catch (err) {
389
+ // throws ConcurrentModification when calling addOnFrameMetricsAvailableListener
390
+ // this is a best effort since we can't reproduce it
391
+ }
392
+ }
393
+ }
394
+ else {
395
+ disableNativeFramesTracking();
396
+ }
397
+ // config.setEnableNdk(true);
398
+ const integrations = config.getIntegrations();
399
+ const size = integrations.size();
400
+ if (options.enableNativeCrashHandling === false) {
401
+ for (let index = size - 1; index >= 0; index--) {
402
+ const inte = integrations.get(index);
403
+ if (inte instanceof io.sentry.UncaughtExceptionHandlerIntegration ||
404
+ inte instanceof io.sentry.android.core.AnrIntegration ||
405
+ inte instanceof io.sentry.android.core.NdkIntegration) {
406
+ integrations.remove(index);
407
+ }
408
+ }
409
+ }
410
+ config.setTransportFactory(new io.sentry.ITransportFactory({
411
+ create(sopt, requestDetails) {
412
+ const map = requestDetails.getHeaders();
413
+ map.put('X-Forwarded-Protocol', 'https');
414
+ if (options.headers) {
415
+ Object.keys(options.headers).forEach(k => {
416
+ map.put(k, options.headers[k]);
417
+ });
418
+ }
419
+ return new io.sentry.transport.AsyncHttpTransport(sopt, new io.sentry.transport.RateLimiter(sopt.getLogger()), sopt.getTransportGate(), requestDetails);
420
+ }
421
+ }));
422
+ config.setBeforeSend(new io.sentry.SentryOptions.BeforeSendCallback({
423
+ execute(event, hint) {
424
+ if (options.beforeSend) {
425
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
426
+ options.beforeSend(event, hint);
427
+ }
428
+ // we use this callback to actually try and get the JS stack when a native error is catched
429
+ try {
430
+ const ex = event.getExceptions().get(0);
431
+ if (ex && ex.getType() === 'NativeScriptException') {
432
+ let mechanism = event.getThrowable && event.getThrowable();
433
+ if (!mechanism) {
434
+ const privateMethod = io.sentry.SentryEvent.class.getDeclaredMethod('getThrowable', null);
435
+ privateMethod.setAccessible(true);
436
+ mechanism = privateMethod.invoke(event, null);
437
+ }
438
+ let throwable;
439
+ if (mechanism instanceof io.sentry.exception.ExceptionMechanismException) {
440
+ throwable = mechanism.getThrowable();
441
+ }
442
+ else if (mechanism instanceof com.tns.NativeScriptException) {
443
+ throwable = mechanism;
444
+ }
445
+ if (throwable) {
446
+ const jsStackTrace = (throwable).getIncomingStackTrace();
447
+ if (jsStackTrace) {
448
+ const stack = parseErrorStack({ stack: jsStackTrace });
449
+ const convertedFrames = convertNativescriptFramesToSentryFrames(stack);
450
+ convertedFrames.forEach((frame) => rewriteFrameIntegration._iteratee(frame));
451
+ addExceptionInterface(event, 'Error', throwable.getMessage(), convertedFrames.reverse());
452
+ }
453
+ }
454
+ }
455
+ }
456
+ catch (e) { }
457
+ event.setTag('event.origin', 'android');
458
+ event.setTag('event.environment', 'nativescript');
459
+ addPackages(event, config.getSdkVersion());
460
+ return event;
461
+ },
462
+ }));
463
+ nSentryOptions = config;
464
+ sentryOptions = options;
465
+ }
466
+ catch (err) {
467
+ console.error('Error starting Sentry', err);
468
+ throw err;
469
+ }
470
+ },
471
+ }));
472
+ initialized = true;
473
+ }
474
+ catch (e) {
475
+ console.error('Catching on startWithDsnString, calling callback', e);
476
+ reject(e);
477
+ return;
478
+ }
479
+ resolve({ status: Status.Success });
480
+ });
481
+ }
482
+ NSSentry.startWithDsnString = startWithDsnString;
483
+ function disableNativeFramesTracking() {
484
+ if (frameMetricsAggregator) {
485
+ frameMetricsAggregator.stop();
486
+ frameMetricsAggregator = null;
487
+ }
488
+ }
489
+ NSSentry.disableNativeFramesTracking = disableNativeFramesTracking;
490
+ // export function setLogLevel(level: number) {
491
+ // switch (level) {
492
+ // case 1:
493
+ // io.sentry.Sentry.setLevel(null);
494
+ // break;
495
+ // case 2:
496
+ // io.sentry.Sentry.setLevel(io.sentry.SentryLevel.ERROR);
497
+ // break;
498
+ // case 3:
499
+ // io.sentry.Sentry.setLevel(io.sentry.SentryLevel.DEBUG);
500
+ // break;
501
+ // case 4:
502
+ // io.sentry.Sentry.setLevel(io.sentry.SentryLevel.INFO);
503
+ // break;
504
+ // }
505
+ // }
506
+ function fetchNativeSdkInfo() {
507
+ return {};
508
+ }
509
+ NSSentry.fetchNativeSdkInfo = fetchNativeSdkInfo;
510
+ function fetchNativeRelease() {
511
+ const context = androidApp.context;
512
+ const packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
513
+ return {
514
+ 'id': packageInfo.packageName,
515
+ 'version': packageInfo.versionName,
516
+ 'build': packageInfo.versionCode + ''
517
+ };
518
+ }
519
+ NSSentry.fetchNativeRelease = fetchNativeRelease;
520
+ function closeNativeSdk() {
521
+ io.sentry.Sentry.close();
522
+ }
523
+ NSSentry.closeNativeSdk = closeNativeSdk;
524
+ function crash() {
525
+ throw new java.lang.RuntimeException('TEST - Sentry Client Crash');
526
+ }
527
+ NSSentry.crash = crash;
528
+ function deviceContexts() {
529
+ return new Promise((resolve) => {
530
+ const nEvent = new io.sentry.SentryEvent();
531
+ const params = {};
532
+ const it = nEvent.getContexts().entrySet().iterator();
533
+ let value, pair, key;
534
+ while (it.hasNext()) {
535
+ pair = it.next();
536
+ value = pair.getValue();
537
+ key = pair.getKey();
538
+ params[key] = getJSHashMap(value);
539
+ }
540
+ resolve(params);
541
+ });
542
+ }
543
+ NSSentry.deviceContexts = deviceContexts;
544
+ function captureUserFeedback(feedback) {
545
+ const userFeedback = new io.sentry.UserFeedback(new io.sentry.protocol.SentryId(feedback.eventId));
546
+ if (feedback.comments) {
547
+ userFeedback.setComments(feedback.comments);
548
+ }
549
+ if (feedback.email) {
550
+ userFeedback.setEmail(feedback.email);
551
+ }
552
+ if (feedback.name) {
553
+ userFeedback.setName(feedback.name);
554
+ }
555
+ io.sentry.Sentry.captureUserFeedback(userFeedback);
556
+ }
557
+ NSSentry.captureUserFeedback = captureUserFeedback;
558
+ function setUser(user, otherUserKeys) {
559
+ io.sentry.Sentry.configureScope(new io.sentry.ScopeCallback({
560
+ run(scope) {
561
+ if (user == null && otherUserKeys == null) {
562
+ scope.setUser(null);
563
+ }
564
+ else {
565
+ const userInstance = new io.sentry.protocol.User();
566
+ if (user) {
567
+ if (user.email) {
568
+ userInstance.setEmail(user.email);
569
+ }
570
+ if (user.id) {
571
+ userInstance.setId(user.id);
572
+ }
573
+ if (user.username) {
574
+ userInstance.setUsername(user.username);
575
+ }
576
+ if (user.ip_address) {
577
+ userInstance.setIpAddress(user.ip_address);
578
+ }
579
+ }
580
+ if (otherUserKeys) {
581
+ userInstance.setOthers(getNativeHashMap(otherUserKeys));
582
+ }
583
+ scope.setUser(userInstance);
584
+ }
585
+ }
586
+ }));
587
+ }
588
+ NSSentry.setUser = setUser;
589
+ function setTag(key, value) {
590
+ io.sentry.Sentry.configureScope(new io.sentry.ScopeCallback({
591
+ run(scope) {
592
+ scope.setTag(key, value);
593
+ }
594
+ }));
595
+ }
596
+ NSSentry.setTag = setTag;
597
+ function setExtra(key, extra) {
598
+ io.sentry.Sentry.configureScope(new io.sentry.ScopeCallback({
599
+ run(scope) {
600
+ scope.setExtra(key, extra);
601
+ }
602
+ }));
603
+ }
604
+ NSSentry.setExtra = setExtra;
605
+ function addBreadcrumb(breadcrumb, maxBreadcrumbs) {
606
+ io.sentry.Sentry.configureScope(new io.sentry.ScopeCallback({
607
+ run(scope) {
608
+ const breadcrumbInstance = new io.sentry.Breadcrumb();
609
+ if (breadcrumb.message) {
610
+ breadcrumbInstance.setMessage(breadcrumb.message);
611
+ }
612
+ if (breadcrumb.type) {
613
+ breadcrumbInstance.setType(breadcrumb.type);
614
+ }
615
+ if (breadcrumb.category) {
616
+ breadcrumbInstance.setCategory(breadcrumb.category);
617
+ }
618
+ if (breadcrumb.level) {
619
+ breadcrumbInstance.setLevel(eventLevel(breadcrumb.level));
620
+ }
621
+ if (breadcrumb.data) {
622
+ Object.keys(breadcrumb.data).forEach(key => {
623
+ breadcrumbInstance.setData(key, breadcrumb.data[key]);
624
+ });
625
+ }
626
+ scope.addBreadcrumb(breadcrumbInstance);
627
+ }
628
+ }));
629
+ }
630
+ NSSentry.addBreadcrumb = addBreadcrumb;
631
+ function clearBreadcrumbs() {
632
+ io.sentry.Sentry.configureScope(new io.sentry.ScopeCallback({
633
+ run(scope) {
634
+ scope.clearBreadcrumbs();
635
+ }
636
+ }));
637
+ }
638
+ NSSentry.clearBreadcrumbs = clearBreadcrumbs;
639
+ function setContext(key, context) {
640
+ // setContext not available on the Android SDK yet.
641
+ setExtra(key, context ? JSON.stringify(context) : null);
642
+ }
643
+ NSSentry.setContext = setContext;
644
+ })(NSSentry || (NSSentry = {}));
645
+ //# sourceMappingURL=nssentry.android.js.map