zeed 0.15.21 → 0.15.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/global.ts","../src/common/log/log-base.ts","../src/common/data/math.ts","../src/common/data/orderby.ts","../src/common/data/array.ts","../src/common/data/json.ts","../src/common/data/bin.ts","../src/common/data/basex.ts","../src/common/data/camelcase.ts","../src/common/data/convert.ts","../src/common/data/datauri.ts","../src/common/exec/promise.ts","../src/common/data/day.ts","../src/common/data/day-legacy.ts","../src/common/data/decimal.ts","../src/common/data/utils.ts","../src/common/data/is.ts","../src/common/data/deep.ts","../src/common/data/diff.ts","../src/common/data/html.ts","../src/common/data/list.ts","../src/common/data/object.ts","../src/common/data/regexp.ts","../src/common/data/path.ts","../src/common/data/rounding.ts","../src/common/data/sortable.ts","../src/common/data/sorted.ts","../src/common/data/string-deburr.ts","../src/common/data/url.ts","../src/common/data/wordlist.ts","../src/common/data/xrx.ts","../src/common/log/log-filter.ts","../src/common/log/log-console.ts","../src/common/log/log-context.ts","../src/common/log/log.ts","../src/common/log/log-colors.ts","../src/common/time.ts","../src/common/log/log-memory.ts","../src/common/assert.ts","../src/common/bin/lib0/create.ts","../src/common/bin/lib0/string.ts","../src/common/bin/lib0/encoding.ts","../src/common/bin/lib0/decoding.ts","../src/common/bin/index.ts","../src/common/crypto.ts","../src/common/csv.ts","../src/common/dispose-defer.ts","../src/common/exec/mutex.ts","../src/common/msg/emitter.ts","../src/common/uuid.ts","../src/common/msg/channel.ts","../src/common/msg/encoder.ts","../src/common/msg/messages.ts","../src/common/msg/pubsub.ts","../src/common/msg/rpc.ts","../src/common/exec/progress.ts","../src/common/exec/pool.ts","../src/common/exec/queue.ts","../src/common/exec/throttle-debounce.ts","../src/common/dispose-utils.ts","../src/common/localhost.ts","../src/common/network.ts","../src/common/platform.ts","../src/common/storage/memstorage.ts","../src/common/utils.ts"],"names":["_global","__name","getGlobalContext","defaultValue","gcontext","LogLevelAll","LogLevelDebug","LogLevelInfo","LogLevelWarn","LogLevelError","LogLevelFatal","LogLevelOff","LogLevelAlias","getSecureRandom","getSecureRandomIfPossible","randomBoolean","bias","randomInt","max","min","randomFloat","between","value","sum","array","acc","avg","isPrimeRX","isPrime","i","_seed","seededRandom","seed","rnd","parseOrderby","field","orderby","composeOrderby","asc","cmp","a","b","aa","bb","sortedOrderby","values","orderByList","sortValues","result","arrayUnique","x","n","index","arrayMinus","y","arrayUnion","arrayFlatten","list","arrayIntersection","arraySymmetricDifference","arrayRemoveElement","arr","el","arraySetElement","arrayFilterInPlace","fn","arrayToggleInPlace","e","arrayEmptyInPlace","arraySetArrayInPlace","newContent","arraySorted","cond","arraySortedNumbers","l","r","arrayIsEqual","array1","array2","arrayShuffleInPlace","arrayShuffle","arrayShuffleForce","copy","arrayRandomElement","arrayMax","arrayMin","arraySum","arrayAvg","flatArray","arrayBatches","chunckLength","chunks","createArray","length","item","_sortedReplacer","key","sorted","jsonStringifySorted","obj","indent","serializer","replacer","cycleReplacer","stack","keys","_key","thisPos","jsonStringifySafe","spaces","jsonStringify","_encodeUtf8Polyfill","str","encodedString","len","buf","_decodeUtf8Polyfill","remainingLen","bufPos","nextLen","bytes","_textEncoder","stringToUInt8Array","text","encoder","data","_textDecoder","Uint8ArrayToString","bin","decoder","toUint8Array","joinToUint8Array","args","bins","d","cursor","toHex","h","s","v","fromHex","hexString","byte","toBase64","stripPadding","sb","toBase64Url","fromBase64","fromBase64String","equalBinary","jsonToUint8Array","json","Uint8ArrayToJson","Uint8ArrayToHexDump","buffer","blockSize","lines","hex","block","addr","codes","ch","code","chars","alphabets","_useBase","alphaOrBase","ALPHABET","BASE_MAP","j","xc","BASE","LEADER","FACTOR","iFACTOR","encode","source","padToLength","pbegin","pend","size","dataEncoded","carry","it1","it2","decode","psz","dataDecoded","it3","it4","cache","useBase","getFromCache","encodeBase32","padding","decodeBase32","encodeBase16","decodeBase16","encodeBase58","decodeBase58","encodeBase62","decodeBase62","estimateSizeForBase","base","toCamelCase","$0","$1","toCapitalize","toCapitalizeWords","fromCamelCase","separator","TRUE_VALUES_LIST","stringToBoolean","stringToInteger","stringToFloat","valueToBoolean","valueToInteger","valueToFloat","valueToString","toFloat","toInt","toString","toBool","formatMessages","messages","opt","trace","pretty","renderMessages","fixBrokenUth8String","brokenString","dataUriToUint8Array","dataUri","dataUriToMimeType","dataUriToBlob","mimeString","base64String","blobToDataUri","blob","Uint8ArrayToDataUri","type","createPromise","resolve","reject","_resolve","_reject","sleep","milliSeconds","immediate","timeout","promise","timeoutValue","done","err","isTimeout","tryTimeout","waitOn","event","timeoutMS","timer","isPromise","promisify","DAY_MS","dayYear","day","dayMonth","dayDay","dayToParts","dayToDate","gmt","dayToString","dayFromToday","dayFromDate","dayFromAny","dayFromString","year","month","dayFromParts","dayToDateGMT","date","dayFromDateGMT","dayToTimestamp","dayFromTimestamp","ms","sep","baseString","string","dayMonthStart","offset","dayYearStart","dayOffset","dayDiff","left","right","dayRange","dayIterator","_Day","days","dateString","m","mm","yy","otherDay","Day","forEachDay","from","to","handler","start","end","today","dateStringToDays","decimal","decimalPlaces","decimalFromCents","decimalToCents","decimalCentsPart","ensureKey","createFn","ensureKeyAsync","first","last","empty","cloneObject","cloneJsonObject","memoize","memoizeAsync","forTimes","count","isObject","isPrimitive","isArray","isRecord","isRecordPlain","isString","isNumber","isInteger","isSafeInteger","isBoolean","isNullOrUndefined","isNull","isUint8Array","isNotNull","isEmpty","isNotEmpty","isValue","isTruthy","deepEqual","hash","p","deepStripUndefinedInPlace","deepMerge","target","sources","targetValue","sourceValue","diffObjects","newObj","options","_stack","diffs","isObjArray","objValue","path","newValue","areObjects","nestedDiffs","difference","isNewObjArray","escapeHTML","unescapeHTML","listQuery","filters","mappers","listGroupBy","currentValue","groupValue","listDistinctUnion","listOfKey","objectMap","k","objectMergeDisposable","objectIsEmpty","rxEscape","escapeRegExp","MAX_FILENAME_LENGTH","reRelativePath","reTrailingPeriods","reFilenameIllegal","filenameReservedRegex","windowsReservedNameRegex","toValidFilename","replacement","reReplacement","isHalf","isEven","roundUp","roundDown","roundHalfUp","roundHalfOdd","rounded","roundHalfAwayFromZero","roundHalfDown","roundHalfEven","roundHalfTowardsZero","startSortWeight","items","endSortWeight","moveSortWeight","newIndex","oldIndex","moveLower","sortedItems","step","lower","distance","middle","fuzzy","useSorted","config","getter","upper","move","sortableItems","basePropertyOf","object","deburredLetters","deburrLetter","reLatin","rsComboMarksRange","reComboHalfMarksRange","rsComboSymbolsRange","rsComboMarksExtendedRange","rsComboMarksSupplementRange","rsComboRange","rsCombo","reComboMark","deburr","findURL","linkifyPlainText","part","escapedPart","toHumanReadableUrl","url","encodeQuery","filterValue","pairs","parseQuery","queryString","query","pair","wordsEven","wordsOdd","Uint8ArrayToWords","sepPair","sepGroup","pos","wordsToUint8Array","words","w","wl","RX_WHITESPACE","RX_REAL_GROUPS","RX_LOOK_BEHIND","regExpString","rx","regExpEscape","_XRX","pattern","flags","_flags","_rx","name","parts","leftContext","matches","XRX","getNamespaceFilterString","defaultNamespaceFilter","getDefaultNamespaceFilter","useNamespaceFilter","filter","accept","_name","split","template","getDefaultLevelFilter","parseLogLevel","useLevelFilter","filterLevel","level","joinLogStrings","LoggerConsoleHandler","matchesNamespace","matchesLevel","msg","LoggerContext","_prefix","logHandlers","logCheckNamespace","logLock","logFactory","LoggerBaseFactory","logDebug","logLevel","defineForLogLevel","fnLevel","emit","log","prefix","condition","Logger","namespaces","lock","debug","handlers","factory","globalLogger","getLoggerContext","setup","logger","getGlobalLogger","getGlobalLoggerIfExists","DefaultLogger","colors","browserSelectColorByName","namespace","getTimestamp","formatMilliseconds","parseDate","dateCandidates","dateCandidate","getPerformanceTimestamp","duration","t0","LoggerMemoryHandler","fatal","assert","assertCondition","createUint8ArrayViewFromArrayBuffer","byteOffset","fromCharCode","fromCodePoint","utf8TextEncoder","getUtf8TextEncoder","encodeUtf8","utf8TextDecoder","getUtf8TextDecoder","_Encoder","Encoder","createEncoder","encodeToUint8Array","uint8arr","curPos","verifyLen","bufferLen","write","num","writeUint8","writeUint16","writeUint32","writeVarUint","isNegativeZero","writeVarInt","isNegative","writeUint8Array","uint8Array","cpos","leftCopyLen","rightCopyLen","writeVarUint8Array","_strBuffer","_maxStrBSize","_writeVarStringNative","written","_writeVarStringPolyfill","writeVarString","writeOnDataView","dview","writeFloat32","writeFloat64","writeBigInt64","floatTestBed","isFloat32","writeAny","errorUnexpectedEndOfArray","errorIntegerOutOfRange","_Decoder","Decoder","createDecoder","readUint8Array","view","readVarUint","mult","readVarUint8Array","readUint8","readUint16","uint","readUint32","readVarInt","sign","_readVarStringPolyfill","readVarString","readFromDataView","dv","readFloat32","readFloat64","readBigInt64","readAnyLookupTable","_","readAny","_BinaryEncoder","dataEncoder","BinaryEncoder","encodeJson","decodeJson","createBinaryStreamEncoder","initialData","expectedLength","createBinaryStreamDecoder","dataDecoder","bitfield","bit","blobToArrayBuffer","blobToUint8Array","randomUint8Array","randomBytes","CRYPTO_DEFAULT_HASH_ALG","CRYPTO_DEFAULT_ALG","CRYPTO_DEFAULT_DERIVE_ALG","CRYPTO_DEFAULT_DERIVE_ITERATIONS","digest","message","algorithm","deriveKeyPbkdf2","secret","secretBuffer","keyMaterial","getMagicId","encrypt","MAGIC_ID","iv","cipher","binCypher","bufferLength","decrypt","magic","plain","defaultSeparator","csvStringify","body","csvParse","raw","rxOneValueWithSeparator","row","csvParseToObjects","header","callDisposer","disposable","useDispose","disposed","tracked","untrack","track","dispose","strictSync","promises","disposeSync","useDefer","mode","steps","exec","expectSync","useMutex","token","elseFn","executed","useAsyncMutex","_Emitter","ok","subscribers","all","priority","slen","sobj","listener","onceListener","f","Emitter","getGlobalEmitter","emitter","uuidBytesLength","uuidBytes","uuidB62","uuidEncodeB62","uuidDecodeB62","uuid","uuidB32","uuidEncodeB32","uuidDecodeB32","uuidv4","c","uuidEncodeV4","id","uuidDecodeV4","ReferenceDateInMS","longToByteArray","long","byteArray","suidBytes","suid","uuidEncode","suidDate","suidBytesDate","uuidDecode","uuid32bit","mapModes","_mode","_sorted","setUuidDefaultEncoding","uuidIsValid","_unameCounters","uname","_qid","qid","_Channel","Channel","_LocalChannel","LocalChannel","createLocalChannelPair","w1","w2","_NoopEncoder","NoopEncoder","_JsonEncoder","JsonEncoder","_CryptoEncoder","CryptoEncoder","createPromiseProxy","predefinedMethods","useMessageHub","retryAfter","ignoreUnhandled","channel","queue","queueRetryTimer","waitingForResponse","postNext","postMessage","connect","newChannel","error","fetchMessage","newHandlers","perCallopt","_PubSub","info","PubSub","usePubSub","rpcCounter","defaultSerialize","defaultDeserialize","setupRPCBasic","functions","eventNames","post","on","serialize","deserialize","rpcPromiseMap","method","sendEvent","sendCall","useRPC","proxyHandler","useRPCHub","createRPCProxy","additionalFunctions","additionalEventNames","_Progress","child","progress","units","completedUnits","Progress","usePool","maxParallel","idConflictResolution","events","cancelAll","countMax","countResolved","currentParallel","tasks","waitFinishAll","cleanupFinished","didFinish","didUpdate","presentMax","presentResolved","resolved","state","performNext","waitingTasks","t","taskInfo","tt","taskFinished","cancel","hasById","enqueue","task","resolution","runningTask","taskProgress","inc","_SerialQueue","_unblock","resolver","SerialQueue","throttle","callback","delay","trailing","leading","timeoutID","checkpoint","visited","trailingExec","clearExistingTimeout","wrapper","now","elapsed","debounce","running","lastArguments","useTimeout","timeoutHandle","useInterval","interval","intervalHandle","useIntervalPause","immediately","stop","loop","useEventListener","eventName","useEventListenerOnce","useDisposeWithUtils","isLocalHost","hostname","defaultOptions","parseBasicAuth","username","password","fetchBasic","fetchOptions","fetchFn","auth","fetchOptionsBasicAuth","response","fetchJson","res","fetchText","fetchOptionsFormURLEncoded","fetchOptionsJson","getWindow","getNavigator","getGlobal","detect","_navigator","_window","isBrowser","useExitHandler","_MemStorage","_opt","MemStorage","noop"],"mappings":"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EAAAua,GAAA,kBAKT,IAAME,GAAkB,CAEtB,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,KACH,OAAG,KACH,OAAG,KACH,OAAG,KACH,OAAG,KAEH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG,IACH,OAAG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aAAc,UAAW,YAAa,SAAU,WAAY,SAAU,YAAa,UAAW,YAAa,SAAU,YAAa,UAAW,WAAY,WAAY,aAAc,UAAW,UAAW,YAAa,WAAY,cAAe,WAAY,YAAa,aAAc,aAAc,WAAY,YAAa,YAAa,aAAc,cAAe,YAAa,UAAW,YAAa,aAAc,YAAa,UAAW,YAAa,YAAa,YAAa,UAAW,cAAe,WAAY,UAAW,YAAa,YAAa,aAAc,WAAY,UAAW,YAAa,aAAc,aAAc,aAAc,aAAc,YAAa,aAAc,YAAa,YAAa,aAAc,YAAa,aAAc,WAAY,SAAU,YAAa,WAAY,UAAW,YAAa,WAAY,YAAa,YAAa,WAAY,WAAY,YAAa,UAAW,YAAa,aAAc,aAAc,WAAY,WAAY,WAAY,aAAc,aAAc,aAAc,WAAY,YAAa,WAAY,SAAU,WAAY,UAAW,YAAa,SAAU,YAAa,WAAY,UAAW,UAAW,YAAa,YAAa,WAAY,YAAa,UAAW,WAAY,WAAY,WAAY,UAAW,YAAa,YAAa,WAAY,YAAa,YAAa,aAAc,aAAc,WAAY,WAAY,WAAY,YAAa,YAAa,YAAa,UAAW,YAAa,SAAU,UAAW,UAAW,UAAW,YAAa,YAAa,YAAa,YAAa,YAAa,YAAa,WAAY,UAAW,UAAW,UAAW,aAAc,UAAW,WAAY,aAAc,WAAY,SAAU,UAAW,aAAc,YAAa,YAAa,cAAe,UAAW,WAAY,WAAY,WAAY,UAAW,WAAY,WAAY,YAAa,SAAU,aAAc,YAAa,UAAW,OAAQ,WAAY,UAAW,UAAW,aAAc,UAAW,WAAY,UAAW,cAAe,UAAW,YAAa,YAAa,YAAa,WAAY,UAAW,YAAa,aAAc,cAAe,WAAY,WAAY,aAAc,UAAW,YAAa,aAAc,WAAY,SAAU,YAAa,WAAY,aAAc,YAAa,UAAW,YAAa,UAAW,WAAY,YAAa,YAAa,SAAU,UAAW,YAAa,UAAW,YAAa,WAAY,aAAc,aAAc,YAAa,aAAc,UAAW,UAAW,WAAY,SAAU,aAAc,WAAY,WAAY,WAAY,YAAa,YAAa,WAAY,WAAY,aAAc,YAAa,cAAe,aAAc,aAAc,YAAa,aAAc,WAAY,aAAc,YAAa,YAAa,UAAW,YAAa,WAAY,UAAW,YAAa,WAAY,aAAc,YAAa,aAAc,WAAY,YAAa,YAAa,UAAW,QAAS,WAAY,UAAW,WAAY,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","sourcesContent":["/* eslint-disable no-restricted-globals */\n\n// Global context across build systems etc.\n\ndeclare global {\n interface ZeedGlobalContext {}\n}\n\ninterface ZeedGlobalIntegration {\n _zeedGlobal?: ZeedGlobalContext\n}\n\n/** Identify the right global for the environment. Might be obsolete these days, due to globalThis. */\nfunction _global(): ZeedGlobalIntegration {\n if (typeof self !== 'undefined')\n return self as ZeedGlobalIntegration\n if (typeof window !== 'undefined')\n return window as ZeedGlobalIntegration\n if (typeof global !== 'undefined')\n return global as ZeedGlobalIntegration\n if (typeof globalThis !== 'undefined')\n return globalThis as ZeedGlobalIntegration\n throw new Error('unable to locate global object')\n}\n\n/** Global object to work across module boundaries as well. Internally already used for logger and emitter. */\nexport function getGlobalContext<T = ZeedGlobalContext>(defaultValue = {}): T {\n const gcontext = _global()\n if (gcontext._zeedGlobal == null)\n gcontext._zeedGlobal = defaultValue\n return gcontext._zeedGlobal as T\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport type LogLevel = number\n\nexport const LogLevelAll = -1\nexport const LogLevelDebug = 0\nexport const LogLevelInfo = 1\nexport const LogLevelWarn = 2\nexport const LogLevelError = 3\nexport const LogLevelFatal = 4\nexport const LogLevelOff = 9007199254740991 // `Infinity` === `1 / 0`, but bad for sideEffects, therefore `Math.pow(2, 53) - 1`\n\nexport const LogLevelAlias: Record<string, LogLevel> = {\n '*': LogLevelAll,\n 'a': LogLevelAll,\n 'all': LogLevelAll,\n 'd': LogLevelDebug,\n 'dbg': LogLevelDebug,\n 'debug': LogLevelDebug,\n 'i': LogLevelInfo,\n 'inf': LogLevelInfo,\n 'info': LogLevelInfo,\n 'w': LogLevelWarn,\n 'warn': LogLevelWarn,\n 'warning': LogLevelWarn,\n 'e': LogLevelError,\n 'err': LogLevelError,\n 'error': LogLevelError,\n 'fatal': LogLevelFatal,\n 'off': LogLevelOff,\n '-': LogLevelOff,\n}\n\nexport type LogLevelAliasKey = keyof typeof LogLevelAlias\nexport type LogLevelAliasType = number | boolean | LogLevelAliasKey\n\nexport interface LogMessage {\n level: LogLevel\n name: string\n messages: any[]\n line?: number\n file?: string\n timestamp?: number\n}\n\nexport type LogHandler = (msg: LogMessage) => void\n\nexport interface LoggerInterface {\n (...messages: any[]): void\n\n /** @deprecated use .level = LogLevel.off or LogLevel.all */\n active: boolean\n\n level: LogLevel\n\n debug(...messages: any[]): void\n\n info(...messages: any[]): void\n\n warn(...messages: any[]): void\n\n error(...messages: any[]): void\n\n /**\n * Throws if condition is not truthy.\n *\n * **Attention!** Due to a bug in typescript you will need to explicitly set the `LoggerInterface` type in\n * order to have the assertions having an effect on unreachable code. Example:\n *\n * ```ts\n * const log: LoggerInterface = Logger('xxx')\n * ```\n *\n * Bug https://github.com/microsoft/TypeScript/issues/50363#issuecomment-1219811447\n */\n assert(condition: unknown, ...messages: any[]): asserts condition\n\n /**\n * Always throws.\n *\n * **Attention!** Due to a bug in typescript you will need to explicitly set the `LoggerInterface` type in\n * order to have the assertions having an effect on unreachable code. Example:\n *\n * ```ts\n * const log: LoggerInterface = Logger('xxx')\n * ```\n *\n * Bug https://github.com/microsoft/TypeScript/issues/50363#issuecomment-1219811447\n */\n fatal(...messages: any[]): never\n\n extend(prefix: string): LoggerInterface\n\n factory?: LoggerContextInterface\n\n label: string\n}\n\nexport interface LoggerContextInterface {\n (name?: string, level?: LogLevelAliasType): LoggerInterface\n\n registerHandler(handler: LogHandler): void\n\n setFilter(namespaces: string): void\n\n setHandlers(handlers?: (LogHandler | undefined | null)[]): void\n\n setLock(lock: boolean): void\n\n /** When true emits a short log message for each Logger when being set up first time. */\n setDebug(debug: boolean): void\n\n setLogLevel(level?: LogLevel): void\n\n setFactory(factory: (name?: string) => LoggerInterface): void\n}\n\nexport interface LogHandlerOptions {\n level?: LogLevel\n filter?: string\n colors?: boolean\n levelHelper?: boolean\n nameBrackets?: boolean\n padding?: number\n fill?: number\n stack?: boolean | number\n time?: boolean\n pretty?: boolean\n}\n","export function getSecureRandom(): number {\n return crypto.getRandomValues(new Uint32Array(1))[0] / 0xFFFFFFFF\n}\n\nexport function getSecureRandomIfPossible(): number {\n return typeof crypto !== 'undefined' ? getSecureRandom() : Math.random()\n}\n\nexport function randomBoolean(bias = 0.25): boolean {\n return getSecureRandomIfPossible() < bias\n}\n\n/** max is not included, min is included */\nexport function randomInt(max = 100, min = 0): number {\n return min + Math.floor(getSecureRandomIfPossible() * (max - min))\n}\n\nexport function randomFloat(max = 100, min = 0): number {\n return min + getSecureRandomIfPossible() * (max - min)\n}\n\nexport function between(min: number, value: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\n/** See also arraySum */\nexport function sum(array: number[]): number {\n return array.reduce((acc, value) => acc + value, 0)\n}\n\n/** See also arrayAvg */\nexport function avg(array: number[]): number {\n return sum(array) / array.length\n}\n\n// export const clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n))\n\n// https://www.noulakaz.net/2007/03/18/a-regular-expression-to-check-for-prime-numbers/\n/** Fancy prime number check ;) */\nexport function isPrimeRX(value: number): boolean {\n return !/^1?$|^(11+?)\\1+$/.test('1'.repeat(value))\n}\n\nexport function isPrime(value: number): boolean {\n for (let i = 2; i < value; i++) {\n if (value % i === 0)\n return false\n }\n return value > 1\n}\n\n// http://indiegamr.com/generate-repeatable-random-numbers-in-js/\n// https://softwareengineering.stackexchange.com/questions/260969/original-source-of-seed-9301-49297-233280-random-algorithm\n\nlet _seed = 6\n\n/** Deterministic random */\nexport function seededRandom(max = 0, min = 1, seed?: number) {\n _seed = ((seed ?? _seed) * 9301 + 49297) % 233280\n const rnd = _seed / 233280\n return min + rnd * (max - min)\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function parseOrderby(value = ''): {\n field: string\n orderby: string\n asc: boolean\n desc: boolean\n} {\n let [field = '', orderby = 'asc'] = value.split(' ')\n orderby = orderby.toLowerCase()\n return {\n field,\n orderby,\n asc: orderby !== 'desc',\n desc: orderby === 'desc',\n }\n}\n\nexport function composeOrderby(field: string, asc = true): string {\n return `${field} ${asc ? 'asc' : 'desc'}`\n}\n\n// Classic compare function with direction flag\nexport function cmp(a: any, b: any, asc = true): -1 | 0 | 1 {\n const aa = a || 0\n const bb = b || 0\n return aa > bb ? (asc ? 1 : -1) : aa < bb ? (asc ? -1 : 1) : 0\n}\n\n// todo: support localeCompare()\nexport function sortedOrderby<T>(values: T[], ...orderby: string[]): T[] {\n if (orderby.length > 0) {\n const orderByList = orderby.map(parseOrderby)\n // let { field, asc } = parseOrderby(orderby)\n // if (field != null && typeof field === \"string\") {\n // let bigger = asc ? 1 : -1\n // let smaller = asc ? -1 : 1\n const sortValues = Array.from(values)\n sortValues.sort((a: any, b: any): number => {\n for (const { field, asc } of orderByList) {\n const result = cmp(a[field], b[field], asc)\n if (result !== 0)\n return result\n }\n return 0\n // const aa = a[field] || 0\n // const bb = b[field] || 0\n // return aa > bb ? bigger : aa < bb ? smaller : 0\n })\n return sortValues\n }\n return values\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable no-cond-assign */\n\nimport type { NestedArray } from '../types'\nimport { getSecureRandomIfPossible } from './math'\nimport { cmp } from './orderby'\n\nexport function arrayUnique<T>(x: T[]): T[] {\n return x.filter((n: any, index: any) => x.indexOf(n) === index)\n}\n\nexport function arrayMinus<T>(x: T[], y: T[]): T[] {\n return arrayUnique(x.filter((n: any) => !y.includes(n)))\n}\n\nexport function arrayUnion<T>(...a: T[][]): T[] {\n return arrayUnique(a.reduce((acc: T[] = [], value) => acc.concat(value), []))\n}\n\n/** `[1,[2,3]]` becomes `[1,2,3]` */\nexport function arrayFlatten<T>(...list: NestedArray<T>[]): T[] {\n return (list as any).flat(Number.POSITIVE_INFINITY)\n}\n\nexport function arrayIntersection<T>(x: T[], y: T[]): T[] {\n return arrayUnique<T>(x).filter((n: any) => y.includes(n))\n}\n\nexport function arraySymmetricDifference<T>(x: T[], y: T[]): T[] {\n return arrayMinus(arrayUnion(x, y), arrayIntersection(x, y))\n // return arrayUnique(x.filter(n => !y.includes(n)).concat(y.filter(n => !x.includes(n))))\n}\n\n// export function arrayApply<T>(fn: any, a: T[]): T[] {\n// return a.reduce(fn, [])\n// }\n\nexport function arrayRemoveElement<T>(arr: T[], el: T): T[] {\n if (arr && Array.isArray(arr)) {\n let index\n while ((index = arr.indexOf(el)) !== -1)\n arr.splice(index, 1)\n return arr\n }\n return []\n}\n\n/** Only have it once in the set */\nexport function arraySetElement<T>(arr: T[], el: T): T[] {\n if (!arr.includes(el))\n arr.push(el)\n return arr\n}\n\n// via https://stackoverflow.com/a/49587869 and Erwin\nexport function arrayFilterInPlace<T>(array: T[], fn: (el: T) => boolean): T[] {\n array.splice(0, array.length, ...array.filter(fn))\n return array\n}\n\n// via https://stackoverflow.com/a/49587869 and Erwin\nexport function arrayToggleInPlace<T>(array: T[], el: T): T[] {\n const index = array.findIndex(e => e === el)\n if (index >= 0)\n array.splice(index, 1)\n else array.push(el)\n return array\n}\n\nexport function arrayEmptyInPlace<T>(array: T[]): T[] {\n array.splice(0, array.length)\n return array\n}\n\nexport function arraySetArrayInPlace<T>(array: T[], newContent: T[]): T[] {\n array.splice(0, array.length, ...newContent)\n return array\n}\n\nexport function arraySorted<T>(\n arr: Iterable<T> | ArrayLike<T>,\n cond: ((a: T, b: T) => number) | undefined = cmp,\n): T[] {\n return Array.from(arr).sort(cond)\n}\n\nexport function arraySortedNumbers(arr: number[]): number[] {\n return arraySorted(arr, (l: number, r: number) => l - r)\n}\n\nexport function arrayIsEqual<T>(array1: T[], array2: T[]): boolean {\n return (\n array1.length === array2.length\n && array1.every((value, index) => value === array2[index])\n )\n}\n\nexport function arrayShuffleInPlace<T>(array: T[]): T[] {\n array.sort(() => (getSecureRandomIfPossible() > 0.5 ? 1 : -1))\n\n // Alternative https://github.com/sindresorhus/array-shuffle/blob/main/index.js#L8\n // for (let index = array.length - 1; index > 0; index--) {\n // const newIndex = Math.floor(Math.random() * (index + 1));\n // [array[index], array[newIndex]] = [array[newIndex], array[index]];\n // }\n\n return array\n}\n\nexport function arrayShuffle<T>(array: T[]): T[] {\n return arrayShuffleInPlace(Array.from(array))\n}\n\n/** Randomly shuffle the order of the array's elements. Force to have a different order if array has more than one element. */\nexport function arrayShuffleForce<T>(array: T[]): T[] {\n while (array.length > 1) {\n const copy = Array.from(array)\n arrayShuffleInPlace(copy)\n if (!arrayIsEqual(array, copy))\n return copy\n }\n return array\n}\n\nexport function arrayRandomElement<T>(array: T[]): T {\n return array[Math.floor(getSecureRandomIfPossible() * array.length)]\n}\n\nexport function arrayMax<T>(...array: NestedArray<T>[]): T {\n return arrayFlatten(array).reduce(\n (acc: T, value: T) => (acc != null ? (value > acc ? value : acc) : value),\n undefined as T,\n )\n}\n\nexport function arrayMin<T>(...array: NestedArray<T>[]): T {\n return arrayFlatten(array).reduce(\n (acc: T, value: T) => (acc != null ? (value < acc ? value : acc) : value),\n undefined as T,\n )\n}\n\nexport function arraySum(...array: NestedArray<number>[]): number {\n return arrayFlatten(array).reduce((acc, value) => acc + value, 0)\n}\n\nexport function arrayAvg(...array: NestedArray<number>[]): number {\n const flatArray = arrayFlatten(array)\n return flatArray.reduce((acc, value) => acc + value, 0) / flatArray.length\n}\n\nexport function arrayBatches<T>(array: T[], chunckLength: number): T[][] {\n const chunks = []\n let i = 0\n const n = array.length\n while (i < n)\n chunks.push(array.slice(i, (i += chunckLength)))\n return chunks\n}\n\nexport function createArray<T>(\n length = 0,\n item?: T | ((index: number) => T), // todo remove optional\n): T[] {\n if (length <= 0)\n return []\n const arr: T[] = Array.from({ length })\n for (let i = 0; i < length; i++)\n // @ts-expect-error xxx\n arr[i] = item instanceof Function ? item(i) : item\n return arr\n}\n","// From https://github.com/moll/json-stringify-safe License ISC\n\nconst _sortedReplacer: EntryProcessor = (key: string, value: any) =>\n (value instanceof Object && !(Array.isArray(value)))\n ? Object.keys(value)\n .sort()\n // .filter((key) => value[key] != null) // Remove null and undefined\n .reduce((sorted: any, key: string) => {\n // Sorted copy\n sorted[key] = value[key]\n return sorted\n }, {})\n : value\n\n// https://gist.github.com/davidfurlong/463a83a33b70a3b6618e97ec9679e490\nexport function jsonStringifySorted(\n obj: any,\n indent: number | undefined = undefined,\n) {\n return JSON.stringify(obj, _sortedReplacer, indent)\n}\n\n//\n\ntype EntryProcessor = (key: string, value: any) => any\n\nfunction serializer(replacer?: EntryProcessor, cycleReplacer?: EntryProcessor) {\n const stack: any[] = []\n const keys: string[] = []\n\n if (cycleReplacer == null) {\n cycleReplacer = function (_key, value) {\n if (stack[0] === value)\n return '[Circular ~]'\n return (\n `[Circular ~.${keys.slice(0, stack.indexOf(value)).join('.')}]`\n )\n }\n }\n\n return function (this: EntryProcessor, key: string, value: any): any {\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this)\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)\n ~thisPos ? keys.splice(thisPos, Number.POSITIVE_INFINITY, key) : keys.push(key)\n if (~stack.indexOf(value))\n value = cycleReplacer?.call(this, key, value)\n }\n else {\n stack.push(value)\n }\n\n try {\n return replacer == null ? value : replacer.call(this, key, value)\n }\n catch (err) { }\n return String(value)\n }\n}\n\n/**\n * Similar to JSON.stringify but can handle circular references.\n * NOT SORTED!\n * From https://github.com/moll/json-stringify-safe/blob/master/stringify.js\n * License ISC\n */\nexport function jsonStringifySafe(\n obj: any,\n replacer?: EntryProcessor | null | undefined,\n spaces?: string | number | null,\n cycleReplacer?: EntryProcessor,\n): string {\n return JSON.stringify(\n obj,\n serializer(replacer ?? undefined, cycleReplacer),\n spaces ?? undefined)\n}\n\nexport const jsonStringify = jsonStringifySafe\n\n//\n\n// From https://github.com/unjs/destr MIT\n// https://github.com/fastify/secure-json-parse\n// https://github.com/hapijs/bourne\nconst suspectProtoRx = /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*:/\nconst suspectConstructorRx = /\"(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)\"\\s*:/\n\nconst JsonSigRx = /^[\"{[]|^-?[0-9][0-9.]{0,14}$/\n\nfunction jsonParseTransform(key: string, value: any): any {\n if (key === '__proto__' || key === 'constructor')\n return\n\n return value\n}\n\nexport default function jsonParse(val: string): any {\n if (typeof val !== 'string')\n return val\n\n const _lval = val.toLowerCase()\n if (_lval === 'true')\n return true\n\n if (_lval === 'false')\n return false\n\n if (_lval === 'null')\n return null\n\n if (_lval === 'nan')\n return Number.NaN\n\n if (_lval === 'infinity')\n return Number.POSITIVE_INFINITY\n\n if (_lval === 'undefined')\n return undefined\n\n if (!JsonSigRx.test(val))\n return val\n\n try {\n if (suspectProtoRx.test(val) || suspectConstructorRx.test(val))\n return JSON.parse(val, jsonParseTransform)\n\n return JSON.parse(val)\n }\n catch (_e) {\n return val\n }\n}\n","/* eslint-disable node/prefer-global/buffer */\n/* eslint-disable no-control-regex */\n/* eslint-disable prefer-spread */\n\nimport { jsonStringifySafe } from './json'\n\nexport type BinInput = Uint8Array | ArrayBuffer | string | number[]\n\n// From https://github.com/dmonad/lib0/blob/main/string.js#L44\n\nexport function _encodeUtf8Polyfill(str: string): Uint8Array {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n const buf = new Uint8Array(len)\n for (let i = 0; i < len; i++)\n buf[i] = encodedString.codePointAt(i) || 0\n return buf\n}\n\nexport function _decodeUtf8Polyfill(buf: Uint8Array) {\n let remainingLen = buf.length\n let encodedString = ''\n let bufPos = 0\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n const bytes = buf.subarray(bufPos, bufPos + nextLen)\n bufPos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n // @ts-expect-error xxx\n encodedString += String.fromCodePoint.apply(null, bytes)\n remainingLen -= nextLen\n }\n return decodeURIComponent(escape(encodedString))\n}\n\nlet _textEncoder: (data: string) => Uint8Array\n\nexport function stringToUInt8Array(text: string): Uint8Array {\n if (_textEncoder == null) {\n _textEncoder = _encodeUtf8Polyfill\n if (typeof TextEncoder !== 'undefined') {\n const encoder = new TextEncoder()\n _textEncoder = data => encoder.encode(data)\n }\n }\n return _textEncoder(text.normalize('NFC'))\n}\n\nlet _textDecoder: (data: Uint8Array) => string\n\nexport function Uint8ArrayToString(bin: Uint8Array): string {\n if (_textDecoder == null) {\n _textDecoder = _decodeUtf8Polyfill\n if (typeof TextDecoder !== 'undefined') {\n const decoder = new TextDecoder('utf-8', { ignoreBOM: true })\n _textDecoder = data => decoder.decode(data)\n }\n }\n return _textDecoder(bin).normalize('NFC')\n}\n\nexport function toUint8Array(data: BinInput): Uint8Array {\n if (data instanceof ArrayBuffer)\n return new Uint8Array(data)\n if (typeof data === 'string')\n return stringToUInt8Array(data)\n if (data.length)\n return new Uint8Array(data)\n return data as Uint8Array\n}\n\nexport function joinToUint8Array(...args: BinInput[] | BinInput[][]) {\n let length = 0\n const bins = args.flat(1).map((d) => {\n const b = toUint8Array(d as BinInput)\n length += b.length\n return b\n })\n const bin = new Uint8Array(length)\n let cursor = 0\n for (const b of bins) {\n bin.set(b, cursor)\n cursor += b.length\n }\n return bin\n}\n\nexport function toHex(bin: BinInput): string {\n if (typeof Buffer !== 'undefined')\n return Buffer.from(toUint8Array(bin)).toString('hex')\n const h = '0123456789abcdef'\n let s = ''\n for (const v of [...toUint8Array(bin)])\n s += h[v >> 4] + h[v & 15]\n return s\n}\n\nexport function fromHex(hexString: string): Uint8Array {\n return Uint8Array.from(\n hexString.match(/.{1,2}/g)!.map(byte => Number.parseInt(byte, 16)),\n )\n}\n\n// Learn about Base64 in browsers: https://web.dev/articles/base64-encoding\n\n/** Regular base64 */\nexport function toBase64(bin: BinInput, stripPadding = false): string {\n const bytes = toUint8Array(bin)\n let sb = ''\n if (typeof Buffer !== 'undefined') {\n sb = Buffer.from(bytes).toString('base64')\n }\n else {\n let s = ''\n for (let i = 0; i < bytes.byteLength; i++)\n s += String.fromCharCode(bytes[i])\n sb = btoa(s)\n }\n if (stripPadding)\n return sb.replaceAll('=', '')\n return sb\n}\n\n/** Converts `+` -> `-` and `/` -> `_`. Always strips `=` */\nexport function toBase64Url(bin: BinInput): string {\n const bytes = toUint8Array(bin)\n if (typeof Buffer !== 'undefined')\n return Buffer.from(bytes).toString('base64url').replaceAll('=', '')\n let s = ''\n for (let i = 0; i < bytes.byteLength; i++)\n s += String.fromCharCode(bytes[i])\n return btoa(s).replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '')\n}\n\n/** Also parses toBase64Url encoded strings. */\nexport function fromBase64(s: string): Uint8Array {\n s = s.replaceAll('-', '+').replaceAll('_', '/')\n if (typeof Buffer !== 'undefined') {\n const buf = Buffer.from(s, 'base64')\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength)\n }\n const a = atob(s)\n const bytes = new Uint8Array(a.length)\n for (let i = 0; i < a.length; i++)\n bytes[i] = a.charCodeAt(i)\n return bytes\n}\n\n/** Also parses toBase64Url encoded strings. */\nexport function fromBase64String(s: string): string {\n return Uint8ArrayToString(fromBase64(s))\n}\n\n/** Compare contents of binary arrays */\nexport function equalBinary(\n a: ArrayBuffer | Uint8Array,\n b: ArrayBuffer | Uint8Array,\n): boolean {\n if (a.byteLength !== b.byteLength)\n return false\n const aa = toUint8Array(a)\n const bb = toUint8Array(b)\n for (let i = 0; i < aa.length; i++) {\n if (aa[i] !== bb[i])\n return false\n }\n return true\n}\n\nexport function jsonToUint8Array(json: any): Uint8Array | never {\n return stringToUInt8Array(jsonStringifySafe(json))\n}\n\nexport function Uint8ArrayToJson<T = any>(data: Uint8Array): T | never {\n return JSON.parse(Uint8ArrayToString(data))\n}\n\n// https://gist.github.com/igorgatis/d294fe714a4f523ac3a3\nexport function Uint8ArrayToHexDump(\n buffer: Uint8Array | ArrayBuffer | string | Array<number>,\n blockSize?: number,\n) {\n if (typeof buffer === 'string') {\n // log(\"buffer is string\")\n // do nothing\n }\n else if (buffer instanceof ArrayBuffer && buffer.byteLength !== undefined) {\n // log(\"buffer is ArrayBuffer\")\n buffer = String.fromCharCode.apply(\n String,\n [].slice.call(new Uint8Array(buffer)),\n )\n }\n else if (Array.isArray(buffer)) {\n // log(\"buffer is Array\")\n buffer = String.fromCharCode.apply(String, buffer)\n }\n else if (buffer.constructor === Uint8Array) {\n // log(\"buffer is Uint8Array\")\n buffer = String.fromCharCode.apply(String, [].slice.call(buffer))\n }\n else {\n // log(\"Error: buffer is unknown...\")\n return false\n }\n\n blockSize = blockSize || 16\n const lines = []\n const hex = '0123456789ABCDEF'\n for (let b = 0; b < buffer.length; b += blockSize) {\n const block = buffer.slice(b, Math.min(b + blockSize, buffer.length))\n const addr = (`0000${b.toString(16)}`).slice(-4)\n let codes = block\n .split('')\n .map((ch: any) => {\n const code = ch.charCodeAt(0)\n return ` ${hex[(0xF0 & code) >> 4]}${hex[0x0F & code]}`\n })\n .join('')\n codes += ' '.repeat(blockSize - block.length)\n let chars = block.replace(/[\\x00-\\x1F\\x20\\x7F-\\xA0\\xAD]/g, '.')\n chars += ' '.repeat(blockSize - block.length)\n lines.push(`${addr} ${codes} ${chars}`)\n }\n return lines.join('\\n')\n}\n","// Originial code at https://github.com/cryptocoinjs/base-x/blob/master/ts_src/index.ts\n//\n// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\n\n// \"Fast base encoding / decoding of any given alphabet using bitcoin style leading zero compression.\"\n// \"WARNING: This module is NOT RFC3548 compliant, it cannot be used for base16 (hex), base32, or base64 encoding in a standards compliant manner.\"\n\nimport type { BinInput } from './bin'\nimport { toUint8Array } from './bin'\n\nconst alphabets = {\n '2': '01',\n '8': '01234567',\n '11': '0123456789a',\n '16': '0123456789abcdef',\n '32': '0123456789abcdefghjkmnpqrtuvwxyz', // Agnoster, because least mix up and good sorting\n '32-crockford': '0123456789ABCDEFGHJKMNPQRSTVWXYZ', // Crockford\n '32-geohash': '0123456789bcdefghjkmnpqrstuvwxyz', // https://en.wikipedia.org/wiki/Base32#Geohash\n '32-agnoster': '0123456789abcdefghjkmnpqrtuvwxyz', // https://github.com/agnoster/base32-js/blob/master/lib/base32.js#L6 without i(1), l(1), o(0), s(5); keeps sort order\n '32-rfc': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', // https://datatracker.ietf.org/doc/html/rfc4648#section-6\n '32-hex': '0123456789ABCDEFGHIJKLMNOPQRSTUV', // https://datatracker.ietf.org/doc/html/rfc4648#section-7\n '32-zbase': 'ybndrfg8ejkmcpqxot1uwisza345h769', // https://en.wikipedia.org/wiki/Base32#z-base-32\n '36': '0123456789abcdefghijklmnopqrstuvwxyz',\n '58': '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',\n '62': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', // Correct sort order\n '64': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n '64-url': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', // https://datatracker.ietf.org/doc/html/rfc4648#section-5\n '66': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~',\n '85': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~', // https://datatracker.ietf.org/doc/html/rfc1924#section-4.2\n}\n\ntype encodeFunction = (source: BinInput, padToLength?: number) => string\ntype decodeFunction = (source: string, padToLength?: number) => Uint8Array\n\nexport function _useBase(alphaOrBase: string | number): {\n encode: encodeFunction\n decode: decodeFunction\n} {\n let ALPHABET: string | undefined = (alphabets as any)[String(alphaOrBase)]\n\n if (!ALPHABET) {\n if (typeof alphaOrBase === 'string')\n ALPHABET = alphaOrBase\n else\n throw new Error(`Unknown base ${alphaOrBase}`)\n }\n\n if (ALPHABET.length >= 255)\n throw new TypeError('Alphabet too long')\n\n const BASE_MAP = new Uint8Array(256)\n for (let j = 0; j < BASE_MAP.length; j++)\n BASE_MAP[j] = 255\n\n for (let i = 0; i < ALPHABET.length; i++) {\n const x = ALPHABET.charAt(i)\n const xc = x.charCodeAt(0)\n\n if (BASE_MAP[xc] !== 255)\n throw new TypeError(`${x} is ambiguous`)\n BASE_MAP[xc] = i\n }\n\n const BASE = ALPHABET.length\n const LEADER = ALPHABET.charAt(0)\n const FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up\n const iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up\n\n function encode(source: BinInput, padToLength = -1): string {\n const data = toUint8Array(source)\n if (data.byteLength === 0)\n return ''\n\n // Skip & count leading zeroes.\n let length = 0\n let pbegin = 0\n const pend = data.byteLength\n\n while (pbegin !== pend && data[pbegin] === 0) pbegin++\n\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0\n const dataEncoded = new Uint8Array(size)\n\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = data[pbegin]\n\n // Apply \"dataEncoded = dataEncoded * 256 + ch\".\n let i = 0\n for (\n let it1 = size - 1;\n (carry !== 0 || i < length) && it1 !== -1;\n it1--, i++\n ) {\n carry += (256 * dataEncoded[it1]) >>> 0\n dataEncoded[it1] = carry % BASE >>> 0\n carry = (carry / BASE) >>> 0\n }\n\n if (carry !== 0) {\n // log.warn('Non-zero carry', data, padToLength, i, size)\n throw new Error('Non-zero carry')\n }\n\n length = i\n pbegin++\n }\n\n let it2 = size - length\n\n // Skip leading zeroes\n while (it2 !== size && dataEncoded[it2] === 0) it2++\n\n // Translate the result into a string.\n let str = ''\n for (; it2 < size; ++it2) str += ALPHABET!.charAt(dataEncoded[it2])\n\n if (padToLength > 0) {\n // const pad = Math.ceil(source.length * iFACTOR)\n return str.padStart(padToLength, LEADER)\n }\n return str\n }\n\n function decode(source: string, padToLength = -1): Uint8Array {\n if (typeof source !== 'string')\n throw new TypeError('Expected String')\n if (source.length === 0)\n return new Uint8Array()\n\n // Normalize\n source = source.replace(/\\s+/gi, '')\n\n let psz = 0\n let length = 0\n\n while (source[psz] === LEADER) psz++\n\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0 // log(58) / log(256), rounded up.\n const dataDecoded = new Uint8Array(size)\n\n // Process the characters.\n while (source[psz]) {\n let carry = BASE_MAP[source.charCodeAt(psz)]\n\n // Invalid character\n if (carry === 255)\n throw new Error(`Unsupported character \"${source[psz]}\"`)\n\n let i = 0\n for (\n let it3 = size - 1;\n (carry !== 0 || i < length) && it3 !== -1;\n it3--, i++\n ) {\n carry += (BASE * dataDecoded[it3]) >>> 0\n dataDecoded[it3] = carry % 256 >>> 0\n carry = (carry / 256) >>> 0\n }\n\n if (carry !== 0)\n throw new Error('Non-zero carry')\n length = i\n psz++\n }\n\n // Skip leading zeroes\n let it4 = size - length\n while (it4 !== size && dataDecoded[it4] === 0) it4++\n\n if (padToLength > 0) {\n return new Uint8Array([\n ...new Uint8Array(padToLength - dataDecoded.length + it4),\n ...dataDecoded.slice(it4),\n ])\n }\n\n return dataDecoded.slice(it4)\n }\n\n return {\n encode,\n decode,\n }\n}\n\nlet cache: Map<number | string, any> | undefined\n\nexport function useBase(alphaOrBase: string | number) {\n if (cache == null)\n cache = new Map()\n\n function getFromCache() {\n let fn = cache!.get(alphaOrBase)\n if (fn == null) {\n fn = _useBase(alphaOrBase)\n cache!.set(alphaOrBase, fn)\n }\n return fn\n }\n\n function encode(source: BinInput, padToLength = -1): string {\n return getFromCache().encode(source, padToLength)\n }\n\n function decode(source: string, padToLength = -1): Uint8Array {\n return getFromCache().decode(source, padToLength)\n }\n\n return { encode, decode }\n}\n\n// Shortcuts\n\nexport function encodeBase32(bin: BinInput, padding = -1) {\n return useBase(32).encode(bin, padding)\n}\n\nexport function decodeBase32(s: string, padding = -1) {\n return useBase(32).decode(s\n .toLocaleLowerCase()\n .replaceAll('l', '1')\n .replaceAll('s', '5')\n .replaceAll('o', '0')\n .replaceAll('i', '1'),\n padding)\n}\n\nexport function encodeBase16(bin: BinInput, padding = -1) {\n return useBase(16).encode(bin, padding)\n}\n\nexport function decodeBase16(s: string, padding = -1) {\n return useBase(16).decode(s, padding)\n}\n\nexport function encodeBase58(bin: BinInput, padding = -1) {\n return useBase(58).encode(bin, padding)\n}\n\nexport function decodeBase58(s: string, padding = -1) {\n return useBase(58).decode(s, padding)\n}\n\nexport function encodeBase62(bin: BinInput, padding = -1) {\n return useBase(62).encode(bin, padding)\n}\n\nexport function decodeBase62(s: string, padding = -1) {\n return useBase(62).decode(s, padding)\n}\n\nexport function estimateSizeForBase(bytes: number, base: number) {\n return Math.ceil(bytes * (Math.log(256) / Math.log(base)))\n}\n","/*\nhttps://matthiashager.com/converting-snake-case-to-camel-case-object-keys-with-javascript\n\ncamelCase\nsnake_case\nkebab-case\nPascalCase // I won't be using this here, but it's only one small step further if you want to use it\n*/\n\nexport function toCamelCase(s: string) {\n // if only capital letters, convert to lower case\n if (s.length > 0) {\n if (/^[A-Z0-9_\\-\\ ]*$/g.test(s))\n s = s.toLowerCase()\n\n s = s\n // strip trailing non chars\n .replace(/^[-_\\ ]+/gi, '')\n .replace(/[-_\\ ]+$/gi, '')\n // strip separators and upper case first char\n .replace(/[-_\\ ]+([a-z0-9])/gi, ($0, $1) => $1.toUpperCase())\n // lower case first char\n s = s[0].toLowerCase() + s.substring(1)\n }\n return s\n}\n\nexport function toCapitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.toLowerCase().slice(1)\n}\n\nexport function toCapitalizeWords(s: string) {\n return s.replace(/\\w\\S*/g, toCapitalize)\n}\n\n// export function camelize(str: string) {\n// return str\n// .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (word: string, index: number) =>\n// index === 0 ? word.toLowerCase() : word.toUpperCase()\n// )\n// .replace(/\\s+/g, \"\")\n// }\n\nexport function fromCamelCase(str: string, separator = '-') {\n separator = typeof separator === 'undefined' ? '_' : separator\n return str\n .replace(/([a-z\\d])([A-Z])/g, `$1${separator}$2`)\n .replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, `$1${separator}$2`)\n .toLowerCase()\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { Uint8ArrayToHexDump } from './bin'\n\n// import { jsonStringify } from './json'\n\nconst TRUE_VALUES_LIST = ['1', 'true', 'yes', 'y', 'on']\n\nexport function stringToBoolean(value?: string, defaultValue = false): boolean {\n if (value == null || typeof value !== 'string')\n return defaultValue\n return TRUE_VALUES_LIST.includes(String(value).trim().toLowerCase())\n}\n\nexport function stringToInteger(value?: string, defaultValue = 0): number {\n if (value == null || typeof value !== 'string')\n return defaultValue\n return Number.parseInt(value.trim(), 10) ?? defaultValue\n}\n\nexport function stringToFloat(value?: string, defaultValue = 0.0): number {\n if (value == null || typeof value !== 'string')\n return defaultValue\n return Number.parseFloat(value.trim()) ?? defaultValue\n}\n\nexport function valueToBoolean(value?: any, defaultValue = false): boolean {\n if (value == null)\n return defaultValue\n if (typeof value === 'boolean')\n return value\n if (typeof value === 'number')\n return value !== 0\n return TRUE_VALUES_LIST.includes(String(value).trim().toLowerCase())\n}\n\nexport function valueToInteger(value?: any, defaultValue = 0): number {\n if (value == null)\n return defaultValue\n if (typeof value === 'boolean')\n return value ? 1 : 0\n if (typeof value === 'number')\n return Math.floor(value)\n return Number.parseInt(String(value).trim(), 10) ?? defaultValue\n}\n\nexport function valueToFloat(value?: any, defaultValue = 0.0): number {\n if (value == null)\n return defaultValue\n if (typeof value === 'boolean')\n return value ? 1 : 0\n if (typeof value === 'number')\n return Math.floor(value)\n return Number.parseFloat(String(value).trim()) ?? defaultValue\n}\n\nexport function valueToString(value?: any, defaultValue = ''): string {\n if (value == null)\n return defaultValue\n // if (value == \"\") return defaultValue // ???\n return String(value) ?? defaultValue\n}\n\n// todo: toDate, toTimestamp, toData(value, base=64)\n\n// export function mapToObject<T>(map: Map<string, T>): { [key: string]: T } {\n// return Object.fromEntries(map)\n// }\n\n// export function objectToMap<T>(obj: { [key: string]: T }): Map<string, T> {\n// return new Map(Object.entries(obj))\n// }\n\n// Shortcuts\n\nexport const toFloat = valueToFloat\nexport const toInt = valueToInteger\nexport const toString = valueToString\nexport const toBool = valueToBoolean\n\n// Strings\n\nexport interface RenderMessagesOptions {\n trace?: boolean // = true\n pretty?: boolean // = true\n}\n\nexport function formatMessages(\n messages: any[],\n opt: RenderMessagesOptions = {},\n): any[] {\n const { trace = true, pretty = true } = opt\n return messages.map((obj) => {\n if (obj && typeof obj === 'object') {\n if (pretty && (obj instanceof Uint8Array || obj instanceof ArrayBuffer))\n return `\\n${Uint8ArrayToHexDump(obj)}\\n`\n\n if (obj instanceof Error) {\n if (!trace)\n return `${obj.name || 'Error'}: ${obj.message}`\n\n return `${obj.name || 'Error'}: ${obj.message}\\n${obj.stack}`\n }\n\n try {\n return pretty ? JSON.stringify(obj, null, 2) : JSON.stringify(obj)\n }\n catch (err) {}\n }\n return String(obj)\n })\n}\n\nexport function renderMessages(\n messages: any[],\n opt: RenderMessagesOptions = {},\n): string {\n return formatMessages(messages, opt).join(' ')\n}\n\n//\n\n// Awesome trick from https://stackoverflow.com/a/5396742/140927\nexport function fixBrokenUth8String(brokenString: string): string {\n try {\n return decodeURIComponent(escape(brokenString))\n }\n catch (e) {\n // log.debug(\"fixString failed for\", s)\n }\n return brokenString\n}\n","import { fromBase64, toBase64 } from './bin'\n\nexport function dataUriToUint8Array(dataUri: string): Uint8Array | undefined {\n if (dataUri.startsWith('data:'))\n return fromBase64(dataUri.split(',', 2)[1])\n}\n\nexport function dataUriToMimeType(dataUri: string): string | undefined {\n if (dataUri.startsWith('data:'))\n return dataUri.slice(5).split(',', 2)[0]\n}\n\nexport function dataUriToBlob(dataUri: string): Blob | undefined {\n if (dataUri.startsWith('data:')) {\n const [mimeString, base64String] = dataUri.slice(5).split(',', 2)\n return new Blob([fromBase64(base64String)], { type: mimeString })\n }\n}\n\nexport async function blobToDataUri(blob: Blob): Promise<string | undefined> {\n const bin = await blob.arrayBuffer()\n if (bin)\n return `data:${blob.type},${toBase64(bin)}`\n}\n\nexport function Uint8ArrayToDataUri(bin: Uint8Array, type = 'application/octet-stream'): string {\n return `data:${type},${toBase64(bin)}`\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable ts/no-use-before-define */\n/* eslint-disable no-async-promise-executor */\n\n/**\n * Promise to be used with `await`. Example:\n *\n * ```\n * const [promise, resolve, reject] = createPromise()\n * setTimeout(() => {\n * resolve(5)\n * }, 50)\n * const result = await promise\n * ```\n */\nexport function createPromise<T>(): [Promise<T>, any, any] {\n let resolve, reject\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve\n reject = _reject\n })\n return [promise, resolve, reject]\n}\n\n/** Sleep for `milliSeconds`. Example 1s: `await sleep(1000)` */\nexport async function sleep(milliSeconds: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, milliSeconds))\n}\n\n/** Same as `await sleep(0)`, just let the event loop execute. */\nexport async function immediate(): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, 0))\n}\n\n// type Unwrap<T> = T extends Promise<infer U>\n// ? U\n// : T extends (...args: any) => Promise<infer U>\n// ? U\n// : T extends (...args: any) => infer U\n// ? U\n// : T\n\nexport async function timeout<T>(\n promise: Promise<T>,\n milliSeconds: number,\n timeoutValue = 'timeoutReached',\n): Promise<T | typeof timeoutValue> {\n return new Promise(async (resolve, reject) => {\n let done = false\n\n const timeout = setTimeout(() => {\n done = true\n resolve(timeoutValue)\n }, milliSeconds)\n\n try {\n const result = await promise\n clearTimeout(timeout)\n if (!done)\n resolve(result)\n }\n catch (err) {\n clearTimeout(timeout)\n if (!done)\n reject(err)\n }\n })\n}\n\nexport function isTimeout(value: any): boolean {\n return value === 'timeoutReached' || value?.name === 'Timeout reached'\n}\n\nexport async function tryTimeout<T>(\n promise: Promise<T>,\n milliSeconds: number,\n): Promise<T | undefined> {\n if (milliSeconds <= 0)\n return await promise\n\n return new Promise(async (resolve, reject) => {\n let done = false\n\n const timeout = setTimeout(() => {\n done = true\n reject(new Error('Timeout reached'))\n }, milliSeconds)\n\n try {\n const result = await promise\n clearTimeout(timeout)\n if (!done)\n resolve(result)\n }\n catch (err) {\n clearTimeout(timeout)\n if (!done)\n reject(err)\n }\n })\n}\n\n/** Wait for `event` on `obj` to emit. Resolve with result or reject on `timeout` */\nexport function waitOn(\n obj: any,\n event: string,\n timeoutMS = 1000,\n): Promise<any> {\n return new Promise((resolve, reject) => {\n const fn = (value: any) => {\n if (timer) {\n clearTimeout(timer)\n done()\n resolve(value)\n }\n }\n\n let done = () => {\n timer = null\n if (obj.off)\n obj.off(event, fn)\n else if (obj.removeEventListener)\n obj.removeEventListener(event, fn)\n // else\n // log.warn('No remove listener method found for', obj, event)\n }\n\n let timer: any = setTimeout(() => {\n done()\n reject(new Error('Did not response in time'))\n }, timeoutMS)\n\n if (obj.on)\n obj.on(event, fn)\n else if (obj.addEventListener)\n obj.addEventListener(event, fn)\n // else\n // log.warn('No listener method found for', obj)\n })\n}\n\nexport function isPromise<T>(value: Promise<T> | T): value is Promise<T> {\n return Boolean(value && (value instanceof Promise || typeof (value as any).then === 'function'))\n}\n\n/** This is exactly what Prose.resolve(x) is supposed to be: return a Promise no matter what type x is */\nexport function promisify<T>(value: Promise<T> | T): Promise<T> {\n return Promise.resolve(value)\n}\n\n// // https://github.com/unjs/items-promise\n\n// /**\n// * Run tasks one by one by calling fn(task, previous) in a promise chain.\n// * Return value is of type Promise<*> which resolves to the last fn result.\n// */\n// export async function serial(tasks: any, fn: any) {\n// return tasks.reduce(\n// (promise: Promise<any>, task: any) =>\n// promise.then((previous) => fn(task, previous)),\n// Promise.resolve(null)\n// )\n// }\n\n// /**\n// * Run all tasks in parallel by calling fn(tasks) and await using Promise.all.\n// * Return value is of type Promise<*[]> which resolves to results of all fns in an array.\n// */\n// export async function parallel(tasks: any[], fn: any): Promise<any[]> {\n// return Promise.all(tasks.map((task) => fn(task)))\n// }\n\n//\n\n/**\n * Like ReturnType but for async functions.\n * From https://www.jpwilliams.dev/how-to-unpack-the-return-type-of-a-promise-in-typescript\n */\nexport type AsyncReturnType<T extends (...args: any) => any> = T extends (\n ...args: any\n) => Promise<infer U>\n ? U\n : T extends (...args: any) => infer U\n ? U\n : any\n","// Functional Variant\n\nexport const DAY_MS = 86400000 // 1000 * 60 * 60 * 24\n\nexport type DayValue = number\n\nexport type DayInput =\n | DayValue\n | number\n | string\n | Date\n | [number, number?, number?]\n\nexport function dayYear(day: DayValue): DayValue {\n return Math.floor(day / 10000)\n}\n\nexport function dayMonth(day: DayValue): DayValue {\n return Math.floor((day / 100) % 100)\n}\n\nexport function dayDay(day: DayValue): DayValue {\n return Math.floor(day % 100)\n}\n\nexport function dayToParts(day: DayValue): [number, number, number] {\n return [dayYear(day), dayMonth(day), dayDay(day)]\n}\n\nexport function dayToDate(day: DayValue, gmt = false): Date {\n return gmt\n ? new Date(`${dayToString(day)}T00:00:00.000Z`)\n : new Date(\n day / 10000, // year\n ((day / 100) % 100) - 1, // month\n day % 100, // day\n )\n}\n\nexport function dayFromToday(): DayValue {\n return dayFromDate(new Date())\n}\n\nexport function dayFromAny(\n value: DayInput,\n gmt = false,\n): DayValue | undefined {\n if (typeof value === 'number') {\n if (value < 100)\n return\n return value\n }\n else if (typeof value === 'string') {\n return dayFromString(value)\n }\n else if (Array.isArray(value) && value.length === 3) {\n const [year, month, day] = value\n return dayFromParts(year, month, day)\n }\n else if (value instanceof Date) {\n return dayFromDate(value, gmt)\n // } else if (value instanceof Day) {\n // return value.days\n }\n}\n\nexport function dayToDateGMT(day: DayValue): Date {\n return dayToDate(day, true)\n}\n\nexport function dayFromDate(date: Date, gmt = false): DayValue {\n return (\n gmt\n ? dayFromString(date.toISOString())\n : date.getFullYear() * 10000\n + (date.getMonth() + 1) * 100\n + date.getDate()\n )!\n}\n\nexport function dayFromDateGMT(date: Date): DayValue {\n return dayFromDate(date, true)\n}\n\nexport function dayToTimestamp(day: DayValue, gmt = true): number {\n return dayToDate(day, gmt).getTime()\n}\n\nexport function dayFromTimestamp(ms: number, gmt = true): DayValue {\n return dayFromDate(new Date(ms), gmt)\n}\n\nexport function dayToString(day: DayValue, sep = '-') {\n const baseString = String(day)\n return (\n baseString.slice(0, 4) + sep\n + baseString.slice(4, 6) + sep\n + baseString.slice(6, 8)\n )\n}\n\nexport function dayFromParts(\n year: number,\n month = 1,\n day = 1,\n): DayValue | undefined {\n if (month < 1 || month > 12 || day < 1 || day > 31)\n return\n return year * 10000 + month * 100 + day\n}\n\nexport function dayFromString(value: string): DayValue | undefined {\n const string = String(value)\n .replace(/[^0-9]/g, '')\n .slice(0, 8)\n if (string.length === 8)\n return +string\n}\n\nexport function dayMonthStart(day: DayValue, offset = 0): DayValue {\n let year = dayYear(day)\n let month = dayMonth(day)\n if (offset !== 0) {\n month += offset\n year += Math.floor((month - 1) / 12)\n month = Math.floor((month - 1) % 12) + 1\n if (month === 0)\n month = 12\n }\n return dayFromParts(year, month, 1)!\n}\n\nexport function dayYearStart(day: DayValue, offset = 0): DayValue {\n const year = dayYear(day)\n return dayFromParts(year + offset, 1, 1)!\n}\n\nexport function dayOffset(day: DayValue, offset: number): DayValue {\n // Important! Don't use local time here due to summer/winter time days can\n // be longer or shorter!\n return dayFromTimestamp(dayToTimestamp(day) + offset * DAY_MS)\n}\n\nexport function dayDiff(left: DayValue, right: DayValue): number {\n return Math.round((dayToTimestamp(right) - dayToTimestamp(left)) / DAY_MS)\n}\n\n/** List of dates for loops */\nexport function dayRange(left: DayValue, right?: DayValue): number[] {\n const list: number[] = []\n\n if (right == null)\n right = dayFromToday()\n\n if (left < 0)\n left = dayOffset(right, left + 1)\n\n while (left <= right) {\n list.push(left)\n left = dayOffset(left, +1)\n }\n return list\n}\n\n/** Iterator, see dayRange */\nexport function* dayIterator(left: DayValue, right?: DayValue) {\n const list: number[] = []\n\n if (right == null)\n right = dayFromToday()\n\n if (left < 0)\n left = dayOffset(right, left + 1)\n\n while (left <= right) {\n yield left\n left = dayOffset(left, +1)\n }\n return list\n}\n","import { isPromise } from '../exec/promise'\nimport type { DayInput, DayValue } from './day'\nimport { DAY_MS } from './day'\n\n// See also and alternatives:\n// https://blog.openreplay.com/is-it-time-for-the-javascript-temporal-api\n// https://github.com/iamkun/dayjs\n// https://github.com/date-fns/date-fns\n\nexport type DayInputLegacy = DayInput | Day\n\n/**\n * Date represented as positive integer value. Years smaller 0 are not supported.\n * @deprecated\n */\nexport class Day {\n days: DayValue\n\n get value() {\n return this.days\n }\n\n constructor(days?: DayInputLegacy) {\n if (typeof days === 'number') {\n this.days = days\n return\n }\n\n if (days != null)\n days = Day.from(days)?.days\n\n if (days == null) {\n const date = new Date()\n this.days\n = date.getFullYear() * 10000\n + (date.getMonth() + 1) * 100\n + date.getDate()\n }\n else {\n this.days = days\n }\n }\n\n static fromNumber(n: number): Day {\n return new Day(n)\n }\n\n static fromString(dateString: string): Day | undefined {\n return Day.from(+dateString.replace(/[^0-9]/g, '').slice(0, 8))\n }\n\n static fromDate(date: Date, gmt = false): Day {\n return (\n gmt\n ? Day.fromString(date.toISOString().substr(0, 10))\n : Day.from(\n date.getFullYear() * 10000\n + (date.getMonth() + 1) * 100\n + date.getDate(),\n )\n ) as Day\n }\n\n static fromDateGMT(date: Date): Day {\n return Day.fromDate(date, true)\n }\n\n static from(value: DayInputLegacy, gmt = false): Day | undefined {\n if (typeof value === 'number') {\n if (value < 100)\n return\n return new Day(value)\n }\n else if (typeof value === 'string') {\n return Day.fromString(value)\n }\n else if (Array.isArray(value) && value.length === 3) {\n const [year, month = 1, day = 1] = value\n if (month < 1 || month > 12 || day < 1 || day > 31)\n return\n return new Day(year * 10000 + month * 100 + day)\n }\n else if (value instanceof Date) {\n return Day.fromDate(value, gmt)\n }\n else if (value instanceof Day) {\n return value\n }\n }\n\n toNumber(): number {\n return this.days\n }\n\n // Transformer\n\n /** Just for future extensions */\n toJson() {\n return this.days\n }\n\n toString(sep = '-') {\n const baseString = String(this.days)\n return (\n baseString.slice(0, 4)\n + sep\n + baseString.slice(4, 6)\n + sep\n + baseString.slice(6, 8)\n )\n }\n\n toDate(gmt = false): Date {\n return gmt\n ? new Date(`${this.toString()}T00:00:00.000Z`)\n : new Date(\n this.days / 10000, // year\n ((this.days / 100) % 100) - 1, // month\n this.days % 100, // day\n )\n }\n\n toDateGMT() {\n return this.toDate(true)\n }\n\n get year() {\n return Math.floor(this.days / 10000)\n }\n\n get month() {\n return Math.floor((this.days / 100) % 100)\n }\n\n get day() {\n return Math.floor(this.days % 100)\n }\n\n // Calculations\n\n dayOffset(offset: number): Day {\n // Important! Don't use local time here due to summer/winter time days can\n // be longer or shorter!\n return Day.fromDateGMT(\n new Date(this.toDateGMT().getTime() + offset * DAY_MS),\n )\n }\n\n monthStart(): Day {\n return Day.from([this.year, this.month, 1])!\n }\n\n yearStart(): Day {\n return Day.from([this.year, 1, 1])!\n }\n\n /** Very stupid approach, only works for days <= 28 */\n monthOffset(offset: number): Day {\n const m = this.month + offset\n let mm = Math.floor((m - 1) % 12) + 1\n if (mm === 0)\n mm = 12\n const yy = Math.floor((m - 1) / 12)\n // log(\"calc\", m, mm, yy, [this.year + yy, mm, this.day])\n return Day.from([this.year + yy, mm, this.day])!\n }\n\n daysUntil(otherDay: DayInputLegacy): number {\n return Math.round(\n (new Day(otherDay)?.toDateGMT().getTime() - this.toDateGMT().getTime())\n / DAY_MS,\n )\n }\n\n // Shortcuts\n\n yesterday() {\n return this.dayOffset(-1)\n }\n\n tomorrow() {\n return this.dayOffset(+1)\n }\n}\n\nexport async function forEachDay(\n from: DayInputLegacy,\n to: DayInputLegacy,\n handler: (date: Day) => Promise<void> | void,\n) {\n let start = Day.from(from)\n const end = Day.from(to)\n // eslint-disable-next-line no-unmodified-loop-condition\n while (start && end && start?.days <= end?.days) {\n const result = handler(start)\n if (isPromise(result))\n await result\n\n start = start.dayOffset(+1)\n }\n}\n\nexport function today(): Day {\n return new Day()\n}\n\n/** @deprecated */\nexport function day(days?: DayInputLegacy): Day {\n return new Day(days)\n}\n\nexport function dateStringToDays(dateString: string): number {\n return Day.fromDate(new Date(dateString)).days\n}\n","export type DecimalValue = number\nexport type DecimalInput = number | string | DecimalValue\n\nexport function decimal(\n value: DecimalInput,\n decimalPlaces = 2,\n): DecimalValue {\n return +(+value).toFixed(decimalPlaces)\n}\n\nexport function decimalFromCents(\n value: DecimalInput,\n decimalPlaces = 2,\n): DecimalValue {\n return +(+value / 10 ** decimalPlaces).toFixed(decimalPlaces)\n}\n\nexport function decimalToCents(\n value: DecimalInput,\n decimalPlaces = 2,\n): number {\n return Math.round(+value * 10 ** decimalPlaces)\n}\n\nexport function decimalCentsPart(\n value: DecimalInput,\n decimalPlaces = 2,\n): DecimalValue {\n return decimalPlaces * (decimal(value, decimalPlaces) % 1)\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport type { Json } from '../types'\nimport { jsonStringifySafe } from './json'\n\n/**\n * Call a create function if key does not yet exist on an object. Returns the found or created object. Example:\n *\n * ```js\n * function createRoom(room, rooms) { return new Room() }\n * ensureKey(rooms, room, createRoom).enter()\n * ```\n */\nexport function ensureKey<T>(\n obj: Record<string, T>,\n key: string,\n createFn: (key?: string, obj?: Record<string, T>) => T,\n): T {\n let value = obj[key]\n if (value === undefined) {\n value = createFn(key, obj)\n obj[key] = value\n }\n return value\n}\n\n/**\n * Call a create function if key does not yet exist on an object. Returns the found or created object. Example:\n *\n * ```js\n * async function fetchItem(id, cache) { ... }\n * let data = await ensureKey(cache, id, fetchItem)\n * ```\n */\nexport async function ensureKeyAsync<T>(\n obj: Record<string, T>,\n key: string,\n createFn: (key?: string, obj?: Record<string, T>) => Promise<T>,\n): Promise<T> {\n let value = obj[key]\n if (value === undefined) {\n value = await createFn(key, obj)\n obj[key] = value\n }\n return value\n}\n\nexport function size(obj: any) {\n if (obj != null) {\n if (obj.size != null)\n return obj.size\n\n if (obj.length != null)\n return obj.length\n\n return Object.keys(obj).length\n }\n return 0\n}\n\nexport function first<T>(array?: T[]): T | undefined {\n return (array != null && array.length > 0) ? array[0] : undefined\n}\n\nexport function last<T>(array?: T[]): T | undefined {\n return (array != null && array.length > 0) ? array[array.length - 1] : undefined\n}\n\n// True for [], {}, \"\", Map(), Set() and all primitives\nexport function empty(value: any): boolean {\n try {\n if (value != null) {\n if (Array.isArray(value))\n return value.length <= 0\n else if (typeof value === 'string')\n return value.length <= 0\n else if (value?.size != null)\n return value.size <= 0\n else\n return Object.keys(value).length <= 0\n }\n }\n catch (err) {\n console.warn('Failed to check if empty for', value, err)\n }\n return true\n}\n\n// Also see common/data/deep.ts\nexport function cloneObject<T>(obj: T): T {\n // Primitives are immutable anyway\n if (Object(obj) !== obj)\n return obj\n\n // Rude but very efficient way to clone\n return JSON.parse(jsonStringifySafe(obj))\n}\n\n// export const cloneObject = typeof structuredClone !== 'undefined' ? structuredClone : _cloneObject\n\n// Also see common/data/deep.ts\nexport function cloneJsonObject<T = Json>(obj: T): T {\n // Primitives are immutable anyway\n if (Object(obj) !== obj)\n return obj\n\n // Rude but very efficient way to clone\n return JSON.parse(jsonStringifySafe(obj))\n}\n\n// export function cloneStructuredObject<T>(obj: T): T {\n// // Primitives are immutable anyway\n// if (Object(obj) !== obj) return obj\n\n// // https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n// // @ts-ignore\n// return typeof structuredClone !== \"undefined\"\n// ? // @ts-ignore\n// structuredClone(obj)\n// : // Rude but very efficient way to clone\n// JSON.parse(JSON.stringify(obj))\n// }\n\n/**\n * Cache result of a function. Same arguments have to always return the same result in order to get expected optimization!\n *\n * ```\n * const square = memoize((value) => value * value)`\n * square(2) // == 2\n * ```\n */\nexport function memoize<In, Out>(fn: (arg: In) => Out): (arg: In) => Out {\n const cache = new Map<In, Out>()\n return (n: In): Out => {\n if (cache.has(n))\n return cache.get(n)!\n const result = fn(n)\n cache.set(n, result)\n return result\n }\n}\n\nexport function memoizeAsync<In extends any[], Out extends Promise<any>>(fn: (...arg: In) => Out): (...arg: In) => Promise<Out> {\n const cache = new Map<string, Out>()\n return async (...n: In): Promise<Out> => {\n const key = jsonStringifySafe(n)\n if (cache.has(key))\n return cache.get(key)!\n\n const result = await fn(...n)\n cache.set(key, result)\n return result\n }\n}\n\n// let cacheMemoizeDomain: any\n\n// /**\n// * Same as `memoize` but does not require global const.\n// */\n// export function memoizeDomain<In, Out>(domain: string, fn: (arg: In) => Out): (arg: In) => Out {\n// if (cacheMemoizeDomain == null)\n// cacheMemoizeDomain = new Map<string, Map<In, Out>>()\n// if (!cacheMemoizeDomain.has(domain))\n// cacheMemoizeDomain.set(domain, new Map())\n// const cache = cacheMemoizeDomain.get(domain)\n// return (n: In): Out => {\n// if (cache.has(n))\n// return cache.get(n)!\n// const result = fn(n)\n// cache.set(n, result)\n// return result\n// }\n// }\n\n// export default function memoizeMultiArguments<T extends Function>(func: T) {\n// const cache = new Map()\n\n// const memoized = function (...args: any[]) {\n// let innerCache = cache\n\n// // first layer of the map is the arguments length\n// // if two calls have different number of arguments\n// // then they cannot be the same call\n// if (!innerCache.has(args.length))\n// innerCache.set(args.length, new Map())\n\n// innerCache = innerCache.get(args.length)\n\n// // using args.length because func.length is 0 for variadic functions\n// for (let i = 0; i < args.length - 1; i++) {\n// const key = args[i]\n// if (!innerCache.has(key))\n// innerCache.set(key, new Map())\n\n// innerCache = innerCache.get(key)\n// }\n\n// const key = args[args.length - 1]\n// if (innerCache.has(key))\n// return innerCache.get(key)\n\n// const result = func(...args)\n// innerCache.set(key, result)\n// return result\n// }\n\n// return memoized\n// }\n\n/** Repeat `count` times. Starts with `0` */\nexport function forTimes<T = undefined>(\n count: number,\n fn: (i: number, count: number) => T,\n): T[] {\n const result = []\n for (let i = 0; i < count; i++)\n result.push(fn(i, count))\n\n return result\n}\n","// https://github.com/sindresorhus/is/ MIT\n// https://github.com/sindresorhus/ts-extras\n// https://github.com/sindresorhus/type-fest\n// https://github.com/antfu/utils\n\nimport { size } from './utils'\n\nexport type Primitive =\n | null\n | undefined\n | string\n | number\n | boolean\n | symbol\n | bigint\n\nexport function isObject(obj: unknown): obj is object {\n return obj != null && typeof obj === 'object'\n}\n\n/** Something like number, string, boolean */\nexport function isPrimitive(obj: unknown): obj is Primitive {\n return Object(obj) !== obj\n}\n\nexport function isArray(obj: unknown): obj is Array<any> {\n return Array.isArray(obj)\n}\n\n/** Object that is not an array. But could also be an object defined by a class. */\nexport function isRecord(obj: unknown): obj is Record<string, any> {\n return isObject(obj) && !isArray(obj)\n}\n\n/** Just data, like constructed via `{...}`. */\nexport function isRecordPlain(obj: unknown): obj is Record<string, any> {\n return obj?.constructor === Object\n}\n\nexport function isString(obj: unknown): obj is string {\n return typeof obj === 'string'\n}\n\nexport function isNumber(obj: unknown): obj is number {\n return typeof obj === 'number' && !Number.isNaN(obj) // wtf! Nan === type number\n}\n\nexport function isInteger(obj: unknown): obj is number {\n return isNumber(obj) && Number.isInteger(obj)\n}\n\n/** Integer with full precision i.e. its value is in the signed 53 bit range. */\nexport function isSafeInteger(obj: unknown): obj is number {\n return isNumber(obj) && Number.isSafeInteger(obj)\n}\n\nexport function isBoolean(obj: unknown): obj is boolean {\n return typeof obj === 'boolean'\n}\n\n/** @deprecated use `isNull` */\nexport function isNullOrUndefined(obj: unknown): obj is null | undefined {\n return obj == null\n}\n\nexport function isNull(obj: unknown): obj is null | undefined {\n return obj == null\n}\nexport function isUint8Array(obj: unknown): obj is Uint8Array {\n return isObject(obj) && obj.constructor.name === 'Uint8Array'\n}\n\n// https://stackoverflow.com/a/46700791/140927\n\n/** Not `null` or `undefined`, use like `.filter(isNotNull)` */\nexport function isNotNull<T>(value: T | null | undefined): value is T {\n return value != null\n}\n\n/** Empty means `null` or `undefined` or object or array without items, use like `.filter(isEmpty)` */\nexport function isEmpty<T>(value: T | null | undefined): value is T {\n return value == null || value === '' || (isObject(value) && size(value) <= 0)\n}\n\n/** Not `null` or `undefined` or object or array without items, use like `.filter(isNotEmpty)` */\nexport function isNotEmpty<T>(value: T | null | undefined): value is T {\n return !isEmpty(value)\n}\n\n/**\n * Not `null` or `undefined` or `false`, use like `.filter(isValue)`.\n * Usefull e.g. on conditional list: `[x && 'value', ...]`\n */\nexport function isValue<T>(value: T | null | undefined | boolean): value is T {\n return value != null && value !== false && value !== true // todo limit on false?\n}\n\n/**\n * Not `null` or `undefined` or `false`, use like `.filter(isValue)`.\n * Usefull e.g. on conditional list: `[x && 'value', ...]`\n */\nexport function isTruthy<T>(value: T | null | undefined | boolean): value is T {\n return value != null && value !== false && value !== 0 && value !== ''\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable no-prototype-builtins */\n\nimport { isArray, isObject, isPrimitive, isRecord } from './is'\n\nexport function deepEqual(a: any, b: any, hash = new WeakSet()) {\n // if both x and y are null or undefined and exactly the same\n if (a === b)\n return true\n\n // Cyclic\n if (hash.has(b)) {\n // console.log('cyclic')\n return false\n }\n\n if (!isPrimitive(b))\n hash.add(b)\n\n // if they are not strictly equal, they both need to be Objects\n if (!(a instanceof Object) || !(b instanceof Object))\n return false\n\n // they must have the exact same prototype chain, the closest we can do is\n // test there constructor.\n if (a.constructor !== b.constructor)\n return false\n\n // Shortcut to avoid to many loops\n if (a.length !== b.length)\n return false\n\n for (const p in a) {\n // other properties were tested using x.constructor === y.constructor\n if (!a.hasOwnProperty(p))\n continue\n\n // allows to compare x[ p ] and y[ p ] when set to undefined\n if (!b.hasOwnProperty(p))\n return false\n\n const aa = a[p]\n const bb = b[p]\n\n // if they have the same strict value or identity then they are equal\n // if (aa === bb) {\n // console.log('eq', typeof bb)\n // if (bb != null) hash.set(bb, true)\n // continue\n // }\n //\n // // Numbers, Strings, Functions, Booleans must be strictly equal\n // if (typeof (aa) !== 'object') {\n // return false\n // }\n\n // Objects and Arrays must be tested recursively\n if (!deepEqual(aa, bb, hash))\n return false\n }\n\n // allows x[ p ] to be set to undefined\n for (const p in b) {\n if (b.hasOwnProperty(p) && !a.hasOwnProperty(p))\n return false\n }\n\n return true\n}\n\n/** Strip properties with value `undefined` in place */\nexport function deepStripUndefinedInPlace(a: any, hash = new WeakSet()) {\n // Cyclic\n if (hash.has(a))\n return '[Circular ~]'\n if (!isPrimitive(a))\n hash.add(a)\n\n if (isRecord(a)) {\n for (const p in a) {\n if (!a.hasOwnProperty(p))\n continue\n if (a[p] === undefined) {\n delete a[p]\n continue\n }\n deepStripUndefinedInPlace(a[p], hash)\n }\n }\n else if (isArray(a)) {\n for (let i = a.length - 1; i >= 0; i--) {\n if (a[i] === undefined)\n a.splice(i, 1)\n }\n }\n // else ignore\n\n return a\n}\n\nexport function deepMerge(target: any, ...sources: any[]) {\n // todo cyclic protection\n for (const source of sources) {\n if (!isObject(target))\n target = {}\n\n if (source == null || !isObject(source))\n continue\n\n Object.keys(source).forEach((key) => {\n const targetValue = target[key]\n const sourceValue = (source as any)[key]\n\n if (Array.isArray(targetValue) && Array.isArray(sourceValue))\n target[key] = targetValue.concat(sourceValue)\n else if (isObject(targetValue) && isObject(sourceValue))\n target[key] = deepMerge(Object.assign({}, targetValue), sourceValue)\n else\n target[key] = sourceValue\n })\n }\n\n return target\n}\n\n// // https://stackoverflow.com/a/40294058/140927\n// // Handles cyclic references\n// export function deepClonePrimitives(obj, hash = new WeakMap()) {\n//\n// // primitives\n// if (Object(obj) !== obj) {\n// // log('Primitive', obj)\n// return obj\n// }\n//\n// // cyclic reference\n// if (hash.has(obj)) {\n// return hash.get(obj)\n// }\n//\n// let result\n//\n// // primitives as objects like new String(), new Number()\n// if (\n// obj instanceof String ||\n// obj instanceof Number ||\n// obj instanceof BigInt ||\n// obj instanceof Boolean ||\n// obj instanceof Symbol\n// ) {\n// result = new obj.constructor(obj.valueOf())\n// // hash.set(obj, result)\n// return result\n// }\n//\n// // log('Obj', obj)\n//\n// if (obj instanceof Set) {\n// result = new Set(obj)\n// } else if (obj instanceof Map) {\n// result = new Map(Array.from(obj, ([key, val]) => [key, deepClonePrimitives(val, hash)]))\n// } else if (obj instanceof Date) {\n// result = new Date(obj)\n// } else if (obj instanceof RegExp) {\n// result = new RegExp(obj.source, obj.flags)\n// } else if (Array.isArray(obj)) {\n// result = Array.from(obj, val => deepClonePrimitives(val, hash))\n// } else if (obj.constructor) {\n// result = new obj.constructor()\n// log('bj object', result)\n// } else if (obj instanceof Function || typeof obj === 'function') {\n// log('Keep object', obj, Object.getPrototypeOf(obj))\n// result = obj\n// } else {\n// result = Object.create(null)\n// }\n//\n// hash.set(obj, result)\n//\n// return Object.assign(result, ...Object.keys(obj).map(key => ({\n// [key]: deepClonePrimitives(obj[key], hash),\n// })))\n// }\n","// Original from https://github.com/AsyncBanana/microdiff MIT\n// Alternative https://github.com/kpdecker/jsdiff\n\nexport type DifferenceType = 'new' | 'upd' | 'del'\n\nexport interface Difference {\n type: DifferenceType\n path: (string | number)[]\n value?: any\n}\n\ninterface Options {\n cyclesFix: boolean\n}\n\n/**\n * Describes the changes between to object with a list like:\n *\n * ```\n * [{\n * type: 'upd',\n * path: ['a'],\n * value: 1\n * },\n * {\n * type: 'del',\n * path: ['b', 'c']\n * }\n * ...]\n * ```\n */\nexport function diffObjects(\n obj: Record<string, any> | any[],\n newObj: Record<string, any> | any[],\n options: Partial<Options> = { cyclesFix: true },\n _stack: Record<string, any>[] = [],\n): Difference[] {\n let diffs: Difference[] = []\n const isObjArray = Array.isArray(obj)\n\n for (const key in obj) {\n const objValue = (obj as any)[key] // works for both array and record, only TS doesn't know ;)\n const path = isObjArray ? +key : key\n if (!(key in newObj)) {\n diffs.push({\n type: 'del',\n path: [path],\n })\n continue\n }\n const newValue = (newObj as any)[key]\n const areObjects = typeof objValue === 'object' && typeof newValue === 'object'\n if (objValue\n && newValue\n && areObjects\n && !(['Date', 'RegExp', 'String', 'Number'].includes(Object.getPrototypeOf(objValue).constructor.name))\n && (options.cyclesFix ? !_stack.includes(objValue) : true)\n ) {\n const nestedDiffs = diffObjects(\n objValue,\n newValue,\n options,\n options.cyclesFix ? _stack.concat([objValue]) : [],\n )\n diffs = [...diffs, ...nestedDiffs.map((difference) => {\n difference.path.unshift(path)\n return difference\n })]\n }\n else if (\n objValue !== newValue\n && !(\n areObjects\n && (Number.isNaN(objValue)\n ? `${objValue}` === `${newValue}`\n : +objValue === +newValue)\n )\n ) {\n diffs.push({\n path: [path],\n type: 'upd',\n value: newValue,\n })\n }\n }\n\n const isNewObjArray = Array.isArray(newObj)\n for (const key in newObj) {\n if (!(key in obj)) {\n diffs.push({\n type: 'new',\n path: [isNewObjArray ? +key : key],\n value: (newObj as any)[key], // works for both array and record, only TS doesn't know ;)\n })\n }\n }\n return diffs\n}\n","export function escapeHTML(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/'/g, '&apos;')\n .replace(/\"/g, '&quot;')\n}\n\nexport function unescapeHTML(s: string): string {\n return s\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&quot;/gi, '\"')\n .replace(/&apos;/gi, '\\'')\n .replace(/&amp;/gi, '&')\n}\n","export type FilterFunction<T> = (o: T) => boolean\nexport type MapperFunction<T> = (o: T) => any\n\n/** Apply multiple filters, optionally transform through mappers, filter null/undefined items. */\nexport function listQuery<T>(\n list: T[],\n filters: FilterFunction<T>[],\n mappers: MapperFunction<T>[] = [],\n): T | any[] {\n return list\n .filter((o: T) => !filters.some(a => !a(o)))\n .map((o) => {\n for (const m of mappers)\n o = m(o)\n return o\n })\n .filter(o => o != null)\n}\n\n/** Split up a list by `key` resulting in a Record of `key` and sub-list. */\nexport function listGroupBy<T extends Record<string, any>>(\n list: T[],\n key: keyof T,\n): Record<string, T[]> {\n return list.reduce((result: any, currentValue: T) => {\n const groupValue = String(currentValue[key])\n ;(result[groupValue] = result[groupValue] || []).push(currentValue)\n return result\n }, {})\n}\n\n/** Returns a list of values of a certain `key`. No duplicates. */\nexport function listDistinctUnion<T extends Record<string, any>>(\n list: T[],\n key: keyof T,\n): any[] {\n return Array.from(\n list.reduce(\n (result: Set<any>, currentValue: T) => result.add(currentValue[key]),\n new Set(),\n ),\n )\n}\n\n/** Returns a list of values of a certain `key`. */\nexport function listOfKey<T extends Record<string, any>>(\n list: T[],\n key: keyof T,\n): any[] {\n return list.map(item => item[key])\n}\n","import { isArray, isObject } from './is'\n\n/** Like `.map()` for object. Return new key and value or `undefined` to delete. */\nexport function objectMap<T = any>(\n obj: any,\n fn: (\n key: string,\n value: any\n ) => [key: string, value: T] | T | undefined | null,\n): Record<string, T> {\n if (!isObject(obj))\n return {}\n return Object.fromEntries(\n Object.entries(obj)\n .map(([k, v]) => {\n const r = fn(k, v)\n if (isArray(r) && r.length === 2)\n return r\n\n return [k, r]\n })\n .filter(v => v != null),\n )\n}\n\n/** Merge right into left object. If dispose is defined, it will be combined. Left can be a complex object i.e. a insantiated class. */\nexport function objectMergeDisposable<A extends object, B extends object>(\n a: A,\n b: B,\n): A & B {\n // @ts-expect-error xxx\n if (b.dispose && a.dispose) {\n // @ts-expect-error xxx\n b.dispose.add(a.dispose)\n }\n return Object.assign(a, b)\n}\n\n// export function objectMerge<A, B>(a: A, b: B): A & B {\n// return Object.assign({}, a, b)\n// }\n\nexport function objectIsEmpty(obj: object) {\n return Object.keys(obj).length <= 0\n}\n","const rxEscape = /[\\\\\\-\\[\\]\\/{}()*+?.^$|]/g // Finds: \\ - [ ] / { } ( ) * + ? . ^ $ |\n\nexport function escapeRegExp(value: RegExp | string): string {\n if (!value)\n return ''\n if (value instanceof RegExp)\n return value.source\n return value.replace(rxEscape, '\\\\$&')\n}\n","// https://github.com/sindresorhus/filenamify/blob/main/filenamify.js\n/* eslint-disable no-control-regex */\n\nimport { escapeRegExp } from './regexp'\n\nconst MAX_FILENAME_LENGTH = 100\n\n// const reControlChars = /[\\u0000-\\u001F\\u0080-\\u009F]/g\nconst reRelativePath = /^\\.+/\nconst reTrailingPeriods = /\\.+$/\nconst reFilenameIllegal = /[<>:\\\"/\\\\|?*\\u0000-\\u001F\\u0080-\\u009F]+/gm // https://superuser.com/questions/358855/what-characters-are-safe-in-cross-platform-file-names-for-linux-windows-and-os/358861#358861\n\nfunction filenameReservedRegex() {\n return reFilenameIllegal // /[<>:\"/\\\\|?*\\u0000-\\u001F]/g\n}\n\nfunction windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i\n}\n\n/** Ensure a valid file name. Unsupported characters get a `replacement`, default: `_` */\nexport function toValidFilename(string: string, replacement = '_'): string | never {\n if (typeof string !== 'string')\n throw new TypeError('Expected a string')\n\n if (filenameReservedRegex().test(replacement))\n throw new Error('Replacement string cannot contain reserved filename characters')\n\n const reReplacement = `(${escapeRegExp(replacement)})+`\n\n string = string\n .replace(filenameReservedRegex(), replacement)\n .replace(reRelativePath, replacement)\n .replace(reTrailingPeriods, '')\n .replace(new RegExp(reReplacement, 'gm'), replacement) // collapse\n .trim()\n\n string = windowsReservedNameRegex().test(string) ? string + replacement : string\n\n return string.slice(0, MAX_FILENAME_LENGTH)\n}\n","// From https://v2.dinerojs.com/docs/api/formatting/to-unit MIT\n\nexport type RoundingMode = (value: number) => number\n\nexport function isHalf(value: number) {\n return Math.abs(value) % 1 === 0.5\n}\nexport function isEven(value: number) {\n return value % 2 === 0\n}\n\nexport const roundUp: RoundingMode = value => Math.ceil(value)\nexport const roundDown: RoundingMode = value => Math.floor(value)\nexport const roundHalfUp: RoundingMode = value => Math.round(value)\n\n/**\n * Round a number with half values to nearest odd integer.\n */\nexport const roundHalfOdd: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded - 1 : rounded\n}\n\n/**\n * Round a number with half values to nearest integer farthest from zero.\n */\nexport const roundHalfAwayFromZero: RoundingMode = (value) => {\n return isHalf(value)\n ? Math.sign(value) * Math.ceil(Math.abs(value))\n : Math.round(value)\n}\n\n/**\n * Round a number with half values down.\n */\nexport const roundHalfDown: RoundingMode = value =>\n isHalf(value) ? Math.floor(value) : Math.round(value)\n\n/**\n * Round a number with half values to nearest even integer.\n * https://wiki.c2.com/?BankersRounding\n */\nexport const roundHalfEven: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded : rounded - 1\n}\n\n/**\n * Round a number with half values to nearest integer closest to zero.\n */\nexport const roundHalfTowardsZero: RoundingMode = value =>\n isHalf(value)\n ? Math.sign(value) * Math.floor(Math.abs(value))\n : Math.round(value)\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getSecureRandomIfPossible } from './math'\n\n// Get a sort_weight suitable for adding to top of list\n// Original idea https://holtwick.de/en/blog/smart-table-reordering\n\nexport interface SortableItem {\n sort_weight: number\n}\n\nexport function startSortWeight(items: SortableItem[]): number {\n return (\n items.reduce((acc, item) => Math.min(acc, item.sort_weight || 0), 0)\n - 1\n - getSecureRandomIfPossible()\n )\n}\n\n// Get a sort_weight suitable for adding to end of list\nexport function endSortWeight(items: SortableItem[]): number {\n return (\n items.reduce((acc, item) => Math.max(acc, item.sort_weight || 0), 0)\n + 1\n + getSecureRandomIfPossible()\n )\n}\n\n// The real magic\nexport function moveSortWeight(\n newIndex: number,\n oldIndex: number,\n items: SortableItem[],\n): number {\n const count = items.length\n\n const moveLower = newIndex < oldIndex\n if (count <= 0 || newIndex >= count - 1)\n return endSortWeight(items)\n\n if (newIndex <= 0)\n return startSortWeight(items)\n\n // Make sure they are sorted\n items = sortedItems([...items])\n\n const step = moveLower ? -1 : 0\n const lower = items[newIndex + step].sort_weight || 0\n const upper = items[newIndex + step + 1].sort_weight || 0\n const distance = upper - lower\n if (distance === 0) {\n // Ugly list with no presets, make the best guess\n if (moveLower)\n return startSortWeight(items)\n\n return endSortWeight(items)\n }\n const middle = lower + distance / 2\n const fuzzy = distance * 0.01 * (getSecureRandomIfPossible() - 0.5) // 1% fuzziness to avoid conflicts\n return middle + fuzzy\n}\n\nexport function sortedItems<T extends SortableItem>(items: T[]): T[] {\n items.sort((a, b) => (a.sort_weight || 0) - (b.sort_weight || 0))\n return items\n}\n","import { getSecureRandomIfPossible } from './math'\n\n/** CRDT compatible sorting with a single operation. Default name is `sort` */\nexport function useSorted<S extends Record<string, any>>(\n config: {\n getter?: (item: S) => number\n // setter?: (item: S, value: number) => void\n } = {},\n) {\n const {\n getter = (item: any): number => item.sort,\n // setter = (item: any, value) => (item.sort = value),\n } = config\n\n /** Return sorted list from low to high. */\n function items<T extends S>(items: T[]): T[] {\n items.sort((a, b) => (getter(a) || 0) - (getter(b) || 0))\n return items\n }\n\n /** Get a sort suitable for adding to start of list. */\n function start(items: S[]): number {\n return (\n items.reduce((acc, item) => Math.min(acc, getter(item) || 0), 0) - 1 - getSecureRandomIfPossible()\n )\n }\n\n /** Get a sort suitable for adding to end of list. */\n function end(items: S[]): number {\n return (\n items.reduce((acc, item) => Math.max(acc, getter(item) || 0), 0) + 1 + getSecureRandomIfPossible()\n )\n }\n\n /** Find a suitable value inbetween a lower and upper bound. */\n function between(lower?: number, upper?: number): number {\n if (lower == null)\n lower = (upper ?? 0) - 1\n if (upper == null)\n upper = (lower ?? 0) + 1\n\n const distance = upper - lower\n // if (distance === 0)\n\n const middle = lower + distance / 2\n const fuzzy = distance * 0.01 * (getSecureRandomIfPossible() - 0.5) // 1% fuzziness to avoid conflicts\n return middle + fuzzy\n }\n\n /** Mainly for drag and drop movements, where an item has to be moved to another index. Respects its own move as well. */\n function move(\n newIndex: number,\n oldIndex: number,\n sortableItems: S[],\n ): number {\n const count = sortableItems.length\n\n const moveLower = newIndex < oldIndex\n if (count <= 0 || newIndex >= count - 1)\n return end(sortableItems)\n\n if (newIndex <= 0)\n return start(sortableItems)\n\n // Make sure they are sorted\n sortableItems = items([...sortableItems])\n\n const step = moveLower ? -1 : 0\n const lower = getter(sortableItems[newIndex + step]) || 0\n const upper = getter(sortableItems[newIndex + step + 1]) || 0\n const distance = upper - lower\n if (distance === 0) {\n // Ugly list with no presets, make the best guess\n if (moveLower)\n return start(sortableItems)\n\n return end(sortableItems)\n }\n const middle = lower + distance / 2\n const fuzzy = distance * 0.01 * (getSecureRandomIfPossible() - 0.5) // 1% fuzziness to avoid conflicts\n return middle + fuzzy\n }\n\n return {\n start,\n end,\n between,\n move,\n items,\n }\n}\n","// Via lodash, MIT, https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L14181\n\n/**\n * The base implementation of `propertyOf` without support for deep paths.\n */\nfunction basePropertyOf(object: any): any {\n return (key: any) => object == null ? undefined : object[key]\n}\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nconst deburredLetters = {\n // Latin-1 Supplement block.\n À: 'A',\n Á: 'A',\n Â: 'A',\n Ã: 'A',\n Ä: 'A',\n Å: 'A',\n à: 'a',\n á: 'a',\n â: 'a',\n ã: 'a',\n ä: 'a',\n å: 'a',\n Ç: 'C',\n ç: 'c',\n Ð: 'D',\n ð: 'd',\n È: 'E',\n É: 'E',\n Ê: 'E',\n Ë: 'E',\n è: 'e',\n é: 'e',\n ê: 'e',\n ë: 'e',\n Ì: 'I',\n Í: 'I',\n Î: 'I',\n Ï: 'I',\n ì: 'i',\n í: 'i',\n î: 'i',\n ï: 'i',\n Ñ: 'N',\n ñ: 'n',\n Ò: 'O',\n Ó: 'O',\n Ô: 'O',\n Õ: 'O',\n Ö: 'O',\n Ø: 'O',\n ò: 'o',\n ó: 'o',\n ô: 'o',\n õ: 'o',\n ö: 'o',\n ø: 'o',\n Ù: 'U',\n Ú: 'U',\n Û: 'U',\n Ü: 'U',\n ù: 'u',\n ú: 'u',\n û: 'u',\n ü: 'u',\n Ý: 'Y',\n ý: 'y',\n ÿ: 'y',\n Æ: 'Ae',\n æ: 'ae',\n Þ: 'Th',\n þ: 'th',\n ß: 'ss',\n // Latin Extended-A block.\n Ā: 'A',\n Ă: 'A',\n Ą: 'A',\n ā: 'a',\n ă: 'a',\n ą: 'a',\n Ć: 'C',\n Ĉ: 'C',\n Ċ: 'C',\n Č: 'C',\n ć: 'c',\n ĉ: 'c',\n ċ: 'c',\n č: 'c',\n Ď: 'D',\n Đ: 'D',\n ď: 'd',\n đ: 'd',\n Ē: 'E',\n Ĕ: 'E',\n Ė: 'E',\n Ę: 'E',\n Ě: 'E',\n ē: 'e',\n ĕ: 'e',\n ė: 'e',\n ę: 'e',\n ě: 'e',\n Ĝ: 'G',\n Ğ: 'G',\n Ġ: 'G',\n Ģ: 'G',\n ĝ: 'g',\n ğ: 'g',\n ġ: 'g',\n ģ: 'g',\n Ĥ: 'H',\n Ħ: 'H',\n ĥ: 'h',\n ħ: 'h',\n Ĩ: 'I',\n Ī: 'I',\n Ĭ: 'I',\n Į: 'I',\n İ: 'I',\n ĩ: 'i',\n ī: 'i',\n ĭ: 'i',\n į: 'i',\n ı: 'i',\n Ĵ: 'J',\n ĵ: 'j',\n Ķ: 'K',\n ķ: 'k',\n ĸ: 'k',\n Ĺ: 'L',\n Ļ: 'L',\n Ľ: 'L',\n Ŀ: 'L',\n Ł: 'L',\n ĺ: 'l',\n ļ: 'l',\n ľ: 'l',\n ŀ: 'l',\n ł: 'l',\n Ń: 'N',\n Ņ: 'N',\n Ň: 'N',\n Ŋ: 'N',\n ń: 'n',\n ņ: 'n',\n ň: 'n',\n ŋ: 'n',\n Ō: 'O',\n Ŏ: 'O',\n Ő: 'O',\n ō: 'o',\n ŏ: 'o',\n ő: 'o',\n Ŕ: 'R',\n Ŗ: 'R',\n Ř: 'R',\n ŕ: 'r',\n ŗ: 'r',\n ř: 'r',\n Ś: 'S',\n Ŝ: 'S',\n Ş: 'S',\n Š: 'S',\n ś: 's',\n ŝ: 's',\n ş: 's',\n š: 's',\n Ţ: 'T',\n Ť: 'T',\n Ŧ: 'T',\n ţ: 't',\n ť: 't',\n ŧ: 't',\n Ũ: 'U',\n Ū: 'U',\n Ŭ: 'U',\n Ů: 'U',\n Ű: 'U',\n Ų: 'U',\n ũ: 'u',\n ū: 'u',\n ŭ: 'u',\n ů: 'u',\n ű: 'u',\n ų: 'u',\n Ŵ: 'W',\n ŵ: 'w',\n Ŷ: 'Y',\n ŷ: 'y',\n Ÿ: 'Y',\n Ź: 'Z',\n Ż: 'Z',\n Ž: 'Z',\n ź: 'z',\n ż: 'z',\n ž: 'z',\n IJ: 'IJ',\n ij: 'ij',\n Œ: 'Oe',\n œ: 'oe',\n ʼn: '\\'n',\n ſ: 's',\n}\n\n/**\n * Used by `deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nconst deburrLetter = basePropertyOf(deburredLetters)\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nconst reLatin = /[\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\u0100-\\u017F]/g\n\n/** Used to compose unicode character classes. */\nconst rsComboMarksRange = '\\\\u0300-\\\\u036f'\nconst reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f'\nconst rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff'\nconst rsComboMarksExtendedRange = '\\\\u1ab0-\\\\u1aff'\nconst rsComboMarksSupplementRange = '\\\\u1dc0-\\\\u1dff'\nconst rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange + rsComboMarksExtendedRange + rsComboMarksSupplementRange\n\n/** Used to compose unicode capture groups. */\nconst rsCombo = `[${rsComboRange}]`\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\n\n// eslint-disable-next-line no-misleading-character-class\nconst reComboMark = RegExp(rsCombo, 'g')\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @param {string} string The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * deburr('déjà vu')\n * // => 'deja vu'\n */\nexport function deburr(string: string): string {\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '')\n}\n","// https://mathiasbynens.be/demo/url-regex\n// https://gist.github.com/dperini/729294\n\nimport { escapeHTML } from './html'\n\nconst findURL = /((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00A1-\\uFFFF][a-z0-9\\u00A1-\\uFFFF_-]{0,62})?[a-z0-9\\u00A1-\\uFFFF]\\.)+(?:[a-z\\u00A1-\\uFFFF]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?)/gim\n\nexport function linkifyPlainText(text: string): string {\n return text\n .split(findURL)\n .map((part, i) => {\n const escapedPart = escapeHTML(part)\n return i % 2\n ? `<a target=\"_blank\" href=\"${escapedPart}\">${toHumanReadableUrl(\n escapedPart,\n )}</a>`\n : escapedPart\n })\n .join('')\n}\n\nexport function toHumanReadableUrl(url: string): string {\n return url.replace(/^https?:\\/\\/(www\\.)?/, '').replace(/\\/$/, '')\n}\n\n//\n\nexport function encodeQuery(data: Record<string, any>, filterValue?: (value: any) => boolean) {\n const pairs = []\n for (let [key, value] of Object.entries(data)) {\n if (value != null) {\n if (!Array.isArray(value))\n value = [value]\n for (const v of value) {\n if (filterValue && !filterValue(v))\n continue\n else if (v == null)\n continue\n pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`)\n }\n }\n }\n return pairs.join('&')\n}\n\nexport function parseQuery(queryString: string) {\n const query: any = {}\n const pairs = (\n queryString[0] === '?' ? queryString.substr(1) : queryString\n ).split('&')\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i].split('=')\n const key = decodeURIComponent(pair[0])\n const value = decodeURIComponent(pair[1] || '')\n if (query[key] != null) {\n if (!Array.isArray(query[key]))\n query[key] = [query[key]]\n\n query[key].push(value)\n }\n else {\n query[key] = value\n }\n }\n return query\n}\n","// PGP Word List from https://web.mit.edu/network/pgpfone/manual/index.html#PGP000062\n// See https://en.wikipedia.org/wiki/PGP_word_list\n\nimport { toUint8Array } from './bin'\nimport { deburr } from './string-deburr'\n\nconst wordsEven = ['aardvark', 'absurd', 'accrue', 'acme', 'adrift', 'adult', 'afflict', 'ahead', 'aimless', 'Algol', 'allow', 'alone', 'ammo', 'ancient', 'apple', 'artist', 'assume', 'Athens', 'atlas', 'Aztec', 'baboon', 'backfield', 'backward', 'basalt', 'beaming', 'bedlamp', 'beehive', 'beeswax', 'befriend', 'Belfast', 'berserk', 'billiard', 'bison', 'blackjack', 'blockade', 'blowtorch', 'bluebird', 'bombast', 'bookshelf', 'brackish', 'breadline', 'breakup', 'brickyard', 'briefcase', 'Burbank', 'button', 'buzzard', 'cement', 'chairlift', 'chatter', 'checkup', 'chisel', 'choking', 'chopper', 'Christmas', 'clamshell', 'classic', 'classroom', 'cleanup', 'clockwork', 'cobra', 'commence', 'concert', 'cowbell', 'crackdown', 'cranky', 'crowfoot', 'crucial', 'crumpled', 'crusade', 'cubic', 'deadbolt', 'deckhand', 'dogsled', 'dosage', 'dragnet', 'drainage', 'dreadful', 'drifter', 'dropper', 'drumbeat', 'drunken', 'Dupont', 'dwelling', 'eating', 'edict', 'egghead', 'eightball', 'endorse', 'endow', 'enlist', 'erase', 'escape', 'exceed', 'eyeglass', 'eyetooth', 'facial', 'fallout', 'flagpole', 'flatfoot', 'flytrap', 'fracture', 'fragile', 'framework', 'freedom', 'frighten', 'gazelle', 'Geiger', 'Glasgow', 'glitter', 'glucose', 'goggles', 'goldfish', 'gremlin', 'guidance', 'hamlet', 'highchair', 'hockey', 'hotdog', 'indoors', 'indulge', 'inverse', 'involve', 'island', 'Janus', 'jawbone', 'keyboard', 'kickoff', 'kiwi', 'klaxon', 'lockup', 'merit', 'minnow', 'miser', 'Mohawk', 'mural', 'music', 'Neptune', 'newborn', 'nightbird', 'obtuse', 'offload', 'oilfield', 'optic', 'orca', 'payday', 'peachy', 'pheasant', 'physique', 'playhouse', 'Pluto', 'preclude', 'prefer', 'preshrunk', 'printer', 'profile', 'prowler', 'pupil', 'puppy', 'python', 'quadrant', 'quiver', 'quota', 'ragtime', 'ratchet', 'rebirth', 'reform', 'regain', 'reindeer', 'rematch', 'repay', 'retouch', 'revenge', 'reward', 'rhythm', 'ringbolt', 'robust', 'rocker', 'ruffled', 'sawdust', 'scallion', 'scenic', 'scorecard', 'Scotland', 'seabird', 'select', 'sentence', 'shadow', 'showgirl', 'skullcap', 'skydive', 'slingshot', 'slothful', 'slowdown', 'snapline', 'snapshot', 'snowcap', 'snowslide', 'solo', 'spaniel', 'spearhead', 'spellbind', 'spheroid', 'spigot', 'spindle', 'spoilage', 'spyglass', 'stagehand', 'stagnate', 'stairway', 'standard', 'stapler', 'steamship', 'stepchild', 'sterling', 'stockman', 'stopwatch', 'stormy', 'sugar', 'surmount', 'suspense', 'swelter', 'tactics', 'talon', 'tapeworm', 'tempest', 'tiger', 'tissue', 'tonic', 'tracker', 'transit', 'trauma', 'treadmill', 'Trojan', 'trouble', 'tumor', 'tunnel', 'tycoon', 'umpire', 'uncut', 'unearth', 'unwind', 'uproot', 'upset', 'upshot', 'vapor', 'village', 'virus', 'Vulcan', 'waffle', 'wallet', 'watchword', 'wayside', 'willow', 'woodlark', 'Zulu']\nconst wordsOdd = ['adroitness', 'adviser', 'aggregate', 'alkali', 'almighty', 'amulet', 'amusement', 'antenna', 'applicant', 'Apollo', 'armistice', 'article', 'asteroid', 'Atlantic', 'atmosphere', 'autopsy', 'Babylon', 'backwater', 'barbecue', 'belowground', 'bifocals', 'bodyguard', 'borderline', 'bottomless', 'Bradbury', 'Brazilian', 'breakaway', 'Burlington', 'businessman', 'butterfat', 'Camelot', 'candidate', 'cannonball', 'Capricorn', 'caravan', 'caretaker', 'celebrate', 'cellulose', 'certify', 'chambermaid', 'Cherokee', 'Chicago', 'clergyman', 'coherence', 'combustion', 'commando', 'company', 'component', 'concurrent', 'confidence', 'conformist', 'congregate', 'consensus', 'consulting', 'corporate', 'corrosion', 'councilman', 'crossover', 'cumbersome', 'customer', 'Dakota', 'decadence', 'December', 'decimal', 'designing', 'detector', 'detergent', 'determine', 'dictator', 'dinosaur', 'direction', 'disable', 'disbelief', 'disruptive', 'distortion', 'divisive', 'document', 'embezzle', 'enchanting', 'enrollment', 'enterprise', 'equation', 'equipment', 'escapade', 'Eskimo', 'everyday', 'examine', 'existence', 'exodus', 'fascinate', 'filament', 'finicky', 'forever', 'fortitude', 'frequency', 'gadgetry', 'Galveston', 'getaway', 'glossary', 'gossamer', 'graduate', 'gravity', 'guitarist', 'hamburger', 'Hamilton', 'handiwork', 'hazardous', 'headwaters', 'hemisphere', 'hesitate', 'hideaway', 'holiness', 'hurricane', 'hydraulic', 'impartial', 'impetus', 'inception', 'indigo', 'inertia', 'infancy', 'inferno', 'informant', 'insincere', 'insurgent', 'integrate', 'intention', 'inventive', 'Istanbul', 'Jamaica', 'Jupiter', 'leprosy', 'letterhead', 'liberty', 'maritime', 'matchmaker', 'maverick', 'Medusa', 'megaton', 'microscope', 'microwave', 'midsummer', 'millionaire', 'miracle', 'misnomer', 'molasses', 'molecule', 'Montana', 'monument', 'mosquito', 'narrative', 'nebula', 'newsletter', 'Norwegian', 'October', 'Ohio', 'onlooker', 'opulent', 'Orlando', 'outfielder', 'Pacific', 'pandemic', 'pandora', 'paperweight', 'paragon', 'paragraph', 'paramount', 'passenger', 'pedigree', 'Pegasus', 'penetrate', 'perceptive', 'performance', 'pharmacy', 'phonetic', 'photograph', 'pioneer', 'pocketful', 'politeness', 'positive', 'potato', 'processor', 'prophecy', 'provincial', 'proximate', 'puberty', 'publisher', 'pyramid', 'quantity', 'racketeer', 'rebellion', 'recipe', 'recover', 'repellent', 'replica', 'reproduce', 'resistor', 'responsive', 'retraction', 'retrieval', 'retrospect', 'revenue', 'revival', 'revolver', 'Sahara', 'sandalwood', 'sardonic', 'Saturday', 'savagery', 'scavenger', 'sensation', 'sociable', 'souvenir', 'specialist', 'speculate', 'stethoscope', 'stupendous', 'supportive', 'surrender', 'suspicious', 'sympathy', 'tambourine', 'telephone', 'therapist', 'tobacco', 'tolerance', 'tomorrow', 'torpedo', 'tradition', 'travesty', 'trombonist', 'truncated', 'typewriter', 'ultimate', 'undaunted', 'underfoot', 'unicorn', 'unify', 'universe', 'unravel', 'upcoming', 'vacancy', 'vagabond', 'versatile', 'vertigo', 'Virginia', 'visitor', 'vocalist', 'voyager', 'warranty', 'Waterloo', 'whimsical', 'Wichita', 'Wilmington', 'Wyoming', 'yesteryear', 'Yucatan']\n\nexport function Uint8ArrayToWords(bytes: Uint8Array, sepPair = ' ', sepGroup = ' '): string {\n return Array.from(bytes).map((byte, pos) => pos % 2 ? wordsOdd[byte] + sepGroup : wordsEven[byte] + sepPair).join('').slice(0, -(bytes.length % 2 ? sepPair : sepGroup).length)\n}\n\nexport function wordsToUint8Array(words: string[]): Uint8Array {\n return toUint8Array(words.map((w, pos) => (pos % 2 ? wordsOdd : wordsEven).findIndex(wl => wl.toLocaleLowerCase() === deburr(w).toLocaleLowerCase().trim())))\n}\n","/* eslint-disable no-cond-assign */\n\nconst RX_WHITESPACE = /\\\\\\s|\\s+|#[^\\n]*\\n?/gm\nconst RX_REAL_GROUPS = /\\(\\?P?<(\\w[\\w\\d_]+)>|\\((?!\\?(:|\\!|=|<=|<\\!))/gm\nconst RX_LOOK_BEHIND = /^((?:\\(\\?[\\w$]+\\))?)\\(\\?<([=!])([\\s\\S]*?)\\)/gm\n\nexport function regExpString(rx: string | RegExp): string {\n return typeof rx === 'string' ? rx : (rx.source || '')\n}\n\nexport function regExpEscape(str: string): string {\n return str.replace(/[-\\[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\nexport class XRX {\n lookBehind\n namedGroups: Record<string, number> = {}\n names: string[] = []\n rx: RegExp\n\n constructor(pattern: string | RegExp, flags?: string) {\n let _flags: string = flags ?? ''\n let _rx: string\n\n if (pattern instanceof RegExp) {\n if (flags == null)\n _flags = pattern.flags\n\n _rx = pattern.source\n }\n else {\n _rx = pattern\n }\n\n // eXtended / Ignore Whitespace\n const extended = _flags && _flags.includes('x')\n if (extended) {\n _flags = _flags.replace('x', '')\n _rx = _rx.replace(RX_WHITESPACE, (r) => {\n // log('rp', r)\n return r[0] === '\\\\' ? r : ''\n })\n }\n\n // Named Groups\n if (!(pattern instanceof RegExp)) {\n let index = 0\n _rx = _rx.replace(RX_REAL_GROUPS, (str, name) => {\n // log('>>>', name)\n index += 1\n if (name) {\n if (\n name !== 'index'\n && name !== 'length'\n && !this.namedGroups[name]\n )\n this.namedGroups[name] = index\n // else\n // log.error(`Unallowed or duplicate group name: ${name}`)\n\n return '('\n }\n return str\n })\n this.names = Object.keys(this.namedGroups)\n }\n\n // http://www.rexegg.com/regex-best-trick.html\n\n _rx = regExpString(_rx)\n RX_LOOK_BEHIND.lastIndex = 0\n const parts = RX_LOOK_BEHIND.exec(_rx)\n if (parts) {\n this.lookBehind = {\n rx: new RegExp(`${parts[3]}$(?!\\\\s)`),\n expect: parts ? parts[2] === '=' : !parts,\n }\n _rx = _rx.substr(parts[0].length)\n }\n\n this.rx = new RegExp(_rx, _flags)\n }\n\n // flagsString() {\n // let hash = this.rx.toString() + '/'\n // if (this.rx.global) {\n // hash += 'g'\n // }\n // if (this.rx.multiline) {\n // hash += 'm'\n // }\n // if (this.rx.ignoreCase) {\n // hash += 'i'\n // }\n // if (this.rx.unicode) {\n // hash += 'u'\n // }\n // if (this.rx.sticky) {\n // hash += 'y'\n // }\n // }\n\n get lastIndex(): number {\n return this.rx.lastIndex\n }\n\n set lastIndex(index: number) {\n this.rx.lastIndex = index\n }\n\n _handleMatch(m: any) {\n if (this.lookBehind) {\n const leftContext = m.input.slice(0, m.index)\n if (this.lookBehind.expect !== this.lookBehind.rx.test(leftContext))\n return null\n }\n for (const name of this.names)\n m[name] = m[this.namedGroups[name]]\n\n return m\n }\n\n exec(str: string) {\n let m\n while ((m = this.rx.exec(str))) {\n if (this.rx.lastIndex === m.index)\n this.rx.lastIndex++\n m = this._handleMatch(m)\n if (m != null)\n return m\n }\n }\n\n execAll(str: string) {\n const matches = []\n let m\n this.rx.lastIndex = 0\n while ((m = this.exec(str)))\n matches.push(m)\n\n this.rx.lastIndex = 0\n // log('execAll:', matches)\n return matches\n }\n\n replace(str: string, replacement: string | ((m: string) => string)) {\n const fn = typeof replacement === 'function' ? replacement : () => replacement\n return str.replace(this.rx, (m) => {\n // m = this._handleMatch(m)\n return fn(m)\n })\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n/* eslint-disable node/prefer-global/process */\n\nimport { isString } from '../data'\nimport type { LogLevel, LogLevelAliasType } from './log-base'\nimport { LogLevelAlias, LogLevelAll, LogLevelOff } from './log-base'\n\ninterface NamespaceFilter {\n (name: string): boolean\n accept: RegExp[]\n reject: RegExp[]\n filter: string\n}\n\nexport function getNamespaceFilterString(defaultNamespaceFilter: any): string {\n if (\n defaultNamespaceFilter === true\n || defaultNamespaceFilter === 'true'\n || defaultNamespaceFilter === '1'\n || (typeof defaultNamespaceFilter === 'number' && defaultNamespaceFilter !== 0)\n )\n defaultNamespaceFilter = '*'\n else if (\n defaultNamespaceFilter === false\n || defaultNamespaceFilter === 'false'\n || defaultNamespaceFilter === 0\n || defaultNamespaceFilter === '0'\n || defaultNamespaceFilter == null\n || defaultNamespaceFilter === 'null'\n || defaultNamespaceFilter === 'undefined'\n )\n defaultNamespaceFilter = ''\n else\n defaultNamespaceFilter = String(defaultNamespaceFilter)\n\n return defaultNamespaceFilter\n}\n\nfunction getDefaultNamespaceFilter() {\n return getNamespaceFilterString(\n typeof process !== 'undefined'\n ? process.env.ZEED ?? process.env.DEBUG\n : typeof localStorage !== 'undefined'\n ? localStorage.zeed ?? localStorage.debug\n : '*',\n )\n}\n\n/**\n * Filter as described here https://github.com/visionmedia/debug#wildcards\n *\n * @param filter Namespace filter\n * @returns Function to check if filter applies\n */\nexport function useNamespaceFilter(\n filter: string = getDefaultNamespaceFilter(),\n): NamespaceFilter {\n let fn: any // (name: string) => boolean\n const reject = [] as RegExp[]\n const accept = [] as RegExp[]\n\n if (!filter) {\n fn = function (_name: string) {\n return false\n }\n }\n else if (filter === '*') {\n fn = function (_name: string) {\n return true\n }\n }\n else {\n let i\n const split = filter.split(/[\\s,]+/)\n const len = split.length\n for (i = 0; i < len; i++) {\n if (!split[i]) {\n // ignore empty strings\n continue\n }\n const template = split[i].replace(/\\*/g, '.*?')\n if (template[0] === '-')\n reject.push(new RegExp(`^${template.substr(1)}`))\n else\n accept.push(new RegExp(`^${template}`))\n }\n\n fn = function (name: string) {\n if (reject.length === 0 && accept.length === 0)\n return true\n\n let i, len\n for (i = 0, len = reject.length; i < len; i++) {\n if (reject[i].test(name))\n return false\n }\n for (i = 0, len = accept.length; i < len; i++) {\n if (accept[i].test(name))\n return true\n }\n return false\n }\n }\n fn.accept = accept\n fn.reject = reject\n fn.filter = filter\n return fn as NamespaceFilter\n}\n\nfunction getDefaultLevelFilter() {\n return typeof process !== 'undefined'\n ? process.env.ZEED_LEVEL ?? process.env.LEVEL ?? process.env.DEBUG_LEVEL\n : typeof localStorage !== 'undefined'\n ? localStorage.zeed_level ?? localStorage.level ?? localStorage.debug_level\n : undefined\n}\n\nexport function parseLogLevel(filter: LogLevelAliasType): LogLevel {\n if (filter === false)\n return LogLevelOff\n if (typeof filter === 'number')\n return filter\n if (typeof filter === 'string') {\n const l = LogLevelAlias[filter.toLocaleLowerCase().trim()]\n if (l != null)\n return l\n }\n return LogLevelAll\n}\n\nexport function useLevelFilter(\n filter: string | number | boolean | LogLevelAliasType = getDefaultLevelFilter(),\n): (level: number) => boolean {\n const filterLevel = parseLogLevel(filter)\n return level => level >= filterLevel\n}\n\nexport function joinLogStrings(...messages: any[]) {\n if (isString(messages[1]))\n return [`${String(messages[0])} ${String(messages[1])}`, ...messages.slice(2)]\n return messages\n\n // let s = ''\n // for (let i = 0; i < messages.length; i++) {\n // const element = messages[i]\n // if (isString(element))\n // s += (s.length > 1 ? ' ' : '') + String(element)\n // else\n // return [s, ...messages.slice(i)]\n // }\n // return [s]\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable no-console */\n\nimport type { LogHandler, LogHandlerOptions, LogMessage } from './log-base'\nimport { LogLevelError, LogLevelInfo, LogLevelWarn } from './log-base'\nimport { joinLogStrings, useLevelFilter, useNamespaceFilter } from './log-filter'\n\n/**\n * Very basic logger. Please take a look at the browser and node\n * optimized loggers. This one is just the absolute fallback option.\n */\nexport function LoggerConsoleHandler(opt: LogHandlerOptions = {}): LogHandler {\n const {\n level = undefined,\n filter = undefined,\n // colors = true,\n // levelHelper = false,\n // nameBrackets = true,\n // padding = 16,\n } = opt\n const matchesNamespace = useNamespaceFilter(filter)\n const matchesLevel = useLevelFilter(level)\n return (msg: LogMessage) => {\n if (!matchesLevel(msg.level))\n return\n if (!matchesNamespace(msg.name))\n return\n const name = msg.name ? `[${msg.name}]` : ''\n switch (msg.level) {\n case LogLevelInfo:\n console.info(...joinLogStrings(`I|* ${name}`, ...msg.messages))\n break\n case LogLevelWarn:\n console.warn(...joinLogStrings(`W|** ${name}`, ...msg.messages))\n break\n case LogLevelError:\n console.error(...joinLogStrings(`E|*** ${name}`, ...msg.messages))\n break\n default:\n console.debug(...joinLogStrings(`D| ${name}`, ...msg.messages))\n break\n }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport type { LogHandler, LogLevel, LogLevelAliasType, LogMessage, LoggerContextInterface, LoggerInterface } from './log-base'\nimport { LogLevelAll, LogLevelDebug, LogLevelError, LogLevelFatal, LogLevelInfo, LogLevelWarn } from './log-base'\nimport { LoggerConsoleHandler } from './log-console'\nimport { parseLogLevel, useNamespaceFilter } from './log-filter'\n\nexport function LoggerContext(_prefix = ''): LoggerContextInterface {\n let logHandlers: LogHandler[] = [LoggerConsoleHandler()]\n let logCheckNamespace = (_name: string) => true\n let logLock = false\n let logFactory = LoggerBaseFactory\n let logDebug = false\n\n function LoggerBaseFactory(\n name = '',\n level?: LogLevelAliasType,\n ): LoggerInterface {\n const logLevel = parseLogLevel(level ?? LogLevelAll)\n\n function defineForLogLevel(fnLevel: LogLevel, fn: any) {\n if (logLevel <= fnLevel)\n return fn\n return () => {}\n }\n\n const emit = (msg: LogMessage) => {\n // if (log.active === true) {\n // if (msg.level >= Logger.level && msg.level >= log.level) {\n if (logCheckNamespace(name)) {\n for (const handler of logHandlers) {\n if (handler)\n handler(msg)\n }\n }\n // }\n // }\n }\n\n const log = defineForLogLevel(LogLevelDebug, (...messages: any[]) => {\n emit({\n name,\n messages,\n level: LogLevelDebug,\n })\n })\n\n log.label = name\n // log.active = true\n\n log.extend = function (prefix: string): LoggerInterface {\n return logFactory(name ? `${name}:${prefix}` : prefix)\n }\n\n log.debug = defineForLogLevel(LogLevelDebug, (...messages: any[]) => {\n emit({ name, messages, level: LogLevelDebug })\n })\n\n log.info = defineForLogLevel(LogLevelInfo, (...messages: any[]) => {\n emit({ name, messages, level: LogLevelInfo })\n })\n\n log.warn = defineForLogLevel(LogLevelWarn, (...messages: any[]) => {\n emit({ name, messages, level: LogLevelWarn })\n })\n\n log.error = defineForLogLevel(LogLevelError, (...messages: any[]) => {\n emit({ name, messages, level: LogLevelError })\n })\n\n log.fatal = defineForLogLevel(LogLevelFatal, (...messages: any[]) => {\n emit({ name, messages, level: LogLevelFatal })\n throw new Error(`${messages.map(String).join(' ')}`)\n })\n\n log.assert = defineForLogLevel(LogLevelFatal, (condition: unknown, ...args: any) => {\n if (condition == null || (typeof condition === 'number' && Number.isNaN(condition)) || !condition)\n log.fatal(...args)\n })\n\n return log\n }\n\n function Logger(name = '', level?: LogLevelAliasType): LoggerInterface {\n const log = logFactory(name, level)\n if (logDebug)\n log.debug(`+++ init of logger \"${name}\" on level \"${log.level}\".`)\n return log\n }\n\n Logger.registerHandler = function (handler: LogHandler) {\n logHandlers.push(handler)\n }\n\n /** @deprecated */\n Logger.setFilter = function (namespaces: string) {\n logCheckNamespace = useNamespaceFilter(namespaces)\n }\n\n Logger.setLock = (lock = true) => (logLock = lock)\n\n Logger.setDebug = (debug = true) => (logDebug = debug)\n\n Logger.setHandlers = function (handlers: LogHandler[] = []) {\n if (logFactory !== LoggerBaseFactory)\n logFactory = LoggerBaseFactory\n\n if (logLock)\n return\n logHandlers = [...handlers].filter(h => typeof h === 'function')\n }\n\n Logger.level = LogLevelAll\n\n /** @deprecated */\n Logger.setLogLevel = function (level: LogLevel = LogLevelAll) {\n if (logLock)\n return\n Logger.level = level\n }\n\n Logger.setFactory = function (\n factory: (name?: string) => LoggerInterface,\n ): void {\n if (logLock)\n return\n logFactory = factory\n }\n\n return Logger\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getGlobalContext } from '../global'\nimport type { LogLevelAliasType, LoggerContextInterface, LoggerInterface } from './log-base'\nimport { LoggerContext } from './log-context'\nimport { LoggerConsoleHandler } from './log-console'\n\n// Global logger to guarantee all submodules use the same logger instance\n\nlet globalLogger: LoggerContextInterface\n\ndeclare global {\n interface ZeedGlobalContext {\n logger?: any // Should be LoggerContextInterface, but avoid compiler issues this way\n }\n}\n\nfunction getLoggerContext(setup?: (context: LoggerContextInterface) => void) {\n const logger = LoggerContext()\n if (setup)\n setup(logger)\n else\n logger.setHandlers([LoggerConsoleHandler()])\n return logger\n}\n\nexport function getGlobalLogger(setup?: (context: LoggerContextInterface) => void): LoggerContextInterface {\n if (globalLogger == null) {\n try {\n const gcontext = getGlobalContext()\n if (gcontext != null) {\n if (gcontext?.logger == null) {\n globalLogger = getLoggerContext(setup)\n gcontext.logger = globalLogger\n }\n else {\n globalLogger = gcontext.logger\n }\n }\n else {\n globalLogger = getLoggerContext(setup)\n }\n }\n catch (e) {\n globalLogger = getLoggerContext(setup)\n }\n }\n return globalLogger\n}\n\n/** Can be used for lazy usage e.g. inside of Zeed */\nexport function getGlobalLoggerIfExists() {\n if (globalLogger != null)\n return globalLogger\n\n try {\n const gcontext = getGlobalContext()\n if (gcontext?.logger != null)\n return gcontext.logger\n }\n catch (e) { }\n}\n\nexport function DefaultLogger(name?: string, level?: LogLevelAliasType): LoggerInterface {\n return getGlobalLogger()(name, level)\n}\n","// Taken from https://github.com/visionmedia/debug/blob/master/src/browser.js#L27\n\nconst colors = [\n '#0000CC',\n '#0000FF',\n '#0033CC',\n '#0033FF',\n '#0066CC',\n '#0066FF',\n '#0099CC',\n '#0099FF',\n '#00CC00',\n '#00CC33',\n '#00CC66',\n '#00CC99',\n '#00CCCC',\n '#00CCFF',\n '#3300CC',\n '#3300FF',\n '#3333CC',\n '#3333FF',\n '#3366CC',\n '#3366FF',\n '#3399CC',\n '#3399FF',\n '#33CC00',\n '#33CC33',\n '#33CC66',\n '#33CC99',\n '#33CCCC',\n '#33CCFF',\n '#6600CC',\n '#6600FF',\n '#6633CC',\n '#6633FF',\n '#66CC00',\n '#66CC33',\n '#9900CC',\n '#9900FF',\n '#9933CC',\n '#9933FF',\n '#99CC00',\n '#99CC33',\n '#CC0000',\n '#CC0033',\n '#CC0066',\n '#CC0099',\n '#CC00CC',\n '#CC00FF',\n '#CC3300',\n '#CC3333',\n '#CC3366',\n '#CC3399',\n '#CC33CC',\n '#CC33FF',\n '#CC6600',\n '#CC6633',\n '#CC9900',\n '#CC9933',\n '#CCCC00',\n '#CCCC33',\n '#FF0000',\n '#FF0033',\n '#FF0066',\n '#FF0099',\n '#FF00CC',\n '#FF00FF',\n '#FF3300',\n '#FF3333',\n '#FF3366',\n '#FF3399',\n '#FF33CC',\n '#FF33FF',\n '#FF6600',\n '#FF6633',\n '#FF9900',\n '#FF9933',\n '#FFCC00',\n '#FFCC33',\n]\n\nexport function browserSelectColorByName(namespace: string) {\n let hash = 0\n for (let i = 0; i < namespace.length; i++) {\n hash = (hash << 5) - hash + namespace.charCodeAt(i)\n hash |= 0 // Convert to 32bit integer\n }\n return colors[Math.abs(hash) % colors.length]\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/**\n * @returns Timestamp in miliseconds\n */\nexport function getTimestamp(): number {\n return Date.now()\n}\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)} s` : `${ms.toFixed(2)} ms`\n}\n\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n\n/**\n * @returns Timestamp in miliseconds\n */\nexport function getPerformanceTimestamp(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\nexport function duration() {\n const t0 = getPerformanceTimestamp()\n\n return function () {\n const duration = getPerformanceTimestamp() - t0\n return formatMilliseconds(duration)\n\n // if (duration > 500)\n // return `${(duration / 1000).toFixed(4)}s`\n\n // // https://elijahmanor.com/format-js-numbers\n // // https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n // return duration.toLocaleString('en-US', {\n // style: 'unit',\n // unit: 'millisecond',\n // notation: 'compact',\n // compactDisplay: 'long',\n // })\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getTimestamp } from '../time'\nimport type { LogHandler, LogHandlerOptions, LogMessage } from './log-base'\nimport { useLevelFilter, useNamespaceFilter } from './log-filter'\n\n/** Collect messages in a list. */\nexport function LoggerMemoryHandler(\n opt: LogHandlerOptions & {\n messages: LogMessage[]\n },\n): LogHandler {\n const { level = undefined, filter = undefined, messages = [] } = opt\n const matchesNamespace = useNamespaceFilter(filter)\n const matchesLevel = useLevelFilter(level)\n return (msg: LogMessage) => {\n if (!matchesLevel(msg.level))\n return\n if (!matchesNamespace(msg.name))\n return\n msg.timestamp = getTimestamp()\n messages.push(msg)\n }\n}\n","import { getGlobalLoggerIfExists } from './log'\n\n/** Always throws. */\nexport function fatal(...messages: any[]): never {\n getGlobalLoggerIfExists()?.('assert')?.fatal(...messages)\n throw new Error(`${messages.map(String).join(' ')}`)\n}\n\n/** Throws if condition is not truthy. */\nexport function assert(condition: unknown, ...messages: any[]): asserts condition {\n if (condition == null || (typeof condition === 'number' && Number.isNaN(condition)) || !condition)\n fatal(...messages)\n}\n\n/** Alias for `assert` for better differentiation to unit test's assert function. */\nexport function assertCondition(condition: unknown, ...messages: any[]): asserts condition {\n assert(condition, ...messages)\n}\n","/**\n * Original at https://github.com/dmonad/lib0\n *\n * Utility functions to work with buffers (Uint8Array).\n */\n\n/**\n * Create Uint8Array with initial content from buffer\n */\nexport function createUint8ArrayViewFromArrayBuffer(buffer: ArrayBuffer, byteOffset: number, length: number) {\n return new Uint8Array(buffer, byteOffset, length)\n}\n\n/**\n * Create Uint8Array with initial content from buffer\n */\nexport function createUint8ArrayFromArrayBuffer(buffer: ArrayBuffer) {\n return new Uint8Array(buffer)\n}\n","/**\n * Original at https://github.com/dmonad/lib0\n *\n * Utility module to work with strings.\n */\n\nexport const fromCharCode = String.fromCharCode\nexport const fromCodePoint = String.fromCodePoint\n\nfunction toLowerCase(s: string): string {\n return s.toLowerCase()\n}\n\nconst trimLeftRegex = /^\\s*/g\n\nexport function trimLeft(s: string): string {\n return s.replace(trimLeftRegex, '')\n}\n\nconst fromCamelCaseRegex = /([A-Z])/g\n\nexport function fromCamelCase(s: string, separator: string): string {\n return trimLeft(s.replace(fromCamelCaseRegex, match => `${separator}${toLowerCase(match)}`))\n}\n\n/**\n * Compute the utf8ByteLength\n */\nexport function utf8ByteLength(str: string): number {\n return unescape(encodeURIComponent(str)).length\n}\n\nexport function _encodeUtf8Polyfill(str: string): Uint8Array {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n const buf = new Uint8Array(len)\n for (let i = 0; i < len; i++)\n buf[i] = (encodedString.codePointAt(i) as number)\n\n return buf\n}\n\nlet utf8TextEncoder: TextEncoder | undefined | null\n\nexport function getUtf8TextEncoder(): TextEncoder | null {\n if (utf8TextEncoder === undefined)\n utf8TextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder() : null)\n return utf8TextEncoder\n}\n\nexport function encodeUtf8(str: string): Uint8Array {\n return getUtf8TextEncoder()\n ? utf8TextEncoder!.encode(str)\n : _encodeUtf8Polyfill(str)\n}\n\nfunction _decodeUtf8Polyfill(buf: Uint8Array): string {\n let remainingLen = buf.length\n let encodedString = ''\n let bufPos = 0\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n const bytes = buf.subarray(bufPos, bufPos + nextLen)\n bufPos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, (bytes as any))\n remainingLen -= nextLen\n }\n return decodeURIComponent(escape(encodedString))\n}\n\nlet utf8TextDecoder: any\n\nexport function getUtf8TextDecoder(): TextDecoder | undefined {\n if (utf8TextDecoder === undefined) {\n utf8TextDecoder = (typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8', { fatal: true, ignoreBOM: true })) ?? null\n if (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {\n // Safari doesn't handle BOM correctly.\n // This fixes a bug in Safari 13.0.5 where it produces a BOM the first time it is called.\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the first call and\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the second call\n // Another issue is that from then on no BOM chars are recognized anymore\n utf8TextDecoder = null\n }\n }\n return utf8TextDecoder\n}\n\nexport function decodeUtf8(buf: Uint8Array): string {\n return getUtf8TextDecoder()\n ? utf8TextDecoder.decode(buf)\n : _decodeUtf8Polyfill(buf)\n}\n\nexport function splice(str: string, index: number, remove: number, insert = '') {\n return str.slice(0, index) + insert + str.slice(index + remove)\n}\n","/**\n * Original at https://github.com/dmonad/lib0\n *\n * Efficient schema-less binary encoding with support for variable length encoding.\n *\n * Use [lib0/encoding] with [lib0/decoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = new encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = new decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n */\n\nimport { BIT7, BIT8, BITS31, BITS6, BITS7, BITS8 } from './binary'\nimport { createUint8ArrayViewFromArrayBuffer } from './create'\nimport { encodeUtf8, getUtf8TextEncoder } from './string'\n\n/**\n * A BinaryEncoder handles the encoding to an Uint8Array.\n */\nexport class Encoder {\n cpos: number\n cbuf: Uint8Array\n bufs: Uint8Array[]\n\n constructor() {\n this.cpos = 0\n this.cbuf = new Uint8Array(100)\n this.bufs = []\n }\n}\n\nexport function createEncoder(): Encoder {\n return new Encoder()\n}\n\n/**\n * The current length of the encoded data.\n */\nexport function length(encoder: Encoder): number {\n let len = encoder.cpos\n for (let i = 0; i < encoder.bufs.length; i++)\n len += encoder.bufs[i].length\n\n return len\n}\n\n/**\n * Transform to Uint8Array.\n */\nexport function encodeToUint8Array(encoder: Encoder): Uint8Array {\n const uint8arr = new Uint8Array(length(encoder))\n let curPos = 0\n for (let i = 0; i < encoder.bufs.length; i++) {\n const d = encoder.bufs[i]\n uint8arr.set(d, curPos)\n curPos += d.length\n }\n uint8arr.set(createUint8ArrayViewFromArrayBuffer(encoder.cbuf.buffer, 0, encoder.cpos), curPos)\n return uint8arr\n}\n\n/**\n * Verify that it is possible to write `len` bytes wtihout checking. If\n * necessary, a new Buffer with the required length is attached.\n */\nexport function verifyLen(encoder: Encoder, len: number) {\n const bufferLen = encoder.cbuf.length\n if (bufferLen - encoder.cpos < len) {\n encoder.bufs.push(createUint8ArrayViewFromArrayBuffer(encoder.cbuf.buffer, 0, encoder.cpos))\n encoder.cbuf = new Uint8Array(Math.max(bufferLen, len) * 2)\n encoder.cpos = 0\n }\n}\n\n/**\n * Write one byte to the encoder.\n */\nexport function write(encoder: Encoder, num: number) {\n const bufferLen = encoder.cbuf.length\n if (encoder.cpos === bufferLen) {\n encoder.bufs.push(encoder.cbuf)\n encoder.cbuf = new Uint8Array(bufferLen * 2)\n encoder.cpos = 0\n }\n encoder.cbuf[encoder.cpos++] = num\n}\n\n/**\n * Write one byte at a specific position.\n * Position must already be written (i.e. encoder.length > pos)\n */\nexport function set(encoder: Encoder, pos: number, num: number) {\n let buffer = null\n // iterate all buffers and adjust position\n for (let i = 0; i < encoder.bufs.length && buffer === null; i++) {\n const b = encoder.bufs[i]\n if (pos < b.length)\n buffer = b // found buffer\n\n else\n pos -= b.length\n }\n if (buffer === null) {\n // use current buffer\n buffer = encoder.cbuf\n }\n buffer[pos] = num\n}\n\n/**\n * Write one byte as an unsigned integer.\n */\nexport const writeUint8 = write\n\n/**\n * Write one byte as an unsigned Integer at a specific location.\n */\nexport const setUint8 = set\n\n/**\n * Write two bytes as an unsigned integer.\n */\nexport function writeUint16(encoder: Encoder, num: number) {\n write(encoder, num & BITS8)\n write(encoder, (num >>> 8) & BITS8)\n}\n/**\n * Write two bytes as an unsigned integer at a specific location.\n */\nexport function setUint16(encoder: Encoder, pos: number, num: number) {\n set(encoder, pos, num & BITS8)\n set(encoder, pos + 1, (num >>> 8) & BITS8)\n}\n\n/**\n * Write two bytes as an unsigned integer\n */\nexport function writeUint32(encoder: Encoder, num: number) {\n for (let i = 0; i < 4; i++) {\n write(encoder, num & BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write two bytes as an unsigned integer in big endian order.\n * (most significant byte first)\n */\nexport function writeUint32BigEndian(encoder: Encoder, num: number) {\n for (let i = 3; i >= 0; i--)\n write(encoder, (num >>> (8 * i)) & BITS8)\n}\n\n/**\n * Write two bytes as an unsigned integer at a specific location.\n */\nexport function setUint32(encoder: Encoder, pos: number, num: number) {\n for (let i = 0; i < 4; i++) {\n set(encoder, pos + i, num & BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write a variable length unsigned integer. Max encodable integer is 2^53.\n */\nexport function writeVarUint(encoder: Encoder, num: number) {\n while (num > BITS7) {\n write(encoder, BIT8 | (BITS7 & num))\n num = Math.floor(num / 128) // shift >>> 7\n }\n write(encoder, BITS7 & num)\n}\n\nexport function isNegativeZero(n: number) {\n return n !== 0 ? n < 0 : 1 / n < 0\n}\n\n/**\n * Write a variable length integer.\n *\n * We use the 7th bit instead for signaling that this is a negative number.\n */\nexport function writeVarInt(encoder: Encoder, num: number) {\n const isNegative = isNegativeZero(num)\n if (isNegative)\n num = -num\n\n // |- whether to continue reading |- whether is negative |- number\n write(encoder, (num > BITS6 ? BIT8 : 0) | (isNegative ? BIT7 : 0) | (BITS6 & num))\n num = Math.floor(num / 64) // shift >>> 6\n\n // We don't need to consider the case of num === 0 so we can use a different\n // pattern here than above.\n while (num > 0) {\n write(encoder, (num > BITS7 ? BIT8 : 0) | (BITS7 & num))\n num = Math.floor(num / 128) // shift >>> 7\n }\n}\n\n/**\n * Append fixed-length Uint8Array to the encoder.\n */\nexport function writeUint8Array(encoder: Encoder, uint8Array: Uint8Array) {\n const bufferLen = encoder.cbuf.length\n const cpos = encoder.cpos\n const leftCopyLen = Math.min(bufferLen - cpos, uint8Array.length)\n const rightCopyLen = uint8Array.length - leftCopyLen\n encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos)\n encoder.cpos += leftCopyLen\n if (rightCopyLen > 0) {\n // Still something to write, write right half..\n // Append new buffer\n encoder.bufs.push(encoder.cbuf)\n // must have at least size of remaining buffer\n encoder.cbuf = new Uint8Array(Math.max(bufferLen * 2, rightCopyLen))\n // copy array\n encoder.cbuf.set(uint8Array.subarray(leftCopyLen))\n encoder.cpos = rightCopyLen\n }\n}\n\n/**\n * Append an Uint8Array to Encoder.\n */\nexport function writeVarUint8Array(encoder: Encoder, uint8Array: Uint8Array) {\n writeVarUint(encoder, uint8Array.byteLength)\n writeUint8Array(encoder, uint8Array)\n}\n\n/**\n * A cache to store strings temporarily\n */\nlet _strBuffer: Uint8Array\nlet _maxStrBSize: number\n\n/**\n * Write a variable length string.\n */\nfunction _writeVarStringNative(encoder: Encoder, str: string) {\n if (_strBuffer == null) {\n _strBuffer = new Uint8Array(30000)\n _maxStrBSize = _strBuffer.length / 3\n }\n\n if (str.length < _maxStrBSize) {\n // We can encode the string into the existing buffer\n const written = getUtf8TextEncoder()!.encodeInto(str, _strBuffer).written || 0\n writeVarUint(encoder, written)\n for (let i = 0; i < written; i++)\n write(encoder, _strBuffer[i])\n }\n else {\n writeVarUint8Array(encoder, encodeUtf8(str))\n }\n}\n\n/**\n * Write a variable length string.\n */\nfunction _writeVarStringPolyfill(encoder: Encoder, str: string) {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n writeVarUint(encoder, len)\n for (let i = 0; i < len; i++)\n write(encoder, (encodedString.codePointAt(i) as number))\n}\n\n/**\n * Write a variable length string.\n */\nexport function writeVarString(encoder: Encoder, str: string) {\n return getUtf8TextEncoder()?.encodeInto\n ? _writeVarStringNative(encoder, str)\n : _writeVarStringPolyfill(encoder, str)\n}\n\n/**\n * Write the content of another Encoder.\n *\n * @TODO: can be improved!\n * - Note: Should consider that when appending a lot of small Encoders, we should rather clone than referencing the old structure.\n * Encoders start with a rather big initial buffer.\n */\nexport function writeBinaryEncoder(encoder: Encoder, append: Encoder) {\n return writeUint8Array(encoder, encodeToUint8Array(append))\n}\n\n/**\n * Create an DataView of the next `len` bytes. Use it to write data after\n * calling this function.\n *\n * ```js\n * // write float32 using DataView\n * const dv = writeOnDataView(encoder, 4)\n * dv.setFloat32(0, 1.1)\n * // read float32 using DataView\n * const dv = readFromDataView(encoder, 4)\n * dv.getFloat32(0) // => 1.100000023841858 (leaving it to the reader to find out why this is the correct result)\n * ```\n */\nexport function writeOnDataView(encoder: Encoder, len: number): DataView {\n verifyLen(encoder, len)\n const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len)\n encoder.cpos += len\n return dview\n}\n\nexport function writeFloat32(encoder: Encoder, num: number) {\n return writeOnDataView(encoder, 4).setFloat32(0, num, false)\n}\n\nexport function writeFloat64(encoder: Encoder, num: number) {\n return writeOnDataView(encoder, 8).setFloat64(0, num, false)\n}\n\nexport function writeBigInt64(encoder: Encoder, num: bigint) {\n return (writeOnDataView(encoder, 8)).setBigInt64(0, num, false)\n}\n\nexport function writeBigUint64(encoder: Encoder, num: bigint) {\n return (writeOnDataView(encoder, 8)).setBigUint64(0, num, false)\n}\n\nlet floatTestBed: DataView\n\n/**\n * Check if a number can be encoded as a 32 bit float.\n */\nfunction isFloat32(num: number): boolean {\n if (floatTestBed == null)\n floatTestBed = new DataView(new ArrayBuffer(4))\n floatTestBed.setFloat32(0, num)\n return floatTestBed.getFloat32(0) === num\n}\n\n/**\n * Encode data with efficient binary format.\n *\n * Differences to JSON:\n * • Transforms data to a binary format (not to a string)\n * • Encodes undefined, NaN, and ArrayBuffer (these can't be represented in JSON)\n * • Numbers are efficiently encoded either as a variable length integer, as a\n * 32 bit float, as a 64 bit float, or as a 64 bit bigint.\n *\n * Encoding table:\n *\n * | Data Type | Prefix | Encoding Method | Comment |\n * | ------------------- | -------- | ------------------ | ------- |\n * | undefined | 127 | | Functions, symbol, and everything that cannot be identified is encoded as undefined |\n * | null | 126 | | |\n * | integer | 125 | writeVarInt | Only encodes 32 bit signed integers |\n * | float32 | 124 | writeFloat32 | |\n * | float64 | 123 | writeFloat64 | |\n * | bigint | 122 | writeBigInt64 | |\n * | boolean (false) | 121 | | True and false are different data types so we save the following byte |\n * | boolean (true) | 120 | | - 0b01111000 so the last bit determines whether true or false |\n * | string | 119 | writeVarString | |\n * | object<string,any> | 118 | custom | Writes {length} then {length} key-value pairs |\n * | array<any> | 117 | custom | Writes {length} then {length} json values |\n * | Uint8Array | 116 | writeVarUint8Array | We use Uint8Array for any kind of binary data |\n *\n * Reasons for the decreasing prefix:\n * We need the first bit for extendability (later we may want to encode the\n * prefix with writeVarUint). The remaining 7 bits are divided as follows:\n * [0-30] the beginning of the data range is used for custom purposes\n * (defined by the function that uses this library)\n * [31-127] the end of the data range is used for data encoding by\n * lib0/encoding.js\n */\nexport function writeAny(encoder: Encoder, data: undefined | null | number | bigint | boolean | string | { [s: string]: any } | Array<any> | Uint8Array) {\n switch (typeof data) {\n case 'string':\n // TYPE 119: STRING\n write(encoder, 119)\n writeVarString(encoder, data)\n break\n case 'number':\n if (Number.isInteger(data) && Math.abs(data) <= BITS31) {\n // TYPE 125: INTEGER\n write(encoder, 125)\n writeVarInt(encoder, data)\n }\n else if (isFloat32(data)) {\n // TYPE 124: FLOAT32\n write(encoder, 124)\n writeFloat32(encoder, data)\n }\n else {\n // TYPE 123: FLOAT64\n write(encoder, 123)\n writeFloat64(encoder, data)\n }\n break\n case 'bigint':\n // TYPE 122: BigInt\n write(encoder, 122)\n writeBigInt64(encoder, data)\n break\n case 'object':\n if (data === null) {\n // TYPE 126: null\n write(encoder, 126)\n }\n else if (Array.isArray(data)) {\n // TYPE 117: Array\n write(encoder, 117)\n writeVarUint(encoder, data.length)\n for (let i = 0; i < data.length; i++)\n writeAny(encoder, data[i])\n }\n else if (data instanceof Uint8Array) {\n // TYPE 116: ArrayBuffer\n write(encoder, 116)\n writeVarUint8Array(encoder, data)\n }\n else {\n // TYPE 118: Object\n write(encoder, 118)\n const keys = Object.keys(data)\n writeVarUint(encoder, keys.length)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n writeVarString(encoder, key)\n writeAny(encoder, data[key])\n }\n }\n break\n case 'boolean':\n // TYPE 120/121: boolean (true/false)\n write(encoder, data ? 120 : 121)\n break\n default:\n // TYPE 127: undefined\n write(encoder, 127)\n }\n}\n","/**\n * Original at https://github.com/dmonad/lib0\n *\n * Efficient schema-less binary decoding with support for variable length encoding.\n *\n * Use [lib0/decoding] with [lib0/encoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = new encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = new decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n */\n\nimport { BIT7, BIT8, BITS6, BITS7 } from './binary'\nimport { createUint8ArrayViewFromArrayBuffer } from './create'\nimport { getUtf8TextDecoder } from './string'\n\nconst errorUnexpectedEndOfArray = 'Unexpected end of array'\nconst errorIntegerOutOfRange = 'Integer out of Range'\n\n/**\n * A Decoder handles the decoding of an Uint8Array.\n */\nexport class Decoder {\n /** Decoding target. */\n arr: Uint8Array\n /** Current decoding position. */\n pos: number\n\n constructor(uint8Array: Uint8Array) {\n this.arr = uint8Array\n this.pos = 0\n }\n}\n\nexport function createDecoder(uint8Array: Uint8Array): Decoder {\n return new Decoder(uint8Array)\n}\n\nexport function hasContent(decoder: Decoder): boolean {\n return decoder.pos !== decoder.arr.length\n}\n\n/**\n * Clone a decoder instance.\n * Optionally set a new position parameter.\n */\nexport function clone(decoder: Decoder, newPos: number = decoder.pos): Decoder {\n const _decoder = createDecoder(decoder.arr)\n _decoder.pos = newPos\n return _decoder\n}\n\n/**\n * Create an Uint8Array view of the next `len` bytes and advance the position by `len`.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n */\nexport function readUint8Array(decoder: Decoder, len: number): Uint8Array {\n const view = createUint8ArrayViewFromArrayBuffer(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len)\n decoder.pos += len\n return view\n}\n\n/**\n * Read unsigned integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * numbers < 2^7 is stored in one bytlength\n * numbers < 2^14 is stored in two bylength\n */\nexport function readVarUint(decoder: Decoder): number {\n let num = 0\n let mult = 1\n const len = decoder.arr.length\n while (decoder.pos < len) {\n const r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & BITS7) * mult // shift $r << (7*#iterations) and add it to num\n mult *= 128 // next iteration, shift 7 \"more\" to the left\n if (r < BIT8)\n return num\n if (num > Number.MAX_SAFE_INTEGER)\n throw new Error(errorIntegerOutOfRange)\n }\n throw new Error(errorUnexpectedEndOfArray)\n}\n\n/**\n * Read variable length Uint8Array.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n */\nexport function readVarUint8Array(decoder: Decoder): Uint8Array {\n return readUint8Array(decoder, readVarUint(decoder))\n}\n\n/**\n * Read the rest of the content as an ArrayBuffer\n */\nexport function readTailAsUint8Array(decoder: Decoder): Uint8Array {\n return readUint8Array(decoder, decoder.arr.length - decoder.pos)\n}\n\n/**\n * Skip one byte, jump to the next position.\n */\nexport function skip8(decoder: Decoder): number {\n return decoder.pos++\n}\n\n/**\n * Read one byte as unsigned integer.\n */\nexport function readUint8(decoder: Decoder): number {\n return decoder.arr[decoder.pos++]\n}\n\n/**\n * Read 2 bytes as unsigned integer.\n */\nexport function readUint16(decoder: Decoder): number {\n const uint = decoder.arr[decoder.pos]\n + (decoder.arr[decoder.pos + 1] << 8)\n decoder.pos += 2\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer.\n */\nexport function readUint32(decoder: Decoder): number {\n const uint = (decoder.arr[decoder.pos]\n + (decoder.arr[decoder.pos + 1] << 8)\n + (decoder.arr[decoder.pos + 2] << 16)\n + (decoder.arr[decoder.pos + 3] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer in big endian order.\n * (most significant byte first)\n */\nexport function readUint32BigEndian(decoder: Decoder): number {\n const uint = (decoder.arr[decoder.pos + 3]\n + (decoder.arr[decoder.pos + 2] << 8)\n + (decoder.arr[decoder.pos + 1] << 16)\n + (decoder.arr[decoder.pos] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n */\nexport function peekUint8(decoder: Decoder): number {\n return decoder.arr[decoder.pos]\n}\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n */\nexport function peekUint16(decoder: Decoder): number {\n return decoder.arr[decoder.pos]\n + (decoder.arr[decoder.pos + 1] << 8)\n}\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n */\nexport function peekUint32(decoder: Decoder): number {\n return (\n decoder.arr[decoder.pos]\n + (decoder.arr[decoder.pos + 1] << 8)\n + (decoder.arr[decoder.pos + 2] << 16)\n + (decoder.arr[decoder.pos + 3] << 24)\n ) >>> 0\n}\n\n/**\n * Read signed integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * numbers < 2^7 is stored in one bytlength\n * numbers < 2^14 is stored in two bylength\n * @todo This should probably create the inverse ~num if number is negative - but this would be a breaking change.\n */\nexport function readVarInt(decoder: Decoder): number {\n let r = decoder.arr[decoder.pos++]\n let num = r & BITS6\n let mult = 64\n const sign = (r & BIT7) > 0 ? -1 : 1\n if ((r & BIT8) === 0) {\n // don't continue reading\n return sign * num\n }\n const len = decoder.arr.length\n while (decoder.pos < len) {\n r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & BITS7) * mult\n mult *= 128\n if (r < BIT8)\n return sign * num\n\n if (num > Number.MAX_SAFE_INTEGER)\n throw new Error(errorIntegerOutOfRange)\n }\n throw new Error(errorUnexpectedEndOfArray)\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n */\nexport function peekVarUint(decoder: Decoder): number {\n const pos = decoder.pos\n const s = readVarUint(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n */\nexport function peekVarInt(decoder: Decoder): number {\n const pos = decoder.pos\n const s = readVarInt(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * We don't test this function anymore as we use native decoding/encoding by default now.\n * Better not modify this anymore..\n *\n * Transforming utf8 to a string is pretty expensive. The code performs 10x better\n * when String.fromCodePoint is fed with all characters as arguments.\n * But most environments have a maximum number of arguments per functions.\n * For effiency reasons we apply a maximum of 10000 characters at once.\n */\nfunction _readVarStringPolyfill(decoder: Decoder): string {\n let remainingLen = readVarUint(decoder)\n if (remainingLen === 0) {\n return ''\n }\n else {\n let encodedString = String.fromCodePoint(readUint8(decoder)) // remember to decrease remainingLen\n if (--remainingLen < 100) { // do not create a Uint8Array for small strings\n while (remainingLen--)\n encodedString += String.fromCodePoint(readUint8(decoder))\n }\n else {\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n // this is dangerous, we create a fresh array view from the existing buffer\n const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen)\n decoder.pos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, (bytes as any))\n remainingLen -= nextLen\n }\n }\n return decodeURIComponent(escape(encodedString))\n }\n}\n\n/**\n * Read string of variable length\n * varUint is used to store the length of the string\n */\nexport function readVarString(decoder: Decoder): string {\n const utf8TextDecoder = getUtf8TextDecoder()\n return utf8TextDecoder\n ? utf8TextDecoder.decode(readVarUint8Array(decoder))\n : _readVarStringPolyfill(decoder)\n}\n\n/**\n * Look ahead and read varString without incrementing position\n */\nexport function peekVarString(decoder: Decoder): string {\n const pos = decoder.pos\n const s = readVarString(decoder)\n decoder.pos = pos\n return s\n}\n\nexport function readFromDataView(decoder: Decoder, len: number): DataView {\n const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len)\n decoder.pos += len\n return dv\n}\n\nexport function readFloat32(decoder: Decoder) {\n return readFromDataView(decoder, 4).getFloat32(0, false)\n}\n\nexport function readFloat64(decoder: Decoder) {\n return readFromDataView(decoder, 8).getFloat64(0, false)\n}\n\nexport function readBigInt64(decoder: Decoder) {\n return (readFromDataView(decoder, 8)).getBigInt64(0, false)\n}\n\nexport function readBigUint64(decoder: Decoder) {\n return (readFromDataView(decoder, 8)).getBigUint64(0, false)\n}\n\nconst readAnyLookupTable: Array<((arg0: Decoder) => any)> = [\n _ => undefined, // CASE 127: undefined\n _ => null, // CASE 126: null\n readVarInt, // CASE 125: integer\n readFloat32, // CASE 124: float32\n readFloat64, // CASE 123: float64\n readBigInt64, // CASE 122: bigint\n _ => false, // CASE 121: boolean (false)\n _ => true, // CASE 120: boolean (true)\n readVarString, // CASE 119: string\n (decoder) => { // CASE 118: object<string,any>\n const len = readVarUint(decoder)\n const obj: { [s: string]: any } = {}\n for (let i = 0; i < len; i++) {\n const key = readVarString(decoder)\n obj[key] = readAny(decoder)\n }\n return obj\n },\n (decoder) => { // CASE 117: array<any>\n const len = readVarUint(decoder)\n const arr = []\n for (let i = 0; i < len; i++)\n\n arr.push(readAny(decoder))\n\n return arr\n },\n readVarUint8Array, // CASE 116: Uint8Array\n]\n\nexport function readAny(decoder: Decoder) {\n return readAnyLookupTable[127 - readUint8(decoder)](decoder)\n}\n","import type { Encoder } from '../msg/encoder'\nimport { assertCondition } from '../assert'\nimport type { BinInput } from '../data/bin'\nimport { toUint8Array } from '../data/bin'\nimport { createEncoder, encodeToUint8Array, length, writeAny, writeFloat32, writeUint16, writeUint32, writeUint8, writeUint8Array, writeVarInt, writeVarString, writeVarUint, writeVarUint8Array } from './lib0/encoding'\nimport { createDecoder, readAny, readFloat32, readUint16, readUint32, readUint8, readUint8Array, readVarInt, readVarString, readVarUint, readVarUint8Array } from './lib0/decoding'\n\n// Use in Zeed channels\n\nexport class BinaryEncoder implements Encoder {\n async encode(data: any): Promise<Uint8Array> {\n const dataEncoder = createEncoder()\n writeAny(dataEncoder, data)\n return encodeToUint8Array(dataEncoder)\n }\n\n async decode(data: Uint8Array | ArrayBuffer): Promise<any> {\n return readAny(createDecoder(toUint8Array(data)))\n }\n}\n\n// Json like\n\n/** Encode any object, including Uint8Array data */\nexport function encodeJson(data: any): Uint8Array {\n const dataEncoder = createEncoder()\n writeAny(dataEncoder, data)\n return encodeToUint8Array(dataEncoder)\n}\n\n/** Decode any object, including Uint8Array data */\nexport function decodeJson(data: Uint8Array | ArrayBuffer): any {\n return readAny(createDecoder(toUint8Array(data)))\n}\n\n// Stream like\n\n/** Incrementally encode binary data */\nexport function createBinaryStreamEncoder(initialData?: BinInput) {\n const dataEncoder = createEncoder()\n\n if (initialData != null)\n writeUint8Array(dataEncoder, toUint8Array(initialData))\n\n return {\n /** Just writes the bytes. Length is not stored! */\n writeBytes: (data: BinInput, expectedLength: number) => {\n const bin = toUint8Array(data)\n assertCondition(!(expectedLength != null && bin.length !== expectedLength), `Expected ${expectedLength} bytes, got ${bin.length}`)\n writeUint8Array(dataEncoder, bin)\n },\n writeBytesVar: (data: BinInput) => writeVarUint8Array(dataEncoder, toUint8Array(data)),\n writeUintVar: (data: number) => writeVarUint(dataEncoder, data),\n writeUint8: (data: number) => writeUint8(dataEncoder, data),\n writeUint16: (data: number) => writeUint16(dataEncoder, data),\n writeUint32: (data: number) => writeUint32(dataEncoder, data),\n writeIntVar: (data: number) => writeVarInt(dataEncoder, data),\n writeFloat: (data: number) => writeFloat32(dataEncoder, data),\n writeStringVar: (data: string) => writeVarString(dataEncoder, data),\n write: (data: any) => writeAny(dataEncoder, data),\n getUint8Array: (): Uint8Array => encodeToUint8Array(dataEncoder),\n getLength: () => length(dataEncoder),\n }\n}\n\n/** Incrementally decode binary data */\nexport function createBinaryStreamDecoder(data: BinInput) {\n const dataDecoder = createDecoder(toUint8Array(data))\n return {\n readBytes: (len: number): Uint8Array => readUint8Array(dataDecoder, len),\n readBytesVar: (): Uint8Array => readVarUint8Array(dataDecoder),\n readUintVar: (): number => readVarUint(dataDecoder),\n readUint8: (): number => readUint8(dataDecoder),\n readUint16: (): number => readUint16(dataDecoder),\n readUint32: (): number => readUint32(dataDecoder),\n readIntVar: (): number => readVarInt(dataDecoder),\n readFloat: (): number => readFloat32(dataDecoder),\n readStringVar: (): string => readVarString(dataDecoder),\n read: (): any => readAny(dataDecoder),\n getOffset: (): number => dataDecoder.pos || 0,\n }\n}\n\n// https://stackoverflow.com/a/1436448/140927\nexport function bitfield(bitfield = 0) {\n return {\n setBit: (bit: number, value = true): number => value ? (bitfield |= 1 << bit) : (bitfield &= ~(1 << bit)),\n unsetBit: (bit: number): number => (bitfield &= 1 << bit),\n toggleBit: (bit: number): number => (bitfield ^= 1 << bit),\n getBit: (bit: number): boolean => (bitfield & (1 << bit)) !== 0,\n getValue: () => bitfield,\n }\n}\n\n// Cast\n\nexport async function blobToArrayBuffer(blob: Blob | File): Promise<ArrayBuffer | undefined> {\n return await blob.arrayBuffer()\n // try {\n // return new Promise((resolve, reject) => {\n // try {\n // const reader = new FileReader()\n // reader.onloadend = () => resolve(reader.result as ArrayBuffer)\n // reader.onerror = err => reject(err)\n // reader.onabort = err => reject(err)\n // reader.readAsArrayBuffer(blob)\n // }\n // catch (err) {\n // reject(err)\n // }\n // })\n // }\n // catch (err) {}\n}\n\nexport async function blobToUint8Array(blob: Blob | File): Promise<Uint8Array | undefined> {\n const buffer = await blobToArrayBuffer(blob)\n if (buffer != null)\n return toUint8Array(buffer)\n}\n","import type { BinInput } from './data/bin'\nimport { equalBinary, toUint8Array } from './data/bin'\n\n/** Get random bytes using window.crypto if available. Else use a poor fallback solution. */\nexport function randomUint8Array(length = 16): Uint8Array {\n const randomBytes = new Uint8Array(length)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(randomBytes)\n }\n else {\n // hack: not state of the art secure\n // throw \"crypto.getRandomValues is required\"\n for (let i = 0; i < length; i++) {\n // Math.random: \"...range 0 to less than 1 (inclusive of 0, but not 1)\"\n // 0.9... * 0xff < 255 therefore * 0x100\n randomBytes[i] = Math.floor(Math.random() * 0x100) // 0...255\n }\n }\n return randomBytes\n}\n\nexport const CRYPTO_DEFAULT_HASH_ALG = 'SHA-256'\nexport const CRYPTO_DEFAULT_ALG = 'AES-GCM'\nexport const CRYPTO_DEFAULT_DERIVE_ALG = 'PBKDF2'\nexport const CRYPTO_DEFAULT_DERIVE_ITERATIONS = 100000\n\nexport async function digest(\n message: BinInput,\n algorithm: AlgorithmIdentifier = CRYPTO_DEFAULT_HASH_ALG,\n): Promise<Uint8Array> {\n return toUint8Array(\n await crypto.subtle.digest(algorithm, toUint8Array(message)),\n )\n}\n\nexport async function deriveKeyPbkdf2(\n secret: BinInput,\n opt: {\n iterations?: number\n salt?: BinInput\n } = {},\n): Promise<CryptoKey> {\n const secretBuffer = toUint8Array(secret)\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n secretBuffer,\n CRYPTO_DEFAULT_DERIVE_ALG,\n false,\n ['deriveKey'],\n )\n return await crypto.subtle.deriveKey(\n {\n name: CRYPTO_DEFAULT_DERIVE_ALG,\n salt: opt.salt ? toUint8Array(opt.salt) : new Uint8Array(0),\n iterations: opt.iterations ?? CRYPTO_DEFAULT_DERIVE_ITERATIONS,\n hash: CRYPTO_DEFAULT_HASH_ALG,\n },\n keyMaterial,\n {\n name: CRYPTO_DEFAULT_ALG,\n length: 256,\n },\n true,\n ['encrypt', 'decrypt'],\n )\n}\n\nfunction getMagicId() {\n return new Uint8Array([1, 1])\n}\n\nexport async function encrypt(\n data: Uint8Array,\n key: CryptoKey,\n): Promise<Uint8Array> {\n const MAGIC_ID = getMagicId()\n const iv = randomUint8Array(12)\n const cipher = await crypto.subtle.encrypt(\n { name: CRYPTO_DEFAULT_ALG, iv },\n key,\n data,\n )\n const binCypher = new Uint8Array(cipher)\n const bufferLength = MAGIC_ID.length + iv.length + binCypher.length\n const buffer = new Uint8Array(bufferLength)\n let pos = 0\n buffer.set(MAGIC_ID, pos)\n pos += MAGIC_ID.length\n buffer.set(iv, pos)\n pos += iv.length\n buffer.set(binCypher, pos)\n return buffer\n}\n\nexport async function decrypt(\n data: Uint8Array,\n key: CryptoKey,\n): Promise<Uint8Array> {\n const magic = data.subarray(0, 2)\n if (!equalBinary(magic, getMagicId()))\n return Promise.reject(new Error(`Unknown magic ${magic}`))\n\n const iv = data.subarray(2, 2 + 12)\n const cipher = data.subarray(2 + 12, data.length)\n const plain = await crypto.subtle.decrypt(\n { name: CRYPTO_DEFAULT_ALG, iv },\n key,\n cipher,\n )\n return new Uint8Array(plain)\n}\n","import { escapeRegExp, isArray, isBoolean, isRecord, jsonStringifySafe } from './data'\n\nconst defaultSeparator = ','\n\nexport function csvStringify(data: any[], opt: {\n // header?: string[]\n separator?: string\n} = {}): string {\n const { separator = defaultSeparator } = opt\n let body = ''\n\n // Append the header row to the response if requested\n // if (header)\n // body = `${header.join(separator)}\\n`\n\n // Convert the data to a CSV-like structure\n for (let i = 0; i < data.length; i++) {\n body += `${data[i].map((field: string) => {\n if (field == null || field === '')\n return ''\n if (isBoolean(field))\n return field ? 1 : 0\n let s = String(field)\n if (isRecord(field) || isArray(field))\n s = jsonStringifySafe(field)\n if (s.includes('\"') || s.includes('\\n') || s.includes(separator))\n return `\"${s.replace(/\"/g, '\"\"')}\"`\n return s\n }).join(separator)}\\n`\n }\n\n return body\n}\n\nexport function csvParse(raw: string, opt: {\n separator?: string\n} = {}) {\n // https://regex101.com/r/BCpKyV/1\n let rxOneValueWithSeparator = /(\"((?:(?:[^\"]*?)(?:\"\")?)*)\"|([^,;\\t\\n]*))([,;\\t]|\\n|\\r\\n)/g\n if (opt.separator)\n rxOneValueWithSeparator = new RegExp(rxOneValueWithSeparator.source.replaceAll(',;\\\\t', escapeRegExp(opt.separator)), rxOneValueWithSeparator.flags)\n\n const lines: any[][] = []\n let row: any[] = []\n let m: any\n const text = `${raw.replaceAll('\\r\\n', '\\n').trim()}\\n`\n\n // eslint-disable-next-line no-cond-assign\n while (m = rxOneValueWithSeparator.exec(text)) {\n let value = m[2] ?? m[3] ?? ''\n value = value.replaceAll('\"\"', '\"')\n row.push(value)\n if (m[4] === '\\n') {\n lines.push(row)\n row = []\n }\n }\n return lines\n}\n\nexport function csvParseToObjects(raw: string, opt: {\n separator?: string\n} = {}) {\n const lines = csvParse(raw, opt)\n const header = lines[0]\n return lines.slice(1).map(l =>\n Object.fromEntries (l.map((v, i) => [header[i], v])),\n )\n}\n","import { isString } from './data'\nimport { arrayFilterInPlace } from './data/array'\nimport type { Disposer, DisposerFunction } from './dispose-types'\nimport { isPromise } from './exec/promise'\nimport { DefaultLogger } from './log'\nimport type { LoggerInterface } from './log/log-base'\n\n/** Different kinds of implementations have grown, this should unify them */\nfunction callDisposer(disposable: Disposer): Promise<void> | void {\n let result\n\n if (typeof disposable === 'function')\n result = disposable()\n else if (isPromise(disposable))\n result = disposable\n else if (typeof disposable.dispose === 'function')\n result = disposable.dispose()\n else if (isPromise(disposable.dispose))\n result = disposable.dispose\n // else if (typeof disposable.cleanup === 'function')\n // result = disposable.cleanup()\n // else if (isPromise(disposable.cleanup))\n // result = disposable.cleanup\n\n if (isPromise(result))\n return result\n}\n\nexport interface UseDisposeConfig {\n name?: string\n log?: LoggerInterface\n}\n\nexport function useDispose(config?: string | UseDisposeConfig | LoggerInterface) {\n let opt = config as any\n if (opt != null) {\n if (isString(opt))\n opt = { name: opt }\n else if ('debug' in opt && 'label' in opt)\n opt = { name: opt.label, log: opt }\n }\n\n const name = opt?.name\n const log = opt?.log ?? DefaultLogger('zeed:dispose')\n\n let disposed = 0\n\n const tracked: Disposer[] = []\n\n function untrack(disposable: Disposer): Promise<void> | void {\n if (disposable != null && tracked.includes(disposable)) {\n arrayFilterInPlace(tracked, el => el !== disposable)\n const result = callDisposer(disposable)\n if (isPromise(result))\n return result\n }\n }\n\n function track(obj?: Disposer): DisposerFunction | undefined {\n if (obj == null)\n return\n tracked.unshift(obj) // LIFO\n return () => untrack(obj)\n }\n\n /** Dispose all tracked entries */\n function dispose(strictSync = false): Promise<any> | void {\n if (name)\n log.debug(`dispose \"${name}\": ${tracked.length} entries`)\n\n disposed += 1\n\n const promises: any[] = []\n while (tracked.length > 0) {\n const fn = tracked[0]\n const result = untrack(fn) // LIFO\n if (isPromise(result)) {\n if (strictSync)\n throw new Error(`Async disposable found: ${fn} -> ${result}`)\n else\n promises.push(result)\n }\n }\n\n if (promises.length > 0)\n return Promise.all(promises)\n }\n\n /** Dispose all tracked entries in synchronous way. */\n function disposeSync(): void {\n void dispose(true)\n }\n\n return Object.assign(dispose, {\n /** Counter that incremends, each time dispose has been called */\n disposed,\n\n add: track,\n remove: untrack,\n\n /** @deprecated use add */\n track,\n\n /** @deprecated use remove */\n untrack,\n\n dispose,\n disposeSync,\n sync: disposeSync,\n\n /** @deprecated use dispose */\n exec: dispose,\n getSize() {\n return tracked.length\n },\n isDisposed() {\n return tracked.length <= 0\n },\n })\n}\n\nexport type UseDispose = ReturnType<typeof useDispose>\n\nexport function useDefer(\n config: {\n mode?: 'lifo' | 'fifo'\n } = {},\n) {\n const { mode = 'fifo' } = config\n const steps: Disposer[] = []\n\n /**\n * Excutes all steps. If all steps are not Promises, they are executed immediately,\n * otherwise a Promise is returned\n */\n const exec = async (expectSync = false) => {\n while (steps.length > 0) {\n const step = steps[0]\n arrayFilterInPlace(steps, el => el !== step)\n if (typeof step === 'function') {\n const result = step()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else if (isPromise(step)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await step\n }\n else {\n throw new Error(`Unhandled disposable: ${step}`)\n }\n }\n }\n\n const add = (obj: Disposer) => {\n if (mode === 'lifo')\n steps.unshift(obj)\n else\n steps.push(obj)\n }\n\n return Object.assign(exec, {\n add,\n exec,\n getSize() {\n return steps.length\n },\n })\n}\n\nexport type UseDefer = ReturnType<typeof useDefer>\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { isPromise } from './promise'\n\nexport type Mutex = (fn: (() => void), elseFn?: (() => void)) => boolean\nexport type AsyncMutex = (fn: (() => void), elseFn?: (() => void)) => Promise<boolean>\n\nexport function useMutex(): Mutex {\n let token = true\n return (fn, elseFn) => {\n let executed = false\n if (token) {\n token = false\n try {\n fn()\n executed = true\n }\n finally {\n token = true\n }\n }\n else if (elseFn !== undefined) {\n elseFn()\n }\n return executed\n }\n}\n\nexport function useAsyncMutex(): AsyncMutex {\n let token = true\n return async (fn, elseFn) => {\n let executed = false\n if (token) {\n token = false\n try {\n const result = fn()\n if (isPromise(result))\n await result\n executed = true\n }\n finally {\n token = true\n }\n }\n else if (elseFn !== undefined) {\n const result = elseFn()\n if (isPromise(result))\n await result\n }\n return executed\n }\n}\n\n// export type Lock = ({lock: () => Promise<void>, unlock: () => void})\n\n// export function createLock() {\n// let lockCtr = []\n// return {\n// lock() {\n\n// },\n// unlock() {\n\n// }\n// }\n// }\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport type { DisposerFunction } from '../dispose-types'\nimport { promisify } from '../exec/promise'\nimport { getGlobalContext } from '../global'\nimport { DefaultLogger } from '../log'\n\nexport type EmitterHandler = (...objs: any[]) => void\nexport type EmitterAllHandler<T = string> = (key: T, ...objs: any[]) => void\n\n// For magic see https://www.npmjs.com/package/tiny-typed-emitter / License MIT\n// https://stackoverflow.com/a/61609010/140927\n// https://basarat.gitbook.io/typescript/main-1/typed-event\n// https://github.com/andywer/typed-emitter#extending-an-emitter\n\n// TODO: Allow symbols? https://github.com/sindresorhus/emittery\n\nexport declare type ListenerSignature<L> = {\n [E in keyof L]: (...args: any[]) => any\n}\n\nexport declare interface DefaultListener {\n [k: string]: (...args: any[]) => any\n}\n\ninterface EmitterSubscriber {\n fn: EmitterHandler // (...args: any[]) => any\n priority: number\n}\n\nexport interface EmitterSubscriberOptions {\n priority?: number\n}\n\nexport class Emitter<\n RemoteListener extends ListenerSignature<RemoteListener> = DefaultListener,\n LocalListener extends ListenerSignature<LocalListener> = RemoteListener,\n> {\n private subscribers: Record<any, EmitterSubscriber[]> = {}\n private subscribersOnAny: any[] = []\n\n _logEmitter = DefaultLogger('zeed:emitter', 'warn')\n\n call: RemoteListener = new Proxy<RemoteListener>({} as any, {\n get:\n (target: any, name: any) =>\n async (...args: any): Promise<boolean> =>\n await this.emit(name, ...args),\n })\n\n public async emit<U extends keyof RemoteListener>(event: U, ...args: Parameters<RemoteListener[U]>): Promise<boolean> {\n let ok = false\n\n try {\n const subscribers = (this.subscribers[event] || []) as EmitterSubscriber[]\n this._logEmitter.debug('emit', this?.constructor?.name, event, ...args, subscribers)\n\n this.subscribersOnAny.forEach(fn => fn(event, ...args))\n\n if (subscribers.length > 0) {\n const all = subscribers.map(({ fn }) => {\n try {\n return promisify(fn(...args))\n }\n catch (err) {\n this._logEmitter.warn('emit warning:', err)\n }\n return null\n }).filter(fn => fn != null)\n ok = true\n await Promise.all(all)\n }\n }\n catch (err) {\n this._logEmitter.error('emit exception', err)\n }\n return ok\n }\n\n public onAny(fn: EmitterHandler) {\n this.subscribersOnAny.push(fn)\n }\n\n public on<U extends keyof LocalListener>(\n event: U,\n fn: LocalListener[U],\n opt: EmitterSubscriberOptions = {},\n ): DisposerFunction {\n const { priority = 0 } = opt\n const subscribers = (this.subscribers[event] || [])\n const slen = subscribers.length\n const sobj = { fn, priority }\n if (slen <= 0) {\n this.subscribers[event] = [sobj]\n }\n else {\n let pos = slen\n for (let i = subscribers.length - 1; i >= 0; i--) {\n const s = subscribers[i]\n // Insert after last entry of same priority\n if (priority <= s.priority)\n break\n pos -= 1\n }\n subscribers.splice(pos, 0, sobj) // in place\n }\n return () => {\n this.off(event, fn)\n }\n }\n\n public onCall(handlers: Partial<LocalListener>) {\n for (const [name, handler] of Object.entries(handlers))\n this.on(name as any, handler as any)\n }\n\n public once<U extends keyof LocalListener>(\n event: U,\n listener: LocalListener[U],\n ): DisposerFunction {\n const onceListener = async (...args: any[]) => {\n this.off(event, onceListener as any)\n return await promisify(listener(...args))\n }\n this.on(event, onceListener as any)\n return () => {\n this.off(event, listener)\n }\n }\n\n public off<U extends keyof LocalListener>(\n event: U,\n listener: LocalListener[U],\n ): this {\n // log(\"off\", key)\n this.subscribers[event] = (this.subscribers[event] || []).filter(f => listener && f.fn !== listener)\n return this\n }\n\n public removeAllListeners(): this {\n this.subscribers = {}\n return this\n }\n}\n\ndeclare global {\n interface ZeedGlobalContext {\n emitter?: Emitter\n }\n\n interface ZeedGlobalEmitter {}\n}\n\n/** Global emitter that will listen even across modules */\nexport function getGlobalEmitter<T extends ListenerSignature<T> = ZeedGlobalEmitter>(): Emitter<T> {\n let emitter = getGlobalContext().emitter\n if (!emitter) {\n emitter = new Emitter()\n getGlobalContext().emitter = emitter\n }\n return emitter as any\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { randomUint8Array } from './crypto'\nimport { fromHex, toHex } from './data'\nimport { decodeBase32, decodeBase62, encodeBase32, encodeBase62 } from './data/basex'\nimport { getTimestamp } from './time'\n\n// 128 bit UUID\n\nconst uuidBytesLength = 16\n\nexport function uuidBytes(): Uint8Array {\n return randomUint8Array(uuidBytesLength)\n}\n\n// Base62\n\nexport function uuidB62(bytes = uuidBytes()): string {\n return encodeBase62(bytes, 22)\n}\n\nexport function uuidEncodeB62(bytes: Uint8Array): string {\n return encodeBase62(bytes, 22)\n}\n\nexport function uuidDecodeB62(uuid: string): Uint8Array {\n return decodeBase62(uuid, uuidBytesLength)\n}\n\n// Base32\n\nexport function uuidB32(bytes = uuidBytes()): string {\n return encodeBase32(bytes, 26)\n}\n\nexport function uuidEncodeB32(bytes: Uint8Array): string {\n return encodeBase32(bytes, 26)\n}\n\nexport function uuidDecodeB32(uuid: string): Uint8Array {\n return decodeBase32(uuid, uuidBytesLength)\n}\n\n// UUIDv4\n\n// https://stackoverflow.com/a/2117523/140927\nconst pattern = '10000000-1000-4000-8000-100000000000' // String([1e7] + -1e3 + -4e3 + -8e3 + -1e11)\n\nexport const uuidv4 = function () {\n return (typeof crypto !== 'undefined' && crypto.randomUUID != null)\n ? crypto.randomUUID() // native!\n : pattern.replace(/[018]/g, (c: any) => (c ^ (randomUint8Array(1)[0] & (15 >> (c / 4)))).toString(16))\n}\n\nexport function uuidEncodeV4(bytes: Uint8Array): string {\n const id = toHex(bytes)\n return `${id.slice(0, 8)}-${id.slice(8, 12)}-${id.slice(12, 16)}-${id.slice(16)}` // 10000000 - 1000 - 4000 - 8000 - 100000000000\n}\n\nexport function uuidDecodeV4(uuid: string): Uint8Array {\n return fromHex(uuid.replaceAll('-', ''))\n}\n\n// Sortable UID\n\n// https://github.com/segmentio/ksuid\n// https://pkg.go.dev/github.com/rsms/go-uuid\n\n/**\n * Sortable unique ID\n * Inspired by https://github.com/rsms/go-uuid\n *\n * Bytes 0-5: Current time in miliseconds from 2021-06-01T00:00:00Z\n * Bytes 6-15: Random\n */\n\n// 1622505600000 // new Date('2021-06-01T00:00:00Z').getTime()\nconst ReferenceDateInMS = 1600000000000\n\n// 6 bytes will stay valid until end of time: new Date(1622505600000 + 0xffffffffffff) === Date Sun Jan 01 10941 06:31:50 GMT+0100 (Central European Standard Time)\n\nfunction longToByteArray(long: number) {\n const byteArray = new Uint8Array([0, 0, 0, 0, 0, 0])\n const bytes = byteArray.length - 1\n for (let index = 0; index < byteArray.length; index++) {\n const byte = long & 0xFF\n byteArray[bytes - index] = byte\n long = (long - byte) / 256\n }\n return byteArray\n}\n\n// function byteArrayToLong(byteArray: number[]): number {\n// var value = 0\n// for (var i = byteArray.length - 1; i >= 0; i--) {\n// value = value * 256 + byteArray[i]\n// }\n// return value\n// }\n\nexport function suidBytes(): Uint8Array {\n const ms = getTimestamp() - ReferenceDateInMS\n return new Uint8Array([...longToByteArray(ms), ...randomUint8Array(10)])\n}\n\nexport function suid(): string {\n return uuidEncode(suidBytes())\n}\n\nexport function suidDate(id: string): Date {\n return suidBytesDate(uuidDecode(id))\n}\n\nexport function suidBytesDate(id: Uint8Array): Date {\n return new Date(\n ReferenceDateInMS + id.slice(0, 6).reduce((acc, byte) => acc * 256 + byte, 0),\n )\n}\n\n// 32 bit UUID\n\nexport function uuid32bit() {\n return new Uint32Array(randomUint8Array(4))[0]\n}\n\n// Global Settings\n\nconst mapModes = {\n base62: {\n uuid: uuidB62,\n uuidDecode: uuidDecodeB62,\n uuidEncode: uuidEncodeB62,\n },\n base32: {\n uuid: uuidB32,\n uuidDecode: uuidDecodeB32,\n uuidEncode: uuidEncodeB32,\n },\n uuidv4: {\n uuid: uuidv4,\n uuidDecode: uuidDecodeV4,\n uuidEncode: uuidEncodeV4,\n },\n}\n\nlet _mode: keyof typeof mapModes = 'base62'\nlet _sorted = false\n\nexport function setUuidDefaultEncoding(mode: keyof typeof mapModes, sorted = false) {\n _mode = mode\n _sorted = sorted\n}\n\nexport function uuid(): string {\n return mapModes[_mode].uuid(_sorted ? suidBytes() : uuidBytes())\n}\n\nexport function uuidDecode(uuid: string): Uint8Array {\n return mapModes[_mode].uuidDecode(uuid)\n}\n\nexport function uuidEncode(bytes: Uint8Array): string {\n return mapModes[_mode].uuidEncode(bytes)\n}\n\nexport function uuidIsValid(uuid: string): boolean {\n try {\n const bin = uuidDecode(uuid)\n return bin.length === uuidBytesLength\n }\n catch (err) {\n // log.warn('Invalid ID:', uuid)\n }\n return false\n}\n\n// Simple Counters\n\nconst _unameCounters: Record<string, number> = {}\n\nexport function uname(name = 'id'): string {\n if (_unameCounters[name] == null)\n _unameCounters[name] = 0\n\n return `${name}-${_unameCounters[name]++}`\n}\n\nlet _qid = 0\n\nexport function qid(): string {\n return `id-${_qid++}`\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { useDispose } from '../dispose-defer'\nimport { uuid } from '../uuid'\nimport { Emitter } from './emitter'\n\n// import { Logger } from \"../log\"\n// const log = Logger(\"zeed:channel\")\n\n/** See http://developer.mozilla.org/en-US/docs/Web/API/MessageEvent */\nexport interface ChannelMessageEvent {\n data: any\n origin?: string\n lastEventId?: string\n}\n\n/**\n * Inspired by\n * http://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel\n * https://deno.com/deploy/docs/runtime-broadcast-channel\n */\nexport abstract class Channel extends Emitter<{\n message(event: ChannelMessageEvent): void\n messageerror(event: ChannelMessageEvent): void // optional\n connect(): void // optional\n disconnect(): void // optional\n close(): void\n}> {\n id: string = uuid()\n abstract isConnected?: boolean\n abstract postMessage(data: any): void\n\n dispose = useDispose()\n\n /** @deprecated use .dispose() */\n close() {\n void this.dispose()\n }\n}\n\n/** Very basic channel demonstrating local communication */\nexport class LocalChannel extends Channel {\n isConnected = true\n\n other?: LocalChannel\n\n postMessage(data: any) {\n void this.other?.emit('message', {\n data, // : cloneObject(data),\n origin: 'local',\n lastEventId: uuid(),\n })\n }\n}\n\nexport function createLocalChannelPair(): [LocalChannel, LocalChannel] {\n const w1 = new LocalChannel()\n const w2 = new LocalChannel()\n\n w1.other = w2\n w2.other = w1\n\n return [w1, w2]\n}\n","import { decrypt, encrypt } from '../crypto'\nimport { Uint8ArrayToJson, jsonToUint8Array } from '../data/bin'\n\nexport interface Encoder {\n encode(data: any): Promise<Uint8Array>\n decode(data: Uint8Array): Promise<any>\n}\n\nexport class NoopEncoder implements Encoder {\n async encode(data: any): Promise<Uint8Array> {\n return data\n }\n\n async decode(data: Uint8Array): Promise<any> {\n return data\n }\n}\n\nexport class JsonEncoder implements Encoder {\n async encode(data: any): Promise<Uint8Array> {\n return jsonToUint8Array(data)\n }\n\n async decode(data: Uint8Array): Promise<any> {\n return Uint8ArrayToJson(data)\n }\n}\n\nexport class CryptoEncoder implements Encoder {\n key: CryptoKey\n\n constructor(key: CryptoKey) {\n this.key = key\n }\n\n async encode(data: any): Promise<Uint8Array> {\n const plain = jsonToUint8Array(data)\n return await encrypt(plain, this.key)\n }\n\n async decode(data: Uint8Array): Promise<any> {\n const plain = await decrypt(data, this.key)\n return Uint8ArrayToJson(plain)\n }\n}\n","import { valueToString } from '../data/convert'\nimport { isPromise, tryTimeout } from '../exec/promise'\nimport { DefaultLogger } from '../log'\nimport type { LogLevelAliasType } from '../log/log-base'\nimport type { Json } from '../types'\nimport { uname, uuid } from '../uuid'\nimport type { Channel } from './channel'\nimport type { Encoder } from './encoder'\nimport { JsonEncoder } from './encoder'\n\nexport interface MessageAction {\n name: string\n id: string\n args?: Json[]\n}\n\nexport interface MessageResult {\n id: string\n result?: Json\n error?: { stack?: string, name: string, message: string }\n}\n\nexport type Message = MessageAction | MessageResult\n\nexport interface MessagesOptions {\n timeout?: number\n}\n\nexport interface MessagesDefaultMethods<L> {\n dispose(): void\n connect?(channel: Channel): void\n options(opt: MessagesOptions): L\n}\n\nexport type MessagesMethods<L> = L & MessagesDefaultMethods<L>\n\n// export type MessageDefinitions = {\n// [key: string]: (...args: any) => Promise<any>\n// }\n\nexport type MessageDefinitions = Record<any, (...args: any) => Promise<any>>\n\nexport interface MessageHub {\n dispose(): void\n connect: (newChannel: Channel) => void\n listen<L extends MessageDefinitions>(newHandlers: L): void\n send<L extends MessageDefinitions>(): MessagesMethods<L>\n}\n\n// The async proxy, waiting for a response\nexport function createPromiseProxy<P extends object>(fn: (name: string, args: any[], opt: any) => Promise<unknown>,\n opt: MessagesOptions,\n predefinedMethods: any = {}): P {\n return new Proxy<P>(predefinedMethods, {\n get: (target: any, name: any) => {\n if (name in target)\n return target[name]\n return (...args: any): any => fn(name, args, opt)\n },\n })\n}\n\n/**\n * RPC\n *\n * Features:\n * - Waits for connection\n * - Retries after fail\n * - Timeouts\n */\nexport function useMessageHub(\n opt: {\n name?: string\n channel?: Channel\n encoder?: Encoder\n retryAfter?: number\n ignoreUnhandled?: boolean\n debug?: boolean\n logLevel?: LogLevelAliasType\n } = {},\n): MessageHub {\n const {\n name = uname('hub'),\n encoder = new JsonEncoder(),\n retryAfter = 1000,\n ignoreUnhandled = true,\n logLevel = false,\n } = opt\n\n const log = DefaultLogger(name, logLevel)\n\n const handlers = {}\n let channel: Channel | undefined\n const queue: Message[] = []\n let queueRetryTimer: any\n const waitingForResponse: Record<string, [\n (result?: any) => any, // resolve\n (result?: any) => any, // reject\n ]> = {}\n\n const dispose = () => {\n clearTimeout(queueRetryTimer)\n }\n\n const postNext = async () => {\n clearTimeout(queueRetryTimer)\n if (channel) {\n if (channel.isConnected) {\n while (queue.length) {\n const message = queue[0]\n try {\n channel.postMessage(await encoder.encode(message))\n queue.shift() // remove from queue when done\n }\n catch (err) {\n log.warn('postMessage', err)\n break\n }\n }\n }\n if (queue.length > 0 && retryAfter > 0)\n queueRetryTimer = setTimeout(postNext, retryAfter)\n }\n }\n\n const postMessage = async (message: Message) => {\n log('enqueue postMessage', message)\n queue.push(message)\n await postNext()\n }\n\n const connect = async (newChannel: Channel) => {\n channel = newChannel\n channel.on('connect', postNext)\n channel.on('message', async (msg: any) => {\n log('onmessage', typeof msg)\n const { name, args, id, result, error } = await encoder.decode(msg.data)\n\n // Incoming new message\n if (name) {\n log(`name ${name} id ${id}`)\n try {\n // @ts-expect-error xxx\n if (handlers[name] == null)\n throw new Error(`handler for ${name} was not found`)\n\n // @ts-expect-error xxx\n let result = handlers[name](...args)\n if (isPromise(result))\n result = await result\n log(`result ${result}`)\n if (id)\n await postMessage({ id, result })\n }\n catch (error) {\n const err\n = error instanceof Error ? error : new Error(valueToString(error))\n log.warn('execution error', err.name)\n await postMessage({\n id,\n error: {\n message: err.message,\n stack: err.stack,\n name: err.name,\n },\n })\n }\n }\n\n // Incoming new response\n else if (id) {\n log(`response for id=${id}: result=${result}, error=${error}`)\n if (waitingForResponse[id] == null) {\n if (result === undefined)\n log(`skip response for ${id}`)\n else\n log.warn(`no response hook for ${id}`)\n }\n else {\n const [resolve, reject] = waitingForResponse[id]\n if (resolve && reject) {\n delete waitingForResponse[id]\n if (error) {\n const err = new Error(error.message)\n err.stack = error.stack\n err.name = error.name\n log.warn('reject', err.name)\n reject(err)\n }\n else {\n log('resolve', result)\n resolve(result)\n }\n }\n }\n }\n\n // Don't know what to do with it\n else if (!ignoreUnhandled) {\n log.warn('Unhandled message', msg)\n }\n })\n\n await postNext()\n }\n\n const fetchMessage = async (\n name: string,\n args: any[],\n opt: MessagesOptions = {},\n ): Promise<unknown> => {\n const { timeout = 5000 } = opt\n const id = uuid()\n await postMessage({\n name,\n args,\n id,\n })\n return tryTimeout(\n new Promise(\n (resolve, reject) => (waitingForResponse[id] = [resolve, reject]),\n ),\n timeout,\n )\n }\n\n if (opt.channel)\n void connect(opt.channel) // todo async\n\n return {\n dispose,\n connect,\n listen<L extends object>(newHandlers: L) {\n Object.assign(handlers, newHandlers)\n },\n send<L extends object>() {\n // The regular proxy without responding, just send\n return createPromiseProxy<L>(fetchMessage, {}, {\n options(perCallopt: MessagesOptions) {\n return createPromiseProxy<L>(fetchMessage, { ...perCallopt })\n },\n } as MessagesDefaultMethods<L>) as MessagesMethods<L>\n },\n }\n}\n","import { DefaultLogger } from '../log'\nimport { uname } from '../uuid'\nimport type { Channel } from './channel'\nimport type { DefaultListener, ListenerSignature } from './emitter'\nimport { Emitter } from './emitter'\nimport type { Encoder } from './encoder'\nimport { JsonEncoder } from './encoder'\n\ninterface PubSubConfig {\n channel: Channel\n encoder?: Encoder\n name?: string\n debug?: boolean\n}\n\nexport class PubSub<L extends ListenerSignature<L> = DefaultListener> extends Emitter<L> {\n name: string\n channel: Channel\n encoder: Encoder\n log: any\n debug: boolean\n\n get shortId() {\n return this.name.substr(0, 6)\n }\n\n constructor(opt: PubSubConfig) {\n super()\n\n const { name, encoder = new JsonEncoder(), channel, debug = false } = opt\n\n this.channel = channel\n this.encoder = encoder\n this.debug = debug\n\n this.name = name ?? this.channel.id ?? uname('pubsub')\n this.log = DefaultLogger(`${this.shortId}`)\n\n if (this.debug) {\n this.channel.on('connect', () => {\n this.log('channel connected')\n })\n this.channel.on('disconnect', () => {\n this.log('channel disconnected')\n })\n }\n\n this.channel.on('message', async ({ data }) => {\n const info = await this.encoder.decode(data)\n if (this.debug)\n this.log(`channel message, event=${info?.event}, info=`, info)\n else this.log(`channel message, event=${info?.event}`)\n if (info) {\n const { event, args } = info\n await this.emitSuper(event, ...args)\n }\n })\n }\n\n private async emitSuper<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n return await super.emit(event, ...args)\n }\n\n async emit<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n try {\n if (this.debug)\n this.log(`emit(${String(event)})`, event)\n else this.log(`emit(${String(event)})`, args.length)\n if (!this.channel.isConnected) {\n this.log.warn('channel not connected')\n return false\n }\n const data = await this.encoder.encode({ event, args })\n this.channel.postMessage(data)\n return true\n }\n catch (err) {\n this.log.warn(`emit(${String(event)})`, err)\n }\n return false\n }\n\n publish = this.emit.bind(this)\n subscribe = this.on.bind(this)\n}\n\nexport function usePubSub<L extends ListenerSignature<L> = DefaultListener>(\n opt: PubSubConfig,\n) {\n return new PubSub<L>(opt)\n}\n","// From https://github.com/antfu/birpc/blob/main/src/index.ts MIT\n\nimport type { LoggerInterface } from '../log/log-base'\n\nexport type ArgumentsType<T> = T extends (...args: infer A) => any ? A : never\nexport type ReturnType<T> = T extends (...args: any) => infer R ? R : never\n\nexport interface RPCOptionsBasic {\n /** No return values expected */\n onlyEvents?: boolean\n /** Function to post raw message */\n post: (data: any) => void\n /** Listener to receive raw message */\n on: (fn: (data: any) => void) => void\n /** Custom function to serialize data */\n serialize?: (data: any) => any\n /** Custom function to deserialize data */\n deserialize?: (data: any) => any\n /** Custom logger */\n log?: LoggerInterface\n}\n\nexport interface RPCOptions<Remote> extends RPCOptionsBasic {\n // /** No return values expected */\n // onlyEvents?: boolean\n /** Names of remote functions that do not need response. */\n eventNames?: (keyof Remote)[]\n}\n\nexport interface RPCFn<T> {\n /** Call the remote function and wait for the result. */\n (...args: ArgumentsType<T>): Promise<Awaited<ReturnType<T>>>\n /** Send event without asking for response */\n asEvent(...args: ArgumentsType<T>): void\n}\n\nexport type RPCReturn<RemoteFunctions> = {\n [K in keyof RemoteFunctions]: RPCFn<RemoteFunctions[K]>\n}\n\nlet rpcCounter = 1\n\nenum RPCMode {\n request = 1,\n event = 2,\n resolve = 3,\n reject = 4,\n}\n\ntype RPCMessage = [\n RPCMode,\n any, // args\n number | undefined | null, // id\n string | undefined | null, // method\n]\n\nconst defaultSerialize = (i: any) => i\nconst defaultDeserialize = defaultSerialize\n\nfunction setupRPCBasic(options: RPCOptionsBasic, functions: any, eventNames: string[] = []) {\n const {\n post,\n on,\n serialize = defaultSerialize,\n deserialize = defaultDeserialize,\n log,\n } = options\n\n const rpcPromiseMap = new Map<\n number,\n { resolve: (...args: any) => any, reject: (...args: any) => any }\n >()\n\n on(async (data) => {\n try {\n const msg = deserialize(data) as RPCMessage\n const [mode, args, id, method] = msg\n if (mode === RPCMode.request || mode === RPCMode.event) {\n let result, error: any\n if (method != null) {\n try {\n const fn = functions[method]\n result = await fn(...args)\n }\n catch (e) {\n error = String(e)\n }\n }\n else {\n error = 'Method implementation missing'\n }\n if (error)\n log?.warn('error', msg, error)\n if (mode === RPCMode.request && id) {\n if (error)\n post(serialize([RPCMode.reject, error, id]))\n else\n post(serialize([RPCMode.resolve, result, id]))\n }\n }\n else if (id) {\n const promise = rpcPromiseMap.get(id)\n if (promise != null) {\n if (mode === RPCMode.reject)\n promise.reject(args)\n else promise.resolve(args)\n }\n rpcPromiseMap.delete(id)\n }\n }\n catch (err) {\n log?.warn('Error on handling RPC data. Invalid?', err, data)\n }\n })\n\n const proxyHandler = {\n get(_: any, method: string) {\n const sendEvent = (...args: any[]) => {\n post(serialize([RPCMode.event, args, null, method]))\n }\n if (options.onlyEvents || eventNames.includes(method)) {\n sendEvent.asEvent = sendEvent\n return sendEvent\n }\n const sendCall = (...args: any[]) => {\n return new Promise((resolve, reject) => {\n const id = rpcCounter++\n rpcPromiseMap.set(id, { resolve, reject })\n post(serialize([RPCMode.request, args, id, method]))\n })\n }\n sendCall.asEvent = sendEvent\n return sendCall\n },\n }\n\n return { post, serialize, rpcPromiseMap, proxyHandler }\n}\n\nexport function useRPC<LocalFunctions, RemoteFunctions = LocalFunctions>(\n functions: LocalFunctions,\n options: RPCOptions<RemoteFunctions>,\n): RPCReturn<RemoteFunctions> {\n const { eventNames = [] } = options\n const { proxyHandler } = setupRPCBasic(options, functions, eventNames as any)\n\n return new Proxy({}, proxyHandler)\n}\n\nexport function useRPCHub(options: RPCOptionsBasic) {\n const eventNames: string[] = []\n const functions: Record<string, any> = {}\n\n const { proxyHandler } = setupRPCBasic(options, functions)\n\n function createRPCProxy() {\n return new Proxy({}, proxyHandler)\n }\n\n return function<LocalFunctions, RemoteFunctions = LocalFunctions>(\n additionalFunctions?: LocalFunctions,\n additionalEventNames: string[] = [],\n ): RPCReturn<RemoteFunctions> {\n Object.assign(functions, additionalFunctions ?? {})\n // log(`Registered functions:\\n${Object.keys(functions).join('\\n')}`)\n eventNames.push(...additionalEventNames)\n return createRPCProxy()\n }\n}\n\nexport type UseRPCHubType = ReturnType<typeof useRPCHub>\n\n// Syntax test case\n// const hub: UseRPCHubType = {} as any\n// const x = hub({\n// test(name: string): string {\n// return name\n// },\n// })\n// await x.test('dsd')\n","// Inspired by https://developer.apple.com/documentation/foundation/progress\n\nimport { useDispose } from '../dispose-defer'\nimport { arrayRemoveElement } from '../data'\nimport { Emitter } from '../msg'\nimport { uname } from '../uuid'\n\ninterface ProgressOptions {\n totalUnits?: number\n completeUnits?: number\n resetWhenFinished?: boolean\n name?: string\n}\n\n/**\n * Progress helper with these properties:\n *\n * - `totalUnits` and `completedUnits` for progress\n * - Can be cancelled\n * - Sends events on cancel, changed and dispose\n * - Supports children and propagates values.\n * Total progress is sum of all units in the tree.\n * - On `dispose` child removes itself from parent.\n */\nexport class Progress extends Emitter<{\n progressCancelled(progress: Progress): void\n progressChanged(progress: Progress): void\n progressDispose(progress: Progress): void\n}> {\n private _totalUnits: number\n private _completedUnits: number\n private _isCancelled = false\n private _resetWhenFinished = true\n private _children: Progress[] = []\n\n dispose = useDispose()\n name: string\n\n constructor(opt: ProgressOptions = {}) {\n super()\n\n this._totalUnits = opt.totalUnits ?? 0\n this._completedUnits = opt.completeUnits ?? 0\n this._resetWhenFinished = opt.resetWhenFinished ?? true\n this.name = opt.name ?? uname('progress')\n\n // Make sure to cleanup also children\n this.dispose.add(async () => {\n for (const child of this._children)\n await child.dispose()\n await this.emit('progressDispose', this)\n })\n }\n\n /** Notify others about changes and reset on completion, if flag is set. */\n private update() {\n void this.emit('progressChanged', this)\n\n if (this._isCancelled && this._resetWhenFinished) {\n if (this.getTotalUnits() <= this.getCompletedUnits())\n this.reset()\n }\n }\n\n /** Fresh start */\n reset() {\n if (this._isCancelled) {\n this._isCancelled = false\n for (const child of this._children)\n child.reset()\n this.update()\n }\n }\n\n /** Notify and mark as cancelled. May take some time before having an effect. */\n async cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true\n await this.emit('progressCancelled', this)\n for (const child of this._children)\n await child.cancel()\n this.update()\n }\n }\n\n /** Add child progress, which count into its parents units. On `dispose` it will auto remove itself from parent. */\n addChild(child: Progress) {\n child.on('progressDispose', () => this.removeChild(child))\n child.on('progressChanged', () => this.update())\n if (!this._children.includes(child))\n this._children.push(child)\n this.update()\n }\n\n /** Create child progress. */\n createChildProgress(opt?: ProgressOptions) {\n const progress = new Progress(opt)\n this.addChild(progress)\n return progress\n }\n\n removeChild(child: Progress) {\n arrayRemoveElement(this._children, child)\n this.update()\n }\n\n /** Total units including children */\n getTotalUnits(): number {\n if (this.isIndeterminate())\n return 0\n let units = this._totalUnits\n for (const child of this._children)\n units += child.getTotalUnits()\n return units\n }\n\n /** Completed units including children */\n getCompletedUnits(): number {\n if (this.isIndeterminate())\n return 0\n let units = this._completedUnits\n for (const child of this._children)\n units += child.getCompletedUnits()\n return units\n // return Math.min(this.getTotalUnits(), units)\n }\n\n /** Cannot calculate progress, because totalUnits are missing. Special representation in UI. */\n isIndeterminate(): boolean {\n return this._totalUnits <= 0 && this._children.length <= 0\n }\n\n isCancelled() {\n return this._isCancelled\n }\n\n /** Either disposed or all units completed. */\n isFinished() {\n return this.dispose.isDisposed() || (!this.isIndeterminate() && (this.getTotalUnits() <= this.getCompletedUnits()))\n }\n\n /** Value from 0 to 1, where 1 is 100% completeness. */\n getFraction() {\n if (this.isIndeterminate())\n return 0\n let value = this.getCompletedUnits() / this.getTotalUnits()\n if (Number.isNaN(value))\n value = 0\n return Math.min(1, Math.max(0, value))\n }\n\n getChildrenCount() {\n return this._children.length\n }\n\n /** Change total units. */\n setTotalUnits(units: number, completedUnits?: number) {\n this._totalUnits = units\n if (completedUnits != null)\n this._completedUnits = completedUnits\n this.update()\n }\n\n /** Relatively change total units. */\n incTotalUnits(step = 1) {\n this._totalUnits += step\n this.update()\n }\n\n /** Set fixed number of completed units. */\n setCompletetedUnits(units: number) {\n this._completedUnits = units\n this.update()\n }\n\n /** Set to 100% without disposing. */\n setCompleted() {\n this._completedUnits = this._totalUnits\n this.update()\n }\n\n /** Dynamically change completed units. */\n incCompletedUnits(step = 1) {\n this._completedUnits += step\n this.update()\n }\n\n /** Progress tree to string for debuggin purposes. Consider using `name` attribute of Progress. */\n toString(indent = 0) {\n let s = `${' '.repeat(indent)}${this.name}: ${this._completedUnits} of ${this._totalUnits} units, ${Math.floor(this.getFraction() * 100)} %, cancel=${this._isCancelled}\\n`\n for (const child of this._children)\n s += child.toString(indent + 1)\n if (indent === 0)\n return s.trim()\n return s\n }\n}\n","import { useDispose } from '../dispose-defer'\nimport { Emitter } from '../msg/emitter'\nimport { uname, uuid } from '../uuid'\nimport { Progress } from './progress'\nimport { createPromise } from './promise'\n\nexport type PoolTaskIdConflictResolution = 'replace' | 'memoize' | 'prioritize' | 'error'\n\n// export enum PoolTaskIdConflictResolution {\n// /**\n// * Tasks with same `id` are replaced. Newest wins.\n// */\n// replace = 0,\n\n// /**\n// * Task with same `id` will continue to run. Reference is returned with option to cancel.\n// * Named \"memoize\" because the result of the task should always be the same for the same `id`,\n// * like e.g. a download.\n// */\n// memoize = 1,\n\n// /** Like memoize, but try to put on top of the list */\n// prioritize = 2,\n\n// /**\n// * Tasks with same `id` throw error\n// */\n// error = 3,\n\n// }\n\nexport interface PoolConfig {\n name?: string\n maxParallel?: number\n idConflictResolution?: PoolTaskIdConflictResolution\n}\n\nexport type PoolTaskFn<T = any> = (taskInfo: PoolTask<T>) => Promise<T>\n\nexport type PoolTaskState = 'waiting' | 'running' | 'finished'\n\n/** Task */\nexport interface PoolTask<T> {\n readonly id: string\n readonly task: PoolTaskFn<T>\n readonly done: (result?: any) => void\n readonly setMax: (max: number) => void\n readonly setResolved: (resolved: number) => void\n readonly incResolved: (inc?: number) => void\n state: PoolTaskState\n priority: number\n /** Same groups are executed only one at a time */\n group?: string\n\n progress: Progress\n max: number\n resolved: number\n\n result?: T\n payload?: unknown\n}\n\nexport interface PoolTaskEvents {\n didUpdate(\n max: number,\n resolved: number,\n presentMax: number,\n presentResolved: number\n ): void\n didStart(id: string): void\n didCancel(id: string): void\n didFinish(): void\n didResolve(id: string, value: any): void\n didReject(id: string, error: any): void\n}\n\n// todo: barrier\n// todo: dependents\n\nexport function usePool<T = any>(config: PoolConfig = {}) {\n const {\n maxParallel = 3,\n name = uname('pool'),\n idConflictResolution = 'memoize',\n } = config\n\n const events = new Emitter<PoolTaskEvents>()\n\n const dispose = useDispose()\n dispose.add(cancelAll)\n\n const progress = new Progress({ name })\n\n progress.on('progressCancelled', cancelAll)\n\n let countMax = 0\n let countResolved = 0\n let currentParallel = 0\n let priority = 0\n const tasks: Record<string, PoolTask<T>> = {}\n\n // const [allFinishedPromise, allFinishedResolve] = createPromise()\n\n async function waitFinishAll() {\n if (countMax > 0) {\n const [promise, resolve] = createPromise()\n events.once('didFinish', resolve)\n return promise\n }\n }\n\n async function cleanupFinished() {\n for (const id of Object.keys(tasks)) {\n const task = tasks[id]\n if (task.state === 'finished') {\n await tasks[id].progress.dispose()\n delete tasks[id]\n }\n }\n }\n\n function didFinish() {\n void events.emit('didFinish')\n // allFinishedResolve(countMax)\n countMax = 0\n countResolved = 0\n void cleanupFinished()\n progress.reset()\n }\n\n function didUpdate() {\n let presentMax = 0\n let presentResolved = 0\n for (const { max, resolved, state } of Object.values(tasks)) {\n presentMax += max\n presentResolved += state === 'finished' ? max : Math.min(max, resolved)\n }\n void events.emit(\n 'didUpdate',\n countMax,\n countResolved,\n presentMax,\n presentResolved,\n )\n }\n\n function performNext() {\n didUpdate()\n if (countMax > 0 && countMax === countResolved)\n didFinish()\n if (currentParallel >= maxParallel)\n return\n const waitingTasks = Object.values(tasks).filter(\n t => t.state === 'waiting',\n )\n if (waitingTasks.length > 0) {\n let taskInfo: PoolTask<T> | undefined\n for (const t of waitingTasks) {\n // Skip task if one of same group is running.\n // Forces serialized execution for subgroup of tasks.\n if (\n t.group != null\n && Object.values(tasks).some(\n tt =>\n tt.state === 'running'\n && tt.id !== t.id\n && tt.group === t.group,\n )\n )\n continue\n\n // fifo\n if (taskInfo == null || t.priority < taskInfo.priority)\n taskInfo = t\n }\n if (taskInfo != null) {\n const id = taskInfo.id\n const done = taskInfo.done\n taskInfo.state = 'running'\n ++currentParallel\n void events.emit('didStart', id)\n\n const taskFinished = (result?: T) => {\n if (taskInfo) {\n taskInfo.result = result\n taskInfo.state = 'finished'\n taskInfo.resolved = taskInfo.max\n taskInfo.progress?.setCompleted()\n // void taskInfo.progress.dispose()\n }\n --currentParallel\n ++countResolved\n performNext()\n }\n\n taskInfo\n .task(taskInfo)\n .then((r) => {\n done(r)\n void events.emit('didResolve', id, r)\n taskFinished(r)\n })\n .catch((err) => {\n done()\n void events.emit('didReject', id, err)\n taskFinished()\n })\n }\n }\n }\n\n function cancel(id: string) {\n const taskInfo = tasks[id]\n if (taskInfo && taskInfo.state === 'waiting') {\n tasks[id].state = 'finished'\n ++countResolved\n void events.emit('didCancel', id)\n void tasks[id].progress.dispose()\n didUpdate()\n }\n }\n\n function cancelAll() {\n Object.keys(tasks).forEach(cancel)\n // progress.dispose()\n }\n\n function hasById(id: string) {\n return tasks[id] != null\n }\n\n function enqueue<P>(\n task: PoolTaskFn<T>,\n config: {\n id?: string\n max?: number\n resolved?: number\n group?: string\n idConflictResolution?: PoolTaskIdConflictResolution\n payload?: P\n } = {},\n ) {\n let done: any\n const promise: Promise<any> = new Promise(resolve => (done = resolve))\n const id = config.id ?? uuid()\n\n if (tasks[id] != null) {\n const resolution = config.idConflictResolution ?? idConflictResolution\n\n if (resolution === 'replace') {\n cancel(id)\n }\n else if (resolution === 'memoize' || resolution === 'prioritize') {\n const runningTask = tasks[id]\n\n if (resolution === 'prioritize')\n runningTask.priority = ++priority\n\n return {\n id,\n promise: (async () => {\n if (runningTask.state === 'finished')\n return tasks[id].result\n\n // todo: wait for task to finish\n })(),\n dispose: () => cancel(id),\n cancel: () => cancel(id),\n }\n }\n else {\n throw new Error(`Pool task with id=${id} already exists!`)\n }\n }\n\n const taskProgress = new Progress({\n name: id,\n totalUnits: config.max ?? 1,\n completeUnits: config.resolved ?? 0,\n })\n\n progress.addChild(taskProgress)\n\n tasks[id] = {\n id,\n task,\n priority: ++priority,\n group: config.group,\n state: 'waiting',\n max: config.max ?? 1,\n resolved: config.resolved ?? 0,\n done,\n payload: config.payload,\n progress: taskProgress,\n\n /** @deprecated should use `.progress` */\n setMax(units) {\n taskProgress.setTotalUnits(units)\n tasks[id].max = units\n didUpdate()\n },\n\n /** @deprecated should use `.progress` */\n setResolved(units) {\n taskProgress.setCompletetedUnits(units)\n tasks[id].resolved = units\n didUpdate()\n },\n\n /** @deprecated should use `.progress` */\n incResolved(inc = 1) {\n taskProgress.incCompletedUnits(inc)\n tasks[id].resolved += inc\n didUpdate()\n },\n }\n ++countMax\n performNext()\n\n return {\n id,\n promise,\n dispose: () => cancel(id),\n cancel: () => cancel(id),\n }\n }\n\n return {\n events,\n cancel,\n cancelAll,\n hasById,\n progress,\n enqueue,\n dispose,\n waitFinishAll,\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n// Can learn from here https://github.com/sindresorhus/p-queue\n\nimport { DefaultLogger } from '../log'\nimport type { LogLevel, LoggerInterface } from '../log/log-base'\nimport { LogLevelOff } from '../log/log-base'\nimport { Emitter } from '../msg/emitter'\nimport { uname } from '../uuid'\n\ntype TaskResolver = any\n\nexport type TaskFn<T = any> = () => Promise<T>\n\ninterface TaskInfo {\n name: string\n task: TaskFn\n resolve: TaskResolver\n}\n\nexport interface TaskEvents {\n didUpdate(max: number, resolved: number): void\n didStart(max: number): void\n didCancel(): void\n didFinish(): void\n // didResolve(value: any): void\n // didReject(error: any): void\n // didPause(max: number): void\n}\n\n/** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */\nexport class SerialQueue extends Emitter<TaskEvents> {\n private queue: TaskInfo[] = []\n private waitToFinish: TaskResolver[] = []\n private currentTask?: Promise<any>\n private log: LoggerInterface\n private countMax = 0\n private countResolved = 0\n\n private paused = false\n\n name: string\n\n constructor(opt: { name?: string, logLevel?: LogLevel } = {}) {\n super()\n const { name = uname('queue'), logLevel } = opt\n this.name = name\n this.log = DefaultLogger(`zeed:queue:${name}`, logLevel ?? LogLevelOff)\n }\n\n private async performNext() {\n this.log('performNext, queue.length =', this.queue.length)\n\n if (this.currentTask != null) {\n this.log('performNext => skip while another task is running')\n return\n }\n\n if (this.paused) {\n this.log('performNext => skip while is paused')\n return\n }\n\n while (this.currentTask == null && !this.paused) {\n const info = this.queue.shift()\n this.log(`performNext => ${info?.name}`)\n\n if (info == null)\n break\n\n if (this.countResolved === 0)\n void this.emit('didStart', this.countMax)\n\n const { name, task, resolve } = info\n this.currentTask = task()\n let result\n try {\n this.log.info(`start task ${name}`)\n result = await this.currentTask\n this.log(`finished task ${name} with result =`, result)\n }\n catch (err) {\n this.log.warn('Error performing task', err)\n }\n\n resolve(result)\n this.currentTask = undefined\n\n this.countResolved += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n }\n\n if (this.queue.length === 0) {\n void this.emit('didFinish')\n this.countMax = 0\n this.countResolved = 0\n }\n\n while (this.waitToFinish.length > 0)\n this.waitToFinish.shift()()\n }\n\n /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */\n async enqueue<T>(\n task: TaskFn<T>,\n opt: { immediate?: boolean, name?: string } = {},\n ): Promise<T> {\n const { immediate = false, name = uname(this.name) } = opt\n if (immediate) {\n this.log.info(`immediate execution ${name}`)\n return await task()\n }\n\n this.log(`enqueue ${name}`)\n return new Promise((resolve) => {\n this.queue.push({\n name,\n task,\n resolve,\n })\n\n this.countMax += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n\n void this.performNext()\n })\n }\n\n /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */\n async enqueueReentrant<T>(\n task: TaskFn<T>,\n opt: { name?: string } = {},\n ): Promise<T> {\n return this.enqueue(task, {\n immediate: this.currentTask != null,\n name: opt.name,\n })\n }\n\n /** Remove all tasks from queue that are not yet executing. */\n async cancelAll(_unblock = true) {\n this.log('cancelAll')\n void this.emit('didCancel')\n const resolver = this.queue.map(task => task.resolve)\n this.queue = []\n resolver.forEach(r => r(undefined))\n await this.wait()\n }\n\n /** Pause execution after current task is finished. */\n async pause() {\n this.log('pause')\n this.paused = true\n await this.wait()\n }\n\n /** Resume paused queue. */\n resume() {\n this.log('resume')\n this.paused = false\n void this.performNext()\n }\n\n /** Wait for all tasks to finish */\n async wait() {\n this.log('wait')\n if (this.currentTask == null && (this.queue.length === 0 || this.paused))\n return\n\n return new Promise((resolve) => {\n this.waitToFinish.push(resolve)\n })\n }\n\n public get isPaused(): boolean {\n return this.paused\n }\n\n public get hasTasks(): boolean {\n return this.queue.length !== 0\n }\n}\n","// General explaination https://css-tricks.com/debouncing-throttling-explained-examples/\n// From https://github.com/cowboy/jquery-throttle-debounce\n// And https://github.com/wuct/raf-throttle/blob/master/rafThrottle.js\n\nimport { promisify } from './promise'\n\n// const DEBUG = false\n// const log = DEBUG ? LoggerLazy('zeed:throttle', 'error') : () => {}\n\n/**\n * A special throttle implementation that tries to distribute execution\n * in an optimal way.\n *\n * **Functionality:** For UI usage the function is executed on first occasion (`leading`).\n * If more calls follow it will again be executed at end (`trailing`).\n * If the next call is inside the timeframe, it is delayed until `trailing`.\n * This avoids timewise too close calls.\n * It is possible to `cancel` the timeout and to `flush` a call, e.g. if\n * leaving UI situation where a final call is required to write data or similar.\n */\nexport function throttle<F extends (...args: any[]) => any>(\n callback: F,\n opt: {\n delay?: number\n trailing?: boolean\n leading?: boolean\n } = {},\n): F & {\n /** Stop all timers, do not exec nothing */\n cancel: () => void\n\n /** Stop all timers and execute right now. */\n immediate: (...args: Parameters<F>) => Promise<void>\n\n /** Stop all timers and execute trailing call, if exists. */\n stop: () => void\n\n dispose: () => void\n} {\n const { delay = 100, trailing = true, leading = true } = opt\n\n let timeoutID: any = 0\n let checkpoint = 0\n let visited = 0\n let trailingExec: () => void | undefined\n\n // const debugCheckpoint = Date.now()\n\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID)\n timeoutID = undefined\n return true\n }\n return false\n }\n\n function wrapper(this: any, ...args: any[]) {\n const now = Date.now()\n const elapsed = now - checkpoint\n\n // function debugElapsed() {\n // const dnow = Date.now()\n // return `total ${(dnow - debugCheckpoint).toFixed(1)}ms - elapsed ${(\n // dnow - checkpoint\n // ).toFixed(1)}ms - visited ${visited}x`\n // }\n\n const exec = () => {\n visited = 0\n checkpoint = Date.now()\n callback.apply(this, args)\n }\n\n trailingExec = exec\n\n // Make sure enough time has passed since last call\n if (elapsed > delay || !timeoutID) {\n // DEBUG && log('elapsed', debugElapsed())\n\n // Leading execute once immediately\n if (leading) {\n if (elapsed > delay) {\n // DEBUG && log('🚀 leading', debugElapsed())\n exec()\n }\n else {\n ++visited // at least trigger trailing this way\n }\n }\n\n const timeout = elapsed > delay ? delay : delay - elapsed\n // log(`⏱ start timeout with ${timeout.toFixed(1)}ms`, debugElapsed())\n\n // Prepare for next round\n clearExistingTimeout()\n checkpoint = now\n\n // Delay. We should not get here if timeout has not been reached before\n timeoutID = setTimeout(() => {\n // DEBUG && log('⏱ reached timeout', debugElapsed())\n timeoutID = 0\n // Only execute on trailing or when visited again, but do not twice if leading\n if (trailing && (!leading || visited > 0)) {\n // DEBUG && log('🚀 trailing', debugElapsed())\n trailingExec?.()\n }\n }, timeout)\n }\n else {\n // Count visits\n ++visited\n // DEBUG && log('visited', debugElapsed())\n }\n }\n\n wrapper.cancel = clearExistingTimeout\n\n wrapper.stop = () => {\n if (clearExistingTimeout() && trailingExec)\n trailingExec()\n }\n\n wrapper.immediate = async function immediate(this: any, ...args: Parameters<F>[]) {\n clearExistingTimeout()\n checkpoint = Date.now()\n callback.apply(this, args)\n }\n\n wrapper.dispose = () => wrapper.stop()\n\n return wrapper as any\n}\n\n/**\n * Debounce fits best for filtering a large peak of events.\n * For UI event filtering throttle is probably a better choice.\n *\n * **Functionality:** It only fires after triggers pause for `delay` ms.\n */\nexport function debounce<F extends (...args: any[]) => any | Promise<any>>(\n callback: F,\n opt: {\n delay?: number\n } = {},\n): F & {\n cancel: () => void\n immediate: (...args: Parameters<F>) => Promise<void>\n dispose: () => void\n} {\n const { delay = 100 } = opt\n let timeoutID: any = 0\n\n let running = false\n let lastArguments: any[] | undefined\n\n function clearExistingTimeout() {\n if (timeoutID) {\n // log('clear')\n clearTimeout(timeoutID)\n timeoutID = 0\n }\n }\n\n async function exec() {\n try {\n clearExistingTimeout()\n if (lastArguments != null) {\n // log('exec')\n const args = [...lastArguments]\n lastArguments = undefined\n running = true\n await promisify(callback(...args))\n running = false\n // log('exec done')\n if (lastArguments != null) {\n clearExistingTimeout()\n // log('exec trigger next')\n timeoutID = setTimeout(exec, delay)\n }\n }\n }\n catch (err) { }\n }\n\n function wrapper(this: any, ...args: any[]) {\n lastArguments = [...args]\n clearExistingTimeout()\n // log('trigger')\n if (running === false)\n timeoutID = setTimeout(exec, delay)\n }\n\n async function immediate(this: any, ...args: any[]) {\n clearExistingTimeout()\n lastArguments = [...args]\n await exec()\n }\n wrapper.cancel = clearExistingTimeout\n wrapper.dispose = clearExistingTimeout\n wrapper.immediate = immediate\n\n return wrapper as any\n}\n","import type { UseDisposeConfig } from './dispose-defer'\nimport { useDispose } from './dispose-defer'\nimport type { DisposerFunction } from './dispose-types'\nimport { promisify } from './exec'\nimport type { LoggerInterface } from './log/log-base'\n\nexport type TimerExecFunction = () => void | Promise<void>\n\nexport function useTimeout(fn: TimerExecFunction, timeout = 0): DisposerFunction {\n let timeoutHandle: any = setTimeout(fn, timeout)\n return () => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle)\n timeoutHandle = undefined\n }\n }\n}\n\nexport function useInterval(fn: TimerExecFunction, interval: number): DisposerFunction {\n let intervalHandle: any = setInterval(fn, interval)\n return () => {\n if (intervalHandle) {\n clearInterval(intervalHandle)\n intervalHandle = undefined\n }\n }\n}\n\n/** The interval starts only, when the function is finished. */\nexport function useIntervalPause(fn: TimerExecFunction, interval: number, immediately = false): DisposerFunction {\n let intervalHandle: any\n let stop = false\n\n async function loop(exec = false) {\n if (exec)\n await promisify(fn())\n if (!stop)\n intervalHandle = setTimeout(() => loop(true), interval)\n }\n\n void loop(immediately)\n\n return () => {\n if (intervalHandle) {\n stop = true\n clearInterval(intervalHandle)\n intervalHandle = undefined\n }\n }\n}\n\nexport function useEventListener(\n emitter: any,\n eventName: string,\n fn: (ev?: any) => void,\n ...args: any[]\n): DisposerFunction {\n if (emitter == null)\n return () => { }\n if (emitter.on)\n emitter.on(eventName, fn, ...args)\n else if (emitter.addEventListener)\n emitter.addEventListener(eventName, fn, ...args)\n return () => {\n if (emitter.off)\n emitter.off(eventName, fn, ...args)\n else if (emitter.removeEventListener)\n emitter.removeEventListener(eventName, fn, ...args)\n }\n}\n\nexport function useEventListenerOnce(\n emitter: any,\n eventName: string,\n fn: (ev?: any) => void,\n ...args: any[]\n): DisposerFunction {\n if (emitter == null)\n return () => { }\n if (emitter.on)\n emitter.once(eventName, fn, ...args)\n else if (emitter.addEventListener)\n emitter.addEventListener(eventName, fn, ...args)\n return () => {\n if (emitter.off)\n emitter.off(eventName, fn, ...args)\n else if (emitter.removeEventListener)\n emitter.removeEventListener(eventName, fn, ...args)\n }\n}\n\n/** Like useDispose but with shorthands for emitter and timers */\nexport function useDisposeWithUtils(config?: string | UseDisposeConfig | LoggerInterface) {\n const dispose = useDispose(config)\n return Object.assign(dispose, {\n timeout: (fn: TimerExecFunction, timeout = 0) => dispose.add(useTimeout(fn, timeout)),\n interval: (fn: TimerExecFunction, interval = 0) => dispose.add(useInterval(fn, interval)),\n intervalPause: (fn: TimerExecFunction, interval = 0) => dispose.add(useIntervalPause(fn, interval)),\n on: (emitter: any, eventName: string, fn: (ev?: any) => void, ...args: any[]) => dispose.add(useEventListener(emitter, eventName, fn, ...args)),\n once: (emitter: any, eventName: string, fn: (ev?: any) => void, ...args: any[]) => dispose.add(useEventListenerOnce(emitter, eventName, fn, ...args)),\n })\n}\n\nexport type UseDisposeWithUtils = ReturnType<typeof useDisposeWithUtils>\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function isLocalHost(\n hostname: string = globalThis?.location?.hostname ?? '',\n): boolean {\n return (\n ['::ffff:127.0.0.1', 'localhost', '127.0.0.1', '', '::1', '::'].includes(\n hostname,\n )\n || hostname.startsWith('192.168.')\n || hostname.startsWith('10.0.')\n || hostname.endsWith('.local')\n )\n}\n","import {\n arrayFlatten,\n deepMerge,\n isArray,\n jsonStringifySafe,\n toBase64,\n} from './data'\nimport { encodeQuery } from './data/url'\nimport { DefaultLogger } from './log'\nimport type { Json } from './types'\n\ninterface fetchOptionType {\n /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */\n cache?: RequestCache\n /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */\n credentials?: RequestCredentials\n /** Returns the kind of resource requested by request, e.g., \"document\" or \"script\". */\n destination?: RequestDestination\n /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the \"Host\" header. */\n headers?: Record<string, string>\n /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */\n integrity?: string\n /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */\n keepalive?: boolean\n /** Returns request's HTTP method, which is \"GET\" by default. */\n method?: string\n /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */\n mode?: RequestMode\n /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */\n redirect?: RequestRedirect\n /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and \"about:client\" when defaulting to the global's default. This is used during fetching to determine the value of the `Referer` header of the request being made. */\n referrer?: string\n /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */\n referrerPolicy?: ReferrerPolicy\n /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */\n signal?: AbortSignal\n /** Returns the URL of request as a string. */\n url?: string\n body?: any\n}\n\ntype fetchOptionsType = fetchOptionType | fetchOptionsType[]\n\nconst defaultOptions: fetchOptionType = {\n cache: 'no-cache',\n redirect: 'follow',\n headers: {},\n}\n\n// Source https://developer.mozilla.org/de/docs/Web/HTTP/Methods\nexport type httpMethod =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'HEAD'\n | 'CONNECT'\n | 'OPTIONS'\n | 'TRACE'\n | 'PATCH'\n\nexport function parseBasicAuth(url: string) {\n const m = /:\\/\\/([^@]*)@/gi.exec(url)\n if (m && m[1]) {\n const [username, password] = m[1].split(':', 2)\n return {\n url: url.replace(`${m[1]}@`, ''),\n username,\n password,\n }\n }\n}\n\n/** Simplified `fetch` that returns `undefined` on non 200 status */\nexport async function fetchBasic(\n url: string | URL,\n fetchOptions: fetchOptionsType = {},\n fetchFn: (input: RequestInfo, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<Response | undefined> {\n try {\n if (isArray(fetchOptions))\n fetchOptions = deepMerge({}, ...arrayFlatten(fetchOptions))\n\n const auth = parseBasicAuth(String(url))\n if (auth) {\n url = auth.url\n fetchOptions = deepMerge(\n {},\n fetchOptions,\n fetchOptionsBasicAuth(auth.username, auth.password),\n )\n }\n\n if (\n // @ts-expect-error headers\n fetchOptions.headers != null\n // @ts-expect-error headers\n && !(fetchOptions.headers instanceof Headers)\n ) {\n // @ts-expect-error headers\n fetchOptions.headers = new Headers(fetchOptions.headers)\n }\n\n // log(\"fetch\", url, fetchOptions)\n const response = await fetchFn(String(url), fetchOptions as RequestInit)\n\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\n if (response.status < 400)\n return response\n\n const log = DefaultLogger('zeed:network')\n\n try {\n log.warn(`Fetch of ${String(url)} returned status=${response.status}. Options:`, fetchOptions)\n log.warn(`Response: ${await response.text()}`)\n }\n catch (err) {\n log.error('Exception:', err)\n }\n }\n catch (err) {\n const log = DefaultLogger('zeed:network')\n log.error('fetchBasic', err)\n }\n}\n\n/** Fetch for JSON */\nexport async function fetchJson<T = Json>(\n url: string | URL,\n fetchOptions: fetchOptionsType = {},\n fetchFn: (input: RequestInfo, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<T | undefined> {\n try {\n const res = await fetchBasic(\n url,\n [\n {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n },\n fetchOptions,\n ],\n fetchFn,\n )\n if (res)\n return await res.json()\n }\n catch (err) {\n const log = DefaultLogger('zeed:network')\n log.error('fetchJSON error:', err)\n }\n}\n\n/** Fetch for text */\nexport async function fetchText(\n url: string | URL,\n fetchOptions: fetchOptionsType = {},\n fetchFn: (input: RequestInfo, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<string | undefined> {\n try {\n const res = await fetchBasic(\n url,\n [defaultOptions, { method: 'GET' }, fetchOptions],\n fetchFn,\n )\n if (res)\n return await res.text()\n }\n catch (err) {\n const log = DefaultLogger('zeed:network')\n log.error('fetchHTML error:', err)\n }\n}\n\n///\n\n/** Options for fetchBasic to send data as application/x-www-form-urlencoded */\nexport function fetchOptionsFormURLEncoded(\n data: object,\n method: httpMethod = 'POST',\n): fetchOptionType {\n return {\n method,\n ...defaultOptions,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',\n },\n body: encodeQuery(data),\n }\n}\n\n/** Options to send data as JSON */\nexport function fetchOptionsJson(\n data: object,\n method: httpMethod = 'POST',\n): fetchOptionType {\n return {\n method,\n ...defaultOptions,\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n // Accept: \"application/json\",\n },\n body: jsonStringifySafe(data),\n }\n}\n\n/** Options to pass basic auth */\nexport function fetchOptionsBasicAuth(\n username: string,\n password: string,\n): fetchOptionType {\n return {\n headers: {\n Authorization: `Basic ${toBase64(`${username}:${password}`)}`,\n },\n }\n}\n","/* eslint-disable no-restricted-globals */\n/* eslint-disable node/prefer-global/process */\n\n// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function getWindow(): any | undefined {\n if (typeof window !== 'undefined')\n return window\n}\n\nexport function getNavigator(): any | undefined {\n if (typeof navigator !== 'undefined')\n return navigator\n}\n\nexport function getGlobal(): any {\n return getWindow()\n // @ts-expect-error xxx\n ?? typeof WorkerGlobalScope !== 'undefined'\n ? self\n : typeof global !== 'undefined'\n ? global\n // eslint-disable-next-line no-new-func\n : Function('return this;')()\n}\n\nexport function detect(\n info = {\n ios: false,\n macos: false,\n windows: false,\n beaker: false,\n electron: false,\n wkwebview: false,\n pwa: false,\n pwaInstalled: false,\n browser: false,\n node: false,\n worker: false,\n test: false,\n jest: false,\n macosNative: false,\n iosNative: false,\n appleNative: false,\n touch: false,\n },\n) {\n const _navigator = getNavigator()\n const _window = getWindow()\n\n info.ios = _navigator?.platform?.match(/(iPhone|iPod|iPad)/i) != null\n info.macos = !!_navigator?.platform?.startsWith('Mac')\n info.windows = !!_navigator?.platform?.startsWith('Win')\n\n info.beaker = _window?.beaker != null // https://github.com/beakerbrowser/beaker\n info.electron\n = (_navigator?.userAgent?.toLowerCase()?.indexOf(' electron/') || -1) > -1\n && !info.beaker\n info.wkwebview = _window?.webkit?.messageHandlers != null // Apple embedded\n\n info.pwa = _navigator?.serviceWorker != null\n\n info.pwaInstalled = _navigator?.standalone\n || _window?.matchMedia?.('(display-mode: standalone)')?.matches\n\n info.node\n = typeof process !== 'undefined' && process?.release?.name === 'node'\n info.browser = !info.electron && !info.wkwebview && !info.node\n\n // info.worker = typeof importScripts === 'function'\n info.worker\n // @ts-expect-error xxx\n = typeof WorkerGlobalScope !== 'undefined'\n // @ts-expect-error xxx\n && self instanceof WorkerGlobalScope\n // @ts-expect-error xxx\n info.jest = typeof jest !== 'undefined' || typeof vitest !== 'undefined'\n info.test = info.jest\n\n info.macosNative = info.wkwebview && info.macos\n info.iosNative = info.wkwebview && info.ios\n info.appleNative = info.wkwebview\n\n // https://github.com/viljamis/feature.js/blob/master/feature.js#L203\n info.touch\n = (_window && 'ontouchstart' in _window)\n || (_navigator?.maxTouchPoints || 0) > 1\n || (_navigator?.msPointerEnabled && _window?.MSGesture)\n // @ts-expect-error xxx\n || (_window?.DocumentTouch && document instanceof DocumentTouch)\n\n return info\n}\n\n// https://stackoverflow.com/a/31090240/140927\n// export const isBrowser = new Function(\n// \"try {return this===window;}catch(e){ return false;}\"\n// )\n\n// export const isNode = new Function(\n// \"try {return this===global;}catch(e){return false;}\"\n// )\n\nexport function isBrowser() {\n return typeof window !== 'undefined' && globalThis === window\n}\n\n// export const platform = detect()\n\n/**\n * Before closing the tab/window or quitting the node process\n * allow to do something important first\n */\nexport function useExitHandler(handler: () => void) {\n if (isBrowser())\n window.addEventListener('beforeunload', handler)\n else if (typeof process !== 'undefined')\n process.on('exit', () => handler)\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { cloneObject } from '../data/utils'\nimport type { Json, ObjectStorage } from '../types'\n\n// const log = Logger('zeed:memstorage', 'error')\n\nexport interface MemStorageOptions {\n objectFromString?: (data: string) => any\n objectToString?: (data: any) => string\n}\n\nexport class MemStorage<T = Json> implements ObjectStorage<T> {\n private store: Record<string, T> = {}\n // private pretty: boolean = false\n // private objectFromString: (data: string) => any\n // private objectToString: (data: any) => string\n\n constructor(_opt: MemStorageOptions = {}) {\n // this.objectToString =\n // opt.objectToString ??\n // ((data: any): string => {\n // return this.pretty\n // ? JSON.stringify(data, null, 2)\n // : JSON.stringify(data)\n // })\n // this.objectFromString =\n // opt.objectFromString ??\n // ((data: string) => {\n // try {\n // return JSON.parse(data)\n // } catch (err) {\n // log.warn(`MemStorage parse error '${err}' in`, data)\n // }\n // })\n }\n\n setItem(key: string, value: T): void {\n // const data = this.objectToString(value)\n this.store[key] = cloneObject(value)\n }\n\n getItem(key: string): T | undefined {\n return cloneObject(this.store[key])\n }\n\n removeItem(key: string): void {\n delete this.store[key]\n }\n\n clear(): void {\n this.store = {}\n }\n\n allKeys(): string[] {\n return Object.keys(this.store)\n }\n}\n","export function noop() {}\n"]}