drb-websocket 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f5f989e53a1e77689135c986a7e50e88d7624df6
4
- data.tar.gz: d1b5c5e1ff6c7a835652e8ce69abf98337eb6a2b
3
+ metadata.gz: fe7890accdf437f9175be51a811147a0284968e7
4
+ data.tar.gz: c584b7b51179842a460f9dc1f5c28fbdc94793aa
5
5
  SHA512:
6
- metadata.gz: 7dfee7db6bd60abfa61a095a75b2a9c8546ccd4b1cf28d0e4fb01fe75ad9b62a341e534d5c44eb5ad51d39f82616f3fe5bd38e37d163c4561ad6b76805f8b8e0
7
- data.tar.gz: d71444cee9c8b450555d8bbaac5342e3efbafc5bc63e2cd1093466ff24b55fd9de8d05cc3d3a378a36a1ec313ca9d4312e96075c8298dbe830678697fdc1f59a
6
+ metadata.gz: 7ae6b7b7cb4255a8a610a7059910a190d0870a2a4839239db4ccf39322776434f587db5c02b526757a6f1d57b9f1e845ae4874c01bda24db7269ab80d0d8292d
7
+ data.tar.gz: f34974a952a74ec4cf4c5fcc9ae3b9ae24b1e965d57a7be96237e971dd19e64fed2e019b966e9d8e9c9b27b10ea4104836e8555e2250968c7e5345dc650499a3
data/lib/drb/websocket.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  require "drb/websocket/version"
2
2
  require 'drb/drb'
3
- require 'uri'
4
- require 'eventmachine'
5
- require 'faye/websocket'
3
+ require 'drb/websocket/rack_app'
6
4
 
7
5
  module DRb
8
6
  module WebSocket
@@ -28,116 +26,10 @@ module DRb
28
26
  def self.uri_option(uri, config)
29
27
  return uri, nil
30
28
  end
31
-
32
- def self.open(uri, config)
33
- unless uri =~ /^ws:\/\/(.*?):(\d+)(\/(.*))?$/
34
- raise(DRbBadScheme, uri) unless uri =~ /^ws:/
35
- raise(DRbBadURI, 'can\'t parse uri: ' + uri)
36
- end
37
-
38
- path, uuid = $4.split('/')
39
-
40
- unless path.nil? || path == 'callback'
41
- raise(DRbBadURI, 'can\'t parse uri: ' + uri)
42
- end
43
-
44
- handler = RackApp.handler(uri)
45
- callback_handler = handler if CallbackHandler === handler
46
- ClientSide.new(uri, config, callback_handler)
47
- end
48
-
49
- class CallbackHandler
50
- def initialize(uri)
51
- @uri = uri
52
- @queue = Thread::Queue.new
53
- end
54
-
55
- def on_message(data)
56
- sio = StrStream.new
57
- sio.write(data.pack('C*'))
58
- @queue.push sio
59
- end
60
-
61
- def on_session_start(ws)
62
- @ws = ws
63
- end
64
-
65
- def stream
66
- @queue.pop
67
- end
68
-
69
- def send(url, data)
70
- @ws.send(data.bytes)
71
- end
72
- end
73
-
74
- class ClientSide
75
- def initialize(uri, config, handler)
76
- @uri = uri
77
- @res = nil
78
- @config = config
79
- @msg = DRbMessage.new(config)
80
- @proxy = ENV['HTTP_PROXY']
81
- @handler = handler
82
- @queue = Thread::Queue.new
83
- end
84
-
85
- def close
86
- end
87
-
88
- def alive?
89
- false
90
- end
91
-
92
- def send_request(ref, msg_id, *arg, &b)
93
- stream = StrStream.new
94
- @msg.send_request(stream, ref, msg_id, *arg, &b)
95
- if @handler
96
- @handler.send(@uri, stream.buf)
97
- else
98
- send(@uri, stream.buf)
99
- end
100
- end
101
-
102
- def recv_reply
103
- Thread.start do
104
- @reply_stream = @handler.stream if @handler
105
-
106
- begin
107
- @msg.recv_reply(@reply_stream)
108
- rescue
109
- close
110
- raise $!
111
- end
112
- end
113
- end
114
-
115
- def send(uri, data)
116
- @reply_stream = StrStream.new
117
- it = URI.parse(uri)
118
- path = [(it.path=='' ? '/' : it.path), it.query].compact.join('?')
119
-
120
- EM.run do
121
- ws = Faye::WebSocket::Client.new(uri + path)
122
-
123
- ws.on :message do |event|
124
- sio = StrStream.new
125
- sio.write(event.data.pack('C*'))
126
-
127
- if @config[:load_limit] < sio.buf.size
128
- raise TypeError, 'too large packet'
129
- end
130
-
131
- ws.close
132
-
133
- EM.stop
134
- end
135
-
136
- ws.send(data.bytes)
137
- end
138
- end
139
- end
140
29
  end
