@devbro/pashmak 0.1.20 → 0.1.21
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/queue/queue_migration.tpl +1 -1
- package/dist/bin/app/console/DefaultCommand.cjs +71 -78
- package/dist/bin/app/console/KeyGenerateCommand.cjs +71 -78
- package/dist/bin/app/console/StartCommand.cjs +71 -78
- package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +71 -78
- package/dist/bin/app/console/generate/index.cjs +71 -78
- package/dist/bin/app/console/index.cjs +71 -78
- package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +71 -78
- package/dist/bin/app/console/migrate/MigrateCommand.cjs +71 -78
- package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +71 -78
- package/dist/bin/app/console/migrate/index.cjs +71 -78
- package/dist/bin/app/console/queue/GenerateQueueMigrateCommand.cjs +71 -78
- package/dist/bin/cache.cjs +71 -78
- package/dist/bin/facades.cjs +71 -78
- package/dist/bin/factories.cjs +73 -84
- package/dist/bin/index.cjs +76 -79
- package/dist/bin/middlewares.cjs +71 -78
- package/dist/bin/queue.cjs +69 -78
- package/dist/facades.mjs +15 -10
- package/dist/facades.mjs.map +1 -1
- package/dist/factories.d.mts +1 -13
- package/dist/factories.mjs +13 -34
- package/dist/factories.mjs.map +1 -1
- package/dist/queue.d.mts +11 -5
- package/dist/queue.mjs +51 -45
- package/dist/queue.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1637,11 +1637,16 @@ __export(queue_exports, {
|
|
|
1637
1637
|
DatabaseTransport: () => DatabaseTransport
|
|
1638
1638
|
});
|
|
1639
1639
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
1640
|
+
|
|
1641
|
+
// src/helper.mts
|
|
1642
|
+
var helper_exports = {};
|
|
1643
|
+
__reExport(helper_exports, require("@devbro/neko-helper"));
|
|
1644
|
+
|
|
1645
|
+
// src/queue.mts
|
|
1640
1646
|
var DatabaseTransport = class {
|
|
1641
1647
|
static {
|
|
1642
1648
|
__name(this, "DatabaseTransport");
|
|
1643
1649
|
}
|
|
1644
|
-
activeIntervals = /* @__PURE__ */ new Set();
|
|
1645
1650
|
config = {
|
|
1646
1651
|
queue_table: "queue_messages",
|
|
1647
1652
|
db_connection: "default",
|
|
@@ -1650,14 +1655,48 @@ var DatabaseTransport = class {
|
|
|
1650
1655
|
message_limit: 10
|
|
1651
1656
|
// messages per each fetch
|
|
1652
1657
|
};
|
|
1653
|
-
|
|
1658
|
+
channels = /* @__PURE__ */ new Map();
|
|
1659
|
+
messageQueues = [];
|
|
1660
|
+
repeater;
|
|
1661
|
+
processMessage = /* @__PURE__ */ __name(async () => {
|
|
1662
|
+
const conn = db(this.config.db_connection);
|
|
1663
|
+
try {
|
|
1664
|
+
await conn.connect();
|
|
1665
|
+
let q = conn.getQuery();
|
|
1666
|
+
let messages = await q.table(this.config.queue_table).whereOp("channel", "in", Array.from(this.channels.keys())).whereOp("status", "in", ["pending", "failed"]).limit(this.config.message_limit).orderBy("last_tried_at", "asc").get();
|
|
1667
|
+
for (let msg of messages) {
|
|
1668
|
+
try {
|
|
1669
|
+
let callback = this.channels.get(msg.channel);
|
|
1670
|
+
await callback(msg.message);
|
|
1671
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
1672
|
+
status: "processed",
|
|
1673
|
+
updated_at: /* @__PURE__ */ new Date(),
|
|
1674
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
1675
|
+
retried_count: (msg.retried_count || 0) + 1
|
|
1676
|
+
});
|
|
1677
|
+
} catch (error) {
|
|
1678
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
1679
|
+
status: "failed",
|
|
1680
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
1681
|
+
retried_count: (msg.retried_count || 0) + 1,
|
|
1682
|
+
process_message: error.message || "Error processing message"
|
|
1683
|
+
});
|
|
1684
|
+
}
|
|
1685
|
+
}
|
|
1686
|
+
} catch (error) {
|
|
1687
|
+
logger().error("Error in DatabaseTransport listen interval:", {
|
|
1688
|
+
error
|
|
1689
|
+
});
|
|
1690
|
+
} finally {
|
|
1691
|
+
await conn.disconnect();
|
|
1692
|
+
}
|
|
1693
|
+
}, "processMessage");
|
|
1694
|
+
constructor(config5 = {}) {
|
|
1654
1695
|
this.config = { ...this.config, ...config5 };
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
setMessageLimit(limit) {
|
|
1660
|
-
this.config.message_limit = limit;
|
|
1696
|
+
this.repeater = (0, helper_exports.createRepeater)(
|
|
1697
|
+
this.processMessage,
|
|
1698
|
+
this.config.listen_interval * 1e3
|
|
1699
|
+
);
|
|
1661
1700
|
}
|
|
1662
1701
|
async dispatch(channel, message) {
|
|
1663
1702
|
const conn = db(this.config.db_connection);
|
|
@@ -1675,50 +1714,22 @@ var DatabaseTransport = class {
|
|
|
1675
1714
|
created_at: /* @__PURE__ */ new Date(),
|
|
1676
1715
|
updated_at: /* @__PURE__ */ new Date(),
|
|
1677
1716
|
last_tried_at: null,
|
|
1678
|
-
process_message: ""
|
|
1717
|
+
process_message: "",
|
|
1718
|
+
retried_count: 0,
|
|
1719
|
+
status: "pending"
|
|
1679
1720
|
});
|
|
1680
1721
|
} finally {
|
|
1681
1722
|
await conn.disconnect();
|
|
1682
1723
|
}
|
|
1683
1724
|
}
|
|
1684
|
-
async
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
await conn.connect();
|
|
1690
|
-
let q = conn.getQuery();
|
|
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();
|
|
1692
|
-
for (let msg of messages) {
|
|
1693
|
-
try {
|
|
1694
|
-
await callback(msg.message);
|
|
1695
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
1696
|
-
processed: true,
|
|
1697
|
-
updated_at: /* @__PURE__ */ new Date()
|
|
1698
|
-
});
|
|
1699
|
-
} catch (error) {
|
|
1700
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
1701
|
-
processed: false,
|
|
1702
|
-
last_tried_at: /* @__PURE__ */ new Date(),
|
|
1703
|
-
process_message: error.message || "Error processing message"
|
|
1704
|
-
});
|
|
1705
|
-
}
|
|
1706
|
-
}
|
|
1707
|
-
} catch (error) {
|
|
1708
|
-
this.activeIntervals.delete(intervalId);
|
|
1709
|
-
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
1710
|
-
} finally {
|
|
1711
|
-
await conn.disconnect();
|
|
1712
|
-
}
|
|
1713
|
-
}, this.config.listen_interval * 1e3);
|
|
1714
|
-
this.activeIntervals.add(intervalId);
|
|
1715
|
-
});
|
|
1725
|
+
async registerListener(channel, callback) {
|
|
1726
|
+
this.channels.set(channel, callback);
|
|
1727
|
+
}
|
|
1728
|
+
async startListening() {
|
|
1729
|
+
this.repeater.start();
|
|
1716
1730
|
}
|
|
1717
1731
|
async stopListening() {
|
|
1718
|
-
|
|
1719
|
-
clearInterval(intervalId);
|
|
1720
|
-
}
|
|
1721
|
-
this.activeIntervals.clear();
|
|
1732
|
+
this.repeater.stop();
|
|
1722
1733
|
}
|
|
1723
1734
|
};
|
|
1724
1735
|
|
|
@@ -1741,19 +1752,7 @@ var FlexibleFactory = class {
|
|
|
1741
1752
|
return ctor(...args);
|
|
1742
1753
|
}
|
|
1743
1754
|
};
|
|
1744
|
-
|
|
1745
|
-
static {
|
|
1746
|
-
__name(this, "MailerFactory");
|
|
1747
|
-
}
|
|
1748
|
-
static instance = new FlexibleFactory();
|
|
1749
|
-
static register(key, factory) {
|
|
1750
|
-
_MailerFactory.instance.register(key, factory);
|
|
1751
|
-
}
|
|
1752
|
-
static create(key, ...args) {
|
|
1753
|
-
return _MailerFactory.instance.create(key, ...args);
|
|
1754
|
-
}
|
|
1755
|
-
};
|
|
1756
|
-
MailerFactory.register("logger", (opt) => {
|
|
1755
|
+
import_neko_mailer.MailerProviderFactory.register("logger", (opt) => {
|
|
1757
1756
|
return new import_neko_mailer.FunctionProvider((mail) => {
|
|
1758
1757
|
logger().info({
|
|
1759
1758
|
msg: "Sending email",
|
|
@@ -1761,32 +1760,20 @@ MailerFactory.register("logger", (opt) => {
|
|
|
1761
1760
|
});
|
|
1762
1761
|
});
|
|
1763
1762
|
});
|
|
1764
|
-
|
|
1763
|
+
import_neko_mailer.MailerProviderFactory.register("ses", (opt) => {
|
|
1765
1764
|
return new import_neko_mailer.SESProvider(opt);
|
|
1766
1765
|
});
|
|
1767
|
-
|
|
1766
|
+
import_neko_mailer.MailerProviderFactory.register("smtp", (opt) => {
|
|
1768
1767
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
1769
1768
|
});
|
|
1770
|
-
|
|
1769
|
+
import_neko_mailer.MailerProviderFactory.register("memory", (opt) => {
|
|
1771
1770
|
return new import_neko_mailer.MemoryProvider();
|
|
1772
1771
|
});
|
|
1773
|
-
|
|
1774
|
-
static {
|
|
1775
|
-
__name(this, "QueueTransportFactory");
|
|
1776
|
-
}
|
|
1777
|
-
static instance = new FlexibleFactory();
|
|
1778
|
-
static register(key, factory) {
|
|
1779
|
-
_QueueTransportFactory.instance.register(key, factory);
|
|
1780
|
-
}
|
|
1781
|
-
static create(key, ...args) {
|
|
1782
|
-
return _QueueTransportFactory.instance.create(key, ...args);
|
|
1783
|
-
}
|
|
1784
|
-
};
|
|
1785
|
-
QueueTransportFactory.register("database", (opt) => {
|
|
1772
|
+
import_neko_queue2.QueueTransportFactory.register("database", (opt) => {
|
|
1786
1773
|
let transport = new DatabaseTransport(opt);
|
|
1787
1774
|
return new import_neko_queue.QueueConnection(transport);
|
|
1788
1775
|
});
|
|
1789
|
-
QueueTransportFactory.register("memory", (opt) => {
|
|
1776
|
+
import_neko_queue2.QueueTransportFactory.register("memory", (opt) => {
|
|
1790
1777
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
1791
1778
|
return new import_neko_queue.QueueConnection(transport);
|
|
1792
1779
|
});
|
|
@@ -1839,7 +1826,10 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
1839
1826
|
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
1840
1827
|
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
1841
1828
|
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
1842
|
-
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
1829
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
1830
|
+
storage_config.provider,
|
|
1831
|
+
storage_config.config
|
|
1832
|
+
);
|
|
1843
1833
|
return new import_neko_storage2.Storage(provider);
|
|
1844
1834
|
});
|
|
1845
1835
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
@@ -1896,7 +1886,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
1896
1886
|
});
|
|
1897
1887
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
1898
1888
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
1899
|
-
const provider =
|
|
1889
|
+
const provider = import_neko_mailer2.MailerProviderFactory.create(
|
|
1900
1890
|
mailer_config.provider,
|
|
1901
1891
|
mailer_config.config
|
|
1902
1892
|
);
|
|
@@ -1908,7 +1898,10 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
1908
1898
|
if (!queue_config) {
|
|
1909
1899
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
1910
1900
|
}
|
|
1911
|
-
const provider = QueueTransportFactory.create(
|
|
1901
|
+
const provider = import_neko_queue3.QueueTransportFactory.create(
|
|
1902
|
+
queue_config.provider,
|
|
1903
|
+
queue_config.config
|
|
1904
|
+
);
|
|
1912
1905
|
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
1913
1906
|
return rc;
|
|
1914
1907
|
});
|
|
@@ -480,11 +480,16 @@ __export(queue_exports, {
|
|
|
480
480
|
DatabaseTransport: () => DatabaseTransport
|
|
481
481
|
});
|
|
482
482
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
483
|
+
|
|
484
|
+
// src/helper.mts
|
|
485
|
+
var helper_exports = {};
|
|
486
|
+
__reExport(helper_exports, require("@devbro/neko-helper"));
|
|
487
|
+
|
|
488
|
+
// src/queue.mts
|
|
483
489
|
var DatabaseTransport = class {
|
|
484
490
|
static {
|
|
485
491
|
__name(this, "DatabaseTransport");
|
|
486
492
|
}
|
|
487
|
-
activeIntervals = /* @__PURE__ */ new Set();
|
|
488
493
|
config = {
|
|
489
494
|
queue_table: "queue_messages",
|
|
490
495
|
db_connection: "default",
|
|
@@ -493,14 +498,48 @@ var DatabaseTransport = class {
|
|
|
493
498
|
message_limit: 10
|
|
494
499
|
// messages per each fetch
|
|
495
500
|
};
|
|
496
|
-
|
|
501
|
+
channels = /* @__PURE__ */ new Map();
|
|
502
|
+
messageQueues = [];
|
|
503
|
+
repeater;
|
|
504
|
+
processMessage = /* @__PURE__ */ __name(async () => {
|
|
505
|
+
const conn = db(this.config.db_connection);
|
|
506
|
+
try {
|
|
507
|
+
await conn.connect();
|
|
508
|
+
let q = conn.getQuery();
|
|
509
|
+
let messages = await q.table(this.config.queue_table).whereOp("channel", "in", Array.from(this.channels.keys())).whereOp("status", "in", ["pending", "failed"]).limit(this.config.message_limit).orderBy("last_tried_at", "asc").get();
|
|
510
|
+
for (let msg of messages) {
|
|
511
|
+
try {
|
|
512
|
+
let callback = this.channels.get(msg.channel);
|
|
513
|
+
await callback(msg.message);
|
|
514
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
515
|
+
status: "processed",
|
|
516
|
+
updated_at: /* @__PURE__ */ new Date(),
|
|
517
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
518
|
+
retried_count: (msg.retried_count || 0) + 1
|
|
519
|
+
});
|
|
520
|
+
} catch (error) {
|
|
521
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
522
|
+
status: "failed",
|
|
523
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
524
|
+
retried_count: (msg.retried_count || 0) + 1,
|
|
525
|
+
process_message: error.message || "Error processing message"
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
} catch (error) {
|
|
530
|
+
logger().error("Error in DatabaseTransport listen interval:", {
|
|
531
|
+
error
|
|
532
|
+
});
|
|
533
|
+
} finally {
|
|
534
|
+
await conn.disconnect();
|
|
535
|
+
}
|
|
536
|
+
}, "processMessage");
|
|
537
|
+
constructor(config3 = {}) {
|
|
497
538
|
this.config = { ...this.config, ...config3 };
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
setMessageLimit(limit) {
|
|
503
|
-
this.config.message_limit = limit;
|
|
539
|
+
this.repeater = (0, helper_exports.createRepeater)(
|
|
540
|
+
this.processMessage,
|
|
541
|
+
this.config.listen_interval * 1e3
|
|
542
|
+
);
|
|
504
543
|
}
|
|
505
544
|
async dispatch(channel, message) {
|
|
506
545
|
const conn = db(this.config.db_connection);
|
|
@@ -518,50 +557,22 @@ var DatabaseTransport = class {
|
|
|
518
557
|
created_at: /* @__PURE__ */ new Date(),
|
|
519
558
|
updated_at: /* @__PURE__ */ new Date(),
|
|
520
559
|
last_tried_at: null,
|
|
521
|
-
process_message: ""
|
|
560
|
+
process_message: "",
|
|
561
|
+
retried_count: 0,
|
|
562
|
+
status: "pending"
|
|
522
563
|
});
|
|
523
564
|
} finally {
|
|
524
565
|
await conn.disconnect();
|
|
525
566
|
}
|
|
526
567
|
}
|
|
527
|
-
async
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
await conn.connect();
|
|
533
|
-
let q = conn.getQuery();
|
|
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();
|
|
535
|
-
for (let msg of messages) {
|
|
536
|
-
try {
|
|
537
|
-
await callback(msg.message);
|
|
538
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
539
|
-
processed: true,
|
|
540
|
-
updated_at: /* @__PURE__ */ new Date()
|
|
541
|
-
});
|
|
542
|
-
} catch (error) {
|
|
543
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
544
|
-
processed: false,
|
|
545
|
-
last_tried_at: /* @__PURE__ */ new Date(),
|
|
546
|
-
process_message: error.message || "Error processing message"
|
|
547
|
-
});
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
} catch (error) {
|
|
551
|
-
this.activeIntervals.delete(intervalId);
|
|
552
|
-
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
553
|
-
} finally {
|
|
554
|
-
await conn.disconnect();
|
|
555
|
-
}
|
|
556
|
-
}, this.config.listen_interval * 1e3);
|
|
557
|
-
this.activeIntervals.add(intervalId);
|
|
558
|
-
});
|
|
568
|
+
async registerListener(channel, callback) {
|
|
569
|
+
this.channels.set(channel, callback);
|
|
570
|
+
}
|
|
571
|
+
async startListening() {
|
|
572
|
+
this.repeater.start();
|
|
559
573
|
}
|
|
560
574
|
async stopListening() {
|
|
561
|
-
|
|
562
|
-
clearInterval(intervalId);
|
|
563
|
-
}
|
|
564
|
-
this.activeIntervals.clear();
|
|
575
|
+
this.repeater.stop();
|
|
565
576
|
}
|
|
566
577
|
};
|
|
567
578
|
|
|
@@ -584,19 +595,7 @@ var FlexibleFactory = class {
|
|
|
584
595
|
return ctor(...args);
|
|
585
596
|
}
|
|
586
597
|
};
|
|
587
|
-
|
|
588
|
-
static {
|
|
589
|
-
__name(this, "MailerFactory");
|
|
590
|
-
}
|
|
591
|
-
static instance = new FlexibleFactory();
|
|
592
|
-
static register(key, factory) {
|
|
593
|
-
_MailerFactory.instance.register(key, factory);
|
|
594
|
-
}
|
|
595
|
-
static create(key, ...args) {
|
|
596
|
-
return _MailerFactory.instance.create(key, ...args);
|
|
597
|
-
}
|
|
598
|
-
};
|
|
599
|
-
MailerFactory.register("logger", (opt) => {
|
|
598
|
+
import_neko_mailer.MailerProviderFactory.register("logger", (opt) => {
|
|
600
599
|
return new import_neko_mailer.FunctionProvider((mail) => {
|
|
601
600
|
logger().info({
|
|
602
601
|
msg: "Sending email",
|
|
@@ -604,32 +603,20 @@ MailerFactory.register("logger", (opt) => {
|
|
|
604
603
|
});
|
|
605
604
|
});
|
|
606
605
|
});
|
|
607
|
-
|
|
606
|
+
import_neko_mailer.MailerProviderFactory.register("ses", (opt) => {
|
|
608
607
|
return new import_neko_mailer.SESProvider(opt);
|
|
609
608
|
});
|
|
610
|
-
|
|
609
|
+
import_neko_mailer.MailerProviderFactory.register("smtp", (opt) => {
|
|
611
610
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
612
611
|
});
|
|
613
|
-
|
|
612
|
+
import_neko_mailer.MailerProviderFactory.register("memory", (opt) => {
|
|
614
613
|
return new import_neko_mailer.MemoryProvider();
|
|
615
614
|
});
|
|
616
|
-
|
|
617
|
-
static {
|
|
618
|
-
__name(this, "QueueTransportFactory");
|
|
619
|
-
}
|
|
620
|
-
static instance = new FlexibleFactory();
|
|
621
|
-
static register(key, factory) {
|
|
622
|
-
_QueueTransportFactory.instance.register(key, factory);
|
|
623
|
-
}
|
|
624
|
-
static create(key, ...args) {
|
|
625
|
-
return _QueueTransportFactory.instance.create(key, ...args);
|
|
626
|
-
}
|
|
627
|
-
};
|
|
628
|
-
QueueTransportFactory.register("database", (opt) => {
|
|
615
|
+
import_neko_queue2.QueueTransportFactory.register("database", (opt) => {
|
|
629
616
|
let transport = new DatabaseTransport(opt);
|
|
630
617
|
return new import_neko_queue.QueueConnection(transport);
|
|
631
618
|
});
|
|
632
|
-
QueueTransportFactory.register("memory", (opt) => {
|
|
619
|
+
import_neko_queue2.QueueTransportFactory.register("memory", (opt) => {
|
|
633
620
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
634
621
|
return new import_neko_queue.QueueConnection(transport);
|
|
635
622
|
});
|
|
@@ -682,7 +669,10 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
682
669
|
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
683
670
|
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
684
671
|
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
685
|
-
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
672
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
673
|
+
storage_config.provider,
|
|
674
|
+
storage_config.config
|
|
675
|
+
);
|
|
686
676
|
return new import_neko_storage2.Storage(provider);
|
|
687
677
|
});
|
|
688
678
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
@@ -739,7 +729,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
739
729
|
});
|
|
740
730
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
741
731
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
742
|
-
const provider =
|
|
732
|
+
const provider = import_neko_mailer2.MailerProviderFactory.create(
|
|
743
733
|
mailer_config.provider,
|
|
744
734
|
mailer_config.config
|
|
745
735
|
);
|
|
@@ -751,7 +741,10 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
751
741
|
if (!queue_config) {
|
|
752
742
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
753
743
|
}
|
|
754
|
-
const provider = QueueTransportFactory.create(
|
|
744
|
+
const provider = import_neko_queue3.QueueTransportFactory.create(
|
|
745
|
+
queue_config.provider,
|
|
746
|
+
queue_config.config
|
|
747
|
+
);
|
|
755
748
|
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
756
749
|
return rc;
|
|
757
750
|
});
|
package/dist/bin/cache.cjs
CHANGED
|
@@ -481,11 +481,16 @@ __export(queue_exports, {
|
|
|
481
481
|
DatabaseTransport: () => DatabaseTransport
|
|
482
482
|
});
|
|
483
483
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
484
|
+
|
|
485
|
+
// src/helper.mts
|
|
486
|
+
var helper_exports = {};
|
|
487
|
+
__reExport(helper_exports, require("@devbro/neko-helper"));
|
|
488
|
+
|
|
489
|
+
// src/queue.mts
|
|
484
490
|
var DatabaseTransport = class {
|
|
485
491
|
static {
|
|
486
492
|
__name(this, "DatabaseTransport");
|
|
487
493
|
}
|
|
488
|
-
activeIntervals = /* @__PURE__ */ new Set();
|
|
489
494
|
config = {
|
|
490
495
|
queue_table: "queue_messages",
|
|
491
496
|
db_connection: "default",
|
|
@@ -494,14 +499,48 @@ var DatabaseTransport = class {
|
|
|
494
499
|
message_limit: 10
|
|
495
500
|
// messages per each fetch
|
|
496
501
|
};
|
|
497
|
-
|
|
502
|
+
channels = /* @__PURE__ */ new Map();
|
|
503
|
+
messageQueues = [];
|
|
504
|
+
repeater;
|
|
505
|
+
processMessage = /* @__PURE__ */ __name(async () => {
|
|
506
|
+
const conn = db(this.config.db_connection);
|
|
507
|
+
try {
|
|
508
|
+
await conn.connect();
|
|
509
|
+
let q = conn.getQuery();
|
|
510
|
+
let messages = await q.table(this.config.queue_table).whereOp("channel", "in", Array.from(this.channels.keys())).whereOp("status", "in", ["pending", "failed"]).limit(this.config.message_limit).orderBy("last_tried_at", "asc").get();
|
|
511
|
+
for (let msg of messages) {
|
|
512
|
+
try {
|
|
513
|
+
let callback = this.channels.get(msg.channel);
|
|
514
|
+
await callback(msg.message);
|
|
515
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
516
|
+
status: "processed",
|
|
517
|
+
updated_at: /* @__PURE__ */ new Date(),
|
|
518
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
519
|
+
retried_count: (msg.retried_count || 0) + 1
|
|
520
|
+
});
|
|
521
|
+
} catch (error) {
|
|
522
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
523
|
+
status: "failed",
|
|
524
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
525
|
+
retried_count: (msg.retried_count || 0) + 1,
|
|
526
|
+
process_message: error.message || "Error processing message"
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
} catch (error) {
|
|
531
|
+
logger().error("Error in DatabaseTransport listen interval:", {
|
|
532
|
+
error
|
|
533
|
+
});
|
|
534
|
+
} finally {
|
|
535
|
+
await conn.disconnect();
|
|
536
|
+
}
|
|
537
|
+
}, "processMessage");
|
|
538
|
+
constructor(config2 = {}) {
|
|
498
539
|
this.config = { ...this.config, ...config2 };
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
setMessageLimit(limit) {
|
|
504
|
-
this.config.message_limit = limit;
|
|
540
|
+
this.repeater = (0, helper_exports.createRepeater)(
|
|
541
|
+
this.processMessage,
|
|
542
|
+
this.config.listen_interval * 1e3
|
|
543
|
+
);
|
|
505
544
|
}
|
|
506
545
|
async dispatch(channel, message) {
|
|
507
546
|
const conn = db(this.config.db_connection);
|
|
@@ -519,50 +558,22 @@ var DatabaseTransport = class {
|
|
|
519
558
|
created_at: /* @__PURE__ */ new Date(),
|
|
520
559
|
updated_at: /* @__PURE__ */ new Date(),
|
|
521
560
|
last_tried_at: null,
|
|
522
|
-
process_message: ""
|
|
561
|
+
process_message: "",
|
|
562
|
+
retried_count: 0,
|
|
563
|
+
status: "pending"
|
|
523
564
|
});
|
|
524
565
|
} finally {
|
|
525
566
|
await conn.disconnect();
|
|
526
567
|
}
|
|
527
568
|
}
|
|
528
|
-
async
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
await conn.connect();
|
|
534
|
-
let q = conn.getQuery();
|
|
535
|
-
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();
|
|
536
|
-
for (let msg of messages) {
|
|
537
|
-
try {
|
|
538
|
-
await callback(msg.message);
|
|
539
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
540
|
-
processed: true,
|
|
541
|
-
updated_at: /* @__PURE__ */ new Date()
|
|
542
|
-
});
|
|
543
|
-
} catch (error) {
|
|
544
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
545
|
-
processed: false,
|
|
546
|
-
last_tried_at: /* @__PURE__ */ new Date(),
|
|
547
|
-
process_message: error.message || "Error processing message"
|
|
548
|
-
});
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
} catch (error) {
|
|
552
|
-
this.activeIntervals.delete(intervalId);
|
|
553
|
-
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
554
|
-
} finally {
|
|
555
|
-
await conn.disconnect();
|
|
556
|
-
}
|
|
557
|
-
}, this.config.listen_interval * 1e3);
|
|
558
|
-
this.activeIntervals.add(intervalId);
|
|
559
|
-
});
|
|
569
|
+
async registerListener(channel, callback) {
|
|
570
|
+
this.channels.set(channel, callback);
|
|
571
|
+
}
|
|
572
|
+
async startListening() {
|
|
573
|
+
this.repeater.start();
|
|
560
574
|
}
|
|
561
575
|
async stopListening() {
|
|
562
|
-
|
|
563
|
-
clearInterval(intervalId);
|
|
564
|
-
}
|
|
565
|
-
this.activeIntervals.clear();
|
|
576
|
+
this.repeater.stop();
|
|
566
577
|
}
|
|
567
578
|
};
|
|
568
579
|
|
|
@@ -585,19 +596,7 @@ var FlexibleFactory = class {
|
|
|
585
596
|
return ctor(...args);
|
|
586
597
|
}
|
|
587
598
|
};
|
|
588
|
-
|
|
589
|
-
static {
|
|
590
|
-
__name(this, "MailerFactory");
|
|
591
|
-
}
|
|
592
|
-
static instance = new FlexibleFactory();
|
|
593
|
-
static register(key, factory) {
|
|
594
|
-
_MailerFactory.instance.register(key, factory);
|
|
595
|
-
}
|
|
596
|
-
static create(key, ...args) {
|
|
597
|
-
return _MailerFactory.instance.create(key, ...args);
|
|
598
|
-
}
|
|
599
|
-
};
|
|
600
|
-
MailerFactory.register("logger", (opt) => {
|
|
599
|
+
import_neko_mailer.MailerProviderFactory.register("logger", (opt) => {
|
|
601
600
|
return new import_neko_mailer.FunctionProvider((mail) => {
|
|
602
601
|
logger().info({
|
|
603
602
|
msg: "Sending email",
|
|
@@ -605,32 +604,20 @@ MailerFactory.register("logger", (opt) => {
|
|
|
605
604
|
});
|
|
606
605
|
});
|
|
607
606
|
});
|
|
608
|
-
|
|
607
|
+
import_neko_mailer.MailerProviderFactory.register("ses", (opt) => {
|
|
609
608
|
return new import_neko_mailer.SESProvider(opt);
|
|
610
609
|
});
|
|
611
|
-
|
|
610
|
+
import_neko_mailer.MailerProviderFactory.register("smtp", (opt) => {
|
|
612
611
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
613
612
|
});
|
|
614
|
-
|
|
613
|
+
import_neko_mailer.MailerProviderFactory.register("memory", (opt) => {
|
|
615
614
|
return new import_neko_mailer.MemoryProvider();
|
|
616
615
|
});
|
|
617
|
-
|
|
618
|
-
static {
|
|
619
|
-
__name(this, "QueueTransportFactory");
|
|
620
|
-
}
|
|
621
|
-
static instance = new FlexibleFactory();
|
|
622
|
-
static register(key, factory) {
|
|
623
|
-
_QueueTransportFactory.instance.register(key, factory);
|
|
624
|
-
}
|
|
625
|
-
static create(key, ...args) {
|
|
626
|
-
return _QueueTransportFactory.instance.create(key, ...args);
|
|
627
|
-
}
|
|
628
|
-
};
|
|
629
|
-
QueueTransportFactory.register("database", (opt) => {
|
|
616
|
+
import_neko_queue2.QueueTransportFactory.register("database", (opt) => {
|
|
630
617
|
let transport = new DatabaseTransport(opt);
|
|
631
618
|
return new import_neko_queue.QueueConnection(transport);
|
|
632
619
|
});
|
|
633
|
-
QueueTransportFactory.register("memory", (opt) => {
|
|
620
|
+
import_neko_queue2.QueueTransportFactory.register("memory", (opt) => {
|
|
634
621
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
635
622
|
return new import_neko_queue.QueueConnection(transport);
|
|
636
623
|
});
|
|
@@ -683,7 +670,10 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
683
670
|
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
684
671
|
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
685
672
|
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
686
|
-
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
673
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
674
|
+
storage_config.provider,
|
|
675
|
+
storage_config.config
|
|
676
|
+
);
|
|
687
677
|
return new import_neko_storage2.Storage(provider);
|
|
688
678
|
});
|
|
689
679
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
@@ -740,7 +730,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
740
730
|
});
|
|
741
731
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
742
732
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
743
|
-
const provider =
|
|
733
|
+
const provider = import_neko_mailer2.MailerProviderFactory.create(
|
|
744
734
|
mailer_config.provider,
|
|
745
735
|
mailer_config.config
|
|
746
736
|
);
|
|
@@ -752,7 +742,10 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
752
742
|
if (!queue_config) {
|
|
753
743
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
754
744
|
}
|
|
755
|
-
const provider = QueueTransportFactory.create(
|
|
745
|
+
const provider = import_neko_queue3.QueueTransportFactory.create(
|
|
746
|
+
queue_config.provider,
|
|
747
|
+
queue_config.config
|
|
748
|
+
);
|
|
756
749
|
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
757
750
|
return rc;
|
|
758
751
|
});
|