UNPKG

@nextgis/ngw-connector

Version:

A lightweight HTTP client optimized for use with NextGIS Web API

1,549 lines (1,459 loc) 77.8 kB
/** Bundle of @nextgis/ngw-connector; version: 3.0.1; author: NextGIS */ var NgwConnector = (function () { 'use strict'; function defined(val) { return val !== void 0 && val !== null; } function full(val) { return typeof val === "string" ? !!val : defined(val); } function isEqual(a, b, o, p) { if (a instanceof Array) { if (!(b instanceof Array)) return false; return b.sort().join("") === a.sort().join(""); } else if (a instanceof Date) { if (!(b instanceof Date)) return false; return "" + a === "" + b; } else if (a instanceof Function) { if (!(b instanceof Function)) return false; } else if (a instanceof Object) { if (!(b instanceof Object)) return false; if (a === o) { return b === p; } else { return objectDeepEqual(a, b); } } return a === b; } function objectDeepEqual(o, p) { const keysO = Object.keys(o).sort(); const keysP = Object.keys(p).sort(); if (keysO.length !== keysP.length) return false; if (keysO.join("") !== keysP.join("")) return false; for (let i = 0; i < keysO.length; i++) { const oVal = o[keysO[i]]; const pVal = p[keysP[i]]; if (!isEqual(oVal, pVal, o, p)) { return false; } } return true; } function objectRemoveEmpty(obj) { const newObj = {}; Object.keys(obj).forEach((key) => { if (!(obj[key] instanceof Array) && obj[key] === Object(obj[key])) { newObj[key] = objectRemoveEmpty(obj[key]); } else if (obj[key] !== void 0) { newObj[key] = obj[key]; } }); return newObj; } function isObject$1(val) { return Object.prototype.toString.call(val) === "[object Object]"; } function fixUrlStr(url) { return url.replace(/([^:]\/)\/+/g, "$1"); } const templateRe = /\{ *([\w_-]+) *\}/g; function template(str, data) { return str.replace(templateRe, (s, key) => { let value = data[key]; if (value === void 0) { throw new Error("No value provided for letiable " + s); } else if (typeof value === "function") { value = value(data); } return value; }); } var __defProp$c = Object.defineProperty; var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols; var __hasOwnProp$4 = Object.prototype.hasOwnProperty; var __propIsEnum$4 = Object.prototype.propertyIsEnumerable; var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$4 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$4.call(b, prop)) __defNormalProp$c(a, prop, b[prop]); if (__getOwnPropSymbols$4) for (var prop of __getOwnPropSymbols$4(b)) { if (__propIsEnum$4.call(b, prop)) __defNormalProp$c(a, prop, b[prop]); } return a; }; var __async$4 = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; function apiRequest(opt) { return __async$4(this, null, function* () { const { params, name, connector, requestOptions } = opt; const apiItems = yield connector.connect(); let apiItem = apiItems && apiItems[name]; if (apiItem) { apiItem = [...apiItem]; let url = apiItem.shift(); if (apiItem.length) { const replaceParams = {}; for (let fry = 0; fry < apiItem.length; fry++) { const arg = apiItem[fry]; replaceParams[fry] = `{${arg}}`; if (params[arg] === void 0) { throw new Error(`\`${arg}\` URL API argument is not specified`); } } if (url) { url = template(url, replaceParams); } } if (params) { const paramArray = []; const paramList = params.paramList; if (Array.isArray(paramList)) { paramList.forEach(([key, value]) => { paramArray.push(`${key}=${value}`); }); } for (const p in params) { if (apiItem.indexOf(p) === -1) { paramArray.push(`${p}=${params[p]}`); } } if (paramArray.length) { url = `${url}?${paramArray.join("&")}`; } } if (url) { return connector.makeQuery(url, params, __spreadValues$4({ cacheName: name }, requestOptions)); } else { throw new Error("Request URL is not set"); } } else { return void 0; } }); } var __defProp$b = Object.defineProperty; var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField$9 = (obj, key, value) => __defNormalProp$b(obj, typeof key !== "symbol" ? key + "" : key, value); const _Cache = class _Cache { constructor(options = {}) { __publicField$9(this, "cache", []); var _a; const namespace = (_a = options.namespace) != null ? _a : "default"; if (_Cache.instance[namespace]) { return _Cache.instance[namespace]; } _Cache.instance[namespace] = this; return this; } clean() { this.cache.length = 0; } all() { return this.cache; } /** * Caching only a non-empty value. * * Useful for get or create strategy * @example * ```javascript * const cache = new Cache(); * const getItemFunc = () => fetch(url).then((data) => { * return data.json(); // undefined * }); * const item = await cache.addFull('foo', getItemFunc); * if (!item) { * await createItem(); // 'New item' * } * * // somewhere else in the code * const item = await cache.addFull('foo', getItemFunc).then((resp) => { * console.log(resp); // 'New item' * }); * ``` */ addFull(key, valueToSet, propsOrOptions, expirationTime) { if (typeof propsOrOptions === "object" && "valueToSet" in propsOrOptions) { propsOrOptions.onlyFull = true; } return this.add(key, valueToSet, propsOrOptions, true, expirationTime); } add(key, valueToSet, propsOrOptions, onlyFull, expirationTime) { let opt; let props; if (typeof propsOrOptions === "object" && "valueToSet" in propsOrOptions) { opt = propsOrOptions; onlyFull = opt.onlyFull; expirationTime = opt.expirationTime; props = opt.props; } else { props = propsOrOptions; } const exist = this._find(key, props); if (!exist) { let value; if (valueToSet instanceof Function) { value = valueToSet(); } else { value = valueToSet; } const nonEmptyProps = props && JSON.parse(JSON.stringify(objectRemoveEmpty(props))); expirationTime = expirationTime ? Date.now() + expirationTime : void 0; const cacheItem = { key, value, props: nonEmptyProps, expirationTime }; if (onlyFull && !full(value)) { return value; } this.cache.push(cacheItem); if (value instanceof Promise) { value.catch(() => { this.delete(key, props); }); if (onlyFull) { value.then((x) => { if (!full(x)) { this.delete(key, props); } return x; }); } return value; } return value; } else { return exist.value; } } match(key, props) { const cacheRecord = this._find(key, props); if (cacheRecord && cacheRecord.expirationTime && Date.now() > cacheRecord.expirationTime) { this.delete(cacheRecord); return void 0; } return cacheRecord == null ? void 0 : cacheRecord.value; } matchAll(key, props) { const now = Date.now(); this.cache.forEach((item) => { if (item.expirationTime && now > item.expirationTime) { this.delete(item); } }); if (key) { return this.cache.filter((x) => this._filter(x, key, props)).map((x) => x.value); } return this.cache.map((x) => x.value); } delete(keyOrItem, props) { const itemsToDelete = typeof keyOrItem === "string" ? this.cache.filter((x) => this._filter(x, keyOrItem, props)) : [keyOrItem]; for (const item of itemsToDelete) { const index = this.cache.indexOf(item); if (index !== -1) { this.cache.splice(index, 1); } } } _find(key, props) { return this.cache.find((x) => this._filter(x, key, props)); } _filter(item, key, props) { if (item.key !== key) return false; if (!props) return true; const itemProps = item.props; return objectDeepEqual(itemProps || {}, objectRemoveEmpty(props)); } }; __publicField$9(_Cache, "instance", {}); let Cache = _Cache; var domain; // This constructor is used to store event handlers. Instantiating this is // faster than explicitly calling `Object.create(null)` to get a "clean" empty // object (tested with v8 v4.9). function EventHandlers() {} EventHandlers.prototype = Object.create(null); function EventEmitter() { EventEmitter.init.call(this); } // nodejs oddity // require('events') === require('events').EventEmitter EventEmitter.EventEmitter = EventEmitter; EventEmitter.usingDomains = false; EventEmitter.prototype.domain = undefined; EventEmitter.prototype._events = undefined; EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are // added to it. This is a useful default which helps finding memory leaks. EventEmitter.defaultMaxListeners = 10; EventEmitter.init = function() { this.domain = null; if (EventEmitter.usingDomains) { // if there is an active domain, then attach to it. if (domain.active) ; } if (!this._events || this._events === Object.getPrototypeOf(this)._events) { this._events = new EventHandlers(); this._eventsCount = 0; } this._maxListeners = this._maxListeners || undefined; }; // Obviously not all Emitters should be limited to 10. This function allows // that to be increased. Set to zero for unlimited. EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { if (typeof n !== 'number' || n < 0 || isNaN(n)) throw new TypeError('"n" argument must be a positive number'); this._maxListeners = n; return this; }; function $getMaxListeners(that) { if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners; return that._maxListeners; } EventEmitter.prototype.getMaxListeners = function getMaxListeners() { return $getMaxListeners(this); }; // These standalone emit* functions are used to optimize calling of event // handlers for fast cases because emit() itself often has a variable number of // arguments and can be deoptimized because of that. These functions always have // the same number of arguments and thus do not get deoptimized, so the code // inside them can execute faster. function emitNone(handler, isFn, self) { if (isFn) handler.call(self); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self); } } function emitOne(handler, isFn, self, arg1) { if (isFn) handler.call(self, arg1); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self, arg1); } } function emitTwo(handler, isFn, self, arg1, arg2) { if (isFn) handler.call(self, arg1, arg2); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self, arg1, arg2); } } function emitThree(handler, isFn, self, arg1, arg2, arg3) { if (isFn) handler.call(self, arg1, arg2, arg3); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self, arg1, arg2, arg3); } } function emitMany(handler, isFn, self, args) { if (isFn) handler.apply(self, args); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].apply(self, args); } } EventEmitter.prototype.emit = function emit(type) { var er, handler, len, args, i, events, domain; var doError = (type === 'error'); events = this._events; if (events) doError = (doError && events.error == null); else if (!doError) return false; domain = this.domain; // If there is no 'error' event listener then throw. if (doError) { er = arguments[1]; if (domain) { if (!er) er = new Error('Uncaught, unspecified "error" event'); er.domainEmitter = this; er.domain = domain; er.domainThrown = false; domain.emit('error', er); } else if (er instanceof Error) { throw er; // Unhandled 'error' event } else { // At least give some kind of context to the user var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); err.context = er; throw err; } return false; } handler = events[type]; if (!handler) return false; var isFn = typeof handler === 'function'; len = arguments.length; switch (len) { // fast cases case 1: emitNone(handler, isFn, this); break; case 2: emitOne(handler, isFn, this, arguments[1]); break; case 3: emitTwo(handler, isFn, this, arguments[1], arguments[2]); break; case 4: emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); break; // slower default: args = new Array(len - 1); for (i = 1; i < len; i++) args[i - 1] = arguments[i]; emitMany(handler, isFn, this, args); } return true; }; function _addListener(target, type, listener, prepend) { var m; var events; var existing; if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); events = target._events; if (!events) { events = target._events = new EventHandlers(); target._eventsCount = 0; } else { // To avoid recursion in the case that type === "newListener"! Before // adding it to the listeners, first emit "newListener". if (events.newListener) { target.emit('newListener', type, listener.listener ? listener.listener : listener); // Re-assign `events` because a newListener handler could have caused the // this._events to be assigned to a new object events = target._events; } existing = events[type]; } if (!existing) { // Optimize the case of one listener. Don't need the extra array object. existing = events[type] = listener; ++target._eventsCount; } else { if (typeof existing === 'function') { // Adding the second element, need to change to array. existing = events[type] = prepend ? [listener, existing] : [existing, listener]; } else { // If we've already got an array, just append. if (prepend) { existing.unshift(listener); } else { existing.push(listener); } } // Check for listener leak if (!existing.warned) { m = $getMaxListeners(target); if (m && m > 0 && existing.length > m) { existing.warned = true; var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + type + ' listeners added. ' + 'Use emitter.setMaxListeners() to increase limit'); w.name = 'MaxListenersExceededWarning'; w.emitter = target; w.type = type; w.count = existing.length; emitWarning(w); } } } return target; } function emitWarning(e) { typeof console.warn === 'function' ? console.warn(e) : console.log(e); } EventEmitter.prototype.addListener = function addListener(type, listener) { return _addListener(this, type, listener, false); }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.prependListener = function prependListener(type, listener) { return _addListener(this, type, listener, true); }; function _onceWrap(target, type, listener) { var fired = false; function g() { target.removeListener(type, g); if (!fired) { fired = true; listener.apply(target, arguments); } } g.listener = listener; return g; } EventEmitter.prototype.once = function once(type, listener) { if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); this.on(type, _onceWrap(this, type, listener)); return this; }; EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) { if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); this.prependListener(type, _onceWrap(this, type, listener)); return this; }; // emits a 'removeListener' event iff the listener was removed EventEmitter.prototype.removeListener = function removeListener(type, listener) { var list, events, position, i, originalListener; if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); events = this._events; if (!events) return this; list = events[type]; if (!list) return this; if (list === listener || (list.listener && list.listener === listener)) { if (--this._eventsCount === 0) this._events = new EventHandlers(); else { delete events[type]; if (events.removeListener) this.emit('removeListener', type, list.listener || listener); } } else if (typeof list !== 'function') { position = -1; for (i = list.length; i-- > 0;) { if (list[i] === listener || (list[i].listener && list[i].listener === listener)) { originalListener = list[i].listener; position = i; break; } } if (position < 0) return this; if (list.length === 1) { list[0] = undefined; if (--this._eventsCount === 0) { this._events = new EventHandlers(); return this; } else { delete events[type]; } } else { spliceOne(list, position); } if (events.removeListener) this.emit('removeListener', type, originalListener || listener); } return this; }; // Alias for removeListener added in NodeJS 10.0 // https://nodejs.org/api/events.html#events_emitter_off_eventname_listener EventEmitter.prototype.off = function(type, listener){ return this.removeListener(type, listener); }; EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { var listeners, events; events = this._events; if (!events) return this; // not listening for removeListener, no need to emit if (!events.removeListener) { if (arguments.length === 0) { this._events = new EventHandlers(); this._eventsCount = 0; } else if (events[type]) { if (--this._eventsCount === 0) this._events = new EventHandlers(); else delete events[type]; } return this; } // emit removeListener for all listeners on all events if (arguments.length === 0) { var keys = Object.keys(events); for (var i = 0, key; i < keys.length; ++i) { key = keys[i]; if (key === 'removeListener') continue; this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = new EventHandlers(); this._eventsCount = 0; return this; } listeners = events[type]; if (typeof listeners === 'function') { this.removeListener(type, listeners); } else if (listeners) { // LIFO order do { this.removeListener(type, listeners[listeners.length - 1]); } while (listeners[0]); } return this; }; EventEmitter.prototype.listeners = function listeners(type) { var evlistener; var ret; var events = this._events; if (!events) ret = []; else { evlistener = events[type]; if (!evlistener) ret = []; else if (typeof evlistener === 'function') ret = [evlistener.listener || evlistener]; else ret = unwrapListeners(evlistener); } return ret; }; EventEmitter.listenerCount = function(emitter, type) { if (typeof emitter.listenerCount === 'function') { return emitter.listenerCount(type); } else { return listenerCount.call(emitter, type); } }; EventEmitter.prototype.listenerCount = listenerCount; function listenerCount(type) { var events = this._events; if (events) { var evlistener = events[type]; if (typeof evlistener === 'function') { return 1; } else if (evlistener) { return evlistener.length; } } return 0; } EventEmitter.prototype.eventNames = function eventNames() { return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; }; // About 1.5x faster than the two-arg version of Array#splice(). function spliceOne(list, index) { for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) list[i] = list[k]; list.pop(); } function arrayClone(arr, i) { var copy = new Array(i); while (i--) copy[i] = arr[i]; return copy; } function unwrapListeners(arr) { var ret = new Array(arr.length); for (var i = 0; i < ret.length; ++i) { ret[i] = arr[i].listener || arr[i]; } return ret; } var pkg = { name: "@nextgis/ngw-connector", version: "3.0.1", _priority: 12, description: "A lightweight HTTP client optimized for use with NextGIS Web API", main: "index.js", module: "lib/ngw-connector.esm-bundler.js", unpkg: "lib/ngw-connector.global.prod.js", jsdelivr: "lib/ngw-connector.global.prod.js", types: "lib/index.d.ts", dependencies: { "@nextgis/cache": "3.0.0", "@nextgis/cancelable-promise": "3.0.0", "@nextgis/utils": "3.0.0", "@types/events": "^3.0.0", events: "*", "form-data": "^4.0.0" }, devDependencies: { "@nextgis/build-tools": "3.0.0" }, scripts: { clean: "rimraf ./lib", dev: "node ../build-tools/lib/build.js", prod: "npm run dev -- --release", lint: "eslint ./src/**/*.ts --fix --c ../../.eslintrc", watch: "npm run dev -- --watch", "gen:types": "node ./scripts/generator" }, buildOptions: { name: "NgwConnector", formats: [ "esm-bundler", "esm-browser", "cjs", "global" ] }, keywords: [ "NextGIS", "MAP" ], author: "NextGIS", files: [ "index.js", "lib" ], license: "MIT", homepage: "https://github.com/nextgis/nextgis_frontend/tree/master/packages/ngw-connector#readme", repository: { type: "git", url: "git://github.com/nextgis/nextgis_frontend.git" }, engines: { node: ">=18.20.4" }, gitHead: "edc68033f914f6c95c4125b9738bba6d36e990b4" }; class AbortError extends Error { constructor(message = "AbortError") { super(message); this.name = "AbortError"; } } var __defProp$a = Object.defineProperty; var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField$8 = (obj, key, value) => __defNormalProp$a(obj, typeof key !== "symbol" ? key + "" : key, value); class NgwError extends Error { constructor(er) { super(); __publicField$8(this, "name", "NgwError"); __publicField$8(this, "title"); __publicField$8(this, "message"); __publicField$8(this, "detail"); __publicField$8(this, "exception"); __publicField$8(this, "status_code"); __publicField$8(this, "data"); __publicField$8(this, "guru_meditation"); Object.assign(this, er); Object.setPrototypeOf(this, NgwError.prototype); } } var __defProp$9 = Object.defineProperty; var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField$7 = (obj, key, value) => __defNormalProp$9(obj, typeof key !== "symbol" ? key + "" : key, value); class InsufficientPermissionsError extends NgwError { constructor(obj) { super(obj); __publicField$7(this, "name", "InsufficientPermissionsError"); __publicField$7(this, "exception", "nextgisweb.core.exception.InsufficientPermissions"); Object.setPrototypeOf(this, InsufficientPermissionsError.prototype); } } var __defProp$8 = Object.defineProperty; var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField$6 = (obj, key, value) => __defNormalProp$8(obj, typeof key !== "symbol" ? key + "" : key, value); let NetworksResponseError$1 = class NetworksResponseError extends NgwError { constructor(obj) { super(obj); __publicField$6(this, "message", "There is no response from the server or problem connecting to server."); __publicField$6(this, "title", "Network error"); __publicField$6(this, "detail", "Check network connectivity and try again later."); Object.setPrototypeOf(this, NetworksResponseError.prototype); } }; function extractError(error) { if (isObject$1(error)) { if (error.name && error.message && error.title) { return { title: error.title, message: error.message, detail: error.detail || null, data: error.data && error.data.data ? error.data.data : null }; } else if (error.exception) { if (error.status === void 0 || error.status === 0 || error.data === void 0) { return new NetworksResponseError$1({ title: error.title, status_code: error.status_code, exception: error.exception }); } } return { title: typeof error.title === "string" ? error.title : "Unexpected error", message: typeof error.message === "string" ? error.message : "Something went wrong." }; } } function isError(error) { if (isObject$1(error)) { return error.status_code && error.exception && error.title; } return false; } var __defProp$7 = Object.defineProperty; var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField$5 = (obj, key, value) => __defNormalProp$7(obj, key + "" , value); class NetworkError extends Error { constructor(url) { super(); __publicField$5(this, "name", "NetworkError"); Object.setPrototypeOf(this, NetworkError.prototype); this.message = `Unable to request ${url}. Possibly invalid NGW URL entered or CORS not configured to get request from ${location.origin}`; } } var __defProp$6 = Object.defineProperty; var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField$4 = (obj, key, value) => __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value); class ResourceNotFoundError extends NgwError { constructor(obj) { super(obj); __publicField$4(this, "name", "ResourceNotFoundError"); __publicField$4(this, "exception", "nextgisweb.resource.exception.ResourceNotFound"); Object.setPrototypeOf(this, ResourceNotFoundError.prototype); } } var errors = /*#__PURE__*/Object.freeze({ __proto__: null, AbortError: AbortError, InsufficientPermissionsError: InsufficientPermissionsError, NetworkError: NetworkError, NetworksResponseError: NetworksResponseError$1, NgwError: NgwError, ResourceNotFoundError: ResourceNotFoundError, extractError: extractError, isError: isError }); var __defProp$5 = Object.defineProperty; var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField$3 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value); class BaseAPIError extends Error { constructor(message) { super(message || "Something went wrong."); __publicField$3(this, "title"); this.name = "BaseAPIError"; this.title = "Unknown API error"; if (Error.captureStackTrace) { Error.captureStackTrace(this, BaseAPIError); } } } class NetworksResponseError extends BaseAPIError { // prettier-ignore constructor(message) { super(message || "There is no response from the server or problem connecting to server."); __publicField$3(this, "detail"); this.title = "Network error"; this.detail = "Check network connectivity and try again later."; } } class InvalidResponseError extends BaseAPIError { constructor(message) { super(message || "Something went wrong."); this.title = "Unexpected server response"; } } class ServerResponseError extends BaseAPIError { constructor(data) { super(data.message); __publicField$3(this, "detail"); __publicField$3(this, "data"); this.title = data.title || this.title; this.detail = data.detail || null; this.data = data; } } class LunkwillError extends Error { // prettier-ignore constructor(message, data = {}) { super(message || "Unexpected error while processing long-running request."); __publicField$3(this, "title"); __publicField$3(this, "data"); this.name = "LunkwillError"; this.title = "Long-running request error"; this.data = data; if (Error.captureStackTrace) { Error.captureStackTrace(this, LunkwillError); } } } class LunkwillRequestCancelled extends LunkwillError { constructor(data) { super("Long-running request was cancelled.", data); } } class LunkwillRequestFailed extends LunkwillError { constructor(data) { super(void 0, data); } } var __defProp$4 = Object.defineProperty; var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols; var __hasOwnProp$3 = Object.prototype.hasOwnProperty; var __propIsEnum$3 = Object.prototype.propertyIsEnumerable; var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$3 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$3.call(b, prop)) __defNormalProp$4(a, prop, b[prop]); if (__getOwnPropSymbols$3) for (var prop of __getOwnPropSymbols$3(b)) { if (__propIsEnum$3.call(b, prop)) __defNormalProp$4(a, prop, b[prop]); } return a; }; var __objRest$2 = (source, exclude) => { var target = {}; for (var prop in source) if (__hasOwnProp$3.call(source, prop) && exclude.indexOf(prop) < 0) target[prop] = source[prop]; if (source != null && __getOwnPropSymbols$3) for (var prop of __getOwnPropSymbols$3(source)) { if (exclude.indexOf(prop) < 0 && __propIsEnum$3.call(source, prop)) target[prop] = source[prop]; } return target; }; var __async$3 = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; function lunkwillCheckResponse(lwResp) { const ct = lwResp.headers.get("content-type"); return ct !== void 0 && ct !== null && ct.includes("application/vnd.lunkwill.request-summary+json"); } function responseJson(response) { return __async$3(this, null, function* () { try { return response.json(); } catch (e) { throw new Error(); } }); } function lunkwillResponseUrl(lwResp) { return __async$3(this, null, function* () { const lwData = yield responseJson(lwResp); let delay = lwData.delay_ms; const retry = lwData.retry_ms !== void 0 ? lwData.retry_ms : 2e3; const sum = `/api/lunkwill/${lwData.id}/summary`; const res = `/api/lunkwill/${lwData.id}/response`; const sleep = (msec) => new Promise((resolve) => setTimeout(resolve, msec)); let failed = false; let ready = false; while (!ready) { yield sleep(failed ? retry : delay); failed = false; let lwResp2; let lwData2; try { lwResp2 = yield fetch(sum, { credentials: "same-origin" }); lwData2 = yield lwResp2.json(); } catch (e) { failed = true; continue; } switch (lwData2.status) { case void 0: throw new LunkwillError(void 0, lwData2); case "ready": ready = true; break; case "cancelled": throw new LunkwillRequestCancelled(lwData2); case "failed": throw new LunkwillRequestFailed(lwData2); case "spooled": case "processing": case "buffering": delay = lwData2.delay_ms; break; default: throw new LunkwillError(void 0, lwData2); } } return res; }); } function lunkwillFetch(lwRespUrl) { return __async$3(this, null, function* () { try { return yield window.fetch(lwRespUrl, { credentials: "same-origin" }); } catch (e) { throw new NetworksResponseError(); } }); } const mediaContentTypes = [ "application/pdf", "image/png", "image/jpeg", "image/tiff", "text/csv" ]; const mediaContentTypesRegex = new RegExp(mediaContentTypes.join("|")); function isMediaContentType(contentType) { return mediaContentTypesRegex.test(contentType); } function encodeQueryParams(value) { const result = []; for (const [k, v] of Object.entries(value)) { if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") { result.push(`${k}=${encodeURIComponent(v)}`); } else if (Array.isArray(v)) { result.push(`${k}=${v.map(encodeURIComponent).join(",")}`); } else { for (const [sk, sv] of Object.entries(v)) { const ske = `${k}[${encodeURIComponent(sk)}]`; if (typeof sv === "string" || typeof sv === "number" || typeof sv === "boolean") { result.push(`${ske}=${encodeURIComponent(sv)}`); } else if (Array.isArray(sv)) { const sve = sv.map(encodeURIComponent); result.push(`${ske}=${sve.join(",")}`); } } } } return result.join("&"); } function generateUrl(path, query) { let urlParams = ""; if (query !== void 0) { urlParams = "?" + encodeQueryParams(query); } return path + urlParams; } function request(path, options, cacheEngine) { return __async$3(this, null, function* () { var _b, _c; const defaults = { method: "GET", credentials: "same-origin", headers: {} }; const _a = __spreadValues$3(__spreadValues$3({}, defaults), options), { withCredentials, responseType, cacheProps, cacheName, lunkwill, cache, query, json } = _a, opt = __objRest$2(_a, [ "withCredentials", "responseType", "cacheProps", "cacheName", "lunkwill", "cache", "query", "json" ]); opt.method = (_b = opt.method) == null ? void 0 : _b.toUpperCase(); if (withCredentials) { opt.credentials = "include"; } let useLunkwill = false; if (lunkwill !== void 0) { lunkwill.toHeaders(opt.headers || {}); useLunkwill = true; } const lunkwillReturnUrl = !!opt.lunkwillReturnUrl; delete opt.lunkwillReturnUrl; if (json !== void 0) { opt.body = JSON.stringify(json); const headers = opt.headers || {}; headers["Content-Type"] = "application/json"; opt.headers = headers; } const url = generateUrl(path, query); const makeRequest = () => __async$3(null, null, function* () { let response; try { response = yield fetch(url, opt); } catch (e) { if (opt.signal && opt.signal.aborted) { throw e; } throw new NetworksResponseError(); } if (useLunkwill && lunkwillCheckResponse(response)) { const lwRespUrl = yield lunkwillResponseUrl(response); if (lunkwillReturnUrl) { return lwRespUrl; } response = yield lunkwillFetch(lwRespUrl); } const respCType = response.headers.get("content-type"); const respJSON = respCType && (respCType.includes("application/json") || respCType.includes("application/vnd.lunkwill.request-summary+json")); let body; try { const respMedia = respCType && isMediaContentType(respCType); if (responseType === "blob" || respMedia) { body = yield response.blob(); } else if (respJSON) { body = yield response.json(); } else { throw new InvalidResponseError(); } } catch (e) { if (e.name === "AbortError" || e instanceof InvalidResponseError) { throw e; } throw new InvalidResponseError(); } if (400 <= response.status && response.status <= 599) { throw new ServerResponseError(body); } return body; }); if (cacheEngine) { if (((_c = opt.method) == null ? void 0 : _c.toUpperCase()) === "GET") { if (cache !== false) { const props = cacheProps ? cacheProps : __spreadValues$3({}, objectRemoveEmpty({ withCredentials, responseType })); return cacheEngine.add(cacheName || url, makeRequest, { props, expirationTime: cache ? void 0 : 500 }); } } else { const ignoredForClean = ["api/feature_layer/identify"]; if (ignoredForClean.every((part) => !path.includes(part))) { cacheEngine.clean(); } } } return makeRequest(); }); } var __defProp$3 = Object.defineProperty; var __defProps$2 = Object.defineProperties; var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols; var __hasOwnProp$2 = Object.prototype.hasOwnProperty; var __propIsEnum$2 = Object.prototype.propertyIsEnumerable; var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$2 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$2.call(b, prop)) __defNormalProp$3(a, prop, b[prop]); if (__getOwnPropSymbols$2) for (var prop of __getOwnPropSymbols$2(b)) { if (__propIsEnum$2.call(b, prop)) __defNormalProp$3(a, prop, b[prop]); } return a; }; var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b)); var __objRest$1 = (source, exclude) => { var target = {}; for (var prop in source) if (__hasOwnProp$2.call(source, prop) && exclude.indexOf(prop) < 0) target[prop] = source[prop]; if (source != null && __getOwnPropSymbols$2) for (var prop of __getOwnPropSymbols$2(source)) { if (exclude.indexOf(prop) < 0 && __propIsEnum$2.call(source, prop)) target[prop] = source[prop]; } return target; }; var __async$2 = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; function routeURL(name, baseUrl, routeData, ...rest) { const [template, ...params] = routeData[name]; const first = rest[0]; let sub; if (first === void 0) { sub = []; } else if (typeof first === "object" && first !== null) { if (rest.length > 1) { throw new Error("Too many arguments for route(name, object)!"); } sub = []; for (const [p, v] of Object.entries(first)) { sub[params.indexOf(p)] = String(v); } } else { sub = rest.map((v) => String(v)); } return fixUrlStr( baseUrl + template.replace(/\{(\w+)\}/g, function(m, a) { const idx = parseInt(a); const value = sub[idx]; if (value === void 0) { const msg = `Undefined parameter ${idx} in "${template}".`; throw new Error(msg); } return String(value); }) ); } function route(name, connector, ...rest) { const result = { url: (opt) => __async$2(null, null, function* () { var _a; const routeData = yield connector.connect(); const template = routeURL( name, (_a = connector.options.baseUrl) != null ? _a : "", routeData, ...rest ); return generateUrl(template, opt == null ? void 0 : opt.query); }) }; const methods = ["get", "post", "put", "delete", "patch"]; for (const method of methods) { const methodResp = (requestOptions) => { var _b; const _a = requestOptions || {}, { headers: optHeaders } = _a, restOpt = __objRest$1(_a, ["headers"]); if ((_b = requestOptions == null ? void 0 : requestOptions.signal) == null ? void 0 : _b.aborted) { throw new AbortError(); } return connector.connect().then((routeData) => { var _a2; const template = routeURL( name, (_a2 = connector.options.baseUrl) != null ? _a2 : "", routeData, ...rest ); const headers = objectRemoveEmpty(__spreadValues$2(__spreadValues$2({}, connector.getAuthorizationHeaders()), optHeaders != null ? optHeaders : {})); return request( template, __spreadProps$2(__spreadValues$2({ headers }, restOpt), { method }), connector.cache ); }); }; result[method] = methodResp; } return result; } function isObject(val) { return Object.prototype.toString.call(val) === "[object Object]"; } let loadData; { loadData = (url, callback, options = {}, error, onCancel) => { options.method = options.method || "GET"; const xhr = new XMLHttpRequest(); xhr.open(options.method || "GET", url, true); if (options.responseType === "blob") { xhr.responseType = options.responseType; } const getResponseText = () => { try { return JSON.parse(xhr.responseText); } catch (e) { return xhr.responseText; } }; const processingResponse = (forError = false) => { const cb = forError ? error : callback; if (options.responseType === "blob") { cb(xhr.response); } else { if (xhr.responseText) { cb(getResponseText()); } else { error({ message: "" }); } } }; xhr.onload = () => { if ([401, 403, 404, 422, 500].indexOf(xhr.status) !== -1) { error(new NgwError(getResponseText())); } processingResponse(); }; xhr.onerror = (er) => { if (xhr.status === 0) { error(new NetworkError(url)); } else { error(er); } }; xhr.upload.onprogress = function(e) { if (e.lengthComputable) { const percentComplete = e.loaded / e.total * 100; if (options.onProgress) { options.onProgress(percentComplete, e); } } }; const headers = options.headers; if (headers) { for (const h in headers) { const header = headers[h]; if (typeof header === "string") { xhr.setRequestHeader(h, header); } } } if (options.withCredentials !== void 0) { xhr.withCredentials = options.withCredentials; } let data; if (options.file) { data = new FormData(); data.append("file", options.file); if (options.data) { for (const d in options.data) { data.append(d, data[d]); } } } else { data = options.data ? typeof options.data === "string" ? options.data : JSON.stringify(options.data) : null; } if (onCancel) { onCancel(() => { xhr.abort(); }); } xhr.send(data); }; } const CONNECTORS = []; function addConnector(connector) { CONNECTORS.push(connector); } function findConnector(options) { return CONNECTORS.find((x) => { if (x.options.baseUrl === options.baseUrl) { if (options.auth) { if (x.options.auth) { return objectDeepEqual(x.options.auth, options.auth); } } else { return true; } } }); } function removeConnector(connector) { const index = CONNECTORS.indexOf(connector); if (index !== -1) { CONNECTORS.splice(index, 1); } } var __defProp$2 = Object.defineProperty; var __defProps$1 = Object.defineProperties; var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols; var __hasOwnProp$1 = Object.prototype.hasOwnProperty; var __propIsEnum$1 = Object.prototype.propertyIsEnumerable; var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$1 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$1.call(b, prop)) __defNormalProp$2(a, prop, b[prop]); if (__getOwnPropSymbols$1) for (var prop of __getOwnPropSymbols$1(b)) { if (__propIsEnum$1.call(b, prop)) __defNormalProp$2(a, prop, b[prop]); } return a; }; var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b)); var __objRest = (source, exclude) => { var target = {}; for (var prop in source) if (__hasOwnProp$1.call(source, prop) && exclude.indexOf(prop) < 0) target[prop] = source[prop]; if (source != null && __getOwnPropSymbols$1) for (var prop of __getOwnPropSymbols$1(source)) { if (exclude.indexOf(prop) < 0 && __propIsEnum$1.call(source, prop)) target[prop] = source[prop]; } return target; }; var __publicField$2