141
30
 
142
31
  DRbProtocol.add_protocol(WebSocket)
143
32
  end
33
+
34
+ require 'drb/websocket/client'
35
+ require 'drb/websocket/server'
@@ -0,0 +1,130 @@
1
+ require 'uri'
2
+ require 'eventmachine'
3
+ require 'faye/websocket'
4
+
5
+ module DRb
6
+ module WebSocket
7
+ def self.open(uri, config)
8
+ unless uri =~ /^ws:\/\/(.*?):(\d+)(\/(.*))?$/
9
+ raise(DRbBadScheme, uri) unless uri =~ /^ws:/
10
+ raise(DRbBadURI, 'can\'t parse uri: ' + uri)
11
+ end
12
+
13
+ path, uuid = $4.split('/') if $4
14
+
15
+ unless path.nil? || path == 'callback'
16
+ raise(DRbBadURI, 'can\'t parse uri: ' + uri)
17
+ end
18
+
19
+ handler = RackApp.handler(uri)
20
+ callback_handler = handler || StandaloneCallbackHandler.new(uri, config)
21
+ ClientSide.new(uri, config, callback_handler)
22
+ end
23
+
24
+ class CallbackHandler
25
+ def initialize(uri)
26
+ @uri = uri
27
+ @queue = Thread::Queue.new
28
+ end
29
+
30
+ def on_message(data)
31
+ sio = StrStream.new
32
+ sio.write(data.pack('C*'))
33
+ @queue.push sio
34
+ end
35
+
36
+ def on_session_start(ws)
37
+ @ws = ws
38
+ end
39
+
40
+ def stream
41
+ @queue.pop
42
+ end
43
+
44
+ def send(url, data)
45
+ @ws.send(data.bytes)
46
+ end
47
+ end
48
+
49
+ class StandaloneCallbackHandler
50
+ def initialize(uri, config)
51
+ @uri = uri
52
+ @config = config
53
+ @queue = Thread::Queue.new
54
+ end
55
+
56
+ def stream
57
+ @queue.pop
58
+ end
59
+
60
+ def fiber=(fiber)
61
+ @fiber = fiber
62
+ end
63
+
64
+ def send(uri, data)
65
+ it = URI.parse(uri)
66
+ path = [(it.path=='' ? '/' : it.path), it.query].compact.join('?')
67
+
68
+ Thread.new do
69
+ EM.run do
70
+ ws = Faye::WebSocket::Client.new(uri + path)
71
+
72
+ ws.on :message do |event|
73
+ sio = StrStream.new
74
+ sio.write(event.data.pack('C*'))
75
+ @queue.push sio
76
+
77
+ if @config[:load_limit] < sio.buf.size
78
+ raise TypeError, 'too large packet'
79
+ end
80
+
81
+ ws.close
82
+
83
+ EM.stop
84
+ @fiber.resume
85
+ end
86
+
87
+ ws.send(data.bytes)
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ class ClientSide
94
+ def initialize(uri, config, handler)
95
+ @uri = uri
96
+ @res = nil
97
+ @config = config
98
+ @msg = DRbMessage.new(config)
99
+ @proxy = ENV['HTTP_PROXY']
100
+ @handler = handler
101
+ @queue = Thread::Queue.new
102
+ end
103
+
104
+ def close
105
+ end
106
+
107
+ def alive?
108
+ false
109
+ end
110
+
111
+ def send_request(ref, msg_id, *arg, &b)
112
+ stream = StrStream.new
113
+ @msg.send_request(stream, ref, msg_id, *arg, &b)
114
+ @handler.send(@uri, stream.buf)
115
+ end
116
+
117
+ def recv_reply
118
+ @reply_stream = @handler.stream
119
+
120
+ begin
121
+ @msg.recv_reply(@reply_stream)
122
+ rescue
123
+ close
124
+ raise $!
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+
@@ -1,6 +1,3 @@
1
- require 'drb/drb'
2
- require_relative './rack_app'
3
- require 'drb/websocket'
4
1
  require 'thread'
