@navios/core 0.1.3 → 0.1.5

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.mjs CHANGED
@@ -57,7 +57,7 @@ function envString(key, defaultValue) {
57
57
  }
58
58
 
59
59
  // packages/core/src/config/config.provider.mts
60
- import { z as z2 } from "zod";
60
+ import { z as z3 } from "zod";
61
61
 
62
62
  // packages/core/src/logger/utils/cli-colors.util.mts
63
63
  var isColorAllowed = () => !process.env.NO_COLOR;
@@ -157,6 +157,9 @@ var isSymbol = (val) => typeof val === "symbol";
157
157
  // packages/core/src/logger/console-logger.service.mts
158
158
  import { inspect } from "util";
159
159
 
160
+ // packages/core/src/service-locator/decorators/injectable.decorator.mts
161
+ import { NaviosException as NaviosException2 } from "@navios/common";
162
+
160
163
  // packages/core/src/service-locator/enums/injectable-scope.enum.mts
161
164
  var InjectableScope = /* @__PURE__ */ ((InjectableScope2) => {
162
165
  InjectableScope2["Singleton"] = "Singleton";
@@ -176,8 +179,38 @@ var InjectionToken = class _InjectionToken {
176
179
  static create(name2, schema) {
177
180
  return new _InjectionToken(name2, schema);
178
181
  }
179
- toString() {
180
- return this.name;
182
+ static bound(token, value) {
183
+ return new BoundInjectionToken(token, value);
184
+ }
185
+ static factory(token, factory) {
186
+ return new FactoryInjectionToken(token, factory);
187
+ }
188
+ static refineType(token) {
189
+ return token;
190
+ }
191
+ };
192
+ var BoundInjectionToken = class extends InjectionToken {
193
+ constructor(token, value) {
194
+ super(token.name, token.schema);
195
+ this.token = token;
196
+ this.value = value;
197
+ this.id = token.id;
198
+ }
199
+ };
200
+ var FactoryInjectionToken = class extends InjectionToken {
201
+ constructor(token, factory) {
202
+ super(token.name, token.schema);
203
+ this.token = token;
204
+ this.factory = factory;
205
+ }
206
+ value;
207
+ resolved = false;
208
+ async resolve() {
209
+ if (!this.value) {
210
+ this.value = await this.factory();
211
+ this.resolved = true;
212
+ }
213
+ return this.value;
181
214
  }
182
215
  };
183
216
 
@@ -188,6 +221,7 @@ var ErrorsEnum = /* @__PURE__ */ ((ErrorsEnum2) => {
188
221
  ErrorsEnum2["InstanceDestroying"] = "InstanceDestroying";
189
222
  ErrorsEnum2["UnknownError"] = "UnknownError";
190
223
  ErrorsEnum2["FactoryNotFound"] = "FactoryNotFound";
224
+ ErrorsEnum2["FactoryTokenNotResolved"] = "FactoryTokenNotResolved";
191
225
  return ErrorsEnum2;
192
226
  })(ErrorsEnum || {});
193
227
 
@@ -200,6 +234,14 @@ var FactoryNotFound = class extends Error {
200
234
  code = "FactoryNotFound" /* FactoryNotFound */;
201
235
  };
202
236
 
237
+ // packages/core/src/service-locator/errors/factory-token-not-resolved.mts
238
+ var FactoryTokenNotResolved = class extends Error {
239
+ code = "FactoryTokenNotResolved" /* FactoryTokenNotResolved */;
240
+ constructor(name2) {
241
+ super(`Factory token not resolved: ${name2.toString()}`);
242
+ }
243
+ };
244
+
203
245
  // packages/core/src/service-locator/errors/instance-destroying.mts
204
246
  var InstanceDestroying = class extends Error {
205
247
  constructor(name2) {
@@ -442,29 +484,48 @@ var ServiceLocator = class {
442
484
  this.instanceFactories.delete(token);
443
485
  }
444
486
  }
445
- getInstanceIdentifier(token, args) {
446
- var _a;
447
- const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
448
- if (validatedArgs && !validatedArgs.success) {
449
- (_a = this.logger) == null ? void 0 : _a.error(
450
- `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
451
- validatedArgs.error
452
- );
453
- throw new UnknownError(validatedArgs.error);
487
+ resolveTokenArgs(token, args) {
488
+ var _a, _b;
489
+ let realArgs = args;
490
+ if (token instanceof BoundInjectionToken) {
491
+ realArgs = token.value;
492
+ } else if (token instanceof FactoryInjectionToken) {
493
+ if (token.resolved) {
494
+ realArgs = token.value;
495
+ } else {
496
+ return [new FactoryTokenNotResolved(token.name)];
497
+ }
454
498
  }
455
- return this.makeInstanceName(token, validatedArgs);
456
- }
457
- async getInstance(token, args) {
458
- var _a, _b, _c;
459
- const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
499
+ if (!token.schema) {
500
+ return [void 0, realArgs];
501
+ }
502
+ const validatedArgs = (_a = token.schema) == null ? void 0 : _a.safeParse(realArgs);
460
503
  if (validatedArgs && !validatedArgs.success) {
461
- (_a = this.logger) == null ? void 0 : _a.error(
504
+ (_b = this.logger) == null ? void 0 : _b.error(
462
505
  `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
463
506
  validatedArgs.error
464
507
  );
465
508
  return [new UnknownError(validatedArgs.error)];
466
509
  }
467
- const instanceName = this.makeInstanceName(token, validatedArgs);
510
+ return [void 0, validatedArgs == null ? void 0 : validatedArgs.data];
511
+ }
512
+ getInstanceIdentifier(token, args) {
513
+ const [err, realArgs] = this.resolveTokenArgs(token, args);
514
+ if (err) {
515
+ throw err;
516
+ }
517
+ return this.makeInstanceName(token, realArgs);
518
+ }
519
+ async getInstance(token, args) {
520
+ var _a, _b;
521
+ const [err, realArgs] = this.resolveTokenArgs(token, args);
522
+ if (err instanceof UnknownError) {
523
+ throw err;
524
+ } else if (err instanceof FactoryTokenNotResolved && token instanceof FactoryInjectionToken) {
525
+ await token.resolve();
526
+ return this.getInstance(token, args);
527
+ }
528
+ const instanceName = this.makeInstanceName(token, realArgs);
468
529
  const [error, holder] = this.manager.get(instanceName);
469
530
  if (!error) {
470
531
  if (holder.status === "creating" /* Creating */) {
@@ -476,13 +537,13 @@ var ServiceLocator = class {
476
537
  }
477
538
  switch (error.code) {
478
539
  case "InstanceDestroying" /* InstanceDestroying */:
479
- (_b = this.logger) == null ? void 0 : _b.log(
540
+ (_a = this.logger) == null ? void 0 : _a.log(
480
541
  `[ServiceLocator]#getInstance() TTL expired for ${holder == null ? void 0 : holder.name}`
481
542
  );
482
543
  await (holder == null ? void 0 : holder.destroyPromise);
483
544
  return this.getInstance(token, args);
484
545
  case "InstanceExpired" /* InstanceExpired */:
485
- (_c = this.logger) == null ? void 0 : _c.log(
546
+ (_b = this.logger) == null ? void 0 : _b.log(
486
547
  `[ServiceLocator]#getInstance() TTL expired for ${holder == null ? void 0 : holder.name}`
487
548
  );
488
549
  await this.invalidate(instanceName);
@@ -492,7 +553,7 @@ var ServiceLocator = class {
492
553
  default:
493
554
  return [error];
494
555
  }
495
- return this.createInstance(instanceName, token, args);
556
+ return this.createInstance(instanceName, token, realArgs);
496
557
  }
497
558
  async getOrThrowInstance(token, args) {
498
559
  const [error, instance] = await this.getInstance(token, args);
@@ -513,10 +574,15 @@ var ServiceLocator = class {
513
574
  (_a = this.logger) == null ? void 0 : _a.log(
514
575
  `[ServiceLocator]#createInstance() Creating instance for ${instanceName}`
515
576
  );
516
- if (this.abstractFactories.has(token) || this.instanceFactories.has(token)) {
517
- return this.createInstanceFromAbstractFactory(instanceName, token, args);
577
+ let realToken = token instanceof BoundInjectionToken || token instanceof FactoryInjectionToken ? token.token : token;
578
+ if (this.abstractFactories.has(realToken) || this.instanceFactories.has(realToken)) {
579
+ return this.createInstanceFromAbstractFactory(
580
+ instanceName,
581
+ realToken,
582
+ args
583
+ );
518
584
  } else {
519
- return [new FactoryNotFound(token.name.toString())];
585
+ return [new FactoryNotFound(realToken.name.toString())];
520
586
  }
521
587
  }
522
588
  async createInstanceFromAbstractFactory(instanceName, token, args) {
@@ -563,7 +629,7 @@ var ServiceLocator = class {
563
629
  );
564
630
  });
565
631
  }
566
- if (holder.ttl === 0) {
632
+ if (holder.ttl === 0 || !shouldStore) {
567
633
  await this.invalidate(instanceName);
568
634
  }
569
635
  await this.notifyListeners(instanceName);
@@ -635,16 +701,11 @@ var ServiceLocator = class {
635
701
  };
636
702
  }
637
703
  getSyncInstance(token, args) {
638
- var _a;
639
- const validatedArgs = token.schema ? token.schema.safeParse(args) : void 0;
640
- if (validatedArgs && !validatedArgs.success) {
641
- (_a = this.logger) == null ? void 0 : _a.error(
642
- `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,
643
- validatedArgs.error
644
- );
645
- throw new UnknownError(validatedArgs.error);
704
+ const [err, realArgs] = this.resolveTokenArgs(token, args);
705
+ if (err) {
706
+ return null;
646
707
  }
647
- const instanceName = this.makeInstanceName(token, validatedArgs);
708
+ const instanceName = this.makeInstanceName(token, realArgs);
648
709
  const [error, holder] = this.manager.get(instanceName);
649
710
  if (error) {
650
711
  return null;
@@ -752,6 +813,9 @@ function getServiceLocator() {
752
813
  return serviceLocator;
753
814
  }
754
815
 
816
+ // packages/core/src/service-locator/resolve-service.mts
817
+ import { NaviosException } from "@navios/common";
818
+
755
819
  // packages/core/src/service-locator/proxy-service-locator.mts
756
820
  var ProxyServiceLocator = class {
757
821
  constructor(serviceLocator2, ctx) {
@@ -800,14 +864,6 @@ function makeProxyServiceLocator(serviceLocator2, ctx) {
800
864
  // packages/core/src/service-locator/sync-injector.mts
801
865
  var promiseCollector = null;
802
866
  function syncInject(token, args) {
803
- if (token.schema) {
804
- const parsed = token.schema.safeParse(args);
805
- if (!parsed.success) {
806
- throw new Error(
807
- `[ServiceLocator] Invalid arguments for ${token.name.toString()}: ${parsed.error}`
808
- );
809
- }
810
- }
811
867
  let realToken = token;
812
868
  if (!(token instanceof InjectionToken)) {
813
869
  realToken = getInjectableToken(token);
@@ -831,6 +887,40 @@ function setPromiseCollector(collector) {
831
887
  return original;
832
888
  }
833
889
 
890
+ // packages/core/src/service-locator/resolve-service.mts
891
+ async function resolveService(ctx, target, args = []) {
892
+ const proxyServiceLocator = makeProxyServiceLocator(getServiceLocator(), ctx);
893
+ let promises = [];
894
+ const promiseCollector2 = (promise) => {
895
+ promises.push(promise);
896
+ };
897
+ const originalPromiseCollector = setPromiseCollector(promiseCollector2);
898
+ const tryLoad = () => {
899
+ const original = provideServiceLocator(proxyServiceLocator);
900
+ let result = new target(...args);
901
+ provideServiceLocator(original);
902
+ return result;
903
+ };
904
+ let instance = tryLoad();
905
+ setPromiseCollector(originalPromiseCollector);
906
+ if (promises.length > 0) {
907
+ await Promise.all(promises);
908
+ promises = [];
909
+ instance = tryLoad();
910
+ }
911
+ if (promises.length > 0) {
912
+ console.error(`[ServiceLocator] ${target.name} has problem with it's definition.
913
+
914
+ One or more of the dependencies are registered as a InjectableScope.Instance and are used with syncInject.
915
+
916
+ Please use inject instead of syncInject to load those dependencies.`);
917
+ throw new NaviosException(
918
+ `[ServiceLocator] Service ${target.name} cannot be instantiated.`
919
+ );
920
+ }
921
+ return instance;
922
+ }
923
+
834
924
  // packages/core/src/service-locator/decorators/injectable.decorator.mts
835
925
  var InjectableType = /* @__PURE__ */ ((InjectableType2) => {
836
926
  InjectableType2["Class"] = "Class";
@@ -851,62 +941,22 @@ function Injectable({
851
941
  }
852
942
  let injectableToken = token ?? InjectionToken.create(target);
853
943
  const locator = getServiceLocator();
854
- if (!locator) {
855
- throw new Error(
856
- "[ServiceLocator] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator."
857
- );
858
- }
859
944
  if (type === "Class" /* Class */) {
860
945
  locator.registerAbstractFactory(
861
946
  injectableToken,
862
- async (ctx) => {
863
- if (scope === "Instance" /* Instance */) {
864
- ctx.setTtl(0);
865
- }
866
- const proxyServiceLocator = makeProxyServiceLocator(
867
- getServiceLocator(),
868
- ctx
869
- );
870
- const promises = [];
871
- const promiseCollector2 = (promise) => {
872
- promises.push(promise);
873
- };
874
- const originalPromiseCollector = setPromiseCollector(promiseCollector2);
875
- const tryInit = () => {
876
- const original = provideServiceLocator(proxyServiceLocator);
877
- let result2 = new target();
878
- provideServiceLocator(original);
879
- return result2;
880
- };
881
- const result = tryInit();
882
- setPromiseCollector(originalPromiseCollector);
883
- if (promises.length > 0) {
884
- await Promise.all(promises);
885
- return tryInit();
886
- }
887
- return result;
888
- },
947
+ async (ctx) => resolveService(ctx, target),
889
948
  scope
890
949
  );
891
950
  } else if (type === "Factory" /* Factory */) {
892
951
  locator.registerAbstractFactory(
893
952
  injectableToken,
894
953
  async (ctx, args) => {
895
- if (scope === "Instance" /* Instance */) {
896
- ctx.setTtl(0);
897
- }
898
- const proxyServiceLocator = makeProxyServiceLocator(
899
- getServiceLocator(),
900
- ctx
901
- );
902
- const original = provideServiceLocator(proxyServiceLocator);
903
- const builder = new target();
954
+ const builder = await resolveService(ctx, target);
904
955
  if (typeof builder.create !== "function") {
905
- throw new Error(
956
+ throw new NaviosException2(
906
957
  `[ServiceLocator] Factory ${target.name} does not implement the create method.`
907
958
  );
908
959
  }
909
- provideServiceLocator(original);
910
960
  return builder.create(ctx, args);
911
961
  },
912
962
  scope
@@ -969,14 +1019,6 @@ var EventEmitter = class {
969
1019
 
970
1020
  // packages/core/src/service-locator/inject.mts
971
1021
  function inject(token, args) {
972
- if (token.schema) {
973
- const parsed = token.schema.safeParse(args);
974
- if (!parsed.success) {
975
- throw new Error(
976
- `[ServiceLocator] Invalid arguments for ${token.name.toString()}: ${parsed.error}`
977
- );
978
- }
979
- }
980
1022
  let realToken = token;
981
1023
  if (!(token instanceof InjectionToken)) {
982
1024
  realToken = getInjectableToken(token);
@@ -1350,7 +1392,7 @@ __runInitializers(_init, 1, _ConsoleLogger);
1350
1392
  var ConsoleLogger = _ConsoleLogger;
1351
1393
 
1352
1394
  // packages/core/src/logger/logger.factory.mts
1353
- import { z } from "zod";
1395
+ import { z as z2 } from "zod";
1354
1396
 
1355
1397
  // packages/core/src/logger/logger.service.mts
1356
1398
  var DEFAULT_LOGGER = new ConsoleLogger();
@@ -1477,10 +1519,10 @@ var LoggerInstance = _LoggerInstance;
1477
1519
 
1478
1520
  // packages/core/src/logger/logger.factory.mts
1479
1521
  var LoggerInjectionToken = "LoggerInjectionToken";
1480
- var LoggerOptions = z.object({
1481
- context: z.string().optional(),
1482
- options: z.object({
1483
- timestamp: z.boolean().optional()
1522
+ var LoggerOptions = z2.object({
1523
+ context: z2.string().optional(),
1524
+ options: z2.object({
1525
+ timestamp: z2.boolean().optional()
1484
1526
  }).optional()
1485
1527
  }).optional();
1486
1528
  var Logger = InjectionToken.create(LoggerInjectionToken, LoggerOptions);
@@ -1551,7 +1593,7 @@ var PinoWrapper = class _PinoWrapper {
1551
1593
  };
1552
1594
 
1553
1595
  // packages/core/src/config/config.service.mts
1554
- import { NaviosException } from "@navios/common";
1596
+ import { NaviosException as NaviosException3 } from "@navios/common";
1555
1597
  var ConfigServiceInstance = class {
1556
1598
  constructor(config = {}, logger) {
1557
1599
  this.config = config;
@@ -1590,30 +1632,29 @@ var ConfigServiceInstance = class {
1590
1632
  if (value === null) {
1591
1633
  const message = errorMessage || `Configuration value for key "${String(key)}" is not defined`;
1592
1634
  this.logger.error(message);
1593
- throw new NaviosException(message);
1635
+ throw new NaviosException3(message);
1594
1636
  }
1595
1637
  return value;
1596
1638
  }
1597
1639
  };
1598
1640
 
1599
1641
  // packages/core/src/config/config.provider.mts
1600
- var ConfigProviderInjectionToken = "ConfigProvider";
1601
- var ConfigProviderOptions = z2.object({
1602
- load: z2.function()
1642
+ var ConfigProviderOptions = z3.object({
1643
+ load: z3.function()
1603
1644
  });
1604
- var ConfigProvider = InjectionToken.create(ConfigProviderInjectionToken, ConfigProviderOptions);
1645
+ var ConfigProvider = InjectionToken.create(ConfigServiceInstance, ConfigProviderOptions);
1605
1646
  var _ConfigProviderFactory_decorators, _init4;
1606
1647
  _ConfigProviderFactory_decorators = [Injectable({
1607
1648
  token: ConfigProvider,
1608
1649
  type: "Factory" /* Factory */
1609
1650
  })];
1610
1651
  var ConfigProviderFactory = class {
1611
- logger = inject(Logger, {
1652
+ logger = syncInject(Logger, {
1612
1653
  context: "ConfigService"
1613
1654
  });
1614
1655
  async create(ctx, args) {
1615
1656
  const { load } = args;
1616
- const logger = await this.logger;
1657
+ const logger = this.logger;
1617
1658
  try {
1618
1659
  const config = await load();
1619
1660
  return new ConfigServiceInstance(config, logger);
@@ -1626,21 +1667,8 @@ var ConfigProviderFactory = class {
1626
1667
  _init4 = __decoratorStart(null);
1627
1668
  ConfigProviderFactory = __decorateElement(_init4, 0, "ConfigProviderFactory", _ConfigProviderFactory_decorators, ConfigProviderFactory);
1628
1669
  __runInitializers(_init4, 1, ConfigProviderFactory);
1629
- function makeConfigToken(options) {
1630
- var _ConfigServiceImpl_decorators, _init9;
1631
- _ConfigServiceImpl_decorators = [Injectable({
1632
- type: "Factory" /* Factory */
1633
- })];
1634
- class ConfigServiceImpl {
1635
- configService = inject(ConfigProvider, options);
1636
- create() {
1637
- return this.configService;
1638
- }
1639
- }
1640
- _init9 = __decoratorStart(null);
1641
- ConfigServiceImpl = __decorateElement(_init9, 0, "ConfigServiceImpl", _ConfigServiceImpl_decorators, ConfigServiceImpl);
1642
- __runInitializers(_init9, 1, ConfigServiceImpl);
1643
- return getInjectableToken(ConfigServiceImpl);
1670
+ function provideConfig(options) {
1671
+ return InjectionToken.bound(ConfigProvider, options);
1644
1672
  }
1645
1673
 
1646
1674
  // packages/core/src/metadata/endpoint.metadata.mts
@@ -1953,7 +1981,7 @@ var ConflictException = class extends HttpException {
1953
1981
  };
1954
1982
 
1955
1983
  // packages/core/src/services/controller-adapter.service.mts
1956
- import { NaviosException as NaviosException2 } from "@navios/common";
1984
+ import { NaviosException as NaviosException4 } from "@navios/common";
1957
1985
 
1958
1986
  // packages/core/src/tokens/application.token.mts
1959
1987
  var ApplicationInjectionToken = "ApplicationInjectionToken";
@@ -2174,7 +2202,7 @@ var _ControllerAdapterService = class _ControllerAdapterService {
2174
2202
  this.logger.error(
2175
2203
  `Unknown endpoint type ${endpointMetadata.type} for ${controller.name}:${endpointMetadata.classMethod}`
2176
2204
  );
2177
- throw new NaviosException2("Unknown endpoint type");
2205
+ throw new NaviosException4("Unknown endpoint type");
2178
2206
  case "config" /* Config */:
2179
2207
  return this.provideHandlerForConfig(
2180
2208
  controller,
@@ -2183,7 +2211,7 @@ var _ControllerAdapterService = class _ControllerAdapterService {
2183
2211
  );
2184
2212
  case "handler" /* Handler */:
2185
2213
  this.logger.error("Not implemented yet");
2186
- throw new NaviosException2("Not implemented yet");
2214
+ throw new NaviosException4("Not implemented yet");
2187
2215
  }
2188
2216
  }
2189
2217
  provideHandlerForConfig(controller, executionContext, endpointMetadata) {
@@ -2515,9 +2543,9 @@ export {
2515
2543
  Application,
2516
2544
  AttributeFactory,
2517
2545
  BadRequestException,
2546
+ BoundInjectionToken,
2518
2547
  ConfigProvider,
2519
2548
  ConfigProviderFactory,
2520
- ConfigProviderInjectionToken,
2521
2549
  ConfigProviderOptions,
2522
2550
  ConfigServiceInstance,
2523
2551
  ConflictException,
@@ -2533,7 +2561,9 @@ export {
2533
2561
  ExecutionContext2 as ExecutionContext,
2534
2562
  ExecutionContextInjectionToken,
2535
2563
  ExecutionContextToken,
2564
+ FactoryInjectionToken,
2536
2565
  FactoryNotFound,
2566
+ FactoryTokenNotResolved,
2537
2567
  ForbiddenException,
2538
2568
  GuardRunnerService,
2539
2569
  Header,
@@ -2599,10 +2629,11 @@ export {
2599
2629
  isString,
2600
2630
  isSymbol,
2601
2631
  isUndefined,
2602
- makeConfigToken,
2603
2632
  normalizePath,
2604
2633
  override,
2634
+ provideConfig,
2605
2635
  provideServiceLocator,
2636
+ resolveService,
2606
2637
  setPromiseCollector,
2607
2638
  stripEndSlash,
2608
2639
  syncInject,