157 lines
4.7 KiB
JavaScript
157 lines
4.7 KiB
JavaScript
|
|
import DOMException from '../exception/DOMException.js';
|
||
|
|
import * as PropertySymbol from '../PropertySymbol.js';
|
||
|
|
import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js';
|
||
|
|
/**
|
||
|
|
* Fetch headers.
|
||
|
|
*
|
||
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/Headers
|
||
|
|
*/
|
||
|
|
export default class Headers {
|
||
|
|
[PropertySymbol.entries] = {};
|
||
|
|
/**
|
||
|
|
* Constructor.
|
||
|
|
*
|
||
|
|
* @param init Headers init.
|
||
|
|
*/
|
||
|
|
constructor(init) {
|
||
|
|
if (init) {
|
||
|
|
if (init instanceof Headers) {
|
||
|
|
this[PropertySymbol.entries] = JSON.parse(JSON.stringify(init[PropertySymbol.entries]));
|
||
|
|
}
|
||
|
|
else if (Array.isArray(init)) {
|
||
|
|
for (const entry of init) {
|
||
|
|
if (entry.length !== 2) {
|
||
|
|
throw new DOMException('Failed to construct "Headers": The provided init is not a valid array.', DOMExceptionNameEnum.invalidStateError);
|
||
|
|
}
|
||
|
|
this.append(entry[0], entry[1]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
for (const name of Object.keys(init)) {
|
||
|
|
this.set(name, init[name]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Appends a new value onto an existing header inside a Headers object, or adds the header if it does not already exist.
|
||
|
|
*
|
||
|
|
* @param name Name.
|
||
|
|
* @param value Value.
|
||
|
|
*/
|
||
|
|
append(name, value) {
|
||
|
|
const lowerName = name.toLowerCase();
|
||
|
|
if (this[PropertySymbol.entries][lowerName]) {
|
||
|
|
this[PropertySymbol.entries][lowerName].value.push(value);
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
this[PropertySymbol.entries][lowerName] = {
|
||
|
|
name,
|
||
|
|
value: [value]
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Removes an header.
|
||
|
|
*
|
||
|
|
* @param name Name.
|
||
|
|
*/
|
||
|
|
delete(name) {
|
||
|
|
delete this[PropertySymbol.entries][name.toLowerCase()];
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Returns header value.
|
||
|
|
*
|
||
|
|
* @param name Name.
|
||
|
|
* @returns Value.
|
||
|
|
*/
|
||
|
|
get(name) {
|
||
|
|
return this[PropertySymbol.entries][name.toLowerCase()]?.value.join(', ') ?? null;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Sets a new value for an existing header inside a Headers object, or adds the header if it does not already exist.
|
||
|
|
*
|
||
|
|
* @param name Name.
|
||
|
|
* @param value Value.
|
||
|
|
*/
|
||
|
|
set(name, value) {
|
||
|
|
this[PropertySymbol.entries][name.toLowerCase()] = {
|
||
|
|
name,
|
||
|
|
value: [value]
|
||
|
|
};
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Returns an array containing the values of all Set-Cookie headers associated with a response.
|
||
|
|
*
|
||
|
|
* @returns An array of strings representing the values of all the different Set-Cookie headers.
|
||
|
|
*/
|
||
|
|
getSetCookie() {
|
||
|
|
const entry = this[PropertySymbol.entries]['set-cookie'];
|
||
|
|
if (!entry) {
|
||
|
|
return [];
|
||
|
|
}
|
||
|
|
return entry.value;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Returns whether an Headers object contains a certain key.
|
||
|
|
*
|
||
|
|
* @param name Name.
|
||
|
|
* @returns "true" if the Headers object contains the key.
|
||
|
|
*/
|
||
|
|
has(name) {
|
||
|
|
return !!this[PropertySymbol.entries][name.toLowerCase()];
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Executes a callback function once per each key/value pair in the Headers object.
|
||
|
|
*
|
||
|
|
* @param callback Callback.
|
||
|
|
* @param thisArg thisArg.
|
||
|
|
*/
|
||
|
|
forEach(callback, thisArg) {
|
||
|
|
const thisArgValue = thisArg ?? this[PropertySymbol.window];
|
||
|
|
for (const header of Object.values(this[PropertySymbol.entries])) {
|
||
|
|
callback.call(thisArgValue, header.value.join(', '), header.name, this);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Returns an iterator, allowing you to go through all keys of the key/value pairs contained in this object.
|
||
|
|
*
|
||
|
|
* @returns Iterator.
|
||
|
|
*/
|
||
|
|
*keys() {
|
||
|
|
for (const header of Object.values(this[PropertySymbol.entries])) {
|
||
|
|
yield header.name;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Returns an iterator, allowing you to go through all values of the key/value pairs contained in this object.
|
||
|
|
*
|
||
|
|
* @returns Iterator.
|
||
|
|
*/
|
||
|
|
*values() {
|
||
|
|
for (const header of Object.values(this[PropertySymbol.entries])) {
|
||
|
|
yield header.value.join(', ');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Returns an iterator, allowing you to go through all key/value pairs contained in this object.
|
||
|
|
*
|
||
|
|
* @returns Iterator.
|
||
|
|
*/
|
||
|
|
*entries() {
|
||
|
|
for (const header of Object.values(this[PropertySymbol.entries])) {
|
||
|
|
yield [header.name, header.value.join(', ')];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Iterator.
|
||
|
|
*
|
||
|
|
* @returns Iterator.
|
||
|
|
*/
|
||
|
|
*[Symbol.iterator]() {
|
||
|
|
for (const header of Object.values(this[PropertySymbol.entries])) {
|
||
|
|
yield [header.name, header.value.join(', ')];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=Headers.js.map
|