Files
sonr/internal/dwn/middleware/jsexc/credentials.go
T
Prad NukalaandGitHub 2c1cf56e3c feature/driver indexed db (#14)
* fix: update commitizen version

* feat: add WASM build tags to db actions

* feat: Update all actions to follow `AddAsset` for error handling

* feat: remove database dependency in dwn and motr commands

* feat: add basic info form to registration view

* feat: implement basic browser navigation component

* refactor: move database related files to middleware

* fix: remove unused test command

* fix: update source directory for buf-publish workflow

* feat: embed dwn config data

* feat: add Sync RPC to query service

* refactor: rename  package to  for better organization

* feat: add new javascript exception handling for server requests

* refactor: move dwn.wasm to embed directory

* refactor: move server files to a new directory

* refactor: move session related code to client package

* refactor: Update dwn.wasm build path

* refactor: move dwn wasm build to vfs

* feat: introduce config loading middleware

* feat: introduce DWN config and address JSON

* refactor: move dwn wasm build output to embed directory

* feat: introduce  config and IndexedDB model

* refactor: move DWN config file generation to vfs

* refactor: move config package to

* feat: add Sonr.ID IPFS gateway proxy

* feat: add SWT data structure

* feat: update index.html to use Sonr styles and scripts

* feat(dwn): remove index.html server endpoint

* feat: add Navigator API for web credential management
2024-09-18 02:22:17 -04:00

73 lines
1.7 KiB
Go

//go:build js && wasm
// +build js,wasm
package jsexc
import (
"errors"
"syscall/js"
"github.com/labstack/echo/v4"
)
type Navigator struct {
echo.Context
navigator js.Value
hasCredentials bool
}
func NewNavigator(c echo.Context) *Navigator {
navigator := js.Global().Get("navigator")
credentials := navigator.Get("credentials")
hasCredentials := !credentials.IsUndefined()
return &Navigator{
Context: c,
navigator: navigator,
hasCredentials: hasCredentials,
}
}
func (c *Navigator) CreateCredential(options js.Value) (js.Value, error) {
if !c.hasCredentials {
return js.Null(), errors.New("navigator.credentials is undefined")
}
promise := c.navigator.Get("credentials").Call("create", map[string]interface{}{"publicKey": options})
result, err := awaitPromise(promise)
return result, err
}
func (c *Navigator) GetCredential(options js.Value) (js.Value, error) {
if !c.hasCredentials {
return js.Null(), errors.New("navigator.credentials is undefined")
}
promise := c.navigator.Get("credentials").Call("get", map[string]interface{}{"publicKey": options})
result, err := awaitPromise(promise)
return result, err
}
func awaitPromise(promise js.Value) (js.Value, error) {
done := make(chan struct{})
var result js.Value
var err error
thenFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
result = args[0]
close(done)
return nil
})
catchFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
err = errors.New(args[0].String())
close(done)
return nil
})
defer thenFunc.Release()
defer catchFunc.Release()
promise.Call("then", thenFunc).Call("catch", catchFunc)
<-done
return result, err
}