Skip to content

Commit f464017

Browse files
authored
Include the error message as well as error code in the error message (#7762)
1 parent 0f617f3 commit f464017

File tree

2 files changed

+48
-52
lines changed

2 files changed

+48
-52
lines changed

firebase-vscode/src/data-connect/service.ts

Lines changed: 37 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,18 @@ import { EmulatorsController } from "../core/emulators";
1313
import { dataConnectConfigs } from "../data-connect/config";
1414

1515
import { firebaseRC } from "../core/config";
16-
import { executeGraphQL } from "../../../src/dataconnect/dataplaneClient";
16+
import {
17+
dataconnectDataplaneClient,
18+
executeGraphQL,
19+
DATACONNECT_API_VERSION,
20+
} from "../../../src/dataconnect/dataplaneClient";
1721
import {
1822
ExecuteGraphqlRequest,
1923
ExecuteGraphqlResponse,
2024
ExecuteGraphqlResponseError,
2125
Impersonation,
2226
} from "../dataconnect/types";
23-
import { ClientResponse } from "../apiv2";
27+
import { Client, ClientResponse } from "../../../src/apiv2";
2428
import { InstanceType } from "./code-lens-provider";
2529
import { pluginLogger } from "../logger-wrapper";
2630
import { DataConnectToolkit } from "./toolkit";
@@ -78,47 +82,35 @@ export class DataConnectService {
7882
return response.text();
7983
}
8084
private async handleProdResponse(
81-
clientResponse: ClientResponse<
85+
response: ClientResponse<
8286
ExecuteGraphqlResponse | ExecuteGraphqlResponseError
8387
>,
8488
): Promise<ExecutionResult> {
85-
if (!(clientResponse.status >= 200 && clientResponse.status < 300)) {
89+
if (!(response.status >= 200 && response.status < 300)) {
8690
const errorResponse =
87-
clientResponse as ClientResponse<ExecuteGraphqlResponseError>;
91+
response as ClientResponse<ExecuteGraphqlResponseError>;
8892
throw new DataConnectError(
89-
`Request failed with status ${clientResponse.status}`,
90-
errorResponse.body.error.message,
93+
`Prod Request failed with status ${response.status}\nMessage ${errorResponse?.body?.error?.message}`,
9194
);
9295
}
93-
const successResponse =
94-
clientResponse as ClientResponse<ExecuteGraphqlResponse>;
96+
const successResponse = response as ClientResponse<ExecuteGraphqlResponse>;
9597
return successResponse.body;
9698
}
9799

98-
private async handleValidResponse(
99-
response: Response,
100+
private async handleEmulatorResponse(
101+
response: ClientResponse<
102+
ExecuteGraphqlResponse | ExecuteGraphqlResponseError
103+
>,
100104
): Promise<ExecutionResult> {
101-
const json = await this.decodeResponse(response, "application/json");
102-
assertExecutionResult(json);
103-
104-
return json;
105-
}
106-
107-
private async handleInvalidResponse(response: Response): Promise<never> {
108-
const cause = await this.decodeResponse(response);
109-
110-
throw new DataConnectError(
111-
`Request failed with status ${response.status}`,
112-
cause,
113-
);
114-
}
115-
116-
private handleResponse(response: Response): Promise<ExecutionResult> {
117-
if (response.status >= 200 && response.status < 300) {
118-
return this.handleValidResponse(response);
105+
if (!(response.status >= 200 && response.status < 300)) {
106+
const errorResponse =
107+
response as ClientResponse<ExecuteGraphqlResponseError>;
108+
throw new DataConnectError(
109+
`Emulator Request failed with status ${response.status}\nMessage ${errorResponse?.body?.error?.message}`,
110+
);
119111
}
120-
121-
return this.handleInvalidResponse(response);
112+
const successResponse = response as ClientResponse<ExecuteGraphqlResponse>;
113+
return successResponse.body;
122114
}
123115

124116
/** Encode a body while handling the fact that "variables" is raw JSON.
@@ -243,23 +235,22 @@ export class DataConnectService {
243235
extensions: this._auth(),
244236
});
245237
if (params.instance === InstanceType.PRODUCTION) {
246-
const resp = await executeGraphQL(servicePath, prodBody);
238+
const client = dataconnectDataplaneClient();
239+
const resp = await executeGraphQL(client, servicePath, prodBody);
247240
return this.handleProdResponse(resp);
248241
} else {
249-
const resp = await fetch(
250-
(await this.emulatorsController.getLocalEndpoint()) +
251-
`/v1beta/${servicePath}:executeGraphql`,
252-
{
253-
method: "POST",
254-
headers: {
255-
Accept: "application/json",
256-
"Content-Type": "application/json",
257-
"x-mantle-admin": "all",
258-
},
259-
body,
260-
},
261-
);
262-
return this.handleResponse(resp);
242+
const endpoint = this.emulatorsController.getLocalEndpoint();
243+
if (!endpoint) {
244+
throw new DataConnectError(
245+
`Emulator isn't running. Please start your emulator!`,
246+
);
247+
}
248+
const client = new Client({
249+
urlPrefix: endpoint,
250+
apiVersion: DATACONNECT_API_VERSION,
251+
});
252+
const resp = await executeGraphQL(client, servicePath, prodBody);
253+
return this.handleEmulatorResponse(resp);
263254
}
264255
}
265256

src/dataconnect/dataplaneClient.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
import { dataconnectOrigin } from "../api";
2-
import { Client } from "../apiv2";
2+
import { Client, ClientResponse } from "../apiv2";
33
import * as types from "./types";
44

5-
const DATACONNECT_API_VERSION = "v1beta";
5+
export const DATACONNECT_API_VERSION = "v1beta";
66

7-
const dataconnectDataplaneClient = () =>
8-
new Client({
7+
export function dataconnectDataplaneClient(): Client {
8+
return new Client({
99
urlPrefix: dataconnectOrigin(),
1010
apiVersion: DATACONNECT_API_VERSION,
1111
auth: true,
1212
});
13+
}
1314

14-
export async function executeGraphQL(servicePath: string, body: types.ExecuteGraphqlRequest) {
15-
const res = await dataconnectDataplaneClient().post<
15+
export async function executeGraphQL(
16+
client: Client,
17+
servicePath: string,
18+
body: types.ExecuteGraphqlRequest,
19+
): Promise<ClientResponse<types.ExecuteGraphqlResponse | types.ExecuteGraphqlResponseError>> {
20+
const res = await client.post<
1621
types.ExecuteGraphqlRequest,
1722
types.ExecuteGraphqlResponse | types.ExecuteGraphqlResponseError
1823
>(`${servicePath}:executeGraphql`, body, { resolveOnHTTPError: true });

0 commit comments

Comments
 (0)