SwiftWamp 0.3.1

SwiftWamp 0.3.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2017年10月
SwiftSwift 版本3.0
SPM支持 SPM

Dany Sousa 维护。



 
依赖项
SwiftyJSON>= 0
Starscream>= 0
CryptoSwift>= 0
SwiftWebSocket>= 0
 

SwiftWamp 0.3.1

  • Yossi Abraham 和 Dany Sousa

SwiftWamp - Swift WAMP 实现

SwiftWamp 是在 Swift 中实现的 WAMP。
SwiftWamp 基于 Swamp 0.1.0

它目前支持调用和注册远程过程、订阅主题和发布事件。它还支持使用 ticket & wampcra 进行身份验证。

SwiftWamp 0.3.1 使用 WebSockets 作为其唯一的传输方式,并使用 JSON 作为其序列化方法。

欢迎贡献!

要求

iOS 8.0

安装

SwiftWamp 通过 cocoapods 提供。

pod "SwiftWamp"

到您的 Podfile。

用法

连接到路由器

import SwiftWamp

do {
     let url = try "ws://my-router.com:8080/ws".asURL()
     let transport = WebSocketSwampTransport(wsEndpoint: url)

     let session = SwampSession(realm: "router-defined-realm", transport: transport)
     // Set delegate for callbacks
     // swampSession.delegate = <SwampSessionDelegate implementation>

     session.connect()
     session.disconnect()
}
catch {
     print("Invalid url format")
}

使用 SwiftWebSocket 库和压缩连接到路由器

import SwiftWamp

let transport = SwiftWebSocketTransport(wsEndpoint: "ws://my-router.com:8080/ws", compression: true)

let session = SwampSession(realm: "router-defined-realm", transport: transport)
// Set delegate for callbacks
// swampSession.delegate = <SwampSessionDelegate implementation>

session.connect()
session.disconnect()
SwampSession 构造函数参数
  • realm - 要加入的领域
  • transport - 一个 SwampTransport 实现
  • authmethods authid authrole authextra - 查看您的路由器文档并相应使用
连接/断开连接
  • connect() - 建立传输并执行配置的身份验证。
  • disconnect() - 相反。

现在您应该等待您的代理的回调

SwampSessionDelegate 接口

实现以下方法

  • func swampSessionHandleChallenge(authMethod: String, extra: [String: Any]) -> String
    • 当收到挑战请求时触发。
    • 您可以通过返回 SwampCraAuthHelper.sign("your-secret", extra["challenge"] as! String) 来支持 wampcra 身份验证方法。
  • func swampSessionConnected(session: SwampSession, sessionId: Int)
  • 一次会话建立并验证会话,并成功加入领域后触发。 (即您现在可以调用、订阅和发布了。)
  • func swampSessionEnded(reason: String)
  • 连接结束时会触发。
  • reason通常是 WAMP 领域错误,但它也可以是发生了什么的文本描述

让我们开始使用它!

  • 一般注意:许多回调函数接收 args-kwargs 对,检查您其他客户端实现以查看哪个被利用,并相应地进行操作。
  • 许多回调函数接收可选队列参数,它用于使用异步 DispatchQueue 进行回调。
订阅主题

订阅可能会触发三个回调

  • onSuccess - 如果订阅成功。
  • onError - 如果没有成功。
  • onEvent - 如果成功,这是当实际事件发布时触发的。
签名
public func subscribe(_ topic: String,
                        options: [String: Any] = [:],
                        using queue: DispatchQueue = .main,
                        onSuccess: @escaping SubscribeCallback,
                        onError: @escaping ErrorSubscribeCallback,
                        onEvent: @escaping EventCallback)
简单用例
session.subscribe("wamp.topic", onSuccess: { subscription in
    // subscription can be stored for subscription.cancel()
    }, onError: { details, error in

    }, onEvent: { details, results, kwResults in
        // Event data is usually in results, but manually check blabla yadayada
    })
完整用例
session.subscribe("wamp.topic", options: ["disclose_me": true],
    onSuccess: { subscription in
        // subscription can be stored for subscription.cancel()
    }, onError: { details, error in
        // handle error
    }, onEvent: { details, results, kwResults in
        // Event data is usually in results, but manually check blabla yadayada
    })
