@twin.org/dataspace-control-plane-service 0.0.3-next.15

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.
Files changed (50) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +119 -0
  3. package/dist/es/dataspaceControlPlanePolicyRequester.js +228 -0
  4. package/dist/es/dataspaceControlPlanePolicyRequester.js.map +1 -0
  5. package/dist/es/dataspaceControlPlaneRoutes.js +202 -0
  6. package/dist/es/dataspaceControlPlaneRoutes.js.map +1 -0
  7. package/dist/es/dataspaceControlPlaneService.js +1420 -0
  8. package/dist/es/dataspaceControlPlaneService.js.map +1 -0
  9. package/dist/es/index.js +11 -0
  10. package/dist/es/index.js.map +1 -0
  11. package/dist/es/models/IDataspaceControlPlaneServiceConfig.js +4 -0
  12. package/dist/es/models/IDataspaceControlPlaneServiceConfig.js.map +1 -0
  13. package/dist/es/models/IDataspaceControlPlaneServiceConstructorOptions.js +2 -0
  14. package/dist/es/models/IDataspaceControlPlaneServiceConstructorOptions.js.map +1 -0
  15. package/dist/es/models/INegotiationState.js +4 -0
  16. package/dist/es/models/INegotiationState.js.map +1 -0
  17. package/dist/es/restEntryPoints.js +15 -0
  18. package/dist/es/restEntryPoints.js.map +1 -0
  19. package/dist/es/schema.js +11 -0
  20. package/dist/es/schema.js.map +1 -0
  21. package/dist/es/utils/dataHelpers.js +22 -0
  22. package/dist/es/utils/dataHelpers.js.map +1 -0
  23. package/dist/es/utils/transferErrorUtils.js +78 -0
  24. package/dist/es/utils/transferErrorUtils.js.map +1 -0
  25. package/dist/types/dataspaceControlPlanePolicyRequester.d.ts +80 -0
  26. package/dist/types/dataspaceControlPlaneRoutes.d.ts +17 -0
  27. package/dist/types/dataspaceControlPlaneService.d.ts +153 -0
  28. package/dist/types/index.d.ts +8 -0
  29. package/dist/types/models/IDataspaceControlPlaneServiceConfig.d.ts +20 -0
  30. package/dist/types/models/IDataspaceControlPlaneServiceConstructorOptions.d.ts +69 -0
  31. package/dist/types/models/INegotiationState.d.ts +27 -0
  32. package/dist/types/restEntryPoints.d.ts +7 -0
  33. package/dist/types/schema.d.ts +4 -0
  34. package/dist/types/utils/dataHelpers.d.ts +1 -0
  35. package/dist/types/utils/transferErrorUtils.d.ts +39 -0
  36. package/docs/API.md +341 -0
  37. package/docs/changelog.md +31 -0
  38. package/docs/examples.md +1 -0
  39. package/docs/reference/classes/DataspaceControlPlanePolicyRequester.md +244 -0
  40. package/docs/reference/classes/DataspaceControlPlaneService.md +549 -0
  41. package/docs/reference/functions/generateRestRoutesDataspaceControlPlane.md +29 -0
  42. package/docs/reference/functions/initSchema.md +9 -0
  43. package/docs/reference/index.md +22 -0
  44. package/docs/reference/interfaces/IDataspaceControlPlaneServiceConfig.md +26 -0
  45. package/docs/reference/interfaces/IDataspaceControlPlaneServiceConstructorOptions.md +160 -0
  46. package/docs/reference/interfaces/INegotiationState.md +43 -0
  47. package/docs/reference/variables/restEntryPoints.md +7 -0
  48. package/docs/reference/variables/tagsDataspaceControlPlane.md +5 -0
  49. package/locales/en.json +93 -0
  50. package/package.json +70 -0
