weblink 1.1.2 → 1.2.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.
- 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
|