diff --git a/indexedDb/impl/channels/callbacks.go b/indexedDb/impl/channels/callbacks.go index 9ec0f4503bc99ce8328905736ebb48c175b38fb3..df560535a779f2e6c355c6e49a66d4b45c2047e2 100644 --- a/indexedDb/impl/channels/callbacks.go +++ b/indexedDb/impl/channels/callbacks.go @@ -77,7 +77,7 @@ func (m *manager) newWASMEventModelCB(data []byte) ([]byte, error) { return []byte(err.Error()), nil } - return nil, nil + return []byte{}, nil } // messageReceivedCallback sends calls to the channels.MessageReceivedCallback diff --git a/indexedDb/impl/dm/callbacks.go b/indexedDb/impl/dm/callbacks.go index a2deba1774d8c3936340a86170349def554ad705..5fe03874609ddfb4c92a4680494ac6c475568ae3 100644 --- a/indexedDb/impl/dm/callbacks.go +++ b/indexedDb/impl/dm/callbacks.go @@ -74,7 +74,7 @@ func (m *manager) newWASMEventModelCB(data []byte) ([]byte, error) { return []byte(err.Error()), nil } - return nil, nil + return []byte{}, nil } // messageReceivedCallback sends calls to the MessageReceivedCallback in the diff --git a/indexedDb/worker/channels/init.go b/indexedDb/worker/channels/init.go index 0fa2fd566c50625af3d623eb3383a04bb035134d..2ee630caf43177460a19f14d2b953d3a03b9c687 100644 --- a/indexedDb/worker/channels/init.go +++ b/indexedDb/worker/channels/init.go @@ -121,7 +121,7 @@ func NewWASMEventModel(path, wasmJsPath string, encryption cryptoChannel.Cipher, select { case data := <-dataChan: - if data != nil { + if len(data) > 0 { return nil, errors.New(string(data)) } case <-time.After(worker.ResponseTimeout): diff --git a/indexedDb/worker/dm/init.go b/indexedDb/worker/dm/init.go index d8e905bed513f4bb44d0920ee18d75be7e3877e2..3fd1cd13897bdc8684e2efc13750e1fed20ff000 100644 --- a/indexedDb/worker/dm/init.go +++ b/indexedDb/worker/dm/init.go @@ -89,7 +89,7 @@ func NewWASMEventModel(path, wasmJsPath string, encryption cryptoChannel.Cipher, select { case data := <-dataChan: - if data != nil { + if len(data) > 0 { return nil, errors.New(string(data)) } case <-time.After(worker.ResponseTimeout): diff --git a/wasm/dm.go b/wasm/dm.go index 368e3f3cc43f18164858c3e97d7b2dfc82703ed0..18df8ec80e20d4f028a171978462c058ba576062 100644 --- a/wasm/dm.go +++ b/wasm/dm.go @@ -531,6 +531,77 @@ func (dmc *DMClient) GetDatabaseName(js.Value, []js.Value) any { "_speakeasy_dm" } +//////////////////////////////////////////////////////////////////////////////// +// DM Share URL // +//////////////////////////////////////////////////////////////////////////////// + +// DMShareURL is returned from [DMClient.GetShareURL]. It includes the +// user's share URL. +// +// JSON example for a user: +// +// { +// "url": "https://internet.speakeasy.tech/?l=32&m=5&p=EfDzQDa4fQ5BoqNIMbECFDY9ckRr_fadd8F1jE49qJc%3D&t=4231817746&v=1", +// "password": "hunter2", +// } +type DMShareURL struct { + URL string `json:"url"` + Password string `json:"password"` +} + +// DMUser is returned from [DecodeDMShareURL]. It includes the token +// and public key of the user who created the URL. +// +// JSON example for a user: +// +// { +// "token": 4231817746, +// "publicKey": "EfDzQDa4fQ5BoqNIMbECFDY9ckRr/fadd8F1jE49qJc=" +// } +type DMUser struct { + Token int32 `json:"token"` + PublicKey []byte `json:"publicKey"` +} + +// GetShareURL generates a URL that can be used to share a URL to initiate a +// direct messages with this user. +// +// Parameters: +// - args[0] - The URL to append the DM info to (string). +// +// Returns: +// - JSON of [DMShareURL] (Uint8Array). +func (dmc *DMClient) GetShareURL(_ js.Value, args []js.Value) any { + host := args[0].String() + urlReport, err := dmc.api.GetShareURL(host) + if err != nil { + utils.Throw(utils.TypeError, err) + return nil + } + + return utils.CopyBytesToJS(urlReport) +} + +// DecodeDMShareURL decodes the user's URL into a [DMUser]. +// +// Parameters: +// - args[0] - The user's share URL. Should be received from another user or +// generated via [DMClient.GetShareURL] (string). +// +// Returns: +// - JSON of [DMUser] (Uint8Array). +func DecodeDMShareURL(_ js.Value, args []js.Value) any { + + url := args[0].String() + report, err := bindings.DecodeDMShareURL(url) + if err != nil { + utils.Throw(utils.TypeError, err) + return nil + } + + return utils.CopyBytesToJS(report) +} + //////////////////////////////////////////////////////////////////////////////// // Channel Receiving Logic and Callback Registration // ////////////////////////////////////////////////////////////////////////////////