@metamask-previews/analytics-data-regulation-controller 0.0.0-preview-40d5fb1e2 → 0.0.0-preview-a3e31582e

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 (30) hide show
  1. package/dist/AnalyticsDataRegulationController-method-action-types.cjs.map +1 -1
  2. package/dist/AnalyticsDataRegulationController-method-action-types.d.cts.map +1 -1
  3. package/dist/AnalyticsDataRegulationController-method-action-types.d.mts.map +1 -1
  4. package/dist/AnalyticsDataRegulationController-method-action-types.mjs.map +1 -1
  5. package/dist/AnalyticsDataRegulationController.cjs +5 -5
  6. package/dist/AnalyticsDataRegulationController.cjs.map +1 -1
  7. package/dist/AnalyticsDataRegulationController.d.cts.map +1 -1
  8. package/dist/AnalyticsDataRegulationController.d.mts.map +1 -1
  9. package/dist/AnalyticsDataRegulationController.mjs.map +1 -1
  10. package/dist/AnalyticsDataRegulationService-method-action-types.cjs.map +1 -1
  11. package/dist/AnalyticsDataRegulationService-method-action-types.d.cts.map +1 -1
  12. package/dist/AnalyticsDataRegulationService-method-action-types.d.mts.map +1 -1
  13. package/dist/AnalyticsDataRegulationService-method-action-types.mjs.map +1 -1
  14. package/dist/AnalyticsDataRegulationService.cjs +5 -5
  15. package/dist/AnalyticsDataRegulationService.cjs.map +1 -1
  16. package/dist/AnalyticsDataRegulationService.d.cts.map +1 -1
  17. package/dist/AnalyticsDataRegulationService.d.mts.map +1 -1
  18. package/dist/AnalyticsDataRegulationService.mjs.map +1 -1
  19. package/dist/index.cjs +10 -10
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +1 -1
  22. package/dist/index.d.cts.map +1 -1
  23. package/dist/index.d.mts +1 -1
  24. package/dist/index.d.mts.map +1 -1
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/selectors.cjs.map +1 -1
  27. package/dist/selectors.d.cts.map +1 -1
  28. package/dist/selectors.d.mts.map +1 -1
  29. package/dist/selectors.mjs.map +1 -1
  30. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationController-method-action-types.cjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController-method-action-types.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { AnalyticsDataRegulationController } from './AnalyticsDataRegulationController';\n\n/**\n * Creates a new delete regulation for the user.\n * This is necessary to respect the GDPR and CCPA regulations.\n *\n * @returns Promise containing the status of the request with regulateId\n * @throws Error if analytics ID is missing or if the service call fails\n */\nexport type AnalyticsDataRegulationControllerCreateDataDeletionTaskAction = {\n type: `AnalyticsDataRegulationController:createDataDeletionTask`;\n handler: AnalyticsDataRegulationController['createDataDeletionTask'];\n};\n\n/**\n * Check the latest delete regulation status.\n *\n * @returns Promise containing the timestamp, delete status and collected data flag\n */\nexport type AnalyticsDataRegulationControllerCheckDataDeleteStatusAction = {\n type: `AnalyticsDataRegulationController:checkDataDeleteStatus`;\n handler: AnalyticsDataRegulationController['checkDataDeleteStatus'];\n};\n\n/**\n * Update the data recording flag if needed.\n * This method should be called after tracking events to ensure\n * the data recording flag is properly updated for data deletion workflows.\n *\n * The flag can only be set to `true` (indicating data has been collected).\n * It cannot be explicitly set to `false` - it is only reset to `false` when\n * a new deletion task is created via `createDataDeletionTask`.\n *\n */\nexport type AnalyticsDataRegulationControllerUpdateDataRecordingFlagAction = {\n type: `AnalyticsDataRegulationController:updateDataRecordingFlag`;\n handler: AnalyticsDataRegulationController['updateDataRecordingFlag'];\n};\n\n/**\n * Union of all AnalyticsDataRegulationController action types.\n */\nexport type AnalyticsDataRegulationControllerMethodActions =\n | AnalyticsDataRegulationControllerCreateDataDeletionTaskAction\n | AnalyticsDataRegulationControllerCheckDataDeleteStatusAction\n | AnalyticsDataRegulationControllerUpdateDataRecordingFlagAction;\n"]}
1
+ {"version":3,"file":"AnalyticsDataRegulationController-method-action-types.cjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController-method-action-types.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { AnalyticsDataRegulationController } from './AnalyticsDataRegulationController.js';\n\n/**\n * Creates a new delete regulation for the user.\n * This is necessary to respect the GDPR and CCPA regulations.\n *\n * @returns Promise containing the status of the request with regulateId\n * @throws Error if analytics ID is missing or if the service call fails\n */\nexport type AnalyticsDataRegulationControllerCreateDataDeletionTaskAction = {\n type: `AnalyticsDataRegulationController:createDataDeletionTask`;\n handler: AnalyticsDataRegulationController['createDataDeletionTask'];\n};\n\n/**\n * Check the latest delete regulation status.\n *\n * @returns Promise containing the timestamp, delete status and collected data flag\n */\nexport type AnalyticsDataRegulationControllerCheckDataDeleteStatusAction = {\n type: `AnalyticsDataRegulationController:checkDataDeleteStatus`;\n handler: AnalyticsDataRegulationController['checkDataDeleteStatus'];\n};\n\n/**\n * Update the data recording flag if needed.\n * This method should be called after tracking events to ensure\n * the data recording flag is properly updated for data deletion workflows.\n *\n * The flag can only be set to `true` (indicating data has been collected).\n * It cannot be explicitly set to `false` - it is only reset to `false` when\n * a new deletion task is created via `createDataDeletionTask`.\n *\n */\nexport type AnalyticsDataRegulationControllerUpdateDataRecordingFlagAction = {\n type: `AnalyticsDataRegulationController:updateDataRecordingFlag`;\n handler: AnalyticsDataRegulationController['updateDataRecordingFlag'];\n};\n\n/**\n * Union of all AnalyticsDataRegulationController action types.\n */\nexport type AnalyticsDataRegulationControllerMethodActions =\n | AnalyticsDataRegulationControllerCreateDataDeletionTaskAction\n | AnalyticsDataRegulationControllerCheckDataDeleteStatusAction\n | AnalyticsDataRegulationControllerUpdateDataRecordingFlagAction;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationController-method-action-types.d.cts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iCAAiC,EAAE,gDAA4C;AAE7F;;;;;;GAMG;AACH,MAAM,MAAM,6DAA6D,GAAG;IAC1E,IAAI,EAAE,0DAA0D,CAAC;IACjE,OAAO,EAAE,iCAAiC,CAAC,wBAAwB,CAAC,CAAC;CACtE,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,4DAA4D,GAAG;IACzE,IAAI,EAAE,yDAAyD,CAAC;IAChE,OAAO,EAAE,iCAAiC,CAAC,uBAAuB,CAAC,CAAC;CACrE,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,8DAA8D,GAAG;IAC3E,IAAI,EAAE,2DAA2D,CAAC;IAClE,OAAO,EAAE,iCAAiC,CAAC,yBAAyB,CAAC,CAAC;CACvE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,8CAA8C,GACtD,6DAA6D,GAC7D,4DAA4D,GAC5D,8DAA8D,CAAC"}
1
+ {"version":3,"file":"AnalyticsDataRegulationController-method-action-types.d.cts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iCAAiC,EAAE,gDAA+C;AAEhG;;;;;;GAMG;AACH,MAAM,MAAM,6DAA6D,GAAG;IAC1E,IAAI,EAAE,0DAA0D,CAAC;IACjE,OAAO,EAAE,iCAAiC,CAAC,wBAAwB,CAAC,CAAC;CACtE,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,4DAA4D,GAAG;IACzE,IAAI,EAAE,yDAAyD,CAAC;IAChE,OAAO,EAAE,iCAAiC,CAAC,uBAAuB,CAAC,CAAC;CACrE,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,8DAA8D,GAAG;IAC3E,IAAI,EAAE,2DAA2D,CAAC;IAClE,OAAO,EAAE,iCAAiC,CAAC,yBAAyB,CAAC,CAAC;CACvE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,8CAA8C,GACtD,6DAA6D,GAC7D,4DAA4D,GAC5D,8DAA8D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationController-method-action-types.d.mts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iCAAiC,EAAE,gDAA4C;AAE7F;;;;;;GAMG;AACH,MAAM,MAAM,6DAA6D,GAAG;IAC1E,IAAI,EAAE,0DAA0D,CAAC;IACjE,OAAO,EAAE,iCAAiC,CAAC,wBAAwB,CAAC,CAAC;CACtE,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,4DAA4D,GAAG;IACzE,IAAI,EAAE,yDAAyD,CAAC;IAChE,OAAO,EAAE,iCAAiC,CAAC,uBAAuB,CAAC,CAAC;CACrE,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,8DAA8D,GAAG;IAC3E,IAAI,EAAE,2DAA2D,CAAC;IAClE,OAAO,EAAE,iCAAiC,CAAC,yBAAyB,CAAC,CAAC;CACvE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,8CAA8C,GACtD,6DAA6D,GAC7D,4DAA4D,GAC5D,8DAA8D,CAAC"}
1
+ {"version":3,"file":"AnalyticsDataRegulationController-method-action-types.d.mts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iCAAiC,EAAE,gDAA+C;AAEhG;;;;;;GAMG;AACH,MAAM,MAAM,6DAA6D,GAAG;IAC1E,IAAI,EAAE,0DAA0D,CAAC;IACjE,OAAO,EAAE,iCAAiC,CAAC,wBAAwB,CAAC,CAAC;CACtE,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,4DAA4D,GAAG;IACzE,IAAI,EAAE,yDAAyD,CAAC;IAChE,OAAO,EAAE,iCAAiC,CAAC,uBAAuB,CAAC,CAAC;CACrE,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,8DAA8D,GAAG;IAC3E,IAAI,EAAE,2DAA2D,CAAC;IAClE,OAAO,EAAE,iCAAiC,CAAC,yBAAyB,CAAC,CAAC;CACvE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,8CAA8C,GACtD,6DAA6D,GAC7D,4DAA4D,GAC5D,8DAA8D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationController-method-action-types.mjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { AnalyticsDataRegulationController } from './AnalyticsDataRegulationController';\n\n/**\n * Creates a new delete regulation for the user.\n * This is necessary to respect the GDPR and CCPA regulations.\n *\n * @returns Promise containing the status of the request with regulateId\n * @throws Error if analytics ID is missing or if the service call fails\n */\nexport type AnalyticsDataRegulationControllerCreateDataDeletionTaskAction = {\n type: `AnalyticsDataRegulationController:createDataDeletionTask`;\n handler: AnalyticsDataRegulationController['createDataDeletionTask'];\n};\n\n/**\n * Check the latest delete regulation status.\n *\n * @returns Promise containing the timestamp, delete status and collected data flag\n */\nexport type AnalyticsDataRegulationControllerCheckDataDeleteStatusAction = {\n type: `AnalyticsDataRegulationController:checkDataDeleteStatus`;\n handler: AnalyticsDataRegulationController['checkDataDeleteStatus'];\n};\n\n/**\n * Update the data recording flag if needed.\n * This method should be called after tracking events to ensure\n * the data recording flag is properly updated for data deletion workflows.\n *\n * The flag can only be set to `true` (indicating data has been collected).\n * It cannot be explicitly set to `false` - it is only reset to `false` when\n * a new deletion task is created via `createDataDeletionTask`.\n *\n */\nexport type AnalyticsDataRegulationControllerUpdateDataRecordingFlagAction = {\n type: `AnalyticsDataRegulationController:updateDataRecordingFlag`;\n handler: AnalyticsDataRegulationController['updateDataRecordingFlag'];\n};\n\n/**\n * Union of all AnalyticsDataRegulationController action types.\n */\nexport type AnalyticsDataRegulationControllerMethodActions =\n | AnalyticsDataRegulationControllerCreateDataDeletionTaskAction\n | AnalyticsDataRegulationControllerCheckDataDeleteStatusAction\n | AnalyticsDataRegulationControllerUpdateDataRecordingFlagAction;\n"]}
1
+ {"version":3,"file":"AnalyticsDataRegulationController-method-action-types.mjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { AnalyticsDataRegulationController } from './AnalyticsDataRegulationController.js';\n\n/**\n * Creates a new delete regulation for the user.\n * This is necessary to respect the GDPR and CCPA regulations.\n *\n * @returns Promise containing the status of the request with regulateId\n * @throws Error if analytics ID is missing or if the service call fails\n */\nexport type AnalyticsDataRegulationControllerCreateDataDeletionTaskAction = {\n type: `AnalyticsDataRegulationController:createDataDeletionTask`;\n handler: AnalyticsDataRegulationController['createDataDeletionTask'];\n};\n\n/**\n * Check the latest delete regulation status.\n *\n * @returns Promise containing the timestamp, delete status and collected data flag\n */\nexport type AnalyticsDataRegulationControllerCheckDataDeleteStatusAction = {\n type: `AnalyticsDataRegulationController:checkDataDeleteStatus`;\n handler: AnalyticsDataRegulationController['checkDataDeleteStatus'];\n};\n\n/**\n * Update the data recording flag if needed.\n * This method should be called after tracking events to ensure\n * the data recording flag is properly updated for data deletion workflows.\n *\n * The flag can only be set to `true` (indicating data has been collected).\n * It cannot be explicitly set to `false` - it is only reset to `false` when\n * a new deletion task is created via `createDataDeletionTask`.\n *\n */\nexport type AnalyticsDataRegulationControllerUpdateDataRecordingFlagAction = {\n type: `AnalyticsDataRegulationController:updateDataRecordingFlag`;\n handler: AnalyticsDataRegulationController['updateDataRecordingFlag'];\n};\n\n/**\n * Union of all AnalyticsDataRegulationController action types.\n */\nexport type AnalyticsDataRegulationControllerMethodActions =\n | AnalyticsDataRegulationControllerCreateDataDeletionTaskAction\n | AnalyticsDataRegulationControllerCheckDataDeleteStatusAction\n | AnalyticsDataRegulationControllerUpdateDataRecordingFlagAction;\n"]}
@@ -14,8 +14,8 @@ var _AnalyticsDataRegulationController_analyticsId;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.AnalyticsDataRegulationController = exports.getDefaultAnalyticsDataRegulationControllerState = exports.controllerName = void 0;
16
16
  const base_controller_1 = require("@metamask/base-controller");
17
- const logger_1 = require("./logger.cjs");
18
- const types_1 = require("./types.cjs");
17
+ const logger_js_1 = require("./logger.cjs");
18
+ const types_js_1 = require("./types.cjs");
19
19
  // === GENERAL ===
