@@ -90,18 +90,32 @@ func main() {
9090 }
9191
9292 // Setup JS callbacks.
93- callbacks := js .ValueOf (make (map [string ]interface {}))
94- callbacks .Set ("wasmClientIsReady" , js .FuncOf (wc .IsReady ))
95- callbacks .Set ("wasmClientConnectServer" , js .FuncOf (wc .ConnectServer ))
96- callbacks .Set ("wasmClientIsConnected" , js .FuncOf (wc .IsConnected ))
97- callbacks .Set ("wasmClientDisconnect" , js .FuncOf (wc .Disconnect ))
98- callbacks .Set ("wasmClientInvokeRPC" , js .FuncOf (wc .InvokeRPC ))
99- callbacks .Set ("wasmClientStatus" , js .FuncOf (wc .Status ))
100- callbacks .Set ("wasmClientGetExpiry" , js .FuncOf (wc .GetExpiry ))
101- callbacks .Set ("wasmClientHasPerms" , js .FuncOf (wc .HasPermissions ))
102- callbacks .Set ("wasmClientIsReadOnly" , js .FuncOf (wc .IsReadOnly ))
103- callbacks .Set ("wasmClientIsCustom" , js .FuncOf (wc .IsCustom ))
104- js .Global ().Set (cfg .NameSpace , callbacks )
93+ callbacks := make (map [string ]interface {})
94+ callbacks ["wasmClientIsReady" ] = js .FuncOf (wc .IsReady )
95+ callbacks ["wasmClientConnectServer" ] = js .FuncOf (wc .ConnectServer )
96+ callbacks ["wasmClientIsConnected" ] = js .FuncOf (wc .IsConnected )
97+ callbacks ["wasmClientDisconnect" ] = js .FuncOf (wc .Disconnect )
98+ callbacks ["wasmClientInvokeRPC" ] = js .FuncOf (wc .InvokeRPC )
99+ callbacks ["wasmClientStatus" ] = js .FuncOf (wc .Status )
100+ callbacks ["wasmClientGetExpiry" ] = js .FuncOf (wc .GetExpiry )
101+ callbacks ["wasmClientHasPerms" ] = js .FuncOf (wc .HasPermissions )
102+ callbacks ["wasmClientIsReadOnly" ] = js .FuncOf (wc .IsReadOnly )
103+ callbacks ["wasmClientIsCustom" ] = js .FuncOf (wc .IsCustom )
104+
105+ // Check if a JS object for the namespace already exists on the global
106+ // scope.
107+ nsObj := js .Global ().Get (cfg .NameSpace )
108+ if ! isEmptyObject (nsObj ) {
109+ // If it exists, set the callbacks on the existing object. This
110+ // prevents overwriting the existing object, removing any
111+ // vars/funcs that may have been set by the user.
112+ for cb , name := range callbacks {
113+ nsObj .Set (cb , name )
114+ }
115+ } else {
116+ // If not, create the JS object and set the callbacks.
117+ js .Global ().Set (cfg .NameSpace , js .ValueOf (callbacks ))
118+ }
105119
106120 for _ , registration := range litclient .Registrations {
107121 registration (wc .registry )
@@ -572,7 +586,17 @@ func parseKeys(onLocalPrivCreate, localPrivKey, remotePubKey string) (
572586}
573587
574588func callJsCallback (callbackName string , value string ) error {
575- retValue := js .Global ().Call (callbackName , value )
589+ // callbackName can be in the form of "namespace.callbackName" or just
590+ // "callbackName". If it is in the former form, we need to get the
591+ // namespace object and call the callback on that object.
592+ jsScope := js .Global ()
593+ parts := strings .Split (callbackName , "." )
594+ if len (parts ) > 1 {
595+ jsScope = jsScope .Get (parts [0 ])
596+ callbackName = parts [1 ]
597+ }
598+
599+ retValue := jsScope .Call (callbackName , value )
576600
577601 if isEmptyObject (retValue ) || isEmptyObject (retValue .Get ("err" )) {
578602 return nil
0 commit comments