@opentermsarchive/engine 0.20.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -184,7 +184,7 @@ npx ota track --services "<service_id>" ["<service_id>"...]
184
184
  ##### Track specific terms of specific services
185
185
 
186
186
  ```sh
187
- npx ota track --services "<service_id>" ["<service_id>"...] --termsTypes "<terms_type>" ["<terms_type>"...]
187
+ npx ota track --services "<service_id>" ["<service_id>"...] --terms-types "<terms_type>" ["<terms_type>"...]
188
188
  ```
189
189
 
190
190
  ##### Track documents four times a day
@@ -196,7 +196,7 @@ npx ota track --schedule
196
196
  #### `ota validate`
197
197
 
198
198
  ```sh
199
- npx ota validate [--services <service_id>...] [--termsTypes <terms_type>...]
199
+ npx ota validate [--services <service_id>...] [--terms-types <terms_type>...]
200
200
  ```
201
201
 
202
202
  Check that all declarations allow recording a snapshot and a version properly.
@@ -206,7 +206,7 @@ If one or several `<service_id>` are provided, check only those services.
206
206
  ##### Validate schema only
207
207
 
208
208
  ```sh
209
- npx ota validate --schema-only [--services <service_id>...] [--termsTypes <terms_type>...]
209
+ npx ota validate --schema-only [--services <service_id>...] [--terms-types <terms_type>...]
210
210
  ```
211
211
 
212
212
  Check that all declarations are readable by the engine.
@@ -227,6 +227,38 @@ Automatically correct formatting mistakes and ensure that all declarations are s
227
227
 
228
228
  If one or several `<service_id>` are provided, check only those services.
229
229
 
