@twin.org/engine-server 0.0.2-next.9 → 0.0.3-next.2

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.
@@ -0,0 +1,145 @@
1
+ [
2
+ {
3
+ "type": "informationComponent",
4
+ "module": "@twin.org/api-service",
5
+ "method": "generateRestRoutesInformation",
6
+ "defaultPath": ""
7
+ },
8
+ {
9
+ "type": "authenticationComponent",
10
+ "module": "@twin.org/api-auth-entity-storage-service",
11
+ "method": "generateRestRoutesAuthentication",
12
+ "defaultPath": "/authentication"
13
+ },
14
+ {
15
+ "type": "loggingComponent",
16
+ "module": "@twin.org/logging-service",
17
+ "method": "generateRestRoutesLogging",
18
+ "defaultPath": "/logging"
19
+ },
20
+ {
21
+ "type": "telemetryComponent",
22
+ "module": "@twin.org/telemetry-service",
23
+ "method": "generateRestRoutesTelemetry",
24
+ "defaultPath": "/telemetry"
25
+ },
26
+ {
27
+ "type": "blobStorageComponent",
28
+ "module": "@twin.org/blob-storage-service",
29
+ "method": "generateRestRoutesBlobStorage",
30
+ "defaultPath": "/blob"
31
+ },
32
+ {
33
+ "type": "identityComponent",
34
+ "module": "@twin.org/identity-service",
35
+ "method": "generateRestRoutesIdentity",
36
+ "defaultPath": "/identity"
37
+ },
38
+ {
39
+ "type": "identityResolverComponent",
40
+ "module": "@twin.org/identity-service",
41
+ "method": "generateRestRoutesIdentityResolver",
42
+ "defaultPath": "/identity"
43
+ },
44
+ {
45
+ "type": "identityProfileComponent",
46
+ "module": "@twin.org/identity-service",
47
+ "method": "generateRestRoutesIdentityProfile",
48
+ "defaultPath": "/identity/profile"
49
+ },
50
+ {
51
+ "type": "nftComponent",
52
+ "module": "@twin.org/nft-service",
53
+ "method": "generateRestRoutesNft",
54
+ "defaultPath": "/nft"
55
+ },
56
+ {
57
+ "type": "verifiableStorageComponent",
58
+ "module": "@twin.org/verifiable-storage-service",
59
+ "method": "generateRestRoutesVerifiableStorage",
60
+ "defaultPath": "/verifiable"
61
+ },
62
+ {
63
+ "type": "immutableProofComponent",
64
+ "module": "@twin.org/immutable-proof-service",
65
+ "method": "generateRestRoutesImmutableProof",
66
+ "defaultPath": "/immutable-proof"
67
+ },
68
+ {
69
+ "type": "attestationComponent",
70
+ "module": "@twin.org/attestation-service",
71
+ "method": "generateRestRoutesAttestation",
72
+ "defaultPath": "/attestation"
73
+ },
74
+ {
75
+ "type": "auditableItemGraphComponent",
76
+ "module": "@twin.org/auditable-item-graph-service",
77
+ "method": "generateRestRoutesAuditableItemGraph",
78
+ "defaultPath": "/aig"
79
+ },
80
+ {
81
+ "type": "auditableItemStreamComponent",
82
+ "module": "@twin.org/auditable-item-stream-service",
83
+ "method": "generateRestRoutesAuditableItemStream",
84
+ "defaultPath": "/ais"
85
+ },
86
+ {
87
+ "type": "entityStorageComponent",
88
+ "module": "@twin.org/entity-storage-service",
89
+ "method": "generateRestRoutesEntityStorage"
90
+ },
91
+ {
92
+ "type": "dataProcessingComponent",
93
+ "module": "@twin.org/data-processing-service",
94
+ "method": "generateRestRoutesDataProcessing",
95
+ "defaultPath": "/data-processing"
96
+ },
97
+ {
98
+ "type": "documentManagementComponent",
99
+ "module": "@twin.org/document-management-service",
100
+ "method": "generateRestRoutesDocumentManagement",
101
+ "defaultPath": "/documents"
102
+ },
103
+ {
104
+ "type": "rightsManagementPapComponent",
105
+ "module": "@twin.org/rights-management-service",
106
+ "method": "generateRestRoutesPolicyAdministrationPoint",
107
+ "defaultPath": "/rights-management"
108
+ },
109
+ {
110
+ "type": "rightsManagementPnpComponent",
111
+ "module": "@twin.org/rights-management-service",
112
+ "method": "generateRestRoutesPolicyNegotiationPoint",
113
+ "defaultPath": "/rights-management"
114
+ },
115
+ {
116
+ "type": "rightsManagementPnapComponent",
117
+ "module": "@twin.org/rights-management-service",
118
+ "method": "generateRestRoutesPolicyNegotiationAdminPoint",
119
+ "defaultPath": "/rights-management"
120
+ },
121
+ {
122
+ "type": "rightsManagementDapComponent",
123
+ "module": "@twin.org/rights-management-service",
124
+ "method": "generateRestRoutesDataAccessPoint",
125
+ "defaultPath": "/rights-management"
126
+ },
127
+ {
128
+ "type": "synchronisedStorageComponent",
129
+ "module": "@twin.org/synchronised-storage-service",
130
+ "method": "generateRestRoutesSynchronisedStorage",
131
+ "defaultPath": "/synchronised-storage"
132
+ },
133
+ {
134
+ "type": "federatedCatalogueComponent",
135
+ "module": "@twin.org/federated-catalogue-service",
136
+ "method": "generateRestRoutesFederatedCatalogue",
137
+ "defaultPath": "/federated-catalogue"
138
+ },
139
+ {
140
+ "type": "dataSpaceConnectorComponent",
141
+ "module": "@twin.org/data-space-connector-service",
142
+ "method": "generateRestRoutesDataSpaceConnector",
143
+ "defaultPath": "/data-space-connector"
144
+ }
145
+ ]
@@ -0,0 +1,14 @@
1
+ [
2
+ {
3
+ "type": "eventBusComponent",
4
+ "module": "@twin.org/event-bus-service",
5
+ "method": "generateSocketRoutesEventBus",
6
+ "defaultPath": "event-bus"
7
+ },
8
+ {
9
+ "type": "dataSpaceConnectorComponent",
10
+ "module": "@twin.org/data-space-connector-service",
11
+ "method": "generateSocketRoutesDataSpaceConnector",
12
+ "defaultPath": "data-space-connector"
13
+ }
14
+ ]
@@ -0,0 +1,33 @@
1
+ [
2
+ {
3
+ "type": "authenticationAdminComponent",
4
+ "module": "@twin.org/engine-server-types",
5
+ "method": "initialiseAuthenticationAdminComponent"
6
+ },
7
+ {
8
+ "type": "authenticationComponent",
9
+ "module": "@twin.org/engine-server-types",
10
+ "method": "initialiseAuthenticationComponent"
11
+ },
12
+ {
13
+ "type": "informationComponent",
14
+ "module": "@twin.org/engine-server-types",
15
+ "method": "initialiseInformationComponent",
16
+ "defaultRestPath": ""
17
+ },
18
+ {
19
+ "type": "restRouteProcessor",
20
+ "module": "@twin.org/engine-server-types",
21
+ "method": "initialiseRestRouteProcessorComponent"
22
+ },
23
+ {
24
+ "type": "socketRouteProcessor",
25
+ "module": "@twin.org/engine-server-types",
26
+ "method": "initialiseSocketRouteProcessorComponent"
27
+ },
28
+ {
29
+ "type": "mimeTypeProcessor",
30
+ "module": "@twin.org/engine-server-types",
31
+ "method": "initialiseMimeTypeProcessorComponent"
32
+ }
33
+ ]
@@ -0,0 +1,323 @@
1
+ import { MimeTypeProcessorFactory, RestRouteProcessorFactory, SocketRouteProcessorFactory } from "@twin.org/api-models";
2
+ import { FastifyWebServer } from "@twin.org/api-server-fastify";
3
+ import { ContextIdStore } from "@twin.org/context";
4
+ import { Guards, Is, StringHelper } from "@twin.org/core";
5
+ import { RestRouteProcessorType, SocketRouteProcessorType } from "@twin.org/engine-server-types";
6
+ import { ModuleHelper } from "@twin.org/modules";
7
+ import serverRestRouteGenerators from "./data/serverRestRouteGenerators.json" with { type: "json" };
8
+ import serverSocketRouteGenerators from "./data/serverSocketRouteGenerators.json" with { type: "json" };
9
+ import serverTypeInitialisers from "./data/serverTypeInitialisers.json" with { type: "json" };
10
+ /**
11
+ * Server for the engine.
12
+ */
13
+ export class EngineServer {
14
+ /**
15
+ * Runtime name for the class.
16
+ */
17
+ static CLASS_NAME = "EngineServer";
18
+ /**
19
+ * The engine.
20
+ * @internal
21
+ */
22
+ _engineCore;
23
+ /**
24
+ * The REST route generators.
25
+ * @internal
26
+ */
27
+ _restRouteGenerators;
28
+ /**
29
+ * The socket route generators.
30
+ * @internal
31
+ */
32
+ _socketRouteGenerators;
33
+ /**
34
+ * The web server.
35
+ * @internal
36
+ */
37
+ _webServer;
38
+ /**
39
+ * The REST routes for the application.
40
+ * @internal
41
+ */
42
+ _restRoutes;
43
+ /**
44
+ * The Socket routes for the application.
45
+ * @internal
46
+ */
47
+ _socketRoutes;
48
+ /**
49
+ * Create a new instance of EngineServer.
50
+ * @param options The options for the engine.
51
+ * @param options.engineCore The engine core to serve from.
52
+ */
53
+ constructor(options) {
54
+ Guards.object(EngineServer.CLASS_NAME, "options", options);
55
+ Guards.object(EngineServer.CLASS_NAME, "options.engineCore", options.engineCore);
56
+ this._engineCore = options.engineCore;
57
+ this._restRouteGenerators = [];
58
+ this._socketRouteGenerators = [];
59
+ this._restRoutes = [];
60
+ this._socketRoutes = [];
61
+ const coreConfig = this._engineCore.getConfig();
62
+ if (!Is.arrayValue(coreConfig.types.restRouteProcessor)) {
63
+ coreConfig.types.restRouteProcessor = [];
64
+ if (!coreConfig.silent) {
65
+ coreConfig.types.restRouteProcessor.push({
66
+ type: RestRouteProcessorType.Logging,
67
+ options: {
68
+ config: {
69
+ includeBody: coreConfig.debug
70
+ }
71
+ }
72
+ });
73
+ }
74
+ coreConfig.types.restRouteProcessor.push({
75
+ type: RestRouteProcessorType.RestRoute,
76
+ options: {
77
+ config: {
78
+ includeErrorStack: coreConfig.debug
79
+ }
80
+ }
81
+ });
82
+ }
83
+ if (!Is.arrayValue(coreConfig.types.socketRouteProcessor)) {
84
+ coreConfig.types.socketRouteProcessor = [];
85
+ if (!coreConfig.silent) {
86
+ coreConfig.types.socketRouteProcessor.push({
87
+ type: SocketRouteProcessorType.Logging,
88
+ options: {
89
+ config: {
90
+ includeBody: coreConfig.debug
91
+ }
92
+ }
93
+ });
94
+ }
95
+ coreConfig.types.socketRouteProcessor.push({
96
+ type: SocketRouteProcessorType.SocketRoute,
97
+ options: {
98
+ config: {
99
+ includeErrorStack: coreConfig.debug
100
+ }
101
+ }
102
+ });
103
+ }
104
+ this.addServerTypeInitialisers();
105
+ this.addServerRestRouteGenerators();
106
+ this.addServerSocketRouteGenerators();
107
+ }
108
+ /**
109
+ * Add a REST route generator.
110
+ * @param type The type to add the generator for.
111
+ * @param module The module containing the generator.
112
+ * @param method The method to call on the module.
113
+ */
114
+ addRestRouteGenerator(type, module, method) {
115
+ Guards.stringValue(EngineServer.CLASS_NAME, "type", type);
116
+ Guards.stringValue(EngineServer.CLASS_NAME, "module", module);
117
+ Guards.stringValue(EngineServer.CLASS_NAME, "method", method);
118
+ const currentIndex = this._restRouteGenerators.findIndex(r => r.type === type);
119
+ if (currentIndex >= 0) {
120
+ this._restRouteGenerators[currentIndex].module = module;
121
+ this._restRouteGenerators[currentIndex].method = method;
122
+ }
123
+ else {
124
+ this._restRouteGenerators.push({
125
+ type,
126
+ module,
127
+ method
128
+ });
129
+ }
130
+ }
131
+ /**
132
+ * Add a socket route generator.
133
+ * @param type The type to add the generator for.
134
+ * @param module The module containing the generator.
135
+ * @param method The method to call on the module.
136
+ */
137
+ addSocketRouteGenerator(type, module, method) {
138
+ Guards.stringValue(EngineServer.CLASS_NAME, "type", type);
139
+ Guards.stringValue(EngineServer.CLASS_NAME, "module", module);
140
+ Guards.stringValue(EngineServer.CLASS_NAME, "method", method);
141
+ const currentIndex = this._socketRouteGenerators.findIndex(s => s.type === type);
142
+ if (currentIndex >= 0) {
143
+ this._socketRouteGenerators[currentIndex].module = module;
144
+ this._socketRouteGenerators[currentIndex].method = method;
145
+ }
146
+ else {
147
+ this._socketRouteGenerators.push({
148
+ type,
149
+ module,
150
+ method
151
+ });
152
+ }
153
+ }
154
+ /**
155
+ * Get the built REST routes.
156
+ * @returns The REST routes.
157
+ */
158
+ getRestRoutes() {
159
+ return this._restRoutes;
160
+ }
161
+ /**
162
+ * Get the built socket routes.
163
+ * @returns The socket routes.
164
+ */
165
+ getSocketRoutes() {
166
+ return this._socketRoutes;
167
+ }
168
+ /**
169
+ * Start the engine server.
170
+ * @returns True if the start was successful.
171
+ */
172
+ async start() {
173
+ const canContinue = await this._engineCore.start();
174
+ if (canContinue) {
175
+ await ContextIdStore.run(this._engineCore.getContextIds() ?? {}, async () => {
176
+ await this.startWebServer();
177
+ });
178
+ }
179
+ return canContinue;
180
+ }
181
+ /**
182
+ * Stop the engine server.
183
+ * @returns Nothing.
184
+ */
185
+ async stop() {
186
+ await ContextIdStore.run(this._engineCore.getContextIds() ?? {}, async () => {
187
+ if (this._webServer) {
188
+ await this._webServer.stop();
189
+ this._webServer = undefined;
190
+ }
191
+ });
192
+ await this._engineCore.stop();
193
+ }
194
+ /**
195
+ * Starts the web server.
196
+ * @internal
197
+ */
198
+ async startWebServer() {
199
+ this._restRoutes = await this.buildRestRoutes();
200
+ this._socketRoutes = await this.buildSocketRoutes();
201
+ const restRouteProcessors = RestRouteProcessorFactory.names().map(n => RestRouteProcessorFactory.get(n));
202
+ const socketRouteProcessors = SocketRouteProcessorFactory.names().map(n => SocketRouteProcessorFactory.get(n));
203
+ const mimeTypeProcessors = MimeTypeProcessorFactory.names().map(n => MimeTypeProcessorFactory.get(n));
204
+ const coreConfig = this._engineCore.getConfig();
205
+ const loggingComponentType = coreConfig.silent
206
+ ? undefined
207
+ : this._engineCore.getRegisteredInstanceType("loggingComponent");
208
+ this._webServer = new FastifyWebServer({
209
+ loggingComponentType,
210
+ mimeTypeProcessors
211
+ });
212
+ await this._webServer.build(restRouteProcessors, this._restRoutes, socketRouteProcessors, this._socketRoutes, coreConfig.web);
213
+ await this._webServer.start();
214
+ }
215
+ /**
216
+ * The REST routes for the application.
217
+ * @returns The REST routes for the application.
218
+ * @internal
219
+ */
220
+ async buildRestRoutes() {
221
+ const routes = [];
222
+ for (const { type, module, method } of this._restRouteGenerators) {
223
+ await this.initialiseRestTypeRoute(routes, type, module, method);
224
+ }
225
+ return routes;
226
+ }
227
+ /**
228
+ * The socket routes for the application.
229
+ * @returns The socket routes for the application.
230
+ * @internal
231
+ */
232
+ async buildSocketRoutes() {
233
+ const routes = [];
234
+ for (const { type, module, method } of this._socketRouteGenerators) {
235
+ await this.initialiseSocketTypeRoute(routes, type, module, method);
236
+ }
237
+ return routes;
238
+ }
239
+ /**
240
+ * Initialise the rest routes from connector.
241
+ * @param routes The routes to add to.
242
+ * @param typeKey The key for the default types.
243
+ * @param generateRoutes The function to generate the routes.
244
+ * @internal
245
+ */
246
+ async initialiseRestTypeRoute(routes, typeKey, module, method) {
247
+ const typeConfig = this._engineCore.getTypeConfig(typeKey);
248
+ if (Is.arrayValue(typeConfig)) {
249
+ const generateRoutes = await ModuleHelper.getModuleEntry(module, method);
250
+ for (let i = 0; i < typeConfig.length; i++) {
251
+ const restPath = typeConfig[i].restPath;
252
+ const restOptions = typeConfig[i].restOptions;
253
+ if (Is.string(restPath)) {
254
+ const serviceType = typeConfig[i].overrideInstanceType ??
255
+ this._engineCore.getRegisteredInstanceType(typeKey);
256
+ if (Is.stringValue(serviceType)) {
257
+ const generatedRoutes = generateRoutes(restPath, serviceType, restOptions);
258
+ for (const route of generatedRoutes) {
259
+ // Don't strip trailing slashes from the root path.
260
+ if (Is.stringValue(route.path) && route.path.length > 1) {
261
+ route.path = StringHelper.trimTrailingSlashes(route.path);
262
+ }
263
+ }
264
+ routes.push(...generatedRoutes);
265
+ }
266
+ }
267
+ }
268
+ }
269
+ }
270
+ /**
271
+ * Initialise the socket routes from connector.
272
+ * @param routes The routes to add to.
273
+ * @param typeKey The key for the default types.
274
+ * @param module The module containing the generator.
275
+ * @param method The method to call on the module.
276
+ * @internal
277
+ */
278
+ async initialiseSocketTypeRoute(routes, typeKey, module, method) {
279
+ const typeConfig = this._engineCore.getTypeConfig(typeKey);
280
+ if (Is.arrayValue(typeConfig)) {
281
+ const generateRoutes = await ModuleHelper.getModuleEntry(module, method);
282
+ for (let i = 0; i < typeConfig.length; i++) {
283
+ const socketPath = typeConfig[i].socketPath;
284
+ const socketOptions = typeConfig[i].socketOptions;
285
+ if (Is.string(socketPath)) {
286
+ const serviceType = typeConfig[i].overrideInstanceType ??
287
+ this._engineCore.getRegisteredInstanceType(typeKey);
288
+ if (Is.stringValue(serviceType)) {
289
+ routes.push(...generateRoutes(socketPath, serviceType, socketOptions));
290
+ }
291
+ }
292
+ }
293
+ }
294
+ }
295
+ /**
296
+ * Add the server type initializers.
297
+ * @internal
298
+ */
299
+ addServerTypeInitialisers() {
300
+ for (const initializer of serverTypeInitialisers) {
301
+ this._engineCore.addTypeInitialiser(initializer.type, initializer.module, initializer.method);
302
+ }
303
+ }
304
+ /**
305
+ * Add the server REST route generators.
306
+ * @internal
307
+ */
308
+ addServerRestRouteGenerators() {
309
+ for (const generator of serverRestRouteGenerators) {
310
+ this.addRestRouteGenerator(generator.type, generator.module, generator.method);
311
+ }
312
+ }
313
+ /**
314
+ * Add the server socket route generators.
315
+ * @internal
316
+ */
317
+ addServerSocketRouteGenerators() {
318
+ for (const generator of serverSocketRouteGenerators) {
319
+ this.addSocketRouteGenerator(generator.type, generator.module, generator.method);
320
+ }
321
+ }
322
+ }
323
+ //# sourceMappingURL=engineServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineServer.js","sourceRoot":"","sources":["../../src/engineServer.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IRestRoute, ISocketRoute, IWebServer } from \"@twin.org/api-models\";\nimport {\n\tMimeTypeProcessorFactory,\n\tRestRouteProcessorFactory,\n\tSocketRouteProcessorFactory\n} from \"@twin.org/api-models\";\nimport { FastifyWebServer } from \"@twin.org/api-server-fastify\";\nimport { ContextIdStore } from \"@twin.org/context\";\nimport { Guards, Is, StringHelper } from \"@twin.org/core\";\nimport type { IEngineCore, IEngineCoreTypeConfig, IEngineServer } from \"@twin.org/engine-models\";\nimport {\n\tRestRouteProcessorType,\n\tSocketRouteProcessorType,\n\ttype IEngineServerConfig\n} from \"@twin.org/engine-server-types\";\nimport { ModuleHelper } from \"@twin.org/modules\";\nimport { nameof } from \"@twin.org/nameof\";\nimport serverRestRouteGenerators from \"./data/serverRestRouteGenerators.json\" with { type: \"json\" };\nimport serverSocketRouteGenerators from \"./data/serverSocketRouteGenerators.json\" with { type: \"json\" };\nimport serverTypeInitialisers from \"./data/serverTypeInitialisers.json\" with { type: \"json\" };\n\n/**\n * Server for the engine.\n */\nexport class EngineServer<T extends IEngineServerConfig = IEngineServerConfig>\n\timplements IEngineServer\n{\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<EngineServer>();\n\n\t/**\n\t * The engine.\n\t * @internal\n\t */\n\tprivate readonly _engineCore: IEngineCore<T>;\n\n\t/**\n\t * The REST route generators.\n\t * @internal\n\t */\n\tprivate readonly _restRouteGenerators: {\n\t\ttype: string;\n\t\tmodule: string;\n\t\tmethod: string;\n\t}[];\n\n\t/**\n\t * The socket route generators.\n\t * @internal\n\t */\n\tprivate readonly _socketRouteGenerators: {\n\t\ttype: string;\n\t\tmodule: string;\n\t\tmethod: string;\n\t}[];\n\n\t/**\n\t * The web server.\n\t * @internal\n\t */\n\tprivate _webServer?: IWebServer<unknown>;\n\n\t/**\n\t * The REST routes for the application.\n\t * @internal\n\t */\n\tprivate _restRoutes: IRestRoute[];\n\n\t/**\n\t * The Socket routes for the application.\n\t * @internal\n\t */\n\tprivate _socketRoutes: ISocketRoute[];\n\n\t/**\n\t * Create a new instance of EngineServer.\n\t * @param options The options for the engine.\n\t * @param options.engineCore The engine core to serve from.\n\t */\n\tconstructor(options: { engineCore: IEngineCore<T> }) {\n\t\tGuards.object(EngineServer.CLASS_NAME, nameof(options), options);\n\t\tGuards.object(EngineServer.CLASS_NAME, nameof(options.engineCore), options.engineCore);\n\n\t\tthis._engineCore = options.engineCore;\n\t\tthis._restRouteGenerators = [];\n\t\tthis._socketRouteGenerators = [];\n\t\tthis._restRoutes = [];\n\t\tthis._socketRoutes = [];\n\n\t\tconst coreConfig = this._engineCore.getConfig();\n\n\t\tif (!Is.arrayValue(coreConfig.types.restRouteProcessor)) {\n\t\t\tcoreConfig.types.restRouteProcessor = [];\n\n\t\t\tif (!coreConfig.silent) {\n\t\t\t\tcoreConfig.types.restRouteProcessor.push({\n\t\t\t\t\ttype: RestRouteProcessorType.Logging,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tincludeBody: coreConfig.debug\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\tcoreConfig.types.restRouteProcessor.push({\n\t\t\t\ttype: RestRouteProcessorType.RestRoute,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tincludeErrorStack: coreConfig.debug\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (!Is.arrayValue(coreConfig.types.socketRouteProcessor)) {\n\t\t\tcoreConfig.types.socketRouteProcessor = [];\n\n\t\t\tif (!coreConfig.silent) {\n\t\t\t\tcoreConfig.types.socketRouteProcessor.push({\n\t\t\t\t\ttype: SocketRouteProcessorType.Logging,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tincludeBody: coreConfig.debug\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\tcoreConfig.types.socketRouteProcessor.push({\n\t\t\t\ttype: SocketRouteProcessorType.SocketRoute,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tincludeErrorStack: coreConfig.debug\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.addServerTypeInitialisers();\n\t\tthis.addServerRestRouteGenerators();\n\t\tthis.addServerSocketRouteGenerators();\n\t}\n\n\t/**\n\t * Add a REST route generator.\n\t * @param type The type to add the generator for.\n\t * @param module The module containing the generator.\n\t * @param method The method to call on the module.\n\t */\n\tpublic addRestRouteGenerator(type: string, module: string, method: string): void {\n\t\tGuards.stringValue(EngineServer.CLASS_NAME, nameof(type), type);\n\t\tGuards.stringValue(EngineServer.CLASS_NAME, nameof(module), module);\n\t\tGuards.stringValue(EngineServer.CLASS_NAME, nameof(method), method);\n\n\t\tconst currentIndex = this._restRouteGenerators.findIndex(r => r.type === type);\n\t\tif (currentIndex >= 0) {\n\t\t\tthis._restRouteGenerators[currentIndex].module = module;\n\t\t\tthis._restRouteGenerators[currentIndex].method = method;\n\t\t} else {\n\t\t\tthis._restRouteGenerators.push({\n\t\t\t\ttype,\n\t\t\t\tmodule,\n\t\t\t\tmethod\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Add a socket route generator.\n\t * @param type The type to add the generator for.\n\t * @param module The module containing the generator.\n\t * @param method The method to call on the module.\n\t */\n\tpublic addSocketRouteGenerator(type: string, module: string, method: string): void {\n\t\tGuards.stringValue(EngineServer.CLASS_NAME, nameof(type), type);\n\t\tGuards.stringValue(EngineServer.CLASS_NAME, nameof(module), module);\n\t\tGuards.stringValue(EngineServer.CLASS_NAME, nameof(method), method);\n\n\t\tconst currentIndex = this._socketRouteGenerators.findIndex(s => s.type === type);\n\t\tif (currentIndex >= 0) {\n\t\t\tthis._socketRouteGenerators[currentIndex].module = module;\n\t\t\tthis._socketRouteGenerators[currentIndex].method = method;\n\t\t} else {\n\t\t\tthis._socketRouteGenerators.push({\n\t\t\t\ttype,\n\t\t\t\tmodule,\n\t\t\t\tmethod\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Get the built REST routes.\n\t * @returns The REST routes.\n\t */\n\tpublic getRestRoutes(): IRestRoute[] {\n\t\treturn this._restRoutes;\n\t}\n\n\t/**\n\t * Get the built socket routes.\n\t * @returns The socket routes.\n\t */\n\tpublic getSocketRoutes(): ISocketRoute[] {\n\t\treturn this._socketRoutes;\n\t}\n\n\t/**\n\t * Start the engine server.\n\t * @returns True if the start was successful.\n\t */\n\tpublic async start(): Promise<boolean> {\n\t\tconst canContinue = await this._engineCore.start();\n\n\t\tif (canContinue) {\n\t\t\tawait ContextIdStore.run(this._engineCore.getContextIds() ?? {}, async () => {\n\t\t\t\tawait this.startWebServer();\n\t\t\t});\n\t\t}\n\n\t\treturn canContinue;\n\t}\n\n\t/**\n\t * Stop the engine server.\n\t * @returns Nothing.\n\t */\n\tpublic async stop(): Promise<void> {\n\t\tawait ContextIdStore.run(this._engineCore.getContextIds() ?? {}, async () => {\n\t\t\tif (this._webServer) {\n\t\t\t\tawait this._webServer.stop();\n\t\t\t\tthis._webServer = undefined;\n\t\t\t}\n\t\t});\n\n\t\tawait this._engineCore.stop();\n\t}\n\n\t/**\n\t * Starts the web server.\n\t * @internal\n\t */\n\tprivate async startWebServer(): Promise<void> {\n\t\tthis._restRoutes = await this.buildRestRoutes();\n\t\tthis._socketRoutes = await this.buildSocketRoutes();\n\t\tconst restRouteProcessors = RestRouteProcessorFactory.names().map(n =>\n\t\t\tRestRouteProcessorFactory.get(n)\n\t\t);\n\t\tconst socketRouteProcessors = SocketRouteProcessorFactory.names().map(n =>\n\t\t\tSocketRouteProcessorFactory.get(n)\n\t\t);\n\t\tconst mimeTypeProcessors = MimeTypeProcessorFactory.names().map(n =>\n\t\t\tMimeTypeProcessorFactory.get(n)\n\t\t);\n\n\t\tconst coreConfig = this._engineCore.getConfig();\n\t\tconst loggingComponentType = coreConfig.silent\n\t\t\t? undefined\n\t\t\t: this._engineCore.getRegisteredInstanceType(\"loggingComponent\");\n\n\t\tthis._webServer = new FastifyWebServer({\n\t\t\tloggingComponentType,\n\t\t\tmimeTypeProcessors\n\t\t});\n\n\t\tawait this._webServer.build(\n\t\t\trestRouteProcessors,\n\t\t\tthis._restRoutes,\n\t\t\tsocketRouteProcessors,\n\t\t\tthis._socketRoutes,\n\t\t\tcoreConfig.web\n\t\t);\n\t\tawait this._webServer.start();\n\t}\n\n\t/**\n\t * The REST routes for the application.\n\t * @returns The REST routes for the application.\n\t * @internal\n\t */\n\tprivate async buildRestRoutes(): Promise<IRestRoute[]> {\n\t\tconst routes: IRestRoute[] = [];\n\n\t\tfor (const { type, module, method } of this._restRouteGenerators) {\n\t\t\tawait this.initialiseRestTypeRoute(routes, type, module, method);\n\t\t}\n\n\t\treturn routes;\n\t}\n\n\t/**\n\t * The socket routes for the application.\n\t * @returns The socket routes for the application.\n\t * @internal\n\t */\n\tprivate async buildSocketRoutes(): Promise<ISocketRoute[]> {\n\t\tconst routes: ISocketRoute[] = [];\n\n\t\tfor (const { type, module, method } of this._socketRouteGenerators) {\n\t\t\tawait this.initialiseSocketTypeRoute(routes, type, module, method);\n\t\t}\n\n\t\treturn routes;\n\t}\n\n\t/**\n\t * Initialise the rest routes from connector.\n\t * @param routes The routes to add to.\n\t * @param typeKey The key for the default types.\n\t * @param generateRoutes The function to generate the routes.\n\t * @internal\n\t */\n\tprivate async initialiseRestTypeRoute(\n\t\troutes: IRestRoute[],\n\t\ttypeKey: string,\n\t\tmodule: string,\n\t\tmethod: string\n\t): Promise<void> {\n\t\tconst typeConfig: IEngineCoreTypeConfig[] | undefined = this._engineCore.getTypeConfig(typeKey);\n\n\t\tif (Is.arrayValue(typeConfig)) {\n\t\t\tconst generateRoutes = await ModuleHelper.getModuleEntry<\n\t\t\t\t(baseRouteName: string, componentName: string, options?: unknown) => IRestRoute[]\n\t\t\t>(module, method);\n\n\t\t\tfor (let i = 0; i < typeConfig.length; i++) {\n\t\t\t\tconst restPath = typeConfig[i].restPath;\n\t\t\t\tconst restOptions = typeConfig[i].restOptions;\n\n\t\t\t\tif (Is.string(restPath)) {\n\t\t\t\t\tconst serviceType =\n\t\t\t\t\t\ttypeConfig[i].overrideInstanceType ??\n\t\t\t\t\t\tthis._engineCore.getRegisteredInstanceType(typeKey);\n\t\t\t\t\tif (Is.stringValue(serviceType)) {\n\t\t\t\t\t\tconst generatedRoutes = generateRoutes(restPath, serviceType, restOptions);\n\t\t\t\t\t\tfor (const route of generatedRoutes) {\n\t\t\t\t\t\t\t// Don't strip trailing slashes from the root path.\n\t\t\t\t\t\t\tif (Is.stringValue(route.path) && route.path.length > 1) {\n\t\t\t\t\t\t\t\troute.path = StringHelper.trimTrailingSlashes(route.path);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\troutes.push(...generatedRoutes);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Initialise the socket routes from connector.\n\t * @param routes The routes to add to.\n\t * @param typeKey The key for the default types.\n\t * @param module The module containing the generator.\n\t * @param method The method to call on the module.\n\t * @internal\n\t */\n\tprivate async initialiseSocketTypeRoute(\n\t\troutes: ISocketRoute[],\n\t\ttypeKey: string,\n\t\tmodule: string,\n\t\tmethod: string\n\t): Promise<void> {\n\t\tconst typeConfig: IEngineCoreTypeConfig[] | undefined = this._engineCore.getTypeConfig(typeKey);\n\n\t\tif (Is.arrayValue(typeConfig)) {\n\t\t\tconst generateRoutes = await ModuleHelper.getModuleEntry<\n\t\t\t\t(baseRouteName: string, componentName: string, options?: unknown) => ISocketRoute[]\n\t\t\t>(module, method);\n\n\t\t\tfor (let i = 0; i < typeConfig.length; i++) {\n\t\t\t\tconst socketPath = typeConfig[i].socketPath;\n\t\t\t\tconst socketOptions = typeConfig[i].socketOptions;\n\t\t\t\tif (Is.string(socketPath)) {\n\t\t\t\t\tconst serviceType =\n\t\t\t\t\t\ttypeConfig[i].overrideInstanceType ??\n\t\t\t\t\t\tthis._engineCore.getRegisteredInstanceType(typeKey);\n\t\t\t\t\tif (Is.stringValue(serviceType)) {\n\t\t\t\t\t\troutes.push(...generateRoutes(socketPath, serviceType, socketOptions));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add the server type initializers.\n\t * @internal\n\t */\n\tprivate addServerTypeInitialisers(): void {\n\t\tfor (const initializer of serverTypeInitialisers) {\n\t\t\tthis._engineCore.addTypeInitialiser(initializer.type, initializer.module, initializer.method);\n\t\t}\n\t}\n\n\t/**\n\t * Add the server REST route generators.\n\t * @internal\n\t */\n\tprivate addServerRestRouteGenerators(): void {\n\t\tfor (const generator of serverRestRouteGenerators) {\n\t\t\tthis.addRestRouteGenerator(generator.type, generator.module, generator.method);\n\t\t}\n\t}\n\n\t/**\n\t * Add the server socket route generators.\n\t * @internal\n\t */\n\tprivate addServerSocketRouteGenerators(): void {\n\t\tfor (const generator of serverSocketRouteGenerators) {\n\t\t\tthis.addSocketRouteGenerator(generator.type, generator.module, generator.method);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,5 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ export * from "./engineServer.js";
4
+ export * from "./utils/engineServerConfigHelper.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qCAAqC,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nexport * from \"./engineServer.js\";\nexport * from \"./utils/engineServerConfigHelper.js\";\n"]}
@@ -0,0 +1,34 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import { Is } from "@twin.org/core";
4
+ import serverRestRouteGenerators from "../data/serverRestRouteGenerators.json" with { type: "json" };
5
+ import serverSocketRouteGenerators from "../data/serverSocketRouteGenerators.json" with { type: "json" };
6
+ /**
7
+ * Adds the rest paths to the server config if not already set.
8
+ * @param serverConfig The server config.
9
+ */
10
+ export function addDefaultRestPaths(serverConfig) {
11
+ for (const routeGenerator of serverRestRouteGenerators) {
12
+ const types = serverConfig.types[routeGenerator.type];
13
+ if (Is.arrayValue(types) &&
14
+ !Is.stringValue(types[0].restPath) &&
15
+ Is.string(routeGenerator.defaultPath)) {
16
+ types[0].restPath = routeGenerator.defaultPath;
17
+ }
18
+ }
19
+ }
20
+ /**
21
+ * Adds the socket paths to the server config.
22
+ * @param serverConfig The server config.
23
+ */
24
+ export function addDefaultSocketPaths(serverConfig) {
25
+ for (const routeGenerator of serverSocketRouteGenerators) {
26
+ const types = serverConfig.types[routeGenerator.type];
27
+ if (Is.arrayValue(types) &&
28
+ !Is.stringValue(types[0].socketPath) &&
29
+ Is.stringValue(routeGenerator.defaultPath)) {
30
+ types[0].socketPath = routeGenerator.defaultPath;
31
+ }
32
+ }
33
+ }
34
+ //# sourceMappingURL=engineServerConfigHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineServerConfigHelper.js","sourceRoot":"","sources":["../../../src/utils/engineServerConfigHelper.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC,OAAO,yBAAyB,MAAM,wCAAwC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrG,OAAO,2BAA2B,MAAM,0CAA0C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEzG;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAiC;IACpE,KAAK,MAAM,cAAc,IAAI,yBAAyB,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAEtD,IACC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;YACpB,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAClC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,EACpC,CAAC;YACF,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC;QAChD,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAAiC;IACtE,KAAK,MAAM,cAAc,IAAI,2BAA2B,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAEtD,IACC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;YACpB,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YACpC,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,EACzC,CAAC;YACF,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC;QAClD,CAAC;IACF,CAAC;AACF,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is } from \"@twin.org/core\";\nimport type { IEngineServerConfig } from \"@twin.org/engine-server-types\";\nimport serverRestRouteGenerators from \"../data/serverRestRouteGenerators.json\" with { type: \"json\" };\nimport serverSocketRouteGenerators from \"../data/serverSocketRouteGenerators.json\" with { type: \"json\" };\n\n/**\n * Adds the rest paths to the server config if not already set.\n * @param serverConfig The server config.\n */\nexport function addDefaultRestPaths(serverConfig: IEngineServerConfig): void {\n\tfor (const routeGenerator of serverRestRouteGenerators) {\n\t\tconst types = serverConfig.types[routeGenerator.type];\n\n\t\tif (\n\t\t\tIs.arrayValue(types) &&\n\t\t\t!Is.stringValue(types[0].restPath) &&\n\t\t\tIs.string(routeGenerator.defaultPath)\n\t\t) {\n\t\t\ttypes[0].restPath = routeGenerator.defaultPath;\n\t\t}\n\t}\n}\n\n/**\n * Adds the socket paths to the server config.\n * @param serverConfig The server config.\n */\nexport function addDefaultSocketPaths(serverConfig: IEngineServerConfig): void {\n\tfor (const routeGenerator of serverSocketRouteGenerators) {\n\t\tconst types = serverConfig.types[routeGenerator.type];\n\n\t\tif (\n\t\t\tIs.arrayValue(types) &&\n\t\t\t!Is.stringValue(types[0].socketPath) &&\n\t\t\tIs.stringValue(routeGenerator.defaultPath)\n\t\t) {\n\t\t\ttypes[0].socketPath = routeGenerator.defaultPath;\n\t\t}\n\t}\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { IRestRoute, ISocketRoute } from "@twin.org/api-models";
2
- import type { IEngineCore, IEngineCoreTypeConfig, IEngineServer } from "@twin.org/engine-models";
2
+ import type { IEngineCore, IEngineServer } from "@twin.org/engine-models";
3
3
  import { type IEngineServerConfig } from "@twin.org/engine-server-types";
