1 | import type { ExecutionResult } from 'graphql'
|
2 | import { print } from 'graphql'
|
3 | import { parseExecutionResult } from '../../lib/graphqlHTTP.js'
|
4 | import { CONTENT_TYPE_GQL } from '../../lib/http.js'
|
5 | import type { BaseInput } from './types.js'
|
6 |
|
7 | export type URLInput = URL | string
|
8 |
|
9 | export interface NetworkRequestInput extends BaseInput {
|
10 | url: URLInput
|
11 | headers?: HeadersInit
|
12 | }
|
13 |
|
14 | export type NetworkRequest = (input: NetworkRequestInput) => Promise<ExecutionResult>
|
15 |
|
16 |
|
17 |
|
18 |
|
19 | export 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 | }
|