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                          //
 ////////////////////////////////////////////////////////////////////////////////