refactor: interceptor error display in graphql response (#3553)
This commit is contained in:
@@ -11,8 +11,9 @@ import {
|
||||
getIntrospectionQuery,
|
||||
printSchema,
|
||||
} from "graphql"
|
||||
import { computed, reactive, ref } from "vue"
|
||||
import { Component, computed, reactive, ref } from "vue"
|
||||
import { getService } from "~/modules/dioc"
|
||||
import { getI18n } from "~/modules/i18n"
|
||||
|
||||
import { addGraphqlHistoryEntry, makeGQLHistoryEntry } from "~/newstore/history"
|
||||
|
||||
@@ -32,13 +33,23 @@ type RunQueryOptions = {
|
||||
operationType: OperationType
|
||||
}
|
||||
|
||||
export type GQLResponseEvent = {
|
||||
time: number
|
||||
operationName: string | undefined
|
||||
operationType: OperationType
|
||||
data: string
|
||||
rawQuery?: RunQueryOptions
|
||||
}
|
||||
export type GQLResponseEvent =
|
||||
| {
|
||||
type: "response"
|
||||
time: number
|
||||
operationName: string | undefined
|
||||
operationType: OperationType
|
||||
data: string
|
||||
rawQuery?: RunQueryOptions
|
||||
}
|
||||
| {
|
||||
type: "error"
|
||||
error: {
|
||||
type: string
|
||||
message: string
|
||||
component?: Component
|
||||
}
|
||||
}
|
||||
|
||||
export type ConnectionState = "CONNECTING" | "CONNECTED" | "DISCONNECTED"
|
||||
export type SubscriptionState = "SUBSCRIBING" | "SUBSCRIBED" | "UNSUBSCRIBED"
|
||||
@@ -61,6 +72,11 @@ type Connection = {
|
||||
subscriptionState: Map<string, SubscriptionState>
|
||||
socket: WebSocket | undefined
|
||||
schema: GraphQLSchema | null
|
||||
error?: {
|
||||
type: string
|
||||
message: (t: ReturnType<typeof getI18n>) => string
|
||||
component?: Component
|
||||
} | null
|
||||
}
|
||||
|
||||
const tabs = getService(GQLTabService)
|
||||
@@ -71,6 +87,7 @@ export const connection = reactive<Connection>({
|
||||
subscriptionState: new Map<string, SubscriptionState>(),
|
||||
socket: undefined,
|
||||
schema: null,
|
||||
error: null,
|
||||
})
|
||||
|
||||
export const schema = computed(() => connection.schema)
|
||||
@@ -202,7 +219,19 @@ const getSchema = async (url: string, headers: GQLHeader[]) => {
|
||||
const res = await interceptorService.runRequest(reqOptions).response
|
||||
|
||||
if (E.isLeft(res)) {
|
||||
console.error(res.left)
|
||||
if (
|
||||
res.left !== "cancellation" &&
|
||||
res.left.error === "NO_PW_EXT_HOOK" &&
|
||||
res.left.humanMessage
|
||||
) {
|
||||
connection.error = {
|
||||
type: res.left.error,
|
||||
message: (t: ReturnType<typeof getI18n>) =>
|
||||
res.left.humanMessage.description(t),
|
||||
component: res.left.component,
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error(res.left.toString())
|
||||
}
|
||||
|
||||
@@ -218,6 +247,7 @@ const getSchema = async (url: string, headers: GQLHeader[]) => {
|
||||
const schema = buildClientSchema(introspectResponse.data)
|
||||
|
||||
connection.schema = schema
|
||||
connection.error = null
|
||||
} catch (e: any) {
|
||||
console.error(e)
|
||||
disconnect()
|
||||
@@ -280,7 +310,18 @@ export const runGQLOperation = async (options: RunQueryOptions) => {
|
||||
const result = await interceptorService.runRequest(reqOptions).response
|
||||
|
||||
if (E.isLeft(result)) {
|
||||
console.error(result.left)
|
||||
if (
|
||||
result.left !== "cancellation" &&
|
||||
result.left.error === "NO_PW_EXT_HOOK" &&
|
||||
result.left.humanMessage
|
||||
) {
|
||||
connection.error = {
|
||||
type: result.left.error,
|
||||
message: (t: ReturnType<typeof getI18n>) =>
|
||||
result.left.humanMessage.description(t),
|
||||
component: result.left.component,
|
||||
}
|
||||
}
|
||||
throw new Error(result.left.toString())
|
||||
}
|
||||
|
||||
@@ -292,6 +333,7 @@ export const runGQLOperation = async (options: RunQueryOptions) => {
|
||||
.replace(/\0+$/, "")
|
||||
|
||||
gqlMessageEvent.value = {
|
||||
type: "response",
|
||||
time: Date.now(),
|
||||
operationName: operationName ?? "query",
|
||||
data: responseText,
|
||||
@@ -299,6 +341,10 @@ export const runGQLOperation = async (options: RunQueryOptions) => {
|
||||
operationType,
|
||||
}
|
||||
|
||||
if (connection.state !== "CONNECTED") {
|
||||
connection.state = "CONNECTED"
|
||||
}
|
||||
|
||||
addQueryToHistory(options, responseText)
|
||||
|
||||
return responseText
|
||||
@@ -352,6 +398,7 @@ export const runSubscription = (
|
||||
}
|
||||
case GQL.DATA: {
|
||||
gqlMessageEvent.value = {
|
||||
type: "response",
|
||||
time: Date.now(),
|
||||
operationName,
|
||||
data: JSON.stringify(data.payload),
|
||||
|
||||
Reference in New Issue
Block a user