sse-client 1.0.1
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.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/README.md +1 -0
- data/lib/sse-client.rb +114 -0
- metadata +120 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4ea10d56000f2ff8f48c70caeafb48188185d120
|
4
|
+
data.tar.gz: b140cff155241bc08bb0c94c68d40ba6181dab85
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cc74b7921ce548ee4e043aa7f42d995fba5f7c35a30ef283a44105e5197c7ecf46a875fa7753f79c02a6452cc5b87971048452f05a813a257602e1d9113e3091
|
7
|
+
data.tar.gz: c101bfcf4ba4b0a1acbface19613168bfff197cf3c52da144516a7493dd56651178e6b05d3d04cdd8dd75a0e8b9fbbb162ae21014e0070b1ae9bd6b9121bffd0
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# SSE client for Ruby
|
data/lib/sse-client.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'restclient'
|
4
|
+
|
5
|
+
module SSE
|
6
|
+
class EventSource
|
7
|
+
# Get API url
|
8
|
+
attr_reader :url
|
9
|
+
# Get ready state
|
10
|
+
attr_reader :ready_state
|
11
|
+
|
12
|
+
# The connection has not yet been established, or it was closed and the user agent is reconnecting.
|
13
|
+
CONNECTING = 0
|
14
|
+
# The user agent has an open connection and is dispatching events as it receives them.
|
15
|
+
OPEN = 1
|
16
|
+
# The connection is not open, and the user agent is not trying to reconnect. Either there was a fatal error or the close() method was invoked.
|
17
|
+
CLOSED = 2
|
18
|
+
|
19
|
+
def initialize(url = "http://localhost:2333/portal/app_api_call_stats?begin=2017-09-30&end=2017-10-31&interval=day&app_id=8ab88b1d", query = {}, headers = {})
|
20
|
+
@url = url
|
21
|
+
@headers = headers
|
22
|
+
@headers['params'] = query
|
23
|
+
@ready_state = CLOSED
|
24
|
+
|
25
|
+
@opens = []
|
26
|
+
@errors = []
|
27
|
+
@messages = []
|
28
|
+
@on = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def start
|
32
|
+
@ready_state = CONNECTING
|
33
|
+
listen
|
34
|
+
end
|
35
|
+
|
36
|
+
def open(&block)
|
37
|
+
@opens << block
|
38
|
+
end
|
39
|
+
|
40
|
+
def on(name, &block)
|
41
|
+
@on[name] ||= []
|
42
|
+
@on[name] << block
|
43
|
+
end
|
44
|
+
|
45
|
+
def message(&block)
|
46
|
+
@messages << block
|
47
|
+
end
|
48
|
+
|
49
|
+
def error(&block)
|
50
|
+
@errors << block
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def listen
|
56
|
+
block = proc { |response|
|
57
|
+
handle_open
|
58
|
+
case response.code
|
59
|
+
when "200"
|
60
|
+
buffer = ""
|
61
|
+
response.read_body do |chunk|
|
62
|
+
buffer += chunk
|
63
|
+
while index = buffer.index(/\r\n\r\n|\n\n/)
|
64
|
+
stream = buffer.slice!(0..index)
|
65
|
+
handle_stream stream
|
66
|
+
end
|
67
|
+
end
|
68
|
+
close
|
69
|
+
else
|
70
|
+
handle_error response.body
|
71
|
+
end
|
72
|
+
}
|
73
|
+
conn = RestClient::Request.execute(method: :get,
|
74
|
+
url: @url,
|
75
|
+
headers: @headers,
|
76
|
+
block_response: block)
|
77
|
+
end
|
78
|
+
|
79
|
+
def handle_stream(stream)
|
80
|
+
data = ""
|
81
|
+
name = nil
|
82
|
+
stream.split(/\r?\n/).each do |part|
|
83
|
+
/^data:(.+)$/.match(part) do |m|
|
84
|
+
data += m[1].strip
|
85
|
+
data += "\n"
|
86
|
+
end
|
87
|
+
/^event:(.+)$/.match(part) do |m|
|
88
|
+
name = m[1].strip
|
89
|
+
end
|
90
|
+
end
|
91
|
+
return if data.empty?
|
92
|
+
data.chomp!
|
93
|
+
if name.nil?
|
94
|
+
@messages.each { |message| message.call(data) }
|
95
|
+
else
|
96
|
+
@on[name].each { |message| message.call(data) } if not @on[name].nil?
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def handle_open
|
101
|
+
@ready_state = OPEN
|
102
|
+
@opens.each { |open| open.call() }
|
103
|
+
end
|
104
|
+
|
105
|
+
def handle_error response
|
106
|
+
close
|
107
|
+
@errors.each { |error| error.call(response) }
|
108
|
+
end
|
109
|
+
|
110
|
+
def close
|
111
|
+
@ready_state = CLOSED
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sse-client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- oplinjie
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-10-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rest-client
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: webmock
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: sse-client is an httpclient library base on restclient to consume Server-Sent
|
84
|
+
Events streaming API.
|
85
|
+
email: oplinjie@163.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files:
|
89
|
+
- README.md
|
90
|
+
files:
|
91
|
+
- Gemfile
|
92
|
+
- README.md
|
93
|
+
- lib/sse-client.rb
|
94
|
+
homepage: https://github.com/oplinjie/sse-client
|
95
|
+
licenses:
|
96
|
+
- MIT
|
97
|
+
metadata: {}
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options: []
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubyforge_project:
|
114
|
+
rubygems_version: 2.5.1
|
115
|
+
signing_key:
|
116
|
+
specification_version: 4
|
117
|
+
summary: sse-client is an httpclient library to consume Server-Sent Events streaming
|
118
|
+
API.
|
119
|
+
test_files: []
|
120
|
+
has_rdoc:
|