@esri/telemetry-amazon 6.0.0-beta.0 → 6.0.0-beta.10

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.
Files changed (78) hide show
  1. package/README.md +26 -9
  2. package/dist/esm/auth.js +22 -31
  3. package/dist/esm/auth.js.map +1 -1
  4. package/dist/esm/create-event-log.js +15 -15
  5. package/dist/esm/create-event-log.js.map +1 -1
  6. package/dist/esm/create-event-log.test.js +50 -8
  7. package/dist/esm/create-event-log.test.js.map +1 -1
  8. package/dist/esm/create-page-view-log.js +1 -6
  9. package/dist/esm/create-page-view-log.js.map +1 -1
  10. package/dist/esm/format-telemetry-attributes.js +8 -4
  11. package/dist/esm/format-telemetry-attributes.js.map +1 -1
  12. package/dist/esm/index.js +43 -19
  13. package/dist/esm/index.js.map +1 -1
  14. package/dist/esm/index.test.js +106 -160
  15. package/dist/esm/index.test.js.map +1 -1
  16. package/dist/esm/plugins/esri.js +419 -0
  17. package/dist/esm/plugins/esri.js.map +1 -0
  18. package/dist/esm/plugins/esri.test.js +556 -0
  19. package/dist/esm/plugins/esri.test.js.map +1 -0
  20. package/dist/esm/plugins/utils/browser.js +97 -0
  21. package/dist/esm/plugins/utils/browser.js.map +1 -0
  22. package/dist/esm/plugins/utils/browser.test.js +130 -0
  23. package/dist/esm/plugins/utils/browser.test.js.map +1 -0
  24. package/dist/esm/plugins/utils/os.js +140 -0
  25. package/dist/esm/plugins/utils/os.js.map +1 -0
  26. package/dist/esm/plugins/utils/os.test.js +54 -0
  27. package/dist/esm/plugins/utils/os.test.js.map +1 -0
  28. package/dist/esm/plugins/utils/shared.js +74 -0
  29. package/dist/esm/plugins/utils/shared.js.map +1 -0
  30. package/dist/esm/types.js +97 -1
  31. package/dist/esm/types.js.map +1 -1
  32. package/dist/node/auth.js +22 -31
  33. package/dist/node/auth.js.map +1 -1
  34. package/dist/node/create-event-log.js +15 -15
  35. package/dist/node/create-event-log.js.map +1 -1
  36. package/dist/node/create-event-log.test.js +50 -8
  37. package/dist/node/create-event-log.test.js.map +1 -1
  38. package/dist/node/create-page-view-log.js +1 -6
  39. package/dist/node/create-page-view-log.js.map +1 -1
  40. package/dist/node/format-telemetry-attributes.js +8 -4
  41. package/dist/node/format-telemetry-attributes.js.map +1 -1
  42. package/dist/node/index.js +43 -19
  43. package/dist/node/index.js.map +1 -1
  44. package/dist/node/index.test.js +106 -160
  45. package/dist/node/index.test.js.map +1 -1
  46. package/dist/node/plugins/esri.js +423 -0
  47. package/dist/node/plugins/esri.js.map +1 -0
  48. package/dist/node/plugins/esri.test.js +559 -0
  49. package/dist/node/plugins/esri.test.js.map +1 -0
  50. package/dist/node/plugins/utils/browser.js +101 -0
  51. package/dist/node/plugins/utils/browser.js.map +1 -0
  52. package/dist/node/plugins/utils/browser.test.js +132 -0
  53. package/dist/node/plugins/utils/browser.test.js.map +1 -0
  54. package/dist/node/plugins/utils/os.js +144 -0
  55. package/dist/node/plugins/utils/os.js.map +1 -0
  56. package/dist/node/plugins/utils/os.test.js +56 -0
  57. package/dist/node/plugins/utils/os.test.js.map +1 -0
  58. package/dist/node/plugins/utils/shared.js +83 -0
  59. package/dist/node/plugins/utils/shared.js.map +1 -0
  60. package/dist/node/types.js +98 -0
  61. package/dist/node/types.js.map +1 -1
  62. package/dist/types/create-event-log.d.ts +2 -2
  63. package/dist/types/create-page-view-log.d.ts +1 -1
  64. package/dist/types/format-telemetry-attributes.d.ts +3 -3
  65. package/dist/types/index.d.ts +14 -7
  66. package/dist/types/plugins/esri.d.ts +6 -0
  67. package/dist/types/plugins/esri.test.d.ts +1 -0
  68. package/dist/types/plugins/utils/browser.d.ts +12 -0
  69. package/dist/types/plugins/utils/browser.test.d.ts +1 -0
  70. package/dist/types/plugins/utils/os.d.ts +5 -0
  71. package/dist/types/plugins/utils/os.test.d.ts +1 -0
  72. package/dist/types/plugins/utils/shared.d.ts +12 -0
  73. package/dist/types/types.d.ts +114 -19
  74. package/dist/umd/telemetry-amazon.js +1253 -141
  75. package/dist/umd/telemetry-amazon.js.map +1 -1
  76. package/dist/umd/telemetry-amazon.min.js +1253 -141
  77. package/dist/umd/telemetry-amazon.min.js.map +1 -1
  78. package/package.json +4 -3
