@amplitude/analytics-core 2.50.1-featelement-selector-v1.0 → 2.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/heartbeat.d.ts +42 -0
- package/lib/cjs/heartbeat.d.ts.map +1 -0
- package/lib/cjs/heartbeat.js +189 -0
- package/lib/cjs/heartbeat.js.map +1 -0
- package/lib/cjs/index.d.ts +2 -1
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +4 -2
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/remote-config/remote-config.d.ts +20 -1
- package/lib/cjs/remote-config/remote-config.d.ts.map +1 -1
- package/lib/cjs/remote-config/remote-config.js +67 -32
- package/lib/cjs/remote-config/remote-config.js.map +1 -1
- package/lib/cjs/types/config/react-native-config.d.ts +1 -1
- package/lib/cjs/types/config/react-native-config.d.ts.map +1 -1
- package/lib/cjs/types/config/react-native-config.js.map +1 -1
- package/lib/cjs/types/event/base-event.d.ts +5 -0
- package/lib/cjs/types/event/base-event.d.ts.map +1 -1
- package/lib/cjs/types/event/base-event.js.map +1 -1
- package/lib/esm/heartbeat.d.ts +42 -0
- package/lib/esm/heartbeat.d.ts.map +1 -0
- package/lib/esm/heartbeat.js +185 -0
- package/lib/esm/heartbeat.js.map +1 -0
- package/lib/esm/index.d.ts +2 -1
- package/lib/esm/index.d.ts.map +1 -1
- package/lib/esm/index.js +2 -1
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/remote-config/remote-config.d.ts +20 -1
- package/lib/esm/remote-config/remote-config.d.ts.map +1 -1
- package/lib/esm/remote-config/remote-config.js +67 -32
- package/lib/esm/remote-config/remote-config.js.map +1 -1
- package/lib/esm/types/config/react-native-config.d.ts +1 -1
- package/lib/esm/types/config/react-native-config.d.ts.map +1 -1
- package/lib/esm/types/config/react-native-config.js.map +1 -1
- package/lib/esm/types/event/base-event.d.ts +5 -0
- package/lib/esm/types/event/base-event.d.ts.map +1 -1
- package/lib/esm/types/event/base-event.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ILogger } from './logger';
|
|
2
|
+
import { CoreClient } from './types/client/core-client';
|
|
3
|
+
import { BaseEvent } from './types/event/base-event';
|
|
4
|
+
import { Result } from './types/result';
|
|
5
|
+
export declare class Heartbeat {
|
|
6
|
+
private client;
|
|
7
|
+
private pulse;
|
|
8
|
+
private delayTimeout;
|
|
9
|
+
private logger?;
|
|
10
|
+
private events;
|
|
11
|
+
private delayId;
|
|
12
|
+
private interval;
|
|
13
|
+
private resetPromise;
|
|
14
|
+
constructor(client: CoreClient, pulse: number, delayTimeout: number, logger?: ILogger | undefined);
|
|
15
|
+
private heartbeat;
|
|
16
|
+
private resetHeartbeat;
|
|
17
|
+
/**
|
|
18
|
+
* An instant event is one that has no delay and gets ingested immediately
|
|
19
|
+
* @param event
|
|
20
|
+
* @returns
|
|
21
|
+
*/
|
|
22
|
+
private isInstantEvent;
|
|
23
|
+
private checkEventSizeLimit;
|
|
24
|
+
track(event: BaseEvent): Promise<Result | Error | undefined>;
|
|
25
|
+
/**
|
|
26
|
+
* Ingest an event with no delay
|
|
27
|
+
*
|
|
28
|
+
* (This is different from normal "track". It sends the events to the "/delayed" endpoint
|
|
29
|
+
* so that it can be tracked in the same payload as other events, for atomicity)
|
|
30
|
+
* @param event
|
|
31
|
+
* @returns
|
|
32
|
+
*/
|
|
33
|
+
trackNoDelay(event: BaseEvent): Promise<Error | Result | undefined>;
|
|
34
|
+
/**
|
|
35
|
+
* Update an existing event
|
|
36
|
+
* @param event
|
|
37
|
+
*/
|
|
38
|
+
update(event: BaseEvent): Promise<void>;
|
|
39
|
+
stop(): void;
|
|
40
|
+
}
|
|
41
|
+
export declare function getHeartbeatInstance(client: CoreClient, logger?: ILogger): Heartbeat;
|
|
42
|
+
//# sourceMappingURL=heartbeat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAS,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AASxC,qBAAa,SAAS;IAOlB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM,CAAC;IATjB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,YAAY,CAAkC;gBAG5C,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,qBAAS;YAMZ,SAAS;YAwBT,cAAc;IAmB5B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,mBAAmB;IAYrB,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;IAiBlE;;;;;;;OAOG;IACG,YAAY,CAAC,KAAK,EAAE,SAAS;IAKnC;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,SAAS;IAc7B,IAAI;CAKL;AAUD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAQpF"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getHeartbeatInstance = exports.Heartbeat = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var uuid_1 = require("./utils/uuid");
|
|
6
|
+
var EVENTS_SIZE_LIMIT = 4 * 10000; // 4KB
|
|
7
|
+
var Heartbeat = /** @class */ (function () {
|
|
8
|
+
function Heartbeat(client, pulse, delayTimeout, logger) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
this.pulse = pulse;
|
|
11
|
+
this.delayTimeout = delayTimeout;
|
|
12
|
+
this.logger = logger;
|
|
13
|
+
this.interval = null;
|
|
14
|
+
this.resetPromise = null;
|
|
15
|
+
this.events = new Map();
|
|
16
|
+
this.delayId = (0, uuid_1.UUID)();
|
|
17
|
+
}
|
|
18
|
+
Heartbeat.prototype.heartbeat = function () {
|
|
19
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
20
|
+
var trackedEvents, _loop_1, this_1, _a, _b, event_1;
|
|
21
|
+
var e_1, _c;
|
|
22
|
+
var _this = this;
|
|
23
|
+
return tslib_1.__generator(this, function (_d) {
|
|
24
|
+
switch (_d.label) {
|
|
25
|
+
case 0:
|
|
26
|
+
// stop sending heartbeats if no events are queued
|
|
27
|
+
if (this.events.size === 0) {
|
|
28
|
+
this.stop();
|
|
29
|
+
return [2 /*return*/, []];
|
|
30
|
+
}
|
|
31
|
+
trackedEvents = [];
|
|
32
|
+
_loop_1 = function (event_1) {
|
|
33
|
+
var event_type = event_1.event_type, event_properties = event_1.event_properties, eventOptions = tslib_1.__rest(event_1, ["event_type", "event_properties"]);
|
|
34
|
+
var eventPromise = this_1.client.track(event_type, event_properties, eventOptions).promise;
|
|
35
|
+
// if the event has no timeout, then it's instant ingested and we can
|
|
36
|
+
// delete it after it was ingested
|
|
37
|
+
if (this_1.isInstantEvent(event_1)) {
|
|
38
|
+
var insertId_1 = event_1.insert_id;
|
|
39
|
+
void eventPromise.finally(function () { return _this.events.delete(insertId_1); });
|
|
40
|
+
}
|
|
41
|
+
trackedEvents.push(eventPromise);
|
|
42
|
+
};
|
|
43
|
+
this_1 = this;
|
|
44
|
+
try {
|
|
45
|
+
for (_a = tslib_1.__values(this.events.values()), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
46
|
+
event_1 = _b.value;
|
|
47
|
+
_loop_1(event_1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
51
|
+
finally {
|
|
52
|
+
try {
|
|
53
|
+
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
54
|
+
}
|
|
55
|
+
finally { if (e_1) throw e_1.error; }
|
|
56
|
+
}
|
|
57
|
+
return [4 /*yield*/, Promise.all(trackedEvents)];
|
|
58
|
+
case 1: return [2 /*return*/, _d.sent()];
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
Heartbeat.prototype.resetHeartbeat = function () {
|
|
64
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
65
|
+
var _this = this;
|
|
66
|
+
return tslib_1.__generator(this, function (_a) {
|
|
67
|
+
switch (_a.label) {
|
|
68
|
+
case 0:
|
|
69
|
+
if (!this.resetPromise) return [3 /*break*/, 2];
|
|
70
|
+
return [4 /*yield*/, this.resetPromise];
|
|
71
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
72
|
+
case 2:
|
|
73
|
+
// reset the heartbeat interval
|
|
74
|
+
if (this.interval)
|
|
75
|
+
clearInterval(this.interval);
|
|
76
|
+
this.interval = setInterval(function () { return void _this.heartbeat(); }, this.pulse);
|
|
77
|
+
// invoke heartbeat on the next macrotask tick
|
|
78
|
+
this.resetPromise = new Promise(function (resolve) {
|
|
79
|
+
setTimeout(function () {
|
|
80
|
+
resolve(_this.heartbeat());
|
|
81
|
+
}, 0);
|
|
82
|
+
});
|
|
83
|
+
this.resetPromise.finally(function () { return (_this.resetPromise = null); });
|
|
84
|
+
return [4 /*yield*/, this.resetPromise];
|
|
85
|
+
case 3: return [2 /*return*/, _a.sent()];
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* An instant event is one that has no delay and gets ingested immediately
|
|
92
|
+
* @param event
|
|
93
|
+
* @returns
|
|
94
|
+
*/
|
|
95
|
+
Heartbeat.prototype.isInstantEvent = function (event) {
|
|
96
|
+
return Boolean(event.insert_id && !event.delay.timeout);
|
|
97
|
+
};
|
|
98
|
+
Heartbeat.prototype.checkEventSizeLimit = function (event) {
|
|
99
|
+
var _a;
|
|
100
|
+
if (JSON.stringify(tslib_1.__spreadArray([], tslib_1.__read(this.events.values()), false)).length > EVENTS_SIZE_LIMIT) {
|
|
101
|
+
/* istanbul ignore next */
|
|
102
|
+
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.warn("Heartbeat: events size limit reached, rejecting event with id=".concat(event.insert_id));
|
|
103
|
+
if (event.insert_id) {
|
|
104
|
+
this.events.delete(event.insert_id);
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
};
|
|
110
|
+
Heartbeat.prototype.track = function (event) {
|
|
111
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
112
|
+
var heartbeatResult;
|
|
113
|
+
return tslib_1.__generator(this, function (_a) {
|
|
114
|
+
switch (_a.label) {
|
|
115
|
+
case 0:
|
|
116
|
+
if (!event.insert_id) {
|
|
117
|
+
return [2 /*return*/, new Error('insert_id is required on events tracked with heartbeat')];
|
|
118
|
+
}
|
|
119
|
+
this.events.set(event.insert_id, tslib_1.__assign(tslib_1.__assign({}, event), { delay: event.delay || { id: this.delayId, timeout: this.delayTimeout } }));
|
|
120
|
+
if (!this.checkEventSizeLimit(event)) {
|
|
121
|
+
return [2 /*return*/];
|
|
122
|
+
}
|
|
123
|
+
return [4 /*yield*/, this.resetHeartbeat()];
|
|
124
|
+
case 1:
|
|
125
|
+
heartbeatResult = _a.sent();
|
|
126
|
+
return [2 /*return*/, heartbeatResult.find(function (result) { return result.event.insert_id === event.insert_id; })];
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Ingest an event with no delay
|
|
133
|
+
*
|
|
134
|
+
* (This is different from normal "track". It sends the events to the "/delayed" endpoint
|
|
135
|
+
* so that it can be tracked in the same payload as other events, for atomicity)
|
|
136
|
+
* @param event
|
|
137
|
+
* @returns
|
|
138
|
+
*/
|
|
139
|
+
Heartbeat.prototype.trackNoDelay = function (event) {
|
|
140
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
141
|
+
return tslib_1.__generator(this, function (_a) {
|
|
142
|
+
event.delay = { id: this.delayId };
|
|
143
|
+
return [2 /*return*/, this.track(event)];
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Update an existing event
|
|
149
|
+
* @param event
|
|
150
|
+
*/
|
|
151
|
+
Heartbeat.prototype.update = function (event) {
|
|
152
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
153
|
+
var backupEvent;
|
|
154
|
+
return tslib_1.__generator(this, function (_a) {
|
|
155
|
+
if (event.insert_id && this.events.has(event.insert_id)) {
|
|
156
|
+
backupEvent = this.events.get(event.insert_id);
|
|
157
|
+
this.events.set(event.insert_id, tslib_1.__assign(tslib_1.__assign({}, event), { delay: { id: this.delayId, timeout: this.delayTimeout } }));
|
|
158
|
+
if (!this.checkEventSizeLimit(event) && backupEvent) {
|
|
159
|
+
this.events.set(event.insert_id, backupEvent);
|
|
160
|
+
return [2 /*return*/];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return [2 /*return*/];
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
Heartbeat.prototype.stop = function () {
|
|
168
|
+
this.interval && clearInterval(this.interval);
|
|
169
|
+
this.interval = null;
|
|
170
|
+
this.events.clear();
|
|
171
|
+
};
|
|
172
|
+
return Heartbeat;
|
|
173
|
+
}());
|
|
174
|
+
exports.Heartbeat = Heartbeat;
|
|
175
|
+
var DEFAULT_HEARTBEAT_INTERVAL = 60000;
|
|
176
|
+
// const DEFAULT_HEARTBEAT_INTERVAL = 2_000; // TODO: DO NOT MERGE THIS
|
|
177
|
+
var DEFAULT_HEARTBEAT_DELAY_TIMEOUT = 3600000;
|
|
178
|
+
var heartbeatMap = new Map();
|
|
179
|
+
function getHeartbeatInstance(client, logger) {
|
|
180
|
+
var existing = heartbeatMap.get(client);
|
|
181
|
+
if (existing) {
|
|
182
|
+
return existing;
|
|
183
|
+
}
|
|
184
|
+
var heartbeat = new Heartbeat(client, DEFAULT_HEARTBEAT_INTERVAL, DEFAULT_HEARTBEAT_DELAY_TIMEOUT, logger);
|
|
185
|
+
heartbeatMap.set(client, heartbeat);
|
|
186
|
+
return heartbeat;
|
|
187
|
+
}
|
|
188
|
+
exports.getHeartbeatInstance = getHeartbeatInstance;
|
|
189
|
+
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/heartbeat.ts"],"names":[],"mappings":"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","sourcesContent":["import { ILogger } from './logger';\nimport { CoreClient } from './types/client/core-client';\nimport { BaseEvent, Delay } from './types/event/base-event';\nimport { Result } from './types/result';\nimport { UUID } from './utils/uuid';\n\ntype DelayedEvent = BaseEvent & {\n delay: Delay;\n};\n\nconst EVENTS_SIZE_LIMIT = 4 * 10_000; // 4KB\n\nexport class Heartbeat {\n private events: Map<string, DelayedEvent>;\n private delayId: string;\n private interval: NodeJS.Timeout | null = null;\n private resetPromise: Promise<Result[]> | null = null;\n\n constructor(\n private client: CoreClient,\n private pulse: number,\n private delayTimeout: number,\n private logger?: ILogger,\n ) {\n this.events = new Map<string, DelayedEvent>();\n this.delayId = UUID();\n }\n\n private async heartbeat(): Promise<Result[]> {\n // stop sending heartbeats if no events are queued\n if (this.events.size === 0) {\n this.stop();\n return [];\n }\n\n // track all of the delayed events\n const trackedEvents = [];\n for (const event of this.events.values()) {\n const { event_type, event_properties, ...eventOptions } = event;\n const eventPromise = this.client.track(event_type, event_properties, eventOptions).promise;\n\n // if the event has no timeout, then it's instant ingested and we can\n // delete it after it was ingested\n if (this.isInstantEvent(event)) {\n const insertId = event.insert_id;\n void eventPromise.finally(() => this.events.delete(insertId));\n }\n trackedEvents.push(eventPromise);\n }\n return await Promise.all(trackedEvents);\n }\n\n private async resetHeartbeat() {\n // if a reset is already in progress, return the existing promise\n if (this.resetPromise) return await this.resetPromise;\n\n // reset the heartbeat interval\n if (this.interval) clearInterval(this.interval);\n this.interval = setInterval(() => void this.heartbeat(), this.pulse);\n\n // invoke heartbeat on the next macrotask tick\n this.resetPromise = new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.heartbeat());\n }, 0);\n });\n this.resetPromise.finally(() => (this.resetPromise = null));\n\n return await this.resetPromise;\n }\n\n /**\n * An instant event is one that has no delay and gets ingested immediately\n * @param event\n * @returns\n */\n private isInstantEvent(event: DelayedEvent): event is DelayedEvent & { insert_id: string } {\n return Boolean(event.insert_id && !event.delay.timeout);\n }\n\n private checkEventSizeLimit(event: BaseEvent) {\n if (JSON.stringify([...this.events.values()]).length > EVENTS_SIZE_LIMIT) {\n /* istanbul ignore next */\n this.logger?.warn(`Heartbeat: events size limit reached, rejecting event with id=${event.insert_id!}`);\n if (event.insert_id) {\n this.events.delete(event.insert_id);\n }\n return false;\n }\n return true;\n }\n\n async track(event: BaseEvent): Promise<Result | Error | undefined> {\n if (!event.insert_id) {\n return new Error('insert_id is required on events tracked with heartbeat');\n }\n this.events.set(event.insert_id, {\n ...event,\n delay: event.delay || { id: this.delayId, timeout: this.delayTimeout },\n });\n if (!this.checkEventSizeLimit(event)) {\n return;\n }\n\n // emit a heartbeat, restart interval and return the result\n const heartbeatResult = await this.resetHeartbeat();\n return heartbeatResult.find((result) => result.event.insert_id === event.insert_id);\n }\n\n /**\n * Ingest an event with no delay\n *\n * (This is different from normal \"track\". It sends the events to the \"/delayed\" endpoint\n * so that it can be tracked in the same payload as other events, for atomicity)\n * @param event\n * @returns\n */\n async trackNoDelay(event: BaseEvent) {\n event.delay = { id: this.delayId };\n return this.track(event);\n }\n\n /**\n * Update an existing event\n * @param event\n */\n async update(event: BaseEvent) {\n if (event.insert_id && this.events.has(event.insert_id)) {\n const backupEvent = this.events.get(event.insert_id);\n this.events.set(event.insert_id, {\n ...event,\n delay: { id: this.delayId, timeout: this.delayTimeout },\n });\n if (!this.checkEventSizeLimit(event) && backupEvent) {\n this.events.set(event.insert_id, backupEvent);\n return;\n }\n }\n }\n\n stop() {\n this.interval && clearInterval(this.interval);\n this.interval = null;\n this.events.clear();\n }\n}\n\nconst DEFAULT_HEARTBEAT_INTERVAL = 60_000;\n// const DEFAULT_HEARTBEAT_INTERVAL = 2_000; // TODO: DO NOT MERGE THIS\nconst DEFAULT_HEARTBEAT_DELAY_TIMEOUT = 3_600_000;\n\ntype HeartbeatMap = Map<CoreClient, Heartbeat>;\n\nconst heartbeatMap: HeartbeatMap = new Map<CoreClient, Heartbeat>();\n\nexport function getHeartbeatInstance(client: CoreClient, logger?: ILogger): Heartbeat {\n const existing = heartbeatMap.get(client);\n if (existing) {\n return existing;\n }\n const heartbeat = new Heartbeat(client, DEFAULT_HEARTBEAT_INTERVAL, DEFAULT_HEARTBEAT_DELAY_TIMEOUT, logger);\n heartbeatMap.set(client, heartbeat);\n return heartbeat;\n}\n"]}
|
package/lib/cjs/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export { AmplitudeContext } from './types/amplitude-context';
|
|
|
5
5
|
export { Identify, IIdentify, ValidPropertyType } from './identify';
|
|
6
6
|
export { Revenue, IRevenue, RevenueProperty } from './revenue';
|
|
7
7
|
export { Destination } from './plugins/destination';
|
|
8
|
+
export { getHeartbeatInstance } from './heartbeat';
|
|
8
9
|
export { IdentityEventSender } from './plugins/identity';
|
|
9
10
|
export { Config, RequestMetadata } from './config';
|
|
10
11
|
export { IConfig } from './types/config/core-config';
|
|
@@ -31,7 +32,7 @@ export { registerSdkLoaderMetadata } from './diagnostics/uncaught-sdk-errors';
|
|
|
31
32
|
export { BaseTransport } from './transports/base';
|
|
32
33
|
export { FetchTransport } from './transports/fetch';
|
|
33
34
|
export { compressToGzipArrayBuffer, isCompressionStreamAvailable, MIN_GZIP_UPLOAD_BODY_SIZE_BYTES, } from './transports/gzip';
|
|
34
|
-
export { RemoteConfigClient, IRemoteConfigClient, RemoteConfig, Source } from './remote-config/remote-config';
|
|
35
|
+
export { RemoteConfigClient, IRemoteConfigClient, RemoteConfig, Source, RemoteConfigFetchRequest, RemoteConfigCustomFetch, } from './remote-config/remote-config';
|
|
35
36
|
export { LogLevel } from './types/loglevel';
|
|
36
37
|
export { AMPLITUDE_PREFIX, STORAGE_PREFIX } from './types/constants';
|
|
37
38
|
export { Storage, IdentityStorageType, CookieStorageConfig } from './types/storage';
|
package/lib/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.isChromeExtension = exports.VideoObserver = exports.EXCLUDE_INTERNAL_REFERRERS_CONDITIONS = exports.AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL = exports.AMPLITUDE_ORIGINS_MAP = exports.AMPLITUDE_ORIGIN_STAGING = exports.AMPLITUDE_ORIGIN_EU = exports.AMPLITUDE_ORIGIN = exports.enableBackgroundCapture = exports.getOrCreateWindowMessenger = exports.safeJsonStringify = exports.multicast = exports.merge = exports.asyncMap = exports.Observable = exports.EMAIL_REGEX = exports.SSN_REGEX = exports.CC_REGEX = exports.replaceSensitiveString = exports.MASKED_TEXT_VALUE = exports.TEXT_MASK_ATTRIBUTE = exports.getPageTitle = exports.CampaignParser = exports.MKTG = exports.BASE_CAMPAIGN = exports.EMPTY_VALUE = exports.FORBIDDEN_HEADERS = exports.SAFE_HEADERS = exports.NetworkRequestEvent = exports.networkObserver = exports.NetworkEventCallback = exports.Status = exports.DEFAULT_DEAD_CLICK_WINDOW_MS = exports.DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = exports.DEFAULT_RAGE_CLICK_WINDOW_MS = exports.DEFAULT_RAGE_CLICK_THRESHOLD = exports.DEFAULT_ERROR_CLICK_ALLOWLIST = exports.DEFAULT_RAGE_CLICK_ALLOWLIST = exports.DEFAULT_DEAD_CLICK_ALLOWLIST = exports.DEFAULT_EXPOSURE_DURATION = exports.DEFAULT_ACTION_CLICK_ALLOWLIST = exports.DEFAULT_DATA_ATTRIBUTE_PREFIX = exports.DEFAULT_CSS_SELECTOR_ALLOWLIST = exports.OfflineDisabled = void 0;
|
|
3
|
+
exports.SpecialEventType = exports.IdentifyOperation = exports.consoleObserver = exports.STORAGE_PREFIX = exports.AMPLITUDE_PREFIX = exports.LogLevel = exports.RemoteConfigClient = exports.MIN_GZIP_UPLOAD_BODY_SIZE_BYTES = exports.isCompressionStreamAvailable = exports.compressToGzipArrayBuffer = exports.FetchTransport = exports.BaseTransport = exports.registerSdkLoaderMetadata = exports.DiagnosticsClient = exports.BrowserStorage = exports.getStorageKey = exports.decodeCookieValue = exports.isDomainEqual = exports.CookieStorage = exports.MemoryStorage = exports.omitUndefined = exports.isTimestampInSample = exports.generateHashCode = exports.getDecodeURI = exports.isUrlMatchAllowlist = exports.createIdentifyEvent = exports.UUID = exports.getClientStates = exports.getClientLogConfig = exports.debugWrapper = exports.returnWrapper = exports.getQueryParams = exports.getLanguage = exports.getOldCookieName = exports.getCookieName = exports.isNewSession = exports.setConnectorUserId = exports.setConnectorDeviceId = exports.getAnalyticsConnector = exports.getGlobalScope = exports.Logger = exports.RequestMetadata = exports.Config = exports.IdentityEventSender = exports.getHeartbeatInstance = exports.Destination = exports.RevenueProperty = exports.Revenue = exports.Identify = exports.AmplitudeCore = void 0;
|
|
4
|
+
exports.isChromeExtension = exports.VideoObserver = exports.EXCLUDE_INTERNAL_REFERRERS_CONDITIONS = exports.AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL = exports.AMPLITUDE_ORIGINS_MAP = exports.AMPLITUDE_ORIGIN_STAGING = exports.AMPLITUDE_ORIGIN_EU = exports.AMPLITUDE_ORIGIN = exports.enableBackgroundCapture = exports.getOrCreateWindowMessenger = exports.safeJsonStringify = exports.multicast = exports.merge = exports.asyncMap = exports.Observable = exports.EMAIL_REGEX = exports.SSN_REGEX = exports.CC_REGEX = exports.replaceSensitiveString = exports.MASKED_TEXT_VALUE = exports.TEXT_MASK_ATTRIBUTE = exports.getPageTitle = exports.CampaignParser = exports.MKTG = exports.BASE_CAMPAIGN = exports.EMPTY_VALUE = exports.FORBIDDEN_HEADERS = exports.SAFE_HEADERS = exports.NetworkRequestEvent = exports.networkObserver = exports.NetworkEventCallback = exports.Status = exports.DEFAULT_DEAD_CLICK_WINDOW_MS = exports.DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = exports.DEFAULT_RAGE_CLICK_WINDOW_MS = exports.DEFAULT_RAGE_CLICK_THRESHOLD = exports.DEFAULT_ERROR_CLICK_ALLOWLIST = exports.DEFAULT_RAGE_CLICK_ALLOWLIST = exports.DEFAULT_DEAD_CLICK_ALLOWLIST = exports.DEFAULT_EXPOSURE_DURATION = exports.DEFAULT_ACTION_CLICK_ALLOWLIST = exports.DEFAULT_DATA_ATTRIBUTE_PREFIX = exports.DEFAULT_CSS_SELECTOR_ALLOWLIST = exports.OfflineDisabled = exports.ServerZone = void 0;
|
|
5
5
|
var core_client_1 = require("./core-client");
|
|
6
6
|
Object.defineProperty(exports, "AmplitudeCore", { enumerable: true, get: function () { return core_client_1.AmplitudeCore; } });
|
|
7
7
|
var identify_1 = require("./identify");
|
|
@@ -11,6 +11,8 @@ Object.defineProperty(exports, "Revenue", { enumerable: true, get: function () {
|
|
|
11
11
|
Object.defineProperty(exports, "RevenueProperty", { enumerable: true, get: function () { return revenue_1.RevenueProperty; } });
|
|
12
12
|
var destination_1 = require("./plugins/destination");
|
|
13
13
|
Object.defineProperty(exports, "Destination", { enumerable: true, get: function () { return destination_1.Destination; } });
|
|
14
|
+
var heartbeat_1 = require("./heartbeat");
|
|
15
|
+
Object.defineProperty(exports, "getHeartbeatInstance", { enumerable: true, get: function () { return heartbeat_1.getHeartbeatInstance; } });
|
|
14
16
|
var identity_1 = require("./plugins/identity");
|
|
15
17
|
Object.defineProperty(exports, "IdentityEventSender", { enumerable: true, get: function () { return identity_1.IdentityEventSender; } });
|
|
16
18
|
var config_1 = require("./config");
|
package/lib/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { AmplitudeCore } from './core-client';\nexport { CoreClient, PluginHost } from './types/client/core-client';\nexport { AnalyticsClient } from './types/client/analytics-client';\nexport { AmplitudeContext } from './types/amplitude-context';\nexport { Identify, IIdentify, ValidPropertyType } from './identify';\nexport { Revenue, IRevenue, RevenueProperty } from './revenue';\nexport { Destination } from './plugins/destination';\nexport { IdentityEventSender } from './plugins/identity';\nexport { Config, RequestMetadata } from './config';\nexport { IConfig } from './types/config/core-config';\nexport { Logger, ILogger, LogConfig } from './logger';\nexport { getGlobalScope } from './global-scope';\nexport { getAnalyticsConnector, setConnectorDeviceId, setConnectorUserId } from './analytics-connector';\nexport { isNewSession } from './session';\nexport { getCookieName, getOldCookieName } from './cookie-name';\nexport { getLanguage } from './language';\nexport { getQueryParams } from './query-params';\n\nexport { returnWrapper, AmplitudeReturn } from './utils/return-wrapper';\nexport { debugWrapper, getClientLogConfig, getClientStates } from './utils/debug';\nexport { UUID } from './utils/uuid';\nexport { createIdentifyEvent } from './utils/event-builder';\nexport { isUrlMatchAllowlist, getDecodeURI } from './utils/url-utils';\nexport { generateHashCode, isTimestampInSample } from './utils/sampling';\nexport { omitUndefined } from './utils/omit-undefined';\n\nexport { MemoryStorage } from './storage/memory';\nexport { CookieStorage, isDomainEqual, decodeCookieValue } from './storage/cookie';\nexport { getStorageKey } from './storage/helpers';\n\nexport { BrowserStorage } from './storage/browser-storage';\n\nexport { DiagnosticsClient, IDiagnosticsClient } from './diagnostics/diagnostics-client';\nexport { registerSdkLoaderMetadata } from './diagnostics/uncaught-sdk-errors';\n\nexport { BaseTransport } from './transports/base';\nexport { FetchTransport } from './transports/fetch';\nexport {\n compressToGzipArrayBuffer,\n isCompressionStreamAvailable,\n MIN_GZIP_UPLOAD_BODY_SIZE_BYTES,\n} from './transports/gzip';\n\nexport { RemoteConfigClient, IRemoteConfigClient, RemoteConfig, Source } from './remote-config/remote-config';\n\nexport { LogLevel } from './types/loglevel';\nexport { AMPLITUDE_PREFIX, STORAGE_PREFIX } from './types/constants';\nexport { Storage, IdentityStorageType, CookieStorageConfig } from './types/storage';\nexport { consoleObserver } from './observers/console';\nexport {\n Event,\n IdentifyOperation,\n SpecialEventType,\n IdentifyEvent,\n GroupIdentifyEvent,\n IdentifyUserProperties,\n} from './types/event/event';\nexport { EventOptions, BaseEvent } from './types/event/base-event';\nexport { IngestionMetadata } from './types/event/ingestion-metadata';\nexport { ServerZoneType, ServerZone } from './types/server-zone';\nexport { OfflineDisabled } from './types/offline';\nexport { Plan } from './types/event/plan';\nexport { TransportType, Transport, TransportOptions, TransportTypeOrOptions } from './types/transport';\nexport { Payload } from './types/payload';\nexport { Response } from './types/response';\nexport { UserSession } from './types/user-session';\nexport {\n Plugin,\n BeforePlugin,\n DestinationPlugin,\n EnrichmentPlugin,\n PluginType,\n AnalyticsIdentity,\n} from './types/plugin';\nexport { Result } from './types/result';\nexport {\n ElementInteractionsOptions,\n Messenger,\n ActionType,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_EXPOSURE_DURATION,\n LabeledEvent,\n Trigger,\n DataSource,\n} from './types/element-interactions';\n\nexport {\n FrustrationInteractionsOptions,\n DEFAULT_DEAD_CLICK_ALLOWLIST,\n DEFAULT_RAGE_CLICK_ALLOWLIST,\n DEFAULT_ERROR_CLICK_ALLOWLIST,\n DEFAULT_RAGE_CLICK_THRESHOLD,\n DEFAULT_RAGE_CLICK_WINDOW_MS,\n DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD,\n DEFAULT_DEAD_CLICK_WINDOW_MS,\n} from './types/frustration-interactions';\nexport { PageTrackingOptions, PageTrackingTrackOn, PageTrackingHistoryChanges } from './types/page-view-tracking';\nexport { FormInteractionsOptions } from './types/form-interactions';\nexport { Status } from './types/status';\n\nexport { NetworkEventCallback, networkObserver } from './observers/network';\nexport { NetworkRequestEvent, IRequestWrapper, JsonObject, JsonValue, JsonArray } from './network-request-event';\nexport { NetworkTrackingOptions, NetworkCaptureRule } from './types/network-tracking';\nexport { SAFE_HEADERS, FORBIDDEN_HEADERS } from './types/constants';\n\nexport { PageUrlEnrichmentOptions } from './types/page-url-enrichment';\nexport { CustomEnrichmentOptions } from './types/custom-enrichment';\nexport { PerformanceTrackingOptions, MainThreadBlockOptions } from './types/performance-tracking';\n\n// Campaign\nexport { Campaign, UTMParameters, ReferrerParameters, ClickIdParameters, ICampaignParser } from './types/campaign';\nexport { EMPTY_VALUE, BASE_CAMPAIGN, MKTG } from './types/constants';\nexport { CampaignParser } from './campaign/campaign-parser';\nexport {\n getPageTitle,\n TEXT_MASK_ATTRIBUTE,\n MASKED_TEXT_VALUE,\n replaceSensitiveString,\n CC_REGEX,\n SSN_REGEX,\n EMAIL_REGEX,\n} from './plugins/helpers';\n\n// Browser\nexport {\n BrowserConfig,\n BrowserOptions,\n DefaultTrackingOptions,\n TrackingOptions,\n TrackingMethod,\n AutocaptureOptions,\n CookieOptions,\n AttributionOptions,\n RemoteConfigOptions,\n} from './types/config/browser-config';\nexport { BrowserClient } from './types/client/browser-client';\n\n// Node\nexport { NodeClient } from './types/client/node-client';\nexport { NodeConfig, NodeOptions } from './types/config/node-config';\n\n// React Native\nexport {\n ReactNativeConfig,\n ReactNativeTrackingOptions,\n ReactNativeOptions,\n ReactNativeAttributionOptions,\n} from './types/config/react-native-config';\nexport { ReactNativeClient } from './types/client/react-native-client';\n\nexport { Observable, asyncMap, merge, multicast, Unsubscribable } from './utils/observable';\n\nexport { InstanceProxy } from './types/proxy';\nexport { safeJsonStringify } from './utils/safe-stringify';\n\n// Messenger (cross-window communication)\nexport type { BaseWindowMessenger, ActionHandler } from './messenger/base-window-messenger';\nexport { getOrCreateWindowMessenger } from './messenger/base-window-messenger';\nexport { enableBackgroundCapture } from './messenger/background-capture';\nexport {\n AMPLITUDE_ORIGIN,\n AMPLITUDE_ORIGIN_EU,\n AMPLITUDE_ORIGIN_STAGING,\n AMPLITUDE_ORIGINS_MAP,\n AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL,\n} from './messenger/constants';\n\nexport { ExcludeInternalReferrersOptions, EXCLUDE_INTERNAL_REFERRERS_CONDITIONS } from './types/config/browser-config';\n\nexport { VideoObserver, State as VideoState, type VideoObserverParams } from './observers/video';\nexport { EmbeddedVideoPlayer, type Vendor as VideoVendor } from './video-analytics/types';\nexport { isChromeExtension } from './utils/environment';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { AmplitudeCore } from './core-client';\nexport { CoreClient, PluginHost } from './types/client/core-client';\nexport { AnalyticsClient } from './types/client/analytics-client';\nexport { AmplitudeContext } from './types/amplitude-context';\nexport { Identify, IIdentify, ValidPropertyType } from './identify';\nexport { Revenue, IRevenue, RevenueProperty } from './revenue';\nexport { Destination } from './plugins/destination';\nexport { getHeartbeatInstance } from './heartbeat';\nexport { IdentityEventSender } from './plugins/identity';\nexport { Config, RequestMetadata } from './config';\nexport { IConfig } from './types/config/core-config';\nexport { Logger, ILogger, LogConfig } from './logger';\nexport { getGlobalScope } from './global-scope';\nexport { getAnalyticsConnector, setConnectorDeviceId, setConnectorUserId } from './analytics-connector';\nexport { isNewSession } from './session';\nexport { getCookieName, getOldCookieName } from './cookie-name';\nexport { getLanguage } from './language';\nexport { getQueryParams } from './query-params';\n\nexport { returnWrapper, AmplitudeReturn } from './utils/return-wrapper';\nexport { debugWrapper, getClientLogConfig, getClientStates } from './utils/debug';\nexport { UUID } from './utils/uuid';\nexport { createIdentifyEvent } from './utils/event-builder';\nexport { isUrlMatchAllowlist, getDecodeURI } from './utils/url-utils';\nexport { generateHashCode, isTimestampInSample } from './utils/sampling';\nexport { omitUndefined } from './utils/omit-undefined';\n\nexport { MemoryStorage } from './storage/memory';\nexport { CookieStorage, isDomainEqual, decodeCookieValue } from './storage/cookie';\nexport { getStorageKey } from './storage/helpers';\n\nexport { BrowserStorage } from './storage/browser-storage';\n\nexport { DiagnosticsClient, IDiagnosticsClient } from './diagnostics/diagnostics-client';\nexport { registerSdkLoaderMetadata } from './diagnostics/uncaught-sdk-errors';\n\nexport { BaseTransport } from './transports/base';\nexport { FetchTransport } from './transports/fetch';\nexport {\n compressToGzipArrayBuffer,\n isCompressionStreamAvailable,\n MIN_GZIP_UPLOAD_BODY_SIZE_BYTES,\n} from './transports/gzip';\n\nexport {\n RemoteConfigClient,\n IRemoteConfigClient,\n RemoteConfig,\n Source,\n RemoteConfigFetchRequest,\n RemoteConfigCustomFetch,\n} from './remote-config/remote-config';\n\nexport { LogLevel } from './types/loglevel';\nexport { AMPLITUDE_PREFIX, STORAGE_PREFIX } from './types/constants';\nexport { Storage, IdentityStorageType, CookieStorageConfig } from './types/storage';\nexport { consoleObserver } from './observers/console';\nexport {\n Event,\n IdentifyOperation,\n SpecialEventType,\n IdentifyEvent,\n GroupIdentifyEvent,\n IdentifyUserProperties,\n} from './types/event/event';\nexport { EventOptions, BaseEvent } from './types/event/base-event';\nexport { IngestionMetadata } from './types/event/ingestion-metadata';\nexport { ServerZoneType, ServerZone } from './types/server-zone';\nexport { OfflineDisabled } from './types/offline';\nexport { Plan } from './types/event/plan';\nexport { TransportType, Transport, TransportOptions, TransportTypeOrOptions } from './types/transport';\nexport { Payload } from './types/payload';\nexport { Response } from './types/response';\nexport { UserSession } from './types/user-session';\nexport {\n Plugin,\n BeforePlugin,\n DestinationPlugin,\n EnrichmentPlugin,\n PluginType,\n AnalyticsIdentity,\n} from './types/plugin';\nexport { Result } from './types/result';\nexport {\n ElementInteractionsOptions,\n Messenger,\n ActionType,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_EXPOSURE_DURATION,\n LabeledEvent,\n Trigger,\n DataSource,\n} from './types/element-interactions';\n\nexport {\n FrustrationInteractionsOptions,\n DEFAULT_DEAD_CLICK_ALLOWLIST,\n DEFAULT_RAGE_CLICK_ALLOWLIST,\n DEFAULT_ERROR_CLICK_ALLOWLIST,\n DEFAULT_RAGE_CLICK_THRESHOLD,\n DEFAULT_RAGE_CLICK_WINDOW_MS,\n DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD,\n DEFAULT_DEAD_CLICK_WINDOW_MS,\n} from './types/frustration-interactions';\nexport { PageTrackingOptions, PageTrackingTrackOn, PageTrackingHistoryChanges } from './types/page-view-tracking';\nexport { FormInteractionsOptions } from './types/form-interactions';\nexport { Status } from './types/status';\n\nexport { NetworkEventCallback, networkObserver } from './observers/network';\nexport { NetworkRequestEvent, IRequestWrapper, JsonObject, JsonValue, JsonArray } from './network-request-event';\nexport { NetworkTrackingOptions, NetworkCaptureRule } from './types/network-tracking';\nexport { SAFE_HEADERS, FORBIDDEN_HEADERS } from './types/constants';\n\nexport { PageUrlEnrichmentOptions } from './types/page-url-enrichment';\nexport { CustomEnrichmentOptions } from './types/custom-enrichment';\nexport { PerformanceTrackingOptions, MainThreadBlockOptions } from './types/performance-tracking';\n\n// Campaign\nexport { Campaign, UTMParameters, ReferrerParameters, ClickIdParameters, ICampaignParser } from './types/campaign';\nexport { EMPTY_VALUE, BASE_CAMPAIGN, MKTG } from './types/constants';\nexport { CampaignParser } from './campaign/campaign-parser';\nexport {\n getPageTitle,\n TEXT_MASK_ATTRIBUTE,\n MASKED_TEXT_VALUE,\n replaceSensitiveString,\n CC_REGEX,\n SSN_REGEX,\n EMAIL_REGEX,\n} from './plugins/helpers';\n\n// Browser\nexport {\n BrowserConfig,\n BrowserOptions,\n DefaultTrackingOptions,\n TrackingOptions,\n TrackingMethod,\n AutocaptureOptions,\n CookieOptions,\n AttributionOptions,\n RemoteConfigOptions,\n} from './types/config/browser-config';\nexport { BrowserClient } from './types/client/browser-client';\n\n// Node\nexport { NodeClient } from './types/client/node-client';\nexport { NodeConfig, NodeOptions } from './types/config/node-config';\n\n// React Native\nexport {\n ReactNativeConfig,\n ReactNativeTrackingOptions,\n ReactNativeOptions,\n ReactNativeAttributionOptions,\n} from './types/config/react-native-config';\nexport { ReactNativeClient } from './types/client/react-native-client';\n\nexport { Observable, asyncMap, merge, multicast, Unsubscribable } from './utils/observable';\n\nexport { InstanceProxy } from './types/proxy';\nexport { safeJsonStringify } from './utils/safe-stringify';\n\n// Messenger (cross-window communication)\nexport type { BaseWindowMessenger, ActionHandler } from './messenger/base-window-messenger';\nexport { getOrCreateWindowMessenger } from './messenger/base-window-messenger';\nexport { enableBackgroundCapture } from './messenger/background-capture';\nexport {\n AMPLITUDE_ORIGIN,\n AMPLITUDE_ORIGIN_EU,\n AMPLITUDE_ORIGIN_STAGING,\n AMPLITUDE_ORIGINS_MAP,\n AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL,\n} from './messenger/constants';\n\nexport { ExcludeInternalReferrersOptions, EXCLUDE_INTERNAL_REFERRERS_CONDITIONS } from './types/config/browser-config';\n\nexport { VideoObserver, State as VideoState, type VideoObserverParams } from './observers/video';\nexport { EmbeddedVideoPlayer, type Vendor as VideoVendor } from './video-analytics/types';\nexport { isChromeExtension } from './utils/environment';\n"]}
|
|
@@ -19,6 +19,24 @@ export type DeliveryMode = 'all' | {
|
|
|
19
19
|
* - `remote` - Fetched from remote.
|
|
20
20
|
*/
|
|
21
21
|
export type Source = 'cache' | 'remote';
|
|
22
|
+
/**
|
|
23
|
+
* The fully-formed remote-config request handed to a custom transport. Consumers that need to
|
|
24
|
+
* own the network call (e.g. to attach auth headers and route through a proxy) supply a
|
|
25
|
+
* {@link RemoteConfigCustomFetch} via the client constructor; the client builds this request
|
|
26
|
+
* (resolved URL, headers, abort signal) and the callback executes it.
|
|
27
|
+
*/
|
|
28
|
+
export interface RemoteConfigFetchRequest {
|
|
29
|
+
url: string;
|
|
30
|
+
method: 'GET';
|
|
31
|
+
headers: Record<string, string>;
|
|
32
|
+
/** Abort signal the client uses to enforce the fetch timeout; honor it in your fetch call. */
|
|
33
|
+
signal?: AbortSignal;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Custom transport for the remote-config fetch. Must return a `Response`. Retry/backoff stays
|
|
37
|
+
* in the client around this callback, so it is invoked once per attempt.
|
|
38
|
+
*/
|
|
39
|
+
export type RemoteConfigCustomFetch = (request: RemoteConfigFetchRequest) => Promise<Response>;
|
|
22
40
|
export declare const US_SERVER_URL = "https://sr-client-cfg.amplitude.com/config";
|
|
23
41
|
export declare const EU_SERVER_URL = "https://sr-client-cfg.eu.amplitude.com/config";
|
|
24
42
|
export declare const DEFAULT_MAX_RETRIES = 3;
|
|
@@ -92,7 +110,8 @@ export declare class RemoteConfigClient implements IRemoteConfigClient {
|
|
|
92
110
|
lastSuccessfulFetch: number | null;
|
|
93
111
|
fetchPromise: Promise<RemoteConfigInfo> | null;
|
|
94
112
|
isLastFetchInvalidApiKey: boolean;
|
|
95
|
-
|
|
113
|
+
readonly customFetch?: RemoteConfigCustomFetch;
|
|
114
|
+
constructor(apiKey: string, logger: ILogger, serverZone?: ServerZoneType, serverUrl?: string, customFetch?: RemoteConfigCustomFetch);
|
|
96
115
|
subscribe(key: string | undefined, deliveryMode: DeliveryMode, callback: RemoteConfigCallback): string;
|
|
97
116
|
unsubscribe(id: string): boolean;
|
|
98
117
|
updateConfigs(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-config.d.ts","sourceRoot":"","sources":["../../../src/remote-config/remote-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExC,eAAO,MAAM,aAAa,+CAA+C,CAAC;AAC1E,eAAO,MAAM,aAAa,kDAAkD,CAAC;AAC7E,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAmBrC,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAElC,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEzC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,YAAY,CAAC,EAAE,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,KAAK,oBAAoB,GAAG,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,KAAK,IAAI,CAAC;AAEzG,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAAC;IAEvG;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAEjC;;OAEG;IACH,aAAa,IAAI,IAAI,CAAC;CACvB;AAED,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,MAAM,CAAC,QAAQ,CAAC,YAAY,aAAa;IAEzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAEtC,aAAa,EAAE,YAAY,EAAE,CAAM;IAEnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,YAAY,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAQ;IAEtD,wBAAwB,UAAS;
|
|
1
|
+
{"version":3,"file":"remote-config.d.ts","sourceRoot":"","sources":["../../../src/remote-config/remote-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,31 @@ exports.RemoteConfigClient = exports.DEFAULT_MAX_RETRIES = exports.EU_SERVER_URL
|
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var remote_config_localstorage_1 = require("./remote-config-localstorage");
|
|
6
6
|
var uuid_1 = require("../utils/uuid");
|
|
7
|
+
/**
|
|
8
|
+
* Settles with `promise`, but rejects with an AbortError when `signal` fires. The request-timeout
|
|
9
|
+
* signal is handed to customFetch, but a transport that ignores it would block the await (and the
|
|
10
|
+
* retry loop) indefinitely; racing the abort guarantees the client-side timeout always applies.
|
|
11
|
+
* The transport's own promise keeps running — we can't cancel it — we just stop awaiting it.
|
|
12
|
+
*/
|
|
13
|
+
function abortableFetch(promise, signal) {
|
|
14
|
+
return new Promise(function (resolve, reject) {
|
|
15
|
+
var onAbort = function () {
|
|
16
|
+
// Match how a native aborted fetch rejects (name 'AbortError') so fetch()'s catch logs it
|
|
17
|
+
// as a timeout; either way the loop retries since the abort doesn't clear shouldRetry.
|
|
18
|
+
var err = new Error('Remote config custom fetch aborted by timeout');
|
|
19
|
+
err.name = 'AbortError';
|
|
20
|
+
reject(err);
|
|
21
|
+
};
|
|
22
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
23
|
+
promise.then(function (value) {
|
|
24
|
+
signal.removeEventListener('abort', onAbort);
|
|
25
|
+
resolve(value);
|
|
26
|
+
}, function (err) {
|
|
27
|
+
signal.removeEventListener('abort', onAbort);
|
|
28
|
+
reject(err);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
7
32
|
exports.US_SERVER_URL = 'https://sr-client-cfg.amplitude.com/config';
|
|
8
33
|
exports.EU_SERVER_URL = 'https://sr-client-cfg.eu.amplitude.com/config';
|
|
9
34
|
exports.DEFAULT_MAX_RETRIES = 3;
|
|
@@ -23,7 +48,7 @@ var DEFAULT_TIMEOUT = 1000;
|
|
|
23
48
|
*/
|
|
24
49
|
var DEFAULT_MIN_TIME_BETWEEN_FETCHES = 5 * 60 * 1000; // 5 minutes
|
|
25
50
|
var RemoteConfigClient = /** @class */ (function () {
|
|
26
|
-
function RemoteConfigClient(apiKey, logger, serverZone, serverUrl) {
|
|
51
|
+
function RemoteConfigClient(apiKey, logger, serverZone, serverUrl, customFetch) {
|
|
27
52
|
if (serverZone === void 0) { serverZone = 'US'; }
|
|
28
53
|
// Registered callbackInfos by subscribe().
|
|
29
54
|
this.callbackInfos = [];
|
|
@@ -37,6 +62,7 @@ var RemoteConfigClient = /** @class */ (function () {
|
|
|
37
62
|
this.serverUrl = serverUrl || (serverZone === 'US' ? exports.US_SERVER_URL : exports.EU_SERVER_URL);
|
|
38
63
|
this.logger = logger;
|
|
39
64
|
this.storage = new remote_config_localstorage_1.RemoteConfigLocalStorage(apiKey, logger);
|
|
65
|
+
this.customFetch = customFetch;
|
|
40
66
|
}
|
|
41
67
|
RemoteConfigClient.prototype.subscribe = function (key, deliveryMode, callback) {
|
|
42
68
|
var id = (0, uuid_1.UUID)();
|
|
@@ -270,29 +296,38 @@ var RemoteConfigClient = /** @class */ (function () {
|
|
|
270
296
|
lastFetch: new Date(),
|
|
271
297
|
};
|
|
272
298
|
_loop_1 = function (attempt) {
|
|
273
|
-
var shouldRetry, abortController, timeoutId, res, body, remoteConfig, error_2;
|
|
274
|
-
return tslib_1.__generator(this, function (
|
|
275
|
-
switch (
|
|
299
|
+
var shouldRetry, abortController, timeoutId, url, headers, res, _b, isSuccess, body, remoteConfig, error_2;
|
|
300
|
+
return tslib_1.__generator(this, function (_c) {
|
|
301
|
+
switch (_c.label) {
|
|
276
302
|
case 0:
|
|
277
303
|
shouldRetry = true;
|
|
278
304
|
abortController = new AbortController();
|
|
279
305
|
timeoutId = setTimeout(function () { return abortController.abort(); }, timeout);
|
|
280
|
-
|
|
306
|
+
_c.label = 1;
|
|
281
307
|
case 1:
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
},
|
|
288
|
-
signal: abortController.signal,
|
|
289
|
-
})];
|
|
308
|
+
_c.trys.push([1, 10, 11, 12]);
|
|
309
|
+
url = this_1.getUrlParams();
|
|
310
|
+
headers = { Accept: '*/*' };
|
|
311
|
+
if (!this_1.customFetch) return [3 /*break*/, 3];
|
|
312
|
+
return [4 /*yield*/, abortableFetch(this_1.customFetch({ url: url, method: 'GET', headers: headers, signal: abortController.signal }), abortController.signal)];
|
|
290
313
|
case 2:
|
|
291
|
-
|
|
292
|
-
|
|
314
|
+
_b = _c.sent();
|
|
315
|
+
return [3 /*break*/, 5];
|
|
316
|
+
case 3: return [4 /*yield*/, fetch(url, {
|
|
317
|
+
method: 'GET',
|
|
318
|
+
headers: headers,
|
|
319
|
+
signal: abortController.signal,
|
|
320
|
+
})];
|
|
321
|
+
case 4:
|
|
322
|
+
_b = _c.sent();
|
|
323
|
+
_c.label = 5;
|
|
324
|
+
case 5:
|
|
325
|
+
res = _b;
|
|
326
|
+
isSuccess = res.ok || (res.status >= 200 && res.status < 300);
|
|
327
|
+
if (!!isSuccess) return [3 /*break*/, 7];
|
|
293
328
|
return [4 /*yield*/, res.text()];
|
|
294
|
-
case
|
|
295
|
-
body =
|
|
329
|
+
case 6:
|
|
330
|
+
body = _c.sent();
|
|
296
331
|
this_1.logger.debug("Remote config client fetch with retry time ".concat(retries, " failed with ").concat(res.status, ": ").concat(body));
|
|
297
332
|
if (res.status === CODE_STATUS.INVALID_API_KEY || res.status === CODE_STATUS.FORBIDDEN) {
|
|
298
333
|
this_1.logger.error("Remote config client fetch failed with ".concat(res.status, ". Invalid API key; future fetches will be skipped."));
|
|
@@ -302,17 +337,17 @@ var RemoteConfigClient = /** @class */ (function () {
|
|
|
302
337
|
else if (res.status >= 400 && res.status < 500 && res.status !== CODE_STATUS.RATE_LIMIT) {
|
|
303
338
|
shouldRetry = false;
|
|
304
339
|
}
|
|
305
|
-
return [3 /*break*/,
|
|
306
|
-
case
|
|
307
|
-
case
|
|
308
|
-
remoteConfig = (
|
|
340
|
+
return [3 /*break*/, 9];
|
|
341
|
+
case 7: return [4 /*yield*/, res.json()];
|
|
342
|
+
case 8:
|
|
343
|
+
remoteConfig = (_c.sent());
|
|
309
344
|
return [2 /*return*/, { value: {
|
|
310
345
|
remoteConfig: remoteConfig,
|
|
311
346
|
lastFetch: new Date(),
|
|
312
347
|
} }];
|
|
313
|
-
case
|
|
314
|
-
case
|
|
315
|
-
error_2 =
|
|
348
|
+
case 9: return [3 /*break*/, 12];
|
|
349
|
+
case 10:
|
|
350
|
+
error_2 = _c.sent();
|
|
316
351
|
// Handle rejects when the request fails, for example, a network error or timeout
|
|
317
352
|
if (error_2 instanceof Error && error_2.name === 'AbortError') {
|
|
318
353
|
this_1.logger.debug("Remote config client fetch with retry time ".concat(retries, " timed out after ").concat(timeout, "ms"));
|
|
@@ -320,21 +355,21 @@ var RemoteConfigClient = /** @class */ (function () {
|
|
|
320
355
|
else {
|
|
321
356
|
this_1.logger.debug("Remote config client fetch with retry time ".concat(retries, " is rejected because: "), error_2);
|
|
322
357
|
}
|
|
323
|
-
return [3 /*break*/,
|
|
324
|
-
case
|
|
358
|
+
return [3 /*break*/, 12];
|
|
359
|
+
case 11:
|
|
325
360
|
// Clear the timeout since request completed or failed
|
|
326
361
|
clearTimeout(timeoutId);
|
|
327
362
|
return [7 /*endfinally*/];
|
|
328
|
-
case
|
|
363
|
+
case 12:
|
|
329
364
|
if (!shouldRetry) {
|
|
330
365
|
return [2 /*return*/, "break"];
|
|
331
366
|
}
|
|
332
|
-
if (!(attempt < retries - 1)) return [3 /*break*/,
|
|
367
|
+
if (!(attempt < retries - 1)) return [3 /*break*/, 14];
|
|
333
368
|
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, _this.getJitterDelay(interval)); })];
|
|
334
|
-
case
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
case
|
|
369
|
+
case 13:
|
|
370
|
+
_c.sent();
|
|
371
|
+
_c.label = 14;
|
|
372
|
+
case 14: return [2 /*return*/];
|
|
338
373
|
}
|
|
339
374
|
});
|
|
340
375
|
};
|