fedipod-server 0.29.0 → 0.31.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 +16 -6
- package/dist/claims.d.ts +2 -0
- package/dist/claims.js +13 -4
- package/dist/door.d.ts +4 -0
- package/dist/door.js +31 -0
- package/dist/fedipod.d.ts +15 -0
- package/dist/fedipod.js +13 -0
- package/dist/front.d.ts +3 -0
- package/dist/front.js +92 -0
- package/dist/handler.d.ts +36 -101
- package/dist/handler.js +93 -644
- package/dist/handler.jsonld +2 -30
- package/dist/identities.d.ts +71 -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/dist/private-read.d.ts +4 -0
- package/dist/private-read.js +34 -0
- package/package.json +12 -20
- 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
package/README.md
CHANGED
|
@@ -52,6 +52,10 @@ sign-up refuses rather than half-working.
|
|
|
52
52
|
npm install fedipod-server
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
+
It installs `fedipod` with it: the agent, the Gateway's front and the pages
|
|
56
|
+
are that package's, and a fix there reaches this component at your next
|
|
57
|
+
`npm install`.
|
|
58
|
+
|
|
55
59
|
Add the package context to your CSS config and import the shipped snippet:
|
|
56
60
|
|
|
57
61
|
```json
|
|
@@ -109,7 +113,7 @@ naming the pod the identity runs on. Nothing private is in it.
|
|
|
109
113
|
| `agentDataDir` | Where each identity keeps the file naming its pod; its log lines go to the server's own log. Required whenever sign-up is on. |
|
|
110
114
|
| `agentUiPath` | Where the owner's pages live on the pod's origin. `/fp/` by default; empty serves no pages. On a suffixed pod it is under the pod's path, e.g. `/aisha/fp/`. |
|
|
111
115
|
| `agentRegistryContainer` | The internal container holding the sign-up rows. |
|
|
112
|
-
| `runPage` | The HTML of the page where a pod owner opts in or out. The
|
|
116
|
+
| `runPage` | The HTML of the page where a pod owner opts in or out. The page `fedipod` ships is served unless you set this. |
|
|
113
117
|
| `runPath` | Where that page answers. `/.fediverse-account` unless you set it. The path it takes is one the pod no longer serves, so it is yours to name; the dot keeps it out of the way of anybody's data. |
|
|
114
118
|
| `agentWebIdSuffix` | Path from a pod's base to its owner's WebID. Defaults to `profile/card#me`. |
|
|
115
119
|
| `agentPollSeconds` | How often the inbox is swept. Deliveries also wake the sweep as they land, so this is the fallback. |
|
|
@@ -133,10 +137,8 @@ Each identity answers on its pod's origin, so the pod is what a client
|
|
|
133
137
|
connects to. Point a Mastodon app at `https://mei.example.org/` and it finds
|
|
134
138
|
what it expects: nodeinfo, the client API under `/api/`, sign-in under
|
|
135
139
|
`/oauth/`, the live feed at `/api/v1/streaming`, and the ActivityPub write API
|
|
136
|
-
at `/ap/outbox`. The owner's own pages — the record and
|
|
137
|
-
|
|
138
|
-
secret guards. The published package does not carry the web client; point a
|
|
139
|
-
Mastodon app at the pod instead.
|
|
140
|
+
at `/ap/outbox`. The owner's own pages — the record and the bundled web client — are behind
|
|
141
|
+
`agentUiPath`, which the door secret guards.
|
|
140
142
|
|
|
141
143
|
The client API answers any origin, the way any Mastodon server does, so a
|
|
142
144
|
browser client works too: it registers an app, and the authorize screen names
|
|
@@ -154,6 +156,11 @@ that document's address and registers nothing here. Once in, it posts to the
|
|
|
154
156
|
outbox the actor names, and reads what the identity received at `/ap/inbox`,
|
|
155
157
|
which nobody but the owner may read.
|
|
156
158
|
|
|
159
|
+
A followers-only or direct post of the identity's is given, at its own
|
|
160
|
+
address, to a server it was sent to when that server signs its request, the
|
|
161
|
+
way Mastodon gives its own: a follower's server gets a followers-only post,
|
|
162
|
+
the named person's server gets a direct one, and nobody else gets either.
|
|
163
|
+
|
|
157
164
|
A subdomained pod gets an origin of its own and answers at its root; a
|
|
158
165
|
suffixed pod answers under its own path (`/aisha/ap/actor`, `/aisha/api/…`,
|
|
159
166
|
`/aisha/oauth/…`, its door at `/aisha/fp/`). So a host carries at most one
|
|
@@ -252,7 +259,10 @@ npm run test:e2e:suffix # the same, for suffixed pods (mode d)
|
|
|
252
259
|
container listings — through the transport an identity uses, and checks the
|
|
253
260
|
lease protocol and the deletion deny-list still hold across it.
|
|
254
261
|
|
|
255
|
-
`npm test` is also what a publish runs, so a red suite blocks one.
|
|
262
|
+
`npm test` is also what a publish runs, so a red suite blocks one. In a
|
|
263
|
+
FediPod checkout the tests run against the checkout's own `fedipod`:
|
|
264
|
+
`scripts/link-fedipod.mjs` links it into `node_modules` before each test
|
|
265
|
+
script, and does nothing anywhere else.
|
|
256
266
|
|
|
257
267
|
`npm run test:e2e` starts a real Community Solid Server with three pods (two
|
|
258
268
|
become identities up front; the third opts in and out at runtime), then signs in as a phone app does, posts,
|
package/dist/claims.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare function claims(input: {
|
|
|
5
5
|
pathname: string;
|
|
6
6
|
}, frontHost: string, runPath?: string): boolean;
|
|
7
7
|
export declare const isInboxPath: (pathname: string) => boolean;
|
|
8
|
+
export declare const isPrivateReadPath: (pathname: string) => boolean;
|
|
8
9
|
/**
|
|
9
10
|
* True when this path belongs to an identity's client surface.
|
|
10
11
|
*
|
|
@@ -18,4 +19,5 @@ export declare const isInboxPath: (pathname: string) => boolean;
|
|
|
18
19
|
export declare function agentClaims(input: {
|
|
19
20
|
pathname: string;
|
|
20
21
|
method?: string;
|
|
22
|
+
signed?: boolean;
|
|
21
23
|
}, uiPath?: string): boolean;
|
package/dist/claims.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// front's apex the gateway answers the fediverse routes; a pod subdomain is a
|
|
5
5
|
// real Solid pod and is never claimed.
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.isInboxPath = exports.DEFAULT_RUN_PATH = void 0;
|
|
7
|
+
exports.isPrivateReadPath = exports.isInboxPath = exports.DEFAULT_RUN_PATH = void 0;
|
|
8
8
|
exports.claims = claims;
|
|
9
9
|
exports.agentClaims = agentClaims;
|
|
10
10
|
// Signing up is CSS's, untouched: a person makes an account and a pod the way
|
|
@@ -18,8 +18,8 @@ const FRONT_PATHS = new Set(['/roster',
|
|
|
18
18
|
'/.well-known/webfinger', '/api/handle', '/api/attach', '/api/agent',
|
|
19
19
|
'/api/roster', '/api/revoke',
|
|
20
20
|
// What the pages that remain load: the sign-in library the opt-in and
|
|
21
|
-
// roster pages use
|
|
22
|
-
'/solid-oidc-client.js',
|
|
21
|
+
// roster pages use.
|
|
22
|
+
'/solid-oidc-client.js',
|
|
23
23
|
// Each page's own script, served beside it; a page without its script has
|
|
24
24
|
// buttons that never wake up.
|
|
25
25
|
'/new-account.js', '/run.js', '/admin.js']);
|
|
@@ -58,6 +58,10 @@ const AGENT_PREFIXES = ['/api/', '/oauth/', '/@']; // /@handle: the short profil
|
|
|
58
58
|
// `/aisha/fedipod/ap/inbox/` arrives here already stripped to `/fedipod/ap/inbox/`.
|
|
59
59
|
const isInboxPath = (pathname) => /^\/(?:[^/]+\/)+ap\/inbox\/$/u.test(pathname);
|
|
60
60
|
exports.isInboxPath = isInboxPath;
|
|
61
|
+
// A document in the identity's private folder — a followers-only or direct
|
|
62
|
+
// post, or one of the owner's own lists — matched by shape like the inbox.
|
|
63
|
+
const isPrivateReadPath = (pathname) => /^\/(?:[^/]+\/)+ap\/private\/[^/]+$/u.test(pathname);
|
|
64
|
+
exports.isPrivateReadPath = isPrivateReadPath;
|
|
61
65
|
/**
|
|
62
66
|
* True when this path belongs to an identity's client surface.
|
|
63
67
|
*
|
|
@@ -70,8 +74,13 @@ exports.isInboxPath = isInboxPath;
|
|
|
70
74
|
*/
|
|
71
75
|
function agentClaims(input, uiPath = '/fp/') {
|
|
72
76
|
const { pathname } = input;
|
|
77
|
+
const method = String(input.method ?? '').toUpperCase();
|
|
73
78
|
if ((0, exports.isInboxPath)(pathname))
|
|
74
|
-
return
|
|
79
|
+
return method === 'POST';
|
|
80
|
+
// A signed read of a private post is answered at the door, to a server the
|
|
81
|
+
// post was sent to (private-read.ts). Unsigned, the document is the pod's.
|
|
82
|
+
if ((0, exports.isPrivateReadPath)(pathname))
|
|
83
|
+
return !!input.signed && (method === 'GET' || method === 'HEAD');
|
|
75
84
|
if (AGENT_PATHS.has(pathname))
|
|
76
85
|
return true;
|
|
77
86
|
if (AGENT_PREFIXES.some((prefix) => pathname.startsWith(prefix)))
|
package/dist/door.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { HttpHandlerInput } from '@solid/community-server';
|
|
2
|
+
import type { EmbeddedIdentity } from './identities';
|
|
3
|
+
import type { FediPodServerHandler } from './handler';
|
|
4
|
+
export declare function deliverAtDoor(h: FediPodServerHandler, identity: EmbeddedIdentity, request: HttpHandlerInput['request'], response: HttpHandlerInput['response']): Promise<void>;
|
package/dist/door.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// door.ts — a delivery to an identity's own inbox, verified here: the server
|
|
3
|
+
// that stores the inbox is the one the request reached, so the signature is
|
|
4
|
+
// checked while its headers exist and the receipt is written beside the
|
|
5
|
+
// activity. The same door code the front runs; nothing is renamed.
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.deliverAtDoor = deliverAtDoor;
|
|
8
|
+
const adapt_1 = require("./adapt");
|
|
9
|
+
const fedipod_1 = require("./fedipod");
|
|
10
|
+
async function deliverAtDoor(h, identity, request, response) {
|
|
11
|
+
const s = h.internals();
|
|
12
|
+
const { deliverToInbox } = await (0, fedipod_1.esmImport)(fedipod_1.EMBED);
|
|
13
|
+
let whatwg;
|
|
14
|
+
try {
|
|
15
|
+
// The pod's own origin: the signature covers the path and the Host header, and both are the pod's.
|
|
16
|
+
whatwg = await (0, adapt_1.nodeToWhatwg)(request, new URL(identity.podHome).origin);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
const status = e.statusCode === 413 ? 413 : 400;
|
|
20
|
+
response.writeHead(status, { 'content-type': 'application/json' });
|
|
21
|
+
response.end(JSON.stringify({ error: e.message }));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const out = await deliverToInbox(identity.agent, whatwg, {
|
|
25
|
+
podPut: (url, body, ct) => s.podPut(url, body, ct),
|
|
26
|
+
gatewayWebId: s.args.gatewayWebId ?? null,
|
|
27
|
+
});
|
|
28
|
+
s.logger.info(`FediPod: delivery for @${identity.handle} at the door — ${out.reason} (${out.status})`);
|
|
29
|
+
response.writeHead(out.status, { 'content-type': 'application/json' });
|
|
30
|
+
response.end(JSON.stringify({ reason: out.reason }));
|
|
31
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const FRONT_CORE = "fedipod/front";
|
|
2
|
+
export declare const FRONT_PAGES = "fedipod/front-pages";
|
|
3
|
+
export declare const EMBED = "fedipod/embed";
|
|
4
|
+
export declare const PLACE = "fedipod/place";
|
|
5
|
+
export declare const TRANSPORT = "fedipod/pod/transport.mjs";
|
|
6
|
+
export declare const esmImport: (s: string) => Promise<Record<string, Function>>;
|
|
7
|
+
/** The front's pages and the files they load, as fedipod/front-pages reads them. */
|
|
8
|
+
export interface FrontPages {
|
|
9
|
+
signupPage: string | null;
|
|
10
|
+
runPage: string | null;
|
|
11
|
+
adminPage: string | null;
|
|
12
|
+
noticesPage: string | null;
|
|
13
|
+
authBundle: string | null;
|
|
14
|
+
pageScripts: Record<string, string | null>;
|
|
15
|
+
}
|
package/dist/fedipod.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// fedipod.ts — the fedipod modules this component loads, by name, at runtime.
|
|
3
|
+
// They are an ESM tree; a real dynamic import() built via Function keeps tsc
|
|
4
|
+
// from downleveling it to require(), which cannot load an ESM module with
|
|
5
|
+
// top-level await under a CommonJS build.
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.esmImport = exports.TRANSPORT = exports.PLACE = exports.EMBED = exports.FRONT_PAGES = exports.FRONT_CORE = void 0;
|
|
8
|
+
exports.FRONT_CORE = 'fedipod/front';
|
|
9
|
+
exports.FRONT_PAGES = 'fedipod/front-pages';
|
|
10
|
+
exports.EMBED = 'fedipod/embed';
|
|
11
|
+
exports.PLACE = 'fedipod/place';
|
|
12
|
+
exports.TRANSPORT = 'fedipod/pod/transport.mjs';
|
|
13
|
+
exports.esmImport = new Function('s', 'return import(s)');
|
package/dist/front.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { HttpHandlerInput } from '@solid/community-server';
|
|
2
|
+
import type { FediPodServerHandler } from './handler';
|
|
3
|
+
export declare function serveFront(h: FediPodServerHandler, request: HttpHandlerInput['request'], response: HttpHandlerInput['response']): Promise<void>;
|
package/dist/front.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// front.ts — a request the Gateway's front answers: the same routeFront the
|
|
3
|
+
// Netlify front runs, given this server's pages, its directory, its store
|
|
4
|
+
// and the opt-in controls.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.serveFront = serveFront;
|
|
7
|
+
const adapt_1 = require("./adapt");
|
|
8
|
+
const fedipod_1 = require("./fedipod");
|
|
9
|
+
async function serveFront(h, request, response) {
|
|
10
|
+
const s = h.internals();
|
|
11
|
+
const { routeFront } = await (0, fedipod_1.esmImport)(fedipod_1.FRONT_CORE);
|
|
12
|
+
// Read on each request, so an edited page shows without a restart. A
|
|
13
|
+
// missing file is not fatal: the route it feeds answers 404.
|
|
14
|
+
const { frontPages } = await (0, fedipod_1.esmImport)(fedipod_1.FRONT_PAGES);
|
|
15
|
+
const pages = frontPages();
|
|
16
|
+
let whatwg;
|
|
17
|
+
try {
|
|
18
|
+
whatwg = await (0, adapt_1.nodeToWhatwg)(request, s.args.frontOrigin);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
const status = e.statusCode === 413 ? 413 : 400;
|
|
22
|
+
response.writeHead(status, { 'content-type': 'application/json' });
|
|
23
|
+
response.end(JSON.stringify({ error: e.message }));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const out = await routeFront(whatwg, {
|
|
27
|
+
host: s.frontHost,
|
|
28
|
+
frontOrigin: s.args.frontOrigin,
|
|
29
|
+
// This server issued the session the reader is already using, so it can
|
|
30
|
+
// read it rather than sending them to an identity provider that has just
|
|
31
|
+
// told them who they are. Same-origin only; front-core decides that.
|
|
32
|
+
webIdsFromSession: (req) => h.webIdsFromSession(req),
|
|
33
|
+
gatewayWebId: s.args.gatewayWebId,
|
|
34
|
+
offersPods: !!s.args.offersPods,
|
|
35
|
+
signupPage: s.args.signupPage || pages.signupPage,
|
|
36
|
+
runPage: s.args.runPage || pages.runPage,
|
|
37
|
+
runPath: s.runPath,
|
|
38
|
+
adminPage: s.args.adminPage || pages.adminPage,
|
|
39
|
+
// The notices page renders here too, and says the server keeps none:
|
|
40
|
+
// a notices store is the Netlify front's, not this component's.
|
|
41
|
+
noticesPage: pages.noticesPage,
|
|
42
|
+
// The opt-in and roster pages load the sign-in library; without it the
|
|
43
|
+
// pages render but cannot be used.
|
|
44
|
+
authBundle: pages.authBundle,
|
|
45
|
+
// Each page's own script, so the pages can be served under
|
|
46
|
+
// `script-src 'self'` (see fedipod/front).
|
|
47
|
+
pageScripts: pages.pageScripts,
|
|
48
|
+
lookup: (handle) => h.dir.lookup(handle),
|
|
49
|
+
putDirectory: (handle, rec) => h.dir.putDirectory(handle, rec),
|
|
50
|
+
podPut: (_handle, url, body, ct) => s.podPut(url, body, ct),
|
|
51
|
+
// Reads for the public proxy. `s.io.read` goes STRAIGHT into the
|
|
52
|
+
// resource store, which applies no access control of its own — so this is
|
|
53
|
+
// the one place that has to say what may be read, and it says: only
|
|
54
|
+
// inside the pod of the handle being served, and never a server-internal
|
|
55
|
+
// tree. Without it a row could name any location and this would fetch it
|
|
56
|
+
// (the directory, with every user's receipt secret, included).
|
|
57
|
+
//
|
|
58
|
+
// The front now refuses to attach such a row at all (podHomeProblem in
|
|
59
|
+
// fedipod/front); this is the same refusal at the other end, because
|
|
60
|
+
// a row can also arrive from a seed or an older deploy.
|
|
61
|
+
podGet: async (url, opts) => {
|
|
62
|
+
const denied = { status: 403, text: async () => '', headers: { get: () => null } };
|
|
63
|
+
let target;
|
|
64
|
+
try {
|
|
65
|
+
target = new URL(url);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return denied;
|
|
69
|
+
}
|
|
70
|
+
if (/(^|\/)\.internal(\/|$)/u.test(target.pathname))
|
|
71
|
+
return denied;
|
|
72
|
+
// Which pod asked: routeFront reads `rec.podHome + rest` and passes
|
|
73
|
+
// that podHome here, so the confinement is a value on the call rather
|
|
74
|
+
// than state on the handler. No podHome, no read.
|
|
75
|
+
const home = opts?.podHome;
|
|
76
|
+
if (!home || !url.startsWith(home))
|
|
77
|
+
return denied;
|
|
78
|
+
const raw = await s.io.read(url);
|
|
79
|
+
return raw == null
|
|
80
|
+
? { status: 404, text: async () => '', headers: { get: () => null } }
|
|
81
|
+
: { status: 200, text: async () => raw, headers: { get: () => null } };
|
|
82
|
+
},
|
|
83
|
+
agentControl: s.registry
|
|
84
|
+
? {
|
|
85
|
+
optIn: (a) => h.optInPod(a),
|
|
86
|
+
optOut: (a) => h.optOutPod(a),
|
|
87
|
+
describe: (a) => h.describePod(a),
|
|
88
|
+
}
|
|
89
|
+
: undefined,
|
|
90
|
+
});
|
|
91
|
+
await (0, adapt_1.applyToNode)(response, out);
|
|
92
|
+
}
|
package/dist/handler.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { HttpHandler } from '@solid/community-server';
|
|
2
|
-
import type { HttpHandlerInput, ResourceStore, Initializable, Finalizable, ClusterManager } from '@solid/community-server';
|
|
3
|
-
import type { Directory } from './directory';
|
|
2
|
+
import type { HttpHandlerInput, ResourceStore, Initializable, Finalizable, ClusterManager, Logger } from '@solid/community-server';
|
|
3
|
+
import type { IO, Directory, AgentRegistry } from './directory';
|
|
4
|
+
import type { AgentClaim } from './mounts';
|
|
5
|
+
import type { EmbeddedIdentity } from './identities';
|
|
4
6
|
export interface FediPodServerArgs {
|
|
5
7
|
/** The server's ResourceStore: the handler reads pods and writes inbox items and directory rows directly through it — no HTTP, no credential. */
|
|
6
8
|
resourceStore: ResourceStore;
|
|
@@ -41,25 +43,31 @@ export interface FediPodServerArgs {
|
|
|
41
43
|
/** An internal container URL where the runtime opt-in rows live. */
|
|
42
44
|
agentRegistryContainer?: string;
|
|
43
45
|
}
|
|
44
|
-
/**
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
46
|
+
/**
|
|
47
|
+
* What the parts beside this file share. Private on the class, because the
|
|
48
|
+
* component generator would otherwise offer every public field as a
|
|
49
|
+
* configurable member; read through internals().
|
|
50
|
+
*/
|
|
51
|
+
export interface Internals {
|
|
52
|
+
args: FediPodServerArgs;
|
|
53
|
+
io: IO;
|
|
54
|
+
dir: Directory;
|
|
55
|
+
runPath: string;
|
|
56
|
+
uiPath: string;
|
|
57
|
+
frontHost: string;
|
|
58
|
+
podPut: (url: string, body: string, contentType: string) => Promise<boolean>;
|
|
59
|
+
logger: Logger;
|
|
60
|
+
registry: AgentRegistry | null;
|
|
61
|
+
claimed: Map<string, AgentClaim>;
|
|
62
|
+
agentHandles: Map<string, string>;
|
|
63
|
+
roots: Map<string, string>;
|
|
64
|
+
identities: Map<string, EmbeddedIdentity>;
|
|
65
|
+
surfaces: Map<string, EmbeddedIdentity>;
|
|
66
|
+
doorSecrets: Map<string, string>;
|
|
67
|
+
starting: Set<string>;
|
|
68
|
+
startCancelled: Set<string>;
|
|
69
|
+
stopping: boolean;
|
|
70
|
+
onSignal: ((signal: NodeJS.Signals) => void) | null;
|
|
63
71
|
}
|
|
64
72
|
export declare class FediPodServerHandler extends HttpHandler implements Initializable, Finalizable {
|
|
65
73
|
private readonly args;
|
|
@@ -82,61 +90,13 @@ export declare class FediPodServerHandler extends HttpHandler implements Initial
|
|
|
82
90
|
private stopping;
|
|
83
91
|
private onSignal;
|
|
84
92
|
constructor(args: FediPodServerArgs);
|
|
85
|
-
/**
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
* identity uses — two pods must never share <agentDataDir>/<handle>/.
|
|
89
|
-
*
|
|
90
|
-
* A HOST-ROOT or subdomain pod needs an origin of its own, and it may not be
|
|
91
|
-
* the front's host: the whole surface answers at the origin root, so two of
|
|
92
|
-
* them, or one sharing the front, would collide. A SUFFIX pod lives on a path
|
|
93
|
-
* (`server/aisha/`), so it may share its host — with the front and with other
|
|
94
|
-
* suffix pods — provided no claim already contains or nests under its path.
|
|
95
|
-
*/
|
|
96
|
-
private validateAgentPod;
|
|
97
|
-
/**
|
|
98
|
-
* The claim a request belongs to, or null. A request matches when its host is
|
|
99
|
-
* the claim's host and its path is at or under the claim's mount; the deepest
|
|
100
|
-
* mount wins, so a suffix pod's own routes are never swallowed by a shallower
|
|
101
|
-
* claim on the same host.
|
|
102
|
-
*/
|
|
103
|
-
private resolveClaim;
|
|
104
|
-
/** A request path relative to a mount: `/aisha/ap/actor` under `/aisha` → `/ap/actor`. */
|
|
105
|
-
private stripMount;
|
|
106
|
-
/**
|
|
107
|
-
* Start an agent for each opted-in pod. Runs before the server listens, so
|
|
108
|
-
* the identities come up in the background and boot is never held on a pod.
|
|
109
|
-
*/
|
|
93
|
+
/** The shared state, for the parts beside this file. */
|
|
94
|
+
internals(): Internals;
|
|
95
|
+
/** Start an agent for each opted-in pod, before the server listens. */
|
|
110
96
|
initialize(): Promise<void>;
|
|
111
97
|
/** Stop every identity: timers cleared, state written, lease let go. */
|
|
112
98
|
finalize(): Promise<void>;
|
|
113
|
-
/**
|
|
114
|
-
* One identity's door secret, in its own pod's state. `agentDataDir` is
|
|
115
|
-
* handed in as the place an identity set up before this kept it, so its
|
|
116
|
-
* owner's existing door link survives the move.
|
|
117
|
-
*/
|
|
118
|
-
private doorSecretFor;
|
|
119
|
-
private startIdentity;
|
|
120
|
-
/**
|
|
121
|
-
* When this server is also the door, give a running identity a
|
|
122
|
-
* @handle@<frontHost> address: one inbox-only directory row so the
|
|
123
|
-
* shared-domain handle resolves and the door can take verified delivery for
|
|
124
|
-
* it. The row names the identity's own tree, which is where its inbox and
|
|
125
|
-
* its actor are — the door writes deliveries there and the agent watches
|
|
126
|
-
* that container. A row written by an attach belongs to its owner and is
|
|
127
|
-
* left alone; one this server wrote itself is corrected. The identity keeps
|
|
128
|
-
* its own ids on the pod; nothing is moved.
|
|
129
|
-
*/
|
|
130
|
-
private frontIdentity;
|
|
131
99
|
canHandle({ request }: HttpHandlerInput): Promise<void>;
|
|
132
|
-
/**
|
|
133
|
-
* Whether identities run in this process. They run in one: the lease admits
|
|
134
|
-
* a single drainer, and the state each one holds is in memory. With workers,
|
|
135
|
-
* that process is the primary — which serves no requests, so every process
|
|
136
|
-
* still has to know which hosts belong to an identity even though only one
|
|
137
|
-
* of them can answer for it.
|
|
138
|
-
*/
|
|
139
|
-
private runsIdentities;
|
|
140
100
|
/**
|
|
141
101
|
* The identity a request belongs to (matched by host and mount) and the
|
|
142
102
|
* request path relative to that identity's mount, or null. The identity is
|
|
@@ -147,25 +107,13 @@ export declare class FediPodServerHandler extends HttpHandler implements Initial
|
|
|
147
107
|
identity: EmbeddedIdentity | undefined;
|
|
148
108
|
rel: string;
|
|
149
109
|
} | null;
|
|
150
|
-
/**
|
|
151
|
-
* A pod owner, already proven to control podBase, asks this server to run
|
|
152
|
-
* their identity. Returns { httpStatus, ...body }; the secret appears in the
|
|
153
|
-
* reply and nowhere else. Re-opting-in rotates the secret — that is how a
|
|
154
|
-
* lost one is recovered.
|
|
155
|
-
*/
|
|
156
|
-
/**
|
|
157
|
-
* The WebIDs behind the account session in the request, or none. The server
|
|
158
|
-
* keeps that session in a `css-account` cookie; its own account API is what
|
|
159
|
-
* says which WebIDs the session owns, and it takes the same cookie. Nothing
|
|
160
|
-
* here trusts the cookie's presence — the account API does the deciding, and
|
|
161
|
-
* the caller picks the WebID that owns the pod being claimed.
|
|
162
|
-
*/
|
|
110
|
+
/** What a pod owner asks of this server; see opt-in.ts. */
|
|
163
111
|
webIdsFromSession(request: {
|
|
164
112
|
headers: {
|
|
165
113
|
get(name: string): string | null;
|
|
166
114
|
};
|
|
167
115
|
}): Promise<string[]>;
|
|
168
|
-
optInPod(
|
|
116
|
+
optInPod(a: {
|
|
169
117
|
podBase: string;
|
|
170
118
|
webId: string;
|
|
171
119
|
container?: string;
|
|
@@ -173,11 +121,7 @@ export declare class FediPodServerHandler extends HttpHandler implements Initial
|
|
|
173
121
|
}): Promise<Record<string, unknown> & {
|
|
174
122
|
httpStatus: number;
|
|
175
123
|
}>;
|
|
176
|
-
|
|
177
|
-
* What a pod would be as an identity here, without changing anything: its
|
|
178
|
-
* handle, the host its address carries, and whether it runs here already.
|
|
179
|
-
*/
|
|
180
|
-
describePod({ podBase }: {
|
|
124
|
+
describePod(a: {
|
|
181
125
|
podBase: string;
|
|
182
126
|
}): Promise<{
|
|
183
127
|
handle: string;
|
|
@@ -186,19 +130,10 @@ export declare class FediPodServerHandler extends HttpHandler implements Initial
|
|
|
186
130
|
running: boolean;
|
|
187
131
|
manage: string;
|
|
188
132
|
}>;
|
|
189
|
-
|
|
190
|
-
optOutPod({ podBase }: {
|
|
133
|
+
optOutPod(a: {
|
|
191
134
|
podBase: string;
|
|
192
135
|
}): Promise<Record<string, unknown> & {
|
|
193
136
|
httpStatus: number;
|
|
194
137
|
}>;
|
|
195
|
-
/**
|
|
196
|
-
* A delivery to an identity's own inbox, verified here — the server that
|
|
197
|
-
* stores the inbox is the one the request reached, so the signature is
|
|
198
|
-
* checked while its headers exist and the receipt is written beside the
|
|
199
|
-
* activity. The same door code the front runs; nothing is renamed.
|
|
200
|
-
*/
|
|
201
|
-
private deliverAtDoor;
|
|
202
138
|
handle({ request, response }: HttpHandlerInput): Promise<void>;
|
|
203
139
|
}
|
|
204
|
-
export {};
|