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