Module: Pray::ServeFederation
- Defined in:
- lib/pray/serve_federation.rb
Class Method Summary collapse
- .append_confession(root, body) ⇒ Object
- .discovery_response(root) ⇒ Object
- .index_response(root) ⇒ Object
- .package_response(root, path) ⇒ Object
- .read_peers(root) ⇒ Object
- .transport_version(version) ⇒ Object
Class Method Details
.append_confession(root, body) ⇒ Object
66 67 68 69 70 71 |
# File 'lib/pray/serve_federation.rb', line 66 def append_confession(root, body) FileUtils.mkdir_p(File.join(root, "v1")) path = File.join(root, "v1", "confessions.jsonl") File.open(path, "a") { |file| file.puts(body.to_s.b) } Serve.ok_response("application/json", JSON.generate({"status" => "ok"})) end |
.discovery_response(root) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/pray/serve_federation.rb', line 9 def discovery_response(root) peers = read_peers(root) body = { "spec" => "pray-federation-v1", "server" => { "name" => "pray", "version" => VERSION, "capabilities" => ["static_registry", "federation"] }, "sync" => { "index_url" => "/v1/sync/index", "package_url" => "/v1/sync/package/{name}", "artifact_url" => "/v1/artifacts/{package}/{version}/{artifact}", "since_param" => "since" }, "peers" => peers } Serve.ok_response("application/json", JSON.pretty_generate(body)) end |
.index_response(root) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/pray/serve_federation.rb', line 29 def index_response(root) index = Publish.load_registry_index(root) packages = index.packages.filter_map do |name| = Publish.( Publish.(root, name), name ) next if .versions.empty? updated_at = .versions.map { |version| version.published_at.to_s }.max || "0" { "name" => name, "updated_at" => updated_at, "url" => "/v1/sync/package/#{name}" } end body = { "spec" => "prayfile-distribution-1", "sync_version" => 0, "packages" => packages } Serve.ok_response("application/json", JSON.pretty_generate(body)) end |
.package_response(root, path) ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/pray/serve_federation.rb', line 52 def package_response(root, path) name = path.delete_prefix("/v1/sync/package/") = Publish.(root, name) return Serve.not_found unless File.file?() = Publish.(, name) body = { "name" => .name, "updated_at" => .versions.map { |version| version.published_at.to_s }.max || "0", "versions" => .versions.map { |version| transport_version(version) } } Serve.ok_response("application/json", JSON.pretty_generate(body)) end |
.read_peers(root) ⇒ Object
100 101 102 103 104 105 106 107 |
# File 'lib/pray/serve_federation.rb', line 100 def read_peers(root) path = File.join(root, "v1", "peers.json") return [] unless File.file?(path) Array(JSON.parse(File.read(path))) rescue JSON::ParserError [] end |
.transport_version(version) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/pray/serve_federation.rb', line 73 def transport_version(version) hash = { "version" => version.version, "artifact" => version.artifact, "artifact_hash" => version.artifact_hash.to_s, "tree_hash" => version.tree_hash.to_s, "yanked" => version.yanked, "targets" => version.targets, "exports" => version.exports, "published_at" => version.published_at.to_s } if version.signer || version.signer_fingerprint hash["publisher"] = { "id" => version.signer.to_s, "key_fingerprint" => version.signer_fingerprint.to_s } end if version.signature hash["signature"] = { "public_key" => version.signer.to_s, "signature" => version.signature, "value" => version.signature } end hash end |