@cubejs-client/ws-transport 0.35.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
- message = _ref.message;
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
- apiUrl = _ref2.apiUrl,
118
- heartBeatInterval = _ref2.heartBeatInterval,
119
- hearBeatInterval = _ref2.hearBeatInterval;
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
- params = _objectWithoutProperties__default['default'](_ref4, _excluded);
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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"}