@devbro/pashmak 0.1.11 → 0.1.12

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 (31) hide show
  1. package/dist/app/console/migrate/make_migration.tpl +5 -5
  2. package/dist/app/console/queue/GenerateMigrateCommand.d.mts +9 -0
  3. package/dist/app/console/queue/GenerateMigrateCommand.mjs +51 -0
  4. package/dist/app/console/queue/GenerateMigrateCommand.mjs.map +1 -0
  5. package/dist/app/console/queue/queue_migration.tpl +19 -0
  6. package/dist/bin/app/console/DefaultCommand.cjs +160 -21
  7. package/dist/bin/app/console/KeyGenerateCommand.cjs +160 -21
  8. package/dist/bin/app/console/StartCommand.cjs +163 -24
  9. package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +160 -21
  10. package/dist/bin/app/console/generate/index.cjs +160 -21
  11. package/dist/bin/app/console/index.cjs +162 -23
  12. package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +160 -21
  13. package/dist/bin/app/console/migrate/MigrateCommand.cjs +161 -22
  14. package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +160 -21
  15. package/dist/bin/app/console/migrate/index.cjs +160 -21
  16. package/dist/bin/app/console/queue/GenerateMigrateCommand.cjs +752 -0
  17. package/dist/bin/facades.cjs +163 -22
  18. package/dist/bin/factories.cjs +707 -0
  19. package/dist/bin/index.cjs +178 -28
  20. package/dist/bin/middlewares.cjs +161 -22
  21. package/dist/bin/queue.cjs +99 -0
  22. package/dist/facades.d.mts +3 -1
  23. package/dist/facades.mjs +15 -27
  24. package/dist/facades.mjs.map +1 -1
  25. package/dist/factories.d.mts +20 -0
  26. package/dist/factories.mjs +83 -0
  27. package/dist/factories.mjs.map +1 -0
  28. package/dist/queue.d.mts +15 -0
  29. package/dist/queue.mjs +73 -0
  30. package/dist/queue.mjs.map +1 -0
  31. package/package.json +7 -1
@@ -1612,7 +1612,7 @@ 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
1614
  var import_neko_storage = require("@devbro/neko-storage");
1615
- var import_neko_mailer = require("@devbro/neko-mailer");
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");
1618
1618
 
@@ -1623,6 +1623,153 @@ __reExport(http_exports, require("@devbro/neko-http"));
1623
1623
  // src/facades.mts
1624
1624
  var yup = __toESM(require("yup"), 1);
1625
1625
  var import_neko_logger = require("@devbro/neko-logger");
