@metamask-previews/analytics-data-regulation-controller 0.0.0-preview-ec24abb79 → 0.0.0-preview-95a403d7b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -4
- package/dist/{AnalyticsDataRegulationController-method-action-types.d.mts → AnalyticsDataRegulationController-method-action-types.d.ts} +2 -2
- package/dist/AnalyticsDataRegulationController-method-action-types.d.ts.map +1 -0
- package/dist/{AnalyticsDataRegulationController-method-action-types.mjs → AnalyticsDataRegulationController-method-action-types.js} +1 -1
- package/dist/AnalyticsDataRegulationController-method-action-types.js.map +1 -0
- package/dist/{AnalyticsDataRegulationController.d.cts → AnalyticsDataRegulationController.d.ts} +8 -8
- package/dist/AnalyticsDataRegulationController.d.ts.map +1 -0
- package/dist/{AnalyticsDataRegulationController.mjs → AnalyticsDataRegulationController.js} +11 -24
- package/dist/AnalyticsDataRegulationController.js.map +1 -0
- package/dist/{AnalyticsDataRegulationService-method-action-types.d.cts → AnalyticsDataRegulationService-method-action-types.d.ts} +2 -2
- package/dist/AnalyticsDataRegulationService-method-action-types.d.ts.map +1 -0
- package/dist/{AnalyticsDataRegulationService-method-action-types.mjs → AnalyticsDataRegulationService-method-action-types.js} +1 -1
- package/dist/AnalyticsDataRegulationService-method-action-types.js.map +1 -0
- package/dist/{AnalyticsDataRegulationService.d.mts → AnalyticsDataRegulationService.d.ts} +7 -7
- package/dist/AnalyticsDataRegulationService.d.ts.map +1 -0
- package/dist/{AnalyticsDataRegulationService.mjs → AnalyticsDataRegulationService.js} +47 -56
- package/dist/AnalyticsDataRegulationService.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/{logger.mjs → logger.js} +2 -2
- package/dist/logger.js.map +1 -0
- package/dist/selectors.d.ts +33 -0
- package/dist/selectors.d.ts.map +1 -0
- package/dist/{selectors.mjs → selectors.js} +1 -1
- package/dist/selectors.js.map +1 -0
- package/dist/{types.d.cts → types.d.ts} +11 -11
- package/dist/types.d.ts.map +1 -0
- package/dist/{types.mjs → types.js} +1 -1
- package/dist/types.js.map +1 -0
- package/package.json +16 -20
- package/dist/AnalyticsDataRegulationController-method-action-types.cjs +0 -7
- package/dist/AnalyticsDataRegulationController-method-action-types.cjs.map +0 -1
- package/dist/AnalyticsDataRegulationController-method-action-types.d.cts +0 -44
- package/dist/AnalyticsDataRegulationController-method-action-types.d.cts.map +0 -1
- package/dist/AnalyticsDataRegulationController-method-action-types.d.mts.map +0 -1
- package/dist/AnalyticsDataRegulationController-method-action-types.mjs.map +0 -1
- package/dist/AnalyticsDataRegulationController.cjs +0 -176
- package/dist/AnalyticsDataRegulationController.cjs.map +0 -1
- package/dist/AnalyticsDataRegulationController.d.cts.map +0 -1
- package/dist/AnalyticsDataRegulationController.d.mts +0 -147
- package/dist/AnalyticsDataRegulationController.d.mts.map +0 -1
- package/dist/AnalyticsDataRegulationController.mjs.map +0 -1
- package/dist/AnalyticsDataRegulationService-method-action-types.cjs +0 -7
- package/dist/AnalyticsDataRegulationService-method-action-types.cjs.map +0 -1
- package/dist/AnalyticsDataRegulationService-method-action-types.d.cts.map +0 -1
- package/dist/AnalyticsDataRegulationService-method-action-types.d.mts +0 -32
- package/dist/AnalyticsDataRegulationService-method-action-types.d.mts.map +0 -1
- package/dist/AnalyticsDataRegulationService-method-action-types.mjs.map +0 -1
- package/dist/AnalyticsDataRegulationService.cjs +0 -247
- package/dist/AnalyticsDataRegulationService.cjs.map +0 -1
- package/dist/AnalyticsDataRegulationService.d.cts +0 -172
- package/dist/AnalyticsDataRegulationService.d.cts.map +0 -1
- package/dist/AnalyticsDataRegulationService.d.mts.map +0 -1
- package/dist/AnalyticsDataRegulationService.mjs.map +0 -1
- package/dist/index.cjs +0 -14
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -11
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts +0 -11
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -5
- package/dist/index.mjs.map +0 -1
- package/dist/logger.cjs +0 -7
- package/dist/logger.cjs.map +0 -1
- package/dist/logger.d.cts +0 -3
- package/dist/logger.d.cts.map +0 -1
- package/dist/logger.d.mts +0 -3
- package/dist/logger.d.mts.map +0 -1
- package/dist/logger.mjs.map +0 -1
- package/dist/selectors.cjs +0 -34
- package/dist/selectors.cjs.map +0 -1
- package/dist/selectors.d.cts +0 -11
- package/dist/selectors.d.cts.map +0 -1
- package/dist/selectors.d.mts +0 -11
- package/dist/selectors.d.mts.map +0 -1
- package/dist/selectors.mjs.map +0 -1
- package/dist/types.cjs +0 -25
- package/dist/types.cjs.map +0 -1
- package/dist/types.d.cts.map +0 -1
- package/dist/types.d.mts +0 -46
- package/dist/types.d.mts.map +0 -1
- package/dist/types.mjs.map +0 -1
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
* Values match Segment API response values exactly.
|
|
4
4
|
*/
|
|
5
5
|
export declare const DATA_DELETE_STATUSES: {
|
|
6
|
-
readonly Failed:
|
|
7
|
-
readonly Finished:
|
|
8
|
-
readonly Initialized:
|
|
9
|
-
readonly Invalid:
|
|
10
|
-
readonly NotSupported:
|
|
11
|
-
readonly PartialSuccess:
|
|
12
|
-
readonly Running:
|
|
13
|
-
readonly Unknown:
|
|
6
|
+
readonly Failed: 'FAILED';
|
|
7
|
+
readonly Finished: 'FINISHED';
|
|
8
|
+
readonly Initialized: 'INITIALIZED';
|
|
9
|
+
readonly Invalid: 'INVALID';
|
|
10
|
+
readonly NotSupported: 'NOT_SUPPORTED';
|
|
11
|
+
readonly PartialSuccess: 'PARTIAL_SUCCESS';
|
|
12
|
+
readonly Running: 'RUNNING';
|
|
13
|
+
readonly Unknown: 'UNKNOWN';
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
16
|
* Type union for data deletion status values.
|
|
@@ -20,8 +20,8 @@ export type DataDeleteStatus = (typeof DATA_DELETE_STATUSES)[keyof typeof DATA_D
|
|
|
20
20
|
* Response status for deletion regulation operations.
|
|
21
21
|
*/
|
|
22
22
|
export declare const DATA_DELETE_RESPONSE_STATUSES: {
|
|
23
|
-
readonly Success:
|
|
24
|
-
readonly Failure:
|
|
23
|
+
readonly Success: 'ok';
|
|
24
|
+
readonly Failure: 'error';
|
|
25
25
|
};
|
|
26
26
|
/**
|
|
27
27
|
* Type union for data deletion response status values.
|
|
@@ -43,4 +43,4 @@ export type DeleteRegulationStatus = {
|
|
|
43
43
|
hasCollectedDataSinceDeletionRequest: boolean;
|
|
44
44
|
dataDeletionRequestStatus: DataDeleteStatus;
|
|
45
45
|
};
|
|
46
|
-
//# sourceMappingURL=types.d.
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB;aAC/B,MAAM,EAAE,QAAQ;aAChB,QAAQ,EAAE,UAAU;aACpB,WAAW,EAAE,aAAa;aAC1B,OAAO,EAAE,SAAS;aAClB,YAAY,EAAE,eAAe;aAC7B,cAAc,EAAE,iBAAiB;aACjC,OAAO,EAAE,SAAS;aAClB,OAAO,EAAE,SAAS;CACV,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,6BAA6B;aACxC,OAAO,EAAE,IAAI;aACb,OAAO,EAAE,OAAO;CACR,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAClC,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,OAAO,6BAA6B,CAAC,CAAC;AAErF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,OAAO,6BAA6B,CAAC,OAAO,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oCAAoC,EAAE,OAAO,CAAC;IAC9C,yBAAyB,EAAE,gBAAgB,CAAC;CAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,eAAe;IAC7B,cAAc,EAAE,iBAAiB;IACjC,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACV,CAAC;AAQX;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,OAAO;CACR,CAAC","sourcesContent":["/**\n * Status values for data deletion requests from Segment API.\n * Values match Segment API response values exactly.\n */\nexport const DATA_DELETE_STATUSES = {\n Failed: 'FAILED',\n Finished: 'FINISHED',\n Initialized: 'INITIALIZED',\n Invalid: 'INVALID',\n NotSupported: 'NOT_SUPPORTED',\n PartialSuccess: 'PARTIAL_SUCCESS',\n Running: 'RUNNING',\n Unknown: 'UNKNOWN',\n} as const;\n\n/**\n * Type union for data deletion status values.\n */\nexport type DataDeleteStatus =\n (typeof DATA_DELETE_STATUSES)[keyof typeof DATA_DELETE_STATUSES];\n\n/**\n * Response status for deletion regulation operations.\n */\nexport const DATA_DELETE_RESPONSE_STATUSES = {\n Success: 'ok',\n Failure: 'error',\n} as const;\n\n/**\n * Type union for data deletion response status values.\n */\nexport type DataDeleteResponseStatus =\n (typeof DATA_DELETE_RESPONSE_STATUSES)[keyof typeof DATA_DELETE_RESPONSE_STATUSES];\n\n/**\n * Response from creating a data deletion task.\n * The service throws errors on failure, so this type only represents the Success case.\n */\nexport type DeleteRegulationResponse = {\n status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;\n regulateId: string; // Using exact API field name from Segment API response\n};\n\n/**\n * Status information for a data deletion request.\n */\nexport type DeleteRegulationStatus = {\n deletionRequestTimestamp?: number;\n hasCollectedDataSinceDeletionRequest: boolean;\n dataDeletionRequestStatus: DataDeleteStatus;\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-
|
|
3
|
+
"version": "0.0.0-preview-95a403d7b",
|
|
4
4
|
"description": "Controller for managing analytics privacy and GDPR/CCPA data deletion functionality",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|
|
@@ -18,19 +18,12 @@
|
|
|
18
18
|
"files": [
|
|
19
19
|
"dist/"
|
|
20
20
|
],
|
|
21
|
+
"type": "module",
|
|
21
22
|
"sideEffects": false,
|
|
22
|
-
"main": "./dist/index.cjs",
|
|
23
|
-
"types": "./dist/index.d.cts",
|
|
24
23
|
"exports": {
|
|
25
24
|
".": {
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
"default": "./dist/index.mjs"
|
|
29
|
-
},
|
|
30
|
-
"require": {
|
|
31
|
-
"types": "./dist/index.d.cts",
|
|
32
|
-
"default": "./dist/index.cjs"
|
|
33
|
-
}
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"default": "./dist/index.js"
|
|
34
27
|
},
|
|
35
28
|
"./package.json": "./package.json"
|
|
36
29
|
},
|
|
@@ -39,9 +32,11 @@
|
|
|
39
32
|
"registry": "https://registry.npmjs.org/"
|
|
40
33
|
},
|
|
41
34
|
"scripts": {
|
|
42
|
-
"build": "
|
|
43
|
-
"build:all": "
|
|
35
|
+
"build": "tsc --project tsconfig.build.json",
|
|
36
|
+
"build:all": "tsc --build tsconfig.build.json --verbose",
|
|
37
|
+
"build:clean": "yarn build:only-clean && yarn build",
|
|
44
38
|
"build:docs": "typedoc",
|
|
39
|
+
"build:only-clean": "rimraf './dist' './tsconfig.build.tsbuildinfo'",
|
|
45
40
|
"changelog:update": "../../scripts/update-changelog.sh @metamask/analytics-data-regulation-controller",
|
|
46
41
|
"changelog:validate": "../../scripts/validate-changelog.sh @metamask/analytics-data-regulation-controller",
|
|
47
42
|
"lint:tsconfigs": "tsx ../../scripts/lint-tsconfigs/lint-tsconfigs.mts",
|
|
@@ -55,25 +50,26 @@
|
|
|
55
50
|
"test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
|
|
56
51
|
},
|
|
57
52
|
"dependencies": {
|
|
58
|
-
"@metamask/base-controller": "^
|
|
59
|
-
"@metamask/controller-utils": "^
|
|
60
|
-
"@metamask/messenger": "^
|
|
61
|
-
"@metamask/utils": "^
|
|
53
|
+
"@metamask/base-controller": "^10.0.0",
|
|
54
|
+
"@metamask/controller-utils": "^13.0.0",
|
|
55
|
+
"@metamask/messenger": "^3.0.0",
|
|
56
|
+
"@metamask/utils": "^12.0.0"
|
|
62
57
|
},
|
|
63
58
|
"devDependencies": {
|
|
64
59
|
"@metamask/auto-changelog": "^6.1.0",
|
|
65
|
-
"@ts-bridge/cli": "^0.6.4",
|
|
66
60
|
"@types/jest": "^30.0.0",
|
|
61
|
+
"@typescript/native": "npm:typescript@^7.0.2",
|
|
67
62
|
"deepmerge": "^4.2.2",
|
|
68
63
|
"jest": "^30.4.2",
|
|
69
64
|
"nock": "^13.3.1",
|
|
65
|
+
"rimraf": "^5.0.5",
|
|
70
66
|
"ts-jest": "^29.4.11",
|
|
71
67
|
"tsx": "^4.20.5",
|
|
72
68
|
"typedoc": "^0.25.13",
|
|
73
69
|
"typedoc-plugin-missing-exports": "^2.0.0",
|
|
74
|
-
"typescript": "
|
|
70
|
+
"typescript": "npm:@typescript/typescript6@^6.0.2"
|
|
75
71
|
},
|
|
76
72
|
"engines": {
|
|
77
|
-
"node": "^
|
|
73
|
+
"node": "^22.14.0 || ^24"
|
|
78
74
|
}
|
|
79
75
|
}
|
|
@@ -1 +0,0 @@
|
|
|
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,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This file is auto generated.
|
|
3
|
-
* Do not edit manually.
|
|
4
|
-
*/
|
|
5
|
-
import type { AnalyticsDataRegulationController } from "./AnalyticsDataRegulationController.cjs";
|
|
6
|
-
/**
|
|
7
|
-
* Creates a new delete regulation for the user.
|
|
8
|
-
* This is necessary to respect the GDPR and CCPA regulations.
|
|
9
|
-
*
|
|
10
|
-
* @returns Promise containing the status of the request with regulateId
|
|
11
|
-
* @throws Error if analytics ID is missing or if the service call fails
|
|
12
|
-
*/
|
|
13
|
-
export type AnalyticsDataRegulationControllerCreateDataDeletionTaskAction = {
|
|
14
|
-
type: `AnalyticsDataRegulationController:createDataDeletionTask`;
|
|
15
|
-
handler: AnalyticsDataRegulationController['createDataDeletionTask'];
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* Check the latest delete regulation status.
|
|
19
|
-
*
|
|
20
|
-
* @returns Promise containing the timestamp, delete status and collected data flag
|
|
21
|
-
*/
|
|
22
|
-
export type AnalyticsDataRegulationControllerCheckDataDeleteStatusAction = {
|
|
23
|
-
type: `AnalyticsDataRegulationController:checkDataDeleteStatus`;
|
|
24
|
-
handler: AnalyticsDataRegulationController['checkDataDeleteStatus'];
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* Update the data recording flag if needed.
|
|
28
|
-
* This method should be called after tracking events to ensure
|
|
29
|
-
* the data recording flag is properly updated for data deletion workflows.
|
|
30
|
-
*
|
|
31
|
-
* The flag can only be set to `true` (indicating data has been collected).
|
|
32
|
-
* It cannot be explicitly set to `false` - it is only reset to `false` when
|
|
33
|
-
* a new deletion task is created via `createDataDeletionTask`.
|
|
34
|
-
*
|
|
35
|
-
*/
|
|
36
|
-
export type AnalyticsDataRegulationControllerUpdateDataRecordingFlagAction = {
|
|
37
|
-
type: `AnalyticsDataRegulationController:updateDataRecordingFlag`;
|
|
38
|
-
handler: AnalyticsDataRegulationController['updateDataRecordingFlag'];
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Union of all AnalyticsDataRegulationController action types.
|
|
42
|
-
*/
|
|
43
|
-
export type AnalyticsDataRegulationControllerMethodActions = AnalyticsDataRegulationControllerCreateDataDeletionTaskAction | AnalyticsDataRegulationControllerCheckDataDeleteStatusAction | AnalyticsDataRegulationControllerUpdateDataRecordingFlagAction;
|
|
44
|
-
//# sourceMappingURL=AnalyticsDataRegulationController-method-action-types.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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"]}
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _AnalyticsDataRegulationController_analyticsId;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.AnalyticsDataRegulationController = exports.getDefaultAnalyticsDataRegulationControllerState = exports.controllerName = void 0;
|
|
16
|
-
const base_controller_1 = require("@metamask/base-controller");
|
|
17
|
-
const logger_js_1 = require("./logger.cjs");
|
|
18
|
-
const types_js_1 = require("./types.cjs");
|
|
19
|
-
// === GENERAL ===
|
|
20
|
-
/**
|
|
21
|
-
* The name of the {@link AnalyticsDataRegulationController}, used to namespace the
|
|
22
|
-
* controller's actions and events and to namespace the controller's state data
|
|
23
|
-
* when composed with other controllers.
|
|
24
|
-
*/
|
|
25
|
-
exports.controllerName = 'AnalyticsDataRegulationController';
|
|
26
|
-
/**
|
|
27
|
-
* Returns default values for AnalyticsDataRegulationController state.
|
|
28
|
-
*
|
|
29
|
-
* @returns Default state
|
|
30
|
-
*/
|
|
31
|
-
function getDefaultAnalyticsDataRegulationControllerState() {
|
|
32
|
-
return {
|
|
33
|
-
hasCollectedDataSinceDeletionRequest: false,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
exports.getDefaultAnalyticsDataRegulationControllerState = getDefaultAnalyticsDataRegulationControllerState;
|
|
37
|
-
/**
|
|
38
|
-
* The metadata for each property in {@link AnalyticsDataRegulationControllerState}.
|
|
39
|
-
*/
|
|
40
|
-
const analyticsDataRegulationControllerMetadata = {
|
|
41
|
-
hasCollectedDataSinceDeletionRequest: {
|
|
42
|
-
includeInStateLogs: true,
|
|
43
|
-
persist: true,
|
|
44
|
-
includeInDebugSnapshot: true,
|
|
45
|
-
usedInUi: true,
|
|
46
|
-
},
|
|
47
|
-
deleteRegulationId: {
|
|
48
|
-
includeInStateLogs: true,
|
|
49
|
-
persist: true,
|
|
50
|
-
includeInDebugSnapshot: true,
|
|
51
|
-
usedInUi: true,
|
|
52
|
-
},
|
|
53
|
-
deleteRegulationTimestamp: {
|
|
54
|
-
includeInStateLogs: true,
|
|
55
|
-
persist: true,
|
|
56
|
-
includeInDebugSnapshot: true,
|
|
57
|
-
usedInUi: true,
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
// === MESSENGER ===
|
|
61
|
-
const MESSENGER_EXPOSED_METHODS = [
|
|
62
|
-
'createDataDeletionTask',
|
|
63
|
-
'checkDataDeleteStatus',
|
|
64
|
-
'updateDataRecordingFlag',
|
|
65
|
-
];
|
|
66
|
-
/**
|
|
67
|
-
* The AnalyticsDataRegulationController manages analytics privacy and GDPR/CCPA data deletion functionality.
|
|
68
|
-
* It communicates with Segment's Regulations API via a proxy to create and monitor data deletion requests.
|
|
69
|
-
*
|
|
70
|
-
* This controller follows the MetaMask controller pattern and integrates with the
|
|
71
|
-
* messenger system to allow other controllers and components to manage data deletion tasks.
|
|
72
|
-
*/
|
|
73
|
-
class AnalyticsDataRegulationController extends base_controller_1.BaseController {
|
|
74
|
-
/**
|
|
75
|
-
* Constructs an AnalyticsDataRegulationController instance.
|
|
76
|
-
*
|
|
77
|
-
* @param options - Controller options
|
|
78
|
-
* @param options.state - Initial controller state. Use `getDefaultAnalyticsDataRegulationControllerState()` for defaults.
|
|
79
|
-
* @param options.messenger - Messenger used to communicate with BaseController
|
|
80
|
-
* @param options.analyticsId - Analytics ID used for data deletion requests
|
|
81
|
-
*/
|
|
82
|
-
constructor({ state = {}, messenger, analyticsId, }) {
|
|
83
|
-
const initialState = {
|
|
84
|
-
...getDefaultAnalyticsDataRegulationControllerState(),
|
|
85
|
-
...state,
|
|
86
|
-
};
|
|
87
|
-
super({
|
|
88
|
-
name: exports.controllerName,
|
|
89
|
-
metadata: analyticsDataRegulationControllerMetadata,
|
|
90
|
-
state: initialState,
|
|
91
|
-
messenger,
|
|
92
|
-
});
|
|
93
|
-
/**
|
|
94
|
-
* Analytics ID used for data deletion requests.
|
|
95
|
-
*/
|
|
96
|
-
_AnalyticsDataRegulationController_analyticsId.set(this, void 0);
|
|
97
|
-
__classPrivateFieldSet(this, _AnalyticsDataRegulationController_analyticsId, analyticsId, "f");
|
|
98
|
-
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
99
|
-
(0, logger_js_1.projectLogger)('AnalyticsDataRegulationController initialized', {
|
|
100
|
-
hasCollectedDataSinceDeletionRequest: this.state.hasCollectedDataSinceDeletionRequest,
|
|
101
|
-
hasDeleteRegulationId: Boolean(this.state.deleteRegulationId),
|
|
102
|
-
deleteRegulationTimestamp: this.state.deleteRegulationTimestamp,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Creates a new delete regulation for the user.
|
|
107
|
-
* This is necessary to respect the GDPR and CCPA regulations.
|
|
108
|
-
*
|
|
109
|
-
* @returns Promise containing the status of the request with regulateId
|
|
110
|
-
* @throws Error if analytics ID is missing or if the service call fails
|
|
111
|
-
*/
|
|
112
|
-
async createDataDeletionTask() {
|
|
113
|
-
if (!__classPrivateFieldGet(this, _AnalyticsDataRegulationController_analyticsId, "f") || __classPrivateFieldGet(this, _AnalyticsDataRegulationController_analyticsId, "f").trim() === '') {
|
|
114
|
-
const error = new Error('Analytics ID not found. You need to provide a valid analytics ID when initializing the AnalyticsDataRegulationController.');
|
|
115
|
-
(0, logger_js_1.projectLogger)('Analytics Deletion Task Error', error);
|
|
116
|
-
throw error;
|
|
117
|
-
}
|
|
118
|
-
const response = await this.messenger.call('AnalyticsDataRegulationService:createDataDeletionTask', __classPrivateFieldGet(this, _AnalyticsDataRegulationController_analyticsId, "f"));
|
|
119
|
-
const deletionTimestamp = Date.now();
|
|
120
|
-
// Service validates and throws on all errors, so if we reach here, the response
|
|
121
|
-
// is guaranteed to be a success response with regulateId present
|
|
122
|
-
this.update((state) => {
|
|
123
|
-
state.deleteRegulationId = response.regulateId;
|
|
124
|
-
state.deleteRegulationTimestamp = deletionTimestamp;
|
|
125
|
-
state.hasCollectedDataSinceDeletionRequest = false;
|
|
126
|
-
});
|
|
127
|
-
this.messenger.publish(`${exports.controllerName}:dataDeletionTaskCreated`, response);
|
|
128
|
-
return response;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Check the latest delete regulation status.
|
|
132
|
-
*
|
|
133
|
-
* @returns Promise containing the timestamp, delete status and collected data flag
|
|
134
|
-
*/
|
|
135
|
-
async checkDataDeleteStatus() {
|
|
136
|
-
// Capture all state values before async call to ensure consistency
|
|
137
|
-
// in case createDataDeletionTask() completes concurrently
|
|
138
|
-
const { deleteRegulationId } = this.state;
|
|
139
|
-
const { deleteRegulationTimestamp } = this.state;
|
|
140
|
-
const { hasCollectedDataSinceDeletionRequest } = this.state;
|
|
141
|
-
const status = {
|
|
142
|
-
deletionRequestTimestamp: deleteRegulationTimestamp,
|
|
143
|
-
dataDeletionRequestStatus: types_js_1.DATA_DELETE_STATUSES.Unknown,
|
|
144
|
-
hasCollectedDataSinceDeletionRequest,
|
|
145
|
-
};
|
|
146
|
-
if (!deleteRegulationId) {
|
|
147
|
-
return status;
|
|
148
|
-
}
|
|
149
|
-
// Service validates and throws on all errors, so if we reach here, the response
|
|
150
|
-
// is guaranteed to be a success response with dataDeleteStatus present
|
|
151
|
-
const dataDeletionTaskStatus = await this.messenger.call('AnalyticsDataRegulationService:checkDataDeleteStatus', deleteRegulationId);
|
|
152
|
-
status.dataDeletionRequestStatus = dataDeletionTaskStatus.dataDeleteStatus;
|
|
153
|
-
return status;
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Update the data recording flag if needed.
|
|
157
|
-
* This method should be called after tracking events to ensure
|
|
158
|
-
* the data recording flag is properly updated for data deletion workflows.
|
|
159
|
-
*
|
|
160
|
-
* The flag can only be set to `true` (indicating data has been collected).
|
|
161
|
-
* It cannot be explicitly set to `false` - it is only reset to `false` when
|
|
162
|
-
* a new deletion task is created via `createDataDeletionTask`.
|
|
163
|
-
*
|
|
164
|
-
*/
|
|
165
|
-
updateDataRecordingFlag() {
|
|
166
|
-
if (!this.state.hasCollectedDataSinceDeletionRequest) {
|
|
167
|
-
this.update((state) => {
|
|
168
|
-
state.hasCollectedDataSinceDeletionRequest = true;
|
|
169
|
-
});
|
|
170
|
-
this.messenger.publish(`${exports.controllerName}:dataRecordingFlagUpdated`, true);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
exports.AnalyticsDataRegulationController = AnalyticsDataRegulationController;
|
|
175
|
-
_AnalyticsDataRegulationController_analyticsId = new WeakMap();
|
|
176
|
-
//# sourceMappingURL=AnalyticsDataRegulationController.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsDataRegulationController.cjs","sourceRoot":"","sources":["../src/AnalyticsDataRegulationController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAKA,+DAA2D;AAK3D,4CAAmD;AACnD,0CAGoB;AAMpB,kBAAkB;AAElB;;;;GAIG;AACU,QAAA,cAAc,GAAG,mCAAmC,CAAC;AA0BlE;;;;GAIG;AACH,SAAgB,gDAAgD;IAC9D,OAAO;QACL,oCAAoC,EAAE,KAAK;KAC5C,CAAC;AACJ,CAAC;AAJD,4GAIC;AAED;;GAEG;AACH,MAAM,yCAAyC,GAAG;IAChD,oCAAoC,EAAE;QACpC,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,IAAI;QAC5B,QAAQ,EAAE,IAAI;KACf;IACD,kBAAkB,EAAE;QAClB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,IAAI;QAC5B,QAAQ,EAAE,IAAI;KACf;IACD,yBAAyB,EAAE;QACzB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,IAAI;QAC5B,QAAQ,EAAE,IAAI;KACf;CAC8D,CAAC;AAElE,oBAAoB;AAEpB,MAAM,yBAAyB,GAAG;IAChC,wBAAwB;IACxB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AA2FX;;;;;;GAMG;AACH,MAAa,iCAAkC,SAAQ,gCAItD;IAMC;;;;;;;OAOG;IACH,YAAY,EACV,KAAK,GAAG,EAAE,EACV,SAAS,EACT,WAAW,GAC8B;QACzC,MAAM,YAAY,GAA2C;YAC3D,GAAG,gDAAgD,EAAE;YACrD,GAAG,KAAK;SACT,CAAC;QAEF,KAAK,CAAC;YACJ,IAAI,EAAE,sBAAc;YACpB,QAAQ,EAAE,yCAAyC;YACnD,KAAK,EAAE,YAAY;YACnB,SAAS;SACV,CAAC,CAAC;QA5BL;;WAEG;QACM,iEAAqB;QA2B5B,uBAAA,IAAI,kDAAgB,WAAW,MAAA,CAAC;QAEhC,IAAI,CAAC,SAAS,CAAC,4BAA4B,CACzC,IAAI,EACJ,yBAAyB,CAC1B,CAAC;QAEF,IAAA,yBAAG,EAAC,+CAA+C,EAAE;YACnD,oCAAoC,EAClC,IAAI,CAAC,KAAK,CAAC,oCAAoC;YACjD,qBAAqB,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAC7D,yBAAyB,EAAE,IAAI,CAAC,KAAK,CAAC,yBAAyB;SAChE,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,sBAAsB;QAI1B,IAAI,CAAC,uBAAA,IAAI,sDAAa,IAAI,uBAAA,IAAI,sDAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,2HAA2H,CAC5H,CAAC;YACF,IAAA,yBAAG,EAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACxC,uDAAuD,EACvD,uBAAA,IAAI,sDAAa,CAClB,CAAC;QAEF,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrC,gFAAgF;QAChF,iEAAiE;QACjE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC;YAC/C,KAAK,CAAC,yBAAyB,GAAG,iBAAiB,CAAC;YACpD,KAAK,CAAC,oCAAoC,GAAG,KAAK,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,GAAG,sBAAc,0BAA0B,EAC3C,QAAQ,CACT,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,qBAAqB;QACzB,mEAAmE;QACnE,0DAA0D;QAC1D,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1C,MAAM,EAAE,yBAAyB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACjD,MAAM,EAAE,oCAAoC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE5D,MAAM,MAAM,GAA2B;YACrC,wBAAwB,EAAE,yBAAyB;YACnD,yBAAyB,EAAE,+BAAoB,CAAC,OAAO;YACvD,oCAAoC;SACrC,CAAC;QAEF,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,gFAAgF;QAChF,uEAAuE;QACvE,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACtD,sDAAsD,EACtD,kBAAkB,CACnB,CAAC;QAEF,MAAM,CAAC,yBAAyB,GAAG,sBAAsB,CAAC,gBAAgB,CAAC;QAE3E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;OASG;IACH,uBAAuB;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,oCAAoC,EAAE,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,oCAAoC,GAAG,IAAI,CAAC;YACpD,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,GAAG,sBAAc,2BAA2B,EAC5C,IAAI,CACL,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAnJD,8EAmJC","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 +0,0 @@
|
|
|
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,147 +0,0 @@
|
|
|
1
|
-
import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
|
|
2
|
-
import { BaseController } from "@metamask/base-controller";
|
|
3
|
-
import type { Messenger } from "@metamask/messenger";
|
|
4
|
-
import type { AnalyticsDataRegulationControllerMethodActions } from "./AnalyticsDataRegulationController-method-action-types.mjs";
|
|
5
|
-
import type { AnalyticsDataRegulationServiceActions } from "./AnalyticsDataRegulationService.mjs";
|
|
6
|
-
import { DATA_DELETE_RESPONSE_STATUSES } from "./types.mjs";
|
|
7
|
-
import type { DeleteRegulationResponse, DeleteRegulationStatus } from "./types.mjs";
|
|
8
|
-
/**
|
|
9
|
-
* The name of the {@link AnalyticsDataRegulationController}, used to namespace the
|
|
10
|
-
* controller's actions and events and to namespace the controller's state data
|
|
11
|
-
* when composed with other controllers.
|
|
12
|
-
*/
|
|
13
|
-
export declare const controllerName = "AnalyticsDataRegulationController";
|
|
14
|
-
/**
|
|
15
|
-
* Describes the shape of the state object for {@link AnalyticsDataRegulationController}.
|
|
16
|
-
*/
|
|
17
|
-
export type AnalyticsDataRegulationControllerState = {
|
|
18
|
-
/**
|
|
19
|
-
* Indicates if data has been recorded since the last deletion request.
|
|
20
|
-
*/
|
|
21
|
-
hasCollectedDataSinceDeletionRequest: boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Segment's data deletion regulation ID.
|
|
24
|
-
* The ID returned by the Segment delete API which allows checking the status of the deletion request.
|
|
25
|
-
*/
|
|
26
|
-
deleteRegulationId?: string;
|
|
27
|
-
/**
|
|
28
|
-
* Segment's data deletion regulation creation timestamp.
|
|
29
|
-
* The timestamp (in milliseconds since epoch) when the deletion request was created.
|
|
30
|
-
*/
|
|
31
|
-
deleteRegulationTimestamp?: number;
|
|
32
|
-
};
|
|
33
|
-
/**
|
|
34
|
-
* Returns default values for AnalyticsDataRegulationController state.
|
|
35
|
-
*
|
|
36
|
-
* @returns Default state
|
|
37
|
-
*/
|
|
38
|
-
export declare function getDefaultAnalyticsDataRegulationControllerState(): AnalyticsDataRegulationControllerState;
|
|
39
|
-
/**
|
|
40
|
-
* Returns the state of the {@link AnalyticsDataRegulationController}.
|
|
41
|
-
*/
|
|
42
|
-
export type AnalyticsDataRegulationControllerGetStateAction = ControllerGetStateAction<typeof controllerName, AnalyticsDataRegulationControllerState>;
|
|
43
|
-
/**
|
|
44
|
-
* Actions that {@link AnalyticsDataRegulationControllerMessenger} exposes to other consumers.
|
|
45
|
-
*/
|
|
46
|
-
export type AnalyticsDataRegulationControllerActions = AnalyticsDataRegulationControllerGetStateAction | AnalyticsDataRegulationControllerMethodActions;
|
|
47
|
-
/**
|
|
48
|
-
* Actions from other messengers that {@link AnalyticsDataRegulationControllerMessenger} calls.
|
|
49
|
-
*/
|
|
50
|
-
type AllowedActions = AnalyticsDataRegulationServiceActions;
|
|
51
|
-
/**
|
|
52
|
-
* Event emitted when a data deletion task is created.
|
|
53
|
-
*/
|
|
54
|
-
export type DataDeletionTaskCreatedEvent = {
|
|
55
|
-
type: `${typeof controllerName}:dataDeletionTaskCreated`;
|
|
56
|
-
payload: [DeleteRegulationResponse];
|
|
57
|
-
};
|
|
58
|
-
/**
|
|
59
|
-
* Event emitted when the data recording flag is updated.
|
|
60
|
-
*/
|
|
61
|
-
export type DataRecordingFlagUpdatedEvent = {
|
|
62
|
-
type: `${typeof controllerName}:dataRecordingFlagUpdated`;
|
|
63
|
-
payload: [boolean];
|
|
64
|
-
};
|
|
65
|
-
/**
|
|
66
|
-
* Event emitted when the state of the {@link AnalyticsDataRegulationController} changes.
|
|
67
|
-
*/
|
|
68
|
-
export type AnalyticsDataRegulationControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, AnalyticsDataRegulationControllerState>;
|
|
69
|
-
/**
|
|
70
|
-
* Events that {@link AnalyticsDataRegulationControllerMessenger} exposes to other consumers.
|
|
71
|
-
*/
|
|
72
|
-
export type AnalyticsDataRegulationControllerEvents = AnalyticsDataRegulationControllerStateChangeEvent | DataDeletionTaskCreatedEvent | DataRecordingFlagUpdatedEvent;
|
|
73
|
-
/**
|
|
74
|
-
* Events from other messengers that {@link AnalyticsDataRegulationControllerMessenger} subscribes to.
|
|
75
|
-
*/
|
|
76
|
-
type AllowedEvents = never;
|
|
77
|
-
/**
|
|
78
|
-
* The messenger restricted to actions and events accessed by
|
|
79
|
-
* {@link AnalyticsDataRegulationController}.
|
|
80
|
-
*/
|
|
81
|
-
export type AnalyticsDataRegulationControllerMessenger = Messenger<typeof controllerName, AnalyticsDataRegulationControllerActions | AllowedActions, AnalyticsDataRegulationControllerEvents | AllowedEvents>;
|
|
82
|
-
/**
|
|
83
|
-
* The options that AnalyticsDataRegulationController takes.
|
|
84
|
-
*/
|
|
85
|
-
export type AnalyticsDataRegulationControllerOptions = {
|
|
86
|
-
/**
|
|
87
|
-
* Initial controller state.
|
|
88
|
-
*/
|
|
89
|
-
state?: Partial<AnalyticsDataRegulationControllerState>;
|
|
90
|
-
/**
|
|
91
|
-
* Messenger used to communicate with BaseController and other controllers.
|
|
92
|
-
*/
|
|
93
|
-
messenger: AnalyticsDataRegulationControllerMessenger;
|
|
94
|
-
/**
|
|
95
|
-
* Analytics ID used for data deletion requests.
|
|
96
|
-
*/
|
|
97
|
-
analyticsId: string;
|
|
98
|
-
};
|
|
99
|
-
/**
|
|
100
|
-
* The AnalyticsDataRegulationController manages analytics privacy and GDPR/CCPA data deletion functionality.
|
|
101
|
-
* It communicates with Segment's Regulations API via a proxy to create and monitor data deletion requests.
|
|
102
|
-
*
|
|
103
|
-
* This controller follows the MetaMask controller pattern and integrates with the
|
|
104
|
-
* messenger system to allow other controllers and components to manage data deletion tasks.
|
|
105
|
-
*/
|
|
106
|
-
export declare class AnalyticsDataRegulationController extends BaseController<typeof controllerName, AnalyticsDataRegulationControllerState, AnalyticsDataRegulationControllerMessenger> {
|
|
107
|
-
#private;
|
|
108
|
-
/**
|
|
109
|
-
* Constructs an AnalyticsDataRegulationController instance.
|
|
110
|
-
*
|
|
111
|
-
* @param options - Controller options
|
|
112
|
-
* @param options.state - Initial controller state. Use `getDefaultAnalyticsDataRegulationControllerState()` for defaults.
|
|
113
|
-
* @param options.messenger - Messenger used to communicate with BaseController
|
|
114
|
-
* @param options.analyticsId - Analytics ID used for data deletion requests
|
|
115
|
-
*/
|
|
116
|
-
constructor({ state, messenger, analyticsId, }: AnalyticsDataRegulationControllerOptions);
|
|
117
|
-
/**
|
|
118
|
-
* Creates a new delete regulation for the user.
|
|
119
|
-
* This is necessary to respect the GDPR and CCPA regulations.
|
|
120
|
-
*
|
|
121
|
-
* @returns Promise containing the status of the request with regulateId
|
|
122
|
-
* @throws Error if analytics ID is missing or if the service call fails
|
|
123
|
-
*/
|
|
124
|
-
createDataDeletionTask(): Promise<{
|
|
125
|
-
status: typeof DATA_DELETE_RESPONSE_STATUSES.Success;
|
|
126
|
-
regulateId: string;
|
|
127
|
-
}>;
|
|
128
|
-
/**
|
|
129
|
-
* Check the latest delete regulation status.
|
|
130
|
-
*
|
|
131
|
-
* @returns Promise containing the timestamp, delete status and collected data flag
|
|
132
|
-
*/
|
|
133
|
-
checkDataDeleteStatus(): Promise<DeleteRegulationStatus>;
|
|
134
|
-
/**
|
|
135
|
-
* Update the data recording flag if needed.
|
|
136
|
-
* This method should be called after tracking events to ensure
|
|
137
|
-
* the data recording flag is properly updated for data deletion workflows.
|
|
138
|
-
*
|
|
139
|
-
* The flag can only be set to `true` (indicating data has been collected).
|
|
140
|
-
* It cannot be explicitly set to `false` - it is only reset to `false` when
|
|
141
|
-
* a new deletion task is created via `createDataDeletionTask`.
|
|
142
|
-
*
|
|
143
|
-
*/
|
|
144
|
-
updateDataRecordingFlag(): void;
|
|
145
|
-
}
|
|
146
|
-
export {};
|
|
147
|
-
//# sourceMappingURL=AnalyticsDataRegulationController.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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"]}
|