cloudi 1.7.4 → 2.0.2

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.
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