gossiperl_client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,73 @@
1
+ # encoding: ascii-8bit
2
+ require 'logger'
3
+ module Gossiperl
4
+ module Client
5
+ class OverlayWorker < Gossiperl::Client::Resolution
6
+
7
+ field :options, Hash
8
+ field :supervisor, Gossiperl::Client::Supervisor
9
+ field :messaging, Gossiperl::Client::Messaging
10
+ field :state, Gossiperl::Client::State
11
+ field :working, [FalseClass,TrueClass]
12
+ field :logger, Logger
13
+
14
+ def initialize supervisor, options, block
15
+ raise ArgumentError.new('Supervisor must be of type Supervisor.') unless supervisor.is_a?(::Gossiperl::Client::Supervisor)
16
+ raise ArgumentError.new('Callback must be a Proc / block.') unless block.nil? or block.is_a?(Proc)
17
+ ::Gossiperl::Client::Util::Validation.validate_connect( options )
18
+ self.supervisor = supervisor
19
+ self.options = options
20
+ self.working = true
21
+ @callback_block = block
22
+ if options.has_key?(:logger)
23
+ self.logger - options[:logger]
24
+ else
25
+ self.logger = Logger.new(STDOUT)
26
+ self.logger.level = Logger::DEBUG
27
+ end
28
+ end
29
+
30
+ def start
31
+ self.messaging = Gossiperl::Client::Messaging.new(self)
32
+ self.state = Gossiperl::Client::State.new(self)
33
+ [self.messaging.start, self.state.start].each {|worker|
34
+ worker.join
35
+ }
36
+ end
37
+
38
+ def stop
39
+ self.messaging.digest_exit
40
+ while self.state.connected
41
+ sleep 0.1
42
+ end
43
+ end
44
+
45
+ def current_state
46
+ return :connected if self.state.connected
47
+ return :disconnected
48
+ end
49
+
50
+ def process_event event
51
+ unless @callback_block.nil?
52
+ self.instance_exec event.merge( { :options => self.options } ), &@callback_block
53
+ else
54
+ self.logger.info("[#{self.options[:client_name]}] Processing event: #{event}.")
55
+ end
56
+ end
57
+
58
+ def subscribe event_types
59
+ self.state.subscribe event_types
60
+ end
61
+
62
+ def unsubscribe event_types
63
+ self.state.unsubscribe event_types
64
+ end
65
+
66
+ def send digest_type, digest_data
67
+ serialized = self.messaging.transport.serializer.serialize_arbitrary( digest_type, digest_data )
68
+ self.messaging.send serialized
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: ascii-8bit
2
+ %w[
3
+ headers
4
+ resolution
5
+ encryption/aes256.rb
6
+ serialization/serializer.rb
7
+ thrift/gossiperl_types.rb
8
+ util/validation.rb
9
+ transport/udp.rb
10
+ messaging.rb
11
+ overlay_worker.rb
12
+ state.rb
13
+ supervisor.rb
14
+ version.rb
15
+ ].each { |req| require "#{File.expand_path(File.dirname(__FILE__))}/#{req}" }
@@ -0,0 +1,38 @@
1
+ # encoding: ascii-8bit
2
+ module Gossiperl
3
+ module Client
4
+ class Resolution
5
+
6
+ UNDEFINED_VALUE = 'GOSSIPERL_UNDEFINED_VALUE'
7
+
8
+ def self.field(name, types, default_value=Resolution::UNDEFINED_VALUE)
9
+ name = name.to_s
10
+ define_method("#{name}=") do |value|
11
+ if value.nil?
12
+ type_matched = true
13
+ else
14
+ type_matched = false
15
+ types = [types] unless types.is_a? Array
16
+ types.each do |type|
17
+ type_matched = true if value.is_a? type and not type_matched
18
+ end
19
+ end
20
+ if type_matched
21
+ self.instance_variable_set("@#{name}", value)
22
+ else
23
+ raise ArgumentError, "Invalid argument value type for #{name}. Required one of #{types.inspect}, received #{value.class}"
24
+ end
25
+ end
26
+
27
+ define_method("#{name}") do
28
+ if default_value != Resolution::UNDEFINED_VALUE
29
+ self.instance_variable_set("@#{name}", default_value) unless self.instance_variable_defined? "@#{name}"
30
+ end
31
+ self.instance_variable_get("@#{name}")
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,128 @@
1
+ # encoding: ascii-8bit
2
+ require 'thrift'
3
+ module Gossiperl
4
+ module Client
5
+ module Serialization
6
+ class Serializer
7
+ include ::Thrift::Struct_Union
8
+
9
+ def serialize_arbitrary digest_type, digest_data
10
+ transport = ::Thrift::MemoryBufferTransport.new()
11
+ protocol = ::Thrift::BinaryProtocol.new(transport)
12
+ protocol.write_struct_begin(digest_type.to_s)
13
+ digest_data.each_key{|key|
14
+ value = digest_data[key][:value]
15
+ type = self.type_to_thrift_type( digest_data[key][:type] )
16
+ unless value.nil?
17
+ if is_container? type
18
+ protocol.write_field_begin(key.to_s, digest_data[key][:value], digest_data[key][:field_id])
19
+ write_container( protocol, value, { :type => type, :name => key.to_s } )
20
+ protocol.write_field_end
21
+ else
22
+ protocol.write_field({ :type => type, :name => key.to_s }, digest_data[key][:field_id], value )
23
+ end
24
+ end
25
+ }
26
+ protocol.write_field_stop
27
+ protocol.write_struct_end
28
+
29
+ envelope = Gossiperl::Client::Thrift::DigestEnvelope.new
30
+ envelope.payload_type = digest_type.to_s
31
+ envelope.bin_payload = protocol.trans.read( protocol.trans.available ).force_encoding('UTF-8')
32
+ envelope.id = SecureRandom.uuid.to_s
33
+ self.digest_to_binary( envelope )
34
+ end
35
+
36
+ def serialize digest
37
+ digest_type = digest.class.name.split('::').last
38
+ digest_type = digest_type[0].downcase + digest_type[1..digest_type.length]
39
+ if digest_type == 'digestEnvelope'
40
+ return self.digest_to_binary( envelope )
41
+ end
42
+ envelope = Gossiperl::Client::Thrift::DigestEnvelope.new
43
+ envelope.payload_type = digest_type
44
+ envelope.bin_payload = self.digest_to_binary( digest )
45
+ envelope.id = SecureRandom.uuid.to_s
46
+ self.digest_to_binary( envelope )
47
+ end
48
+
49
+ def deserialize bin_digest
50
+ envelope_resp = self.digest_from_binary('digestEnvelope', bin_digest)
51
+ if envelope_resp.has_key?(:ok)
52
+ embedded_type = self.digest_type_class( envelope_resp[:ok].payload_type )
53
+ if embedded_type == :forward
54
+ return { :forward => true,
55
+ :type => envelope_resp[:ok].payload_type,
56
+ :envelope => envelope_resp[:ok] }
57
+ else
58
+ payload = digest_from_binary(envelope_resp[:ok].payload_type, envelope_resp[:ok].bin_payload)
59
+ if payload.has_key?(:ok)
60
+ return payload[:ok]
61
+ else
62
+ return { :error => :not_thrift }
63
+ end
64
+ end
65
+ end
66
+ return { :error => :not_thrift }
67
+ end
68
+
69
+ def digest_to_binary digest
70
+ transport = ::Thrift::MemoryBufferTransport.new()
71
+ protocol = ::Thrift::BinaryProtocol.new(transport)
72
+ digest.write( protocol )
73
+ protocol.trans.read( protocol.trans.available ).force_encoding('UTF-8')
74
+ end
75
+
76
+ def digest_from_binary digest_type, bin_digest
77
+ begin
78
+ transport = ::Thrift::MemoryBufferTransport.new( bin_digest )
79
+ protocol = ::Thrift::BinaryProtocol.new(transport)
80
+ digest = self.digest_type_class(digest_type).new
81
+ digest.read( protocol )
82
+ return { :ok => digest }
83
+ rescue Exception => ex
84
+ return { :error => ex }
85
+ end
86
+ end
87
+
88
+ def digest_type_class digest_type
89
+ types = {
90
+ 'digestError' => Gossiperl::Client::Thrift::DigestError,
91
+ 'digestForwardedAck' => Gossiperl::Client::Thrift::DigestForwardedAck,
92
+ 'digestEnvelope' => Gossiperl::Client::Thrift::DigestEnvelope,
93
+ 'digest' => Gossiperl::Client::Thrift::Digest,
94
+ 'digestAck' => Gossiperl::Client::Thrift::DigestAck,
95
+ 'digestSubscriptions' => Gossiperl::Client::Thrift::DigestSubscriptions,
96
+ 'digestExit' => Gossiperl::Client::Thrift::DigestExit,
97
+ 'digestSubscribe' => Gossiperl::Client::Thrift::DigestSubscribe,
98
+ 'digestSubscribeAck' => Gossiperl::Client::Thrift::DigestSubscribeAck,
99
+ 'digestUnsubscribe' => Gossiperl::Client::Thrift::DigestUnsubscribe,
100
+ 'digestUnsubscribeAck' => Gossiperl::Client::Thrift::DigestUnsubscribeAck,
101
+ 'digestEvent' => Gossiperl::Client::Thrift::DigestEvent
102
+ }
103
+ return types[ digest_type ] if types.has_key? digest_type
104
+ return :forward
105
+ end
106
+
107
+ def type_to_thrift_type type
108
+ return ({
109
+ :stop => ::Thrift::Types::STOP,
110
+ :void => ::Thrift::Types::VOID,
111
+ :bool => ::Thrift::Types::BOOL,
112
+ :byte => ::Thrift::Types::BYTE,
113
+ :double => ::Thrift::Types::DOUBLE,
114
+ :i16 => ::Thrift::Types::I16,
115
+ :i32 => ::Thrift::Types::I32,
116
+ :i64 => ::Thrift::Types::I64,
117
+ :string => ::Thrift::Types::STRING,
118
+ :struct => ::Thrift::Types::STRUCT,
119
+ :map => ::Thrift::Types::MAP,
120
+ :set => ::Thrift::Types::SET,
121
+ :list => ::Thrift::Types::LIST,
122
+ })[ type.to_sym ]
123
+ end
124
+
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,73 @@
1
+ # encoding: ascii-8bit
2
+ require 'securerandom'
3
+ module Gossiperl
4
+ module Client
5
+ class State < Gossiperl::Client::Resolution
6
+
7
+ field :worker, Gossiperl::Client::OverlayWorker
8
+ field :connected, [TrueClass,FalseClass], false
9
+ field :last_ts, Fixnum
10
+ field :subscriptions, Array, []
11
+
12
+ def initialize worker
13
+ self.worker = worker
14
+ end
15
+
16
+ def start
17
+ sleep 1
18
+ self.last_ts = Time.now.to_i
19
+ Thread.new(self) do |state|
20
+ while state.worker.working
21
+ state.send_digest
22
+ sleep 2
23
+ if Time.now.to_i - state.last_ts > 5
24
+ if self.connected
25
+ # Announce disconnected
26
+ state.worker.process_event( { :event => :disconnected } )
27
+ self.connected = false
28
+ end
29
+ end
30
+ end
31
+ state.worker.process_event( { :event => :disconnected } )
32
+ self.connected = false
33
+ state.worker.logger.info("Stopping state service for client #{state.worker.options[:client_name]}.")
34
+ end
35
+ end
36
+
37
+ def receive digest_ack
38
+ unless self.connected
39
+ # Announce connected
40
+ self.worker.process_event( { :event => :connected } )
41
+ self.worker.messaging.digest_subscribe( self.subscriptions ) if self.subscriptions.length > 0
42
+ end
43
+ self.connected = true
44
+ self.last_ts = digest_ack.heartbeat
45
+ end
46
+
47
+ def send_digest
48
+ digest = Gossiperl::Client::Thrift::Digest.new
49
+ digest.name = self.worker.options[:client_name].to_s
50
+ digest.port = self.worker.options[:client_port]
51
+ digest.heartbeat = Time.now.to_i
52
+ digest.id = SecureRandom.uuid.to_s
53
+ digest.secret = self.worker.options[:client_secret].to_s
54
+ self.worker.messaging.send digest
55
+ end
56
+
57
+ def subscribe event_types
58
+ ::Gossiperl::Client::Util::Validation.validate_event_types( event_types )
59
+ self.subscriptions = self.subscriptions + event_types
60
+ self.worker.messaging.digest_subscribe(event_types) if self.connected
61
+ return self.subscriptions
62
+ end
63
+
64
+ def unsubscribe event_types
65
+ ::Gossiperl::Client::Util::Validation.validate_event_types( event_types )
66
+ self.subscriptions = self.subscriptions - event_types
67
+ self.worker.messaging.digest_unsubscribe(event_types) if self.connected
68
+ return self.subscriptions
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,81 @@
1
+ # encoding: ascii-8bit
2
+ module Gossiperl
3
+ module Client
4
+ class Supervisor < Gossiperl::Client::Resolution
5
+
6
+ field :connections, Hash, Hash.new
7
+
8
+ def connect options, &block
9
+ ::Gossiperl::Client::Util::Validation.validate_connect( options )
10
+ if block_given?
11
+ self.connections[ options[:overlay_name].to_sym ] = ::Gossiperl::Client::OverlayWorker.new(self, options, block)
12
+ else
13
+ self.connections[ options[:overlay_name].to_sym ] = ::Gossiperl::Client::OverlayWorker.new(self, options, nil)
14
+ end
15
+ self.connections[ options[:overlay_name].to_sym ].start
16
+ end
17
+
18
+ def disconnect overlay_name
19
+ overlay_name = overlay_name.to_sym
20
+ if self.connections.has_key? overlay_name
21
+ self.connections[ overlay_name ].stop
22
+ self.connections.delete overlay_name
23
+ else
24
+ raise ArgumentError.new("[supervisor] No overlay connection: #{overlay_name}.")
25
+ end
26
+ end
27
+
28
+ def subscriptions overlay_name
29
+ overlay_name = overlay_name.to_sym
30
+ if self.connections.has_key? overlay_name
31
+ self.connections[ overlay_name ].subscriptions
32
+ else
33
+ raise ArgumentError.new("[supervisor] No overlay connection: #{overlay_name}.")
34
+ end
35
+ end
36
+
37
+ def state overlay_name
38
+ overlay_name = overlay_name.to_sym
39
+ if self.connections.has_key? overlay_name
40
+ self.connections[ overlay_name ].current_state
41
+ else
42
+ raise ArgumentError.new("[supervisor] No overlay connection: #{overlay_name}.")
43
+ end
44
+ end
45
+
46
+ def subscribe overlay_name, event_types
47
+ overlay_name = overlay_name.to_sym
48
+ if self.connections.has_key? overlay_name
49
+ self.connections[ overlay_name ].subscribe event_types
50
+ else
51
+ raise ArgumentError.new("[supervisor] No overlay connection: #{overlay_name}.")
52
+ end
53
+ end
54
+
55
+ def unsubscribe overlay_name, event_types
56
+ overlay_name = overlay_name.to_sym
57
+ if self.connections.has_key? overlay_name
58
+ self.connections[ overlay_name ].unsubscribe event_types
59
+ else
60
+ raise ArgumentError.new("[supervisor] No overlay connection: #{overlay_name}.")
61
+ end
62
+ end
63
+
64
+ def send overlay_name, digest_type, digest_data
65
+ overlay_name = overlay_name.to_sym
66
+ if self.connections.has_key? overlay_name
67
+ self.connections[ overlay_name ].send digest_type, digest_data
68
+ else
69
+ raise ArgumentError.new("[supervisor] No overlay connection: #{overlay_name}.")
70
+ end
71
+ end
72
+
73
+ def stop
74
+ self.connections.keys.each_value {|ow|
75
+ ow.stop
76
+ }
77
+ end
78
+
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,15 @@
1
+ #
2
+ # Autogenerated by Thrift Compiler (0.9.1)
3
+ #
4
+ # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
+ #
6
+
7
+ require 'thrift'
8
+ require 'gossiperl_types'
9
+
10
+ module Gossiperl
11
+ module Client
12
+ module Thrift
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,378 @@
1
+ #
2
+ # Autogenerated by Thrift Compiler (0.9.1)
3
+ #
4
+ # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
+ #
6
+
7
+ require 'thrift'
8
+
9
+ module Gossiperl
10
+ module Client
11
+ module Thrift
12
+ class DigestEnvelope
13
+ include ::Thrift::Struct, ::Thrift::Struct_Union
14
+ PAYLOAD_TYPE = 1
15
+ BIN_PAYLOAD = 2
16
+ ID = 3
17
+
18
+ FIELDS = {
19
+ PAYLOAD_TYPE => {:type => ::Thrift::Types::STRING, :name => 'payload_type'},
20
+ BIN_PAYLOAD => {:type => ::Thrift::Types::STRING, :name => 'bin_payload'},
21
+ ID => {:type => ::Thrift::Types::STRING, :name => 'id'}
22
+ }
23
+
24
+ def struct_fields; FIELDS; end
25
+
26
+ def validate
27
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field payload_type is unset!') unless @payload_type
28
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field bin_payload is unset!') unless @bin_payload
29
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field id is unset!') unless @id
30
+ end
31
+
32
+ ::Thrift::Struct.generate_accessors self
33
+ end
34
+
35
+ class DigestForwardedAck
36
+ include ::Thrift::Struct, ::Thrift::Struct_Union
37
+ NAME = 1
38
+ REPLY_ID = 2
39
+ SECRET = 3
40
+
41
+ FIELDS = {
42
+ NAME => {:type => ::Thrift::Types::STRING, :name => 'name'},
43
+ REPLY_ID => {:type => ::Thrift::Types::STRING, :name => 'reply_id'},
44
+ SECRET => {:type => ::Thrift::Types::STRING, :name => 'secret'}
45
+ }
46
+
47
+ def struct_fields; FIELDS; end
48
+
49
+ def validate
50
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field name is unset!') unless @name
51
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field reply_id is unset!') unless @reply_id
52
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field secret is unset!') unless @secret
53
+ end
54
+
55
+ ::Thrift::Struct.generate_accessors self
56
+ end
57
+
58
+ class DigestError
59
+ include ::Thrift::Struct, ::Thrift::Struct_Union
60
+ NAME = 1
61
+ HEARTBEAT = 2
62
+ ERROR_CODE = 3
63
+ ERROR_ENTITY = 4
64
+ ERROR_ENTITY_NAME = 5
65
+ ERROR_MESSAGE = 6
66
+ REPLY_ID = 7
67
+
68
+ FIELDS = {
69
+ NAME => {:type => ::Thrift::Types::STRING, :name => 'name'},
70
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'},
71
+ ERROR_CODE => {:type => ::Thrift::Types::I32, :name => 'error_code'},
72
+ ERROR_ENTITY => {:type => ::Thrift::Types::STRING, :name => 'error_entity'},
73
+ ERROR_ENTITY_NAME => {:type => ::Thrift::Types::STRING, :name => 'error_entity_name'},
74
+ ERROR_MESSAGE => {:type => ::Thrift::Types::STRING, :name => 'error_message'},
75
+ REPLY_ID => {:type => ::Thrift::Types::STRING, :name => 'reply_id'}
76
+ }
77
+
78
+ def struct_fields; FIELDS; end
79
+
80
+ def validate
81
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field name is unset!') unless @name
82
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
83
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field error_code is unset!') unless @error_code
84
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field error_entity is unset!') unless @error_entity
85
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field error_entity_name is unset!') unless @error_entity_name
86
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field error_message is unset!') unless @error_message
87
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field reply_id is unset!') unless @reply_id
88
+ end
89
+
90
+ ::Thrift::Struct.generate_accessors self
91
+ end
92
+
93
+ class DigestExit
94
+ include ::Thrift::Struct, ::Thrift::Struct_Union
95
+ NAME = 1
96
+ HEARTBEAT = 2
97
+ SECRET = 3
98
+
99
+ FIELDS = {
100
+ NAME => {:type => ::Thrift::Types::STRING, :name => 'name'},
101
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'},
102
+ SECRET => {:type => ::Thrift::Types::STRING, :name => 'secret'}
103
+ }
104
+
105
+ def struct_fields; FIELDS; end
106
+
107
+ def validate
108
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field name is unset!') unless @name
109
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
110
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field secret is unset!') unless @secret
111
+ end
112
+
113
+ ::Thrift::Struct.generate_accessors self
114
+ end
115
+
116
+ class DigestMember
117
+ include ::Thrift::Struct, ::Thrift::Struct_Union
118
+ MEMBER_NAME = 1
119
+ MEMBER_IP = 2
120
+ MEMBER_PORT = 3
121
+ MEMBER_HEARTBEAT = 4
122
+
123
+ FIELDS = {
124
+ MEMBER_NAME => {:type => ::Thrift::Types::STRING, :name => 'member_name'},
125
+ MEMBER_IP => {:type => ::Thrift::Types::STRING, :name => 'member_ip'},
126
+ MEMBER_PORT => {:type => ::Thrift::Types::I32, :name => 'member_port'},
127
+ MEMBER_HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'member_heartbeat'}
128
+ }
129
+
130
+ def struct_fields; FIELDS; end
131
+
132
+ def validate
133
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field member_name is unset!') unless @member_name
134
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field member_ip is unset!') unless @member_ip
135
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field member_port is unset!') unless @member_port
136
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field member_heartbeat is unset!') unless @member_heartbeat
137
+ end
138
+
139
+ ::Thrift::Struct.generate_accessors self
140
+ end
141
+
142
+ class DigestSubscription
143
+ include ::Thrift::Struct, ::Thrift::Struct_Union
144
+ EVENT_TYPE = 1
145
+ MEMBER_NAME = 2
146
+ ORIGIN = 3
147
+ HEARTBEAT = 4
148
+
149
+ FIELDS = {
150
+ EVENT_TYPE => {:type => ::Thrift::Types::STRING, :name => 'event_type'},
151
+ MEMBER_NAME => {:type => ::Thrift::Types::STRING, :name => 'member_name'},
152
+ ORIGIN => {:type => ::Thrift::Types::STRING, :name => 'origin'},
153
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'}
154
+ }
155
+
156
+ def struct_fields; FIELDS; end
157
+
158
+ def validate
159
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field event_type is unset!') unless @event_type
160
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field member_name is unset!') unless @member_name
161
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field origin is unset!') unless @origin
162
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
163
+ end
164
+
165
+ ::Thrift::Struct.generate_accessors self
166
+ end
167
+
168
+ class Digest
169
+ include ::Thrift::Struct, ::Thrift::Struct_Union
170
+ NAME = 1
171
+ PORT = 2
172
+ HEARTBEAT = 3
173
+ ID = 4
174
+ SECRET = 5
175
+
176
+ FIELDS = {
177
+ NAME => {:type => ::Thrift::Types::STRING, :name => 'name'},
178
+ PORT => {:type => ::Thrift::Types::I32, :name => 'port'},
179
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'},
180
+ ID => {:type => ::Thrift::Types::STRING, :name => 'id'},
181
+ SECRET => {:type => ::Thrift::Types::STRING, :name => 'secret'}
182
+ }
183
+
184
+ def struct_fields; FIELDS; end
185
+
186
+ def validate
187
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field name is unset!') unless @name
188
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field port is unset!') unless @port
189
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
190
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field id is unset!') unless @id
191
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field secret is unset!') unless @secret
192
+ end
193
+
194
+ ::Thrift::Struct.generate_accessors self
195
+ end
196
+
197
+ class DigestAck
198
+ include ::Thrift::Struct, ::Thrift::Struct_Union
199
+ NAME = 1
200
+ HEARTBEAT = 2
201
+ REPLY_ID = 3
202
+ MEMBERSHIP = 4
203
+
204
+ FIELDS = {
205
+ NAME => {:type => ::Thrift::Types::STRING, :name => 'name'},
206
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'},
207
+ REPLY_ID => {:type => ::Thrift::Types::STRING, :name => 'reply_id'},
208
+ MEMBERSHIP => {:type => ::Thrift::Types::LIST, :name => 'membership', :element => {:type => ::Thrift::Types::STRUCT, :class => ::Gossiperl::Client::Thrift::DigestMember}}
209
+ }
210
+
211
+ def struct_fields; FIELDS; end
212
+
213
+ def validate
214
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field name is unset!') unless @name
215
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
216
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field reply_id is unset!') unless @reply_id
217
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field membership is unset!') unless @membership
218
+ end
219
+
220
+ ::Thrift::Struct.generate_accessors self
221
+ end
222
+
223
+ class DigestSubscriptions
224
+ include ::Thrift::Struct, ::Thrift::Struct_Union
225
+ NAME = 1
226
+ HEARTBEAT = 2
227
+ REPLY_ID = 3
228
+ SUBSCRIPTIONS = 4
229
+
230
+ FIELDS = {
231
+ NAME => {:type => ::Thrift::Types::STRING, :name => 'name'},
232
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'},
233
+ REPLY_ID => {:type => ::Thrift::Types::STRING, :name => 'reply_id'},
234
+ SUBSCRIPTIONS => {:type => ::Thrift::Types::LIST, :name => 'subscriptions', :element => {:type => ::Thrift::Types::STRUCT, :class => ::Gossiperl::Client::Thrift::DigestSubscription}}
235
+ }
236
+
237
+ def struct_fields; FIELDS; end
238
+
239
+ def validate
240
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field name is unset!') unless @name
241
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
242
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field reply_id is unset!') unless @reply_id
243
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field subscriptions is unset!') unless @subscriptions
244
+ end
245
+
246
+ ::Thrift::Struct.generate_accessors self
247
+ end
248
+
249
+ class DigestSubscribe
250
+ include ::Thrift::Struct, ::Thrift::Struct_Union
251
+ NAME = 1
252
+ HEARTBEAT = 2
253
+ ID = 3
254
+ EVENT_TYPES = 4
255
+ SECRET = 5
256
+
257
+ FIELDS = {
258
+ NAME => {:type => ::Thrift::Types::STRING, :name => 'name'},
259
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'},
260
+ ID => {:type => ::Thrift::Types::STRING, :name => 'id'},
261
+ EVENT_TYPES => {:type => ::Thrift::Types::LIST, :name => 'event_types', :element => {:type => ::Thrift::Types::STRING}},
262
+ SECRET => {:type => ::Thrift::Types::STRING, :name => 'secret'}
263
+ }
264
+
265
+ def struct_fields; FIELDS; end
266
+
267
+ def validate
268
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field name is unset!') unless @name
269
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
270
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field id is unset!') unless @id
271
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field event_types is unset!') unless @event_types
272
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field secret is unset!') unless @secret
273
+ end
274
+
275
+ ::Thrift::Struct.generate_accessors self
276
+ end
277
+
278
+ class DigestUnsubscribe
279
+ include ::Thrift::Struct, ::Thrift::Struct_Union
280
+ NAME = 1
281
+ HEARTBEAT = 2
282
+ ID = 3
283
+ EVENT_TYPES = 4
284
+ SECRET = 5
285
+
286
+ FIELDS = {
287
+ NAME => {:type => ::Thrift::Types::STRING, :name => 'name'},
288
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'},
289
+ ID => {:type => ::Thrift::Types::STRING, :name => 'id'},
290
+ EVENT_TYPES => {:type => ::Thrift::Types::LIST, :name => 'event_types', :element => {:type => ::Thrift::Types::STRING}},
291
+ SECRET => {:type => ::Thrift::Types::STRING, :name => 'secret'}
292
+ }
293
+
294
+ def struct_fields; FIELDS; end
295
+
296
+ def validate
297
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field name is unset!') unless @name
298
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
299
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field id is unset!') unless @id
300
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field event_types is unset!') unless @event_types
301
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field secret is unset!') unless @secret
302
+ end
303
+
304
+ ::Thrift::Struct.generate_accessors self
305
+ end
306
+
307
+ class DigestSubscribeAck
308
+ include ::Thrift::Struct, ::Thrift::Struct_Union
309
+ HEARTBEAT = 1
310
+ REPLY_ID = 2
311
+ EVENT_TYPES = 3
312
+
313
+ FIELDS = {
314
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'},
315
+ REPLY_ID => {:type => ::Thrift::Types::STRING, :name => 'reply_id'},
316
+ EVENT_TYPES => {:type => ::Thrift::Types::LIST, :name => 'event_types', :element => {:type => ::Thrift::Types::STRING}}
317
+ }
318
+
319
+ def struct_fields; FIELDS; end
320
+
321
+ def validate
322
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
323
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field reply_id is unset!') unless @reply_id
324
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field event_types is unset!') unless @event_types
325
+ end
326
+
327
+ ::Thrift::Struct.generate_accessors self
328
+ end
329
+
330
+ class DigestUnsubscribeAck
331
+ include ::Thrift::Struct, ::Thrift::Struct_Union
332
+ HEARTBEAT = 1
333
+ REPLY_ID = 2
334
+ EVENT_TYPES = 3
335
+
336
+ FIELDS = {
337
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'},
338
+ REPLY_ID => {:type => ::Thrift::Types::STRING, :name => 'reply_id'},
339
+ EVENT_TYPES => {:type => ::Thrift::Types::LIST, :name => 'event_types', :element => {:type => ::Thrift::Types::STRING}}
340
+ }
341
+
342
+ def struct_fields; FIELDS; end
343
+
344
+ def validate
345
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
346
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field reply_id is unset!') unless @reply_id
347
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field event_types is unset!') unless @event_types
348
+ end
349
+
350
+ ::Thrift::Struct.generate_accessors self
351
+ end
352
+
353
+ class DigestEvent
354
+ include ::Thrift::Struct, ::Thrift::Struct_Union
355
+ EVENT_TYPE = 1
356
+ EVENT_OBJECT = 2
357
+ HEARTBEAT = 3
358
+
359
+ FIELDS = {
360
+ EVENT_TYPE => {:type => ::Thrift::Types::STRING, :name => 'event_type'},
361
+ EVENT_OBJECT => {:type => ::Thrift::Types::STRING, :name => 'event_object'},
362
+ HEARTBEAT => {:type => ::Thrift::Types::I64, :name => 'heartbeat'}
363
+ }
364
+
365
+ def struct_fields; FIELDS; end
366
+
367
+ def validate
368
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field event_type is unset!') unless @event_type
369
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field event_object is unset!') unless @event_object
370
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field heartbeat is unset!') unless @heartbeat
371
+ end
372
+
373
+ ::Thrift::Struct.generate_accessors self
374
+ end
375
+
376
+ end
377
+ end
378
+ end