Class: DIDKit::Resolver
- Inherits:
-
Object
- Object
- DIDKit::Resolver
- Includes:
- Requests
- Defined in:
- lib/didkit/resolver.rb
Constant Summary collapse
- RESERVED_DOMAINS =
%w(alt arpa example internal invalid local localhost onion test)
- MAX_REDIRECTS =
5
Instance Attribute Summary collapse
-
#nameserver ⇒ Object
Returns the value of attribute nameserver.
Instance Method Summary collapse
- #get_validated_handle(did_or_doc) ⇒ Object
-
#initialize(options = {}) ⇒ Resolver
constructor
A new instance of Resolver.
- #parse_did_from_dns(txt) ⇒ Object
- #parse_did_from_well_known(text) ⇒ Object
- #pick_valid_handle(did, handles) ⇒ Object
- #resolv_options ⇒ Object
- #resolve_did(did) ⇒ Object
- #resolve_did_plc(did) ⇒ Object
- #resolve_did_web(did) ⇒ Object
- #resolve_handle(handle) ⇒ Object
- #resolve_handle_by_dns(domain) ⇒ Object
- #resolve_handle_by_well_known(domain) ⇒ Object
Methods included from Requests
Constructor Details
#initialize(options = {}) ⇒ Resolver
Returns a new instance of Resolver.
19 20 21 |
# File 'lib/didkit/resolver.rb', line 19 def initialize( = {}) @nameserver = [:nameserver] end |
Instance Attribute Details
#nameserver ⇒ Object
Returns the value of attribute nameserver.
17 18 19 |
# File 'lib/didkit/resolver.rb', line 17 def nameserver @nameserver end |
Instance Method Details
#get_validated_handle(did_or_doc) ⇒ Object
97 98 99 100 101 |
# File 'lib/didkit/resolver.rb', line 97 def get_validated_handle(did_or_doc) document = did_or_doc.is_a?(Document) ? did_or_doc : resolve_did(did_or_doc) pick_valid_handle(document.did, document.handles) end |
#parse_did_from_dns(txt) ⇒ Object
70 71 72 |
# File 'lib/didkit/resolver.rb', line 70 def parse_did_from_dns(txt) txt =~ /\Adid\=(did\:\w+\:.*)\z/ ? $1 : nil end |
#parse_did_from_well_known(text) ⇒ Object
74 75 76 77 |
# File 'lib/didkit/resolver.rb', line 74 def parse_did_from_well_known(text) text = text.strip text.lines.length == 1 && text =~ /\Adid\:\w+\:.*\z/ ? text : nil end |
#pick_valid_handle(did, handles) ⇒ Object
103 104 105 |
# File 'lib/didkit/resolver.rb', line 103 def pick_valid_handle(did, handles) handles.detect { |h| resolve_handle(h) == did } end |
#resolv_options ⇒ Object
64 65 66 67 68 |
# File 'lib/didkit/resolver.rb', line 64 def = Resolv::DNS::Config.default_config_hash.dup [:nameserver] = nameserver if nameserver end |
#resolve_did(did) ⇒ Object
79 80 81 82 83 |
# File 'lib/didkit/resolver.rb', line 79 def resolve_did(did) did = DID.new(did) if did.is_a?(String) did.type == :plc ? resolve_did_plc(did) : resolve_did_web(did) end |
#resolve_did_plc(did) ⇒ Object
85 86 87 88 89 |
# File 'lib/didkit/resolver.rb', line 85 def resolve_did_plc(did) url = "https://plc.directory/#{did}" json = JSON.parse(URI.open(url).read) Document.new(did, json) end |
#resolve_did_web(did) ⇒ Object
91 92 93 94 95 |
# File 'lib/didkit/resolver.rb', line 91 def resolve_did_web(did) url = "https://#{did.web_domain}/.well-known/did.json" json = JSON.parse(URI.open(url).read) Document.new(did, json) end |
#resolve_handle(handle) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/didkit/resolver.rb', line 23 def resolve_handle(handle) domain = handle.gsub(/^@/, '') return nil if RESERVED_DOMAINS.include?(domain.split('.').last) if dns_did = resolve_handle_by_dns(domain) DID.new(dns_did, :dns) elsif http_did = resolve_handle_by_well_known(domain) DID.new(http_did, :http) else nil end end |
#resolve_handle_by_dns(domain) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/didkit/resolver.rb', line 37 def resolve_handle_by_dns(domain) dns_records = Resolv::DNS.open() do |d| d.getresources("_atproto.#{domain}", Resolv::DNS::Resource::IN::TXT) end if record = dns_records.first if string = record.strings.first return parse_did_from_dns(string) end end nil end |
#resolve_handle_by_well_known(domain) ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/didkit/resolver.rb', line 51 def resolve_handle_by_well_known(domain) url = "https://#{domain}/.well-known/atproto-did" response = get_response(url, timeout: 10, max_redirects: MAX_REDIRECTS) if response.is_a?(Net::HTTPSuccess) && (text = response.body) return parse_did_from_well_known(text) end nil rescue StandardError => e nil end |