@amplitude/plugin-network-capture-browser 1.6.14-zen-plus-zoning.0 → 1.6.15

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 (36) hide show
  1. package/lib/cjs/network-capture-plugin.d.ts +7 -1
  2. package/lib/cjs/network-capture-plugin.d.ts.map +1 -1
  3. package/lib/cjs/network-capture-plugin.js +22 -7
  4. package/lib/cjs/network-capture-plugin.js.map +1 -1
  5. package/lib/cjs/track-network-event.d.ts +2 -2
  6. package/lib/cjs/track-network-event.d.ts.map +1 -1
  7. package/lib/cjs/track-network-event.js +4 -3
  8. package/lib/cjs/track-network-event.js.map +1 -1
  9. package/lib/cjs/version.d.ts +1 -1
  10. package/lib/cjs/version.d.ts.map +1 -1
  11. package/lib/cjs/version.js +1 -1
  12. package/lib/cjs/version.js.map +1 -1
  13. package/lib/esm/network-capture-plugin.d.ts +7 -1
  14. package/lib/esm/network-capture-plugin.d.ts.map +1 -1
  15. package/lib/esm/network-capture-plugin.js +22 -7
  16. package/lib/esm/network-capture-plugin.js.map +1 -1
  17. package/lib/esm/track-network-event.d.ts +2 -2
  18. package/lib/esm/track-network-event.d.ts.map +1 -1
  19. package/lib/esm/track-network-event.js +4 -3
  20. package/lib/esm/track-network-event.js.map +1 -1
  21. package/lib/esm/version.d.ts +1 -1
  22. package/lib/esm/version.d.ts.map +1 -1
  23. package/lib/esm/version.js +1 -1
  24. package/lib/esm/version.js.map +1 -1
  25. package/lib/scripts/amplitude-min.js +1 -1
  26. package/lib/scripts/amplitude-min.js.gz +0 -0
  27. package/lib/scripts/amplitude-min.js.map +1 -1
  28. package/lib/scripts/amplitude-min.umd.js +1 -1
  29. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  30. package/lib/scripts/network-capture-plugin.d.ts +7 -1
  31. package/lib/scripts/network-capture-plugin.d.ts.map +1 -1
  32. package/lib/scripts/track-network-event.d.ts +2 -2
  33. package/lib/scripts/track-network-event.d.ts.map +1 -1
  34. package/lib/scripts/version.d.ts +1 -1
  35. package/lib/scripts/version.d.ts.map +1 -1
  36. package/package.json +4 -3
@@ -1,5 +1,11 @@
1
1
  import { BrowserClient, BrowserConfig, EnrichmentPlugin, NetworkRequestEvent, NetworkTrackingOptions } from '@amplitude/analytics-core';
