at protocol indexer with flexible filtering, xrpc queries, and a cursor-backed event stream, built on fjall
at-protocol atproto indexer rust fjall
at main 62 lines 1.9 kB view raw
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}