@@ -0,0 +1,202 @@
1
+ import { ComponentFactory, Guards } from "@twin.org/core";
2
+ import { HeaderHelper, HeaderTypes } from "@twin.org/web";
3
+ import { transformErrorToStatusCode } from "./utils/transferErrorUtils.js";
4
+ /**
5
+ * The source used when communicating about these routes.
6
+ */
7
+ const ROUTES_SOURCE = "dataspaceControlPlaneRoutes";
8
+ /**
9
+ * The tags to associate with the DSP protocol routes.
10
+ */
11
+ export const tagsDataspaceControlPlane = [
12
+ {
13
+ name: "Transfer Process",
14
+ description: "DSP Transfer Process Protocol endpoints for initiating and managing data transfers."
15
+ }
16
+ ];
17
+ /**
18
+ * The REST routes for dataspace control plane (DSP Protocol only).
19
+ * These routes implement the Eclipse Dataspace Protocol Transfer Process Protocol.
20
+ *
21
+ * Contract Negotiation is handled internally via PNP callbacks — no REST endpoints needed.
22
+ * PNP registers its own inbound callback routes for negotiation messages from providers.
23
+ *
24
+ * @param baseRouteName Prefix to prepend to the paths.
25
+ * @param componentName The name of the component to use in the routes stored in the ComponentFactory.
26
+ * @returns The generated DSP protocol routes.
27
+ */
28
+ export function generateRestRoutesDataspaceControlPlane(baseRouteName, componentName) {
29
+ const routes = [];
30
+ // ============================================================================
31
+ // TRANSFER PROCESS PROTOCOL (DSP)
32
+ // ============================================================================
33
+ // POST /transfers/request - Request Transfer Process (DSP)
34
+ routes.push({
35
+ operationId: "requestTransfer",
36
+ summary: "Request Transfer Process (DSP)",
37
+ tag: tagsDataspaceControlPlane[0].name,
38
+ method: "POST",
39
+ path: `${baseRouteName}/transfers/request`,
40
+ handler: async (httpRequestContext, request) => requestTransferHandler(httpRequestContext, componentName, request)
41
+ });
42
+ // GET /transfers/:pid - Get Transfer Process state (DSP)
43
+ routes.push({
44
+ operationId: "getTransferProcess",
45
+ summary: "Get Transfer Process state (DSP)",
46
+ tag: tagsDataspaceControlPlane[0].name,
47
+ method: "GET",
48
+ path: `${baseRouteName}/transfers/:pid`,
49
+ handler: async (httpRequestContext, request) => getTransferProcessHandler(httpRequestContext, componentName, request)
50
+ });
51
+ // POST /transfers/:pid/start - Start Transfer Process (DSP)
52
+ routes.push({
53
+ operationId: "startTransfer",
54
+ summary: "Start Transfer Process (DSP)",
55
+ tag: tagsDataspaceControlPlane[0].name,
56
+ method: "POST",
57
+ path: `${baseRouteName}/transfers/:pid/start`,
58
+ handler: async (httpRequestContext, request) => startTransferHandler(httpRequestContext, componentName, request)
59
+ });
60
+ // POST /transfers/:pid/complete - Complete Transfer Process (DSP)
61
+ routes.push({
62
+ operationId: "completeTransfer",
63
+ summary: "Complete Transfer Process (DSP)",
64
+ tag: tagsDataspaceControlPlane[0].name,
65
+ method: "POST",
66
+ path: `${baseRouteName}/transfers/:pid/complete`,
67
+ handler: async (httpRequestContext, request) => completeTransferHandler(httpRequestContext, componentName, request)
68
+ });
69
+ // POST /transfers/:pid/suspend - Suspend Transfer Process (DSP)
70
+ routes.push({
71
+ operationId: "suspendTransfer",
72
+ summary: "Suspend Transfer Process (DSP)",
73
+ tag: tagsDataspaceControlPlane[0].name,
74
+ method: "POST",
75
+ path: `${baseRouteName}/transfers/:pid/suspend`,
76
+ handler: async (httpRequestContext, request) => suspendTransferHandler(httpRequestContext, componentName, request)
77
+ });
78
+ // POST /transfers/:pid/terminate - Terminate Transfer Process (DSP)
79
+ routes.push({
80
+ operationId: "terminateTransfer",
81
+ summary: "Terminate Transfer Process (DSP)",
82
+ tag: tagsDataspaceControlPlane[0].name,
83
+ method: "POST",
84
+ path: `${baseRouteName}/transfers/:pid/terminate`,
85
+ handler: async (httpRequestContext, request) => terminateTransferHandler(httpRequestContext, componentName, request)
86
+ });
87
+ return routes;
88
+ }
89
+ // ============================================================================
90
+ // TRANSFER PROCESS PROTOCOL HANDLERS
91
+ // ============================================================================
92
+ /**
93
+ * Request Transfer Process handler.
94
+ * @param httpRequestContext The request context for the API.
95
+ * @param componentName The name of the component to use.
96
+ * @param request The API request containing headers and body.
97
+ * @returns The response.
98
+ */
99
+ async function requestTransferHandler(httpRequestContext, componentName, request) {
100
+ Guards.object(ROUTES_SOURCE, "request", request);
101
+ Guards.object(ROUTES_SOURCE, "request.body", request.body);
102
+ const trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);
103
+ const component = ComponentFactory.get(componentName);
104
+ const result = await component.requestTransfer(request.body, trustPayload);
105
+ return {
106
+ body: result,
107
+ statusCode: transformErrorToStatusCode(result)
108
+ };
109
+ }
110
+ /**
111
+ * Get Transfer Process handler.
112
+ * @param httpRequestContext The request context for the API.
113
+ * @param componentName The name of the component to use.
114
+ * @param request The API request containing headers and path parameters.
115
+ * @returns The response.
116
+ */
117
+ async function getTransferProcessHandler(httpRequestContext, componentName, request) {
118
+ Guards.object(ROUTES_SOURCE, "request", request);
119
+ Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
120
+ Guards.stringValue(ROUTES_SOURCE, "request.pathParams.pid", request.pathParams.pid);
121
+ const trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);
122
+ const component = ComponentFactory.get(componentName);
123
+ const result = await component.getTransferProcess(request.pathParams.pid, trustPayload);
124
+ return {
125
+ body: result,
126
+ statusCode: transformErrorToStatusCode(result)
127
+ };
128
+ }
129
+ /**
130
+ * Start Transfer Process handler.
131
+ * @param httpRequestContext The request context for the API.
132
+ * @param componentName The name of the component to use.
133
+ * @param request The API request containing headers, path parameters, and body.
134
+ * @returns The response.
135
+ */
136
+ async function startTransferHandler(httpRequestContext, componentName, request) {
137
+ Guards.object(ROUTES_SOURCE, "request", request);
138
+ Guards.object(ROUTES_SOURCE, "request.body", request.body);
139
+ const trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);
140
+ const hostingComponent = ComponentFactory.get(httpRequestContext.hostingComponentType ?? "hosting");
141
+ const component = ComponentFactory.get(componentName);
142
+ const result = await component.startTransfer(request.body, await hostingComponent.getPublicOrigin(httpRequestContext.serverRequest.url), trustPayload);
143
+ return {
144
+ body: result,
145
+ statusCode: transformErrorToStatusCode(result)
146
+ };
147
+ }
148
+ /**
149
+ * Complete Transfer Process handler.
150
+ * @param httpRequestContext The request context for the API.
151
+ * @param componentName The name of the component to use.
152
+ * @param request The API request containing headers, path parameters, and body.
153
+ * @returns The response.
154
+ */
155
+ async function completeTransferHandler(httpRequestContext, componentName, request) {
156
+ Guards.object(ROUTES_SOURCE, "request", request);
157
+ Guards.object(ROUTES_SOURCE, "request.body", request.body);
158
+ const trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);
159
+ const component = ComponentFactory.get(componentName);
160
+ const result = await component.completeTransfer(request.body, trustPayload);
161
+ return {
162
+ body: result,
163
+ statusCode: transformErrorToStatusCode(result)
164
+ };
165
+ }
166
+ /**
167
+ * Suspend Transfer Process handler.
168
+ * @param httpRequestContext The request context for the API.
169
+ * @param componentName The name of the component to use.
170
+ * @param request The API request containing headers, path parameters, and body.
171
+ * @returns The response.
172
+ */
173
+ async function suspendTransferHandler(httpRequestContext, componentName, request) {
174
+ Guards.object(ROUTES_SOURCE, "request", request);
175
+ Guards.object(ROUTES_SOURCE, "request.body", request.body);
176
+ const trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);
177
+ const component = ComponentFactory.get(componentName);
178
+ const result = await component.suspendTransfer(request.body, trustPayload);
179
+ return {
180
+ body: result,
181
+ statusCode: transformErrorToStatusCode(result)
182
+ };
183
+ }
184
+ /**
185
+ * Terminate Transfer Process handler.
186
+ * @param httpRequestContext The request context for the API.
187
+ * @param componentName The name of the component to use.
188
+ * @param request The API request containing headers, path parameters, and body.
189
+ * @returns The response.
190
+ */
191
+ async function terminateTransferHandler(httpRequestContext, componentName, request) {
192
+ Guards.object(ROUTES_SOURCE, "request", request);
193
+ Guards.object(ROUTES_SOURCE, "request.body", request.body);
194
+ const trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);
195
+ const component = ComponentFactory.get(componentName);
196
+ const result = await component.terminateTransfer(request.body, trustPayload);
197
+ return {
198
+ body: result,
199
+ statusCode: transformErrorToStatusCode(result)
200
+ };
201
+ }
202
+ //# sourceMappingURL=dataspaceControlPlaneRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataspaceControlPlaneRoutes.js","sourceRoot":"","sources":["../../src/dataspaceControlPlaneRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type {\n\tIHostingComponent,\n\tIHttpRequestContext,\n\tIRestRoute,\n\tITag\n} from \"@twin.org/api-models\";\nimport { ComponentFactory, Guards } from \"@twin.org/core\";\nimport type {\n\tIDataspaceControlPlaneComponent,\n\tIRequestTransferRequest,\n\tIRequestTransferResponse,\n\tIGetTransferProcessRequest,\n\tIGetTransferProcessResponse,\n\tIStartTransferRequest,\n\tIStartTransferResponse,\n\tICompleteTransferRequest,\n\tICompleteTransferResponse,\n\tISuspendTransferRequest,\n\tISuspendTransferResponse,\n\tITerminateTransferRequest,\n\tITerminateTransferResponse\n} from \"@twin.org/dataspace-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { HeaderHelper, HeaderTypes } from \"@twin.org/web\";\nimport { transformErrorToStatusCode } from \"./utils/transferErrorUtils.js\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"dataspaceControlPlaneRoutes\";\n\n/**\n * The tags to associate with the DSP protocol routes.\n */\nexport const tagsDataspaceControlPlane: ITag[] = [\n\t{\n\t\tname: \"Transfer Process\",\n\t\tdescription:\n\t\t\t\"DSP Transfer Process Protocol endpoints for initiating and managing data transfers.\"\n\t}\n];\n\n/**\n * The REST routes for dataspace control plane (DSP Protocol only).\n * These routes implement the Eclipse Dataspace Protocol Transfer Process Protocol.\n *\n * Contract Negotiation is handled internally via PNP callbacks — no REST endpoints needed.\n * PNP registers its own inbound callback routes for negotiation messages from providers.\n *\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 DSP protocol routes.\n */\nexport function generateRestRoutesDataspaceControlPlane(\n\tbaseRouteName: string,\n\tcomponentName: string\n): IRestRoute[] {\n\tconst routes: IRestRoute[] = [];\n\n\t// ============================================================================\n\t// TRANSFER PROCESS PROTOCOL (DSP)\n\t// ============================================================================\n\n\t// POST /transfers/request - Request Transfer Process (DSP)\n\troutes.push({\n\t\toperationId: \"requestTransfer\",\n\t\tsummary: \"Request Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/request`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\trequestTransferHandler(httpRequestContext, componentName, request)\n\t});\n\n\t// GET /transfers/:pid - Get Transfer Process state (DSP)\n\troutes.push({\n\t\toperationId: \"getTransferProcess\",\n\t\tsummary: \"Get Transfer Process state (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/transfers/:pid`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tgetTransferProcessHandler(httpRequestContext, componentName, request)\n\t});\n\n\t// POST /transfers/:pid/start - Start Transfer Process (DSP)\n\troutes.push({\n\t\toperationId: \"startTransfer\",\n\t\tsummary: \"Start Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/:pid/start`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tstartTransferHandler(httpRequestContext, componentName, request)\n\t});\n\n\t// POST /transfers/:pid/complete - Complete Transfer Process (DSP)\n\troutes.push({\n\t\toperationId: \"completeTransfer\",\n\t\tsummary: \"Complete Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/:pid/complete`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tcompleteTransferHandler(httpRequestContext, componentName, request)\n\t});\n\n\t// POST /transfers/:pid/suspend - Suspend Transfer Process (DSP)\n\troutes.push({\n\t\toperationId: \"suspendTransfer\",\n\t\tsummary: \"Suspend Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/:pid/suspend`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tsuspendTransferHandler(httpRequestContext, componentName, request)\n\t});\n\n\t// POST /transfers/:pid/terminate - Terminate Transfer Process (DSP)\n\troutes.push({\n\t\toperationId: \"terminateTransfer\",\n\t\tsummary: \"Terminate Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/:pid/terminate`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tterminateTransferHandler(httpRequestContext, componentName, request)\n\t});\n\n\treturn routes;\n}\n\n// ============================================================================\n// TRANSFER PROCESS PROTOCOL HANDLERS\n// ============================================================================\n\n/**\n * Request Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers and body.\n * @returns The response.\n */\nasync function requestTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IRequestTransferRequest\n): Promise<IRequestTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.requestTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Get Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers and path parameters.\n * @returns The response.\n */\nasync function getTransferProcessHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IGetTransferProcessRequest\n): Promise<IGetTransferProcessResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.pathParams), request.pathParams);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.pid), request.pathParams.pid);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.getTransferProcess(request.pathParams.pid, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Start Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function startTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IStartTransferRequest\n): Promise<IStartTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst hostingComponent = ComponentFactory.get<IHostingComponent>(\n\t\thttpRequestContext.hostingComponentType ?? \"hosting\"\n\t);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.startTransfer(\n\t\trequest.body,\n\t\tawait hostingComponent.getPublicOrigin(httpRequestContext.serverRequest.url),\n\t\ttrustPayload\n\t);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Complete Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function completeTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ICompleteTransferRequest\n): Promise<ICompleteTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.completeTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Suspend Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function suspendTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ISuspendTransferRequest\n): Promise<ISuspendTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.suspendTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Terminate Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function terminateTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITerminateTransferRequest\n): Promise<ITerminateTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.terminateTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n"]}