xrpc 0.0.3 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f4c7af719721f6960936c4dd967a7ff407460ab99adf73168c0abdeec609c7a
4
- data.tar.gz: 9a366f9b9bf327101e18d94ae1413106f8d6b3404b6b638c12447bc0a2d66795
3
+ metadata.gz: 173fc491f2988e7fd7a41435171cd60ec05e3116b838ab4c0257039788e0392a
4
+ data.tar.gz: 1afb3fa818ae58646e293afa6f97891fbf32ead4e9cd8be68d5ca8ca38db6c44
5
5
  SHA512:
6
- metadata.gz: a3861268b173caae679601b7962da6add63a17d51f17f8f3baac5994befac5be1880c0b031e295b18579f018823a2d0f6d878ea9d17dc27588f41249050e7edb
7
- data.tar.gz: a133c6ed0e072e161b18e47e382cd19309ca122e99816705b3120091d26ea438e64af1f588eaf9ca827a039e03bf216ae91b22d4b4f2bf5718ce97f8d3e9279d
6
+ metadata.gz: a543fa05e7bcebac74107e6eaf2f655d4e5e37458e7a61e5d8a824760a009baf1b18eefd19c7c0559e3029c5b33a9f4464e11cbcfd92687a3ddb8242e17fbe42
7
+ data.tar.gz: 571c2af3661344e704023c444a28f1578d896820f58424b8e9f50118517d51aae92341d21440a5391019461388cc6ae69cf618b5a7db5ab8846c02b99ea57389
data/lib/xrpc/client.rb CHANGED
@@ -1,130 +1,44 @@
1
- require "uri"
2
1
  require "httparty"
3
2
  require "json"
4
3
 
5
4
  module XRPC
6
- class Service
7
- def initialize(pds)
8
- @pds = pds
9
- end
10
-
11
- def call(endpoint, params = {}, body = nil)
12
- endpoint_uri = URI("#{@pds}/xrpc/#{endpoint}?#{URI.encode_www_form(params)}")
13
- headers = { 'Content-Type': "application/json" }
14
-
15
- response = if body
16
- HTTParty.post(endpoint_uri, body: body.to_json, headers: headers)
17
- else
18
- HTTParty.get(endpoint_uri)
19
- end
20
-
21
- { encoding: response.headers["Content-Type"], body: JSON.parse(response.body) }
5
+ class << self
6
+ def client(url)
7
+ XRPC::Client.new(url)
22
8
  end
23
9
  end
24
- end
25
-
26
- module XRPC
27
- class Endpoint
28
- attr_reader :id, :lexicon
29
10
 
30
- def initialize(id, lexicon)
31
- @id = id
32
- @lexicon = lexicon
33
- end
11
+ class Client
12
+ attr_reader :get, :post
34
13
 
35
- def call(service, params = {}, body = nil)
36
- service.call(@id, params, body)
14
+ def initialize(base_url)
15
+ @base_url = base_url
16
+ @get = GetRequest.new(base_url)
17
+ @post = PostRequest.new(base_url)
37
18
  end
38
- end
39
- end
40
19
 
41
- module XRPC
42
- class Lexicon
43
- def initialize(lexicon)
44
- @lexicon = lexicon
45
- end
20
+ class GetRequest
21
+ include HTTParty
46
22
 
47
- def endpoint(id)
48
- Endpoint.new(id, @lexicon)
49
- end
50
- end
51
- end
52
-
53
- module XRPC
54
- class Client
55
- def initialize
56
- @lexicons = []
57
- end
23
+ def initialize(base_url)
24
+ self.class.base_uri base_url
25
+ end
58
26
 
59
- def add_lexicon(lexicon)
60
- @lexicons << Lexicon.new(lexicon)
27
+ def method_missing(method_name, **params)
28
+ JSON.parse self.class.get("/xrpc/#{method_name.to_s.gsub("_", ".")}", query: params).body
29
+ end
61
30
  end
62
31
 
63
- def service(pds)
64
- Service.new(pds)
65
- end
32
+ class PostRequest
33
+ include HTTParty
66
34
 
