hara 0.0.1 → 0.0.2
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.
- data/Gemfile +2 -0
- data/README.md +6 -2
- data/lib/hara/app.rb +55 -51
- data/lib/hara/base.rb +7 -5
- data/lib/hara/version.rb +1 -1
- data/spec/app_spec.rb +96 -0
- data/spec/hara_spec.rb +12 -0
- data/spec/spec_helper.rb +38 -0
- metadata +9 -3
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Hara is a simple framework, help you build websocket server.
|
4
4
|
|
5
|
-
## Notice
|
5
|
+
## Notice!!
|
6
6
|
|
7
7
|
Current API is unstable, you should lock the version.
|
8
8
|
|
@@ -46,7 +46,11 @@ ws.send(msg)
|
|
46
46
|
*start server*
|
47
47
|
`ruby test.rb`
|
48
48
|
|
49
|
-
`ruby test.rb -h` to view
|
49
|
+
`ruby test.rb -h` to view options
|
50
|
+
|
51
|
+
*Other Usage*
|
52
|
+
|
53
|
+
checkout tests
|
50
54
|
|
51
55
|
## Contributing
|
52
56
|
|
data/lib/hara/app.rb
CHANGED
@@ -10,18 +10,27 @@ module Hara
|
|
10
10
|
|
11
11
|
alias halt terminate
|
12
12
|
|
13
|
+
finalizer :app_finalizer
|
14
|
+
|
13
15
|
Actions = {}
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
|
17
|
+
class << self
|
18
|
+
def inherited klass
|
19
|
+
::Hara.const_set :Application, klass
|
20
|
+
end
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
+
def define_action action, &block
|
23
|
+
action = action.to_s
|
24
|
+
warn "Action #{action} duplication defined" if Actions.has_key? action
|
25
|
+
Hara::Application.send :define_method, action, &block
|
26
|
+
method = Hara::Application.send :instance_method, action
|
27
|
+
Hara::Application.send :remove_method, action
|
28
|
+
Actions[action] = method
|
29
|
+
end
|
22
30
|
end
|
23
31
|
|
24
|
-
|
32
|
+
|
33
|
+
def init
|
25
34
|
end
|
26
35
|
|
27
36
|
#return true or false
|
@@ -33,37 +42,10 @@ module Hara
|
|
33
42
|
halt
|
34
43
|
end
|
35
44
|
|
45
|
+
#after_authentication only called when authentication succeeded
|
36
46
|
def after_authentication
|
37
47
|
end
|
38
48
|
|
39
|
-
class << self
|
40
|
-
def define_action action, &block
|
41
|
-
action = action.to_s
|
42
|
-
warn "Action #{action} duplication defined" if Actions.has_key? action
|
43
|
-
Hara::Application.send :define_method, action, &block
|
44
|
-
method = Hara::Application.send :instance_method, action
|
45
|
-
Hara::Application.send :remove_method, action
|
46
|
-
Actions[action] = method
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def process message
|
51
|
-
@command = JSON.parse(message)
|
52
|
-
action = @command["action"]
|
53
|
-
args = @command["args"]
|
54
|
-
info "#{Time.now} : #{@socket.remote_ip} request action: #{action}"
|
55
|
-
before_process action, args
|
56
|
-
call_action action, *args
|
57
|
-
rescue JSON::ParserError
|
58
|
-
warn "#{Time.now} : #{@socket.remote_ip} message can't parse"
|
59
|
-
terminate
|
60
|
-
rescue StandardError => e
|
61
|
-
warn "#{Time.now} : #{@socket.remote_ip} want action: #{action} args: #{args} but process error:\n#{e.inspect}"
|
62
|
-
terminate
|
63
|
-
ensure
|
64
|
-
after_process action, args
|
65
|
-
end
|
66
|
-
|
67
49
|
def before_process action, args
|
68
50
|
end
|
69
51
|
|
@@ -81,6 +63,23 @@ module Hara
|
|
81
63
|
def on_close
|
82
64
|
end
|
83
65
|
|
66
|
+
private
|
67
|
+
def initialize socket
|
68
|
+
@socket = socket
|
69
|
+
async.setup
|
70
|
+
end
|
71
|
+
|
72
|
+
def setup
|
73
|
+
init
|
74
|
+
info "#{Time.now} : #{socket.remote_ip} coming"
|
75
|
+
unless authentication
|
76
|
+
authentication_failed
|
77
|
+
else
|
78
|
+
after_authentication
|
79
|
+
async.run
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
84
83
|
def run
|
85
84
|
while msg = @socket.read
|
86
85
|
process msg
|
@@ -99,30 +98,35 @@ module Hara
|
|
99
98
|
end
|
100
99
|
end
|
101
100
|
|
102
|
-
def
|
103
|
-
|
101
|
+
def process message
|
102
|
+
@command = JSON.parse(message)
|
103
|
+
action = @command["action"]
|
104
|
+
args = @command["args"]
|
105
|
+
info "#{Time.now} : #{@socket.remote_ip} request action: #{action}"
|
106
|
+
before_process action, *args
|
107
|
+
call_action action, *args
|
108
|
+
rescue JSON::ParserError
|
109
|
+
warn "#{Time.now} : #{@socket.remote_ip} message can't parse"
|
110
|
+
terminate
|
111
|
+
rescue StandardError => e
|
112
|
+
warn "#{Time.now} : #{@socket.remote_ip} want action: #{action} args: #{args} but process error:\n#{e.inspect}"
|
113
|
+
terminate
|
104
114
|
ensure
|
105
|
-
|
106
|
-
end
|
107
|
-
|
108
|
-
private
|
109
|
-
def setup
|
110
|
-
info "#{Time.now} : #{socket.remote_ip} coming"
|
111
|
-
after_connect
|
112
|
-
unless authentication
|
113
|
-
authentication_failed
|
114
|
-
else
|
115
|
-
after_authentication
|
116
|
-
async.run
|
117
|
-
end
|
115
|
+
after_process action, *args
|
118
116
|
end
|
119
117
|
|
120
118
|
def call_action action, *args
|
121
119
|
if Actions.has_key? action
|
122
120
|
Actions[action].bind(self).call *args
|
123
121
|
else
|
124
|
-
action_missing action, args
|
122
|
+
action_missing action, *args
|
125
123
|
end
|
126
124
|
end
|
125
|
+
|
126
|
+
def app_finalizer
|
127
|
+
on_close unless @closed
|
128
|
+
ensure
|
129
|
+
@socket.close if @socket
|
130
|
+
end
|
127
131
|
end
|
128
132
|
end
|
data/lib/hara/base.rb
CHANGED
@@ -3,11 +3,13 @@ require 'hara/app'
|
|
3
3
|
require 'hara/server'
|
4
4
|
|
5
5
|
module Hara
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
class << self
|
7
|
+
def env
|
8
|
+
@_env ||= (ENV['APP_ENV'] || :development).to_sym
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
11
|
+
def env= env
|
12
|
+
@_env = env
|
13
|
+
end
|
12
14
|
end
|
13
15
|
end
|
data/lib/hara/version.rb
CHANGED
data/spec/app_spec.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hara::App do
|
4
|
+
before :all do
|
5
|
+
Class.new Hara::App do
|
6
|
+
def init
|
7
|
+
@states = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def before_process action, *args
|
11
|
+
@states << [:before_process, action, args]
|
12
|
+
end
|
13
|
+
|
14
|
+
def after_process action, *args
|
15
|
+
@states << [:after_process, action, args]
|
16
|
+
end
|
17
|
+
|
18
|
+
def on_close
|
19
|
+
@states << :closed
|
20
|
+
end
|
21
|
+
|
22
|
+
def action_missing action, *args
|
23
|
+
socket << [:action_missing, action, args]
|
24
|
+
end
|
25
|
+
|
26
|
+
define_action :hello do |msg|
|
27
|
+
socket << "hello#{msg}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def authentication
|
31
|
+
socket.remote_ip == 'localhost'
|
32
|
+
end
|
33
|
+
|
34
|
+
def authentication_failed
|
35
|
+
@states << :fail
|
36
|
+
sleep 0.1
|
37
|
+
end
|
38
|
+
|
39
|
+
def after_authentication
|
40
|
+
@states << :success
|
41
|
+
sleep 0.1
|
42
|
+
end
|
43
|
+
|
44
|
+
def states
|
45
|
+
@states
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
before :each do
|
51
|
+
@socket = FayeSocket.new
|
52
|
+
@socket.remote_ip = 'localhost'
|
53
|
+
end
|
54
|
+
|
55
|
+
after :each do
|
56
|
+
if @app && @app.alive?
|
57
|
+
@app.terminate!
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'authentication_failed' do
|
62
|
+
@socket.remote_ip = '0.0.0.0'
|
63
|
+
@app = Hara::Application.new @socket
|
64
|
+
sleep 0.1 while @app.states.size == 0
|
65
|
+
@app.states.should == [:fail]
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'authentication_succeeded' do
|
69
|
+
@app = Hara::Application.new @socket
|
70
|
+
sleep 0.1 while @app.states.size == 0
|
71
|
+
@app.states.should == [:success]
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'remote call actions' do
|
75
|
+
@socket.client_send({action: :hello, args: [' world']}.to_json)
|
76
|
+
@app = Hara::Application.new @socket
|
77
|
+
sleep 0.1 until msg = @socket.client_read
|
78
|
+
msg.should == 'hello world'
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'action_missing should work' do
|
82
|
+
@socket.client_send({action: :hello_world, args: ['hello', 'world']}.to_json)
|
83
|
+
@app = Hara::Application.new @socket
|
84
|
+
sleep 0.1 until msg = @socket.client_read
|
85
|
+
msg.should == [:action_missing, 'hello_world', ['hello', 'world']]
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'callbacks should work' do
|
89
|
+
@app = Hara::Application.new @socket
|
90
|
+
@socket.client_send({action: :hello, args: [' world']}.to_json)
|
91
|
+
states = @app.states
|
92
|
+
sleep 0.2
|
93
|
+
@app.halt
|
94
|
+
states.should == [:success, [:before_process, "hello", [" world"]], [:after_process, "hello", [" world"]],:closed]
|
95
|
+
end
|
96
|
+
end
|
data/spec/hara_spec.rb
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'hara/base'
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
Celluloid.logger = nil
|
6
|
+
|
7
|
+
class FayeSocket
|
8
|
+
attr_accessor :remote_ip
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@client_messages = []
|
12
|
+
@server_messages = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def alive?
|
16
|
+
@alive
|
17
|
+
end
|
18
|
+
|
19
|
+
def close
|
20
|
+
@alive = false
|
21
|
+
end
|
22
|
+
|
23
|
+
def read
|
24
|
+
@server_messages.shift
|
25
|
+
end
|
26
|
+
|
27
|
+
def << message
|
28
|
+
@client_messages << message
|
29
|
+
end
|
30
|
+
|
31
|
+
def client_read
|
32
|
+
@client_messages.shift
|
33
|
+
end
|
34
|
+
|
35
|
+
def client_send message
|
36
|
+
@server_messages << message
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hara
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
12
|
+
date: 2013-06-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: reel
|
@@ -79,6 +79,9 @@ files:
|
|
79
79
|
- lib/hara/main.rb
|
80
80
|
- lib/hara/server.rb
|
81
81
|
- lib/hara/version.rb
|
82
|
+
- spec/app_spec.rb
|
83
|
+
- spec/hara_spec.rb
|
84
|
+
- spec/spec_helper.rb
|
82
85
|
homepage: http://github.com/jjyr/hara
|
83
86
|
licenses:
|
84
87
|
- MIT
|
@@ -104,4 +107,7 @@ rubygems_version: 1.8.23
|
|
104
107
|
signing_key:
|
105
108
|
specification_version: 3
|
106
109
|
summary: Hara can help your build [web ]socket server easier.
|
107
|
-
test_files:
|
110
|
+
test_files:
|
111
|
+
- spec/app_spec.rb
|
112
|
+
- spec/hara_spec.rb
|
113
|
+
- spec/spec_helper.rb
|