javonet-ruby-sdk 2.6.11 → 2.6.12

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 (129) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/javonet-ruby-sdk/Binaries/Jvm/JavonetJvmRuntime.jar +0 -0
  4. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetActivationService.so +0 -0
  5. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetCppRuntimeNative.so +0 -0
  6. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetGoRuntimeNative.so +0 -0
  7. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetJvmRuntimeNative.so +0 -0
  8. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetNetcoreRuntimeNative.so +0 -0
  9. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetPhpRuntimeNative.so +0 -0
  10. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetPythonRuntimeNative.so +0 -0
  11. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetRubyRuntimeNative.so +0 -0
  12. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libUtils.so +0 -0
  13. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/version.txt +1 -1
  14. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetActivationService.so +0 -0
  15. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetCppRuntimeNative.so +0 -0
  16. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetGoRuntimeNative.so +0 -0
  17. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetJvmRuntimeNative.so +0 -0
  18. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetNetcoreRuntimeNative.so +0 -0
  19. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetNodejsRuntimeNative.so +0 -0
  20. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetPerlRuntimeNative.so +0 -0
  21. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetPhpRuntimeNative.so +0 -0
  22. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetPython2RuntimeNative.so +0 -0
  23. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetPythonRuntimeNative.so +0 -0
  24. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetRubyRuntimeNative.so +0 -0
  25. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libUtils.so +0 -0
  26. data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/version.txt +1 -1
  27. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetActivationService.dylib +0 -0
  28. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetCppRuntimeNative.dylib +0 -0
  29. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetGoRuntimeNative.dylib +0 -0
  30. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetJvmRuntimeNative.dylib +0 -0
  31. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetNetcoreRuntimeNative.dylib +0 -0
  32. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetPythonRuntimeNative.dylib +0 -0
  33. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetRubyRuntimeNative.dylib +0 -0
  34. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libUtils.dylib +0 -0
  35. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/version.txt +1 -1
  36. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetActivationService.dylib +0 -0
  37. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetCppRuntimeNative.dylib +0 -0
  38. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetGoRuntimeNative.dylib +0 -0
  39. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetJvmRuntimeNative.dylib +0 -0
  40. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetNetcoreRuntimeNative.dylib +0 -0
  41. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetNodejs2218RuntimeNative.dylib +0 -0
  42. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetNodejsRuntimeNative.dylib +0 -0
  43. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetPerlRuntimeNative.dylib +0 -0
  44. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetPhpRuntimeNative.dylib +0 -0
  45. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetPythonRuntimeNative.dylib +0 -0
  46. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetRubyRuntimeNative.dylib +0 -0
  47. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libUtils.dylib +0 -0
  48. data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/version.txt +1 -1
  49. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/Configs.dll +0 -0
  50. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetActivationService.dll +0 -0
  51. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetCppRuntimeNative.dll +0 -0
  52. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetGoRuntimeNative.dll +0 -0
  53. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetJvmRuntimeNative.dll +0 -0
  54. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetNetcoreRuntimeNative.dll +0 -0
  55. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetPhpRuntimeNative.dll +0 -0
  56. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetPythonRuntimeNative.dll +0 -0
  57. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetRubyRuntimeNative.dll +0 -0
  58. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetTcpClient.dll +0 -0
  59. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetTcpTlsClient.dll +0 -0
  60. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/Utils.dll +0 -0
  61. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/version.txt +0 -0
  62. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/Configs.dll +0 -0
  63. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetActivationService.dll +0 -0
  64. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetClrRuntimeNative.dll +0 -0
  65. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetCppRuntimeNative.dll +0 -0
  66. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetGoRuntimeNative.dll +0 -0
  67. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetJvmRuntimeNative.dll +0 -0
  68. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetNetcoreRuntimeNative.dll +0 -0
  69. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetNodejs2218RuntimeNative.dll +0 -0
  70. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetNodejsRuntimeNative.dll +0 -0
  71. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetPerlRuntimeNative.dll +0 -0
  72. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetPhp848RuntimeNative.dll +0 -0
  73. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetPhpRuntimeNative.dll +0 -0
  74. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetPython2RuntimeNative.dll +0 -0
  75. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetPythonRuntimeNative.dll +0 -0
  76. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetRubyRuntimeNative.dll +0 -0
  77. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetTcpClient.dll +0 -0
  78. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetTcpTlsClient.dll +0 -0
  79. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/Utils.dll +0 -0
  80. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/version.txt +1 -1
  81. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/Configs.dll +0 -0
  82. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetActivationService.dll +0 -0
  83. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetClrRuntimeNative.dll +0 -0
  84. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetCppRuntimeNative.dll +0 -0
  85. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetGoRuntimeNative.dll +0 -0
  86. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetJvmRuntimeNative.dll +0 -0
  87. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetNetcoreRuntimeNative.dll +0 -0
  88. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetPhpRuntimeNative.dll +0 -0
  89. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetPython2RuntimeNative.dll +0 -0
  90. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetPythonRuntimeNative.dll +0 -0
  91. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetTcpClient.dll +0 -0
  92. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetTcpTlsClient.dll +0 -0
  93. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/Utils.dll +0 -0
  94. data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/version.txt +1 -1
  95. data/lib/javonet-ruby-sdk/Binaries/Netcore/Javonet.Netcore.Core.dll +0 -0
  96. data/lib/javonet-ruby-sdk/Binaries/Netcore/Javonet.Netcore.Plugins.dll +0 -0
  97. data/lib/javonet-ruby-sdk/Binaries/Netcore/Javonet.Netcore.Utils.dll +0 -0
  98. data/lib/javonet-ruby-sdk/Binaries/Nodejs/dist/sdk/InvocationContext.cjs +1 -11
  99. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Class/Load/XS/XS.so +0 -0
  100. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Data/UUID/UUID.so +0 -0
  101. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/FFI/Platypus/Platypus.so +0 -0
  102. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/List/Util/Util.so +0 -0
  103. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Moose/Moose.so +0 -0
  104. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/PPI/XS/XS.so +0 -0
  105. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Package/Stash/XS/XS.so +0 -0
  106. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Params/Util/Util.so +0 -0
  107. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Want/Want.so +0 -0
  108. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/share/dist/FFI-Platypus/lib/libplfill.so +0 -0
  109. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/perllocal.pod +93 -93
  110. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/lib/Javonet/Core/Exception/SdkExceptionHelper.pm +3 -3
  111. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/lib/Javonet/Core/Protocol/CommandDeserializer.pm +239 -183
  112. data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/lib/Javonet/Core/Protocol/CommandSerializer.pm +62 -51
  113. data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/Data/UUID/UUID.xs.dll +0 -0
  114. data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/PPI/XS/XS.xs.dll +0 -0
  115. data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/Scalar/Util/Numeric/Numeric.xs.dll +0 -0
  116. data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/Want/Want.xs.dll +0 -0
  117. data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/autobox/autobox.xs.dll +0 -0
  118. data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/perllocal.pod +25 -25
  119. data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/lib/Javonet/Core/Exception/SdkExceptionHelper.pm +3 -3
  120. data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/lib/Javonet/Core/Protocol/CommandDeserializer.pm +239 -183
  121. data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/lib/Javonet/Core/Protocol/CommandSerializer.pm +62 -51
  122. data/lib/javonet-ruby-sdk/Binaries/Php/javonet/core/webSocketClient/WebSocketClient.php +77 -35
  123. data/lib/javonet-ruby-sdk/Binaries/Python2/javonet/core/handler/ArrayGetItemHandler.py +3 -6
  124. data/lib/javonet-ruby-sdk/Binaries/Python2/javonet/core/handler/ArraySetItemHandler.py +24 -3
  125. data/lib/javonet-ruby-sdk/Binaries/Python2/javonet/core/protocol/CommandDeserializer.py +134 -196
  126. data/lib/javonet-ruby-sdk/Binaries/Python2/javonet/core/protocol/CommandSerializer.py +29 -29
  127. data/lib/javonet-ruby-sdk/Binaries/version.txt +1 -1
  128. data/lib/javonet-ruby-sdk/sdk/invocation_context.rb +12 -16
  129. metadata +2 -2
