sequence-sdk 1.5.2 → 2.pre.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +2 -2
- data/lib/sequence/account.rb +31 -104
- data/lib/sequence/action.rb +15 -80
- data/lib/sequence/client.rb +24 -34
- data/lib/sequence/client_module.rb +0 -4
- data/lib/sequence/errors.rb +0 -4
- data/lib/sequence/feed.rb +28 -31
- data/lib/sequence/flavor.rb +29 -55
- data/lib/sequence/http_wrapper.rb +10 -13
- data/lib/sequence/key.rb +6 -36
- data/lib/sequence/page.rb +0 -6
- data/lib/sequence/query.rb +7 -20
- data/lib/sequence/session.rb +6 -45
- data/lib/sequence/stats.rb +9 -10
- data/lib/sequence/token.rb +24 -23
- data/lib/sequence/transaction.rb +84 -230
- data/lib/sequence/version.rb +1 -1
- metadata +131 -11
- data/lib/sequence/asset.rb +0 -119
- data/lib/sequence/balance.rb +0 -59
- data/lib/sequence/contract.rb +0 -104
- data/lib/sequence/validations.rb +0 -32
data/lib/sequence/errors.rb
CHANGED
@@ -45,12 +45,8 @@ module Sequence
|
|
45
45
|
:seq_code,
|
46
46
|
:temporary,
|
47
47
|
)
|
48
|
-
# Use {#seq_code} instead.
|
49
|
-
# @deprecated
|
50
|
-
attr_accessor :code
|
51
48
|
|
52
49
|
def initialize(body, response)
|
53
|
-
self.code = body['code']
|
54
50
|
self.chain_message = body['message']
|
55
51
|
self.detail = body['detail']
|
56
52
|
self.retriable = body['retriable']
|
data/lib/sequence/feed.rb
CHANGED
@@ -82,49 +82,46 @@ module Sequence
|
|
82
82
|
end
|
83
83
|
|
84
84
|
class ClientModule < Sequence::ClientModule
|
85
|
-
#
|
86
|
-
# @
|
87
|
-
# @
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
92
|
-
# will be interpolated into the filter expression.
|
85
|
+
# Create a feed.
|
86
|
+
# @param type [String] The type of the feed: "action" or "transaction".
|
87
|
+
# @param id [String] A unique id for the feed.
|
88
|
+
# @param filter [String] A valid filter string. The feed will be composed
|
89
|
+
# of items that match the filter.
|
90
|
+
# @param filter_params [Array<String|Integer>] A list of values that will
|
91
|
+
# be interpolated into the filter expression.
|
93
92
|
# @return [Feed] Newly created feed.
|
94
|
-
def create(
|
95
|
-
|
96
|
-
opts,
|
97
|
-
:id,
|
98
|
-
:type,
|
99
|
-
:filter,
|
100
|
-
:filter_params,
|
101
|
-
)
|
102
|
-
validate_required!(opts, :type)
|
103
|
-
if opts[:type] != 'action' && opts[:type] != 'transaction'
|
93
|
+
def create(type:, id: nil, filter: nil, filter_params: nil)
|
94
|
+
if type != 'action' && type != 'transaction'
|
104
95
|
raise ArgumentError, ':type must equal action or transaction'
|
105
96
|
end
|
106
|
-
Feed.new(
|
97
|
+
Feed.new(
|
98
|
+
client.session.request(
|
99
|
+
'create-feed',
|
100
|
+
id: id,
|
101
|
+
type: type,
|
102
|
+
filter: filter,
|
103
|
+
filter_params: filter_params,
|
104
|
+
),
|
105
|
+
client.session,
|
106
|
+
)
|
107
107
|
end
|
108
108
|
|
109
|
-
# Get
|
110
|
-
# @param [
|
111
|
-
# @option opts [String] id The unique ID of a feed.
|
109
|
+
# Get feed by id.
|
110
|
+
# @param id [String] The unique ID of a feed.
|
112
111
|
# @return [Feed] Requested feed object.
|
113
|
-
def get(
|
114
|
-
|
115
|
-
Feed.new(client.session.request('get-feed', opts), client.session)
|
112
|
+
def get(id:)
|
113
|
+
Feed.new(client.session.request('get-feed', id: id), client.session)
|
116
114
|
end
|
117
115
|
|
118
|
-
#
|
119
|
-
# @option
|
116
|
+
# Delete feed by id.
|
117
|
+
# @option id [String] The unique ID of a feed.
|
120
118
|
# @return [void]
|
121
|
-
def delete(
|
122
|
-
|
123
|
-
client.session.request('delete-feed', opts)
|
119
|
+
def delete(id:)
|
120
|
+
client.session.request('delete-feed', id: id)
|
124
121
|
nil
|
125
122
|
end
|
126
123
|
|
127
|
-
#
|
124
|
+
# Execute a query, returning an enumerable over individual feeds.
|
128
125
|
# @return [Query]
|
129
126
|
def list
|
130
127
|
Query.new(client)
|
data/lib/sequence/flavor.rb
CHANGED
@@ -11,7 +11,7 @@ module Sequence
|
|
11
11
|
# A type or class of value that can be tracked on a ledger.
|
12
12
|
class Flavor < ResponseObject
|
13
13
|
# @!attribute [r] id
|
14
|
-
# Unique
|
14
|
+
# Unique identifier of the flavor.
|
15
15
|
# @return [String]
|
16
16
|
attrib :id
|
17
17
|
|
@@ -21,13 +21,6 @@ module Sequence
|
|
21
21
|
# @return [Array<String>]
|
22
22
|
attrib(:key_ids)
|
23
23
|
|
24
|
-
# @!attribute [r] keys
|
25
|
-
# Deprecated. Use {#key_ids} instead.
|
26
|
-
# The set of keys used to sign transactions that issue tokens of the
|
27
|
-
# flavor.
|
28
|
-
# @return [Array<Key>]
|
29
|
-
attrib(:keys) { |raw| raw.map { |k| Key.new(k) } }
|
30
|
-
|
31
24
|
# @!attribute [r] quorum
|
32
25
|
# The number of keys required to sign transactions that issue tokens of
|
33
26
|
# the flavor.
|
@@ -39,74 +32,55 @@ module Sequence
|
|
39
32
|
# @return [Hash]
|
40
33
|
attrib :tags
|
41
34
|
|
42
|
-
# @deprecated Use {#key_ids} instead.
|
43
35
|
class Key < ResponseObject
|
44
36
|
attrib :id
|
45
37
|
end
|
46
38
|
|
47
39
|
class ClientModule < Sequence::ClientModule
|
48
|
-
#
|
49
|
-
# @param [
|
50
|
-
# Options hash
|
51
|
-
# @option opts [String] id
|
52
|
-
# Unique, user-specified identifier.
|
53
|
-
# @option opts [Array<String>] key_ids
|
40
|
+
# Create a new flavor in the ledger.
|
41
|
+
# @param key_ids [Array<String>]
|
54
42
|
# The set of key IDs used for signing transactions that issue tokens of
|
55
43
|
# the flavor.
|
56
|
-
# @
|
57
|
-
#
|
58
|
-
#
|
59
|
-
# flavor. A key can be either a key object, or a hash containing an
|
60
|
-
# `id` field.
|
61
|
-
# @option opts [Integer] quorum
|
44
|
+
# @param id [String]
|
45
|
+
# Unique identifier. Auto-generated if not specified.
|
46
|
+
# @param quorum [Integer]
|
62
47
|
# The number of keys required to sign transactions that issue tokens of
|
63
48
|
# the flavor. Defaults to the number of keys provided.
|
64
|
-
# @
|
49
|
+
# @param tags [Hash]
|
65
50
|
# User-specified key-value data describing the flavor.
|
66
51
|
# @return [Flavor]
|
67
|
-
def create(
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
52
|
+
def create(key_ids:, id: nil, quorum: nil, tags: nil)
|
53
|
+
raise ArgumentError, ':key_ids cannot be empty' if key_ids == []
|
54
|
+
Flavor.new(
|
55
|
+
client.session.request(
|
56
|
+
'create-flavor',
|
57
|
+
id: id,
|
58
|
+
key_ids: key_ids,
|
59
|
+
quorum: quorum,
|
60
|
+
tags: tags,
|
61
|
+
),
|
62
|
+
)
|
77
63
|
end
|
78
64
|
|
79
|
-
#
|
80
|
-
# @param [
|
81
|
-
# Options hash
|
82
|
-
# @option opts [String] id
|
65
|
+
# Update a flavor's tags.
|
66
|
+
# @param id [String]
|
83
67
|
# The ID of the flavor.
|
84
|
-
# @
|
68
|
+
# @param tags [Hash]
|
85
69
|
# A new set of tags, which will replace the existing tags.
|
86
70
|
# @return [void]
|
87
|
-
def update_tags(
|
88
|
-
|
89
|
-
|
90
|
-
raise ArgumentError, ':id must be provided'
|
91
|
-
end
|
92
|
-
client.session.request('update-flavor-tags', opts)
|
71
|
+
def update_tags(id:, tags: nil)
|
72
|
+
raise ArgumentError, ':id cannot be blank' if id == ''
|
73
|
+
client.session.request('update-flavor-tags', id: id, tags: tags)
|
93
74
|
end
|
94
75
|
|
95
|
-
#
|
96
|
-
# @param [
|
97
|
-
# Options hash
|
98
|
-
# @option opts [String] filter
|
76
|
+
# Execute a query, returning an enumerable over individual flavors.
|
77
|
+
# @param filter [String]
|
99
78
|
# A filter expression.
|
100
|
-
# @
|
79
|
+
# @param filter_params [Array<String|Integer>]
|
101
80
|
# A list of values that will be interpolated into the filter expression.
|
102
81
|
# @return [Query]
|
103
|
-
def list(
|
104
|
-
|
105
|
-
opts,
|
106
|
-
:filter,
|
107
|
-
:filter_params,
|
108
|
-
)
|
109
|
-
Query.new(client, opts)
|
82
|
+
def list(filter: nil, filter_params: nil)
|
83
|
+
Query.new(client, filter: filter, filter_params: filter_params)
|
110
84
|
end
|
111
85
|
end
|
112
86
|
|
@@ -26,13 +26,10 @@ module Sequence
|
|
26
26
|
Errno::ECONNREFUSED,
|
27
27
|
].freeze
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
def initialize(base_url, macaroon, opts = {})
|
29
|
+
def initialize(base_url, credential, opts = {})
|
32
30
|
@mutex = Mutex.new
|
33
31
|
@base_url = URI(base_url)
|
34
|
-
@
|
35
|
-
@dis_macaroon = nil
|
32
|
+
@credential = credential
|
36
33
|
@opts = opts
|
37
34
|
@connection = setup_connection
|
38
35
|
end
|
@@ -57,10 +54,7 @@ module Sequence
|
|
57
54
|
req['Idempotency-Key'] = idempotency_key
|
58
55
|
req['Name-Set'] = 'snake'
|
59
56
|
req['User-Agent'] = 'chain-sdk-ruby/' + Sequence::VERSION
|
60
|
-
|
61
|
-
req['Macaroon'] = @macaroon
|
62
|
-
req['Discharge-Macaroon'] = @dis_macaroon
|
63
|
-
end
|
57
|
+
req['Credential'] = @credential
|
64
58
|
if !@opts[:user].nil? && !@opts[:pass].nil?
|
65
59
|
req.basic_auth(@opts[:user], @opts[:pass])
|
66
60
|
end
|
@@ -132,10 +126,13 @@ module Sequence
|
|
132
126
|
|
133
127
|
# TLS configuration
|
134
128
|
connection.use_ssl = true
|
135
|
-
connection.verify_mode =
|
136
|
-
[
|
137
|
-
|
138
|
-
|
129
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
130
|
+
if ENV['SEQTLSVERIFYNONE']
|
131
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
132
|
+
end
|
133
|
+
if ENV['SEQTLSCA']
|
134
|
+
puts "setting ca_file #{ENV['SEQTLSCA']}"
|
135
|
+
connection.ca_file = ENV['SEQTLSCA']
|
139
136
|
end
|
140
137
|
|
141
138
|
# Timeout configuration
|
data/lib/sequence/key.rb
CHANGED
@@ -13,46 +13,16 @@ module Sequence
|
|
13
13
|
# @return [String]
|
14
14
|
attrib :id
|
15
15
|
|
16
|
-
# @!attribute [r] alias
|
17
|
-
# Deprecated. Use {#id} instead.
|
18
|
-
# Unique, user-specified identifier of the key.
|
19
|
-
# @return [String]
|
20
|
-
attrib :alias
|
21
|
-
|
22
16
|
class ClientModule < Sequence::ClientModule
|
23
|
-
#
|
24
|
-
# @param [
|
25
|
-
#
|
26
|
-
# @option opts [String] id
|
27
|
-
# Unique, user-specified identifier of the key.
|
28
|
-
# @option opts [String] alias
|
29
|
-
# Deprecated. Use :id instead.
|
30
|
-
# Unique, user-specified identifier of the key.
|
17
|
+
# Create a key.
|
18
|
+
# @param id [String]
|
19
|
+
# Unique identifier. Auto-generated if not specified.
|
31
20
|
# @return [Key]
|
32
|
-
def create(
|
33
|
-
|
34
|
-
Key.new(client.session.request('create-key', opts))
|
35
|
-
end
|
36
|
-
|
37
|
-
# @deprecated Use list instead.
|
38
|
-
# Executes a query, returning an enumerable over individual keys.
|
39
|
-
# @param [Hash] opts
|
40
|
-
# Options hash
|
41
|
-
# @option opts [Array<String>] aliases
|
42
|
-
# Deprecated. Use :ids instead.
|
43
|
-
# A list of aliases of keys to retrieve.
|
44
|
-
# @option opts [Array<String>] ids
|
45
|
-
# A list of ids of keys to retrieve.
|
46
|
-
# @option opts [Integer>] page_size
|
47
|
-
# Deprecated. Use list.page(size: size) instead.
|
48
|
-
# The number of items to return in the result set.
|
49
|
-
# @return [Query]
|
50
|
-
def query(opts = {})
|
51
|
-
validate_inclusion_of!(opts, :aliases, :ids, :page_size, :after)
|
52
|
-
Query.new(client, opts)
|
21
|
+
def create(id: nil)
|
22
|
+
Key.new(client.session.request('create-key', id: id))
|
53
23
|
end
|
54
24
|
|
55
|
-
#
|
25
|
+
# List all keys.
|
56
26
|
# Executes a query, returning an enumerable over individual keys.
|
57
27
|
# @return [Query]
|
58
28
|
def list
|
data/lib/sequence/page.rb
CHANGED
@@ -12,12 +12,6 @@ module Sequence
|
|
12
12
|
# @return [Array]
|
13
13
|
attrib :items
|
14
14
|
|
15
|
-
# @!attribute [r] next
|
16
|
-
# Deprecated. Use {#cursor} instead.
|
17
|
-
# Query object to request next page of items.
|
18
|
-
# @return [Hash]
|
19
|
-
attrib :next
|
20
|
-
|
21
15
|
# @!attribute [r] cursor
|
22
16
|
# String encoding the query object to request the next page of items.
|
23
17
|
# @return [String]
|
data/lib/sequence/query.rb
CHANGED
@@ -5,8 +5,6 @@ require_relative './page'
|
|
5
5
|
module Sequence
|
6
6
|
class Query
|
7
7
|
include ::Enumerable
|
8
|
-
include Sequence::Validations
|
9
|
-
|
10
8
|
# @private
|
11
9
|
# @return [Client]
|
12
10
|
attr_reader :client
|
@@ -44,24 +42,17 @@ module Sequence
|
|
44
42
|
raise NotImplementedError
|
45
43
|
end
|
46
44
|
|
47
|
-
|
48
|
-
# Deprecated: use
|
49
|
-
# {https://ruby-doc.org/core-2.5.0/Enumerable.html Enumerable}
|
50
|
-
# methods such as to_a instead.
|
51
|
-
# @deprecated
|
52
|
-
def all
|
53
|
-
to_a
|
54
|
-
end
|
45
|
+
alias all to_a
|
55
46
|
|
56
47
|
# @private
|
57
48
|
def pages
|
58
49
|
PageQuery.new(client, query, method(:fetch), method(:translate))
|
59
50
|
end
|
60
51
|
|
61
|
-
def page(
|
62
|
-
|
63
|
-
unless
|
64
|
-
opts[:page_size] =
|
52
|
+
def page(size: nil, cursor: nil)
|
53
|
+
opts = { size: size, cursor: cursor }
|
54
|
+
unless size.nil? || size.zero?
|
55
|
+
opts[:page_size] = size
|
65
56
|
end
|
66
57
|
@query = @query.merge(opts)
|
67
58
|
pages.page
|
@@ -83,8 +74,7 @@ module Sequence
|
|
83
74
|
|
84
75
|
loop do
|
85
76
|
page = Page.new(@fetch.call(@query), @translate)
|
86
|
-
@query = page.
|
87
|
-
|
77
|
+
@query = { cursor: page.cursor }
|
88
78
|
yield page
|
89
79
|
|
90
80
|
break if page.last_page
|
@@ -99,10 +89,7 @@ module Sequence
|
|
99
89
|
Page.new(@fetch.call(@query), @translate)
|
100
90
|
end
|
101
91
|
|
102
|
-
|
103
|
-
def all
|
104
|
-
to_a
|
105
|
-
end
|
92
|
+
alias all to_a
|
106
93
|
end
|
107
94
|
end
|
108
95
|
end
|
data/lib/sequence/session.rb
CHANGED
@@ -15,35 +15,15 @@ module Sequence
|
|
15
15
|
ArgumentError,
|
16
16
|
'missing ledger_name',
|
17
17
|
)
|
18
|
-
@
|
18
|
+
@credential = @opts[:credential] || raise(
|
19
19
|
ArgumentError,
|
20
20
|
'missing credential',
|
21
21
|
)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
@team_name = nil
|
28
|
-
|
29
|
-
# This can be used to avoid making an http request to get a
|
30
|
-
# new discharge macaroon.
|
31
|
-
@refresh_method = @opts[:refresh_method]
|
32
|
-
if @refresh_method
|
33
|
-
unless @refresh_method.respond_to?(:call)
|
34
|
-
raise ArgumentError, 'refresh_method is not a lambda'
|
35
|
-
end
|
36
|
-
if @refresh_method.arity != 1
|
37
|
-
raise(
|
38
|
-
ArgumentError,
|
39
|
-
'refresh_method must take 1 argument. (the macaroon)',
|
40
|
-
)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
addr = ENV['SEQADDR'] || 'api.seq.com'
|
45
|
-
@session_api = HttpWrapper.new('https://session-' + addr, nil)
|
46
|
-
@ledger_api = HttpWrapper.new('https://' + addr, @macaroon, @opts)
|
22
|
+
@team_name = @opts[:team_name] || raise(
|
23
|
+
ArgumentError,
|
24
|
+
'missing team_name',
|
25
|
+
)
|
26
|
+
@ledger_api = HttpWrapper.new('https://' + @opts[:addr], @credential, @opts)
|
47
27
|
end
|
48
28
|
|
49
29
|
def dup
|
@@ -55,7 +35,6 @@ module Sequence
|
|
55
35
|
end
|
56
36
|
|
57
37
|
def request_full_resp(id, path, body = {})
|
58
|
-
refresh!(id)
|
59
38
|
id ||= SecureRandom.hex(10)
|
60
39
|
@ledger_api.post(id, ledger_url(path), body) do |response|
|
61
40
|
# require that the response contains the Chain-Request-ID
|
@@ -77,23 +56,5 @@ module Sequence
|
|
77
56
|
path = path[1..-1] if path.start_with?('/')
|
78
57
|
"/#{@team_name}/#{@ledger}/#{path}"
|
79
58
|
end
|
80
|
-
|
81
|
-
def refresh!(id)
|
82
|
-
return if @refresh_at > Time.now.to_i
|
83
|
-
|
84
|
-
if @refresh_method
|
85
|
-
result = @refresh_method.call(@macaroon)
|
86
|
-
else
|
87
|
-
result = @session_api.post(
|
88
|
-
id,
|
89
|
-
'/sessions/validate',
|
90
|
-
macaroon: @macaroon,
|
91
|
-
)[:parsed_body]
|
92
|
-
end
|
93
|
-
|
94
|
-
@team_name = result['team_name']
|
95
|
-
@refresh_at = Integer(result['refresh_at'])
|
96
|
-
@ledger_api.dis_macaroon = result['refresh_token']
|
97
|
-
end
|
98
59
|
end
|
99
60
|
end
|