@diia-inhouse/diia-queue 7.3.0

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.
Files changed (90) hide show
  1. package/LICENCE.md +287 -0
  2. package/README.md +93 -0
  3. package/dist/constants.js +7 -0
  4. package/dist/constants.js.map +1 -0
  5. package/dist/index.js +19 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/interfaces/deps.js +3 -0
  8. package/dist/interfaces/deps.js.map +1 -0
  9. package/dist/interfaces/externalCommunicator.js +3 -0
  10. package/dist/interfaces/externalCommunicator.js.map +1 -0
  11. package/dist/interfaces/index.js +27 -0
  12. package/dist/interfaces/index.js.map +1 -0
  13. package/dist/interfaces/metrics/index.js +3 -0
  14. package/dist/interfaces/metrics/index.js.map +1 -0
  15. package/dist/interfaces/providers/rabbitmq/amqpConnection.js +14 -0
  16. package/dist/interfaces/providers/rabbitmq/amqpConnection.js.map +1 -0
  17. package/dist/interfaces/providers/rabbitmq/amqpListener.js +3 -0
  18. package/dist/interfaces/providers/rabbitmq/amqpListener.js.map +1 -0
  19. package/dist/interfaces/providers/rabbitmq/amqpPublisher.js +12 -0
  20. package/dist/interfaces/providers/rabbitmq/amqpPublisher.js.map +1 -0
  21. package/dist/interfaces/providers/rabbitmq/index.js +25 -0
  22. package/dist/interfaces/providers/rabbitmq/index.js.map +1 -0
  23. package/dist/interfaces/queueConfig/configs.js +9 -0
  24. package/dist/interfaces/queueConfig/configs.js.map +1 -0
  25. package/dist/interfaces/queueConfig/index.js +18 -0
  26. package/dist/interfaces/queueConfig/index.js.map +1 -0
  27. package/dist/interfaces/queueStatus.js +3 -0
  28. package/dist/interfaces/queueStatus.js.map +1 -0
  29. package/dist/metrics/index.js +9 -0
  30. package/dist/metrics/index.js.map +1 -0
  31. package/dist/providers/rabbitmq/amqpConnection.js +129 -0
  32. package/dist/providers/rabbitmq/amqpConnection.js.map +1 -0
  33. package/dist/providers/rabbitmq/amqpListener.js +171 -0
  34. package/dist/providers/rabbitmq/amqpListener.js.map +1 -0
  35. package/dist/providers/rabbitmq/amqpPublisher.js +140 -0
  36. package/dist/providers/rabbitmq/amqpPublisher.js.map +1 -0
  37. package/dist/providers/rabbitmq/index.js +367 -0
  38. package/dist/providers/rabbitmq/index.js.map +1 -0
  39. package/dist/services/eventBus.js +63 -0
  40. package/dist/services/eventBus.js.map +1 -0
  41. package/dist/services/eventMessageHandler.js +145 -0
  42. package/dist/services/eventMessageHandler.js.map +1 -0
  43. package/dist/services/eventMessageValidator.js +44 -0
  44. package/dist/services/eventMessageValidator.js.map +1 -0
  45. package/dist/services/externalCommunicator.js +134 -0
  46. package/dist/services/externalCommunicator.js.map +1 -0
  47. package/dist/services/externalCommunicatorChannel.js +31 -0
  48. package/dist/services/externalCommunicatorChannel.js.map +1 -0
  49. package/dist/services/externalEventBus.js +71 -0
  50. package/dist/services/externalEventBus.js.map +1 -0
  51. package/dist/services/index.js +26 -0
  52. package/dist/services/index.js.map +1 -0
  53. package/dist/services/queue.js +56 -0
  54. package/dist/services/queue.js.map +1 -0
  55. package/dist/services/scheduledTask.js +65 -0
  56. package/dist/services/scheduledTask.js.map +1 -0
  57. package/dist/services/task.js +56 -0
  58. package/dist/services/task.js.map +1 -0
  59. package/dist/types/constants.d.ts +5 -0
  60. package/dist/types/index.d.ts +3 -0
  61. package/dist/types/interfaces/deps.d.ts +17 -0
  62. package/dist/types/interfaces/externalCommunicator.d.ts +35 -0
  63. package/dist/types/interfaces/index.d.ts +89 -0
  64. package/dist/types/interfaces/metrics/index.d.ts +7 -0
  65. package/dist/types/interfaces/providers/rabbitmq/amqpConnection.d.ts +26 -0
  66. package/dist/types/interfaces/providers/rabbitmq/amqpListener.d.ts +7 -0
  67. package/dist/types/interfaces/providers/rabbitmq/amqpPublisher.d.ts +24 -0
  68. package/dist/types/interfaces/providers/rabbitmq/index.d.ts +50 -0
  69. package/dist/types/interfaces/queueConfig/configs.d.ts +39 -0
  70. package/dist/types/interfaces/queueConfig/index.d.ts +1 -0
  71. package/dist/types/interfaces/queueStatus.d.ts +6 -0
  72. package/dist/types/metrics/index.d.ts +4 -0
  73. package/dist/types/providers/rabbitmq/amqpConnection.d.ts +24 -0
  74. package/dist/types/providers/rabbitmq/amqpListener.d.ts +26 -0
  75. package/dist/types/providers/rabbitmq/amqpPublisher.d.ts +25 -0
  76. package/dist/types/providers/rabbitmq/index.d.ts +55 -0
  77. package/dist/types/services/eventBus.d.ts +16 -0
  78. package/dist/types/services/eventMessageHandler.d.ts +21 -0
  79. package/dist/types/services/eventMessageValidator.d.ts +9 -0
  80. package/dist/types/services/externalCommunicator.d.ts +24 -0
  81. package/dist/types/services/externalCommunicatorChannel.d.ts +11 -0
  82. package/dist/types/services/externalEventBus.d.ts +18 -0
  83. package/dist/types/services/index.d.ts +9 -0
  84. package/dist/types/services/queue.d.ts +18 -0
  85. package/dist/types/services/scheduledTask.d.ts +17 -0
  86. package/dist/types/services/task.d.ts +18 -0
  87. package/dist/types/utils.d.ts +3 -0
  88. package/dist/utils.js +12 -0
  89. package/dist/utils.js.map +1 -0
  90. package/package.json +105 -0
