@twin.org/dataspace-data-plane-service 0.0.3-next.38 → 0.0.3-next.39
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/dist/es/dataspaceDataPlaneService.js +10 -70
- package/dist/es/dataspaceDataPlaneService.js.map +1 -1
- package/dist/es/models/IDataspaceDataPlaneServiceConstructorOptions.js.map +1 -1
- package/dist/types/models/IDataspaceDataPlaneServiceConstructorOptions.d.ts +3 -3
- package/docs/changelog.md +17 -0
- package/docs/reference/interfaces/IDataspaceDataPlaneServiceConstructorOptions.md +4 -4
- package/package.json +3 -3
|
@@ -150,10 +150,10 @@ export class DataspaceDataPlaneService {
|
|
|
150
150
|
*/
|
|
151
151
|
_policyEnforcementPoint;
|
|
152
152
|
/**
|
|
153
|
-
* The tenant
|
|
153
|
+
* The tenant component.
|
|
154
154
|
* @internal
|
|
155
155
|
*/
|
|
156
|
-
|
|
156
|
+
_tenantComponent;
|
|
157
157
|
/**
|
|
158
158
|
* The component type name for the hosting component.
|
|
159
159
|
* @internal
|
|
@@ -189,7 +189,7 @@ export class DataspaceDataPlaneService {
|
|
|
189
189
|
this._taskScheduler = ComponentFactory.get(options?.taskSchedulerComponentType ?? "task-scheduler");
|
|
190
190
|
this._trustComponent = ComponentFactory.get(options?.trustComponentType ?? "trust");
|
|
191
191
|
this._policyEnforcementPoint = ComponentFactory.getIfExists(options?.pepComponentType ?? "policy-enforcement-point-service");
|
|
192
|
-
this.
|
|
192
|
+
this._tenantComponent = ComponentFactory.getIfExists(options?.tenantComponentType ?? "tenant");
|
|
193
193
|
this._urlTransformerComponent = ComponentFactory.get(options?.urlTransformerComponentType ?? "url-transformer");
|
|
194
194
|
// Entity storage for Transfer Process state lookup
|
|
195
195
|
// Used to read transfer state from shared storage (written by Control Plane)
|
|
@@ -1076,31 +1076,9 @@ export class DataspaceDataPlaneService {
|
|
|
1076
1076
|
let numRecordsDeleted = 0;
|
|
1077
1077
|
if (this._partitionContextIds?.includes(ContextIdKeys.Tenant)) {
|
|
1078
1078
|
// The cleanup must be done by tenant as the data is partitioned
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
const result = await this._tenantAdmin?.query(undefined, cursor);
|
|
1083
|
-
cursor = result?.cursor;
|
|
1084
|
-
if (!Is.empty(result)) {
|
|
1085
|
-
for (const tenantId of result.tenants.map(t => t.id)) {
|
|
1086
|
-
const localContextIds = (await ContextIdStore.getContextIds()) ?? {};
|
|
1087
|
-
localContextIds[ContextIdKeys.Tenant] = tenantId;
|
|
1088
|
-
await ContextIdStore.run(localContextIds, async () => {
|
|
1089
|
-
numRecordsDeleted += await this.cleanupActivityLogPartition();
|
|
1090
|
-
});
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
} while (Is.stringValue(cursor));
|
|
1094
|
-
}
|
|
1095
|
-
catch (error) {
|
|
1096
|
-
await this._logging?.log({
|
|
1097
|
-
level: "error",
|
|
1098
|
-
message: "cleanupFailed",
|
|
1099
|
-
ts: Date.now(),
|
|
1100
|
-
source: DataspaceDataPlaneService.CLASS_NAME,
|
|
1101
|
-
error: BaseError.fromError(error)
|
|
1102
|
-
});
|
|
1103
|
-
}
|
|
1079
|
+
await this._tenantComponent?.runPerTenant(async () => {
|
|
1080
|
+
numRecordsDeleted += await this.cleanupActivityLogPartition();
|
|
1081
|
+
});
|
|
1104
1082
|
}
|
|
1105
1083
|
else {
|
|
1106
1084
|
numRecordsDeleted += await this.cleanupActivityLogPartition();
|
|
@@ -1224,48 +1202,10 @@ export class DataspaceDataPlaneService {
|
|
|
1224
1202
|
}
|
|
1225
1203
|
let numDeleted = 0;
|
|
1226
1204
|
if (this._partitionContextIds?.includes(ContextIdKeys.Tenant)) {
|
|
1227
|
-
//
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
do {
|
|
1232
|
-
let result;
|
|
1233
|
-
try {
|
|
1234
|
-
result = await this._tenantAdmin?.query(undefined, cursor);
|
|
1235
|
-
}
|
|
1236
|
-
catch (error) {
|
|
1237
|
-
await this._logging?.log({
|
|
1238
|
-
level: "error",
|
|
1239
|
-
message: "cleanupFailed",
|
|
1240
|
-
ts: Date.now(),
|
|
1241
|
-
source: DataspaceDataPlaneService.CLASS_NAME,
|
|
1242
|
-
error: BaseError.fromError(error)
|
|
1243
|
-
});
|
|
1244
|
-
break;
|
|
1245
|
-
}
|
|
1246
|
-
cursor = result?.cursor;
|
|
1247
|
-
if (!Is.empty(result)) {
|
|
1248
|
-
for (const tenantId of result.tenants.map(t => t.id)) {
|
|
1249
|
-
try {
|
|
1250
|
-
const localContextIds = (await ContextIdStore.getContextIds()) ?? {};
|
|
1251
|
-
localContextIds[ContextIdKeys.Tenant] = tenantId;
|
|
1252
|
-
await ContextIdStore.run(localContextIds, async () => {
|
|
1253
|
-
numDeleted += await this.cleanupOrphanedPushSubscriptionsPartition();
|
|
1254
|
-
});
|
|
1255
|
-
}
|
|
1256
|
-
catch (error) {
|
|
1257
|
-
await this._logging?.log({
|
|
1258
|
-
level: "error",
|
|
1259
|
-
message: "cleanupFailed",
|
|
1260
|
-
ts: Date.now(),
|
|
1261
|
-
source: DataspaceDataPlaneService.CLASS_NAME,
|
|
1262
|
-
data: { tenantId },
|
|
1263
|
-
error: BaseError.fromError(error)
|
|
1264
|
-
});
|
|
1265
|
-
}
|
|
1266
|
-
}
|
|
1267
|
-
}
|
|
1268
|
-
} while (Is.stringValue(cursor));
|
|
1205
|
+
// The cleanup must be done by tenant as the data is partitioned
|
|
1206
|
+
await this._tenantComponent?.runPerTenant(async () => {
|
|
1207
|
+
numDeleted += await this.cleanupOrphanedPushSubscriptionsPartition();
|
|
1208
|
+
});
|
|
1269
1209
|
}
|
|
1270
1210
|
else {
|
|
1271
1211
|
numDeleted += await this.cleanupOrphanedPushSubscriptionsPartition();
|
|
@@ -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 type {\n\tITenant,\n\tITenantAdminComponent,\n\tIUrlTransformerComponent\n} from \"@twin.org/api-models\";\nimport {\n\tTaskStatus,\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\tBaseError,\n\tComponentFactory,\n\tConflictError,\n\tConverter,\n\tGeneralError,\n\tGuardError,\n\tGuards,\n\tIs,\n\tJsonHelper,\n\tNotFoundError,\n\tRandomHelper,\n\tUnauthorizedError,\n\tUnprocessableError,\n\tValidation,\n\tValidationError,\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\tActivityTaskStatus,\n\tDataRequestType,\n\tDataspaceAppFactory,\n\tDataspaceContexts,\n\tDataspaceDataTypes,\n\tDataspaceTypes,\n\tgetJsonLdType,\n\ttype IActivityLogEntry,\n\ttype IActivityLogStatusNotification,\n\ttype IActivityQuery,\n\ttype IActivityTaskEntry,\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 IFollowActivity,\n\ttype IPushDeliveryPayload,\n\ttype ITransferContext,\n\ttype IUndoActivity,\n\ttype DataspaceAppDataset,\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 {\n\tActivityStreamsContexts,\n\tActivityStreamsTypes,\n\ttype IActivityStreamsActivity\n} from \"@twin.org/standards-w3c-activity-streams\";\nimport { OdrlContexts, OdrlTypes } 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 { PushSubscription } from \"./entities/pushSubscription.js\";\nimport type { IDataspaceDataPlaneServiceConstructorOptions } from \"./models/IDataspaceDataPlaneServiceConstructorOptions.js\";\n\nconst FOLLOW_ACTIVITY_URN_PREFIX = \"urn:x-follow:\";\nconst TRANSFER_URN_PREFIX = \"urn:x-transfer:\";\nconst UNDO_ACTIVITY_URN_PREFIX = \"urn:x-undo:\";\nconst ACTIVITY_LOG_URN_PREFIX = \"urn:x-activity-log:\";\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 * Background task type identifier for push delivery tasks.\n\t */\n\tpublic static readonly PUSH_DELIVERY_TASK_TYPE = \"push-delivery\";\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 * 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 * Track task handler registrations to avoid resetting worker pools on every task.\n\t * @internal\n\t */\n\tprivate readonly _registeredTaskTypes: string[];\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 * Retry count for failed tasks.\n\t * @internal\n\t */\n\tprivate readonly _retryCount?: number;\n\n\t/**\n\t * Max retry count for push delivery HTTP requests.\n\t * @internal\n\t */\n\tprivate readonly _pushRetryCount: number;\n\n\t/**\n\t * Base retry delay (ms) for push delivery HTTP requests.\n\t * @internal\n\t */\n\tprivate readonly _pushRetryBaseDelayMs: number;\n\n\t/**\n\t * Timeout (ms) for each push delivery HTTP POST request.\n\t * @internal\n\t */\n\tprivate readonly _pushTimeoutMs: 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 * Interval in minutes between orphaned PushSubscription cleanup scans.\n\t * @internal\n\t */\n\tprivate readonly _pushSubscriptionCleanupIntervalMinutes: 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 * The tenant admin component.\n\t * @internal\n\t */\n\tprivate readonly _tenantAdmin?: ITenantAdminComponent;\n\n\t/**\n\t * The component type name for the hosting component.\n\t * @internal\n\t */\n\tprivate readonly _urlTransformerComponent: IUrlTransformerComponent;\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 * Factory key used to look up the push-subscription storage. Resolved lazily at call time\n\t * (not at construction) so the storage may register after the data plane is built.\n\t * @internal\n\t */\n\tprivate readonly _pushSubscriptionStorageType: string;\n\n\t/**\n\t * Entity storage for tenant-supplied Dataspace App Dataset entities.\n\t * @internal\n\t */\n\tprivate readonly _dataspaceAppDatasetStorage: IEntityStorageConnector<DataspaceAppDataset>;\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\tthis._tenantAdmin = ComponentFactory.getIfExists<ITenantAdminComponent>(\n\t\t\toptions?.tenantAdminType ?? \"tenant-admin\"\n\t\t);\n\n\t\tthis._urlTransformerComponent = ComponentFactory.get<IUrlTransformerComponent>(\n\t\t\toptions?.urlTransformerComponentType ?? \"url-transformer\"\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\t// Push-subscription storage is optional and resolved lazily. The data plane is typically\n\t\t// constructed before its dependent storages register, so caching the connector here would\n\t\t// permanently miss it. We only need the factory key — every push call site re-resolves.\n\t\tthis._pushSubscriptionStorageType =\n\t\t\toptions?.pushSubscriptionEntityStorageType ?? nameofKebabCase<PushSubscription>();\n\n\t\tthis._dataspaceAppDatasetStorage = EntityStorageConnectorFactory.get<\n\t\t\tIEntityStorageConnector<DataspaceAppDataset>\n\t\t>(options?.dataspaceAppDatasetEntityStorageType ?? nameofKebabCase<DataspaceAppDataset>());\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._registeredTaskTypes = [];\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._retryCount = options?.config?.retryCount;\n\t\tthis._pushRetryCount = options?.config?.pushRetryCount ?? 3;\n\t\tthis._pushRetryBaseDelayMs = options?.config?.pushRetryBaseDelayMs ?? 1000;\n\t\tthis._pushTimeoutMs = options?.config?.pushTimeoutMs ?? 30000;\n\t\tthis._activityLogCleanUpInterval = DataspaceDataPlaneService._DEFAULT_CLEANUP_INTERVAL;\n\t\tthis._pushSubscriptionCleanupIntervalMinutes = Math.max(\n\t\t\t1,\n\t\t\tMath.round((options?.config?.pushSubscriptionCleanupIntervalMs ?? 3_600_000) / 60_000)\n\t\t);\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\n\t\tif (!Is.empty(options?.config?.pushTimeoutMs)) {\n\t\t\tGuards.integer(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tnameof(options.config.pushTimeoutMs),\n\t\t\t\toptions.config.pushTimeoutMs\n\t\t\t);\n\t\t\tValidation.integer(\n\t\t\t\tnameof(options.config.pushTimeoutMs),\n\t\t\t\toptions.config.pushTimeoutMs,\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._pushTimeoutMs = options.config.pushTimeoutMs;\n\t\t}\n\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\tawait this._backgroundTaskComponent.registerHandler<IPushDeliveryPayload, unknown>(\n\t\t\tDataspaceDataPlaneService.PUSH_DELIVERY_TASK_TYPE,\n\t\t\t\"@twin.org/dataspace-app-runner\",\n\t\t\t\"pushDeliveryRunner\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tinitialiseMethod: \"pushDeliveryRunnerStart\",\n\t\t\t\tshutdownMethod: \"pushDeliveryRunnerEnd\",\n\t\t\t\tidleShutdownTimeout: -1\n\t\t\t}\n\t\t);\n\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\n\t\tconst pushCleanupTaskTime: IScheduledTaskTime[] = [\n\t\t\t{\n\t\t\t\tnextTriggerTime: Date.now() + 10_000,\n\t\t\t\t...this.calculateCleaningTaskSchedule(this._pushSubscriptionCleanupIntervalMinutes)\n\t\t\t}\n\t\t];\n\n\t\tawait this._taskScheduler.addTask(\n\t\t\t\"dataspace-push-subscription-cleanup\",\n\t\t\tpushCleanupTaskTime,\n\t\t\tasync () => {\n\t\t\t\tawait this.cleanupOrphanedPushSubscriptions();\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 * @param trustPayload Optional trust payload to verify the requester's identity.\n\t * @returns The activity's id or entry.\n\t */\n\tpublic async notifyActivity(\n\t\tactivity: IActivityStreamsActivity,\n\t\ttrustPayload?: unknown\n\t): Promise<string | IActivityLogEntry> {\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\t// For cross-node push deliveries the caller presents a JWT. Verify it,\n\t\t// confirm the referenced transfer is still in STARTED state, and assert\n\t\t// the verified identity is one of the two parties on that transfer.\n\t\tif (Is.stringValue(trustPayload)) {\n\t\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\t\tthis._trustComponent,\n\t\t\t\ttrustPayload,\n\t\t\t\t\"notifyActivity\"\n\t\t\t);\n\t\t\tconst generatorPid = this.calculateActivityGeneratorIdentity(activity);\n\t\t\t// Primary lookup: by consumerPid (the entity's primary key). If this hits, the\n\t\t\t// generator's PID equals consumerPid — the generator is the consumer side.\n\t\t\tlet transferProcess = await this._transferProcessStorage.get(generatorPid);\n\t\t\tconst generatorIsConsumer = Boolean(transferProcess);\n\n\t\t\tif (!transferProcess) {\n\t\t\t\t// Fallback: generatorPid === providerPid. providerPid is a UUIDv7 so it's\n\t\t\t\t// unique per transfer, but defensively reject any case where the secondary\n\t\t\t\t// index returns more than one match — silent first-match would risk\n\t\t\t\t// authorising the wrong transfer if the invariant ever breaks.\n\t\t\t\tconst result = await this._transferProcessStorage.query({\n\t\t\t\t\tconditions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"providerPid\",\n\t\t\t\t\t\t\tvalue: generatorPid,\n\t\t\t\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t\tif (result.entities.length > 1) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\"pushActivityNotAuthorized\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttransferProcess = result.entities[0] as TransferProcess | undefined;\n\t\t\t\t// generatorIsConsumer stays false → generator is the provider side.\n\t\t\t}\n\n\t\t\tif (transferProcess?.state !== DataspaceProtocolTransferProcessStateType.STARTED) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"pushActivityNotAuthorized\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Bind the verified identity to the side of the transfer matching the claimed\n\t\t\t// generator. Without this, a party with a valid token for transfer X can post\n\t\t\t// an activity claiming to be the other party on the same transfer.\n\t\t\t// Stored consumer/provider identities are composites\n\t\t\t// (`nodeDid:hash(tenantId)`)\n\t\t\tconst expectedIdentity = generatorIsConsumer\n\t\t\t\t? transferProcess.consumerIdentity\n\t\t\t\t: transferProcess.providerIdentity;\n\t\t\tconst callerComposite = Is.stringValue(trustInfo.tenantId)\n\t\t\t\t? `${trustInfo.identity}:${trustInfo.tenantId}`\n\t\t\t\t: trustInfo.identity;\n\t\t\tif (!Is.stringValue(expectedIdentity) || callerComposite !== expectedIdentity) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"pushActivityNotAuthorized\"\n\t\t\t\t);\n\t\t\t}\n\t\t}\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 = `${ACTIVITY_LOG_URN_PREFIX}${activityLogId}`;\n\n\t\t// Check if entry already exists\n\t\tlet logEntry = await this._entityStorageActivityLogs.get(activityLogEntryId);\n\t\tlet existingSuccessfulApps: string[] = [];\n\t\tlet isRetry = false;\n\t\tconst now = Date.now();\n\n\t\tif (!Is.undefined(logEntry)) {\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\tlogEntry = {\n\t\t\t\tid: activityLogEntryId,\n\t\t\t\tactivityId: activity.id,\n\t\t\t\tgenerator: this.calculateActivityGeneratorIdentity(activity),\n\t\t\t\tdateCreated: new Date(now).toISOString(),\n\t\t\t\tdateModified: new Date(now).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 taskEntries: IActivityTaskEntry[] = [];\n\t\tconst handlerApps: {\n\t\t\t[id: string]: {\n\t\t\t\tapp: IDataspaceApp;\n\t\t\t\tprocessingGroupId?: string;\n\t\t\t};\n\t\t} = {};\n\n\t\tfor (const query of activityQuerySet) {\n\t\t\tconst apps = this.getAppForActivityQuery(query);\n\t\t\tfor (const appId in apps) {\n\t\t\t\t// Only process apps that haven't already completed successfully\n\t\t\t\tif (!handlerApps[appId] && !existingSuccessfulApps.includes(appId)) {\n\t\t\t\t\thandlerApps[appId] = apps[appId];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet inlineCount = 0;\n\t\tfor (const handlerAppId in handlerApps) {\n\t\t\tif (\n\t\t\t\tawait this.processTask(\n\t\t\t\t\tactivityLogEntryId,\n\t\t\t\t\tactivity,\n\t\t\t\t\thandlerApps,\n\t\t\t\t\thandlerAppId,\n\t\t\t\t\ttaskEntries,\n\t\t\t\t\tisRetry\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tinlineCount++;\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\tconst activityTask: ActivityTask = {\n\t\t\tactivityLogEntryId,\n\t\t\tassociatedTasks: [...existingTasksToKeep, ...taskEntries]\n\t\t};\n\n\t\tawait this._entityStorageActivityTasks.set(activityTask);\n\n\t\tif (inlineCount === taskEntries.length) {\n\t\t\treturn this.finaliseActivityLogEntry(activityLogEntryId);\n\t\t}\n\n\t\treturn activityTask.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 activityLog = await this._entityStorageActivityLogs.get(logEntryId);\n\t\tif (Is.undefined(activityLog)) {\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\tconst activityTasks = await this._entityStorageActivityTasks.get(logEntryId);\n\n\t\treturn this.constructLogEntry(activityLog, activityTasks);\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 app = await this.getAppForDataAssetQuery({ datasetId });\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 app = await this.getAppForDataAssetQuery({ datasetId });\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 * Set up a push subscription after a transfer enters STARTED from REQUESTED.\n\t * Reads the TransferProcess, builds an IFollowActivity, calls the app's\n\t * subscribeToData, and persists a PushSubscription entity.\n\t * @param consumerPid The consumer process ID identifying the transfer.\n\t */\n\tpublic async setupPushSubscription(consumerPid: string): Promise<void> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tconst transferProcess = await this._transferProcessStorage.get(consumerPid);\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\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\tif (!Is.stringValue(transferProcess.dataAddress?.endpoint)) {\n\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"transferMissingDataAddress\", {\n\t\t\t\tconsumerPid\n\t\t\t});\n\t\t}\n\n\t\t// On multi-tenant publishers, the consumer must have baked its tenant token into the\n\t\t// callback URL so the consumer's TenantProcessor can route inbound push deliveries.\n\t\t// Reject at setup time rather than silently 401 every push.\n\t\t// Parse as a real URL so we match on the actual query parameter, not a substring\n\t\t// in a path segment / value position.\n\t\tif (this._partitionContextIds?.includes(ContextIdKeys.Tenant)) {\n\t\t\tconst tenantId = await this._urlTransformerComponent.getEncryptedFromUrl(\n\t\t\t\ttransferProcess.dataAddress.endpoint,\n\t\t\t\t\"tenant\"\n\t\t\t);\n\t\t\tif (!Is.stringValue(tenantId)) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"pushSubscriptionMissingTenantToken\",\n\t\t\t\t\t{ consumerPid, endpoint: transferProcess.dataAddress.endpoint }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst followActivityId = `${FOLLOW_ACTIVITY_URN_PREFIX}${RandomHelper.generateUuidV7(\"compact\")}`;\n\t\tconst followActivity: IFollowActivity = {\n\t\t\t\"@context\": ActivityStreamsContexts.Context,\n\t\t\tid: followActivityId,\n\t\t\ttype: ActivityStreamsTypes.Follow,\n\t\t\tgenerator: transferProcess.consumerPid,\n\t\t\tactor: transferProcess.consumerIdentity ?? \"\",\n\t\t\tobject: { id: `${TRANSFER_URN_PREFIX}${transferProcess.consumerPid}` }\n\t\t};\n\n\t\tlet appForCompensation: IDataspaceApp | undefined;\n\t\tif (Is.stringValue(transferProcess.datasetId)) {\n\t\t\tconst appDataset = await this._dataspaceAppDatasetStorage.get(transferProcess.datasetId);\n\t\t\tif (appDataset) {\n\t\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appDataset.appId);\n\t\t\t\tawait app.subscribeToData?.(followActivity);\n\t\t\t\tappForCompensation = app;\n\t\t\t}\n\t\t}\n\n\t\tconst setupContextIds = await ContextIdStore.getContextIds();\n\t\tconst setupTenantId = setupContextIds?.[ContextIdKeys.Tenant];\n\t\tconst subscription: PushSubscription = {\n\t\t\tconsumerPid: transferProcess.consumerPid,\n\t\t\tproviderPid: transferProcess.providerPid,\n\t\t\tfollowActivityId,\n\t\t\tdatasetId: transferProcess.datasetId,\n\t\t\ttenantId: Is.stringValue(setupTenantId) ? setupTenantId : undefined,\n\t\t\tconsumerEndpoint: transferProcess.dataAddress.endpoint,\n\t\t\tconsumerAuthToken: transferProcess.dataAddress.endpointProperties?.find(\n\t\t\t\tp => p.name === \"authorization\"\n\t\t\t)?.value,\n\t\t\tpaused: false,\n\t\t\tdateCreated: new Date().toISOString(),\n\t\t\tdateModified: new Date().toISOString()\n\t\t};\n\n\t\ttry {\n\t\t\tawait this.requirePushSubscriptionStorage().set(subscription);\n\t\t} catch (storageError) {\n\t\t\t// Compensating Undo: the app's subscribeToData succeeded but the row didn't\n\t\t\t// persist. Without compensation, a retry generates a new followActivityId and\n\t\t\t// registers a second Follow on the app — with no persisted id to drive an Undo.\n\t\t\tif (appForCompensation) {\n\t\t\t\tconst compensatingUndo: IUndoActivity = {\n\t\t\t\t\t\"@context\": ActivityStreamsContexts.Context,\n\t\t\t\t\tid: `${UNDO_ACTIVITY_URN_PREFIX}${RandomHelper.generateUuidV7(\"compact\")}`,\n\t\t\t\t\ttype: ActivityStreamsTypes.Undo,\n\t\t\t\t\tgenerator: transferProcess.consumerPid,\n\t\t\t\t\tactor: transferProcess.consumerIdentity ?? \"\",\n\t\t\t\t\tobject: followActivityId\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\tawait appForCompensation.unsubscribeToData?.(compensatingUndo);\n\t\t\t\t} catch (compensationError) {\n\t\t\t\t\tawait this._logging?.log({\n\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\tmessage: \"pushSubscriptionCompensationFailed\",\n\t\t\t\t\t\tdata: { consumerPid, providerPid: transferProcess.providerPid },\n\t\t\t\t\t\terror: BaseError.fromError(compensationError)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow storageError;\n\t\t}\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"pushSubscriptionCreated\",\n\t\t\tdata: { consumerPid, providerPid: transferProcess.providerPid }\n\t\t});\n\t}\n\n\t/**\n\t * Pause deliveries for a push subscription. The subscription entity stays\n\t * alive with status=Paused. No app unsubscribe call.\n\t * @param consumerPid The consumer process ID identifying the transfer.\n\t */\n\tpublic async suspendPushSubscription(consumerPid: string): Promise<void> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tconst subscription = await this.requirePushSubscriptionStorage().get(consumerPid);\n\t\tif (!subscription) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"pushSubscriptionNotFound\",\n\t\t\t\tconsumerPid\n\t\t\t);\n\t\t}\n\n\t\tif (subscription.paused) {\n\t\t\treturn;\n\t\t}\n\n\t\tsubscription.paused = true;\n\t\tsubscription.dateModified = new Date().toISOString();\n\t\tawait this.requirePushSubscriptionStorage().set(subscription);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"pushSubscriptionSuspended\",\n\t\t\tdata: { consumerPid }\n\t\t});\n\t}\n\n\t/**\n\t * Resume deliveries after a SUSPENDED → STARTED transition. Flips status\n\t * back to Active. No app subscribeToData call.\n\t * @param consumerPid The consumer process ID identifying the transfer.\n\t */\n\tpublic async resumePushSubscription(consumerPid: string): Promise<void> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tconst subscription = await this.requirePushSubscriptionStorage().get(consumerPid);\n\t\tif (!subscription) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"pushSubscriptionNotFound\",\n\t\t\t\tconsumerPid\n\t\t\t);\n\t\t}\n\n\t\tif (!subscription.paused) {\n\t\t\treturn;\n\t\t}\n\n\t\tsubscription.paused = false;\n\t\tsubscription.dateModified = new Date().toISOString();\n\t\tawait this.requirePushSubscriptionStorage().set(subscription);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"pushSubscriptionResumed\",\n\t\t\tdata: { consumerPid }\n\t\t});\n\t}\n\n\t/**\n\t * Tear down a push subscription. Builds an IUndoActivity, calls the app's\n\t * unsubscribeToData, and deletes the PushSubscription entity.\n\t * @param consumerPid The consumer process ID identifying the transfer.\n\t */\n\tpublic async teardownPushSubscription(consumerPid: string): Promise<void> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tconst subscription = await this.requirePushSubscriptionStorage().get(consumerPid);\n\t\tif (!subscription) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"pushSubscriptionNotFoundOnTeardown\",\n\t\t\t\tdata: { consumerPid }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst transferProcess = await this._transferProcessStorage.get(consumerPid);\n\n\t\tconst undoActivity: IUndoActivity = {\n\t\t\t\"@context\": ActivityStreamsContexts.Context,\n\t\t\tid: `${UNDO_ACTIVITY_URN_PREFIX}${RandomHelper.generateUuidV7(\"compact\")}`,\n\t\t\ttype: ActivityStreamsTypes.Undo,\n\t\t\tgenerator: subscription.consumerPid,\n\t\t\tactor: transferProcess?.consumerIdentity ?? \"\",\n\t\t\tobject: subscription.followActivityId\n\t\t};\n\n\t\tif (Is.stringValue(subscription.datasetId)) {\n\t\t\tconst appDataset = await this._dataspaceAppDatasetStorage.get(subscription.datasetId);\n\t\t\tif (appDataset) {\n\t\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appDataset.appId);\n\t\t\t\tawait app.unsubscribeToData?.(undoActivity);\n\t\t\t}\n\t\t}\n\n\t\tawait this.requirePushSubscriptionStorage().remove(consumerPid);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"pushSubscriptionTornDown\",\n\t\t\tdata: { consumerPid, providerPid: subscription.providerPid }\n\t\t});\n\t}\n\n\t/**\n\t * Schedule a push delivery when the app has new outbound data.\n\t * @param activity The outbound activity carrying the data payload.\n\t */\n\tpublic async processOutboxActivity(activity: IActivityStreamsActivity): Promise<void> {\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\t// Extract consumerPid from activity.to\n\t\tlet consumerPid: string | undefined;\n\t\tif (Is.stringValue(activity.to)) {\n\t\t\tconsumerPid = activity.to;\n\t\t} else if (Is.array(activity.to)) {\n\t\t\tif (activity.to.length > 1) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"processOutboxActivityMultipleTo\",\n\t\t\t\t\t{ count: activity.to.length }\n\t\t\t\t);\n\t\t\t}\n\t\t\tconsumerPid = activity.to[0] as string | undefined;\n\t\t}\n\n\t\tif (!Is.stringValue(consumerPid)) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"pushSubscriptionNotFoundForActivity\",\n\t\t\t\tdata: { consumerPid }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Load PushSubscription\n\t\tconst subscription = await this.requirePushSubscriptionStorage().get(consumerPid);\n\t\tif (!subscription) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"pushSubscriptionNotFoundForActivity\",\n\t\t\t\tdata: { consumerPid }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Skip delivery if subscription is paused\n\t\tif (subscription.paused) {\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: \"pushDeliverySkippedPaused\",\n\t\t\t\tdata: { consumerPid }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Load TransferProcess and validate it is STARTED\n\t\tconst transferProcess = await this._transferProcessStorage.get(consumerPid);\n\t\tif (transferProcess?.state !== DataspaceProtocolTransferProcessStateType.STARTED) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"pushSubscriptionNotFoundForActivity\",\n\t\t\t\tdata: { consumerPid }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Build agreement from stored transfer context\n\t\tconst { agreement } = this.buildTransferContext(transferProcess);\n\n\t\t// Extract data object from activity; a string value is an IRI reference — wrap it so the IRI is preserved.\n\t\tlet data: IJsonLdNodeObject;\n\t\tif (Is.object(activity.object)) {\n\t\t\tdata = activity.object;\n\t\t} else if (Is.stringValue(activity.object)) {\n\t\t\tdata = { \"@id\": activity.object };\n\t\t} else {\n\t\t\tdata = {};\n\t\t}\n\t\tconst entityType = Is.object(activity.object) ? (getJsonLdType(activity.object) ?? \"\") : \"\";\n\n\t\t// Capture the subscription's tenantId so the background-task runner can re-enter the\n\t\t// owning tenant's context before any tenant-scoped operation (PEP, trust signing).\n\t\t// Falls back to the current request context if the subscription pre-dates tenantId capture.\n\t\tlet payloadTenantId: string | undefined = subscription.tenantId;\n\t\tif (!Is.stringValue(payloadTenantId)) {\n\t\t\tconst ctxIds = await ContextIdStore.getContextIds();\n\t\t\tconst ctxTenant = ctxIds?.[ContextIdKeys.Tenant];\n\t\t\tpayloadTenantId = Is.stringValue(ctxTenant) ? ctxTenant : undefined;\n\t\t}\n\n\t\tconst payload: IPushDeliveryPayload = {\n\t\t\tconsumerPid,\n\t\t\tproviderPid: transferProcess.providerPid,\n\t\t\tgeneratorPid: transferProcess.providerPid,\n\t\t\tconsumerEndpoint: subscription.consumerEndpoint,\n\t\t\tconsumerAuthToken: subscription.consumerAuthToken,\n\t\t\tagreement,\n\t\t\tdata,\n\t\t\tentityType,\n\t\t\ttenantId: payloadTenantId,\n\t\t\tpushTimeoutMs: this._pushTimeoutMs,\n\t\t\tpushRetryCount: this._pushRetryCount,\n\t\t\tpushRetryBaseDelayMs: this._pushRetryBaseDelayMs\n\t\t};\n\n\t\tconst taskId = await this._backgroundTaskComponent.create<IPushDeliveryPayload>(\n\t\t\tDataspaceDataPlaneService.PUSH_DELIVERY_TASK_TYPE,\n\t\t\tpayload,\n\t\t\t{ retainFor: this._retainTasksFor, retryCount: this._retryCount }\n\t\t);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tmessage: \"pushDeliveryTaskScheduled\",\n\t\t\tdata: { taskId, consumerPid }\n\t\t});\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 taskId The Id of the Activity Log Entry.\n\t * @param status The final status of the task.\n\t * @param payload The execution payload of the task, required to correlate to the Activity Log Entry and update the processing status.\n\t * @internal\n\t */\n\tprivate async finaliseBackgroundTask(\n\t\ttaskId: string,\n\t\tstatus: TaskStatus,\n\t\tpayload?: IExecutionPayload\n\t): Promise<void> {\n\t\tif (Is.empty(payload)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (status === TaskStatus.Success || status === TaskStatus.Failed) {\n\t\t\tawait this.notifyTaskStatusChanged(\n\t\t\t\tpayload.activityLogEntryId,\n\t\t\t\tpayload.activity.id,\n\t\t\t\tpayload.dataspaceAppId,\n\t\t\t\ttaskId,\n\t\t\t\tstatus\n\t\t\t);\n\n\t\t\tawait this.finaliseActivityLogEntry(payload.activityLogEntryId);\n\t\t}\n\t}\n\n\t/**\n\t * Notify registered callbacks about a task status change.\n\t * @param activityLogEntryId The Id of the Activity Log Entry.\n\t * @param activityId The Id of the Activity.\n\t * @param dataspaceAppId The Id of the Dataspace App associated with the task.\n\t * @param taskId The Id of the task.\n\t * @param taskStatus The new status of the task.\n\t * @internal\n\t */\n\tprivate async notifyTaskStatusChanged(\n\t\tactivityLogEntryId: string,\n\t\tactivityId: string | undefined,\n\t\tdataspaceAppId: string,\n\t\ttaskId: string,\n\t\ttaskStatus: TaskStatus\n\t): Promise<void> {\n\t\tfor (const callback of Object.values(this._activityLogStatusCallbacks)) {\n\t\t\tawait callback({\n\t\t\t\tactivityLogEntryId,\n\t\t\t\tactivityId,\n\t\t\t\ttaskProcessingStatus: {\n\t\t\t\t\tdataspaceAppId,\n\t\t\t\t\ttaskId,\n\t\t\t\t\ttaskStatus\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Finalizes the Activity Log Entry by checking if all associated tasks have completed and, if so, updating the entry to be retained for the configured retention period.\n\t * @param activityLogEntryId The Id of the Activity Log Entry to finalize.\n\t * @returns The Activity Log Entry with updated retention details if applicable.\n\t * @internal\n\t */\n\tprivate async finaliseActivityLogEntry(activityLogEntryId: string): Promise<IActivityLogEntry> {\n\t\tconst entry = await this.getActivityLogEntry(activityLogEntryId);\n\t\tif (\n\t\t\tthis._retainActivityLogsFor !== -1 &&\n\t\t\t(entry.status === ActivityProcessingStatus.Completed ||\n\t\t\t\tentry.status === ActivityProcessingStatus.Error)\n\t\t) {\n\t\t\tconst retainUntil = Date.now() + this._retainActivityLogsFor;\n\t\t\tconst updatedEntry: ActivityLogDetails = {\n\t\t\t\tid: entry.id,\n\t\t\t\tactivityId: entry.activityId,\n\t\t\t\tgenerator: entry.generator,\n\t\t\t\tdateCreated: entry.dateCreated,\n\t\t\t\tdateModified: entry.dateModified,\n\t\t\t\tretainUntil\n\t\t\t};\n\t\t\tawait this._entityStorageActivityLogs.set(updatedEntry);\n\t\t}\n\n\t\treturn entry;\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 by tenant as the data is partitioned\n\t\t\ttry {\n\t\t\t\tlet cursor;\n\t\t\t\tdo {\n\t\t\t\t\tconst result: { tenants: ITenant[]; cursor?: string } | undefined =\n\t\t\t\t\t\tawait this._tenantAdmin?.query(undefined, cursor);\n\t\t\t\t\tcursor = result?.cursor;\n\t\t\t\t\tif (!Is.empty(result)) {\n\t\t\t\t\t\tfor (const tenantId of result.tenants.map(t => t.id)) {\n\t\t\t\t\t\t\tconst localContextIds = (await ContextIdStore.getContextIds()) ?? {};\n\t\t\t\t\t\t\tlocalContextIds[ContextIdKeys.Tenant] = tenantId;\n\n\t\t\t\t\t\t\tawait ContextIdStore.run(localContextIds, async () => {\n\t\t\t\t\t\t\t\tnumRecordsDeleted += await this.cleanupActivityLogPartition();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} while (Is.stringValue(cursor));\n\t\t\t} catch (error) {\n\t\t\t\tawait this._logging?.log({\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tmessage: \"cleanupFailed\",\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\terror: BaseError.fromError(error)\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 (error) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: \"cleanupFailed\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\terror: BaseError.fromError(error)\n\t\t\t});\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 * Resolve the push-subscription storage or throw if it isn't registered. Pull-only\n\t * deployments may run the data plane without it.\n\t * @returns The push-subscription storage connector.\n\t * @throws GeneralError if the storage isn't registered.\n\t * @internal\n\t */\n\tprivate requirePushSubscriptionStorage(): IEntityStorageConnector<PushSubscription> {\n\t\tconst storage = EntityStorageConnectorFactory.getIfExists<\n\t\t\tIEntityStorageConnector<PushSubscription>\n\t\t>(this._pushSubscriptionStorageType);\n\t\tif (!storage) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"pushSubscriptionStorageNotRegistered\"\n\t\t\t);\n\t\t}\n\t\treturn storage;\n\t}\n\n\t/**\n\t * Deletes PushSubscription entities whose TransferProcess is absent, COMPLETED, or TERMINATED.\n\t * On multi-tenant nodes (`partitionContextIds` includes `Tenant`), iterates each registered tenant\n\t * and runs the cleanup inside that tenant's context so partitioned storage queries scope correctly.\n\t * @internal\n\t */\n\tprivate async cleanupOrphanedPushSubscriptions(): Promise<void> {\n\t\t// Pull-only deployments may run the data plane without push-subscription storage —\n\t\t// the scheduled cleanup task fires regardless, so silent no-op is the right behaviour.\n\t\tconst storage = EntityStorageConnectorFactory.getIfExists<\n\t\t\tIEntityStorageConnector<PushSubscription>\n\t\t>(this._pushSubscriptionStorageType);\n\t\tif (!storage) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet numDeleted = 0;\n\n\t\tif (this._partitionContextIds?.includes(ContextIdKeys.Tenant)) {\n\t\t\t// Per-tenant try/catch — a transient failure on one tenant must not poison the rest\n\t\t\t// of the cleanup pass. Each tenant gets its own attempt; failures are logged with the\n\t\t\t// offending tenantId so operators can triage.\n\t\t\tlet cursor;\n\t\t\tdo {\n\t\t\t\tlet result: { tenants: ITenant[]; cursor?: string } | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await this._tenantAdmin?.query(undefined, cursor);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tawait this._logging?.log({\n\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\tmessage: \"cleanupFailed\",\n\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\terror: BaseError.fromError(error)\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcursor = result?.cursor;\n\t\t\t\tif (!Is.empty(result)) {\n\t\t\t\t\tfor (const tenantId of result.tenants.map(t => t.id)) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst localContextIds = (await ContextIdStore.getContextIds()) ?? {};\n\t\t\t\t\t\t\tlocalContextIds[ContextIdKeys.Tenant] = tenantId;\n\n\t\t\t\t\t\t\tawait ContextIdStore.run(localContextIds, async () => {\n\t\t\t\t\t\t\t\tnumDeleted += await this.cleanupOrphanedPushSubscriptionsPartition();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tawait this._logging?.log({\n\t\t\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\t\t\tmessage: \"cleanupFailed\",\n\t\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\t\tdata: { tenantId },\n\t\t\t\t\t\t\t\terror: BaseError.fromError(error)\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (Is.stringValue(cursor));\n\t\t} else {\n\t\t\tnumDeleted += await this.cleanupOrphanedPushSubscriptionsPartition();\n\t\t}\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"debug\",\n\t\t\tmessage: \"pushSubscriptionsCleanedUp\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tdata: { numDeleted }\n\t\t});\n\t}\n\n\t/**\n\t * Per-partition cleanup body for orphaned PushSubscriptions. Must run inside the\n\t * target tenant's context on multi-tenant nodes (caller wraps `ContextIdStore.run`).\n\t * @returns The number of subscriptions deleted in this partition.\n\t * @internal\n\t */\n\tprivate async cleanupOrphanedPushSubscriptionsPartition(): Promise<number> {\n\t\tlet numDeleted = 0;\n\n\t\ttry {\n\t\t\t// First pass: read all pages without modifying storage to avoid cursor drift\n\t\t\tconst toDelete: string[] = [];\n\t\t\tlet cursor: string | undefined;\n\t\t\tdo {\n\t\t\t\tconst result = await this.requirePushSubscriptionStorage().query(\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tcursor\n\t\t\t\t);\n\t\t\t\tcursor = result.cursor;\n\n\t\t\t\tconst pids = (result.entities as PushSubscription[]).map(s => s.consumerPid);\n\n\t\t\t\t// Skip the transfer-process query when the page is empty.\n\t\t\t\tif (pids.length > 0) {\n\t\t\t\t\tconst tpResult = await this._transferProcessStorage.query({\n\t\t\t\t\t\tproperty: \"consumerPid\",\n\t\t\t\t\t\tvalue: pids,\n\t\t\t\t\t\tcomparison: ComparisonOperator.In\n\t\t\t\t\t});\n\t\t\t\t\tconst tpMap = new Map(tpResult.entities.map(tp => [tp.consumerPid, tp.state]));\n\n\t\t\t\t\tfor (const sub of result.entities as PushSubscription[]) {\n\t\t\t\t\t\tconst state = tpMap.get(sub.consumerPid);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!state ||\n\t\t\t\t\t\t\tstate === DataspaceProtocolTransferProcessStateType.COMPLETED ||\n\t\t\t\t\t\t\tstate === DataspaceProtocolTransferProcessStateType.TERMINATED\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttoDelete.push(sub.consumerPid);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (Is.stringValue(cursor));\n\n\t\t\t// Second pass: delete after all reads are complete\n\t\t\tfor (const pid of toDelete) {\n\t\t\t\tawait this.teardownPushSubscription(pid);\n\t\t\t\tnumDeleted++;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: \"cleanupFailed\",\n\t\t\t\tts: Date.now(),\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\terror: BaseError.fromError(error)\n\t\t\t});\n\t\t}\n\n\t\treturn numDeleted;\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): {\n\t\t[id: string]: {\n\t\t\tapp: IDataspaceApp;\n\t\t\tprocessingGroupId?: string;\n\t\t};\n\t} {\n\t\tconst matchingElements: {\n\t\t\t[id: string]: {\n\t\t\t\tapp: IDataspaceApp;\n\t\t\t\tprocessingGroupId?: string;\n\t\t\t};\n\t\t} = {};\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\tmatchingElements[appId] = {\n\t\t\t\t\t\tapp,\n\t\t\t\t\t\tprocessingGroupId: appQuery.processingGroupId\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 by its ID. Resolves via the tenant-supplied dataspace app\n\t * datasets stored by the Control Plane.\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\n\t\tconst fromAppDataset = await this._dataspaceAppDatasetStorage.get(datasetId);\n\t\tif (!Is.empty(fromAppDataset)) {\n\t\t\treturn {\n\t\t\t\t...(fromAppDataset.dataset as unknown as IDataspaceProtocolDataset),\n\t\t\t\t\"@id\": datasetId\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<IDataspaceApp> {\n\t\tconst matchingElements: IDataspaceApp[] = [];\n\t\tconst matchingIds: string[] = [];\n\n\t\t// Storage primary key is the dataset's @id, so a single get() resolves it.\n\t\tconst fromAppDataset = await this._dataspaceAppDatasetStorage.get(dataAssetQuery.datasetId);\n\t\tif (!Is.empty(fromAppDataset)) {\n\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(fromAppDataset.appId);\n\t\t\tmatchingElements.push(app);\n\t\t\tmatchingIds.push(fromAppDataset.appId);\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\tmatchingIds,\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 =\n\t\t\texistingEntry.tasks\n\t\t\t\t?.filter(t => t.status === ActivityTaskStatus.Failed)\n\t\t\t\t.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 =\n\t\t\texistingEntry.tasks\n\t\t\t\t?.filter(t => t.status === ActivityTaskStatus.Success)\n\t\t\t\t.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\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\": OdrlTypes.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\t/**\n\t * Processes a task for an activity, by creating a background task and registering the handler.\n\t * @param activityLogEntryId The ID of the activity log entry.\n\t * @param activity The activity to be processed.\n\t * @param handlerApps The handler applications for the activity.\n\t * @param dataspaceAppId The ID of the handler application.\n\t * @param taskEntries The list of activity log entries.\n\t * @param isRetry Indicates if this is a retry of a previous task.\n\t * @returns True if the task was processed inline.\n\t * @internal\n\t */\n\tprivate async processTask(\n\t\tactivityLogEntryId: string,\n\t\tactivity: IActivityStreamsActivity,\n\t\thandlerApps: { [id: string]: { app: IDataspaceApp; processingGroupId?: string } },\n\t\tdataspaceAppId: string,\n\t\ttaskEntries: IActivityTaskEntry[],\n\t\tisRetry: boolean\n\t): Promise<boolean> {\n\t\tconst handlerApp = handlerApps[dataspaceAppId].app;\n\t\tconst processingGroupId = handlerApps[dataspaceAppId].processingGroupId;\n\n\t\tconst payload: IExecutionPayload = {\n\t\t\tactivityLogEntryId,\n\t\t\tactivity: activity as IDataspaceActivity,\n\t\t\tdataspaceAppId\n\t\t};\n\n\t\t// If there is no processing group we execute the task inline without creating a background task\n\t\tconst isInlineTask = !Is.stringValue(processingGroupId);\n\t\tif (isInlineTask) {\n\t\t\tconst handleActivity = handlerApp?.handleActivity?.bind(handlerApp);\n\t\t\tif (!Is.function(handleActivity)) {\n\t\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"missingHandleActivity\", {\n\t\t\t\t\tdataspaceAppId\n\t\t\t\t});\n\t\t\t}\n\t\t\tlet taskError;\n\t\t\tlet taskResult;\n\t\t\ttry {\n\t\t\t\ttaskResult = await handleActivity(activity as IDataspaceActivity);\n\t\t\t} catch (error) {\n\t\t\t\tconst baseErr = BaseError.fromError(error);\n\t\t\t\tconst isSemanticError =\n\t\t\t\t\tBaseError.someErrorName(baseErr, ValidationError.CLASS_NAME) ||\n\t\t\t\t\tBaseError.someErrorName(baseErr, GuardError.CLASS_NAME);\n\t\t\t\ttaskError = isSemanticError\n\t\t\t\t\t? new UnprocessableError(\n\t\t\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\t\"activitySemanticError\",\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tbaseErr\n\t\t\t\t\t\t)\n\t\t\t\t\t: baseErr;\n\t\t\t}\n\n\t\t\tconst now = Date.now();\n\t\t\tconst taskEntry: IActivityTaskEntry = {\n\t\t\t\ttaskId: RandomHelper.generateUuidV7(\"compact\"),\n\t\t\t\tdataspaceAppId,\n\t\t\t\tprocessingGroupId,\n\t\t\t\tresult: taskResult,\n\t\t\t\tstartDate: new Date(now).toISOString(),\n\t\t\t\tendDate: new Date(now).toISOString(),\n\t\t\t\tstatus: Is.empty(taskError) ? ActivityTaskStatus.Success : ActivityTaskStatus.Failed,\n\t\t\t\terror: taskError?.toJsonObject()\n\t\t\t};\n\t\t\ttaskEntries.push(taskEntry);\n\n\t\t\tawait this.notifyTaskStatusChanged(\n\t\t\t\tpayload.activityLogEntryId,\n\t\t\t\tpayload.activity.id,\n\t\t\t\tpayload.dataspaceAppId,\n\t\t\t\ttaskEntry.taskId,\n\t\t\t\ttaskEntry.status\n\t\t\t);\n\t\t} else {\n\t\t\tconst processingGroups = handlerApp.processingGroups?.() ?? {};\n\t\t\tif (Is.empty(processingGroups[processingGroupId])) {\n\t\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"invalidProcessingGroupId\", {\n\t\t\t\t\tprocessingGroupId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst processingGroupOptions = processingGroups[processingGroupId];\n\n\t\t\tconst taskType = `${dataspaceAppId}${processingGroupId ? `-${processingGroupId}` : \"\"}`;\n\n\t\t\tconst taskId = await this._backgroundTaskComponent.create<IExecutionPayload>(\n\t\t\t\ttaskType,\n\t\t\t\tpayload,\n\t\t\t\t{\n\t\t\t\t\tretainFor: this._retainTasksFor,\n\t\t\t\t\tretryCount: processingGroupOptions?.retryCount ?? this._retryCount\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (!this._registeredTaskTypes.includes(taskType)) {\n\t\t\t\tthis._registeredTaskTypes.push(taskType);\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.finaliseBackgroundTask(task.id, task.status, task.payload);\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tmaxWorkerCount: processingGroupOptions?.concurrentTasks,\n\t\t\t\t\t\tidleShutdownTimeout: processingGroupOptions?.idleShutdownTimeout,\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\t\t\t}\n\n\t\t\ttaskEntries.push({\n\t\t\t\ttaskId,\n\t\t\t\tdataspaceAppId,\n\t\t\t\tprocessingGroupId,\n\t\t\t\tstatus: ActivityTaskStatus.Pending\n\t\t\t});\n\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: \"scheduledTask\",\n\t\t\t\tdata: {\n\t\t\t\t\ttaskId,\n\t\t\t\t\tdataspaceAppId,\n\t\t\t\t\tisRetry\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn isInlineTask;\n\t}\n\n\t/**\n\t * Constructs the activity log entry with processing status and associated tasks.\n\t * @param activityLog The activity log details retrieved from storage.\n\t * @param activityTasks The activity tasks associated with the log entry, if any.\n\t * @returns The complete activity log entry with status and tasks.\n\t * @internal\n\t */\n\tprivate async constructLogEntry(\n\t\tactivityLog: ActivityLogDetails,\n\t\tactivityTasks: ActivityTask | undefined\n\t): Promise<IActivityLogEntry> {\n\t\tlet tasks: IActivityTaskEntry[] | undefined;\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\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\ttasks = [];\n\n\t\t\tconst typeCount: {\n\t\t\t\t[status in TaskStatus]: number;\n\t\t\t} = {\n\t\t\t\t[TaskStatus.Pending]: 0,\n\t\t\t\t[TaskStatus.Processing]: 0,\n\t\t\t\t[TaskStatus.Success]: 0,\n\t\t\t\t[TaskStatus.Failed]: 0,\n\t\t\t\t[TaskStatus.Cancelled]: 0\n\t\t\t};\n\n\t\t\tfor (const entity of activityTasks.associatedTasks) {\n\t\t\t\tlet entry: IActivityTaskEntry | undefined;\n\t\t\t\tif (!Is.stringValue(entity.processingGroupId)) {\n\t\t\t\t\t// If there is no process group, the task was processed inline so the task status is already available in the entity\n\t\t\t\t\ttypeCount[entity.status]++;\n\t\t\t\t\tentry = entity;\n\t\t\t\t} else {\n\t\t\t\t\tconst taskDetails = await this._backgroundTaskComponent.get<IExecutionPayload, unknown>(\n\t\t\t\t\t\tentity.taskId\n\t\t\t\t\t);\n\t\t\t\t\tif (!Is.empty(taskDetails)) {\n\t\t\t\t\t\ttypeCount[taskDetails.status]++;\n\n\t\t\t\t\t\tswitch (taskDetails.status) {\n\t\t\t\t\t\t\tcase TaskStatus.Success:\n\t\t\t\t\t\t\t\tentry = {\n\t\t\t\t\t\t\t\t\t...entity,\n\t\t\t\t\t\t\t\t\tstatus: ActivityTaskStatus.Success,\n\t\t\t\t\t\t\t\t\tresult: taskDetails.result,\n\t\t\t\t\t\t\t\t\tstartDate: taskDetails?.dateCreated,\n\t\t\t\t\t\t\t\t\tendDate: taskDetails?.dateCompleted\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase TaskStatus.Pending:\n\t\t\t\t\t\t\t\tentry = { ...entity, status: ActivityTaskStatus.Pending };\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase TaskStatus.Processing:\n\t\t\t\t\t\t\t\tentry = {\n\t\t\t\t\t\t\t\t\t...entity,\n\t\t\t\t\t\t\t\t\tstatus: ActivityTaskStatus.Processing,\n\t\t\t\t\t\t\t\t\tstartDate: taskDetails.dateCreated\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase TaskStatus.Failed:\n\t\t\t\t\t\t\t\tentry = {\n\t\t\t\t\t\t\t\t\t...entity,\n\t\t\t\t\t\t\t\t\tstatus: ActivityTaskStatus.Failed,\n\t\t\t\t\t\t\t\t\terror: taskDetails.error\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase TaskStatus.Cancelled:\n\t\t\t\t\t\t\t\t// Nothing to do for cancelled tasks\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!Is.empty(entry)) {\n\t\t\t\t\ttasks.push(entry);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeCount[TaskStatus.Failed] > 0) {\n\t\t\t\tstatus = ActivityProcessingStatus.Error;\n\t\t\t} else if (typeCount[TaskStatus.Processing] > 0) {\n\t\t\t\tstatus = ActivityProcessingStatus.Running;\n\t\t\t} else if (typeCount[TaskStatus.Pending] > 0) {\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 { ...activityLog, status, tasks };\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 type { ITenantComponent, IUrlTransformerComponent } from \"@twin.org/api-models\";\nimport {\n\tTaskStatus,\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\tBaseError,\n\tComponentFactory,\n\tConflictError,\n\tConverter,\n\tGeneralError,\n\tGuardError,\n\tGuards,\n\tIs,\n\tJsonHelper,\n\tNotFoundError,\n\tRandomHelper,\n\tUnauthorizedError,\n\tUnprocessableError,\n\tValidation,\n\tValidationError,\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\tActivityTaskStatus,\n\tDataRequestType,\n\tDataspaceAppFactory,\n\tDataspaceContexts,\n\tDataspaceDataTypes,\n\tDataspaceTypes,\n\tgetJsonLdType,\n\ttype DataspaceAppDataset,\n\ttype IActivityLogEntry,\n\ttype IActivityLogStatusNotification,\n\ttype IActivityQuery,\n\ttype IActivityTaskEntry,\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 IFollowActivity,\n\ttype IPushDeliveryPayload,\n\ttype ITransferContext,\n\ttype IUndoActivity,\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 {\n\tActivityStreamsContexts,\n\tActivityStreamsTypes,\n\ttype IActivityStreamsActivity\n} from \"@twin.org/standards-w3c-activity-streams\";\nimport { OdrlContexts, OdrlTypes } 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 { PushSubscription } from \"./entities/pushSubscription.js\";\nimport type { IDataspaceDataPlaneServiceConstructorOptions } from \"./models/IDataspaceDataPlaneServiceConstructorOptions.js\";\n\nconst FOLLOW_ACTIVITY_URN_PREFIX = \"urn:x-follow:\";\nconst TRANSFER_URN_PREFIX = \"urn:x-transfer:\";\nconst UNDO_ACTIVITY_URN_PREFIX = \"urn:x-undo:\";\nconst ACTIVITY_LOG_URN_PREFIX = \"urn:x-activity-log:\";\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 * Background task type identifier for push delivery tasks.\n\t */\n\tpublic static readonly PUSH_DELIVERY_TASK_TYPE = \"push-delivery\";\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 * 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 * Track task handler registrations to avoid resetting worker pools on every task.\n\t * @internal\n\t */\n\tprivate readonly _registeredTaskTypes: string[];\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 * Retry count for failed tasks.\n\t * @internal\n\t */\n\tprivate readonly _retryCount?: number;\n\n\t/**\n\t * Max retry count for push delivery HTTP requests.\n\t * @internal\n\t */\n\tprivate readonly _pushRetryCount: number;\n\n\t/**\n\t * Base retry delay (ms) for push delivery HTTP requests.\n\t * @internal\n\t */\n\tprivate readonly _pushRetryBaseDelayMs: number;\n\n\t/**\n\t * Timeout (ms) for each push delivery HTTP POST request.\n\t * @internal\n\t */\n\tprivate readonly _pushTimeoutMs: 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 * Interval in minutes between orphaned PushSubscription cleanup scans.\n\t * @internal\n\t */\n\tprivate readonly _pushSubscriptionCleanupIntervalMinutes: 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 * The tenant component.\n\t * @internal\n\t */\n\tprivate readonly _tenantComponent?: ITenantComponent;\n\n\t/**\n\t * The component type name for the hosting component.\n\t * @internal\n\t */\n\tprivate readonly _urlTransformerComponent: IUrlTransformerComponent;\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 * Factory key used to look up the push-subscription storage. Resolved lazily at call time\n\t * (not at construction) so the storage may register after the data plane is built.\n\t * @internal\n\t */\n\tprivate readonly _pushSubscriptionStorageType: string;\n\n\t/**\n\t * Entity storage for tenant-supplied Dataspace App Dataset entities.\n\t * @internal\n\t */\n\tprivate readonly _dataspaceAppDatasetStorage: IEntityStorageConnector<DataspaceAppDataset>;\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\tthis._tenantComponent = ComponentFactory.getIfExists<ITenantComponent>(\n\t\t\toptions?.tenantComponentType ?? \"tenant\"\n\t\t);\n\n\t\tthis._urlTransformerComponent = ComponentFactory.get<IUrlTransformerComponent>(\n\t\t\toptions?.urlTransformerComponentType ?? \"url-transformer\"\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\t// Push-subscription storage is optional and resolved lazily. The data plane is typically\n\t\t// constructed before its dependent storages register, so caching the connector here would\n\t\t// permanently miss it. We only need the factory key — every push call site re-resolves.\n\t\tthis._pushSubscriptionStorageType =\n\t\t\toptions?.pushSubscriptionEntityStorageType ?? nameofKebabCase<PushSubscription>();\n\n\t\tthis._dataspaceAppDatasetStorage = EntityStorageConnectorFactory.get<\n\t\t\tIEntityStorageConnector<DataspaceAppDataset>\n\t\t>(options?.dataspaceAppDatasetEntityStorageType ?? nameofKebabCase<DataspaceAppDataset>());\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._registeredTaskTypes = [];\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._retryCount = options?.config?.retryCount;\n\t\tthis._pushRetryCount = options?.config?.pushRetryCount ?? 3;\n\t\tthis._pushRetryBaseDelayMs = options?.config?.pushRetryBaseDelayMs ?? 1000;\n\t\tthis._pushTimeoutMs = options?.config?.pushTimeoutMs ?? 30000;\n\t\tthis._activityLogCleanUpInterval = DataspaceDataPlaneService._DEFAULT_CLEANUP_INTERVAL;\n\t\tthis._pushSubscriptionCleanupIntervalMinutes = Math.max(\n\t\t\t1,\n\t\t\tMath.round((options?.config?.pushSubscriptionCleanupIntervalMs ?? 3_600_000) / 60_000)\n\t\t);\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\n\t\tif (!Is.empty(options?.config?.pushTimeoutMs)) {\n\t\t\tGuards.integer(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tnameof(options.config.pushTimeoutMs),\n\t\t\t\toptions.config.pushTimeoutMs\n\t\t\t);\n\t\t\tValidation.integer(\n\t\t\t\tnameof(options.config.pushTimeoutMs),\n\t\t\t\toptions.config.pushTimeoutMs,\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._pushTimeoutMs = options.config.pushTimeoutMs;\n\t\t}\n\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\tawait this._backgroundTaskComponent.registerHandler<IPushDeliveryPayload, unknown>(\n\t\t\tDataspaceDataPlaneService.PUSH_DELIVERY_TASK_TYPE,\n\t\t\t\"@twin.org/dataspace-app-runner\",\n\t\t\t\"pushDeliveryRunner\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tinitialiseMethod: \"pushDeliveryRunnerStart\",\n\t\t\t\tshutdownMethod: \"pushDeliveryRunnerEnd\",\n\t\t\t\tidleShutdownTimeout: -1\n\t\t\t}\n\t\t);\n\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\n\t\tconst pushCleanupTaskTime: IScheduledTaskTime[] = [\n\t\t\t{\n\t\t\t\tnextTriggerTime: Date.now() + 10_000,\n\t\t\t\t...this.calculateCleaningTaskSchedule(this._pushSubscriptionCleanupIntervalMinutes)\n\t\t\t}\n\t\t];\n\n\t\tawait this._taskScheduler.addTask(\n\t\t\t\"dataspace-push-subscription-cleanup\",\n\t\t\tpushCleanupTaskTime,\n\t\t\tasync () => {\n\t\t\t\tawait this.cleanupOrphanedPushSubscriptions();\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 * @param trustPayload Optional trust payload to verify the requester's identity.\n\t * @returns The activity's id or entry.\n\t */\n\tpublic async notifyActivity(\n\t\tactivity: IActivityStreamsActivity,\n\t\ttrustPayload?: unknown\n\t): Promise<string | IActivityLogEntry> {\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\t// For cross-node push deliveries the caller presents a JWT. Verify it,\n\t\t// confirm the referenced transfer is still in STARTED state, and assert\n\t\t// the verified identity is one of the two parties on that transfer.\n\t\tif (Is.stringValue(trustPayload)) {\n\t\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\t\tthis._trustComponent,\n\t\t\t\ttrustPayload,\n\t\t\t\t\"notifyActivity\"\n\t\t\t);\n\t\t\tconst generatorPid = this.calculateActivityGeneratorIdentity(activity);\n\t\t\t// Primary lookup: by consumerPid (the entity's primary key). If this hits, the\n\t\t\t// generator's PID equals consumerPid — the generator is the consumer side.\n\t\t\tlet transferProcess = await this._transferProcessStorage.get(generatorPid);\n\t\t\tconst generatorIsConsumer = Boolean(transferProcess);\n\n\t\t\tif (!transferProcess) {\n\t\t\t\t// Fallback: generatorPid === providerPid. providerPid is a UUIDv7 so it's\n\t\t\t\t// unique per transfer, but defensively reject any case where the secondary\n\t\t\t\t// index returns more than one match — silent first-match would risk\n\t\t\t\t// authorising the wrong transfer if the invariant ever breaks.\n\t\t\t\tconst result = await this._transferProcessStorage.query({\n\t\t\t\t\tconditions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"providerPid\",\n\t\t\t\t\t\t\tvalue: generatorPid,\n\t\t\t\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t\tif (result.entities.length > 1) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\"pushActivityNotAuthorized\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttransferProcess = result.entities[0] as TransferProcess | undefined;\n\t\t\t\t// generatorIsConsumer stays false → generator is the provider side.\n\t\t\t}\n\n\t\t\tif (transferProcess?.state !== DataspaceProtocolTransferProcessStateType.STARTED) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"pushActivityNotAuthorized\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Bind the verified identity to the side of the transfer matching the claimed\n\t\t\t// generator. Without this, a party with a valid token for transfer X can post\n\t\t\t// an activity claiming to be the other party on the same transfer.\n\t\t\t// Stored consumer/provider identities are composites\n\t\t\t// (`nodeDid:hash(tenantId)`)\n\t\t\tconst expectedIdentity = generatorIsConsumer\n\t\t\t\t? transferProcess.consumerIdentity\n\t\t\t\t: transferProcess.providerIdentity;\n\t\t\tconst callerComposite = Is.stringValue(trustInfo.tenantId)\n\t\t\t\t? `${trustInfo.identity}:${trustInfo.tenantId}`\n\t\t\t\t: trustInfo.identity;\n\t\t\tif (!Is.stringValue(expectedIdentity) || callerComposite !== expectedIdentity) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"pushActivityNotAuthorized\"\n\t\t\t\t);\n\t\t\t}\n\t\t}\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 = `${ACTIVITY_LOG_URN_PREFIX}${activityLogId}`;\n\n\t\t// Check if entry already exists\n\t\tlet logEntry = await this._entityStorageActivityLogs.get(activityLogEntryId);\n\t\tlet existingSuccessfulApps: string[] = [];\n\t\tlet isRetry = false;\n\t\tconst now = Date.now();\n\n\t\tif (!Is.undefined(logEntry)) {\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\tlogEntry = {\n\t\t\t\tid: activityLogEntryId,\n\t\t\t\tactivityId: activity.id,\n\t\t\t\tgenerator: this.calculateActivityGeneratorIdentity(activity),\n\t\t\t\tdateCreated: new Date(now).toISOString(),\n\t\t\t\tdateModified: new Date(now).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 taskEntries: IActivityTaskEntry[] = [];\n\t\tconst handlerApps: {\n\t\t\t[id: string]: {\n\t\t\t\tapp: IDataspaceApp;\n\t\t\t\tprocessingGroupId?: string;\n\t\t\t};\n\t\t} = {};\n\n\t\tfor (const query of activityQuerySet) {\n\t\t\tconst apps = this.getAppForActivityQuery(query);\n\t\t\tfor (const appId in apps) {\n\t\t\t\t// Only process apps that haven't already completed successfully\n\t\t\t\tif (!handlerApps[appId] && !existingSuccessfulApps.includes(appId)) {\n\t\t\t\t\thandlerApps[appId] = apps[appId];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet inlineCount = 0;\n\t\tfor (const handlerAppId in handlerApps) {\n\t\t\tif (\n\t\t\t\tawait this.processTask(\n\t\t\t\t\tactivityLogEntryId,\n\t\t\t\t\tactivity,\n\t\t\t\t\thandlerApps,\n\t\t\t\t\thandlerAppId,\n\t\t\t\t\ttaskEntries,\n\t\t\t\t\tisRetry\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tinlineCount++;\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\tconst activityTask: ActivityTask = {\n\t\t\tactivityLogEntryId,\n\t\t\tassociatedTasks: [...existingTasksToKeep, ...taskEntries]\n\t\t};\n\n\t\tawait this._entityStorageActivityTasks.set(activityTask);\n\n\t\tif (inlineCount === taskEntries.length) {\n\t\t\treturn this.finaliseActivityLogEntry(activityLogEntryId);\n\t\t}\n\n\t\treturn activityTask.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 activityLog = await this._entityStorageActivityLogs.get(logEntryId);\n\t\tif (Is.undefined(activityLog)) {\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\tconst activityTasks = await this._entityStorageActivityTasks.get(logEntryId);\n\n\t\treturn this.constructLogEntry(activityLog, activityTasks);\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 app = await this.getAppForDataAssetQuery({ datasetId });\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 app = await this.getAppForDataAssetQuery({ datasetId });\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 * Set up a push subscription after a transfer enters STARTED from REQUESTED.\n\t * Reads the TransferProcess, builds an IFollowActivity, calls the app's\n\t * subscribeToData, and persists a PushSubscription entity.\n\t * @param consumerPid The consumer process ID identifying the transfer.\n\t */\n\tpublic async setupPushSubscription(consumerPid: string): Promise<void> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tconst transferProcess = await this._transferProcessStorage.get(consumerPid);\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\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\tif (!Is.stringValue(transferProcess.dataAddress?.endpoint)) {\n\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"transferMissingDataAddress\", {\n\t\t\t\tconsumerPid\n\t\t\t});\n\t\t}\n\n\t\t// On multi-tenant publishers, the consumer must have baked its tenant token into the\n\t\t// callback URL so the consumer's TenantProcessor can route inbound push deliveries.\n\t\t// Reject at setup time rather than silently 401 every push.\n\t\t// Parse as a real URL so we match on the actual query parameter, not a substring\n\t\t// in a path segment / value position.\n\t\tif (this._partitionContextIds?.includes(ContextIdKeys.Tenant)) {\n\t\t\tconst tenantId = await this._urlTransformerComponent.getEncryptedFromUrl(\n\t\t\t\ttransferProcess.dataAddress.endpoint,\n\t\t\t\t\"tenant\"\n\t\t\t);\n\t\t\tif (!Is.stringValue(tenantId)) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"pushSubscriptionMissingTenantToken\",\n\t\t\t\t\t{ consumerPid, endpoint: transferProcess.dataAddress.endpoint }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst followActivityId = `${FOLLOW_ACTIVITY_URN_PREFIX}${RandomHelper.generateUuidV7(\"compact\")}`;\n\t\tconst followActivity: IFollowActivity = {\n\t\t\t\"@context\": ActivityStreamsContexts.Context,\n\t\t\tid: followActivityId,\n\t\t\ttype: ActivityStreamsTypes.Follow,\n\t\t\tgenerator: transferProcess.consumerPid,\n\t\t\tactor: transferProcess.consumerIdentity ?? \"\",\n\t\t\tobject: { id: `${TRANSFER_URN_PREFIX}${transferProcess.consumerPid}` }\n\t\t};\n\n\t\tlet appForCompensation: IDataspaceApp | undefined;\n\t\tif (Is.stringValue(transferProcess.datasetId)) {\n\t\t\tconst appDataset = await this._dataspaceAppDatasetStorage.get(transferProcess.datasetId);\n\t\t\tif (appDataset) {\n\t\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appDataset.appId);\n\t\t\t\tawait app.subscribeToData?.(followActivity);\n\t\t\t\tappForCompensation = app;\n\t\t\t}\n\t\t}\n\n\t\tconst setupContextIds = await ContextIdStore.getContextIds();\n\t\tconst setupTenantId = setupContextIds?.[ContextIdKeys.Tenant];\n\t\tconst subscription: PushSubscription = {\n\t\t\tconsumerPid: transferProcess.consumerPid,\n\t\t\tproviderPid: transferProcess.providerPid,\n\t\t\tfollowActivityId,\n\t\t\tdatasetId: transferProcess.datasetId,\n\t\t\ttenantId: Is.stringValue(setupTenantId) ? setupTenantId : undefined,\n\t\t\tconsumerEndpoint: transferProcess.dataAddress.endpoint,\n\t\t\tconsumerAuthToken: transferProcess.dataAddress.endpointProperties?.find(\n\t\t\t\tp => p.name === \"authorization\"\n\t\t\t)?.value,\n\t\t\tpaused: false,\n\t\t\tdateCreated: new Date().toISOString(),\n\t\t\tdateModified: new Date().toISOString()\n\t\t};\n\n\t\ttry {\n\t\t\tawait this.requirePushSubscriptionStorage().set(subscription);\n\t\t} catch (storageError) {\n\t\t\t// Compensating Undo: the app's subscribeToData succeeded but the row didn't\n\t\t\t// persist. Without compensation, a retry generates a new followActivityId and\n\t\t\t// registers a second Follow on the app — with no persisted id to drive an Undo.\n\t\t\tif (appForCompensation) {\n\t\t\t\tconst compensatingUndo: IUndoActivity = {\n\t\t\t\t\t\"@context\": ActivityStreamsContexts.Context,\n\t\t\t\t\tid: `${UNDO_ACTIVITY_URN_PREFIX}${RandomHelper.generateUuidV7(\"compact\")}`,\n\t\t\t\t\ttype: ActivityStreamsTypes.Undo,\n\t\t\t\t\tgenerator: transferProcess.consumerPid,\n\t\t\t\t\tactor: transferProcess.consumerIdentity ?? \"\",\n\t\t\t\t\tobject: followActivityId\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\tawait appForCompensation.unsubscribeToData?.(compensatingUndo);\n\t\t\t\t} catch (compensationError) {\n\t\t\t\t\tawait this._logging?.log({\n\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\tmessage: \"pushSubscriptionCompensationFailed\",\n\t\t\t\t\t\tdata: { consumerPid, providerPid: transferProcess.providerPid },\n\t\t\t\t\t\terror: BaseError.fromError(compensationError)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow storageError;\n\t\t}\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"pushSubscriptionCreated\",\n\t\t\tdata: { consumerPid, providerPid: transferProcess.providerPid }\n\t\t});\n\t}\n\n\t/**\n\t * Pause deliveries for a push subscription. The subscription entity stays\n\t * alive with status=Paused. No app unsubscribe call.\n\t * @param consumerPid The consumer process ID identifying the transfer.\n\t */\n\tpublic async suspendPushSubscription(consumerPid: string): Promise<void> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tconst subscription = await this.requirePushSubscriptionStorage().get(consumerPid);\n\t\tif (!subscription) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"pushSubscriptionNotFound\",\n\t\t\t\tconsumerPid\n\t\t\t);\n\t\t}\n\n\t\tif (subscription.paused) {\n\t\t\treturn;\n\t\t}\n\n\t\tsubscription.paused = true;\n\t\tsubscription.dateModified = new Date().toISOString();\n\t\tawait this.requirePushSubscriptionStorage().set(subscription);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"pushSubscriptionSuspended\",\n\t\t\tdata: { consumerPid }\n\t\t});\n\t}\n\n\t/**\n\t * Resume deliveries after a SUSPENDED → STARTED transition. Flips status\n\t * back to Active. No app subscribeToData call.\n\t * @param consumerPid The consumer process ID identifying the transfer.\n\t */\n\tpublic async resumePushSubscription(consumerPid: string): Promise<void> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tconst subscription = await this.requirePushSubscriptionStorage().get(consumerPid);\n\t\tif (!subscription) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"pushSubscriptionNotFound\",\n\t\t\t\tconsumerPid\n\t\t\t);\n\t\t}\n\n\t\tif (!subscription.paused) {\n\t\t\treturn;\n\t\t}\n\n\t\tsubscription.paused = false;\n\t\tsubscription.dateModified = new Date().toISOString();\n\t\tawait this.requirePushSubscriptionStorage().set(subscription);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"pushSubscriptionResumed\",\n\t\t\tdata: { consumerPid }\n\t\t});\n\t}\n\n\t/**\n\t * Tear down a push subscription. Builds an IUndoActivity, calls the app's\n\t * unsubscribeToData, and deletes the PushSubscription entity.\n\t * @param consumerPid The consumer process ID identifying the transfer.\n\t */\n\tpublic async teardownPushSubscription(consumerPid: string): Promise<void> {\n\t\tGuards.stringValue(DataspaceDataPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tconst subscription = await this.requirePushSubscriptionStorage().get(consumerPid);\n\t\tif (!subscription) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"pushSubscriptionNotFoundOnTeardown\",\n\t\t\t\tdata: { consumerPid }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst transferProcess = await this._transferProcessStorage.get(consumerPid);\n\n\t\tconst undoActivity: IUndoActivity = {\n\t\t\t\"@context\": ActivityStreamsContexts.Context,\n\t\t\tid: `${UNDO_ACTIVITY_URN_PREFIX}${RandomHelper.generateUuidV7(\"compact\")}`,\n\t\t\ttype: ActivityStreamsTypes.Undo,\n\t\t\tgenerator: subscription.consumerPid,\n\t\t\tactor: transferProcess?.consumerIdentity ?? \"\",\n\t\t\tobject: subscription.followActivityId\n\t\t};\n\n\t\tif (Is.stringValue(subscription.datasetId)) {\n\t\t\tconst appDataset = await this._dataspaceAppDatasetStorage.get(subscription.datasetId);\n\t\t\tif (appDataset) {\n\t\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appDataset.appId);\n\t\t\t\tawait app.unsubscribeToData?.(undoActivity);\n\t\t\t}\n\t\t}\n\n\t\tawait this.requirePushSubscriptionStorage().remove(consumerPid);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"pushSubscriptionTornDown\",\n\t\t\tdata: { consumerPid, providerPid: subscription.providerPid }\n\t\t});\n\t}\n\n\t/**\n\t * Schedule a push delivery when the app has new outbound data.\n\t * @param activity The outbound activity carrying the data payload.\n\t */\n\tpublic async processOutboxActivity(activity: IActivityStreamsActivity): Promise<void> {\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\t// Extract consumerPid from activity.to\n\t\tlet consumerPid: string | undefined;\n\t\tif (Is.stringValue(activity.to)) {\n\t\t\tconsumerPid = activity.to;\n\t\t} else if (Is.array(activity.to)) {\n\t\t\tif (activity.to.length > 1) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\"processOutboxActivityMultipleTo\",\n\t\t\t\t\t{ count: activity.to.length }\n\t\t\t\t);\n\t\t\t}\n\t\t\tconsumerPid = activity.to[0] as string | undefined;\n\t\t}\n\n\t\tif (!Is.stringValue(consumerPid)) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"pushSubscriptionNotFoundForActivity\",\n\t\t\t\tdata: { consumerPid }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Load PushSubscription\n\t\tconst subscription = await this.requirePushSubscriptionStorage().get(consumerPid);\n\t\tif (!subscription) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"pushSubscriptionNotFoundForActivity\",\n\t\t\t\tdata: { consumerPid }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Skip delivery if subscription is paused\n\t\tif (subscription.paused) {\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: \"pushDeliverySkippedPaused\",\n\t\t\t\tdata: { consumerPid }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Load TransferProcess and validate it is STARTED\n\t\tconst transferProcess = await this._transferProcessStorage.get(consumerPid);\n\t\tif (transferProcess?.state !== DataspaceProtocolTransferProcessStateType.STARTED) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"pushSubscriptionNotFoundForActivity\",\n\t\t\t\tdata: { consumerPid }\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Build agreement from stored transfer context\n\t\tconst { agreement } = this.buildTransferContext(transferProcess);\n\n\t\t// Extract data object from activity; a string value is an IRI reference — wrap it so the IRI is preserved.\n\t\tlet data: IJsonLdNodeObject;\n\t\tif (Is.object(activity.object)) {\n\t\t\tdata = activity.object;\n\t\t} else if (Is.stringValue(activity.object)) {\n\t\t\tdata = { \"@id\": activity.object };\n\t\t} else {\n\t\t\tdata = {};\n\t\t}\n\t\tconst entityType = Is.object(activity.object) ? (getJsonLdType(activity.object) ?? \"\") : \"\";\n\n\t\t// Capture the subscription's tenantId so the background-task runner can re-enter the\n\t\t// owning tenant's context before any tenant-scoped operation (PEP, trust signing).\n\t\t// Falls back to the current request context if the subscription pre-dates tenantId capture.\n\t\tlet payloadTenantId: string | undefined = subscription.tenantId;\n\t\tif (!Is.stringValue(payloadTenantId)) {\n\t\t\tconst ctxIds = await ContextIdStore.getContextIds();\n\t\t\tconst ctxTenant = ctxIds?.[ContextIdKeys.Tenant];\n\t\t\tpayloadTenantId = Is.stringValue(ctxTenant) ? ctxTenant : undefined;\n\t\t}\n\n\t\tconst payload: IPushDeliveryPayload = {\n\t\t\tconsumerPid,\n\t\t\tproviderPid: transferProcess.providerPid,\n\t\t\tgeneratorPid: transferProcess.providerPid,\n\t\t\tconsumerEndpoint: subscription.consumerEndpoint,\n\t\t\tconsumerAuthToken: subscription.consumerAuthToken,\n\t\t\tagreement,\n\t\t\tdata,\n\t\t\tentityType,\n\t\t\ttenantId: payloadTenantId,\n\t\t\tpushTimeoutMs: this._pushTimeoutMs,\n\t\t\tpushRetryCount: this._pushRetryCount,\n\t\t\tpushRetryBaseDelayMs: this._pushRetryBaseDelayMs\n\t\t};\n\n\t\tconst taskId = await this._backgroundTaskComponent.create<IPushDeliveryPayload>(\n\t\t\tDataspaceDataPlaneService.PUSH_DELIVERY_TASK_TYPE,\n\t\t\tpayload,\n\t\t\t{ retainFor: this._retainTasksFor, retryCount: this._retryCount }\n\t\t);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tmessage: \"pushDeliveryTaskScheduled\",\n\t\t\tdata: { taskId, consumerPid }\n\t\t});\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 taskId The Id of the Activity Log Entry.\n\t * @param status The final status of the task.\n\t * @param payload The execution payload of the task, required to correlate to the Activity Log Entry and update the processing status.\n\t * @internal\n\t */\n\tprivate async finaliseBackgroundTask(\n\t\ttaskId: string,\n\t\tstatus: TaskStatus,\n\t\tpayload?: IExecutionPayload\n\t): Promise<void> {\n\t\tif (Is.empty(payload)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (status === TaskStatus.Success || status === TaskStatus.Failed) {\n\t\t\tawait this.notifyTaskStatusChanged(\n\t\t\t\tpayload.activityLogEntryId,\n\t\t\t\tpayload.activity.id,\n\t\t\t\tpayload.dataspaceAppId,\n\t\t\t\ttaskId,\n\t\t\t\tstatus\n\t\t\t);\n\n\t\t\tawait this.finaliseActivityLogEntry(payload.activityLogEntryId);\n\t\t}\n\t}\n\n\t/**\n\t * Notify registered callbacks about a task status change.\n\t * @param activityLogEntryId The Id of the Activity Log Entry.\n\t * @param activityId The Id of the Activity.\n\t * @param dataspaceAppId The Id of the Dataspace App associated with the task.\n\t * @param taskId The Id of the task.\n\t * @param taskStatus The new status of the task.\n\t * @internal\n\t */\n\tprivate async notifyTaskStatusChanged(\n\t\tactivityLogEntryId: string,\n\t\tactivityId: string | undefined,\n\t\tdataspaceAppId: string,\n\t\ttaskId: string,\n\t\ttaskStatus: TaskStatus\n\t): Promise<void> {\n\t\tfor (const callback of Object.values(this._activityLogStatusCallbacks)) {\n\t\t\tawait callback({\n\t\t\t\tactivityLogEntryId,\n\t\t\t\tactivityId,\n\t\t\t\ttaskProcessingStatus: {\n\t\t\t\t\tdataspaceAppId,\n\t\t\t\t\ttaskId,\n\t\t\t\t\ttaskStatus\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Finalizes the Activity Log Entry by checking if all associated tasks have completed and, if so, updating the entry to be retained for the configured retention period.\n\t * @param activityLogEntryId The Id of the Activity Log Entry to finalize.\n\t * @returns The Activity Log Entry with updated retention details if applicable.\n\t * @internal\n\t */\n\tprivate async finaliseActivityLogEntry(activityLogEntryId: string): Promise<IActivityLogEntry> {\n\t\tconst entry = await this.getActivityLogEntry(activityLogEntryId);\n\t\tif (\n\t\t\tthis._retainActivityLogsFor !== -1 &&\n\t\t\t(entry.status === ActivityProcessingStatus.Completed ||\n\t\t\t\tentry.status === ActivityProcessingStatus.Error)\n\t\t) {\n\t\t\tconst retainUntil = Date.now() + this._retainActivityLogsFor;\n\t\t\tconst updatedEntry: ActivityLogDetails = {\n\t\t\t\tid: entry.id,\n\t\t\t\tactivityId: entry.activityId,\n\t\t\t\tgenerator: entry.generator,\n\t\t\t\tdateCreated: entry.dateCreated,\n\t\t\t\tdateModified: entry.dateModified,\n\t\t\t\tretainUntil\n\t\t\t};\n\t\t\tawait this._entityStorageActivityLogs.set(updatedEntry);\n\t\t}\n\n\t\treturn entry;\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 by tenant as the data is partitioned\n\t\t\tawait this._tenantComponent?.runPerTenant(async () => {\n\t\t\t\tnumRecordsDeleted += await this.cleanupActivityLogPartition();\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 (error) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: \"cleanupFailed\",\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\terror: BaseError.fromError(error)\n\t\t\t});\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 * Resolve the push-subscription storage or throw if it isn't registered. Pull-only\n\t * deployments may run the data plane without it.\n\t * @returns The push-subscription storage connector.\n\t * @throws GeneralError if the storage isn't registered.\n\t * @internal\n\t */\n\tprivate requirePushSubscriptionStorage(): IEntityStorageConnector<PushSubscription> {\n\t\tconst storage = EntityStorageConnectorFactory.getIfExists<\n\t\t\tIEntityStorageConnector<PushSubscription>\n\t\t>(this._pushSubscriptionStorageType);\n\t\tif (!storage) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\"pushSubscriptionStorageNotRegistered\"\n\t\t\t);\n\t\t}\n\t\treturn storage;\n\t}\n\n\t/**\n\t * Deletes PushSubscription entities whose TransferProcess is absent, COMPLETED, or TERMINATED.\n\t * On multi-tenant nodes (`partitionContextIds` includes `Tenant`), iterates each registered tenant\n\t * and runs the cleanup inside that tenant's context so partitioned storage queries scope correctly.\n\t * @internal\n\t */\n\tprivate async cleanupOrphanedPushSubscriptions(): Promise<void> {\n\t\t// Pull-only deployments may run the data plane without push-subscription storage —\n\t\t// the scheduled cleanup task fires regardless, so silent no-op is the right behaviour.\n\t\tconst storage = EntityStorageConnectorFactory.getIfExists<\n\t\t\tIEntityStorageConnector<PushSubscription>\n\t\t>(this._pushSubscriptionStorageType);\n\t\tif (!storage) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet numDeleted = 0;\n\n\t\tif (this._partitionContextIds?.includes(ContextIdKeys.Tenant)) {\n\t\t\t// The cleanup must be done by tenant as the data is partitioned\n\t\t\tawait this._tenantComponent?.runPerTenant(async () => {\n\t\t\t\tnumDeleted += await this.cleanupOrphanedPushSubscriptionsPartition();\n\t\t\t});\n\t\t} else {\n\t\t\tnumDeleted += await this.cleanupOrphanedPushSubscriptionsPartition();\n\t\t}\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"debug\",\n\t\t\tmessage: \"pushSubscriptionsCleanedUp\",\n\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\tdata: { numDeleted }\n\t\t});\n\t}\n\n\t/**\n\t * Per-partition cleanup body for orphaned PushSubscriptions. Must run inside the\n\t * target tenant's context on multi-tenant nodes (caller wraps `ContextIdStore.run`).\n\t * @returns The number of subscriptions deleted in this partition.\n\t * @internal\n\t */\n\tprivate async cleanupOrphanedPushSubscriptionsPartition(): Promise<number> {\n\t\tlet numDeleted = 0;\n\n\t\ttry {\n\t\t\t// First pass: read all pages without modifying storage to avoid cursor drift\n\t\t\tconst toDelete: string[] = [];\n\t\t\tlet cursor: string | undefined;\n\t\t\tdo {\n\t\t\t\tconst result = await this.requirePushSubscriptionStorage().query(\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tcursor\n\t\t\t\t);\n\t\t\t\tcursor = result.cursor;\n\n\t\t\t\tconst pids = (result.entities as PushSubscription[]).map(s => s.consumerPid);\n\n\t\t\t\t// Skip the transfer-process query when the page is empty.\n\t\t\t\tif (pids.length > 0) {\n\t\t\t\t\tconst tpResult = await this._transferProcessStorage.query({\n\t\t\t\t\t\tproperty: \"consumerPid\",\n\t\t\t\t\t\tvalue: pids,\n\t\t\t\t\t\tcomparison: ComparisonOperator.In\n\t\t\t\t\t});\n\t\t\t\t\tconst tpMap = new Map(tpResult.entities.map(tp => [tp.consumerPid, tp.state]));\n\n\t\t\t\t\tfor (const sub of result.entities as PushSubscription[]) {\n\t\t\t\t\t\tconst state = tpMap.get(sub.consumerPid);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!state ||\n\t\t\t\t\t\t\tstate === DataspaceProtocolTransferProcessStateType.COMPLETED ||\n\t\t\t\t\t\t\tstate === DataspaceProtocolTransferProcessStateType.TERMINATED\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttoDelete.push(sub.consumerPid);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (Is.stringValue(cursor));\n\n\t\t\t// Second pass: delete after all reads are complete\n\t\t\tfor (const pid of toDelete) {\n\t\t\t\tawait this.teardownPushSubscription(pid);\n\t\t\t\tnumDeleted++;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: \"cleanupFailed\",\n\t\t\t\tts: Date.now(),\n\t\t\t\tsource: DataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\terror: BaseError.fromError(error)\n\t\t\t});\n\t\t}\n\n\t\treturn numDeleted;\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): {\n\t\t[id: string]: {\n\t\t\tapp: IDataspaceApp;\n\t\t\tprocessingGroupId?: string;\n\t\t};\n\t} {\n\t\tconst matchingElements: {\n\t\t\t[id: string]: {\n\t\t\t\tapp: IDataspaceApp;\n\t\t\t\tprocessingGroupId?: string;\n\t\t\t};\n\t\t} = {};\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\tmatchingElements[appId] = {\n\t\t\t\t\t\tapp,\n\t\t\t\t\t\tprocessingGroupId: appQuery.processingGroupId\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 by its ID. Resolves via the tenant-supplied dataspace app\n\t * datasets stored by the Control Plane.\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\n\t\tconst fromAppDataset = await this._dataspaceAppDatasetStorage.get(datasetId);\n\t\tif (!Is.empty(fromAppDataset)) {\n\t\t\treturn {\n\t\t\t\t...(fromAppDataset.dataset as unknown as IDataspaceProtocolDataset),\n\t\t\t\t\"@id\": datasetId\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<IDataspaceApp> {\n\t\tconst matchingElements: IDataspaceApp[] = [];\n\t\tconst matchingIds: string[] = [];\n\n\t\t// Storage primary key is the dataset's @id, so a single get() resolves it.\n\t\tconst fromAppDataset = await this._dataspaceAppDatasetStorage.get(dataAssetQuery.datasetId);\n\t\tif (!Is.empty(fromAppDataset)) {\n\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(fromAppDataset.appId);\n\t\t\tmatchingElements.push(app);\n\t\t\tmatchingIds.push(fromAppDataset.appId);\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\tmatchingIds,\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 =\n\t\t\texistingEntry.tasks\n\t\t\t\t?.filter(t => t.status === ActivityTaskStatus.Failed)\n\t\t\t\t.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 =\n\t\t\texistingEntry.tasks\n\t\t\t\t?.filter(t => t.status === ActivityTaskStatus.Success)\n\t\t\t\t.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\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\": OdrlTypes.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\t/**\n\t * Processes a task for an activity, by creating a background task and registering the handler.\n\t * @param activityLogEntryId The ID of the activity log entry.\n\t * @param activity The activity to be processed.\n\t * @param handlerApps The handler applications for the activity.\n\t * @param dataspaceAppId The ID of the handler application.\n\t * @param taskEntries The list of activity log entries.\n\t * @param isRetry Indicates if this is a retry of a previous task.\n\t * @returns True if the task was processed inline.\n\t * @internal\n\t */\n\tprivate async processTask(\n\t\tactivityLogEntryId: string,\n\t\tactivity: IActivityStreamsActivity,\n\t\thandlerApps: { [id: string]: { app: IDataspaceApp; processingGroupId?: string } },\n\t\tdataspaceAppId: string,\n\t\ttaskEntries: IActivityTaskEntry[],\n\t\tisRetry: boolean\n\t): Promise<boolean> {\n\t\tconst handlerApp = handlerApps[dataspaceAppId].app;\n\t\tconst processingGroupId = handlerApps[dataspaceAppId].processingGroupId;\n\n\t\tconst payload: IExecutionPayload = {\n\t\t\tactivityLogEntryId,\n\t\t\tactivity: activity as IDataspaceActivity,\n\t\t\tdataspaceAppId\n\t\t};\n\n\t\t// If there is no processing group we execute the task inline without creating a background task\n\t\tconst isInlineTask = !Is.stringValue(processingGroupId);\n\t\tif (isInlineTask) {\n\t\t\tconst handleActivity = handlerApp?.handleActivity?.bind(handlerApp);\n\t\t\tif (!Is.function(handleActivity)) {\n\t\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"missingHandleActivity\", {\n\t\t\t\t\tdataspaceAppId\n\t\t\t\t});\n\t\t\t}\n\t\t\tlet taskError;\n\t\t\tlet taskResult;\n\t\t\ttry {\n\t\t\t\ttaskResult = await handleActivity(activity as IDataspaceActivity);\n\t\t\t} catch (error) {\n\t\t\t\tconst baseErr = BaseError.fromError(error);\n\t\t\t\tconst isSemanticError =\n\t\t\t\t\tBaseError.someErrorName(baseErr, ValidationError.CLASS_NAME) ||\n\t\t\t\t\tBaseError.someErrorName(baseErr, GuardError.CLASS_NAME);\n\t\t\t\ttaskError = isSemanticError\n\t\t\t\t\t? new UnprocessableError(\n\t\t\t\t\t\t\tDataspaceDataPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\t\"activitySemanticError\",\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tbaseErr\n\t\t\t\t\t\t)\n\t\t\t\t\t: baseErr;\n\t\t\t}\n\n\t\t\tconst now = Date.now();\n\t\t\tconst taskEntry: IActivityTaskEntry = {\n\t\t\t\ttaskId: RandomHelper.generateUuidV7(\"compact\"),\n\t\t\t\tdataspaceAppId,\n\t\t\t\tprocessingGroupId,\n\t\t\t\tresult: taskResult,\n\t\t\t\tstartDate: new Date(now).toISOString(),\n\t\t\t\tendDate: new Date(now).toISOString(),\n\t\t\t\tstatus: Is.empty(taskError) ? ActivityTaskStatus.Success : ActivityTaskStatus.Failed,\n\t\t\t\terror: taskError?.toJsonObject()\n\t\t\t};\n\t\t\ttaskEntries.push(taskEntry);\n\n\t\t\tawait this.notifyTaskStatusChanged(\n\t\t\t\tpayload.activityLogEntryId,\n\t\t\t\tpayload.activity.id,\n\t\t\t\tpayload.dataspaceAppId,\n\t\t\t\ttaskEntry.taskId,\n\t\t\t\ttaskEntry.status\n\t\t\t);\n\t\t} else {\n\t\t\tconst processingGroups = handlerApp.processingGroups?.() ?? {};\n\t\t\tif (Is.empty(processingGroups[processingGroupId])) {\n\t\t\t\tthrow new GeneralError(DataspaceDataPlaneService.CLASS_NAME, \"invalidProcessingGroupId\", {\n\t\t\t\t\tprocessingGroupId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst processingGroupOptions = processingGroups[processingGroupId];\n\n\t\t\tconst taskType = `${dataspaceAppId}${processingGroupId ? `-${processingGroupId}` : \"\"}`;\n\n\t\t\tconst taskId = await this._backgroundTaskComponent.create<IExecutionPayload>(\n\t\t\t\ttaskType,\n\t\t\t\tpayload,\n\t\t\t\t{\n\t\t\t\t\tretainFor: this._retainTasksFor,\n\t\t\t\t\tretryCount: processingGroupOptions?.retryCount ?? this._retryCount\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (!this._registeredTaskTypes.includes(taskType)) {\n\t\t\t\tthis._registeredTaskTypes.push(taskType);\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.finaliseBackgroundTask(task.id, task.status, task.payload);\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tmaxWorkerCount: processingGroupOptions?.concurrentTasks,\n\t\t\t\t\t\tidleShutdownTimeout: processingGroupOptions?.idleShutdownTimeout,\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\t\t\t}\n\n\t\t\ttaskEntries.push({\n\t\t\t\ttaskId,\n\t\t\t\tdataspaceAppId,\n\t\t\t\tprocessingGroupId,\n\t\t\t\tstatus: ActivityTaskStatus.Pending\n\t\t\t});\n\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: \"scheduledTask\",\n\t\t\t\tdata: {\n\t\t\t\t\ttaskId,\n\t\t\t\t\tdataspaceAppId,\n\t\t\t\t\tisRetry\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn isInlineTask;\n\t}\n\n\t/**\n\t * Constructs the activity log entry with processing status and associated tasks.\n\t * @param activityLog The activity log details retrieved from storage.\n\t * @param activityTasks The activity tasks associated with the log entry, if any.\n\t * @returns The complete activity log entry with status and tasks.\n\t * @internal\n\t */\n\tprivate async constructLogEntry(\n\t\tactivityLog: ActivityLogDetails,\n\t\tactivityTasks: ActivityTask | undefined\n\t): Promise<IActivityLogEntry> {\n\t\tlet tasks: IActivityTaskEntry[] | undefined;\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\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\ttasks = [];\n\n\t\t\tconst typeCount: {\n\t\t\t\t[status in TaskStatus]: number;\n\t\t\t} = {\n\t\t\t\t[TaskStatus.Pending]: 0,\n\t\t\t\t[TaskStatus.Processing]: 0,\n\t\t\t\t[TaskStatus.Success]: 0,\n\t\t\t\t[TaskStatus.Failed]: 0,\n\t\t\t\t[TaskStatus.Cancelled]: 0\n\t\t\t};\n\n\t\t\tfor (const entity of activityTasks.associatedTasks) {\n\t\t\t\tlet entry: IActivityTaskEntry | undefined;\n\t\t\t\tif (!Is.stringValue(entity.processingGroupId)) {\n\t\t\t\t\t// If there is no process group, the task was processed inline so the task status is already available in the entity\n\t\t\t\t\ttypeCount[entity.status]++;\n\t\t\t\t\tentry = entity;\n\t\t\t\t} else {\n\t\t\t\t\tconst taskDetails = await this._backgroundTaskComponent.get<IExecutionPayload, unknown>(\n\t\t\t\t\t\tentity.taskId\n\t\t\t\t\t);\n\t\t\t\t\tif (!Is.empty(taskDetails)) {\n\t\t\t\t\t\ttypeCount[taskDetails.status]++;\n\n\t\t\t\t\t\tswitch (taskDetails.status) {\n\t\t\t\t\t\t\tcase TaskStatus.Success:\n\t\t\t\t\t\t\t\tentry = {\n\t\t\t\t\t\t\t\t\t...entity,\n\t\t\t\t\t\t\t\t\tstatus: ActivityTaskStatus.Success,\n\t\t\t\t\t\t\t\t\tresult: taskDetails.result,\n\t\t\t\t\t\t\t\t\tstartDate: taskDetails?.dateCreated,\n\t\t\t\t\t\t\t\t\tendDate: taskDetails?.dateCompleted\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase TaskStatus.Pending:\n\t\t\t\t\t\t\t\tentry = { ...entity, status: ActivityTaskStatus.Pending };\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase TaskStatus.Processing:\n\t\t\t\t\t\t\t\tentry = {\n\t\t\t\t\t\t\t\t\t...entity,\n\t\t\t\t\t\t\t\t\tstatus: ActivityTaskStatus.Processing,\n\t\t\t\t\t\t\t\t\tstartDate: taskDetails.dateCreated\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase TaskStatus.Failed:\n\t\t\t\t\t\t\t\tentry = {\n\t\t\t\t\t\t\t\t\t...entity,\n\t\t\t\t\t\t\t\t\tstatus: ActivityTaskStatus.Failed,\n\t\t\t\t\t\t\t\t\terror: taskDetails.error\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase TaskStatus.Cancelled:\n\t\t\t\t\t\t\t\t// Nothing to do for cancelled tasks\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!Is.empty(entry)) {\n\t\t\t\t\ttasks.push(entry);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeCount[TaskStatus.Failed] > 0) {\n\t\t\t\tstatus = ActivityProcessingStatus.Error;\n\t\t\t} else if (typeCount[TaskStatus.Processing] > 0) {\n\t\t\t\tstatus = ActivityProcessingStatus.Running;\n\t\t\t} else if (typeCount[TaskStatus.Pending] > 0) {\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 { ...activityLog, status, tasks };\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDataspaceDataPlaneServiceConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IDataspaceDataPlaneServiceConstructorOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IDataspaceDataPlaneServiceConfig } from \"./IDataspaceDataPlaneServiceConfig.js\";\n\n/**\n * Dataspace Data Plane service options\n */\nexport interface IDataspaceDataPlaneServiceConstructorOptions {\n\t/**\n\t * Logging component type.\n\t * @default logging\n\t */\n\tloggingComponentType?: string;\n\n\t/**\n\t * Background task component.\n\t * @default background-task\n\t */\n\tbackgroundTaskComponentType?: string;\n\n\t/**\n\t * Task Scheduler Component Type.\n\t * @default task-scheduler\n\t */\n\ttaskSchedulerComponentType?: string;\n\n\t/**\n\t * The entity storage for activity log details.\n\t * @default activity-log-details\n\t */\n\tactivityLogEntityStorageType?: string;\n\n\t/**\n\t * The entity storage for the association between Activities and Tasks.\n\t * @default activity-task\n\t */\n\tactivityTaskEntityStorageType?: string;\n\n\t/**\n\t * The entity storage type for Transfer Process entities.\n\t * Used to read Transfer Process state from shared storage.\n\t * @default transfer-process\n\t */\n\ttransferProcessEntityStorageType?: string;\n\n\t/**\n\t * The entity storage type for PushSubscription entities.\n\t * @default push-subscription\n\t */\n\tpushSubscriptionEntityStorageType?: string;\n\n\t/**\n\t * The entity storage type for Dataspace App Dataset entities.\n\t * @default dataspace-app-dataset\n\t */\n\tdataspaceAppDatasetEntityStorageType?: string;\n\n\t/**\n\t * The keys to use from the context ids to cleanup partitions.\n\t */\n\tpartitionContextIds?: string[];\n\n\t/**\n\t * Trust component type.\n\t * @default trust\n\t */\n\ttrustComponentType?: string;\n\n\t/**\n\t * Policy enforcement point component type for ODRL policy enforcement.\n\t * @default policy-enforcement-point-service\n\t */\n\tpepComponentType?: string;\n\n\t/**\n\t * Tenant
|
|
1
|
+
{"version":3,"file":"IDataspaceDataPlaneServiceConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IDataspaceDataPlaneServiceConstructorOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IDataspaceDataPlaneServiceConfig } from \"./IDataspaceDataPlaneServiceConfig.js\";\n\n/**\n * Dataspace Data Plane service options\n */\nexport interface IDataspaceDataPlaneServiceConstructorOptions {\n\t/**\n\t * Logging component type.\n\t * @default logging\n\t */\n\tloggingComponentType?: string;\n\n\t/**\n\t * Background task component.\n\t * @default background-task\n\t */\n\tbackgroundTaskComponentType?: string;\n\n\t/**\n\t * Task Scheduler Component Type.\n\t * @default task-scheduler\n\t */\n\ttaskSchedulerComponentType?: string;\n\n\t/**\n\t * The entity storage for activity log details.\n\t * @default activity-log-details\n\t */\n\tactivityLogEntityStorageType?: string;\n\n\t/**\n\t * The entity storage for the association between Activities and Tasks.\n\t * @default activity-task\n\t */\n\tactivityTaskEntityStorageType?: string;\n\n\t/**\n\t * The entity storage type for Transfer Process entities.\n\t * Used to read Transfer Process state from shared storage.\n\t * @default transfer-process\n\t */\n\ttransferProcessEntityStorageType?: string;\n\n\t/**\n\t * The entity storage type for PushSubscription entities.\n\t * @default push-subscription\n\t */\n\tpushSubscriptionEntityStorageType?: string;\n\n\t/**\n\t * The entity storage type for Dataspace App Dataset entities.\n\t * @default dataspace-app-dataset\n\t */\n\tdataspaceAppDatasetEntityStorageType?: string;\n\n\t/**\n\t * The keys to use from the context ids to cleanup partitions.\n\t */\n\tpartitionContextIds?: string[];\n\n\t/**\n\t * Trust component type.\n\t * @default trust\n\t */\n\ttrustComponentType?: string;\n\n\t/**\n\t * Policy enforcement point component type for ODRL policy enforcement.\n\t * @default policy-enforcement-point-service\n\t */\n\tpepComponentType?: string;\n\n\t/**\n\t * Tenant component type.\n\t * @default tenant\n\t */\n\ttenantComponentType?: string;\n\n\t/**\n\t * URL Transformer component type used to encrypt the tenant token into the data-plane.\n\t * @default url-transformer\n\t */\n\turlTransformerComponentType?: string;\n\n\t/**\n\t * The configuration of the Dataspace Data Plane Service.\n\t */\n\tconfig?: IDataspaceDataPlaneServiceConfig;\n}\n"]}
|
|
@@ -59,10 +59,10 @@ export interface IDataspaceDataPlaneServiceConstructorOptions {
|
|
|
59
59
|
*/
|
|
60
60
|
pepComponentType?: string;
|
|
61
61
|
/**
|
|
62
|
-
* Tenant
|
|
63
|
-
* @default tenant
|
|
62
|
+
* Tenant component type.
|
|
63
|
+
* @default tenant
|
|
64
64
|
*/
|
|
65
|
-
|
|
65
|
+
tenantComponentType?: string;
|
|
66
66
|
/**
|
|
67
67
|
* URL Transformer component type used to encrypt the tenant token into the data-plane.
|
|
68
68
|
* @default url-transformer
|
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.3-next.39](https://github.com/iotaledger/twin-dataspace/compare/dataspace-data-plane-service-v0.0.3-next.38...dataspace-data-plane-service-v0.0.3-next.39) (2026-06-04)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* tenant component ([#171](https://github.com/iotaledger/twin-dataspace/issues/171)) ([83a6d40](https://github.com/iotaledger/twin-dataspace/commit/83a6d402394f2cfbecc5e2304b1044a40f22a32b))
|
|
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.38 to 0.0.3-next.39
|
|
16
|
+
* @twin.org/dataspace-models bumped from 0.0.3-next.38 to 0.0.3-next.39
|
|
17
|
+
* devDependencies
|
|
18
|
+
* @twin.org/dataspace-test-app bumped from 0.0.3-next.38 to 0.0.3-next.39
|
|
19
|
+
|
|
3
20
|
## [0.0.3-next.38](https://github.com/iotaledger/twin-dataspace/compare/dataspace-data-plane-service-v0.0.3-next.37...dataspace-data-plane-service-v0.0.3-next.38) (2026-06-03)
|
|
4
21
|
|
|
5
22
|
|
|
@@ -153,16 +153,16 @@ policy-enforcement-point-service
|
|
|
153
153
|
|
|
154
154
|
***
|
|
155
155
|
|
|
156
|
-
###
|
|
156
|
+
### tenantComponentType? {#tenantcomponenttype}
|
|
157
157
|
|
|
158
|
-
> `optional` **
|
|
158
|
+
> `optional` **tenantComponentType?**: `string`
|
|
159
159
|
|
|
160
|
-
Tenant
|
|
160
|
+
Tenant component type.
|
|
161
161
|
|
|
162
162
|
#### Default
|
|
163
163
|
|
|
164
164
|
```ts
|
|
165
|
-
tenant
|
|
165
|
+
tenant
|
|
166
166
|
```
|
|
167
167
|
|
|
168
168
|
***
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twin.org/dataspace-data-plane-service",
|
|
3
|
-
"version": "0.0.3-next.
|
|
3
|
+
"version": "0.0.3-next.39",
|
|
4
4
|
"description": "Processes activities and data requests while enforcing transfer and policy constraints in the data plane.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "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.39",
|
|
25
|
+
"@twin.org/dataspace-models": "0.0.3-next.39",
|
|
26
26
|
"@twin.org/engine-models": "next",
|
|
27
27
|
"@twin.org/entity": "next",
|
|
28
28
|
"@twin.org/entity-storage-models": "next",
|