cloudi 1.7.4 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/cloudi.rb +104 -36
  5. metadata +34 -31
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 48fe446d206024bcc59ff6dd776e89d4f9fb848f2fc0be74192e00b0287fac52
4
- data.tar.gz: dff753295fa74043c66fefe854f826d23b8f5d1ef19664e21683a1bf5e6f9bef
3
+ metadata.gz: cc66b5b4c55778756084c1ee148acc705cfa1b8d839a7ea8febb9a6004bd0ad2
4
+ data.tar.gz: 667a4d1757a157fc95b998f2e86bb0684f47d578da9096c5791d7b349715495b
5
5
  SHA512:
6
- metadata.gz: e2d831d7b2acac404e66567abbe6583b9ee9fe7c6bf3856549a7b5b8d3a51cf909cd2d535f16d4ddaa8af2be10a7f60258f384a8bee3a9ca3e3dffe9864e6c68
7
- data.tar.gz: 4f8e135ec07065c6f81c727a81170e27dbe73b232d5ee66a44705d61cd63c14763f36e68ac1edf55302767fd9dc320c81f8b979602755f3e9af65afd68c94742
6
+ metadata.gz: 719e2a63d056913d4dee29c91a0bafb0d9b9e4de20232f6a56c96e731ba61117114063a893330c844df37b278ed3ef5858a27b76e420538a51bbe68a56f9403b
7
+ data.tar.gz: 43b9b474e3842568dba81e38944a679db1f84e3e04933b1e07948ea6feca8e5dd70d640a250b7eb0bc3673524dee56c558caec4e26ff258104cb2cc4c2df2d3d
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/lib/cloudi.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  #
5
5
  # MIT License
6
6
  #
7
- # Copyright (c) 2011-2017 Michael Truog <mjtruog at protonmail dot com>
7
+ # Copyright (c) 2011-2021 Michael Truog <mjtruog at protonmail dot com>
8
8
  #
9
9
  # Permission is hereby granted, free of charge, to any person obtaining a
10
10
  # copy of this software and associated documentation files (the "Software"),
@@ -31,6 +31,7 @@ $stdout.sync = true
31
31
  $stderr.sync = true
32
32
 
33
33
  require 'erlang'
34
+ require 'stringio'
34
35
 
35
36
  module CloudI
36
37
  class API
@@ -56,13 +57,14 @@ module CloudI
56
57
  @s.sync = true
57
58
  @use_header = true
58
59
  else
60
+ $stderr.puts 'CloudI service execution must occur in CloudI'
59
61
  raise InvalidInputException
60
62
  end
61
63
  @initialization_complete = false
62
64
  @terminate = false
63
65
  @size = buffer_size_str.to_i
64
66
  @callbacks = Hash.new
65
- @timeout_terminate = 1000 # TIMEOUT_TERMINATE_MIN
67
+ @timeout_terminate = 10 # TIMEOUT_TERMINATE_MIN
66
68
  send(Erlang.term_to_binary(:init))
67
69
  poll_request(nil, false)
68
70
  end
@@ -75,6 +77,7 @@ module CloudI
75
77
  attr_reader :timeout_async
76
78
  attr_reader :timeout_sync
77
79
  attr_reader :timeout_terminate
80
+ attr_reader :priority_default
78
81
 
79
82
  def self.thread_count
80
83
  s = getenv('CLOUDI_API_INIT_THREAD_COUNT')
@@ -181,7 +184,7 @@ module CloudI
181
184
  OtpErlangBinary.new(request),
182
185
  timeout, priority,
183
186
  OtpErlangBinary.new(trans_id), pid]))
184
- raise ForwardAsyncException.new()
187
+ raise ForwardAsyncException
185
188
  end
186
189
 
187
190
  def forward_sync(name, request_info, request,
@@ -191,7 +194,7 @@ module CloudI
191
194
  OtpErlangBinary.new(request),
192
195
  timeout, priority,
193
196
  OtpErlangBinary.new(trans_id), pid]))
194
- raise ForwardSyncException.new()
197
+ raise ForwardSyncException
195
198
  end
196
199
 
197
200
  def return_(request_type, name, pattern, response_info, response,
@@ -213,7 +216,7 @@ module CloudI
213
216
  OtpErlangBinary.new(response),
214
217
  timeout,
215
218
  OtpErlangBinary.new(trans_id), pid]))
