@fly/cdn
Version:
Fly's TypeScript CDN
46 lines • 4.57 kB
JavaScript
/**
* A library for composing `fetch` generators into a single pipeline.
*
* @preferred
* @module HTTP
*/
/**
* Combine multiple fetches into a single function. Allows middleware type functionality
*
* Example:
*
* ```javascript
* import { pipeline } from "@fly/fetch/pipeline"
*
* const addHeader = function(fetch){
* return function(req, init){
* if(typeof req === "string") req = new Request(req, init)
* req.headers.set("Superfly-Header", "shazam")
* return fetch(req, init)
* }
* }
*
* const p = pipeline(fetch, addHeader)
*
* fly.http.respondWith(p)
*
* @param stages fetch generator functions that apply additional logic
* @returns a combinedfunction that can be used anywhere that wants `fetch`
*/
export function pipeline(...stages) {
/**
* @param fetch the "origin" fetch function to call at the end of the pipeline
*/
function pipelineFetch(fetch) {
for (let i = stages.length - 1; i >= 0; i--) {
const s = stages[i];
const fn = typeof s === "function" ? s : s[0];
const opts = s instanceof Array ? s[1] : [];
fetch = fn(fetch, opts);
}
return Object.assign(fetch, { stages });
}
return Object.assign(pipelineFetch, { stages });
}
export default pipeline;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFVSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBRyxNQUF1QjtJQUNqRDs7T0FFRztJQUNILFNBQVMsYUFBYSxDQUFDLEtBQW9CO1FBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDbkIsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM3QyxNQUFNLElBQUksR0FBRyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUMzQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtTQUN4QjtRQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtBQUNqRCxDQUFDO0FBRUQsZUFBZSxRQUFRLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgbGlicmFyeSBmb3IgY29tcG9zaW5nIGBmZXRjaGAgZ2VuZXJhdG9ycyBpbnRvIGEgc2luZ2xlIHBpcGVsaW5lLlxuICpcbiAqIEBwcmVmZXJyZWRcbiAqIEBtb2R1bGUgSFRUUFxuICovXG5cbmltcG9ydCB7IEZldGNoR2VuZXJhdG9yLCBGZXRjaEZ1bmN0aW9uIH0gZnJvbSBcIi4vZmV0Y2hcIlxuXG4vKipcbiAqIFBpcGVwbGluZVN0YWdlIGNhbiBlaXRoZXIgYmUgYSBGZXRjaEdlbmVyYXRvciBmdW5jdGlvbiwgb3IgYSB0dXBsZSBvZlxuICogRmV0Y2hHZW5lcmF0b3IgKyBhcmdzLlxuICovXG5leHBvcnQgdHlwZSBQaXBlbGluZVN0YWdlID0gRmV0Y2hHZW5lcmF0b3IgfCBbRmV0Y2hHZW5lcmF0b3IsIGFueVtdXVxuXG4vKipcbiAqIENvbWJpbmUgbXVsdGlwbGUgZmV0Y2hlcyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uLiBBbGxvd3MgbWlkZGxld2FyZSB0eXBlIGZ1bmN0aW9uYWxpdHlcbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGltcG9ydCB7IHBpcGVsaW5lIH0gZnJvbSBcIkBmbHkvZmV0Y2gvcGlwZWxpbmVcIlxuICpcbiAqIGNvbnN0IGFkZEhlYWRlciA9IGZ1bmN0aW9uKGZldGNoKXtcbiAqICAgcmV0dXJuIGZ1bmN0aW9uKHJlcSwgaW5pdCl7XG4gKiAgICAgaWYodHlwZW9mIHJlcSA9PT0gXCJzdHJpbmdcIikgcmVxID0gbmV3IFJlcXVlc3QocmVxLCBpbml0KVxuICogICAgIHJlcS5oZWFkZXJzLnNldChcIlN1cGVyZmx5LUhlYWRlclwiLCBcInNoYXphbVwiKVxuICogICAgIHJldHVybiBmZXRjaChyZXEsIGluaXQpXG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBwID0gcGlwZWxpbmUoZmV0Y2gsIGFkZEhlYWRlcilcbiAqXG4gKiBmbHkuaHR0cC5yZXNwb25kV2l0aChwKVxuICpcbiAqIEBwYXJhbSBzdGFnZXMgZmV0Y2ggZ2VuZXJhdG9yIGZ1bmN0aW9ucyB0aGF0IGFwcGx5IGFkZGl0aW9uYWwgbG9naWNcbiAqIEByZXR1cm5zIGEgY29tYmluZWRmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFueXdoZXJlIHRoYXQgd2FudHMgYGZldGNoYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGlwZWxpbmUoLi4uc3RhZ2VzOiBQaXBlbGluZVN0YWdlW10pIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBmZXRjaCB0aGUgXCJvcmlnaW5cIiBmZXRjaCBmdW5jdGlvbiB0byBjYWxsIGF0IHRoZSBlbmQgb2YgdGhlIHBpcGVsaW5lXG4gICAqL1xuICBmdW5jdGlvbiBwaXBlbGluZUZldGNoKGZldGNoOiBGZXRjaEZ1bmN0aW9uKSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgcyA9IHN0YWdlc1tpXVxuICAgICAgY29uc3QgZm4gPSB0eXBlb2YgcyA9PT0gXCJmdW5jdGlvblwiID8gcyA6IHNbMF1cbiAgICAgIGNvbnN0IG9wdHMgPSBzIGluc3RhbmNlb2YgQXJyYXkgPyBzWzFdIDogW11cbiAgICAgIGZldGNoID0gZm4oZmV0Y2gsIG9wdHMpXG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGZldGNoLCB7IHN0YWdlcyB9KVxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocGlwZWxpbmVGZXRjaCwgeyBzdGFnZXMgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgcGlwZWxpbmVcbiJdfQ==