@devbro/pashmak 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/app/console/project/base_project/package.json.tpl +1 -1
  2. package/dist/app/console/project/base_project/src/app/models/index.ts.tpl +1 -0
  3. package/dist/app/console/project/base_project/src/config/caches.ts.tpl +7 -0
  4. package/dist/app/console/project/base_project/src/config/databases.ts.tpl +10 -6
  5. package/dist/app/console/project/base_project/src/config/default.mts.tpl +35 -0
  6. package/dist/app/console/project/base_project/src/config/loggers.ts.tpl +11 -7
  7. package/dist/app/console/project/base_project/src/config/mailer.ts.tpl +21 -1
  8. package/dist/app/console/project/base_project/src/config/queues.ts.tpl +7 -0
  9. package/dist/app/console/project/base_project/src/config/storages.ts.tpl +8 -4
  10. package/dist/app/console/project/base_project/tsconfig.json.tpl +7 -4
  11. package/dist/app/console/queue/queue_migration.tpl +2 -1
  12. package/dist/bin/app/console/DefaultCommand.cjs +53 -34
  13. package/dist/bin/app/console/KeyGenerateCommand.cjs +53 -34
  14. package/dist/bin/app/console/StartCommand.cjs +55 -36
  15. package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +53 -34
  16. package/dist/bin/app/console/generate/index.cjs +53 -34
  17. package/dist/bin/app/console/index.cjs +54 -36
  18. package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +53 -34
  19. package/dist/bin/app/console/migrate/MigrateCommand.cjs +52 -34
  20. package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +52 -34
  21. package/dist/bin/app/console/migrate/index.cjs +52 -34
  22. package/dist/bin/app/console/queue/GenerateQueueMigrateCommand.cjs +53 -34
  23. package/dist/bin/cache.cjs +53 -34
  24. package/dist/bin/facades.cjs +52 -34
  25. package/dist/bin/factories.cjs +58 -39
  26. package/dist/bin/index.cjs +62 -43
  27. package/dist/bin/middlewares.cjs +52 -34
  28. package/dist/bin/queue.cjs +675 -18
  29. package/dist/facades.d.mts +2 -1
  30. package/dist/facades.mjs +12 -8
  31. package/dist/facades.mjs.map +1 -1
  32. package/dist/factories.d.mts +5 -5
  33. package/dist/factories.mjs +17 -10
  34. package/dist/factories.mjs.map +1 -1
  35. package/dist/queue.d.mts +8 -4
  36. package/dist/queue.mjs +26 -18
  37. package/dist/queue.mjs.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/app/console/project/base_project/src/app/models/README.md.tpl +0 -1
  40. package/dist/app/console/project/base_project/src/config/default.ts.tpl +0 -42
