amqp-connection-manager 4.1.1 → 4.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/MessageStore.js +83 -0
- package/dist/cjs/index.js +1 -0
- package/dist/esm/ChannelWrapper.d.ts +1 -1
- package/dist/esm/MessageStore.d.ts +71 -0
- package/dist/esm/MessageStore.js +80 -0
- package/dist/esm/MessageStore.js.map +1 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryMessageStore = void 0;
|
|
4
|
+
class InMemoryMessageStore {
|
|
5
|
+
constructor() {
|
|
6
|
+
/** Queued messages, not yet sent. */
|
|
7
|
+
this._messages = [];
|
|
8
|
+
/** Published, but not yet confirmed messages. */
|
|
9
|
+
this._unconfirmedMessages = [];
|
|
10
|
+
}
|
|
11
|
+
queueMessage(message, timeout) {
|
|
12
|
+
if (timeout) {
|
|
13
|
+
message.timeout = setTimeout(() => {
|
|
14
|
+
let idx = this._messages.indexOf(message);
|
|
15
|
+
if (idx !== -1) {
|
|
16
|
+
this._messages.splice(idx, 1);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
idx = this._unconfirmedMessages.indexOf(message);
|
|
20
|
+
if (idx !== -1) {
|
|
21
|
+
this._unconfirmedMessages.splice(idx, 1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
message.isTimedout = true;
|
|
25
|
+
message.reject(new Error('timeout'));
|
|
26
|
+
}, timeout);
|
|
27
|
+
}
|
|
28
|
+
this._messages.push(message);
|
|
29
|
+
}
|
|
30
|
+
getMessageToSend() {
|
|
31
|
+
return this._messages.shift();
|
|
32
|
+
}
|
|
33
|
+
queueLength() {
|
|
34
|
+
return this._messages.length;
|
|
35
|
+
}
|
|
36
|
+
messageSent(message) {
|
|
37
|
+
this._unconfirmedMessages.push(message);
|
|
38
|
+
}
|
|
39
|
+
messageSendFailed(message) {
|
|
40
|
+
this._removeUnconfirmedMessage(message);
|
|
41
|
+
// Tried to write to a closed channel. Put the message back in the queue
|
|
42
|
+
// and we'll try again when we reconnect.
|
|
43
|
+
// TODO: Are we worried about re-ordering messages here?
|
|
44
|
+
this._messages.unshift(message);
|
|
45
|
+
}
|
|
46
|
+
messageResolved(message, canSend) {
|
|
47
|
+
this._removeUnconfirmedMessage(message);
|
|
48
|
+
message.resolve(canSend);
|
|
49
|
+
}
|
|
50
|
+
messageRejected(message, err) {
|
|
51
|
+
this._removeUnconfirmedMessage(message);
|
|
52
|
+
message.reject(err);
|
|
53
|
+
}
|
|
54
|
+
rejectAll(err) {
|
|
55
|
+
if (this._messages.length !== 0) {
|
|
56
|
+
// Reject any unsent messages.
|
|
57
|
+
this._messages.forEach((message) => {
|
|
58
|
+
if (message.timeout) {
|
|
59
|
+
clearTimeout(message.timeout);
|
|
60
|
+
}
|
|
61
|
+
message.reject(err);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (this._unconfirmedMessages.length !== 0) {
|
|
65
|
+
// Reject any unconfirmed messages.
|
|
66
|
+
this._unconfirmedMessages.forEach((message) => {
|
|
67
|
+
if (message.timeout) {
|
|
68
|
+
clearTimeout(message.timeout);
|
|
69
|
+
}
|
|
70
|
+
message.reject(err);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
_removeUnconfirmedMessage(message) {
|
|
75
|
+
const toRemove = this._unconfirmedMessages.indexOf(message);
|
|
76
|
+
if (toRemove === -1) {
|
|
77
|
+
throw new Error(`Message is not in _unconfirmedMessages!`);
|
|
78
|
+
}
|
|
79
|
+
const removed = this._unconfirmedMessages.splice(toRemove, 1);
|
|
80
|
+
return removed[0];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.InMemoryMessageStore = InMemoryMessageStore;
|
package/dist/cjs/index.js
CHANGED
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.AmqpConnectionManagerClass = exports.connect = void 0;
|
|
7
|
+
/* eslint-disable @typescript-eslint/no-namespace */
|
|
7
8
|
const AmqpConnectionManager_js_1 = __importDefault(require("./AmqpConnectionManager.js"));
|
|
8
9
|
exports.AmqpConnectionManagerClass = AmqpConnectionManager_js_1.default;
|
|
9
10
|
function connect(urls, options) {
|
|
@@ -28,7 +28,7 @@ export interface CreateChannelOpts {
|
|
|
28
28
|
*/
|
|
29
29
|
publishTimeout?: number;
|
|
30
30
|
}
|
|
31
|
-
interface PublishOptions extends Options.Publish {
|
|
31
|
+
export interface PublishOptions extends Options.Publish {
|
|
32
32
|
/** Message will be rejected after timeout ms */
|
|
33
33
|
timeout?: number;
|
|
34
34
|
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type * as amqplib from 'amqplib';
|
|
3
|
+
export interface PublishMessage {
|
|
4
|
+
type: 'publish';
|
|
5
|
+
exchange: string;
|
|
6
|
+
routingKey: string;
|
|
7
|
+
content: Buffer;
|
|
8
|
+
options?: amqplib.Options.Publish;
|
|
9
|
+
resolve: (result: boolean) => void;
|
|
10
|
+
reject: (err: Error) => void;
|
|
11
|
+
timeout?: NodeJS.Timeout;
|
|
12
|
+
isTimedout: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface SendToQueueMessage {
|
|
15
|
+
type: 'sendToQueue';
|
|
16
|
+
queue: string;
|
|
17
|
+
content: Buffer;
|
|
18
|
+
options?: amqplib.Options.Publish;
|
|
19
|
+
resolve: (result: boolean) => void;
|
|
20
|
+
reject: (err: Error) => void;
|
|
21
|
+
timeout?: NodeJS.Timeout;
|
|
22
|
+
isTimedout: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare type Message = PublishMessage | SendToQueueMessage;
|
|
25
|
+
export interface MessageStore {
|
|
26
|
+
/**
|
|
27
|
+
* This is called before a message is sent, to queue the message.
|
|
28
|
+
*/
|
|
29
|
+
queueMessage(message: Message, timeout?: number): void;
|
|
30
|
+
/**
|
|
31
|
+
* Return the next message to send (the oldest queued message).
|
|
32
|
+
*/
|
|
33
|
+
getMessageToSend(): Message | undefined;
|
|
34
|
+
/** Returns the number of unsent messages queued in this MessageStore. */
|
|
35
|
+
queueLength(): number;
|
|
36
|
+
/**
|
|
37
|
+
* This is called after a message is sent, to mark the message as unconfirmed.
|
|
38
|
+
*/
|
|
39
|
+
messageSent(message: Message): void;
|
|
40
|
+
/**
|
|
41
|
+
* Called when a message failed to send because the connection was temporarily lost.
|
|
42
|
+
*/
|
|
43
|
+
messageSendFailed(message: Message): void;
|
|
44
|
+
/**
|
|
45
|
+
* This is called after a message is confirmed, to remove the message from the store.
|
|
46
|
+
*/
|
|
47
|
+
messageResolved(message: Message, canSend: boolean): void;
|
|
48
|
+
/**
|
|
49
|
+
* Called when a message has failed and cannot be sent.
|
|
50
|
+
*/
|
|
51
|
+
messageRejected(message: Message, err: Error): void;
|
|
52
|
+
/**
|
|
53
|
+
* Called when the channel is closed, to reject any unsent/unconfirmed messages.
|
|
54
|
+
*/
|
|
55
|
+
rejectAll(err: Error): void;
|
|
56
|
+
}
|
|
57
|
+
export declare class InMemoryMessageStore implements MessageStore {
|
|
58
|
+
/** Queued messages, not yet sent. */
|
|
59
|
+
private _messages;
|
|
60
|
+
/** Published, but not yet confirmed messages. */
|
|
61
|
+
private _unconfirmedMessages;
|
|
62
|
+
queueMessage(message: Message, timeout?: number): void;
|
|
63
|
+
getMessageToSend(): Message | undefined;
|
|
64
|
+
queueLength(): number;
|
|
65
|
+
messageSent(message: Message): void;
|
|
66
|
+
messageSendFailed(message: Message): void;
|
|
67
|
+
messageResolved(message: Message, canSend: boolean): void;
|
|
68
|
+
messageRejected(message: Message, err: Error): void;
|
|
69
|
+
rejectAll(err: Error): void;
|
|
70
|
+
private _removeUnconfirmedMessage;
|
|
71
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export class InMemoryMessageStore {
|
|
2
|
+
constructor() {
|
|
3
|
+
/** Queued messages, not yet sent. */
|
|
4
|
+
this._messages = [];
|
|
5
|
+
/** Published, but not yet confirmed messages. */
|
|
6
|
+
this._unconfirmedMessages = [];
|
|
7
|
+
}
|
|
8
|
+
queueMessage(message, timeout) {
|
|
9
|
+
if (timeout) {
|
|
10
|
+
message.timeout = setTimeout(() => {
|
|
11
|
+
let idx = this._messages.indexOf(message);
|
|
12
|
+
if (idx !== -1) {
|
|
13
|
+
this._messages.splice(idx, 1);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
idx = this._unconfirmedMessages.indexOf(message);
|
|
17
|
+
if (idx !== -1) {
|
|
18
|
+
this._unconfirmedMessages.splice(idx, 1);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
message.isTimedout = true;
|
|
22
|
+
message.reject(new Error('timeout'));
|
|
23
|
+
}, timeout);
|
|
24
|
+
}
|
|
25
|
+
this._messages.push(message);
|
|
26
|
+
}
|
|
27
|
+
getMessageToSend() {
|
|
28
|
+
return this._messages.shift();
|
|
29
|
+
}
|
|
30
|
+
queueLength() {
|
|
31
|
+
return this._messages.length;
|
|
32
|
+
}
|
|
33
|
+
messageSent(message) {
|
|
34
|
+
this._unconfirmedMessages.push(message);
|
|
35
|
+
}
|
|
36
|
+
messageSendFailed(message) {
|
|
37
|
+
this._removeUnconfirmedMessage(message);
|
|
38
|
+
// Tried to write to a closed channel. Put the message back in the queue
|
|
39
|
+
// and we'll try again when we reconnect.
|
|
40
|
+
// TODO: Are we worried about re-ordering messages here?
|
|
41
|
+
this._messages.unshift(message);
|
|
42
|
+
}
|
|
43
|
+
messageResolved(message, canSend) {
|
|
44
|
+
this._removeUnconfirmedMessage(message);
|
|
45
|
+
message.resolve(canSend);
|
|
46
|
+
}
|
|
47
|
+
messageRejected(message, err) {
|
|
48
|
+
this._removeUnconfirmedMessage(message);
|
|
49
|
+
message.reject(err);
|
|
50
|
+
}
|
|
51
|
+
rejectAll(err) {
|
|
52
|
+
if (this._messages.length !== 0) {
|
|
53
|
+
// Reject any unsent messages.
|
|
54
|
+
this._messages.forEach((message) => {
|
|
55
|
+
if (message.timeout) {
|
|
56
|
+
clearTimeout(message.timeout);
|
|
57
|
+
}
|
|
58
|
+
message.reject(err);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (this._unconfirmedMessages.length !== 0) {
|
|
62
|
+
// Reject any unconfirmed messages.
|
|
63
|
+
this._unconfirmedMessages.forEach((message) => {
|
|
64
|
+
if (message.timeout) {
|
|
65
|
+
clearTimeout(message.timeout);
|
|
66
|
+
}
|
|
67
|
+
message.reject(err);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
_removeUnconfirmedMessage(message) {
|
|
72
|
+
const toRemove = this._unconfirmedMessages.indexOf(message);
|
|
73
|
+
if (toRemove === -1) {
|
|
74
|
+
throw new Error(`Message is not in _unconfirmedMessages!`);
|
|
75
|
+
}
|
|
76
|
+
const removed = this._unconfirmedMessages.splice(toRemove, 1);
|
|
77
|
+
return removed[0];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=MessageStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageStore.js","sourceRoot":"","sources":["../../src/MessageStore.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import AmqpConnectionManager, { AmqpConnectionManagerOptions, ConnectionUrl, IAmqpConnectionManager } from './AmqpConnectionManager.js';
|
|
2
|
+
import { PublishOptions } from './ChannelWrapper.js';
|
|
2
3
|
export type { AmqpConnectionManagerOptions, ConnectionUrl, IAmqpConnectionManager as AmqpConnectionManager, } from './AmqpConnectionManager.js';
|
|
3
4
|
export type { CreateChannelOpts, default as ChannelWrapper, SetupFunc, Channel, } from './ChannelWrapper.js';
|
|
5
|
+
import { Options as AmqpLibOptions } from 'amqplib';
|
|
6
|
+
export declare namespace Options {
|
|
7
|
+
type Connect = AmqpLibOptions.Connect;
|
|
8
|
+
type AssertQueue = AmqpLibOptions.AssertQueue;
|
|
9
|
+
type DeleteQueue = AmqpLibOptions.DeleteQueue;
|
|
10
|
+
type AssertExchange = AmqpLibOptions.AssertExchange;
|
|
11
|
+
type DeleteExchange = AmqpLibOptions.DeleteExchange;
|
|
12
|
+
type Publish = PublishOptions;
|
|
13
|
+
type Consume = AmqpLibOptions.Consume;
|
|
14
|
+
type Get = AmqpLibOptions.Get;
|
|
15
|
+
}
|
|
4
16
|
export declare function connect(urls: ConnectionUrl | ConnectionUrl[] | undefined | null, options?: AmqpConnectionManagerOptions): IAmqpConnectionManager;
|
|
5
17
|
export { AmqpConnectionManager as AmqpConnectionManagerClass };
|
|
6
18
|
declare const amqp: {
|
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,qBAIN,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,qBAIN,MAAM,4BAA4B,CAAC;AA4BpC,MAAM,UAAU,OAAO,CACnB,IAAwD,EACxD,OAAsC;IAEtC,MAAM,IAAI,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QACtB,UAAU;IACd,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,OAAO,EAAE,qBAAqB,IAAI,0BAA0B,EAAE,CAAC;AAE/D,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC;AAEzB,eAAe,IAAI,CAAC"}
|