2
- import { Observable } from '@amplitude/analytics-core';
2
+ import { Observable } from 'rxjs';
3
+ import { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';
4
+ declare global {
5
+ interface Window {
6
+ navigation: HasEventTargetAddRemove<Event>;
7
+ }
8
+ }
3
9
  export type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;
4
10
  export declare enum ObservablesEnum {
5
11
  NetworkObservable = "networkObservable"
@@ -1 +1 @@
1
- {"version":3,"file":"network-capture-plugin.d.ts","sourceRoot":"","sources":["../../src/network-capture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EAGnB,sBAAsB,EAEvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAkB,MAAM,2BAA2B,CAAC;AAGvE,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAErF,oBAAY,eAAe;IACzB,iBAAiB,sBAAsB;CACxC;AAGD,KAAK,oBAAoB,CAAC,CAAC,IAAI;IAC7B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CACnF,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,4BAA4B,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG;IACtE,KAAK,EAAE,UAAU,GAAG,KAAK,CAAC;IAC1B,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,sBAAsB,EAAE,OAAO,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9C,CAAC;AAGF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,4BAA4B,CAAC,CAAC,CAAC,CAAC;AAE5F,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC;CACxF;AAID,eAAO,MAAM,oBAAoB,aAAa,sBAAsB,KAAQ,uBA2E3E,CAAC"}
1
+ {"version":3,"file":"network-capture-plugin.d.ts","sourceRoot":"","sources":["../../src/network-capture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EAGnB,sBAAsB,EAEvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAgB,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAG7E,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;KAC5C;CACF;AAED,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAErF,oBAAY,eAAe;IACzB,iBAAiB,sBAAsB;CACxC;AAGD,KAAK,oBAAoB,CAAC,CAAC,IAAI;IAC7B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CACnF,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,4BAA4B,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG;IACtE,KAAK,EAAE,UAAU,GAAG,KAAK,CAAC;IAC1B,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,sBAAsB,EAAE,OAAO,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9C,CAAC;AAGF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,4BAA4B,CAAC,CAAC,CAAC,CAAC;AAE5F,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC;CACxF;AAED,eAAO,MAAM,oBAAoB,aAAa,sBAAsB,KAAQ,uBAgF3E,CAAC"}
@@ -5,18 +5,18 @@ var tslib_1 = require("tslib");
5
5
  /* eslint-disable no-restricted-globals */
6
6
  var analytics_core_1 = require("@amplitude/analytics-core");
7
7
  var constants = tslib_1.__importStar(require("./constants"));
8
- var analytics_core_2 = require("@amplitude/analytics-core");
8
+ var rxjs_1 = require("rxjs");
9
9
  var track_network_event_1 = require("./track-network-event");
10
10
  var ObservablesEnum;
11
11
  (function (ObservablesEnum) {
12
12
  ObservablesEnum["NetworkObservable"] = "networkObservable";
13
13
  })(ObservablesEnum = exports.ObservablesEnum || (exports.ObservablesEnum = {}));
14
- var subscription;
15
14
  var networkCapturePlugin = function (options) {
16
15
  if (options === void 0) { options = {}; }
17
16
  var name = constants.PLUGIN_NAME;
18
17
  var type = 'enrichment';
19
18
  var logger;
19
+ var subscriptions = [];
20
20
  var addAdditionalEventProperties = function (event, type) {
21
21
  var baseEvent = {
22
22
  event: event,
@@ -28,7 +28,7 @@ var networkCapturePlugin = function (options) {
28
28
  // Create observables on events on the window
29
29
  var createObservables = function () {
30
30
  var _a;
31
- var networkObservable = new analytics_core_2.Observable(function (observer) {
31
+ var networkObservable = new rxjs_1.Observable(function (observer) {
32
32
  var callback = new analytics_core_1.NetworkEventCallback(function (event) {
33
33
  var eventWithProperties = addAdditionalEventProperties(event, 'network');
34
34
  observer.next(eventWithProperties);
@@ -43,7 +43,7 @@ var networkCapturePlugin = function (options) {
43
43
  _a;
44
44
  };
45
45
  var setup = function (config, amplitude) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
46
- var allObservables;
46
+ var allObservables, networkRequestSubscription;
47
47
  return tslib_1.__generator(this, function (_a) {
48
48
  /* istanbul ignore if */
49
49
  if (typeof document === 'undefined') {
@@ -52,12 +52,13 @@ var networkCapturePlugin = function (options) {
52
52
  allObservables = createObservables();
53
53
  /* istanbul ignore next */
54
54
  logger = config === null || config === void 0 ? void 0 : config.loggerProvider;
55
- subscription = (0, track_network_event_1.trackNetworkEvents)({
55
+ networkRequestSubscription = (0, track_network_event_1.trackNetworkEvents)({
56
56
  allObservables: allObservables,
57
57
  networkTrackingOptions: options,
58
58
  amplitude: amplitude,
59
59
  loggerProvider: logger,
60
60
  });
61
+ subscriptions.push(networkRequestSubscription);
61
62
  /* istanbul ignore next */
62
63
  logger === null || logger === void 0 ? void 0 : logger.log("".concat(name, " has been successfully added."));
63
64
  return [2 /*return*/];
@@ -70,8 +71,22 @@ var networkCapturePlugin = function (options) {
70
71
  });
71
72
  }); };
72
73
  var teardown = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
73
- return tslib_1.__generator(this, function (_a) {
74
- subscription.unsubscribe();
74
+ var subscriptions_1, subscriptions_1_1, subscription;
75
+ var e_1, _a;
76
+ return tslib_1.__generator(this, function (_b) {
77
+ try {
78
+ for (subscriptions_1 = tslib_1.__values(subscriptions), subscriptions_1_1 = subscriptions_1.next(); !subscriptions_1_1.done; subscriptions_1_1 = subscriptions_1.next()) {
79
+ subscription = subscriptions_1_1.value;
80
+ subscription.unsubscribe();
81
+ }
82
+ }
83
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
84
+ finally {
85
+ try {
86
+ if (subscriptions_1_1 && !subscriptions_1_1.done && (_a = subscriptions_1.return)) _a.call(subscriptions_1);
87
+ }
88
+ finally { if (e_1) throw e_1.error; }
89
+ }
75
90
  return [2 /*return*/];
76
91
  });
77
92
  }); };
@@ -1 +1 @@
1
- {"version":3,"file":"network-capture-plugin.js","sourceRoot":"","sources":["../../src/network-capture-plugin.ts"],"names":[],"mappings":";;;;AAAA,0CAA0C;AAC1C,4DASmC;AACnC,6DAAyC;AACzC,4DAAuE;AACvE,6DAA2D;AAI3D,IAAY,eAEX;AAFD,WAAY,eAAe;IACzB,0DAAuC,CAAA;AACzC,CAAC,EAFW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAE1B;AAyBD,IAAI,YAA4B,CAAC;AAE1B,IAAM,oBAAoB,GAAG,UAAC,OAAoC;IAApC,wBAAA,EAAA,YAAoC;IACvE,IAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC;IACnC,IAAM,IAAI,GAAG,YAAY,CAAC;IAC1B,IAAI,MAAe,CAAC;IAEpB,IAAM,4BAA4B,GAAG,UACnC,KAAQ,EACR,IAAiC;QAEjC,IAAM,SAAS,GAA8D;YAC3E,KAAK,OAAA;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,MAAA;SACL,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,6CAA6C;IAC7C,IAAM,iBAAiB,GAAG;;QACxB,IAAM,iBAAiB,GAAG,IAAI,2BAAU,CAAwC,UAAC,QAAQ;YACvF,IAAM,QAAQ,GAAG,IAAI,qCAAoB,CAAC,UAAC,KAAK;gBAC9C,IAAM,mBAAmB,GAAG,4BAA4B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAC3E,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,gCAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO;gBACL,gCAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH;YACE,GAAC,eAAe,CAAC,iBAAiB,IAAG,iBAAiB;eACtD;IACJ,CAAC,CAAC;IAEF,IAAM,KAAK,GAAqC,UAAO,MAAM,EAAE,SAAS;;;YACtE,wBAAwB;YACxB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;gBACnC,sBAAO;aACR;YAGK,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAE3C,0BAA0B;YAC1B,MAAM,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,CAAC;YAEhC,YAAY,GAAG,IAAA,wCAAkB,EAAC;gBAChC,cAAc,gBAAA;gBACd,sBAAsB,EAAE,OAAO;gBAC/B,SAAS,WAAA;gBACT,cAAc,EAAE,MAAM;aACvB,CAAC,CAAC;YAEH,0BAA0B;YAC1B,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,CAAC,UAAG,IAAI,kCAA+B,CAAC,CAAC;;;SACrD,CAAC;IAEF,0BAA0B;IAC1B,IAAM,OAAO,GAAuC,UAAO,KAAK;;YAC9D,sBAAO,KAAK,EAAC;;SACd,CAAC;IAEF,IAAM,QAAQ,GAAG;;YACf,YAAY,CAAC,WAAW,EAAE,CAAC;;;SAC5B,CAAC;IAEF,OAAO;QACL,IAAI,MAAA;QACJ,IAAI,MAAA;QACJ,KAAK,OAAA;QACL,OAAO,SAAA;QACP,QAAQ,UAAA;KACT,CAAC;AACJ,CAAC,CAAC;AA3EW,QAAA,oBAAoB,wBA2E/B","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n NetworkRequestEvent,\n networkObserver,\n NetworkEventCallback,\n NetworkTrackingOptions,\n ILogger,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { Observable, Unsubscribable } from '@amplitude/analytics-core';\nimport { trackNetworkEvents } from './track-network-event';\n\nexport type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport enum ObservablesEnum {\n NetworkObservable = 'networkObservable',\n}\n\n// Base TimestampedEvent type\ntype BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation' | 'network';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\nexport interface AllWindowObservables {\n [ObservablesEnum.NetworkObservable]: Observable<TimestampedEvent<NetworkRequestEvent>>;\n}\n\nlet subscription: Unsubscribable;\n\nexport const networkCapturePlugin = (options: NetworkTrackingOptions = {}): BrowserEnrichmentPlugin => {\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n let logger: ILogger;\n\n const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n return baseEvent;\n };\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n const networkObservable = new Observable<TimestampedEvent<NetworkRequestEvent>>((observer) => {\n const callback = new NetworkEventCallback((event) => {\n const eventWithProperties = addAdditionalEventProperties(event, 'network');\n observer.next(eventWithProperties);\n });\n networkObserver.subscribe(callback, logger);\n return () => {\n networkObserver.unsubscribe(callback);\n };\n });\n\n return {\n [ObservablesEnum.NetworkObservable]: networkObservable,\n };\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n /* istanbul ignore next */\n logger = config?.loggerProvider;\n\n subscription = trackNetworkEvents({\n allObservables,\n networkTrackingOptions: options,\n amplitude,\n loggerProvider: logger,\n });\n\n /* istanbul ignore next */\n logger?.log(`${name} has been successfully added.`);\n };\n\n /* istanbul ignore next */\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n subscription.unsubscribe();\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
1
+ {"version":3,"file":"network-capture-plugin.js","sourceRoot":"","sources":["../../src/network-capture-plugin.ts"],"names":[],"mappings":";;;;AAAA,0CAA0C;AAC1C,4DASmC;AACnC,6DAAyC;AACzC,6BAAgD;AAEhD,6DAA2D;AAU3D,IAAY,eAEX;AAFD,WAAY,eAAe;IACzB,0DAAuC,CAAA;AACzC,CAAC,EAFW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAE1B;AAyBM,IAAM,oBAAoB,GAAG,UAAC,OAAoC;IAApC,wBAAA,EAAA,YAAoC;IACvE,IAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC;IACnC,IAAM,IAAI,GAAG,YAAY,CAAC;IAC1B,IAAI,MAAe,CAAC;IAEpB,IAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,IAAM,4BAA4B,GAAG,UACnC,KAAQ,EACR,IAAiC;QAEjC,IAAM,SAAS,GAA8D;YAC3E,KAAK,OAAA;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,MAAA;SACL,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,6CAA6C;IAC7C,IAAM,iBAAiB,GAAG;;QACxB,IAAM,iBAAiB,GAAG,IAAI,iBAAU,CAAwC,UAAC,QAAQ;YACvF,IAAM,QAAQ,GAAG,IAAI,qCAAoB,CAAC,UAAC,KAAK;gBAC9C,IAAM,mBAAmB,GAAG,4BAA4B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAC3E,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,gCAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO;gBACL,gCAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH;YACE,GAAC,eAAe,CAAC,iBAAiB,IAAG,iBAAiB;eACtD;IACJ,CAAC,CAAC;IAEF,IAAM,KAAK,GAAqC,UAAO,MAAM,EAAE,SAAS;;;YACtE,wBAAwB;YACxB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;gBACnC,sBAAO;aACR;YAGK,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAE3C,0BAA0B;YAC1B,MAAM,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,CAAC;YAE1B,0BAA0B,GAAG,IAAA,wCAAkB,EAAC;gBACpD,cAAc,gBAAA;gBACd,sBAAsB,EAAE,OAAO;gBAC/B,SAAS,WAAA;gBACT,cAAc,EAAE,MAAM;aACvB,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAE/C,0BAA0B;YAC1B,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,CAAC,UAAG,IAAI,kCAA+B,CAAC,CAAC;;;SACrD,CAAC;IAEF,0BAA0B;IAC1B,IAAM,OAAO,GAAuC,UAAO,KAAK;;YAC9D,sBAAO,KAAK,EAAC;;SACd,CAAC;IAEF,IAAM,QAAQ,GAAG;;;;;gBACf,KAA2B,kBAAA,iBAAA,aAAa,CAAA,mHAAE;oBAA/B,YAAY;oBACrB,YAAY,CAAC,WAAW,EAAE,CAAC;iBAC5B;;;;;;;;;;;SACF,CAAC;IAEF,OAAO;QACL,IAAI,MAAA;QACJ,IAAI,MAAA;QACJ,KAAK,OAAA;QACL,OAAO,SAAA;QACP,QAAQ,UAAA;KACT,CAAC;AACJ,CAAC,CAAC;AAhFW,QAAA,oBAAoB,wBAgF/B","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n NetworkRequestEvent,\n networkObserver,\n NetworkEventCallback,\n NetworkTrackingOptions,\n ILogger,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { Observable, Subscription } from 'rxjs';\nimport { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';\nimport { trackNetworkEvents } from './track-network-event';\n\ndeclare global {\n interface Window {\n navigation: HasEventTargetAddRemove<Event>;\n }\n}\n\nexport type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport enum ObservablesEnum {\n NetworkObservable = 'networkObservable',\n}\n\n// Base TimestampedEvent type\ntype BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation' | 'network';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\nexport interface AllWindowObservables {\n [ObservablesEnum.NetworkObservable]: Observable<TimestampedEvent<NetworkRequestEvent>>;\n}\n\nexport const networkCapturePlugin = (options: NetworkTrackingOptions = {}): BrowserEnrichmentPlugin => {\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n let logger: ILogger;\n\n const subscriptions: Subscription[] = [];\n\n const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n return baseEvent;\n };\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n const networkObservable = new Observable<TimestampedEvent<NetworkRequestEvent>>((observer) => {\n const callback = new NetworkEventCallback((event) => {\n const eventWithProperties = addAdditionalEventProperties(event, 'network');\n observer.next(eventWithProperties);\n });\n networkObserver.subscribe(callback, logger);\n return () => {\n networkObserver.unsubscribe(callback);\n };\n });\n\n return {\n [ObservablesEnum.NetworkObservable]: networkObservable,\n };\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n /* istanbul ignore next */\n logger = config?.loggerProvider;\n\n const networkRequestSubscription = trackNetworkEvents({\n allObservables,\n networkTrackingOptions: options,\n amplitude,\n loggerProvider: logger,\n });\n subscriptions.push(networkRequestSubscription);\n\n /* istanbul ignore next */\n logger?.log(`${name} has been successfully added.`);\n };\n\n /* istanbul ignore next */\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { BrowserClient, NetworkRequestEvent, NetworkTrackingOptions, ILogger, Unsubscribable } from '@amplitude/analytics-core';
1
+ import { BrowserClient, NetworkRequestEvent, NetworkTrackingOptions, ILogger } from '@amplitude/analytics-core';
2
2
  import { AllWindowObservables } from './network-capture-plugin';
3
3
  /**
4
4
  * Takes a user provided header capture rule and returns a
@@ -32,5 +32,5 @@ export declare function trackNetworkEvents({ allObservables, networkTrackingOpti
32
32
  networkTrackingOptions: NetworkTrackingOptions;
33
33
  amplitude: BrowserClient;
34
34
  loggerProvider?: ILogger;
35
- }): Unsubscribable;
35
+ }): import("rxjs").Subscription;
36
36
  //# sourceMappingURL=track-network-event.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-network-event.d.ts","sourceRoot":"","sources":["../../src/track-network-event.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EAEnB,sBAAsB,EAItB,OAAO,EAEP,cAAc,EACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAoB,MAAM,0BAA0B,CAAC;AA8GlF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,EAAE,GAAG,SAAS,CAmBxG;AAOD,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,mBAAmB,EAAE,OAAO,GAAE,sBAA2B,WA2F9G;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,uBAAuB,CAAC,CAAC,EAAE,MAAM,CAAC;IACnC,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC;IACtC,CAAC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACvC,CAAC,yBAAyB,CAAC,CAAC,EAAE,MAAM,CAAC;IACrC,CAAC,wBAAwB,CAAC,CAAC,EAAE,MAAM,CAAC;IACpC,CAAC,6BAA6B,CAAC,CAAC,EAAE,MAAM,CAAC;IACzC,CAAC,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC;IAClC,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC;IAC3C,CAAC,6BAA6B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC;IACtC,CAAC,gCAAgC,CAAC,CAAC,EAAE,MAAM,CAAC;IAC5C,CAAC,8BAA8B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC;IACvC,CAAC,0BAA0B,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;CAChD,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,aAAa,EACxB,cAAc,CAAC,EAAE,OAAO,iBAuBzB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,cAAc,EACd,sBAAsB,EACtB,SAAS,EACT,cAAc,GACf,EAAE;IACD,cAAc,EAAE,oBAAoB,CAAC;IACrC,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,cAAc,CA6CjB"}
1
+ {"version":3,"file":"track-network-event.d.ts","sourceRoot":"","sources":["../../src/track-network-event.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EAEnB,sBAAsB,EAItB,OAAO,EACR,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,oBAAoB,EAAoB,MAAM,0BAA0B,CAAC;AA+GlF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,EAAE,GAAG,SAAS,CAmBxG;AAOD,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,mBAAmB,EAAE,OAAO,GAAE,sBAA2B,WA2F9G;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,uBAAuB,CAAC,CAAC,EAAE,MAAM,CAAC;IACnC,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC;IACtC,CAAC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACvC,CAAC,yBAAyB,CAAC,CAAC,EAAE,MAAM,CAAC;IACrC,CAAC,wBAAwB,CAAC,CAAC,EAAE,MAAM,CAAC;IACpC,CAAC,6BAA6B,CAAC,CAAC,EAAE,MAAM,CAAC;IACzC,CAAC,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC;IAClC,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC;IAC3C,CAAC,6BAA6B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC;IACtC,CAAC,gCAAgC,CAAC,CAAC,EAAE,MAAM,CAAC;IAC5C,CAAC,8BAA8B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC;IACvC,CAAC,0BAA0B,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;CAChD,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,aAAa,EACxB,cAAc,CAAC,EAAE,OAAO,iBAuBzB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,cAAc,EACd,sBAAsB,EACtB,SAAS,EACT,cAAc,GACf,EAAE;IACD,cAAc,EAAE,oBAAoB,CAAC;IACrC,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,+BA+CA"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.trackNetworkEvents = exports.logNetworkAnalyticsEvent = exports.shouldTrackNetworkEvent = exports.parseHeaderCaptureRule = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var analytics_core_1 = require("@amplitude/analytics-core");
6
+ var rxjs_1 = require("rxjs");
6
7
  var constants_1 = require("./constants");
7
8
  var DEFAULT_STATUS_CODE_RANGE = '500-599';
8
9
  function wildcardMatch(str, pattern) {
@@ -250,10 +251,10 @@ exports.logNetworkAnalyticsEvent = logNetworkAnalyticsEvent;
250
251
  function trackNetworkEvents(_a) {
251
252
  var allObservables = _a.allObservables, networkTrackingOptions = _a.networkTrackingOptions, amplitude = _a.amplitude, loggerProvider = _a.loggerProvider;
252
253
  var networkObservable = allObservables.networkObservable;
253
- var filteredNetworkObservable = networkObservable.filter(function (event) {
254
- // Only track network events that should be tracked
254
+ var filteredNetworkObservable = networkObservable.pipe((0, rxjs_1.filter)(function (event) {
255
+ // Only track network events that should be tracked,
255
256
  return shouldTrackNetworkEvent(event.event, networkTrackingOptions);
256
- });
257
+ }));
257
258
  return filteredNetworkObservable.subscribe(function (networkEvent) {
258
259
  var _a;
259
260
  var _b, _c;
@@ -1 +1 @@
1
- {"version":3,"file":"track-network-event.js","sourceRoot":"","sources":["../../src/track-network-event.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BrowserClient,\n NetworkRequestEvent,\n NetworkCaptureRule,\n NetworkTrackingOptions,\n getGlobalScope,\n isUrlMatchAllowlist,\n SAFE_HEADERS,\n ILogger,\n IRequestWrapper,\n Unsubscribable,\n} from '@amplitude/analytics-core';\nimport { AllWindowObservables, TimestampedEvent } from './network-capture-plugin';\nimport { AMPLITUDE_NETWORK_REQUEST_EVENT, IS_HEADER_CAPTURE_EXPERIMENTAL } from './constants';\nimport { BodyCaptureRule } from '@amplitude/analytics-core/lib/esm/types/network-tracking';\n\nconst DEFAULT_STATUS_CODE_RANGE = '500-599';\n\nfunction wildcardMatch(str: string, pattern: string) {\n // Escape all regex special characters except for *\n const escapedPattern = pattern.replace(/[-[\\]{}()+?.,\\\\^$|#\\s]/g, '\\\\$&');\n // Replace * with .*\n const regexPattern = '^' + escapedPattern.replace(/\\*/g, '.*') + '$';\n const regex = new RegExp(regexPattern);\n return regex.test(str);\n}\n\nfunction isStatusCodeInRange(statusCode: number, range: string) {\n const ranges = range.split(',');\n for (const r of ranges) {\n const [start, end] = r.split('-').map(Number);\n if (statusCode === start && end === undefined) {\n return true;\n }\n if (statusCode >= start && statusCode <= end) {\n return true;\n }\n }\n return false;\n}\n\nfunction isCaptureRuleMatch(\n rule: NetworkCaptureRule,\n hostname: string,\n status?: number,\n url?: string,\n method?: string,\n) {\n // check if the host is in the allowed hosts\n if (rule.hosts && !rule.hosts.find((host: string) => wildcardMatch(hostname, host))) {\n return;\n }\n\n // check if the URL is in the allowed URL patterns\n if (url && rule.urls && !isUrlMatchAllowlist(url, rule.urls)) {\n return;\n }\n\n // check if the method is in the allowed methods\n if (\n method &&\n rule.methods &&\n !rule.methods.find(\n (allowedMethod: string) => method.toLowerCase() === allowedMethod.toLowerCase() || allowedMethod === '*',\n )\n ) {\n return;\n }\n\n // check if the status code is in the allowed range\n if (status || status === 0) {\n const statusCodeRange = rule.statusCodeRange || DEFAULT_STATUS_CODE_RANGE;\n if (!isStatusCodeInRange(status, statusCodeRange)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseUrl(url: string | undefined) {\n if (!url) {\n return;\n }\n try {\n /* istanbul ignore next */\n const currentHref = getGlobalScope()?.location.href;\n const urlObj = new URL(url, currentHref);\n const query = urlObj.searchParams.toString();\n const fragment = urlObj.hash.replace('#', '');\n const href = urlObj.href;\n const host = urlObj.host;\n urlObj.hash = '';\n urlObj.search = '';\n const hrefWithoutQueryOrHash = urlObj.href;\n return { query, fragment, href, hrefWithoutQueryOrHash, host };\n } catch (e) {\n /* istanbul ignore next */\n return;\n }\n}\n\nfunction isAmplitudeNetworkRequestEvent(host: string, requestWrapper: IRequestWrapper): boolean {\n if (host.includes('amplitude.com')) {\n try {\n const body = requestWrapper.body;\n if (typeof body !== 'string') {\n return false;\n }\n const bodyObj = JSON.parse(body) as { events: any[] };\n const { events } = bodyObj;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n if (events.find((event: any) => event.event_type === AMPLITUDE_NETWORK_REQUEST_EVENT)) {\n return true;\n }\n } catch (e) {\n // do nothing\n }\n }\n return false;\n}\n\n/**\n * Takes a user provided header capture rule and returns a\n * HeaderCaptureRule object that sets proper default values.\n *\n * @param rule - The header capture rule to parse.\n * @returns A HeaderCaptureRule object.\n */\nexport function parseHeaderCaptureRule(rule: string[] | boolean | undefined | null): string[] | undefined {\n if (typeof rule !== 'object' || rule === null) {\n // if rule is truthy or undefined, return SAFE_HEADERS\n if (rule) {\n return [...SAFE_HEADERS];\n } else if (rule === undefined) {\n /* istanbul ignore next */\n const res = IS_HEADER_CAPTURE_EXPERIMENTAL ? undefined : [...SAFE_HEADERS];\n return res;\n }\n return;\n }\n\n // if the rule is defined but empty, return undefined\n if (rule.length === 0) {\n return;\n }\n\n return rule;\n}\n\nfunction isBodyCaptureRuleEmpty(rule: BodyCaptureRule) {\n /* istanbul ignore next */\n return !rule?.allowlist?.length && !rule?.blocklist?.length;\n}\n\nexport function shouldTrackNetworkEvent(networkEvent: NetworkRequestEvent, options: NetworkTrackingOptions = {}) {\n const urlObj = parseUrl(networkEvent.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a probably impossible case that would only happen if the URL is malformed\n /* istanbul ignore next */\n return false;\n }\n const { host } = urlObj;\n\n // false if is amplitude request and not configured to track amplitude requests\n if (\n options.ignoreAmplitudeRequests !== false &&\n (wildcardMatch(host, '*.amplitude.com') || wildcardMatch(host, 'amplitude.com'))\n ) {\n return false;\n }\n\n // false if the host is in the ignore list\n if (options.ignoreHosts?.find((ignoreHost: string) => wildcardMatch(host, ignoreHost))) {\n return false;\n }\n\n // false if the status code is not 500-599 and there are no captureRules\n if (\n !options.captureRules &&\n networkEvent.status !== undefined &&\n !isStatusCodeInRange(networkEvent.status, DEFAULT_STATUS_CODE_RANGE)\n ) {\n return false;\n }\n\n if (options.captureRules) {\n // find the first capture rule, in reverse-order,\n // that is a match (true) or a miss (false)\n let isMatch: boolean | undefined;\n [...options.captureRules].reverse().find((rule) => {\n isMatch = isCaptureRuleMatch(rule, host, networkEvent.status, networkEvent.url, networkEvent.method);\n\n if (isMatch) {\n const responseHeadersRule = parseHeaderCaptureRule(rule.responseHeaders);\n if (networkEvent.responseWrapper && responseHeadersRule) {\n const responseHeaders = networkEvent.responseWrapper.headers(responseHeadersRule);\n if (responseHeaders) {\n networkEvent.responseHeaders = responseHeaders;\n }\n }\n\n // if requestHeaders rule is specified, enrich the event with the request headers\n const requestHeadersRule = parseHeaderCaptureRule(rule.requestHeaders);\n if (networkEvent.requestWrapper && requestHeadersRule) {\n const requestHeaders = networkEvent.requestWrapper.headers(requestHeadersRule);\n if (requestHeaders) {\n networkEvent.requestHeaders = requestHeaders;\n }\n }\n\n // if responseBody rule is specified, enrich the event with the response body\n if (networkEvent.responseWrapper && rule.responseBody && !isBodyCaptureRuleEmpty(rule.responseBody)) {\n networkEvent.responseBodyJson = networkEvent.responseWrapper.json(\n rule.responseBody.allowlist,\n rule.responseBody.blocklist,\n );\n }\n\n // if requestBody rule is specified, enrich the event with the request body\n if (networkEvent.requestWrapper && rule.requestBody && !isBodyCaptureRuleEmpty(rule.requestBody)) {\n networkEvent.requestBodyJson = networkEvent.requestWrapper.json(\n rule.requestBody.allowlist,\n rule.requestBody.blocklist,\n );\n }\n }\n\n return isMatch !== undefined;\n });\n\n // if we found a miss (false) or no match (undefined),\n // then do not track the event\n if (!isMatch) {\n return false;\n }\n }\n\n // skip Amplitude network requests to \"[Amplitude] Network Request\" to avoid infinite loop\n if (networkEvent.requestWrapper && isAmplitudeNetworkRequestEvent(host, networkEvent.requestWrapper)) {\n return false;\n }\n\n return true;\n}\n\nexport type NetworkAnalyticsEvent = {\n ['[Amplitude] URL']: string;\n ['[Amplitude] URL Query']?: string;\n ['[Amplitude] URL Fragment']?: string;\n ['[Amplitude] Request Method']: string;\n ['[Amplitude] Status Code']?: number;\n ['[Amplitude] Start Time']?: number; // unix timestamp\n ['[Amplitude] Completion Time']?: number; // unix timestamp\n ['[Amplitude] Duration']?: number; // completionTime - startTime (millis)\n ['[Amplitude] Request Body Size']?: number;\n ['[Amplitude] Request Headers']?: Record<string, string>;\n ['[Amplitude] Request Body']?: string;\n ['[Amplitude] Response Body Size']?: number;\n ['[Amplitude] Response Headers']?: Record<string, string>;\n ['[Amplitude] Response Body']?: string;\n ['[Amplitude] Request Type']?: 'xhr' | 'fetch';\n};\n\nexport async function logNetworkAnalyticsEvent(\n networkAnalyticsEvent: NetworkAnalyticsEvent,\n request: NetworkRequestEvent,\n amplitude: BrowserClient,\n loggerProvider?: ILogger,\n) {\n if (request.requestBodyJson || request.responseBodyJson) {\n const [requestBody, responseBody] = await Promise.all([request.requestBodyJson, request.responseBodyJson]);\n if (requestBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Request Body'] = JSON.stringify(requestBody);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.debug('Failed to stringify request body', e);\n }\n }\n if (responseBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Response Body'] = JSON.stringify(responseBody);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.debug('Failed to stringify response body');\n }\n }\n }\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_NETWORK_REQUEST_EVENT, networkAnalyticsEvent);\n}\n\nexport function trackNetworkEvents({\n allObservables,\n networkTrackingOptions,\n amplitude,\n loggerProvider,\n}: {\n allObservables: AllWindowObservables;\n networkTrackingOptions: NetworkTrackingOptions;\n amplitude: BrowserClient;\n loggerProvider?: ILogger;\n}): Unsubscribable {\n const { networkObservable } = allObservables;\n\n const filteredNetworkObservable = networkObservable.filter((event: TimestampedEvent<NetworkRequestEvent>) => {\n // Only track network events that should be tracked\n return shouldTrackNetworkEvent(event.event as NetworkRequestEvent, networkTrackingOptions);\n });\n\n return filteredNetworkObservable.subscribe((networkEvent) => {\n const request = networkEvent.event;\n\n // convert to NetworkAnalyticsEvent\n const urlObj = parseUrl(request.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a very unlikely case, because URL() shouldn't throw an exception\n // when the URL is a valid URL\n /* istanbul ignore next */\n return;\n }\n\n const responseBodySize = request.responseWrapper?.bodySize;\n /* istanbul ignore next */\n const requestBodySize = request.requestWrapper?.bodySize;\n\n const networkAnalyticsEvent: NetworkAnalyticsEvent = {\n ['[Amplitude] URL']: urlObj.hrefWithoutQueryOrHash,\n ['[Amplitude] URL Query']: urlObj.query,\n ['[Amplitude] URL Fragment']: urlObj.fragment,\n ['[Amplitude] Request Method']: request.method,\n ['[Amplitude] Status Code']: request.status,\n ['[Amplitude] Start Time']: request.startTime,\n ['[Amplitude] Completion Time']: request.endTime,\n ['[Amplitude] Duration']: request.duration,\n ['[Amplitude] Request Body Size']: requestBodySize,\n ['[Amplitude] Response Body Size']: responseBodySize,\n ['[Amplitude] Request Type']: request.type,\n ['[Amplitude] Request Headers']: request.requestHeaders,\n ['[Amplitude] Response Headers']: request.responseHeaders,\n };\n\n // fire-and-forget promise that tracks the event\n void logNetworkAnalyticsEvent(networkAnalyticsEvent, request, amplitude, loggerProvider);\n });\n}\n"]}
1
+ {"version":3,"file":"track-network-event.js","sourceRoot":"","sources":["../../src/track-network-event.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BrowserClient,\n NetworkRequestEvent,\n NetworkCaptureRule,\n NetworkTrackingOptions,\n getGlobalScope,\n isUrlMatchAllowlist,\n SAFE_HEADERS,\n ILogger,\n} from '@amplitude/analytics-core';\nimport { filter } from 'rxjs';\nimport { AllWindowObservables, TimestampedEvent } from './network-capture-plugin';\nimport { AMPLITUDE_NETWORK_REQUEST_EVENT, IS_HEADER_CAPTURE_EXPERIMENTAL } from './constants';\nimport { IRequestWrapper } from '@amplitude/analytics-core';\nimport { BodyCaptureRule } from '@amplitude/analytics-core/lib/esm/types/network-tracking';\n\nconst DEFAULT_STATUS_CODE_RANGE = '500-599';\n\nfunction wildcardMatch(str: string, pattern: string) {\n // Escape all regex special characters except for *\n const escapedPattern = pattern.replace(/[-[\\]{}()+?.,\\\\^$|#\\s]/g, '\\\\$&');\n // Replace * with .*\n const regexPattern = '^' + escapedPattern.replace(/\\*/g, '.*') + '$';\n const regex = new RegExp(regexPattern);\n return regex.test(str);\n}\n\nfunction isStatusCodeInRange(statusCode: number, range: string) {\n const ranges = range.split(',');\n for (const r of ranges) {\n const [start, end] = r.split('-').map(Number);\n if (statusCode === start && end === undefined) {\n return true;\n }\n if (statusCode >= start && statusCode <= end) {\n return true;\n }\n }\n return false;\n}\n\nfunction isCaptureRuleMatch(\n rule: NetworkCaptureRule,\n hostname: string,\n status?: number,\n url?: string,\n method?: string,\n) {\n // check if the host is in the allowed hosts\n if (rule.hosts && !rule.hosts.find((host: string) => wildcardMatch(hostname, host))) {\n return;\n }\n\n // check if the URL is in the allowed URL patterns\n if (url && rule.urls && !isUrlMatchAllowlist(url, rule.urls)) {\n return;\n }\n\n // check if the method is in the allowed methods\n if (\n method &&\n rule.methods &&\n !rule.methods.find(\n (allowedMethod: string) => method.toLowerCase() === allowedMethod.toLowerCase() || allowedMethod === '*',\n )\n ) {\n return;\n }\n\n // check if the status code is in the allowed range\n if (status || status === 0) {\n const statusCodeRange = rule.statusCodeRange || DEFAULT_STATUS_CODE_RANGE;\n if (!isStatusCodeInRange(status, statusCodeRange)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseUrl(url: string | undefined) {\n if (!url) {\n return;\n }\n try {\n /* istanbul ignore next */\n const currentHref = getGlobalScope()?.location.href;\n const urlObj = new URL(url, currentHref);\n const query = urlObj.searchParams.toString();\n const fragment = urlObj.hash.replace('#', '');\n const href = urlObj.href;\n const host = urlObj.host;\n urlObj.hash = '';\n urlObj.search = '';\n const hrefWithoutQueryOrHash = urlObj.href;\n return { query, fragment, href, hrefWithoutQueryOrHash, host };\n } catch (e) {\n /* istanbul ignore next */\n return;\n }\n}\n\nfunction isAmplitudeNetworkRequestEvent(host: string, requestWrapper: IRequestWrapper): boolean {\n if (host.includes('amplitude.com')) {\n try {\n const body = requestWrapper.body;\n if (typeof body !== 'string') {\n return false;\n }\n const bodyObj = JSON.parse(body) as { events: any[] };\n const { events } = bodyObj;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n if (events.find((event: any) => event.event_type === AMPLITUDE_NETWORK_REQUEST_EVENT)) {\n return true;\n }\n } catch (e) {\n // do nothing\n }\n }\n return false;\n}\n\n/**\n * Takes a user provided header capture rule and returns a\n * HeaderCaptureRule object that sets proper default values.\n *\n * @param rule - The header capture rule to parse.\n * @returns A HeaderCaptureRule object.\n */\nexport function parseHeaderCaptureRule(rule: string[] | boolean | undefined | null): string[] | undefined {\n if (typeof rule !== 'object' || rule === null) {\n // if rule is truthy or undefined, return SAFE_HEADERS\n if (rule) {\n return [...SAFE_HEADERS];\n } else if (rule === undefined) {\n /* istanbul ignore next */\n const res = IS_HEADER_CAPTURE_EXPERIMENTAL ? undefined : [...SAFE_HEADERS];\n return res;\n }\n return;\n }\n\n // if the rule is defined but empty, return undefined\n if (rule.length === 0) {\n return;\n }\n\n return rule;\n}\n\nfunction isBodyCaptureRuleEmpty(rule: BodyCaptureRule) {\n /* istanbul ignore next */\n return !rule?.allowlist?.length && !rule?.blocklist?.length;\n}\n\nexport function shouldTrackNetworkEvent(networkEvent: NetworkRequestEvent, options: NetworkTrackingOptions = {}) {\n const urlObj = parseUrl(networkEvent.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a probably impossible case that would only happen if the URL is malformed\n /* istanbul ignore next */\n return false;\n }\n const { host } = urlObj;\n\n // false if is amplitude request and not configured to track amplitude requests\n if (\n options.ignoreAmplitudeRequests !== false &&\n (wildcardMatch(host, '*.amplitude.com') || wildcardMatch(host, 'amplitude.com'))\n ) {\n return false;\n }\n\n // false if the host is in the ignore list\n if (options.ignoreHosts?.find((ignoreHost: string) => wildcardMatch(host, ignoreHost))) {\n return false;\n }\n\n // false if the status code is not 500-599 and there are no captureRules\n if (\n !options.captureRules &&\n networkEvent.status !== undefined &&\n !isStatusCodeInRange(networkEvent.status, DEFAULT_STATUS_CODE_RANGE)\n ) {\n return false;\n }\n\n if (options.captureRules) {\n // find the first capture rule, in reverse-order,\n // that is a match (true) or a miss (false)\n let isMatch: boolean | undefined;\n [...options.captureRules].reverse().find((rule) => {\n isMatch = isCaptureRuleMatch(rule, host, networkEvent.status, networkEvent.url, networkEvent.method);\n\n if (isMatch) {\n const responseHeadersRule = parseHeaderCaptureRule(rule.responseHeaders);\n if (networkEvent.responseWrapper && responseHeadersRule) {\n const responseHeaders = networkEvent.responseWrapper.headers(responseHeadersRule);\n if (responseHeaders) {\n networkEvent.responseHeaders = responseHeaders;\n }\n }\n\n // if requestHeaders rule is specified, enrich the event with the request headers\n const requestHeadersRule = parseHeaderCaptureRule(rule.requestHeaders);\n if (networkEvent.requestWrapper && requestHeadersRule) {\n const requestHeaders = networkEvent.requestWrapper.headers(requestHeadersRule);\n if (requestHeaders) {\n networkEvent.requestHeaders = requestHeaders;\n }\n }\n\n // if responseBody rule is specified, enrich the event with the response body\n if (networkEvent.responseWrapper && rule.responseBody && !isBodyCaptureRuleEmpty(rule.responseBody)) {\n networkEvent.responseBodyJson = networkEvent.responseWrapper.json(\n rule.responseBody.allowlist,\n rule.responseBody.blocklist,\n );\n }\n\n // if requestBody rule is specified, enrich the event with the request body\n if (networkEvent.requestWrapper && rule.requestBody && !isBodyCaptureRuleEmpty(rule.requestBody)) {\n networkEvent.requestBodyJson = networkEvent.requestWrapper.json(\n rule.requestBody.allowlist,\n rule.requestBody.blocklist,\n );\n }\n }\n\n return isMatch !== undefined;\n });\n\n // if we found a miss (false) or no match (undefined),\n // then do not track the event\n if (!isMatch) {\n return false;\n }\n }\n\n // skip Amplitude network requests to \"[Amplitude] Network Request\" to avoid infinite loop\n if (networkEvent.requestWrapper && isAmplitudeNetworkRequestEvent(host, networkEvent.requestWrapper)) {\n return false;\n }\n\n return true;\n}\n\nexport type NetworkAnalyticsEvent = {\n ['[Amplitude] URL']: string;\n ['[Amplitude] URL Query']?: string;\n ['[Amplitude] URL Fragment']?: string;\n ['[Amplitude] Request Method']: string;\n ['[Amplitude] Status Code']?: number;\n ['[Amplitude] Start Time']?: number; // unix timestamp\n ['[Amplitude] Completion Time']?: number; // unix timestamp\n ['[Amplitude] Duration']?: number; // completionTime - startTime (millis)\n ['[Amplitude] Request Body Size']?: number;\n ['[Amplitude] Request Headers']?: Record<string, string>;\n ['[Amplitude] Request Body']?: string;\n ['[Amplitude] Response Body Size']?: number;\n ['[Amplitude] Response Headers']?: Record<string, string>;\n ['[Amplitude] Response Body']?: string;\n ['[Amplitude] Request Type']?: 'xhr' | 'fetch';\n};\n\nexport async function logNetworkAnalyticsEvent(\n networkAnalyticsEvent: NetworkAnalyticsEvent,\n request: NetworkRequestEvent,\n amplitude: BrowserClient,\n loggerProvider?: ILogger,\n) {\n if (request.requestBodyJson || request.responseBodyJson) {\n const [requestBody, responseBody] = await Promise.all([request.requestBodyJson, request.responseBodyJson]);\n if (requestBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Request Body'] = JSON.stringify(requestBody);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.debug('Failed to stringify request body', e);\n }\n }\n if (responseBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Response Body'] = JSON.stringify(responseBody);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.debug('Failed to stringify response body');\n }\n }\n }\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_NETWORK_REQUEST_EVENT, networkAnalyticsEvent);\n}\n\nexport function trackNetworkEvents({\n allObservables,\n networkTrackingOptions,\n amplitude,\n loggerProvider,\n}: {\n allObservables: AllWindowObservables;\n networkTrackingOptions: NetworkTrackingOptions;\n amplitude: BrowserClient;\n loggerProvider?: ILogger;\n}) {\n const { networkObservable } = allObservables;\n\n const filteredNetworkObservable = networkObservable.pipe(\n filter((event: TimestampedEvent<NetworkRequestEvent>) => {\n // Only track network events that should be tracked,\n return shouldTrackNetworkEvent(event.event as NetworkRequestEvent, networkTrackingOptions);\n }),\n );\n\n return filteredNetworkObservable.subscribe((networkEvent) => {\n const request = networkEvent.event;\n\n // convert to NetworkAnalyticsEvent\n const urlObj = parseUrl(request.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a very unlikely case, because URL() shouldn't throw an exception\n // when the URL is a valid URL\n /* istanbul ignore next */\n return;\n }\n\n const responseBodySize = request.responseWrapper?.bodySize;\n /* istanbul ignore next */\n const requestBodySize = request.requestWrapper?.bodySize;\n\n const networkAnalyticsEvent: NetworkAnalyticsEvent = {\n ['[Amplitude] URL']: urlObj.hrefWithoutQueryOrHash,\n ['[Amplitude] URL Query']: urlObj.query,\n ['[Amplitude] URL Fragment']: urlObj.fragment,\n ['[Amplitude] Request Method']: request.method,\n ['[Amplitude] Status Code']: request.status,\n ['[Amplitude] Start Time']: request.startTime,\n ['[Amplitude] Completion Time']: request.endTime,\n ['[Amplitude] Duration']: request.duration,\n ['[Amplitude] Request Body Size']: requestBodySize,\n ['[Amplitude] Response Body Size']: responseBodySize,\n ['[Amplitude] Request Type']: request.type,\n ['[Amplitude] Request Headers']: request.requestHeaders,\n ['[Amplitude] Response Headers']: request.responseHeaders,\n };\n\n // fire-and-forget promise that tracks the event\n void logNetworkAnalyticsEvent(networkAnalyticsEvent, request, amplitude, loggerProvider);\n });\n}\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "1.6.14-zen-plus-zoning.0";
1
+ export declare const VERSION = "1.6.15";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,6BAA6B,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAC"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = '1.6.14-zen-plus-zoning.0';
4
+ exports.VERSION = '1.6.15';
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,0BAA0B,CAAC","sourcesContent":["export const VERSION = '1.6.14-zen-plus-zoning.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '1.6.15';\n"]}
@@ -1,5 +1,11 @@
1
1
  import { BrowserClient, BrowserConfig, EnrichmentPlugin, NetworkRequestEvent, NetworkTrackingOptions } from '@amplitude/analytics-core';
2
- import { Observable } from '@amplitude/analytics-core';
2
+ import { Observable } from 'rxjs';
3
+ import { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';
4
+ declare global {
5
+ interface Window {
6
+ navigation: HasEventTargetAddRemove<Event>;
7
+ }
8
+ }
3
9
  export type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;
4
10
  export declare enum ObservablesEnum {
5
11
  NetworkObservable = "networkObservable"
@@ -1 +1 @@
1
- {"version":3,"file":"network-capture-plugin.d.ts","sourceRoot":"","sources":["../../src/network-capture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EAGnB,sBAAsB,EAEvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAkB,MAAM,2BAA2B,CAAC;AAGvE,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAErF,oBAAY,eAAe;IACzB,iBAAiB,sBAAsB;CACxC;AAGD,KAAK,oBAAoB,CAAC,CAAC,IAAI;IAC7B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CACnF,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,4BAA4B,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG;IACtE,KAAK,EAAE,UAAU,GAAG,KAAK,CAAC;IAC1B,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,sBAAsB,EAAE,OAAO,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9C,CAAC;AAGF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,4BAA4B,CAAC,CAAC,CAAC,CAAC;AAE5F,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC;CACxF;AAID,eAAO,MAAM,oBAAoB,aAAa,sBAAsB,KAAQ,uBA2E3E,CAAC"}
1
+ {"version":3,"file":"network-capture-plugin.d.ts","sourceRoot":"","sources":["../../src/network-capture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EAGnB,sBAAsB,EAEvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAgB,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAG7E,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;KAC5C;CACF;AAED,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAErF,oBAAY,eAAe;IACzB,iBAAiB,sBAAsB;CACxC;AAGD,KAAK,oBAAoB,CAAC,CAAC,IAAI;IAC7B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CACnF,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,4BAA4B,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG;IACtE,KAAK,EAAE,UAAU,GAAG,KAAK,CAAC;IAC1B,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,sBAAsB,EAAE,OAAO,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9C,CAAC;AAGF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,4BAA4B,CAAC,CAAC,CAAC,CAAC;AAE5F,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC;CACxF;AAED,eAAO,MAAM,oBAAoB,aAAa,sBAAsB,KAAQ,uBAgF3E,CAAC"}
@@ -1,19 +1,19 @@
1
- import { __awaiter, __generator } from "tslib";
1
+ import { __awaiter, __generator, __values } from "tslib";
2
2
  /* eslint-disable no-restricted-globals */
3
3
  import { networkObserver, NetworkEventCallback, } from '@amplitude/analytics-core';
4
4
  import * as constants from './constants';
5
- import { Observable } from '@amplitude/analytics-core';
5
+ import { Observable } from 'rxjs';
6
6
  import { trackNetworkEvents } from './track-network-event';
7
7
  export var ObservablesEnum;
8
8
  (function (ObservablesEnum) {
9
9
  ObservablesEnum["NetworkObservable"] = "networkObservable";
10
10
  })(ObservablesEnum || (ObservablesEnum = {}));
11
- var subscription;
12
11
  export var networkCapturePlugin = function (options) {
13
12
  if (options === void 0) { options = {}; }
14
13
  var name = constants.PLUGIN_NAME;
15
14
  var type = 'enrichment';
16
15
  var logger;
16
+ var subscriptions = [];
17
17
  var addAdditionalEventProperties = function (event, type) {
18
18
  var baseEvent = {
19
19
  event: event,
@@ -40,7 +40,7 @@ export var networkCapturePlugin = function (options) {
40
40
  _a;
41
41
  };
42
42
  var setup = function (config, amplitude) { return __awaiter(void 0, void 0, void 0, function () {
43
- var allObservables;
43
+ var allObservables, networkRequestSubscription;
44
44
  return __generator(this, function (_a) {
45
45
  /* istanbul ignore if */
46
46
  if (typeof document === 'undefined') {
@@ -49,12 +49,13 @@ export var networkCapturePlugin = function (options) {
49
49
  allObservables = createObservables();
50
50
  /* istanbul ignore next */
51
51
  logger = config === null || config === void 0 ? void 0 : config.loggerProvider;
52
- subscription = trackNetworkEvents({
52
+ networkRequestSubscription = trackNetworkEvents({
53
53
  allObservables: allObservables,
54
54
  networkTrackingOptions: options,
55
55
  amplitude: amplitude,
56
56
  loggerProvider: logger,
57
57
  });
58
+ subscriptions.push(networkRequestSubscription);
58
59
  /* istanbul ignore next */
59
60
  logger === null || logger === void 0 ? void 0 : logger.log("".concat(name, " has been successfully added."));
60
61
  return [2 /*return*/];
@@ -67,8 +68,22 @@ export var networkCapturePlugin = function (options) {
67
68
  });
68
69
  }); };
69
70
  var teardown = function () { return __awaiter(void 0, void 0, void 0, function () {
70
- return __generator(this, function (_a) {
71
- subscription.unsubscribe();
71
+ var subscriptions_1, subscriptions_1_1, subscription;
72
+ var e_1, _a;
73
+ return __generator(this, function (_b) {
74
+ try {
75
+ for (subscriptions_1 = __values(subscriptions), subscriptions_1_1 = subscriptions_1.next(); !subscriptions_1_1.done; subscriptions_1_1 = subscriptions_1.next()) {
76
+ subscription = subscriptions_1_1.value;
77
+ subscription.unsubscribe();
78
+ }
79
+ }
80
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
81
+ finally {
82
+ try {
83
+ if (subscriptions_1_1 && !subscriptions_1_1.done && (_a = subscriptions_1.return)) _a.call(subscriptions_1);
84
+ }
85
+ finally { if (e_1) throw e_1.error; }
86
+ }
72
87
  return [2 /*return*/];
73
88
  });
74
89
  }); };
@@ -1 +1 @@
1
- {"version":3,"file":"network-capture-plugin.js","sourceRoot":"","sources":["../../src/network-capture-plugin.ts"],"names":[],"mappings":";AAAA,0CAA0C;AAC1C,OAAO,EAKL,eAAe,EACf,oBAAoB,GAGrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAkB,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAI3D,MAAM,CAAN,IAAY,eAEX;AAFD,WAAY,eAAe;IACzB,0DAAuC,CAAA;AACzC,CAAC,EAFW,eAAe,KAAf,eAAe,QAE1B;AAyBD,IAAI,YAA4B,CAAC;AAEjC,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,OAAoC;IAApC,wBAAA,EAAA,YAAoC;IACvE,IAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC;IACnC,IAAM,IAAI,GAAG,YAAY,CAAC;IAC1B,IAAI,MAAe,CAAC;IAEpB,IAAM,4BAA4B,GAAG,UACnC,KAAQ,EACR,IAAiC;QAEjC,IAAM,SAAS,GAA8D;YAC3E,KAAK,OAAA;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,MAAA;SACL,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,6CAA6C;IAC7C,IAAM,iBAAiB,GAAG;;QACxB,IAAM,iBAAiB,GAAG,IAAI,UAAU,CAAwC,UAAC,QAAQ;YACvF,IAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,UAAC,KAAK;gBAC9C,IAAM,mBAAmB,GAAG,4BAA4B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAC3E,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO;gBACL,eAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH;YACE,GAAC,eAAe,CAAC,iBAAiB,IAAG,iBAAiB;eACtD;IACJ,CAAC,CAAC;IAEF,IAAM,KAAK,GAAqC,UAAO,MAAM,EAAE,SAAS;;;YACtE,wBAAwB;YACxB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;gBACnC,sBAAO;aACR;YAGK,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAE3C,0BAA0B;YAC1B,MAAM,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,CAAC;YAEhC,YAAY,GAAG,kBAAkB,CAAC;gBAChC,cAAc,gBAAA;gBACd,sBAAsB,EAAE,OAAO;gBAC/B,SAAS,WAAA;gBACT,cAAc,EAAE,MAAM;aACvB,CAAC,CAAC;YAEH,0BAA0B;YAC1B,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,CAAC,UAAG,IAAI,kCAA+B,CAAC,CAAC;;;SACrD,CAAC;IAEF,0BAA0B;IAC1B,IAAM,OAAO,GAAuC,UAAO,KAAK;;YAC9D,sBAAO,KAAK,EAAC;;SACd,CAAC;IAEF,IAAM,QAAQ,GAAG;;YACf,YAAY,CAAC,WAAW,EAAE,CAAC;;;SAC5B,CAAC;IAEF,OAAO;QACL,IAAI,MAAA;QACJ,IAAI,MAAA;QACJ,KAAK,OAAA;QACL,OAAO,SAAA;QACP,QAAQ,UAAA;KACT,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n NetworkRequestEvent,\n networkObserver,\n NetworkEventCallback,\n NetworkTrackingOptions,\n ILogger,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { Observable, Unsubscribable } from '@amplitude/analytics-core';\nimport { trackNetworkEvents } from './track-network-event';\n\nexport type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport enum ObservablesEnum {\n NetworkObservable = 'networkObservable',\n}\n\n// Base TimestampedEvent type\ntype BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation' | 'network';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\nexport interface AllWindowObservables {\n [ObservablesEnum.NetworkObservable]: Observable<TimestampedEvent<NetworkRequestEvent>>;\n}\n\nlet subscription: Unsubscribable;\n\nexport const networkCapturePlugin = (options: NetworkTrackingOptions = {}): BrowserEnrichmentPlugin => {\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n let logger: ILogger;\n\n const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n return baseEvent;\n };\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n const networkObservable = new Observable<TimestampedEvent<NetworkRequestEvent>>((observer) => {\n const callback = new NetworkEventCallback((event) => {\n const eventWithProperties = addAdditionalEventProperties(event, 'network');\n observer.next(eventWithProperties);\n });\n networkObserver.subscribe(callback, logger);\n return () => {\n networkObserver.unsubscribe(callback);\n };\n });\n\n return {\n [ObservablesEnum.NetworkObservable]: networkObservable,\n };\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n /* istanbul ignore next */\n logger = config?.loggerProvider;\n\n subscription = trackNetworkEvents({\n allObservables,\n networkTrackingOptions: options,\n amplitude,\n loggerProvider: logger,\n });\n\n /* istanbul ignore next */\n logger?.log(`${name} has been successfully added.`);\n };\n\n /* istanbul ignore next */\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n subscription.unsubscribe();\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
1
+ {"version":3,"file":"network-capture-plugin.js","sourceRoot":"","sources":["../../src/network-capture-plugin.ts"],"names":[],"mappings":";AAAA,0CAA0C;AAC1C,OAAO,EAKL,eAAe,EACf,oBAAoB,GAGrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAgB,MAAM,MAAM,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAU3D,MAAM,CAAN,IAAY,eAEX;AAFD,WAAY,eAAe;IACzB,0DAAuC,CAAA;AACzC,CAAC,EAFW,eAAe,KAAf,eAAe,QAE1B;AAyBD,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,OAAoC;IAApC,wBAAA,EAAA,YAAoC;IACvE,IAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC;IACnC,IAAM,IAAI,GAAG,YAAY,CAAC;IAC1B,IAAI,MAAe,CAAC;IAEpB,IAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,IAAM,4BAA4B,GAAG,UACnC,KAAQ,EACR,IAAiC;QAEjC,IAAM,SAAS,GAA8D;YAC3E,KAAK,OAAA;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,MAAA;SACL,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,6CAA6C;IAC7C,IAAM,iBAAiB,GAAG;;QACxB,IAAM,iBAAiB,GAAG,IAAI,UAAU,CAAwC,UAAC,QAAQ;YACvF,IAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,UAAC,KAAK;gBAC9C,IAAM,mBAAmB,GAAG,4BAA4B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAC3E,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO;gBACL,eAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH;YACE,GAAC,eAAe,CAAC,iBAAiB,IAAG,iBAAiB;eACtD;IACJ,CAAC,CAAC;IAEF,IAAM,KAAK,GAAqC,UAAO,MAAM,EAAE,SAAS;;;YACtE,wBAAwB;YACxB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;gBACnC,sBAAO;aACR;YAGK,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAE3C,0BAA0B;YAC1B,MAAM,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,CAAC;YAE1B,0BAA0B,GAAG,kBAAkB,CAAC;gBACpD,cAAc,gBAAA;gBACd,sBAAsB,EAAE,OAAO;gBAC/B,SAAS,WAAA;gBACT,cAAc,EAAE,MAAM;aACvB,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAE/C,0BAA0B;YAC1B,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,CAAC,UAAG,IAAI,kCAA+B,CAAC,CAAC;;;SACrD,CAAC;IAEF,0BAA0B;IAC1B,IAAM,OAAO,GAAuC,UAAO,KAAK;;YAC9D,sBAAO,KAAK,EAAC;;SACd,CAAC;IAEF,IAAM,QAAQ,GAAG;;;;;gBACf,KAA2B,kBAAA,SAAA,aAAa,CAAA,mHAAE;oBAA/B,YAAY;oBACrB,YAAY,CAAC,WAAW,EAAE,CAAC;iBAC5B;;;;;;;;;;;SACF,CAAC;IAEF,OAAO;QACL,IAAI,MAAA;QACJ,IAAI,MAAA;QACJ,KAAK,OAAA;QACL,OAAO,SAAA;QACP,QAAQ,UAAA;KACT,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n NetworkRequestEvent,\n networkObserver,\n NetworkEventCallback,\n NetworkTrackingOptions,\n ILogger,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { Observable, Subscription } from 'rxjs';\nimport { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';\nimport { trackNetworkEvents } from './track-network-event';\n\ndeclare global {\n interface Window {\n navigation: HasEventTargetAddRemove<Event>;\n }\n}\n\nexport type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport enum ObservablesEnum {\n NetworkObservable = 'networkObservable',\n}\n\n// Base TimestampedEvent type\ntype BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation' | 'network';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\nexport interface AllWindowObservables {\n [ObservablesEnum.NetworkObservable]: Observable<TimestampedEvent<NetworkRequestEvent>>;\n}\n\nexport const networkCapturePlugin = (options: NetworkTrackingOptions = {}): BrowserEnrichmentPlugin => {\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n let logger: ILogger;\n\n const subscriptions: Subscription[] = [];\n\n const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n return baseEvent;\n };\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n const networkObservable = new Observable<TimestampedEvent<NetworkRequestEvent>>((observer) => {\n const callback = new NetworkEventCallback((event) => {\n const eventWithProperties = addAdditionalEventProperties(event, 'network');\n observer.next(eventWithProperties);\n });\n networkObserver.subscribe(callback, logger);\n return () => {\n networkObserver.unsubscribe(callback);\n };\n });\n\n return {\n [ObservablesEnum.NetworkObservable]: networkObservable,\n };\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n /* istanbul ignore next */\n logger = config?.loggerProvider;\n\n const networkRequestSubscription = trackNetworkEvents({\n allObservables,\n networkTrackingOptions: options,\n amplitude,\n loggerProvider: logger,\n });\n subscriptions.push(networkRequestSubscription);\n\n /* istanbul ignore next */\n logger?.log(`${name} has been successfully added.`);\n };\n\n /* istanbul ignore next */\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { BrowserClient, NetworkRequestEvent, NetworkTrackingOptions, ILogger, Unsubscribable } from '@amplitude/analytics-core';
1
+ import { BrowserClient, NetworkRequestEvent, NetworkTrackingOptions, ILogger } from '@amplitude/analytics-core';
2
2
  import { AllWindowObservables } from './network-capture-plugin';
3
3
  /**
4
4
  * Takes a user provided header capture rule and returns a
@@ -32,5 +32,5 @@ export declare function trackNetworkEvents({ allObservables, networkTrackingOpti
32
32
  networkTrackingOptions: NetworkTrackingOptions;
33
33
  amplitude: BrowserClient;
34
34
  loggerProvider?: ILogger;
35
- }): Unsubscribable;
35
+ }): import("rxjs").Subscription;
36
36
  //# sourceMappingURL=track-network-event.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-network-event.d.ts","sourceRoot":"","sources":["../../src/track-network-event.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EAEnB,sBAAsB,EAItB,OAAO,EAEP,cAAc,EACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAoB,MAAM,0BAA0B,CAAC;AA8GlF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,EAAE,GAAG,SAAS,CAmBxG;AAOD,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,mBAAmB,EAAE,OAAO,GAAE,sBAA2B,WA2F9G;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,uBAAuB,CAAC,CAAC,EAAE,MAAM,CAAC;IACnC,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC;IACtC,CAAC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACvC,CAAC,yBAAyB,CAAC,CAAC,EAAE,MAAM,CAAC;IACrC,CAAC,wBAAwB,CAAC,CAAC,EAAE,MAAM,CAAC;IACpC,CAAC,6BAA6B,CAAC,CAAC,EAAE,MAAM,CAAC;IACzC,CAAC,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC;IAClC,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC;IAC3C,CAAC,6BAA6B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC;IACtC,CAAC,gCAAgC,CAAC,CAAC,EAAE,MAAM,CAAC;IAC5C,CAAC,8BAA8B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC;IACvC,CAAC,0BAA0B,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;CAChD,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,aAAa,EACxB,cAAc,CAAC,EAAE,OAAO,iBAuBzB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,cAAc,EACd,sBAAsB,EACtB,SAAS,EACT,cAAc,GACf,EAAE;IACD,cAAc,EAAE,oBAAoB,CAAC;IACrC,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,cAAc,CA6CjB"}
1
+ {"version":3,"file":"track-network-event.d.ts","sourceRoot":"","sources":["../../src/track-network-event.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EAEnB,sBAAsB,EAItB,OAAO,EACR,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,oBAAoB,EAAoB,MAAM,0BAA0B,CAAC;AA+GlF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,EAAE,GAAG,SAAS,CAmBxG;AAOD,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,mBAAmB,EAAE,OAAO,GAAE,sBAA2B,WA2F9G;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,uBAAuB,CAAC,CAAC,EAAE,MAAM,CAAC;IACnC,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC;IACtC,CAAC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACvC,CAAC,yBAAyB,CAAC,CAAC,EAAE,MAAM,CAAC;IACrC,CAAC,wBAAwB,CAAC,CAAC,EAAE,MAAM,CAAC;IACpC,CAAC,6BAA6B,CAAC,CAAC,EAAE,MAAM,CAAC;IACzC,CAAC,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC;IAClC,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC;IAC3C,CAAC,6BAA6B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC;IACtC,CAAC,gCAAgC,CAAC,CAAC,EAAE,MAAM,CAAC;IAC5C,CAAC,8BAA8B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC;IACvC,CAAC,0BAA0B,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;CAChD,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,aAAa,EACxB,cAAc,CAAC,EAAE,OAAO,iBAuBzB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,cAAc,EACd,sBAAsB,EACtB,SAAS,EACT,cAAc,GACf,EAAE;IACD,cAAc,EAAE,oBAAoB,CAAC;IACrC,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,+BA+CA"}
@@ -1,5 +1,6 @@
1
1
  import { __awaiter, __generator, __read, __spreadArray, __values } from "tslib";
2
2
  import { getGlobalScope, isUrlMatchAllowlist, SAFE_HEADERS, } from '@amplitude/analytics-core';
3
+ import { filter } from 'rxjs';
3
4
  import { AMPLITUDE_NETWORK_REQUEST_EVENT, IS_HEADER_CAPTURE_EXPERIMENTAL } from './constants';
4
5
  var DEFAULT_STATUS_CODE_RANGE = '500-599';
5
6
  function wildcardMatch(str, pattern) {
@@ -244,10 +245,10 @@ export function logNetworkAnalyticsEvent(networkAnalyticsEvent, request, amplitu
244
245
  export function trackNetworkEvents(_a) {
245
246
  var allObservables = _a.allObservables, networkTrackingOptions = _a.networkTrackingOptions, amplitude = _a.amplitude, loggerProvider = _a.loggerProvider;
246
247
  var networkObservable = allObservables.networkObservable;
247
- var filteredNetworkObservable = networkObservable.filter(function (event) {
248
- // Only track network events that should be tracked
248
+ var filteredNetworkObservable = networkObservable.pipe(filter(function (event) {
249
+ // Only track network events that should be tracked,
249
250
  return shouldTrackNetworkEvent(event.event, networkTrackingOptions);
250
- });
251
+ }));
251
252
  return filteredNetworkObservable.subscribe(function (networkEvent) {
252
253
  var _a;
253
254
  var _b, _c;
@@ -1 +1 @@
1
- {"version":3,"file":"track-network-event.js","sourceRoot":"","sources":["../../src/track-network-event.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BrowserClient,\n NetworkRequestEvent,\n NetworkCaptureRule,\n NetworkTrackingOptions,\n getGlobalScope,\n isUrlMatchAllowlist,\n SAFE_HEADERS,\n ILogger,\n IRequestWrapper,\n Unsubscribable,\n} from '@amplitude/analytics-core';\nimport { AllWindowObservables, TimestampedEvent } from './network-capture-plugin';\nimport { AMPLITUDE_NETWORK_REQUEST_EVENT, IS_HEADER_CAPTURE_EXPERIMENTAL } from './constants';\nimport { BodyCaptureRule } from '@amplitude/analytics-core/lib/esm/types/network-tracking';\n\nconst DEFAULT_STATUS_CODE_RANGE = '500-599';\n\nfunction wildcardMatch(str: string, pattern: string) {\n // Escape all regex special characters except for *\n const escapedPattern = pattern.replace(/[-[\\]{}()+?.,\\\\^$|#\\s]/g, '\\\\$&');\n // Replace * with .*\n const regexPattern = '^' + escapedPattern.replace(/\\*/g, '.*') + '$';\n const regex = new RegExp(regexPattern);\n return regex.test(str);\n}\n\nfunction isStatusCodeInRange(statusCode: number, range: string) {\n const ranges = range.split(',');\n for (const r of ranges) {\n const [start, end] = r.split('-').map(Number);\n if (statusCode === start && end === undefined) {\n return true;\n }\n if (statusCode >= start && statusCode <= end) {\n return true;\n }\n }\n return false;\n}\n\nfunction isCaptureRuleMatch(\n rule: NetworkCaptureRule,\n hostname: string,\n status?: number,\n url?: string,\n method?: string,\n) {\n // check if the host is in the allowed hosts\n if (rule.hosts && !rule.hosts.find((host: string) => wildcardMatch(hostname, host))) {\n return;\n }\n\n // check if the URL is in the allowed URL patterns\n if (url && rule.urls && !isUrlMatchAllowlist(url, rule.urls)) {\n return;\n }\n\n // check if the method is in the allowed methods\n if (\n method &&\n rule.methods &&\n !rule.methods.find(\n (allowedMethod: string) => method.toLowerCase() === allowedMethod.toLowerCase() || allowedMethod === '*',\n )\n ) {\n return;\n }\n\n // check if the status code is in the allowed range\n if (status || status === 0) {\n const statusCodeRange = rule.statusCodeRange || DEFAULT_STATUS_CODE_RANGE;\n if (!isStatusCodeInRange(status, statusCodeRange)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseUrl(url: string | undefined) {\n if (!url) {\n return;\n }\n try {\n /* istanbul ignore next */\n const currentHref = getGlobalScope()?.location.href;\n const urlObj = new URL(url, currentHref);\n const query = urlObj.searchParams.toString();\n const fragment = urlObj.hash.replace('#', '');\n const href = urlObj.href;\n const host = urlObj.host;\n urlObj.hash = '';\n urlObj.search = '';\n const hrefWithoutQueryOrHash = urlObj.href;\n return { query, fragment, href, hrefWithoutQueryOrHash, host };\n } catch (e) {\n /* istanbul ignore next */\n return;\n }\n}\n\nfunction isAmplitudeNetworkRequestEvent(host: string, requestWrapper: IRequestWrapper): boolean {\n if (host.includes('amplitude.com')) {\n try {\n const body = requestWrapper.body;\n if (typeof body !== 'string') {\n return false;\n }\n const bodyObj = JSON.parse(body) as { events: any[] };\n const { events } = bodyObj;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n if (events.find((event: any) => event.event_type === AMPLITUDE_NETWORK_REQUEST_EVENT)) {\n return true;\n }\n } catch (e) {\n // do nothing\n }\n }\n return false;\n}\n\n/**\n * Takes a user provided header capture rule and returns a\n * HeaderCaptureRule object that sets proper default values.\n *\n * @param rule - The header capture rule to parse.\n * @returns A HeaderCaptureRule object.\n */\nexport function parseHeaderCaptureRule(rule: string[] | boolean | undefined | null): string[] | undefined {\n if (typeof rule !== 'object' || rule === null) {\n // if rule is truthy or undefined, return SAFE_HEADERS\n if (rule) {\n return [...SAFE_HEADERS];\n } else if (rule === undefined) {\n /* istanbul ignore next */\n const res = IS_HEADER_CAPTURE_EXPERIMENTAL ? undefined : [...SAFE_HEADERS];\n return res;\n }\n return;\n }\n\n // if the rule is defined but empty, return undefined\n if (rule.length === 0) {\n return;\n }\n\n return rule;\n}\n\nfunction isBodyCaptureRuleEmpty(rule: BodyCaptureRule) {\n /* istanbul ignore next */\n return !rule?.allowlist?.length && !rule?.blocklist?.length;\n}\n\nexport function shouldTrackNetworkEvent(networkEvent: NetworkRequestEvent, options: NetworkTrackingOptions = {}) {\n const urlObj = parseUrl(networkEvent.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a probably impossible case that would only happen if the URL is malformed\n /* istanbul ignore next */\n return false;\n }\n const { host } = urlObj;\n\n // false if is amplitude request and not configured to track amplitude requests\n if (\n options.ignoreAmplitudeRequests !== false &&\n (wildcardMatch(host, '*.amplitude.com') || wildcardMatch(host, 'amplitude.com'))\n ) {\n return false;\n }\n\n // false if the host is in the ignore list\n if (options.ignoreHosts?.find((ignoreHost: string) => wildcardMatch(host, ignoreHost))) {\n return false;\n }\n\n // false if the status code is not 500-599 and there are no captureRules\n if (\n !options.captureRules &&\n networkEvent.status !== undefined &&\n !isStatusCodeInRange(networkEvent.status, DEFAULT_STATUS_CODE_RANGE)\n ) {\n return false;\n }\n\n if (options.captureRules) {\n // find the first capture rule, in reverse-order,\n // that is a match (true) or a miss (false)\n let isMatch: boolean | undefined;\n [...options.captureRules].reverse().find((rule) => {\n isMatch = isCaptureRuleMatch(rule, host, networkEvent.status, networkEvent.url, networkEvent.method);\n\n if (isMatch) {\n const responseHeadersRule = parseHeaderCaptureRule(rule.responseHeaders);\n if (networkEvent.responseWrapper && responseHeadersRule) {\n const responseHeaders = networkEvent.responseWrapper.headers(responseHeadersRule);\n if (responseHeaders) {\n networkEvent.responseHeaders = responseHeaders;\n }\n }\n\n // if requestHeaders rule is specified, enrich the event with the request headers\n const requestHeadersRule = parseHeaderCaptureRule(rule.requestHeaders);\n if (networkEvent.requestWrapper && requestHeadersRule) {\n const requestHeaders = networkEvent.requestWrapper.headers(requestHeadersRule);\n if (requestHeaders) {\n networkEvent.requestHeaders = requestHeaders;\n }\n }\n\n // if responseBody rule is specified, enrich the event with the response body\n if (networkEvent.responseWrapper && rule.responseBody && !isBodyCaptureRuleEmpty(rule.responseBody)) {\n networkEvent.responseBodyJson = networkEvent.responseWrapper.json(\n rule.responseBody.allowlist,\n rule.responseBody.blocklist,\n );\n }\n\n // if requestBody rule is specified, enrich the event with the request body\n if (networkEvent.requestWrapper && rule.requestBody && !isBodyCaptureRuleEmpty(rule.requestBody)) {\n networkEvent.requestBodyJson = networkEvent.requestWrapper.json(\n rule.requestBody.allowlist,\n rule.requestBody.blocklist,\n );\n }\n }\n\n return isMatch !== undefined;\n });\n\n // if we found a miss (false) or no match (undefined),\n // then do not track the event\n if (!isMatch) {\n return false;\n }\n }\n\n // skip Amplitude network requests to \"[Amplitude] Network Request\" to avoid infinite loop\n if (networkEvent.requestWrapper && isAmplitudeNetworkRequestEvent(host, networkEvent.requestWrapper)) {\n return false;\n }\n\n return true;\n}\n\nexport type NetworkAnalyticsEvent = {\n ['[Amplitude] URL']: string;\n ['[Amplitude] URL Query']?: string;\n ['[Amplitude] URL Fragment']?: string;\n ['[Amplitude] Request Method']: string;\n ['[Amplitude] Status Code']?: number;\n ['[Amplitude] Start Time']?: number; // unix timestamp\n ['[Amplitude] Completion Time']?: number; // unix timestamp\n ['[Amplitude] Duration']?: number; // completionTime - startTime (millis)\n ['[Amplitude] Request Body Size']?: number;\n ['[Amplitude] Request Headers']?: Record<string, string>;\n ['[Amplitude] Request Body']?: string;\n ['[Amplitude] Response Body Size']?: number;\n ['[Amplitude] Response Headers']?: Record<string, string>;\n ['[Amplitude] Response Body']?: string;\n ['[Amplitude] Request Type']?: 'xhr' | 'fetch';\n};\n\nexport async function logNetworkAnalyticsEvent(\n networkAnalyticsEvent: NetworkAnalyticsEvent,\n request: NetworkRequestEvent,\n amplitude: BrowserClient,\n loggerProvider?: ILogger,\n) {\n if (request.requestBodyJson || request.responseBodyJson) {\n const [requestBody, responseBody] = await Promise.all([request.requestBodyJson, request.responseBodyJson]);\n if (requestBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Request Body'] = JSON.stringify(requestBody);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.debug('Failed to stringify request body', e);\n }\n }\n if (responseBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Response Body'] = JSON.stringify(responseBody);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.debug('Failed to stringify response body');\n }\n }\n }\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_NETWORK_REQUEST_EVENT, networkAnalyticsEvent);\n}\n\nexport function trackNetworkEvents({\n allObservables,\n networkTrackingOptions,\n amplitude,\n loggerProvider,\n}: {\n allObservables: AllWindowObservables;\n networkTrackingOptions: NetworkTrackingOptions;\n amplitude: BrowserClient;\n loggerProvider?: ILogger;\n}): Unsubscribable {\n const { networkObservable } = allObservables;\n\n const filteredNetworkObservable = networkObservable.filter((event: TimestampedEvent<NetworkRequestEvent>) => {\n // Only track network events that should be tracked\n return shouldTrackNetworkEvent(event.event as NetworkRequestEvent, networkTrackingOptions);\n });\n\n return filteredNetworkObservable.subscribe((networkEvent) => {\n const request = networkEvent.event;\n\n // convert to NetworkAnalyticsEvent\n const urlObj = parseUrl(request.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a very unlikely case, because URL() shouldn't throw an exception\n // when the URL is a valid URL\n /* istanbul ignore next */\n return;\n }\n\n const responseBodySize = request.responseWrapper?.bodySize;\n /* istanbul ignore next */\n const requestBodySize = request.requestWrapper?.bodySize;\n\n const networkAnalyticsEvent: NetworkAnalyticsEvent = {\n ['[Amplitude] URL']: urlObj.hrefWithoutQueryOrHash,\n ['[Amplitude] URL Query']: urlObj.query,\n ['[Amplitude] URL Fragment']: urlObj.fragment,\n ['[Amplitude] Request Method']: request.method,\n ['[Amplitude] Status Code']: request.status,\n ['[Amplitude] Start Time']: request.startTime,\n ['[Amplitude] Completion Time']: request.endTime,\n ['[Amplitude] Duration']: request.duration,\n ['[Amplitude] Request Body Size']: requestBodySize,\n ['[Amplitude] Response Body Size']: responseBodySize,\n ['[Amplitude] Request Type']: request.type,\n ['[Amplitude] Request Headers']: request.requestHeaders,\n ['[Amplitude] Response Headers']: request.responseHeaders,\n };\n\n // fire-and-forget promise that tracks the event\n void logNetworkAnalyticsEvent(networkAnalyticsEvent, request, amplitude, loggerProvider);\n });\n}\n"]}
1
+ {"version":3,"file":"track-network-event.js","sourceRoot":"","sources":["../../src/track-network-event.ts"],"names":[],"mappings":";AAAA,OAAO,EAKL,cAAc,EACd,mBAAmB,EACnB,YAAY,GAEb,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAI9F,IAAM,yBAAyB,GAAG,SAAS,CAAC;AAE5C,SAAS,aAAa,CAAC,GAAW,EAAE,OAAe;IACjD,mDAAmD;IACnD,IAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;IAC1E,oBAAoB;IACpB,IAAM,YAAY,GAAG,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC;IACrE,IAAM,KAAK,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,mBAAmB,CAAC,UAAkB,EAAE,KAAa;;IAC5D,IAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;QAChC,KAAgB,IAAA,WAAA,SAAA,MAAM,CAAA,8BAAA,kDAAE;YAAnB,IAAM,CAAC,mBAAA;YACJ,IAAA,KAAA,OAAe,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAA,EAAtC,KAAK,QAAA,EAAE,GAAG,QAA4B,CAAC;YAC9C,IAAI,UAAU,KAAK,KAAK,IAAI,GAAG,KAAK,SAAS,EAAE;gBAC7C,OAAO,IAAI,CAAC;aACb;YACD,IAAI,UAAU,IAAI,KAAK,IAAI,UAAU,IAAI,GAAG,EAAE;gBAC5C,OAAO,IAAI,CAAC;aACb;SACF;;;;;;;;;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAwB,EACxB,QAAgB,EAChB,MAAe,EACf,GAAY,EACZ,MAAe;IAEf,4CAA4C;IAC5C,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAC,IAAY,IAAK,OAAA,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,EAA7B,CAA6B,CAAC,EAAE;QACnF,OAAO;KACR;IAED,kDAAkD;IAClD,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;QAC5D,OAAO;KACR;IAED,gDAAgD;IAChD,IACE,MAAM;QACN,IAAI,CAAC,OAAO;QACZ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAChB,UAAC,aAAqB,IAAK,OAAA,MAAM,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE,IAAI,aAAa,KAAK,GAAG,EAA7E,CAA6E,CACzG,EACD;QACA,OAAO;KACR;IAED,mDAAmD;IACnD,IAAI,MAAM,IAAI,MAAM,KAAK,CAAC,EAAE;QAC1B,IAAM,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,yBAAyB,CAAC;QAC1E,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE;YACjD,OAAO,KAAK,CAAC;SACd;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,GAAuB;;IACvC,IAAI,CAAC,GAAG,EAAE;QACR,OAAO;KACR;IACD,IAAI;QACF,0BAA0B;QAC1B,IAAM,WAAW,GAAG,MAAA,cAAc,EAAE,0CAAE,QAAQ,CAAC,IAAI,CAAC;QACpD,IAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACzC,IAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC7C,IAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACjB,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,IAAM,sBAAsB,GAAG,MAAM,CAAC,IAAI,CAAC;QAC3C,OAAO,EAAE,KAAK,OAAA,EAAE,QAAQ,UAAA,EAAE,IAAI,MAAA,EAAE,sBAAsB,wBAAA,EAAE,IAAI,MAAA,EAAE,CAAC;KAChE;IAAC,OAAO,CAAC,EAAE;QACV,0BAA0B;QAC1B,OAAO;KACR;AACH,CAAC;AAED,SAAS,8BAA8B,CAAC,IAAY,EAAE,cAA+B;IACnF,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;QAClC,IAAI;YACF,IAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;YACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBAC5B,OAAO,KAAK,CAAC;aACd;YACD,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;YAC9C,IAAA,MAAM,GAAK,OAAO,OAAZ,CAAa;YAC3B,yEAAyE;YACzE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAC,KAAU,IAAK,OAAA,KAAK,CAAC,UAAU,KAAK,+BAA+B,EAApD,CAAoD,CAAC,EAAE;gBACrF,OAAO,IAAI,CAAC;aACb;SACF;QAAC,OAAO,CAAC,EAAE;YACV,aAAa;SACd;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAA2C;IAChF,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE;QAC7C,sDAAsD;QACtD,IAAI,IAAI,EAAE;YACR,gCAAW,YAAY,UAAE;SAC1B;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE;YAC7B,0BAA0B;YAC1B,IAAM,GAAG,GAAG,8BAA8B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,0BAAK,YAAY,SAAC,CAAC;YAC3E,OAAO,GAAG,CAAC;SACZ;QACD,OAAO;KACR;IAED,qDAAqD;IACrD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,OAAO;KACR;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAqB;;IACnD,0BAA0B;IAC1B,OAAO,CAAC,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,0CAAE,MAAM,CAAA,IAAI,CAAC,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,0CAAE,MAAM,CAAA,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,YAAiC,EAAE,OAAoC;;IAApC,wBAAA,EAAA,YAAoC;IAC7G,IAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1C,wBAAwB;IACxB,IAAI,CAAC,MAAM,EAAE;QACX,qDAAqD;QACrD,oFAAoF;QACpF,0BAA0B;QAC1B,OAAO,KAAK,CAAC;KACd;IACO,IAAA,IAAI,GAAK,MAAM,KAAX,CAAY;IAExB,+EAA+E;IAC/E,IACE,OAAO,CAAC,uBAAuB,KAAK,KAAK;QACzC,CAAC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,EAChF;QACA,OAAO,KAAK,CAAC;KACd;IAED,0CAA0C;IAC1C,IAAI,MAAA,OAAO,CAAC,WAAW,0CAAE,IAAI,CAAC,UAAC,UAAkB,IAAK,OAAA,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,EAA/B,CAA+B,CAAC,EAAE;QACtF,OAAO,KAAK,CAAC;KACd;IAED,wEAAwE;IACxE,IACE,CAAC,OAAO,CAAC,YAAY;QACrB,YAAY,CAAC,MAAM,KAAK,SAAS;QACjC,CAAC,mBAAmB,CAAC,YAAY,CAAC,MAAM,EAAE,yBAAyB,CAAC,EACpE;QACA,OAAO,KAAK,CAAC;KACd;IAED,IAAI,OAAO,CAAC,YAAY,EAAE;QACxB,iDAAiD;QACjD,2CAA2C;QAC3C,IAAI,SAA4B,CAAC;QACjC,yBAAI,OAAO,CAAC,YAAY,UAAE,OAAO,EAAE,CAAC,IAAI,CAAC,UAAC,IAAI;YAC5C,SAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;YAErG,IAAI,SAAO,EAAE;gBACX,IAAM,mBAAmB,GAAG,sBAAsB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACzE,IAAI,YAAY,CAAC,eAAe,IAAI,mBAAmB,EAAE;oBACvD,IAAM,eAAe,GAAG,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;oBAClF,IAAI,eAAe,EAAE;wBACnB,YAAY,CAAC,eAAe,GAAG,eAAe,CAAC;qBAChD;iBACF;gBAED,iFAAiF;gBACjF,IAAM,kBAAkB,GAAG,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACvE,IAAI,YAAY,CAAC,cAAc,IAAI,kBAAkB,EAAE;oBACrD,IAAM,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;oBAC/E,IAAI,cAAc,EAAE;wBAClB,YAAY,CAAC,cAAc,GAAG,cAAc,CAAC;qBAC9C;iBACF;gBAED,6EAA6E;gBAC7E,IAAI,YAAY,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;oBACnG,YAAY,CAAC,gBAAgB,GAAG,YAAY,CAAC,eAAe,CAAC,IAAI,CAC/D,IAAI,CAAC,YAAY,CAAC,SAAS,EAC3B,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;iBACH;gBAED,2EAA2E;gBAC3E,IAAI,YAAY,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;oBAChG,YAAY,CAAC,eAAe,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAC7D,IAAI,CAAC,WAAW,CAAC,SAAS,EAC1B,IAAI,CAAC,WAAW,CAAC,SAAS,CAC3B,CAAC;iBACH;aACF;YAED,OAAO,SAAO,KAAK,SAAS,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,sDAAsD;QACtD,8BAA8B;QAC9B,IAAI,CAAC,SAAO,EAAE;YACZ,OAAO,KAAK,CAAC;SACd;KACF;IAED,0FAA0F;IAC1F,IAAI,YAAY,CAAC,cAAc,IAAI,8BAA8B,CAAC,IAAI,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE;QACpG,OAAO,KAAK,CAAC;KACd;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAoBD,MAAM,UAAgB,wBAAwB,CAC5C,qBAA4C,EAC5C,OAA4B,EAC5B,SAAwB,EACxB,cAAwB;;;;;;yBAEpB,CAAA,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAA,EAAnD,wBAAmD;oBACjB,qBAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAA;;oBAApG,KAAA,sBAA8B,SAAsE,KAAA,EAAnG,WAAW,QAAA,EAAE,YAAY,QAAA;oBAChC,IAAI,WAAW,EAAE;wBACf,IAAI;4BACF,qBAAqB,CAAC,0BAA0B,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;yBACjF;wBAAC,OAAO,CAAC,EAAE;4BACV,0BAA0B;4BAC1B,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;yBAC9D;qBACF;oBACD,IAAI,YAAY,EAAE;wBAChB,IAAI;4BACF,qBAAqB,CAAC,2BAA2B,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;yBACnF;wBAAC,OAAO,CAAC,EAAE;4BACV,0BAA0B;4BAC1B,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,CAAC,mCAAmC,CAAC,CAAC;yBAC5D;qBACF;;;oBAEH,0BAA0B;oBAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,+BAA+B,EAAE,qBAAqB,CAAC,CAAC;;;;;CAC1E;AAED,MAAM,UAAU,kBAAkB,CAAC,EAUlC;QATC,cAAc,oBAAA,EACd,sBAAsB,4BAAA,EACtB,SAAS,eAAA,EACT,cAAc,oBAAA;IAON,IAAA,iBAAiB,GAAK,cAAc,kBAAnB,CAAoB;IAE7C,IAAM,yBAAyB,GAAG,iBAAiB,CAAC,IAAI,CACtD,MAAM,CAAC,UAAC,KAA4C;QAClD,oDAAoD;QACpD,OAAO,uBAAuB,CAAC,KAAK,CAAC,KAA4B,EAAE,sBAAsB,CAAC,CAAC;IAC7F,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,yBAAyB,CAAC,SAAS,CAAC,UAAC,YAAY;;;QACtD,IAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC;QAEnC,mCAAmC;QACnC,IAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,wBAAwB;QACxB,IAAI,CAAC,MAAM,EAAE;YACX,qDAAqD;YACrD,2EAA2E;YAC3E,8BAA8B;YAC9B,0BAA0B;YAC1B,OAAO;SACR;QAED,IAAM,gBAAgB,GAAG,MAAA,OAAO,CAAC,eAAe,0CAAE,QAAQ,CAAC;QAC3D,0BAA0B;QAC1B,IAAM,eAAe,GAAG,MAAA,OAAO,CAAC,cAAc,0CAAE,QAAQ,CAAC;QAEzD,IAAM,qBAAqB;YACzB,GAAC,iBAAiB,IAAG,MAAM,CAAC,sBAAsB;YAClD,GAAC,uBAAuB,IAAG,MAAM,CAAC,KAAK;YACvC,GAAC,0BAA0B,IAAG,MAAM,CAAC,QAAQ;YAC7C,GAAC,4BAA4B,IAAG,OAAO,CAAC,MAAM;YAC9C,GAAC,yBAAyB,IAAG,OAAO,CAAC,MAAM;YAC3C,GAAC,wBAAwB,IAAG,OAAO,CAAC,SAAS;YAC7C,GAAC,6BAA6B,IAAG,OAAO,CAAC,OAAO;YAChD,GAAC,sBAAsB,IAAG,OAAO,CAAC,QAAQ;YAC1C,GAAC,+BAA+B,IAAG,eAAe;YAClD,GAAC,gCAAgC,IAAG,gBAAgB;YACpD,GAAC,0BAA0B,IAAG,OAAO,CAAC,IAAI;YAC1C,GAAC,6BAA6B,IAAG,OAAO,CAAC,cAAc;YACvD,GAAC,8BAA8B,IAAG,OAAO,CAAC,eAAe;eAC1D,CAAC;QAEF,gDAAgD;QAChD,KAAK,wBAAwB,CAAC,qBAAqB,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n BrowserClient,\n NetworkRequestEvent,\n NetworkCaptureRule,\n NetworkTrackingOptions,\n getGlobalScope,\n isUrlMatchAllowlist,\n SAFE_HEADERS,\n ILogger,\n} from '@amplitude/analytics-core';\nimport { filter } from 'rxjs';\nimport { AllWindowObservables, TimestampedEvent } from './network-capture-plugin';\nimport { AMPLITUDE_NETWORK_REQUEST_EVENT, IS_HEADER_CAPTURE_EXPERIMENTAL } from './constants';\nimport { IRequestWrapper } from '@amplitude/analytics-core';\nimport { BodyCaptureRule } from '@amplitude/analytics-core/lib/esm/types/network-tracking';\n\nconst DEFAULT_STATUS_CODE_RANGE = '500-599';\n\nfunction wildcardMatch(str: string, pattern: string) {\n // Escape all regex special characters except for *\n const escapedPattern = pattern.replace(/[-[\\]{}()+?.,\\\\^$|#\\s]/g, '\\\\$&');\n // Replace * with .*\n const regexPattern = '^' + escapedPattern.replace(/\\*/g, '.*') + '$';\n const regex = new RegExp(regexPattern);\n return regex.test(str);\n}\n\nfunction isStatusCodeInRange(statusCode: number, range: string) {\n const ranges = range.split(',');\n for (const r of ranges) {\n const [start, end] = r.split('-').map(Number);\n if (statusCode === start && end === undefined) {\n return true;\n }\n if (statusCode >= start && statusCode <= end) {\n return true;\n }\n }\n return false;\n}\n\nfunction isCaptureRuleMatch(\n rule: NetworkCaptureRule,\n hostname: string,\n status?: number,\n url?: string,\n method?: string,\n) {\n // check if the host is in the allowed hosts\n if (rule.hosts && !rule.hosts.find((host: string) => wildcardMatch(hostname, host))) {\n return;\n }\n\n // check if the URL is in the allowed URL patterns\n if (url && rule.urls && !isUrlMatchAllowlist(url, rule.urls)) {\n return;\n }\n\n // check if the method is in the allowed methods\n if (\n method &&\n rule.methods &&\n !rule.methods.find(\n (allowedMethod: string) => method.toLowerCase() === allowedMethod.toLowerCase() || allowedMethod === '*',\n )\n ) {\n return;\n }\n\n // check if the status code is in the allowed range\n if (status || status === 0) {\n const statusCodeRange = rule.statusCodeRange || DEFAULT_STATUS_CODE_RANGE;\n if (!isStatusCodeInRange(status, statusCodeRange)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseUrl(url: string | undefined) {\n if (!url) {\n return;\n }\n try {\n /* istanbul ignore next */\n const currentHref = getGlobalScope()?.location.href;\n const urlObj = new URL(url, currentHref);\n const query = urlObj.searchParams.toString();\n const fragment = urlObj.hash.replace('#', '');\n const href = urlObj.href;\n const host = urlObj.host;\n urlObj.hash = '';\n urlObj.search = '';\n const hrefWithoutQueryOrHash = urlObj.href;\n return { query, fragment, href, hrefWithoutQueryOrHash, host };\n } catch (e) {\n /* istanbul ignore next */\n return;\n }\n}\n\nfunction isAmplitudeNetworkRequestEvent(host: string, requestWrapper: IRequestWrapper): boolean {\n if (host.includes('amplitude.com')) {\n try {\n const body = requestWrapper.body;\n if (typeof body !== 'string') {\n return false;\n }\n const bodyObj = JSON.parse(body) as { events: any[] };\n const { events } = bodyObj;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n if (events.find((event: any) => event.event_type === AMPLITUDE_NETWORK_REQUEST_EVENT)) {\n return true;\n }\n } catch (e) {\n // do nothing\n }\n }\n return false;\n}\n\n/**\n * Takes a user provided header capture rule and returns a\n * HeaderCaptureRule object that sets proper default values.\n *\n * @param rule - The header capture rule to parse.\n * @returns A HeaderCaptureRule object.\n */\nexport function parseHeaderCaptureRule(rule: string[] | boolean | undefined | null): string[] | undefined {\n if (typeof rule !== 'object' || rule === null) {\n // if rule is truthy or undefined, return SAFE_HEADERS\n if (rule) {\n return [...SAFE_HEADERS];\n } else if (rule === undefined) {\n /* istanbul ignore next */\n const res = IS_HEADER_CAPTURE_EXPERIMENTAL ? undefined : [...SAFE_HEADERS];\n return res;\n }\n return;\n }\n\n // if the rule is defined but empty, return undefined\n if (rule.length === 0) {\n return;\n }\n\n return rule;\n}\n\nfunction isBodyCaptureRuleEmpty(rule: BodyCaptureRule) {\n /* istanbul ignore next */\n return !rule?.allowlist?.length && !rule?.blocklist?.length;\n}\n\nexport function shouldTrackNetworkEvent(networkEvent: NetworkRequestEvent, options: NetworkTrackingOptions = {}) {\n const urlObj = parseUrl(networkEvent.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a probably impossible case that would only happen if the URL is malformed\n /* istanbul ignore next */\n return false;\n }\n const { host } = urlObj;\n\n // false if is amplitude request and not configured to track amplitude requests\n if (\n options.ignoreAmplitudeRequests !== false &&\n (wildcardMatch(host, '*.amplitude.com') || wildcardMatch(host, 'amplitude.com'))\n ) {\n return false;\n }\n\n // false if the host is in the ignore list\n if (options.ignoreHosts?.find((ignoreHost: string) => wildcardMatch(host, ignoreHost))) {\n return false;\n }\n\n // false if the status code is not 500-599 and there are no captureRules\n if (\n !options.captureRules &&\n networkEvent.status !== undefined &&\n !isStatusCodeInRange(networkEvent.status, DEFAULT_STATUS_CODE_RANGE)\n ) {\n return false;\n }\n\n if (options.captureRules) {\n // find the first capture rule, in reverse-order,\n // that is a match (true) or a miss (false)\n let isMatch: boolean | undefined;\n [...options.captureRules].reverse().find((rule) => {\n isMatch = isCaptureRuleMatch(rule, host, networkEvent.status, networkEvent.url, networkEvent.method);\n\n if (isMatch) {\n const responseHeadersRule = parseHeaderCaptureRule(rule.responseHeaders);\n if (networkEvent.responseWrapper && responseHeadersRule) {\n const responseHeaders = networkEvent.responseWrapper.headers(responseHeadersRule);\n if (responseHeaders) {\n networkEvent.responseHeaders = responseHeaders;\n }\n }\n\n // if requestHeaders rule is specified, enrich the event with the request headers\n const requestHeadersRule = parseHeaderCaptureRule(rule.requestHeaders);\n if (networkEvent.requestWrapper && requestHeadersRule) {\n const requestHeaders = networkEvent.requestWrapper.headers(requestHeadersRule);\n if (requestHeaders) {\n networkEvent.requestHeaders = requestHeaders;\n }\n }\n\n // if responseBody rule is specified, enrich the event with the response body\n if (networkEvent.responseWrapper && rule.responseBody && !isBodyCaptureRuleEmpty(rule.responseBody)) {\n networkEvent.responseBodyJson = networkEvent.responseWrapper.json(\n rule.responseBody.allowlist,\n rule.responseBody.blocklist,\n );\n }\n\n // if requestBody rule is specified, enrich the event with the request body\n if (networkEvent.requestWrapper && rule.requestBody && !isBodyCaptureRuleEmpty(rule.requestBody)) {\n networkEvent.requestBodyJson = networkEvent.requestWrapper.json(\n rule.requestBody.allowlist,\n rule.requestBody.blocklist,\n );\n }\n }\n\n return isMatch !== undefined;\n });\n\n // if we found a miss (false) or no match (undefined),\n // then do not track the event\n if (!isMatch) {\n return false;\n }\n }\n\n // skip Amplitude network requests to \"[Amplitude] Network Request\" to avoid infinite loop\n if (networkEvent.requestWrapper && isAmplitudeNetworkRequestEvent(host, networkEvent.requestWrapper)) {\n return false;\n }\n\n return true;\n}\n\nexport type NetworkAnalyticsEvent = {\n ['[Amplitude] URL']: string;\n ['[Amplitude] URL Query']?: string;\n ['[Amplitude] URL Fragment']?: string;\n ['[Amplitude] Request Method']: string;\n ['[Amplitude] Status Code']?: number;\n ['[Amplitude] Start Time']?: number; // unix timestamp\n ['[Amplitude] Completion Time']?: number; // unix timestamp\n ['[Amplitude] Duration']?: number; // completionTime - startTime (millis)\n ['[Amplitude] Request Body Size']?: number;\n ['[Amplitude] Request Headers']?: Record<string, string>;\n ['[Amplitude] Request Body']?: string;\n ['[Amplitude] Response Body Size']?: number;\n ['[Amplitude] Response Headers']?: Record<string, string>;\n ['[Amplitude] Response Body']?: string;\n ['[Amplitude] Request Type']?: 'xhr' | 'fetch';\n};\n\nexport async function logNetworkAnalyticsEvent(\n networkAnalyticsEvent: NetworkAnalyticsEvent,\n request: NetworkRequestEvent,\n amplitude: BrowserClient,\n loggerProvider?: ILogger,\n) {\n if (request.requestBodyJson || request.responseBodyJson) {\n const [requestBody, responseBody] = await Promise.all([request.requestBodyJson, request.responseBodyJson]);\n if (requestBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Request Body'] = JSON.stringify(requestBody);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.debug('Failed to stringify request body', e);\n }\n }\n if (responseBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Response Body'] = JSON.stringify(responseBody);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.debug('Failed to stringify response body');\n }\n }\n }\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_NETWORK_REQUEST_EVENT, networkAnalyticsEvent);\n}\n\nexport function trackNetworkEvents({\n allObservables,\n networkTrackingOptions,\n amplitude,\n loggerProvider,\n}: {\n allObservables: AllWindowObservables;\n networkTrackingOptions: NetworkTrackingOptions;\n amplitude: BrowserClient;\n loggerProvider?: ILogger;\n}) {\n const { networkObservable } = allObservables;\n\n const filteredNetworkObservable = networkObservable.pipe(\n filter((event: TimestampedEvent<NetworkRequestEvent>) => {\n // Only track network events that should be tracked,\n return shouldTrackNetworkEvent(event.event as NetworkRequestEvent, networkTrackingOptions);\n }),\n );\n\n return filteredNetworkObservable.subscribe((networkEvent) => {\n const request = networkEvent.event;\n\n // convert to NetworkAnalyticsEvent\n const urlObj = parseUrl(request.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a very unlikely case, because URL() shouldn't throw an exception\n // when the URL is a valid URL\n /* istanbul ignore next */\n return;\n }\n\n const responseBodySize = request.responseWrapper?.bodySize;\n /* istanbul ignore next */\n const requestBodySize = request.requestWrapper?.bodySize;\n\n const networkAnalyticsEvent: NetworkAnalyticsEvent = {\n ['[Amplitude] URL']: urlObj.hrefWithoutQueryOrHash,\n ['[Amplitude] URL Query']: urlObj.query,\n ['[Amplitude] URL Fragment']: urlObj.fragment,\n ['[Amplitude] Request Method']: request.method,\n ['[Amplitude] Status Code']: request.status,\n ['[Amplitude] Start Time']: request.startTime,\n ['[Amplitude] Completion Time']: request.endTime,\n ['[Amplitude] Duration']: request.duration,\n ['[Amplitude] Request Body Size']: requestBodySize,\n ['[Amplitude] Response Body Size']: responseBodySize,\n ['[Amplitude] Request Type']: request.type,\n ['[Amplitude] Request Headers']: request.requestHeaders,\n ['[Amplitude] Response Headers']: request.responseHeaders,\n };\n\n // fire-and-forget promise that tracks the event\n void logNetworkAnalyticsEvent(networkAnalyticsEvent, request, amplitude, loggerProvider);\n });\n}\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "1.6.14-zen-plus-zoning.0";
1
+ export declare const VERSION = "1.6.15";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,6BAA6B,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAC"}
@@ -1,2 +1,2 @@
1
- export var VERSION = '1.6.14-zen-plus-zoning.0';
1
+ export var VERSION = '1.6.15';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,OAAO,GAAG,0BAA0B,CAAC","sourcesContent":["export const VERSION = '1.6.14-zen-plus-zoning.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '1.6.15';\n"]}