maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
49 lines (46 loc) • 2.02 kB
text/typescript
import {AddProtocolAction, config} from '../util/config';
export function getProtocol(url: string) {
return config.REGISTERED_PROTOCOLS[url.substring(0, url.indexOf('://'))];
}
/**
* Adds a custom load resource function that will be called when using a URL that starts with a custom url schema.
* This will happen in the main thread, and workers might call it if they don't know how to handle the protocol.
* The example below will be triggered for custom:// urls defined in the sources list in the style definitions.
* The function passed will receive the request parameters and should return with the resulting resource,
* for example a pbf vector tile, non-compressed, represented as ArrayBuffer.
*
* @param customProtocol - the protocol to hook, for example 'custom'
* @param loadFn - the function to use when trying to fetch a tile specified by the customProtocol
* @example
* ```ts
* // This will fetch a file using the fetch API (this is obviously a non interesting example...)
* addProtocol('custom', async (params, abortController) => {
* const t = await fetch(`https://${params.url.split("://")[1]}`);
* if (t.status == 200) {
* const buffer = await t.arrayBuffer();
* return {data: buffer}
* } else {
* throw new Error(`Tile fetch error: ${t.statusText}`);
* }
* });
* // the following is an example of a way to return an error when trying to load a tile
* addProtocol('custom2', async (params, abortController) => {
* throw new Error('someErrorMessage'));
* });
* ```
*/
export function addProtocol(customProtocol: string, loadFn: AddProtocolAction) {
config.REGISTERED_PROTOCOLS[customProtocol] = loadFn;
}
/**
* Removes a previously added protocol in the main thread.
*
* @param customProtocol - the custom protocol to remove registration for
* @example
* ```ts
* removeProtocol('custom');
* ```
*/
export function removeProtocol(customProtocol: string) {
delete config.REGISTERED_PROTOCOLS[customProtocol];
}