@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
@@ -1611,7 +1611,7 @@ var Router = class {
1611
1611
  var import_neko_scheduler = require("@devbro/neko-scheduler");
1612
1612
  var import_neko_helper = require("@devbro/neko-helper");
1613
1613
  var import_neko_context2 = require("@devbro/neko-context");
1614
- var import_neko_storage = require("@devbro/neko-storage");
1614
+ var import_neko_storage2 = require("@devbro/neko-storage");
1615
1615
  var import_neko_mailer2 = require("@devbro/neko-mailer");
1616
1616
  var import_neko_config = require("@devbro/neko-config");
1617
1617
  var import_clipanion = require("clipanion");
@@ -1635,31 +1635,38 @@ __export(queue_exports, {
1635
1635
  DatabaseTransport: () => DatabaseTransport
1636
1636
  });
1637
1637
  __reExport(queue_exports, require("@devbro/neko-queue"));
1638
- var import_neko_sql = require("@devbro/neko-sql");
1639
1638
  var DatabaseTransport = class {
1640
- constructor(db_config) {
1641
- this.db_config = db_config;
1642
- }
1643
1639
  static {
1644
1640
  __name(this, "DatabaseTransport");
1645
1641
  }
1646
- listenInterval = 6e4;
1647
- // default to 1 minute
1648
- messageLimit = 100;
1649
- // default to 100 messages per fetch
1650
1642
  activeIntervals = /* @__PURE__ */ new Set();
1643
+ config = {
1644
+ queue_table: "queue_messages",
1645
+ db_connection: "default",
1646
+ listen_interval: 60,
1647
+ // seconds
1648
+ message_limit: 10
1649
+ // messages per each fetch
1650
+ };
1651
+ constructor(config3) {
1652
+ this.config = { ...this.config, ...config3 };
1653
+ }
1651
1654
  setListenInterval(interval) {
1652
- this.listenInterval = interval;
1655
+ this.config.listen_interval = interval;
1653
1656
  }
1654
1657
  setMessageLimit(limit) {
1655
- this.messageLimit = limit;
1658
+ this.config.message_limit = limit;
1656
1659
  }
1657
1660
  async dispatch(channel, message) {
1658
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
1661
+ const conn = db(this.config.db_connection);
1659
1662
  try {
1660
1663
  await conn.connect();
1664
+ let schema = conn.getSchema();
1665
+ if (await schema.tableExists(this.config.queue_table) === false) {
1666
+ return;
1667
+ }
1661
1668
  let q = conn.getQuery();
1662
- await q.table("queue_messages").insert({
1669
+ await q.table(this.config.queue_table).insert({
1663
1670
  channel,
1664
1671
  message,
1665
1672
  processed: false,
@@ -1675,20 +1682,20 @@ var DatabaseTransport = class {
1675
1682
  async listen(channel, callback) {
1676
1683
  return new Promise(async (resolve, reject) => {
1677
1684
  const intervalId = setInterval(async () => {
1678
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
1685
+ const conn = db(this.config.db_connection);
1679
1686
  try {
1680
1687
  await conn.connect();
1681
1688
  let q = conn.getQuery();
1682
- let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
1689
+ 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();
1683
1690
  for (let msg of messages) {
1684
1691
  try {
1685
1692
  await callback(msg.message);
1686
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
1693
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
1687
1694
  processed: true,
1688
1695
  updated_at: /* @__PURE__ */ new Date()
1689
1696
  });
1690
1697
  } catch (error) {
1691
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
1698
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
1692
1699
  processed: false,
1693
1700
  last_tried_at: /* @__PURE__ */ new Date(),
1694
1701
  process_message: error.message || "Error processing message"
@@ -1697,11 +1704,11 @@ var DatabaseTransport = class {
1697
1704
  }
1698
1705
  } catch (error) {
1699
1706
  this.activeIntervals.delete(intervalId);
1700
- reject(error);
1707
+ logger().error("Error in DatabaseTransport listen interval:", { error });
1701
1708
  } finally {
1702
1709
  await conn.disconnect();
1703
1710
  }
1704
- }, this.listenInterval);
1711
+ }, this.config.listen_interval * 1e3);
1705
1712
  this.activeIntervals.add(intervalId);
1706
1713
  });
1707
1714
  }
@@ -1715,6 +1722,7 @@ var DatabaseTransport = class {
1715
1722
 
1716
1723
  // src/factories.mts
1717
1724
  var import_neko_cache = require("@devbro/neko-cache");
1725
+ var import_neko_storage = require("@devbro/neko-storage");
1718
1726
  var FlexibleFactory = class {
1719
1727
  static {
1720
1728
  __name(this, "FlexibleFactory");
@@ -1751,32 +1759,32 @@ MailerFactory.register("logger", (opt) => {
1751
1759
  });
1752
1760
  });
1753
1761
  });
1754
- MailerFactory.register("SES", (opt) => {
1762
+ MailerFactory.register("ses", (opt) => {
1755
1763
  return new import_neko_mailer.SESProvider(opt);
1756
1764
  });
1757
- MailerFactory.register("SMTP", (opt) => {
1765
+ MailerFactory.register("smtp", (opt) => {
1758
1766
  return new import_neko_mailer.SMTPProvider(opt);
1759
1767
  });
1760
- MailerFactory.register("MEMORY", (opt) => {
1768
+ MailerFactory.register("memory", (opt) => {
1761
1769
  return new import_neko_mailer.MemoryProvider();
1762
1770
  });
1763
- var QueueFactory = class _QueueFactory {
1771
+ var QueueTransportFactory = class _QueueTransportFactory {
1764
1772
  static {
1765
- __name(this, "QueueFactory");
1773
+ __name(this, "QueueTransportFactory");
1766
1774
  }
1767
1775
  static instance = new FlexibleFactory();
1768
1776
  static register(key, factory) {
1769
- _QueueFactory.instance.register(key, factory);
1777
+ _QueueTransportFactory.instance.register(key, factory);
1770
1778
  }
1771
1779
  static create(key, ...args) {
1772
- return _QueueFactory.instance.create(key, ...args);
1780
+ return _QueueTransportFactory.instance.create(key, ...args);
1773
1781
  }
1774
1782
  };
1775
- QueueFactory.register("database", (opt) => {
1783
+ QueueTransportFactory.register("database", (opt) => {
1776
1784
  let transport = new DatabaseTransport(opt);
1777
1785
  return new import_neko_queue.QueueConnection(transport);
1778
1786
  });
1779
- QueueFactory.register("memory", (opt) => {
1787
+ QueueTransportFactory.register("memory", (opt) => {
1780
1788
  let transport = new import_neko_queue2.MemoryTransport(opt);
1781
1789
  return new import_neko_queue.QueueConnection(transport);
1782
1790
  });
@@ -1804,9 +1812,16 @@ CacheProviderFactory.register("file", (opt) => {
1804
1812
  CacheProviderFactory.register("disabled", (opt) => {
1805
1813
  return new import_neko_cache.DisabledCacheProvider();
1806
1814
  });
1815
+ import_neko_storage.StorageProviderFactory.register("local", (opt) => {
1816
+ return new import_neko_storage.LocalStorageProvider(opt);
1817
+ });
1818
+ import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
1819
+ return new import_neko_storage.AWSS3StorageProvider(opt);
1820
+ });
1807
1821
 
1808
1822
  // src/facades.mts
1809
1823
  var import_neko_cache2 = require("@devbro/neko-cache");
1824
+ var import_neko_queue3 = require("@devbro/neko-queue");
1810
1825
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
1811
1826
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
1812
1827
  const rc = new import_neko_scheduler.Scheduler();
@@ -1820,9 +1835,11 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
1820
1835
  return rc;
1821
1836
  });
1822
1837
  var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
1823
- var storage = (0, import_neko_helper.createSingleton)(
1824
- (label = "default") => import_neko_storage.StorageFactory.create(import_neko_config.config.get(["storages", label].join(".")))
1825
- );
1838
+ var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
1839
+ let storage_config = import_neko_config.config.get(["storages", label].join("."));
1840
+ const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
1841
+ return new import_neko_storage2.Storage(provider);
1842
+ });
1826
1843
  var cli = (0, import_neko_helper.createSingleton)(() => {
1827
1844
  const [node, app, ...args] = process.argv;
1828
1845
  return new import_clipanion.Cli({
@@ -1877,7 +1894,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
1877
1894
  });
1878
1895
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
1879
1896
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
1880
- let provider = MailerFactory.create(
1897
+ const provider = MailerFactory.create(
1881
1898
  mailer_config.provider,
1882
1899
  mailer_config.config
1883
1900
  );
@@ -1889,7 +1906,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
1889
1906
  if (!queue_config) {
1890
1907
  throw new Error(`Queue configuration for '${label}' not found`);
1891
1908
  }
1892
- const rc = QueueFactory.create(queue_config.type, queue_config);
1909
+ const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
1910
+ const rc = new import_neko_queue3.QueueConnection(provider);
1893
1911
  return rc;
1894
1912
  });
1895
1913
  var cache = (0, import_neko_helper.createSingleton)((label) => {
@@ -1898,7 +1916,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
1898
1916
  throw new Error(`Cache configuration for '${label}' not found`);
1899
1917
  }
1900
1918
  const provider = CacheProviderFactory.create(
1901
- cache_config.type,
1919
+ cache_config.provider,
1902
1920
  cache_config.config
1903
1921
  );
1904
1922
  return new import_neko_cache2.Cache(provider);
@@ -1613,7 +1613,7 @@ var Router = class {
1613
1613
  var import_neko_scheduler = require("@devbro/neko-scheduler");
1614
1614
  var import_neko_helper = require("@devbro/neko-helper");
1615
1615
  var import_neko_context2 = require("@devbro/neko-context");
1616
- var import_neko_storage = require("@devbro/neko-storage");
1616
+ var import_neko_storage2 = require("@devbro/neko-storage");
1617
1617
  var import_neko_mailer2 = require("@devbro/neko-mailer");
1618
1618
  var import_neko_config = require("@devbro/neko-config");
1619
1619
  var import_clipanion = require("clipanion");
@@ -1637,31 +1637,38 @@ __export(queue_exports, {
1637
1637
  DatabaseTransport: () => DatabaseTransport
1638
1638
  });
1639
1639
  __reExport(queue_exports, require("@devbro/neko-queue"));
1640
- var import_neko_sql = require("@devbro/neko-sql");
1641
1640
  var DatabaseTransport = class {
1642
- constructor(db_config) {
1643
- this.db_config = db_config;
1644
- }
1645
1641
  static {
1646
1642
  __name(this, "DatabaseTransport");
1647
1643
  }
1648
- listenInterval = 6e4;
1649
- // default to 1 minute
1650
- messageLimit = 100;
1651
- // default to 100 messages per fetch
1652
1644
  activeIntervals = /* @__PURE__ */ new Set();
1645
+ config = {
1646
+ queue_table: "queue_messages",
1647
+ db_connection: "default",
1648
+ listen_interval: 60,
1649
+ // seconds
1650
+ message_limit: 10
1651
+ // messages per each fetch
1652
+ };
1653
+ constructor(config5) {
1654
+ this.config = { ...this.config, ...config5 };
1655
+ }
1653
1656
  setListenInterval(interval) {
1654
- this.listenInterval = interval;
1657
+ this.config.listen_interval = interval;
1655
1658
  }
1656
1659
  setMessageLimit(limit) {
1657
- this.messageLimit = limit;
1660
+ this.config.message_limit = limit;
1658
1661
  }
1659
1662
  async dispatch(channel, message) {
1660
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
1663
+ const conn = db(this.config.db_connection);
1661
1664
  try {
1662
1665
  await conn.connect();
1666
+ let schema = conn.getSchema();
1667
+ if (await schema.tableExists(this.config.queue_table) === false) {
1668
+ return;
1669
+ }
1663
1670
  let q = conn.getQuery();
1664
- await q.table("queue_messages").insert({
1671
+ await q.table(this.config.queue_table).insert({
1665
1672
  channel,
1666
1673
  message,
1667
1674
  processed: false,
@@ -1677,20 +1684,20 @@ var DatabaseTransport = class {
1677
1684
  async listen(channel, callback) {
1678
1685
  return new Promise(async (resolve, reject) => {
1679
1686
  const intervalId = setInterval(async () => {
1680
- const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
1687
+ const conn = db(this.config.db_connection);
1681
1688
  try {
1682
1689
  await conn.connect();
1683
1690
  let q = conn.getQuery();
1684
- let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
1691
+ 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();
1685
1692
  for (let msg of messages) {
1686
1693
  try {
1687
1694
  await callback(msg.message);
1688
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
1695
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
1689
1696
  processed: true,
1690
1697
  updated_at: /* @__PURE__ */ new Date()
1691
1698
  });
1692
1699
  } catch (error) {
1693
- await q.table("queue_messages").whereOp("id", "=", msg.id).update({
1700
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
1694
1701
  processed: false,
1695
1702
  last_tried_at: /* @__PURE__ */ new Date(),
1696
1703
  process_message: error.message || "Error processing message"
@@ -1699,11 +1706,11 @@ var DatabaseTransport = class {
1699
1706
  }
1700
1707
  } catch (error) {
1701
1708
  this.activeIntervals.delete(intervalId);
1702
- reject(error);
1709
+ logger().error("Error in DatabaseTransport listen interval:", { error });
1703
1710
  } finally {
1704
1711
  await conn.disconnect();
1705
1712
  }
1706
- }, this.listenInterval);
1713
+ }, this.config.listen_interval * 1e3);
1707
1714
  this.activeIntervals.add(intervalId);
1708
1715
  });
1709
1716
  }
@@ -1717,6 +1724,7 @@ var DatabaseTransport = class {
1717
1724
 
1718
1725
  // src/factories.mts
1719
1726
  var import_neko_cache = require("@devbro/neko-cache");
1727
+ var import_neko_storage = require("@devbro/neko-storage");
1720
1728
  var FlexibleFactory = class {
1721
1729
  static {
1722
1730
  __name(this, "FlexibleFactory");
@@ -1753,32 +1761,32 @@ MailerFactory.register("logger", (opt) => {
1753
1761
  });
1754
1762
  });
1755
1763
  });
1756
- MailerFactory.register("SES", (opt) => {
1764
+ MailerFactory.register("ses", (opt) => {
1757
1765
  return new import_neko_mailer.SESProvider(opt);
1758
1766
  });
1759
- MailerFactory.register("SMTP", (opt) => {
1767
+ MailerFactory.register("smtp", (opt) => {
1760
1768
  return new import_neko_mailer.SMTPProvider(opt);
1761
1769
  });
1762
- MailerFactory.register("MEMORY", (opt) => {
1770
+ MailerFactory.register("memory", (opt) => {
1763
1771
  return new import_neko_mailer.MemoryProvider();
1764
1772
  });
1765
- var QueueFactory = class _QueueFactory {
1773
+ var QueueTransportFactory = class _QueueTransportFactory {
1766
1774
  static {
1767
- __name(this, "QueueFactory");
1775
+ __name(this, "QueueTransportFactory");
1768
1776
  }
1769
1777
  static instance = new FlexibleFactory();
1770
1778
  static register(key, factory) {
1771
- _QueueFactory.instance.register(key, factory);
1779
+ _QueueTransportFactory.instance.register(key, factory);
1772
1780
  }
1773
1781
  static create(key, ...args) {
1774
- return _QueueFactory.instance.create(key, ...args);
1782
+ return _QueueTransportFactory.instance.create(key, ...args);
1775
1783
  }
1776
1784
  };
1777
- QueueFactory.register("database", (opt) => {
1785
+ QueueTransportFactory.register("database", (opt) => {
1778
1786
  let transport = new DatabaseTransport(opt);
1779
1787
  return new import_neko_queue.QueueConnection(transport);
1780
1788
  });
1781
- QueueFactory.register("memory", (opt) => {
1789
+ QueueTransportFactory.register("memory", (opt) => {
1782
1790
  let transport = new import_neko_queue2.MemoryTransport(opt);
1783
1791
  return new import_neko_queue.QueueConnection(transport);
1784
1792
  });
@@ -1806,9 +1814,16 @@ CacheProviderFactory.register("file", (opt) => {
1806
1814
  CacheProviderFactory.register("disabled", (opt) => {
1807
1815
  return new import_neko_cache.DisabledCacheProvider();
1808
1816
  });
1817
+ import_neko_storage.StorageProviderFactory.register("local", (opt) => {
1818
+ return new import_neko_storage.LocalStorageProvider(opt);
1819
+ });
1820
+ import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
1821
+ return new import_neko_storage.AWSS3StorageProvider(opt);
1822
+ });
1809
1823
 
1810
1824
  // src/facades.mts
1811
1825
  var import_neko_cache2 = require("@devbro/neko-cache");
1826
+ var import_neko_queue3 = require("@devbro/neko-queue");
1812
1827
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
1813
1828
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
1814
1829
  const rc = new import_neko_scheduler.Scheduler();
@@ -1822,9 +1837,11 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
1822
1837
  return rc;
1823
1838
  });
1824
1839
  var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
1825
- var storage = (0, import_neko_helper.createSingleton)(
1826
- (label = "default") => import_neko_storage.StorageFactory.create(import_neko_config.config.get(["storages", label].join(".")))
1827
- );
1840
+ var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
1841
+ let storage_config = import_neko_config.config.get(["storages", label].join("."));
1842
+ const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
1843
+ return new import_neko_storage2.Storage(provider);
1844
+ });
1828
1845
  var cli = (0, import_neko_helper.createSingleton)(() => {
1829
1846
  const [node, app, ...args] = process.argv;
1830
1847
  return new import_clipanion.Cli({
@@ -1879,7 +1896,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
1879
1896
  });
1880
1897
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
1881
1898
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
1882
- let provider = MailerFactory.create(
1899
+ const provider = MailerFactory.create(
1883
1900
  mailer_config.provider,
1884
1901
  mailer_config.config
1885
1902
  );
@@ -1891,7 +1908,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
1891
1908
  if (!queue_config) {
1892
1909
  throw new Error(`Queue configuration for '${label}' not found`);
1893
1910
  }
1894
- const rc = QueueFactory.create(queue_config.type, queue_config);
1911
+ const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
1912
+ const rc = new import_neko_queue3.QueueConnection(provider);
1895
1913
  return rc;
1896
1914
  });
1897
1915
  var cache = (0, import_neko_helper.createSingleton)((label) => {
@@ -1900,7 +1918,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
1900
1918
  throw new Error(`Cache configuration for '${label}' not found`);
1901
1919
  }
1902
1920
  const provider = CacheProviderFactory.create(
1903
- cache_config.type,
1921
+ cache_config.provider,
1904
1922
  cache_config.config
1905
1923
  );
1906
1924
  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);