216
- raise ReturnAsyncException.new()
219
+ raise ReturnAsyncException
217
220
  end
218
221
 
219
222
  def return_sync(name, pattern, response_info, response,
@@ -223,7 +226,7 @@ module CloudI
223
226
  OtpErlangBinary.new(response),
224
227
  timeout,
225
228
  OtpErlangBinary.new(trans_id), pid]))
226
- raise ReturnSyncException.new()
229
+ raise ReturnSyncException
227
230
  end
228
231
 
229
232
  def recv_async(timeout=nil, trans_id=nil, consume=true)
@@ -253,6 +256,7 @@ module CloudI
253
256
  function = function_queue.shift
254
257
  function_queue.push(function)
255
258
  end
259
+ return_null_response = false
256
260
  case command
257
261
  when MESSAGE_SEND_ASYNC
258
262
  begin
@@ -272,29 +276,39 @@ module CloudI
272
276
  if not response.kind_of?(String)
273
277
  response = ''
274
278
  end
275
- rescue InvalidInputException => e
276
- raise e
277
279
  rescue MessageDecodingException => e
278
- raise e
280
+ @terminate = true
281
+ return_null_response = true
279
282
  rescue TerminateException => e
280
- raise e
283
+ return_null_response = true
281
284
  rescue ReturnAsyncException
282
285
  return
283
- rescue ForwardAsyncException
284
- return
285
286
  rescue ReturnSyncException => e
287
+ @terminate = true
286
288
  $stderr.puts e.message
287
289
  $stderr.puts e.backtrace
288
- API.assert{false}
290
+ return
291
+ rescue ForwardAsyncException
289
292
  return
290
293
  rescue ForwardSyncException => e
294
+ @terminate = true
291
295
  $stderr.puts e.message
292
296
  $stderr.puts e.backtrace
293
- API.assert{false}
294
297
  return
298
+ rescue StandardError => e
299
+ return_null_response = true
300
+ $stderr.puts e.message
301
+ $stderr.puts e.backtrace
302
+ rescue SystemExit => e
303
+ $stderr.puts e.message
304
+ $stderr.puts e.backtrace
305
+ raise
295
306
  rescue
296
307
  $stderr.puts $!.message
297
308
  $stderr.puts $!.backtrace
309
+ exit(1)
310
+ end
311
+ if return_null_response
298
312
  response_info = ''
299
313
  response = ''
300
314
  end
@@ -321,29 +335,39 @@ module CloudI
321
335
  if not response.kind_of?(String)
322
336
  response = ''
323
337
  end
324
- rescue InvalidInputException => e
325
- raise e
326
338
  rescue MessageDecodingException => e
327
- raise e
339
+ @terminate = true
340
+ return_null_response = true
328
341
  rescue TerminateException => e
329
- raise e
342
+ return_null_response = true
330
343
  rescue ReturnSyncException
331
344
  return
332
- rescue ForwardSyncException
333
- return
334
345
  rescue ReturnAsyncException => e
346
+ @terminate = true
335
347
  $stderr.puts e.message
336
348
  $stderr.puts e.backtrace
337
- API.assert{false}
349
+ return
350
+ rescue ForwardSyncException
338
351
  return
339
352
  rescue ForwardAsyncException => e
353
+ @terminate = true
340
354
  $stderr.puts e.message
341
355
  $stderr.puts e.backtrace
342
- API.assert{false}
343
356
  return
357
+ rescue StandardError => e
358
+ return_null_response = true
359
+ $stderr.puts e.message
360
+ $stderr.puts e.backtrace
361
+ rescue SystemExit => e
362
+ $stderr.puts e.message
363
+ $stderr.puts e.backtrace
364
+ raise
344
365
  rescue
345
366
  $stderr.puts $!.message
346
367
  $stderr.puts $!.backtrace
368
+ exit(1)
369
+ end
370
+ if return_null_response
347
371
  response_info = ''
348
372
  response = ''
349
373
  end
@@ -402,7 +426,11 @@ module CloudI
402
426
 
403
427
  def poll_request(timeout, external)
404
428
  if @terminate
