 					}
 					semaphore.signal()
 				}
-				disposable += { progress?.cancel() }
+				transferDisposable += { progress?.cancel() }
 				eventObserver.observe(.transferStarted(resourceRequest, peer, progress))
 				semaphore.wait()
 			}
-			disposable += { item.cancel() }
+			transferDisposable += { item.cancel() }
 			transferQueue.async(execute: item)
 		}
 
-		receipt.disposable += disposable
-
-		return receipt
+		return ResourceRequestReceipt(request: resourceRequest, peers: peers, transferDisposable: transferDisposable)
 	}
 
 	public func submitResourceRequest(withName resourceName: String, at localURL: URL, to peers: [MCPeerID], eventHandler: @escaping (ResourceEvent<ResourceRequest>) -> Void = { _ in }) throws -> ResourceRequestReceipt<ResourceRequest> {

	public let request: Request
	public let peers: [Peer]

	let disposable = CompositeDisposable()

	init(request: Request, peers: [Peer]) {
		self.request = request
		self.peers = peers
	}

	public var isDisposed: Bool {
		return disposable.isDisposed
	}

	public func dispose() {
		disposable.dispose()
	}
}



		try send(resourceRequest, to: peers)

		let transferQueue = DispatchQueue(label: "com.junpluse.Tuka.Session.ResourceTransferQueue")
		let transferDisposable = CompositeDisposable()

		peers.forEach { peer in
			let item = DispatchWorkItem { [mcSession] in
