@ 261107.5
current
'use strict'

const assert = require('node:assert')

/**
 * @deprecated
 */
module.exports = class DecoratorHandler {
  #handler
  #onCompleteCalled = false
  #onErrorCalled = false
  #onResponseStartCalled = false

  constructor (handler) {
    if (typeof handler !== 'object' || handler === null) {
      throw new TypeError('handler must be an object')
    }
    this.#handler = handler
  }

  onRequestStart (...args) {
    this.#handler.onRequestStart?.(...args)
  }

  onRequestUpgrade (...args) {
    assert(!this.#onCompleteCalled)
    assert(!this.#onErrorCalled)

    return this.#handler.onRequestUpgrade?.(...args)
  }

  onResponseStart (...args) {
    assert(!this.#onCompleteCalled)
    assert(!this.#onErrorCalled)

    // Interim 1xx responses (e.g. 103 Early Hints) come before the final one.
    const statusCode = args[1]
    if (statusCode >= 200) {
      assert(!this.#onResponseStartCalled)
      this.#onResponseStartCalled = true
    }

    return this.#handler.onResponseStart?.(...args)
  }

  onResponseData (...args) {
    assert(!this.#onCompleteCalled)
    assert(!this.#onErrorCalled)

    return this.#handler.onResponseData?.(...args)
  }

  onResponseEnd (...args) {
    assert(!this.#onCompleteCalled)
    assert(!this.#onErrorCalled)

    this.#onCompleteCalled = true
    return this.#handler.onResponseEnd?.(...args)
  }

  onResponseError (...args) {
    this.#onErrorCalled = true
    return this.#handler.onResponseError?.(...args)
  }

  /**
   * @deprecated
   */
  onBodySent (...args) {
    return this.#handler.onBodySent?.(...args)
  }

  onRequestSent (...args) {
    return this.#handler.onRequestSent?.(...args)
  }
}