@navios/core 0.1.0
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/LICENSE +7 -0
- package/README.md +145 -0
- package/dist/index.d.mts +425 -0
- package/dist/index.d.ts +425 -0
- package/dist/index.js +1744 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1657 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +45 -0
- package/src/__tests__/controller.spec.mts +59 -0
- package/src/attribute.factory.mts +155 -0
- package/src/decorators/controller.decorator.mts +36 -0
- package/src/decorators/endpoint.decorator.mts +81 -0
- package/src/decorators/index.mts +4 -0
- package/src/decorators/module.decorator.mts +47 -0
- package/src/decorators/use-guards.decorator.mts +43 -0
- package/src/exceptions/bad-request.exception.mts +7 -0
- package/src/exceptions/conflict.exception.mts +7 -0
- package/src/exceptions/forbidden.exception.mts +7 -0
- package/src/exceptions/http.exception.mts +7 -0
- package/src/exceptions/index.mts +7 -0
- package/src/exceptions/internal-server-error.exception.mts +7 -0
- package/src/exceptions/not-found.exception.mts +10 -0
- package/src/exceptions/unauthorized.exception.mts +7 -0
- package/src/index.mts +10 -0
- package/src/interfaces/can-activate.mts +5 -0
- package/src/interfaces/index.mts +2 -0
- package/src/interfaces/navios-module.mts +3 -0
- package/src/metadata/controller.metadata.mts +71 -0
- package/src/metadata/endpoint.metadata.mts +69 -0
- package/src/metadata/index.mts +4 -0
- package/src/metadata/injectable.metadata.mts +11 -0
- package/src/metadata/module.metadata.mts +62 -0
- package/src/navios.application.mts +113 -0
- package/src/navios.factory.mts +17 -0
- package/src/service-locator/__tests__/injectable.spec.mts +170 -0
- package/src/service-locator/decorators/get-injectable-token.mts +23 -0
- package/src/service-locator/decorators/index.mts +2 -0
- package/src/service-locator/decorators/injectable.decorator.mts +103 -0
- package/src/service-locator/enums/index.mts +1 -0
- package/src/service-locator/enums/injectable-scope.enum.mts +10 -0
- package/src/service-locator/errors/errors.enum.mts +7 -0
- package/src/service-locator/errors/factory-not-found.mts +8 -0
- package/src/service-locator/errors/index.mts +6 -0
- package/src/service-locator/errors/instance-destroying.mts +8 -0
- package/src/service-locator/errors/instance-expired.mts +8 -0
- package/src/service-locator/errors/instance-not-found.mts +8 -0
- package/src/service-locator/errors/unknown-error.mts +15 -0
- package/src/service-locator/event-emitter.mts +107 -0
- package/src/service-locator/index.mts +14 -0
- package/src/service-locator/inject.mts +37 -0
- package/src/service-locator/injection-token.mts +36 -0
- package/src/service-locator/injector.mts +18 -0
- package/src/service-locator/interfaces/factory.interface.mts +3 -0
- package/src/service-locator/override.mts +22 -0
- package/src/service-locator/proxy-service-locator.mts +80 -0
- package/src/service-locator/service-locator-abstract-factory-context.mts +23 -0
- package/src/service-locator/service-locator-event-bus.mts +96 -0
- package/src/service-locator/service-locator-instance-holder.mts +63 -0
- package/src/service-locator/service-locator-manager.mts +89 -0
- package/src/service-locator/service-locator.mts +445 -0
- package/src/service-locator/sync-injector.mts +55 -0
- package/src/services/controller-adapter.service.mts +124 -0
- package/src/services/execution-context.mts +53 -0
- package/src/services/guard-runner.service.mts +93 -0
- package/src/services/index.mts +4 -0
- package/src/services/module-loader.service.mts +68 -0
- package/src/tokens/application.token.mts +9 -0
- package/src/tokens/execution-context.token.mts +8 -0
- package/src/tokens/index.mts +4 -0
- package/src/tokens/reply.token.mts +7 -0
- package/src/tokens/request.token.mts +9 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,1744 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __knownSymbol = (name2, symbol) => (symbol = Symbol[name2]) ? symbol : Symbol.for("Symbol." + name2);
|
|
9
|
+
var __typeError = (msg) => {
|
|
10
|
+
throw TypeError(msg);
|
|
11
|
+
};
|
|
12
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
13
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name2 in all)
|
|
16
|
+
__defProp(target, name2, { get: all[name2], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
27
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
28
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
29
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
30
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
31
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
32
|
+
mod
|
|
33
|
+
));
|
|
34
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
35
|
+
var __decoratorStart = (base) => [, , , __create((base == null ? void 0 : base[__knownSymbol("metadata")]) ?? null)];
|
|
36
|
+
var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
37
|
+
var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
|
|
38
|
+
var __decoratorContext = (kind, name2, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name: name2, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
|
|
39
|
+
var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
|
|
40
|
+
var __runInitializers = (array, flags, self, value) => {
|
|
41
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
|
|
42
|
+
return value;
|
|
43
|
+
};
|
|
44
|
+
var __decorateElement = (array, flags, name2, decorators, target, extra) => {
|
|
45
|
+
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
|
|
46
|
+
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
|
|
47
|
+
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
|
|
48
|
+
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name2]() {
|
|
49
|
+
return __privateGet(this, extra);
|
|
50
|
+
}, set [name2](x) {
|
|
51
|
+
return __privateSet(this, extra, x);
|
|
52
|
+
} }, name2));
|
|
53
|
+
k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name2) : __name(target, name2);
|
|
54
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
55
|
+
ctx = __decoratorContext(k, name2, done = {}, array[3], extraInitializers);
|
|
56
|
+
if (k) {
|
|
57
|
+
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name2 in x };
|
|
58
|
+
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name2];
|
|
59
|
+
if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name2] = y;
|
|
60
|
+
}
|
|
61
|
+
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
|
|
62
|
+
if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
|
|
63
|
+
else if (typeof it !== "object" || it === null) __typeError("Object expected");
|
|
64
|
+
else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
|
|
65
|
+
}
|
|
66
|
+
return k || __decoratorMetadata(array, target), desc && __defProp(target, name2, desc), p ? k ^ 4 ? extra : desc : target;
|
|
67
|
+
};
|
|
68
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
69
|
+
var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
|
|
70
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
71
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
72
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
73
|
+
|
|
74
|
+
// packages/core/src/index.mts
|
|
75
|
+
var src_exports = {};
|
|
76
|
+
__export(src_exports, {
|
|
77
|
+
Application: () => Application,
|
|
78
|
+
AttributeFactory: () => AttributeFactory,
|
|
79
|
+
BadRequestException: () => BadRequestException,
|
|
80
|
+
ConflictException: () => ConflictException,
|
|
81
|
+
Controller: () => Controller,
|
|
82
|
+
ControllerAdapterService: () => ControllerAdapterService,
|
|
83
|
+
ControllerMetadataKey: () => ControllerMetadataKey,
|
|
84
|
+
Endpoint: () => Endpoint,
|
|
85
|
+
EndpointMetadataKey: () => EndpointMetadataKey,
|
|
86
|
+
ErrorsEnum: () => ErrorsEnum,
|
|
87
|
+
EventEmitter: () => EventEmitter,
|
|
88
|
+
ExecutionContext: () => ExecutionContext2,
|
|
89
|
+
ExecutionContextInjectionToken: () => ExecutionContextInjectionToken,
|
|
90
|
+
ExecutionContextToken: () => ExecutionContextToken,
|
|
91
|
+
FactoryNotFound: () => FactoryNotFound,
|
|
92
|
+
ForbiddenException: () => ForbiddenException,
|
|
93
|
+
GuardRunnerService: () => GuardRunnerService,
|
|
94
|
+
HttpException: () => HttpException,
|
|
95
|
+
Injectable: () => Injectable,
|
|
96
|
+
InjectableScope: () => InjectableScope,
|
|
97
|
+
InjectableTokenMeta: () => InjectableTokenMeta,
|
|
98
|
+
InjectableType: () => InjectableType,
|
|
99
|
+
InjectionToken: () => InjectionToken,
|
|
100
|
+
InstanceDestroying: () => InstanceDestroying,
|
|
101
|
+
InstanceExpired: () => InstanceExpired,
|
|
102
|
+
InstanceNotFound: () => InstanceNotFound,
|
|
103
|
+
InternalServerErrorException: () => InternalServerErrorException,
|
|
104
|
+
Module: () => Module,
|
|
105
|
+
ModuleLoaderService: () => ModuleLoaderService,
|
|
106
|
+
ModuleMetadataKey: () => ModuleMetadataKey,
|
|
107
|
+
NaviosApplication: () => NaviosApplication,
|
|
108
|
+
NaviosFactory: () => NaviosFactory,
|
|
109
|
+
NotFoundException: () => NotFoundException,
|
|
110
|
+
Reply: () => Reply,
|
|
111
|
+
Request: () => Request,
|
|
112
|
+
ServiceLocator: () => ServiceLocator,
|
|
113
|
+
ServiceLocatorEventBus: () => ServiceLocatorEventBus,
|
|
114
|
+
ServiceLocatorInstanceHolderKind: () => ServiceLocatorInstanceHolderKind,
|
|
115
|
+
ServiceLocatorInstanceHolderStatus: () => ServiceLocatorInstanceHolderStatus,
|
|
116
|
+
ServiceLocatorManager: () => ServiceLocatorManager,
|
|
117
|
+
UnauthorizedException: () => UnauthorizedException,
|
|
118
|
+
UnknownError: () => UnknownError,
|
|
119
|
+
UseGuards: () => UseGuards,
|
|
120
|
+
extractControllerMetadata: () => extractControllerMetadata,
|
|
121
|
+
extractModuleMetadata: () => extractModuleMetadata,
|
|
122
|
+
getAllEndpointMetadata: () => getAllEndpointMetadata,
|
|
123
|
+
getControllerMetadata: () => getControllerMetadata,
|
|
124
|
+
getEndpointMetadata: () => getEndpointMetadata,
|
|
125
|
+
getInjectableToken: () => getInjectableToken,
|
|
126
|
+
getModuleMetadata: () => getModuleMetadata,
|
|
127
|
+
getServiceLocator: () => getServiceLocator,
|
|
128
|
+
hasControllerMetadata: () => hasControllerMetadata,
|
|
129
|
+
hasModuleMetadata: () => hasModuleMetadata,
|
|
130
|
+
inject: () => inject,
|
|
131
|
+
override: () => override,
|
|
132
|
+
provideServiceLocator: () => provideServiceLocator,
|
|
133
|
+
setPromiseCollector: () => setPromiseCollector,
|
|
134
|
+
syncInject: () => syncInject
|
|
135
|
+
});
|
|
136
|
+
module.exports = __toCommonJS(src_exports);
|
|
137
|
+
|
|
138
|
+
// packages/core/src/metadata/endpoint.metadata.mts
|
|
139
|
+
var EndpointMetadataKey = Symbol("EndpointMetadataKey");
|
|
140
|
+
function getAllEndpointMetadata(context) {
|
|
141
|
+
if (context.metadata) {
|
|
142
|
+
const metadata = context.metadata[EndpointMetadataKey];
|
|
143
|
+
if (metadata) {
|
|
144
|
+
return metadata;
|
|
145
|
+
} else {
|
|
146
|
+
context.metadata[EndpointMetadataKey] = /* @__PURE__ */ new Set();
|
|
147
|
+
return context.metadata[EndpointMetadataKey];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
throw new Error("[Navios] Wrong environment.");
|
|
151
|
+
}
|
|
152
|
+
function getEndpointMetadata(target, context) {
|
|
153
|
+
if (context.metadata) {
|
|
154
|
+
const metadata = getAllEndpointMetadata(context);
|
|
155
|
+
if (metadata) {
|
|
156
|
+
const endpointMetadata = Array.from(metadata).find(
|
|
157
|
+
(item) => item.classMethod === target.name
|
|
158
|
+
);
|
|
159
|
+
if (endpointMetadata) {
|
|
160
|
+
return endpointMetadata;
|
|
161
|
+
} else {
|
|
162
|
+
const newMetadata = {
|
|
163
|
+
classMethod: target.name,
|
|
164
|
+
url: "",
|
|
165
|
+
httpMethod: "GET",
|
|
166
|
+
config: null,
|
|
167
|
+
guards: /* @__PURE__ */ new Set(),
|
|
168
|
+
customAttributes: /* @__PURE__ */ new Map()
|
|
169
|
+
};
|
|
170
|
+
metadata.add(newMetadata);
|
|
171
|
+
return newMetadata;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
throw new Error("[Navios] Wrong environment.");
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// packages/core/src/metadata/controller.metadata.mts
|
|
179
|
+
var ControllerMetadataKey = Symbol("ControllerMetadataKey");
|
|
180
|
+
function getControllerMetadata(target, context) {
|
|
181
|
+
if (context.metadata) {
|
|
182
|
+
const metadata = context.metadata[ControllerMetadataKey];
|
|
183
|
+
if (metadata) {
|
|
184
|
+
return metadata;
|
|
185
|
+
} else {
|
|
186
|
+
const endpointsMetadata = getAllEndpointMetadata(context);
|
|
187
|
+
const newMetadata = {
|
|
188
|
+
endpoints: endpointsMetadata,
|
|
189
|
+
guards: /* @__PURE__ */ new Set(),
|
|
190
|
+
customAttributes: /* @__PURE__ */ new Map()
|
|
191
|
+
};
|
|
192
|
+
context.metadata[ControllerMetadataKey] = newMetadata;
|
|
193
|
+
target[ControllerMetadataKey] = newMetadata;
|
|
194
|
+
return newMetadata;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
throw new Error("[Navios] Wrong environment.");
|
|
198
|
+
}
|
|
199
|
+
function extractControllerMetadata(target) {
|
|
200
|
+
const metadata = target[ControllerMetadataKey];
|
|
201
|
+
if (!metadata) {
|
|
202
|
+
throw new Error(
|
|
203
|
+
"[Navios] Controller metadata not found. Make sure to use @Controller decorator."
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
return metadata;
|
|
207
|
+
}
|
|
208
|
+
function hasControllerMetadata(target) {
|
|
209
|
+
const metadata = target[ControllerMetadataKey];
|
|
210
|
+
return !!metadata;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// packages/core/src/metadata/module.metadata.mts
|
|
214
|
+
var ModuleMetadataKey = Symbol("ControllerMetadataKey");
|
|
215
|
+
function getModuleMetadata(target, context) {
|
|
216
|
+
if (context.metadata) {
|
|
217
|
+
const metadata = context.metadata[ModuleMetadataKey];
|
|
218
|
+
if (metadata) {
|
|
219
|
+
return metadata;
|
|
220
|
+
} else {
|
|
221
|
+
const newMetadata = {
|
|
222
|
+
controllers: /* @__PURE__ */ new Set(),
|
|
223
|
+
imports: /* @__PURE__ */ new Set(),
|
|
224
|
+
guards: /* @__PURE__ */ new Set(),
|
|
225
|
+
customAttributes: /* @__PURE__ */ new Map()
|
|
226
|
+
};
|
|
227
|
+
context.metadata[ModuleMetadataKey] = newMetadata;
|
|
228
|
+
target[ModuleMetadataKey] = newMetadata;
|
|
229
|
+
return newMetadata;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
throw new Error("[Navios] Wrong environment.");
|
|
233
|
+
}
|
|
234
|
+
function extractModuleMetadata(target) {
|
|
235
|
+
const metadata = target[ModuleMetadataKey];
|
|
236
|
+
if (!metadata) {
|
|
237
|
+
throw new Error(
|
|
238
|
+
"[Navios] Module metadata not found. Make sure to use @Module decorator."
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
return metadata;
|
|
242
|
+
}
|
|
243
|
+
function hasModuleMetadata(target) {
|
|
244
|
+
return !!target[ModuleMetadataKey];
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// packages/core/src/service-locator/enums/injectable-scope.enum.mts
|
|
248
|
+
var InjectableScope = /* @__PURE__ */ ((InjectableScope2) => {
|
|
249
|
+
InjectableScope2["Singleton"] = "Singleton";
|
|
250
|
+
InjectableScope2["Instance"] = "Instance";
|
|
251
|
+
return InjectableScope2;
|
|
252
|
+
})(InjectableScope || {});
|
|
253
|
+
|
|
254
|
+
// packages/core/src/service-locator/injection-token.mts
|
|
255
|
+
var import_crypto = require("crypto");
|
|
256
|
+
var InjectionToken = class _InjectionToken {
|
|
257
|
+
constructor(name2, schema) {
|
|
258
|
+
this.name = name2;
|
|
259
|
+
this.schema = schema;
|
|
260
|
+
}
|
|
261
|
+
id = (0, import_crypto.randomUUID)();
|
|
262
|
+
static create(name2, schema) {
|
|
263
|
+
return new _InjectionToken(name2, schema);
|
|
264
|
+
}
|
|
265
|
+
toString() {
|
|
266
|
+
return this.name;
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
// packages/core/src/service-locator/errors/errors.enum.mts
|
|
271
|
+
var ErrorsEnum = /* @__PURE__ */ ((ErrorsEnum2) => {
|
|
272
|
+
ErrorsEnum2["InstanceExpired"] = "InstanceExpired";
|
|
273
|
+
ErrorsEnum2["InstanceNotFound"] = "InstanceNotFound";
|
|
274
|
+
ErrorsEnum2["InstanceDestroying"] = "InstanceDestroying";
|
|
275
|
+
ErrorsEnum2["UnknownError"] = "UnknownError";
|
|
276
|
+
ErrorsEnum2["FactoryNotFound"] = "FactoryNotFound";
|
|
277
|
+
return ErrorsEnum2;
|
|
278
|
+
})(ErrorsEnum || {});
|
|
279
|
+
|
|
280
|
+
// packages/core/src/service-locator/errors/factory-not-found.mts
|
|
281
|
+
var FactoryNotFound = class extends Error {
|
|
282
|
+
constructor(name2) {
|
|
283
|
+
super(`Factory ${name2} not found`);
|
|
284
|
+
this.name = name2;
|
|
285
|
+
}
|
|
286
|
+
code = "FactoryNotFound" /* FactoryNotFound */;
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
// packages/core/src/service-locator/errors/instance-destroying.mts
|
|
290
|
+
var InstanceDestroying = class extends Error {
|
|
291
|
+
constructor(name2) {
|
|
292
|
+
super(`Instance ${name2} destroying`);
|
|
293
|
+
this.name = name2;
|
|
294
|
+
}
|
|
295
|
+
code = "InstanceDestroying" /* InstanceDestroying */;
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
// packages/core/src/service-locator/errors/instance-expired.mts
|
|
299
|
+
var InstanceExpired = class extends Error {
|
|
300
|
+
constructor(name2) {
|
|
301
|
+
super(`Instance ${name2} expired`);
|
|
302
|
+
this.name = name2;
|
|
303
|
+
}
|
|
304
|
+
code = "InstanceExpired" /* InstanceExpired */;
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
// packages/core/src/service-locator/errors/instance-not-found.mts
|
|
308
|
+
var InstanceNotFound = class extends Error {
|
|
309
|
+
constructor(name2) {
|
|
310
|
+
super(`Instance ${name2} not found`);
|
|
311
|
+
this.name = name2;
|
|
312
|
+
}
|
|
313
|
+
code = "InstanceNotFound" /* InstanceNotFound */;
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
// packages/core/src/service-locator/errors/unknown-error.mts
|
|
317
|
+
var UnknownError = class extends Error {
|
|
318
|
+
code = "UnknownError" /* UnknownError */;
|
|
319
|
+
parent;
|
|
320
|
+
constructor(message) {
|
|
321
|
+
if (message instanceof Error) {
|
|
322
|
+
super(message.message);
|
|
323
|
+
this.parent = message;
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
super(message);
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
// packages/core/src/service-locator/service-locator-event-bus.mts
|
|
331
|
+
var ServiceLocatorEventBus = class {
|
|
332
|
+
constructor(logger = null) {
|
|
333
|
+
this.logger = logger;
|
|
334
|
+
}
|
|
335
|
+
listeners = /* @__PURE__ */ new Map();
|
|
336
|
+
on(ns, event, listener) {
|
|
337
|
+
var _a;
|
|
338
|
+
(_a = this.logger) == null ? void 0 : _a.debug(`[ServiceLocatorEventBus]#on(): ns:${ns} event:${event}`);
|
|
339
|
+
if (!this.listeners.has(ns)) {
|
|
340
|
+
this.listeners.set(ns, /* @__PURE__ */ new Map());
|
|
341
|
+
}
|
|
342
|
+
const nsEvents = this.listeners.get(ns);
|
|
343
|
+
if (!nsEvents.has(event)) {
|
|
344
|
+
nsEvents.set(event, /* @__PURE__ */ new Set());
|
|
345
|
+
}
|
|
346
|
+
nsEvents.get(event).add(listener);
|
|
347
|
+
return () => {
|
|
348
|
+
var _a2;
|
|
349
|
+
nsEvents.get(event).delete(listener);
|
|
350
|
+
if (((_a2 = nsEvents.get(event)) == null ? void 0 : _a2.size) === 0) {
|
|
351
|
+
nsEvents.delete(event);
|
|
352
|
+
}
|
|
353
|
+
if (nsEvents.size === 0) {
|
|
354
|
+
this.listeners.delete(ns);
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
async emit(key, event) {
|
|
359
|
+
var _a, _b, _c;
|
|
360
|
+
if (!this.listeners.has(key)) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
const events = this.listeners.get(key);
|
|
364
|
+
const preEvent = `pre:${event}`;
|
|
365
|
+
const postEvent = `post:${event}`;
|
|
366
|
+
(_a = this.logger) == null ? void 0 : _a.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${preEvent}`);
|
|
367
|
+
await Promise.allSettled(
|
|
368
|
+
[...events.get(preEvent) ?? []].map((listener) => listener(preEvent))
|
|
369
|
+
).then((results) => {
|
|
370
|
+
results.filter((result) => result.status === "rejected").forEach((result) => {
|
|
371
|
+
var _a2;
|
|
372
|
+
(_a2 = this.logger) == null ? void 0 : _a2.warn(
|
|
373
|
+
`[ServiceLocatorEventBus]#emit(): ${key}:${preEvent} rejected with`,
|
|
374
|
+
result.reason
|
|
375
|
+
);
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
(_b = this.logger) == null ? void 0 : _b.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${event}`);
|
|
379
|
+
const res = await Promise.allSettled(
|
|
380
|
+
[...events.get(event) ?? []].map((listener) => listener(event))
|
|
381
|
+
).then((results) => {
|
|
382
|
+
const res2 = results.filter((result) => result.status === "rejected").map((result) => {
|
|
383
|
+
var _a2;
|
|
384
|
+
(_a2 = this.logger) == null ? void 0 : _a2.warn(
|
|
385
|
+
`[ServiceLocatorEventBus]#emit(): ${key}:${event} rejected with`,
|
|
386
|
+
result.reason
|
|
387
|
+
);
|
|
388
|
+
return result;
|
|
389
|
+
});
|
|
390
|
+
if (res2.length > 0) {
|
|
391
|
+
return Promise.reject(res2);
|
|
392
|
+
}
|
|
393
|
+
return results;
|
|
394
|
+
});
|
|
395
|
+
(_c = this.logger) == null ? void 0 : _c.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${postEvent}`);
|
|
396
|
+
await Promise.allSettled(
|
|
397
|
+
[...events.get(postEvent) ?? []].map((listener) => listener(postEvent))
|
|
398
|
+
).then((results) => {
|
|
399
|
+
results.filter((result) => result.status === "rejected").forEach((result) => {
|
|
400
|
+
var _a2;
|
|
401
|
+
(_a2 = this.logger) == null ? void 0 : _a2.warn(
|
|
402
|
+
`[ServiceLocatorEventBus]#emit(): ${key}:${postEvent} rejected with`,
|
|
403
|
+
result.reason
|
|
404
|
+
);
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
return res;
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
// packages/core/src/service-locator/service-locator-instance-holder.mts
|
|
412
|
+
var ServiceLocatorInstanceHolderKind = /* @__PURE__ */ ((ServiceLocatorInstanceHolderKind2) => {
|
|
413
|
+
ServiceLocatorInstanceHolderKind2["Instance"] = "instance";
|
|
414
|
+
ServiceLocatorInstanceHolderKind2["Factory"] = "factory";
|
|
415
|
+
ServiceLocatorInstanceHolderKind2["AbstractFactory"] = "abstractFactory";
|
|
416
|
+
return ServiceLocatorInstanceHolderKind2;
|
|
417
|
+
})(ServiceLocatorInstanceHolderKind || {});
|
|
418
|
+
var ServiceLocatorInstanceHolderStatus = /* @__PURE__ */ ((ServiceLocatorInstanceHolderStatus2) => {
|
|
419
|
+
ServiceLocatorInstanceHolderStatus2["Created"] = "created";
|
|
420
|
+
ServiceLocatorInstanceHolderStatus2["Creating"] = "creating";
|
|
421
|
+
ServiceLocatorInstanceHolderStatus2["Destroying"] = "destroying";
|
|
422
|
+
return ServiceLocatorInstanceHolderStatus2;
|
|
423
|
+
})(ServiceLocatorInstanceHolderStatus || {});
|
|
424
|
+
|
|
425
|
+
// packages/core/src/service-locator/service-locator-manager.mts
|
|
426
|
+
var ServiceLocatorManager = class {
|
|
427
|
+
constructor(logger = null) {
|
|
428
|
+
this.logger = logger;
|
|
429
|
+
}
|
|
430
|
+
instancesHolders = /* @__PURE__ */ new Map();
|
|
431
|
+
get(name2) {
|
|
432
|
+
var _a, _b, _c;
|
|
433
|
+
const holder = this.instancesHolders.get(name2);
|
|
434
|
+
if (holder) {
|
|
435
|
+
if (holder.ttl !== Infinity) {
|
|
436
|
+
const now = Date.now();
|
|
437
|
+
if (now - holder.createdAt > holder.ttl) {
|
|
438
|
+
(_a = this.logger) == null ? void 0 : _a.log(
|
|
439
|
+
`[ServiceLocatorManager]#getInstanceHolder() TTL expired for ${holder.name}`
|
|
440
|
+
);
|
|
441
|
+
return [new InstanceExpired(holder.name), holder];
|
|
442
|
+
}
|
|
443
|
+
} else if (holder.status === "destroying" /* Destroying */) {
|
|
444
|
+
(_b = this.logger) == null ? void 0 : _b.log(
|
|
445
|
+
`[ServiceLocatorManager]#getInstanceHolder() Instance ${holder.name} is destroying`
|
|
446
|
+
);
|
|
447
|
+
return [new InstanceDestroying(holder.name), holder];
|
|
448
|
+
}
|
|
449
|
+
return [void 0, holder];
|
|
450
|
+
} else {
|
|
451
|
+
(_c = this.logger) == null ? void 0 : _c.log(
|
|
452
|
+
`[ServiceLocatorManager]#getInstanceHolder() Instance ${name2} not found`
|
|
453
|
+
);
|
|
454
|
+
return [new InstanceNotFound(name2)];
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
set(name2, holder) {
|
|
458
|
+
this.instancesHolders.set(name2, holder);
|
|
459
|
+
}
|
|
460
|
+
has(name2) {
|
|
461
|
+
const [error, holder] = this.get(name2);
|
|
462
|
+
if (!error) {
|
|
463
|
+
return [void 0, true];
|
|
464
|
+
}
|
|
465
|
+
if (["InstanceExpired" /* InstanceExpired */, "InstanceDestroying" /* InstanceDestroying */].includes(
|
|
466
|
+
error.code
|
|
467
|
+
)) {
|
|
468
|
+
return [error];
|
|
469
|
+
}
|
|
470
|
+
return [void 0, !!holder];
|
|
471
|
+
}
|
|
472
|
+
delete(name2) {
|
|
473
|
+
return this.instancesHolders.delete(name2);
|
|
474
|
+
}
|
|
475
|
+
filter(predicate) {
|
|
476
|
+
return new Map(
|
|
477
|
+
[...this.instancesHolders].filter(
|
|
478
|
+
([key, value]) => predicate(value, key)
|
|
479
|
+
)
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
// packages/core/src/service-locator/service-locator.mts
|
|
485
|
+
var ServiceLocator = class {
|
|
486
|
+
constructor(logger = null) {
|
|
487
|
+
this.logger = logger;
|
|
488
|
+
this.eventBus = new ServiceLocatorEventBus(logger);
|
|
489
|
+
this.manager = new ServiceLocatorManager(logger);
|
|
490
|
+
}
|
|
491
|
+
abstractFactories = /* @__PURE__ */ new Map();
|
|
492
|
+
instanceFactories = /* @__PURE__ */ new Map();
|
|
493
|
+
eventBus;
|
|
494
|
+
manager;
|
|
495
|
+
getEventBus() {
|
|
496
|
+
return this.eventBus;
|
|
497
|
+
}
|
|
498
|
+
registerInstance(token, instance) {
|
|
499
|
+
const instanceName = this.getInstanceIdentifier(token, void 0);
|
|
500
|
+
this.manager.set(instanceName, {
|
|
501
|
+
name: instanceName,
|
|
502
|
+
instance,
|
|
503
|
+
status: "created" /* Created */,
|
|
504
|
+
kind: "instance" /* Instance */,
|
|
505
|
+
createdAt: Date.now(),
|
|
506
|
+
ttl: Infinity,
|
|
507
|
+
deps: [],
|
|
508
|
+
destroyListeners: [],
|
|
509
|
+
effects: [],
|
|
510
|
+
destroyPromise: null,
|
|
511
|
+
creationPromise: null
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
removeInstance(token) {
|
|
515
|
+
const instanceName = this.getInstanceIdentifier(token, void 0);
|
|
516
|
+
return this.invalidate(instanceName);
|
|
517
|
+
}
|
|
518
|
+
registerAbstractFactory(token, factory, type = "Singleton" /* Singleton */) {
|
|
519
|
+
var _a;
|
|
520
|
+
(_a = this.logger) == null ? void 0 : _a.log(
|
|
521
|
+
`[ServiceLocator]#registerAbstractFactory(): Registering abstract factory for ${name}`
|
|
522
|
+
);
|
|
523
|
+
if (type === "Instance" /* Instance */) {
|
|
524
|
+
this.instanceFactories.set(token, factory);
|
|
525
|
+
this.abstractFactories.delete(token);
|
|
526
|
+
} else {
|
|
527
|
+
this.abstractFactories.set(token, factory);
|
|
528
|
+
this.instanceFactories.delete(token);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
getInstanceIdentifier(token, args) {
|
|
532
|
+
var _a;
|
|
533
|
+
const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
|
|
534
|
+
if (validatedArgs && !validatedArgs.success) {
|
|
535
|
+
(_a = this.logger) == null ? void 0 : _a.error(
|
|
536
|
+
`[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
|
|
537
|
+
validatedArgs.error
|
|
538
|
+
);
|
|
539
|
+
throw new UnknownError(validatedArgs.error);
|
|
540
|
+
}
|
|
541
|
+
return this.makeInstanceName(token, validatedArgs);
|
|
542
|
+
}
|
|
543
|
+
async getInstance(token, args) {
|
|
544
|
+
var _a, _b, _c;
|
|
545
|
+
const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
|
|
546
|
+
if (validatedArgs && !validatedArgs.success) {
|
|
547
|
+
(_a = this.logger) == null ? void 0 : _a.error(
|
|
548
|
+
`[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
|
|
549
|
+
validatedArgs.error
|
|
550
|
+
);
|
|
551
|
+
return [new UnknownError(validatedArgs.error)];
|
|
552
|
+
}
|
|
553
|
+
const instanceName = this.makeInstanceName(token, validatedArgs);
|
|
554
|
+
const [error, holder] = this.manager.get(instanceName);
|
|
555
|
+
if (!error) {
|
|
556
|
+
if (holder.status === "creating" /* Creating */) {
|
|
557
|
+
return holder.creationPromise;
|
|
558
|
+
} else if (holder.status === "destroying" /* Destroying */) {
|
|
559
|
+
return [new UnknownError("InstanceDestroying" /* InstanceDestroying */)];
|
|
560
|
+
}
|
|
561
|
+
return [void 0, holder.instance];
|
|
562
|
+
}
|
|
563
|
+
switch (error.code) {
|
|
564
|
+
case "InstanceDestroying" /* InstanceDestroying */:
|
|
565
|
+
(_b = this.logger) == null ? void 0 : _b.log(
|
|
566
|
+
`[ServiceLocator]#getInstance() TTL expired for ${holder == null ? void 0 : holder.name}`
|
|
567
|
+
);
|
|
568
|
+
await (holder == null ? void 0 : holder.destroyPromise);
|
|
569
|
+
return this.getInstance(token, args);
|
|
570
|
+
case "InstanceExpired" /* InstanceExpired */:
|
|
571
|
+
(_c = this.logger) == null ? void 0 : _c.log(
|
|
572
|
+
`[ServiceLocator]#getInstance() TTL expired for ${holder == null ? void 0 : holder.name}`
|
|
573
|
+
);
|
|
574
|
+
await this.invalidate(instanceName);
|
|
575
|
+
return this.getInstance(token, args);
|
|
576
|
+
case "InstanceNotFound" /* InstanceNotFound */:
|
|
577
|
+
break;
|
|
578
|
+
default:
|
|
579
|
+
return [error];
|
|
580
|
+
}
|
|
581
|
+
return this.createInstance(instanceName, token, args);
|
|
582
|
+
}
|
|
583
|
+
async getOrThrowInstance(token, args) {
|
|
584
|
+
const [error, instance] = await this.getInstance(token, args);
|
|
585
|
+
if (error) {
|
|
586
|
+
throw error;
|
|
587
|
+
}
|
|
588
|
+
return instance;
|
|
589
|
+
}
|
|
590
|
+
notifyListeners(name2, event = "create") {
|
|
591
|
+
var _a;
|
|
592
|
+
(_a = this.logger) == null ? void 0 : _a.log(
|
|
593
|
+
`[ServiceLocator]#notifyListeners() Notifying listeners for ${name2} with event ${event}`
|
|
594
|
+
);
|
|
595
|
+
return this.eventBus.emit(name2, event);
|
|
596
|
+
}
|
|
597
|
+
async createInstance(instanceName, token, args) {
|
|
598
|
+
var _a;
|
|
599
|
+
(_a = this.logger) == null ? void 0 : _a.log(
|
|
600
|
+
`[ServiceLocator]#createInstance() Creating instance for ${instanceName}`
|
|
601
|
+
);
|
|
602
|
+
if (this.abstractFactories.has(token) || this.instanceFactories.has(token)) {
|
|
603
|
+
return this.createInstanceFromAbstractFactory(instanceName, token, args);
|
|
604
|
+
} else {
|
|
605
|
+
return [new FactoryNotFound(token.name.toString())];
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
async createInstanceFromAbstractFactory(instanceName, token, args) {
|
|
609
|
+
var _a;
|
|
610
|
+
(_a = this.logger) == null ? void 0 : _a.log(
|
|
611
|
+
`[ServiceLocator]#createInstanceFromAbstractFactory(): Creating instance for ${instanceName} from abstract factory`
|
|
612
|
+
);
|
|
613
|
+
const ctx = this.createContextForAbstractFactory(instanceName);
|
|
614
|
+
let shouldStore = true;
|
|
615
|
+
let abstractFactory = this.abstractFactories.get(token);
|
|
616
|
+
if (!abstractFactory) {
|
|
617
|
+
abstractFactory = this.instanceFactories.get(token);
|
|
618
|
+
shouldStore = false;
|
|
619
|
+
if (!abstractFactory) {
|
|
620
|
+
return [new FactoryNotFound(token.name.toString())];
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
const holder = {
|
|
624
|
+
name: instanceName,
|
|
625
|
+
instance: null,
|
|
626
|
+
status: "creating" /* Creating */,
|
|
627
|
+
kind: "abstractFactory" /* AbstractFactory */,
|
|
628
|
+
// @ts-expect-error TS2322 This is correct type
|
|
629
|
+
creationPromise: abstractFactory(ctx, args).then(async (instance) => {
|
|
630
|
+
var _a2;
|
|
631
|
+
holder.instance = instance;
|
|
632
|
+
holder.status = "created" /* Created */;
|
|
633
|
+
holder.deps = ctx.getDependencies();
|
|
634
|
+
holder.destroyListeners = ctx.getDestroyListeners();
|
|
635
|
+
holder.ttl = ctx.getTtl();
|
|
636
|
+
if (holder.deps.length > 0) {
|
|
637
|
+
(_a2 = this.logger) == null ? void 0 : _a2.log(
|
|
638
|
+
`[ServiceLocator]#createInstanceFromAbstractFactory(): Adding subscriptions for ${instanceName} dependencies for their invalidations: ${holder.deps.join(
|
|
639
|
+
", "
|
|
640
|
+
)}`
|
|
641
|
+
);
|
|
642
|
+
holder.deps.forEach((dependency) => {
|
|
643
|
+
holder.destroyListeners.push(
|
|
644
|
+
this.eventBus.on(
|
|
645
|
+
dependency,
|
|
646
|
+
"destroy",
|
|
647
|
+
() => this.invalidate(instanceName)
|
|
648
|
+
)
|
|
649
|
+
);
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
if (holder.ttl === 0) {
|
|
653
|
+
await this.invalidate(instanceName);
|
|
654
|
+
}
|
|
655
|
+
await this.notifyListeners(instanceName);
|
|
656
|
+
return [void 0, instance];
|
|
657
|
+
}).catch((error) => {
|
|
658
|
+
var _a2;
|
|
659
|
+
(_a2 = this.logger) == null ? void 0 : _a2.error(
|
|
660
|
+
`[ServiceLocator]#createInstanceFromAbstractFactory(): Error creating instance for ${instanceName}`,
|
|
661
|
+
error
|
|
662
|
+
);
|
|
663
|
+
return [new UnknownError(error)];
|
|
664
|
+
}),
|
|
665
|
+
effects: [],
|
|
666
|
+
deps: [],
|
|
667
|
+
destroyListeners: [],
|
|
668
|
+
createdAt: Date.now(),
|
|
669
|
+
ttl: Infinity
|
|
670
|
+
};
|
|
671
|
+
if (shouldStore) {
|
|
672
|
+
this.manager.set(instanceName, holder);
|
|
673
|
+
}
|
|
674
|
+
return holder.creationPromise;
|
|
675
|
+
}
|
|
676
|
+
createContextForAbstractFactory(instanceName) {
|
|
677
|
+
const dependencies = /* @__PURE__ */ new Set();
|
|
678
|
+
const destroyListeners = /* @__PURE__ */ new Set();
|
|
679
|
+
const self = this;
|
|
680
|
+
function invalidate(name2 = instanceName) {
|
|
681
|
+
return self.invalidate(name2);
|
|
682
|
+
}
|
|
683
|
+
function addEffect(listener) {
|
|
684
|
+
destroyListeners.add(listener);
|
|
685
|
+
}
|
|
686
|
+
let ttl = Infinity;
|
|
687
|
+
function setTtl(value) {
|
|
688
|
+
ttl = value;
|
|
689
|
+
}
|
|
690
|
+
function getTtl() {
|
|
691
|
+
return ttl;
|
|
692
|
+
}
|
|
693
|
+
function on(key, event, listener) {
|
|
694
|
+
destroyListeners.add(self.eventBus.on(key, event, listener));
|
|
695
|
+
}
|
|
696
|
+
return {
|
|
697
|
+
// @ts-expect-error This is correct type
|
|
698
|
+
async inject(token, args) {
|
|
699
|
+
let injectionToken = token;
|
|
700
|
+
if (typeof token === "function") {
|
|
701
|
+
injectionToken = getInjectableToken(token);
|
|
702
|
+
}
|
|
703
|
+
if (injectionToken instanceof InjectionToken) {
|
|
704
|
+
const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
|
|
705
|
+
const instanceName2 = self.makeInstanceName(token, validatedArgs);
|
|
706
|
+
dependencies.add(instanceName2);
|
|
707
|
+
return self.getOrThrowInstance(injectionToken, args);
|
|
708
|
+
}
|
|
709
|
+
throw new Error(
|
|
710
|
+
`[ServiceLocator]#inject(): Invalid token type: ${typeof token}. Expected a class or an InjectionToken.`
|
|
711
|
+
);
|
|
712
|
+
},
|
|
713
|
+
invalidate,
|
|
714
|
+
eventBus: self.eventBus,
|
|
715
|
+
on,
|
|
716
|
+
getDependencies: () => Array.from(dependencies),
|
|
717
|
+
addEffect,
|
|
718
|
+
getDestroyListeners: () => Array.from(destroyListeners),
|
|
719
|
+
setTtl,
|
|
720
|
+
getTtl
|
|
721
|
+
};
|
|
722
|
+
}
|
|
723
|
+
getSyncInstance(token, args) {
|
|
724
|
+
var _a;
|
|
725
|
+
const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
|
|
726
|
+
if (validatedArgs && !validatedArgs.success) {
|
|
727
|
+
(_a = this.logger) == null ? void 0 : _a.error(
|
|
728
|
+
`[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
|
|
729
|
+
validatedArgs.error
|
|
730
|
+
);
|
|
731
|
+
throw new UnknownError(validatedArgs.error);
|
|
732
|
+
}
|
|
733
|
+
const instanceName = this.makeInstanceName(token, validatedArgs);
|
|
734
|
+
const [error, holder] = this.manager.get(instanceName);
|
|
735
|
+
if (error) {
|
|
736
|
+
return null;
|
|
737
|
+
}
|
|
738
|
+
return holder.instance;
|
|
739
|
+
}
|
|
740
|
+
invalidate(service, round = 1) {
|
|
741
|
+
var _a, _b, _c, _d, _e;
|
|
742
|
+
(_a = this.logger) == null ? void 0 : _a.log(
|
|
743
|
+
`[ServiceLocator]#invalidate(): Starting Invalidating process of ${service}`
|
|
744
|
+
);
|
|
745
|
+
const toInvalidate = this.manager.filter(
|
|
746
|
+
(holder) => holder.name === service || holder.deps.includes(service)
|
|
747
|
+
);
|
|
748
|
+
const promises = [];
|
|
749
|
+
for (const [key, holder] of toInvalidate.entries()) {
|
|
750
|
+
if (holder.status === "destroying" /* Destroying */) {
|
|
751
|
+
(_b = this.logger) == null ? void 0 : _b.trace(
|
|
752
|
+
`[ServiceLocator]#invalidate(): ${key} is already being destroyed`
|
|
753
|
+
);
|
|
754
|
+
promises.push(holder.destroyPromise);
|
|
755
|
+
continue;
|
|
756
|
+
}
|
|
757
|
+
if (holder.status === "creating" /* Creating */) {
|
|
758
|
+
(_c = this.logger) == null ? void 0 : _c.trace(
|
|
759
|
+
`[ServiceLocator]#invalidate(): ${key} is being created, waiting for creation to finish`
|
|
760
|
+
);
|
|
761
|
+
promises.push(
|
|
762
|
+
(_d = holder.creationPromise) == null ? void 0 : _d.then(() => {
|
|
763
|
+
var _a2;
|
|
764
|
+
if (round > 3) {
|
|
765
|
+
(_a2 = this.logger) == null ? void 0 : _a2.error(
|
|
766
|
+
`[ServiceLocator]#invalidate(): ${key} creation is triggering a new invalidation round, but it is still not created`
|
|
767
|
+
);
|
|
768
|
+
return;
|
|
769
|
+
}
|
|
770
|
+
return this.invalidate(key, round + 1);
|
|
771
|
+
})
|
|
772
|
+
);
|
|
773
|
+
continue;
|
|
774
|
+
}
|
|
775
|
+
holder.status = "destroying" /* Destroying */;
|
|
776
|
+
(_e = this.logger) == null ? void 0 : _e.log(
|
|
777
|
+
`[ServiceLocator]#invalidate(): Invalidating ${key} and notifying listeners`
|
|
778
|
+
);
|
|
779
|
+
holder.destroyPromise = Promise.all(
|
|
780
|
+
holder.destroyListeners.map((listener) => listener())
|
|
781
|
+
).then(async () => {
|
|
782
|
+
this.manager.delete(key);
|
|
783
|
+
await this.notifyListeners(key, "destroy");
|
|
784
|
+
});
|
|
785
|
+
promises.push(holder.destroyPromise);
|
|
786
|
+
}
|
|
787
|
+
return Promise.all(promises);
|
|
788
|
+
}
|
|
789
|
+
async ready() {
|
|
790
|
+
return Promise.all(
|
|
791
|
+
Array.from(this.manager.filter(() => true)).map(([, holder]) => {
|
|
792
|
+
var _a;
|
|
793
|
+
if (holder.status === "creating" /* Creating */) {
|
|
794
|
+
return (_a = holder.creationPromise) == null ? void 0 : _a.then(() => null);
|
|
795
|
+
}
|
|
796
|
+
if (holder.status === "destroying" /* Destroying */) {
|
|
797
|
+
return holder.destroyPromise.then(() => null);
|
|
798
|
+
}
|
|
799
|
+
return Promise.resolve(null);
|
|
800
|
+
})
|
|
801
|
+
).then(() => null);
|
|
802
|
+
}
|
|
803
|
+
makeInstanceName(token, args) {
|
|
804
|
+
let stringifiedArgs = args ? ":" + JSON.stringify(args).replaceAll(/"/g, "").replaceAll(/:/g, "=").replaceAll(/,/g, "|") : "";
|
|
805
|
+
const { name: name2 } = token;
|
|
806
|
+
if (typeof name2 === "function") {
|
|
807
|
+
const className = name2.name;
|
|
808
|
+
return `${className}(${token.id})${stringifiedArgs}`;
|
|
809
|
+
} else if (typeof name2 === "symbol") {
|
|
810
|
+
return `${name2.toString()}(${token.id})${stringifiedArgs}`;
|
|
811
|
+
} else {
|
|
812
|
+
return `${name2}(${token.id})${stringifiedArgs}`;
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
};
|
|
816
|
+
|
|
817
|
+
// packages/core/src/service-locator/injector.mts
|
|
818
|
+
var serviceLocator = new ServiceLocator();
|
|
819
|
+
function provideServiceLocator(locator) {
|
|
820
|
+
const original = serviceLocator;
|
|
821
|
+
serviceLocator = locator;
|
|
822
|
+
return original;
|
|
823
|
+
}
|
|
824
|
+
function getServiceLocator() {
|
|
825
|
+
if (!serviceLocator) {
|
|
826
|
+
throw new Error(
|
|
827
|
+
"[ServiceLocator] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator."
|
|
828
|
+
);
|
|
829
|
+
}
|
|
830
|
+
return serviceLocator;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
// packages/core/src/service-locator/proxy-service-locator.mts
|
|
834
|
+
var ProxyServiceLocator = class {
|
|
835
|
+
constructor(serviceLocator2, ctx) {
|
|
836
|
+
this.serviceLocator = serviceLocator2;
|
|
837
|
+
this.ctx = ctx;
|
|
838
|
+
}
|
|
839
|
+
get abstractFactories() {
|
|
840
|
+
return this.serviceLocator["abstractFactories"];
|
|
841
|
+
}
|
|
842
|
+
getEventBus() {
|
|
843
|
+
return this.serviceLocator.getEventBus();
|
|
844
|
+
}
|
|
845
|
+
registerAbstractFactory(token, factory) {
|
|
846
|
+
return this.serviceLocator.registerAbstractFactory(token, factory);
|
|
847
|
+
}
|
|
848
|
+
getInstance(token, args) {
|
|
849
|
+
return this.ctx.inject(token, args).then(
|
|
850
|
+
(instance) => {
|
|
851
|
+
return [void 0, instance];
|
|
852
|
+
},
|
|
853
|
+
(error) => {
|
|
854
|
+
return [error];
|
|
855
|
+
}
|
|
856
|
+
);
|
|
857
|
+
}
|
|
858
|
+
getOrThrowInstance(token, args) {
|
|
859
|
+
return this.ctx.inject(token, args);
|
|
860
|
+
}
|
|
861
|
+
getSyncInstance(token, args) {
|
|
862
|
+
return this.serviceLocator.getSyncInstance(token, args);
|
|
863
|
+
}
|
|
864
|
+
invalidate(service, round) {
|
|
865
|
+
return this.serviceLocator.invalidate(service, round);
|
|
866
|
+
}
|
|
867
|
+
ready() {
|
|
868
|
+
return this.serviceLocator.ready();
|
|
869
|
+
}
|
|
870
|
+
makeInstanceName(token, args) {
|
|
871
|
+
return this.serviceLocator.makeInstanceName(token, args);
|
|
872
|
+
}
|
|
873
|
+
};
|
|
874
|
+
function makeProxyServiceLocator(serviceLocator2, ctx) {
|
|
875
|
+
return new ProxyServiceLocator(serviceLocator2, ctx);
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
// packages/core/src/service-locator/sync-injector.mts
|
|
879
|
+
var promiseCollector = null;
|
|
880
|
+
function syncInject(token, args) {
|
|
881
|
+
if (token.schema) {
|
|
882
|
+
const parsed = token.schema.safeParse(args);
|
|
883
|
+
if (!parsed.success) {
|
|
884
|
+
throw new Error(
|
|
885
|
+
`[ServiceLocator] Invalid arguments for ${token.name.toString()}: ${parsed.error}`
|
|
886
|
+
);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
let realToken = token;
|
|
890
|
+
if (!(token instanceof InjectionToken)) {
|
|
891
|
+
realToken = getInjectableToken(token);
|
|
892
|
+
}
|
|
893
|
+
const instance = getServiceLocator().getSyncInstance(realToken, args);
|
|
894
|
+
if (!instance) {
|
|
895
|
+
if (promiseCollector) {
|
|
896
|
+
const promise = getServiceLocator().getInstance(realToken, args);
|
|
897
|
+
promiseCollector(promise);
|
|
898
|
+
} else {
|
|
899
|
+
throw new Error(
|
|
900
|
+
`[ServiceLocator] No instance found for ${realToken.name.toString()}`
|
|
901
|
+
);
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
return instance;
|
|
905
|
+
}
|
|
906
|
+
function setPromiseCollector(collector) {
|
|
907
|
+
const original = promiseCollector;
|
|
908
|
+
promiseCollector = collector;
|
|
909
|
+
return original;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
// packages/core/src/service-locator/decorators/injectable.decorator.mts
|
|
913
|
+
var InjectableType = /* @__PURE__ */ ((InjectableType2) => {
|
|
914
|
+
InjectableType2["Class"] = "Class";
|
|
915
|
+
InjectableType2["Factory"] = "Factory";
|
|
916
|
+
return InjectableType2;
|
|
917
|
+
})(InjectableType || {});
|
|
918
|
+
var InjectableTokenMeta = Symbol("InjectableTokenMeta");
|
|
919
|
+
function Injectable({
|
|
920
|
+
scope = "Singleton" /* Singleton */,
|
|
921
|
+
type = "Class" /* Class */,
|
|
922
|
+
token
|
|
923
|
+
} = {}) {
|
|
924
|
+
return (target, context) => {
|
|
925
|
+
if (context.kind !== "class") {
|
|
926
|
+
throw new Error(
|
|
927
|
+
"[ServiceLocator] @Injectable decorator can only be used on classes."
|
|
928
|
+
);
|
|
929
|
+
}
|
|
930
|
+
let injectableToken = token ?? InjectionToken.create(target);
|
|
931
|
+
const locator = getServiceLocator();
|
|
932
|
+
if (!locator) {
|
|
933
|
+
throw new Error(
|
|
934
|
+
"[ServiceLocator] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator."
|
|
935
|
+
);
|
|
936
|
+
}
|
|
937
|
+
if (type === "Class" /* Class */) {
|
|
938
|
+
locator.registerAbstractFactory(
|
|
939
|
+
injectableToken,
|
|
940
|
+
async (ctx) => {
|
|
941
|
+
if (scope === "Instance" /* Instance */) {
|
|
942
|
+
ctx.setTtl(0);
|
|
943
|
+
}
|
|
944
|
+
const proxyServiceLocator = makeProxyServiceLocator(
|
|
945
|
+
getServiceLocator(),
|
|
946
|
+
ctx
|
|
947
|
+
);
|
|
948
|
+
const promises = [];
|
|
949
|
+
const promiseCollector2 = (promise) => {
|
|
950
|
+
promises.push(promise);
|
|
951
|
+
};
|
|
952
|
+
const originalPromiseCollector = setPromiseCollector(promiseCollector2);
|
|
953
|
+
const tryInit = () => {
|
|
954
|
+
const original = provideServiceLocator(proxyServiceLocator);
|
|
955
|
+
let result2 = new target();
|
|
956
|
+
provideServiceLocator(original);
|
|
957
|
+
return result2;
|
|
958
|
+
};
|
|
959
|
+
const result = tryInit();
|
|
960
|
+
setPromiseCollector(originalPromiseCollector);
|
|
961
|
+
if (promises.length > 0) {
|
|
962
|
+
await Promise.all(promises);
|
|
963
|
+
return tryInit();
|
|
964
|
+
}
|
|
965
|
+
return result;
|
|
966
|
+
},
|
|
967
|
+
scope
|
|
968
|
+
);
|
|
969
|
+
} else if (type === "Factory" /* Factory */) {
|
|
970
|
+
locator.registerAbstractFactory(
|
|
971
|
+
injectableToken,
|
|
972
|
+
async (ctx, args) => {
|
|
973
|
+
if (scope === "Instance" /* Instance */) {
|
|
974
|
+
ctx.setTtl(0);
|
|
975
|
+
}
|
|
976
|
+
const proxyServiceLocator = makeProxyServiceLocator(
|
|
977
|
+
getServiceLocator(),
|
|
978
|
+
ctx
|
|
979
|
+
);
|
|
980
|
+
const original = provideServiceLocator(proxyServiceLocator);
|
|
981
|
+
const builder = new target();
|
|
982
|
+
if (typeof builder.create !== "function") {
|
|
983
|
+
throw new Error(
|
|
984
|
+
`[ServiceLocator] Factory ${target.name} does not implement the create method.`
|
|
985
|
+
);
|
|
986
|
+
}
|
|
987
|
+
provideServiceLocator(original);
|
|
988
|
+
return builder.create(ctx, args);
|
|
989
|
+
},
|
|
990
|
+
scope
|
|
991
|
+
);
|
|
992
|
+
}
|
|
993
|
+
target[InjectableTokenMeta] = injectableToken;
|
|
994
|
+
return target;
|
|
995
|
+
};
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
// packages/core/src/service-locator/decorators/get-injectable-token.mts
|
|
999
|
+
function getInjectableToken(target) {
|
|
1000
|
+
const token = target[InjectableTokenMeta];
|
|
1001
|
+
if (!token) {
|
|
1002
|
+
throw new Error(
|
|
1003
|
+
`[ServiceLocator] Class ${target.name} is not decorated with @Injectable.`
|
|
1004
|
+
);
|
|
1005
|
+
}
|
|
1006
|
+
return token;
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
// packages/core/src/service-locator/event-emitter.mts
|
|
1010
|
+
var EventEmitter = class {
|
|
1011
|
+
listeners = /* @__PURE__ */ new Map();
|
|
1012
|
+
on(event, listener) {
|
|
1013
|
+
if (!this.listeners.has(event)) {
|
|
1014
|
+
this.listeners.set(event, /* @__PURE__ */ new Set());
|
|
1015
|
+
}
|
|
1016
|
+
this.listeners.get(event).add(listener);
|
|
1017
|
+
return () => {
|
|
1018
|
+
this.off(event, listener);
|
|
1019
|
+
};
|
|
1020
|
+
}
|
|
1021
|
+
off(event, listener) {
|
|
1022
|
+
if (!this.listeners.has(event)) {
|
|
1023
|
+
return;
|
|
1024
|
+
}
|
|
1025
|
+
this.listeners.get(event).delete(listener);
|
|
1026
|
+
if (this.listeners.get(event).size === 0) {
|
|
1027
|
+
this.listeners.delete(event);
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
once(event, listener) {
|
|
1031
|
+
const off = this.on(event, (...args) => {
|
|
1032
|
+
off();
|
|
1033
|
+
listener(...args);
|
|
1034
|
+
});
|
|
1035
|
+
return off;
|
|
1036
|
+
}
|
|
1037
|
+
async emit(event, ...args) {
|
|
1038
|
+
if (!this.listeners.has(event)) {
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
return Promise.all(Array.from(this.listeners.get(event)).map((listener) => listener(...args)));
|
|
1042
|
+
}
|
|
1043
|
+
addChannel(ns, event, target) {
|
|
1044
|
+
return this.on(event, (...args) => target.emit(ns, event, ...args));
|
|
1045
|
+
}
|
|
1046
|
+
};
|
|
1047
|
+
|
|
1048
|
+
// packages/core/src/service-locator/inject.mts
|
|
1049
|
+
function inject(token, args) {
|
|
1050
|
+
if (token.schema) {
|
|
1051
|
+
const parsed = token.schema.safeParse(args);
|
|
1052
|
+
if (!parsed.success) {
|
|
1053
|
+
throw new Error(
|
|
1054
|
+
`[ServiceLocator] Invalid arguments for ${token.name.toString()}: ${parsed.error}`
|
|
1055
|
+
);
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
let realToken = token;
|
|
1059
|
+
if (!(token instanceof InjectionToken)) {
|
|
1060
|
+
realToken = getInjectableToken(token);
|
|
1061
|
+
}
|
|
1062
|
+
return getServiceLocator().getOrThrowInstance(realToken, args);
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
// packages/core/src/service-locator/override.mts
|
|
1066
|
+
function override(token, target) {
|
|
1067
|
+
const serviceLocator2 = getServiceLocator();
|
|
1068
|
+
const originalDefinition = serviceLocator2["abstractFactories"].get(token);
|
|
1069
|
+
serviceLocator2.registerAbstractFactory(token, async (ctx, args) => {
|
|
1070
|
+
const builder = new target();
|
|
1071
|
+
return builder.create(ctx, args);
|
|
1072
|
+
});
|
|
1073
|
+
return () => {
|
|
1074
|
+
if (originalDefinition) {
|
|
1075
|
+
serviceLocator2.registerAbstractFactory(token, originalDefinition);
|
|
1076
|
+
}
|
|
1077
|
+
};
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
// packages/core/src/decorators/controller.decorator.mts
|
|
1081
|
+
function Controller({ guards } = {}) {
|
|
1082
|
+
return function(target, context) {
|
|
1083
|
+
if (context.kind !== "class") {
|
|
1084
|
+
throw new Error(
|
|
1085
|
+
"[Navios] @Controller decorator can only be used on classes."
|
|
1086
|
+
);
|
|
1087
|
+
}
|
|
1088
|
+
const token = InjectionToken.create(target);
|
|
1089
|
+
if (context.metadata) {
|
|
1090
|
+
const controllerMetadata = getControllerMetadata(target, context);
|
|
1091
|
+
if (guards) {
|
|
1092
|
+
for (const guard of Array.from(guards).reverse()) {
|
|
1093
|
+
controllerMetadata.guards.add(guard);
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
return Injectable({
|
|
1098
|
+
token,
|
|
1099
|
+
type: "Class" /* Class */,
|
|
1100
|
+
scope: "Instance" /* Instance */
|
|
1101
|
+
})(target, context);
|
|
1102
|
+
};
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
// packages/core/src/decorators/endpoint.decorator.mts
|
|
1106
|
+
function Endpoint(endpoint) {
|
|
1107
|
+
return (target, context) => {
|
|
1108
|
+
if (typeof target !== "function") {
|
|
1109
|
+
throw new Error(
|
|
1110
|
+
"[Navios] Endpoint decorator can only be used on functions."
|
|
1111
|
+
);
|
|
1112
|
+
}
|
|
1113
|
+
if (context.kind !== "method") {
|
|
1114
|
+
throw new Error(
|
|
1115
|
+
"[Navios] Endpoint decorator can only be used on methods."
|
|
1116
|
+
);
|
|
1117
|
+
}
|
|
1118
|
+
const config = endpoint.config;
|
|
1119
|
+
if (context.metadata) {
|
|
1120
|
+
let endpointMetadata = getEndpointMetadata(target, context);
|
|
1121
|
+
if (endpointMetadata.config && endpointMetadata.config.url) {
|
|
1122
|
+
throw new Error(
|
|
1123
|
+
`[Navios] Endpoint ${config.method} ${config.url} already exists. Please use a different method or url.`
|
|
1124
|
+
);
|
|
1125
|
+
}
|
|
1126
|
+
endpointMetadata.config = config;
|
|
1127
|
+
endpointMetadata.classMethod = target.name;
|
|
1128
|
+
endpointMetadata.httpMethod = config.method;
|
|
1129
|
+
endpointMetadata.url = config.url;
|
|
1130
|
+
}
|
|
1131
|
+
return target;
|
|
1132
|
+
};
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
// packages/core/src/decorators/module.decorator.mts
|
|
1136
|
+
function Module(metadata) {
|
|
1137
|
+
return (target, context) => {
|
|
1138
|
+
if (context.kind !== "class") {
|
|
1139
|
+
throw new Error("[Navios] @Module decorator can only be used on classes.");
|
|
1140
|
+
}
|
|
1141
|
+
const token = InjectionToken.create(target);
|
|
1142
|
+
const moduleMetadata = getModuleMetadata(target, context);
|
|
1143
|
+
if (metadata.controllers) {
|
|
1144
|
+
for (const controller of metadata.controllers) {
|
|
1145
|
+
moduleMetadata.controllers.add(controller);
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
if (metadata.imports) {
|
|
1149
|
+
for (const importedModule of metadata.imports) {
|
|
1150
|
+
moduleMetadata.imports.add(importedModule);
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
if (metadata.guards) {
|
|
1154
|
+
for (const guard of Array.from(metadata.guards).reverse()) {
|
|
1155
|
+
moduleMetadata.guards.add(guard);
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
return Injectable({
|
|
1159
|
+
token,
|
|
1160
|
+
type: "Class" /* Class */,
|
|
1161
|
+
scope: "Singleton" /* Singleton */
|
|
1162
|
+
})(target, context);
|
|
1163
|
+
};
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
// packages/core/src/decorators/use-guards.decorator.mts
|
|
1167
|
+
function UseGuards(...guards) {
|
|
1168
|
+
return function(target, context) {
|
|
1169
|
+
if (context.kind === "class") {
|
|
1170
|
+
const controllerMetadata = getControllerMetadata(
|
|
1171
|
+
target,
|
|
1172
|
+
context
|
|
1173
|
+
);
|
|
1174
|
+
for (const guard of guards.reverse()) {
|
|
1175
|
+
controllerMetadata.guards.add(guard);
|
|
1176
|
+
}
|
|
1177
|
+
} else if (context.kind === "method") {
|
|
1178
|
+
const endpointMetadata = getEndpointMetadata(target, context);
|
|
1179
|
+
for (const guard of guards.reverse()) {
|
|
1180
|
+
endpointMetadata.guards.add(guard);
|
|
1181
|
+
}
|
|
1182
|
+
} else {
|
|
1183
|
+
throw new Error(
|
|
1184
|
+
"[Navios] @UseGuards decorator can only be used on classes or methods."
|
|
1185
|
+
);
|
|
1186
|
+
}
|
|
1187
|
+
return target;
|
|
1188
|
+
};
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
// packages/core/src/exceptions/http.exception.mts
|
|
1192
|
+
var HttpException = class {
|
|
1193
|
+
constructor(statusCode, response, error) {
|
|
1194
|
+
this.statusCode = statusCode;
|
|
1195
|
+
this.response = response;
|
|
1196
|
+
this.error = error;
|
|
1197
|
+
}
|
|
1198
|
+
};
|
|
1199
|
+
|
|
1200
|
+
// packages/core/src/exceptions/bad-request.exception.mts
|
|
1201
|
+
var BadRequestException = class extends HttpException {
|
|
1202
|
+
constructor(message) {
|
|
1203
|
+
super(400, message);
|
|
1204
|
+
}
|
|
1205
|
+
};
|
|
1206
|
+
|
|
1207
|
+
// packages/core/src/exceptions/forbidden.exception.mts
|
|
1208
|
+
var ForbiddenException = class extends HttpException {
|
|
1209
|
+
constructor(message) {
|
|
1210
|
+
super(403, message);
|
|
1211
|
+
}
|
|
1212
|
+
};
|
|
1213
|
+
|
|
1214
|
+
// packages/core/src/exceptions/internal-server-error.exception.mts
|
|
1215
|
+
var InternalServerErrorException = class extends HttpException {
|
|
1216
|
+
constructor(message, error) {
|
|
1217
|
+
super(500, message, error);
|
|
1218
|
+
}
|
|
1219
|
+
};
|
|
1220
|
+
|
|
1221
|
+
// packages/core/src/exceptions/not-found.exception.mts
|
|
1222
|
+
var NotFoundException = class extends HttpException {
|
|
1223
|
+
constructor(response, error) {
|
|
1224
|
+
super(404, response, error);
|
|
1225
|
+
this.response = response;
|
|
1226
|
+
this.error = error;
|
|
1227
|
+
}
|
|
1228
|
+
};
|
|
1229
|
+
|
|
1230
|
+
// packages/core/src/exceptions/unauthorized.exception.mts
|
|
1231
|
+
var UnauthorizedException = class extends HttpException {
|
|
1232
|
+
constructor(message, error) {
|
|
1233
|
+
super(401, message, error);
|
|
1234
|
+
}
|
|
1235
|
+
};
|
|
1236
|
+
|
|
1237
|
+
// packages/core/src/exceptions/conflict.exception.mts
|
|
1238
|
+
var ConflictException = class extends HttpException {
|
|
1239
|
+
constructor(message, error) {
|
|
1240
|
+
super(409, message, error);
|
|
1241
|
+
}
|
|
1242
|
+
};
|
|
1243
|
+
|
|
1244
|
+
// packages/core/src/tokens/application.token.mts
|
|
1245
|
+
var ApplicationInjectionToken = "ApplicationInjectionToken";
|
|
1246
|
+
var Application = InjectionToken.create(
|
|
1247
|
+
ApplicationInjectionToken
|
|
1248
|
+
);
|
|
1249
|
+
|
|
1250
|
+
// packages/core/src/tokens/execution-context.token.mts
|
|
1251
|
+
var ExecutionContextInjectionToken = "ExecutionContextInjectionToken";
|
|
1252
|
+
var ExecutionContextToken = InjectionToken.create(
|
|
1253
|
+
ExecutionContextInjectionToken
|
|
1254
|
+
);
|
|
1255
|
+
|
|
1256
|
+
// packages/core/src/tokens/reply.token.mts
|
|
1257
|
+
var ReplyInjectionToken = "ReplyInjectionToken";
|
|
1258
|
+
var Reply = InjectionToken.create(ReplyInjectionToken);
|
|
1259
|
+
|
|
1260
|
+
// packages/core/src/tokens/request.token.mts
|
|
1261
|
+
var RequestInjectionToken = "RequestInjectionToken";
|
|
1262
|
+
var Request = InjectionToken.create(
|
|
1263
|
+
RequestInjectionToken
|
|
1264
|
+
);
|
|
1265
|
+
|
|
1266
|
+
// packages/core/src/services/execution-context.mts
|
|
1267
|
+
var ExecutionContext2 = class {
|
|
1268
|
+
constructor(module2, controller, handler) {
|
|
1269
|
+
this.module = module2;
|
|
1270
|
+
this.controller = controller;
|
|
1271
|
+
this.handler = handler;
|
|
1272
|
+
}
|
|
1273
|
+
request;
|
|
1274
|
+
reply;
|
|
1275
|
+
getModule() {
|
|
1276
|
+
return this.module;
|
|
1277
|
+
}
|
|
1278
|
+
getController() {
|
|
1279
|
+
return this.controller;
|
|
1280
|
+
}
|
|
1281
|
+
getHandler() {
|
|
1282
|
+
return this.handler;
|
|
1283
|
+
}
|
|
1284
|
+
getRequest() {
|
|
1285
|
+
if (!this.request) {
|
|
1286
|
+
throw new Error(
|
|
1287
|
+
"[Navios] Request is not set. Make sure to set it before using it."
|
|
1288
|
+
);
|
|
1289
|
+
}
|
|
1290
|
+
return this.request;
|
|
1291
|
+
}
|
|
1292
|
+
getReply() {
|
|
1293
|
+
if (!this.reply) {
|
|
1294
|
+
throw new Error(
|
|
1295
|
+
"[Navios] Reply is not set. Make sure to set it before using it."
|
|
1296
|
+
);
|
|
1297
|
+
}
|
|
1298
|
+
return this.reply;
|
|
1299
|
+
}
|
|
1300
|
+
provideRequest(request) {
|
|
1301
|
+
this.request = request;
|
|
1302
|
+
}
|
|
1303
|
+
provideReply(reply) {
|
|
1304
|
+
this.reply = reply;
|
|
1305
|
+
}
|
|
1306
|
+
};
|
|
1307
|
+
|
|
1308
|
+
// packages/core/src/services/guard-runner.service.mts
|
|
1309
|
+
var _GuardRunnerService_decorators, _init;
|
|
1310
|
+
_GuardRunnerService_decorators = [Injectable()];
|
|
1311
|
+
var GuardRunnerService = class {
|
|
1312
|
+
async runGuards(allGuards, executionContext) {
|
|
1313
|
+
let canActivate = true;
|
|
1314
|
+
for (const guard of Array.from(allGuards).reverse()) {
|
|
1315
|
+
const guardInstance = await inject(
|
|
1316
|
+
guard
|
|
1317
|
+
);
|
|
1318
|
+
if (!guardInstance.canActivate) {
|
|
1319
|
+
throw new Error(
|
|
1320
|
+
`[Navios] Guard ${guard.name} does not implement canActivate()`
|
|
1321
|
+
);
|
|
1322
|
+
}
|
|
1323
|
+
try {
|
|
1324
|
+
canActivate = await guardInstance.canActivate(executionContext);
|
|
1325
|
+
if (!canActivate) {
|
|
1326
|
+
break;
|
|
1327
|
+
}
|
|
1328
|
+
} catch (error) {
|
|
1329
|
+
if (error instanceof HttpException) {
|
|
1330
|
+
executionContext.getReply().status(error.statusCode).send(error.response);
|
|
1331
|
+
return false;
|
|
1332
|
+
} else {
|
|
1333
|
+
executionContext.getReply().status(500).send({
|
|
1334
|
+
message: "Internal server error",
|
|
1335
|
+
error: error.message
|
|
1336
|
+
});
|
|
1337
|
+
return false;
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
if (!canActivate) {
|
|
1342
|
+
executionContext.getReply().status(403).send({
|
|
1343
|
+
message: "Forbidden"
|
|
1344
|
+
});
|
|
1345
|
+
return false;
|
|
1346
|
+
}
|
|
1347
|
+
return canActivate;
|
|
1348
|
+
}
|
|
1349
|
+
makeContext(executionContext) {
|
|
1350
|
+
const guards = /* @__PURE__ */ new Set();
|
|
1351
|
+
const endpointGuards = executionContext.getHandler().guards;
|
|
1352
|
+
const controllerGuards = executionContext.getController().guards;
|
|
1353
|
+
const moduleGuards = executionContext.getModule().guards;
|
|
1354
|
+
if (endpointGuards.size > 0) {
|
|
1355
|
+
for (const guard of endpointGuards) {
|
|
1356
|
+
guards.add(guard);
|
|
1357
|
+
}
|
|
1358
|
+
}
|
|
1359
|
+
if (controllerGuards.size > 0) {
|
|
1360
|
+
for (const guard of controllerGuards) {
|
|
1361
|
+
guards.add(guard);
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
if (moduleGuards.size > 0) {
|
|
1365
|
+
for (const guard of moduleGuards) {
|
|
1366
|
+
guards.add(guard);
|
|
1367
|
+
}
|
|
1368
|
+
}
|
|
1369
|
+
return guards;
|
|
1370
|
+
}
|
|
1371
|
+
};
|
|
1372
|
+
_init = __decoratorStart(null);
|
|
1373
|
+
GuardRunnerService = __decorateElement(_init, 0, "GuardRunnerService", _GuardRunnerService_decorators, GuardRunnerService);
|
|
1374
|
+
__runInitializers(_init, 1, GuardRunnerService);
|
|
1375
|
+
|
|
1376
|
+
// packages/core/src/services/controller-adapter.service.mts
|
|
1377
|
+
var _ControllerAdapterService_decorators, _init2;
|
|
1378
|
+
_ControllerAdapterService_decorators = [Injectable()];
|
|
1379
|
+
var ControllerAdapterService = class {
|
|
1380
|
+
guardRunner = syncInject(GuardRunnerService);
|
|
1381
|
+
setupController(controller, instance, moduleMetadata) {
|
|
1382
|
+
const controllerMetadata = extractControllerMetadata(controller);
|
|
1383
|
+
for (const endpoint of controllerMetadata.endpoints) {
|
|
1384
|
+
const { classMethod, url, httpMethod, config } = endpoint;
|
|
1385
|
+
if (!url || !config) {
|
|
1386
|
+
throw new Error(
|
|
1387
|
+
`[Navios] Malformed Endpoint ${controller.name}:${classMethod}`
|
|
1388
|
+
);
|
|
1389
|
+
}
|
|
1390
|
+
const executionContext = new ExecutionContext2(
|
|
1391
|
+
moduleMetadata,
|
|
1392
|
+
controllerMetadata,
|
|
1393
|
+
endpoint
|
|
1394
|
+
);
|
|
1395
|
+
const guards = this.guardRunner.makeContext(executionContext);
|
|
1396
|
+
const { querySchema, requestSchema, responseSchema } = config;
|
|
1397
|
+
const schema = {};
|
|
1398
|
+
if (querySchema) {
|
|
1399
|
+
schema.querystring = querySchema;
|
|
1400
|
+
}
|
|
1401
|
+
if (requestSchema) {
|
|
1402
|
+
schema.body = requestSchema;
|
|
1403
|
+
}
|
|
1404
|
+
if (responseSchema) {
|
|
1405
|
+
schema.response = {
|
|
1406
|
+
200: responseSchema
|
|
1407
|
+
};
|
|
1408
|
+
}
|
|
1409
|
+
instance.withTypeProvider().route({
|
|
1410
|
+
method: httpMethod,
|
|
1411
|
+
url: url.replaceAll("$", ":"),
|
|
1412
|
+
schema,
|
|
1413
|
+
preHandler: async (request, reply) => {
|
|
1414
|
+
if (guards.size > 0) {
|
|
1415
|
+
getServiceLocator().registerInstance(Request, request);
|
|
1416
|
+
getServiceLocator().registerInstance(Reply, reply);
|
|
1417
|
+
getServiceLocator().registerInstance(
|
|
1418
|
+
ExecutionContextToken,
|
|
1419
|
+
executionContext
|
|
1420
|
+
);
|
|
1421
|
+
executionContext.provideRequest(request);
|
|
1422
|
+
executionContext.provideReply(reply);
|
|
1423
|
+
const canActivate = await this.guardRunner.runGuards(
|
|
1424
|
+
guards,
|
|
1425
|
+
executionContext
|
|
1426
|
+
);
|
|
1427
|
+
getServiceLocator().removeInstance(Request);
|
|
1428
|
+
getServiceLocator().removeInstance(Reply);
|
|
1429
|
+
getServiceLocator().removeInstance(ExecutionContextToken);
|
|
1430
|
+
if (!canActivate) {
|
|
1431
|
+
return reply;
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
},
|
|
1435
|
+
handler: async (request, reply) => {
|
|
1436
|
+
getServiceLocator().registerInstance(Request, request);
|
|
1437
|
+
getServiceLocator().registerInstance(Reply, reply);
|
|
1438
|
+
getServiceLocator().registerInstance(
|
|
1439
|
+
ExecutionContextToken,
|
|
1440
|
+
executionContext
|
|
1441
|
+
);
|
|
1442
|
+
executionContext.provideRequest(request);
|
|
1443
|
+
executionContext.provideReply(reply);
|
|
1444
|
+
const controllerInstance = await inject(controller);
|
|
1445
|
+
try {
|
|
1446
|
+
const { query, params, body } = request;
|
|
1447
|
+
const argument = {};
|
|
1448
|
+
if (query && Object.keys(query).length > 0) {
|
|
1449
|
+
argument.params = query;
|
|
1450
|
+
}
|
|
1451
|
+
if (params && Object.keys(params).length > 0) {
|
|
1452
|
+
argument.urlParams = params;
|
|
1453
|
+
}
|
|
1454
|
+
if (body) {
|
|
1455
|
+
argument.data = body;
|
|
1456
|
+
}
|
|
1457
|
+
const result = await controllerInstance[classMethod](argument);
|
|
1458
|
+
reply.status(200).send(result);
|
|
1459
|
+
} catch (error) {
|
|
1460
|
+
if (error instanceof HttpException) {
|
|
1461
|
+
reply.status(error.statusCode).send(error.response);
|
|
1462
|
+
} else {
|
|
1463
|
+
reply.status(500).send({
|
|
1464
|
+
message: "Internal server error",
|
|
1465
|
+
error: error.message
|
|
1466
|
+
});
|
|
1467
|
+
}
|
|
1468
|
+
} finally {
|
|
1469
|
+
getServiceLocator().removeInstance(Request);
|
|
1470
|
+
getServiceLocator().removeInstance(Reply);
|
|
1471
|
+
getServiceLocator().removeInstance(ExecutionContextToken);
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1474
|
+
});
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1477
|
+
};
|
|
1478
|
+
_init2 = __decoratorStart(null);
|
|
1479
|
+
ControllerAdapterService = __decorateElement(_init2, 0, "ControllerAdapterService", _ControllerAdapterService_decorators, ControllerAdapterService);
|
|
1480
|
+
__runInitializers(_init2, 1, ControllerAdapterService);
|
|
1481
|
+
|
|
1482
|
+
// packages/core/src/services/module-loader.service.mts
|
|
1483
|
+
var _ModuleLoaderService_decorators, _init3;
|
|
1484
|
+
_ModuleLoaderService_decorators = [Injectable()];
|
|
1485
|
+
var ModuleLoaderService = class {
|
|
1486
|
+
modulesMetadata = /* @__PURE__ */ new Map();
|
|
1487
|
+
loadedModules = /* @__PURE__ */ new Map();
|
|
1488
|
+
initialized = false;
|
|
1489
|
+
async loadModules(appModule) {
|
|
1490
|
+
if (this.initialized) {
|
|
1491
|
+
return;
|
|
1492
|
+
}
|
|
1493
|
+
await this.traverseModules(appModule);
|
|
1494
|
+
this.initialized = true;
|
|
1495
|
+
}
|
|
1496
|
+
async traverseModules(module2, parentMetadata) {
|
|
1497
|
+
const metadata = extractModuleMetadata(module2);
|
|
1498
|
+
if (parentMetadata) {
|
|
1499
|
+
this.mergeMetadata(metadata, parentMetadata);
|
|
1500
|
+
}
|
|
1501
|
+
const moduleName = module2.name;
|
|
1502
|
+
if (this.modulesMetadata.has(moduleName)) {
|
|
1503
|
+
return;
|
|
1504
|
+
}
|
|
1505
|
+
this.modulesMetadata.set(moduleName, metadata);
|
|
1506
|
+
const imports = metadata.imports ?? /* @__PURE__ */ new Set();
|
|
1507
|
+
const loadingPromises = Array.from(imports).map(
|
|
1508
|
+
async (importedModule) => this.traverseModules(importedModule, metadata)
|
|
1509
|
+
);
|
|
1510
|
+
await Promise.all(loadingPromises);
|
|
1511
|
+
const instance = await inject(module2);
|
|
1512
|
+
if (instance.onModuleInit) {
|
|
1513
|
+
await instance.onModuleInit();
|
|
1514
|
+
}
|
|
1515
|
+
this.loadedModules.set(moduleName, instance);
|
|
1516
|
+
}
|
|
1517
|
+
mergeMetadata(metadata, parentMetadata) {
|
|
1518
|
+
if (parentMetadata.guards) {
|
|
1519
|
+
for (const guard of parentMetadata.guards) {
|
|
1520
|
+
metadata.guards.add(guard);
|
|
1521
|
+
}
|
|
1522
|
+
}
|
|
1523
|
+
if (parentMetadata.customAttributes) {
|
|
1524
|
+
for (const [key, value] of parentMetadata.customAttributes) {
|
|
1525
|
+
if (metadata.customAttributes.has(key)) {
|
|
1526
|
+
continue;
|
|
1527
|
+
}
|
|
1528
|
+
metadata.customAttributes.set(key, value);
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
}
|
|
1532
|
+
getAllModules() {
|
|
1533
|
+
return this.modulesMetadata;
|
|
1534
|
+
}
|
|
1535
|
+
};
|
|
1536
|
+
_init3 = __decoratorStart(null);
|
|
1537
|
+
ModuleLoaderService = __decorateElement(_init3, 0, "ModuleLoaderService", _ModuleLoaderService_decorators, ModuleLoaderService);
|
|
1538
|
+
__runInitializers(_init3, 1, ModuleLoaderService);
|
|
1539
|
+
|
|
1540
|
+
// packages/core/src/attribute.factory.mts
|
|
1541
|
+
var AttributeFactory = class {
|
|
1542
|
+
static createAttribute(token, schema) {
|
|
1543
|
+
const res = (value) => (target, context) => {
|
|
1544
|
+
if (context.kind !== "class" && context.kind !== "method") {
|
|
1545
|
+
throw new Error(
|
|
1546
|
+
"[Navios] Attribute can only be applied to classes or methods"
|
|
1547
|
+
);
|
|
1548
|
+
}
|
|
1549
|
+
const isController = context.kind === "class" && hasControllerMetadata(target);
|
|
1550
|
+
const isModule = context.kind === "class" && hasModuleMetadata(target);
|
|
1551
|
+
if (context.kind === "class" && !isController && !isModule) {
|
|
1552
|
+
throw new Error(
|
|
1553
|
+
"[Navios] Attribute can only be applied to classes with @Controller or @Module decorators"
|
|
1554
|
+
);
|
|
1555
|
+
}
|
|
1556
|
+
let metadata = context.kind === "class" ? isController ? getControllerMetadata(target, context) : getModuleMetadata(target, context) : getEndpointMetadata(target, context);
|
|
1557
|
+
if (schema) {
|
|
1558
|
+
const validatedValue = schema.safeParse(value);
|
|
1559
|
+
if (!validatedValue.success) {
|
|
1560
|
+
throw new Error(
|
|
1561
|
+
`[Navios] Invalid value for attribute ${token.toString()}: ${validatedValue.error}`
|
|
1562
|
+
);
|
|
1563
|
+
}
|
|
1564
|
+
metadata.customAttributes.set(token, validatedValue.data);
|
|
1565
|
+
} else {
|
|
1566
|
+
metadata.customAttributes.set(token, true);
|
|
1567
|
+
}
|
|
1568
|
+
return target;
|
|
1569
|
+
};
|
|
1570
|
+
res.token = token;
|
|
1571
|
+
if (schema) {
|
|
1572
|
+
res.schema = schema;
|
|
1573
|
+
}
|
|
1574
|
+
return res;
|
|
1575
|
+
}
|
|
1576
|
+
static get(attribute, target) {
|
|
1577
|
+
return target.customAttributes.get(attribute.token) ?? null;
|
|
1578
|
+
}
|
|
1579
|
+
static getAll(attribute, target) {
|
|
1580
|
+
const values = Array.from(target.customAttributes.entries()).filter(([key]) => key === attribute.token).map(([, value]) => value);
|
|
1581
|
+
return values.length > 0 ? values : null;
|
|
1582
|
+
}
|
|
1583
|
+
static getLast(attribute, target) {
|
|
1584
|
+
for (let i = target.length - 1; i >= 0; i--) {
|
|
1585
|
+
const value = target[i].customAttributes.get(attribute.token);
|
|
1586
|
+
if (value) {
|
|
1587
|
+
return value;
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
return null;
|
|
1591
|
+
}
|
|
1592
|
+
static has(attribute, target) {
|
|
1593
|
+
return target.customAttributes.has(attribute.token);
|
|
1594
|
+
}
|
|
1595
|
+
};
|
|
1596
|
+
|
|
1597
|
+
// packages/core/src/navios.application.mts
|
|
1598
|
+
var import_cors = __toESM(require("@fastify/cors"), 1);
|
|
1599
|
+
var import_fastify = require("fastify");
|
|
1600
|
+
var import_fastify_type_provider_zod = require("fastify-type-provider-zod");
|
|
1601
|
+
var _NaviosApplication_decorators, _init4;
|
|
1602
|
+
_NaviosApplication_decorators = [Injectable()];
|
|
1603
|
+
var NaviosApplication = class {
|
|
1604
|
+
moduleLoader = syncInject(ModuleLoaderService);
|
|
1605
|
+
controllerAdapter = syncInject(ControllerAdapterService);
|
|
1606
|
+
server = null;
|
|
1607
|
+
corsOptions = null;
|
|
1608
|
+
globalPrefix = null;
|
|
1609
|
+
appModule = null;
|
|
1610
|
+
options = {};
|
|
1611
|
+
setup(appModule, options = {}) {
|
|
1612
|
+
this.appModule = appModule;
|
|
1613
|
+
this.options = options;
|
|
1614
|
+
}
|
|
1615
|
+
async init() {
|
|
1616
|
+
if (!this.appModule) {
|
|
1617
|
+
throw new Error("App module is not set. Call setAppModule() first.");
|
|
1618
|
+
}
|
|
1619
|
+
await this.moduleLoader.loadModules(this.appModule);
|
|
1620
|
+
this.server = (0, import_fastify.fastify)(this.options);
|
|
1621
|
+
getServiceLocator().registerInstance(Application, this.server);
|
|
1622
|
+
this.server.setValidatorCompiler(import_fastify_type_provider_zod.validatorCompiler);
|
|
1623
|
+
this.server.setSerializerCompiler(import_fastify_type_provider_zod.serializerCompiler);
|
|
1624
|
+
if (this.corsOptions) {
|
|
1625
|
+
await this.server.register(import_cors.default, this.corsOptions);
|
|
1626
|
+
}
|
|
1627
|
+
const modules = this.moduleLoader.getAllModules();
|
|
1628
|
+
const globalPrefix = this.globalPrefix ?? "";
|
|
1629
|
+
for (const [moduleName, moduleMetadata] of modules) {
|
|
1630
|
+
if (!moduleMetadata.controllers || moduleMetadata.controllers.size === 0) {
|
|
1631
|
+
continue;
|
|
1632
|
+
}
|
|
1633
|
+
this.server.register(
|
|
1634
|
+
(instance, opts, done) => {
|
|
1635
|
+
for (const controller of moduleMetadata.controllers) {
|
|
1636
|
+
this.controllerAdapter.setupController(
|
|
1637
|
+
controller,
|
|
1638
|
+
instance,
|
|
1639
|
+
moduleMetadata
|
|
1640
|
+
);
|
|
1641
|
+
}
|
|
1642
|
+
done();
|
|
1643
|
+
},
|
|
1644
|
+
{
|
|
1645
|
+
prefix: globalPrefix
|
|
1646
|
+
}
|
|
1647
|
+
);
|
|
1648
|
+
}
|
|
1649
|
+
}
|
|
1650
|
+
enableCors(options) {
|
|
1651
|
+
var _a;
|
|
1652
|
+
this.corsOptions = options;
|
|
1653
|
+
(_a = this.server) == null ? void 0 : _a.register;
|
|
1654
|
+
}
|
|
1655
|
+
setGlobalPrefix(prefix) {
|
|
1656
|
+
this.globalPrefix = prefix;
|
|
1657
|
+
}
|
|
1658
|
+
getServer() {
|
|
1659
|
+
if (!this.server) {
|
|
1660
|
+
throw new Error("Server is not initialized. Call init() first.");
|
|
1661
|
+
}
|
|
1662
|
+
return this.server;
|
|
1663
|
+
}
|
|
1664
|
+
async listen(options) {
|
|
1665
|
+
if (!this.server) {
|
|
1666
|
+
throw new Error("Server is not initialized. Call init() first.");
|
|
1667
|
+
}
|
|
1668
|
+
await this.server.listen(options);
|
|
1669
|
+
}
|
|
1670
|
+
};
|
|
1671
|
+
_init4 = __decoratorStart(null);
|
|
1672
|
+
NaviosApplication = __decorateElement(_init4, 0, "NaviosApplication", _NaviosApplication_decorators, NaviosApplication);
|
|
1673
|
+
__runInitializers(_init4, 1, NaviosApplication);
|
|
1674
|
+
|
|
1675
|
+
// packages/core/src/navios.factory.mts
|
|
1676
|
+
var NaviosFactory = class {
|
|
1677
|
+
static async create(appModule, options = {}) {
|
|
1678
|
+
const app = await inject(NaviosApplication);
|
|
1679
|
+
app.setup(appModule, options);
|
|
1680
|
+
return app;
|
|
1681
|
+
}
|
|
1682
|
+
};
|
|
1683
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
1684
|
+
0 && (module.exports = {
|
|
1685
|
+
Application,
|
|
1686
|
+
AttributeFactory,
|
|
1687
|
+
BadRequestException,
|
|
1688
|
+
ConflictException,
|
|
1689
|
+
Controller,
|
|
1690
|
+
ControllerAdapterService,
|
|
1691
|
+
ControllerMetadataKey,
|
|
1692
|
+
Endpoint,
|
|
1693
|
+
EndpointMetadataKey,
|
|
1694
|
+
ErrorsEnum,
|
|
1695
|
+
EventEmitter,
|
|
1696
|
+
ExecutionContext,
|
|
1697
|
+
ExecutionContextInjectionToken,
|
|
1698
|
+
ExecutionContextToken,
|
|
1699
|
+
FactoryNotFound,
|
|
1700
|
+
ForbiddenException,
|
|
1701
|
+
GuardRunnerService,
|
|
1702
|
+
HttpException,
|
|
1703
|
+
Injectable,
|
|
1704
|
+
InjectableScope,
|
|
1705
|
+
InjectableTokenMeta,
|
|
1706
|
+
InjectableType,
|
|
1707
|
+
InjectionToken,
|
|
1708
|
+
InstanceDestroying,
|
|
1709
|
+
InstanceExpired,
|
|
1710
|
+
InstanceNotFound,
|
|
1711
|
+
InternalServerErrorException,
|
|
1712
|
+
Module,
|
|
1713
|
+
ModuleLoaderService,
|
|
1714
|
+
ModuleMetadataKey,
|
|
1715
|
+
NaviosApplication,
|
|
1716
|
+
NaviosFactory,
|
|
1717
|
+
NotFoundException,
|
|
1718
|
+
Reply,
|
|
1719
|
+
Request,
|
|
1720
|
+
ServiceLocator,
|
|
1721
|
+
ServiceLocatorEventBus,
|
|
1722
|
+
ServiceLocatorInstanceHolderKind,
|
|
1723
|
+
ServiceLocatorInstanceHolderStatus,
|
|
1724
|
+
ServiceLocatorManager,
|
|
1725
|
+
UnauthorizedException,
|
|
1726
|
+
UnknownError,
|
|
1727
|
+
UseGuards,
|
|
1728
|
+
extractControllerMetadata,
|
|
1729
|
+
extractModuleMetadata,
|
|
1730
|
+
getAllEndpointMetadata,
|
|
1731
|
+
getControllerMetadata,
|
|
1732
|
+
getEndpointMetadata,
|
|
1733
|
+
getInjectableToken,
|
|
1734
|
+
getModuleMetadata,
|
|
1735
|
+
getServiceLocator,
|
|
1736
|
+
hasControllerMetadata,
|
|
1737
|
+
hasModuleMetadata,
|
|
1738
|
+
inject,
|
|
1739
|
+
override,
|
|
1740
|
+
provideServiceLocator,
|
|
1741
|
+
setPromiseCollector,
|
|
1742
|
+
syncInject
|
|
1743
|
+
});
|
|
1744
|
+
//# sourceMappingURL=index.js.map
|