@@ -8,81 +8,92 @@ use aliased 'Javonet::Sdk::Core::RuntimeLib' => 'RuntimeLib', qw(get_runtime);
8
8
  use aliased 'Javonet::Sdk::Core::Type' => 'Type', qw(get_type);
9
9
  use aliased 'Javonet::Core::Protocol::TypeSerializer' => 'TypeSerializer';
10
10
  use aliased 'Javonet::Sdk::Core::TypesHandler' => 'TypesHandler';
11
+ use aliased 'Javonet::Core::Handler::ReferencesCache' => 'ReferencesCache';
12
+ use aliased 'Javonet::Sdk::Core::PerlCommandType' => 'PerlCommandType';
11
13
  use Javonet::Sdk::Internal::ConnectionType;
12
- use Thread::Queue;
13
14
 
14
15
  use Exporter qw(import);
15
- our @EXPORT = qw(serialize serialize_tcp_address serialize_recursively insert_into_buffer);
16
-
17
- my @byte_buffer = ();
18
- my $queue = Thread::Queue->new();
16
+ our @EXPORT = qw(serialize serialize_connection_data);
19
17
 
20
18
  sub serialize {
21
19
  my ($class, $root_command, $connection_type, $tcp_address, $runtimeVersion) = @_;
22
- @byte_buffer = ();
23
- $queue = Thread::Queue->new();
24
- $queue->insert(0, $root_command);
25
- $class->insert_into_buffer(($root_command->{runtime}, $runtimeVersion));
26
- $class->insert_into_buffer($class->serialize_tcp_address($connection_type, $tcp_address));
27
- $class->insert_into_buffer(Javonet::Sdk::Core::RuntimeLib::get_runtime('Perl'), $root_command->{command_type});
28
- $class->serialize_recursively();
20
+ $runtimeVersion = 0 unless defined $runtimeVersion;
21
+
22
+ # Local buffer instead of global
23
+ my @byte_buffer = ();
24
+
25
+ # Helper to insert data into buffer
26
+ my $insert_into_buffer = sub {
27
+ my (@data) = @_;
28
+ push @byte_buffer, @data;
29
+ };
30
+
31
+ # Write runtime and version
32
+ $insert_into_buffer->($root_command->{runtime}, $runtimeVersion);
33
+
34
+ # Write connection data
35
+ my @connection_data = $class->serialize_connection_data($connection_type, $tcp_address);
36
+ $insert_into_buffer->(@connection_data);
37
+
38
+ # Write runtime name and command type header for Perl runtime
39
+ $insert_into_buffer->(
40
+ Javonet::Sdk::Core::RuntimeLib::get_runtime('Perl'),
41
+ $root_command->{command_type}
42
+ );
43
+
44
+ # Serialize payload recursively
45
+ $class->serialize_recursively($root_command, $insert_into_buffer);
46
+
29
47
  return @byte_buffer;
30
48
  }