405
- return false
429
+ if external
430
+ return false
431
+ else
432
+ raise TerminateException.new(@timeout_terminate)
433
+ end
406
434
  elsif external and not @initialization_complete
407
435
  send(Erlang.term_to_binary(:polling))
408
436
  @initialization_complete = true
@@ -492,6 +520,9 @@ module CloudI
492
520
  callback(command, name, pattern, request_info, request,
493
521
  request_timeout, priority, trans_id,
494
522
  Erlang.binary_to_term(pid))
523
+ if @terminate
524
+ return false
525
+ end
495
526
  when MESSAGE_RECV_ASYNC, MESSAGE_RETURN_SYNC
496
527
  i += j; j = 4
497
528
  response_info_size = data[i, j].unpack('L')[0]
@@ -615,35 +646,66 @@ module CloudI
615
646
  return poll_request(timeout, true)
616
647
  end
617
648
 
618
- def text_key_value_parse(text)
619
- result = {}
620
- data = text.split(NULL.chr)
621
- (0...(data.length)).step(2).each do |i|
622
- value = result[data[i]]
649
+ def shutdown(reason=nil)
650
+ if reason.nil?
651
+ reason = ''
652
+ end
653
+ send(Erlang.term_to_binary([:shutdown, reason]))
654
+ end
655
+
656
+ def self.text_pairs_parse(text)
657
+ pairs = {}
658
+ text_segments = text.split(NULL.chr)
659
+ (0...(text_segments.length)).step(2).each do |i|
660
+ value = pairs[text_segments[i]]
623
661
  if value == nil
624
- result[data[i]] = data[i + 1]
662
+ pairs[text_segments[i]] = text_segments[i + 1]
625
663
  elsif value.kind_of?(Array)
626
- value << data[i + 1]
664
+ value << text_segments[i + 1]
627
665
  else
628
- result[data[i]] = [value, data[i + 1]]
666
+ pairs[text_segments[i]] = [value, text_segments[i + 1]]
629
667
  end
630
668
  end
631
- return result
669
+ return pairs
632
670
  end
633
671
 
634
- def info_key_value_parse(message_info)
635
- return text_key_value_parse(message_info)
672
+ def self.text_pairs_new(pairs, response)
673
+ text_stream = StringIO.new
674
+ pairs.each do |key, values|
675
+ if values.kind_of?(String)
676
+ text_stream.write "#{key}\0#{values}\0"
677
+ else
678
+ values.each do |value|
679
+ text_stream.write "#{key}\0#{value}\0"
680
+ end
681
+ end
682
+ end
683
+ text = text_stream.string
684
+ if response and text == ''
685
+ return "\0"
686
+ else
687
+ return text
688
+ end
689
+ end
690
+
691
+ def self.info_key_value_parse(info)
692
+ return text_pairs_parse(info)
693
+ end
694
+
695
+ def self.info_key_value_new(pairs, response = true)
696
+ return text_pairs_new(pairs, response)
636
697
  end
637
698
 
638
699
  def self.assert
639
- raise 'Assertion failed !' unless yield # if $DEBUG
700
+ raise AssertionError unless yield # if $DEBUG
640
701
  end
641
702
 
642
703
  private :null_response
643
704
  private :callback
644
705
  private :handle_events
645
706
  private :poll_request
646
- private :text_key_value_parse
707
+ private_class_method :text_pairs_parse
708
+ private_class_method :text_pairs_new
647
709
  private
648
710
 
649
711
  def send(data)
@@ -729,5 +791,11 @@ module CloudI
729
791
  end
730
792
  attr_reader :timeout
731
793
  end
794
+
795
+ class AssertionError < Exception
796
+ end
797
+
798
+ class FatalError < Exception
799
+ end
732
800
  end
