at protocol indexer with flexible filtering, xrpc queries, and a cursor-backed event stream, built on fjall
at-protocol
atproto
indexer
rust
fjall
1# mock_relay.nu
2
3# A closure that handles HTTP requests
4{|req|
5
6
7 # check path
8 if ($req.path | str starts-with "/xrpc/com.atproto.sync.listRepos") {
9
10 # parse query params if any
11 let query_string = ($req.path | split row "?" | get 1? | default "")
12 let params = if ($query_string | is-empty) {
13 []
14 } else {
15 ($query_string | split row "&" | each { |it| $it | split row "=" })
16 }
17 let cursor = ($params | where { |x| $x.0 == "cursor" } | get 0?.1?)
18
19 # define some mock repos
20 let all_repos = [
21 { did: "did:web:mock1.com", head: "bafyreidf747c4x3lps3k4n357l3a3r57k3k465743k573k465743k5", rev: "3j6s746574657" },
22 { did: "did:web:mock2.com", head: "bafyreidf747c4x3lps3k4n357l3a3r57k3k465743k573k465743k5", rev: "3j6s746574657" },
23 { did: "did:web:mock3.com", head: "bafyreidf747c4x3lps3k4n357l3a3r57k3k465743k573k465743k5", rev: "3j6s746574657" },
24 { did: "did:web:mock4.com", head: "bafyreidf747c4x3lps3k4n357l3a3r57k3k465743k573k465743k5", rev: "3j6s746574657" },
25 { did: "did:web:mock5.com", head: "bafyreidf747c4x3lps3k4n357l3a3r57k3k465743k573k465743k5", rev: "3j6s746574657" }
26 ]
27
28 let repos = if ($cursor == "50") {
29 []
30 } else {
31 $all_repos
32 }
33
34 let next_cursor = if ($cursor == "50") {
35 null
36 } else {
37 "50"
38 }
39
40 {
41 cursor: $next_cursor,
42 repos: $repos
43 }
44 | to json
45 | metadata set --merge {
46 http.response: {
47 headers: {
48 "Content-Type": "application/json"
49 }
50 }
51 }
52
53 } else {
54 # 404
55 "not found"
56 | metadata set --merge {
57 http.response: {
58 status: 404
59 }
60 }
61 }
62}