lnd-client 0.0.5 → 0.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8858aaa4661fcc83da3c661a1b05d9be7d8513eeda78ace138f9d92948e345df
4
- data.tar.gz: 8006682ff281b1fc745562deb2a58a464c9a09a4c47b564c2db67819fe8224bc
3
+ metadata.gz: e3c3a8851f40cb71b9075f722a806978f768fa926146a9750d2ff0c7461217a5
4
+ data.tar.gz: 6fc8f6d36aace0307ffb55c8aee7306b6d1bd7686fb19ed0704c19c581b310b1
5
5
  SHA512:
6
- metadata.gz: 41b85876608369aa56185424294a7c10e5a39938ceba028bc8326312adbe23d51c285a074eff5b3f5646b541c60673c00c27508674dc3beff88184a8eca2fdc2
7
- data.tar.gz: 57df549dcc4b4c63c5a0f873393cc731e1242e2abddd030c95d64e16bb330998d26343061993b9ffa14c51a29e7181829a64453d82b6804254c0ff10d41cf1ad
6
+ metadata.gz: 720da4b7e719632c509f93716924cd42aaef5f57b2b98005800dbea93f569d966328d2d6370f18eef3a164ceab21cdab62944c9efe683beb77f6ca424eaa115a
7
+ data.tar.gz: 2c8d5ab9896089e02ee7e9badd1bd2b5c158ed9515542db74c87f5543303e27b0d0b06a28362944396f598629c7ce64fc73bcf38f4a88e7cb5fb95cee9bf42ba
data/.env.example ADDED
@@ -0,0 +1 @@
1
+ LND_CLIENT_DELETE_UNUSED_TEST_DATA=false
@@ -0,0 +1,39 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+
6
+ # GitHub recommends pinning actions to a commit SHA.
7
+ # To get a newer version, you will need to update the SHA.
8
+ # You can also reference a tag or branch, but the action may change without warning.
9
+
10
+ name: RSpec Tests
11
+
12
+ on:
13
+ push:
14
+ branches: [ main ]
15
+ pull_request:
16
+ branches: [ main ]
17
+
18
+ jobs:
19
+ rspec:
20
+
21
+ runs-on: ubuntu-latest
22
+
23
+ steps:
24
+ - uses: actions/checkout@v3
25
+ - uses: actions/cache@v3
26
+ with:
27
+ path: vendor/bundle
28
+ key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
29
+ restore-keys: |
30
+ ${{ runner.os }}-gems-
31
+ - name: Set up Ruby
32
+ uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108
33
+ with:
34
+ ruby-version: '3.0.0'
35
+ bundler-cache: true
36
+ - name: Install Dependencies
37
+ run: bundle install
38
+ - name: Run RSpec Tests
39
+ run: bundle exec rspec
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  *.gem
2
+ .env
2
3
  temp/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.rubocop.yml CHANGED
@@ -12,4 +12,6 @@ Naming/FileName:
12
12
  Exclude:
13
13
  - 'ports/dsl/lnd-client.rb'
14
14
 
15
- require: rubocop-rake
15
+ require:
16
+ - rubocop-rake
17
+ - rubocop-rspec
data/Gemfile CHANGED
@@ -5,7 +5,14 @@ source 'https://rubygems.org'
5
5
  gemspec
6
6
 
7
7
  group :test, :development do
8
+ gem 'babosa', '~> 2.0'
9
+ gem 'dotenv', '~> 2.8', '>= 2.8.1'
8
10
  gem 'pry-byebug', '~> 3.10', '>= 3.10.1'
9
- gem 'rubocop', '~> 1.45', '>= 1.45.1'
11
+ gem 'rainbow', '~> 3.1', '>= 3.1.1'
12
+ gem 'rake', '~> 13.0', '>= 13.0.6'
13
+ gem 'rspec', '~> 3.12'
14
+ gem 'rubocop', '~> 1.48'
10
15
  gem 'rubocop-rake', '~> 0.6.0'
16
+ gem 'rubocop-rspec', '~> 2.19'
17
+ gem 'ruby-progressbar', '~> 1.8', '>= 1.8.1'
11
18
  end
data/Gemfile.lock CHANGED
@@ -1,16 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lnd-client (0.0.5)
4
+ lnd-client (0.0.7)
5
5
  grpc (~> 1.52)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