733
801
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.4
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Truog
@@ -10,27 +10,31 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDgDCCAmigAwIBAgIBATANBgkqhkiG9w0BAQUFADBDMRAwDgYDVQQDDAdtanRy
14
- dW9nMRowGAYKCZImiZPyLGQBGRYKcHJvdG9ubWFpbDETMBEGCgmSJomT8ixkARkW
15
- A2NvbTAeFw0xODA5MTYwNjU2MTJaFw0xOTA5MTYwNjU2MTJaMEMxEDAOBgNVBAMM
16
- B21qdHJ1b2cxGjAYBgoJkiaJk/IsZAEZFgpwcm90b25tYWlsMRMwEQYKCZImiZPy
17
- LGQBGRYDY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+GXgkcMc
18
- t35WqRkNgmolpYtITHDVIDt6uRkY8g4YiI6SlYiyZiP4rrsPNn9sulTT6ZEwXhAu
19
- OIARkWXUw6i6j1WcIGPbqOTvjNW536K2O37lqyWyH1LMEpIB9F7IzEEklkqJLKma
20
- /0flBlrg0JcTATCNBHBA4nA5aavCToA66pDZvKhf2aE4RaXZ51e/XAGp8GD3bI/T
21
- JgEynOPwKrLPsZ292/NSiP3djEG2ysW0zQMBbsn8ARzh8rY140iIQrpG51ew6Vf9
22
- tk2zKgXbJVdohfsrHW14iQwCNwX7Sm4QEw7FrNkKW2Usqk2btv8AR1qmBDOY8Q3w
23
- sTxnkypn9bICfQIDAQABo38wfTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNV
24
- HQ4EFgQUamLQcH0m/CIPCBzBBk93E2bwepswIQYDVR0RBBowGIEWbWp0cnVvZ0Bw
25
- cm90b25tYWlsLmNvbTAhBgNVHRIEGjAYgRZtanRydW9nQHByb3Rvbm1haWwuY29t
26
- MA0GCSqGSIb3DQEBBQUAA4IBAQB9b2tlihs2MRw5T7vWvrEnfAPNJvyB0VhZ0GI3
27
- oiCBkT59olz87Xa0WgVIqUmBnI0RdxU4whOpbJS4FUb0WI5Qi951HZNadYWGCMOB
28
- IF4IEeV3wlkqXyqoMUDjGuviWm2y3aApwkBVjU7+eOG5zWTqKbzLm1wBXq0QfkY/
29
- 4J2hQRnAzsfNLCm7UFupYSzz6zP43IJGoAs710IC0S0uiETWpKZ3YSCKIeGyTA3L
30
- 7nx8OPNJn/PVnJAT33TvETe6yc/uUU9m/vhmdL3mQY53CPIqmmql4sVaPRhfTMra
31
- PR5cELfNRvj5UGOqyo9Pf8nMz4m+4+IpMII8ZWKmeDP4XmhV
13
+ MIIESDCCArCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDDBxtanRy
14
+ dW9nL0RDPXByb3Rvbm1haWwvREM9Y29tMB4XDTIxMDUyNzIwNTIwMFoXDTIyMDUy
15
+ NzIwNTIwMFowJzElMCMGA1UEAwwcbWp0cnVvZy9EQz1wcm90b25tYWlsL0RDPWNv
16
+ bTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMd6XAi81JZcv5AzNqvx
17
+ 7rPXgBArpQVU0zoUCcJ8ZkszXLnaDkyLXZZDWi4tNIZGzkFGzJv2YxQg/ocUzZXF
18
+ ixcKuCiUF8nvV58DrFxd8ZYvYMk9GDoU95zIu/brrn6KeFP/nd10vtx46hSlGgeE
19
+ 2vzk2pxw8Umml6xwTuximLjVcetas0tIm3kcUAhdWnI7hTgQbPmsGMEtpebpx4Ff
20
+ RluZWlBVLt0i1mFpG2BxtGXLFxgxzK/syD8ZHBwaraW5k2ENY163TaJUo2NjDpNF
21
+ 0GpcyslZLz0JKKS1RHyuj6fI5cB+7pP/ewbU7ksoMa8zN067gG6Ry75RnKu/Tfzv
22
+ Ebh3eBwapuvHnPsWZlyqsPBhoFUH2JUknUgtcg1Q2S6CmzyxdyDaU8OugladoDzF
23
+ hWuqx3Mt2cvo1kIUCmxUFtHDzTWy5MP0LMv2IwvU6bbgzgbDndqAj9OesQYTxQ7L
24
+ rbMFjq1GW7nQXvU9GEb1WJYr2Aq8qovn/6mxFWjPVIp7gQIDAQABo38wfTAJBgNV
25
+ HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUoFV73/q6KrKCMTCPVy0+jptr
26
+ 25AwIQYDVR0RBBowGIEWbWp0cnVvZ0Bwcm90b25tYWlsLmNvbTAhBgNVHRIEGjAY
27
+ gRZtanRydW9nQHByb3Rvbm1haWwuY29tMA0GCSqGSIb3DQEBCwUAA4IBgQATTfoe
28
+ WbWoOclAmsl338LM/RjGpXVi6N9XF01JhgIXJqQocMlc6L8I6hG9288bQ4nYtYHU
29
+ Zpw1Wy+5nlAtoacG+ngQLnB1k+oLi1PXN//MjcD5N+qyAgZ71StjzH7+cPiEA5aw
30
+ 0CCXPnsZQR892eESnE8Sc6QEc4iwCdIqbwBgQ4tjF6I34odtuAO2Ydp6keE/eqeQ
31
+ UdATiqZuvgi/n3fgvFD8FgDec8eiM/u3+n30xc+86m2uqiKSf9ueBNZRmNq9umc4
32
+ qyyl2UpTyk2WqaXXRCLqKF20QlU2lyR2JnPh7+EsrQKmaaPtw+7QwRhERxXza52x
33
+ lSRl2bAVGGyRLghx/n1K1ZISc9UJERR7tdEz3N4fbKzRxG5Tk0b7HdeGotue9Zt3
34
+ WH4J2/+Q2b2u3K1U9iGPxyO3BEBz36D/qdddw1eZTdpT6LFrBQNOVS8C/cVRpUlp
35
+ VOqfJ1qX4PhcbAYvPwmU8NKJ1UDTdEf4+e+JgHk5qLzpjNsiHYEGTN3E7Gw=
32
36
  -----END CERTIFICATE-----
