@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.
- package/dist/es/dataspaceDataPlaneRoutes.js +13 -40
- package/dist/es/dataspaceDataPlaneRoutes.js.map +1 -1
- package/dist/es/dataspaceDataPlaneSocketRoutes.js +1 -2
- package/dist/es/dataspaceDataPlaneSocketRoutes.js.map +1 -1
- package/dist/types/dataspaceDataPlaneRoutes.d.ts +0 -4
- package/docs/changelog.md +17 -0
- package/docs/open-api/spec.json +1 -15
- package/docs/reference/index.md +0 -1
- package/package.json +3 -3
- package/docs/reference/variables/ACTIVITY_LOG_ROUTE.md +0 -5
|
@@ -1,25 +1,13 @@
|
|
|
1
1
|
// Copyright 2025 IOTA Stiftung.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
-
import {
|
|
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}
|
|
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}
|
|
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}
|
|
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}
|
|
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}/${
|
|
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 =
|
|
251
|
-
|
|
252
|
-
|
|
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}/${
|
|
247
|
+
location: `${baseRouteName}/activity-logs/${result.id}`
|
|
275
248
|
},
|
|
276
|
-
statusCode
|
|
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":"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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\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}
|
|
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":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"dataspaceDataPlaneSocketRoutes.js","sourceRoot":"","sources":["../../src/dataspaceDataPlaneSocketRoutes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAS1D;;GAEG;AACH,MAAM,aAAa,GAAG,gCAAgC,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,sCAAsC,CACrD,aAAqB,EACrB,aAAqB;IAErB,MAAM,wBAAwB,GAG1B;QACH,WAAW,EAAE,aAAa;QAC1B,IAAI,EAAE,GAAG,aAAa,uBAAuB;QAC7C,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CACzD,uBAAuB,CAAC,oBAAoB,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC;QAC/E,SAAS,EAAE,KAAK,EAAC,oBAAoB,EAAC,EAAE,CAAC,0BAA0B,CAAC,oBAAoB,CAAC;QACzF,YAAY,EAAE,KAAK,EAAC,oBAAoB,EAAC,EAAE,CAC1C,6BAA6B,CAAC,oBAAoB,EAAE,aAAa,CAAC;KACnE,CAAC;IAEF,OAAO,CAAC,wBAAwB,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,oBAA2C,EAC3C,aAAqB,EACrB,OAAkC,EAClC,OAA0F;IAE1F,MAAM,CAAC,MAAM,CAA4B,aAAa,aAAmB,OAAO,CAAC,CAAC;IAClF,MAAM,CAAC,WAAW,CAAC,aAAa,4BAAkC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1F,MAAM,CAAC,WAAW,CACjB,aAAa,iCAEb,OAAO,CAAC,IAAI,CAAC,cAAc,CAC3B,CAAC;IAEF,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAA+B,aAAa,CAAC,CAAC;IAEpF,QAAQ,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,KAAK,WAAW;YACf,MAAM,SAAS,CAAC,sBAAsB,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;gBACpD,MAAM,OAAO,CAAC,SAAS,EAAE;oBACxB,IAAI,EAAE,KAAK;iBACX,CAAC,CAAC;YACJ,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChC,MAAM;QACP,KAAK,aAAa;YACjB,MAAM,SAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACtE,MAAM;IACR,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAClD,oBAA2C,EAC3C,aAAqB;IAErB,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAC1C,oBAAoB,CAAC,oBAAoB,CACzC,CAAC;IACF,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAA+B,aAAa,CAAC,CAAC;IAEpF,MAAM,MAAM,EAAE,GAAG,CAAC;QACjB,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE;YACL,QAAQ,EAAE,oBAAoB,CAAC,QAAQ;SACvC;KACD,CAAC,CAAC;IAEH,MAAM,SAAS,CAAC,wBAAwB,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC/C,oBAA2C;IAE3C,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAC1C,oBAAoB,CAAC,oBAAoB,CACzC,CAAC;IAEF,MAAM,MAAM,EAAE,GAAG,CAAC;QACjB,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,4BAA4B;QACrC,IAAI,EAAE;YACL,QAAQ,EAAE,oBAAoB,CAAC,QAAQ;SACvC;KACD,CAAC,CAAC;AACJ,CAAC","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
|
|
package/docs/open-api/spec.json
CHANGED
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"content": {
|
|
74
74
|
"application/json": {
|
|
75
75
|
"schema": {
|
|
76
|
-
"$ref": "#/components/schemas/
|
|
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": [
|
package/docs/reference/index.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twin.org/dataspace-data-plane-service",
|
|
3
|
-
"version": "0.0.3-next.
|
|
3
|
+
"version": "0.0.3-next.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.
|
|
25
|
-
"@twin.org/dataspace-models": "0.0.3-next.
|
|
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",
|