maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
60 lines (47 loc) • 1.69 kB
text/typescript
import {IResourceType} from './ajax';
import type {RequestParameters} from './ajax';
type ResourceTypeEnum = keyof IResourceType;
export type RequestTransformFunction = (url: string, resourceType?: ResourceTypeEnum) => RequestParameters;
type UrlObject = {
protocol: string;
authority: string;
path: string;
params: Array<string>;
};
export class RequestManager {
_transformRequestFn: RequestTransformFunction;
constructor(transformRequestFn?: RequestTransformFunction) {
this._transformRequestFn = transformRequestFn;
}
transformRequest(url: string, type: ResourceTypeEnum) {
if (this._transformRequestFn) {
return this._transformRequestFn(url, type) || {url};
}
return {url};
}
normalizeSpriteURL(url: string, format: string, extension: string): string {
const urlObject = parseUrl(url);
urlObject.path += `${format}${extension}`;
return formatUrl(urlObject);
}
setTransformRequest(transformRequest: RequestTransformFunction) {
this._transformRequestFn = transformRequest;
}
}
const urlRe = /^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/;
function parseUrl(url: string): UrlObject {
const parts = url.match(urlRe);
if (!parts) {
throw new Error(`Unable to parse URL "${url}"`);
}
return {
protocol: parts[1],
authority: parts[2],
path: parts[3] || '/',
params: parts[4] ? parts[4].split('&') : []
};
}
function formatUrl(obj: UrlObject): string {
const params = obj.params.length ? `?${obj.params.join('&')}` : '';
return `${obj.protocol}://${obj.authority}${obj.path}${params}`;
}