xrpc 0.0.2 → 0.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: cd2edff5dc4387dbbfeb6ecf00860e265cc93ed214eb2f7fb1f2fc8c192a1949
4
- data.tar.gz: f07553b8c5d1d4e80e4a4f4e22b9e1b3871808f717e308432d9ba68cf51ae75b
3
+ metadata.gz: 6f4c7af719721f6960936c4dd967a7ff407460ab99adf73168c0abdeec609c7a
4
+ data.tar.gz: 9a366f9b9bf327101e18d94ae1413106f8d6b3404b6b638c12447bc0a2d66795
5
5
  SHA512:
6
- metadata.gz: 5366e5bf46e307c3d7eebd426c79aa488cc8741797a9feedbd58891dc1a21b8ef308e1d03d7d2eeae2e5e948e29ef78ed1223fe96ba7d355ef861e240af9d2a5
7
- data.tar.gz: f01c679d2164544877f8338a107966953756818e8d3e7fdcec2fd765a76fbd03dd04c812370ea632799ed4994d89c810e2a8fac69e7077acd45d18cf7b0067b6
6
+ metadata.gz: a3861268b173caae679601b7962da6add63a17d51f17f8f3baac5994befac5be1880c0b031e295b18579f018823a2d0f6d878ea9d17dc27588f41249050e7edb
7
+ data.tar.gz: a133c6ed0e072e161b18e47e382cd19309ca122e99816705b3120091d26ea438e64af1f588eaf9ca827a039e03bf216ae91b22d4b4f2bf5718ce97f8d3e9279d
data/lib/xrpc/basic.rb ADDED
@@ -0,0 +1,61 @@
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
@@ -0,0 +1,130 @@
1
+ require "uri"
2
+ require "httparty"
3
+ require "json"
4
+
5
+ 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) }
22
+ end
23
+ end
24
+ end
25
+
26
+ module XRPC
27
+ class Endpoint
28
+ attr_reader :id, :lexicon
29
+
30
+ def initialize(id, lexicon)
31
+ @id = id
32
+ @lexicon = lexicon
33
+ end
34
+
35
+ def call(service, params = {}, body = nil)
36
+ service.call(@id, params, body)
37
+ end
38
+ end
39
+ end
40
+
41
+ module XRPC
42
+ class Lexicon
43
+ def initialize(lexicon)
44
+ @lexicon = lexicon
45
+ end
46
+
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
58
+
59
+ def add_lexicon(lexicon)
60
+ @lexicons << Lexicon.new(lexicon)
61
+ end
62
+
63
+ def service(pds)
64
+ Service.new(pds)
65
+ end
66
+
67
+ def endpoint(id)
68
+ @lexicons.each do |lexicon|
69
+ endpoint = lexicon.endpoint(id)
70
+ return endpoint if endpoint
71
+
72
+ nil
73
+ end
74
+ end
75
+ end
76
+ 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' } }
@@ -0,0 +1,43 @@
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)
16
+ end
17
+ end
18
+
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
38
+ end
39
+
40
+ nil
41
+ end
42
+ end
43
+ 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.2"
4
+ VERSION = "0.0.3"
5
5
  end
data/lib/xrpc.rb CHANGED
@@ -1,55 +1,2 @@
1
- # typed: false
2
- require "uri"
3
- require "httparty"
4
- require "json"
5
-
6
- module XRPC
7
- def request(pds, endpoint_location, params)
8
- Endpoint.new(pds, endpoint_location).get(params)
9
- end
10
-
11
- module_function :request
12
-
13
- class Endpoint
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
- end
53
-
54
- class Error < StandardError; end
55
- end
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.2
4
+ version: 0.0.3
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-16 00:00:00.000000000 Z
11
+ date: 2023-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -60,6 +60,9 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - "./lib/xrpc.rb"
63
+ - "./lib/xrpc/basic.rb"
64
+ - "./lib/xrpc/client.rb"
65
+ - "./lib/xrpc/server.rb"
63
66
  - "./lib/xrpc/version.rb"
64
67
  homepage: https://github.com/ShreyanJain9/xrpc
65
68
  licenses: