scratch-storage/src/scratchFetch.js

62 lines
1.8 KiB
JavaScript
Raw Normal View History

const {fetch, Headers} = require('cross-fetch');
/**
* Metadata header names
* @enum {string}
* @readonly
*/
const RequestMetadata = {
/** The ID of the project associated with this request */
ProjectId: 'X-ProjectId',
/** The ID of the project run associated with this request */
RunId: 'X-RunId'
};
/**
* Metadata for requests
* @type {Map<string, string>}
*/
const metadata = new Map();
/**
* Make a network request.
* This will be a wrapper for the global fetch method, adding some Scratch-specific functionality.
* @param {RequestInfo|URL} resource The resource to fetch.
* @param {RequestInit} [options] Optional object containing custom settings for this request.
* @see {@link https://developer.mozilla.org/docs/Web/API/fetch} for more about the fetch API.
* @returns {Promise<Response>} A promise for the response to the request.
*/
const scratchFetch = (resource, options) => {
let augmentedOptions;
if (metadata.size > 0) {
augmentedOptions = Object.assign({}, options);
augmentedOptions.headers = new Headers(Array.from(metadata));
if (options?.headers) {
const overrideHeaders =
options.headers instanceof Headers ? options.headers : new Headers(options.headers);
for (const [name, value] of overrideHeaders.entries()) {
augmentedOptions.headers.set(name, value);
}
}
} else {
augmentedOptions = options;
}
return fetch(resource, augmentedOptions);
};
/**
*
* @param {RequestMetadata} name The name of the metadata item to set.
* @param {any} value The value to set (will be converted to a string)
*/
const setMetadata = (name, value) => {
metadata.set(name, value);
};
module.exports = {
RequestMetadata,
default: scratchFetch,
scratchFetch,
setMetadata
};