UNPKG

maplibre-gl

Version:

BSD licensed community fork of mapbox-gl, a WebGL interactive maps library

60 lines (47 loc) 1.69 kB
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}`; }