libs/voicefocus/fetch.js (64 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isValidRevisionID = exports.isValidAssetGroup = exports.resolveURL = exports.addQueryParams = exports.withQueryString = exports.withRequestHeaders = exports.fetchWithBehavior = void 0;
function fetchWithBehavior(url, init, fetchBehavior) {
if (!fetchBehavior) {
return fetch(url, init);
}
const withQuery = withQueryString(url, fetchBehavior);
const withHeaders = withRequestHeaders(init, fetchBehavior);
return fetch(withQuery, withHeaders);
}
exports.fetchWithBehavior = fetchWithBehavior;
function withRequestHeaders(init, fetchBehavior) {
if (!(fetchBehavior === null || fetchBehavior === void 0 ? void 0 : fetchBehavior.headers)) {
return init;
}
if (!init) {
return {
headers: fetchBehavior.headers,
};
}
return Object.assign(Object.assign({}, init), { headers: Object.assign(Object.assign({}, init.headers || {}), fetchBehavior.headers) });
}
exports.withRequestHeaders = withRequestHeaders;
function withQueryString(url, fetchBehavior) {
if (!(fetchBehavior === null || fetchBehavior === void 0 ? void 0 : fetchBehavior.escapedQueryString)) {
return url;
}
const hasQuery = url.lastIndexOf('?') !== -1;
return `${url}${hasQuery ? '&' : '?'}${fetchBehavior.escapedQueryString}`;
}
exports.withQueryString = withQueryString;
function addQueryParams(fetchBehavior, queryParams) {
const keys = Object.keys(queryParams);
if (!keys.length) {
return fetchBehavior;
}
const params = new URLSearchParams(fetchBehavior === null || fetchBehavior === void 0 ? void 0 : fetchBehavior.escapedQueryString);
for (const key of keys) {
params.append(key, queryParams[key]);
}
return Object.assign(Object.assign({}, fetchBehavior), { escapedQueryString: params.toString() });
}
exports.addQueryParams = addQueryParams;
const HEAD_OPTIONS = {
method: 'HEAD',
mode: 'cors',
credentials: 'omit',
redirect: 'follow',
referrerPolicy: 'origin',
};
function resolveURL(url, fetchBehavior) {
return fetchWithBehavior(url, HEAD_OPTIONS, fetchBehavior)
.then(response => response.redirected ? response.url : url);
}
exports.resolveURL = resolveURL;
function isValidAssetGroup(assetGroup) {
return !!assetGroup && /^[-.a-zA-Z0-9]+$/.test(assetGroup);
}
exports.isValidAssetGroup = isValidAssetGroup;
function isValidRevisionID(revisionID) {
return !!revisionID && /^[123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ]{22}$/.test(revisionID);
}
exports.isValidRevisionID = isValidRevisionID;