1626
+
1627
+ // src/factories.mts
1628
+ var import_neko_mailer = require("@devbro/neko-mailer");
1629
+ var import_neko_queue = require("@devbro/neko-queue");
1630
+ var import_neko_queue2 = require("@devbro/neko-queue");
1631
+
1632
+ // src/queue.mts
1633
+ var queue_exports = {};
1634
+ __export(queue_exports, {
1635
+ DatabaseTransport: () => DatabaseTransport
1636
+ });
1637
+ __reExport(queue_exports, require("@devbro/neko-queue"));
1638
+ var import_neko_sql = require("@devbro/neko-sql");
1639
+ var DatabaseTransport = class {
1640
+ // default to 100 messages per fetch
1641
+ constructor(db_config) {
1642
+ this.db_config = db_config;
1643
+ }
1644
+ static {
1645
+ __name(this, "DatabaseTransport");
1646
+ }
1647
+ listenInterval = 6e4;
1648
+ // default to 1 minute
1649
+ messageLimit = 100;
1650
+ setListenInterval(interval) {
1651
+ this.listenInterval = interval;
1652
+ }
1653
+ setMessageLimit(limit) {
1654
+ this.messageLimit = limit;
1655
+ }
1656
+ async dispatch(channel, message) {
1657
+ const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
1658
+ try {
1659
+ await conn.connect();
1660
+ let q = conn.getQuery();
1661
+ await q.table("queue_messages").insert({
1662
+ channel,
1663
+ message,
1664
+ processed: false,
1665
+ created_at: /* @__PURE__ */ new Date(),
1666
+ updated_at: /* @__PURE__ */ new Date(),
1667
+ last_tried_at: null,
1668
+ process_message: ""
1669
+ });
1670
+ } finally {
1671
+ await conn.disconnect();
1672
+ }
1673
+ }
1674
+ async listen(channel, callback) {
1675
+ return new Promise(async (resolve, reject) => {
1676
+ setInterval(async () => {
1677
+ const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
1678
+ try {
1679
+ await conn.connect();
1680
+ let q = conn.getQuery();
1681
+ let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
1682
+ for (let msg of messages) {
1683
+ try {
1684
+ await callback(msg.message);
1685
+ await q.table("queue_messages").whereOp("id", "=", msg.id).update({
1686
+ processed: true,
1687
+ updated_at: /* @__PURE__ */ new Date()
1688
+ });
1689
+ } catch (error) {
1690
+ await q.table("queue_messages").whereOp("id", "=", msg.id).update({
1691
+ processed: false,
1692
+ last_tried_at: /* @__PURE__ */ new Date(),
1693
+ process_message: error.message || "Error processing message"
1694
+ });
1695
+ }
1696
+ }
1697
+ } finally {
1698
+ await conn.disconnect();
1699
+ }
1700
+ }, this.listenInterval);
1701
+ });
1702
+ }
1703
+ };
1704
+
1705
+ // src/factories.mts
1706
+ var FlexibleFactory = class {
1707
+ static {
1708
+ __name(this, "FlexibleFactory");
1709
+ }
1710
+ registry = /* @__PURE__ */ new Map();
1711
+ register(key, ctor) {
1712
+ this.registry.set(key, ctor);
1713
+ }
1714
+ create(key, ...args) {
1715
+ const ctor = this.registry.get(key);
1716
+ if (!ctor) {
1717
+ throw new Error(`No factory registered for key: ${key}`);
1718
+ }
1719
+ return new ctor(...args);
1720
+ }
1721
+ };
1722
+ var MailerFactory = class _MailerFactory {
1723
+ static {
1724
+ __name(this, "MailerFactory");
1725
+ }
1726
+ static instance = new FlexibleFactory();
1727
+ static register(key, factory) {
1728
+ _MailerFactory.instance.register(key, factory);
1729
+ }
1730
+ static create(key, ...args) {
1731
+ return _MailerFactory.instance.create(key, ...args);
1732
+ }
1733
+ };
1734
+ MailerFactory.register("logger", (opt) => {
1735
+ return new import_neko_mailer.FunctionProvider((mail) => {
1736
+ logger().info({
1737
+ msg: "Sending email",
1738
+ mail
1739
+ });
1740
+ });
1741
+ });
1742
+ MailerFactory.register("SES", (opt) => {
1743
+ return new import_neko_mailer.SESProvider(opt);
1744
+ });
1745
+ MailerFactory.register("SMTP", (opt) => {
1746
+ return new import_neko_mailer.SMTPProvider(opt);
1747
+ });
1748
+ MailerFactory.register("MEMORY", (opt) => {
1749
+ return new import_neko_mailer.MemoryProvider();
1750
+ });
1751
+ var QueueFactory = class _QueueFactory {
1752
+ static {
1753
+ __name(this, "QueueFactory");
1754
+ }
1755
+ static instance = new FlexibleFactory();
1756
+ static register(key, factory) {
1757
+ _QueueFactory.instance.register(key, factory);
1758
+ }
1759
+ static create(key, ...args) {
1760
+ return _QueueFactory.instance.create(key, ...args);
1761
+ }
1762
+ };
1763
+ QueueFactory.register("database", (opt) => {
1764
+ let transport = new DatabaseTransport(opt);
1765
+ return new import_neko_queue.QueueConnection(transport);
1766
+ });
1767
+ QueueFactory.register("memory", (opt) => {
1768
+ let transport = new import_neko_queue2.MemoryTransport(opt);
1769
+ return new import_neko_queue.QueueConnection(transport);
1770
+ });
1771
+
1772
+ // src/facades.mts
1626
1773
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
1627
1774
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
1628
1775
  const rc = new import_neko_scheduler.Scheduler();
@@ -1693,27 +1840,19 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
1693
1840
  });
1694
1841
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
1695
1842
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
1696
- let provider;
1697
- if (mailer_config.provider === "logger") {
1698
- provider = new import_neko_mailer.FunctionProvider((mail) => {
1699
- logger().info({
1700
- msg: "Sending email",
1701
- mail
1702
- });
1703
- });
1704
- } else if (mailer_config.provider === "SES") {
1705
- provider = new import_neko_mailer.SESProvider(mailer_config.config);
1706
- } else if (mailer_config.provider === "SMTP") {
1707
- provider = new import_neko_mailer.SMTPProvider(mailer_config.config);
1708
- } else if (mailer_config.provider === "MEMORY") {
1709
- provider = new import_neko_mailer.MemoryProvider();
1710
- }
1711
- if (!provider) {
1712
- throw new Error(
1713
- `cannot initiate mailer provider: ${mailer_config?.provider}`
1714
- );
1843
+ let provider = MailerFactory.create(
1844
+ mailer_config.provider,
1845
+ mailer_config.config
1846
+ );
1847
+ const rc = new import_neko_mailer2.Mailer(provider);
1848
+ return rc;
1849
+ });
1850
+ var queue = (0, import_neko_helper.createSingleton)(async (label) => {
1851
+ const queue_config = import_neko_config.config.get(["queues", label].join("."));
1852
+ if (!queue_config) {
1853
+ throw new Error(`Queue configuration for '${label}' not found`);
1715
1854
  }
1716
- const rc = new import_neko_mailer.Mailer(provider);
1855
+ const rc = await QueueFactory.create(queue_config.type, queue_config);
1717
1856
  return rc;
1718
1857
  });
