noibu-react-native 0.0.9 → 0.1.1

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 CHANGED
@@ -164,10 +164,6 @@ import { NoibuJS } from 'noibu-react-native';
164
164
  NoibuJS.addJsSdkError(new Error('My Error'), 'myModule.js');
165
165
  ```
166
166
 
167
- ## Contributing
168
-
169
- You can contribute by checking out the project page and open issues. https://linear.app/noibu/project/react-native-sdk-5ccd19a3343a
170
-
171
167
  ## License
172
168
 
173
169
  Copyright 2023 Noibu.com
@@ -226,3 +226,4 @@ export declare function GET_METROPLEX_METRICS_URL(): string;
226
226
  */
227
227
  export declare function JS_ENV(): string;
228
228
  export declare const METROPLEX_RETRY_FREQUENCY: 30000;
229
+ export declare const STACK_TRACE_SANITIZE_REGEXP: RegExp;
package/dist/constants.js CHANGED
@@ -315,7 +315,7 @@ const CONTENT_LENGTH = 'content-length';
315
315
  * Gets the script id from the cookie object, returns default if cannot be found
316
316
  */
317
317
  function GET_SCRIPT_ID() {
318
- return "1.0.104-rn-sdk-0.0.9" ;
318
+ return "1.0.104-rn-sdk-0.1.1" ;
319
319
  }
320
320
  /**
321
321
  *
@@ -423,5 +423,6 @@ function JS_ENV() {
423
423
  }
424
424
  // gets the frequency at which the client resends the message that were not confirmed by metroplex
425
425
  const METROPLEX_RETRY_FREQUENCY = 30000;
426
+ const STACK_TRACE_SANITIZE_REGEXP = /(nbuGlobalPromiseRejectWrapper|(hermes.*InternalBytecode\/InternalBytecode))/gi;
426
427
 
427
- export { APP_NAVIGATION_EVENT_TYPE, BLOCKED_HTTP_HEADER_KEYS, BLOCK_SOCKET_MESSAGE, BROWSER_ID_ATT_NAME, CLICK_EVENT_TYPE, CLIENT_LOCK_TIME_MINUTES, CLOSE_CONNECTION_FORCEFULLY, COLLECT_VER_ATT_NAME, CONN_COUNT_ATT_NAME, CONSOLE_FUNCTION_OVERRIDES, CONTENT_LENGTH, CONTENT_TYPE, CSS_CLASS_ATT_NAME, CURRENT_METRICS_VERSION, CURRENT_NOIBUJS_VERSION, CURRENT_PV_VERSION, CUSTOM_ERROR_EVENT_TYPE, CUSTOM_ID_NAME_TYPE, CUSTOM_ID_VALUE_TYPE, DEFAULT_STACK_FRAME_FIELD_VALUE, DEFAULT_WEBSITE_SUBDOMAIN_PATTERN, DID_CUT_PV_ATT_NAME, DID_CUT_VID_ATT_NAME, DID_START_VID_ATT_NAME, END_AT_ATT_NAME, ERROR_EVENT_ERROR_TYPE, ERROR_EVENT_TYPE, ERROR_EVENT_UNHANDLED_REJECTION_TYPE, ERROR_LOG_EVENT_ERROR_TYPE, ERROR_SOURCE_ATT_NAME, ERR_COUNT_EXPECTED_ATT_NAME, EVENT_ERROR_TYPE, EXP_VIDEO_LENGTH_ATT_NAME, FETCH_EXCEPTION_ERROR_TYPE, GET_MAX_METROPLEX_RECONNECTION_NUMBER, GET_METROPLEX_BASE_HTTP_URL, GET_METROPLEX_BASE_SOCKET_URL, GET_METROPLEX_CONSECUTIVE_CONNECTION_DELAY, GET_METROPLEX_METRICS_URL, GET_METROPLEX_POST_URL, GET_SCRIPT_ID, GQL_ERROR_ATT_NAME, GQL_ERROR_TYPE, GQL_EVENT_TYPE, HELP_CODE_ATT_NAME, HTMLID_ATT_NAME, HTTP_BODY_DROPPED_LENGTH_MSG, HTTP_BODY_DROPPED_TYPE_MSG, HTTP_BODY_NULL_STRING, HTTP_CODE_ATT_NAME, HTTP_COUNT_EXPECTED_ATT_NAME, HTTP_DATA_METROPLEX_TYPE, HTTP_DATA_PAYLOAD_ATT_NAME, HTTP_DATA_REQ_HEADERS_ATT_NAME, HTTP_DATA_RESP_HEADERS_ATT_NAME, HTTP_DATA_RESP_PAYLOAD_ATT_NAME, HTTP_EVENT_TYPE, HTTP_METHOD_ATT_NAME, HTTP_PII_BLOCKING_PATTERNS, HTTP_RESP_CODE_ATT_NAME, HTTP_RESP_LENGTH_ATT_NAME, HTTP_RESP_TIME_ATT_NAME, HUMAN_READABLE_CONTENT_TYPE_REGEX, IS_LAST_ATT_NAME, IS_NJS_VERSION_BETA, JS_ENV, JS_ERROR_ATT_NAME, JS_EVENT_TYPE, JS_STACK_FILE_ATT_NAME, JS_STACK_FRAMES_ATT_NAME, JS_STACK_MESSAGE_ATT_NAME, JS_STACK_METHOD_ATT_NAME, KEYBOARD_EVENT_TYPE, MAX_BEACON_PAYLOAD_SIZE, MAX_COLLECT_ERROR_LOG, MAX_CUSTOM_ERRORS_PER_PAGEVISIT, MAX_CUSTOM_IDS_PER_PAGEVISIT, MAX_FRAMES_IN_ARRAY, MAX_HTTP_DATA_EVENT_COUNT, MAX_HTTP_DATA_PAYLOAD_LENGTH, MAX_METROPLEX_CONNECTION_COUNT, MAX_METROPLEX_SOCKET_INNACTIVE_TIME, MAX_PAGEVISIT_EVENTS, MAX_PAGEVISIT_PARTS, MAX_PAGEVISIT_VISITED, MAX_STRING_LENGTH, MAX_TIME_FOR_UNSENT_DATA_MILLIS, META_DATA_METROPLEX_TYPE, METROPLEX_ERROR_ROUTE, METROPLEX_FRAG_ROUTE, METROPLEX_FULL_PV_ROUTE, METROPLEX_METRICS_ROUTE, METROPLEX_RETRY_FREQUENCY, METROPLEX_SOCKET_INSTANCE_ID_ATT_NAME, NOIBUJS_SDK_ADD_ERROR_FROM_JS_FMW_FUNCTION, NOIBUJS_SDK_ADD_ERROR_FUNCTION, NOIBUJS_SDK_ADD_ID_FUNCTION, NOIBUJS_SDK_REQUEST_HELP_CODE, NOIBU_BROWSER_ID_KYWRD, NOIBU_INPUT_URLS, NOIBU_LOCAL_STORAGE_TEST_KEY, NOIBU_STORED_PAGE_VISIT, OCCURRED_AT_ATT_NAME, OK_SOCKET_MESSAGE, ON_URL_ATT_NAME, PAGE_EVENTS_DOCUMENT, PAGE_EVENTS_WINDOW, PAGE_EVENT_TYPE, PAGE_VISIT_HTTP_DATA_ATT_NAME, PAGE_VISIT_INFORMATION_ATT_NAME, PAGE_VISIT_META_DATA_ATT_NAME, PAGE_VISIT_PART_ATT_NAME, PAGE_VISIT_VID_FRAG_ATT_NAME, PII_DIGIT_PATTERN, PII_EMAIL_PATTERN, PII_REDACTION_REPLACEMENT_STRING, PV_CLICKS_ATT_NAME, PV_EVENTS_ATT_NAME, PV_EXP_HTTP_DATA_SEQ_ATT_NAME, PV_EXP_PART_COUNTER_ATT_NAME, PV_EXP_VF_SEQ_ATT_NAME, PV_HTTP_PAYLOADS_COLLECTED_ATT_NAME, PV_HTTP_PAYLOADS_DROPPED_OVERSIZE_ATT_NAME, PV_HTTP_PAYLOADS_DROPPED_TYPE_ATT_NAME, PV_HTTP_REQUESTS_DROPPED_OVER_LIMIT, PV_ID_ATT_NAME, PV_METROPLEX_TYPE, PV_PART_COUNTER_ATT_NAME, PV_SEQ_ATT_NAME, PV_SEQ_NUM_RESET_TIME_MINUTES, REF_URL_ATT_NAME, REQUIRED_DATA_PROCESSING_URLS, RESPONSE_ERROR_TYPE, SCRIPT_ID_ATT_NAME, SCRIPT_INSTANCE_ID_ATT_NAME, SEQ_NUM_ATT_NAME, SEVERITY, SOCKET_INSTANCE_ID_ATT_NAME, SOURCE_ATT_NAME, STARTED_AT_ATT_NAME, STOP_STORING_PV_SOCKET_MESSAGE, STOP_STORING_VID_SOCKET_MESSAGE, TAGNAME_ATT_NAME, TEXT_ATT_NAME, TYPE_ATT_NAME, URL_ATT_NAME, USERSTEP_EVENT_TYPE, VER_ATT_NAME, VIDEO_CLICKS_ATT_NAME, VIDEO_METROPLEX_TYPE, VIDEO_PART_COUNT_ATT_NAME, WHITELIST_HTML_ID_TEXT_REGEX, WORK_REQUEST_ATT_NAME, WRAPPED_EXCEPTION_ERROR_TYPE, XML_HTTP_REQUEST_ERROR_TYPE };
428
+ export { APP_NAVIGATION_EVENT_TYPE, BLOCKED_HTTP_HEADER_KEYS, BLOCK_SOCKET_MESSAGE, BROWSER_ID_ATT_NAME, CLICK_EVENT_TYPE, CLIENT_LOCK_TIME_MINUTES, CLOSE_CONNECTION_FORCEFULLY, COLLECT_VER_ATT_NAME, CONN_COUNT_ATT_NAME, CONSOLE_FUNCTION_OVERRIDES, CONTENT_LENGTH, CONTENT_TYPE, CSS_CLASS_ATT_NAME, CURRENT_METRICS_VERSION, CURRENT_NOIBUJS_VERSION, CURRENT_PV_VERSION, CUSTOM_ERROR_EVENT_TYPE, CUSTOM_ID_NAME_TYPE, CUSTOM_ID_VALUE_TYPE, DEFAULT_STACK_FRAME_FIELD_VALUE, DEFAULT_WEBSITE_SUBDOMAIN_PATTERN, DID_CUT_PV_ATT_NAME, DID_CUT_VID_ATT_NAME, DID_START_VID_ATT_NAME, END_AT_ATT_NAME, ERROR_EVENT_ERROR_TYPE, ERROR_EVENT_TYPE, ERROR_EVENT_UNHANDLED_REJECTION_TYPE, ERROR_LOG_EVENT_ERROR_TYPE, ERROR_SOURCE_ATT_NAME, ERR_COUNT_EXPECTED_ATT_NAME, EVENT_ERROR_TYPE, EXP_VIDEO_LENGTH_ATT_NAME, FETCH_EXCEPTION_ERROR_TYPE, GET_MAX_METROPLEX_RECONNECTION_NUMBER, GET_METROPLEX_BASE_HTTP_URL, GET_METROPLEX_BASE_SOCKET_URL, GET_METROPLEX_CONSECUTIVE_CONNECTION_DELAY, GET_METROPLEX_METRICS_URL, GET_METROPLEX_POST_URL, GET_SCRIPT_ID, GQL_ERROR_ATT_NAME, GQL_ERROR_TYPE, GQL_EVENT_TYPE, HELP_CODE_ATT_NAME, HTMLID_ATT_NAME, HTTP_BODY_DROPPED_LENGTH_MSG, HTTP_BODY_DROPPED_TYPE_MSG, HTTP_BODY_NULL_STRING, HTTP_CODE_ATT_NAME, HTTP_COUNT_EXPECTED_ATT_NAME, HTTP_DATA_METROPLEX_TYPE, HTTP_DATA_PAYLOAD_ATT_NAME, HTTP_DATA_REQ_HEADERS_ATT_NAME, HTTP_DATA_RESP_HEADERS_ATT_NAME, HTTP_DATA_RESP_PAYLOAD_ATT_NAME, HTTP_EVENT_TYPE, HTTP_METHOD_ATT_NAME, HTTP_PII_BLOCKING_PATTERNS, HTTP_RESP_CODE_ATT_NAME, HTTP_RESP_LENGTH_ATT_NAME, HTTP_RESP_TIME_ATT_NAME, HUMAN_READABLE_CONTENT_TYPE_REGEX, IS_LAST_ATT_NAME, IS_NJS_VERSION_BETA, JS_ENV, JS_ERROR_ATT_NAME, JS_EVENT_TYPE, JS_STACK_FILE_ATT_NAME, JS_STACK_FRAMES_ATT_NAME, JS_STACK_MESSAGE_ATT_NAME, JS_STACK_METHOD_ATT_NAME, KEYBOARD_EVENT_TYPE, MAX_BEACON_PAYLOAD_SIZE, MAX_COLLECT_ERROR_LOG, MAX_CUSTOM_ERRORS_PER_PAGEVISIT, MAX_CUSTOM_IDS_PER_PAGEVISIT, MAX_FRAMES_IN_ARRAY, MAX_HTTP_DATA_EVENT_COUNT, MAX_HTTP_DATA_PAYLOAD_LENGTH, MAX_METROPLEX_CONNECTION_COUNT, MAX_METROPLEX_SOCKET_INNACTIVE_TIME, MAX_PAGEVISIT_EVENTS, MAX_PAGEVISIT_PARTS, MAX_PAGEVISIT_VISITED, MAX_STRING_LENGTH, MAX_TIME_FOR_UNSENT_DATA_MILLIS, META_DATA_METROPLEX_TYPE, METROPLEX_ERROR_ROUTE, METROPLEX_FRAG_ROUTE, METROPLEX_FULL_PV_ROUTE, METROPLEX_METRICS_ROUTE, METROPLEX_RETRY_FREQUENCY, METROPLEX_SOCKET_INSTANCE_ID_ATT_NAME, NOIBUJS_SDK_ADD_ERROR_FROM_JS_FMW_FUNCTION, NOIBUJS_SDK_ADD_ERROR_FUNCTION, NOIBUJS_SDK_ADD_ID_FUNCTION, NOIBUJS_SDK_REQUEST_HELP_CODE, NOIBU_BROWSER_ID_KYWRD, NOIBU_INPUT_URLS, NOIBU_LOCAL_STORAGE_TEST_KEY, NOIBU_STORED_PAGE_VISIT, OCCURRED_AT_ATT_NAME, OK_SOCKET_MESSAGE, ON_URL_ATT_NAME, PAGE_EVENTS_DOCUMENT, PAGE_EVENTS_WINDOW, PAGE_EVENT_TYPE, PAGE_VISIT_HTTP_DATA_ATT_NAME, PAGE_VISIT_INFORMATION_ATT_NAME, PAGE_VISIT_META_DATA_ATT_NAME, PAGE_VISIT_PART_ATT_NAME, PAGE_VISIT_VID_FRAG_ATT_NAME, PII_DIGIT_PATTERN, PII_EMAIL_PATTERN, PII_REDACTION_REPLACEMENT_STRING, PV_CLICKS_ATT_NAME, PV_EVENTS_ATT_NAME, PV_EXP_HTTP_DATA_SEQ_ATT_NAME, PV_EXP_PART_COUNTER_ATT_NAME, PV_EXP_VF_SEQ_ATT_NAME, PV_HTTP_PAYLOADS_COLLECTED_ATT_NAME, PV_HTTP_PAYLOADS_DROPPED_OVERSIZE_ATT_NAME, PV_HTTP_PAYLOADS_DROPPED_TYPE_ATT_NAME, PV_HTTP_REQUESTS_DROPPED_OVER_LIMIT, PV_ID_ATT_NAME, PV_METROPLEX_TYPE, PV_PART_COUNTER_ATT_NAME, PV_SEQ_ATT_NAME, PV_SEQ_NUM_RESET_TIME_MINUTES, REF_URL_ATT_NAME, REQUIRED_DATA_PROCESSING_URLS, RESPONSE_ERROR_TYPE, SCRIPT_ID_ATT_NAME, SCRIPT_INSTANCE_ID_ATT_NAME, SEQ_NUM_ATT_NAME, SEVERITY, SOCKET_INSTANCE_ID_ATT_NAME, SOURCE_ATT_NAME, STACK_TRACE_SANITIZE_REGEXP, STARTED_AT_ATT_NAME, STOP_STORING_PV_SOCKET_MESSAGE, STOP_STORING_VID_SOCKET_MESSAGE, TAGNAME_ATT_NAME, TEXT_ATT_NAME, TYPE_ATT_NAME, URL_ATT_NAME, USERSTEP_EVENT_TYPE, VER_ATT_NAME, VIDEO_CLICKS_ATT_NAME, VIDEO_METROPLEX_TYPE, VIDEO_PART_COUNT_ATT_NAME, WHITELIST_HTML_ID_TEXT_REGEX, WORK_REQUEST_ATT_NAME, WRAPPED_EXCEPTION_ERROR_TYPE, XML_HTTP_REQUEST_ERROR_TYPE };
@@ -15,9 +15,12 @@ export declare function wrap(functionToWrap: WrappedFunction): Function;
15
15
  export declare function processErrorLogArguments(argsFromErrorLog: any[]): void;
16
16
  /**
17
17
  * handler for promise rejection failures
18
- * @param {} event
18
+ * @param error
19
19
  */
20
- export declare function onPromiseRejectionHandler(event: PromiseRejectedResult): void;
20
+ export declare function onPromiseRejectionHandler(error: {
21
+ message: string;
22
+ stack?: string;
23
+ }): void;
21
24
  /**
22
25
  * Monitors the errors happening on the window
23
26
  */
@@ -1,6 +1,6 @@
1
1
  import { replace } from '../utils/object.js';
2
- import { isStackTrace } from '../utils/function.js';
3
- import { ERROR_EVENT_ERROR_TYPE, CONSOLE_FUNCTION_OVERRIDES, ERROR_LOG_EVENT_ERROR_TYPE } from '../constants.js';
2
+ import { asString, isStackTrace } from '../utils/function.js';
3
+ import { CONSOLE_FUNCTION_OVERRIDES, ERROR_EVENT_ERROR_TYPE, STACK_TRACE_SANITIZE_REGEXP, ERROR_EVENT_UNHANDLED_REJECTION_TYPE, ERROR_LOG_EVENT_ERROR_TYPE } from '../constants.js';
4
4
  import { saveErrorToPagevisit } from '../pageVisit/pageVisitEventError/pageVisitEventError.js';
5
5
 
6
6
  /* eslint-disable @typescript-eslint/ban-types,prefer-arrow-callback */
@@ -117,11 +117,49 @@ function configureEventListeners() {
117
117
  });
118
118
  }
119
119
  /**
120
- * Monitors the errors happening on the window
120
+ * handler for promise rejection failures
121
+ * @param error
121
122
  */
122
- function monitorErrors() {
123
- // wrapping all listeners as soon as possible after we set the above listener
124
- configureEventListeners();
123
+ function onPromiseRejectionHandler(error) {
124
+ if (!error || !error.message || !error.stack) {
125
+ return;
126
+ }
127
+ const sanitizedStack = error.stack
128
+ .split('\n')
129
+ .filter(line => !line.match(STACK_TRACE_SANITIZE_REGEXP))
130
+ .join('\n');
131
+ const payload = {
132
+ error: {
133
+ message: error.message,
134
+ stack: sanitizedStack,
135
+ },
136
+ };
137
+ saveErrorToPagevisit(ERROR_EVENT_UNHANDLED_REJECTION_TYPE, payload);
138
+ }
139
+ function configureHermesHooks() {
140
+ if (global.HermesInternal) {
141
+ global.HermesInternal.enablePromiseRejectionTracker?.({
142
+ allRejections: true,
143
+ });
144
+ /**
145
+ * This internal promise implementation method is populated only after enabling the promise tracker.
146
+ * It represents an improvement over the previous approach,
147
+ * which would lose stack context regarding the rejection because it ran asynchronously through setTimeout.
148
+ *
149
+ * This updated method ensures synchronous error capturing and retrieves the correct stack frames.
150
+ */
151
+ replace(Promise, '_m', (originalFunction) => function nbuGlobalPromiseRejectWrapper(promise, error) {
152
+ if (error.message && error.stack) {
153
+ onPromiseRejectionHandler(error);
154
+ }
155
+ else {
156
+ onPromiseRejectionHandler(new Error(asString(error)));
157
+ }
158
+ return originalFunction?.(promise, error);
159
+ });
160
+ }
161
+ }
162
+ function configureErrorUtilsHandler() {
125
163
  const existingHandler = global.ErrorUtils.getGlobalHandler() || (() => { });
126
164
  global.ErrorUtils.setGlobalHandler((error, ...rest) => {
127
165
  saveErrorToPagevisit(ERROR_EVENT_ERROR_TYPE, {
@@ -129,16 +167,14 @@ function monitorErrors() {
129
167
  });
130
168
  return existingHandler(error, ...rest);
131
169
  });
132
- if (global.HermesInternal) {
133
- global.HermesInternal.enablePromiseRejectionTracker({
134
- allRejections: true,
135
- onUnhandled: (id, rejection = {}) => {
136
- saveErrorToPagevisit(ERROR_EVENT_ERROR_TYPE, {
137
- error: rejection,
138
- });
139
- },
140
- });
141
- }
170
+ }
171
+ /**
172
+ * Monitors the errors happening on the window
173
+ */
174
+ function monitorErrors() {
175
+ configureEventListeners();
176
+ configureHermesHooks();
177
+ configureErrorUtilsHandler();
142
178
  }
143
179
 
144
- export { monitorErrors, processErrorLogArguments };
180
+ export { monitorErrors, onPromiseRejectionHandler, processErrorLogArguments };
@@ -210,7 +210,7 @@ function createPageVisitEventError(type, errPayload, httpDataSeqNum) {
210
210
  * determines if an error is a collect error
211
211
  * @param {} pvError
212
212
  */
213
- function isCollectError(pvError) {
213
+ function isErrorCollectedByNoibu(pvError) {
214
214
  // checking if this error originated from the Noibu script
215
215
  if (pvError[TYPE_ATT_NAME] === JS_EVENT_TYPE) {
216
216
  if (pvError[JS_ERROR_ATT_NAME]) {
@@ -222,6 +222,7 @@ function isCollectError(pvError) {
222
222
 
223
223
  if (
224
224
  lowerCapFile.includes('noibu') &&
225
+ !lowerCapFile.includes('examplenoibureactnativeapp') &&
225
226
  !lowerCapMethod.includes('nbuwrapper')
226
227
  ) {
227
228
  // if the first file in the stack is Noibu then we do not
@@ -307,7 +308,7 @@ function saveErrorToPagevisit(type, payload, httpDataSeqNum) {
307
308
  }
308
309
  }
309
310
 
310
- if (isCollectError(pvError)) {
311
+ if (isErrorCollectedByNoibu(pvError)) {
311
312
  return;
312
313
  }
313
314
 
@@ -317,4 +318,4 @@ function saveErrorToPagevisit(type, payload, httpDataSeqNum) {
317
318
  InputMonitor.getInstance().addEvent(pvError, ERROR_EVENT_TYPE);
318
319
  }
319
320
 
320
- export { getOnURL, isCollectError, saveErrorToPagevisit };
321
+ export { getOnURL, isErrorCollectedByNoibu, saveErrorToPagevisit };
@@ -79,7 +79,7 @@ class ErrorBoundary extends React.Component {
79
79
  element = fallback({
80
80
  error,
81
81
  componentStack,
82
- resetError: this.resetErrorBoundary,
82
+ resetError: this.resetErrorBoundary.bind(this),
83
83
  eventId,
84
84
  });
85
85
  }
@@ -17,14 +17,23 @@ declare global {
17
17
  type Window = {
18
18
  noibuJSLoaded?: boolean;
19
19
  };
20
+ type PromiseRejectionTrackerOptions = Partial<{
21
+ allRejections: boolean;
22
+ whitelist: (typeof Error)[];
23
+ onUnhandled: (id: number, reason: any) => void;
24
+ onHandled: (id: number, reason: any) => void;
25
+ }>;
20
26
  type global = {
21
27
  window: Window;
22
28
  console: Console;
23
29
  noibuJSLoaded?: boolean;
24
30
  ErrorUtils: any;
25
31
  HermesInternal: null | {
26
- enablePromiseRejectionTracker?: any;
27
- setPromiseRejectionTrackingHook?: any;
32
+ enablePromiseRejectionTracker?: (options: PromiseRejectionTrackerOptions) => void;
33
+ setPromiseRejectionTrackingHook?: (enable: (options: PromiseRejectionTrackerOptions) => void) => void;
34
+ };
35
+ Promise: {
36
+ _m: () => void;
28
37
  };
29
38
  };
30
39
  const global: global;
@@ -41,6 +41,10 @@ function processFrames(rawFrames) {
41
41
  }
42
42
  if (frame.file && frame.file !== '<unknown>') {
43
43
  processedFrame.file = String(frame.file);
44
+ if (isValidURL(processedFrame.file)) {
45
+ // todo remove comment if assumption that react native only has local urls in filenames is correct
46
+ processedFrame.file = new URL(processedFrame.file).pathname;
47
+ }
44
48
  }
45
49
  if (frame.column) {
46
50
  if (Number.isInteger(frame.column)) {
@@ -88,50 +88,6 @@ const chrome = (line) => {
88
88
  }
89
89
  return undefined;
90
90
  };
91
- const geckoREgex = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i;
92
- const geckoEvalRegex = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
93
- const gecko = (line) => {
94
- const parts = geckoREgex.exec(line);
95
- if (parts) {
96
- const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
97
- if (isEval) {
98
- const subMatch = geckoEvalRegex.exec(parts[3]);
99
- if (subMatch) {
100
- // throw out eval line/column and use top-most line number
101
- parts[1] = parts[1] || 'eval';
102
- parts[3] = subMatch[1];
103
- parts[4] = subMatch[2];
104
- parts[5] = ''; // no column when eval
105
- }
106
- }
107
- let filename = parts[3];
108
- let func = parts[1] || UNKNOWN_FUNCTION;
109
- [func, filename] = extractSafariExtensionDetails(func, filename);
110
- return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);
111
- }
112
- return undefined;
113
- };
114
- const winjsRegex = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:[-a-z]+):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
115
- const winjs = (line) => {
116
- const parts = winjsRegex.exec(line);
117
- return parts
118
- ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)
119
- : undefined;
120
- };
121
- const opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i;
122
- const opera10 = (line) => {
123
- const parts = opera10Regex.exec(line);
124
- return parts
125
- ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1])
126
- : undefined;
127
- };
128
- const opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\(.*\))? in (.*):\s*$/i;
129
- const opera11 = (line) => {
130
- const parts = opera11Regex.exec(line);
131
- return parts
132
- ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2])
133
- : undefined;
134
- };
135
91
  function parseStack(stackString) {
136
92
  const lines = stackString.split('\n');
137
93
  if (lines.length > MAX_FRAMES_IN_ARRAY) {
@@ -141,11 +97,7 @@ function parseStack(stackString) {
141
97
  if (line.length > MAX_STRING_LENGTH) {
142
98
  return stack;
143
99
  }
144
- const parseResult = gecko(line) ||
145
- chrome(line) ||
146
- winjs(line) ||
147
- opera11(line) ||
148
- opera10(line);
100
+ const parseResult = chrome(line);
149
101
  if (parseResult) {
150
102
  stack.push(parseResult);
151
103
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "noibu-react-native",
3
- "version": "0.0.9",
3
+ "version": "0.1.1",
4
4
  "targetNjsVersion": "1.0.104",
5
5
  "description": "React-Native SDK for NoibuJS to collect errors in React-Native applications",
6
6
  "main": "dist/entry/index.js",