@azure/web-pubsub-client 1.0.4-alpha.20251104.1 → 1.0.4-alpha.20251106.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/dist/browser/ackManager.d.ts +22 -0
- package/dist/browser/ackManager.d.ts.map +1 -0
- package/dist/browser/ackManager.js +105 -0
- package/dist/browser/ackManager.js.map +1 -0
- package/dist/browser/webPubSubClient.d.ts +1 -3
- package/dist/browser/webPubSubClient.d.ts.map +1 -1
- package/dist/browser/webPubSubClient.js +24 -75
- package/dist/browser/webPubSubClient.js.map +1 -1
- package/dist/commonjs/ackManager.d.ts +22 -0
- package/dist/commonjs/ackManager.d.ts.map +1 -0
- package/dist/commonjs/ackManager.js +109 -0
- package/dist/commonjs/ackManager.js.map +1 -0
- package/dist/commonjs/webPubSubClient.d.ts +1 -3
- package/dist/commonjs/webPubSubClient.d.ts.map +1 -1
- package/dist/commonjs/webPubSubClient.js +24 -75
- package/dist/commonjs/webPubSubClient.js.map +1 -1
- package/dist/esm/ackManager.d.ts +22 -0
- package/dist/esm/ackManager.d.ts.map +1 -0
- package/dist/esm/ackManager.js +105 -0
- package/dist/esm/ackManager.js.map +1 -0
- package/dist/esm/webPubSubClient.d.ts +1 -3
- package/dist/esm/webPubSubClient.d.ts.map +1 -1
- package/dist/esm/webPubSubClient.js +24 -75
- package/dist/esm/webPubSubClient.js.map +1 -1
- package/dist/react-native/ackManager.d.ts +22 -0
- package/dist/react-native/ackManager.d.ts.map +1 -0
- package/dist/react-native/ackManager.js +105 -0
- package/dist/react-native/ackManager.js.map +1 -0
- package/dist/react-native/webPubSubClient.d.ts +1 -3
- package/dist/react-native/webPubSubClient.d.ts.map +1 -1
- package/dist/react-native/webPubSubClient.js +24 -75
- package/dist/react-native/webPubSubClient.js.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AbortSignalLike } from "@azure/abort-controller";
|
|
2
|
+
import type { WebPubSubResult } from "./models/index.js";
|
|
3
|
+
export interface AckRegistration {
|
|
4
|
+
ackId: number;
|
|
5
|
+
wait(abortSignal?: AbortSignalLike): Promise<WebPubSubResult>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Manages ack id generation and pending ack entries.
|
|
9
|
+
*/
|
|
10
|
+
export declare class AckManager {
|
|
11
|
+
private readonly _ackEntries;
|
|
12
|
+
private _ackId;
|
|
13
|
+
constructor(initialAckId?: number);
|
|
14
|
+
registerAck(ackId?: number): AckRegistration;
|
|
15
|
+
resolveAck(ackId: number, result: WebPubSubResult): boolean;
|
|
16
|
+
rejectAck(ackId: number, reason: unknown): boolean;
|
|
17
|
+
discard(ackId: number): void;
|
|
18
|
+
rejectAll(createReason: (ackId: number) => unknown): void;
|
|
19
|
+
private _waitForEntry;
|
|
20
|
+
private _generateAckId;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=ackManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ackManager.d.ts","sourceRoot":"","sources":["../../src/ackManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,WAAW,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC/D;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAC5D,OAAO,CAAC,MAAM,CAAS;gBAEX,YAAY,SAAI;IAIrB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe;IAc5C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO;IAU3D,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO;IAUlD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5B,SAAS,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI;IAQhE,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,cAAc;CAIvB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
import { SendMessageError } from "./errors/index.js";
|
|
4
|
+
import { abortablePromise } from "./utils/abortablePromise.js";
|
|
5
|
+
/**
|
|
6
|
+
* Manages ack id generation and pending ack entries.
|
|
7
|
+
*/
|
|
8
|
+
export class AckManager {
|
|
9
|
+
_ackEntries = new Map();
|
|
10
|
+
_ackId;
|
|
11
|
+
constructor(initialAckId = 0) {
|
|
12
|
+
this._ackId = initialAckId;
|
|
13
|
+
}
|
|
14
|
+
registerAck(ackId) {
|
|
15
|
+
const resolvedAckId = ackId ?? this._generateAckId();
|
|
16
|
+
let entry = this._ackEntries.get(resolvedAckId);
|
|
17
|
+
if (!entry) {
|
|
18
|
+
entry = new AckEntity(resolvedAckId);
|
|
19
|
+
this._ackEntries.set(resolvedAckId, entry);
|
|
20
|
+
}
|
|
21
|
+
const ackEntry = entry;
|
|
22
|
+
return {
|
|
23
|
+
ackId: resolvedAckId,
|
|
24
|
+
wait: (abortSignal) => this._waitForEntry(ackEntry, abortSignal),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
resolveAck(ackId, result) {
|
|
28
|
+
const entry = this._ackEntries.get(ackId);
|
|
29
|
+
if (!entry) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
this._ackEntries.delete(ackId);
|
|
33
|
+
entry.resolve(result);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
rejectAck(ackId, reason) {
|
|
37
|
+
const entry = this._ackEntries.get(ackId);
|
|
38
|
+
if (!entry) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
this._ackEntries.delete(ackId);
|
|
42
|
+
entry.reject(reason);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
discard(ackId) {
|
|
46
|
+
this._ackEntries.delete(ackId);
|
|
47
|
+
}
|
|
48
|
+
rejectAll(createReason) {
|
|
49
|
+
this._ackEntries.forEach((entry, ackId) => {
|
|
50
|
+
if (this._ackEntries.delete(ackId)) {
|
|
51
|
+
entry.reject(createReason(ackId));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
_waitForEntry(entry, abortSignal) {
|
|
56
|
+
if (!abortSignal) {
|
|
57
|
+
return entry.promise();
|
|
58
|
+
}
|
|
59
|
+
return abortablePromise(entry.promise(), abortSignal).catch((err) => {
|
|
60
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
61
|
+
throw new SendMessageError("Cancelled by abortSignal", { ackId: entry.ackId });
|
|
62
|
+
}
|
|
63
|
+
throw err;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
_generateAckId() {
|
|
67
|
+
this._ackId += 1;
|
|
68
|
+
return this._ackId;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
class AckEntity {
|
|
72
|
+
ackId;
|
|
73
|
+
_promise;
|
|
74
|
+
_resolve;
|
|
75
|
+
_reject;
|
|
76
|
+
constructor(ackId) {
|
|
77
|
+
this.ackId = ackId;
|
|
78
|
+
this._promise = new Promise((resolve, reject) => {
|
|
79
|
+
this._resolve = resolve;
|
|
80
|
+
this._reject = reject;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
promise() {
|
|
84
|
+
return this._promise;
|
|
85
|
+
}
|
|
86
|
+
resolve(value) {
|
|
87
|
+
const callback = this._resolve;
|
|
88
|
+
if (!callback) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
this._resolve = undefined;
|
|
92
|
+
this._reject = undefined;
|
|
93
|
+
callback(value);
|
|
94
|
+
}
|
|
95
|
+
reject(reason) {
|
|
96
|
+
const callback = this._reject;
|
|
97
|
+
if (!callback) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this._resolve = undefined;
|
|
101
|
+
this._reject = undefined;
|
|
102
|
+
callback(reason);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=ackManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ackManager.js","sourceRoot":"","sources":["../../src/ackManager.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { WebPubSubResult } from \"./models/index.js\";\nimport { SendMessageError } from \"./errors/index.js\";\nimport { abortablePromise } from \"./utils/abortablePromise.js\";\n\nexport interface AckRegistration {\n ackId: number;\n wait(abortSignal?: AbortSignalLike): Promise<WebPubSubResult>;\n}\n\n/**\n * Manages ack id generation and pending ack entries.\n */\nexport class AckManager {\n private readonly _ackEntries = new Map<number, AckEntity>();\n private _ackId: number;\n\n constructor(initialAckId = 0) {\n this._ackId = initialAckId;\n }\n\n public registerAck(ackId?: number): AckRegistration {\n const resolvedAckId = ackId ?? this._generateAckId();\n let entry = this._ackEntries.get(resolvedAckId);\n if (!entry) {\n entry = new AckEntity(resolvedAckId);\n this._ackEntries.set(resolvedAckId, entry);\n }\n const ackEntry = entry;\n return {\n ackId: resolvedAckId,\n wait: (abortSignal?: AbortSignalLike) => this._waitForEntry(ackEntry, abortSignal),\n };\n }\n\n public resolveAck(ackId: number, result: WebPubSubResult): boolean {\n const entry = this._ackEntries.get(ackId);\n if (!entry) {\n return false;\n }\n this._ackEntries.delete(ackId);\n entry.resolve(result);\n return true;\n }\n\n public rejectAck(ackId: number, reason: unknown): boolean {\n const entry = this._ackEntries.get(ackId);\n if (!entry) {\n return false;\n }\n this._ackEntries.delete(ackId);\n entry.reject(reason);\n return true;\n }\n\n public discard(ackId: number): void {\n this._ackEntries.delete(ackId);\n }\n\n public rejectAll(createReason: (ackId: number) => unknown): void {\n this._ackEntries.forEach((entry, ackId) => {\n if (this._ackEntries.delete(ackId)) {\n entry.reject(createReason(ackId));\n }\n });\n }\n\n private _waitForEntry(entry: AckEntity, abortSignal?: AbortSignalLike): Promise<WebPubSubResult> {\n if (!abortSignal) {\n return entry.promise();\n }\n\n return abortablePromise(entry.promise(), abortSignal).catch((err) => {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new SendMessageError(\"Cancelled by abortSignal\", { ackId: entry.ackId });\n }\n throw err;\n });\n }\n\n private _generateAckId(): number {\n this._ackId += 1;\n return this._ackId;\n }\n}\n\nclass AckEntity {\n private readonly _promise: Promise<WebPubSubResult>;\n private _resolve: ((value: WebPubSubResult | PromiseLike<WebPubSubResult>) => void) | undefined;\n private _reject: ((reason?: unknown) => void) | undefined;\n\n constructor(public readonly ackId: number) {\n this._promise = new Promise<WebPubSubResult>((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n }\n\n public promise(): Promise<WebPubSubResult> {\n return this._promise;\n }\n\n public resolve(value: WebPubSubResult | PromiseLike<WebPubSubResult>): void {\n const callback = this._resolve;\n if (!callback) {\n return;\n }\n this._resolve = undefined;\n this._reject = undefined;\n callback(value);\n }\n\n public reject(reason?: unknown): void {\n const callback = this._reject;\n if (!callback) {\n return;\n }\n this._resolve = undefined;\n this._reject = undefined;\n callback(reason);\n }\n}\n"]}
|
|
@@ -13,7 +13,7 @@ export declare class WebPubSubClient {
|
|
|
13
13
|
private readonly _credential;
|
|
14
14
|
private readonly _options;
|
|
15
15
|
private readonly _groupMap;
|
|
16
|
-
private readonly
|
|
16
|
+
private readonly _ackManager;
|
|
17
17
|
private readonly _sequenceId;
|
|
18
18
|
private readonly _messageRetryPolicy;
|
|
19
19
|
private readonly _reconnectRetryPolicy;
|
|
@@ -22,7 +22,6 @@ export declare class WebPubSubClient {
|
|
|
22
22
|
private readonly _emitter;
|
|
23
23
|
private _state;
|
|
24
24
|
private _isStopping;
|
|
25
|
-
private _ackId;
|
|
26
25
|
private _activeKeepaliveTask;
|
|
27
26
|
private _wsClient?;
|
|
28
27
|
private _uri?;
|
|
@@ -32,7 +31,6 @@ export declare class WebPubSubClient {
|
|
|
32
31
|
private _reconnectionToken?;
|
|
33
32
|
private _isInitialConnected;
|
|
34
33
|
private _sequenceAckTask?;
|
|
35
|
-
private nextAckId;
|
|
36
34
|
/**
|
|
37
35
|
* Create an instance of WebPubSubClient
|
|
38
36
|
* @param clientAccessUrl - The uri to connect
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webPubSubClient.d.ts","sourceRoot":"","sources":["../../src/webPubSubClient.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,EAEb,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAKV,iBAAiB,EAQlB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAgBhF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"webPubSubClient.d.ts","sourceRoot":"","sources":["../../src/webPubSubClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { SendMessageError } from "./errors/index.js";
|
|
|
6
6
|
import { logger } from "./logger.js";
|
|
7
7
|
import { WebPubSubJsonReliableProtocol } from "./protocols/index.js";
|
|
8
8
|
import { WebSocketClientFactory } from "./websocket/websocketClient.js";
|
|
9
|
-
import {
|
|
9
|
+
import { AckManager } from "./ackManager.js";
|
|
10
10
|
var WebPubSubClientState;
|
|
11
11
|
(function (WebPubSubClientState) {
|
|
12
12
|
WebPubSubClientState["Stopped"] = "Stopped";
|
|
@@ -23,7 +23,7 @@ export class WebPubSubClient {
|
|
|
23
23
|
_credential;
|
|
24
24
|
_options;
|
|
25
25
|
_groupMap;
|
|
26
|
-
|
|
26
|
+
_ackManager;
|
|
27
27
|
_sequenceId;
|
|
28
28
|
_messageRetryPolicy;
|
|
29
29
|
_reconnectRetryPolicy;
|
|
@@ -32,7 +32,6 @@ export class WebPubSubClient {
|
|
|
32
32
|
_emitter = new EventEmitter();
|
|
33
33
|
_state;
|
|
34
34
|
_isStopping = false;
|
|
35
|
-
_ackId;
|
|
36
35
|
_activeKeepaliveTask;
|
|
37
36
|
// connection lifetime
|
|
38
37
|
_wsClient;
|
|
@@ -43,10 +42,6 @@ export class WebPubSubClient {
|
|
|
43
42
|
_reconnectionToken;
|
|
44
43
|
_isInitialConnected = false;
|
|
45
44
|
_sequenceAckTask;
|
|
46
|
-
nextAckId() {
|
|
47
|
-
this._ackId = this._ackId + 1;
|
|
48
|
-
return this._ackId;
|
|
49
|
-
}
|
|
50
45
|
constructor(credential, options) {
|
|
51
46
|
if (typeof credential === "string") {
|
|
52
47
|
this._credential = { getClientAccessUrl: credential };
|
|
@@ -63,10 +58,9 @@ export class WebPubSubClient {
|
|
|
63
58
|
this._reconnectRetryPolicy = new RetryPolicy(this._options.reconnectRetryOptions);
|
|
64
59
|
this._protocol = this._options.protocol;
|
|
65
60
|
this._groupMap = new Map();
|
|
66
|
-
this.
|
|
61
|
+
this._ackManager = new AckManager();
|
|
67
62
|
this._sequenceId = new SequenceId();
|
|
68
63
|
this._state = WebPubSubClientState.Stopped;
|
|
69
|
-
this._ackId = 0;
|
|
70
64
|
}
|
|
71
65
|
/**
|
|
72
66
|
* Start to start to the service.
|
|
@@ -354,22 +348,18 @@ export class WebPubSubClient {
|
|
|
354
348
|
});
|
|
355
349
|
client.onmessage((data) => {
|
|
356
350
|
const handleAckMessage = (message) => {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
this.
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
ackId: message.ackId,
|
|
370
|
-
errorDetail: message.error,
|
|
371
|
-
}));
|
|
372
|
-
}
|
|
351
|
+
const isDuplicated = message.error != null && message.error.name === "Duplicate";
|
|
352
|
+
if (message.success || isDuplicated) {
|
|
353
|
+
this._ackManager.resolveAck(message.ackId, {
|
|
354
|
+
ackId: message.ackId,
|
|
355
|
+
isDuplicated: isDuplicated,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
this._ackManager.rejectAck(message.ackId, new SendMessageError("Failed to send message.", {
|
|
360
|
+
ackId: message.ackId,
|
|
361
|
+
errorDetail: message.error,
|
|
362
|
+
}));
|
|
373
363
|
}
|
|
374
364
|
};
|
|
375
365
|
const handleConnectedMessage = async (message) => {
|
|
@@ -542,46 +532,27 @@ export class WebPubSubClient {
|
|
|
542
532
|
await this._wsClient.send(payload, abortSignal);
|
|
543
533
|
}
|
|
544
534
|
async _sendMessageWithAckId(messageProvider, ackId, abortSignal) {
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
}
|
|
548
|
-
const message = messageProvider(ackId);
|
|
549
|
-
if (!this._ackMap.has(ackId)) {
|
|
550
|
-
this._ackMap.set(ackId, new AckEntity(ackId));
|
|
551
|
-
}
|
|
552
|
-
const entity = this._ackMap.get(ackId);
|
|
535
|
+
const { ackId: resolvedAckId, wait } = this._ackManager.registerAck(ackId);
|
|
536
|
+
const message = messageProvider(resolvedAckId);
|
|
553
537
|
try {
|
|
554
538
|
await this._sendMessage(message, abortSignal);
|
|
555
539
|
}
|
|
556
540
|
catch (error) {
|
|
557
|
-
this.
|
|
541
|
+
this._ackManager.discard(resolvedAckId);
|
|
558
542
|
let errorMessage = "";
|
|
559
543
|
if (error instanceof Error) {
|
|
560
544
|
errorMessage = error.message;
|
|
561
545
|
}
|
|
562
|
-
throw new SendMessageError(errorMessage, { ackId:
|
|
563
|
-
}
|
|
564
|
-
if (abortSignal) {
|
|
565
|
-
try {
|
|
566
|
-
return await abortablePromise(entity.promise(), abortSignal);
|
|
567
|
-
}
|
|
568
|
-
catch (err) {
|
|
569
|
-
if (err instanceof Error && err.name === "AbortError") {
|
|
570
|
-
throw new SendMessageError("Cancelled by abortSignal", { ackId: ackId });
|
|
571
|
-
}
|
|
572
|
-
throw err;
|
|
573
|
-
}
|
|
546
|
+
throw new SendMessageError(errorMessage, { ackId: resolvedAckId });
|
|
574
547
|
}
|
|
575
|
-
return
|
|
548
|
+
return wait(abortSignal);
|
|
576
549
|
}
|
|
577
550
|
async _handleConnectionClose() {
|
|
578
551
|
// Clean ack cache
|
|
579
|
-
this.
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
}));
|
|
584
|
-
}
|
|
552
|
+
this._ackManager.rejectAll((ackId) => {
|
|
553
|
+
return new SendMessageError("Connection is disconnected before receive ack from the service", {
|
|
554
|
+
ackId,
|
|
555
|
+
});
|
|
585
556
|
});
|
|
586
557
|
if (this._isStopping) {
|
|
587
558
|
logger.warning("The client is stopping state. Stop recovery.");
|
|
@@ -790,28 +761,6 @@ class WebPubSubGroup {
|
|
|
790
761
|
this.name = name;
|
|
791
762
|
}
|
|
792
763
|
}
|
|
793
|
-
class AckEntity {
|
|
794
|
-
_promise;
|
|
795
|
-
_resolve;
|
|
796
|
-
_reject;
|
|
797
|
-
constructor(ackId) {
|
|
798
|
-
this._promise = new Promise((resolve, reject) => {
|
|
799
|
-
this._resolve = resolve;
|
|
800
|
-
this._reject = reject;
|
|
801
|
-
});
|
|
802
|
-
this.ackId = ackId;
|
|
803
|
-
}
|
|
804
|
-
ackId;
|
|
805
|
-
promise() {
|
|
806
|
-
return this._promise;
|
|
807
|
-
}
|
|
808
|
-
resolve(value) {
|
|
809
|
-
this._resolve(value);
|
|
810
|
-
}
|
|
811
|
-
reject(reason) {
|
|
812
|
-
this._reject(reason);
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
764
|
class SequenceId {
|
|
816
765
|
_sequenceId;
|
|
817
766
|
_isUpdate;
|