Class: RestCore::EventSource
- Inherits:
-
Struct
- Object
- Struct
- RestCore::EventSource
- Includes:
- RestCore
- Defined in:
- lib/rest-core/event_source.rb
Constant Summary
Constants included from RestCore
ASYNC, CLIENT, DRY, FAIL, HIJACK, LOG, PROMISE, REQUEST_HEADERS, REQUEST_METHOD, REQUEST_PATH, REQUEST_PAYLOAD, REQUEST_QUERY, REQUEST_URI, RESPONSE_BODY, RESPONSE_HEADERS, RESPONSE_KEY, RESPONSE_SOCKET, RESPONSE_STATUS, Simple, TIMER, Universal, VERSION
Instance Attribute Summary collapse
-
#client ⇒ Object
Returns the value of attribute client.
-
#opts ⇒ Object
Returns the value of attribute opts.
-
#path ⇒ Object
Returns the value of attribute path.
-
#query ⇒ Object
Returns the value of attribute query.
-
#socket ⇒ Object
Returns the value of attribute socket.
Instance Method Summary collapse
- #close ⇒ Object
- #closed? ⇒ Boolean
-
#onerror(error = nil, sock = nil, &cb) ⇒ Object
would also be called upon closing, would always be called at least once.
- #onmessage(event = nil, data = nil, sock = nil, &cb) ⇒ Object
- #onopen(sock = nil, &cb) ⇒ Object
-
#onreconnect(error = nil, sock = nil, &cb) ⇒ Object
would be called upon closing, and would try to reconnect if a callback is set and return true.
- #start ⇒ Object
- #wait ⇒ Object
Methods included from RestCore
Instance Attribute Details
#client ⇒ Object
Returns the value of attribute client
5 6 7 |
# File 'lib/rest-core/event_source.rb', line 5 def client @client end |
#opts ⇒ Object
Returns the value of attribute opts
5 6 7 |
# File 'lib/rest-core/event_source.rb', line 5 def opts @opts end |
#path ⇒ Object
Returns the value of attribute path
5 6 7 |
# File 'lib/rest-core/event_source.rb', line 5 def path @path end |
#query ⇒ Object
Returns the value of attribute query
5 6 7 |
# File 'lib/rest-core/event_source.rb', line 5 def query @query end |
#socket ⇒ Object
Returns the value of attribute socket
5 6 7 |
# File 'lib/rest-core/event_source.rb', line 5 def socket @socket end |
Instance Method Details
#close ⇒ Object
24 25 26 27 |
# File 'lib/rest-core/event_source.rb', line 24 def close socket && socket.close rescue IOError end |
#closed? ⇒ Boolean
20 21 22 |
# File 'lib/rest-core/event_source.rb', line 20 def closed? !!(socket && socket.closed?) || @closed end |
#onerror(error = nil, sock = nil, &cb) ⇒ Object
would also be called upon closing, would always be called at least once
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/rest-core/event_source.rb', line 63 def onerror error=nil, sock=nil, &cb if block_given? @onerror = cb else begin @onerror.call(error, sock) if @onerror onreconnect(error, sock) rescue Exception mutex.synchronize do @closed = true condv.signal # so we can't be reconnecting, need to try to unblock end raise end end self end |
#onmessage(event = nil, data = nil, sock = nil, &cb) ⇒ Object
53 54 55 56 57 58 59 60 |
# File 'lib/rest-core/event_source.rb', line 53 def event=nil, data=nil, sock=nil, &cb if block_given? @onmessage = cb elsif @onmessage @onmessage.call(event, data, sock) end self end |
#onopen(sock = nil, &cb) ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/rest-core/event_source.rb', line 35 def onopen sock=nil, &cb if block_given? @onopen = cb else self.socket = sock # for you to track the socket @onopen.call(sock) if @onopen (sock) end self rescue Exception => e begin # close the socket since we're going to stop anyway sock.close # if we don't close it, client might wait forever rescue IOError end # let the client has a chance to handle this, and make signal onerror(e, sock) end |
#onreconnect(error = nil, sock = nil, &cb) ⇒ Object
would be called upon closing, and would try to reconnect if a callback is set and return true
83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/rest-core/event_source.rb', line 83 def onreconnect error=nil, sock=nil, &cb if block_given? @onreconnect = cb elsif closed? && @onreconnect && @onreconnect.call(error, sock) reconnect else mutex.synchronize do @closed = true condv.signal # we could be closing, let's try to unblock it end end self end |
#start ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 |
# File 'lib/rest-core/event_source.rb', line 8 def start self.mutex = Mutex.new self.condv = ConditionVariable.new @onopen ||= nil @onmessage ||= nil @onerror ||= nil @onreconnect ||= nil @closed ||= false reconnect self end |
#wait ⇒ Object
29 30 31 32 33 |
# File 'lib/rest-core/event_source.rb', line 29 def wait raise RC::Error.new("Not yet started for: #{self}") unless mutex mutex.synchronize{ condv.wait(mutex) until closed? } unless closed? self end |