@cubejs-client/ws-transport 1.1.12 → 1.2.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.
@@ -57,6 +57,8 @@ class WebSocketTransport {
57
57
  }
58
58
  async close() {
59
59
  if (this.ws) {
60
+ // Flush send queue before sending close frame
61
+ this.ws.sendQueue();
60
62
  this.ws.close();
61
63
  }
62
64
  }
@@ -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 // Flush send queue before sending close frame\n this.ws.sendQueue();\n\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","sendQueue","initSocket","initPromise","WebSocket","messageIdSent","sendMessage","messageId","send","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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"}
@@ -140,6 +140,8 @@ var WebSocketTransport = /*#__PURE__*/function () {
140
140
  switch (_context3.prev = _context3.next) {
141
141
  case 0:
142
142
  if (this.ws) {
143
+ // Flush send queue before sending close frame
144
+ this.ws.sendQueue();
143
145
  this.ws.close();
144
146
  }
145
147
  case 1:
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAPA,IASMA,wBAAwB;EAK5B,SAAAA,yBAAAC,IAAA,EAA+E;IAAA,IAA1DC,MAAM,GAAAD,IAAA,CAANC,MAAM;MAAEC,OAAO,GAAAF,IAAA,CAAPE,OAAO;IAAAC,mCAAA,OAAAJ,wBAAA;IAAAK,mCAAA;IAAAA,mCAAA;IAClC,IAAI,CAACH,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACI,MAAM,GAAGH,OAAO;;EACtBI,gCAAA,CAAAP,wBAAA;IAAAQ,GAAA;IAAAC,KAAA;MAAA,IAAAC,KAAA,GAAAC,qCAAA,eAAAC,uCAAA,CAAAC,IAAA,CAED,SAAAC;QAAA,OAAAF,uCAAA,CAAAG,IAAA,UAAAC,SAAAC,QAAA;UAAA;YAAA,QAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;cAAA;gBAAA,OAAAF,QAAA,CAAAG,MAAA,WACS,IAAI,CAACd,MAAM;cAAA;cAAA;gBAAA,OAAAW,QAAA,CAAAI,IAAA;;;WAAAP,OAAA;OACnB;MAAA,SAAAQ;QAAA,OAAAZ,KAAA,CAAAa,KAAA,OAAAC,SAAA;;MAAA,OAAAF,IAAA;;;IAAAd,GAAA;IAAAC,KAAA,EAED,SAAAgB,QAAe;;MAEb,OAAO,IAAI;;;IACZjB,GAAA;IAAAC,KAAA;MAAA,IAAAiB,KAAA,GAAAf,qCAAA,eAAAC,uCAAA,CAAAC,IAAA,CAED,SAAAc;QAAA,OAAAf,uCAAA,CAAAG,IAAA,UAAAa,UAAAC,SAAA;UAAA;YAAA,QAAAA,SAAA,CAAAX,IAAA,GAAAW,SAAA,CAAAV,IAAA;cAAA;gBAAA,OAAAU,SAAA,CAAAT,MAAA,WACS,OAAO,IAAI,CAACd,MAAM,KAAK,QAAQ,GAAG,IAAI,CAACA,MAAM,GAAGwB,IAAI,CAACC,SAAS,CAAC,IAAI,CAACzB,MAAM,CAAC;cAAA;cAAA;gBAAA,OAAAuB,SAAA,CAAAR,IAAA;;;WAAAM,QAAA;OACnF;MAAA,SAAAK;QAAA,OAAAN,KAAA,CAAAH,KAAA,OAAAC,SAAA;;MAAA,OAAAQ,IAAA;;;EAAA,OAAAhC,wBAAA;AAAA;IAuBGiC,kBAAkB;EAetB,SAAAA,mBAAAC,KAAA,EAA8G;IAAA,IAAzFC,aAAa,GAAAD,KAAA,CAAbC,aAAa;MAAEC,MAAM,GAAAF,KAAA,CAANE,MAAM;MAAEC,iBAAiB,GAAAH,KAAA,CAAjBG,iBAAiB;MAAEC,gBAAgB,GAAAJ,KAAA,CAAhBI,gBAAgB;IAAAlC,mCAAA,OAAA6B,kBAAA;IAAA5B,mCAAA;IAAAA,mCAAA,4BAZhC,EAAE;IAAAA,mCAAA;IAAAA,mCAAA,aAI7B,IAAI;IAAAA,mCAAA,yBAEW,CAAC;IAAAA,mCAAA,kCAE8B,EAAE;IAAAA,mCAAA,uBAEhC,EAAE;IAGpC,IAAI,CAACkC,KAAK,GAAGJ,aAAa;IAC1B,IAAI,CAACC,MAAM,GAAGA,MAAM;IAEpB,IAAIC,iBAAiB,EAAE;MACrB,IAAI,CAACA,iBAAiB,GAAGA,iBAAiB;KAC3C,MAAM,IAAIC,gBAAgB,EAAE;MAC3BE,OAAO,CAACC,IAAI,CAAC,8EAA8E,CAAC;MAC5F,IAAI,CAACJ,iBAAiB,GAAGC,gBAAgB;;;EAE5C/B,gCAAA,CAAA0B,kBAAA;IAAAzB,GAAA;IAAAkC,GAAA,EAgBD,SAAAA,MAA2B;MACzB,OAAO,IAAI,CAACH,KAAK;KAClB;IAAAI,GAAA,EAhBD,SAAAA,IAAyBJ,KAAK,EAAE;MAC9B,IAAI,CAACA,KAAK,GAAGA,KAAK;MAElB,IAAI,IAAI,CAACK,EAAE,EAAE;QACX,IAAI,CAACA,EAAE,CAACC,KAAK,EAAE;;;;IAElBrC,GAAA;IAAAC,KAAA;MAAA,IAAAqC,MAAA,GAAAnC,qCAAA,eAAAC,uCAAA,CAAAC,IAAA,CAED,SAAAkC;QAAA,OAAAnC,uCAAA,CAAAG,IAAA,UAAAiC,UAAAC,SAAA;UAAA;YAAA,QAAAA,SAAA,CAAA/B,IAAA,GAAA+B,SAAA,CAAA9B,IAAA;cAAA;gBACE,IAAI,IAAI,CAACyB,EAAE,EAAE;kBACX,IAAI,CAACA,EAAE,CAACC,KAAK,EAAE;;cAChB;cAAA;gBAAA,OAAAI,SAAA,CAAA5B,IAAA;;;WAAA0B,QAAA;OACF;MAAA,SAAAF;QAAA,OAAAC,MAAA,CAAAvB,KAAA,OAAAC,SAAA;;MAAA,OAAAqB,KAAA;;;IAAArC,GAAA;IAAAC,KAAA,EAMD,SAAAyC,aAAuB;MAAA,IAAAC,KAAA;MACrB,IAAI,IAAI,CAACP,EAAE,EAAE;QACX,OAAO,IAAI,CAACA,EAAE,CAACQ,WAAW;;MAG5B,IAAMR,EAAO,GAAG,IAAIS,6BAAS,CAAC,IAAI,CAACjB,MAAM,CAAC;MAE1CQ,EAAE,CAACU,aAAa,GAAG,EAAE;MAErBV,EAAE,CAACW,WAAW,GAAG,UAACpD,OAAY,EAAK;QACjC,IAAI,CAACA,OAAO,CAACqD,SAAS,IAAIrD,OAAO,CAACqD,SAAS,IAAI,CAACZ,EAAE,CAACU,aAAa,CAACnD,OAAO,CAACqD,SAAS,CAAC,EAAE;UACnFZ,EAAE,CAACa,IAAI,CAAC3B,IAAI,CAACC,SAAS,CAAC5B,OAAO,CAAC,CAAC;UAChCyC,EAAE,CAACU,aAAa,CAACnD,OAAO,CAACqD,SAAS,CAAC,GAAG,IAAI;;OAE7C;MAEDZ,EAAE,CAACc,SAAS,GAAG,YAAM;QACnBP,KAAI,CAACQ,YAAY,CAACC,OAAO,CAAC,UAAAzD,OAAO;UAAA,OAAIyC,EAAE,CAACW,WAAW,CAACpD,OAAO,CAAC;UAAC;QAC7DgD,KAAI,CAACQ,YAAY,GAAG,EAAE;OACvB;MAEDf,EAAE,CAACiB,SAAS,GAAG,YAAM;QACnB,IAAI,IAAIC,IAAI,EAAE,CAACC,OAAO,EAAE,GAAGnB,EAAE,CAACoB,oBAAoB,CAACD,OAAO,EAAE,GAAG,CAAC,GAAGZ,KAAI,CAACd,iBAAiB,GAAG,IAAI,EAAE;UAChGO,EAAE,CAACC,KAAK,EAAE;SACX,MAAM;UACLoB,MAAM,CAACC,IAAI,CAACf,KAAI,CAACgB,uBAAuB,CAAC,CAACP,OAAO,CAAC,UAAAJ,SAAS,EAAI;;YAE7DZ,EAAE,CAACW,WAAW,CAACJ,KAAI,CAACgB,uBAAuB,CAACX,SAAS,CAAC,CAACrD,OAAO,CAAC;WAChE,CAAC;;OAEL;MAEDyC,EAAE,CAACoB,oBAAoB,GAAG,IAAIF,IAAI,EAAE;MAEpClB,EAAE,CAACQ,WAAW,GAAG,IAAIgB,OAAO,CAAO,UAAAC,OAAO,EAAI;QAC5CzB,EAAE,CAAC0B,MAAM,GAAG,YAAM;UAChB1B,EAAE,CAACW,WAAW,CAAC;YAAEpB,aAAa,EAAEgB,KAAI,CAAChB;WAAe,CAAC;SACtD;QAEDS,EAAE,CAAC2B,SAAS,GAAG,UAACC,KAAU,EAAK;UAC7B5B,EAAE,CAACoB,oBAAoB,GAAG,IAAIF,IAAI,EAAE;UAEpC,IAAM3D,OAAY,GAAG2B,IAAI,CAAC2C,KAAK,CAACD,KAAK,CAACE,IAAI,CAAC;UAC3C,IAAIvE,OAAO,CAACwE,SAAS,EAAE;YACrB/B,EAAE,CAACiB,SAAS,EAAE;YACdjB,EAAE,CAACgC,cAAc,GAAGC,WAAW,CAAC,YAAM;cACpCjC,EAAE,CAACU,aAAa,GAAG,EAAE;cACrBV,EAAE,CAACiB,SAAS,EAAE;aACf,EAAEV,KAAI,CAACd,iBAAiB,GAAG,IAAI,CAAC;YACjCgC,OAAO,EAAE;;UAGX,IAAIlB,KAAI,CAACgB,uBAAuB,CAAChE,OAAO,CAACqD,SAAS,CAAC,EAAE;YACnDL,KAAI,CAACgB,uBAAuB,CAAChE,OAAO,CAACqD,SAAS,CAAC,CAACsB,QAAQ,CACtD,IAAI9E,wBAAwB,CAACG,OAAO,CACtC,CAAC;;UAGHyC,EAAE,CAACc,SAAS,EAAE;SACf;QAEDd,EAAE,CAACmC,OAAO,GAAG,YAAM;UACjB,IAAInC,EAAE,IAAIA,EAAE,CAACoC,UAAU,KAAK3B,6BAAS,CAAC4B,MAAM,IAAIrC,EAAE,CAACoC,UAAU,KAAK3B,6BAAS,CAAC6B,OAAO,EAAE;YACnFtC,EAAE,CAACC,KAAK,EAAE;;UAEZ,IAAID,EAAE,CAACgC,cAAc,EAAE;YACrBO,aAAa,CAACvC,EAAE,CAACgC,cAAc,CAAC;YAChChC,EAAE,CAACgC,cAAc,GAAG,IAAI;;UAE1B,IAAIzB,KAAI,CAACP,EAAE,KAAKA,EAAE,EAAE;YAClBO,KAAI,CAACP,EAAE,GAAG,IAAI;YACd,IAAIqB,MAAM,CAACC,IAAI,CAACf,KAAI,CAACgB,uBAAuB,CAAC,CAACiB,MAAM,EAAE;cACpDjC,KAAI,CAACD,UAAU,EAAE;;;SAGtB;QAEDN,EAAE,CAACyC,OAAO,GAAGzC,EAAE,CAACmC,OAAO;OACxB,CAAC;MAEF,IAAI,CAACnC,EAAE,GAAGA,EAAE;MAEZ,OAAO,IAAI,CAACA,EAAE,CAACQ,WAAW;;;IAC3B5C,GAAA;IAAAC,KAAA,EAED,SAAA8C,YAAsBpD,OAAY,EAAE;MAAA,IAAAmF,MAAA;MAClC,IAAInF,OAAO,CAACoF,WAAW,IAAI,IAAI,CAAC5B,YAAY,CAAC6B,IAAI,CAAC,UAAAC,CAAC;QAAA,OAAIA,CAAC,CAACjC,SAAS,KAAKrD,OAAO,CAACoF,WAAW;QAAC,EAAE;QAC3F,IAAI,CAAC5B,YAAY,GAAG,IAAI,CAACA,YAAY,CAAC+B,MAAM,CAAC,UAAAD,CAAC;UAAA,OAAIA,CAAC,CAACjC,SAAS,KAAKrD,OAAO,CAACoF,WAAW;UAAC;OACvF,MAAM;QACL,IAAI,CAAC5B,YAAY,CAACgC,IAAI,CAACxF,OAAO,CAAC;;MAGjCyF,UAAU,eAAAjF,qCAAA,eAAAC,uCAAA,CAAAC,IAAA,CAAC,SAAAgF;QAAA,OAAAjF,uCAAA,CAAAG,IAAA,UAAA+E,UAAAC,SAAA;UAAA;YAAA,QAAAA,SAAA,CAAA7E,IAAA,GAAA6E,SAAA,CAAA5E,IAAA;cAAA;gBAAA4E,SAAA,CAAA5E,IAAA;gBAAA,OACHmE,MAAI,CAACpC,UAAU,EAAE;cAAA;gBACvBoC,MAAI,CAAC1C,EAAE,CAACc,SAAS,EAAE;cAAC;cAAA;gBAAA,OAAAqC,SAAA,CAAA1E,IAAA;;;WAAAwE,QAAA;OACrB,IAAE,GAAG,CAAC;;;IACRrF,GAAA;IAAAC,KAAA,EAED,SAAAuF,QACEC,MAAc,EAAAC,KAAA,EAEgC;MAAA,IAD5CC,aAAa,GAAAD,KAAA,CAAbC,aAAa;QAAKC,MAAM,GAAAC,4CAAA,CAAAH,KAAA,EAAAI,SAAA;MAE1B,IAAMnG,OAAgB,GAAG;QACvBqD,SAAS,EAAE,IAAI,CAAC+C,cAAc,EAAE;QAChCC,SAAS,EAAEL,aAAa;QACxBF,MAAM,EAANA,MAAM;QACNG,MAAM,EAANA;OACD;MAED,IAAMK,cAA0C,GAAG,EAAE;MACrD,IAAIC,WAA0C,GAAG,IAAI;MAErD,IAAMC,cAAc,GAAG,SAAjBA,cAAcA,GAAS;QAC3B,IAAID,WAAW,EAAE;UACfA,WAAW,CAACD,cAAc,CAACG,GAAG,EAAE,CAAC;UACjCF,WAAW,GAAG,IAAI;;OAErB;MAED,IAAI,CAACvC,uBAAuB,CAAChE,OAAO,CAACqD,SAAS,CAAC,GAAG;QAChDrD,OAAO,EAAPA,OAAO;QACP2E,QAAQ,EAAE,SAAAA,SAACxE,MAAM,EAAK;UACpBmG,cAAc,CAACd,IAAI,CAACrF,MAAM,CAAC;UAC3BqG,cAAc,EAAE;;OAEnB;MAED,IAAME,SAAS,GAAG,IAAI;MAEtB,OAAO;QACCC,SAAS,WAAAA,UAAChC,QAAQ,EAAE;UAAA,IAAAiC,MAAA;UAAA,OAAApG,qCAAA,eAAAC,uCAAA,CAAAC,IAAA,UAAAmG;YAAA,IAAA1G,MAAA;YAAA,OAAAM,uCAAA,CAAAG,IAAA,UAAAkG,UAAAC,SAAA;cAAA;gBAAA,QAAAA,SAAA,CAAAhG,IAAA,GAAAgG,SAAA,CAAA/F,IAAA;kBAAA;oBACxB0F,SAAS,CAACtD,WAAW,CAACpD,OAAO,CAAC;oBAAC+G,SAAA,CAAA/F,IAAA;oBAAA,OAEV,IAAIiD,OAAO,CAA2B,UAACC,OAAO,EAAK;sBACtEqC,WAAW,GAAGrC,OAAO;sBACrB,IAAIoC,cAAc,CAACrB,MAAM,EAAE;wBACzBuB,cAAc,EAAE;;qBAEnB,CAAC;kBAAA;oBALIrG,MAAM,GAAA4G,SAAA,CAAAC,IAAA;oBAAA,OAAAD,SAAA,CAAA9F,MAAA,WAOL0D,QAAQ,CAACxE,MAAM,EAAE;sBAAA,OAAMyG,MAAI,CAACD,SAAS,CAAChC,QAAQ,CAAC;sBAAC;kBAAA;kBAAA;oBAAA,OAAAoC,SAAA,CAAA7F,IAAA;;;eAAA2F,QAAA;;SACxD;QACKzB,WAAW,WAAAA,cAAG;UAAA,OAAA5E,qCAAA,eAAAC,uCAAA,CAAAC,IAAA,UAAAuG;YAAA,OAAAxG,uCAAA,CAAAG,IAAA,UAAAsG,UAAAC,SAAA;cAAA;gBAAA,QAAAA,SAAA,CAAApG,IAAA,GAAAoG,SAAA,CAAAnG,IAAA;kBAAA;oBAClB0F,SAAS,CAACtD,WAAW,CAAC;sBAAEgC,WAAW,EAAEpF,OAAO,CAACqD;qBAAW,CAAC;oBACzD,OAAOqD,SAAS,CAAC1C,uBAAuB,CAAChE,OAAO,CAACqD,SAAS,CAAC;kBAAC;kBAAA;oBAAA,OAAA8D,SAAA,CAAAjG,IAAA;;;eAAA+F,QAAA;;;OAE/D;;;EACF,OAAAnF,kBAAA;AAAA;;;;"}
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 // Flush send queue before sending close frame\n this.ws.sendQueue();\n\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","sendQueue","initSocket","_this","initPromise","WebSocket","messageIdSent","sendMessage","messageId","send","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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"}
@@ -3355,6 +3355,8 @@
3355
3355
  switch (_context3.prev = _context3.next) {
3356
3356
  case 0:
3357
3357
  if (this.ws) {
3358
+ // Flush send queue before sending close frame
3359
+ this.ws.sendQueue();
3358
3360
  this.ws.close();
3359
3361
  }
3360
3362
  case 1: