diff --git a/src/client/index.mjs b/src/client/index.mjs index a1a2986a..9c638a69 100644 --- a/src/client/index.mjs +++ b/src/client/index.mjs @@ -2311,36 +2311,6 @@ const isAsyncFn = kindOfTest('AsyncFunction'); const isThenable = (thing) => thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch); -// original code -// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34 - -const _setImmediate = ((setImmediateSupported, postMessageSupported) => { - if (setImmediateSupported) { - return setImmediate; - } - - return postMessageSupported ? ((token, callbacks) => { - _global.addEventListener("message", ({source, data}) => { - if (source === _global && data === token) { - callbacks.length && callbacks.shift()(); - } - }, false); - - return (cb) => { - callbacks.push(cb); - _global.postMessage(token, "*"); - } - })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb); -})( - typeof setImmediate === 'function', - isFunction(_global.postMessage) -); - -const asap = typeof queueMicrotask !== 'undefined' ? - queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate); - -// ********************* - var utils$1 = { isArray, isArrayBuffer, @@ -2396,9 +2366,7 @@ var utils$1 = { isSpecCompliantForm, toJSONObject, isAsyncFn, - isThenable, - setImmediate: _setImmediate, - asap + isThenable }; /** @@ -2426,10 +2394,7 @@ function AxiosError(message, code, config, request, response) { code && (this.code = code); config && (this.config = config); request && (this.request = request); - if (response) { - this.response = response; - this.status = response.status ? response.status : null; - } + response && (this.response = response); } utils$1.inherits(AxiosError, Error, { @@ -2449,7 +2414,7 @@ utils$1.inherits(AxiosError, Error, { // Axios config: utils$1.toJSONObject(this.config), code: this.code, - status: this.status + status: this.response && this.response.status ? this.response.status : null }; } }); @@ -2917,8 +2882,6 @@ var platform$1 = { const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined'; -const _navigator = typeof navigator === 'object' && navigator || undefined; - /** * Determine if we're running in a standard browser environment * @@ -2936,8 +2899,10 @@ const _navigator = typeof navigator === 'object' && navigator || undefined; * * @returns {boolean} */ -const hasStandardBrowserEnv = hasBrowserEnv && - (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0); +const hasStandardBrowserEnv = ( + (product) => { + return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0 + })(typeof navigator !== 'undefined' && navigator.product); /** * Determine if we're running in a standard browser webWorker environment @@ -2964,7 +2929,6 @@ var utils = /*#__PURE__*/Object.freeze({ hasBrowserEnv: hasBrowserEnv, hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv, hasStandardBrowserEnv: hasStandardBrowserEnv, - navigator: _navigator, origin: origin }); @@ -3713,42 +3677,31 @@ function speedometer(samplesCount, min) { */ function throttle(fn, freq) { let timestamp = 0; - let threshold = 1000 / freq; - let lastArgs; - let timer; - - const invoke = (args, now = Date.now()) => { - timestamp = now; - lastArgs = null; - if (timer) { - clearTimeout(timer); - timer = null; - } - fn.apply(null, args); - }; + const threshold = 1000 / freq; + let timer = null; + return function throttled() { + const force = this === true; - const throttled = (...args) => { const now = Date.now(); - const passed = now - timestamp; - if ( passed >= threshold) { - invoke(args, now); - } else { - lastArgs = args; - if (!timer) { - timer = setTimeout(() => { - timer = null; - invoke(lastArgs); - }, threshold - passed); + if (force || now - timestamp > threshold) { + if (timer) { + clearTimeout(timer); + timer = null; } + timestamp = now; + return fn.apply(null, arguments); + } + if (!timer) { + timer = setTimeout(() => { + timer = null; + timestamp = Date.now(); + return fn.apply(null, arguments); + }, threshold - (now - timestamp)); } }; - - const flush = () => lastArgs && invoke(lastArgs); - - return [throttled, flush]; } -const progressEventReducer = (listener, isDownloadStream, freq = 3) => { +var progressEventReducer = (listener, isDownloadStream, freq = 3) => { let bytesNotified = 0; const _speedometer = speedometer(50, 250); @@ -3769,32 +3722,21 @@ const progressEventReducer = (listener, isDownloadStream, freq = 3) => { rate: rate ? rate : undefined, estimated: rate && total && inRange ? (total - loaded) / rate : undefined, event: e, - lengthComputable: total != null, - [isDownloadStream ? 'download' : 'upload']: true + lengthComputable: total != null }; + data[isDownloadStream ? 'download' : 'upload'] = true; + listener(data); }, freq); }; -const progressEventDecorator = (total, throttled) => { - const lengthComputable = total != null; - - return [(loaded) => throttled[0]({ - lengthComputable, - total, - loaded - }), throttled[1]]; -}; - -const asyncDecorator = (fn) => (...args) => utils$1.asap(() => fn(...args)); - var isURLSameOrigin = platform.hasStandardBrowserEnv ? // Standard browser envs have full support of the APIs needed to test // whether the request URL is of the same origin as current location. (function standardBrowserEnv() { - const msie = platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent); + const msie = /(msie|trident)/i.test(navigator.userAgent); const urlParsingNode = document.createElement('a'); let originURL; @@ -4093,18 +4035,16 @@ var xhrAdapter = isXHRAdapterSupported && function (config) { const _config = resolveConfig(config); let requestData = _config.data; const requestHeaders = AxiosHeaders$1.from(_config.headers).normalize(); - let {responseType, onUploadProgress, onDownloadProgress} = _config; + let {responseType} = _config; let onCanceled; - let uploadThrottled, downloadThrottled; - let flushUpload, flushDownload; - function done() { - flushUpload && flushUpload(); // flush events - flushDownload && flushDownload(); // flush events - - _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled); + if (_config.cancelToken) { + _config.cancelToken.unsubscribe(onCanceled); + } - _config.signal && _config.signal.removeEventListener('abort', onCanceled); + if (_config.signal) { + _config.signal.removeEventListener('abort', onCanceled); + } } let request = new XMLHttpRequest(); @@ -4174,7 +4114,7 @@ var xhrAdapter = isXHRAdapterSupported && function (config) { return; } - reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request)); + reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, _config, request)); // Clean up request request = null; @@ -4184,7 +4124,7 @@ var xhrAdapter = isXHRAdapterSupported && function (config) { request.onerror = function handleError() { // Real errors are hidden from us by the browser // onerror should only fire if it's a network error - reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request)); + reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, _config, request)); // Clean up request request = null; @@ -4200,7 +4140,7 @@ var xhrAdapter = isXHRAdapterSupported && function (config) { reject(new AxiosError( timeoutErrorMessage, transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, - config, + _config, request)); // Clean up request @@ -4228,18 +4168,13 @@ var xhrAdapter = isXHRAdapterSupported && function (config) { } // Handle progress if needed - if (onDownloadProgress) { - ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true)); - request.addEventListener('progress', downloadThrottled); + if (typeof _config.onDownloadProgress === 'function') { + request.addEventListener('progress', progressEventReducer(_config.onDownloadProgress, true)); } // Not all browsers support upload events - if (onUploadProgress && request.upload) { - ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress)); - - request.upload.addEventListener('progress', uploadThrottled); - - request.upload.addEventListener('loadend', flushUpload); + if (typeof _config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', progressEventReducer(_config.onUploadProgress)); } if (_config.cancelToken || _config.signal) { @@ -4274,46 +4209,45 @@ var xhrAdapter = isXHRAdapterSupported && function (config) { }; const composeSignals = (signals, timeout) => { - const {length} = (signals = signals ? signals.filter(Boolean) : []); + let controller = new AbortController(); - if (timeout || length) { - let controller = new AbortController(); + let aborted; - let aborted; + const onabort = function (cancel) { + if (!aborted) { + aborted = true; + unsubscribe(); + const err = cancel instanceof Error ? cancel : this.reason; + controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err)); + } + }; - const onabort = function (reason) { - if (!aborted) { - aborted = true; - unsubscribe(); - const err = reason instanceof Error ? reason : this.reason; - controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err)); - } - }; + let timer = timeout && setTimeout(() => { + onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT)); + }, timeout); - let timer = timeout && setTimeout(() => { + const unsubscribe = () => { + if (signals) { + timer && clearTimeout(timer); timer = null; - onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT)); - }, timeout); - - const unsubscribe = () => { - if (signals) { - timer && clearTimeout(timer); - timer = null; - signals.forEach(signal => { - signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort); - }); - signals = null; - } - }; + signals.forEach(signal => { + signal && + (signal.removeEventListener ? signal.removeEventListener('abort', onabort) : signal.unsubscribe(onabort)); + }); + signals = null; + } + }; - signals.forEach((signal) => signal.addEventListener('abort', onabort)); + signals.forEach((signal) => signal && signal.addEventListener && signal.addEventListener('abort', onabort)); - const {signal} = controller; + const {signal} = controller; - signal.unsubscribe = () => utils$1.asap(unsubscribe); + signal.unsubscribe = unsubscribe; - return signal; - } + return [signal, () => { + timer && clearTimeout(timer); + timer = null; + }]; }; var composeSignals$1 = composeSignals; @@ -4336,68 +4270,35 @@ const streamChunk = function* (chunk, chunkSize) { } }; -const readBytes = async function* (iterable, chunkSize) { - for await (const chunk of readStream(iterable)) { - yield* streamChunk(chunk, chunkSize); - } -}; - -const readStream = async function* (stream) { - if (stream[Symbol.asyncIterator]) { - yield* stream; - return; - } - - const reader = stream.getReader(); - try { - for (;;) { - const {done, value} = await reader.read(); - if (done) { - break; - } - yield value; - } - } finally { - await reader.cancel(); +const readBytes = async function* (iterable, chunkSize, encode) { + for await (const chunk of iterable) { + yield* streamChunk(ArrayBuffer.isView(chunk) ? chunk : (await encode(String(chunk))), chunkSize); } }; -const trackStream = (stream, chunkSize, onProgress, onFinish) => { - const iterator = readBytes(stream, chunkSize); +const trackStream = (stream, chunkSize, onProgress, onFinish, encode) => { + const iterator = readBytes(stream, chunkSize, encode); let bytes = 0; - let done; - let _onFinish = (e) => { - if (!done) { - done = true; - onFinish && onFinish(e); - } - }; return new ReadableStream({ - async pull(controller) { - try { - const {done, value} = await iterator.next(); + type: 'bytes', - if (done) { - _onFinish(); - controller.close(); - return; - } + async pull(controller) { + const {done, value} = await iterator.next(); - let len = value.byteLength; - if (onProgress) { - let loadedBytes = bytes += len; - onProgress(loadedBytes); - } - controller.enqueue(new Uint8Array(value)); - } catch (err) { - _onFinish(err); - throw err; + if (done) { + controller.close(); + onFinish(); + return; } + + let len = value.byteLength; + onProgress && onProgress(bytes += len); + controller.enqueue(new Uint8Array(value)); }, cancel(reason) { - _onFinish(reason); + onFinish(reason); return iterator.return(); } }, { @@ -4405,6 +4306,15 @@ const trackStream = (stream, chunkSize, onProgress, onFinish) => { }) }; +const fetchProgressDecorator = (total, fn) => { + const lengthComputable = total != null; + return (loaded) => setTimeout(() => fn({ + lengthComputable, + total, + loaded + })); +}; + const isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function'; const isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function'; @@ -4414,15 +4324,7 @@ const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ? async (str) => new Uint8Array(await new Response(str).arrayBuffer()) ); -const test = (fn, ...args) => { - try { - return !!fn(...args); - } catch (e) { - return false - } -}; - -const supportsRequestStream = isReadableStreamSupported && test(() => { +const supportsRequestStream = isReadableStreamSupported && (() => { let duplexAccessed = false; const hasContentType = new Request(platform.origin, { @@ -4435,13 +4337,17 @@ const supportsRequestStream = isReadableStreamSupported && test(() => { }).headers.has('Content-Type'); return duplexAccessed && !hasContentType; -}); +})(); const DEFAULT_CHUNK_SIZE = 64 * 1024; -const supportsResponseStream = isReadableStreamSupported && - test(() => utils$1.isReadableStream(new Response('').body)); - +const supportsResponseStream = isReadableStreamSupported && !!(()=> { + try { + return utils$1.isReadableStream(new Response('').body); + } catch(err) { + // return undefined + } +})(); const resolvers = { stream: supportsResponseStream && ((res) => res.body) @@ -4466,14 +4372,10 @@ const getBodyLength = async (body) => { } if(utils$1.isSpecCompliantForm(body)) { - const _request = new Request(platform.origin, { - method: 'POST', - body, - }); - return (await _request.arrayBuffer()).byteLength; + return (await new Request(body).arrayBuffer()).byteLength; } - if(utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) { + if(utils$1.isArrayBufferView(body)) { return body.byteLength; } @@ -4510,13 +4412,18 @@ var fetchAdapter = isFetchSupported && (async (config) => { responseType = responseType ? (responseType + '').toLowerCase() : 'text'; - let composedSignal = composeSignals$1([signal, cancelToken && cancelToken.toAbortSignal()], timeout); + let [composedSignal, stopTimeout] = (signal || cancelToken || timeout) ? + composeSignals$1([signal, cancelToken], timeout) : []; - let request; + let finished, request; - const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => { - composedSignal.unsubscribe(); - }); + const onFinish = () => { + !finished && setTimeout(() => { + composedSignal && composedSignal.unsubscribe(); + }); + + finished = true; + }; let requestContentLength; @@ -4538,22 +4445,17 @@ var fetchAdapter = isFetchSupported && (async (config) => { } if (_request.body) { - const [onProgress, flush] = progressEventDecorator( + data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, fetchProgressDecorator( requestContentLength, - progressEventReducer(asyncDecorator(onUploadProgress)) - ); - - data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush); + progressEventReducer(onUploadProgress) + ), null, encodeText); } } if (!utils$1.isString(withCredentials)) { - withCredentials = withCredentials ? 'include' : 'omit'; + withCredentials = withCredentials ? 'cors' : 'omit'; } - // Cloudflare Workers throws when credentials are defined - // see https://github.com/cloudflare/workerd/issues/902 - const isCredentialsSupported = "credentials" in Request.prototype; request = new Request(url, { ...fetchOptions, signal: composedSignal, @@ -4561,14 +4463,14 @@ var fetchAdapter = isFetchSupported && (async (config) => { headers: headers.normalize().toJSON(), body: data, duplex: "half", - credentials: isCredentialsSupported ? withCredentials : undefined + withCredentials }); let response = await fetch(request); const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response'); - if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) { + if (supportsResponseStream && (onDownloadProgress || isStreamResponse)) { const options = {}; ['status', 'statusText', 'headers'].forEach(prop => { @@ -4577,16 +4479,11 @@ var fetchAdapter = isFetchSupported && (async (config) => { const responseContentLength = utils$1.toFiniteNumber(response.headers.get('content-length')); - const [onProgress, flush] = onDownloadProgress && progressEventDecorator( - responseContentLength, - progressEventReducer(asyncDecorator(onDownloadProgress), true) - ) || []; - response = new Response( - trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => { - flush && flush(); - unsubscribe && unsubscribe(); - }), + trackStream(response.body, DEFAULT_CHUNK_SIZE, onDownloadProgress && fetchProgressDecorator( + responseContentLength, + progressEventReducer(onDownloadProgress, true) + ), isStreamResponse && onFinish, encodeText), options ); } @@ -4595,7 +4492,9 @@ var fetchAdapter = isFetchSupported && (async (config) => { let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config); - !isStreamResponse && unsubscribe && unsubscribe(); + !isStreamResponse && onFinish(); + + stopTimeout && stopTimeout(); return await new Promise((resolve, reject) => { settle(resolve, reject, { @@ -4608,7 +4507,7 @@ var fetchAdapter = isFetchSupported && (async (config) => { }); }) } catch (err) { - unsubscribe && unsubscribe(); + onFinish(); if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) { throw Object.assign( @@ -4770,7 +4669,7 @@ function dispatchRequest(config) { }); } -const VERSION = "1.7.7"; +const VERSION = "1.7.2"; const validators$1 = {}; @@ -5177,20 +5076,6 @@ class CancelToken { } } - toAbortSignal() { - const controller = new AbortController(); - - const abort = (err) => { - controller.abort(err); - }; - - this.subscribe(abort); - - controller.signal.unsubscribe = () => this.unsubscribe(abort); - - return controller.signal; - } - /** * Returns an object that contains a new `CancelToken` and a function that, when called, * cancels the `CancelToken`. @@ -5640,20 +5525,32 @@ function copyBuffer (cur) { function rfdc (opts) { opts = opts || {}; - if (opts.circles) return rfdcCircles(opts) + + const constructorHandlers = new Map(); + constructorHandlers.set(Date, (o) => new Date(o)); + constructorHandlers.set(Map, (o, fn) => new Map(cloneArray(Array.from(o), fn))); + constructorHandlers.set(Set, (o, fn) => new Set(cloneArray(Array.from(o), fn))); + if (opts.constructorHandlers) { + for (const handler of opts.constructorHandlers) { + constructorHandlers.set(handler[0], handler[1]); + } + } + + let handler = null; + return opts.proto ? cloneProto : clone function cloneArray (a, fn) { - var keys = Object.keys(a); - var a2 = new Array(keys.length); - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - var cur = a[k]; + const keys = Object.keys(a); + const a2 = new Array(keys.length); + for (let i = 0; i < keys.length; i++) { + const k = keys[i]; + const cur = a[k]; if (typeof cur !== 'object' || cur === null) { a2[k] = cur; - } else if (cur instanceof Date) { - a2[k] = new Date(cur); + } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) { + a2[k] = handler(cur, fn); } else if (ArrayBuffer.isView(cur)) { a2[k] = copyBuffer(cur); } else { @@ -5665,22 +5562,18 @@ function rfdc (opts) { function clone (o) { if (typeof o !== 'object' || o === null) return o - if (o instanceof Date) return new Date(o) if (Array.isArray(o)) return cloneArray(o, clone) - if (o instanceof Map) return new Map(cloneArray(Array.from(o), clone)) - if (o instanceof Set) return new Set(cloneArray(Array.from(o), clone)) - var o2 = {}; - for (var k in o) { + if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) { + return handler(o, clone) + } + const o2 = {}; + for (const k in o) { if (Object.hasOwnProperty.call(o, k) === false) continue - var cur = o[k]; + const cur = o[k]; if (typeof cur !== 'object' || cur === null) { o2[k] = cur; - } else if (cur instanceof Date) { - o2[k] = new Date(cur); - } else if (cur instanceof Map) { - o2[k] = new Map(cloneArray(Array.from(cur), clone)); - } else if (cur instanceof Set) { - o2[k] = new Set(cloneArray(Array.from(cur), clone)); + } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) { + o2[k] = handler(cur, clone); } else if (ArrayBuffer.isView(cur)) { o2[k] = copyBuffer(cur); } else { @@ -5692,21 +5585,17 @@ function rfdc (opts) { function cloneProto (o) { if (typeof o !== 'object' || o === null) return o - if (o instanceof Date) return new Date(o) if (Array.isArray(o)) return cloneArray(o, cloneProto) - if (o instanceof Map) return new Map(cloneArray(Array.from(o), cloneProto)) - if (o instanceof Set) return new Set(cloneArray(Array.from(o), cloneProto)) - var o2 = {}; - for (var k in o) { - var cur = o[k]; + if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) { + return handler(o, cloneProto) + } + const o2 = {}; + for (const k in o) { + const cur = o[k]; if (typeof cur !== 'object' || cur === null) { o2[k] = cur; - } else if (cur instanceof Date) { - o2[k] = new Date(cur); - } else if (cur instanceof Map) { - o2[k] = new Map(cloneArray(Array.from(cur), cloneProto)); - } else if (cur instanceof Set) { - o2[k] = new Set(cloneArray(Array.from(cur), cloneProto)); + } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) { + o2[k] = handler(cur, cloneProto); } else if (ArrayBuffer.isView(cur)) { o2[k] = copyBuffer(cur); } else { @@ -5718,25 +5607,36 @@ function rfdc (opts) { } function rfdcCircles (opts) { - var refs = []; - var refsNew = []; + const refs = []; + const refsNew = []; + const constructorHandlers = new Map(); + constructorHandlers.set(Date, (o) => new Date(o)); + constructorHandlers.set(Map, (o, fn) => new Map(cloneArray(Array.from(o), fn))); + constructorHandlers.set(Set, (o, fn) => new Set(cloneArray(Array.from(o), fn))); + if (opts.constructorHandlers) { + for (const handler of opts.constructorHandlers) { + constructorHandlers.set(handler[0], handler[1]); + } + } + + let handler = null; return opts.proto ? cloneProto : clone function cloneArray (a, fn) { - var keys = Object.keys(a); - var a2 = new Array(keys.length); - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - var cur = a[k]; + const keys = Object.keys(a); + const a2 = new Array(keys.length); + for (let i = 0; i < keys.length; i++) { + const k = keys[i]; + const cur = a[k]; if (typeof cur !== 'object' || cur === null) { a2[k] = cur; - } else if (cur instanceof Date) { - a2[k] = new Date(cur); + } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) { + a2[k] = handler(cur, fn); } else if (ArrayBuffer.isView(cur)) { a2[k] = copyBuffer(cur); } else { - var index = refs.indexOf(cur); + const index = refs.indexOf(cur); if (index !== -1) { a2[k] = refsNew[index]; } else { @@ -5749,28 +5649,24 @@ function rfdcCircles (opts) { function clone (o) { if (typeof o !== 'object' || o === null) return o - if (o instanceof Date) return new Date(o) if (Array.isArray(o)) return cloneArray(o, clone) - if (o instanceof Map) return new Map(cloneArray(Array.from(o), clone)) - if (o instanceof Set) return new Set(cloneArray(Array.from(o), clone)) - var o2 = {}; + if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) { + return handler(o, clone) + } + const o2 = {}; refs.push(o); refsNew.push(o2); - for (var k in o) { + for (const k in o) { if (Object.hasOwnProperty.call(o, k) === false) continue - var cur = o[k]; + const cur = o[k]; if (typeof cur !== 'object' || cur === null) { o2[k] = cur; - } else if (cur instanceof Date) { - o2[k] = new Date(cur); - } else if (cur instanceof Map) { - o2[k] = new Map(cloneArray(Array.from(cur), clone)); - } else if (cur instanceof Set) { - o2[k] = new Set(cloneArray(Array.from(cur), clone)); + } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) { + o2[k] = handler(cur, clone); } else if (ArrayBuffer.isView(cur)) { o2[k] = copyBuffer(cur); } else { - var i = refs.indexOf(cur); + const i = refs.indexOf(cur); if (i !== -1) { o2[k] = refsNew[i]; } else { @@ -5785,27 +5681,23 @@ function rfdcCircles (opts) { function cloneProto (o) { if (typeof o !== 'object' || o === null) return o - if (o instanceof Date) return new Date(o) if (Array.isArray(o)) return cloneArray(o, cloneProto) - if (o instanceof Map) return new Map(cloneArray(Array.from(o), cloneProto)) - if (o instanceof Set) return new Set(cloneArray(Array.from(o), cloneProto)) - var o2 = {}; + if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) { + return handler(o, cloneProto) + } + const o2 = {}; refs.push(o); refsNew.push(o2); - for (var k in o) { - var cur = o[k]; + for (const k in o) { + const cur = o[k]; if (typeof cur !== 'object' || cur === null) { o2[k] = cur; - } else if (cur instanceof Date) { - o2[k] = new Date(cur); - } else if (cur instanceof Map) { - o2[k] = new Map(cloneArray(Array.from(cur), cloneProto)); - } else if (cur instanceof Set) { - o2[k] = new Set(cloneArray(Array.from(cur), cloneProto)); + } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) { + o2[k] = handler(cur, cloneProto); } else if (ArrayBuffer.isView(cur)) { o2[k] = copyBuffer(cur); } else { - var i = refs.indexOf(cur); + const i = refs.indexOf(cur); if (i !== -1) { o2[k] = refsNew[i]; } else {