1719
1858
 
@@ -1614,7 +1614,7 @@ 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
1616
  var import_neko_storage = require("@devbro/neko-storage");
1617
- var import_neko_mailer = require("@devbro/neko-mailer");
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");
1620
1620
 
@@ -1625,6 +1625,153 @@ __reExport(http_exports, require("@devbro/neko-http"));
1625
1625
  // src/facades.mts
1626
1626
  var yup = __toESM(require("yup"), 1);
1627
1627
  var import_neko_logger = require("@devbro/neko-logger");
1628
+
1629
+ // src/factories.mts
1630
+ var import_neko_mailer = require("@devbro/neko-mailer");
1631
+ var import_neko_queue = require("@devbro/neko-queue");
1632
+ var import_neko_queue2 = require("@devbro/neko-queue");
1633
+
1634
+ // src/queue.mts
1635
+ var queue_exports = {};
1636
+ __export(queue_exports, {
1637
+ DatabaseTransport: () => DatabaseTransport
1638
+ });
1639
+ __reExport(queue_exports, require("@devbro/neko-queue"));
1640
+ var import_neko_sql = require("@devbro/neko-sql");
1641
+ var DatabaseTransport = class {
1642
+ // default to 100 messages per fetch
1643
+ constructor(db_config) {
1644
+ this.db_config = db_config;
1645
+ }
1646
+ static {
1647
+ __name(this, "DatabaseTransport");
1648
+ }
1649
+ listenInterval = 6e4;
1650
+ // default to 1 minute
1651
+ messageLimit = 100;
1652
+ setListenInterval(interval) {
1653
+ this.listenInterval = interval;
1654
+ }
1655
+ setMessageLimit(limit) {
1656
+ this.messageLimit = limit;
1657
+ }
1658
+ async dispatch(channel, message) {
1659
+ const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
1660
+ try {
1661
+ await conn.connect();
1662
+ let q = conn.getQuery();
1663
+ await q.table("queue_messages").insert({
1664
+ channel,
1665
+ message,
1666
+ processed: false,
1667
+ created_at: /* @__PURE__ */ new Date(),
1668
+ updated_at: /* @__PURE__ */ new Date(),
1669
+ last_tried_at: null,
1670
+ process_message: ""
1671
+ });
1672
+ } finally {
1673
+ await conn.disconnect();
1674
+ }
1675
+ }
1676
+ async listen(channel, callback) {
1677
+ return new Promise(async (resolve, reject) => {
1678
+ setInterval(async () => {
1679
+ const conn = new import_neko_sql.PostgresqlConnection(this.db_config);
1680
+ try {
1681
+ await conn.connect();
1682
+ let q = conn.getQuery();
1683
+ let messages = await q.table("queue_messages").whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.messageLimit).orderBy("last_tried_at", "asc").get();
1684
+ for (let msg of messages) {
1685
+ try {
1686
+ await callback(msg.message);
1687
+ await q.table("queue_messages").whereOp("id", "=", msg.id).update({
1688
+ processed: true,
1689
+ updated_at: /* @__PURE__ */ new Date()
1690
+ });
1691
+ } catch (error) {
1692
+ await q.table("queue_messages").whereOp("id", "=", msg.id).update({
1693
+ processed: false,
1694
+ last_tried_at: /* @__PURE__ */ new Date(),
1695
+ process_message: error.message || "Error processing message"
1696
+ });
1697
+ }
1698
+ }
1699
+ } finally {
1700
+ await conn.disconnect();
1701
+ }
1702
+ }, this.listenInterval);
1703
+ });
1704
+ }
1705
+ };
1706
+
1707
+ // src/factories.mts
1708
+ var FlexibleFactory = class {
1709
+ static {
1710
+ __name(this, "FlexibleFactory");
1711
+ }
1712
+ registry = /* @__PURE__ */ new Map();
1713
+ register(key, ctor) {
1714
+ this.registry.set(key, ctor);
1715
+ }
1716
+ create(key, ...args) {
1717
+ const ctor = this.registry.get(key);
1718
+ if (!ctor) {
1719
+ throw new Error(`No factory registered for key: ${key}`);
1720
+ }
1721
+ return new ctor(...args);
1722
+ }
1723
+ };
1724
+ var MailerFactory = class _MailerFactory {
1725
+ static {
1726
+ __name(this, "MailerFactory");
1727
+ }
1728
+ static instance = new FlexibleFactory();
1729
+ static register(key, factory) {
1730
+ _MailerFactory.instance.register(key, factory);
1731
+ }
1732
+ static create(key, ...args) {
1733
+ return _MailerFactory.instance.create(key, ...args);
1734
+ }
1735
+ };
1736
+ MailerFactory.register("logger", (opt) => {
1737
+ return new import_neko_mailer.FunctionProvider((mail) => {
1738
+ logger().info({
1739
+ msg: "Sending email",
1740
+ mail
1741
+ });
1742
+ });
1743
+ });
1744
+ MailerFactory.register("SES", (opt) => {
1745
+ return new import_neko_mailer.SESProvider(opt);
1746
+ });
1747
+ MailerFactory.register("SMTP", (opt) => {
1748
+ return new import_neko_mailer.SMTPProvider(opt);
1749
+ });
1750
+ MailerFactory.register("MEMORY", (opt) => {
1751
+ return new import_neko_mailer.MemoryProvider();
1752
+ });
1753
+ var QueueFactory = class _QueueFactory {
1754
+ static {
1755
+ __name(this, "QueueFactory");
1756
+ }
1757
+ static instance = new FlexibleFactory();
1758
+ static register(key, factory) {
1759
+ _QueueFactory.instance.register(key, factory);
1760
+ }
1761
+ static create(key, ...args) {
1762
+ return _QueueFactory.instance.create(key, ...args);
1763
+ }
1764
+ };
1765
+ QueueFactory.register("database", (opt) => {
1766
+ let transport = new DatabaseTransport(opt);
1767
+ return new import_neko_queue.QueueConnection(transport);
1768
+ });
1769
+ QueueFactory.register("memory", (opt) => {
1770
+ let transport = new import_neko_queue2.MemoryTransport(opt);
1771
+ return new import_neko_queue.QueueConnection(transport);
1772
+ });
1773
+
1774
+ // src/facades.mts
1628
1775
  var router = (0, import_neko_helper.createSingleton)(() => new Router());