67
- def endpoint(id)
68
- @lexicons.each do |lexicon|
69
- endpoint = lexicon.endpoint(id)
70
- return endpoint if endpoint
35
+ def initialize(base_url)
36
+ self.class.base_uri base_url
37
+ end
71
38
 
72
- nil
39
+ def method_missing(method_name, **params)
40
+ JSON.parse self.class.post("/xrpc/#{method_name.to_s.gsub("_", ".")}", body: params).body
73
41
  end
74
42
  end
75
43
  end
76
44
  end
77
-
78
- # # example usage
79
- # client = XRPC::Client.new
80
-
81
- # client.add_lexicon({
82
- # lexicon: 1,
83
- # id: 'io.example.ping',
84
- # defs: {
85
- # main: {
86
- # type: 'query',
87
- # description: 'Ping the server',
88
- # parameters: {
89
- # type: 'params',
90
- # properties: { message: { type: 'string' } }
91
- # },
92
- # output: {
93
- # encoding: 'application/json',
94
- # schema: {
95
- # type: 'object',
96
- # required: ['message'],
97
- # properties: { message: { type: 'string' } }
98
- # }
99
- # }
100
- # }
101
- # }
102
- # })
103
-
104
- # client.add_lexicon({
105
- # lexicon: 1,
106
- # id: 'io.example.writeJsonFile',
107
- # defs: {
108
- # main: {
109
- # type: 'procedure',
110
- # description: 'Write a JSON file',
111
- # parameters: {
112
- # type: 'params',
113
- # properties: { fileName: { type: 'string' } }
114
- # },
115
- # input: {
116
- # encoding: 'application/json'
117
- # }
118
- # }
119
- # }
120
- # })
121
-
122
- # # call endpoint with query parameters and input body
123
- # res1 = client.service('https://example.com').call('io.example.writeJsonFile', { fileName: 'foo.json' }, { hello: 'world', thisIs: 'the file to write' })
124
- # puts res1
125
- # # => { encoding: 'application/json', body: nil }
126
-
127
- # # call endpoint with query parameters only
128
- # res2 = client.endpoint('io.example.ping').call(client.service('https://example.com'), { message: 'hello world' })
129
- # puts res2
130
- # # => { encoding: 'application/json', body: { message: 'hello world' } }
data/lib/xrpc/server.rb CHANGED
@@ -1,43 +1,44 @@
1
- require "json"
2
- require "rack"
3
-
4
- module XRPC
5
- class Server
6
- def initialize(lexicons)
7
- @lexicons = lexicons
8
- end
9
-
10
- def method(id)
11
- # endpoint = find_endpoint(id)
12
- # raise ArgumentError, "Endpoint '#{id}' not found" unless endpoint
13
-
14
- define_singleton_method(id) do |input, **params|
15
- endpoint.call(input, params)
1
+ require "sinatra/base"
2
+
3
+ module Sinatra
4
+ module XRPCRoutes
5
+ def xrpc_get(lexicon, &block)
6
+ # Extract the parameter names from the block's parameters
7
+ parameters = block.parameters.map { |type, name| name.to_s }
8
+
9
+ # Define a new route with the provided lexicon and block
10
+ get "/xrpc/#{lexicon}" do
11
+ content_type :json
12
+ # Create a hash of arguments with parameter names as keys
13
+ args = {}
14
+ parameters.each do |param|
15
+ args[param] = params[param] if params[param]
16
+ end
17
+
18
+ # Call the block with the arguments
19
+ instance_exec(args, &block)
16
20
  end
17
21
  end
18
22
 
