@devbro/pashmak 0.1.18 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/console/project/base_project/package.json.tpl +1 -1
- package/dist/app/console/project/base_project/src/app/models/index.ts.tpl +1 -0
- package/dist/app/console/project/base_project/src/config/caches.ts.tpl +7 -0
- package/dist/app/console/project/base_project/src/config/databases.ts.tpl +10 -6
- package/dist/app/console/project/base_project/src/config/default.mts.tpl +35 -0
- package/dist/app/console/project/base_project/src/config/loggers.ts.tpl +11 -7
- package/dist/app/console/project/base_project/src/config/mailer.ts.tpl +21 -1
- package/dist/app/console/project/base_project/src/config/queues.ts.tpl +7 -0
- package/dist/app/console/project/base_project/src/config/storages.ts.tpl +8 -4
- package/dist/app/console/project/base_project/tsconfig.json.tpl +7 -4
- package/dist/app/console/queue/queue_migration.tpl +2 -1
- package/dist/bin/app/console/DefaultCommand.cjs +53 -34
- package/dist/bin/app/console/KeyGenerateCommand.cjs +53 -34
- package/dist/bin/app/console/StartCommand.cjs +55 -36
- package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +53 -34
- package/dist/bin/app/console/generate/index.cjs +53 -34
- package/dist/bin/app/console/index.cjs +54 -36
- package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +53 -34
- package/dist/bin/app/console/migrate/MigrateCommand.cjs +52 -34
- package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +52 -34
- package/dist/bin/app/console/migrate/index.cjs +52 -34
- package/dist/bin/app/console/queue/GenerateQueueMigrateCommand.cjs +53 -34
- package/dist/bin/cache.cjs +53 -34
- package/dist/bin/facades.cjs +52 -34
- package/dist/bin/factories.cjs +58 -39
- package/dist/bin/index.cjs +62 -43
- package/dist/bin/middlewares.cjs +52 -34
- package/dist/bin/queue.cjs +675 -18
- package/dist/facades.d.mts +2 -1
- package/dist/facades.mjs +12 -8
- package/dist/facades.mjs.map +1 -1
- package/dist/factories.d.mts +5 -5
- package/dist/factories.mjs +17 -10
- package/dist/factories.mjs.map +1 -1
- package/dist/queue.d.mts +8 -4
- package/dist/queue.mjs +26 -18
- package/dist/queue.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/app/console/project/base_project/src/app/models/README.md.tpl +0 -1
- package/dist/app/console/project/base_project/src/config/default.ts.tpl +0 -42
|
@@ -458,7 +458,7 @@ var Router = class {
|
|
|
458
458
|
var import_neko_scheduler = require("@devbro/neko-scheduler");
|
|
459
459
|
var import_neko_helper = require("@devbro/neko-helper");
|
|
460
460
|
var import_neko_context2 = require("@devbro/neko-context");
|
|
461
|
-
var
|
|
461
|
+
var import_neko_storage2 = require("@devbro/neko-storage");
|
|
462
462
|
var import_neko_mailer2 = require("@devbro/neko-mailer");
|
|
463
463
|
var import_neko_config = require("@devbro/neko-config");
|
|
464
464
|
var import_clipanion = require("clipanion");
|
|
@@ -482,31 +482,38 @@ __export(queue_exports, {
|
|
|
482
482
|
DatabaseTransport: () => DatabaseTransport
|
|
483
483
|
});
|
|
484
484
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
485
|
-
var import_neko_sql = require("@devbro/neko-sql");
|
|
486
485
|
var DatabaseTransport = class {
|
|
487
|
-
constructor(db_config) {
|
|
488
|
-
this.db_config = db_config;
|
|
489
|
-
}
|
|
490
486
|
static {
|
|
491
487
|
__name(this, "DatabaseTransport");
|
|
492
488
|
}
|
|
493
|
-
listenInterval = 6e4;
|
|
494
|
-
// default to 1 minute
|
|
495
|
-
messageLimit = 100;
|
|
496
|
-
// default to 100 messages per fetch
|
|
497
489
|
activeIntervals = /* @__PURE__ */ new Set();
|
|
490
|
+
config = {
|
|
491
|
+
queue_table: "queue_messages",
|
|
492
|
+
db_connection: "default",
|
|
493
|
+
listen_interval: 60,
|
|
494
|
+
// seconds
|
|
495
|
+
message_limit: 10
|
|
496
|
+
// messages per each fetch
|
|
497
|
+
};
|
|
498
|
+
constructor(config3) {
|
|
499
|
+
this.config = { ...this.config, ...config3 };
|
|
500
|
+
}
|
|
498
501
|
setListenInterval(interval) {
|
|
499
|
-
this.
|
|
502
|
+
this.config.listen_interval = interval;
|
|
500
503
|
}
|
|
501
504
|
setMessageLimit(limit) {
|
|
502
|
-
this.
|
|
505
|
+
this.config.message_limit = limit;
|
|
503
506
|
}
|
|
504
507
|
async dispatch(channel, message) {
|
|
505
|
-
const conn =
|
|
508
|
+
const conn = db(this.config.db_connection);
|
|
506
509
|
try {
|
|
507
510
|
await conn.connect();
|
|
511
|
+
let schema = conn.getSchema();
|
|
512
|
+
if (await schema.tableExists(this.config.queue_table) === false) {
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
508
515
|
let q = conn.getQuery();
|
|
509
|
-
await q.table(
|
|
516
|
+
await q.table(this.config.queue_table).insert({
|
|
510
517
|
channel,
|
|
511
518
|
message,
|
|
512
519
|
processed: false,
|
|
@@ -522,20 +529,20 @@ var DatabaseTransport = class {
|
|
|
522
529
|
async listen(channel, callback) {
|
|
523
530
|
return new Promise(async (resolve, reject) => {
|
|
524
531
|
const intervalId = setInterval(async () => {
|
|
525
|
-
const conn =
|
|
532
|
+
const conn = db(this.config.db_connection);
|
|
526
533
|
try {
|
|
527
534
|
await conn.connect();
|
|
528
535
|
let q = conn.getQuery();
|
|
529
|
-
let messages = await q.table(
|
|
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();
|
|
530
537
|
for (let msg of messages) {
|
|
531
538
|
try {
|
|
532
539
|
await callback(msg.message);
|
|
533
|
-
await q.table(
|
|
540
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
534
541
|
processed: true,
|
|
535
542
|
updated_at: /* @__PURE__ */ new Date()
|
|
536
543
|
});
|
|
537
544
|
} catch (error) {
|
|
538
|
-
await q.table(
|
|
545
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
539
546
|
processed: false,
|
|
540
547
|
last_tried_at: /* @__PURE__ */ new Date(),
|
|
541
548
|
process_message: error.message || "Error processing message"
|
|
@@ -544,11 +551,11 @@ var DatabaseTransport = class {
|
|
|
544
551
|
}
|
|
545
552
|
} catch (error) {
|
|
546
553
|
this.activeIntervals.delete(intervalId);
|
|
547
|
-
|
|
554
|
+
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
548
555
|
} finally {
|
|
549
556
|
await conn.disconnect();
|
|
550
557
|
}
|
|
551
|
-
}, this.
|
|
558
|
+
}, this.config.listen_interval * 1e3);
|
|
552
559
|
this.activeIntervals.add(intervalId);
|
|
553
560
|
});
|
|
554
561
|
}
|
|
@@ -562,6 +569,7 @@ var DatabaseTransport = class {
|
|
|
562
569
|
|
|
563
570
|
// src/factories.mts
|
|
564
571
|
var import_neko_cache = require("@devbro/neko-cache");
|
|
572
|
+
var import_neko_storage = require("@devbro/neko-storage");
|
|
565
573
|
var FlexibleFactory = class {
|
|
566
574
|
static {
|
|
567
575
|
__name(this, "FlexibleFactory");
|
|
@@ -598,32 +606,32 @@ MailerFactory.register("logger", (opt) => {
|
|
|
598
606
|
});
|
|
599
607
|
});
|
|
600
608
|
});
|
|
601
|
-
MailerFactory.register("
|
|
609
|
+
MailerFactory.register("ses", (opt) => {
|
|
602
610
|
return new import_neko_mailer.SESProvider(opt);
|
|
603
611
|
});
|
|
604
|
-
MailerFactory.register("
|
|
612
|
+
MailerFactory.register("smtp", (opt) => {
|
|
605
613
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
606
614
|
});
|
|
607
|
-
MailerFactory.register("
|
|
615
|
+
MailerFactory.register("memory", (opt) => {
|
|
608
616
|
return new import_neko_mailer.MemoryProvider();
|
|
609
617
|
});
|
|
610
|
-
var
|
|
618
|
+
var QueueTransportFactory = class _QueueTransportFactory {
|
|
611
619
|
static {
|
|
612
|
-
__name(this, "
|
|
620
|
+
__name(this, "QueueTransportFactory");
|
|
613
621
|
}
|
|
614
622
|
static instance = new FlexibleFactory();
|
|
615
623
|
static register(key, factory) {
|
|
616
|
-
|
|
624
|
+
_QueueTransportFactory.instance.register(key, factory);
|
|
617
625
|
}
|
|
618
626
|
static create(key, ...args) {
|
|
619
|
-
return
|
|
627
|
+
return _QueueTransportFactory.instance.create(key, ...args);
|
|
620
628
|
}
|
|
621
629
|
};
|
|
622
|
-
|
|
630
|
+
QueueTransportFactory.register("database", (opt) => {
|
|
623
631
|
let transport = new DatabaseTransport(opt);
|
|
624
632
|
return new import_neko_queue.QueueConnection(transport);
|
|
625
633
|
});
|
|
626
|
-
|
|
634
|
+
QueueTransportFactory.register("memory", (opt) => {
|
|
627
635
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
628
636
|
return new import_neko_queue.QueueConnection(transport);
|
|
629
637
|
});
|
|
@@ -651,9 +659,16 @@ CacheProviderFactory.register("file", (opt) => {
|
|
|
651
659
|
CacheProviderFactory.register("disabled", (opt) => {
|
|
652
660
|
return new import_neko_cache.DisabledCacheProvider();
|
|
653
661
|
});
|
|
662
|
+
import_neko_storage.StorageProviderFactory.register("local", (opt) => {
|
|
663
|
+
return new import_neko_storage.LocalStorageProvider(opt);
|
|
664
|
+
});
|
|
665
|
+
import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
|
|
666
|
+
return new import_neko_storage.AWSS3StorageProvider(opt);
|
|
667
|
+
});
|
|
654
668
|
|
|
655
669
|
// src/facades.mts
|
|
656
670
|
var import_neko_cache2 = require("@devbro/neko-cache");
|
|
671
|
+
var import_neko_queue3 = require("@devbro/neko-queue");
|
|
657
672
|
var router = (0, import_neko_helper.createSingleton)(() => new Router());
|
|
658
673
|
var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
659
674
|
const rc = new import_neko_scheduler.Scheduler();
|
|
@@ -666,9 +681,12 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
666
681
|
});
|
|
667
682
|
return rc;
|
|
668
683
|
});
|
|
669
|
-
var
|
|
670
|
-
|
|
671
|
-
);
|
|
684
|
+
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
685
|
+
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
686
|
+
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
687
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
|
|
688
|
+
return new import_neko_storage2.Storage(provider);
|
|
689
|
+
});
|
|
672
690
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
673
691
|
const [node, app, ...args] = process.argv;
|
|
674
692
|
return new import_clipanion.Cli({
|
|
@@ -723,7 +741,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
723
741
|
});
|
|
724
742
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
725
743
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
726
|
-
|
|
744
|
+
const provider = MailerFactory.create(
|
|
727
745
|
mailer_config.provider,
|
|
728
746
|
mailer_config.config
|
|
729
747
|
);
|
|
@@ -735,7 +753,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
735
753
|
if (!queue_config) {
|
|
736
754
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
737
755
|
}
|
|
738
|
-
const
|
|
756
|
+
const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
|
|
757
|
+
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
739
758
|
return rc;
|
|
740
759
|
});
|
|
741
760
|
var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
@@ -744,14 +763,14 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
744
763
|
throw new Error(`Cache configuration for '${label}' not found`);
|
|
745
764
|
}
|
|
746
765
|
const provider = CacheProviderFactory.create(
|
|
747
|
-
cache_config.
|
|
766
|
+
cache_config.provider,
|
|
748
767
|
cache_config.config
|
|
749
768
|
);
|
|
750
769
|
return new import_neko_cache2.Cache(provider);
|
|
751
770
|
});
|
|
752
771
|
|
|
753
772
|
// src/app/console/StartCommand.mts
|
|
754
|
-
var
|
|
773
|
+
var import_neko_sql = require("@devbro/neko-sql");
|
|
755
774
|
var StartCommand = class extends import_clipanion2.Command {
|
|
756
775
|
static {
|
|
757
776
|
__name(this, "StartCommand");
|
|
@@ -771,7 +790,7 @@ var StartCommand = class extends import_clipanion2.Command {
|
|
|
771
790
|
}
|
|
772
791
|
logger().info(`Starting Server
|
|
773
792
|
`);
|
|
774
|
-
|
|
793
|
+
import_neko_sql.PostgresqlConnection.defaults.idleTimeoutMillis = 1e4;
|
|
775
794
|
if (this.scheduler || this.all) {
|
|
776
795
|
logger().info(`starting scheduler
|
|
777
796
|
`);
|
|
@@ -456,7 +456,7 @@ var Router = class {
|
|
|
456
456
|
var import_neko_scheduler = require("@devbro/neko-scheduler");
|
|
457
457
|
var import_neko_helper = require("@devbro/neko-helper");
|
|
458
458
|
var import_neko_context2 = require("@devbro/neko-context");
|
|
459
|
-
var
|
|
459
|
+
var import_neko_storage2 = require("@devbro/neko-storage");
|
|
460
460
|
var import_neko_mailer2 = require("@devbro/neko-mailer");
|
|
461
461
|
var import_neko_config = require("@devbro/neko-config");
|
|
462
462
|
var import_clipanion = require("clipanion");
|
|
@@ -480,31 +480,38 @@ __export(queue_exports, {
|
|
|
480
480
|
DatabaseTransport: () => DatabaseTransport
|
|
481
481
|
});
|
|
482
482
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
483
|
-
var import_neko_sql = require("@devbro/neko-sql");
|
|
484
483
|
var DatabaseTransport = class {
|
|
485
|
-
constructor(db_config) {
|
|
486
|
-
this.db_config = db_config;
|
|
487
|
-
}
|
|
488
484
|
static {
|
|
489
485
|
__name(this, "DatabaseTransport");
|
|
490
486
|
}
|
|
491
|
-
listenInterval = 6e4;
|
|
492
|
-
// default to 1 minute
|
|
493
|
-
messageLimit = 100;
|
|
494
|
-
// default to 100 messages per fetch
|
|
495
487
|
activeIntervals = /* @__PURE__ */ new Set();
|
|
488
|
+
config = {
|
|
489
|
+
queue_table: "queue_messages",
|
|
490
|
+
db_connection: "default",
|
|
491
|
+
listen_interval: 60,
|
|
492
|
+
// seconds
|
|
493
|
+
message_limit: 10
|
|
494
|
+
// messages per each fetch
|
|
495
|
+
};
|
|
496
|
+
constructor(config3) {
|
|
497
|
+
this.config = { ...this.config, ...config3 };
|
|
498
|
+
}
|
|
496
499
|
setListenInterval(interval) {
|
|
497
|
-
this.
|
|
500
|
+
this.config.listen_interval = interval;
|
|
498
501
|
}
|
|
499
502
|
setMessageLimit(limit) {
|
|
500
|
-
this.
|
|
503
|
+
this.config.message_limit = limit;
|
|
501
504
|
}
|
|
502
505
|
async dispatch(channel, message) {
|
|
503
|
-
const conn =
|
|
506
|
+
const conn = db(this.config.db_connection);
|
|
504
507
|
try {
|
|
505
508
|
await conn.connect();
|
|
509
|
+
let schema = conn.getSchema();
|
|
510
|
+
if (await schema.tableExists(this.config.queue_table) === false) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
506
513
|
let q = conn.getQuery();
|
|
507
|
-
await q.table(
|
|
514
|
+
await q.table(this.config.queue_table).insert({
|
|
508
515
|
channel,
|
|
509
516
|
message,
|
|
510
517
|
processed: false,
|
|
@@ -520,20 +527,20 @@ var DatabaseTransport = class {
|
|
|
520
527
|
async listen(channel, callback) {
|
|
521
528
|
return new Promise(async (resolve, reject) => {
|
|
522
529
|
const intervalId = setInterval(async () => {
|
|
523
|
-
const conn =
|
|
530
|
+
const conn = db(this.config.db_connection);
|
|
524
531
|
try {
|
|
525
532
|
await conn.connect();
|
|
526
533
|
let q = conn.getQuery();
|
|
527
|
-
let messages = await q.table(
|
|
534
|
+
let messages = await q.table(this.config.queue_table).whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.config.message_limit).orderBy("last_tried_at", "asc").get();
|
|
528
535
|
for (let msg of messages) {
|
|
529
536
|
try {
|
|
530
537
|
await callback(msg.message);
|
|
531
|
-
await q.table(
|
|
538
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
532
539
|
processed: true,
|
|
533
540
|
updated_at: /* @__PURE__ */ new Date()
|
|
534
541
|
});
|
|
535
542
|
} catch (error) {
|
|
536
|
-
await q.table(
|
|
543
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
537
544
|
processed: false,
|
|
538
545
|
last_tried_at: /* @__PURE__ */ new Date(),
|
|
539
546
|
process_message: error.message || "Error processing message"
|
|
@@ -542,11 +549,11 @@ var DatabaseTransport = class {
|
|
|
542
549
|
}
|
|
543
550
|
} catch (error) {
|
|
544
551
|
this.activeIntervals.delete(intervalId);
|
|
545
|
-
|
|
552
|
+
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
546
553
|
} finally {
|
|
547
554
|
await conn.disconnect();
|
|
548
555
|
}
|
|
549
|
-
}, this.
|
|
556
|
+
}, this.config.listen_interval * 1e3);
|
|
550
557
|
this.activeIntervals.add(intervalId);
|
|
551
558
|
});
|
|
552
559
|
}
|
|
@@ -560,6 +567,7 @@ var DatabaseTransport = class {
|
|
|
560
567
|
|
|
561
568
|
// src/factories.mts
|
|
562
569
|
var import_neko_cache = require("@devbro/neko-cache");
|
|
570
|
+
var import_neko_storage = require("@devbro/neko-storage");
|
|
563
571
|
var FlexibleFactory = class {
|
|
564
572
|
static {
|
|
565
573
|
__name(this, "FlexibleFactory");
|
|
@@ -596,32 +604,32 @@ MailerFactory.register("logger", (opt) => {
|
|
|
596
604
|
});
|
|
597
605
|
});
|
|
598
606
|
});
|
|
599
|
-
MailerFactory.register("
|
|
607
|
+
MailerFactory.register("ses", (opt) => {
|
|
600
608
|
return new import_neko_mailer.SESProvider(opt);
|
|
601
609
|
});
|
|
602
|
-
MailerFactory.register("
|
|
610
|
+
MailerFactory.register("smtp", (opt) => {
|
|
603
611
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
604
612
|
});
|
|
605
|
-
MailerFactory.register("
|
|
613
|
+
MailerFactory.register("memory", (opt) => {
|
|
606
614
|
return new import_neko_mailer.MemoryProvider();
|
|
607
615
|
});
|
|
608
|
-
var
|
|
616
|
+
var QueueTransportFactory = class _QueueTransportFactory {
|
|
609
617
|
static {
|
|
610
|
-
__name(this, "
|
|
618
|
+
__name(this, "QueueTransportFactory");
|
|
611
619
|
}
|
|
612
620
|
static instance = new FlexibleFactory();
|
|
613
621
|
static register(key, factory) {
|
|
614
|
-
|
|
622
|
+
_QueueTransportFactory.instance.register(key, factory);
|
|
615
623
|
}
|
|
616
624
|
static create(key, ...args) {
|
|
617
|
-
return
|
|
625
|
+
return _QueueTransportFactory.instance.create(key, ...args);
|
|
618
626
|
}
|
|
619
627
|
};
|
|
620
|
-
|
|
628
|
+
QueueTransportFactory.register("database", (opt) => {
|
|
621
629
|
let transport = new DatabaseTransport(opt);
|
|
622
630
|
return new import_neko_queue.QueueConnection(transport);
|
|
623
631
|
});
|
|
624
|
-
|
|
632
|
+
QueueTransportFactory.register("memory", (opt) => {
|
|
625
633
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
626
634
|
return new import_neko_queue.QueueConnection(transport);
|
|
627
635
|
});
|
|
@@ -649,9 +657,16 @@ CacheProviderFactory.register("file", (opt) => {
|
|
|
649
657
|
CacheProviderFactory.register("disabled", (opt) => {
|
|
650
658
|
return new import_neko_cache.DisabledCacheProvider();
|
|
651
659
|
});
|
|
660
|
+
import_neko_storage.StorageProviderFactory.register("local", (opt) => {
|
|
661
|
+
return new import_neko_storage.LocalStorageProvider(opt);
|
|
662
|
+
});
|
|
663
|
+
import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
|
|
664
|
+
return new import_neko_storage.AWSS3StorageProvider(opt);
|
|
665
|
+
});
|
|
652
666
|
|
|
653
667
|
// src/facades.mts
|
|
654
668
|
var import_neko_cache2 = require("@devbro/neko-cache");
|
|
669
|
+
var import_neko_queue3 = require("@devbro/neko-queue");
|
|
655
670
|
var router = (0, import_neko_helper.createSingleton)(() => new Router());
|
|
656
671
|
var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
657
672
|
const rc = new import_neko_scheduler.Scheduler();
|
|
@@ -664,9 +679,12 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
664
679
|
});
|
|
665
680
|
return rc;
|
|
666
681
|
});
|
|
667
|
-
var
|
|
668
|
-
|
|
669
|
-
);
|
|
682
|
+
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
683
|
+
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
684
|
+
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
685
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
|
|
686
|
+
return new import_neko_storage2.Storage(provider);
|
|
687
|
+
});
|
|
670
688
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
671
689
|
const [node, app, ...args] = process.argv;
|
|
672
690
|
return new import_clipanion.Cli({
|
|
@@ -721,7 +739,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
721
739
|
});
|
|
722
740
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
723
741
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
724
|
-
|
|
742
|
+
const provider = MailerFactory.create(
|
|
725
743
|
mailer_config.provider,
|
|
726
744
|
mailer_config.config
|
|
727
745
|
);
|
|
@@ -733,7 +751,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
733
751
|
if (!queue_config) {
|
|
734
752
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
735
753
|
}
|
|
736
|
-
const
|
|
754
|
+
const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
|
|
755
|
+
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
737
756
|
return rc;
|
|
738
757
|
});
|
|
739
758
|
var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
@@ -742,7 +761,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
742
761
|
throw new Error(`Cache configuration for '${label}' not found`);
|
|
743
762
|
}
|
|
744
763
|
const provider = CacheProviderFactory.create(
|
|
745
|
-
cache_config.
|
|
764
|
+
cache_config.provider,
|
|
746
765
|
cache_config.config
|
|
747
766
|
);
|
|
748
767
|
return new import_neko_cache2.Cache(provider);
|
|
@@ -456,7 +456,7 @@ var Router = class {
|
|
|
456
456
|
var import_neko_scheduler = require("@devbro/neko-scheduler");
|
|
457
457
|
var import_neko_helper = require("@devbro/neko-helper");
|
|
458
458
|
var import_neko_context2 = require("@devbro/neko-context");
|
|
459
|
-
var
|
|
459
|
+
var import_neko_storage2 = require("@devbro/neko-storage");
|
|
460
460
|
var import_neko_mailer2 = require("@devbro/neko-mailer");
|
|
461
461
|
var import_neko_config = require("@devbro/neko-config");
|
|
462
462
|
var import_clipanion = require("clipanion");
|
|
@@ -480,31 +480,38 @@ __export(queue_exports, {
|
|
|
480
480
|
DatabaseTransport: () => DatabaseTransport
|
|
481
481
|
});
|
|
482
482
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
483
|
-
var import_neko_sql = require("@devbro/neko-sql");
|
|
484
483
|
var DatabaseTransport = class {
|
|
485
|
-
constructor(db_config) {
|
|
486
|
-
this.db_config = db_config;
|
|
487
|
-
}
|
|
488
484
|
static {
|
|
489
485
|
__name(this, "DatabaseTransport");
|
|
490
486
|
}
|
|
491
|
-
listenInterval = 6e4;
|
|
492
|
-
// default to 1 minute
|
|
493
|
-
messageLimit = 100;
|
|
494
|
-
// default to 100 messages per fetch
|
|
495
487
|
activeIntervals = /* @__PURE__ */ new Set();
|
|
488
|
+
config = {
|
|
489
|
+
queue_table: "queue_messages",
|
|
490
|
+
db_connection: "default",
|
|
491
|
+
listen_interval: 60,
|
|
492
|
+
// seconds
|
|
493
|
+
message_limit: 10
|
|
494
|
+
// messages per each fetch
|
|
495
|
+
};
|
|
496
|
+
constructor(config3) {
|
|
497
|
+
this.config = { ...this.config, ...config3 };
|
|
498
|
+
}
|
|
496
499
|
setListenInterval(interval) {
|
|
497
|
-
this.
|
|
500
|
+
this.config.listen_interval = interval;
|
|
498
501
|
}
|
|
499
502
|
setMessageLimit(limit) {
|
|
500
|
-
this.
|
|
503
|
+
this.config.message_limit = limit;
|
|
501
504
|
}
|
|
502
505
|
async dispatch(channel, message) {
|
|
503
|
-
const conn =
|
|
506
|
+
const conn = db(this.config.db_connection);
|
|
504
507
|
try {
|
|
505
508
|
await conn.connect();
|
|
509
|
+
let schema = conn.getSchema();
|
|
510
|
+
if (await schema.tableExists(this.config.queue_table) === false) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
506
513
|
let q = conn.getQuery();
|
|
507
|
-
await q.table(
|
|
514
|
+
await q.table(this.config.queue_table).insert({
|
|
508
515
|
channel,
|
|
509
516
|
message,
|
|
510
517
|
processed: false,
|
|
@@ -520,20 +527,20 @@ var DatabaseTransport = class {
|
|
|
520
527
|
async listen(channel, callback) {
|
|
521
528
|
return new Promise(async (resolve, reject) => {
|
|
522
529
|
const intervalId = setInterval(async () => {
|
|
523
|
-
const conn =
|
|
530
|
+
const conn = db(this.config.db_connection);
|
|
524
531
|
try {
|
|
525
532
|
await conn.connect();
|
|
526
533
|
let q = conn.getQuery();
|
|
527
|
-
let messages = await q.table(
|
|
534
|
+
let messages = await q.table(this.config.queue_table).whereOp("channel", "=", channel).whereOp("processed", "=", false).limit(this.config.message_limit).orderBy("last_tried_at", "asc").get();
|
|
528
535
|
for (let msg of messages) {
|
|
529
536
|
try {
|
|
530
537
|
await callback(msg.message);
|
|
531
|
-
await q.table(
|
|
538
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
532
539
|
processed: true,
|
|
533
540
|
updated_at: /* @__PURE__ */ new Date()
|
|
534
541
|
});
|
|
535
542
|
} catch (error) {
|
|
536
|
-
await q.table(
|
|
543
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
537
544
|
processed: false,
|
|
538
545
|
last_tried_at: /* @__PURE__ */ new Date(),
|
|
539
546
|
process_message: error.message || "Error processing message"
|
|
@@ -542,11 +549,11 @@ var DatabaseTransport = class {
|
|
|
542
549
|
}
|
|
543
550
|
} catch (error) {
|
|
544
551
|
this.activeIntervals.delete(intervalId);
|
|
545
|
-
|
|
552
|
+
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
546
553
|
} finally {
|
|
547
554
|
await conn.disconnect();
|
|
548
555
|
}
|
|
549
|
-
}, this.
|
|
556
|
+
}, this.config.listen_interval * 1e3);
|
|
550
557
|
this.activeIntervals.add(intervalId);
|
|
551
558
|
});
|
|
552
559
|
}
|
|
@@ -560,6 +567,7 @@ var DatabaseTransport = class {
|
|
|
560
567
|
|
|
561
568
|
// src/factories.mts
|
|
562
569
|
var import_neko_cache = require("@devbro/neko-cache");
|
|
570
|
+
var import_neko_storage = require("@devbro/neko-storage");
|
|
563
571
|
var FlexibleFactory = class {
|
|
564
572
|
static {
|
|
565
573
|
__name(this, "FlexibleFactory");
|
|
@@ -596,32 +604,32 @@ MailerFactory.register("logger", (opt) => {
|
|
|
596
604
|
});
|
|
597
605
|
});
|
|
598
606
|
});
|
|
599
|
-
MailerFactory.register("
|
|
607
|
+
MailerFactory.register("ses", (opt) => {
|
|
600
608
|
return new import_neko_mailer.SESProvider(opt);
|
|
601
609
|
});
|
|
602
|
-
MailerFactory.register("
|
|
610
|
+
MailerFactory.register("smtp", (opt) => {
|
|
603
611
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
604
612
|
});
|
|
605
|
-
MailerFactory.register("
|
|
613
|
+
MailerFactory.register("memory", (opt) => {
|
|
606
614
|
return new import_neko_mailer.MemoryProvider();
|
|
607
615
|
});
|
|
608
|
-
var
|
|
616
|
+
var QueueTransportFactory = class _QueueTransportFactory {
|
|
609
617
|
static {
|
|
610
|
-
__name(this, "
|
|
618
|
+
__name(this, "QueueTransportFactory");
|
|
611
619
|
}
|
|
612
620
|
static instance = new FlexibleFactory();
|
|
613
621
|
static register(key, factory) {
|
|
614
|
-
|
|
622
|
+
_QueueTransportFactory.instance.register(key, factory);
|
|
615
623
|
}
|
|
616
624
|
static create(key, ...args) {
|
|
617
|
-
return
|
|
625
|
+
return _QueueTransportFactory.instance.create(key, ...args);
|
|
618
626
|
}
|
|
619
627
|
};
|
|
620
|
-
|
|
628
|
+
QueueTransportFactory.register("database", (opt) => {
|
|
621
629
|
let transport = new DatabaseTransport(opt);
|
|
622
630
|
return new import_neko_queue.QueueConnection(transport);
|
|
623
631
|
});
|
|
624
|
-
|
|
632
|
+
QueueTransportFactory.register("memory", (opt) => {
|
|
625
633
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
626
634
|
return new import_neko_queue.QueueConnection(transport);
|
|
627
635
|
});
|
|
@@ -649,9 +657,16 @@ CacheProviderFactory.register("file", (opt) => {
|
|
|
649
657
|
CacheProviderFactory.register("disabled", (opt) => {
|
|
650
658
|
return new import_neko_cache.DisabledCacheProvider();
|
|
651
659
|
});
|
|
660
|
+
import_neko_storage.StorageProviderFactory.register("local", (opt) => {
|
|
661
|
+
return new import_neko_storage.LocalStorageProvider(opt);
|
|
662
|
+
});
|
|
663
|
+
import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
|
|
664
|
+
return new import_neko_storage.AWSS3StorageProvider(opt);
|
|
665
|
+
});
|
|
652
666
|
|
|
653
667
|
// src/facades.mts
|
|
654
668
|
var import_neko_cache2 = require("@devbro/neko-cache");
|
|
669
|
+
var import_neko_queue3 = require("@devbro/neko-queue");
|
|
655
670
|
var router = (0, import_neko_helper.createSingleton)(() => new Router());
|
|
656
671
|
var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
657
672
|
const rc = new import_neko_scheduler.Scheduler();
|
|
@@ -664,9 +679,12 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
664
679
|
});
|
|
665
680
|
return rc;
|
|
666
681
|
});
|
|
667
|
-
var
|
|
668
|
-
|
|
669
|
-
);
|
|
682
|
+
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
683
|
+
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
684
|
+
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
685
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
|
|
686
|
+
return new import_neko_storage2.Storage(provider);
|
|
687
|
+
});
|
|
670
688
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
671
689
|
const [node, app, ...args] = process.argv;
|
|
672
690
|
return new import_clipanion.Cli({
|
|
@@ -721,7 +739,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
721
739
|
});
|
|
722
740
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
723
741
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
724
|
-
|
|
742
|
+
const provider = MailerFactory.create(
|
|
725
743
|
mailer_config.provider,
|
|
726
744
|
mailer_config.config
|
|
727
745
|
);
|
|
@@ -733,7 +751,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
733
751
|
if (!queue_config) {
|
|
734
752
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
735
753
|
}
|
|
736
|
-
const
|
|
754
|
+
const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
|
|
755
|
+
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
737
756
|
return rc;
|
|
738
757
|
});
|
|
739
758
|
var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
@@ -742,7 +761,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
742
761
|
throw new Error(`Cache configuration for '${label}' not found`);
|
|
743
762
|
}
|
|
744
763
|
const provider = CacheProviderFactory.create(
|
|
745
|
-
cache_config.
|
|
764
|
+
cache_config.provider,
|
|
746
765
|
cache_config.config
|
|
747
766
|
);
|
|
748
767
|
return new import_neko_cache2.Cache(provider);
|