noibu-react-native 0.1.1 → 0.1.3

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.
Files changed (35) hide show
  1. package/dist/api/clientConfig.d.ts +4 -5
  2. package/dist/api/clientConfig.js +21 -15
  3. package/dist/api/inputManager.js +1 -1
  4. package/dist/api/metroplexSocket.d.ts +155 -0
  5. package/dist/api/metroplexSocket.js +667 -804
  6. package/dist/api/storedMetrics.js +2 -1
  7. package/dist/constants.d.ts +11 -0
  8. package/dist/constants.js +15 -2
  9. package/dist/entry/index.js +2 -0
  10. package/dist/entry/init.d.ts +1 -1
  11. package/dist/entry/init.js +9 -2
  12. package/dist/monitors/appNavigationMonitor.js +3 -2
  13. package/dist/monitors/clickMonitor.js +1 -1
  14. package/dist/monitors/errorMonitor.js +2 -2
  15. package/dist/monitors/httpDataBundler.js +62 -15
  16. package/dist/monitors/inputMonitor.js +5 -0
  17. package/dist/monitors/integrations/react-native-navigation-integration.d.ts +1 -2
  18. package/dist/monitors/keyboardInputMonitor.js +1 -1
  19. package/dist/monitors/requestMonitor.js +47 -310
  20. package/dist/pageVisit/pageVisit.js +5 -0
  21. package/dist/pageVisit/{pageVisitEventError/pageVisitEventError.js → pageVisitEventError.js} +18 -19
  22. package/dist/pageVisit/{pageVisitEventHTTP/pageVisitEventHTTP.js → pageVisitEventHTTP.js} +15 -7
  23. package/dist/pageVisit/{userStep/userStep.js → userStep.js} +2 -2
  24. package/dist/types/NavigationIntegration.d.ts +1 -2
  25. package/dist/types/globals.d.ts +6 -3
  26. package/dist/utils/function.d.ts +2 -3
  27. package/dist/utils/function.js +15 -10
  28. package/dist/utils/log.d.ts +5 -0
  29. package/dist/utils/log.js +17 -0
  30. package/dist/utils/object.d.ts +41 -0
  31. package/dist/utils/object.js +85 -108
  32. package/dist/utils/performance.d.ts +6 -0
  33. package/dist/utils/performance.js +1 -2
  34. package/package.json +5 -4
  35. package/dist/pageVisit/pageVisitEventError/blacklistedDomains.js +0 -9
