@twin.org/dataspace-data-plane-service 0.0.3-next.37 → 0.0.3-next.38

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.
@@ -1,25 +1,13 @@
1
1
  // Copyright 2025 IOTA Stiftung.
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
- import { HttpErrorHelper, HttpParameterHelper } from "@twin.org/api-models";
4
- import { Coerce, ComponentFactory, Guards, Is } from "@twin.org/core";
3
+ import { HttpParameterHelper } from "@twin.org/api-models";
4
+ import { BaseError, Coerce, ComponentFactory, Guards, Is, UnprocessableError } from "@twin.org/core";
5
5
  import { ActivityProcessingStatus, ActivityTaskStatus } from "@twin.org/dataspace-models";
6
6
  import { HeaderHelper, HeaderTypes, HttpStatusCode, MimeTypes } from "@twin.org/web";
7
7
  /**
8
8
  * The source used when communicating about these routes.
9
9
  */
10
10
  const ROUTES_SOURCE = "dataspaceDataPlaneRoutes";
11
- /**
12
- * Activity stream route.
13
- */
14
- const ACTIVITY_STREAM_ROUTE = "inbox";
15
- /**
16
- * Activity processing details route.
17
- */
18
- export const ACTIVITY_LOG_ROUTE = "activity-logs";
19
- /**
20
- * Route of the query interface.
21
- */
22
- const QUERY_INTERFACE_ROUTE = "entities";
23
11
  /**
24
12
  * The tag to associate with the routes.
25
13
  */
