@devbro/pashmak 0.1.18 → 0.1.20
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/project/base_project/package.json.tpl +1 -1
- package/dist/app/console/project/base_project/src/app/models/index.ts.tpl +1 -0
- package/dist/app/console/project/base_project/src/config/caches.ts.tpl +7 -0
- package/dist/app/console/project/base_project/src/config/databases.ts.tpl +10 -6
- package/dist/app/console/project/base_project/src/config/default.mts.tpl +35 -0
- package/dist/app/console/project/base_project/src/config/loggers.ts.tpl +11 -7
- package/dist/app/console/project/base_project/src/config/mailer.ts.tpl +21 -1
- package/dist/app/console/project/base_project/src/config/queues.ts.tpl +7 -0
- package/dist/app/console/project/base_project/src/config/storages.ts.tpl +8 -4
- package/dist/app/console/project/base_project/tsconfig.json.tpl +7 -4
- package/dist/app/console/queue/queue_migration.tpl +2 -1
- package/dist/bin/app/console/DefaultCommand.cjs +53 -34
- package/dist/bin/app/console/KeyGenerateCommand.cjs +53 -34
- package/dist/bin/app/console/StartCommand.cjs +55 -36
- package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +53 -34
- package/dist/bin/app/console/generate/index.cjs +53 -34
- package/dist/bin/app/console/index.cjs +54 -36
- package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +53 -34
- package/dist/bin/app/console/migrate/MigrateCommand.cjs +52 -34
- package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +52 -34
- package/dist/bin/app/console/migrate/index.cjs +52 -34
- package/dist/bin/app/console/queue/GenerateQueueMigrateCommand.cjs +53 -34
- package/dist/bin/cache.cjs +53 -34
- package/dist/bin/facades.cjs +52 -34
- package/dist/bin/factories.cjs +58 -39
- package/dist/bin/index.cjs +62 -43
- package/dist/bin/middlewares.cjs +52 -34
- package/dist/bin/queue.cjs +675 -18
- package/dist/facades.d.mts +2 -1
- package/dist/facades.mjs +12 -8
- package/dist/facades.mjs.map +1 -1
- package/dist/factories.d.mts +5 -5
- package/dist/factories.mjs +17 -10
- package/dist/factories.mjs.map +1 -1
- package/dist/queue.d.mts +8 -4
- package/dist/queue.mjs +26 -18
- package/dist/queue.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/app/console/project/base_project/src/app/models/README.md.tpl +0 -1
- 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
|
|
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.
|
|
1663
|
+
this.config.listen_interval = interval;
|
|
1661
1664
|
}
|
|
1662
1665
|
setMessageLimit(limit) {
|
|
1663
|
-
this.
|
|
1666
|
+
this.config.message_limit = limit;
|
|
1664
1667
|
}
|
|
1665
1668
|
async dispatch(channel, message) {
|
|
1666
|
-
const conn =
|
|
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(
|
|
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 =
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
1715
|
+
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
1709
1716
|
} finally {
|
|
1710
1717
|
await conn.disconnect();
|
|
1711
1718
|
}
|
|
1712
|
-
}, this.
|
|
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("
|
|
1770
|
+
MailerFactory.register("ses", (opt) => {
|
|
1763
1771
|
return new import_neko_mailer.SESProvider(opt);
|
|
1764
1772
|
});
|
|
1765
|
-
MailerFactory.register("
|
|
1773
|
+
MailerFactory.register("smtp", (opt) => {
|
|
1766
1774
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
1767
1775
|
});
|
|
1768
|
-
MailerFactory.register("
|
|
1776
|
+
MailerFactory.register("memory", (opt) => {
|
|
1769
1777
|
return new import_neko_mailer.MemoryProvider();
|
|
1770
1778
|
});
|
|
1771
|
-
var
|
|
1779
|
+
var QueueTransportFactory = class _QueueTransportFactory {
|
|
1772
1780
|
static {
|
|
1773
|
-
__name(this, "
|
|
1781
|
+
__name(this, "QueueTransportFactory");
|
|
1774
1782
|
}
|
|
1775
1783
|
static instance = new FlexibleFactory();
|
|
1776
1784
|
static register(key, factory) {
|
|
1777
|
-
|
|
1785
|
+
_QueueTransportFactory.instance.register(key, factory);
|
|
1778
1786
|
}
|
|
1779
1787
|
static create(key, ...args) {
|
|
1780
|
-
return
|
|
1788
|
+
return _QueueTransportFactory.instance.create(key, ...args);
|
|
1781
1789
|
}
|
|
1782
1790
|
};
|
|
1783
|
-
|
|
1791
|
+
QueueTransportFactory.register("database", (opt) => {
|
|
1784
1792
|
let transport = new DatabaseTransport(opt);
|
|
1785
1793
|
return new import_neko_queue.QueueConnection(transport);
|
|
1786
1794
|
});
|
|
1787
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
|
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.
|
|
500
|
+
this.config.listen_interval = interval;
|
|
498
501
|
}
|
|
499
502
|
setMessageLimit(limit) {
|
|
500
|
-
this.
|
|
503
|
+
this.config.message_limit = limit;
|
|
501
504
|
}
|
|
502
505
|
async dispatch(channel, message) {
|
|
503
|
-
const conn =
|
|
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(
|
|
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 =
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
552
|
+
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
546
553
|
} finally {
|
|
547
554
|
await conn.disconnect();
|
|
548
555
|
}
|
|
549
|
-
}, this.
|
|
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("
|
|
607
|
+
MailerFactory.register("ses", (opt) => {
|
|
600
608
|
return new import_neko_mailer.SESProvider(opt);
|
|
601
609
|
});
|
|
602
|
-
MailerFactory.register("
|
|
610
|
+
MailerFactory.register("smtp", (opt) => {
|
|
603
611
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
604
612
|
});
|
|
605
|
-
MailerFactory.register("
|
|
613
|
+
MailerFactory.register("memory", (opt) => {
|
|
606
614
|
return new import_neko_mailer.MemoryProvider();
|
|
607
615
|
});
|
|
608
|
-
var
|
|
616
|
+
var QueueTransportFactory = class _QueueTransportFactory {
|
|
609
617
|
static {
|
|
610
|
-
__name(this, "
|
|
618
|
+
__name(this, "QueueTransportFactory");
|
|
611
619
|
}
|
|
612
620
|
static instance = new FlexibleFactory();
|
|
613
621
|
static register(key, factory) {
|
|
614
|
-
|
|
622
|
+
_QueueTransportFactory.instance.register(key, factory);
|
|
615
623
|
}
|
|
616
624
|
static create(key, ...args) {
|
|
617
|
-
return
|
|
625
|
+
return _QueueTransportFactory.instance.create(key, ...args);
|
|
618
626
|
}
|
|
619
627
|
};
|
|
620
|
-
|
|
628
|
+
QueueTransportFactory.register("database", (opt) => {
|
|
621
629
|
let transport = new DatabaseTransport(opt);
|
|
622
630
|
return new import_neko_queue.QueueConnection(transport);
|
|
623
631
|
});
|
|
624
|
-
|
|
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
|
|
668
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
500
|
+
this.config.listen_interval = interval;
|
|
498
501
|
}
|
|
499
502
|
setMessageLimit(limit) {
|
|
500
|
-
this.
|
|
503
|
+
this.config.message_limit = limit;
|
|
501
504
|
}
|
|
502
505
|
async dispatch(channel, message) {
|
|
503
|
-
const conn =
|
|
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(
|
|
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 =
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
552
|
+
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
546
553
|
} finally {
|
|
547
554
|
await conn.disconnect();
|
|
548
555
|
}
|
|
549
|
-
}, this.
|
|
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("
|
|
607
|
+
MailerFactory.register("ses", (opt) => {
|
|
600
608
|
return new import_neko_mailer.SESProvider(opt);
|
|
601
609
|
});
|
|
602
|
-
MailerFactory.register("
|
|
610
|
+
MailerFactory.register("smtp", (opt) => {
|
|
603
611
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
604
612
|
});
|
|
605
|
-
MailerFactory.register("
|
|
613
|
+
MailerFactory.register("memory", (opt) => {
|
|
606
614
|
return new import_neko_mailer.MemoryProvider();
|
|
607
615
|
});
|
|
608
|
-
var
|
|
616
|
+
var QueueTransportFactory = class _QueueTransportFactory {
|
|
609
617
|
static {
|
|
610
|
-
__name(this, "
|
|
618
|
+
__name(this, "QueueTransportFactory");
|
|
611
619
|
}
|
|
612
620
|
static instance = new FlexibleFactory();
|
|
613
621
|
static register(key, factory) {
|
|
614
|
-
|
|
622
|
+
_QueueTransportFactory.instance.register(key, factory);
|
|
615
623
|
}
|
|
616
624
|
static create(key, ...args) {
|
|
617
|
-
return
|
|
625
|
+
return _QueueTransportFactory.instance.create(key, ...args);
|
|
618
626
|
}
|
|
619
627
|
};
|
|
620
|
-
|
|
628
|
+
QueueTransportFactory.register("database", (opt) => {
|
|
621
629
|
let transport = new DatabaseTransport(opt);
|
|
622
630
|
return new import_neko_queue.QueueConnection(transport);
|
|
623
631
|
});
|
|
624
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
764
|
+
cache_config.provider,
|
|
747
765
|
cache_config.config
|
|
748
766
|
);
|
|
749
767
|
return new import_neko_cache2.Cache(provider);
|