1+ const fs = require ( 'fs' ) ;
12const path = require ( 'path' ) ;
23const axios = require ( 'axios' ) ;
34const protobuf = require ( 'protobufjs' ) ;
45
5- const PORT = process . argv [ 2 ] || '1111' ;
6- const AUTH_PUBKEY = 'replace+this+with+your+base64+encoded+pubkey' ;
6+ const PORT = process . argv [ 2 ] || getPortFromMetadata ( ) || '1111' ;
7+ const NODE_PUBKEY = 'yournodepubkeyhexvalue00000000000000000000000000000000000000000000' ;
8+ const AUTH_PUBKEY = Buffer . from ( NODE_PUBKEY , 'hex' ) . toString ( 'base64' ) ;
79const AUTH_SIGNATURE = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' ;
810const PROTO_PATHS = [
911 path . join ( process . cwd ( ) , '../../libs/gl-client/.resources/proto/node.proto' ) ,
1012 path . join ( process . cwd ( ) , '../../libs/gl-client/.resources/proto/primitives.proto' )
1113] ;
1214
15+ function getPortFromMetadata ( ) {
16+ try {
17+ const grpcWebProxyUri = JSON . parse ( fs . readFileSync ( '../../metadata.json' ) ) . grpc_web_proxy_uri ;
18+ if ( ! grpcWebProxyUri ) {
19+ console . error ( 'grpc_web_proxy_uri not found in metadata.json' ) ;
20+ return null ;
21+ }
22+ const grpc_port = new URL ( grpcWebProxyUri ) . port ;
23+ if ( ! grpc_port ) {
24+ console . error ( 'Port not found in grpc_web_proxy_uri' ) ;
25+ return null ;
26+ }
27+ return grpc_port ;
28+ } catch ( error ) {
29+ console . error ( 'Error reading metadata.json: ' , error . message ) ;
30+ return null ;
31+ }
32+ }
33+
1334function getGrpcErrorMessage ( grpcStatusCode ) {
1435 const grpcStatusMessages = {
1536 0 : 'OK: The operation completed successfully.' ,
@@ -37,11 +58,13 @@ async function encodePayload(clnNode, method, payload) {
3758 const methodRequest = clnNode . lookupType ( `cln.${ method } Request` ) ;
3859 const errMsg = methodRequest . verify ( payload ) ;
3960 if ( errMsg ) throw new Error ( errMsg ) ;
40- const header = Buffer . alloc ( 4 ) ;
41- header . writeUInt8 ( 0 , 0 ) ;
4261 const requestPayload = methodRequest . create ( payload ) ;
43- const encodedPayload = methodRequest . encodeDelimited ( requestPayload ) . finish ( ) ;
44- return Buffer . concat ( [ header , encodedPayload ] ) ;
62+ const encodedPayload = methodRequest . encode ( requestPayload ) . finish ( ) ;
63+ const flags = Buffer . alloc ( 1 ) ;
64+ flags . writeUInt8 ( 0 , 0 ) ;
65+ const header = Buffer . alloc ( 4 ) ;
66+ header . writeUInt32BE ( encodedPayload . length , 0 ) ;
67+ return Buffer . concat ( [ flags , header , encodedPayload ] ) ;
4568}
4669
4770async function sendRequest ( methodUrl , encodedPayload ) {
@@ -72,31 +95,34 @@ function transformValue(key, value) {
7295}
7396
7497function decodeResponse ( clnNode , method , response ) {
75- const methodResponse = clnNode . lookupType ( `cln.${ method } Response` )
76- const offset = 5 ;
77- const responseData = new Uint8Array ( response . data ) . slice ( offset ) ;
98+ const methodResponse = clnNode . lookupType ( `cln.${ method } Response` ) ;
99+ const dataBuffer = Buffer . from ( response . data ) ;
100+ const resFlag = dataBuffer . subarray ( 0 , 1 ) ;
101+ const resDataLength = dataBuffer . subarray ( 1 , 5 ) ;
102+ const responseData = dataBuffer . subarray ( 5 ) ;
78103 const grpcStatus = + response . headers [ 'grpc-status' ] ;
79104 if ( grpcStatus !== 0 ) {
80- let errorDecoded = new TextDecoder ( "utf-8" ) . decode ( responseData ) ;
81- if ( errorDecoded !== 'None' ) {
82- errorDecoded = JSON . parse ( errorDecoded . replace ( / ( [ a - z A - Z 0 - 9 _ ] + ) : / g, '"$1":' ) ) ;
83- } else {
84- errorDecoded = { code : grpcStatus , message : getGrpcErrorMessage ( grpcStatus ) } ;
85- }
86- return { grpc_code : grpcStatus , grpc_error : getGrpcErrorMessage ( grpcStatus ) , error : errorDecoded } ;
87- } else {
88- // FIXME: Use decodeDelimited
89- const decodedRes = methodResponse . decode ( responseData ) ;
90- const decodedResObject = methodResponse . toObject ( decodedRes , {
105+ let errorMessage = 'None' ;
106+ try {
107+ errorMessage = decodeURIComponent ( new TextDecoder ( 'utf-8' ) . decode ( responseData ) ) . trim ( ) ;
108+ if ( errorMessage == 'None' ) {
109+ errorMessage = getGrpcErrorMessage ( grpcStatus ) ;
110+ }
111+ } catch ( decodeError ) {
112+ errorMessage = decodeError ;
113+ }
114+ throw new Error ( errorMessage ) ;
115+ }
116+ const decodedRes = methodResponse . decode ( responseData ) ;
117+ const decodedResObject = methodResponse . toObject ( decodedRes , {
91118 longs : String ,
92119 enums : String ,
93120 bytes : Buffer ,
94121 defaults : true ,
95122 arrays : true ,
96123 objects : true ,
97- } ) ;
98- return JSON . parse ( JSON . stringify ( decodedResObject , transformValue ) ) ;
99- }
124+ } ) ;
125+ return JSON . parse ( JSON . stringify ( decodedResObject , transformValue ) ) ;
100126}
101127
102128async function fetchNodeData ( ) {
@@ -120,14 +146,14 @@ async function fetchNodeData() {
120146 console . log ( '\nResponse Decoded:' ) ;
121147 console . dir ( responseJSON , { depth : null , color : true } ) ;
122148 } catch ( error ) {
123- console . error ( '\nResponse Error:\n' , error . response . status , ' - ' , error . response . statusText ) ;
149+ console . error ( '\nResponse Error:\n' , error . response ? .status || error . code , ' - ' , error . response ? .statusText || error . response ?. data || error . message || '' ) ;
124150 }
125151 }
126152 } catch ( error ) {
127153 console . error ( 'Error:' , error . message ) ;
128154 if ( error . response ) {
129- console . error ( 'Error status:' , error . response . status ) ;
130- console . error ( 'Error data:' , error . response . data ) ;
155+ console . error ( 'Error status:' , error . response ? .status || error . code ) ;
156+ console . error ( 'Error data:' , error . response ?. statusText || error . response ?. data || error . message || '' ) ;
131157 }
132158 }
133159}
0 commit comments