@newrelic/browser-agent 1.232.1 → 1.233.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/dist/cjs/cdn/polyfills.js +5 -2
- package/dist/cjs/common/config/state/configurable.js +15 -26
- package/dist/cjs/common/config/state/info.js +1 -1
- package/dist/cjs/common/config/state/init.js +101 -56
- package/dist/cjs/common/config/state/loader-config.js +1 -1
- package/dist/cjs/common/config/state/runtime.js +1 -5
- package/dist/cjs/common/constants/env.cdn.js +1 -1
- package/dist/cjs/common/constants/env.npm.js +1 -1
- package/dist/cjs/common/drain/drain.js +1 -1
- package/dist/cjs/common/harvest/harvest-scheduler.js +30 -10
- package/dist/cjs/common/harvest/harvest.js +119 -55
- package/dist/cjs/common/session/session-entity.js +35 -22
- package/dist/cjs/common/session/session-entity.test.js +73 -49
- package/dist/cjs/common/timer/interaction-timer.js +9 -12
- package/dist/cjs/common/url/protocol.test.js +0 -1
- package/dist/cjs/common/util/feature-flags.js +2 -1
- package/dist/cjs/common/util/submit-data.js +57 -18
- package/dist/cjs/common/wrap/wrap-fetch.js +1 -1
- package/dist/cjs/common/wrap/wrap-function.js +1 -1
- package/dist/cjs/common/wrap/wrap-promise.js +1 -1
- package/dist/cjs/features/ajax/aggregate/index.js +2 -2
- package/dist/cjs/features/jserrors/aggregate/index.js +7 -5
- package/dist/cjs/features/metrics/aggregate/framework-detection.js +67 -0
- package/dist/cjs/features/metrics/aggregate/framework-detection.test.js +137 -0
- package/dist/cjs/features/metrics/aggregate/index.js +7 -3
- package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.js +14 -0
- package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.test.js +17 -0
- package/dist/cjs/features/metrics/aggregate/polyfill-detection.js +53 -0
- package/dist/cjs/features/metrics/aggregate/polyfill-detection.test.js +165 -0
- package/dist/cjs/features/page_action/aggregate/index.js +2 -2
- package/dist/cjs/features/page_view_event/aggregate/index.js +6 -3
- package/dist/cjs/features/page_view_timing/aggregate/index.js +2 -2
- package/dist/cjs/features/session_replay/aggregate/index.js +333 -0
- package/dist/cjs/features/session_replay/constants.js +9 -0
- package/dist/cjs/features/session_replay/index.js +12 -0
- package/dist/cjs/features/session_replay/instrument/index.js +29 -0
- package/dist/cjs/features/session_trace/aggregate/index.js +163 -162
- package/dist/cjs/features/session_trace/constants.js +2 -9
- package/dist/cjs/features/session_trace/instrument/index.js +24 -66
- package/dist/cjs/features/spa/aggregate/index.js +2 -2
- package/dist/cjs/features/utils/agent-session.js +1 -2
- package/dist/cjs/features/utils/aggregate-base.js +64 -0
- package/dist/cjs/features/utils/feature-base.js +0 -31
- package/dist/cjs/features/utils/handler-cache.js +3 -4
- package/dist/cjs/features/utils/instrument-base.js +42 -10
- package/dist/cjs/features/utils/{lazy-loader.js → lazy-feature-loader.js} +4 -2
- package/dist/cjs/loaders/agent.js +1 -1
- package/dist/cjs/loaders/api/apiAsync.js +3 -1
- package/dist/cjs/loaders/configure/configure.js +3 -3
- package/dist/cjs/loaders/features/featureDependencies.js +0 -12
- package/dist/cjs/loaders/features/features.js +3 -1
- package/dist/cjs/loaders/micro-agent.js +6 -6
- package/dist/esm/cdn/polyfills.js +5 -2
- package/dist/esm/common/config/state/configurable.js +14 -24
- package/dist/esm/common/config/state/info.js +2 -2
- package/dist/esm/common/config/state/init.js +102 -57
- package/dist/esm/common/config/state/loader-config.js +2 -2
- package/dist/esm/common/config/state/runtime.js +2 -4
- package/dist/esm/common/constants/env.cdn.js +1 -1
- package/dist/esm/common/constants/env.npm.js +1 -1
- package/dist/esm/common/drain/drain.js +1 -1
- package/dist/esm/common/harvest/harvest-scheduler.js +30 -10
- package/dist/esm/common/harvest/harvest.js +121 -56
- package/dist/esm/common/session/session-entity.js +35 -22
- package/dist/esm/common/session/session-entity.test.js +73 -49
- package/dist/esm/common/timer/interaction-timer.js +9 -12
- package/dist/esm/common/url/protocol.test.js +0 -1
- package/dist/esm/common/util/feature-flags.js +2 -1
- package/dist/esm/common/util/submit-data.js +57 -18
- package/dist/esm/common/wrap/wrap-fetch.js +1 -1
- package/dist/esm/common/wrap/wrap-function.js +1 -1
- package/dist/esm/common/wrap/wrap-promise.js +1 -1
- package/dist/esm/features/ajax/aggregate/index.js +2 -2
- package/dist/esm/features/jserrors/aggregate/index.js +7 -5
- package/dist/esm/features/metrics/aggregate/framework-detection.js +61 -0
- package/dist/esm/features/metrics/aggregate/framework-detection.test.js +133 -0
- package/dist/esm/features/metrics/aggregate/index.js +7 -3
- package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.js +8 -0
- package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.test.js +15 -0
- package/dist/esm/features/metrics/aggregate/polyfill-detection.js +47 -0
- package/dist/esm/features/metrics/aggregate/polyfill-detection.test.js +163 -0
- package/dist/esm/features/page_action/aggregate/index.js +2 -2
- package/dist/esm/features/page_view_event/aggregate/index.js +6 -3
- package/dist/esm/features/page_view_timing/aggregate/index.js +2 -2
- package/dist/esm/features/session_replay/aggregate/index.js +327 -0
- package/dist/esm/features/session_replay/constants.js +2 -0
- package/dist/esm/features/session_replay/index.js +12 -0
- package/dist/esm/features/session_replay/instrument/index.js +21 -0
- package/dist/esm/features/session_trace/aggregate/index.js +163 -162
- package/dist/esm/features/session_trace/constants.js +1 -5
- package/dist/esm/features/session_trace/instrument/index.js +24 -66
- package/dist/esm/features/spa/aggregate/index.js +2 -2
- package/dist/esm/features/utils/agent-session.js +1 -2
- package/dist/esm/features/utils/aggregate-base.js +57 -0
- package/dist/esm/features/utils/feature-base.js +1 -32
- package/dist/esm/features/utils/handler-cache.js +3 -4
- package/dist/esm/features/utils/instrument-base.js +42 -10
- package/dist/esm/features/utils/{lazy-loader.js → lazy-feature-loader.js} +3 -1
- package/dist/esm/loaders/agent.js +1 -1
- package/dist/esm/loaders/api/apiAsync.js +3 -1
- package/dist/esm/loaders/configure/configure.js +3 -3
- package/dist/esm/loaders/features/featureDependencies.js +0 -11
- package/dist/esm/loaders/features/features.js +3 -1
- package/dist/esm/loaders/micro-agent.js +6 -6
- package/dist/types/common/config/state/configurable.d.ts +1 -3
- package/dist/types/common/config/state/configurable.d.ts.map +1 -1
- package/dist/types/common/config/state/init.d.ts.map +1 -1
- package/dist/types/common/config/state/runtime.d.ts.map +1 -1
- package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
- package/dist/types/common/harvest/harvest.d.ts +37 -34
- package/dist/types/common/harvest/harvest.d.ts.map +1 -1
- package/dist/types/common/session/session-entity.d.ts +6 -3
- package/dist/types/common/session/session-entity.d.ts.map +1 -1
- package/dist/types/common/timer/interaction-timer.d.ts +2 -1
- package/dist/types/common/timer/interaction-timer.d.ts.map +1 -1
- package/dist/types/common/util/feature-flags.d.ts.map +1 -1
- package/dist/types/common/util/submit-data.d.ts +40 -14
- package/dist/types/common/util/submit-data.d.ts.map +1 -1
- package/dist/types/features/ajax/aggregate/index.d.ts +2 -2
- package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/jserrors/aggregate/index.d.ts +2 -2
- package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/metrics/aggregate/framework-detection.d.ts.map +1 -0
- package/dist/types/features/metrics/aggregate/index.d.ts +2 -2
- package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts +6 -0
- package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts.map +1 -0
- package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts +7 -0
- package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts.map +1 -0
- package/dist/types/features/page_action/aggregate/index.d.ts +2 -2
- package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/page_view_event/aggregate/index.d.ts +2 -2
- package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/page_view_timing/aggregate/index.d.ts +2 -2
- package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_replay/aggregate/index.d.ts +96 -0
- package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -0
- package/dist/types/features/session_replay/constants.d.ts +2 -0
- package/dist/types/features/session_replay/constants.d.ts.map +1 -0
- package/dist/types/features/session_replay/index.d.ts +2 -0
- package/dist/types/features/session_replay/index.d.ts.map +1 -0
- package/dist/types/features/session_replay/instrument/index.d.ts +6 -0
- package/dist/types/features/session_replay/instrument/index.d.ts.map +1 -0
- package/dist/types/features/session_trace/aggregate/index.d.ts +8 -57
- package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_trace/constants.d.ts +0 -3
- package/dist/types/features/session_trace/constants.d.ts.map +1 -1
- package/dist/types/features/session_trace/instrument/index.d.ts +1 -3
- package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
- package/dist/types/features/spa/aggregate/index.d.ts +2 -2
- package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/utils/agent-session.d.ts.map +1 -1
- package/dist/types/features/utils/aggregate-base.d.ts +11 -0
- package/dist/types/features/utils/aggregate-base.d.ts.map +1 -0
- package/dist/types/features/utils/feature-base.d.ts +0 -5
- package/dist/types/features/utils/feature-base.d.ts.map +1 -1
- package/dist/types/features/utils/handler-cache.d.ts.map +1 -1
- package/dist/types/features/utils/instrument-base.d.ts +3 -1
- package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
- package/dist/types/features/utils/{lazy-loader.d.ts → lazy-feature-loader.d.ts} +2 -2
- package/dist/types/features/utils/lazy-feature-loader.d.ts.map +1 -0
- package/dist/types/loaders/configure/configure.d.ts.map +1 -1
- package/dist/types/loaders/features/featureDependencies.d.ts +0 -1
- package/dist/types/loaders/features/featureDependencies.d.ts.map +1 -1
- package/dist/types/loaders/features/features.d.ts +1 -0
- package/dist/types/loaders/features/features.d.ts.map +1 -1
- package/package.json +28 -19
- package/src/cdn/polyfills.js +4 -1
- package/src/common/config/state/configurable.js +18 -24
- package/src/common/config/state/info.js +2 -2
- package/src/common/config/state/init.js +62 -28
- package/src/common/config/state/loader-config.js +2 -2
- package/src/common/config/state/runtime.js +2 -4
- package/src/common/drain/drain.js +1 -1
- package/src/common/harvest/harvest-scheduler.js +35 -10
- package/src/common/harvest/harvest.js +73 -50
- package/src/common/session/session-entity.js +34 -23
- package/src/common/session/session-entity.test.js +57 -51
- package/src/common/timer/interaction-timer.js +9 -12
- package/src/common/url/protocol.test.js +0 -1
- package/src/common/util/feature-flags.js +2 -2
- package/src/common/util/submit-data.js +28 -17
- package/src/common/wrap/wrap-fetch.js +1 -1
- package/src/common/wrap/wrap-function.js +1 -1
- package/src/common/wrap/wrap-promise.js +1 -1
- package/src/features/ajax/aggregate/index.js +2 -2
- package/src/features/jserrors/aggregate/index.js +7 -5
- package/src/features/metrics/aggregate/framework-detection.js +73 -0
- package/src/features/metrics/aggregate/framework-detection.test.js +201 -0
- package/src/features/metrics/aggregate/index.js +8 -3
- package/src/features/metrics/aggregate/polyfill-detection.es5.js +9 -0
- package/src/features/metrics/aggregate/polyfill-detection.es5.test.js +16 -0
- package/src/features/metrics/aggregate/polyfill-detection.js +48 -0
- package/src/features/metrics/aggregate/polyfill-detection.test.js +163 -0
- package/src/features/page_action/aggregate/index.js +2 -2
- package/src/features/page_view_event/aggregate/index.js +5 -5
- package/src/features/page_view_timing/aggregate/index.js +2 -2
- package/src/features/session_replay/aggregate/index.js +314 -0
- package/src/features/session_replay/constants.js +3 -0
- package/src/features/session_replay/index.js +12 -0
- package/src/features/session_replay/instrument/index.js +22 -0
- package/src/features/session_trace/aggregate/index.js +148 -187
- package/src/features/session_trace/constants.js +0 -4
- package/src/features/session_trace/instrument/index.js +17 -69
- package/src/features/spa/aggregate/index.js +2 -2
- package/src/features/utils/agent-session.js +1 -2
- package/src/features/utils/aggregate-base.js +51 -0
- package/src/features/utils/feature-base.js +1 -31
- package/src/features/utils/handler-cache.js +3 -4
- package/src/features/utils/instrument-base.js +40 -8
- package/src/features/utils/{lazy-loader.js → lazy-feature-loader.js} +3 -1
- package/src/loaders/agent.js +1 -1
- package/src/loaders/api/apiAsync.js +1 -1
- package/src/loaders/configure/configure.js +4 -3
- package/src/loaders/features/featureDependencies.js +0 -12
- package/src/loaders/features/features.js +3 -1
- package/src/loaders/micro-agent.js +4 -4
- package/dist/cjs/common/metrics/framework-detection.js +0 -72
- package/dist/cjs/common/util/user-agent.js +0 -57
- package/dist/cjs/common/window/supports-performance-observer.js +0 -15
- package/dist/esm/common/metrics/framework-detection.js +0 -66
- package/dist/esm/common/util/user-agent.js +0 -48
- package/dist/esm/common/window/supports-performance-observer.js +0 -9
- package/dist/types/common/metrics/framework-detection.d.ts.map +0 -1
- package/dist/types/common/util/user-agent.d.ts +0 -5
- package/dist/types/common/util/user-agent.d.ts.map +0 -1
- package/dist/types/common/window/supports-performance-observer.d.ts +0 -2
- package/dist/types/common/window/supports-performance-observer.d.ts.map +0 -1
- package/dist/types/features/utils/lazy-loader.d.ts.map +0 -1
- package/src/common/metrics/framework-detection.js +0 -71
- package/src/common/util/user-agent.js +0 -56
- package/src/common/window/supports-performance-observer.js +0 -10
- /package/dist/types/{common/metrics → features/metrics/aggregate}/framework-detection.d.ts +0 -0
|
@@ -20,7 +20,7 @@ var _contextualEe = require("../../../common/event-emitter/contextual-ee");
|
|
|
20
20
|
var CONSTANTS = _interopRequireWildcard(require("../constants"));
|
|
21
21
|
var _drain = require("../../../common/drain/drain");
|
|
22
22
|
var _features = require("../../../loaders/features/features");
|
|
23
|
-
var
|
|
23
|
+
var _aggregateBase = require("../../utils/aggregate-base");
|
|
24
24
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
25
25
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
26
26
|
/*
|
|
@@ -47,7 +47,7 @@ const {
|
|
|
47
47
|
JSONP_END,
|
|
48
48
|
originalSetTimeout
|
|
49
49
|
} = CONSTANTS;
|
|
50
|
-
class Aggregate extends
|
|
50
|
+
class Aggregate extends _aggregateBase.AggregateBase {
|
|
51
51
|
static featureName = FEATURE_NAME;
|
|
52
52
|
constructor(agentIdentifier, aggregator) {
|
|
53
53
|
super(agentIdentifier, aggregator, FEATURE_NAME);
|
|
@@ -12,7 +12,6 @@ var _globalScope = require("../../common/util/global-scope");
|
|
|
12
12
|
var _sessionEntity = require("../../common/session/session-entity");
|
|
13
13
|
var _localStorage = require("../../common/storage/local-storage.js");
|
|
14
14
|
var _firstPartyCookies = require("../../common/storage/first-party-cookies");
|
|
15
|
-
var _localMemory = require("../../common/storage/local-memory");
|
|
16
15
|
let ranOnce = 0;
|
|
17
16
|
function setupAgentSession(agentIdentifier) {
|
|
18
17
|
const agentRuntime = (0, _config.getRuntime)(agentIdentifier);
|
|
@@ -42,7 +41,7 @@ function setupAgentSession(agentIdentifier) {
|
|
|
42
41
|
// that's currently stored in the storage API into the local info.jsAttributes object
|
|
43
42
|
if (_globalScope.isBrowserScope) {
|
|
44
43
|
// retrieve & re-add all of the persisted setCustomAttribute|setUserId k-v from previous page load(s)
|
|
45
|
-
const customSessionData = agentRuntime.session
|
|
44
|
+
const customSessionData = agentRuntime.session.state.custom;
|
|
46
45
|
const agentInfo = (0, _config.getInfo)(agentIdentifier);
|
|
47
46
|
if (customSessionData) {
|
|
48
47
|
(0, _config.setInfo)(agentIdentifier, {
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.AggregateBase = void 0;
|
|
7
|
+
var _registerHandler = require("../../common/event-emitter/register-handler");
|
|
8
|
+
var _featureBase = require("./feature-base");
|
|
9
|
+
var _config = require("../../common/config/config");
|
|
10
|
+
var _configure = require("../../loaders/configure/configure");
|
|
11
|
+
var _nreum = require("../../common/window/nreum");
|
|
12
|
+
class AggregateBase extends _featureBase.FeatureBase {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this.checkConfiguration();
|
|
16
|
+
}
|
|
17
|
+
waitForFlags() {
|
|
18
|
+
let flagNames = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
19
|
+
return Promise.all(flagNames.map(fName => new Promise(resolve => {
|
|
20
|
+
(0, _registerHandler.registerHandler)("feat-".concat(fName), () => {
|
|
21
|
+
resolve({
|
|
22
|
+
name: fName,
|
|
23
|
+
value: true
|
|
24
|
+
});
|
|
25
|
+
}, this.featureName, this.ee);
|
|
26
|
+
(0, _registerHandler.registerHandler)("block-".concat(fName), () => {
|
|
27
|
+
resolve({
|
|
28
|
+
name: fName,
|
|
29
|
+
value: false
|
|
30
|
+
});
|
|
31
|
+
}, this.feature, this.ee);
|
|
32
|
+
})));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Checks for additional `jsAttributes` items to support backward compatibility with implementations of the agent where
|
|
37
|
+
* loader configurations may appear after the loader code is executed.
|
|
38
|
+
*/
|
|
39
|
+
checkConfiguration() {
|
|
40
|
+
// NOTE: This check has to happen at aggregator load time
|
|
41
|
+
if (!(0, _config.isConfigured)(this.agentIdentifier)) {
|
|
42
|
+
let jsAttributes = {
|
|
43
|
+
...(0, _nreum.gosCDN)().info?.jsAttributes
|
|
44
|
+
};
|
|
45
|
+
try {
|
|
46
|
+
jsAttributes = {
|
|
47
|
+
...jsAttributes,
|
|
48
|
+
...(0, _config.getInfo)(this.agentIdentifier)?.jsAttributes
|
|
49
|
+
};
|
|
50
|
+
} catch (err) {
|
|
51
|
+
// do nothing
|
|
52
|
+
}
|
|
53
|
+
(0, _configure.configure)(this.agentIdentifier, {
|
|
54
|
+
...(0, _nreum.gosCDN)(),
|
|
55
|
+
info: {
|
|
56
|
+
...(0, _nreum.gosCDN)().info,
|
|
57
|
+
jsAttributes
|
|
58
|
+
},
|
|
59
|
+
runtime: (0, _config.getRuntime)(this.agentIdentifier)
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.AggregateBase = AggregateBase;
|
|
@@ -6,8 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.FeatureBase = void 0;
|
|
7
7
|
var _config = require("../../common/config/config");
|
|
8
8
|
var _contextualEe = require("../../common/event-emitter/contextual-ee");
|
|
9
|
-
var _configure = require("../../loaders/configure/configure");
|
|
10
|
-
var _nreum = require("../../common/window/nreum");
|
|
11
9
|
class FeatureBase {
|
|
12
10
|
constructor(agentIdentifier, aggregator, featureName) {
|
|
13
11
|
/** @type {string} */
|
|
@@ -24,35 +22,6 @@ class FeatureBase {
|
|
|
24
22
|
* @type {boolean}
|
|
25
23
|
*/
|
|
26
24
|
this.blocked = false;
|
|
27
|
-
this.checkConfiguration();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Checks for additional `jsAttributes` items to support backward compatibility with implementations of the agent where
|
|
32
|
-
* loader configurations may appear after the loader code is executed.
|
|
33
|
-
*/
|
|
34
|
-
checkConfiguration() {
|
|
35
|
-
// NOTE: This check has to happen at aggregator load time
|
|
36
|
-
if (!(0, _config.isConfigured)(this.agentIdentifier)) {
|
|
37
|
-
let jsAttributes = {
|
|
38
|
-
...(0, _nreum.gosCDN)().info?.jsAttributes
|
|
39
|
-
};
|
|
40
|
-
try {
|
|
41
|
-
jsAttributes = {
|
|
42
|
-
...jsAttributes,
|
|
43
|
-
...(0, _config.getInfo)(this.agentIdentifier)?.jsAttributes
|
|
44
|
-
};
|
|
45
|
-
} catch (err) {
|
|
46
|
-
// do nothing
|
|
47
|
-
}
|
|
48
|
-
(0, _configure.configure)(this.agentIdentifier, {
|
|
49
|
-
...(0, _nreum.gosCDN)(),
|
|
50
|
-
info: {
|
|
51
|
-
...(0, _nreum.gosCDN)().info,
|
|
52
|
-
jsAttributes
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
25
|
}
|
|
57
26
|
}
|
|
58
27
|
exports.FeatureBase = FeatureBase;
|
|
@@ -10,8 +10,6 @@ exports.HandlerCache = void 0;
|
|
|
10
10
|
class HandlerCache {
|
|
11
11
|
/** @private @type {boolean | undefined} */
|
|
12
12
|
#decision = undefined;
|
|
13
|
-
/** @private @type {boolean} */
|
|
14
|
-
#shouldsettle = true;
|
|
15
13
|
/** @private @type {Function[]} */
|
|
16
14
|
#cache = [];
|
|
17
15
|
/** @private @type {Timeout} */
|
|
@@ -34,7 +32,7 @@ class HandlerCache {
|
|
|
34
32
|
* @private
|
|
35
33
|
*/
|
|
36
34
|
#close() {
|
|
37
|
-
this.#
|
|
35
|
+
this.#decision = false; // settle() & decide() cannot be used after close
|
|
38
36
|
this.#cache = [];
|
|
39
37
|
}
|
|
40
38
|
|
|
@@ -44,7 +42,7 @@ class HandlerCache {
|
|
|
44
42
|
* @returns {void}
|
|
45
43
|
*/
|
|
46
44
|
settle(handler) {
|
|
47
|
-
if (this.#decision === false
|
|
45
|
+
if (this.#decision === false) return;else if (this.#decision === undefined) this.#cache.push(handler);else handler();
|
|
48
46
|
}
|
|
49
47
|
|
|
50
48
|
/**
|
|
@@ -56,6 +54,7 @@ class HandlerCache {
|
|
|
56
54
|
* @param {boolean} decision
|
|
57
55
|
*/
|
|
58
56
|
decide(decision) {
|
|
57
|
+
if (this.#decision !== undefined) return; // a decision can only be made once
|
|
59
58
|
this.#decision = decision;
|
|
60
59
|
if (decision === false) this.#close();
|
|
61
60
|
if (decision === true) this.#drain();
|
|
@@ -9,6 +9,8 @@ var _featureBase = require("./feature-base");
|
|
|
9
9
|
var _load = require("../../common/window/load");
|
|
10
10
|
var _globalScope = require("../../common/util/global-scope");
|
|
11
11
|
var _console = require("../../common/util/console");
|
|
12
|
+
var _features = require("../../loaders/features/features");
|
|
13
|
+
var _config = require("../../common/config/config");
|
|
12
14
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
13
15
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /**
|
|
14
16
|
* @file Defines `InstrumentBase` to be used as the super of the Instrument classes implemented by each feature.
|
|
@@ -43,10 +45,18 @@ class InstrumentBase extends _featureBase.FeatureBase {
|
|
|
43
45
|
/**
|
|
44
46
|
* Lazy-load the latter part of the feature: its aggregator. This method is called by the first part of the feature
|
|
45
47
|
* (the instrumentation) when instrumentation is complete.
|
|
48
|
+
* @param {Object} [argsObjFromInstrument] - any values or references to pass down to aggregate
|
|
49
|
+
* @returns void
|
|
46
50
|
*/
|
|
47
|
-
importAggregator() {
|
|
51
|
+
importAggregator(argsObjFromInstrument) {
|
|
48
52
|
if (this.hasAggregator || !this.auto) return;
|
|
49
53
|
this.hasAggregator = true;
|
|
54
|
+
let session, agentSessionImport;
|
|
55
|
+
if ((0, _config.getConfigurationValue)(this.agentIdentifier, 'privacy.cookies_enabled') === true && !_globalScope.isWorkerScope) {
|
|
56
|
+
agentSessionImport = Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "session-manager" */'./agent-session'))).catch(err => {
|
|
57
|
+
(0, _console.warn)('failed to import the session manager', err);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
50
60
|
const importLater = async () => {
|
|
51
61
|
/**
|
|
52
62
|
* Note this try-catch differs from the one in Agent.start() in that it's placed later in a page's lifecycle and
|
|
@@ -54,18 +64,25 @@ class InstrumentBase extends _featureBase.FeatureBase {
|
|
|
54
64
|
*/
|
|
55
65
|
try {
|
|
56
66
|
// The session entity needs to be attached to the config internals before the aggregator chunk runs
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
67
|
+
if (agentSessionImport && !session) {
|
|
68
|
+
const {
|
|
69
|
+
setupAgentSession
|
|
70
|
+
} = await agentSessionImport;
|
|
71
|
+
session = setupAgentSession(this.agentIdentifier);
|
|
72
|
+
}
|
|
73
|
+
if (!shouldImportAgg(this.featureName, session)) {
|
|
74
|
+
(0, _drain.drain)(this.agentIdentifier, this.featureName);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
61
78
|
// import and instantiate the aggregator chunk
|
|
62
79
|
const {
|
|
63
|
-
|
|
64
|
-
} = await Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-loader" */'./lazy-loader')));
|
|
80
|
+
lazyFeatureLoader
|
|
81
|
+
} = await Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-feature-loader" */'./lazy-feature-loader')));
|
|
65
82
|
const {
|
|
66
83
|
Aggregate
|
|
67
|
-
} = await
|
|
68
|
-
new Aggregate(this.agentIdentifier, this.aggregator);
|
|
84
|
+
} = await lazyFeatureLoader(this.featureName, 'aggregate');
|
|
85
|
+
new Aggregate(this.agentIdentifier, this.aggregator, argsObjFromInstrument);
|
|
69
86
|
} catch (e) {
|
|
70
87
|
(0, _console.warn)("Downloading ".concat(this.featureName, " failed..."), e);
|
|
71
88
|
this.abortHandler?.(); // undo any important alterations made to the page
|
|
@@ -78,4 +95,19 @@ class InstrumentBase extends _featureBase.FeatureBase {
|
|
|
78
95
|
if (_globalScope.isWorkerScope) importLater();else (0, _load.onWindowLoad)(() => importLater(), true);
|
|
79
96
|
}
|
|
80
97
|
}
|
|
81
|
-
|
|
98
|
+
/**
|
|
99
|
+
* Make a determination if an aggregate class should even be imported
|
|
100
|
+
* @param {string} featureName
|
|
101
|
+
* @param {SessionEntity} session
|
|
102
|
+
* @returns
|
|
103
|
+
*/
|
|
104
|
+
exports.InstrumentBase = InstrumentBase;
|
|
105
|
+
function shouldImportAgg(featureName, session) {
|
|
106
|
+
// if this isnt the FIRST load of a session AND
|
|
107
|
+
// we are not actively recording SR... DO NOT run the aggregator
|
|
108
|
+
// session replay samples can only be decided on the first load of a session
|
|
109
|
+
// session replays can continue if in progress
|
|
110
|
+
if (featureName === _features.FEATURE_NAMES.sessionReplay) return !!session?.isNew || !!session?.state.sessionReplayActive;
|
|
111
|
+
// todo -- add case like above for session trace
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.lazyFeatureLoader = lazyFeatureLoader;
|
|
7
7
|
var _features = require("../../loaders/features/features");
|
|
8
8
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
9
9
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
@@ -18,7 +18,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
18
18
|
* @param featurePart Name of the feature part to load; should be either instrument or aggregate
|
|
19
19
|
* @returns {Promise<InstrumentBase|FeatureBase|null>}
|
|
20
20
|
*/
|
|
21
|
-
function
|
|
21
|
+
function lazyFeatureLoader(featureName, featurePart) {
|
|
22
22
|
if (featurePart === 'aggregate') {
|
|
23
23
|
switch (featureName) {
|
|
24
24
|
case _features.FEATURE_NAMES.ajax:
|
|
@@ -33,6 +33,8 @@ function lazyLoader(featureName, featurePart) {
|
|
|
33
33
|
return Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "page_view_event-aggregate" */'../page_view_event/aggregate')));
|
|
34
34
|
case _features.FEATURE_NAMES.pageViewTiming:
|
|
35
35
|
return Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "page_view_timing-aggregate" */'../page_view_timing/aggregate')));
|
|
36
|
+
case _features.FEATURE_NAMES.sessionReplay:
|
|
37
|
+
return Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "session_replay-aggregate" */'../session_replay/aggregate')));
|
|
36
38
|
case _features.FEATURE_NAMES.sessionTrace:
|
|
37
39
|
return Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "session_trace-aggregate" */'../session_trace/aggregate')));
|
|
38
40
|
case _features.FEATURE_NAMES.spa:
|
|
@@ -55,7 +55,7 @@ class Agent {
|
|
|
55
55
|
// Attempt to initialize all the requested features (sequentially in prio order & synchronously), with any failure aborting the whole process.
|
|
56
56
|
try {
|
|
57
57
|
const enabledFeatures = (0, _enabledFeatures.getEnabledFeatures)(this.agentIdentifier);
|
|
58
|
-
const featuresToStart =
|
|
58
|
+
const featuresToStart = [...this.desiredFeatures];
|
|
59
59
|
featuresToStart.sort((a, b) => _features.featurePriority[a.featureName] - _features.featurePriority[b.featureName]);
|
|
60
60
|
featuresToStart.forEach(f => {
|
|
61
61
|
// pageViewEvent must be enabled because RUM calls are not optional. See comment in constructor and PR 428.
|
|
@@ -82,7 +82,9 @@ function setAPI(agentIdentifier) {
|
|
|
82
82
|
url += 'dc=' + ~~dom_time + '&';
|
|
83
83
|
url += 'fe=' + ~~fe_time + '&';
|
|
84
84
|
url += 'c=' + cycle;
|
|
85
|
-
_submitData.submitData.img(
|
|
85
|
+
_submitData.submitData.img({
|
|
86
|
+
url
|
|
87
|
+
});
|
|
86
88
|
}
|
|
87
89
|
function setErrorHandler(t, handler) {
|
|
88
90
|
(0, _config.getRuntime)(agentIdentifier).onerror = handler;
|
|
@@ -28,15 +28,15 @@ function configure(agentIdentifier) {
|
|
|
28
28
|
info = nr.info;
|
|
29
29
|
loader_config = nr.loader_config;
|
|
30
30
|
}
|
|
31
|
+
(0, _config.setConfiguration)(agentIdentifier, init || {});
|
|
32
|
+
(0, _config.setLoaderConfig)(agentIdentifier, loader_config || {});
|
|
33
|
+
(0, _config.setRuntime)(agentIdentifier, runtime);
|
|
31
34
|
info.jsAttributes ??= {};
|
|
32
35
|
if (_globalScope.isWorkerScope) {
|
|
33
36
|
// add a default attr to all worker payloads
|
|
34
37
|
info.jsAttributes.isWorker = true;
|
|
35
38
|
}
|
|
36
39
|
(0, _config.setInfo)(agentIdentifier, info);
|
|
37
|
-
(0, _config.setConfiguration)(agentIdentifier, init || {});
|
|
38
|
-
(0, _config.setLoaderConfig)(agentIdentifier, loader_config || {});
|
|
39
|
-
(0, _config.setRuntime)(agentIdentifier, runtime);
|
|
40
40
|
(0, _api.setTopLevelCallers)();
|
|
41
41
|
const api = (0, _api.setAPI)(agentIdentifier, forceDrain);
|
|
42
42
|
(0, _nreum.gosNREUMInitializedAgents)(agentIdentifier, api, 'api');
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getFeatureDependencyNames = getFeatureDependencyNames;
|
|
7
|
-
exports.getFrozenAttributes = getFrozenAttributes;
|
|
8
7
|
var _features = require("./features");
|
|
9
8
|
function getFeatureDependencyNames(feature) {
|
|
10
9
|
switch (feature) {
|
|
@@ -18,15 +17,4 @@ function getFeatureDependencyNames(feature) {
|
|
|
18
17
|
default:
|
|
19
18
|
return [];
|
|
20
19
|
}
|
|
21
|
-
}
|
|
22
|
-
function getFrozenAttributes(feature) {
|
|
23
|
-
switch (feature) {
|
|
24
|
-
// right now, jserrors is the only feature that can have "on" or "off" page-level auto-instrumentation...
|
|
25
|
-
// page_action is always "off" (no instr)
|
|
26
|
-
// as new API/manual implementation methods are added, this list can likely be pruned
|
|
27
|
-
case _features.FEATURE_NAMES.jserrors:
|
|
28
|
-
return [];
|
|
29
|
-
default:
|
|
30
|
-
return ['auto'];
|
|
31
|
-
}
|
|
32
20
|
}
|
|
@@ -11,6 +11,7 @@ const FEATURE_NAMES = {
|
|
|
11
11
|
pageAction: 'page_action',
|
|
12
12
|
pageViewEvent: 'page_view_event',
|
|
13
13
|
pageViewTiming: 'page_view_timing',
|
|
14
|
+
sessionReplay: 'session_replay',
|
|
14
15
|
sessionTrace: 'session_trace',
|
|
15
16
|
spa: 'spa'
|
|
16
17
|
};
|
|
@@ -28,6 +29,7 @@ const featurePriority = {
|
|
|
28
29
|
[FEATURE_NAMES.ajax]: 5,
|
|
29
30
|
[FEATURE_NAMES.sessionTrace]: 6,
|
|
30
31
|
[FEATURE_NAMES.pageAction]: 7,
|
|
31
|
-
[FEATURE_NAMES.spa]: 8
|
|
32
|
+
[FEATURE_NAMES.spa]: 8,
|
|
33
|
+
[FEATURE_NAMES.sessionReplay]: 9
|
|
32
34
|
};
|
|
33
35
|
exports.featurePriority = featurePriority;
|
|
@@ -58,11 +58,11 @@ class MicroAgent {
|
|
|
58
58
|
autoFeatures.forEach(f => {
|
|
59
59
|
if (enabledFeatures[f]) {
|
|
60
60
|
// TODO - THIS does not work, the instrument switch in lazy loader increases the size of the worker build. Needs to be revisited
|
|
61
|
-
Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-loader" */'../features/utils/lazy-loader'))).then(_ref => {
|
|
61
|
+
Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-feature-loader" */'../features/utils/lazy-feature-loader'))).then(_ref => {
|
|
62
62
|
let {
|
|
63
|
-
|
|
63
|
+
lazyFeatureLoader
|
|
64
64
|
} = _ref;
|
|
65
|
-
return
|
|
65
|
+
return lazyFeatureLoader(f, 'instrument');
|
|
66
66
|
}).then(_ref2 => {
|
|
67
67
|
let {
|
|
68
68
|
Instrument
|
|
@@ -75,11 +75,11 @@ class MicroAgent {
|
|
|
75
75
|
if (enabledFeatures[f]) {
|
|
76
76
|
// TODO - THIS does not work, the instrument switch in lazy loader increases the size of the worker build. Needs to be revisited
|
|
77
77
|
// Parts of the lazy-loader were removed because webpack was transpiling them into the worker build, errantly inflating the build size.
|
|
78
|
-
Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-loader" */'../features/utils/lazy-loader'))).then(_ref3 => {
|
|
78
|
+
Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-feature-loader" */'../features/utils/lazy-feature-loader'))).then(_ref3 => {
|
|
79
79
|
let {
|
|
80
|
-
|
|
80
|
+
lazyFeatureLoader
|
|
81
81
|
} = _ref3;
|
|
82
|
-
return
|
|
82
|
+
return lazyFeatureLoader(f, 'aggregate');
|
|
83
83
|
}).then(_ref4 => {
|
|
84
84
|
let {
|
|
85
85
|
Aggregate
|
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
import 'core-js/stable/promise';
|
|
7
7
|
import 'core-js/stable/array/includes';
|
|
8
|
-
import 'core-js/stable/array/from';
|
|
9
8
|
import 'core-js/stable/array/find';
|
|
9
|
+
import 'core-js/stable/array/flat';
|
|
10
|
+
import 'core-js/stable/array/flat-map';
|
|
11
|
+
import 'core-js/stable/array/from';
|
|
10
12
|
import 'core-js/stable/array/some';
|
|
11
13
|
import 'core-js/stable/object/assign';
|
|
12
14
|
import 'core-js/stable/object/entries';
|
|
@@ -14,4 +16,5 @@ import 'core-js/stable/object/values';
|
|
|
14
16
|
import 'core-js/stable/map';
|
|
15
17
|
import 'core-js/stable/reflect';
|
|
16
18
|
import 'core-js/stable/set';
|
|
17
|
-
import 'core-js/stable/weak-set';
|
|
19
|
+
import 'core-js/stable/weak-set';
|
|
20
|
+
import 'core-js/stable/object/get-own-property-descriptors';
|
|
@@ -1,31 +1,21 @@
|
|
|
1
|
-
import { getFrozenAttributes } from '../../../loaders/features/featureDependencies';
|
|
2
1
|
import { warn } from '../../util/console';
|
|
3
|
-
export
|
|
4
|
-
constructor(obj, model) {
|
|
5
|
-
Object.assign(this, setValues(obj, model));
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
function setValues(obj, model) {
|
|
9
|
-
const state = {};
|
|
2
|
+
export function getModeledObject(obj, model) {
|
|
10
3
|
try {
|
|
11
|
-
if (!obj || typeof obj !== 'object') return warn('
|
|
4
|
+
if (!obj || typeof obj !== 'object') return warn('Setting a Configurable requires an object as input');
|
|
12
5
|
if (!model || typeof model !== 'object') return warn('Setting a Configurable requires a model to set its initial properties');
|
|
13
|
-
|
|
14
|
-
Object.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
});
|
|
6
|
+
// allow getters and setters to pass from model to target
|
|
7
|
+
const output = Object.create(Object.getPrototypeOf(model), Object.getOwnPropertyDescriptors(model));
|
|
8
|
+
const target = Object.keys(output).length === 0 ? obj : output;
|
|
9
|
+
for (let key in target) {
|
|
10
|
+
if (obj[key] !== undefined) {
|
|
11
|
+
try {
|
|
12
|
+
if (typeof obj[key] === 'object' && typeof model[key] === 'object') output[key] = getModeledObject(obj[key], model[key]);else output[key] = obj[key];
|
|
13
|
+
} catch (e) {
|
|
14
|
+
warn('An error occurred while setting a property of a Configurable', e);
|
|
15
|
+
}
|
|
25
16
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return state;
|
|
17
|
+
}
|
|
18
|
+
return output;
|
|
29
19
|
} catch (err) {
|
|
30
20
|
warn('An error occured while setting a Configurable', err);
|
|
31
21
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defaults as nrDefaults, gosNREUMInitializedAgents } from '../../window/nreum';
|
|
2
|
-
import {
|
|
2
|
+
import { getModeledObject } from './configurable';
|
|
3
3
|
const model = {
|
|
4
4
|
// preset defaults
|
|
5
5
|
beacon: nrDefaults.beacon,
|
|
@@ -37,6 +37,6 @@ export function getInfo(id) {
|
|
|
37
37
|
}
|
|
38
38
|
export function setInfo(id, obj) {
|
|
39
39
|
if (!id) throw new Error('All info objects require an agent identifier!');
|
|
40
|
-
_cache[id] =
|
|
40
|
+
_cache[id] = getModeledObject(obj, model);
|
|
41
41
|
gosNREUMInitializedAgents(id, _cache[id], 'info');
|
|
42
42
|
}
|