haplo 2.5.3-java → 2.5.7-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/haplo.gemspec +2 -2
- data/lib/check.rb +1 -1
- data/lib/debuggers.rb +154 -0
- data/lib/haplo-templates.jar +0 -0
- data/lib/notifications.rb +3 -0
- data/lib/plugin_tool.rb +9 -1
- data/lib/server.rb +7 -2
- data/lib/version.txt +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: afd010eec2bb0bd821533f4637c5b9f061a39978e957ed7581b32dc12ab657cd
|
4
|
+
data.tar.gz: 1fc5a49c99b680c25a25f1a2cb9c840673fdba938282613e69bcf7613dcb715b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74dcee72560160abcf2f018bd054cb08289ca596dbc28d425ebfd9ba4c9771402a036e83678683d9b8aa2adacbf31f80e8d3a0b62084f3466d3c410939c6fa5e
|
7
|
+
data.tar.gz: c8a68477be81d243e4dc5b2737953f0e6275fcc1ef4112c4a7731cd0fc08bc260b13f08f02d16539fc0ed53e045bca166a6378c70b61239cd30ed314e8b4d9cf
|
data/haplo.gemspec
CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
|
|
3
3
|
files = Dir.glob("#{root_dir}/**/*.*").map { |x| x[root_dir.length + 1, x.length]}
|
4
4
|
|
5
5
|
s.name = 'haplo'
|
6
|
-
s.version = '2.5.
|
7
|
-
s.date = '2021-
|
6
|
+
s.version = '2.5.7'
|
7
|
+
s.date = '2021-11-16'
|
8
8
|
s.summary = "Haplo Plugin Tool"
|
9
9
|
s.description = "Development tools for developing Haplo plugins, see https://haplo.org"
|
10
10
|
s.licenses = ["MPL-2.0"]
|
data/lib/check.rb
CHANGED
data/lib/debuggers.rb
CHANGED
@@ -107,3 +107,157 @@ module PluginTool
|
|
107
107
|
|
108
108
|
end
|
109
109
|
|
110
|
+
# -------------------------------------------------------------------------
|
111
|
+
|
112
|
+
module DebugAdapterProtocolTunnel
|
113
|
+
|
114
|
+
@@dap_plugins = nil
|
115
|
+
@@dap_debugger_option = nil
|
116
|
+
@@dap_server = nil
|
117
|
+
@@dap_connection = nil
|
118
|
+
|
119
|
+
def self.prepare(plugins, options)
|
120
|
+
@@dap_plugins = plugins
|
121
|
+
@@dap_debugger_option = options.debugger
|
122
|
+
raise "BAD DEBUGGER OPTION #{@@dap_debugger_option}" unless @@dap_debugger_option =~ /\A(\d+)\z/
|
123
|
+
@@dap_server = TCPServer.new("127.0.0.1", @@dap_debugger_option.to_i)
|
124
|
+
Thread.new do
|
125
|
+
while true
|
126
|
+
connection = @@dap_server.accept
|
127
|
+
if connection
|
128
|
+
if @@dap_connection
|
129
|
+
connection.close
|
130
|
+
else
|
131
|
+
@@dap_connection = DAPConnection.new(connection, @@dap_plugins)
|
132
|
+
Thread.new do
|
133
|
+
@@dap_connection.run
|
134
|
+
_stop_remote_debugger()
|
135
|
+
@@dap_connection = nil
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
rescue => e
|
141
|
+
# ignore
|
142
|
+
end
|
143
|
+
at_exit do
|
144
|
+
@@dap_server.close
|
145
|
+
@@dap_connection.close if @@dap_connection
|
146
|
+
_stop_remote_debugger()
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def self._stop_remote_debugger
|
151
|
+
puts "DEBUGGER: Stopping remote debugger..."
|
152
|
+
result = PluginTool.post("/api/development-plugin-loader/debugger-dap-stop")
|
153
|
+
if result == 'OK'
|
154
|
+
puts "DEBUGGER: Remote debugger stopped."
|
155
|
+
else
|
156
|
+
puts "DEBUGGER: Error stopping remote debugger, application server may be in non-functioning state."
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def self.log_message_from_server(text)
|
161
|
+
if @@dap_connection
|
162
|
+
@@dap_connection._write({
|
163
|
+
'type' => 'event',
|
164
|
+
'event' => 'output',
|
165
|
+
'body' => {
|
166
|
+
'category' => 'console',
|
167
|
+
'output' => text+"\n"
|
168
|
+
}
|
169
|
+
})
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def self.dap_message_from_server(json)
|
174
|
+
if @@dap_connection
|
175
|
+
@@dap_connection._write(JSON.parse(json))
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
class DAPConnection
|
180
|
+
def initialize(connection, plugins)
|
181
|
+
@connection = connection
|
182
|
+
@plugins = plugins
|
183
|
+
@running = false
|
184
|
+
@next_seq = 1
|
185
|
+
@write_mutex = Mutex.new
|
186
|
+
@_dump_messages = (ENV['HAPLO_DAP_DEBUG'] == '1')
|
187
|
+
end
|
188
|
+
|
189
|
+
def close
|
190
|
+
begin
|
191
|
+
@connection.close
|
192
|
+
rescue => e
|
193
|
+
# ignore any errors
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def run
|
198
|
+
begin
|
199
|
+
run2
|
200
|
+
rescue => e
|
201
|
+
puts "DEBUGGER: Local connection closed"
|
202
|
+
end
|
203
|
+
self.close
|
204
|
+
end
|
205
|
+
|
206
|
+
def run2
|
207
|
+
@running = true
|
208
|
+
have_initialized = false
|
209
|
+
while @running
|
210
|
+
header = @connection.readline
|
211
|
+
blank = @connection.readline
|
212
|
+
if header =~ /\Acontent-length:\s+(\d+)\r\n\z/i && blank == "\r\n"
|
213
|
+
body = @connection.read($1.to_i)
|
214
|
+
message = JSON.parse(body)
|
215
|
+
puts "DAP READ: #{JSON.pretty_generate(message)}\n" if @_dump_messages
|
216
|
+
unless have_initialized
|
217
|
+
if message['type'] == 'request' && message['command'] == 'initialize'
|
218
|
+
puts "DEBUGGER: Local connection from #{message['arguments']['clientName']} (#{message['arguments']['clientID']})\nDEBUGGER: Starting remote debugger..."
|
219
|
+
plugin_locations = {}
|
220
|
+
@plugins.each { |p| plugin_locations[p.name] = p.plugin_dir }
|
221
|
+
start_response = PluginTool.post("/api/development-plugin-loader/debugger-dap-start", {
|
222
|
+
:plugin_locations => JSON.generate(plugin_locations)
|
223
|
+
})
|
224
|
+
unless start_response =~ /\ATOKEN: (.+)\z/
|
225
|
+
raise "Remote debugger failed to start"
|
226
|
+
end
|
227
|
+
@token = $1
|
228
|
+
puts "DEBUGGER: Remote debugger started."
|
229
|
+
have_initialized = true
|
230
|
+
else
|
231
|
+
raise "Expected initialize message after DAP connection"
|
232
|
+
end
|
233
|
+
end
|
234
|
+
# TODO: Send messages in another thread, so that they can be batched together
|
235
|
+
message_response = PluginTool.post_with_json_response("/api/development-plugin-loader/debugger-dap-messages", {
|
236
|
+
:token => @token,
|
237
|
+
:messages => JSON.generate([message])
|
238
|
+
})
|
239
|
+
if message_response['error']
|
240
|
+
puts "DEBUGGER: Server responded with error: #{message_response['error']}"
|
241
|
+
else
|
242
|
+
message_response['messages'].each do |response|
|
243
|
+
_write(response) if response
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
def _write(message)
|
251
|
+
@write_mutex.synchronize do
|
252
|
+
m = {'seq' => @next_seq}
|
253
|
+
@next_seq += 1
|
254
|
+
m.merge!(message)
|
255
|
+
puts "DAP WRITE: #{JSON.pretty_generate(m)}\n" if @_dump_messages
|
256
|
+
msg_json = JSON.generate(m)
|
257
|
+
@connection.write("Content-Length: #{msg_json.bytesize}\r\n\r\n")
|
258
|
+
@connection.write(msg_json)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
end
|
data/lib/haplo-templates.jar
CHANGED
Binary file
|
data/lib/notifications.rb
CHANGED
@@ -69,6 +69,9 @@ module PluginTool
|
|
69
69
|
when 'log '
|
70
70
|
# Output from console.log()
|
71
71
|
puts "LOG:#{data}"
|
72
|
+
DebugAdapterProtocolTunnel.log_message_from_server(data)
|
73
|
+
when 'DAP1'
|
74
|
+
DebugAdapterProtocolTunnel.dap_message_from_server(data)
|
72
75
|
when 'prof'
|
73
76
|
# Profiler report
|
74
77
|
PluginTool.profiler_handle_report(data)
|
data/lib/plugin_tool.rb
CHANGED
@@ -23,7 +23,7 @@ NO_DEPENDENCY_COMMANDS.delete('list')
|
|
23
23
|
PLUGIN_SEARCH_PATH = ['.']
|
24
24
|
|
25
25
|
# Options for passing to plugin objects
|
26
|
-
options = Struct.new(:output, :minimiser, :no_dependency, :with_dependency, :exclude_with_prefix, :no_console, :show_system_audit, :args, :force, :turbo, :profile, :profile_file, :profile_format, :coverage_file, :coverage_format, :server_substring, :restrict_to_app_id).new
|
26
|
+
options = Struct.new(:output, :minimiser, :no_dependency, :with_dependency, :exclude_with_prefix, :no_console, :show_system_audit, :args, :force, :turbo, :debugger, :profile, :profile_file, :profile_format, :coverage_file, :coverage_format, :server_substring, :restrict_to_app_id).new
|
27
27
|
|
28
28
|
# Parse arguments
|
29
29
|
show_help = false
|
@@ -37,6 +37,7 @@ opts = GetoptLong.new(
|
|
37
37
|
['--server', '-s', GetoptLong::REQUIRED_ARGUMENT],
|
38
38
|
['--force', GetoptLong::NO_ARGUMENT],
|
39
39
|
['--turbo', GetoptLong::NO_ARGUMENT],
|
40
|
+
['--debugger', GetoptLong::REQUIRED_ARGUMENT],
|
40
41
|
['--profile', GetoptLong::REQUIRED_ARGUMENT],
|
41
42
|
['--profile-file', GetoptLong::REQUIRED_ARGUMENT],
|
42
43
|
['--profile-format', GetoptLong::REQUIRED_ARGUMENT],
|
@@ -77,6 +78,8 @@ opts.each do |opt, argument|
|
|
77
78
|
options.force = true
|
78
79
|
when '--turbo'
|
79
80
|
options.turbo = true
|
81
|
+
when '--debugger'
|
82
|
+
options.debugger = argument
|
80
83
|
when '--profile'
|
81
84
|
options.profile = argument.to_f
|
82
85
|
when '--profile-file'
|
@@ -365,6 +368,11 @@ PluginTool.start_syntax_check
|
|
365
368
|
# Notifications support (including console)
|
366
369
|
PluginTool.start_notifications(options) unless options.no_console
|
367
370
|
|
371
|
+
# If the debugger is requested, open the listening socket. Debugger initialised on connection.
|
372
|
+
if options.debugger
|
373
|
+
DebugAdapterProtocolTunnel.prepare(plugins, options)
|
374
|
+
end
|
375
|
+
|
368
376
|
# Open watcher
|
369
377
|
watcher = PluginTool.make_watcher(plugins.map { |p| p.plugin_dir })
|
370
378
|
|
data/lib/server.rb
CHANGED
@@ -11,6 +11,7 @@ module PluginTool
|
|
11
11
|
@@server_hostname = hostname
|
12
12
|
@@server_port = port
|
13
13
|
@@server_key = key
|
14
|
+
@@request_mutex = Mutex.new
|
14
15
|
end
|
15
16
|
|
16
17
|
def self.get_server_hostname
|
@@ -76,7 +77,9 @@ module PluginTool
|
|
76
77
|
http = get_http
|
77
78
|
request = Net::HTTP::Get.new(path)
|
78
79
|
setup_request(request)
|
79
|
-
|
80
|
+
@@request_mutex.synchronize do
|
81
|
+
http.request(request).body
|
82
|
+
end
|
80
83
|
end
|
81
84
|
|
82
85
|
def self.get_with_json_response(path)
|
@@ -117,7 +120,9 @@ EOF
|
|
117
120
|
body << "--#{boundary}--\r"
|
118
121
|
request.body = body
|
119
122
|
end
|
120
|
-
|
123
|
+
@@request_mutex.synchronize do
|
124
|
+
http.request(request).body
|
125
|
+
end
|
121
126
|
end
|
122
127
|
|
123
128
|
def self.post_with_json_response(path, params = nil, files = nil)
|
data/lib/version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
402e1ac
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haplo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.7
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Haplo Services
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Development tools for developing Haplo plugins, see https://haplo.org
|
14
14
|
email: client.services@haplo-services.com
|