@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.
- package/dist/app/console/migrate/make_migration.tpl +5 -5
- package/dist/app/console/queue/GenerateMigrateCommand.d.mts +9 -0
- package/dist/app/console/queue/GenerateMigrateCommand.mjs +51 -0
- package/dist/app/console/queue/GenerateMigrateCommand.mjs.map +1 -0
- package/dist/app/console/queue/queue_migration.tpl +19 -0
- package/dist/bin/app/console/DefaultCommand.cjs +160 -21
- package/dist/bin/app/console/KeyGenerateCommand.cjs +160 -21
- package/dist/bin/app/console/StartCommand.cjs +163 -24
- package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +160 -21
- package/dist/bin/app/console/generate/index.cjs +160 -21
- package/dist/bin/app/console/index.cjs +162 -23
- package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +160 -21
- package/dist/bin/app/console/migrate/MigrateCommand.cjs +161 -22
- package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +160 -21
- package/dist/bin/app/console/migrate/index.cjs +160 -21
- package/dist/bin/app/console/queue/GenerateMigrateCommand.cjs +752 -0
- package/dist/bin/facades.cjs +163 -22
- package/dist/bin/factories.cjs +707 -0
- package/dist/bin/index.cjs +178 -28
- package/dist/bin/middlewares.cjs +161 -22
- package/dist/bin/queue.cjs +99 -0
- package/dist/facades.d.mts +3 -1
- package/dist/facades.mjs +15 -27
- package/dist/facades.mjs.map +1 -1
- package/dist/factories.d.mts +20 -0
- package/dist/factories.mjs +83 -0
- package/dist/factories.mjs.map +1 -0
- package/dist/queue.d.mts +15 -0
- package/dist/queue.mjs +73 -0
- package/dist/queue.mjs.map +1 -0
- 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
|
|
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
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
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 =
|
|
1857
|
+
const rc = await QueueFactory.create(queue_config.type, queue_config);
|
|
1719
1858
|
return rc;
|
|
1720
1859
|
});
|
|
1721
1860
|
|