vox-etf 0.1.2 → 0.1.7
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/ext/vox/decoder.hpp +31 -4
- data/ext/vox/encoder.hpp +42 -12
- data/ext/vox/etf.cpp +0 -4
- data/ext/vox/extconf.rb +1 -1
- data/lib/vox/etf/version.rb +20 -1
- data/vox-etf.gemspec +0 -1
- metadata +2 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5a6a2cc3e5abff452aed1b87b83f3c9906fa673cdac9251b92051492d7de0ff2
|
|
4
|
+
data.tar.gz: 2caddaa1b5163345f676d9649c624e9ec2580e770d32dddecd2325800e9845d0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 56ff3b112058ec393869a0532905bad5f27adcd533a7427cacea86ffdbae49b261ca4a258dc33683af52bf0bce0c44fb6554a08b11d99a6c2a1c3862deb1ae8c
|
|
7
|
+
data.tar.gz: 96482eb0de9485c5938724b8d06d136028907ec99270a0bf46239d33b6313b1ad7207df021206099c11528f3dcbde8faeabdf0ba18f4cb007dad9061dc01f21c
|
data/ext/vox/decoder.hpp
CHANGED
|
@@ -4,6 +4,33 @@
|
|
|
4
4
|
#include "erlpack/sysdep.h"
|
|
5
5
|
#include "erlpack/constants.h"
|
|
6
6
|
|
|
7
|
+
/* This code is highly derivative of discord's erlpack decoder
|
|
8
|
+
* targeting Javascript.
|
|
9
|
+
*
|
|
10
|
+
*
|
|
11
|
+
* MIT License
|
|
12
|
+
*
|
|
13
|
+
* Copyright (c) 2017 Discord
|
|
14
|
+
*
|
|
15
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
16
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
17
|
+
* in the Software without restriction, including without limitation the rights
|
|
18
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
19
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
20
|
+
* furnished to do so, subject to the following conditions:
|
|
21
|
+
*
|
|
22
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
23
|
+
* copies or substantial portions of the Software.
|
|
24
|
+
*
|
|
25
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
26
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
27
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
28
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
29
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
30
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
31
|
+
* SOFTWARE.
|
|
32
|
+
*/
|
|
33
|
+
|
|
7
34
|
namespace etf
|
|
8
35
|
{
|
|
9
36
|
class decoder
|
|
@@ -131,12 +158,12 @@ namespace etf
|
|
|
131
158
|
return val;
|
|
132
159
|
}
|
|
133
160
|
|
|
134
|
-
VALUE decode_small_integer(
|
|
161
|
+
VALUE decode_small_integer()
|
|
135
162
|
{
|
|
136
163
|
return INT2FIX(read8());
|
|
137
164
|
}
|
|
138
165
|
|
|
139
|
-
VALUE decode_integer(
|
|
166
|
+
VALUE decode_integer()
|
|
140
167
|
{
|
|
141
168
|
return INT2NUM(read32());
|
|
142
169
|
}
|
|
@@ -335,9 +362,9 @@ namespace etf
|
|
|
335
362
|
{
|
|
336
363
|
const uint32_t decompressed_size = read32();
|
|
337
364
|
|
|
338
|
-
|
|
365
|
+
unsigned long source_size = decompressed_size;
|
|
339
366
|
uint8_t *out_buffer = (uint8_t *)malloc(decompressed_size);
|
|
340
|
-
const int ret = uncompress(out_buffer, &source_size, (const unsigned char *)(data + offset), (
|
|
367
|
+
const int ret = uncompress(out_buffer, &source_size, (const unsigned char *)(data + offset), (uLong)(size - offset));
|
|
341
368
|
|
|
342
369
|
offset += source_size;
|
|
343
370
|
if (ret != Z_OK)
|
data/ext/vox/encoder.hpp
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#include "erlpack/encoder.h"
|
|
2
2
|
#include "erlpack/constants.h"
|
|
3
3
|
#include "etf.hpp"
|
|
4
|
+
#include "ruby.h"
|
|
4
5
|
|
|
5
6
|
namespace etf
|
|
6
7
|
{
|
|
@@ -57,13 +58,23 @@ namespace etf
|
|
|
57
58
|
encode_hash(input);
|
|
58
59
|
break;
|
|
59
60
|
default:
|
|
60
|
-
|
|
61
|
+
if (rb_respond_to(input, rb_intern("to_hash")))
|
|
62
|
+
{
|
|
63
|
+
VALUE hash = rb_funcall(input, rb_intern("to_hash"), 0);
|
|
64
|
+
Check_Type(hash, T_HASH);
|
|
65
|
+
encode_hash(hash);
|
|
66
|
+
}
|
|
67
|
+
else
|
|
68
|
+
{
|
|
69
|
+
rb_raise(rb_eArgError, "Unsupported serialization type");
|
|
70
|
+
}
|
|
71
|
+
|
|
61
72
|
break;
|
|
62
73
|
}
|
|
63
74
|
}
|
|
64
75
|
|
|
65
76
|
VALUE
|
|
66
|
-
r_string(
|
|
77
|
+
r_string()
|
|
67
78
|
{
|
|
68
79
|
return rb_str_new(erl_buff->buf, erl_buff->length);
|
|
69
80
|
}
|
|
@@ -88,11 +99,11 @@ namespace etf
|
|
|
88
99
|
|
|
89
100
|
void encode_fixnum(VALUE fixnum)
|
|
90
101
|
{
|
|
91
|
-
|
|
92
|
-
if (
|
|
93
|
-
erlpack_append_small_integer(erl_buff, (
|
|
102
|
+
uint32_t n = NUM2UINT(fixnum);
|
|
103
|
+
if (n > 0 && n <= UINT8_MAX)
|
|
104
|
+
erlpack_append_small_integer(erl_buff, (uint8_t)n);
|
|
94
105
|
else
|
|
95
|
-
erlpack_append_integer(erl_buff,
|
|
106
|
+
erlpack_append_integer(erl_buff, n);
|
|
96
107
|
}
|
|
97
108
|
|
|
98
109
|
void encode_bignum(VALUE bignum)
|
|
@@ -127,18 +138,30 @@ namespace etf
|
|
|
127
138
|
|
|
128
139
|
void encode_array(VALUE array)
|
|
129
140
|
{
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
141
|
+
uint64_t size = RARRAY_LEN(array);
|
|
142
|
+
if (size == 0)
|
|
143
|
+
{
|
|
144
|
+
erlpack_append_nil_ext(erl_buff);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
else if (size > UINT32_MAX)
|
|
148
|
+
{
|
|
149
|
+
rb_raise(rb_eRangeError, "Array size is too large to fit into a 32 bit integer.");
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
erlpack_append_list_header(erl_buff, size);
|
|
154
|
+
for (size_t index = 0; index < size; index++)
|
|
133
155
|
{
|
|
134
156
|
encode_object(RARRAY_AREF(array, index));
|
|
135
157
|
}
|
|
158
|
+
|
|
159
|
+
erlpack_append_nil_ext(erl_buff);
|
|
136
160
|
}
|
|
137
161
|
|
|
138
162
|
void encode_symbol(VALUE symbol)
|
|
139
163
|
{
|
|
140
|
-
|
|
141
|
-
erlpack_append_atom_utf8(erl_buff, RSTRING_PTR(str), RSTRING_LEN(str));
|
|
164
|
+
encode_string(rb_sym2str(symbol));
|
|
142
165
|
}
|
|
143
166
|
|
|
144
167
|
void encode_string(VALUE string)
|
|
@@ -148,13 +171,20 @@ namespace etf
|
|
|
148
171
|
|
|
149
172
|
void encode_hash(VALUE hash)
|
|
150
173
|
{
|
|
151
|
-
|
|
174
|
+
uint64_t size = RHASH_SIZE(hash);
|
|
175
|
+
if (size > UINT32_MAX)
|
|
176
|
+
{
|
|
177
|
+
rb_raise(rb_eRangeError, "Hash size is too large to fit into a 32 bit integer");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
|
|
152
181
|
erlpack_append_map_header(erl_buff, size);
|
|
153
182
|
VALUE keys = rb_funcall(hash, rb_intern("keys"), 0);
|
|
154
183
|
|
|
155
184
|
for (uint32_t index = 0; index < size * 2; index += 2)
|
|
156
185
|
{
|
|
157
186
|
VALUE key = RARRAY_AREF(keys, index / 2);
|
|
187
|
+
// Normalize keys to strings because discord
|
|
158
188
|
encode_object(key);
|
|
159
189
|
encode_object(rb_hash_aref(hash, key));
|
|
160
190
|
}
|
data/ext/vox/etf.cpp
CHANGED
|
@@ -3,10 +3,6 @@
|
|
|
3
3
|
#include "decoder.hpp"
|
|
4
4
|
#include "etf.hpp"
|
|
5
5
|
|
|
6
|
-
// Decode an ETF term from a ruby string
|
|
7
|
-
// @param self [Object] Vox::ETF
|
|
8
|
-
// @param input [Rice::String] The ETF term to be decoded.
|
|
9
|
-
// @return [Rice::Object] Whatever the term is, as a ruby object.
|
|
10
6
|
VALUE decode(VALUE self, VALUE input)
|
|
11
7
|
{
|
|
12
8
|
Check_Type(input, T_STRING);
|
data/ext/vox/extconf.rb
CHANGED
data/lib/vox/etf/version.rb
CHANGED
|
@@ -1,7 +1,26 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# Container for Vox components.
|
|
3
4
|
module Vox
|
|
5
|
+
# Default ETF adapter for vox's gateway component.
|
|
4
6
|
module ETF
|
|
5
|
-
|
|
7
|
+
# @!parse [ruby]
|
|
8
|
+
# # Encode an object to an ETF term. This method accepts, `Integer`, `Float`,
|
|
9
|
+
# # `String`, `Symbol`, `Hash`, `Array`, `nil`, `true`, and `false` objects.
|
|
10
|
+
# # It also allows any object that responds to `#to_hash => Hash`.
|
|
11
|
+
# # @param input [Object, #to_hash] The object to be encoded as an ETF term.
|
|
12
|
+
# # @return [String] The ETF term encoded as a packed string.
|
|
13
|
+
# def self.encode(input)
|
|
14
|
+
# end
|
|
15
|
+
|
|
16
|
+
# @!parse [ruby]
|
|
17
|
+
# # Decode an ETF term from a string.
|
|
18
|
+
# # @param input [String] The ETF term to be decoded.
|
|
19
|
+
# # @return [Object] The ETF term decoded to an object.
|
|
20
|
+
# def self.decode(input)
|
|
21
|
+
# end
|
|
22
|
+
|
|
23
|
+
# Gem version
|
|
24
|
+
VERSION = '0.1.7'
|
|
6
25
|
end
|
|
7
26
|
end
|
data/vox-etf.gemspec
CHANGED
|
@@ -30,7 +30,6 @@ Gem::Specification.new do |spec|
|
|
|
30
30
|
spec.require_paths = ['lib']
|
|
31
31
|
spec.extensions << 'ext/vox/extconf.rb'
|
|
32
32
|
|
|
33
|
-
spec.add_dependency 'rice', '~> 2.2.0'
|
|
34
33
|
spec.add_development_dependency 'rake', '~> 12.3.3'
|
|
35
34
|
spec.add_development_dependency 'rake-compiler', '~> 1.1.1'
|
|
36
35
|
spec.add_development_dependency 'rspec', '~> 3.9.0'
|
metadata
CHANGED
|
@@ -1,29 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: vox-etf
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Matthew Carey
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-09-
|
|
11
|
+
date: 2020-09-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: rice
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - "~>"
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: 2.2.0
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - "~>"
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: 2.2.0
|
|
27
13
|
- !ruby/object:Gem::Dependency
|
|
28
14
|
name: rake
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|