Commit 1c8d6c6e authored by Ignacio Corderi's avatar Ignacio Corderi
Browse files

Added clone() support on Session/Channel

parent 9e673635
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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()
}

+6 −6
Original line number Diff line number Diff line
@@ -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()
@@ -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 {
+21 −16
Original line number Diff line number Diff line
@@ -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 {
    
@@ -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() {
+26 −11
Original line number Diff line number Diff line
@@ -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 }
@@ -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
@@ -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, 
@@ -130,7 +145,7 @@ extension KineticSession: CustomReflectable {
                ])
        } else {
            return Mirror(self, children: [
                "id" : self.connectionId,
                "channel" : self.channel,
                ])
        }
    }
+3 −0
Original line number Diff line number Diff line
@@ -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