@devbro/pashmak 0.1.18 → 0.1.19

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
@@ -458,7 +458,7 @@ var Router = class {
458
458
  var import_neko_scheduler = require("@devbro/neko-scheduler");
459
459
  var import_neko_helper = require("@devbro/neko-helper");
460
460
  var import_neko_context2 = require("@devbro/neko-context");
461
- var import_neko_storage = require("@devbro/neko-storage");
461
+ var import_neko_storage2 = require("@devbro/neko-storage");
462
462
  var import_neko_mailer2 = require("@devbro/neko-mailer");
463
463
  var import_neko_config = require("@devbro/neko-config");
464
464
  var import_clipanion = require("clipanion");
@@ -482,31 +482,38 @@ __export(queue_exports, {
482
482
  DatabaseTransport: () => DatabaseTransport
483
483
  });
484
484
  __reExport(queue_exports, require("@devbro/neko-queue"));
485
- var import_neko_sql = require("@devbro/neko-sql");
486
485
  var DatabaseTransport = class {
487
- constructor(db_config) {
488
- this.db_config = db_config;
489
- }
490
486
  static {
491
487
  __name(this, "DatabaseTransport");
492
488
  }
493
- listenInterval = 6e4;
494
- // default to 1 minute
495
- messageLimit = 100;
496
- // default to 100 messages per fetch
497
489
  activeIntervals = /* @__PURE__ */ new Set();
490
+ config = {
491
+ queue_table: "queue_messages",
492
+ db_connection: "default",
493
+ listen_interval: 60,
494
+ // seconds
495
+ message_limit: 10
496
+ // messages per each fetch
497
+ };
498
+ constructor(config3) {
499
+ this.config = { ...this.config, ...config3 };
500
+ }
498
501
  setListenInterval(interval) {
499
- this.listenInterval = interval;
502
+ this.config.listen_interval = interval;
500
503
  }
501
504
  setMessageLimit(limit) {
502
- this.messageLimit = limit;
505
+ this.config.message_limit = limit;
503
506
  }
504
507
  async dispatch(channel, message) {
505
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
508
+ const conn = db(this.config.db_connection);
506
509
  try {
507
510
  await conn.connect();
511
+ let schema = conn.getSchema();
512
+ if (await schema.tableExists(this.config.queue_table) === false) {
513
+ return;
514
+ }
508
515
  let q = conn.getQuery();
509
- await q.table("queue_messages").insert({
516
+ await q.table(this.config.queue_table).insert({
510
517
  channel,
511
518
  message,
512
519
  processed: false,
@@ -522,20 +529,20 @@ var DatabaseTransport = class {
522
529
  async listen(channel, callback) {
523
530
  return new Promise(async (resolve, reject) => {
524
531
  const intervalId = setInterval(async () => {
525
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
532
+ const conn = db(this.config.db_connection);
526
533
  try {
527
534
  await conn.connect();
528
535
  let q = conn.getQuery();
529
- let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
536
+ 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();
530
537
  for (let msg of messages) {
531
538
  try {
532
539
  await callback(msg.message);
533
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
540
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
534
541
  processed: true,
535
542
  updated_at: /* @__PURE__ */ new Date()
536
543
  });
537
544
  } catch (error) {
538
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
545
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
539
546
  processed: false,
540
547
  last_tried_at: /* @__PURE__ */ new Date(),
541
548
  process_message: error.message || "Error processing message"
@@ -544,11 +551,11 @@ var DatabaseTransport = class {
544
551
  }
545
552
  } catch (error) {
546
553
  this.activeIntervals.delete(intervalId);
547
- reject(error);
554
+ logger().error("Error in DatabaseTransport listen interval:", { error });
548
555
  } finally {
549
556
  await conn.disconnect();
550
557
  }
551
- }, this.listenInterval);
558
+ }, this.config.listen_interval * 1e3);
552
559
  this.activeIntervals.add(intervalId);
553
560
  });
554
561
  }
@@ -562,6 +569,7 @@ var DatabaseTransport = class {
562
569
 
563
570
  // src/factories.mts
564
571
  var import_neko_cache = require("@devbro/neko-cache");
572
+ var import_neko_storage = require("@devbro/neko-storage");
565
573
  var FlexibleFactory = class {
566
574
  static {
567
575
  __name(this, "FlexibleFactory");
@@ -598,32 +606,32 @@ MailerFactory.register("logger", (opt) => {
598
606
  });
599
607
  });
600
608
  });
601
- MailerFactory.register("SES", (opt) => {
609
+ MailerFactory.register("ses", (opt) => {
602
610
  return new import_neko_mailer.SESProvider(opt);
603
611
  });
604
- MailerFactory.register("SMTP", (opt) => {
612
+ MailerFactory.register("smtp", (opt) => {
605
613
  return new import_neko_mailer.SMTPProvider(opt);
606
614
  });
607
- MailerFactory.register("MEMORY", (opt) => {
615
+ MailerFactory.register("memory", (opt) => {
608
616
  return new import_neko_mailer.MemoryProvider();
609
617
  });
610
- var QueueFactory = class _QueueFactory {
618
+ var QueueTransportFactory = class _QueueTransportFactory {
611
619
  static {
612
- __name(this, "QueueFactory");
620
+ __name(this, "QueueTransportFactory");
613
621
  }
614
622
  static instance = new FlexibleFactory();
615
623
  static register(key, factory) {
616
- _QueueFactory.instance.register(key, factory);
624
+ _QueueTransportFactory.instance.register(key, factory);
617
625
  }
618
626
  static create(key, ...args) {
619
- return _QueueFactory.instance.create(key, ...args);
627
+ return _QueueTransportFactory.instance.create(key, ...args);
620
628
  }
621
629
  };
622
- QueueFactory.register("database", (opt) => {
630
+ QueueTransportFactory.register("database", (opt) => {
623
631
  let transport = new DatabaseTransport(opt);
624
632
  return new import_neko_queue.QueueConnection(transport);
625
633
  });
626
- QueueFactory.register("memory", (opt) => {
634
+ QueueTransportFactory.register("memory", (opt) => {
627
635
  let transport = new import_neko_queue2.MemoryTransport(opt);
628
636
  return new import_neko_queue.QueueConnection(transport);
629
637
  });
@@ -651,9 +659,16 @@ CacheProviderFactory.register("file", (opt) => {
651
659
  CacheProviderFactory.register("disabled", (opt) => {
652
660
  return new import_neko_cache.DisabledCacheProvider();
653
661
  });
662
+ import_neko_storage.StorageProviderFactory.register("local", (opt) => {
663
+ return new import_neko_storage.LocalStorageProvider(opt);
664
+ });
665
+ import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
666
+ return new import_neko_storage.AWSS3StorageProvider(opt);
667
+ });
654
668
 
655
669
  // src/facades.mts
656
670
  var import_neko_cache2 = require("@devbro/neko-cache");
671
+ var import_neko_queue3 = require("@devbro/neko-queue");
657
672
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
658
673
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
659
674
  const rc = new import_neko_scheduler.Scheduler();
@@ -666,9 +681,12 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
666
681
  });
667
682
  return rc;
668
683
  });
669
- var storage = (0, import_neko_helper.createSingleton)(
670
- (label = "default") => import_neko_storage.StorageFactory.create(import_neko_config.config.get(["storages", label].join(".")))
671
- );
684
+ var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
685
+ var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
686
+ let storage_config = import_neko_config.config.get(["storages", label].join("."));
687
+ const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
688
+ return new import_neko_storage2.Storage(provider);
689
+ });
672
690
  var cli = (0, import_neko_helper.createSingleton)(() => {
673
691
  const [node, app, ...args] = process.argv;
674
692
  return new import_clipanion.Cli({
@@ -723,7 +741,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
723
741
  });
724
742
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
725
743
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
726
- let provider = MailerFactory.create(
744
+ const provider = MailerFactory.create(
727
745
  mailer_config.provider,
728
746
  mailer_config.config
729
747
  );
@@ -735,7 +753,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
735
753
  if (!queue_config) {
736
754
  throw new Error(`Queue configuration for '${label}' not found`);
737
755
  }
738
- const rc = QueueFactory.create(queue_config.type, queue_config);
756
+ const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
757
+ const rc = new import_neko_queue3.QueueConnection(provider);
739
758
  return rc;
740
759
  });
741
760
  var cache = (0, import_neko_helper.createSingleton)((label) => {
@@ -744,14 +763,14 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
744
763
  throw new Error(`Cache configuration for '${label}' not found`);
745
764
  }
746
765
  const provider = CacheProviderFactory.create(
747
- cache_config.type,
766
+ cache_config.provider,
748
767
  cache_config.config
749
768
  );
750
769
  return new import_neko_cache2.Cache(provider);
751
770
  });
752
771
 
753
772
  // src/app/console/StartCommand.mts
754
- var import_neko_sql2 = require("@devbro/neko-sql");
773
+ var import_neko_sql = require("@devbro/neko-sql");
755
774
  var StartCommand = class extends import_clipanion2.Command {
756
775
  static {
757
776
  __name(this, "StartCommand");
@@ -771,7 +790,7 @@ var StartCommand = class extends import_clipanion2.Command {
771
790
  }
772
791
  logger().info(`Starting Server
773
792
  `);
774
- import_neko_sql2.PostgresqlConnection.defaults.idleTimeoutMillis = 1e4;
793
+ import_neko_sql.PostgresqlConnection.defaults.idleTimeoutMillis = 1e4;
775
794
  if (this.scheduler || this.all) {
776
795
  logger().info(`starting scheduler
777
796
  `);
@@ -456,7 +456,7 @@ var Router = class {
456
456
  var import_neko_scheduler = require("@devbro/neko-scheduler");
457
457
  var import_neko_helper = require("@devbro/neko-helper");
458
458
  var import_neko_context2 = require("@devbro/neko-context");
459
- var import_neko_storage = require("@devbro/neko-storage");
459
+ var import_neko_storage2 = require("@devbro/neko-storage");
460
460
  var import_neko_mailer2 = require("@devbro/neko-mailer");
461
461
  var import_neko_config = require("@devbro/neko-config");
462
462
  var import_clipanion = require("clipanion");
@@ -480,31 +480,38 @@ __export(queue_exports, {
480
480
  DatabaseTransport: () => DatabaseTransport
481
481
  });
482
482
  __reExport(queue_exports, require("@devbro/neko-queue"));
483
- var import_neko_sql = require("@devbro/neko-sql");
484
483
  var DatabaseTransport = class {
485
- constructor(db_config) {
486
- this.db_config = db_config;
487
- }
488
484
  static {
489
485
  __name(this, "DatabaseTransport");
490
486
  }
491
- listenInterval = 6e4;
492
- // default to 1 minute
493
- messageLimit = 100;
494
- // default to 100 messages per fetch
495
487
  activeIntervals = /* @__PURE__ */ new Set();
488
+ config = {
489
+ queue_table: "queue_messages",
490
+ db_connection: "default",
491
+ listen_interval: 60,
492
+ // seconds
493
+ message_limit: 10
494
+ // messages per each fetch
495
+ };
496
+ constructor(config3) {
497
+ this.config = { ...this.config, ...config3 };
498
+ }
496
499
  setListenInterval(interval) {
497
- this.listenInterval = interval;
500
+ this.config.listen_interval = interval;
498
501
  }
499
502
  setMessageLimit(limit) {
500
- this.messageLimit = limit;
503
+ this.config.message_limit = limit;
501
504
  }
502
505
  async dispatch(channel, message) {
503
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
506
+ const conn = db(this.config.db_connection);
504
507
  try {
505
508
  await conn.connect();
509
+ let schema = conn.getSchema();
510
+ if (await schema.tableExists(this.config.queue_table) === false) {
511
+ return;
512
+ }
506
513
  let q = conn.getQuery();
507
- await q.table("queue_messages").insert({
514
+ await q.table(this.config.queue_table).insert({
508
515
  channel,
509
516
  message,
510
517
  processed: false,
@@ -520,20 +527,20 @@ var DatabaseTransport = class {
520
527
  async listen(channel, callback) {
521
528
  return new Promise(async (resolve, reject) => {
522
529
  const intervalId = setInterval(async () => {
523
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
530
+ const conn = db(this.config.db_connection);
524
531
  try {
525
532
  await conn.connect();
526
533
  let q = conn.getQuery();
527
- let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
534
+ 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();
528
535
  for (let msg of messages) {
529
536
  try {
530
537
  await callback(msg.message);
531
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
538
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
532
539
  processed: true,
533
540
  updated_at: /* @__PURE__ */ new Date()
534
541
  });
535
542
  } catch (error) {
536
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
543
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
537
544
  processed: false,
538
545
  last_tried_at: /* @__PURE__ */ new Date(),
539
546
  process_message: error.message || "Error processing message"
@@ -542,11 +549,11 @@ var DatabaseTransport = class {
542
549
  }
543
550
  } catch (error) {
544
551
  this.activeIntervals.delete(intervalId);
545
- reject(error);
552
+ logger().error("Error in DatabaseTransport listen interval:", { error });
546
553
  } finally {
547
554
  await conn.disconnect();
548
555
  }
549
- }, this.listenInterval);
556
+ }, this.config.listen_interval * 1e3);
550
557
  this.activeIntervals.add(intervalId);
551
558
  });
552
559
  }
@@ -560,6 +567,7 @@ var DatabaseTransport = class {
560
567
 
561
568
  // src/factories.mts
562
569
  var import_neko_cache = require("@devbro/neko-cache");
570
+ var import_neko_storage = require("@devbro/neko-storage");
563
571
  var FlexibleFactory = class {
564
572
  static {
565
573
  __name(this, "FlexibleFactory");
@@ -596,32 +604,32 @@ MailerFactory.register("logger", (opt) => {
596
604
  });
597
605
  });
598
606
  });
599
- MailerFactory.register("SES", (opt) => {
607
+ MailerFactory.register("ses", (opt) => {
600
608
  return new import_neko_mailer.SESProvider(opt);
601
609
  });
602
- MailerFactory.register("SMTP", (opt) => {
610
+ MailerFactory.register("smtp", (opt) => {
603
611
  return new import_neko_mailer.SMTPProvider(opt);
604
612
  });
605
- MailerFactory.register("MEMORY", (opt) => {
613
+ MailerFactory.register("memory", (opt) => {
606
614
  return new import_neko_mailer.MemoryProvider();
607
615
  });
608
- var QueueFactory = class _QueueFactory {
616
+ var QueueTransportFactory = class _QueueTransportFactory {
609
617
  static {
610
- __name(this, "QueueFactory");
618
+ __name(this, "QueueTransportFactory");
611
619
  }
612
620
  static instance = new FlexibleFactory();
613
621
  static register(key, factory) {
614
- _QueueFactory.instance.register(key, factory);
622
+ _QueueTransportFactory.instance.register(key, factory);
615
623
  }
616
624
  static create(key, ...args) {
617
- return _QueueFactory.instance.create(key, ...args);
625
+ return _QueueTransportFactory.instance.create(key, ...args);
618
626
  }
619
627
  };
620
- QueueFactory.register("database", (opt) => {
628
+ QueueTransportFactory.register("database", (opt) => {
621
629
  let transport = new DatabaseTransport(opt);
622
630
  return new import_neko_queue.QueueConnection(transport);
623
631
  });
624
- QueueFactory.register("memory", (opt) => {
632
+ QueueTransportFactory.register("memory", (opt) => {
625
633
  let transport = new import_neko_queue2.MemoryTransport(opt);
626
634
  return new import_neko_queue.QueueConnection(transport);
627
635
  });
@@ -649,9 +657,16 @@ CacheProviderFactory.register("file", (opt) => {
649
657
  CacheProviderFactory.register("disabled", (opt) => {
650
658
  return new import_neko_cache.DisabledCacheProvider();
651
659
  });
660
+ import_neko_storage.StorageProviderFactory.register("local", (opt) => {
661
+ return new import_neko_storage.LocalStorageProvider(opt);
662
+ });
663
+ import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
664
+ return new import_neko_storage.AWSS3StorageProvider(opt);
665
+ });
652
666
 
653
667
  // src/facades.mts
654
668
  var import_neko_cache2 = require("@devbro/neko-cache");
669
+ var import_neko_queue3 = require("@devbro/neko-queue");
655
670
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
656
671
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
657
672
  const rc = new import_neko_scheduler.Scheduler();
@@ -664,9 +679,12 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
664
679
  });
665
680
  return rc;
666
681
  });
667
- var storage = (0, import_neko_helper.createSingleton)(
668
- (label = "default") => import_neko_storage.StorageFactory.create(import_neko_config.config.get(["storages", label].join(".")))
669
- );
682
+ var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
683
+ var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
684
+ let storage_config = import_neko_config.config.get(["storages", label].join("."));
685
+ const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
686
+ return new import_neko_storage2.Storage(provider);
687
+ });
670
688
  var cli = (0, import_neko_helper.createSingleton)(() => {
671
689
  const [node, app, ...args] = process.argv;
672
690
  return new import_clipanion.Cli({
@@ -721,7 +739,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
721
739
  });
722
740
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
723
741
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
724
- let provider = MailerFactory.create(
742
+ const provider = MailerFactory.create(
725
743
  mailer_config.provider,
726
744
  mailer_config.config
727
745
  );
@@ -733,7 +751,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
733
751
  if (!queue_config) {
734
752
  throw new Error(`Queue configuration for '${label}' not found`);
735
753
  }
736
- const rc = QueueFactory.create(queue_config.type, queue_config);
754
+ const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
755
+ const rc = new import_neko_queue3.QueueConnection(provider);
737
756
  return rc;
738
757
  });
739
758
  var cache = (0, import_neko_helper.createSingleton)((label) => {
@@ -742,7 +761,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
742
761
  throw new Error(`Cache configuration for '${label}' not found`);
743
762
  }
744
763
  const provider = CacheProviderFactory.create(
745
- cache_config.type,
764
+ cache_config.provider,
746
765
  cache_config.config
747
766
  );
748
767
  return new import_neko_cache2.Cache(provider);
@@ -456,7 +456,7 @@ var Router = class {
456
456
  var import_neko_scheduler = require("@devbro/neko-scheduler");
457
457
  var import_neko_helper = require("@devbro/neko-helper");
458
458
  var import_neko_context2 = require("@devbro/neko-context");
459
- var import_neko_storage = require("@devbro/neko-storage");
459
+ var import_neko_storage2 = require("@devbro/neko-storage");
460
460
  var import_neko_mailer2 = require("@devbro/neko-mailer");
461
461
  var import_neko_config = require("@devbro/neko-config");
462
462
  var import_clipanion = require("clipanion");
@@ -480,31 +480,38 @@ __export(queue_exports, {
480
480
  DatabaseTransport: () => DatabaseTransport
481
481
  });
482
482
  __reExport(queue_exports, require("@devbro/neko-queue"));
483
- var import_neko_sql = require("@devbro/neko-sql");
484
483
  var DatabaseTransport = class {
485
- constructor(db_config) {
486
- this.db_config = db_config;
487
- }
488
484
  static {
489
485
  __name(this, "DatabaseTransport");
490
486
  }
491
- listenInterval = 6e4;
492
- // default to 1 minute
493
- messageLimit = 100;
494
- // default to 100 messages per fetch
495
487
  activeIntervals = /* @__PURE__ */ new Set();
488
+ config = {
489
+ queue_table: "queue_messages",
490
+ db_connection: "default",
491
+ listen_interval: 60,
492
+ // seconds
493
+ message_limit: 10
494
+ // messages per each fetch
495
+ };
496
+ constructor(config3) {
497
+ this.config = { ...this.config, ...config3 };
498
+ }
496
499
  setListenInterval(interval) {
497
- this.listenInterval = interval;
500
+ this.config.listen_interval = interval;
498
501
  }
499
502
  setMessageLimit(limit) {
500
- this.messageLimit = limit;
503
+ this.config.message_limit = limit;
501
504
  }
502
505
  async dispatch(channel, message) {
503
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
506
+ const conn = db(this.config.db_connection);
504
507
  try {
505
508
  await conn.connect();
509
+ let schema = conn.getSchema();
510
+ if (await schema.tableExists(this.config.queue_table) === false) {
511
+ return;
512
+ }
506
513
  let q = conn.getQuery();
507
- await q.table("queue_messages").insert({
514
+ await q.table(this.config.queue_table).insert({
508
515
  channel,
509
516
  message,
510
517
  processed: false,
@@ -520,20 +527,20 @@ var DatabaseTransport = class {
520
527
  async listen(channel, callback) {
521
528
  return new Promise(async (resolve, reject) => {
522
529
  const intervalId = setInterval(async () => {
523
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
530
+ const conn = db(this.config.db_connection);
524
531
  try {
525
532
  await conn.connect();
526
533
  let q = conn.getQuery();
527
- let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
534
+ 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();
528
535
  for (let msg of messages) {
529
536
  try {
530
537
  await callback(msg.message);
531
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
538
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
532
539
  processed: true,
533
540
  updated_at: /* @__PURE__ */ new Date()
534
541
  });
535
542
  } catch (error) {
536
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
543
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
537
544
  processed: false,
538
545
  last_tried_at: /* @__PURE__ */ new Date(),
539
546
  process_message: error.message || "Error processing message"
@@ -542,11 +549,11 @@ var DatabaseTransport = class {
542
549
  }
543
550
  } catch (error) {
544
551
  this.activeIntervals.delete(intervalId);
545
- reject(error);
552
+ logger().error("Error in DatabaseTransport listen interval:", { error });
546
553
  } finally {
547
554
  await conn.disconnect();
548
555
  }
549
- }, this.listenInterval);
556
+ }, this.config.listen_interval * 1e3);
550
557
  this.activeIntervals.add(intervalId);
551
558
  });
552
559
  }
@@ -560,6 +567,7 @@ var DatabaseTransport = class {
560
567
 
561
568
  // src/factories.mts
562
569
  var import_neko_cache = require("@devbro/neko-cache");
570
+ var import_neko_storage = require("@devbro/neko-storage");
563
571
  var FlexibleFactory = class {
564
572
  static {
565
573
  __name(this, "FlexibleFactory");
@@ -596,32 +604,32 @@ MailerFactory.register("logger", (opt) => {
596
604
  });
597
605
  });
598
606
  });
599
- MailerFactory.register("SES", (opt) => {
607
+ MailerFactory.register("ses", (opt) => {
600
608
  return new import_neko_mailer.SESProvider(opt);
601
609
  });
602
- MailerFactory.register("SMTP", (opt) => {
610
+ MailerFactory.register("smtp", (opt) => {
603
611
  return new import_neko_mailer.SMTPProvider(opt);
604
612
  });
605
- MailerFactory.register("MEMORY", (opt) => {
613
+ MailerFactory.register("memory", (opt) => {
606
614
  return new import_neko_mailer.MemoryProvider();
607
615
  });
608
- var QueueFactory = class _QueueFactory {
616
+ var QueueTransportFactory = class _QueueTransportFactory {
609
617
  static {
610
- __name(this, "QueueFactory");
618
+ __name(this, "QueueTransportFactory");
611
619
  }
612
620
  static instance = new FlexibleFactory();
613
621
  static register(key, factory) {
614
- _QueueFactory.instance.register(key, factory);
622
+ _QueueTransportFactory.instance.register(key, factory);
615
623
  }
616
624
  static create(key, ...args) {
617
- return _QueueFactory.instance.create(key, ...args);
625
+ return _QueueTransportFactory.instance.create(key, ...args);
618
626
  }
619
627
  };
620
- QueueFactory.register("database", (opt) => {
628
+ QueueTransportFactory.register("database", (opt) => {
621
629
  let transport = new DatabaseTransport(opt);
622
630
  return new import_neko_queue.QueueConnection(transport);
623
631
  });
624
- QueueFactory.register("memory", (opt) => {
632
+ QueueTransportFactory.register("memory", (opt) => {
625
633
  let transport = new import_neko_queue2.MemoryTransport(opt);
626
634
  return new import_neko_queue.QueueConnection(transport);
627
635
  });
@@ -649,9 +657,16 @@ CacheProviderFactory.register("file", (opt) => {
649
657
  CacheProviderFactory.register("disabled", (opt) => {
650
658
  return new import_neko_cache.DisabledCacheProvider();
651
659
  });
660
+ import_neko_storage.StorageProviderFactory.register("local", (opt) => {
661
+ return new import_neko_storage.LocalStorageProvider(opt);
662
+ });
663
+ import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
664
+ return new import_neko_storage.AWSS3StorageProvider(opt);
665
+ });
652
666
 
653
667
  // src/facades.mts
654
668
  var import_neko_cache2 = require("@devbro/neko-cache");
669
+ var import_neko_queue3 = require("@devbro/neko-queue");
655
670
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
656
671
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
657
672
  const rc = new import_neko_scheduler.Scheduler();
@@ -664,9 +679,12 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
664
679
  });
665
680
  return rc;
666
681
  });
667
- var storage = (0, import_neko_helper.createSingleton)(
668
- (label = "default") => import_neko_storage.StorageFactory.create(import_neko_config.config.get(["storages", label].join(".")))
669
- );
682
+ var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
683
+ var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
684
+ let storage_config = import_neko_config.config.get(["storages", label].join("."));
685
+ const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
686
+ return new import_neko_storage2.Storage(provider);
687
+ });
670
688
  var cli = (0, import_neko_helper.createSingleton)(() => {
671
689
  const [node, app, ...args] = process.argv;
672
690
  return new import_clipanion.Cli({
@@ -721,7 +739,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
721
739
  });
722
740
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
723
741
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
724
- let provider = MailerFactory.create(
742
+ const provider = MailerFactory.create(
725
743
  mailer_config.provider,
726
744
  mailer_config.config
727
745
  );
@@ -733,7 +751,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
733
751
  if (!queue_config) {
734
752
  throw new Error(`Queue configuration for '${label}' not found`);
735
753
  }
736
- const rc = QueueFactory.create(queue_config.type, queue_config);
754
+ const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
755
+ const rc = new import_neko_queue3.QueueConnection(provider);
737
756
  return rc;
738
757
  });
739
758
  var cache = (0, import_neko_helper.createSingleton)((label) => {
@@ -742,7 +761,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
742
761
  throw new Error(`Cache configuration for '${label}' not found`);
743
762
  }
744
763
  const provider = CacheProviderFactory.create(
745
- cache_config.type,
764
+ cache_config.provider,
746
765
  cache_config.config
747
766
  );
748
767
  return new import_neko_cache2.Cache(provider);