1- import bech32 from 'bech32' ;
21import axios from 'axios' ;
2+ import bech32 from 'bech32' ;
33import { Buffer } from 'buffer' ;
4+
5+ import { validateInternetIdentifier } from './internet-identifier' ;
46import LightningPayReq from '../lib/bolt11' ;
57
68const LIGHTNING_SCHEME = 'lightning' ;
79const BOLT11_SCHEME = 'lnbc' ;
810const LNURL_SCHEME = 'lnurl' ;
911
10- export const parseInvoice = ( invoice : string ) => {
12+ export const parseInvoice = async ( invoice : string ) => {
1113 if ( ! invoice || invoice === '' ) {
1214 return null ;
1315 }
1416
1517 const lcInvoice = invoice . trim ( ) . toLowerCase ( ) ;
1618 let requestCode = lcInvoice ;
1719
20+ // Check if this is a Lightning Address
21+ if ( validateInternetIdentifier ( requestCode ) ) {
22+ const { success, data, message } = await handleLightningAddress ( requestCode ) ;
23+ console . log ( { success, data, message } ) ;
24+
25+ if ( ! success ) {
26+ return {
27+ data : null ,
28+ error : message ,
29+ isLNURL : false ,
30+ } ;
31+ }
32+ }
33+
1834 // Check if Invoice has `lightning` or `lnurl` prefixes
1935 // (9 chars + the `:` or `=` chars) --> 10 characters total
2036 const hasLightningPrefix = lcInvoice . indexOf ( `${ LIGHTNING_SCHEME } :` ) !== - 1 ;
@@ -59,6 +75,58 @@ const handleLNURL = (invoice: string) => {
5975 } )
6076} ;
6177
78+ const handleLightningAddress = ( internetIdentifier : string ) => {
79+ const addressArr = internetIdentifier . split ( '@' ) ;
80+
81+ // Must only have 2 fields (username and domain name)
82+ if ( addressArr . length !== 2 ) {
83+ return {
84+ success : false ,
85+ message : 'Invalid internet identifier format.' ,
86+ } ;
87+ }
88+
89+ const [ username , domain ] = addressArr ;
90+
91+ // Must only have 2 fields (username and domain name)
92+ if ( addressArr [ 1 ] . indexOf ( '.' ) === - 1 ) {
93+ return {
94+ success : false ,
95+ message : 'Invalid internet identifier format.' ,
96+ } ;
97+ }
98+
99+ const url = `https://${ domain } /.well-known/lnurlp/${ username } ` ;
100+
101+ return axios . get ( 'https://satcors.fiatjaf.com/?url=' + encodeURIComponent ( url ) , {
102+ headers : {
103+ 'Access-Control-Allow-Origin' : '*' ,
104+ }
105+ } ) . then ( res => {
106+ console . log ( { url, username, domain } ) ;
107+ const imageEntry = JSON . parse ( res . data . metadata )
108+ . find ( ( [ k ] ) => k . startsWith ( 'image/' ) ) ;
109+
110+ res . data . decodedMetadata = JSON . parse ( res . data . metadata ) ;
111+ res . data . domain = domain ;
112+
113+ return {
114+ success : true ,
115+ data : {
116+ domain,
117+ username,
118+ lnurlParams : res . data ,
119+ image : imageEntry && `data:${ imageEntry . join ( ',' ) } ` ,
120+ } ,
121+ }
122+ } ) . catch ( _ => {
123+ return {
124+ success : false ,
125+ message : 'This identifier does not support Lightning Address yet.' ,
126+ } ;
127+ } ) ;
128+ } ;
129+
62130const handleBOLT11 = ( invoice : string ) => {
63131 // Check if Invoice starts with `lnbc` prefix
64132 if ( ! invoice . includes ( BOLT11_SCHEME ) ) {
@@ -70,3 +138,4 @@ const handleBOLT11 = (invoice: string) => {
70138
71139 return result ;
72140} ;
141+
0 commit comments