aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2024-08-30 19:44:15 -0700
committerAdam Soltys <[email protected]>2024-08-30 19:44:15 -0700
commit3e2d9c5758d92fccc19e44842e0b9d4a252630ff (patch)
tree52ca9234d3b1300e36fc17c9d69fa233cb30e170 /src/lib
parent8346eb9e052d10abf4fb65b66838aaab47152e2a (diff)
downloadcoinos-ui-3e2d9c5758d92fccc19e44842e0b9d4a252630ff.tar.gz
coinos-ui-3e2d9c5758d92fccc19e44842e0b9d4a252630ff.zip
typescript
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/nostr.ts41
-rw-r--r--src/lib/store.ts12
-rw-r--r--src/lib/utils.ts134
3 files changed, 80 insertions, 107 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<Uint8Array> => {
let k;
if (browser) {
@@ -109,7 +94,7 @@ export let getPrivateKey = async (user: User): Promise<Uint8Array> => {
}
}
- 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<Uint8Array> => {
};
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<string> => {
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<string | undefined>();
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<any> => {
+ let obj: Record<string, any> = 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<void> =>
+ new Promise((r) => setTimeout(r, n));
+
+export let wait = async (f: () => boolean | Promise<boolean>, n: number = 100, s: number = 300): Promise<boolean> => {
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<T>(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();