@twin.org/dataspace-data-plane-service 0.0.3-next.17 → 0.0.3-next.19
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 +4 -54
- package/dist/es/dataspaceDataPlaneService.js +3 -7
- package/dist/es/dataspaceDataPlaneService.js.map +1 -1
- package/docs/changelog.md +34 -0
- package/docs/examples.md +130 -1
- package/docs/open-api/spec.json +22 -155
- package/docs/reference/interfaces/IDataspaceDataPlaneServiceConfig.md +0 -12
- package/docs/reference/interfaces/IDataspaceDataPlaneServiceConstructorOptions.md +0 -48
- package/locales/en.json +0 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Dataspace Data Plane Service
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This package processes activities and data requests while enforcing transfer and policy constraints in the data plane. It coordinates transfer state checks, app delegation, and activity tracking so downstream consumers receive policy-aligned data responses.
|
|
4
|
+
|
|
5
|
+
Its runtime behaviour is designed for integration with control plane managed transfers and shared storage-backed process state.
|
|
4
6
|
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
@@ -8,58 +10,6 @@ Dataspace Data Plane contract implementation and REST endpoint definitions.
|
|
|
8
10
|
npm install @twin.org/dataspace-data-plane-service
|
|
9
11
|
```
|
|
10
12
|
|
|
11
|
-
## Overview
|
|
12
|
-
|
|
13
|
-
The Data Plane handles data access requests, delegating to Dataspace Apps for actual data retrieval while enforcing policies from transfer agreements.
|
|
14
|
-
|
|
15
|
-
### Key Features
|
|
16
|
-
|
|
17
|
-
- **consumerPid Flow**: Supports `consumerPid` parameter for transfer-based access
|
|
18
|
-
- **Shared Storage Integration**: Reads `TransferProcessEntity` from Control Plane storage
|
|
19
|
-
- **Policy Enforcement**: Applies ODRL prohibitions and constraints from agreements
|
|
20
|
-
- **App Delegation**: Delegates data retrieval to registered Dataspace Apps
|
|
21
|
-
- **Backward Compatibility**: Still supports direct `datasetId` parameter (deprecated)
|
|
22
|
-
|
|
23
|
-
### Constructor Options
|
|
24
|
-
|
|
25
|
-
- `loggingComponentType` (default: `logging`) - Logging component type
|
|
26
|
-
- `backgroundTaskComponentType` (default: `background-task`) - Background task component
|
|
27
|
-
- `taskSchedulerComponentType` (default: `task-scheduler`) - Task scheduler component
|
|
28
|
-
- `activityLogEntityStorageType` (default: `activity-log-details`) - Activity log storage
|
|
29
|
-
- `activityTaskEntityStorageType` (default: `activity-task`) - Activity task storage
|
|
30
|
-
- `transferProcessEntityStorageType` (required) - Entity storage for reading transfer processes
|
|
31
|
-
- `trustComponentType` (default: `trust`) - Trust validation component
|
|
32
|
-
|
|
33
|
-
### consumerPid Flow
|
|
34
|
-
|
|
35
|
-
When `consumerPid` is provided, the Data Plane:
|
|
36
|
-
|
|
37
|
-
1. Validates the transfer token from Authorization header
|
|
38
|
-
2. Looks up `TransferProcessEntity` by `consumerPid`
|
|
39
|
-
3. Validates transfer state is `STARTED`
|
|
40
|
-
4. Extracts `datasetId` from the transfer process
|
|
41
|
-
5. Finds the App registered for that dataset
|
|
42
|
-
6. Delegates query to the App
|
|
43
|
-
7. Applies policy filters from the agreement
|
|
44
|
-
8. Returns filtered results
|
|
45
|
-
|
|
46
|
-
### Policy Enforcement
|
|
47
|
-
|
|
48
|
-
The service applies ODRL policies from agreements:
|
|
49
|
-
|
|
50
|
-
- **Prohibitions**: Removes fields targeted by prohibition rules
|
|
51
|
-
- **Permissions with Constraints**:
|
|
52
|
-
- `count` constraint: Limits number of results
|
|
53
|
-
- `dateTime` constraint: Filters by temporal boundaries (lt, lteq, gt, gteq)
|
|
54
|
-
- **Obligations**: Logged for audit purposes
|
|
55
|
-
|
|
56
|
-
### Error Responses
|
|
57
|
-
|
|
58
|
-
- `400 Bad Request` - Syntactically incorrect request (GuardError)
|
|
59
|
-
- `401 Unauthorized` - Invalid or expired transfer token
|
|
60
|
-
- `404 Not Found` - `consumerPid` not found
|
|
61
|
-
- `422 Unprocessable Entity` - Query type not supported or invalid transfer state
|
|
62
|
-
|
|
63
13
|
## Examples
|
|
64
14
|
|
|
65
15
|
Usage of the APIs is shown in the examples [docs/examples.md](docs/examples.md)
|
|
@@ -248,19 +248,15 @@ export class DataspaceDataPlaneService {
|
|
|
248
248
|
});
|
|
249
249
|
// We only validate that the activity conforms to Activity Streams Schema without entering into details
|
|
250
250
|
// about the object, target or actor as they might be subject of custom validation rules
|
|
251
|
-
const typeId = `${DataspaceContexts.JsonSchemaNamespace}${DataspaceTypes.Activity}`;
|
|
251
|
+
const typeId = `${DataspaceContexts.JsonSchemaNamespace}Dataspace${DataspaceTypes.Activity}`;
|
|
252
252
|
const activitySchema = await DataTypeHelper.getSchemaForType(typeId);
|
|
253
253
|
if (Is.undefined(activitySchema)) {
|
|
254
254
|
throw new GeneralError(DataspaceDataPlaneService.CLASS_NAME, "schemaNotFound", {
|
|
255
255
|
schemaId: typeId
|
|
256
256
|
});
|
|
257
257
|
}
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
throw new GeneralError(DataspaceDataPlaneService.CLASS_NAME, "invalidActivity", {
|
|
261
|
-
errors: validationResult.error
|
|
262
|
-
});
|
|
263
|
-
}
|
|
258
|
+
const validationFailures = await JsonSchemaHelper.validate(activitySchema, activity);
|
|
259
|
+
Validation.asValidationError(DataspaceDataPlaneService.CLASS_NAME, "activity", validationFailures);
|
|
264
260
|
// Calculate Activity Log Entry Id
|
|
265
261
|
const canonical = JsonHelper.canonicalize(activity);
|
|
266
262
|
const canonicalBytes = Converter.utf8ToBytes(canonical);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataspaceDataPlaneService.js","sourceRoot":"","sources":["../../src/dataspaceDataPlaneService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tTaskStatus,\n\ttype IBackgroundTask,\n\ttype IBackgroundTaskComponent,\n\ttype IScheduledTaskTime,\n\ttype ITaskSchedulerComponent\n} from \"@twin.org/background-task-models\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tArrayHelper,\n\tComponentFactory,\n\tConflictError,\n\tConverter,\n\tGeneralError,\n\tGuardError,\n\tGuards,\n\tIs,\n\tJsonHelper,\n\tNotFoundError,\n\tRandomHelper,\n\tUnprocessableError,\n\tValidation,\n\ttype IError,\n\ttype IValidationFailure\n} from \"@twin.org/core\";\nimport { Blake2b } from \"@twin.org/crypto\";\nimport { DataTypeHelper, JsonSchemaHelper } from \"@twin.org/data-core\";\nimport {\n\tJsonLdDataTypes,\n\tJsonLdHelper,\n\tJsonLdProcessor,\n\ttype IJsonLdContextDefinitionElement,\n\ttype IJsonLdNodeObject\n} from \"@twin.org/data-json-ld\";\nimport {\n\tActivityProcessingStatus,\n\tDataRequestType,\n\tDataspaceAppFactory,\n\tDataspaceContexts,\n\tDataspaceDataTypes,\n\tDataspaceTypes,\n\ttype IActivityLogDetails,\n\ttype IActivityLogEntry,\n\ttype IActivityLogStatusNotification,\n\ttype IActivityQuery,\n\ttype IDataAssetItemListResult,\n\ttype IDataAssetQuery,\n\ttype IDataRequest,\n\ttype IDataspaceActivity,\n\ttype IDataspaceApp,\n\ttype IDataspaceDataPlaneComponent,\n\ttype IEntitySet,\n\ttype IExecutionPayload,\n\ttype IFilteringQuery,\n\ttype ITaskApp,\n\ttype ITransferContext,\n\ttype TransferProcess\n} from \"@twin.org/dataspace-models\";\nimport { EngineCoreFactory } from \"@twin.org/engine-models\";\nimport { ComparisonOperator, LogicalOperator } from \"@twin.org/entity\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof, nameofKebabCase } from \"@twin.org/nameof\";\nimport type { IPolicyEnforcementPointComponent } from \"@twin.org/rights-management-models\";\nimport {\n\tDataspaceProtocolDataTypes,\n\tDataspaceProtocolTransferProcessStateType,\n\ttype IDataspaceProtocolAgreement,\n\ttype IDataspaceProtocolDataset\n} from \"@twin.org/standards-dataspace-protocol\";\nimport {\n\tSchemaOrgContexts,\n\tSchemaOrgDataTypes,\n\tSchemaOrgTypes\n} from \"@twin.org/standards-schema-org\";\nimport type { IActivityStreamsActivity } from \"@twin.org/standards-w3c-activity-streams\";\nimport { OdrlContexts } from \"@twin.org/standards-w3c-odrl\";\nimport { TrustHelper, type ITrustComponent } from \"@twin.org/trust-models\";\nimport type { ActivityLogDetails } from \"./entities/activityLogDetails.js\";\nimport type { ActivityTask } from \"./entities/activityTask.js\";\nimport type { IDataspaceDataPlaneServiceConstructorOptions } from \"./models/IDataspaceDataPlaneServiceConstructorOptions.js\";\n\n/**\n * Dataspace Data Plane Service.\n */\nexport class DataspaceDataPlaneService implements IDataspaceDataPlaneComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<DataspaceDataPlaneService>();\n\n\t/**\n\t * Milliseconds per minute (60 * 1000).\n\t * @internal\n\t */\n\tprivate static readonly _MS_PER_MINUTE: number = 60 * 1000;\n\n\t/**\n\t * Minutes per day (24 * 60 = 1440).\n\t * @internal\n\t */\n\tprivate static readonly _MINUTES_PER_DAY: number = 24 * 60;\n\n\t/**\n\t * Milliseconds per day (24 hours).\n\t * @internal\n\t */\n\tprivate static readonly _MS_PER_DAY: number = 24 * 60 * 60 * 1000;\n\n\t/**\n\t * The default cleanup interval in minutes. (1 hour)\n\t * @internal\n\t */\n\tprivate static readonly _DEFAULT_CLEANUP_INTERVAL: number = 60;\n\n\t/**\n\t * The default retain interval in minutes. (10 minutes)\n\t * @internal\n\t */\n\tprivate static readonly _DEFAULT_RETAIN_INTERVAL: number = 10;\n\n\t/**\n\t * Logging service type.\n\t * @internal\n\t */\n\tprivate readonly _loggingComponentType: string;\n\n\t/**\n\t * Logging service.\n\t * @internal\n\t */\n\tprivate readonly _logging?: ILoggingComponent;\n\n\t/**\n\t * Storage service for activity logging.\n\t * @internal\n\t */\n\tprivate readonly _entityStorageActivityLogs: IEntityStorageConnector<ActivityLogDetails>;\n\n\t/**\n\t * Storage service for activity tasks.\n\t * @internal\n\t */\n\tprivate readonly _entityStorageActivityTasks: IEntityStorageConnector<ActivityTask>;\n\n\t/**\n\t * Background Task Component.\n\t * @internal\n\t */\n\tprivate readonly _backgroundTaskComponent: IBackgroundTaskComponent;\n\n\t/**\n\t * Activity Log Status callbacks.\n\t * @internal\n\t */\n\tprivate readonly _activityLogStatusCallbacks: {\n\t\t[key: string]: (notification: IActivityLogStatusNotification) => Promise<void>;\n\t};\n\n\t/**\n\t * Task retention. -1 retain forever.\n\t * @internal\n\t */\n\tprivate readonly _retainTasksFor: number;\n\n\t/**\n\t * Activity Log Entry retention. -1 retain forever.\n\t * @internal\n\t */\n\tprivate readonly _retainActivityLogsFor: number;\n\n\t/**\n\t * Clean up interval for activity logs.\n\t * @internal\n\t */\n\tprivate readonly _activityLogCleanUpInterval: number;\n\n\t/**\n\t * Whether there is an ongoing clean up process.\n\t * @internal\n\t */\n\tprivate _cleanUpProcessOngoing: boolean;\n\n\t/**\n\t * The task scheduler used to clean up activity logs.\n\t * @internal\n\t */\n\tprivate readonly _taskScheduler: ITaskSchedulerComponent;\n\n\t/**\n\t * The keys to use from the context ids to create partitions.\n\t * @internal\n\t */\n\tprivate readonly _partitionContextIds?: string[];\n\n\t/**\n\t * The trust component.\n\t * @internal\n\t */\n\tprivate readonly _trustComponent: ITrustComponent;\n\n\t/**\n\t * The policy enforcement point for ODRL policy enforcement.\n\t * @internal\n\t */\n\tprivate readonly _policyEnforcementPoint?: IPolicyEnforcementPointComponent;\n\n\t/**\n\t * Entity storage for Transfer Process entities.\n\t * Used to read transfer state from shared storage (written by Control Plane).\n\t * @internal\n\t */\n\tprivate readonly _transferProcessStorage: IEntityStorageConnector<TransferProcess>;\n\n\t/**\n\t * The list of active tenants required for task cleanup.\n\t * @internal\n\t */\n\tprivate readonly _activeTenants: string[];\n\n\t/**\n\t * Create a new instance of DataspaceDataPlane.\n\t * @param options The options for the data plane.\n\t */\n\tconstructor(options?: IDataspaceDataPlaneServiceConstructorOptions) {\n\t\tthis._loggingComponentType = options?.loggingComponentType ?? \"logging\";\n\t\tthis._logging = ComponentFactory.getIfExists<ILoggingComponent>(this._loggingComponentType);\n\n\t\tthis._entityStorageActivityLogs = EntityStorageConnectorFactory.get<\n\t\t\tIEntityStorageConnector<ActivityLogDetails>\n\t\t>(options?.activityLogEntityStorageType ?? nameofKebabCase<ActivityLogDetails>());\n\n\t\tthis._entityStorageActivityTasks = EntityStorageConnectorFactory.get<\n\t\t\tIEntityStorageConnector<ActivityTask>\n\t\t>(options?.activityTaskEntityStorageType ?? nameofKebabCase<ActivityTask>());\n\n\t\tthis._backgroundTaskComponent = ComponentFactory.get(\n\t\t\toptions?.backgroundTaskComponentType ?? \"background-task\"\n\t\t);\n\n\t\tthis._taskScheduler = ComponentFactory.get<ITaskSchedulerComponent>(\n\t\t\toptions?.taskSchedulerComponentType ?? \"task-scheduler\"\n\t\t);\n\n\t\tthis._trustComponent = ComponentFactory.get<ITrustComponent>(\n\t\t\toptions?.trustComponentType ?? \"trust\"\n\t\t);\n\n\t\tthis._policyEnforcementPoint = ComponentFactory.getIfExists<IPolicyEnforcementPointComponent>(\n\t\t\toptions?.pepComponentType ?? \"policy-enforcement-point-service\"\n\t\t);\n\n\t\t// Entity storage for Transfer Process state lookup\n\t\t// Used to read transfer state from shared storage (written by Control Plane)\n\t\tthis._transferProcessStorage = EntityStorageConnectorFactory.get<\n\t\t\tIEntityStorageConnector<TransferProcess>\n\t\t>(options?.transferProcessEntityStorageType ?? nameofKebabCase<TransferProcess>());\n\n\t\tJsonLdDataTypes.registerTypes();\n\t\tDataspaceDataTypes.registerTypes();\n\t\tSchemaOrgDataTypes.registerRedirects();\n\t\tDataspaceProtocolDataTypes.registerRedirects();\n\t\tDataspaceProtocolDataTypes.registerTypes();\n\n\t\tthis._activityLogStatusCallbacks = {};\n\t\tthis._activeTenants = [];\n\t\tthis._partitionContextIds = options?.partitionContextIds;\n\n\t\tthis._retainTasksFor =\n\t\t\tDataspaceDataPlaneService._DEFAULT_RETAIN_INTERVAL * DataspaceDataPlaneService._MS_PER_MINUTE;\n\t\tthis._retainActivityLogsFor =\n\t\t\tDataspaceDataPlaneService._DEFAULT_RETAIN_INTERVAL * DataspaceDataPlaneService._MS_PER_MINUTE;\n\t\tthis._activityLogCleanUpInterval = DataspaceDataPlaneService._DEFAULT_CLEANUP_INTERVAL;\n\t\tthis._cleanUpProcessOngoing = false;\n\n\t\tconst validationErrors: IValidationFailure[] = [];\n\t\tif (!Is.empty(options?.config?.retainActivityLogsFor)) {\n\t\t\tGuards.integer(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tnameof(options.config.retainActivityLogsFor),\n\t\t\t\toptions.config.retainActivityLogsFor\n\t\t\t);\n\n\t\t\tif (options.config.retainActivityLogsFor === -1) {\n\t\t\t\tthis._retainTasksFor = -1;\n\t\t\t\tthis._retainActivityLogsFor = -1;\n\t\t\t} else {\n\t\t\t\tValidation.integer(\n\t\t\t\t\tnameof(options.config.retainActivityLogsFor),\n\t\t\t\t\toptions.config.retainActivityLogsFor,\n\t\t\t\t\tvalidationErrors,\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ minValue: 1 }\n\t\t\t\t);\n\t\t\t\t// Retention of internal tasks launched\n\t\t\t\t// 5 minutes of margin with respect to the Activity Log Entry to ensure proper removal\n\t\t\t\tthis._retainTasksFor =\n\t\t\t\t\t(options.config.retainActivityLogsFor + 5) * DataspaceDataPlaneService._MS_PER_MINUTE;\n\t\t\t\tthis._retainActivityLogsFor =\n\t\t\t\t\toptions.config.retainActivityLogsFor * DataspaceDataPlaneService._MS_PER_MINUTE;\n\t\t\t}\n\t\t}\n\n\t\tif (!Is.empty(options?.config?.activityLogsCleanUpInterval)) {\n\t\t\tGuards.integer(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tnameof(options.config.activityLogsCleanUpInterval),\n\t\t\t\toptions.config.activityLogsCleanUpInterval\n\t\t\t);\n\t\t\tValidation.integer(\n\t\t\t\tnameof(options.config.activityLogsCleanUpInterval),\n\t\t\t\toptions.config.activityLogsCleanUpInterval,\n\t\t\t\tvalidationErrors,\n\t\t\t\tundefined,\n\t\t\t\t{ minValue: 1 }\n\t\t\t);\n\t\t\tthis._activityLogCleanUpInterval = options.config.activityLogsCleanUpInterval;\n\t\t}\n\t\tValidation.asValidationError(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(options?.config),\n\t\t\tvalidationErrors\n\t\t);\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn DataspaceDataPlaneService.CLASS_NAME;\n\t}\n\n\t/**\n\t * The service needs to be started when the application is initialized.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t */\n\tpublic async start(nodeLoggingComponentType?: string): Promise<void> {\n\t\tconst engine = EngineCoreFactory.getIfExists(\"engine\");\n\t\tif (Is.empty(engine) || engine.isClone()) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"debug\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"engineCloneStart\"\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Only we have a task scheduler if there is a retention different than -1\n\t\tif (this._retainActivityLogsFor !== -1) {\n\t\t\tconst taskTime: IScheduledTaskTime[] = [\n\t\t\t\t{\n\t\t\t\t\tnextTriggerTime: Date.now() + 5000,\n\t\t\t\t\t...this.calculateCleaningTaskSchedule(this._activityLogCleanUpInterval)\n\t\t\t\t}\n\t\t\t];\n\n\t\t\tawait this._taskScheduler.addTask(\"dataspace-cleanup\", taskTime, async () => {\n\t\t\t\tawait this._logging?.log({\n\t\t\t\t\tlevel: \"debug\",\n\t\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\tmessage: \"scheduledCleanUpTask\"\n\t\t\t\t});\n\n\t\t\t\tawait this.cleanupActivityLog();\n\t\t\t});\n\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"debug\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"taskSchedulerStarted\",\n\t\t\t\tdata: {\n\t\t\t\t\ttaskTime\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Notify an Activity.\n\t * @param activity The Activity notified.\n\t * @returns The Activity's Log Entry identifier.\n\t */\n\tpublic async notifyActivity(activity: IActivityStreamsActivity): Promise<string> {\n\t\tGuards.object<IActivityStreamsActivity>(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(activity),\n\t\t\tactivity\n\t\t);\n\n\t\tawait this.updateActiveTenants();\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"debug\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tmessage: \"newActivity\",\n\t\t\tdata: {\n\t\t\t\tactivityType: activity.type,\n\t\t\t\tgenerator: this.calculateActivityGeneratorIdentity(activity)\n\t\t\t}\n\t\t});\n\n\t\t// We only validate that the activity conforms to Activity Streams Schema without entering into details\n\t\t// about the object, target or actor as they might be subject of custom validation rules\n\t\tconst typeId = `${DataspaceContexts.JsonSchemaNamespace}${DataspaceTypes.Activity}`;\n\t\tconst activitySchema = await DataTypeHelper.getSchemaForType(typeId);\n\t\tif (Is.undefined(activitySchema)) {\n\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"schemaNotFound\", {\n\t\t\t\tschemaId: typeId\n\t\t\t});\n\t\t}\n\t\tconst validationResult = await JsonSchemaHelper.validate(activitySchema, activity);\n\t\tif (!validationResult.result) {\n\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"invalidActivity\", {\n\t\t\t\terrors: validationResult.error\n\t\t\t});\n\t\t}\n\n\t\t// Calculate Activity Log Entry Id\n\t\tconst canonical = JsonHelper.canonicalize(activity);\n\t\tconst canonicalBytes = Converter.utf8ToBytes(canonical);\n\t\tconst activityLogId = Converter.bytesToHex(Blake2b.sum256(canonicalBytes));\n\t\tconst activityLogEntryId = `urn:x-activity-log:${activityLogId}`;\n\n\t\t// Check if entry already exists\n\t\tconst existingLogEntry = await this._entityStorageActivityLogs.get(activityLogEntryId);\n\t\tlet existingSuccessfulApps: string[] = [];\n\t\tlet isRetry = false;\n\n\t\tif (!Is.undefined(existingLogEntry)) {\n\t\t\t// Check if there are failed tasks that can be retried\n\t\t\tconst existingEntry = await this.getActivityLogEntry(activityLogEntryId);\n\n\t\t\t// If all tasks completed successfully, this is a duplicate\n\t\t\tif (existingEntry.status === ActivityProcessingStatus.Completed) {\n\t\t\t\tthrow new ConflictError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"activityAlreadyNotified\",\n\t\t\t\t\tactivityLogEntryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If still processing then reject to avoid race conditions\n\t\t\tif (\n\t\t\t\texistingEntry.status === ActivityProcessingStatus.Pending ||\n\t\t\t\texistingEntry.status === ActivityProcessingStatus.Running ||\n\t\t\t\texistingEntry.status === ActivityProcessingStatus.Registering\n\t\t\t) {\n\t\t\t\tthrow new ConflictError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"activityStillProcessing\",\n\t\t\t\t\tactivityLogEntryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Status is Error - prepare for retry\n\t\t\texistingSuccessfulApps = await this.prepareForRetry(activityLogEntryId, existingEntry);\n\t\t\tisRetry = true;\n\t\t} else {\n\t\t\tconst logEntry: IActivityLogDetails = {\n\t\t\t\tid: activityLogEntryId,\n\t\t\t\tactivityId: Is.string(activity.id) ? activity.id : undefined,\n\t\t\t\tgenerator: this.calculateActivityGeneratorIdentity(activity),\n\t\t\t\tdateCreated: new Date().toISOString(),\n\t\t\t\tdateModified: new Date().toISOString()\n\t\t\t};\n\t\t\tawait this._entityStorageActivityLogs.set(logEntry);\n\t\t}\n\n\t\tconst activityQuerySet = await this.calculateActivityQuerySet(activity as IDataspaceActivity);\n\n\t\tconst tasksScheduled: ITaskApp[] = [];\n\t\tconst dataspaceAppIds: string[] = [];\n\n\t\tfor (const query of activityQuerySet) {\n\t\t\tconst appIds = this.getAppForActivityQuery(query);\n\t\t\tfor (const appId of appIds) {\n\t\t\t\tif (!dataspaceAppIds.includes(appId)) {\n\t\t\t\t\tdataspaceAppIds.push(appId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const dataspaceAppId of dataspaceAppIds) {\n\t\t\t// Only process apps that haven't already completed successfully\n\t\t\tif (!existingSuccessfulApps.includes(dataspaceAppId)) {\n\t\t\t\tconst payload: IExecutionPayload = {\n\t\t\t\t\tactivityLogEntryId,\n\t\t\t\t\tactivity: activity as IDataspaceActivity,\n\t\t\t\t\texecutorApp: dataspaceAppId\n\t\t\t\t};\n\n\t\t\t\tconst taskType = Converter.bytesToHex(RandomHelper.generate(16));\n\t\t\t\tconst taskId = await this._backgroundTaskComponent.create<IExecutionPayload>(\n\t\t\t\t\ttaskType,\n\t\t\t\t\tpayload,\n\t\t\t\t\t{\n\t\t\t\t\t\tretainFor: this._retainTasksFor\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tawait this._backgroundTaskComponent.registerHandler<IExecutionPayload, unknown>(\n\t\t\t\t\ttaskType,\n\t\t\t\t\t\"@twin.org/dataspace-app-runner\",\n\t\t\t\t\t\"appRunner\",\n\t\t\t\t\tasync task => {\n\t\t\t\t\t\tawait this.finaliseTask(task);\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tinitialiseMethod: \"appRunnerStart\",\n\t\t\t\t\t\tshutdownMethod: \"appRunnerEnd\"\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\ttasksScheduled.push({\n\t\t\t\t\ttaskId,\n\t\t\t\t\tdataspaceAppId\n\t\t\t\t});\n\n\t\t\t\tawait this._logging?.log({\n\t\t\t\t\tlevel: \"info\",\n\t\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\tmessage: \"scheduledTask\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\tdataspaceAppId,\n\t\t\t\t\t\tisRetry\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst existingActivityTasks = isRetry\n\t\t\t? await this._entityStorageActivityTasks.get(activityLogEntryId)\n\t\t\t: undefined;\n\t\tconst existingTasksToKeep =\n\t\t\texistingActivityTasks?.associatedTasks.filter(t =>\n\t\t\t\texistingSuccessfulApps.includes(t.dataspaceAppId)\n\t\t\t) ?? [];\n\n\t\tawait this._entityStorageActivityTasks.set({\n\t\t\tactivityLogEntryId,\n\t\t\tassociatedTasks: [...existingTasksToKeep, ...tasksScheduled]\n\t\t});\n\n\t\treturn activityLogEntryId;\n\t}\n\n\t/**\n\t * Subscribes to the activity log.\n\t * @param callback The callback to be called when Activity Log is called.\n\t * @param subscriptionId The Subscription Id.\n\t * @returns The subscription Id.\n\t */\n\tpublic async subscribeToActivityLog(\n\t\tcallback: (notification: IActivityLogStatusNotification) => Promise<void>,\n\t\tsubscriptionId?: string\n\t): Promise<string> {\n\t\tGuards.function(DataspaceDataPlaneService.CLASS_NAME, nameof(callback), callback);\n\n\t\tconst theSubscriptionId = Is.stringValue(subscriptionId)\n\t\t\t? subscriptionId\n\t\t\t: Converter.bytesToHex(RandomHelper.generate(16));\n\t\tthis._activityLogStatusCallbacks[theSubscriptionId] = callback;\n\n\t\treturn theSubscriptionId;\n\t}\n\n\t/**\n\t * Subscribes to the activity log.\n\t * @param subscriptionId The Subscription Id.\n\t */\n\tpublic async unSubscribeToActivityLog(subscriptionId: string): Promise<void> {\n\t\tGuards.stringValue(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(subscriptionId),\n\t\t\tsubscriptionId\n\t\t);\n\t\tdelete this._activityLogStatusCallbacks[subscriptionId];\n\t}\n\n\t/**\n\t * Returns the activity processing details of an activity.\n\t * @param logEntryId The Id of the Activity Log Entry (a URI).\n\t * @returns the Activity Log Entry with the processing details.\n\t * @throws NotFoundError if activity log entry is not known.\n\t */\n\tpublic async getActivityLogEntry(logEntryId: string): Promise<IActivityLogEntry> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(logEntryId), logEntryId);\n\n\t\tconst result = await this._entityStorageActivityLogs.get(logEntryId);\n\t\tif (Is.undefined(result)) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"activityLogEntryNotFound\",\n\t\t\t\tlogEntryId\n\t\t\t);\n\t\t}\n\n\t\tlet pendingTasks: IActivityLogEntry[\"pendingTasks\"];\n\t\tlet runningTasks: IActivityLogEntry[\"runningTasks\"];\n\t\tlet finalizedTasks: IActivityLogEntry[\"finalizedTasks\"];\n\t\tlet inErrorTasks: IActivityLogEntry[\"inErrorTasks\"];\n\n\t\t// For calculating the processing status. `Registering` if we cannot determine the activity tasks yet\n\t\tlet status: ActivityProcessingStatus = ActivityProcessingStatus.Registering;\n\n\t\t// Now query the associated tasks\n\t\tconst activityTasks = await this._entityStorageActivityTasks.get(logEntryId);\n\n\t\t// If activity tasks is undefined it is because the corresponding store has not been persisted yet\n\t\tif (!Is.undefined(activityTasks)) {\n\t\t\tpendingTasks = [];\n\t\t\trunningTasks = [];\n\t\t\tfinalizedTasks = [];\n\t\t\tinErrorTasks = [];\n\n\t\t\tfor (const entity of activityTasks.associatedTasks) {\n\t\t\t\tconst taskDetails = await this._backgroundTaskComponent.get<IExecutionPayload, unknown>(\n\t\t\t\t\tentity.taskId\n\t\t\t\t);\n\n\t\t\t\tif (Is.object(taskDetails)) {\n\t\t\t\t\tswitch (taskDetails.status) {\n\t\t\t\t\t\tcase TaskStatus.Success:\n\t\t\t\t\t\t\tfinalizedTasks.push({\n\t\t\t\t\t\t\t\t...entity,\n\t\t\t\t\t\t\t\tresult: JSON.stringify(taskDetails.result),\n\t\t\t\t\t\t\t\tstartDate: taskDetails?.dateCreated,\n\t\t\t\t\t\t\t\tendDate: taskDetails?.dateCompleted\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TaskStatus.Pending:\n\t\t\t\t\t\t\tpendingTasks.push(entity);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TaskStatus.Processing:\n\t\t\t\t\t\t\trunningTasks.push({ ...entity, startDate: taskDetails.dateCreated });\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TaskStatus.Failed:\n\t\t\t\t\t\t\tinErrorTasks.push({\n\t\t\t\t\t\t\t\t...entity,\n\t\t\t\t\t\t\t\terror: taskDetails.error as IError\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TaskStatus.Cancelled:\n\t\t\t\t\t\t\t// Nothing to do for cancelled tasks\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Is.arrayValue(inErrorTasks)) {\n\t\t\t\tstatus = ActivityProcessingStatus.Error;\n\t\t\t} else if (Is.arrayValue(runningTasks)) {\n\t\t\t\tstatus = ActivityProcessingStatus.Running;\n\t\t\t} else if (Is.arrayValue(pendingTasks)) {\n\t\t\t\tstatus = ActivityProcessingStatus.Pending;\n\t\t\t} else {\n\t\t\t\tstatus = ActivityProcessingStatus.Completed;\n\t\t\t}\n\t\t}\n\t\treturn { ...result, status, pendingTasks, runningTasks, finalizedTasks, inErrorTasks };\n\t}\n\n\t/**\n\t * Get Data Asset entities. Allows to retrieve entities by their type or id.\n\t * @param entitySet The set of entities to be retrieved.\n\t * @param entitySet.jsonLdContext The JSON-LD Context to be used to expand the referred entityType.\n\t * @param consumerPid The consumer Process ID from the DSP Transfer Process.\n\t * Used to resolve datasetId from the Transfer Process.\n\t * @param cursor Pagination details - cursor.\n\t * @param limit Pagination details - max number of entities.\n\t * @param trustPayload Trust payload to verify the requesters identity.\n\t * @returns The entities requested as a JSON-LD Document.\n\t */\n\tpublic async getDataAssetEntities(\n\t\tentitySet: IEntitySet & {\n\t\t\tjsonLdContext?: IJsonLdContextDefinitionElement[];\n\t\t},\n\t\tconsumerPid: string,\n\t\tcursor?: string,\n\t\tlimit?: number,\n\t\ttrustPayload?: unknown\n\t): Promise<IDataAssetItemListResult> {\n\t\tGuards.object<IEntitySet>(DataspaceDataPlaneService.CLASS_NAME, nameof(entitySet), entitySet);\n\t\tGuards.string(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(entitySet.entityType),\n\t\t\tentitySet.entityType\n\t\t);\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"getDataAssetEntities\"\n\t\t);\n\n\t\tconst dataConsumerIdentity = trustInfo.identity;\n\t\tGuards.stringValue(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(dataConsumerIdentity),\n\t\t\tdataConsumerIdentity\n\t\t);\n\n\t\t// Use consumerPid to resolve datasetId via Transfer Process\n\t\t// This validates the transfer token, state, and extracts datasetId\n\t\tconst transferContext = await this.validateTransfer(consumerPid, trustPayload);\n\t\tconst resolvedDatasetId = transferContext.datasetId;\n\n\t\tconst serviceDataset = await this.getDatasetFromApps(resolvedDatasetId);\n\n\t\t// Expand entity type if LD context provided\n\t\tlet finalType: string | undefined = entitySet.entityType;\n\t\tif (!Is.undefined(entitySet.jsonLdContext)) {\n\t\t\tconst auxiliaryObj = {\n\t\t\t\t\"@context\": entitySet.jsonLdContext,\n\t\t\t\t\"@type\": entitySet.entityType\n\t\t\t};\n\t\t\tconst expanded = (await JsonLdProcessor.expand(auxiliaryObj))[0];\n\t\t\tfinalType = expanded[\"@type\"]?.[0];\n\t\t}\n\n\t\tif (Is.undefined(finalType)) {\n\t\t\tthrow new GuardError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"notExpandableType\",\n\t\t\t\tnameof(entitySet.entityType),\n\t\t\t\tentitySet.entityType\n\t\t\t);\n\t\t}\n\n\t\tconst datasetId = serviceDataset[\"@id\"];\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(datasetId), datasetId);\n\t\tconst appId = await this.getAppForDataAssetQuery({ datasetId });\n\n\t\t// getAppForDataAssetQuery already validates app exists\n\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appId);\n\n\t\tconst handleDataRequest = app.handleDataRequest?.bind(app);\n\t\tGuards.function(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(handleDataRequest),\n\t\t\thandleDataRequest\n\t\t);\n\n\t\tconst dataRequest: IDataRequest = {\n\t\t\ttype: DataRequestType.DataAssetEntities,\n\t\t\tdataAsset: serviceDataset,\n\t\t\tentitySet: {\n\t\t\t\tentityType: finalType,\n\t\t\t\tentityId: entitySet.entityId\n\t\t\t}\n\t\t};\n\n\t\tconst { data, cursor: cursorResult } = await handleDataRequest(dataRequest, cursor, limit);\n\n\t\tlet finalData: IJsonLdNodeObject[];\n\t\tif (Is.array(data)) {\n\t\t\tfinalData = data;\n\t\t} else {\n\t\t\tfinalData = [data as IJsonLdNodeObject];\n\t\t}\n\n\t\tconst itemList = {\n\t\t\t\"@context\": SchemaOrgContexts.Context,\n\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\titemListElement: finalData\n\t\t};\n\n\t\tlet result: IDataAssetItemListResult = {\n\t\t\titemList,\n\t\t\tcursor: cursorResult\n\t\t};\n\n\t\t// Apply policy filters from Agreement\n\t\tif (transferContext?.agreement) {\n\t\t\tconst filtered = await this.applyPolicyFilters(result, transferContext.agreement);\n\t\t\tif (filtered.itemList) {\n\t\t\t\tresult = filtered;\n\t\t\t} else {\n\t\t\t\tresult.itemList[SchemaOrgTypes.ItemListElement] = [];\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Queries a data asset controlled by this Dataspace App.\n\t * @param consumerPid The consumer Process ID from the DSP Transfer Process.\n\t * Used to resolve datasetId from the Transfer Process.\n\t * @param query The filtering query.\n\t * @param cursor Pagination details - cursor.\n\t * @param limit Pagination details - max number of entities.\n\t * @param trustPayload Trust payload to verify the requesters identity.\n\t * @returns The item list and optional cursor for pagination via Link headers.\n\t */\n\tpublic async queryDataAsset(\n\t\tconsumerPid: string,\n\t\tquery: IFilteringQuery,\n\t\tcursor?: string,\n\t\tlimit?: number,\n\t\ttrustPayload?: unknown\n\t): Promise<IDataAssetItemListResult> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\t\tGuards.object(DataspaceDataPlaneService.CLASS_NAME, nameof(query), query);\n\t\tGuards.string(DataspaceDataPlaneService.CLASS_NAME, nameof(query.type), query.type);\n\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"queryDataAsset\"\n\t\t);\n\n\t\tconst dataConsumerIdentity = trustInfo.identity;\n\t\tGuards.stringValue(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(dataConsumerIdentity),\n\t\t\tdataConsumerIdentity\n\t\t);\n\n\t\t// Use consumerPid to resolve datasetId via Transfer Process\n\t\t// This validates the transfer token, state, and extracts datasetId\n\t\tconst transferContext = await this.validateTransfer(consumerPid, trustPayload);\n\t\tconst resolvedDatasetId = transferContext.datasetId;\n\n\t\tconst serviceDataset = await this.getDatasetFromApps(resolvedDatasetId);\n\n\t\tconst datasetId = serviceDataset[\"@id\"];\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(datasetId), datasetId);\n\t\tconst appId = await this.getAppForDataAssetQuery({ datasetId });\n\n\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appId);\n\n\t\tif (!app.supportedQueryTypes().includes(query.type)) {\n\t\t\tthrow new UnprocessableError(DataspaceDataPlaneService.CLASS_NAME, \"queryTypeNotSupported\", {\n\t\t\t\tqueryType: query.type\n\t\t\t});\n\t\t}\n\n\t\tconst dataRequest: IDataRequest = {\n\t\t\ttype: DataRequestType.QueryDataAsset,\n\t\t\tdataAsset: serviceDataset,\n\t\t\tquery\n\t\t};\n\n\t\tconst handleDataRequest = app.handleDataRequest?.bind(app);\n\t\tGuards.function(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(handleDataRequest),\n\t\t\thandleDataRequest\n\t\t);\n\n\t\tconst { data, cursor: cursorResult } = await handleDataRequest(dataRequest, cursor, limit);\n\n\t\tlet finalData: IJsonLdNodeObject[];\n\t\tif (Is.array(data)) {\n\t\t\tfinalData = data;\n\t\t} else {\n\t\t\tfinalData = [data as IJsonLdNodeObject];\n\t\t}\n\n\t\tconst itemList = {\n\t\t\t\"@context\": SchemaOrgContexts.Context,\n\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\titemListElement: finalData\n\t\t};\n\n\t\tlet result: IDataAssetItemListResult = {\n\t\t\titemList,\n\t\t\tcursor: cursorResult\n\t\t};\n\n\t\t// Apply policy filters from Agreement if using consumerPid flow\n\t\tif (transferContext?.agreement) {\n\t\t\tconst filtered = await this.applyPolicyFilters(result, transferContext.agreement);\n\t\t\tif (filtered.itemList) {\n\t\t\t\tresult = filtered;\n\t\t\t} else {\n\t\t\t\tresult.itemList[SchemaOrgTypes.ItemListElement] = [];\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Validate transfer authorization for data requests.\n\t * Reads directly from shared TransferProcess entity storage.\n\t * @param consumerPid The consumer process ID from the transfer request.\n\t * @param trustPayload The trust payload for verification (validates signature and expiry).\n\t * @returns The transfer context containing datasetId, agreement, and other transfer details.\n\t * @throws GeneralError if transfer process storage is not configured.\n\t * @throws NotFoundError if transfer process is not found.\n\t * @throws UnauthorizedError if trust verification fails.\n\t * @throws GeneralError if transfer is not in STARTED state.\n\t */\n\tpublic async validateTransfer(\n\t\tconsumerPid: string,\n\t\ttrustPayload: unknown\n\t): Promise<ITransferContext> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\t// Verify trust payload (validates JWT signature, expiry, and returns verification info)\n\t\t// The trust verifier handles all token validation including expiry\n\t\tawait TrustHelper.verifyTrust(this._trustComponent, trustPayload, \"validateTransfer\");\n\n\t\t// Direct lookup from shared entity storage by consumerPid (which is the primary key)\n\t\tconst transferProcess = await this._transferProcessStorage.get(consumerPid);\n\n\t\tif (!transferProcess) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"transferProcessNotFound\",\n\t\t\t\tconsumerPid\n\t\t\t);\n\t\t}\n\n\t\t// Validate state: must be STARTED\n\t\tif (transferProcess.state !== DataspaceProtocolTransferProcessStateType.STARTED) {\n\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"transferNotInStartedState\", {\n\t\t\t\tcurrentState: transferProcess.state\n\t\t\t});\n\t\t}\n\n\t\t// Validate datasetId is present\n\t\tif (!Is.stringValue(transferProcess.datasetId)) {\n\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"transferMissingDatasetId\");\n\t\t}\n\n\t\treturn this.buildTransferContext(transferProcess);\n\t}\n\n\t// ============================================================================\n\t// PRIVATE HELPER METHODS\n\t// ============================================================================\n\n\t/**\n\t * Calculates the activity generator from the generator or actor fields.\n\t * @param activity The activity.\n\t * @returns The generator's identity.\n\t * @throws General Error if no identity is found.\n\t * @internal\n\t */\n\tprivate calculateActivityGeneratorIdentity(activity: IActivityStreamsActivity): string {\n\t\tif (Is.stringValue(activity.generator)) {\n\t\t\treturn activity.generator;\n\t\t}\n\n\t\tif (Is.object<IJsonLdNodeObject>(activity.generator) && Is.stringValue(activity.generator.id)) {\n\t\t\treturn activity.generator.id;\n\t\t}\n\n\t\tif (Is.stringValue(activity.actor)) {\n\t\t\treturn activity.actor;\n\t\t}\n\n\t\tif (Is.object<IJsonLdNodeObject>(activity.actor) && Is.stringValue(activity.actor.id)) {\n\t\t\treturn activity.actor.id;\n\t\t}\n\n\t\tthrow new GuardError(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\"invalidActivityGeneratorIdentity\",\n\t\t\tnameof(activity.generator),\n\t\t\t{\n\t\t\t\tgenerator: activity.generator,\n\t\t\t\tactor: activity.actor\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Process activity task finalization.\n\t * @param proofEntity The proof entity to process.\n\t * @internal\n\t */\n\tprivate async finaliseTask(task: IBackgroundTask<IExecutionPayload, unknown>): Promise<void> {\n\t\tconst payload = task.payload;\n\n\t\tif (Is.empty(payload)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activityLogEntry = await this._entityStorageActivityLogs.get(payload.activityLogEntryId);\n\t\tif (Is.undefined(activityLogEntry)) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"unknownActivityLogEntryId\",\n\t\t\t\tdata: {\n\t\t\t\t\tactivityLogEntryId: payload.activityLogEntryId\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (task.status === TaskStatus.Success || task.status === TaskStatus.Failed) {\n\t\t\tfor (const callback of Object.values(this._activityLogStatusCallbacks)) {\n\t\t\t\tawait callback({\n\t\t\t\t\tactivityLogEntryId: payload.activityLogEntryId,\n\t\t\t\t\tactivityId: Is.string(payload.activity.id) ? payload.activity.id : undefined,\n\t\t\t\t\ttaskProcessingStatus: {\n\t\t\t\t\t\tdataspaceAppId: payload.executorApp,\n\t\t\t\t\t\ttaskId: task.id,\n\t\t\t\t\t\ttaskStatus: task.status\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Now let's see if the full activity processing has completed, if so the entry must be marked for retention\n\t\t\tif (this._retainActivityLogsFor !== -1) {\n\t\t\t\tconst entry = await this.getActivityLogEntry(payload.activityLogEntryId);\n\t\t\t\tif (\n\t\t\t\t\tentry.status === ActivityProcessingStatus.Completed ||\n\t\t\t\t\tentry.status === ActivityProcessingStatus.Error\n\t\t\t\t) {\n\t\t\t\t\tconst retainUntil = Date.now() + this._retainActivityLogsFor;\n\t\t\t\t\tawait this._entityStorageActivityLogs.set({\n\t\t\t\t\t\tid: entry.id,\n\t\t\t\t\t\tactivityId: entry.activityId,\n\t\t\t\t\t\tgenerator: entry.generator,\n\t\t\t\t\t\tdateCreated: entry.dateCreated,\n\t\t\t\t\t\tdateModified: entry.dateModified,\n\t\t\t\t\t\tretainUntil,\n\t\t\t\t\t\tretryCount: entry.retryCount\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Updates the list of active tenants for cleanup tasks.\n\t * @internal\n\t */\n\tprivate async updateActiveTenants(): Promise<void> {\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst tenantId = contextIds?.[ContextIdKeys.Tenant];\n\t\tif (Is.stringValue(tenantId) && !this._activeTenants.includes(tenantId)) {\n\t\t\tthis._activeTenants.push(tenantId);\n\t\t}\n\t}\n\n\t/**\n\t * Cleans up the activity log by deleting those entries that no longer shall be retained.\n\t * @internal\n\t */\n\tprivate async cleanupActivityLog(): Promise<void> {\n\t\tif (this._cleanUpProcessOngoing) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"debug\",\n\t\t\t\tmessage: \"cleanUpOngoing\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis._cleanUpProcessOngoing = true;\n\n\t\tlet numRecordsDeleted = 0;\n\n\t\tif (this._partitionContextIds?.includes(ContextIdKeys.Tenant)) {\n\t\t\t// The cleanup must be done tenant by tenant\n\t\t\t// as the data behind the scenes might be partitioned\n\t\t\tfor (const tenantId of this._activeTenants) {\n\t\t\t\tconst localContextIds = (await ContextIdStore.getContextIds()) ?? {};\n\t\t\t\tlocalContextIds[ContextIdKeys.Tenant] = tenantId;\n\n\t\t\t\tawait ContextIdStore.run(localContextIds, async () => {\n\t\t\t\t\tnumRecordsDeleted += await this.cleanupActivityLogPartition();\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tnumRecordsDeleted += await this.cleanupActivityLogPartition();\n\t\t}\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"debug\",\n\t\t\tmessage: \"activityLogCleanedUp\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tdata: {\n\t\t\t\tnumRecordsDeleted\n\t\t\t}\n\t\t});\n\n\t\tthis._cleanUpProcessOngoing = false;\n\t}\n\n\t/**\n\t * Cleans up the activity log partition for the current context ids.\n\t * @returns The number of records deleted in this partition.\n\t * @internal\n\t */\n\tprivate async cleanupActivityLogPartition(): Promise<number> {\n\t\tlet numRecordsDeleted = 0;\n\n\t\ttry {\n\t\t\tlet cursor: string | undefined;\n\t\t\tconst now = Date.now();\n\n\t\t\tdo {\n\t\t\t\tconst result = await this._entityStorageActivityLogs.query({\n\t\t\t\t\tconditions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"retainUntil\",\n\t\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t\t\tcomparison: ComparisonOperator.GreaterThan\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"retainUntil\",\n\t\t\t\t\t\t\tvalue: now,\n\t\t\t\t\t\t\tcomparison: ComparisonOperator.LessThan\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\tlogicalOperator: LogicalOperator.And\n\t\t\t\t});\n\t\t\t\tcursor = result.cursor;\n\n\t\t\t\tfor (const entity of result.entities) {\n\t\t\t\t\tconst logEntryDetails = await this.getActivityLogEntry(entity.id as string);\n\t\t\t\t\tif (\n\t\t\t\t\t\tlogEntryDetails.status === ActivityProcessingStatus.Completed ||\n\t\t\t\t\t\tlogEntryDetails.status === ActivityProcessingStatus.Error\n\t\t\t\t\t) {\n\t\t\t\t\t\tawait this._entityStorageActivityLogs.remove(entity.id as string);\n\t\t\t\t\t\tawait this._entityStorageActivityTasks.remove(entity.id as string);\n\t\t\t\t\t\tnumRecordsDeleted++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (Is.stringValue(cursor));\n\t\t} catch {\n\t\t\t// If cleaning up the retained items fail we don't really care, they will get cleaned up on the next sweep.\n\t\t}\n\t\treturn numRecordsDeleted;\n\t}\n\n\t/**\n\t * Calculates the (Activity, Object, Target) query set.\n\t * @param activity The object representing the Activity.\n\t * @returns the (Activity, Object, Target) query set.\n\t * @internal\n\t */\n\tprivate async calculateActivityQuerySet(activity: IDataspaceActivity): Promise<IActivityQuery[]> {\n\t\tconst activityTypes = await JsonLdHelper.getType(activity);\n\t\tlet objectTypes: string[] = [];\n\n\t\tconst objects = ArrayHelper.fromObjectOrArray<IJsonLdNodeObject>(activity.object);\n\t\tfor (const object of objects) {\n\t\t\tobjectTypes = objectTypes.concat(await JsonLdHelper.getType(object));\n\t\t}\n\n\t\tlet targetTypes: string[] = [\"\"];\n\t\tif (Is.object<IJsonLdNodeObject>(activity.target)) {\n\t\t\ttargetTypes = await JsonLdHelper.getType(activity.target);\n\t\t}\n\n\t\tconst result: IActivityQuery[] = [];\n\n\t\tfor (const activityType of activityTypes) {\n\t\t\tfor (const objectType of objectTypes) {\n\t\t\t\tfor (const targetType of targetTypes) {\n\t\t\t\t\tconst query: IActivityQuery = {\n\t\t\t\t\t\tactivityType,\n\t\t\t\t\t\tobjectType,\n\t\t\t\t\t\ttargetType: !Is.stringValue(targetType) ? undefined : targetType\n\t\t\t\t\t};\n\n\t\t\t\t\tresult.push(query);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Calculates the cleaning task schedule.\n\t * @param minutes The period in minutes.\n\t * @returns The cleaning task schedule.\n\t * @internal\n\t */\n\tprivate calculateCleaningTaskSchedule(minutes: number): IScheduledTaskTime {\n\t\tlet minutesRemain = minutes;\n\n\t\tconst days = Math.floor(minutesRemain / DataspaceDataPlaneService._MINUTES_PER_DAY);\n\t\tminutesRemain %= DataspaceDataPlaneService._MINUTES_PER_DAY;\n\n\t\tconst hours = Math.floor(minutesRemain / 60);\n\t\tminutesRemain %= 60;\n\n\t\treturn { intervalDays: days, intervalHours: hours, intervalMinutes: minutesRemain };\n\t}\n\n\t/**\n\t * Returns an App for a (Activity, Object, Target).\n\t * @param activityQuery The (Activity, Object, Target) query specified using a FQN.\n\t * @returns The Dataspace Data Plane Apps or empty list if nothing is registered.\n\t * @internal\n\t */\n\tprivate getAppForActivityQuery(activityQuery: IActivityQuery): string[] {\n\t\tconst matchingElements: string[] = [];\n\t\tconst appNames = DataspaceAppFactory.names();\n\n\t\tfor (const appId of appNames) {\n\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appId);\n\t\t\tconst appQueries = app.activitiesHandled();\n\n\t\t\tfor (const appQuery of appQueries) {\n\t\t\t\tif (\n\t\t\t\t\tappQuery.objectType === activityQuery.objectType &&\n\t\t\t\t\t(Is.undefined(appQuery.activityType) ||\n\t\t\t\t\t\tappQuery.activityType === activityQuery.activityType) &&\n\t\t\t\t\t(Is.undefined(appQuery.targetType) || appQuery.targetType === activityQuery.targetType)\n\t\t\t\t) {\n\t\t\t\t\t// Avoid duplicates. Only one DS App can be executed per activity\n\t\t\t\t\tif (!matchingElements.includes(appId)) {\n\t\t\t\t\t\tmatchingElements.push(appId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn matchingElements;\n\t}\n\n\t/**\n\t * Get a dataset from registered apps by its ID.\n\t * @param datasetId The dataset identifier (@id)\n\t * @returns The dataset\n\t * @throws NotFoundError if no app handles this dataset\n\t * @internal\n\t */\n\tprivate async getDatasetFromApps(datasetId: string): Promise<IDataspaceProtocolDataset> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(datasetId), datasetId);\n\t\tconst appNames = DataspaceAppFactory.names();\n\n\t\tfor (const appId of appNames) {\n\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appId);\n\t\t\tconst datasets = await app.datasetsHandled();\n\t\t\tconst dataset = datasets.find(d => d[\"@id\"] === datasetId);\n\t\t\tif (dataset) {\n\t\t\t\treturn dataset;\n\t\t\t}\n\t\t}\n\n\t\tthrow new NotFoundError(DataspaceDataPlaneService.CLASS_NAME, \"noAppRegistered\", datasetId, {\n\t\t\tdatasetId\n\t\t});\n\t}\n\n\t/**\n\t * Returns an App for a Data Asset query (datasetId, ...).\n\t * @param dataAssetQuery The data asset query.\n\t * @returns The Dataspace Data Plane App ID.\n\t * @internal\n\t */\n\tprivate async getAppForDataAssetQuery(dataAssetQuery: IDataAssetQuery): Promise<string> {\n\t\tconst matchingElements: string[] = [];\n\t\tconst appNames = DataspaceAppFactory.names();\n\n\t\tfor (const appId of appNames) {\n\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appId);\n\t\t\tconst datasets = await app.datasetsHandled();\n\n\t\t\tfor (const dataset of datasets) {\n\t\t\t\tif (dataset[\"@id\"] === dataAssetQuery.datasetId) {\n\t\t\t\t\tmatchingElements.push(appId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (matchingElements.length > 1) {\n\t\t\tconst error = new ConflictError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"tooManyAppsRegistered\",\n\t\t\t\tdataAssetQuery.datasetId,\n\t\t\t\tmatchingElements,\n\t\t\t\t{\n\t\t\t\t\tdatasetId: dataAssetQuery.datasetId\n\t\t\t\t}\n\t\t\t);\n\t\t\tawait this._logging?.log({\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: \"tooManyAppsRegistered\",\n\t\t\t\terror,\n\t\t\t\tdata: {\n\t\t\t\t\tdatasetId: dataAssetQuery.datasetId\n\t\t\t\t}\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (!Is.arrayValue(matchingElements)) {\n\t\t\tconst error = new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"noAppRegistered\",\n\t\t\t\tdataAssetQuery.datasetId,\n\t\t\t\t{\n\t\t\t\t\tdatasetId: dataAssetQuery.datasetId\n\t\t\t\t}\n\t\t\t);\n\t\t\tawait this._logging?.log({\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: \"noAppRegistered\",\n\t\t\t\terror,\n\t\t\t\tdata: {\n\t\t\t\t\tdatasetId: dataAssetQuery.datasetId\n\t\t\t\t}\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn matchingElements[0];\n\t}\n\n\t/**\n\t * Prepare an activity for retry by updating metadata and returning apps to skip.\n\t * @param activityLogEntryId The activity log entry ID.\n\t * @param existingEntry The existing activity log entry with error status.\n\t * @returns Array of app IDs that already succeeded and should be skipped.\n\t * @internal\n\t */\n\tprivate async prepareForRetry(\n\t\tactivityLogEntryId: string,\n\t\texistingEntry: IActivityLogEntry\n\t): Promise<string[]> {\n\t\tconst appsToRetry = existingEntry.inErrorTasks?.map(t => t.dataspaceAppId) ?? [];\n\n\t\tif (!Is.arrayValue(appsToRetry)) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"noFailedTasksToRetry\",\n\t\t\t\tactivityLogEntryId\n\t\t\t);\n\t\t}\n\n\t\tconst successfulApps = existingEntry.finalizedTasks?.map(t => t.dataspaceAppId) ?? [];\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"debug\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tmessage: \"replacingFailedTasks\",\n\t\t\tdata: {\n\t\t\t\tactivityLogEntryId,\n\t\t\t\tappsToRetry,\n\t\t\t\tsuccessfulApps\n\t\t\t}\n\t\t});\n\n\t\tconst logEntry = await this._entityStorageActivityLogs.get(activityLogEntryId);\n\t\tif (logEntry) {\n\t\t\tlogEntry.dateModified = new Date().toISOString();\n\t\t\t// Extend retention to allow retry to complete\n\t\t\tif (this._retainActivityLogsFor !== -1) {\n\t\t\t\tlogEntry.retainUntil = Date.now() + this._retainActivityLogsFor;\n\t\t\t}\n\t\t\t// Monitoring purposes\n\t\t\tlogEntry.retryCount = (logEntry.retryCount ?? 0) + 1;\n\t\t\tawait this._entityStorageActivityLogs.set(logEntry);\n\t\t}\n\n\t\treturn successfulApps;\n\t}\n\n\t/**\n\t * Build transfer context from a TransferProcessEntity.\n\t * @param transferProcess The transfer process entity.\n\t * @returns The transfer context for use by data access methods.\n\t * @internal\n\t */\n\tprivate buildTransferContext(transferProcess: TransferProcess): ITransferContext {\n\t\t// Build the IDataspaceProtocolAgreement from stored data\n\t\t// The entity stores agreementId and policies separately\n\t\t//\n\t\t// NOTE: Currently policies are cached in the TransferProcessEntity at transfer start time.\n\t\t// Eventually, this should fetch fresh policies from Rights Management (PAP) using:\n\t\t// const freshAgreement = await this._policyAdministrationPoint.get(transferProcess.agreementId);\n\t\t// This would ensure policies are always up-to-date and support dynamic policy updates.\n\t\tconst agreement: IDataspaceProtocolAgreement = {\n\t\t\t\"@context\": OdrlContexts.Context,\n\t\t\t\"@type\": \"Agreement\",\n\t\t\t\"@id\": transferProcess.agreementId,\n\t\t\ttarget: transferProcess.datasetId,\n\t\t\t// Provider is the assigner, consumer is the assignee\n\t\t\tassigner: transferProcess.providerIdentity ?? \"\",\n\t\t\tassignee: transferProcess.consumerIdentity ?? \"\"\n\t\t};\n\n\t\t// Extract policies from the stored Agreement\n\t\t// Extract permission, prohibition, and obligation\n\t\tif (Is.arrayValue(transferProcess.policies)) {\n\t\t\tconst storedAgreement = transferProcess.policies[0] as\n\t\t\t\t| IDataspaceProtocolAgreement\n\t\t\t\t| undefined;\n\t\t\tif (storedAgreement) {\n\t\t\t\tagreement.permission = storedAgreement.permission;\n\t\t\t\tagreement.prohibition = storedAgreement.prohibition;\n\t\t\t\tagreement.obligation = storedAgreement.obligation;\n\t\t\t}\n\t\t}\n\n\t\tconst state = transferProcess.state;\n\t\tconst dataAddress = transferProcess.dataAddress;\n\n\t\treturn {\n\t\t\tconsumerPid: transferProcess.consumerPid,\n\t\t\tproviderPid: transferProcess.providerPid,\n\t\t\tagreement,\n\t\t\tdatasetId: transferProcess.datasetId,\n\t\t\tofferId: transferProcess.offerId,\n\t\t\tstate,\n\t\t\tconsumerIdentity: transferProcess.consumerIdentity,\n\t\t\tproviderIdentity: transferProcess.providerIdentity,\n\t\t\tdataAddress\n\t\t};\n\t}\n\n\t/**\n\t * Apply ODRL policy enforcement to query results.\n\t * Delegates to the Policy Enforcement Point (PEP) which coordinates\n\t * PDP, arbiters, and enforcement processors.\n\t * @param result The data asset item list result to filter.\n\t * @param agreement The ODRL Agreement containing policies.\n\t * @returns The result with policies applied.\n\t * @internal\n\t */\n\tprivate async applyPolicyFilters(\n\t\tresult: IDataAssetItemListResult,\n\t\tagreement?: IDataspaceProtocolAgreement\n\t): Promise<IDataAssetItemListResult> {\n\t\tif (!agreement || !this._policyEnforcementPoint) {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst processed =\n\t\t\tawait this._policyEnforcementPoint.interceptWithPolicy<IDataAssetItemListResult>(\n\t\t\t\tagreement,\n\t\t\t\tresult\n\t\t\t);\n\n\t\tif (Is.arrayValue(agreement.obligation)) {\n\t\t\tawait this.logObligations(agreement.obligation, agreement[\"@id\"]);\n\t\t}\n\n\t\treturn processed;\n\t}\n\n\t/**\n\t * Log ODRL obligations for auditing purposes.\n\t * Obligations are duties that must be fulfilled as part of the agreement.\n\t * @param obligations The obligation rules from the Agreement.\n\t * @param agreementId The agreement ID for reference.\n\t * @internal\n\t */\n\tprivate async logObligations(\n\t\tobligations: IDataspaceProtocolAgreement[\"obligation\"],\n\t\tagreementId: string\n\t): Promise<void> {\n\t\tif (!Is.arrayValue(obligations)) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const obligation of obligations) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"policyObligationTriggered\",\n\t\t\t\tdata: {\n\t\t\t\t\tagreementId,\n\t\t\t\t\taction: obligation.action,\n\t\t\t\t\ttarget: obligation.target,\n\t\t\t\t\tassignee: obligation.assignee\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dataspaceDataPlaneService.js","sourceRoot":"","sources":["../../src/dataspaceDataPlaneService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tTaskStatus,\n\ttype IBackgroundTask,\n\ttype IBackgroundTaskComponent,\n\ttype IScheduledTaskTime,\n\ttype ITaskSchedulerComponent\n} from \"@twin.org/background-task-models\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tArrayHelper,\n\tComponentFactory,\n\tConflictError,\n\tConverter,\n\tGeneralError,\n\tGuardError,\n\tGuards,\n\tIs,\n\tJsonHelper,\n\tNotFoundError,\n\tRandomHelper,\n\tUnprocessableError,\n\tValidation,\n\ttype IError,\n\ttype IValidationFailure\n} from \"@twin.org/core\";\nimport { Blake2b } from \"@twin.org/crypto\";\nimport { DataTypeHelper, JsonSchemaHelper } from \"@twin.org/data-core\";\nimport {\n\tJsonLdDataTypes,\n\tJsonLdHelper,\n\tJsonLdProcessor,\n\ttype IJsonLdContextDefinitionElement,\n\ttype IJsonLdNodeObject\n} from \"@twin.org/data-json-ld\";\nimport {\n\tActivityProcessingStatus,\n\tDataRequestType,\n\tDataspaceAppFactory,\n\tDataspaceContexts,\n\tDataspaceDataTypes,\n\tDataspaceTypes,\n\ttype IActivityLogDetails,\n\ttype IActivityLogEntry,\n\ttype IActivityLogStatusNotification,\n\ttype IActivityQuery,\n\ttype IDataAssetItemListResult,\n\ttype IDataAssetQuery,\n\ttype IDataRequest,\n\ttype IDataspaceActivity,\n\ttype IDataspaceApp,\n\ttype IDataspaceDataPlaneComponent,\n\ttype IEntitySet,\n\ttype IExecutionPayload,\n\ttype IFilteringQuery,\n\ttype ITaskApp,\n\ttype ITransferContext,\n\ttype TransferProcess\n} from \"@twin.org/dataspace-models\";\nimport { EngineCoreFactory } from \"@twin.org/engine-models\";\nimport { ComparisonOperator, LogicalOperator } from \"@twin.org/entity\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof, nameofKebabCase } from \"@twin.org/nameof\";\nimport type { IPolicyEnforcementPointComponent } from \"@twin.org/rights-management-models\";\nimport {\n\tDataspaceProtocolDataTypes,\n\tDataspaceProtocolTransferProcessStateType,\n\ttype IDataspaceProtocolAgreement,\n\ttype IDataspaceProtocolDataset\n} from \"@twin.org/standards-dataspace-protocol\";\nimport {\n\tSchemaOrgContexts,\n\tSchemaOrgDataTypes,\n\tSchemaOrgTypes\n} from \"@twin.org/standards-schema-org\";\nimport type { IActivityStreamsActivity } from \"@twin.org/standards-w3c-activity-streams\";\nimport { OdrlContexts } from \"@twin.org/standards-w3c-odrl\";\nimport { TrustHelper, type ITrustComponent } from \"@twin.org/trust-models\";\nimport type { ActivityLogDetails } from \"./entities/activityLogDetails.js\";\nimport type { ActivityTask } from \"./entities/activityTask.js\";\nimport type { IDataspaceDataPlaneServiceConstructorOptions } from \"./models/IDataspaceDataPlaneServiceConstructorOptions.js\";\n\n/**\n * Dataspace Data Plane Service.\n */\nexport class DataspaceDataPlaneService implements IDataspaceDataPlaneComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<DataspaceDataPlaneService>();\n\n\t/**\n\t * Milliseconds per minute (60 * 1000).\n\t * @internal\n\t */\n\tprivate static readonly _MS_PER_MINUTE: number = 60 * 1000;\n\n\t/**\n\t * Minutes per day (24 * 60 = 1440).\n\t * @internal\n\t */\n\tprivate static readonly _MINUTES_PER_DAY: number = 24 * 60;\n\n\t/**\n\t * Milliseconds per day (24 hours).\n\t * @internal\n\t */\n\tprivate static readonly _MS_PER_DAY: number = 24 * 60 * 60 * 1000;\n\n\t/**\n\t * The default cleanup interval in minutes. (1 hour)\n\t * @internal\n\t */\n\tprivate static readonly _DEFAULT_CLEANUP_INTERVAL: number = 60;\n\n\t/**\n\t * The default retain interval in minutes. (10 minutes)\n\t * @internal\n\t */\n\tprivate static readonly _DEFAULT_RETAIN_INTERVAL: number = 10;\n\n\t/**\n\t * Logging service type.\n\t * @internal\n\t */\n\tprivate readonly _loggingComponentType: string;\n\n\t/**\n\t * Logging service.\n\t * @internal\n\t */\n\tprivate readonly _logging?: ILoggingComponent;\n\n\t/**\n\t * Storage service for activity logging.\n\t * @internal\n\t */\n\tprivate readonly _entityStorageActivityLogs: IEntityStorageConnector<ActivityLogDetails>;\n\n\t/**\n\t * Storage service for activity tasks.\n\t * @internal\n\t */\n\tprivate readonly _entityStorageActivityTasks: IEntityStorageConnector<ActivityTask>;\n\n\t/**\n\t * Background Task Component.\n\t * @internal\n\t */\n\tprivate readonly _backgroundTaskComponent: IBackgroundTaskComponent;\n\n\t/**\n\t * Activity Log Status callbacks.\n\t * @internal\n\t */\n\tprivate readonly _activityLogStatusCallbacks: {\n\t\t[key: string]: (notification: IActivityLogStatusNotification) => Promise<void>;\n\t};\n\n\t/**\n\t * Task retention. -1 retain forever.\n\t * @internal\n\t */\n\tprivate readonly _retainTasksFor: number;\n\n\t/**\n\t * Activity Log Entry retention. -1 retain forever.\n\t * @internal\n\t */\n\tprivate readonly _retainActivityLogsFor: number;\n\n\t/**\n\t * Clean up interval for activity logs.\n\t * @internal\n\t */\n\tprivate readonly _activityLogCleanUpInterval: number;\n\n\t/**\n\t * Whether there is an ongoing clean up process.\n\t * @internal\n\t */\n\tprivate _cleanUpProcessOngoing: boolean;\n\n\t/**\n\t * The task scheduler used to clean up activity logs.\n\t * @internal\n\t */\n\tprivate readonly _taskScheduler: ITaskSchedulerComponent;\n\n\t/**\n\t * The keys to use from the context ids to create partitions.\n\t * @internal\n\t */\n\tprivate readonly _partitionContextIds?: string[];\n\n\t/**\n\t * The trust component.\n\t * @internal\n\t */\n\tprivate readonly _trustComponent: ITrustComponent;\n\n\t/**\n\t * The policy enforcement point for ODRL policy enforcement.\n\t * @internal\n\t */\n\tprivate readonly _policyEnforcementPoint?: IPolicyEnforcementPointComponent;\n\n\t/**\n\t * Entity storage for Transfer Process entities.\n\t * Used to read transfer state from shared storage (written by Control Plane).\n\t * @internal\n\t */\n\tprivate readonly _transferProcessStorage: IEntityStorageConnector<TransferProcess>;\n\n\t/**\n\t * The list of active tenants required for task cleanup.\n\t * @internal\n\t */\n\tprivate readonly _activeTenants: string[];\n\n\t/**\n\t * Create a new instance of DataspaceDataPlane.\n\t * @param options The options for the data plane.\n\t */\n\tconstructor(options?: IDataspaceDataPlaneServiceConstructorOptions) {\n\t\tthis._loggingComponentType = options?.loggingComponentType ?? \"logging\";\n\t\tthis._logging = ComponentFactory.getIfExists<ILoggingComponent>(this._loggingComponentType);\n\n\t\tthis._entityStorageActivityLogs = EntityStorageConnectorFactory.get<\n\t\t\tIEntityStorageConnector<ActivityLogDetails>\n\t\t>(options?.activityLogEntityStorageType ?? nameofKebabCase<ActivityLogDetails>());\n\n\t\tthis._entityStorageActivityTasks = EntityStorageConnectorFactory.get<\n\t\t\tIEntityStorageConnector<ActivityTask>\n\t\t>(options?.activityTaskEntityStorageType ?? nameofKebabCase<ActivityTask>());\n\n\t\tthis._backgroundTaskComponent = ComponentFactory.get(\n\t\t\toptions?.backgroundTaskComponentType ?? \"background-task\"\n\t\t);\n\n\t\tthis._taskScheduler = ComponentFactory.get<ITaskSchedulerComponent>(\n\t\t\toptions?.taskSchedulerComponentType ?? \"task-scheduler\"\n\t\t);\n\n\t\tthis._trustComponent = ComponentFactory.get<ITrustComponent>(\n\t\t\toptions?.trustComponentType ?? \"trust\"\n\t\t);\n\n\t\tthis._policyEnforcementPoint = ComponentFactory.getIfExists<IPolicyEnforcementPointComponent>(\n\t\t\toptions?.pepComponentType ?? \"policy-enforcement-point-service\"\n\t\t);\n\n\t\t// Entity storage for Transfer Process state lookup\n\t\t// Used to read transfer state from shared storage (written by Control Plane)\n\t\tthis._transferProcessStorage = EntityStorageConnectorFactory.get<\n\t\t\tIEntityStorageConnector<TransferProcess>\n\t\t>(options?.transferProcessEntityStorageType ?? nameofKebabCase<TransferProcess>());\n\n\t\tJsonLdDataTypes.registerTypes();\n\t\tDataspaceDataTypes.registerTypes();\n\t\tSchemaOrgDataTypes.registerRedirects();\n\t\tDataspaceProtocolDataTypes.registerRedirects();\n\t\tDataspaceProtocolDataTypes.registerTypes();\n\n\t\tthis._activityLogStatusCallbacks = {};\n\t\tthis._activeTenants = [];\n\t\tthis._partitionContextIds = options?.partitionContextIds;\n\n\t\tthis._retainTasksFor =\n\t\t\tDataspaceDataPlaneService._DEFAULT_RETAIN_INTERVAL * DataspaceDataPlaneService._MS_PER_MINUTE;\n\t\tthis._retainActivityLogsFor =\n\t\t\tDataspaceDataPlaneService._DEFAULT_RETAIN_INTERVAL * DataspaceDataPlaneService._MS_PER_MINUTE;\n\t\tthis._activityLogCleanUpInterval = DataspaceDataPlaneService._DEFAULT_CLEANUP_INTERVAL;\n\t\tthis._cleanUpProcessOngoing = false;\n\n\t\tconst validationErrors: IValidationFailure[] = [];\n\t\tif (!Is.empty(options?.config?.retainActivityLogsFor)) {\n\t\t\tGuards.integer(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tnameof(options.config.retainActivityLogsFor),\n\t\t\t\toptions.config.retainActivityLogsFor\n\t\t\t);\n\n\t\t\tif (options.config.retainActivityLogsFor === -1) {\n\t\t\t\tthis._retainTasksFor = -1;\n\t\t\t\tthis._retainActivityLogsFor = -1;\n\t\t\t} else {\n\t\t\t\tValidation.integer(\n\t\t\t\t\tnameof(options.config.retainActivityLogsFor),\n\t\t\t\t\toptions.config.retainActivityLogsFor,\n\t\t\t\t\tvalidationErrors,\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ minValue: 1 }\n\t\t\t\t);\n\t\t\t\t// Retention of internal tasks launched\n\t\t\t\t// 5 minutes of margin with respect to the Activity Log Entry to ensure proper removal\n\t\t\t\tthis._retainTasksFor =\n\t\t\t\t\t(options.config.retainActivityLogsFor + 5) * DataspaceDataPlaneService._MS_PER_MINUTE;\n\t\t\t\tthis._retainActivityLogsFor =\n\t\t\t\t\toptions.config.retainActivityLogsFor * DataspaceDataPlaneService._MS_PER_MINUTE;\n\t\t\t}\n\t\t}\n\n\t\tif (!Is.empty(options?.config?.activityLogsCleanUpInterval)) {\n\t\t\tGuards.integer(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tnameof(options.config.activityLogsCleanUpInterval),\n\t\t\t\toptions.config.activityLogsCleanUpInterval\n\t\t\t);\n\t\t\tValidation.integer(\n\t\t\t\tnameof(options.config.activityLogsCleanUpInterval),\n\t\t\t\toptions.config.activityLogsCleanUpInterval,\n\t\t\t\tvalidationErrors,\n\t\t\t\tundefined,\n\t\t\t\t{ minValue: 1 }\n\t\t\t);\n\t\t\tthis._activityLogCleanUpInterval = options.config.activityLogsCleanUpInterval;\n\t\t}\n\t\tValidation.asValidationError(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(options?.config),\n\t\t\tvalidationErrors\n\t\t);\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn DataspaceDataPlaneService.CLASS_NAME;\n\t}\n\n\t/**\n\t * The service needs to be started when the application is initialized.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t */\n\tpublic async start(nodeLoggingComponentType?: string): Promise<void> {\n\t\tconst engine = EngineCoreFactory.getIfExists(\"engine\");\n\t\tif (Is.empty(engine) || engine.isClone()) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"debug\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"engineCloneStart\"\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Only we have a task scheduler if there is a retention different than -1\n\t\tif (this._retainActivityLogsFor !== -1) {\n\t\t\tconst taskTime: IScheduledTaskTime[] = [\n\t\t\t\t{\n\t\t\t\t\tnextTriggerTime: Date.now() + 5000,\n\t\t\t\t\t...this.calculateCleaningTaskSchedule(this._activityLogCleanUpInterval)\n\t\t\t\t}\n\t\t\t];\n\n\t\t\tawait this._taskScheduler.addTask(\"dataspace-cleanup\", taskTime, async () => {\n\t\t\t\tawait this._logging?.log({\n\t\t\t\t\tlevel: \"debug\",\n\t\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\tmessage: \"scheduledCleanUpTask\"\n\t\t\t\t});\n\n\t\t\t\tawait this.cleanupActivityLog();\n\t\t\t});\n\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"debug\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"taskSchedulerStarted\",\n\t\t\t\tdata: {\n\t\t\t\t\ttaskTime\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Notify an Activity.\n\t * @param activity The Activity notified.\n\t * @returns The Activity's Log Entry identifier.\n\t */\n\tpublic async notifyActivity(activity: IActivityStreamsActivity): Promise<string> {\n\t\tGuards.object<IActivityStreamsActivity>(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(activity),\n\t\t\tactivity\n\t\t);\n\n\t\tawait this.updateActiveTenants();\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"debug\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tmessage: \"newActivity\",\n\t\t\tdata: {\n\t\t\t\tactivityType: activity.type,\n\t\t\t\tgenerator: this.calculateActivityGeneratorIdentity(activity)\n\t\t\t}\n\t\t});\n\n\t\t// We only validate that the activity conforms to Activity Streams Schema without entering into details\n\t\t// about the object, target or actor as they might be subject of custom validation rules\n\t\tconst typeId = `${DataspaceContexts.JsonSchemaNamespace}Dataspace${DataspaceTypes.Activity}`;\n\t\tconst activitySchema = await DataTypeHelper.getSchemaForType(typeId);\n\t\tif (Is.undefined(activitySchema)) {\n\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"schemaNotFound\", {\n\t\t\t\tschemaId: typeId\n\t\t\t});\n\t\t}\n\t\tconst validationFailures = await JsonSchemaHelper.validate(activitySchema, activity);\n\t\tValidation.asValidationError(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(activity),\n\t\t\tvalidationFailures\n\t\t);\n\n\t\t// Calculate Activity Log Entry Id\n\t\tconst canonical = JsonHelper.canonicalize(activity);\n\t\tconst canonicalBytes = Converter.utf8ToBytes(canonical);\n\t\tconst activityLogId = Converter.bytesToHex(Blake2b.sum256(canonicalBytes));\n\t\tconst activityLogEntryId = `urn:x-activity-log:${activityLogId}`;\n\n\t\t// Check if entry already exists\n\t\tconst existingLogEntry = await this._entityStorageActivityLogs.get(activityLogEntryId);\n\t\tlet existingSuccessfulApps: string[] = [];\n\t\tlet isRetry = false;\n\n\t\tif (!Is.undefined(existingLogEntry)) {\n\t\t\t// Check if there are failed tasks that can be retried\n\t\t\tconst existingEntry = await this.getActivityLogEntry(activityLogEntryId);\n\n\t\t\t// If all tasks completed successfully, this is a duplicate\n\t\t\tif (existingEntry.status === ActivityProcessingStatus.Completed) {\n\t\t\t\tthrow new ConflictError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"activityAlreadyNotified\",\n\t\t\t\t\tactivityLogEntryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If still processing then reject to avoid race conditions\n\t\t\tif (\n\t\t\t\texistingEntry.status === ActivityProcessingStatus.Pending ||\n\t\t\t\texistingEntry.status === ActivityProcessingStatus.Running ||\n\t\t\t\texistingEntry.status === ActivityProcessingStatus.Registering\n\t\t\t) {\n\t\t\t\tthrow new ConflictError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"activityStillProcessing\",\n\t\t\t\t\tactivityLogEntryId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Status is Error - prepare for retry\n\t\t\texistingSuccessfulApps = await this.prepareForRetry(activityLogEntryId, existingEntry);\n\t\t\tisRetry = true;\n\t\t} else {\n\t\t\tconst logEntry: IActivityLogDetails = {\n\t\t\t\tid: activityLogEntryId,\n\t\t\t\tactivityId: Is.string(activity.id) ? activity.id : undefined,\n\t\t\t\tgenerator: this.calculateActivityGeneratorIdentity(activity),\n\t\t\t\tdateCreated: new Date().toISOString(),\n\t\t\t\tdateModified: new Date().toISOString()\n\t\t\t};\n\t\t\tawait this._entityStorageActivityLogs.set(logEntry);\n\t\t}\n\n\t\tconst activityQuerySet = await this.calculateActivityQuerySet(activity as IDataspaceActivity);\n\n\t\tconst tasksScheduled: ITaskApp[] = [];\n\t\tconst dataspaceAppIds: string[] = [];\n\n\t\tfor (const query of activityQuerySet) {\n\t\t\tconst appIds = this.getAppForActivityQuery(query);\n\t\t\tfor (const appId of appIds) {\n\t\t\t\tif (!dataspaceAppIds.includes(appId)) {\n\t\t\t\t\tdataspaceAppIds.push(appId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const dataspaceAppId of dataspaceAppIds) {\n\t\t\t// Only process apps that haven't already completed successfully\n\t\t\tif (!existingSuccessfulApps.includes(dataspaceAppId)) {\n\t\t\t\tconst payload: IExecutionPayload = {\n\t\t\t\t\tactivityLogEntryId,\n\t\t\t\t\tactivity: activity as IDataspaceActivity,\n\t\t\t\t\texecutorApp: dataspaceAppId\n\t\t\t\t};\n\n\t\t\t\tconst taskType = Converter.bytesToHex(RandomHelper.generate(16));\n\t\t\t\tconst taskId = await this._backgroundTaskComponent.create<IExecutionPayload>(\n\t\t\t\t\ttaskType,\n\t\t\t\t\tpayload,\n\t\t\t\t\t{\n\t\t\t\t\t\tretainFor: this._retainTasksFor\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tawait this._backgroundTaskComponent.registerHandler<IExecutionPayload, unknown>(\n\t\t\t\t\ttaskType,\n\t\t\t\t\t\"@twin.org/dataspace-app-runner\",\n\t\t\t\t\t\"appRunner\",\n\t\t\t\t\tasync task => {\n\t\t\t\t\t\tawait this.finaliseTask(task);\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tinitialiseMethod: \"appRunnerStart\",\n\t\t\t\t\t\tshutdownMethod: \"appRunnerEnd\"\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\ttasksScheduled.push({\n\t\t\t\t\ttaskId,\n\t\t\t\t\tdataspaceAppId\n\t\t\t\t});\n\n\t\t\t\tawait this._logging?.log({\n\t\t\t\t\tlevel: \"info\",\n\t\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\tmessage: \"scheduledTask\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\tdataspaceAppId,\n\t\t\t\t\t\tisRetry\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst existingActivityTasks = isRetry\n\t\t\t? await this._entityStorageActivityTasks.get(activityLogEntryId)\n\t\t\t: undefined;\n\t\tconst existingTasksToKeep =\n\t\t\texistingActivityTasks?.associatedTasks.filter(t =>\n\t\t\t\texistingSuccessfulApps.includes(t.dataspaceAppId)\n\t\t\t) ?? [];\n\n\t\tawait this._entityStorageActivityTasks.set({\n\t\t\tactivityLogEntryId,\n\t\t\tassociatedTasks: [...existingTasksToKeep, ...tasksScheduled]\n\t\t});\n\n\t\treturn activityLogEntryId;\n\t}\n\n\t/**\n\t * Subscribes to the activity log.\n\t * @param callback The callback to be called when Activity Log is called.\n\t * @param subscriptionId The Subscription Id.\n\t * @returns The subscription Id.\n\t */\n\tpublic async subscribeToActivityLog(\n\t\tcallback: (notification: IActivityLogStatusNotification) => Promise<void>,\n\t\tsubscriptionId?: string\n\t): Promise<string> {\n\t\tGuards.function(DataspaceDataPlaneService.CLASS_NAME, nameof(callback), callback);\n\n\t\tconst theSubscriptionId = Is.stringValue(subscriptionId)\n\t\t\t? subscriptionId\n\t\t\t: Converter.bytesToHex(RandomHelper.generate(16));\n\t\tthis._activityLogStatusCallbacks[theSubscriptionId] = callback;\n\n\t\treturn theSubscriptionId;\n\t}\n\n\t/**\n\t * Subscribes to the activity log.\n\t * @param subscriptionId The Subscription Id.\n\t */\n\tpublic async unSubscribeToActivityLog(subscriptionId: string): Promise<void> {\n\t\tGuards.stringValue(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(subscriptionId),\n\t\t\tsubscriptionId\n\t\t);\n\t\tdelete this._activityLogStatusCallbacks[subscriptionId];\n\t}\n\n\t/**\n\t * Returns the activity processing details of an activity.\n\t * @param logEntryId The Id of the Activity Log Entry (a URI).\n\t * @returns the Activity Log Entry with the processing details.\n\t * @throws NotFoundError if activity log entry is not known.\n\t */\n\tpublic async getActivityLogEntry(logEntryId: string): Promise<IActivityLogEntry> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(logEntryId), logEntryId);\n\n\t\tconst result = await this._entityStorageActivityLogs.get(logEntryId);\n\t\tif (Is.undefined(result)) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"activityLogEntryNotFound\",\n\t\t\t\tlogEntryId\n\t\t\t);\n\t\t}\n\n\t\tlet pendingTasks: IActivityLogEntry[\"pendingTasks\"];\n\t\tlet runningTasks: IActivityLogEntry[\"runningTasks\"];\n\t\tlet finalizedTasks: IActivityLogEntry[\"finalizedTasks\"];\n\t\tlet inErrorTasks: IActivityLogEntry[\"inErrorTasks\"];\n\n\t\t// For calculating the processing status. `Registering` if we cannot determine the activity tasks yet\n\t\tlet status: ActivityProcessingStatus = ActivityProcessingStatus.Registering;\n\n\t\t// Now query the associated tasks\n\t\tconst activityTasks = await this._entityStorageActivityTasks.get(logEntryId);\n\n\t\t// If activity tasks is undefined it is because the corresponding store has not been persisted yet\n\t\tif (!Is.undefined(activityTasks)) {\n\t\t\tpendingTasks = [];\n\t\t\trunningTasks = [];\n\t\t\tfinalizedTasks = [];\n\t\t\tinErrorTasks = [];\n\n\t\t\tfor (const entity of activityTasks.associatedTasks) {\n\t\t\t\tconst taskDetails = await this._backgroundTaskComponent.get<IExecutionPayload, unknown>(\n\t\t\t\t\tentity.taskId\n\t\t\t\t);\n\n\t\t\t\tif (Is.object(taskDetails)) {\n\t\t\t\t\tswitch (taskDetails.status) {\n\t\t\t\t\t\tcase TaskStatus.Success:\n\t\t\t\t\t\t\tfinalizedTasks.push({\n\t\t\t\t\t\t\t\t...entity,\n\t\t\t\t\t\t\t\tresult: JSON.stringify(taskDetails.result),\n\t\t\t\t\t\t\t\tstartDate: taskDetails?.dateCreated,\n\t\t\t\t\t\t\t\tendDate: taskDetails?.dateCompleted\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TaskStatus.Pending:\n\t\t\t\t\t\t\tpendingTasks.push(entity);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TaskStatus.Processing:\n\t\t\t\t\t\t\trunningTasks.push({ ...entity, startDate: taskDetails.dateCreated });\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TaskStatus.Failed:\n\t\t\t\t\t\t\tinErrorTasks.push({\n\t\t\t\t\t\t\t\t...entity,\n\t\t\t\t\t\t\t\terror: taskDetails.error as IError\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TaskStatus.Cancelled:\n\t\t\t\t\t\t\t// Nothing to do for cancelled tasks\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Is.arrayValue(inErrorTasks)) {\n\t\t\t\tstatus = ActivityProcessingStatus.Error;\n\t\t\t} else if (Is.arrayValue(runningTasks)) {\n\t\t\t\tstatus = ActivityProcessingStatus.Running;\n\t\t\t} else if (Is.arrayValue(pendingTasks)) {\n\t\t\t\tstatus = ActivityProcessingStatus.Pending;\n\t\t\t} else {\n\t\t\t\tstatus = ActivityProcessingStatus.Completed;\n\t\t\t}\n\t\t}\n\t\treturn { ...result, status, pendingTasks, runningTasks, finalizedTasks, inErrorTasks };\n\t}\n\n\t/**\n\t * Get Data Asset entities. Allows to retrieve entities by their type or id.\n\t * @param entitySet The set of entities to be retrieved.\n\t * @param entitySet.jsonLdContext The JSON-LD Context to be used to expand the referred entityType.\n\t * @param consumerPid The consumer Process ID from the DSP Transfer Process.\n\t * Used to resolve datasetId from the Transfer Process.\n\t * @param cursor Pagination details - cursor.\n\t * @param limit Pagination details - max number of entities.\n\t * @param trustPayload Trust payload to verify the requesters identity.\n\t * @returns The entities requested as a JSON-LD Document.\n\t */\n\tpublic async getDataAssetEntities(\n\t\tentitySet: IEntitySet & {\n\t\t\tjsonLdContext?: IJsonLdContextDefinitionElement[];\n\t\t},\n\t\tconsumerPid: string,\n\t\tcursor?: string,\n\t\tlimit?: number,\n\t\ttrustPayload?: unknown\n\t): Promise<IDataAssetItemListResult> {\n\t\tGuards.object<IEntitySet>(DataspaceDataPlaneService.CLASS_NAME, nameof(entitySet), entitySet);\n\t\tGuards.string(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(entitySet.entityType),\n\t\t\tentitySet.entityType\n\t\t);\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"getDataAssetEntities\"\n\t\t);\n\n\t\tconst dataConsumerIdentity = trustInfo.identity;\n\t\tGuards.stringValue(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(dataConsumerIdentity),\n\t\t\tdataConsumerIdentity\n\t\t);\n\n\t\t// Use consumerPid to resolve datasetId via Transfer Process\n\t\t// This validates the transfer token, state, and extracts datasetId\n\t\tconst transferContext = await this.validateTransfer(consumerPid, trustPayload);\n\t\tconst resolvedDatasetId = transferContext.datasetId;\n\n\t\tconst serviceDataset = await this.getDatasetFromApps(resolvedDatasetId);\n\n\t\t// Expand entity type if LD context provided\n\t\tlet finalType: string | undefined = entitySet.entityType;\n\t\tif (!Is.undefined(entitySet.jsonLdContext)) {\n\t\t\tconst auxiliaryObj = {\n\t\t\t\t\"@context\": entitySet.jsonLdContext,\n\t\t\t\t\"@type\": entitySet.entityType\n\t\t\t};\n\t\t\tconst expanded = (await JsonLdProcessor.expand(auxiliaryObj))[0];\n\t\t\tfinalType = expanded[\"@type\"]?.[0];\n\t\t}\n\n\t\tif (Is.undefined(finalType)) {\n\t\t\tthrow new GuardError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"notExpandableType\",\n\t\t\t\tnameof(entitySet.entityType),\n\t\t\t\tentitySet.entityType\n\t\t\t);\n\t\t}\n\n\t\tconst datasetId = serviceDataset[\"@id\"];\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(datasetId), datasetId);\n\t\tconst appId = await this.getAppForDataAssetQuery({ datasetId });\n\n\t\t// getAppForDataAssetQuery already validates app exists\n\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appId);\n\n\t\tconst handleDataRequest = app.handleDataRequest?.bind(app);\n\t\tGuards.function(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(handleDataRequest),\n\t\t\thandleDataRequest\n\t\t);\n\n\t\tconst dataRequest: IDataRequest = {\n\t\t\ttype: DataRequestType.DataAssetEntities,\n\t\t\tdataAsset: serviceDataset,\n\t\t\tentitySet: {\n\t\t\t\tentityType: finalType,\n\t\t\t\tentityId: entitySet.entityId\n\t\t\t}\n\t\t};\n\n\t\tconst { data, cursor: cursorResult } = await handleDataRequest(dataRequest, cursor, limit);\n\n\t\tlet finalData: IJsonLdNodeObject[];\n\t\tif (Is.array(data)) {\n\t\t\tfinalData = data;\n\t\t} else {\n\t\t\tfinalData = [data as IJsonLdNodeObject];\n\t\t}\n\n\t\tconst itemList = {\n\t\t\t\"@context\": SchemaOrgContexts.Context,\n\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\titemListElement: finalData\n\t\t};\n\n\t\tlet result: IDataAssetItemListResult = {\n\t\t\titemList,\n\t\t\tcursor: cursorResult\n\t\t};\n\n\t\t// Apply policy filters from Agreement\n\t\tif (transferContext?.agreement) {\n\t\t\tconst filtered = await this.applyPolicyFilters(result, transferContext.agreement);\n\t\t\tif (filtered.itemList) {\n\t\t\t\tresult = filtered;\n\t\t\t} else {\n\t\t\t\tresult.itemList[SchemaOrgTypes.ItemListElement] = [];\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Queries a data asset controlled by this Dataspace App.\n\t * @param consumerPid The consumer Process ID from the DSP Transfer Process.\n\t * Used to resolve datasetId from the Transfer Process.\n\t * @param query The filtering query.\n\t * @param cursor Pagination details - cursor.\n\t * @param limit Pagination details - max number of entities.\n\t * @param trustPayload Trust payload to verify the requesters identity.\n\t * @returns The item list and optional cursor for pagination via Link headers.\n\t */\n\tpublic async queryDataAsset(\n\t\tconsumerPid: string,\n\t\tquery: IFilteringQuery,\n\t\tcursor?: string,\n\t\tlimit?: number,\n\t\ttrustPayload?: unknown\n\t): Promise<IDataAssetItemListResult> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\t\tGuards.object(DataspaceDataPlaneService.CLASS_NAME, nameof(query), query);\n\t\tGuards.string(DataspaceDataPlaneService.CLASS_NAME, nameof(query.type), query.type);\n\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"queryDataAsset\"\n\t\t);\n\n\t\tconst dataConsumerIdentity = trustInfo.identity;\n\t\tGuards.stringValue(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(dataConsumerIdentity),\n\t\t\tdataConsumerIdentity\n\t\t);\n\n\t\t// Use consumerPid to resolve datasetId via Transfer Process\n\t\t// This validates the transfer token, state, and extracts datasetId\n\t\tconst transferContext = await this.validateTransfer(consumerPid, trustPayload);\n\t\tconst resolvedDatasetId = transferContext.datasetId;\n\n\t\tconst serviceDataset = await this.getDatasetFromApps(resolvedDatasetId);\n\n\t\tconst datasetId = serviceDataset[\"@id\"];\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(datasetId), datasetId);\n\t\tconst appId = await this.getAppForDataAssetQuery({ datasetId });\n\n\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appId);\n\n\t\tif (!app.supportedQueryTypes().includes(query.type)) {\n\t\t\tthrow new UnprocessableError(DataspaceDataPlaneService.CLASS_NAME, \"queryTypeNotSupported\", {\n\t\t\t\tqueryType: query.type\n\t\t\t});\n\t\t}\n\n\t\tconst dataRequest: IDataRequest = {\n\t\t\ttype: DataRequestType.QueryDataAsset,\n\t\t\tdataAsset: serviceDataset,\n\t\t\tquery\n\t\t};\n\n\t\tconst handleDataRequest = app.handleDataRequest?.bind(app);\n\t\tGuards.function(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\tnameof(handleDataRequest),\n\t\t\thandleDataRequest\n\t\t);\n\n\t\tconst { data, cursor: cursorResult } = await handleDataRequest(dataRequest, cursor, limit);\n\n\t\tlet finalData: IJsonLdNodeObject[];\n\t\tif (Is.array(data)) {\n\t\t\tfinalData = data;\n\t\t} else {\n\t\t\tfinalData = [data as IJsonLdNodeObject];\n\t\t}\n\n\t\tconst itemList = {\n\t\t\t\"@context\": SchemaOrgContexts.Context,\n\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\titemListElement: finalData\n\t\t};\n\n\t\tlet result: IDataAssetItemListResult = {\n\t\t\titemList,\n\t\t\tcursor: cursorResult\n\t\t};\n\n\t\t// Apply policy filters from Agreement if using consumerPid flow\n\t\tif (transferContext?.agreement) {\n\t\t\tconst filtered = await this.applyPolicyFilters(result, transferContext.agreement);\n\t\t\tif (filtered.itemList) {\n\t\t\t\tresult = filtered;\n\t\t\t} else {\n\t\t\t\tresult.itemList[SchemaOrgTypes.ItemListElement] = [];\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Validate transfer authorization for data requests.\n\t * Reads directly from shared TransferProcess entity storage.\n\t * @param consumerPid The consumer process ID from the transfer request.\n\t * @param trustPayload The trust payload for verification (validates signature and expiry).\n\t * @returns The transfer context containing datasetId, agreement, and other transfer details.\n\t * @throws GeneralError if transfer process storage is not configured.\n\t * @throws NotFoundError if transfer process is not found.\n\t * @throws UnauthorizedError if trust verification fails.\n\t * @throws GeneralError if transfer is not in STARTED state.\n\t */\n\tpublic async validateTransfer(\n\t\tconsumerPid: string,\n\t\ttrustPayload: unknown\n\t): Promise<ITransferContext> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\t// Verify trust payload (validates JWT signature, expiry, and returns verification info)\n\t\t// The trust verifier handles all token validation including expiry\n\t\tawait TrustHelper.verifyTrust(this._trustComponent, trustPayload, \"validateTransfer\");\n\n\t\t// Direct lookup from shared entity storage by consumerPid (which is the primary key)\n\t\tconst transferProcess = await this._transferProcessStorage.get(consumerPid);\n\n\t\tif (!transferProcess) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"transferProcessNotFound\",\n\t\t\t\tconsumerPid\n\t\t\t);\n\t\t}\n\n\t\t// Validate state: must be STARTED\n\t\tif (transferProcess.state !== DataspaceProtocolTransferProcessStateType.STARTED) {\n\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"transferNotInStartedState\", {\n\t\t\t\tcurrentState: transferProcess.state\n\t\t\t});\n\t\t}\n\n\t\t// Validate datasetId is present\n\t\tif (!Is.stringValue(transferProcess.datasetId)) {\n\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"transferMissingDatasetId\");\n\t\t}\n\n\t\treturn this.buildTransferContext(transferProcess);\n\t}\n\n\t// ============================================================================\n\t// PRIVATE HELPER METHODS\n\t// ============================================================================\n\n\t/**\n\t * Calculates the activity generator from the generator or actor fields.\n\t * @param activity The activity.\n\t * @returns The generator's identity.\n\t * @throws General Error if no identity is found.\n\t * @internal\n\t */\n\tprivate calculateActivityGeneratorIdentity(activity: IActivityStreamsActivity): string {\n\t\tif (Is.stringValue(activity.generator)) {\n\t\t\treturn activity.generator;\n\t\t}\n\n\t\tif (Is.object<IJsonLdNodeObject>(activity.generator) && Is.stringValue(activity.generator.id)) {\n\t\t\treturn activity.generator.id;\n\t\t}\n\n\t\tif (Is.stringValue(activity.actor)) {\n\t\t\treturn activity.actor;\n\t\t}\n\n\t\tif (Is.object<IJsonLdNodeObject>(activity.actor) && Is.stringValue(activity.actor.id)) {\n\t\t\treturn activity.actor.id;\n\t\t}\n\n\t\tthrow new GuardError(\n\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\"invalidActivityGeneratorIdentity\",\n\t\t\tnameof(activity.generator),\n\t\t\t{\n\t\t\t\tgenerator: activity.generator,\n\t\t\t\tactor: activity.actor\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Process activity task finalization.\n\t * @param proofEntity The proof entity to process.\n\t * @internal\n\t */\n\tprivate async finaliseTask(task: IBackgroundTask<IExecutionPayload, unknown>): Promise<void> {\n\t\tconst payload = task.payload;\n\n\t\tif (Is.empty(payload)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activityLogEntry = await this._entityStorageActivityLogs.get(payload.activityLogEntryId);\n\t\tif (Is.undefined(activityLogEntry)) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"unknownActivityLogEntryId\",\n\t\t\t\tdata: {\n\t\t\t\t\tactivityLogEntryId: payload.activityLogEntryId\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (task.status === TaskStatus.Success || task.status === TaskStatus.Failed) {\n\t\t\tfor (const callback of Object.values(this._activityLogStatusCallbacks)) {\n\t\t\t\tawait callback({\n\t\t\t\t\tactivityLogEntryId: payload.activityLogEntryId,\n\t\t\t\t\tactivityId: Is.string(payload.activity.id) ? payload.activity.id : undefined,\n\t\t\t\t\ttaskProcessingStatus: {\n\t\t\t\t\t\tdataspaceAppId: payload.executorApp,\n\t\t\t\t\t\ttaskId: task.id,\n\t\t\t\t\t\ttaskStatus: task.status\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Now let's see if the full activity processing has completed, if so the entry must be marked for retention\n\t\t\tif (this._retainActivityLogsFor !== -1) {\n\t\t\t\tconst entry = await this.getActivityLogEntry(payload.activityLogEntryId);\n\t\t\t\tif (\n\t\t\t\t\tentry.status === ActivityProcessingStatus.Completed ||\n\t\t\t\t\tentry.status === ActivityProcessingStatus.Error\n\t\t\t\t) {\n\t\t\t\t\tconst retainUntil = Date.now() + this._retainActivityLogsFor;\n\t\t\t\t\tawait this._entityStorageActivityLogs.set({\n\t\t\t\t\t\tid: entry.id,\n\t\t\t\t\t\tactivityId: entry.activityId,\n\t\t\t\t\t\tgenerator: entry.generator,\n\t\t\t\t\t\tdateCreated: entry.dateCreated,\n\t\t\t\t\t\tdateModified: entry.dateModified,\n\t\t\t\t\t\tretainUntil,\n\t\t\t\t\t\tretryCount: entry.retryCount\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Updates the list of active tenants for cleanup tasks.\n\t * @internal\n\t */\n\tprivate async updateActiveTenants(): Promise<void> {\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst tenantId = contextIds?.[ContextIdKeys.Tenant];\n\t\tif (Is.stringValue(tenantId) && !this._activeTenants.includes(tenantId)) {\n\t\t\tthis._activeTenants.push(tenantId);\n\t\t}\n\t}\n\n\t/**\n\t * Cleans up the activity log by deleting those entries that no longer shall be retained.\n\t * @internal\n\t */\n\tprivate async cleanupActivityLog(): Promise<void> {\n\t\tif (this._cleanUpProcessOngoing) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"debug\",\n\t\t\t\tmessage: \"cleanUpOngoing\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis._cleanUpProcessOngoing = true;\n\n\t\tlet numRecordsDeleted = 0;\n\n\t\tif (this._partitionContextIds?.includes(ContextIdKeys.Tenant)) {\n\t\t\t// The cleanup must be done tenant by tenant\n\t\t\t// as the data behind the scenes might be partitioned\n\t\t\tfor (const tenantId of this._activeTenants) {\n\t\t\t\tconst localContextIds = (await ContextIdStore.getContextIds()) ?? {};\n\t\t\t\tlocalContextIds[ContextIdKeys.Tenant] = tenantId;\n\n\t\t\t\tawait ContextIdStore.run(localContextIds, async () => {\n\t\t\t\t\tnumRecordsDeleted += await this.cleanupActivityLogPartition();\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tnumRecordsDeleted += await this.cleanupActivityLogPartition();\n\t\t}\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"debug\",\n\t\t\tmessage: \"activityLogCleanedUp\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tdata: {\n\t\t\t\tnumRecordsDeleted\n\t\t\t}\n\t\t});\n\n\t\tthis._cleanUpProcessOngoing = false;\n\t}\n\n\t/**\n\t * Cleans up the activity log partition for the current context ids.\n\t * @returns The number of records deleted in this partition.\n\t * @internal\n\t */\n\tprivate async cleanupActivityLogPartition(): Promise<number> {\n\t\tlet numRecordsDeleted = 0;\n\n\t\ttry {\n\t\t\tlet cursor: string | undefined;\n\t\t\tconst now = Date.now();\n\n\t\t\tdo {\n\t\t\t\tconst result = await this._entityStorageActivityLogs.query({\n\t\t\t\t\tconditions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"retainUntil\",\n\t\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t\t\tcomparison: ComparisonOperator.GreaterThan\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"retainUntil\",\n\t\t\t\t\t\t\tvalue: now,\n\t\t\t\t\t\t\tcomparison: ComparisonOperator.LessThan\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\tlogicalOperator: LogicalOperator.And\n\t\t\t\t});\n\t\t\t\tcursor = result.cursor;\n\n\t\t\t\tfor (const entity of result.entities) {\n\t\t\t\t\tconst logEntryDetails = await this.getActivityLogEntry(entity.id as string);\n\t\t\t\t\tif (\n\t\t\t\t\t\tlogEntryDetails.status === ActivityProcessingStatus.Completed ||\n\t\t\t\t\t\tlogEntryDetails.status === ActivityProcessingStatus.Error\n\t\t\t\t\t) {\n\t\t\t\t\t\tawait this._entityStorageActivityLogs.remove(entity.id as string);\n\t\t\t\t\t\tawait this._entityStorageActivityTasks.remove(entity.id as string);\n\t\t\t\t\t\tnumRecordsDeleted++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (Is.stringValue(cursor));\n\t\t} catch {\n\t\t\t// If cleaning up the retained items fail we don't really care, they will get cleaned up on the next sweep.\n\t\t}\n\t\treturn numRecordsDeleted;\n\t}\n\n\t/**\n\t * Calculates the (Activity, Object, Target) query set.\n\t * @param activity The object representing the Activity.\n\t * @returns the (Activity, Object, Target) query set.\n\t * @internal\n\t */\n\tprivate async calculateActivityQuerySet(activity: IDataspaceActivity): Promise<IActivityQuery[]> {\n\t\tconst activityTypes = await JsonLdHelper.getType(activity);\n\t\tlet objectTypes: string[] = [];\n\n\t\tconst objects = ArrayHelper.fromObjectOrArray<IJsonLdNodeObject>(activity.object);\n\t\tfor (const object of objects) {\n\t\t\tobjectTypes = objectTypes.concat(await JsonLdHelper.getType(object));\n\t\t}\n\n\t\tlet targetTypes: string[] = [\"\"];\n\t\tif (Is.object<IJsonLdNodeObject>(activity.target)) {\n\t\t\ttargetTypes = await JsonLdHelper.getType(activity.target);\n\t\t}\n\n\t\tconst result: IActivityQuery[] = [];\n\n\t\tfor (const activityType of activityTypes) {\n\t\t\tfor (const objectType of objectTypes) {\n\t\t\t\tfor (const targetType of targetTypes) {\n\t\t\t\t\tconst query: IActivityQuery = {\n\t\t\t\t\t\tactivityType,\n\t\t\t\t\t\tobjectType,\n\t\t\t\t\t\ttargetType: !Is.stringValue(targetType) ? undefined : targetType\n\t\t\t\t\t};\n\n\t\t\t\t\tresult.push(query);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Calculates the cleaning task schedule.\n\t * @param minutes The period in minutes.\n\t * @returns The cleaning task schedule.\n\t * @internal\n\t */\n\tprivate calculateCleaningTaskSchedule(minutes: number): IScheduledTaskTime {\n\t\tlet minutesRemain = minutes;\n\n\t\tconst days = Math.floor(minutesRemain / DataspaceDataPlaneService._MINUTES_PER_DAY);\n\t\tminutesRemain %= DataspaceDataPlaneService._MINUTES_PER_DAY;\n\n\t\tconst hours = Math.floor(minutesRemain / 60);\n\t\tminutesRemain %= 60;\n\n\t\treturn { intervalDays: days, intervalHours: hours, intervalMinutes: minutesRemain };\n\t}\n\n\t/**\n\t * Returns an App for a (Activity, Object, Target).\n\t * @param activityQuery The (Activity, Object, Target) query specified using a FQN.\n\t * @returns The Dataspace Data Plane Apps or empty list if nothing is registered.\n\t * @internal\n\t */\n\tprivate getAppForActivityQuery(activityQuery: IActivityQuery): string[] {\n\t\tconst matchingElements: string[] = [];\n\t\tconst appNames = DataspaceAppFactory.names();\n\n\t\tfor (const appId of appNames) {\n\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appId);\n\t\t\tconst appQueries = app.activitiesHandled();\n\n\t\t\tfor (const appQuery of appQueries) {\n\t\t\t\tif (\n\t\t\t\t\tappQuery.objectType === activityQuery.objectType &&\n\t\t\t\t\t(Is.undefined(appQuery.activityType) ||\n\t\t\t\t\t\tappQuery.activityType === activityQuery.activityType) &&\n\t\t\t\t\t(Is.undefined(appQuery.targetType) || appQuery.targetType === activityQuery.targetType)\n\t\t\t\t) {\n\t\t\t\t\t// Avoid duplicates. Only one DS App can be executed per activity\n\t\t\t\t\tif (!matchingElements.includes(appId)) {\n\t\t\t\t\t\tmatchingElements.push(appId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn matchingElements;\n\t}\n\n\t/**\n\t * Get a dataset from registered apps by its ID.\n\t * @param datasetId The dataset identifier (@id)\n\t * @returns The dataset\n\t * @throws NotFoundError if no app handles this dataset\n\t * @internal\n\t */\n\tprivate async getDatasetFromApps(datasetId: string): Promise<IDataspaceProtocolDataset> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(datasetId), datasetId);\n\t\tconst appNames = DataspaceAppFactory.names();\n\n\t\tfor (const appId of appNames) {\n\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appId);\n\t\t\tconst datasets = await app.datasetsHandled();\n\t\t\tconst dataset = datasets.find(d => d[\"@id\"] === datasetId);\n\t\t\tif (dataset) {\n\t\t\t\treturn dataset;\n\t\t\t}\n\t\t}\n\n\t\tthrow new NotFoundError(DataspaceDataPlaneService.CLASS_NAME, \"noAppRegistered\", datasetId, {\n\t\t\tdatasetId\n\t\t});\n\t}\n\n\t/**\n\t * Returns an App for a Data Asset query (datasetId, ...).\n\t * @param dataAssetQuery The data asset query.\n\t * @returns The Dataspace Data Plane App ID.\n\t * @internal\n\t */\n\tprivate async getAppForDataAssetQuery(dataAssetQuery: IDataAssetQuery): Promise<string> {\n\t\tconst matchingElements: string[] = [];\n\t\tconst appNames = DataspaceAppFactory.names();\n\n\t\tfor (const appId of appNames) {\n\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appId);\n\t\t\tconst datasets = await app.datasetsHandled();\n\n\t\t\tfor (const dataset of datasets) {\n\t\t\t\tif (dataset[\"@id\"] === dataAssetQuery.datasetId) {\n\t\t\t\t\tmatchingElements.push(appId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (matchingElements.length > 1) {\n\t\t\tconst error = new ConflictError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"tooManyAppsRegistered\",\n\t\t\t\tdataAssetQuery.datasetId,\n\t\t\t\tmatchingElements,\n\t\t\t\t{\n\t\t\t\t\tdatasetId: dataAssetQuery.datasetId\n\t\t\t\t}\n\t\t\t);\n\t\t\tawait this._logging?.log({\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: \"tooManyAppsRegistered\",\n\t\t\t\terror,\n\t\t\t\tdata: {\n\t\t\t\t\tdatasetId: dataAssetQuery.datasetId\n\t\t\t\t}\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (!Is.arrayValue(matchingElements)) {\n\t\t\tconst error = new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"noAppRegistered\",\n\t\t\t\tdataAssetQuery.datasetId,\n\t\t\t\t{\n\t\t\t\t\tdatasetId: dataAssetQuery.datasetId\n\t\t\t\t}\n\t\t\t);\n\t\t\tawait this._logging?.log({\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: \"noAppRegistered\",\n\t\t\t\terror,\n\t\t\t\tdata: {\n\t\t\t\t\tdatasetId: dataAssetQuery.datasetId\n\t\t\t\t}\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn matchingElements[0];\n\t}\n\n\t/**\n\t * Prepare an activity for retry by updating metadata and returning apps to skip.\n\t * @param activityLogEntryId The activity log entry ID.\n\t * @param existingEntry The existing activity log entry with error status.\n\t * @returns Array of app IDs that already succeeded and should be skipped.\n\t * @internal\n\t */\n\tprivate async prepareForRetry(\n\t\tactivityLogEntryId: string,\n\t\texistingEntry: IActivityLogEntry\n\t): Promise<string[]> {\n\t\tconst appsToRetry = existingEntry.inErrorTasks?.map(t => t.dataspaceAppId) ?? [];\n\n\t\tif (!Is.arrayValue(appsToRetry)) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"noFailedTasksToRetry\",\n\t\t\t\tactivityLogEntryId\n\t\t\t);\n\t\t}\n\n\t\tconst successfulApps = existingEntry.finalizedTasks?.map(t => t.dataspaceAppId) ?? [];\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"debug\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tmessage: \"replacingFailedTasks\",\n\t\t\tdata: {\n\t\t\t\tactivityLogEntryId,\n\t\t\t\tappsToRetry,\n\t\t\t\tsuccessfulApps\n\t\t\t}\n\t\t});\n\n\t\tconst logEntry = await this._entityStorageActivityLogs.get(activityLogEntryId);\n\t\tif (logEntry) {\n\t\t\tlogEntry.dateModified = new Date().toISOString();\n\t\t\t// Extend retention to allow retry to complete\n\t\t\tif (this._retainActivityLogsFor !== -1) {\n\t\t\t\tlogEntry.retainUntil = Date.now() + this._retainActivityLogsFor;\n\t\t\t}\n\t\t\t// Monitoring purposes\n\t\t\tlogEntry.retryCount = (logEntry.retryCount ?? 0) + 1;\n\t\t\tawait this._entityStorageActivityLogs.set(logEntry);\n\t\t}\n\n\t\treturn successfulApps;\n\t}\n\n\t/**\n\t * Build transfer context from a TransferProcessEntity.\n\t * @param transferProcess The transfer process entity.\n\t * @returns The transfer context for use by data access methods.\n\t * @internal\n\t */\n\tprivate buildTransferContext(transferProcess: TransferProcess): ITransferContext {\n\t\t// Build the IDataspaceProtocolAgreement from stored data\n\t\t// The entity stores agreementId and policies separately\n\t\t//\n\t\t// NOTE: Currently policies are cached in the TransferProcessEntity at transfer start time.\n\t\t// Eventually, this should fetch fresh policies from Rights Management (PAP) using:\n\t\t// const freshAgreement = await this._policyAdministrationPoint.get(transferProcess.agreementId);\n\t\t// This would ensure policies are always up-to-date and support dynamic policy updates.\n\t\tconst agreement: IDataspaceProtocolAgreement = {\n\t\t\t\"@context\": OdrlContexts.Context,\n\t\t\t\"@type\": \"Agreement\",\n\t\t\t\"@id\": transferProcess.agreementId,\n\t\t\ttarget: transferProcess.datasetId,\n\t\t\t// Provider is the assigner, consumer is the assignee\n\t\t\tassigner: transferProcess.providerIdentity ?? \"\",\n\t\t\tassignee: transferProcess.consumerIdentity ?? \"\"\n\t\t};\n\n\t\t// Extract policies from the stored Agreement\n\t\t// Extract permission, prohibition, and obligation\n\t\tif (Is.arrayValue(transferProcess.policies)) {\n\t\t\tconst storedAgreement = transferProcess.policies[0] as\n\t\t\t\t| IDataspaceProtocolAgreement\n\t\t\t\t| undefined;\n\t\t\tif (storedAgreement) {\n\t\t\t\tagreement.permission = storedAgreement.permission;\n\t\t\t\tagreement.prohibition = storedAgreement.prohibition;\n\t\t\t\tagreement.obligation = storedAgreement.obligation;\n\t\t\t}\n\t\t}\n\n\t\tconst state = transferProcess.state;\n\t\tconst dataAddress = transferProcess.dataAddress;\n\n\t\treturn {\n\t\t\tconsumerPid: transferProcess.consumerPid,\n\t\t\tproviderPid: transferProcess.providerPid,\n\t\t\tagreement,\n\t\t\tdatasetId: transferProcess.datasetId,\n\t\t\tofferId: transferProcess.offerId,\n\t\t\tstate,\n\t\t\tconsumerIdentity: transferProcess.consumerIdentity,\n\t\t\tproviderIdentity: transferProcess.providerIdentity,\n\t\t\tdataAddress\n\t\t};\n\t}\n\n\t/**\n\t * Apply ODRL policy enforcement to query results.\n\t * Delegates to the Policy Enforcement Point (PEP) which coordinates\n\t * PDP, arbiters, and enforcement processors.\n\t * @param result The data asset item list result to filter.\n\t * @param agreement The ODRL Agreement containing policies.\n\t * @returns The result with policies applied.\n\t * @internal\n\t */\n\tprivate async applyPolicyFilters(\n\t\tresult: IDataAssetItemListResult,\n\t\tagreement?: IDataspaceProtocolAgreement\n\t): Promise<IDataAssetItemListResult> {\n\t\tif (!agreement || !this._policyEnforcementPoint) {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst processed =\n\t\t\tawait this._policyEnforcementPoint.interceptWithPolicy<IDataAssetItemListResult>(\n\t\t\t\tagreement,\n\t\t\t\tresult\n\t\t\t);\n\n\t\tif (Is.arrayValue(agreement.obligation)) {\n\t\t\tawait this.logObligations(agreement.obligation, agreement[\"@id\"]);\n\t\t}\n\n\t\treturn processed;\n\t}\n\n\t/**\n\t * Log ODRL obligations for auditing purposes.\n\t * Obligations are duties that must be fulfilled as part of the agreement.\n\t * @param obligations The obligation rules from the Agreement.\n\t * @param agreementId The agreement ID for reference.\n\t * @internal\n\t */\n\tprivate async logObligations(\n\t\tobligations: IDataspaceProtocolAgreement[\"obligation\"],\n\t\tagreementId: string\n\t): Promise<void> {\n\t\tif (!Is.arrayValue(obligations)) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const obligation of obligations) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"policyObligationTriggered\",\n\t\t\t\tdata: {\n\t\t\t\t\tagreementId,\n\t\t\t\t\taction: obligation.action,\n\t\t\t\t\ttarget: obligation.target,\n\t\t\t\t\tassignee: obligation.assignee\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}\n"]}
|
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.3-next.19](https://github.com/twinfoundation/dataspace/compare/dataspace-data-plane-service-v0.0.3-next.18...dataspace-data-plane-service-v0.0.3-next.19) (2026-03-12)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* improve validation ([#82](https://github.com/twinfoundation/dataspace/issues/82)) ([8bfaf7b](https://github.com/twinfoundation/dataspace/commit/8bfaf7b830f89b63575f8a51ee96bd8ac4da02f4))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @twin.org/dataspace-app-runner bumped from 0.0.3-next.18 to 0.0.3-next.19
|
|
16
|
+
* @twin.org/dataspace-models bumped from 0.0.3-next.18 to 0.0.3-next.19
|
|
17
|
+
* devDependencies
|
|
18
|
+
* @twin.org/dataspace-test-app bumped from 0.0.3-next.18 to 0.0.3-next.19
|
|
19
|
+
|
|
20
|
+
## [0.0.3-next.18](https://github.com/twinfoundation/dataspace/compare/dataspace-data-plane-service-v0.0.3-next.17...dataspace-data-plane-service-v0.0.3-next.18) (2026-03-09)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### Features
|
|
24
|
+
|
|
25
|
+
* resolve DSP transfer flow bugs for cross-node communication ([#76](https://github.com/twinfoundation/dataspace/issues/76)) ([506a45c](https://github.com/twinfoundation/dataspace/commit/506a45c94e63d5f958b1fc7131adfe452c3e2974))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
### Dependencies
|
|
29
|
+
|
|
30
|
+
* The following workspace dependencies were updated
|
|
31
|
+
* dependencies
|
|
32
|
+
* @twin.org/dataspace-app-runner bumped from 0.0.3-next.17 to 0.0.3-next.18
|
|
33
|
+
* @twin.org/dataspace-models bumped from 0.0.3-next.17 to 0.0.3-next.18
|
|
34
|
+
* devDependencies
|
|
35
|
+
* @twin.org/dataspace-test-app bumped from 0.0.3-next.17 to 0.0.3-next.18
|
|
36
|
+
|
|
3
37
|
## [0.0.3-next.17](https://github.com/twinfoundation/dataspace/compare/dataspace-data-plane-service-v0.0.3-next.16...dataspace-data-plane-service-v0.0.3-next.17) (2026-03-06)
|
|
4
38
|
|
|
5
39
|
|
package/docs/examples.md
CHANGED
|
@@ -1 +1,130 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Data Plane Service Examples
|
|
2
|
+
|
|
3
|
+
Use these snippets to process activities, expose data assets, and model activity storage records.
|
|
4
|
+
|
|
5
|
+
## DataspaceDataPlaneService
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { DataspaceDataPlaneService } from '@twin.org/dataspace-data-plane-service';
|
|
9
|
+
|
|
10
|
+
const service = new DataspaceDataPlaneService({
|
|
11
|
+
loggingComponentType: 'logging',
|
|
12
|
+
trustComponentType: 'trust',
|
|
13
|
+
config: {
|
|
14
|
+
retainActivityLogsFor: 30,
|
|
15
|
+
activityLogsCleanUpInterval: 15
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
console.log(service.className()); // DataspaceDataPlaneService
|
|
20
|
+
await service.start();
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { DataspaceDataPlaneService } from '@twin.org/dataspace-data-plane-service';
|
|
25
|
+
import type { IActivityStreamsActivity } from '@twin.org/standards-w3c-activity-streams';
|
|
26
|
+
|
|
27
|
+
const service = new DataspaceDataPlaneService();
|
|
28
|
+
|
|
29
|
+
const activity: IActivityStreamsActivity = {
|
|
30
|
+
'@context': 'https://www.w3.org/ns/activitystreams',
|
|
31
|
+
id: 'urn:activity:1001',
|
|
32
|
+
type: 'Create',
|
|
33
|
+
actor: 'did:web:consumer.example',
|
|
34
|
+
object: 'urn:ucr:24PLP051219453I002610799053311'
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const logEntryId = await service.notifyActivity(activity);
|
|
38
|
+
console.log(logEntryId); // urn:activity-log:1001
|
|
39
|
+
|
|
40
|
+
const subscriptionId = await service.subscribeToActivityLog(async notification => {
|
|
41
|
+
console.log(notification.id); // urn:activity-log:1001
|
|
42
|
+
console.log(notification.status); // completed
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const logEntry = await service.getActivityLogEntry(logEntryId);
|
|
46
|
+
console.log(logEntry.id); // urn:activity-log:1001
|
|
47
|
+
console.log(logEntry.status); // completed
|
|
48
|
+
|
|
49
|
+
await service.unSubscribeToActivityLog(subscriptionId);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { DataspaceDataPlaneService } from '@twin.org/dataspace-data-plane-service';
|
|
54
|
+
import type { IEntitySet, IFilteringQuery } from '@twin.org/dataspace-models';
|
|
55
|
+
|
|
56
|
+
const service = new DataspaceDataPlaneService();
|
|
57
|
+
|
|
58
|
+
const entitySet: IEntitySet = {
|
|
59
|
+
entityType: 'https://vocabulary.uncefact.org/Consignment',
|
|
60
|
+
entityId: ['urn:ucr:24PLP051219453I002610799053311']
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const entities = await service.getDataAssetEntities(
|
|
64
|
+
entitySet,
|
|
65
|
+
'consumer-process-id',
|
|
66
|
+
undefined,
|
|
67
|
+
10,
|
|
68
|
+
'eyJhbGciOi...'
|
|
69
|
+
);
|
|
70
|
+
console.log(entities.itemList.length); // 1
|
|
71
|
+
|
|
72
|
+
const query: IFilteringQuery = {
|
|
73
|
+
query: {
|
|
74
|
+
destinationCountry: {
|
|
75
|
+
equals: 'unece:CountryId#GB'
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const filtered = await service.queryDataAsset(
|
|
81
|
+
'consumer-process-id',
|
|
82
|
+
query,
|
|
83
|
+
undefined,
|
|
84
|
+
10,
|
|
85
|
+
'eyJhbGciOi...'
|
|
86
|
+
);
|
|
87
|
+
console.log(filtered.itemList.length); // 1
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { DataspaceDataPlaneService } from '@twin.org/dataspace-data-plane-service';
|
|
92
|
+
|
|
93
|
+
const service = new DataspaceDataPlaneService();
|
|
94
|
+
const valid = await service.validateTransfer('consumer-process-id', 'eyJhbGciOi...');
|
|
95
|
+
|
|
96
|
+
console.log(valid); // true
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## ActivityLogDetails
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { ActivityLogDetails } from '@twin.org/dataspace-data-plane-service';
|
|
103
|
+
|
|
104
|
+
const details = new ActivityLogDetails();
|
|
105
|
+
details.id = 'urn:activity-log:1001';
|
|
106
|
+
details.activityId = 'urn:activity:1001';
|
|
107
|
+
details.generator = 'https://consumer.example/apps/consignment';
|
|
108
|
+
details.dateCreated = new Date().toISOString();
|
|
109
|
+
details.dateModified = details.dateCreated;
|
|
110
|
+
details.retryCount = 0;
|
|
111
|
+
|
|
112
|
+
console.log(details.id); // urn:activity-log:1001
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## ActivityTask
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import { ActivityTask } from '@twin.org/dataspace-data-plane-service';
|
|
119
|
+
|
|
120
|
+
const activityTask = new ActivityTask();
|
|
121
|
+
activityTask.activityLogEntryId = 'urn:activity-log:1001';
|
|
122
|
+
activityTask.associatedTasks = [
|
|
123
|
+
{
|
|
124
|
+
id: 'task-1',
|
|
125
|
+
type: 'activity-processing'
|
|
126
|
+
}
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
console.log(activityTask.associatedTasks.length); // 1
|
|
130
|
+
```
|
package/docs/open-api/spec.json
CHANGED
|
@@ -722,8 +722,11 @@
|
|
|
722
722
|
},
|
|
723
723
|
{
|
|
724
724
|
"type": "array",
|
|
725
|
-
"minItems":
|
|
725
|
+
"minItems": 2,
|
|
726
726
|
"prefixItems": [
|
|
727
|
+
{
|
|
728
|
+
"$ref": "https://schema.twindev.org/json-ld/JsonLdContextDefinitionElement"
|
|
729
|
+
},
|
|
727
730
|
{
|
|
728
731
|
"type": "string",
|
|
729
732
|
"const": "https://www.w3.org/ns/activitystreams"
|
|
@@ -735,11 +738,14 @@
|
|
|
735
738
|
},
|
|
736
739
|
{
|
|
737
740
|
"type": "array",
|
|
738
|
-
"minItems":
|
|
741
|
+
"minItems": 2,
|
|
739
742
|
"prefixItems": [
|
|
740
743
|
{
|
|
741
744
|
"type": "string",
|
|
742
745
|
"const": "https://www.w3.org/ns/activitystreams"
|
|
746
|
+
},
|
|
747
|
+
{
|
|
748
|
+
"$ref": "https://schema.twindev.org/json-ld/JsonLdContextDefinitionElement"
|
|
743
749
|
}
|
|
744
750
|
],
|
|
745
751
|
"items": {
|
|
@@ -749,7 +755,6 @@
|
|
|
749
755
|
]
|
|
750
756
|
},
|
|
751
757
|
"type": {
|
|
752
|
-
"description": "Object or array data type",
|
|
753
758
|
"anyOf": [
|
|
754
759
|
{
|
|
755
760
|
"$ref": "https://schema.twindev.org/w3c-activity-streams/ActivityStreamsTypes"
|
|
@@ -770,11 +775,13 @@
|
|
|
770
775
|
]
|
|
771
776
|
}
|
|
772
777
|
}
|
|
773
|
-
]
|
|
778
|
+
],
|
|
779
|
+
"description": "Activity Type."
|
|
774
780
|
},
|
|
775
781
|
"id": {
|
|
776
782
|
"type": "string",
|
|
777
|
-
"description": "Global identifier."
|
|
783
|
+
"description": "Global identifier.",
|
|
784
|
+
"format": "uri"
|
|
778
785
|
},
|
|
779
786
|
"name": {
|
|
780
787
|
"anyOf": [
|
|
@@ -892,23 +899,28 @@
|
|
|
892
899
|
},
|
|
893
900
|
"published": {
|
|
894
901
|
"type": "string",
|
|
895
|
-
"description": "Published date-time."
|
|
902
|
+
"description": "Published date-time.",
|
|
903
|
+
"format": "date-time"
|
|
896
904
|
},
|
|
897
905
|
"updated": {
|
|
898
906
|
"type": "string",
|
|
899
|
-
"description": "
|
|
907
|
+
"description": "Updated date-time.",
|
|
908
|
+
"format": "date-time"
|
|
900
909
|
},
|
|
901
910
|
"startTime": {
|
|
902
911
|
"type": "string",
|
|
903
|
-
"description": "Start time."
|
|
912
|
+
"description": "Start time.",
|
|
913
|
+
"format": "date-time"
|
|
904
914
|
},
|
|
905
915
|
"endTime": {
|
|
906
916
|
"type": "string",
|
|
907
|
-
"description": "End time."
|
|
917
|
+
"description": "End time.",
|
|
918
|
+
"format": "date-time"
|
|
908
919
|
},
|
|
909
920
|
"duration": {
|
|
910
921
|
"type": "string",
|
|
911
|
-
"description": "Duration."
|
|
922
|
+
"description": "Duration.",
|
|
923
|
+
"format": "duration"
|
|
912
924
|
},
|
|
913
925
|
"generator": {
|
|
914
926
|
"description": "Object or array data type",
|
|
@@ -1380,151 +1392,6 @@
|
|
|
1380
1392
|
],
|
|
1381
1393
|
"description": "A W3C Activity from Activity Streams.\n\nAn `Activity` describes an action performed by an `actor` on an `object`, and can optionally include a `target`, `result`, `origin`, or `instrument`."
|
|
1382
1394
|
},
|
|
1383
|
-
"ActivityStreamsLinkTypes": {
|
|
1384
|
-
"anyOf": [
|
|
1385
|
-
{
|
|
1386
|
-
"type": "string",
|
|
1387
|
-
"const": "Link",
|
|
1388
|
-
"description": "Link"
|
|
1389
|
-
},
|
|
1390
|
-
{
|
|
1391
|
-
"type": "string",
|
|
1392
|
-
"const": "Mention",
|
|
1393
|
-
"description": "Mention"
|
|
1394
|
-
}
|
|
1395
|
-
],
|
|
1396
|
-
"description": "The link types concerning Activity Streams."
|
|
1397
|
-
},
|
|
1398
|
-
"ActivityStreamsObjectTypes": {
|
|
1399
|
-
"anyOf": [
|
|
1400
|
-
{
|
|
1401
|
-
"type": "string",
|
|
1402
|
-
"const": "Object",
|
|
1403
|
-
"description": "Object"
|
|
1404
|
-
},
|
|
1405
|
-
{
|
|
1406
|
-
"type": "string",
|
|
1407
|
-
"const": "Activity",
|
|
1408
|
-
"description": "Activity"
|
|
1409
|
-
},
|
|
1410
|
-
{
|
|
1411
|
-
"type": "string",
|
|
1412
|
-
"const": "IntransitiveActivity",
|
|
1413
|
-
"description": "IntransitiveActivity"
|
|
1414
|
-
},
|
|
1415
|
-
{
|
|
1416
|
-
"type": "string",
|
|
1417
|
-
"const": "Collection",
|
|
1418
|
-
"description": "Collection"
|
|
1419
|
-
},
|
|
1420
|
-
{
|
|
1421
|
-
"type": "string",
|
|
1422
|
-
"const": "OrderedCollection",
|
|
1423
|
-
"description": "OrderedCollection"
|
|
1424
|
-
},
|
|
1425
|
-
{
|
|
1426
|
-
"type": "string",
|
|
1427
|
-
"const": "CollectionPage",
|
|
1428
|
-
"description": "CollectionPage"
|
|
1429
|
-
},
|
|
1430
|
-
{
|
|
1431
|
-
"type": "string",
|
|
1432
|
-
"const": "OrderedCollectionPage",
|
|
1433
|
-
"description": "OrderedCollectionPage"
|
|
1434
|
-
},
|
|
1435
|
-
{
|
|
1436
|
-
"type": "string",
|
|
1437
|
-
"const": "Actor",
|
|
1438
|
-
"description": "Actor"
|
|
1439
|
-
},
|
|
1440
|
-
{
|
|
1441
|
-
"type": "string",
|
|
1442
|
-
"const": "Application",
|
|
1443
|
-
"description": "Application"
|
|
1444
|
-
},
|
|
1445
|
-
{
|
|
1446
|
-
"type": "string",
|
|
1447
|
-
"const": "Group",
|
|
1448
|
-
"description": "Group"
|
|
1449
|
-
},
|
|
1450
|
-
{
|
|
1451
|
-
"type": "string",
|
|
1452
|
-
"const": "Organization",
|
|
1453
|
-
"description": "Organization"
|
|
1454
|
-
},
|
|
1455
|
-
{
|
|
1456
|
-
"type": "string",
|
|
1457
|
-
"const": "Person",
|
|
1458
|
-
"description": "Person"
|
|
1459
|
-
},
|
|
1460
|
-
{
|
|
1461
|
-
"type": "string",
|
|
1462
|
-
"const": "Service",
|
|
1463
|
-
"description": "Service"
|
|
1464
|
-
},
|
|
1465
|
-
{
|
|
1466
|
-
"type": "string",
|
|
1467
|
-
"const": "Article",
|
|
1468
|
-
"description": "Article"
|
|
1469
|
-
},
|
|
1470
|
-
{
|
|
1471
|
-
"type": "string",
|
|
1472
|
-
"const": "Audio",
|
|
1473
|
-
"description": "Audio"
|
|
1474
|
-
},
|
|
1475
|
-
{
|
|
1476
|
-
"type": "string",
|
|
1477
|
-
"const": "Document",
|
|
1478
|
-
"description": "Document"
|
|
1479
|
-
},
|
|
1480
|
-
{
|
|
1481
|
-
"type": "string",
|
|
1482
|
-
"const": "Event",
|
|
1483
|
-
"description": "Event"
|
|
1484
|
-
},
|
|
1485
|
-
{
|
|
1486
|
-
"type": "string",
|
|
1487
|
-
"const": "Image",
|
|
1488
|
-
"description": "Image"
|
|
1489
|
-
},
|
|
1490
|
-
{
|
|
1491
|
-
"type": "string",
|
|
1492
|
-
"const": "Note",
|
|
1493
|
-
"description": "Note"
|
|
1494
|
-
},
|
|
1495
|
-
{
|
|
1496
|
-
"type": "string",
|
|
1497
|
-
"const": "Page",
|
|
1498
|
-
"description": "Page"
|
|
1499
|
-
},
|
|
1500
|
-
{
|
|
1501
|
-
"type": "string",
|
|
1502
|
-
"const": "Place",
|
|
1503
|
-
"description": "Place"
|
|
1504
|
-
},
|
|
1505
|
-
{
|
|
1506
|
-
"type": "string",
|
|
1507
|
-
"const": "Profile",
|
|
1508
|
-
"description": "Profile"
|
|
1509
|
-
},
|
|
1510
|
-
{
|
|
1511
|
-
"type": "string",
|
|
1512
|
-
"const": "Relationship",
|
|
1513
|
-
"description": "Relationship"
|
|
1514
|
-
},
|
|
1515
|
-
{
|
|
1516
|
-
"type": "string",
|
|
1517
|
-
"const": "Tombstone",
|
|
1518
|
-
"description": "Tombstone"
|
|
1519
|
-
},
|
|
1520
|
-
{
|
|
1521
|
-
"type": "string",
|
|
1522
|
-
"const": "Video",
|
|
1523
|
-
"description": "Video"
|
|
1524
|
-
}
|
|
1525
|
-
],
|
|
1526
|
-
"description": "The object types concerning Activity Streams."
|
|
1527
|
-
},
|
|
1528
1395
|
"DataAssetItemList": {
|
|
1529
1396
|
"type": "object",
|
|
1530
1397
|
"properties": {
|
|
@@ -10,12 +10,6 @@ Dataspace Data Plane service configuration
|
|
|
10
10
|
|
|
11
11
|
The amount of time in minutes to retain activity log entries until removal, set to -1 to keep forever.
|
|
12
12
|
|
|
13
|
-
#### Default
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
10
|
|
17
|
-
```
|
|
18
|
-
|
|
19
13
|
***
|
|
20
14
|
|
|
21
15
|
### activityLogsCleanUpInterval?
|
|
@@ -23,9 +17,3 @@ The amount of time in minutes to retain activity log entries until removal, set
|
|
|
23
17
|
> `optional` **activityLogsCleanUpInterval**: `number`
|
|
24
18
|
|
|
25
19
|
The interval in minutes in between activity log clean ups. -1 indicates no clean up shall be done.
|
|
26
|
-
|
|
27
|
-
#### Default
|
|
28
|
-
|
|
29
|
-
```ts
|
|
30
|
-
60 minutes
|
|
31
|
-
```
|
|
@@ -10,12 +10,6 @@ Dataspace Data Plane service options
|
|
|
10
10
|
|
|
11
11
|
Logging component type.
|
|
12
12
|
|
|
13
|
-
#### Default
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
logging
|
|
17
|
-
```
|
|
18
|
-
|
|
19
13
|
***
|
|
20
14
|
|
|
21
15
|
### backgroundTaskComponentType?
|
|
@@ -24,12 +18,6 @@ logging
|
|
|
24
18
|
|
|
25
19
|
Background task component.
|
|
26
20
|
|
|
27
|
-
#### Default
|
|
28
|
-
|
|
29
|
-
```ts
|
|
30
|
-
background-task
|
|
31
|
-
```
|
|
32
|
-
|
|
33
21
|
***
|
|
34
22
|
|
|
35
23
|
### taskSchedulerComponentType?
|
|
@@ -38,12 +26,6 @@ background-task
|
|
|
38
26
|
|
|
39
27
|
Task Scheduler Component Type.
|
|
40
28
|
|
|
41
|
-
#### Default
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
task-scheduler
|
|
45
|
-
```
|
|
46
|
-
|
|
47
29
|
***
|
|
48
30
|
|
|
49
31
|
### activityLogEntityStorageType?
|
|
@@ -52,12 +34,6 @@ task-scheduler
|
|
|
52
34
|
|
|
53
35
|
The entity storage for activity log details.
|
|
54
36
|
|
|
55
|
-
#### Default
|
|
56
|
-
|
|
57
|
-
```ts
|
|
58
|
-
activity-log-details
|
|
59
|
-
```
|
|
60
|
-
|
|
61
37
|
***
|
|
62
38
|
|
|
63
39
|
### activityTaskEntityStorageType?
|
|
@@ -66,12 +42,6 @@ activity-log-details
|
|
|
66
42
|
|
|
67
43
|
The entity storage for the association between Activities and Tasks.
|
|
68
44
|
|
|
69
|
-
#### Default
|
|
70
|
-
|
|
71
|
-
```ts
|
|
72
|
-
activity-task
|
|
73
|
-
```
|
|
74
|
-
|
|
75
45
|
***
|
|
76
46
|
|
|
77
47
|
### transferProcessEntityStorageType?
|
|
@@ -81,12 +51,6 @@ activity-task
|
|
|
81
51
|
The entity storage type for Transfer Process entities.
|
|
82
52
|
Used to read Transfer Process state from shared storage.
|
|
83
53
|
|
|
84
|
-
#### Default
|
|
85
|
-
|
|
86
|
-
```ts
|
|
87
|
-
transfer-process
|
|
88
|
-
```
|
|
89
|
-
|
|
90
54
|
***
|
|
91
55
|
|
|
92
56
|
### partitionContextIds?
|
|
@@ -103,12 +67,6 @@ The keys to use from the context ids to cleanup partitions.
|
|
|
103
67
|
|
|
104
68
|
Trust component type.
|
|
105
69
|
|
|
106
|
-
#### Default
|
|
107
|
-
|
|
108
|
-
```ts
|
|
109
|
-
trust
|
|
110
|
-
```
|
|
111
|
-
|
|
112
70
|
***
|
|
113
71
|
|
|
114
72
|
### pepComponentType?
|
|
@@ -117,12 +75,6 @@ trust
|
|
|
117
75
|
|
|
118
76
|
Policy enforcement point component type for ODRL policy enforcement.
|
|
119
77
|
|
|
120
|
-
#### Default
|
|
121
|
-
|
|
122
|
-
```ts
|
|
123
|
-
policy-enforcement-point-service
|
|
124
|
-
```
|
|
125
|
-
|
|
126
78
|
***
|
|
127
79
|
|
|
128
80
|
### config?
|
package/locales/en.json
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
"activityStillProcessing": "Activity is still being processed",
|
|
7
7
|
"noFailedTasksToRetry": "Activity has error status but no failed tasks to retry",
|
|
8
8
|
"invalidActivityGeneratorIdentity": "Invalid activity. No identity specified either on 'generator' or 'actor'",
|
|
9
|
-
"invalidActivity": "Invalid Activity. Expected fields not specified",
|
|
10
9
|
"unknownActivityLogEntryId": "Unknown Activity Log Entry Id \"{activityLogEntryId}\"",
|
|
11
10
|
"tooManyAppsRegistered": "There are several DS Apps registered for Dataset \"{datasetId}\"",
|
|
12
11
|
"noAppRegistered": "There are no DS Apps registered for Dataset \"{datasetId}\"",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twin.org/dataspace-data-plane-service",
|
|
3
|
-
"version": "0.0.3-next.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.0.3-next.19",
|
|
4
|
+
"description": "Processes activities and data requests while enforcing transfer and policy constraints in the data plane.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/twinfoundation/dataspace.git",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"@twin.org/crypto": "next",
|
|
22
22
|
"@twin.org/data-core": "next",
|
|
23
23
|
"@twin.org/data-json-ld": "next",
|
|
24
|
-
"@twin.org/dataspace-app-runner": "0.0.3-next.
|
|
25
|
-
"@twin.org/dataspace-models": "0.0.3-next.
|
|
24
|
+
"@twin.org/dataspace-app-runner": "0.0.3-next.19",
|
|
25
|
+
"@twin.org/dataspace-models": "0.0.3-next.19",
|
|
26
26
|
"@twin.org/engine-models": "next",
|
|
27
27
|
"@twin.org/entity": "next",
|
|
28
28
|
"@twin.org/entity-storage-models": "next",
|