hara 0.2.1 → 0.2.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/README.md +25 -6
- data/hara.gemspec +1 -1
- data/lib/hara/app.rb +11 -2
- data/lib/hara/server.rb +2 -1
- data/lib/hara/version.rb +1 -1
- data/spec/app_spec.rb +19 -5
- data/spec/spec_helper.rb +18 -3
- metadata +3 -3
data/README.md
CHANGED
@@ -3,13 +3,13 @@
|
|
3
3
|
[](http://badge.fury.io/rb/hara)
|
4
4
|
[](https://travis-ci.org/jjyr/hara)
|
5
5
|
|
6
|
-
Hara is a simple framework, help you build async & concurrent websocket server.
|
6
|
+
Hara is a simple framework, help you build async-io & concurrent websocket server.
|
7
7
|
|
8
|
-
Hara's async ability from [em-websocket](https://github.com/igrigorik/em-websocket),
|
8
|
+
Hara's async-io ability from [em-websocket](https://github.com/igrigorik/em-websocket),
|
9
9
|
|
10
10
|
Hara's concurrent ability from [celluloid](https://github.com/celluloid/celluloid).
|
11
11
|
|
12
|
-
|
12
|
+
Seems eventmachine and celluloid work well together :smile:
|
13
13
|
|
14
14
|
## Installation
|
15
15
|
|
@@ -57,13 +57,14 @@ ws.send(msg)
|
|
57
57
|
|
58
58
|
`ruby test.rb -h` to view options
|
59
59
|
|
60
|
-
##
|
60
|
+
## Full Usages
|
61
61
|
|
62
62
|
```ruby
|
63
63
|
require 'hara/base'
|
64
64
|
|
65
65
|
class Echo
|
66
|
-
#include Hara::App, make you Echo class become Celluloid::Actor
|
66
|
+
#include Hara::App, make you Echo class become Celluloid::Actor,
|
67
|
+
# and per actor handle a socket
|
67
68
|
include Hara::App
|
68
69
|
|
69
70
|
#Hara::App provide some callbacks
|
@@ -79,22 +80,40 @@ class Echo
|
|
79
80
|
|
80
81
|
define_action :echo do |str|
|
81
82
|
puts "#{client_ip} #{client_port}"
|
83
|
+
#send message to socket
|
82
84
|
socket.send str
|
83
85
|
end
|
84
86
|
|
87
|
+
define_action :exit do
|
88
|
+
puts "#{client_ip} exit"
|
89
|
+
# close client connection
|
90
|
+
close
|
91
|
+
end
|
92
|
+
|
85
93
|
def after_action action, *args
|
86
94
|
puts 'called when action complete'
|
87
95
|
end
|
96
|
+
|
97
|
+
def action_missing action, *args
|
98
|
+
socket.send 'error'
|
99
|
+
super
|
100
|
+
end
|
101
|
+
|
102
|
+
def on_close close_info
|
103
|
+
puts "#{client_ip} connection closed"
|
104
|
+
end
|
88
105
|
end
|
89
106
|
|
90
107
|
#if you require 'hara/base' you need start server you self, like below
|
91
108
|
Hara::Server.start 'localhost', '3000'
|
92
109
|
```
|
93
110
|
|
94
|
-
##
|
111
|
+
## Client
|
95
112
|
|
96
113
|
js client is processing
|
97
114
|
|
115
|
+
current format is JSON.stringify({action: 'echo',args:['hello world']})
|
116
|
+
|
98
117
|
## Contributing
|
99
118
|
|
100
119
|
1. Fork it
|
data/hara.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Hara::VERSION
|
9
9
|
spec.authors = ["jjy"]
|
10
10
|
spec.email = ["jjyruby@gmail.com"]
|
11
|
-
spec.description = %q{Hara help you build async & concurrent websocket server.}
|
11
|
+
spec.description = %q{Hara help you build async-io & concurrent websocket server.}
|
12
12
|
spec.summary = %q{In fact, hara just a combination of em-websocket and celluloid, but it really help you write applications easily.}
|
13
13
|
spec.homepage = "http://github.com/jjyr/hara"
|
14
14
|
spec.license = "MIT"
|
data/lib/hara/app.rb
CHANGED
@@ -61,7 +61,7 @@ module Hara
|
|
61
61
|
def after_action action, args
|
62
62
|
end
|
63
63
|
|
64
|
-
def on_close
|
64
|
+
def on_close close_info = {}
|
65
65
|
end
|
66
66
|
|
67
67
|
##################
|
@@ -77,6 +77,11 @@ module Hara
|
|
77
77
|
handshake.headers_downcased
|
78
78
|
end
|
79
79
|
|
80
|
+
# close connection
|
81
|
+
def close code = nil, body = nil
|
82
|
+
@socket.close code, body
|
83
|
+
end
|
84
|
+
|
80
85
|
#below are internal functions(should not been overriding)
|
81
86
|
|
82
87
|
def initialize handshake, socket
|
@@ -110,8 +115,12 @@ module Hara
|
|
110
115
|
end
|
111
116
|
end
|
112
117
|
|
118
|
+
def set_close_info close_info
|
119
|
+
@_close_info = close_info
|
120
|
+
end
|
121
|
+
|
113
122
|
def app_finalizer
|
114
|
-
on_close
|
123
|
+
on_close @_close_info
|
115
124
|
ensure
|
116
125
|
@socket.close if @socket
|
117
126
|
end
|
data/lib/hara/server.rb
CHANGED
data/lib/hara/version.rb
CHANGED
data/spec/app_spec.rb
CHANGED
@@ -17,7 +17,7 @@ describe Hara::App do
|
|
17
17
|
@states << [:after_action, action, args]
|
18
18
|
end
|
19
19
|
|
20
|
-
def on_close
|
20
|
+
def on_close close_info
|
21
21
|
@states << :closed
|
22
22
|
end
|
23
23
|
|
@@ -29,6 +29,10 @@ describe Hara::App do
|
|
29
29
|
socket.send "hello#{msg}"
|
30
30
|
end
|
31
31
|
|
32
|
+
define_action :exit do
|
33
|
+
close 3333, "Bye"
|
34
|
+
end
|
35
|
+
|
32
36
|
def states
|
33
37
|
@states
|
34
38
|
end
|
@@ -39,6 +43,7 @@ describe Hara::App do
|
|
39
43
|
@handshake = FayeHandshake.new
|
40
44
|
@socket = FayeSocket.new
|
41
45
|
@app = Hara::Application.new @handshake, @socket
|
46
|
+
@socket.app = @app
|
42
47
|
end
|
43
48
|
|
44
49
|
after :each do
|
@@ -55,20 +60,29 @@ describe Hara::App do
|
|
55
60
|
|
56
61
|
it 'remote call actions' do
|
57
62
|
@app.process_msg(Hara.encode_msg(:hello, ' world'))
|
58
|
-
|
63
|
+
msg = nil
|
64
|
+
wait_until{msg = @socket.client_read}
|
59
65
|
msg.should == 'hello world'
|
60
66
|
end
|
61
67
|
|
68
|
+
it 'close should close connection' do
|
69
|
+
@app.process_msg(Hara.encode_msg(:exit))
|
70
|
+
wait_until{!@app.alive?}
|
71
|
+
@socket.alive?.should == false
|
72
|
+
@socket.close_info.should == [3333, 'Bye']
|
73
|
+
end
|
74
|
+
|
62
75
|
it 'error remote call' do
|
63
76
|
@app.process_msg('a error call')
|
64
|
-
|
77
|
+
wait_until{!@app.alive?}
|
65
78
|
msg = @socket.client_read
|
66
79
|
msg.should == nil
|
67
80
|
end
|
68
81
|
|
69
82
|
it 'action_missing should work' do
|
70
83
|
@app.process_msg(Hara.encode_msg(:hello_world, 'hello', 'world'))
|
71
|
-
|
84
|
+
msg = nil
|
85
|
+
wait_until{msg = @socket.client_read}
|
72
86
|
msg.should == [:action_missing, 'hello_world', ['hello', 'world']]
|
73
87
|
end
|
74
88
|
|
@@ -77,7 +91,7 @@ describe Hara::App do
|
|
77
91
|
states = @app.states
|
78
92
|
sleep 0.2
|
79
93
|
@app.terminate
|
80
|
-
|
94
|
+
wait_until{!@app.alive?}
|
81
95
|
action_callbacks = [[:before_action, "hello", [" world"]], [:after_action, "hello", [" world"]]]
|
82
96
|
states.should == [*(action_callbacks * 2),:closed]
|
83
97
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,12 @@ require 'hara/base'
|
|
2
2
|
|
3
3
|
Celluloid.logger = nil
|
4
4
|
|
5
|
+
def wait_until wait_time = 3
|
6
|
+
timeout wait_time do
|
7
|
+
sleep 0.1 until yield
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
5
11
|
class FayeHandshake
|
6
12
|
def headers_downcased
|
7
13
|
{'host' => 'localhost:8080'}
|
@@ -9,7 +15,7 @@ class FayeHandshake
|
|
9
15
|
end
|
10
16
|
|
11
17
|
class FayeSocket
|
12
|
-
attr_accessor :remote_ip
|
18
|
+
attr_accessor :remote_ip, :close_info, :app
|
13
19
|
|
14
20
|
def initialize
|
15
21
|
@client_messages = []
|
@@ -18,6 +24,11 @@ class FayeSocket
|
|
18
24
|
@jruby_peername = "\x00\x02\x8Av\x7F\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
|
19
25
|
end
|
20
26
|
|
27
|
+
def app= app
|
28
|
+
@app = app
|
29
|
+
@alive = true
|
30
|
+
end
|
31
|
+
|
21
32
|
def get_peername
|
22
33
|
defined?(JRuby) ? @jruby_peername : @mri_peername
|
23
34
|
end
|
@@ -26,8 +37,12 @@ class FayeSocket
|
|
26
37
|
@alive
|
27
38
|
end
|
28
39
|
|
29
|
-
def close
|
30
|
-
@alive
|
40
|
+
def close code = nil, body = nil
|
41
|
+
if @alive
|
42
|
+
@close_info = [code, body]
|
43
|
+
@alive = false
|
44
|
+
@app.terminate!
|
45
|
+
end
|
31
46
|
end
|
32
47
|
|
33
48
|
def send message
|
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.2.
|
4
|
+
version: 0.2.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-07-
|
12
|
+
date: 2013-07-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: em-websocket
|
@@ -75,7 +75,7 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
-
description: Hara help you build async & concurrent websocket server.
|
78
|
+
description: Hara help you build async-io & concurrent websocket server.
|
79
79
|
email:
|
80
80
|
- jjyruby@gmail.com
|
81
81
|
executables: []
|