drb-websocket 0.3.2 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: fe7890accdf437f9175be51a811147a0284968e7
4
- data.tar.gz: c584b7b51179842a460f9dc1f5c28fbdc94793aa
2
+ SHA256:
3
+ metadata.gz: c2b32ebe2bfd968d7c059fe793877dc8d991c40cd783aa3e09747e74cdfebb6b
4
+ data.tar.gz: ab794959933f89028c7b31b75e61a0dfd7444f268a5de262b8d4e8f8e2ad2e6e
5
5
  SHA512:
6
- metadata.gz: 7ae6b7b7cb4255a8a610a7059910a190d0870a2a4839239db4ccf39322776434f587db5c02b526757a6f1d57b9f1e845ae4874c01bda24db7269ab80d0d8292d
7
- data.tar.gz: f34974a952a74ec4cf4c5fcc9ae3b9ae24b1e965d57a7be96237e971dd19e64fed2e019b966e9d8e9c9b27b10ea4104836e8555e2250968c7e5345dc650499a3
6
+ metadata.gz: 36cdc524946deb717b49c50183a48c87f8efe2857986b6d0a9f6ced795d3380853258a68e9d86b95fef6c0dd31e11512b13ce5329b4b9b559681ff4dd456bba1
7
+ data.tar.gz: 8fe1f109859622d83654b8fe9981c0cc7585bd7b0b05e033afcb615063d52ae67b16a5e4368081e1cbbd05a2dc955d67c6ff590366bf1a1471430419a8699982
data/Gemfile.lock CHANGED
@@ -1,27 +1,51 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ drb-websocket (0.4.0)
5
+ faye-websocket
6
+ rack
7
+ thin
8
+
1
9
  GEM
2
10
  remote: https://rubygems.org/
3
11
  specs:
4
- daemons (1.2.4)
5
- eventmachine (1.2.3)
12
+ daemons (1.2.6)
13
+ diff-lcs (1.3)
14
+ eventmachine (1.2.5)
6
15
  faye-websocket (0.10.7)
7
16
  eventmachine (>= 0.12.0)
8
17
  websocket-driver (>= 0.5.1)
9
- rack (2.0.3)
18
+ rack (2.0.4)
19
+ rake (10.5.0)
20
+ rspec (3.7.0)
21
+ rspec-core (~> 3.7.0)
22
+ rspec-expectations (~> 3.7.0)
23
+ rspec-mocks (~> 3.7.0)
24
+ rspec-core (3.7.0)
25
+ rspec-support (~> 3.7.0)
26
+ rspec-expectations (3.7.0)
27
+ diff-lcs (>= 1.2.0, < 2.0)
28
+ rspec-support (~> 3.7.0)
29
+ rspec-mocks (3.7.0)
30
+ diff-lcs (>= 1.2.0, < 2.0)
31
+ rspec-support (~> 3.7.0)
32
+ rspec-support (3.7.0)
10
33
  thin (1.7.2)
11
34
  daemons (~> 1.0, >= 1.0.9)
12
35
  eventmachine (~> 1.0, >= 1.0.4)
13
36
  rack (>= 1, < 3)
14
- websocket-driver (0.6.5)
37
+ websocket-driver (0.7.0)
15
38
  websocket-extensions (>= 0.1.0)
16
- websocket-extensions (0.1.2)
39
+ websocket-extensions (0.1.3)
17
40
 
18
41
  PLATFORMS
19
42
  ruby
20
43
 
21
44
  DEPENDENCIES
22
- faye-websocket
23
- rack
24
- thin
45
+ bundler (~> 1.14)
46
+ drb-websocket!
47
+ rake (~> 10.0)
48
+ rspec (~> 3.0)
25
49
 
26
50
  BUNDLED WITH
27
- 1.14.6
51
+ 1.16.1
data/lib/drb/websocket.rb CHANGED
@@ -31,5 +31,7 @@ module DRb
31
31
  DRbProtocol.add_protocol(WebSocket)
32
32
  end
33
33
 
34
+ require 'drb/websocket/ws_client'
34
35
  require 'drb/websocket/client'
