@navios/core 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -77,9 +77,9 @@ __export(src_exports, {
77
77
  Application: () => Application,
78
78
  AttributeFactory: () => AttributeFactory,
79
79
  BadRequestException: () => BadRequestException,
80
+ BoundInjectionToken: () => BoundInjectionToken,
80
81
  ConfigProvider: () => ConfigProvider,
81
82
  ConfigProviderFactory: () => ConfigProviderFactory,
82
- ConfigProviderInjectionToken: () => ConfigProviderInjectionToken,
83
83
  ConfigProviderOptions: () => ConfigProviderOptions,
84
84
  ConfigServiceInstance: () => ConfigServiceInstance,
85
85
  ConflictException: () => ConflictException,
@@ -95,7 +95,9 @@ __export(src_exports, {
95
95
  ExecutionContext: () => ExecutionContext2,
96
96
  ExecutionContextInjectionToken: () => ExecutionContextInjectionToken,
97
97
  ExecutionContextToken: () => ExecutionContextToken,
98
+ FactoryInjectionToken: () => FactoryInjectionToken,
98
99
  FactoryNotFound: () => FactoryNotFound,
100
+ FactoryTokenNotResolved: () => FactoryTokenNotResolved,
99
101
  ForbiddenException: () => ForbiddenException,
100
102
  GuardRunnerService: () => GuardRunnerService,
101
103
  Header: () => Header,
@@ -161,10 +163,11 @@ __export(src_exports, {
161
163
  isString: () => isString,
162
164
  isSymbol: () => isSymbol,
163
165
  isUndefined: () => isUndefined,
164
- makeConfigToken: () => makeConfigToken,
165
166
  normalizePath: () => normalizePath,
166
167
  override: () => override,
168
+ provideConfig: () => provideConfig,
167
169
  provideServiceLocator: () => provideServiceLocator,
170
+ resolveService: () => resolveService,
168
171
  setPromiseCollector: () => setPromiseCollector,
169
172
  stripEndSlash: () => stripEndSlash,
170
173
  syncInject: () => syncInject,
@@ -283,6 +286,9 @@ var isSymbol = (val) => typeof val === "symbol";
283
286
  // packages/core/src/logger/console-logger.service.mts
284
287
  var import_util = require("util");
285
288
 
289
+ // packages/core/src/service-locator/decorators/injectable.decorator.mts
290
+ var import_common2 = require("@navios/common");
291
+
286
292
  // packages/core/src/service-locator/enums/injectable-scope.enum.mts
287
293
  var InjectableScope = /* @__PURE__ */ ((InjectableScope2) => {
288
294
  InjectableScope2["Singleton"] = "Singleton";
@@ -302,8 +308,38 @@ var InjectionToken = class _InjectionToken {
302
308
  static create(name2, schema) {
303
309
  return new _InjectionToken(name2, schema);
304
310
  }
305
- toString() {
306
- return this.name;
311
+ static bound(token, value) {
312
+ return new BoundInjectionToken(token, value);
313
+ }
314
+ static factory(token, factory) {
315
+ return new FactoryInjectionToken(token, factory);
316
+ }
317
+ static refineType(token) {
318
+ return token;
319
+ }
320
+ };
321
+ var BoundInjectionToken = class extends InjectionToken {
322
+ constructor(token, value) {
323
+ super(token.name, token.schema);
324
+ this.token = token;
325
+ this.value = value;
326
+ this.id = token.id;
327
+ }
328
+ };
329
+ var FactoryInjectionToken = class extends InjectionToken {
330
+ constructor(token, factory) {
331
+ super(token.name, token.schema);
332
+ this.token = token;
333
+ this.factory = factory;
334
+ }
335
+ value;
336
+ resolved = false;
337
+ async resolve() {
338
+ if (!this.value) {
339
+ this.value = await this.factory();
340
+ this.resolved = true;
341
+ }
342
+ return this.value;
307
343
  }
308
344
  };
309
345
 
@@ -314,6 +350,7 @@ var ErrorsEnum = /* @__PURE__ */ ((ErrorsEnum2) => {
314
350
  ErrorsEnum2["InstanceDestroying"] = "InstanceDestroying";
315
351
  ErrorsEnum2["UnknownError"] = "UnknownError";
316
352
  ErrorsEnum2["FactoryNotFound"] = "FactoryNotFound";
353
+ ErrorsEnum2["FactoryTokenNotResolved"] = "FactoryTokenNotResolved";
317
354
  return ErrorsEnum2;
318
355
  })(ErrorsEnum || {});
319
356
 
@@ -326,6 +363,14 @@ var FactoryNotFound = class extends Error {
326
363
  code = "FactoryNotFound" /* FactoryNotFound */;
327
364
  };
328
365
 
366
+ // packages/core/src/service-locator/errors/factory-token-not-resolved.mts
367
+ var FactoryTokenNotResolved = class extends Error {
368
+ code = "FactoryTokenNotResolved" /* FactoryTokenNotResolved */;
369
+ constructor(name2) {
370
+ super(`Factory token not resolved: ${name2.toString()}`);
371
+ }
372
+ };
373
+
329
374
  // packages/core/src/service-locator/errors/instance-destroying.mts
330
375
  var InstanceDestroying = class extends Error {
331
376
  constructor(name2) {
@@ -568,29 +613,48 @@ var ServiceLocator = class {
568
613
  this.instanceFactories.delete(token);
569
614
  }
570
615
  }
571
- getInstanceIdentifier(token, args) {
572
- var _a;
573
- const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
574
- if (validatedArgs && !validatedArgs.success) {
575
- (_a = this.logger) == null ? void 0 : _a.error(
576
- `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
577
- validatedArgs.error
578
- );
579
- throw new UnknownError(validatedArgs.error);
616
+ resolveTokenArgs(token, args) {
617
+ var _a, _b;
618
+ let realArgs = args;
619
+ if (token instanceof BoundInjectionToken) {
620
+ realArgs = token.value;
621
+ } else if (token instanceof FactoryInjectionToken) {
622
+ if (token.resolved) {
623
+ realArgs = token.value;
624
+ } else {
625
+ return [new FactoryTokenNotResolved(token.name)];
626
+ }
580
627
  }
581
- return this.makeInstanceName(token, validatedArgs);
582
- }
583
- async getInstance(token, args) {
584
- var _a, _b, _c;
585
- const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
628
+ if (!token.schema) {
629
+ return [void 0, realArgs];
630
+ }
631
+ const validatedArgs = (_a = token.schema) == null ? void 0 : _a.safeParse(realArgs);
586
632
  if (validatedArgs && !validatedArgs.success) {
587
- (_a = this.logger) == null ? void 0 : _a.error(
633
+ (_b = this.logger) == null ? void 0 : _b.error(
588
634
  `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
589
635
  validatedArgs.error
590
636
  );
591
637
  return [new UnknownError(validatedArgs.error)];
592
638
  }
593
- const instanceName = this.makeInstanceName(token, validatedArgs);
639
+ return [void 0, validatedArgs == null ? void 0 : validatedArgs.data];
640
+ }
641
+ getInstanceIdentifier(token, args) {
642
+ const [err, realArgs] = this.resolveTokenArgs(token, args);
643
+ if (err) {
644
+ throw err;
645
+ }
646
+ return this.makeInstanceName(token, realArgs);
647
+ }
648
+ async getInstance(token, args) {
649
+ var _a, _b;
650
+ const [err, realArgs] = this.resolveTokenArgs(token, args);
651
+ if (err instanceof UnknownError) {
652
+ throw err;
653
+ } else if (err instanceof FactoryTokenNotResolved && token instanceof FactoryInjectionToken) {
654
+ await token.resolve();
655
+ return this.getInstance(token, args);
656
+ }
657
+ const instanceName = this.makeInstanceName(token, realArgs);
594
658
  const [error, holder] = this.manager.get(instanceName);
595
659
  if (!error) {
596
660
  if (holder.status === "creating" /* Creating */) {
@@ -602,13 +666,13 @@ var ServiceLocator = class {
602
666
  }
603
667
  switch (error.code) {
604
668
  case "InstanceDestroying" /* InstanceDestroying */:
605
- (_b = this.logger) == null ? void 0 : _b.log(
669
+ (_a = this.logger) == null ? void 0 : _a.log(
606
670
  `[ServiceLocator]#getInstance() TTL expired for ${holder == null ? void 0 : holder.name}`
607
671
  );
608
672
  await (holder == null ? void 0 : holder.destroyPromise);
609
673
  return this.getInstance(token, args);
610
674
  case "InstanceExpired" /* InstanceExpired */:
611
- (_c = this.logger) == null ? void 0 : _c.log(
675
+ (_b = this.logger) == null ? void 0 : _b.log(
612
676
  `[ServiceLocator]#getInstance() TTL expired for ${holder == null ? void 0 : holder.name}`
613
677
  );
614
678
  await this.invalidate(instanceName);
@@ -618,7 +682,7 @@ var ServiceLocator = class {
618
682
  default:
619
683
  return [error];
620
684
  }
621
- return this.createInstance(instanceName, token, args);
685
+ return this.createInstance(instanceName, token, realArgs);
622
686
  }
623
687
  async getOrThrowInstance(token, args) {
624
688
  const [error, instance] = await this.getInstance(token, args);
@@ -639,10 +703,15 @@ var ServiceLocator = class {
639
703
  (_a = this.logger) == null ? void 0 : _a.log(
640
704
  `[ServiceLocator]#createInstance() Creating instance for ${instanceName}`
641
705
  );
642
- if (this.abstractFactories.has(token) || this.instanceFactories.has(token)) {
643
- return this.createInstanceFromAbstractFactory(instanceName, token, args);
706
+ let realToken = token instanceof BoundInjectionToken || token instanceof FactoryInjectionToken ? token.token : token;
707
+ if (this.abstractFactories.has(realToken) || this.instanceFactories.has(realToken)) {
708
+ return this.createInstanceFromAbstractFactory(
709
+ instanceName,
710
+ realToken,
711
+ args
712
+ );
644
713
  } else {
645
- return [new FactoryNotFound(token.name.toString())];
714
+ return [new FactoryNotFound(realToken.name.toString())];
646
715
  }
647
716
  }
648
717
  async createInstanceFromAbstractFactory(instanceName, token, args) {
@@ -689,7 +758,7 @@ var ServiceLocator = class {
689
758
  );
690
759
  });
691
760
  }
692
- if (holder.ttl === 0) {
761
+ if (holder.ttl === 0 || !shouldStore) {
693
762
  await this.invalidate(instanceName);
694
763
  }
695
764
  await this.notifyListeners(instanceName);
@@ -761,16 +830,11 @@ var ServiceLocator = class {
761
830
  };
762
831
  }
763
832
  getSyncInstance(token, args) {
764
- var _a;
765
- const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
766
- if (validatedArgs && !validatedArgs.success) {
767
- (_a = this.logger) == null ? void 0 : _a.error(
768
- `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
769
- validatedArgs.error
770
- );
771
- throw new UnknownError(validatedArgs.error);
833
+ const [err, realArgs] = this.resolveTokenArgs(token, args);
834
+ if (err) {
835
+ return null;
772
836
  }
773
- const instanceName = this.makeInstanceName(token, validatedArgs);
837
+ const instanceName = this.makeInstanceName(token, realArgs);
774
838
  const [error, holder] = this.manager.get(instanceName);
775
839
  if (error) {
776
840
  return null;
@@ -878,6 +942,9 @@ function getServiceLocator() {
878
942
  return serviceLocator;
879
943
  }
880
944
 
945
+ // packages/core/src/service-locator/resolve-service.mts
946
+ var import_common = require("@navios/common");
947
+
881
948
  // packages/core/src/service-locator/proxy-service-locator.mts
882
949
  var ProxyServiceLocator = class {
883
950
  constructor(serviceLocator2, ctx) {
@@ -926,14 +993,6 @@ function makeProxyServiceLocator(serviceLocator2, ctx) {
926
993
  // packages/core/src/service-locator/sync-injector.mts
927
994
  var promiseCollector = null;
928
995
  function syncInject(token, args) {
929
- if (token.schema) {
930
- const parsed = token.schema.safeParse(args);
931
- if (!parsed.success) {
932
- throw new Error(
933
- `[ServiceLocator] Invalid arguments for ${token.name.toString()}: ${parsed.error}`
934
- );
935
- }
936
- }
937
996
  let realToken = token;
938
997
  if (!(token instanceof InjectionToken)) {
939
998
  realToken = getInjectableToken(token);
@@ -957,6 +1016,40 @@ function setPromiseCollector(collector) {
957
1016
  return original;
958
1017
  }
959
1018
 
1019
+ // packages/core/src/service-locator/resolve-service.mts
1020
+ async function resolveService(ctx, target, args = []) {
1021
+ const proxyServiceLocator = makeProxyServiceLocator(getServiceLocator(), ctx);
1022
+ let promises = [];
1023
+ const promiseCollector2 = (promise) => {
1024
+ promises.push(promise);
1025
+ };
1026
+ const originalPromiseCollector = setPromiseCollector(promiseCollector2);
1027
+ const tryLoad = () => {
1028
+ const original = provideServiceLocator(proxyServiceLocator);
1029
+ let result = new target(...args);
1030
+ provideServiceLocator(original);
1031
+ return result;
1032
+ };
1033
+ let instance = tryLoad();
1034
+ setPromiseCollector(originalPromiseCollector);
1035
+ if (promises.length > 0) {
1036
+ await Promise.all(promises);
1037
+ promises = [];
1038
+ instance = tryLoad();
1039
+ }
1040
+ if (promises.length > 0) {
1041
+ console.error(`[ServiceLocator] ${target.name} has problem with it's definition.
1042
+
1043
+ One or more of the dependencies are registered as a InjectableScope.Instance and are used with syncInject.
1044
+
1045
+ Please use inject instead of syncInject to load those dependencies.`);
1046
+ throw new import_common.NaviosException(
1047
+ `[ServiceLocator] Service ${target.name} cannot be instantiated.`
1048
+ );
1049
+ }
1050
+ return instance;
1051
+ }
1052
+
960
1053
  // packages/core/src/service-locator/decorators/injectable.decorator.mts
961
1054
  var InjectableType = /* @__PURE__ */ ((InjectableType2) => {
962
1055
  InjectableType2["Class"] = "Class";
@@ -977,62 +1070,22 @@ function Injectable({
977
1070
  }
978
1071
  let injectableToken = token ?? InjectionToken.create(target);
979
1072
  const locator = getServiceLocator();
980
- if (!locator) {
981
- throw new Error(
982
- "[ServiceLocator] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator."
983
- );
984
- }
985
1073
  if (type === "Class" /* Class */) {
986
1074
  locator.registerAbstractFactory(
987
1075
  injectableToken,
988
- async (ctx) => {
989
- if (scope === "Instance" /* Instance */) {
990
- ctx.setTtl(0);
991
- }
992
- const proxyServiceLocator = makeProxyServiceLocator(
993
- getServiceLocator(),
994
- ctx
995
- );
996
- const promises = [];
997
- const promiseCollector2 = (promise) => {
998
- promises.push(promise);
999
- };
1000
- const originalPromiseCollector = setPromiseCollector(promiseCollector2);
1001
- const tryInit = () => {
1002
- const original = provideServiceLocator(proxyServiceLocator);
1003
- let result2 = new target();
1004
- provideServiceLocator(original);
1005
- return result2;
1006
- };
1007
- const result = tryInit();
1008
- setPromiseCollector(originalPromiseCollector);
1009
- if (promises.length > 0) {
1010
- await Promise.all(promises);
1011
- return tryInit();
1012
- }
1013
- return result;
1014
- },
1076
+ async (ctx) => resolveService(ctx, target),
1015
1077
  scope
1016
1078
  );
1017
1079
  } else if (type === "Factory" /* Factory */) {
1018
1080
  locator.registerAbstractFactory(
1019
1081
  injectableToken,
1020
1082
  async (ctx, args) => {
1021
- if (scope === "Instance" /* Instance */) {
1022
- ctx.setTtl(0);
1023
- }
1024
- const proxyServiceLocator = makeProxyServiceLocator(
1025
- getServiceLocator(),
1026
- ctx
1027
- );
1028
- const original = provideServiceLocator(proxyServiceLocator);
1029
- const builder = new target();
1083
+ const builder = await resolveService(ctx, target);
1030
1084
  if (typeof builder.create !== "function") {
1031
- throw new Error(
1085
+ throw new import_common2.NaviosException(
1032
1086
  `[ServiceLocator] Factory ${target.name} does not implement the create method.`
1033
1087
  );
1034
1088
  }
1035
- provideServiceLocator(original);
1036
1089
  return builder.create(ctx, args);
1037
1090
  },
1038
1091
  scope
@@ -1095,14 +1148,6 @@ var EventEmitter = class {
1095
1148
 
1096
1149
  // packages/core/src/service-locator/inject.mts
1097
1150
  function inject(token, args) {
1098
- if (token.schema) {
1099
- const parsed = token.schema.safeParse(args);
1100
- if (!parsed.success) {
1101
- throw new Error(
1102
- `[ServiceLocator] Invalid arguments for ${token.name.toString()}: ${parsed.error}`
1103
- );
1104
- }
1105
- }
1106
1151
  let realToken = token;
1107
1152
  if (!(token instanceof InjectionToken)) {
1108
1153
  realToken = getInjectableToken(token);
@@ -1677,7 +1722,7 @@ var PinoWrapper = class _PinoWrapper {
1677
1722
  };
1678
1723
 
1679
1724
  // packages/core/src/config/config.service.mts
1680
- var import_common = require("@navios/common");
1725
+ var import_common3 = require("@navios/common");
1681
1726
  var ConfigServiceInstance = class {
1682
1727
  constructor(config = {}, logger) {
1683
1728
  this.config = config;
@@ -1716,30 +1761,29 @@ var ConfigServiceInstance = class {
1716
1761
  if (value === null) {
1717
1762
  const message = errorMessage || `Configuration value for key "${String(key)}" is not defined`;
1718
1763
  this.logger.error(message);
1719
- throw new import_common.NaviosException(message);
1764
+ throw new import_common3.NaviosException(message);
1720
1765
  }
1721
1766
  return value;
1722
1767
  }
1723
1768
  };
1724
1769
 
1725
1770
  // packages/core/src/config/config.provider.mts
1726
- var ConfigProviderInjectionToken = "ConfigProvider";
1727
1771
  var ConfigProviderOptions = import_zod3.z.object({
1728
1772
  load: import_zod3.z.function()
1729
1773
  });
1730
- var ConfigProvider = InjectionToken.create(ConfigProviderInjectionToken, ConfigProviderOptions);
1774
+ var ConfigProvider = InjectionToken.create(ConfigServiceInstance, ConfigProviderOptions);
1731
1775
  var _ConfigProviderFactory_decorators, _init4;
1732
1776
  _ConfigProviderFactory_decorators = [Injectable({
1733
1777
  token: ConfigProvider,
1734
1778
  type: "Factory" /* Factory */
1735
1779
  })];
1736
1780
  var ConfigProviderFactory = class {
1737
- logger = inject(Logger, {
1781
+ logger = syncInject(Logger, {
1738
1782
  context: "ConfigService"
1739
1783
  });
1740
1784
  async create(ctx, args) {
1741
1785
  const { load } = args;
1742
- const logger = await this.logger;
1786
+ const logger = this.logger;
1743
1787
  try {
1744
1788
  const config = await load();
1745
1789
  return new ConfigServiceInstance(config, logger);
@@ -1752,21 +1796,8 @@ var ConfigProviderFactory = class {
1752
1796
  _init4 = __decoratorStart(null);
1753
1797
  ConfigProviderFactory = __decorateElement(_init4, 0, "ConfigProviderFactory", _ConfigProviderFactory_decorators, ConfigProviderFactory);
1754
1798
  __runInitializers(_init4, 1, ConfigProviderFactory);
1755
- function makeConfigToken(options) {
1756
- var _ConfigServiceImpl_decorators, _init9;
1757
- _ConfigServiceImpl_decorators = [Injectable({
1758
- type: "Factory" /* Factory */
1759
- })];
1760
- class ConfigServiceImpl {
1761
- configService = inject(ConfigProvider, options);
1762
- create() {
1763
- return this.configService;
1764
- }
1765
- }
1766
- _init9 = __decoratorStart(null);
1767
- ConfigServiceImpl = __decorateElement(_init9, 0, "ConfigServiceImpl", _ConfigServiceImpl_decorators, ConfigServiceImpl);
1768
- __runInitializers(_init9, 1, ConfigServiceImpl);
1769
- return getInjectableToken(ConfigServiceImpl);
1799
+ function provideConfig(options) {
1800
+ return InjectionToken.bound(ConfigProvider, options);
1770
1801
  }
1771
1802
 
1772
1803
  // packages/core/src/metadata/endpoint.metadata.mts
@@ -2079,7 +2110,7 @@ var ConflictException = class extends HttpException {
2079
2110
  };
2080
2111
 
2081
2112
  // packages/core/src/services/controller-adapter.service.mts
2082
- var import_common2 = require("@navios/common");
2113
+ var import_common4 = require("@navios/common");
2083
2114
 
2084
2115
  // packages/core/src/tokens/application.token.mts
2085
2116
  var ApplicationInjectionToken = "ApplicationInjectionToken";
@@ -2300,7 +2331,7 @@ var _ControllerAdapterService = class _ControllerAdapterService {
2300
2331
  this.logger.error(
2301
2332
  `Unknown endpoint type ${endpointMetadata.type} for ${controller.name}:${endpointMetadata.classMethod}`
2302
2333
  );
2303
- throw new import_common2.NaviosException("Unknown endpoint type");
2334
+ throw new import_common4.NaviosException("Unknown endpoint type");
2304
2335
  case "config" /* Config */:
2305
2336
  return this.provideHandlerForConfig(
2306
2337
  controller,
@@ -2309,7 +2340,7 @@ var _ControllerAdapterService = class _ControllerAdapterService {
2309
2340
  );
2310
2341
  case "handler" /* Handler */:
2311
2342
  this.logger.error("Not implemented yet");
2312
- throw new import_common2.NaviosException("Not implemented yet");
2343
+ throw new import_common4.NaviosException("Not implemented yet");
2313
2344
  }
2314
2345
  }
2315
2346
  provideHandlerForConfig(controller, executionContext, endpointMetadata) {
@@ -2639,9 +2670,9 @@ var NaviosFactory = class {
2639
2670
  Application,
2640
2671
  AttributeFactory,
2641
2672
  BadRequestException,
2673
+ BoundInjectionToken,
2642
2674
  ConfigProvider,
2643
2675
  ConfigProviderFactory,
2644
- ConfigProviderInjectionToken,
2645
2676
  ConfigProviderOptions,
2646
2677
  ConfigServiceInstance,
2647
2678
  ConflictException,
@@ -2657,7 +2688,9 @@ var NaviosFactory = class {
2657
2688
  ExecutionContext,
2658
2689
  ExecutionContextInjectionToken,
2659
2690
  ExecutionContextToken,
2691
+ FactoryInjectionToken,
2660
2692
  FactoryNotFound,
2693
+ FactoryTokenNotResolved,
2661
2694
  ForbiddenException,
2662
2695
  GuardRunnerService,
2663
2696
  Header,
@@ -2723,10 +2756,11 @@ var NaviosFactory = class {
2723
2756
  isString,
2724
2757
  isSymbol,
2725
2758
  isUndefined,
2726
- makeConfigToken,
2727
2759
  normalizePath,
2728
2760
  override,
2761
+ provideConfig,
2729
2762
  provideServiceLocator,
2763
+ resolveService,
2730
2764
  setPromiseCollector,
2731
2765
  stripEndSlash,
2732
2766
  syncInject,