@graphql-tools/executor-http
Advanced tools
Comparing version 1.1.10-alpha-044f5b01c885b5aef4597f47f31ad13207501692 to 1.1.10-alpha-05a2ebb7309cae7592b0996b5970b39316c3f381
# @graphql-tools/executor-http | ||
## 1.1.10-alpha-044f5b01c885b5aef4597f47f31ad13207501692 | ||
## 1.1.10-alpha-05a2ebb7309cae7592b0996b5970b39316c3f381 | ||
### Patch Changes | ||
- [#98](https://github.com/graphql-hive/gateway/pull/98) [`3290cdd`](https://github.com/graphql-hive/gateway/commit/3290cdd564ea51739556154472c01ac921f2f91d) Thanks [@ardatan](https://github.com/ardatan)! - Bun support by using native Bun API whenever possible | ||
- [#164](https://github.com/graphql-hive/gateway/pull/164) [`310613d`](https://github.com/graphql-hive/gateway/commit/310613d68d1df3e2bceafbd0730084a4c83527bf) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates: | ||
- Updated dependency [`@graphql-tools/utils@^10.6.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.0) (from `^10.5.6`, in `dependencies`) | ||
- [#180](https://github.com/graphql-hive/gateway/pull/180) [`1f354c5`](https://github.com/graphql-hive/gateway/commit/1f354c5fb9fbbedfa816ab8458016525d79ac121) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates: | ||
- Added dependency [`@whatwg-node/disposablestack@^0.0.5` ↗︎](https://www.npmjs.com/package/@whatwg-node/disposablestack/v/0.0.5) (to `dependencies`) | ||
- [#180](https://github.com/graphql-hive/gateway/pull/180) [`40ce24c`](https://github.com/graphql-hive/gateway/commit/40ce24cd059ef5adc137371beae74d74de3d4567) Thanks [@ardatan](https://github.com/ardatan)! - Use new explicit resource management internally | ||
- [#98](https://github.com/graphql-hive/gateway/pull/98) [`697308d`](https://github.com/graphql-hive/gateway/commit/697308df3b2dd96f28dc65a5f5361a911077e022) Thanks [@ardatan](https://github.com/ardatan)! - Bun support by using native Bun API whenever possible | ||
## 1.1.9 | ||
@@ -10,0 +20,0 @@ |
@@ -1,2 +0,2 @@ | ||
import { ExecutionRequest, DisposableSyncExecutor, SyncExecutor, DisposableAsyncExecutor, AsyncExecutor } from '@graphql-tools/utils'; | ||
import { ExecutionRequest, DisposableSyncExecutor, DisposableAsyncExecutor } from '@graphql-tools/utils'; | ||
import { OperationDefinitionNode, GraphQLResolveInfo, DocumentNode } from 'graphql'; | ||
@@ -59,4 +59,3 @@ | ||
/** | ||
* Enable [Explicit Resource Management](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management) | ||
* @default false | ||
* @deprecated Not used anymore | ||
*/ | ||
@@ -66,43 +65,13 @@ disposable?: boolean; | ||
type HeadersConfig = Record<string, string>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch' | 'disposable'> & { | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch'> & { | ||
fetch: SyncFetchFn; | ||
disposable: true; | ||
}): DisposableSyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch' | 'disposable'> & { | ||
fetch: SyncFetchFn; | ||
disposable: false; | ||
}): SyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch'> & { | ||
fetch: SyncFetchFn; | ||
}): SyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch' | 'disposable'> & { | ||
fetch: AsyncFetchFn; | ||
disposable: true; | ||
}): DisposableAsyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch' | 'disposable'> & { | ||
fetch: AsyncFetchFn; | ||
disposable: false; | ||
}): AsyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch'> & { | ||
fetch: AsyncFetchFn; | ||
}): AsyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch' | 'disposable'> & { | ||
fetch: RegularFetchFn; | ||
disposable: true; | ||
}): DisposableAsyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch' | 'disposable'> & { | ||
fetch: RegularFetchFn; | ||
disposable: false; | ||
}): AsyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch'> & { | ||
fetch: RegularFetchFn; | ||
}): AsyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch' | 'disposable'> & { | ||
disposable: true; | ||
}): DisposableAsyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch' | 'disposable'> & { | ||
disposable: false; | ||
}): AsyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch'>): AsyncExecutor<any, HTTPExecutorOptions>; | ||
declare function buildHTTPExecutor(options?: Omit<HTTPExecutorOptions, 'fetch'>): DisposableAsyncExecutor<any, HTTPExecutorOptions>; | ||
export { type AsyncFetchFn, type AsyncImportFn, type FetchFn, type HTTPExecutorOptions, type HeadersConfig, type RegularFetchFn, type SyncFetchFn, type SyncImportFn, type SyncResponse, buildHTTPExecutor, isLiveQueryOperationDefinitionNode }; |
@@ -1,2 +0,3 @@ | ||
import { isAsyncIterable, isPromise, inspect, mapAsyncIterator, mergeIncrementalResult, memoize1, getOperationASTFromRequest, createGraphQLError } from '@graphql-tools/utils'; | ||
import { isAsyncIterable, isPromise, fakePromise, createGraphQLError, inspect, mapAsyncIterator, mergeIncrementalResult, memoize1, getOperationASTFromRequest } from '@graphql-tools/utils'; | ||
import { DisposableSymbols } from '@whatwg-node/disposablestack'; | ||
import { File, FormData, TextDecoder, fetch } from '@whatwg-node/fetch'; | ||
@@ -73,3 +74,3 @@ import { ValueOrPromise } from 'value-or-promise'; | ||
const chunks = []; | ||
return Promise.resolve().then(async () => { | ||
return fakePromise(void 0).then(async () => { | ||
for await (const chunk of stream) { | ||
@@ -112,2 +113,16 @@ if (chunk) { | ||
function createAbortErrorReason() { | ||
return new Error("Executor was disposed."); | ||
} | ||
function createGraphQLErrorForAbort(reason, extensions) { | ||
return createGraphQLError("The operation was aborted. reason: " + reason, { | ||
extensions | ||
}); | ||
} | ||
function createResultForAbort(reason, extensions) { | ||
return { | ||
errors: [createGraphQLErrorForAbort(reason, extensions)] | ||
}; | ||
} | ||
const DELIM = "\n\n"; | ||
@@ -117,3 +132,3 @@ function isReadableStream(value) { | ||
} | ||
function handleEventStreamResponse(response) { | ||
function handleEventStreamResponse(signal, response) { | ||
const body = response.body; | ||
@@ -134,2 +149,6 @@ if (!isReadableStream(body)) { | ||
async function pump() { | ||
if (signal.aborted) { | ||
await push(createResultForAbort(signal)); | ||
return stop(); | ||
} | ||
if (!body?.locked) { | ||
@@ -234,8 +253,25 @@ return stop(); | ||
function createSignalWrapper(signal) { | ||
const listeners = /* @__PURE__ */ new Set(); | ||
signal.onabort = (event) => { | ||
for (const listener of listeners) { | ||
listener(event); | ||
} | ||
}; | ||
return Object.assign(signal, { | ||
addEventListener(_type, listener) { | ||
listeners.add(listener); | ||
}, | ||
removeEventListener(_type, listener) { | ||
listeners.delete(listener); | ||
} | ||
}); | ||
} | ||
function buildHTTPExecutor(options) { | ||
const printFn = options?.print ?? defaultPrintFn; | ||
let disposeCtrl; | ||
const disposeCtrl = new AbortController(); | ||
const sharedSignal = createSignalWrapper(disposeCtrl.signal); | ||
const baseExecutor = (request) => { | ||
if (disposeCtrl?.signal.aborted) { | ||
return createResultForAbort(disposeCtrl.signal); | ||
if (sharedSignal.aborted) { | ||
return createResultForAbort(sharedSignal.reason); | ||
} | ||
@@ -270,18 +306,8 @@ const fetchFn = request.extensions?.fetch ?? options?.fetch ?? fetch; | ||
const query = printFn(request.document); | ||
let signal = disposeCtrl?.signal; | ||
let clearTimeoutFn = () => { | ||
}; | ||
let signal = sharedSignal; | ||
if (options?.timeout) { | ||
const timeoutCtrl = new AbortController(); | ||
signal = timeoutCtrl.signal; | ||
disposeCtrl?.signal.addEventListener("abort", clearTimeoutFn); | ||
const timeoutId = setTimeout(() => { | ||
if (!timeoutCtrl.signal.aborted) { | ||
timeoutCtrl.abort("timeout"); | ||
} | ||
disposeCtrl?.signal.removeEventListener("abort", clearTimeoutFn); | ||
}, options.timeout); | ||
clearTimeoutFn = () => { | ||
clearTimeout(timeoutId); | ||
}; | ||
signal = AbortSignal.any([ | ||
sharedSignal, | ||
AbortSignal.timeout(options.timeout) | ||
]); | ||
} | ||
@@ -359,3 +385,2 @@ const upstreamErrorExtensions = { | ||
}); | ||
clearTimeoutFn(); | ||
if (options?.retry != null && !fetchResult.status.toString().startsWith("2")) { | ||
@@ -368,3 +393,3 @@ throw new Error( | ||
if (contentType?.includes("text/event-stream")) { | ||
return handleEventStreamResponse(fetchResult); | ||
return handleEventStreamResponse(signal, fetchResult); | ||
} else if (contentType?.includes("multipart/mixed")) { | ||
@@ -457,4 +482,4 @@ return handleMultipartMixedResponse(fetchResult); | ||
function retryAttempt() { | ||
if (disposeCtrl?.signal.aborted) { | ||
return createResultForAbort(disposeCtrl.signal); | ||
if (sharedSignal.aborted) { | ||
return createResultForAbort(sharedSignal.reason); | ||
} | ||
@@ -481,9 +506,4 @@ attempt++; | ||
} | ||
if (!options?.disposable) { | ||
disposeCtrl = void 0; | ||
return executor; | ||
} | ||
disposeCtrl = new AbortController(); | ||
Object.defineProperties(executor, { | ||
[Symbol.dispose]: { | ||
[DisposableSymbols.dispose]: { | ||
get() { | ||
@@ -495,3 +515,3 @@ return function dispose() { | ||
}, | ||
[Symbol.asyncDispose]: { | ||
[DisposableSymbols.asyncDispose]: { | ||
get() { | ||
@@ -522,4 +542,4 @@ return function asyncDispose() { | ||
}); | ||
} else if (e.name === "AbortError" && signal?.reason) { | ||
return createGraphQLErrorForAbort(signal, { | ||
} else if (e.name === "AbortError" && signal.reason) { | ||
return createGraphQLErrorForAbort(signal.reason, { | ||
extensions: upstreamErrorExtensions | ||
@@ -539,19 +559,3 @@ }); | ||
} | ||
function createAbortErrorReason() { | ||
return new Error("Executor was disposed."); | ||
} | ||
function createGraphQLErrorForAbort(signal, extensions) { | ||
return createGraphQLError( | ||
"The operation was aborted. reason: " + signal.reason, | ||
{ | ||
extensions | ||
} | ||
); | ||
} | ||
function createResultForAbort(signal, extensions) { | ||
return { | ||
errors: [createGraphQLErrorForAbort(signal, extensions)] | ||
}; | ||
} | ||
export { buildHTTPExecutor, isLiveQueryOperationDefinitionNode }; |
{ | ||
"name": "@graphql-tools/executor-http", | ||
"version": "1.1.10-alpha-044f5b01c885b5aef4597f47f31ad13207501692", | ||
"version": "1.1.10-alpha-05a2ebb7309cae7592b0996b5970b39316c3f381", | ||
"type": "module", | ||
@@ -42,4 +42,5 @@ "description": "A set of utils for faster development of GraphQL tools", | ||
"dependencies": { | ||
"@graphql-tools/utils": "^10.5.6", | ||
"@graphql-tools/utils": "^10.6.0", | ||
"@repeaterjs/repeater": "^3.0.4", | ||
"@whatwg-node/disposablestack": "^0.0.5", | ||
"@whatwg-node/fetch": "^0.10.0", | ||
@@ -46,0 +47,0 @@ "extract-files": "^11.0.0", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
5
60220
9
1150
+ Added@whatwg-node/disposablestack@0.0.5(transitive)
Updated@graphql-tools/utils@^10.6.0