36
+ require 'drb/websocket/callback_server'
35
37
  require 'drb/websocket/server'
@@ -0,0 +1,74 @@
1
+ module DRb
2
+ module WebSocket
3
+ class CallbackServer
4
+ attr_reader :uri
5
+
6
+ def initialize(uri, config)
7
+ @uri = uri
8
+ @config = config
9
+ @wsclient = WSClient.new(uri)
10
+ @queue = Thread::Queue.new
11
+
12
+ @wsclient.on(:message) do |event|
13
+ message = event.data
14
+ sender_id = message.shift(36).pack('C*')
15
+ @queue << [sender_id, message.pack('C*')]
16
+ end
17
+ end
18
+
19
+ def close
20
+ @wsclient.close
21
+ @wsclient = nil
22
+ end
23
+
24
+ def accept
25
+ (sender_id, message) = @queue.pop
26
+ ServerSide.new(@wsclient, sender_id, message, @config, @uri)
27
+ end
28
+
29
+ class ServerSide
30
+ attr_reader :uri
31
+
32
+ def initialize(wsclient, sender_id, message, config, uri)
33
+ @message = message
34
+ @sender_id = sender_id
35
+ @wsclient = wsclient
36
+ @uri = uri
37
+ @config = config
38
+ @msg = DRbMessage.new(@config)
39
+ end
40
+
41
+ def close
42
+ @wsclient = nil
43
+ end
44
+
45
+ def alive?
46
+ !!@wsclient
47
+ end
48
+
49
+ def recv_request
50
+ begin
51
+ @req_stream = StrStream.new(@message)
52
+ @msg.recv_request(@req_stream)
53
+ rescue
54
+ close
55
+ raise $!
56
+ end
57
+ end
58
+
59
+ def send_reply(succ, result)
60
+ begin
61
+ return unless alive?
62
+ stream = StrStream.new
63
+ @msg.send_reply(stream, succ, result)
64
+ @wsclient.send((@sender_id + stream.buf).bytes)
65
+ rescue
66
+ puts $!.full_message
67
+ close
68
+ raise $!
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -16,21 +16,25 @@ module DRb
16
16
  raise(DRbBadURI, 'can\'t parse uri: ' + uri)
17
17
  end
18
18
 
19
- handler = RackApp.handler(uri)
20
- callback_handler = handler || StandaloneCallbackHandler.new(uri, config)
21
- ClientSide.new(uri, config, callback_handler)
19
+ handler = RackApp.handler(uri) || Handler.new(uri, config)
20
+ ClientSide.new(uri, config, handler)
22
21
  end
23
22
 
24
23
  class CallbackHandler
25
24
  def initialize(uri)
26
25
  @uri = uri
27
26
  @queue = Thread::Queue.new
27
+ @sender_id = SecureRandom.uuid
28
28
  end
29
29
 
30
30
  def on_message(data)
31
- sio = StrStream.new
32
- sio.write(data.pack('C*'))
33
- @queue.push sio
31
+ sender_id = data.shift(36).pack('C*')
32
+
33
+ if sender_id == @sender_id
34
+ sio = StrStream.new
35
+ sio.write(data.pack('C*'))
36
+ @queue.push sio
37
+ end
34
38
  end
35
39
 
36
40
  def on_session_start(ws)
@@ -41,51 +45,44 @@ module DRb
41
45
  @queue.pop
42
46
  end
43
47
 
44
- def send(url, data)
45
- @ws.send(data.bytes)
48
+ def send(uri, data)
49
+ @ws.send((@sender_id + data).bytes)
46
50
  end
47
51
  end
48
52
 
49
- class StandaloneCallbackHandler
53
+ class Handler
50
54
  def initialize(uri, config)
51
55
  @uri = uri
52
56
  @config = config
53
57
  @queue = Thread::Queue.new
58
+ @sender_id = SecureRandom.uuid
54
59
  end
55
60
 
56
- def stream
57
- @queue.pop
58
- end
59
-
60
- def fiber=(fiber)
61
- @fiber = fiber
61
+ def stream(&block)
62
+ @queue.pop(&block)
62
63
  end
63
64
 
64
65
  def send(uri, data)