33
- date: 2018-09-15 00:00:00.000000000 Z
37
+ date: 2021-05-27 00:00:00.000000000 Z
34
38
  dependencies:
35
39
  - !ruby/object:Gem::Dependency
36
40
  name: erlang_rb
@@ -38,40 +42,40 @@ dependencies:
38
42
  requirements:
39
43
  - - "~>"
40
44
  - !ruby/object:Gem::Version
41
- version: '1.7'
45
+ version: '2.0'
42
46
  - - ">="
43
47
  - !ruby/object:Gem::Version
44
- version: 1.7.4
48
+ version: 2.0.2
45
49
  type: :runtime
46
50
  prerelease: false
47
51
  version_requirements: !ruby/object:Gem::Requirement
48
52
  requirements:
49
53
  - - "~>"
50
54
  - !ruby/object:Gem::Version
51
- version: '1.7'
55
+ version: '2.0'
52
56
  - - ">="
53
57
  - !ruby/object:Gem::Version
54
- version: 1.7.4
58
+ version: 2.0.2
55
59
  - !ruby/object:Gem::Dependency
56
60
  name: erlang_rb
57
61
  requirement: !ruby/object:Gem::Requirement
58
62
  requirements:
59
63
  - - "~>"
60
64
  - !ruby/object:Gem::Version
61
- version: '1.7'
65
+ version: '2.0'
62
66
  - - ">="
63
67
  - !ruby/object:Gem::Version
64
- version: 1.7.4
68
+ version: 2.0.2
65
69
  type: :development
66
70
  prerelease: false
67
71
  version_requirements: !ruby/object:Gem::Requirement
68
72
  requirements:
69
73
  - - "~>"
70
74
  - !ruby/object:Gem::Version
71
- version: '1.7'
75
+ version: '2.0'
72
76
  - - ">="
73
77
  - !ruby/object:Gem::Version
74
- version: 1.7.4
78
+ version: 2.0.2
75
79
  description: Ruby CloudI API
76
80
  email: mjtruog@protonmail.com
77
81
  executables: []
@@ -100,8 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
104
  - !ruby/object:Gem::Version
101
105
  version: '0'
102
106
  requirements: []
103
- rubyforge_project:
104
- rubygems_version: 2.7.7
107
+ rubygems_version: 3.1.2
105
108
  signing_key:
106
109
  specification_version: 4
107
110
  summary: CloudI API
metadata.gz.sig CHANGED
Binary file