Module: Pray::ServeFederation

Defined in:
lib/pray/serve_federation.rb

Class Method Summary collapse

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