Diagnostics for atproto PDS hosts, DIDs, and handles: https://debug.hose.cam

more ui tweaks

Changed files
+530 -506
+530 -506
index.html
··· 220 220 params: { limit: 100 }, 221 221 }); 222 222 this.accounts = accountsRes.repos; 223 - this.accountsComplete == !accountsRes.cursor; 223 + 224 + // weird thing with the ref pds: it *always* has a cursor on the first page 225 + if (accountsRes.cursor) { 226 + // so grab a second page just to see if there really is a second page 227 + try { 228 + const secondPage = await query('com.atproto.sync.listRepos', { 229 + params: { limit: 1, cursor: accountsRes.cursor }, 230 + }); 231 + this.accountsComplete = !secondPage.cursor || secondPage.repos.length == 0; 232 + } catch (e) { 233 + // we're in a niche spot. ignore errors and look at the original (faulty) cursor 234 + this.accountsComplete = !accountsRes.cursor; // 🤷‍♀️ 235 + } 236 + } else { 237 + this.accountsComplete = true; 238 + } 239 + 224 240 } catch (e) { 225 241 if (window.isXrpcErr(e)) { 226 242 this.error = e.error; ··· 554 570 }) 555 571 </script> 556 572 </head> 557 - <body x-data="debug"> 558 - <div class="hero bg-base-200"> 573 + <body x-data="debug" class="bg-base-200"> 574 + <div class="hero bg-base-200 p-8"> 559 575 <div class="hero-content flex-col"> 560 - <h1>PDS Debugger</h1> 576 + <h1 class="text-2xl mb-8">PDS Debugger</h1> 577 + <form @submit.prevent="await diagnose()"> 578 + <label class="text-sm text-primary" for="identifier"> 579 + atproto handle, DID, or HTTPS PDS URL 580 + </label> 581 + <br/> 582 + <div class="join"> 583 + <input 584 + id="identifier" 585 + class="input join-item" 586 + x-model="identifier" 587 + :disabled="identifierLoading" 588 + autofocus 589 + /> 590 + <button 591 + class="btn btn-primary join-item" 592 + type="submit" 593 + >go</button> 594 + </div> 595 + </form> 596 + </div> 597 + </div> 598 + 599 + <div class="w-full max-w-lg mx-auto"> 600 + <template x-if="identifierError"> 601 + <p>uh oh: <span x-text="identifierError"></span></p> 602 + </template> 561 603 562 - <p class="text-sm">Work in progress!</p> 563 - <details class="text-xs"> 564 - <summary>Future features</summary> 565 - <ul class="list-disc pl-4"> 566 - <li>firehose & jetstream listeners</li> 567 - </ul> 568 - </details> 569 - <details class="text-xs"> 570 - <summary>Limitations</summary> 571 - <ul class="list-disc pl-4"> 572 - <li>The Bluesky production relay at <code>bsky.network</code> runs the old bgs implementation, and is missing many relay XRPC endpoints.</li> 573 - <li>The Blacksky relay at <code>atproto.africa</code> runs an independent implementation, and is also missing many relay XRPC endpoints.</li> 574 - <li>All diagnostics run in your browser, so servers that don't enable CORS (some PDS hosts, Upcloud's relay) will fail tests.</li> 575 - </ul> 576 - </details> 604 + <template x-if="pds != null"> 577 605 578 - <div class="card bg-base-100 w-full max-w-sm shrink-0 shadow-2xl"> 606 + <div class="card bg-base-100 w-full max-w-2xl shrink-0 shadow-2xl m-4"> 579 607 <div class="card-body"> 580 - <form @submit.prevent="await diagnose()"> 581 - <label> 582 - Enter an atproto handle, DID, or HTTPS PDS URL 583 - <input 584 - class="input" 585 - x-model="identifier" 586 - :disabled="identifierLoading" 587 - autofocus 588 - /> 589 - </label> 590 - </form> 591 - </div> 592 - </div> 608 + <h2 class="card-title"> 609 + <span class="badge badge-secondary">PDS</span> 610 + <span x-text="pds"></span> 611 + </h2> 593 612 594 - <template x-if="identifierError"> 595 - <p>uh oh: <span x-text="identifierError"></span></p> 596 - </template> 613 + <div 614 + x-data="pdsCheck(pds)" 615 + x-init="$watch('pds', v => update(v))" 616 + > 617 + <h3 class="text-lg mt-3"> 618 + Server 619 + <span 620 + x-show="description !== null" 621 + class="badge badge-sm badge-soft badge-success" 622 + >online</span> 623 + </h3> 624 + <p x-show="loadingDesc">Loading&hellip;</p> 625 + <p x-show="error" class="text-warning" x-text="error"></p> 626 + <template x-if="description !== null"> 627 + <div> 628 + <div class="overflow-x-auto"> 629 + <table class="table table-xs"> 630 + <tbody> 631 + <tr> 632 + <td class="text-sm"> 633 + Open registration: 634 + <span 635 + x-text="!description.inviteCodeRequired" 636 + ></span> 637 + </td> 638 + </tr> 639 + <tr> 640 + <td class="text-sm"> 641 + Version: 642 + <code 643 + class="text-xs" 644 + x-text="version" 645 + ></code> 646 + </td> 647 + </tr> 648 + </tbody> 649 + </table> 650 + </div> 651 + <h4 class="font-bold"> 652 + Accounts 653 + </h4> 654 + <div class="overflow-x-auto overflow-y-auto max-h-26"> 655 + <table class="table table-xs"> 656 + <tbody> 657 + <template x-for="account in accounts"> 658 + <tr> 659 + <td> 660 + <code> 661 + <a 662 + href="#" 663 + class="link" 664 + x-text="account.did" 665 + @click.prevent="goto(account.did)" 666 + ></a> 667 + </code> 668 + </td> 669 + <td> 670 + <span 671 + x-show="account.active" 672 + class="badge badge-sm badge-soft badge-success" 673 + > 674 + active 675 + </span> 676 + <span 677 + x-show="!account.active" 678 + x-text="account.status" 679 + class="badge badge-sm badge-soft badge-warning" 680 + ></span> 681 + </td> 682 + <td 683 + x-data="didToHandle(account.did)" 684 + x-intersect:enter.once="load" 685 + > 686 + <span x-show="loading">Loading&hellip;</span> 687 + <span x-show="error !== null" x-text="error"></span> 688 + <a 689 + href="#" 690 + class="link" 691 + @click.prevent="goto(handle)" 692 + x-show="handle !== null" 693 + x-text="`@${handle}`" 694 + ></a> 695 + </td> 696 + </tr> 697 + </template> 698 + <template x-if="!loadingDesc && !accountsComplete"> 699 + <tr> 700 + <td colspan="2" class="text-xs text-warning-content"> 701 + (more accounts not shown) 702 + </td> 703 + </tr> 704 + </template> 705 + </tbody> 706 + </table> 707 + </div> 708 + </div> 709 + </template> 710 + </div> 597 711 598 - <template x-if="pds != null"> 599 - <div class="card bg-base-100 w-full max-w-lg shrink-0 shadow-2xl"> 600 - <div class="card-body"> 601 - <h2 class="card-title"> 602 - <span class="badge badge-secondary">PDS</span> 603 - <span x-text="pds"></span> 604 - </h2> 712 + <h3 class="text-lg mt-3">Relay host status</h3> 713 + <div class="overflow-x-auto"> 714 + <table class="table table-xs"> 715 + <tbody> 716 + <template x-for="relay in window.relays"> 717 + <tr 718 + x-data="relayCheckHost(pds, relay)" 719 + x-init="$watch('pds', pds => check(pds, relay))" 720 + > 721 + <td class="text-sm"> 722 + <div class="tooltip tooltip-right" :data-tip="relay.hostname"> 723 + <img 724 + class="inline-block h-4 w-4" 725 + :src="relay.icon" 726 + alt="" 727 + /> 728 + <span x-text="relay.name"></span> 729 + <span 730 + x-show="!!relay.note" 731 + x-text="relay.note" 732 + class="badge badge-soft badge-neutral badge-xs" 733 + ></span> 734 + </div> 735 + </td> 736 + <td> 737 + <template x-if="loading"> 738 + <em>loading&hellip;</em> 739 + </template> 740 + <template x-if="error"> 741 + <div 742 + class="text-xs" 743 + :class="expectedErrorInfo 744 + ? 'text-info tooltip tooltip-left cursor-help' 745 + : 'text-warning'" 746 + :data-tip="expectedErrorInfo" 747 + > 748 + <span x-text="error"></span> 749 + <span 750 + x-show="!!expectedErrorInfo" 751 + class="badge badge-soft badge-info badge-xs" 752 + >i</span> 753 + </div> 754 + </template> 755 + <template x-if="status"> 756 + <span 757 + x-text="status" 758 + class="badge badge-sm" 759 + :class="status === 'active' && 'badge-soft badge-success'" 760 + ></span> 761 + </template> 762 + </td> 763 + <td> 764 + <div x-show="status !== 'active' && !expectedErrorInfo"> 765 + <button 766 + x-show="reqCrawlStatus !== 'done'" 767 + class="btn btn-xs btn-ghost whitespace-nowrap" 768 + :disabled="reqCrawlStatus === 'loading'" 769 + @click="requestCrawl(pds, relay)" 770 + > 771 + request crawl 772 + </button> 773 + <span 774 + x-show="reqCrawlError !== null" 775 + x-text="reqCrawlError" 776 + class="text-xs text-warning" 777 + ></span> 778 + <button 779 + x-show="reqCrawlError === null && reqCrawlStatus === 'done'" 780 + class="btn btn-xs btn-soft btn-primary whitespace-nowrap" 781 + @click="check" 782 + > 783 + refresh 784 + </button> 785 + </div> 786 + </td> 787 + </tr> 788 + </template> 789 + </tbody> 790 + </table> 791 + </div> 792 + </div> 793 + </div> 794 + </template> 605 795 606 - <div 607 - x-data="pdsCheck(pds)" 608 - x-init="$watch('pds', v => update(v))" 609 - > 796 + <template x-if="did != null"> 797 + <div class="card bg-base-100 w-full max-w-2xl shrink-0 shadow-2xl m-4"> 798 + <div class="card-body"> 799 + <h2 class="card-title"> 800 + <span class="badge badge-secondary">DID</span> 801 + <code x-text="did"></code> 802 + </h2> 803 + <template x-if="pds != null"> 804 + <div x-data="didRepoState(did, pds)"> 610 805 <h3 class="text-lg mt-3"> 611 - Server 806 + Repo 612 807 <span 613 - x-show="description !== null" 808 + x-show="state && state.active" 614 809 class="badge badge-sm badge-soft badge-success" 615 - >online</span> 810 + >active</span> 616 811 </h3> 617 - <p x-show="loadingDesc">Loading&hellip;</p> 618 - <p x-show="error" class="text-warning" x-text="error"></p> 619 - <template x-if="description !== null"> 620 - <div> 621 - <div class="overflow-x-auto"> 622 - <table class="table table-xs"> 623 - <tbody> 624 - <tr> 625 - <td class="text-sm"> 626 - Open registration: 812 + <div class="overflow-x-auto"> 813 + <table class="table table-xs"> 814 + <tbody> 815 + <tr> 816 + <td class="text-sm"> 817 + Rev: 818 + <code x-text="state && state.rev"></code> 819 + </td> 820 + </tr> 821 + <tr> 822 + <td class="text-sm"> 823 + Size: 824 + <span x-data="repoSize"> 825 + <template x-if="loading"> 826 + <em>loading&hellip;</em> 827 + </template> 828 + <template x-if="error"> 829 + <span class="text-xs text-warning" x-text="error"></span> 830 + </template> 831 + <template x-if="size"> 832 + <code> 833 + <span x-text="size"></span> MiB 834 + </code> 835 + </template> 836 + <template x-if="!size && !error && !loading"> 837 + <button 838 + class="btn btn-xs btn-soft btn-primary" 839 + @click.prevent="loadRepoForSize(did, pds)" 840 + >load</button> 841 + </template> 842 + </span> 843 + </td> 844 + </tr> 845 + <tr> 846 + <td class="text-sm"> 847 + PDS: 848 + <a 849 + href="#" 850 + class="link" 851 + @click.prevent="goto(pds)" 852 + x-text="pds" 853 + ></a> 854 + </td> 855 + </tr> 856 + </tbody> 857 + </table> 858 + </div> 859 + 860 + <h3 class="text-lg mt-3"> 861 + Relay repo status 862 + </h3> 863 + <div class="overflow-x-auto"> 864 + <table class="table table-xs"> 865 + <tbody> 866 + <template x-for="relay in window.relays"> 867 + <tr 868 + x-data="relayCheckRepo(did, relay)" 869 + x-init="$watch('pds', pds => check(did, relay))" 870 + > 871 + <td class="text-sm"> 872 + <div class="tooltip tooltip-right" :data-tip="relay.hostname"> 873 + <img 874 + class="inline-block h-4 w-4" 875 + :src="relay.icon" 876 + alt="" 877 + /> 878 + <span x-text="relay.name"></span> 627 879 <span 628 - x-text="!description.inviteCodeRequired" 880 + x-show="!!relay.note" 881 + x-text="relay.note" 882 + class="badge badge-neutral badge-soft badge-xs" 629 883 ></span> 884 + </div> 885 + </td> 886 + <template x-if="loading"> 887 + <td> 888 + <em>loading&hellip;</em> 630 889 </td> 631 - </tr> 632 - <tr> 633 - <td class="text-sm"> 634 - Version: 635 - <code 890 + </template> 891 + <template x-if="error"> 892 + <td> 893 + <div 636 894 class="text-xs" 637 - x-text="version" 638 - ></code> 895 + :class="expectedErrorInfo 896 + ? 'text-info tooltip tooltip-left cursor-help' 897 + : 'text-warning'" 898 + :data-tip="expectedErrorInfo" 899 + > 900 + <span x-text="error"></span> 901 + <span 902 + x-show="!!expectedErrorInfo" 903 + class="badge badge-soft badge-info badge-xs" 904 + >i</span> 905 + </div> 906 + </td> 907 + </template> 908 + <template x-if="status"> 909 + <td> 910 + <span 911 + x-show="status.active" 912 + class="badge badge-sm badge-soft badge-success" 913 + > 914 + active 915 + </span> 916 + <span 917 + x-show="!status.active" 918 + x-text="status.status" 919 + class="badge badge-sm badge-soft badge-warning" 920 + ></span> 921 + </td> 922 + </template> 923 + <template x-if="revStatus(state && state.rev)"> 924 + <td x-data="{ asdf: revStatus(state.rev) }"> 925 + <span 926 + x-show="asdf === 'current'" 927 + class="badge badge-sm badge-soft badge-success" 928 + >current</span> 929 + <span 930 + x-show="asdf === 'behind'" 931 + class="badge badge-sm badge-soft badge-warning tooltip tooltip-left" 932 + :data-tip="status.rev" 933 + >behind</span> 934 + <span 935 + x-show="asdf === 'ahead'" 936 + class="badge badge-sm badge-soft badge-success tooltip tooltip-left" 937 + :data-tip="`Account may have updated between checks? ${status.rev}`" 938 + >ahead</span> 639 939 </td> 640 - </tr> 641 - </tbody> 642 - </table> 643 - </div> 644 - <h4 class="font-bold"> 645 - Accounts 646 - </h4> 647 - <div class="overflow-x-auto overflow-y-auto max-h-26"> 940 + </template> 941 + </tr> 942 + </template> 943 + </tbody> 944 + </table> 945 + </div> 946 + 947 + <template x-if="did.startsWith('did:plc:')"> 948 + <div x-data="pdsHistory(did, pds)"> 949 + <h3 class="text-lg mt-3"> 950 + PLC PDS history 951 + </h3> 952 + <div class="overflow-x-auto"> 648 953 <table class="table table-xs"> 649 954 <tbody> 650 - <template x-for="account in accounts"> 955 + <template x-if="loading"> 651 956 <tr> 652 - <td> 653 - <code> 654 - <a 655 - href="#" 656 - class="link" 657 - x-text="account.did" 658 - @click.prevent="goto(account.did)" 659 - ></a> 660 - </code> 957 + <td>Loading&hellip;</td> 958 + </tr> 959 + </template> 960 + <template x-if="error"> 961 + <tr> 962 + <td>Error: <span x-text="error"></span></td> 963 + </tr> 964 + </template> 965 + <template x-if="!loading && !error && history.length === 0"> 966 + <tr> 967 + <td class="text-sm"> 968 + <em>no previous PDS</em> 661 969 </td> 970 + </tr> 971 + </template> 972 + <template x-for="event in history"> 973 + <tr x-data="didRepoState(did, event.pds)"> 662 974 <td> 663 - <span 664 - x-show="account.active" 665 - class="badge badge-sm badge-soft badge-success" 666 - > 667 - active 668 - </span> 669 - <span 670 - x-show="!account.active" 671 - x-text="account.status" 672 - class="badge badge-sm badge-soft badge-warning" 673 - ></span> 975 + <code x-text="event.date.split('T')[0]"></code> 674 976 </td> 675 - <td 676 - x-data="didToHandle(account.did)" 677 - x-intersect:enter.once="load" 678 - > 679 - <span x-show="loading">Loading&hellip;</span> 680 - <span x-show="error !== null" x-text="error"></span> 977 + <td> 681 978 <a 682 979 href="#" 683 980 class="link" 684 - @click.prevent="goto(handle)" 685 - x-show="handle !== null" 686 - x-text="`@${handle}`" 981 + @click.prevent="goto(event.pds)" 982 + x-text="event.pds" 687 983 ></a> 688 984 </td> 689 - </tr> 690 - </template> 691 - <template x-if="!loadingDesc && !accountsComplete"> 692 - <tr> 693 - <td colspan="2" class="text-xs text-warning-content"> 694 - (more accounts not shown) 695 - </td> 985 + <template x-if="event.current"> 986 + <td> 987 + <span 988 + x-show="state && !state.active" 989 + x-text="state && state.status" 990 + class="badge badge-sm badge-soft badge-warning" 991 + ></span> 992 + <span 993 + x-show="state && state.active" 994 + class="badge badge-sm badge-soft badge-success" 995 + >current</span> 996 + </td> 997 + </template> 998 + <template x-if="!event.current"> 999 + <td> 1000 + <span 1001 + x-show="state && !state.active" 1002 + x-text="state && state.status" 1003 + class="badge badge-sm badge-soft badge-success" 1004 + ></span> 1005 + <span 1006 + x-show="state && state.active" 1007 + class="badge badge-sm badge-soft badge-warning" 1008 + >active</span> 1009 + </td> 1010 + </template> 696 1011 </tr> 697 1012 </template> 698 1013 </tbody> ··· 701 1016 </div> 702 1017 </template> 703 1018 </div> 1019 + </template> 1020 + </div> 1021 + </div> 1022 + </template> 704 1023 705 - <h3 class="text-lg mt-3">Relay host status</h3> 706 - <div class="overflow-x-auto"> 707 - <table class="table table-xs"> 708 - <tbody> 709 - <template x-for="relay in window.relays"> 710 - <tr 711 - x-data="relayCheckHost(pds, relay)" 712 - x-init="$watch('pds', pds => check(pds, relay))" 713 - > 714 - <td class="text-sm"> 715 - <div class="tooltip tooltip-right" :data-tip="relay.hostname"> 716 - <img 717 - class="inline-block h-4 w-4" 718 - :src="relay.icon" 719 - alt="" 720 - /> 721 - <span x-text="relay.name"></span> 722 - <span 723 - x-show="!!relay.note" 724 - x-text="relay.note" 725 - class="badge badge-soft badge-neutral badge-xs" 726 - ></span> 727 - </div> 728 - </td> 729 - <td> 730 - <template x-if="loading"> 731 - <em>loading&hellip;</em> 732 - </template> 733 - <template x-if="error"> 734 - <div 735 - class="text-xs" 736 - :class="expectedErrorInfo 737 - ? 'text-info tooltip tooltip-left cursor-help' 738 - : 'text-warning'" 739 - :data-tip="expectedErrorInfo" 740 - > 741 - <span x-text="error"></span> 742 - <span 743 - x-show="!!expectedErrorInfo" 744 - class="badge badge-soft badge-info badge-xs" 745 - >i</span> 746 - </div> 747 - </template> 748 - <template x-if="status"> 749 - <span 750 - x-text="status" 751 - class="badge badge-sm" 752 - :class="status === 'active' && 'badge-soft badge-success'" 753 - ></span> 754 - </template> 755 - </td> 756 - <td> 757 - <div x-show="status !== 'active' && !expectedErrorInfo"> 758 - <button 759 - x-show="reqCrawlStatus !== 'done'" 760 - class="btn btn-xs btn-ghost whitespace-nowrap" 761 - :disabled="reqCrawlStatus === 'loading'" 762 - @click="requestCrawl(pds, relay)" 763 - > 764 - request crawl 765 - </button> 766 - <span 767 - x-show="reqCrawlError !== null" 768 - x-text="reqCrawlError" 769 - class="text-xs text-warning" 770 - ></span> 771 - <button 772 - x-show="reqCrawlError === null && reqCrawlStatus === 'done'" 773 - class="btn btn-xs btn-soft btn-primary whitespace-nowrap" 774 - @click="check" 775 - > 776 - refresh 777 - </button> 778 - </div> 779 - </td> 780 - </tr> 781 - </template> 782 - </tbody> 783 - </table> 784 - </div> 1024 + <template x-if="handle !== null"> 1025 + <div class="card bg-base-100 w-full max-w-2xl shrink-0 shadow-2xl m-4"> 1026 + <div 1027 + x-data="checkHandle(handle)" 1028 + x-init="$watch('handle', h => updateHandle(h))" 1029 + class="card-body" 1030 + > 1031 + <h2 class="card-title"> 1032 + <span class="badge badge-secondary">Handle</span> 1033 + <span x-text="handle"></span> 1034 + </h2> 1035 + 1036 + <h3 class="text-lg mt-3"> 1037 + Resolution 1038 + </h3> 1039 + <p x-show="loading" class="text-i">Loading&hellip;</p> 1040 + <div x-show="!loading" class="overflow-x-auto"> 1041 + <table class="table table-xs"> 1042 + <tbody> 1043 + <tr> 1044 + <td class="text-sm">DNS</td> 1045 + <td class="text-sm"> 1046 + <code x-text="dnsDid"></code> 1047 + </td> 1048 + <td> 1049 + <div 1050 + class="badge badge-sm badge-soft badge-neutral" 1051 + x-show="dnsErr !== null" 1052 + x-text="dnsErr" 1053 + ></div> 1054 + </td> 1055 + </tr> 1056 + <tr> 1057 + <td class="text-sm">Http</td> 1058 + <td class="text-sm"> 1059 + <code x-text="httpDid"></code> 1060 + </td> 1061 + <td> 1062 + <div 1063 + class="badge badge-sm badge-soft badge-neutral" 1064 + x-show="httpErr !== null" 1065 + x-text="httpErr" 1066 + ></div> 1067 + </td> 1068 + </tr> 1069 + </tbody> 1070 + </table> 785 1071 </div> 786 - </div> 787 - </template> 788 1072 789 - <template x-if="did != null"> 790 - <div class="card bg-base-100 w-full max-w-lg shrink-0 shadow-2xl"> 791 - <div class="card-body"> 792 - <h2 class="card-title"> 793 - <span class="badge badge-secondary">DID</span> 794 - <code x-text="did"></code> 795 - </h2> 796 - <template x-if="pds != null"> 797 - <div x-data="didRepoState(did, pds)"> 798 - <h3 class="text-lg mt-3"> 799 - Repo 800 - <span 801 - x-show="state && state.active" 802 - class="badge badge-sm badge-soft badge-success" 803 - >active</span> 804 - </h3> 805 - <div class="overflow-x-auto"> 806 - <table class="table table-xs"> 807 - <tbody> 1073 + <template x-if="did !== null && did.startsWith('did:plc:')"> 1074 + 1075 + <div x-data="handleHistory(did, handle)"> 1076 + <h3 class="text-lg mt-3"> 1077 + PLC handle history 1078 + </h3> 1079 + <div class="overflow-x-auto"> 1080 + <table class="table table-xs"> 1081 + <tbody> 1082 + <template x-if="loading"> 1083 + <tr> 1084 + <td>Loading&hellip;</td> 1085 + </tr> 1086 + </template> 1087 + <template x-if="error"> 1088 + <tr> 1089 + <td>Error: <span x-text="error"></span></td> 1090 + </tr> 1091 + </template> 1092 + <template x-if="!loading && !error && history.length === 0"> 808 1093 <tr> 809 1094 <td class="text-sm"> 810 - Rev: 811 - <code x-text="state && state.rev"></code> 1095 + <em>no previous handle</em> 812 1096 </td> 813 1097 </tr> 1098 + </template> 1099 + <template x-for="event in history"> 814 1100 <tr> 815 - <td class="text-sm"> 816 - PDS: 1101 + <td> 1102 + <code x-text="event.date.split('T')[0]"></code> 1103 + </td> 1104 + <td> 817 1105 <a 818 1106 href="#" 819 1107 class="link" 820 - @click.prevent="goto(pds)" 821 - x-text="pds" 1108 + @click.prevent="goto(event.handle)" 1109 + x-text="event.handle" 822 1110 ></a> 823 1111 </td> 824 1112 </tr> 825 - <tr> 826 - <td class="text-sm"> 827 - Size: 828 - <span x-data="repoSize"> 829 - <template x-if="loading"> 830 - <em>loading&hellip;</em> 831 - </template> 832 - <template x-if="error"> 833 - <span class="text-xs text-warning" x-text="error"></span> 834 - </template> 835 - <template x-if="size"> 836 - <code> 837 - <span x-text="size"></span> MiB 838 - </code> 839 - </template> 840 - <template x-if="!size && !error && !loading"> 841 - <button 842 - class="btn btn-xs btn-soft btn-primary" 843 - @click.prevent="loadRepoForSize(did, pds)" 844 - >load</button> 845 - </template> 846 - </span> 847 - </td> 848 - </tr> 849 - </tbody> 850 - </table> 851 - </div> 852 - 853 - <h3 class="text-lg mt-3"> 854 - Relay repo status 855 - </h3> 856 - <div class="overflow-x-auto"> 857 - <table class="table table-xs"> 858 - <tbody> 859 - <template x-for="relay in window.relays"> 860 - <tr 861 - x-data="relayCheckRepo(did, relay)" 862 - x-init="$watch('pds', pds => check(did, relay))" 863 - > 864 - <td class="text-sm"> 865 - <div class="tooltip tooltip-right" :data-tip="relay.hostname"> 866 - <img 867 - class="inline-block h-4 w-4" 868 - :src="relay.icon" 869 - alt="" 870 - /> 871 - <span x-text="relay.name"></span> 872 - <span 873 - x-show="!!relay.note" 874 - x-text="relay.note" 875 - class="badge badge-neutral badge-soft badge-xs" 876 - ></span> 877 - </div> 878 - </td> 879 - <template x-if="loading"> 880 - <td> 881 - <em>loading&hellip;</em> 882 - </td> 883 - </template> 884 - <template x-if="error"> 885 - <td> 886 - <div 887 - class="text-xs" 888 - :class="expectedErrorInfo 889 - ? 'text-info tooltip tooltip-left cursor-help' 890 - : 'text-warning'" 891 - :data-tip="expectedErrorInfo" 892 - > 893 - <span x-text="error"></span> 894 - <span 895 - x-show="!!expectedErrorInfo" 896 - class="badge badge-soft badge-info badge-xs" 897 - >i</span> 898 - </div> 899 - </td> 900 - </template> 901 - <template x-if="status"> 902 - <td> 903 - <span 904 - x-show="status.active" 905 - class="badge badge-sm badge-soft badge-success" 906 - > 907 - active 908 - </span> 909 - <span 910 - x-show="!status.active" 911 - x-text="status.status" 912 - class="badge badge-sm badge-soft badge-warning" 913 - ></span> 914 - </td> 915 - </template> 916 - <template x-if="revStatus(state && state.rev)"> 917 - <td x-data="{ asdf: revStatus(state.rev) }"> 918 - <span 919 - x-show="asdf === 'current'" 920 - class="badge badge-sm badge-soft badge-success" 921 - >current</span> 922 - <span 923 - x-show="asdf === 'behind'" 924 - class="badge badge-sm badge-soft badge-warning tooltip tooltip-left" 925 - :data-tip="status.rev" 926 - >behind</span> 927 - <span 928 - x-show="asdf === 'ahead'" 929 - class="badge badge-sm badge-soft badge-success tooltip tooltip-left" 930 - :data-tip="`Account may have updated between checks? ${status.rev}`" 931 - >ahead</span> 932 - </td> 933 - </template> 934 - </tr> 935 - </template> 936 - </tbody> 937 - </table> 938 - </div> 1113 + </template> 1114 + </tbody> 1115 + </table> 1116 + </div> 1117 + </div> 939 1118 940 - <template x-if="did.startsWith('did:plc:')"> 941 - <div x-data="pdsHistory(did, pds)"> 942 - <h3 class="text-lg mt-3"> 943 - PLC PDS history 944 - </h3> 945 - <div class="overflow-x-auto"> 946 - <table class="table table-xs"> 947 - <tbody> 948 - <template x-if="loading"> 949 - <tr> 950 - <td>Loading&hellip;</td> 951 - </tr> 952 - </template> 953 - <template x-if="error"> 954 - <tr> 955 - <td>Error: <span x-text="error"></span></td> 956 - </tr> 957 - </template> 958 - <template x-if="!loading && !error && history.length === 0"> 959 - <tr> 960 - <td class="text-sm"> 961 - <em>no previous PDS</em> 962 - </td> 963 - </tr> 964 - </template> 965 - <template x-for="event in history"> 966 - <tr x-data="didRepoState(did, event.pds)"> 967 - <td> 968 - <code x-text="event.date.split('T')[0]"></code> 969 - </td> 970 - <td> 971 - <a 972 - href="#" 973 - class="link" 974 - @click.prevent="goto(event.pds)" 975 - x-text="event.pds" 976 - ></a> 977 - </td> 978 - <template x-if="event.current"> 979 - <td> 980 - <span 981 - x-show="state && !state.active" 982 - x-text="state && state.status" 983 - class="badge badge-sm badge-soft badge-warning" 984 - ></span> 985 - <span 986 - x-show="state && state.active" 987 - class="badge badge-sm badge-soft badge-success" 988 - >current</span> 989 - </td> 990 - </template> 991 - <template x-if="!event.current"> 992 - <td> 993 - <span 994 - x-show="state && !state.active" 995 - x-text="state && state.status" 996 - class="badge badge-sm badge-soft badge-success" 997 - ></span> 998 - <span 999 - x-show="state && state.active" 1000 - class="badge badge-sm badge-soft badge-warning" 1001 - >active</span> 1002 - </td> 1003 - </template> 1004 - </tr> 1005 - </template> 1006 - </tbody> 1007 - </table> 1008 - </div> 1009 - </div> 1010 - </template> 1011 - </div> 1012 - </template> 1013 - </div> 1119 + </template> 1014 1120 </div> 1015 - </template> 1121 + </div> 1122 + </template> 1123 + </div> 1016 1124 1017 - <template x-if="handle !== null"> 1018 - <div class="card bg-base-100 w-full max-w-lg shrink-0 shadow-2xl"> 1019 - <div 1020 - x-data="checkHandle(handle)" 1021 - x-init="$watch('handle', h => updateHandle(h))" 1022 - class="card-body" 1023 - > 1024 - <h2 class="card-title"> 1025 - <span class="badge badge-secondary">Handle</span> 1026 - <span x-text="handle"></span> 1027 - </h2> 1028 1125 1029 - <h3 class="text-lg mt-3"> 1030 - Resolution 1031 - </h3> 1032 - <p x-show="loading" class="text-i">Loading&hellip;</p> 1033 - <div x-show="!loading" class="overflow-x-auto"> 1034 - <table class="table table-xs"> 1035 - <tbody> 1036 - <tr> 1037 - <td class="text-sm">DNS</td> 1038 - <td class="text-sm"> 1039 - <code x-text="dnsDid"></code> 1040 - </td> 1041 - <td> 1042 - <div 1043 - class="badge badge-sm badge-soft badge-neutral" 1044 - x-show="dnsErr !== null" 1045 - x-text="dnsErr" 1046 - ></div> 1047 - </td> 1048 - </tr> 1049 - <tr> 1050 - <td class="text-sm">Http</td> 1051 - <td class="text-sm"> 1052 - <code x-text="httpDid"></code> 1053 - </td> 1054 - <td> 1055 - <div 1056 - class="badge badge-sm badge-soft badge-neutral" 1057 - x-show="httpErr !== null" 1058 - x-text="httpErr" 1059 - ></div> 1060 - </td> 1061 - </tr> 1062 - </tbody> 1063 - </table> 1064 - </div> 1065 1126 1066 - <template x-if="did !== null && did.startsWith('did:plc:')"> 1067 - 1068 - <div x-data="handleHistory(did, handle)"> 1069 - <h3 class="text-lg mt-3"> 1070 - PLC handle history 1071 - </h3> 1072 - <div class="overflow-x-auto"> 1073 - <table class="table table-xs"> 1074 - <tbody> 1075 - <template x-if="loading"> 1076 - <tr> 1077 - <td>Loading&hellip;</td> 1078 - </tr> 1079 - </template> 1080 - <template x-if="error"> 1081 - <tr> 1082 - <td>Error: <span x-text="error"></span></td> 1083 - </tr> 1084 - </template> 1085 - <template x-if="!loading && !error && history.length === 0"> 1086 - <tr> 1087 - <td class="text-sm"> 1088 - <em>no previous handle</em> 1089 - </td> 1090 - </tr> 1091 - </template> 1092 - <template x-for="event in history"> 1093 - <tr> 1094 - <td> 1095 - <code x-text="event.date.split('T')[0]"></code> 1096 - </td> 1097 - <td> 1098 - <a 1099 - href="#" 1100 - class="link" 1101 - @click.prevent="goto(event.handle)" 1102 - x-text="event.handle" 1103 - ></a> 1104 - </td> 1105 - </tr> 1106 - </template> 1107 - </tbody> 1108 - </table> 1109 - </div> 1110 - </div> 1127 + <div class="footer text-xs sm:footer-horizontal text-neutral mt-32 p-8 max-w-2xl mx-auto"> 1128 + <nav> 1129 + <h3 class="footer-title">Current limitations</h3> 1130 + <p>PDS hosts without CORS will fail tests</p> 1131 + <p>Bluesky relay is missing API endpoints</p> 1132 + <p>Blacksky relay is also missing API endpoints</p> 1133 + <p>The requestCrawl button is not well tested</p> 1134 + </nav> 1135 + <nav> 1111 1136 1112 - </template> 1113 - </div> 1114 - </div> 1115 - </template> 1116 - </div> 1137 + <h3 class="footer-title">Future features</h3> 1138 + <p>Account label lookup</p> 1139 + </nav> 1117 1140 </div> 1141 + 1118 1142 </body> 1119 1143 </html>