2025-04-02 06:50:39 -04:00

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);
}
};