@privateaim/server-kit 0.8.0 → 0.8.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.8.1](https://github.com/PrivateAIM/hub/compare/v0.8.0...v0.8.1) (2024-08-19)
4
+
5
+
6
+ ### Features
7
+
8
+ * add error log formatting ([976c4cd](https://github.com/PrivateAIM/hub/commit/976c4cdf0648368b3164ba97a36cac13f99c203e))
9
+ * add memory-cache & track master images synchronization progress ([bd43978](https://github.com/PrivateAIM/hub/commit/bd439781941e1130f812a30e721227e2893670ea))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * change order when blocking master image sync process ([8e9efc1](https://github.com/PrivateAIM/hub/commit/8e9efc1c707ea3582fe802a8e1073b0c496d5acb))
15
+ * **deps:** bump typeorm-extension from 3.5.1 to 3.6.0 ([#619](https://github.com/PrivateAIM/hub/issues/619)) ([7af46a3](https://github.com/PrivateAIM/hub/commit/7af46a317755cb8e1d5c26779d5d9157964ba51d))
16
+ * **deps:** bump typeorm-extension from 3.6.0 to 3.6.1 ([#652](https://github.com/PrivateAIM/hub/issues/652)) ([c862af7](https://github.com/PrivateAIM/hub/commit/c862af75dec7d42e3da9c50761e7ab61225a1c8f))
17
+ * **deps:** bump winston from 3.13.0 to 3.13.1 ([#563](https://github.com/PrivateAIM/hub/issues/563)) ([0fe28d4](https://github.com/PrivateAIM/hub/commit/0fe28d4d1179924cc13afe0e24b5095b9b4a2fd7))
18
+ * **deps:** bump winston from 3.13.1 to 3.14.1 ([#647](https://github.com/PrivateAIM/hub/issues/647)) ([768e839](https://github.com/PrivateAIM/hub/commit/768e83904ca74d343c43a173f040b1ed6ebf9c82))
19
+ * do not process requeued message multiple times ([077495b](https://github.com/PrivateAIM/hub/commit/077495b69ca7f9c3dd497b2f5db15f05534b4f92))
20
+
21
+
22
+ ### Dependencies
23
+
24
+ * The following workspace dependencies were updated
25
+ * dependencies
26
+ * @privateaim/core-kit bumped from ^0.8.0 to ^0.8.1
27
+ * @privateaim/kit bumped from ^0.8.0 to ^0.8.1
28
+
3
29
  ## [0.8.0](https://github.com/PrivateAIM/hub/compare/v0.7.0...v0.8.0) (2024-07-02)
4
30
 
5
31
 
@@ -1,4 +1,5 @@
1
1
  export * from './aggregator';
2
+ export * from './memory-cache';
2
3
  export * from './component';
3
4
  export * from './queue';
4
5
  export * from './queue-router';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAOA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAOA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './module';
2
+ export * from './singleton';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/memory-cache/index.ts"],"names":[],"mappings":"AAOA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ import TTLCache from '@isaacs/ttlcache';
2
+ type BlockerOptions = {
3
+ ttl: number;
4
+ };
5
+ export declare class MemoryCache<KEY extends string = string, VALUE = any> {
6
+ protected options: BlockerOptions;
7
+ protected cache: TTLCache<KEY, VALUE>;
8
+ constructor(options?: Partial<BlockerOptions>);
9
+ set(id: KEY, value: VALUE, options: BlockerOptions): void;
10
+ get(id: KEY): VALUE | undefined;
11
+ del(id: KEY): void;
12
+ has(id: KEY): boolean;
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/core/memory-cache/module.ts"],"names":[],"mappings":"AAOA,OAAO,QAAQ,MAAM,kBAAkB,CAAC;AAExC,KAAK,cAAc,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,WAAW,CACpB,GAAG,SAAS,MAAM,GAAG,MAAM,EAC3B,KAAK,GAAG,GAAG;IAEX,SAAS,CAAC,OAAO,EAAG,cAAc,CAAC;IAEnC,SAAS,CAAC,KAAK,EAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAE3B,OAAO,GAAE,OAAO,CAAC,cAAc,CAAM;IASjD,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc;IAMlD,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,KAAK,GAAG,SAAS;IAI/B,GAAG,CAAC,EAAE,EAAE,GAAG,GAAI,IAAI;IAInB,GAAG,CAAC,EAAE,EAAE,GAAG,GAAI,OAAO;CAGzB"}
@@ -0,0 +1,3 @@
1
+ import { MemoryCache } from './module';
2
+ export declare function useMemoryCache(): MemoryCache<string, any>;
3
+ //# sourceMappingURL=singleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../../src/core/memory-cache/singleton.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAOvC,wBAAgB,cAAc,6BAE7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/core/queue-router/module.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAI7C,OAAO,KAAK,EAER,mBAAmB,EACnB,kBAAkB,EAAE,kBAAkB,EACzC,MAAM,SAAS,CAAC;AAEjB,qBAAa,WAAW;IACpB,SAAS,CAAC,MAAM,EAAG,MAAM,CAAC;gBAId,MAAM,EAAE,MAAM;IAM1B,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAI,OAAO,CAAC,OAAO,CAAC;IA2BvD,OAAO,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,mBAAmB,GAAI,OAAO,CAAC,IAAI,CAAC;CAsDtF"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/core/queue-router/module.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAI7C,OAAO,KAAK,EAER,mBAAmB,EACnB,kBAAkB,EAAE,kBAAkB,EACzC,MAAM,SAAS,CAAC;AAEjB,qBAAa,WAAW;IACpB,SAAS,CAAC,MAAM,EAAG,MAAM,CAAC;gBAId,MAAM,EAAE,MAAM;IAM1B,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAI,OAAO,CAAC,OAAO,CAAC;IA2BvD,OAAO,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,mBAAmB,GAAI,OAAO,CAAC,IAAI,CAAC;CA+DtF"}
package/dist/index.cjs CHANGED
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
+ var TTLCache = require('@isaacs/ttlcache');
4
+ var singa = require('singa');
3
5
  var kit = require('@privateaim/kit');
4
6
  var amqpExtension = require('amqp-extension');
5
- var singa = require('singa');
6
7
  var vault = require('@hapic/vault');
7
8
  var coreHttpKit = require('@authup/core-http-kit');
8
9
  var envix = require('envix');
@@ -13,6 +14,59 @@ var redisExtension = require('redis-extension');
13
14
  var coreKit = require('@privateaim/core-kit');
14
15
  var redisEmitter = require('@socket.io/redis-emitter');
15
16
 
17
+ /*
18
+ * Copyright (c) 2024.
19
+ * Author Peter Placzek (tada5hi)
20
+ * For the full copyright and license information,
21
+ * view the LICENSE file that was distributed with this source code.
22
+ */ function _define_property$2(obj, key, value) {
23
+ if (key in obj) {
24
+ Object.defineProperty(obj, key, {
25
+ value: value,
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true
29
+ });
30
+ } else {
31
+ obj[key] = value;
32
+ }
33
+ return obj;
34
+ }
35
+ class MemoryCache {
36
+ set(id, value, options) {
37
+ this.cache.set(id, value, {
38
+ ttl: options.ttl
39
+ });
40
+ }
41
+ get(id) {
42
+ return this.cache.get(id);
43
+ }
44
+ del(id) {
45
+ this.cache.delete(id);
46
+ }
47
+ has(id) {
48
+ return this.cache.has(id);
49
+ }
50
+ constructor(options = {}){
51
+ _define_property$2(this, "options", void 0);
52
+ _define_property$2(this, "cache", void 0);
53
+ this.options = {
54
+ // 60 seconds
55
+ ttl: 1000 * 60,
56
+ ...options
57
+ };
58
+ this.cache = new TTLCache();
59
+ }
60
+ }
61
+
62
+ const instance$8 = singa.singa({
63
+ name: 'queueRouter',
64
+ factory: ()=>new MemoryCache()
65
+ });
66
+ function useMemoryCache() {
67
+ return instance$8.use();
68
+ }
69
+
16
70
  /*
17
71
  * Copyright (c) 2023-2024.
18
72
  * Author Peter Placzek (tada5hi)
@@ -188,7 +242,9 @@ function createLogger(ctx = {}) {
188
242
  ];
189
243
  }
190
244
  return winston.createLogger({
191
- format: winston.format.combine(winston.format.timestamp(), winston.format.colorize(), winston.format.simple()),
245
+ format: winston.format.combine(winston.format.errors({
246
+ stack: true
247
+ }), winston.format.timestamp(), winston.format.colorize(), winston.format.simple()),
192
248
  level: 'debug',
193
249
  transports: loggerTransports,
194
250
  // todo: deeply merge options
@@ -309,6 +365,12 @@ class QueueRouter {
309
365
  if (!isQueueRouterPayload(payload)) {
310
366
  return;
311
367
  }
368
+ if (input.fields.redelivered) {
369
+ if (isLoggerUsable()) {
370
+ useLogger().debug(`Queue message ${input.properties.type} in ${routing.key} is not processed again.`);
371
+ }
372
+ return;
373
+ }
312
374
  if (isLoggerUsable()) {
313
375
  useLogger().debug(`Consuming queue message ${input.properties.type} in ${routing.key}`);
314
376
  }
@@ -465,6 +527,7 @@ Object.defineProperty(exports, "createRedisClient", {
465
527
  });
466
528
  exports.AuthupClient = AuthupClient;
467
529
  exports.ComponentError = ComponentError;
530
+ exports.MemoryCache = MemoryCache;
468
531
  exports.QueueRouter = QueueRouter;
469
532
  exports.buildQueueRouterPublishPayload = buildQueueRouterPublishPayload;
470
533
  exports.createLogger = createLogger;
@@ -492,6 +555,7 @@ exports.setVaultFactory = setVaultFactory;
492
555
  exports.useAmqpClient = useAmqpClient;
493
556
  exports.useAuthupClient = useAuthupClient;
494
557
  exports.useLogger = useLogger;
558
+ exports.useMemoryCache = useMemoryCache;
495
559
  exports.useQueueRouter = useQueueRouter;
496
560
  exports.useRedisClient = useRedisClient;
497
561
  exports.useRedisPublishClient = useRedisPublishClient;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/core/component/error.ts","../src/core/component/helper.ts","../src/core/queue/utils.ts","../src/core/queue-router/constants.ts","../src/core/queue-router/helpers.ts","../src/services/amqp/module.ts","../src/services/vault/singleton.ts","../src/services/authup/helpers.ts","../src/services/authup/module.ts","../src/services/authup/singleton.ts","../src/services/logger/module.ts","../src/services/logger/singleton.ts","../src/services/redis/singleton.ts","../src/services/redis/singleton-publish.ts","../src/services/redis/singleton-subscribe.ts","../src/core/queue-router/module.ts","../src/core/queue-router/singleton.ts","../src/domain-event/utils.ts","../src/domain-event/redis/publish.ts","../src/domain-event/socket/publish.ts","../src/domain-event/publish.ts","../src/utils/has-property.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ComponentErrorOptions } from './type';\n\nexport class ComponentError extends Error {\n public code?: string | null;\n\n constructor(input: ComponentErrorOptions) {\n super(input.message, { cause: input.cause });\n\n this.code = input.code;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@privateaim/kit';\nimport type { ComponentError } from './error';\n\nexport function isComponentError(input: unknown) : input is ComponentError {\n if (!isObject(input)) {\n return false;\n }\n\n if (\n typeof input.message !== 'undefined' &&\n typeof input.message !== 'string'\n ) {\n return false;\n }\n\n if (typeof input.code === 'undefined') {\n return true;\n }\n\n return typeof input.code === 'string' || input.code === null;\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty, isObject } from '@privateaim/kit';\nimport type { QueuePayload } from './type';\n\nexport function isQueuePayload(input: unknown) : input is QueuePayload {\n return isObject(input) &&\n hasOwnProperty(input, 'data') &&\n isObject(input.data) &&\n hasOwnProperty(input, 'metadata') &&\n isObject(input.metadata);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum QueueRouterRoutingType {\n WORK = 'work',\n PUB_SUB = 'pubSub',\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createNanoID, hasOwnProperty, isObject } from '@privateaim/kit';\nimport type { QueueRouterPayload, QueueRouterPayloadInput } from './types';\n\nexport function buildQueueRouterPublishPayload(\n input: QueueRouterPayloadInput,\n) : QueueRouterPayload {\n return {\n id: input.id || createNanoID(),\n type: input.type,\n data: input.data || {},\n metadata: {\n timestamp: Date.now(),\n ...input.metadata,\n },\n };\n}\n\nexport function isQueueRouterPayload(input: unknown) : input is QueueRouterPayload {\n return isObject(input) &&\n typeof input.id === 'string' &&\n typeof input.type === 'string' &&\n hasOwnProperty(input, 'data') &&\n isObject(input.data) &&\n hasOwnProperty(input, 'metadata') &&\n isObject(input.metadata);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'amqp-extension';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'amqp',\n});\n\nexport function setAmqpClientFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n\nexport function isAmqpClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function useAmqpClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\nimport type { VaultClient } from '@hapic/vault';\n\nconst instance = singa<VaultClient>({\n name: 'vault',\n});\n\nexport function setVaultFactory(factory: Factory<VaultClient>) {\n instance.setFactory(factory);\n}\n\nexport function isVaultClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function useVaultClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { TokenCreatorOptions } from '@authup/core-http-kit';\nimport { isVaultClientUsable, useVaultClient } from '../vault';\n\nexport function guessAuthupTokenCreatorOptions() : TokenCreatorOptions {\n let options : TokenCreatorOptions;\n if (isVaultClientUsable()) {\n options = {\n type: 'robotInVault',\n name: 'system',\n vault: useVaultClient(),\n };\n } else {\n options = {\n type: 'user',\n name: 'admin',\n password: 'start123',\n };\n }\n\n return options;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientResponseErrorTokenHookOptions } from '@authup/core-http-kit';\nimport {\n Client, mountClientResponseErrorTokenHook as mountAuthupClientResponseErrorTokenHook,\n mountClientResponseErrorTokenHook,\n} from '@authup/core-http-kit';\nimport { guessAuthupTokenCreatorOptions } from './helpers';\nimport type { AuthupClientOptions } from './types';\n\nexport {\n mountAuthupClientResponseErrorTokenHook,\n};\n\nexport class AuthupClient extends Client {\n constructor(options: AuthupClientOptions = {}) {\n super(options);\n\n let tokenHook : ClientResponseErrorTokenHookOptions;\n if (options.tokenHook) {\n tokenHook = options.tokenHook;\n tokenHook.baseURL = tokenHook.baseURL || options.baseURL;\n } else {\n const tokenCreator = guessAuthupTokenCreatorOptions();\n tokenHook = {\n baseURL: options.baseURL,\n tokenCreator,\n };\n }\n\n mountClientResponseErrorTokenHook(this, tokenHook);\n }\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-http-kit';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'authup',\n});\n\nexport function useAuthupClient() {\n return instance.use();\n}\n\nexport function isAuthupClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setAuthupClientFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { read } from 'envix';\nimport path from 'node:path';\nimport { EnvironmentName } from 'typeorm-extension';\nimport type { Logger } from 'winston';\nimport { createLogger as create, format, transports } from 'winston';\nimport type { LoggerCreateContext, LoggerTransports } from './types';\n\nexport function createLogger(ctx: LoggerCreateContext = {}) : Logger {\n const { directory, options = {} } = ctx;\n\n let loggerTransports : LoggerTransports;\n if (read('env') === EnvironmentName.PRODUCTION) {\n loggerTransports = [\n new transports.Console({\n level: 'info',\n }),\n new transports.File({\n filename: path.join(directory || process.cwd(), 'access.log'),\n level: 'http',\n maxsize: 10 * 1024 * 1024, // 10MB\n maxFiles: 5,\n }),\n new transports.File({\n filename: path.join(directory || process.cwd(), 'error.log'),\n level: 'warn',\n maxsize: 10 * 1024 * 1024, // 10MB\n maxFiles: 5,\n }),\n ];\n } else {\n loggerTransports = [\n new transports.Console({\n level: 'debug',\n }),\n ];\n }\n\n return create({\n format: format.combine(\n format.timestamp(),\n format.colorize(),\n format.simple(),\n ),\n level: 'debug',\n transports: loggerTransports,\n // todo: deeply merge options\n ...(options || {}),\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { type Factory, singa } from 'singa';\nimport type { Logger } from 'winston';\n\nconst instance = singa<Logger>({\n name: 'logger',\n});\n\nexport function setLoggerFactory(factory: Factory<Logger>) {\n instance.setFactory(factory);\n}\n\nexport function isLoggerUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setLogger(input: Logger) {\n instance.set(input);\n}\n\nexport function useLogger() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'redis',\n});\n\nexport function setRedisFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n\nexport function isRedisClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setRedisClient(input: Client) {\n instance.set(input);\n}\n\nexport function useRedisClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport { singa } from 'singa';\nimport { useRedisClient } from './singleton';\n\nconst instance = singa<Client>({\n name: 'redisPublish',\n factory: () => useRedisClient().duplicate(),\n});\n\nexport function useRedisPublishClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport { singa } from 'singa';\nimport { useRedisClient } from './singleton';\n\nconst instance = singa<Client>({\n name: 'redisSubscribe',\n factory: () => useRedisClient().duplicate(),\n});\n\nexport function useRedisSubscribeClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ExchangeType } from 'amqp-extension';\nimport type { Client } from 'amqp-extension';\nimport { isLoggerUsable, useLogger } from '../../services';\nimport { QueueRouterRoutingType } from './constants';\nimport { isQueueRouterPayload } from './helpers';\nimport type {\n QueueRouterHandler,\n QueueRouterHandlers,\n QueueRouterPayload, QueueRouterRouting,\n} from './types';\n\nexport class QueueRouter {\n protected driver : Client;\n\n //----------------------------------------------------------------\n\n constructor(driver: Client) {\n this.driver = driver;\n }\n\n //----------------------------------------------------------------\n\n publish(message: QueueRouterPayload) : Promise<boolean> {\n let exchange : Client;\n if (message.metadata.routing.type === 'work') {\n exchange = this.driver.of({\n type: ExchangeType.DIRECT,\n name: message.metadata.routing.namespace || '',\n });\n } else {\n exchange = this.driver.of({\n type: ExchangeType.TOPIC,\n name: message.metadata.routing.namespace || 'FLAME',\n });\n }\n\n if (isLoggerUsable()) {\n useLogger()\n .debug(`Publishing queue message ${message.type} in ${message.metadata.routing.key}`);\n }\n\n return exchange.publish(message.metadata.routing.key, message, {\n type: message.type,\n messageId: message.id,\n persistent: message.metadata.persistent ??\n message.metadata.routing.type === QueueRouterRoutingType.WORK,\n });\n }\n\n consume(routing: QueueRouterRouting, handlers: QueueRouterHandlers) : Promise<void> {\n let exchange : Client;\n if (routing.type === 'work') {\n exchange = this.driver.of({\n type: ExchangeType.DIRECT,\n name: routing.namespace || '',\n });\n } else {\n exchange = this.driver.of({\n type: ExchangeType.TOPIC,\n name: routing.namespace || 'FLAME',\n });\n }\n\n return exchange.consume(routing.key, {\n prefetchCount: routing.type === QueueRouterRoutingType.WORK ? 1 : undefined,\n // noAck: routing.type !== QueueRouterRoutingType.WORK,\n requeueOnFailure: routing.type === QueueRouterRoutingType.WORK,\n }, {\n $any: async (input) => {\n const payload = JSON.parse(input.content.toString('utf-8'));\n if (!isQueueRouterPayload(payload)) {\n return;\n }\n\n if (isLoggerUsable()) {\n useLogger()\n .debug(`Consuming queue message ${input.properties.type} in ${routing.key}`);\n }\n\n let handler : QueueRouterHandler | undefined;\n\n if (\n typeof input.properties.type === 'string' &&\n handlers[input.properties.type]\n ) {\n handler = handlers[input.properties.type];\n } else {\n handler = handlers.$any;\n }\n\n if (typeof handler !== 'function') {\n if (isLoggerUsable()) {\n useLogger()\n .debug(`No queue handler to consume message ${input.properties.type} in ${routing.key}`);\n }\n\n return;\n }\n\n await handler(payload);\n },\n });\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { singa } from 'singa';\nimport { isAmqpClientUsable, useAmqpClient } from '../../services';\nimport { QueueRouter } from './module';\n\nconst instance = singa<QueueRouter>({\n name: 'queueRouter',\n factory: () => {\n const amqp = useAmqpClient();\n\n return new QueueRouter(amqp);\n },\n});\n\nexport function isQueueRouterUsable() {\n return instance.has() || isAmqpClientUsable();\n}\n\nexport function useQueueRouter() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@privateaim/kit';\nimport type { DomainEventChannelName } from './type';\n\nexport function transformDomainEventData<T>(input: T) : T {\n if (isObject(input)) {\n const keys = Object.keys(input);\n for (let i = 0; i < keys.length; i++) {\n const value = input[keys[i]];\n if (value instanceof Date) {\n input[keys[i]] = value.toISOString();\n }\n }\n }\n\n return input;\n}\n\nexport function buildDomainEventChannelName(\n input: DomainEventChannelName,\n id?: string | number,\n) : string {\n if (typeof input === 'string') {\n return input;\n }\n\n return input(id);\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { DomainEventName } from '@privateaim/core-kit';\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport type { Client } from 'redis-extension';\nimport type { DomainEventDestinations } from '../type';\nimport { buildDomainEventChannelName, transformDomainEventData } from '../utils';\n\nexport async function publishDomainRedisEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) : Promise<any> {\n context = transformDomainEventData(context);\n\n const json = JSON.stringify(context);\n\n const pipeline = client.pipeline();\n for (let i = 0; i < destinations.length; i++) {\n const { namespace } = destinations[i];\n const keyPrefix = (namespace ? `${namespace}:` : '');\n\n let key = keyPrefix + buildDomainEventChannelName(destinations[i].channel);\n pipeline.publish(key, json);\n\n if (\n context.event !== DomainEventName.CREATED &&\n typeof destinations[i].channel === 'function'\n ) {\n key = keyPrefix + buildDomainEventChannelName(destinations[i].channel, context.data.id);\n pipeline.publish(key, json);\n }\n }\n\n return pipeline.exec();\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport { DomainEventName, buildDomainEventFullName } from '@privateaim/core-kit';\nimport { Emitter } from '@socket.io/redis-emitter';\nimport type { Client } from 'redis-extension';\nimport type { DomainEventDestinations } from '../type';\nimport { buildDomainEventChannelName, transformDomainEventData } from '../utils';\n\nexport function publishDomainSocketEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) {\n context = transformDomainEventData(context);\n\n for (let i = 0; i < destinations.length; i++) {\n let emitter = new Emitter(client);\n if (destinations[i].namespace) {\n emitter = emitter.of(destinations[i].namespace);\n }\n\n let roomName = buildDomainEventChannelName(destinations[i].channel);\n\n const fullEventName = buildDomainEventFullName(context.type, context.event);\n\n emitter\n .in(roomName)\n .emit(fullEventName, {\n ...context,\n meta: {\n roomName,\n },\n });\n\n if (\n context.event !== DomainEventName.CREATED &&\n typeof destinations[i].channel === 'function'\n ) {\n roomName = buildDomainEventChannelName(destinations[i].channel, context.data.id);\n emitter\n .in(roomName)\n .emit(fullEventName, {\n ...context,\n meta: {\n roomName,\n roomId: context.data.id,\n },\n });\n }\n }\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport type { Client } from 'redis-extension';\nimport { publishDomainRedisEvent } from './redis';\nimport { publishDomainSocketEvent } from './socket';\nimport type { DomainEventDestinations } from './type';\n\nexport async function publishDomainEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) {\n await publishDomainRedisEvent(client, context, destinations);\n publishDomainSocketEvent(client, context, destinations);\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function hasOwnProperty<X extends Record<string, any>, Y extends PropertyKey>(\n obj: X,\n prop: Y,\n): obj is X & Record<Y, unknown> {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n"],"names":["_define_property","ComponentError","Error","constructor","input","message","cause","code","isComponentError","isObject","isQueuePayload","hasOwnProperty","data","metadata","QueueRouterRoutingType","buildQueueRouterPublishPayload","id","createNanoID","type","timestamp","Date","now","isQueueRouterPayload","instance","singa","name","setAmqpClientFactory","factory","setFactory","isAmqpClientUsable","has","hasFactory","useAmqpClient","use","setVaultFactory","isVaultClientUsable","useVaultClient","guessAuthupTokenCreatorOptions","options","vault","password","AuthupClient","Client","tokenHook","baseURL","tokenCreator","mountClientResponseErrorTokenHook","useAuthupClient","isAuthupClientUsable","setAuthupClientFactory","createLogger","ctx","directory","loggerTransports","read","EnvironmentName","PRODUCTION","transports","Console","level","File","filename","path","join","process","cwd","maxsize","maxFiles","create","format","combine","colorize","simple","setLoggerFactory","isLoggerUsable","setLogger","set","useLogger","setRedisFactory","isRedisClientUsable","setRedisClient","useRedisClient","duplicate","useRedisPublishClient","useRedisSubscribeClient","QueueRouter","publish","exchange","routing","driver","of","ExchangeType","DIRECT","namespace","TOPIC","debug","key","messageId","persistent","WORK","consume","handlers","prefetchCount","undefined","requeueOnFailure","$any","payload","JSON","parse","content","toString","properties","handler","amqp","isQueueRouterUsable","useQueueRouter","transformDomainEventData","keys","Object","i","length","value","toISOString","buildDomainEventChannelName","publishDomainRedisEvent","client","context","destinations","json","stringify","pipeline","keyPrefix","channel","event","DomainEventName","CREATED","exec","publishDomainSocketEvent","emitter","Emitter","roomName","fullEventName","buildDomainEventFullName","in","emit","meta","roomId","publishDomainEvent","obj","prop","prototype","call"],"mappings":";;;;;;;;;;;;;;;AAAA;;;;;AAKC,IAAA,SAAAA,kBAAA,CAAA,GAAA,EAAA,GAAA,EAAA,KAAA,EAAA;;;;;;;;;;;;;AAIM,MAAMC,cAAuBC,SAAAA,KAAAA,CAAAA;AAGhCC,IAAAA,WAAAA,CAAYC,KAA4B,CAAE;QACtC,KAAK,CAACA,KAAMC,CAAAA,OAAO,EAAE;AAAEC,YAAAA,KAAAA,EAAOF,MAAME,KAAK;AAAC,SAAA,CAAA,CAAA;AAH9C,QAAAN,kBAAA,CAAA,IAAA,EAAOO,QAAP,KAAA,CAAA,CAAA,CAAA;AAKI,QAAA,IAAI,CAACA,IAAI,GAAGH,KAAAA,CAAMG,IAAI,CAAA;AAC1B,KAAA;AACJ;;ACPO,SAASC,iBAAiBJ,KAAc,EAAA;IAC3C,IAAI,CAACK,aAASL,KAAQ,CAAA,EAAA;QAClB,OAAO,KAAA,CAAA;AACX,KAAA;IAEA,IACI,OAAOA,MAAMC,OAAO,KAAK,eACzB,OAAOD,KAAAA,CAAMC,OAAO,KAAK,QAC3B,EAAA;QACE,OAAO,KAAA,CAAA;AACX,KAAA;AAEA,IAAA,IAAI,OAAOD,KAAAA,CAAMG,IAAI,KAAK,WAAa,EAAA;QACnC,OAAO,IAAA,CAAA;AACX,KAAA;AAEA,IAAA,OAAO,OAAOH,KAAMG,CAAAA,IAAI,KAAK,QAAYH,IAAAA,KAAAA,CAAMG,IAAI,KAAK,IAAA,CAAA;AAC5D;;ACjBO,SAASG,eAAeN,KAAc,EAAA;AACzC,IAAA,OAAOK,YAASL,CAAAA,KAAAA,CAAAA,IACZO,kBAAeP,CAAAA,KAAAA,EAAO,WACtBK,YAASL,CAAAA,KAAAA,CAAMQ,IAAI,CAAA,IACnBD,kBAAeP,CAAAA,KAAAA,EAAO,UACtBK,CAAAA,IAAAA,YAAAA,CAASL,MAAMS,QAAQ,CAAA,CAAA;AAC/B;;AChBA;;;;;AAKC,IAAAC,wCAAA;AAEWA,CAAAA,SAAAA,sBAAAA,EAAAA;;;GAAAA,8BAAAA,KAAAA,8BAAAA,GAAAA,EAAAA,CAAAA,CAAAA;;ACGL,SAASC,+BACZX,KAA8B,EAAA;IAE9B,OAAO;QACHY,EAAIZ,EAAAA,KAAAA,CAAMY,EAAE,IAAIC,gBAAAA,EAAAA;AAChBC,QAAAA,IAAAA,EAAMd,MAAMc,IAAI;QAChBN,IAAMR,EAAAA,KAAAA,CAAMQ,IAAI,IAAI,EAAC;QACrBC,QAAU,EAAA;AACNM,YAAAA,SAAAA,EAAWC,KAAKC,GAAG,EAAA;AACnB,YAAA,GAAGjB,MAAMS,QAAQ;AACrB,SAAA;AACJ,KAAA,CAAA;AACJ,CAAA;AAEO,SAASS,qBAAqBlB,KAAc,EAAA;IAC/C,OAAOK,YAAAA,CAASL,KACZ,CAAA,IAAA,OAAOA,KAAMY,CAAAA,EAAE,KAAK,QACpB,IAAA,OAAOZ,KAAMc,CAAAA,IAAI,KAAK,QAAA,IACtBP,mBAAeP,KAAO,EAAA,MAAA,CAAA,IACtBK,YAASL,CAAAA,KAAAA,CAAMQ,IAAI,CAAA,IACnBD,mBAAeP,KAAO,EAAA,UAAA,CAAA,IACtBK,YAASL,CAAAA,KAAAA,CAAMS,QAAQ,CAAA,CAAA;AAC/B;;ACrBA,MAAMU,aAAWC,WAAc,CAAA;IAC3BC,IAAM,EAAA,MAAA;AACV,CAAA,CAAA,CAAA;AAEO,SAASC,qBAAqBC,OAAwB,EAAA;AACzDJ,IAAAA,UAAAA,CAASK,UAAU,CAACD,OAAAA,CAAAA,CAAAA;AACxB,CAAA;AAEO,SAASE,kBAAAA,GAAAA;AACZ,IAAA,OAAON,UAASO,CAAAA,GAAG,EAAMP,IAAAA,UAAAA,CAASQ,UAAU,EAAA,CAAA;AAChD,CAAA;AAEO,SAASC,aAAAA,GAAAA;AACZ,IAAA,OAAOT,WAASU,GAAG,EAAA,CAAA;AACvB;;ACdA,MAAMV,aAAWC,WAAmB,CAAA;IAChCC,IAAM,EAAA,OAAA;AACV,CAAA,CAAA,CAAA;AAEO,SAASS,gBAAgBP,OAA6B,EAAA;AACzDJ,IAAAA,UAAAA,CAASK,UAAU,CAACD,OAAAA,CAAAA,CAAAA;AACxB,CAAA;AAEO,SAASQ,mBAAAA,GAAAA;AACZ,IAAA,OAAOZ,UAASO,CAAAA,GAAG,EAAMP,IAAAA,UAAAA,CAASQ,UAAU,EAAA,CAAA;AAChD,CAAA;AAEO,SAASK,cAAAA,GAAAA;AACZ,IAAA,OAAOb,WAASU,GAAG,EAAA,CAAA;AACvB;;ACfO,SAASI,8BAAAA,GAAAA;IACZ,IAAIC,OAAAA,CAAAA;AACJ,IAAA,IAAIH,mBAAuB,EAAA,EAAA;QACvBG,OAAU,GAAA;YACNpB,IAAM,EAAA,cAAA;YACNO,IAAM,EAAA,QAAA;YACNc,KAAOH,EAAAA,cAAAA,EAAAA;AACX,SAAA,CAAA;KACG,MAAA;QACHE,OAAU,GAAA;YACNpB,IAAM,EAAA,MAAA;YACNO,IAAM,EAAA,OAAA;YACNe,QAAU,EAAA,UAAA;AACd,SAAA,CAAA;AACJ,KAAA;IAEA,OAAOF,OAAAA,CAAAA;AACX;;ACRO,MAAMG,YAAqBC,SAAAA,kBAAAA,CAAAA;IAC9BvC,WAAYmC,CAAAA,OAAAA,GAA+B,EAAE,CAAE;AAC3C,QAAA,KAAK,CAACA,OAAAA,CAAAA,CAAAA;QAEN,IAAIK,SAAAA,CAAAA;QACJ,IAAIL,OAAAA,CAAQK,SAAS,EAAE;AACnBA,YAAAA,SAAAA,GAAYL,QAAQK,SAAS,CAAA;AAC7BA,YAAAA,SAAAA,CAAUC,OAAO,GAAGD,SAAAA,CAAUC,OAAO,IAAIN,QAAQM,OAAO,CAAA;SACrD,MAAA;AACH,YAAA,MAAMC,YAAeR,GAAAA,8BAAAA,EAAAA,CAAAA;YACrBM,SAAY,GAAA;AACRC,gBAAAA,OAAAA,EAASN,QAAQM,OAAO;AACxBC,gBAAAA,YAAAA;AACJ,aAAA,CAAA;AACJ,SAAA;AAEAC,QAAAA,6CAAAA,CAAkC,IAAI,EAAEH,SAAAA,CAAAA,CAAAA;AAC5C,KAAA;AACJ;;AC1BA,MAAMpB,aAAWC,WAAc,CAAA;IAC3BC,IAAM,EAAA,QAAA;AACV,CAAA,CAAA,CAAA;AAEO,SAASsB,eAAAA,GAAAA;AACZ,IAAA,OAAOxB,WAASU,GAAG,EAAA,CAAA;AACvB,CAAA;AAEO,SAASe,oBAAAA,GAAAA;AACZ,IAAA,OAAOzB,UAASO,CAAAA,GAAG,EAAMP,IAAAA,UAAAA,CAASQ,UAAU,EAAA,CAAA;AAChD,CAAA;AAEO,SAASkB,uBAAuBtB,OAAwB,EAAA;AAC3DJ,IAAAA,UAAAA,CAASK,UAAU,CAACD,OAAAA,CAAAA,CAAAA;AACxB;;ACXO,SAASuB,YAAAA,CAAaC,GAA2B,GAAA,EAAE,EAAA;AACtD,IAAA,MAAM,EAAEC,SAAS,EAAEd,UAAU,EAAE,EAAE,GAAGa,GAAAA,CAAAA;IAEpC,IAAIE,gBAAAA,CAAAA;AACJ,IAAA,IAAIC,UAAK,CAAA,KAAA,CAAA,KAAWC,gCAAgBC,CAAAA,UAAU,EAAE;QAC5CH,gBAAmB,GAAA;YACf,IAAII,kBAAAA,CAAWC,OAAO,CAAC;gBACnBC,KAAO,EAAA,MAAA;AACX,aAAA,CAAA;YACA,IAAIF,kBAAAA,CAAWG,IAAI,CAAC;AAChBC,gBAAAA,QAAAA,EAAUC,KAAKC,IAAI,CAACX,SAAaY,IAAAA,OAAAA,CAAQC,GAAG,EAAI,EAAA,YAAA,CAAA;gBAChDN,KAAO,EAAA,MAAA;AACPO,gBAAAA,OAAAA,EAAS,KAAK,IAAO,GAAA,IAAA;gBACrBC,QAAU,EAAA,CAAA;AACd,aAAA,CAAA;YACA,IAAIV,kBAAAA,CAAWG,IAAI,CAAC;AAChBC,gBAAAA,QAAAA,EAAUC,KAAKC,IAAI,CAACX,SAAaY,IAAAA,OAAAA,CAAQC,GAAG,EAAI,EAAA,WAAA,CAAA;gBAChDN,KAAO,EAAA,MAAA;AACPO,gBAAAA,OAAAA,EAAS,KAAK,IAAO,GAAA,IAAA;gBACrBC,QAAU,EAAA,CAAA;AACd,aAAA,CAAA;AACH,SAAA,CAAA;KACE,MAAA;QACHd,gBAAmB,GAAA;YACf,IAAII,kBAAAA,CAAWC,OAAO,CAAC;gBACnBC,KAAO,EAAA,OAAA;AACX,aAAA,CAAA;AACH,SAAA,CAAA;AACL,KAAA;AAEA,IAAA,OAAOS,oBAAO,CAAA;QACVC,MAAQA,EAAAA,cAAAA,CAAOC,OAAO,CAClBD,cAAOlD,CAAAA,SAAS,IAChBkD,cAAOE,CAAAA,QAAQ,EACfF,EAAAA,cAAAA,CAAOG,MAAM,EAAA,CAAA;QAEjBb,KAAO,EAAA,OAAA;QACPF,UAAYJ,EAAAA,gBAAAA;;QAEZ,GAAIf,OAAAA,IAAW,EAAE;AACrB,KAAA,CAAA,CAAA;AACJ;;AC7CA,MAAMf,aAAWC,WAAc,CAAA;IAC3BC,IAAM,EAAA,QAAA;AACV,CAAA,CAAA,CAAA;AAEO,SAASgD,iBAAiB9C,OAAwB,EAAA;AACrDJ,IAAAA,UAAAA,CAASK,UAAU,CAACD,OAAAA,CAAAA,CAAAA;AACxB,CAAA;AAEO,SAAS+C,cAAAA,GAAAA;AACZ,IAAA,OAAOnD,UAASO,CAAAA,GAAG,EAAMP,IAAAA,UAAAA,CAASQ,UAAU,EAAA,CAAA;AAChD,CAAA;AAEO,SAAS4C,UAAUvE,KAAa,EAAA;AACnCmB,IAAAA,UAAAA,CAASqD,GAAG,CAACxE,KAAAA,CAAAA,CAAAA;AACjB,CAAA;AAEO,SAASyE,SAAAA,GAAAA;AACZ,IAAA,OAAOtD,WAASU,GAAG,EAAA,CAAA;AACvB;;ACjBA,MAAMV,aAAWC,WAAc,CAAA;IAC3BC,IAAM,EAAA,OAAA;AACV,CAAA,CAAA,CAAA;AAEO,SAASqD,gBAAgBnD,OAAwB,EAAA;AACpDJ,IAAAA,UAAAA,CAASK,UAAU,CAACD,OAAAA,CAAAA,CAAAA;AACxB,CAAA;AAEO,SAASoD,mBAAAA,GAAAA;AACZ,IAAA,OAAOxD,UAASO,CAAAA,GAAG,EAAMP,IAAAA,UAAAA,CAASQ,UAAU,EAAA,CAAA;AAChD,CAAA;AAEO,SAASiD,eAAe5E,KAAa,EAAA;AACxCmB,IAAAA,UAAAA,CAASqD,GAAG,CAACxE,KAAAA,CAAAA,CAAAA;AACjB,CAAA;AAEO,SAAS6E,cAAAA,GAAAA;AACZ,IAAA,OAAO1D,WAASU,GAAG,EAAA,CAAA;AACvB;;AClBA,MAAMV,aAAWC,WAAc,CAAA;IAC3BC,IAAM,EAAA,cAAA;IACNE,OAAS,EAAA,IAAMsD,iBAAiBC,SAAS,EAAA;AAC7C,CAAA,CAAA,CAAA;AAEO,SAASC,qBAAAA,GAAAA;AACZ,IAAA,OAAO5D,WAASU,GAAG,EAAA,CAAA;AACvB;;ACPA,MAAMV,aAAWC,WAAc,CAAA;IAC3BC,IAAM,EAAA,gBAAA;IACNE,OAAS,EAAA,IAAMsD,iBAAiBC,SAAS,EAAA;AAC7C,CAAA,CAAA,CAAA;AAEO,SAASE,uBAAAA,GAAAA;AACZ,IAAA,OAAO7D,WAASU,GAAG,EAAA,CAAA;AACvB;;AClBA;;;;;AAKC,IAAA,SAAA,gBAAA,CAAA,GAAA,EAAA,GAAA,EAAA,KAAA,EAAA;;;;;;;;;;;;;AAaM,MAAMoD,WAAAA,CAAAA;;AAWTC,IAAAA,OAAAA,CAAQjF,OAA2B,EAAqB;QACpD,IAAIkF,QAAAA,CAAAA;AACJ,QAAA,IAAIlF,QAAQQ,QAAQ,CAAC2E,OAAO,CAACtE,IAAI,KAAK,MAAQ,EAAA;AAC1CqE,YAAAA,QAAAA,GAAW,IAAI,CAACE,MAAM,CAACC,EAAE,CAAC;AACtBxE,gBAAAA,IAAAA,EAAMyE,2BAAaC,MAAM;AACzBnE,gBAAAA,IAAAA,EAAMpB,QAAQQ,QAAQ,CAAC2E,OAAO,CAACK,SAAS,IAAI,EAAA;AAChD,aAAA,CAAA,CAAA;SACG,MAAA;AACHN,YAAAA,QAAAA,GAAW,IAAI,CAACE,MAAM,CAACC,EAAE,CAAC;AACtBxE,gBAAAA,IAAAA,EAAMyE,2BAAaG,KAAK;AACxBrE,gBAAAA,IAAAA,EAAMpB,QAAQQ,QAAQ,CAAC2E,OAAO,CAACK,SAAS,IAAI,OAAA;AAChD,aAAA,CAAA,CAAA;AACJ,SAAA;AAEA,QAAA,IAAInB,cAAkB,EAAA,EAAA;AAClBG,YAAAA,SAAAA,EAAAA,CACKkB,KAAK,CAAC,CAAC,yBAAyB,EAAE1F,QAAQa,IAAI,CAAC,IAAI,EAAEb,QAAQQ,QAAQ,CAAC2E,OAAO,CAACQ,GAAG,CAAC,CAAC,CAAA,CAAA;AAC5F,SAAA;QAEA,OAAOT,QAAAA,CAASD,OAAO,CAACjF,OAAQQ,CAAAA,QAAQ,CAAC2E,OAAO,CAACQ,GAAG,EAAE3F,OAAS,EAAA;AAC3Da,YAAAA,IAAAA,EAAMb,QAAQa,IAAI;AAClB+E,YAAAA,SAAAA,EAAW5F,QAAQW,EAAE;AACrBkF,YAAAA,UAAAA,EAAY7F,OAAQQ,CAAAA,QAAQ,CAACqF,UAAU,IACnC7F,OAAAA,CAAQQ,QAAQ,CAAC2E,OAAO,CAACtE,IAAI,KAAKJ,+BAAuBqF,IAAI;AACrE,SAAA,CAAA,CAAA;AACJ,KAAA;IAEAC,OAAQZ,CAAAA,OAA2B,EAAEa,QAA6B,EAAkB;QAChF,IAAId,QAAAA,CAAAA;QACJ,IAAIC,OAAAA,CAAQtE,IAAI,KAAK,MAAQ,EAAA;AACzBqE,YAAAA,QAAAA,GAAW,IAAI,CAACE,MAAM,CAACC,EAAE,CAAC;AACtBxE,gBAAAA,IAAAA,EAAMyE,2BAAaC,MAAM;gBACzBnE,IAAM+D,EAAAA,OAAAA,CAAQK,SAAS,IAAI,EAAA;AAC/B,aAAA,CAAA,CAAA;SACG,MAAA;AACHN,YAAAA,QAAAA,GAAW,IAAI,CAACE,MAAM,CAACC,EAAE,CAAC;AACtBxE,gBAAAA,IAAAA,EAAMyE,2BAAaG,KAAK;gBACxBrE,IAAM+D,EAAAA,OAAAA,CAAQK,SAAS,IAAI,OAAA;AAC/B,aAAA,CAAA,CAAA;AACJ,SAAA;AAEA,QAAA,OAAON,QAASa,CAAAA,OAAO,CAACZ,OAAAA,CAAQQ,GAAG,EAAE;AACjCM,YAAAA,aAAAA,EAAed,QAAQtE,IAAI,KAAKJ,8BAAuBqF,CAAAA,IAAI,GAAG,CAAII,GAAAA,SAAAA;;AAElEC,YAAAA,gBAAAA,EAAkBhB,OAAQtE,CAAAA,IAAI,KAAKJ,8BAAAA,CAAuBqF,IAAI;SAC/D,EAAA;AACCM,YAAAA,IAAAA,EAAM,OAAOrG,KAAAA,GAAAA;gBACT,MAAMsG,OAAAA,GAAUC,KAAKC,KAAK,CAACxG,MAAMyG,OAAO,CAACC,QAAQ,CAAC,OAAA,CAAA,CAAA,CAAA;gBAClD,IAAI,CAACxF,qBAAqBoF,OAAU,CAAA,EAAA;AAChC,oBAAA,OAAA;AACJ,iBAAA;AAEA,gBAAA,IAAIhC,cAAkB,EAAA,EAAA;AAClBG,oBAAAA,SAAAA,EAAAA,CACKkB,KAAK,CAAC,CAAC,wBAAwB,EAAE3F,KAAM2G,CAAAA,UAAU,CAAC7F,IAAI,CAAC,IAAI,EAAEsE,OAAQQ,CAAAA,GAAG,CAAC,CAAC,CAAA,CAAA;AACnF,iBAAA;gBAEA,IAAIgB,OAAAA,CAAAA;AAEJ,gBAAA,IACI,OAAO5G,KAAAA,CAAM2G,UAAU,CAAC7F,IAAI,KAAK,QAAA,IACjCmF,QAAQ,CAACjG,KAAM2G,CAAAA,UAAU,CAAC7F,IAAI,CAAC,EACjC;AACE8F,oBAAAA,OAAAA,GAAUX,QAAQ,CAACjG,KAAAA,CAAM2G,UAAU,CAAC7F,IAAI,CAAC,CAAA;iBACtC,MAAA;AACH8F,oBAAAA,OAAAA,GAAUX,SAASI,IAAI,CAAA;AAC3B,iBAAA;gBAEA,IAAI,OAAOO,YAAY,UAAY,EAAA;AAC/B,oBAAA,IAAItC,cAAkB,EAAA,EAAA;AAClBG,wBAAAA,SAAAA,EAAAA,CACKkB,KAAK,CAAC,CAAC,oCAAoC,EAAE3F,KAAM2G,CAAAA,UAAU,CAAC7F,IAAI,CAAC,IAAI,EAAEsE,OAAQQ,CAAAA,GAAG,CAAC,CAAC,CAAA,CAAA;AAC/F,qBAAA;AAEA,oBAAA,OAAA;AACJ,iBAAA;AAEA,gBAAA,MAAMgB,OAAQN,CAAAA,OAAAA,CAAAA,CAAAA;AAClB,aAAA;AACJ,SAAA,CAAA,CAAA;AACJ,KAAA;;AAtFAvG,IAAAA,WAAAA,CAAYsF,MAAc,CAAE;AAJ5B,QAAA,gBAAA,CAAA,IAAA,EAAUA,UAAV,KAAA,CAAA,CAAA,CAAA;QAKI,IAAI,CAACA,MAAM,GAAGA,MAAAA,CAAAA;AAClB,KAAA;AAqFJ;;ACnGA,MAAMlE,WAAWC,WAAmB,CAAA;IAChCC,IAAM,EAAA,aAAA;IACNE,OAAS,EAAA,IAAA;AACL,QAAA,MAAMsF,IAAOjF,GAAAA,aAAAA,EAAAA,CAAAA;AAEb,QAAA,OAAO,IAAIqD,WAAY4B,CAAAA,IAAAA,CAAAA,CAAAA;AAC3B,KAAA;AACJ,CAAA,CAAA,CAAA;AAEO,SAASC,mBAAAA,GAAAA;IACZ,OAAO3F,QAAAA,CAASO,GAAG,EAAMD,IAAAA,kBAAAA,EAAAA,CAAAA;AAC7B,CAAA;AAEO,SAASsF,cAAAA,GAAAA;AACZ,IAAA,OAAO5F,SAASU,GAAG,EAAA,CAAA;AACvB;;AChBO,SAASmF,yBAA4BhH,KAAQ,EAAA;AAChD,IAAA,IAAIK,aAASL,KAAQ,CAAA,EAAA;QACjB,MAAMiH,IAAAA,GAAOC,MAAOD,CAAAA,IAAI,CAACjH,KAAAA,CAAAA,CAAAA;AACzB,QAAA,IAAK,IAAImH,CAAI,GAAA,CAAA,EAAGA,IAAIF,IAAKG,CAAAA,MAAM,EAAED,CAAK,EAAA,CAAA;AAClC,YAAA,MAAME,QAAQrH,KAAK,CAACiH,IAAI,CAACE,EAAE,CAAC,CAAA;AAC5B,YAAA,IAAIE,iBAAiBrG,IAAM,EAAA;AACvBhB,gBAAAA,KAAK,CAACiH,IAAI,CAACE,EAAE,CAAC,GAAGE,MAAMC,WAAW,EAAA,CAAA;AACtC,aAAA;AACJ,SAAA;AACJ,KAAA;IAEA,OAAOtH,KAAAA,CAAAA;AACX,CAAA;AAEO,SAASuH,2BAAAA,CACZvH,KAA6B,EAC7BY,EAAoB,EAAA;IAEpB,IAAI,OAAOZ,UAAU,QAAU,EAAA;QAC3B,OAAOA,KAAAA,CAAAA;AACX,KAAA;AAEA,IAAA,OAAOA,KAAMY,CAAAA,EAAAA,CAAAA,CAAAA;AACjB;;ACpBO,eAAe4G,uBAClBC,CAAAA,MAAc,EACdC,OAA4B,EAC5BC,YAAqC,EAAA;AAErCD,IAAAA,OAAAA,GAAUV,wBAAyBU,CAAAA,OAAAA,CAAAA,CAAAA;IAEnC,MAAME,IAAAA,GAAOrB,IAAKsB,CAAAA,SAAS,CAACH,OAAAA,CAAAA,CAAAA;IAE5B,MAAMI,QAAAA,GAAWL,OAAOK,QAAQ,EAAA,CAAA;AAChC,IAAA,IAAK,IAAIX,CAAI,GAAA,CAAA,EAAGA,IAAIQ,YAAaP,CAAAA,MAAM,EAAED,CAAK,EAAA,CAAA;AAC1C,QAAA,MAAM,EAAE1B,SAAS,EAAE,GAAGkC,YAAY,CAACR,CAAE,CAAA,CAAA;AACrC,QAAA,MAAMY,YAAatC,SAAY,GAAA,CAAC,EAAEA,SAAU,CAAA,CAAC,CAAC,GAAG,EAAA,CAAA;AAEjD,QAAA,IAAIG,MAAMmC,SAAYR,GAAAA,2BAAAA,CAA4BI,YAAY,CAACR,CAAAA,CAAE,CAACa,OAAO,CAAA,CAAA;QACzEF,QAAS5C,CAAAA,OAAO,CAACU,GAAKgC,EAAAA,IAAAA,CAAAA,CAAAA;AAEtB,QAAA,IACIF,OAAQO,CAAAA,KAAK,KAAKC,uBAAAA,CAAgBC,OAAO,IACzC,OAAOR,YAAY,CAACR,CAAAA,CAAE,CAACa,OAAO,KAAK,UACrC,EAAA;YACEpC,GAAMmC,GAAAA,SAAAA,GAAYR,2BAA4BI,CAAAA,YAAY,CAACR,CAAAA,CAAE,CAACa,OAAO,EAAEN,OAAAA,CAAQlH,IAAI,CAACI,EAAE,CAAA,CAAA;YACtFkH,QAAS5C,CAAAA,OAAO,CAACU,GAAKgC,EAAAA,IAAAA,CAAAA,CAAAA;AAC1B,SAAA;AACJ,KAAA;AAEA,IAAA,OAAOE,SAASM,IAAI,EAAA,CAAA;AACxB;;AC1BO,SAASC,wBACZZ,CAAAA,MAAc,EACdC,OAA4B,EAC5BC,YAAqC,EAAA;AAErCD,IAAAA,OAAAA,GAAUV,wBAAyBU,CAAAA,OAAAA,CAAAA,CAAAA;AAEnC,IAAA,IAAK,IAAIP,CAAI,GAAA,CAAA,EAAGA,IAAIQ,YAAaP,CAAAA,MAAM,EAAED,CAAK,EAAA,CAAA;QAC1C,IAAImB,OAAAA,GAAU,IAAIC,oBAAQd,CAAAA,MAAAA,CAAAA,CAAAA;AAC1B,QAAA,IAAIE,YAAY,CAACR,CAAE,CAAA,CAAC1B,SAAS,EAAE;AAC3B6C,YAAAA,OAAAA,GAAUA,QAAQhD,EAAE,CAACqC,YAAY,CAACR,CAAAA,CAAE,CAAC1B,SAAS,CAAA,CAAA;AAClD,SAAA;AAEA,QAAA,IAAI+C,WAAWjB,2BAA4BI,CAAAA,YAAY,CAACR,CAAAA,CAAE,CAACa,OAAO,CAAA,CAAA;AAElE,QAAA,MAAMS,gBAAgBC,gCAAyBhB,CAAAA,OAAAA,CAAQ5G,IAAI,EAAE4G,QAAQO,KAAK,CAAA,CAAA;AAE1EK,QAAAA,OAAAA,CACKK,EAAE,CAACH,QACHI,CAAAA,CAAAA,IAAI,CAACH,aAAe,EAAA;AACjB,YAAA,GAAGf,OAAO;YACVmB,IAAM,EAAA;AACFL,gBAAAA,QAAAA;AACJ,aAAA;AACJ,SAAA,CAAA,CAAA;AAEJ,QAAA,IACId,OAAQO,CAAAA,KAAK,KAAKC,uBAAAA,CAAgBC,OAAO,IACzC,OAAOR,YAAY,CAACR,CAAAA,CAAE,CAACa,OAAO,KAAK,UACrC,EAAA;YACEQ,QAAWjB,GAAAA,2BAAAA,CAA4BI,YAAY,CAACR,CAAE,CAAA,CAACa,OAAO,EAAEN,OAAAA,CAAQlH,IAAI,CAACI,EAAE,CAAA,CAAA;AAC/E0H,YAAAA,OAAAA,CACKK,EAAE,CAACH,QACHI,CAAAA,CAAAA,IAAI,CAACH,aAAe,EAAA;AACjB,gBAAA,GAAGf,OAAO;gBACVmB,IAAM,EAAA;AACFL,oBAAAA,QAAAA;oBACAM,MAAQpB,EAAAA,OAAAA,CAAQlH,IAAI,CAACI,EAAE;AAC3B,iBAAA;AACJ,aAAA,CAAA,CAAA;AACR,SAAA;AACJ,KAAA;AACJ;;AC3CO,eAAemI,kBAClBtB,CAAAA,MAAc,EACdC,OAA4B,EAC5BC,YAAqC,EAAA;IAErC,MAAMH,uBAAAA,CAAwBC,QAAQC,OAASC,EAAAA,YAAAA,CAAAA,CAAAA;AAC/CU,IAAAA,wBAAAA,CAAyBZ,QAAQC,OAASC,EAAAA,YAAAA,CAAAA,CAAAA;AAC9C;;ACpBA;;;;;AAKC,IAEM,SAASpH,cACZyI,CAAAA,GAAM,EACNC,IAAO,EAAA;AAEP,IAAA,OAAO/B,OAAOgC,SAAS,CAAC3I,cAAc,CAAC4I,IAAI,CAACH,GAAKC,EAAAA,IAAAA,CAAAA,CAAAA;AACrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/core/memory-cache/module.ts","../src/core/memory-cache/singleton.ts","../src/core/component/error.ts","../src/core/component/helper.ts","../src/core/queue/utils.ts","../src/core/queue-router/constants.ts","../src/core/queue-router/helpers.ts","../src/services/amqp/module.ts","../src/services/vault/singleton.ts","../src/services/authup/helpers.ts","../src/services/authup/module.ts","../src/services/authup/singleton.ts","../src/services/logger/module.ts","../src/services/logger/singleton.ts","../src/services/redis/singleton.ts","../src/services/redis/singleton-publish.ts","../src/services/redis/singleton-subscribe.ts","../src/core/queue-router/module.ts","../src/core/queue-router/singleton.ts","../src/domain-event/utils.ts","../src/domain-event/redis/publish.ts","../src/domain-event/socket/publish.ts","../src/domain-event/publish.ts","../src/utils/has-property.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport TTLCache from '@isaacs/ttlcache';\n\ntype BlockerOptions = {\n ttl: number;\n};\n\nexport class MemoryCache<\n KEY extends string = string,\n VALUE = any,\n> {\n protected options : BlockerOptions;\n\n protected cache : TTLCache<KEY, VALUE>;\n\n constructor(options: Partial<BlockerOptions> = {}) {\n this.options = {\n // 60 seconds\n ttl: 1000 * 60,\n ...options,\n };\n this.cache = new TTLCache<KEY, VALUE>();\n }\n\n set(id: KEY, value: VALUE, options: BlockerOptions) {\n this.cache.set(id, value, {\n ttl: options.ttl,\n });\n }\n\n get(id: KEY): VALUE | undefined {\n return this.cache.get(id);\n }\n\n del(id: KEY) : void {\n this.cache.delete(id);\n }\n\n has(id: KEY) : boolean {\n return this.cache.has(id);\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { singa } from 'singa';\nimport { MemoryCache } from './module';\n\nconst instance = singa<MemoryCache>({\n name: 'queueRouter',\n factory: () => new MemoryCache(),\n});\n\nexport function useMemoryCache() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ComponentErrorOptions } from './type';\n\nexport class ComponentError extends Error {\n public code?: string | null;\n\n constructor(input: ComponentErrorOptions) {\n super(input.message, { cause: input.cause });\n\n this.code = input.code;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@privateaim/kit';\nimport type { ComponentError } from './error';\n\nexport function isComponentError(input: unknown) : input is ComponentError {\n if (!isObject(input)) {\n return false;\n }\n\n if (\n typeof input.message !== 'undefined' &&\n typeof input.message !== 'string'\n ) {\n return false;\n }\n\n if (typeof input.code === 'undefined') {\n return true;\n }\n\n return typeof input.code === 'string' || input.code === null;\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty, isObject } from '@privateaim/kit';\nimport type { QueuePayload } from './type';\n\nexport function isQueuePayload(input: unknown) : input is QueuePayload {\n return isObject(input) &&\n hasOwnProperty(input, 'data') &&\n isObject(input.data) &&\n hasOwnProperty(input, 'metadata') &&\n isObject(input.metadata);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum QueueRouterRoutingType {\n WORK = 'work',\n PUB_SUB = 'pubSub',\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createNanoID, hasOwnProperty, isObject } from '@privateaim/kit';\nimport type { QueueRouterPayload, QueueRouterPayloadInput } from './types';\n\nexport function buildQueueRouterPublishPayload(\n input: QueueRouterPayloadInput,\n) : QueueRouterPayload {\n return {\n id: input.id || createNanoID(),\n type: input.type,\n data: input.data || {},\n metadata: {\n timestamp: Date.now(),\n ...input.metadata,\n },\n };\n}\n\nexport function isQueueRouterPayload(input: unknown) : input is QueueRouterPayload {\n return isObject(input) &&\n typeof input.id === 'string' &&\n typeof input.type === 'string' &&\n hasOwnProperty(input, 'data') &&\n isObject(input.data) &&\n hasOwnProperty(input, 'metadata') &&\n isObject(input.metadata);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'amqp-extension';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'amqp',\n});\n\nexport function setAmqpClientFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n\nexport function isAmqpClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function useAmqpClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\nimport type { VaultClient } from '@hapic/vault';\n\nconst instance = singa<VaultClient>({\n name: 'vault',\n});\n\nexport function setVaultFactory(factory: Factory<VaultClient>) {\n instance.setFactory(factory);\n}\n\nexport function isVaultClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function useVaultClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { TokenCreatorOptions } from '@authup/core-http-kit';\nimport { isVaultClientUsable, useVaultClient } from '../vault';\n\nexport function guessAuthupTokenCreatorOptions() : TokenCreatorOptions {\n let options : TokenCreatorOptions;\n if (isVaultClientUsable()) {\n options = {\n type: 'robotInVault',\n name: 'system',\n vault: useVaultClient(),\n };\n } else {\n options = {\n type: 'user',\n name: 'admin',\n password: 'start123',\n };\n }\n\n return options;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientResponseErrorTokenHookOptions } from '@authup/core-http-kit';\nimport {\n Client, mountClientResponseErrorTokenHook as mountAuthupClientResponseErrorTokenHook,\n mountClientResponseErrorTokenHook,\n} from '@authup/core-http-kit';\nimport { guessAuthupTokenCreatorOptions } from './helpers';\nimport type { AuthupClientOptions } from './types';\n\nexport {\n mountAuthupClientResponseErrorTokenHook,\n};\n\nexport class AuthupClient extends Client {\n constructor(options: AuthupClientOptions = {}) {\n super(options);\n\n let tokenHook : ClientResponseErrorTokenHookOptions;\n if (options.tokenHook) {\n tokenHook = options.tokenHook;\n tokenHook.baseURL = tokenHook.baseURL || options.baseURL;\n } else {\n const tokenCreator = guessAuthupTokenCreatorOptions();\n tokenHook = {\n baseURL: options.baseURL,\n tokenCreator,\n };\n }\n\n mountClientResponseErrorTokenHook(this, tokenHook);\n }\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-http-kit';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'authup',\n});\n\nexport function useAuthupClient() {\n return instance.use();\n}\n\nexport function isAuthupClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setAuthupClientFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { read } from 'envix';\nimport path from 'node:path';\nimport { EnvironmentName } from 'typeorm-extension';\nimport type { Logger } from 'winston';\nimport { createLogger as create, format, transports } from 'winston';\nimport type { LoggerCreateContext, LoggerTransports } from './types';\n\nexport function createLogger(ctx: LoggerCreateContext = {}) : Logger {\n const { directory, options = {} } = ctx;\n\n let loggerTransports : LoggerTransports;\n if (read('env') === EnvironmentName.PRODUCTION) {\n loggerTransports = [\n new transports.Console({\n level: 'info',\n }),\n new transports.File({\n filename: path.join(directory || process.cwd(), 'access.log'),\n level: 'http',\n maxsize: 10 * 1024 * 1024, // 10MB\n maxFiles: 5,\n }),\n new transports.File({\n filename: path.join(directory || process.cwd(), 'error.log'),\n level: 'warn',\n maxsize: 10 * 1024 * 1024, // 10MB\n maxFiles: 5,\n }),\n ];\n } else {\n loggerTransports = [\n new transports.Console({\n level: 'debug',\n }),\n ];\n }\n\n return create({\n format: format.combine(\n format.errors({ stack: true }),\n format.timestamp(),\n format.colorize(),\n format.simple(),\n ),\n level: 'debug',\n transports: loggerTransports,\n // todo: deeply merge options\n ...(options || {}),\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { type Factory, singa } from 'singa';\nimport type { Logger } from 'winston';\n\nconst instance = singa<Logger>({\n name: 'logger',\n});\n\nexport function setLoggerFactory(factory: Factory<Logger>) {\n instance.setFactory(factory);\n}\n\nexport function isLoggerUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setLogger(input: Logger) {\n instance.set(input);\n}\n\nexport function useLogger() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'redis',\n});\n\nexport function setRedisFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n\nexport function isRedisClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setRedisClient(input: Client) {\n instance.set(input);\n}\n\nexport function useRedisClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport { singa } from 'singa';\nimport { useRedisClient } from './singleton';\n\nconst instance = singa<Client>({\n name: 'redisPublish',\n factory: () => useRedisClient().duplicate(),\n});\n\nexport function useRedisPublishClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport { singa } from 'singa';\nimport { useRedisClient } from './singleton';\n\nconst instance = singa<Client>({\n name: 'redisSubscribe',\n factory: () => useRedisClient().duplicate(),\n});\n\nexport function useRedisSubscribeClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ExchangeType } from 'amqp-extension';\nimport type { Client } from 'amqp-extension';\nimport { isLoggerUsable, useLogger } from '../../services';\nimport { QueueRouterRoutingType } from './constants';\nimport { isQueueRouterPayload } from './helpers';\nimport type {\n QueueRouterHandler,\n QueueRouterHandlers,\n QueueRouterPayload, QueueRouterRouting,\n} from './types';\n\nexport class QueueRouter {\n protected driver : Client;\n\n //----------------------------------------------------------------\n\n constructor(driver: Client) {\n this.driver = driver;\n }\n\n //----------------------------------------------------------------\n\n publish(message: QueueRouterPayload) : Promise<boolean> {\n let exchange : Client;\n if (message.metadata.routing.type === 'work') {\n exchange = this.driver.of({\n type: ExchangeType.DIRECT,\n name: message.metadata.routing.namespace || '',\n });\n } else {\n exchange = this.driver.of({\n type: ExchangeType.TOPIC,\n name: message.metadata.routing.namespace || 'FLAME',\n });\n }\n\n if (isLoggerUsable()) {\n useLogger()\n .debug(`Publishing queue message ${message.type} in ${message.metadata.routing.key}`);\n }\n\n return exchange.publish(message.metadata.routing.key, message, {\n type: message.type,\n messageId: message.id,\n persistent: message.metadata.persistent ??\n message.metadata.routing.type === QueueRouterRoutingType.WORK,\n });\n }\n\n consume(routing: QueueRouterRouting, handlers: QueueRouterHandlers) : Promise<void> {\n let exchange : Client;\n if (routing.type === 'work') {\n exchange = this.driver.of({\n type: ExchangeType.DIRECT,\n name: routing.namespace || '',\n });\n } else {\n exchange = this.driver.of({\n type: ExchangeType.TOPIC,\n name: routing.namespace || 'FLAME',\n });\n }\n\n return exchange.consume(routing.key, {\n prefetchCount: routing.type === QueueRouterRoutingType.WORK ? 1 : undefined,\n // noAck: routing.type !== QueueRouterRoutingType.WORK,\n requeueOnFailure: routing.type === QueueRouterRoutingType.WORK,\n }, {\n $any: async (input) => {\n const payload = JSON.parse(input.content.toString('utf-8'));\n if (!isQueueRouterPayload(payload)) {\n return;\n }\n\n if (input.fields.redelivered) {\n if (isLoggerUsable()) {\n useLogger()\n .debug(`Queue message ${input.properties.type} in ${routing.key} is not processed again.`);\n }\n\n return;\n }\n\n if (isLoggerUsable()) {\n useLogger()\n .debug(`Consuming queue message ${input.properties.type} in ${routing.key}`);\n }\n\n let handler : QueueRouterHandler | undefined;\n\n if (\n typeof input.properties.type === 'string' &&\n handlers[input.properties.type]\n ) {\n handler = handlers[input.properties.type];\n } else {\n handler = handlers.$any;\n }\n\n if (typeof handler !== 'function') {\n if (isLoggerUsable()) {\n useLogger()\n .debug(`No queue handler to consume message ${input.properties.type} in ${routing.key}`);\n }\n\n return;\n }\n\n await handler(payload);\n },\n });\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { singa } from 'singa';\nimport { isAmqpClientUsable, useAmqpClient } from '../../services';\nimport { QueueRouter } from './module';\n\nconst instance = singa<QueueRouter>({\n name: 'queueRouter',\n factory: () => {\n const amqp = useAmqpClient();\n\n return new QueueRouter(amqp);\n },\n});\n\nexport function isQueueRouterUsable() {\n return instance.has() || isAmqpClientUsable();\n}\n\nexport function useQueueRouter() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@privateaim/kit';\nimport type { DomainEventChannelName } from './type';\n\nexport function transformDomainEventData<T>(input: T) : T {\n if (isObject(input)) {\n const keys = Object.keys(input);\n for (let i = 0; i < keys.length; i++) {\n const value = input[keys[i]];\n if (value instanceof Date) {\n input[keys[i]] = value.toISOString();\n }\n }\n }\n\n return input;\n}\n\nexport function buildDomainEventChannelName(\n input: DomainEventChannelName,\n id?: string | number,\n) : string {\n if (typeof input === 'string') {\n return input;\n }\n\n return input(id);\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { DomainEventName } from '@privateaim/core-kit';\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport type { Client } from 'redis-extension';\nimport type { DomainEventDestinations } from '../type';\nimport { buildDomainEventChannelName, transformDomainEventData } from '../utils';\n\nexport async function publishDomainRedisEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) : Promise<any> {\n context = transformDomainEventData(context);\n\n const json = JSON.stringify(context);\n\n const pipeline = client.pipeline();\n for (let i = 0; i < destinations.length; i++) {\n const { namespace } = destinations[i];\n const keyPrefix = (namespace ? `${namespace}:` : '');\n\n let key = keyPrefix + buildDomainEventChannelName(destinations[i].channel);\n pipeline.publish(key, json);\n\n if (\n context.event !== DomainEventName.CREATED &&\n typeof destinations[i].channel === 'function'\n ) {\n key = keyPrefix + buildDomainEventChannelName(destinations[i].channel, context.data.id);\n pipeline.publish(key, json);\n }\n }\n\n return pipeline.exec();\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport { DomainEventName, buildDomainEventFullName } from '@privateaim/core-kit';\nimport { Emitter } from '@socket.io/redis-emitter';\nimport type { Client } from 'redis-extension';\nimport type { DomainEventDestinations } from '../type';\nimport { buildDomainEventChannelName, transformDomainEventData } from '../utils';\n\nexport function publishDomainSocketEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) {\n context = transformDomainEventData(context);\n\n for (let i = 0; i < destinations.length; i++) {\n let emitter = new Emitter(client);\n if (destinations[i].namespace) {\n emitter = emitter.of(destinations[i].namespace);\n }\n\n let roomName = buildDomainEventChannelName(destinations[i].channel);\n\n const fullEventName = buildDomainEventFullName(context.type, context.event);\n\n emitter\n .in(roomName)\n .emit(fullEventName, {\n ...context,\n meta: {\n roomName,\n },\n });\n\n if (\n context.event !== DomainEventName.CREATED &&\n typeof destinations[i].channel === 'function'\n ) {\n roomName = buildDomainEventChannelName(destinations[i].channel, context.data.id);\n emitter\n .in(roomName)\n .emit(fullEventName, {\n ...context,\n meta: {\n roomName,\n roomId: context.data.id,\n },\n });\n }\n }\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport type { Client } from 'redis-extension';\nimport { publishDomainRedisEvent } from './redis';\nimport { publishDomainSocketEvent } from './socket';\nimport type { DomainEventDestinations } from './type';\n\nexport async function publishDomainEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) {\n await publishDomainRedisEvent(client, context, destinations);\n publishDomainSocketEvent(client, context, destinations);\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function hasOwnProperty<X extends Record<string, any>, Y extends PropertyKey>(\n obj: X,\n prop: Y,\n): obj is X & Record<Y, unknown> {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n"],"names":["_define_property","MemoryCache","set","id","value","options","cache","ttl","get","del","delete","has","constructor","TTLCache","instance","singa","name","factory","useMemoryCache","use","ComponentError","Error","input","message","cause","code","isComponentError","isObject","isQueuePayload","hasOwnProperty","data","metadata","QueueRouterRoutingType","buildQueueRouterPublishPayload","createNanoID","type","timestamp","Date","now","isQueueRouterPayload","setAmqpClientFactory","setFactory","isAmqpClientUsable","hasFactory","useAmqpClient","setVaultFactory","isVaultClientUsable","useVaultClient","guessAuthupTokenCreatorOptions","vault","password","AuthupClient","Client","tokenHook","baseURL","tokenCreator","mountClientResponseErrorTokenHook","useAuthupClient","isAuthupClientUsable","setAuthupClientFactory","createLogger","ctx","directory","loggerTransports","read","EnvironmentName","PRODUCTION","transports","Console","level","File","filename","path","join","process","cwd","maxsize","maxFiles","create","format","combine","errors","stack","colorize","simple","setLoggerFactory","isLoggerUsable","setLogger","useLogger","setRedisFactory","isRedisClientUsable","setRedisClient","useRedisClient","duplicate","useRedisPublishClient","useRedisSubscribeClient","QueueRouter","publish","exchange","routing","driver","of","ExchangeType","DIRECT","namespace","TOPIC","debug","key","messageId","persistent","WORK","consume","handlers","prefetchCount","undefined","requeueOnFailure","$any","payload","JSON","parse","content","toString","fields","redelivered","properties","handler","amqp","isQueueRouterUsable","useQueueRouter","transformDomainEventData","keys","Object","i","length","toISOString","buildDomainEventChannelName","publishDomainRedisEvent","client","context","destinations","json","stringify","pipeline","keyPrefix","channel","event","DomainEventName","CREATED","exec","publishDomainSocketEvent","emitter","Emitter","roomName","fullEventName","buildDomainEventFullName","in","emit","meta","roomId","publishDomainEvent","obj","prop","prototype","call"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
+ import TTLCache from '@isaacs/ttlcache';
2
+ import { singa } from 'singa';
1
3
  import { isObject, hasOwnProperty as hasOwnProperty$1, createNanoID } from '@privateaim/kit';
2
4
  import { ExchangeType } from 'amqp-extension';
3
- import { singa } from 'singa';
4
5
  export { VaultClient, createClient as createVaultClient } from '@hapic/vault';
5
6
  import { Client, mountClientResponseErrorTokenHook } from '@authup/core-http-kit';
6
7
  export { mountClientResponseErrorTokenHook as mountAuthupClientResponseErrorTokenHook } from '@authup/core-http-kit';
@@ -12,6 +13,59 @@ export { Cache as RedisCache, Client as RedisClient, ClientOptions as RedisClien
12
13
  import { DomainEventName, buildDomainEventFullName } from '@privateaim/core-kit';
13
14
  import { Emitter } from '@socket.io/redis-emitter';
14
15
 
16
+ /*
17
+ * Copyright (c) 2024.
18
+ * Author Peter Placzek (tada5hi)
19
+ * For the full copyright and license information,
20
+ * view the LICENSE file that was distributed with this source code.
21
+ */ function _define_property$2(obj, key, value) {
22
+ if (key in obj) {
23
+ Object.defineProperty(obj, key, {
24
+ value: value,
25
+ enumerable: true,
26
+ configurable: true,
27
+ writable: true
28
+ });
29
+ } else {
30
+ obj[key] = value;
31
+ }
32
+ return obj;
33
+ }
34
+ class MemoryCache {
35
+ set(id, value, options) {
36
+ this.cache.set(id, value, {
37
+ ttl: options.ttl
38
+ });
39
+ }
40
+ get(id) {
41
+ return this.cache.get(id);
42
+ }
43
+ del(id) {
44
+ this.cache.delete(id);
45
+ }
46
+ has(id) {
47
+ return this.cache.has(id);
48
+ }
49
+ constructor(options = {}){
50
+ _define_property$2(this, "options", void 0);
51
+ _define_property$2(this, "cache", void 0);
52
+ this.options = {
53
+ // 60 seconds
54
+ ttl: 1000 * 60,
55
+ ...options
56
+ };
57
+ this.cache = new TTLCache();
58
+ }
59
+ }
60
+
61
+ const instance$8 = singa({
62
+ name: 'queueRouter',
63
+ factory: ()=>new MemoryCache()
64
+ });
65
+ function useMemoryCache() {
66
+ return instance$8.use();
67
+ }
68
+
15
69
  /*
16
70
  * Copyright (c) 2023-2024.
17
71
  * Author Peter Placzek (tada5hi)
@@ -187,7 +241,9 @@ function createLogger(ctx = {}) {
187
241
  ];
188
242
  }
189
243
  return createLogger$1({
190
- format: format.combine(format.timestamp(), format.colorize(), format.simple()),
244
+ format: format.combine(format.errors({
245
+ stack: true
246
+ }), format.timestamp(), format.colorize(), format.simple()),
191
247
  level: 'debug',
192
248
  transports: loggerTransports,
193
249
  // todo: deeply merge options
@@ -308,6 +364,12 @@ class QueueRouter {
308
364
  if (!isQueueRouterPayload(payload)) {
309
365
  return;
310
366
  }
367
+ if (input.fields.redelivered) {
368
+ if (isLoggerUsable()) {
369
+ useLogger().debug(`Queue message ${input.properties.type} in ${routing.key} is not processed again.`);
370
+ }
371
+ return;
372
+ }
311
373
  if (isLoggerUsable()) {
312
374
  useLogger().debug(`Consuming queue message ${input.properties.type} in ${routing.key}`);
313
375
  }
@@ -426,5 +488,5 @@ async function publishDomainEvent(client, context, destinations) {
426
488
  return Object.prototype.hasOwnProperty.call(obj, prop);
427
489
  }
428
490
 
429
- export { AuthupClient, ComponentError, QueueRouter, QueueRouterRoutingType, buildQueueRouterPublishPayload, createLogger, guessAuthupTokenCreatorOptions, hasOwnProperty, isAmqpClientUsable, isAuthupClientUsable, isComponentError, isLoggerUsable, isQueuePayload, isQueueRouterPayload, isQueueRouterUsable, isRedisClientUsable, isVaultClientUsable, publishDomainEvent, publishDomainRedisEvent, publishDomainSocketEvent, setAmqpClientFactory, setAuthupClientFactory, setLogger, setLoggerFactory, setRedisClient, setRedisFactory, setVaultFactory, useAmqpClient, useAuthupClient, useLogger, useQueueRouter, useRedisClient, useRedisPublishClient, useRedisSubscribeClient, useVaultClient };
491
+ export { AuthupClient, ComponentError, MemoryCache, QueueRouter, QueueRouterRoutingType, buildQueueRouterPublishPayload, createLogger, guessAuthupTokenCreatorOptions, hasOwnProperty, isAmqpClientUsable, isAuthupClientUsable, isComponentError, isLoggerUsable, isQueuePayload, isQueueRouterPayload, isQueueRouterUsable, isRedisClientUsable, isVaultClientUsable, publishDomainEvent, publishDomainRedisEvent, publishDomainSocketEvent, setAmqpClientFactory, setAuthupClientFactory, setLogger, setLoggerFactory, setRedisClient, setRedisFactory, setVaultFactory, useAmqpClient, useAuthupClient, useLogger, useMemoryCache, useQueueRouter, useRedisClient, useRedisPublishClient, useRedisSubscribeClient, useVaultClient };
430
492
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/core/component/error.ts","../src/core/component/helper.ts","../src/core/queue/utils.ts","../src/core/queue-router/constants.ts","../src/core/queue-router/helpers.ts","../src/services/amqp/module.ts","../src/services/vault/singleton.ts","../src/services/authup/helpers.ts","../src/services/authup/module.ts","../src/services/authup/singleton.ts","../src/services/logger/module.ts","../src/services/logger/singleton.ts","../src/services/redis/singleton.ts","../src/services/redis/singleton-publish.ts","../src/services/redis/singleton-subscribe.ts","../src/core/queue-router/module.ts","../src/core/queue-router/singleton.ts","../src/domain-event/utils.ts","../src/domain-event/redis/publish.ts","../src/domain-event/socket/publish.ts","../src/domain-event/publish.ts","../src/utils/has-property.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ComponentErrorOptions } from './type';\n\nexport class ComponentError extends Error {\n public code?: string | null;\n\n constructor(input: ComponentErrorOptions) {\n super(input.message, { cause: input.cause });\n\n this.code = input.code;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@privateaim/kit';\nimport type { ComponentError } from './error';\n\nexport function isComponentError(input: unknown) : input is ComponentError {\n if (!isObject(input)) {\n return false;\n }\n\n if (\n typeof input.message !== 'undefined' &&\n typeof input.message !== 'string'\n ) {\n return false;\n }\n\n if (typeof input.code === 'undefined') {\n return true;\n }\n\n return typeof input.code === 'string' || input.code === null;\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty, isObject } from '@privateaim/kit';\nimport type { QueuePayload } from './type';\n\nexport function isQueuePayload(input: unknown) : input is QueuePayload {\n return isObject(input) &&\n hasOwnProperty(input, 'data') &&\n isObject(input.data) &&\n hasOwnProperty(input, 'metadata') &&\n isObject(input.metadata);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum QueueRouterRoutingType {\n WORK = 'work',\n PUB_SUB = 'pubSub',\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createNanoID, hasOwnProperty, isObject } from '@privateaim/kit';\nimport type { QueueRouterPayload, QueueRouterPayloadInput } from './types';\n\nexport function buildQueueRouterPublishPayload(\n input: QueueRouterPayloadInput,\n) : QueueRouterPayload {\n return {\n id: input.id || createNanoID(),\n type: input.type,\n data: input.data || {},\n metadata: {\n timestamp: Date.now(),\n ...input.metadata,\n },\n };\n}\n\nexport function isQueueRouterPayload(input: unknown) : input is QueueRouterPayload {\n return isObject(input) &&\n typeof input.id === 'string' &&\n typeof input.type === 'string' &&\n hasOwnProperty(input, 'data') &&\n isObject(input.data) &&\n hasOwnProperty(input, 'metadata') &&\n isObject(input.metadata);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'amqp-extension';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'amqp',\n});\n\nexport function setAmqpClientFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n\nexport function isAmqpClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function useAmqpClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\nimport type { VaultClient } from '@hapic/vault';\n\nconst instance = singa<VaultClient>({\n name: 'vault',\n});\n\nexport function setVaultFactory(factory: Factory<VaultClient>) {\n instance.setFactory(factory);\n}\n\nexport function isVaultClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function useVaultClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { TokenCreatorOptions } from '@authup/core-http-kit';\nimport { isVaultClientUsable, useVaultClient } from '../vault';\n\nexport function guessAuthupTokenCreatorOptions() : TokenCreatorOptions {\n let options : TokenCreatorOptions;\n if (isVaultClientUsable()) {\n options = {\n type: 'robotInVault',\n name: 'system',\n vault: useVaultClient(),\n };\n } else {\n options = {\n type: 'user',\n name: 'admin',\n password: 'start123',\n };\n }\n\n return options;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientResponseErrorTokenHookOptions } from '@authup/core-http-kit';\nimport {\n Client, mountClientResponseErrorTokenHook as mountAuthupClientResponseErrorTokenHook,\n mountClientResponseErrorTokenHook,\n} from '@authup/core-http-kit';\nimport { guessAuthupTokenCreatorOptions } from './helpers';\nimport type { AuthupClientOptions } from './types';\n\nexport {\n mountAuthupClientResponseErrorTokenHook,\n};\n\nexport class AuthupClient extends Client {\n constructor(options: AuthupClientOptions = {}) {\n super(options);\n\n let tokenHook : ClientResponseErrorTokenHookOptions;\n if (options.tokenHook) {\n tokenHook = options.tokenHook;\n tokenHook.baseURL = tokenHook.baseURL || options.baseURL;\n } else {\n const tokenCreator = guessAuthupTokenCreatorOptions();\n tokenHook = {\n baseURL: options.baseURL,\n tokenCreator,\n };\n }\n\n mountClientResponseErrorTokenHook(this, tokenHook);\n }\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-http-kit';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'authup',\n});\n\nexport function useAuthupClient() {\n return instance.use();\n}\n\nexport function isAuthupClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setAuthupClientFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { read } from 'envix';\nimport path from 'node:path';\nimport { EnvironmentName } from 'typeorm-extension';\nimport type { Logger } from 'winston';\nimport { createLogger as create, format, transports } from 'winston';\nimport type { LoggerCreateContext, LoggerTransports } from './types';\n\nexport function createLogger(ctx: LoggerCreateContext = {}) : Logger {\n const { directory, options = {} } = ctx;\n\n let loggerTransports : LoggerTransports;\n if (read('env') === EnvironmentName.PRODUCTION) {\n loggerTransports = [\n new transports.Console({\n level: 'info',\n }),\n new transports.File({\n filename: path.join(directory || process.cwd(), 'access.log'),\n level: 'http',\n maxsize: 10 * 1024 * 1024, // 10MB\n maxFiles: 5,\n }),\n new transports.File({\n filename: path.join(directory || process.cwd(), 'error.log'),\n level: 'warn',\n maxsize: 10 * 1024 * 1024, // 10MB\n maxFiles: 5,\n }),\n ];\n } else {\n loggerTransports = [\n new transports.Console({\n level: 'debug',\n }),\n ];\n }\n\n return create({\n format: format.combine(\n format.timestamp(),\n format.colorize(),\n format.simple(),\n ),\n level: 'debug',\n transports: loggerTransports,\n // todo: deeply merge options\n ...(options || {}),\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { type Factory, singa } from 'singa';\nimport type { Logger } from 'winston';\n\nconst instance = singa<Logger>({\n name: 'logger',\n});\n\nexport function setLoggerFactory(factory: Factory<Logger>) {\n instance.setFactory(factory);\n}\n\nexport function isLoggerUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setLogger(input: Logger) {\n instance.set(input);\n}\n\nexport function useLogger() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'redis',\n});\n\nexport function setRedisFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n\nexport function isRedisClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setRedisClient(input: Client) {\n instance.set(input);\n}\n\nexport function useRedisClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport { singa } from 'singa';\nimport { useRedisClient } from './singleton';\n\nconst instance = singa<Client>({\n name: 'redisPublish',\n factory: () => useRedisClient().duplicate(),\n});\n\nexport function useRedisPublishClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport { singa } from 'singa';\nimport { useRedisClient } from './singleton';\n\nconst instance = singa<Client>({\n name: 'redisSubscribe',\n factory: () => useRedisClient().duplicate(),\n});\n\nexport function useRedisSubscribeClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ExchangeType } from 'amqp-extension';\nimport type { Client } from 'amqp-extension';\nimport { isLoggerUsable, useLogger } from '../../services';\nimport { QueueRouterRoutingType } from './constants';\nimport { isQueueRouterPayload } from './helpers';\nimport type {\n QueueRouterHandler,\n QueueRouterHandlers,\n QueueRouterPayload, QueueRouterRouting,\n} from './types';\n\nexport class QueueRouter {\n protected driver : Client;\n\n //----------------------------------------------------------------\n\n constructor(driver: Client) {\n this.driver = driver;\n }\n\n //----------------------------------------------------------------\n\n publish(message: QueueRouterPayload) : Promise<boolean> {\n let exchange : Client;\n if (message.metadata.routing.type === 'work') {\n exchange = this.driver.of({\n type: ExchangeType.DIRECT,\n name: message.metadata.routing.namespace || '',\n });\n } else {\n exchange = this.driver.of({\n type: ExchangeType.TOPIC,\n name: message.metadata.routing.namespace || 'FLAME',\n });\n }\n\n if (isLoggerUsable()) {\n useLogger()\n .debug(`Publishing queue message ${message.type} in ${message.metadata.routing.key}`);\n }\n\n return exchange.publish(message.metadata.routing.key, message, {\n type: message.type,\n messageId: message.id,\n persistent: message.metadata.persistent ??\n message.metadata.routing.type === QueueRouterRoutingType.WORK,\n });\n }\n\n consume(routing: QueueRouterRouting, handlers: QueueRouterHandlers) : Promise<void> {\n let exchange : Client;\n if (routing.type === 'work') {\n exchange = this.driver.of({\n type: ExchangeType.DIRECT,\n name: routing.namespace || '',\n });\n } else {\n exchange = this.driver.of({\n type: ExchangeType.TOPIC,\n name: routing.namespace || 'FLAME',\n });\n }\n\n return exchange.consume(routing.key, {\n prefetchCount: routing.type === QueueRouterRoutingType.WORK ? 1 : undefined,\n // noAck: routing.type !== QueueRouterRoutingType.WORK,\n requeueOnFailure: routing.type === QueueRouterRoutingType.WORK,\n }, {\n $any: async (input) => {\n const payload = JSON.parse(input.content.toString('utf-8'));\n if (!isQueueRouterPayload(payload)) {\n return;\n }\n\n if (isLoggerUsable()) {\n useLogger()\n .debug(`Consuming queue message ${input.properties.type} in ${routing.key}`);\n }\n\n let handler : QueueRouterHandler | undefined;\n\n if (\n typeof input.properties.type === 'string' &&\n handlers[input.properties.type]\n ) {\n handler = handlers[input.properties.type];\n } else {\n handler = handlers.$any;\n }\n\n if (typeof handler !== 'function') {\n if (isLoggerUsable()) {\n useLogger()\n .debug(`No queue handler to consume message ${input.properties.type} in ${routing.key}`);\n }\n\n return;\n }\n\n await handler(payload);\n },\n });\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { singa } from 'singa';\nimport { isAmqpClientUsable, useAmqpClient } from '../../services';\nimport { QueueRouter } from './module';\n\nconst instance = singa<QueueRouter>({\n name: 'queueRouter',\n factory: () => {\n const amqp = useAmqpClient();\n\n return new QueueRouter(amqp);\n },\n});\n\nexport function isQueueRouterUsable() {\n return instance.has() || isAmqpClientUsable();\n}\n\nexport function useQueueRouter() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@privateaim/kit';\nimport type { DomainEventChannelName } from './type';\n\nexport function transformDomainEventData<T>(input: T) : T {\n if (isObject(input)) {\n const keys = Object.keys(input);\n for (let i = 0; i < keys.length; i++) {\n const value = input[keys[i]];\n if (value instanceof Date) {\n input[keys[i]] = value.toISOString();\n }\n }\n }\n\n return input;\n}\n\nexport function buildDomainEventChannelName(\n input: DomainEventChannelName,\n id?: string | number,\n) : string {\n if (typeof input === 'string') {\n return input;\n }\n\n return input(id);\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { DomainEventName } from '@privateaim/core-kit';\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport type { Client } from 'redis-extension';\nimport type { DomainEventDestinations } from '../type';\nimport { buildDomainEventChannelName, transformDomainEventData } from '../utils';\n\nexport async function publishDomainRedisEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) : Promise<any> {\n context = transformDomainEventData(context);\n\n const json = JSON.stringify(context);\n\n const pipeline = client.pipeline();\n for (let i = 0; i < destinations.length; i++) {\n const { namespace } = destinations[i];\n const keyPrefix = (namespace ? `${namespace}:` : '');\n\n let key = keyPrefix + buildDomainEventChannelName(destinations[i].channel);\n pipeline.publish(key, json);\n\n if (\n context.event !== DomainEventName.CREATED &&\n typeof destinations[i].channel === 'function'\n ) {\n key = keyPrefix + buildDomainEventChannelName(destinations[i].channel, context.data.id);\n pipeline.publish(key, json);\n }\n }\n\n return pipeline.exec();\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport { DomainEventName, buildDomainEventFullName } from '@privateaim/core-kit';\nimport { Emitter } from '@socket.io/redis-emitter';\nimport type { Client } from 'redis-extension';\nimport type { DomainEventDestinations } from '../type';\nimport { buildDomainEventChannelName, transformDomainEventData } from '../utils';\n\nexport function publishDomainSocketEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) {\n context = transformDomainEventData(context);\n\n for (let i = 0; i < destinations.length; i++) {\n let emitter = new Emitter(client);\n if (destinations[i].namespace) {\n emitter = emitter.of(destinations[i].namespace);\n }\n\n let roomName = buildDomainEventChannelName(destinations[i].channel);\n\n const fullEventName = buildDomainEventFullName(context.type, context.event);\n\n emitter\n .in(roomName)\n .emit(fullEventName, {\n ...context,\n meta: {\n roomName,\n },\n });\n\n if (\n context.event !== DomainEventName.CREATED &&\n typeof destinations[i].channel === 'function'\n ) {\n roomName = buildDomainEventChannelName(destinations[i].channel, context.data.id);\n emitter\n .in(roomName)\n .emit(fullEventName, {\n ...context,\n meta: {\n roomName,\n roomId: context.data.id,\n },\n });\n }\n }\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport type { Client } from 'redis-extension';\nimport { publishDomainRedisEvent } from './redis';\nimport { publishDomainSocketEvent } from './socket';\nimport type { DomainEventDestinations } from './type';\n\nexport async function publishDomainEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) {\n await publishDomainRedisEvent(client, context, destinations);\n publishDomainSocketEvent(client, context, destinations);\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function hasOwnProperty<X extends Record<string, any>, Y extends PropertyKey>(\n obj: X,\n prop: Y,\n): obj is X & Record<Y, unknown> {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n"],"names":["_define_property","ComponentError","Error","constructor","input","message","cause","code","isComponentError","isObject","isQueuePayload","hasOwnProperty","data","metadata","QueueRouterRoutingType","buildQueueRouterPublishPayload","id","createNanoID","type","timestamp","Date","now","isQueueRouterPayload","instance","singa","name","setAmqpClientFactory","factory","setFactory","isAmqpClientUsable","has","hasFactory","useAmqpClient","use","setVaultFactory","isVaultClientUsable","useVaultClient","guessAuthupTokenCreatorOptions","options","vault","password","AuthupClient","Client","tokenHook","baseURL","tokenCreator","mountClientResponseErrorTokenHook","useAuthupClient","isAuthupClientUsable","setAuthupClientFactory","createLogger","ctx","directory","loggerTransports","read","EnvironmentName","PRODUCTION","transports","Console","level","File","filename","path","join","process","cwd","maxsize","maxFiles","create","format","combine","colorize","simple","setLoggerFactory","isLoggerUsable","setLogger","set","useLogger","setRedisFactory","isRedisClientUsable","setRedisClient","useRedisClient","duplicate","useRedisPublishClient","useRedisSubscribeClient","QueueRouter","publish","exchange","routing","driver","of","ExchangeType","DIRECT","namespace","TOPIC","debug","key","messageId","persistent","WORK","consume","handlers","prefetchCount","undefined","requeueOnFailure","$any","payload","JSON","parse","content","toString","properties","handler","amqp","isQueueRouterUsable","useQueueRouter","transformDomainEventData","keys","Object","i","length","value","toISOString","buildDomainEventChannelName","publishDomainRedisEvent","client","context","destinations","json","stringify","pipeline","keyPrefix","channel","event","DomainEventName","CREATED","exec","publishDomainSocketEvent","emitter","Emitter","roomName","fullEventName","buildDomainEventFullName","in","emit","meta","roomId","publishDomainEvent","obj","prop","prototype","call"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/core/memory-cache/module.ts","../src/core/memory-cache/singleton.ts","../src/core/component/error.ts","../src/core/component/helper.ts","../src/core/queue/utils.ts","../src/core/queue-router/constants.ts","../src/core/queue-router/helpers.ts","../src/services/amqp/module.ts","../src/services/vault/singleton.ts","../src/services/authup/helpers.ts","../src/services/authup/module.ts","../src/services/authup/singleton.ts","../src/services/logger/module.ts","../src/services/logger/singleton.ts","../src/services/redis/singleton.ts","../src/services/redis/singleton-publish.ts","../src/services/redis/singleton-subscribe.ts","../src/core/queue-router/module.ts","../src/core/queue-router/singleton.ts","../src/domain-event/utils.ts","../src/domain-event/redis/publish.ts","../src/domain-event/socket/publish.ts","../src/domain-event/publish.ts","../src/utils/has-property.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport TTLCache from '@isaacs/ttlcache';\n\ntype BlockerOptions = {\n ttl: number;\n};\n\nexport class MemoryCache<\n KEY extends string = string,\n VALUE = any,\n> {\n protected options : BlockerOptions;\n\n protected cache : TTLCache<KEY, VALUE>;\n\n constructor(options: Partial<BlockerOptions> = {}) {\n this.options = {\n // 60 seconds\n ttl: 1000 * 60,\n ...options,\n };\n this.cache = new TTLCache<KEY, VALUE>();\n }\n\n set(id: KEY, value: VALUE, options: BlockerOptions) {\n this.cache.set(id, value, {\n ttl: options.ttl,\n });\n }\n\n get(id: KEY): VALUE | undefined {\n return this.cache.get(id);\n }\n\n del(id: KEY) : void {\n this.cache.delete(id);\n }\n\n has(id: KEY) : boolean {\n return this.cache.has(id);\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { singa } from 'singa';\nimport { MemoryCache } from './module';\n\nconst instance = singa<MemoryCache>({\n name: 'queueRouter',\n factory: () => new MemoryCache(),\n});\n\nexport function useMemoryCache() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ComponentErrorOptions } from './type';\n\nexport class ComponentError extends Error {\n public code?: string | null;\n\n constructor(input: ComponentErrorOptions) {\n super(input.message, { cause: input.cause });\n\n this.code = input.code;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@privateaim/kit';\nimport type { ComponentError } from './error';\n\nexport function isComponentError(input: unknown) : input is ComponentError {\n if (!isObject(input)) {\n return false;\n }\n\n if (\n typeof input.message !== 'undefined' &&\n typeof input.message !== 'string'\n ) {\n return false;\n }\n\n if (typeof input.code === 'undefined') {\n return true;\n }\n\n return typeof input.code === 'string' || input.code === null;\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty, isObject } from '@privateaim/kit';\nimport type { QueuePayload } from './type';\n\nexport function isQueuePayload(input: unknown) : input is QueuePayload {\n return isObject(input) &&\n hasOwnProperty(input, 'data') &&\n isObject(input.data) &&\n hasOwnProperty(input, 'metadata') &&\n isObject(input.metadata);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum QueueRouterRoutingType {\n WORK = 'work',\n PUB_SUB = 'pubSub',\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createNanoID, hasOwnProperty, isObject } from '@privateaim/kit';\nimport type { QueueRouterPayload, QueueRouterPayloadInput } from './types';\n\nexport function buildQueueRouterPublishPayload(\n input: QueueRouterPayloadInput,\n) : QueueRouterPayload {\n return {\n id: input.id || createNanoID(),\n type: input.type,\n data: input.data || {},\n metadata: {\n timestamp: Date.now(),\n ...input.metadata,\n },\n };\n}\n\nexport function isQueueRouterPayload(input: unknown) : input is QueueRouterPayload {\n return isObject(input) &&\n typeof input.id === 'string' &&\n typeof input.type === 'string' &&\n hasOwnProperty(input, 'data') &&\n isObject(input.data) &&\n hasOwnProperty(input, 'metadata') &&\n isObject(input.metadata);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'amqp-extension';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'amqp',\n});\n\nexport function setAmqpClientFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n\nexport function isAmqpClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function useAmqpClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\nimport type { VaultClient } from '@hapic/vault';\n\nconst instance = singa<VaultClient>({\n name: 'vault',\n});\n\nexport function setVaultFactory(factory: Factory<VaultClient>) {\n instance.setFactory(factory);\n}\n\nexport function isVaultClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function useVaultClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { TokenCreatorOptions } from '@authup/core-http-kit';\nimport { isVaultClientUsable, useVaultClient } from '../vault';\n\nexport function guessAuthupTokenCreatorOptions() : TokenCreatorOptions {\n let options : TokenCreatorOptions;\n if (isVaultClientUsable()) {\n options = {\n type: 'robotInVault',\n name: 'system',\n vault: useVaultClient(),\n };\n } else {\n options = {\n type: 'user',\n name: 'admin',\n password: 'start123',\n };\n }\n\n return options;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientResponseErrorTokenHookOptions } from '@authup/core-http-kit';\nimport {\n Client, mountClientResponseErrorTokenHook as mountAuthupClientResponseErrorTokenHook,\n mountClientResponseErrorTokenHook,\n} from '@authup/core-http-kit';\nimport { guessAuthupTokenCreatorOptions } from './helpers';\nimport type { AuthupClientOptions } from './types';\n\nexport {\n mountAuthupClientResponseErrorTokenHook,\n};\n\nexport class AuthupClient extends Client {\n constructor(options: AuthupClientOptions = {}) {\n super(options);\n\n let tokenHook : ClientResponseErrorTokenHookOptions;\n if (options.tokenHook) {\n tokenHook = options.tokenHook;\n tokenHook.baseURL = tokenHook.baseURL || options.baseURL;\n } else {\n const tokenCreator = guessAuthupTokenCreatorOptions();\n tokenHook = {\n baseURL: options.baseURL,\n tokenCreator,\n };\n }\n\n mountClientResponseErrorTokenHook(this, tokenHook);\n }\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-http-kit';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'authup',\n});\n\nexport function useAuthupClient() {\n return instance.use();\n}\n\nexport function isAuthupClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setAuthupClientFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { read } from 'envix';\nimport path from 'node:path';\nimport { EnvironmentName } from 'typeorm-extension';\nimport type { Logger } from 'winston';\nimport { createLogger as create, format, transports } from 'winston';\nimport type { LoggerCreateContext, LoggerTransports } from './types';\n\nexport function createLogger(ctx: LoggerCreateContext = {}) : Logger {\n const { directory, options = {} } = ctx;\n\n let loggerTransports : LoggerTransports;\n if (read('env') === EnvironmentName.PRODUCTION) {\n loggerTransports = [\n new transports.Console({\n level: 'info',\n }),\n new transports.File({\n filename: path.join(directory || process.cwd(), 'access.log'),\n level: 'http',\n maxsize: 10 * 1024 * 1024, // 10MB\n maxFiles: 5,\n }),\n new transports.File({\n filename: path.join(directory || process.cwd(), 'error.log'),\n level: 'warn',\n maxsize: 10 * 1024 * 1024, // 10MB\n maxFiles: 5,\n }),\n ];\n } else {\n loggerTransports = [\n new transports.Console({\n level: 'debug',\n }),\n ];\n }\n\n return create({\n format: format.combine(\n format.errors({ stack: true }),\n format.timestamp(),\n format.colorize(),\n format.simple(),\n ),\n level: 'debug',\n transports: loggerTransports,\n // todo: deeply merge options\n ...(options || {}),\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { type Factory, singa } from 'singa';\nimport type { Logger } from 'winston';\n\nconst instance = singa<Logger>({\n name: 'logger',\n});\n\nexport function setLoggerFactory(factory: Factory<Logger>) {\n instance.setFactory(factory);\n}\n\nexport function isLoggerUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setLogger(input: Logger) {\n instance.set(input);\n}\n\nexport function useLogger() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport type { Factory } from 'singa';\nimport { singa } from 'singa';\n\nconst instance = singa<Client>({\n name: 'redis',\n});\n\nexport function setRedisFactory(factory: Factory<Client>) {\n instance.setFactory(factory);\n}\n\nexport function isRedisClientUsable() {\n return instance.has() || instance.hasFactory();\n}\n\nexport function setRedisClient(input: Client) {\n instance.set(input);\n}\n\nexport function useRedisClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport { singa } from 'singa';\nimport { useRedisClient } from './singleton';\n\nconst instance = singa<Client>({\n name: 'redisPublish',\n factory: () => useRedisClient().duplicate(),\n});\n\nexport function useRedisPublishClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from 'redis-extension';\nimport { singa } from 'singa';\nimport { useRedisClient } from './singleton';\n\nconst instance = singa<Client>({\n name: 'redisSubscribe',\n factory: () => useRedisClient().duplicate(),\n});\n\nexport function useRedisSubscribeClient() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ExchangeType } from 'amqp-extension';\nimport type { Client } from 'amqp-extension';\nimport { isLoggerUsable, useLogger } from '../../services';\nimport { QueueRouterRoutingType } from './constants';\nimport { isQueueRouterPayload } from './helpers';\nimport type {\n QueueRouterHandler,\n QueueRouterHandlers,\n QueueRouterPayload, QueueRouterRouting,\n} from './types';\n\nexport class QueueRouter {\n protected driver : Client;\n\n //----------------------------------------------------------------\n\n constructor(driver: Client) {\n this.driver = driver;\n }\n\n //----------------------------------------------------------------\n\n publish(message: QueueRouterPayload) : Promise<boolean> {\n let exchange : Client;\n if (message.metadata.routing.type === 'work') {\n exchange = this.driver.of({\n type: ExchangeType.DIRECT,\n name: message.metadata.routing.namespace || '',\n });\n } else {\n exchange = this.driver.of({\n type: ExchangeType.TOPIC,\n name: message.metadata.routing.namespace || 'FLAME',\n });\n }\n\n if (isLoggerUsable()) {\n useLogger()\n .debug(`Publishing queue message ${message.type} in ${message.metadata.routing.key}`);\n }\n\n return exchange.publish(message.metadata.routing.key, message, {\n type: message.type,\n messageId: message.id,\n persistent: message.metadata.persistent ??\n message.metadata.routing.type === QueueRouterRoutingType.WORK,\n });\n }\n\n consume(routing: QueueRouterRouting, handlers: QueueRouterHandlers) : Promise<void> {\n let exchange : Client;\n if (routing.type === 'work') {\n exchange = this.driver.of({\n type: ExchangeType.DIRECT,\n name: routing.namespace || '',\n });\n } else {\n exchange = this.driver.of({\n type: ExchangeType.TOPIC,\n name: routing.namespace || 'FLAME',\n });\n }\n\n return exchange.consume(routing.key, {\n prefetchCount: routing.type === QueueRouterRoutingType.WORK ? 1 : undefined,\n // noAck: routing.type !== QueueRouterRoutingType.WORK,\n requeueOnFailure: routing.type === QueueRouterRoutingType.WORK,\n }, {\n $any: async (input) => {\n const payload = JSON.parse(input.content.toString('utf-8'));\n if (!isQueueRouterPayload(payload)) {\n return;\n }\n\n if (input.fields.redelivered) {\n if (isLoggerUsable()) {\n useLogger()\n .debug(`Queue message ${input.properties.type} in ${routing.key} is not processed again.`);\n }\n\n return;\n }\n\n if (isLoggerUsable()) {\n useLogger()\n .debug(`Consuming queue message ${input.properties.type} in ${routing.key}`);\n }\n\n let handler : QueueRouterHandler | undefined;\n\n if (\n typeof input.properties.type === 'string' &&\n handlers[input.properties.type]\n ) {\n handler = handlers[input.properties.type];\n } else {\n handler = handlers.$any;\n }\n\n if (typeof handler !== 'function') {\n if (isLoggerUsable()) {\n useLogger()\n .debug(`No queue handler to consume message ${input.properties.type} in ${routing.key}`);\n }\n\n return;\n }\n\n await handler(payload);\n },\n });\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { singa } from 'singa';\nimport { isAmqpClientUsable, useAmqpClient } from '../../services';\nimport { QueueRouter } from './module';\n\nconst instance = singa<QueueRouter>({\n name: 'queueRouter',\n factory: () => {\n const amqp = useAmqpClient();\n\n return new QueueRouter(amqp);\n },\n});\n\nexport function isQueueRouterUsable() {\n return instance.has() || isAmqpClientUsable();\n}\n\nexport function useQueueRouter() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@privateaim/kit';\nimport type { DomainEventChannelName } from './type';\n\nexport function transformDomainEventData<T>(input: T) : T {\n if (isObject(input)) {\n const keys = Object.keys(input);\n for (let i = 0; i < keys.length; i++) {\n const value = input[keys[i]];\n if (value instanceof Date) {\n input[keys[i]] = value.toISOString();\n }\n }\n }\n\n return input;\n}\n\nexport function buildDomainEventChannelName(\n input: DomainEventChannelName,\n id?: string | number,\n) : string {\n if (typeof input === 'string') {\n return input;\n }\n\n return input(id);\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { DomainEventName } from '@privateaim/core-kit';\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport type { Client } from 'redis-extension';\nimport type { DomainEventDestinations } from '../type';\nimport { buildDomainEventChannelName, transformDomainEventData } from '../utils';\n\nexport async function publishDomainRedisEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) : Promise<any> {\n context = transformDomainEventData(context);\n\n const json = JSON.stringify(context);\n\n const pipeline = client.pipeline();\n for (let i = 0; i < destinations.length; i++) {\n const { namespace } = destinations[i];\n const keyPrefix = (namespace ? `${namespace}:` : '');\n\n let key = keyPrefix + buildDomainEventChannelName(destinations[i].channel);\n pipeline.publish(key, json);\n\n if (\n context.event !== DomainEventName.CREATED &&\n typeof destinations[i].channel === 'function'\n ) {\n key = keyPrefix + buildDomainEventChannelName(destinations[i].channel, context.data.id);\n pipeline.publish(key, json);\n }\n }\n\n return pipeline.exec();\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport { DomainEventName, buildDomainEventFullName } from '@privateaim/core-kit';\nimport { Emitter } from '@socket.io/redis-emitter';\nimport type { Client } from 'redis-extension';\nimport type { DomainEventDestinations } from '../type';\nimport { buildDomainEventChannelName, transformDomainEventData } from '../utils';\n\nexport function publishDomainSocketEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) {\n context = transformDomainEventData(context);\n\n for (let i = 0; i < destinations.length; i++) {\n let emitter = new Emitter(client);\n if (destinations[i].namespace) {\n emitter = emitter.of(destinations[i].namespace);\n }\n\n let roomName = buildDomainEventChannelName(destinations[i].channel);\n\n const fullEventName = buildDomainEventFullName(context.type, context.event);\n\n emitter\n .in(roomName)\n .emit(fullEventName, {\n ...context,\n meta: {\n roomName,\n },\n });\n\n if (\n context.event !== DomainEventName.CREATED &&\n typeof destinations[i].channel === 'function'\n ) {\n roomName = buildDomainEventChannelName(destinations[i].channel, context.data.id);\n emitter\n .in(roomName)\n .emit(fullEventName, {\n ...context,\n meta: {\n roomName,\n roomId: context.data.id,\n },\n });\n }\n }\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DomainsEventContext } from '@privateaim/core-kit';\nimport type { Client } from 'redis-extension';\nimport { publishDomainRedisEvent } from './redis';\nimport { publishDomainSocketEvent } from './socket';\nimport type { DomainEventDestinations } from './type';\n\nexport async function publishDomainEvent(\n client: Client,\n context: DomainsEventContext,\n destinations: DomainEventDestinations,\n) {\n await publishDomainRedisEvent(client, context, destinations);\n publishDomainSocketEvent(client, context, destinations);\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function hasOwnProperty<X extends Record<string, any>, Y extends PropertyKey>(\n obj: X,\n prop: Y,\n): obj is X & Record<Y, unknown> {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n"],"names":["_define_property","MemoryCache","set","id","value","options","cache","ttl","get","del","delete","has","constructor","TTLCache","instance","singa","name","factory","useMemoryCache","use","ComponentError","Error","input","message","cause","code","isComponentError","isObject","isQueuePayload","hasOwnProperty","data","metadata","QueueRouterRoutingType","buildQueueRouterPublishPayload","createNanoID","type","timestamp","Date","now","isQueueRouterPayload","setAmqpClientFactory","setFactory","isAmqpClientUsable","hasFactory","useAmqpClient","setVaultFactory","isVaultClientUsable","useVaultClient","guessAuthupTokenCreatorOptions","vault","password","AuthupClient","Client","tokenHook","baseURL","tokenCreator","mountClientResponseErrorTokenHook","useAuthupClient","isAuthupClientUsable","setAuthupClientFactory","createLogger","ctx","directory","loggerTransports","read","EnvironmentName","PRODUCTION","transports","Console","level","File","filename","path","join","process","cwd","maxsize","maxFiles","create","format","combine","errors","stack","colorize","simple","setLoggerFactory","isLoggerUsable","setLogger","useLogger","setRedisFactory","isRedisClientUsable","setRedisClient","useRedisClient","duplicate","useRedisPublishClient","useRedisSubscribeClient","QueueRouter","publish","exchange","routing","driver","of","ExchangeType","DIRECT","namespace","TOPIC","debug","key","messageId","persistent","WORK","consume","handlers","prefetchCount","undefined","requeueOnFailure","$any","payload","JSON","parse","content","toString","fields","redelivered","properties","handler","amqp","isQueueRouterUsable","useQueueRouter","transformDomainEventData","keys","Object","i","length","toISOString","buildDomainEventChannelName","publishDomainRedisEvent","client","context","destinations","json","stringify","pipeline","keyPrefix","channel","event","DomainEventName","CREATED","exec","publishDomainSocketEvent","emitter","Emitter","roomName","fullEventName","buildDomainEventFullName","in","emit","meta","roomId","publishDomainEvent","obj","prop","prototype","call"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/services/logger/module.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,KAAK,EAAE,mBAAmB,EAAoB,MAAM,SAAS,CAAC;AAErE,wBAAgB,YAAY,CAAC,GAAG,GAAE,mBAAwB,GAAI,MAAM,CAyCnE"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/services/logger/module.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,KAAK,EAAE,mBAAmB,EAAoB,MAAM,SAAS,CAAC;AAErE,wBAAgB,YAAY,CAAC,GAAG,GAAE,mBAAwB,GAAI,MAAM,CA0CnE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@privateaim/server-kit",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "exports": {
5
5
  "./package.json": "./package.json",
6
6
  ".": {
@@ -22,31 +22,34 @@
22
22
  "scripts": {
23
23
  "build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
24
24
  "build:js": "rollup -c",
25
- "build": "rimraf ./dist && cross-env NODE_ENV=production npm run build:js && npm run build:types"
25
+ "build": "rimraf ./dist && cross-env NODE_ENV=production npm run build:js && npm run build:types",
26
+ "test": "cross-env NODE_ENV=test jest --config ./test/jest.config.js",
27
+ "test:coverage": "npm run test -- --coverage"
26
28
  },
27
29
  "dependencies": {
28
30
  "@ebec/http": "^2.3.0",
29
- "@privateaim/core-kit": "^0.8.0",
30
- "@privateaim/kit": "^0.8.0",
31
+ "@isaacs/ttlcache": "^1.4.1",
32
+ "@privateaim/core-kit": "^0.8.1",
33
+ "@privateaim/kit": "^0.8.1",
31
34
  "@socket.io/redis-emitter": "^5.1.0",
32
35
  "envix": "^1.5.0",
33
36
  "hapic": "^2.5.1",
34
37
  "singa": "^1.0.0",
35
- "winston": "^3.13.0"
38
+ "winston": "^3.14.1"
36
39
  },
37
40
  "devDependencies": {
38
41
  "@authup/core-http-kit": "^1.0.0-beta.19",
39
42
  "@hapic/vault": "^2.3.4",
40
43
  "amqp-extension": "^4.0.0-beta.3",
41
44
  "redis-extension": "^1.5.0",
42
- "typeorm-extension": "^3.5.1"
45
+ "typeorm-extension": "^3.6.1"
43
46
  },
44
47
  "peerDependencies": {
45
48
  "@authup/core-http-kit": "^1.0.0-beta.19",
46
49
  "@hapic/vault": "^2.3.4",
47
50
  "amqp-extension": "^4.0.0-beta.3",
48
51
  "redis-extension": "^1.5.0",
49
- "typeorm-extension": "^3.5.1"
52
+ "typeorm-extension": "^3.6.1"
50
53
  },
51
54
  "publishConfig": {
52
55
  "access": "public"
package/src/core/index.ts CHANGED
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  export * from './aggregator';
9
+ export * from './memory-cache';
9
10
  export * from './component';
10
11
  export * from './queue';
11
12
  export * from './queue-router';
@@ -0,0 +1,9 @@
1
+ /*
2
+ * Copyright (c) 2024.
3
+ * Author Peter Placzek (tada5hi)
4
+ * For the full copyright and license information,
5
+ * view the LICENSE file that was distributed with this source code.
6
+ */
7
+
8
+ export * from './module';
9
+ export * from './singleton';
@@ -0,0 +1,48 @@
1
+ /*
2
+ * Copyright (c) 2024.
3
+ * Author Peter Placzek (tada5hi)
4
+ * For the full copyright and license information,
5
+ * view the LICENSE file that was distributed with this source code.
6
+ */
7
+
8
+ import TTLCache from '@isaacs/ttlcache';
9
+
10
+ type BlockerOptions = {
11
+ ttl: number;
12
+ };
13
+
14
+ export class MemoryCache<
15
+ KEY extends string = string,
16
+ VALUE = any,
17
+ > {
18
+ protected options : BlockerOptions;
19
+
20
+ protected cache : TTLCache<KEY, VALUE>;
21
+
22
+ constructor(options: Partial<BlockerOptions> = {}) {
23
+ this.options = {
24
+ // 60 seconds
25
+ ttl: 1000 * 60,
26
+ ...options,
27
+ };
28
+ this.cache = new TTLCache<KEY, VALUE>();
29
+ }
30
+
31
+ set(id: KEY, value: VALUE, options: BlockerOptions) {
32
+ this.cache.set(id, value, {
33
+ ttl: options.ttl,
34
+ });
35
+ }
36
+
37
+ get(id: KEY): VALUE | undefined {
38
+ return this.cache.get(id);
39
+ }
40
+
41
+ del(id: KEY) : void {
42
+ this.cache.delete(id);
43
+ }
44
+
45
+ has(id: KEY) : boolean {
46
+ return this.cache.has(id);
47
+ }
48
+ }
@@ -0,0 +1,18 @@
1
+ /*
2
+ * Copyright (c) 2024.
3
+ * Author Peter Placzek (tada5hi)
4
+ * For the full copyright and license information,
5
+ * view the LICENSE file that was distributed with this source code.
6
+ */
7
+
8
+ import { singa } from 'singa';
9
+ import { MemoryCache } from './module';
10
+
11
+ const instance = singa<MemoryCache>({
12
+ name: 'queueRouter',
13
+ factory: () => new MemoryCache(),
14
+ });
15
+
16
+ export function useMemoryCache() {
17
+ return instance.use();
18
+ }
@@ -79,6 +79,15 @@ export class QueueRouter {
79
79
  return;
80
80
  }
81
81
 
82
+ if (input.fields.redelivered) {
83
+ if (isLoggerUsable()) {
84
+ useLogger()
85
+ .debug(`Queue message ${input.properties.type} in ${routing.key} is not processed again.`);
86
+ }
87
+
88
+ return;
89
+ }
90
+
82
91
  if (isLoggerUsable()) {
83
92
  useLogger()
84
93
  .debug(`Consuming queue message ${input.properties.type} in ${routing.key}`);
@@ -44,6 +44,7 @@ export function createLogger(ctx: LoggerCreateContext = {}) : Logger {
44
44
 
45
45
  return create({
46
46
  format: format.combine(
47
+ format.errors({ stack: true }),
47
48
  format.timestamp(),
48
49
  format.colorize(),
49
50
  format.simple(),
@@ -0,0 +1,33 @@
1
+ /*
2
+ * Copyright (c) 2021-2024.
3
+ * Author Peter Placzek (tada5hi)
4
+ * For the full copyright and license information,
5
+ * view the LICENSE file that was distributed with this source code.
6
+ */
7
+
8
+ module.exports = {
9
+ testEnvironment: 'node',
10
+ transform: {
11
+ '^.+\\.tsx?$': 'ts-jest',
12
+ },
13
+ moduleFileExtensions: [
14
+ 'ts',
15
+ 'tsx',
16
+ 'js',
17
+ 'jsx',
18
+ 'json',
19
+ 'node',
20
+ ],
21
+ testRegex: '(/unit/.*|(\\.|/)(test|spec))\\.(ts|js)x?$',
22
+ testPathIgnorePatterns: [
23
+ 'writable',
24
+ 'dist',
25
+ '/unit/mock-util.ts',
26
+ ],
27
+ coverageDirectory: 'writable/coverage',
28
+ collectCoverageFrom: [
29
+ 'src/**/*.{ts,tsx,js,jsx}',
30
+ ],
31
+ rootDir: '../',
32
+ verbose: true,
33
+ };
@@ -0,0 +1,29 @@
1
+ /*
2
+ * Copyright (c) 2024.
3
+ * Author Peter Placzek (tada5hi)
4
+ * For the full copyright and license information,
5
+ * view the LICENSE file that was distributed with this source code.
6
+ */
7
+
8
+ import { MemoryCache } from '../../src';
9
+
10
+ describe('memory-cache', () => {
11
+ it('should support operations (set,get,has,del)', () => {
12
+ const cache = new MemoryCache();
13
+ cache.set('foo', { bar: 'baz' }, {
14
+ ttl: 1000 * 60 * 15,
15
+ });
16
+
17
+ expect(cache.has('foo')).toBeTruthy();
18
+
19
+ let value = cache.get('foo');
20
+ expect(value).toEqual({ bar: 'baz' });
21
+
22
+ cache.del('foo');
23
+
24
+ expect(cache.has('foo')).toBeFalsy();
25
+
26
+ value = cache.get('foo');
27
+ expect(value).toBeUndefined();
28
+ });
29
+ });