UNPKG

@graphql-mesh/plugin-http2

Version:
65 lines (64 loc) 2.35 kB
/* eslint-disable import/no-nodejs-modules */ import { connect } from 'http2'; import { Readable } from 'stream'; import { getHeadersObj } from '@graphql-mesh/utils'; import { Response } from '@whatwg-node/fetch'; export default function useHTTP2(opts) { const sessionsByOrigin = new Map(); function getSessionByOrigin(origin) { let session = sessionsByOrigin.get(origin); if (!session) { session = connect(origin); sessionsByOrigin.set(origin, session); } return session; } opts.pubsub.subscribe('destroy', () => { for (const [, session] of sessionsByOrigin) { session.destroy(); } }); return { onFetch({ url, setFetchFn }) { const parsedUrl = new URL(url); const origin = parsedUrl.origin; if (opts.origins && !opts.origins.includes(origin)) { return; } setFetchFn(function fetchForOrigin(_url, options) { const session = getSessionByOrigin(origin); const stream = session.request({ ...getHeadersObj(options.headers), ':method': options.method, ':path': parsedUrl.pathname + parsedUrl.search, }, { signal: options.signal, }); if (options.body) { Readable.from(options.body).pipe(stream); } else { stream.end(); } return new Promise(resolve => { let status = 200; const responseHeaders = {}; stream.once('response', headers => { for (const key in headers) { if (key === ':status') { status = headers[key]; } else { responseHeaders[key] = headers[key]; } } resolve(new Response(stream, { headers: responseHeaders, status, })); }); }); }); }, }; }