10
  ast (2.4.2)
11
+ babosa (2.0.0)
11
12
  byebug (11.1.3)
12
13
  coderay (1.1.3)
13
- google-protobuf (3.21.12)
14
+ diff-lcs (1.5.0)
15
+ dotenv (2.8.1)
16
+ google-protobuf (3.22.2-x86_64-linux)
14
17
  googleapis-common-protos-types (1.5.0)
15
18
  google-protobuf (~> 3.14)
16
19
  grpc (1.52.0-x86_64-linux)
@@ -19,7 +22,7 @@ GEM
19
22
  json (2.6.3)
20
23
  method_source (1.0.0)
21
24
  parallel (1.22.1)
22
- parser (3.2.1.0)
25
+ parser (3.2.1.1)
23
26
  ast (~> 2.4.1)
24
27
  pry (0.14.2)
25
28
  coderay (~> 1.1)
@@ -28,33 +31,59 @@ GEM
28
31
  byebug (~> 11.0)
29
32
  pry (>= 0.13, < 0.15)
30
33
  rainbow (3.1.1)
34
+ rake (13.0.6)
31
35
  regexp_parser (2.7.0)
32
36
  rexml (3.2.5)
33
- rubocop (1.45.1)
37
+ rspec (3.12.0)
38
+ rspec-core (~> 3.12.0)
39
+ rspec-expectations (~> 3.12.0)
40
+ rspec-mocks (~> 3.12.0)
41
+ rspec-core (3.12.1)
42
+ rspec-support (~> 3.12.0)
43
+ rspec-expectations (3.12.2)
44
+ diff-lcs (>= 1.2.0, < 2.0)
45
+ rspec-support (~> 3.12.0)
46
+ rspec-mocks (3.12.4)
47
+ diff-lcs (>= 1.2.0, < 2.0)
48
+ rspec-support (~> 3.12.0)
49
+ rspec-support (3.12.0)
50
+ rubocop (1.48.1)
34
51
  json (~> 2.3)
35
52
  parallel (~> 1.10)
36
53
  parser (>= 3.2.0.0)
37
54
  rainbow (>= 2.2.2, < 4.0)
38
55
  regexp_parser (>= 1.8, < 3.0)
39
56
  rexml (>= 3.2.5, < 4.0)
40
- rubocop-ast (>= 1.24.1, < 2.0)
57
+ rubocop-ast (>= 1.26.0, < 2.0)
41
58
  ruby-progressbar (~> 1.7)
42
59
  unicode-display_width (>= 2.4.0, < 3.0)
43
- rubocop-ast (1.26.0)
60
+ rubocop-ast (1.27.0)
44
61
  parser (>= 3.2.1.0)
62
+ rubocop-capybara (2.17.1)
63
+ rubocop (~> 1.41)
45
64
  rubocop-rake (0.6.0)
46
65
  rubocop (~> 1.0)
47
- ruby-progressbar (1.11.0)
66
+ rubocop-rspec (2.19.0)
67
+ rubocop (~> 1.33)
68
+ rubocop-capybara (~> 2.17)
69
+ ruby-progressbar (1.13.0)
48
70
  unicode-display_width (2.4.2)
49
71
 
50
72
  PLATFORMS
51
73
  x86_64-linux
52
74
 
53
75
  DEPENDENCIES
76
+ babosa (~> 2.0)
77
+ dotenv (~> 2.8, >= 2.8.1)
54
78
  lnd-client!
55
79
  pry-byebug (~> 3.10, >= 3.10.1)
56
- rubocop (~> 1.45, >= 1.45.1)
80
+ rainbow (~> 3.1, >= 3.1.1)
81
+ rake (~> 13.0, >= 13.0.6)
82
+ rspec (~> 3.12)
83
+ rubocop (~> 1.48)
57
84
  rubocop-rake (~> 0.6.0)
85
+ rubocop-rspec (~> 2.19)
86
+ ruby-progressbar (~> 1.8, >= 1.8.1)
58
87
 
59
88
  BUNDLED WITH
60
89
  2.4.4
