require 'ipaddr'
require 'tmstd/assertion'
ASSERT = ::TmStd::Assertion
module ConnectionState
class Abstract; end
class Connecting < Abstract
attr_reader :when_connected
def initialize( when_connected)
ASSERT.opt_kind_of ( when_connected, Time )
@when_connected = when_connected
end
end
class Connected < Abstract
class LastPing
attr_reader :time
attr_reader :id
def initialize( time, id)
ASSERT.kind_of ( when_connected, Time )
ASSERT.kind_of ( id, Integer )
@time = time
@id = id
end
end
attr_reader :last_ping
attr_reader :sesseion_id
def initialize( last_ping, sesseion_id)
ASSERT.kind_of ( last_ping, LastPing)
ASSERT.kind_of ( sesseion_id, Integer )
@last_ping = last_ping
@sesseion_id = sesseion_id
end
end
class Disconnected < Abstract
attr_reader :when_disconnected
def initialize( when_disconnected)
ASSERT.opt_kind_of ( when_disconnected, Time )
@when_disconnected = when_disconnected
end
end
end
class ConnectionInfo
attr_reader :connection_state
attr_reader :inet_addr
def initialize( connection_state, inet_addr)
ASSERT.kind_of ( connection_state, ConnectionState::Abstract )
ASSERT.kind_of ( inet_addr, IPAdder)
@connection_state = connection_state
@inet_addr = inet_addr
end
end
cmVxdWlyZSAnaXBhZGRyJwpyZXF1aXJlICd0bXN0ZC9hc3NlcnRpb24nCgpBU1NFUlQgID0gOjpUbVN0ZDo6QXNzZXJ0aW9uCgoKCm1vZHVsZSBDb25uZWN0aW9uU3RhdGUKCWNsYXNzIEFic3RyYWN0OyBlbmQKCgoJY2xhc3MgQ29ubmVjdGluZyA8IEFic3RyYWN0CgkJYXR0cl9yZWFkZXIgOndoZW5fY29ubmVjdGVkCgoJCWRlZiBpbml0aWFsaXplKHdoZW5fY29ubmVjdGVkKQoJCQlBU1NFUlQub3B0X2tpbmRfb2Yod2hlbl9jb25uZWN0ZWQsIFRpbWUpCgoJCQlAd2hlbl9jb25uZWN0ZWQgPSB3aGVuX2Nvbm5lY3RlZAoJCWVuZAoJZW5kCgoKCgljbGFzcyBDb25uZWN0ZWQgPCBBYnN0cmFjdAoJCWNsYXNzIExhc3RQaW5nCgkJCWF0dHJfcmVhZGVyIDp0aW1lCgkJCWF0dHJfcmVhZGVyIDppZAoKCQkJZGVmIGluaXRpYWxpemUodGltZSwgaWQpCgkJCQlBU1NFUlQua2luZF9vZih3aGVuX2Nvbm5lY3RlZCwgVGltZSkKCQkJCUFTU0VSVC5raW5kX29mKGlkLCAgICAgICAgICAgICBJbnRlZ2VyKQoKCQkJCUB0aW1lID0gdGltZQoJCQkJQGlkICAgPSBpZAoJCQllbmQKCQllbmQKCgoKCQlhdHRyX3JlYWRlciA6bGFzdF9waW5nCgkJYXR0cl9yZWFkZXIgOnNlc3NlaW9uX2lkCgoJCWRlZiBpbml0aWFsaXplKGxhc3RfcGluZywgc2Vzc2Vpb25faWQpCgkJCUFTU0VSVC5raW5kX29mKGxhc3RfcGluZywgICBMYXN0UGluZykKCQkJQVNTRVJULmtpbmRfb2Yoc2Vzc2Vpb25faWQsIEludGVnZXIpCgoJCQlAbGFzdF9waW5nICAgPSBsYXN0X3BpbmcKCQkJQHNlc3NlaW9uX2lkID0gc2Vzc2Vpb25faWQKCQllbmQKCWVuZAoKCgoJY2xhc3MgRGlzY29ubmVjdGVkIDwgQWJzdHJhY3QKCQlhdHRyX3JlYWRlciA6d2hlbl9kaXNjb25uZWN0ZWQKCgkJZGVmIGluaXRpYWxpemUod2hlbl9kaXNjb25uZWN0ZWQpCgkJCUFTU0VSVC5vcHRfa2luZF9vZih3aGVuX2Rpc2Nvbm5lY3RlZCwgVGltZSkKCgkJCUB3aGVuX2Rpc2Nvbm5lY3RlZCA9IHdoZW5fZGlzY29ubmVjdGVkCgkJZW5kCgllbmQKZW5kCgoKCmNsYXNzIENvbm5lY3Rpb25JbmZvCglhdHRyX3JlYWRlciA6Y29ubmVjdGlvbl9zdGF0ZQoJYXR0cl9yZWFkZXIgOmluZXRfYWRkcgoKCWRlZiBpbml0aWFsaXplKGNvbm5lY3Rpb25fc3RhdGUsIGluZXRfYWRkcikKCQlBU1NFUlQua2luZF9vZihjb25uZWN0aW9uX3N0YXRlLCBDb25uZWN0aW9uU3RhdGU6OkFic3RyYWN0KQoJCUFTU0VSVC5raW5kX29mKGluZXRfYWRkciwgICAgICAgIElQQWRkZXIpCgoJCUBjb25uZWN0aW9uX3N0YXRlID0gY29ubmVjdGlvbl9zdGF0ZQoJCUBpbmV0X2FkZHIgICAgICAgID0gaW5ldF9hZGRyCgllbmQKZW5kCg==