@graphql-mesh/plugin-http2
Version:
64 lines (63 loc) • 2.33 kB
JavaScript
/* eslint-disable import/no-nodejs-modules */
import { connect } from 'http2';
import { Readable } from 'stream';
import { createLruCache, getHeadersObj } from '@graphql-mesh/utils';
import { Response } from '@whatwg-node/fetch';
export default function useHTTP2(opts) {
const sessionsByOrigin = createLruCache();
function getSessionByOrigin(origin) {
let session = sessionsByOrigin.get(origin);
if (!session) {
session = connect(origin);
sessionsByOrigin.set(origin, session);
}
return session;
}
opts.pubsub.subscribe('destroy', () => {
sessionsByOrigin.keys().forEach(origin => {
const session = sessionsByOrigin.get(origin);
if (session) {
session.destroy();
}
});
});
return {
onFetch({ setFetchFn }) {
setFetchFn(function fetchForOrigin(url, options) {
const { origin, pathname, search } = new URL(url);
const session = getSessionByOrigin(origin);
const stream = session.request({
...getHeadersObj(options.headers),
':method': options.method,
':path': pathname + 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,
}));
});
});
});
},
};
}