@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
|
@@ -11,7 +11,7 @@ export default class {{className}} extends Migration {
|
|
|
11
11
|
table.datetimeTz('last_tried_at').nullable(true);
|
|
12
12
|
table.text('process_message').default('');
|
|
13
13
|
table.string('status').default('pending');
|
|
14
|
-
table.
|
|
14
|
+
table.integer('retried_count').default(0);
|
|
15
15
|
});
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -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
|
});
|
|
@@ -484,11 +484,16 @@ __export(queue_exports, {
|
|
|
484
484
|
DatabaseTransport: () => DatabaseTransport
|
|
485
485
|
});
|
|
486
486
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
487
|
+
|
|
488
|
+
// src/helper.mts
|
|
489
|
+
var helper_exports = {};
|
|
490
|
+
__reExport(helper_exports, require("@devbro/neko-helper"));
|
|
491
|
+
|
|
492
|
+
// src/queue.mts
|
|
487
493
|
var DatabaseTransport = class {
|
|
488
494
|
static {
|
|
489
495
|
__name(this, "DatabaseTransport");
|
|
490
496
|
}
|
|
491
|
-
activeIntervals = /* @__PURE__ */ new Set();
|
|
492
497
|
config = {
|
|
493
498
|
queue_table: "queue_messages",
|
|
494
499
|
db_connection: "default",
|
|
@@ -497,14 +502,48 @@ var DatabaseTransport = class {
|
|
|
497
502
|
message_limit: 10
|
|
498
503
|
// messages per each fetch
|
|
499
504
|
};
|
|
500
|
-
|
|
505
|
+
channels = /* @__PURE__ */ new Map();
|
|
506
|
+
messageQueues = [];
|
|
507
|
+
repeater;
|
|
508
|
+
processMessage = /* @__PURE__ */ __name(async () => {
|
|
509
|
+
const conn = db(this.config.db_connection);
|
|
510
|
+
try {
|
|
511
|
+
await conn.connect();
|
|
512
|
+
let q = conn.getQuery();
|
|
513
|
+
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();
|
|
514
|
+
for (let msg of messages) {
|
|
515
|
+
try {
|
|
516
|
+
let callback = this.channels.get(msg.channel);
|
|
517
|
+
await callback(msg.message);
|
|
518
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
519
|
+
status: "processed",
|
|
520
|
+
updated_at: /* @__PURE__ */ new Date(),
|
|
521
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
522
|
+
retried_count: (msg.retried_count || 0) + 1
|
|
523
|
+
});
|
|
524
|
+
} catch (error) {
|
|
525
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
526
|
+
status: "failed",
|
|
527
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
528
|
+
retried_count: (msg.retried_count || 0) + 1,
|
|
529
|
+
process_message: error.message || "Error processing message"
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
} catch (error) {
|
|
534
|
+
logger().error("Error in DatabaseTransport listen interval:", {
|
|
535
|
+
error
|
|
536
|
+
});
|
|
537
|
+
} finally {
|
|
538
|
+
await conn.disconnect();
|
|
539
|
+
}
|
|
540
|
+
}, "processMessage");
|
|
541
|
+
constructor(config2 = {}) {
|
|
501
542
|
this.config = { ...this.config, ...config2 };
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
setMessageLimit(limit) {
|
|
507
|
-
this.config.message_limit = limit;
|
|
543
|
+
this.repeater = (0, helper_exports.createRepeater)(
|
|
544
|
+
this.processMessage,
|
|
545
|
+
this.config.listen_interval * 1e3
|
|
546
|
+
);
|
|
508
547
|
}
|
|
509
548
|
async dispatch(channel, message) {
|
|
510
549
|
const conn = db(this.config.db_connection);
|
|
@@ -522,50 +561,22 @@ var DatabaseTransport = class {
|
|
|
522
561
|
created_at: /* @__PURE__ */ new Date(),
|
|
523
562
|
updated_at: /* @__PURE__ */ new Date(),
|
|
524
563
|
last_tried_at: null,
|
|
525
|
-
process_message: ""
|
|
564
|
+
process_message: "",
|
|
565
|
+
retried_count: 0,
|
|
566
|
+
status: "pending"
|
|
526
567
|
});
|
|
527
568
|
} finally {
|
|
528
569
|
await conn.disconnect();
|
|
529
570
|
}
|
|
530
571
|
}
|
|
531
|
-
async
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
await conn.connect();
|
|
537
|
-
let q = conn.getQuery();
|
|
538
|
-
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();
|
|
539
|
-
for (let msg of messages) {
|
|
540
|
-
try {
|
|
541
|
-
await callback(msg.message);
|
|
542
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
543
|
-
processed: true,
|
|
544
|
-
updated_at: /* @__PURE__ */ new Date()
|
|
545
|
-
});
|
|
546
|
-
} catch (error) {
|
|
547
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
548
|
-
processed: false,
|
|
549
|
-
last_tried_at: /* @__PURE__ */ new Date(),
|
|
550
|
-
process_message: error.message || "Error processing message"
|
|
551
|
-
});
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
} catch (error) {
|
|
555
|
-
this.activeIntervals.delete(intervalId);
|
|
556
|
-
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
557
|
-
} finally {
|
|
558
|
-
await conn.disconnect();
|
|
559
|
-
}
|
|
560
|
-
}, this.config.listen_interval * 1e3);
|
|
561
|
-
this.activeIntervals.add(intervalId);
|
|
562
|
-
});
|
|
572
|
+
async registerListener(channel, callback) {
|
|
573
|
+
this.channels.set(channel, callback);
|
|
574
|
+
}
|
|
575
|
+
async startListening() {
|
|
576
|
+
this.repeater.start();
|
|
563
577
|
}
|
|
564
578
|
async stopListening() {
|
|
565
|
-
|
|
566
|
-
clearInterval(intervalId);
|
|
567
|
-
}
|
|
568
|
-
this.activeIntervals.clear();
|
|
579
|
+
this.repeater.stop();
|
|
569
580
|
}
|
|
570
581
|
};
|
|
571
582
|
|
|
@@ -588,19 +599,7 @@ var FlexibleFactory = class {
|
|
|
588
599
|
return ctor(...args);
|
|
589
600
|
}
|
|
590
601
|
};
|
|
591
|
-
|
|
592
|
-
static {
|
|
593
|
-
__name(this, "MailerFactory");
|
|
594
|
-
}
|
|
595
|
-
static instance = new FlexibleFactory();
|
|
596
|
-
static register(key, factory) {
|
|
597
|
-
_MailerFactory.instance.register(key, factory);
|
|
598
|
-
}
|
|
599
|
-
static create(key, ...args) {
|
|
600
|
-
return _MailerFactory.instance.create(key, ...args);
|
|
601
|
-
}
|
|
602
|
-
};
|
|
603
|
-
MailerFactory.register("logger", (opt) => {
|
|
602
|
+
import_neko_mailer.MailerProviderFactory.register("logger", (opt) => {
|
|
604
603
|
return new import_neko_mailer.FunctionProvider((mail) => {
|
|
605
604
|
logger().info({
|
|
606
605
|
msg: "Sending email",
|
|
@@ -608,32 +607,20 @@ MailerFactory.register("logger", (opt) => {
|
|
|
608
607
|
});
|
|
609
608
|
});
|
|
610
609
|
});
|
|
611
|
-
|
|
610
|
+
import_neko_mailer.MailerProviderFactory.register("ses", (opt) => {
|
|
612
611
|
return new import_neko_mailer.SESProvider(opt);
|
|
613
612
|
});
|
|
614
|
-
|
|
613
|
+
import_neko_mailer.MailerProviderFactory.register("smtp", (opt) => {
|
|
615
614
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
616
615
|
});
|
|
617
|
-
|
|
616
|
+
import_neko_mailer.MailerProviderFactory.register("memory", (opt) => {
|
|
618
617
|
return new import_neko_mailer.MemoryProvider();
|
|
619
618
|
});
|
|
620
|
-
|
|
621
|
-
static {
|
|
622
|
-
__name(this, "QueueTransportFactory");
|
|
623
|
-
}
|
|
624
|
-
static instance = new FlexibleFactory();
|
|
625
|
-
static register(key, factory) {
|
|
626
|
-
_QueueTransportFactory.instance.register(key, factory);
|
|
627
|
-
}
|
|
628
|
-
static create(key, ...args) {
|
|
629
|
-
return _QueueTransportFactory.instance.create(key, ...args);
|
|
630
|
-
}
|
|
631
|
-
};
|
|
632
|
-
QueueTransportFactory.register("database", (opt) => {
|
|
619
|
+
import_neko_queue2.QueueTransportFactory.register("database", (opt) => {
|
|
633
620
|
let transport = new DatabaseTransport(opt);
|
|
634
621
|
return new import_neko_queue.QueueConnection(transport);
|
|
635
622
|
});
|
|
636
|
-
QueueTransportFactory.register("memory", (opt) => {
|
|
623
|
+
import_neko_queue2.QueueTransportFactory.register("memory", (opt) => {
|
|
637
624
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
638
625
|
return new import_neko_queue.QueueConnection(transport);
|
|
639
626
|
});
|
|
@@ -686,7 +673,10 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
686
673
|
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
687
674
|
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
688
675
|
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
689
|
-
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
676
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
677
|
+
storage_config.provider,
|
|
678
|
+
storage_config.config
|
|
679
|
+
);
|
|
690
680
|
return new import_neko_storage2.Storage(provider);
|
|
691
681
|
});
|
|
692
682
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
@@ -743,7 +733,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
743
733
|
});
|
|
744
734
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
745
735
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
746
|
-
const provider =
|
|
736
|
+
const provider = import_neko_mailer2.MailerProviderFactory.create(
|
|
747
737
|
mailer_config.provider,
|
|
748
738
|
mailer_config.config
|
|
749
739
|
);
|
|
@@ -755,7 +745,10 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
755
745
|
if (!queue_config) {
|
|
756
746
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
757
747
|
}
|
|
758
|
-
const provider = QueueTransportFactory.create(
|
|
748
|
+
const provider = import_neko_queue3.QueueTransportFactory.create(
|
|
749
|
+
queue_config.provider,
|
|
750
|
+
queue_config.config
|
|
751
|
+
);
|
|
759
752
|
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
760
753
|
return rc;
|
|
761
754
|
});
|
|
@@ -482,11 +482,16 @@ __export(queue_exports, {
|
|
|
482
482
|
DatabaseTransport: () => DatabaseTransport
|
|
483
483
|
});
|
|
484
484
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
485
|
+
|
|
486
|
+
// src/helper.mts
|
|
487
|
+
var helper_exports = {};
|
|
488
|
+
__reExport(helper_exports, require("@devbro/neko-helper"));
|
|
489
|
+
|
|
490
|
+
// src/queue.mts
|
|
485
491
|
var DatabaseTransport = class {
|
|
486
492
|
static {
|
|
487
493
|
__name(this, "DatabaseTransport");
|
|
488
494
|
}
|
|
489
|
-
activeIntervals = /* @__PURE__ */ new Set();
|
|
490
495
|
config = {
|
|
491
496
|
queue_table: "queue_messages",
|
|
492
497
|
db_connection: "default",
|
|
@@ -495,14 +500,48 @@ var DatabaseTransport = class {
|
|
|
495
500
|
message_limit: 10
|
|
496
501
|
// messages per each fetch
|
|
497
502
|
};
|
|
498
|
-
|
|
503
|
+
channels = /* @__PURE__ */ new Map();
|
|
504
|
+
messageQueues = [];
|
|
505
|
+
repeater;
|
|
506
|
+
processMessage = /* @__PURE__ */ __name(async () => {
|
|
507
|
+
const conn = db(this.config.db_connection);
|
|
508
|
+
try {
|
|
509
|
+
await conn.connect();
|
|
510
|
+
let q = conn.getQuery();
|
|
511
|
+
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();
|
|
512
|
+
for (let msg of messages) {
|
|
513
|
+
try {
|
|
514
|
+
let callback = this.channels.get(msg.channel);
|
|
515
|
+
await callback(msg.message);
|
|
516
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
517
|
+
status: "processed",
|
|
518
|
+
updated_at: /* @__PURE__ */ new Date(),
|
|
519
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
520
|
+
retried_count: (msg.retried_count || 0) + 1
|
|
521
|
+
});
|
|
522
|
+
} catch (error) {
|
|
523
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
524
|
+
status: "failed",
|
|
525
|
+
last_tried_at: /* @__PURE__ */ new Date(),
|
|
526
|
+
retried_count: (msg.retried_count || 0) + 1,
|
|
527
|
+
process_message: error.message || "Error processing message"
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
} catch (error) {
|
|
532
|
+
logger().error("Error in DatabaseTransport listen interval:", {
|
|
533
|
+
error
|
|
534
|
+
});
|
|
535
|
+
} finally {
|
|
536
|
+
await conn.disconnect();
|
|
537
|
+
}
|
|
538
|
+
}, "processMessage");
|
|
539
|
+
constructor(config3 = {}) {
|
|
499
540
|
this.config = { ...this.config, ...config3 };
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
setMessageLimit(limit) {
|
|
505
|
-
this.config.message_limit = limit;
|
|
541
|
+
this.repeater = (0, helper_exports.createRepeater)(
|
|
542
|
+
this.processMessage,
|
|
543
|
+
this.config.listen_interval * 1e3
|
|
544
|
+
);
|
|
506
545
|
}
|
|
507
546
|
async dispatch(channel, message) {
|
|
508
547
|
const conn = db(this.config.db_connection);
|
|
@@ -520,50 +559,22 @@ var DatabaseTransport = class {
|
|
|
520
559
|
created_at: /* @__PURE__ */ new Date(),
|
|
521
560
|
updated_at: /* @__PURE__ */ new Date(),
|
|
522
561
|
last_tried_at: null,
|
|
523
|
-
process_message: ""
|
|
562
|
+
process_message: "",
|
|
563
|
+
retried_count: 0,
|
|
564
|
+
status: "pending"
|
|
524
565
|
});
|
|
525
566
|
} finally {
|
|
526
567
|
await conn.disconnect();
|
|
527
568
|
}
|
|
528
569
|
}
|
|
529
|
-
async
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
await conn.connect();
|
|
535
|
-
let q = conn.getQuery();
|
|
536
|
-
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();
|
|
537
|
-
for (let msg of messages) {
|
|
538
|
-
try {
|
|
539
|
-
await callback(msg.message);
|
|
540
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
541
|
-
processed: true,
|
|
542
|
-
updated_at: /* @__PURE__ */ new Date()
|
|
543
|
-
});
|
|
544
|
-
} catch (error) {
|
|
545
|
-
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
546
|
-
processed: false,
|
|
547
|
-
last_tried_at: /* @__PURE__ */ new Date(),
|
|
548
|
-
process_message: error.message || "Error processing message"
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
} catch (error) {
|
|
553
|
-
this.activeIntervals.delete(intervalId);
|
|
554
|
-
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
555
|
-
} finally {
|
|
556
|
-
await conn.disconnect();
|
|
557
|
-
}
|
|
558
|
-
}, this.config.listen_interval * 1e3);
|
|
559
|
-
this.activeIntervals.add(intervalId);
|
|
560
|
-
});
|
|
570
|
+
async registerListener(channel, callback) {
|
|
571
|
+
this.channels.set(channel, callback);
|
|
572
|
+
}
|
|
573
|
+
async startListening() {
|
|
574
|
+
this.repeater.start();
|
|
561
575
|
}
|
|
562
576
|
async stopListening() {
|
|
563
|
-
|
|
564
|
-
clearInterval(intervalId);
|
|
565
|
-
}
|
|
566
|
-
this.activeIntervals.clear();
|
|
577
|
+
this.repeater.stop();
|
|
567
578
|
}
|
|
568
579
|
};
|
|
569
580
|
|
|
@@ -586,19 +597,7 @@ var FlexibleFactory = class {
|
|
|
586
597
|
return ctor(...args);
|
|
587
598
|
}
|
|
588
599
|
};
|
|
589
|
-
|
|
590
|
-
static {
|
|
591
|
-
__name(this, "MailerFactory");
|
|
592
|
-
}
|
|
593
|
-
static instance = new FlexibleFactory();
|
|
594
|
-
static register(key, factory) {
|
|
595
|
-
_MailerFactory.instance.register(key, factory);
|
|
596
|
-
}
|
|
597
|
-
static create(key, ...args) {
|
|
598
|
-
return _MailerFactory.instance.create(key, ...args);
|
|
599
|
-
}
|
|
600
|
-
};
|
|
601
|
-
MailerFactory.register("logger", (opt) => {
|
|
600
|
+
import_neko_mailer.MailerProviderFactory.register("logger", (opt) => {
|
|
602
601
|
return new import_neko_mailer.FunctionProvider((mail) => {
|
|
603
602
|
logger().info({
|
|
604
603
|
msg: "Sending email",
|
|
@@ -606,32 +605,20 @@ MailerFactory.register("logger", (opt) => {
|
|
|
606
605
|
});
|
|
607
606
|
});
|
|
608
607
|
});
|
|
609
|
-
|
|
608
|
+
import_neko_mailer.MailerProviderFactory.register("ses", (opt) => {
|
|
610
609
|
return new import_neko_mailer.SESProvider(opt);
|
|
611
610
|
});
|
|
612
|
-
|
|
611
|
+
import_neko_mailer.MailerProviderFactory.register("smtp", (opt) => {
|
|
613
612
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
614
613
|
});
|
|
615
|
-
|
|
614
|
+
import_neko_mailer.MailerProviderFactory.register("memory", (opt) => {
|
|
616
615
|
return new import_neko_mailer.MemoryProvider();
|
|
617
616
|
});
|
|
618
|
-
|
|
619
|
-
static {
|
|
620
|
-
__name(this, "QueueTransportFactory");
|
|
621
|
-
}
|
|
622
|
-
static instance = new FlexibleFactory();
|
|
623
|
-
static register(key, factory) {
|
|
624
|
-
_QueueTransportFactory.instance.register(key, factory);
|
|
625
|
-
}
|
|
626
|
-
static create(key, ...args) {
|
|
627
|
-
return _QueueTransportFactory.instance.create(key, ...args);
|
|
628
|
-
}
|
|
629
|
-
};
|
|
630
|
-
QueueTransportFactory.register("database", (opt) => {
|
|
617
|
+
import_neko_queue2.QueueTransportFactory.register("database", (opt) => {
|
|
631
618
|
let transport = new DatabaseTransport(opt);
|
|
632
619
|
return new import_neko_queue.QueueConnection(transport);
|
|
633
620
|
});
|
|
634
|
-
QueueTransportFactory.register("memory", (opt) => {
|
|
621
|
+
import_neko_queue2.QueueTransportFactory.register("memory", (opt) => {
|
|
635
622
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
636
623
|
return new import_neko_queue.QueueConnection(transport);
|
|
637
624
|
});
|
|
@@ -684,7 +671,10 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
684
671
|
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
685
672
|
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
686
673
|
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
687
|
-
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
674
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
675
|
+
storage_config.provider,
|
|
676
|
+
storage_config.config
|
|
677
|
+
);
|
|
688
678
|
return new import_neko_storage2.Storage(provider);
|
|
689
679
|
});
|
|
690
680
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
@@ -741,7 +731,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
741
731
|
});
|
|
742
732
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
743
733
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
744
|
-
const provider =
|
|
734
|
+
const provider = import_neko_mailer2.MailerProviderFactory.create(
|
|
745
735
|
mailer_config.provider,
|
|
746
736
|
mailer_config.config
|
|
747
737
|
);
|
|
@@ -753,7 +743,10 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
753
743
|
if (!queue_config) {
|
|
754
744
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
755
745
|
}
|
|
756
|
-
const provider = QueueTransportFactory.create(
|
|
746
|
+
const provider = import_neko_queue3.QueueTransportFactory.create(
|
|
747
|
+
queue_config.provider,
|
|
748
|
+
queue_config.config
|
|
749
|
+
);
|
|
757
750
|
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
758
751
|
return rc;
|
|
759
752
|
});
|