spider-gazelle 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,36 +2,87 @@ require 'websocket/driver'
2
2
 
3
3
 
4
4
  module SpiderGazelle
5
- class Websocket
6
- attr_reader :env, :url, :driver, :socket
7
-
8
-
9
- def initialize(tcp, env)
10
- @socket, @env = tcp, env
11
-
12
- scheme = Rack::Request.new(env).ssl? ? 'wss://' : 'ws://'
13
- @url = scheme + env['HTTP_HOST'] + env['REQUEST_URI']
14
- @driver = ::WebSocket::Driver.rack(self)
15
-
16
- # Pass data from the socket to the driver
17
- @socket.progress do |data|
18
- @driver.parse(data)
19
- end
20
-
21
- # Driver has indicated that it is closing
22
- # We'll close the socket after writing any remaining data
23
- @driver.on(:close) {
24
- @socket.shutdown
25
- }
26
- end
27
-
28
- def start
29
- @driver.start
30
- @socket.start_read
31
- end
32
-
33
- def write(string)
34
- @socket.write(string)
35
- end
36
- end
5
+ # TODO:: make a promise that resolves when closed
6
+ class Websocket < ::Libuv::Q::DeferredPromise
7
+ attr_reader :env, :url, :driver, :socket
8
+
9
+
10
+ def initialize(tcp, env)
11
+ @socket, @env = tcp, env
12
+
13
+ # Initialise the promise
14
+ super(@socket.loop, @socket.loop.defer)
15
+
16
+ scheme = env[Request::RACK_URLSCHEME] == Request::HTTPS_URL_SCHEME ? 'wss://' : 'ws://'
17
+ @url = scheme + env[Request::HTTP_HOST] + env[Request::REQUEST_URI]
18
+ @driver = ::WebSocket::Driver.rack(self)
19
+
20
+ # Pass data from the socket to the driver
21
+ @socket.progress &method(:socket_read)
22
+ @socket.finally &method(:socket_close)
23
+
24
+
25
+ # Driver has indicated that it is closing
26
+ # We'll close the socket after writing any remaining data
27
+ @driver.on(:close, &method(:on_close))
28
+ @driver.on(:message, &method(:on_message))
29
+ @driver.on(:error, &method(:on_error))
30
+ end
31
+
32
+ def start
33
+ @driver.start
34
+ end
35
+
36
+ def text(string)
37
+ data = string.to_s
38
+ @loop.schedule do
39
+ @driver.text(data)
40
+ end
41
+ end
42
+
43
+ def binary(array)
44
+ data = array.to_a
45
+ @loop.schedule do
46
+ @driver.binary(data)
47
+ end
48
+ end
49
+
50
+ def progress(callback = nil, &blk)
51
+ @progress = callback || blk
52
+ end
53
+
54
+
55
+ def write(data)
56
+ @socket.write(data)
57
+ end
58
+
59
+
60
+ protected
61
+
62
+
63
+ def socket_read(data, tcp)
64
+ @driver.parse(data)
65
+ end
66
+
67
+ def socket_close
68
+ if @shutdown_called.nil?
69
+ @defer.reject(WebSocket::Driver::CloseEvent.new(1006, 'connection was closed unexpectedly'))
70
+ end
71
+ end
72
+
73
+
74
+ def on_message(event)
75
+ @progress.call(event.data, self) unless @progress.nil?
76
+ end
77
+
78
+ def on_error(event)
79
+ @defer.reject(event)
80
+ end
81
+
82
+ def on_close(event)
83
+ @shutdown_called = true
84
+ @socket.shutdown
85
+ @defer.resolve(event)
86
+ end
87
+ end
37
88
  end
@@ -1,3 +1,3 @@
1
1
  module SpiderGazelle
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -21,6 +21,8 @@ Gem::Specification.new do |s|
21
21
  s.add_dependency 'libuv' # Ruby FFI bindings for https://github.com/joyent/libuv
22
22
  s.add_dependency 'rack', '>= 1.0.0' # Ruby web server interface
23
23
  s.add_dependency 'websocket-driver' # Websocket parser
24
+ s.add_dependency 'thread_safe' # Thread safe hashes
25
+ s.add_dependency 'radix' # Converts numbers to the unicode representation
24
26
 
25
27
  s.add_development_dependency 'rspec' # Testing framework
26
28
  s.add_development_dependency 'yard' # Comment based documentation generation
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spider-gazelle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen von Takach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-27 00:00:00.000000000 Z
11
+ date: 2014-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: thread_safe
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: radix
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: rspec
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -121,6 +149,8 @@ extra_rdoc_files:
121
149
  - README.md
122
150
  files:
123
151
  - lib/rack/handler/spider-gazelle.rb
152
+ - lib/spider-gazelle/app_store.rb
153
+ - lib/spider-gazelle/binding.rb
124
154
  - lib/spider-gazelle/connection.rb
125
155
  - lib/spider-gazelle/error.rb
126
156
  - lib/spider-gazelle/gazelle.rb