WEBSocket 0.0.1

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.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Matthieu "Ezveus" Ciappara
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,89 @@
1
+ # WEBSocket
2
+
3
+ Establish a websocket communication using Ruby standard sockets or
4
+ [Celluloid::IO](http://github.com/celluloid/celluloid-io) sockets if
5
+ required.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'WEBSocket'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install WEBSocket
20
+
21
+ ## Usage
22
+
23
+
24
+ ### WEBSocket::Socket
25
+
26
+ This socket is a Ruby standard socket unless 'celluloid/io' has been
27
+ required. In both cases, WEBSocket::Socket works as a wrapper of Ruby
28
+ standard socket module.
29
+
30
+ ```ruby
31
+ require 'WEBSocket'
32
+
33
+ s = WEBSocket::Socket.new 'localhost', 4242
34
+ s.write "Ping"
35
+ pong = s.readpartial 4096
36
+ ```
37
+
38
+ ### WEBSocket::server
39
+
40
+ This server is a Ruby standard server unless 'celluloid/io' has been
41
+ required. In both cases, WEBSocket::Server works as a wrapper of Ruby
42
+ standard socket module.
43
+
44
+ Here is a standard echoserver
45
+
46
+ ```ruby
47
+ require 'celluloid/io'
48
+ require 'WEBSocket'
49
+
50
+ class EchoServer
51
+ include Celluloid::IO
52
+
53
+ def initialize host, port
54
+ puts "*** Starting echo server on #{host}:#{port}"
55
+
56
+ @server = WEBSocket::Server.new host, port
57
+ run!
58
+ end
59
+
60
+ def finalize
61
+ @server.close if @server
62
+ end
63
+
64
+ def run
65
+ loop { handle_connection! @server.accept }
66
+ end
67
+
68
+ def handle_connection socket
69
+ _, port, host = socket.peeraddr
70
+ puts "*** Received connection from #{host}:#{port}"
71
+ loop { socket.write socket.readpartial 4096 }
72
+ rescue EOFError
73
+ puts "*** #{host}:#{port} disconnected"
74
+ socket.close
75
+ end
76
+ end
77
+
78
+ supervisor = EchoServer.supervise("127.0.0.1", 1234)
79
+ trap("INT") { supervisor.terminate; exit }
80
+ sleep
81
+ ```
82
+
83
+ ## Contributing
84
+
85
+ 1. Fork it
86
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
87
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
88
+ 4. Push to the branch (`git push origin my-new-feature`)
89
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'WEBSocket/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "WEBSocket"
8
+ gem.version = WEBSocket::VERSION
9
+ gem.date = WEBSocket::DATE
10
+ gem.authors = ["Matthieu \"Ezveus\" Ciappara"]
11
+ gem.email = ["ciappam@gmail.com"]
12
+ gem.description = <<-EOS
13
+ Establish a websocket communication using Ruby standard sockets or Celluloid::IO sockets if required.
14
+ EOS
15
+ gem.summary = %q{Establish a websocket communication}
16
+ gem.homepage = "https://github.com/Ezveus/ruby-websocket"
17
+
18
+ gem.files = `git ls-files`.split($/)
19
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
21
+ gem.require_paths = ["lib"]
22
+ gem.add_runtime_dependency 'websocket', '~> 1.0.6', '>= 1.0.6'
23
+ end
@@ -0,0 +1,6 @@
1
+ require "websocket"
2
+ require "uri"
3
+
4
+ require "WEBSocket/version"
5
+ require "WEBSocket/socket"
6
+ require "WEBSocket/server"
@@ -0,0 +1,116 @@
1
+ module WEBSocket
2
+ class Server
3
+ extend Forwardable
4
+ def_delegators :@server, :listen, :sysaccept, :close, :closed?, :addr
5
+
6
+ class AcceptedSocket
7
+ extend Forwardable
8
+ attr_reader :status
9
+
10
+ def_delegators :@socket, :close, :closed?
11
+ def_delegators :@socket, :addr, :peeraddr, :setsockopt
12
+
13
+ def acquire_ownership type
14
+ @socket.acquire_ownership type
15
+ end
16
+
17
+ def connect
18
+ @handshake = WebSocket::Handshake::Server.new
19
+ msg = @socket.readpartial 4096
20
+ @handshake << msg
21
+ until @handshake.finished?
22
+ msg = @socket.readpartial 4096
23
+ @handshake << msg
24
+ end
25
+ if @handshake.valid?
26
+ @socket.write @handshake.to_s
27
+ @status = :connected
28
+ end
29
+ self
30
+ end
31
+
32
+ def evented?
33
+ @socket.evented?
34
+ end
35
+
36
+ def initialize socket
37
+ @socket = socket
38
+ @status = :disconnected
39
+ end
40
+
41
+ def read length = nil, buffer = nil
42
+ s = @socket.read length, buffer
43
+ frame = WebSocket::Frame::Incoming::Server.new :version => @handshake.version
44
+ frame << s
45
+ frame.next.to_s
46
+ end
47
+
48
+ def read_nonblock length, buffer = nil
49
+ buffer ||= ''
50
+
51
+ s = @socket.read length, buffer
52
+ frame = WebSocket::Frame::Incoming::Server.new :version => @handshake.version
53
+ frame << s
54
+ frame.next.to_s
55
+ end
56
+
57
+ def readpartial length, buffer = nil
58
+ s = @socket.readpartial length, buffer
59
+ frame = WebSocket::Frame::Incoming::Server.new :version => @handshake.version
60
+ frame << s
61
+ frame.next.to_s
62
+ end
63
+
64
+ def release_ownership type
65
+ @socket.release_ownership type
66
+ end
67
+
68
+ def to_io
69
+ @socket
70
+ end
71
+
72
+ def wait_readable
73
+ @socket.wait_readable
74
+ end
75
+
76
+ def wait_writable
77
+ @socket.wait_writable
78
+ end
79
+
80
+ def write s
81
+ frame = WebSocket::Frame::Outgoing::Server.new :version => @handshake.version, :data => s, :type => :text
82
+ @socket.write frame.to_s
83
+ end
84
+
85
+ def write_nonblock s
86
+ frame = WebSocket::Frame::Outgoing::Server.new :version => @handshake.version, :data => s, :type => :text
87
+ @socket.write_nonblock frame.to_s
88
+ end
89
+
90
+ def << s
91
+ frame = WebSocket::Frame::Outgoing::Server.new :version => @handshake.version, :data => s, :type => :text
92
+ @socket << frame.to_s
93
+ end
94
+ end
95
+
96
+ def initialize hostname, port
97
+ @server = Celluloid::IO::TCPServer.new hostname, port
98
+ end
99
+
100
+ def accept
101
+ AcceptedSocket.new(@server.accept).connect
102
+ end
103
+
104
+ def accept_nonblock
105
+ AcceptedSocket.new(@server.accept_nonblock).connect
106
+ end
107
+
108
+ def to_io
109
+ @server
110
+ end
111
+
112
+ def evented?
113
+ @server.evented?
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,85 @@
1
+ module WEBSocket
2
+ class Socket
3
+ extend Forwardable
4
+ attr_reader :status
5
+
6
+ def_delegators :@socket, :close, :closed?
7
+ def_delegators :@socket, :addr, :peeraddr, :setsockopt
8
+
9
+ def acquire_ownership type
10
+ @socket.acquire_ownership type
11
+ end
12
+
13
+ def connect host, port
14
+ @handshake = WebSocket::Handshake::Client.new :url => "ws://#{host}:#{port}"
15
+ @socket.write @handshake.to_s
16
+ msg = @socket.readpartial 4096
17
+ @handshake << msg
18
+ @status = :connected
19
+ end
20
+
21
+ def evented?
22
+ @socket.evented?
23
+ end
24
+
25
+ def initialize rhost, rport, lhost = nil, lport = nil
26
+ @status = :disconnected
27
+ @socket = Celluloid::IO::TCPSocket.new rhost, rport, lhost, lport
28
+ connect rhost, rport
29
+ end
30
+
31
+ def read length = nil, buffer = nil
32
+ s = @socket.read length, buffer
33
+ frame = WebSocket::Frame::Incoming::Client.new :version => @handshake.version
34
+ frame << s
35
+ frame.to_s
36
+ end
37
+
38
+ def read_nonblock length, buffer = nil
39
+ buffer ||= ''
40
+
41
+ @socket.read_nonblock length, buffer
42
+ frame = WebSocket::Frame::Incoming::Client.new :version => @handshake.version
43
+ frame << buffer
44
+ frame.to_s
45
+ end
46
+
47
+ def readpartial length, buffer = nil
48
+ s = @socket.readpartial length, buffer
49
+ frame = WebSocket::Frame::Incoming::Client.new :version => @handshake.version
50
+ frame << s
51
+ frame.to_s
52
+ end
53
+
54
+ def release_ownership type
55
+ @socket.release_ownership type
56
+ end
57
+
58
+ def to_io
59
+ @socket
60
+ end
61
+
62
+ def wait_readable
63
+ @socket.wait_readable
64
+ end
65
+
66
+ def wait_writable
67
+ @socket.wait_writable
68
+ end
69
+
70
+ def write s
71
+ frame = WebSocket::Frame::Outgoing::Client.new :version => @handshake.version, :data => s, :type => :text
72
+ @socket.write frame.to_s
73
+ end
74
+
75
+ def write_nonblock s
76
+ frame = WebSocket::Frame::Outgoing::Client.new :version => @handshake.version, :data => s, :type => :text
77
+ @socket.write_nonblock frame.to_s
78
+ end
79
+
80
+ def << s
81
+ frame = WebSocket::Frame::Outgoing::Client.new :version => @handshake.version, :data => s, :type => :text
82
+ @socket << frame.to_s
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,32 @@
1
+ module WEBSocket
2
+ class Server
3
+
4
+ if defined? Celluloid::IO
5
+ UnderlyingServer = Celluloid::IO::TCPServer
6
+ else
7
+ UnderlyingServer = TCPSocket
8
+ end
9
+
10
+ def initialize hostname, port
11
+ @server = UnderlyingServer.new hostname, port
12
+ end
13
+
14
+ def accept
15
+ WEBSocket::Socket.from_underlying_socket @server.accept
16
+ end
17
+
18
+ def accept_nonblock
19
+ Celluloid::IO::TCPSocket.from_ruby_socket @server.accept_nonblock
20
+ end
21
+
22
+ def to_io
23
+ @server
24
+ end
25
+
26
+ # Are we inside a Celluloid ::IO actor?
27
+ def evented?
28
+ actor = Thread.current[:actor]
29
+ actor && actor.mailbox.is_a?(Celluloid::IO::Mailbox)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,74 @@
1
+ module WEBSocket
2
+ class Socket
3
+ attr_reader :status
4
+
5
+ def self.from_underlying_socket socket
6
+ end
7
+
8
+ def acquire_ownership type
9
+ @socket.acquire_ownership type
10
+ end
11
+
12
+ def close
13
+ @socket.close
14
+ end
15
+
16
+ def connect host, port
17
+ @handshake = WebSocket::Handshake::Client.new :url => "ws://#{host}:#{port}"
18
+ @socket.write @handshake.to_s
19
+ msg = @socket.readpartial 4096
20
+ @handshake << msg
21
+ @status = :connected
22
+ end
23
+
24
+ def evented?
25
+ @socket.evented?
26
+ end
27
+
28
+ def initialize rhost, rport, lhost = nil, lport = nil
29
+ @status = :disconnected
30
+ @socket = TCPSocket.new rhost, rport, lhost, lport
31
+ connect rhost, rport
32
+ end
33
+
34
+ def read length = nil, buffer = nil
35
+ s = @socket.read length, buffer
36
+ frame = WebSocket::Frame::Incoming::Client.new :version => @handshake.version
37
+ frame << s
38
+ frame.to_s
39
+ end
40
+
41
+ def readpartial length, buffer = nil
42
+ s = @socket.readpartial length, buffer
43
+ frame = WebSocket::Frame::Incoming::Client.new :version => @handshake.version
44
+ frame << s
45
+ frame.to_s
46
+ end
47
+
48
+ def release_ownership type
49
+ @socket.release_ownership type
50
+ end
51
+
52
+ def to_io
53
+ @socket
54
+ end
55
+
56
+ def wait_readable
57
+ @socket.wait_readable
58
+ end
59
+
60
+ def wait_writable
61
+ @socket.wait_writable
62
+ end
63
+
64
+ def write s
65
+ frame = WebSocket::Frame::Outgoing::Client.new :version => @handshake.version, :data => s, :type => :text
66
+ @socket.write frame.to_s
67
+ end
68
+
69
+ def << s
70
+ frame = WebSocket::Frame::Outgoing::Client.new :version => @handshake.version, :data => s, :type => :text
71
+ @socket << frame.to_s
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,6 @@
1
+ if defined? Celluloid::IO
2
+ require 'WEBSocket/Celluloid/server'
3
+ else
4
+ require 'socket'
5
+ require 'WEBSocket/Standard/server'
6
+ end
@@ -0,0 +1,6 @@
1
+ if defined? Celluloid::IO
2
+ require 'WEBSocket/Celluloid/socket'
3
+ else
4
+ require 'socket'
5
+ require 'WEBSocket/Standard/socket'
6
+ end
@@ -0,0 +1,4 @@
1
+ module WEBSocket
2
+ VERSION = "0.0.1"
3
+ DATE = Time.now.to_s.split[0]
4
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: WEBSocket
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matthieu "Ezveus" Ciappara
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: websocket
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.6
22
+ - - ! '>='
23
+ - !ruby/object:Gem::Version
24
+ version: 1.0.6
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.6
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: 1.0.6
36
+ description: ! 'Establish a websocket communication using Ruby standard sockets or
37
+ Celluloid::IO sockets if required.
38
+
39
+ '
40
+ email:
41
+ - ciappam@gmail.com
42
+ executables: []
43
+ extensions: []
44
+ extra_rdoc_files: []
45
+ files:
46
+ - .gitignore
47
+ - Gemfile
48
+ - LICENSE.txt
49
+ - README.md
50
+ - Rakefile
51
+ - WEBSocket.gemspec
52
+ - lib/WEBSocket.rb
53
+ - lib/WEBSocket/Celluloid/server.rb
54
+ - lib/WEBSocket/Celluloid/socket.rb
55
+ - lib/WEBSocket/Standard/server.rb
56
+ - lib/WEBSocket/Standard/socket.rb
57
+ - lib/WEBSocket/server.rb
58
+ - lib/WEBSocket/socket.rb
59
+ - lib/WEBSocket/version.rb
60
+ homepage: https://github.com/Ezveus/ruby-websocket
61
+ licenses: []
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements: []
79
+ rubyforge_project:
80
+ rubygems_version: 1.8.24
81
+ signing_key:
82
+ specification_version: 3
83
+ summary: Establish a websocket communication
84
+ test_files: []
85
+ has_rdoc: