UNPKG

@proton/ccxt

Version:

A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 130+ exchanges

172 lines (169 loc) 6.4 kB
// ---------------------------------------------------------------------------- // PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN: // https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code // EDIT THE CORRESPONDENT .ts FILE INSTEAD // @ts-nocheck const now = Date.now; // TODO: figure out how to utilize performance.now () properly – it's not as easy as it does not return a unix timestamp... const microseconds = () => now() * 1000; // TODO: utilize performance.now for that purpose const milliseconds = now; const seconds = () => Math.floor(now() / 1000); const uuidv1 = () => { const biasSeconds = 12219292800; // seconds from 15th Oct 1572 to Jan 1st 1970 const bias = biasSeconds * 10000000; // in hundreds of nanoseconds const time = microseconds() * 10 + bias; const timeHex = time.toString(16); const arranged = timeHex.slice(7, 15) + timeHex.slice(3, 7) + '1' + timeHex.slice(0, 3); // these should be random, but we're not making more than 10 requests per microsecond so who cares const clockId = '9696'; // a 14 bit number const macAddress = 'ff'.repeat(6); return arranged + clockId + macAddress; }; const setTimeout_original = setTimeout; const setTimeout_safe = (done, ms, setTimeout = setTimeout_original /* overrideable for mocking purposes */, targetTime = now() + ms) => { // avoid MAX_INT issue https://github.com/ccxt/ccxt/issues/10761 if (ms >= 2147483647) { throw new Error('setTimeout() function was called with unrealistic value of ' + ms.toString()); } // The built-in setTimeout function can fire its callback earlier than specified, so we // need to ensure that it does not happen: sleep recursively until `targetTime` is reached... let clearInnerTimeout = () => { }; let active = true; const id = setTimeout(() => { active = true; const rest = targetTime - now(); if (rest > 0) { clearInnerTimeout = setTimeout_safe(done, rest, setTimeout, targetTime); // try sleep more } else { done(); } }, ms); return function clear() { if (active) { active = false; // dunno if IDs are unique on various platforms, so it's better to rely on this flag to exclude the possible cancellation of the wrong timer (if called after completion) clearTimeout(id); } clearInnerTimeout(); }; }; class TimedOut extends Error { constructor() { const message = 'timed out'; super(message); this.constructor = TimedOut; // // @ts-expect-error this.__proto__ = TimedOut.prototype; this.message = message; } } const iso8601 = (timestamp) => { let _timestampNumber = undefined; if (typeof timestamp === 'number') { _timestampNumber = Math.floor(timestamp); } else { _timestampNumber = parseInt(timestamp, 10); } // undefined, null and lots of nasty non-numeric values yield NaN if (Number.isNaN(_timestampNumber) || _timestampNumber < 0) { return undefined; } // last line of defence try { return new Date(_timestampNumber).toISOString(); } catch (e) { return undefined; } }; const parse8601 = (x) => { if (typeof x !== 'string' || !x) { return undefined; } if (x.match(/^[0-9]+$/)) { // a valid number in a string, not a date. return undefined; } if (x.indexOf('-') < 0 || x.indexOf(':') < 0) { // no date can be without a dash and a colon return undefined; } // last line of defence try { const candidate = Date.parse(((x.indexOf('+') >= 0) || (x.slice(-1) === 'Z')) ? x : (x + 'Z').replace(/\s(\d\d):/, 'T$1:')); if (Number.isNaN(candidate)) { return undefined; } return candidate; } catch (e) { return undefined; } }; const parseDate = (x) => { if (typeof x !== 'string' || !x) { return undefined; } if (x.indexOf('GMT') >= 0) { try { return Date.parse(x); } catch (e) { return undefined; } } return parse8601(x); }; const rfc2616 = (timestamp = undefined) => new Date(timestamp).toUTCString(); const mdy = (timestamp, infix = '-') => { infix = infix || ''; const date = new Date(timestamp); const Y = date.getUTCFullYear().toString(); let m = date.getUTCMonth() + 1; let d = date.getUTCDate(); m = m < 10 ? ('0' + m) : m.toString(); d = d < 10 ? ('0' + d) : d.toString(); return m + infix + d + infix + Y; }; const ymd = (timestamp, infix, fullYear = true) => { infix = infix || ''; const date = new Date(timestamp); const intYear = date.getUTCFullYear(); const year = fullYear ? intYear : (intYear - 2000); const Y = year.toString(); let m = date.getUTCMonth() + 1; let d = date.getUTCDate(); m = m < 10 ? ('0' + m) : m.toString(); d = d < 10 ? ('0' + d) : d.toString(); return Y + infix + m + infix + d; }; const yymmdd = (timestamp, infix = '') => ymd(timestamp, infix, false); const yyyymmdd = (timestamp, infix = '-') => ymd(timestamp, infix, true); const ymdhms = (timestamp, infix = ' ') => { const date = new Date(timestamp); const Y = date.getUTCFullYear(); let m = date.getUTCMonth() + 1; let d = date.getUTCDate(); let H = date.getUTCHours(); let M = date.getUTCMinutes(); let S = date.getUTCSeconds(); m = m < 10 ? ('0' + m) : m; d = d < 10 ? ('0' + d) : d; H = H < 10 ? ('0' + H) : H; M = M < 10 ? ('0' + M) : M; S = S < 10 ? ('0' + S) : S; return Y + '-' + m + '-' + d + infix + H + ':' + M + ':' + S; }; const sleep = (ms) => new Promise((resolve) => setTimeout_safe(resolve, ms)); const timeout = async (ms, promise) => { let clear = () => { }; const expires = new Promise((resolve) => (clear = setTimeout_safe(resolve, ms))); try { return await Promise.race([promise, expires.then(() => { throw new TimedOut(); })]); } finally { clear(); // fixes https://github.com/ccxt/ccxt/issues/749 } }; export { now, microseconds, milliseconds, seconds, iso8601, parse8601, rfc2616, uuidv1, parseDate, mdy, ymd, yymmdd, yyyymmdd, ymdhms, setTimeout_safe, sleep, TimedOut, timeout, };