tamashii-manager 0.1.4

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,41 @@
1
+ require "nio"
2
+
3
+ require "tamashii/manager/connection"
4
+
5
+ Thread.abort_on_exception = true
6
+
7
+ module Tamashii
8
+ module Manager
9
+ class Stream
10
+
11
+ attr_reader :event_loop
12
+
13
+ def initialize(event_loop, io, client)
14
+ @client = client
15
+ @io = io
16
+ @event_loop = event_loop
17
+ @event_loop.attach(io, self)
18
+ end
19
+
20
+ def receive(data)
21
+ @client.parse(data)
22
+ end
23
+
24
+ def shutdown
25
+ clean_rack_hijack
26
+ end
27
+
28
+ def close
29
+ shutdown
30
+ @client.shutdown
31
+ end
32
+
33
+ private
34
+ def clean_rack_hijack
35
+ return unless @io
36
+ @event_loop.detach(@io, self)
37
+ @io = nil
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,106 @@
1
+ require 'nio'
2
+ require 'thread'
3
+ require 'concurrent'
4
+
5
+ module Tamashii
6
+ module Manager
7
+ class StreamEventLoop
8
+ def initialize
9
+ @nio = @thread = nil
10
+ @stopping = false
11
+ @map = {}
12
+
13
+ @todo = Queue.new
14
+
15
+ @spawn_mutex = Mutex.new
16
+ end
17
+
18
+ def timer(interval, &block)
19
+ Concurrent::TimerTask.new(execution_interval: interval, &block).tap(&:execute)
20
+ end
21
+
22
+ def post(task = nil, &block)
23
+ task ||= block
24
+ Concurrent.global_io_executor << task
25
+ end
26
+
27
+ def attach(io, stream)
28
+ @todo << lambda do
29
+ @map[io] = @nio.register(io, :r)
30
+ @map[io].value = stream
31
+ end
32
+ wakeup
33
+ end
34
+
35
+ def detach(io, stream)
36
+ @todo << lambda do
37
+ @nio.deregister io
38
+ @map.delete io
39
+ io.close
40
+ end
41
+ wakeup
42
+ end
43
+
44
+ def stop
45
+ @stopping = true
46
+ wakeup if @nio
47
+ end
48
+
49
+ def stopped?
50
+ @stopping
51
+ end
52
+
53
+ private
54
+ def spawn
55
+ return if @thread && @thread.status
56
+
57
+ @spawn_mutex.synchronize do
58
+ return if @thread && @thread.status
59
+
60
+ @nio ||= NIO::Selector.new
61
+
62
+ @thread = Thread.new { run }
63
+
64
+ return true
65
+ end
66
+ end
67
+
68
+ def wakeup
69
+ spawn || @nio.wakeup
70
+ end
71
+
72
+ def run
73
+ loop do
74
+ if stopped?
75
+ @nio.close
76
+ break
77
+ end
78
+
79
+ until @todo.empty?
80
+ @todo.pop(true).call
81
+ end
82
+
83
+ next unless monitors = @nio.select
84
+
85
+ monitors.each do |monitor|
86
+ io = monitor.io
87
+ stream = monitor.value
88
+
89
+ begin
90
+ incoming = io.recv_nonblock(4096)
91
+ stream.receive incoming
92
+ rescue
93
+ begin
94
+ stream.close
95
+ rescue
96
+ @nio.deregister io
97
+ @map.delete io
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,5 @@
1
+ module Tamashii
2
+ module Manager
3
+ VERSION = "0.1.4"
4
+ end
5
+ end
@@ -0,0 +1,46 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'tamashii/manager/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "tamashii-manager"
8
+ spec.version = Tamashii::Manager::VERSION
9
+ spec.authors = ["蒼時弦也", "Liang-Chi Tseng", "五倍紅寶石"]
10
+ spec.email = ["elct9620@frost.tw", "lctseng@cs.nctu.edu.tw", "hi@5xruby.tw"]
11
+
12
+ spec.summary = %q{The IoT device manager for RubyConf checkin system.}
13
+ spec.description = %q{The IoT device manager for RubyConf checkin system.}
14
+ spec.homepage = "https://github.com/lctseng/tamashii-manager"
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ if spec.respond_to?(:metadata)
19
+ #spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
20
+ else
21
+ raise "RubyGems 2.0 or newer is required to protect against " \
22
+ "public gem pushes."
23
+ end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
+ f.match(%r{^(test|spec|features)/})
27
+ end
28
+ spec.bindir = "exe"
29
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_runtime_dependency "puma"
33
+ spec.add_runtime_dependency "concurrent-ruby"
34
+ spec.add_runtime_dependency "rack"
35
+ spec.add_runtime_dependency "tamashii-common"
36
+ spec.add_runtime_dependency "websocket-driver"
37
+ spec.add_runtime_dependency "nio4r"
38
+
39
+ spec.add_development_dependency "bundler", "~> 1.13"
40
+ spec.add_development_dependency "rake", "~> 10.0"
41
+ spec.add_development_dependency "rspec", "~> 3.0"
42
+ spec.add_development_dependency "rack-test"
43
+ spec.add_development_dependency "simplecov"
44
+ spec.add_development_dependency "guard"
45
+ spec.add_development_dependency "guard-rspec"
46
+ end
metadata ADDED
@@ -0,0 +1,257 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tamashii-manager
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.4
5
+ platform: ruby
6
+ authors:
7
+ - 蒼時弦也
8
+ - Liang-Chi Tseng
9
+ - 五倍紅寶石
10
+ autorequire:
11
+ bindir: exe
12
+ cert_chain: []
13
+ date: 2017-02-21 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: puma
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: concurrent-ruby
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: rack
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: tamashii-common
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: websocket-driver
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: nio4r
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: bundler
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '1.13'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '1.13'
113
+ - !ruby/object:Gem::Dependency
114
+ name: rake
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '10.0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '10.0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: rspec
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '3.0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '3.0'
141
+ - !ruby/object:Gem::Dependency
142
+ name: rack-test
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ - !ruby/object:Gem::Dependency
156
+ name: simplecov
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ - !ruby/object:Gem::Dependency
170
+ name: guard
171
+ requirement: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ - !ruby/object:Gem::Dependency
184
+ name: guard-rspec
185
+ requirement: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ type: :development
191
+ prerelease: false
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ description: The IoT device manager for RubyConf checkin system.
198
+ email:
199
+ - elct9620@frost.tw
200
+ - lctseng@cs.nctu.edu.tw
201
+ - hi@5xruby.tw
202
+ executables:
203
+ - tamashii-manager
204
+ extensions: []
205
+ extra_rdoc_files: []
206
+ files:
207
+ - ".gitignore"
208
+ - ".rspec"
209
+ - ".travis.yml"
210
+ - Gemfile
211
+ - Guardfile
212
+ - LICENSE.md
213
+ - README.md
214
+ - Rakefile
215
+ - bin/console
216
+ - bin/setup
217
+ - exe/tamashii-manager
218
+ - lib/tamashii/manager.rb
219
+ - lib/tamashii/manager/authorization.rb
220
+ - lib/tamashii/manager/authorizator/token.rb
221
+ - lib/tamashii/manager/channel.rb
222
+ - lib/tamashii/manager/channel_pool.rb
223
+ - lib/tamashii/manager/client.rb
224
+ - lib/tamashii/manager/clients.rb
225
+ - lib/tamashii/manager/config.rb
226
+ - lib/tamashii/manager/connection.rb
227
+ - lib/tamashii/manager/errors/authorization_error.rb
228
+ - lib/tamashii/manager/handler/broadcaster.rb
229
+ - lib/tamashii/manager/server.rb
230
+ - lib/tamashii/manager/stream.rb
231
+ - lib/tamashii/manager/stream_event_loop.rb
232
+ - lib/tamashii/manager/version.rb
233
+ - tamashii-manager.gemspec
234
+ homepage: https://github.com/lctseng/tamashii-manager
235
+ licenses: []
236
+ metadata: {}
237
+ post_install_message:
238
+ rdoc_options: []
239
+ require_paths:
240
+ - lib
241
+ required_ruby_version: !ruby/object:Gem::Requirement
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ required_rubygems_version: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ requirements: []
252
+ rubyforge_project:
253
+ rubygems_version: 2.5.1
254
+ signing_key:
255
+ specification_version: 4
256
+ summary: The IoT device manager for RubyConf checkin system.
257
+ test_files: []