19
- def decode_params(nsid, query_params)
20
- # logic to decode query parameters based on nsid
21
- # For simplicity, let's assume no decoding is needed and return the query params as is
22
- query_params
23
- end
24
-
25
- def call(nsid, input, **params)
26
- endpoint = find_endpoint(nsid)
27
- raise ArgumentError, "Endpoint '#{nsid}' not found" unless endpoint
28
-
29
- endpoint.call(input, params)
30
- end
31
-
32
- private
33
-
34
- def find_endpoint(id)
35
- @lexicons.each do |lexicon|
36
- endpoint = lexicon.endpoint(id)
37
- return endpoint if endpoint
23
+ def xrpc_post(lexicon, &block)
24
+ # Extract the parameter names from the block's parameters
25
+ parameters = block.parameters.map { |type, name| name.to_s }
26
+
27
+ # Define a new route with the provided lexicon and block
28
+ post "/xrpc/#{lexicon}" do
29
+ content_type :json
30
+ # Create a hash of arguments with parameter names as keys
31
+ args = {}
32
+ parameters.each do |param|
33
+ args[param] = params[param] if params[param]
34
+ end
35
+
36
+ # Call the block with the arguments
37
+ instance_exec(args, &block)
38
38
  end
39
-
40
- nil
41
39
  end
42
40
  end
41
+
42
+ # Register the module to make it available as a macro
43
+ register XRPCRoutes
43
44
  end
data/lib/xrpc/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module XRPC
4
- VERSION = "0.0.3"
4
+ VERSION = "0.1.0"
5
5
  end
data/lib/xrpc.rb CHANGED
@@ -1,2 +1 @@
1
1
  require "xrpc/client"
2
- require "xrpc/basic"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xrpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shreyan Jain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-21 00:00:00.000000000 Z
11
+ date: 2023-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -60,7 +60,6 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - "./lib/xrpc.rb"
63
- - "./lib/xrpc/basic.rb"
64
63
  - "./lib/xrpc/client.rb"
65
64
  - "./lib/xrpc/server.rb"
66
65
  - "./lib/xrpc/version.rb"
@@ -83,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
82
  - !ruby/object:Gem::Version
84
83
  version: '0'
85
84
  requirements: []
86
- rubygems_version: 3.4.10
85
+ rubygems_version: 3.4.15
87
86
  signing_key:
88
87
  specification_version: 4
89
88
  summary: Interact with bsky/atproto using Ruby
data/lib/xrpc/basic.rb DELETED
@@ -1,61 +0,0 @@
1
- # typed: false
2
- require "uri"
3
- require "httparty"
4
- require "json"
5
-
6
- module XRPC
7
- def request(pds, endpoint_location, params)
8
- EasyEndpoint.new(pds, endpoint_location).get(params)
9
- end
10
-
11
- module_function :request
12
-
13
- class EasyEndpoint
14
- attr_reader :request_uri
15
-
16
- def initialize(pds, endpoint_location, authenticated: false, token: nil)
17
- @pds = pds
18
- @endpoint_location = endpoint_location
19
- @authenticated = authenticated
20
- @headers = default_headers()
21
- if token # Ideally, you shouldn't pass the token when creating the endpoint
22
- @headers = default_authenticated_headers(token)
23
- end
24
- end
25
-
26
- def default_headers
27
- { "Content-Type" => "application/json" }
28
- end
29
-
30
- def authenticated?() @authenticated end
31
-
32
- def default_authenticated_headers(access_token)
33
- default_headers.merge({
34
- Authorization: "Bearer #{access_token}",
35
- })
36
- end
37
-
38
- def authenticate(token) # This is the proper place to authenticate with a token
39
- # This is still a pretty weird way to authenticate, but it works (for now)
40
- if not @authenticated == true
41
- raise Error, "Non-authenticated endpoint cannot be authenticated"
42
- end
43
- @headers = default_authenticated_headers(token)
44
- end
45
-
46
- def get(params)
47
- query_params = URI.encode_www_form(params) # e.g. "foo=bar&baz=qux" from (foo: "bar", baz: "qux")
48
- @request_uri = URI("#{@pds}/xrpc/#{@endpoint_location}?#{query_params}")
49
- response = HTTParty.get(@request_uri, headers: @headers)
50
- JSON.parse(response.body)
51
- end
52
-
53
- def post(params)
54
- @request_uri = URI("#{@pds}/xrpc/#{@endpoint_location}")
55
- response = HTTParty.post(@request_uri, body: params.to_json, headers: @headers)
56
- if response then JSON.parse(response.body) end
57
- end
58
- end
59
-
60
- class Error < StandardError; end
61
- end