Loading Kinetic/Channel.swift +1 −1 Original line number Diff line number Diff line Loading @@ -23,9 +23,9 @@ public protocol KineticChannel { var error: ErrorType? { get } var connected: Bool { get } func connect() -> KineticSession func send(builder: Builder) throws func receive() throws -> RawResponse func clone() -> KineticSession func close() } Loading Kinetic/Core.swift +6 −6 Original line number Diff line number Diff line Loading @@ -24,9 +24,9 @@ typealias Message = Com.Seagate.Kinetic.Proto.Message_ typealias Command = Com.Seagate.Kinetic.Proto.Command public class Builder { var message: Message.Builder var command: Command.Builder var value: Bytes? internal var message: Message.Builder internal var command: Command.Builder internal var value: Bytes? internal init() { self.message = Message.Builder() Loading Loading @@ -54,9 +54,9 @@ extension Builder { } public struct RawResponse { var message: Message var command: Command var value: Bytes? internal var message: Message internal var command: Command internal var value: Bytes? } public protocol ChannelCommand { Loading Kinetic/NetworkChannel.swift +21 −16 Original line number Diff line number Diff line Loading @@ -20,10 +20,7 @@ // @author: Ignacio Corderi public func connect(host:String, port:Int) -> KineticSession { let c = NetworkChannel(host: host, port: port) return c.connect() } public let connect = NetworkChannel.connect public class NetworkChannel: CustomStringConvertible, KineticChannel, StreamChannel { Loading @@ -38,32 +35,40 @@ public class NetworkChannel: CustomStringConvertible, KineticChannel, StreamChan public var description: String { return "Channel \(self.host):\(self.port)" } // KineticChannel public var error: ErrorType? = nil weak public private(set) var session: KineticSession? = nil public private(set) var error: ErrorType? = nil public var connected: Bool { return self.inp != nil && self.out != nil } init(host:String, port:Int) { internal init(host:String, port:Int) { self.host = host self.port = port } public func connect() -> KineticSession { NSStream.getStreamsToHostWithName(self.host, port: self.port, inputStream: &self.inp, outputStream: &self.out) public static func connect(host: String, port: Int) -> KineticSession { let c = NetworkChannel(host: host, port: port) NSStream.getStreamsToHostWithName(host, port: port, inputStream: &c.inp, outputStream: &c.out) self.inp!.open() self.out!.open() c.inp!.open() c.out!.open() var device:KineticDevice? = nil do { let (msg, _) = try self.rawReceive() let device = KineticDevice(handshake: try Command.parseFromData(msg.commandBytes)) return KineticSession(channel: self, device: device) let (msg, _) = try c.rawReceive() device = KineticDevice(handshake: try Command.parseFromData(msg.commandBytes)) } catch let err { self.error = err c.error = err } let s = KineticSession(channel: c, device: device) c.session = s return s } return KineticSession(channel: self, device: nil) public func clone() -> KineticSession { return NetworkChannel.connect(self.host, port: self.port) } public func close() { Loading Kinetic/Session.swift +26 −11 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ // @author: Ignacio Corderi /// Contains information about a kinetic device public struct KineticDevice { public struct KineticDevice : Equatable { internal let handshake: Command public var clusterVersion: Int64 { return self.handshake.header.clusterVersion } Loading @@ -35,27 +35,42 @@ public struct KineticDevice { } } public func ==(lhs: KineticDevice, rhs: KineticDevice) -> Bool { return lhs.wwn == rhs.wwn } /// Represents a session against a kinetic device public class KineticSession { public var device: KineticDevice? public var connectionId: Int64? { return self.device?.handshake.header.connectionId } public var credentials: AuthenticationCredential var sequence: Int64 var channel: KineticChannel // Surface convenient channel operations public private(set) var device: KineticDevice? public private(set) var credentials: AuthenticationCredential public var connectionId: Int64? { return self.device?.handshake.header.connectionId } public var connected: Bool { return self.channel.connected } public func close() { self.channel.close() } init(channel: KineticChannel, device: KineticDevice?){ self.channel = channel self.device = device public func clone() -> KineticSession { return self.channel.clone() } internal init(channel: KineticChannel, device: KineticDevice?){ self.credentials = HmacCredential.defaultCredentials() self.sequence = 0 self.channel = channel self.device = device } internal convenience init(withCredentials channel: KineticChannel, device: KineticDevice?, credentials: AuthenticationCredential){ self.init(channel: channel, device: device) self.credentials = credentials } /// Sends a command to the target device and waits for a response Loading Loading @@ -121,7 +136,7 @@ extension KineticDevice: CustomReflectable { extension KineticSession: CustomReflectable { public func customMirror() -> Mirror { if self.connected { if self.connectionId != nil { return Mirror(self, children: [ "id" : self.connectionId!, "sequence" : self.sequence, Loading @@ -130,7 +145,7 @@ extension KineticSession: CustomReflectable { ]) } else { return Mirror(self, children: [ "id" : self.connectionId, "channel" : self.channel, ]) } } Loading examples/Example 1 - Hello World.playground/Contents.swift +3 −0 Original line number Diff line number Diff line Loading @@ -15,3 +15,6 @@ let x = try c.get("hello") //: the actual values are byte arrays `[UInt8]` print("Received: \(String.fromUtf8(x.value!))") //: We are done c.close() c.connected No newline at end of file Loading
Kinetic/Channel.swift +1 −1 Original line number Diff line number Diff line Loading @@ -23,9 +23,9 @@ public protocol KineticChannel { var error: ErrorType? { get } var connected: Bool { get } func connect() -> KineticSession func send(builder: Builder) throws func receive() throws -> RawResponse func clone() -> KineticSession func close() } Loading
Kinetic/Core.swift +6 −6 Original line number Diff line number Diff line Loading @@ -24,9 +24,9 @@ typealias Message = Com.Seagate.Kinetic.Proto.Message_ typealias Command = Com.Seagate.Kinetic.Proto.Command public class Builder { var message: Message.Builder var command: Command.Builder var value: Bytes? internal var message: Message.Builder internal var command: Command.Builder internal var value: Bytes? internal init() { self.message = Message.Builder() Loading Loading @@ -54,9 +54,9 @@ extension Builder { } public struct RawResponse { var message: Message var command: Command var value: Bytes? internal var message: Message internal var command: Command internal var value: Bytes? } public protocol ChannelCommand { Loading
Kinetic/NetworkChannel.swift +21 −16 Original line number Diff line number Diff line Loading @@ -20,10 +20,7 @@ // @author: Ignacio Corderi public func connect(host:String, port:Int) -> KineticSession { let c = NetworkChannel(host: host, port: port) return c.connect() } public let connect = NetworkChannel.connect public class NetworkChannel: CustomStringConvertible, KineticChannel, StreamChannel { Loading @@ -38,32 +35,40 @@ public class NetworkChannel: CustomStringConvertible, KineticChannel, StreamChan public var description: String { return "Channel \(self.host):\(self.port)" } // KineticChannel public var error: ErrorType? = nil weak public private(set) var session: KineticSession? = nil public private(set) var error: ErrorType? = nil public var connected: Bool { return self.inp != nil && self.out != nil } init(host:String, port:Int) { internal init(host:String, port:Int) { self.host = host self.port = port } public func connect() -> KineticSession { NSStream.getStreamsToHostWithName(self.host, port: self.port, inputStream: &self.inp, outputStream: &self.out) public static func connect(host: String, port: Int) -> KineticSession { let c = NetworkChannel(host: host, port: port) NSStream.getStreamsToHostWithName(host, port: port, inputStream: &c.inp, outputStream: &c.out) self.inp!.open() self.out!.open() c.inp!.open() c.out!.open() var device:KineticDevice? = nil do { let (msg, _) = try self.rawReceive() let device = KineticDevice(handshake: try Command.parseFromData(msg.commandBytes)) return KineticSession(channel: self, device: device) let (msg, _) = try c.rawReceive() device = KineticDevice(handshake: try Command.parseFromData(msg.commandBytes)) } catch let err { self.error = err c.error = err } let s = KineticSession(channel: c, device: device) c.session = s return s } return KineticSession(channel: self, device: nil) public func clone() -> KineticSession { return NetworkChannel.connect(self.host, port: self.port) } public func close() { Loading
Kinetic/Session.swift +26 −11 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ // @author: Ignacio Corderi /// Contains information about a kinetic device public struct KineticDevice { public struct KineticDevice : Equatable { internal let handshake: Command public var clusterVersion: Int64 { return self.handshake.header.clusterVersion } Loading @@ -35,27 +35,42 @@ public struct KineticDevice { } } public func ==(lhs: KineticDevice, rhs: KineticDevice) -> Bool { return lhs.wwn == rhs.wwn } /// Represents a session against a kinetic device public class KineticSession { public var device: KineticDevice? public var connectionId: Int64? { return self.device?.handshake.header.connectionId } public var credentials: AuthenticationCredential var sequence: Int64 var channel: KineticChannel // Surface convenient channel operations public private(set) var device: KineticDevice? public private(set) var credentials: AuthenticationCredential public var connectionId: Int64? { return self.device?.handshake.header.connectionId } public var connected: Bool { return self.channel.connected } public func close() { self.channel.close() } init(channel: KineticChannel, device: KineticDevice?){ self.channel = channel self.device = device public func clone() -> KineticSession { return self.channel.clone() } internal init(channel: KineticChannel, device: KineticDevice?){ self.credentials = HmacCredential.defaultCredentials() self.sequence = 0 self.channel = channel self.device = device } internal convenience init(withCredentials channel: KineticChannel, device: KineticDevice?, credentials: AuthenticationCredential){ self.init(channel: channel, device: device) self.credentials = credentials } /// Sends a command to the target device and waits for a response Loading Loading @@ -121,7 +136,7 @@ extension KineticDevice: CustomReflectable { extension KineticSession: CustomReflectable { public func customMirror() -> Mirror { if self.connected { if self.connectionId != nil { return Mirror(self, children: [ "id" : self.connectionId!, "sequence" : self.sequence, Loading @@ -130,7 +145,7 @@ extension KineticSession: CustomReflectable { ]) } else { return Mirror(self, children: [ "id" : self.connectionId, "channel" : self.channel, ]) } } Loading
examples/Example 1 - Hello World.playground/Contents.swift +3 −0 Original line number Diff line number Diff line Loading @@ -15,3 +15,6 @@ let x = try c.get("hello") //: the actual values are byte arrays `[UInt8]` print("Received: \(String.fromUtf8(x.value!))") //: We are done c.close() c.connected No newline at end of file