4
4
  /**
5
5
  * Server for the engine.
@@ -8,7 +8,7 @@ export declare class EngineServer<T extends IEngineServerConfig = IEngineServerC
8
8
  /**
9
9
  * Runtime name for the class.
10
10
  */
11
- readonly CLASS_NAME: string;
11
+ static readonly CLASS_NAME: string;
12
12
  /**
13
13
  * Create a new instance of EngineServer.
14
14
  * @param options The options for the engine.
@@ -20,19 +20,17 @@ export declare class EngineServer<T extends IEngineServerConfig = IEngineServerC
20
20
  /**
21
21
  * Add a REST route generator.
22
22
  * @param type The type to add the generator for.
23
- * @param typeConfig The type config.
24
23
  * @param module The module containing the generator.
25
24
  * @param method The method to call on the module.
26
25
  */
27
- addRestRouteGenerator(type: string, typeConfig: IEngineCoreTypeConfig[] | undefined, module: string, method: string): void;
26
+ addRestRouteGenerator(type: string, module: string, method: string): void;
28
27
  /**
29
28
  * Add a socket route generator.
30
29
  * @param type The type to add the generator for.
31
- * @param typeConfig The type config.
32
30
  * @param module The module containing the generator.
33
31
  * @param method The method to call on the module.
34
32
  */
35
- addSocketRouteGenerator(type: string, typeConfig: IEngineCoreTypeConfig[] | undefined, module: string, method: string): void;
33
+ addSocketRouteGenerator(type: string, module: string, method: string): void;
36
34
  /**
37
35
  * Get the built REST routes.
38
36
  * @returns The REST routes.
@@ -1,2 +1,2 @@
1
- export * from "./engineServer";
2
- export * from "./utils/engineServerConfigHelper";
1
+ export * from "./engineServer.js";
2
+ export * from "./utils/engineServerConfigHelper.js";