tamashii 0.2.0 → 0.3.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.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +1 -0
- data/.travis.yml +1 -1
- data/README.md +3 -1
- data/lib/tamashii/configurable.rb +45 -0
- data/lib/tamashii/server.rb +7 -0
- data/lib/tamashii/server/base.rb +1 -1
- data/lib/tamashii/server/config.rb +15 -0
- data/lib/tamashii/server/connection.rb +1 -0
- data/lib/tamashii/server/connection/base.rb +36 -0
- data/lib/tamashii/server/connection/client_socket.rb +24 -4
- data/lib/tamashii/server/rack.rb +2 -1
- data/lib/tamashii/version.rb +1 -1
- data/tamashii.gemspec +1 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7740a43e6b86d1673461a03ec8af4a48279b3b2
|
4
|
+
data.tar.gz: 0e2320ea7184d79a380d223ff8b7a02bb402c58e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e989819b700f4a999aa452f7ca08878bc4361c7354a055ebc605ea87a7390f2e649b06f052ee47ccc7d57fa7666b1d7c3680211872bb9e8afac96a929913345
|
7
|
+
data.tar.gz: 1f463edf6b95e70adffd37c4ec6dfa78dd32d1ea070013f88c726a71cac112c2a6b5bbfe0f5b3ad9647601284824815c4959a22d37a6cbb0f7a4ad240e81ffb8
|
data/.gitlab-ci.yml
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
Tamashii [](https://badge.fury.io/rb/tamashii) [](https://travis-ci.org/5xRuby/tamashii) [](https://codeclimate.com/github/5xRuby/tamashii/coverage) [](https://codeclimate.com/github/5xRuby/tamashii)
|
2
|
+
===
|
3
|
+
|
2
4
|
|
3
5
|
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/tamashii`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
6
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tamashii
|
4
|
+
# :nodoc:
|
5
|
+
module Configurable
|
6
|
+
# :nodoc:
|
7
|
+
module ClassMethods
|
8
|
+
def register(key, default, &_block)
|
9
|
+
@defaults ||= {}
|
10
|
+
return @defaults[key.to_sym] = yield if block_given?
|
11
|
+
@defaults[key.to_sym] = default
|
12
|
+
end
|
13
|
+
|
14
|
+
def exist?(key)
|
15
|
+
@defaults.key?(key.to_sym) || @defaults.key?(key.to_s[0..-2].to_sym)
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_value(key)
|
19
|
+
@defaults[key.to_sym]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.included(klass)
|
24
|
+
klass.extend ClassMethods
|
25
|
+
end
|
26
|
+
|
27
|
+
def config(key, value = nil, &_block)
|
28
|
+
@configs ||= {}
|
29
|
+
return unless self.class.exist?(key)
|
30
|
+
return @configs[key.to_sym] || self.class.default_value(key) if value.nil?
|
31
|
+
return @configs[key.to_sym] = yield if block_given?
|
32
|
+
@configs[key.to_sym] = value
|
33
|
+
end
|
34
|
+
|
35
|
+
def respond_to_missing?(name)
|
36
|
+
self.class.exist?(name)
|
37
|
+
end
|
38
|
+
|
39
|
+
def method_missing(name, *args, &block)
|
40
|
+
return super unless self.class.exist?(name)
|
41
|
+
return config(name.to_sym) unless name.to_s.end_with?('=')
|
42
|
+
config(name.to_s[0..-2].to_sym, args.first, &block)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/tamashii/server.rb
CHANGED
@@ -18,6 +18,13 @@ module Tamashii
|
|
18
18
|
autoload :Client, 'tamashii/server/client'
|
19
19
|
autoload :Connection, 'tamashii/server/connection'
|
20
20
|
autoload :Subscription, 'tamashii/server/subscription'
|
21
|
+
autoload :Config, 'tamashii/server/config'
|
22
|
+
|
23
|
+
def self.config(&block)
|
24
|
+
@config ||= Config.new
|
25
|
+
return instance_exec(@config, &block) if block_given?
|
26
|
+
@config
|
27
|
+
end
|
21
28
|
|
22
29
|
def self.logger
|
23
30
|
# TODO: Add config to set logger path
|
data/lib/tamashii/server/base.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tamashii/configurable'
|
4
|
+
|
5
|
+
module Tamashii
|
6
|
+
module Server
|
7
|
+
# :nodoc:
|
8
|
+
class Config
|
9
|
+
include Tamashii::Configurable
|
10
|
+
|
11
|
+
register :connection_class, Connection::Base
|
12
|
+
register :pubsub_class, Subscription::Redis
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -4,6 +4,7 @@ module Tamashii
|
|
4
4
|
module Server
|
5
5
|
# :nodoc:
|
6
6
|
module Connection
|
7
|
+
autoload :Base, 'tamashii/server/connection/base'
|
7
8
|
autoload :ClientSocket, 'tamashii/server/connection/client_socket'
|
8
9
|
autoload :StreamEventLoop, 'tamashii/server/connection/stream_event_loop'
|
9
10
|
autoload :Stream, 'tamashii/server/connection/stream'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tamashii
|
4
|
+
module Server
|
5
|
+
module Connection
|
6
|
+
# :nodoc:
|
7
|
+
class Base
|
8
|
+
def initialize(server, env, event_loop)
|
9
|
+
@server = server
|
10
|
+
@env = env
|
11
|
+
@event_loop = event_loop
|
12
|
+
|
13
|
+
@socket = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def init
|
17
|
+
@socket = ClientSocket.new(@server, self, @env, @event_loop)
|
18
|
+
@socket.rack_response
|
19
|
+
end
|
20
|
+
|
21
|
+
def on_open
|
22
|
+
end
|
23
|
+
|
24
|
+
def on_message(data)
|
25
|
+
@server.pubsub.broadcast(data)
|
26
|
+
end
|
27
|
+
|
28
|
+
def on_error
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_close
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -20,16 +20,23 @@ module Tamashii
|
|
20
20
|
false
|
21
21
|
end
|
22
22
|
|
23
|
+
CONNECTING = 0
|
24
|
+
OPEN = 1
|
25
|
+
CLOSING = 2
|
26
|
+
CLOSED = 3
|
27
|
+
|
23
28
|
attr_reader :env, :url
|
24
29
|
attr_accessor :id
|
25
30
|
|
26
31
|
# TODO: Support define protocols
|
27
|
-
def initialize(server, env, event_loop)
|
32
|
+
def initialize(server, conn, env, event_loop)
|
28
33
|
@server = server
|
34
|
+
@conn = conn
|
29
35
|
@env = env
|
30
36
|
@event_loop = event_loop
|
31
37
|
|
32
38
|
@id ||= env['REMOTE_ADDR']
|
39
|
+
@state = CONNECTING
|
33
40
|
|
34
41
|
@url = ClientSocket.determine_url(@env)
|
35
42
|
@driver = setup_driver
|
@@ -100,25 +107,38 @@ module Tamashii
|
|
100
107
|
end
|
101
108
|
|
102
109
|
def open
|
103
|
-
|
110
|
+
return unless @state == CONNECTING
|
111
|
+
@state = OPEN
|
112
|
+
@conn.on_open
|
113
|
+
Client.register(self)
|
104
114
|
end
|
105
115
|
|
106
116
|
def receive_message(data)
|
107
|
-
@
|
117
|
+
return unless @state == OPEN
|
118
|
+
@conn.on_message(data)
|
108
119
|
end
|
109
120
|
|
110
121
|
def emit_error(message)
|
122
|
+
return if @state >= CLOSING
|
111
123
|
Server.logger.error("Client #{id} has some error: #{message}")
|
124
|
+
@conn.on_error(message)
|
112
125
|
end
|
113
126
|
|
114
127
|
def begin_close(_reason, _code)
|
128
|
+
# TODO: Define reason and code
|
129
|
+
return if @state == CLOSED
|
130
|
+
@state = CLOSING
|
131
|
+
|
115
132
|
Server.logger.info("Close connection to #{id}")
|
133
|
+
@conn.on_close
|
116
134
|
Client.unregister(self)
|
117
135
|
finialize_close
|
118
136
|
end
|
119
137
|
|
120
138
|
def finialize_close
|
121
|
-
|
139
|
+
return if @state == CLOSED
|
140
|
+
@state = CLOSED
|
141
|
+
|
122
142
|
@stream.close
|
123
143
|
end
|
124
144
|
end
|
data/lib/tamashii/server/rack.rb
CHANGED
data/lib/tamashii/version.rb
CHANGED
data/tamashii.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tamashii
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 蒼時弦也
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-05-
|
13
|
+
date: 2017-05-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: concurrent-ruby
|
@@ -208,6 +208,20 @@ dependencies:
|
|
208
208
|
- - ">="
|
209
209
|
- !ruby/object:Gem::Version
|
210
210
|
version: '0'
|
211
|
+
- !ruby/object:Gem::Dependency
|
212
|
+
name: codeclimate-test-reporter
|
213
|
+
requirement: !ruby/object:Gem::Requirement
|
214
|
+
requirements:
|
215
|
+
- - ">="
|
216
|
+
- !ruby/object:Gem::Version
|
217
|
+
version: '0'
|
218
|
+
type: :development
|
219
|
+
prerelease: false
|
220
|
+
version_requirements: !ruby/object:Gem::Requirement
|
221
|
+
requirements:
|
222
|
+
- - ">="
|
223
|
+
- !ruby/object:Gem::Version
|
224
|
+
version: '0'
|
211
225
|
description: The WebSocket framework implement inspired by ActionCable
|
212
226
|
email:
|
213
227
|
- elct9620@frost.tw
|
@@ -230,10 +244,13 @@ files:
|
|
230
244
|
- bin/console
|
231
245
|
- bin/setup
|
232
246
|
- lib/tamashii.rb
|
247
|
+
- lib/tamashii/configurable.rb
|
233
248
|
- lib/tamashii/server.rb
|
234
249
|
- lib/tamashii/server/base.rb
|
235
250
|
- lib/tamashii/server/client.rb
|
251
|
+
- lib/tamashii/server/config.rb
|
236
252
|
- lib/tamashii/server/connection.rb
|
253
|
+
- lib/tamashii/server/connection/base.rb
|
237
254
|
- lib/tamashii/server/connection/client_socket.rb
|
238
255
|
- lib/tamashii/server/connection/stream.rb
|
239
256
|
- lib/tamashii/server/connection/stream_event_loop.rb
|