···
278
278
[[package]]
279
279
name = "atrium-api"
280
280
version = "0.25.4"
281
281
-
source = "registry+https://github.com/rust-lang/crates.io-index"
282
282
-
checksum = "46355d3245edc7b3160b2a45fe55d09a6963ebd3eee0252feb6b72fb0eb71463"
283
283
-
dependencies = [
284
284
-
"atrium-common 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
285
285
-
"atrium-xrpc 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
286
286
-
"chrono",
287
287
-
"http",
288
288
-
"ipld-core",
289
289
-
"langtag",
290
290
-
"regex",
291
291
-
"serde",
292
292
-
"serde_bytes",
293
293
-
"serde_json",
294
294
-
"thiserror 1.0.69",
295
295
-
"tokio",
296
296
-
"trait-variant",
297
297
-
]
298
298
-
299
299
-
[[package]]
300
300
-
name = "atrium-api"
301
301
-
version = "0.25.4"
302
281
source = "git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace#80a355991ac9b48ba3f559d12aac74f071fc638c"
303
282
dependencies = [
304
304
-
"atrium-common 0.1.2 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
305
305
-
"atrium-xrpc 0.12.3 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
283
283
+
"atrium-common",
284
284
+
"atrium-xrpc",
306
285
"chrono",
307
286
"http",
308
287
"ipld-core",
···
319
298
[[package]]
320
299
name = "atrium-common"
321
300
version = "0.1.2"
322
322
-
source = "registry+https://github.com/rust-lang/crates.io-index"
323
323
-
checksum = "9ed5610654043faa396a5a15afac0ac646d76aebe45aebd7cef4f8b96b0ab7f4"
324
324
-
dependencies = [
325
325
-
"dashmap",
326
326
-
"lru",
327
327
-
"moka",
328
328
-
"thiserror 1.0.69",
329
329
-
"tokio",
330
330
-
"trait-variant",
331
331
-
"web-time",
332
332
-
]
333
333
-
334
334
-
[[package]]
335
335
-
name = "atrium-common"
336
336
-
version = "0.1.2"
337
301
source = "git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace#80a355991ac9b48ba3f559d12aac74f071fc638c"
338
302
dependencies = [
339
303
"dashmap",
···
361
325
[[package]]
362
326
name = "atrium-identity"
363
327
version = "0.1.5"
364
364
-
source = "registry+https://github.com/rust-lang/crates.io-index"
365
365
-
checksum = "c9e2d42bb4dbea038f4f5f45e3af2a89d61a9894a75f06aa550b74a60d2be380"
366
366
-
dependencies = [
367
367
-
"atrium-api 0.25.4 (registry+https://github.com/rust-lang/crates.io-index)",
368
368
-
"atrium-common 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
369
369
-
"atrium-xrpc 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
370
370
-
"serde",
371
371
-
"serde_html_form",
372
372
-
"serde_json",
373
373
-
"thiserror 1.0.69",
374
374
-
"trait-variant",
375
375
-
]
376
376
-
377
377
-
[[package]]
378
378
-
name = "atrium-identity"
379
379
-
version = "0.1.5"
380
328
source = "git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace#80a355991ac9b48ba3f559d12aac74f071fc638c"
381
329
dependencies = [
382
382
-
"atrium-api 0.25.4 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
383
383
-
"atrium-common 0.1.2 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
384
384
-
"atrium-xrpc 0.12.3 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
385
385
-
"serde",
386
386
-
"serde_html_form",
387
387
-
"serde_json",
388
388
-
"thiserror 1.0.69",
389
389
-
"trait-variant",
390
390
-
]
391
391
-
392
392
-
[[package]]
393
393
-
name = "atrium-oauth"
394
394
-
version = "0.1.3"
395
395
-
source = "registry+https://github.com/rust-lang/crates.io-index"
396
396
-
checksum = "ca22dc4eaf77fd9bf050b21192ac58cd654a437d28e000ec114ebd93a51d36f5"
397
397
-
dependencies = [
398
398
-
"atrium-api 0.25.4 (registry+https://github.com/rust-lang/crates.io-index)",
399
399
-
"atrium-common 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
400
400
-
"atrium-identity 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
401
401
-
"atrium-xrpc 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
402
402
-
"base64 0.22.1",
403
403
-
"chrono",
404
404
-
"dashmap",
405
405
-
"ecdsa",
406
406
-
"elliptic-curve",
407
407
-
"jose-jwa",
408
408
-
"jose-jwk",
409
409
-
"p256",
410
410
-
"rand 0.8.5",
411
411
-
"reqwest",
330
330
+
"atrium-api",
331
331
+
"atrium-common",
332
332
+
"atrium-xrpc",
412
333
"serde",
413
334
"serde_html_form",
414
335
"serde_json",
415
415
-
"sha2",
416
336
"thiserror 1.0.69",
417
417
-
"tokio",
418
337
"trait-variant",
419
338
]
420
339
···
423
342
version = "0.1.3"
424
343
source = "git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace#80a355991ac9b48ba3f559d12aac74f071fc638c"
425
344
dependencies = [
426
426
-
"atrium-api 0.25.4 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
427
427
-
"atrium-common 0.1.2 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
428
428
-
"atrium-identity 0.1.5 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
429
429
-
"atrium-xrpc 0.12.3 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
345
345
+
"atrium-api",
346
346
+
"atrium-common",
347
347
+
"atrium-identity",
348
348
+
"atrium-xrpc",
430
349
"base64 0.22.1",
431
350
"chrono",
432
351
"dashmap",
···
443
362
"sha2",
444
363
"thiserror 1.0.69",
445
364
"tokio",
446
446
-
"trait-variant",
447
447
-
]
448
448
-
449
449
-
[[package]]
450
450
-
name = "atrium-xrpc"
451
451
-
version = "0.12.3"
452
452
-
source = "registry+https://github.com/rust-lang/crates.io-index"
453
453
-
checksum = "0216ad50ce34e9ff982e171c3659e65dedaa2ed5ac2994524debdc9a9647ffa8"
454
454
-
dependencies = [
455
455
-
"http",
456
456
-
"serde",
457
457
-
"serde_html_form",
458
458
-
"serde_json",
459
459
-
"thiserror 1.0.69",
460
365
"trait-variant",
461
366
]
462
367
···
565
470
"axum",
566
471
"axum-core",
567
472
"bytes",
568
568
-
"cookie",
569
473
"form_urlencoded",
570
474
"futures-util",
571
475
"headers",
···
596
500
"pin-project-lite",
597
501
"tower-layer",
598
502
"tower-service",
599
599
-
]
600
600
-
601
601
-
[[package]]
602
602
-
name = "axum-template"
603
603
-
version = "3.0.0"
604
604
-
source = "registry+https://github.com/rust-lang/crates.io-index"
605
605
-
checksum = "3df50f7d669bfc3a8c348f08f536fe37e7acfbeded3cfdffd2ad3d76725fc40c"
606
606
-
dependencies = [
607
607
-
"axum",
608
608
-
"handlebars",
609
609
-
"serde",
610
610
-
"thiserror 2.0.16",
611
503
]
612
504
613
505
[[package]]
···
1085
977
]
1086
978
1087
979
[[package]]
1088
1088
-
name = "cookie"
1089
1089
-
version = "0.18.1"
1090
1090
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1091
1091
-
checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
1092
1092
-
dependencies = [
1093
1093
-
"base64 0.22.1",
1094
1094
-
"hmac",
1095
1095
-
"percent-encoding",
1096
1096
-
"rand 0.8.5",
1097
1097
-
"sha2",
1098
1098
-
"subtle",
1099
1099
-
"time",
1100
1100
-
"version_check",
1101
1101
-
]
1102
1102
-
1103
1103
-
[[package]]
1104
980
name = "core-foundation"
1105
981
version = "0.9.4"
1106
982
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1330
1206
checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
1331
1207
dependencies = [
1332
1208
"const-oid",
1333
1333
-
"pem-rfc7468",
1334
1209
"zeroize",
1335
1210
]
1336
1211
···
1359
1234
]
1360
1235
1361
1236
[[package]]
1362
1362
-
name = "derive_builder"
1363
1363
-
version = "0.20.2"
1364
1364
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1365
1365
-
checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947"
1366
1366
-
dependencies = [
1367
1367
-
"derive_builder_macro",
1368
1368
-
]
1369
1369
-
1370
1370
-
[[package]]
1371
1371
-
name = "derive_builder_core"
1372
1372
-
version = "0.20.2"
1373
1373
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1374
1374
-
checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
1375
1375
-
dependencies = [
1376
1376
-
"darling",
1377
1377
-
"proc-macro2",
1378
1378
-
"quote",
1379
1379
-
"syn",
1380
1380
-
]
1381
1381
-
1382
1382
-
[[package]]
1383
1383
-
name = "derive_builder_macro"
1384
1384
-
version = "0.20.2"
1385
1385
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1386
1386
-
checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
1387
1387
-
dependencies = [
1388
1388
-
"derive_builder_core",
1389
1389
-
"syn",
1390
1390
-
]
1391
1391
-
1392
1392
-
[[package]]
1393
1237
name = "derive_more"
1394
1238
version = "2.0.1"
1395
1239
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1569
1413
"ff",
1570
1414
"generic-array",
1571
1415
"group",
1572
1572
-
"pem-rfc7468",
1573
1416
"pkcs8",
1574
1417
"rand_core 0.6.4",
1575
1418
"sec1",
···
2151
1994
]
2152
1995
2153
1996
[[package]]
2154
2154
-
name = "handlebars"
2155
2155
-
version = "6.3.2"
2156
2156
-
source = "registry+https://github.com/rust-lang/crates.io-index"
2157
2157
-
checksum = "759e2d5aea3287cb1190c8ec394f42866cb5bf74fcbf213f354e3c856ea26098"
2158
2158
-
dependencies = [
2159
2159
-
"derive_builder",
2160
2160
-
"log",
2161
2161
-
"num-order",
2162
2162
-
"pest",
2163
2163
-
"pest_derive",
2164
2164
-
"serde",
2165
2165
-
"serde_json",
2166
2166
-
"thiserror 2.0.16",
2167
2167
-
"walkdir",
2168
2168
-
]
2169
2169
-
2170
2170
-
[[package]]
2171
1997
name = "hashbrown"
2172
1998
version = "0.12.3"
2173
1999
source = "registry+https://github.com/rust-lang/crates.io-index"
···
2791
2617
dependencies = [
2792
2618
"anyhow",
2793
2619
"async-trait",
2794
2794
-
"atrium-api 0.25.4 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
2620
2620
+
"atrium-api",
2795
2621
"chrono",
2796
2622
"clap",
2797
2623
"futures-util",
···
2870
2696
"jose-b64",
2871
2697
"jose-jwa",
2872
2698
"p256",
2873
2873
-
"p384",
2874
2874
-
"rsa",
2875
2699
"serde",
2876
2700
"zeroize",
2877
2701
]
···
2887
2711
]
2888
2712
2889
2713
[[package]]
2890
2890
-
name = "jsonwebtoken"
2891
2891
-
version = "9.3.1"
2892
2892
-
source = "registry+https://github.com/rust-lang/crates.io-index"
2893
2893
-
checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde"
2894
2894
-
dependencies = [
2895
2895
-
"base64 0.22.1",
2896
2896
-
"js-sys",
2897
2897
-
"pem",
2898
2898
-
"ring",
2899
2899
-
"serde",
2900
2900
-
"serde_json",
2901
2901
-
"simple_asn1",
2902
2902
-
]
2903
2903
-
2904
2904
-
[[package]]
2905
2714
name = "jwt-compact"
2906
2715
version = "0.9.0-beta.1"
2907
2716
source = "git+https://github.com/fatfingers23/jwt-compact.git#aed088b8ff5ad44ef2785c453f6a4b7916728b1c"
···
2948
2757
version = "1.5.0"
2949
2758
source = "registry+https://github.com/rust-lang/crates.io-index"
2950
2759
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
2951
2951
-
dependencies = [
2952
2952
-
"spin",
2953
2953
-
]
2954
2760
2955
2761
[[package]]
2956
2762
name = "lazycell"
···
3501
3307
]
3502
3308
3503
3309
[[package]]
3504
3504
-
name = "num-bigint-dig"
3505
3505
-
version = "0.8.6"
3506
3506
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3507
3507
-
checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7"
3508
3508
-
dependencies = [
3509
3509
-
"lazy_static",
3510
3510
-
"libm",
3511
3511
-
"num-integer",
3512
3512
-
"num-iter",
3513
3513
-
"num-traits",
3514
3514
-
"rand 0.8.5",
3515
3515
-
"smallvec",
3516
3516
-
"zeroize",
3517
3517
-
]
3518
3518
-
3519
3519
-
[[package]]
3520
3310
name = "num-conv"
3521
3311
version = "0.2.0"
3522
3312
source = "registry+https://github.com/rust-lang/crates.io-index"
···
3542
3332
]
3543
3333
3544
3334
[[package]]
3545
3545
-
name = "num-iter"
3546
3546
-
version = "0.1.45"
3547
3547
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3548
3548
-
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
3549
3549
-
dependencies = [
3550
3550
-
"autocfg",
3551
3551
-
"num-integer",
3552
3552
-
"num-traits",
3553
3553
-
]
3554
3554
-
3555
3555
-
[[package]]
3556
3556
-
name = "num-modular"
3557
3557
-
version = "0.6.1"
3558
3558
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3559
3559
-
checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f"
3560
3560
-
3561
3561
-
[[package]]
3562
3562
-
name = "num-order"
3563
3563
-
version = "1.2.0"
3564
3564
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3565
3565
-
checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6"
3566
3566
-
dependencies = [
3567
3567
-
"num-modular",
3568
3568
-
]
3569
3569
-
3570
3570
-
[[package]]
3571
3335
name = "num-traits"
3572
3336
version = "0.2.19"
3573
3337
source = "registry+https://github.com/rust-lang/crates.io-index"
3574
3338
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
3575
3339
dependencies = [
3576
3340
"autocfg",
3577
3577
-
"libm",
3578
3341
]
3579
3342
3580
3343
[[package]]
···
3702
3465
]
3703
3466
3704
3467
[[package]]
3705
3705
-
name = "p384"
3706
3706
-
version = "0.13.1"
3707
3707
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3708
3708
-
checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6"
3709
3709
-
dependencies = [
3710
3710
-
"elliptic-curve",
3711
3711
-
"primeorder",
3712
3712
-
]
3713
3713
-
3714
3714
-
[[package]]
3715
3468
name = "parking"
3716
3469
version = "2.2.1"
3717
3470
source = "registry+https://github.com/rust-lang/crates.io-index"
···
3775
3528
]
3776
3529
3777
3530
[[package]]
3778
3778
-
name = "pem-rfc7468"
3779
3779
-
version = "0.7.0"
3780
3780
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3781
3781
-
checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
3782
3782
-
dependencies = [
3783
3783
-
"base64ct",
3784
3784
-
]
3785
3785
-
3786
3786
-
[[package]]
3787
3531
name = "percent-encoding"
3788
3532
version = "2.3.1"
3789
3533
source = "registry+https://github.com/rust-lang/crates.io-index"
3790
3534
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
3791
3535
3792
3536
[[package]]
3793
3793
-
name = "pest"
3794
3794
-
version = "2.8.1"
3795
3795
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3796
3796
-
checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323"
3797
3797
-
dependencies = [
3798
3798
-
"memchr",
3799
3799
-
"thiserror 2.0.16",
3800
3800
-
"ucd-trie",
3801
3801
-
]
3802
3802
-
3803
3803
-
[[package]]
3804
3804
-
name = "pest_derive"
3805
3805
-
version = "2.8.1"
3806
3806
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3807
3807
-
checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc"
3808
3808
-
dependencies = [
3809
3809
-
"pest",
3810
3810
-
"pest_generator",
3811
3811
-
]
3812
3812
-
3813
3813
-
[[package]]
3814
3814
-
name = "pest_generator"
3815
3815
-
version = "2.8.1"
3816
3816
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3817
3817
-
checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966"
3818
3818
-
dependencies = [
3819
3819
-
"pest",
3820
3820
-
"pest_meta",
3821
3821
-
"proc-macro2",
3822
3822
-
"quote",
3823
3823
-
"syn",
3824
3824
-
]
3825
3825
-
3826
3826
-
[[package]]
3827
3827
-
name = "pest_meta"
3828
3828
-
version = "2.8.1"
3829
3829
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3830
3830
-
checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5"
3831
3831
-
dependencies = [
3832
3832
-
"pest",
3833
3833
-
"sha2",
3834
3834
-
]
3835
3835
-
3836
3836
-
[[package]]
3837
3537
name = "pin-project"
3838
3538
version = "1.1.10"
3839
3539
source = "registry+https://github.com/rust-lang/crates.io-index"
···
3864
3564
version = "0.1.0"
3865
3565
source = "registry+https://github.com/rust-lang/crates.io-index"
3866
3566
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
3867
3867
-
3868
3868
-
[[package]]
3869
3869
-
name = "pkcs1"
3870
3870
-
version = "0.7.5"
3871
3871
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3872
3872
-
checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
3873
3873
-
dependencies = [
3874
3874
-
"der",
3875
3875
-
"pkcs8",
3876
3876
-
"spki",
3877
3877
-
]
3878
3567
3879
3568
[[package]]
3880
3569
name = "pkcs8"
···
4367
4056
]
4368
4057
4369
4058
[[package]]
4370
4370
-
name = "reflector"
4371
4371
-
version = "0.1.0"
4372
4372
-
dependencies = [
4373
4373
-
"clap",
4374
4374
-
"log",
4375
4375
-
"poem",
4376
4376
-
"serde",
4377
4377
-
"tokio",
4378
4378
-
"tracing-subscriber",
4379
4379
-
]
4380
4380
-
4381
4381
-
[[package]]
4382
4059
name = "regex"
4383
4060
version = "1.11.1"
4384
4061
source = "registry+https://github.com/rust-lang/crates.io-index"
···
4510
4187
dependencies = [
4511
4188
"libc",
4512
4189
"librocksdb-sys",
4513
4513
-
]
4514
4514
-
4515
4515
-
[[package]]
4516
4516
-
name = "rsa"
4517
4517
-
version = "0.9.10"
4518
4518
-
source = "registry+https://github.com/rust-lang/crates.io-index"
4519
4519
-
checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d"
4520
4520
-
dependencies = [
4521
4521
-
"const-oid",
4522
4522
-
"digest",
4523
4523
-
"num-bigint-dig",
4524
4524
-
"num-integer",
4525
4525
-
"num-traits",
4526
4526
-
"pkcs1",
4527
4527
-
"pkcs8",
4528
4528
-
"rand_core 0.6.4",
4529
4529
-
"signature",
4530
4530
-
"spki",
4531
4531
-
"subtle",
4532
4532
-
"zeroize",
4533
4190
]
4534
4191
4535
4192
[[package]]
···
4705
4362
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
4706
4363
4707
4364
[[package]]
4708
4708
-
name = "same-file"
4709
4709
-
version = "1.0.6"
4710
4710
-
source = "registry+https://github.com/rust-lang/crates.io-index"
4711
4711
-
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
4712
4712
-
dependencies = [
4713
4713
-
"winapi-util",
4714
4714
-
]
4715
4715
-
4716
4716
-
[[package]]
4717
4365
name = "schannel"
4718
4366
version = "0.1.27"
4719
4367
source = "registry+https://github.com/rust-lang/crates.io-index"
···
5074
4722
]
5075
4723
5076
4724
[[package]]
5077
5077
-
name = "simple_asn1"
5078
5078
-
version = "0.6.3"
5079
5079
-
source = "registry+https://github.com/rust-lang/crates.io-index"
5080
5080
-
checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb"
5081
5081
-
dependencies = [
5082
5082
-
"num-bigint",
5083
5083
-
"num-traits",
5084
5084
-
"thiserror 2.0.16",
5085
5085
-
"time",
5086
5086
-
]
5087
5087
-
5088
5088
-
[[package]]
5089
4725
name = "sketches-ddsketch"
5090
4726
version = "0.3.0"
5091
4727
source = "registry+https://github.com/rust-lang/crates.io-index"
···
5101
4737
name = "slingshot"
5102
4738
version = "0.1.0"
5103
4739
dependencies = [
5104
5104
-
"atrium-api 0.25.4 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
5105
5105
-
"atrium-common 0.1.2 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
5106
5106
-
"atrium-identity 0.1.5 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
5107
5107
-
"atrium-oauth 0.1.3 (git+https://github.com/uniphil/atrium.git?branch=fix%2Fresolve-handle-https-accept-whitespace)",
4740
4740
+
"atrium-api",
4741
4741
+
"atrium-common",
4742
4742
+
"atrium-identity",
4743
4743
+
"atrium-oauth",
5108
4744
"clap",
5109
4745
"ctrlc",
5110
4746
"foyer",
···
5854
5490
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
5855
5491
5856
5492
[[package]]
5857
5857
-
name = "ucd-trie"
5858
5858
-
version = "0.1.7"
5859
5859
-
source = "registry+https://github.com/rust-lang/crates.io-index"
5860
5860
-
checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
5861
5861
-
5862
5862
-
[[package]]
5863
5493
name = "ufos"
5864
5494
version = "0.1.0"
5865
5495
dependencies = [
···
6060
5690
]
6061
5691
6062
5692
[[package]]
6063
6063
-
name = "walkdir"
6064
6064
-
version = "2.5.0"
6065
6065
-
source = "registry+https://github.com/rust-lang/crates.io-index"
6066
6066
-
checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
6067
6067
-
dependencies = [
6068
6068
-
"same-file",
6069
6069
-
"winapi-util",
6070
6070
-
]
6071
6071
-
6072
6072
-
[[package]]
6073
5693
name = "want"
6074
5694
version = "0.3.1"
6075
5695
source = "registry+https://github.com/rust-lang/crates.io-index"
···
6197
5817
]
6198
5818
6199
5819
[[package]]
6200
6200
-
name = "who-am-i"
6201
6201
-
version = "0.1.0"
6202
6202
-
dependencies = [
6203
6203
-
"atrium-api 0.25.4 (registry+https://github.com/rust-lang/crates.io-index)",
6204
6204
-
"atrium-common 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
6205
6205
-
"atrium-identity 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
6206
6206
-
"atrium-oauth 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
6207
6207
-
"axum",
6208
6208
-
"axum-extra",
6209
6209
-
"axum-template",
6210
6210
-
"clap",
6211
6211
-
"ctrlc",
6212
6212
-
"dashmap",
6213
6213
-
"elliptic-curve",
6214
6214
-
"handlebars",
6215
6215
-
"hickory-resolver",
6216
6216
-
"jose-jwk",
6217
6217
-
"jsonwebtoken",
6218
6218
-
"metrics",
6219
6219
-
"metrics-exporter-prometheus 0.17.2",
6220
6220
-
"p256",
6221
6221
-
"pkcs8",
6222
6222
-
"rand 0.9.1",
6223
6223
-
"reqwest",
6224
6224
-
"serde",
6225
6225
-
"serde_json",
6226
6226
-
"thiserror 2.0.16",
6227
6227
-
"tokio",
6228
6228
-
"tokio-util",
6229
6229
-
"url",
6230
6230
-
]
6231
6231
-
6232
6232
-
[[package]]
6233
5820
name = "widestring"
6234
5821
version = "1.2.0"
6235
5822
source = "registry+https://github.com/rust-lang/crates.io-index"
···
6256
5843
version = "0.4.0"
6257
5844
source = "registry+https://github.com/rust-lang/crates.io-index"
6258
5845
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
6259
6259
-
6260
6260
-
[[package]]
6261
6261
-
name = "winapi-util"
6262
6262
-
version = "0.1.9"
6263
6263
-
source = "registry+https://github.com/rust-lang/crates.io-index"
6264
6264
-
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
6265
6265
-
dependencies = [
6266
6266
-
"windows-sys 0.59.0",
6267
6267
-
]
6268
5846
6269
5847
[[package]]
6270
5848
name = "winapi-x86_64-pc-windows-gnu"
···
34
34
[target.'cfg(not(target_env = "msvc"))'.dependencies]
35
35
tikv-jemallocator = "0.6.0"
36
36
37
37
+
[[bin]]
38
38
+
name = "analyze"
39
39
+
path = "src/bin/analyze.rs"
40
40
+
37
41
[dev-dependencies]
38
42
tempfile = "3.19.1"
···
1
1
+
use cardinality_estimator_safe::Sketch;
2
2
+
use chrono::{DateTime, Utc};
3
3
+
use clap::{Parser, Subcommand};
4
4
+
use fjall::{Config, PartitionCreateOptions, PartitionHandle};
5
5
+
use std::collections::BTreeMap;
6
6
+
use std::path::PathBuf;
7
7
+
use ufos::db_types::{db_complete, DbBytes};
8
8
+
use ufos::store_types::{
9
9
+
AllTimeRollupKey, AllTimeRollupStaticPrefix, CountsValue, WeekTruncatedCursor,
10
10
+
WeeklyRollupKey, WeeklyRollupStaticPrefix, WithCollection,
11
11
+
};
12
12
+
13
13
+
#[derive(Parser)]
14
14
+
#[command(about = "One-off data analysis of ufos rollup data")]
15
15
+
struct Cli {
16
16
+
/// Path to the fjall data directory
17
17
+
data: PathBuf,
18
18
+
#[command(subcommand)]
19
19
+
command: Command,
20
20
+
}
21
21
+
22
22
+
#[derive(Subcommand)]
23
23
+
enum Command {
24
24
+
/// Total estimated distinct users across all time and every group
25
25
+
TotalUsers,
26
26
+
/// Weekly estimated distinct users (excluding app.bsky.*/chat.bsky.*)
27
27
+
WeeklyUsers,
28
28
+
/// Weekly count of groups with >10 estimated distinct users (excluding app.bsky.*/chat.bsky.*)
29
29
+
WeeklyGroups,
30
30
+
/// Like weekly-groups but with the last NSID segment removed
31
31
+
WeeklyParents,
32
32
+
}
33
33
+
34
34
+
fn week_label(week: WeekTruncatedCursor) -> String {
35
35
+
let us = week.to_raw_u64();
36
36
+
let secs = (us / 1_000_000) as i64;
37
37
+
let dt = DateTime::<Utc>::from_timestamp(secs, 0).unwrap();
38
38
+
dt.format("%Y-%m-%d").to_string()
39
39
+
}
40
40
+
41
41
+
fn is_excluded(nsid: &str) -> bool {
42
42
+
nsid.starts_with("app.bsky.") || nsid.starts_with("chat.bsky.")
43
43
+
}
44
44
+
45
45
+
fn parent_prefix(nsid: &str) -> &str {
46
46
+
let Some((pre, _)) = nsid.rsplit_once('.') else {
47
47
+
eprintln!("no segments in nsid? nsid={nsid}");
48
48
+
return nsid;
49
49
+
};
50
50
+
pre
51
51
+
}
52
52
+
53
53
+
fn total_users(rollups: &PartitionHandle) -> anyhow::Result<()> {
54
54
+
eprintln!("scanning all-time rollups...");
55
55
+
let mut global_sketch = Sketch::<14>::default();
56
56
+
let mut all_time_count = 0u64;
57
57
+
let prefix_bytes = AllTimeRollupStaticPrefix::default().to_db_bytes()?;
58
58
+
for kv in rollups.prefix(prefix_bytes) {
59
59
+
let (key_bytes, val_bytes) = kv?;
60
60
+
let _key = db_complete::<AllTimeRollupKey>(&key_bytes)?;
61
61
+
let val = db_complete::<CountsValue>(&val_bytes)?;
62
62
+
global_sketch.merge(val.dids());
63
63
+
all_time_count += 1;
64
64
+
}
65
65
+
println!("groups scanned: {all_time_count}");
66
66
+
println!("estimated distinct users: {}", global_sketch.estimate());
67
67
+
Ok(())
68
68
+
}
69
69
+
70
70
+
/// Scan weekly rollups once, returning week -> (merged sketch, per-group entries)
71
71
+
/// Only non-excluded groups are included.
72
72
+
fn scan_weekly(
73
73
+
rollups: &PartitionHandle,
74
74
+
) -> anyhow::Result<BTreeMap<u64, (Sketch<14>, Vec<(String, u64)>)>> {
75
75
+
eprintln!("scanning weekly rollups...");
76
76
+
let mut weekly_data: BTreeMap<u64, (Sketch<14>, Vec<(String, u64)>)> = BTreeMap::new();
77
77
+
let prefix_bytes = WeeklyRollupStaticPrefix::default().to_db_bytes()?;
78
78
+
let mut scanned = 0u64;
79
79
+
for kv in rollups.prefix(prefix_bytes) {
80
80
+
let (key_bytes, val_bytes) = kv?;
81
81
+
let key = db_complete::<WeeklyRollupKey>(&key_bytes)?;
82
82
+
let val = db_complete::<CountsValue>(&val_bytes)?;
83
83
+
let week_us = key.cursor().to_raw_u64();
84
84
+
let nsid_str = key.collection().to_string();
85
85
+
let estimate = val.dids().estimate() as u64;
86
86
+
87
87
+
let entry = weekly_data
88
88
+
.entry(week_us)
89
89
+
.or_insert_with(|| (Sketch::<14>::default(), Vec::new()));
90
90
+
91
91
+
if !is_excluded(&nsid_str) {
92
92
+
entry.0.merge(val.dids());
93
93
+
entry.1.push((nsid_str, estimate));
94
94
+
}
95
95
+
96
96
+
scanned += 1;
97
97
+
if scanned % 500_000 == 0 {
98
98
+
eprintln!(" ...scanned {scanned} weekly entries");
99
99
+
}
100
100
+
}
101
101
+
eprintln!(" total weekly entries scanned: {scanned}");
102
102
+
Ok(weekly_data)
103
103
+
}
104
104
+
105
105
+
fn weekly_users(rollups: &PartitionHandle) -> anyhow::Result<()> {
106
106
+
let weekly_data = scan_weekly(rollups)?;
107
107
+
println!("{:<14} {:>12}", "week", "est_users");
108
108
+
for (&week_us, (sketch, _)) in &weekly_data {
109
109
+
let week = WeekTruncatedCursor::try_from_raw_u64(week_us)?;
110
110
+
println!("{:<14} {:>12}", week_label(week), sketch.estimate());
111
111
+
}
112
112
+
Ok(())
113
113
+
}
114
114
+
115
115
+
fn weekly_groups(rollups: &PartitionHandle) -> anyhow::Result<()> {
116
116
+
let weekly_data = scan_weekly(rollups)?;
117
117
+
println!("{:<14} {:>8}", "week", "groups");
118
118
+
for (&week_us, (_, entries)) in &weekly_data {
119
119
+
let week = WeekTruncatedCursor::try_from_raw_u64(week_us)?;
120
120
+
let count = entries.iter().filter(|(_, est)| *est > 10).count();
121
121
+
println!("{:<14} {:>8}", week_label(week), count);
122
122
+
}
123
123
+
Ok(())
124
124
+
}
125
125
+
126
126
+
fn weekly_parents(rollups: &PartitionHandle) -> anyhow::Result<()> {
127
127
+
let weekly_data = scan_weekly(rollups)?;
128
128
+
println!("{:<14} {:>8} top parent prefixes", "week", "parents");
129
129
+
for (&week_us, (_, entries)) in &weekly_data {
130
130
+
let week = WeekTruncatedCursor::try_from_raw_u64(week_us)?;
131
131
+
let mut parent_counts: BTreeMap<&str, usize> = BTreeMap::new();
132
132
+
for (nsid, est) in entries {
133
133
+
if *est > 10 {
134
134
+
let parent = parent_prefix(nsid);
135
135
+
*parent_counts.entry(parent).or_default() += 1;
136
136
+
}
137
137
+
}
138
138
+
let total_parents = parent_counts.len();
139
139
+
let mut sorted: Vec<_> = parent_counts.into_iter().collect();
140
140
+
sorted.sort_by(|a, b| b.1.cmp(&a.1));
141
141
+
let top: Vec<String> = sorted
142
142
+
.iter()
143
143
+
.take(5)
144
144
+
.map(|(prefix, count)| format!("{prefix}({count})"))
145
145
+
.collect();
146
146
+
println!(
147
147
+
"{:<14} {:>8} {}",
148
148
+
week_label(week),
149
149
+
total_parents,
150
150
+
top.join(", ")
151
151
+
);
152
152
+
}
153
153
+
Ok(())
154
154
+
}
155
155
+
156
156
+
fn main() -> anyhow::Result<()> {
157
157
+
let cli = Cli::parse();
158
158
+
159
159
+
eprintln!("opening db at {:?}...", cli.data);
160
160
+
let keyspace = Config::new(&cli.data).open()?;
161
161
+
let rollups = keyspace.open_partition("rollups", PartitionCreateOptions::default())?;
162
162
+
163
163
+
match cli.command {
164
164
+
Command::TotalUsers => total_users(&rollups),
165
165
+
Command::WeeklyUsers => weekly_users(&rollups),
166
166
+
Command::WeeklyGroups => weekly_groups(&rollups),
167
167
+
Command::WeeklyParents => weekly_parents(&rollups),
168
168
+
}
169
169
+
}