@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
@@ -1619,7 +1619,7 @@ var Router = class {
1619
1619
  var import_neko_scheduler = require("@devbro/neko-scheduler");
1620
1620
  var import_neko_helper = require("@devbro/neko-helper");
1621
1621
  var import_neko_context2 = require("@devbro/neko-context");
1622
- var import_neko_storage = require("@devbro/neko-storage");
1622
+ var import_neko_storage2 = require("@devbro/neko-storage");
1623
1623
  var import_neko_mailer2 = require("@devbro/neko-mailer");
1624
1624
  var import_neko_config = require("@devbro/neko-config");
1625
1625
  var import_clipanion = require("clipanion");
@@ -1643,31 +1643,38 @@ __export(queue_exports, {
1643
1643
  DatabaseTransport: () => DatabaseTransport
1644
1644
  });
1645
1645
  __reExport(queue_exports, require("@devbro/neko-queue"));
1646
- var import_neko_sql = require("@devbro/neko-sql");
1647
1646
  var DatabaseTransport = class {
1648
- constructor(db_config) {
1649
- this.db_config = db_config;
1650
- }
1651
1647
  static {
1652
1648
  __name(this, "DatabaseTransport");
1653
1649
  }
1654
- listenInterval = 6e4;
1655
- // default to 1 minute
1656
- messageLimit = 100;
1657
- // default to 100 messages per fetch
1658
1650
  activeIntervals = /* @__PURE__ */ new Set();
1651
+ config = {
1652
+ queue_table: "queue_messages",
1653
+ db_connection: "default",
1654
+ listen_interval: 60,
1655
+ // seconds
1656
+ message_limit: 10
1657
+ // messages per each fetch
1658
+ };
1659
+ constructor(config8) {
1660
+ this.config = { ...this.config, ...config8 };
1661
+ }
1659
1662
  setListenInterval(interval) {
1660
- this.listenInterval = interval;
1663
+ this.config.listen_interval = interval;
1661
1664
  }
1662
1665
  setMessageLimit(limit) {
1663
- this.messageLimit = limit;
1666
+ this.config.message_limit = limit;
1664
1667
  }
1665
1668
  async dispatch(channel, message) {
1666
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
1669
+ const conn = db(this.config.db_connection);
1667
1670
  try {
1668
1671
  await conn.connect();
1672
+ let schema = conn.getSchema();
1673
+ if (await schema.tableExists(this.config.queue_table) === false) {
1674
+ return;
1675
+ }
1669
1676
  let q = conn.getQuery();
1670
- await q.table("queue_messages").insert({
1677
+ await q.table(this.config.queue_table).insert({
1671
1678
  channel,
1672
1679
  message,
1673
1680
  processed: false,
@@ -1683,20 +1690,20 @@ var DatabaseTransport = class {
1683
1690
  async listen(channel, callback) {
1684
1691
  return new Promise(async (resolve, reject) => {
1685
1692
  const intervalId = setInterval(async () => {
1686
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
1693
+ const conn = db(this.config.db_connection);
1687
1694
  try {
1688
1695
  await conn.connect();
1689
1696
  let q = conn.getQuery();
1690
- let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
1697
+ 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();
1691
1698
  for (let msg of messages) {
1692
1699
  try {
1693
1700
  await callback(msg.message);
1694
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
1701
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
1695
1702
  processed: true,
1696
1703
  updated_at: /* @__PURE__ */ new Date()
1697
1704
  });
1698
1705
  } catch (error) {
1699
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
1706
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
1700
1707
  processed: false,
1701
1708
  last_tried_at: /* @__PURE__ */ new Date(),
1702
1709
  process_message: error.message || "Error processing message"
@@ -1705,11 +1712,11 @@ var DatabaseTransport = class {
1705
1712
  }
1706
1713
  } catch (error) {
1707
1714
  this.activeIntervals.delete(intervalId);
1708
- reject(error);
1715
+ logger().error("Error in DatabaseTransport listen interval:", { error });
1709
1716
  } finally {
1710
1717
  await conn.disconnect();
1711
1718
  }
1712
- }, this.listenInterval);
1719
+ }, this.config.listen_interval * 1e3);
1713
1720
  this.activeIntervals.add(intervalId);
1714
1721
  });
1715
1722
  }
@@ -1723,6 +1730,7 @@ var DatabaseTransport = class {
1723
1730
 
1724
1731
  // src/factories.mts
1725
1732
  var import_neko_cache = require("@devbro/neko-cache");
1733
+ var import_neko_storage = require("@devbro/neko-storage");
1726
1734
  var FlexibleFactory = class {
1727
1735
  static {
1728
1736
  __name(this, "FlexibleFactory");
@@ -1759,32 +1767,32 @@ MailerFactory.register("logger", (opt) => {
1759
1767
  });
1760
1768
  });
1761
1769
  });
1762
- MailerFactory.register("SES", (opt) => {
1770
+ MailerFactory.register("ses", (opt) => {
1763
1771
  return new import_neko_mailer.SESProvider(opt);
1764
1772
  });
1765
- MailerFactory.register("SMTP", (opt) => {
1773
+ MailerFactory.register("smtp", (opt) => {
1766
1774
  return new import_neko_mailer.SMTPProvider(opt);
1767
1775
  });
1768
- MailerFactory.register("MEMORY", (opt) => {
1776
+ MailerFactory.register("memory", (opt) => {
1769
1777
  return new import_neko_mailer.MemoryProvider();
1770
1778
  });
1771
- var QueueFactory = class _QueueFactory {
1779
+ var QueueTransportFactory = class _QueueTransportFactory {
1772
1780
  static {
1773
- __name(this, "QueueFactory");
1781
+ __name(this, "QueueTransportFactory");
1774
1782
  }
1775
1783
  static instance = new FlexibleFactory();
1776
1784
  static register(key, factory) {
1777
- _QueueFactory.instance.register(key, factory);
1785
+ _QueueTransportFactory.instance.register(key, factory);
1778
1786
  }
1779
1787
  static create(key, ...args) {
1780
- return _QueueFactory.instance.create(key, ...args);
1788
+ return _QueueTransportFactory.instance.create(key, ...args);
1781
1789
  }
1782
1790
  };
1783
- QueueFactory.register("database", (opt) => {
1791
+ QueueTransportFactory.register("database", (opt) => {
1784
1792
  let transport = new DatabaseTransport(opt);
1785
1793
  return new import_neko_queue.QueueConnection(transport);
1786
1794
  });
1787
- QueueFactory.register("memory", (opt) => {
1795
+ QueueTransportFactory.register("memory", (opt) => {
1788
1796
  let transport = new import_neko_queue2.MemoryTransport(opt);
1789
1797
  return new import_neko_queue.QueueConnection(transport);
1790
1798
  });
@@ -1812,9 +1820,16 @@ CacheProviderFactory.register("file", (opt) => {
1812
1820
  CacheProviderFactory.register("disabled", (opt) => {
1813
1821
  return new import_neko_cache.DisabledCacheProvider();
1814
1822
  });
1823
+ import_neko_storage.StorageProviderFactory.register("local", (opt) => {
1824
+ return new import_neko_storage.LocalStorageProvider(opt);
1825
+ });
1826
+ import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
1827
+ return new import_neko_storage.AWSS3StorageProvider(opt);
1828
+ });
1815
1829
 
1816
1830
  // src/facades.mts
1817
1831
  var import_neko_cache2 = require("@devbro/neko-cache");
1832
+ var import_neko_queue3 = require("@devbro/neko-queue");
1818
1833
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
1819
1834
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
1820
1835
  const rc = new import_neko_scheduler.Scheduler();
@@ -1828,9 +1843,11 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
1828
1843
  return rc;
1829
1844
  });
1830
1845
  var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
1831
- var storage = (0, import_neko_helper.createSingleton)(
1832
- (label = "default") => import_neko_storage.StorageFactory.create(import_neko_config.config.get(["storages", label].join(".")))
1833
- );
1846
+ var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
1847
+ let storage_config = import_neko_config.config.get(["storages", label].join("."));
1848
+ const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
1849
+ return new import_neko_storage2.Storage(provider);
1850
+ });
1834
1851
  var cli = (0, import_neko_helper.createSingleton)(() => {
1835
1852
  const [node, app, ...args] = process.argv;
1836
1853
  return new import_clipanion.Cli({
@@ -1885,7 +1902,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
1885
1902
  });
1886
1903
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
1887
1904
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
1888
- let provider = MailerFactory.create(
1905
+ const provider = MailerFactory.create(
1889
1906
  mailer_config.provider,
1890
1907
  mailer_config.config
1891
1908
  );
@@ -1897,7 +1914,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
1897
1914
  if (!queue_config) {
1898
1915
  throw new Error(`Queue configuration for '${label}' not found`);
1899
1916
  }
1900
- const rc = QueueFactory.create(queue_config.type, queue_config);
1917
+ const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
1918
+ const rc = new import_neko_queue3.QueueConnection(provider);
1901
1919
  return rc;
1902
1920
  });
1903
1921
  var cache = (0, import_neko_helper.createSingleton)((label) => {
@@ -1906,7 +1924,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
1906
1924
  throw new Error(`Cache configuration for '${label}' not found`);
1907
1925
  }
1908
1926
  const provider = CacheProviderFactory.create(
1909
- cache_config.type,
1927
+ cache_config.provider,
1910
1928
  cache_config.config
1911
1929
  );
1912
1930
  return new import_neko_cache2.Cache(provider);
@@ -2110,7 +2128,7 @@ cli().register(MigrateRollbackCommand);
2110
2128
  // src/app/console/StartCommand.mts
2111
2129
  var import_clipanion5 = require("clipanion");
2112
2130
  var import_neko_config5 = require("@devbro/neko-config");
2113
- var import_neko_sql2 = require("@devbro/neko-sql");
2131
+ var import_neko_sql = require("@devbro/neko-sql");
2114
2132
  var StartCommand = class extends import_clipanion5.Command {
2115
2133
  static {
2116
2134
  __name(this, "StartCommand");
@@ -2130,7 +2148,7 @@ var StartCommand = class extends import_clipanion5.Command {
2130
2148
  }
2131
2149
  logger().info(`Starting Server
2132
2150
  `);
2133
- import_neko_sql2.PostgresqlConnection.defaults.idleTimeoutMillis = 1e4;
2151
+ import_neko_sql.PostgresqlConnection.defaults.idleTimeoutMillis = 1e4;
2134
2152
  if (this.scheduler || this.all) {
2135
2153
  logger().info(`starting scheduler
2136
2154
  `);
@@ -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();
@@ -665,9 +680,11 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
665
680
  return rc;
666
681
  });
667
682
  var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
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 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
+ });
671
688
  var cli = (0, import_neko_helper.createSingleton)(() => {
672
689
  const [node, app, ...args] = process.argv;
673
690
  return new import_clipanion.Cli({
@@ -722,7 +739,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
722
739
  });
723
740
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
724
741
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
725
- let provider = MailerFactory.create(
742
+ const provider = MailerFactory.create(
726
743
  mailer_config.provider,
727
744
  mailer_config.config
728
745
  );
@@ -734,7 +751,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
734
751
  if (!queue_config) {
735
752
  throw new Error(`Queue configuration for '${label}' not found`);
736
753
  }
737
- 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);
738
756
  return rc;
739
757
  });
740
758
  var cache = (0, import_neko_helper.createSingleton)((label) => {
@@ -743,7 +761,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
743
761
  throw new Error(`Cache configuration for '${label}' not found`);
744
762
  }
745
763
  const provider = CacheProviderFactory.create(
746
- cache_config.type,
764
+ cache_config.provider,
747
765
  cache_config.config
748
766
  );
749
767
  return new import_neko_cache2.Cache(provider);