diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift
index f665ace4af861b01e7e7962d1ccf6e3b83fbcea1..4732eccf5d7792700211c1a9d152f280f89d9584 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift
@@ -3,20 +3,7 @@ import XCTestDynamicOverlay
 import XXClient
 
 public struct MessengerSendFile {
-  public struct CallbackData {
-    public init(
-      transferId: Data,
-      result: Result<FileTransferProgressCallback.Callback, NSError>
-    ) {
-      self.transferId = transferId
-      self.result = result
-    }
-
-    public var transferId: Data
-    public var result: Result<FileTransferProgressCallback.Callback, NSError>
-  }
-
-  public typealias Callback = (CallbackData) -> Void
+  public typealias Callback = (Data, XXClient.Progress) -> Void
 
   public enum Error: Swift.Error, Equatable {
     case notConnected
@@ -25,7 +12,7 @@ public struct MessengerSendFile {
   public var run: (FileTransferSend.Params, @escaping Callback) throws -> Void
 
   public func callAsFunction(
-    params: FileTransferSend.Params,
+    _ params: FileTransferSend.Params,
     callback: @escaping Callback
   ) throws -> Void {
     try run(params, callback)
@@ -44,33 +31,37 @@ extension MessengerSendFile {
           e2eFileTransferParamsJSON: env.getE2EFileTransferParams(),
           fileTransferParamsJSON: env.getFileTransferParams()
         ),
-        callback: .unimplemented
+        callback: ReceiveFileCallback { _ in
+          fatalError("Bindings issue: ReceiveFileCallback called when sending file.")
+        }
       )
       let semaphore = DispatchSemaphore(value: 0)
-      var transferId: Data! = nil
+      var transferId: Data!
+      var error: Swift.Error?
       transferId = try fileTransfer.send(
         params: params,
         callback: FileTransferProgressCallback { result in
-          callback(CallbackData(
-            transferId: transferId,
-            result: result
-          ))
+          guard let transferId else {
+            fatalError("Bindings issue: file transfer progress callback was called before send function returned transfer id.")
+          }
           switch result {
-          case .failure(_):
-
+          case .failure(let err):
+            error = err
             semaphore.signal()
-          case .success(let callback):
-            if callback.progress.error != nil {
 
-            }
-            if callback.progress.completed {
+          case .success(let cb):
+            callback(transferId, cb.progress)
+            if cb.progress.completed || cb.progress.error != nil {
               semaphore.signal()
             }
           }
         }
       )
       semaphore.wait()
-      try? fileTransfer.closeSend(transferId: transferId)
+      try fileTransfer.closeSend(transferId: transferId)
+      if let error {
+        throw error
+      }
     }
   }
 }