UNPKG

nostr-tools

Version:
151 lines (149 loc) 4.52 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // utils.ts var utils_exports = {}; __export(utils_exports, { binarySearch: () => binarySearch, bytesToHex: () => import_utils.bytesToHex, hexToBytes: () => import_utils.hexToBytes, insertEventIntoAscendingList: () => insertEventIntoAscendingList, insertEventIntoDescendingList: () => insertEventIntoDescendingList, mergeReverseSortedLists: () => mergeReverseSortedLists, normalizeURL: () => normalizeURL, utf8Decoder: () => utf8Decoder, utf8Encoder: () => utf8Encoder }); module.exports = __toCommonJS(utils_exports); var import_utils = require("@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; }