@grafana/faro-core 1.0.5 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.browserslistrc +1 -0
- package/README.md +43 -0
- package/dist/bundle/faro-core.iife.js +1 -1
- package/dist/cjs/api/exceptions/initialize.js +3 -1
- package/dist/cjs/api/exceptions/initialize.js.map +1 -1
- package/dist/cjs/api/exceptions/types.js.map +1 -1
- package/dist/cjs/api/logs/types.js.map +1 -1
- package/dist/cjs/config/const.js +6 -1
- package/dist/cjs/config/const.js.map +1 -1
- package/dist/cjs/config/index.js +2 -1
- package/dist/cjs/config/index.js.map +1 -1
- package/dist/cjs/config/types.js.map +1 -1
- package/dist/cjs/globalObject/globalObject.js +7 -1
- package/dist/cjs/globalObject/globalObject.js.map +1 -1
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/testUtils/mockConfig.js +2 -0
- package/dist/cjs/testUtils/mockConfig.js.map +1 -1
- package/dist/cjs/testUtils/mockTransport.js +4 -3
- package/dist/cjs/testUtils/mockTransport.js.map +1 -1
- package/dist/cjs/transports/base.js +3 -0
- package/dist/cjs/transports/base.js.map +1 -1
- package/dist/cjs/transports/batchExecutor.js +83 -0
- package/dist/cjs/transports/batchExecutor.js.map +1 -0
- package/dist/cjs/transports/const.js.map +1 -1
- package/dist/cjs/transports/index.js.map +1 -1
- package/dist/cjs/transports/initialize.js +69 -14
- package/dist/cjs/transports/initialize.js.map +1 -1
- package/dist/cjs/transports/types.js.map +1 -1
- package/dist/cjs/transports/utils.js +65 -6
- package/dist/cjs/transports/utils.js.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/version.js.map +1 -1
- package/dist/esm/api/exceptions/initialize.js +3 -1
- package/dist/esm/api/exceptions/initialize.js.map +1 -1
- package/dist/esm/api/exceptions/types.js.map +1 -1
- package/dist/esm/api/logs/types.js.map +1 -1
- package/dist/esm/config/const.js +5 -0
- package/dist/esm/config/const.js.map +1 -1
- package/dist/esm/config/index.js +1 -1
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/config/types.js.map +1 -1
- package/dist/esm/globalObject/globalObject.js +7 -1
- package/dist/esm/globalObject/globalObject.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/testUtils/mockConfig.js +2 -0
- package/dist/esm/testUtils/mockConfig.js.map +1 -1
- package/dist/esm/testUtils/mockTransport.js +4 -3
- package/dist/esm/testUtils/mockTransport.js.map +1 -1
- package/dist/esm/transports/base.js +3 -0
- package/dist/esm/transports/base.js.map +1 -1
- package/dist/esm/transports/batchExecutor.js +67 -0
- package/dist/esm/transports/batchExecutor.js.map +1 -0
- package/dist/esm/transports/const.js.map +1 -1
- package/dist/esm/transports/index.js.map +1 -1
- package/dist/esm/transports/initialize.js +66 -12
- package/dist/esm/transports/initialize.js.map +1 -1
- package/dist/esm/transports/types.js.map +1 -1
- package/dist/esm/transports/utils.js +41 -3
- package/dist/esm/transports/utils.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/spec/core/src/api/exceptions/initialize.js +3 -1
- package/dist/spec/core/src/api/exceptions/initialize.js.map +1 -1
- package/dist/spec/core/src/api/exceptions/initialize.test.js +13 -0
- package/dist/spec/core/src/api/exceptions/initialize.test.js.map +1 -1
- package/dist/spec/core/src/api/exceptions/types.js.map +1 -1
- package/dist/spec/core/src/api/logs/initialize.test.js +1 -1
- package/dist/spec/core/src/api/logs/initialize.test.js.map +1 -1
- package/dist/spec/core/src/api/logs/types.js.map +1 -1
- package/dist/spec/core/src/config/const.js +6 -1
- package/dist/spec/core/src/config/const.js.map +1 -1
- package/dist/spec/core/src/config/index.js +2 -1
- package/dist/spec/core/src/config/index.js.map +1 -1
- package/dist/spec/core/src/config/types.js.map +1 -1
- package/dist/spec/core/src/globalObject/globalObject.js +7 -1
- package/dist/spec/core/src/globalObject/globalObject.js.map +1 -1
- package/dist/spec/core/src/index.js +3 -2
- package/dist/spec/core/src/index.js.map +1 -1
- package/dist/spec/core/src/testUtils/mockConfig.js +2 -0
- package/dist/spec/core/src/testUtils/mockConfig.js.map +1 -1
- package/dist/spec/core/src/testUtils/mockTransport.js +4 -3
- package/dist/spec/core/src/testUtils/mockTransport.js.map +1 -1
- package/dist/spec/core/src/transports/base.js +3 -0
- package/dist/spec/core/src/transports/base.js.map +1 -1
- package/dist/spec/core/src/transports/batchExecutor.js +83 -0
- package/dist/spec/core/src/transports/batchExecutor.js.map +1 -0
- package/dist/spec/core/src/transports/batchExecutor.test.js +179 -0
- package/dist/spec/core/src/transports/batchExecutor.test.js.map +1 -0
- package/dist/spec/core/src/transports/const.js.map +1 -1
- package/dist/spec/core/src/transports/index.js.map +1 -1
- package/dist/spec/core/src/transports/initialize.js +69 -14
- package/dist/spec/core/src/transports/initialize.js.map +1 -1
- package/dist/spec/core/src/transports/transports.test.js +68 -3
- package/dist/spec/core/src/transports/transports.test.js.map +1 -1
- package/dist/spec/core/src/transports/types.js.map +1 -1
- package/dist/spec/core/src/transports/utils.js +65 -6
- package/dist/spec/core/src/transports/utils.js.map +1 -1
- package/dist/spec/core/src/transports/utils.test.js +216 -0
- package/dist/spec/core/src/transports/utils.test.js.map +1 -0
- package/dist/spec/core/src/version.js +1 -1
- package/dist/spec/core/src/version.js.map +1 -1
- package/dist/types/api/exceptions/types.d.ts +3 -0
- package/dist/types/api/logs/types.d.ts +2 -2
- package/dist/types/config/const.d.ts +5 -0
- package/dist/types/config/index.d.ts +1 -1
- package/dist/types/config/types.d.ts +3 -2
- package/dist/types/core/src/api/exceptions/types.d.ts +3 -0
- package/dist/types/core/src/api/logs/types.d.ts +2 -2
- package/dist/types/core/src/config/const.d.ts +5 -0
- package/dist/types/core/src/config/index.d.ts +1 -1
- package/dist/types/core/src/config/types.d.ts +3 -2
- package/dist/types/core/src/globalObject/globalObject.d.ts +1 -1
- package/dist/types/core/src/index.d.ts +2 -2
- package/dist/types/core/src/testUtils/mockTransport.d.ts +3 -2
- package/dist/types/core/src/transports/base.d.ts +2 -1
- package/dist/types/core/src/transports/batchExecutor.d.ts +16 -0
- package/dist/types/core/src/transports/batchExecutor.test.d.ts +1 -0
- package/dist/types/core/src/transports/const.d.ts +2 -1
- package/dist/types/core/src/transports/index.d.ts +1 -1
- package/dist/types/core/src/transports/types.d.ts +9 -0
- package/dist/types/core/src/transports/utils.d.ts +4 -1
- package/dist/types/core/src/transports/utils.test.d.ts +1 -0
- package/dist/types/core/src/version.d.ts +1 -1
- package/dist/types/globalObject/globalObject.d.ts +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/testUtils/mockTransport.d.ts +3 -2
- package/dist/types/transports/base.d.ts +2 -1
- package/dist/types/transports/batchExecutor.d.ts +16 -0
- package/dist/types/transports/const.d.ts +2 -1
- package/dist/types/transports/index.d.ts +1 -1
- package/dist/types/transports/types.d.ts +9 -0
- package/dist/types/transports/utils.d.ts +4 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +8 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockConfig.js","sourceRoot":"","sources":["../../../../../src/testUtils/mockConfig.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,oDAA+D;AAE/D,+DAA8D;AAE9D,SAAgB,UAAU,CAAC,SAA+B;IAA/B,0BAAA,EAAA,cAA+B;IACxD,kBACE,GAAG,EAAE;YACH,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO;SACjB,EACD,MAAM,EAAE,IAAI,EACZ,eAAe,EAAE,MAAM,EACvB,mBAAmB,EAAE,2CAA0B,EAC/C,gBAAgB,EAAE,EAAE,EACpB,OAAO,EAAE,IAAI,EACb,KAAK,EAAE,EAAE,EACT,eAAe,EAAE,2CAAoB,EACrC,MAAM,EAAE,KAAK,EACb,qBAAqB,EAAE,IAAI,EAC3B,UAAU,EAAE,EAAE,EACd,gBAAgB,EAAE,OAAO,IACtB,SAAS,EACZ;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"mockConfig.js","sourceRoot":"","sources":["../../../../../src/testUtils/mockConfig.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,oDAA+D;AAE/D,+DAA8D;AAE9D,SAAgB,UAAU,CAAC,SAA+B;IAA/B,0BAAA,EAAA,cAA+B;IACxD,kBACE,GAAG,EAAE;YACH,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO;SACjB,EACD,QAAQ,EAAE;YACR,OAAO,EAAE,KAAK;SACf,EACD,MAAM,EAAE,IAAI,EACZ,eAAe,EAAE,MAAM,EACvB,mBAAmB,EAAE,2CAA0B,EAC/C,gBAAgB,EAAE,EAAE,EACpB,OAAO,EAAE,IAAI,EACb,KAAK,EAAE,EAAE,EACT,eAAe,EAAE,2CAAoB,EACrC,MAAM,EAAE,KAAK,EACb,qBAAqB,EAAE,IAAI,EAC3B,UAAU,EAAE,EAAE,EACd,gBAAgB,EAAE,OAAO,IACtB,SAAS,EACZ;AACJ,CAAC;AAtBD,gCAsBC","sourcesContent":["import type { Config } from '../config';\nimport { defaultInternalLoggerLevel } from '../internalLogger';\n\nimport { mockStacktraceParser } from './mockStacktraceParser';\n\nexport function mockConfig(overrides: Partial<Config> = {}): Config {\n return {\n app: {\n name: 'test',\n version: '1.0.0',\n },\n batching: {\n enabled: false,\n },\n dedupe: true,\n globalObjectKey: 'faro',\n internalLoggerLevel: defaultInternalLoggerLevel,\n instrumentations: [],\n isolate: true,\n metas: [],\n parseStacktrace: mockStacktraceParser,\n paused: false,\n preventGlobalExposure: true,\n transports: [],\n unpatchedConsole: console,\n ...overrides,\n };\n}\n"]}
|
|
@@ -17,7 +17,6 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.MockTransport = void 0;
|
|
19
19
|
var transports_1 = require("../transports");
|
|
20
|
-
var utils_1 = require("../utils");
|
|
21
20
|
var version_1 = require("../version");
|
|
22
21
|
var MockTransport = /** @class */ (function (_super) {
|
|
23
22
|
__extends(MockTransport, _super);
|
|
@@ -30,11 +29,13 @@ var MockTransport = /** @class */ (function (_super) {
|
|
|
30
29
|
_this.items = [];
|
|
31
30
|
return _this;
|
|
32
31
|
}
|
|
33
|
-
MockTransport.prototype.send = function (
|
|
32
|
+
MockTransport.prototype.send = function (items) {
|
|
34
33
|
var _a;
|
|
35
|
-
var items = (0, utils_1.isArray)(item) ? item : [item];
|
|
36
34
|
(_a = this.items).push.apply(_a, items);
|
|
37
35
|
};
|
|
36
|
+
MockTransport.prototype.isBatched = function () {
|
|
37
|
+
return true;
|
|
38
|
+
};
|
|
38
39
|
MockTransport.prototype.getIgnoreUrls = function () {
|
|
39
40
|
return this.ignoreURLs;
|
|
40
41
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockTransport.js","sourceRoot":"","sources":["../../../../../src/testUtils/mockTransport.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,4CAA8C;AAE9C,
|
|
1
|
+
{"version":3,"file":"mockTransport.js","sourceRoot":"","sources":["../../../../../src/testUtils/mockTransport.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,4CAA8C;AAE9C,sCAAqC;AAErC;IAAmC,iCAAa;IAM9C,uBAAoB,UAAyB;QAAzB,2BAAA,EAAA,eAAyB;QAA7C,YACE,iBAAO,SACR;QAFmB,gBAAU,GAAV,UAAU,CAAe;QALpC,UAAI,GAAG,yBAAyB,CAAC;QACjC,aAAO,GAAG,iBAAO,CAAC;QAE3B,WAAK,GAAoB,EAAE,CAAC;;IAI5B,CAAC;IAED,4BAAI,GAAJ,UAAK,KAAsB;;QACzB,CAAA,KAAA,IAAI,CAAC,KAAK,CAAA,CAAC,IAAI,WAAI,KAAK,EAAE;IAC5B,CAAC;IAEQ,iCAAS,GAAlB;QACE,OAAO,IAAI,CAAC;IACd,CAAC;IAEQ,qCAAa,GAAtB;QACE,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACH,oBAAC;AAAD,CAAC,AArBD,CAAmC,0BAAa,GAqB/C;AArBY,sCAAa","sourcesContent":["import type { Patterns } from '../config';\nimport { BaseTransport } from '../transports';\nimport type { Transport, TransportItem } from '../transports';\nimport { VERSION } from '../version';\n\nexport class MockTransport extends BaseTransport implements Transport {\n readonly name = '@grafana/transport-mock';\n readonly version = VERSION;\n\n items: TransportItem[] = [];\n\n constructor(private ignoreURLs: Patterns = []) {\n super();\n }\n\n send(items: TransportItem[]): void | Promise<void> {\n this.items.push(...items);\n }\n\n override isBatched(): boolean {\n return true;\n }\n\n override getIgnoreUrls(): Patterns {\n return this.ignoreURLs;\n }\n}\n"]}
|
|
@@ -22,6 +22,9 @@ var BaseTransport = /** @class */ (function (_super) {
|
|
|
22
22
|
function BaseTransport() {
|
|
23
23
|
return _super !== null && _super.apply(this, arguments) || this;
|
|
24
24
|
}
|
|
25
|
+
BaseTransport.prototype.isBatched = function () {
|
|
26
|
+
return false;
|
|
27
|
+
};
|
|
25
28
|
BaseTransport.prototype.getIgnoreUrls = function () {
|
|
26
29
|
return [];
|
|
27
30
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../src/transports/base.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,4CAA8C;AAI9C;IAA4C,iCAAa;IAAzD;;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../src/transports/base.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,4CAA8C;AAI9C;IAA4C,iCAAa;IAAzD;;IAUA,CAAC;IAPC,iCAAS,GAAT;QACE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qCAAa,GAAb;QACE,OAAO,EAAE,CAAC;IACZ,CAAC;IACH,oBAAC;AAAD,CAAC,AAVD,CAA4C,0BAAa,GAUxD;AAVqB,sCAAa","sourcesContent":["import { BaseExtension } from '../extensions';\n\nimport type { Transport, TransportItem } from './types';\n\nexport abstract class BaseTransport extends BaseExtension implements Transport {\n abstract send(items: TransportItem | TransportItem[]): void | Promise<void>;\n\n isBatched(): boolean {\n return false;\n }\n\n getIgnoreUrls(): Array<string | RegExp> {\n return [];\n }\n}\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
+
if (ar || !(i in from)) {
|
|
5
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
+
ar[i] = from[i];
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.BatchExecutor = void 0;
|
|
13
|
+
var murmurhash_js_1 = require("murmurhash-js");
|
|
14
|
+
var DEFAULT_SEND_TIMEOUT_MS = 250;
|
|
15
|
+
var DEFAULT_BATCH_ITEM_LIMIT = 50;
|
|
16
|
+
var BatchExecutor = /** @class */ (function () {
|
|
17
|
+
function BatchExecutor(sendFn, options) {
|
|
18
|
+
var _this = this;
|
|
19
|
+
var _a, _b;
|
|
20
|
+
this.signalBuffer = [];
|
|
21
|
+
this.itemLimit = (_a = options === null || options === void 0 ? void 0 : options.itemLimit) !== null && _a !== void 0 ? _a : DEFAULT_BATCH_ITEM_LIMIT;
|
|
22
|
+
this.sendTimeout = (_b = options === null || options === void 0 ? void 0 : options.sendTimeout) !== null && _b !== void 0 ? _b : DEFAULT_SEND_TIMEOUT_MS;
|
|
23
|
+
this.paused = (options === null || options === void 0 ? void 0 : options.paused) || false;
|
|
24
|
+
this.sendFn = sendFn;
|
|
25
|
+
this.flushInterval = -1;
|
|
26
|
+
if (!this.paused) {
|
|
27
|
+
this.start();
|
|
28
|
+
}
|
|
29
|
+
// Send batched/buffered data when user navigates to new page, switches or closes the tab, minimizes or closes the browser.
|
|
30
|
+
// If on mobile, it also sends data if user switches from the browser to a different app.
|
|
31
|
+
document.addEventListener('visibilitychange', function () {
|
|
32
|
+
if (document.visibilityState === 'hidden') {
|
|
33
|
+
_this.flush();
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
BatchExecutor.prototype.addItem = function (item) {
|
|
38
|
+
if (this.paused) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.signalBuffer.push(item);
|
|
42
|
+
if (this.signalBuffer.length >= this.itemLimit) {
|
|
43
|
+
this.flush();
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
BatchExecutor.prototype.start = function () {
|
|
47
|
+
var _this = this;
|
|
48
|
+
this.paused = false;
|
|
49
|
+
if (this.sendTimeout > 0) {
|
|
50
|
+
this.flushInterval = window.setInterval(function () { return _this.flush(); }, this.sendTimeout);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
BatchExecutor.prototype.pause = function () {
|
|
54
|
+
this.paused = true;
|
|
55
|
+
clearInterval(this.flushInterval);
|
|
56
|
+
};
|
|
57
|
+
BatchExecutor.prototype.groupItems = function (items) {
|
|
58
|
+
var itemMap = new Map();
|
|
59
|
+
items.forEach(function (item) {
|
|
60
|
+
var metaKey = (0, murmurhash_js_1.murmur3)(JSON.stringify(item.meta));
|
|
61
|
+
var currentItems = itemMap.get(metaKey);
|
|
62
|
+
if (currentItems === undefined) {
|
|
63
|
+
currentItems = [item];
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
currentItems = __spreadArray(__spreadArray([], currentItems, true), [item], false);
|
|
67
|
+
}
|
|
68
|
+
itemMap.set(metaKey, currentItems);
|
|
69
|
+
});
|
|
70
|
+
return Array.from(itemMap.values());
|
|
71
|
+
};
|
|
72
|
+
BatchExecutor.prototype.flush = function () {
|
|
73
|
+
if (this.paused || this.signalBuffer.length === 0) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
var itemGroups = this.groupItems(this.signalBuffer);
|
|
77
|
+
itemGroups.forEach(this.sendFn);
|
|
78
|
+
this.signalBuffer = [];
|
|
79
|
+
};
|
|
80
|
+
return BatchExecutor;
|
|
81
|
+
}());
|
|
82
|
+
exports.BatchExecutor = BatchExecutor;
|
|
83
|
+
//# sourceMappingURL=batchExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchExecutor.js","sourceRoot":"","sources":["../../../../../src/transports/batchExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["import { murmur3 } from 'murmurhash-js';\n\nimport type { TransportItem } from '../';\n\nimport type { BatchExecutorOptions, SendFn } from './types';\n\nconst DEFAULT_SEND_TIMEOUT_MS = 250;\nconst DEFAULT_BATCH_ITEM_LIMIT = 50;\n\nexport class BatchExecutor {\n private readonly itemLimit: number;\n private readonly sendTimeout: number;\n\n private signalBuffer: TransportItem[] = [];\n private sendFn: SendFn;\n private paused: boolean;\n private flushInterval: number;\n\n constructor(sendFn: SendFn, options?: BatchExecutorOptions) {\n this.itemLimit = options?.itemLimit ?? DEFAULT_BATCH_ITEM_LIMIT;\n this.sendTimeout = options?.sendTimeout ?? DEFAULT_SEND_TIMEOUT_MS;\n this.paused = options?.paused || false;\n this.sendFn = sendFn;\n this.flushInterval = -1;\n\n if (!this.paused) {\n this.start();\n }\n\n // Send batched/buffered data when user navigates to new page, switches or closes the tab, minimizes or closes the browser.\n // If on mobile, it also sends data if user switches from the browser to a different app.\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.flush();\n }\n });\n }\n\n addItem(item: TransportItem): void {\n if (this.paused) {\n return;\n }\n\n this.signalBuffer.push(item);\n\n if (this.signalBuffer.length >= this.itemLimit) {\n this.flush();\n }\n }\n\n start(): void {\n this.paused = false;\n if (this.sendTimeout > 0) {\n this.flushInterval = window.setInterval(() => this.flush(), this.sendTimeout);\n }\n }\n\n pause(): void {\n this.paused = true;\n clearInterval(this.flushInterval);\n }\n\n groupItems(items: TransportItem[]): TransportItem[][] {\n const itemMap = new Map<number, TransportItem[]>();\n items.forEach((item) => {\n const metaKey = murmur3(JSON.stringify(item.meta));\n\n let currentItems = itemMap.get(metaKey);\n if (currentItems === undefined) {\n currentItems = [item];\n } else {\n currentItems = [...currentItems, item];\n }\n\n itemMap.set(metaKey, currentItems);\n });\n return Array.from(itemMap.values());\n }\n\n private flush() {\n if (this.paused || this.signalBuffer.length === 0) {\n return;\n }\n\n const itemGroups = this.groupItems(this.signalBuffer);\n itemGroups.forEach(this.sendFn);\n this.signalBuffer = [];\n }\n}\n"]}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
14
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
15
|
+
if (ar || !(i in from)) {
|
|
16
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
17
|
+
ar[i] = from[i];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
/**
|
|
24
|
+
* @jest-environment jsdom
|
|
25
|
+
*/
|
|
26
|
+
var __1 = require("..");
|
|
27
|
+
var batchExecutor_1 = require("./batchExecutor");
|
|
28
|
+
var generateTransportItem = function (randomMeta) { return ({
|
|
29
|
+
type: __1.TransportItemType.LOG,
|
|
30
|
+
payload: {
|
|
31
|
+
context: {},
|
|
32
|
+
level: __1.LogLevel.INFO,
|
|
33
|
+
message: 'hi',
|
|
34
|
+
timestamp: '2023-01-27T09:53:01.035Z',
|
|
35
|
+
},
|
|
36
|
+
meta: {
|
|
37
|
+
sdk: {
|
|
38
|
+
name: randomMeta ? (Math.random() + 1).toString(36).substring(7) : 'test-sdk',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
}); };
|
|
42
|
+
describe('BatchExecutor', function () {
|
|
43
|
+
it('tests instantiating BatchExecutor class', function () {
|
|
44
|
+
var sendSpy = jest.fn();
|
|
45
|
+
var be = new batchExecutor_1.BatchExecutor(sendSpy);
|
|
46
|
+
expect(be).toBeInstanceOf(batchExecutor_1.BatchExecutor);
|
|
47
|
+
});
|
|
48
|
+
describe('config options', function () {
|
|
49
|
+
afterEach(function () {
|
|
50
|
+
jest.restoreAllMocks();
|
|
51
|
+
});
|
|
52
|
+
beforeAll(function () {
|
|
53
|
+
jest.useFakeTimers();
|
|
54
|
+
});
|
|
55
|
+
it('tests send when exceeding batch size', function () {
|
|
56
|
+
var mockSendFunction = jest.fn();
|
|
57
|
+
var item = generateTransportItem();
|
|
58
|
+
var be = new batchExecutor_1.BatchExecutor(mockSendFunction, {
|
|
59
|
+
sendTimeout: 1,
|
|
60
|
+
itemLimit: 2,
|
|
61
|
+
});
|
|
62
|
+
be.addItem(item);
|
|
63
|
+
expect(mockSendFunction).not.toBeCalled();
|
|
64
|
+
be.addItem(item);
|
|
65
|
+
expect(mockSendFunction).toBeCalledTimes(1);
|
|
66
|
+
});
|
|
67
|
+
it('tests send with empty buffer', function () {
|
|
68
|
+
var mockSendFunction = jest.fn();
|
|
69
|
+
new batchExecutor_1.BatchExecutor(mockSendFunction, {
|
|
70
|
+
sendTimeout: 1,
|
|
71
|
+
});
|
|
72
|
+
jest.advanceTimersByTime(2);
|
|
73
|
+
expect(mockSendFunction).not.toBeCalled();
|
|
74
|
+
});
|
|
75
|
+
it('tests send when "visibilitychange" event is emitted and visibilityState changes', function () {
|
|
76
|
+
var mockSendFunction = jest.fn();
|
|
77
|
+
var item = generateTransportItem();
|
|
78
|
+
var be = new batchExecutor_1.BatchExecutor(mockSendFunction, {
|
|
79
|
+
sendTimeout: 1,
|
|
80
|
+
});
|
|
81
|
+
be.addItem(item);
|
|
82
|
+
Object.defineProperty(document, 'visibilityState', {
|
|
83
|
+
configurable: true,
|
|
84
|
+
get: function () {
|
|
85
|
+
return 'hidden';
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
document.dispatchEvent(new Event('visibilitychange'));
|
|
89
|
+
expect(mockSendFunction).toBeCalledTimes(1);
|
|
90
|
+
});
|
|
91
|
+
it('tests send when "visibilitychange" event is emitted and visibilityState changes to visible', function () {
|
|
92
|
+
var mockSendFunction = jest.fn();
|
|
93
|
+
var item = generateTransportItem();
|
|
94
|
+
var be = new batchExecutor_1.BatchExecutor(mockSendFunction, {
|
|
95
|
+
sendTimeout: 1,
|
|
96
|
+
});
|
|
97
|
+
be.addItem(item);
|
|
98
|
+
Object.defineProperty(document, 'visibilityState', {
|
|
99
|
+
configurable: true,
|
|
100
|
+
get: function () {
|
|
101
|
+
return 'visible';
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
document.dispatchEvent(new Event('visibilitychange'));
|
|
105
|
+
expect(mockSendFunction).toBeCalledTimes(0);
|
|
106
|
+
});
|
|
107
|
+
it('tests send when starting paused', function () {
|
|
108
|
+
var mockSendFunction = jest.fn();
|
|
109
|
+
var item = generateTransportItem();
|
|
110
|
+
var be = new batchExecutor_1.BatchExecutor(mockSendFunction, {
|
|
111
|
+
sendTimeout: 1,
|
|
112
|
+
paused: true,
|
|
113
|
+
});
|
|
114
|
+
be.addItem(item);
|
|
115
|
+
jest.advanceTimersByTime(2);
|
|
116
|
+
expect(mockSendFunction).not.toBeCalled();
|
|
117
|
+
});
|
|
118
|
+
it('tests send when paused', function () {
|
|
119
|
+
var mockSendFunction = jest.fn();
|
|
120
|
+
var item = generateTransportItem();
|
|
121
|
+
var be = new batchExecutor_1.BatchExecutor(mockSendFunction, {
|
|
122
|
+
sendTimeout: 1,
|
|
123
|
+
});
|
|
124
|
+
be.addItem(item);
|
|
125
|
+
be.pause();
|
|
126
|
+
jest.advanceTimersByTime(2);
|
|
127
|
+
expect(mockSendFunction).not.toBeCalled();
|
|
128
|
+
});
|
|
129
|
+
it('tests send when unpaused', function () {
|
|
130
|
+
var mockSendFunction = jest.fn();
|
|
131
|
+
var item = generateTransportItem();
|
|
132
|
+
var be = new batchExecutor_1.BatchExecutor(mockSendFunction, {
|
|
133
|
+
sendTimeout: 1,
|
|
134
|
+
});
|
|
135
|
+
be.addItem(item);
|
|
136
|
+
be.pause();
|
|
137
|
+
jest.advanceTimersByTime(2);
|
|
138
|
+
be.start();
|
|
139
|
+
expect(mockSendFunction).not.toBeCalled();
|
|
140
|
+
jest.advanceTimersByTime(2);
|
|
141
|
+
expect(mockSendFunction).toBeCalledTimes(1);
|
|
142
|
+
});
|
|
143
|
+
it('tests groupItems', function () {
|
|
144
|
+
var be = new batchExecutor_1.BatchExecutor(function () { }, {
|
|
145
|
+
sendTimeout: 1,
|
|
146
|
+
});
|
|
147
|
+
var itemsWithSameMeta = __spreadArray([], Array(3), true).map(function () { return generateTransportItem(false); });
|
|
148
|
+
var itemsWithRandomMeta = __spreadArray([], Array(5), true).map(function () { return generateTransportItem(true); });
|
|
149
|
+
var groups = be.groupItems(__spreadArray(__spreadArray([], itemsWithSameMeta, true), itemsWithRandomMeta, true));
|
|
150
|
+
expect(groups).toHaveLength(itemsWithRandomMeta.length + 1);
|
|
151
|
+
});
|
|
152
|
+
it('tests grouping', function () {
|
|
153
|
+
var mockSendFunction = jest.fn();
|
|
154
|
+
var be = new batchExecutor_1.BatchExecutor(mockSendFunction, {
|
|
155
|
+
sendTimeout: 1,
|
|
156
|
+
});
|
|
157
|
+
be.start();
|
|
158
|
+
var item = generateTransportItem();
|
|
159
|
+
be.addItem(__assign(__assign({}, item), { meta: {
|
|
160
|
+
sdk: {
|
|
161
|
+
name: 'foo',
|
|
162
|
+
},
|
|
163
|
+
} }));
|
|
164
|
+
be.addItem(__assign(__assign({}, item), { meta: {
|
|
165
|
+
sdk: {
|
|
166
|
+
name: 'foo',
|
|
167
|
+
},
|
|
168
|
+
} }));
|
|
169
|
+
be.addItem(__assign(__assign({}, item), { meta: {
|
|
170
|
+
sdk: {
|
|
171
|
+
name: 'bar',
|
|
172
|
+
},
|
|
173
|
+
} }));
|
|
174
|
+
jest.advanceTimersByTime(2);
|
|
175
|
+
expect(mockSendFunction).toBeCalledTimes(2);
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
//# sourceMappingURL=batchExecutor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchExecutor.test.js","sourceRoot":"","sources":["../../../../../src/transports/batchExecutor.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @jest-environment jsdom\n */\nimport { LogEvent, LogLevel, TransportItem, TransportItemType } from '..';\n\nimport { BatchExecutor } from './batchExecutor';\n\nconst generateTransportItem = (randomMeta?: boolean): TransportItem<LogEvent> => ({\n type: TransportItemType.LOG,\n payload: {\n context: {},\n level: LogLevel.INFO,\n message: 'hi',\n timestamp: '2023-01-27T09:53:01.035Z',\n },\n meta: {\n sdk: {\n name: randomMeta ? (Math.random() + 1).toString(36).substring(7) : 'test-sdk',\n },\n },\n});\n\ndescribe('BatchExecutor', () => {\n it('tests instantiating BatchExecutor class', () => {\n const sendSpy = jest.fn();\n const be = new BatchExecutor(sendSpy);\n expect(be).toBeInstanceOf(BatchExecutor);\n });\n\n describe('config options', () => {\n afterEach(() => {\n jest.restoreAllMocks();\n });\n\n beforeAll(() => {\n jest.useFakeTimers();\n });\n\n it('tests send when exceeding batch size', () => {\n const mockSendFunction = jest.fn();\n const item = generateTransportItem();\n const be = new BatchExecutor(mockSendFunction, {\n sendTimeout: 1,\n itemLimit: 2,\n });\n\n be.addItem(item);\n expect(mockSendFunction).not.toBeCalled();\n\n be.addItem(item);\n expect(mockSendFunction).toBeCalledTimes(1);\n });\n\n it('tests send with empty buffer', () => {\n const mockSendFunction = jest.fn();\n new BatchExecutor(mockSendFunction, {\n sendTimeout: 1,\n });\n\n jest.advanceTimersByTime(2);\n expect(mockSendFunction).not.toBeCalled();\n });\n\n it('tests send when \"visibilitychange\" event is emitted and visibilityState changes', () => {\n const mockSendFunction = jest.fn();\n const item = generateTransportItem();\n const be = new BatchExecutor(mockSendFunction, {\n sendTimeout: 1,\n });\n\n be.addItem(item);\n Object.defineProperty(document, 'visibilityState', {\n configurable: true,\n get() {\n return 'hidden';\n },\n });\n document.dispatchEvent(new Event('visibilitychange'));\n expect(mockSendFunction).toBeCalledTimes(1);\n });\n\n it('tests send when \"visibilitychange\" event is emitted and visibilityState changes to visible', () => {\n const mockSendFunction = jest.fn();\n const item = generateTransportItem();\n const be = new BatchExecutor(mockSendFunction, {\n sendTimeout: 1,\n });\n\n be.addItem(item);\n Object.defineProperty(document, 'visibilityState', {\n configurable: true,\n get() {\n return 'visible';\n },\n });\n document.dispatchEvent(new Event('visibilitychange'));\n expect(mockSendFunction).toBeCalledTimes(0);\n });\n\n it('tests send when starting paused', () => {\n const mockSendFunction = jest.fn();\n const item = generateTransportItem();\n const be = new BatchExecutor(mockSendFunction, {\n sendTimeout: 1,\n paused: true,\n });\n\n be.addItem(item);\n jest.advanceTimersByTime(2);\n\n expect(mockSendFunction).not.toBeCalled();\n });\n\n it('tests send when paused', () => {\n const mockSendFunction = jest.fn();\n const item = generateTransportItem();\n const be = new BatchExecutor(mockSendFunction, {\n sendTimeout: 1,\n });\n\n be.addItem(item);\n be.pause();\n jest.advanceTimersByTime(2);\n\n expect(mockSendFunction).not.toBeCalled();\n });\n\n it('tests send when unpaused', () => {\n const mockSendFunction = jest.fn();\n const item = generateTransportItem();\n const be = new BatchExecutor(mockSendFunction, {\n sendTimeout: 1,\n });\n\n be.addItem(item);\n be.pause();\n jest.advanceTimersByTime(2);\n be.start();\n\n expect(mockSendFunction).not.toBeCalled();\n jest.advanceTimersByTime(2);\n expect(mockSendFunction).toBeCalledTimes(1);\n });\n\n it('tests groupItems', () => {\n const be = new BatchExecutor(() => {}, {\n sendTimeout: 1,\n });\n const itemsWithSameMeta = [...Array(3)].map(() => generateTransportItem(false));\n const itemsWithRandomMeta = [...Array(5)].map(() => generateTransportItem(true));\n const groups = be.groupItems([...itemsWithSameMeta, ...itemsWithRandomMeta]);\n expect(groups).toHaveLength(itemsWithRandomMeta.length + 1);\n });\n\n it('tests grouping', () => {\n const mockSendFunction = jest.fn();\n const be = new BatchExecutor(mockSendFunction, {\n sendTimeout: 1,\n });\n be.start();\n const item = generateTransportItem();\n\n be.addItem({\n ...item,\n meta: {\n sdk: {\n name: 'foo',\n },\n },\n });\n be.addItem({\n ...item,\n meta: {\n sdk: {\n name: 'foo',\n },\n },\n });\n\n be.addItem({\n ...item,\n meta: {\n sdk: {\n name: 'bar',\n },\n },\n });\n\n jest.advanceTimersByTime(2);\n expect(mockSendFunction).toBeCalledTimes(2);\n });\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../src/transports/const.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../src/transports/const.ts"],"names":[],"mappings":";;;;AAEA,IAAY,iBAMX;AAND,WAAY,iBAAiB;IAC3B,4CAAuB,CAAA;IACvB,gCAAW,CAAA;IACX,gDAA2B,CAAA;IAC3B,oCAAe,CAAA;IACf,oCAAe,CAAA;AACjB,CAAC,EANW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAM5B;AAEY,QAAA,0BAA0B,GAAuC,CAAA;IAC5E,GAAC,iBAAiB,CAAC,SAAS,IAAG,YAAY;IAC3C,GAAC,iBAAiB,CAAC,GAAG,IAAG,MAAM;IAC/B,GAAC,iBAAiB,CAAC,WAAW,IAAG,cAAc;IAC/C,GAAC,iBAAiB,CAAC,KAAK,IAAG,QAAQ;IACnC,GAAC,iBAAiB,CAAC,KAAK,IAAG,QAAQ;MAC3B,CAAA,CAAC","sourcesContent":["import type { BodyKey } from './types';\n\nexport enum TransportItemType {\n EXCEPTION = 'exception',\n LOG = 'log',\n MEASUREMENT = 'measurement',\n TRACE = 'trace',\n EVENT = 'event',\n}\n\nexport const transportItemTypeToBodyKey: Record<TransportItemType, BodyKey> = {\n [TransportItemType.EXCEPTION]: 'exceptions',\n [TransportItemType.LOG]: 'logs',\n [TransportItemType.MEASUREMENT]: 'measurements',\n [TransportItemType.TRACE]: 'traces',\n [TransportItemType.EVENT]: 'events',\n} as const;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/transports/index.ts"],"names":[],"mappings":";;;AAAA,2CAAoD;AAA3C,kHAAA,oBAAoB,OAAA;AAE7B,+BAAuC;AAA9B,qGAAA,aAAa,OAAA;AAEtB,iCAAwE;AAA/D,0GAAA,iBAAiB,OAAA;AAAE,mHAAA,0BAA0B,OAAA;AAEtD,qDAA8D;AAArD,4HAAA,yBAAyB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/transports/index.ts"],"names":[],"mappings":";;;AAAA,2CAAoD;AAA3C,kHAAA,oBAAoB,OAAA;AAE7B,+BAAuC;AAA9B,qGAAA,aAAa,OAAA;AAEtB,iCAAwE;AAA/D,0GAAA,iBAAiB,OAAA;AAAE,mHAAA,0BAA0B,OAAA;AAEtD,qDAA8D;AAArD,4HAAA,yBAAyB,OAAA;AAalC,iCAA2C;AAAlC,yGAAA,gBAAgB,OAAA","sourcesContent":["export { initializeTransports } from './initialize';\n\nexport { BaseTransport } from './base';\n\nexport { TransportItemType, transportItemTypeToBodyKey } from './const';\n\nexport { registerInitialTransports } from './registerInitial';\n\nexport type {\n BatchExecutorOptions,\n BeforeSendHook,\n SendFn,\n Transport,\n TransportBody,\n TransportItem,\n TransportItemPayload,\n Transports,\n} from './types';\n\nexport { getTransportBody } from './utils';\n"]}
|
|
@@ -11,6 +11,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.initializeTransports = exports.createBeforeSendHookFromIgnorePatterns = exports.shouldIgnoreEvent = void 0;
|
|
13
13
|
var utils_1 = require("../utils");
|
|
14
|
+
var batchExecutor_1 = require("./batchExecutor");
|
|
14
15
|
var const_1 = require("./const");
|
|
15
16
|
function shouldIgnoreEvent(patterns, msg) {
|
|
16
17
|
return patterns.some(function (pattern) {
|
|
@@ -32,6 +33,7 @@ function createBeforeSendHookFromIgnorePatterns(patterns) {
|
|
|
32
33
|
}
|
|
33
34
|
exports.createBeforeSendHookFromIgnorePatterns = createBeforeSendHookFromIgnorePatterns;
|
|
34
35
|
function initializeTransports(unpatchedConsole, internalLogger, config, metas) {
|
|
36
|
+
var _a;
|
|
35
37
|
internalLogger.debug('Initializing transports');
|
|
36
38
|
var transports = [];
|
|
37
39
|
var paused = config.paused;
|
|
@@ -80,28 +82,80 @@ function initializeTransports(unpatchedConsole, internalLogger, config, metas) {
|
|
|
80
82
|
}
|
|
81
83
|
});
|
|
82
84
|
};
|
|
83
|
-
var
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
var applyBeforeSendHooks = function (items) {
|
|
86
|
+
var filteredItems = items;
|
|
87
|
+
for (var _i = 0, beforeSendHooks_1 = beforeSendHooks; _i < beforeSendHooks_1.length; _i++) {
|
|
88
|
+
var hook = beforeSendHooks_1[_i];
|
|
89
|
+
var modified = filteredItems.map(hook).filter(Boolean);
|
|
90
|
+
if (modified.length === 0) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
filteredItems = modified;
|
|
94
|
+
}
|
|
95
|
+
return filteredItems;
|
|
96
|
+
};
|
|
97
|
+
var batchedSend = function (items) {
|
|
98
|
+
var filteredItems = applyBeforeSendHooks(items);
|
|
99
|
+
if (filteredItems.length === 0) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
for (var _i = 0, transports_1 = transports; _i < transports_1.length; _i++) {
|
|
103
|
+
var transport = transports_1[_i];
|
|
104
|
+
internalLogger.debug("Transporting item using ".concat(transport.name, "\n"), filteredItems);
|
|
105
|
+
if (transport.isBatched()) {
|
|
106
|
+
transport.send(filteredItems);
|
|
93
107
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
var instantSend = function (item) {
|
|
111
|
+
var _a;
|
|
112
|
+
var filteredItem = applyBeforeSendHooks([item])[0];
|
|
113
|
+
if (filteredItem === undefined) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
for (var _i = 0, transports_2 = transports; _i < transports_2.length; _i++) {
|
|
117
|
+
var transport = transports_2[_i];
|
|
118
|
+
internalLogger.debug("Transporting item using ".concat(transport.name, "\n"), filteredItem);
|
|
119
|
+
if (!transport.isBatched()) {
|
|
120
|
+
transport.send(filteredItem);
|
|
98
121
|
}
|
|
122
|
+
else if (!((_a = config.batching) === null || _a === void 0 ? void 0 : _a.enabled)) {
|
|
123
|
+
transport.send([filteredItem]);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
var batchExecutor;
|
|
128
|
+
if ((_a = config.batching) === null || _a === void 0 ? void 0 : _a.enabled) {
|
|
129
|
+
batchExecutor = new batchExecutor_1.BatchExecutor(batchedSend, {
|
|
130
|
+
sendTimeout: config.batching.sendTimeout,
|
|
131
|
+
itemLimit: config.batching.itemLimit,
|
|
132
|
+
paused: paused,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// Send a signal to the appropriate transports
|
|
136
|
+
//
|
|
137
|
+
// 1. If SDK is paused, early return
|
|
138
|
+
// 2. If batching is not enabled send the signal to all transports
|
|
139
|
+
// instantly.
|
|
140
|
+
// 3i. If batching is enabled, enqueue the signal
|
|
141
|
+
// 3ii. Send the signal instantly to all un-batched transports
|
|
142
|
+
var execute = function (item) {
|
|
143
|
+
var _a;
|
|
144
|
+
if (paused) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (!((_a = config.batching) === null || _a === void 0 ? void 0 : _a.enabled)) {
|
|
148
|
+
instantSend(item);
|
|
149
|
+
return;
|
|
99
150
|
}
|
|
151
|
+
batchExecutor === null || batchExecutor === void 0 ? void 0 : batchExecutor.addItem(item);
|
|
152
|
+
instantSend(item);
|
|
100
153
|
};
|
|
101
154
|
var getBeforeSendHooks = function () { return __spreadArray([], beforeSendHooks, true); };
|
|
102
155
|
var isPaused = function () { return paused; };
|
|
103
156
|
var pause = function () {
|
|
104
157
|
internalLogger.debug('Pausing transports');
|
|
158
|
+
batchExecutor === null || batchExecutor === void 0 ? void 0 : batchExecutor.pause();
|
|
105
159
|
paused = true;
|
|
106
160
|
};
|
|
107
161
|
var remove = function () {
|
|
@@ -129,6 +183,7 @@ function initializeTransports(unpatchedConsole, internalLogger, config, metas) {
|
|
|
129
183
|
};
|
|
130
184
|
var unpause = function () {
|
|
131
185
|
internalLogger.debug('Unpausing transports');
|
|
186
|
+
batchExecutor === null || batchExecutor === void 0 ? void 0 : batchExecutor.start();
|
|
132
187
|
paused = false;
|
|
133
188
|
};
|
|
134
189
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../../../../src/transports/initialize.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExceptionEvent } from '../api';\nimport type { Config, Patterns } from '../config';\nimport type { InternalLogger } from '../internalLogger';\nimport type { Metas } from '../metas';\nimport type { UnpatchedConsole } from '../unpatchedConsole';\nimport { isString } from '../utils';\n\nimport { TransportItemType } from './const';\nimport type { BeforeSendHook, Transport, Transports } from './types';\n\nexport function shouldIgnoreEvent(patterns: Patterns, msg: string): boolean {\n return patterns.some((pattern) => {\n return isString(pattern) ? msg.includes(pattern) : !!msg.match(pattern);\n });\n}\n\nexport function createBeforeSendHookFromIgnorePatterns(patterns: Patterns): BeforeSendHook {\n return (item) => {\n if (item.type === TransportItemType.EXCEPTION && item.payload) {\n const evt = item.payload as ExceptionEvent;\n const msg = `${evt.type}: ${evt.value}`;\n\n if (shouldIgnoreEvent(patterns, msg)) {\n return null;\n }\n }\n\n return item;\n };\n}\n\nexport function initializeTransports(\n unpatchedConsole: UnpatchedConsole,\n internalLogger: InternalLogger,\n config: Config,\n metas: Metas\n): Transports {\n internalLogger.debug('Initializing transports');\n\n const transports: Transport[] = [];\n\n let paused = config.paused;\n\n let beforeSendHooks: BeforeSendHook[] = [];\n\n const add: Transports['add'] = (...newTransports) => {\n internalLogger.debug('Adding transports');\n\n newTransports.forEach((newTransport) => {\n internalLogger.debug(`Adding \"${newTransport.name}\" transport`);\n\n const exists = transports.some((existingTransport) => existingTransport === newTransport);\n\n if (exists) {\n internalLogger.warn(`Transport ${newTransport.name} is already added`);\n\n return;\n }\n\n newTransport.unpatchedConsole = unpatchedConsole;\n newTransport.internalLogger = internalLogger;\n newTransport.config = config;\n newTransport.metas = metas;\n\n transports.push(newTransport);\n });\n };\n\n const addBeforeSendHooks: Transports['addBeforeSendHooks'] = (...newBeforeSendHooks) => {\n internalLogger.debug('Adding beforeSendHooks\\n', beforeSendHooks);\n\n newBeforeSendHooks.forEach((beforeSendHook) => {\n if (beforeSendHook) {\n beforeSendHooks.push(beforeSendHook);\n }\n });\n };\n\n const addIgnoreErrorsPatterns: Transports['addIgnoreErrorsPatterns'] = (...ignoreErrorsPatterns) => {\n internalLogger.debug('Adding ignoreErrorsPatterns\\n', ignoreErrorsPatterns);\n\n ignoreErrorsPatterns.forEach((ignoreErrorsPattern) => {\n if (ignoreErrorsPattern) {\n beforeSendHooks.push(createBeforeSendHookFromIgnorePatterns(ignoreErrorsPattern));\n }\n });\n };\n\n const execute: Transports['execute'] = (item) => {\n if (!paused) {\n let actualItem = item;\n\n for (const hook of beforeSendHooks) {\n const modified = hook(actualItem);\n\n if (modified === null) {\n return;\n }\n\n actualItem = modified;\n }\n\n for (const transport of transports) {\n internalLogger.debug(`Transporting item using ${transport.name}\\n`, actualItem);\n\n transport.send(actualItem);\n }\n }\n };\n\n const getBeforeSendHooks: Transports['getBeforeSendHooks'] = () => [...beforeSendHooks];\n\n const isPaused: Transports['isPaused'] = () => paused;\n\n const pause: Transports['pause'] = () => {\n internalLogger.debug('Pausing transports');\n\n paused = true;\n };\n\n const remove: Transports['remove'] = (...transportsToRemove) => {\n internalLogger.debug('Removing transports');\n\n transportsToRemove.forEach((transportToRemove) => {\n internalLogger.debug(`Removing \"${transportToRemove.name}\" transport`);\n\n const existingTransportIndex = transports.indexOf(transportToRemove);\n\n if (existingTransportIndex === -1) {\n internalLogger.warn(`Transport \"${transportToRemove.name}\" is not added`);\n\n return;\n }\n\n transports.splice(existingTransportIndex, 1);\n });\n };\n\n const removeBeforeSendHooks: Transports['removeBeforeSendHooks'] = (...beforeSendHooksToRemove) => {\n beforeSendHooks.filter((beforeSendHook) => !beforeSendHooksToRemove.includes(beforeSendHook));\n };\n\n const unpause: Transports['unpause'] = () => {\n internalLogger.debug('Unpausing transports');\n\n paused = false;\n };\n\n return {\n add,\n addBeforeSendHooks,\n addIgnoreErrorsPatterns,\n getBeforeSendHooks,\n execute,\n isPaused,\n pause,\n remove,\n removeBeforeSendHooks,\n get transports() {\n return [...transports];\n },\n unpause,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../../../../src/transports/initialize.ts"],"names":[],"mappings":";;;;;;;;;;;;AAMA,kCAAoC;AAEpC,iDAAgD;AAChD,iCAA4C;AAG5C,SAAgB,iBAAiB,CAAC,QAAkB,EAAE,GAAW;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAC,OAAO;QAC3B,OAAO,IAAA,gBAAQ,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC;AAJD,8CAIC;AAED,SAAgB,sCAAsC,CAAC,QAAkB;IACvE,OAAO,UAAC,IAAmB;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAiB,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE;YAC7D,IAAM,GAAG,GAAG,IAAI,CAAC,OAAyB,CAAC;YAC3C,IAAM,GAAG,GAAG,UAAG,GAAG,CAAC,IAAI,eAAK,GAAG,CAAC,KAAK,CAAE,CAAC;YAExC,IAAI,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;gBACpC,OAAO,IAAI,CAAC;aACb;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAbD,wFAaC;AAED,SAAgB,oBAAoB,CAClC,gBAAkC,EAClC,cAA8B,EAC9B,MAAc,EACd,KAAY;;IAEZ,cAAc,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEhD,IAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAE3B,IAAI,eAAe,GAAqB,EAAE,CAAC;IAE3C,IAAM,GAAG,GAAsB;QAAC,uBAAgB;aAAhB,UAAgB,EAAhB,qBAAgB,EAAhB,IAAgB;YAAhB,kCAAgB;;QAC9C,cAAc,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAE1C,aAAa,CAAC,OAAO,CAAC,UAAC,YAAY;YACjC,cAAc,CAAC,KAAK,CAAC,mBAAW,YAAY,CAAC,IAAI,iBAAa,CAAC,CAAC;YAEhE,IAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,UAAC,iBAAiB,IAAK,OAAA,iBAAiB,KAAK,YAAY,EAAlC,CAAkC,CAAC,CAAC;YAE1F,IAAI,MAAM,EAAE;gBACV,cAAc,CAAC,IAAI,CAAC,oBAAa,YAAY,CAAC,IAAI,sBAAmB,CAAC,CAAC;gBAEvE,OAAO;aACR;YAED,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;YACjD,YAAY,CAAC,cAAc,GAAG,cAAc,CAAC;YAC7C,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;YAC7B,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;YAE3B,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAM,kBAAkB,GAAqC;QAAC,4BAAqB;aAArB,UAAqB,EAArB,qBAAqB,EAArB,IAAqB;YAArB,uCAAqB;;QACjF,cAAc,CAAC,KAAK,CAAC,0BAA0B,EAAE,eAAe,CAAC,CAAC;QAElE,kBAAkB,CAAC,OAAO,CAAC,UAAC,cAAc;YACxC,IAAI,cAAc,EAAE;gBAClB,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;aACtC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAM,uBAAuB,GAA0C;QAAC,8BAAuB;aAAvB,UAAuB,EAAvB,qBAAuB,EAAvB,IAAuB;YAAvB,yCAAuB;;QAC7F,cAAc,CAAC,KAAK,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,CAAC;QAE5E,oBAAoB,CAAC,OAAO,CAAC,UAAC,mBAAmB;YAC/C,IAAI,mBAAmB,EAAE;gBACvB,eAAe,CAAC,IAAI,CAAC,sCAAsC,CAAC,mBAAmB,CAAC,CAAC,CAAC;aACnF;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAM,oBAAoB,GAAG,UAAC,KAAsB;QAClD,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,KAAmB,UAAe,EAAf,mCAAe,EAAf,6BAAe,EAAf,IAAe,EAAE;YAA/B,IAAM,IAAI,wBAAA;YACb,IAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAoB,CAAC;YAE5E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gBACzB,OAAO,EAAE,CAAC;aACX;YAED,aAAa,GAAG,QAAQ,CAAC;SAC1B;QACD,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAEF,IAAM,WAAW,GAAG,UAAC,KAAsB;QACzC,IAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO;SACR;QAED,KAAwB,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU,EAAE;YAA/B,IAAM,SAAS,mBAAA;YAClB,cAAc,CAAC,KAAK,CAAC,kCAA2B,SAAS,CAAC,IAAI,OAAI,EAAE,aAAa,CAAC,CAAC;YACnF,IAAI,SAAS,CAAC,SAAS,EAAE,EAAE;gBACzB,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;aAC/B;SACF;IACH,CAAC,CAAC;IAEF,IAAM,WAAW,GAAG,UAAC,IAAmB;;QAC/B,IAAA,YAAY,GAAI,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAhC,CAAiC;QAEpD,IAAI,YAAY,KAAK,SAAS,EAAE;YAC9B,OAAO;SACR;QAED,KAAwB,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU,EAAE;YAA/B,IAAM,SAAS,mBAAA;YAClB,cAAc,CAAC,KAAK,CAAC,kCAA2B,SAAS,CAAC,IAAI,OAAI,EAAE,YAAY,CAAC,CAAC;YAClF,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE;gBAC1B,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;aAC9B;iBAAM,IAAI,CAAC,CAAA,MAAA,MAAM,CAAC,QAAQ,0CAAE,OAAO,CAAA,EAAE;gBACpC,SAAS,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;aAChC;SACF;IACH,CAAC,CAAC;IAEF,IAAI,aAAwC,CAAC;IAE7C,IAAI,MAAA,MAAM,CAAC,QAAQ,0CAAE,OAAO,EAAE;QAC5B,aAAa,GAAG,IAAI,6BAAa,CAAC,WAAW,EAAE;YAC7C,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;YACxC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS;YACpC,MAAM,QAAA;SACP,CAAC,CAAC;KACJ;IAED,8CAA8C;IAC9C,EAAE;IACF,oCAAoC;IACpC,kEAAkE;IAClE,gBAAgB;IAChB,iDAAiD;IACjD,8DAA8D;IAC9D,IAAM,OAAO,GAA0B,UAAC,IAAI;;QAC1C,IAAI,MAAM,EAAE;YACV,OAAO;SACR;QAED,IAAI,CAAC,CAAA,MAAA,MAAM,CAAC,QAAQ,0CAAE,OAAO,CAAA,EAAE;YAC7B,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;SACR;QAED,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,IAAM,kBAAkB,GAAqC,cAAM,yBAAI,eAAe,SAAnB,CAAoB,CAAC;IAExF,IAAM,QAAQ,GAA2B,cAAM,OAAA,MAAM,EAAN,CAAM,CAAC;IAEtD,IAAM,KAAK,GAAwB;QACjC,cAAc,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3C,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,EAAE,CAAC;QAEvB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC,CAAC;IAEF,IAAM,MAAM,GAAyB;QAAC,4BAAqB;aAArB,UAAqB,EAArB,qBAAqB,EAArB,IAAqB;YAArB,uCAAqB;;QACzD,cAAc,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAE5C,kBAAkB,CAAC,OAAO,CAAC,UAAC,iBAAiB;YAC3C,cAAc,CAAC,KAAK,CAAC,qBAAa,iBAAiB,CAAC,IAAI,iBAAa,CAAC,CAAC;YAEvE,IAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAErE,IAAI,sBAAsB,KAAK,CAAC,CAAC,EAAE;gBACjC,cAAc,CAAC,IAAI,CAAC,sBAAc,iBAAiB,CAAC,IAAI,oBAAgB,CAAC,CAAC;gBAE1E,OAAO;aACR;YAED,UAAU,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAM,qBAAqB,GAAwC;QAAC,iCAA0B;aAA1B,UAA0B,EAA1B,qBAA0B,EAA1B,IAA0B;YAA1B,4CAA0B;;QAC5F,eAAe,CAAC,MAAM,CAAC,UAAC,cAAc,IAAK,OAAA,CAAC,uBAAuB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAjD,CAAiD,CAAC,CAAC;IAChG,CAAC,CAAC;IAEF,IAAM,OAAO,GAA0B;QACrC,cAAc,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC7C,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,EAAE,CAAC;QAEvB,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,KAAA;QACH,kBAAkB,oBAAA;QAClB,uBAAuB,yBAAA;QACvB,kBAAkB,oBAAA;QAClB,OAAO,SAAA;QACP,QAAQ,UAAA;QACR,KAAK,OAAA;QACL,MAAM,QAAA;QACN,qBAAqB,uBAAA;QACrB,IAAI,UAAU;YACZ,yBAAW,UAAU,QAAE;QACzB,CAAC;QACD,OAAO,SAAA;KACR,CAAC;AACJ,CAAC;AA7LD,oDA6LC","sourcesContent":["import type { TransportItem } from '..';\nimport type { ExceptionEvent } from '../api';\nimport type { Config, Patterns } from '../config';\nimport type { InternalLogger } from '../internalLogger';\nimport type { Metas } from '../metas';\nimport type { UnpatchedConsole } from '../unpatchedConsole';\nimport { isString } from '../utils';\n\nimport { BatchExecutor } from './batchExecutor';\nimport { TransportItemType } from './const';\nimport type { BeforeSendHook, Transport, Transports } from './types';\n\nexport function shouldIgnoreEvent(patterns: Patterns, msg: string): boolean {\n return patterns.some((pattern) => {\n return isString(pattern) ? msg.includes(pattern) : !!msg.match(pattern);\n });\n}\n\nexport function createBeforeSendHookFromIgnorePatterns(patterns: Patterns): BeforeSendHook {\n return (item: TransportItem) => {\n if (item.type === TransportItemType.EXCEPTION && item.payload) {\n const evt = item.payload as ExceptionEvent;\n const msg = `${evt.type}: ${evt.value}`;\n\n if (shouldIgnoreEvent(patterns, msg)) {\n return null;\n }\n }\n\n return item;\n };\n}\n\nexport function initializeTransports(\n unpatchedConsole: UnpatchedConsole,\n internalLogger: InternalLogger,\n config: Config,\n metas: Metas\n): Transports {\n internalLogger.debug('Initializing transports');\n\n const transports: Transport[] = [];\n\n let paused = config.paused;\n\n let beforeSendHooks: BeforeSendHook[] = [];\n\n const add: Transports['add'] = (...newTransports) => {\n internalLogger.debug('Adding transports');\n\n newTransports.forEach((newTransport) => {\n internalLogger.debug(`Adding \"${newTransport.name}\" transport`);\n\n const exists = transports.some((existingTransport) => existingTransport === newTransport);\n\n if (exists) {\n internalLogger.warn(`Transport ${newTransport.name} is already added`);\n\n return;\n }\n\n newTransport.unpatchedConsole = unpatchedConsole;\n newTransport.internalLogger = internalLogger;\n newTransport.config = config;\n newTransport.metas = metas;\n\n transports.push(newTransport);\n });\n };\n\n const addBeforeSendHooks: Transports['addBeforeSendHooks'] = (...newBeforeSendHooks) => {\n internalLogger.debug('Adding beforeSendHooks\\n', beforeSendHooks);\n\n newBeforeSendHooks.forEach((beforeSendHook) => {\n if (beforeSendHook) {\n beforeSendHooks.push(beforeSendHook);\n }\n });\n };\n\n const addIgnoreErrorsPatterns: Transports['addIgnoreErrorsPatterns'] = (...ignoreErrorsPatterns) => {\n internalLogger.debug('Adding ignoreErrorsPatterns\\n', ignoreErrorsPatterns);\n\n ignoreErrorsPatterns.forEach((ignoreErrorsPattern) => {\n if (ignoreErrorsPattern) {\n beforeSendHooks.push(createBeforeSendHookFromIgnorePatterns(ignoreErrorsPattern));\n }\n });\n };\n\n const applyBeforeSendHooks = (items: TransportItem[]): TransportItem[] => {\n let filteredItems = items;\n for (const hook of beforeSendHooks) {\n const modified = filteredItems.map(hook).filter(Boolean) as TransportItem[];\n\n if (modified.length === 0) {\n return [];\n }\n\n filteredItems = modified;\n }\n return filteredItems;\n };\n\n const batchedSend = (items: TransportItem[]) => {\n const filteredItems = applyBeforeSendHooks(items);\n\n if (filteredItems.length === 0) {\n return;\n }\n\n for (const transport of transports) {\n internalLogger.debug(`Transporting item using ${transport.name}\\n`, filteredItems);\n if (transport.isBatched()) {\n transport.send(filteredItems);\n }\n }\n };\n\n const instantSend = (item: TransportItem) => {\n const [filteredItem] = applyBeforeSendHooks([item]);\n\n if (filteredItem === undefined) {\n return;\n }\n\n for (const transport of transports) {\n internalLogger.debug(`Transporting item using ${transport.name}\\n`, filteredItem);\n if (!transport.isBatched()) {\n transport.send(filteredItem);\n } else if (!config.batching?.enabled) {\n transport.send([filteredItem]);\n }\n }\n };\n\n let batchExecutor: BatchExecutor | undefined;\n\n if (config.batching?.enabled) {\n batchExecutor = new BatchExecutor(batchedSend, {\n sendTimeout: config.batching.sendTimeout,\n itemLimit: config.batching.itemLimit,\n paused,\n });\n }\n\n // Send a signal to the appropriate transports\n //\n // 1. If SDK is paused, early return\n // 2. If batching is not enabled send the signal to all transports\n // instantly.\n // 3i. If batching is enabled, enqueue the signal\n // 3ii. Send the signal instantly to all un-batched transports\n const execute: Transports['execute'] = (item) => {\n if (paused) {\n return;\n }\n\n if (!config.batching?.enabled) {\n instantSend(item);\n return;\n }\n\n batchExecutor?.addItem(item);\n instantSend(item);\n };\n\n const getBeforeSendHooks: Transports['getBeforeSendHooks'] = () => [...beforeSendHooks];\n\n const isPaused: Transports['isPaused'] = () => paused;\n\n const pause: Transports['pause'] = () => {\n internalLogger.debug('Pausing transports');\n batchExecutor?.pause();\n\n paused = true;\n };\n\n const remove: Transports['remove'] = (...transportsToRemove) => {\n internalLogger.debug('Removing transports');\n\n transportsToRemove.forEach((transportToRemove) => {\n internalLogger.debug(`Removing \"${transportToRemove.name}\" transport`);\n\n const existingTransportIndex = transports.indexOf(transportToRemove);\n\n if (existingTransportIndex === -1) {\n internalLogger.warn(`Transport \"${transportToRemove.name}\" is not added`);\n\n return;\n }\n\n transports.splice(existingTransportIndex, 1);\n });\n };\n\n const removeBeforeSendHooks: Transports['removeBeforeSendHooks'] = (...beforeSendHooksToRemove) => {\n beforeSendHooks.filter((beforeSendHook) => !beforeSendHooksToRemove.includes(beforeSendHook));\n };\n\n const unpause: Transports['unpause'] = () => {\n internalLogger.debug('Unpausing transports');\n batchExecutor?.start();\n\n paused = false;\n };\n\n return {\n add,\n addBeforeSendHooks,\n addIgnoreErrorsPatterns,\n getBeforeSendHooks,\n execute,\n isPaused,\n pause,\n remove,\n removeBeforeSendHooks,\n get transports() {\n return [...transports];\n },\n unpause,\n };\n}\n"]}
|
|
@@ -32,20 +32,40 @@ var utils_1 = require("../utils");
|
|
|
32
32
|
var version_1 = require("../version");
|
|
33
33
|
var base_1 = require("./base");
|
|
34
34
|
var const_1 = require("./const");
|
|
35
|
+
var MockSingleTransport = /** @class */ (function (_super) {
|
|
36
|
+
__extends(MockSingleTransport, _super);
|
|
37
|
+
function MockSingleTransport() {
|
|
38
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
39
|
+
_this.name = '@grafana/transport-mock';
|
|
40
|
+
_this.version = version_1.VERSION;
|
|
41
|
+
_this.sentItems = [];
|
|
42
|
+
return _this;
|
|
43
|
+
}
|
|
44
|
+
MockSingleTransport.prototype.send = function (item) {
|
|
45
|
+
this.sentItems.push(item);
|
|
46
|
+
};
|
|
47
|
+
return MockSingleTransport;
|
|
48
|
+
}(base_1.BaseTransport));
|
|
49
|
+
var sendSingleMock = jest.spyOn(MockSingleTransport.prototype, 'send');
|
|
35
50
|
var MockTransport = /** @class */ (function (_super) {
|
|
36
51
|
__extends(MockTransport, _super);
|
|
37
52
|
function MockTransport() {
|
|
38
53
|
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
39
|
-
_this.name = '@grafana/transport-mock';
|
|
54
|
+
_this.name = '@grafana/transport-single-mock';
|
|
40
55
|
_this.version = version_1.VERSION;
|
|
41
56
|
_this.sentItems = [];
|
|
42
57
|
return _this;
|
|
43
58
|
}
|
|
44
|
-
MockTransport.prototype.send = function (
|
|
45
|
-
|
|
59
|
+
MockTransport.prototype.send = function (items) {
|
|
60
|
+
var _a;
|
|
61
|
+
(_a = this.sentItems).push.apply(_a, items);
|
|
62
|
+
};
|
|
63
|
+
MockTransport.prototype.isBatched = function () {
|
|
64
|
+
return true;
|
|
46
65
|
};
|
|
47
66
|
return MockTransport;
|
|
48
67
|
}(base_1.BaseTransport));
|
|
68
|
+
var sendMock = jest.spyOn(MockTransport.prototype, 'send');
|
|
49
69
|
describe('transports', function () {
|
|
50
70
|
describe('config.ignoreErrors', function () {
|
|
51
71
|
it('will filter out errors by string or regex', function () {
|
|
@@ -121,6 +141,51 @@ describe('transports', function () {
|
|
|
121
141
|
expect(transport2.sentItems).toHaveLength(2);
|
|
122
142
|
});
|
|
123
143
|
});
|
|
144
|
+
describe('test batched transports and single item ones', function () {
|
|
145
|
+
beforeAll(function () {
|
|
146
|
+
jest.useFakeTimers();
|
|
147
|
+
});
|
|
148
|
+
beforeEach(function () {
|
|
149
|
+
jest.clearAllMocks();
|
|
150
|
+
});
|
|
151
|
+
it('single item transports with batching enabled', function () {
|
|
152
|
+
var transport = new MockSingleTransport();
|
|
153
|
+
var transports = (0, initialize_1.initializeFaro)((0, testUtils_1.mockConfig)({
|
|
154
|
+
isolate: true,
|
|
155
|
+
instrumentations: [],
|
|
156
|
+
transports: [transport],
|
|
157
|
+
batching: {
|
|
158
|
+
enabled: true,
|
|
159
|
+
sendTimeout: 1,
|
|
160
|
+
},
|
|
161
|
+
})).transports;
|
|
162
|
+
var item1 = makeExceptionTransportItem('Error', 'Kaboom');
|
|
163
|
+
var item2 = makeExceptionTransportItem('Error', 'Kaboom');
|
|
164
|
+
transports.execute(item1);
|
|
165
|
+
transports.execute(item2);
|
|
166
|
+
jest.advanceTimersByTime(1);
|
|
167
|
+
expect(sendSingleMock).toHaveBeenCalledTimes(2);
|
|
168
|
+
expect(sendSingleMock.mock.calls).toEqual([[item1], [item2]]);
|
|
169
|
+
});
|
|
170
|
+
it('multiple item transports', function () {
|
|
171
|
+
var transport = new MockTransport();
|
|
172
|
+
var transports = (0, initialize_1.initializeFaro)((0, testUtils_1.mockConfig)({
|
|
173
|
+
isolate: true,
|
|
174
|
+
instrumentations: [],
|
|
175
|
+
transports: [transport],
|
|
176
|
+
batching: {
|
|
177
|
+
enabled: true,
|
|
178
|
+
sendTimeout: 1,
|
|
179
|
+
},
|
|
180
|
+
})).transports;
|
|
181
|
+
var item1 = makeExceptionTransportItem('Error', 'Kaboom');
|
|
182
|
+
var item2 = makeExceptionTransportItem('Error', 'Kaboom');
|
|
183
|
+
transports.execute(item1);
|
|
184
|
+
transports.execute(item2);
|
|
185
|
+
jest.advanceTimersByTime(1);
|
|
186
|
+
expect(sendMock).toHaveBeenCalledWith([item1, item2]);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
124
189
|
});
|
|
125
190
|
function makeExceptionTransportItem(type, value) {
|
|
126
191
|
return {
|