@devbro/pashmak 0.1.19 → 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 +52 -46
- package/dist/queue.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -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
|
});
|
|
@@ -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
|
});
|
|
@@ -1635,11 +1635,16 @@ __export(queue_exports, {
|
|
|
1635
1635
|
DatabaseTransport: () => DatabaseTransport
|
|
1636
1636
|
});
|
|
1637
1637
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
1638
|
+
|
|
1639
|
+
// src/helper.mts
|
|
1640
|
+
var helper_exports = {};
|
|
1641
|
+
__reExport(helper_exports, require("@devbro/neko-helper"));
|
|
1642
|
+
|
|
1643
|
+
// src/queue.mts
|
|
1638
1644
|
var DatabaseTransport = class {
|
|
1639
1645
|
static {
|
|
1640
1646
|
__name(this, "DatabaseTransport");
|
|
1641
1647
|
}
|
|
1642
|
-
activeIntervals = /* @__PURE__ */ new Set();
|
|
1643
1648
|
config = {
|
|
1644
1649
|
queue_table: "queue_messages",
|
|
1645
1650
|
db_connection: "default",
|
|
@@ -1648,14 +1653,48 @@ var DatabaseTransport = class {
|
|
|
1648
1653
|
message_limit: 10
|
|
1649
1654
|
// messages per each fetch
|
|
1650
1655
|
};
|
|
1651
|
-
|
|
1656
|
+
channels = /* @__PURE__ */ new Map();
|
|
1657
|
+
messageQueues = [];
|
|
1658
|
+
repeater;
|
|
1659
|
+
processMessage = /* @__PURE__ */ __name(async () => {
|
|
1660
|
+
const conn = db(this.config.db_connection);
|
|
1661
|
+
try {
|
|
1662
|
+
await conn.connect();
|
|
1663
|
+
let q = conn.getQuery();
|
|
1664
|
+
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();
|
|
1665
|
+
for (let msg of messages) {
|
|
1666
|
+
try {
|
|
1667
|
+
let callback = this.channels.get(msg.channel);
|
|
1668
|
+
await callback(msg.message);
|
|
1669
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
1670
|
+
status: "processed",
|
|
1671
|
+
updated_at: /* @__PURE__ */ new Date(),
|
|
1672
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
1673
|
+
retried_count: (msg.retried_count || 0) + 1
|
|
1674
|
+
});
|
|
1675
|
+
} catch (error) {
|
|
1676
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
1677
|
+
status: "failed",
|
|
1678
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
1679
|
+
retried_count: (msg.retried_count || 0) + 1,
|
|
1680
|
+
process_message: error.message || "Error processing message"
|
|
1681
|
+
});
|
|
1682
|
+
}
|
|
1683
|
+
}
|
|
1684
|
+
} catch (error) {
|
|
1685
|
+
logger().error("Error in DatabaseTransport listen interval:", {
|
|
1686
|
+
error
|
|
1687
|
+
});
|
|
1688
|
+
} finally {
|
|
1689
|
+
await conn.disconnect();
|
|
1690
|
+
}
|
|
1691
|
+
}, "processMessage");
|
|
1692
|
+
constructor(config3 = {}) {
|
|
1652
1693
|
this.config = { ...this.config, ...config3 };
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
setMessageLimit(limit) {
|
|
1658
|
-
this.config.message_limit = limit;
|
|
1694
|
+
this.repeater = (0, helper_exports.createRepeater)(
|
|
1695
|
+
this.processMessage,
|
|
1696
|
+
this.config.listen_interval * 1e3
|
|
1697
|
+
);
|
|
1659
1698
|
}
|
|
1660
1699
|
async dispatch(channel, message) {
|
|
1661
1700
|
const conn = db(this.config.db_connection);
|
|
@@ -1673,50 +1712,22 @@ var DatabaseTransport = class {
|
|
|
1673
1712
|
created_at: /* @__PURE__ */ new Date(),
|
|
1674
1713
|
updated_at: /* @__PURE__ */ new Date(),
|
|
1675
1714
|
last_tried_at: null,
|
|
1676
|
-
process_message: ""
|
|
1715
|
+
process_message: "",
|
|
1716
|
+
retried_count: 0,
|
|
1717
|
+
status: "pending"
|
|
1677
1718
|
});
|
|
1678
1719
|
} finally {
|
|
1679
1720
|
await conn.disconnect();
|
|
1680
1721
|
}
|
|
1681
1722
|
}
|
|
1682
|
-
async
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
await conn.connect();
|
|
1688
|
-
let q = conn.getQuery();
|
|
1689
|
-
let messages = await q.table(this.config.queue_table).whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.config.message_limit).orderBy("last_tried_at", "asc").get();
|
|
1690
|
-
for (let msg of messages) {
|
|
1691
|
-
try {
|
|
1692
|
-
await callback(msg.message);
|
|
1693
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
1694
|
-
processed: true,
|
|
1695
|
-
updated_at: /* @__PURE__ */ new Date()
|
|
1696
|
-
});
|
|
1697
|
-
} catch (error) {
|
|
1698
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
1699
|
-
processed: false,
|
|
1700
|
-
last_tried_at: /* @__PURE__ */ new Date(),
|
|
1701
|
-
process_message: error.message || "Error processing message"
|
|
1702
|
-
});
|
|
1703
|
-
}
|
|
1704
|
-
}
|
|
1705
|
-
} catch (error) {
|
|
1706
|
-
this.activeIntervals.delete(intervalId);
|
|
1707
|
-
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
1708
|
-
} finally {
|
|
1709
|
-
await conn.disconnect();
|
|
1710
|
-
}
|
|
1711
|
-
}, this.config.listen_interval * 1e3);
|
|
1712
|
-
this.activeIntervals.add(intervalId);
|
|
1713
|
-
});
|
|
1723
|
+
async registerListener(channel, callback) {
|
|
1724
|
+
this.channels.set(channel, callback);
|
|
1725
|
+
}
|
|
1726
|
+
async startListening() {
|
|
1727
|
+
this.repeater.start();
|
|
1714
1728
|
}
|
|
1715
1729
|
async stopListening() {
|
|
1716
|
-
|
|
1717
|
-
clearInterval(intervalId);
|
|
1718
|
-
}
|
|
1719
|
-
this.activeIntervals.clear();
|
|
1730
|
+
this.repeater.stop();
|
|
1720
1731
|
}
|
|
1721
1732
|
};
|
|
1722
1733
|
|
|
@@ -1739,19 +1750,7 @@ var FlexibleFactory = class {
|
|
|
1739
1750
|
return ctor(...args);
|
|
1740
1751
|
}
|
|
1741
1752
|
};
|
|
1742
|
-
|
|
1743
|
-
static {
|
|
1744
|
-
__name(this, "MailerFactory");
|
|
1745
|
-
}
|
|
1746
|
-
static instance = new FlexibleFactory();
|
|
1747
|
-
static register(key, factory) {
|
|
1748
|
-
_MailerFactory.instance.register(key, factory);
|
|
1749
|
-
}
|
|
1750
|
-
static create(key, ...args) {
|
|
1751
|
-
return _MailerFactory.instance.create(key, ...args);
|
|
1752
|
-
}
|
|
1753
|
-
};
|
|
1754
|
-
MailerFactory.register("logger", (opt) => {
|
|
1753
|
+
import_neko_mailer.MailerProviderFactory.register("logger", (opt) => {
|
|
1755
1754
|
return new import_neko_mailer.FunctionProvider((mail) => {
|
|
1756
1755
|
logger().info({
|
|
1757
1756
|
msg: "Sending email",
|
|
@@ -1759,32 +1758,20 @@ MailerFactory.register("logger", (opt) => {
|
|
|
1759
1758
|
});
|
|
1760
1759
|
});
|
|
1761
1760
|
});
|
|
1762
|
-
|
|
1761
|
+
import_neko_mailer.MailerProviderFactory.register("ses", (opt) => {
|
|
1763
1762
|
return new import_neko_mailer.SESProvider(opt);
|
|
1764
1763
|
});
|
|
1765
|
-
|
|
1764
|
+
import_neko_mailer.MailerProviderFactory.register("smtp", (opt) => {
|
|
1766
1765
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
1767
1766
|
});
|
|
1768
|
-
|
|
1767
|
+
import_neko_mailer.MailerProviderFactory.register("memory", (opt) => {
|
|
1769
1768
|
return new import_neko_mailer.MemoryProvider();
|
|
1770
1769
|
});
|
|
1771
|
-
|
|
1772
|
-
static {
|
|
1773
|
-
__name(this, "QueueTransportFactory");
|
|
1774
|
-
}
|
|
1775
|
-
static instance = new FlexibleFactory();
|
|
1776
|
-
static register(key, factory) {
|
|
1777
|
-
_QueueTransportFactory.instance.register(key, factory);
|
|
1778
|
-
}
|
|
1779
|
-
static create(key, ...args) {
|
|
1780
|
-
return _QueueTransportFactory.instance.create(key, ...args);
|
|
1781
|
-
}
|
|
1782
|
-
};
|
|
1783
|
-
QueueTransportFactory.register("database", (opt) => {
|
|
1770
|
+
import_neko_queue2.QueueTransportFactory.register("database", (opt) => {
|
|
1784
1771
|
let transport = new DatabaseTransport(opt);
|
|
1785
1772
|
return new import_neko_queue.QueueConnection(transport);
|
|
1786
1773
|
});
|
|
1787
|
-
QueueTransportFactory.register("memory", (opt) => {
|
|
1774
|
+
import_neko_queue2.QueueTransportFactory.register("memory", (opt) => {
|
|
1788
1775
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
1789
1776
|
return new import_neko_queue.QueueConnection(transport);
|
|
1790
1777
|
});
|
|
@@ -1837,7 +1824,10 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
1837
1824
|
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
1838
1825
|
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
1839
1826
|
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
1840
|
-
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
1827
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
1828
|
+
storage_config.provider,
|
|
1829
|
+
storage_config.config
|
|
1830
|
+
);
|
|
1841
1831
|
return new import_neko_storage2.Storage(provider);
|
|
1842
1832
|
});
|
|
1843
1833
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
@@ -1894,7 +1884,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
1894
1884
|
});
|
|
1895
1885
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
1896
1886
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
1897
|
-
const provider =
|
|
1887
|
+
const provider = import_neko_mailer2.MailerProviderFactory.create(
|
|
1898
1888
|
mailer_config.provider,
|
|
1899
1889
|
mailer_config.config
|
|
1900
1890
|
);
|
|
@@ -1906,7 +1896,10 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
1906
1896
|
if (!queue_config) {
|
|
1907
1897
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
1908
1898
|
}
|
|
1909
|
-
const provider = QueueTransportFactory.create(
|
|
1899
|
+
const provider = import_neko_queue3.QueueTransportFactory.create(
|
|
1900
|
+
queue_config.provider,
|
|
1901
|
+
queue_config.config
|
|
1902
|
+
);
|
|
1910
1903
|
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
1911
1904
|
return rc;
|
|
1912
1905
|
});
|