spider-gazelle 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,104 +1,94 @@
1
+ require 'spider-gazelle/const'
1
2
  require 'websocket/driver'
2
3
  require 'forwardable'
3
4
 
4
-
5
5
  module SpiderGazelle
6
- # TODO:: make a promise that resolves when closed
7
- class Websocket < ::Libuv::Q::DeferredPromise
8
- attr_reader :env, :url, :loop
9
-
10
-
11
- def initialize(tcp, env)
12
- @socket, @env = tcp, env
13
-
14
- # Initialise the promise
15
- super(@socket.loop, @socket.loop.defer)
16
-
17
- scheme = env[Request::RACK_URLSCHEME] == Request::HTTPS_URL_SCHEME ? 'wss://' : 'ws://'
18
- @url = scheme + env[Request::HTTP_HOST] + env[Request::REQUEST_URI]
19
- @driver = ::WebSocket::Driver.rack(self)
20
-
21
- # Pass data from the socket to the driver
22
- @socket.progress &method(:socket_read)
23
- @socket.finally &method(:socket_close)
24
-
25
-
26
- # Driver has indicated that it is closing
27
- # We'll close the socket after writing any remaining data
28
- @driver.on(:close, &method(:on_close))
29
- @driver.on(:message, &method(:on_message))
30
- @driver.on(:error, &method(:on_error))
31
- end
32
-
33
-
34
- extend Forwardable
35
- def_delegators :@driver, :start, :ping, :protocol, :ready_state, :set_header, :state, :close
36
- def_delegators :@socket, :write
37
-
38
-
39
- # Write some text to the websocket connection
40
- #
41
- # @param string [String] a string of data to be sent to the far end
42
- def text(string)
43
- data = string.to_s
44
- @loop.schedule do
45
- @driver.text(data)
46
- end
47
- end
48
-
49
- # Write some binary data to the websocket connection
50
- #
51
- # @param array [Array] an array of bytes to be sent to the far end
52
- def binary(array)
53
- data = array.to_a
54
- @loop.schedule do
55
- @driver.binary(data)
56
- end
57
- end
58
-
59
- # Used to define a callback when data is received from the client
60
- #
61
- # @param callback [Proc] the callback to be called when data is received
62
- def progress(callback = nil, &blk)
63
- @progress = callback || blk
64
- end
65
-
66
- # Used to define a callback when the websocket connection is established
67
- # Data sent before this callback is buffered.
68
- #
69
- # @param callback [Proc] the callback to be triggered on establishment
70
- def on_open(callback = nil, &blk)
71
- callback ||= blk
72
- @driver.on(:open, &callback)
73
- end
74
-
75
-
76
- protected
77
-
78
-
79
- def socket_read(data, tcp)
80
- @driver.parse(data)
81
- end
82
-
83
- def socket_close
84
- if @shutdown_called.nil?
85
- @defer.reject(WebSocket::Driver::CloseEvent.new(1006, 'connection was closed unexpectedly'))
86
- end
87
- end
88
-
89
-
90
- def on_message(event)
91
- @progress.call(event.data, self) unless @progress.nil?
92
- end
93
-
94
- def on_error(event)
95
- @defer.reject(event)
96
- end
97
-
98
- def on_close(event)
99
- @shutdown_called = true
100
- @socket.shutdown
101
- @defer.resolve(event)
102
- end
6
+ class Websocket < ::Libuv::Q::DeferredPromise
7
+ include Const
8
+
9
+ attr_reader :env, :url, :loop
10
+
11
+ extend Forwardable
12
+ def_delegators :@driver, :start, :ping, :protocol, :ready_state, :set_header, :state, :close
13
+ def_delegators :@socket, :write
14
+
15
+ def initialize(tcp, env)
16
+ @socket, @env = tcp, env
17
+
18
+ # Initialise the promise
19
+ super @socket.loop, @socket.loop.defer
20
+
21
+ scheme = env[RACK_URL_SCHEME] == HTTPS ? 'wss://' : 'ws://'
22
+ @url = scheme + env[HTTP_HOST] + env[REQUEST_URI]
23
+ @driver = ::WebSocket::Driver.rack self
24
+
25
+ # Pass data from the socket to the driver
26
+ @socket.progress &method(:socket_read)
27
+ @socket.finally &method(:socket_close)
28
+
29
+
30
+ # Driver has indicated that it is closing
31
+ # We'll close the socket after writing any remaining data
32
+ @driver.on :close, &method(:on_close)
33
+ @driver.on :message, &method(:on_message)
34
+ @driver.on :error, &method(:on_error)
35
+ end
36
+
37
+ # Write some text to the websocket connection
38
+ #
39
+ # @param string [String] a string of data to be sent to the far end
40
+ def text(string)
41
+ @loop.schedule { @driver.text(string.to_s) }
42
+ end
43
+
44
+ # Write some binary data to the websocket connection
45
+ #
46
+ # @param array [Array] an array of bytes to be sent to the far end
47
+ def binary(array)
48
+ @loop.schedule { @driver.binary(array.to_a) }
49
+ end
50
+
51
+ # Used to define a callback when data is received from the client
52
+ #
53
+ # @param callback [Proc] the callback to be called when data is received
54
+ def progress(callback = nil, &blk)
55
+ @progress = callback || blk
56
+ end
57
+
58
+ # Used to define a callback when the websocket connection is established
59
+ # Data sent before this callback is buffered.
60
+ #
61
+ # @param callback [Proc] the callback to be triggered on establishment
62
+ def on_open(callback = nil, &blk)
63
+ callback ||= blk
64
+ @driver.on :open, &callback
65
+ end
66
+
67
+ protected
68
+
69
+ def socket_read(data, tcp)
70
+ @driver.parse data
71
+ end
72
+
73
+ def socket_close
74
+ if @shutdown_called.nil?
75
+ @defer.reject WebSocket::Driver::CloseEvent.new(1006, 'connection was closed unexpectedly')
76
+ end
77
+ end
78
+
79
+
80
+ def on_message(event)
81
+ @progress.call(event.data, self) unless @progress.nil?
82
+ end
83
+
84
+ def on_error(event)
85
+ @defer.reject event
86
+ end
87
+
88
+ def on_close(event)
89
+ @shutdown_called = true
90
+ @socket.shutdown
91
+ @defer.resolve event
103
92
  end
