zeed 0.7.4 → 0.7.8
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.
- package/README.md +18 -9
- package/dist/{chunk-FPXF5SEE.cjs → chunk-6EDDCTHE.cjs} +2 -2
- package/dist/{chunk-FPXF5SEE.cjs.map → chunk-6EDDCTHE.cjs.map} +0 -0
- package/dist/{chunk-JLGMGCTN.js → chunk-7JIUQQ7T.js} +2 -2
- package/dist/chunk-7JIUQQ7T.js.map +7 -0
- package/dist/{chunk-E3C456UK.js → chunk-AH25NZK3.js} +2 -2
- package/dist/{chunk-E3C456UK.js.map → chunk-AH25NZK3.js.map} +0 -0
- package/dist/chunk-U56V5IBU.js +2 -0
- package/dist/chunk-U56V5IBU.js.map +7 -0
- package/dist/{chunk-U7QEEW7O.cjs → chunk-UO5SN75V.cjs} +2 -2
- package/dist/chunk-UO5SN75V.cjs.map +7 -0
- package/dist/chunk-YBYLAMKH.cjs +2 -0
- package/dist/chunk-YBYLAMKH.cjs.map +7 -0
- package/dist/index.all.cjs +1 -1
- package/dist/index.all.d.ts +3 -3
- package/dist/index.all.js +1 -1
- package/dist/index.browser.cjs +1 -1
- package/dist/index.browser.d.ts +2 -2
- package/dist/index.browser.js +1 -1
- package/dist/index.node.cjs +1 -1
- package/dist/index.node.d.ts +2 -2
- package/dist/index.node.js +1 -1
- package/dist/{localstorage-83500157.d.ts → log-colors-5130ebac.d.ts} +14 -14
- package/dist/{path-bf05c236.d.ts → path-4bcf6da3.d.ts} +1 -1
- package/dist/{throttle-faf2ccb5.d.ts → uuid-8d8cb2fe.d.ts} +42 -50
- package/package.json +1 -1
- package/dist/chunk-EUDYJKFY.js +0 -2
- package/dist/chunk-EUDYJKFY.js.map +0 -7
- package/dist/chunk-JIUFROKK.cjs +0 -2
- package/dist/chunk-JIUFROKK.cjs.map +0 -7
- package/dist/chunk-JLGMGCTN.js.map +0 -7
- package/dist/chunk-U7QEEW7O.cjs.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/common/csv.ts", "../src/common/data/basex.ts", "../src/common/data/camelcase.ts", "../src/common/data/json.ts", "../src/common/data/convert.ts", "../src/common/data/orderby.ts", "../src/common/data/sortable.ts", "../src/common/data/utils.ts", "../src/common/data/html.ts", "../src/common/data/url.ts", "../src/common/data/regexp.ts", "../src/common/data/path.ts", "../src/common/data/array.ts", "../src/common/log-util.ts", "../src/common/promise.ts", "../src/common/msg/emitter.ts", "../src/common/uuid.ts", "../src/common/msg/channel.ts", "../src/common/msg/encoder.ts", "../src/common/msg/bridge.ts", "../src/common/msg/messages.ts", "../src/common/mutex.ts", "../src/common/queue.ts", "../src/common/storage/memstorage.ts", "../src/common/throttle.ts"],
|
|
4
|
-
"sourcesContent": ["/*\n csv-express\n Forked and modified by John J Czaplewski <jczaplew@gmail.com>\n Copyright 2011 Seiya Konno <nulltask@gmail.com>\n MIT Licensed\n\n https://github.com/jczaplew/csv-express/blob/master/lib/csv-express.js\n */\n\n// Configurable settings\nconst separator = \",\"\nconst preventCast = false\nconst ignoreNullOrUndefined = true\n\n// Stricter parseFloat to support hexadecimal strings from\n// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/parseFloat#A_stricter_parse_function\nfunction filterFloat(value: string) {\n if (/^([-+])?([0-9]+(\\.[0-9]+)?|Infinity)$/.test(value)) {\n return Number(value)\n }\n return NaN\n}\n\nfunction escape(field: any) {\n if (ignoreNullOrUndefined && field == undefined) {\n return \"\"\n }\n if (preventCast) {\n return '=\"' + String(field).replace(/\"/g, '\"\"') + '\"'\n }\n if (!isNaN(filterFloat(field)) && isFinite(field)) {\n return parseFloat(field)\n }\n return '\"' + String(field).replace(/\"/g, '\"\"') + '\"'\n}\n\nexport function csv(data: any[], headerRow: string[]): string {\n let body = \"\"\n\n // Append the header row to the response if requested\n if (headerRow) {\n body = headerRow.join(separator) + \"\\r\\n\"\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(escape).join(separator) + \"\\r\\n\"\n }\n\n return body\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\nimport { Logger } from \"../log\"\n\nconst log = Logger(\"zeed:basex\")\n\nconst alphabets = {\n \"2\": \"01\",\n \"8\": \"01234567\",\n \"11\": \"0123456789a\",\n \"16\": \"0123456789abcdef\",\n \"32\": \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\",\n // \"32\": \"ybndrfg8ejkmcpqxot1uwisza345h769\", // (z-base-32)\n \"36\": \"0123456789abcdefghijklmnopqrstuvwxyz\",\n \"58\": \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\",\n // \"62\": \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\", // The sort order is not kept!\n \"62\": \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n \"64\": \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",\n \"66\": \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~\",\n}\n\nexport function useBase(alphaOrBase: string | number) {\n let ALPHABET: string\n if (typeof alphaOrBase === \"string\") {\n ALPHABET = alphaOrBase\n } else {\n // @ts-ignore\n ALPHABET = alphabets[alphaOrBase.toString()]\n if (ALPHABET == null) throw new Error(`Unknown base ${alphaOrBase}`)\n }\n\n if (ALPHABET.length >= 255) 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\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) 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(\n source: number[] | Uint8Array | ArrayBuffer,\n padToLength: number = -1\n ): string {\n let data: number[] | Uint8Array\n if (source instanceof ArrayBuffer) {\n data = new Uint8Array(source)\n } else {\n data = source\n }\n\n if (data.length === 0) return \"\"\n\n // Skip & count leading zeroes.\n let length = 0\n let pbegin = 0\n const pend = data.length\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) {\n it2++\n }\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: number = -1): Uint8Array {\n if (typeof source !== \"string\") throw new TypeError(\"Expected String\")\n if (source.length === 0) 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) {\n psz++\n }\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) 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) {\n it4++\n }\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\n// Shortcuts\n\nexport const { encode: encodeBase16, decode: decodeBase16 } = useBase(16)\nexport const { encode: encodeBase32, decode: decodeBase32 } = useBase(32)\nexport const { encode: encodeBase58, decode: decodeBase58 } = useBase(58)\nexport const { encode: encodeBase62, decode: decodeBase62 } = useBase(62)\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 const 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", "// From https://github.com/moll/json-stringify-safe License ISC\n\ntype EntryProcessor = (key: string, value: any) => any\n\nfunction serializer(replacer: EntryProcessor, cycleReplacer?: EntryProcessor) {\n var stack: any[] = [],\n keys: string[] = []\n\n if (cycleReplacer == null)\n cycleReplacer = function (key, value) {\n if (stack[0] === value) return \"[Circular ~]\"\n return (\n \"[Circular ~.\" + keys.slice(0, stack.indexOf(value)).join(\".\") + \"]\"\n )\n }\n\n return function (this: EntryProcessor, key: string, value: any): any {\n if (stack.length > 0) {\n var thisPos = stack.indexOf(this)\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)\n if (~stack.indexOf(value)) value = cycleReplacer?.call(this, key, value)\n } else stack.push(value)\n\n return replacer == null ? value : replacer.call(this, key, value)\n }\n}\n\n/**\n * Similar to JSON.stringify but can handle circular references\n */\nexport function jsonStringify(\n obj: any,\n replacer?: EntryProcessor | null,\n spaces?: string | number | null,\n cycleReplacer?: EntryProcessor\n): string {\n // @ts-ignore\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces)\n}\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 =\n /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*:/\nconst suspectConstructorRx =\n /\"(?: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\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 NaN\n }\n if (_lval === \"infinity\") {\n return Infinity\n }\n if (_lval === \"undefined\") {\n return undefined\n }\n\n if (!JsonSigRx.test(val)) {\n return val\n }\n\n try {\n if (suspectProtoRx.test(val) || suspectConstructorRx.test(val)) {\n return JSON.parse(val, jsonParseTransform)\n }\n return JSON.parse(val)\n } catch (_e) {\n return val\n }\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\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\") 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\") return defaultValue\n return parseInt(value.trim(), 10) ?? defaultValue\n}\n\nexport function stringToFloat(value?: string, defaultValue = 0.0): number {\n if (value == null || typeof value !== \"string\") return defaultValue\n return parseFloat(value.trim()) ?? defaultValue\n}\n\nexport function valueToBoolean(value?: any, defaultValue = false): boolean {\n if (value == null) return defaultValue\n if (typeof value === \"boolean\") return value\n if (typeof value === \"number\") 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) return defaultValue\n if (typeof value === \"boolean\") return value ? 1 : 0\n if (typeof value === \"number\") return Math.floor(value)\n return parseInt(String(value).trim(), 10) ?? defaultValue\n}\n\nexport function valueToFloat(value?: any, defaultValue = 0.0): number {\n if (value == null) return defaultValue\n if (typeof value === \"boolean\") return value ? 1 : 0\n if (typeof value === \"number\") return Math.floor(value)\n return parseFloat(String(value).trim()) ?? defaultValue\n}\n\nexport function valueToString(value?: any, defaultValue = \"\"): string {\n if (value == null) 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\nimport { jsonStringify } from \"./json\"\n\nexport type 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 (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 return pretty ? jsonStringify(obj, null, 2) : jsonStringify(obj)\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", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function parseOrderby(value: string = \"\"): {\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: boolean = 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: boolean = true): number {\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\nexport function sortedOrderby<T>(values: T[], ...orderby: string[]): T[] {\n if (orderby.length > 0) {\n let 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 let sortValues = Array.from(values)\n sortValues.sort((a: any, b: any): number => {\n for (let { field, asc } of orderByList) {\n const result = cmp(a[field], b[field], asc)\n if (result !== 0) 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// 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 Math.random()\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 Math.random()\n )\n}\n\n// The real magic\nexport function moveSortWeight(\n newIndex: number,\n oldIndex: number,\n items: SortableItem[]\n): number {\n let 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\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 * (Math.random() - 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", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\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 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.error(\"Failed to check if empty for\", value, err)\n }\n return true\n}\n\nexport function cloneObject<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj))\n}\n\n// export function timestampToDate(ts: number): Date {\n// return new Date(+ts * 1000)\n// }\n\n// export function dateToTimestamp(date: Date): number {\n// return date.getTime() / 1000\n// }\n", "export const escapeHTML = (s: string): string =>\n s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/'/g, \"'\")\n .replace(/\"/g, \""\")\n\nexport const unescapeHTML = (s: string): string =>\n s\n .replace(/</gi, \"<\")\n .replace(/>/gi, \">\")\n .replace(/"/gi, '\"')\n .replace(/'/gi, \"'\")\n .replace(/&/gi, \"&\")\n", "// https://mathiasbynens.be/demo/url-regex\n// https://gist.github.com/dperini/729294\n\nimport { escapeHTML } from \"./html\"\n\nconst findURL =\n /((?:(?:(?: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\\.)/, \"\")\n}\n", "const rxEscape = /[\\-\\[\\]\\/{}()*+?.^$|]/g\n\nexport function escapeRegExp(value: RegExp | string): string {\n if (!value) return \"\"\n if (value instanceof RegExp) {\n return value.source\n }\n return value.replace(rxEscape, \"\\\\$&\")\n}\n", "// https://github.com/sindresorhus/filenamify/blob/main/filenamify.js\n\nconst MAX_FILENAME_LENGTH = 100\n\nconst reControlChars = /[\\u0000-\\u001F\\u0080-\\u009F]/g // eslint-disable-line no-control-regex\nconst reRelativePath = /^\\.+/\nconst reTrailingPeriods = /\\.+$/\n\nfunction filenameReservedRegex() {\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g\n}\n\nfunction windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i\n}\n\nexport function toValidFilename(string: string) {\n if (typeof string !== \"string\") {\n throw new TypeError(\"Expected a string\")\n }\n\n const replacement = \"_\"\n\n if (\n filenameReservedRegex().test(replacement) &&\n reControlChars.test(replacement)\n ) {\n throw new Error(\n \"Replacement string cannot contain reserved filename characters\"\n )\n }\n\n string = string\n .replace(filenameReservedRegex(), replacement)\n .replace(reControlChars, replacement)\n .replace(reRelativePath, replacement)\n .replace(reTrailingPeriods, \"\")\n\n string = windowsReservedNameRegex().test(string)\n ? string + replacement\n : string\n\n return string.slice(0, MAX_FILENAME_LENGTH)\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\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: (T | T[])[]): T[] {\n return list.reduce(\n (a: any, b: any) => a.concat(Array.isArray(b) ? arrayFlatten(b) : b),\n []\n ) as T[]\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 // log(\"arrayRemoveElement remove\", index, el)\n arr.splice(index, 1)\n }\n // log(\"arrayRemoveElement result\", arr)\n return arr\n }\n // log(\"arrayRemoveElement no array\", arr, el)\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)) 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) 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 arraySorted<T>(\n arr: Iterable<T> | ArrayLike<T>,\n cond: ((a: T, b: T) => number) | undefined = cmp\n): T[] {\n let copy = Array.from(arr)\n copy.sort(cond)\n return copy as T[]\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(() => (Math.random() > 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 // \tconst newIndex = Math.floor(Math.random() * (index + 1));\n // \t[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)) return copy\n }\n return array\n}\n\nexport function arrayRandomElement<T>(array: T[]): T {\n return array[Math.floor(Math.random() * array.length)]\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function getStackLlocationList(stack: string): any[] {\n if (typeof stack !== \"string\") return []\n // console.log(\"stack\", stack)\n return (\n stack\n ?.split(\"\\n\")\n ?.map((rawLine) => {\n let m = rawLine.match(/^\\s+at.*(\\((.*)\\)|file:\\/\\/(.*)$)/)\n if (m) {\n let line = m[3] || m[2]\n if (line.endsWith(\")\")) line = line.slice(0, -1)\n return line\n }\n })\n ?.filter((v) => v != null) || []\n )\n}\n\n/**\n * Get the source code location of the caller\n * https://stackoverflow.com/a/47296370/140927\n *\n * @param level Number of levels to go down the stack trace\n * @param stripCwd Strip the current working directory, only reasonable for Node.js environment\n * @returns\n */\nexport function getSourceLocation(level = 2, stripCwd = true): string {\n let stack = new Error().stack || \"\"\n let line: string | undefined = getStackLlocationList(stack)?.[level]\n if (line && stripCwd) {\n if (line.includes(\"/node_modules/\")) {\n return \"\"\n }\n\n const fileURL = \"file://\"\n if (line.startsWith(fileURL)) {\n return line.substr(fileURL.length)\n }\n\n const cwd = process.cwd()\n if (cwd && line.startsWith(cwd)) {\n return line.substr(cwd.length + 1)\n }\n\n const home = process.env[\"HOME\"]\n if (home && line.startsWith(home)) {\n line = line.substr(home.length + 1)\n }\n }\n return line || \"\"\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { Logger } from \"./log\"\n\nconst { warn } = Logger(\"zeed:promise\")\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\nexport async function immediate(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0))\n}\n\nexport const timeoutReached = Symbol(\"timeout\")\n\ntype 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 let result = await promise\n clearTimeout(timeout)\n if (!done) resolve(result)\n } catch (err) {\n clearTimeout(timeout)\n if (!done) reject(err)\n }\n })\n}\n\nexport const timoutError = new Error(\"Timeout reached\")\n\nexport function isTimeout(value: any): boolean {\n return value === timeoutReached || value === timoutError\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(timoutError)\n }, milliSeconds)\n\n try {\n let result = await promise\n clearTimeout(timeout)\n if (!done) resolve(result)\n } catch (err) {\n clearTimeout(timeout)\n if (!done) 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: number = 1000\n): Promise<any> {\n return new Promise((resolve, reject) => {\n let 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 warn(\"No remove listener method found for\", obj, event)\n }\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 warn(\"No listener method found for\", obj)\n }\n })\n}\n\nexport function isPromise<T>(value: Promise<T> | T): value is Promise<T> {\n return Boolean(\n value &&\n (value instanceof Promise ||\n // @ts-ignore\n typeof value.then === \"function\")\n )\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 isPromise(value) ? value : Promise.resolve(value)\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", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getGlobalContext } from \"../global\"\nimport { Logger } from \"../log\"\nimport { promisify } from \"../promise\"\n\nconst log = Logger(\"zeed:emitter\")\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 type DefaultListener = {\n [k: string]: (...args: any[]) => any\n}\n\nexport class Emitter<L extends ListenerSignature<L> = DefaultListener> {\n subscribers: any = {}\n subscribersOnAny: any[] = []\n\n call: L = new Proxy<L>({} as any, {\n get:\n (target: any, name: any) =>\n (...args: any): any =>\n this.emit(name, ...args),\n })\n\n public async emit<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n let ok = false\n try {\n let subscribers = (this.subscribers[event] || []) as EmitterHandler[]\n // log.debug(\"emit\", this?.constructor?.name, event, ...args, subscribers)\n\n this.subscribersOnAny.forEach((fn) => fn(event, ...args))\n\n if (subscribers.length > 0) {\n let all = subscribers.map((fn) => {\n try {\n return promisify(fn(...args))\n } catch (err) {\n log.warn(\"emit warning:\", err)\n }\n })\n ok = true\n await Promise.all(all)\n }\n } catch (err) {\n log.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 L>(event: U, listener: L[U]) {\n let subscribers = (this.subscribers[event] || []) as EmitterHandler[]\n subscribers.push(listener)\n this.subscribers[event] = subscribers\n return {\n cleanup: () => {\n this.off(event, listener)\n },\n }\n }\n\n public onCall(handlers: Partial<L>) {\n for (const [name, handler] of Object.entries(handlers)) {\n this.on(name as any, handler as any)\n }\n }\n\n public once<U extends keyof L>(event: U, listener: L[U]) {\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 }\n\n public off<U extends keyof L>(event: U, listener: L[U]): this {\n // log(\"off\", key)\n this.subscribers[event] = (this.subscribers[event] || []).filter(\n (f: any) => listener && f !== listener\n )\n return this\n }\n\n public removeAllListeners(event?: keyof L): 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(): Emitter<ZeedGlobalEmitter> {\n let emitter = getGlobalContext().emitter\n if (!emitter) {\n emitter = new Emitter()\n getGlobalContext().emitter = emitter\n }\n return emitter as any\n}\n\n// This can be used as a global messaging port to connect loose\n// parts of your app\nexport const messages = new Emitter()\n\n// For debugging\n\ninterface LazyEvent {\n key: string\n obj: any\n}\n\nexport function lazyListener(\n emitter: any,\n listenerKey?: string\n): (key?: string, skipUnmatched?: boolean) => Promise<any> {\n const name = Math.round(Math.random() * 100)\n\n var events: LazyEvent[] = []\n var lazyResolve: (() => void) | undefined\n\n const incoming = (key: string, obj: any) => {\n let ev = { key, obj }\n // debug(name, \" lazy push\", ev)\n events.push(ev)\n lazyResolve && lazyResolve()\n }\n\n if (listenerKey) {\n if (emitter.on) {\n emitter.on(listenerKey, (obj: any) => {\n incoming(listenerKey, obj)\n })\n } else if (emitter.addEventListener) {\n emitter.addEventListener(listenerKey, (obj: any) => {\n incoming(listenerKey, obj)\n })\n } else {\n log.error(name, \"Cannot listen to key\")\n }\n } else {\n if (emitter.onAny) {\n emitter.onAny((key: string, obj: any) => {\n incoming(key, obj)\n })\n } else {\n log.error(name, \"cannot listen to all for\", emitter)\n }\n }\n\n let on = (key?: string, skipUnmatched: boolean = true): Promise<any> => {\n return new Promise((resolve, reject) => {\n if (!key) {\n key = listenerKey\n if (!key) {\n if (events.length) {\n // no key specified? just take the first one!\n key = events[0].key\n }\n }\n }\n // debug(name, \"lazy resolve on2\", key, skipUnmatched, events)\n lazyResolve = () => {\n // debug(name, \"lazy resolve\", key, listenerKey, events)\n while (events.length > 0) {\n let ev = <LazyEvent>events.shift()\n // debug(name, \" lazy analyze\", ev)\n if (ev.key === key) {\n lazyResolve = undefined\n resolve(ev.obj)\n } else {\n if (skipUnmatched) {\n log.warn(name, `Unhandled event ${key} with value: ${ev.obj}`)\n continue\n }\n reject(`Expected ${key}, but found ${ev.key} with value=${ev.obj}`)\n log.error(name, `Unhandled event ${key} with value: ${ev.obj}`)\n }\n break\n }\n }\n lazyResolve()\n })\n }\n\n return on\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { useBase } from \"./data/basex\"\nimport { getGlobal } from \"./platform\"\nimport { getTimestamp } from \"./time\"\n\nconst { encode: encode62, decode: decode62 } = useBase(62)\nconst { encode: encode32 } = useBase(32)\n\nconst _crypto = getGlobal().crypto || getGlobal()[\"msCrypto\"]\n\nfunction randomUint8Array(length = 16): Uint8Array {\n let rands = new Uint8Array(length)\n if (_crypto && _crypto[\"getRandomValues\"]) {\n _crypto[\"getRandomValues\"](rands)\n } else {\n for (let i = 0; i < length; i++) {\n rands[i] = Math.floor(Math.random() * 256)\n }\n }\n return rands\n}\n\n// function randomDigit(base = 32) {\n// if (_crypto && _crypto['getRandomValues']) {\n// let rands = new Uint8Array(1)\n// _crypto['getRandomValues'](rands)\n// return (rands[0] % base).toString(base)\n// }\n// return ((Math.random() * base) | 0).toString(base)\n// }\n\nexport function uuid(): string {\n return encode62(randomUint8Array(16), 22)\n}\n\nexport function uuidB32(): string {\n return encode32(randomUint8Array(16), 26)\n}\n\nlet _unameCounters: { [key: string]: number } = {}\n\nexport function uname(name: string = \"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\n// https://stackoverflow.com/a/2117523/140927\nconst pattern = \"10000000-1000-4000-8000-100000000000\" // String([1e7] + -1e3 + -4e3 + -8e3 + -1e11)\n\nexport const uuidv4 = () =>\n pattern.replace(/[018]/g, (c: any) =>\n (c ^ (randomUint8Array(1)[0] & (15 >> (c / 4)))).toString(16)\n )\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 var byteArray = new Uint8Array([0, 0, 0, 0, 0, 0])\n const bytes = byteArray.length - 1\n for (var index = 0; index < byteArray.length; index++) {\n var 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 encode62(suidBytes(), 22)\n}\n\nexport function suidDate(id: string): Date {\n return suidBytesDate(decode62(id, 16))\n}\n\nexport function suidBytesDate(id: Uint8Array): Date {\n return new Date(\n ReferenceDateInMS +\n id.slice(0, 6).reduce((acc, byte) => {\n return acc * 256 + byte\n }, 0)\n )\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { Logger } from \"../log\"\nimport { Emitter } from \"./emitter\"\nimport { cloneObject } from \"../data/utils\"\nimport { uuid } from \"../uuid\"\n\nconst log = Logger(\"zeed:channel\")\n\n/** See http://developer.mozilla.org/en-US/docs/Web/API/MessageEvent */\nexport interface ChannelMessageEvent {\n data: ArrayBuffer\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\n connect(): void // optional\n disconnect(): void // optional\n}> {\n abstract isConnected?: boolean\n abstract postMessage(data: ArrayBuffer): void\n close() {}\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 this.other?.emit(\"message\", {\n data: cloneObject(data),\n origin: \"local\",\n lastEventId: uuid(),\n })\n }\n}\n\nexport function fakeWorkerPair(): [LocalChannel, LocalChannel] {\n let w1 = new LocalChannel()\n let w2 = new LocalChannel()\n\n w1.other = w2\n w2.other = w1\n\n return [w1, w2]\n}\n", "import { Json } from \"../types\"\n\nexport interface Encoder {\n encode(data: Json): ArrayBuffer\n decode(data: ArrayBuffer): Json\n}\n\nexport class JsonEncoder implements Encoder {\n encode(data: Json): ArrayBuffer {\n return JSON.stringify(data) as any\n }\n\n decode(data: ArrayBuffer): Json {\n return JSON.parse(data as any) as any\n }\n}\n", "import { promisify, tryTimeout } from \"../promise\"\nimport { uname, uuid } from \"../uuid\"\nimport { Channel } from \"./channel\"\nimport { Logger } from \"../log\"\nimport { JsonEncoder } from \"./encoder\"\n\ninterface BridgeOptions {\n timeout?: number\n}\n\n/** @deprecated */\nexport function useBridge<L extends object>(\n info: { channel: Channel; encoder?: any },\n methods?: L\n) {\n const { channel, encoder = new JsonEncoder() } = info\n\n const log = Logger(`bridge:${uname(!!methods ? \"server\" : \"client\")}`)\n\n if (methods) {\n info.channel.on(\"message\", async (msg: any) => {\n const { name, args, id } = encoder.decode(msg.data)\n if (name) {\n log(`name ${name} id ${id}`)\n // @ts-ignore\n let result = await promisify(methods[name](...args))\n log(`result ${result}`)\n if (id) {\n info.channel.postMessage(encoder.encode({ id, result }))\n }\n }\n })\n }\n\n let waitingForResponse: any = {}\n\n info.channel.on(\"message\", async (msg: any) => {\n const { name, args, id, result } = encoder.decode(msg.data)\n if (!name && id) {\n log(`id ${id} result ${result}`)\n const resolve = waitingForResponse[id]\n if (resolve) {\n delete waitingForResponse[id]\n resolve(result)\n }\n }\n })\n\n // The async proxy, waiting for a response\n const createPromiseProxy = (opt: BridgeOptions): L => {\n const { timeout = 5000 } = opt\n return new Proxy<L>({} as any, {\n get: (target: any, name: any) => {\n return (...args: any): any => {\n if (!methods) {\n const id = uuid()\n info.channel.postMessage(encoder.encode({ name, args, id }))\n return tryTimeout(\n new Promise((resolve) => (waitingForResponse[id] = resolve)),\n timeout\n )\n }\n }\n },\n })\n }\n\n // The regular proxy without responding, just send\n return new Proxy<\n L & {\n promise: L\n options(opt: BridgeOptions): L\n }\n >(\n {\n promise: createPromiseProxy({}),\n options: (opt: BridgeOptions): L => createPromiseProxy(opt),\n } as any,\n {\n get: (target: any, name: any) => {\n if (name in target) return target[name]\n return (...args: any): any => {\n if (!methods) {\n info.channel.postMessage(encoder.encode({ name, args }))\n }\n }\n },\n }\n )\n}\n", "import { valueToString } from \"../data/convert\"\nimport { Logger } from \"../log\"\nimport { tryTimeout, promisify } from \"../promise\"\nimport { Json } from \"../types\"\nimport { uname, uuid } from \"../uuid\"\nimport { Channel } from \"./channel\"\nimport { Encoder, JsonEncoder } from \"./encoder\"\n\nexport type MessageAction = {\n name: string\n id: string\n args?: Json[]\n}\n\nexport type MessageResult = {\n id: string\n result?: Json\n error?: { stack?: string; name: string; message: string }\n}\n\nexport type Message = MessageAction | MessageResult\n\nexport type MessagesOptions = {\n timeout?: number\n}\n\nexport function useMessages<L extends object>(\n info: {\n channel: Channel\n encoder?: Encoder\n retryAfter?: number\n },\n methods?: L\n) {\n const log = Logger(`messages:${uname(!!methods ? \"server\" : \"client\")}`)\n\n const { channel, encoder = new JsonEncoder(), retryAfter = 1000 } = info\n\n let queue: Message[] = []\n let queueRetryTimer: any\n\n const postNext = () => {\n clearTimeout(queueRetryTimer)\n if (channel.isConnected) {\n while (queue.length) {\n let message = queue[0]\n try {\n channel.postMessage(encoder.encode(message))\n queue.shift() // remove from queue when done\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 channel.on(\"connect\", postNext)\n\n const postMessage = (message: Message) => {\n log(\"enqueue postMessage\", message)\n queue.push(message)\n postNext()\n }\n\n // Server side\n\n if (methods) {\n channel.on(\"message\", async (msg: any) => {\n const { name, args, id } = encoder.decode(msg.data) as any\n if (name) {\n log(`name ${name} id ${id}`)\n try {\n // @ts-ignore\n let result = await promisify(methods[name](...args))\n log(`result ${result}`)\n if (id) {\n postMessage({ id, result })\n }\n } catch (error) {\n log(\"execution error\", error)\n let err =\n error instanceof Error ? error : new Error(valueToString(error))\n postMessage({\n id,\n error: {\n message: err.message,\n stack: err.stack,\n name: err.name,\n },\n })\n }\n }\n })\n }\n\n let waitingForResponse: any = {}\n\n // Client side\n\n channel.on(\"message\", async (msg: any) => {\n const { name, args, id, result, error } = encoder.decode(msg.data) as any\n if (!name && id) {\n log(`response for id=${id}: result=${result}, error=${error}`)\n const [resolve, reject] = waitingForResponse[id]\n if (resolve && reject) {\n delete waitingForResponse[id]\n if (error) {\n let err = new Error(error.message)\n err.stack = error.stack\n err.name = error.name\n log(\"reject\", err)\n reject(err)\n } else {\n log(\"resolve\", result)\n resolve(result)\n }\n }\n }\n })\n\n // The async proxy, waiting for a response\n const createPromiseProxy = (opt: MessagesOptions): L => {\n const { timeout = 5000 } = opt\n return new Proxy<L>({} as any, {\n get: (target: any, name: any) => {\n if (name in target) return target[name]\n return (...args: any): any => {\n if (!methods) {\n const id = uuid()\n postMessage({ name, args, id })\n return tryTimeout(\n new Promise(\n (resolve, reject) =>\n (waitingForResponse[id] = [resolve, reject])\n ),\n timeout\n )\n }\n }\n },\n })\n }\n\n // The regular proxy without responding, just send\n return createPromiseProxy({})\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport type Mutex = (fn: () => void, elseFn?: () => void) => boolean\n\nexport function createMutex(): 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 } finally {\n token = true\n }\n } else if (elseFn !== undefined) {\n elseFn()\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\n// Can learn from here https://github.com/sindresorhus/p-queue\n\nimport { LoggerInterface, LogLevel } from \"../common/log-base\"\nimport { Logger } from \"../common/log\"\nimport { uname } from \"./uuid\"\n\nconst log = Logger(\"zeed:queue\")\n\ntype QueueTaskResolver = any\ntype QueueTask<T = any> = () => Promise<T>\n\ninterface QueueTaskInfo {\n name: string\n task: QueueTask\n resolve: QueueTaskResolver\n}\n\n/** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */\nexport class SerialQueue {\n private queue: QueueTaskInfo[] = []\n\n private isPaused: boolean = false\n private waitToFinish: QueueTaskResolver[] = []\n\n private currentTask?: Promise<any>\n\n private log: LoggerInterface\n\n name: string\n\n constructor(opt: { name?: string; logLevel?: LogLevel } = {}) {\n const { name = uname(\"queue\"), logLevel } = opt\n\n this.name = name\n this.log = Logger(`zeed:queue:${name}`)\n this.log.level = logLevel ?? LogLevel.off\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.isPaused) {\n this.log(`performNext => skip while is paused`)\n return\n }\n\n while (this.currentTask == null && !this.isPaused) {\n let info = this.queue.shift()\n this.log(`performNext => ${info?.name}`)\n\n if (info == null) {\n break\n }\n\n const { name, task, resolve } = info\n this.currentTask = task()\n let result = undefined\n try {\n this.log.info(`start task ${name}`)\n result = await this.currentTask\n this.log(`finished task ${name} with result =`, result)\n } catch (err) {\n log.warn(\"Error performing task\", err)\n }\n\n resolve(result)\n this.currentTask = undefined\n }\n\n while (this.waitToFinish.length > 0) {\n this.waitToFinish.shift()()\n }\n }\n\n /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */\n async enqueue<T>(\n task: QueueTask<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 this.log(`enqueue ${name}`)\n return new Promise((resolve) => {\n this.queue.push({\n name,\n task,\n resolve,\n })\n this.performNext()\n })\n }\n\n /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */\n async enqueueReentrant<T>(\n task: QueueTask<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 let 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.isPaused = true\n await this.wait()\n }\n\n /** Resume paused queue. */\n resume() {\n this.log(`resume`)\n this.isPaused = false\n this.performNext()\n }\n\n /** Wait for all tasks to finish */\n async wait() {\n this.log(`wait`)\n if (\n this.currentTask == null &&\n (this.queue.length === 0 || this.isPaused)\n ) {\n return\n }\n return new Promise((resolve) => {\n this.waitToFinish.push(resolve)\n })\n }\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { Json } from \"../types\"\nimport { Logger } from \"../log\"\nimport { ObjectStorage } from \"../types\"\n\nconst log = Logger(\"zeed:memstorage\")\n\nexport interface MemStorageOptions {\n objectFromString?: (data: string) => any\n objectToString?: (data: any) => string\n}\n\nexport class MemStorage implements ObjectStorage {\n private store: { [key: string]: string } = {}\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\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: Json): void {\n const data = this.objectToString(value)\n this.store[key] = data\n }\n\n getItem(key: string): Json | undefined {\n if (this.store.hasOwnProperty(key)) {\n let value = this.store[key]\n return this.objectFromString(value)\n }\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", "// 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\ninterface DebounceOptions {\n // A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n delay?: number\n\n // Optional, defaults to false. If noTrailing is true, callback will only execute every `delay` milliseconds while the\n // throttled-function is being called. If noTrailing is false or unspecified, callback will be executed one final time\n // after the last throttled-function call. (After the throttled-function has not been called for `delay` milliseconds,\n // the internal counter is reset).\n noTrailing?: boolean\n\n // If `debounceMode` is true (at begin), schedule `clear` to execute after `delay` ms. If `debounceMode` is false (at end),\n // schedule `callback` to execute after `delay` ms.\n debounceMode?: boolean\n}\n\ntype DebounceFunction = Function & { cancel: () => void }\n\n/*\n * Throttle execution of a function. Especially useful for rate limiting\n * execution of handlers on events like resize and scroll.\n */\nexport function throttle(\n callback: Function,\n opt: DebounceOptions = {}\n): DebounceFunction {\n /*\n * After wrapper has stopped being called, this timeout ensures that\n * `callback` is executed at the proper times in `throttle` and `end`\n * debounce modes.\n */\n const { delay = 100, noTrailing = false, debounceMode = false } = opt\n let timeoutID: any\n let cancelled: boolean = false\n\n // Keep track of the last time `callback` was executed.\n let lastExec = 0\n\n // Function to clear existing timeout\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID)\n }\n }\n\n // Function to cancel next exec\n function cancel() {\n clearExistingTimeout()\n cancelled = true\n }\n\n /*\n * The `wrapper` function encapsulates all of the throttling / debouncing\n * functionality and when executed will limit the rate at which `callback`\n * is executed.\n */\n function wrapper(this: any, ...arguments_: any[]) {\n let self = this\n let elapsed = Date.now() - lastExec\n\n if (cancelled) {\n return\n }\n\n // Execute `callback` and update the `lastExec` timestamp.\n function exec() {\n lastExec = Date.now()\n callback.apply(self, arguments_)\n }\n\n /*\n * If `debounceMode` is true (at begin) this is used to clear the flag\n * to allow future `callback` executions.\n */\n function clear() {\n timeoutID = undefined\n }\n\n if (debounceMode && !timeoutID) {\n /*\n * Since `wrapper` is being called for the first time and\n * `debounceMode` is true (at begin), execute `callback`.\n */\n exec()\n }\n\n clearExistingTimeout()\n\n if (debounceMode === undefined && elapsed > delay) {\n /*\n * In throttle mode, if `delay` time has been exceeded, execute\n * `callback`.\n */\n exec()\n } else if (noTrailing !== true) {\n /*\n * In trailing throttle mode, since `delay` time has not been\n * exceeded, schedule `callback` to execute `delay` ms after most\n * recent execution.\n *\n * If `debounceMode` is true (at begin), schedule `clear` to execute\n * after `delay` ms.\n *\n * If `debounceMode` is false (at end), schedule `callback` to\n * execute after `delay` ms.\n */\n timeoutID = setTimeout(\n debounceMode ? clear : exec,\n debounceMode === undefined ? delay - elapsed : delay\n )\n }\n }\n\n wrapper.cancel = cancel\n\n // Return the wrapper function.\n return wrapper\n}\n\n/*\n * Debounce execution of a function. Debouncing, unlike throttling,\n * guarantees that a function is only executed a single time, either at the\n * very beginning of a series of calls, or at the very end.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @param {boolean} [atBegin] - Optional, defaults to false. If atBegin is false or unspecified, callback will only be executed `delay` milliseconds\n * after the last debounced-function call. If atBegin is true, callback will be executed only at the first debounced-function call.\n * (After the throttled-function has not been called for `delay` milliseconds, the internal counter is reset).\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n * to `callback` when the debounced-function is executed.\n *\n * @returns {Function} A new, debounced function.\n */\n\nexport function debounce(\n callback: Function,\n opt: DebounceOptions = {}\n): DebounceFunction {\n opt.debounceMode = true\n return throttle(callback, opt)\n // return callback === undefined\n // ? throttle(delay, atBegin, false)\n // : throttle(delay, callback, atBegin !== false)\n}\n\nexport function throttleAnimationFrame(callback: Function): DebounceFunction {\n let requestId: any\n let lastArgs: any\n\n const later = (context: any) => () => {\n requestId = undefined\n callback.apply(context, lastArgs)\n }\n\n const throttled = function (this: any, ...args: any) {\n lastArgs = args\n if (requestId == null) {\n requestId = requestAnimationFrame(later(this))\n }\n }\n\n throttled.cancel = () => {\n cancelAnimationFrame(requestId)\n requestId = undefined\n }\n\n return throttled\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/common/csv.ts", "../src/common/data/basex.ts", "../src/common/data/camelcase.ts", "../src/common/data/json.ts", "../src/common/data/convert.ts", "../src/common/data/orderby.ts", "../src/common/data/sortable.ts", "../src/common/data/utils.ts", "../src/common/data/html.ts", "../src/common/data/url.ts", "../src/common/data/regexp.ts", "../src/common/data/path.ts", "../src/common/data/array.ts", "../src/common/log-util.ts", "../src/common/promise.ts", "../src/common/msg/emitter.ts", "../src/common/uuid.ts", "../src/common/msg/channel.ts", "../src/common/msg/encoder.ts", "../src/common/msg/bridge.ts", "../src/common/msg/messages.ts", "../src/common/mutex.ts", "../src/common/queue.ts", "../src/common/storage/memstorage.ts", "../src/common/throttle.ts"],
|
|
4
|
-
"sourcesContent": ["/*\n csv-express\n Forked and modified by John J Czaplewski <jczaplew@gmail.com>\n Copyright 2011 Seiya Konno <nulltask@gmail.com>\n MIT Licensed\n\n https://github.com/jczaplew/csv-express/blob/master/lib/csv-express.js\n */\n\n// Configurable settings\nconst separator = \",\"\nconst preventCast = false\nconst ignoreNullOrUndefined = true\n\n// Stricter parseFloat to support hexadecimal strings from\n// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/parseFloat#A_stricter_parse_function\nfunction filterFloat(value: string) {\n if (/^([-+])?([0-9]+(\\.[0-9]+)?|Infinity)$/.test(value)) {\n return Number(value)\n }\n return NaN\n}\n\nfunction escape(field: any) {\n if (ignoreNullOrUndefined && field == undefined) {\n return \"\"\n }\n if (preventCast) {\n return '=\"' + String(field).replace(/\"/g, '\"\"') + '\"'\n }\n if (!isNaN(filterFloat(field)) && isFinite(field)) {\n return parseFloat(field)\n }\n return '\"' + String(field).replace(/\"/g, '\"\"') + '\"'\n}\n\nexport function csv(data: any[], headerRow: string[]): string {\n let body = \"\"\n\n // Append the header row to the response if requested\n if (headerRow) {\n body = headerRow.join(separator) + \"\\r\\n\"\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(escape).join(separator) + \"\\r\\n\"\n }\n\n return body\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\nimport { Logger } from \"../log\"\n\nconst log = Logger(\"zeed:basex\")\n\nconst alphabets = {\n \"2\": \"01\",\n \"8\": \"01234567\",\n \"11\": \"0123456789a\",\n \"16\": \"0123456789abcdef\",\n \"32\": \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\",\n // \"32\": \"ybndrfg8ejkmcpqxot1uwisza345h769\", // (z-base-32)\n \"36\": \"0123456789abcdefghijklmnopqrstuvwxyz\",\n \"58\": \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\",\n // \"62\": \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\", // The sort order is not kept!\n \"62\": \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n \"64\": \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",\n \"66\": \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~\",\n}\n\nexport function useBase(alphaOrBase: string | number) {\n let ALPHABET: string\n if (typeof alphaOrBase === \"string\") {\n ALPHABET = alphaOrBase\n } else {\n // @ts-ignore\n ALPHABET = alphabets[alphaOrBase.toString()]\n if (ALPHABET == null) throw new Error(`Unknown base ${alphaOrBase}`)\n }\n\n if (ALPHABET.length >= 255) 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\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) 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(\n source: number[] | Uint8Array | ArrayBuffer,\n padToLength: number = -1\n ): string {\n let data: number[] | Uint8Array\n if (source instanceof ArrayBuffer) {\n data = new Uint8Array(source)\n } else {\n data = source\n }\n\n if (data.length === 0) return \"\"\n\n // Skip & count leading zeroes.\n let length = 0\n let pbegin = 0\n const pend = data.length\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) {\n it2++\n }\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: number = -1): Uint8Array {\n if (typeof source !== \"string\") throw new TypeError(\"Expected String\")\n if (source.length === 0) 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) {\n psz++\n }\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) 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) {\n it4++\n }\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\n// Shortcuts\n\nexport const { encode: encodeBase16, decode: decodeBase16 } = useBase(16)\nexport const { encode: encodeBase32, decode: decodeBase32 } = useBase(32)\nexport const { encode: encodeBase58, decode: decodeBase58 } = useBase(58)\nexport const { encode: encodeBase62, decode: decodeBase62 } = useBase(62)\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 const 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", "// From https://github.com/moll/json-stringify-safe License ISC\n\ntype EntryProcessor = (key: string, value: any) => any\n\nfunction serializer(replacer: EntryProcessor, cycleReplacer?: EntryProcessor) {\n var stack: any[] = [],\n keys: string[] = []\n\n if (cycleReplacer == null)\n cycleReplacer = function (key, value) {\n if (stack[0] === value) return \"[Circular ~]\"\n return (\n \"[Circular ~.\" + keys.slice(0, stack.indexOf(value)).join(\".\") + \"]\"\n )\n }\n\n return function (this: EntryProcessor, key: string, value: any): any {\n if (stack.length > 0) {\n var thisPos = stack.indexOf(this)\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)\n if (~stack.indexOf(value)) value = cycleReplacer?.call(this, key, value)\n } else stack.push(value)\n\n return replacer == null ? value : replacer.call(this, key, value)\n }\n}\n\n/**\n * Similar to JSON.stringify but can handle circular references\n */\nexport function jsonStringify(\n obj: any,\n replacer?: EntryProcessor | null,\n spaces?: string | number | null,\n cycleReplacer?: EntryProcessor\n): string {\n // @ts-ignore\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces)\n}\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 =\n /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*:/\nconst suspectConstructorRx =\n /\"(?: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\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 NaN\n }\n if (_lval === \"infinity\") {\n return Infinity\n }\n if (_lval === \"undefined\") {\n return undefined\n }\n\n if (!JsonSigRx.test(val)) {\n return val\n }\n\n try {\n if (suspectProtoRx.test(val) || suspectConstructorRx.test(val)) {\n return JSON.parse(val, jsonParseTransform)\n }\n return JSON.parse(val)\n } catch (_e) {\n return val\n }\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\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\") 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\") return defaultValue\n return parseInt(value.trim(), 10) ?? defaultValue\n}\n\nexport function stringToFloat(value?: string, defaultValue = 0.0): number {\n if (value == null || typeof value !== \"string\") return defaultValue\n return parseFloat(value.trim()) ?? defaultValue\n}\n\nexport function valueToBoolean(value?: any, defaultValue = false): boolean {\n if (value == null) return defaultValue\n if (typeof value === \"boolean\") return value\n if (typeof value === \"number\") 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) return defaultValue\n if (typeof value === \"boolean\") return value ? 1 : 0\n if (typeof value === \"number\") return Math.floor(value)\n return parseInt(String(value).trim(), 10) ?? defaultValue\n}\n\nexport function valueToFloat(value?: any, defaultValue = 0.0): number {\n if (value == null) return defaultValue\n if (typeof value === \"boolean\") return value ? 1 : 0\n if (typeof value === \"number\") return Math.floor(value)\n return parseFloat(String(value).trim()) ?? defaultValue\n}\n\nexport function valueToString(value?: any, defaultValue = \"\"): string {\n if (value == null) 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\nimport { jsonStringify } from \"./json\"\n\nexport type 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 (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 return pretty ? jsonStringify(obj, null, 2) : jsonStringify(obj)\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", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function parseOrderby(value: string = \"\"): {\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: boolean = 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: boolean = true): number {\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\nexport function sortedOrderby<T>(values: T[], ...orderby: string[]): T[] {\n if (orderby.length > 0) {\n let 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 let sortValues = Array.from(values)\n sortValues.sort((a: any, b: any): number => {\n for (let { field, asc } of orderByList) {\n const result = cmp(a[field], b[field], asc)\n if (result !== 0) 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// 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 Math.random()\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 Math.random()\n )\n}\n\n// The real magic\nexport function moveSortWeight(\n newIndex: number,\n oldIndex: number,\n items: SortableItem[]\n): number {\n let 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\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 * (Math.random() - 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", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\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 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.error(\"Failed to check if empty for\", value, err)\n }\n return true\n}\n\nexport function cloneObject<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj))\n}\n\n// export function timestampToDate(ts: number): Date {\n// return new Date(+ts * 1000)\n// }\n\n// export function dateToTimestamp(date: Date): number {\n// return date.getTime() / 1000\n// }\n", "export const escapeHTML = (s: string): string =>\n s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/'/g, \"'\")\n .replace(/\"/g, \""\")\n\nexport const unescapeHTML = (s: string): string =>\n s\n .replace(/</gi, \"<\")\n .replace(/>/gi, \">\")\n .replace(/"/gi, '\"')\n .replace(/'/gi, \"'\")\n .replace(/&/gi, \"&\")\n", "// https://mathiasbynens.be/demo/url-regex\n// https://gist.github.com/dperini/729294\n\nimport { escapeHTML } from \"./html\"\n\nconst findURL =\n /((?:(?:(?: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\\.)/, \"\")\n}\n", "const rxEscape = /[\\-\\[\\]\\/{}()*+?.^$|]/g\n\nexport function escapeRegExp(value: RegExp | string): string {\n if (!value) return \"\"\n if (value instanceof RegExp) {\n return value.source\n }\n return value.replace(rxEscape, \"\\\\$&\")\n}\n", "// https://github.com/sindresorhus/filenamify/blob/main/filenamify.js\n\nconst MAX_FILENAME_LENGTH = 100\n\nconst reControlChars = /[\\u0000-\\u001F\\u0080-\\u009F]/g // eslint-disable-line no-control-regex\nconst reRelativePath = /^\\.+/\nconst reTrailingPeriods = /\\.+$/\n\nfunction filenameReservedRegex() {\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g\n}\n\nfunction windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i\n}\n\nexport function toValidFilename(string: string) {\n if (typeof string !== \"string\") {\n throw new TypeError(\"Expected a string\")\n }\n\n const replacement = \"_\"\n\n if (\n filenameReservedRegex().test(replacement) &&\n reControlChars.test(replacement)\n ) {\n throw new Error(\n \"Replacement string cannot contain reserved filename characters\"\n )\n }\n\n string = string\n .replace(filenameReservedRegex(), replacement)\n .replace(reControlChars, replacement)\n .replace(reRelativePath, replacement)\n .replace(reTrailingPeriods, \"\")\n\n string = windowsReservedNameRegex().test(string)\n ? string + replacement\n : string\n\n return string.slice(0, MAX_FILENAME_LENGTH)\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\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: (T | T[])[]): T[] {\n return list.reduce(\n (a: any, b: any) => a.concat(Array.isArray(b) ? arrayFlatten(b) : b),\n []\n ) as T[]\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 // log(\"arrayRemoveElement remove\", index, el)\n arr.splice(index, 1)\n }\n // log(\"arrayRemoveElement result\", arr)\n return arr\n }\n // log(\"arrayRemoveElement no array\", arr, el)\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)) 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) 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 arraySorted<T>(\n arr: Iterable<T> | ArrayLike<T>,\n cond: ((a: T, b: T) => number) | undefined = cmp\n): T[] {\n let copy = Array.from(arr)\n copy.sort(cond)\n return copy as T[]\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(() => (Math.random() > 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 // \tconst newIndex = Math.floor(Math.random() * (index + 1));\n // \t[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)) return copy\n }\n return array\n}\n\nexport function arrayRandomElement<T>(array: T[]): T {\n return array[Math.floor(Math.random() * array.length)]\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function getStackLlocationList(stack: string): any[] {\n if (typeof stack !== \"string\") return []\n // console.log(\"stack\", stack)\n return (\n stack\n ?.split(\"\\n\")\n ?.map((rawLine) => {\n let m = rawLine.match(/^\\s+at.*(\\((.*)\\)|file:\\/\\/(.*)$)/)\n if (m) {\n let line = m[3] || m[2]\n if (line.endsWith(\")\")) line = line.slice(0, -1)\n return line\n }\n })\n ?.filter((v) => v != null) || []\n )\n}\n\n/**\n * Get the source code location of the caller\n * https://stackoverflow.com/a/47296370/140927\n *\n * @param level Number of levels to go down the stack trace\n * @param stripCwd Strip the current working directory, only reasonable for Node.js environment\n * @returns\n */\nexport function getSourceLocation(level = 2, stripCwd = true): string {\n let stack = new Error().stack || \"\"\n let line: string | undefined = getStackLlocationList(stack)?.[level]\n if (line && stripCwd) {\n if (line.includes(\"/node_modules/\")) {\n return \"\"\n }\n\n const fileURL = \"file://\"\n if (line.startsWith(fileURL)) {\n return line.substr(fileURL.length)\n }\n\n const cwd = process.cwd()\n if (cwd && line.startsWith(cwd)) {\n return line.substr(cwd.length + 1)\n }\n\n const home = process.env[\"HOME\"]\n if (home && line.startsWith(home)) {\n line = line.substr(home.length + 1)\n }\n }\n return line || \"\"\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { Logger } from \"./log\"\n\nconst { warn } = Logger(\"zeed:promise\")\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\nexport async function immediate(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0))\n}\n\nexport const timeoutReached = Symbol(\"timeout\")\n\ntype 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 let result = await promise\n clearTimeout(timeout)\n if (!done) resolve(result)\n } catch (err) {\n clearTimeout(timeout)\n if (!done) reject(err)\n }\n })\n}\n\nexport const timoutError = new Error(\"Timeout reached\")\n\nexport function isTimeout(value: any): boolean {\n return value === timeoutReached || value === timoutError\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(timoutError)\n }, milliSeconds)\n\n try {\n let result = await promise\n clearTimeout(timeout)\n if (!done) resolve(result)\n } catch (err) {\n clearTimeout(timeout)\n if (!done) 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: number = 1000\n): Promise<any> {\n return new Promise((resolve, reject) => {\n let 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 warn(\"No remove listener method found for\", obj, event)\n }\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 warn(\"No listener method found for\", obj)\n }\n })\n}\n\nexport function isPromise<T>(value: Promise<T> | T): value is Promise<T> {\n return Boolean(\n value &&\n (value instanceof Promise ||\n // @ts-ignore\n typeof value.then === \"function\")\n )\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 isPromise(value) ? value : Promise.resolve(value)\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", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getGlobalContext } from \"../global\"\nimport { Logger } from \"../log\"\nimport { promisify } from \"../promise\"\n\nconst log = Logger(\"zeed:emitter\")\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 type DefaultListener = {\n [k: string]: (...args: any[]) => any\n}\n\nexport class Emitter<L extends ListenerSignature<L> = DefaultListener> {\n subscribers: any = {}\n subscribersOnAny: any[] = []\n\n call: L = new Proxy<L>({} as any, {\n get:\n (target: any, name: any) =>\n (...args: any): any =>\n this.emit(name, ...args),\n })\n\n public async emit<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n let ok = false\n try {\n let subscribers = (this.subscribers[event] || []) as EmitterHandler[]\n // log.debug(\"emit\", this?.constructor?.name, event, ...args, subscribers)\n\n this.subscribersOnAny.forEach((fn) => fn(event, ...args))\n\n if (subscribers.length > 0) {\n let all = subscribers.map((fn) => {\n try {\n return promisify(fn(...args))\n } catch (err) {\n log.warn(\"emit warning:\", err)\n }\n })\n ok = true\n await Promise.all(all)\n }\n } catch (err) {\n log.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 L>(event: U, listener: L[U]) {\n let subscribers = (this.subscribers[event] || []) as EmitterHandler[]\n subscribers.push(listener)\n this.subscribers[event] = subscribers\n return {\n cleanup: () => {\n this.off(event, listener)\n },\n }\n }\n\n public onCall(handlers: Partial<L>) {\n for (const [name, handler] of Object.entries(handlers)) {\n this.on(name as any, handler as any)\n }\n }\n\n public once<U extends keyof L>(event: U, listener: L[U]) {\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 }\n\n public off<U extends keyof L>(event: U, listener: L[U]): this {\n // log(\"off\", key)\n this.subscribers[event] = (this.subscribers[event] || []).filter(\n (f: any) => listener && f !== listener\n )\n return this\n }\n\n public removeAllListeners(event?: keyof L): 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(): Emitter<ZeedGlobalEmitter> {\n let emitter = getGlobalContext().emitter\n if (!emitter) {\n emitter = new Emitter()\n getGlobalContext().emitter = emitter\n }\n return emitter as any\n}\n\n// This can be used as a global messaging port to connect loose\n// parts of your app\nexport const messages = new Emitter()\n\n// For debugging\n\ninterface LazyEvent {\n key: string\n obj: any\n}\n\nexport function lazyListener(\n emitter: any,\n listenerKey?: string\n): (key?: string, skipUnmatched?: boolean) => Promise<any> {\n const name = Math.round(Math.random() * 100)\n\n var events: LazyEvent[] = []\n var lazyResolve: (() => void) | undefined\n\n const incoming = (key: string, obj: any) => {\n let ev = { key, obj }\n // debug(name, \" lazy push\", ev)\n events.push(ev)\n lazyResolve && lazyResolve()\n }\n\n if (listenerKey) {\n if (emitter.on) {\n emitter.on(listenerKey, (obj: any) => {\n incoming(listenerKey, obj)\n })\n } else if (emitter.addEventListener) {\n emitter.addEventListener(listenerKey, (obj: any) => {\n incoming(listenerKey, obj)\n })\n } else {\n log.error(name, \"Cannot listen to key\")\n }\n } else {\n if (emitter.onAny) {\n emitter.onAny((key: string, obj: any) => {\n incoming(key, obj)\n })\n } else {\n log.error(name, \"cannot listen to all for\", emitter)\n }\n }\n\n let on = (key?: string, skipUnmatched: boolean = true): Promise<any> => {\n return new Promise((resolve, reject) => {\n if (!key) {\n key = listenerKey\n if (!key) {\n if (events.length) {\n // no key specified? just take the first one!\n key = events[0].key\n }\n }\n }\n // debug(name, \"lazy resolve on2\", key, skipUnmatched, events)\n lazyResolve = () => {\n // debug(name, \"lazy resolve\", key, listenerKey, events)\n while (events.length > 0) {\n let ev = <LazyEvent>events.shift()\n // debug(name, \" lazy analyze\", ev)\n if (ev.key === key) {\n lazyResolve = undefined\n resolve(ev.obj)\n } else {\n if (skipUnmatched) {\n log.warn(name, `Unhandled event ${key} with value: ${ev.obj}`)\n continue\n }\n reject(`Expected ${key}, but found ${ev.key} with value=${ev.obj}`)\n log.error(name, `Unhandled event ${key} with value: ${ev.obj}`)\n }\n break\n }\n }\n lazyResolve()\n })\n }\n\n return on\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { useBase } from \"./data/basex\"\nimport { getGlobal } from \"./platform\"\nimport { getTimestamp } from \"./time\"\n\nconst { encode: encode62, decode: decode62 } = useBase(62)\nconst { encode: encode32 } = useBase(32)\n\nconst _crypto = getGlobal().crypto || getGlobal()[\"msCrypto\"]\n\nfunction randomUint8Array(length = 16): Uint8Array {\n let rands = new Uint8Array(length)\n if (_crypto && _crypto[\"getRandomValues\"]) {\n _crypto[\"getRandomValues\"](rands)\n } else {\n for (let i = 0; i < length; i++) {\n rands[i] = Math.floor(Math.random() * 256)\n }\n }\n return rands\n}\n\n// function randomDigit(base = 32) {\n// if (_crypto && _crypto['getRandomValues']) {\n// let rands = new Uint8Array(1)\n// _crypto['getRandomValues'](rands)\n// return (rands[0] % base).toString(base)\n// }\n// return ((Math.random() * base) | 0).toString(base)\n// }\n\nexport function uuid(): string {\n return encode62(randomUint8Array(16), 22)\n}\n\nexport function uuidB32(): string {\n return encode32(randomUint8Array(16), 26)\n}\n\nlet _unameCounters: { [key: string]: number } = {}\n\nexport function uname(name: string = \"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\n// https://stackoverflow.com/a/2117523/140927\nconst pattern = \"10000000-1000-4000-8000-100000000000\" // String([1e7] + -1e3 + -4e3 + -8e3 + -1e11)\n\nexport const uuidv4 = () =>\n pattern.replace(/[018]/g, (c: any) =>\n (c ^ (randomUint8Array(1)[0] & (15 >> (c / 4)))).toString(16)\n )\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 var byteArray = new Uint8Array([0, 0, 0, 0, 0, 0])\n const bytes = byteArray.length - 1\n for (var index = 0; index < byteArray.length; index++) {\n var 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 encode62(suidBytes(), 22)\n}\n\nexport function suidDate(id: string): Date {\n return suidBytesDate(decode62(id, 16))\n}\n\nexport function suidBytesDate(id: Uint8Array): Date {\n return new Date(\n ReferenceDateInMS +\n id.slice(0, 6).reduce((acc, byte) => {\n return acc * 256 + byte\n }, 0)\n )\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { Logger } from \"../log\"\nimport { Emitter } from \"./emitter\"\nimport { cloneObject } from \"../data/utils\"\nimport { uuid } from \"../uuid\"\n\nconst log = Logger(\"zeed:channel\")\n\n/** See http://developer.mozilla.org/en-US/docs/Web/API/MessageEvent */\nexport interface ChannelMessageEvent {\n data: ArrayBuffer\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\n connect(): void // optional\n disconnect(): void // optional\n}> {\n abstract isConnected?: boolean\n abstract postMessage(data: ArrayBuffer): void\n close() {}\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 this.other?.emit(\"message\", {\n data: cloneObject(data),\n origin: \"local\",\n lastEventId: uuid(),\n })\n }\n}\n\nexport function fakeWorkerPair(): [LocalChannel, LocalChannel] {\n let w1 = new LocalChannel()\n let w2 = new LocalChannel()\n\n w1.other = w2\n w2.other = w1\n\n return [w1, w2]\n}\n", "import { Json } from \"../types\"\n\nexport interface Encoder {\n encode(data: Json): ArrayBuffer\n decode(data: ArrayBuffer): Json\n}\n\nexport class JsonEncoder implements Encoder {\n encode(data: Json): ArrayBuffer {\n return JSON.stringify(data) as any\n }\n\n decode(data: ArrayBuffer): Json {\n return JSON.parse(data as any) as any\n }\n}\n", "import { promisify, tryTimeout } from \"../promise\"\nimport { uname, uuid } from \"../uuid\"\nimport { Channel } from \"./channel\"\nimport { Logger } from \"../log\"\nimport { JsonEncoder } from \"./encoder\"\n\ninterface BridgeOptions {\n timeout?: number\n}\n\n/** @deprecated */\nexport function useBridge<L extends object>(\n info: { channel: Channel; encoder?: any },\n methods?: L\n) {\n const { channel, encoder = new JsonEncoder() } = info\n\n const log = Logger(`bridge:${uname(!!methods ? \"server\" : \"client\")}`)\n\n if (methods) {\n info.channel.on(\"message\", async (msg: any) => {\n const { name, args, id } = encoder.decode(msg.data)\n if (name) {\n log(`name ${name} id ${id}`)\n // @ts-ignore\n let result = await promisify(methods[name](...args))\n log(`result ${result}`)\n if (id) {\n info.channel.postMessage(encoder.encode({ id, result }))\n }\n }\n })\n }\n\n let waitingForResponse: any = {}\n\n info.channel.on(\"message\", async (msg: any) => {\n const { name, args, id, result } = encoder.decode(msg.data)\n if (!name && id) {\n log(`id ${id} result ${result}`)\n const resolve = waitingForResponse[id]\n if (resolve) {\n delete waitingForResponse[id]\n resolve(result)\n }\n }\n })\n\n // The async proxy, waiting for a response\n const createPromiseProxy = (opt: BridgeOptions): L => {\n const { timeout = 5000 } = opt\n return new Proxy<L>({} as any, {\n get: (target: any, name: any) => {\n return (...args: any): any => {\n if (!methods) {\n const id = uuid()\n info.channel.postMessage(encoder.encode({ name, args, id }))\n return tryTimeout(\n new Promise((resolve) => (waitingForResponse[id] = resolve)),\n timeout\n )\n }\n }\n },\n })\n }\n\n // The regular proxy without responding, just send\n return new Proxy<\n L & {\n promise: L\n options(opt: BridgeOptions): L\n }\n >(\n {\n promise: createPromiseProxy({}),\n options: (opt: BridgeOptions): L => createPromiseProxy(opt),\n } as any,\n {\n get: (target: any, name: any) => {\n if (name in target) return target[name]\n return (...args: any): any => {\n if (!methods) {\n info.channel.postMessage(encoder.encode({ name, args }))\n }\n }\n },\n }\n )\n}\n", "import { valueToString } from \"../data/convert\"\nimport { Logger } from \"../log\"\nimport { tryTimeout, promisify } from \"../promise\"\nimport { Json } from \"../types\"\nimport { uname, uuid } from \"../uuid\"\nimport { Channel } from \"./channel\"\nimport { Encoder, JsonEncoder } from \"./encoder\"\n\nexport type MessageAction = {\n name: string\n id: string\n args?: Json[]\n}\n\nexport type MessageResult = {\n id: string\n result?: Json\n error?: { stack?: string; name: string; message: string }\n}\n\nexport type Message = MessageAction | MessageResult\n\nexport type MessagesOptions = {\n timeout?: number\n}\n\nexport function useMessages<L extends object>(\n info: {\n channel: Channel\n encoder?: Encoder\n retryAfter?: number\n },\n methods?: L\n) {\n const log = Logger(`messages:${uname(!!methods ? \"server\" : \"client\")}`)\n\n const { channel, encoder = new JsonEncoder(), retryAfter = 1000 } = info\n\n let queue: Message[] = []\n let queueRetryTimer: any\n\n const postNext = () => {\n clearTimeout(queueRetryTimer)\n if (channel.isConnected) {\n while (queue.length) {\n let message = queue[0]\n try {\n channel.postMessage(encoder.encode(message))\n queue.shift() // remove from queue when done\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 channel.on(\"connect\", postNext)\n\n const postMessage = (message: Message) => {\n log(\"enqueue postMessage\", message)\n queue.push(message)\n postNext()\n }\n\n // Server side\n\n if (methods) {\n channel.on(\"message\", async (msg: any) => {\n const { name, args, id } = encoder.decode(msg.data) as any\n if (name) {\n log(`name ${name} id ${id}`)\n try {\n // @ts-ignore\n let result = await promisify(methods[name](...args))\n log(`result ${result}`)\n if (id) {\n postMessage({ id, result })\n }\n } catch (error) {\n log(\"execution error\", error)\n let err =\n error instanceof Error ? error : new Error(valueToString(error))\n postMessage({\n id,\n error: {\n message: err.message,\n stack: err.stack,\n name: err.name,\n },\n })\n }\n }\n })\n }\n\n let waitingForResponse: any = {}\n\n // Client side\n\n channel.on(\"message\", async (msg: any) => {\n const { name, args, id, result, error } = encoder.decode(msg.data) as any\n if (!name && id) {\n log(`response for id=${id}: result=${result}, error=${error}`)\n const [resolve, reject] = waitingForResponse[id]\n if (resolve && reject) {\n delete waitingForResponse[id]\n if (error) {\n let err = new Error(error.message)\n err.stack = error.stack\n err.name = error.name\n log(\"reject\", err)\n reject(err)\n } else {\n log(\"resolve\", result)\n resolve(result)\n }\n }\n }\n })\n\n // The async proxy, waiting for a response\n const createPromiseProxy = (opt: MessagesOptions): L => {\n const { timeout = 5000 } = opt\n return new Proxy<L>({} as any, {\n get: (target: any, name: any) => {\n if (name in target) return target[name]\n return (...args: any): any => {\n if (!methods) {\n const id = uuid()\n postMessage({ name, args, id })\n return tryTimeout(\n new Promise(\n (resolve, reject) =>\n (waitingForResponse[id] = [resolve, reject])\n ),\n timeout\n )\n }\n }\n },\n })\n }\n\n // The regular proxy without responding, just send\n return createPromiseProxy({})\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport type Mutex = (fn: () => void, elseFn?: () => void) => boolean\n\nexport function createMutex(): 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 } finally {\n token = true\n }\n } else if (elseFn !== undefined) {\n elseFn()\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\n// Can learn from here https://github.com/sindresorhus/p-queue\n\nimport { LoggerInterface, LogLevel } from \"../common/log-base\"\nimport { Logger } from \"../common/log\"\nimport { uname } from \"./uuid\"\n\nconst log = Logger(\"zeed:queue\")\n\ntype QueueTaskResolver = any\ntype QueueTask<T = any> = () => Promise<T>\n\ninterface QueueTaskInfo {\n name: string\n task: QueueTask\n resolve: QueueTaskResolver\n}\n\n/** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */\nexport class SerialQueue {\n private queue: QueueTaskInfo[] = []\n\n private isPaused: boolean = false\n private waitToFinish: QueueTaskResolver[] = []\n\n private currentTask?: Promise<any>\n\n private log: LoggerInterface\n\n name: string\n\n constructor(opt: { name?: string; logLevel?: LogLevel } = {}) {\n const { name = uname(\"queue\"), logLevel } = opt\n\n this.name = name\n this.log = Logger(`zeed:queue:${name}`)\n this.log.level = logLevel ?? LogLevel.off\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.isPaused) {\n this.log(`performNext => skip while is paused`)\n return\n }\n\n while (this.currentTask == null && !this.isPaused) {\n let info = this.queue.shift()\n this.log(`performNext => ${info?.name}`)\n\n if (info == null) {\n break\n }\n\n const { name, task, resolve } = info\n this.currentTask = task()\n let result = undefined\n try {\n this.log.info(`start task ${name}`)\n result = await this.currentTask\n this.log(`finished task ${name} with result =`, result)\n } catch (err) {\n log.warn(\"Error performing task\", err)\n }\n\n resolve(result)\n this.currentTask = undefined\n }\n\n while (this.waitToFinish.length > 0) {\n this.waitToFinish.shift()()\n }\n }\n\n /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */\n async enqueue<T>(\n task: QueueTask<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 this.log(`enqueue ${name}`)\n return new Promise((resolve) => {\n this.queue.push({\n name,\n task,\n resolve,\n })\n this.performNext()\n })\n }\n\n /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */\n async enqueueReentrant<T>(\n task: QueueTask<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 let 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.isPaused = true\n await this.wait()\n }\n\n /** Resume paused queue. */\n resume() {\n this.log(`resume`)\n this.isPaused = false\n this.performNext()\n }\n\n /** Wait for all tasks to finish */\n async wait() {\n this.log(`wait`)\n if (\n this.currentTask == null &&\n (this.queue.length === 0 || this.isPaused)\n ) {\n return\n }\n return new Promise((resolve) => {\n this.waitToFinish.push(resolve)\n })\n }\n}\n", "// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { Json } from \"../types\"\nimport { Logger } from \"../log\"\nimport { ObjectStorage } from \"../types\"\n\nconst log = Logger(\"zeed:memstorage\")\n\nexport interface MemStorageOptions {\n objectFromString?: (data: string) => any\n objectToString?: (data: any) => string\n}\n\nexport class MemStorage implements ObjectStorage {\n private store: { [key: string]: string } = {}\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\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: Json): void {\n const data = this.objectToString(value)\n this.store[key] = data\n }\n\n getItem(key: string): Json | undefined {\n if (this.store.hasOwnProperty(key)) {\n let value = this.store[key]\n return this.objectFromString(value)\n }\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", "// 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\ninterface DebounceOptions {\n // A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n delay?: number\n\n // Optional, defaults to false. If noTrailing is true, callback will only execute every `delay` milliseconds while the\n // throttled-function is being called. If noTrailing is false or unspecified, callback will be executed one final time\n // after the last throttled-function call. (After the throttled-function has not been called for `delay` milliseconds,\n // the internal counter is reset).\n noTrailing?: boolean\n\n // If `debounceMode` is true (at begin), schedule `clear` to execute after `delay` ms. If `debounceMode` is false (at end),\n // schedule `callback` to execute after `delay` ms.\n debounceMode?: boolean\n}\n\ntype DebounceFunction = Function & { cancel: () => void }\n\n/*\n * Throttle execution of a function. Especially useful for rate limiting\n * execution of handlers on events like resize and scroll.\n */\nexport function throttle(\n callback: Function,\n opt: DebounceOptions = {}\n): DebounceFunction {\n /*\n * After wrapper has stopped being called, this timeout ensures that\n * `callback` is executed at the proper times in `throttle` and `end`\n * debounce modes.\n */\n const { delay = 100, noTrailing = false, debounceMode = false } = opt\n let timeoutID: any\n let cancelled: boolean = false\n\n // Keep track of the last time `callback` was executed.\n let lastExec = 0\n\n // Function to clear existing timeout\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID)\n }\n }\n\n // Function to cancel next exec\n function cancel() {\n clearExistingTimeout()\n cancelled = true\n }\n\n /*\n * The `wrapper` function encapsulates all of the throttling / debouncing\n * functionality and when executed will limit the rate at which `callback`\n * is executed.\n */\n function wrapper(this: any, ...arguments_: any[]) {\n let self = this\n let elapsed = Date.now() - lastExec\n\n if (cancelled) {\n return\n }\n\n // Execute `callback` and update the `lastExec` timestamp.\n function exec() {\n lastExec = Date.now()\n callback.apply(self, arguments_)\n }\n\n /*\n * If `debounceMode` is true (at begin) this is used to clear the flag\n * to allow future `callback` executions.\n */\n function clear() {\n timeoutID = undefined\n }\n\n if (debounceMode && !timeoutID) {\n /*\n * Since `wrapper` is being called for the first time and\n * `debounceMode` is true (at begin), execute `callback`.\n */\n exec()\n }\n\n clearExistingTimeout()\n\n if (debounceMode === undefined && elapsed > delay) {\n /*\n * In throttle mode, if `delay` time has been exceeded, execute\n * `callback`.\n */\n exec()\n } else if (noTrailing !== true) {\n /*\n * In trailing throttle mode, since `delay` time has not been\n * exceeded, schedule `callback` to execute `delay` ms after most\n * recent execution.\n *\n * If `debounceMode` is true (at begin), schedule `clear` to execute\n * after `delay` ms.\n *\n * If `debounceMode` is false (at end), schedule `callback` to\n * execute after `delay` ms.\n */\n timeoutID = setTimeout(\n debounceMode ? clear : exec,\n debounceMode === undefined ? delay - elapsed : delay\n )\n }\n }\n\n wrapper.cancel = cancel\n\n // Return the wrapper function.\n return wrapper\n}\n\n/*\n * Debounce execution of a function. Debouncing, unlike throttling,\n * guarantees that a function is only executed a single time, either at the\n * very beginning of a series of calls, or at the very end.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @param {boolean} [atBegin] - Optional, defaults to false. If atBegin is false or unspecified, callback will only be executed `delay` milliseconds\n * after the last debounced-function call. If atBegin is true, callback will be executed only at the first debounced-function call.\n * (After the throttled-function has not been called for `delay` milliseconds, the internal counter is reset).\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n * to `callback` when the debounced-function is executed.\n *\n * @returns {Function} A new, debounced function.\n */\n\nexport function debounce(\n callback: Function,\n opt: DebounceOptions = {}\n): DebounceFunction {\n opt.debounceMode = true\n return throttle(callback, opt)\n // return callback === undefined\n // ? throttle(delay, atBegin, false)\n // : throttle(delay, callback, atBegin !== false)\n}\n\nexport function throttleAnimationFrame(callback: Function): DebounceFunction {\n let requestId: any\n let lastArgs: any\n\n const later = (context: any) => () => {\n requestId = undefined\n callback.apply(context, lastArgs)\n }\n\n const throttled = function (this: any, ...args: any) {\n lastArgs = args\n if (requestId == null) {\n requestId = requestAnimationFrame(later(this))\n }\n }\n\n throttled.cancel = () => {\n cancelAnimationFrame(requestId)\n requestId = undefined\n }\n\n return throttled\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|