fedipod-server 0.29.0 → 0.30.0
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 +11 -6
- package/dist/door.d.ts +4 -0
- package/dist/door.js +31 -0
- package/dist/fedipod.d.ts +16 -0
- package/dist/fedipod.js +13 -0
- package/dist/front.d.ts +3 -0
- package/dist/front.js +94 -0
- package/dist/handler.d.ts +36 -101
- package/dist/handler.js +85 -645
- package/dist/handler.jsonld +2 -30
- package/dist/identities.d.ts +62 -0
- package/dist/identities.js +236 -0
- package/dist/mounts.d.ts +43 -0
- package/dist/mounts.js +123 -0
- package/dist/opt-in.d.ts +46 -0
- package/dist/opt-in.js +176 -0
- package/package.json +10 -18
- package/lib/client/c2s.mjs +0 -636
- package/lib/client/localapi.mjs +0 -87
- package/lib/client/masto/accounts.mjs +0 -310
- package/lib/client/masto/body.mjs +0 -156
- package/lib/client/masto/index.mjs +0 -206
- package/lib/client/masto/instance.mjs +0 -112
- package/lib/client/masto/media.mjs +0 -79
- package/lib/client/masto/oauth.mjs +0 -656
- package/lib/client/masto/render.mjs +0 -518
- package/lib/client/masto/statuses.mjs +0 -372
- package/lib/client/masto/timelines.mjs +0 -438
- package/lib/client/oidc-auth.mjs +0 -62
- package/lib/client/streaming.mjs +0 -154
- package/lib/client/webpush.mjs +0 -98
- package/lib/connections/acctfeed.mjs +0 -257
- package/lib/connections/atproto.mjs +0 -309
- package/lib/connections/bskyfeed.mjs +0 -243
- package/lib/connections/bskygroup.mjs +0 -162
- package/lib/connections/fediacct.mjs +0 -253
- package/lib/connections/import.mjs +0 -357
- package/lib/connections/tagfeed.mjs +0 -212
- package/lib/connections/vault.mjs +0 -114
- package/lib/core/as2.mjs +0 -206
- package/lib/core/contexts/activitystreams.json +0 -379
- package/lib/core/contexts/anno.json +0 -126
- package/lib/core/contexts/did-v1.json +0 -57
- package/lib/core/contexts/fep-5711.json +0 -36
- package/lib/core/contexts/gotosocial.json +0 -86
- package/lib/core/contexts/identity-v1.json +0 -152
- package/lib/core/contexts/index.mjs +0 -63
- package/lib/core/contexts/join-lemmy.json +0 -33
- package/lib/core/contexts/joinmastodon.json +0 -28
- package/lib/core/contexts/litepub-0.1.json +0 -60
- package/lib/core/contexts/map.json +0 -19
- package/lib/core/contexts/miscellany.json +0 -19
- package/lib/core/contexts/quotes.json +0 -18
- package/lib/core/contexts/schemaorg.json +0 -8845
- package/lib/core/contexts/security-data-integrity-v1.json +0 -78
- package/lib/core/contexts/security-data-integrity-v2.json +0 -81
- package/lib/core/contexts/security-multikey-v1.json +0 -35
- package/lib/core/contexts/security-v1.json +0 -74
- package/lib/core/contexts/webfinger.json +0 -10
- package/lib/core/deliver.mjs +0 -387
- package/lib/core/graphview.mjs +0 -327
- package/lib/core/intake/activities.mjs +0 -649
- package/lib/core/intake/activity.mjs +0 -318
- package/lib/core/intake/channel.mjs +0 -144
- package/lib/core/intake/group.mjs +0 -258
- package/lib/core/intake/index.mjs +0 -732
- package/lib/core/intake/notes.mjs +0 -367
- package/lib/core/intake/verify.mjs +0 -142
- package/lib/core/keys.mjs +0 -153
- package/lib/core/lease.mjs +0 -206
- package/lib/core/place.mjs +0 -82
- package/lib/core/polls.mjs +0 -105
- package/lib/core/profile-page.mjs +0 -104
- package/lib/core/proof.mjs +0 -79
- package/lib/core/publisher/collections.mjs +0 -272
- package/lib/core/publisher/index.mjs +0 -522
- package/lib/core/publisher/notes.mjs +0 -519
- package/lib/core/publisher/own.mjs +0 -143
- package/lib/core/publisher/questions.mjs +0 -241
- package/lib/core/publisher/restore.mjs +0 -224
- package/lib/core/shapes/activitystreams.ttl +0 -157
- package/lib/core/shapes/index.mjs +0 -132
- package/lib/core/shapes/shapes-text.mjs +0 -13
- package/lib/core/social.mjs +0 -561
- package/lib/core/storage.mjs +0 -176
- package/lib/core/store.mjs +0 -578
- package/lib/core/wire-quotes.mjs +0 -71
- package/lib/core/wire.mjs +0 -925
- package/lib/device/account.mjs +0 -87
- package/lib/device/admin/index.mjs +0 -13
- package/lib/device/admin/origins.mjs +0 -35
- package/lib/device/admin/routes/connections.mjs +0 -144
- package/lib/device/admin/routes/gateway.mjs +0 -199
- package/lib/device/admin/routes/lifecycle.mjs +0 -200
- package/lib/device/admin/routes/owner.mjs +0 -322
- package/lib/device/admin/routes/setup.mjs +0 -428
- package/lib/device/admin/routes/social.mjs +0 -188
- package/lib/device/admin/server.mjs +0 -95
- package/lib/device/admin/static.mjs +0 -247
- package/lib/device/admin/surface.mjs +0 -315
- package/lib/device/certs.mjs +0 -281
- package/lib/device/cli/commands/account.mjs +0 -586
- package/lib/device/cli/commands/run.mjs +0 -278
- package/lib/device/cli/commands/service.mjs +0 -221
- package/lib/device/cli/commands/setup.mjs +0 -489
- package/lib/device/cli/commands/state.mjs +0 -561
- package/lib/device/cli/context.mjs +0 -288
- package/lib/device/export-collections.mjs +0 -161
- package/lib/device/gateway-move.mjs +0 -58
- package/lib/device/home.mjs +0 -161
- package/lib/device/migrate.mjs +0 -115
- package/lib/device/ports.mjs +0 -27
- package/lib/device/remote.mjs +0 -54
- package/lib/device/setup.mjs +0 -496
- package/lib/device/update.mjs +0 -96
- package/lib/gateway/caches.mjs +0 -36
- package/lib/gateway/directory.mjs +0 -90
- package/lib/gateway/front-core.mjs +0 -966
- package/lib/gateway/gateway-core.mjs +0 -244
- package/lib/gateway/headers.mjs +0 -49
- package/lib/gateway/httpsig.mjs +0 -159
- package/lib/gateway/notices.mjs +0 -84
- package/lib/gateway/quiet.mjs +0 -189
- package/lib/gateway/relay-extras.mjs +0 -89
- package/lib/gateway/token-claims.mjs +0 -16
- package/lib/pod/README.md +0 -61
- package/lib/pod/actor.mjs +0 -96
- package/lib/pod/collection.mjs +0 -77
- package/lib/pod/containers.mjs +0 -140
- package/lib/pod/discovery.mjs +0 -46
- package/lib/pod/featured.mjs +0 -18
- package/lib/pod/followers.mjs +0 -24
- package/lib/pod/following.mjs +0 -10
- package/lib/pod/http.mjs +0 -74
- package/lib/pod/inbox.mjs +0 -166
- package/lib/pod/links.mjs +0 -35
- package/lib/pod/location.mjs +0 -52
- package/lib/pod/media.mjs +0 -27
- package/lib/pod/notes.mjs +0 -78
- package/lib/pod/notifications.mjs +0 -89
- package/lib/pod/outbox.mjs +0 -18
- package/lib/pod/package.json +0 -19
- package/lib/pod/policy.mjs +0 -58
- package/lib/pod/private.mjs +0 -19
- package/lib/pod/root.mjs +0 -104
- package/lib/pod/state.mjs +0 -40
- package/lib/pod/transport.mjs +0 -674
- package/lib/pod/type-index.mjs +0 -101
- package/lib/pod/urls.mjs +0 -91
- package/lib/server/embed.mjs +0 -424
- package/lib/session/README.md +0 -137
- package/lib/session/demo.html +0 -94
- package/lib/session/fedi-account.mjs +0 -417
- package/lib/session/fedi-login.mjs +0 -123
- package/lib/session/oidc-session.mjs +0 -233
- package/lib/session/package.json +0 -49
- package/lib/shared/guard.mjs +0 -213
- package/lib/shared/links.mjs +0 -9
- package/lib/shared/safefetch.mjs +0 -235
- package/lib/shared/ua.mjs +0 -29
- package/phanpy/dist/404.html +0 -40
- package/phanpy/dist/_headers +0 -2
- package/phanpy/dist/apple-touch-icon.png +0 -0
- package/phanpy/dist/assets/ICONS-DIPJeU0C.js +0 -2
- package/phanpy/dist/assets/ICONS-DIPJeU0C.js.map +0 -1
- package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js +0 -183
- package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js.map +0 -1
- package/phanpy/dist/assets/Temml-CCjoacWt.woff2 +0 -0
- package/phanpy/dist/assets/__vite-browser-external-C7iut881.js +0 -2
- package/phanpy/dist/assets/__vite-browser-external-C7iut881.js.map +0 -1
- package/phanpy/dist/assets/boosts-carousel-BiOaNdMT.jpg +0 -0
- package/phanpy/dist/assets/catch-up-O5q5C75Z.png +0 -0
- package/phanpy/dist/assets/chunk-aKtaBQYM.js +0 -1
- package/phanpy/dist/assets/compose-CFEx7wb4.js +0 -2
- package/phanpy/dist/assets/compose-CFEx7wb4.js.map +0 -1
- package/phanpy/dist/assets/compose-ZJN5xSb4.js +0 -35
- package/phanpy/dist/assets/compose-ZJN5xSb4.js.map +0 -1
- package/phanpy/dist/assets/debug.module-YFQgwnIr.js +0 -52
- package/phanpy/dist/assets/debug.module-YFQgwnIr.js.map +0 -1
- package/phanpy/dist/assets/dom-p1YcJ5Rw.js +0 -2
- package/phanpy/dist/assets/dom-p1YcJ5Rw.js.map +0 -1
- package/phanpy/dist/assets/home-mobile-dark@2x-Dc-J8-SM.png +0 -0
- package/phanpy/dist/assets/home-mobile-light@2x-Bd3fod8m.png +0 -0
- package/phanpy/dist/assets/home-tablet-dark@2x-BgcNI8le.png +0 -0
- package/phanpy/dist/assets/home-tablet-light@2x-BW2RV9T6.png +0 -0
- package/phanpy/dist/assets/icons/add-circle-line-WD0mwORD.js +0 -1
- package/phanpy/dist/assets/icons/alert-line-CpFUMf9s.js +0 -1
- package/phanpy/dist/assets/icons/android-2-line-Bzxnrd3S.js +0 -1
- package/phanpy/dist/assets/icons/announcement-line-5nwaJFJm.js +0 -1
- package/phanpy/dist/assets/icons/arrow-down-circle-line-a7Id9-Iv.js +0 -1
- package/phanpy/dist/assets/icons/arrow-down-line-B8uzXzq6.js +0 -1
- package/phanpy/dist/assets/icons/arrow-left-line-CGrGT9C-.js +0 -1
- package/phanpy/dist/assets/icons/arrow-right-line-CE-HERfX.js +0 -1
- package/phanpy/dist/assets/icons/arrow-to-up-line-CvdQjmcy.js +0 -1
- package/phanpy/dist/assets/icons/arrow-up-circle-line-DEparSNF.js +0 -1
- package/phanpy/dist/assets/icons/arrow-up-line-C7yBeugc.js +0 -1
- package/phanpy/dist/assets/icons/arrows-right-line-BtbXmJGP.js +0 -1
- package/phanpy/dist/assets/icons/at-line-CF66Bznk.js +0 -1
- package/phanpy/dist/assets/icons/attachment-line-BY8It-l9.js +0 -1
- package/phanpy/dist/assets/icons/blockquote-line-BS6pU_hm.js +0 -1
- package/phanpy/dist/assets/icons/board-line-C0UWXyA6.js +0 -1
- package/phanpy/dist/assets/icons/bookmark-line-1CtX5JLF.js +0 -1
- package/phanpy/dist/assets/icons/building-5-line-Dd59MzbO.js +0 -1
- package/phanpy/dist/assets/icons/bus-2-line-6_dvA0GG.js +0 -1
- package/phanpy/dist/assets/icons/calendar-day-line-Crpl_fmu.js +0 -1
- package/phanpy/dist/assets/icons/calendar-month-line-vommts2C.js +0 -1
- package/phanpy/dist/assets/icons/calendar-time-add-line-BU_DTlQk.js +0 -1
- package/phanpy/dist/assets/icons/camera-line-Cv69MEei.js +0 -1
- package/phanpy/dist/assets/icons/celebrate-line-B8DvIoi0.js +0 -1
- package/phanpy/dist/assets/icons/chart-bar-line-FK-QOmtF.js +0 -1
- package/phanpy/dist/assets/icons/chart-line-line-BGcJAFWw.js +0 -1
- package/phanpy/dist/assets/icons/chat-3-line-YFK2-hwz.js +0 -1
- package/phanpy/dist/assets/icons/check-circle-line-DsAxFr5-.js +0 -1
- package/phanpy/dist/assets/icons/clipboard-line-BBp364gJ.js +0 -1
- package/phanpy/dist/assets/icons/close-circle-line-CICdiuGz.js +0 -1
- package/phanpy/dist/assets/icons/close-line-DYrFWcjv.js +0 -1
- package/phanpy/dist/assets/icons/cloud-line-tiQAbah8.js +0 -1
- package/phanpy/dist/assets/icons/code-line-fAl8iiV3.js +0 -1
- package/phanpy/dist/assets/icons/comment-2-line-CR3g7WeB.js +0 -1
- package/phanpy/dist/assets/icons/copy-2-line-CLW69yF5.js +0 -1
- package/phanpy/dist/assets/icons/delete-2-line-B8xmbr4n.js +0 -1
- package/phanpy/dist/assets/icons/document-3-line-DBGNhAg2.js +0 -1
- package/phanpy/dist/assets/icons/document-line-C7mb9sb7.js +0 -1
- package/phanpy/dist/assets/icons/down-line-BGqSSThd.js +0 -1
- package/phanpy/dist/assets/icons/edit-4-line-DcgGaEhx.js +0 -1
- package/phanpy/dist/assets/icons/emoji-2-line-D8YgnM-y.js +0 -1
- package/phanpy/dist/assets/icons/exit-line-Dc07BS-x.js +0 -1
- package/phanpy/dist/assets/icons/external-link-line-BvpSkmjO.js +0 -1
- package/phanpy/dist/assets/icons/eye-2-line-CiWXx-f_.js +0 -1
- package/phanpy/dist/assets/icons/eye-close-line-BgTaSJ4P.js +0 -1
- package/phanpy/dist/assets/icons/filter-2-line-B_mR2usy.js +0 -1
- package/phanpy/dist/assets/icons/filter-line-C_nm-3cU.js +0 -1
- package/phanpy/dist/assets/icons/flag-1-line-C2HB05I0.js +0 -1
- package/phanpy/dist/assets/icons/forbid-circle-line-D3LTT9yd.js +0 -1
- package/phanpy/dist/assets/icons/formula-line-DLrt2d6j.js +0 -1
- package/phanpy/dist/assets/icons/grid-line-CgUmEikf.js +0 -1
- package/phanpy/dist/assets/icons/group-line-C5fnX0wU.js +0 -1
- package/phanpy/dist/assets/icons/hand-finger-2-line-BGgxbuL9.js +0 -1
- package/phanpy/dist/assets/icons/hashtag-line-CyTEEXBb.js +0 -1
- package/phanpy/dist/assets/icons/heart-crack-line-BZddbO2C.js +0 -1
- package/phanpy/dist/assets/icons/heart-line-CJ7K47J4.js +0 -1
- package/phanpy/dist/assets/icons/history-2-line-kWWvFzqv.js +0 -1
- package/phanpy/dist/assets/icons/history-line-bGQiwbTH.js +0 -1
- package/phanpy/dist/assets/icons/home-3-line-fRU1zeLG.js +0 -1
- package/phanpy/dist/assets/icons/information-line-iNk6-sOY.js +0 -1
- package/phanpy/dist/assets/icons/keyboard-line-DsCyuQNz.js +0 -1
- package/phanpy/dist/assets/icons/layout-4-line-CZkOX52Z.js +0 -1
- package/phanpy/dist/assets/icons/layout-5-line-B_znt5wO.js +0 -1
- package/phanpy/dist/assets/icons/left-line-eUw0tya4.js +0 -1
- package/phanpy/dist/assets/icons/lightning-line-DaKoDdix.js +0 -1
- package/phanpy/dist/assets/icons/link-2-line-DCqLmMA7.js +0 -1
- package/phanpy/dist/assets/icons/list-check-line-BAxosBh9.js +0 -1
- package/phanpy/dist/assets/icons/lock-line-CPoaXeUW.js +0 -1
- package/phanpy/dist/assets/icons/mail-line-B0P8aa1L.js +0 -1
- package/phanpy/dist/assets/icons/moon-line-CEqNAToP.js +0 -1
- package/phanpy/dist/assets/icons/more-1-fill-Dw2e5xab.js +0 -1
- package/phanpy/dist/assets/icons/more-3-line-BIiVjYTz.js +0 -1
- package/phanpy/dist/assets/icons/notification-line-BZZq2Gtu.js +0 -1
- package/phanpy/dist/assets/icons/pencil-line-CKh8-A1v.js +0 -1
- package/phanpy/dist/assets/icons/photo-album-line-Bnfg2u40.js +0 -1
- package/phanpy/dist/assets/icons/pin-line-DpTolyhs.js +0 -1
- package/phanpy/dist/assets/icons/play-fill-B0-G_8lX.js +0 -1
- package/phanpy/dist/assets/icons/qrcode-2-line-B6SPCaHn.js +0 -1
- package/phanpy/dist/assets/icons/quill-pen-line-B6LUrnCP.js +0 -1
- package/phanpy/dist/assets/icons/quote-left-fill-hQZ1cj_6.js +0 -1
- package/phanpy/dist/assets/icons/radar-line-CKyroTth.js +0 -1
- package/phanpy/dist/assets/icons/react-line-CoIKhhtK.js +0 -1
- package/phanpy/dist/assets/icons/refresh-2-line-D0mTF97S.js +0 -1
- package/phanpy/dist/assets/icons/right-line-B3KWJaqc.js +0 -1
- package/phanpy/dist/assets/icons/rocket-line-4KZl537D.js +0 -1
- package/phanpy/dist/assets/icons/round-fill-C69NTrZ0.js +0 -1
- package/phanpy/dist/assets/icons/round-line-B9k_1uo-.js +0 -1
- package/phanpy/dist/assets/icons/route-line-B28ReHcE.js +0 -1
- package/phanpy/dist/assets/icons/rows-4-line-CrBniagM.js +0 -1
- package/phanpy/dist/assets/icons/scan-line-DSf74YdP.js +0 -1
- package/phanpy/dist/assets/icons/search-2-line-B6geIU1z.js +0 -1
- package/phanpy/dist/assets/icons/settings-3-line-azJwK47w.js +0 -1
- package/phanpy/dist/assets/icons/settings-6-line-C_5zc5YR.js +0 -1
- package/phanpy/dist/assets/icons/share-2-line-D5MxWjrm.js +0 -1
- package/phanpy/dist/assets/icons/share-forward-line-Cp61fZzZ.js +0 -1
- package/phanpy/dist/assets/icons/sparkles-2-line-DYYyXTaW.js +0 -1
- package/phanpy/dist/assets/icons/sparkles-line-C2hY1s6I.js +0 -1
- package/phanpy/dist/assets/icons/time-line-BF3eet1v.js +0 -1
- package/phanpy/dist/assets/icons/transfer-4-line-oisfvTBw.js +0 -1
- package/phanpy/dist/assets/icons/translate-line-BFWol2Ce.js +0 -1
- package/phanpy/dist/assets/icons/unlock-line-X_x5vwv3.js +0 -1
- package/phanpy/dist/assets/icons/upload-3-line-DgzwUJeW.js +0 -1
- package/phanpy/dist/assets/icons/user-4-line-BVSynZCp.js +0 -1
- package/phanpy/dist/assets/icons/user-add-2-line-BlGS5Q8q.js +0 -1
- package/phanpy/dist/assets/icons/user-add-line-BbXdHG4z.js +0 -1
- package/phanpy/dist/assets/icons/user-edit-line-BFAHOV0X.js +0 -1
- package/phanpy/dist/assets/icons/user-follow-line-BXux0wSd.js +0 -1
- package/phanpy/dist/assets/icons/user-star-line-DdYlpHLU.js +0 -1
- package/phanpy/dist/assets/icons/user-warning-line-Cj43j0_E.js +0 -1
- package/phanpy/dist/assets/icons/user-x-line-DIDgNlPH.js +0 -1
- package/phanpy/dist/assets/icons/volume-line-Bs390KQt.js +0 -1
- package/phanpy/dist/assets/icons/volume-mute-line-DzlzIqFZ.js +0 -1
- package/phanpy/dist/assets/icons/walk-line-yNXfB-md.js +0 -1
- package/phanpy/dist/assets/icons/world-2-line-CenkGIwj.js +0 -1
- package/phanpy/dist/assets/icons/zoom-in-line-CaENUphf.js +0 -1
- package/phanpy/dist/assets/icons/zoom-out-line-BDNk0EWo.js +0 -1
- package/phanpy/dist/assets/instances-BNPptnn-.json +0 -333
- package/phanpy/dist/assets/locales/ar-SA-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/ca-ES-DHRW86Tz.js +0 -1
- package/phanpy/dist/assets/locales/cs-CZ-CKoqEuA1.js +0 -1
- package/phanpy/dist/assets/locales/de-DE-ByRPMRFy.js +0 -1
- package/phanpy/dist/assets/locales/eo-UY-CPC7wLCS.js +0 -1
- package/phanpy/dist/assets/locales/es-ES-dJa0Fd9t.js +0 -1
- package/phanpy/dist/assets/locales/eu-ES-C3djlPR2.js +0 -1
- package/phanpy/dist/assets/locales/fa-IR-DTT490Ck.js +0 -1
- package/phanpy/dist/assets/locales/fi-FI-B23MCPuz.js +0 -1
- package/phanpy/dist/assets/locales/fr-FR-BcaQsO5C.js +0 -1
- package/phanpy/dist/assets/locales/gl-ES-BR-CVKBN.js +0 -1
- package/phanpy/dist/assets/locales/he-IL-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/hu-HU-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/it-IT-C1136UFV.js +0 -1
- package/phanpy/dist/assets/locales/ja-JP-CRZmRAhD.js +0 -1
- package/phanpy/dist/assets/locales/kab-Cz8xH_TT.js +0 -1
- package/phanpy/dist/assets/locales/ko-KR-CG9UiY4o.js +0 -1
- package/phanpy/dist/assets/locales/lt-LT-CJcI6sHZ.js +0 -1
- package/phanpy/dist/assets/locales/nb-NO-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/nl-NL-DxN4Yc1t.js +0 -1
- package/phanpy/dist/assets/locales/oc-FR-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/pl-PL-DkwGXf6P.js +0 -1
- package/phanpy/dist/assets/locales/pseudo-LOCALE-CQ4XxkQ0.js +0 -1
- package/phanpy/dist/assets/locales/pt-BR-nGL0HdFS.js +0 -1
- package/phanpy/dist/assets/locales/pt-PT-Cp17aj2z.js +0 -1
- package/phanpy/dist/assets/locales/ru-RU-0Y8cIoaK.js +0 -1
- package/phanpy/dist/assets/locales/th-TH-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/tok-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/tr-TR-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/uk-UA-C5E3dFBf.js +0 -1
- package/phanpy/dist/assets/locales/zh-CN-BHJi7_et.js +0 -1
- package/phanpy/dist/assets/locales/zh-TW-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/main-BdqNbG-a.js +0 -26
- package/phanpy/dist/assets/main-BdqNbG-a.js.map +0 -1
- package/phanpy/dist/assets/mock-home-DGhR__He.js +0 -2
- package/phanpy/dist/assets/mock-home-DGhR__He.js.map +0 -1
- package/phanpy/dist/assets/multi-column-ROck0NVt.jpg +0 -0
- package/phanpy/dist/assets/multi-hashtag-timeline-DH5INVHi.jpg +0 -0
- package/phanpy/dist/assets/nested-comments-thread-hv59kZLc.jpg +0 -0
- package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js +0 -2
- package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js.map +0 -1
- package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js +0 -20
- package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js.map +0 -1
- package/phanpy/dist/assets/style-B1iLPTPR.css +0 -2
- package/phanpy/dist/assets/temml-DuyIQMei.js +0 -97
- package/phanpy/dist/assets/temml-DuyIQMei.js.map +0 -1
- package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js +0 -2
- package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js.map +0 -1
- package/phanpy/dist/assets/year-in-posts-B2lywqdx.png +0 -0
- package/phanpy/dist/assets/year-in-posts-DJv_star.js +0 -3
- package/phanpy/dist/assets/year-in-posts-DJv_star.js.map +0 -1
- package/phanpy/dist/compose/index.html +0 -20
- package/phanpy/dist/favicon.ico +0 -0
- package/phanpy/dist/index.html +0 -73
- package/phanpy/dist/logo-192.png +0 -0
- package/phanpy/dist/logo-512.png +0 -0
- package/phanpy/dist/logo-badge-72.png +0 -0
- package/phanpy/dist/logo-maskable-512.png +0 -0
- package/phanpy/dist/logo-monochrome-512.png +0 -0
- package/phanpy/dist/logo-monochrome-maskable-512.png +0 -0
- package/phanpy/dist/manifest.webmanifest +0 -1
- package/phanpy/dist/og-image-2.jpg +0 -0
- package/phanpy/dist/og-image.png +0 -0
- package/phanpy/dist/robots.txt +0 -2
- package/phanpy/dist/sw.js +0 -2
- package/phanpy/dist/sw.js.map +0 -1
- package/phanpy/dist/version.json +0 -1
- package/run-agent.mjs +0 -899
- package/vendor/gate.cjs +0 -138
- package/vendor/idp-grant.cjs +0 -394
- package/vendor/jfetch.cjs +0 -16
- package/web/admin/actors.js +0 -147
- package/web/admin/bar.css +0 -126
- package/web/admin/bar.js +0 -99
- package/web/admin/client/client.js +0 -66
- package/web/admin/client/index.html +0 -69
- package/web/admin/client-pick.js +0 -79
- package/web/admin/common.js +0 -23
- package/web/admin/connections.js +0 -112
- package/web/admin/gateway.js +0 -133
- package/web/admin/group.js +0 -258
- package/web/admin/index.html +0 -612
- package/web/admin/notices-bar.js +0 -90
- package/web/admin/oauth-signin.mjs +0 -37
- package/web/admin/record.js +0 -393
- package/web/admin/setup/index.html +0 -257
- package/web/admin/setup/setup.js +0 -339
- package/web/admin/tokens.css +0 -68
- package/web/admin/upkeep.js +0 -177
- package/web/admin/window.css +0 -55
- package/web/admin/window.js +0 -136
- package/web/app/README.md +0 -81
- package/web/app/admin-facade.mjs +0 -588
- package/web/app/agent.mjs +0 -672
- package/web/app/atproto-browser.mjs +0 -86
- package/web/app/authorize_interaction.html +0 -56
- package/web/app/authorize_interaction.js +0 -69
- package/web/app/boot.mjs +0 -616
- package/web/app/deliver-relay.mjs +0 -129
- package/web/app/dist/boot.js +0 -34562
- package/web/app/dist/boot.js.map +0 -7
- package/web/app/dist/sw.js +0 -73456
- package/web/app/dist/sw.js.map +0 -7
- package/web/app/fediacct-browser.mjs +0 -146
- package/web/app/gateway-move.mjs +0 -60
- package/web/app/idb-kv.mjs +0 -35
- package/web/app/index.html +0 -258
- package/web/app/keys-browser.mjs +0 -71
- package/web/app/keystore.mjs +0 -82
- package/web/app/oidc-session.mjs +0 -6
- package/web/app/pod-auth.mjs +0 -248
- package/web/app/pod-remote.mjs +0 -84
- package/web/app/shims/_globals.mjs +0 -2
- package/web/app/shims/fedify-sig.mjs +0 -77
- package/web/app/shims/node-crypto.mjs +0 -113
- package/web/app/shims/node-fs.mjs +0 -17
- package/web/app/shims/node-path.mjs +0 -19
- package/web/app/shims/node-url.mjs +0 -7
- package/web/app/shims/prelude.js +0 -58
- package/web/app/shims/safefetch.mjs +0 -58
- package/web/app/shims/shapes-text.mjs +0 -8
- package/web/app/shims/web-push.mjs +0 -14
- package/web/app/signup.mjs +0 -357
- package/web/app/sw-src.mjs +0 -220
- package/web/app/update.js +0 -70
- package/web/front/admin.html +0 -55
- package/web/front/admin.js +0 -89
- package/web/front/install.sh +0 -69
- package/web/front/new-account.html +0 -35
- package/web/front/new-account.js +0 -13
- package/web/front/notices.html +0 -69
- package/web/front/notices.js +0 -107
- package/web/front/run.html +0 -64
- package/web/front/run.js +0 -221
- package/web/front/solid-oidc-client.js +0 -6
- package/web/icons/forum.svg +0 -11
- package/web/icons/gateway.svg +0 -14
- package/web/icons/local.svg +0 -11
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
// group.mjs — what a group actor does with what arrives (FEP-1b12): carries a
|
|
2
|
-
// member's post to the membership, knows who its co-members are, and queues a
|
|
3
|
-
// listed moderator's ask for the operator rather than running it.
|
|
4
|
-
|
|
5
|
-
import { trimActivity, MAX_MODQUEUE, MAX_PENDING_REVIEW, CO_MEMBER_TTL_MS, CO_MEMBER_MAX } from './activity.mjs';
|
|
6
|
-
|
|
7
|
-
// Which inbound activities count as a moderator's ask: a ban, an unban, a
|
|
8
|
-
// post removal, or a roster change naming OUR moderators collection. A
|
|
9
|
-
// moderator's ordinary traffic (their posts, likes, follows) is not
|
|
10
|
-
// moderation and takes the normal arms.
|
|
11
|
-
export function isModerationAsk(intake, activity) {
|
|
12
|
-
// What a forum holds beyond a group's own asks: a topic removed or moved,
|
|
13
|
-
// a post deleted out of a topic, a report.
|
|
14
|
-
if (intake.isModerationAskExtra?.(activity)) return true;
|
|
15
|
-
if (activity.type === 'Block') return true;
|
|
16
|
-
if (activity.type === 'Undo') {
|
|
17
|
-
return typeof activity.object === 'object' && activity.object?.type === 'Block';
|
|
18
|
-
}
|
|
19
|
-
if (activity.type === 'Delete') {
|
|
20
|
-
const id = typeof activity.object === 'string' ? activity.object : activity.object?.id;
|
|
21
|
-
const s = id && intake.store.getStatuses().find(x => x.noteId === id);
|
|
22
|
-
// Only a post the group holds and did not author — removing those is
|
|
23
|
-
// moderation; everything else is the author's own Delete.
|
|
24
|
-
return !!s && s.kind !== 'post';
|
|
25
|
-
}
|
|
26
|
-
if (activity.type === 'Add' || activity.type === 'Remove') {
|
|
27
|
-
const target = typeof activity.target === 'string' ? activity.target : activity.target?.id;
|
|
28
|
-
return target === intake.urls.moderators;
|
|
29
|
-
}
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Held, not run: one entry per distinct ask, capped, waiting for the
|
|
34
|
-
// operator to apply or dismiss it (social.applyModeration).
|
|
35
|
-
// A moderator's WORD, not their proof. `actor` is a field in an unsigned
|
|
36
|
-
// body and a moderator's URL is public, so anyone can claim to be one — which
|
|
37
|
-
// is exactly why these are QUEUED for the operator rather than run. What was
|
|
38
|
-
// missing is that the queue did not say which is which, and a stranger could
|
|
39
|
-
// fill all 200 slots and push the real asks out.
|
|
40
|
-
//
|
|
41
|
-
// So: the entry records whether the door vouched for the sender, and when the
|
|
42
|
-
// queue is full the UNVERIFIED entries are what get dropped. A real
|
|
43
|
-
// moderator's ask cannot be crowded out by someone impersonating them.
|
|
44
|
-
export function queueModeration(intake, activity, actor, { trusted = false } = {}) {
|
|
45
|
-
const q = intake.store.read('modqueue.json', []);
|
|
46
|
-
const objectId = typeof activity.object === 'string' ? activity.object : activity.object?.id;
|
|
47
|
-
const key = [activity.type, actor, objectId || JSON.stringify(activity.object || null)].join(' ');
|
|
48
|
-
const seen = q.find(e => e.key === key);
|
|
49
|
-
if (seen) {
|
|
50
|
-
// The same ask arriving verified is worth more than the copy we hold.
|
|
51
|
-
if (trusted && !seen.verified) {
|
|
52
|
-
seen.verified = true;
|
|
53
|
-
intake.store.write('modqueue.json', q);
|
|
54
|
-
}
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
q.unshift({
|
|
58
|
-
key, id: (intake.serial++).toString(36) + '-' + q.length,
|
|
59
|
-
type: activity.type, moderator: actor, activity: trimActivity(activity),
|
|
60
|
-
verified: !!trusted, at: new Date().toISOString(),
|
|
61
|
-
});
|
|
62
|
-
let kept = q;
|
|
63
|
-
if (kept.length > MAX_MODQUEUE) {
|
|
64
|
-
const verified = kept.filter(e => e.verified);
|
|
65
|
-
const rest = kept.filter(e => !e.verified);
|
|
66
|
-
// Verified first, then the newest unverified up to the cap.
|
|
67
|
-
kept = [...verified, ...rest].slice(0, MAX_MODQUEUE);
|
|
68
|
-
}
|
|
69
|
-
intake.store.write('modqueue.json', kept);
|
|
70
|
-
intake.log(`moderation queued from ${actor}${trusted ? '' : ' (unverified)'}: ${activity.type} ${objectId || ''}`);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Anyone can Append to a public inbox, so arriving is not the same as being
|
|
74
|
-
// carried to every follower. Membership is the gate: you cannot post to a
|
|
75
|
-
// group you have not joined, and declining to carry a member is the only
|
|
76
|
-
// moderation a group can actually enforce.
|
|
77
|
-
export async function amplify(intake, noteId, { approved = false, activity = null } = {}) {
|
|
78
|
-
const s = intake.store.getStatuses().find(x => x.noteId === noteId);
|
|
79
|
-
if (!s) return;
|
|
80
|
-
if (s.announcedAt) return; // a re-delivered Create announces once
|
|
81
|
-
// A DM to the group, or a followers-only post it happened to receive, was
|
|
82
|
-
// addressed to less than the world — carrying it would widen the author's
|
|
83
|
-
// audience for them. A group only ever amplifies public posts.
|
|
84
|
-
//
|
|
85
|
-
// Except a PRIVATE group, where that reasoning runs backwards. Its members
|
|
86
|
-
// write to the group and to nobody else on purpose, and its membership is
|
|
87
|
-
// exactly the people already allowed to read what they write; refusing the
|
|
88
|
-
// carry there would mean a private group could only carry posts its author
|
|
89
|
-
// had published to the world. So a group told it is private carries what is
|
|
90
|
-
// addressed to it. A DM is still a DM and is still never carried.
|
|
91
|
-
if (s.direct || (s.nonPublic && !intake.config.private)) {
|
|
92
|
-
intake.log(`not amplified — ${noteId} was not addressed publicly, and a group never widens a post's audience`);
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const contacts = intake.store.getContacts();
|
|
96
|
-
if (!contacts.followers.some(f => f.actor === s.actor)) {
|
|
97
|
-
// A group carries its members and nobody else. A forum may choose to
|
|
98
|
-
// HOLD a stranger's reply for a moderator instead of dropping it, which
|
|
99
|
-
// is what `replyPolicy` says; the group itself still carries nothing it
|
|
100
|
-
// has not been told to.
|
|
101
|
-
if (intake.onStranger) {
|
|
102
|
-
const held = await intake.onStranger({ noteId, actor: s.actor, activity }).catch(() => false);
|
|
103
|
-
if (held) { intake.log(`held for a moderator — ${s.actor} is not a member`); return; }
|
|
104
|
-
}
|
|
105
|
-
// The hook may have made them one — a forum whose categories are open
|
|
106
|
-
// treats posting into one as joining it. So ask the record again rather
|
|
107
|
-
// than the copy taken before the hook ran.
|
|
108
|
-
if (!intake.store.getContacts().followers.some(f => f.actor === s.actor)) {
|
|
109
|
-
intake.log(`not amplified — ${s.actor} is not a member`);
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
if (intake.store.getMuted().actors.includes(s.actor)) {
|
|
114
|
-
intake.log(`not amplified — ${s.actor} is muted`);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
// A reviewed group carries nothing until its operator says so.
|
|
118
|
-
if (intake.config.review && !approved) {
|
|
119
|
-
const pending = intake.store.getPending();
|
|
120
|
-
if (!pending.some(p => p.noteId === noteId)) {
|
|
121
|
-
// Full means refuse the new one, not evict the oldest. `slice(0, 500)`
|
|
122
|
-
// dropped from the tail, so one member posting 500 notes silently
|
|
123
|
-
// discarded everything the operator was still deciding about — the
|
|
124
|
-
// posts were never carried, never refused, and left no record that they
|
|
125
|
-
// had ever arrived. Becoming a member costs one Follow when joins are
|
|
126
|
-
// unmoderated, which is the default.
|
|
127
|
-
//
|
|
128
|
-
// Not carrying it is what a reviewed group does with anything it has
|
|
129
|
-
// not approved, so refusing is the same outcome the queue was for.
|
|
130
|
-
if (pending.length >= MAX_PENDING_REVIEW) {
|
|
131
|
-
intake.log(`review queue is full (${MAX_PENDING_REVIEW}) — ${noteId} not held. `
|
|
132
|
-
+ 'Approve or decline what is waiting and it will be carried on redelivery.');
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
// The activity rides along: approving later still has to wrap the one
|
|
136
|
-
// the member actually sent, not a reconstruction of it.
|
|
137
|
-
pending.unshift({ noteId, actor: s.actor, activity, at: new Date().toISOString() });
|
|
138
|
-
intake.store.setPending(pending);
|
|
139
|
-
}
|
|
140
|
-
intake.log(`held for review: ${noteId}`);
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
// A member's Bluesky post: the carry is a native repost by the group's
|
|
144
|
-
// account. It reaches AP followers only through the author's own bridge —
|
|
145
|
-
// the group never fabricates an AP object for someone else's words.
|
|
146
|
-
if (s.kind === 'bsky') {
|
|
147
|
-
if (!intake.bskyGroup) { intake.log(`not amplified — ${noteId} is a bluesky post and no account is connected`); return; }
|
|
148
|
-
return intake.bskyGroup.carry(s);
|
|
149
|
-
}
|
|
150
|
-
const held = intake.store.getPending().find(p => p.noteId === noteId);
|
|
151
|
-
const inboxes = intake.announceTargets(s.actor);
|
|
152
|
-
const { announceActivity } = await import('../wire.mjs');
|
|
153
|
-
// Wrap the member's own activity when we have it; a bare note URL is the
|
|
154
|
-
// fallback, and renders as a plain boost rather than a group carry. The
|
|
155
|
-
// group names itself as the audience (FEP-1b12).
|
|
156
|
-
//
|
|
157
|
-
// `activity` is the envelope as DELIVERED — a document the sender wrote,
|
|
158
|
-
// which the group would otherwise re-sign and hand to every follower with
|
|
159
|
-
// whatever addressing, tags and object body it carried. Only the note id was
|
|
160
|
-
// ever verified (ingestNote fetched it from the author's origin and checked
|
|
161
|
-
// the attribution), so only the note id is safe to pass on: send the bare
|
|
162
|
-
// id unless the wrapper's own object id agrees with what we verified.
|
|
163
|
-
const wrapperObject = (a) => {
|
|
164
|
-
const inner = a?.object;
|
|
165
|
-
const id = typeof inner === 'string' ? inner : inner?.id;
|
|
166
|
-
return id === noteId ? a : null;
|
|
167
|
-
};
|
|
168
|
-
const act = announceActivity({
|
|
169
|
-
urls: intake.urls,
|
|
170
|
-
object: wrapperObject(activity) || wrapperObject(held?.activity) || noteId,
|
|
171
|
-
serial: intake.serial++,
|
|
172
|
-
audience: intake.urls.actor,
|
|
173
|
-
});
|
|
174
|
-
await intake.deliverer.deliverToAll(inboxes, act);
|
|
175
|
-
// Marked carried before recorded: a failed outbox write costs one missing
|
|
176
|
-
// entry, a failed status write would carry the same post twice.
|
|
177
|
-
intake.store.updateStatus(noteId, { announcedAt: new Date().toISOString(), announceActivity: act });
|
|
178
|
-
// A private group's carries are written for its members alone, so they go on
|
|
179
|
-
// its owner's full outbox (recorded as sent) and never on the public one.
|
|
180
|
-
if (!intake.config.private) await intake.publisher.recordOutbox(act);
|
|
181
|
-
intake.store.setPending(intake.store.getPending().filter(p => p.noteId !== noteId));
|
|
182
|
-
intake.log(`amplified ${noteId} → ${inboxes.length} inbox(es)`);
|
|
183
|
-
// What the group carried is what the group's conversation holds. A forum
|
|
184
|
-
// places the post in its topic here — after the carry, so only what the
|
|
185
|
-
// category vouched for is in the topic (FEP-7888 ownership). Its failure
|
|
186
|
-
// never undoes the carry.
|
|
187
|
-
if (intake.onCarried) {
|
|
188
|
-
// Both: what the group said (the Announce) and what its author sent. A
|
|
189
|
-
// forum reads the author's own activity — the name they gave the topic
|
|
190
|
-
// they were opening is on that one, and on no other.
|
|
191
|
-
await intake.onCarried({ noteId, actor: s.actor, activity: act, sent: activity })
|
|
192
|
-
.catch(e => intake.log(`after the carry of ${noteId}: ${e.message}`));
|
|
193
|
-
}
|
|
194
|
-
// The same carry, shown natively to the group's Bluesky followers.
|
|
195
|
-
await intake.bskyGroup?.mirrorCarry(s)
|
|
196
|
-
.catch(e => intake.log(`bluesky mirror of the carry failed: ${e.message}`));
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Is this actor in a group we are in? Each followed Group's membership is a
|
|
200
|
-
// public collection, read at most once a day and cached — a membership list
|
|
201
|
-
// is slow-moving, and this runs on arriving mail.
|
|
202
|
-
export async function isCoMember(intake, actor) {
|
|
203
|
-
if (intake.config.kind === 'group') return false; // a group has members, not peers
|
|
204
|
-
const groups = intake.store.getContacts().following
|
|
205
|
-
.filter(f => f.accepted && intake.store.getActors()[f.actor]?.type === 'Group')
|
|
206
|
-
.map(f => f.actor);
|
|
207
|
-
if (!groups.length) return false;
|
|
208
|
-
const cache = intake.store.read('comembers.json', {});
|
|
209
|
-
const fresh = Date.now() - CO_MEMBER_TTL_MS;
|
|
210
|
-
let changed = false;
|
|
211
|
-
for (const g of groups) {
|
|
212
|
-
const held = cache[g];
|
|
213
|
-
if (held && Date.parse(held.at || 0) > fresh) continue;
|
|
214
|
-
const doc = await intake.fetchAP(g).catch(() => null);
|
|
215
|
-
const list = doc?.followers ? await intake.collectionMembers(doc.followers) : null;
|
|
216
|
-
// A list we could not read keeps whatever we had: losing it would demote
|
|
217
|
-
// every co-member to a stranger for a day because one fetch failed.
|
|
218
|
-
if (!list) continue;
|
|
219
|
-
cache[g] = { at: new Date().toISOString(), members: list };
|
|
220
|
-
changed = true;
|
|
221
|
-
}
|
|
222
|
-
if (changed) intake.store.write('comembers.json', cache);
|
|
223
|
-
return groups.some(g => cache[g]?.members?.includes(actor));
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// The actor ids in a (possibly paged) public collection, capped.
|
|
227
|
-
export async function collectionMembers(intake, url) {
|
|
228
|
-
const out = [];
|
|
229
|
-
let next = url;
|
|
230
|
-
for (let page = 0; next && page < 10 && out.length < CO_MEMBER_MAX; page++) {
|
|
231
|
-
const doc = await intake.fetchAP(next).catch(() => null);
|
|
232
|
-
if (!doc) return out.length ? out : null;
|
|
233
|
-
for (const item of doc.orderedItems || doc.items || []) {
|
|
234
|
-
if (typeof item === 'string') out.push(item);
|
|
235
|
-
}
|
|
236
|
-
next = doc.first && page === 0 ? doc.first : doc.next;
|
|
237
|
-
if (typeof next === 'object') next = next?.id;
|
|
238
|
-
}
|
|
239
|
-
return out;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Who an Announce for `author` goes to. Shared with the retract path: an Undo
|
|
243
|
-
// that reached a different set than the Announce did would leave the post
|
|
244
|
-
// standing for whoever the two sets disagreed about.
|
|
245
|
-
// The author's own target is dropped only when it serves nobody else — a
|
|
246
|
-
// shared inbox carries the whole server's members.
|
|
247
|
-
export function announceTargets(intake, author) {
|
|
248
|
-
const byTarget = new Map();
|
|
249
|
-
for (const f of intake.store.getContacts().followers) {
|
|
250
|
-
const t = f.sharedInbox || f.inbox;
|
|
251
|
-
if (!t) continue;
|
|
252
|
-
if (!byTarget.has(t)) byTarget.set(t, new Set());
|
|
253
|
-
byTarget.get(t).add(f.actor);
|
|
254
|
-
}
|
|
255
|
-
return [...byTarget]
|
|
256
|
-
.filter(([, who]) => !(who.size === 1 && who.has(author)))
|
|
257
|
-
.map(([t]) => t);
|
|
258
|
-
}
|