data/README.md CHANGED
@@ -1,14 +1,14 @@
1
- # Ruby _Lightning Network Daemon_ Client
1
+ # lnd-client [![Gem Version](https://badge.fury.io/rb/lnd-client.svg)](https://badge.fury.io/rb/lnd-client) ![RSpec Tests Status](https://github.com/icebaker/lnd-client/actions/workflows/ruby-rspec-tests.yml/badge.svg)
2
2
 
3
- > ⚠️ Warning: Early-stage, breaking changes are expected.
3
+ Ruby Lightning Network Daemon Client: Straightforward access to [lnd](https://github.com/lightningnetwork/lnd) [gRPC API](https://lightning.engineering/api-docs/api/lnd/#grpc)
4
4
 
5
5
  This is a low-level client library. For a better experience, you may want to check out the [Lighstorm](https://github.com/icebaker/lighstorm) abstraction.
6
6
 
7
7
  - [Usage](#usage)
8
- - [Channel Arguments](#channel-arguments)
9
- - [Documentation](#documentation)
8
+ - [Documentation](https://icebaker.github.io/lnd-client)
10
9
  - [Development](#development)
11
10
  - [Upgrading gRPC Proto Files](#upgrading-grpc-proto-files)
11
+ - [Generating Documentation](#generating-documentation)
12
12
  - [Publish to RubyGems](#publish-to-rubygems)
13
13
 
14
14
  ## Usage
@@ -16,29 +16,30 @@ This is a low-level client library. For a better experience, you may want to che
16
16
  Add to your `Gemfile`:
17
17
 
18
18
  ```ruby
19
- gem 'lnd-client', '~> 0.0.5'
19
+ gem 'lnd-client', '~> 0.0.7'
20
20
  ```
21
21
 
22
22
  ```ruby
23
23
  require 'lnd-client'
24
24
 
25
- puts LNDClient.version # => 0.0.5
25
+ puts LNDClient.version # => 0.0.7
26
26
 
27
27
  client = LNDClient.new(
28
- certificate_path: '/lnd/tls.cert',
29
- macaroon_path: '/lnd/data/chain/bitcoin/mainnet/admin.macaroon',
30
- socket_address: '127.0.0.1:10009'
28
+ 'lndconnect://127.0.0.1:10009?cert=MIICJz...JBEERQ&macaroon=AgEDbG...45ukJ4'
31
29
  )
32
30
 
33
31
  client.lightning.wallet_balance.total_balance # => 101527
34
32
 
35
33
  client.lightning.wallet_balance.to_h # =>
36
- # {:total_balance=>101527,
37
- # :confirmed_balance=>101527,
38
- # :unconfirmed_balance=>0,
39
- # :locked_balance=>0,
40
- # :reserved_balance_anchor_chan=>20000,
41
- # :account_balance=>{"default"=>{:confirmed_balance=>101527, :unconfirmed_balance=>0}}}
34
+ # { total_balance: 101_527,
35
+ # confirmed_balance: 101_527,
36
+ # unconfirmed_balance: 0,
37
+ # locked_balance: 0,
38
+ # reserved_balance_anchor_chan: 20_000,
39
+ # account_balance: {
40
+ # 'default' => {
41
+ # confirmed_balance: 101_527,
42
+ # unconfirmed_balance: 0 } } }
42
43
 
43
44
  client.lightning.get_node_info(
44
45
  pub_key: '02d3c80335a8ccb2ed364c06875f32240f36f7edb37d80f8dbe321b4c364b6e997'
@@ -53,74 +54,12 @@ client.router.subscribe_htlc_events do |data|
53
54
  end
54
55
  ```
55
56
 
56
- ### Channel Arguments
57
-
58
- ```ruby
59
- require 'lnd-client'
60
-
61
- puts LNDClient.version # => 0.0.5
62
-
63
- client = LNDClient.new(
64
- certificate_path: '/lnd/tls.cert',
65
- macaroon_path: '/lnd/data/chain/bitcoin/mainnet/admin.macaroon',
66
- socket_address: '127.0.0.1:10009'
67
- )
68
-
69
- client.lightning(
70
- channel_args: { 'grpc.max_receive_message_length' => 1024 * 1024 * 50 }
71
- )
72
-
73
- graph = client.lightning.describe_graph
74
-
75
- graph.nodes # => [...]
76
- graph.edges # => [...]
77
- ```
78
-
79
- ### Documentation
80
-
81
- ```ruby
82
- require 'lnd-client'
83
-
84
- puts LNDClient.version # => 0.0.5
85
-
86
- client = LNDClient.new(
87
- certificate_path: '/lnd/tls.cert',
88
- macaroon_path: '/lnd/data/chain/bitcoin/mainnet/admin.macaroon',
89
- socket_address: '127.0.0.1:10009'
90
- )
91
-
92
- client.doc.services # => ['lightning', 'router']
93
-
94
- client.lightning.doc.available_methods # =>
95
- # ['abandon_channel',
96
- # 'add_invoice',
97
- # 'bake_macaroon',
98
- # 'batch_open_channel',
99
- # 'channel_acceptor',
100
- # 'channel_balance',
101
- # 'check_macaroon_permissions',
102
- # 'close_channel',
103
- # 'closed_channels',
104
- # # ...
105
- # 'get_node_info'
106
- # ]
107
-
108
- client.lightning.doc.describe(:get_node_info) # =>
109
- # { method: 'get_node_info',
110
- # input: { pub_key: '', include_channels: false},
111
- # output: { node: nil, num_channels: 0, total_capacity: 0, channels: []}}
112
-
113
- client.lightning.doc.grpc(:get_node_info)
114
- # #<struct GRPC::RpcDesc
115
- # name=:GetNodeInfo,
116
- # input=Lnrpc::NodeInfoRequest,
117
- # output=Lnrpc::NodeInfo,
118
- # marshal_method=:encode,
119
- # unmarshal_method=:decode>
120
- ```
57
+ Check the [full documentation](https://icebaker.github.io/lnd-client).
121
58
 
122
59
  ## Development
123
60
 
61
+ Copy the `.env.example` file to `.env` and provide the required data.
62
+
124
63
  ```ruby
125
64
  # Gemfile
126
65
  gem 'lnd-client', path: '/home/user/lnd-client'
@@ -141,6 +80,17 @@ rubocop -A
141
80
  ```sh
142
81
  bundle exec rake grpc:upgrade
143
82
  ```
83
+
84
+ ### Generating Documentation
85
+
86
+ ```sh
87
+ bundle exec rake grpc:docs
88
+
89
+ npm i docsify-cli -g
90
+
91
+ docsify serve ./docs
92
+ ```
93
+
144
94
  ### Publish to RubyGems
145
95
 
146
96
  ```sh
@@ -148,5 +98,5 @@ gem build lnd-client.gemspec
148
98
 
149
99
  gem signin
150
100
 
151
- gem push lnd-client-0.0.5.gem
101
+ gem push lnd-client-0.0.7.gem
152
102
  ```
data/Rakefile CHANGED
@@ -1,8 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative './controllers/documentation'
3
4
  require_relative './controllers/grpc_generator'
4
5
 
5
6
  namespace :grpc do
7
+ desc 'Generate gRPC Documentation'
8
+ task :docs do
9
+ require 'ruby-progressbar'
10
+ LNDClientInternal::DocumentationController.generate!
11
+ end
12
+
6
13
  desc 'Upgrade lnd Protocol Buffers for gGRPC'
7
14
  task :upgrade do
8
15
  LNDClientInternal::GrpcGeneratorController.upgrade!
@@ -1,19 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../components/grpc'
4
- require_relative 'config'
4
+
5
5
  require_relative 'service'
6
6
 
7
7
  module LNDClientInternal
8
8
  class ClientController
9
- attr_reader :config, :doc
9
+ attr_reader :connection, :doc
10
10
 
11
- def initialize(options)
12
- @config = LNDClientInternal::ConfigController.new(self, options)
11
+ def initialize(connection)
12
+ @connection = connection
13
13
  @services = {}
14
14
 
15
15
  doc = Struct.new(:services)
16
16
  @doc = doc.new(LNDClientInternal::GRPC::SERVICES.keys.map(&:to_s))
17
+
18
+ lightning(**connection[:lightning]) if connection[:lightning]
17
19
  end
18
20
 
19
21
  def respond_to_missing?(method_name, include_private = false)
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+ require 'base64'
5
+ require 'singleton'
6
+
7
+ require 'grpc'
8
+
9
+ require_relative '../models/errors'
10
+
11
+ module LNDClientInternal
12
+ class Connection
13
+ def self.validate_params!(connection)
14
+ if connection.key?(:address) && !connection[:address].nil? && connection.key?(:host) && connection[:host].nil?
15
+ raise LNDClient::Errors::TooManyArgumentsError
16
+ end
17
+
18
+ if connection.key?(:address) && !connection[:address].nil? && connection.key?(:port) && !connection[:port].nil?
19
+ raise LNDClient::Errors::TooManyArgumentsError
20
+ end
21
+
22
+ if connection.key?(:certificate_path) && !connection[:certificate_path].nil? && connection.key?(:certificate) && !connection[:certificate].nil?
23
+ raise LNDClient::Errors::TooManyArgumentsError
24
+ end
25
+
26
+ if connection.key?(:macaroon_path) && !connection[:macaroon_path].nil? && connection.key?(:macaroon) && !connection[:macaroon].nil?
27
+ raise LNDClient::Errors::TooManyArgumentsError
28
+ end
29
+ end
30
+
31
+ def self.expand(*params, &vcr)
32
+ connection = if is_lndconnect?(*params)
33
+ exapand_lndconnect(*params)
34
+ else
35
+ params.first
36
+ end
37
+
38
+ validate_params!(connection)
39
+
40
+ connection[:certificate] = load_file(connection[:certificate_path], &vcr) if connection[:certificate_path]
41
+
42
+ connection[:macaroon] = load_file(connection[:macaroon_path], &vcr) if connection[:macaroon_path]
43
+
44
+ if !connection.key?(:address) && connection.key?(:host) && connection.key?(:port)
45
+ connection[:address] = "#{connection[:host]}:#{connection[:port]}"
46
+ elsif !connection.key?(:address)
47
+ raise LNDClient::Errors::ArgumentError, 'missing :address or :host + :port'
48
+ end
49
+
50
+ connection[:certificate] = decode_certificate(connection[:certificate])
51
+ connection[:macaroon] = decode_macaroon(connection[:macaroon])
52
+
53
+ if params.is_a?(Array)
54
+ params.each do |param|
55
+ connection[:lightning] = param[:lightning] if param.is_a?(Hash) && param.key?(:lightning)
56
+ end
57
+ end
58
+
59
+ connection
60
+ end
61
+
62
+ def self.decode_macaroon(macaroon)
63
+ if !macaroon.dup.force_encoding(Encoding::UTF_8).valid_encoding?
64
+ macaroon.unpack1('H*')
65
+ elsif hex?(macaroon)
66
+ macaroon
67
+ elsif base64?(macaroon)
68
+ Base64.decode64(macaroon).unpack1('H*')
69
+ end
70
+ end
71
+
72
+ def self.decode_certificate(certificate)
73
+ if hex?(certificate)
74
+ [certificate].pack('H*')
75
+ elsif base64?(certificate)
76
+ Base64.decode64(certificate)
77
+ else
78
+ certificate
79
+ end
80
+ end
81
+
82
+ def self.base64?(value)
83
+ (value.length % 4).zero? && value.match(%r{\A[A-Za-z0-9+/]+={0,3}\z})
84
+ end
85
+
86
+ def self.hex?(value)
87
+ value.match(/\A[\da-fA-F]+\z/)
88
+ end
89
+
90
+ def self.exapand_lndconnect(*params)
91
+ parsed_uri = URI.parse(params.first)
92
+ host = parsed_uri.host
93
+ port = parsed_uri.port || 10_009
94
+
95
+ params = URI.decode_www_form(parsed_uri.query).to_h
96
+ certificate = params['cert'].tr('-_', '+/')
97
+ macaroon = Base64.urlsafe_decode64(params['macaroon'])
98
+
99
+ certificate = "-----BEGIN CERTIFICATE-----\n#{certificate.gsub(/(.{64})/, "\\1\n")}\n-----END CERTIFICATE-----\n"
100
+
101
+ {
102
+ connect: params.first,
103
+ host: host,
104
+ port: port,
105
+ certificate: certificate,
106
+ macaroon: macaroon
107
+ }
108
+ end
109
+
110
+ def self.is_lndconnect?(*params)
111
+ params.is_a?(Array) &&
112
+ params.first.is_a?(String) &&
113
+ params.first.start_with?('lndconnect://')
114
+ end
115
+
116
+ def self.standalone(*params, &vcr)
117
+ connection = Connection.expand(*params, &vcr)
118
+ connection[:credentials] = ::GRPC::Core::ChannelCredentials.new(connection[:certificate])
119
+ connection
120
+ end
121
+
122
+ def self.load_file(path, &vcr)
123
+ vcr.nil? ? File.read(path) : vcr.call(-> { File.read(path) }, path)
124
+ end
125
+ end
126
+ end
@@ -1,13 +1,92 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'securerandom'
4
+
3
5
  require_relative '../logic/string'
6
+ require_relative '../components/grpc'
4
7
 
5
8
  module LNDClientInternal
6
9
  class DocumentationController
10
+ PROGRESS = true
11
+ PATH = 'docs/README.md'
12
+ KEY = '<!-- [INJECT:GRP:DOCS] -->'
13
+
7
14
  attr_reader :available_methods
8
15
 
9
- def initialize(service)
10
- @service = service
16
+ def self.format(code)
17
+ id = SecureRandom.hex(32)
18
+ path = "temp/#{id}.rb"
19
+ File.write("temp/#{id}.rb", code.gsub(', ', ",\n"))
20
+ `rubocop -A -c docs/.rubocop.yml #{path}`
21
+ output = File.read("temp/#{id}.rb")
22
+ File.delete("temp/#{id}.rb")
23
+ output.strip
24
+ end
25
+
26
+ def self.generate!
27
+ services = LNDClientInternal::GRPC::SERVICES.keys.map(&:to_sym)
28
+
29
+ if PROGRESS
30
+ total = services.sum do |service|
31
+ new(
32
+ LNDClientInternal::GRPC::SERVICES[service].const_get(:Service)
33
+ ).available_methods.size * 2
34
+ end
35
+ progressbar = ProgressBar.create(total: total, format: '%a %e |%b>>%i| %P% | %c of %C')
36
+ end
37
+
38
+ content = ''
39
+
40
+ services.each do |service|
41
+ content += "## #{service}\n"
42
+ doc = new(LNDClientInternal::GRPC::SERVICES[service].const_get(:Service))
43
+
44
+ doc.available_methods.each do |method_name|
45
+ content += "\n### #{method_name}\n"
46
+
47
+ url = "https://lightning.engineering/api-docs/api/lnd/#{service}/#{method_name.gsub('_', '-')}/index.html"
48
+
49
+ content += "\n[lightning.engineering/#{service}/#{method_name.gsub('_', '-')}](#{url})\n"
50
+
51
+ description = doc.describe(method_name)
52
+ content += "\n```ruby\n"
53
+
54
+ code = "client.#{service}.#{method_name}"
55
+
56
+ code += "(\n#{description[:input].inspect}\n)" if !description[:input].nil? && !description[:input].empty?
57
+
58
+ code += " do |data|\n puts data.inspect # => { ... }\nend" if method_name =~ /^subscribe/
59
+
60
+ content += if !description[:input].nil? && !description[:input].empty?
61
+ "#{self.format(code)}\n```\n"
62
+ else
63
+ "#{code}\n```\n"
64
+ end
65
+
66
+ progressbar.increment if PROGRESS
67
+
68
+ if !description[:output].nil? && !description[:output].empty?
69
+ code = self.format(description[:output].inspect)
70
+ content += "\nOutput:\n```ruby\n#{code}\n```\n"
71
+ end
72
+
73
+ progressbar.increment if PROGRESS
74
+ end
75
+ end
76
+
77
+ document = File.read(PATH)
78
+
79
+ parts = document.split(KEY)
80
+
81
+ File.write(PATH, "#{parts[0]}#{KEY}\n\n#{content}\n#{KEY}#{parts[2]}")
82
+
83
+ progressbar.finish
84
+
85
+ puts "\nDocumentation updated: #{PATH}\n"
86
+ end
87
+
88
+ def initialize(grpc_service)
89
+ @grpc_service = grpc_service
11
90
  @descriptions = {}
12
91
  @grpc = {}
13
92
 
@@ -15,7 +94,7 @@ module LNDClientInternal
15
94
  end
16
95
 
17
96
  def build!
18
- @available_methods = @service.service.rpc_descs.values.map do |desc|
97
+ @available_methods = @grpc_service.rpc_descs.values.map do |desc|
19
98
  method_name = LNDClientInternal::StringLogic.underscore(desc.name.to_s)
20
99
 
21
100
  build_description!(method_name, desc)
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'singleton'
4
+
5
+ require_relative 'connection'
6
+
7
+ require_relative 'client'
8
+
9
+ module LNDClientInternal
10
+ class Multiclient
11
+ include Singleton
12
+
13
+ def initialize
14
+ @clients = {}
15
+ end
16
+
17
+ def add_connection!(id, *params)
18
+ @clients[id] = ClientController.new(Connection.standalone(*params))
19
+ end
20
+
21
+ def remove_connection!(id)
22
+ @clients.delete(id)
23
+ end
24
+
25
+ def as(id)
26
+ @clients[id]
27
+ end
28
+
29
+ def clear!
30
+ @clients = {}
31
+ end
32
+
33
+ def connections
34
+ @clients.keys
35
+ end
36
+ end
37
+ end
@@ -11,17 +11,17 @@ module LNDClientInternal
11
11
  @rpc = rpc
12
12
  @service = rpc.const_get(:Service)
13
13
  @stub = rpc.const_get(:Stub).new(
14
- client.config.socket_address,
15
- client.config.credentials,
14
+ client.connection[:address],
15
+ client.connection[:credentials],
16
16
  **params
17
17
  )
18
- @doc = LNDClientInternal::DocumentationController.new(self)
18
+ @doc = LNDClientInternal::DocumentationController.new(@service)
19
19
  end
20
20
 
21
21
  def call!(method_key, desc, *args, &block)
22
22
  @stub.method(method_key).call(
23
23
  desc.input.new(*args),
24
- { metadata: { macaroon: @client.config.macaroon } },
24
+ { metadata: { macaroon: @client.connection[:macaroon] } },
25
25
  &block
26
26
  )
27
27
  end
data/lnd-client.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.summary = LNDClientInternal::Static::SPEC[:summary]
11
11
  spec.description = LNDClientInternal::Static::SPEC[:description]
12
12
 
13
- spec.homepage = LNDClientInternal::Static::SPEC[:github]
13
+ spec.homepage = LNDClientInternal::Static::SPEC[:documentation]
14
14
 
15
15
  spec.license = LNDClientInternal::Static::SPEC[:license]
16
16
 
@@ -20,10 +20,12 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.metadata['homepage_uri'] = spec.homepage
22
22
  spec.metadata['source_code_uri'] = LNDClientInternal::Static::SPEC[:github]
23
+ spec.metadata['documentation_uri'] = LNDClientInternal::Static::SPEC[:documentation]
24
+ spec.metadata['bug_tracker_uri'] = LNDClientInternal::Static::SPEC[:issues]
23
25
 
24
26
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
25
27
  `git ls-files -z`.split("\x0").reject do |f|
26
- f.match(%r{\A(?:test|spec|features)/})
28
+ f.match(%r{\A(?:test|spec|docs|features)/})
27
29
  end
28
30
  end
29
31
 
data/models/errors.rb ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LNDClient
4
+ module Errors
5
+ class LNDClientError < StandardError; end
6
+
7
+ class TooManyArgumentsError < LNDClientError; end
8
+ class ArgumentError < LNDClientError; end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../models/errors'
4
+
5
+ include LNDClient::Errors
@@ -1,11 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../controllers/connection'
3
4
  require_relative '../../controllers/client'
5
+ require_relative '../../controllers/multiclient'
4
6
  require_relative '../../static/spec'
5
7
 
6
8
  module LNDClient
7
- def self.new(params)
8
- LNDClientInternal::ClientController.new(params)
9
+ def self.new(...)
10
+ LNDClientInternal::ClientController.new(
11
+ LNDClientInternal::Connection.standalone(...)
12
+ )
13
+ end
14
+
15
+ def self.add_connection!(...)
16
+ LNDClientInternal::Multiclient.instance.add_connection!(...)
17
+ end
18
+
19
+ def self.connections(...)
20
+ LNDClientInternal::Multiclient.instance.connections(...)
21
+ end
22
+
23
+ def self.as(...)
24
+ LNDClientInternal::Multiclient.instance.as(...)
25
+ end
26
+
27
+ def self.remove_connection!(...)
28
+ LNDClientInternal::Multiclient.instance.remove_connection!(...)
9
29
  end
10
30
 
11
31
  def self.version
data/static/spec.rb CHANGED
@@ -4,11 +4,13 @@ module LNDClientInternal
4
4
  module Static
5
5
  SPEC = {
6
6
  name: 'lnd-client',
7
- version: '0.0.5',
7
+ version: '0.0.7',
8
8
  author: 'icebaker',
9
9
  summary: 'Ruby Lightning Network Daemon (lnd) Client',
10
10
  description: 'Ruby Lightning Network Daemon (lnd) Client',
11
11
  github: 'https://github.com/icebaker/lnd-client',
12
+ documentation: 'https://icebaker.github.io/lnd-client',
13
+ issues: 'https://github.com/icebaker/lnd-client/issues',
12
14
  license: 'MIT'
13
15
  }.freeze
14
16
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lnd-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - icebaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-12 00:00:00.000000000 Z
11
+ date: 2023-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grpc
@@ -30,7 +30,10 @@ executables: []
30
30
  extensions: []
31
31
  extra_rdoc_files: []
32
32
  files:
33
+ - ".env.example"
34
+ - ".github/workflows/ruby-rspec-tests.yml"
33
35
  - ".gitignore"
36
+ - ".rspec"
34
37
  - ".rubocop.yml"
35
38
  - Gemfile
36
39
  - Gemfile.lock
@@ -72,21 +75,26 @@ files:
72
75
  - components/grpc/wtclientrpc/wtclient_pb.rb
73
76
  - components/grpc/wtclientrpc/wtclient_services_pb.rb
74
77
  - controllers/client.rb
75
- - controllers/config.rb
78
+ - controllers/connection.rb
76
79
  - controllers/documentation.rb
77
80
  - controllers/grpc_generator.rb
81
+ - controllers/multiclient.rb
78
82
  - controllers/service.rb
79
83
  - lnd-client.gemspec
80
84
  - logic/string.rb
85
+ - models/errors.rb
81
86
  - ports/dsl/lnd-client.rb
87
+ - ports/dsl/lnd-client/errors.rb
82
88
  - static/spec.rb
83
- homepage: https://github.com/icebaker/lnd-client
89
+ homepage: https://icebaker.github.io/lnd-client
84
90
  licenses:
85
91
  - MIT
86
92
  metadata:
87
93
  allowed_push_host: https://rubygems.org
88
- homepage_uri: https://github.com/icebaker/lnd-client
94
+ homepage_uri: https://icebaker.github.io/lnd-client
89
95
  source_code_uri: https://github.com/icebaker/lnd-client
96
+ documentation_uri: https://icebaker.github.io/lnd-client
97
+ bug_tracker_uri: https://github.com/icebaker/lnd-client/issues
90
98
  rubygems_mfa_required: 'true'
91
99
  post_install_message:
92
100
  rdoc_options: []
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grpc'
4
-
5
- module LNDClientInternal
6
- class ConfigController
7
- attr_reader :socket_address, :credentials, :certificate, :macaroon
8
-
9
- def initialize(client, options)
10
- @client = client
11
-
12
- @certificate_path = options[:certificate_path]
13
- @certificate = options[:certificate]
14
-
15
- @macaroon_path = options[:macaroon_path]
16
- @macaroon = options[:macaroon]
17
-
18
- @socket_address = options[:socket_address] || '127.0.0.1:10009'
19
-
20
- setup_certificate!
21
- setup_macaroon!
22
- end
23
-
24
- def setup_certificate!
25
- raise 'conflicting options for certificate' if @certificate && @certificate_path
26
-
27
- @certificate = File.read(@certificate_path) if @certificate_path
28
- @credentials = ::GRPC::Core::ChannelCredentials.new(@certificate)
29
- end
30
-
31
- def setup_macaroon!
32
- raise 'conflicting options for macaroon' if @macaroon && @macaroon_path
33
-
34
- @macaroon = File.read(@macaroon_path).unpack('H*') if @macaroon_path
35
- end
36
- end
37
- end