117 lines
2.6 KiB
JavaScript
117 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
const { InvalidArgumentError } = require('../core/errors');
|
|
|
|
module.exports = class WrapHandler {
|
|
#handler;
|
|
|
|
constructor(handler) {
|
|
this.#handler = handler;
|
|
}
|
|
|
|
static wrap(handler) {
|
|
// TODO (fix): More checks...
|
|
return handler.onRequestStart ? handler : new WrapHandler(handler);
|
|
}
|
|
|
|
// Unwrap Interface
|
|
|
|
onConnect(abort, context) {
|
|
return this.#handler.onConnect?.(abort, context);
|
|
}
|
|
|
|
onHeaders(statusCode, rawHeaders, resume, statusMessage) {
|
|
return this.#handler.onHeaders?.(
|
|
statusCode,
|
|
rawHeaders,
|
|
resume,
|
|
statusMessage
|
|
);
|
|
}
|
|
|
|
onUpgrade(statusCode, rawHeaders, socket) {
|
|
return this.#handler.onUpgrade?.(statusCode, rawHeaders, socket);
|
|
}
|
|
|
|
onData(data) {
|
|
return this.#handler.onData?.(data);
|
|
}
|
|
|
|
onComplete(trailers) {
|
|
return this.#handler.onComplete?.(trailers);
|
|
}
|
|
|
|
onError(err) {
|
|
if (!this.#handler.onError) {
|
|
throw err;
|
|
}
|
|
|
|
return this.#handler.onError?.(err);
|
|
}
|
|
|
|
// Wrap Interface
|
|
|
|
onRequestStart(controller, context) {
|
|
this.#handler.onConnect?.((reason) => controller.abort(reason), context);
|
|
}
|
|
|
|
onRequestUpgrade(controller, statusCode, headers, socket) {
|
|
const rawHeaders = [];
|
|
for (const [key, val] of Object.entries(headers)) {
|
|
rawHeaders.push(
|
|
Buffer.from(key),
|
|
Array.isArray(val) ? val.map((v) => Buffer.from(v)) : Buffer.from(val)
|
|
);
|
|
}
|
|
|
|
this.#handler.onUpgrade?.(statusCode, rawHeaders, socket);
|
|
}
|
|
|
|
onResponseStart(controller, statusCode, headers, statusMessage) {
|
|
const rawHeaders = [];
|
|
for (const [key, val] of Object.entries(headers)) {
|
|
rawHeaders.push(
|
|
Buffer.from(key),
|
|
Array.isArray(val) ? val.map((v) => Buffer.from(v)) : Buffer.from(val)
|
|
);
|
|
}
|
|
|
|
if (
|
|
this.#handler.onHeaders?.(
|
|
statusCode,
|
|
rawHeaders,
|
|
() => controller.resume(),
|
|
statusMessage
|
|
) === false
|
|
) {
|
|
controller.pause();
|
|
}
|
|
}
|
|
|
|
onResponseData(controller, data) {
|
|
if (this.#handler.onData?.(data) === false) {
|
|
controller.pause();
|
|
}
|
|
}
|
|
|
|
onResponseEnd(controller, trailers) {
|
|
const rawTrailers = [];
|
|
for (const [key, val] of Object.entries(trailers)) {
|
|
rawTrailers.push(
|
|
Buffer.from(key),
|
|
Array.isArray(val) ? val.map((v) => Buffer.from(v)) : Buffer.from(val)
|
|
);
|
|
}
|
|
|
|
this.#handler.onComplete?.(rawTrailers);
|
|
}
|
|
|
|
onResponseError(controller, err) {
|
|
if (!this.#handler.onError) {
|
|
throw new InvalidArgumentError('invalid onError method');
|
|
}
|
|
|
|
this.#handler.onError?.(err);
|
|
}
|
|
};
|