From 3e2d9c5758d92fccc19e44842e0b9d4a252630ff Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 30 Aug 2024 19:44:15 -0700 Subject: typescript --- src/lib/nostr.ts | 41 ++++---------- src/lib/store.ts | 12 ++-- src/lib/utils.ts | 134 ++++++++++++++++++++------------------------ src/routes/+page.server.js | 4 +- src/routes/about/+server.js | 2 +- src/routes/start/+server.js | 1 - 6 files changed, 82 insertions(+), 112 deletions(-) diff --git a/src/lib/nostr.ts b/src/lib/nostr.ts index 5ee5be6f..4b6b4ec0 100644 --- a/src/lib/nostr.ts +++ b/src/lib/nostr.ts @@ -2,19 +2,11 @@ import { browser } from "$app/environment"; import { hexToUint8Array } from "uint8array-extras"; import { get } from "svelte/store"; import { Buffer } from "buffer"; -import { fail, wait, post, stretch } from "$lib/utils"; -import { - decrypted, - password as pw, - passwordPrompt, - pin, - loginRedirect, -} from "$lib/store"; -import { goto, invalidate } from "$app/navigation"; +import { wait, post, stretch } from "$lib/utils"; +import { decrypted, password as pw, passwordPrompt, pin } from "$lib/store"; import { getPublicKey, finalizeEvent, - getEventHash, nip04, nip19, type EventTemplate, @@ -40,7 +32,7 @@ type User = { type EncryptParams = { message: string; - recipient: User; + recipient: string; user: User; }; @@ -93,13 +85,6 @@ export let decrypt = async ({ event, user }) => { } }; -function typedArrayToBuffer(array) { - return array.buffer.slice( - array.byteOffset, - array.byteLength + array.byteOffset - ); -} - export let getPrivateKey = async (user: User): Promise => { let k; if (browser) { @@ -109,7 +94,7 @@ export let getPrivateKey = async (user: User): Promise => { } } - let { nsec, username, salt } = user; + let { nsec } = user; if (nsec) { k = nip49decrypt(nsec, await getPassword()); @@ -120,8 +105,8 @@ export let getPrivateKey = async (user: User): Promise => { }; export let getMnemonic = async (user: User) => { - let { cipher, username, salt } = user; - let mnemonic, key, seed, entropy, child, privkey; + let { cipher, salt } = user; + let entropy; entropy = new Uint8Array( await crypto.subtle.decrypt( @@ -167,17 +152,16 @@ export let send = (event: EventTemplate) => { return post("/events", { event }); }; -let getPassword = async () => { +let getPassword = async (): Promise => { if (!get(pw)) passwordPrompt.set(true); - await wait(() => !!get(pw)); - return get(pw); + await wait(() => !!get(pw)); + return get(pw) || ""; }; export let reEncryptEntropy = async (user: User, newPassword: string) => { - let { cipher, username, salt } = user; + let { cipher, salt } = user; - let mnemonic, key, seed, entropy, child, privkey; - entropy = await crypto.subtle.decrypt( + let entropy = await crypto.subtle.decrypt( { name: "AES-GCM", iv: new Uint8Array(16) }, await stretch(await getPassword(), hexToUint8Array(salt)), Uint8Array.from(fromWords(decode(cipher, 180).words)) @@ -194,6 +178,5 @@ export let reEncryptEntropy = async (user: User, newPassword: string) => { return encode("en", toWords(bytes), 180); }; -export let nwc = (user: User) => { +export let nwc = (user: User) => `nostr+walletconnect://${PUBLIC_COINOS_PUBKEY}?relay=${damus}&secret=${user.nwc}`; -}; diff --git a/src/lib/store.ts b/src/lib/store.ts index 71d4aa40..333f81b7 100644 --- a/src/lib/store.ts +++ b/src/lib/store.ts @@ -1,12 +1,12 @@ -import { get, writable } from "svelte/store"; +import { writable } from "svelte/store"; import { browser } from "$app/environment"; -let persistSession = (key, defaultValue) => { +let persistSession = (key, defaultValue = undefined) => { let s = writable( browser && sessionStorage.getItem(key) && sessionStorage.getItem(key) !== "undefined" - ? JSON.parse(sessionStorage.getItem(key)) + ? JSON.parse(sessionStorage.getItem(key) || "") : defaultValue ); @@ -17,12 +17,12 @@ let persistSession = (key, defaultValue) => { return s; }; -let persistLocal = (key, defaultValue) => { +let persistLocal = (key, defaultValue: any = undefined) => { let s = writable( browser && localStorage.getItem(key) && localStorage.getItem(key) !== "undefined" - ? JSON.parse(localStorage.getItem(key)) + ? JSON.parse(localStorage.getItem(key) || "") : defaultValue ); @@ -48,7 +48,7 @@ export let last = writable(); export let loginRedirect = writable(); export let decrypted = persistLocal("decrypted", {}); export let newPayment = persistLocal("newPayment"); -export let password = writable(); +export let password = writable(); export let passwordPrompt = writable(); export let pin = persistLocal("pin"); export let rate = writable(); diff --git a/src/lib/utils.ts b/src/lib/utils.ts index d6238842..69e0f949 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -5,20 +5,20 @@ import { PUBLIC_COINOS_URL } from "$env/static/public"; import { page } from "$app/stores"; import { get as getStore } from "svelte/store"; -export function scroll(section) { +export function scroll(section: any) { if (getStore(page).url.pathname !== "/") goto("/"); setTimeout(() => section.scrollIntoView({ behavior: "smooth" }), 500); } let base = browser ? "" : PUBLIC_COINOS_URL; -export let punk = (k) => +export let punk = (k: string) => Math.floor((parseInt(k.slice(-2), 16) / 256) * 64) + 1 + ".webp"; -export let g = (url, fetch, headers) => +export let g = (url: string, fetch: any, headers: object) => fetch(base + url, { headers }) - .then((r) => r.text()) - .then((body) => { + .then((r: Response) => r.text()) + .then((body: string) => { try { return JSON.parse(body); } catch (e) { @@ -26,7 +26,7 @@ export let g = (url, fetch, headers) => } }); -export let get = (url, headers = {}) => { +export let get = (url: string, headers = {}) => { return fetch(base + url, { headers }) .then(async (r) => { if (r.ok) return r.text(); @@ -41,7 +41,7 @@ export let get = (url, headers = {}) => { }); }; -export let post = async (url, body, headers) => { +export let post = async (url: string, body: object, headers: HeadersInit | undefined = undefined) => { headers = { "content-type": "application/json", accept: "application/json", @@ -66,46 +66,47 @@ export let post = async (url, body, headers) => { throw new Error(text); }) .then((body) => { + let json; try { - body = JSON.parse(body); + json = JSON.parse(body); } catch (e) { throw new Error(body); } - if (body.error instanceof Error) throw body.error; - if (body instanceof Error) throw body; - if (body.name === "Error") throw new Error(body.message); + if (json.error instanceof Error) throw json.error; + if (json instanceof Error) throw body; + if (json.name === "Error") throw new Error(json.message); - return body; + return json; }); return response; }; -export let copy = (text) => { +export let copy = (text: string) => { navigator.clipboard.writeText(text); success("Copied!"); }; -export let copyNoNewlines = (text) => { +export let copyNoNewlines = (text: string) => { let stripped = text.replace(/\n/g, " ").replace(/\s+/g, " "); navigator.clipboard.writeText(stripped); success("Copied!"); }; -export function reverseFormat(val, locale) { +export function reverseFormat(val: string, locale: string): number { let parts = new Intl.NumberFormat(locale).formatToParts(1111.1); - let group = parts.find((part) => part.type === "group").value; - let decimal = parts.find((part) => part.type === "decimal").value; + let group = parts.find((part) => part.type === "group")!.value; + let decimal = parts.find((part) => part.type === "decimal")!.value; let reversedVal = val.replace(new RegExp("\\" + group, "g"), ""); reversedVal = reversedVal.replace(new RegExp("\\" + decimal, "g"), "."); return Number.isNaN(reversedVal) ? 0 : +reversedVal; } -export let protectedRoutes = [/customers/, /settings/, /payments/]; +export let protectedRoutes: RegExp[] = [/customers/, /settings/, /payments/]; -let recent = []; -export let success = (m, clear = true) => { +let recent: string[] = []; +export let success = (m: string, clear: boolean = true) => { if (recent.includes(m)) return; recent.push(m); setTimeout(() => (recent = []), 5000); @@ -117,7 +118,7 @@ export let success = (m, clear = true) => { }); }; -export let warning = (m, clear = true) => { +export let warning = (m: string, clear: boolean = true) => { if (clear) toast.pop(); toast.push(m, { theme: { @@ -125,7 +126,8 @@ export let warning = (m, clear = true) => { }, }); }; -export let fail = (m, clear = true) => { + +export let fail = (m: string, clear: boolean = true) => { if (clear) toast.pop(); toast.push(m, { theme: { @@ -133,7 +135,8 @@ export let fail = (m, clear = true) => { }, }); }; -export let info = (m) => { + +export let info = (m: string) => { toast.pop(); toast.push(m, { theme: { @@ -142,7 +145,11 @@ export let info = (m) => { }); }; -export let login = async (user, cookies, ip) => { +export let login = async ( + user: { username: string; password: string }, + cookies: any, + ip: string +) => { let maxAge = 380 * 24 * 60 * 60; let res = await fetch(base + "/login", { @@ -171,21 +178,25 @@ export let login = async (user, cookies, ip) => { cookies.set("token", token, opts); }; -export let auth = (cookies) => ({ +export let auth = (cookies: any) => ({ authorization: `Bearer ${cookies.get("token")}`, }); -export let btc = (fiat, rate) => Math.round((fiat * sats) / rate); -export let fiat = (amount, rate) => (amount * rate) / sats; -export let fd = async (req) => { - let obj = Object.fromEntries(await req.formData()); +export let btc = (fiat: number, rate: number): number => + Math.round((fiat * sats) / rate); + +export let fiat = (amount: number, rate: number): number => + (amount * rate) / sats; + +export let fd = async (req: Request): Promise => { + let obj: Record = Object.fromEntries(await req.formData()); for (let k in obj) (obj[k] === "undefined" && (obj[k] = undefined)) || (obj[k] === "false" && (obj[k] = false)); return obj; }; -export let f = (s, currency) => { +export let f = (s: number, currency: string): string => { try { return new Intl.NumberFormat("en-US", { style: "currency", @@ -198,17 +209,17 @@ export let f = (s, currency) => { } }; -export let s = (s) => +export let s = (s: number): string => new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 }).format(s); -export let sat = (s) => { +export let sat = (s: number): string => { s = Math.abs(s); let p = Math.floor(Math.log(s) / Math.LN10 + 0.000000001); let d = Math.floor((p + 1) / 3); return ( "⚡️" + - (parseInt(s) > 0 + (parseInt(s.toString()) > 0 ? new Intl.NumberFormat("en-US", { maximumFractionDigits: 2 }).format( s / Math.pow(1000, d) ) + ["", "K", "M", "G", "T", "P", "E", "Z"][d] @@ -219,24 +230,29 @@ export let sat = (s) => { export let sats = 100000000; -export let back = () => +export let back = (): any => browser && (history.length ? history.go(-1) : goto("/")); -export let focus = (el) => +export let focus = (el: HTMLElement): any => browser && screen.width > 1280 && setTimeout(() => el.focus(), 1); -export let select = (el) => +export let select = (el: HTMLInputElement): any => browser && screen.width > 1280 && setTimeout(() => el.select(), 1); -export let sleep = (n) => new Promise((r) => setTimeout(r, n)); -export let wait = async (f, n = 100, s = 300) => { +export let sleep = (n: number): Promise => + new Promise((r) => setTimeout(r, n)); + +export let wait = async (f: () => boolean | Promise, n: number = 100, s: number = 300): Promise => { let i = 0; - while (!(await f()) && i < s) (await sleep(n)) && i++; + while (!(await f()) && i < s) { + await sleep(n); + i++; + } if (i >= s) throw new Error("timeout"); return f(); }; -export let stretch = async (password, salt) => +export let stretch = async (password: string, salt: Uint8Array) => crypto.subtle.deriveKey( { name: "PBKDF2", @@ -256,32 +272,6 @@ export let stretch = async (password, salt) => ["encrypt", "decrypt"] ); -function get_bigrams(string) { - var s = string.toLowerCase(); - var v = s.split(""); - for (var i = 0; i < v.length; i++) { - v[i] = s.slice(i, i + 2); - } - return v; -} - -export function ss(str1, str2) { - if (str1.length > 0 && str2.length > 0) { - var pairs1 = get_bigrams(str1); - var pairs2 = get_bigrams(str2); - var union = pairs1.length + pairs2.length; - var hits = 0; - for (var x = 0; x < pairs1.length; x++) { - for (var y = 0; y < pairs2.length; y++) { - if (pairs1[x] == pairs2[y]) hit_count++; - } - } - if (hits > 0) return (2.0 * hits) / union; - } - - return 0.0; -} - export let types = { bitcoin: "bitcoin", liquid: "liquid", @@ -291,22 +281,22 @@ export let types = { ecash: "ecash", }; -export let ease = (t) => +export let ease = (t: number): number => t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t; -export function shuffleArray(array) { +export function shuffleArray(array: T[]): void { for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } } -export let closest = (a, n) => +export let closest = (a: number[], n: number): number => a.reduce((prev, curr) => Math.abs(curr - n) < Math.abs(prev - n) ? curr : prev ); -export let isLiquid = (text) => +export let isLiquid = (text: string): boolean => text.startsWith("Az") || text.startsWith("lq1") || text.startsWith("VJL") || @@ -320,7 +310,7 @@ export let isLiquid = (text) => text.startsWith("el1qq") || text.startsWith("lq1qq"); -export function getCookie(name) { +export function getCookie(name: string): string | null { let nameEQ = name + "="; let ca = document.cookie.split(";"); for (let i = 0; i < ca.length; i++) { @@ -331,7 +321,7 @@ export function getCookie(name) { return null; } -export function setCookie(name, value, seconds) { +export function setCookie(name: string, value: string, seconds: number): void { const now = new Date(); now.setTime(now.getTime() + seconds * 1000); const expires = "expires=" + now.toUTCString(); diff --git a/src/routes/+page.server.js b/src/routes/+page.server.js index f22ddff1..20c3a05b 100644 --- a/src/routes/+page.server.js +++ b/src/routes/+page.server.js @@ -1,5 +1,3 @@ -import { redirect } from "@sveltejs/kit"; - -export let load = async ({ parent, url }) => { +export let load = async () => { return { faqs: ["cost", "compatibility", "safety", "pos", "bitcoin"] }; }; diff --git a/src/routes/about/+server.js b/src/routes/about/+server.js index b6912cb4..eb3d9729 100644 --- a/src/routes/about/+server.js +++ b/src/routes/about/+server.js @@ -1,5 +1,5 @@ import { redirect } from "@sveltejs/kit"; export async function GET() { - throw new redirect(307, "/#about"); + redirect(307, "/#about"); } diff --git a/src/routes/start/+server.js b/src/routes/start/+server.js index babe7db6..44561d40 100644 --- a/src/routes/start/+server.js +++ b/src/routes/start/+server.js @@ -1,4 +1,3 @@ -import { auth, get } from "$lib/utils"; import { redirect } from "@sveltejs/kit"; export async function GET({ cookies }) { -- cgit v1.2.3