@cubejs-client/ws-transport 0.34.60 → 0.35.23
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/cubejs-client-ws-transport.esm.js +1 -35
- package/dist/cubejs-client-ws-transport.esm.js.map +1 -1
- package/dist/cubejs-client-ws-transport.js +5 -63
- package/dist/cubejs-client-ws-transport.js.map +1 -1
- package/dist/cubejs-client-ws-transport.umd.js +5 -63
- package/dist/cubejs-client-ws-transport.umd.js.map +1 -1
- package/package.json +4 -4
|
@@ -8,6 +8,7 @@ import WebSocket from 'isomorphic-ws';
|
|
|
8
8
|
* @menuOrder 4
|
|
9
9
|
* @description WebSocket transport for Cube.js client
|
|
10
10
|
*/
|
|
11
|
+
|
|
11
12
|
class WebSocketTransportResult {
|
|
12
13
|
constructor({
|
|
13
14
|
status,
|
|
@@ -16,29 +17,23 @@ class WebSocketTransportResult {
|
|
|
16
17
|
this.status = status;
|
|
17
18
|
this.result = message;
|
|
18
19
|
}
|
|
19
|
-
|
|
20
20
|
async json() {
|
|
21
21
|
return this.result;
|
|
22
22
|
}
|
|
23
|
-
|
|
24
23
|
clone() {
|
|
25
24
|
// no need to actually clone it
|
|
26
25
|
return this;
|
|
27
26
|
}
|
|
28
|
-
|
|
29
27
|
async text() {
|
|
30
28
|
return typeof this.result === 'string' ? this.result : JSON.stringify(this.result);
|
|
31
29
|
}
|
|
32
|
-
|
|
33
30
|
}
|
|
34
|
-
|
|
35
31
|
class WebSocketTransport {
|
|
36
32
|
heartBeatInterval = 60;
|
|
37
33
|
ws = null;
|
|
38
34
|
messageCounter = 1;
|
|
39
35
|
messageIdToSubscription = {};
|
|
40
36
|
messageQueue = [];
|
|
41
|
-
|
|
42
37
|
constructor({
|
|
43
38
|
authorization,
|
|
44
39
|
apiUrl,
|
|
@@ -47,7 +42,6 @@ class WebSocketTransport {
|
|
|
47
42
|
}) {
|
|
48
43
|
this.token = authorization;
|
|
49
44
|
this.apiUrl = apiUrl;
|
|
50
|
-
|
|
51
45
|
if (heartBeatInterval) {
|
|
52
46
|
this.heartBeatInterval = heartBeatInterval;
|
|
53
47
|
} else if (hearBeatInterval) {
|
|
@@ -55,45 +49,36 @@ class WebSocketTransport {
|
|
|
55
49
|
this.heartBeatInterval = hearBeatInterval;
|
|
56
50
|
}
|
|
57
51
|
}
|
|
58
|
-
|
|
59
52
|
set authorization(token) {
|
|
60
53
|
this.token = token;
|
|
61
|
-
|
|
62
54
|
if (this.ws) {
|
|
63
55
|
this.ws.close();
|
|
64
56
|
}
|
|
65
57
|
}
|
|
66
|
-
|
|
67
58
|
async close() {
|
|
68
59
|
if (this.ws) {
|
|
69
60
|
this.ws.close();
|
|
70
61
|
}
|
|
71
62
|
}
|
|
72
|
-
|
|
73
63
|
get authorization() {
|
|
74
64
|
return this.token;
|
|
75
65
|
}
|
|
76
|
-
|
|
77
66
|
initSocket() {
|
|
78
67
|
if (this.ws) {
|
|
79
68
|
return this.ws.initPromise;
|
|
80
69
|
}
|
|
81
|
-
|
|
82
70
|
const ws = new WebSocket(this.apiUrl);
|
|
83
71
|
ws.messageIdSent = {};
|
|
84
|
-
|
|
85
72
|
ws.sendMessage = message => {
|
|
86
73
|
if (!message.messageId || message.messageId && !ws.messageIdSent[message.messageId]) {
|
|
87
74
|
ws.send(JSON.stringify(message));
|
|
88
75
|
ws.messageIdSent[message.messageId] = true;
|
|
89
76
|
}
|
|
90
77
|
};
|
|
91
|
-
|
|
92
78
|
ws.sendQueue = () => {
|
|
93
79
|
this.messageQueue.forEach(message => ws.sendMessage(message));
|
|
94
80
|
this.messageQueue = [];
|
|
95
81
|
};
|
|
96
|
-
|
|
97
82
|
ws.reconcile = () => {
|
|
98
83
|
if (new Date().getTime() - ws.lastMessageTimestamp.getTime() > 4 * this.heartBeatInterval * 1000) {
|
|
99
84
|
ws.close();
|
|
@@ -104,7 +89,6 @@ class WebSocketTransport {
|
|
|
104
89
|
});
|
|
105
90
|
}
|
|
106
91
|
};
|
|
107
|
-
|
|
108
92
|
ws.lastMessageTimestamp = new Date();
|
|
109
93
|
ws.initPromise = new Promise(resolve => {
|
|
110
94
|
ws.onopen = () => {
|
|
@@ -112,11 +96,9 @@ class WebSocketTransport {
|
|
|
112
96
|
authorization: this.authorization
|
|
113
97
|
});
|
|
114
98
|
};
|
|
115
|
-
|
|
116
99
|
ws.onmessage = event => {
|
|
117
100
|
ws.lastMessageTimestamp = new Date();
|
|
118
101
|
const message = JSON.parse(event.data);
|
|
119
|
-
|
|
120
102
|
if (message.handshake) {
|
|
121
103
|
ws.reconcile();
|
|
122
104
|
ws.reconcileTimer = setInterval(() => {
|
|
@@ -125,52 +107,42 @@ class WebSocketTransport {
|
|
|
125
107
|
}, this.heartBeatInterval * 1000);
|
|
126
108
|
resolve();
|
|
127
109
|
}
|
|
128
|
-
|
|
129
110
|
if (this.messageIdToSubscription[message.messageId]) {
|
|
130
111
|
this.messageIdToSubscription[message.messageId].callback(new WebSocketTransportResult(message));
|
|
131
112
|
}
|
|
132
|
-
|
|
133
113
|
ws.sendQueue();
|
|
134
114
|
};
|
|
135
|
-
|
|
136
115
|
ws.onclose = () => {
|
|
137
116
|
if (ws && ws.readyState !== WebSocket.CLOSED && ws.readyState !== WebSocket.CLOSING) {
|
|
138
117
|
ws.close();
|
|
139
118
|
}
|
|
140
|
-
|
|
141
119
|
if (ws.reconcileTimer) {
|
|
142
120
|
clearInterval(ws.reconcileTimer);
|
|
143
121
|
ws.reconcileTimer = null;
|
|
144
122
|
}
|
|
145
|
-
|
|
146
123
|
if (this.ws === ws) {
|
|
147
124
|
this.ws = null;
|
|
148
|
-
|
|
149
125
|
if (Object.keys(this.messageIdToSubscription).length) {
|
|
150
126
|
this.initSocket();
|
|
151
127
|
}
|
|
152
128
|
}
|
|
153
129
|
};
|
|
154
|
-
|
|
155
130
|
ws.onerror = ws.onclose;
|
|
156
131
|
});
|
|
157
132
|
this.ws = ws;
|
|
158
133
|
return this.ws.initPromise;
|
|
159
134
|
}
|
|
160
|
-
|
|
161
135
|
sendMessage(message) {
|
|
162
136
|
if (message.unsubscribe && this.messageQueue.find(m => m.messageId === message.unsubscribe)) {
|
|
163
137
|
this.messageQueue = this.messageQueue.filter(m => m.messageId !== message.unsubscribe);
|
|
164
138
|
} else {
|
|
165
139
|
this.messageQueue.push(message);
|
|
166
140
|
}
|
|
167
|
-
|
|
168
141
|
setTimeout(async () => {
|
|
169
142
|
await this.initSocket();
|
|
170
143
|
this.ws.sendQueue();
|
|
171
144
|
}, 100);
|
|
172
145
|
}
|
|
173
|
-
|
|
174
146
|
request(method, {
|
|
175
147
|
baseRequestId,
|
|
176
148
|
...params
|
|
@@ -183,14 +155,12 @@ class WebSocketTransport {
|
|
|
183
155
|
};
|
|
184
156
|
const pendingResults = [];
|
|
185
157
|
let nextMessage = null;
|
|
186
|
-
|
|
187
158
|
const runNextMessage = () => {
|
|
188
159
|
if (nextMessage) {
|
|
189
160
|
nextMessage(pendingResults.pop());
|
|
190
161
|
nextMessage = null;
|
|
191
162
|
}
|
|
192
163
|
};
|
|
193
|
-
|
|
194
164
|
this.messageIdToSubscription[message.messageId] = {
|
|
195
165
|
message,
|
|
196
166
|
callback: result => {
|
|
@@ -204,24 +174,20 @@ class WebSocketTransport {
|
|
|
204
174
|
transport.sendMessage(message);
|
|
205
175
|
const result = await new Promise(resolve => {
|
|
206
176
|
nextMessage = resolve;
|
|
207
|
-
|
|
208
177
|
if (pendingResults.length) {
|
|
209
178
|
runNextMessage();
|
|
210
179
|
}
|
|
211
180
|
});
|
|
212
181
|
return callback(result, () => this.subscribe(callback));
|
|
213
182
|
},
|
|
214
|
-
|
|
215
183
|
async unsubscribe() {
|
|
216
184
|
transport.sendMessage({
|
|
217
185
|
unsubscribe: message.messageId
|
|
218
186
|
});
|
|
219
187
|
delete transport.messageIdToSubscription[message.messageId];
|
|
220
188
|
}
|
|
221
|
-
|
|
222
189
|
};
|
|
223
190
|
}
|
|
224
|
-
|
|
225
191
|
}
|
|
226
192
|
|
|
227
193
|
export default WebSocketTransport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cubejs-client-ws-transport.esm.js","sources":["../src/index.ts"],"sourcesContent":["import WebSocket from 'isomorphic-ws';\nimport type { ITransport, ITransportResponse } from '@cubejs-client/core';\n\n/**\n * @title @cubejs-client/ws-transport\n * @permalink /@cubejs-client-ws-transport\n * @menuCategory Cube.js Frontend\n * @subcategory Reference\n * @menuOrder 4\n * @description WebSocket transport for Cube.js client\n */\n\nclass WebSocketTransportResult {\n protected readonly status: unknown;\n\n protected readonly result: unknown;\n\n public constructor({ status, message }: { status: unknown, message: unknown }) {\n this.status = status;\n this.result = message;\n }\n\n public async json() {\n return this.result;\n }\n\n public clone() {\n // no need to actually clone it\n return this;\n }\n\n public async text() {\n return typeof this.result === 'string' ? this.result : JSON.stringify(this.result);\n }\n}\n\ntype WebSocketTransportOptions = {\n authorization?: string,\n apiUrl: string,\n // @deprecated\n hearBeatInterval?: number,\n heartBeatInterval?: number,\n};\n\ntype Message = {\n messageId: number,\n requestId: any,\n method: string,\n params: Record<string, unknown>,\n};\n\ntype Subscription = {\n message: Message,\n callback: (result: WebSocketTransportResult) => void,\n};\n\nclass WebSocketTransport implements ITransport<WebSocketTransportResult> {\n protected readonly apiUrl: string;\n\n protected readonly heartBeatInterval: number = 60;\n\n protected token: string | undefined;\n\n protected ws: any = null;\n\n protected messageCounter: number = 1;\n\n protected messageIdToSubscription: Record<number, Subscription> = {};\n\n protected messageQueue: Message[] = [];\n\n public constructor({ authorization, apiUrl, heartBeatInterval, hearBeatInterval }: WebSocketTransportOptions) {\n this.token = authorization;\n this.apiUrl = apiUrl;\n\n if (heartBeatInterval) {\n this.heartBeatInterval = heartBeatInterval;\n } else if (hearBeatInterval) {\n console.warn('Option hearBeatInterval is deprecated. It was replaced by heartBeatInterval.');\n this.heartBeatInterval = hearBeatInterval;\n }\n }\n\n public set authorization(token) {\n this.token = token;\n\n if (this.ws) {\n this.ws.close();\n }\n }\n\n public async close(): Promise<void> {\n if (this.ws) {\n this.ws.close();\n }\n }\n\n public get authorization() {\n return this.token;\n }\n\n protected initSocket() {\n if (this.ws) {\n return this.ws.initPromise;\n }\n\n const ws: any = new WebSocket(this.apiUrl);\n\n ws.messageIdSent = {};\n\n ws.sendMessage = (message: any) => {\n if (!message.messageId || message.messageId && !ws.messageIdSent[message.messageId]) {\n ws.send(JSON.stringify(message));\n ws.messageIdSent[message.messageId] = true;\n }\n };\n\n ws.sendQueue = () => {\n this.messageQueue.forEach(message => ws.sendMessage(message));\n this.messageQueue = [];\n };\n\n ws.reconcile = () => {\n if (new Date().getTime() - ws.lastMessageTimestamp.getTime() > 4 * this.heartBeatInterval * 1000) {\n ws.close();\n } else {\n Object.keys(this.messageIdToSubscription).forEach(messageId => {\n // @ts-ignore\n ws.sendMessage(this.messageIdToSubscription[messageId].message);\n });\n }\n };\n\n ws.lastMessageTimestamp = new Date();\n\n ws.initPromise = new Promise<void>(resolve => {\n ws.onopen = () => {\n ws.sendMessage({ authorization: this.authorization });\n };\n\n ws.onmessage = (event: any) => {\n ws.lastMessageTimestamp = new Date();\n\n const message: any = JSON.parse(event.data);\n if (message.handshake) {\n ws.reconcile();\n ws.reconcileTimer = setInterval(() => {\n ws.messageIdSent = {};\n ws.reconcile();\n }, this.heartBeatInterval * 1000);\n resolve();\n }\n\n if (this.messageIdToSubscription[message.messageId]) {\n this.messageIdToSubscription[message.messageId].callback(\n new WebSocketTransportResult(message)\n );\n }\n\n ws.sendQueue();\n };\n\n ws.onclose = () => {\n if (ws && ws.readyState !== WebSocket.CLOSED && ws.readyState !== WebSocket.CLOSING) {\n ws.close();\n }\n if (ws.reconcileTimer) {\n clearInterval(ws.reconcileTimer);\n ws.reconcileTimer = null;\n }\n if (this.ws === ws) {\n this.ws = null;\n if (Object.keys(this.messageIdToSubscription).length) {\n this.initSocket();\n }\n }\n };\n\n ws.onerror = ws.onclose;\n });\n\n this.ws = ws;\n\n return this.ws.initPromise;\n }\n\n protected sendMessage(message: any) {\n if (message.unsubscribe && this.messageQueue.find(m => m.messageId === message.unsubscribe)) {\n this.messageQueue = this.messageQueue.filter(m => m.messageId !== message.unsubscribe);\n } else {\n this.messageQueue.push(message);\n }\n\n setTimeout(async () => {\n await this.initSocket();\n this.ws.sendQueue();\n }, 100);\n }\n\n public request(\n method: string,\n { baseRequestId, ...params }: Record<string, unknown>\n ): ITransportResponse<WebSocketTransportResult> {\n const message: Message = {\n messageId: this.messageCounter++,\n requestId: baseRequestId,\n method,\n params\n };\n\n const pendingResults: WebSocketTransportResult[] = [];\n let nextMessage: ((value: any) => void) | null = null;\n\n const runNextMessage = () => {\n if (nextMessage) {\n nextMessage(pendingResults.pop());\n nextMessage = null;\n }\n };\n\n this.messageIdToSubscription[message.messageId] = {\n message,\n callback: (result) => {\n pendingResults.push(result);\n runNextMessage();\n }\n };\n\n const transport = this;\n\n return {\n async subscribe(callback) {\n transport.sendMessage(message);\n\n const result = await new Promise<WebSocketTransportResult>((resolve) => {\n nextMessage = resolve;\n if (pendingResults.length) {\n runNextMessage();\n }\n });\n\n return callback(result, () => this.subscribe(callback));\n },\n async unsubscribe() {\n transport.sendMessage({ unsubscribe: message.messageId });\n delete transport.messageIdToSubscription[message.messageId];\n }\n };\n }\n}\n\nexport default WebSocketTransport;\n"],"names":["WebSocketTransportResult","constructor","status","message","result","json","clone","text","JSON","stringify","WebSocketTransport","heartBeatInterval","ws","messageCounter","messageIdToSubscription","messageQueue","authorization","apiUrl","hearBeatInterval","token","console","warn","close","initSocket","initPromise","WebSocket","messageIdSent","sendMessage","messageId","send","sendQueue","forEach","reconcile","Date","getTime","lastMessageTimestamp","Object","keys","Promise","resolve","onopen","onmessage","event","parse","data","handshake","reconcileTimer","setInterval","callback","onclose","readyState","CLOSED","CLOSING","clearInterval","length","onerror","unsubscribe","find","m","filter","push","setTimeout","request","method","baseRequestId","params","requestId","pendingResults","nextMessage","runNextMessage","pop","transport","subscribe"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cubejs-client-ws-transport.esm.js","sources":["../src/index.ts"],"sourcesContent":["import WebSocket from 'isomorphic-ws';\nimport type { ITransport, ITransportResponse } from '@cubejs-client/core';\n\n/**\n * @title @cubejs-client/ws-transport\n * @permalink /@cubejs-client-ws-transport\n * @menuCategory Cube.js Frontend\n * @subcategory Reference\n * @menuOrder 4\n * @description WebSocket transport for Cube.js client\n */\n\nclass WebSocketTransportResult {\n protected readonly status: unknown;\n\n protected readonly result: unknown;\n\n public constructor({ status, message }: { status: unknown, message: unknown }) {\n this.status = status;\n this.result = message;\n }\n\n public async json() {\n return this.result;\n }\n\n public clone() {\n // no need to actually clone it\n return this;\n }\n\n public async text() {\n return typeof this.result === 'string' ? this.result : JSON.stringify(this.result);\n }\n}\n\ntype WebSocketTransportOptions = {\n authorization?: string,\n apiUrl: string,\n // @deprecated\n hearBeatInterval?: number,\n heartBeatInterval?: number,\n};\n\ntype Message = {\n messageId: number,\n requestId: any,\n method: string,\n params: Record<string, unknown>,\n};\n\ntype Subscription = {\n message: Message,\n callback: (result: WebSocketTransportResult) => void,\n};\n\nclass WebSocketTransport implements ITransport<WebSocketTransportResult> {\n protected readonly apiUrl: string;\n\n protected readonly heartBeatInterval: number = 60;\n\n protected token: string | undefined;\n\n protected ws: any = null;\n\n protected messageCounter: number = 1;\n\n protected messageIdToSubscription: Record<number, Subscription> = {};\n\n protected messageQueue: Message[] = [];\n\n public constructor({ authorization, apiUrl, heartBeatInterval, hearBeatInterval }: WebSocketTransportOptions) {\n this.token = authorization;\n this.apiUrl = apiUrl;\n\n if (heartBeatInterval) {\n this.heartBeatInterval = heartBeatInterval;\n } else if (hearBeatInterval) {\n console.warn('Option hearBeatInterval is deprecated. It was replaced by heartBeatInterval.');\n this.heartBeatInterval = hearBeatInterval;\n }\n }\n\n public set authorization(token) {\n this.token = token;\n\n if (this.ws) {\n this.ws.close();\n }\n }\n\n public async close(): Promise<void> {\n if (this.ws) {\n this.ws.close();\n }\n }\n\n public get authorization() {\n return this.token;\n }\n\n protected initSocket() {\n if (this.ws) {\n return this.ws.initPromise;\n }\n\n const ws: any = new WebSocket(this.apiUrl);\n\n ws.messageIdSent = {};\n\n ws.sendMessage = (message: any) => {\n if (!message.messageId || message.messageId && !ws.messageIdSent[message.messageId]) {\n ws.send(JSON.stringify(message));\n ws.messageIdSent[message.messageId] = true;\n }\n };\n\n ws.sendQueue = () => {\n this.messageQueue.forEach(message => ws.sendMessage(message));\n this.messageQueue = [];\n };\n\n ws.reconcile = () => {\n if (new Date().getTime() - ws.lastMessageTimestamp.getTime() > 4 * this.heartBeatInterval * 1000) {\n ws.close();\n } else {\n Object.keys(this.messageIdToSubscription).forEach(messageId => {\n // @ts-ignore\n ws.sendMessage(this.messageIdToSubscription[messageId].message);\n });\n }\n };\n\n ws.lastMessageTimestamp = new Date();\n\n ws.initPromise = new Promise<void>(resolve => {\n ws.onopen = () => {\n ws.sendMessage({ authorization: this.authorization });\n };\n\n ws.onmessage = (event: any) => {\n ws.lastMessageTimestamp = new Date();\n\n const message: any = JSON.parse(event.data);\n if (message.handshake) {\n ws.reconcile();\n ws.reconcileTimer = setInterval(() => {\n ws.messageIdSent = {};\n ws.reconcile();\n }, this.heartBeatInterval * 1000);\n resolve();\n }\n\n if (this.messageIdToSubscription[message.messageId]) {\n this.messageIdToSubscription[message.messageId].callback(\n new WebSocketTransportResult(message)\n );\n }\n\n ws.sendQueue();\n };\n\n ws.onclose = () => {\n if (ws && ws.readyState !== WebSocket.CLOSED && ws.readyState !== WebSocket.CLOSING) {\n ws.close();\n }\n if (ws.reconcileTimer) {\n clearInterval(ws.reconcileTimer);\n ws.reconcileTimer = null;\n }\n if (this.ws === ws) {\n this.ws = null;\n if (Object.keys(this.messageIdToSubscription).length) {\n this.initSocket();\n }\n }\n };\n\n ws.onerror = ws.onclose;\n });\n\n this.ws = ws;\n\n return this.ws.initPromise;\n }\n\n protected sendMessage(message: any) {\n if (message.unsubscribe && this.messageQueue.find(m => m.messageId === message.unsubscribe)) {\n this.messageQueue = this.messageQueue.filter(m => m.messageId !== message.unsubscribe);\n } else {\n this.messageQueue.push(message);\n }\n\n setTimeout(async () => {\n await this.initSocket();\n this.ws.sendQueue();\n }, 100);\n }\n\n public request(\n method: string,\n { baseRequestId, ...params }: Record<string, unknown>\n ): ITransportResponse<WebSocketTransportResult> {\n const message: Message = {\n messageId: this.messageCounter++,\n requestId: baseRequestId,\n method,\n params\n };\n\n const pendingResults: WebSocketTransportResult[] = [];\n let nextMessage: ((value: any) => void) | null = null;\n\n const runNextMessage = () => {\n if (nextMessage) {\n nextMessage(pendingResults.pop());\n nextMessage = null;\n }\n };\n\n this.messageIdToSubscription[message.messageId] = {\n message,\n callback: (result) => {\n pendingResults.push(result);\n runNextMessage();\n }\n };\n\n const transport = this;\n\n return {\n async subscribe(callback) {\n transport.sendMessage(message);\n\n const result = await new Promise<WebSocketTransportResult>((resolve) => {\n nextMessage = resolve;\n if (pendingResults.length) {\n runNextMessage();\n }\n });\n\n return callback(result, () => this.subscribe(callback));\n },\n async unsubscribe() {\n transport.sendMessage({ unsubscribe: message.messageId });\n delete transport.messageIdToSubscription[message.messageId];\n }\n };\n }\n}\n\nexport default WebSocketTransport;\n"],"names":["WebSocketTransportResult","constructor","status","message","result","json","clone","text","JSON","stringify","WebSocketTransport","heartBeatInterval","ws","messageCounter","messageIdToSubscription","messageQueue","authorization","apiUrl","hearBeatInterval","token","console","warn","close","initSocket","initPromise","WebSocket","messageIdSent","sendMessage","messageId","send","sendQueue","forEach","reconcile","Date","getTime","lastMessageTimestamp","Object","keys","Promise","resolve","onopen","onmessage","event","parse","data","handshake","reconcileTimer","setInterval","callback","onclose","readyState","CLOSED","CLOSING","clearInterval","length","onerror","unsubscribe","find","m","filter","push","setTimeout","request","method","baseRequestId","params","requestId","pendingResults","nextMessage","runNextMessage","pop","transport","subscribe"],"mappings":"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"}
|
|
@@ -28,7 +28,6 @@ var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regenerat
|
|
|
28
28
|
var WebSocket__default = /*#__PURE__*/_interopDefaultLegacy(WebSocket);
|
|
29
29
|
|
|
30
30
|
var _excluded = ["baseRequestId"];
|
|
31
|
-
|
|
32
31
|
/**
|
|
33
32
|
* @title @cubejs-client/ws-transport
|
|
34
33
|
* @permalink /@cubejs-client-ws-transport
|
|
@@ -40,18 +39,13 @@ var _excluded = ["baseRequestId"];
|
|
|
40
39
|
var WebSocketTransportResult = /*#__PURE__*/function () {
|
|
41
40
|
function WebSocketTransportResult(_ref) {
|
|
42
41
|
var status = _ref.status,
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
message = _ref.message;
|
|
45
43
|
_classCallCheck__default['default'](this, WebSocketTransportResult);
|
|
46
|
-
|
|
47
44
|
_defineProperty__default['default'](this, "status", void 0);
|
|
48
|
-
|
|
49
45
|
_defineProperty__default['default'](this, "result", void 0);
|
|
50
|
-
|
|
51
46
|
this.status = status;
|
|
52
47
|
this.result = message;
|
|
53
48
|
}
|
|
54
|
-
|
|
55
49
|
_createClass__default['default'](WebSocketTransportResult, [{
|
|
56
50
|
key: "json",
|
|
57
51
|
value: function () {
|
|
@@ -61,7 +55,6 @@ var WebSocketTransportResult = /*#__PURE__*/function () {
|
|
|
61
55
|
switch (_context.prev = _context.next) {
|
|
62
56
|
case 0:
|
|
63
57
|
return _context.abrupt("return", this.result);
|
|
64
|
-
|
|
65
58
|
case 1:
|
|
66
59
|
case "end":
|
|
67
60
|
return _context.stop();
|
|
@@ -69,11 +62,9 @@ var WebSocketTransportResult = /*#__PURE__*/function () {
|
|
|
69
62
|
}
|
|
70
63
|
}, _callee, this);
|
|
71
64
|
}));
|
|
72
|
-
|
|
73
65
|
function json() {
|
|
74
66
|
return _json.apply(this, arguments);
|
|
75
67
|
}
|
|
76
|
-
|
|
77
68
|
return json;
|
|
78
69
|
}()
|
|
79
70
|
}, {
|
|
@@ -91,7 +82,6 @@ var WebSocketTransportResult = /*#__PURE__*/function () {
|
|
|
91
82
|
switch (_context2.prev = _context2.next) {
|
|
92
83
|
case 0:
|
|
93
84
|
return _context2.abrupt("return", typeof this.result === 'string' ? this.result : JSON.stringify(this.result));
|
|
94
|
-
|
|
95
85
|
case 1:
|
|
96
86
|
case "end":
|
|
97
87
|
return _context2.stop();
|
|
@@ -99,44 +89,30 @@ var WebSocketTransportResult = /*#__PURE__*/function () {
|
|
|
99
89
|
}
|
|
100
90
|
}, _callee2, this);
|
|
101
91
|
}));
|
|
102
|
-
|
|
103
92
|
function text() {
|
|
104
93
|
return _text.apply(this, arguments);
|
|
105
94
|
}
|
|
106
|
-
|
|
107
95
|
return text;
|
|
108
96
|
}()
|
|
109
97
|
}]);
|
|
110
|
-
|
|
111
98
|
return WebSocketTransportResult;
|
|
112
99
|
}();
|
|
113
|
-
|
|
114
100
|
var WebSocketTransport = /*#__PURE__*/function () {
|
|
115
101
|
function WebSocketTransport(_ref2) {
|
|
116
102
|
var authorization = _ref2.authorization,
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
103
|
+
apiUrl = _ref2.apiUrl,
|
|
104
|
+
heartBeatInterval = _ref2.heartBeatInterval,
|
|
105
|
+
hearBeatInterval = _ref2.hearBeatInterval;
|
|
121
106
|
_classCallCheck__default['default'](this, WebSocketTransport);
|
|
122
|
-
|
|
123
107
|
_defineProperty__default['default'](this, "apiUrl", void 0);
|
|
124
|
-
|
|
125
108
|
_defineProperty__default['default'](this, "heartBeatInterval", 60);
|
|
126
|
-
|
|
127
109
|
_defineProperty__default['default'](this, "token", void 0);
|
|
128
|
-
|
|
129
110
|
_defineProperty__default['default'](this, "ws", null);
|
|
130
|
-
|
|
131
111
|
_defineProperty__default['default'](this, "messageCounter", 1);
|
|
132
|
-
|
|
133
112
|
_defineProperty__default['default'](this, "messageIdToSubscription", {});
|
|
134
|
-
|
|
135
113
|
_defineProperty__default['default'](this, "messageQueue", []);
|
|
136
|
-
|
|
137
114
|
this.token = authorization;
|
|
138
115
|
this.apiUrl = apiUrl;
|
|
139
|
-
|
|
140
116
|
if (heartBeatInterval) {
|
|
141
117
|
this.heartBeatInterval = heartBeatInterval;
|
|
142
118
|
} else if (hearBeatInterval) {
|
|
@@ -144,7 +120,6 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
144
120
|
this.heartBeatInterval = hearBeatInterval;
|
|
145
121
|
}
|
|
146
122
|
}
|
|
147
|
-
|
|
148
123
|
_createClass__default['default'](WebSocketTransport, [{
|
|
149
124
|
key: "authorization",
|
|
150
125
|
get: function get() {
|
|
@@ -152,7 +127,6 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
152
127
|
},
|
|
153
128
|
set: function set(token) {
|
|
154
129
|
this.token = token;
|
|
155
|
-
|
|
156
130
|
if (this.ws) {
|
|
157
131
|
this.ws.close();
|
|
158
132
|
}
|
|
@@ -168,7 +142,6 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
168
142
|
if (this.ws) {
|
|
169
143
|
this.ws.close();
|
|
170
144
|
}
|
|
171
|
-
|
|
172
145
|
case 1:
|
|
173
146
|
case "end":
|
|
174
147
|
return _context3.stop();
|
|
@@ -176,40 +149,32 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
176
149
|
}
|
|
177
150
|
}, _callee3, this);
|
|
178
151
|
}));
|
|
179
|
-
|
|
180
152
|
function close() {
|
|
181
153
|
return _close.apply(this, arguments);
|
|
182
154
|
}
|
|
183
|
-
|
|
184
155
|
return close;
|
|
185
156
|
}()
|
|
186
157
|
}, {
|
|
187
158
|
key: "initSocket",
|
|
188
159
|
value: function initSocket() {
|
|
189
160
|
var _this = this;
|
|
190
|
-
|
|
191
161
|
if (this.ws) {
|
|
192
162
|
return this.ws.initPromise;
|
|
193
163
|
}
|
|
194
|
-
|
|
195
164
|
var ws = new WebSocket__default['default'](this.apiUrl);
|
|
196
165
|
ws.messageIdSent = {};
|
|
197
|
-
|
|
198
166
|
ws.sendMessage = function (message) {
|
|
199
167
|
if (!message.messageId || message.messageId && !ws.messageIdSent[message.messageId]) {
|
|
200
168
|
ws.send(JSON.stringify(message));
|
|
201
169
|
ws.messageIdSent[message.messageId] = true;
|
|
202
170
|
}
|
|
203
171
|
};
|
|
204
|
-
|
|
205
172
|
ws.sendQueue = function () {
|
|
206
173
|
_this.messageQueue.forEach(function (message) {
|
|
207
174
|
return ws.sendMessage(message);
|
|
208
175
|
});
|
|
209
|
-
|
|
210
176
|
_this.messageQueue = [];
|
|
211
177
|
};
|
|
212
|
-
|
|
213
178
|
ws.reconcile = function () {
|
|
214
179
|
if (new Date().getTime() - ws.lastMessageTimestamp.getTime() > 4 * _this.heartBeatInterval * 1000) {
|
|
215
180
|
ws.close();
|
|
@@ -220,7 +185,6 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
220
185
|
});
|
|
221
186
|
}
|
|
222
187
|
};
|
|
223
|
-
|
|
224
188
|
ws.lastMessageTimestamp = new Date();
|
|
225
189
|
ws.initPromise = new Promise(function (resolve) {
|
|
226
190
|
ws.onopen = function () {
|
|
@@ -228,11 +192,9 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
228
192
|
authorization: _this.authorization
|
|
229
193
|
});
|
|
230
194
|
};
|
|
231
|
-
|
|
232
195
|
ws.onmessage = function (event) {
|
|
233
196
|
ws.lastMessageTimestamp = new Date();
|
|
234
197
|
var message = JSON.parse(event.data);
|
|
235
|
-
|
|
236
198
|
if (message.handshake) {
|
|
237
199
|
ws.reconcile();
|
|
238
200
|
ws.reconcileTimer = setInterval(function () {
|
|
@@ -241,33 +203,26 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
241
203
|
}, _this.heartBeatInterval * 1000);
|
|
242
204
|
resolve();
|
|
243
205
|
}
|
|
244
|
-
|
|
245
206
|
if (_this.messageIdToSubscription[message.messageId]) {
|
|
246
207
|
_this.messageIdToSubscription[message.messageId].callback(new WebSocketTransportResult(message));
|
|
247
208
|
}
|
|
248
|
-
|
|
249
209
|
ws.sendQueue();
|
|
250
210
|
};
|
|
251
|
-
|
|
252
211
|
ws.onclose = function () {
|
|
253
212
|
if (ws && ws.readyState !== WebSocket__default['default'].CLOSED && ws.readyState !== WebSocket__default['default'].CLOSING) {
|
|
254
213
|
ws.close();
|
|
255
214
|
}
|
|
256
|
-
|
|
257
215
|
if (ws.reconcileTimer) {
|
|
258
216
|
clearInterval(ws.reconcileTimer);
|
|
259
217
|
ws.reconcileTimer = null;
|
|
260
218
|
}
|
|
261
|
-
|
|
262
219
|
if (_this.ws === ws) {
|
|
263
220
|
_this.ws = null;
|
|
264
|
-
|
|
265
221
|
if (Object.keys(_this.messageIdToSubscription).length) {
|
|
266
222
|
_this.initSocket();
|
|
267
223
|
}
|
|
268
224
|
}
|
|
269
225
|
};
|
|
270
|
-
|
|
271
226
|
ws.onerror = ws.onclose;
|
|
272
227
|
});
|
|
273
228
|
this.ws = ws;
|
|
@@ -277,7 +232,6 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
277
232
|
key: "sendMessage",
|
|
278
233
|
value: function sendMessage(message) {
|
|
279
234
|
var _this2 = this;
|
|
280
|
-
|
|
281
235
|
if (message.unsubscribe && this.messageQueue.find(function (m) {
|
|
282
236
|
return m.messageId === message.unsubscribe;
|
|
283
237
|
})) {
|
|
@@ -287,7 +241,6 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
287
241
|
} else {
|
|
288
242
|
this.messageQueue.push(message);
|
|
289
243
|
}
|
|
290
|
-
|
|
291
244
|
setTimeout( /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee4() {
|
|
292
245
|
return _regeneratorRuntime__default['default'].wrap(function _callee4$(_context4) {
|
|
293
246
|
while (1) {
|
|
@@ -295,10 +248,8 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
295
248
|
case 0:
|
|
296
249
|
_context4.next = 2;
|
|
297
250
|
return _this2.initSocket();
|
|
298
|
-
|
|
299
251
|
case 2:
|
|
300
252
|
_this2.ws.sendQueue();
|
|
301
|
-
|
|
302
253
|
case 3:
|
|
303
254
|
case "end":
|
|
304
255
|
return _context4.stop();
|
|
@@ -311,8 +262,7 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
311
262
|
key: "request",
|
|
312
263
|
value: function request(method, _ref4) {
|
|
313
264
|
var baseRequestId = _ref4.baseRequestId,
|
|
314
|
-
|
|
315
|
-
|
|
265
|
+
params = _objectWithoutProperties__default['default'](_ref4, _excluded);
|
|
316
266
|
var message = {
|
|
317
267
|
messageId: this.messageCounter++,
|
|
318
268
|
requestId: baseRequestId,
|
|
@@ -321,14 +271,12 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
321
271
|
};
|
|
322
272
|
var pendingResults = [];
|
|
323
273
|
var nextMessage = null;
|
|
324
|
-
|
|
325
274
|
var runNextMessage = function runNextMessage() {
|
|
326
275
|
if (nextMessage) {
|
|
327
276
|
nextMessage(pendingResults.pop());
|
|
328
277
|
nextMessage = null;
|
|
329
278
|
}
|
|
330
279
|
};
|
|
331
|
-
|
|
332
280
|
this.messageIdToSubscription[message.messageId] = {
|
|
333
281
|
message: message,
|
|
334
282
|
callback: function callback(result) {
|
|
@@ -340,7 +288,6 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
340
288
|
return {
|
|
341
289
|
subscribe: function subscribe(callback) {
|
|
342
290
|
var _this3 = this;
|
|
343
|
-
|
|
344
291
|
return _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee5() {
|
|
345
292
|
var result;
|
|
346
293
|
return _regeneratorRuntime__default['default'].wrap(function _callee5$(_context5) {
|
|
@@ -351,18 +298,15 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
351
298
|
_context5.next = 3;
|
|
352
299
|
return new Promise(function (resolve) {
|
|
353
300
|
nextMessage = resolve;
|
|
354
|
-
|
|
355
301
|
if (pendingResults.length) {
|
|
356
302
|
runNextMessage();
|
|
357
303
|
}
|
|
358
304
|
});
|
|
359
|
-
|
|
360
305
|
case 3:
|
|
361
306
|
result = _context5.sent;
|
|
362
307
|
return _context5.abrupt("return", callback(result, function () {
|
|
363
308
|
return _this3.subscribe(callback);
|
|
364
309
|
}));
|
|
365
|
-
|
|
366
310
|
case 5:
|
|
367
311
|
case "end":
|
|
368
312
|
return _context5.stop();
|
|
@@ -381,7 +325,6 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
381
325
|
unsubscribe: message.messageId
|
|
382
326
|
});
|
|
383
327
|
delete transport.messageIdToSubscription[message.messageId];
|
|
384
|
-
|
|
385
328
|
case 2:
|
|
386
329
|
case "end":
|
|
387
330
|
return _context6.stop();
|
|
@@ -393,7 +336,6 @@ var WebSocketTransport = /*#__PURE__*/function () {
|
|
|
393
336
|
};
|
|
394
337
|
}
|
|
395
338
|
}]);
|
|
396
|
-
|
|
397
339
|
return WebSocketTransport;
|
|
398
340
|
}();
|
|
399
341
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cubejs-client-ws-transport.js","sources":["../src/index.ts"],"sourcesContent":["import WebSocket from 'isomorphic-ws';\nimport type { ITransport, ITransportResponse } from '@cubejs-client/core';\n\n/**\n * @title @cubejs-client/ws-transport\n * @permalink /@cubejs-client-ws-transport\n * @menuCategory Cube.js Frontend\n * @subcategory Reference\n * @menuOrder 4\n * @description WebSocket transport for Cube.js client\n */\n\nclass WebSocketTransportResult {\n protected readonly status: unknown;\n\n protected readonly result: unknown;\n\n public constructor({ status, message }: { status: unknown, message: unknown }) {\n this.status = status;\n this.result = message;\n }\n\n public async json() {\n return this.result;\n }\n\n public clone() {\n // no need to actually clone it\n return this;\n }\n\n public async text() {\n return typeof this.result === 'string' ? this.result : JSON.stringify(this.result);\n }\n}\n\ntype WebSocketTransportOptions = {\n authorization?: string,\n apiUrl: string,\n // @deprecated\n hearBeatInterval?: number,\n heartBeatInterval?: number,\n};\n\ntype Message = {\n messageId: number,\n requestId: any,\n method: string,\n params: Record<string, unknown>,\n};\n\ntype Subscription = {\n message: Message,\n callback: (result: WebSocketTransportResult) => void,\n};\n\nclass WebSocketTransport implements ITransport<WebSocketTransportResult> {\n protected readonly apiUrl: string;\n\n protected readonly heartBeatInterval: number = 60;\n\n protected token: string | undefined;\n\n protected ws: any = null;\n\n protected messageCounter: number = 1;\n\n protected messageIdToSubscription: Record<number, Subscription> = {};\n\n protected messageQueue: Message[] = [];\n\n public constructor({ authorization, apiUrl, heartBeatInterval, hearBeatInterval }: WebSocketTransportOptions) {\n this.token = authorization;\n this.apiUrl = apiUrl;\n\n if (heartBeatInterval) {\n this.heartBeatInterval = heartBeatInterval;\n } else if (hearBeatInterval) {\n console.warn('Option hearBeatInterval is deprecated. It was replaced by heartBeatInterval.');\n this.heartBeatInterval = hearBeatInterval;\n }\n }\n\n public set authorization(token) {\n this.token = token;\n\n if (this.ws) {\n this.ws.close();\n }\n }\n\n public async close(): Promise<void> {\n if (this.ws) {\n this.ws.close();\n }\n }\n\n public get authorization() {\n return this.token;\n }\n\n protected initSocket() {\n if (this.ws) {\n return this.ws.initPromise;\n }\n\n const ws: any = new WebSocket(this.apiUrl);\n\n ws.messageIdSent = {};\n\n ws.sendMessage = (message: any) => {\n if (!message.messageId || message.messageId && !ws.messageIdSent[message.messageId]) {\n ws.send(JSON.stringify(message));\n ws.messageIdSent[message.messageId] = true;\n }\n };\n\n ws.sendQueue = () => {\n this.messageQueue.forEach(message => ws.sendMessage(message));\n this.messageQueue = [];\n };\n\n ws.reconcile = () => {\n if (new Date().getTime() - ws.lastMessageTimestamp.getTime() > 4 * this.heartBeatInterval * 1000) {\n ws.close();\n } else {\n Object.keys(this.messageIdToSubscription).forEach(messageId => {\n // @ts-ignore\n ws.sendMessage(this.messageIdToSubscription[messageId].message);\n });\n }\n };\n\n ws.lastMessageTimestamp = new Date();\n\n ws.initPromise = new Promise<void>(resolve => {\n ws.onopen = () => {\n ws.sendMessage({ authorization: this.authorization });\n };\n\n ws.onmessage = (event: any) => {\n ws.lastMessageTimestamp = new Date();\n\n const message: any = JSON.parse(event.data);\n if (message.handshake) {\n ws.reconcile();\n ws.reconcileTimer = setInterval(() => {\n ws.messageIdSent = {};\n ws.reconcile();\n }, this.heartBeatInterval * 1000);\n resolve();\n }\n\n if (this.messageIdToSubscription[message.messageId]) {\n this.messageIdToSubscription[message.messageId].callback(\n new WebSocketTransportResult(message)\n );\n }\n\n ws.sendQueue();\n };\n\n ws.onclose = () => {\n if (ws && ws.readyState !== WebSocket.CLOSED && ws.readyState !== WebSocket.CLOSING) {\n ws.close();\n }\n if (ws.reconcileTimer) {\n clearInterval(ws.reconcileTimer);\n ws.reconcileTimer = null;\n }\n if (this.ws === ws) {\n this.ws = null;\n if (Object.keys(this.messageIdToSubscription).length) {\n this.initSocket();\n }\n }\n };\n\n ws.onerror = ws.onclose;\n });\n\n this.ws = ws;\n\n return this.ws.initPromise;\n }\n\n protected sendMessage(message: any) {\n if (message.unsubscribe && this.messageQueue.find(m => m.messageId === message.unsubscribe)) {\n this.messageQueue = this.messageQueue.filter(m => m.messageId !== message.unsubscribe);\n } else {\n this.messageQueue.push(message);\n }\n\n setTimeout(async () => {\n await this.initSocket();\n this.ws.sendQueue();\n }, 100);\n }\n\n public request(\n method: string,\n { baseRequestId, ...params }: Record<string, unknown>\n ): ITransportResponse<WebSocketTransportResult> {\n const message: Message = {\n messageId: this.messageCounter++,\n requestId: baseRequestId,\n method,\n params\n };\n\n const pendingResults: WebSocketTransportResult[] = [];\n let nextMessage: ((value: any) => void) | null = null;\n\n const runNextMessage = () => {\n if (nextMessage) {\n nextMessage(pendingResults.pop());\n nextMessage = null;\n }\n };\n\n this.messageIdToSubscription[message.messageId] = {\n message,\n callback: (result) => {\n pendingResults.push(result);\n runNextMessage();\n }\n };\n\n const transport = this;\n\n return {\n async subscribe(callback) {\n transport.sendMessage(message);\n\n const result = await new Promise<WebSocketTransportResult>((resolve) => {\n nextMessage = resolve;\n if (pendingResults.length) {\n runNextMessage();\n }\n });\n\n return callback(result, () => this.subscribe(callback));\n },\n async unsubscribe() {\n transport.sendMessage({ unsubscribe: message.messageId });\n delete transport.messageIdToSubscription[message.messageId];\n }\n };\n }\n}\n\nexport default WebSocketTransport;\n"],"names":["WebSocketTransportResult","status","message","result","JSON","stringify","WebSocketTransport","authorization","apiUrl","heartBeatInterval","hearBeatInterval","token","console","warn","ws","close","initPromise","WebSocket","messageIdSent","sendMessage","messageId","send","sendQueue","messageQueue","forEach","reconcile","Date","getTime","lastMessageTimestamp","Object","keys","messageIdToSubscription","Promise","resolve","onopen","onmessage","event","parse","data","handshake","reconcileTimer","setInterval","callback","onclose","readyState","CLOSED","CLOSING","clearInterval","length","initSocket","onerror","unsubscribe","find","m","filter","push","setTimeout","method","baseRequestId","params","messageCounter","requestId","pendingResults","nextMessage","runNextMessage","pop","transport","subscribe"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cubejs-client-ws-transport.js","sources":["../src/index.ts"],"sourcesContent":["import WebSocket from 'isomorphic-ws';\nimport type { ITransport, ITransportResponse } from '@cubejs-client/core';\n\n/**\n * @title @cubejs-client/ws-transport\n * @permalink /@cubejs-client-ws-transport\n * @menuCategory Cube.js Frontend\n * @subcategory Reference\n * @menuOrder 4\n * @description WebSocket transport for Cube.js client\n */\n\nclass WebSocketTransportResult {\n protected readonly status: unknown;\n\n protected readonly result: unknown;\n\n public constructor({ status, message }: { status: unknown, message: unknown }) {\n this.status = status;\n this.result = message;\n }\n\n public async json() {\n return this.result;\n }\n\n public clone() {\n // no need to actually clone it\n return this;\n }\n\n public async text() {\n return typeof this.result === 'string' ? this.result : JSON.stringify(this.result);\n }\n}\n\ntype WebSocketTransportOptions = {\n authorization?: string,\n apiUrl: string,\n // @deprecated\n hearBeatInterval?: number,\n heartBeatInterval?: number,\n};\n\ntype Message = {\n messageId: number,\n requestId: any,\n method: string,\n params: Record<string, unknown>,\n};\n\ntype Subscription = {\n message: Message,\n callback: (result: WebSocketTransportResult) => void,\n};\n\nclass WebSocketTransport implements ITransport<WebSocketTransportResult> {\n protected readonly apiUrl: string;\n\n protected readonly heartBeatInterval: number = 60;\n\n protected token: string | undefined;\n\n protected ws: any = null;\n\n protected messageCounter: number = 1;\n\n protected messageIdToSubscription: Record<number, Subscription> = {};\n\n protected messageQueue: Message[] = [];\n\n public constructor({ authorization, apiUrl, heartBeatInterval, hearBeatInterval }: WebSocketTransportOptions) {\n this.token = authorization;\n this.apiUrl = apiUrl;\n\n if (heartBeatInterval) {\n this.heartBeatInterval = heartBeatInterval;\n } else if (hearBeatInterval) {\n console.warn('Option hearBeatInterval is deprecated. It was replaced by heartBeatInterval.');\n this.heartBeatInterval = hearBeatInterval;\n }\n }\n\n public set authorization(token) {\n this.token = token;\n\n if (this.ws) {\n this.ws.close();\n }\n }\n\n public async close(): Promise<void> {\n if (this.ws) {\n this.ws.close();\n }\n }\n\n public get authorization() {\n return this.token;\n }\n\n protected initSocket() {\n if (this.ws) {\n return this.ws.initPromise;\n }\n\n const ws: any = new WebSocket(this.apiUrl);\n\n ws.messageIdSent = {};\n\n ws.sendMessage = (message: any) => {\n if (!message.messageId || message.messageId && !ws.messageIdSent[message.messageId]) {\n ws.send(JSON.stringify(message));\n ws.messageIdSent[message.messageId] = true;\n }\n };\n\n ws.sendQueue = () => {\n this.messageQueue.forEach(message => ws.sendMessage(message));\n this.messageQueue = [];\n };\n\n ws.reconcile = () => {\n if (new Date().getTime() - ws.lastMessageTimestamp.getTime() > 4 * this.heartBeatInterval * 1000) {\n ws.close();\n } else {\n Object.keys(this.messageIdToSubscription).forEach(messageId => {\n // @ts-ignore\n ws.sendMessage(this.messageIdToSubscription[messageId].message);\n });\n }\n };\n\n ws.lastMessageTimestamp = new Date();\n\n ws.initPromise = new Promise<void>(resolve => {\n ws.onopen = () => {\n ws.sendMessage({ authorization: this.authorization });\n };\n\n ws.onmessage = (event: any) => {\n ws.lastMessageTimestamp = new Date();\n\n const message: any = JSON.parse(event.data);\n if (message.handshake) {\n ws.reconcile();\n ws.reconcileTimer = setInterval(() => {\n ws.messageIdSent = {};\n ws.reconcile();\n }, this.heartBeatInterval * 1000);\n resolve();\n }\n\n if (this.messageIdToSubscription[message.messageId]) {\n this.messageIdToSubscription[message.messageId].callback(\n new WebSocketTransportResult(message)\n );\n }\n\n ws.sendQueue();\n };\n\n ws.onclose = () => {\n if (ws && ws.readyState !== WebSocket.CLOSED && ws.readyState !== WebSocket.CLOSING) {\n ws.close();\n }\n if (ws.reconcileTimer) {\n clearInterval(ws.reconcileTimer);\n ws.reconcileTimer = null;\n }\n if (this.ws === ws) {\n this.ws = null;\n if (Object.keys(this.messageIdToSubscription).length) {\n this.initSocket();\n }\n }\n };\n\n ws.onerror = ws.onclose;\n });\n\n this.ws = ws;\n\n return this.ws.initPromise;\n }\n\n protected sendMessage(message: any) {\n if (message.unsubscribe && this.messageQueue.find(m => m.messageId === message.unsubscribe)) {\n this.messageQueue = this.messageQueue.filter(m => m.messageId !== message.unsubscribe);\n } else {\n this.messageQueue.push(message);\n }\n\n setTimeout(async () => {\n await this.initSocket();\n this.ws.sendQueue();\n }, 100);\n }\n\n public request(\n method: string,\n { baseRequestId, ...params }: Record<string, unknown>\n ): ITransportResponse<WebSocketTransportResult> {\n const message: Message = {\n messageId: this.messageCounter++,\n requestId: baseRequestId,\n method,\n params\n };\n\n const pendingResults: WebSocketTransportResult[] = [];\n let nextMessage: ((value: any) => void) | null = null;\n\n const runNextMessage = () => {\n if (nextMessage) {\n nextMessage(pendingResults.pop());\n nextMessage = null;\n }\n };\n\n this.messageIdToSubscription[message.messageId] = {\n message,\n callback: (result) => {\n pendingResults.push(result);\n runNextMessage();\n }\n };\n\n const transport = this;\n\n return {\n async subscribe(callback) {\n transport.sendMessage(message);\n\n const result = await new Promise<WebSocketTransportResult>((resolve) => {\n nextMessage = resolve;\n if (pendingResults.length) {\n runNextMessage();\n }\n });\n\n return callback(result, () => this.subscribe(callback));\n },\n async unsubscribe() {\n transport.sendMessage({ unsubscribe: message.messageId });\n delete transport.messageIdToSubscription[message.messageId];\n }\n };\n }\n}\n\nexport default WebSocketTransport;\n"],"names":["WebSocketTransportResult","_ref","status","message","_classCallCheck","_defineProperty","result","_createClass","key","value","_json","_asyncToGenerator","_regeneratorRuntime","mark","_callee","wrap","_callee$","_context","prev","next","abrupt","stop","json","apply","arguments","clone","_text","_callee2","_callee2$","_context2","JSON","stringify","text","WebSocketTransport","_ref2","authorization","apiUrl","heartBeatInterval","hearBeatInterval","token","console","warn","get","set","ws","close","_close","_callee3","_callee3$","_context3","initSocket","_this","initPromise","WebSocket","messageIdSent","sendMessage","messageId","send","sendQueue","messageQueue","forEach","reconcile","Date","getTime","lastMessageTimestamp","Object","keys","messageIdToSubscription","Promise","resolve","onopen","onmessage","event","parse","data","handshake","reconcileTimer","setInterval","callback","onclose","readyState","CLOSED","CLOSING","clearInterval","length","onerror","_this2","unsubscribe","find","m","filter","push","setTimeout","_callee4","_callee4$","_context4","request","method","_ref4","baseRequestId","params","_objectWithoutProperties","_excluded","messageCounter","requestId","pendingResults","nextMessage","runNextMessage","pop","transport","subscribe","_this3","_callee5","_callee5$","_context5","sent","_callee6","_callee6$","_context6"],"mappings":"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"}
|