@@ -79,7 +67,7 @@ export function generateRestRoutesDataspaceDataPlane(baseRouteName, factoryServi
79
67
  summary: "Notify of a new Activity",
80
68
  tag: tagsDataspaceDataPlane[0].name,
81
69
  method: "POST",
82
- path: `${baseRouteName}/${ACTIVITY_STREAM_ROUTE}`,
70
+ path: `${baseRouteName}/inbox`,
83
71
  handler: async (httpRequestContext, request) => activityStreamNotify(baseRouteName, httpRequestContext, factoryServiceName, request),
84
72
  requestType: {
85
73
  mimeType: MimeTypes.JsonLd,
@@ -109,7 +97,7 @@ export function generateRestRoutesDataspaceDataPlane(baseRouteName, factoryServi
109
97
  summary: "Get a Activity Log Entry",
110
98
  tag: tagsDataspaceDataPlane[0].name,
111
99
  method: "GET",
112
- path: `${baseRouteName}/${ACTIVITY_LOG_ROUTE}/:id`,
100
+ path: `${baseRouteName}/activity-logs/:id`,
113
101
  handler: async (httpRequestContext, request) => activityLogEntryGet(httpRequestContext, factoryServiceName, request),
114
102
  requestType: {
115
103
  type: "IActivityLogEntryGetRequest",
@@ -143,7 +131,7 @@ export function generateRestRoutesDataspaceDataPlane(baseRouteName, factoryServi
143
131
  summary: "Get Data Asset Entities",
144
132
  tag: tagsDataspaceDataPlane[0].name,
145
133
  method: "GET",
146
- path: `${baseRouteName}/${QUERY_INTERFACE_ROUTE}`,
134
+ path: `${baseRouteName}/entities`,
147
135
  handler: async (httpRequestContext, request) => getDataAssetEntities(httpRequestContext, factoryServiceName, request),
148
136
  requestType: {
149
137
  type: "IDataAssetGetEntitiesRequest",
@@ -180,7 +168,7 @@ export function generateRestRoutesDataspaceDataPlane(baseRouteName, factoryServi
180
168
  summary: "Query Data Asset",
181
169
  tag: tagsDataspaceDataPlane[0].name,
182
170
  method: "POST",
183
- path: `${baseRouteName}/${QUERY_INTERFACE_ROUTE}/query`,
171
+ path: `${baseRouteName}/entities/query`,
184
172
  handler: async (httpRequestContext, request) => queryDataAsset(httpRequestContext, factoryServiceName, request),
185
173
  requestType: {
186
174
  type: "IDataAssetQueryRequest",
@@ -241,39 +229,24 @@ export async function activityStreamNotify(baseRouteName, httpRequestContext, fa
241
229
  if (Is.string(result)) {
242
230
  return {
243
231
  headers: {
244
- location: `${baseRouteName}/${ACTIVITY_LOG_ROUTE}/${result}`
232
+ location: `${baseRouteName}/activity-logs/${result}`
245
233
  },
246
234
  statusCode: HttpStatusCode.accepted
247
235
  };
248
236
  }
237
+ let statusCode = HttpStatusCode.created;
249
238
  if (result.status === ActivityProcessingStatus.Error) {
250
- const failedErrors = (result.tasks ?? []).flatMap(t => {
251
- if (t.status === ActivityTaskStatus.Failed && t.error) {
252
- return [t.error];
253
- }
254
- return [];
255
- });
256
- const semanticError = failedErrors.find(e => HttpErrorHelper.processError(e, false).httpStatusCode === HttpStatusCode.unprocessableEntity);
257
- const failedTaskError = semanticError ?? failedErrors[0];
258
- const { httpStatusCode, error } = failedTaskError
259
- ? HttpErrorHelper.processError(failedTaskError, false)
260
- : { httpStatusCode: HttpStatusCode.internalServerError, error: undefined };
261
- const statusCode = httpStatusCode === HttpStatusCode.unprocessableEntity
239
+ const failedErrors = result.tasks?.filter(task => task.status === ActivityTaskStatus.Failed) ?? [];
240
+ const hasUnprocessableError = failedErrors.some(task => BaseError.someErrorName(task.error, UnprocessableError.CLASS_NAME));
241
+ statusCode = hasUnprocessableError
262
242
  ? HttpStatusCode.unprocessableEntity
263
243
  : HttpStatusCode.internalServerError;
264
- return {
265
- headers: {
266
- location: `${baseRouteName}/${ACTIVITY_LOG_ROUTE}/${result.id}`
267
- },
268
- statusCode,
269
- body: { ...result, error }
270
- };
271
244
  }
272
245
  return {
273
246
  headers: {
274
- location: `${baseRouteName}/${ACTIVITY_LOG_ROUTE}/${result.id}`
247
+ location: `${baseRouteName}/activity-logs/${result.id}`
275
248
  },
276
- statusCode: HttpStatusCode.created,
249
+ statusCode,
277
250
  body: result
278
251
  };
279
252
  }
@@ -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\tHttpErrorHelper,\n\tHttpParameterHelper,\n\ttype IHostingComponent,\n\ttype IHttpRequestContext,\n\ttype IRestRoute,\n\ttype ITag\n} from \"@twin.org/api-models\";\nimport { Coerce, ComponentFactory, Guards, Is } 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 * Activity stream route.\n */\nconst ACTIVITY_STREAM_ROUTE = \"inbox\";\n\n/**\n * Activity processing details route.\n */\nexport const ACTIVITY_LOG_ROUTE = \"activity-logs\";\n\n/**\n * Route of the query interface.\n */\nconst QUERY_INTERFACE_ROUTE = \"entities\";\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}/${ACTIVITY_STREAM_ROUTE}`,\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_LOG_ROUTE}/: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}/${QUERY_INTERFACE_ROUTE}`,\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}/${QUERY_INTERFACE_ROUTE}/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\tlocation: `${baseRouteName}/${ACTIVITY_LOG_ROUTE}/${result}`\n\t\t\t},\n\t\t\tstatusCode: HttpStatusCode.accepted\n\t\t};\n\t}\n\n\tif (result.status === ActivityProcessingStatus.Error) {\n\t\tconst failedErrors = (result.tasks ?? []).flatMap(t => {\n\t\t\tif (t.status === ActivityTaskStatus.Failed && t.error) {\n\t\t\t\treturn [t.error];\n\t\t\t}\n\t\t\treturn [];\n\t\t});\n\t\tconst semanticError = failedErrors.find(\n\t\t\te =>\n\t\t\t\tHttpErrorHelper.processError(e, false).httpStatusCode === HttpStatusCode.unprocessableEntity\n\t\t);\n\t\tconst failedTaskError = semanticError ?? failedErrors[0];\n\t\tconst { httpStatusCode, error } = failedTaskError\n\t\t\t? HttpErrorHelper.processError(failedTaskError, false)\n\t\t\t: { httpStatusCode: HttpStatusCode.internalServerError, error: undefined };\n\t\tconst statusCode =\n\t\t\thttpStatusCode === HttpStatusCode.unprocessableEntity\n\t\t\t\t? HttpStatusCode.unprocessableEntity\n\t\t\t\t: HttpStatusCode.internalServerError;\n\t\treturn {\n\t\t\theaders: {\n\t\t\t\tlocation: `${baseRouteName}/${ACTIVITY_LOG_ROUTE}/${result.id}`\n\t\t\t},\n\t\t\tstatusCode,\n\t\t\tbody: { ...result, error }\n\t\t};\n\t}\n\n\treturn {\n\t\theaders: {\n\t\t\tlocation: `${baseRouteName}/${ACTIVITY_LOG_ROUTE}/${result.id}`\n\t\t},\n\t\tstatusCode: HttpStatusCode.created,\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":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EACN,mBAAmB,EAKnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,MAAM,EACN,EAAE,EACF,kBAAkB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,wBAAwB,EACxB,kBAAkB,EAYlB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAErF;;GAEG;AACH,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAW;IAC7C;QACC,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,6CAA6C;KAC1D;CACD,CAAC;AAEF,MAAM,eAAe,GAA6B;IACjD,UAAU,EAAE,uCAAuC;IACnD,IAAI,EAAE,KAAK;IACX,KAAK,EAAE;QACN,EAAE,EAAE,2BAA2B;KAC/B;IACD,MAAM,EAAE;QACP,UAAU,EAAE,iCAAiC;QAC7C,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,0BAA0B;KACpC;IACD,OAAO,EAAE,sBAAsB;CAC/B,CAAC;AAEF,MAAM,uBAAuB,GAAsB;IAClD,EAAE,EAAE,2BAA2B;IAC/B,WAAW,EAAE,sBAAsB;IACnC,YAAY,EAAE,sBAAsB;IACpC,SAAS,EAAE,yBAAyB;IACpC,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE;QACN;YACC,MAAM,EAAE,qBAAqB;YAC7B,cAAc,EAAE,iCAAiC;YACjD,MAAM,EAAE,SAAS;SACjB;KACD;CACD,CAAC;AAEF,MAAM,oCAAoC,GAAuB;IAChE,UAAU,EAAE,oBAAoB;IAChC,IAAI,EAAE,UAAU;IAChB,eAAe,EAAE;QAChB;YACC,UAAU,EAAE,2DAA2D;YACvE,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,2BAA2B;SAC/B;KACD;CACD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,oCAAoC,CACnD,aAAqB,EACrB,kBAA0B;IAE1B,MAAM,yBAAyB,GAG3B;QACH,WAAW,EAAE,sBAAsB;QACnC,OAAO,EAAE,0BAA0B;QACnC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI;QACnC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,GAAG,aAAa,QAAQ;QAC9B,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,oBAAoB,CAAC,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,OAAO,CAAC;QACrF,WAAW,EAAE;YACZ,QAAQ,EAAE,SAAS,CAAC,MAAM;YAC1B,IAAI,gCAAwC;YAC5C,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,oCAAoC;oBACxC,OAAO,EAAE;wBACR,IAAI,EAAE,eAAe;qBACrB;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,iCAAyC;aAC7C;SACD;QACD,qFAAqF;QACrF,8EAA8E;QAC9E,iFAAiF;QACjF,wDAAwD;QACxD,QAAQ,EAAE,IAAI;KACd,CAAC;IAEF,MAAM,wBAAwB,GAG1B;QACH,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,0BAA0B;QACnC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI;QACnC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,GAAG,aAAa,oBAAoB;QAC1C,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,mBAAmB,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,OAAO,CAAC;QACrE,WAAW,EAAE;YACZ,IAAI,+BAAuC;YAC3C,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,mCAAmC;oBACvC,OAAO,EAAE;wBACR,UAAU,EAAE;4BACX,EAAE,EAAE,4BAA4B;yBAChC;qBACD;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,gCAAwC;gBAC5C,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,oCAAoC;wBACxC,QAAQ,EAAE;4BACT,IAAI,EAAE,EAAE,GAAG,uBAAuB,EAAE;yBACpC;qBACD;iBACD;aACD;SACD;KACD,CAAC;IAEF,MAAM,yBAAyB,GAG3B;QACH,WAAW,EAAE,wCAAwC;QACrD,OAAO,EAAE,yBAAyB;QAClC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI;QACnC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,GAAG,aAAa,WAAW;QACjC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,oBAAoB,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,OAAO,CAAC;QACtE,WAAW,EAAE;YACZ,IAAI,gCAAwC;YAC5C,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,oCAAoC;oBACxC,OAAO,EAAE;wBACR,KAAK,EAAE;4BACN,WAAW,EAAE,6BAA6B;4BAC1C,EAAE,EAAE,wCAAwC;4BAC5C,IAAI,EAAE,6CAA6C;yBACnD;qBACD;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,8BAAsC;gBAC1C,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,qCAAqC;wBACzC,QAAQ,EAAE;4BACT,IAAI,EAAE,EAAE,GAAG,oCAAoC,EAAE;yBACjD;qBACD;iBACD;aACD;SACD;QACD,QAAQ,EAAE,IAAI;KACd,CAAC;IAEF,MAAM,mBAAmB,GAAmE;QAC3F,WAAW,EAAE,kCAAkC;QAC/C,OAAO,EAAE,kBAAkB;QAC3B,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI;QACnC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,GAAG,aAAa,iBAAiB;QACvC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,cAAc,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,OAAO,CAAC;QAChE,WAAW,EAAE;YACZ,IAAI,0BAAkC;YACtC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,8BAA8B;oBAClC,OAAO,EAAE;wBACR,IAAI,EAAE;4BACL,WAAW,EAAE,6BAA6B;4BAC1C,KAAK,EAAE;gCACN,IAAI,EAAE,SAAS;gCACf,CAAC,EAAE,eAAe;6BAClB;yBACD;qBACD;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,8BAAsC;gBAC1C,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,+BAA+B;wBACnC,QAAQ,EAAE;4BACT,IAAI,EAAE,EAAE,GAAG,oCAAoC,EAAE;yBACjD;qBACD;iBACD;aACD;SACD;QACD,QAAQ,EAAE,IAAI;KACd,CAAC;IAEF,OAAO;QACN,yBAAyB;QACzB,wBAAwB;QACxB,yBAAyB;QACzB,mBAAmB;KACnB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,aAAqB,EACrB,kBAAuC,EACvC,kBAA0B,EAC1B,OAAqC;IAErC,MAAM,CAAC,MAAM,CAA+B,aAAa,aAAmB,OAAO,CAAC,CAAC;IACrF,MAAM,CAAC,MAAM,CAA2B,aAAa,kBAAwB,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAA+B,kBAAkB,CAAC,CAAC;IAEzF,+EAA+E;IAC/E,yFAAyF;IACzF,MAAM,eAAe,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IACjG,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAE1E,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,OAAO;YACN,OAAO,EAAE;gBACR,QAAQ,EAAE,GAAG,aAAa,kBAAkB,MAAM,EAAE;aACpD;YACD,UAAU,EAAE,cAAc,CAAC,QAAQ;SACnC,CAAC;IACH,CAAC;IAED,IAAI,UAAU,GAAmB,cAAc,CAAC,OAAO,CAAC;IACxD,IAAI,MAAM,CAAC,MAAM,KAAK,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACtD,MAAM,YAAY,GACjB,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/E,MAAM,qBAAqB,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtD,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAClE,CAAC;QACF,UAAU,GAAG,qBAAqB;YACjC,CAAC,CAAC,cAAc,CAAC,mBAAmB;YACpC,CAAC,CAAC,cAAc,CAAC,mBAAmB,CAAC;IACvC,CAAC;IAED,OAAO;QACN,OAAO,EAAE;YACR,QAAQ,EAAE,GAAG,aAAa,kBAAkB,MAAM,CAAC,EAAE,EAAE;SACvD;QACD,UAAU;QACV,IAAI,EAAE,MAAM;KACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,kBAAuC,EACvC,kBAA0B,EAC1B,OAAoC;IAEpC,MAAM,CAAC,MAAM,CAA8B,aAAa,aAAmB,OAAO,CAAC,CAAC;IACpF,MAAM,CAAC,MAAM,CACZ,aAAa,wBAEb,OAAO,CAAC,UAAU,CAClB,CAAC;IACF,MAAM,CAAC,WAAW,CAAC,aAAa,2BAAiC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAExF,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAA+B,kBAAkB,CAAC,CAAC;IAEzF,OAAO;QACN,IAAI,EAAE,MAAM,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;KAChE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,kBAAuC,EACvC,kBAA0B,EAC1B,OAAqC;IAErC,MAAM,CAAC,MAAM,CAA+B,aAAa,aAAmB,OAAO,CAAC,CAAC;IACrF,MAAM,CAAC,MAAM,CACZ,aAAa,mBAEb,OAAO,CAAC,KAAK,CACb,CAAC;IACF,MAAM,CAAC,WAAW,CAAC,aAAa,wBAA8B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClF,MAAM,CAAC,WAAW,CAAC,aAAa,+BAAqC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEhG,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,CAC5C,kBAAkB,CAAC,oBAAoB,IAAI,SAAS,CACpD,CAAC;IAEF,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAE9F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAA+B,kBAAkB,CAAC,CAAC;IAEzF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,oBAAoB,CAClD;QACC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI;QAC9B,QAAQ,EAAE,mBAAmB,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;KAC/D,EACD,OAAO,CAAC,KAAK,CAAC,WAAW,EACzB,OAAO,CAAC,KAAK,CAAC,MAAM,EACpB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EACnC,YAAY,CACZ,CAAC;IAEF,MAAM,OAAO,GAA0C,EAAE,CAAC;IAE1D,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,gBAAgB,CACxD,MAAM,gBAAgB,CAAC,cAAc,CAAC,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,EAC3E,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EACzB,MAAM,CACN,CAAC;IACH,CAAC;IAED,OAAO;QACN,OAAO;QACP,IAAI,EAAE,MAAM,CAAC,QAAQ;KACrB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,kBAAuC,EACvC,kBAA0B,EAC1B,OAA+B;IAE/B,MAAM,CAAC,MAAM,CAAyB,aAAa,aAAmB,OAAO,CAAC,CAAC;IAC/E,MAAM,CAAC,MAAM,CAAiC,aAAa,kBAAwB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjG,MAAM,CAAC,WAAW,CAAC,aAAa,8BAAoC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE9F,MAAM,CAAC,MAAM,CAAkB,aAAa,wBAA8B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9F,MAAM,CAAC,MAAM,CAAC,aAAa,6BAAmC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvF,MAAM,CAAC,MAAM,CAAC,aAAa,0BAAgC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEjF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,CAC5C,kBAAkB,CAAC,oBAAoB,IAAI,SAAS,CACpD,CAAC;IAEF,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAE9F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAA+B,kBAAkB,CAAC,CAAC;IAEzF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,cAAc,CAC5C,OAAO,CAAC,IAAI,CAAC,WAAW,EACxB,OAAO,CAAC,IAAI,CAAC,KAAK,EAClB,OAAO,CAAC,KAAK,EAAE,MAAM,EACrB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EACpC,YAAY,CACZ,CAAC;IAEF,MAAM,OAAO,GAA0C,EAAE,CAAC;IAE1D,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,gBAAgB,CACxD,MAAM,gBAAgB,CAAC,cAAc,CAAC,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,EAC3E,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EACzB,MAAM,CACN,CAAC;IACH,CAAC;IAED,OAAO;QACN,OAAO;QACP,IAAI,EAAE,MAAM,CAAC,QAAQ;KACrB,CAAC;AACH,CAAC","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\tlocation: `${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\tlocation: `${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,5 +1,4 @@
1
1
  import { ComponentFactory, Guards } from "@twin.org/core";
2
- import { ACTIVITY_LOG_ROUTE } from "./dataspaceDataPlaneRoutes.js";
3
2
  /**
4
3
  * The source used when communicating about these routes.
5
4
  */
@@ -13,7 +12,7 @@ const ROUTES_SOURCE = "dataspaceDataPlaneSocketRoutes";
13
12
  export function generateSocketRoutesDataspaceDataPlane(baseRouteName, componentName) {
14
13
  const activityLogStatusWsRoute = {
15
14
  operationId: "statusQuery",
16
- path: `${baseRouteName}/${ACTIVITY_LOG_ROUTE}/status`,
15
+ path: `${baseRouteName}/activity-logs/status`,
17
16
  handler: async (socketRequestContext, request, emitter) => activityLogStatusUpdate(socketRequestContext, componentName, request, emitter),
18
17
  connected: async (socketRequestContext) => activityLogStatusConnected(socketRequestContext),
19
18
  disconnected: async (socketRequestContext) => activityLogStatusDisconnected(socketRequestContext, componentName)
@@ -1 +1 @@
1
- {"version":3,"file":"dataspaceDataPlaneSocketRoutes.js","sourceRoot":"","sources":["../../src/dataspaceDataPlaneSocketRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { ISocketRequestContext, ISocketRoute } from \"@twin.org/api-models\";\nimport { ComponentFactory, Guards } from \"@twin.org/core\";\nimport type {\n\tIActivityLogStatusNotificationPayload,\n\tIActivityLogStatusRequest,\n\tIDataspaceDataPlaneComponent\n} from \"@twin.org/dataspace-models\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { ACTIVITY_LOG_ROUTE } from \"./dataspaceDataPlaneRoutes.js\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"dataspaceDataPlaneSocketRoutes\";\n\n/**\n * The socket routes for the Dataspace Data Plane.\n * @param baseRouteName Prefix to prepend to the paths.\n * @param componentName The name of the component to use in the routes stored in the ComponentFactory.\n * @returns The generated routes.\n */\nexport function generateSocketRoutesDataspaceDataPlane(\n\tbaseRouteName: string,\n\tcomponentName: string\n): ISocketRoute[] {\n\tconst activityLogStatusWsRoute: ISocketRoute<\n\t\tIActivityLogStatusRequest,\n\t\tIActivityLogStatusNotificationPayload\n\t> = {\n\t\toperationId: \"statusQuery\",\n\t\tpath: `${baseRouteName}/${ACTIVITY_LOG_ROUTE}/status`,\n\t\thandler: async (socketRequestContext, request, emitter) =>\n\t\t\tactivityLogStatusUpdate(socketRequestContext, componentName, request, emitter),\n\t\tconnected: async socketRequestContext => activityLogStatusConnected(socketRequestContext),\n\t\tdisconnected: async socketRequestContext =>\n\t\t\tactivityLogStatusDisconnected(socketRequestContext, componentName)\n\t};\n\n\treturn [activityLogStatusWsRoute];\n}\n\n/**\n * Provides an status update.\n * @param socketRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @param emitter The emitter to send message back.\n * @returns The response object with additional http response properties.\n */\nexport async function activityLogStatusUpdate(\n\tsocketRequestContext: ISocketRequestContext,\n\tcomponentName: string,\n\trequest: IActivityLogStatusRequest,\n\temitter: (topic: string, response: IActivityLogStatusNotificationPayload) => Promise<void>\n): Promise<void> {\n\tGuards.object<IActivityLogStatusRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.body.operation), request.body.operation);\n\tGuards.stringValue(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.body.subscriptionId),\n\t\trequest.body.subscriptionId\n\t);\n\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(componentName);\n\n\tswitch (request.body.operation) {\n\t\tcase \"subscribe\":\n\t\t\tawait component.subscribeToActivityLog(async event => {\n\t\t\t\tawait emitter(\"publish\", {\n\t\t\t\t\tbody: event\n\t\t\t\t});\n\t\t\t}, request.body.subscriptionId);\n\t\t\tbreak;\n\t\tcase \"unsubscribe\":\n\t\t\tawait component.unSubscribeToActivityLog(request.body.subscriptionId);\n\t\t\tbreak;\n\t}\n}\n\n/**\n * Executes when there is a disconnection.\n * @param socketRequestContext Socket Request Context\n * @param componentName Component name.\n */\nexport async function activityLogStatusDisconnected(\n\tsocketRequestContext: ISocketRequestContext,\n\tcomponentName: string\n): Promise<void> {\n\tconst logger = ComponentFactory.getIfExists<ILoggingComponent>(\n\t\tsocketRequestContext.loggingComponentType\n\t);\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(componentName);\n\n\tawait logger?.log({\n\t\tsource: ROUTES_SOURCE,\n\t\tlevel: \"debug\",\n\t\tmessage: \"activityLogStatusDisconnected\",\n\t\tdata: {\n\t\t\tsocketId: socketRequestContext.socketId\n\t\t}\n\t});\n\n\tawait component.unSubscribeToActivityLog(socketRequestContext.socketId);\n}\n\n/**\n * Executes when there is a disconnection.\n * @param socketRequestContext Socket Request Context\n */\nexport async function activityLogStatusConnected(\n\tsocketRequestContext: ISocketRequestContext\n): Promise<void> {\n\tconst logger = ComponentFactory.getIfExists<ILoggingComponent>(\n\t\tsocketRequestContext.loggingComponentType\n\t);\n\n\tawait logger?.log({\n\t\tsource: ROUTES_SOURCE,\n\t\tlevel: \"debug\",\n\t\tmessage: \"activityLogStatusConnected\",\n\t\tdata: {\n\t\t\tsocketId: socketRequestContext.socketId\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"dataspaceDataPlaneSocketRoutes.js","sourceRoot":"","sources":["../../src/dataspaceDataPlaneSocketRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { ISocketRequestContext, ISocketRoute } from \"@twin.org/api-models\";\nimport { ComponentFactory, Guards } from \"@twin.org/core\";\nimport type {\n\tIActivityLogStatusNotificationPayload,\n\tIActivityLogStatusRequest,\n\tIDataspaceDataPlaneComponent\n} from \"@twin.org/dataspace-models\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof } from \"@twin.org/nameof\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"dataspaceDataPlaneSocketRoutes\";\n\n/**\n * The socket routes for the Dataspace Data Plane.\n * @param baseRouteName Prefix to prepend to the paths.\n * @param componentName The name of the component to use in the routes stored in the ComponentFactory.\n * @returns The generated routes.\n */\nexport function generateSocketRoutesDataspaceDataPlane(\n\tbaseRouteName: string,\n\tcomponentName: string\n): ISocketRoute[] {\n\tconst activityLogStatusWsRoute: ISocketRoute<\n\t\tIActivityLogStatusRequest,\n\t\tIActivityLogStatusNotificationPayload\n\t> = {\n\t\toperationId: \"statusQuery\",\n\t\tpath: `${baseRouteName}/activity-logs/status`,\n\t\thandler: async (socketRequestContext, request, emitter) =>\n\t\t\tactivityLogStatusUpdate(socketRequestContext, componentName, request, emitter),\n\t\tconnected: async socketRequestContext => activityLogStatusConnected(socketRequestContext),\n\t\tdisconnected: async socketRequestContext =>\n\t\t\tactivityLogStatusDisconnected(socketRequestContext, componentName)\n\t};\n\n\treturn [activityLogStatusWsRoute];\n}\n\n/**\n * Provides an status update.\n * @param socketRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @param emitter The emitter to send message back.\n * @returns The response object with additional http response properties.\n */\nexport async function activityLogStatusUpdate(\n\tsocketRequestContext: ISocketRequestContext,\n\tcomponentName: string,\n\trequest: IActivityLogStatusRequest,\n\temitter: (topic: string, response: IActivityLogStatusNotificationPayload) => Promise<void>\n): Promise<void> {\n\tGuards.object<IActivityLogStatusRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.body.operation), request.body.operation);\n\tGuards.stringValue(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.body.subscriptionId),\n\t\trequest.body.subscriptionId\n\t);\n\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(componentName);\n\n\tswitch (request.body.operation) {\n\t\tcase \"subscribe\":\n\t\t\tawait component.subscribeToActivityLog(async event => {\n\t\t\t\tawait emitter(\"publish\", {\n\t\t\t\t\tbody: event\n\t\t\t\t});\n\t\t\t}, request.body.subscriptionId);\n\t\t\tbreak;\n\t\tcase \"unsubscribe\":\n\t\t\tawait component.unSubscribeToActivityLog(request.body.subscriptionId);\n\t\t\tbreak;\n\t}\n}\n\n/**\n * Executes when there is a disconnection.\n * @param socketRequestContext Socket Request Context\n * @param componentName Component name.\n */\nexport async function activityLogStatusDisconnected(\n\tsocketRequestContext: ISocketRequestContext,\n\tcomponentName: string\n): Promise<void> {\n\tconst logger = ComponentFactory.getIfExists<ILoggingComponent>(\n\t\tsocketRequestContext.loggingComponentType\n\t);\n\tconst component = ComponentFactory.get<IDataspaceDataPlaneComponent>(componentName);\n\n\tawait logger?.log({\n\t\tsource: ROUTES_SOURCE,\n\t\tlevel: \"debug\",\n\t\tmessage: \"activityLogStatusDisconnected\",\n\t\tdata: {\n\t\t\tsocketId: socketRequestContext.socketId\n\t\t}\n\t});\n\n\tawait component.unSubscribeToActivityLog(socketRequestContext.socketId);\n}\n\n/**\n * Executes when there is a disconnection.\n * @param socketRequestContext Socket Request Context\n */\nexport async function activityLogStatusConnected(\n\tsocketRequestContext: ISocketRequestContext\n): Promise<void> {\n\tconst logger = ComponentFactory.getIfExists<ILoggingComponent>(\n\t\tsocketRequestContext.loggingComponentType\n\t);\n\n\tawait logger?.log({\n\t\tsource: ROUTES_SOURCE,\n\t\tlevel: \"debug\",\n\t\tmessage: \"activityLogStatusConnected\",\n\t\tdata: {\n\t\t\tsocketId: socketRequestContext.socketId\n\t\t}\n\t});\n}\n"]}
@@ -1,9 +1,5 @@
1
1
  import { type IHttpRequestContext, type IRestRoute, type ITag } from "@twin.org/api-models";
2
2
  import { type IActivityLogEntryGetRequest, type IActivityLogEntryGetResponse, type IActivityStreamNotifyRequest, type IActivityStreamNotifyResponse, type IDataAssetEntitiesResponse, type IDataAssetGetEntitiesRequest, type IDataAssetQueryRequest } from "@twin.org/dataspace-models";
3
- /**
4
- * Activity processing details route.
5
- */
6
- export declare const ACTIVITY_LOG_ROUTE = "activity-logs";
7
3
  /**
8
4
  * The tag to associate with the routes.
9
5
  */
package/docs/changelog.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## [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
+
5
+
6
+ ### Features
7
+
8
+ * improve error handling and component usage ([544e20e](https://github.com/iotaledger/twin-dataspace/commit/544e20e640d6f09266942bfc698aead6227a7769))
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.37 to 0.0.3-next.38
16
+ * @twin.org/dataspace-models bumped from 0.0.3-next.37 to 0.0.3-next.38
17
+ * devDependencies
18
+ * @twin.org/dataspace-test-app bumped from 0.0.3-next.37 to 0.0.3-next.38
19
+
3
20
  ## [0.0.3-next.37](https://github.com/iotaledger/twin-dataspace/compare/dataspace-data-plane-service-v0.0.3-next.36...dataspace-data-plane-service-v0.0.3-next.37) (2026-06-03)
4
21
 
5
22
 
@@ -73,7 +73,7 @@
73
73
  "content": {
74
74
  "application/json": {
75
75
  "schema": {
76
- "$ref": "#/components/schemas/ActivityLogEntryWithError"
76
+ "$ref": "#/components/schemas/ActivityLogEntry"
77
77
  }
78
78
  }
79
79
  }
@@ -562,20 +562,6 @@
562
562
  }
563
563
  ]
564
564
  },
565
- "ActivityLogEntryWithError": {
566
- "description": "Activity log entry extended with a top-level RFC 9457 error field.\nReturned as the response body for 422/500 inline-processing failures.",
567
- "type": "object",
568
- "properties": {
569
- "error": {
570
- "$ref": "#/components/schemas/Error"
571
- }
572
- },
573
- "allOf": [
574
- {
575
- "$ref": "#/components/schemas/ActivityLogEntry"
576
- }
577
- ]
578
- },
579
565
  "ActivityProcessingStatus": {
580
566
  "description": "The type exported.",
581
567
  "anyOf": [
@@ -14,7 +14,6 @@
14
14
 
15
15
  ## Variables
16
16
 
17
- - [ACTIVITY\_LOG\_ROUTE](variables/ACTIVITY_LOG_ROUTE.md)
18
17
  - [tagsDataspaceDataPlane](variables/tagsDataspaceDataPlane.md)
19
18
  - [restEntryPoints](variables/restEntryPoints.md)
20
19
  - [socketEntryPoints](variables/socketEntryPoints.md)
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.37",
3
+ "version": "0.0.3-next.38",
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.37",
25
- "@twin.org/dataspace-models": "0.0.3-next.37",
24
+ "@twin.org/dataspace-app-runner": "0.0.3-next.38",
25
+ "@twin.org/dataspace-models": "0.0.3-next.38",
26
26
  "@twin.org/engine-models": "next",
27
27
  "@twin.org/entity": "next",
28
28
  "@twin.org/entity-storage-models": "next",
@@ -1,5 +0,0 @@
1
- # Variable: ACTIVITY\_LOG\_ROUTE
2
-
3
- > `const` **ACTIVITY\_LOG\_ROUTE**: `"activity-logs"` = `"activity-logs"`
4
-
5
- Activity processing details route.