@curveball/core
Version:
Curveball is a framework writting in Typescript for Node.js
45 lines • 1.3 kB
JavaScript
import * as http2 from 'node:http2';
import { sendBody } from './http-utils.js';
/**
* This is a utility for helping with HTTP/2 Push for node servers.
*/
export default async function push(stream, pushCtx) {
const requestHeaders = {
':path': pushCtx.request.requestTarget,
...pushCtx.request.headers.getAll(),
};
let pushStream;
try {
pushStream = await getPushStream(stream, requestHeaders);
}
catch (err) {
if (err.code === 'ERR_HTTP2_PUSH_DISABLED') {
// HTTP/2 disabled pusing after all
return;
}
throw err;
}
pushStream.on('error', err => {
const isRefusedStream = pushStream.rstCode === http2.constants.NGHTTP2_REFUSED_STREAM;
if (!isRefusedStream) {
throw err;
}
});
pushStream.respond({
':status': 200,
...pushCtx.response.headers.getAll(),
});
sendBody(pushStream, pushCtx.response.body);
}
function getPushStream(stream, requestHeaders) {
return new Promise((res, rej) => {
stream.pushStream(requestHeaders, (err, pushStream) => {
if (err) {
rej(err);
return;
}
res(pushStream);
});
});
}
//# sourceMappingURL=push.js.map