noibu-react-native 0.0.1 → 0.0.2
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 +5 -3
- package/dist/api/clientConfig.js +19 -15
- package/dist/api/metroplexSocket.js +15 -25
- package/dist/api/storedMetrics.js +18 -22
- package/dist/constants.d.ts +2 -1
- package/dist/constants.js +2 -34
- package/dist/entry/index.d.ts +7 -0
- package/dist/entry/index.js +8 -2
- package/dist/entry/init.js +6 -5
- package/dist/monitors/clickMonitor.js +1 -2
- package/dist/monitors/elementMonitor.js +4 -1
- package/dist/monitors/errorMonitor.d.ts +25 -0
- package/dist/monitors/errorMonitor.js +110 -263
- package/dist/monitors/httpDataBundler.js +11 -12
- package/dist/monitors/inputMonitor.js +4 -1
- package/dist/monitors/locationChangeMonitor.js +3 -16
- package/dist/monitors/pageMonitor.js +4 -1
- package/dist/monitors/requestMonitor.js +5 -19
- package/dist/pageVisit/pageVisit.js +3 -1
- package/dist/pageVisit/pageVisitEventError/blacklistedDomains.js +9 -0
- package/dist/pageVisit/pageVisitEventError/pageVisitEventError.js +9 -14
- package/dist/pageVisit/pageVisitEventHTTP/pageVisitEventHTTP.js +3 -14
- package/dist/storage/storage.js +0 -1
- package/dist/storage/storageProvider.js +0 -1
- package/dist/utils/function.js +80 -53
- package/dist/utils/performance.js +0 -7
- package/dist/utils/stacktrace-parser.d.ts +9 -0
- package/dist/utils/stacktrace-parser.js +156 -0
- package/package.json +3 -4
package/README.md
CHANGED
|
@@ -29,12 +29,14 @@ npm install noibu-react-native --save
|
|
|
29
29
|
|
|
30
30
|
## Usage
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Call a setup method and wrap your root App component into SDK ErrorBoundary:
|
|
33
33
|
|
|
34
34
|
```jsx
|
|
35
35
|
import React from 'react';
|
|
36
36
|
import { View, Text } from 'react-native';
|
|
37
|
-
import { ErrorBoundary } from 'noibu-react-native';
|
|
37
|
+
import { ErrorBoundary, setupNoibu } from 'noibu-react-native';
|
|
38
|
+
|
|
39
|
+
setupNoibu({ domain: 'react-native-app.myshop.com' })
|
|
38
40
|
|
|
39
41
|
export default function App() {
|
|
40
42
|
return (
|
|
@@ -53,7 +55,7 @@ export default function App() {
|
|
|
53
55
|
}
|
|
54
56
|
```
|
|
55
57
|
|
|
56
|
-
That's it! First time the module is
|
|
58
|
+
That's it! First time the module is set up, it runs an init and starts listening to errors.
|
|
57
59
|
|
|
58
60
|
## Configuration
|
|
59
61
|
|
package/dist/api/clientConfig.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import uuid from 'react-native-uuid';
|
|
2
2
|
import { MAX_METROPLEX_SOCKET_INNACTIVE_TIME, DISABLED_STATUS_KEY, CLIENT_UNLOCK_TIME_KEY, SEVERITY_WARN, LAST_ACTIVE_TIME_KEY, CURRENT_PAGE_VISIT_COUNT_KEY, NOIBU_BROWSER_ID_KYWRD, BROWSER_ID_KEY, PV_SEQ_NUM_RESET_TIME_MINUTES, SEVERITY_ERROR, JS_ENV, PAGE_VISIT_ID_KEY, MAX_PAGEVISIT_VISITED, CLIENT_LOCK_TIME_MINUTES, GET_SCRIPT_ID, MAX_COLLECT_ERROR_LOG } from '../constants.js';
|
|
3
|
-
import { stringifyJSON, getUserAgent, asString, makeRequest } from '../utils/function.js';
|
|
3
|
+
import { stringifyJSON, getUserAgent, asString, getProperGlobalUrl, makeRequest } from '../utils/function.js';
|
|
4
4
|
import Storage from '../storage/storage.js';
|
|
5
5
|
|
|
6
6
|
/** @module ClientConfig */
|
|
@@ -14,9 +14,10 @@ import Storage from '../storage/storage.js';
|
|
|
14
14
|
class ClientConfig {
|
|
15
15
|
/**
|
|
16
16
|
* Creates a ClientConfig singleton instance
|
|
17
|
-
* @param
|
|
17
|
+
* @param {string} noibuErrorURL
|
|
18
|
+
* @param {string} customerDomain
|
|
18
19
|
*/
|
|
19
|
-
constructor(noibuErrorURL) {
|
|
20
|
+
constructor(noibuErrorURL, customerDomain) {
|
|
20
21
|
// sets up this.browserId, this.disabledStatus
|
|
21
22
|
this.pageVisitId = uuid.v4();
|
|
22
23
|
// variables stored in storage
|
|
@@ -36,16 +37,18 @@ class ClientConfig {
|
|
|
36
37
|
// variables for checking if the socket is inactive
|
|
37
38
|
// used a class variables in order to be changed in testing
|
|
38
39
|
this.maxSocketInactiveTime = MAX_METROPLEX_SOCKET_INNACTIVE_TIME;
|
|
40
|
+
|
|
41
|
+
this.customerDomain = customerDomain;
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
/** Configures the singleton instance */
|
|
42
|
-
static configureInstance(noibuErrorURL) {
|
|
45
|
+
static configureInstance({ noibuErrorURL, customerDomain }) {
|
|
43
46
|
if (!this.instance) {
|
|
44
47
|
// Set this.noibuErrorURL preemptively in case ClientConfig isn't able to be
|
|
45
48
|
// configured properly and throws an error.
|
|
46
49
|
// This will ensure we get the expected error POST request at the correct URL.
|
|
47
50
|
this.noibuErrorURL = noibuErrorURL;
|
|
48
|
-
this.instance = new ClientConfig(noibuErrorURL);
|
|
51
|
+
this.instance = new ClientConfig(noibuErrorURL, customerDomain);
|
|
49
52
|
this.instance.noibuErrorURL = noibuErrorURL;
|
|
50
53
|
}
|
|
51
54
|
}
|
|
@@ -365,15 +368,24 @@ class ClientConfig {
|
|
|
365
368
|
}
|
|
366
369
|
|
|
367
370
|
const errorContent = {
|
|
368
|
-
url: (
|
|
371
|
+
url: getProperGlobalUrl(),
|
|
369
372
|
err_msg: errMsg,
|
|
370
373
|
sev: severity,
|
|
371
374
|
};
|
|
372
375
|
const headers = {
|
|
373
376
|
'content-type': 'application/json',
|
|
377
|
+
'User-Agent': await getUserAgent(),
|
|
374
378
|
};
|
|
375
379
|
|
|
376
|
-
if (
|
|
380
|
+
if (keepAlive) {
|
|
381
|
+
global.fetch(this.noibuErrorURL, {
|
|
382
|
+
method: 'POST',
|
|
383
|
+
headers,
|
|
384
|
+
body: stringifyJSON(errorContent),
|
|
385
|
+
// keep alive outlives the current page, its the same as beacon
|
|
386
|
+
keepalive: true,
|
|
387
|
+
});
|
|
388
|
+
} else {
|
|
377
389
|
makeRequest(
|
|
378
390
|
'POST',
|
|
379
391
|
this.noibuErrorURL,
|
|
@@ -384,14 +396,6 @@ class ClientConfig {
|
|
|
384
396
|
).catch(() => {
|
|
385
397
|
// we do nothing and let this error silently fail
|
|
386
398
|
});
|
|
387
|
-
} else {
|
|
388
|
-
fetch(this.noibuErrorURL, {
|
|
389
|
-
method: 'POST',
|
|
390
|
-
headers,
|
|
391
|
-
body: stringifyJSON(errorContent),
|
|
392
|
-
// keep alive outlives the current page, its the same as beacon
|
|
393
|
-
keepalive: true,
|
|
394
|
-
});
|
|
395
399
|
}
|
|
396
400
|
|
|
397
401
|
// only increment if this was an actual error, not a warning or otherwise
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import uuid from 'react-native-uuid';
|
|
2
|
-
import { getProperGlobalUrl,
|
|
2
|
+
import { getProperGlobalUrl, getUserAgent, stringifyJSON, getUserLanguage } from '../utils/function.js';
|
|
3
3
|
import { addSafeEventListener } from '../utils/eventlistener.js';
|
|
4
|
-
import { GET_METROPLEX_BASE_SOCKET_URL, METROPLEX_FRAG_ROUTE, GET_METROPLEX_POST_URL, METROPLEX_RETRY_FREQUENCY, META_DATA_METROPLEX_TYPE, PAGE_VISIT_META_DATA_ATT_NAME, HTTP_DATA_METROPLEX_TYPE, PAGE_VISIT_HTTP_DATA_ATT_NAME, VIDEO_METROPLEX_TYPE, PAGE_VISIT_VID_FRAG_ATT_NAME, PV_METROPLEX_TYPE, PAGE_VISIT_PART_ATT_NAME, SEQ_NUM_ATT_NAME, WORK_REQUEST_ATT_NAME, PV_EVENTS_ATT_NAME, TYPE_ATT_NAME, USERSTEP_EVENT_TYPE, GET_MAX_METROPLEX_RECONNECTION_NUMBER, MAX_METROPLEX_CONNECTION_COUNT, GET_METROPLEX_CONSECUTIVE_CONNECTION_DELAY, END_AT_ATT_NAME, SEVERITY_ERROR, OK_SOCKET_MESSAGE, CLOSE_CONNECTION_FORCEFULLY, BLOCK_SOCKET_MESSAGE, STOP_STORING_PV_SOCKET_MESSAGE, STOP_STORING_VID_SOCKET_MESSAGE, MAX_BEACON_PAYLOAD_SIZE, PAGE_VISIT_INFORMATION_ATT_NAME, VIDEO_PART_COUNT_ATT_NAME, IS_LAST_ATT_NAME, SEVERITY_WARN,
|
|
4
|
+
import { GET_METROPLEX_BASE_SOCKET_URL, METROPLEX_FRAG_ROUTE, GET_METROPLEX_POST_URL, METROPLEX_RETRY_FREQUENCY, META_DATA_METROPLEX_TYPE, PAGE_VISIT_META_DATA_ATT_NAME, HTTP_DATA_METROPLEX_TYPE, PAGE_VISIT_HTTP_DATA_ATT_NAME, VIDEO_METROPLEX_TYPE, PAGE_VISIT_VID_FRAG_ATT_NAME, PV_METROPLEX_TYPE, PAGE_VISIT_PART_ATT_NAME, SEQ_NUM_ATT_NAME, WORK_REQUEST_ATT_NAME, PV_EVENTS_ATT_NAME, TYPE_ATT_NAME, USERSTEP_EVENT_TYPE, GET_MAX_METROPLEX_RECONNECTION_NUMBER, MAX_METROPLEX_CONNECTION_COUNT, GET_METROPLEX_CONSECUTIVE_CONNECTION_DELAY, END_AT_ATT_NAME, SEVERITY_ERROR, OK_SOCKET_MESSAGE, CLOSE_CONNECTION_FORCEFULLY, BLOCK_SOCKET_MESSAGE, STOP_STORING_PV_SOCKET_MESSAGE, STOP_STORING_VID_SOCKET_MESSAGE, MAX_BEACON_PAYLOAD_SIZE, PAGE_VISIT_INFORMATION_ATT_NAME, VIDEO_PART_COUNT_ATT_NAME, IS_LAST_ATT_NAME, SEVERITY_WARN, BROWSER_ID_ATT_NAME, PV_ID_ATT_NAME, VER_ATT_NAME, CURRENT_PV_VERSION, PV_SEQ_ATT_NAME, ON_URL_ATT_NAME, REF_URL_ATT_NAME, STARTED_AT_ATT_NAME, CONN_COUNT_ATT_NAME, COLLECT_VER_ATT_NAME, CURRENT_NOIBUJS_VERSION, SCRIPT_ID_ATT_NAME, GET_SCRIPT_ID, SCRIPT_INSTANCE_ID_ATT_NAME, METROPLEX_SOCKET_INSTANCE_ID_ATT_NAME, SOCKET_INSTANCE_ID_ATT_NAME, LANG_ATT_NAME, HELP_CODE_ATT_NAME } from '../constants.js';
|
|
5
5
|
import ClientConfig from './clientConfig.js';
|
|
6
6
|
import StoredMetrics from './storedMetrics.js';
|
|
7
7
|
import StoredPageVisit from './storedPageVisit.js';
|
|
@@ -59,10 +59,7 @@ class MetroplexSocket {
|
|
|
59
59
|
// current page visit has the real initial onURL. Fragments and SPA's
|
|
60
60
|
// can change the URL without reloading the page.
|
|
61
61
|
this.initialURL = getProperGlobalUrl();
|
|
62
|
-
this.initialReferingURL =
|
|
63
|
-
global.document && global.document.referrer
|
|
64
|
-
? getMaxSubstringAllowed(global.document.referrer)
|
|
65
|
-
: '';
|
|
62
|
+
this.initialReferingURL = '';
|
|
66
63
|
this.sessionTimestamp = new Date();
|
|
67
64
|
|
|
68
65
|
// latest time that we received a confirmation message from metroplex
|
|
@@ -765,30 +762,23 @@ class MetroplexSocket {
|
|
|
765
762
|
* will send a message to metroplex via a post request that will outlive the current page
|
|
766
763
|
* @param {} msg
|
|
767
764
|
*/
|
|
768
|
-
postMessage(msg) {
|
|
765
|
+
async postMessage(msg) {
|
|
769
766
|
const updatedMsg = msg;
|
|
770
767
|
|
|
771
768
|
// ensure a unique video part number each call
|
|
772
769
|
updatedMsg[VIDEO_PART_COUNT_ATT_NAME] += 1;
|
|
773
770
|
|
|
774
|
-
// we
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
'content-type': 'application/json',
|
|
786
|
-
},
|
|
787
|
-
body: stringifyJSON(updatedMsg),
|
|
788
|
-
// keep alive outlives the current page, its the same as beacon
|
|
789
|
-
keepalive: true,
|
|
790
|
-
});
|
|
791
|
-
}
|
|
771
|
+
// we send the remainder elements
|
|
772
|
+
global.fetch(this.postURL, {
|
|
773
|
+
method: 'POST',
|
|
774
|
+
headers: {
|
|
775
|
+
'content-type': 'application/json',
|
|
776
|
+
'User-Agent': await getUserAgent(),
|
|
777
|
+
},
|
|
778
|
+
body: stringifyJSON(updatedMsg),
|
|
779
|
+
// keep alive outlives the current page, its the same as beacon
|
|
780
|
+
keepalive: true,
|
|
781
|
+
});
|
|
792
782
|
}
|
|
793
783
|
|
|
794
784
|
/**
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { BROWSER_ID_ATT_NAME, PV_ID_ATT_NAME, COLLECT_VER_ATT_NAME, CURRENT_NOIBUJS_VERSION, VER_ATT_NAME, CURRENT_METRICS_VERSION, EXP_VIDEO_LENGTH_ATT_NAME, PV_EXP_VF_SEQ_ATT_NAME, PV_EXP_PART_COUNTER_ATT_NAME, PV_EXP_HTTP_DATA_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, VIDEO_CLICKS_ATT_NAME, PV_CLICKS_ATT_NAME, DID_CUT_PV_ATT_NAME, DID_CUT_VID_ATT_NAME, DID_START_VID_ATT_NAME, HTTP_COUNT_EXPECTED_ATT_NAME, ERR_COUNT_EXPECTED_ATT_NAME, ON_URL_ATT_NAME, GET_METROPLEX_METRICS_URL } from '../constants.js';
|
|
2
2
|
import ClientConfig from './clientConfig.js';
|
|
3
|
-
import { stringifyJSON } from '../utils/function.js';
|
|
3
|
+
import { getProperGlobalUrl, getUserAgent, stringifyJSON } from '../utils/function.js';
|
|
4
4
|
import { addSafeEventListener } from '../utils/eventlistener.js';
|
|
5
5
|
|
|
6
6
|
/** @module StoredMetrics */
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* This class holds the final page visit and video frag metrics. It flushes
|
|
10
|
-
* them to
|
|
10
|
+
* them to storage and then finally sends them to Metroplex via the post
|
|
11
11
|
* route when the next page is loaded
|
|
12
12
|
*/
|
|
13
13
|
class StoredMetrics {
|
|
@@ -35,7 +35,10 @@ class StoredMetrics {
|
|
|
35
35
|
this._setupListeners();
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* gets the singleton instance
|
|
40
|
+
* @returns {StoredMetrics}
|
|
41
|
+
*/
|
|
39
42
|
static getInstance() {
|
|
40
43
|
if (!this.instance) {
|
|
41
44
|
this.instance = new StoredMetrics();
|
|
@@ -148,9 +151,8 @@ class StoredMetrics {
|
|
|
148
151
|
}
|
|
149
152
|
|
|
150
153
|
/** posts the metrics to metroplex using the beacon API
|
|
151
|
-
* @param {} eventName
|
|
152
154
|
*/
|
|
153
|
-
postMetrics(
|
|
155
|
+
async postMetrics() {
|
|
154
156
|
// Create a new object to write to local storage that doesnt have the timeout and flush members.
|
|
155
157
|
const lsMetrics = {
|
|
156
158
|
// metadata
|
|
@@ -177,24 +179,18 @@ class StoredMetrics {
|
|
|
177
179
|
[DID_START_VID_ATT_NAME]: this.didStartVideo,
|
|
178
180
|
[HTTP_COUNT_EXPECTED_ATT_NAME]: this.httpCount,
|
|
179
181
|
[ERR_COUNT_EXPECTED_ATT_NAME]: this.errCount,
|
|
180
|
-
[ON_URL_ATT_NAME]:
|
|
181
|
-
(global.document &&
|
|
182
|
-
global.document.location &&
|
|
183
|
-
global.document.location.href) ||
|
|
184
|
-
'http://localhost',
|
|
182
|
+
[ON_URL_ATT_NAME]: getProperGlobalUrl(), // todo implement navigation
|
|
185
183
|
};
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
});
|
|
197
|
-
}
|
|
184
|
+
global.fetch(GET_METROPLEX_METRICS_URL(), {
|
|
185
|
+
method: 'POST',
|
|
186
|
+
headers: {
|
|
187
|
+
'content-type': 'application/json',
|
|
188
|
+
'User-Agent': await getUserAgent(),
|
|
189
|
+
},
|
|
190
|
+
body: stringifyJSON(lsMetrics),
|
|
191
|
+
// keep alive outlives the current page, its the same as beacon
|
|
192
|
+
keepalive: true,
|
|
193
|
+
});
|
|
198
194
|
}
|
|
199
195
|
}
|
|
200
196
|
|
package/dist/constants.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ export declare const HTTP_PII_BLOCKING_PATTERNS: RegExp[];
|
|
|
26
26
|
export declare const DEFAULT_WEBSITE_SUBDOMAIN_PATTERN: RegExp;
|
|
27
27
|
export declare const PII_REDACTION_REPLACEMENT_STRING: "******";
|
|
28
28
|
export declare const DEFAULT_STACK_FRAME_FIELD_VALUE: "_";
|
|
29
|
+
export declare const DEFAULT_STACK_FRAME_FIELD_NUMERIC_VALUE = "0";
|
|
29
30
|
export declare const DISABLED_STATUS_KEY: "DisabledStatus";
|
|
30
31
|
export declare const CLIENT_UNLOCK_TIME_KEY: "ClientUnlockTime";
|
|
31
32
|
export declare const BROWSER_ID_KEY: "BrowserId";
|
|
@@ -235,7 +236,7 @@ export declare function GET_MAX_PAGEVISIT_SIZE(): string | 20000;
|
|
|
235
236
|
*
|
|
236
237
|
* gets the attribute selectors set by the customers to match an attribute
|
|
237
238
|
*/
|
|
238
|
-
export declare function GET_ATTRIBUTE_SELECTORS():
|
|
239
|
+
export declare function GET_ATTRIBUTE_SELECTORS(): Record<string, any>;
|
|
239
240
|
/**
|
|
240
241
|
*
|
|
241
242
|
* gets the base url for metroplex's websocket connection
|
package/dist/constants.js
CHANGED
|
@@ -30,6 +30,7 @@ const PV_SEQ_NUM_RESET_TIME_MINUTES = 45;
|
|
|
30
30
|
const REQUIRED_DATA_PROCESSING_URLS = [
|
|
31
31
|
'metroplexSocketBase',
|
|
32
32
|
'metroplexHTTPBase',
|
|
33
|
+
'domain',
|
|
33
34
|
];
|
|
34
35
|
const HTTP_BODY_DROPPED_TYPE_MSG = 'Dropped due to unsupported type.';
|
|
35
36
|
const HTTP_BODY_DROPPED_LENGTH_MSG = 'Dropped due to length.';
|
|
@@ -137,39 +138,6 @@ const NOIBUJS_SDK_REQUEST_HELP_CODE = 'requestHelpCode';
|
|
|
137
138
|
const NOIBUJS_SDK_ADD_ID_FUNCTION = 'addCustomAttribute';
|
|
138
139
|
const NOIBUJS_SDK_ADD_ERROR_FUNCTION = 'addError';
|
|
139
140
|
const NOIBUJS_SDK_ADD_ERROR_FROM_JS_FMW_FUNCTION = 'addJsSdkError';
|
|
140
|
-
// event targets that we overide to wrap erors
|
|
141
|
-
const EVENT_TARGETS = [
|
|
142
|
-
'Image',
|
|
143
|
-
'EventTarget',
|
|
144
|
-
'Window',
|
|
145
|
-
'Node',
|
|
146
|
-
'ApplicationCache',
|
|
147
|
-
'AudioTrackList',
|
|
148
|
-
'ChannelMergerNode',
|
|
149
|
-
'CryptoOperation',
|
|
150
|
-
'EventSource',
|
|
151
|
-
'FileReader',
|
|
152
|
-
'HTMLUnknownElement',
|
|
153
|
-
'IDBDatabase',
|
|
154
|
-
'IDBRequest',
|
|
155
|
-
'IDBTransaction',
|
|
156
|
-
'KeyOperation',
|
|
157
|
-
'MediaController',
|
|
158
|
-
'MessagePort',
|
|
159
|
-
'ModalWindow',
|
|
160
|
-
'Notification',
|
|
161
|
-
'SVGElementInstance',
|
|
162
|
-
'Screen',
|
|
163
|
-
'TextTrack',
|
|
164
|
-
'TextTrackCue',
|
|
165
|
-
'TextTrackList',
|
|
166
|
-
'WebSocket',
|
|
167
|
-
'WebSocketWorker',
|
|
168
|
-
'Worker',
|
|
169
|
-
'XMLHttpRequest',
|
|
170
|
-
'XMLHttpRequestEventTarget',
|
|
171
|
-
'XMLHttpRequestUpload',
|
|
172
|
-
];
|
|
173
141
|
// will return a regex that will match
|
|
174
142
|
// any keywords that may indicate that users are moving
|
|
175
143
|
// forward in the sales funnel. It will match add to cart, checkout,
|
|
@@ -525,4 +493,4 @@ function JS_ENV() {
|
|
|
525
493
|
// gets the frequency at which the client resends the message that were not confirmed by metroplex
|
|
526
494
|
const METROPLEX_RETRY_FREQUENCY = 30000;
|
|
527
495
|
|
|
528
|
-
export { ATTRIBUTE_SELECTORS_ATT_NAME, BLOCKED_HTTP_HEADER_KEYS, BLOCK_SOCKET_MESSAGE, BROWSER_ID_ATT_NAME, BROWSER_ID_KEY, CLICK_EVENT_TYPE, CLIENT_LOCK_TIME_MINUTES, CLIENT_UNLOCK_TIME_KEY, 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_PAGE_VISIT_COUNT_KEY, 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, DISABLED_STATUS_KEY, 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,
|
|
496
|
+
export { ATTRIBUTE_SELECTORS_ATT_NAME, BLOCKED_HTTP_HEADER_KEYS, BLOCK_SOCKET_MESSAGE, BROWSER_ID_ATT_NAME, BROWSER_ID_KEY, CLICK_EVENT_TYPE, CLIENT_LOCK_TIME_MINUTES, CLIENT_UNLOCK_TIME_KEY, 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_PAGE_VISIT_COUNT_KEY, 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, DISABLED_STATUS_KEY, 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_ATTRIBUTE_SELECTORS, 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_COLLECTION_FLAG_NAME, HTTP_DATA_METROPLEX_TYPE, HTTP_DATA_PAYLOAD_ATT_NAME, HTTP_DATA_PAYLOAD_URL_REGEXES_FLAG_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_COL_ATT_NAME, JS_STACK_FILE_ATT_NAME, JS_STACK_FRAMES_ATT_NAME, JS_STACK_LINE_ATT_NAME, JS_STACK_MESSAGE_ATT_NAME, JS_STACK_METHOD_ATT_NAME, KEYBOARD_EVENT_TYPE, LANG_ATT_NAME, LAST_ACTIVE_TIME_KEY, LOCATION_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_CONFIG, 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_CONFIG_WIN_ATT_NAME, 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_ID_KEY, 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, REACT_ERROR_EVENT_TYPE, 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_ERROR, SEVERITY_WARN, 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, VUE_ERROR_EVENT_TYPE, WHITELIST_HTML_ID_TEXT_REGEX, WIN_BLOCKED_SELECTOR_ATT_NAME, WIN_NJS_VERSION_ATT_NAME, WIN_SCRIPT_ID_ATT_NAME, WORK_REQUEST_ATT_NAME, WRAPPED_EXCEPTION_ERROR_TYPE, XML_HTTP_REQUEST_ERROR_TYPE };
|
package/dist/entry/index.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
import 'react-native-url-polyfill/auto';
|
|
1
2
|
import { ErrorBoundary as _ErrorBoundary } from '../react/ErrorBoundary';
|
|
3
|
+
/**
|
|
4
|
+
* @param config
|
|
5
|
+
*/
|
|
6
|
+
export declare const setupNoibu: (config: {
|
|
7
|
+
domain: string;
|
|
8
|
+
}) => void;
|
|
2
9
|
export declare const NoibuJS: {
|
|
3
10
|
requestHelpCode: (alert?: boolean | undefined) => Promise<string>;
|
|
4
11
|
addCustomAttribute: (name: string, value: string) => string;
|
package/dist/entry/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import 'react-native-url-polyfill/auto';
|
|
1
2
|
import { GET_METROPLEX_BASE_SOCKET_URL, GET_METROPLEX_BASE_HTTP_URL } from '../constants.js';
|
|
2
3
|
import globalInit from './init.js';
|
|
3
4
|
import { ErrorBoundary as ErrorBoundary$1 } from '../react/ErrorBoundary.js';
|
|
@@ -8,8 +9,13 @@ const urlConfig = {
|
|
|
8
9
|
metroplexSocketBase: GET_METROPLEX_BASE_SOCKET_URL(),
|
|
9
10
|
metroplexHTTPBase: GET_METROPLEX_BASE_HTTP_URL(),
|
|
10
11
|
};
|
|
11
|
-
|
|
12
|
+
/**
|
|
13
|
+
* @param config
|
|
14
|
+
*/
|
|
15
|
+
const setupNoibu = (config) => {
|
|
16
|
+
globalInit({ ...urlConfig, domain: config.domain });
|
|
17
|
+
};
|
|
12
18
|
const NoibuJS = InputManager.getInstance().exposeFunctions();
|
|
13
19
|
const ErrorBoundary = ErrorBoundary$1;
|
|
14
20
|
|
|
15
|
-
export { ErrorBoundary, NoibuJS };
|
|
21
|
+
export { ErrorBoundary, NoibuJS, setupNoibu };
|
package/dist/entry/init.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { setupURLPolyfill } from 'react-native-url-polyfill';
|
|
2
1
|
import uuid from 'react-native-uuid';
|
|
3
2
|
import { monitorErrors } from '../monitors/errorMonitor.js';
|
|
4
3
|
import { monitorRequests } from '../monitors/requestMonitor.js';
|
|
@@ -19,11 +18,9 @@ import HelpCode from '../api/helpCode.js';
|
|
|
19
18
|
/** @module Init */
|
|
20
19
|
/**
|
|
21
20
|
* initilializes the script to start executing all of NJS features
|
|
22
|
-
* @param {} urlConfig
|
|
21
|
+
* @param {Noibu.UrlConfig} urlConfig
|
|
23
22
|
*/
|
|
24
23
|
function globalInit(urlConfig) {
|
|
25
|
-
setupURLPolyfill();
|
|
26
|
-
|
|
27
24
|
// if the config url is invalid we block collect from executing
|
|
28
25
|
if (isInvalidURLConfig(urlConfig)) {
|
|
29
26
|
return;
|
|
@@ -34,7 +31,11 @@ function globalInit(urlConfig) {
|
|
|
34
31
|
return;
|
|
35
32
|
}
|
|
36
33
|
const clterrEndpoint = `${urlConfig.metroplexHTTPBase}/${METROPLEX_ERROR_ROUTE}`;
|
|
37
|
-
|
|
34
|
+
|
|
35
|
+
ClientConfig.configureInstance({
|
|
36
|
+
noibuErrorURL: clterrEndpoint,
|
|
37
|
+
customerDomain: urlConfig.domain,
|
|
38
|
+
});
|
|
38
39
|
|
|
39
40
|
// catch any errors that happened during initialization and send collect error
|
|
40
41
|
try {
|
|
@@ -38,10 +38,9 @@ class ClickMonitor {
|
|
|
38
38
|
return this.instance;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
/** Starts monitoring clicks on
|
|
41
|
+
/** Starts monitoring clicks on every Press-able component */
|
|
42
42
|
monitorClicks() {
|
|
43
43
|
const onClickHandler = this._onClickHandle.bind(this);
|
|
44
|
-
// addSafeEventListener(window, 'click', onClickHandler, true);
|
|
45
44
|
|
|
46
45
|
if (!Pressability.prototype.originalCreateEventHandlers) {
|
|
47
46
|
Pressability.prototype.originalCreateEventHandlers =
|
|
@@ -5,7 +5,10 @@ import InputManager from '../api/inputManager.js';
|
|
|
5
5
|
|
|
6
6
|
/** Monitors the elements matching query selectors and passes them to the InputManager */
|
|
7
7
|
class ElementMonitor {
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* gets the singleton instance
|
|
10
|
+
* @returns {ElementMonitor}
|
|
11
|
+
*/
|
|
9
12
|
static getInstance() {
|
|
10
13
|
if (!this.instance) {
|
|
11
14
|
this.instance = new ElementMonitor();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
type WrappedFunction<T extends Function = Function> = T & Partial<{
|
|
2
|
+
__noibu__: boolean;
|
|
3
|
+
__noibu_wrapped__: T;
|
|
4
|
+
}>;
|
|
5
|
+
/**
|
|
6
|
+
* wraps a provided function into a function that try and catches
|
|
7
|
+
* the original function, doing so allows us to catch errors
|
|
8
|
+
* functionToWrap: function to be wrapped
|
|
9
|
+
* @param {} functionToWrap
|
|
10
|
+
*/
|
|
11
|
+
export declare function wrap(functionToWrap: WrappedFunction): Function;
|
|
12
|
+
/** iterates arguments to try to extract errors from them
|
|
13
|
+
* @param {Array<string | Error>} argsFromErrorLog
|
|
14
|
+
*/
|
|
15
|
+
export declare function processErrorLogArguments(argsFromErrorLog: any[]): void;
|
|
16
|
+
/**
|
|
17
|
+
* handler for promise rejection failures
|
|
18
|
+
* @param {} event
|
|
19
|
+
*/
|
|
20
|
+
export declare function onPromiseRejectionHandler(event: PromiseRejectedResult): void;
|
|
21
|
+
/**
|
|
22
|
+
* Monitors the errors happening on the window
|
|
23
|
+
*/
|
|
24
|
+
export declare function monitorErrors(): void;
|
|
25
|
+
export {};
|