@@ -457,7 +457,7 @@ var Router = class {
457
457
  var import_neko_scheduler = require("@devbro/neko-scheduler");
458
458
  var import_neko_helper = require("@devbro/neko-helper");
459
459
  var import_neko_context2 = require("@devbro/neko-context");
460
- var import_neko_storage = require("@devbro/neko-storage");
460
+ var import_neko_storage2 = require("@devbro/neko-storage");
461
461
  var import_neko_mailer2 = require("@devbro/neko-mailer");
462
462
  var import_neko_config = require("@devbro/neko-config");
463
463
  var import_clipanion = require("clipanion");
@@ -481,31 +481,38 @@ __export(queue_exports, {
481
481
  DatabaseTransport: () => DatabaseTransport
482
482
  });
483
483
  __reExport(queue_exports, require("@devbro/neko-queue"));
484
- var import_neko_sql = require("@devbro/neko-sql");
485
484
  var DatabaseTransport = class {
486
- constructor(db_config) {
487
- this.db_config = db_config;
488
- }
489
485
  static {
490
486
  __name(this, "DatabaseTransport");
491
487
  }
492
- listenInterval = 6e4;
493
- // default to 1 minute
494
- messageLimit = 100;
495
- // default to 100 messages per fetch
496
488
  activeIntervals = /* @__PURE__ */ new Set();
489
+ config = {
490
+ queue_table: "queue_messages",
491
+ db_connection: "default",
492
+ listen_interval: 60,
493
+ // seconds
494
+ message_limit: 10
495
+ // messages per each fetch
496
+ };
497
+ constructor(config2) {
498
+ this.config = { ...this.config, ...config2 };
499
+ }
497
500
  setListenInterval(interval) {
498
- this.listenInterval = interval;
501
+ this.config.listen_interval = interval;
499
502
  }
500
503
  setMessageLimit(limit) {
501
- this.messageLimit = limit;
504
+ this.config.message_limit = limit;
502
505
  }
503
506
  async dispatch(channel, message) {
504
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
507
+ const conn = db(this.config.db_connection);
505
508
  try {
506
509
  await conn.connect();
510
+ let schema = conn.getSchema();
511
+ if (await schema.tableExists(this.config.queue_table) === false) {
512
+ return;
513
+ }
507
514
  let q = conn.getQuery();
508
- await q.table("queue_messages").insert({
515
+ await q.table(this.config.queue_table).insert({
509
516
  channel,
510
517
  message,
511
518
  processed: false,
@@ -521,20 +528,20 @@ var DatabaseTransport = class {
521
528
  async listen(channel, callback) {
522
529
  return new Promise(async (resolve, reject) => {
523
530
  const intervalId = setInterval(async () => {
524
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
531
+ const conn = db(this.config.db_connection);
525
532
  try {
526
533
  await conn.connect();
527
534
  let q = conn.getQuery();
528
- let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
535
+ let messages = await q.table(this.config.queue_table).whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.config.message_limit).orderBy("last_tried_at", "asc").get();
529
536
  for (let msg of messages) {
530
537
  try {
531
538
  await callback(msg.message);
532
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
539
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
533
540
  processed: true,
534
541
  updated_at: /* @__PURE__ */ new Date()
535
542
  });
536
543
  } catch (error) {
537
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
544
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
538
545
  processed: false,
539
546
  last_tried_at: /* @__PURE__ */ new Date(),
540
547
  process_message: error.message || "Error processing message"
@@ -543,11 +550,11 @@ var DatabaseTransport = class {
543
550
  }
544
551
  } catch (error) {
545
552
  this.activeIntervals.delete(intervalId);
546
- reject(error);
553
+ logger().error("Error in DatabaseTransport listen interval:", { error });
547
554
  } finally {
548
555
  await conn.disconnect();
549
556
  }
550
- }, this.listenInterval);
557
+ }, this.config.listen_interval * 1e3);
551
558
  this.activeIntervals.add(intervalId);
552
559
  });
553
560
  }
@@ -561,6 +568,7 @@ var DatabaseTransport = class {
561
568
 
562
569
  // src/factories.mts
563
570
  var import_neko_cache = require("@devbro/neko-cache");
571
+ var import_neko_storage = require("@devbro/neko-storage");
564
572
  var FlexibleFactory = class {
565
573
  static {
566
574
  __name(this, "FlexibleFactory");
@@ -597,32 +605,32 @@ MailerFactory.register("logger", (opt) => {
597
605
  });
598
606
  });
599
607
  });
600
- MailerFactory.register("SES", (opt) => {
608
+ MailerFactory.register("ses", (opt) => {
601
609
  return new import_neko_mailer.SESProvider(opt);
602
610
  });
603
- MailerFactory.register("SMTP", (opt) => {
611
+ MailerFactory.register("smtp", (opt) => {
604
612
  return new import_neko_mailer.SMTPProvider(opt);
605
613
  });
606
- MailerFactory.register("MEMORY", (opt) => {
614
+ MailerFactory.register("memory", (opt) => {
607
615
  return new import_neko_mailer.MemoryProvider();
608
616
  });
609
- var QueueFactory = class _QueueFactory {
617
+ var QueueTransportFactory = class _QueueTransportFactory {
610
618
  static {
611
- __name(this, "QueueFactory");
619
+ __name(this, "QueueTransportFactory");
612
620
  }
613
621
  static instance = new FlexibleFactory();
614
622
  static register(key, factory) {
615
- _QueueFactory.instance.register(key, factory);
623
+ _QueueTransportFactory.instance.register(key, factory);
616
624
  }
617
625
  static create(key, ...args) {
618
- return _QueueFactory.instance.create(key, ...args);
626
+ return _QueueTransportFactory.instance.create(key, ...args);
619
627
  }
620
628
  };
621
- QueueFactory.register("database", (opt) => {
629
+ QueueTransportFactory.register("database", (opt) => {
622
630
  let transport = new DatabaseTransport(opt);
623
631
  return new import_neko_queue.QueueConnection(transport);
624
632
  });
625
- QueueFactory.register("memory", (opt) => {
633
+ QueueTransportFactory.register("memory", (opt) => {
626
634
  let transport = new import_neko_queue2.MemoryTransport(opt);
627
635
  return new import_neko_queue.QueueConnection(transport);
628
636
  });
@@ -650,9 +658,16 @@ CacheProviderFactory.register("file", (opt) => {
650
658
  CacheProviderFactory.register("disabled", (opt) => {
651
659
  return new import_neko_cache.DisabledCacheProvider();
652
660
  });
661
+ import_neko_storage.StorageProviderFactory.register("local", (opt) => {
662
+ return new import_neko_storage.LocalStorageProvider(opt);
663
+ });
664
+ import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
665
+ return new import_neko_storage.AWSS3StorageProvider(opt);
666
+ });
653
667
 
654
668
  // src/facades.mts
655
669
  var import_neko_cache2 = require("@devbro/neko-cache");
670
+ var import_neko_queue3 = require("@devbro/neko-queue");
656
671
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
657
672
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
658
673
  const rc = new import_neko_scheduler.Scheduler();
@@ -665,9 +680,12 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
665
680
  });
666
681
  return rc;
667
682
  });
668
- var storage = (0, import_neko_helper.createSingleton)(
669
- (label = "default") => import_neko_storage.StorageFactory.create(import_neko_config.config.get(["storages", label].join(".")))
670
- );
683
+ var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
684
+ var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
685
+ let storage_config = import_neko_config.config.get(["storages", label].join("."));
686
+ const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
687
+ return new import_neko_storage2.Storage(provider);
688
+ });
671
689
  var cli = (0, import_neko_helper.createSingleton)(() => {
672
690
  const [node, app, ...args] = process.argv;
673
691
  return new import_clipanion.Cli({
@@ -722,7 +740,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
722
740
  });
723
741
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
724
742
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
725
- let provider = MailerFactory.create(
743
+ const provider = MailerFactory.create(
726
744
  mailer_config.provider,
727
745
  mailer_config.config
728
746
  );
@@ -734,7 +752,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
734
752
  if (!queue_config) {
735
753
  throw new Error(`Queue configuration for '${label}' not found`);
736
754
  }
737
- const rc = QueueFactory.create(queue_config.type, queue_config);
755
+ const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
756
+ const rc = new import_neko_queue3.QueueConnection(provider);
738
757
  return rc;
739
758
  });
740
759
  var cache = (0, import_neko_helper.createSingleton)((label) => {
@@ -743,7 +762,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
743
762
  throw new Error(`Cache configuration for '${label}' not found`);
744
763
  }
745
764
  const provider = CacheProviderFactory.create(
746
- cache_config.type,
765
+ cache_config.provider,
747
766
  cache_config.config
748
767
  );
749
768
  return new import_neko_cache2.Cache(provider);
@@ -465,7 +465,7 @@ var Router = class {
465
465
  var import_neko_scheduler = require("@devbro/neko-scheduler");
466
466
  var import_neko_helper = require("@devbro/neko-helper");
467
467
  var import_neko_context2 = require("@devbro/neko-context");
468
- var import_neko_storage = require("@devbro/neko-storage");
468
+ var import_neko_storage2 = require("@devbro/neko-storage");
469
469
  var import_neko_mailer2 = require("@devbro/neko-mailer");
470
470
  var import_neko_config = require("@devbro/neko-config");
471
471
  var import_clipanion = require("clipanion");
@@ -489,31 +489,38 @@ __export(queue_exports, {
489
489
  DatabaseTransport: () => DatabaseTransport
490
490
  });
491
491
  __reExport(queue_exports, require("@devbro/neko-queue"));
492
- var import_neko_sql = require("@devbro/neko-sql");
493
492
  var DatabaseTransport = class {
494
- constructor(db_config) {
495
- this.db_config = db_config;
496
- }
497
493
  static {
498
494
  __name(this, "DatabaseTransport");
499
495
  }
500
- listenInterval = 6e4;
501
- // default to 1 minute
502
- messageLimit = 100;
503
- // default to 100 messages per fetch
504
496
  activeIntervals = /* @__PURE__ */ new Set();
497
+ config = {
498
+ queue_table: "queue_messages",
499
+ db_connection: "default",
500
+ listen_interval: 60,
501
+ // seconds
502
+ message_limit: 10
503
+ // messages per each fetch
504
+ };
505
+ constructor(config2) {
506
+ this.config = { ...this.config, ...config2 };
507
+ }
505
508
  setListenInterval(interval) {
506
- this.listenInterval = interval;
509
+ this.config.listen_interval = interval;
507
510
  }
508
511
  setMessageLimit(limit) {
509
- this.messageLimit = limit;
512
+ this.config.message_limit = limit;
510
513
  }
511
514
  async dispatch(channel, message) {
512
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
515
+ const conn = db(this.config.db_connection);
513
516
  try {
514
517
  await conn.connect();
518
+ let schema = conn.getSchema();
519
+ if (await schema.tableExists(this.config.queue_table) === false) {
520
+ return;
521
+ }
515
522
  let q = conn.getQuery();
516
- await q.table("queue_messages").insert({
523
+ await q.table(this.config.queue_table).insert({
517
524
  channel,
518
525
  message,
519
526
  processed: false,
@@ -529,20 +536,20 @@ var DatabaseTransport = class {
529
536
  async listen(channel, callback) {
530
537
  return new Promise(async (resolve, reject) => {
531
538
  const intervalId = setInterval(async () => {
532
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
539
+ const conn = db(this.config.db_connection);
533
540
  try {
534
541
  await conn.connect();
535
542
  let q = conn.getQuery();
536
- let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
543
+ let messages = await q.table(this.config.queue_table).whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.config.message_limit).orderBy("last_tried_at", "asc").get();
537
544
  for (let msg of messages) {
538
545
  try {
539
546
  await callback(msg.message);
540
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
547
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
541
548
  processed: true,
542
549
  updated_at: /* @__PURE__ */ new Date()
543
550
  });
544
551
  } catch (error) {
545
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
552
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
546
553
  processed: false,
547
554
  last_tried_at: /* @__PURE__ */ new Date(),
548
555
  process_message: error.message || "Error processing message"
@@ -551,11 +558,11 @@ var DatabaseTransport = class {
551
558
  }
552
559
  } catch (error) {
553
560
  this.activeIntervals.delete(intervalId);
554
- reject(error);
561
+ logger().error("Error in DatabaseTransport listen interval:", { error });
555
562
  } finally {
556
563
  await conn.disconnect();
557
564
  }
558
- }, this.listenInterval);
565
+ }, this.config.listen_interval * 1e3);
559
566
  this.activeIntervals.add(intervalId);
560
567
  });
561
568
  }
@@ -569,6 +576,7 @@ var DatabaseTransport = class {
569
576
 
570
577
  // src/factories.mts
571
578
  var import_neko_cache = require("@devbro/neko-cache");
579
+ var import_neko_storage = require("@devbro/neko-storage");
572
580
  var FlexibleFactory = class {
573
581
  static {
574
582
  __name(this, "FlexibleFactory");
@@ -605,32 +613,32 @@ MailerFactory.register("logger", (opt) => {
605
613
  });
606
614
  });
607
615
  });
608
- MailerFactory.register("SES", (opt) => {
616
+ MailerFactory.register("ses", (opt) => {
609
617
  return new import_neko_mailer.SESProvider(opt);
610
618
  });
611
- MailerFactory.register("SMTP", (opt) => {
619
+ MailerFactory.register("smtp", (opt) => {
612
620
  return new import_neko_mailer.SMTPProvider(opt);
613
621
  });
614
- MailerFactory.register("MEMORY", (opt) => {
622
+ MailerFactory.register("memory", (opt) => {
615
623
  return new import_neko_mailer.MemoryProvider();
616
624
  });
617
- var QueueFactory = class _QueueFactory {
625
+ var QueueTransportFactory = class _QueueTransportFactory {
618
626
  static {
619
- __name(this, "QueueFactory");
627
+ __name(this, "QueueTransportFactory");
620
628
  }
621
629
  static instance = new FlexibleFactory();
622
630
  static register(key, factory) {
623
- _QueueFactory.instance.register(key, factory);
631
+ _QueueTransportFactory.instance.register(key, factory);
624
632
  }
625
633
  static create(key, ...args) {
626
- return _QueueFactory.instance.create(key, ...args);
634
+ return _QueueTransportFactory.instance.create(key, ...args);
627
635
  }
628
636
  };
629
- QueueFactory.register("database", (opt) => {
637
+ QueueTransportFactory.register("database", (opt) => {
630
638
  let transport = new DatabaseTransport(opt);
631
639
  return new import_neko_queue.QueueConnection(transport);
632
640
  });
633
- QueueFactory.register("memory", (opt) => {
641
+ QueueTransportFactory.register("memory", (opt) => {
634
642
  let transport = new import_neko_queue2.MemoryTransport(opt);
635
643
  return new import_neko_queue.QueueConnection(transport);
636
644
  });
@@ -658,9 +666,16 @@ CacheProviderFactory.register("file", (opt) => {
658
666
  CacheProviderFactory.register("disabled", (opt) => {
659
667
  return new import_neko_cache.DisabledCacheProvider();
660
668
  });
669
+ import_neko_storage.StorageProviderFactory.register("local", (opt) => {
670
+ return new import_neko_storage.LocalStorageProvider(opt);
671
+ });
672
+ import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
673
+ return new import_neko_storage.AWSS3StorageProvider(opt);
674
+ });
661
675
 
662
676
  // src/facades.mts
663
677
  var import_neko_cache2 = require("@devbro/neko-cache");
678
+ var import_neko_queue3 = require("@devbro/neko-queue");
664
679
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
665
680
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
666
681
  const rc = new import_neko_scheduler.Scheduler();
@@ -674,9 +689,11 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
674
689
  return rc;
675
690
  });
676
691
  var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
677
- var storage = (0, import_neko_helper.createSingleton)(
678
- (label = "default") => import_neko_storage.StorageFactory.create(import_neko_config.config.get(["storages", label].join(".")))
679
- );
692
+ var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
693
+ let storage_config = import_neko_config.config.get(["storages", label].join("."));
694
+ const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
695
+ return new import_neko_storage2.Storage(provider);
696
+ });
680
697
  var cli = (0, import_neko_helper.createSingleton)(() => {
681
698
  const [node, app, ...args] = process.argv;
682
699
  return new import_clipanion.Cli({
@@ -731,7 +748,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
731
748
  });
732
749
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
733
750
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
734
- let provider = MailerFactory.create(
751
+ const provider = MailerFactory.create(
735
752
  mailer_config.provider,
736
753
  mailer_config.config
737
754
  );
@@ -743,7 +760,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
743
760
  if (!queue_config) {
744
761
  throw new Error(`Queue configuration for '${label}' not found`);
745
762
  }
746
- const rc = QueueFactory.create(queue_config.type, queue_config);
763
+ const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
764
+ const rc = new import_neko_queue3.QueueConnection(provider);
747
765
  return rc;
748
766
  });
749
767
  var cache = (0, import_neko_helper.createSingleton)((label) => {
@@ -752,7 +770,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
752
770
  throw new Error(`Cache configuration for '${label}' not found`);
753
771
  }
754
772
  const provider = CacheProviderFactory.create(
755
- cache_config.type,
773
+ cache_config.provider,
756
774
  cache_config.config
757
775
  );
758
776
  return new import_neko_cache2.Cache(provider);
@@ -35,7 +35,7 @@ __export(factories_exports, {
35
35
  CacheProviderFactory: () => CacheProviderFactory,
36
36
  FlexibleFactory: () => FlexibleFactory,
37
37
  MailerFactory: () => MailerFactory,
38
- QueueFactory: () => QueueFactory
38
+ QueueTransportFactory: () => QueueTransportFactory
39
39
  });
40
40
  module.exports = __toCommonJS(factories_exports);
41
41
  var import_neko_mailer2 = require("@devbro/neko-mailer");
@@ -473,6 +473,7 @@ __reExport(http_exports, require("@devbro/neko-http"));
473
473
  var yup = __toESM(require("yup"), 1);
474
474
  var import_neko_logger = require("@devbro/neko-logger");
475
475
  var import_neko_cache = require("@devbro/neko-cache");
476
+ var import_neko_queue = require("@devbro/neko-queue");
476
477
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
477
478
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
478
479
  const rc = new import_neko_scheduler.Scheduler();
@@ -485,9 +486,12 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
485
486
  });
486
487
  return rc;
487
488
  });
488
- var storage = (0, import_neko_helper.createSingleton)(
489
- (label = "default") => import_neko_storage.StorageFactory.create(import_neko_config.config.get(["storages", label].join(".")))
490
- );
489
+ var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
490
+ var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
491
+ let storage_config = import_neko_config.config.get(["storages", label].join("."));
492
+ const provider = import_neko_storage.StorageProviderFactory.create(storage_config.provider, storage_config.config);
493
+ return new import_neko_storage.Storage(provider);
494
+ });
491
495
  var cli = (0, import_neko_helper.createSingleton)(() => {
492
496
  const [node, app, ...args] = process.argv;
493
497
  return new import_clipanion.Cli({
@@ -542,7 +546,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
542
546
  });
543
547
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
544
548
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
545
- let provider = MailerFactory.create(
549
+ const provider = MailerFactory.create(
546
550
  mailer_config.provider,
547
551
  mailer_config.config
548
552
  );
@@ -554,7 +558,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
554
558
  if (!queue_config) {
555
559
  throw new Error(`Queue configuration for '${label}' not found`);
556
560
  }
557
- const rc = QueueFactory.create(queue_config.type, queue_config);
561
+ const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
562
+ const rc = new import_neko_queue.QueueConnection(provider);
558
563
  return rc;
559
564
  });
560
565
  var cache = (0, import_neko_helper.createSingleton)((label) => {
@@ -563,15 +568,15 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
563
568
  throw new Error(`Cache configuration for '${label}' not found`);
564
569
  }
565
570
  const provider = CacheProviderFactory.create(
566
- cache_config.type,
571
+ cache_config.provider,
567
572
  cache_config.config
568
573
  );
569
574
  return new import_neko_cache.Cache(provider);
570
575
  });
571
576
 
572
577
  // src/factories.mts
573
- var import_neko_queue = require("@devbro/neko-queue");
574
578
  var import_neko_queue2 = require("@devbro/neko-queue");
579
+ var import_neko_queue3 = require("@devbro/neko-queue");
575
580
 
576
581
  // src/queue.mts
577
582
  var queue_exports = {};
@@ -579,31 +584,38 @@ __export(queue_exports, {
579
584
  DatabaseTransport: () => DatabaseTransport
580
585
  });
581
586
  __reExport(queue_exports, require("@devbro/neko-queue"));
582
- var import_neko_sql = require("@devbro/neko-sql");
583
587
  var DatabaseTransport = class {
584
- constructor(db_config) {
585
- this.db_config = db_config;
586
- }
587
588
  static {
588
589
  __name(this, "DatabaseTransport");
589
590
  }
590
- listenInterval = 6e4;
591
- // default to 1 minute
592
- messageLimit = 100;
593
- // default to 100 messages per fetch
594
591
  activeIntervals = /* @__PURE__ */ new Set();
592
+ config = {
593
+ queue_table: "queue_messages",
594
+ db_connection: "default",
595
+ listen_interval: 60,
596
+ // seconds
597
+ message_limit: 10
598
+ // messages per each fetch
599
+ };
600
+ constructor(config2) {
601
+ this.config = { ...this.config, ...config2 };
602
+ }
595
603
  setListenInterval(interval) {
596
- this.listenInterval = interval;
604
+ this.config.listen_interval = interval;
597
605
  }
598
606
  setMessageLimit(limit) {
599
- this.messageLimit = limit;
607
+ this.config.message_limit = limit;
600
608
  }
601
609
  async dispatch(channel, message) {
602
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
610
+ const conn = db(this.config.db_connection);
603
611
  try {
604
612
  await conn.connect();
613
+ let schema = conn.getSchema();
614
+ if (await schema.tableExists(this.config.queue_table) === false) {
615
+ return;
616
+ }
605
617
  let q = conn.getQuery();
606
- await q.table("queue_messages").insert({
618
+ await q.table(this.config.queue_table).insert({
607
619
  channel,
608
620
  message,
609
621
  processed: false,
@@ -619,20 +631,20 @@ var DatabaseTransport = class {
619
631
  async listen(channel, callback) {
620
632
  return new Promise(async (resolve, reject) => {
621
633
  const intervalId = setInterval(async () => {
622
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
634
+ const conn = db(this.config.db_connection);
623
635
  try {
624
636
  await conn.connect();
625
637
  let q = conn.getQuery();
626
- let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
638
+ let messages = await q.table(this.config.queue_table).whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.config.message_limit).orderBy("last_tried_at", "asc").get();
627
639
  for (let msg of messages) {
628
640
  try {
629
641
  await callback(msg.message);
630
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
642
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
631
643
  processed: true,
632
644
  updated_at: /* @__PURE__ */ new Date()
633
645
  });
634
646
  } catch (error) {
635
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
647
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
636
648
  processed: false,
637
649
  last_tried_at: /* @__PURE__ */ new Date(),
638
650
  process_message: error.message || "Error processing message"
@@ -641,11 +653,11 @@ var DatabaseTransport = class {
641
653
  }
642
654
  } catch (error) {
643
655
  this.activeIntervals.delete(intervalId);
644
- reject(error);
656
+ logger().error("Error in DatabaseTransport listen interval:", { error });
645
657
  } finally {
646
658
  await conn.disconnect();
647
659
  }
648
- }, this.listenInterval);
660
+ }, this.config.listen_interval * 1e3);
649
661
  this.activeIntervals.add(intervalId);
650
662
  });
651
663
  }
@@ -659,6 +671,7 @@ var DatabaseTransport = class {
659
671
 
660
672
  // src/factories.mts
661
673
  var import_neko_cache2 = require("@devbro/neko-cache");
674
+ var import_neko_storage2 = require("@devbro/neko-storage");
662
675
  var FlexibleFactory = class {
663
676
  static {
664
677
  __name(this, "FlexibleFactory");
@@ -695,34 +708,34 @@ MailerFactory.register("logger", (opt) => {
695
708
  });
696
709
  });
697
710
  });
698
- MailerFactory.register("SES", (opt) => {
711
+ MailerFactory.register("ses", (opt) => {
699
712
  return new import_neko_mailer2.SESProvider(opt);
700
713
  });
701
- MailerFactory.register("SMTP", (opt) => {
714
+ MailerFactory.register("smtp", (opt) => {
702
715
  return new import_neko_mailer2.SMTPProvider(opt);
703
716
  });
704
- MailerFactory.register("MEMORY", (opt) => {
717
+ MailerFactory.register("memory", (opt) => {
705
718
  return new import_neko_mailer2.MemoryProvider();
706
719
  });
707
- var QueueFactory = class _QueueFactory {
720
+ var QueueTransportFactory = class _QueueTransportFactory {
708
721
  static {
709
- __name(this, "QueueFactory");
722
+ __name(this, "QueueTransportFactory");
710
723
  }
711
724
  static instance = new FlexibleFactory();
712
725
  static register(key, factory) {
713
- _QueueFactory.instance.register(key, factory);
726
+ _QueueTransportFactory.instance.register(key, factory);
714
727
  }
715
728
  static create(key, ...args) {
716
- return _QueueFactory.instance.create(key, ...args);
729
+ return _QueueTransportFactory.instance.create(key, ...args);
717
730
  }
718
731
  };
719
- QueueFactory.register("database", (opt) => {
732
+ QueueTransportFactory.register("database", (opt) => {
720
733
  let transport = new DatabaseTransport(opt);
721
- return new import_neko_queue.QueueConnection(transport);
734
+ return new import_neko_queue2.QueueConnection(transport);
722
735
  });
723
- QueueFactory.register("memory", (opt) => {
724
- let transport = new import_neko_queue2.MemoryTransport(opt);
725
- return new import_neko_queue.QueueConnection(transport);
736
+ QueueTransportFactory.register("memory", (opt) => {
737
+ let transport = new import_neko_queue3.MemoryTransport(opt);
738
+ return new import_neko_queue2.QueueConnection(transport);
726
739
  });
727
740
  var CacheProviderFactory = class _CacheProviderFactory {
728
741
  static {
@@ -748,10 +761,16 @@ CacheProviderFactory.register("file", (opt) => {
748
761
  CacheProviderFactory.register("disabled", (opt) => {
749
762
  return new import_neko_cache2.DisabledCacheProvider();
750
763
  });
764
+ import_neko_storage2.StorageProviderFactory.register("local", (opt) => {
765
+ return new import_neko_storage2.LocalStorageProvider(opt);
766
+ });
767
+ import_neko_storage2.StorageProviderFactory.register("s3", (opt) => {
768
+ return new import_neko_storage2.AWSS3StorageProvider(opt);
769
+ });
751
770
  // Annotate the CommonJS export names for ESM import in node:
752
771
  0 && (module.exports = {
753
772
  CacheProviderFactory,
754
773
  FlexibleFactory,
755
774
  MailerFactory,
756
- QueueFactory
775
+ QueueTransportFactory
757
776
  });