@@ -2,6 +2,7 @@ import { BROWSER_ID_ATT_NAME, PV_ID_ATT_NAME, COLLECT_VER_ATT_NAME, CURRENT_NOIB
2
2
  import ClientConfig from './clientConfig.js';
3
3
  import { getUserAgent, stringifyJSON } from '../utils/function.js';
4
4
  import { addSafeEventListener } from '../utils/eventlistener.js';
5
+ import { unwrapNoibuWrapped } from '../utils/object.js';
5
6
 
6
7
  /** @module StoredMetrics */
7
8
 
@@ -181,7 +182,7 @@ class StoredMetrics {
181
182
  [ERR_COUNT_EXPECTED_ATT_NAME]: this.errCount,
182
183
  [ON_URL_ATT_NAME]: ClientConfig.getInstance().globalUrl,
183
184
  };
184
- global.fetch(GET_METROPLEX_METRICS_URL(), {
185
+ unwrapNoibuWrapped(fetch)(GET_METROPLEX_METRICS_URL(), {
185
186
  method: 'POST',
186
187
  headers: {
187
188
  'content-type': 'application/json',
@@ -225,5 +225,16 @@ export declare function GET_METROPLEX_METRICS_URL(): string;
225
225
  * gets the current env
226
226
  */
227
227
  export declare function JS_ENV(): string;
228
+ /**
229
+ * gets the current env
230
+ */
231
+ export declare function GET_DEVICE_ENV(): string;
228
232
  export declare const METROPLEX_RETRY_FREQUENCY: 30000;
229
233
  export declare const STACK_TRACE_SANITIZE_REGEXP: RegExp;
234
+ export declare const BLOCKLISTED_DOMAINS: {
235
+ 'input.noibu.com': boolean;
236
+ 'input.staging.noibu.com': boolean;
237
+ 'vf.noibu.com': boolean;
238
+ 'vf.staging.noibu.com': boolean;
239
+ 'cdn.noibu.com': boolean;
240
+ };
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.1.1" ;
318
+ return "1.0.104-rn-sdk-0.1.3" ;
319
319
  }
320
320
  /**
321
321
  *
@@ -421,8 +421,21 @@ function JS_ENV() {
421
421
  return 'test';
422
422
  }
423
423
  }
424
+ /**
425
+ * gets the current env
426
+ */
427
+ function GET_DEVICE_ENV() {
428
+ return "react-native-expo" ;
429
+ }
424
430
  // gets the frequency at which the client resends the message that were not confirmed by metroplex
425
431
  const METROPLEX_RETRY_FREQUENCY = 30000;
426
432
  const STACK_TRACE_SANITIZE_REGEXP = /(nbuGlobalPromiseRejectWrapper|(hermes.*InternalBytecode\/InternalBytecode))/gi;
433
+ const BLOCKLISTED_DOMAINS = {
434
+ 'input.noibu.com': true,
435
+ 'input.staging.noibu.com': true,
436
+ 'vf.noibu.com': true,
437
+ 'vf.staging.noibu.com': true,
438
+ 'cdn.noibu.com': true,
439
+ };
427
440
 
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 };
441
+ export { APP_NAVIGATION_EVENT_TYPE, BLOCKED_HTTP_HEADER_KEYS, BLOCKLISTED_DOMAINS, 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_DEVICE_ENV, 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 };
@@ -2,7 +2,9 @@ import 'react-native-url-polyfill/auto';
2
2
  import globalInit from './init.js';
3
3
  import { ErrorBoundary as ErrorBoundary$1 } from '../react/ErrorBoundary.js';
4
4
  import InputManager from '../api/inputManager.js';
5
+ import { noibuLog } from '../utils/log.js';
5
6
 
7
+ noibuLog('imported');
6
8
  /**
7
9
  * @param config
8
10
  */
@@ -2,4 +2,4 @@ import { CustomerConfig } from '../types/Config';
2
2
  /**
3
3
  * initilializes the script to start executing all of NJS features
4
4
  */
5
- export default function globalInit(customerConfig: CustomerConfig): void;
5
+ export default function globalInit(customerConfig: CustomerConfig): Promise<void>;
@@ -13,6 +13,7 @@ import MetroplexSocket from '../api/metroplexSocket.js';
13
13
  import StoredPageVisit from '../api/storedPageVisit.js';
14
14
  import HelpCode from '../api/helpCode.js';
15
15
  import { AppNavigationMonitor } from '../monitors/appNavigationMonitor.js';
16
+ import { noibuLog } from '../utils/log.js';
16
17
 
17
18
  /** @module Init */
18
19
  // these are set via rollup
@@ -23,19 +24,22 @@ const urlConfig = {
23
24
  /**
24
25
  * initilializes the script to start executing all of NJS features
25
26
  */
26
- function globalInit(customerConfig) {
27
+ async function globalInit(customerConfig) {
28
+ noibuLog('global init started');
27
29
  // if the config url is invalid we block collect from executing
28
30
  if (isInvalidURLConfig({ ...urlConfig, domain: customerConfig.domain })) {
31
+ noibuLog('exiting');
29
32
  return;
30
33
  }
31
34
  // ensure only one copy of NoibuJS is running at a time
32
35
  if (isNoibuJSAlreadyLoaded()) {
36
+ noibuLog('exiting');
33
37
  return;
34
38
  }
35
39
  const noibuErrorURL = `${urlConfig.metroplexHTTPBase}/${METROPLEX_ERROR_ROUTE}`;
36
40
  // catch any errors that happened during initialization and send collect error
37
41
  try {
38
- ClientConfig.configureInstance({
42
+ await ClientConfig.configureInstance({
39
43
  noibuErrorURL,
40
44
  customerConfig,
41
45
  });
@@ -43,6 +47,7 @@ function globalInit(customerConfig) {
43
47
  const instanceId = uuid.v4();
44
48
  // verifying if collect was disabled by other microservices
45
49
  if (ClientConfig.getInstance().isClientDisabled) {
50
+ noibuLog('client disabled, exiting');
46
51
  return;
47
52
  }
48
53
  HelpCode.getInstance();
@@ -68,9 +73,11 @@ function globalInit(customerConfig) {
68
73
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
69
74
  // @ts-ignore
70
75
  metroplexSocket.connectionPromise.catch((e) => ClientConfig.getInstance().postNoibuErrorAndOptionallyDisableClient(`Error during metroplexSocket initial connection: ${e}`, false, SEVERITY.error));
76
+ noibuLog('global init finished');
71
77
  }
72
78
  catch (err) {
73
79
  ClientConfig.getInstance().postNoibuErrorAndOptionallyDisableClient(`Error during globalInit: ${err}`, true, SEVERITY.error);
80
+ noibuLog('exiting');
74
81
  }
75
82
  }
76
83
 
@@ -14,8 +14,9 @@ class AppNavigationMonitor {
14
14
  constructor() {
15
15
  this.onNavigation = this.onNavigation.bind(this);
16
16
  try {
17
- // eslint-disable-next-line global-require,@typescript-eslint/no-var-requires,import/no-extraneous-dependencies
18
- const rnNavigation = require('react-native-navigation')?.Navigation;
17
+ // eslint-disable-next-line global-require,@typescript-eslint/no-var-requires,import/no-extraneous-dependencies,import/no-unresolved
18
+ const Navigation = require('react-native-navigation');
19
+ const rnNavigation = Navigation?.Navigation;
19
20
  if (rnNavigation) {
20
21
  new ReactNativeNavigationIntegration().register(rnNavigation, this.onNavigation);
21
22
  }
@@ -1,7 +1,7 @@
1
1
  import Pressability from 'react-native/Libraries/Pressability/Pressability';
2
2
  import { WHITELIST_HTML_ID_TEXT_REGEX, USERSTEP_EVENT_TYPE, SOURCE_ATT_NAME, TEXT_ATT_NAME, TAGNAME_ATT_NAME, HTMLID_ATT_NAME, TYPE_ATT_NAME, CLICK_EVENT_TYPE, CSS_CLASS_ATT_NAME } from '../constants.js';
3
3
  import { PageVisit } from '../pageVisit/pageVisit.js';
4
- import { updatePayload } from '../pageVisit/userStep/userStep.js';
4
+ import { updatePayload } from '../pageVisit/userStep.js';
5
5
  import StoredMetrics from '../api/storedMetrics.js';
6
6
  import { WHITELIST_TEXT_REGEX_STRING } from '../const_matchers.js';
7
7
  import { maskTextInput } from '../utils/function.js';
@@ -1,7 +1,7 @@
1
- import { replace } from '../utils/object.js';
2
1
  import { asString, isStackTrace } from '../utils/function.js';
3
2
  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
- import { saveErrorToPagevisit } from '../pageVisit/pageVisitEventError/pageVisitEventError.js';
3
+ import { saveErrorToPagevisit } from '../pageVisit/pageVisitEventError.js';
4
+ import { replace } from '../utils/object.js';
5
5
 
6
6
  /* eslint-disable @typescript-eslint/ban-types,prefer-arrow-callback */
7
7
  /** @module ErrorMonitor */
@@ -1,8 +1,8 @@
1
1
  import { HUMAN_READABLE_CONTENT_TYPE_REGEX, DEFAULT_WEBSITE_SUBDOMAIN_PATTERN, SEVERITY, HTTP_BODY_NULL_STRING, HTTP_DATA_REQ_HEADERS_ATT_NAME, HTTP_DATA_PAYLOAD_ATT_NAME, HTTP_DATA_RESP_HEADERS_ATT_NAME, HTTP_DATA_RESP_PAYLOAD_ATT_NAME, HTTP_BODY_DROPPED_LENGTH_MSG, HTTP_BODY_DROPPED_TYPE_MSG, MAX_HTTP_DATA_PAYLOAD_LENGTH, CONTENT_TYPE, CONTENT_LENGTH, BLOCKED_HTTP_HEADER_KEYS, PII_REDACTION_REPLACEMENT_STRING, HTTP_PII_BLOCKING_PATTERNS } from '../constants.js';
2
2
  import ClientConfig from '../api/clientConfig.js';
3
3
  import StoredMetrics from '../api/storedMetrics.js';
4
- import { safeFromEntries, iterateObjectRecursively } from '../utils/object.js';
5
- import 'react-native-device-info';
4
+ import { iterateObjectRecursively } from '../utils/object.js';
5
+ import { noibuLog } from '../utils/log.js';
6
6
 
7
7
  /** @module HTTPDataBundler */
8
8
 
@@ -183,6 +183,7 @@ class HTTPDataBundler {
183
183
  if (xhr === undefined || xhr === null) return null;
184
184
 
185
185
  // If the XHR object exists but the response is null, return null as a string.
186
+ // noinspection PointlessBooleanExpressionJS
186
187
  if (xhr.response && xhr.response === null) return HTTP_BODY_NULL_STRING;
187
188
 
188
189
  if (xhr.responseType === '' || xhr.responseType === 'text') {
@@ -266,12 +267,13 @@ class HTTPDataBundler {
266
267
 
267
268
  /**
268
269
  * Builds an HTTP Data bundle
269
- * @param {} url
270
- * @param {} requestHeaders is a map of request headers
271
- * @param {} rawRequestPayload
272
- * @param {} responseHeaders is a map of response headers
273
- * @param {} responsePayload
274
- * @param {} method
270
+ * @param url
271
+ * @param requestHeaders is a map of request headers
272
+ * @param rawRequestPayload
273
+ * @param responseHeaders is a map of response headers
274
+ * @param responsePayload
275
+ * @param method
276
+ * @param shouldCollectPayload
275
277
  */
276
278
  bundleHTTPData(
277
279
  url,
@@ -280,15 +282,23 @@ class HTTPDataBundler {
280
282
  responseHeaders,
281
283
  responsePayload,
282
284
  method,
285
+ shouldCollectPayload,
283
286
  ) {
284
- if (!this.isValidRequest(url, method)) return null;
287
+ noibuLog('bundleHTTPData started for', method, url);
288
+ if (!this.isValidRequest(url, method)) {
289
+ noibuLog('quitting');
290
+ return null;
291
+ }
285
292
 
286
293
  // stringify payload if correct type and not too large
287
294
  let requestPayload = '';
288
- if (this.shouldCollectPayloadForURL(url)) {
295
+ if (shouldCollectPayload) {
296
+ noibuLog('bundleHTTPData collecting payload');
289
297
  requestPayload =
290
298
  this.dropPayloadIfNecessaryFromHeaders(requestHeaders) ||
291
299
  this.stringFromRequestBody(rawRequestPayload);
300
+ } else {
301
+ noibuLog('bundleHTTPData not collecting payload');
292
302
  }
293
303
 
294
304
  // don't bundle if there is no data
@@ -302,6 +312,7 @@ class HTTPDataBundler {
302
312
  safeResponseHeaders.size === 0 &&
303
313
  safeResponsePayload.length === 0
304
314
  ) {
315
+ noibuLog('bundleHTTPData payload is empty, quitting');
305
316
  return null;
306
317
  }
307
318
 
@@ -320,11 +331,11 @@ class HTTPDataBundler {
320
331
  // build the http bundle
321
332
  return {
322
333
  [HTTP_DATA_REQ_HEADERS_ATT_NAME]: cleanRequestHeaders
323
- ? safeFromEntries(cleanRequestHeaders)
334
+ ? Object.fromEntries(cleanRequestHeaders)
324
335
  : {},
325
336
  [HTTP_DATA_PAYLOAD_ATT_NAME]: requestPayloadUpdated,
326
337
  [HTTP_DATA_RESP_HEADERS_ATT_NAME]: cleanResponseHeaders
327
- ? safeFromEntries(cleanResponseHeaders)
338
+ ? Object.fromEntries(cleanResponseHeaders)
328
339
  : {},
329
340
  [HTTP_DATA_RESP_PAYLOAD_ATT_NAME]: responsePayloadUpdated,
330
341
  };
@@ -338,8 +349,13 @@ class HTTPDataBundler {
338
349
  * @returns boolean indicating whether the validation passed
339
350
  */
340
351
  isValidRequest(url, method) {
341
- if (!this.httpDataCollectionEnabled) return false;
352
+ noibuLog('isValidRequest');
353
+ if (!this.httpDataCollectionEnabled) {
354
+ noibuLog('isValidRequest httpDataCollectionEnabled is off, quitting');
355
+ return false;
356
+ }
342
357
  if (!method || typeof method !== 'string') {
358
+ noibuLog('isValidRequest method is invalid, quitting');
343
359
  return false;
344
360
  }
345
361
  // TODO: Check below disabled for beta. NOI-4253
@@ -361,16 +377,32 @@ class HTTPDataBundler {
361
377
  * inherently on the current domain) or matches the current domain.
362
378
  */
363
379
  shouldContinueForURL(url) {
364
- if (!this.httpDataCollectionEnabled) return false;
380
+ noibuLog('shouldContinueForURL started for', url);
381
+ if (!this.httpDataCollectionEnabled) {
382
+ noibuLog('shouldContinueForURL httpDataCollection turned off, quitting');
383
+ return false;
384
+ }
365
385
  if (!url || typeof url !== 'string' || !this.initialURLPartsReversed) {
386
+ noibuLog('shouldContinueForURL url is not valid, quitting', {
387
+ initialUrlPartsReversed: this.initialURLPartsReversed,
388
+ });
366
389
  return false;
367
390
  }
368
391
  // URL is absolute; either "http://example.com" or "//example.com"
369
392
  if (HTTPDataBundler.isAbsoluteURL(url)) {
370
393
  // Only capture requests on the same domain or in the allowed list
371
- if (!this.isURLSameDomain(url) && !this.shouldCollectPayloadForURL(url))
394
+ if (!this.isURLSameDomain(url) && !this.shouldCollectPayloadForURL(url)) {
395
+ noibuLog(
396
+ 'shouldContinueForURL url is not same domain or is not in allow list, quitting',
397
+ {
398
+ shouldCollectPayloadForURL: this.shouldCollectPayloadForURL(url),
399
+ },
400
+ );
372
401
  return false;
402
+ }
373
403
  } // end `if` (if URL is relative, it is on the same domain.)
404
+
405
+ noibuLog('shouldContinueForURL - yes');
374
406
  return true;
375
407
  }
376
408
 
@@ -392,7 +424,9 @@ class HTTPDataBundler {
392
424
  * @returns boolean indicating whether HTTP payloads can be collected on this URL
393
425
  */
394
426
  shouldCollectPayloadForURL(url) {
427
+ noibuLog('shouldCollectPayloadForURL', url);
395
428
  if (!url || typeof url !== 'string') {
429
+ noibuLog('shouldCollectPayloadForURL url is invalid, quitting');
396
430
  return false;
397
431
  }
398
432
  // check if in the full URL allowed list
@@ -400,6 +434,7 @@ class HTTPDataBundler {
400
434
  this.httpDataAllowedAbsoluteRegex &&
401
435
  this.httpDataAllowedAbsoluteRegex.test(url.toLowerCase())
402
436
  ) {
437
+ noibuLog('shouldCollectPayloadForURL yes, absolute');
403
438
  return true;
404
439
  }
405
440
  // check if in the relative URL allowed list, if on domain
@@ -409,8 +444,20 @@ class HTTPDataBundler {
409
444
  (!HTTPDataBundler.isAbsoluteURL(url) || this.isURLSameDomain(url)) &&
410
445
  this.httpDataAllowedRelativeRegex.test(url.toLowerCase())
411
446
  ) {
447
+ noibuLog('shouldCollectPayloadForURL yes, relative');
412
448
  return true;
413
449
  }
450
+
451
+ noibuLog('shouldCollectPayloadForURL answer is no, reason', {
452
+ httpDataAllowedAbsoluteRegexTest:
453
+ this.httpDataAllowedAbsoluteRegex &&
454
+ this.httpDataAllowedAbsoluteRegex.test(url.toLowerCase()),
455
+ httpDataAllowedRelativeRegexTest:
456
+ this.httpDataAllowedRelativeRegex &&
457
+ this.httpDataAllowedRelativeRegex.test(url.toLowerCase()),
458
+ isAbsoluteURL: HTTPDataBundler.isAbsoluteURL(url),
459
+ isURLSameDomain: this.isURLSameDomain(url),
460
+ });
414
461
  return false;
415
462
  }
416
463
 
@@ -2,6 +2,7 @@ import { PageVisit } from '../pageVisit/pageVisit.js';
2
2
  import { APP_NAVIGATION_EVENT_TYPE, PAGE_EVENT_TYPE, MAX_TIME_FOR_UNSENT_DATA_MILLIS, ERROR_EVENT_TYPE, HTTP_EVENT_TYPE, KEYBOARD_EVENT_TYPE, USERSTEP_EVENT_TYPE } from '../constants.js';
3
3
  import { timestampWrapper } from '../utils/date.js';
4
4
  import { addSafeEventListener } from '../utils/eventlistener.js';
5
+ import { noibuLog } from '../utils/log.js';
5
6
 
6
7
  /** @module InputMonitor */
7
8
 
@@ -80,6 +81,10 @@ class InputMonitor {
80
81
  * @param {} type
81
82
  */
82
83
  addEvent(event, type) {
84
+ noibuLog('addEvent', {
85
+ event,
86
+ type,
87
+ });
83
88
  if (!(type in this.eventsToDebounce)) {
84
89
  throw new Error(`Type: ${type} is not in eventsToDebounce`);
85
90
  }
@@ -1,4 +1,3 @@
1
- import type { NavigationDelegate } from 'react-native-navigation/lib/dist/src/NavigationDelegate';
2
1
  import { NavigationIntegration } from '../../types/NavigationIntegration';
3
2
  /**
4
3
  * react-native-navigation adapter
@@ -9,7 +8,7 @@ export declare class ReactNativeNavigationIntegration implements NavigationInteg
9
8
  /**
10
9
  * attaches provided listeners to the integration
11
10
  */
12
- register(navigation: NavigationDelegate, onNavigation: (breadcrumbs: string[]) => void): void;
11
+ register(navigation: any, onNavigation: (breadcrumbs: string[]) => void): void;
13
12
  /**
14
13
  * Listens to ComponentWillAppear events, keeps track of visited screens and
15
14
  * pops them if the same page is visited to prevent cycles
@@ -1,5 +1,5 @@
1
1
  import { TextInput } from 'react-native';
2
- import { updatePayload } from '../pageVisit/userStep/userStep.js';
2
+ import { updatePayload } from '../pageVisit/userStep.js';
3
3
  import { InputMonitor } from './inputMonitor.js';
4
4
  import { SOURCE_ATT_NAME, TEXT_ATT_NAME, TAGNAME_ATT_NAME, TYPE_ATT_NAME, KEYBOARD_EVENT_TYPE } from '../constants.js';
5
5