diff --git a/packages/cubejs-api-gateway/src/gateway.ts b/packages/cubejs-api-gateway/src/gateway.ts index 5d9d83aee5905..ac5ceb186ed4e 100644 --- a/packages/cubejs-api-gateway/src/gateway.ts +++ b/packages/cubejs-api-gateway/src/gateway.ts @@ -1814,11 +1814,10 @@ class ApiGateway { if (props.queryType === 'multi') { // We prepare the final json result on native side const resultMulti = new ResultMultiWrapper(results, { queryType, slowQuery }); - res(await resultMulti.getFinalResult()); + res(resultMulti); } else { // We prepare the full final json result on native side - const r = results[0]; - res(await r.getFinalResult()); + res(results[0]); } } catch (e: any) { this.handleError({ @@ -1953,7 +1952,7 @@ class ApiGateway { } else { // We prepare the final json result on native side const resultArray = new ResultArrayWrapper(results); - res(await resultArray.getFinalResult()); + res(resultArray); } } } catch (e: any) { @@ -2001,7 +2000,7 @@ class ApiGateway { query, context, res: (message, opts) => { - if (!Array.isArray(message) && message.error) { + if (!Array.isArray(message) && 'error' in message && message.error) { error = { message, opts }; } else { result = { message, opts }; @@ -2025,14 +2024,14 @@ class ApiGateway { } protected resToResultFn(res: ExpressResponse) { - return (message, { status }: { status?: number } = {}) => { + return async (message, { status }: { status?: number } = {}) => { if (status) { res.status(status); } - if (message instanceof ArrayBuffer) { + if (message.isWrapper) { res.set('Content-Type', 'application/json'); - res.send(Buffer.from(message)); + res.send(Buffer.from(await message.getFinalResult())); } else { res.json(message); } diff --git a/packages/cubejs-api-gateway/src/sql-server.ts b/packages/cubejs-api-gateway/src/sql-server.ts index 49a404706fe43..32e7d37e1e19c 100644 --- a/packages/cubejs-api-gateway/src/sql-server.ts +++ b/packages/cubejs-api-gateway/src/sql-server.ts @@ -193,12 +193,7 @@ export class SQLServer { return; } - if (response instanceof ArrayBuffer) { - const json = JSON.parse(new TextDecoder().decode(response)); - resolve(json); - } else { - resolve(response); - } + resolve(response); }, apiType: 'sql', }); diff --git a/packages/cubejs-api-gateway/src/types/request.ts b/packages/cubejs-api-gateway/src/types/request.ts index ed6c5bbd80174..3393554fd8d65 100644 --- a/packages/cubejs-api-gateway/src/types/request.ts +++ b/packages/cubejs-api-gateway/src/types/request.ts @@ -6,6 +6,7 @@ */ import type { Request as ExpressRequest } from 'express'; +import type { DataResult } from '@cubejs-backend/native'; import { RequestType, ApiType, ResultType } from './strings'; import { Query } from './query'; @@ -105,7 +106,7 @@ type MetaResponseResultFn = (message: MetaResponse | ErrorResponse) => void; */ type ResponseResultFn = ( - message: (Record | Record[]) | ErrorResponse, + message: (Record | Record[]) | DataResult | ErrorResponse, extra?: { status: number } ) => void; diff --git a/packages/cubejs-backend-native/js/ResultWrapper.ts b/packages/cubejs-backend-native/js/ResultWrapper.ts index b8f1d95066a54..c68b335b2a2a4 100644 --- a/packages/cubejs-backend-native/js/ResultWrapper.ts +++ b/packages/cubejs-backend-native/js/ResultWrapper.ts @@ -7,6 +7,7 @@ import { } from './index'; export interface DataResult { + isWrapper: boolean; getFinalResult(): Promise; } diff --git a/packages/cubejs-backend-native/js/index.ts b/packages/cubejs-backend-native/js/index.ts index fe707175afa36..252571aefddf7 100644 --- a/packages/cubejs-backend-native/js/index.ts +++ b/packages/cubejs-backend-native/js/index.ts @@ -266,8 +266,11 @@ function wrapNativeFunctionWithStream( }); } else if (response.error) { writerOrChannel.reject(errorString(response)); + } else if (response.isWrapper) { // Native wrapped result + const resArBuf = await response.getFinalResult(); + const resStr = new TextDecoder().decode(resArBuf); + writerOrChannel.resolve(resStr); } else { - // TODO remove JSON.stringify() writerOrChannel.resolve(JSON.stringify(response)); } } catch (e: any) {