 
     // MARK: Caller role
     open func call(_ proc: String, options: [String: Any]=[:], args: [Any]?=nil, kwargs: [String: Any]?=nil, onSuccess: @escaping CallCallback, onError: @escaping ErrorCallCallback) {
-        let callRequestId = self.generateRequestId()
-        // Tell router to dispatch call
-        self.sendMessage(CallSwampMessage(requestId: callRequestId, options: options, proc: proc, args: args, kwargs: kwargs))
-        // Store request ID to handle result
-        self.callRequests[callRequestId] = (callback: onSuccess, errorCallback: onError )
+        
+        self.requestQueue.async {
+            let callRequestId = self.generateRequestId()
+            // Tell router to dispatch call
+            self.sendMessage(CallSwampMessage(requestId: callRequestId, options: options, proc: proc, args: args, kwargs: kwargs))
+            // Store request ID to handle result
+            self.callRequests[callRequestId] = (callback: onSuccess, errorCallback: onError )
+        }
     }
 
     // MARK: Callee role

            if let (callback, _) = self.callRequests.removeValue(forKey: requestId) {
                callback(message.details, message.results, message.kwResults)
            } else {
                // TODO: log this erroneous situation
            }
        // MARK: Subscribe role
        case let message as SubscribedSwampMessage:

    internal let subscription: Int
    internal let eventCallback: EventCallback
    fileprivate var isActive: Bool = true
    
    internal init(session: SwampSession, subscription: Int, onEvent: @escaping EventCallback) {
        self.session = session
        self.subscription = subscription
