ws-io 1.0.1 → 1.1.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.
- data/VERSION +1 -1
- data/bin/ws-irb +8 -0
- data/examples/sh.rb +4 -10
- data/{examples/index.html → lib/index.html.erb} +1 -1
- data/lib/ws-io.rb +69 -35
- metadata +6 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
data/bin/ws-irb
ADDED
data/examples/sh.rb
CHANGED
@@ -1,14 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
$:.unshift File.dirname(__FILE__) + "/../lib"
|
3
|
+
|
3
4
|
require "ws-io"
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
system '/bin/sh'
|
9
|
-
end
|
10
|
-
end
|
11
|
-
threads << Thread.start do
|
12
|
-
system 'open', File.expand_path('../index.html', __FILE__)
|
13
|
-
end
|
14
|
-
threads.each { |thread| thread.join }
|
6
|
+
WsIo.start {
|
7
|
+
system '/bin/sh'
|
8
|
+
}.open.join
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js?v=1"></script>
|
5
5
|
<script type="text/javascript" charset="utf-8">
|
6
6
|
$(function() {
|
7
|
-
var ws = new WebSocket("ws://127.0.0.1
|
7
|
+
var ws = new WebSocket("ws://127.0.0.1:<%= port %>");
|
8
8
|
ws.onmessage = function(e) {
|
9
9
|
$("#result").append($("<div>").html(e.data));
|
10
10
|
$("body").scrollTop(document.height);
|
data/lib/ws-io.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
-
require 'web_socket'
|
2
1
|
require 'erb'
|
2
|
+
require 'thread'
|
3
|
+
require 'tempfile'
|
4
|
+
require 'web_socket'
|
5
|
+
require "launchy"
|
3
6
|
|
4
7
|
class WsIo
|
5
8
|
class << self
|
6
|
-
attr_accessor :ws
|
9
|
+
attr_accessor :ws, :domains, :port
|
7
10
|
|
8
11
|
if ENV['WSIO_DEBUG']
|
9
12
|
require 'g'
|
@@ -11,39 +14,40 @@ class WsIo
|
|
11
14
|
def g(*args);end
|
12
15
|
end
|
13
16
|
|
14
|
-
def start(domains = ["*"]
|
17
|
+
def start(port = 8080, domains = ["*"])
|
18
|
+
@port = port
|
19
|
+
@domains = domains
|
20
|
+
|
15
21
|
fake_io
|
16
22
|
|
17
|
-
|
23
|
+
m = Mutex.new
|
24
|
+
c = ConditionVariable.new
|
18
25
|
|
19
|
-
|
26
|
+
@server_thread = Thread.start do
|
20
27
|
@server = WebSocketServer.new(:accepted_domains => domains, :port => port)
|
21
|
-
@server.run() do |ws|
|
22
|
-
if ws.path == "/"
|
23
|
-
ws.handshake()
|
24
|
-
WsIo.ws = ws
|
25
|
-
while data = ws.receive()
|
26
|
-
WsIo.input(data)
|
27
|
-
end
|
28
|
-
else
|
29
|
-
ws.handshake("404 Not Found")
|
30
|
-
end
|
31
|
-
stop_server
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
threads << Thread.start do
|
36
28
|
begin
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
29
|
+
@server.run() do |ws|
|
30
|
+
if ws.path == "/"
|
31
|
+
ws.handshake()
|
32
|
+
WsIo.ws = ws
|
33
|
+
ws.send("connected")
|
34
|
+
c.signal # ####
|
35
|
+
while data = ws.receive() #
|
36
|
+
WsIo.input(data) #
|
37
|
+
end #
|
38
|
+
else # ## ## ## ## ######## ######## ## ## ####
|
39
|
+
ws.handshake("404 Not Found") # ### ### ## ## ## ## ## ## ####
|
40
|
+
end # #### #### ## ## ## ## ## ## ####
|
41
|
+
stop_server # ## ### ## ## ## ## ###### ### ##
|
42
|
+
end # ## ## ## ## ## ## ## ##
|
43
|
+
rescue => e # ## ## ## ## ## ## ## ## ####
|
44
|
+
g e # ## ## ####### ## ######## ## ## ####
|
45
|
+
end #
|
46
|
+
end #
|
47
|
+
#
|
48
|
+
Thread.start do #
|
49
|
+
m.synchronize { c.wait(m) } # <###
|
45
50
|
loop do
|
46
|
-
break if @ws && @ws.instance_variable_get(:@socket).closed?
|
47
51
|
if @ws
|
48
52
|
begin
|
49
53
|
@ws.send(escape(output))
|
@@ -54,13 +58,23 @@ class WsIo
|
|
54
58
|
end
|
55
59
|
end
|
56
60
|
|
57
|
-
|
58
|
-
|
61
|
+
Thread.start do
|
62
|
+
begin
|
63
|
+
yield
|
64
|
+
rescue => e
|
65
|
+
g e
|
66
|
+
ensure
|
67
|
+
unfake_io
|
68
|
+
stop_server
|
69
|
+
end
|
59
70
|
end
|
71
|
+
|
72
|
+
self
|
60
73
|
rescue SignalException, StandardError => e
|
61
74
|
g e
|
62
75
|
unfake_io
|
63
76
|
stop_server
|
77
|
+
raise
|
64
78
|
rescue Exception => e
|
65
79
|
g e
|
66
80
|
unfake_io
|
@@ -68,6 +82,23 @@ class WsIo
|
|
68
82
|
raise
|
69
83
|
end
|
70
84
|
|
85
|
+
def after
|
86
|
+
yield
|
87
|
+
self
|
88
|
+
end
|
89
|
+
|
90
|
+
def join
|
91
|
+
@server_thread.join if @server_thread
|
92
|
+
end
|
93
|
+
|
94
|
+
def open
|
95
|
+
tempfile = Tempfile.open('ws-io')
|
96
|
+
tempfile << ERB.new(File.read(File.expand_path('../index.html.erb', __FILE__))).result(binding)
|
97
|
+
tempfile.flush
|
98
|
+
Launchy::Browser.run(tempfile.path)
|
99
|
+
self
|
100
|
+
end
|
101
|
+
|
71
102
|
def fake_io
|
72
103
|
@in_read, @in_write = IO.pipe
|
73
104
|
@stdin = STDIN.clone
|
@@ -84,17 +115,20 @@ class WsIo
|
|
84
115
|
STDIN.reopen(@stdin)
|
85
116
|
STDOUT.reopen(@stdout)
|
86
117
|
STDERR.reopen(@stderr)
|
87
|
-
@in_read.
|
88
|
-
|
89
|
-
|
90
|
-
@out_read.close
|
118
|
+
[@in_read, @in_write, @out_read, @out_write].each do |io|
|
119
|
+
io.close unless io.closed?
|
120
|
+
end
|
91
121
|
g 'unfake_io'
|
122
|
+
rescue => e
|
123
|
+
g e
|
92
124
|
end
|
93
125
|
|
94
126
|
def stop_server
|
95
127
|
ws.close
|
96
128
|
@server.tcp_server.close
|
97
129
|
g 'stop_server'
|
130
|
+
rescue => e
|
131
|
+
g e
|
98
132
|
end
|
99
133
|
|
100
134
|
def stop
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: ws-io
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.0
|
5
|
+
version: 1.1.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- jugyo
|
@@ -11,7 +11,7 @@ bindir: bin
|
|
11
11
|
cert_chain: []
|
12
12
|
|
13
13
|
date: 2011-02-10 00:00:00 +09:00
|
14
|
-
default_executable:
|
14
|
+
default_executable: ws-irb
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: web-socket-ruby
|
@@ -70,8 +70,8 @@ dependencies:
|
|
70
70
|
version_requirements: *id005
|
71
71
|
description: It provides a bridge between WebSocket and IO
|
72
72
|
email: jugyo.org@gmail.com
|
73
|
-
executables:
|
74
|
-
|
73
|
+
executables:
|
74
|
+
- ws-irb
|
75
75
|
extensions: []
|
76
76
|
|
77
77
|
extra_rdoc_files:
|
@@ -86,8 +86,9 @@ files:
|
|
86
86
|
- README.rdoc
|
87
87
|
- Rakefile
|
88
88
|
- VERSION
|
89
|
-
-
|
89
|
+
- bin/ws-irb
|
90
90
|
- examples/sh.rb
|
91
|
+
- lib/index.html.erb
|
91
92
|
- lib/ws-io.rb
|
92
93
|
- spec/spec_helper.rb
|
93
94
|
- spec/ws-io_spec.rb
|