65
- it = URI.parse(uri)
66
- path = [(it.path=='' ? '/' : it.path), it.query].compact.join('?')
66
+ @wsclient = WSClient.new(uri)
67
+ @wsclient.on(:message) do |event|
68
+ message = event.data
69
+ sender_id = message.shift(36).pack('C*')
67
70
 
68
- Thread.new do
69
- EM.run do
70
- ws = Faye::WebSocket::Client.new(uri + path)
71
+ next if sender_id != @sender_id
71
72
 
72
- ws.on :message do |event|
73
- sio = StrStream.new
74
- sio.write(event.data.pack('C*'))
75
- @queue.push sio
73
+ sio = StrStream.new
74
+ sio.write(message.pack('C*'))
75
+ @queue.push sio
76
76
 
77
- if @config[:load_limit] < sio.buf.size
78
- raise TypeError, 'too large packet'
79
- end
80
-
81
- ws.close
77
+ if @config[:load_limit] < sio.buf.size
78
+ raise TypeError, 'too large packet'
79
+ end
82
80
 
83
- EM.stop
84
- @fiber.resume
85
- end
81
+ @wsclient.close
82
+ end
86
83
 
87
- ws.send(data.bytes)
88
- end
84
+ @wsclient.on(:open) do
85
+ @wsclient.send((@sender_id + data).bytes)
89
86
  end
90
87
  end
91
88
  end
@@ -98,7 +95,6 @@ module DRb
98
95
  @msg = DRbMessage.new(config)
99
96
  @proxy = ENV['HTTP_PROXY']
100
97
  @handler = handler
101
- @queue = Thread::Queue.new
102
98
  end
103
99
 
104
100
  def close
@@ -115,10 +111,9 @@ module DRb
115
111
  end
116
112
 
117
113
  def recv_reply
118
- @reply_stream = @handler.stream
119
-
114
+ reply_stream = @handler.stream
120
115
  begin
121
- @msg.recv_reply(@reply_stream)
116
+ @msg.recv_reply(reply_stream)
122
117
  rescue
123
118
  close
124
119
  raise $!
@@ -11,26 +11,11 @@ module DRb
11
11
  raise(DRbBadScheme, uri) unless uri =~ /^ws:/
12
12
  raise(DRbBadURI, 'can\'t parse uri: ' + uri)
13
13
  end
14
- Server.new(uri, config)
15
- end
16
-
17
- class Messages
18
- def initialize
19
- @request_message = Thread::Queue.new
20
- @reply_message = Thread::Queue.new
21
- end
22
-
23
- def recv_message(message)
24
- @request_message.push message
25
- @reply_message.pop
26
- end
27
-
28
- def request_message
29
- @request_message.pop
30
- end
31
14
 
32
- def reply(body)
33
- @reply_message.push(body)
15
+ if $4 == 'callback'
16
+ CallbackServer.new(uri, config)
17
+ else
18
+ Server.new(uri, config)
34
19
  end
35
20
  end
36
21
 
@@ -41,7 +26,6 @@ module DRb
41
26
  @uri = uri
42
27
  @config = config
43
28
  @queue = Thread::Queue.new
44
-
45
29
  Faye::WebSocket.load_adapter('thin')
46
30
 
47
31
  u = URI.parse(uri)
@@ -57,47 +41,68 @@ module DRb
57
41
  end
58
42
 
59
43
  def close
60
- @ws.close
61
- @ws = nil
62
44
  end
63
45
 
64
46
  def accept
65
- messages = @queue.pop
66
- ServerSide.new(messages, @config, uri)
47
+ ws = @queue.pop
48
+ ServerSide.new(ws, @config, uri)
67
49
  end
68
50
 
69
51
  def on_message(data)
70
52
  end
71
53
 
72
54
  def on_session_start(ws)
