haplo 2.5.3-java → 2.5.7-java

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9a85d1c5d29a836c427c9a6045622e964b626746ca6e6d14b1db57d8488e6a4d
4
- data.tar.gz: 50ed9669ca59195140d415eddd50d559815e320d81bcb8b0cfddf87ff3244c87
3
+ metadata.gz: afd010eec2bb0bd821533f4637c5b9f061a39978e957ed7581b32dc12ab657cd
4
+ data.tar.gz: 1fc5a49c99b680c25a25f1a2cb9c840673fdba938282613e69bcf7613dcb715b
5
5
  SHA512:
6
- metadata.gz: 5763f67233ec3bb7ad05bd016608cc211b6d339db362fb266d37a49486b73389367ab6f8717f3caa9bcb53f8a4714878c1699b4fa6c9c54a915c5955d577c9b0
7
- data.tar.gz: '0278435b6a89f641b30fc80619604f7be2d56cb155f8496ef0e3969a645a61c35b1cd04cdec98d31e6d2421943aaf97c3bb16e6fce554924b8adadd9f9c93f45'
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.3'
7
- s.date = '2021-07-13'
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
@@ -22,7 +22,7 @@ module PluginTool
22
22
  puts
23
23
  if @@check_ok && !@@check_warn
24
24
  puts "PASSED"
25
- elsif @@check_warn
25
+ elsif @@check_ok && @@check_warn
26
26
  puts "PASSED WITH WARNINGS"
27
27
  else
28
28
  puts "FAILED"
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
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
- http.request(request).body
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
- http.request(request).body
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
- a60e0f9
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.3
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-07-13 00:00:00.000000000 Z
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