yonder 0.1 → 0.3

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: 7d2f1e9e39e76d3943e13103c9fc57bab664b1eafdd5ff88f94c1b41c0ce1cbb
4
- data.tar.gz: 0c456c5e04016b65018ac80c4d88727576a170c59fd8e9a7510f10ea0c8366da
3
+ metadata.gz: 2702e3ab4ae8d1d1d254df861aba3dd705adfcd77c0900fc6200d024c6775676
4
+ data.tar.gz: e26e68823fe42d8d6813b9008067c7b69fa710cd7d045e2ca61ff9b225dd6e19
5
5
  SHA512:
6
- metadata.gz: 8921c8b1951f18dcb21578adcf87259525efe9e02b64c9fe8d9f9208bea9d59105372d4ea0ef18434ee82fd4114f7b14f1ed661da33129ddf1f512c405ebcaa7
7
- data.tar.gz: 878ee56b10802b4bc3b23b76313b06c0b1916b96809ab03162abf9624f376e486139db3b2c9920fe238a5d01f5b1fe2a5c07da43d3d0cc65c32ea6e3c1c98858
6
+ metadata.gz: b0e662fb8778962ab28be960cb87c2987d825225c64f0f5c1744db7f3b30d190d89e32cdcf39c40bfd804e933b92bfb79f38922171e412ae6c5f096a50bb22e0
7
+ data.tar.gz: 2a9a49a413a02c4e191fb04e5daa02c4bebac6b8fd3e77d9c56d4e5534243fe7761c27f43fb80ccbe76b49fc0f728e5b531596a5d4c1c5561e5c0be211caca89
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yonder
4
+ class Error < StandardError; end
5
+
6
+ class NetworkError < Error; end
7
+ class RequestError < Error; end
8
+ class InvalidParamsError < RequestError; end
9
+ class RateLimitedError < RequestError; end
10
+ class AuthenticationError < RequestError; end
11
+ class TokenInvalidError < AuthenticationError; end
12
+ class TokenExpiredError < AuthenticationError; end
13
+ class ResponseError < Error; end
14
+ end
@@ -0,0 +1,21 @@
1
+ module Yonder
2
+ class Session
3
+ attr_accessor :user_did
4
+ attr_accessor :access_token
5
+ attr_accessor :refresh_token
6
+
7
+ def self.from_json(payload)
8
+ Session.new(
9
+ user_did: payload["did"],
10
+ access_token: payload["accessJwt"],
11
+ refresh_token: payload["refreshJwt"]
12
+ )
13
+ end
14
+
15
+ def initialize(user_did:, access_token:, refresh_token:)
16
+ @user_did = user_did
17
+ @access_token = access_token
18
+ @refresh_token = refresh_token
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module Yonder
2
- VERSION = 0.1
2
+ VERSION = 0.3
3
3
  end
data/lib/yonder.rb CHANGED
@@ -3,67 +3,102 @@
3
3
  $LOAD_PATH.unshift(__dir__)
4
4
 
5
5
  require 'httpx'
6
+ require 'yonder/session'
6
7
  require 'yonder/version'
8
+ require 'yonder/errors'
7
9
 
8
10
  module Yonder
9
11
  class << self
10
12
  BASE_URL = "https://bsky.social"
13
+ COLLECTION_POST = 'app.bsky.feed.post'
14
+ ERROR_MAPPING = {
15
+ 'AuthMissing' => AuthenticationError,
16
+ 'ExpiredToken' => TokenExpiredError,
17
+ 'InvalidToken' => TokenInvalidError
18
+ }
19
+
20
+ attr_accessor :api_host
21
+ attr_accessor :session
22
+ attr_accessor :user_agent
23
+
24
+ def create_post(user_did:, message:)
25
+ create_record(
26
+ user_did: user_did,
27
+ record: {
28
+ text: message,
29
+ createdAt: Time.now.iso8601
30
+ },
31
+ collection: COLLECTION_POST
32
+ )
33
+ end
11
34
 