73
- @ws = ws
74
- messages = Messages.new
75
- @ws.on(:message) do |event|
76
- Thread.new do
77
- res = messages.recv_message(event.data.pack('C*'))
78
- @ws.send(res.bytes)
79
- end.run
80
- end
81
- @queue.push(messages)
55
+ @queue.push(ws)
56
+ end
57
+ end
58
+
59
+ class Messages
60
+ def initialize
61
+ @request_message = Thread::Queue.new
62
+ @reply_message = Thread::Queue.new
63
+ end
64
+
65
+ def recv_message(message)
66
+ @request_message.push message
67
+ @reply_message.pop
68
+ end
69
+
70
+ def request_message
71
+ @request_message.pop
72
+ end
73
+
74
+ def reply(body)
75
+ @reply_message.push(body)
82
76
  end
83
77
  end
84
78
 
85
79
  class ServerSide
86
80
  attr_reader :uri
87
81
 
88
- def initialize(messages, config, uri)
82
+ def initialize(ws, config, uri)
89
83
  @uri = uri
90
- @messages = messages
91
84
  @config = config
92
85
  @msg = DRbMessage.new(@config)
86
+ @ws = ws
87
+
88
+ @messages = Messages.new
89
+ @ws.on(:message) do |event|
90
+ message = event.data
91
+ sender_id = message.shift(36)
92
+ EM.defer do
93
+ res = @messages.recv_message(message.pack('C*'))
94
+ @ws.send(sender_id + res.bytes)
95
+ end
96
+ end
93
97
  end
94
98
 
95
99
  def close
96
- @messages = nil
100
+ @ws.close
101
+ @ws = nil
97
102
  end
98
103
 
99
104
  def alive?
100
- !!@messages
105
+ !!@ws
101
106
  end
102
107
 
103
108
  def recv_request
@@ -1,5 +1,5 @@
1
1
  module Drb
2
2
  module Websocket
3
- VERSION = "0.3.2"
3
+ VERSION = "0.4.0"
4
4
  end
5
5
  end
@@ -0,0 +1,63 @@
1
+
2
+ module DRb
3
+ module WebSocket
4
+ class WSClient
5
+ attr_reader :uri
6
+
7
+ def initialize(uri)
8
+ @uri = uri
9
+ WSClient.start
10
+
11
+ @handlers = { open: [], message: [] }
12
+ @ws = Faye::WebSocket::Client.new(uri)
13
+
14
+ EM.defer do
15
+ @ws.on :open do |event|
16
+ @handlers[:open].each do |proc|
17
+ proc.call event
18
+ end
19
+ end
20
+
21
+ @ws.on :message do |event|
22
+ @handlers[:message].each do |proc|
23
+ proc.call event
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def on(event, &block)
30
+ @handlers[event] << block
31
+ end
32
+
33
+ def send(data)
34
+ @ws.send(data)
35
+ end
36
+
37
+ def close
38
+ @ws.close
39
+ @ws = nil
40
+ end
41
+
42
+ def self.start
43
+ if @thread
44
+ return
45
+ end
46
+
47
+ @thread = Thread.new do
48
+ EM.run
49
+ end
50
+ end
51
+
52
+ def self.thread
53
+ @thread
54
+ end
55
+
56
+ def self.stop
57
+ EM.stop
58
+ @thread.join
59
+ @thread = nil
60
+ end
61
+ end
62
+ end
63
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drb-websocket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - youchan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-10-15 00:00:00.000000000 Z
11
+ date: 2018-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faye-websocket
@@ -115,10 +115,12 @@ files:
115
115
  - examples/client.rb
116
116
  - examples/server.rb
117
117
  - lib/drb/websocket.rb
118
+ - lib/drb/websocket/callback_server.rb
118
119
  - lib/drb/websocket/client.rb
119
120
  - lib/drb/websocket/rack_app.rb
120
121
  - lib/drb/websocket/server.rb
121
122
  - lib/drb/websocket/version.rb
123
+ - lib/drb/websocket/ws_client.rb
122
124
  homepage: https://github.com/youchan/drb-websocket
123
125
  licenses: []
124
126
  metadata: {}
@@ -138,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
140
  version: '0'
139
141
  requirements: []
140
142
  rubyforge_project:
141
- rubygems_version: 2.6.13
143
+ rubygems_version: 2.7.3
142
144
  signing_key:
143
145
  specification_version: 4
144
146
  summary: A druby protocol of WebSocket.