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