@@ -0,0 +1,423 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEsriPlugin = void 0;
4
+ const aws4fetch_1 = require("aws4fetch");
5
+ const auth_1 = require("../auth");
6
+ const shared_1 = require("./utils/shared");
7
+ const ESRI_SIGNING_SERVICE = 'execute-api';
8
+ const ESRI_SIGNING_REGION = 'us-east-1';
9
+ const ESRI_ENDPOINT_URL = (appId) => `https://tedev.arcgis.com/v1/apps/${appId}/events`;
10
+ const SESSION_START_EVENT = '_session.start';
11
+ const SESSION_STOP_EVENT = '_session.stop';
12
+ const DEFAULT_IDLE_TIMEOUT_MS = 30 * 60 * 1000;
13
+ const DEFAULT_DEBOUNCE_MS = 5000;
14
+ /** Converts a string to a number, guarded against invalid values */
15
+ function getNumber(value, fallback = 0) {
16
+ const numeric = Number(value);
17
+ return Number.isFinite(numeric) ? numeric : fallback;
18
+ }
19
+ /** Splits an EsriBatchEventPayload into attributes and metrics */
20
+ function splitEventData(payload) {
21
+ const attributes = {};
22
+ const metrics = {};
23
+ const excludedKeys = new Set([
24
+ 'name',
25
+ 'appTitle',
26
+ 'appVersion',
27
+ 'clientSdkVersion',
28
+ 'deviceMake',
29
+ 'deviceModel',
30
+ 'city',
31
+ 'country',
32
+ 'lat',
33
+ 'lon',
34
+ ]);
35
+ Object.entries(payload || {}).forEach(([key, value]) => {
36
+ if (excludedKeys.has(key) || value === undefined || value === null) {
37
+ return;
38
+ }
39
+ if (typeof value === 'number' && Number.isFinite(value)) {
40
+ metrics[key] = value;
41
+ return;
42
+ }
43
+ if (typeof value === 'string' || typeof value === 'boolean') {
44
+ attributes[key] = String(value);
45
+ return;
46
+ }
47
+ if (Array.isArray(value) || typeof value === 'object') {
48
+ attributes[key] = JSON.stringify(value);
49
+ }
50
+ });
51
+ return {
52
+ attributes,
53
+ metrics,
54
+ };
55
+ }
56
+ /** Constructs an event payload in the shape expected by the endpoint. */
57
+ function buildBatchEventPayload({ queuedEvents, trackerName, appName, appVersion, }) {
58
+ var _a, _b, _c, _d, _e, _f;
59
+ const endpointEvent = queuedEvents[queuedEvents.length - 1] ||
60
+ {
61
+ payload: {},
62
+ browserInfo: {},
63
+ };
64
+ const payload = endpointEvent.payload || {};
65
+ const browserInfo = endpointEvent.browserInfo || {};
66
+ const endpointId = (0, shared_1.getEndpointId)();
67
+ const location = {};
68
+ if (payload === null || payload === void 0 ? void 0 : payload.city) {
69
+ location.City = payload.city;
70
+ }
71
+ if (payload === null || payload === void 0 ? void 0 : payload.country) {
72
+ location.Country = payload.country;
73
+ }
74
+ if ((payload === null || payload === void 0 ? void 0 : payload.lat) !== undefined && (payload === null || payload === void 0 ? void 0 : payload.lat) !== null) {
75
+ location.Lat = getNumber(payload.lat);
76
+ }
77
+ if ((payload === null || payload === void 0 ? void 0 : payload.lon) !== undefined && (payload === null || payload === void 0 ? void 0 : payload.lon) !== null) {
78
+ location.Lon = getNumber(payload.lon);
79
+ }
80
+ return {
81
+ BatchEvent: {
82
+ Endpoint: {
83
+ Id: endpointId,
84
+ Device: Object.assign({ Locale: (browserInfo === null || browserInfo === void 0 ? void 0 : browserInfo.language) || '', Make: (payload === null || payload === void 0 ? void 0 : payload.deviceMake) || (browserInfo === null || browserInfo === void 0 ? void 0 : browserInfo.make) || '', Model: (payload === null || payload === void 0 ? void 0 : payload.deviceModel) || (browserInfo === null || browserInfo === void 0 ? void 0 : browserInfo.model) || '', ModelVersion: (browserInfo === null || browserInfo === void 0 ? void 0 : browserInfo.version) || '', Platform: ((_a = browserInfo === null || browserInfo === void 0 ? void 0 : browserInfo.os) === null || _a === void 0 ? void 0 : _a.name) || (browserInfo === null || browserInfo === void 0 ? void 0 : browserInfo.platform) || '' }, (((_b = browserInfo === null || browserInfo === void 0 ? void 0 : browserInfo.os) === null || _b === void 0 ? void 0 : _b.version)
85
+ ? { PlatformVersion: browserInfo.os.version }
86
+ : {})),
87
+ Location: location,
88
+ Application: {
89
+ AppTitle: (_d = (_c = payload === null || payload === void 0 ? void 0 : payload.appTitle) !== null && _c !== void 0 ? _c : appName) !== null && _d !== void 0 ? _d : trackerName,
90
+ AppVersion: (_e = payload === null || payload === void 0 ? void 0 : payload.appVersion) !== null && _e !== void 0 ? _e : appVersion,
91
+ ClientSdkVersion: (_f = payload === null || payload === void 0 ? void 0 : payload.clientSdkVersion) !== null && _f !== void 0 ? _f : trackerName,
92
+ },
93
+ },
94
+ Events: queuedEvents.map((queuedEvent) => {
95
+ const timestamp = queuedEvent.timestamp;
96
+ const { attributes, metrics } = splitEventData(queuedEvent.payload);
97
+ const sessionContext = queuedEvent.session ||
98
+ {
99
+ id: `${queuedEvent.unixMs}-${Math.random().toString(16).slice(2)}`,
100
+ startTimestamp: timestamp,
101
+ startUnixMs: queuedEvent.unixMs,
102
+ };
103
+ const isStopEvent = queuedEvent.eventName === SESSION_STOP_EVENT;
104
+ return {
105
+ EventType: queuedEvent.eventName,
106
+ Timestamp: timestamp,
107
+ Session: {
108
+ Id: sessionContext.id,
109
+ StartTimestamp: sessionContext.startTimestamp,
110
+ EndTimestamp: timestamp,
111
+ Duration: isStopEvent
112
+ ? Math.max(0, queuedEvent.unixMs - sessionContext.startUnixMs)
113
+ : 0,
114
+ },
115
+ Attributes: attributes,
116
+ Metrics: metrics,
117
+ };
118
+ }),
119
+ },
120
+ };
121
+ }
122
+ function createEsriPlugin({ trackerName, appName, appId, appVersion, userPoolID, fips, debounceMs = DEFAULT_DEBOUNCE_MS, }) {
123
+ const url = ESRI_ENDPOINT_URL(appId);
124
+ let isDisabled = false;
125
+ let hasWarned = false;
126
+ let hasSessionStarted = false;
127
+ let sessionStopSent = false;
128
+ let activeSession;
129
+ let idleTimerId;
130
+ let debounceTimerId;
131
+ let lifecycleListenersAttached = false;
132
+ const removeLifecycleListeners = [];
133
+ let pendingEvents = [];
134
+ const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
135
+ const warnOnce = (message, details) => {
136
+ if (hasWarned) {
137
+ return;
138
+ }
139
+ hasWarned = true;
140
+ (0, shared_1.warnLog)(message, details);
141
+ };
142
+ (0, shared_1.debugLog)('createEsriPlugin initialized', {
143
+ trackerName,
144
+ hasUrl: Boolean(url),
145
+ });
146
+ if (!url) {
147
+ isDisabled = true;
148
+ warnOnce('Esri telemetry disabled due to missing internal endpoint URL', {
149
+ trackerName,
150
+ });
151
+ }
152
+ if (!userPoolID) {
153
+ isDisabled = true;
154
+ warnOnce('Esri telemetry disabled due to missing userPoolID', {
155
+ trackerName,
156
+ });
157
+ }
158
+ if (typeof fetch !== 'function') {
159
+ isDisabled = true;
160
+ warnOnce('Esri telemetry disabled because fetch is unavailable', {
161
+ trackerName,
162
+ });
163
+ }
164
+ const clearIdleTimer = () => {
165
+ if (!idleTimerId) {
166
+ return;
167
+ }
168
+ clearTimeout(idleTimerId);
169
+ idleTimerId = undefined;
170
+ };
171
+ const clearDebounceTimer = () => {
172
+ if (!debounceTimerId) {
173
+ return;
174
+ }
175
+ clearTimeout(debounceTimerId);
176
+ debounceTimerId = undefined;
177
+ };
178
+ const clearPendingEvents = () => {
179
+ pendingEvents = [];
180
+ };
181
+ const enqueueEvent = (event) => {
182
+ pendingEvents.push(event);
183
+ };
184
+ const dequeuePendingEvents = () => {
185
+ if (pendingEvents.length === 0) {
186
+ return [];
187
+ }
188
+ const queuedEvents = pendingEvents;
189
+ pendingEvents = [];
190
+ return queuedEvents;
191
+ };
192
+ const sendQueuedEvents = (queuedEvents) => {
193
+ var _a;
194
+ if (queuedEvents.length === 0) {
195
+ return;
196
+ }
197
+ if (isDisabled || !url || !userPoolID) {
198
+ (0, shared_1.debugLog)('Skipping esri track call', {
199
+ eventName: (_a = queuedEvents[queuedEvents.length - 1]) === null || _a === void 0 ? void 0 : _a.eventName,
200
+ reason: 'plugin-disabled',
201
+ });
202
+ return;
203
+ }
204
+ (0, shared_1.debugLog)('Sending esri endpoint batch event', {
205
+ trackerName,
206
+ url,
207
+ eventCount: queuedEvents.length,
208
+ });
209
+ void (async () => {
210
+ var _a;
211
+ try {
212
+ const credentials = await (0, auth_1.getCredentials)(userPoolID, { fips });
213
+ const accessKeyId = (credentials === null || credentials === void 0 ? void 0 : credentials.AccessKeyId) || (credentials === null || credentials === void 0 ? void 0 : credentials.accessKeyId);
214
+ const secretAccessKey = (credentials === null || credentials === void 0 ? void 0 : credentials.SecretKey) || (credentials === null || credentials === void 0 ? void 0 : credentials.secretAccessKey);
215
+ const sessionToken = (credentials === null || credentials === void 0 ? void 0 : credentials.SessionToken) || (credentials === null || credentials === void 0 ? void 0 : credentials.sessionToken);
216
+ if (!accessKeyId || !secretAccessKey) {
217
+ throw new Error('Signed endpoint credentials are missing required key fields.');
218
+ }
219
+ const client = new aws4fetch_1.AwsClient({
220
+ accessKeyId,
221
+ secretAccessKey,
222
+ sessionToken,
223
+ service: ESRI_SIGNING_SERVICE,
224
+ region: ESRI_SIGNING_REGION,
225
+ });
226
+ await client.fetch(url, {
227
+ method: 'POST',
228
+ headers: {
229
+ 'Content-Type': 'application/json',
230
+ },
231
+ body: JSON.stringify(buildBatchEventPayload({
232
+ queuedEvents,
233
+ trackerName,
234
+ appName,
235
+ appVersion,
236
+ })),
237
+ });
238
+ (0, shared_1.debugLog)('Endpoint event sent', {
239
+ trackerName,
240
+ eventCount: queuedEvents.length,
241
+ });
242
+ }
243
+ catch (error) {
244
+ isDisabled = true;
245
+ clearIdleTimer();
246
+ clearDebounceTimer();
247
+ clearPendingEvents();
248
+ removeAllLifecycleListeners();
249
+ warnOnce('Esri telemetry disabled after endpoint track failure', {
250
+ eventName: (_a = queuedEvents[queuedEvents.length - 1]) === null || _a === void 0 ? void 0 : _a.eventName,
251
+ trackerName,
252
+ message: (error === null || error === void 0 ? void 0 : error.message) || String(error),
253
+ });
254
+ }
255
+ })();
256
+ };
257
+ const flushPendingEvents = (eventToAppend) => {
258
+ clearDebounceTimer();
259
+ const queuedEvents = dequeuePendingEvents();
260
+ if (eventToAppend) {
261
+ queuedEvents.push(eventToAppend);
262
+ }
263
+ sendQueuedEvents(queuedEvents);
264
+ };
265
+ const scheduleDebounceFlush = () => {
266
+ clearDebounceTimer();
267
+ debounceTimerId = setTimeout(() => {
268
+ flushPendingEvents();
269
+ }, debounceMs);
270
+ };
271
+ const removeAllLifecycleListeners = () => {
272
+ removeLifecycleListeners.splice(0).forEach((removeListener) => {
273
+ removeListener();
274
+ });
275
+ lifecycleListenersAttached = false;
276
+ };
277
+ const createSession = () => {
278
+ const now = Date.now();
279
+ return {
280
+ id: `${now}-${Math.random().toString(16).slice(2)}`,
281
+ startTimestamp: new Date(now).toISOString(),
282
+ startUnixMs: now,
283
+ };
284
+ };
285
+ const sendEvent = (eventName, payload, sessionOverride, options, forceImmediate = false) => {
286
+ if (isDisabled || !url || !userPoolID) {
287
+ (0, shared_1.debugLog)('Skipping esri track call', {
288
+ eventName,
289
+ reason: 'plugin-disabled',
290
+ });
291
+ return false;
292
+ }
293
+ (0, shared_1.debugLog)('Queueing esri endpoint event', {
294
+ eventName,
295
+ trackerName,
296
+ immediate: Boolean((options === null || options === void 0 ? void 0 : options.immediate) || forceImmediate),
297
+ });
298
+ const queuedEvent = {
299
+ eventName,
300
+ payload: payload,
301
+ session: sessionOverride || activeSession,
302
+ browserInfo: (0, shared_1.getBrowserClientInfo)(),
303
+ timestamp: new Date().toISOString(),
304
+ unixMs: Date.now(),
305
+ };
306
+ if ((options === null || options === void 0 ? void 0 : options.immediate) || forceImmediate) {
307
+ flushPendingEvents(queuedEvent);
308
+ }
309
+ else {
310
+ enqueueEvent(queuedEvent);
311
+ scheduleDebounceFlush();
312
+ }
313
+ return true;
314
+ };
315
+ const sendSessionLifecycleEvent = (eventName, reason, sessionOverride) => {
316
+ return sendEvent(eventName, {
317
+ reason,
318
+ }, sessionOverride, undefined, true);
319
+ };
320
+ const stopSession = (reason) => {
321
+ if (!hasSessionStarted || sessionStopSent) {
322
+ return false;
323
+ }
324
+ const sessionToStop = activeSession;
325
+ const didStop = sendSessionLifecycleEvent(SESSION_STOP_EVENT, reason, sessionToStop);
326
+ if (didStop) {
327
+ sessionStopSent = true;
328
+ hasSessionStarted = false;
329
+ clearIdleTimer();
330
+ activeSession = undefined;
331
+ }
332
+ return didStop;
333
+ };
334
+ const startSession = (reason) => {
335
+ if (hasSessionStarted) {
336
+ return false;
337
+ }
338
+ activeSession = activeSession || createSession();
339
+ const sessionToStart = activeSession;
340
+ const didStart = sendSessionLifecycleEvent(SESSION_START_EVENT, reason, sessionToStart);
341
+ if (didStart) {
342
+ hasSessionStarted = true;
343
+ sessionStopSent = false;
344
+ }
345
+ else {
346
+ activeSession = undefined;
347
+ }
348
+ return didStart;
349
+ };
350
+ const resetIdleTimer = () => {
351
+ if (!isBrowser || isDisabled || !hasSessionStarted) {
352
+ return;
353
+ }
354
+ clearIdleTimer();
355
+ idleTimerId = setTimeout(() => {
356
+ stopSession('idle');
357
+ }, DEFAULT_IDLE_TIMEOUT_MS);
358
+ };
359
+ const handleActivity = () => {
360
+ if (isDisabled) {
361
+ return;
362
+ }
363
+ if (!hasSessionStarted) {
364
+ startSession('wakeup');
365
+ }
366
+ resetIdleTimer();
367
+ };
368
+ const addLifecycleListener = (target, eventName, listener) => {
369
+ target.addEventListener(eventName, listener);
370
+ removeLifecycleListeners.push(() => {
371
+ target.removeEventListener(eventName, listener);
372
+ });
373
+ };
374
+ const attachLifecycleListeners = () => {
375
+ if (!isBrowser || lifecycleListenersAttached || isDisabled) {
376
+ return;
377
+ }
378
+ const activityEvents = ['pointerdown', 'keydown', 'scroll', 'focus'];
379
+ activityEvents.forEach((eventName) => {
380
+ addLifecycleListener(window, eventName, handleActivity);
381
+ });
382
+ addLifecycleListener(window, 'beforeunload', () => {
383
+ stopSession('beforeunload');
384
+ });
385
+ lifecycleListenersAttached = true;
386
+ };
387
+ return {
388
+ track: (eventName, payload, options) => {
389
+ void options;
390
+ attachLifecycleListeners();
391
+ const isSessionStopEvent = eventName === SESSION_STOP_EVENT;
392
+ if (!hasSessionStarted &&
393
+ eventName !== SESSION_START_EVENT &&
394
+ !isSessionStopEvent) {
395
+ startSession('init');
396
+ }
397
+ if (eventName === SESSION_START_EVENT) {
398
+ activeSession = activeSession || createSession();
399
+ hasSessionStarted = true;
400
+ sessionStopSent = false;
401
+ }
402
+ if (isSessionStopEvent) {
403
+ sessionStopSent = true;
404
+ hasSessionStarted = false;
405
+ clearIdleTimer();
406
+ }
407
+ if (hasSessionStarted && !activeSession && !isSessionStopEvent) {
408
+ activeSession = createSession();
409
+ }
410
+ if (hasSessionStarted && !isSessionStopEvent) {
411
+ resetIdleTimer();
412
+ }
413
+ const sessionForEvent = activeSession;
414
+ const didSend = sendEvent(eventName, payload, sessionForEvent, options, eventName === SESSION_START_EVENT || eventName === SESSION_STOP_EVENT);
415
+ if (isSessionStopEvent && didSend) {
416
+ activeSession = undefined;
417
+ }
418
+ return didSend;
419
+ },
420
+ };
421
+ }
422
+ exports.createEsriPlugin = createEsriPlugin;
423
+ //# sourceMappingURL=esri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esri.js","sourceRoot":"","sources":["../../../src/plugins/esri.ts"],"names":[],"mappings":"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"}