12
- attr_accessor :access_token
13
- attr_accessor :refresh_token
14
-
15
- def create_record(user_did:, record:, collection: 'app.bsky.feed.post')
16
- post("/com.atproto.repo.createRecord", params: {
17
- repo: user_did,
18
- collection: collection,
19
- record: record
20
- })
35
+ def create_record(user_did:, record:, collection:)
36
+ post(
37
+ endpoint: "/com.atproto.repo.createRecord",
38
+ params: {
39
+ repo: user_did,
40
+ collection: collection,
41
+ record: record
42
+ }
43
+ )
21
44
  end
22
45
 
23
46
  def create_session(username:, password:)
24
- post("/com.atproto.server.createSession", params: {
25
- identifier: username,
26
- password: password
27
- })
47
+ response = post(
48
+ endpoint: "/com.atproto.server.createSession",
49
+ params: {
50
+ identifier: username,
51
+ password: password
52
+ }
53
+ )
54
+
55
+ @session = Session.from_json(response)
56
+ true
28
57
  end
29
58
 
30
- def renew_session(renewal_token)
31
- post("/com.atproto.server.refreshSession")
59
+ def refresh_session
60
+ response = post(
61
+ endpoint: "/com.atproto.server.refreshSession",
62
+ access_token: @session&.refresh_token
63
+ )
64
+
65
+ @session = Session.from_json(response)
66
+ true
32
67
  end
33
68
 
34
- def get(endpoint)
35
- make_api_request(endpoint, method: :get)
69
+ def get(endpoint:)
70
+ make_api_request(endpoint: endpoint, method: :get)
36
71
  end
37
72
 
38
- def post(endpoint, params: {})
39
- make_api_request(endpoint, method: :post, params: params)
73
+ def post(endpoint:, params: {}, access_token: nil)
74
+ make_api_request(endpoint: endpoint, method: :post, params: params, access_token: access_token)
40
75
  end
41
76
 
42
77
  private
43
78
 
44
- def make_api_request(endpoint, method: :get, params: {})
45
- response = http_client.request(method, endpoint, json: params)
79
+ def make_api_request(endpoint:, method: :get, params: {}, access_token: nil)
80
+ access_token ||= @session&.access_token
81
+
82
+ client = http_client
83
+ client = client.bearer_auth(access_token) unless access_token.nil?
84
+
85
+ response = client.request(method, endpoint, json: params)
46
86
 
47
87
  response.raise_for_status
48
88
  response.json
89
+ rescue HTTPX::TimeoutError, HTTPX::ResolveError => e
90
+ raise Yonder::RequestError.new(e.message)
91
+ rescue HTTPX::HTTPError => e
92
+ klass = ERROR_MAPPING.dig(e.response.json['error']) || NetworkError
93
+ raise klass.new(e.response.json['message'])
49
94
  end
50
95
 
51
96
  def http_client
52
- client = HTTPX.with(
53
- origin: BASE_URL,
54
- headers: api_headers,
97
+ HTTPX.with(
98
+ origin: @api_host || BASE_URL,
99
+ headers: { "user-agent": @user_agent || "yonder v#{Yonder::VERSION}" },
55
100
  base_path: '/xrpc'
56
101
  ).plugin(:auth)
57
-
58
- return client if @access_token.nil?
59
-
60
- client.bearer_auth(@access_token)
61
- end
62
-
63
- def api_headers
64
- {
65
- "user-agent": @user_agent || "yonder v#{Yonder::VERSION}"
66
- }
67
102
  end
68
103
  end
69
104
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yonder
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Bogan
@@ -31,6 +31,8 @@ extensions: []
31
31
  extra_rdoc_files: []
32
32
  files:
33
33
  - lib/yonder.rb
34
+ - lib/yonder/errors.rb
35
+ - lib/yonder/session.rb
34
36
  - lib/yonder/version.rb
35
37
  homepage: http://github.com/waferbaby/yonder
36
38
  licenses: