@twin.org/dataspace-data-plane-service 0.0.3-next.43 → 0.0.3-next.45
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/dataspaceDataPlaneRoutes.js +5 -6
- package/dist/es/dataspaceDataPlaneRoutes.js.map +1 -1
- package/dist/es/dataspaceDataPlaneService.js +80 -57
- package/dist/es/dataspaceDataPlaneService.js.map +1 -1
- package/dist/es/dataspaceDataPlaneSocketRoutes.js +5 -3
- package/dist/es/dataspaceDataPlaneSocketRoutes.js.map +1 -1
- package/dist/es/entities/pushSubscription.js +19 -0
- package/dist/es/entities/pushSubscription.js.map +1 -1
- package/dist/es/restEntryPoints.js +4 -0
- package/dist/es/restEntryPoints.js.map +1 -1
- package/dist/es/socketEntryPoints.js +4 -0
- package/dist/es/socketEntryPoints.js.map +1 -1
- package/dist/types/dataspaceDataPlaneService.d.ts +11 -5
- package/dist/types/dataspaceDataPlaneSocketRoutes.d.ts +5 -3
- package/dist/types/entities/pushSubscription.d.ts +19 -0
- package/dist/types/restEntryPoints.d.ts +4 -0
- package/dist/types/socketEntryPoints.d.ts +4 -0
- package/docs/changelog.md +40 -0
- package/docs/open-api/spec.json +9 -23
- package/docs/reference/classes/DataspaceDataPlaneService.md +22 -5
- package/docs/reference/classes/PushSubscription.md +13 -0
- package/docs/reference/functions/activityLogStatusConnected.md +3 -1
- package/docs/reference/functions/activityLogStatusDisconnected.md +2 -0
- package/docs/reference/functions/activityLogStatusUpdate.md +2 -2
- package/docs/reference/variables/restEntryPoints.md +3 -0
- package/docs/reference/variables/socketEntryPoints.md +3 -0
- package/locales/en.json +1 -0
- package/package.json +3 -3
|
@@ -124,7 +124,8 @@ export function generateRestRoutesDataspaceDataPlane(baseRouteName, factoryServi
|
|
|
124
124
|
}
|
|
125
125
|
]
|
|
126
126
|
}
|
|
127
|
-
]
|
|
127
|
+
],
|
|
128
|
+
skipAuth: true
|
|
128
129
|
};
|
|
129
130
|
const getDataAssetEntitiesRoute = {
|
|
130
131
|
operationId: "dataspaceDataPlaneGetDataAssetEntities",
|
|
@@ -221,10 +222,7 @@ export async function activityStreamNotify(baseRouteName, httpRequestContext, fa
|
|
|
221
222
|
Guards.object(ROUTES_SOURCE, "request", request);
|
|
222
223
|
Guards.object(ROUTES_SOURCE, "request.body", request.body);
|
|
223
224
|
const component = ComponentFactory.get(factoryServiceName);
|
|
224
|
-
|
|
225
|
-
// Internal activities sent without a header still work — trustPayload will be undefined.
|
|
226
|
-
const extractedBearer = HeaderHelper.extractBearer(request.headers?.[HeaderTypes.Authorization]);
|
|
227
|
-
const trustPayload = Is.stringValue(extractedBearer) ? extractedBearer : undefined;
|
|
225
|
+
const trustPayload = HeaderHelper.extractBearer(request.headers?.[HeaderTypes.Authorization]);
|
|
228
226
|
const result = await component.notifyActivity(request.body, trustPayload);
|
|
229
227
|
if (Is.string(result)) {
|
|
230
228
|
return {
|
|
@@ -262,8 +260,9 @@ export async function activityLogEntryGet(httpRequestContext, factoryServiceName
|
|
|
262
260
|
Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
|
|
263
261
|
Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
|
|
264
262
|
const component = ComponentFactory.get(factoryServiceName);
|
|
263
|
+
const trustPayload = HeaderHelper.extractBearer(request.headers?.[HeaderTypes.Authorization]);
|
|
265
264
|
return {
|
|
266
|
-
body: await component.getActivityLogEntry(request.pathParams.id)
|
|
265
|
+
body: await component.getActivityLogEntry(request.pathParams.id, trustPayload)
|
|
267
266
|
};
|
|
268
267
|
}
|
|
269
268
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataspaceDataPlaneRoutes.js","sourceRoot":"","sources":["../../src/dataspaceDataPlaneRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tHttpParameterHelper,\n\ttype IHostingComponent,\n\ttype IHttpRequestContext,\n\ttype IRestRoute,\n\ttype ITag\n} from \"@twin.org/api-models\";\nimport {\n\tBaseError,\n\tCoerce,\n\tComponentFactory,\n\tGuards,\n\tIs,\n\tUnprocessableError\n} from \"@twin.org/core\";\nimport {\n\tActivityProcessingStatus,\n\tActivityTaskStatus,\n\ttype IActivityLogEntry,\n\ttype IActivityLogEntryGetRequest,\n\ttype IActivityLogEntryGetResponse,\n\ttype IActivityStreamNotifyRequest,\n\ttype IActivityStreamNotifyResponse,\n\ttype IDataAssetEntitiesResponse,\n\ttype IDataAssetGetEntitiesRequest,\n\ttype IDataAssetItemList,\n\ttype IDataAssetQueryRequest,\n\ttype IDataspaceDataPlaneComponent,\n\ttype IFilteringQuery\n} from \"@twin.org/dataspace-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { IActivityStreamsActivity } from \"@twin.org/standards-w3c-activity-streams\";\nimport { HeaderHelper, HeaderTypes, HttpStatusCode, MimeTypes } from \"@twin.org/web\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"dataspaceDataPlaneRoutes\";\n\n/**\n * The tag to associate with the routes.\n */\nexport const tagsDataspaceDataPlane: ITag[] = [\n\t{\n\t\tname: \"Dataspace Data Plane\",\n\t\tdescription: \"Endpoints to access a Dataspace Data Plane.\"\n\t}\n];\n\nconst activityExample: IActivityStreamsActivity = {\n\t\"@context\": \"https://www.w3.org/ns/activitystreams\",\n\ttype: \"Add\",\n\tactor: {\n\t\tid: \"did:iota:testnet:0x123456\"\n\t},\n\tobject: {\n\t\t\"@context\": \"https://vocabulary.uncefact.org\",\n\t\t\"@type\": \"Consignment\",\n\t\tglobalId: \"24KEP051219453I002610796\"\n\t},\n\tupdated: \"2025-08-12T12:00:00Z\"\n};\n\nconst activityLogEntryExample: IActivityLogEntry = {\n\tid: \"urn:x-activity-log:134567\",\n\tdateCreated: \"2025-08-12T12:00:00Z\",\n\tdateModified: \"2025-08-12T12:00:00Z\",\n\tgenerator: \"did:iota:testnet:123456\",\n\tstatus: \"pending\",\n\ttasks: [\n\t\t{\n\t\t\ttaskId: \"urn:x-task-id:45678\",\n\t\t\tdataspaceAppId: \"https://my-app.example.org/app1\",\n\t\t\tstatus: \"pending\"\n\t\t}\n\t]\n};\n\nconst dataspaceDataPlaneQueryResultExample: IDataAssetItemList = {\n\t\"@context\": \"https://schema.org\",\n\ttype: \"ItemList\",\n\titemListElement: [\n\t\t{\n\t\t\t\"@context\": \"https://vocabulary.uncefact.org/unece-context-D23B.jsonld\",\n\t\t\ttype: \"Consignment\",\n\t\t\tid: \"urn:ucr:PL527288386100000\"\n\t\t}\n\t]\n};\n\n/**\n * The REST routes for Dataspace Data Plane.\n * @param baseRouteName Prefix to prepend to the paths.\n * @param factoryServiceName The name of the service to use in the routes store in the ServiceFactory.\n * @returns The generated routes.\n */\nexport function generateRestRoutesDataspaceDataPlane(\n\tbaseRouteName: string,\n\tfactoryServiceName: string\n): IRestRoute[] {\n\tconst notifyActivityStreamRoute: IRestRoute<\n\t\tIActivityStreamNotifyRequest,\n\t\tIActivityStreamNotifyResponse\n\t> = {\n\t\toperationId: \"activityStreamNotify\",\n\t\tsummary: \"Notify of a new Activity\",\n\t\ttag: tagsDataspaceDataPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/inbox`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tactivityStreamNotify(baseRouteName, httpRequestContext, factoryServiceName, request),\n\t\trequestType: {\n\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\ttype: nameof<IActivityStreamNotifyRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"activityStreamNotifyRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: activityExample\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IActivityStreamNotifyResponse>()\n\t\t\t}\n\t\t],\n\t\t// Cross-node push deliveries authenticate via JWT-VC verified inside notifyActivity.\n\t\t// Skip framework auth so external providers can POST without a session token.\n\t\t// Tenant context is required and comes from the URL-baked encrypted tenant token\n\t\t// (decoded by TenantProcessor before the handler runs).\n\t\tskipAuth: true\n\t};\n\n\tconst getActivityLogEntryRoute: IRestRoute<\n\t\tIActivityLogEntryGetRequest,\n\t\tIActivityLogEntryGetResponse\n\t> = {\n\t\toperationId: \"dataspaceDataPlaneGetActivityLogEntry\",\n\t\tsummary: \"Get a Activity Log Entry\",\n\t\ttag: tagsDataspaceDataPlane[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/activity-logs/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tactivityLogEntryGet(httpRequestContext, factoryServiceName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IActivityLogEntryGetRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"activityLogEntryGetRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"urn:x-activity-log:1234567\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IActivityLogEntryGetResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"activityLogEntryGetResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: { ...activityLogEntryExample }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst getDataAssetEntitiesRoute: IRestRoute<\n\t\tIDataAssetGetEntitiesRequest,\n\t\tIDataAssetEntitiesResponse\n\t> = {\n\t\toperationId: \"dataspaceDataPlaneGetDataAssetEntities\",\n\t\tsummary: \"Get Data Asset Entities\",\n\t\ttag: tagsDataspaceDataPlane[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/entities`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tgetDataAssetEntities(httpRequestContext, factoryServiceName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IDataAssetGetEntitiesRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"dataAssetEntitiesGetRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-pid-12345\",\n\t\t\t\t\t\t\tid: \"urn:ucr:24PLP051219453I002610799053311\",\n\t\t\t\t\t\t\ttype: \"https://vocabulary.uncefact.org/Consignment\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IDataAssetEntitiesResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"dataAssetEntitiesGetResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: { ...dataspaceDataPlaneQueryResultExample }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\tskipAuth: true\n\t};\n\n\tconst queryDataAssetRoute: IRestRoute<IDataAssetQueryRequest, IDataAssetEntitiesResponse> = {\n\t\toperationId: \"dataspaceDataPlaneQueryDataAsset\",\n\t\tsummary: \"Query Data Asset\",\n\t\ttag: tagsDataspaceDataPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/entities/query`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tqueryDataAsset(httpRequestContext, factoryServiceName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IDataAssetQueryRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"dataAssetQueryRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-pid-12345\",\n\t\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\t\ttype: \"Example\",\n\t\t\t\t\t\t\t\tq: \"example query\"\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]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IDataAssetEntitiesResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"dataAssetQueryResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: { ...dataspaceDataPlaneQueryResultExample }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\tskipAuth: true\n\t};\n\n\treturn [\n\t\tnotifyActivityStreamRoute,\n\t\tgetActivityLogEntryRoute,\n\t\tgetDataAssetEntitiesRoute,\n\t\tqueryDataAssetRoute\n\t];\n}\n\n/**\n * Notify a new Activity to the Dataspace Data Plane Activity Stream.\n * @param baseRouteName The base route name.\n * @param httpRequestContext The request context for the API.\n * @param factoryServiceName The name of the service to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function activityStreamNotify(\n\tbaseRouteName: string,\n\thttpRequestContext: IHttpRequestContext,\n\tfactoryServiceName: string,\n\trequest: IActivityStreamNotifyRequest\n): Promise<IActivityStreamNotifyResponse> {\n\tGuards.object<IActivityStreamNotifyRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IActivityStreamsActivity>(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(factoryServiceName);\n\n\t// Extract JWT from Authorization header for cross-node push deliveries (P5.3).\n\t// Internal activities sent without a header still work — trustPayload will be undefined.\n\tconst extractedBearer = HeaderHelper.extractBearer(request.headers?.[HeaderTypes.Authorization]);\n\tconst trustPayload = Is.stringValue(extractedBearer) ? extractedBearer : undefined;\n\tconst result = await component.notifyActivity(request.body, trustPayload);\n\n\tif (Is.string(result)) {\n\t\treturn {\n\t\t\theaders: {\n\t\t\t\t[HeaderTypes.Location]: `${baseRouteName}/activity-logs/${result}`\n\t\t\t},\n\t\t\tstatusCode: HttpStatusCode.accepted\n\t\t};\n\t}\n\n\tlet statusCode: HttpStatusCode = HttpStatusCode.created;\n\tif (result.status === ActivityProcessingStatus.Error) {\n\t\tconst failedErrors =\n\t\t\tresult.tasks?.filter(task => task.status === ActivityTaskStatus.Failed) ?? [];\n\t\tconst hasUnprocessableError = failedErrors.some(task =>\n\t\t\tBaseError.someErrorName(task.error, UnprocessableError.CLASS_NAME)\n\t\t);\n\t\tstatusCode = hasUnprocessableError\n\t\t\t? HttpStatusCode.unprocessableEntity\n\t\t\t: HttpStatusCode.internalServerError;\n\t}\n\n\treturn {\n\t\theaders: {\n\t\t\t[HeaderTypes.Location]: `${baseRouteName}/activity-logs/${result.id}`\n\t\t},\n\t\tstatusCode,\n\t\tbody: result\n\t};\n}\n\n/**\n * Get an Activity Log entry.\n * @param httpRequestContext The request context for the API.\n * @param factoryServiceName The name of the service to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function activityLogEntryGet(\n\thttpRequestContext: IHttpRequestContext,\n\tfactoryServiceName: string,\n\trequest: IActivityLogEntryGetRequest\n): Promise<IActivityLogEntryGetResponse> {\n\tGuards.object<IActivityLogEntryGetRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IActivityLogEntryGetRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(factoryServiceName);\n\n\treturn {\n\t\tbody: await component.getActivityLogEntry(request.pathParams.id)\n\t};\n}\n\n/**\n * Handles a request to obtain the entities of a data asset.\n * @param httpRequestContext The request Context.\n * @param factoryServiceName The factory service name\n * @param request The request.\n * @returns Either the entities as JSON-LD or the corresponding error response.\n */\nexport async function getDataAssetEntities(\n\thttpRequestContext: IHttpRequestContext,\n\tfactoryServiceName: string,\n\trequest: IDataAssetGetEntitiesRequest\n): Promise<IDataAssetEntitiesResponse> {\n\tGuards.object<IDataAssetGetEntitiesRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IDataAssetGetEntitiesRequest[\"query\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.query),\n\t\trequest.query\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.query.type), request.query.type);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.query.consumerPid), request.query.consumerPid);\n\n\tconst hostingComponent = ComponentFactory.get<IHostingComponent>(\n\t\thttpRequestContext.hostingComponentType ?? \"hosting\"\n\t);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers?.[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(factoryServiceName);\n\n\tconst result = await component.getDataAssetEntities(\n\t\t{\n\t\t\tentityType: request.query.type,\n\t\t\tentityId: HttpParameterHelper.arrayFromString(request.query.id)\n\t\t},\n\t\trequest.query.consumerPid,\n\t\trequest.query.cursor,\n\t\tCoerce.integer(request.query.limit),\n\t\ttrustPayload\n\t);\n\n\tconst headers: IDataAssetEntitiesResponse[\"headers\"] = {};\n\n\tif (Is.stringValue(result.cursor)) {\n\t\theaders[HeaderTypes.Link] = HeaderHelper.createLinkHeader(\n\t\t\tawait hostingComponent.buildPublicUrl(httpRequestContext.serverRequest.url),\n\t\t\t{ cursor: result.cursor },\n\t\t\t\"next\"\n\t\t);\n\t}\n\n\treturn {\n\t\theaders,\n\t\tbody: result.itemList\n\t};\n}\n\n/**\n * Handles a request to query a data asset.\n * @param httpRequestContext The request Context.\n * @param factoryServiceName The factory service name\n * @param request The request.\n * @returns Either the entities as JSON-LD or the corresponding error response.\n */\nexport async function queryDataAsset(\n\thttpRequestContext: IHttpRequestContext,\n\tfactoryServiceName: string,\n\trequest: IDataAssetQueryRequest\n): Promise<IDataAssetEntitiesResponse> {\n\tGuards.object<IDataAssetQueryRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IDataAssetQueryRequest[\"body\"]>(ROUTES_SOURCE, nameof(request.body), request.body);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.body.consumerPid), request.body.consumerPid);\n\n\tGuards.object<IFilteringQuery>(ROUTES_SOURCE, nameof(request.body.query), request.body.query);\n\tGuards.string(ROUTES_SOURCE, nameof(request.body.query.type), request.body.query.type);\n\tGuards.string(ROUTES_SOURCE, nameof(request.body.query.q), request.body.query.q);\n\n\tconst hostingComponent = ComponentFactory.get<IHostingComponent>(\n\t\thttpRequestContext.hostingComponentType ?? \"hosting\"\n\t);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers?.[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(factoryServiceName);\n\n\tconst result = await component.queryDataAsset(\n\t\trequest.body.consumerPid,\n\t\trequest.body.query,\n\t\trequest.query?.cursor,\n\t\tCoerce.integer(request.query?.limit),\n\t\ttrustPayload\n\t);\n\n\tconst headers: IDataAssetEntitiesResponse[\"headers\"] = {};\n\n\tif (Is.stringValue(result.cursor)) {\n\t\theaders[HeaderTypes.Link] = HeaderHelper.createLinkHeader(\n\t\t\tawait hostingComponent.buildPublicUrl(httpRequestContext.serverRequest.url),\n\t\t\t{ cursor: result.cursor },\n\t\t\t\"next\"\n\t\t);\n\t}\n\n\treturn {\n\t\theaders,\n\t\tbody: result.itemList\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dataspaceDataPlaneRoutes.js","sourceRoot":"","sources":["../../src/dataspaceDataPlaneRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tHttpParameterHelper,\n\ttype IHostingComponent,\n\ttype IHttpRequestContext,\n\ttype IRestRoute,\n\ttype ITag\n} from \"@twin.org/api-models\";\nimport {\n\tBaseError,\n\tCoerce,\n\tComponentFactory,\n\tGuards,\n\tIs,\n\tUnprocessableError\n} from \"@twin.org/core\";\nimport {\n\tActivityProcessingStatus,\n\tActivityTaskStatus,\n\ttype IActivityLogEntry,\n\ttype IActivityLogEntryGetRequest,\n\ttype IActivityLogEntryGetResponse,\n\ttype IActivityStreamNotifyRequest,\n\ttype IActivityStreamNotifyResponse,\n\ttype IDataAssetEntitiesResponse,\n\ttype IDataAssetGetEntitiesRequest,\n\ttype IDataAssetItemList,\n\ttype IDataAssetQueryRequest,\n\ttype IDataspaceDataPlaneComponent,\n\ttype IFilteringQuery\n} from \"@twin.org/dataspace-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { IActivityStreamsActivity } from \"@twin.org/standards-w3c-activity-streams\";\nimport { HeaderHelper, HeaderTypes, HttpStatusCode, MimeTypes } from \"@twin.org/web\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"dataspaceDataPlaneRoutes\";\n\n/**\n * The tag to associate with the routes.\n */\nexport const tagsDataspaceDataPlane: ITag[] = [\n\t{\n\t\tname: \"Dataspace Data Plane\",\n\t\tdescription: \"Endpoints to access a Dataspace Data Plane.\"\n\t}\n];\n\nconst activityExample: IActivityStreamsActivity = {\n\t\"@context\": \"https://www.w3.org/ns/activitystreams\",\n\ttype: \"Add\",\n\tactor: {\n\t\tid: \"did:iota:testnet:0x123456\"\n\t},\n\tobject: {\n\t\t\"@context\": \"https://vocabulary.uncefact.org\",\n\t\t\"@type\": \"Consignment\",\n\t\tglobalId: \"24KEP051219453I002610796\"\n\t},\n\tupdated: \"2025-08-12T12:00:00Z\"\n};\n\nconst activityLogEntryExample: IActivityLogEntry = {\n\tid: \"urn:x-activity-log:134567\",\n\tdateCreated: \"2025-08-12T12:00:00Z\",\n\tdateModified: \"2025-08-12T12:00:00Z\",\n\tgenerator: \"did:iota:testnet:123456\",\n\tstatus: \"pending\",\n\ttasks: [\n\t\t{\n\t\t\ttaskId: \"urn:x-task-id:45678\",\n\t\t\tdataspaceAppId: \"https://my-app.example.org/app1\",\n\t\t\tstatus: \"pending\"\n\t\t}\n\t]\n};\n\nconst dataspaceDataPlaneQueryResultExample: IDataAssetItemList = {\n\t\"@context\": \"https://schema.org\",\n\ttype: \"ItemList\",\n\titemListElement: [\n\t\t{\n\t\t\t\"@context\": \"https://vocabulary.uncefact.org/unece-context-D23B.jsonld\",\n\t\t\ttype: \"Consignment\",\n\t\t\tid: \"urn:ucr:PL527288386100000\"\n\t\t}\n\t]\n};\n\n/**\n * The REST routes for Dataspace Data Plane.\n * @param baseRouteName Prefix to prepend to the paths.\n * @param factoryServiceName The name of the service to use in the routes store in the ServiceFactory.\n * @returns The generated routes.\n */\nexport function generateRestRoutesDataspaceDataPlane(\n\tbaseRouteName: string,\n\tfactoryServiceName: string\n): IRestRoute[] {\n\tconst notifyActivityStreamRoute: IRestRoute<\n\t\tIActivityStreamNotifyRequest,\n\t\tIActivityStreamNotifyResponse\n\t> = {\n\t\toperationId: \"activityStreamNotify\",\n\t\tsummary: \"Notify of a new Activity\",\n\t\ttag: tagsDataspaceDataPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/inbox`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tactivityStreamNotify(baseRouteName, httpRequestContext, factoryServiceName, request),\n\t\trequestType: {\n\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\ttype: nameof<IActivityStreamNotifyRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"activityStreamNotifyRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: activityExample\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IActivityStreamNotifyResponse>()\n\t\t\t}\n\t\t],\n\t\t// Cross-node push deliveries authenticate via JWT-VC verified inside notifyActivity.\n\t\t// Skip framework auth so external providers can POST without a session token.\n\t\t// Tenant context is required and comes from the URL-baked encrypted tenant token\n\t\t// (decoded by TenantProcessor before the handler runs).\n\t\tskipAuth: true\n\t};\n\n\tconst getActivityLogEntryRoute: IRestRoute<\n\t\tIActivityLogEntryGetRequest,\n\t\tIActivityLogEntryGetResponse\n\t> = {\n\t\toperationId: \"dataspaceDataPlaneGetActivityLogEntry\",\n\t\tsummary: \"Get a Activity Log Entry\",\n\t\ttag: tagsDataspaceDataPlane[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/activity-logs/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tactivityLogEntryGet(httpRequestContext, factoryServiceName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IActivityLogEntryGetRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"activityLogEntryGetRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"urn:x-activity-log:1234567\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IActivityLogEntryGetResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"activityLogEntryGetResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: { ...activityLogEntryExample }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\tskipAuth: true\n\t};\n\n\tconst getDataAssetEntitiesRoute: IRestRoute<\n\t\tIDataAssetGetEntitiesRequest,\n\t\tIDataAssetEntitiesResponse\n\t> = {\n\t\toperationId: \"dataspaceDataPlaneGetDataAssetEntities\",\n\t\tsummary: \"Get Data Asset Entities\",\n\t\ttag: tagsDataspaceDataPlane[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/entities`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tgetDataAssetEntities(httpRequestContext, factoryServiceName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IDataAssetGetEntitiesRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"dataAssetEntitiesGetRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-pid-12345\",\n\t\t\t\t\t\t\tid: \"urn:ucr:24PLP051219453I002610799053311\",\n\t\t\t\t\t\t\ttype: \"https://vocabulary.uncefact.org/Consignment\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IDataAssetEntitiesResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"dataAssetEntitiesGetResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: { ...dataspaceDataPlaneQueryResultExample }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\tskipAuth: true\n\t};\n\n\tconst queryDataAssetRoute: IRestRoute<IDataAssetQueryRequest, IDataAssetEntitiesResponse> = {\n\t\toperationId: \"dataspaceDataPlaneQueryDataAsset\",\n\t\tsummary: \"Query Data Asset\",\n\t\ttag: tagsDataspaceDataPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/entities/query`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tqueryDataAsset(httpRequestContext, factoryServiceName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IDataAssetQueryRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"dataAssetQueryRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-pid-12345\",\n\t\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\t\ttype: \"Example\",\n\t\t\t\t\t\t\t\tq: \"example query\"\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]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IDataAssetEntitiesResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"dataAssetQueryResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: { ...dataspaceDataPlaneQueryResultExample }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\tskipAuth: true\n\t};\n\n\treturn [\n\t\tnotifyActivityStreamRoute,\n\t\tgetActivityLogEntryRoute,\n\t\tgetDataAssetEntitiesRoute,\n\t\tqueryDataAssetRoute\n\t];\n}\n\n/**\n * Notify a new Activity to the Dataspace Data Plane Activity Stream.\n * @param baseRouteName The base route name.\n * @param httpRequestContext The request context for the API.\n * @param factoryServiceName The name of the service to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function activityStreamNotify(\n\tbaseRouteName: string,\n\thttpRequestContext: IHttpRequestContext,\n\tfactoryServiceName: string,\n\trequest: IActivityStreamNotifyRequest\n): Promise<IActivityStreamNotifyResponse> {\n\tGuards.object<IActivityStreamNotifyRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IActivityStreamsActivity>(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(factoryServiceName);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers?.[HeaderTypes.Authorization]);\n\tconst result = await component.notifyActivity(request.body, trustPayload);\n\n\tif (Is.string(result)) {\n\t\treturn {\n\t\t\theaders: {\n\t\t\t\t[HeaderTypes.Location]: `${baseRouteName}/activity-logs/${result}`\n\t\t\t},\n\t\t\tstatusCode: HttpStatusCode.accepted\n\t\t};\n\t}\n\n\tlet statusCode: HttpStatusCode = HttpStatusCode.created;\n\tif (result.status === ActivityProcessingStatus.Error) {\n\t\tconst failedErrors =\n\t\t\tresult.tasks?.filter(task => task.status === ActivityTaskStatus.Failed) ?? [];\n\t\tconst hasUnprocessableError = failedErrors.some(task =>\n\t\t\tBaseError.someErrorName(task.error, UnprocessableError.CLASS_NAME)\n\t\t);\n\t\tstatusCode = hasUnprocessableError\n\t\t\t? HttpStatusCode.unprocessableEntity\n\t\t\t: HttpStatusCode.internalServerError;\n\t}\n\n\treturn {\n\t\theaders: {\n\t\t\t[HeaderTypes.Location]: `${baseRouteName}/activity-logs/${result.id}`\n\t\t},\n\t\tstatusCode,\n\t\tbody: result\n\t};\n}\n\n/**\n * Get an Activity Log entry.\n * @param httpRequestContext The request context for the API.\n * @param factoryServiceName The name of the service to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function activityLogEntryGet(\n\thttpRequestContext: IHttpRequestContext,\n\tfactoryServiceName: string,\n\trequest: IActivityLogEntryGetRequest\n): Promise<IActivityLogEntryGetResponse> {\n\tGuards.object<IActivityLogEntryGetRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IActivityLogEntryGetRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(factoryServiceName);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers?.[HeaderTypes.Authorization]);\n\n\treturn {\n\t\tbody: await component.getActivityLogEntry(request.pathParams.id, trustPayload)\n\t};\n}\n\n/**\n * Handles a request to obtain the entities of a data asset.\n * @param httpRequestContext The request Context.\n * @param factoryServiceName The factory service name\n * @param request The request.\n * @returns Either the entities as JSON-LD or the corresponding error response.\n */\nexport async function getDataAssetEntities(\n\thttpRequestContext: IHttpRequestContext,\n\tfactoryServiceName: string,\n\trequest: IDataAssetGetEntitiesRequest\n): Promise<IDataAssetEntitiesResponse> {\n\tGuards.object<IDataAssetGetEntitiesRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IDataAssetGetEntitiesRequest[\"query\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.query),\n\t\trequest.query\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.query.type), request.query.type);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.query.consumerPid), request.query.consumerPid);\n\n\tconst hostingComponent = ComponentFactory.get<IHostingComponent>(\n\t\thttpRequestContext.hostingComponentType ?? \"hosting\"\n\t);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers?.[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(factoryServiceName);\n\n\tconst result = await component.getDataAssetEntities(\n\t\t{\n\t\t\tentityType: request.query.type,\n\t\t\tentityId: HttpParameterHelper.arrayFromString(request.query.id)\n\t\t},\n\t\trequest.query.consumerPid,\n\t\trequest.query.cursor,\n\t\tCoerce.integer(request.query.limit),\n\t\ttrustPayload\n\t);\n\n\tconst headers: IDataAssetEntitiesResponse[\"headers\"] = {};\n\n\tif (Is.stringValue(result.cursor)) {\n\t\theaders[HeaderTypes.Link] = HeaderHelper.createLinkHeader(\n\t\t\tawait hostingComponent.buildPublicUrl(httpRequestContext.serverRequest.url),\n\t\t\t{ cursor: result.cursor },\n\t\t\t\"next\"\n\t\t);\n\t}\n\n\treturn {\n\t\theaders,\n\t\tbody: result.itemList\n\t};\n}\n\n/**\n * Handles a request to query a data asset.\n * @param httpRequestContext The request Context.\n * @param factoryServiceName The factory service name\n * @param request The request.\n * @returns Either the entities as JSON-LD or the corresponding error response.\n */\nexport async function queryDataAsset(\n\thttpRequestContext: IHttpRequestContext,\n\tfactoryServiceName: string,\n\trequest: IDataAssetQueryRequest\n): Promise<IDataAssetEntitiesResponse> {\n\tGuards.object<IDataAssetQueryRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IDataAssetQueryRequest[\"body\"]>(ROUTES_SOURCE, nameof(request.body), request.body);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.body.consumerPid), request.body.consumerPid);\n\n\tGuards.object<IFilteringQuery>(ROUTES_SOURCE, nameof(request.body.query), request.body.query);\n\tGuards.string(ROUTES_SOURCE, nameof(request.body.query.type), request.body.query.type);\n\tGuards.string(ROUTES_SOURCE, nameof(request.body.query.q), request.body.query.q);\n\n\tconst hostingComponent = ComponentFactory.get<IHostingComponent>(\n\t\thttpRequestContext.hostingComponentType ?? \"hosting\"\n\t);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers?.[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(factoryServiceName);\n\n\tconst result = await component.queryDataAsset(\n\t\trequest.body.consumerPid,\n\t\trequest.body.query,\n\t\trequest.query?.cursor,\n\t\tCoerce.integer(request.query?.limit),\n\t\ttrustPayload\n\t);\n\n\tconst headers: IDataAssetEntitiesResponse[\"headers\"] = {};\n\n\tif (Is.stringValue(result.cursor)) {\n\t\theaders[HeaderTypes.Link] = HeaderHelper.createLinkHeader(\n\t\t\tawait hostingComponent.buildPublicUrl(httpRequestContext.serverRequest.url),\n\t\t\t{ cursor: result.cursor },\n\t\t\t\"next\"\n\t\t);\n\t}\n\n\treturn {\n\t\theaders,\n\t\tbody: result.itemList\n\t};\n}\n"]}
|
|
@@ -250,6 +250,7 @@ export class DataspaceDataPlaneService {
|
|
|
250
250
|
/**
|
|
251
251
|
* The service needs to be started when the application is initialized.
|
|
252
252
|
* @param nodeLoggingComponentType The node logging component type.
|
|
253
|
+
* @returns A promise that resolves when the push-delivery handler and cleanup task are registered.
|
|
253
254
|
*/
|
|
254
255
|
async start(nodeLoggingComponentType) {
|
|
255
256
|
await this._backgroundTaskComponent.registerHandler(DataspaceDataPlaneService.PUSH_DELIVERY_TASK_TYPE, "@twin.org/dataspace-app-runner", "pushDeliveryRunner", undefined, {
|
|
@@ -304,58 +305,57 @@ export class DataspaceDataPlaneService {
|
|
|
304
305
|
/**
|
|
305
306
|
* Notify an Activity.
|
|
306
307
|
* @param activity The Activity notified.
|
|
307
|
-
* @param trustPayload
|
|
308
|
+
* @param trustPayload Trust payload to verify the requesters identity.
|
|
308
309
|
* @returns The activity's id or entry.
|
|
309
310
|
*/
|
|
310
311
|
async notifyActivity(activity, trustPayload) {
|
|
311
312
|
Guards.object(DataspaceDataPlaneService.CLASS_NAME, "activity", activity);
|
|
312
|
-
//
|
|
313
|
-
//
|
|
314
|
-
//
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
throw new UnauthorizedError(DataspaceDataPlaneService.CLASS_NAME, "pushActivityNotAuthorized");
|
|
338
|
-
}
|
|
339
|
-
transferProcess = result.entities[0];
|
|
340
|
-
// generatorIsConsumer stays false → generator is the provider side.
|
|
341
|
-
}
|
|
342
|
-
if (transferProcess?.state !== DataspaceProtocolTransferProcessStateType.STARTED) {
|
|
343
|
-
throw new UnauthorizedError(DataspaceDataPlaneService.CLASS_NAME, "pushActivityNotAuthorized");
|
|
344
|
-
}
|
|
345
|
-
// Bind the verified identity to the side of the transfer matching the claimed
|
|
346
|
-
// generator. Without this, a party with a valid token for transfer X can post
|
|
347
|
-
// an activity claiming to be the other party on the same transfer.
|
|
348
|
-
const expectedIdentity = generatorIsConsumer
|
|
349
|
-
? transferProcess.consumerIdentity
|
|
350
|
-
: transferProcess.providerIdentity;
|
|
351
|
-
if (!Is.stringValue(expectedIdentity) || trustInfo.identity !== expectedIdentity) {
|
|
313
|
+
// Every caller must present a trust payload — internal calls have no bypass,
|
|
314
|
+
// a missing payload fails verification. Verify it, confirm the referenced
|
|
315
|
+
// transfer is still in STARTED state, and assert the verified identity is
|
|
316
|
+
// one of the two parties on that transfer.
|
|
317
|
+
const trustInfo = await TrustHelper.verifyTrust(this._trustComponent, trustPayload, "notifyActivity");
|
|
318
|
+
const generatorPid = this.calculateActivityGeneratorIdentity(activity);
|
|
319
|
+
// Primary lookup: by consumerPid (the entity's primary key). If this hits, the
|
|
320
|
+
// generator's PID equals consumerPid — the generator is the consumer side.
|
|
321
|
+
let transferProcess = await this._transferProcessStorage.get(generatorPid);
|
|
322
|
+
const generatorIsConsumer = Boolean(transferProcess);
|
|
323
|
+
if (!transferProcess) {
|
|
324
|
+
// Fallback: generatorPid === providerPid. providerPid is a UUIDv7 so it's
|
|
325
|
+
// unique per transfer, but defensively reject any case where the secondary
|
|
326
|
+
// index returns more than one match — silent first-match would risk
|
|
327
|
+
// authorising the wrong transfer if the invariant ever breaks.
|
|
328
|
+
const result = await this._transferProcessStorage.query({
|
|
329
|
+
conditions: [
|
|
330
|
+
{
|
|
331
|
+
property: "providerPid",
|
|
332
|
+
value: generatorPid,
|
|
333
|
+
comparison: ComparisonOperator.Equals
|
|
334
|
+
}
|
|
335
|
+
]
|
|
336
|
+
});
|
|
337
|
+
if (result.entities.length > 1) {
|
|
352
338
|
throw new UnauthorizedError(DataspaceDataPlaneService.CLASS_NAME, "pushActivityNotAuthorized");
|
|
353
339
|
}
|
|
354
|
-
|
|
355
|
-
//
|
|
356
|
-
// PEP returns.
|
|
357
|
-
activity = await this.enforceInboxPolicy(transferProcess, activity, generatorIsConsumer);
|
|
340
|
+
transferProcess = result.entities[0];
|
|
341
|
+
// generatorIsConsumer stays false → generator is the provider side.
|
|
358
342
|
}
|
|
343
|
+
if (transferProcess?.state !== DataspaceProtocolTransferProcessStateType.STARTED) {
|
|
344
|
+
throw new UnauthorizedError(DataspaceDataPlaneService.CLASS_NAME, "pushActivityNotAuthorized");
|
|
345
|
+
}
|
|
346
|
+
// Bind the verified identity to the side of the transfer matching the claimed
|
|
347
|
+
// generator. Without this, a party with a valid token for transfer X can post
|
|
348
|
+
// an activity claiming to be the other party on the same transfer.
|
|
349
|
+
const expectedIdentity = generatorIsConsumer
|
|
350
|
+
? transferProcess.consumerIdentity
|
|
351
|
+
: transferProcess.providerIdentity;
|
|
352
|
+
if (!Is.stringValue(expectedIdentity) || trustInfo.identity !== expectedIdentity) {
|
|
353
|
+
throw new UnauthorizedError(DataspaceDataPlaneService.CLASS_NAME, "pushActivityNotAuthorized");
|
|
354
|
+
}
|
|
355
|
+
// Apply the transfer's agreement to the inbound activity via the PEP, which
|
|
356
|
+
// may deny it or manipulate (filter/redact) the payload. Dispatch what the
|
|
357
|
+
// PEP returns.
|
|
358
|
+
activity = await this.enforceInboxPolicy(transferProcess, activity, generatorIsConsumer);
|
|
359
359
|
await this._logging?.log({
|
|
360
360
|
level: "debug",
|
|
361
361
|
source: DataspaceDataPlaneService.CLASS_NAME,
|
|
@@ -388,7 +388,7 @@ export class DataspaceDataPlaneService {
|
|
|
388
388
|
const now = Date.now();
|
|
389
389
|
if (!Is.undefined(logEntry)) {
|
|
390
390
|
// Check if there are failed tasks that can be retried
|
|
391
|
-
const existingEntry = await this.
|
|
391
|
+
const existingEntry = await this.retrieveActivityLogEntry(activityLogEntryId);
|
|
392
392
|
// If all tasks completed successfully, this is a duplicate
|
|
393
393
|
if (existingEntry.status === ActivityProcessingStatus.Completed) {
|
|
394
394
|
throw new ConflictError(DataspaceDataPlaneService.CLASS_NAME, "activityAlreadyNotified", activityLogEntryId);
|
|
@@ -460,27 +460,31 @@ export class DataspaceDataPlaneService {
|
|
|
460
460
|
return theSubscriptionId;
|
|
461
461
|
}
|
|
462
462
|
/**
|
|
463
|
-
*
|
|
464
|
-
* @param subscriptionId The
|
|
463
|
+
* Unsubscribes from the activity log.
|
|
464
|
+
* @param subscriptionId The subscription Id to remove.
|
|
465
|
+
* @returns A promise that resolves when the subscription has been removed.
|
|
465
466
|
*/
|
|
466
467
|
async unSubscribeToActivityLog(subscriptionId) {
|
|
467
468
|
Guards.stringValue(DataspaceDataPlaneService.CLASS_NAME, "subscriptionId", subscriptionId);
|
|
468
469
|
delete this._activityLogStatusCallbacks[subscriptionId];
|
|
469
470
|
}
|
|
470
471
|
/**
|
|
471
|
-
* Returns the
|
|
472
|
+
* Returns Activity Log Entry which contains the Activity processing details.
|
|
473
|
+
* Verifies the trust payload and asserts the caller is the entry's generator.
|
|
472
474
|
* @param logEntryId The Id of the Activity Log Entry (a URI).
|
|
475
|
+
* @param trustPayload Trust payload to verify the requester's identity.
|
|
473
476
|
* @returns the Activity Log Entry with the processing details.
|
|
474
477
|
* @throws NotFoundError if activity log entry is not known.
|
|
478
|
+
* @throws UnauthorizedError if trustPayload is absent or the verified identity is not the entry generator.
|
|
475
479
|
*/
|
|
476
|
-
async getActivityLogEntry(logEntryId) {
|
|
480
|
+
async getActivityLogEntry(logEntryId, trustPayload) {
|
|
477
481
|
Guards.stringValue(DataspaceDataPlaneService.CLASS_NAME, "logEntryId", logEntryId);
|
|
478
|
-
const
|
|
479
|
-
|
|
480
|
-
|
|
482
|
+
const trustInfo = await TrustHelper.verifyTrust(this._trustComponent, trustPayload, "getActivityLogEntry");
|
|
483
|
+
const entry = await this.retrieveActivityLogEntry(logEntryId);
|
|
484
|
+
if (trustInfo.identity !== entry.generator) {
|
|
485
|
+
throw new UnauthorizedError(DataspaceDataPlaneService.CLASS_NAME, "activityLogEntryNotAuthorized");
|
|
481
486
|
}
|
|
482
|
-
|
|
483
|
-
return this.constructLogEntry(activityLog, activityTasks);
|
|
487
|
+
return entry;
|
|
484
488
|
}
|
|
485
489
|
/**
|
|
486
490
|
* Get Data Asset entities. Allows to retrieve entities by their type or id.
|
|
@@ -858,6 +862,7 @@ export class DataspaceDataPlaneService {
|
|
|
858
862
|
/**
|
|
859
863
|
* Schedule a push delivery when the app has new outbound data.
|
|
860
864
|
* @param activity The outbound activity carrying the data payload.
|
|
865
|
+
* @returns A promise that resolves when the push delivery task has been scheduled.
|
|
861
866
|
*/
|
|
862
867
|
async processOutboxActivity(activity) {
|
|
863
868
|
Guards.object(DataspaceDataPlaneService.CLASS_NAME, "activity", activity);
|
|
@@ -961,6 +966,22 @@ export class DataspaceDataPlaneService {
|
|
|
961
966
|
// ============================================================================
|
|
962
967
|
// PRIVATE HELPER METHODS
|
|
963
968
|
// ============================================================================
|
|
969
|
+
/**
|
|
970
|
+
* Fetches an activity log entry from storage without any trust verification.
|
|
971
|
+
* Internal use only — public callers must use getActivityLogEntry.
|
|
972
|
+
* @param logEntryId The Id of the Activity Log Entry (a URI).
|
|
973
|
+
* @returns the Activity Log Entry with the processing details.
|
|
974
|
+
* @throws NotFoundError if activity log entry is not known.
|
|
975
|
+
* @internal
|
|
976
|
+
*/
|
|
977
|
+
async retrieveActivityLogEntry(logEntryId) {
|
|
978
|
+
const activityLog = await this._entityStorageActivityLogs.get(logEntryId);
|
|
979
|
+
if (Is.undefined(activityLog)) {
|
|
980
|
+
throw new NotFoundError(DataspaceDataPlaneService.CLASS_NAME, "activityLogEntryNotFound", logEntryId);
|
|
981
|
+
}
|
|
982
|
+
const activityTasks = await this._entityStorageActivityTasks.get(logEntryId);
|
|
983
|
+
return this.constructLogEntry(activityLog, activityTasks);
|
|
984
|
+
}
|
|
964
985
|
/**
|
|
965
986
|
* Calculates the activity generator from the generator or actor fields.
|
|
966
987
|
* @param activity The activity.
|
|
@@ -1031,7 +1052,7 @@ export class DataspaceDataPlaneService {
|
|
|
1031
1052
|
* @internal
|
|
1032
1053
|
*/
|
|
1033
1054
|
async finaliseActivityLogEntry(activityLogEntryId) {
|
|
1034
|
-
const entry = await this.
|
|
1055
|
+
const entry = await this.retrieveActivityLogEntry(activityLogEntryId);
|
|
1035
1056
|
if (this._retainActivityLogsFor !== -1 &&
|
|
1036
1057
|
(entry.status === ActivityProcessingStatus.Completed ||
|
|
1037
1058
|
entry.status === ActivityProcessingStatus.Error)) {
|
|
@@ -1050,6 +1071,7 @@ export class DataspaceDataPlaneService {
|
|
|
1050
1071
|
}
|
|
1051
1072
|
/**
|
|
1052
1073
|
* Cleans up the activity log by deleting those entries that no longer shall be retained.
|
|
1074
|
+
* @returns A promise that resolves when all expired log entries have been deleted.
|
|
1053
1075
|
* @internal
|
|
1054
1076
|
*/
|
|
1055
1077
|
async cleanupActivityLog() {
|
|
@@ -1104,7 +1126,7 @@ export class DataspaceDataPlaneService {
|
|
|
1104
1126
|
});
|
|
1105
1127
|
cursor = result.cursor;
|
|
1106
1128
|
for (const entity of result.entities) {
|
|
1107
|
-
const logEntryDetails = await this.
|
|
1129
|
+
const logEntryDetails = await this.retrieveActivityLogEntry(entity.id);
|
|
1108
1130
|
if (logEntryDetails.status === ActivityProcessingStatus.Completed ||
|
|
1109
1131
|
logEntryDetails.status === ActivityProcessingStatus.Error) {
|
|
1110
1132
|
await this._entityStorageActivityLogs.remove(entity.id);
|
|
@@ -1524,6 +1546,7 @@ export class DataspaceDataPlaneService {
|
|
|
1524
1546
|
* Obligations are duties that must be fulfilled as part of the agreement.
|
|
1525
1547
|
* @param obligations The obligation rules from the Agreement.
|
|
1526
1548
|
* @param agreementId The agreement ID for reference.
|
|
1549
|
+
* @returns A promise that resolves when all obligations have been logged.
|
|
1527
1550
|
* @internal
|
|
1528
1551
|
*/
|
|
1529
1552
|
async logObligations(obligations, agreementId) {
|