OverviewFilesCommitsIssuesDocsReleasesPeers

hypergodot commits / cd87f39

Auto-download gateway binary from GitHub releases
cd87f39a74b6ff3966c9d9ed94dac347e416ddc7
by mauve <ranger@mauve.moe> · 2021-09-21T20:24:16.000Z

Changed files (15) +171 -55

hyper-gateway/hyper-gateway-linux +0 -0
(no content changes — binary or rename)
hyper-gateway/hyper-gateway-macos +0 -0
(no content changes — binary or rename)
hyper-gateway/hyper-gateway-windows.exe +0 -0
(no content changes — binary or rename)
src/HTTPEventSource.gd +1 -4
……@@ -5,8 +5,6 @@ class_name HTTPEventSource
55const URLParser = preload('./utils/URLParser.gd')
66
77signal event(data, event, id)
8signal response_started(status, headers)
9signal response_finished()
108
119var http = HTTPClient.new()
1210var urlParser = URLParser.new()
……@@ -47,8 +45,7 @@ func request(
4745 pass
4846
4947func _runRequest(params):
50 var err = 0
51 http.connect_to_host(params.host, params.port, params.use_ssl, params.verify_host)
48 var err = http.connect_to_host(params.host, params.port, params.use_ssl, params.verify_host)
5249
5350 print('Connected to host')
5451
src/HyperChat/HyperChat.gd +6 -6
……@@ -35,7 +35,7 @@ onready var listPeersRequest = $HyperGateway/ListPeersRequest
3535func _ready():
3636 # Initialize random number generator
3737 randomize()
38 gateway.ensureSetup()
38 gateway.start()
3939
4040func display_item(from, content):
4141 # Add to item list
……@@ -47,7 +47,7 @@ func send_current():
4747 display_item(get_username(), text)
4848 broadcast_text(text)
4949
50func update_identity(from, username):
50func update_identity(_from, username):
5151 # Have some sort of sidebar to display known users?
5252 display_item('System', 'Seen user ' + username)
5353 pass
……@@ -55,11 +55,11 @@ func update_identity(from, username):
5555func list_peers():
5656 listPeersRequest.request(extensionPath)
5757
58func _on_text_message(data, from):
58func _on_text_message(data, _from):
5959 # TODO: Something fancy with the `from` attribute?
6060 display_item(data.username, data.content)
6161
62func _on_identity_message(data, from):
62func _on_identity_message(_data, from):
6363 var isNew = !has_seen_identity(from)
6464
6565 # Track identity
……@@ -127,7 +127,7 @@ func handle_message(message, from):
127127 _:
128128 _on_unknown_message(message, finalFrom)
129129
130func _on_event(data, event, id):
130func _on_event(data, _event, id):
131131 var parsed = JSON.parse(data)
132132
133133 if parsed.error != OK:
……@@ -145,7 +145,7 @@ func start_listening():
145145func _on_HyperEventSource_event(data, event, id):
146146 _on_event(data, event, id)
147147
148func _on_HyperGateway_started_gateway(pid):
148func _on_HyperGateway_started_gateway(_pid):
149149 start_listening()
150150 list_peers()
151151 broadcast_identity()
src/HyperChat/HyperChat.tscn +1 -0
……@@ -51,6 +51,7 @@ text = "System: Enter some text and hit `send` to broadcast it to peers.
5151"
5252
5353[node name="HyperGateway" parent="." instance=ExtResource( 2 )]
54autoStart = false
5455
5556[node name="HyperEventSource" type="Node" parent="HyperGateway"]
5657script = ExtResource( 3 )
src/HyperGateway/HyperGateway.gd +148 -32
……@@ -1,17 +1,35 @@
11extends Node
22
3const URLParser = preload('../utils/URLParser.gd')
4
35class_name HyperGateway
46
57signal starting_gateway()
68signal started_gateway(pid)
79
8export var processPID = 0
9export var serverPrefix = "http://127.0.0.1:4973/hyper/"
10export var storageDirectory = 'user://gateway-data/'
11export var autoStart = false
10signal started_download(version)
11signal finished_download(version)
12
1213export var writable = true
1314export var persist = true
1415
16export var autoStart = true
17export var autoDownload = true
18export var autoUpdate = false
19
20export var storageDirectory = "user://gateway-data/"
21export var repositoryName = "rangermauve/hyper-gateway"
22export var tagStart = "v2"
23
24## TODO: Use this tag if the `latest` release doesn't match the tag?
25# export var defaultTag = "v2.1.3"
26
27var processPID = 0
28var latestInfoRequest = HTTPRequest.new()
29var downloadFileRequest = HTTPRequest.new()
30var downloadingVersion = null
31var downloadThread = null
32
1533func _notification(what):
1634 if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST:
1735 cleanupGateway()
……@@ -19,8 +37,21 @@ func _notification(what):
1937
2038# Called when the node enters the scene tree for the first time.
2139func _ready():
22 if autoStart: ensureSetup()
23 pass # Replace with function body.
40 ensureStorageLocation()
41 add_child(latestInfoRequest)
42 latestInfoRequest.connect("request_completed", self, "_on_got_latest")
43
44 add_child(downloadFileRequest)
45 downloadFileRequest.connect("request_completed", self, "_on_finished_download")
46
47 if autoStart:
48 start()
49
50func start():
51 autoStart = true
52 if autoDownload:
53 ensureDownloaded()
54 else: ensureSetup()
2455
2556func cleanupGateway():
2657 if processPID == 0:
……@@ -28,30 +59,22 @@ func cleanupGateway():
2859 return
2960 print('Cleaning up gateway ' + str(processPID))
3061 OS.kill(processPID)
31 pass
32
33func _resolvePath(path):
34 var file = File.new()
35 file.open(path, File.READ)
36 var finalPath = file.get_path_absolute()
37 file.close()
38 return finalPath
3962
4063func setupGateway():
4164 emit_signal("starting_gateway")
4265 var executiblePath = getExecutiblePath()
43 var path = _resolvePath(executiblePath)
66 var path = ProjectSettings.globalize_path(executiblePath)
4467
4568 var args = ["run"]
4669 if !persist: args.append('--no-persist')
4770 if writable: args.append('--writable')
4871
49 var resolvedStorageDirectory = _resolvePath(storageDirectory)
72 var resolvedStorageDirectory = ProjectSettings.globalize_path(storageDirectory)
5073 args.append('--storage-location')
5174 args.append(resolvedStorageDirectory)
52
53 print("Starting gateway from " + path)
54
75
76 print("Starting gateway from ",path, " with args ", args)
77
5578 # Start the hyper-gateway in a process
5679 processPID = OS.execute(path, args, false)
5780
……@@ -61,23 +84,116 @@ func setupGateway():
6184
6285 print("Started gateway at " + str(processPID))
6386 emit_signal("started_gateway", processPID)
64 pass
6587
6688func ensureSetup():
67 if processPID != 0: return
89 if processPID != 0: return
6890 setupGateway()
69 pass
70
71func getExecutiblePath():
91
92func getExecutibleName():
7293 var name = OS.get_name()
73 if name == 'X11': return "res://hyper-gateway/hyper-gateway-linux"
74 if name == 'OSX': return "res://hyper-gateway/hyper-gateway-macos"
75 if name == 'Windows': return "res://hyper-gateway/hyper-gateway-windows.exe"
94 if name == 'X11': return "hyper-gateway-linux"
95 if name == 'OSX': return "hyper-gateway-macos"
96 if name == 'Windows': return "hyper-gateway-windows.exe"
7697 push_error("Can not start gateway, invalid operating system " + name)
77 pass
7898
79func defaultDirectory():
99func getCurrentVersion():
100 var file = File.new()
101 var err = file.open(getVersionFilePath(), File.READ)
102 if err != OK:
103 printerr('No existing binary version found', err)
104 return ""
105 var version = file.get_as_text()
106 file.close()
107 return version
108
109func saveCurrentVersion(version):
110 var file = File.new()
111 file.open(getVersionFilePath(), File.WRITE)
112 file.store_string(version)
113 file.close()
114
115func getVersionFilePath():
116 return storageDirectory + 'version.txt'
117
118func getExecutiblePath():
119 var executibleName = getExecutibleName()
120 return storageDirectory + executibleName
121
122func ensureStorageLocation():
80123 var dir = Directory.new()
81 dir.open('user://gateway-data/')
82 return dir.get_current_dir()
83 pass
124 var err = dir.make_dir_recursive(storageDirectory)
125 if err != OK:
126 printerr("Unable to create storage directory ", err)
127
128func hasBinary():
129 var version = getCurrentVersion()
130 return version && version.length()
131
132func ensureDownloaded():
133 if autoUpdate || !hasBinary():
134 checkLatestVersion()
135 elif autoStart:
136 ensureSetup()
137
138func checkLatestVersion():
139 var url = latestURL()
140 print('Getting latest version from ' + url)
141 latestInfoRequest.request(url, [], true, HTTPClient.METHOD_GET)
142
143func _on_got_latest(_result, response_code, _headers, body):
144 print('Latest info response', response_code)
145 var parsed = JSON.parse(body.get_string_from_utf8())
146 if parsed.error != OK:
147 printerr("Unable to parse latest version from GitHub:", parsed.error_string)
148 return
149 var info = parsed.result
150 var newVersion = info.tag_name
151
152 print('Latest version:', newVersion)
153
154 var existing = getCurrentVersion()
155
156 if newVersion != existing: downloadLatest(info.assets, newVersion)
157 elif autoStart: ensureSetup()
158
159func downloadLatest(assets, version):
160 var toDownload = null
161 var executibleName = getExecutibleName()
162 for asset in assets:
163 if asset.name != executibleName: continue
164 toDownload = asset
165 if !toDownload:
166 printerr("Unable to find valid executible in latest release")
167 return
168
169 var fromURL = toDownload.browser_download_url
170 var toPath = getExecutiblePath()
171
172 print('Downloading latest binary:',fromURL)
173
174 downloadFileRequest.set_download_file(toPath)
175
176 downloadingVersion = version
177 emit_signal("started_download", version)
178
179 downloadFileRequest.request(fromURL, [], true,HTTPClient.METHOD_GET)
180
181func _on_finished_download(_result, response_code, _headers, _body):
182 var executiblePath = getExecutiblePath()
183 var path = ProjectSettings.globalize_path(executiblePath)
184 var os = OS.get_name()
185
186 # Mark file as executible if not on Windows
187 if os != "Windows":
188 OS.execute("chmod", ["+x", path])
189
190 print("Finished download ", response_code)
191 saveCurrentVersion(downloadingVersion)
192 emit_signal("finished_download", downloadingVersion)
193 if autoStart: ensureSetup()
194
195func repoURL():
196 return "https://api.github.com/repos/" + repositoryName + "/"
197
198func latestURL():
199 return repoURL() + "releases/latest"
src/HyperLoad/HyperLoad.tscn +0 -1
……@@ -78,7 +78,6 @@ __meta__ = {
7878}
7979
8080[node name="HyperGateway" parent="." instance=ExtResource( 6 )]
81autoStart = true
8281
8382[node name="HyperRequest" parent="HyperGateway" instance=ExtResource( 2 )]
8483
src/HyperLoad/Output.gd +1 -1
……@@ -1,5 +1,5 @@
11extends RichTextLabel
22
3func _on_HyperLoad_request_completed(result, response_code, headers, body):
3func _on_HyperLoad_request_completed(_result, _response_code, _headers, body):
44 text = body.get_string_from_utf8()
55 pass # Replace with function body.
src/HyperLoad/StatusLabel.gd +2 -2
……@@ -33,12 +33,12 @@ func setGatewayLoading():
3333 pass # Replace with function body.
3434
3535
36func setGatewayLoaded(pid):
36func setGatewayLoaded(_pid):
3737 text = "Status: Gateway Loaded"
3838 pass # Replace with function body.
3939
4040
41func _on_HyperLoad_request_completed(result, response_code, headers, body):
41func _on_HyperLoad_request_completed(_result, response_code, _headers, body):
4242 print("Response Code ", response_code)
4343 if response_code != 200:
4444 var message = body.get_string_from_utf8()
src/HyperLoad/URLBar.gd +1 -1
……@@ -24,6 +24,6 @@ func navigate():
2424 pass # Replace with function body.
2525
2626
27func _on_URLBar_text_entered(new_text):
27func _on_URLBar_text_entered(_new_text):
2828 navigate()
2929 pass # Replace with function body.
src/HyperNotes/HyperNotes.gd +6 -5
……@@ -10,11 +10,6 @@ onready var fileChanges = $HyperGateway/FileChanges
1010
1111export var source = "hyper://notes/"
1212
13func _ready():
14 fileChanges.request(source)
15 fileLister.list(source)
16 loader.getContent(filePathInput.text)
17
1813func _on_SaveButton_pressed():
1914 saver.save(filePathInput.text, fileContent.text)
2015 pass
……@@ -55,3 +50,9 @@ func _on_Files_item_selected():
5550func _on_FileChanges_change():
5651 fileLister.list(source)
5752 pass # Replace with function body.
53
54
55func _on_HyperGateway_started_gateway(_pid):
56 fileChanges.request(source)
57 fileLister.list(source)
58 loader.getContent(filePathInput.text)
src/HyperNotes/HyperNotes.tscn +1 -0
……@@ -84,6 +84,7 @@ script = ExtResource( 2 )
8484[connection signal="item_selected" from="HBoxContainer/Files" to="." method="_on_Files_item_selected"]
8585[connection signal="pressed" from="HBoxContainer/VBoxContainer/HBoxContainer/SaveButton" to="." method="_on_SaveButton_pressed"]
8686[connection signal="pressed" from="HBoxContainer/VBoxContainer/HBoxContainer/LoadButton" to="." method="_on_LoadButton_pressed"]
87[connection signal="started_gateway" from="HyperGateway" to="." method="_on_HyperGateway_started_gateway"]
8788[connection signal="files" from="HyperGateway/ListFiles" to="." method="_on_ListFiles_files"]
8889[connection signal="request_completed" from="HyperGateway/ListFiles" to="HyperGateway/ListFiles" method="_on_ListFiles_request_completed"]
8990[connection signal="content" from="HyperGateway/GetContent" to="." method="_on_GetContent_content"]
src/HyperRequest/HyperRequest.gd +1 -2
……@@ -19,5 +19,4 @@ func request(
1919 emit_signal('loading_data', url)
2020
2121 print(method, ' ', toLoad)
22 .request(toLoad, custom_headers, ssl_validate_domain, method, request_data)
23pass
22 return .request(toLoad, custom_headers, ssl_validate_domain, method, request_data)
src/utils/URLParser.gd +3 -1
……@@ -18,6 +18,7 @@ func parse(url):
1818 var path = parsed.get_string(3)
1919 var host = raw_host
2020 var port = DEFAULT_PORTS[protocol]
21 var ssl = protocol == "https"
2122
2223 if ":" in raw_host:
2324 var split = raw_host.split(':')
……@@ -28,5 +29,6 @@ func parse(url):
2829 "protocol": protocol,
2930 "host": host,
3031 "port": port,
31 "path": path
32 "path": path,
33 "ssl": ssl,
3234 }