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 +0 -4
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +3 -2
- package/dist/monitors/errorMonitor.d.ts +5 -2
- package/dist/monitors/errorMonitor.js +53 -17
- package/dist/pageVisit/pageVisitEventError/pageVisitEventError.js +4 -3
- package/dist/react/ErrorBoundary.js +1 -1
- package/dist/types/globals.d.ts +11 -2
- package/dist/utils/function.js +4 -0
- package/dist/utils/stacktrace-parser.js +1 -49
- package/package.json +1 -1
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
|
package/dist/constants.d.ts
CHANGED
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.
|
|
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
|
|
18
|
+
* @param error
|
|
19
19
|
*/
|
|
20
|
-
export declare function onPromiseRejectionHandler(
|
|
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,
|
|
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
|
-
*
|
|
120
|
+
* handler for promise rejection failures
|
|
121
|
+
* @param error
|
|
121
122
|
*/
|
|
122
|
-
function
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
|
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 (
|
|
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,
|
|
321
|
+
export { getOnURL, isErrorCollectedByNoibu, saveErrorToPagevisit };
|
package/dist/types/globals.d.ts
CHANGED
|
@@ -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?:
|
|
27
|
-
setPromiseRejectionTrackingHook?:
|
|
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;
|
package/dist/utils/function.js
CHANGED
|
@@ -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 =
|
|
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