avo-inspector 2.2.0 → 2.2.2-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -1
- package/README.md +130 -0
- package/bin/avo-inspector.js +97 -0
- package/dist/AvoBatcher.d.ts +4 -11
- package/dist/AvoEncryption.d.ts +33 -0
- package/dist/AvoInspector.d.ts +35 -6
- package/dist/AvoNetworkCallsHandler.d.ts +42 -12
- package/dist/AvoSchemaParser.d.ts +12 -5
- package/dist/browser.js.LICENSE.txt +5 -0
- package/dist/eventSpec/AvoEventSpecCache.d.ts +73 -0
- package/dist/eventSpec/AvoEventSpecFetchTypes.d.ts +141 -0
- package/dist/eventSpec/AvoEventSpecFetcher.d.ts +54 -0
- package/dist/eventSpec/EventValidator.d.ts +34 -0
- package/dist/eventSpec/cache.d.ts +73 -0
- package/dist/eventSpec/index.d.ts +4 -0
- package/dist/eventSpec/types.d.ts +74 -0
- package/dist/index.js +2 -1
- package/dist/index.js.LICENSE.txt +5 -0
- package/dist-browser/AvoAnonymousId.d.ts +26 -0
- package/dist-browser/AvoBatcher.d.ts +26 -0
- package/dist-browser/AvoDeduplicator.d.ts +20 -0
- package/dist-browser/AvoEncryption.d.ts +33 -0
- package/dist-browser/AvoGuid.d.ts +3 -0
- package/dist-browser/AvoInspector.d.ts +78 -0
- package/dist-browser/AvoInspectorEnv.d.ts +7 -0
- package/dist-browser/AvoNetworkCallsHandler.d.ts +74 -0
- package/dist-browser/AvoSchemaParser.d.ts +20 -0
- package/dist-browser/AvoStorage.d.ts +22 -0
- package/dist-browser/__mocks__/xhr.d.ts +12 -0
- package/dist-browser/__mocks__/xhrError.d.ts +12 -0
- package/dist-browser/__tests__/AnonymousId_test.d.ts +1 -0
- package/dist-browser/__tests__/AvoEncryption_test.d.ts +1 -0
- package/dist-browser/__tests__/AvoInspectorEventSpec_test.d.ts +1 -0
- package/dist-browser/__tests__/AvoInspector_test.d.ts +1 -0
- package/dist-browser/__tests__/BatcherPublic_test.d.ts +1 -0
- package/dist-browser/__tests__/Batcher_test.d.ts +1 -0
- package/dist-browser/__tests__/Deduplicator_test.d.ts +1 -0
- package/dist-browser/__tests__/EncryptedPropertyTracking_test.d.ts +1 -0
- package/dist-browser/__tests__/EventSpecCache_test.d.ts +1 -0
- package/dist-browser/__tests__/EventSpecFetcher_test.d.ts +1 -0
- package/dist-browser/__tests__/EventValidator_test.d.ts +1 -0
- package/dist-browser/__tests__/NetworkCallsHandler_test.d.ts +1 -0
- package/dist-browser/__tests__/Parsing_test.d.ts +1 -0
- package/dist-browser/__tests__/Storage_test.d.ts +1 -0
- package/dist-browser/__tests__/ValidationIntegration_test.d.ts +1 -0
- package/dist-browser/__tests__/constants.d.ts +36 -0
- package/dist-browser/__tests__/helpers/encryptionHelpers.d.ts +13 -0
- package/dist-browser/__tests__/helpers/mockFactories.d.ts +49 -0
- package/dist-browser/eventSpec/AvoEventSpecCache.d.ts +73 -0
- package/dist-browser/eventSpec/AvoEventSpecFetchTypes.d.ts +109 -0
- package/dist-browser/eventSpec/AvoEventSpecFetcher.d.ts +55 -0
- package/dist-browser/eventSpec/EventValidator.d.ts +90 -0
- package/dist-browser/eventSpec/index.d.ts +4 -0
- package/dist-browser/index.d.ts +2 -0
- package/dist-browser/utils.d.ts +3 -0
- package/dist-native/AvoBatcher.d.ts +24 -0
- package/dist-native/AvoBatcher.js +82 -0
- package/dist-native/AvoDeduplicator.d.ts +36 -0
- package/dist-native/AvoDeduplicator.js +142 -0
- package/dist-native/AvoGuid.d.ts +3 -0
- package/dist-native/AvoGuid.js +14 -0
- package/dist-native/AvoInspector.d.ts +52 -0
- package/dist-native/AvoInspector.js +220 -0
- package/dist-native/AvoInspectorEnv.d.ts +7 -0
- package/dist-native/AvoInspectorEnv.js +8 -0
- package/dist-native/AvoInstallationId.d.ts +5 -0
- package/dist-native/AvoInstallationId.js +36 -0
- package/dist-native/AvoNetworkCallsHandler.d.ts +48 -0
- package/dist-native/AvoNetworkCallsHandler.js +142 -0
- package/dist-native/AvoSchemaParser.d.ts +11 -0
- package/dist-native/AvoSchemaParser.js +95 -0
- package/dist-native/AvoSessionTracker.d.ts +15 -0
- package/dist-native/AvoSessionTracker.js +104 -0
- package/dist-native/AvoStorage.d.ts +22 -0
- package/dist-native/AvoStorage.js +336 -0
- package/dist-native/__mocks__/xhr.d.ts +12 -0
- package/dist-native/__mocks__/xhr.js +14 -0
- package/dist-native/__mocks__/xhrError.d.ts +12 -0
- package/dist-native/__mocks__/xhrError.js +14 -0
- package/dist-native/__tests__/AvoInspector.d.ts +1 -0
- package/dist-native/__tests__/AvoInspector.js +207 -0
- package/dist-native/__tests__/Batcher.d.ts +1 -0
- package/dist-native/__tests__/Batcher.js +280 -0
- package/dist-native/__tests__/BatcherPublic.d.ts +1 -0
- package/dist-native/__tests__/BatcherPublic.js +82 -0
- package/dist-native/__tests__/Deduplicator.d.ts +1 -0
- package/dist-native/__tests__/Deduplicator.js +111 -0
- package/dist-native/__tests__/InstallationId.d.ts +1 -0
- package/dist-native/__tests__/InstallationId.js +40 -0
- package/dist-native/__tests__/NetworkCallsHandler.d.ts +1 -0
- package/dist-native/__tests__/NetworkCallsHandler.js +132 -0
- package/dist-native/__tests__/Parsing.d.ts +1 -0
- package/dist-native/__tests__/Parsing.js +115 -0
- package/dist-native/__tests__/Sessions.d.ts +1 -0
- package/dist-native/__tests__/Sessions.js +179 -0
- package/dist-native/__tests__/Storage.d.ts +1 -0
- package/dist-native/__tests__/Storage.js +173 -0
- package/dist-native/__tests__/constants.d.ts +36 -0
- package/dist-native/__tests__/constants.js +47 -0
- package/dist-native/index.d.ts +2 -0
- package/dist-native/index.js +7 -0
- package/dist-native/utils.d.ts +3 -0
- package/dist-native/utils.js +42 -0
- package/jest.config.js +6 -0
- package/package.json +8 -2
- package/webpack.browserConfig.js +1 -1
- package/webpack.config.js +1 -1
- package/.claude/settings.local.json +0 -9
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var AvoInspector_1 = require("../AvoInspector");
|
|
4
|
+
var constants_1 = require("../__tests__/constants");
|
|
5
|
+
describe("Schema Parsing", function () {
|
|
6
|
+
var inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
7
|
+
beforeAll(function () {
|
|
8
|
+
inspector.enableLogging(false);
|
|
9
|
+
});
|
|
10
|
+
test("Empty array returned if eventProperties are not set", function () {
|
|
11
|
+
// @ts-ignore
|
|
12
|
+
var schema = inspector.extractSchema();
|
|
13
|
+
expect(schema).toEqual([]);
|
|
14
|
+
});
|
|
15
|
+
test("Property types and names are set", function () {
|
|
16
|
+
// Given
|
|
17
|
+
var eventProperties = {
|
|
18
|
+
prop0: true,
|
|
19
|
+
prop1: 1,
|
|
20
|
+
prop2: "str",
|
|
21
|
+
prop3: 0.5,
|
|
22
|
+
prop4: undefined,
|
|
23
|
+
prop5: null,
|
|
24
|
+
prop6: { an: "object" },
|
|
25
|
+
prop7: [
|
|
26
|
+
"a",
|
|
27
|
+
"list",
|
|
28
|
+
{
|
|
29
|
+
"obj in list": true,
|
|
30
|
+
"int field": 1,
|
|
31
|
+
},
|
|
32
|
+
["another", "list"],
|
|
33
|
+
[1, 2],
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
// When
|
|
37
|
+
var res = inspector.extractSchema(eventProperties);
|
|
38
|
+
// Then
|
|
39
|
+
res.forEach(function (_a, index) {
|
|
40
|
+
var propertyName = _a.propertyName;
|
|
41
|
+
expect(propertyName).toBe("prop".concat(index));
|
|
42
|
+
});
|
|
43
|
+
expect(res[0].propertyType).toBe(constants_1.type.BOOL);
|
|
44
|
+
expect(res[1].propertyType).toBe(constants_1.type.INT);
|
|
45
|
+
expect(res[2].propertyType).toBe(constants_1.type.STRING);
|
|
46
|
+
expect(res[3].propertyType).toBe(constants_1.type.FLOAT);
|
|
47
|
+
expect(res[4].propertyType).toBe(constants_1.type.NULL);
|
|
48
|
+
expect(res[5].propertyType).toBe(constants_1.type.NULL);
|
|
49
|
+
expect(res[6].propertyType).toBe(constants_1.type.OBJECT);
|
|
50
|
+
expect(res[6].children).toMatchObject([
|
|
51
|
+
{
|
|
52
|
+
propertyName: "an",
|
|
53
|
+
propertyType: constants_1.type.STRING,
|
|
54
|
+
},
|
|
55
|
+
]);
|
|
56
|
+
expect(res[7].propertyType).toBe(constants_1.type.LIST);
|
|
57
|
+
expect(res[7].children).toMatchObject([
|
|
58
|
+
constants_1.type.STRING,
|
|
59
|
+
[
|
|
60
|
+
{
|
|
61
|
+
propertyName: "obj in list",
|
|
62
|
+
propertyType: constants_1.type.BOOL,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
propertyName: "int field",
|
|
66
|
+
propertyType: constants_1.type.INT,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
[constants_1.type.STRING],
|
|
70
|
+
[constants_1.type.INT],
|
|
71
|
+
]);
|
|
72
|
+
});
|
|
73
|
+
test("Duplicated values are removed", function () {
|
|
74
|
+
// Given
|
|
75
|
+
var eventProperties = {
|
|
76
|
+
prop0: ["true", "false", true, 10, "true", true, 11, 10, 0.1, 0.1],
|
|
77
|
+
};
|
|
78
|
+
// When
|
|
79
|
+
var res = inspector.extractSchema(eventProperties);
|
|
80
|
+
// Then
|
|
81
|
+
expect(res[0].propertyType).toBe(constants_1.type.LIST);
|
|
82
|
+
expect(res[0].children).toMatchObject([
|
|
83
|
+
constants_1.type.STRING,
|
|
84
|
+
constants_1.type.BOOL,
|
|
85
|
+
constants_1.type.INT,
|
|
86
|
+
constants_1.type.FLOAT,
|
|
87
|
+
]);
|
|
88
|
+
});
|
|
89
|
+
test("Empty and falsy values are set correctly", function () {
|
|
90
|
+
// Given
|
|
91
|
+
var eventProperties = {
|
|
92
|
+
prop0: false,
|
|
93
|
+
prop1: 0,
|
|
94
|
+
prop2: "",
|
|
95
|
+
prop3: 0.0,
|
|
96
|
+
prop4: undefined,
|
|
97
|
+
prop5: null,
|
|
98
|
+
prop6: {},
|
|
99
|
+
prop7: [],
|
|
100
|
+
};
|
|
101
|
+
// When
|
|
102
|
+
var res = inspector.extractSchema(eventProperties);
|
|
103
|
+
// Then
|
|
104
|
+
expect(res[0].propertyType).toBe(constants_1.type.BOOL);
|
|
105
|
+
expect(res[1].propertyType).toBe(constants_1.type.INT);
|
|
106
|
+
expect(res[2].propertyType).toBe(constants_1.type.STRING);
|
|
107
|
+
expect(res[3].propertyType).toBe(constants_1.type.INT);
|
|
108
|
+
expect(res[4].propertyType).toBe(constants_1.type.NULL);
|
|
109
|
+
expect(res[5].propertyType).toBe(constants_1.type.NULL);
|
|
110
|
+
expect(res[6].propertyType).toBe(constants_1.type.OBJECT);
|
|
111
|
+
expect(res[6].children).toMatchObject([]);
|
|
112
|
+
expect(res[7].propertyType).toBe(constants_1.type.LIST);
|
|
113
|
+
expect(res[7].children).toMatchObject([]);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var AvoBatcher_1 = require("../AvoBatcher");
|
|
4
|
+
var AvoInspector_1 = require("../AvoInspector");
|
|
5
|
+
var AvoNetworkCallsHandler_1 = require("../AvoNetworkCallsHandler");
|
|
6
|
+
var AvoSessionTracker_1 = require("../AvoSessionTracker");
|
|
7
|
+
var AvoStorage_1 = require("../AvoStorage");
|
|
8
|
+
var constants_1 = require("../__tests__/constants");
|
|
9
|
+
var inspectorVersion = process.env.npm_package_version || "";
|
|
10
|
+
jest.mock("../AvoBatcher");
|
|
11
|
+
jest.mock("../AvoNetworkCallsHandler");
|
|
12
|
+
describe("Sessions", function () {
|
|
13
|
+
var apiKey = constants_1.defaultOptions.apiKey, env = constants_1.defaultOptions.env, version = constants_1.defaultOptions.version, shouldLog = constants_1.defaultOptions.shouldLog;
|
|
14
|
+
var storage = new AvoStorage_1.AvoStorage(shouldLog);
|
|
15
|
+
var networkHandler = new AvoNetworkCallsHandler_1.AvoNetworkCallsHandler(apiKey, env, "", version, inspectorVersion);
|
|
16
|
+
var mockBatcher = new AvoBatcher_1.AvoBatcher(networkHandler);
|
|
17
|
+
afterEach(function () {
|
|
18
|
+
jest.clearAllMocks();
|
|
19
|
+
storage.removeItem(AvoSessionTracker_1.AvoSessionTracker.idCacheKey);
|
|
20
|
+
});
|
|
21
|
+
test("Session started on window.onload", function () {
|
|
22
|
+
// Given
|
|
23
|
+
storage.removeItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey);
|
|
24
|
+
var inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
25
|
+
inspector.enableLogging(false);
|
|
26
|
+
inspector.sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
27
|
+
// When
|
|
28
|
+
var loadEvent = document.createEvent("Event");
|
|
29
|
+
loadEvent.initEvent("load", false, false);
|
|
30
|
+
window.dispatchEvent(loadEvent);
|
|
31
|
+
// Then
|
|
32
|
+
expect(mockBatcher.handleSessionStarted).toHaveBeenCalledTimes(1);
|
|
33
|
+
});
|
|
34
|
+
test("Session started on trackSchemaFromEvent", function () {
|
|
35
|
+
// Given
|
|
36
|
+
storage.removeItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey);
|
|
37
|
+
var inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
38
|
+
inspector.enableLogging(false);
|
|
39
|
+
inspector.sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
40
|
+
// When
|
|
41
|
+
inspector.trackSchemaFromEvent("Test event", {});
|
|
42
|
+
// Then
|
|
43
|
+
expect(mockBatcher.handleSessionStarted).toHaveBeenCalledTimes(1);
|
|
44
|
+
});
|
|
45
|
+
test("Session started on trackSchema", function () {
|
|
46
|
+
// Given
|
|
47
|
+
storage.removeItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey);
|
|
48
|
+
var inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
49
|
+
inspector.enableLogging(false);
|
|
50
|
+
inspector.sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
51
|
+
// When
|
|
52
|
+
inspector.trackSchema("Test event", []);
|
|
53
|
+
// Then
|
|
54
|
+
expect(mockBatcher.handleSessionStarted).toHaveBeenCalledTimes(1);
|
|
55
|
+
});
|
|
56
|
+
test("Session started on extractSchema", function () {
|
|
57
|
+
// Given
|
|
58
|
+
storage.removeItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey);
|
|
59
|
+
var inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
60
|
+
inspector.enableLogging(false);
|
|
61
|
+
inspector.sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
62
|
+
// When
|
|
63
|
+
inspector.extractSchema({});
|
|
64
|
+
// Then
|
|
65
|
+
expect(mockBatcher.handleSessionStarted).toHaveBeenCalledTimes(1);
|
|
66
|
+
});
|
|
67
|
+
test("Inits with session tracker", function () {
|
|
68
|
+
// When
|
|
69
|
+
var inspector = new AvoInspector_1.AvoInspector(constants_1.defaultOptions);
|
|
70
|
+
// Then
|
|
71
|
+
expect(inspector.sessionTracker).not.toBeNull();
|
|
72
|
+
});
|
|
73
|
+
test("Inits with timestamp 0 and a session id", function () {
|
|
74
|
+
// Given
|
|
75
|
+
storage.removeItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey);
|
|
76
|
+
// When
|
|
77
|
+
var sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(new AvoBatcher_1.AvoBatcher(networkHandler));
|
|
78
|
+
// Then
|
|
79
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(0);
|
|
80
|
+
expect(AvoSessionTracker_1.AvoSessionTracker.sessionId).not.toBeNull();
|
|
81
|
+
});
|
|
82
|
+
test("Starts new session when no session recorded", function () {
|
|
83
|
+
// Given
|
|
84
|
+
storage.removeItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey);
|
|
85
|
+
var callMoment = Date.now();
|
|
86
|
+
// When
|
|
87
|
+
var sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
88
|
+
var prevSessionId = AvoSessionTracker_1.AvoSessionTracker.sessionId;
|
|
89
|
+
sessionTracker.startOrProlongSession(callMoment);
|
|
90
|
+
// Then
|
|
91
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(callMoment);
|
|
92
|
+
expect(AvoSessionTracker_1.AvoSessionTracker.sessionId).not.toBeNull();
|
|
93
|
+
expect(AvoSessionTracker_1.AvoSessionTracker.sessionId).not.toBe(prevSessionId);
|
|
94
|
+
expect(mockBatcher.handleSessionStarted).toHaveBeenCalledTimes(1);
|
|
95
|
+
});
|
|
96
|
+
test("Starts new session when time between session calls is greater than time between sessions", function () {
|
|
97
|
+
// Given
|
|
98
|
+
var callMoment = Date.now();
|
|
99
|
+
storage.setItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey, callMoment - constants_1.sessionTimeMs - 1);
|
|
100
|
+
// When
|
|
101
|
+
var sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
102
|
+
var prevSessionId = AvoSessionTracker_1.AvoSessionTracker.sessionId;
|
|
103
|
+
sessionTracker.startOrProlongSession(callMoment);
|
|
104
|
+
// Then
|
|
105
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(callMoment);
|
|
106
|
+
expect(AvoSessionTracker_1.AvoSessionTracker.sessionId).not.toBeNull();
|
|
107
|
+
expect(AvoSessionTracker_1.AvoSessionTracker.sessionId).not.toBe(prevSessionId);
|
|
108
|
+
expect(mockBatcher.handleSessionStarted).toHaveBeenCalledTimes(1);
|
|
109
|
+
});
|
|
110
|
+
test("Not starts new session when time between session calls is smaller than time between sessions", function () {
|
|
111
|
+
// Given
|
|
112
|
+
var callMoment = Date.now();
|
|
113
|
+
storage.setItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey, callMoment - constants_1.sessionTimeMs + 1);
|
|
114
|
+
// When
|
|
115
|
+
var sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
116
|
+
var prevSessionId = AvoSessionTracker_1.AvoSessionTracker.sessionId;
|
|
117
|
+
sessionTracker.startOrProlongSession(callMoment);
|
|
118
|
+
// Then
|
|
119
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(callMoment);
|
|
120
|
+
expect(AvoSessionTracker_1.AvoSessionTracker.sessionId).toBe(prevSessionId);
|
|
121
|
+
expect(mockBatcher.handleSessionStarted).toHaveBeenCalledTimes(0);
|
|
122
|
+
});
|
|
123
|
+
test("Not starts new session when time between individual session calls is smaller than time between sessions but combined is greater", function () {
|
|
124
|
+
// Given
|
|
125
|
+
var callMoment = Date.now();
|
|
126
|
+
storage.setItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey, callMoment - constants_1.sessionTimeMs + 1);
|
|
127
|
+
// When
|
|
128
|
+
var sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
129
|
+
var prevSessionId = AvoSessionTracker_1.AvoSessionTracker.sessionId;
|
|
130
|
+
sessionTracker.startOrProlongSession(callMoment);
|
|
131
|
+
sessionTracker.startOrProlongSession(callMoment + constants_1.sessionTimeMs);
|
|
132
|
+
// Then
|
|
133
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(callMoment + constants_1.sessionTimeMs);
|
|
134
|
+
expect(AvoSessionTracker_1.AvoSessionTracker.sessionId).toBe(prevSessionId);
|
|
135
|
+
expect(mockBatcher.handleSessionStarted).toHaveBeenCalledTimes(0);
|
|
136
|
+
});
|
|
137
|
+
test("Parses saved timestamp properly", function () {
|
|
138
|
+
// Given
|
|
139
|
+
var callMoment = Date.now();
|
|
140
|
+
storage.removeItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey);
|
|
141
|
+
// When
|
|
142
|
+
var sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
143
|
+
// Then
|
|
144
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(0);
|
|
145
|
+
// When
|
|
146
|
+
sessionTracker.startOrProlongSession(callMoment);
|
|
147
|
+
// Then
|
|
148
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(callMoment);
|
|
149
|
+
// When
|
|
150
|
+
sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
151
|
+
// Then
|
|
152
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(callMoment);
|
|
153
|
+
});
|
|
154
|
+
test("Default session length is 5 mins", function () {
|
|
155
|
+
// Given
|
|
156
|
+
// When
|
|
157
|
+
var sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
158
|
+
// Then
|
|
159
|
+
expect(sessionTracker.sessionLengthMillis).toBe(constants_1.sessionTimeMs);
|
|
160
|
+
});
|
|
161
|
+
test("Delays session init if items from last sessions are not loaded", function () {
|
|
162
|
+
// Given
|
|
163
|
+
var callMoment = Date.now();
|
|
164
|
+
storage.removeItem(AvoSessionTracker_1.AvoSessionTracker.lastSessionTimestampKey);
|
|
165
|
+
AvoInspector_1.AvoInspector.avoStorage.storageImpl.storageInitialized = false;
|
|
166
|
+
// When
|
|
167
|
+
var sessionTracker = new AvoSessionTracker_1.AvoSessionTracker(mockBatcher);
|
|
168
|
+
// Then
|
|
169
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(0);
|
|
170
|
+
// When
|
|
171
|
+
sessionTracker.startOrProlongSession(callMoment);
|
|
172
|
+
// Then
|
|
173
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(0);
|
|
174
|
+
// When
|
|
175
|
+
AvoInspector_1.AvoInspector.avoStorage.storageImpl.init(true);
|
|
176
|
+
// Then
|
|
177
|
+
expect(sessionTracker.lastSessionTimestamp).toBe(callMoment);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,173 @@
|
|
|
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 AvoStorage_1 = require("../AvoStorage");
|
|
51
|
+
var constants_1 = require("../__tests__/constants");
|
|
52
|
+
var originalWindow = __assign({}, window);
|
|
53
|
+
beforeEach(function () {
|
|
54
|
+
window = originalWindow;
|
|
55
|
+
});
|
|
56
|
+
describe("Avo Storage", function () {
|
|
57
|
+
var storage = new AvoStorage_1.AvoStorage(constants_1.defaultOptions.shouldLog);
|
|
58
|
+
var key = "avoKey";
|
|
59
|
+
var value = "avoValue";
|
|
60
|
+
test("Sets and gets item with shouldLog on", function () {
|
|
61
|
+
var storage = new AvoStorage_1.AvoStorage(true);
|
|
62
|
+
storage.setItem(key, value);
|
|
63
|
+
var item = storage.getItem(key);
|
|
64
|
+
expect(item).toBe(value);
|
|
65
|
+
});
|
|
66
|
+
test("Sets and gets item with shouldLog off", function () {
|
|
67
|
+
var storage = new AvoStorage_1.AvoStorage(false);
|
|
68
|
+
storage.setItem(key, value);
|
|
69
|
+
var item = storage.getItem(key);
|
|
70
|
+
expect(item).toBe(value);
|
|
71
|
+
});
|
|
72
|
+
test("Gets item asynchronously", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
73
|
+
var item;
|
|
74
|
+
return __generator(this, function (_a) {
|
|
75
|
+
switch (_a.label) {
|
|
76
|
+
case 0:
|
|
77
|
+
storage.removeItem(key);
|
|
78
|
+
storage.setItem(key, value);
|
|
79
|
+
return [4 /*yield*/, storage.getItemAsync(key)];
|
|
80
|
+
case 1:
|
|
81
|
+
item = _a.sent();
|
|
82
|
+
expect(item).toBe(value);
|
|
83
|
+
return [2 /*return*/];
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}); });
|
|
87
|
+
test("Returns null if key does not exist", function () {
|
|
88
|
+
storage.removeItem(key);
|
|
89
|
+
var item = storage.getItem(key);
|
|
90
|
+
expect(item).toBeNull();
|
|
91
|
+
});
|
|
92
|
+
test("Deletes item with shouldLog on", function () {
|
|
93
|
+
var storage = new AvoStorage_1.AvoStorage(true);
|
|
94
|
+
storage.removeItem(key);
|
|
95
|
+
var item = storage.getItem(key);
|
|
96
|
+
expect(item).toBeNull();
|
|
97
|
+
});
|
|
98
|
+
test("Deletes item with shouldLog off", function () {
|
|
99
|
+
var storage = new AvoStorage_1.AvoStorage(false);
|
|
100
|
+
storage.removeItem(key);
|
|
101
|
+
var item = storage.getItem(key);
|
|
102
|
+
expect(item).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
test("storage writes are delayed until the storage is initialized on web", function () {
|
|
105
|
+
var storageWebImpl = storage.storageImpl;
|
|
106
|
+
storageWebImpl.storageInitialized = false;
|
|
107
|
+
storage.setItem(key, "OnStorageInitFuncs on web");
|
|
108
|
+
var itemBeforeInit = storage.getItem(key);
|
|
109
|
+
expect(itemBeforeInit).toBeNull();
|
|
110
|
+
storageWebImpl.init(true);
|
|
111
|
+
var itemAfterInit = storage.getItem(key);
|
|
112
|
+
expect(itemAfterInit).toEqual("OnStorageInitFuncs on web");
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe("Avo Storage unavailable", function () {
|
|
116
|
+
var key = "avoKey";
|
|
117
|
+
var value = "avoValue";
|
|
118
|
+
beforeEach(function () {
|
|
119
|
+
Object.defineProperty(window, "localStorage", {});
|
|
120
|
+
});
|
|
121
|
+
test("Fallback mode enabled", function () {
|
|
122
|
+
var storage = new AvoStorage_1.AvoStorage(false);
|
|
123
|
+
var storageImpl = storage.storageImpl;
|
|
124
|
+
expect(storageImpl.useFallbackStorage).toBe(true);
|
|
125
|
+
expect(storageImpl.storageInitialized).toBe(true);
|
|
126
|
+
});
|
|
127
|
+
test("Sets and gets item with shouldLog on", function () {
|
|
128
|
+
var storage = new AvoStorage_1.AvoStorage(true);
|
|
129
|
+
storage.setItem(key, value);
|
|
130
|
+
var item = storage.getItem(key);
|
|
131
|
+
expect(item).toBe(value);
|
|
132
|
+
});
|
|
133
|
+
test("Sets and gets item with shouldLog off", function () {
|
|
134
|
+
var storage = new AvoStorage_1.AvoStorage(false);
|
|
135
|
+
storage.setItem(key, value);
|
|
136
|
+
var item = storage.getItem(key);
|
|
137
|
+
expect(item).toBe(value);
|
|
138
|
+
});
|
|
139
|
+
test("Gets item asynchronously", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
140
|
+
var storage, item;
|
|
141
|
+
return __generator(this, function (_a) {
|
|
142
|
+
switch (_a.label) {
|
|
143
|
+
case 0:
|
|
144
|
+
storage = new AvoStorage_1.AvoStorage(false);
|
|
145
|
+
storage.removeItem(key);
|
|
146
|
+
storage.setItem(key, value);
|
|
147
|
+
return [4 /*yield*/, storage.getItemAsync(key)];
|
|
148
|
+
case 1:
|
|
149
|
+
item = _a.sent();
|
|
150
|
+
expect(item).toBe(value);
|
|
151
|
+
return [2 /*return*/];
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}); });
|
|
155
|
+
test("Returns null if key does not exist", function () {
|
|
156
|
+
var storage = new AvoStorage_1.AvoStorage(false);
|
|
157
|
+
storage.removeItem(key);
|
|
158
|
+
var item = storage.getItem(key);
|
|
159
|
+
expect(item).toBeNull();
|
|
160
|
+
});
|
|
161
|
+
test("Deletes item with shouldLog on", function () {
|
|
162
|
+
var storage = new AvoStorage_1.AvoStorage(true);
|
|
163
|
+
storage.removeItem(key);
|
|
164
|
+
var item = storage.getItem(key);
|
|
165
|
+
expect(item).toBeNull();
|
|
166
|
+
});
|
|
167
|
+
test("Deletes item with shouldLog off", function () {
|
|
168
|
+
var storage = new AvoStorage_1.AvoStorage(false);
|
|
169
|
+
storage.removeItem(key);
|
|
170
|
+
var item = storage.getItem(key);
|
|
171
|
+
expect(item).toBeNull();
|
|
172
|
+
});
|
|
173
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
declare const defaultOptions: {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
env: "prod";
|
|
4
|
+
version: string;
|
|
5
|
+
shouldLog: boolean;
|
|
6
|
+
};
|
|
7
|
+
declare const error: {
|
|
8
|
+
API_KEY: string;
|
|
9
|
+
VERSION: string;
|
|
10
|
+
};
|
|
11
|
+
declare const mockedReturns: {
|
|
12
|
+
INSTALLATION_ID: string;
|
|
13
|
+
GUID: string;
|
|
14
|
+
SESSION_ID: string;
|
|
15
|
+
};
|
|
16
|
+
declare const networkCallType: {
|
|
17
|
+
EVENT: string;
|
|
18
|
+
SESSION_STARTED: string;
|
|
19
|
+
};
|
|
20
|
+
declare const requestMsg: {
|
|
21
|
+
ERROR: string;
|
|
22
|
+
TIMEOUT: string;
|
|
23
|
+
};
|
|
24
|
+
declare const trackingEndpoint = "https://api.avo.app/inspector/v1/track";
|
|
25
|
+
declare const sessionTimeMs: number;
|
|
26
|
+
declare const type: {
|
|
27
|
+
STRING: string;
|
|
28
|
+
INT: string;
|
|
29
|
+
OBJECT: string;
|
|
30
|
+
FLOAT: string;
|
|
31
|
+
LIST: string;
|
|
32
|
+
BOOL: string;
|
|
33
|
+
NULL: string;
|
|
34
|
+
UNKNOWN: string;
|
|
35
|
+
};
|
|
36
|
+
export { defaultOptions, error, mockedReturns, networkCallType, requestMsg, sessionTimeMs, type, trackingEndpoint, };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.trackingEndpoint = exports.type = exports.sessionTimeMs = exports.requestMsg = exports.networkCallType = exports.mockedReturns = exports.error = exports.defaultOptions = void 0;
|
|
4
|
+
var AvoInspectorEnv_1 = require("../AvoInspectorEnv");
|
|
5
|
+
var defaultOptions = {
|
|
6
|
+
apiKey: "api-key-xxx",
|
|
7
|
+
env: AvoInspectorEnv_1.AvoInspectorEnv.Prod,
|
|
8
|
+
version: "1",
|
|
9
|
+
shouldLog: true
|
|
10
|
+
};
|
|
11
|
+
exports.defaultOptions = defaultOptions;
|
|
12
|
+
var error = {
|
|
13
|
+
API_KEY: "[Avo Inspector] No API key provided. Inspector can't operate without API key.",
|
|
14
|
+
VERSION: "[Avo Inspector] No version provided. Many features of Inspector rely on versioning. Please provide comparable string version, i.e. integer or semantic.",
|
|
15
|
+
};
|
|
16
|
+
exports.error = error;
|
|
17
|
+
var mockedReturns = {
|
|
18
|
+
INSTALLATION_ID: "avo-instalation-id",
|
|
19
|
+
GUID: "generated-guid",
|
|
20
|
+
SESSION_ID: "session-id",
|
|
21
|
+
};
|
|
22
|
+
exports.mockedReturns = mockedReturns;
|
|
23
|
+
var networkCallType = {
|
|
24
|
+
EVENT: "event",
|
|
25
|
+
SESSION_STARTED: "sessionStarted",
|
|
26
|
+
};
|
|
27
|
+
exports.networkCallType = networkCallType;
|
|
28
|
+
var requestMsg = {
|
|
29
|
+
ERROR: "Request failed",
|
|
30
|
+
TIMEOUT: "Request timed out",
|
|
31
|
+
};
|
|
32
|
+
exports.requestMsg = requestMsg;
|
|
33
|
+
var trackingEndpoint = "https://api.avo.app/inspector/v1/track";
|
|
34
|
+
exports.trackingEndpoint = trackingEndpoint;
|
|
35
|
+
var sessionTimeMs = 5 * 60 * 1000;
|
|
36
|
+
exports.sessionTimeMs = sessionTimeMs;
|
|
37
|
+
var type = {
|
|
38
|
+
STRING: "string",
|
|
39
|
+
INT: "int",
|
|
40
|
+
OBJECT: "object",
|
|
41
|
+
FLOAT: "float",
|
|
42
|
+
LIST: "list",
|
|
43
|
+
BOOL: "boolean",
|
|
44
|
+
NULL: "null",
|
|
45
|
+
UNKNOWN: "unknown",
|
|
46
|
+
};
|
|
47
|
+
exports.type = type;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AvoInspectorEnv = exports.AvoInspector = void 0;
|
|
4
|
+
var AvoInspector_1 = require("./AvoInspector");
|
|
5
|
+
Object.defineProperty(exports, "AvoInspector", { enumerable: true, get: function () { return AvoInspector_1.AvoInspector; } });
|
|
6
|
+
var AvoInspectorEnv_1 = require("./AvoInspectorEnv");
|
|
7
|
+
Object.defineProperty(exports, "AvoInspectorEnv", { enumerable: true, get: function () { return AvoInspectorEnv_1.AvoInspectorEnv; } });
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deepEquals = exports.isValueEmpty = void 0;
|
|
4
|
+
var isValueEmpty = function (value) {
|
|
5
|
+
return value === null || value === undefined || value.trim().length == 0;
|
|
6
|
+
};
|
|
7
|
+
exports.isValueEmpty = isValueEmpty;
|
|
8
|
+
function deepEquals(x, y) {
|
|
9
|
+
if (x === y) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
if (!(x instanceof Object) || !(y instanceof Object)) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (x.constructor !== y.constructor) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
for (var p in x) {
|
|
19
|
+
if (!x.hasOwnProperty(p)) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (!y.hasOwnProperty(p)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if (x[p] === y[p]) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (typeof x[p] !== "object") {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
if (!deepEquals(x[p], y[p])) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for (p in y) {
|
|
36
|
+
if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
exports.deepEquals = deepEquals;
|
package/jest.config.js
CHANGED
|
@@ -2,6 +2,7 @@ module.exports = {
|
|
|
2
2
|
preset: "ts-jest",
|
|
3
3
|
testEnvironment: "jsdom",
|
|
4
4
|
setupFiles: ["<rootDir>/src/__tests__/jest.setup.js"],
|
|
5
|
+
setupFilesAfterEnv: ["<rootDir>/src/__tests__/jest.setupAfterEnv.js"],
|
|
5
6
|
moduleNameMapper: {
|
|
6
7
|
"^react-native$": "<rootDir>/src/__tests__/jest.setup.js",
|
|
7
8
|
},
|
|
@@ -9,6 +10,7 @@ module.exports = {
|
|
|
9
10
|
"**/src/__tests__/**/*.ts",
|
|
10
11
|
"!**/src/__tests__/setup.ts",
|
|
11
12
|
"!**/src/__tests__/constants.ts",
|
|
13
|
+
"!**/src/__tests__/helpers/**",
|
|
12
14
|
],
|
|
13
15
|
testPathIgnorePatterns: [
|
|
14
16
|
"/node_modules/",
|
|
@@ -16,6 +18,10 @@ module.exports = {
|
|
|
16
18
|
"/examples/",
|
|
17
19
|
"/constants/",
|
|
18
20
|
],
|
|
21
|
+
modulePathIgnorePatterns: [
|
|
22
|
+
"<rootDir>/dist/",
|
|
23
|
+
"<rootDir>/dist-native/",
|
|
24
|
+
],
|
|
19
25
|
transform: {
|
|
20
26
|
"^.+\\.(ts|tsx)$": "ts-jest",
|
|
21
27
|
},
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
2
|
"name": "avo-inspector",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.2-alpha.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"browser": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"avo-inspector": "./bin/avo-inspector.js"
|
|
10
|
+
},
|
|
8
11
|
"scripts": {
|
|
9
12
|
"build": "tsc --emitDeclarationOnly && webpack --config webpack.config.js",
|
|
10
13
|
"build-for-script-tag": "tsc --outDir dist-browser --emitDeclarationOnly && webpack --config webpack.browserConfig.js",
|
|
@@ -32,6 +35,9 @@
|
|
|
32
35
|
"url": "https://github.com/avohq/web-avo-inspector/issues"
|
|
33
36
|
},
|
|
34
37
|
"homepage": "https://github.com/avohq/web-avo-inspector#readme",
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"eciesjs": "^0.4.11"
|
|
40
|
+
},
|
|
35
41
|
"devDependencies": {
|
|
36
42
|
"@babel/core": "^7.25.2",
|
|
37
43
|
"@babel/preset-env": "^7.25.3",
|