From b0dd6b0bd6984239175d7a107c7e6c8295ba144f Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Tue, 2 Nov 2021 19:11:16 +0530 Subject: [PATCH] feat: fix gqlclient race condition --- .../helpers/backend/GQLClient.ts | 67 ++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/packages/hoppscotch-app/helpers/backend/GQLClient.ts b/packages/hoppscotch-app/helpers/backend/GQLClient.ts index 6e5505d85..7387b4dce 100644 --- a/packages/hoppscotch-app/helpers/backend/GQLClient.ts +++ b/packages/hoppscotch-app/helpers/backend/GQLClient.ts @@ -7,6 +7,7 @@ import { watchSyncEffect, WatchStopHandle, set, + isRef, } from "@nuxtjs/composition-api" import { createClient, @@ -120,8 +121,8 @@ const createHoppClient = () => }), fetchExchange, subscriptionExchange({ - // @ts-expect-error: An issue with the Urql typing forwardSubscription: (operation) => + // @ts-expect-error: An issue with the Urql typing subscriptionClient.request(operation), }), ], @@ -259,39 +260,42 @@ export const useGQLQuery = ( onEnd(() => { loading.value = false isStale.value = false + console.log("end") }), subscribe((res) => { - data.value = pipe( - // The target - res.data as DocType | undefined, - // Define what happens if data does not exist (it is an error) - E.fromNullable( - pipe( - // Take the network error value - res.error?.networkError, - // If it null, set the left to the generic error name - E.fromNullable(res.error?.message), - E.match( - // The left case (network error was null) - (gqlErr) => - >{ - type: "gql_error", - error: parseGQLErrorString( - gqlErr ?? "" - ) as DocErrorType, - }, - // The right case (it was a GraphQL Error) - (networkErr) => - >{ - type: "network_error", - error: networkErr, - } + if (res.operation.key === request.value.key) { + data.value = pipe( + // The target + res.data as DocType | undefined, + // Define what happens if data does not exist (it is an error) + E.fromNullable( + pipe( + // Take the network error value + res.error?.networkError, + // If it null, set the left to the generic error name + E.fromNullable(res.error?.message), + E.match( + // The left case (network error was null) + (gqlErr) => + >{ + type: "gql_error", + error: parseGQLErrorString( + gqlErr ?? "" + ) as DocErrorType, + }, + // The right case (it was a GraphQL Error) + (networkErr) => + >{ + type: "network_error", + error: networkErr, + } + ) ) ) ) - ) - loading.value = false + loading.value = false + } }) ).unsubscribe ) @@ -302,8 +306,11 @@ export const useGQLQuery = ( const execute = (updatedVars?: DocVarType) => { if (updatedVars) { - set(args, "variables", updatedVars) - // args.variables = updatedVars as any + if (isRef(args.variables)) { + args.variables.value = updatedVars + } else { + set(args, "variables", updatedVars) + } } isPaused.value = false