@devbro/pashmak 0.1.18 → 0.1.20
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
package/dist/bin/cache.cjs
CHANGED
|
@@ -457,7 +457,7 @@ var Router = class {
|
|
|
457
457
|
var import_neko_scheduler = require("@devbro/neko-scheduler");
|
|
458
458
|
var import_neko_helper = require("@devbro/neko-helper");
|
|
459
459
|
var import_neko_context2 = require("@devbro/neko-context");
|
|
460
|
-
var
|
|
460
|
+
var import_neko_storage2 = require("@devbro/neko-storage");
|
|
461
461
|
var import_neko_mailer2 = require("@devbro/neko-mailer");
|
|
462
462
|
var import_neko_config = require("@devbro/neko-config");
|
|
463
463
|
var import_clipanion = require("clipanion");
|
|
@@ -481,31 +481,38 @@ __export(queue_exports, {
|
|
|
481
481
|
DatabaseTransport: () => DatabaseTransport
|
|
482
482
|
});
|
|
483
483
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
484
|
-
var import_neko_sql = require("@devbro/neko-sql");
|
|
485
484
|
var DatabaseTransport = class {
|
|
486
|
-
constructor(db_config) {
|
|
487
|
-
this.db_config = db_config;
|
|
488
|
-
}
|
|
489
485
|
static {
|
|
490
486
|
__name(this, "DatabaseTransport");
|
|
491
487
|
}
|
|
492
|
-
listenInterval = 6e4;
|
|
493
|
-
// default to 1 minute
|
|
494
|
-
messageLimit = 100;
|
|
495
|
-
// default to 100 messages per fetch
|
|
496
488
|
activeIntervals = /* @__PURE__ */ new Set();
|
|
489
|
+
config = {
|
|
490
|
+
queue_table: "queue_messages",
|
|
491
|
+
db_connection: "default",
|
|
492
|
+
listen_interval: 60,
|
|
493
|
+
// seconds
|
|
494
|
+
message_limit: 10
|
|
495
|
+
// messages per each fetch
|
|
496
|
+
};
|
|
497
|
+
constructor(config2) {
|
|
498
|
+
this.config = { ...this.config, ...config2 };
|
|
499
|
+
}
|
|
497
500
|
setListenInterval(interval) {
|
|
498
|
-
this.
|
|
501
|
+
this.config.listen_interval = interval;
|
|
499
502
|
}
|
|
500
503
|
setMessageLimit(limit) {
|
|
501
|
-
this.
|
|
504
|
+
this.config.message_limit = limit;
|
|
502
505
|
}
|
|
503
506
|
async dispatch(channel, message) {
|
|
504
|
-
const conn =
|
|
507
|
+
const conn = db(this.config.db_connection);
|
|
505
508
|
try {
|
|
506
509
|
await conn.connect();
|
|
510
|
+
let schema = conn.getSchema();
|
|
511
|
+
if (await schema.tableExists(this.config.queue_table) === false) {
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
507
514
|
let q = conn.getQuery();
|
|
508
|
-
await q.table(
|
|
515
|
+
await q.table(this.config.queue_table).insert({
|
|
509
516
|
channel,
|
|
510
517
|
message,
|
|
511
518
|
processed: false,
|
|
@@ -521,20 +528,20 @@ var DatabaseTransport = class {
|
|
|
521
528
|
async listen(channel, callback) {
|
|
522
529
|
return new Promise(async (resolve, reject) => {
|
|
523
530
|
const intervalId = setInterval(async () => {
|
|
524
|
-
const conn =
|
|
531
|
+
const conn = db(this.config.db_connection);
|
|
525
532
|
try {
|
|
526
533
|
await conn.connect();
|
|
527
534
|
let q = conn.getQuery();
|
|
528
|
-
let messages = await q.table(
|
|
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();
|
|
529
536
|
for (let msg of messages) {
|
|
530
537
|
try {
|
|
531
538
|
await callback(msg.message);
|
|
532
|
-
await q.table(
|
|
539
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
533
540
|
processed: true,
|
|
534
541
|
updated_at: /* @__PURE__ */ new Date()
|
|
535
542
|
});
|
|
536
543
|
} catch (error) {
|
|
537
|
-
await q.table(
|
|
544
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
538
545
|
processed: false,
|
|
539
546
|
last_tried_at: /* @__PURE__ */ new Date(),
|
|
540
547
|
process_message: error.message || "Error processing message"
|
|
@@ -543,11 +550,11 @@ var DatabaseTransport = class {
|
|
|
543
550
|
}
|
|
544
551
|
} catch (error) {
|
|
545
552
|
this.activeIntervals.delete(intervalId);
|
|
546
|
-
|
|
553
|
+
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
547
554
|
} finally {
|
|
548
555
|
await conn.disconnect();
|
|
549
556
|
}
|
|
550
|
-
}, this.
|
|
557
|
+
}, this.config.listen_interval * 1e3);
|
|
551
558
|
this.activeIntervals.add(intervalId);
|
|
552
559
|
});
|
|
553
560
|
}
|
|
@@ -561,6 +568,7 @@ var DatabaseTransport = class {
|
|
|
561
568
|
|
|
562
569
|
// src/factories.mts
|
|
563
570
|
var import_neko_cache = require("@devbro/neko-cache");
|
|
571
|
+
var import_neko_storage = require("@devbro/neko-storage");
|
|
564
572
|
var FlexibleFactory = class {
|
|
565
573
|
static {
|
|
566
574
|
__name(this, "FlexibleFactory");
|
|
@@ -597,32 +605,32 @@ MailerFactory.register("logger", (opt) => {
|
|
|
597
605
|
});
|
|
598
606
|
});
|
|
599
607
|
});
|
|
600
|
-
MailerFactory.register("
|
|
608
|
+
MailerFactory.register("ses", (opt) => {
|
|
601
609
|
return new import_neko_mailer.SESProvider(opt);
|
|
602
610
|
});
|
|
603
|
-
MailerFactory.register("
|
|
611
|
+
MailerFactory.register("smtp", (opt) => {
|
|
604
612
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
605
613
|
});
|
|
606
|
-
MailerFactory.register("
|
|
614
|
+
MailerFactory.register("memory", (opt) => {
|
|
607
615
|
return new import_neko_mailer.MemoryProvider();
|
|
608
616
|
});
|
|
609
|
-
var
|
|
617
|
+
var QueueTransportFactory = class _QueueTransportFactory {
|
|
610
618
|
static {
|
|
611
|
-
__name(this, "
|
|
619
|
+
__name(this, "QueueTransportFactory");
|
|
612
620
|
}
|
|
613
621
|
static instance = new FlexibleFactory();
|
|
614
622
|
static register(key, factory) {
|
|
615
|
-
|
|
623
|
+
_QueueTransportFactory.instance.register(key, factory);
|
|
616
624
|
}
|
|
617
625
|
static create(key, ...args) {
|
|
618
|
-
return
|
|
626
|
+
return _QueueTransportFactory.instance.create(key, ...args);
|
|
619
627
|
}
|
|
620
628
|
};
|
|
621
|
-
|
|
629
|
+
QueueTransportFactory.register("database", (opt) => {
|
|
622
630
|
let transport = new DatabaseTransport(opt);
|
|
623
631
|
return new import_neko_queue.QueueConnection(transport);
|
|
624
632
|
});
|
|
625
|
-
|
|
633
|
+
QueueTransportFactory.register("memory", (opt) => {
|
|
626
634
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
627
635
|
return new import_neko_queue.QueueConnection(transport);
|
|
628
636
|
});
|
|
@@ -650,9 +658,16 @@ CacheProviderFactory.register("file", (opt) => {
|
|
|
650
658
|
CacheProviderFactory.register("disabled", (opt) => {
|
|
651
659
|
return new import_neko_cache.DisabledCacheProvider();
|
|
652
660
|
});
|
|
661
|
+
import_neko_storage.StorageProviderFactory.register("local", (opt) => {
|
|
662
|
+
return new import_neko_storage.LocalStorageProvider(opt);
|
|
663
|
+
});
|
|
664
|
+
import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
|
|
665
|
+
return new import_neko_storage.AWSS3StorageProvider(opt);
|
|
666
|
+
});
|
|
653
667
|
|
|
654
668
|
// src/facades.mts
|
|
655
669
|
var import_neko_cache2 = require("@devbro/neko-cache");
|
|
670
|
+
var import_neko_queue3 = require("@devbro/neko-queue");
|
|
656
671
|
var router = (0, import_neko_helper.createSingleton)(() => new Router());
|
|
657
672
|
var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
658
673
|
const rc = new import_neko_scheduler.Scheduler();
|
|
@@ -665,9 +680,12 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
665
680
|
});
|
|
666
681
|
return rc;
|
|
667
682
|
});
|
|
668
|
-
var
|
|
669
|
-
|
|
670
|
-
);
|
|
683
|
+
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
684
|
+
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
685
|
+
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
686
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
|
|
687
|
+
return new import_neko_storage2.Storage(provider);
|
|
688
|
+
});
|
|
671
689
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
672
690
|
const [node, app, ...args] = process.argv;
|
|
673
691
|
return new import_clipanion.Cli({
|
|
@@ -722,7 +740,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
722
740
|
});
|
|
723
741
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
724
742
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
725
|
-
|
|
743
|
+
const provider = MailerFactory.create(
|
|
726
744
|
mailer_config.provider,
|
|
727
745
|
mailer_config.config
|
|
728
746
|
);
|
|
@@ -734,7 +752,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
734
752
|
if (!queue_config) {
|
|
735
753
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
736
754
|
}
|
|
737
|
-
const
|
|
755
|
+
const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
|
|
756
|
+
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
738
757
|
return rc;
|
|
739
758
|
});
|
|
740
759
|
var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
@@ -743,7 +762,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
743
762
|
throw new Error(`Cache configuration for '${label}' not found`);
|
|
744
763
|
}
|
|
745
764
|
const provider = CacheProviderFactory.create(
|
|
746
|
-
cache_config.
|
|
765
|
+
cache_config.provider,
|
|
747
766
|
cache_config.config
|
|
748
767
|
);
|
|
749
768
|
return new import_neko_cache2.Cache(provider);
|
package/dist/bin/facades.cjs
CHANGED
|
@@ -465,7 +465,7 @@ var Router = class {
|
|
|
465
465
|
var import_neko_scheduler = require("@devbro/neko-scheduler");
|
|
466
466
|
var import_neko_helper = require("@devbro/neko-helper");
|
|
467
467
|
var import_neko_context2 = require("@devbro/neko-context");
|
|
468
|
-
var
|
|
468
|
+
var import_neko_storage2 = require("@devbro/neko-storage");
|
|
469
469
|
var import_neko_mailer2 = require("@devbro/neko-mailer");
|
|
470
470
|
var import_neko_config = require("@devbro/neko-config");
|
|
471
471
|
var import_clipanion = require("clipanion");
|
|
@@ -489,31 +489,38 @@ __export(queue_exports, {
|
|
|
489
489
|
DatabaseTransport: () => DatabaseTransport
|
|
490
490
|
});
|
|
491
491
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
492
|
-
var import_neko_sql = require("@devbro/neko-sql");
|
|
493
492
|
var DatabaseTransport = class {
|
|
494
|
-
constructor(db_config) {
|
|
495
|
-
this.db_config = db_config;
|
|
496
|
-
}
|
|
497
493
|
static {
|
|
498
494
|
__name(this, "DatabaseTransport");
|
|
499
495
|
}
|
|
500
|
-
listenInterval = 6e4;
|
|
501
|
-
// default to 1 minute
|
|
502
|
-
messageLimit = 100;
|
|
503
|
-
// default to 100 messages per fetch
|
|
504
496
|
activeIntervals = /* @__PURE__ */ new Set();
|
|
497
|
+
config = {
|
|
498
|
+
queue_table: "queue_messages",
|
|
499
|
+
db_connection: "default",
|
|
500
|
+
listen_interval: 60,
|
|
501
|
+
// seconds
|
|
502
|
+
message_limit: 10
|
|
503
|
+
// messages per each fetch
|
|
504
|
+
};
|
|
505
|
+
constructor(config2) {
|
|
506
|
+
this.config = { ...this.config, ...config2 };
|
|
507
|
+
}
|
|
505
508
|
setListenInterval(interval) {
|
|
506
|
-
this.
|
|
509
|
+
this.config.listen_interval = interval;
|
|
507
510
|
}
|
|
508
511
|
setMessageLimit(limit) {
|
|
509
|
-
this.
|
|
512
|
+
this.config.message_limit = limit;
|
|
510
513
|
}
|
|
511
514
|
async dispatch(channel, message) {
|
|
512
|
-
const conn =
|
|
515
|
+
const conn = db(this.config.db_connection);
|
|
513
516
|
try {
|
|
514
517
|
await conn.connect();
|
|
518
|
+
let schema = conn.getSchema();
|
|
519
|
+
if (await schema.tableExists(this.config.queue_table) === false) {
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
515
522
|
let q = conn.getQuery();
|
|
516
|
-
await q.table(
|
|
523
|
+
await q.table(this.config.queue_table).insert({
|
|
517
524
|
channel,
|
|
518
525
|
message,
|
|
519
526
|
processed: false,
|
|
@@ -529,20 +536,20 @@ var DatabaseTransport = class {
|
|
|
529
536
|
async listen(channel, callback) {
|
|
530
537
|
return new Promise(async (resolve, reject) => {
|
|
531
538
|
const intervalId = setInterval(async () => {
|
|
532
|
-
const conn =
|
|
539
|
+
const conn = db(this.config.db_connection);
|
|
533
540
|
try {
|
|
534
541
|
await conn.connect();
|
|
535
542
|
let q = conn.getQuery();
|
|
536
|
-
let messages = await q.table(
|
|
543
|
+
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
544
|
for (let msg of messages) {
|
|
538
545
|
try {
|
|
539
546
|
await callback(msg.message);
|
|
540
|
-
await q.table(
|
|
547
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
541
548
|
processed: true,
|
|
542
549
|
updated_at: /* @__PURE__ */ new Date()
|
|
543
550
|
});
|
|
544
551
|
} catch (error) {
|
|
545
|
-
await q.table(
|
|
552
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
546
553
|
processed: false,
|
|
547
554
|
last_tried_at: /* @__PURE__ */ new Date(),
|
|
548
555
|
process_message: error.message || "Error processing message"
|
|
@@ -551,11 +558,11 @@ var DatabaseTransport = class {
|
|
|
551
558
|
}
|
|
552
559
|
} catch (error) {
|
|
553
560
|
this.activeIntervals.delete(intervalId);
|
|
554
|
-
|
|
561
|
+
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
555
562
|
} finally {
|
|
556
563
|
await conn.disconnect();
|
|
557
564
|
}
|
|
558
|
-
}, this.
|
|
565
|
+
}, this.config.listen_interval * 1e3);
|
|
559
566
|
this.activeIntervals.add(intervalId);
|
|
560
567
|
});
|
|
561
568
|
}
|
|
@@ -569,6 +576,7 @@ var DatabaseTransport = class {
|
|
|
569
576
|
|
|
570
577
|
// src/factories.mts
|
|
571
578
|
var import_neko_cache = require("@devbro/neko-cache");
|
|
579
|
+
var import_neko_storage = require("@devbro/neko-storage");
|
|
572
580
|
var FlexibleFactory = class {
|
|
573
581
|
static {
|
|
574
582
|
__name(this, "FlexibleFactory");
|
|
@@ -605,32 +613,32 @@ MailerFactory.register("logger", (opt) => {
|
|
|
605
613
|
});
|
|
606
614
|
});
|
|
607
615
|
});
|
|
608
|
-
MailerFactory.register("
|
|
616
|
+
MailerFactory.register("ses", (opt) => {
|
|
609
617
|
return new import_neko_mailer.SESProvider(opt);
|
|
610
618
|
});
|
|
611
|
-
MailerFactory.register("
|
|
619
|
+
MailerFactory.register("smtp", (opt) => {
|
|
612
620
|
return new import_neko_mailer.SMTPProvider(opt);
|
|
613
621
|
});
|
|
614
|
-
MailerFactory.register("
|
|
622
|
+
MailerFactory.register("memory", (opt) => {
|
|
615
623
|
return new import_neko_mailer.MemoryProvider();
|
|
616
624
|
});
|
|
617
|
-
var
|
|
625
|
+
var QueueTransportFactory = class _QueueTransportFactory {
|
|
618
626
|
static {
|
|
619
|
-
__name(this, "
|
|
627
|
+
__name(this, "QueueTransportFactory");
|
|
620
628
|
}
|
|
621
629
|
static instance = new FlexibleFactory();
|
|
622
630
|
static register(key, factory) {
|
|
623
|
-
|
|
631
|
+
_QueueTransportFactory.instance.register(key, factory);
|
|
624
632
|
}
|
|
625
633
|
static create(key, ...args) {
|
|
626
|
-
return
|
|
634
|
+
return _QueueTransportFactory.instance.create(key, ...args);
|
|
627
635
|
}
|
|
628
636
|
};
|
|
629
|
-
|
|
637
|
+
QueueTransportFactory.register("database", (opt) => {
|
|
630
638
|
let transport = new DatabaseTransport(opt);
|
|
631
639
|
return new import_neko_queue.QueueConnection(transport);
|
|
632
640
|
});
|
|
633
|
-
|
|
641
|
+
QueueTransportFactory.register("memory", (opt) => {
|
|
634
642
|
let transport = new import_neko_queue2.MemoryTransport(opt);
|
|
635
643
|
return new import_neko_queue.QueueConnection(transport);
|
|
636
644
|
});
|
|
@@ -658,9 +666,16 @@ CacheProviderFactory.register("file", (opt) => {
|
|
|
658
666
|
CacheProviderFactory.register("disabled", (opt) => {
|
|
659
667
|
return new import_neko_cache.DisabledCacheProvider();
|
|
660
668
|
});
|
|
669
|
+
import_neko_storage.StorageProviderFactory.register("local", (opt) => {
|
|
670
|
+
return new import_neko_storage.LocalStorageProvider(opt);
|
|
671
|
+
});
|
|
672
|
+
import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
|
|
673
|
+
return new import_neko_storage.AWSS3StorageProvider(opt);
|
|
674
|
+
});
|
|
661
675
|
|
|
662
676
|
// src/facades.mts
|
|
663
677
|
var import_neko_cache2 = require("@devbro/neko-cache");
|
|
678
|
+
var import_neko_queue3 = require("@devbro/neko-queue");
|
|
664
679
|
var router = (0, import_neko_helper.createSingleton)(() => new Router());
|
|
665
680
|
var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
666
681
|
const rc = new import_neko_scheduler.Scheduler();
|
|
@@ -674,9 +689,11 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
674
689
|
return rc;
|
|
675
690
|
});
|
|
676
691
|
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
677
|
-
var storage = (0, import_neko_helper.createSingleton)(
|
|
678
|
-
|
|
679
|
-
);
|
|
692
|
+
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
693
|
+
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
694
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(storage_config.provider, storage_config.config);
|
|
695
|
+
return new import_neko_storage2.Storage(provider);
|
|
696
|
+
});
|
|
680
697
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
681
698
|
const [node, app, ...args] = process.argv;
|
|
682
699
|
return new import_clipanion.Cli({
|
|
@@ -731,7 +748,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
731
748
|
});
|
|
732
749
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
733
750
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
734
|
-
|
|
751
|
+
const provider = MailerFactory.create(
|
|
735
752
|
mailer_config.provider,
|
|
736
753
|
mailer_config.config
|
|
737
754
|
);
|
|
@@ -743,7 +760,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
743
760
|
if (!queue_config) {
|
|
744
761
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
745
762
|
}
|
|
746
|
-
const
|
|
763
|
+
const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
|
|
764
|
+
const rc = new import_neko_queue3.QueueConnection(provider);
|
|
747
765
|
return rc;
|
|
748
766
|
});
|
|
749
767
|
var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
@@ -752,7 +770,7 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
752
770
|
throw new Error(`Cache configuration for '${label}' not found`);
|
|
753
771
|
}
|
|
754
772
|
const provider = CacheProviderFactory.create(
|
|
755
|
-
cache_config.
|
|
773
|
+
cache_config.provider,
|
|
756
774
|
cache_config.config
|
|
757
775
|
);
|
|
758
776
|
return new import_neko_cache2.Cache(provider);
|
package/dist/bin/factories.cjs
CHANGED
|
@@ -35,7 +35,7 @@ __export(factories_exports, {
|
|
|
35
35
|
CacheProviderFactory: () => CacheProviderFactory,
|
|
36
36
|
FlexibleFactory: () => FlexibleFactory,
|
|
37
37
|
MailerFactory: () => MailerFactory,
|
|
38
|
-
|
|
38
|
+
QueueTransportFactory: () => QueueTransportFactory
|
|
39
39
|
});
|
|
40
40
|
module.exports = __toCommonJS(factories_exports);
|
|
41
41
|
var import_neko_mailer2 = require("@devbro/neko-mailer");
|
|
@@ -473,6 +473,7 @@ __reExport(http_exports, require("@devbro/neko-http"));
|
|
|
473
473
|
var yup = __toESM(require("yup"), 1);
|
|
474
474
|
var import_neko_logger = require("@devbro/neko-logger");
|
|
475
475
|
var import_neko_cache = require("@devbro/neko-cache");
|
|
476
|
+
var import_neko_queue = require("@devbro/neko-queue");
|
|
476
477
|
var router = (0, import_neko_helper.createSingleton)(() => new Router());
|
|
477
478
|
var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
478
479
|
const rc = new import_neko_scheduler.Scheduler();
|
|
@@ -485,9 +486,12 @@ var scheduler = (0, import_neko_helper.createSingleton)(() => {
|
|
|
485
486
|
});
|
|
486
487
|
return rc;
|
|
487
488
|
});
|
|
488
|
-
var
|
|
489
|
-
|
|
490
|
-
);
|
|
489
|
+
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
490
|
+
var storage = (0, import_neko_helper.createSingleton)((label = "default") => {
|
|
491
|
+
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
492
|
+
const provider = import_neko_storage.StorageProviderFactory.create(storage_config.provider, storage_config.config);
|
|
493
|
+
return new import_neko_storage.Storage(provider);
|
|
494
|
+
});
|
|
491
495
|
var cli = (0, import_neko_helper.createSingleton)(() => {
|
|
492
496
|
const [node, app, ...args] = process.argv;
|
|
493
497
|
return new import_clipanion.Cli({
|
|
@@ -542,7 +546,7 @@ var logger = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
542
546
|
});
|
|
543
547
|
var mailer = (0, import_neko_helper.createSingleton)((label) => {
|
|
544
548
|
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
545
|
-
|
|
549
|
+
const provider = MailerFactory.create(
|
|
546
550
|
mailer_config.provider,
|
|
547
551
|
mailer_config.config
|
|
548
552
|
);
|
|
@@ -554,7 +558,8 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
554
558
|
if (!queue_config) {
|
|
555
559
|
throw new Error(`Queue configuration for '${label}' not found`);
|
|
556
560
|
}
|
|
557
|
-
const
|
|
561
|
+
const provider = QueueTransportFactory.create(queue_config.provider, queue_config.config);
|
|
562
|
+
const rc = new import_neko_queue.QueueConnection(provider);
|
|
558
563
|
return rc;
|
|
559
564
|
});
|
|
560
565
|
var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
@@ -563,15 +568,15 @@ var cache = (0, import_neko_helper.createSingleton)((label) => {
|
|
|
563
568
|
throw new Error(`Cache configuration for '${label}' not found`);
|
|
564
569
|
}
|
|
565
570
|
const provider = CacheProviderFactory.create(
|
|
566
|
-
cache_config.
|
|
571
|
+
cache_config.provider,
|
|
567
572
|
cache_config.config
|
|
568
573
|
);
|
|
569
574
|
return new import_neko_cache.Cache(provider);
|
|
570
575
|
});
|
|
571
576
|
|
|
572
577
|
// src/factories.mts
|
|
573
|
-
var import_neko_queue = require("@devbro/neko-queue");
|
|
574
578
|
var import_neko_queue2 = require("@devbro/neko-queue");
|
|
579
|
+
var import_neko_queue3 = require("@devbro/neko-queue");
|
|
575
580
|
|
|
576
581
|
// src/queue.mts
|
|
577
582
|
var queue_exports = {};
|
|
@@ -579,31 +584,38 @@ __export(queue_exports, {
|
|
|
579
584
|
DatabaseTransport: () => DatabaseTransport
|
|
580
585
|
});
|
|
581
586
|
__reExport(queue_exports, require("@devbro/neko-queue"));
|
|
582
|
-
var import_neko_sql = require("@devbro/neko-sql");
|
|
583
587
|
var DatabaseTransport = class {
|
|
584
|
-
constructor(db_config) {
|
|
585
|
-
this.db_config = db_config;
|
|
586
|
-
}
|
|
587
588
|
static {
|
|
588
589
|
__name(this, "DatabaseTransport");
|
|
589
590
|
}
|
|
590
|
-
listenInterval = 6e4;
|
|
591
|
-
// default to 1 minute
|
|
592
|
-
messageLimit = 100;
|
|
593
|
-
// default to 100 messages per fetch
|
|
594
591
|
activeIntervals = /* @__PURE__ */ new Set();
|
|
592
|
+
config = {
|
|
593
|
+
queue_table: "queue_messages",
|
|
594
|
+
db_connection: "default",
|
|
595
|
+
listen_interval: 60,
|
|
596
|
+
// seconds
|
|
597
|
+
message_limit: 10
|
|
598
|
+
// messages per each fetch
|
|
599
|
+
};
|
|
600
|
+
constructor(config2) {
|
|
601
|
+
this.config = { ...this.config, ...config2 };
|
|
602
|
+
}
|
|
595
603
|
setListenInterval(interval) {
|
|
596
|
-
this.
|
|
604
|
+
this.config.listen_interval = interval;
|
|
597
605
|
}
|
|
598
606
|
setMessageLimit(limit) {
|
|
599
|
-
this.
|
|
607
|
+
this.config.message_limit = limit;
|
|
600
608
|
}
|
|
601
609
|
async dispatch(channel, message) {
|
|
602
|
-
const conn =
|
|
610
|
+
const conn = db(this.config.db_connection);
|
|
603
611
|
try {
|
|
604
612
|
await conn.connect();
|
|
613
|
+
let schema = conn.getSchema();
|
|
614
|
+
if (await schema.tableExists(this.config.queue_table) === false) {
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
605
617
|
let q = conn.getQuery();
|
|
606
|
-
await q.table(
|
|
618
|
+
await q.table(this.config.queue_table).insert({
|
|
607
619
|
channel,
|
|
608
620
|
message,
|
|
609
621
|
processed: false,
|
|
@@ -619,20 +631,20 @@ var DatabaseTransport = class {
|
|
|
619
631
|
async listen(channel, callback) {
|
|
620
632
|
return new Promise(async (resolve, reject) => {
|
|
621
633
|
const intervalId = setInterval(async () => {
|
|
622
|
-
const conn =
|
|
634
|
+
const conn = db(this.config.db_connection);
|
|
623
635
|
try {
|
|
624
636
|
await conn.connect();
|
|
625
637
|
let q = conn.getQuery();
|
|
626
|
-
let messages = await q.table(
|
|
638
|
+
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();
|
|
627
639
|
for (let msg of messages) {
|
|
628
640
|
try {
|
|
629
641
|
await callback(msg.message);
|
|
630
|
-
await q.table(
|
|
642
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
631
643
|
processed: true,
|
|
632
644
|
updated_at: /* @__PURE__ */ new Date()
|
|
633
645
|
});
|
|
634
646
|
} catch (error) {
|
|
635
|
-
await q.table(
|
|
647
|
+
await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
|
|
636
648
|
processed: false,
|
|
637
649
|
last_tried_at: /* @__PURE__ */ new Date(),
|
|
638
650
|
process_message: error.message || "Error processing message"
|
|
@@ -641,11 +653,11 @@ var DatabaseTransport = class {
|
|
|
641
653
|
}
|
|
642
654
|
} catch (error) {
|
|
643
655
|
this.activeIntervals.delete(intervalId);
|
|
644
|
-
|
|
656
|
+
logger().error("Error in DatabaseTransport listen interval:", { error });
|
|
645
657
|
} finally {
|
|
646
658
|
await conn.disconnect();
|
|
647
659
|
}
|
|
648
|
-
}, this.
|
|
660
|
+
}, this.config.listen_interval * 1e3);
|
|
649
661
|
this.activeIntervals.add(intervalId);
|
|
650
662
|
});
|
|
651
663
|
}
|
|
@@ -659,6 +671,7 @@ var DatabaseTransport = class {
|
|
|
659
671
|
|
|
660
672
|
// src/factories.mts
|
|
661
673
|
var import_neko_cache2 = require("@devbro/neko-cache");
|
|
674
|
+
var import_neko_storage2 = require("@devbro/neko-storage");
|
|
662
675
|
var FlexibleFactory = class {
|
|
663
676
|
static {
|
|
664
677
|
__name(this, "FlexibleFactory");
|
|
@@ -695,34 +708,34 @@ MailerFactory.register("logger", (opt) => {
|
|
|
695
708
|
});
|
|
696
709
|
});
|
|
697
710
|
});
|
|
698
|
-
MailerFactory.register("
|
|
711
|
+
MailerFactory.register("ses", (opt) => {
|
|
699
712
|
return new import_neko_mailer2.SESProvider(opt);
|
|
700
713
|
});
|
|
701
|
-
MailerFactory.register("
|
|
714
|
+
MailerFactory.register("smtp", (opt) => {
|
|
702
715
|
return new import_neko_mailer2.SMTPProvider(opt);
|
|
703
716
|
});
|
|
704
|
-
MailerFactory.register("
|
|
717
|
+
MailerFactory.register("memory", (opt) => {
|
|
705
718
|
return new import_neko_mailer2.MemoryProvider();
|
|
706
719
|
});
|
|
707
|
-
var
|
|
720
|
+
var QueueTransportFactory = class _QueueTransportFactory {
|
|
708
721
|
static {
|
|
709
|
-
__name(this, "
|
|
722
|
+
__name(this, "QueueTransportFactory");
|
|
710
723
|
}
|
|
711
724
|
static instance = new FlexibleFactory();
|
|
712
725
|
static register(key, factory) {
|
|
713
|
-
|
|
726
|
+
_QueueTransportFactory.instance.register(key, factory);
|
|
714
727
|
}
|
|
715
728
|
static create(key, ...args) {
|
|
716
|
-
return
|
|
729
|
+
return _QueueTransportFactory.instance.create(key, ...args);
|
|
717
730
|
}
|
|
718
731
|
};
|
|
719
|
-
|
|
732
|
+
QueueTransportFactory.register("database", (opt) => {
|
|
720
733
|
let transport = new DatabaseTransport(opt);
|
|
721
|
-
return new
|
|
734
|
+
return new import_neko_queue2.QueueConnection(transport);
|
|
722
735
|
});
|
|
723
|
-
|
|
724
|
-
let transport = new
|
|
725
|
-
return new
|
|
736
|
+
QueueTransportFactory.register("memory", (opt) => {
|
|
737
|
+
let transport = new import_neko_queue3.MemoryTransport(opt);
|
|
738
|
+
return new import_neko_queue2.QueueConnection(transport);
|
|
726
739
|
});
|
|
727
740
|
var CacheProviderFactory = class _CacheProviderFactory {
|
|
728
741
|
static {
|
|
@@ -748,10 +761,16 @@ CacheProviderFactory.register("file", (opt) => {
|
|
|
748
761
|
CacheProviderFactory.register("disabled", (opt) => {
|
|
749
762
|
return new import_neko_cache2.DisabledCacheProvider();
|
|
750
763
|
});
|
|
764
|
+
import_neko_storage2.StorageProviderFactory.register("local", (opt) => {
|
|
765
|
+
return new import_neko_storage2.LocalStorageProvider(opt);
|
|
766
|
+
});
|
|
767
|
+
import_neko_storage2.StorageProviderFactory.register("s3", (opt) => {
|
|
768
|
+
return new import_neko_storage2.AWSS3StorageProvider(opt);
|
|
769
|
+
});
|
|
751
770
|
// Annotate the CommonJS export names for ESM import in node:
|
|
752
771
|
0 && (module.exports = {
|
|
753
772
|
CacheProviderFactory,
|
|
754
773
|
FlexibleFactory,
|
|
755
774
|
MailerFactory,
|
|
756
|
-
|
|
775
|
+
QueueTransportFactory
|
|
757
776
|
});
|