avo-inspector 3.2.0 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/AvoBatcher.d.ts +9 -3
- package/dist/AvoInspector.d.ts +4 -0
- package/dist/AvoNetworkCallsHandler.d.ts +80 -5
- package/dist/__tests__/UnboundPublicMethods_test.d.ts +1 -0
- package/dist/__tests__/constants.d.ts +2 -1
- package/dist/__tests__/helpers/internalGateway.d.ts +23 -0
- package/dist/eventSpec/AvoEventSpecCache.d.ts +7 -4
- package/dist/eventSpec/AvoEventSpecFetchTypes.d.ts +12 -1
- package/dist/eventSpec/AvoEventSpecFetcher.d.ts +6 -1
- package/dist/index.js +1 -1
- package/dist/lite/AvoBatcherLite.d.ts +9 -3
- package/dist/lite/AvoBatcherLite.js +46 -7
- package/dist/lite/AvoInspectorLite.d.ts +2 -0
- package/dist/lite/AvoInspectorLite.js +95 -15
- package/dist/lite/AvoNetworkCallsHandlerLite.d.ts +79 -5
- package/dist/lite/AvoNetworkCallsHandlerLite.js +300 -20
- package/package.json +10 -1
- package/dist/AvoBatcher.js +0 -87
- package/dist/AvoDeduplicator.js +0 -142
- package/dist/AvoEncryption.js +0 -176
- package/dist/AvoInspector.js +0 -435
- package/dist/AvoNetworkCallsHandler.js +0 -229
- package/dist/AvoSchemaParser.js +0 -95
- package/dist/AvoStreamId.js +0 -82
- package/dist/__mocks__/xhr.js +0 -14
- package/dist/__mocks__/xhrError.js +0 -14
- package/dist/__tests__/AvoEncryption.js +0 -272
- package/dist/__tests__/AvoEncryptionIntegration.js +0 -191
- package/dist/__tests__/AvoEventSpecFetcher.js +0 -377
- package/dist/__tests__/AvoInspector.js +0 -335
- package/dist/__tests__/Batcher.js +0 -214
- package/dist/__tests__/BatcherPublic.js +0 -139
- package/dist/__tests__/Deduplicator.js +0 -190
- package/dist/__tests__/EventSpecCache.js +0 -143
- package/dist/__tests__/EventValidator.js +0 -543
- package/dist/__tests__/InstallationId.js +0 -60
- package/dist/__tests__/NetworkCallsHandler.js +0 -222
- package/dist/__tests__/NetworkCallsHandlerModelA.js +0 -206
- package/dist/__tests__/Parsing.js +0 -115
- package/dist/__tests__/Sessions.d.ts +0 -1
- package/dist/__tests__/Sessions.js +0 -10
- package/dist/__tests__/Storage.d.ts +0 -1
- package/dist/__tests__/Storage.js +0 -173
- package/dist/__tests__/StreamId.d.ts +0 -1
- package/dist/__tests__/StreamId.js +0 -153
- package/dist/__tests__/constants.js +0 -48
- package/dist/esm/AvoBatcher.js +0 -75
- package/dist/esm/AvoDeduplicator.js +0 -137
- package/dist/esm/AvoEncryption.js +0 -277
- package/dist/esm/AvoGuid.js +0 -9
- package/dist/esm/AvoInspector.js +0 -470
- package/dist/esm/AvoInspectorEnv.js +0 -5
- package/dist/esm/AvoNetworkCallsHandler.js +0 -181
- package/dist/esm/AvoSchemaParser.js +0 -128
- package/dist/esm/AvoStorage.js +0 -176
- package/dist/esm/AvoStreamId.js +0 -140
- package/dist/esm/eventSpec/AvoEventSpecCache.js +0 -165
- package/dist/esm/eventSpec/AvoEventSpecFetchTypes.js +0 -6
- package/dist/esm/eventSpec/AvoEventSpecFetcher.js +0 -203
- package/dist/esm/eventSpec/EventValidator.js +0 -687
- package/dist/esm/eventSpec/index.js +0 -4
- package/dist/esm/index.js +0 -3
- package/dist/esm/utils.js +0 -38
- package/dist/esm/version.js +0 -2
- package/dist/eventSpec/AvoEventSpecCache.js +0 -181
- package/dist/eventSpec/AvoEventSpecFetcher.js +0 -290
- package/dist/eventSpec/EventValidator.js +0 -846
- package/dist/eventSpec/index.js +0 -20
- package/dist/version.d.ts +0 -1
- package/dist/version.js +0 -5
- /package/dist/__tests__/{AvoEncryption.d.ts → ApiKeyHeaderInjection_test.d.ts} +0 -0
- /package/dist/__tests__/{AvoEncryptionIntegration.d.ts → BrowserBootstrap_test.d.ts} +0 -0
- /package/dist/__tests__/{AvoEventSpecFetcher.d.ts → EventSpecGatewayCoordinates_test.d.ts} +0 -0
- /package/dist/__tests__/{AvoInspector.d.ts → InFlightQueueGaps_test.d.ts} +0 -0
- /package/dist/__tests__/{Batcher.d.ts → InFlightQueue_test.d.ts} +0 -0
- /package/dist/__tests__/{BatcherPublic.d.ts → NetworkCallsHandlerLite_test.d.ts} +0 -0
- /package/dist/__tests__/{Deduplicator.d.ts → PublicSurface_test.d.ts} +0 -0
- /package/dist/__tests__/{EventSpecCache.d.ts → TrackOptionsIntegration_test.d.ts} +0 -0
- /package/dist/__tests__/{EventValidator.d.ts → TrackOptionsTransport_test.d.ts} +0 -0
- /package/dist/__tests__/{InstallationId.d.ts → TrackingHeaders_test.d.ts} +0 -0
- /package/dist/__tests__/{NetworkCallsHandler.d.ts → V1WireBaseline_test.d.ts} +0 -0
- /package/dist/__tests__/{NetworkCallsHandlerModelA.d.ts → V2QueuedAttribution_test.d.ts} +0 -0
- /package/dist/__tests__/{Parsing.d.ts → V2StopSending_test.d.ts} +0 -0
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
var AvoBatcher_1 = require("../AvoBatcher");
|
|
40
|
-
var AvoInspector_1 = require("../AvoInspector");
|
|
41
|
-
var AvoNetworkCallsHandler_1 = require("../AvoNetworkCallsHandler");
|
|
42
|
-
var AvoStreamId_1 = require("../AvoStreamId");
|
|
43
|
-
var constants_1 = require("./constants");
|
|
44
|
-
var inspectorVersion = process.env.npm_package_version || "";
|
|
45
|
-
jest.mock("../AvoBatcher");
|
|
46
|
-
jest.mock("../AvoStorage");
|
|
47
|
-
jest.spyOn(AvoStreamId_1.AvoStreamId, "initialize").mockResolvedValue(constants_1.mockedReturns.ANONYMOUS_ID);
|
|
48
|
-
describe("Batcher", function () {
|
|
49
|
-
var inspector;
|
|
50
|
-
var apiKey = constants_1.defaultOptions.apiKey, env = constants_1.defaultOptions.env, version = constants_1.defaultOptions.version;
|
|
51
|
-
var networkHandler = new AvoNetworkCallsHandler_1.AvoNetworkCallsHandler(apiKey, env, "", version, inspectorVersion);
|
|
52
|
-
beforeAll(function () {
|
|
53
|
-
inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
54
|
-
inspector.enableLogging(false);
|
|
55
|
-
});
|
|
56
|
-
afterEach(function () {
|
|
57
|
-
jest.clearAllMocks();
|
|
58
|
-
// @ts-ignore
|
|
59
|
-
inspector.avoDeduplicator._clearEvents();
|
|
60
|
-
});
|
|
61
|
-
test("Batcher is initialized on Inspector init", function () {
|
|
62
|
-
expect(AvoBatcher_1.AvoBatcher).toHaveBeenCalledTimes(1);
|
|
63
|
-
expect(AvoBatcher_1.AvoBatcher).toHaveBeenCalledWith(networkHandler);
|
|
64
|
-
});
|
|
65
|
-
test("handleTrackSchema is called on trackSchema", function () {
|
|
66
|
-
var eventName = "event name";
|
|
67
|
-
var schema = [
|
|
68
|
-
{
|
|
69
|
-
propertyName: "prop0",
|
|
70
|
-
propertyType: "string",
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
propertyName: "prop1",
|
|
74
|
-
propertyType: "string",
|
|
75
|
-
},
|
|
76
|
-
];
|
|
77
|
-
inspector.trackSchema(eventName, schema);
|
|
78
|
-
expect(inspector.avoBatcher.handleTrackSchema).toHaveBeenCalledTimes(1);
|
|
79
|
-
expect(inspector.avoBatcher.handleTrackSchema).toBeCalledWith(eventName, schema, null, null, undefined);
|
|
80
|
-
});
|
|
81
|
-
test("handleTrackSchema is called on trackSchemaFromEvent", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
82
|
-
var eventName, properties, schema;
|
|
83
|
-
return __generator(this, function (_a) {
|
|
84
|
-
switch (_a.label) {
|
|
85
|
-
case 0:
|
|
86
|
-
eventName = "event name";
|
|
87
|
-
properties = {
|
|
88
|
-
prop0: "",
|
|
89
|
-
prop2: false,
|
|
90
|
-
prop3: 0,
|
|
91
|
-
prop4: 0.0,
|
|
92
|
-
};
|
|
93
|
-
schema = inspector.extractSchema(properties);
|
|
94
|
-
return [4 /*yield*/, inspector.trackSchemaFromEvent(eventName, properties)];
|
|
95
|
-
case 1:
|
|
96
|
-
_a.sent();
|
|
97
|
-
expect(inspector.avoBatcher.handleTrackSchema).toHaveBeenCalledTimes(1);
|
|
98
|
-
expect(inspector.avoBatcher.handleTrackSchema).toBeCalledWith(eventName, schema, null, null, properties);
|
|
99
|
-
return [2 /*return*/];
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}); });
|
|
103
|
-
test("handleTrackSchema is called on _avoFunctionTrackSchemaFromEvent", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
104
|
-
var eventName, properties, eventId, eventHash, schema;
|
|
105
|
-
return __generator(this, function (_a) {
|
|
106
|
-
switch (_a.label) {
|
|
107
|
-
case 0:
|
|
108
|
-
eventName = "event name";
|
|
109
|
-
properties = {
|
|
110
|
-
prop0: "",
|
|
111
|
-
prop2: false,
|
|
112
|
-
prop3: 0,
|
|
113
|
-
prop4: 0.0,
|
|
114
|
-
};
|
|
115
|
-
eventId = "testId";
|
|
116
|
-
eventHash = "testHash";
|
|
117
|
-
schema = inspector.extractSchema(properties);
|
|
118
|
-
// @ts-ignore
|
|
119
|
-
return [4 /*yield*/, inspector._avoFunctionTrackSchemaFromEvent(eventName, properties, eventId, eventHash)];
|
|
120
|
-
case 1:
|
|
121
|
-
// @ts-ignore
|
|
122
|
-
_a.sent();
|
|
123
|
-
expect(inspector.avoBatcher.handleTrackSchema).toHaveBeenCalledTimes(1);
|
|
124
|
-
expect(inspector.avoBatcher.handleTrackSchema).toBeCalledWith(eventName, schema, eventId, eventHash, properties);
|
|
125
|
-
return [2 /*return*/];
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
}); });
|
|
129
|
-
test("batchSize is updated", function () {
|
|
130
|
-
var count = 10;
|
|
131
|
-
inspector.setBatchSize(count);
|
|
132
|
-
expect(AvoInspector_1.AvoInspector.batchSize).toBe(count);
|
|
133
|
-
});
|
|
134
|
-
test("batchFlushSeconds is updated", function () {
|
|
135
|
-
var seconds = 10;
|
|
136
|
-
inspector.setBatchFlushSeconds(seconds);
|
|
137
|
-
expect(AvoInspector_1.AvoInspector.batchFlushSeconds).toBe(seconds);
|
|
138
|
-
});
|
|
139
|
-
});
|
|
@@ -1,190 +0,0 @@
|
|
|
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
-
function step(op) {
|
|
27
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
-
switch (op[0]) {
|
|
32
|
-
case 0: case 1: t = op; break;
|
|
33
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
-
default:
|
|
37
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
-
if (t[2]) _.ops.pop();
|
|
42
|
-
_.trys.pop(); continue;
|
|
43
|
-
}
|
|
44
|
-
op = body.call(thisArg, _);
|
|
45
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
-
var AvoDeduplicator_1 = require("../AvoDeduplicator");
|
|
51
|
-
var utils_1 = require("../utils");
|
|
52
|
-
var AvoSchemaParser_1 = require("../AvoSchemaParser");
|
|
53
|
-
var AvoInspector_1 = require("../AvoInspector");
|
|
54
|
-
var constants_1 = require("./constants");
|
|
55
|
-
describe("Deduplicator", function () {
|
|
56
|
-
var deduplicator = new AvoDeduplicator_1.AvoDeduplicator();
|
|
57
|
-
var testObject = {
|
|
58
|
-
"0": "some string",
|
|
59
|
-
"1": [1, 2, 3],
|
|
60
|
-
2: [["str", true]],
|
|
61
|
-
3: { avo: [1.1, 2.2, 3.3] }
|
|
62
|
-
};
|
|
63
|
-
test("AvoDeduplicator.deepEqual tests", function () {
|
|
64
|
-
var secondObject = {
|
|
65
|
-
"0": "some string",
|
|
66
|
-
"1": [1, 2, 3],
|
|
67
|
-
2: [["str", true]],
|
|
68
|
-
3: { avo: [1.1, 2.2, 3.3] }
|
|
69
|
-
};
|
|
70
|
-
expect((0, utils_1.deepEquals)(testObject, secondObject)).toBe(true);
|
|
71
|
-
expect((0, utils_1.deepEquals)(testObject, __assign(__assign({}, secondObject), { "4": "4" }))).toBe(false);
|
|
72
|
-
expect((0, utils_1.deepEquals)(testObject, __assign(__assign({}, secondObject), { 3: __assign(__assign({}, secondObject[3]), { avo: [1.1] }) }))).toBe(false);
|
|
73
|
-
expect((0, utils_1.deepEquals)(testObject, __assign(__assign({}, secondObject), { 0: "other string" }))).toBe(false);
|
|
74
|
-
});
|
|
75
|
-
test("Detects duplications when track in avo and then manually", function () {
|
|
76
|
-
var shouldRegisterFromAvo = deduplicator.shouldRegisterEvent("Test", testObject, true);
|
|
77
|
-
var shouldRegisterManual = deduplicator.shouldRegisterEvent("Test", testObject, false);
|
|
78
|
-
expect(shouldRegisterFromAvo).toBe(true);
|
|
79
|
-
expect(shouldRegisterManual).toBe(false);
|
|
80
|
-
});
|
|
81
|
-
test("Detects duplications when track manually and then in avo", function () {
|
|
82
|
-
var shouldRegisterManual = deduplicator.shouldRegisterEvent("Test", testObject, false);
|
|
83
|
-
var shouldRegisterFromAvo = deduplicator.shouldRegisterEvent("Test", testObject, true);
|
|
84
|
-
expect(shouldRegisterManual).toBe(true);
|
|
85
|
-
expect(shouldRegisterFromAvo).toBe(false);
|
|
86
|
-
});
|
|
87
|
-
test("Detects duplications when track in avo and then schema manually", function () {
|
|
88
|
-
var shouldRegisterFromAvo = deduplicator.shouldRegisterEvent("Test", testObject, true);
|
|
89
|
-
var shouldRegisterSchemaManual = deduplicator.shouldRegisterSchemaFromManually("Test", AvoSchemaParser_1.AvoSchemaParser.extractSchema(testObject));
|
|
90
|
-
expect(shouldRegisterFromAvo).toBe(true);
|
|
91
|
-
expect(shouldRegisterSchemaManual).toBe(false);
|
|
92
|
-
});
|
|
93
|
-
test("Inspector deduplicates only one event when track manually, in avo and then manually again", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
94
|
-
var inspector, manuallyTrackedSchema, avoTrackedSchema, manuallyTrackedSchemaAgain;
|
|
95
|
-
return __generator(this, function (_a) {
|
|
96
|
-
switch (_a.label) {
|
|
97
|
-
case 0:
|
|
98
|
-
inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
99
|
-
inspector.enableLogging(false);
|
|
100
|
-
return [4 /*yield*/, inspector.trackSchemaFromEvent("test", testObject)];
|
|
101
|
-
case 1:
|
|
102
|
-
manuallyTrackedSchema = _a.sent();
|
|
103
|
-
return [4 /*yield*/, inspector._avoFunctionTrackSchemaFromEvent("test", testObject, "eventId", "eventhash")];
|
|
104
|
-
case 2:
|
|
105
|
-
avoTrackedSchema = _a.sent();
|
|
106
|
-
return [4 /*yield*/, inspector.trackSchemaFromEvent("test", testObject)];
|
|
107
|
-
case 3:
|
|
108
|
-
manuallyTrackedSchemaAgain = _a.sent();
|
|
109
|
-
expect(manuallyTrackedSchema.length).toBe(4);
|
|
110
|
-
expect(avoTrackedSchema.length).toBe(0);
|
|
111
|
-
expect(manuallyTrackedSchemaAgain.length).toBe(4);
|
|
112
|
-
return [2 /*return*/];
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}); });
|
|
116
|
-
test("Inspector deduplicates only one event when track in avo, manually and then in avo again", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
117
|
-
var inspector, avoTrackedSchema, manuallyTrackedSchema, avoTrackedSchemaAgain;
|
|
118
|
-
return __generator(this, function (_a) {
|
|
119
|
-
switch (_a.label) {
|
|
120
|
-
case 0:
|
|
121
|
-
inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
122
|
-
inspector.enableLogging(false);
|
|
123
|
-
return [4 /*yield*/, inspector._avoFunctionTrackSchemaFromEvent("test", testObject, "eventId", "eventhash")];
|
|
124
|
-
case 1:
|
|
125
|
-
avoTrackedSchema = _a.sent();
|
|
126
|
-
return [4 /*yield*/, inspector.trackSchemaFromEvent("test", testObject)];
|
|
127
|
-
case 2:
|
|
128
|
-
manuallyTrackedSchema = _a.sent();
|
|
129
|
-
return [4 /*yield*/, inspector._avoFunctionTrackSchemaFromEvent("test", testObject, "eventId", "eventhash")];
|
|
130
|
-
case 3:
|
|
131
|
-
avoTrackedSchemaAgain = _a.sent();
|
|
132
|
-
expect(avoTrackedSchema.length).toBe(4);
|
|
133
|
-
expect(manuallyTrackedSchema.length).toBe(0);
|
|
134
|
-
expect(avoTrackedSchemaAgain.length).toBe(4);
|
|
135
|
-
return [2 /*return*/];
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
}); });
|
|
139
|
-
test("Allows two same manual events in a row", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
140
|
-
var inspector, manuallyTrackedSchema, manuallyTrackedSchemaAgain;
|
|
141
|
-
return __generator(this, function (_a) {
|
|
142
|
-
switch (_a.label) {
|
|
143
|
-
case 0:
|
|
144
|
-
inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
145
|
-
inspector.enableLogging(false);
|
|
146
|
-
return [4 /*yield*/, inspector.trackSchemaFromEvent("test", testObject)];
|
|
147
|
-
case 1:
|
|
148
|
-
manuallyTrackedSchema = _a.sent();
|
|
149
|
-
return [4 /*yield*/, inspector.trackSchemaFromEvent("test", testObject)];
|
|
150
|
-
case 2:
|
|
151
|
-
manuallyTrackedSchemaAgain = _a.sent();
|
|
152
|
-
expect(manuallyTrackedSchema.length).toBe(4);
|
|
153
|
-
expect(manuallyTrackedSchemaAgain.length).toBe(4);
|
|
154
|
-
return [2 /*return*/];
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
}); });
|
|
158
|
-
test("Allows two same avo events in a row", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
159
|
-
var inspector, avoTrackedSchema, avoTrackedSchemaAgain;
|
|
160
|
-
return __generator(this, function (_a) {
|
|
161
|
-
switch (_a.label) {
|
|
162
|
-
case 0:
|
|
163
|
-
inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
164
|
-
inspector.enableLogging(false);
|
|
165
|
-
return [4 /*yield*/, inspector._avoFunctionTrackSchemaFromEvent("test", testObject, "eventId", "eventhash")];
|
|
166
|
-
case 1:
|
|
167
|
-
avoTrackedSchema = _a.sent();
|
|
168
|
-
return [4 /*yield*/, inspector._avoFunctionTrackSchemaFromEvent("test", testObject, "eventId", "eventhash")];
|
|
169
|
-
case 2:
|
|
170
|
-
avoTrackedSchemaAgain = _a.sent();
|
|
171
|
-
expect(avoTrackedSchema.length).toBe(4);
|
|
172
|
-
expect(avoTrackedSchemaAgain.length).toBe(4);
|
|
173
|
-
return [2 /*return*/];
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}); });
|
|
177
|
-
test("Does not deduplicate if more than 300ms pass", function () {
|
|
178
|
-
var shouldRegisterFromAvo = deduplicator.shouldRegisterEvent("Test", testObject, true);
|
|
179
|
-
var now = new Date();
|
|
180
|
-
var dateNowSpy = jest
|
|
181
|
-
.spyOn(Date, "now")
|
|
182
|
-
.mockImplementation(function () {
|
|
183
|
-
return now.setMilliseconds(now.getMilliseconds() + 301);
|
|
184
|
-
});
|
|
185
|
-
var shouldRegisterManual = deduplicator.shouldRegisterEvent("Test", testObject, false);
|
|
186
|
-
expect(shouldRegisterFromAvo).toBe(true);
|
|
187
|
-
expect(shouldRegisterManual).toBe(true);
|
|
188
|
-
dateNowSpy.mockRestore();
|
|
189
|
-
});
|
|
190
|
-
});
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var AvoEventSpecCache_1 = require("../eventSpec/AvoEventSpecCache");
|
|
4
|
-
function makeSpec(branchId) {
|
|
5
|
-
if (branchId === void 0) { branchId = "branch1"; }
|
|
6
|
-
return {
|
|
7
|
-
events: [
|
|
8
|
-
{
|
|
9
|
-
branchId: branchId,
|
|
10
|
-
baseEventId: "evt_1",
|
|
11
|
-
variantIds: [],
|
|
12
|
-
props: {
|
|
13
|
-
method: { type: "string", required: true },
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
],
|
|
17
|
-
metadata: {
|
|
18
|
-
schemaId: "schema1",
|
|
19
|
-
branchId: branchId,
|
|
20
|
-
latestActionId: "action1",
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
describe("EventSpecCache", function () {
|
|
25
|
-
var cache;
|
|
26
|
-
beforeEach(function () {
|
|
27
|
-
cache = new AvoEventSpecCache_1.EventSpecCache(false);
|
|
28
|
-
});
|
|
29
|
-
test("returns undefined on cache miss", function () {
|
|
30
|
-
var result = cache.get("key", "stream", "event");
|
|
31
|
-
expect(result).toBeUndefined();
|
|
32
|
-
});
|
|
33
|
-
test("stores and retrieves a spec", function () {
|
|
34
|
-
var spec = makeSpec();
|
|
35
|
-
cache.set("key", "stream", "event", spec);
|
|
36
|
-
var result = cache.get("key", "stream", "event");
|
|
37
|
-
expect(result).toEqual(spec);
|
|
38
|
-
});
|
|
39
|
-
test("caches null spec responses", function () {
|
|
40
|
-
cache.set("key", "stream", "event", null);
|
|
41
|
-
var result = cache.get("key", "stream", "event");
|
|
42
|
-
expect(result).toBeNull();
|
|
43
|
-
});
|
|
44
|
-
test("TTL eviction: entries older than 60s removed on next get", function () {
|
|
45
|
-
var spec = makeSpec();
|
|
46
|
-
cache.set("key", "stream", "event", spec);
|
|
47
|
-
// Fast-forward time by 61 seconds
|
|
48
|
-
var now = Date.now();
|
|
49
|
-
jest.spyOn(Date, "now").mockReturnValue(now + 61000);
|
|
50
|
-
var result = cache.get("key", "stream", "event");
|
|
51
|
-
expect(result).toBeUndefined();
|
|
52
|
-
expect(cache.size()).toBe(0);
|
|
53
|
-
jest.restoreAllMocks();
|
|
54
|
-
});
|
|
55
|
-
test("per-entry eviction: entries retrieved 50+ times evicted immediately on next get", function () {
|
|
56
|
-
var spec = makeSpec();
|
|
57
|
-
cache.set("key", "stream", "event", spec);
|
|
58
|
-
// Access 50 times (reaching the threshold)
|
|
59
|
-
for (var i = 0; i < 50; i++) {
|
|
60
|
-
cache.get("key", "stream", "event");
|
|
61
|
-
}
|
|
62
|
-
// 51st access should evict
|
|
63
|
-
var result = cache.get("key", "stream", "event");
|
|
64
|
-
expect(result).toBeUndefined();
|
|
65
|
-
});
|
|
66
|
-
test("global sweep: runs every 50 cache operations and removes expired entries", function () {
|
|
67
|
-
var now = Date.now();
|
|
68
|
-
var dateSpy = jest.spyOn(Date, "now");
|
|
69
|
-
// Add an entry that will be old
|
|
70
|
-
dateSpy.mockReturnValue(now);
|
|
71
|
-
cache.set("key", "stream", "old-event", makeSpec());
|
|
72
|
-
// Add entries that will be fresh
|
|
73
|
-
dateSpy.mockReturnValue(now + 59000);
|
|
74
|
-
cache.set("key", "stream", "fresh-event", makeSpec());
|
|
75
|
-
// Access fresh-event 50 times to trigger sweep (at now + 59000, old-event has age 59000 which is < 60000)
|
|
76
|
-
// But let's make old-event actually expired
|
|
77
|
-
dateSpy.mockReturnValue(now + 61000);
|
|
78
|
-
// We need 50 operations to trigger sweep. Access fresh-event repeatedly.
|
|
79
|
-
// fresh-event was set at now+59000, so at now+61000 it's only 2s old
|
|
80
|
-
for (var i = 0; i < 49; i++) {
|
|
81
|
-
cache.get("key", "stream", "fresh-event");
|
|
82
|
-
}
|
|
83
|
-
// The 50th get triggers sweep
|
|
84
|
-
cache.get("key", "stream", "fresh-event");
|
|
85
|
-
// old-event should be swept (age > 60s)
|
|
86
|
-
// But fresh-event hit 50 times so per-entry eviction kicks in on next get
|
|
87
|
-
expect(cache.size()).toBeLessThanOrEqual(1);
|
|
88
|
-
jest.restoreAllMocks();
|
|
89
|
-
});
|
|
90
|
-
test("cache capacity: LRU eviction when size > 50", function () {
|
|
91
|
-
// Fill cache to capacity
|
|
92
|
-
for (var i = 0; i < 50; i++) {
|
|
93
|
-
cache.set("key", "stream", "event-".concat(i), makeSpec());
|
|
94
|
-
}
|
|
95
|
-
expect(cache.size()).toBe(50);
|
|
96
|
-
// Adding one more should evict the LRU entry
|
|
97
|
-
cache.set("key", "stream", "event-new", makeSpec());
|
|
98
|
-
expect(cache.size()).toBe(50);
|
|
99
|
-
});
|
|
100
|
-
test("LRU eviction removes least recently used entry", function () {
|
|
101
|
-
var now = Date.now();
|
|
102
|
-
var dateSpy = jest.spyOn(Date, "now");
|
|
103
|
-
// Add entries with different timestamps
|
|
104
|
-
dateSpy.mockReturnValue(now);
|
|
105
|
-
cache.set("key", "stream", "event-0", makeSpec());
|
|
106
|
-
dateSpy.mockReturnValue(now + 1000);
|
|
107
|
-
cache.set("key", "stream", "event-1", makeSpec());
|
|
108
|
-
// Access event-0 to update its lastAccessed
|
|
109
|
-
dateSpy.mockReturnValue(now + 2000);
|
|
110
|
-
cache.get("key", "stream", "event-0");
|
|
111
|
-
// Fill to capacity
|
|
112
|
-
for (var i = 2; i < 50; i++) {
|
|
113
|
-
dateSpy.mockReturnValue(now + 3000 + i);
|
|
114
|
-
cache.set("key", "stream", "event-".concat(i), makeSpec());
|
|
115
|
-
}
|
|
116
|
-
// Add one more - should evict event-1 (least recently accessed at now+1000)
|
|
117
|
-
dateSpy.mockReturnValue(now + 4000);
|
|
118
|
-
cache.set("key", "stream", "event-new", makeSpec());
|
|
119
|
-
// event-1 should be evicted
|
|
120
|
-
var evicted = cache.get("key", "stream", "event-1");
|
|
121
|
-
expect(evicted).toBeUndefined();
|
|
122
|
-
// event-0 should still be present
|
|
123
|
-
var kept = cache.get("key", "stream", "event-0");
|
|
124
|
-
expect(kept).toBeDefined();
|
|
125
|
-
jest.restoreAllMocks();
|
|
126
|
-
});
|
|
127
|
-
test("clear removes all entries and resets counter", function () {
|
|
128
|
-
cache.set("key", "stream", "event1", makeSpec());
|
|
129
|
-
cache.set("key", "stream", "event2", makeSpec());
|
|
130
|
-
expect(cache.size()).toBe(2);
|
|
131
|
-
cache.clear();
|
|
132
|
-
expect(cache.size()).toBe(0);
|
|
133
|
-
expect(cache.get("key", "stream", "event1")).toBeUndefined();
|
|
134
|
-
});
|
|
135
|
-
test("getStats returns correct statistics", function () {
|
|
136
|
-
cache.set("key", "stream", "event1", makeSpec());
|
|
137
|
-
cache.get("key", "stream", "event1");
|
|
138
|
-
var stats = cache.getStats();
|
|
139
|
-
expect(stats.size).toBe(1);
|
|
140
|
-
expect(stats.entries.length).toBe(1);
|
|
141
|
-
expect(stats.entries[0].eventCount).toBe(1);
|
|
142
|
-
});
|
|
143
|
-
});
|