31
49
 
32
- sub serialize_tcp_address {
50
+ sub serialize_connection_data {
33
51
  my ($class, $connection_type, $tcp_address) = @_;
34
- my @tcp_byte_array;
35
- if (Javonet::Sdk::Internal::ConnectionType::get_connection_type('Tcp') eq $connection_type) {
52
+ if (defined $connection_type &&
53
+ Javonet::Sdk::Internal::ConnectionType::get_connection_type('Tcp') eq $connection_type) {
36
54
  my @tcp_array = split(':', $tcp_address);
37
55
  my @tcp_ip = split('\\.', $tcp_array[0]);
38
56
  my @bytes_port = unpack "C*", pack "v", $tcp_array[1];
39
- @tcp_byte_array = (Javonet::Sdk::Internal::ConnectionType::get_connection_type('Tcp'), @tcp_ip, @bytes_port);
40
- return @tcp_byte_array;
57
+ return (Javonet::Sdk::Internal::ConnectionType::get_connection_type('Tcp'), @tcp_ip, @bytes_port);
41
58
  }
42
59
  else {
43
- @tcp_byte_array = (Javonet::Sdk::Internal::ConnectionType::get_connection_type('InMemory'), 0, 0, 0, 0, 0, 0);
44
- return @tcp_byte_array;
60
+ return (Javonet::Sdk::Internal::ConnectionType::get_connection_type('InMemory'), 0, 0, 0, 0, 0, 0);
45
61
  }
46
62
  }
47
63
 
64
+ # Recursively serialize command payload - matches C# SerializeRecursively
48
65
  sub serialize_recursively {
49
- my ($class) = @_;
50
- my $left = $queue->pending();
51
- if ($left == 0) {
52
- return @byte_buffer;
53
- }
54
- my $command = $queue->dequeue();
55
- $queue->insert(0, $command->drop_first_payload_argument());
56
- my $current_payload_ref = $command->{payload};
57
- my @cur_payload = @$current_payload_ref;
58
- my $payload_len = @cur_payload;
59
- if ($payload_len > 0) {
60
- if (!defined $cur_payload[0]) {
61
- $class->insert_into_buffer(TypeSerializer->serializePrimitive(undef));
66
+ my ($class, $command, $insert_into_buffer) = @_;
67
+
68
+ my $payload_ref = $command->{payload};
69
+ my @payload = @$payload_ref;
70
+
71
+ foreach my $item (@payload) {
72
+ if (defined $item && ref $item eq 'Javonet::Sdk::Core::PerlCommand') {
73
+ # Item is a Command - serialize it and recurse
74
+ my @command_bytes = TypeSerializer->serializeCommand($item);
75
+ $insert_into_buffer->(@command_bytes);
76
+ $class->serialize_recursively($item, $insert_into_buffer);
62
77
  }
63
- elsif ($cur_payload[0]->isa("Javonet::Sdk::Core::PerlCommand")) {
64
- my $inner_command = $cur_payload[0];
65
- $class->insert_into_buffer(TypeSerializer->serializeCommand($inner_command));
66
- $queue->insert(0, $inner_command);
67
- }
68
- elsif (TypesHandler->is_primitive_or_none($cur_payload[0])) {
69
- my @result = TypeSerializer->serializePrimitive($cur_payload[0]);
70
- $class->insert_into_buffer(@result);
78
+ elsif (TypesHandler->is_primitive_or_none($item)) {
79
+ # Item is primitive or null
80
+ my @primitive_bytes = TypeSerializer->serializePrimitive($item);
81
+ $insert_into_buffer->(@primitive_bytes);
71
82
  }
72
83
  else {
73
- die "Unsupported payload item type: " . ref($cur_payload[0]) . " for payload item: $cur_payload[0].";
84
+ # Item is a reference - cache it and create a Reference command
85
+ my $reference_cache = ReferencesCache->new();
86
+ my $guid = $reference_cache->cache_reference($item);
87
+ my $reference_command = PerlCommand->new(
88
+ runtime => Javonet::Sdk::Core::RuntimeLib::get_runtime('Perl'),
89
+ command_type => PerlCommandType->get_command_type('Reference'),
90
+ payload => [$guid]
91
+ );
92
+ my @command_bytes = TypeSerializer->serializeCommand($reference_command);
93
+ $insert_into_buffer->(@command_bytes);
94
+ $class->serialize_recursively($reference_command, $insert_into_buffer);
74
95
  }
75
- return $class->serialize_recursively();
76
96
  }
77
- else {
78
- $queue->dequeue();
79
- }
80
- return $class->serialize_recursively();
81
- }
82
-
83
- sub insert_into_buffer {
84
- my ($class, @arguments) = @_;
85
- @byte_buffer = (@byte_buffer, @arguments);
86
97
  }
87
98
 
88
99
  1;
@@ -5,6 +5,7 @@ declare(strict_types=1);
5
5
  namespace core\webSocketClient;
6
6
 
7
7
  use RuntimeException;
8
+ use Throwable;
8
9
  use utils\Uri as URI;
9
10
 
10
11
  final class WebSocketClient
@@ -13,10 +14,9 @@ final class WebSocketClient
13
14
  private const UNSECURE_PORT_NUMBER = 80;
14
15
 
15
16
  /** @var resource|null */
16
- private $socket = null;
17
+ private $socket;
17
18
 
18
19
  private URI $uri;
19
- private bool $connected = false;
20
20
  private string $secKey;
21
21
 
22
22
  /** ---------- Static cache & helpers (mirror Ruby) ---------- */
@@ -73,7 +73,8 @@ final class WebSocketClient
73
73
  throw new RuntimeException('No response');
74
74
  }
75
75
  return $resp;
76
- } catch (\Throwable $e) {
76
+
77
+ } catch (Throwable $e) {
77
78
  self::closeClient($uri, true); // suppress close frame
78
79
  $client = self::addOrGetClient($uri);
79
80
  $client->sendByteArray($message);
@@ -98,7 +99,10 @@ final class WebSocketClient
98
99
  public static function getState(URI $uri): ?string
99
100
  {
100
101
  $key = self::uriKey($uri);
101
- if (!isset(self::$cache[$key])) return null;
102
+ if (!isset(self::$cache[$key])) {
103
+ return null;
104
+ }
105
+
102
106
  return self::$cache[$key]->open() ? 'OPEN' : 'CLOSED';
103
107
  }
104
108
 
@@ -111,7 +115,6 @@ final class WebSocketClient
111
115
 
112
116
  $this->socket = $this->openSocket();
113
117
  $this->performHandshake();
114
- $this->connected = true;
115
118
  }
116
119
 
117
120
  public function __destruct()
@@ -121,8 +124,11 @@ final class WebSocketClient
121
124
 
122
125
  public function open(): bool
123
126
  {
124
- if (!is_resource($this->socket)) return false;
127
+ if (!is_resource($this->socket)) {
128
+ return false;
129
+ }
125
130
  $meta = @stream_get_meta_data($this->socket);
131
+
126
132
  return is_array($meta) && !$meta['eof'];
127
133
  }
128
134
 
@@ -137,7 +143,6 @@ final class WebSocketClient
137
143
  @fwrite($this->socket, "\x88\x00");
138
144
  @fflush($this->socket);
139
145
  }
140
- $this->connected = false;
141
146
  @stream_socket_shutdown($this->socket, STREAM_SHUT_RDWR);
142
147
  @fclose($this->socket);
143
148
  }
@@ -146,7 +151,8 @@ final class WebSocketClient
146
151
 
147
152
  /** ---------- Core I/O ---------- */
148
153
 
149
- /** Send a binary message from an array of bytes (0..255) */
154
+ /** Send a binary message from an array of bytes (0..255)
155
+ */
150
156
  private function sendByteArray(array $message): void
151
157
  {
152
158
  if (!$this->open()) {
@@ -169,14 +175,17 @@ final class WebSocketClient
169
175
  * Receive a single complete message as array<int>. Returns null on timeout/close.
170
176
  * Handles fragmentation and control frames (ping/pong/close).
171
177
  */
172
- private function receiveByteArray(int $timeoutSec = 5): ?array
178
+ private function receiveByteArray(): ?array
173
179
  {
180
+ $timeoutSec = 5;
174
181
  $deadline = microtime(true) + $timeoutSec;
175
182
  $messagePayload = '';
176
183
 
177
184
  while (true) {
178
185
  $remaining = $deadline - microtime(true);
179
- if ($remaining <= 0) return null;
186
+ if ($remaining <= 0) {
187
+ return null;
188
+ }
180
189
 
181
190
  $read = [$this->socket];
182
191
  $write = $except = [];
@@ -236,11 +245,11 @@ final class WebSocketClient
236
245
  $hostHeader = $this->hostWithPort();
237
246
 
238
247
  $request =
239
- "GET {$path} HTTP/1.1\r\n" .
240
- "Host: {$hostHeader}\r\n" .
248
+ "GET $path HTTP/1.1\r\n" .
249
+ "Host: $hostHeader\r\n" .
241
250
  "Upgrade: websocket\r\n" .
242
251
  "Connection: Upgrade\r\n" .
243
- "Sec-WebSocket-Key: {$this->secKey}\r\n" .
252
+ "Sec-WebSocket-Key: $this->secKey\r\n" .
244
253
  "Sec-WebSocket-Version: 13\r\n\r\n";
245
254
 
246
255
  $this->writeAll($request);
@@ -265,7 +274,8 @@ final class WebSocketClient
265
274
  }
266
275
  }
267
276
 
268
- /** Build a masked client binary frame (handles any length) */
277
+ /** Build a masked client binary frame (handles any length)
278
+ */
269
279
  private function buildClientBinaryFrame(string $payload): string
270
280
  {
271
281
  $finOpcode = chr(0x80 | 0x2); // FIN + binary
@@ -282,8 +292,8 @@ final class WebSocketClient
282
292
  $header .= chr($maskBit | 126) . pack('n', $len);
283
293
  } else {
284
294
  // 64-bit network byte order using two 32-bit words
285
- $hi = (int) (($len & 0xFFFFFFFF00000000) >> 32);
286
- $lo = (int) ($len & 0x00000000FFFFFFFF);
295
+ $hi = ($len & 0xFFFFFFFF00000000) >> 32;
296
+ $lo = $len & 0x00000000FFFFFFFF;
287
297
  $header .= chr($maskBit | 127) . pack('N2', $hi, $lo);
288
298
  }
289
299
 
@@ -301,7 +311,9 @@ final class WebSocketClient
301
311
  private function readFrame(): ?array
302
312
  {
303
313
  $h = $this->readExact(2);
304
- if ($h === null) return null;
314
+ if ($h === null) {
315
+ return null;
316
+ }
305
317
 
306
318
  $arr = unpack('C2', $h);
307
319
  $b1 = $arr[1];
@@ -314,11 +326,15 @@ final class WebSocketClient
314
326
 
315
327
  if ($len === 126) {
316
328
  $ext = $this->readExact(2);
317
- if ($ext === null) return null;
329
+ if ($ext === null) {
330
+ return null;
331
+ }
318
332
  $len = current(unpack('n', $ext));
319
333
  } elseif ($len === 127) {
320
334
  $ext = $this->readExact(8);
321
- if ($ext === null) return null;
335
+ if ($ext === null) {
336
+ return null;
337
+ }
322
338
  $parts = unpack('N2', $ext);
323
339
  $hi = $parts[1];
324
340
  $lo = $parts[2];
@@ -329,11 +345,15 @@ final class WebSocketClient
329
345
  if ($masked) {
330
346
  // Servers should not mask; handle defensively
331
347
  $maskKey = $this->readExact(4);
332
- if ($maskKey === null) return null;
348
+ if ($maskKey === null) {
349
+ return null;
350
+ }
333
351
  }
334
352
 
335
353
  $payload = ($len > 0) ? ($this->readExact($len) ?? '') : '';
336
- if ($payload === '' && $len > 0) return null;
354
+ if ($payload === '' && $len > 0) {
355
+ return null;
356
+ }
337
357
 
338
358
  if ($masked) {
339
359
  $repeat = (int)ceil($len / 4);
@@ -347,6 +367,9 @@ final class WebSocketClient
347
367
  /** ---------- Low-level utilities ---------- */
348
368
 
349
369
  /** Open TCP/SSL socket; port taken from URI or defaulted by scheme like Ruby */
370
+ /**
371
+ * @return resource
372
+ */
350
373
  private function openSocket()
351
374
  {
352
375
  $host = $this->uri->getHost();
@@ -385,11 +408,12 @@ final class WebSocketClient
385
408
  );
386
409
 
387
410
  if ($socket === false) {
388
- throw new \RuntimeException(sprintf('Could not connect to %s:%d - %s (%d)', $host, $port, $errStr, $errNo));
411
+ throw new RuntimeException(sprintf('Could not connect to %s:%d - %s (%d)', $host, $port, $errStr, $errNo));
389
412
  }
390
413
 
391
414
  stream_set_blocking($socket, true);
392
415
  stream_set_timeout($socket, 5);
416
+
393
417
  return $socket;
394
418
  }
395
419
 
@@ -399,18 +423,26 @@ final class WebSocketClient
399
423
  $buf = '';
400
424
  while (strlen($buf) < $maxBytes) {
401
425
  $remaining = $deadline - microtime(true);
402
- if ($remaining <= 0) return null;
426
+ if ($remaining <= 0) {
427
+ return null;
428
+ }
403
429
 
404
430
  $read = [$this->socket];
405
431
  $write = $except = [];
406
432
  $sec = (int)$remaining;
407
433
  $usec = (int)(($remaining - $sec) * 1_000_000);
408
434
  $n = @stream_select($read, $write, $except, $sec, $usec);
409
- if ($n === false) return null;
410
- if ($n === 0) continue;
435
+ if ($n === false) {
436
+ return null;
437
+ }
438
+ if ($n === 0) {
439
+ continue;
440
+ }
411
441
 
412
442
  $chunk = @fread($this->socket, 1024);
413
- if ($chunk === '' || $chunk === false) break;
443
+ if ($chunk === '' || $chunk === false) {
444
+ break;
445
+ }
414
446
  $buf .= $chunk;
415
447
 
416
448
  if (strpos($buf, "\r\n\r\n") !== false) {
@@ -439,15 +471,23 @@ final class WebSocketClient
439
471
  $buf = '';
440
472
  while (strlen($buf) < $len) {
441
473
  $chunk = @fread($this->socket, $len - strlen($buf));
442
- if ($chunk === false) return null;
474
+ if ($chunk === false) {
475
+ return null;
476
+ }
443
477
  if ($chunk === '') {
444
478
  $meta = @stream_get_meta_data($this->socket);
445
- if (!$meta || $meta['eof']) return null;
479
+ if (!$meta || $meta['eof']) {
480
+ return null;
481
+ }
446
482
  // brief wait
447
483
  $r = [$this->socket]; $w = $e = [];
448
484
  $n = @stream_select($r, $w, $e, 1, 0);
449
- if ($n === 0) continue;
450
- if ($n === false) return null;
485
+ if ($n === 0) {
486
+ continue;
487
+ }
488
+ if ($n === false) {
489
+ return null;
490
+ }
451
491
  continue;
452
492
  }
453
493
  $buf .= $chunk;
@@ -465,12 +505,12 @@ final class WebSocketClient
465
505
  } elseif ($len <= 0xFFFF) {
466
506
  $hdr .= chr(0x00 | 126) . pack('n', $len);
467
507
  } else {
468
- $hi = (int) (($len & 0xFFFFFFFF00000000) >> 32);
469
- $lo = (int) ($len & 0x00000000FFFFFFFF);
508
+ $hi = ($len & 0xFFFFFFFF00000000) >> 32;
509
+ $lo = $len & 0x00000000FFFFFFFF;
470
510
  $hdr .= chr(0x00 | 127) . pack('N2', $hi, $lo);
471
511
  }
472
512
  $this->writeAll($hdr . $payload);
473
- } catch (\Throwable $e) {
513
+ } catch (Throwable $e) {
474
514
  // ignore
475
515
  }
476
516
  }
@@ -479,7 +519,7 @@ final class WebSocketClient
479
519
  {
480
520
  try {
481
521
  $this->writeAll("\x88\x00");
482
- } catch (\Throwable $e) {
522
+ } catch (Throwable $e) {
483
523
  // ignore
484
524
  }
485
525
  }
@@ -494,7 +534,9 @@ final class WebSocketClient
494
534
  private function resolvePort(): int
495
535
  {
496
536
  $p = $this->uri->getPort();
497
- if ($p !== null) return $p;
537
+ if ($p !== null) {
538
+ return $p;
539
+ }
498
540
  return $this->isSecure() ? self::SECURE_PORT_NUMBER : self::UNSECURE_PORT_NUMBER;
499
541
  }
500
542
 
@@ -4,8 +4,6 @@ The ArrayGetItemHandler class handles retrieving array elements.
4
4
  """
5
5
 
6
6
  from javonet.core.handler.AbstractCommandHandler import AbstractCommandHandler
7
- from javonet.utils.Command import Command
8
- from javonet.utils.CommandType import CommandType
9
7
  import sys
10
8
  import traceback
11
9
 
@@ -21,7 +19,6 @@ class ArrayGetItemHandler(AbstractCommandHandler):
21
19
  """
22
20
  self._required_parameters_count = 2
23
21
 
24
-
25
22
  def process(self, command):
26
23
  """
27
24
  Process the command.
@@ -35,11 +32,11 @@ class ArrayGetItemHandler(AbstractCommandHandler):
35
32
 
36
33
  array = command.payload[0]
37
34
  if isinstance(command.payload[1], list):
38
- indexes = command.payload[1]
35
+ indexes = [self.__extract_value(item) for item in command.payload[1]]
39
36
  else:
40
- indexes = command.payload[1:]
37
+ indexes = [self.__extract_value(item) for item in command.payload[1:]]
41
38
 
42
- array_copy = array[:] # W Pythonie 2 używamy slicingu zamiast copy()
39
+ array_copy = array[:] # In Python 2 we use slicing instead of copy()
43
40
  for i in indexes:
44
41
  array_copy = array_copy[i]
45
42
  return array_copy
@@ -4,6 +4,9 @@ The ArraySetItemHandler class handles setting array elements.
4
4
  """
5
5
 
6
6
  from javonet.core.handler.AbstractCommandHandler import AbstractCommandHandler
7
+ from javonet.core.handler.HandlerDictionary import handler_dict
8
+ from javonet.utils.Command import Command
9
+ from javonet.utils.CommandType import CommandType
7
10
  import sys
8
11
  import traceback
9
12
 
@@ -19,6 +22,24 @@ class ArraySetItemHandler(AbstractCommandHandler):
19
22
  """
20
23
  self._required_parameters_count = 3
21
24
 
25
+ @staticmethod
26
+ def __extract_value(item):
27
+ """
28
+ Extract the actual value from an item, handling Command objects.
29
+
30
+ :param item: Item that may be a Command or a value
31
+ :return: The actual value
32
+ """
33
+ if isinstance(item, Command):
34
+ if item.command_type == CommandType.Value:
35
+ return item.payload[0] if len(item.payload) > 0 else None
36
+ else:
37
+ handler = handler_dict.get(item.command_type)
38
+ if handler is not None:
39
+ return handler.handle_command(item)
40
+ return item
41
+ return item
42
+
22
43
  def process(self, command):
23
44
  """
24
45
  Handles the array element setting command.
@@ -32,11 +53,11 @@ class ArraySetItemHandler(AbstractCommandHandler):
32
53
 
33
54
  array = command.payload[0]
34
55
 
35
- value = command.payload[2]
56
+ value = self.__extract_value(command.payload[2])
36
57
  if isinstance(command.payload[1], list):
37
- indexes = command.payload[1]
58
+ indexes = [self.__extract_value(item) for item in command.payload[1]]
38
59
  else:
39
- indexes = [command.payload[1]]
60
+ indexes = [self.__extract_value(command.payload[1])]
40
61
 
41
62
  if isinstance(command.payload[0], dict):
42
63
  array[indexes[0]] = value