     fileprivate var serializer: SwampSerializer?
     fileprivate var sessionId: Int?
     fileprivate var routerSupportedRoles: [SwampRole]?
+
+    // MARK: serial queue for issuing requests (call, subscribe, unsubscribe)
+    fileprivate let requestQueue = DispatchQueue(label: "swamp.requestQueue")
 
     // MARK: Call role
     //                         requestId

    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

            if let (callback, _) = self.callRequests.removeValue(forKey: requestId) {
                callback(message.details, message.results, message.kwResults)
            } else {
                print("No callback found for request ID \(requestId)")
            }
        // MARK: Subscribe role
        case let message as SubscribedSwampMessage:
