@cubejs-client/ws-transport 1.0.13 → 1.0.14

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.
@@ -98,7 +98,7 @@ class WebSocketTransport {
98
98
  };
99
99
  ws.onmessage = event => {
100
100
  ws.lastMessageTimestamp = new Date();
101
- const message = JSON.parse(event.data);
101
+ const message = JSON.parse(event.data.toString());
102
102
  if (message.handshake) {
103
103
  ws.reconcile();
104
104
  ws.reconcileTimer = setInterval(() => {
@@ -112,7 +112,7 @@ class WebSocketTransport {
112
112
  }
113
113
  ws.sendQueue();
114
114
  };
115
- ws.onclose = () => {
115
+ ws.onclose = event => {
116
116
  if (ws && ws.readyState !== WebSocket.CLOSED && ws.readyState !== WebSocket.CLOSING) {
117
117
  ws.close();
118
118
  }
@@ -122,6 +122,23 @@ class WebSocketTransport {
122
122
  }
123
123
  if (this.ws === ws) {
124
124
  this.ws = null;
125
+
126
+ // Close code 1009: Message Too Big. Server rejects messages exceeding maxPayload
127
+ // without decoding. Retrying would cause an infinite loop, so we notify subscribers
128
+ // and clear subscriptions instead.
129
+ if (event?.code === 1009) {
130
+ const error = new WebSocketTransportResult({
131
+ status: 413,
132
+ message: {
133
+ error: event?.reason || 'WebSocket message too big'
134
+ }
135
+ });
136
+ Object.values(this.messageIdToSubscription).forEach(sub => {
137
+ sub.callback(error);
138
+ });
139
+ this.messageIdToSubscription = {};
140
+ return;
141
+ }
125
142
  if (Object.keys(this.messageIdToSubscription).length) {
126
143
  this.initSocket();
127
144
  }
@@ -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';\n\nimport type { CloseEvent, MessageEvent } from '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: MessageEvent) => {\n ws.lastMessageTimestamp = new Date();\n\n const message: any = JSON.parse(event.data.toString());\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 = (event: CloseEvent) => {\n if (ws && ws.readyState !== WebSocket.CLOSED && ws.readyState !== WebSocket.CLOSING) {\n ws.close();\n }\n\n if (ws.reconcileTimer) {\n clearInterval(ws.reconcileTimer);\n ws.reconcileTimer = null;\n }\n\n if (this.ws === ws) {\n this.ws = null;\n\n // Close code 1009: Message Too Big. Server rejects messages exceeding maxPayload\n // without decoding. Retrying would cause an infinite loop, so we notify subscribers\n // and clear subscriptions instead.\n if (event?.code === 1009) {\n const error = new WebSocketTransportResult({\n status: 413,\n message: { error: event?.reason || 'WebSocket message too big' }\n });\n\n Object.values(this.messageIdToSubscription).forEach(sub => {\n sub.callback(error);\n });\n\n this.messageIdToSubscription = {};\n\n return;\n }\n\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","toString","handshake","reconcileTimer","setInterval","callback","onclose","readyState","CLOSED","CLOSING","clearInterval","code","error","reason","values","sub","length","onerror","unsubscribe","find","m","filter","push","setTimeout","request","method","baseRequestId","params","requestId","pendingResults","nextMessage","runNextMessage","pop","transport","subscribe"],"mappings":"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"}
@@ -11,7 +11,9 @@ require('core-js/modules/web.dom-collections.for-each.js');
11
11
  require('core-js/modules/es.date.to-string.js');
12
12
  require('core-js/modules/es.object.keys.js');
13
13
  require('core-js/modules/es.promise.js');
14
+ require('core-js/modules/es.regexp.to-string.js');
14
15
  require('core-js/modules/web.timers.js');
16
+ require('core-js/modules/es.object.values.js');
15
17
  require('core-js/modules/es.array.find.js');
16
18
  require('core-js/modules/es.array.filter.js');
17
19
  var _regeneratorRuntime = require('@babel/runtime/regenerator');
@@ -194,7 +196,7 @@ var WebSocketTransport = /*#__PURE__*/function () {
194
196
  };
195
197
  ws.onmessage = function (event) {
196
198
  ws.lastMessageTimestamp = new Date();
197
- var message = JSON.parse(event.data);
199
+ var message = JSON.parse(event.data.toString());
198
200
  if (message.handshake) {
199
201
  ws.reconcile();
200
202
  ws.reconcileTimer = setInterval(function () {
@@ -208,7 +210,7 @@ var WebSocketTransport = /*#__PURE__*/function () {
208
210
  }
209
211
  ws.sendQueue();
210
212
  };
211
- ws.onclose = function () {
213
+ ws.onclose = function (event) {
212
214
  if (ws && ws.readyState !== WebSocket__default['default'].CLOSED && ws.readyState !== WebSocket__default['default'].CLOSING) {
213
215
  ws.close();
214
216
  }
@@ -218,6 +220,23 @@ var WebSocketTransport = /*#__PURE__*/function () {
218
220
  }
219
221
  if (_this.ws === ws) {
220
222
  _this.ws = null;
223
+
224
+ // Close code 1009: Message Too Big. Server rejects messages exceeding maxPayload
225
+ // without decoding. Retrying would cause an infinite loop, so we notify subscribers
226
+ // and clear subscriptions instead.
227
+ if ((event === null || event === void 0 ? void 0 : event.code) === 1009) {
228
+ var error = new WebSocketTransportResult({
229
+ status: 413,
230
+ message: {
231
+ error: (event === null || event === void 0 ? void 0 : event.reason) || 'WebSocket message too big'
232
+ }
233
+ });
234
+ Object.values(_this.messageIdToSubscription).forEach(function (sub) {
235
+ sub.callback(error);
236
+ });
237
+ _this.messageIdToSubscription = {};
238
+ return;
239
+ }
221
240
  if (Object.keys(_this.messageIdToSubscription).length) {
222
241
  _this.initSocket();
223
242
  }
@@ -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","_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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"}
1
+ {"version":3,"file":"cubejs-client-ws-transport.js","sources":["../src/index.ts"],"sourcesContent":["import WebSocket from 'isomorphic-ws';\n\nimport type { CloseEvent, MessageEvent } from '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: MessageEvent) => {\n ws.lastMessageTimestamp = new Date();\n\n const message: any = JSON.parse(event.data.toString());\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 = (event: CloseEvent) => {\n if (ws && ws.readyState !== WebSocket.CLOSED && ws.readyState !== WebSocket.CLOSING) {\n ws.close();\n }\n\n if (ws.reconcileTimer) {\n clearInterval(ws.reconcileTimer);\n ws.reconcileTimer = null;\n }\n\n if (this.ws === ws) {\n this.ws = null;\n\n // Close code 1009: Message Too Big. Server rejects messages exceeding maxPayload\n // without decoding. Retrying would cause an infinite loop, so we notify subscribers\n // and clear subscriptions instead.\n if (event?.code === 1009) {\n const error = new WebSocketTransportResult({\n status: 413,\n message: { error: event?.reason || 'WebSocket message too big' }\n });\n\n Object.values(this.messageIdToSubscription).forEach(sub => {\n sub.callback(error);\n });\n\n this.messageIdToSubscription = {};\n\n return;\n }\n\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","toString","handshake","reconcileTimer","setInterval","callback","onclose","readyState","CLOSED","CLOSING","clearInterval","code","error","reason","values","sub","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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"}