lbd_sdk 0.1.0

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.
@@ -0,0 +1,56 @@
1
+ require 'json'
2
+ require 'net/http'
3
+ require 'uri'
4
+
5
+ module LbdSdk
6
+ class HTTPClient
7
+ # @return [Hash]
8
+ attr_accessor :http_options
9
+
10
+ # Initialize a new HTTPClient
11
+ #
12
+ # @param http_options [Hash]
13
+ #
14
+ # @return [LbdSdk::HTTPClient]
15
+ def initialize(http_options = {})
16
+ @http_options = http_options
17
+ end
18
+
19
+ # @return [Net::HTTP]
20
+ def http(uri)
21
+ http = Net::HTTP.new(uri.host, uri.port)
22
+ if uri.scheme == 'https'
23
+ http.use_ssl = true
24
+ end
25
+
26
+ http_options&.each do |key, value|
27
+ http.send("#{key}=", value)
28
+ end
29
+
30
+ http
31
+ end
32
+
33
+ def get(url, header = {})
34
+ uri = URI(url)
35
+ http(uri).get(uri.request_uri, header)
36
+ end
37
+
38
+ def post(url, payload, header = {})
39
+ uri = URI(url)
40
+ http(uri).post(uri.request_uri, payload, header)
41
+ end
42
+
43
+ def put(url, payload, header = {})
44
+ uri = URI(url)
45
+ http(uri).put(uri.request_uri, payload, header)
46
+ end
47
+
48
+ def delete(url, payload = {}, header = {})
49
+ uri = URI(url)
50
+ http = http(uri)
51
+ request = Net::HTTP::Delete.new(uri.request_uri, header)
52
+ request.body = payload
53
+ http.request(request)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LbdSdk
4
+ class RequestBodyFlattener
5
+ def flatten(body = {})
6
+ if body.empty?
7
+ ''
8
+ else
9
+ body.sort.map { |key, value| flatten_key_value(key, value) }.join('&')
10
+ end
11
+ end
12
+
13
+ def flatten_key_value(key, value)
14
+ return "#{key}=#{value}" if value.is_a?(String)
15
+
16
+ if value.is_a?(Object)
17
+ l_key_value = {}
18
+ value.each.with_index do |elm, i|
19
+ (l_key_value.keys | elm.keys).each do |lkey|
20
+ l_value = ''
21
+ l_value = elm[lkey] if elm.keys.include?(lkey)
22
+ l_key_value[lkey] = if l_key_value.keys.include?(lkey)
23
+ "#{l_key_value[lkey]},#{l_value}"
24
+ else
25
+ "#{',' * i}#{l_value}"
26
+ end
27
+ end
28
+ end
29
+ l_key_value.sort.map { |lkey, lvalue| "#{key}.#{lkey}=#{lvalue}" }.join('&')
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LbdSdk
4
+ class RequestParamFlattener
5
+ def flatten(params = {})
6
+ params.empty? ? '' : params.map { |k, v| "#{k}=#{v}" }.join('&')
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+ require 'openssl'
5
+
6
+ module LbdSdk
7
+ class SignatureGenerator
8
+ def generate(secret:, method:, endpoint_path:, timestamp:, nonce:, query_params: {}, body: {})
9
+ sign_target = sign_target(
10
+ method: method,
11
+ endpoint_path: endpoint_path,
12
+ timestamp: timestamp,
13
+ nonce: nonce,
14
+ query_params: query_params.merge(body),
15
+ )
16
+
17
+ sign_target += LbdSdk::RequestParamFlattener.new.flatten(query_params) unless query_params.empty?
18
+
19
+ unless body.empty?
20
+ sign_target += if query_params.empty?
21
+ RequestBodyFlattener.new.flatten(body)
22
+ else
23
+ "&#{RequestBodyFlattener.new.flatten(body)}"
24
+ end
25
+ end
26
+
27
+ raw_hmac = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha512'), secret, sign_target)
28
+ Base64.strict_encode64(raw_hmac).strip
29
+ end
30
+
31
+ def sign_target(method:, endpoint_path:, timestamp:, nonce:, query_params: {})
32
+ result = "#{nonce}#{timestamp}#{method}#{endpoint_path}"
33
+ query_params.empty? ? result : "#{result}?"
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LbdSdk
4
+ VERSION = '0.1.0'
5
+ end
data/lib/lbd_sdk.rb ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lbd_sdk/version'
4
+ require 'lbd_sdk/client'
5
+ require 'lbd_sdk/http_client'
6
+ require 'lbd_sdk/signature_generator'
7
+ require 'lbd_sdk/request_param_flattener'
8
+ require 'lbd_sdk/request_body_flattener'
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lbd_sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - YuheiNakasaka
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-12-03 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: LINE Blockchain Developer SDK for Ruby. This SDK is not official LINE
14
+ SDK.
15
+ email:
16
+ - yuhei.nakasaka@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ".github/workflows/pull-request.yml"
22
+ - ".gitignore"
23
+ - ".rspec"
24
+ - ".rubocop.yml"
25
+ - ".travis.yml"
26
+ - ".vscode/settings.json"
27
+ - CHANGELOG.md
28
+ - CODE_OF_CONDUCT.md
29
+ - Gemfile
30
+ - Gemfile.lock
31
+ - LICENSE.txt
32
+ - README.md
33
+ - Rakefile
34
+ - bin/console
35
+ - bin/setup
36
+ - lbd_sdk.gemspec
37
+ - lib/lbd_sdk.rb
38
+ - lib/lbd_sdk/client.rb
39
+ - lib/lbd_sdk/http_client.rb
40
+ - lib/lbd_sdk/request_body_flattener.rb
41
+ - lib/lbd_sdk/request_param_flattener.rb
42
+ - lib/lbd_sdk/signature_generator.rb
43
+ - lib/lbd_sdk/version.rb
44
+ homepage: https://github.com/YuheiNakasaka/lbd_sdk_rb
45
+ licenses:
46
+ - MIT
47
+ metadata:
48
+ rubygems_mfa_required: 'true'
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 2.5.0
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubygems_version: 3.1.6
65
+ signing_key:
66
+ specification_version: 4
67
+ summary: Unofficial LINE Blockchain Developer SDK for Ruby
68
+ test_files: []