this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Initial commit.

alice 0ada3781

+526
+12
.editorconfig
··· 1 + # EditorConfig is awesome: https://EditorConfig.org 2 + 3 + # top-most EditorConfig file 4 + root = true 5 + 6 + [*] 7 + indent_style = space 8 + indent_size = 2 9 + end_of_line = lf 10 + charset = utf-8 11 + trim_trailing_whitespace = false 12 + insert_final_newline = true
+1
.env.example
··· 1 + # env variables
+3
.gitignore
··· 1 + node_modules 2 + .env 3 + bun.lockb
+1
.nvmrc
··· 1 + v22.9.0
+1
.prettierignore
··· 1 + # ...
+12
.prettierrc
··· 1 + { 2 + "trailingComma": "all", 3 + "tabWidth": 2, 4 + "semi": true, 5 + "singleQuote": true, 6 + "printWidth": 120, 7 + "experimentalTernaries": true, 8 + "plugins": ["@trivago/prettier-plugin-sort-imports"], 9 + "importOrder": ["^[./]"], 10 + "importOrderSeparation": true, 11 + "importOrderSortSpecifiers": true 12 + }
+21
LICENSE
··· 1 + MIT License 2 + 3 + Copyright (c) 2024 alice (aliceisjustplaying@gmail.com) 4 + 5 + Permission is hereby granted, free of charge, to any person obtaining a copy 6 + of this software and associated documentation files (the "Software"), to deal 7 + in the Software without restriction, including without limitation the rights 8 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 + copies of the Software, and to permit persons to whom the Software is 10 + furnished to do so, subject to the following conditions: 11 + 12 + The above copyright notice and this permission notice shall be included in all 13 + copies or substantial portions of the Software. 14 + 15 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 + SOFTWARE.
+9
README.md
··· 1 + # backfill perf issues minimal repro 2 + 3 + See output.txt for logs. Tested on an M1 Pro MBP on a symmetrical 150 Mbps network. 4 + 5 + To run: 6 + 7 + ``` 8 + bun start 9 + ```
+26
eslint.config.mjs
··· 1 + import eslint from '@eslint/js'; 2 + import tseslint from 'typescript-eslint'; 3 + 4 + export default tseslint.config( 5 + eslint.configs.recommended, 6 + ...tseslint.configs.strictTypeChecked, 7 + ...tseslint.configs.stylisticTypeChecked, 8 + { 9 + languageOptions: { 10 + parserOptions: { 11 + projectService: { 12 + allowDefaultProject: ['*.js'], 13 + defaultProject: 'tsconfig.json', 14 + }, 15 + }, 16 + }, 17 + rules: { 18 + '@typescript-eslint/no-non-null-assertion': 'off', 19 + '@typescript-eslint/restrict-template-expressions': 'off', 20 + }, 21 + }, 22 + { 23 + files: ['eslint.config.mjs'], 24 + extends: [tseslint.configs.disableTypeChecked], 25 + }, 26 + );
+282
output.txt
··· 1 + getRepo time for did:plc:r6akio77i3pqkgys47yiivag: 4733ms 2 + Read CAR time for did:plc:r6akio77i3pqkgys47yiivag: 5815ms 3 + Verify repo time for did:plc:r6akio77i3pqkgys47yiivag: 7677ms 4 + Processed 163308 records for did:plc:r6akio77i3pqkgys47yiivag in 694ms 5 + getRepo time for did:plc:ce6fuehfhulcdopg5yj5nyrf: 1414ms 6 + Read CAR time for did:plc:ce6fuehfhulcdopg5yj5nyrf: 198ms 7 + Verify repo time for did:plc:ce6fuehfhulcdopg5yj5nyrf: 220ms 8 + Processed 4452 records for did:plc:ce6fuehfhulcdopg5yj5nyrf in 25ms 9 + getRepo time for did:plc:6pucdwbxtitclryxknebkslo: 146ms 10 + Read CAR time for did:plc:6pucdwbxtitclryxknebkslo: 5ms 11 + Verify repo time for did:plc:6pucdwbxtitclryxknebkslo: 3ms 12 + Processed 24 records for did:plc:6pucdwbxtitclryxknebkslo in 0ms 13 + getRepo time for did:plc:emi6r6hfnk5hwocxvuhlk2fl: 168ms 14 + Read CAR time for did:plc:emi6r6hfnk5hwocxvuhlk2fl: 79ms 15 + Verify repo time for did:plc:emi6r6hfnk5hwocxvuhlk2fl: 55ms 16 + Processed 1171 records for did:plc:emi6r6hfnk5hwocxvuhlk2fl in 3ms 17 + getRepo time for did:plc:smhj7oe6nhrrgz2umogz72kl: 295ms 18 + Read CAR time for did:plc:smhj7oe6nhrrgz2umogz72kl: 234ms 19 + Verify repo time for did:plc:smhj7oe6nhrrgz2umogz72kl: 257ms 20 + Processed 5306 records for did:plc:smhj7oe6nhrrgz2umogz72kl in 20ms 21 + getRepo time for did:plc:hidclz2gor7x3qqrwufgpspi: 181ms 22 + Read CAR time for did:plc:hidclz2gor7x3qqrwufgpspi: 79ms 23 + Verify repo time for did:plc:hidclz2gor7x3qqrwufgpspi: 80ms 24 + Processed 1632 records for did:plc:hidclz2gor7x3qqrwufgpspi in 4ms 25 + getRepo time for did:plc:y7gglclacmud7ezblt2aywmw: 146ms 26 + Read CAR time for did:plc:y7gglclacmud7ezblt2aywmw: 14ms 27 + Verify repo time for did:plc:y7gglclacmud7ezblt2aywmw: 17ms 28 + Processed 264 records for did:plc:y7gglclacmud7ezblt2aywmw in 2ms 29 + getRepo time for did:plc:dhedzeyegexegnpslhncybpy: 144ms 30 + Read CAR time for did:plc:dhedzeyegexegnpslhncybpy: 19ms 31 + Verify repo time for did:plc:dhedzeyegexegnpslhncybpy: 14ms 32 + Processed 235 records for did:plc:dhedzeyegexegnpslhncybpy in 4ms 33 + getRepo time for did:plc:jn7bq3rucmuuzh6fvfsoonqp: 151ms 34 + Read CAR time for did:plc:jn7bq3rucmuuzh6fvfsoonqp: 18ms 35 + Verify repo time for did:plc:jn7bq3rucmuuzh6fvfsoonqp: 14ms 36 + Processed 210 records for did:plc:jn7bq3rucmuuzh6fvfsoonqp in 1ms 37 + Processed 10 repos in processRepo() 38 + getRepo time for did:plc:43bssld564esjbhwc3qqzbxv: 264ms 39 + Read CAR time for did:plc:43bssld564esjbhwc3qqzbxv: 178ms 40 + Verify repo time for did:plc:43bssld564esjbhwc3qqzbxv: 187ms 41 + Processed 3965 records for did:plc:43bssld564esjbhwc3qqzbxv in 36ms 42 + getRepo time for did:plc:k7ubqw25pdrsbdx2girloqxs: 13941ms 43 + Read CAR time for did:plc:k7ubqw25pdrsbdx2girloqxs: 9920ms 44 + Verify repo time for did:plc:k7ubqw25pdrsbdx2girloqxs: 3976ms 45 + Processed 41631 records for did:plc:k7ubqw25pdrsbdx2girloqxs in 118ms 46 + getRepo time for did:plc:es3xljgoujn3m3we25qn7txc: 1233ms 47 + Read CAR time for did:plc:es3xljgoujn3m3we25qn7txc: 141ms 48 + Verify repo time for did:plc:es3xljgoujn3m3we25qn7txc: 136ms 49 + Processed 3128 records for did:plc:es3xljgoujn3m3we25qn7txc in 13ms 50 + getRepo time for did:plc:hk47jonolbzsld7w7my27hkl: 145ms 51 + Read CAR time for did:plc:hk47jonolbzsld7w7my27hkl: 8ms 52 + Verify repo time for did:plc:hk47jonolbzsld7w7my27hkl: 6ms 53 + Processed 74 records for did:plc:hk47jonolbzsld7w7my27hkl in 0ms 54 + getRepo time for did:plc:i763oyyqqmpahwpcgpxxhrx3: 142ms 55 + Read CAR time for did:plc:i763oyyqqmpahwpcgpxxhrx3: 4ms 56 + Verify repo time for did:plc:i763oyyqqmpahwpcgpxxhrx3: 3ms 57 + Processed 10 records for did:plc:i763oyyqqmpahwpcgpxxhrx3 in 0ms 58 + getRepo time for did:plc:ypyqli7uhm7ybuunpwiei6nv: 154ms 59 + Read CAR time for did:plc:ypyqli7uhm7ybuunpwiei6nv: 12ms 60 + Verify repo time for did:plc:ypyqli7uhm7ybuunpwiei6nv: 11ms 61 + Processed 178 records for did:plc:ypyqli7uhm7ybuunpwiei6nv in 1ms 62 + getRepo time for did:plc:scdle3oulmn7vz66i2v5vhbr: 152ms 63 + Read CAR time for did:plc:scdle3oulmn7vz66i2v5vhbr: 16ms 64 + Verify repo time for did:plc:scdle3oulmn7vz66i2v5vhbr: 12ms 65 + Processed 137 records for did:plc:scdle3oulmn7vz66i2v5vhbr in 1ms 66 + getRepo time for did:plc:b5og5jprikvlkvydhrvzpc5d: 163ms 67 + Read CAR time for did:plc:b5og5jprikvlkvydhrvzpc5d: 69ms 68 + Verify repo time for did:plc:b5og5jprikvlkvydhrvzpc5d: 52ms 69 + Processed 1143 records for did:plc:b5og5jprikvlkvydhrvzpc5d in 4ms 70 + getRepo time for did:plc:wnxzs3oiacu3cpa26spchqqf: 297ms 71 + Read CAR time for did:plc:wnxzs3oiacu3cpa26spchqqf: 114ms 72 + Verify repo time for did:plc:wnxzs3oiacu3cpa26spchqqf: 75ms 73 + Processed 1564 records for did:plc:wnxzs3oiacu3cpa26spchqqf in 6ms 74 + getRepo time for did:plc:64wryzlmgayytf6s6gwaoywy: 160ms 75 + Read CAR time for did:plc:64wryzlmgayytf6s6gwaoywy: 41ms 76 + Verify repo time for did:plc:64wryzlmgayytf6s6gwaoywy: 34ms 77 + Processed 706 records for did:plc:64wryzlmgayytf6s6gwaoywy in 4ms 78 + Processed 20 repos in processRepo() 79 + getRepo time for did:plc:s5gh4domdysnrhm2mkrwfecd: 903ms 80 + Read CAR time for did:plc:s5gh4domdysnrhm2mkrwfecd: 1170ms 81 + Verify repo time for did:plc:s5gh4domdysnrhm2mkrwfecd: 1424ms 82 + Processed 33737 records for did:plc:s5gh4domdysnrhm2mkrwfecd in 112ms 83 + getRepo time for did:plc:mcn5lmfpbbiunmkmxppawuao: 178ms 84 + Read CAR time for did:plc:mcn5lmfpbbiunmkmxppawuao: 51ms 85 + Verify repo time for did:plc:mcn5lmfpbbiunmkmxppawuao: 45ms 86 + Processed 1105 records for did:plc:mcn5lmfpbbiunmkmxppawuao in 6ms 87 + getRepo time for did:plc:wxydhk4hys7vaytdpybnlbwz: 385ms 88 + Read CAR time for did:plc:wxydhk4hys7vaytdpybnlbwz: 418ms 89 + Verify repo time for did:plc:wxydhk4hys7vaytdpybnlbwz: 516ms 90 + Processed 12017 records for did:plc:wxydhk4hys7vaytdpybnlbwz in 39ms 91 + getRepo time for did:plc:nvc4t263o4mu24e5csdb5efo: 231ms 92 + Read CAR time for did:plc:nvc4t263o4mu24e5csdb5efo: 140ms 93 + Verify repo time for did:plc:nvc4t263o4mu24e5csdb5efo: 139ms 94 + Processed 3529 records for did:plc:nvc4t263o4mu24e5csdb5efo in 11ms 95 + getRepo time for did:plc:y767p6ievgizzcjuky4s2prr: 353ms 96 + Read CAR time for did:plc:y767p6ievgizzcjuky4s2prr: 398ms 97 + Verify repo time for did:plc:y767p6ievgizzcjuky4s2prr: 448ms 98 + Processed 10988 records for did:plc:y767p6ievgizzcjuky4s2prr in 35ms 99 + getRepo time for did:plc:lbxjnggr32bfcslnncnhvwru: 160ms 100 + Read CAR time for did:plc:lbxjnggr32bfcslnncnhvwru: 26ms 101 + Verify repo time for did:plc:lbxjnggr32bfcslnncnhvwru: 18ms 102 + Processed 246 records for did:plc:lbxjnggr32bfcslnncnhvwru in 1ms 103 + getRepo time for did:plc:astr6oa4htzkuwqpz266vl2c: 199ms 104 + Read CAR time for did:plc:astr6oa4htzkuwqpz266vl2c: 110ms 105 + Verify repo time for did:plc:astr6oa4htzkuwqpz266vl2c: 105ms 106 + Processed 2616 records for did:plc:astr6oa4htzkuwqpz266vl2c in 10ms 107 + getRepo time for did:plc:xdutqq5yeqsfj5anbxfoqcxt: 165ms 108 + Read CAR time for did:plc:xdutqq5yeqsfj5anbxfoqcxt: 46ms 109 + Verify repo time for did:plc:xdutqq5yeqsfj5anbxfoqcxt: 41ms 110 + Processed 1009 records for did:plc:xdutqq5yeqsfj5anbxfoqcxt in 6ms 111 + getRepo time for did:plc:ggss3ucd2xbtlfnq6oas2mrt: 289ms 112 + Read CAR time for did:plc:ggss3ucd2xbtlfnq6oas2mrt: 223ms 113 + Verify repo time for did:plc:ggss3ucd2xbtlfnq6oas2mrt: 229ms 114 + Processed 5245 records for did:plc:ggss3ucd2xbtlfnq6oas2mrt in 19ms 115 + getRepo time for did:plc:5glkr2agmuo6sjqkeryvcvg4: 360ms 116 + Read CAR time for did:plc:5glkr2agmuo6sjqkeryvcvg4: 376ms 117 + Verify repo time for did:plc:5glkr2agmuo6sjqkeryvcvg4: 423ms 118 + Processed 10658 records for did:plc:5glkr2agmuo6sjqkeryvcvg4 in 40ms 119 + Processed 30 repos in processRepo() 120 + getRepo time for did:plc:mpem54imud4dg5wnro5aagbt: 147ms 121 + Read CAR time for did:plc:mpem54imud4dg5wnro5aagbt: 4ms 122 + Verify repo time for did:plc:mpem54imud4dg5wnro5aagbt: 3ms 123 + Processed 7 records for did:plc:mpem54imud4dg5wnro5aagbt in 0ms 124 + getRepo time for did:plc:llhwpd7d5vtitjvjlixjnaxt: 155ms 125 + Read CAR time for did:plc:llhwpd7d5vtitjvjlixjnaxt: 33ms 126 + Verify repo time for did:plc:llhwpd7d5vtitjvjlixjnaxt: 25ms 127 + Processed 427 records for did:plc:llhwpd7d5vtitjvjlixjnaxt in 2ms 128 + getRepo time for did:plc:yl43fbklgkqbks56trwt6uqv: 145ms 129 + Read CAR time for did:plc:yl43fbklgkqbks56trwt6uqv: 14ms 130 + Verify repo time for did:plc:yl43fbklgkqbks56trwt6uqv: 12ms 131 + Processed 143 records for did:plc:yl43fbklgkqbks56trwt6uqv in 1ms 132 + getRepo time for did:plc:oocjsmur3itjclnqgfflkns7: 155ms 133 + Read CAR time for did:plc:oocjsmur3itjclnqgfflkns7: 19ms 134 + Verify repo time for did:plc:oocjsmur3itjclnqgfflkns7: 14ms 135 + Processed 149 records for did:plc:oocjsmur3itjclnqgfflkns7 in 1ms 136 + getRepo time for did:plc:2xdeg73lappfpgufblbhau35: 168ms 137 + Read CAR time for did:plc:2xdeg73lappfpgufblbhau35: 51ms 138 + Verify repo time for did:plc:2xdeg73lappfpgufblbhau35: 31ms 139 + Processed 650 records for did:plc:2xdeg73lappfpgufblbhau35 in 4ms 140 + getRepo time for did:plc:3fdnhemxrevki43fthievoc6: 160ms 141 + Read CAR time for did:plc:3fdnhemxrevki43fthievoc6: 22ms 142 + Verify repo time for did:plc:3fdnhemxrevki43fthievoc6: 16ms 143 + Processed 242 records for did:plc:3fdnhemxrevki43fthievoc6 in 1ms 144 + getRepo time for did:plc:3ys2pzxynozddi7mk34unayq: 146ms 145 + Read CAR time for did:plc:3ys2pzxynozddi7mk34unayq: 14ms 146 + Verify repo time for did:plc:3ys2pzxynozddi7mk34unayq: 9ms 147 + Processed 137 records for did:plc:3ys2pzxynozddi7mk34unayq in 1ms 148 + getRepo time for did:plc:3xo3lwnrrgcefeuhdpjlovrd: 169ms 149 + Read CAR time for did:plc:3xo3lwnrrgcefeuhdpjlovrd: 60ms 150 + Verify repo time for did:plc:3xo3lwnrrgcefeuhdpjlovrd: 42ms 151 + Processed 991 records for did:plc:3xo3lwnrrgcefeuhdpjlovrd in 3ms 152 + getRepo time for did:plc:lfefq5nxhalsy7wbnyflz7uk: 205ms 153 + Read CAR time for did:plc:lfefq5nxhalsy7wbnyflz7uk: 103ms 154 + Verify repo time for did:plc:lfefq5nxhalsy7wbnyflz7uk: 87ms 155 + Processed 2154 records for did:plc:lfefq5nxhalsy7wbnyflz7uk in 9ms 156 + getRepo time for did:plc:azk5p6es7epsbztfx6v4ohxs: 141ms 157 + Read CAR time for did:plc:azk5p6es7epsbztfx6v4ohxs: 4ms 158 + Verify repo time for did:plc:azk5p6es7epsbztfx6v4ohxs: 4ms 159 + Processed 55 records for did:plc:azk5p6es7epsbztfx6v4ohxs in 1ms 160 + Processed 40 repos in processRepo() 161 + getRepo time for did:plc:4zk62y66shpgvbvfvpwlrz3f: 143ms 162 + Read CAR time for did:plc:4zk62y66shpgvbvfvpwlrz3f: 11ms 163 + Verify repo time for did:plc:4zk62y66shpgvbvfvpwlrz3f: 10ms 164 + Processed 122 records for did:plc:4zk62y66shpgvbvfvpwlrz3f in 1ms 165 + getRepo time for did:plc:c6xb6wwptakp7gvokutgn5jx: 138ms 166 + Read CAR time for did:plc:c6xb6wwptakp7gvokutgn5jx: 1ms 167 + Verify repo time for did:plc:c6xb6wwptakp7gvokutgn5jx: 1ms 168 + Processed 5 records for did:plc:c6xb6wwptakp7gvokutgn5jx in 0ms 169 + getRepo time for did:plc:mmwvyacctu57y5irrdlo32t4: 159ms 170 + Read CAR time for did:plc:mmwvyacctu57y5irrdlo32t4: 30ms 171 + Verify repo time for did:plc:mmwvyacctu57y5irrdlo32t4: 21ms 172 + Processed 353 records for did:plc:mmwvyacctu57y5irrdlo32t4 in 2ms 173 + getRepo time for did:plc:24eepfcme344xsdjrxrz2bzn: 142ms 174 + Read CAR time for did:plc:24eepfcme344xsdjrxrz2bzn: 6ms 175 + Verify repo time for did:plc:24eepfcme344xsdjrxrz2bzn: 3ms 176 + Processed 29 records for did:plc:24eepfcme344xsdjrxrz2bzn in 0ms 177 + getRepo time for did:plc:qdeq3rvzfstn35yhqiafvxpc: 144ms 178 + Read CAR time for did:plc:qdeq3rvzfstn35yhqiafvxpc: 6ms 179 + Verify repo time for did:plc:qdeq3rvzfstn35yhqiafvxpc: 5ms 180 + Processed 50 records for did:plc:qdeq3rvzfstn35yhqiafvxpc in 0ms 181 + getRepo time for did:plc:k3ssaldboe2nqw6ptsnt3mwt: 139ms 182 + Read CAR time for did:plc:k3ssaldboe2nqw6ptsnt3mwt: 3ms 183 + Verify repo time for did:plc:k3ssaldboe2nqw6ptsnt3mwt: 4ms 184 + Processed 34 records for did:plc:k3ssaldboe2nqw6ptsnt3mwt in 0ms 185 + getRepo time for did:plc:dypupxec4d5bhnqnpw62cxwa: 138ms 186 + Read CAR time for did:plc:dypupxec4d5bhnqnpw62cxwa: 1ms 187 + Verify repo time for did:plc:dypupxec4d5bhnqnpw62cxwa: 0ms 188 + Processed 2 records for did:plc:dypupxec4d5bhnqnpw62cxwa in 0ms 189 + getRepo time for did:plc:tfwk43jrvxhkm3wap6ymssgh: 137ms 190 + Read CAR time for did:plc:tfwk43jrvxhkm3wap6ymssgh: 2ms 191 + Verify repo time for did:plc:tfwk43jrvxhkm3wap6ymssgh: 2ms 192 + Processed 14 records for did:plc:tfwk43jrvxhkm3wap6ymssgh in 0ms 193 + getRepo time for did:plc:ksqzgt2ne6dku3xxh3xh2e3a: 190ms 194 + Read CAR time for did:plc:ksqzgt2ne6dku3xxh3xh2e3a: 118ms 195 + Verify repo time for did:plc:ksqzgt2ne6dku3xxh3xh2e3a: 90ms 196 + Processed 1126 records for did:plc:ksqzgt2ne6dku3xxh3xh2e3a in 8ms 197 + getRepo time for did:plc:ydwciulkwkya2wdwqxbv646e: 142ms 198 + Read CAR time for did:plc:ydwciulkwkya2wdwqxbv646e: 7ms 199 + Verify repo time for did:plc:ydwciulkwkya2wdwqxbv646e: 2ms 200 + Processed 9 records for did:plc:ydwciulkwkya2wdwqxbv646e in 0ms 201 + Processed 50 repos in processRepo() 202 + getRepo time for did:plc:nkggso26bhwwmnrlih5ng5re: 149ms 203 + Read CAR time for did:plc:nkggso26bhwwmnrlih5ng5re: 7ms 204 + Verify repo time for did:plc:nkggso26bhwwmnrlih5ng5re: 3ms 205 + Processed 54 records for did:plc:nkggso26bhwwmnrlih5ng5re in 0ms 206 + getRepo time for did:plc:3q5xelgxuqe4z6izxzgjogow: 146ms 207 + Read CAR time for did:plc:3q5xelgxuqe4z6izxzgjogow: 8ms 208 + Verify repo time for did:plc:3q5xelgxuqe4z6izxzgjogow: 6ms 209 + Processed 114 records for did:plc:3q5xelgxuqe4z6izxzgjogow in 1ms 210 + getRepo time for did:plc:d6vrqcq7ezarjjbr7plsgpmw: 171ms 211 + Read CAR time for did:plc:d6vrqcq7ezarjjbr7plsgpmw: 1ms 212 + Verify repo time for did:plc:d6vrqcq7ezarjjbr7plsgpmw: 2ms 213 + Processed 11 records for did:plc:d6vrqcq7ezarjjbr7plsgpmw in 0ms 214 + getRepo time for did:plc:62glhj72tpytroi2svipdubh: 238ms 215 + Read CAR time for did:plc:62glhj72tpytroi2svipdubh: 159ms 216 + Verify repo time for did:plc:62glhj72tpytroi2svipdubh: 160ms 217 + Processed 3714 records for did:plc:62glhj72tpytroi2svipdubh in 20ms 218 + getRepo time for did:plc:kwjipywgm7dz6mgkifin7mhs: 140ms 219 + Read CAR time for did:plc:kwjipywgm7dz6mgkifin7mhs: 0ms 220 + Verify repo time for did:plc:kwjipywgm7dz6mgkifin7mhs: 0ms 221 + Processed 1 records for did:plc:kwjipywgm7dz6mgkifin7mhs in 0ms 222 + getRepo time for did:plc:ubqjk5kmnxs33hzldqkziyag: 139ms 223 + Read CAR time for did:plc:ubqjk5kmnxs33hzldqkziyag: 2ms 224 + Verify repo time for did:plc:ubqjk5kmnxs33hzldqkziyag: 2ms 225 + Processed 17 records for did:plc:ubqjk5kmnxs33hzldqkziyag in 0ms 226 + getRepo time for did:plc:ojgwn7cktch2cwltj2ujgc7o: 141ms 227 + Read CAR time for did:plc:ojgwn7cktch2cwltj2ujgc7o: 14ms 228 + Verify repo time for did:plc:ojgwn7cktch2cwltj2ujgc7o: 11ms 229 + Processed 170 records for did:plc:ojgwn7cktch2cwltj2ujgc7o in 1ms 230 + getRepo time for did:plc:lsbs7urbz5sicwcp2mzh64zf: 147ms 231 + Read CAR time for did:plc:lsbs7urbz5sicwcp2mzh64zf: 33ms 232 + Verify repo time for did:plc:lsbs7urbz5sicwcp2mzh64zf: 29ms 233 + Processed 571 records for did:plc:lsbs7urbz5sicwcp2mzh64zf in 1ms 234 + getRepo time for did:plc:w7cigxo5q5wwbev555mzy4bu: 516ms 235 + Read CAR time for did:plc:w7cigxo5q5wwbev555mzy4bu: 739ms 236 + Verify repo time for did:plc:w7cigxo5q5wwbev555mzy4bu: 884ms 237 + Processed 20515 records for did:plc:w7cigxo5q5wwbev555mzy4bu in 62ms 238 + getRepo time for did:plc:4qqizocrnriintskkh6trnzv: 3654ms 239 + Read CAR time for did:plc:4qqizocrnriintskkh6trnzv: 6177ms 240 + Verify repo time for did:plc:4qqizocrnriintskkh6trnzv: 8283ms 241 + Processed 170374 records for did:plc:4qqizocrnriintskkh6trnzv in 749ms 242 + Processed 60 repos in processRepo() 243 + getRepo time for did:plc:2lzahebnas6od6j6jfydwst7: 7746ms 244 + Read CAR time for did:plc:2lzahebnas6od6j6jfydwst7: 10580ms 245 + Verify repo time for did:plc:2lzahebnas6od6j6jfydwst7: 7292ms 246 + Processed 160512 records for did:plc:2lzahebnas6od6j6jfydwst7 in 688ms 247 + getRepo time for did:plc:3xmoxuheod2diavlgugwcnuu: 3273ms 248 + Read CAR time for did:plc:3xmoxuheod2diavlgugwcnuu: 3667ms 249 + Verify repo time for did:plc:3xmoxuheod2diavlgugwcnuu: 3005ms 250 + Processed 63598 records for did:plc:3xmoxuheod2diavlgugwcnuu in 228ms 251 + getRepo time for did:plc:4pxzo7tv3u7pu6dot5umuxyt: 3987ms 252 + Read CAR time for did:plc:4pxzo7tv3u7pu6dot5umuxyt: 7393ms 253 + Verify repo time for did:plc:4pxzo7tv3u7pu6dot5umuxyt: 4740ms 254 + Processed 106861 records for did:plc:4pxzo7tv3u7pu6dot5umuxyt in 437ms 255 + getRepo time for did:plc:6c7jijsbqdb5xue7txve77pb: 1634ms 256 + Read CAR time for did:plc:6c7jijsbqdb5xue7txve77pb: 635ms 257 + Verify repo time for did:plc:6c7jijsbqdb5xue7txve77pb: 712ms 258 + Processed 16471 records for did:plc:6c7jijsbqdb5xue7txve77pb in 68ms 259 + getRepo time for did:plc:buauewuqjtzyritkh5rmm2oq: 7623ms 260 + Read CAR time for did:plc:buauewuqjtzyritkh5rmm2oq: 14525ms 261 + Verify repo time for did:plc:buauewuqjtzyritkh5rmm2oq: 9201ms 262 + Processed 196243 records for did:plc:buauewuqjtzyritkh5rmm2oq in 998ms 263 + getRepo time for did:plc:cji6xm6ucnxxs3zkdoho5gta: 3494ms 264 + Read CAR time for did:plc:cji6xm6ucnxxs3zkdoho5gta: 4416ms 265 + Verify repo time for did:plc:cji6xm6ucnxxs3zkdoho5gta: 4460ms 266 + Processed 97350 records for did:plc:cji6xm6ucnxxs3zkdoho5gta in 335ms 267 + getRepo time for did:plc:bluftivdjfs2vog7d65mk2m7: 1674ms 268 + Read CAR time for did:plc:bluftivdjfs2vog7d65mk2m7: 686ms 269 + Verify repo time for did:plc:bluftivdjfs2vog7d65mk2m7: 766ms 270 + Processed 17481 records for did:plc:bluftivdjfs2vog7d65mk2m7 in 131ms 271 + getRepo time for did:plc:bsnnfhn6xxfoad4bunb5doue: 1563ms 272 + Read CAR time for did:plc:bsnnfhn6xxfoad4bunb5doue: 2475ms 273 + Verify repo time for did:plc:bsnnfhn6xxfoad4bunb5doue: 3211ms 274 + Processed 72057 records for did:plc:bsnnfhn6xxfoad4bunb5doue in 258ms 275 + getRepo time for did:plc:gm7skcfgfl6nsq3l7mp4xlrs: 300ms 276 + Read CAR time for did:plc:gm7skcfgfl6nsq3l7mp4xlrs: 250ms 277 + Verify repo time for did:plc:gm7skcfgfl6nsq3l7mp4xlrs: 280ms 278 + Processed 6314 records for did:plc:gm7skcfgfl6nsq3l7mp4xlrs in 24ms 279 + getRepo time for did:plc:ffqrmizoc5z6ly4vf3mhgwta: 3575ms 280 + Read CAR time for did:plc:ffqrmizoc5z6ly4vf3mhgwta: 5946ms 281 + Verify repo time for did:plc:ffqrmizoc5z6ly4vf3mhgwta: 4394ms 282 + Processed 97591 records for did:plc:ffqrmizoc5z6ly4vf3mhgwta in 414ms
+35
package.json
··· 1 + { 2 + "name": "name-goes-here", 3 + "version": "1.0.0", 4 + "description": "description-goes-here", 5 + "main": "src/index.ts", 6 + "type": "module", 7 + "scripts": { 8 + "start": "bunx tsx src/index.ts", 9 + "dev": "bunx --watch src/index.ts", 10 + "format": "bunx prettier --write .", 11 + "lint": "bunx eslint .", 12 + "lint:fix": "bunx eslint --fix ." 13 + }, 14 + "dependencies": { 15 + "@atproto/api": "^0.13.12", 16 + "@atproto/repo": "^0.5.3", 17 + "@types/express": "^5.0.0", 18 + "dotenv": "^16.4.5", 19 + "express": "^4.21.1", 20 + "prom-client": "^15.1.3" 21 + }, 22 + "devDependencies": { 23 + "@eslint/js": "^9.12.0", 24 + "@trivago/prettier-plugin-sort-imports": "^4.3.0", 25 + "@types/eslint__js": "^8.42.3", 26 + "@types/node": "^22.7.5", 27 + "eslint": "^9.12.0", 28 + "prettier": "^3.3.3", 29 + "tsx": "^4.19.1", 30 + "typescript": "^5.6.3", 31 + "typescript-eslint": "^8.9.0" 32 + }, 33 + "author": "alice", 34 + "license": "MIT" 35 + }
+112
src/index.ts
··· 1 + /* eslint-disable @typescript-eslint/use-unknown-in-catch-callback-variable */ 2 + 3 + /* eslint-disable @typescript-eslint/no-unused-vars */ 4 + 5 + /* eslint-disable @typescript-eslint/no-unsafe-assignment */ 6 + import { AtpAgent } from '@atproto/api'; 7 + import { cborToLexRecord, readCarWithRoot, verifyRepo } from '@atproto/repo'; 8 + import express from 'express'; 9 + import { Registry, collectDefaultMetrics } from 'prom-client'; 10 + 11 + const register = new Registry(); 12 + collectDefaultMetrics({ register }); 13 + 14 + const app = express(); 15 + 16 + app.get('/metrics', (req, res) => { 17 + register 18 + .metrics() 19 + .then((metrics) => { 20 + res.set('Content-Type', register.contentType); 21 + res.send(metrics); 22 + }) 23 + .catch((ex: unknown) => { 24 + console.error(`Error serving metrics: ${(ex as Error).message}`); 25 + res.status(500).end((ex as Error).message); 26 + }); 27 + }); 28 + 29 + const server = app.listen(9999, '127.0.0.1', () => { 30 + console.log(`Metrics server listening on port 9999`); 31 + }); 32 + 33 + server.on('close', () => { 34 + console.log('Metrics server closed.'); 35 + }); 36 + 37 + const RELAY_URL = 'https://bsky.network'; 38 + const relayAgent = new AtpAgent({ service: RELAY_URL }); 39 + 40 + let processedRepoCount = 0; 41 + async function processRepo({ did }: { did: string }) { 42 + try { 43 + processedRepoCount += 1; 44 + if (processedRepoCount % 10 === 0) { 45 + console.log('Processed ', processedRepoCount, ' repos in processRepo()'); 46 + } 47 + try { 48 + const fetchStartTime = performance.now(); 49 + const res = await relayAgent.com.atproto.sync.getRepo({ did: did }); 50 + const fetchEndTime = performance.now(); 51 + console.log(`getRepo time for ${did}: ${(fetchEndTime - fetchStartTime).toFixed(0)}ms`); 52 + 53 + if (!res.success) { 54 + console.error(`Failed to getRepo ${did}`, res); 55 + return; 56 + } 57 + 58 + const readStartTime = performance.now(); 59 + 60 + const { root, blocks } = await readCarWithRoot(res.data); 61 + const readEndTime = performance.now(); 62 + console.log(`Read CAR time for ${did}: ${(readEndTime - readStartTime).toFixed(0)}ms`); 63 + 64 + const verifyStartTime = performance.now(); 65 + const repo = await verifyRepo(blocks, root, did); 66 + const verifyEndTime = performance.now(); 67 + console.log(`Verify repo time for ${did}: ${(verifyEndTime - verifyStartTime).toFixed(0)}ms`); 68 + 69 + const processStartTime = performance.now(); 70 + let processedRecords = 0; 71 + 72 + for (const { collection, rkey, cid } of repo.creates) { 73 + const uri = `at://${did}/${collection}/${rkey}`; 74 + 75 + const recordBytes = blocks.get(cid); 76 + if (!recordBytes) continue; 77 + const record = cborToLexRecord(recordBytes); 78 + 79 + processedRecords++; 80 + } 81 + 82 + const processEndTime = performance.now(); 83 + console.log( 84 + `Processed ${processedRecords} records for ${did} in ${(processEndTime - processStartTime).toFixed(0)}ms`, 85 + ); 86 + } catch (e) { 87 + console.error(`Failed to process repo ${did}`, e); 88 + } 89 + } catch (error) { 90 + console.error(`Failed to process repo ${did}`, error); 91 + } 92 + } 93 + 94 + async function backfill() { 95 + const res = await fetch(`${RELAY_URL}/xrpc/com.atproto.sync.listRepos`); 96 + const data = await res.json(); 97 + const { repos } = data as { repos: unknown[] }; 98 + 99 + for (const repo of repos) { 100 + if (typeof repo !== 'object' || !repo || !['did', 'head', 'rev'].every((k) => k in repo)) { 101 + console.error(`Invalid repo object`, repo); 102 + continue; 103 + } 104 + try { 105 + await processRepo(repo as { did: string }); 106 + } catch (error: unknown) { 107 + console.error(`Failed to process repo`, error); 108 + } 109 + } 110 + } 111 + 112 + backfill().catch(console.error);
+11
tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "strict": true, 4 + "target": "ESNext", 5 + "module": "NodeNext", 6 + "moduleResolution": "NodeNext", 7 + "allowSyntheticDefaultImports": true, 8 + "esModuleInterop": true, 9 + "types": ["node"] 10 + } 11 + }