diff --git a/Sources/ElixxirDAppsSDK/MessageListener.swift b/Sources/ElixxirDAppsSDK/MessageListener.swift
index bed6b8c10517be2fd6d073f2e32b8d941436a795..dc2bfd1ce9a7c8b1ec55cf29ee457a0c450398a4 100644
--- a/Sources/ElixxirDAppsSDK/MessageListener.swift
+++ b/Sources/ElixxirDAppsSDK/MessageListener.swift
@@ -1,12 +1,12 @@
 import Bindings
 
 public struct MessageListener {
-  public var listen: (Int, String, @escaping (Data) -> Void) -> Void
+  public var listen: (Int, String, @escaping (Message) -> Void) -> Void
 
   public func callAsFunction(
     messageType: Int,
     listenerName: String = "MessageListener",
-    callback: @escaping (Data) -> Void
+    callback: @escaping (Message) -> Void
   ) {
     listen(messageType, listenerName, callback)
   }
@@ -39,18 +39,25 @@ extension MessageListener {
 }
 
 private class Listener: NSObject, BindingsListenerProtocol {
-  init(listenerName: String, onHear: @escaping (Data) -> Void) {
+  init(listenerName: String, onHear: @escaping (Message) -> Void) {
     self.listenerName = listenerName
     self.onHear = onHear
     super.init()
   }
 
   let listenerName: String
-  let onHear: (Data) -> Void
+  let onHear: (Message) -> Void
+  let decoder = JSONDecoder()
 
   func hear(_ item: Data?) {
-    guard let item = item else { return }
-    onHear(item)
+    guard let item = item else {
+      fatalError("BindingsListenerProtocol.hear received `nil`")
+    }
+    do {
+      onHear(try decoder.decode(Message.self, from: item))
+    } catch {
+      fatalError("Message decoding failed with error: \(error)")
+    }
   }
 
   func name() -> String {