fedipod-server 0.10.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -6
- package/dist/claims.js +1 -1
- package/dist/handler.d.ts +7 -1
- package/dist/handler.js +58 -12
- package/dist/handler.jsonld +5 -1
- package/dist/store-pod.js +18 -4
- package/lib/{c2s.mjs → client/c2s.mjs} +8 -3
- package/lib/{localapi.mjs → client/localapi.mjs} +2 -2
- package/lib/client/masto/accounts.mjs +264 -0
- package/lib/client/masto/body.mjs +69 -0
- package/lib/client/masto/index.mjs +183 -0
- package/lib/client/masto/instance.mjs +104 -0
- package/lib/client/masto/media.mjs +133 -0
- package/lib/client/masto/oauth.mjs +599 -0
- package/lib/client/masto/render.mjs +459 -0
- package/lib/client/masto/statuses.mjs +331 -0
- package/lib/client/masto/timelines.mjs +316 -0
- package/lib/{streaming.mjs → client/streaming.mjs} +1 -1
- package/lib/{acctfeed.mjs → connections/acctfeed.mjs} +1 -1
- package/lib/{atproto.mjs → connections/atproto.mjs} +15 -16
- package/lib/{bskygroup.mjs → connections/bskygroup.mjs} +1 -1
- package/lib/{fediacct.mjs → connections/fediacct.mjs} +31 -35
- package/lib/{import.mjs → connections/import.mjs} +2 -2
- package/lib/{tagfeed.mjs → connections/tagfeed.mjs} +21 -4
- package/lib/connections/vault.mjs +114 -0
- package/lib/core/as2.mjs +124 -0
- package/lib/core/contexts/activitystreams.json +379 -0
- package/lib/core/contexts/did-v1.json +57 -0
- package/lib/core/contexts/fep-5711.json +36 -0
- package/lib/core/contexts/gotosocial.json +86 -0
- package/lib/core/contexts/identity-v1.json +152 -0
- package/lib/core/contexts/index.mjs +45 -0
- package/lib/core/contexts/join-lemmy.json +33 -0
- package/lib/core/contexts/joinmastodon.json +28 -0
- package/lib/core/contexts/map.json +16 -0
- package/lib/core/contexts/miscellany.json +19 -0
- package/lib/core/contexts/schemaorg.json +8845 -0
- package/lib/core/contexts/security-data-integrity-v1.json +78 -0
- package/lib/core/contexts/security-data-integrity-v2.json +81 -0
- package/lib/core/contexts/security-multikey-v1.json +35 -0
- package/lib/core/contexts/security-v1.json +74 -0
- package/lib/core/contexts/webfinger.json +10 -0
- package/lib/{deliver.mjs → core/deliver.mjs} +8 -2
- package/lib/core/intake/activities.mjs +437 -0
- package/lib/core/intake/activity.mjs +240 -0
- package/lib/core/intake/channel.mjs +144 -0
- package/lib/core/intake/group.mjs +222 -0
- package/lib/core/intake/index.mjs +629 -0
- package/lib/core/intake/notes.mjs +288 -0
- package/lib/core/intake/verify.mjs +141 -0
- package/lib/{keys.mjs → core/keys.mjs} +1 -1
- package/lib/core/publisher/collections.mjs +229 -0
- package/lib/core/publisher/index.mjs +421 -0
- package/lib/core/publisher/notes.mjs +188 -0
- package/lib/core/publisher/questions.mjs +233 -0
- package/lib/core/publisher/restore.mjs +196 -0
- package/lib/core/shapes/activitystreams.ttl +129 -0
- package/lib/core/shapes/index.mjs +107 -0
- package/lib/core/shapes/shapes-text.mjs +13 -0
- package/lib/{social.mjs → core/social.mjs} +19 -10
- package/lib/{storage.mjs → core/storage.mjs} +2 -2
- package/lib/{store.mjs → core/store.mjs} +12 -1
- package/lib/{wire.mjs → core/wire.mjs} +48 -67
- package/lib/device/admin/index.mjs +13 -0
- package/lib/device/admin/origins.mjs +35 -0
- package/lib/device/admin/routes/connections.mjs +144 -0
- package/lib/device/admin/routes/gateway.mjs +199 -0
- package/lib/device/admin/routes/lifecycle.mjs +191 -0
- package/lib/device/admin/routes/owner.mjs +322 -0
- package/lib/device/admin/routes/setup.mjs +393 -0
- package/lib/device/admin/routes/social.mjs +188 -0
- package/lib/device/admin/server.mjs +95 -0
- package/lib/device/admin/static.mjs +244 -0
- package/lib/device/admin/surface.mjs +274 -0
- package/lib/device/cli/commands/account.mjs +586 -0
- package/lib/device/cli/commands/run.mjs +278 -0
- package/lib/device/cli/commands/service.mjs +221 -0
- package/lib/device/cli/commands/setup.mjs +410 -0
- package/lib/device/cli/commands/state.mjs +559 -0
- package/lib/device/cli/context.mjs +288 -0
- package/lib/{export-collections.mjs → device/export-collections.mjs} +1 -1
- package/lib/{migrate.mjs → device/migrate.mjs} +5 -19
- package/lib/device/remote.mjs +54 -0
- package/lib/{setup.mjs → device/setup.mjs} +3 -3
- package/lib/{update.mjs → device/update.mjs} +1 -1
- package/lib/{directory.mjs → gateway/directory.mjs} +1 -1
- package/lib/{front-core.mjs → gateway/front-core.mjs} +272 -49
- package/lib/{gateway-core.mjs → gateway/gateway-core.mjs} +3 -7
- package/lib/{httpsig.mjs → gateway/httpsig.mjs} +34 -3
- package/lib/pod/README.md +61 -0
- package/lib/pod/actor.mjs +96 -0
- package/lib/pod/collection.mjs +77 -0
- package/lib/pod/containers.mjs +136 -0
- package/lib/pod/discovery.mjs +46 -0
- package/lib/pod/featured.mjs +18 -0
- package/lib/pod/followers.mjs +24 -0
- package/lib/pod/following.mjs +10 -0
- package/lib/pod/http.mjs +74 -0
- package/lib/pod/inbox.mjs +144 -0
- package/lib/{links.mjs → pod/links.mjs} +1 -1
- package/lib/pod/media.mjs +27 -0
- package/lib/pod/notes.mjs +80 -0
- package/lib/pod/notifications.mjs +89 -0
- package/lib/pod/outbox.mjs +18 -0
- package/lib/pod/package.json +19 -0
- package/lib/pod/policy.mjs +58 -0
- package/lib/pod/private.mjs +19 -0
- package/lib/pod/root.mjs +63 -0
- package/lib/pod/state.mjs +39 -0
- package/lib/{remote.mjs → pod/transport.mjs} +217 -159
- package/lib/pod/urls.mjs +71 -0
- package/lib/{embed.mjs → server/embed.mjs} +149 -22
- package/lib/shared/links.mjs +9 -0
- package/lib/{ua.mjs → shared/ua.mjs} +1 -1
- package/package.json +1 -1
- package/run-agent.mjs +47 -64
- package/web/admin/actors.js +145 -0
- package/web/admin/bar.css +9 -13
- package/web/admin/bar.js +2 -2
- package/web/admin/client/client.js +1 -1
- package/web/admin/client/index.html +5 -6
- package/web/admin/common.js +23 -0
- package/web/admin/connections.js +112 -0
- package/web/admin/gateway.js +111 -0
- package/web/admin/group.js +258 -0
- package/web/admin/index.html +60 -66
- package/web/admin/record.js +378 -0
- package/web/admin/setup/index.html +3 -1
- package/web/admin/setup/setup.js +2 -13
- package/web/admin/tokens.css +56 -0
- package/web/admin/upkeep.js +170 -0
- package/web/app/README.md +77 -0
- package/web/app/admin-facade.mjs +549 -0
- package/web/app/agent.mjs +490 -0
- package/web/app/atproto-browser.mjs +86 -0
- package/web/app/boot.mjs +340 -0
- package/web/app/deliver-relay.mjs +72 -0
- package/web/app/dist/boot.js +34067 -0
- package/web/app/dist/boot.js.map +7 -0
- package/web/app/dist/sw.js +70014 -0
- package/web/app/dist/sw.js.map +7 -0
- package/web/app/fediacct-browser.mjs +146 -0
- package/web/app/idb-kv.mjs +35 -0
- package/web/app/index.html +203 -0
- package/web/app/index.html~ +152 -0
- package/web/app/keys-browser.mjs +46 -0
- package/web/app/keystore.mjs +99 -0
- package/web/app/oidc-session.mjs +189 -0
- package/web/app/pod-auth.mjs +248 -0
- package/web/app/pod-remote.mjs +84 -0
- package/web/app/shims/_globals.mjs +2 -0
- package/web/app/shims/fedify-sig.mjs +77 -0
- package/web/app/shims/node-crypto.mjs +113 -0
- package/web/app/shims/node-fs.mjs +17 -0
- package/web/app/shims/node-path.mjs +19 -0
- package/web/app/shims/node-url.mjs +7 -0
- package/web/app/shims/prelude.js +58 -0
- package/web/app/shims/safefetch.mjs +58 -0
- package/web/app/shims/shapes-text.mjs +8 -0
- package/web/app/shims/web-push.mjs +14 -0
- package/web/app/signup.mjs +248 -0
- package/web/app/site/_headers +9 -0
- package/web/app/site/_redirects +21 -0
- package/web/app/site/admin/actors.js +145 -0
- package/web/app/site/admin/bar.css +60 -0
- package/web/app/site/admin/bar.js +61 -0
- package/web/app/site/admin/client/client.js +66 -0
- package/web/app/site/admin/client/index.html +43 -0
- package/web/app/site/admin/common.js +23 -0
- package/web/app/site/admin/connections.js +112 -0
- package/web/app/site/admin/gateway.js +111 -0
- package/web/app/site/admin/group.js +258 -0
- package/web/app/site/admin/index.html +562 -0
- package/web/app/site/admin/record.js +378 -0
- package/web/app/site/admin/setup/index.html +192 -0
- package/web/app/site/admin/setup/setup.js +297 -0
- package/web/app/site/admin/tokens.css +56 -0
- package/web/app/site/admin/upkeep.js +170 -0
- package/web/app/site/admin/window.css +55 -0
- package/web/app/site/admin/window.js +136 -0
- package/web/app/site/app/404.html +40 -0
- package/web/app/site/app/_headers +2 -0
- package/web/app/site/app/apple-touch-icon.png +0 -0
- package/web/app/site/app/assets/ICONS-DIPJeU0C.js +2 -0
- package/web/app/site/app/assets/ICONS-DIPJeU0C.js.map +1 -0
- package/web/app/site/app/assets/ScheduledAtField-D-Abfo4J.js +183 -0
- package/web/app/site/app/assets/ScheduledAtField-D-Abfo4J.js.map +1 -0
- package/web/app/site/app/assets/Temml-CCjoacWt.woff2 +0 -0
- package/web/app/site/app/assets/__vite-browser-external-C7iut881.js +2 -0
- package/web/app/site/app/assets/__vite-browser-external-C7iut881.js.map +1 -0
- package/web/app/site/app/assets/boosts-carousel-BiOaNdMT.jpg +0 -0
- package/web/app/site/app/assets/catch-up-O5q5C75Z.png +0 -0
- package/web/app/site/app/assets/chunk-aKtaBQYM.js +1 -0
- package/web/app/site/app/assets/compose-CFEx7wb4.js +2 -0
- package/web/app/site/app/assets/compose-CFEx7wb4.js.map +1 -0
- package/web/app/site/app/assets/compose-ZJN5xSb4.js +35 -0
- package/web/app/site/app/assets/compose-ZJN5xSb4.js.map +1 -0
- package/web/app/site/app/assets/debug.module-YFQgwnIr.js +52 -0
- package/web/app/site/app/assets/debug.module-YFQgwnIr.js.map +1 -0
- package/web/app/site/app/assets/dom-p1YcJ5Rw.js +2 -0
- package/web/app/site/app/assets/dom-p1YcJ5Rw.js.map +1 -0
- package/web/app/site/app/assets/home-mobile-dark@2x-Dc-J8-SM.png +0 -0
- package/web/app/site/app/assets/home-mobile-light@2x-Bd3fod8m.png +0 -0
- package/web/app/site/app/assets/home-tablet-dark@2x-BgcNI8le.png +0 -0
- package/web/app/site/app/assets/home-tablet-light@2x-BW2RV9T6.png +0 -0
- package/web/app/site/app/assets/icons/add-circle-line-WD0mwORD.js +1 -0
- package/web/app/site/app/assets/icons/alert-line-CpFUMf9s.js +1 -0
- package/web/app/site/app/assets/icons/android-2-line-Bzxnrd3S.js +1 -0
- package/web/app/site/app/assets/icons/announcement-line-5nwaJFJm.js +1 -0
- package/web/app/site/app/assets/icons/arrow-down-circle-line-a7Id9-Iv.js +1 -0
- package/web/app/site/app/assets/icons/arrow-down-line-B8uzXzq6.js +1 -0
- package/web/app/site/app/assets/icons/arrow-left-line-CGrGT9C-.js +1 -0
- package/web/app/site/app/assets/icons/arrow-right-line-CE-HERfX.js +1 -0
- package/web/app/site/app/assets/icons/arrow-to-up-line-CvdQjmcy.js +1 -0
- package/web/app/site/app/assets/icons/arrow-up-circle-line-DEparSNF.js +1 -0
- package/web/app/site/app/assets/icons/arrow-up-line-C7yBeugc.js +1 -0
- package/web/app/site/app/assets/icons/arrows-right-line-BtbXmJGP.js +1 -0
- package/web/app/site/app/assets/icons/at-line-CF66Bznk.js +1 -0
- package/web/app/site/app/assets/icons/attachment-line-BY8It-l9.js +1 -0
- package/web/app/site/app/assets/icons/blockquote-line-BS6pU_hm.js +1 -0
- package/web/app/site/app/assets/icons/board-line-C0UWXyA6.js +1 -0
- package/web/app/site/app/assets/icons/bookmark-line-1CtX5JLF.js +1 -0
- package/web/app/site/app/assets/icons/building-5-line-Dd59MzbO.js +1 -0
- package/web/app/site/app/assets/icons/bus-2-line-6_dvA0GG.js +1 -0
- package/web/app/site/app/assets/icons/calendar-day-line-Crpl_fmu.js +1 -0
- package/web/app/site/app/assets/icons/calendar-month-line-vommts2C.js +1 -0
- package/web/app/site/app/assets/icons/calendar-time-add-line-BU_DTlQk.js +1 -0
- package/web/app/site/app/assets/icons/camera-line-Cv69MEei.js +1 -0
- package/web/app/site/app/assets/icons/celebrate-line-B8DvIoi0.js +1 -0
- package/web/app/site/app/assets/icons/chart-bar-line-FK-QOmtF.js +1 -0
- package/web/app/site/app/assets/icons/chart-line-line-BGcJAFWw.js +1 -0
- package/web/app/site/app/assets/icons/chat-3-line-YFK2-hwz.js +1 -0
- package/web/app/site/app/assets/icons/check-circle-line-DsAxFr5-.js +1 -0
- package/web/app/site/app/assets/icons/clipboard-line-BBp364gJ.js +1 -0
- package/web/app/site/app/assets/icons/close-circle-line-CICdiuGz.js +1 -0
- package/web/app/site/app/assets/icons/close-line-DYrFWcjv.js +1 -0
- package/web/app/site/app/assets/icons/cloud-line-tiQAbah8.js +1 -0
- package/web/app/site/app/assets/icons/code-line-fAl8iiV3.js +1 -0
- package/web/app/site/app/assets/icons/comment-2-line-CR3g7WeB.js +1 -0
- package/web/app/site/app/assets/icons/copy-2-line-CLW69yF5.js +1 -0
- package/web/app/site/app/assets/icons/delete-2-line-B8xmbr4n.js +1 -0
- package/web/app/site/app/assets/icons/document-3-line-DBGNhAg2.js +1 -0
- package/web/app/site/app/assets/icons/document-line-C7mb9sb7.js +1 -0
- package/web/app/site/app/assets/icons/down-line-BGqSSThd.js +1 -0
- package/web/app/site/app/assets/icons/edit-4-line-DcgGaEhx.js +1 -0
- package/web/app/site/app/assets/icons/emoji-2-line-D8YgnM-y.js +1 -0
- package/web/app/site/app/assets/icons/exit-line-Dc07BS-x.js +1 -0
- package/web/app/site/app/assets/icons/external-link-line-BvpSkmjO.js +1 -0
- package/web/app/site/app/assets/icons/eye-2-line-CiWXx-f_.js +1 -0
- package/web/app/site/app/assets/icons/eye-close-line-BgTaSJ4P.js +1 -0
- package/web/app/site/app/assets/icons/filter-2-line-B_mR2usy.js +1 -0
- package/web/app/site/app/assets/icons/filter-line-C_nm-3cU.js +1 -0
- package/web/app/site/app/assets/icons/flag-1-line-C2HB05I0.js +1 -0
- package/web/app/site/app/assets/icons/forbid-circle-line-D3LTT9yd.js +1 -0
- package/web/app/site/app/assets/icons/formula-line-DLrt2d6j.js +1 -0
- package/web/app/site/app/assets/icons/grid-line-CgUmEikf.js +1 -0
- package/web/app/site/app/assets/icons/group-line-C5fnX0wU.js +1 -0
- package/web/app/site/app/assets/icons/hand-finger-2-line-BGgxbuL9.js +1 -0
- package/web/app/site/app/assets/icons/hashtag-line-CyTEEXBb.js +1 -0
- package/web/app/site/app/assets/icons/heart-crack-line-BZddbO2C.js +1 -0
- package/web/app/site/app/assets/icons/heart-line-CJ7K47J4.js +1 -0
- package/web/app/site/app/assets/icons/history-2-line-kWWvFzqv.js +1 -0
- package/web/app/site/app/assets/icons/history-line-bGQiwbTH.js +1 -0
- package/web/app/site/app/assets/icons/home-3-line-fRU1zeLG.js +1 -0
- package/web/app/site/app/assets/icons/information-line-iNk6-sOY.js +1 -0
- package/web/app/site/app/assets/icons/keyboard-line-DsCyuQNz.js +1 -0
- package/web/app/site/app/assets/icons/layout-4-line-CZkOX52Z.js +1 -0
- package/web/app/site/app/assets/icons/layout-5-line-B_znt5wO.js +1 -0
- package/web/app/site/app/assets/icons/left-line-eUw0tya4.js +1 -0
- package/web/app/site/app/assets/icons/lightning-line-DaKoDdix.js +1 -0
- package/web/app/site/app/assets/icons/link-2-line-DCqLmMA7.js +1 -0
- package/web/app/site/app/assets/icons/list-check-line-BAxosBh9.js +1 -0
- package/web/app/site/app/assets/icons/lock-line-CPoaXeUW.js +1 -0
- package/web/app/site/app/assets/icons/mail-line-B0P8aa1L.js +1 -0
- package/web/app/site/app/assets/icons/moon-line-CEqNAToP.js +1 -0
- package/web/app/site/app/assets/icons/more-1-fill-Dw2e5xab.js +1 -0
- package/web/app/site/app/assets/icons/more-3-line-BIiVjYTz.js +1 -0
- package/web/app/site/app/assets/icons/notification-line-BZZq2Gtu.js +1 -0
- package/web/app/site/app/assets/icons/pencil-line-CKh8-A1v.js +1 -0
- package/web/app/site/app/assets/icons/photo-album-line-Bnfg2u40.js +1 -0
- package/web/app/site/app/assets/icons/pin-line-DpTolyhs.js +1 -0
- package/web/app/site/app/assets/icons/play-fill-B0-G_8lX.js +1 -0
- package/web/app/site/app/assets/icons/qrcode-2-line-B6SPCaHn.js +1 -0
- package/web/app/site/app/assets/icons/quill-pen-line-B6LUrnCP.js +1 -0
- package/web/app/site/app/assets/icons/quote-left-fill-hQZ1cj_6.js +1 -0
- package/web/app/site/app/assets/icons/radar-line-CKyroTth.js +1 -0
- package/web/app/site/app/assets/icons/react-line-CoIKhhtK.js +1 -0
- package/web/app/site/app/assets/icons/refresh-2-line-D0mTF97S.js +1 -0
- package/web/app/site/app/assets/icons/right-line-B3KWJaqc.js +1 -0
- package/web/app/site/app/assets/icons/rocket-line-4KZl537D.js +1 -0
- package/web/app/site/app/assets/icons/round-fill-C69NTrZ0.js +1 -0
- package/web/app/site/app/assets/icons/round-line-B9k_1uo-.js +1 -0
- package/web/app/site/app/assets/icons/route-line-B28ReHcE.js +1 -0
- package/web/app/site/app/assets/icons/rows-4-line-CrBniagM.js +1 -0
- package/web/app/site/app/assets/icons/scan-line-DSf74YdP.js +1 -0
- package/web/app/site/app/assets/icons/search-2-line-B6geIU1z.js +1 -0
- package/web/app/site/app/assets/icons/settings-3-line-azJwK47w.js +1 -0
- package/web/app/site/app/assets/icons/settings-6-line-C_5zc5YR.js +1 -0
- package/web/app/site/app/assets/icons/share-2-line-D5MxWjrm.js +1 -0
- package/web/app/site/app/assets/icons/share-forward-line-Cp61fZzZ.js +1 -0
- package/web/app/site/app/assets/icons/sparkles-2-line-DYYyXTaW.js +1 -0
- package/web/app/site/app/assets/icons/sparkles-line-C2hY1s6I.js +1 -0
- package/web/app/site/app/assets/icons/time-line-BF3eet1v.js +1 -0
- package/web/app/site/app/assets/icons/transfer-4-line-oisfvTBw.js +1 -0
- package/web/app/site/app/assets/icons/translate-line-BFWol2Ce.js +1 -0
- package/web/app/site/app/assets/icons/unlock-line-X_x5vwv3.js +1 -0
- package/web/app/site/app/assets/icons/upload-3-line-DgzwUJeW.js +1 -0
- package/web/app/site/app/assets/icons/user-4-line-BVSynZCp.js +1 -0
- package/web/app/site/app/assets/icons/user-add-2-line-BlGS5Q8q.js +1 -0
- package/web/app/site/app/assets/icons/user-add-line-BbXdHG4z.js +1 -0
- package/web/app/site/app/assets/icons/user-edit-line-BFAHOV0X.js +1 -0
- package/web/app/site/app/assets/icons/user-follow-line-BXux0wSd.js +1 -0
- package/web/app/site/app/assets/icons/user-star-line-DdYlpHLU.js +1 -0
- package/web/app/site/app/assets/icons/user-warning-line-Cj43j0_E.js +1 -0
- package/web/app/site/app/assets/icons/user-x-line-DIDgNlPH.js +1 -0
- package/web/app/site/app/assets/icons/volume-line-Bs390KQt.js +1 -0
- package/web/app/site/app/assets/icons/volume-mute-line-DzlzIqFZ.js +1 -0
- package/web/app/site/app/assets/icons/walk-line-yNXfB-md.js +1 -0
- package/web/app/site/app/assets/icons/world-2-line-CenkGIwj.js +1 -0
- package/web/app/site/app/assets/icons/zoom-in-line-CaENUphf.js +1 -0
- package/web/app/site/app/assets/icons/zoom-out-line-BDNk0EWo.js +1 -0
- package/web/app/site/app/assets/instances-BNPptnn-.json +333 -0
- package/web/app/site/app/assets/locales/ar-SA-CfheRbCu.js +1 -0
- package/web/app/site/app/assets/locales/ca-ES-DHRW86Tz.js +1 -0
- package/web/app/site/app/assets/locales/cs-CZ-CKoqEuA1.js +1 -0
- package/web/app/site/app/assets/locales/de-DE-ByRPMRFy.js +1 -0
- package/web/app/site/app/assets/locales/eo-UY-CPC7wLCS.js +1 -0
- package/web/app/site/app/assets/locales/es-ES-dJa0Fd9t.js +1 -0
- package/web/app/site/app/assets/locales/eu-ES-C3djlPR2.js +1 -0
- package/web/app/site/app/assets/locales/fa-IR-DTT490Ck.js +1 -0
- package/web/app/site/app/assets/locales/fi-FI-B23MCPuz.js +1 -0
- package/web/app/site/app/assets/locales/fr-FR-BcaQsO5C.js +1 -0
- package/web/app/site/app/assets/locales/gl-ES-BR-CVKBN.js +1 -0
- package/web/app/site/app/assets/locales/he-IL-CfheRbCu.js +1 -0
- package/web/app/site/app/assets/locales/hu-HU-CfheRbCu.js +1 -0
- package/web/app/site/app/assets/locales/it-IT-C1136UFV.js +1 -0
- package/web/app/site/app/assets/locales/ja-JP-CRZmRAhD.js +1 -0
- package/web/app/site/app/assets/locales/kab-Cz8xH_TT.js +1 -0
- package/web/app/site/app/assets/locales/ko-KR-CG9UiY4o.js +1 -0
- package/web/app/site/app/assets/locales/lt-LT-CJcI6sHZ.js +1 -0
- package/web/app/site/app/assets/locales/nb-NO-CfheRbCu.js +1 -0
- package/web/app/site/app/assets/locales/nl-NL-DxN4Yc1t.js +1 -0
- package/web/app/site/app/assets/locales/oc-FR-CfheRbCu.js +1 -0
- package/web/app/site/app/assets/locales/pl-PL-DkwGXf6P.js +1 -0
- package/web/app/site/app/assets/locales/pseudo-LOCALE-CQ4XxkQ0.js +1 -0
- package/web/app/site/app/assets/locales/pt-BR-nGL0HdFS.js +1 -0
- package/web/app/site/app/assets/locales/pt-PT-Cp17aj2z.js +1 -0
- package/web/app/site/app/assets/locales/ru-RU-0Y8cIoaK.js +1 -0
- package/web/app/site/app/assets/locales/th-TH-CfheRbCu.js +1 -0
- package/web/app/site/app/assets/locales/tok-CfheRbCu.js +1 -0
- package/web/app/site/app/assets/locales/tr-TR-CfheRbCu.js +1 -0
- package/web/app/site/app/assets/locales/uk-UA-C5E3dFBf.js +1 -0
- package/web/app/site/app/assets/locales/zh-CN-BHJi7_et.js +1 -0
- package/web/app/site/app/assets/locales/zh-TW-CfheRbCu.js +1 -0
- package/web/app/site/app/assets/main-BdqNbG-a.js +26 -0
- package/web/app/site/app/assets/main-BdqNbG-a.js.map +1 -0
- package/web/app/site/app/assets/mock-home-DGhR__He.js +2 -0
- package/web/app/site/app/assets/mock-home-DGhR__He.js.map +1 -0
- package/web/app/site/app/assets/multi-column-ROck0NVt.jpg +0 -0
- package/web/app/site/app/assets/multi-hashtag-timeline-DH5INVHi.jpg +0 -0
- package/web/app/site/app/assets/nested-comments-thread-hv59kZLc.jpg +0 -0
- package/web/app/site/app/assets/polyfill-force-H8sUkLGp.js +2 -0
- package/web/app/site/app/assets/polyfill-force-H8sUkLGp.js.map +1 -0
- package/web/app/site/app/assets/pwa-viewport-ogKbF51K.js +20 -0
- package/web/app/site/app/assets/pwa-viewport-ogKbF51K.js.map +1 -0
- package/web/app/site/app/assets/style-B1iLPTPR.css +2 -0
- package/web/app/site/app/assets/temml-DuyIQMei.js +97 -0
- package/web/app/site/app/assets/temml-DuyIQMei.js.map +1 -0
- package/web/app/site/app/assets/tinyld.light.node-DtbBhLYC.js +2 -0
- package/web/app/site/app/assets/tinyld.light.node-DtbBhLYC.js.map +1 -0
- package/web/app/site/app/assets/year-in-posts-B2lywqdx.png +0 -0
- package/web/app/site/app/assets/year-in-posts-DJv_star.js +3 -0
- package/web/app/site/app/assets/year-in-posts-DJv_star.js.map +1 -0
- package/web/app/site/app/compose/index.html +20 -0
- package/web/app/site/app/favicon.ico +0 -0
- package/web/app/site/app/index.html +73 -0
- package/web/app/site/app/logo-192.png +0 -0
- package/web/app/site/app/logo-512.png +0 -0
- package/web/app/site/app/logo-badge-72.png +0 -0
- package/web/app/site/app/logo-maskable-512.png +0 -0
- package/web/app/site/app/logo-monochrome-512.png +0 -0
- package/web/app/site/app/logo-monochrome-maskable-512.png +0 -0
- package/web/app/site/app/manifest.webmanifest +1 -0
- package/web/app/site/app/og-image-2.jpg +0 -0
- package/web/app/site/app/og-image.png +0 -0
- package/web/app/site/app/robots.txt +2 -0
- package/web/app/site/app/version.json +1 -0
- package/web/app/site/boot.js +34067 -0
- package/web/app/site/index.html +203 -0
- package/web/app/site/sw.js +70014 -0
- package/web/app/sw-src.mjs +220 -0
- package/web/front/#new-account.html# +43 -0
- package/web/front/admin.html +1 -81
- package/web/front/admin.js +85 -0
- package/web/front/new-account.html +1 -9
- package/web/front/new-account.js +13 -0
- package/web/front/run.html +1 -92
- package/web/front/run.js +107 -0
- package/lib/admin.mjs +0 -1913
- package/lib/intake.mjs +0 -1764
- package/lib/mastoapi.mjs +0 -1947
- package/lib/podrdf.mjs +0 -132
- package/lib/publisher.mjs +0 -1263
- package/web/admin/admin.js +0 -1114
- /package/lib/{oidc-auth.mjs → client/oidc-auth.mjs} +0 -0
- /package/lib/{webpush.mjs → client/webpush.mjs} +0 -0
- /package/lib/{bskyfeed.mjs → connections/bskyfeed.mjs} +0 -0
- /package/lib/{lease.mjs → core/lease.mjs} +0 -0
- /package/lib/{polls.mjs → core/polls.mjs} +0 -0
- /package/lib/{proof.mjs → core/proof.mjs} +0 -0
- /package/lib/{account.mjs → device/account.mjs} +0 -0
- /package/lib/{certs.mjs → device/certs.mjs} +0 -0
- /package/lib/{home.mjs → device/home.mjs} +0 -0
- /package/lib/{ports.mjs → device/ports.mjs} +0 -0
- /package/lib/{guard.mjs → shared/guard.mjs} +0 -0
- /package/lib/{safefetch.mjs → shared/safefetch.mjs} +0 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
// group.js — the group operator's console and the status, joins, review and
|
|
2
|
+
// follower controls shared with a person: the pickers with their keyboard
|
|
3
|
+
// guard, the request rows, and the refresh of every list.
|
|
4
|
+
|
|
5
|
+
// Each control shows the setting it would change, so what it displays IS the
|
|
6
|
+
// current state — no separate sentence reporting it.
|
|
7
|
+
const MOD = { on: 'moderated', off: 'unmoderated' };
|
|
8
|
+
function renderGroupToggles() {
|
|
9
|
+
$('joins-mod').value = config.approveJoins ? MOD.on : MOD.off;
|
|
10
|
+
$('review-mod').value = config.review ? MOD.on : MOD.off;
|
|
11
|
+
}
|
|
12
|
+
function renderStatus() {
|
|
13
|
+
STATUS_PICK.value = config.quiescedAt ? 'parked' : 'active';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Parking is reversible — the follow graph is saved first and going back to
|
|
17
|
+
// active re-sends a Follow to everyone in it — so the word applies directly,
|
|
18
|
+
// like the moderation controls. The result line says what actually happened.
|
|
19
|
+
let statusBusy = false;
|
|
20
|
+
const setStatus = async (parked) => {
|
|
21
|
+
if (statusBusy || parked === !!config.quiescedAt) return;
|
|
22
|
+
statusBusy = true;
|
|
23
|
+
try {
|
|
24
|
+
const r = await write(parked ? '/park' : '/revive', {},
|
|
25
|
+
parked ? 'parking — unfollowing everyone and closing the inbox' : 'reviving — re-following the saved graph');
|
|
26
|
+
if (r) {
|
|
27
|
+
say(parked
|
|
28
|
+
? `parked ${r.quiescedAt}: unfollowed ${r.unfollowed}/${r.following}, inbox closed`
|
|
29
|
+
: `revived: inbox open, ${r.refollowed}/${r.of} follow(s) re-sent`);
|
|
30
|
+
await load();
|
|
31
|
+
}
|
|
32
|
+
renderStatus();
|
|
33
|
+
} finally { statusBusy = false; }
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// One write at a time, because committing an open picker with Enter fires our
|
|
37
|
+
// keydown AND the browser's change — the second call must find the first still
|
|
38
|
+
// holding the flag, or config, not yet updated by the awaited write, lets a
|
|
39
|
+
// duplicate POST through.
|
|
40
|
+
let modBusy = false;
|
|
41
|
+
const setJoins = async (approve) => {
|
|
42
|
+
// Picking the value already in force is not a change: no write, and no
|
|
43
|
+
// republish of the actor for a setting that did not move.
|
|
44
|
+
if (modBusy || approve === !!config.approveJoins) return;
|
|
45
|
+
modBusy = true;
|
|
46
|
+
try {
|
|
47
|
+
if (await write('/joins', { approve }, approve ? 'join requests will wait' : 'anyone may join')) {
|
|
48
|
+
config.approveJoins = approve;
|
|
49
|
+
refreshGroup();
|
|
50
|
+
}
|
|
51
|
+
// Both ways: refused, the control must not keep the value it did not get;
|
|
52
|
+
// granted, a blur meanwhile may have repainted it to the old state.
|
|
53
|
+
renderGroupToggles();
|
|
54
|
+
} finally { modBusy = false; }
|
|
55
|
+
};
|
|
56
|
+
const setReview = async (on) => {
|
|
57
|
+
if (modBusy || on === !!config.review) return;
|
|
58
|
+
modBusy = true;
|
|
59
|
+
try {
|
|
60
|
+
if (await write('/review', { on }, on ? 'posts will be held' : 'posts will be carried at once')) {
|
|
61
|
+
config.review = on;
|
|
62
|
+
refreshGroup();
|
|
63
|
+
}
|
|
64
|
+
renderGroupToggles();
|
|
65
|
+
} finally { modBusy = false; }
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Arrowing a closed select fires `change` on every keypress, so a keyboard user
|
|
69
|
+
// running down the list would apply each value they passed — here that silently
|
|
70
|
+
// opens or closes the group. An arrow arms a flag and the change it causes is
|
|
71
|
+
// ignored; Enter commits. A mouse never sets the flag, so clicking is unchanged.
|
|
72
|
+
// Same guard as the actor picker above, for the same reason.
|
|
73
|
+
function onPick(el, apply, repaint = renderGroupToggles) {
|
|
74
|
+
let arrowing = false;
|
|
75
|
+
el.addEventListener('keydown', (ev) => {
|
|
76
|
+
if (['ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown'].includes(ev.key)) arrowing = true;
|
|
77
|
+
if (ev.key === 'Enter') { arrowing = false; apply(el.value); }
|
|
78
|
+
// Escape abandons the armed value; what shows must return to what is.
|
|
79
|
+
if (ev.key === 'Escape') { arrowing = false; repaint(); }
|
|
80
|
+
});
|
|
81
|
+
// Leaving abandons too. Unconditional, because the swallow above already
|
|
82
|
+
// consumed the flag — the select may show a state that was never applied,
|
|
83
|
+
// and repainting from config costs nothing when it does match.
|
|
84
|
+
el.addEventListener('blur', () => { arrowing = false; repaint(); });
|
|
85
|
+
el.addEventListener('pointerdown', () => { arrowing = false; });
|
|
86
|
+
el.addEventListener('change', () => {
|
|
87
|
+
if (!arrowing) apply(el.value);
|
|
88
|
+
arrowing = false;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
onPick($('joins-mod'), (v) => setJoins(v === MOD.on));
|
|
93
|
+
onPick($('review-mod'), (v) => setReview(v === MOD.on));
|
|
94
|
+
onPick(STATUS_PICK, (v) => setStatus(v === 'parked'), renderStatus);
|
|
95
|
+
|
|
96
|
+
// A person's follower gate. Automatic is what a migration wave needs: every
|
|
97
|
+
// follower's server re-follows at once, and the waiting queue caps at 500.
|
|
98
|
+
let followsBusy = false;
|
|
99
|
+
const setAutoAccept = async (auto) => {
|
|
100
|
+
if (followsBusy || auto === !!config.autoAcceptFollows) return;
|
|
101
|
+
followsBusy = true;
|
|
102
|
+
try {
|
|
103
|
+
if (await write('/config', { autoAcceptFollows: auto },
|
|
104
|
+
auto ? 'new followers are accepted automatically' : 'new followers will wait for you')) {
|
|
105
|
+
config.autoAcceptFollows = auto;
|
|
106
|
+
}
|
|
107
|
+
FOLLOWS_PICK.value = config.autoAcceptFollows ? 'auto' : 'approve';
|
|
108
|
+
} finally { followsBusy = false; }
|
|
109
|
+
};
|
|
110
|
+
onPick(FOLLOWS_PICK, (v) => setAutoAccept(v === 'auto'),
|
|
111
|
+
() => { FOLLOWS_PICK.value = config?.autoAcceptFollows ? 'auto' : 'approve'; });
|
|
112
|
+
|
|
113
|
+
// One row: what it is, then what can be done to it.
|
|
114
|
+
function row(text, sub, actions) {
|
|
115
|
+
const li = document.createElement('li');
|
|
116
|
+
const span = document.createElement('span');
|
|
117
|
+
span.textContent = text;
|
|
118
|
+
if (sub) {
|
|
119
|
+
const small = document.createElement('div');
|
|
120
|
+
small.className = 'muted';
|
|
121
|
+
small.textContent = sub;
|
|
122
|
+
span.appendChild(small);
|
|
123
|
+
}
|
|
124
|
+
li.appendChild(span);
|
|
125
|
+
for (const [label, run, hint] of actions) {
|
|
126
|
+
const b = document.createElement('button');
|
|
127
|
+
b.className = 'inline'; // sized like the page's other buttons
|
|
128
|
+
b.textContent = label;
|
|
129
|
+
// A list of fifteen buttons all reading "Mute" tells a screen-reader user
|
|
130
|
+
// browsing by button nothing; name each one for the row it acts on.
|
|
131
|
+
b.setAttribute('aria-label', `${label} ${text}`);
|
|
132
|
+
// Three leading spaces: the tooltip appears under the pointer, and without
|
|
133
|
+
// them the first word sits behind the cursor.
|
|
134
|
+
if (hint) b.title = ` ${hint}`;
|
|
135
|
+
// Where focus should land afterwards. `b.disabled = true` blurs it to
|
|
136
|
+
// <body> at once, and refreshGroup() then wipes and rebuilds the list, so
|
|
137
|
+
// without this every mute, eject, admit or refuse dropped a keyboard user
|
|
138
|
+
// back to the top of the page.
|
|
139
|
+
b.addEventListener('click', async () => {
|
|
140
|
+
const list = li.parentNode;
|
|
141
|
+
focusAfterRefresh = { listId: list?.id, index: [...(list?.children || [])].indexOf(li), label };
|
|
142
|
+
b.disabled = true;
|
|
143
|
+
await run();
|
|
144
|
+
refreshGroup();
|
|
145
|
+
});
|
|
146
|
+
li.appendChild(b);
|
|
147
|
+
}
|
|
148
|
+
return li;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Set by a row action, consumed by the fill() that replaces that row.
|
|
152
|
+
let focusAfterRefresh = null;
|
|
153
|
+
|
|
154
|
+
function fill(listId, countId, items, make) {
|
|
155
|
+
const ul = $(listId);
|
|
156
|
+
ul.textContent = '';
|
|
157
|
+
$(countId).textContent = items.length ? `(${items.length})` : '(none)';
|
|
158
|
+
for (const it of items) ul.appendChild(make(it));
|
|
159
|
+
if (!focusAfterRefresh || focusAfterRefresh.listId !== listId) return;
|
|
160
|
+
const { index, label } = focusAfterRefresh;
|
|
161
|
+
focusAfterRefresh = null;
|
|
162
|
+
// The same action on the row that took this one's place, or the row before it
|
|
163
|
+
// when the list just got shorter. Nothing left to land on is the one case
|
|
164
|
+
// where the heading is the honest answer.
|
|
165
|
+
const rows = [...ul.children];
|
|
166
|
+
const li = rows[Math.min(index, rows.length - 1)];
|
|
167
|
+
const same = li && [...li.querySelectorAll('button')].find(x => x.textContent === label);
|
|
168
|
+
const heading = $(countId).closest('h3');
|
|
169
|
+
// A bare <h3> is not focusable, so the "nothing left" fallback would silently
|
|
170
|
+
// drop focus to <body> — give it a programmatic-only tab stop first.
|
|
171
|
+
if (heading && !heading.hasAttribute('tabindex')) heading.setAttribute('tabindex', '-1');
|
|
172
|
+
(same || li?.querySelector('button') || heading)?.focus?.();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// The request rows, shared: a group calls them joins, a person calls them
|
|
176
|
+
// follows, and the two do exactly the same thing to exactly the same queue.
|
|
177
|
+
function fillRequests(list) {
|
|
178
|
+
fill('requests', 'requests-count', list, (r) => row(r.actor, r.at, [
|
|
179
|
+
['Accept', () => write('/admit', { actor: r.actor }, 'accepted'), 'Let them follow you'],
|
|
180
|
+
['Refuse', () => write('/refuse', { actor: r.actor }, 'refused'), 'Turn this down; they may ask again'],
|
|
181
|
+
]));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// The whole queue in one action — the shape a migration wave arrives in.
|
|
185
|
+
$('admit-all').addEventListener('click', async () => {
|
|
186
|
+
if (await write('/admit', { all: true }, 'accepted everyone waiting')) {
|
|
187
|
+
if (config.kind === 'group') refreshGroup(); else refreshRequests();
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// A person's whole group pane is this one block, and only when it has something
|
|
192
|
+
// in it — an empty heading promising a list is what the group console avoids too.
|
|
193
|
+
async function refreshRequests() {
|
|
194
|
+
const { json } = await api('/requests');
|
|
195
|
+
const list = json?.requests || [];
|
|
196
|
+
$('pane-group').hidden = !list.length;
|
|
197
|
+
$('block-requests').hidden = !list.length;
|
|
198
|
+
if (list.length) fillRequests(list);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// What a queued moderation would do, in the words the buttons beside it use.
|
|
202
|
+
function describeModeration(e) {
|
|
203
|
+
const o = e.activity?.object;
|
|
204
|
+
const id = typeof o === 'string' ? o : o?.id || '';
|
|
205
|
+
if (e.type === 'Block') return `block ${id}`;
|
|
206
|
+
if (e.type === 'Remove') return `eject ${id}`;
|
|
207
|
+
if (e.type === 'Delete') return `take down ${id}`;
|
|
208
|
+
if (e.type === 'Add') return `add ${id}`;
|
|
209
|
+
return id || 'no target named';
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async function refreshGroup() {
|
|
213
|
+
const [members, requests, pending, announced, modqueue] = await Promise.all(
|
|
214
|
+
['/members', '/requests', '/pending', '/announced', '/modqueue']
|
|
215
|
+
.map(p => api(p).then(r => r.json || {})));
|
|
216
|
+
|
|
217
|
+
fill('requests', 'requests-count', requests.requests || [], (r) => row(r.actor, r.at, [
|
|
218
|
+
['Admit', () => write('/admit', { actor: r.actor }, 'admitted'), 'Let them in — they become a member'],
|
|
219
|
+
['Refuse', () => write('/refuse', { actor: r.actor }, 'refused'), 'Turn this request down; they may ask again'],
|
|
220
|
+
]));
|
|
221
|
+
|
|
222
|
+
fill('pending', 'pending-count', pending.pending || [], (p) => row(p.noteId, `${p.actor} · ${p.at}`, [
|
|
223
|
+
['Carry it', () => write('/approve', { noteId: p.noteId }, 'carried'), 'Announce this post to every member'],
|
|
224
|
+
['Decline', () => write('/decline', { noteId: p.noteId }, 'declined'), 'Do not carry it — the post stays up on its author\u2019s pod'],
|
|
225
|
+
]));
|
|
226
|
+
|
|
227
|
+
// Moderation another server asked for: apply it, or turn it down. The route
|
|
228
|
+
// answers with the list itself, not an object wrapping one.
|
|
229
|
+
const modq = Array.isArray(modqueue) ? modqueue : (modqueue.queue || []);
|
|
230
|
+
fill('modqueue', 'modqueue-count', modq, (e) => row(
|
|
231
|
+
`${e.type} — ${describeModeration(e)}`, `asked by ${e.moderator} · ${e.at}`, [
|
|
232
|
+
['Carry it out', () => write('/modqueue', { id: e.id, action: 'apply' }, 'applied'),
|
|
233
|
+
'Do what the moderator asked, as if you had asked it'],
|
|
234
|
+
['Turn it down', () => write('/modqueue', { id: e.id, action: 'dismiss' }, 'dismissed'),
|
|
235
|
+
'Leave things as they are and drop the request'],
|
|
236
|
+
]));
|
|
237
|
+
|
|
238
|
+
// A queue nothing can arrive in is not an empty list, it is a list that does
|
|
239
|
+
// not apply — so the setting has to be on before the heading appears at all.
|
|
240
|
+
// This one has no setting: it fills only when a moderator has asked.
|
|
241
|
+
$('block-requests').hidden = !(config.approveJoins && (requests.requests || []).length);
|
|
242
|
+
$('block-pending').hidden = !(config.review && (pending.pending || []).length);
|
|
243
|
+
$('block-modqueue').hidden = !modq.length;
|
|
244
|
+
|
|
245
|
+
fill('members', 'members-count', members.members || [], (m) => row(
|
|
246
|
+
m.handle || m.actor, m.muted ? 'muted — their posts are not carried' : null,
|
|
247
|
+
[
|
|
248
|
+
m.muted
|
|
249
|
+
? ['Unmute', () => write('/unmute', { actor: m.actor }, 'unmuted'), 'Carry their posts again']
|
|
250
|
+
: ['Mute', () => write('/mute', { actor: m.actor }, 'muted'), 'Stop carrying their posts; they stay a member'],
|
|
251
|
+
['Eject', () => write('/eject', { actor: m.actor }, 'ejected'), 'Remove them and tell their server; also mutes'],
|
|
252
|
+
]));
|
|
253
|
+
|
|
254
|
+
fill('announced', 'announced-count', announced.announced || [], (a) => row(
|
|
255
|
+
a.noteId, `${a.actor} · ${a.announcedAt}`,
|
|
256
|
+
[['Retract', () => write('/retract', { noteId: a.noteId }, 'retracted'), 'Un-say this announcement to everyone it reached']]));
|
|
257
|
+
}
|
|
258
|
+
|