UNPKG

1.37 kBPlain TextView Raw
1import type { ExecutionResult } from 'graphql'
2import { print } from 'graphql'
3import { parseExecutionResult } from '../../lib/graphqlHTTP.js'
4import { CONTENT_TYPE_GQL } from '../../lib/http.js'
5import type { BaseInput } from './types.js'
6
7export type URLInput = URL | string
8
9export interface NetworkRequestInput extends BaseInput {
10 url: URLInput
11 headers?: HeadersInit
12}
13
14export type NetworkRequest = (input: NetworkRequestInput) => Promise<ExecutionResult>
15
16/**
17 * @see https://graphql.github.io/graphql-over-http/draft/
18 */
19export const request: NetworkRequest = async (input) => {
20 const documentEncoded = typeof input.document === `string` ? input.document : print(input.document)
21
22 const body = {
23 query: documentEncoded,
24 variables: input.variables,
25 operationName: input.operationName,
26 }
27
28 const bodyEncoded = JSON.stringify(body)
29
30 const requestObject = new Request(input.url, {
31 method: `POST`,
32 headers: new Headers({
33 'accept': CONTENT_TYPE_GQL,
34 ...Object.fromEntries(new Headers(input.headers).entries()),
35 }),
36 body: bodyEncoded,
37 })
38
39 const response = await fetch(requestObject)
40
41 if (!response.ok) {
42 throw new Error(`Request to GraphQL endpoint failed. (Status: ${String(response.status)})`)
43 }
44
45 const json = await response.json() as object
46 const result = parseExecutionResult(json)
47
48 return result
49}