@@ -0,0 +1,26 @@
1
+ import { Options } from 'amqplib';
2
+ export interface AmqpConfig {
3
+ protocol?: string;
4
+ hostname?: string;
5
+ port?: number;
6
+ username?: string;
7
+ password?: string;
8
+ heartbeat?: number;
9
+ }
10
+ export type ConnectOptions = Options.Connect;
11
+ export interface SocketOptions {
12
+ clientProperties?: Record<string, any>;
13
+ }
14
+ export interface ReconnectOptions {
15
+ reconnectEnabled?: boolean;
16
+ reconnectTimeout?: number;
17
+ }
18
+ export declare enum ConnectionStatus {
19
+ Init = "init",
20
+ Connecting = "connecting",
21
+ Connected = "connected",
22
+ Reconnecting = "reconnecting",
23
+ Closing = "closing",
24
+ Closed = "closed",
25
+ Down = "down"
26
+ }
@@ -0,0 +1,7 @@
1
+ import { Channel, Options } from 'amqplib';
2
+ import { QueueMessage } from '.';
3
+ export interface QueueChannelAndOptions {
4
+ channel: Channel;
5
+ queueOptions: Options.AssertQueue;
6
+ }
7
+ export type QueueCallback = (msg: QueueMessage | null) => unknown;
@@ -0,0 +1,24 @@
1
+ import { PublishDirectOptions } from '../../index';
2
+ import { EventName } from '../../queueConfig';
3
+ export declare enum ExchangeType {
4
+ Direct = "direct",
5
+ Fanout = "fanout",
6
+ Topic = "topic",
7
+ Headers = "headers",
8
+ XDelayedMessage = "x-delayed-message"
9
+ }
10
+ export type MessagePayload = unknown;
11
+ export interface MessageHeaders {
12
+ traceId: string;
13
+ serviceCode?: string;
14
+ 'x-delay'?: number;
15
+ }
16
+ export interface PublishToExchangeParams {
17
+ eventName: EventName | string;
18
+ message: MessagePayload;
19
+ exchangeName: string;
20
+ routingKey?: string;
21
+ responseRoutingKey?: string;
22
+ headers: MessageHeaders;
23
+ options?: PublishDirectOptions;
24
+ }
@@ -0,0 +1,50 @@
1
+ import * as amqp from 'amqplib';
2
+ import { ListenerOptions } from '../..';
3
+ import { AmqpConnection } from '../../../providers/rabbitmq/amqpConnection';
4
+ import { EventName } from '../../queueConfig';
5
+ import { ConnectOptions, ConnectionStatus, ReconnectOptions, SocketOptions } from './amqpConnection';
6
+ export * from './amqpConnection';
7
+ export * from './amqpPublisher';
8
+ export interface RabbitMQConfigCustomParams {
9
+ responseRoutingKeyPrefix?: string;
10
+ }
11
+ export interface RabbitMQConfig {
12
+ connection: ConnectOptions;
13
+ socketOptions?: SocketOptions;
14
+ reconnectOptions?: ReconnectOptions;
15
+ custom?: RabbitMQConfigCustomParams;
16
+ assertExchanges?: boolean;
17
+ listenerOptions: ListenerOptions;
18
+ }
19
+ export declare enum ConnectionClientType {
20
+ Listener = "listener",
21
+ Publisher = "publisher"
22
+ }
23
+ export type ConnectionList = {
24
+ [k in ConnectionClientType]: {
25
+ lock?: Promise<AmqpConnection>;
26
+ };
27
+ };
28
+ export interface QueueMessageMetaData {
29
+ date: Date;
30
+ xid?: string;
31
+ responseRoutingKey?: string;
32
+ ignoreCache?: boolean;
33
+ }
34
+ export interface QueueMessageData<T = any> {
35
+ event: EventName | string;
36
+ payload: T;
37
+ meta: QueueMessageMetaData;
38
+ }
39
+ export type MessageProperties = amqp.MessageProperties;
40
+ export interface QueueMessage {
41
+ id?: unknown;
42
+ data: QueueMessageData;
43
+ properties: MessageProperties;
44
+ done: (data?: unknown) => void;
45
+ reject: () => void;
46
+ }
47
+ export interface RabbitMQStatus {
48
+ listener: ConnectionStatus;
49
+ publisher: ConnectionStatus;
50
+ }
@@ -0,0 +1,39 @@
1
+ export type EventName = string;
2
+ export type QueueName = string;
3
+ export type Topic = string;
4
+ export declare enum QueueConfigType {
5
+ Internal = "internal",
6
+ External = "external"
7
+ }
8
+ export interface InternalServiceConfig {
9
+ subscribe?: QueueName[];
10
+ publish?: Topic[];
11
+ }
12
+ export interface ExternalServiceConfig {
13
+ publish: EventName[];
14
+ subscribe: EventName[];
15
+ }
16
+ export type ServiceConfigByConfigType = InternalServiceConfig | ExternalServiceConfig;
17
+ export interface ServiceConfig {
18
+ [QueueConfigType.Internal]: InternalServiceConfig;
19
+ [QueueConfigType.External]: ExternalServiceConfig;
20
+ }
21
+ export type QueueConfigByQueueName = {
22
+ [k in QueueName]?: {
23
+ topics: Topic[];
24
+ };
25
+ };
26
+ export type QueueConfig = Record<QueueConfigType.Internal, QueueConfigByQueueName>;
27
+ export type TopicConfigByConfigType = {
28
+ [k in Topic]?: {
29
+ events: EventName[];
30
+ };
31
+ };
32
+ export type TopicConfig = Record<QueueConfigType, TopicConfigByConfigType>;
33
+ export type ServiceRulesConfig = {
34
+ servicesConfig: ServiceConfig;
35
+ topicsConfig: TopicConfig;
36
+ queuesConfig: QueueConfig;
37
+ portalEvents: EventName[];
38
+ internalEvents: EventName[];
39
+ };
@@ -0,0 +1 @@
1
+ export * from './configs';
@@ -0,0 +1,6 @@
1
+ import { RabbitMQStatus } from './providers/rabbitmq';
2
+ import { QueueConnectionType } from '.';
3
+ export type QueueStatusByType = Partial<Record<QueueConnectionType, RabbitMQStatus>>;
4
+ export type QueueStatus = {
5
+ rabbit: QueueStatusByType;
6
+ };
@@ -0,0 +1,4 @@
1
+ import { Counter } from '@diia-inhouse/diia-metrics';
2
+ import { TotalListenerChannelErrorsLabelsMap, TotalMessageHandlerErrorsLabelsMap } from '../interfaces/metrics';
3
+ export declare const totalListenerChannelErrorsMetric: Counter<TotalListenerChannelErrorsLabelsMap>;
4
+ export declare const totalMessageHandlerErrorsMetrics: Counter<TotalMessageHandlerErrorsLabelsMap>;
@@ -0,0 +1,24 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'node:events';
3
+ import { Channel, Options } from 'amqplib';
4
+ import { Logger } from '@diia-inhouse/types';
5
+ import { ConnectionStatus, ReconnectOptions, SocketOptions } from '../../interfaces/providers/rabbitmq/amqpConnection';
6
+ export declare class AmqpConnection extends EventEmitter {
7
+ private readonly connectOptions;
8
+ private readonly logger;
9
+ private readonly reconnectOptions?;
10
+ private readonly socketOptions;
11
+ private reconnectEnabled;
12
+ private reconnectTimeout;
13
+ private connection;
14
+ private connectionStatus;
15
+ constructor(connectOptions: Options.Connect, logger: Logger, reconnectOptions?: ReconnectOptions, socketOptions?: SocketOptions);
16
+ connect(): Promise<void>;
17
+ /**
18
+ * Create new channel
19
+ */
20
+ createChannel(queueName: string): Promise<Channel>;
21
+ reconnect(): Promise<void>;
22
+ closeConnection(): Promise<void>;
23
+ getStatus(): ConnectionStatus;
24
+ }
@@ -0,0 +1,26 @@
1
+ import { Options, Replies } from 'amqplib';
2
+ import { Logger } from '@diia-inhouse/types';
3
+ import { ConnectionStatus, ListenerOptions } from '../../interfaces';
4
+ import { QueueCallback } from '../../interfaces/providers/rabbitmq/amqpListener';
5
+ import { AmqpConnection } from './amqpConnection';
6
+ export declare class AmqpListener {
7
+ private connection;
8
+ private readonly logger;
9
+ private readonly options?;
10
+ private queuesChannels;
11
+ private queueCallback;
12
+ constructor(connection: AmqpConnection, logger: Logger, options?: ListenerOptions);
13
+ init(): Promise<void>;
14
+ listenQueue(queueName: string, callback: QueueCallback, queueOptions?: Options.AssertQueue): Promise<void | never>;
15
+ bindQueueToExchange(queueName: string, exchangeName: string, routingKey?: string): Promise<Replies.Empty>;
16
+ getStatus(): ConnectionStatus;
17
+ private ackMsg;
18
+ private nackMsg;
19
+ private createChannelAndListenQueue;
20
+ private saveQueueCallback;
21
+ private getQueueCallback;
22
+ private getChannel;
23
+ private getQueueOptions;
24
+ private saveChannel;
25
+ private onMessageCallback;
26
+ }
@@ -0,0 +1,25 @@
1
+ import { Options, Replies } from 'amqplib';
2
+ import { Logger } from '@diia-inhouse/types';
3
+ import { ConnectionStatus, ExchangeType } from '../../interfaces';
4
+ import { PublishToExchangeParams } from '../../interfaces/providers/rabbitmq/amqpPublisher';
5
+ import { AmqpConnection } from './amqpConnection';
6
+ export declare class AmqpPublisher {
7
+ private readonly connection;
8
+ private readonly logger;
9
+ private readonly timeout;
10
+ readonly defaultExchangeType: ExchangeType;
11
+ private channel;
12
+ private eventEmitter;
13
+ private readonly defaultExchangeOptions;
14
+ constructor(connection: AmqpConnection, logger: Logger, timeout?: number);
15
+ init(): Promise<void>;
16
+ private createChannel;
17
+ publishToExchange(params: PublishToExchangeParams): Promise<boolean>;
18
+ publishToExchangeDirect<T>(params: PublishToExchangeParams): Promise<T>;
19
+ private static prepareQueueMessageData;
20
+ private publishDirect;
21
+ private publish;
22
+ private static defaultPublishOptions;
23
+ checkExchange(exchangeName: string, exchangeType?: ExchangeType, options?: Options.AssertExchange): Promise<Replies.AssertExchange>;
24
+ getStatus(): ConnectionStatus;
25
+ }
@@ -0,0 +1,55 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { type AsyncLocalStorage } from 'node:async_hooks';
4
+ import { EventEmitter } from 'node:events';
5
+ import { Logger } from '@diia-inhouse/types';
6
+ import { ListenerOptions, MessageHandler, MessagePayload, PublishDirectOptions, PublishExternalEventOptions, PublishInternalEventOptions, QueueContext, RabbitMQConfig, RabbitMQStatus, SubscribeOptions } from '../../interfaces';
7
+ import { EventName, QueueConfigByQueueName, QueueConfigType, QueueName, ServiceConfigByConfigType, Topic, TopicConfigByConfigType } from '../../interfaces/queueConfig';
8
+ export declare class RabbitMQProvider extends EventEmitter {
9
+ private readonly serviceName;
10
+ private readonly rabbitmqConfig;
11
+ private readonly serviceConfig;
12
+ private readonly topicsConfig;
13
+ private readonly portalEvents;
14
+ private readonly internalEvents;
15
+ private readonly type;
16
+ private readonly logger;
17
+ private readonly asyncLocalStorage?;
18
+ private readonly queuesConfig?;
19
+ private initializingLock?;
20
+ private listener;
21
+ private publisher;
22
+ private connectionList;
23
+ private readonly projectName;
24
+ private readonly portalName;
25
+ private eventNameToTopicMap;
26
+ private externalPublishEventsSet;
27
+ private externalSubscribeEventsSet;
28
+ private assertExternalExchanges?;
29
+ constructor(serviceName: string, rabbitmqConfig: RabbitMQConfig, serviceConfig: ServiceConfigByConfigType, topicsConfig: TopicConfigByConfigType, portalEvents: EventName[], internalEvents: EventName[], type: QueueConfigType, logger: Logger, asyncLocalStorage?: AsyncLocalStorage<QueueContext>, queuesConfig?: QueueConfigByQueueName);
30
+ getServiceName(): string;
31
+ getConfig(): RabbitMQConfig;
32
+ init(listenerOptions?: ListenerOptions): Promise<void>;
33
+ subscribe(subscriptionName: QueueName, messageHandler: MessageHandler, options?: SubscribeOptions): Promise<boolean>;
34
+ publish(eventName: EventName, message: MessagePayload, options?: PublishInternalEventOptions): Promise<boolean>;
35
+ subscribeTask(queueName: string, messageHandler: MessageHandler, options?: SubscribeOptions): Promise<boolean>;
36
+ publishTask(queueName: string, message: MessagePayload, delay?: number): Promise<boolean>;
37
+ subscribeExternal(messageHandler: MessageHandler, options?: SubscribeOptions): Promise<boolean>;
38
+ publishExternalDirect<T>(eventName: EventName, message: MessagePayload, topic?: Topic, options?: PublishDirectOptions): Promise<T>;
39
+ publishExternal(eventName: EventName, message: MessagePayload, options?: PublishExternalEventOptions): Promise<boolean>;
40
+ getStatus(): RabbitMQStatus;
41
+ private preparePublisherHeaders;
42
+ private findTopicNameByEventName;
43
+ private setListener;
44
+ private setPublisher;
45
+ private getConnection;
46
+ private checkAndBindToExchange;
47
+ private bindQueueToExternalExchange;
48
+ private makeQueueName;
49
+ private makeExternalResQueueName;
50
+ private makeExternalReqQueueName;
51
+ private prepareExternalTopicName;
52
+ private prepareExternalReqRoutingKey;
53
+ private prepareExternalResRoutingKey;
54
+ private prepareExternalQueuePrefix;
55
+ }
@@ -0,0 +1,16 @@
1
+ import { Logger, OnInit } from '@diia-inhouse/types';
2
+ import { EventBusListener, EventBusQueue, MessageHandler, MessagePayload, PublishInternalEventOptions, SubscribeOptions } from '../interfaces';
3
+ import { QueueName } from '../interfaces/queueConfig';
4
+ import { RabbitMQProvider } from '../providers/rabbitmq';
5
+ import { EventMessageHandler } from './eventMessageHandler';
6
+ export declare class EventBus implements EventBusQueue, OnInit {
7
+ private readonly queueProvider;
8
+ private readonly eventListenerList;
9
+ private readonly eventMessageHandler;
10
+ private readonly logger;
11
+ private readonly queueName;
12
+ constructor(queueProvider: RabbitMQProvider, eventListenerList: EventBusListener[], eventMessageHandler: EventMessageHandler, logger: Logger, queueName: QueueName | undefined);
13
+ onInit(): Promise<void>;
14
+ subscribe(subscriptionName: QueueName, messageHandler: MessageHandler, options?: SubscribeOptions): Promise<boolean>;
15
+ publish(eventName: QueueName, message: MessagePayload, options?: PublishInternalEventOptions): Promise<boolean>;
16
+ }
@@ -0,0 +1,21 @@
1
+ /// <reference types="node" />
2
+ import { AsyncLocalStorage } from 'node:async_hooks';
3
+ import { PubSubService } from '@diia-inhouse/redis';
4
+ import { Logger } from '@diia-inhouse/types';
5
+ import { EventBusListener, QueueContext, QueueMessage, TaskListener } from '../interfaces';
6
+ import { EventListeners } from '../interfaces/externalCommunicator';
7
+ import { EventMessageValidator } from './eventMessageValidator';
8
+ import { ExternalCommunicatorChannel } from './externalCommunicatorChannel';
9
+ export declare class EventMessageHandler {
10
+ private readonly eventMessageValidator;
11
+ private readonly externalChannel;
12
+ private readonly pubsub;
13
+ private readonly asyncLocalStorage;
14
+ private readonly logger;
15
+ constructor(eventMessageValidator: EventMessageValidator, externalChannel: ExternalCommunicatorChannel, pubsub: PubSubService, asyncLocalStorage: AsyncLocalStorage<QueueContext>, logger: Logger);
16
+ eventListenersMessageHandler(this: this, eventListeners: EventListeners, message: QueueMessage | null): Promise<void>;
17
+ eventListenerMessageHandler(listener: EventBusListener | TaskListener | undefined, message: QueueMessage): Promise<void>;
18
+ private syncMessageHandler;
19
+ private performDone;
20
+ private getServiceCode;
21
+ }
@@ -0,0 +1,9 @@
1
+ import { AppValidator, ValidationSchema } from '@diia-inhouse/validators';
2
+ import { QueueMessageData } from '../interfaces';
3
+ export declare class EventMessageValidator {
4
+ private readonly validator;
5
+ readonly metaValidationSchema: ValidationSchema;
6
+ constructor(validator: AppValidator);
7
+ validateEventMessage(data: QueueMessageData, payloadValidationSchema?: ValidationSchema): void | never;
8
+ validateSyncedEventMessage(data: QueueMessageData, responseValidationSchema?: ValidationSchema): void | never;
9
+ }
@@ -0,0 +1,24 @@
1
+ import { PubSubService } from '@diia-inhouse/redis';
2
+ import { Logger, OnRegistrationsFinished } from '@diia-inhouse/types';
3
+ import { EventBusListener, ExternalEventBusQueue } from '../interfaces';
4
+ import { ReceiveDirectOps, ReceiveOps } from '../interfaces/externalCommunicator';
5
+ import { EventName } from '../interfaces/queueConfig';
6
+ import { EventMessageValidator } from './eventMessageValidator';
7
+ import { ExternalCommunicatorChannel } from './externalCommunicatorChannel';
8
+ export declare class ExternalCommunicator implements OnRegistrationsFinished {
9
+ private readonly externalChannel;
10
+ private readonly externalEventBus;
11
+ private readonly externalEventListenerList;
12
+ private readonly eventMessageValidator;
13
+ private readonly logger;
14
+ private readonly pubsub;
15
+ private readonly timeout;
16
+ private eventListeners;
17
+ constructor(externalChannel: ExternalCommunicatorChannel, externalEventBus: ExternalEventBusQueue, externalEventListenerList: EventBusListener[], eventMessageValidator: EventMessageValidator, logger: Logger, pubsub: PubSubService, timeout?: number);
18
+ onRegistrationsFinished(): void;
19
+ receiveDirect<T>(event: string, request?: unknown, ops?: ReceiveDirectOps): Promise<T>;
20
+ /**
21
+ * @deprecated use receiveDirect in case provider supports direct communcation
22
+ */
23
+ receive<T>(event: EventName, request?: unknown, ops?: ReceiveOps): Promise<T | undefined>;
24
+ }
@@ -0,0 +1,11 @@
1
+ import { CacheService } from '@diia-inhouse/redis';
2
+ import { EventName } from '../interfaces/queueConfig';
3
+ export declare class ExternalCommunicatorChannel {
4
+ private readonly cache;
5
+ constructor(cache: CacheService | undefined);
6
+ getChannel(event: EventName, requestUuid: string): string;
7
+ isChannelActive(channel: string): Promise<boolean>;
8
+ saveActiveChannel(channel: string, timeout: number): Promise<void>;
9
+ private getActiveChannelKey;
10
+ private assertChannelAvailability;
11
+ }
@@ -0,0 +1,18 @@
1
+ import { EnvService } from '@diia-inhouse/env';
2
+ import { Logger, OnInit } from '@diia-inhouse/types';
3
+ import { EventBusListener, ExternalEventBusQueue, MessageHandler, MessagePayload, PublishDirectOptions, PublishExternalEventOptions, SubscribeOptions } from '../interfaces';
4
+ import { EventName, Topic } from '../interfaces/queueConfig';
5
+ import { RabbitMQProvider } from '../providers/rabbitmq';
6
+ import { EventMessageHandler } from './eventMessageHandler';
7
+ export declare class ExternalEventBus implements ExternalEventBusQueue, OnInit {
8
+ private readonly queueProvider;
9
+ private readonly externalEventListenerList;
10
+ private readonly eventMessageHandler;
11
+ private readonly envService;
12
+ private readonly logger;
13
+ constructor(queueProvider: RabbitMQProvider, externalEventListenerList: EventBusListener[], eventMessageHandler: EventMessageHandler, envService: EnvService, logger: Logger);
14
+ onInit(): Promise<void>;
15
+ subscribe(messageHandler: MessageHandler, options?: SubscribeOptions): Promise<boolean>;
16
+ publish(eventName: EventName, message: MessagePayload, options?: PublishExternalEventOptions): Promise<boolean>;
17
+ publishDirect<T>(eventName: EventName, message: MessagePayload, topic?: Topic, options?: PublishDirectOptions): Promise<T>;
18
+ }
@@ -0,0 +1,9 @@
1
+ export * from './eventBus';
2
+ export * from './eventMessageHandler';
3
+ export * from './eventMessageValidator';
4
+ export * from './externalCommunicator';
5
+ export * from './externalCommunicatorChannel';
6
+ export * from './externalEventBus';
7
+ export * from './scheduledTask';
8
+ export * from './task';
9
+ export * from './queue';
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ import { AsyncLocalStorage } from 'node:async_hooks';
3
+ import { HealthCheckResult, Logger, OnHealthCheck } from '@diia-inhouse/types';
4
+ import { QueueConnectionConfig, QueueContext } from '../interfaces';
5
+ import { QueueStatus } from '../interfaces/queueStatus';
6
+ import { RabbitMQProvider } from '../providers/rabbitmq';
7
+ export declare class Queue implements OnHealthCheck {
8
+ private readonly serviceName;
9
+ private readonly connectionConfig;
10
+ private readonly asyncLocalStorage;
11
+ private readonly logger;
12
+ private internalQueue;
13
+ private externalQueue;
14
+ constructor(serviceName: string, connectionConfig: QueueConnectionConfig, asyncLocalStorage: AsyncLocalStorage<QueueContext>, logger: Logger);
15
+ onHealthCheck(): Promise<HealthCheckResult<QueueStatus>>;
16
+ getInternalQueue(): RabbitMQProvider;
17
+ getExternalQueue(): RabbitMQProvider;
18
+ }
@@ -0,0 +1,17 @@
1
+ import { Logger, OnInit } from '@diia-inhouse/types';
2
+ import { EventBusListener, MessageHandler, ScheduledTasksQueue, SubscribeOptions } from '../interfaces';
3
+ import { EventName, QueueName } from '../interfaces/queueConfig';
4
+ import { RabbitMQProvider } from '../providers/rabbitmq';
5
+ import { EventMessageHandler } from './eventMessageHandler';
6
+ export declare class ScheduledTask implements ScheduledTasksQueue, OnInit {
7
+ private readonly queueProvider;
8
+ private readonly scheduledTaskList;
9
+ private readonly eventMessageHandler;
10
+ private readonly logger;
11
+ private readonly queueName;
12
+ private readonly routingPart;
13
+ constructor(queueProvider: RabbitMQProvider, scheduledTaskList: EventBusListener[], eventMessageHandler: EventMessageHandler, logger: Logger, queueName: QueueName | undefined);
14
+ onInit(): Promise<void>;
15
+ subscribe(subscriptionName: QueueName, messageHandler: MessageHandler, options?: SubscribeOptions): Promise<boolean>;
16
+ publish(scheduledTaskName: EventName, serviceName: string): Promise<boolean>;
17
+ }
@@ -0,0 +1,18 @@
1
+ import { Logger, OnInit } from '@diia-inhouse/types';
2
+ import { MessageHandler, MessagePayload, SubscribeOptions, TaskListener, TaskQueue } from '../interfaces';
3
+ import { RabbitMQProvider } from '../providers/rabbitmq';
4
+ import { EventMessageHandler } from './eventMessageHandler';
5
+ export declare class Task implements TaskQueue, OnInit {
6
+ private readonly queueProvider;
7
+ private readonly taskList;
8
+ private readonly eventMessageHandler;
9
+ private readonly logger;
10
+ constructor(queueProvider: RabbitMQProvider, taskList: TaskListener[], eventMessageHandler: EventMessageHandler, logger: Logger);
11
+ private readonly tasksMap;
12
+ onInit(): Promise<void>;
13
+ subscribe(taskName: string, messageHandler: MessageHandler, options?: SubscribeOptions): Promise<boolean>;
14
+ publish(taskName: string, payload: MessagePayload, delay?: number): Promise<boolean>;
15
+ private subscribeTask;
16
+ private getTaskQueueName;
17
+ private capitalizeFirstLetter;
18
+ }
@@ -0,0 +1,3 @@
1
+ import { EventBusListener } from './interfaces';
2
+ import { EventListeners } from './interfaces/externalCommunicator';
3
+ export declare function collectEventBusListeners(eventBusListeners: EventBusListener[]): EventListeners;
package/dist/utils.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectEventBusListeners = void 0;
4
+ function collectEventBusListeners(eventBusListeners) {
5
+ const eventListeners = {};
6
+ for (const listener of eventBusListeners) {
7
+ eventListeners[listener.event] = listener;
8
+ }
9
+ return eventListeners;
10
+ }
11
+ exports.collectEventBusListeners = collectEventBusListeners;
12
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAGA,SAAgB,wBAAwB,CAAC,iBAAqC;IAC1E,MAAM,cAAc,GAAmB,EAAE,CAAA;IAEzC,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE;QACtC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAA;KAC5C;IAED,OAAO,cAAc,CAAA;AACzB,CAAC;AARD,4DAQC"}
package/package.json ADDED
@@ -0,0 +1,105 @@
1
+ {
2
+ "name": "@diia-inhouse/diia-queue",
3
+ "version": "7.3.0",
4
+ "description": "Package provide queue functionality",
5
+ "main": "dist/index.js",
6
+ "types": "dist/types/index.d.ts",
7
+ "repository": "https://github.com/diia-open-source/be-diia-queue.git",
8
+ "author": "Diia",
9
+ "license": "SEE LICENSE IN LICENSE.md",
10
+ "engines": {
11
+ "node": ">=18"
12
+ },
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "scripts": {
17
+ "build": "rimraf dist/ && tsc",
18
+ "start": "node dist/index.js",
19
+ "lint": "eslint --ext .ts . && prettier --check .",
20
+ "lint-fix": "eslint --ext .ts --fix && prettier --write .",
21
+ "lint:lockfile": "lockfile-lint --path package-lock.json --allowed-hosts registry.npmjs.org --validate-https",
22
+ "format": "prettier --write \"src/**/*.ts\"",
23
+ "prepare": "npm run build",
24
+ "semantic-release": "semantic-release",
25
+ "test": "jest",
26
+ "test:integration": "npm run test --selectProjects integration --",
27
+ "test:unit": "npm run test --selectProjects unit --",
28
+ "test:coverage": "npm run test --selectProjects unit --coverage",
29
+ "find-circulars": "madge --circular --extensions ts ./"
30
+ },
31
+ "dependencies": {
32
+ "@diia-inhouse/env": "1.16.0",
33
+ "@types/amqplib": "0.10.4",
34
+ "amqplib": "0.10.3",
35
+ "lodash": "4.17.21",
36
+ "p-timeout": "4.1.0",
37
+ "uuid": "9.0.1"
38
+ },
39
+ "peerDependencies": {
40
+ "@diia-inhouse/diia-metrics": ">=3.6.0",
41
+ "@diia-inhouse/errors": ">=1.4.0",
42
+ "@diia-inhouse/redis": ">=2.1.1",
43
+ "@diia-inhouse/types": ">=5.0.0",
44
+ "@diia-inhouse/utils": ">=2.21.0",
45
+ "@diia-inhouse/validators": ">=1.5.0",
46
+ "@opentelemetry/api": ">=1.7.0"
47
+ },
48
+ "devDependencies": {
49
+ "@diia-inhouse/configs": "1.31.1",
50
+ "@diia-inhouse/crypto": "1.11.0",
51
+ "@diia-inhouse/diia-logger": "2.15.0",
52
+ "@diia-inhouse/diia-metrics": "3.11.0",
53
+ "@diia-inhouse/errors": "1.9.0",
54
+ "@diia-inhouse/eslint-config": "5.1.0",
55
+ "@diia-inhouse/eslint-plugin": "1.6.0",
56
+ "@diia-inhouse/redis": "2.12.0",
57
+ "@diia-inhouse/test": "6.3.0",
58
+ "@diia-inhouse/types": "6.24.0",
59
+ "@diia-inhouse/utils": "3.5.0",
60
+ "@diia-inhouse/validators": "1.17.0",
61
+ "@opentelemetry/api": "1.7.0",
62
+ "@types/lodash": "4.14.202",
63
+ "@types/node": "20.11.5",
64
+ "@types/uuid": "9.0.7",
65
+ "glob": "10.3.10",
66
+ "lockfile-lint": "4.12.1",
67
+ "madge": "6.1.0",
68
+ "protobufjs": "7.2.5",
69
+ "type-fest": "4.8.2"
70
+ },
71
+ "release": {
72
+ "extends": "@diia-inhouse/configs/dist/semantic-release/package"
73
+ },
74
+ "commitlint": {
75
+ "extends": "@diia-inhouse/configs/dist/commitlint"
76
+ },
77
+ "eslintConfig": {
78
+ "extends": "@diia-inhouse/eslint-config",
79
+ "rules": {
80
+ "@typescript-eslint/no-unnecessary-condition": [
81
+ "off"
82
+ ]
83
+ },
84
+ "overrides": [
85
+ {
86
+ "files": [
87
+ "*.ts"
88
+ ],
89
+ "parserOptions": {
90
+ "project": [
91
+ "./tsconfig.json",
92
+ "./tests/tsconfig.json"
93
+ ]
94
+ }
95
+ }
96
+ ]
97
+ },
98
+ "jest": {
99
+ "preset": "@diia-inhouse/configs/dist/jest"
100
+ },
101
+ "prettier": "@diia-inhouse/eslint-config/prettier",
102
+ "madge": {
103
+ "tsConfig": "./tsconfig.json"
104
+ }
105
+ }