1629
1776
  var scheduler = (0, import_neko_helper.createSingleton)(() => {
1630
1777
  const rc = new import_neko_scheduler.Scheduler();
@@ -1695,27 +1842,19 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
1695
1842
  });
1696
1843
  var mailer = (0, import_neko_helper.createSingleton)((label) => {
1697
1844
  const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
1698
- let provider;
1699
- if (mailer_config.provider === "logger") {
1700
- provider = new import_neko_mailer.FunctionProvider((mail) => {
1701
- logger().info({
1702
- msg: "Sending email",
1703
- mail
1704
- });
1705
- });
1706
- } else if (mailer_config.provider === "SES") {
1707
- provider = new import_neko_mailer.SESProvider(mailer_config.config);
1708
- } else if (mailer_config.provider === "SMTP") {
1709
- provider = new import_neko_mailer.SMTPProvider(mailer_config.config);
1710
- } else if (mailer_config.provider === "MEMORY") {
1711
- provider = new import_neko_mailer.MemoryProvider();
1712
- }
1713
- if (!provider) {
1714
- throw new Error(
1715
- `cannot initiate mailer provider: ${mailer_config?.provider}`
1716
- );
1845
+ let provider = MailerFactory.create(
1846
+ mailer_config.provider,
1847
+ mailer_config.config
1848
+ );
1849
+ const rc = new import_neko_mailer2.Mailer(provider);
1850
+ return rc;
1851
+ });
1852
+ var queue = (0, import_neko_helper.createSingleton)(async (label) => {
1853
+ const queue_config = import_neko_config.config.get(["queues", label].join("."));
1854
+ if (!queue_config) {
1855
+ throw new Error(`Queue configuration for '${label}' not found`);
1717
1856
  }
1718
- const rc = new import_neko_mailer.Mailer(provider);
1857
+ const rc = await QueueFactory.create(queue_config.type, queue_config);
1719
1858
  return rc;
1720
1859
  });
1721
1860