javonet-nodejs-sdk 2.6.0 → 2.6.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/core/webSocketClient/WebSocketClient.cjs +64 -9
- package/dist/core/webSocketClient/WebSocketClientBrowser.cjs +59 -4
- package/dist/types/core/webSocketClient/WebSocketClient.d.ts +24 -2
- package/dist/types/core/webSocketClient/WebSocketClientBrowser.d.ts +24 -2
- package/lib/core/webSocketClient/WebSocketClient.js +73 -7
- package/lib/core/webSocketClient/WebSocketClientBrowser.js +63 -2
- package/package.json +1 -1
|
@@ -19,7 +19,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var WebSocketClient_exports = {};
|
|
20
20
|
__export(WebSocketClient_exports, {
|
|
21
21
|
WebSocketClient: () => WebSocketClient,
|
|
22
|
-
clients: () => clients
|
|
22
|
+
clients: () => clients,
|
|
23
|
+
messageQueue: () => messageQueue,
|
|
24
|
+
processingQueues: () => processingQueues
|
|
23
25
|
});
|
|
24
26
|
module.exports = __toCommonJS(WebSocketClient_exports);
|
|
25
27
|
var import_Runtime = require("../../utils/Runtime.cjs");
|
|
@@ -39,6 +41,8 @@ const WebSocketStateEvent = {
|
|
|
39
41
|
};
|
|
40
42
|
let WebSocket = null;
|
|
41
43
|
const clients = {};
|
|
44
|
+
const messageQueue = {};
|
|
45
|
+
const processingQueues = {};
|
|
42
46
|
class WebSocketClient {
|
|
43
47
|
/**
|
|
44
48
|
* @param {string} url
|
|
@@ -56,15 +60,57 @@ class WebSocketClient {
|
|
|
56
60
|
return this.instance ? this.instance?.readyState === WebSocketStateEnum.OPEN : false;
|
|
57
61
|
}
|
|
58
62
|
/**
|
|
59
|
-
* Sends messageArray through websocket connection
|
|
63
|
+
* Sends messageArray through websocket connection with guaranteed order preservation
|
|
60
64
|
* @async
|
|
61
65
|
* @param {Int8Array} messageArray
|
|
62
66
|
* @returns {Promise<Int8Array>}
|
|
63
67
|
*/
|
|
64
68
|
send(messageArray) {
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
if (!messageQueue[this.url]) {
|
|
71
|
+
messageQueue[this.url] = [];
|
|
72
|
+
}
|
|
73
|
+
messageQueue[this.url].push({ resolve, reject, messageArray });
|
|
74
|
+
this._processMessage();
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Processes message queue sequentially to maintain order
|
|
79
|
+
* @private
|
|
80
|
+
* @async
|
|
81
|
+
*/
|
|
82
|
+
async _processMessage() {
|
|
83
|
+
if (processingQueues[this.url]) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
processingQueues[this.url] = true;
|
|
87
|
+
try {
|
|
88
|
+
while (messageQueue[this.url] && messageQueue[this.url].length > 0) {
|
|
89
|
+
const item = messageQueue[this.url].shift();
|
|
90
|
+
if (!item) break;
|
|
91
|
+
const { resolve, reject, messageArray } = item;
|
|
92
|
+
try {
|
|
93
|
+
const response = await this._send(messageArray);
|
|
94
|
+
resolve(response);
|
|
95
|
+
} catch (error) {
|
|
96
|
+
reject(error);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
} finally {
|
|
100
|
+
processingQueues[this.url] = false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Sends a single message through websocket connection
|
|
105
|
+
* @private
|
|
106
|
+
* @async
|
|
107
|
+
* @param {Int8Array} messageArray
|
|
108
|
+
* @returns {Promise<Int8Array>}
|
|
109
|
+
*/
|
|
110
|
+
_send(messageArray) {
|
|
65
111
|
return new Promise((resolve, reject) => {
|
|
66
112
|
const client = this.instance;
|
|
67
|
-
if (client) {
|
|
113
|
+
if (client && this.isConnected) {
|
|
68
114
|
client.send(
|
|
69
115
|
/** @type {any} */
|
|
70
116
|
messageArray
|
|
@@ -78,8 +124,8 @@ class WebSocketClient {
|
|
|
78
124
|
};
|
|
79
125
|
client.on(WebSocketStateEvent.MESSAGE, messageHandler);
|
|
80
126
|
} else {
|
|
81
|
-
this._connect().then((
|
|
82
|
-
|
|
127
|
+
this._connect().then((client2) => {
|
|
128
|
+
client2.send(
|
|
83
129
|
/** @type {any} */
|
|
84
130
|
messageArray
|
|
85
131
|
);
|
|
@@ -88,21 +134,28 @@ class WebSocketClient {
|
|
|
88
134
|
if (this.isDisconnectedAfterMessage) {
|
|
89
135
|
this.disconnect();
|
|
90
136
|
}
|
|
91
|
-
|
|
137
|
+
client2.removeListener(WebSocketStateEvent.MESSAGE, messageHandler);
|
|
92
138
|
};
|
|
93
|
-
|
|
139
|
+
client2.on(WebSocketStateEvent.MESSAGE, messageHandler);
|
|
94
140
|
}).catch(reject);
|
|
95
141
|
}
|
|
96
142
|
});
|
|
97
143
|
}
|
|
98
144
|
/**
|
|
99
|
-
* Disconnects the WebSocket by terminating the connection.
|
|
145
|
+
* Disconnects the WebSocket by terminating the connection and cleans up queues.
|
|
100
146
|
*/
|
|
101
147
|
disconnect() {
|
|
102
148
|
if (this.instance) {
|
|
103
149
|
this.instance.close();
|
|
104
150
|
delete clients[this.url];
|
|
105
151
|
}
|
|
152
|
+
if (messageQueue[this.url]) {
|
|
153
|
+
messageQueue[this.url].forEach(({ reject }) => {
|
|
154
|
+
reject(new Error("WebSocket disconnected"));
|
|
155
|
+
});
|
|
156
|
+
delete messageQueue[this.url];
|
|
157
|
+
}
|
|
158
|
+
delete processingQueues[this.url];
|
|
106
159
|
}
|
|
107
160
|
/**
|
|
108
161
|
* Connects to the WebSocket server.
|
|
@@ -144,5 +197,7 @@ class WebSocketClient {
|
|
|
144
197
|
// Annotate the CommonJS export names for ESM import in node:
|
|
145
198
|
0 && (module.exports = {
|
|
146
199
|
WebSocketClient,
|
|
147
|
-
clients
|
|
200
|
+
clients,
|
|
201
|
+
messageQueue,
|
|
202
|
+
processingQueues
|
|
148
203
|
});
|
|
@@ -19,7 +19,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var WebSocketClientBrowser_exports = {};
|
|
20
20
|
__export(WebSocketClientBrowser_exports, {
|
|
21
21
|
WebSocketClientBrowser: () => WebSocketClientBrowser,
|
|
22
|
-
clients: () => clients
|
|
22
|
+
clients: () => clients,
|
|
23
|
+
messageQueue: () => messageQueue,
|
|
24
|
+
processingQueues: () => processingQueues
|
|
23
25
|
});
|
|
24
26
|
module.exports = __toCommonJS(WebSocketClientBrowser_exports);
|
|
25
27
|
var import_Runtime = require("../../utils/Runtime.cjs");
|
|
@@ -37,6 +39,8 @@ if ((0, import_Runtime.isBrowserRuntime)()) {
|
|
|
37
39
|
WsClient = WebSocket;
|
|
38
40
|
}
|
|
39
41
|
const clients = {};
|
|
42
|
+
const messageQueue = {};
|
|
43
|
+
const processingQueues = {};
|
|
40
44
|
class WebSocketClientBrowser {
|
|
41
45
|
/**
|
|
42
46
|
* @param {string} url
|
|
@@ -54,12 +58,54 @@ class WebSocketClientBrowser {
|
|
|
54
58
|
return this.instance ? this.instance.readyState === WebSocket.OPEN : false;
|
|
55
59
|
}
|
|
56
60
|
/**
|
|
57
|
-
* Sends messageArray through websocket connection
|
|
61
|
+
* Sends messageArray through websocket connection with guaranteed order preservation
|
|
58
62
|
* @async
|
|
59
63
|
* @param {Int8Array} messageArray
|
|
60
64
|
* @returns {Promise<Int8Array>}
|
|
61
65
|
*/
|
|
62
66
|
send(messageArray) {
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
if (!messageQueue[this.url]) {
|
|
69
|
+
messageQueue[this.url] = [];
|
|
70
|
+
}
|
|
71
|
+
messageQueue[this.url].push({ resolve, reject, messageArray });
|
|
72
|
+
this._processMessage();
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Processes message queue sequentially to maintain order
|
|
77
|
+
* @private
|
|
78
|
+
* @async
|
|
79
|
+
*/
|
|
80
|
+
async _processMessage() {
|
|
81
|
+
if (processingQueues[this.url]) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
processingQueues[this.url] = true;
|
|
85
|
+
try {
|
|
86
|
+
while (messageQueue[this.url] && messageQueue[this.url].length > 0) {
|
|
87
|
+
const item = messageQueue[this.url].shift();
|
|
88
|
+
if (!item) break;
|
|
89
|
+
const { resolve, reject, messageArray } = item;
|
|
90
|
+
try {
|
|
91
|
+
const response = await this._sendSingle(messageArray);
|
|
92
|
+
resolve(response);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
reject(error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
} finally {
|
|
98
|
+
processingQueues[this.url] = false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Sends a single message through websocket connection
|
|
103
|
+
* @private
|
|
104
|
+
* @async
|
|
105
|
+
* @param {Int8Array} messageArray
|
|
106
|
+
* @returns {Promise<Int8Array>}
|
|
107
|
+
*/
|
|
108
|
+
_sendSingle(messageArray) {
|
|
63
109
|
return new Promise((resolve, reject) => {
|
|
64
110
|
const client = this.instance;
|
|
65
111
|
if (client && this.isConnected) {
|
|
@@ -72,7 +118,7 @@ class WebSocketClientBrowser {
|
|
|
72
118
|
});
|
|
73
119
|
}
|
|
74
120
|
/**
|
|
75
|
-
* Disconnects the WebSocket by terminating the connection.
|
|
121
|
+
* Disconnects the WebSocket by terminating the connection and cleans up queues.
|
|
76
122
|
*/
|
|
77
123
|
disconnect() {
|
|
78
124
|
const client = this.instance;
|
|
@@ -80,6 +126,13 @@ class WebSocketClientBrowser {
|
|
|
80
126
|
client.close();
|
|
81
127
|
delete clients[this.url];
|
|
82
128
|
}
|
|
129
|
+
if (messageQueue[this.url]) {
|
|
130
|
+
messageQueue[this.url].forEach(({ reject }) => {
|
|
131
|
+
reject(new Error("WebSocket disconnected"));
|
|
132
|
+
});
|
|
133
|
+
delete messageQueue[this.url];
|
|
134
|
+
}
|
|
135
|
+
delete processingQueues[this.url];
|
|
83
136
|
}
|
|
84
137
|
/**
|
|
85
138
|
* Connects to the WebSocket server.
|
|
@@ -144,5 +197,7 @@ class WebSocketClientBrowser {
|
|
|
144
197
|
// Annotate the CommonJS export names for ESM import in node:
|
|
145
198
|
0 && (module.exports = {
|
|
146
199
|
WebSocketClientBrowser,
|
|
147
|
-
clients
|
|
200
|
+
clients,
|
|
201
|
+
messageQueue,
|
|
202
|
+
processingQueues
|
|
148
203
|
});
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
/** @type {Record<string, wsClient>} */
|
|
2
2
|
export const clients: Record<string, wsClient>;
|
|
3
|
+
/** @type {Record<string, Array<{resolve: Function, reject: Function, messageArray: Int8Array}>>} */
|
|
4
|
+
export const messageQueue: Record<string, Array<{
|
|
5
|
+
resolve: Function;
|
|
6
|
+
reject: Function;
|
|
7
|
+
messageArray: Int8Array;
|
|
8
|
+
}>>;
|
|
9
|
+
/** @type {Record<string, boolean>} */
|
|
10
|
+
export const processingQueues: Record<string, boolean>;
|
|
3
11
|
export type wsClient = import("ws").WebSocket;
|
|
4
12
|
export type WebSocketClass = typeof import("ws").WebSocket;
|
|
5
13
|
/**
|
|
@@ -21,14 +29,28 @@ export class WebSocketClient {
|
|
|
21
29
|
get instance(): wsClient | null;
|
|
22
30
|
get isConnected(): boolean;
|
|
23
31
|
/**
|
|
24
|
-
* Sends messageArray through websocket connection
|
|
32
|
+
* Sends messageArray through websocket connection with guaranteed order preservation
|
|
25
33
|
* @async
|
|
26
34
|
* @param {Int8Array} messageArray
|
|
27
35
|
* @returns {Promise<Int8Array>}
|
|
28
36
|
*/
|
|
29
37
|
send(messageArray: Int8Array): Promise<Int8Array>;
|
|
30
38
|
/**
|
|
31
|
-
*
|
|
39
|
+
* Processes message queue sequentially to maintain order
|
|
40
|
+
* @private
|
|
41
|
+
* @async
|
|
42
|
+
*/
|
|
43
|
+
private _processMessage;
|
|
44
|
+
/**
|
|
45
|
+
* Sends a single message through websocket connection
|
|
46
|
+
* @private
|
|
47
|
+
* @async
|
|
48
|
+
* @param {Int8Array} messageArray
|
|
49
|
+
* @returns {Promise<Int8Array>}
|
|
50
|
+
*/
|
|
51
|
+
private _send;
|
|
52
|
+
/**
|
|
53
|
+
* Disconnects the WebSocket by terminating the connection and cleans up queues.
|
|
32
54
|
*/
|
|
33
55
|
disconnect(): void;
|
|
34
56
|
/**
|
|
@@ -4,6 +4,14 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/** @type {Record<string, WebSocket>} */
|
|
6
6
|
export const clients: Record<string, WebSocket>;
|
|
7
|
+
/** @type {Record<string, Array<{resolve: Function, reject: Function, messageArray: Int8Array}>>} */
|
|
8
|
+
export const messageQueue: Record<string, Array<{
|
|
9
|
+
resolve: Function;
|
|
10
|
+
reject: Function;
|
|
11
|
+
messageArray: Int8Array;
|
|
12
|
+
}>>;
|
|
13
|
+
/** @type {Record<string, boolean>} */
|
|
14
|
+
export const processingQueues: Record<string, boolean>;
|
|
7
15
|
export type Options = {
|
|
8
16
|
isDisconnectedAfterMessage?: boolean | undefined;
|
|
9
17
|
};
|
|
@@ -24,14 +32,28 @@ export class WebSocketClientBrowser {
|
|
|
24
32
|
get instance(): WebSocket | null;
|
|
25
33
|
get isConnected(): boolean;
|
|
26
34
|
/**
|
|
27
|
-
* Sends messageArray through websocket connection
|
|
35
|
+
* Sends messageArray through websocket connection with guaranteed order preservation
|
|
28
36
|
* @async
|
|
29
37
|
* @param {Int8Array} messageArray
|
|
30
38
|
* @returns {Promise<Int8Array>}
|
|
31
39
|
*/
|
|
32
40
|
send(messageArray: Int8Array): Promise<Int8Array>;
|
|
33
41
|
/**
|
|
34
|
-
*
|
|
42
|
+
* Processes message queue sequentially to maintain order
|
|
43
|
+
* @private
|
|
44
|
+
* @async
|
|
45
|
+
*/
|
|
46
|
+
private _processMessage;
|
|
47
|
+
/**
|
|
48
|
+
* Sends a single message through websocket connection
|
|
49
|
+
* @private
|
|
50
|
+
* @async
|
|
51
|
+
* @param {Int8Array} messageArray
|
|
52
|
+
* @returns {Promise<Int8Array>}
|
|
53
|
+
*/
|
|
54
|
+
private _sendSingle;
|
|
55
|
+
/**
|
|
56
|
+
* Disconnects the WebSocket by terminating the connection and cleans up queues.
|
|
35
57
|
*/
|
|
36
58
|
disconnect(): void;
|
|
37
59
|
/**
|
|
@@ -36,6 +36,12 @@ let WebSocket = null
|
|
|
36
36
|
/** @type {Record<string, wsClient>} */
|
|
37
37
|
export const clients = {}
|
|
38
38
|
|
|
39
|
+
/** @type {Record<string, Array<{resolve: Function, reject: Function, messageArray: Int8Array}>>} */
|
|
40
|
+
export const messageQueue = {}
|
|
41
|
+
|
|
42
|
+
/** @type {Record<string, boolean>} */
|
|
43
|
+
export const processingQueues = {}
|
|
44
|
+
|
|
39
45
|
/**
|
|
40
46
|
* WebSocketClient class that handles WebSocket connection, message sending, and automatic disconnection.
|
|
41
47
|
*/
|
|
@@ -61,16 +67,65 @@ class WebSocketClient {
|
|
|
61
67
|
}
|
|
62
68
|
|
|
63
69
|
/**
|
|
64
|
-
* Sends messageArray through websocket connection
|
|
70
|
+
* Sends messageArray through websocket connection with guaranteed order preservation
|
|
65
71
|
* @async
|
|
66
72
|
* @param {Int8Array} messageArray
|
|
67
73
|
* @returns {Promise<Int8Array>}
|
|
68
74
|
*/
|
|
69
75
|
send(messageArray) {
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
77
|
+
if (!messageQueue[this.url]) {
|
|
78
|
+
messageQueue[this.url] = []
|
|
79
|
+
}
|
|
80
|
+
messageQueue[this.url].push({ resolve, reject, messageArray })
|
|
81
|
+
|
|
82
|
+
this._processMessage()
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Processes message queue sequentially to maintain order
|
|
88
|
+
* @private
|
|
89
|
+
* @async
|
|
90
|
+
*/
|
|
91
|
+
async _processMessage() {
|
|
92
|
+
if (processingQueues[this.url]) {
|
|
93
|
+
return
|
|
94
|
+
}
|
|
95
|
+
processingQueues[this.url] = true
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
while (messageQueue[this.url] && messageQueue[this.url].length > 0) {
|
|
99
|
+
const item = messageQueue[this.url].shift()
|
|
100
|
+
if (!item) break
|
|
101
|
+
|
|
102
|
+
const { resolve, reject, messageArray } = item
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
const response = await this._send(messageArray)
|
|
106
|
+
resolve(response)
|
|
107
|
+
} catch (error) {
|
|
108
|
+
reject(error)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
} finally {
|
|
112
|
+
processingQueues[this.url] = false
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Sends a single message through websocket connection
|
|
118
|
+
* @private
|
|
119
|
+
* @async
|
|
120
|
+
* @param {Int8Array} messageArray
|
|
121
|
+
* @returns {Promise<Int8Array>}
|
|
122
|
+
*/
|
|
123
|
+
_send(messageArray) {
|
|
70
124
|
return new Promise((resolve, reject) => {
|
|
71
125
|
const client = this.instance
|
|
72
|
-
if (client) {
|
|
126
|
+
if (client && this.isConnected) {
|
|
73
127
|
client.send(/** @type {any} */ (messageArray))
|
|
128
|
+
|
|
74
129
|
const messageHandler = (/** @type {any} */ message) => {
|
|
75
130
|
resolve(message)
|
|
76
131
|
if (this.isDisconnectedAfterMessage) {
|
|
@@ -81,16 +136,16 @@ class WebSocketClient {
|
|
|
81
136
|
client.on(WebSocketStateEvent.MESSAGE, messageHandler)
|
|
82
137
|
} else {
|
|
83
138
|
this._connect()
|
|
84
|
-
.then((
|
|
85
|
-
|
|
139
|
+
.then((client) => {
|
|
140
|
+
client.send(/** @type {any} */ (messageArray))
|
|
86
141
|
const messageHandler = (/** @type {any} */ message) => {
|
|
87
142
|
resolve(message)
|
|
88
143
|
if (this.isDisconnectedAfterMessage) {
|
|
89
144
|
this.disconnect()
|
|
90
145
|
}
|
|
91
|
-
|
|
146
|
+
client.removeListener(WebSocketStateEvent.MESSAGE, messageHandler)
|
|
92
147
|
}
|
|
93
|
-
|
|
148
|
+
client.on(WebSocketStateEvent.MESSAGE, messageHandler)
|
|
94
149
|
})
|
|
95
150
|
.catch(reject)
|
|
96
151
|
}
|
|
@@ -98,13 +153,24 @@ class WebSocketClient {
|
|
|
98
153
|
}
|
|
99
154
|
|
|
100
155
|
/**
|
|
101
|
-
* Disconnects the WebSocket by terminating the connection.
|
|
156
|
+
* Disconnects the WebSocket by terminating the connection and cleans up queues.
|
|
102
157
|
*/
|
|
103
158
|
disconnect() {
|
|
104
159
|
if (this.instance) {
|
|
105
160
|
this.instance.close()
|
|
106
161
|
delete clients[this.url]
|
|
107
162
|
}
|
|
163
|
+
|
|
164
|
+
// Clean up message queue and processing state
|
|
165
|
+
if (messageQueue[this.url]) {
|
|
166
|
+
// Reject any pending messages
|
|
167
|
+
messageQueue[this.url].forEach(({ reject }) => {
|
|
168
|
+
reject(new Error('WebSocket disconnected'))
|
|
169
|
+
})
|
|
170
|
+
delete messageQueue[this.url]
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
delete processingQueues[this.url]
|
|
108
174
|
}
|
|
109
175
|
|
|
110
176
|
/**
|
|
@@ -25,6 +25,12 @@ if (isBrowserRuntime()) {
|
|
|
25
25
|
/** @type {Record<string, WebSocket>} */
|
|
26
26
|
export const clients = {}
|
|
27
27
|
|
|
28
|
+
/** @type {Record<string, Array<{resolve: Function, reject: Function, messageArray: Int8Array}>>} */
|
|
29
|
+
export const messageQueue = {}
|
|
30
|
+
|
|
31
|
+
/** @type {Record<string, boolean>} */
|
|
32
|
+
export const processingQueues = {}
|
|
33
|
+
|
|
28
34
|
/**
|
|
29
35
|
* WebSocketClient class that handles WebSocket connection, message sending, and automatic disconnection.
|
|
30
36
|
*/
|
|
@@ -51,12 +57,59 @@ class WebSocketClientBrowser {
|
|
|
51
57
|
}
|
|
52
58
|
|
|
53
59
|
/**
|
|
54
|
-
* Sends messageArray through websocket connection
|
|
60
|
+
* Sends messageArray through websocket connection with guaranteed order preservation
|
|
55
61
|
* @async
|
|
56
62
|
* @param {Int8Array} messageArray
|
|
57
63
|
* @returns {Promise<Int8Array>}
|
|
58
64
|
*/
|
|
59
65
|
send(messageArray) {
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
if (!messageQueue[this.url]) {
|
|
68
|
+
messageQueue[this.url] = []
|
|
69
|
+
}
|
|
70
|
+
messageQueue[this.url].push({ resolve, reject, messageArray })
|
|
71
|
+
|
|
72
|
+
this._processMessage()
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Processes message queue sequentially to maintain order
|
|
78
|
+
* @private
|
|
79
|
+
* @async
|
|
80
|
+
*/
|
|
81
|
+
async _processMessage() {
|
|
82
|
+
if (processingQueues[this.url]) {
|
|
83
|
+
return
|
|
84
|
+
}
|
|
85
|
+
processingQueues[this.url] = true
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
while (messageQueue[this.url] && messageQueue[this.url].length > 0) {
|
|
89
|
+
const item = messageQueue[this.url].shift()
|
|
90
|
+
if (!item) break
|
|
91
|
+
|
|
92
|
+
const { resolve, reject, messageArray } = item
|
|
93
|
+
try {
|
|
94
|
+
const response = await this._sendSingle(messageArray)
|
|
95
|
+
resolve(response)
|
|
96
|
+
} catch (error) {
|
|
97
|
+
reject(error)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
} finally {
|
|
101
|
+
processingQueues[this.url] = false
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Sends a single message through websocket connection
|
|
107
|
+
* @private
|
|
108
|
+
* @async
|
|
109
|
+
* @param {Int8Array} messageArray
|
|
110
|
+
* @returns {Promise<Int8Array>}
|
|
111
|
+
*/
|
|
112
|
+
_sendSingle(messageArray) {
|
|
60
113
|
return new Promise((resolve, reject) => {
|
|
61
114
|
const client = this.instance
|
|
62
115
|
if (client && this.isConnected) {
|
|
@@ -72,7 +125,7 @@ class WebSocketClientBrowser {
|
|
|
72
125
|
}
|
|
73
126
|
|
|
74
127
|
/**
|
|
75
|
-
* Disconnects the WebSocket by terminating the connection.
|
|
128
|
+
* Disconnects the WebSocket by terminating the connection and cleans up queues.
|
|
76
129
|
*/
|
|
77
130
|
disconnect() {
|
|
78
131
|
const client = this.instance
|
|
@@ -80,6 +133,14 @@ class WebSocketClientBrowser {
|
|
|
80
133
|
client.close()
|
|
81
134
|
delete clients[this.url]
|
|
82
135
|
}
|
|
136
|
+
|
|
137
|
+
if (messageQueue[this.url]) {
|
|
138
|
+
messageQueue[this.url].forEach(({ reject }) => {
|
|
139
|
+
reject(new Error('WebSocket disconnected'))
|
|
140
|
+
})
|
|
141
|
+
delete messageQueue[this.url]
|
|
142
|
+
}
|
|
143
|
+
delete processingQueues[this.url]
|
|
83
144
|
}
|
|
84
145
|
|
|
85
146
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "javonet-nodejs-sdk",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.2",
|
|
4
4
|
"description": "Javonet allows you to reference and use modules or packages written in (Java/Kotlin/Groovy/Clojure, C#/VB.NET, Ruby, Perl, Python, JavaScript/TypeScript) like they were created in your technology. It works on Linux/Windows and MacOS for applications created in JVM, CLR/Netcore, Perl, Python, Ruby, NodeJS, C++ or GoLang and gives you unparalleled freedom and flexibility with native performance in building your mixed-technologies products. Let it be accessing best AI or cryptography libraries, devices SDKs, legacy client modules, internal custom packages or anything from public repositories available on NPM, Nuget, PyPI, Maven/Gradle, RubyGems or GitHub. Get free from programming languages barriers today! For more information check out our guides at https://www.javonet.com/guides/v2/",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"author": "SdNCenter Sp. z o. o.",
|