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 +4 -4
- data/lib/xrpc/basic.rb +61 -0
- data/lib/xrpc/client.rb +130 -0
- data/lib/xrpc/server.rb +43 -0
- data/lib/xrpc/version.rb +1 -1
- data/lib/xrpc.rb +2 -55
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f4c7af719721f6960936c4dd967a7ff407460ab99adf73168c0abdeec609c7a
|
4
|
+
data.tar.gz: 9a366f9b9bf327101e18d94ae1413106f8d6b3404b6b638c12447bc0a2d66795
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/xrpc/client.rb
ADDED
@@ -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' } }
|
data/lib/xrpc/server.rb
ADDED
@@ -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
data/lib/xrpc.rb
CHANGED
@@ -1,55 +1,2 @@
|
|
1
|
-
|
2
|
-
require "
|
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.
|
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-
|
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:
|