OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-booking / node_modules / bare-fetch / lib / headers.js

98 lines · javascript ref:
// https://fetch.spec.whatwg.org/#headers-class
module.exports = class Headers {
  // https://fetch.spec.whatwg.org/#dom-headers
  constructor(init) {
    this._headers = new Map()

    if (init) {
      for (const [key, value] of typeof init[Symbol.iterator] === 'function'
        ? init
        : Object.entries(init)) {
        this.append(key, value)
      }
    }
  }

  // https://fetch.spec.whatwg.org/#dom-headers-append
  append(name, value) {
    name = name.toLowerCase()
    value = value.trim()

    let list = this._headers.get(name)

    if (list === undefined) {
      list = []
      this._headers.set(name, list)
    }

    list.push(value)
  }

  // https://fetch.spec.whatwg.org/#dom-headers-delete
  delete(name) {
    name = name.toLowerCase()

    this._headers.delete(name)
  }

  // https://fetch.spec.whatwg.org/#dom-headers-get
  get(name) {
    name = name.toLowerCase()

    const list = this._headers.get(name)

    if (list === undefined) return null

    return list.join(', ')
  }

  // https://fetch.spec.whatwg.org/#dom-headers-has
  has(name) {
    name = name.toLowerCase()

    return this._headers.has(name)
  }

  // https://fetch.spec.whatwg.org/#dom-headers-set
  set(name, value) {
    name = name.toLowerCase()
    value = value.trim()

    this._headers.set(name, [value])
  }

  // https://webidl.spec.whatwg.org/#idl-iterable
  entries() {
    return this[Symbol.iterator]()
  }

  // https://webidl.spec.whatwg.org/#idl-iterable
  *keys() {
    for (const [name] of this) {
      yield name
    }
  }

  // https://webidl.spec.whatwg.org/#idl-iterable
  *values() {
    for (const [, value] of this) {
      yield value
    }
  }

  // https://webidl.spec.whatwg.org/#idl-iterable
  forEach(callback, thisArg) {
    for (const [name, value] of this) {
      callback.call(thisArg, value, name, this)
    }
  }

  *[Symbol.iterator]() {
    const names = [...this._headers.keys()].sort()

    for (const name of names) {
      yield [name, this.get(name)]
    }
  }
}