@cloudcare/browser-core 1.1.2 → 1.2.0
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/cjs/{cookie.js → browser/cookie.js} +6 -37
- package/cjs/browser/fetchObservable.js +91 -0
- package/cjs/browser/xhrObservable.js +118 -0
- package/cjs/configuration/configuration.js +70 -0
- package/cjs/configuration/transportConfiguration.js +64 -0
- package/cjs/console/consoleObservable.js +84 -0
- package/cjs/dataMap.js +26 -21
- package/cjs/error/trackRuntimeError.js +27 -0
- package/cjs/helper/catchUserErrors.js +20 -0
- package/cjs/helper/contextHistory.js +134 -0
- package/cjs/helper/createEventRateLimiter.js +47 -0
- package/cjs/helper/deviceInfo.js +8 -25
- package/cjs/helper/display.js +31 -0
- package/cjs/helper/enums.js +28 -2
- package/cjs/helper/errorTools.js +63 -2
- package/cjs/helper/instrumentMethod.js +93 -0
- package/cjs/helper/lifeCycle.js +5 -3
- package/cjs/helper/observable.js +40 -2
- package/cjs/helper/tools.js +217 -11
- package/cjs/index.js +153 -23
- package/cjs/init.js +17 -27
- package/cjs/report/reportObservable.js +112 -0
- package/cjs/session/sessionConstants.js +13 -0
- package/cjs/session/sessionCookieStore.js +188 -0
- package/cjs/session/sessionManagement.js +96 -0
- package/cjs/session/sessionStore.js +150 -0
- package/cjs/synthetics/syntheticsWorkerValues.js +32 -0
- package/cjs/synthetics/usr.js +32 -0
- package/cjs/tracekit/computeStackTrace.js +73 -563
- package/cjs/tracekit/index.js +3 -15
- package/cjs/tracekit/tracekit.js +113 -0
- package/cjs/transport/batch.js +332 -0
- package/cjs/transport/httpRequest.js +112 -0
- package/cjs/transport/index.js +29 -0
- package/cjs/transport/sendWithRetryStrategy.js +177 -0
- package/cjs/transport/startBatchWithReplica.js +24 -0
- package/esm/{cookie.js → browser/cookie.js} +4 -35
- package/esm/browser/fetchObservable.js +77 -0
- package/esm/browser/xhrObservable.js +106 -0
- package/esm/configuration/configuration.js +55 -0
- package/esm/configuration/transportConfiguration.js +54 -0
- package/esm/console/consoleObservable.js +70 -0
- package/esm/dataMap.js +26 -21
- package/esm/error/trackRuntimeError.js +16 -0
- package/esm/helper/catchUserErrors.js +12 -0
- package/esm/helper/contextHistory.js +106 -0
- package/esm/helper/createEventRateLimiter.js +38 -0
- package/esm/helper/deviceInfo.js +6 -25
- package/esm/helper/display.js +21 -0
- package/esm/helper/enums.js +25 -1
- package/esm/helper/errorTools.js +58 -3
- package/esm/helper/instrumentMethod.js +81 -0
- package/esm/helper/lifeCycle.js +5 -3
- package/esm/helper/observable.js +39 -3
- package/esm/helper/tools.js +173 -3
- package/esm/index.js +17 -7
- package/esm/init.js +17 -22
- package/esm/report/reportObservable.js +98 -0
- package/esm/session/sessionConstants.js +3 -0
- package/esm/session/sessionCookieStore.js +168 -0
- package/esm/session/sessionManagement.js +78 -0
- package/esm/session/sessionStore.js +139 -0
- package/esm/synthetics/syntheticsWorkerValues.js +15 -0
- package/esm/synthetics/usr.js +18 -0
- package/esm/tracekit/computeStackTrace.js +73 -557
- package/esm/tracekit/index.js +1 -1
- package/esm/tracekit/tracekit.js +103 -0
- package/esm/transport/batch.js +316 -0
- package/esm/transport/httpRequest.js +104 -0
- package/esm/transport/index.js +3 -0
- package/esm/transport/sendWithRetryStrategy.js +165 -0
- package/esm/transport/startBatchWithReplica.js +15 -0
- package/package.json +2 -2
- package/src/.DS_Store +0 -0
- package/src/{cookie.js → browser/cookie.js} +6 -34
- package/src/browser/fetchObservable.js +86 -0
- package/src/browser/xhrObservable.js +102 -0
- package/src/configuration/configuration.js +61 -0
- package/src/configuration/transportConfiguration.js +42 -0
- package/src/console/consoleObservable.js +65 -0
- package/src/dataMap.js +26 -21
- package/src/error/trackRuntimeError.js +19 -0
- package/src/helper/catchUserErrors.js +12 -0
- package/src/helper/contextHistory.js +85 -0
- package/src/helper/createEventRateLimiter.js +37 -0
- package/src/helper/deviceInfo.js +5 -51
- package/src/helper/display.js +21 -0
- package/src/helper/enums.js +38 -14
- package/src/helper/errorTools.js +76 -12
- package/src/helper/instrumentMethod.js +97 -0
- package/src/helper/lifeCycle.js +5 -3
- package/src/helper/observable.js +33 -2
- package/src/helper/tools.js +159 -5
- package/src/index.js +18 -7
- package/src/init.js +17 -18
- package/src/report/reportObservable.js +113 -0
- package/src/session/sessionConstants.js +3 -0
- package/src/session/sessionCookieStore.js +159 -0
- package/src/session/sessionManagement.js +89 -0
- package/src/session/sessionStore.js +139 -0
- package/src/synthetics/syntheticsWorkerValues.js +22 -0
- package/src/synthetics/usr.js +18 -0
- package/src/tracekit/computeStackTrace.js +75 -551
- package/src/tracekit/index.js +1 -1
- package/src/tracekit/tracekit.js +100 -0
- package/src/transport/batch.js +289 -0
- package/src/transport/httpRequest.js +109 -0
- package/src/transport/index.js +3 -0
- package/src/transport/sendWithRetryStrategy.js +186 -0
- package/src/transport/startBatchWithReplica.js +26 -0
- package/cjs/configuration.js +0 -184
- package/cjs/errorCollection.js +0 -167
- package/cjs/fetchProxy.js +0 -162
- package/cjs/helper/errorFilter.js +0 -47
- package/cjs/sessionManagement.js +0 -221
- package/cjs/tracekit/report.js +0 -289
- package/cjs/transport.js +0 -373
- package/cjs/xhrProxy.js +0 -122
- package/esm/configuration.js +0 -167
- package/esm/errorCollection.js +0 -141
- package/esm/fetchProxy.js +0 -116
- package/esm/helper/errorFilter.js +0 -38
- package/esm/sessionManagement.js +0 -195
- package/esm/tracekit/report.js +0 -273
- package/esm/transport.js +0 -357
- package/esm/xhrProxy.js +0 -110
- package/src/configuration.js +0 -156
- package/src/errorCollection.js +0 -170
- package/src/fetchProxy.js +0 -109
- package/src/helper/errorFilter.js +0 -38
- package/src/sessionManagement.js +0 -224
- package/src/tracekit/report.js +0 -284
- package/src/transport.js +0 -380
- package/src/xhrProxy.js +0 -106
package/esm/errorCollection.js
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { toArray, jsonStringify, find, clocksNow, map, extend } from './helper/tools';
|
|
2
|
-
import { ErrorSource, formatUnknownError, toStackTraceString, formatErrorMessage, createHandlingStack } from './helper/errorTools';
|
|
3
|
-
import { computeStackTrace, subscribe, unsubscribe } from './tracekit';
|
|
4
|
-
import { Observable } from './helper/observable';
|
|
5
|
-
import { isIntakeRequest } from './configuration';
|
|
6
|
-
import { RequestType, ErrorHandling } from './helper/enums';
|
|
7
|
-
import { resetXhrProxy, startXhrProxy } from './xhrProxy';
|
|
8
|
-
import { resetFetchProxy, startFetchProxy } from './fetchProxy';
|
|
9
|
-
var errorObservable;
|
|
10
|
-
export function startAutomaticErrorCollection(configuration) {
|
|
11
|
-
if (!errorObservable) {
|
|
12
|
-
errorObservable = new Observable();
|
|
13
|
-
trackNetworkError(configuration, errorObservable);
|
|
14
|
-
startConsoleTracking(errorObservable);
|
|
15
|
-
startRuntimeErrorTracking(errorObservable);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return errorObservable;
|
|
19
|
-
}
|
|
20
|
-
var originalConsoleError;
|
|
21
|
-
export function startConsoleTracking(errorObservable) {
|
|
22
|
-
originalConsoleError = console.error;
|
|
23
|
-
|
|
24
|
-
console.error = function () {
|
|
25
|
-
originalConsoleError.apply(console, arguments);
|
|
26
|
-
var handlingStack = createHandlingStack();
|
|
27
|
-
errorObservable.notify(extend({}, buildErrorFromParams(toArray(arguments), handlingStack), {
|
|
28
|
-
source: ErrorSource.CONSOLE,
|
|
29
|
-
startClocks: clocksNow(),
|
|
30
|
-
handling: ErrorHandling.HANDLED
|
|
31
|
-
}));
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function buildErrorFromParams(params, handlingStack) {
|
|
36
|
-
var firstErrorParam = find(params, function (param) {
|
|
37
|
-
return param instanceof Error;
|
|
38
|
-
});
|
|
39
|
-
var message = '';
|
|
40
|
-
message = map(['console error:'].concat(params), function (param) {
|
|
41
|
-
return formatConsoleParameters(param);
|
|
42
|
-
}).join(' ');
|
|
43
|
-
return {
|
|
44
|
-
message: message,
|
|
45
|
-
stack: firstErrorParam ? toStackTraceString(computeStackTrace(firstErrorParam)) : undefined,
|
|
46
|
-
handlingStack: handlingStack
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function stopConsoleTracking() {
|
|
51
|
-
console.error = originalConsoleError;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function formatConsoleParameters(param) {
|
|
55
|
-
if (typeof param === 'string') {
|
|
56
|
-
return param;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (param instanceof Error) {
|
|
60
|
-
return formatErrorMessage(computeStackTrace(param));
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return jsonStringify(param, undefined, 2);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
var traceKitReportHandler;
|
|
67
|
-
export function startRuntimeErrorTracking(errorObservable) {
|
|
68
|
-
traceKitReportHandler = function traceKitReportHandler(stackTrace, _, errorObject) {
|
|
69
|
-
var error = formatUnknownError(stackTrace, errorObject, 'Uncaught');
|
|
70
|
-
errorObservable.notify({
|
|
71
|
-
message: error.message,
|
|
72
|
-
stack: error.stack,
|
|
73
|
-
type: error.type,
|
|
74
|
-
source: ErrorSource.SOURCE,
|
|
75
|
-
startClocks: clocksNow(),
|
|
76
|
-
handling: ErrorHandling.UNHANDLED
|
|
77
|
-
});
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
subscribe(traceKitReportHandler);
|
|
81
|
-
}
|
|
82
|
-
export function stopRuntimeErrorTracking() {
|
|
83
|
-
unsubscribe(traceKitReportHandler);
|
|
84
|
-
}
|
|
85
|
-
export function trackNetworkError(configuration, errorObservable) {
|
|
86
|
-
startXhrProxy().onRequestComplete(function (context) {
|
|
87
|
-
handleCompleteRequest(RequestType.XHR, context);
|
|
88
|
-
});
|
|
89
|
-
startFetchProxy().onRequestComplete(function (context) {
|
|
90
|
-
handleCompleteRequest(RequestType.FETCH, context);
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
function handleCompleteRequest(type, request) {
|
|
94
|
-
if (!isIntakeRequest(request.url, configuration) && !request.isAborted && (isRejected(request) || isServerError(request) || configuration.isServerError(request))) {
|
|
95
|
-
errorObservable.notify({
|
|
96
|
-
message: format(type) + ' error ' + request.method + ' ' + request.url,
|
|
97
|
-
resource: {
|
|
98
|
-
method: request.method,
|
|
99
|
-
statusCode: request.status,
|
|
100
|
-
url: request.url,
|
|
101
|
-
traceId: request.traceId,
|
|
102
|
-
spanId: request.spanId
|
|
103
|
-
},
|
|
104
|
-
source: ErrorSource.NETWORK,
|
|
105
|
-
stack: truncateResponse(request.response, configuration) || 'Failed to load',
|
|
106
|
-
startClocks: request.startClocks
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return {
|
|
112
|
-
stop: () => {
|
|
113
|
-
resetXhrProxy();
|
|
114
|
-
resetFetchProxy();
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function isRejected(request) {
|
|
120
|
-
return request.status === 0 && request.responseType !== 'opaque';
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function isServerError(request) {
|
|
124
|
-
return request.status >= 500;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function truncateResponse(response, configuration) {
|
|
128
|
-
if (response && response.length > configuration.requestErrorResponseLengthLimit) {
|
|
129
|
-
return response.substring(0, configuration.requestErrorResponseLengthLimit) + '...';
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
return response;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function format(type) {
|
|
136
|
-
if (RequestType.XHR === type) {
|
|
137
|
-
return 'XHR';
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return 'Fetch';
|
|
141
|
-
}
|
package/esm/fetchProxy.js
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
2
|
-
|
|
3
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
4
|
-
|
|
5
|
-
import { each, relativeNow, clocksNow, elapsed } from './helper/tools';
|
|
6
|
-
import { computeStackTrace } from './tracekit';
|
|
7
|
-
import { toStackTraceString } from './helper/errorTools';
|
|
8
|
-
import { normalizeUrl } from './helper/urlPolyfill';
|
|
9
|
-
var fetchProxySingleton;
|
|
10
|
-
var originalFetch;
|
|
11
|
-
var beforeSendCallbacks = [];
|
|
12
|
-
var onRequestCompleteCallbacks = [];
|
|
13
|
-
export function startFetchProxy() {
|
|
14
|
-
if (!fetchProxySingleton) {
|
|
15
|
-
proxyFetch();
|
|
16
|
-
fetchProxySingleton = {
|
|
17
|
-
beforeSend: function beforeSend(callback) {
|
|
18
|
-
beforeSendCallbacks.push(callback);
|
|
19
|
-
},
|
|
20
|
-
onRequestComplete: function onRequestComplete(callback) {
|
|
21
|
-
onRequestCompleteCallbacks.push(callback);
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return fetchProxySingleton;
|
|
27
|
-
}
|
|
28
|
-
export function resetFetchProxy() {
|
|
29
|
-
if (fetchProxySingleton) {
|
|
30
|
-
fetchProxySingleton = undefined;
|
|
31
|
-
beforeSendCallbacks.splice(0, beforeSendCallbacks.length);
|
|
32
|
-
onRequestCompleteCallbacks.splice(0, onRequestCompleteCallbacks.length);
|
|
33
|
-
window.fetch = originalFetch;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function proxyFetch() {
|
|
38
|
-
if (!window.fetch) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
originalFetch = window.fetch;
|
|
43
|
-
|
|
44
|
-
window.fetch = function (input, init) {
|
|
45
|
-
var responsePromise;
|
|
46
|
-
var context = beforeSend.apply(null, [input, init]);
|
|
47
|
-
|
|
48
|
-
if (context) {
|
|
49
|
-
responsePromise = originalFetch.call(this, context.input, context.init);
|
|
50
|
-
afterSend.apply(null, [responsePromise, context]);
|
|
51
|
-
} else {
|
|
52
|
-
responsePromise = originalFetch.call(this, input, init);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return responsePromise;
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function beforeSend(input, init) {
|
|
60
|
-
var method = init && init.method || typeof input === 'object' && input.method || 'GET';
|
|
61
|
-
var url = normalizeUrl(typeof input === 'object' && input.url || input);
|
|
62
|
-
var startClocks = clocksNow();
|
|
63
|
-
var context = {
|
|
64
|
-
init: init,
|
|
65
|
-
input: input,
|
|
66
|
-
method: method,
|
|
67
|
-
startTime: relativeNow(),
|
|
68
|
-
startClocks: startClocks,
|
|
69
|
-
url: url
|
|
70
|
-
};
|
|
71
|
-
each(beforeSendCallbacks, function (callback) {
|
|
72
|
-
callback(context);
|
|
73
|
-
});
|
|
74
|
-
return context;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function afterSend(responsePromise, context) {
|
|
78
|
-
var reportFetch = /*#__PURE__*/function () {
|
|
79
|
-
var _ref = _asyncToGenerator(function* (response) {
|
|
80
|
-
context.duration = elapsed(context.startClocks.relative, relativeNow());
|
|
81
|
-
|
|
82
|
-
if ('stack' in response || response instanceof Error) {
|
|
83
|
-
context.status = 0;
|
|
84
|
-
context.response = toStackTraceString(computeStackTrace(response));
|
|
85
|
-
context.headers = response.headers;
|
|
86
|
-
context.isAborted = response instanceof DOMException && response.code === DOMException.ABORT_ERR;
|
|
87
|
-
each(onRequestCompleteCallbacks, function (callback) {
|
|
88
|
-
callback(context);
|
|
89
|
-
});
|
|
90
|
-
} else if ('status' in response) {
|
|
91
|
-
var text;
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
text = yield response.clone().text();
|
|
95
|
-
} catch (e) {
|
|
96
|
-
text = 'Unable to retrieve response: ' + e;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
context.response = text;
|
|
100
|
-
context.responseType = response.type;
|
|
101
|
-
context.status = response.status;
|
|
102
|
-
context.headers = response.headers;
|
|
103
|
-
context.isAborted = false;
|
|
104
|
-
each(onRequestCompleteCallbacks, function (callback) {
|
|
105
|
-
callback(context);
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
return function reportFetch(_x) {
|
|
111
|
-
return _ref.apply(this, arguments);
|
|
112
|
-
};
|
|
113
|
-
}();
|
|
114
|
-
|
|
115
|
-
responsePromise.then(reportFetch, reportFetch);
|
|
116
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { ErrorSource } from './errorTools';
|
|
2
|
-
import { ONE_MINUTE, clocksNow } from './tools';
|
|
3
|
-
export function createErrorFilter(configuration, onLimitReached) {
|
|
4
|
-
var errorCount = 0;
|
|
5
|
-
var allowNextError = false;
|
|
6
|
-
return {
|
|
7
|
-
isLimitReached: function isLimitReached() {
|
|
8
|
-
if (errorCount === 0) {
|
|
9
|
-
setTimeout(function () {
|
|
10
|
-
errorCount = 0;
|
|
11
|
-
}, ONE_MINUTE);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
errorCount += 1;
|
|
15
|
-
|
|
16
|
-
if (errorCount <= configuration.maxErrorsByMinute || allowNextError) {
|
|
17
|
-
allowNextError = false;
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (errorCount === configuration.maxErrorsByMinute + 1) {
|
|
22
|
-
allowNextError = true;
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
onLimitReached({
|
|
26
|
-
message: "Reached max number of errors by minute: ".concat(configuration.maxErrorsByMinute),
|
|
27
|
-
source: ErrorSource.AGENT,
|
|
28
|
-
startClocks: clocksNow()
|
|
29
|
-
});
|
|
30
|
-
} finally {
|
|
31
|
-
allowNextError = false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
}
|
package/esm/sessionManagement.js
DELETED
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { cacheCookieAccess, COOKIE_ACCESS_DELAY } from './cookie';
|
|
2
|
-
import { Observable } from './helper/observable';
|
|
3
|
-
import { ONE_MINUTE, ONE_HOUR, throttle, UUID, isEmptyObject, objectEntries, addEventListener, addEventListeners, each } from './helper/tools';
|
|
4
|
-
import { DOM_EVENT } from './helper/enums';
|
|
5
|
-
export var SESSION_COOKIE_NAME = '_dataflux_s';
|
|
6
|
-
export var SESSION_EXPIRATION_DELAY = 15 * ONE_MINUTE;
|
|
7
|
-
export var SESSION_TIME_OUT_DELAY = 4 * ONE_HOUR;
|
|
8
|
-
export var VISIBILITY_CHECK_DELAY = ONE_MINUTE;
|
|
9
|
-
export var ANONYMOUS_ID_COOKIE_NAME = '_dataflulx_an_id';
|
|
10
|
-
export var ANONYMOUS_ID_EXPIRATION = 60 * 24 * ONE_HOUR;
|
|
11
|
-
|
|
12
|
-
function cacheAnonymousID(options) {
|
|
13
|
-
var anonymousCookie = cacheCookieAccess(ANONYMOUS_ID_COOKIE_NAME, options);
|
|
14
|
-
var anonymouseId = anonymousCookie.get();
|
|
15
|
-
|
|
16
|
-
if (!anonymouseId) {
|
|
17
|
-
anonymousCookie.set(UUID(), ANONYMOUS_ID_EXPIRATION);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return anonymousCookie;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Limit access to cookie to avoid performance issues
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
export function startSessionManagement(options, productKey, computeSessionState) {
|
|
28
|
-
var anonymousCookie = cacheAnonymousID(options);
|
|
29
|
-
var sessionCookie = cacheCookieAccess(SESSION_COOKIE_NAME, options);
|
|
30
|
-
var renewObservable = new Observable();
|
|
31
|
-
var currentSession = retrieveActiveSession(sessionCookie);
|
|
32
|
-
var currentSessionId = currentSession.id;
|
|
33
|
-
var expandOrRenewSession = throttle(function () {
|
|
34
|
-
sessionCookie.clearCache();
|
|
35
|
-
var session = retrieveActiveSession(sessionCookie);
|
|
36
|
-
var state = computeSessionState(session[productKey]);
|
|
37
|
-
session[productKey] = state.trackingType;
|
|
38
|
-
|
|
39
|
-
if (state.isTracked && !session.id) {
|
|
40
|
-
session.id = UUID();
|
|
41
|
-
session.created = String(Date.now());
|
|
42
|
-
} // save changes and expand session duration
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
persistSession(session, sessionCookie); // If the session id has changed, notify that the session has been renewed
|
|
46
|
-
|
|
47
|
-
if (state.isTracked && currentSessionId !== session.id) {
|
|
48
|
-
currentSessionId = session.id;
|
|
49
|
-
renewObservable.notify();
|
|
50
|
-
}
|
|
51
|
-
}, COOKIE_ACCESS_DELAY);
|
|
52
|
-
|
|
53
|
-
var expandSession = function expandSession() {
|
|
54
|
-
sessionCookie.clearCache();
|
|
55
|
-
var session = retrieveActiveSession(sessionCookie);
|
|
56
|
-
persistSession(session, sessionCookie);
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
expandOrRenewSession();
|
|
60
|
-
trackActivity(expandOrRenewSession);
|
|
61
|
-
trackVisibility(expandSession);
|
|
62
|
-
return {
|
|
63
|
-
getAnonymousID: function getAnonymousID() {
|
|
64
|
-
return anonymousCookie.get();
|
|
65
|
-
},
|
|
66
|
-
getId: function getId() {
|
|
67
|
-
// 先获取debug id
|
|
68
|
-
var session = retrieveActiveSession(sessionCookie);
|
|
69
|
-
return session.did || session.id;
|
|
70
|
-
},
|
|
71
|
-
getTrackingType: function getTrackingType() {
|
|
72
|
-
return retrieveActiveSession(sessionCookie)[productKey];
|
|
73
|
-
},
|
|
74
|
-
getDebugSession: function getDebugSession() {
|
|
75
|
-
var session = retrieveActiveSession(sessionCookie);
|
|
76
|
-
|
|
77
|
-
if (isEmptyObject(session) || !session.did) {
|
|
78
|
-
return {};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
id: session.did,
|
|
83
|
-
created: session.dcreated
|
|
84
|
-
};
|
|
85
|
-
},
|
|
86
|
-
addDebugSession: function addDebugSession(id, created) {
|
|
87
|
-
var session = retrieveActiveSession(sessionCookie);
|
|
88
|
-
|
|
89
|
-
if (!isEmptyObject(session)) {
|
|
90
|
-
session.did = id || UUID;
|
|
91
|
-
session.dcreated = created || String(Date.now());
|
|
92
|
-
persistSession(session, sessionCookie);
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
|
-
clearDebugSession: function clearDebugSession() {
|
|
96
|
-
var session = retrieveActiveSession(sessionCookie);
|
|
97
|
-
var newSession = {};
|
|
98
|
-
each(objectEntries(session), function (item) {
|
|
99
|
-
if (item[0] !== 'did' && item[0] !== 'dcreated') {
|
|
100
|
-
newSession[item[0]] = item[1];
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
persistSession(newSession, sessionCookie);
|
|
104
|
-
},
|
|
105
|
-
renewObservable: renewObservable
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
var SESSION_ENTRY_REGEXP = /^([a-z]+)=([a-z0-9-]+)$/;
|
|
109
|
-
var SESSION_ENTRY_SEPARATOR = '&';
|
|
110
|
-
export function isValidSessionString(sessionString) {
|
|
111
|
-
return sessionString !== undefined && (sessionString.indexOf(SESSION_ENTRY_SEPARATOR) !== -1 || SESSION_ENTRY_REGEXP.test(sessionString));
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function retrieveActiveSession(sessionCookie) {
|
|
115
|
-
var session = retrieveSession(sessionCookie);
|
|
116
|
-
|
|
117
|
-
if (isActiveSession(session)) {
|
|
118
|
-
return session;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
clearSession(sessionCookie);
|
|
122
|
-
return {};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function isActiveSession(session) {
|
|
126
|
-
return (session.created === undefined || Date.now() - Number(session.created) < SESSION_TIME_OUT_DELAY) && (session.expire === undefined || Date.now() < Number(session.expire));
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
function retrieveSession(sessionCookie) {
|
|
130
|
-
var sessionString = sessionCookie.get();
|
|
131
|
-
var session = {};
|
|
132
|
-
|
|
133
|
-
if (isValidSessionString(sessionString)) {
|
|
134
|
-
each(sessionString.split(SESSION_ENTRY_SEPARATOR), function (entry) {
|
|
135
|
-
var matches = SESSION_ENTRY_REGEXP.exec(entry);
|
|
136
|
-
|
|
137
|
-
if (matches !== null) {
|
|
138
|
-
var key = matches[1];
|
|
139
|
-
var value = matches[2];
|
|
140
|
-
session[key] = value;
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return session;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
export function persistSession(session, cookie) {
|
|
149
|
-
if (isEmptyObject(session)) {
|
|
150
|
-
clearSession(cookie);
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
session.expire = String(Date.now() + SESSION_EXPIRATION_DELAY);
|
|
155
|
-
var cookieArray = [];
|
|
156
|
-
each(objectEntries(session), function (item) {
|
|
157
|
-
cookieArray.push(item[0] + '=' + item[1]);
|
|
158
|
-
});
|
|
159
|
-
var cookieString = cookieArray.join(SESSION_ENTRY_SEPARATOR);
|
|
160
|
-
cookie.set(cookieString, SESSION_EXPIRATION_DELAY);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function clearSession(cookie) {
|
|
164
|
-
cookie.set('', 0);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export function stopSessionManagement() {
|
|
168
|
-
each(stopCallbacks, function (e) {
|
|
169
|
-
e();
|
|
170
|
-
});
|
|
171
|
-
stopCallbacks = [];
|
|
172
|
-
}
|
|
173
|
-
var stopCallbacks = [];
|
|
174
|
-
export function trackActivity(expandOrRenewSession) {
|
|
175
|
-
var listeners = addEventListeners(window, [DOM_EVENT.CLICK, DOM_EVENT.TOUCH_START, DOM_EVENT.KEY_DOWN, DOM_EVENT.SCROLL], expandOrRenewSession, {
|
|
176
|
-
capture: true,
|
|
177
|
-
passive: true
|
|
178
|
-
});
|
|
179
|
-
stopCallbacks.push(listeners.stop);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function trackVisibility(expandSession) {
|
|
183
|
-
var expandSessionWhenVisible = function expandSessionWhenVisible() {
|
|
184
|
-
if (document.visibilityState === 'visible') {
|
|
185
|
-
expandSession();
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
var listener = addEventListener(document, DOM_EVENT.VISIBILITY_CHANGE, expandSessionWhenVisible);
|
|
190
|
-
stopCallbacks.push(listener.stop);
|
|
191
|
-
var visibilityCheckInterval = window.setInterval(expandSessionWhenVisible, VISIBILITY_CHECK_DELAY);
|
|
192
|
-
stopCallbacks.push(function () {
|
|
193
|
-
clearInterval(visibilityCheckInterval);
|
|
194
|
-
});
|
|
195
|
-
}
|