@esri/telemetry-amazon 6.0.0-beta.1 → 6.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/esm/index.js +22 -14
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.test.js +46 -19
- package/dist/esm/index.test.js.map +1 -1
- package/dist/esm/plugins/esri.js +77 -30
- package/dist/esm/plugins/esri.js.map +1 -1
- package/dist/esm/plugins/esri.test.js +80 -13
- package/dist/esm/plugins/esri.test.js.map +1 -1
- package/dist/node/index.js +23 -14
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.test.js +47 -19
- package/dist/node/index.test.js.map +1 -1
- package/dist/node/plugins/esri.js +77 -30
- package/dist/node/plugins/esri.js.map +1 -1
- package/dist/node/plugins/esri.test.js +80 -13
- package/dist/node/plugins/esri.test.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/plugins/esri.d.ts +4 -3
- package/dist/types/types.d.ts +13 -9
- package/dist/umd/telemetry-amazon.js +280 -309
- package/dist/umd/telemetry-amazon.js.map +1 -1
- package/dist/umd/telemetry-amazon.min.js +280 -309
- 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
|
|
@@ -13,26 +15,30 @@ export class Amazon {
|
|
|
13
15
|
this.name = 'amazon';
|
|
14
16
|
this.previousPage = {};
|
|
15
17
|
this.isInitialized = false;
|
|
16
|
-
|
|
17
|
-
const { app = {},
|
|
18
|
-
const { url = 'https://bh1xqvcevk.execute-api.us-east-1.amazonaws.com/akira/v1/apps/1e9a61d8a1e74aa5a6faa9112fd63d70/events', headers = {}, } = endpoint;
|
|
18
|
+
// default to `esri` mode if not specified
|
|
19
|
+
const { app = {}, fips, userPoolID, mode = 'esri' } = options;
|
|
19
20
|
this.mode = mode;
|
|
20
21
|
if (this.mode === 'pinpoint') {
|
|
21
|
-
this.analytics =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
+
],
|
|
27
32
|
});
|
|
28
33
|
}
|
|
29
34
|
else {
|
|
30
35
|
this.analytics = createEsriPlugin({
|
|
31
|
-
url,
|
|
32
|
-
headers,
|
|
33
36
|
trackerName: this.name,
|
|
34
37
|
appName: app.name,
|
|
35
38
|
appVersion: app.version,
|
|
39
|
+
appId: app.id,
|
|
40
|
+
userPoolID,
|
|
41
|
+
fips,
|
|
36
42
|
});
|
|
37
43
|
}
|
|
38
44
|
Object.assign(this, options);
|
|
@@ -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,16 +51,19 @@ 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
|
});
|
|
54
|
-
test('esri mode initializes esri plugin with
|
|
66
|
+
test('esri mode initializes esri plugin with internal endpoint config', () => {
|
|
55
67
|
const esriPlugin = { track: jest.fn(() => true) };
|
|
56
68
|
createEsriPluginMock.mockReturnValue(esriPlugin);
|
|
57
69
|
new Amazon({
|
|
@@ -61,19 +73,34 @@ describe('Amazon', () => {
|
|
|
61
73
|
id: '1234',
|
|
62
74
|
},
|
|
63
75
|
mode: 'esri',
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
76
|
+
});
|
|
77
|
+
expect(createEsriPluginMock).toHaveBeenCalledWith({
|
|
78
|
+
trackerName: 'amazon',
|
|
79
|
+
appName: 'test',
|
|
80
|
+
appVersion: undefined,
|
|
81
|
+
appId: '1234',
|
|
82
|
+
userPoolID: 'pool-id',
|
|
83
|
+
fips: undefined,
|
|
84
|
+
});
|
|
85
|
+
expect(AnalyticsMock).not.toHaveBeenCalled();
|
|
86
|
+
});
|
|
87
|
+
test('esri mode does not throw when userPoolID is missing at runtime', () => {
|
|
88
|
+
new Amazon({
|
|
89
|
+
mode: 'esri',
|
|
90
|
+
app: {
|
|
91
|
+
name: 'test',
|
|
92
|
+
id: '1234',
|
|
67
93
|
},
|
|
68
94
|
});
|
|
69
95
|
expect(createEsriPluginMock).toHaveBeenCalledWith({
|
|
70
|
-
url: 'https://example.com/events',
|
|
71
|
-
headers: { 'x-test': '1' },
|
|
72
96
|
trackerName: 'amazon',
|
|
73
97
|
appName: 'test',
|
|
74
98
|
appVersion: undefined,
|
|
99
|
+
appId: '1234',
|
|
100
|
+
userPoolID: undefined,
|
|
101
|
+
fips: undefined,
|
|
75
102
|
});
|
|
76
|
-
expect(
|
|
103
|
+
expect(AnalyticsMock).not.toHaveBeenCalled();
|
|
77
104
|
});
|
|
78
105
|
});
|
|
79
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC;AAC3B,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,iBAAiB,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;CACzD,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QACtB,IAAI,EAAE,cAAc;KACrB,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;CAClE,CAAC,CAAC,CAAC;AAEJ,MAAM,aAAa,GAAG,SAErB,CAAC;AACF,MAAM,qBAAqB,GACzB,iBAA6E,CAAC;AAChF,MAAM,oBAAoB,GAAG,gBAE5B,CAAC;AAEF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG;YACX,UAAU,EAAE,SAAS;YACrB,IAAI,EAAE,UAAmB;YACzB,GAAG,EAAE;gBACH,IAAI,EAAE,MAAM;gBACZ,EAAE,EAAE,MAAM;aACX;SACF,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CACvB,MAAM,CAAC,gBAAgB,CAAC;YACtB,UAAU,EAAE,SAAS;YACrB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU;SACjB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACxE,MAAM,iBAAiB,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,aAAa,CAAC,eAAe,CAAC,iBAAwB,CAAC,CAAC;QAExD,IAAI,MAAM,CAAC;YACT,UAAU,EAAE,SAAS;YACrB,GAAG,EAAE;gBACH,IAAI,EAAE,MAAM;gBACZ,EAAE,EAAE,MAAM;gBACV,OAAO,EAAE,OAAO;aACjB;YACD,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC;YACjD,IAAI,EAAE,IAAI;YACV,aAAa,EAAE,MAAM;YACrB,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;SACrC,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;YACzC,GAAG,EAAE,MAAM;YACX,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;QAC3E,MAAM,UAAU,GAAkB,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,oBAAoB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC;YACT,UAAU,EAAE,SAAS;YACrB,GAAG,EAAE;gBACH,IAAI,EAAE,MAAM;gBACZ,EAAE,EAAE,MAAM;aACX;YACD,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QAEH,MAAM,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC;YAChD,WAAW,EAAE,QAAQ;YACrB,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,SAAS;YACrB,KAAK,EAAE,MAAM;YACb,UAAU,EAAE,SAAS;YACrB,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;QAC1E,IAAI,MAAM,CAAC;YACT,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE;gBACH,IAAI,EAAE,MAAM;gBACZ,EAAE,EAAE,MAAM;aACX;SACK,CAAC,CAAC;QAEV,MAAM,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC;YAChD,WAAW,EAAE,QAAQ;YACrB,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,SAAS;YACrB,KAAK,EAAE,MAAM;YACb,UAAU,EAAE,SAAS;YACrB,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/esm/plugins/esri.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { AwsClient } from 'aws4fetch';
|
|
2
|
+
import { getCredentials } from '../auth';
|
|
1
3
|
import { debugLog, warnLog, getEndpointId } from './shared';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
return String(value);
|
|
7
|
-
}
|
|
4
|
+
const ESRI_SIGNING_SERVICE = 'execute-api';
|
|
5
|
+
const ESRI_SIGNING_REGION = 'us-east-1';
|
|
6
|
+
const ESRI_ENDPOINT_URL = (appId) => `https://tedev.arcgis.com/v1/apps/${appId}/events`;
|
|
7
|
+
/** Converts a string to a number, guarded against invalid values */
|
|
8
8
|
function getNumber(value, fallback = 0) {
|
|
9
9
|
const numeric = Number(value);
|
|
10
10
|
return Number.isFinite(numeric) ? numeric : fallback;
|
|
@@ -46,6 +46,7 @@ function splitEventData(payload) {
|
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
48
|
function buildBatchEventPayload({ eventName, payload, trackerName, appName, appVersion, }) {
|
|
49
|
+
var _a, _b, _c, _d;
|
|
49
50
|
const endpointId = getEndpointId();
|
|
50
51
|
const sessionId = `${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
51
52
|
const timestamp = new Date().toISOString();
|
|
@@ -55,19 +56,19 @@ function buildBatchEventPayload({ eventName, payload, trackerName, appName, appV
|
|
|
55
56
|
Endpoint: {
|
|
56
57
|
Id: endpointId,
|
|
57
58
|
Device: {
|
|
58
|
-
Make:
|
|
59
|
-
Model:
|
|
59
|
+
Make: (payload === null || payload === void 0 ? void 0 : payload.deviceMake) || '',
|
|
60
|
+
Model: (payload === null || payload === void 0 ? void 0 : payload.deviceModel) || '',
|
|
60
61
|
},
|
|
61
62
|
Location: {
|
|
62
|
-
City:
|
|
63
|
-
Country:
|
|
63
|
+
City: (payload === null || payload === void 0 ? void 0 : payload.city) || '',
|
|
64
|
+
Country: (payload === null || payload === void 0 ? void 0 : payload.country) || '',
|
|
64
65
|
Lat: getNumber(payload === null || payload === void 0 ? void 0 : payload.lat),
|
|
65
66
|
Lon: getNumber(payload === null || payload === void 0 ? void 0 : payload.lon),
|
|
66
67
|
},
|
|
67
68
|
Application: {
|
|
68
|
-
AppTitle:
|
|
69
|
-
AppVersion:
|
|
70
|
-
ClientSdkVersion:
|
|
69
|
+
AppTitle: (_b = (_a = payload === null || payload === void 0 ? void 0 : payload.appTitle) !== null && _a !== void 0 ? _a : appName) !== null && _b !== void 0 ? _b : trackerName,
|
|
70
|
+
AppVersion: (_c = payload === null || payload === void 0 ? void 0 : payload.appVersion) !== null && _c !== void 0 ? _c : appVersion,
|
|
71
|
+
ClientSdkVersion: (_d = payload === null || payload === void 0 ? void 0 : payload.clientSdkVersion) !== null && _d !== void 0 ? _d : trackerName,
|
|
71
72
|
},
|
|
72
73
|
},
|
|
73
74
|
Events: [
|
|
@@ -87,36 +88,81 @@ function buildBatchEventPayload({ eventName, payload, trackerName, appName, appV
|
|
|
87
88
|
},
|
|
88
89
|
};
|
|
89
90
|
}
|
|
90
|
-
export function createEsriPlugin({
|
|
91
|
+
export function createEsriPlugin({ trackerName, appName, appId, appVersion, userPoolID, fips, }) {
|
|
92
|
+
const url = ESRI_ENDPOINT_URL(appId);
|
|
93
|
+
let isDisabled = false;
|
|
94
|
+
let hasWarned = false;
|
|
95
|
+
const warnOnce = (message, details) => {
|
|
96
|
+
if (hasWarned) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
hasWarned = true;
|
|
100
|
+
warnLog(message, details);
|
|
101
|
+
};
|
|
91
102
|
debugLog('createEsriPlugin initialized', {
|
|
92
103
|
trackerName,
|
|
93
104
|
hasUrl: Boolean(url),
|
|
94
|
-
headerCount: Object.keys(headers).length,
|
|
95
105
|
});
|
|
106
|
+
if (!url) {
|
|
107
|
+
isDisabled = true;
|
|
108
|
+
warnOnce('Esri telemetry disabled due to missing internal endpoint URL', {
|
|
109
|
+
trackerName,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (!userPoolID) {
|
|
113
|
+
isDisabled = true;
|
|
114
|
+
warnOnce('Esri telemetry disabled due to missing userPoolID', {
|
|
115
|
+
trackerName,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
if (typeof fetch !== 'function') {
|
|
119
|
+
isDisabled = true;
|
|
120
|
+
warnOnce('Esri telemetry disabled because fetch is unavailable', {
|
|
121
|
+
trackerName,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
96
124
|
return {
|
|
97
125
|
track: (eventName, payload) => {
|
|
98
|
-
if (!url ||
|
|
99
|
-
debugLog('Skipping
|
|
126
|
+
if (isDisabled || !url || !userPoolID) {
|
|
127
|
+
debugLog('Skipping esri track call', {
|
|
100
128
|
eventName,
|
|
101
|
-
reason:
|
|
129
|
+
reason: 'plugin-disabled',
|
|
102
130
|
});
|
|
103
131
|
return false;
|
|
104
132
|
}
|
|
105
|
-
debugLog('Sending endpoint event', {
|
|
133
|
+
debugLog('Sending esri endpoint event', {
|
|
106
134
|
eventName,
|
|
107
135
|
trackerName,
|
|
108
136
|
url,
|
|
109
137
|
});
|
|
110
|
-
void
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
138
|
+
void getCredentials(userPoolID, { fips })
|
|
139
|
+
.then((credentials) => {
|
|
140
|
+
const accessKeyId = (credentials === null || credentials === void 0 ? void 0 : credentials.AccessKeyId) || (credentials === null || credentials === void 0 ? void 0 : credentials.accessKeyId);
|
|
141
|
+
const secretAccessKey = (credentials === null || credentials === void 0 ? void 0 : credentials.SecretKey) || (credentials === null || credentials === void 0 ? void 0 : credentials.secretAccessKey);
|
|
142
|
+
const sessionToken = (credentials === null || credentials === void 0 ? void 0 : credentials.SessionToken) || (credentials === null || credentials === void 0 ? void 0 : credentials.sessionToken);
|
|
143
|
+
if (!accessKeyId || !secretAccessKey) {
|
|
144
|
+
throw new Error('Signed endpoint credentials are missing required key fields.');
|
|
145
|
+
}
|
|
146
|
+
const client = new AwsClient({
|
|
147
|
+
accessKeyId,
|
|
148
|
+
secretAccessKey,
|
|
149
|
+
sessionToken,
|
|
150
|
+
service: ESRI_SIGNING_SERVICE,
|
|
151
|
+
region: ESRI_SIGNING_REGION,
|
|
152
|
+
});
|
|
153
|
+
return client.fetch(url, {
|
|
154
|
+
method: 'POST',
|
|
155
|
+
headers: {
|
|
156
|
+
'Content-Type': 'application/json',
|
|
157
|
+
},
|
|
158
|
+
body: JSON.stringify(buildBatchEventPayload({
|
|
159
|
+
eventName,
|
|
160
|
+
payload: payload,
|
|
161
|
+
trackerName,
|
|
162
|
+
appName,
|
|
163
|
+
appVersion,
|
|
164
|
+
})),
|
|
165
|
+
});
|
|
120
166
|
})
|
|
121
167
|
.then(() => {
|
|
122
168
|
debugLog('Endpoint event sent', {
|
|
@@ -125,7 +171,8 @@ export function createEsriPlugin({ url, headers = {}, trackerName, appName, appV
|
|
|
125
171
|
});
|
|
126
172
|
})
|
|
127
173
|
.catch((error) => {
|
|
128
|
-
|
|
174
|
+
isDisabled = true;
|
|
175
|
+
warnOnce('Esri telemetry disabled after endpoint track failure', {
|
|
129
176
|
eventName,
|
|
130
177
|
trackerName,
|
|
131
178
|
message: (error === null || error === void 0 ? void 0 : error.message) || String(error),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esri.js","sourceRoot":"","sources":["../../../src/plugins/esri.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"esri.js","sourceRoot":"","sources":["../../../src/plugins/esri.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +1,60 @@
|
|
|
1
1
|
import { createEsriPlugin } from './esri';
|
|
2
|
+
import { AwsClient } from 'aws4fetch';
|
|
3
|
+
import { getCredentials } from '../auth';
|
|
4
|
+
const ESRI_ENDPOINT = 'https://tedev.arcgis.com/v1/apps/app-id/events';
|
|
5
|
+
jest.mock('aws4fetch', () => ({
|
|
6
|
+
AwsClient: jest.fn(),
|
|
7
|
+
}));
|
|
8
|
+
jest.mock('../auth', () => ({
|
|
9
|
+
getCredentials: jest.fn(),
|
|
10
|
+
}));
|
|
11
|
+
const AwsClientMock = AwsClient;
|
|
12
|
+
const getCredentialsMock = getCredentials;
|
|
2
13
|
describe('esri plugin', () => {
|
|
14
|
+
let signedFetchMock;
|
|
15
|
+
let warnSpy;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
signedFetchMock = jest.fn().mockResolvedValue({ ok: true, status: 200 });
|
|
18
|
+
AwsClientMock.mockReset();
|
|
19
|
+
AwsClientMock.mockImplementation(() => ({
|
|
20
|
+
fetch: signedFetchMock,
|
|
21
|
+
}));
|
|
22
|
+
getCredentialsMock.mockReset();
|
|
23
|
+
getCredentialsMock.mockResolvedValue({
|
|
24
|
+
AccessKeyId: 'akid',
|
|
25
|
+
SecretKey: 'secret',
|
|
26
|
+
SessionToken: 'token',
|
|
27
|
+
});
|
|
28
|
+
warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => undefined);
|
|
29
|
+
});
|
|
3
30
|
afterEach(() => {
|
|
4
31
|
jest.restoreAllMocks();
|
|
5
32
|
delete globalThis.fetch;
|
|
6
33
|
});
|
|
7
|
-
test('returns false when
|
|
34
|
+
test('returns false and warns once when userPoolID is missing', () => {
|
|
8
35
|
const plugin = createEsriPlugin({
|
|
9
36
|
trackerName: 'amazon',
|
|
37
|
+
appId: 'app-id',
|
|
10
38
|
});
|
|
11
|
-
const
|
|
12
|
-
|
|
39
|
+
const first = plugin.track('pageView', { path: '/home' });
|
|
40
|
+
const second = plugin.track('event', { name: 'test' });
|
|
41
|
+
expect(first).toBe(false);
|
|
42
|
+
expect(second).toBe(false);
|
|
43
|
+
expect(warnSpy).toHaveBeenCalledTimes(1);
|
|
44
|
+
expect(getCredentialsMock).not.toHaveBeenCalled();
|
|
45
|
+
expect(signedFetchMock).not.toHaveBeenCalled();
|
|
13
46
|
});
|
|
14
47
|
test('sends BatchEvent payload envelope with expected field casing', async () => {
|
|
15
|
-
|
|
16
|
-
.fn()
|
|
17
|
-
.mockResolvedValue({ ok: true, status: 200 });
|
|
18
|
-
globalThis.fetch = fetchMock;
|
|
48
|
+
globalThis.fetch = jest.fn();
|
|
19
49
|
jest.spyOn(Date, 'now').mockReturnValue(1716134400000);
|
|
20
50
|
jest.spyOn(Math, 'random').mockReturnValue(0.5);
|
|
21
51
|
const plugin = createEsriPlugin({
|
|
22
|
-
url: 'https://example.com/v1/apps/app-id/events',
|
|
23
|
-
headers: { 'x-test': '1' },
|
|
24
52
|
trackerName: 'amazon',
|
|
25
53
|
appName: 'ArcGIS Telemetry',
|
|
26
54
|
appVersion: '5.1.3',
|
|
55
|
+
appId: 'app-id',
|
|
56
|
+
userPoolID: 'pool-id',
|
|
57
|
+
fips: true,
|
|
27
58
|
});
|
|
28
59
|
const result = plugin.track('pageView', {
|
|
29
60
|
pageUrl: '/home',
|
|
@@ -37,13 +68,20 @@ describe('esri plugin', () => {
|
|
|
37
68
|
expect(result).toBe(true);
|
|
38
69
|
await Promise.resolve();
|
|
39
70
|
await Promise.resolve();
|
|
40
|
-
expect(
|
|
41
|
-
|
|
42
|
-
|
|
71
|
+
expect(getCredentialsMock).toHaveBeenCalledWith('pool-id', { fips: true });
|
|
72
|
+
expect(AwsClientMock).toHaveBeenCalledWith({
|
|
73
|
+
accessKeyId: 'akid',
|
|
74
|
+
secretAccessKey: 'secret',
|
|
75
|
+
sessionToken: 'token',
|
|
76
|
+
service: 'execute-api',
|
|
77
|
+
region: 'us-east-1',
|
|
78
|
+
});
|
|
79
|
+
expect(signedFetchMock).toHaveBeenCalledTimes(1);
|
|
80
|
+
const [url, request] = signedFetchMock.mock.calls[0];
|
|
81
|
+
expect(url).toBe(ESRI_ENDPOINT);
|
|
43
82
|
expect(request.method).toBe('POST');
|
|
44
83
|
expect(request.headers).toEqual({
|
|
45
84
|
'Content-Type': 'application/json',
|
|
46
|
-
'x-test': '1',
|
|
47
85
|
});
|
|
48
86
|
const body = JSON.parse(request.body);
|
|
49
87
|
expect(body.BatchEvent.Endpoint.Attributes).toBeUndefined();
|
|
@@ -90,5 +128,34 @@ describe('esri plugin', () => {
|
|
|
90
128
|
}),
|
|
91
129
|
}));
|
|
92
130
|
});
|
|
131
|
+
test('uses esri endpoint url built from app id', async () => {
|
|
132
|
+
globalThis.fetch = jest.fn();
|
|
133
|
+
const plugin = createEsriPlugin({
|
|
134
|
+
trackerName: 'amazon',
|
|
135
|
+
appId: 'app-id',
|
|
136
|
+
userPoolID: 'pool-id',
|
|
137
|
+
});
|
|
138
|
+
expect(plugin.track('pageView', { pageUrl: '/override' })).toBe(true);
|
|
139
|
+
await Promise.resolve();
|
|
140
|
+
await Promise.resolve();
|
|
141
|
+
const [url] = signedFetchMock.mock.calls[0];
|
|
142
|
+
expect(url).toBe(ESRI_ENDPOINT);
|
|
143
|
+
});
|
|
144
|
+
test('disables telemetry after a send failure and warns only once', async () => {
|
|
145
|
+
globalThis.fetch = jest.fn();
|
|
146
|
+
signedFetchMock.mockRejectedValue(new Error('boom'));
|
|
147
|
+
const plugin = createEsriPlugin({
|
|
148
|
+
trackerName: 'amazon',
|
|
149
|
+
appId: 'app-id',
|
|
150
|
+
userPoolID: 'pool-id',
|
|
151
|
+
});
|
|
152
|
+
expect(plugin.track('pageView', { path: '/home' })).toBe(true);
|
|
153
|
+
await Promise.resolve();
|
|
154
|
+
await Promise.resolve();
|
|
155
|
+
await new Promise((resolve) => process.nextTick(resolve));
|
|
156
|
+
expect(warnSpy).toHaveBeenCalledTimes(1);
|
|
157
|
+
expect(plugin.track('event', { name: 'after-failure' })).toBe(false);
|
|
158
|
+
expect(warnSpy).toHaveBeenCalledTimes(1);
|
|
159
|
+
});
|
|
93
160
|
});
|
|
94
161
|
//# sourceMappingURL=esri.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esri.test.js","sourceRoot":"","sources":["../../../src/plugins/esri.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"esri.test.js","sourceRoot":"","sources":["../../../src/plugins/esri.test.ts"],"names":[],"mappings":"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"}
|