230
+ #### `ota dataset`
231
+
232
+ Export the versions dataset into a ZIP file and publish it to GitHub releases.
233
+
234
+ The dataset title and the URL of the versions repository are defined in the [configuration](#configuring).
235
+
236
+ To export the dataset into a local ZIP file:
237
+
238
+ ```sh
239
+ npx ota dataset [--file <filename>]
240
+ ```
241
+
242
+ To export the dataset into a ZIP file and publish it on GitHub releases:
243
+
244
+ ```sh
245
+ GITHUB_TOKEN=ghp_XXXXXXXXX npx ota dataset --publish
246
+ ```
247
+
248
+ The `GITHUB_TOKEN` can also be defined in a [`.env` file](#environment-variables).
249
+
250
+ To export, publish the dataset and remove the local copy that was created after it has been uploaded:
251
+
252
+ ```sh
253
+ GITHUB_TOKEN=ghp_XXXXXXXXX npx ota dataset --publish --remove-local-copy
254
+ ```
255
+
256
+ To schedule export, publishing and local copy removal:
257
+
258
+ ```sh
259
+ GITHUB_TOKEN=ghp_XXXXXXXXX npx ota dataset --schedule --publish --remove-local-copy
260
+ ```
261
+
230
262
  ### API
231
263
 
232
264
  Once added as a dependency, the engine exposes a JavaScript API that can be called in your own code. The following modules are available.
@@ -277,10 +309,6 @@ import pageDeclaration from '@opentermsarchive/engine/page-declaration';
277
309
 
278
310
  The `PageDeclaration` format is defined [in source code](./src/archivist/services/pageDeclaration.js).
279
311
 
280
- ### Dataset generation
281
-
282
- See the [`dataset` script documentation](./scripts/dataset/README.md).
283
-
284
312
  ## Configuring
285
313
 
286
314
  ### Configuration file
@@ -0,0 +1,33 @@
1
+ #! /usr/bin/env node
2
+ import './env.js';
3
+
4
+ import { program } from 'commander';
5
+ import cron from 'croner';
6
+
7
+ import { release } from '../scripts/dataset/index.js';
8
+ import logger from '../src/logger/index.js';
9
+
10
+ program
11
+ .name('ota dataset')
12
+ .description('Export the versions dataset into a ZIP file and optionally publish it to GitHub releases')
13
+ .option('-f, --file <filename>', 'file name of the generated dataset')
14
+ .option('-p, --publish', 'publish dataset to GitHub releases on versions repository. Mandatory authentication to GitHub is provided through the `GITHUB_TOKEN` environment variable')
15
+ .option('-r, --remove-local-copy', 'remove local copy of dataset after publishing. Works only in combination with --publish option')
16
+ .option('--schedule', 'schedule automatic dataset generation');
17
+
18
+ const { schedule, publish, removeLocalCopy, file: fileName } = program.parse().opts();
19
+
20
+ const options = {
21
+ fileName,
22
+ shouldPublish: publish,
23
+ shouldRemoveLocalCopy: removeLocalCopy,
24
+ };
25
+
26
+ if (!schedule) {
27
+ await release(options);
28
+ } else {
29
+ logger.info('The scheduler is running…');
30
+ logger.info('Dataset will be published every Monday at 08:30 in the timezone of this machine');
31
+
32
+ cron('30 8 * * MON', () => release(options));
33
+ }
package/bin/ota-track.js CHANGED
@@ -14,7 +14,7 @@ program
14
14
  .name('ota track')
15
15
  .description('Retrieve declared documents, record snapshots, extract versions and publish the resulting records')
16
16
  .option('-s, --services [serviceId...]', 'service IDs of services to track')
17
- .option('-t, --termsType [termsType...]', 'terms types to track')
17
+ .option('-t, --terms-types [termsType...]', 'terms types to track')
18
18
  .option('-r, --refilter-only', 'refilter existing snapshots with latest declarations and engine, without recording new snapshots')
19
19
  .option('--schedule', 'schedule automatic document tracking');
20
20
 
@@ -21,7 +21,7 @@ program
21
21
  .name('ota validate')
22
22
  .description('Run a series of tests to check the validity of document declarations')
23
23
  .option('-s, --services [serviceId...]', 'service IDs of services to validate')
24
- .option('-t, --termsTypes [termsType...]', 'terms types to validate')
24
+ .option('-t, --terms-types [termsType...]', 'terms types to validate')
25
25
  .option('-m, --modified', 'target only services modified in the current git branch')
26
26
  .option('-o, --schema-only', 'much faster check of declarations, but does not check that the documents are actually accessible');
27
27
 
package/bin/ota.js CHANGED
@@ -13,4 +13,5 @@ program
13
13
  .command('track', 'Track the current terms of services according to provided declarations')
14
14
  .command('validate', 'Run a series of tests to check the validity of document declarations')
15
15
  .command('lint', 'Check format and stylistic errors in declarations and auto fix them')
16
+ .command('dataset', 'Export the versions dataset into a ZIP file and optionally publish it to GitHub releases')
16
17
  .parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentermsarchive/engine",
3
- "version": "0.20.0",
3
+ "version": "0.22.0",
4
4
  "description": "Tracks and makes visible changes to the terms of online services",
5
5
  "homepage": "https://github.com/ambanum/OpenTermsArchive#readme",
6
6
  "bugs": {
@@ -30,8 +30,8 @@
30
30
  ".eslintrc.yaml"
31
31
  ],
32
32
  "scripts": {
33
- "dataset:generate": "node scripts/dataset/main.js",
34
- "dataset:release": "node scripts/dataset/main.js --publish --remove-local-copy",
33
+ "dataset:generate": "node bin/ota.js dataset",
34
+ "dataset:release": "node bin/ota.js dataset --publish --remove-local-copy",
35
35
  "dataset:scheduler": "npm run dataset:release -- --schedule",
36
36
  "declarations:lint": "node bin/ota.js lint",
37
37
  "declarations:validate": "node bin/ota.js validate",
@@ -100,6 +100,9 @@
100
100
  "sinon": "^12.0.1",
101
101
  "sinon-chai": "^3.7.0"
102
102
  },
103
+ "peerDependencies": {
104
+ "@opentermsarchive/terms-types": "~0.1.1"
105
+ },
103
106
  "engines": {
104
107
  "node": ">=16.0.0"
105
108
  }
@@ -1,7 +1,8 @@
1
1
  import fsApi from 'fs';
2
2
  import path from 'path';
3
- import { fileURLToPath, pathToFileURL } from 'url';
3
+ import { pathToFileURL } from 'url';
4
4
 
5
+ import TERMS_TYPES from '@opentermsarchive/terms-types';
5
6
  import config from 'config';
6
7
 
7
8
  import DocumentDeclaration from './documentDeclaration.js';
@@ -9,10 +10,9 @@ import PageDeclaration from './pageDeclaration.js';
9
10
  import Service from './service.js';
10
11
 
11
12
  const fs = fsApi.promises;
12
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
13
13
  const declarationsPath = path.resolve(process.cwd(), config.get('services.declarationsPath'));
14
14
 
15
- export const DOCUMENT_TYPES = JSON.parse(fsApi.readFileSync(path.resolve(__dirname, './documentTypes.json')));
15
+ export const DOCUMENT_TYPES = TERMS_TYPES;
16
16
 
17
17
  export async function load(servicesIdsToLoad = []) {
18
18
  let servicesIds = await getDeclaredServicesIds();
package/src/index.js CHANGED
@@ -6,7 +6,7 @@ import logger from './logger/index.js';
6
6
  import Notifier from './notifier/index.js';
7
7
  import Tracker from './tracker/index.js';
8
8
 
9
- export default async function track({ services = [], termsType: documentTypes, refilterOnly, schedule }) {
9
+ export default async function track({ services = [], termsTypes: documentTypes, refilterOnly, schedule }) {
10
10
  const archivist = new Archivist({ recorderConfig: config.get('recorder') });
11
11
 
12
12
  archivist.attach(logger);
@@ -1,37 +0,0 @@
1
- # Dataset release
2
-
3
- Export the versions dataset into a ZIP file and publish it to GitHub releases.
4
-
5
- ## Configuring
6
-
7
- You can change the configuration in the appropriate config file in the `config` folder. See the [main README](../../README.md#configuring) for documentation on using the configuration file.
8
-
9
- ## Running
10
-
11
- To export the dataset into a local ZIP file:
12
-
13
- ```sh
14
- node scripts/dataset/main.js [$filename]
15
- ```
16
-
17
- To export the dataset into a ZIP file and publish it on GitHub releases:
18
-
19
- ```sh
20
- node scripts/dataset/main.js --publish
21
- ```
22
-
23
- To export, publish the dataset and remove the local copy that was created after it has been uploaded:
24
-
25
- ```sh
26
- node scripts/dataset/main.js --publish --remove-local-copy
27
- ```
28
-
29
- To schedule export, publishing and local copy removal:
30
-
31
- ```sh
32
- node scripts/dataset/main.js --schedule --publish --remove-local-copy
33
- ```
34
-
35
- ## Adding renaming rules
36
-
37
- See the [renamer module documentation](../utils/renamer/README.md).
@@ -1,25 +0,0 @@
1
- import cron from 'croner';
2
-
3
- import logger from './logger/index.js';
4
-
5
- import { release } from './index.js';
6
-
7
- const args = process.argv.slice(2);
8
- const argsWithoutOptions = args.filter(arg => !arg.startsWith('--'));
9
- const [fileName] = argsWithoutOptions;
10
- const shouldSchedule = args.includes('--schedule');
11
-
12
- const options = {
13
- fileName,
14
- shouldPublish: args.includes('--publish'),
15
- shouldRemoveLocalCopy: args.includes('--remove-local-copy'),
16
- };
17
-
18
- if (!shouldSchedule) {
19
- release(options);
20
- } else {
21
- logger.info('The scheduler is running…');
22
- logger.info('Dataset will be published at 08:30 on every Monday');
23
-
24
- cron('30 8 * * MON', () => release(options));
25
- }
@@ -1,386 +0,0 @@
1
- {
2
- "Terms of Service": {
3
- "commitment": {
4
- "writer": "service provider",
5
- "audience": "end user",
6
- "object": "end user’s service usage"
7
- }
8
- },
9
- "Privacy Policy": {
10
- "commitment": {
11
- "writer": "service provider",
12
- "audience": "end user",
13
- "object": "end user’s personal data"
14
- }
15
- },
16
- "Imprint": {
17
- "commitment": {
18
- "writer": "service provider",
19
- "audience": "everyone",
20
- "object": "identification of content author and hosting service for official inquiries"
21
- }
22
- },
23
- "Trackers Policy": {
24
- "commitment": {
25
- "writer": "service provider",
26
- "audience": "end user",
27
- "object": "all tracking technologies, including cookies, session storage, fingerprints…"
28
- }
29
- },
30
- "Parent Organization Terms": {
31
- "commitment": {
32
- "writer": "parent organization",
33
- "audience": "end user",
34
- "object": "products and services usage"
35
- }
36
- },
37
- "Parent Organization Privacy Policy": {
38
- "commitment": {
39
- "writer": "parent organization",
40
- "audience": "end user",
41
- "object": "personal data"
42
- }
43
- },
44
- "Developer Terms": {
45
- "commitment": {
46
- "writer": "service provider",
47
- "audience": "developer",
48
- "object": "APIs and programmatic access to content"
49
- }
50
- },
51
- "Community Guidelines": {
52
- "commitment": {
53
- "writer": "service provider",
54
- "audience": "end user",
55
- "object": "public behaviour"
56
- }
57
- },
58
- "Community Guidelines - Self-harm": {
59
- "commitment": {
60
- "writer": "service provider",
61
- "audience": "content-publishing user",
62
- "object": "content depicting, encouraging or glorifying suicide, eating disorders, self-harm"
63
- }
64
- },
65
- "Community Guidelines - Hate Speech": {
66
- "commitment": {
67
- "writer": "service provider",
68
- "audience": "content-publishing user",
69
- "object": "content or behavior that threatens, incites violence against, dehumanizes an individual or a group on the basis of protected attributes such as race, ethnicity, gender, sexual orientation…"
70
- }
71
- },
72
- "Community Guidelines - Child Exploitation": {
73
- "commitment": {
74
- "writer": "service provider",
75
- "audience": "content-publishing user",
76
- "object": "material that features or promotes the exploitation of minors (sexual, emotional…)"
77
- }
78
- },
79
- "Community Guidelines - Violence Incitement": {
80
- "commitment": {
81
- "writer": "service provider",
82
- "audience": "content-publishing user",
83
- "object": "content threatening, inciting or facilitating offline violence"
84
- }
85
- },
86
- "Community Guidelines - Violent Organizations": {
87
- "commitment": {
88
- "writer": "service provider",
89
- "audience": "end user",
90
- "object": "accounts for individuals or groups that engage in or promote offline violence or organized criminal activity"
91
- }
92
- },
93
- "Community Guidelines - Spam": {
94
- "commitment": {
95
- "writer": "service provider",
96
- "audience": "content-publishing user",
97
- "object": "untargeted, irrelevant, obviously unwanted, unauthorized commercial or promotional content"
98
- }
99
- },
100
- "Community Guidelines - Platform Manipulation": {
101
- "commitment": {
102
- "writer": "service provider",
103
- "audience": "everyone",
104
- "object": "behaviour aimed at artificially amplifying or suppressing content visibility (fake engagement, inauthentic behaviour…)"
105
- }
106
- },
107
- "Community Guidelines - Regulated Goods": {
108
- "commitment": {
109
- "writer": "service provider",
110
- "audience": "everyone",
111
- "object": "selling, buying, or facilitating transactions in illegal or regulated goods or services (drugs, medication, weapons…)"
112
- }
113
- },
114
- "Community Guidelines - Harassment": {
115
- "commitment": {
116
- "writer": "service provider",
117
- "audience": "content-publishing user",
118
- "object": "content containing or engaging others to use abusive language, doxxing, intimidation against an individual"
119
- }
120
- },
121
- "Community Guidelines - Privacy Violations": {
122
- "commitment": {
123
- "writer": "service provider",
124
- "audience": "content-publishing user",
125
- "object": "content containing or inciting sharing people's private information or media without their permission"
126
- }
127
- },
128
- "Community Guidelines - Misinformation": {
129
- "commitment": {
130
- "writer": "service provider",
131
- "audience": "content-publishing user",
132
- "object": "demonstrably false or misleading information which may lead to physical harm, electoral processes disruption or other systemic harms"
133
- }
134
- },
135
- "Community Guidelines - Adult Nudity": {
136
- "commitment": {
137
- "writer": "service provider",
138
- "audience": "content-publishing user",
139
- "object": "consensually produced and distributed media containing adult genitalia or nipples"
140
- }
141
- },
142
- "Community Guidelines - Sexual Solicitation": {
143
- "commitment": {
144
- "writer": "service provider",
145
- "audience": "end user",
146
- "object": "expressions of desire, requests for a romantic or sexual relationship"
147
- }
148
- },
149
- "Community Guidelines - Intellectual Property": {
150
- "commitment": {
151
- "writer": "service provider",
152
- "audience": "content-publishing user",
153
- "object": "content containing copyrighted works"
154
- }
155
- },
156
- "Deceased Users": {
157
- "commitment": {
158
- "writer": "service provider",
159
- "audience": "relatives of a deceased user",
160
- "object": "handling of information of a deceased individual"
161
- }
162
- },
163
- "Acceptable Use Policy": {
164
- "commitment": {
165
- "writer": "service provider",
166
- "audience": "end user",
167
- "object": "acceptable and unacceptable usage"
168
- }
169
- },
170
- "Restricted Use Policy": {
171
- "commitment": {
172
- "writer": "service provider",
173
- "audience": "end user",
174
- "object": "restrictions on specific usage"
175
- }
176
- },
177
- "Commercial Terms": {
178
- "commitment": {
179
- "writer": "service provider",
180
- "audience": "commercial partners, content creators in a platform",
181
- "object": "business or commercial usage"
182
- }
183
- },
184
- "Copyright Claims Policy": {
185
- "commitment": {
186
- "writer": "service provider",
187
- "audience": "copyrighted works rights holders",
188
- "object": "how copyright complaints (DMCA…) will be handled"
189
- }
190
- },
191
- "Law Enforcement Guidelines": {
192
- "commitment": {
193
- "writer": "service provider",
194
- "audience": "law enforcement authorities",
195
- "object": "account records access"
196
- }
197
- },
198
- "Human Rights Policy": {
199
- "commitment": {
200
- "writer": "service provider",
201
- "audience": "shareholders",
202
- "object": "human rights"
203
- }
204
- },
205
- "In-App Purchases Policy": {
206
- "commitment": {
207
- "writer": "service provider",
208
- "audience": "end user",
209
- "object": "in-app and other virtual goods purchase usage"
210
- }
211
- },
212
- "Review Guidelines": {
213
- "commitment": {
214
- "writer": "service provider",
215
- "audience": "developer",
216
- "object": "review process of provided content"
217
- }
218
- },
219
- "Brand Guidelines": {
220
- "commitment": {
221
- "writer": "service provider",
222
- "audience": "developer",
223
- "object": "usage of the service provider’s brand"
224
- }
225
- },
226
- "Quality Guidelines": {
227
- "commitment": {
228
- "writer": "service provider",
229
- "audience": "end user",
230
- "object": "quality of content produced by means of the service"
231
- }
232
- },
233
- "Data Controller Agreement": {
234
- "commitment": {
235
- "writer": "service provider",
236
- "audience": "data controllers (in the sense of GDPR)",
237
- "object": "end user personal data"
238
- }
239
- },
240
- "Data Processor Agreement": {
241
- "commitment": {
242
- "writer": "service provider",
243
- "audience": "data controllers (in the sense of GDPR)",
244
- "object": "status of data processor (in the sense of GDPR) for the service provider"
245
- }
246
- },
247
- "User Consent Policy": {
248
- "commitment": {
249
- "writer": "service provider",
250
- "audience": "data controllers (in the sense of GDPR)",
251
- "object": "user consent collection and storage"
252
- }
253
- },
254
- "Closed Captioning Policy": {
255
- "commitment": {
256
- "writer": "service provider",
257
- "audience": "end user",
258
- "object": "closed captioning on streamed content"
259
- }
260
- },
261
- "Seller Warranty": {
262
- "commitment": {
263
- "writer": "service provider",
264
- "audience": "end user",
265
- "object": "protection of end users that act as sellers"
266
- }
267
- },
268
- "Single Sign-On Policy": {
269
- "commitment": {
270
- "writer": "service provider",
271
- "audience": "end user",
272
- "object": "connecting user account to other services"
273
- }
274
- },
275
- "Vulnerability Disclosure Policy": {
276
- "commitment": {
277
- "writer": "service provider",
278
- "audience": "vulnerability reporter",
279
- "object": "how to report a security vulnerability or issue"
280
- }
281
- },
282
- "Live Policy": {
283
- "commitment": {
284
- "writer": "service provider",
285
- "audience": "end user",
286
- "object": "end user’s live service usage"
287
- }
288
- },
289
- "Ad Publishing Policy": {
290
- "commitment": {
291
- "writer": "service provider",
292
- "audience": "end user",
293
- "object": "acceptable and unacceptable usage"
294
- }
295
- },
296
- "Complaints Policy": {
297
- "commitment": {
298
- "writer": "service provider",
299
- "audience": "anyone",
300
- "object": "how generic complaints will be handled"
301
- }
302
- },
303
- "Conditions of Carriage": {
304
- "commitment": {
305
- "writer": "transportation operator (airline, railway, bus…)",
306
- "audience": "passenger",
307
- "object": "benefits and limitations associated with the transportation being provided"
308
- }
309
- },
310
- "General Conditions of Sale": {
311
- "commitment": {
312
- "writer": "paid-for goods or service provider",
313
- "audience": "buyer",
314
- "object": "warranty, delivery, return of goods or services bought through a monetary transaction"
315
- }
316
- },
317
- "Marketplace Buyers Conditions": {
318
- "commitment": {
319
- "writer": "online marketplace",
320
- "audience": "buyer",
321
- "object": "buying through a monetary transaction goods or services offered by sellers other than the marketplace itself"
322
- }
323
- },
324
- "Marketplace Sellers Conditions": {
325
- "commitment": {
326
- "writer": "online marketplace",
327
- "audience": "seller",
328
- "object": "selling through a monetary transaction goods or services to buyers other than the marketplace itself"
329
- }
330
- },
331
- "Ranking Parameters Description": {
332
- "commitment": {
333
- "writer": "search engine or intermediation service provider",
334
- "audience": "users presented with a list of ranked results, or contributors of results that are ranked",
335
- "object": "parameters determining ranking and the reasons for their relative importance"
336
- },
337
- "references": {
338
- "Open Terms Archive Discussion": "https://github.com/ambanum/OpenTermsArchive/discussions/902",
339
- "Article 5 of P2B Regulation 2019/1150": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=celex%3A32019R1150#d1e868-57-1",
340
- "Article 6a of Directive 2011/83/EU": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A02011L0083-20220528#tocId12",
341
- "Point (m) of Article 2(1) of Directive 2005/29/EC": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005L0029-20220528#tocId5"
342
- }
343
- },
344
- "Premium Partner Conditions": {
345
- "commitment": {
346
- "writer": "intermediation service provider",
347
- "audience": "sellers of goods or services",
348
- "object": "eligibility criteria, limitations and benefits of a privileged seller status programme"
349
- },
350
- "references": {
351
- "Open Terms Archive Discussion": "https://github.com/ambanum/OpenTermsArchive/discussions/922"
352
- }
353
- },
354
- "Platform to Business Notice": {
355
- "commitment": {
356
- "writer": "search engine or intermediation service provider",
357
- "audience": "business user",
358
- "object": "complaints handling, mediation, transparency and other rights and information mandated by the P2B regulation"
359
- },
360
- "references": {
361
- "Open Terms Archive Discussion": "https://github.com/ambanum/OpenTermsArchive/discussions/940",
362
- "P2B Regulation 2019/1150": "https://eur-lex.europa.eu/eli/reg/2019/1150/oj"
363
- }
364
- },
365
- "Business Mediation Policy": {
366
- "commitment": {
367
- "writer": "intermediation service provider",
368
- "audience": "business users",
369
- "object": "eligibility and process of mediation after internal complaints handling failed"
370
- },
371
- "references": {
372
- "Open Terms Archive discussion": "https://github.com/ambanum/OpenTermsArchive/discussions/933",
373
- "P2B Regulation 2019/1150, Article 12": "https://eur-lex.europa.eu/eli/reg/2019/1150/oj#d1e1148-57-1"
374
- }
375
- },
376
- "Business Privacy Policy": {
377
- "commitment": {
378
- "writer": "intermediation service provider",
379
- "audience": "business user",
380
- "object": "personal data of business users and of people acting on their behalf"
381
- },
382
- "references": {
383
- "Open Terms Archive discussion": "https://github.com/ambanum/OpenTermsArchive/discussions/923"
384
- }
385
- }
386
- }