93
+ end
104
94
  end
@@ -1,10 +1,16 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
- require "spider-gazelle/version"
3
+
4
+ d = File.read(File.expand_path("../lib/spider-gazelle/const.rb", __FILE__))
5
+ if d =~ /VERSION = "(\d+\.\d+\.\d+)"/
6
+ version = $1
7
+ else
8
+ version = "0.0.1"
9
+ end
4
10
 
5
11
  Gem::Specification.new do |s|
6
12
  s.name = "spider-gazelle"
7
- s.version = SpiderGazelle::VERSION
13
+ s.version = version
8
14
  s.authors = ["Stephen von Takach"]
9
15
  s.email = ["steve@cotag.me"]
10
16
  s.license = 'MIT'
@@ -26,7 +32,6 @@ Gem::Specification.new do |s|
26
32
 
27
33
  s.add_development_dependency 'rspec' # Testing framework
28
34
  s.add_development_dependency 'yard' # Comment based documentation generation
29
-
30
35
 
31
36
  s.files = Dir["{lib,bin}/**/*"] + %w(Rakefile spider-gazelle.gemspec README.md LICENSE)
32
37
  s.test_files = Dir["spec/**/*"]
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.6
4
+ version: 0.1.7
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: 2014-02-21 00:00:00.000000000 Z
11
+ date: 2014-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -152,12 +152,11 @@ files:
152
152
  - lib/spider-gazelle/app_store.rb
153
153
  - lib/spider-gazelle/binding.rb
154
154
  - lib/spider-gazelle/connection.rb
155
- - lib/spider-gazelle/error.rb
155
+ - lib/spider-gazelle/const.rb
156
156
  - lib/spider-gazelle/gazelle.rb
157
157
  - lib/spider-gazelle/request.rb
158
158
  - lib/spider-gazelle/spider.rb
159
159
  - lib/spider-gazelle/upgrades/websocket.rb
160
- - lib/spider-gazelle/version.rb
161
160
  - lib/spider-gazelle.rb
162
161
  - bin/sg
163
162
  - Rakefile
@@ -1,16 +0,0 @@
1
-
2
- module SpiderGazelle
3
- module Error
4
-
5
- # Indicate that we couldn't parse the request
6
- ERROR_400_RESPONSE = "HTTP/1.1 400 Bad Request\r\nConnection: close\r\n\r\n".freeze
7
-
8
- # The standard empty 404 response for bad requests.
9
- ERROR_404_RESPONSE = "HTTP/1.1 404 Not Found\r\n\r\nNOT FOUND".freeze
10
-
11
- # Indicate that there was an internal error, obviously.
12
- ERROR_500_RESPONSE = "HTTP/1.1 500 Internal Server Error\r\n\r\n".freeze
13
-
14
-
15
- end
16
- end
@@ -1,3 +0,0 @@
1
- module SpiderGazelle
2
- VERSION = "0.1.6"
3
- end