@esri/telemetry-amazon 6.0.0-beta.2 → 6.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/esm/index.js +17 -9
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.test.js +26 -13
- package/dist/esm/index.test.js.map +1 -1
- package/dist/esm/plugins/esri.js +203 -58
- package/dist/esm/plugins/esri.js.map +1 -1
- package/dist/esm/plugins/esri.test.js +125 -3
- package/dist/esm/plugins/esri.test.js.map +1 -1
- package/dist/node/index.js +18 -9
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.test.js +27 -13
- package/dist/node/index.test.js.map +1 -1
- package/dist/node/plugins/esri.js +203 -58
- package/dist/node/plugins/esri.js.map +1 -1
- package/dist/node/plugins/esri.test.js +125 -3
- package/dist/node/plugins/esri.test.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/types.d.ts +4 -2
- package/dist/umd/telemetry-amazon.js +403 -332
- package/dist/umd/telemetry-amazon.js.map +1 -1
- package/dist/umd/telemetry-amazon.min.js +403 -332
- package/dist/umd/telemetry-amazon.min.js.map +1 -1
- package/package.json +3 -1
- package/dist/esm/plugins/pinpoint.js +0 -163
- package/dist/esm/plugins/pinpoint.js.map +0 -1
- package/dist/node/plugins/pinpoint.js +0 -167
- package/dist/node/plugins/pinpoint.js.map +0 -1
- package/dist/types/plugins/pinpoint.d.ts +0 -11
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ import { Amazon } from '@esri/telemetry-amazon';
|
|
|
35
35
|
|
|
36
36
|
const amazonTracker = new Amazon({
|
|
37
37
|
userPoolID: USER_POOL_ID,
|
|
38
|
-
mode: 'pinpoint', // Pinpoint retires on October 30, 2026. Use 'esri' for continued support.
|
|
38
|
+
mode: 'pinpoint', // Pinpoint retires on October 30, 2026. Use 'esri' or omit this field for continued support.
|
|
39
39
|
fips: true, // defaults to false
|
|
40
40
|
app: {
|
|
41
41
|
name: APP_NAME,
|
|
@@ -63,9 +63,9 @@ After initializing `Telemetry.js` with the Amazon plugin, telemetry data will be
|
|
|
63
63
|
|
|
64
64
|
## Amazon Configuration
|
|
65
65
|
|
|
66
|
-
- Get your app and user pool ID from AWS
|
|
66
|
+
- Get your app and user pool ID from AWS
|
|
67
67
|
- Pass in an options object to create an instance of the Amazon plugin
|
|
68
|
-
- the `fips` option determines if AWS FIPS endpoints are used for cognito
|
|
68
|
+
- the `fips` option determines if AWS FIPS endpoints are used for cognito requests
|
|
69
69
|
- Pass in an object containing the mapping for your custom dimensions and metrics
|
|
70
70
|
|
|
71
71
|
```js
|
|
@@ -173,17 +173,17 @@ const result = await Amazon.setAccessPermissions(setAccessParams: ISetAccessPerm
|
|
|
173
173
|
|
|
174
174
|
Amazon Pinpoint will be retired on **October 30, 2026**. After this date, Pinpoint can no longer be used for telemetry delivery. See the [official AWS retirement announcement](https://docs.aws.amazon.com/pinpoint/latest/userguide/migrate.html) for details.
|
|
175
175
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
**Note:** The current default is still Pinpoint mode. For continued support, set `mode: 'esri'` in your tracker configuration:
|
|
176
|
+
By default, the Amazon tracker now sends events to Esri's backend instead of Pinpoint while keeping the same tracker identity. No changes to your plugin configuration are necessary. Prior to Pinpoint's retirement you can set `mode: 'pinpoint'` to restore legacy behavior and/or to verify the shape of the events being logged:
|
|
179
177
|
|
|
180
178
|
```js
|
|
181
179
|
const amazonTracker = new Amazon({
|
|
182
|
-
mode: '
|
|
180
|
+
mode: 'pinpoint',
|
|
183
181
|
....
|
|
184
182
|
});
|
|
185
183
|
```
|
|
186
184
|
|
|
185
|
+
NOTE: After **October 30, 2026** the `mode: 'pinpoint'` property will be a no-op, and all traffic will be routed through the Esri backend.
|
|
186
|
+
|
|
187
187
|
## Issues
|
|
188
188
|
|
|
189
189
|
If something isn't working, please take a look at [previously logged issues](https://devtopia.esri.com/WebGIS/arcgis-telemetry.js/issues) first. Have you found a new bug? Create an issue [here](https://devtopia.esri.com/WebGIS/arcgis-telemetry.js/issues/new).
|
package/dist/esm/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { createEventLog } from './create-event-log';
|
|
2
2
|
import { createPageViewLog } from './create-page-view-log';
|
|
3
|
+
import Analytics from 'analytics';
|
|
4
|
+
import awsPinpointPlugin from '@analytics/aws-pinpoint';
|
|
5
|
+
import { getCredentials } from './auth';
|
|
3
6
|
import { setPortalItemAccessPermissions } from './set-portal-item-access-permissions';
|
|
4
7
|
import { getPortalItemAccessPermissions } from './get-portal-item-access-permissions';
|
|
5
|
-
import { createPinpointPlugin } from './plugins/pinpoint';
|
|
6
8
|
import { createEsriPlugin } from './plugins/esri';
|
|
7
9
|
/**
|
|
8
10
|
* Amazon Telemetry
|
|
@@ -17,12 +19,16 @@ export class Amazon {
|
|
|
17
19
|
const { app = {}, fips, userPoolID, mode = 'esri' } = options;
|
|
18
20
|
this.mode = mode;
|
|
19
21
|
if (this.mode === 'pinpoint') {
|
|
20
|
-
this.analytics =
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
this.analytics = Analytics({
|
|
23
|
+
app: app.name,
|
|
24
|
+
version: app.version,
|
|
25
|
+
plugins: [
|
|
26
|
+
awsPinpointPlugin({
|
|
27
|
+
fips,
|
|
28
|
+
pinpointAppId: app.id,
|
|
29
|
+
getCredentials: () => getCredentials(userPoolID, { fips }),
|
|
30
|
+
}),
|
|
31
|
+
],
|
|
26
32
|
});
|
|
27
33
|
}
|
|
28
34
|
else {
|
|
@@ -66,7 +72,8 @@ export class Amazon {
|
|
|
66
72
|
});
|
|
67
73
|
const { pageUrl, pageName } = telemetryPayload;
|
|
68
74
|
this.previousPage = { pageUrl, pageName };
|
|
69
|
-
|
|
75
|
+
const result = this.analytics.track('pageView', telemetryPayload);
|
|
76
|
+
return typeof result === 'boolean' ? result : true;
|
|
70
77
|
}
|
|
71
78
|
logEvent(event = {}) {
|
|
72
79
|
const telemetryPayload = createEventLog({
|
|
@@ -75,7 +82,8 @@ export class Amazon {
|
|
|
75
82
|
metricLookup: this.metrics,
|
|
76
83
|
});
|
|
77
84
|
const { name } = telemetryPayload;
|
|
78
|
-
|
|
85
|
+
const result = this.analytics.track(name, telemetryPayload);
|
|
86
|
+
return typeof result === 'boolean' ? result : true;
|
|
79
87
|
}
|
|
80
88
|
}
|
|
81
89
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.test.js
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import { Amazon } from '.';
|
|
2
|
-
import
|
|
2
|
+
import Analytics from 'analytics';
|
|
3
|
+
import awsPinpointPlugin from '@analytics/aws-pinpoint';
|
|
3
4
|
import { createEsriPlugin } from './plugins/esri';
|
|
4
|
-
jest.mock('
|
|
5
|
-
|
|
5
|
+
jest.mock('analytics', () => ({
|
|
6
|
+
__esModule: true,
|
|
7
|
+
default: jest.fn(() => ({ track: jest.fn(() => true) })),
|
|
8
|
+
}));
|
|
9
|
+
jest.mock('@analytics/aws-pinpoint', () => ({
|
|
10
|
+
__esModule: true,
|
|
11
|
+
default: jest.fn(() => ({
|
|
12
|
+
name: 'aws-pinpoint',
|
|
13
|
+
})),
|
|
6
14
|
}));
|
|
7
15
|
jest.mock('./plugins/esri', () => ({
|
|
8
16
|
createEsriPlugin: jest.fn(() => ({ track: jest.fn(() => true) })),
|
|
9
17
|
}));
|
|
10
|
-
const
|
|
18
|
+
const AnalyticsMock = Analytics;
|
|
19
|
+
const awsPinpointPluginMock = awsPinpointPlugin;
|
|
11
20
|
const createEsriPluginMock = createEsriPlugin;
|
|
12
21
|
describe('Amazon', () => {
|
|
13
22
|
afterEach(() => {
|
|
@@ -29,9 +38,9 @@ describe('Amazon', () => {
|
|
|
29
38
|
mode: 'pinpoint',
|
|
30
39
|
}));
|
|
31
40
|
});
|
|
32
|
-
test('pinpoint mode initializes pinpoint plugin
|
|
33
|
-
const
|
|
34
|
-
|
|
41
|
+
test('pinpoint mode initializes upstream analytics pinpoint plugin', () => {
|
|
42
|
+
const analyticsInstance = { track: jest.fn(() => true) };
|
|
43
|
+
AnalyticsMock.mockReturnValue(analyticsInstance);
|
|
35
44
|
new Amazon({
|
|
36
45
|
userPoolID: 'pool-id',
|
|
37
46
|
app: {
|
|
@@ -42,12 +51,15 @@ describe('Amazon', () => {
|
|
|
42
51
|
mode: 'pinpoint',
|
|
43
52
|
fips: true,
|
|
44
53
|
});
|
|
45
|
-
expect(
|
|
46
|
-
appName: 'test',
|
|
47
|
-
appVersion: '1.0.0',
|
|
48
|
-
appId: '1234',
|
|
49
|
-
userPoolID: 'pool-id',
|
|
54
|
+
expect(awsPinpointPluginMock).toHaveBeenCalledWith({
|
|
50
55
|
fips: true,
|
|
56
|
+
pinpointAppId: '1234',
|
|
57
|
+
getCredentials: expect.any(Function),
|
|
58
|
+
});
|
|
59
|
+
expect(AnalyticsMock).toHaveBeenCalledWith({
|
|
60
|
+
app: 'test',
|
|
61
|
+
version: '1.0.0',
|
|
62
|
+
plugins: [expect.any(Object)],
|
|
51
63
|
});
|
|
52
64
|
expect(createEsriPluginMock).not.toHaveBeenCalled();
|
|
53
65
|
});
|
|
@@ -70,7 +82,7 @@ describe('Amazon', () => {
|
|
|
70
82
|
userPoolID: 'pool-id',
|
|
71
83
|
fips: undefined,
|
|
72
84
|
});
|
|
73
|
-
expect(
|
|
85
|
+
expect(AnalyticsMock).not.toHaveBeenCalled();
|
|
74
86
|
});
|
|
75
87
|
test('esri mode does not throw when userPoolID is missing at runtime', () => {
|
|
76
88
|
new Amazon({
|
|
@@ -88,6 +100,7 @@ describe('Amazon', () => {
|
|
|
88
100
|
userPoolID: undefined,
|
|
89
101
|
fips: undefined,
|
|
90
102
|
});
|
|
103
|
+
expect(AnalyticsMock).not.toHaveBeenCalled();
|
|
91
104
|
});
|
|
92
105
|
});
|
|
93
106
|
//# sourceMappingURL=index.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/index.test.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/plugins/esri.js
CHANGED
|
@@ -4,6 +4,9 @@ import { debugLog, warnLog, getEndpointId } from './shared';
|
|
|
4
4
|
const ESRI_SIGNING_SERVICE = 'execute-api';
|
|
5
5
|
const ESRI_SIGNING_REGION = 'us-east-1';
|
|
6
6
|
const ESRI_ENDPOINT_URL = (appId) => `https://tedev.arcgis.com/v1/apps/${appId}/events`;
|
|
7
|
+
const SESSION_START_EVENT = '_session.start';
|
|
8
|
+
const SESSION_STOP_EVENT = '_session.stop';
|
|
9
|
+
const DEFAULT_IDLE_TIMEOUT_MS = 30 * 60 * 1000;
|
|
7
10
|
/** Converts a string to a number, guarded against invalid values */
|
|
8
11
|
function getNumber(value, fallback = 0) {
|
|
9
12
|
const numeric = Number(value);
|
|
@@ -45,11 +48,17 @@ function splitEventData(payload) {
|
|
|
45
48
|
metrics,
|
|
46
49
|
};
|
|
47
50
|
}
|
|
48
|
-
function buildBatchEventPayload({ eventName, payload, trackerName, appName, appVersion, }) {
|
|
51
|
+
function buildBatchEventPayload({ eventName, payload, trackerName, appName, appVersion, session, }) {
|
|
49
52
|
var _a, _b, _c, _d;
|
|
50
53
|
const endpointId = getEndpointId();
|
|
51
|
-
const sessionId = `${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
52
54
|
const timestamp = new Date().toISOString();
|
|
55
|
+
const sessionContext = session ||
|
|
56
|
+
{
|
|
57
|
+
id: `${Date.now()}-${Math.random().toString(16).slice(2)}`,
|
|
58
|
+
startTimestamp: timestamp,
|
|
59
|
+
startUnixMs: Date.now(),
|
|
60
|
+
};
|
|
61
|
+
const isStopEvent = eventName === SESSION_STOP_EVENT;
|
|
53
62
|
const { attributes, metrics } = splitEventData(payload);
|
|
54
63
|
return {
|
|
55
64
|
BatchEvent: {
|
|
@@ -76,10 +85,12 @@ function buildBatchEventPayload({ eventName, payload, trackerName, appName, appV
|
|
|
76
85
|
EventType: eventName,
|
|
77
86
|
Timestamp: timestamp,
|
|
78
87
|
Session: {
|
|
79
|
-
Id:
|
|
80
|
-
StartTimestamp:
|
|
88
|
+
Id: sessionContext.id,
|
|
89
|
+
StartTimestamp: sessionContext.startTimestamp,
|
|
81
90
|
EndTimestamp: timestamp,
|
|
82
|
-
Duration:
|
|
91
|
+
Duration: isStopEvent
|
|
92
|
+
? Math.max(0, Date.now() - sessionContext.startUnixMs)
|
|
93
|
+
: 0,
|
|
83
94
|
},
|
|
84
95
|
Attributes: attributes,
|
|
85
96
|
Metrics: metrics,
|
|
@@ -92,6 +103,13 @@ export function createEsriPlugin({ trackerName, appName, appId, appVersion, user
|
|
|
92
103
|
const url = ESRI_ENDPOINT_URL(appId);
|
|
93
104
|
let isDisabled = false;
|
|
94
105
|
let hasWarned = false;
|
|
106
|
+
let hasSessionStarted = false;
|
|
107
|
+
let sessionStopSent = false;
|
|
108
|
+
let activeSession;
|
|
109
|
+
let idleTimerId;
|
|
110
|
+
let lifecycleListenersAttached = false;
|
|
111
|
+
const removeLifecycleListeners = [];
|
|
112
|
+
const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
95
113
|
const warnOnce = (message, details) => {
|
|
96
114
|
if (hasWarned) {
|
|
97
115
|
return;
|
|
@@ -121,64 +139,191 @@ export function createEsriPlugin({ trackerName, appName, appId, appVersion, user
|
|
|
121
139
|
trackerName,
|
|
122
140
|
});
|
|
123
141
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
142
|
+
const clearIdleTimer = () => {
|
|
143
|
+
if (!idleTimerId) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
clearTimeout(idleTimerId);
|
|
147
|
+
idleTimerId = undefined;
|
|
148
|
+
};
|
|
149
|
+
const removeAllLifecycleListeners = () => {
|
|
150
|
+
removeLifecycleListeners.splice(0).forEach((removeListener) => {
|
|
151
|
+
removeListener();
|
|
152
|
+
});
|
|
153
|
+
lifecycleListenersAttached = false;
|
|
154
|
+
};
|
|
155
|
+
const createSession = () => {
|
|
156
|
+
const now = Date.now();
|
|
157
|
+
return {
|
|
158
|
+
id: `${now}-${Math.random().toString(16).slice(2)}`,
|
|
159
|
+
startTimestamp: new Date(now).toISOString(),
|
|
160
|
+
startUnixMs: now,
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
const sendEvent = (eventName, payload, sessionOverride) => {
|
|
164
|
+
if (isDisabled || !url || !userPoolID) {
|
|
165
|
+
debugLog('Skipping esri track call', {
|
|
134
166
|
eventName,
|
|
135
|
-
|
|
136
|
-
url,
|
|
167
|
+
reason: 'plugin-disabled',
|
|
137
168
|
});
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
})
|
|
167
|
-
.then(() => {
|
|
168
|
-
debugLog('Endpoint event sent', {
|
|
169
|
-
eventName,
|
|
170
|
-
trackerName,
|
|
171
|
-
});
|
|
172
|
-
})
|
|
173
|
-
.catch((error) => {
|
|
174
|
-
isDisabled = true;
|
|
175
|
-
warnOnce('Esri telemetry disabled after endpoint track failure', {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
debugLog('Sending esri endpoint event', {
|
|
172
|
+
eventName,
|
|
173
|
+
trackerName,
|
|
174
|
+
url,
|
|
175
|
+
});
|
|
176
|
+
void getCredentials(userPoolID, { fips })
|
|
177
|
+
.then((credentials) => {
|
|
178
|
+
const accessKeyId = (credentials === null || credentials === void 0 ? void 0 : credentials.AccessKeyId) || (credentials === null || credentials === void 0 ? void 0 : credentials.accessKeyId);
|
|
179
|
+
const secretAccessKey = (credentials === null || credentials === void 0 ? void 0 : credentials.SecretKey) || (credentials === null || credentials === void 0 ? void 0 : credentials.secretAccessKey);
|
|
180
|
+
const sessionToken = (credentials === null || credentials === void 0 ? void 0 : credentials.SessionToken) || (credentials === null || credentials === void 0 ? void 0 : credentials.sessionToken);
|
|
181
|
+
if (!accessKeyId || !secretAccessKey) {
|
|
182
|
+
throw new Error('Signed endpoint credentials are missing required key fields.');
|
|
183
|
+
}
|
|
184
|
+
const client = new AwsClient({
|
|
185
|
+
accessKeyId,
|
|
186
|
+
secretAccessKey,
|
|
187
|
+
sessionToken,
|
|
188
|
+
service: ESRI_SIGNING_SERVICE,
|
|
189
|
+
region: ESRI_SIGNING_REGION,
|
|
190
|
+
});
|
|
191
|
+
return client.fetch(url, {
|
|
192
|
+
method: 'POST',
|
|
193
|
+
headers: {
|
|
194
|
+
'Content-Type': 'application/json',
|
|
195
|
+
},
|
|
196
|
+
body: JSON.stringify(buildBatchEventPayload({
|
|
176
197
|
eventName,
|
|
198
|
+
payload: payload,
|
|
177
199
|
trackerName,
|
|
178
|
-
|
|
179
|
-
|
|
200
|
+
appName,
|
|
201
|
+
appVersion,
|
|
202
|
+
session: sessionOverride || activeSession,
|
|
203
|
+
})),
|
|
204
|
+
});
|
|
205
|
+
})
|
|
206
|
+
.then(() => {
|
|
207
|
+
debugLog('Endpoint event sent', {
|
|
208
|
+
eventName,
|
|
209
|
+
trackerName,
|
|
210
|
+
});
|
|
211
|
+
})
|
|
212
|
+
.catch((error) => {
|
|
213
|
+
isDisabled = true;
|
|
214
|
+
clearIdleTimer();
|
|
215
|
+
removeAllLifecycleListeners();
|
|
216
|
+
warnOnce('Esri telemetry disabled after endpoint track failure', {
|
|
217
|
+
eventName,
|
|
218
|
+
trackerName,
|
|
219
|
+
message: (error === null || error === void 0 ? void 0 : error.message) || String(error),
|
|
180
220
|
});
|
|
181
|
-
|
|
221
|
+
});
|
|
222
|
+
return true;
|
|
223
|
+
};
|
|
224
|
+
const sendSessionLifecycleEvent = (eventName, reason, sessionOverride) => {
|
|
225
|
+
return sendEvent(eventName, {
|
|
226
|
+
reason,
|
|
227
|
+
}, sessionOverride);
|
|
228
|
+
};
|
|
229
|
+
const stopSession = (reason) => {
|
|
230
|
+
if (!hasSessionStarted || sessionStopSent) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
const sessionToStop = activeSession;
|
|
234
|
+
const didStop = sendSessionLifecycleEvent(SESSION_STOP_EVENT, reason, sessionToStop);
|
|
235
|
+
if (didStop) {
|
|
236
|
+
sessionStopSent = true;
|
|
237
|
+
hasSessionStarted = false;
|
|
238
|
+
clearIdleTimer();
|
|
239
|
+
activeSession = undefined;
|
|
240
|
+
}
|
|
241
|
+
return didStop;
|
|
242
|
+
};
|
|
243
|
+
const startSession = (reason) => {
|
|
244
|
+
if (hasSessionStarted) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
activeSession = activeSession || createSession();
|
|
248
|
+
const sessionToStart = activeSession;
|
|
249
|
+
const didStart = sendSessionLifecycleEvent(SESSION_START_EVENT, reason, sessionToStart);
|
|
250
|
+
if (didStart) {
|
|
251
|
+
hasSessionStarted = true;
|
|
252
|
+
sessionStopSent = false;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
activeSession = undefined;
|
|
256
|
+
}
|
|
257
|
+
return didStart;
|
|
258
|
+
};
|
|
259
|
+
const resetIdleTimer = () => {
|
|
260
|
+
if (!isBrowser || isDisabled || !hasSessionStarted) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
clearIdleTimer();
|
|
264
|
+
idleTimerId = setTimeout(() => {
|
|
265
|
+
stopSession('idle');
|
|
266
|
+
}, DEFAULT_IDLE_TIMEOUT_MS);
|
|
267
|
+
};
|
|
268
|
+
const handleActivity = () => {
|
|
269
|
+
if (isDisabled) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (!hasSessionStarted) {
|
|
273
|
+
startSession('wakeup');
|
|
274
|
+
}
|
|
275
|
+
resetIdleTimer();
|
|
276
|
+
};
|
|
277
|
+
const addLifecycleListener = (target, eventName, listener) => {
|
|
278
|
+
target.addEventListener(eventName, listener);
|
|
279
|
+
removeLifecycleListeners.push(() => {
|
|
280
|
+
target.removeEventListener(eventName, listener);
|
|
281
|
+
});
|
|
282
|
+
};
|
|
283
|
+
const attachLifecycleListeners = () => {
|
|
284
|
+
if (!isBrowser || lifecycleListenersAttached || isDisabled) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const activityEvents = ['pointerdown', 'keydown', 'scroll', 'focus'];
|
|
288
|
+
activityEvents.forEach((eventName) => {
|
|
289
|
+
addLifecycleListener(window, eventName, handleActivity);
|
|
290
|
+
});
|
|
291
|
+
addLifecycleListener(window, 'beforeunload', () => {
|
|
292
|
+
stopSession('beforeunload');
|
|
293
|
+
});
|
|
294
|
+
lifecycleListenersAttached = true;
|
|
295
|
+
};
|
|
296
|
+
return {
|
|
297
|
+
track: (eventName, payload) => {
|
|
298
|
+
attachLifecycleListeners();
|
|
299
|
+
const isSessionStopEvent = eventName === SESSION_STOP_EVENT;
|
|
300
|
+
if (!hasSessionStarted &&
|
|
301
|
+
eventName !== SESSION_START_EVENT &&
|
|
302
|
+
!isSessionStopEvent) {
|
|
303
|
+
startSession('init');
|
|
304
|
+
}
|
|
305
|
+
if (eventName === SESSION_START_EVENT) {
|
|
306
|
+
activeSession = activeSession || createSession();
|
|
307
|
+
hasSessionStarted = true;
|
|
308
|
+
sessionStopSent = false;
|
|
309
|
+
}
|
|
310
|
+
if (isSessionStopEvent) {
|
|
311
|
+
sessionStopSent = true;
|
|
312
|
+
hasSessionStarted = false;
|
|
313
|
+
clearIdleTimer();
|
|
314
|
+
}
|
|
315
|
+
if (hasSessionStarted && !activeSession && !isSessionStopEvent) {
|
|
316
|
+
activeSession = createSession();
|
|
317
|
+
}
|
|
318
|
+
if (hasSessionStarted && !isSessionStopEvent) {
|
|
319
|
+
resetIdleTimer();
|
|
320
|
+
}
|
|
321
|
+
const sessionForEvent = activeSession;
|
|
322
|
+
const didSend = sendEvent(eventName, payload, sessionForEvent);
|
|
323
|
+
if (isSessionStopEvent && didSend) {
|
|
324
|
+
activeSession = undefined;
|
|
325
|
+
}
|
|
326
|
+
return didSend;
|
|
182
327
|
},
|
|
183
328
|
};
|
|
184
329
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esri.js","sourceRoot":"","sources":["../../../src/plugins/esri.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAW5D,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAC3C,MAAM,mBAAmB,GAAG,WAAW,CAAC;AACxC,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,EAAE,CAC1C,oCAAoC,KAAK,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"esri.js","sourceRoot":"","sources":["../../../src/plugins/esri.ts"],"names":[],"mappings":"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"}
|