aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/parse.ts
blob: cdfa4d628e26d67a9b58b2055efb98cfac193af1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import { PUBLIC_DOMAIN } from "$env/static/public";
import { get, isLiquid, post } from "$lib/utils";
import { redirect } from "@sveltejs/kit";
import bip21 from "bip21";
import { validate } from "bitcoin-address-validation";

export default async (s, host) => {
	if (!s) return;
	let t = s;

	if (t.includes("lightning=")) {
		const url = new URL(t);
		const params = new URLSearchParams(url.search);
		t = params.get("lightning");
	}

	if (t.startsWith("http")) redirect(307, t);
	if (t.startsWith(host)) redirect(307, `http://${t}`);

	let amount;
	let user;

	t = t.trim();
	if (t.toLowerCase().startsWith("bitcoin:"))
		({
			address: t,
			options: { amount },
		} = bip21.decode(t));

	if (t.startsWith("lightning:")) t = t.replace("lightning:", "");
	if (t.endsWith(`@${PUBLIC_DOMAIN}`)) t = t.split("@")[0];
	if (t.includes("@") && t.includes(".")) {
		try {
			t = await get(`/encode?address=${t}`);
		} catch (e) {}
	}

	if (t.includes("/fund")) redirect(307, t.substring(t.indexOf("/fund")));

	// lightning
	if (t.toLowerCase().startsWith("lightning:"))
		t = t.toLowerCase().replace("lightning:", "");
	if (t.toLowerCase().startsWith("lnurl")) redirect(307, `/ln/${t}`);
	if (t.includes(":")) t = t.split(":")[1];

	if (t.toLowerCase().startsWith("lno")) {
		const { invoice } = await get(`/offer/${t}`);
		redirect(307, `/send/lightning/${invoice}`);
	}

	if (t.toLowerCase().startsWith("lno")) {
		try {
			await get(`/invoice/${t}`);
		} catch (e) {
			redirect(307, `/send/lightning/${t}`);
		}
	}

	// bitcoin
	if (validate(t) || isLiquid(t)) {
		let r = `/send/bitcoin/${t}`;
		if (amount) r += `/${amount}`;
		redirect(307, r);
	}

	if (t.startsWith("cashu")) {
		const { id } = await post("/cash", { token: t });
		redirect(307, `/ecash/${id}`);
	}

	// user
	try {
		user = await get(`/users/${t.split("/")[0]}`);
		if (user.anon) user = null;
	} catch (e) {}

	if (user) redirect(307, `/pay/${t}`);

	let fund;
	try {
		fund = await get(`/fund/${t}`);
	} catch (e) {}

	if (fund) redirect(307, `/send/fund/${t}`);

	// invoice
	let invoice;
	try {
		invoice = await get(`/invoice/${t}`);
	} catch (e) {}

	if (invoice) redirect(307, `/send/invoice/${invoice.id}`);
};