UNPKG

nostr-tools

Version:
130 lines (129 loc) 3.4 kB
// utils.ts import { bytesToHex, hexToBytes } from "@noble/hashes/utils.js"; var utf8Decoder = new TextDecoder("utf-8"); var utf8Encoder = new TextEncoder(); function normalizeURL(url) { try { if (url.indexOf("://") === -1) url = "wss://" + url; let p = new URL(url); if (p.protocol === "http:") p.protocol = "ws:"; else if (p.protocol === "https:") p.protocol = "wss:"; p.pathname = p.pathname.replace(/\/+/g, "/"); if (p.pathname.endsWith("/")) p.pathname = p.pathname.slice(0, -1); if (p.port === "80" && p.protocol === "ws:" || p.port === "443" && p.protocol === "wss:") p.port = ""; p.searchParams.sort(); p.hash = ""; return p.toString(); } catch (e) { throw new Error(`Invalid URL: ${url}`); } } function insertEventIntoDescendingList(sortedArray, event) { const [idx, found] = binarySearch(sortedArray, (b) => { if (event.id === b.id) return 0; if (event.created_at === b.created_at) return -1; return b.created_at - event.created_at; }); if (!found) { sortedArray.splice(idx, 0, event); } return sortedArray; } function insertEventIntoAscendingList(sortedArray, event) { const [idx, found] = binarySearch(sortedArray, (b) => { if (event.id === b.id) return 0; if (event.created_at === b.created_at) return -1; return event.created_at - b.created_at; }); if (!found) { sortedArray.splice(idx, 0, event); } return sortedArray; } function binarySearch(arr, compare) { let start = 0; let end = arr.length - 1; while (start <= end) { const mid = Math.floor((start + end) / 2); const cmp = compare(arr[mid]); if (cmp === 0) { return [mid, true]; } if (cmp < 0) { end = mid - 1; } else { start = mid + 1; } } return [start, false]; } function mergeReverseSortedLists(list1, list2) { const result = new Array(list1.length + list2.length); result.length = 0; let i1 = 0; let i2 = 0; let sameTimestampIds = []; while (i1 < list1.length && i2 < list2.length) { let next; if (list1[i1]?.created_at > list2[i2]?.created_at) { next = list1[i1]; i1++; } else { next = list2[i2]; i2++; } if (result.length > 0 && result[result.length - 1].created_at === next.created_at) { if (sameTimestampIds.includes(next.id)) continue; } else { sameTimestampIds.length = 0; } result.push(next); sameTimestampIds.push(next.id); } while (i1 < list1.length) { const next = list1[i1]; i1++; if (result.length > 0 && result[result.length - 1].created_at === next.created_at) { if (sameTimestampIds.includes(next.id)) continue; } else { sameTimestampIds.length = 0; } result.push(next); sameTimestampIds.push(next.id); } while (i2 < list2.length) { const next = list2[i2]; i2++; if (result.length > 0 && result[result.length - 1].created_at === next.created_at) { if (sameTimestampIds.includes(next.id)) continue; } else { sameTimestampIds.length = 0; } result.push(next); sameTimestampIds.push(next.id); } return result; } export { binarySearch, bytesToHex, hexToBytes, insertEventIntoAscendingList, insertEventIntoDescendingList, mergeReverseSortedLists, normalizeURL, utf8Decoder, utf8Encoder };