发布事件

发布可以是无需回调(即不确认)的,也可以使用以下两个回调

  • onSuccess - 如果发布成功。
  • onError - 如果没有成功。
签名
// without acknowledging
public func publish(_ topic: String,
                      options: [String: Any] = [:],
                      args: [Any]? = nil,
                      kwargs: [String: Any]? = nil,
                      using queue: DispatchQueue = .main)
// with acknowledging
public func publish(_ topic: String,
                      options: [String: Any] = [:],
                      args: [Any]? = nil,
                      kwargs: [String: Any]? = nil,
                      using queue: DispatchQueue = .main,
                      onSuccess: @escaping PublishCallback,
                      onError: @escaping ErrorPublishCallback)
简单用例
session.publish("wamp.topic", args: [1, "argument2"])
完整用例
session.publish("wamp.topic", options: ["disclose_me": true],  args: [1, "argument2"], kwargs: ["arg1": 1, "arg2": "argument2"],
    onSuccess: {
        // Publication has been published!
    }, onError: { details, error in
        // Handle error (What can it be except wamp.error.not_authorized?)
    })
调用远程过程

调用可能触发两个回调

  • onSuccess - 如果调用完成且没有错误。
  • onError - 如果调用失败。 (在路由器或对等客户端中。)
签名
public func call(_ proc: String,
                   options: [String: Any] = [:],
                   args: [Any]? = nil,
                   kwargs: [String: Any]? = nil,
                   using queue: DispatchQueue = .main,
                   onSuccess: @escaping CallCallback,
                   onError: @escaping ErrorCallCallback)
简单用例
session.call("wamp.procedure", args: [1, "argument1"],
    onSuccess: { details, results, kwResults in
        // Usually result is in results[0], but do a manual check in your infrastructure
    },
    onError: { details, error, args, kwargs in
        // Handle your error here (You can ignore args kwargs in most cases)
    })
完整用例
session.call("wamp.procedure", options: ["disclose_me": true], args: [1, "argument1"], kwargs: ["arg1": 1, "arg2": "argument2"],
    onSuccess: { details, results, kwResults in
        // Usually result is in results[0], but do a manual check in your infrastructure
    },
    onError: { details, error, args, kwargs in
        // Handle your error here (You can ignore args kwargs in most cases)
    })
注册远程过程

调用可能触发三个回调

  • onSuccess - 如果注册完成且没有错误。
  • onError - 如果注册失败。 (在路由器或对等客户端中。)
  • onFire - 已注册的函数
签名
public func register(_ proc: String,
                          options: [String: Any] = [:],
                          using queue: DispatchQueue = .main,
                          onSuccess: @escaping RegisterCallback,
                          onError: @escaping ErrorRegisterCallback,
                          onFire: @escaping SwampProc)
简单用例
session.register("wamp.procedure",
    onSuccess: { details, results, kwResults in
        // Usually result is in results[0], but do a manual check in your infrastructure
    },
    onError: { details, error, args, kwargs in
        // Handle your error here (You can ignore args kwargs in most cases)
    },
    onFire: { details, args, kwargs in
        // Make your great code to execute when someone called your procedure here
    },
)

测试

目前,只有针对crossbar的集成测试。我计划将来添加单元测试。

为了运行测试

  1. 安装 Crossbar
  2. 在您的shell中输入
cd SwiftWamp_clone_location/
pod install
cd SwiftWampTests/CrossbarInstanceTest
crossbar start
  1. 打开 SwiftWamp.xcworkspace
  2. 运行测试!(产品 -> 测试 或 ⌘U)

故障排除

如果测试因某种原因失败,请确保

  • 您已安装并运行Crossbar
  • 您的机器上有一个可用的8080端口

路线图

  1. 更健壮的代码库和错误处理
  2. 干净的日志系统
  3. 超时发布选项/重试
  4. MessagePack & 原始套接字
  5. 更通用和舒适的API
  6. 高级配置特性

作者

许可证

MIT因为它是默认的: tldrlegal