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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/javonet-ruby-sdk/Binaries/Jvm/JavonetJvmRuntime.jar +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetActivationService.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetCppRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetGoRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetJvmRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetNetcoreRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetPhpRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetPythonRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libJavonetRubyRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/libUtils.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/ARM64/version.txt +1 -1
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetActivationService.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetCppRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetGoRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetJvmRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetNetcoreRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetNodejsRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetPerlRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetPhpRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetPython2RuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetPythonRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libJavonetRubyRuntimeNative.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/libUtils.so +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Linux/X64/version.txt +1 -1
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetActivationService.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetCppRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetGoRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetJvmRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetNetcoreRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetPythonRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libJavonetRubyRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/libUtils.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/ARM64/version.txt +1 -1
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetActivationService.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetCppRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetGoRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetJvmRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetNetcoreRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetNodejs2218RuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetNodejsRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetPerlRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetPhpRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetPythonRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libJavonetRubyRuntimeNative.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/libUtils.dylib +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/MacOs/X64/version.txt +1 -1
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/Configs.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetActivationService.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetCppRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetGoRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetJvmRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetNetcoreRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetPhpRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetPythonRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetRubyRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetTcpClient.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/JavonetTcpTlsClient.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/Utils.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/ARM64/version.txt +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/Configs.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetActivationService.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetClrRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetCppRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetGoRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetJvmRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetNetcoreRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetNodejs2218RuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetNodejsRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetPerlRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetPhp848RuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetPhpRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetPython2RuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetPythonRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetRubyRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetTcpClient.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/JavonetTcpTlsClient.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/Utils.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X64/version.txt +1 -1
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/Configs.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetActivationService.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetClrRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetCppRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetGoRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetJvmRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetNetcoreRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetPhpRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetPython2RuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetPythonRuntimeNative.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetTcpClient.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/JavonetTcpTlsClient.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/Utils.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Native/Windows/X86/version.txt +1 -1
- data/lib/javonet-ruby-sdk/Binaries/Netcore/Javonet.Netcore.Core.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Netcore/Javonet.Netcore.Plugins.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Netcore/Javonet.Netcore.Utils.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Nodejs/dist/sdk/InvocationContext.cjs +1 -11
- 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
- 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
- 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
- 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
- data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Moose/Moose.so +0 -0
- 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
- 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
- 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
- data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Want/Want.so +0 -0
- 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
- data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/perllocal.pod +93 -93
- data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/lib/Javonet/Core/Exception/SdkExceptionHelper.pm +3 -3
- data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/lib/Javonet/Core/Protocol/CommandDeserializer.pm +239 -183
- data/lib/javonet-ruby-sdk/Binaries/Perl/Linux/X64/lib/Javonet/Core/Protocol/CommandSerializer.pm +62 -51
- data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/Data/UUID/UUID.xs.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/PPI/XS/XS.xs.dll +0 -0
- 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
- data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/Want/Want.xs.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/autobox/autobox.xs.dll +0 -0
- data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/perllocal.pod +25 -25
- data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/lib/Javonet/Core/Exception/SdkExceptionHelper.pm +3 -3
- data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/lib/Javonet/Core/Protocol/CommandDeserializer.pm +239 -183
- data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/lib/Javonet/Core/Protocol/CommandSerializer.pm +62 -51
- data/lib/javonet-ruby-sdk/Binaries/Php/javonet/core/webSocketClient/WebSocketClient.php +77 -35
- data/lib/javonet-ruby-sdk/Binaries/Python2/javonet/core/handler/ArrayGetItemHandler.py +3 -6
- data/lib/javonet-ruby-sdk/Binaries/Python2/javonet/core/handler/ArraySetItemHandler.py +24 -3
- data/lib/javonet-ruby-sdk/Binaries/Python2/javonet/core/protocol/CommandDeserializer.py +134 -196
- data/lib/javonet-ruby-sdk/Binaries/Python2/javonet/core/protocol/CommandSerializer.py +29 -29
- data/lib/javonet-ruby-sdk/Binaries/version.txt +1 -1
- data/lib/javonet-ruby-sdk/sdk/invocation_context.rb +12 -16
- metadata +2 -2
data/lib/javonet-ruby-sdk/Binaries/Perl/Windows/X64/lib/Javonet/Core/Protocol/CommandSerializer.pm
CHANGED
|
@@ -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
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
$
|
|
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
|
|
50
|
+
sub serialize_connection_data {
|
|
33
51
|
my ($class, $connection_type, $tcp_address) = @_;
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
my $
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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 (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
$
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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]))
|
|
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))
|
|
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(
|
|
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)
|
|
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
|
|
240
|
-
"Host:
|
|
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:
|
|
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 = (
|
|
286
|
-
$lo =
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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
|
|
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)
|
|
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)
|
|
410
|
-
|
|
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)
|
|
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)
|
|
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'])
|
|
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)
|
|
450
|
-
|
|
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 = (
|
|
469
|
-
$lo =
|
|
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 (
|
|
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 (
|
|
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)
|
|
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[:] #
|
|
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
|