20
20
  /**
21
21
  * The name of the {@link AnalyticsDataRegulationController}, used to namespace the
@@ -96,7 +96,7 @@ class AnalyticsDataRegulationController extends base_controller_1.BaseController
96
96
  _AnalyticsDataRegulationController_analyticsId.set(this, void 0);
97
97
  __classPrivateFieldSet(this, _AnalyticsDataRegulationController_analyticsId, analyticsId, "f");
98
98
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
99
- (0, logger_1.projectLogger)('AnalyticsDataRegulationController initialized', {
99
+ (0, logger_js_1.projectLogger)('AnalyticsDataRegulationController initialized', {
100
100
  hasCollectedDataSinceDeletionRequest: this.state.hasCollectedDataSinceDeletionRequest,
101
101
  hasDeleteRegulationId: Boolean(this.state.deleteRegulationId),
102
102
  deleteRegulationTimestamp: this.state.deleteRegulationTimestamp,
@@ -112,7 +112,7 @@ class AnalyticsDataRegulationController extends base_controller_1.BaseController
112
112
  async createDataDeletionTask() {
113
113
  if (!__classPrivateFieldGet(this, _AnalyticsDataRegulationController_analyticsId, "f") || __classPrivateFieldGet(this, _AnalyticsDataRegulationController_analyticsId, "f").trim() === '') {
114
114
  const error = new Error('Analytics ID not found. You need to provide a valid analytics ID when initializing the AnalyticsDataRegulationController.');
115
- (0, logger_1.projectLogger)('Analytics Deletion Task Error', error);
115
+ (0, logger_js_1.projectLogger)('Analytics Deletion Task Error', error);
116
116
  throw error;
117
117
  }
118
118
  const response = await this.messenger.call('AnalyticsDataRegulationService:createDataDeletionTask', __classPrivateFieldGet(this, _AnalyticsDataRegulationController_analyticsId, "f"));
@@ -140,7 +140,7 @@ class AnalyticsDataRegulationController extends base_controller_1.BaseController
140
140
  const { hasCollectedDataSinceDeletionRequest } = this.state;
141
141
  const status = {
142
142
  deletionRequestTimestamp: deleteRegulationTimestamp,
143
- dataDeletionRequestStatus: types_1.DATA_DELETE_STATUSES.Unknown,
143
+ dataDeletionRequestStatus: types_js_1.DATA_DELETE_STATUSES.Unknown,
144
144
  hasCollectedDataSinceDeletionRequest,
145
145
  };
146
146
  if (!deleteRegulationId) {
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationController.cjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\n\nimport type { AnalyticsDataRegulationControllerMethodActions } from './AnalyticsDataRegulationController-method-action-types';\nimport type { AnalyticsDataRegulationServiceActions } from './AnalyticsDataRegulationService';\nimport { projectLogger as log } from './logger';\nimport { DATA_DELETE_RESPONSE_STATUSES, DATA_DELETE_STATUSES } from './types';\nimport type { DeleteRegulationResponse, DeleteRegulationStatus } from './types';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link AnalyticsDataRegulationController}, used to namespace the\n * controller's actions and events and to namespace the controller's state data\n * when composed with other controllers.\n */\nexport const controllerName = 'AnalyticsDataRegulationController';\n\n// === STATE ===\n\n/**\n * Describes the shape of the state object for {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerState = {\n /**\n * Indicates if data has been recorded since the last deletion request.\n */\n hasCollectedDataSinceDeletionRequest: boolean;\n\n /**\n * Segment's data deletion regulation ID.\n * The ID returned by the Segment delete API which allows checking the status of the deletion request.\n */\n deleteRegulationId?: string;\n\n /**\n * Segment's data deletion regulation creation timestamp.\n * The timestamp (in milliseconds since epoch) when the deletion request was created.\n */\n deleteRegulationTimestamp?: number;\n};\n\n/**\n * Returns default values for AnalyticsDataRegulationController state.\n *\n * @returns Default state\n */\nexport function getDefaultAnalyticsDataRegulationControllerState(): AnalyticsDataRegulationControllerState {\n return {\n hasCollectedDataSinceDeletionRequest: false,\n };\n}\n\n/**\n * The metadata for each property in {@link AnalyticsDataRegulationControllerState}.\n */\nconst analyticsDataRegulationControllerMetadata = {\n hasCollectedDataSinceDeletionRequest: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n deleteRegulationId: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n deleteRegulationTimestamp: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n} satisfies StateMetadata<AnalyticsDataRegulationControllerState>;\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'createDataDeletionTask',\n 'checkDataDeleteStatus',\n 'updateDataRecordingFlag',\n] as const;\n\n/**\n * Returns the state of the {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n AnalyticsDataRegulationControllerState\n >;\n\n/**\n * Actions that {@link AnalyticsDataRegulationControllerMessenger} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationControllerActions =\n | AnalyticsDataRegulationControllerGetStateAction\n | AnalyticsDataRegulationControllerMethodActions;\n\n/**\n * Actions from other messengers that {@link AnalyticsDataRegulationControllerMessenger} calls.\n */\ntype AllowedActions = AnalyticsDataRegulationServiceActions;\n\n/**\n * Event emitted when a data deletion task is created.\n */\nexport type DataDeletionTaskCreatedEvent = {\n type: `${typeof controllerName}:dataDeletionTaskCreated`;\n payload: [DeleteRegulationResponse];\n};\n\n/**\n * Event emitted when the data recording flag is updated.\n */\nexport type DataRecordingFlagUpdatedEvent = {\n type: `${typeof controllerName}:dataRecordingFlagUpdated`;\n payload: [boolean];\n};\n\n/**\n * Event emitted when the state of the {@link AnalyticsDataRegulationController} changes.\n */\nexport type AnalyticsDataRegulationControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n AnalyticsDataRegulationControllerState\n >;\n\n/**\n * Events that {@link AnalyticsDataRegulationControllerMessenger} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationControllerEvents =\n | AnalyticsDataRegulationControllerStateChangeEvent\n | DataDeletionTaskCreatedEvent\n | DataRecordingFlagUpdatedEvent;\n\n/**\n * Events from other messengers that {@link AnalyticsDataRegulationControllerMessenger} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerMessenger = Messenger<\n typeof controllerName,\n AnalyticsDataRegulationControllerActions | AllowedActions,\n AnalyticsDataRegulationControllerEvents | AllowedEvents\n>;\n\n// === CONTROLLER DEFINITION ===\n\n/**\n * The options that AnalyticsDataRegulationController takes.\n */\nexport type AnalyticsDataRegulationControllerOptions = {\n /**\n * Initial controller state.\n */\n state?: Partial<AnalyticsDataRegulationControllerState>;\n /**\n * Messenger used to communicate with BaseController and other controllers.\n */\n messenger: AnalyticsDataRegulationControllerMessenger;\n /**\n * Analytics ID used for data deletion requests.\n */\n analyticsId: string;\n};\n\n/**\n * The AnalyticsDataRegulationController manages analytics privacy and GDPR/CCPA data deletion functionality.\n * It communicates with Segment's Regulations API via a proxy to create and monitor data deletion requests.\n *\n * This controller follows the MetaMask controller pattern and integrates with the\n * messenger system to allow other controllers and components to manage data deletion tasks.\n */\nexport class AnalyticsDataRegulationController extends BaseController<\n typeof controllerName,\n AnalyticsDataRegulationControllerState,\n AnalyticsDataRegulationControllerMessenger\n> {\n /**\n * Analytics ID used for data deletion requests.\n */\n readonly #analyticsId: string;\n\n /**\n * Constructs an AnalyticsDataRegulationController instance.\n *\n * @param options - Controller options\n * @param options.state - Initial controller state. Use `getDefaultAnalyticsDataRegulationControllerState()` for defaults.\n * @param options.messenger - Messenger used to communicate with BaseController\n * @param options.analyticsId - Analytics ID used for data deletion requests\n */\n constructor({\n state = {},\n messenger,\n analyticsId,\n }: AnalyticsDataRegulationControllerOptions) {\n const initialState: AnalyticsDataRegulationControllerState = {\n ...getDefaultAnalyticsDataRegulationControllerState(),\n ...state,\n };\n\n super({\n name: controllerName,\n metadata: analyticsDataRegulationControllerMetadata,\n state: initialState,\n messenger,\n });\n\n this.#analyticsId = analyticsId;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n log('AnalyticsDataRegulationController initialized', {\n hasCollectedDataSinceDeletionRequest:\n this.state.hasCollectedDataSinceDeletionRequest,\n hasDeleteRegulationId: Boolean(this.state.deleteRegulationId),\n deleteRegulationTimestamp: this.state.deleteRegulationTimestamp,\n });\n }\n\n /**\n * Creates a new delete regulation for the user.\n * This is necessary to respect the GDPR and CCPA regulations.\n *\n * @returns Promise containing the status of the request with regulateId\n * @throws Error if analytics ID is missing or if the service call fails\n */\n async createDataDeletionTask(): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n regulateId: string;\n }> {\n if (!this.#analyticsId || this.#analyticsId.trim() === '') {\n const error = new Error(\n 'Analytics ID not found. You need to provide a valid analytics ID when initializing the AnalyticsDataRegulationController.',\n );\n log('Analytics Deletion Task Error', error);\n throw error;\n }\n\n const response = await this.messenger.call(\n 'AnalyticsDataRegulationService:createDataDeletionTask',\n this.#analyticsId,\n );\n\n const deletionTimestamp = Date.now();\n // Service validates and throws on all errors, so if we reach here, the response\n // is guaranteed to be a success response with regulateId present\n this.update((state) => {\n state.deleteRegulationId = response.regulateId;\n state.deleteRegulationTimestamp = deletionTimestamp;\n state.hasCollectedDataSinceDeletionRequest = false;\n });\n\n this.messenger.publish(\n `${controllerName}:dataDeletionTaskCreated`,\n response,\n );\n\n return response;\n }\n\n /**\n * Check the latest delete regulation status.\n *\n * @returns Promise containing the timestamp, delete status and collected data flag\n */\n async checkDataDeleteStatus(): Promise<DeleteRegulationStatus> {\n // Capture all state values before async call to ensure consistency\n // in case createDataDeletionTask() completes concurrently\n const { deleteRegulationId } = this.state;\n const { deleteRegulationTimestamp } = this.state;\n const { hasCollectedDataSinceDeletionRequest } = this.state;\n\n const status: DeleteRegulationStatus = {\n deletionRequestTimestamp: deleteRegulationTimestamp,\n dataDeletionRequestStatus: DATA_DELETE_STATUSES.Unknown,\n hasCollectedDataSinceDeletionRequest,\n };\n\n if (!deleteRegulationId) {\n return status;\n }\n\n // Service validates and throws on all errors, so if we reach here, the response\n // is guaranteed to be a success response with dataDeleteStatus present\n const dataDeletionTaskStatus = await this.messenger.call(\n 'AnalyticsDataRegulationService:checkDataDeleteStatus',\n deleteRegulationId,\n );\n\n status.dataDeletionRequestStatus = dataDeletionTaskStatus.dataDeleteStatus;\n\n return status;\n }\n\n /**\n * Update the data recording flag if needed.\n * This method should be called after tracking events to ensure\n * the data recording flag is properly updated for data deletion workflows.\n *\n * The flag can only be set to `true` (indicating data has been collected).\n * It cannot be explicitly set to `false` - it is only reset to `false` when\n * a new deletion task is created via `createDataDeletionTask`.\n *\n */\n updateDataRecordingFlag(): void {\n if (!this.state.hasCollectedDataSinceDeletionRequest) {\n this.update((state) => {\n state.hasCollectedDataSinceDeletionRequest = true;\n });\n\n this.messenger.publish(\n `${controllerName}:dataRecordingFlagUpdated`,\n true,\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"AnalyticsDataRegulationController.cjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\n\nimport type { AnalyticsDataRegulationControllerMethodActions } from './AnalyticsDataRegulationController-method-action-types.js';\nimport type { AnalyticsDataRegulationServiceActions } from './AnalyticsDataRegulationService.js';\nimport { projectLogger as log } from './logger.js';\nimport {\n DATA_DELETE_RESPONSE_STATUSES,\n DATA_DELETE_STATUSES,\n} from './types.js';\nimport type {\n DeleteRegulationResponse,\n DeleteRegulationStatus,\n} from './types.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link AnalyticsDataRegulationController}, used to namespace the\n * controller's actions and events and to namespace the controller's state data\n * when composed with other controllers.\n */\nexport const controllerName = 'AnalyticsDataRegulationController';\n\n// === STATE ===\n\n/**\n * Describes the shape of the state object for {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerState = {\n /**\n * Indicates if data has been recorded since the last deletion request.\n */\n hasCollectedDataSinceDeletionRequest: boolean;\n\n /**\n * Segment's data deletion regulation ID.\n * The ID returned by the Segment delete API which allows checking the status of the deletion request.\n */\n deleteRegulationId?: string;\n\n /**\n * Segment's data deletion regulation creation timestamp.\n * The timestamp (in milliseconds since epoch) when the deletion request was created.\n */\n deleteRegulationTimestamp?: number;\n};\n\n/**\n * Returns default values for AnalyticsDataRegulationController state.\n *\n * @returns Default state\n */\nexport function getDefaultAnalyticsDataRegulationControllerState(): AnalyticsDataRegulationControllerState {\n return {\n hasCollectedDataSinceDeletionRequest: false,\n };\n}\n\n/**\n * The metadata for each property in {@link AnalyticsDataRegulationControllerState}.\n */\nconst analyticsDataRegulationControllerMetadata = {\n hasCollectedDataSinceDeletionRequest: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n deleteRegulationId: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n deleteRegulationTimestamp: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n} satisfies StateMetadata<AnalyticsDataRegulationControllerState>;\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'createDataDeletionTask',\n 'checkDataDeleteStatus',\n 'updateDataRecordingFlag',\n] as const;\n\n/**\n * Returns the state of the {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n AnalyticsDataRegulationControllerState\n >;\n\n/**\n * Actions that {@link AnalyticsDataRegulationControllerMessenger} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationControllerActions =\n | AnalyticsDataRegulationControllerGetStateAction\n | AnalyticsDataRegulationControllerMethodActions;\n\n/**\n * Actions from other messengers that {@link AnalyticsDataRegulationControllerMessenger} calls.\n */\ntype AllowedActions = AnalyticsDataRegulationServiceActions;\n\n/**\n * Event emitted when a data deletion task is created.\n */\nexport type DataDeletionTaskCreatedEvent = {\n type: `${typeof controllerName}:dataDeletionTaskCreated`;\n payload: [DeleteRegulationResponse];\n};\n\n/**\n * Event emitted when the data recording flag is updated.\n */\nexport type DataRecordingFlagUpdatedEvent = {\n type: `${typeof controllerName}:dataRecordingFlagUpdated`;\n payload: [boolean];\n};\n\n/**\n * Event emitted when the state of the {@link AnalyticsDataRegulationController} changes.\n */\nexport type AnalyticsDataRegulationControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n AnalyticsDataRegulationControllerState\n >;\n\n/**\n * Events that {@link AnalyticsDataRegulationControllerMessenger} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationControllerEvents =\n | AnalyticsDataRegulationControllerStateChangeEvent\n | DataDeletionTaskCreatedEvent\n | DataRecordingFlagUpdatedEvent;\n\n/**\n * Events from other messengers that {@link AnalyticsDataRegulationControllerMessenger} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerMessenger = Messenger<\n typeof controllerName,\n AnalyticsDataRegulationControllerActions | AllowedActions,\n AnalyticsDataRegulationControllerEvents | AllowedEvents\n>;\n\n// === CONTROLLER DEFINITION ===\n\n/**\n * The options that AnalyticsDataRegulationController takes.\n */\nexport type AnalyticsDataRegulationControllerOptions = {\n /**\n * Initial controller state.\n */\n state?: Partial<AnalyticsDataRegulationControllerState>;\n /**\n * Messenger used to communicate with BaseController and other controllers.\n */\n messenger: AnalyticsDataRegulationControllerMessenger;\n /**\n * Analytics ID used for data deletion requests.\n */\n analyticsId: string;\n};\n\n/**\n * The AnalyticsDataRegulationController manages analytics privacy and GDPR/CCPA data deletion functionality.\n * It communicates with Segment's Regulations API via a proxy to create and monitor data deletion requests.\n *\n * This controller follows the MetaMask controller pattern and integrates with the\n * messenger system to allow other controllers and components to manage data deletion tasks.\n */\nexport class AnalyticsDataRegulationController extends BaseController<\n typeof controllerName,\n AnalyticsDataRegulationControllerState,\n AnalyticsDataRegulationControllerMessenger\n> {\n /**\n * Analytics ID used for data deletion requests.\n */\n readonly #analyticsId: string;\n\n /**\n * Constructs an AnalyticsDataRegulationController instance.\n *\n * @param options - Controller options\n * @param options.state - Initial controller state. Use `getDefaultAnalyticsDataRegulationControllerState()` for defaults.\n * @param options.messenger - Messenger used to communicate with BaseController\n * @param options.analyticsId - Analytics ID used for data deletion requests\n */\n constructor({\n state = {},\n messenger,\n analyticsId,\n }: AnalyticsDataRegulationControllerOptions) {\n const initialState: AnalyticsDataRegulationControllerState = {\n ...getDefaultAnalyticsDataRegulationControllerState(),\n ...state,\n };\n\n super({\n name: controllerName,\n metadata: analyticsDataRegulationControllerMetadata,\n state: initialState,\n messenger,\n });\n\n this.#analyticsId = analyticsId;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n log('AnalyticsDataRegulationController initialized', {\n hasCollectedDataSinceDeletionRequest:\n this.state.hasCollectedDataSinceDeletionRequest,\n hasDeleteRegulationId: Boolean(this.state.deleteRegulationId),\n deleteRegulationTimestamp: this.state.deleteRegulationTimestamp,\n });\n }\n\n /**\n * Creates a new delete regulation for the user.\n * This is necessary to respect the GDPR and CCPA regulations.\n *\n * @returns Promise containing the status of the request with regulateId\n * @throws Error if analytics ID is missing or if the service call fails\n */\n async createDataDeletionTask(): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n regulateId: string;\n }> {\n if (!this.#analyticsId || this.#analyticsId.trim() === '') {\n const error = new Error(\n 'Analytics ID not found. You need to provide a valid analytics ID when initializing the AnalyticsDataRegulationController.',\n );\n log('Analytics Deletion Task Error', error);\n throw error;\n }\n\n const response = await this.messenger.call(\n 'AnalyticsDataRegulationService:createDataDeletionTask',\n this.#analyticsId,\n );\n\n const deletionTimestamp = Date.now();\n // Service validates and throws on all errors, so if we reach here, the response\n // is guaranteed to be a success response with regulateId present\n this.update((state) => {\n state.deleteRegulationId = response.regulateId;\n state.deleteRegulationTimestamp = deletionTimestamp;\n state.hasCollectedDataSinceDeletionRequest = false;\n });\n\n this.messenger.publish(\n `${controllerName}:dataDeletionTaskCreated`,\n response,\n );\n\n return response;\n }\n\n /**\n * Check the latest delete regulation status.\n *\n * @returns Promise containing the timestamp, delete status and collected data flag\n */\n async checkDataDeleteStatus(): Promise<DeleteRegulationStatus> {\n // Capture all state values before async call to ensure consistency\n // in case createDataDeletionTask() completes concurrently\n const { deleteRegulationId } = this.state;\n const { deleteRegulationTimestamp } = this.state;\n const { hasCollectedDataSinceDeletionRequest } = this.state;\n\n const status: DeleteRegulationStatus = {\n deletionRequestTimestamp: deleteRegulationTimestamp,\n dataDeletionRequestStatus: DATA_DELETE_STATUSES.Unknown,\n hasCollectedDataSinceDeletionRequest,\n };\n\n if (!deleteRegulationId) {\n return status;\n }\n\n // Service validates and throws on all errors, so if we reach here, the response\n // is guaranteed to be a success response with dataDeleteStatus present\n const dataDeletionTaskStatus = await this.messenger.call(\n 'AnalyticsDataRegulationService:checkDataDeleteStatus',\n deleteRegulationId,\n );\n\n status.dataDeletionRequestStatus = dataDeletionTaskStatus.dataDeleteStatus;\n\n return status;\n }\n\n /**\n * Update the data recording flag if needed.\n * This method should be called after tracking events to ensure\n * the data recording flag is properly updated for data deletion workflows.\n *\n * The flag can only be set to `true` (indicating data has been collected).\n * It cannot be explicitly set to `false` - it is only reset to `false` when\n * a new deletion task is created via `createDataDeletionTask`.\n *\n */\n updateDataRecordingFlag(): void {\n if (!this.state.hasCollectedDataSinceDeletionRequest) {\n this.update((state) => {\n state.hasCollectedDataSinceDeletionRequest = true;\n });\n\n this.messenger.publish(\n `${controllerName}:dataRecordingFlagUpdated`,\n true,\n );\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationController.d.cts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAE3B,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAErD,OAAO,KAAK,EAAE,8CAA8C,EAAE,oEAAgE;AAC9H,OAAO,KAAK,EAAE,qCAAqC,EAAE,6CAAyC;AAE9F,OAAO,EAAE,6BAA6B,EAAwB,oBAAgB;AAC9E,OAAO,KAAK,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,oBAAgB;AAIhF;;;;GAIG;AACH,eAAO,MAAM,cAAc,sCAAsC,CAAC;AAIlE;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD;;OAEG;IACH,oCAAoC,EAAE,OAAO,CAAC;IAE9C;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gDAAgD,IAAI,sCAAsC,CAIzG;AAkCD;;GAEG;AACH,MAAM,MAAM,+CAA+C,GACzD,wBAAwB,CACtB,OAAO,cAAc,EACrB,sCAAsC,CACvC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAChD,+CAA+C,GAC/C,8CAA8C,CAAC;AAEnD;;GAEG;AACH,KAAK,cAAc,GAAG,qCAAqC,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,GAAG,OAAO,cAAc,0BAA0B,CAAC;IACzD,OAAO,EAAE,CAAC,wBAAwB,CAAC,CAAC;CACrC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,GAAG,OAAO,cAAc,2BAA2B,CAAC;IAC1D,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iDAAiD,GAC3D,0BAA0B,CACxB,OAAO,cAAc,EACrB,sCAAsC,CACvC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,uCAAuC,GAC/C,iDAAiD,GACjD,4BAA4B,GAC5B,6BAA6B,CAAC;AAElC;;GAEG;AACH,KAAK,aAAa,GAAG,KAAK,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,0CAA0C,GAAG,SAAS,CAChE,OAAO,cAAc,EACrB,wCAAwC,GAAG,cAAc,EACzD,uCAAuC,GAAG,aAAa,CACxD,CAAC;AAIF;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAAG;IACrD;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACxD;;OAEG;IACH,SAAS,EAAE,0CAA0C,CAAC;IACtD;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,iCAAkC,SAAQ,cAAc,CACnE,OAAO,cAAc,EACrB,sCAAsC,EACtC,0CAA0C,CAC3C;;IAMC;;;;;;;OAOG;gBACS,EACV,KAAU,EACV,SAAS,EACT,WAAW,GACZ,EAAE,wCAAwC;IA4B3C;;;;;;OAMG;IACG,sBAAsB,IAAI,OAAO,CAAC;QACtC,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IA+BF;;;;OAIG;IACG,qBAAqB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IA6B9D;;;;;;;;;OASG;IACH,uBAAuB,IAAI,IAAI;CAYhC"}
1
+ {"version":3,"file":"AnalyticsDataRegulationController.d.cts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAE3B,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAErD,OAAO,KAAK,EAAE,8CAA8C,EAAE,oEAAmE;AACjI,OAAO,KAAK,EAAE,qCAAqC,EAAE,6CAA4C;AAEjG,OAAO,EACL,6BAA6B,EAE9B,oBAAmB;AACpB,OAAO,KAAK,EACV,wBAAwB,EACxB,sBAAsB,EACvB,oBAAmB;AAIpB;;;;GAIG;AACH,eAAO,MAAM,cAAc,sCAAsC,CAAC;AAIlE;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD;;OAEG;IACH,oCAAoC,EAAE,OAAO,CAAC;IAE9C;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gDAAgD,IAAI,sCAAsC,CAIzG;AAkCD;;GAEG;AACH,MAAM,MAAM,+CAA+C,GACzD,wBAAwB,CACtB,OAAO,cAAc,EACrB,sCAAsC,CACvC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAChD,+CAA+C,GAC/C,8CAA8C,CAAC;AAEnD;;GAEG;AACH,KAAK,cAAc,GAAG,qCAAqC,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,GAAG,OAAO,cAAc,0BAA0B,CAAC;IACzD,OAAO,EAAE,CAAC,wBAAwB,CAAC,CAAC;CACrC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,GAAG,OAAO,cAAc,2BAA2B,CAAC;IAC1D,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iDAAiD,GAC3D,0BAA0B,CACxB,OAAO,cAAc,EACrB,sCAAsC,CACvC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,uCAAuC,GAC/C,iDAAiD,GACjD,4BAA4B,GAC5B,6BAA6B,CAAC;AAElC;;GAEG;AACH,KAAK,aAAa,GAAG,KAAK,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,0CAA0C,GAAG,SAAS,CAChE,OAAO,cAAc,EACrB,wCAAwC,GAAG,cAAc,EACzD,uCAAuC,GAAG,aAAa,CACxD,CAAC;AAIF;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAAG;IACrD;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACxD;;OAEG;IACH,SAAS,EAAE,0CAA0C,CAAC;IACtD;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,iCAAkC,SAAQ,cAAc,CACnE,OAAO,cAAc,EACrB,sCAAsC,EACtC,0CAA0C,CAC3C;;IAMC;;;;;;;OAOG;gBACS,EACV,KAAU,EACV,SAAS,EACT,WAAW,GACZ,EAAE,wCAAwC;IA4B3C;;;;;;OAMG;IACG,sBAAsB,IAAI,OAAO,CAAC;QACtC,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IA+BF;;;;OAIG;IACG,qBAAqB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IA6B9D;;;;;;;;;OASG;IACH,uBAAuB,IAAI,IAAI;CAYhC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationController.d.mts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAE3B,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAErD,OAAO,KAAK,EAAE,8CAA8C,EAAE,oEAAgE;AAC9H,OAAO,KAAK,EAAE,qCAAqC,EAAE,6CAAyC;AAE9F,OAAO,EAAE,6BAA6B,EAAwB,oBAAgB;AAC9E,OAAO,KAAK,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,oBAAgB;AAIhF;;;;GAIG;AACH,eAAO,MAAM,cAAc,sCAAsC,CAAC;AAIlE;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD;;OAEG;IACH,oCAAoC,EAAE,OAAO,CAAC;IAE9C;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gDAAgD,IAAI,sCAAsC,CAIzG;AAkCD;;GAEG;AACH,MAAM,MAAM,+CAA+C,GACzD,wBAAwB,CACtB,OAAO,cAAc,EACrB,sCAAsC,CACvC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAChD,+CAA+C,GAC/C,8CAA8C,CAAC;AAEnD;;GAEG;AACH,KAAK,cAAc,GAAG,qCAAqC,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,GAAG,OAAO,cAAc,0BAA0B,CAAC;IACzD,OAAO,EAAE,CAAC,wBAAwB,CAAC,CAAC;CACrC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,GAAG,OAAO,cAAc,2BAA2B,CAAC;IAC1D,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iDAAiD,GAC3D,0BAA0B,CACxB,OAAO,cAAc,EACrB,sCAAsC,CACvC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,uCAAuC,GAC/C,iDAAiD,GACjD,4BAA4B,GAC5B,6BAA6B,CAAC;AAElC;;GAEG;AACH,KAAK,aAAa,GAAG,KAAK,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,0CAA0C,GAAG,SAAS,CAChE,OAAO,cAAc,EACrB,wCAAwC,GAAG,cAAc,EACzD,uCAAuC,GAAG,aAAa,CACxD,CAAC;AAIF;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAAG;IACrD;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACxD;;OAEG;IACH,SAAS,EAAE,0CAA0C,CAAC;IACtD;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,iCAAkC,SAAQ,cAAc,CACnE,OAAO,cAAc,EACrB,sCAAsC,EACtC,0CAA0C,CAC3C;;IAMC;;;;;;;OAOG;gBACS,EACV,KAAU,EACV,SAAS,EACT,WAAW,GACZ,EAAE,wCAAwC;IA4B3C;;;;;;OAMG;IACG,sBAAsB,IAAI,OAAO,CAAC;QACtC,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IA+BF;;;;OAIG;IACG,qBAAqB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IA6B9D;;;;;;;;;OASG;IACH,uBAAuB,IAAI,IAAI;CAYhC"}
1
+ {"version":3,"file":"AnalyticsDataRegulationController.d.mts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAE3B,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAErD,OAAO,KAAK,EAAE,8CAA8C,EAAE,oEAAmE;AACjI,OAAO,KAAK,EAAE,qCAAqC,EAAE,6CAA4C;AAEjG,OAAO,EACL,6BAA6B,EAE9B,oBAAmB;AACpB,OAAO,KAAK,EACV,wBAAwB,EACxB,sBAAsB,EACvB,oBAAmB;AAIpB;;;;GAIG;AACH,eAAO,MAAM,cAAc,sCAAsC,CAAC;AAIlE;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD;;OAEG;IACH,oCAAoC,EAAE,OAAO,CAAC;IAE9C;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gDAAgD,IAAI,sCAAsC,CAIzG;AAkCD;;GAEG;AACH,MAAM,MAAM,+CAA+C,GACzD,wBAAwB,CACtB,OAAO,cAAc,EACrB,sCAAsC,CACvC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAChD,+CAA+C,GAC/C,8CAA8C,CAAC;AAEnD;;GAEG;AACH,KAAK,cAAc,GAAG,qCAAqC,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,GAAG,OAAO,cAAc,0BAA0B,CAAC;IACzD,OAAO,EAAE,CAAC,wBAAwB,CAAC,CAAC;CACrC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,GAAG,OAAO,cAAc,2BAA2B,CAAC;IAC1D,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iDAAiD,GAC3D,0BAA0B,CACxB,OAAO,cAAc,EACrB,sCAAsC,CACvC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,uCAAuC,GAC/C,iDAAiD,GACjD,4BAA4B,GAC5B,6BAA6B,CAAC;AAElC;;GAEG;AACH,KAAK,aAAa,GAAG,KAAK,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,0CAA0C,GAAG,SAAS,CAChE,OAAO,cAAc,EACrB,wCAAwC,GAAG,cAAc,EACzD,uCAAuC,GAAG,aAAa,CACxD,CAAC;AAIF;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAAG;IACrD;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACxD;;OAEG;IACH,SAAS,EAAE,0CAA0C,CAAC;IACtD;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,iCAAkC,SAAQ,cAAc,CACnE,OAAO,cAAc,EACrB,sCAAsC,EACtC,0CAA0C,CAC3C;;IAMC;;;;;;;OAOG;gBACS,EACV,KAAU,EACV,SAAS,EACT,WAAW,GACZ,EAAE,wCAAwC;IA4B3C;;;;;;OAMG;IACG,sBAAsB,IAAI,OAAO,CAAC;QACtC,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IA+BF;;;;OAIG;IACG,qBAAqB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IA6B9D;;;;;;;;;OASG;IACH,uBAAuB,IAAI,IAAI;CAYhC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationController.mjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\n\nimport type { AnalyticsDataRegulationControllerMethodActions } from './AnalyticsDataRegulationController-method-action-types';\nimport type { AnalyticsDataRegulationServiceActions } from './AnalyticsDataRegulationService';\nimport { projectLogger as log } from './logger';\nimport { DATA_DELETE_RESPONSE_STATUSES, DATA_DELETE_STATUSES } from './types';\nimport type { DeleteRegulationResponse, DeleteRegulationStatus } from './types';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link AnalyticsDataRegulationController}, used to namespace the\n * controller's actions and events and to namespace the controller's state data\n * when composed with other controllers.\n */\nexport const controllerName = 'AnalyticsDataRegulationController';\n\n// === STATE ===\n\n/**\n * Describes the shape of the state object for {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerState = {\n /**\n * Indicates if data has been recorded since the last deletion request.\n */\n hasCollectedDataSinceDeletionRequest: boolean;\n\n /**\n * Segment's data deletion regulation ID.\n * The ID returned by the Segment delete API which allows checking the status of the deletion request.\n */\n deleteRegulationId?: string;\n\n /**\n * Segment's data deletion regulation creation timestamp.\n * The timestamp (in milliseconds since epoch) when the deletion request was created.\n */\n deleteRegulationTimestamp?: number;\n};\n\n/**\n * Returns default values for AnalyticsDataRegulationController state.\n *\n * @returns Default state\n */\nexport function getDefaultAnalyticsDataRegulationControllerState(): AnalyticsDataRegulationControllerState {\n return {\n hasCollectedDataSinceDeletionRequest: false,\n };\n}\n\n/**\n * The metadata for each property in {@link AnalyticsDataRegulationControllerState}.\n */\nconst analyticsDataRegulationControllerMetadata = {\n hasCollectedDataSinceDeletionRequest: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n deleteRegulationId: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n deleteRegulationTimestamp: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n} satisfies StateMetadata<AnalyticsDataRegulationControllerState>;\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'createDataDeletionTask',\n 'checkDataDeleteStatus',\n 'updateDataRecordingFlag',\n] as const;\n\n/**\n * Returns the state of the {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n AnalyticsDataRegulationControllerState\n >;\n\n/**\n * Actions that {@link AnalyticsDataRegulationControllerMessenger} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationControllerActions =\n | AnalyticsDataRegulationControllerGetStateAction\n | AnalyticsDataRegulationControllerMethodActions;\n\n/**\n * Actions from other messengers that {@link AnalyticsDataRegulationControllerMessenger} calls.\n */\ntype AllowedActions = AnalyticsDataRegulationServiceActions;\n\n/**\n * Event emitted when a data deletion task is created.\n */\nexport type DataDeletionTaskCreatedEvent = {\n type: `${typeof controllerName}:dataDeletionTaskCreated`;\n payload: [DeleteRegulationResponse];\n};\n\n/**\n * Event emitted when the data recording flag is updated.\n */\nexport type DataRecordingFlagUpdatedEvent = {\n type: `${typeof controllerName}:dataRecordingFlagUpdated`;\n payload: [boolean];\n};\n\n/**\n * Event emitted when the state of the {@link AnalyticsDataRegulationController} changes.\n */\nexport type AnalyticsDataRegulationControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n AnalyticsDataRegulationControllerState\n >;\n\n/**\n * Events that {@link AnalyticsDataRegulationControllerMessenger} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationControllerEvents =\n | AnalyticsDataRegulationControllerStateChangeEvent\n | DataDeletionTaskCreatedEvent\n | DataRecordingFlagUpdatedEvent;\n\n/**\n * Events from other messengers that {@link AnalyticsDataRegulationControllerMessenger} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerMessenger = Messenger<\n typeof controllerName,\n AnalyticsDataRegulationControllerActions | AllowedActions,\n AnalyticsDataRegulationControllerEvents | AllowedEvents\n>;\n\n// === CONTROLLER DEFINITION ===\n\n/**\n * The options that AnalyticsDataRegulationController takes.\n */\nexport type AnalyticsDataRegulationControllerOptions = {\n /**\n * Initial controller state.\n */\n state?: Partial<AnalyticsDataRegulationControllerState>;\n /**\n * Messenger used to communicate with BaseController and other controllers.\n */\n messenger: AnalyticsDataRegulationControllerMessenger;\n /**\n * Analytics ID used for data deletion requests.\n */\n analyticsId: string;\n};\n\n/**\n * The AnalyticsDataRegulationController manages analytics privacy and GDPR/CCPA data deletion functionality.\n * It communicates with Segment's Regulations API via a proxy to create and monitor data deletion requests.\n *\n * This controller follows the MetaMask controller pattern and integrates with the\n * messenger system to allow other controllers and components to manage data deletion tasks.\n */\nexport class AnalyticsDataRegulationController extends BaseController<\n typeof controllerName,\n AnalyticsDataRegulationControllerState,\n AnalyticsDataRegulationControllerMessenger\n> {\n /**\n * Analytics ID used for data deletion requests.\n */\n readonly #analyticsId: string;\n\n /**\n * Constructs an AnalyticsDataRegulationController instance.\n *\n * @param options - Controller options\n * @param options.state - Initial controller state. Use `getDefaultAnalyticsDataRegulationControllerState()` for defaults.\n * @param options.messenger - Messenger used to communicate with BaseController\n * @param options.analyticsId - Analytics ID used for data deletion requests\n */\n constructor({\n state = {},\n messenger,\n analyticsId,\n }: AnalyticsDataRegulationControllerOptions) {\n const initialState: AnalyticsDataRegulationControllerState = {\n ...getDefaultAnalyticsDataRegulationControllerState(),\n ...state,\n };\n\n super({\n name: controllerName,\n metadata: analyticsDataRegulationControllerMetadata,\n state: initialState,\n messenger,\n });\n\n this.#analyticsId = analyticsId;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n log('AnalyticsDataRegulationController initialized', {\n hasCollectedDataSinceDeletionRequest:\n this.state.hasCollectedDataSinceDeletionRequest,\n hasDeleteRegulationId: Boolean(this.state.deleteRegulationId),\n deleteRegulationTimestamp: this.state.deleteRegulationTimestamp,\n });\n }\n\n /**\n * Creates a new delete regulation for the user.\n * This is necessary to respect the GDPR and CCPA regulations.\n *\n * @returns Promise containing the status of the request with regulateId\n * @throws Error if analytics ID is missing or if the service call fails\n */\n async createDataDeletionTask(): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n regulateId: string;\n }> {\n if (!this.#analyticsId || this.#analyticsId.trim() === '') {\n const error = new Error(\n 'Analytics ID not found. You need to provide a valid analytics ID when initializing the AnalyticsDataRegulationController.',\n );\n log('Analytics Deletion Task Error', error);\n throw error;\n }\n\n const response = await this.messenger.call(\n 'AnalyticsDataRegulationService:createDataDeletionTask',\n this.#analyticsId,\n );\n\n const deletionTimestamp = Date.now();\n // Service validates and throws on all errors, so if we reach here, the response\n // is guaranteed to be a success response with regulateId present\n this.update((state) => {\n state.deleteRegulationId = response.regulateId;\n state.deleteRegulationTimestamp = deletionTimestamp;\n state.hasCollectedDataSinceDeletionRequest = false;\n });\n\n this.messenger.publish(\n `${controllerName}:dataDeletionTaskCreated`,\n response,\n );\n\n return response;\n }\n\n /**\n * Check the latest delete regulation status.\n *\n * @returns Promise containing the timestamp, delete status and collected data flag\n */\n async checkDataDeleteStatus(): Promise<DeleteRegulationStatus> {\n // Capture all state values before async call to ensure consistency\n // in case createDataDeletionTask() completes concurrently\n const { deleteRegulationId } = this.state;\n const { deleteRegulationTimestamp } = this.state;\n const { hasCollectedDataSinceDeletionRequest } = this.state;\n\n const status: DeleteRegulationStatus = {\n deletionRequestTimestamp: deleteRegulationTimestamp,\n dataDeletionRequestStatus: DATA_DELETE_STATUSES.Unknown,\n hasCollectedDataSinceDeletionRequest,\n };\n\n if (!deleteRegulationId) {\n return status;\n }\n\n // Service validates and throws on all errors, so if we reach here, the response\n // is guaranteed to be a success response with dataDeleteStatus present\n const dataDeletionTaskStatus = await this.messenger.call(\n 'AnalyticsDataRegulationService:checkDataDeleteStatus',\n deleteRegulationId,\n );\n\n status.dataDeletionRequestStatus = dataDeletionTaskStatus.dataDeleteStatus;\n\n return status;\n }\n\n /**\n * Update the data recording flag if needed.\n * This method should be called after tracking events to ensure\n * the data recording flag is properly updated for data deletion workflows.\n *\n * The flag can only be set to `true` (indicating data has been collected).\n * It cannot be explicitly set to `false` - it is only reset to `false` when\n * a new deletion task is created via `createDataDeletionTask`.\n *\n */\n updateDataRecordingFlag(): void {\n if (!this.state.hasCollectedDataSinceDeletionRequest) {\n this.update((state) => {\n state.hasCollectedDataSinceDeletionRequest = true;\n });\n\n this.messenger.publish(\n `${controllerName}:dataRecordingFlagUpdated`,\n true,\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"AnalyticsDataRegulationController.mjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\n\nimport type { AnalyticsDataRegulationControllerMethodActions } from './AnalyticsDataRegulationController-method-action-types.js';\nimport type { AnalyticsDataRegulationServiceActions } from './AnalyticsDataRegulationService.js';\nimport { projectLogger as log } from './logger.js';\nimport {\n DATA_DELETE_RESPONSE_STATUSES,\n DATA_DELETE_STATUSES,\n} from './types.js';\nimport type {\n DeleteRegulationResponse,\n DeleteRegulationStatus,\n} from './types.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link AnalyticsDataRegulationController}, used to namespace the\n * controller's actions and events and to namespace the controller's state data\n * when composed with other controllers.\n */\nexport const controllerName = 'AnalyticsDataRegulationController';\n\n// === STATE ===\n\n/**\n * Describes the shape of the state object for {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerState = {\n /**\n * Indicates if data has been recorded since the last deletion request.\n */\n hasCollectedDataSinceDeletionRequest: boolean;\n\n /**\n * Segment's data deletion regulation ID.\n * The ID returned by the Segment delete API which allows checking the status of the deletion request.\n */\n deleteRegulationId?: string;\n\n /**\n * Segment's data deletion regulation creation timestamp.\n * The timestamp (in milliseconds since epoch) when the deletion request was created.\n */\n deleteRegulationTimestamp?: number;\n};\n\n/**\n * Returns default values for AnalyticsDataRegulationController state.\n *\n * @returns Default state\n */\nexport function getDefaultAnalyticsDataRegulationControllerState(): AnalyticsDataRegulationControllerState {\n return {\n hasCollectedDataSinceDeletionRequest: false,\n };\n}\n\n/**\n * The metadata for each property in {@link AnalyticsDataRegulationControllerState}.\n */\nconst analyticsDataRegulationControllerMetadata = {\n hasCollectedDataSinceDeletionRequest: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n deleteRegulationId: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n deleteRegulationTimestamp: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n} satisfies StateMetadata<AnalyticsDataRegulationControllerState>;\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'createDataDeletionTask',\n 'checkDataDeleteStatus',\n 'updateDataRecordingFlag',\n] as const;\n\n/**\n * Returns the state of the {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n AnalyticsDataRegulationControllerState\n >;\n\n/**\n * Actions that {@link AnalyticsDataRegulationControllerMessenger} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationControllerActions =\n | AnalyticsDataRegulationControllerGetStateAction\n | AnalyticsDataRegulationControllerMethodActions;\n\n/**\n * Actions from other messengers that {@link AnalyticsDataRegulationControllerMessenger} calls.\n */\ntype AllowedActions = AnalyticsDataRegulationServiceActions;\n\n/**\n * Event emitted when a data deletion task is created.\n */\nexport type DataDeletionTaskCreatedEvent = {\n type: `${typeof controllerName}:dataDeletionTaskCreated`;\n payload: [DeleteRegulationResponse];\n};\n\n/**\n * Event emitted when the data recording flag is updated.\n */\nexport type DataRecordingFlagUpdatedEvent = {\n type: `${typeof controllerName}:dataRecordingFlagUpdated`;\n payload: [boolean];\n};\n\n/**\n * Event emitted when the state of the {@link AnalyticsDataRegulationController} changes.\n */\nexport type AnalyticsDataRegulationControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n AnalyticsDataRegulationControllerState\n >;\n\n/**\n * Events that {@link AnalyticsDataRegulationControllerMessenger} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationControllerEvents =\n | AnalyticsDataRegulationControllerStateChangeEvent\n | DataDeletionTaskCreatedEvent\n | DataRecordingFlagUpdatedEvent;\n\n/**\n * Events from other messengers that {@link AnalyticsDataRegulationControllerMessenger} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link AnalyticsDataRegulationController}.\n */\nexport type AnalyticsDataRegulationControllerMessenger = Messenger<\n typeof controllerName,\n AnalyticsDataRegulationControllerActions | AllowedActions,\n AnalyticsDataRegulationControllerEvents | AllowedEvents\n>;\n\n// === CONTROLLER DEFINITION ===\n\n/**\n * The options that AnalyticsDataRegulationController takes.\n */\nexport type AnalyticsDataRegulationControllerOptions = {\n /**\n * Initial controller state.\n */\n state?: Partial<AnalyticsDataRegulationControllerState>;\n /**\n * Messenger used to communicate with BaseController and other controllers.\n */\n messenger: AnalyticsDataRegulationControllerMessenger;\n /**\n * Analytics ID used for data deletion requests.\n */\n analyticsId: string;\n};\n\n/**\n * The AnalyticsDataRegulationController manages analytics privacy and GDPR/CCPA data deletion functionality.\n * It communicates with Segment's Regulations API via a proxy to create and monitor data deletion requests.\n *\n * This controller follows the MetaMask controller pattern and integrates with the\n * messenger system to allow other controllers and components to manage data deletion tasks.\n */\nexport class AnalyticsDataRegulationController extends BaseController<\n typeof controllerName,\n AnalyticsDataRegulationControllerState,\n AnalyticsDataRegulationControllerMessenger\n> {\n /**\n * Analytics ID used for data deletion requests.\n */\n readonly #analyticsId: string;\n\n /**\n * Constructs an AnalyticsDataRegulationController instance.\n *\n * @param options - Controller options\n * @param options.state - Initial controller state. Use `getDefaultAnalyticsDataRegulationControllerState()` for defaults.\n * @param options.messenger - Messenger used to communicate with BaseController\n * @param options.analyticsId - Analytics ID used for data deletion requests\n */\n constructor({\n state = {},\n messenger,\n analyticsId,\n }: AnalyticsDataRegulationControllerOptions) {\n const initialState: AnalyticsDataRegulationControllerState = {\n ...getDefaultAnalyticsDataRegulationControllerState(),\n ...state,\n };\n\n super({\n name: controllerName,\n metadata: analyticsDataRegulationControllerMetadata,\n state: initialState,\n messenger,\n });\n\n this.#analyticsId = analyticsId;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n log('AnalyticsDataRegulationController initialized', {\n hasCollectedDataSinceDeletionRequest:\n this.state.hasCollectedDataSinceDeletionRequest,\n hasDeleteRegulationId: Boolean(this.state.deleteRegulationId),\n deleteRegulationTimestamp: this.state.deleteRegulationTimestamp,\n });\n }\n\n /**\n * Creates a new delete regulation for the user.\n * This is necessary to respect the GDPR and CCPA regulations.\n *\n * @returns Promise containing the status of the request with regulateId\n * @throws Error if analytics ID is missing or if the service call fails\n */\n async createDataDeletionTask(): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n regulateId: string;\n }> {\n if (!this.#analyticsId || this.#analyticsId.trim() === '') {\n const error = new Error(\n 'Analytics ID not found. You need to provide a valid analytics ID when initializing the AnalyticsDataRegulationController.',\n );\n log('Analytics Deletion Task Error', error);\n throw error;\n }\n\n const response = await this.messenger.call(\n 'AnalyticsDataRegulationService:createDataDeletionTask',\n this.#analyticsId,\n );\n\n const deletionTimestamp = Date.now();\n // Service validates and throws on all errors, so if we reach here, the response\n // is guaranteed to be a success response with regulateId present\n this.update((state) => {\n state.deleteRegulationId = response.regulateId;\n state.deleteRegulationTimestamp = deletionTimestamp;\n state.hasCollectedDataSinceDeletionRequest = false;\n });\n\n this.messenger.publish(\n `${controllerName}:dataDeletionTaskCreated`,\n response,\n );\n\n return response;\n }\n\n /**\n * Check the latest delete regulation status.\n *\n * @returns Promise containing the timestamp, delete status and collected data flag\n */\n async checkDataDeleteStatus(): Promise<DeleteRegulationStatus> {\n // Capture all state values before async call to ensure consistency\n // in case createDataDeletionTask() completes concurrently\n const { deleteRegulationId } = this.state;\n const { deleteRegulationTimestamp } = this.state;\n const { hasCollectedDataSinceDeletionRequest } = this.state;\n\n const status: DeleteRegulationStatus = {\n deletionRequestTimestamp: deleteRegulationTimestamp,\n dataDeletionRequestStatus: DATA_DELETE_STATUSES.Unknown,\n hasCollectedDataSinceDeletionRequest,\n };\n\n if (!deleteRegulationId) {\n return status;\n }\n\n // Service validates and throws on all errors, so if we reach here, the response\n // is guaranteed to be a success response with dataDeleteStatus present\n const dataDeletionTaskStatus = await this.messenger.call(\n 'AnalyticsDataRegulationService:checkDataDeleteStatus',\n deleteRegulationId,\n );\n\n status.dataDeletionRequestStatus = dataDeletionTaskStatus.dataDeleteStatus;\n\n return status;\n }\n\n /**\n * Update the data recording flag if needed.\n * This method should be called after tracking events to ensure\n * the data recording flag is properly updated for data deletion workflows.\n *\n * The flag can only be set to `true` (indicating data has been collected).\n * It cannot be explicitly set to `false` - it is only reset to `false` when\n * a new deletion task is created via `createDataDeletionTask`.\n *\n */\n updateDataRecordingFlag(): void {\n if (!this.state.hasCollectedDataSinceDeletionRequest) {\n this.update((state) => {\n state.hasCollectedDataSinceDeletionRequest = true;\n });\n\n this.messenger.publish(\n `${controllerName}:dataRecordingFlagUpdated`,\n true,\n );\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationService-method-action-types.cjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService-method-action-types.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { AnalyticsDataRegulationService } from './AnalyticsDataRegulationService';\n\n/**\n * Creates a DELETE_ONLY regulation for the given analyticsId.\n *\n * @param analyticsId - The analytics ID of the user for whom to create the deletion task.\n * @returns Promise resolving to a successful deletion regulation response.\n * @throws Error if the request fails or the response is invalid.\n */\nexport type AnalyticsDataRegulationServiceCreateDataDeletionTaskAction = {\n type: `AnalyticsDataRegulationService:createDataDeletionTask`;\n handler: AnalyticsDataRegulationService['createDataDeletionTask'];\n};\n\n/**\n * Checks the status of a regulation by ID.\n *\n * @param regulationId - The regulation ID to check.\n * @returns Promise resolving to a successful regulation status response.\n * @throws Error if the request fails or the response is invalid.\n */\nexport type AnalyticsDataRegulationServiceCheckDataDeleteStatusAction = {\n type: `AnalyticsDataRegulationService:checkDataDeleteStatus`;\n handler: AnalyticsDataRegulationService['checkDataDeleteStatus'];\n};\n\n/**\n * Union of all AnalyticsDataRegulationService action types.\n */\nexport type AnalyticsDataRegulationServiceMethodActions =\n | AnalyticsDataRegulationServiceCreateDataDeletionTaskAction\n | AnalyticsDataRegulationServiceCheckDataDeleteStatusAction;\n"]}
1
+ {"version":3,"file":"AnalyticsDataRegulationService-method-action-types.cjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService-method-action-types.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { AnalyticsDataRegulationService } from './AnalyticsDataRegulationService.js';\n\n/**\n * Creates a DELETE_ONLY regulation for the given analyticsId.\n *\n * @param analyticsId - The analytics ID of the user for whom to create the deletion task.\n * @returns Promise resolving to a successful deletion regulation response.\n * @throws Error if the request fails or the response is invalid.\n */\nexport type AnalyticsDataRegulationServiceCreateDataDeletionTaskAction = {\n type: `AnalyticsDataRegulationService:createDataDeletionTask`;\n handler: AnalyticsDataRegulationService['createDataDeletionTask'];\n};\n\n/**\n * Checks the status of a regulation by ID.\n *\n * @param regulationId - The regulation ID to check.\n * @returns Promise resolving to a successful regulation status response.\n * @throws Error if the request fails or the response is invalid.\n */\nexport type AnalyticsDataRegulationServiceCheckDataDeleteStatusAction = {\n type: `AnalyticsDataRegulationService:checkDataDeleteStatus`;\n handler: AnalyticsDataRegulationService['checkDataDeleteStatus'];\n};\n\n/**\n * Union of all AnalyticsDataRegulationService action types.\n */\nexport type AnalyticsDataRegulationServiceMethodActions =\n | AnalyticsDataRegulationServiceCreateDataDeletionTaskAction\n | AnalyticsDataRegulationServiceCheckDataDeleteStatusAction;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationService-method-action-types.d.cts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,8BAA8B,EAAE,6CAAyC;AAEvF;;;;;;GAMG;AACH,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,uDAAuD,CAAC;IAC9D,OAAO,EAAE,8BAA8B,CAAC,wBAAwB,CAAC,CAAC;CACnE,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,yDAAyD,GAAG;IACtE,IAAI,EAAE,sDAAsD,CAAC;IAC7D,OAAO,EAAE,8BAA8B,CAAC,uBAAuB,CAAC,CAAC;CAClE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,2CAA2C,GACnD,0DAA0D,GAC1D,yDAAyD,CAAC"}
1
+ {"version":3,"file":"AnalyticsDataRegulationService-method-action-types.d.cts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,8BAA8B,EAAE,6CAA4C;AAE1F;;;;;;GAMG;AACH,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,uDAAuD,CAAC;IAC9D,OAAO,EAAE,8BAA8B,CAAC,wBAAwB,CAAC,CAAC;CACnE,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,yDAAyD,GAAG;IACtE,IAAI,EAAE,sDAAsD,CAAC;IAC7D,OAAO,EAAE,8BAA8B,CAAC,uBAAuB,CAAC,CAAC;CAClE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,2CAA2C,GACnD,0DAA0D,GAC1D,yDAAyD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationService-method-action-types.d.mts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,8BAA8B,EAAE,6CAAyC;AAEvF;;;;;;GAMG;AACH,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,uDAAuD,CAAC;IAC9D,OAAO,EAAE,8BAA8B,CAAC,wBAAwB,CAAC,CAAC;CACnE,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,yDAAyD,GAAG;IACtE,IAAI,EAAE,sDAAsD,CAAC;IAC7D,OAAO,EAAE,8BAA8B,CAAC,uBAAuB,CAAC,CAAC;CAClE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,2CAA2C,GACnD,0DAA0D,GAC1D,yDAAyD,CAAC"}
1
+ {"version":3,"file":"AnalyticsDataRegulationService-method-action-types.d.mts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,8BAA8B,EAAE,6CAA4C;AAE1F;;;;;;GAMG;AACH,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,uDAAuD,CAAC;IAC9D,OAAO,EAAE,8BAA8B,CAAC,wBAAwB,CAAC,CAAC;CACnE,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,yDAAyD,GAAG;IACtE,IAAI,EAAE,sDAAsD,CAAC;IAC7D,OAAO,EAAE,8BAA8B,CAAC,uBAAuB,CAAC,CAAC;CAClE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,2CAA2C,GACnD,0DAA0D,GAC1D,yDAAyD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationService-method-action-types.mjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { AnalyticsDataRegulationService } from './AnalyticsDataRegulationService';\n\n/**\n * Creates a DELETE_ONLY regulation for the given analyticsId.\n *\n * @param analyticsId - The analytics ID of the user for whom to create the deletion task.\n * @returns Promise resolving to a successful deletion regulation response.\n * @throws Error if the request fails or the response is invalid.\n */\nexport type AnalyticsDataRegulationServiceCreateDataDeletionTaskAction = {\n type: `AnalyticsDataRegulationService:createDataDeletionTask`;\n handler: AnalyticsDataRegulationService['createDataDeletionTask'];\n};\n\n/**\n * Checks the status of a regulation by ID.\n *\n * @param regulationId - The regulation ID to check.\n * @returns Promise resolving to a successful regulation status response.\n * @throws Error if the request fails or the response is invalid.\n */\nexport type AnalyticsDataRegulationServiceCheckDataDeleteStatusAction = {\n type: `AnalyticsDataRegulationService:checkDataDeleteStatus`;\n handler: AnalyticsDataRegulationService['checkDataDeleteStatus'];\n};\n\n/**\n * Union of all AnalyticsDataRegulationService action types.\n */\nexport type AnalyticsDataRegulationServiceMethodActions =\n | AnalyticsDataRegulationServiceCreateDataDeletionTaskAction\n | AnalyticsDataRegulationServiceCheckDataDeleteStatusAction;\n"]}
1
+ {"version":3,"file":"AnalyticsDataRegulationService-method-action-types.mjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { AnalyticsDataRegulationService } from './AnalyticsDataRegulationService.js';\n\n/**\n * Creates a DELETE_ONLY regulation for the given analyticsId.\n *\n * @param analyticsId - The analytics ID of the user for whom to create the deletion task.\n * @returns Promise resolving to a successful deletion regulation response.\n * @throws Error if the request fails or the response is invalid.\n */\nexport type AnalyticsDataRegulationServiceCreateDataDeletionTaskAction = {\n type: `AnalyticsDataRegulationService:createDataDeletionTask`;\n handler: AnalyticsDataRegulationService['createDataDeletionTask'];\n};\n\n/**\n * Checks the status of a regulation by ID.\n *\n * @param regulationId - The regulation ID to check.\n * @returns Promise resolving to a successful regulation status response.\n * @throws Error if the request fails or the response is invalid.\n */\nexport type AnalyticsDataRegulationServiceCheckDataDeleteStatusAction = {\n type: `AnalyticsDataRegulationService:checkDataDeleteStatus`;\n handler: AnalyticsDataRegulationService['checkDataDeleteStatus'];\n};\n\n/**\n * Union of all AnalyticsDataRegulationService action types.\n */\nexport type AnalyticsDataRegulationServiceMethodActions =\n | AnalyticsDataRegulationServiceCreateDataDeletionTaskAction\n | AnalyticsDataRegulationServiceCheckDataDeleteStatusAction;\n"]}
@@ -14,7 +14,7 @@ var _AnalyticsDataRegulationService_messenger, _AnalyticsDataRegulationService_f
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.AnalyticsDataRegulationService = exports.serviceName = void 0;
16
16
  const controller_utils_1 = require("@metamask/controller-utils");