5
2
  require 'rack'
6
3
  require 'thin'
@@ -17,27 +14,24 @@ module DRb
17
14
  Server.new(uri, config)
18
15
  end
19
16
 
20
- class Callback
21
- def initialize(drb)
22
- @drb = drb
23
- @queue = Thread::Queue.new
17
+ class Messages
18
+ def initialize
19
+ @request_message = Thread::Queue.new
20
+ @reply_message = Thread::Queue.new
24
21
  end
25
22
 
26
- def recv_mesg(msg)
27
- @msg = msg
28
- @drb.push(self)
29
- @queue.pop
23
+ def recv_message(message)
24
+ @request_message.push message
25
+ @reply_message.pop
30
26
  end
31
27
 
32
- def message
33
- @msg
28
+ def request_message
29
+ @request_message.pop
34
30
  end
35
31
 
36
32
  def reply(body)
37
- @queue.push(body)
33
+ @reply_message.push(body)
38
34
  end
39
-
40
- def close; end
41
35
  end
42
36
 
43
37
  class Server
@@ -63,49 +57,52 @@ module DRb
63
57
  end
64
58
 
65
59
  def close
66
- RackApp.close(@uri)
67
- end
68
-
69
- def push(callback)
70
- @queue.push(callback)
60
+ @ws.close
61
+ @ws = nil
71
62
  end
72
63
 
73
64
  def accept
74
- callback = @queue.pop
75
- ServerSide.new(callback, @config, uri)
65
+ messages = @queue.pop
66
+ ServerSide.new(messages, @config, uri)
76
67
  end
77
68
 
78
69
  def on_message(data)
79
- callback = Callback.new(self)
80
- res = callback.recv_mesg(data.pack('C*'))
81
- @ws.send(res.bytes)
82
70
  end
83
71
 
84
72
  def on_session_start(ws)
85
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)
86
82
  end
87
83
  end
88
84
 
89
85
  class ServerSide
90
86
  attr_reader :uri
91
87
 
92
- def initialize(callback, config, uri)
88
+ def initialize(messages, config, uri)
93
89
  @uri = uri
94
- @callback = callback
90
+ @messages = messages
95
91
  @config = config
96
92
  @msg = DRbMessage.new(@config)
97
- @req_stream = StrStream.new(@callback.message)
98
93
  end
99
94
 
100
95
  def close
101
- @callback.close if @callback
102
- @callback = nil
96
+ @messages = nil
103
97
  end
104
98
 
105
- def alive?; false; end
99
+ def alive?
100
+ !!@messages
101
+ end
106
102
 
107
103
  def recv_request
108
104
  begin
105
+ @req_stream = StrStream.new(@messages.request_message)
109
106
  @msg.recv_request(@req_stream)
110
107
  rescue
111
108
  close
@@ -115,10 +112,10 @@ module DRb
115
112
 
116
113
  def send_reply(succ, result)
117
114
  begin
118
- return unless @callback
115
+ return unless alive?
119
116
  stream = StrStream.new
120
117
  @msg.send_reply(stream, succ, result)
121
- @callback.reply(stream.buf)
118
+ @messages.reply(stream.buf)
122
119
  rescue
123
120
  close
124
121
  raise $!
@@ -1,5 +1,5 @@
1
1
  module Drb
2
2
  module Websocket
3
- VERSION = "0.3.1"
3
+ VERSION = "0.3.2"
4
4
  end
5
5
  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.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - youchan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-17 00:00:00.000000000 Z
11
+ date: 2017-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faye-websocket
@@ -115,6 +115,7 @@ files:
115
115
  - examples/client.rb
116
116
  - examples/server.rb
117
117
  - lib/drb/websocket.rb
118
+ - lib/drb/websocket/client.rb
118
119
  - lib/drb/websocket/rack_app.rb
119
120
  - lib/drb/websocket/server.rb
120
121
  - lib/drb/websocket/version.rb
@@ -137,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
138
  version: '0'
138
139
  requirements: []
139
140
  rubyforge_project:
140
- rubygems_version: 2.6.11
141
+ rubygems_version: 2.6.13
141
142
  signing_key:
142
143
  specification_version: 4
143
144
  summary: A druby protocol of WebSocket.