aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/parse.ts
blob: 781c708750bbe1464deb0521ee39cf709166ce24 (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
import { get, isLiquid, post } from "$lib/utils";
import bip21 from "bip21";
import { validate } from "bitcoin-address-validation";
import { PUBLIC_DOMAIN } from "$env/static/public";
import { redirect } from "@sveltejs/kit";

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

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

  let amount, id, user;

  t = t.trim();
  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("ln")) {
    try {
      ({ id } = 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")) {
    let { 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}`);
};