17
- const types_1 = require("./types.cjs");
17
+ const types_js_1 = require("./types.cjs");
18
18
  /**
19
19
  * Segment API regulation type for DELETE_ONLY operations.
20
20
  */
@@ -45,7 +45,7 @@ const MESSENGER_EXPOSED_METHODS = [
45
45
  * @returns True if the value is a valid DataDeleteStatus.
46
46
  */
47
47
  function isDataDeleteStatus(status) {
48
- const dataDeleteStatuses = Object.values(types_1.DATA_DELETE_STATUSES);
48
+ const dataDeleteStatuses = Object.values(types_js_1.DATA_DELETE_STATUSES);
49
49
  return dataDeleteStatuses.includes(status);
50
50
  }
51
51
  /**
@@ -203,7 +203,7 @@ class AnalyticsDataRegulationService {
203
203
  throw new Error('Malformed response from Segment API: missing or invalid regulateId');
204
204
  }
205
205
  return {
206
- status: types_1.DATA_DELETE_RESPONSE_STATUSES.Success,
206
+ status: types_js_1.DATA_DELETE_RESPONSE_STATUSES.Success,
207
207
  regulateId: jsonResponse.data.data.regulateId,
208
208
  };
209
209
  }
@@ -235,9 +235,9 @@ class AnalyticsDataRegulationService {
235
235
  const rawStatus = jsonResponse?.data?.data?.regulation?.overallStatus;
236
236
  const dataDeleteStatus = isDataDeleteStatus(rawStatus)
237
237
  ? rawStatus
238
- : types_1.DATA_DELETE_STATUSES.Unknown;
238
+ : types_js_1.DATA_DELETE_STATUSES.Unknown;
239
239
  return {
240
- status: types_1.DATA_DELETE_RESPONSE_STATUSES.Success,
240
+ status: types_js_1.DATA_DELETE_RESPONSE_STATUSES.Success,
241
241
  dataDeleteStatus,
242
242
  };
243
243
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationService.cjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAIA,iEAA4E;AAK5E,uCAA8E;AAG9E;;GAEG;AACH,MAAM,mCAAmC,GAAG,aAAa,CAAC;AAE1D;;GAEG;AACH,MAAM,4BAA4B,GAAG,SAAS,CAAC;AAE/C;;GAEG;AACH,MAAM,oBAAoB,GAAG,iCAAiC,CAAC;AAE/D,kBAAkB;AAElB;;;GAGG;AACU,QAAA,WAAW,GAAG,gCAAgC,CAAC;AAE5D,oBAAoB;AAEpB,MAAM,yBAAyB,GAAG;IAChC,wBAAwB;IACxB,uBAAuB;CACf,CAAC;AA6FX;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,MAAe;IACzC,MAAM,kBAAkB,GAAa,MAAM,CAAC,MAAM,CAAC,4BAAoB,CAAC,CAAC;IACzE,OAAO,kBAAkB,CAAC,QAAQ,CAAC,MAAgB,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAa,8BAA8B;IAkCzC;;;;OAIG;IACH,YAAY,OAA8C;QAjC1D;;WAEG;QACM,4DAAoD;QAE7D;;WAEG;QACM,wDAAqB;QAE9B;;WAEG;QACM,kEAAyB;QAElC;;;WAGG;QACM,6EAAoC;QAE7C;;;;WAIG;QACM,yDAAuB;QAQ9B,IAAI,CAAC,IAAI,GAAG,mBAAW,CAAC;QACxB,uBAAA,IAAI,6CAAc,OAAO,CAAC,SAAS,MAAA,CAAC;QACpC,uBAAA,IAAI,yCAAU,OAAO,CAAC,KAAK,MAAA,CAAC;QAC5B,uBAAA,IAAI,mDAAoB,OAAO,CAAC,eAAe,MAAA,CAAC;QAChD,uBAAA,IAAI,8DAA+B,OAAO,CAAC,0BAA0B,MAAA,CAAC;QACtE,uBAAA,IAAI,0CAAW,IAAA,sCAAmB,EAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,MAAA,CAAC;QAEhE,uBAAA,IAAI,iDAAW,CAAC,4BAA4B,CAC1C,IAAI,EACJ,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAiD;QACvD,OAAO,uBAAA,IAAI,8CAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,QAAiD;QACvD,OAAO,uBAAA,IAAI,8CAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;;;OAUG;IACH,UAAU,CACR,QAAoD;QAEpD,OAAO,uBAAA,IAAI,8CAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,sBAAsB,CAAC,WAAmB;QAI9C,IAAI,CAAC,uBAAA,IAAI,uDAAiB,IAAI,CAAC,uBAAA,IAAI,kEAA4B,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,uBAAA,IAAI,kEAA4B,wBAAwB,uBAAA,IAAI,uDAAiB,EAAE,CAAC;QAC/F,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,cAAc,EAAE,mCAAmC;YACnD,WAAW,EAAE,4BAA4B;YACzC,UAAU,EAAE,CAAC,WAAW,CAAC;SAC1B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,8CAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACrD,MAAM,aAAa,GAAG,MAAM,uBAAA,IAAI,6CAAO,MAAX,IAAI,EAAQ,GAAG,EAAE;gBAC3C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,oBAAoB;iBACrC;gBACD,IAAI;aACL,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,4BAAS,CACjB,aAAa,CAAC,MAAM,EACpB,mDAAmD,aAAa,CAAC,MAAM,GAAG,CAC3E,CAAC;YACJ,CAAC;YAED,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA6B,CAAC;QAEzE,IACE,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU;YACrC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ;YACrD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAC/C,CAAC;YACD,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,qCAA6B,CAAC,OAAO;YAC7C,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU;SAC9C,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,qBAAqB,CAAC,YAAoB;QAI9C,IAAI,CAAC,YAAY,IAAI,CAAC,uBAAA,IAAI,kEAA4B,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,uBAAA,IAAI,kEAA4B,gBAAgB,YAAY,EAAE,CAAC;QAE9E,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,8CAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACrD,MAAM,aAAa,GAAG,MAAM,uBAAA,IAAI,6CAAO,MAAX,IAAI,EAAQ,GAAG,EAAE;gBAC3C,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,cAAc,EAAE,oBAAoB;iBACrC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,4BAAS,CACjB,aAAa,CAAC,MAAM,EACpB,qDAAqD,aAAa,CAAC,MAAM,GAAG,CAC7E,CAAC;YACJ,CAAC;YAED,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgC,CAAC;QAE5E,MAAM,SAAS,GAAG,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC;QACtE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,SAAS,CAAC;YACpD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,4BAAoB,CAAC,OAAO,CAAC;QAEjC,OAAO;YACL,MAAM,EAAE,qCAA6B,CAAC,OAAO;YAC7C,gBAAgB;SACjB,CAAC;IACJ,CAAC;CACF;AAzMD,wEAyMC","sourcesContent":["import type {\n CreateServicePolicyOptions,\n ServicePolicy,\n} from '@metamask/controller-utils';\nimport { createServicePolicy, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { IDisposable } from 'cockatiel';\n\nimport type { AnalyticsDataRegulationServiceMethodActions } from './AnalyticsDataRegulationService-method-action-types';\nimport { DATA_DELETE_RESPONSE_STATUSES, DATA_DELETE_STATUSES } from './types';\nimport type { DataDeleteStatus } from './types';\n\n/**\n * Segment API regulation type for DELETE_ONLY operations.\n */\nconst SEGMENT_REGULATION_TYPE_DELETE_ONLY = 'DELETE_ONLY';\n\n/**\n * Segment API subject type for user ID operations.\n */\nconst SEGMENT_SUBJECT_TYPE_USER_ID = 'USER_ID';\n\n/**\n * Segment API Content-Type header value.\n */\nconst SEGMENT_CONTENT_TYPE = 'application/vnd.segment.v1+json';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link AnalyticsDataRegulationService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'AnalyticsDataRegulationService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'createDataDeletionTask',\n 'checkDataDeleteStatus',\n] as const;\n\n/**\n * Actions that {@link AnalyticsDataRegulationService} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationServiceActions =\n AnalyticsDataRegulationServiceMethodActions;\n\n/**\n * Actions from other messengers that {@link AnalyticsDataRegulationServiceMessenger} calls.\n */\ntype AllowedActions = never;\n\n/**\n * Events that {@link AnalyticsDataRegulationService} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationServiceEvents = never;\n\n/**\n * Events from other messengers that {@link AnalyticsDataRegulationService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link AnalyticsDataRegulationService}.\n */\nexport type AnalyticsDataRegulationServiceMessenger = Messenger<\n typeof serviceName,\n AnalyticsDataRegulationServiceActions | AllowedActions,\n AnalyticsDataRegulationServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\n/**\n * Response structure from Segment API for creating a regulation.\n */\ntype CreateRegulationResponse = {\n data: {\n data: {\n regulateId: string;\n };\n };\n};\n\n/**\n * Response structure from Segment API for getting regulation status.\n */\ntype GetRegulationStatusResponse = {\n data: {\n data: {\n regulation: {\n overallStatus: string;\n };\n };\n };\n};\n\n/**\n * Options for constructing {@link AnalyticsDataRegulationService}.\n */\nexport type AnalyticsDataRegulationServiceOptions = {\n /**\n * The messenger suited for this service.\n */\n messenger: AnalyticsDataRegulationServiceMessenger;\n\n /**\n * A function that can be used to make an HTTP request.\n */\n fetch: typeof fetch;\n\n /**\n * Segment API source ID (required for creating regulations).\n */\n segmentSourceId: string;\n\n /**\n * Base URL for the proxy endpoint that communicates with Segment's Regulations API.\n * This is a proxy endpoint (not Segment API directly) that forwards requests to Segment's\n * Regulations API and adds authentication tokens. The endpoint URL varies by environment\n * (e.g., development, staging, production) and should be configured accordingly.\n * Example: 'https://proxy.example.com/v1beta'\n */\n segmentRegulationsEndpoint: string;\n\n /**\n * Options to pass to `createServicePolicy`, which is used to wrap each request.\n */\n policyOptions?: CreateServicePolicyOptions;\n};\n\n/**\n * Type guard to check if a value is a valid DataDeleteStatus.\n *\n * @param status - The value to check.\n * @returns True if the value is a valid DataDeleteStatus.\n */\nfunction isDataDeleteStatus(status: unknown): status is DataDeleteStatus {\n const dataDeleteStatuses: string[] = Object.values(DATA_DELETE_STATUSES);\n return dataDeleteStatuses.includes(status as string);\n}\n\n/**\n * This service object is responsible for making requests to the Segment Regulations API\n * via a proxy endpoint for GDPR/CCPA data deletion functionality.\n *\n * @example\n *\n * ```ts\n * import { Messenger } from '@metamask/messenger';\n * import type {\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents,\n * } from '@metamask/analytics-data-regulation-controller';\n *\n * const rootMessenger = new Messenger<\n * 'Root',\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents\n * >({ namespace: 'Root' });\n * const serviceMessenger = new Messenger<\n * 'AnalyticsDataRegulationService',\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents,\n * typeof rootMessenger,\n * >({\n * namespace: 'AnalyticsDataRegulationService',\n * parent: rootMessenger,\n * });\n * // Instantiate the service to register its actions on the messenger\n * new AnalyticsDataRegulationService({\n * messenger: serviceMessenger,\n * fetch,\n * segmentSourceId: 'abc123',\n * segmentRegulationsEndpoint: 'https://proxy.example.com/v1beta',\n * });\n *\n * // Later...\n * // Create a data deletion task\n * const response = await rootMessenger.call(\n * 'AnalyticsDataRegulationService:createDataDeletionTask',\n * 'user-analytics-id',\n * );\n * ```\n */\nexport class AnalyticsDataRegulationService {\n /**\n * The name of the service.\n */\n readonly name: typeof serviceName;\n\n /**\n * The messenger suited for this service.\n */\n readonly #messenger: AnalyticsDataRegulationServiceMessenger;\n\n /**\n * A function that can be used to make an HTTP request.\n */\n readonly #fetch: typeof fetch;\n\n /**\n * Segment API source ID.\n */\n readonly #segmentSourceId: string;\n\n /**\n * Base URL for the proxy endpoint that communicates with Segment's Regulations API.\n * This endpoint varies by environment and forwards requests to Segment API with authentication.\n */\n readonly #segmentRegulationsEndpoint: string;\n\n /**\n * The policy that wraps the request.\n *\n * @see {@link createServicePolicy}\n */\n readonly #policy: ServicePolicy;\n\n /**\n * Constructs a new AnalyticsDataRegulationService object.\n *\n * @param options - The constructor options.\n */\n constructor(options: AnalyticsDataRegulationServiceOptions) {\n this.name = serviceName;\n this.#messenger = options.messenger;\n this.#fetch = options.fetch;\n this.#segmentSourceId = options.segmentSourceId;\n this.#segmentRegulationsEndpoint = options.segmentRegulationsEndpoint;\n this.#policy = createServicePolicy(options.policyOptions ?? {});\n\n this.#messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Registers a handler that will be called after a request returns a non-500\n * response, causing a retry. Primarily useful in tests where timers are being\n * mocked.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n * @see {@link createServicePolicy}\n */\n onRetry(listener: Parameters<ServicePolicy['onRetry']>[0]): IDisposable {\n return this.#policy.onRetry(listener);\n }\n\n /**\n * Registers a handler that will be called after a set number of retry rounds\n * prove that requests to the API endpoint consistently return a 5xx response.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n * @see {@link createServicePolicy}\n */\n onBreak(listener: Parameters<ServicePolicy['onBreak']>[0]): IDisposable {\n return this.#policy.onBreak(listener);\n }\n\n /**\n * Registers a handler that will be called under one of two circumstances:\n *\n * 1. After a set number of retries prove that requests to the API\n * consistently result in failures.\n * 2. After a successful request is made to the API, but the response takes\n * longer than a set duration to return.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n */\n onDegraded(\n listener: Parameters<ServicePolicy['onDegraded']>[0],\n ): IDisposable {\n return this.#policy.onDegraded(listener);\n }\n\n /**\n * Creates a DELETE_ONLY regulation for the given analyticsId.\n *\n * @param analyticsId - The analytics ID of the user for whom to create the deletion task.\n * @returns Promise resolving to a successful deletion regulation response.\n * @throws Error if the request fails or the response is invalid.\n */\n async createDataDeletionTask(analyticsId: string): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n regulateId: string;\n }> {\n if (!this.#segmentSourceId || !this.#segmentRegulationsEndpoint) {\n throw new Error('Segment API source ID or endpoint not found');\n }\n\n const url = `${this.#segmentRegulationsEndpoint}/regulations/sources/${this.#segmentSourceId}`;\n const body = JSON.stringify({\n regulationType: SEGMENT_REGULATION_TYPE_DELETE_ONLY,\n subjectType: SEGMENT_SUBJECT_TYPE_USER_ID,\n subjectIds: [analyticsId],\n });\n\n const response = await this.#policy.execute(async () => {\n const localResponse = await this.#fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': SEGMENT_CONTENT_TYPE,\n },\n body,\n });\n\n if (!localResponse.ok) {\n throw new HttpError(\n localResponse.status,\n `Creating data deletion task failed with status '${localResponse.status}'`,\n );\n }\n\n return localResponse;\n });\n\n const jsonResponse = (await response.json()) as CreateRegulationResponse;\n\n if (\n !jsonResponse?.data?.data?.regulateId ||\n typeof jsonResponse.data.data.regulateId !== 'string' ||\n jsonResponse.data.data.regulateId.trim() === ''\n ) {\n throw new Error(\n 'Malformed response from Segment API: missing or invalid regulateId',\n );\n }\n\n return {\n status: DATA_DELETE_RESPONSE_STATUSES.Success,\n regulateId: jsonResponse.data.data.regulateId,\n };\n }\n\n /**\n * Checks the status of a regulation by ID.\n *\n * @param regulationId - The regulation ID to check.\n * @returns Promise resolving to a successful regulation status response.\n * @throws Error if the request fails or the response is invalid.\n */\n async checkDataDeleteStatus(regulationId: string): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n dataDeleteStatus: DataDeleteStatus;\n }> {\n if (!regulationId || !this.#segmentRegulationsEndpoint) {\n throw new Error('Regulation ID or endpoint not configured');\n }\n\n const url = `${this.#segmentRegulationsEndpoint}/regulations/${regulationId}`;\n\n const response = await this.#policy.execute(async () => {\n const localResponse = await this.#fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': SEGMENT_CONTENT_TYPE,\n },\n });\n\n if (!localResponse.ok) {\n throw new HttpError(\n localResponse.status,\n `Checking data deletion status failed with status '${localResponse.status}'`,\n );\n }\n\n return localResponse;\n });\n\n const jsonResponse = (await response.json()) as GetRegulationStatusResponse;\n\n const rawStatus = jsonResponse?.data?.data?.regulation?.overallStatus;\n const dataDeleteStatus = isDataDeleteStatus(rawStatus)\n ? rawStatus\n : DATA_DELETE_STATUSES.Unknown;\n\n return {\n status: DATA_DELETE_RESPONSE_STATUSES.Success,\n dataDeleteStatus,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"AnalyticsDataRegulationService.cjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CreateServicePolicyOptions,\n ServicePolicy,\n} from '@metamask/controller-utils';\nimport { createServicePolicy, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { IDisposable } from 'cockatiel';\n\nimport type { AnalyticsDataRegulationServiceMethodActions } from './AnalyticsDataRegulationService-method-action-types.js';\nimport {\n DATA_DELETE_RESPONSE_STATUSES,\n DATA_DELETE_STATUSES,\n} from './types.js';\nimport type { DataDeleteStatus } from './types.js';\n\n/**\n * Segment API regulation type for DELETE_ONLY operations.\n */\nconst SEGMENT_REGULATION_TYPE_DELETE_ONLY = 'DELETE_ONLY';\n\n/**\n * Segment API subject type for user ID operations.\n */\nconst SEGMENT_SUBJECT_TYPE_USER_ID = 'USER_ID';\n\n/**\n * Segment API Content-Type header value.\n */\nconst SEGMENT_CONTENT_TYPE = 'application/vnd.segment.v1+json';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link AnalyticsDataRegulationService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'AnalyticsDataRegulationService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'createDataDeletionTask',\n 'checkDataDeleteStatus',\n] as const;\n\n/**\n * Actions that {@link AnalyticsDataRegulationService} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationServiceActions =\n AnalyticsDataRegulationServiceMethodActions;\n\n/**\n * Actions from other messengers that {@link AnalyticsDataRegulationServiceMessenger} calls.\n */\ntype AllowedActions = never;\n\n/**\n * Events that {@link AnalyticsDataRegulationService} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationServiceEvents = never;\n\n/**\n * Events from other messengers that {@link AnalyticsDataRegulationService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link AnalyticsDataRegulationService}.\n */\nexport type AnalyticsDataRegulationServiceMessenger = Messenger<\n typeof serviceName,\n AnalyticsDataRegulationServiceActions | AllowedActions,\n AnalyticsDataRegulationServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\n/**\n * Response structure from Segment API for creating a regulation.\n */\ntype CreateRegulationResponse = {\n data: {\n data: {\n regulateId: string;\n };\n };\n};\n\n/**\n * Response structure from Segment API for getting regulation status.\n */\ntype GetRegulationStatusResponse = {\n data: {\n data: {\n regulation: {\n overallStatus: string;\n };\n };\n };\n};\n\n/**\n * Options for constructing {@link AnalyticsDataRegulationService}.\n */\nexport type AnalyticsDataRegulationServiceOptions = {\n /**\n * The messenger suited for this service.\n */\n messenger: AnalyticsDataRegulationServiceMessenger;\n\n /**\n * A function that can be used to make an HTTP request.\n */\n fetch: typeof fetch;\n\n /**\n * Segment API source ID (required for creating regulations).\n */\n segmentSourceId: string;\n\n /**\n * Base URL for the proxy endpoint that communicates with Segment's Regulations API.\n * This is a proxy endpoint (not Segment API directly) that forwards requests to Segment's\n * Regulations API and adds authentication tokens. The endpoint URL varies by environment\n * (e.g., development, staging, production) and should be configured accordingly.\n * Example: 'https://proxy.example.com/v1beta'\n */\n segmentRegulationsEndpoint: string;\n\n /**\n * Options to pass to `createServicePolicy`, which is used to wrap each request.\n */\n policyOptions?: CreateServicePolicyOptions;\n};\n\n/**\n * Type guard to check if a value is a valid DataDeleteStatus.\n *\n * @param status - The value to check.\n * @returns True if the value is a valid DataDeleteStatus.\n */\nfunction isDataDeleteStatus(status: unknown): status is DataDeleteStatus {\n const dataDeleteStatuses: string[] = Object.values(DATA_DELETE_STATUSES);\n return dataDeleteStatuses.includes(status as string);\n}\n\n/**\n * This service object is responsible for making requests to the Segment Regulations API\n * via a proxy endpoint for GDPR/CCPA data deletion functionality.\n *\n * @example\n *\n * ```ts\n * import { Messenger } from '@metamask/messenger';\n * import type {\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents,\n * } from '@metamask/analytics-data-regulation-controller';\n *\n * const rootMessenger = new Messenger<\n * 'Root',\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents\n * >({ namespace: 'Root' });\n * const serviceMessenger = new Messenger<\n * 'AnalyticsDataRegulationService',\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents,\n * typeof rootMessenger,\n * >({\n * namespace: 'AnalyticsDataRegulationService',\n * parent: rootMessenger,\n * });\n * // Instantiate the service to register its actions on the messenger\n * new AnalyticsDataRegulationService({\n * messenger: serviceMessenger,\n * fetch,\n * segmentSourceId: 'abc123',\n * segmentRegulationsEndpoint: 'https://proxy.example.com/v1beta',\n * });\n *\n * // Later...\n * // Create a data deletion task\n * const response = await rootMessenger.call(\n * 'AnalyticsDataRegulationService:createDataDeletionTask',\n * 'user-analytics-id',\n * );\n * ```\n */\nexport class AnalyticsDataRegulationService {\n /**\n * The name of the service.\n */\n readonly name: typeof serviceName;\n\n /**\n * The messenger suited for this service.\n */\n readonly #messenger: AnalyticsDataRegulationServiceMessenger;\n\n /**\n * A function that can be used to make an HTTP request.\n */\n readonly #fetch: typeof fetch;\n\n /**\n * Segment API source ID.\n */\n readonly #segmentSourceId: string;\n\n /**\n * Base URL for the proxy endpoint that communicates with Segment's Regulations API.\n * This endpoint varies by environment and forwards requests to Segment API with authentication.\n */\n readonly #segmentRegulationsEndpoint: string;\n\n /**\n * The policy that wraps the request.\n *\n * @see {@link createServicePolicy}\n */\n readonly #policy: ServicePolicy;\n\n /**\n * Constructs a new AnalyticsDataRegulationService object.\n *\n * @param options - The constructor options.\n */\n constructor(options: AnalyticsDataRegulationServiceOptions) {\n this.name = serviceName;\n this.#messenger = options.messenger;\n this.#fetch = options.fetch;\n this.#segmentSourceId = options.segmentSourceId;\n this.#segmentRegulationsEndpoint = options.segmentRegulationsEndpoint;\n this.#policy = createServicePolicy(options.policyOptions ?? {});\n\n this.#messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Registers a handler that will be called after a request returns a non-500\n * response, causing a retry. Primarily useful in tests where timers are being\n * mocked.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n * @see {@link createServicePolicy}\n */\n onRetry(listener: Parameters<ServicePolicy['onRetry']>[0]): IDisposable {\n return this.#policy.onRetry(listener);\n }\n\n /**\n * Registers a handler that will be called after a set number of retry rounds\n * prove that requests to the API endpoint consistently return a 5xx response.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n * @see {@link createServicePolicy}\n */\n onBreak(listener: Parameters<ServicePolicy['onBreak']>[0]): IDisposable {\n return this.#policy.onBreak(listener);\n }\n\n /**\n * Registers a handler that will be called under one of two circumstances:\n *\n * 1. After a set number of retries prove that requests to the API\n * consistently result in failures.\n * 2. After a successful request is made to the API, but the response takes\n * longer than a set duration to return.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n */\n onDegraded(\n listener: Parameters<ServicePolicy['onDegraded']>[0],\n ): IDisposable {\n return this.#policy.onDegraded(listener);\n }\n\n /**\n * Creates a DELETE_ONLY regulation for the given analyticsId.\n *\n * @param analyticsId - The analytics ID of the user for whom to create the deletion task.\n * @returns Promise resolving to a successful deletion regulation response.\n * @throws Error if the request fails or the response is invalid.\n */\n async createDataDeletionTask(analyticsId: string): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n regulateId: string;\n }> {\n if (!this.#segmentSourceId || !this.#segmentRegulationsEndpoint) {\n throw new Error('Segment API source ID or endpoint not found');\n }\n\n const url = `${this.#segmentRegulationsEndpoint}/regulations/sources/${this.#segmentSourceId}`;\n const body = JSON.stringify({\n regulationType: SEGMENT_REGULATION_TYPE_DELETE_ONLY,\n subjectType: SEGMENT_SUBJECT_TYPE_USER_ID,\n subjectIds: [analyticsId],\n });\n\n const response = await this.#policy.execute(async () => {\n const localResponse = await this.#fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': SEGMENT_CONTENT_TYPE,\n },\n body,\n });\n\n if (!localResponse.ok) {\n throw new HttpError(\n localResponse.status,\n `Creating data deletion task failed with status '${localResponse.status}'`,\n );\n }\n\n return localResponse;\n });\n\n const jsonResponse = (await response.json()) as CreateRegulationResponse;\n\n if (\n !jsonResponse?.data?.data?.regulateId ||\n typeof jsonResponse.data.data.regulateId !== 'string' ||\n jsonResponse.data.data.regulateId.trim() === ''\n ) {\n throw new Error(\n 'Malformed response from Segment API: missing or invalid regulateId',\n );\n }\n\n return {\n status: DATA_DELETE_RESPONSE_STATUSES.Success,\n regulateId: jsonResponse.data.data.regulateId,\n };\n }\n\n /**\n * Checks the status of a regulation by ID.\n *\n * @param regulationId - The regulation ID to check.\n * @returns Promise resolving to a successful regulation status response.\n * @throws Error if the request fails or the response is invalid.\n */\n async checkDataDeleteStatus(regulationId: string): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n dataDeleteStatus: DataDeleteStatus;\n }> {\n if (!regulationId || !this.#segmentRegulationsEndpoint) {\n throw new Error('Regulation ID or endpoint not configured');\n }\n\n const url = `${this.#segmentRegulationsEndpoint}/regulations/${regulationId}`;\n\n const response = await this.#policy.execute(async () => {\n const localResponse = await this.#fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': SEGMENT_CONTENT_TYPE,\n },\n });\n\n if (!localResponse.ok) {\n throw new HttpError(\n localResponse.status,\n `Checking data deletion status failed with status '${localResponse.status}'`,\n );\n }\n\n return localResponse;\n });\n\n const jsonResponse = (await response.json()) as GetRegulationStatusResponse;\n\n const rawStatus = jsonResponse?.data?.data?.regulation?.overallStatus;\n const dataDeleteStatus = isDataDeleteStatus(rawStatus)\n ? rawStatus\n : DATA_DELETE_STATUSES.Unknown;\n\n return {\n status: DATA_DELETE_RESPONSE_STATUSES.Success,\n dataDeleteStatus,\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationService.d.cts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACd,mCAAmC;AAEpC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB;AAE7C,OAAO,KAAK,EAAE,2CAA2C,EAAE,iEAA6D;AACxH,OAAO,EAAE,6BAA6B,EAAwB,oBAAgB;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAgB;AAmBhD;;;GAGG;AACH,eAAO,MAAM,WAAW,mCAAmC,CAAC;AAS5D;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAC/C,2CAA2C,CAAC;AAE9C;;GAEG;AACH,KAAK,cAAc,GAAG,KAAK,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAAG,KAAK,CAAC;AAEzD;;GAEG;AACH,KAAK,aAAa,GAAG,KAAK,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,uCAAuC,GAAG,SAAS,CAC7D,OAAO,WAAW,EAClB,qCAAqC,GAAG,cAAc,EACtD,oCAAoC,GAAG,aAAa,CACrD,CAAC;AA4BF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD;;OAEG;IACH,SAAS,EAAE,uCAAuC,CAAC;IAEnD;;OAEG;IACH,KAAK,EAAE,OAAO,KAAK,CAAC;IAEpB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,0BAA0B,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,aAAa,CAAC,EAAE,0BAA0B,CAAC;CAC5C,CAAC;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBAAa,8BAA8B;;IACzC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,CAAC;IA8BlC;;;;OAIG;gBACS,OAAO,EAAE,qCAAqC;IAc1D;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW;IAIvE;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW;IAIvE;;;;;;;;;;OAUG;IACH,UAAU,CACR,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GACnD,WAAW;IAId;;;;;;OAMG;IACG,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAiDF;;;;;;OAMG;IACG,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,gBAAgB,EAAE,gBAAgB,CAAC;KACpC,CAAC;CAqCH"}
1
+ {"version":3,"file":"AnalyticsDataRegulationService.d.cts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACd,mCAAmC;AAEpC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB;AAE7C,OAAO,KAAK,EAAE,2CAA2C,EAAE,iEAAgE;AAC3H,OAAO,EACL,6BAA6B,EAE9B,oBAAmB;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAmB;AAmBnD;;;GAGG;AACH,eAAO,MAAM,WAAW,mCAAmC,CAAC;AAS5D;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAC/C,2CAA2C,CAAC;AAE9C;;GAEG;AACH,KAAK,cAAc,GAAG,KAAK,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAAG,KAAK,CAAC;AAEzD;;GAEG;AACH,KAAK,aAAa,GAAG,KAAK,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,uCAAuC,GAAG,SAAS,CAC7D,OAAO,WAAW,EAClB,qCAAqC,GAAG,cAAc,EACtD,oCAAoC,GAAG,aAAa,CACrD,CAAC;AA4BF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD;;OAEG;IACH,SAAS,EAAE,uCAAuC,CAAC;IAEnD;;OAEG;IACH,KAAK,EAAE,OAAO,KAAK,CAAC;IAEpB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,0BAA0B,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,aAAa,CAAC,EAAE,0BAA0B,CAAC;CAC5C,CAAC;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBAAa,8BAA8B;;IACzC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,CAAC;IA8BlC;;;;OAIG;gBACS,OAAO,EAAE,qCAAqC;IAc1D;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW;IAIvE;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW;IAIvE;;;;;;;;;;OAUG;IACH,UAAU,CACR,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GACnD,WAAW;IAId;;;;;;OAMG;IACG,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAiDF;;;;;;OAMG;IACG,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,gBAAgB,EAAE,gBAAgB,CAAC;KACpC,CAAC;CAqCH"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationService.d.mts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACd,mCAAmC;AAEpC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB;AAE7C,OAAO,KAAK,EAAE,2CAA2C,EAAE,iEAA6D;AACxH,OAAO,EAAE,6BAA6B,EAAwB,oBAAgB;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAgB;AAmBhD;;;GAGG;AACH,eAAO,MAAM,WAAW,mCAAmC,CAAC;AAS5D;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAC/C,2CAA2C,CAAC;AAE9C;;GAEG;AACH,KAAK,cAAc,GAAG,KAAK,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAAG,KAAK,CAAC;AAEzD;;GAEG;AACH,KAAK,aAAa,GAAG,KAAK,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,uCAAuC,GAAG,SAAS,CAC7D,OAAO,WAAW,EAClB,qCAAqC,GAAG,cAAc,EACtD,oCAAoC,GAAG,aAAa,CACrD,CAAC;AA4BF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD;;OAEG;IACH,SAAS,EAAE,uCAAuC,CAAC;IAEnD;;OAEG;IACH,KAAK,EAAE,OAAO,KAAK,CAAC;IAEpB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,0BAA0B,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,aAAa,CAAC,EAAE,0BAA0B,CAAC;CAC5C,CAAC;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBAAa,8BAA8B;;IACzC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,CAAC;IA8BlC;;;;OAIG;gBACS,OAAO,EAAE,qCAAqC;IAc1D;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW;IAIvE;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW;IAIvE;;;;;;;;;;OAUG;IACH,UAAU,CACR,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GACnD,WAAW;IAId;;;;;;OAMG;IACG,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAiDF;;;;;;OAMG;IACG,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,gBAAgB,EAAE,gBAAgB,CAAC;KACpC,CAAC;CAqCH"}
1
+ {"version":3,"file":"AnalyticsDataRegulationService.d.mts","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACd,mCAAmC;AAEpC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB;AAE7C,OAAO,KAAK,EAAE,2CAA2C,EAAE,iEAAgE;AAC3H,OAAO,EACL,6BAA6B,EAE9B,oBAAmB;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAmB;AAmBnD;;;GAGG;AACH,eAAO,MAAM,WAAW,mCAAmC,CAAC;AAS5D;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAC/C,2CAA2C,CAAC;AAE9C;;GAEG;AACH,KAAK,cAAc,GAAG,KAAK,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAAG,KAAK,CAAC;AAEzD;;GAEG;AACH,KAAK,aAAa,GAAG,KAAK,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,uCAAuC,GAAG,SAAS,CAC7D,OAAO,WAAW,EAClB,qCAAqC,GAAG,cAAc,EACtD,oCAAoC,GAAG,aAAa,CACrD,CAAC;AA4BF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD;;OAEG;IACH,SAAS,EAAE,uCAAuC,CAAC;IAEnD;;OAEG;IACH,KAAK,EAAE,OAAO,KAAK,CAAC;IAEpB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,0BAA0B,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,aAAa,CAAC,EAAE,0BAA0B,CAAC;CAC5C,CAAC;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBAAa,8BAA8B;;IACzC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,CAAC;IA8BlC;;;;OAIG;gBACS,OAAO,EAAE,qCAAqC;IAc1D;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW;IAIvE;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW;IAIvE;;;;;;;;;;OAUG;IACH,UAAU,CACR,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GACnD,WAAW;IAId;;;;;;OAMG;IACG,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAiDF;;;;;;OAMG;IACG,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;QACrD,gBAAgB,EAAE,gBAAgB,CAAC;KACpC,CAAC;CAqCH"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDataRegulationService.mjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService.ts"],"names":[],"mappings":";;;;;;;;;;;;AAIA,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,mCAAmC;AAK5E,OAAO,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,oBAAgB;AAG9E;;GAEG;AACH,MAAM,mCAAmC,GAAG,aAAa,CAAC;AAE1D;;GAEG;AACH,MAAM,4BAA4B,GAAG,SAAS,CAAC;AAE/C;;GAEG;AACH,MAAM,oBAAoB,GAAG,iCAAiC,CAAC;AAE/D,kBAAkB;AAElB;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,gCAAgC,CAAC;AAE5D,oBAAoB;AAEpB,MAAM,yBAAyB,GAAG;IAChC,wBAAwB;IACxB,uBAAuB;CACf,CAAC;AA6FX;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,MAAe;IACzC,MAAM,kBAAkB,GAAa,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACzE,OAAO,kBAAkB,CAAC,QAAQ,CAAC,MAAgB,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,OAAO,8BAA8B;IAkCzC;;;;OAIG;IACH,YAAY,OAA8C;QAjC1D;;WAEG;QACM,4DAAoD;QAE7D;;WAEG;QACM,wDAAqB;QAE9B;;WAEG;QACM,kEAAyB;QAElC;;;WAGG;QACM,6EAAoC;QAE7C;;;;WAIG;QACM,yDAAuB;QAQ9B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,uBAAA,IAAI,6CAAc,OAAO,CAAC,SAAS,MAAA,CAAC;QACpC,uBAAA,IAAI,yCAAU,OAAO,CAAC,KAAK,MAAA,CAAC;QAC5B,uBAAA,IAAI,mDAAoB,OAAO,CAAC,eAAe,MAAA,CAAC;QAChD,uBAAA,IAAI,8DAA+B,OAAO,CAAC,0BAA0B,MAAA,CAAC;QACtE,uBAAA,IAAI,0CAAW,mBAAmB,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,MAAA,CAAC;QAEhE,uBAAA,IAAI,iDAAW,CAAC,4BAA4B,CAC1C,IAAI,EACJ,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAiD;QACvD,OAAO,uBAAA,IAAI,8CAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,QAAiD;QACvD,OAAO,uBAAA,IAAI,8CAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;;;OAUG;IACH,UAAU,CACR,QAAoD;QAEpD,OAAO,uBAAA,IAAI,8CAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,sBAAsB,CAAC,WAAmB;QAI9C,IAAI,CAAC,uBAAA,IAAI,uDAAiB,IAAI,CAAC,uBAAA,IAAI,kEAA4B,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,uBAAA,IAAI,kEAA4B,wBAAwB,uBAAA,IAAI,uDAAiB,EAAE,CAAC;QAC/F,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,cAAc,EAAE,mCAAmC;YACnD,WAAW,EAAE,4BAA4B;YACzC,UAAU,EAAE,CAAC,WAAW,CAAC;SAC1B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,8CAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACrD,MAAM,aAAa,GAAG,MAAM,uBAAA,IAAI,6CAAO,MAAX,IAAI,EAAQ,GAAG,EAAE;gBAC3C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,oBAAoB;iBACrC;gBACD,IAAI;aACL,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,SAAS,CACjB,aAAa,CAAC,MAAM,EACpB,mDAAmD,aAAa,CAAC,MAAM,GAAG,CAC3E,CAAC;YACJ,CAAC;YAED,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA6B,CAAC;QAEzE,IACE,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU;YACrC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ;YACrD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAC/C,CAAC;YACD,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,6BAA6B,CAAC,OAAO;YAC7C,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU;SAC9C,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,qBAAqB,CAAC,YAAoB;QAI9C,IAAI,CAAC,YAAY,IAAI,CAAC,uBAAA,IAAI,kEAA4B,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,uBAAA,IAAI,kEAA4B,gBAAgB,YAAY,EAAE,CAAC;QAE9E,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,8CAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACrD,MAAM,aAAa,GAAG,MAAM,uBAAA,IAAI,6CAAO,MAAX,IAAI,EAAQ,GAAG,EAAE;gBAC3C,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,cAAc,EAAE,oBAAoB;iBACrC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,SAAS,CACjB,aAAa,CAAC,MAAM,EACpB,qDAAqD,aAAa,CAAC,MAAM,GAAG,CAC7E,CAAC;YACJ,CAAC;YAED,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgC,CAAC;QAE5E,MAAM,SAAS,GAAG,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC;QACtE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,SAAS,CAAC;YACpD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC;QAEjC,OAAO;YACL,MAAM,EAAE,6BAA6B,CAAC,OAAO;YAC7C,gBAAgB;SACjB,CAAC;IACJ,CAAC;CACF","sourcesContent":["import type {\n CreateServicePolicyOptions,\n ServicePolicy,\n} from '@metamask/controller-utils';\nimport { createServicePolicy, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { IDisposable } from 'cockatiel';\n\nimport type { AnalyticsDataRegulationServiceMethodActions } from './AnalyticsDataRegulationService-method-action-types';\nimport { DATA_DELETE_RESPONSE_STATUSES, DATA_DELETE_STATUSES } from './types';\nimport type { DataDeleteStatus } from './types';\n\n/**\n * Segment API regulation type for DELETE_ONLY operations.\n */\nconst SEGMENT_REGULATION_TYPE_DELETE_ONLY = 'DELETE_ONLY';\n\n/**\n * Segment API subject type for user ID operations.\n */\nconst SEGMENT_SUBJECT_TYPE_USER_ID = 'USER_ID';\n\n/**\n * Segment API Content-Type header value.\n */\nconst SEGMENT_CONTENT_TYPE = 'application/vnd.segment.v1+json';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link AnalyticsDataRegulationService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'AnalyticsDataRegulationService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'createDataDeletionTask',\n 'checkDataDeleteStatus',\n] as const;\n\n/**\n * Actions that {@link AnalyticsDataRegulationService} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationServiceActions =\n AnalyticsDataRegulationServiceMethodActions;\n\n/**\n * Actions from other messengers that {@link AnalyticsDataRegulationServiceMessenger} calls.\n */\ntype AllowedActions = never;\n\n/**\n * Events that {@link AnalyticsDataRegulationService} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationServiceEvents = never;\n\n/**\n * Events from other messengers that {@link AnalyticsDataRegulationService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link AnalyticsDataRegulationService}.\n */\nexport type AnalyticsDataRegulationServiceMessenger = Messenger<\n typeof serviceName,\n AnalyticsDataRegulationServiceActions | AllowedActions,\n AnalyticsDataRegulationServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\n/**\n * Response structure from Segment API for creating a regulation.\n */\ntype CreateRegulationResponse = {\n data: {\n data: {\n regulateId: string;\n };\n };\n};\n\n/**\n * Response structure from Segment API for getting regulation status.\n */\ntype GetRegulationStatusResponse = {\n data: {\n data: {\n regulation: {\n overallStatus: string;\n };\n };\n };\n};\n\n/**\n * Options for constructing {@link AnalyticsDataRegulationService}.\n */\nexport type AnalyticsDataRegulationServiceOptions = {\n /**\n * The messenger suited for this service.\n */\n messenger: AnalyticsDataRegulationServiceMessenger;\n\n /**\n * A function that can be used to make an HTTP request.\n */\n fetch: typeof fetch;\n\n /**\n * Segment API source ID (required for creating regulations).\n */\n segmentSourceId: string;\n\n /**\n * Base URL for the proxy endpoint that communicates with Segment's Regulations API.\n * This is a proxy endpoint (not Segment API directly) that forwards requests to Segment's\n * Regulations API and adds authentication tokens. The endpoint URL varies by environment\n * (e.g., development, staging, production) and should be configured accordingly.\n * Example: 'https://proxy.example.com/v1beta'\n */\n segmentRegulationsEndpoint: string;\n\n /**\n * Options to pass to `createServicePolicy`, which is used to wrap each request.\n */\n policyOptions?: CreateServicePolicyOptions;\n};\n\n/**\n * Type guard to check if a value is a valid DataDeleteStatus.\n *\n * @param status - The value to check.\n * @returns True if the value is a valid DataDeleteStatus.\n */\nfunction isDataDeleteStatus(status: unknown): status is DataDeleteStatus {\n const dataDeleteStatuses: string[] = Object.values(DATA_DELETE_STATUSES);\n return dataDeleteStatuses.includes(status as string);\n}\n\n/**\n * This service object is responsible for making requests to the Segment Regulations API\n * via a proxy endpoint for GDPR/CCPA data deletion functionality.\n *\n * @example\n *\n * ```ts\n * import { Messenger } from '@metamask/messenger';\n * import type {\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents,\n * } from '@metamask/analytics-data-regulation-controller';\n *\n * const rootMessenger = new Messenger<\n * 'Root',\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents\n * >({ namespace: 'Root' });\n * const serviceMessenger = new Messenger<\n * 'AnalyticsDataRegulationService',\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents,\n * typeof rootMessenger,\n * >({\n * namespace: 'AnalyticsDataRegulationService',\n * parent: rootMessenger,\n * });\n * // Instantiate the service to register its actions on the messenger\n * new AnalyticsDataRegulationService({\n * messenger: serviceMessenger,\n * fetch,\n * segmentSourceId: 'abc123',\n * segmentRegulationsEndpoint: 'https://proxy.example.com/v1beta',\n * });\n *\n * // Later...\n * // Create a data deletion task\n * const response = await rootMessenger.call(\n * 'AnalyticsDataRegulationService:createDataDeletionTask',\n * 'user-analytics-id',\n * );\n * ```\n */\nexport class AnalyticsDataRegulationService {\n /**\n * The name of the service.\n */\n readonly name: typeof serviceName;\n\n /**\n * The messenger suited for this service.\n */\n readonly #messenger: AnalyticsDataRegulationServiceMessenger;\n\n /**\n * A function that can be used to make an HTTP request.\n */\n readonly #fetch: typeof fetch;\n\n /**\n * Segment API source ID.\n */\n readonly #segmentSourceId: string;\n\n /**\n * Base URL for the proxy endpoint that communicates with Segment's Regulations API.\n * This endpoint varies by environment and forwards requests to Segment API with authentication.\n */\n readonly #segmentRegulationsEndpoint: string;\n\n /**\n * The policy that wraps the request.\n *\n * @see {@link createServicePolicy}\n */\n readonly #policy: ServicePolicy;\n\n /**\n * Constructs a new AnalyticsDataRegulationService object.\n *\n * @param options - The constructor options.\n */\n constructor(options: AnalyticsDataRegulationServiceOptions) {\n this.name = serviceName;\n this.#messenger = options.messenger;\n this.#fetch = options.fetch;\n this.#segmentSourceId = options.segmentSourceId;\n this.#segmentRegulationsEndpoint = options.segmentRegulationsEndpoint;\n this.#policy = createServicePolicy(options.policyOptions ?? {});\n\n this.#messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Registers a handler that will be called after a request returns a non-500\n * response, causing a retry. Primarily useful in tests where timers are being\n * mocked.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n * @see {@link createServicePolicy}\n */\n onRetry(listener: Parameters<ServicePolicy['onRetry']>[0]): IDisposable {\n return this.#policy.onRetry(listener);\n }\n\n /**\n * Registers a handler that will be called after a set number of retry rounds\n * prove that requests to the API endpoint consistently return a 5xx response.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n * @see {@link createServicePolicy}\n */\n onBreak(listener: Parameters<ServicePolicy['onBreak']>[0]): IDisposable {\n return this.#policy.onBreak(listener);\n }\n\n /**\n * Registers a handler that will be called under one of two circumstances:\n *\n * 1. After a set number of retries prove that requests to the API\n * consistently result in failures.\n * 2. After a successful request is made to the API, but the response takes\n * longer than a set duration to return.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n */\n onDegraded(\n listener: Parameters<ServicePolicy['onDegraded']>[0],\n ): IDisposable {\n return this.#policy.onDegraded(listener);\n }\n\n /**\n * Creates a DELETE_ONLY regulation for the given analyticsId.\n *\n * @param analyticsId - The analytics ID of the user for whom to create the deletion task.\n * @returns Promise resolving to a successful deletion regulation response.\n * @throws Error if the request fails or the response is invalid.\n */\n async createDataDeletionTask(analyticsId: string): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n regulateId: string;\n }> {\n if (!this.#segmentSourceId || !this.#segmentRegulationsEndpoint) {\n throw new Error('Segment API source ID or endpoint not found');\n }\n\n const url = `${this.#segmentRegulationsEndpoint}/regulations/sources/${this.#segmentSourceId}`;\n const body = JSON.stringify({\n regulationType: SEGMENT_REGULATION_TYPE_DELETE_ONLY,\n subjectType: SEGMENT_SUBJECT_TYPE_USER_ID,\n subjectIds: [analyticsId],\n });\n\n const response = await this.#policy.execute(async () => {\n const localResponse = await this.#fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': SEGMENT_CONTENT_TYPE,\n },\n body,\n });\n\n if (!localResponse.ok) {\n throw new HttpError(\n localResponse.status,\n `Creating data deletion task failed with status '${localResponse.status}'`,\n );\n }\n\n return localResponse;\n });\n\n const jsonResponse = (await response.json()) as CreateRegulationResponse;\n\n if (\n !jsonResponse?.data?.data?.regulateId ||\n typeof jsonResponse.data.data.regulateId !== 'string' ||\n jsonResponse.data.data.regulateId.trim() === ''\n ) {\n throw new Error(\n 'Malformed response from Segment API: missing or invalid regulateId',\n );\n }\n\n return {\n status: DATA_DELETE_RESPONSE_STATUSES.Success,\n regulateId: jsonResponse.data.data.regulateId,\n };\n }\n\n /**\n * Checks the status of a regulation by ID.\n *\n * @param regulationId - The regulation ID to check.\n * @returns Promise resolving to a successful regulation status response.\n * @throws Error if the request fails or the response is invalid.\n */\n async checkDataDeleteStatus(regulationId: string): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n dataDeleteStatus: DataDeleteStatus;\n }> {\n if (!regulationId || !this.#segmentRegulationsEndpoint) {\n throw new Error('Regulation ID or endpoint not configured');\n }\n\n const url = `${this.#segmentRegulationsEndpoint}/regulations/${regulationId}`;\n\n const response = await this.#policy.execute(async () => {\n const localResponse = await this.#fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': SEGMENT_CONTENT_TYPE,\n },\n });\n\n if (!localResponse.ok) {\n throw new HttpError(\n localResponse.status,\n `Checking data deletion status failed with status '${localResponse.status}'`,\n );\n }\n\n return localResponse;\n });\n\n const jsonResponse = (await response.json()) as GetRegulationStatusResponse;\n\n const rawStatus = jsonResponse?.data?.data?.regulation?.overallStatus;\n const dataDeleteStatus = isDataDeleteStatus(rawStatus)\n ? rawStatus\n : DATA_DELETE_STATUSES.Unknown;\n\n return {\n status: DATA_DELETE_RESPONSE_STATUSES.Success,\n dataDeleteStatus,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"AnalyticsDataRegulationService.mjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationService.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CreateServicePolicyOptions,\n ServicePolicy,\n} from '@metamask/controller-utils';\nimport { createServicePolicy, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { IDisposable } from 'cockatiel';\n\nimport type { AnalyticsDataRegulationServiceMethodActions } from './AnalyticsDataRegulationService-method-action-types.js';\nimport {\n DATA_DELETE_RESPONSE_STATUSES,\n DATA_DELETE_STATUSES,\n} from './types.js';\nimport type { DataDeleteStatus } from './types.js';\n\n/**\n * Segment API regulation type for DELETE_ONLY operations.\n */\nconst SEGMENT_REGULATION_TYPE_DELETE_ONLY = 'DELETE_ONLY';\n\n/**\n * Segment API subject type for user ID operations.\n */\nconst SEGMENT_SUBJECT_TYPE_USER_ID = 'USER_ID';\n\n/**\n * Segment API Content-Type header value.\n */\nconst SEGMENT_CONTENT_TYPE = 'application/vnd.segment.v1+json';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link AnalyticsDataRegulationService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'AnalyticsDataRegulationService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'createDataDeletionTask',\n 'checkDataDeleteStatus',\n] as const;\n\n/**\n * Actions that {@link AnalyticsDataRegulationService} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationServiceActions =\n AnalyticsDataRegulationServiceMethodActions;\n\n/**\n * Actions from other messengers that {@link AnalyticsDataRegulationServiceMessenger} calls.\n */\ntype AllowedActions = never;\n\n/**\n * Events that {@link AnalyticsDataRegulationService} exposes to other consumers.\n */\nexport type AnalyticsDataRegulationServiceEvents = never;\n\n/**\n * Events from other messengers that {@link AnalyticsDataRegulationService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link AnalyticsDataRegulationService}.\n */\nexport type AnalyticsDataRegulationServiceMessenger = Messenger<\n typeof serviceName,\n AnalyticsDataRegulationServiceActions | AllowedActions,\n AnalyticsDataRegulationServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\n/**\n * Response structure from Segment API for creating a regulation.\n */\ntype CreateRegulationResponse = {\n data: {\n data: {\n regulateId: string;\n };\n };\n};\n\n/**\n * Response structure from Segment API for getting regulation status.\n */\ntype GetRegulationStatusResponse = {\n data: {\n data: {\n regulation: {\n overallStatus: string;\n };\n };\n };\n};\n\n/**\n * Options for constructing {@link AnalyticsDataRegulationService}.\n */\nexport type AnalyticsDataRegulationServiceOptions = {\n /**\n * The messenger suited for this service.\n */\n messenger: AnalyticsDataRegulationServiceMessenger;\n\n /**\n * A function that can be used to make an HTTP request.\n */\n fetch: typeof fetch;\n\n /**\n * Segment API source ID (required for creating regulations).\n */\n segmentSourceId: string;\n\n /**\n * Base URL for the proxy endpoint that communicates with Segment's Regulations API.\n * This is a proxy endpoint (not Segment API directly) that forwards requests to Segment's\n * Regulations API and adds authentication tokens. The endpoint URL varies by environment\n * (e.g., development, staging, production) and should be configured accordingly.\n * Example: 'https://proxy.example.com/v1beta'\n */\n segmentRegulationsEndpoint: string;\n\n /**\n * Options to pass to `createServicePolicy`, which is used to wrap each request.\n */\n policyOptions?: CreateServicePolicyOptions;\n};\n\n/**\n * Type guard to check if a value is a valid DataDeleteStatus.\n *\n * @param status - The value to check.\n * @returns True if the value is a valid DataDeleteStatus.\n */\nfunction isDataDeleteStatus(status: unknown): status is DataDeleteStatus {\n const dataDeleteStatuses: string[] = Object.values(DATA_DELETE_STATUSES);\n return dataDeleteStatuses.includes(status as string);\n}\n\n/**\n * This service object is responsible for making requests to the Segment Regulations API\n * via a proxy endpoint for GDPR/CCPA data deletion functionality.\n *\n * @example\n *\n * ```ts\n * import { Messenger } from '@metamask/messenger';\n * import type {\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents,\n * } from '@metamask/analytics-data-regulation-controller';\n *\n * const rootMessenger = new Messenger<\n * 'Root',\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents\n * >({ namespace: 'Root' });\n * const serviceMessenger = new Messenger<\n * 'AnalyticsDataRegulationService',\n * AnalyticsDataRegulationServiceActions,\n * AnalyticsDataRegulationServiceEvents,\n * typeof rootMessenger,\n * >({\n * namespace: 'AnalyticsDataRegulationService',\n * parent: rootMessenger,\n * });\n * // Instantiate the service to register its actions on the messenger\n * new AnalyticsDataRegulationService({\n * messenger: serviceMessenger,\n * fetch,\n * segmentSourceId: 'abc123',\n * segmentRegulationsEndpoint: 'https://proxy.example.com/v1beta',\n * });\n *\n * // Later...\n * // Create a data deletion task\n * const response = await rootMessenger.call(\n * 'AnalyticsDataRegulationService:createDataDeletionTask',\n * 'user-analytics-id',\n * );\n * ```\n */\nexport class AnalyticsDataRegulationService {\n /**\n * The name of the service.\n */\n readonly name: typeof serviceName;\n\n /**\n * The messenger suited for this service.\n */\n readonly #messenger: AnalyticsDataRegulationServiceMessenger;\n\n /**\n * A function that can be used to make an HTTP request.\n */\n readonly #fetch: typeof fetch;\n\n /**\n * Segment API source ID.\n */\n readonly #segmentSourceId: string;\n\n /**\n * Base URL for the proxy endpoint that communicates with Segment's Regulations API.\n * This endpoint varies by environment and forwards requests to Segment API with authentication.\n */\n readonly #segmentRegulationsEndpoint: string;\n\n /**\n * The policy that wraps the request.\n *\n * @see {@link createServicePolicy}\n */\n readonly #policy: ServicePolicy;\n\n /**\n * Constructs a new AnalyticsDataRegulationService object.\n *\n * @param options - The constructor options.\n */\n constructor(options: AnalyticsDataRegulationServiceOptions) {\n this.name = serviceName;\n this.#messenger = options.messenger;\n this.#fetch = options.fetch;\n this.#segmentSourceId = options.segmentSourceId;\n this.#segmentRegulationsEndpoint = options.segmentRegulationsEndpoint;\n this.#policy = createServicePolicy(options.policyOptions ?? {});\n\n this.#messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Registers a handler that will be called after a request returns a non-500\n * response, causing a retry. Primarily useful in tests where timers are being\n * mocked.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n * @see {@link createServicePolicy}\n */\n onRetry(listener: Parameters<ServicePolicy['onRetry']>[0]): IDisposable {\n return this.#policy.onRetry(listener);\n }\n\n /**\n * Registers a handler that will be called after a set number of retry rounds\n * prove that requests to the API endpoint consistently return a 5xx response.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n * @see {@link createServicePolicy}\n */\n onBreak(listener: Parameters<ServicePolicy['onBreak']>[0]): IDisposable {\n return this.#policy.onBreak(listener);\n }\n\n /**\n * Registers a handler that will be called under one of two circumstances:\n *\n * 1. After a set number of retries prove that requests to the API\n * consistently result in failures.\n * 2. After a successful request is made to the API, but the response takes\n * longer than a set duration to return.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler.\n */\n onDegraded(\n listener: Parameters<ServicePolicy['onDegraded']>[0],\n ): IDisposable {\n return this.#policy.onDegraded(listener);\n }\n\n /**\n * Creates a DELETE_ONLY regulation for the given analyticsId.\n *\n * @param analyticsId - The analytics ID of the user for whom to create the deletion task.\n * @returns Promise resolving to a successful deletion regulation response.\n * @throws Error if the request fails or the response is invalid.\n */\n async createDataDeletionTask(analyticsId: string): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n regulateId: string;\n }> {\n if (!this.#segmentSourceId || !this.#segmentRegulationsEndpoint) {\n throw new Error('Segment API source ID or endpoint not found');\n }\n\n const url = `${this.#segmentRegulationsEndpoint}/regulations/sources/${this.#segmentSourceId}`;\n const body = JSON.stringify({\n regulationType: SEGMENT_REGULATION_TYPE_DELETE_ONLY,\n subjectType: SEGMENT_SUBJECT_TYPE_USER_ID,\n subjectIds: [analyticsId],\n });\n\n const response = await this.#policy.execute(async () => {\n const localResponse = await this.#fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': SEGMENT_CONTENT_TYPE,\n },\n body,\n });\n\n if (!localResponse.ok) {\n throw new HttpError(\n localResponse.status,\n `Creating data deletion task failed with status '${localResponse.status}'`,\n );\n }\n\n return localResponse;\n });\n\n const jsonResponse = (await response.json()) as CreateRegulationResponse;\n\n if (\n !jsonResponse?.data?.data?.regulateId ||\n typeof jsonResponse.data.data.regulateId !== 'string' ||\n jsonResponse.data.data.regulateId.trim() === ''\n ) {\n throw new Error(\n 'Malformed response from Segment API: missing or invalid regulateId',\n );\n }\n\n return {\n status: DATA_DELETE_RESPONSE_STATUSES.Success,\n regulateId: jsonResponse.data.data.regulateId,\n };\n }\n\n /**\n * Checks the status of a regulation by ID.\n *\n * @param regulationId - The regulation ID to check.\n * @returns Promise resolving to a successful regulation status response.\n * @throws Error if the request fails or the response is invalid.\n */\n async checkDataDeleteStatus(regulationId: string): Promise<{\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n dataDeleteStatus: DataDeleteStatus;\n }> {\n if (!regulationId || !this.#segmentRegulationsEndpoint) {\n throw new Error('Regulation ID or endpoint not configured');\n }\n\n const url = `${this.#segmentRegulationsEndpoint}/regulations/${regulationId}`;\n\n const response = await this.#policy.execute(async () => {\n const localResponse = await this.#fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': SEGMENT_CONTENT_TYPE,\n },\n });\n\n if (!localResponse.ok) {\n throw new HttpError(\n localResponse.status,\n `Checking data deletion status failed with status '${localResponse.status}'`,\n );\n }\n\n return localResponse;\n });\n\n const jsonResponse = (await response.json()) as GetRegulationStatusResponse;\n\n const rawStatus = jsonResponse?.data?.data?.regulation?.overallStatus;\n const dataDeleteStatus = isDataDeleteStatus(rawStatus)\n ? rawStatus\n : DATA_DELETE_STATUSES.Unknown;\n\n return {\n status: DATA_DELETE_RESPONSE_STATUSES.Success,\n dataDeleteStatus,\n };\n }\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.analyticsDataRegulationControllerSelectors = exports.DATA_DELETE_RESPONSE_STATUSES = exports.DATA_DELETE_STATUSES = exports.AnalyticsDataRegulationService = exports.getDefaultAnalyticsDataRegulationControllerState = exports.AnalyticsDataRegulationController = void 0;
4
- var AnalyticsDataRegulationController_1 = require("./AnalyticsDataRegulationController.cjs");
5
- Object.defineProperty(exports, "AnalyticsDataRegulationController", { enumerable: true, get: function () { return AnalyticsDataRegulationController_1.AnalyticsDataRegulationController; } });
6
- Object.defineProperty(exports, "getDefaultAnalyticsDataRegulationControllerState", { enumerable: true, get: function () { return AnalyticsDataRegulationController_1.getDefaultAnalyticsDataRegulationControllerState; } });
7
- var AnalyticsDataRegulationService_1 = require("./AnalyticsDataRegulationService.cjs");
8
- Object.defineProperty(exports, "AnalyticsDataRegulationService", { enumerable: true, get: function () { return AnalyticsDataRegulationService_1.AnalyticsDataRegulationService; } });
9
- var types_1 = require("./types.cjs");
10
- Object.defineProperty(exports, "DATA_DELETE_STATUSES", { enumerable: true, get: function () { return types_1.DATA_DELETE_STATUSES; } });
11
- Object.defineProperty(exports, "DATA_DELETE_RESPONSE_STATUSES", { enumerable: true, get: function () { return types_1.DATA_DELETE_RESPONSE_STATUSES; } });
12
- var selectors_1 = require("./selectors.cjs");
13
- Object.defineProperty(exports, "analyticsDataRegulationControllerSelectors", { enumerable: true, get: function () { return selectors_1.analyticsDataRegulationControllerSelectors; } });
4
+ var AnalyticsDataRegulationController_js_1 = require("./AnalyticsDataRegulationController.cjs");
5
+ Object.defineProperty(exports, "AnalyticsDataRegulationController", { enumerable: true, get: function () { return AnalyticsDataRegulationController_js_1.AnalyticsDataRegulationController; } });
6
+ Object.defineProperty(exports, "getDefaultAnalyticsDataRegulationControllerState", { enumerable: true, get: function () { return AnalyticsDataRegulationController_js_1.getDefaultAnalyticsDataRegulationControllerState; } });
7
+ var AnalyticsDataRegulationService_js_1 = require("./AnalyticsDataRegulationService.cjs");
8
+ Object.defineProperty(exports, "AnalyticsDataRegulationService", { enumerable: true, get: function () { return AnalyticsDataRegulationService_js_1.AnalyticsDataRegulationService; } });
9
+ var types_js_1 = require("./types.cjs");
10
+ Object.defineProperty(exports, "DATA_DELETE_STATUSES", { enumerable: true, get: function () { return types_js_1.DATA_DELETE_STATUSES; } });
11
+ Object.defineProperty(exports, "DATA_DELETE_RESPONSE_STATUSES", { enumerable: true, get: function () { return types_js_1.DATA_DELETE_RESPONSE_STATUSES; } });
12
+ var selectors_js_1 = require("./selectors.cjs");
13
+ Object.defineProperty(exports, "analyticsDataRegulationControllerSelectors", { enumerable: true, get: function () { return selectors_js_1.analyticsDataRegulationControllerSelectors; } });
14
14
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,6FAG6C;AAF3C,sJAAA,iCAAiC,OAAA;AACjC,qKAAA,gDAAgD,OAAA;AAIlD,uFAAkF;AAAzE,gJAAA,8BAA8B,OAAA;AAQvC,qCAKiB;AAJf,6GAAA,oBAAoB,OAAA;AACpB,sHAAA,6BAA6B,OAAA;AAQ/B,6CAAyE;AAAhE,uIAAA,0CAA0C,OAAA","sourcesContent":["export {\n AnalyticsDataRegulationController,\n getDefaultAnalyticsDataRegulationControllerState,\n} from './AnalyticsDataRegulationController';\nexport type { AnalyticsDataRegulationControllerOptions } from './AnalyticsDataRegulationController';\n\nexport { AnalyticsDataRegulationService } from './AnalyticsDataRegulationService';\nexport type {\n AnalyticsDataRegulationServiceActions,\n AnalyticsDataRegulationServiceEvents,\n AnalyticsDataRegulationServiceMessenger,\n AnalyticsDataRegulationServiceOptions,\n} from './AnalyticsDataRegulationService';\n\nexport {\n DATA_DELETE_STATUSES,\n DATA_DELETE_RESPONSE_STATUSES,\n type DataDeleteStatus,\n type DataDeleteResponseStatus,\n} from './types';\nexport type { DeleteRegulationResponse, DeleteRegulationStatus } from './types';\n\nexport type { AnalyticsDataRegulationControllerState } from './AnalyticsDataRegulationController';\n\nexport { analyticsDataRegulationControllerSelectors } from './selectors';\n\nexport type { AnalyticsDataRegulationControllerMessenger } from './AnalyticsDataRegulationController';\n\nexport type {\n AnalyticsDataRegulationControllerActions,\n AnalyticsDataRegulationControllerEvents,\n AnalyticsDataRegulationControllerGetStateAction,\n AnalyticsDataRegulationControllerStateChangeEvent,\n DataDeletionTaskCreatedEvent,\n DataRecordingFlagUpdatedEvent,\n} from './AnalyticsDataRegulationController';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,gGAGgD;AAF9C,yJAAA,iCAAiC,OAAA;AACjC,wKAAA,gDAAgD,OAAA;AAIlD,0FAAqF;AAA5E,mJAAA,8BAA8B,OAAA;AAQvC,wCAKoB;AAJlB,gHAAA,oBAAoB,OAAA;AACpB,yHAAA,6BAA6B,OAAA;AAW/B,gDAA4E;AAAnE,0IAAA,0CAA0C,OAAA","sourcesContent":["export {\n AnalyticsDataRegulationController,\n getDefaultAnalyticsDataRegulationControllerState,\n} from './AnalyticsDataRegulationController.js';\nexport type { AnalyticsDataRegulationControllerOptions } from './AnalyticsDataRegulationController.js';\n\nexport { AnalyticsDataRegulationService } from './AnalyticsDataRegulationService.js';\nexport type {\n AnalyticsDataRegulationServiceActions,\n AnalyticsDataRegulationServiceEvents,\n AnalyticsDataRegulationServiceMessenger,\n AnalyticsDataRegulationServiceOptions,\n} from './AnalyticsDataRegulationService.js';\n\nexport {\n DATA_DELETE_STATUSES,\n DATA_DELETE_RESPONSE_STATUSES,\n type DataDeleteStatus,\n type DataDeleteResponseStatus,\n} from './types.js';\nexport type {\n DeleteRegulationResponse,\n DeleteRegulationStatus,\n} from './types.js';\n\nexport type { AnalyticsDataRegulationControllerState } from './AnalyticsDataRegulationController.js';\n\nexport { analyticsDataRegulationControllerSelectors } from './selectors.js';\n\nexport type { AnalyticsDataRegulationControllerMessenger } from './AnalyticsDataRegulationController.js';\n\nexport type {\n AnalyticsDataRegulationControllerActions,\n AnalyticsDataRegulationControllerEvents,\n AnalyticsDataRegulationControllerGetStateAction,\n AnalyticsDataRegulationControllerStateChangeEvent,\n DataDeletionTaskCreatedEvent,\n DataRecordingFlagUpdatedEvent,\n} from './AnalyticsDataRegulationController.js';\n"]}
package/dist/index.d.cts CHANGED
@@ -3,7 +3,7 @@ export type { AnalyticsDataRegulationControllerOptions } from "./AnalyticsDataRe
3
3
  export { AnalyticsDataRegulationService } from "./AnalyticsDataRegulationService.cjs";
4
4
  export type { AnalyticsDataRegulationServiceActions, AnalyticsDataRegulationServiceEvents, AnalyticsDataRegulationServiceMessenger, AnalyticsDataRegulationServiceOptions, } from "./AnalyticsDataRegulationService.cjs";
5
5
  export { DATA_DELETE_STATUSES, DATA_DELETE_RESPONSE_STATUSES, type DataDeleteStatus, type DataDeleteResponseStatus, } from "./types.cjs";
6
- export type { DeleteRegulationResponse, DeleteRegulationStatus } from "./types.cjs";
6
+ export type { DeleteRegulationResponse, DeleteRegulationStatus, } from "./types.cjs";
7
7
  export type { AnalyticsDataRegulationControllerState } from "./AnalyticsDataRegulationController.cjs";
8
8
  export { analyticsDataRegulationControllerSelectors } from "./selectors.cjs";
9
9
  export type { AnalyticsDataRegulationControllerMessenger } from "./AnalyticsDataRegulationController.cjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,gDAAgD,GACjD,gDAA4C;AAC7C,YAAY,EAAE,wCAAwC,EAAE,gDAA4C;AAEpG,OAAO,EAAE,8BAA8B,EAAE,6CAAyC;AAClF,YAAY,EACV,qCAAqC,EACrC,oCAAoC,EACpC,uCAAuC,EACvC,qCAAqC,GACtC,6CAAyC;AAE1C,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,GAC9B,oBAAgB;AACjB,YAAY,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,oBAAgB;AAEhF,YAAY,EAAE,sCAAsC,EAAE,gDAA4C;AAElG,OAAO,EAAE,0CAA0C,EAAE,wBAAoB;AAEzE,YAAY,EAAE,0CAA0C,EAAE,gDAA4C;AAEtG,YAAY,EACV,wCAAwC,EACxC,uCAAuC,EACvC,+CAA+C,EAC/C,iDAAiD,EACjD,4BAA4B,EAC5B,6BAA6B,GAC9B,gDAA4C"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,gDAAgD,GACjD,gDAA+C;AAChD,YAAY,EAAE,wCAAwC,EAAE,gDAA+C;AAEvG,OAAO,EAAE,8BAA8B,EAAE,6CAA4C;AACrF,YAAY,EACV,qCAAqC,EACrC,oCAAoC,EACpC,uCAAuC,EACvC,qCAAqC,GACtC,6CAA4C;AAE7C,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,GAC9B,oBAAmB;AACpB,YAAY,EACV,wBAAwB,EACxB,sBAAsB,GACvB,oBAAmB;AAEpB,YAAY,EAAE,sCAAsC,EAAE,gDAA+C;AAErG,OAAO,EAAE,0CAA0C,EAAE,wBAAuB;AAE5E,YAAY,EAAE,0CAA0C,EAAE,gDAA+C;AAEzG,YAAY,EACV,wCAAwC,EACxC,uCAAuC,EACvC,+CAA+C,EAC/C,iDAAiD,EACjD,4BAA4B,EAC5B,6BAA6B,GAC9B,gDAA+C"}
package/dist/index.d.mts CHANGED
@@ -3,7 +3,7 @@ export type { AnalyticsDataRegulationControllerOptions } from "./AnalyticsDataRe
3
3
  export { AnalyticsDataRegulationService } from "./AnalyticsDataRegulationService.mjs";
4
4
  export type { AnalyticsDataRegulationServiceActions, AnalyticsDataRegulationServiceEvents, AnalyticsDataRegulationServiceMessenger, AnalyticsDataRegulationServiceOptions, } from "./AnalyticsDataRegulationService.mjs";
5
5
  export { DATA_DELETE_STATUSES, DATA_DELETE_RESPONSE_STATUSES, type DataDeleteStatus, type DataDeleteResponseStatus, } from "./types.mjs";
6
- export type { DeleteRegulationResponse, DeleteRegulationStatus } from "./types.mjs";
6
+ export type { DeleteRegulationResponse, DeleteRegulationStatus, } from "./types.mjs";
7
7
  export type { AnalyticsDataRegulationControllerState } from "./AnalyticsDataRegulationController.mjs";
8
8
  export { analyticsDataRegulationControllerSelectors } from "./selectors.mjs";
9
9
  export type { AnalyticsDataRegulationControllerMessenger } from "./AnalyticsDataRegulationController.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,gDAAgD,GACjD,gDAA4C;AAC7C,YAAY,EAAE,wCAAwC,EAAE,gDAA4C;AAEpG,OAAO,EAAE,8BAA8B,EAAE,6CAAyC;AAClF,YAAY,EACV,qCAAqC,EACrC,oCAAoC,EACpC,uCAAuC,EACvC,qCAAqC,GACtC,6CAAyC;AAE1C,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,GAC9B,oBAAgB;AACjB,YAAY,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,oBAAgB;AAEhF,YAAY,EAAE,sCAAsC,EAAE,gDAA4C;AAElG,OAAO,EAAE,0CAA0C,EAAE,wBAAoB;AAEzE,YAAY,EAAE,0CAA0C,EAAE,gDAA4C;AAEtG,YAAY,EACV,wCAAwC,EACxC,uCAAuC,EACvC,+CAA+C,EAC/C,iDAAiD,EACjD,4BAA4B,EAC5B,6BAA6B,GAC9B,gDAA4C"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,gDAAgD,GACjD,gDAA+C;AAChD,YAAY,EAAE,wCAAwC,EAAE,gDAA+C;AAEvG,OAAO,EAAE,8BAA8B,EAAE,6CAA4C;AACrF,YAAY,EACV,qCAAqC,EACrC,oCAAoC,EACpC,uCAAuC,EACvC,qCAAqC,GACtC,6CAA4C;AAE7C,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,GAC9B,oBAAmB;AACpB,YAAY,EACV,wBAAwB,EACxB,sBAAsB,GACvB,oBAAmB;AAEpB,YAAY,EAAE,sCAAsC,EAAE,gDAA+C;AAErG,OAAO,EAAE,0CAA0C,EAAE,wBAAuB;AAE5E,YAAY,EAAE,0CAA0C,EAAE,gDAA+C;AAEzG,YAAY,EACV,wCAAwC,EACxC,uCAAuC,EACvC,+CAA+C,EAC/C,iDAAiD,EACjD,4BAA4B,EAC5B,6BAA6B,GAC9B,gDAA+C"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,gDAAgD,EACjD,gDAA4C;AAG7C,OAAO,EAAE,8BAA8B,EAAE,6CAAyC;AAQlF,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAG9B,oBAAgB;AAKjB,OAAO,EAAE,0CAA0C,EAAE,wBAAoB","sourcesContent":["export {\n AnalyticsDataRegulationController,\n getDefaultAnalyticsDataRegulationControllerState,\n} from './AnalyticsDataRegulationController';\nexport type { AnalyticsDataRegulationControllerOptions } from './AnalyticsDataRegulationController';\n\nexport { AnalyticsDataRegulationService } from './AnalyticsDataRegulationService';\nexport type {\n AnalyticsDataRegulationServiceActions,\n AnalyticsDataRegulationServiceEvents,\n AnalyticsDataRegulationServiceMessenger,\n AnalyticsDataRegulationServiceOptions,\n} from './AnalyticsDataRegulationService';\n\nexport {\n DATA_DELETE_STATUSES,\n DATA_DELETE_RESPONSE_STATUSES,\n type DataDeleteStatus,\n type DataDeleteResponseStatus,\n} from './types';\nexport type { DeleteRegulationResponse, DeleteRegulationStatus } from './types';\n\nexport type { AnalyticsDataRegulationControllerState } from './AnalyticsDataRegulationController';\n\nexport { analyticsDataRegulationControllerSelectors } from './selectors';\n\nexport type { AnalyticsDataRegulationControllerMessenger } from './AnalyticsDataRegulationController';\n\nexport type {\n AnalyticsDataRegulationControllerActions,\n AnalyticsDataRegulationControllerEvents,\n AnalyticsDataRegulationControllerGetStateAction,\n AnalyticsDataRegulationControllerStateChangeEvent,\n DataDeletionTaskCreatedEvent,\n DataRecordingFlagUpdatedEvent,\n} from './AnalyticsDataRegulationController';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,gDAAgD,EACjD,gDAA+C;AAGhD,OAAO,EAAE,8BAA8B,EAAE,6CAA4C;AAQrF,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAG9B,oBAAmB;AAQpB,OAAO,EAAE,0CAA0C,EAAE,wBAAuB","sourcesContent":["export {\n AnalyticsDataRegulationController,\n getDefaultAnalyticsDataRegulationControllerState,\n} from './AnalyticsDataRegulationController.js';\nexport type { AnalyticsDataRegulationControllerOptions } from './AnalyticsDataRegulationController.js';\n\nexport { AnalyticsDataRegulationService } from './AnalyticsDataRegulationService.js';\nexport type {\n AnalyticsDataRegulationServiceActions,\n AnalyticsDataRegulationServiceEvents,\n AnalyticsDataRegulationServiceMessenger,\n AnalyticsDataRegulationServiceOptions,\n} from './AnalyticsDataRegulationService.js';\n\nexport {\n DATA_DELETE_STATUSES,\n DATA_DELETE_RESPONSE_STATUSES,\n type DataDeleteStatus,\n type DataDeleteResponseStatus,\n} from './types.js';\nexport type {\n DeleteRegulationResponse,\n DeleteRegulationStatus,\n} from './types.js';\n\nexport type { AnalyticsDataRegulationControllerState } from './AnalyticsDataRegulationController.js';\n\nexport { analyticsDataRegulationControllerSelectors } from './selectors.js';\n\nexport type { AnalyticsDataRegulationControllerMessenger } from './AnalyticsDataRegulationController.js';\n\nexport type {\n AnalyticsDataRegulationControllerActions,\n AnalyticsDataRegulationControllerEvents,\n AnalyticsDataRegulationControllerGetStateAction,\n AnalyticsDataRegulationControllerStateChangeEvent,\n DataDeletionTaskCreatedEvent,\n DataRecordingFlagUpdatedEvent,\n} from './AnalyticsDataRegulationController.js';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"selectors.cjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,MAAM,0CAA0C,GAAG,CACjD,KAA6C,EACpC,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,wBAAwB,GAAG,CAC/B,KAA6C,EACzB,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,+BAA+B,GAAG,CACtC,KAA6C,EACzB,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC;AAEzD;;;GAGG;AACU,QAAA,0CAA0C,GAAG;IACxD,0CAA0C;IAC1C,wBAAwB;IACxB,+BAA+B;CAChC,CAAC","sourcesContent":["import type { AnalyticsDataRegulationControllerState } from './AnalyticsDataRegulationController';\n\n/**\n * Selects the data recorded flag from the controller state.\n *\n * @param state - The controller state\n * @returns Whether data has been recorded since the last deletion request\n */\nconst selectHasCollectedDataSinceDeletionRequest = (\n state: AnalyticsDataRegulationControllerState,\n): boolean => state.hasCollectedDataSinceDeletionRequest;\n\n/**\n * Selects the delete regulation ID from the controller state.\n *\n * @param state - The controller state\n * @returns The regulation ID, or undefined if not set\n */\nconst selectDeleteRegulationId = (\n state: AnalyticsDataRegulationControllerState,\n): string | undefined => state.deleteRegulationId;\n\n/**\n * Selects the delete regulation creation timestamp from the controller state.\n *\n * @param state - The controller state\n * @returns The deletion timestamp (in milliseconds since epoch), or undefined if not set\n */\nconst selectDeleteRegulationTimestamp = (\n state: AnalyticsDataRegulationControllerState,\n): number | undefined => state.deleteRegulationTimestamp;\n\n/**\n * Selectors for the AnalyticsDataRegulationController state.\n * These can be used with Redux or directly with controller state.\n */\nexport const analyticsDataRegulationControllerSelectors = {\n selectHasCollectedDataSinceDeletionRequest,\n selectDeleteRegulationId,\n selectDeleteRegulationTimestamp,\n};\n"]}
1
+ {"version":3,"file":"selectors.cjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,MAAM,0CAA0C,GAAG,CACjD,KAA6C,EACpC,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,wBAAwB,GAAG,CAC/B,KAA6C,EACzB,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,+BAA+B,GAAG,CACtC,KAA6C,EACzB,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC;AAEzD;;;GAGG;AACU,QAAA,0CAA0C,GAAG;IACxD,0CAA0C;IAC1C,wBAAwB;IACxB,+BAA+B;CAChC,CAAC","sourcesContent":["import type { AnalyticsDataRegulationControllerState } from './AnalyticsDataRegulationController.js';\n\n/**\n * Selects the data recorded flag from the controller state.\n *\n * @param state - The controller state\n * @returns Whether data has been recorded since the last deletion request\n */\nconst selectHasCollectedDataSinceDeletionRequest = (\n state: AnalyticsDataRegulationControllerState,\n): boolean => state.hasCollectedDataSinceDeletionRequest;\n\n/**\n * Selects the delete regulation ID from the controller state.\n *\n * @param state - The controller state\n * @returns The regulation ID, or undefined if not set\n */\nconst selectDeleteRegulationId = (\n state: AnalyticsDataRegulationControllerState,\n): string | undefined => state.deleteRegulationId;\n\n/**\n * Selects the delete regulation creation timestamp from the controller state.\n *\n * @param state - The controller state\n * @returns The deletion timestamp (in milliseconds since epoch), or undefined if not set\n */\nconst selectDeleteRegulationTimestamp = (\n state: AnalyticsDataRegulationControllerState,\n): number | undefined => state.deleteRegulationTimestamp;\n\n/**\n * Selectors for the AnalyticsDataRegulationController state.\n * These can be used with Redux or directly with controller state.\n */\nexport const analyticsDataRegulationControllerSelectors = {\n selectHasCollectedDataSinceDeletionRequest,\n selectDeleteRegulationId,\n selectDeleteRegulationTimestamp,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"selectors.d.cts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sCAAsC,EAAE,gDAA4C;AAgClG;;;GAGG;AACH,eAAO,MAAM,0CAA0C;wDA3B9C,sCAAsC,KAC5C,OAAO;sCASD,sCAAsC,KAC5C,MAAM,GAAG,SAAS;6CASZ,sCAAsC,KAC5C,MAAM,GAAG,SAAS;CAUpB,CAAC"}
1
+ {"version":3,"file":"selectors.d.cts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sCAAsC,EAAE,gDAA+C;AAgCrG;;;GAGG;AACH,eAAO,MAAM,0CAA0C;wDA3B9C,sCAAsC,KAC5C,OAAO;sCASD,sCAAsC,KAC5C,MAAM,GAAG,SAAS;6CASZ,sCAAsC,KAC5C,MAAM,GAAG,SAAS;CAUpB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"selectors.d.mts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sCAAsC,EAAE,gDAA4C;AAgClG;;;GAGG;AACH,eAAO,MAAM,0CAA0C;wDA3B9C,sCAAsC,KAC5C,OAAO;sCASD,sCAAsC,KAC5C,MAAM,GAAG,SAAS;6CASZ,sCAAsC,KAC5C,MAAM,GAAG,SAAS;CAUpB,CAAC"}
1
+ {"version":3,"file":"selectors.d.mts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sCAAsC,EAAE,gDAA+C;AAgCrG;;;GAGG;AACH,eAAO,MAAM,0CAA0C;wDA3B9C,sCAAsC,KAC5C,OAAO;sCASD,sCAAsC,KAC5C,MAAM,GAAG,SAAS;6CASZ,sCAAsC,KAC5C,MAAM,GAAG,SAAS;CAUpB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"selectors.mjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,0CAA0C,GAAG,CACjD,KAA6C,EACpC,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,wBAAwB,GAAG,CAC/B,KAA6C,EACzB,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,+BAA+B,GAAG,CACtC,KAA6C,EACzB,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,MAAM,0CAA0C,GAAG;IACxD,0CAA0C;IAC1C,wBAAwB;IACxB,+BAA+B;CAChC,CAAC","sourcesContent":["import type { AnalyticsDataRegulationControllerState } from './AnalyticsDataRegulationController';\n\n/**\n * Selects the data recorded flag from the controller state.\n *\n * @param state - The controller state\n * @returns Whether data has been recorded since the last deletion request\n */\nconst selectHasCollectedDataSinceDeletionRequest = (\n state: AnalyticsDataRegulationControllerState,\n): boolean => state.hasCollectedDataSinceDeletionRequest;\n\n/**\n * Selects the delete regulation ID from the controller state.\n *\n * @param state - The controller state\n * @returns The regulation ID, or undefined if not set\n */\nconst selectDeleteRegulationId = (\n state: AnalyticsDataRegulationControllerState,\n): string | undefined => state.deleteRegulationId;\n\n/**\n * Selects the delete regulation creation timestamp from the controller state.\n *\n * @param state - The controller state\n * @returns The deletion timestamp (in milliseconds since epoch), or undefined if not set\n */\nconst selectDeleteRegulationTimestamp = (\n state: AnalyticsDataRegulationControllerState,\n): number | undefined => state.deleteRegulationTimestamp;\n\n/**\n * Selectors for the AnalyticsDataRegulationController state.\n * These can be used with Redux or directly with controller state.\n */\nexport const analyticsDataRegulationControllerSelectors = {\n selectHasCollectedDataSinceDeletionRequest,\n selectDeleteRegulationId,\n selectDeleteRegulationTimestamp,\n};\n"]}
1
+ {"version":3,"file":"selectors.mjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,0CAA0C,GAAG,CACjD,KAA6C,EACpC,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,wBAAwB,GAAG,CAC/B,KAA6C,EACzB,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,+BAA+B,GAAG,CACtC,KAA6C,EACzB,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,MAAM,0CAA0C,GAAG;IACxD,0CAA0C;IAC1C,wBAAwB;IACxB,+BAA+B;CAChC,CAAC","sourcesContent":["import type { AnalyticsDataRegulationControllerState } from './AnalyticsDataRegulationController.js';\n\n/**\n * Selects the data recorded flag from the controller state.\n *\n * @param state - The controller state\n * @returns Whether data has been recorded since the last deletion request\n */\nconst selectHasCollectedDataSinceDeletionRequest = (\n state: AnalyticsDataRegulationControllerState,\n): boolean => state.hasCollectedDataSinceDeletionRequest;\n\n/**\n * Selects the delete regulation ID from the controller state.\n *\n * @param state - The controller state\n * @returns The regulation ID, or undefined if not set\n */\nconst selectDeleteRegulationId = (\n state: AnalyticsDataRegulationControllerState,\n): string | undefined => state.deleteRegulationId;\n\n/**\n * Selects the delete regulation creation timestamp from the controller state.\n *\n * @param state - The controller state\n * @returns The deletion timestamp (in milliseconds since epoch), or undefined if not set\n */\nconst selectDeleteRegulationTimestamp = (\n state: AnalyticsDataRegulationControllerState,\n): number | undefined => state.deleteRegulationTimestamp;\n\n/**\n * Selectors for the AnalyticsDataRegulationController state.\n * These can be used with Redux or directly with controller state.\n */\nexport const analyticsDataRegulationControllerSelectors = {\n selectHasCollectedDataSinceDeletionRequest,\n selectDeleteRegulationId,\n selectDeleteRegulationTimestamp,\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/analytics-data-regulation-controller",
3
- "version": "0.0.0-preview-40d5fb1e2",
3
+ "version": "0.0.0-preview-a3e31582e",
4
4
  "description": "Controller for managing analytics privacy and GDPR/CCPA data deletion functionality",
5
5
  "keywords": [
6
6
  "Ethereum",
@@ -46,8 +46,8 @@
46
46
  "changelog:validate": "../../scripts/validate-changelog.sh @metamask/analytics-data-regulation-controller",
47
47
  "lint:tsconfigs": "tsx ../../scripts/lint-tsconfigs/lint-tsconfigs.mts",
48
48
  "lint:tsconfigs:fix": "tsx ../../scripts/lint-tsconfigs/lint-tsconfigs.mts --fix",
49
- "messenger-action-types:check": "tsx ../../packages/messenger-cli/src/cli.ts --formatter oxfmt --check",
50
- "messenger-action-types:generate": "tsx ../../packages/messenger-cli/src/cli.ts --formatter oxfmt --generate",
49
+ "messenger-action-types:check": "tsx ../../packages/messenger-cli/src/cli.ts --formatter oxfmt --esm --check",
50
+ "messenger-action-types:generate": "tsx ../../packages/messenger-cli/src/cli.ts --formatter oxfmt --esm --generate",
51
51
  "since-latest-release": "../../scripts/since-latest-release.sh",
52
52
  "test": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter",
53
53
  "test:clean": "NODE_OPTIONS=--experimental-vm-modules jest --clearCache",
@@ -63,11 +63,11 @@
63
63
  "devDependencies": {
64
64
  "@metamask/auto-changelog": "^6.1.0",
65
65
  "@ts-bridge/cli": "^0.6.4",
66
- "@types/jest": "^29.5.14",
66
+ "@types/jest": "^30.0.0",
67
67
  "deepmerge": "^4.2.2",
68
- "jest": "^29.7.0",
68
+ "jest": "^30.4.2",
69
69
  "nock": "^13.3.1",
70
- "ts-jest": "^29.2.5",
70
+ "ts-jest": "^29.4.11",
71
71
  "tsx": "^4.20.5",
72
72
  "typedoc": "^0.25.13",
73
73
  "typedoc-plugin-missing-exports": "^2.0.0",