weblink 1.1.2 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +5 -0
- data/VERSION +1 -1
- data/lib/weblink.rb +14 -7
- data/public/index.html +26 -12
- data/public/index.js +22 -0
- metadata +10 -34
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4a93ba7190197aa4341d503368788b21e1830a74e6742b7a11bcd9d9c476081
|
4
|
+
data.tar.gz: e391b3eb02aca0480107e6b5dee359ada21cdf90d03ea9764d68c7714cb07b7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 854a0d477c54eddc352f22cf02c8c6a428c1378b07fdf788d988aa03effdb9b7aed989ce9a3c48e655e72b0c8be137b051f9693ea9fd19b335a6ccc453aaebb2
|
7
|
+
data.tar.gz: 73b5b1d25d472437858b3a09cb4e9071a6731f1ef507c66bf9098b4629a658809ac286606bd91e3e3ae7e5ccec6f2f6268fa5301d407b25983f5244939cf8e69
|
data/CHANGELOG
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/lib/weblink.rb
CHANGED
@@ -19,12 +19,14 @@ class Weblink
|
|
19
19
|
ip = Socket.getifaddrs.find { |ifa| ifa.addr&.ipv4_private? }
|
20
20
|
if ip
|
21
21
|
public = File.expand_path('../public', __dir__)
|
22
|
+
# TODO: check if the process failed
|
23
|
+
# TODO: don't suppress errors
|
22
24
|
spawn('ruby', '-run', '-ehttpd', '--', public, err: IO::NULL)
|
23
25
|
puts "Open http://#{ip.addr.ip_address}:8080/ on your other device."
|
24
26
|
else
|
25
27
|
abort(
|
26
28
|
"Could not find an interface to listen on. " \
|
27
|
-
"Make sure that you are connected to your device."
|
29
|
+
"Make sure that you are connected to your other device."
|
28
30
|
)
|
29
31
|
end
|
30
32
|
end
|
@@ -59,11 +61,11 @@ class Weblink
|
|
59
61
|
private
|
60
62
|
|
61
63
|
def start_client(control_ws, min_ws_num: 3)
|
62
|
-
host, port = @opts.values_at(:proxy_host, :proxy_port)
|
63
|
-
sig = EventMachine.start_server(host, port, Relay, 'client') do |
|
64
|
+
type, host, port = @opts.values_at(:proxy_type, :proxy_host, :proxy_port)
|
65
|
+
sig = EventMachine.start_server(host, port, Relay, 'client') do |relay|
|
64
66
|
# Dogpile effect
|
65
|
-
control_ws.send_text(
|
66
|
-
@websockets.pop { |ws|
|
67
|
+
control_ws.send_text(type) if @websockets.size < min_ws_num
|
68
|
+
@websockets.pop { |ws| relay.start(ws) }
|
67
69
|
end
|
68
70
|
control_ws.onclose { EventMachine.stop_server(sig) }
|
69
71
|
end
|
@@ -75,8 +77,13 @@ class Weblink
|
|
75
77
|
end
|
76
78
|
xff = handshake.headers_downcased['x-forwarded-for']
|
77
79
|
with_retry(timeout: 3) do
|
78
|
-
EventMachine.connect(socket, Relay, 'server', xff) do |
|
79
|
-
|
80
|
+
EventMachine.connect(socket, Relay, 'server', xff) do |relay|
|
81
|
+
relay.start(ws)
|
82
|
+
# TODO: Instead of creating a timer per websocket, it might be more
|
83
|
+
# efficient to create a single timer and iterate over all open
|
84
|
+
# websockets.
|
85
|
+
timer = EventMachine.add_periodic_timer(45) { ws.ping }
|
86
|
+
ws.onclose { timer.cancel }
|
80
87
|
end
|
81
88
|
end
|
82
89
|
end
|
data/public/index.html
CHANGED
@@ -2,35 +2,43 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<meta charset="utf-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
5
6
|
<title>weblink</title>
|
6
7
|
<link rel="manifest" href="/weblink.webmanifest">
|
7
8
|
<style>
|
8
9
|
html, body {
|
9
10
|
height: 100%;
|
11
|
+
background-color: #3f9cff;
|
12
|
+
font-family: sans-serif;
|
10
13
|
}
|
11
14
|
body {
|
12
15
|
align-items: center;
|
13
|
-
background-color: #3f9cff;
|
14
16
|
color: white;
|
15
17
|
display: flex;
|
16
18
|
justify-content: center;
|
19
|
+
flex-direction: column;
|
17
20
|
}
|
18
21
|
h1 {
|
19
|
-
font-
|
20
|
-
font-size: 8em;
|
22
|
+
font-size: 3rem;
|
21
23
|
}
|
22
24
|
</style>
|
23
25
|
</head>
|
24
26
|
<body>
|
25
27
|
<h1>weblink</h1>
|
28
|
+
<div class="settings">
|
29
|
+
<input type="checkbox" id="nosleep" />
|
30
|
+
<label for="nosleep">Prevent screen from sleeping</label>
|
31
|
+
</div>
|
32
|
+
|
26
33
|
<script>
|
27
|
-
function connect(
|
28
|
-
var client
|
34
|
+
function connect(clientAddr, serverAddr, proxy) {
|
35
|
+
var client;
|
36
|
+
var server = new WebSocket(serverAddr + "/proxy/" + proxy);
|
29
37
|
|
30
38
|
server.onerror = function(event) { console.error("server/error"); };
|
31
39
|
|
32
40
|
server.onopen = function() {
|
33
|
-
client = new WebSocket(
|
41
|
+
client = new WebSocket(clientAddr + "/client");
|
34
42
|
|
35
43
|
client.onerror = function(event) { console.error("client/error"); };
|
36
44
|
|
@@ -56,18 +64,24 @@
|
|
56
64
|
params[key] = decodeURIComponent(value);
|
57
65
|
});
|
58
66
|
|
59
|
-
var
|
60
|
-
var
|
61
|
-
var
|
62
|
-
var control = new WebSocket(
|
67
|
+
var clientAddr = "ws://" + location.hostname + ":8000";
|
68
|
+
var serverAddr = params.server || "wss://weblinkapp.herokuapp.com";
|
69
|
+
var batchSize = Number(params.batch) || 4;
|
70
|
+
var control = new WebSocket(clientAddr + "/control");
|
63
71
|
|
64
72
|
control.onerror = function(event) { console.error("control/error"); };
|
65
73
|
control.onclose = function(event) { console.log("control/close"); };
|
66
74
|
control.onmessage = function(msg) {
|
67
|
-
for (var i = 0; i <
|
68
|
-
connect(
|
75
|
+
for (var i = 0; i < batchSize; i++) {
|
76
|
+
connect(clientAddr, serverAddr, msg.data);
|
69
77
|
}
|
70
78
|
};
|
71
79
|
</script>
|
72
80
|
</body>
|
81
|
+
<script
|
82
|
+
src="https://cdnjs.cloudflare.com/ajax/libs/nosleep/0.12.0/NoSleep.min.js"
|
83
|
+
type="text/javascript"
|
84
|
+
crossorigin="anonymous"
|
85
|
+
></script>
|
86
|
+
<script src="index.js" type="text/javascript"></script>
|
73
87
|
</html>
|
data/public/index.js
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
var noSleep = new NoSleep();
|
2
|
+
var noSleepCheckbox = document.getElementById("nosleep");
|
3
|
+
|
4
|
+
document.addEventListener("visibilitychange", function resetNoSleep(event) {
|
5
|
+
if (document.visibilityState === "visible") {
|
6
|
+
noSleep.disable();
|
7
|
+
noSleep = new NoSleep();
|
8
|
+
noSleepCheckbox.checked = false;
|
9
|
+
}
|
10
|
+
});
|
11
|
+
|
12
|
+
noSleepCheckbox.addEventListener("click", function toggleNoSleep(event) {
|
13
|
+
if (noSleep.isEnabled) {
|
14
|
+
noSleep.disable();
|
15
|
+
} else {
|
16
|
+
try {
|
17
|
+
noSleep.enable();
|
18
|
+
} catch (error) {
|
19
|
+
event.preventDefault();
|
20
|
+
}
|
21
|
+
}
|
22
|
+
});
|
metadata
CHANGED
@@ -1,39 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weblink
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- soylent
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
-
|
12
|
-
-----BEGIN CERTIFICATE-----
|
13
|
-
MIIEDjCCAvagAwIBAgIBATANBgkqhkiG9w0BAQsFADB3MRgwFgYDVQQDDA8xNTkz
|
14
|
-
ODYwX3NveWxlbnQxFTATBgoJkiaJk/IsZAEZFgV1c2VyczEXMBUGCgmSJomT8ixk
|
15
|
-
ARkWB25vcmVwbHkxFjAUBgoJkiaJk/IsZAEZFgZnaXRodWIxEzARBgoJkiaJk/Is
|
16
|
-
ZAEZFgNjb20wHhcNMjIwMTI3MDIzMTQwWhcNMjMwMTI3MDIzMTQwWjB3MRgwFgYD
|
17
|
-
VQQDDA8xNTkzODYwX3NveWxlbnQxFTATBgoJkiaJk/IsZAEZFgV1c2VyczEXMBUG
|
18
|
-
CgmSJomT8ixkARkWB25vcmVwbHkxFjAUBgoJkiaJk/IsZAEZFgZnaXRodWIxEzAR
|
19
|
-
BgoJkiaJk/IsZAEZFgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
20
|
-
AQC2DMbzgA39U+3VTMjXn+0jnOQyLdmXQ5EXgSLKCgBLIcFTc9J47Th07Yb/f4Rz
|
21
|
-
Wh49/EkDBiDtLqFeKBYsj3q0e8tRCAs32NtVyl/4FDyJvWsK3R2tcXOVqxs48J3C
|
22
|
-
gG+rFLOcMC9YF4FPTkz4p3EYGFVjZTbiqyVVuIZzWtrwdZesBVgpBRyN8sEyNoi8
|
23
|
-
vcDiOmEwf9/TVMTDf/wu6a+i3LNVGYWlvgMJRssaAnj/IbFFtPTz30HxeTUdfJu8
|
24
|
-
YbwRspfFzcJGLf32E7vXfmHHqNzqjh4zD9sVpvTHbqLLsgVa+nYHPHAedzSZ5gZj
|
25
|
-
G1oZ7hZDCJoEPj0oCHT0qkuXAgMBAAGjgaQwgaEwCQYDVR0TBAIwADALBgNVHQ8E
|
26
|
-
BAMCBLAwHQYDVR0OBBYEFKy+nUcB8D5BOM6D96HKG/tp2nQWMDMGA1UdEQQsMCqB
|
27
|
-
KDE1OTM4NjArc295bGVudEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20wMwYDVR0S
|
28
|
-
BCwwKoEoMTU5Mzg2MCtzb3lsZW50QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbTAN
|
29
|
-
BgkqhkiG9w0BAQsFAAOCAQEAsfJgulszbe+BgUP9xNYixuvm/R8Um5T8OAANmc+s
|
30
|
-
CvV3lD5XtFuw838TbWrqgN+7dVkzQYERTz8DjPtx+zlgzNS3GyMWNUZdOPLo/YkR
|
31
|
-
S7KfmAZlZhy1rcrARYsAouvP+1QttbiJ32L+z1JzAz2s1+4ySgl1OaQfosS04QGT
|
32
|
-
CnJ982/OGeG5xm7KFOqSzG4KnyEy4VH47aE4IQk+yP6R96neHdfOd/C7BcA6gbgH
|
33
|
-
lyshHS0Bgr1OKk3Vx8GtaIa7L9Z4RN0EWBL3QGlhiu55PrpPuAFDDuORJfpIqrph
|
34
|
-
XjC/3xZEDxBLYSjeFIgUMN6+/XGduQANkZ6167QsVu/yPg==
|
35
|
-
-----END CERTIFICATE-----
|
36
|
-
date: 2022-03-05 00:00:00.000000000 Z
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-06-10 00:00:00.000000000 Z
|
37
12
|
dependencies:
|
38
13
|
- !ruby/object:Gem::Dependency
|
39
14
|
name: em-websocket
|
@@ -63,8 +38,8 @@ dependencies:
|
|
63
38
|
- - "~>"
|
64
39
|
- !ruby/object:Gem::Version
|
65
40
|
version: '1.7'
|
66
|
-
description:
|
67
|
-
email:
|
41
|
+
description:
|
42
|
+
email:
|
68
43
|
executables:
|
69
44
|
- weblink
|
70
45
|
extensions: []
|
@@ -82,12 +57,13 @@ files:
|
|
82
57
|
- public/favicon-32x32.png
|
83
58
|
- public/favicon.ico
|
84
59
|
- public/index.html
|
60
|
+
- public/index.js
|
85
61
|
- public/weblink.js
|
86
62
|
- public/weblink.webmanifest
|
87
63
|
homepage: https://github.com/soylent/weblink
|
88
64
|
licenses: []
|
89
65
|
metadata: {}
|
90
|
-
post_install_message:
|
66
|
+
post_install_message:
|
91
67
|
rdoc_options: []
|
92
68
|
require_paths:
|
93
69
|
- lib
|
@@ -102,8 +78,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
78
|
- !ruby/object:Gem::Version
|
103
79
|
version: '0'
|
104
80
|
requirements: []
|
105
|
-
rubygems_version: 3.3.
|
106
|
-
signing_key:
|
81
|
+
rubygems_version: 3.0.3.1
|
82
|
+
signing_key:
|
107
83
|
specification_version: 4
|
108
84
|
summary: Web browser gateway
|
109
85
|
test_files: []
|
checksums.yaml.gz.sig
DELETED
Binary file
|
data.tar.gz.sig
DELETED
metadata.gz.sig
DELETED
Binary file
|