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
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
// collections.mjs — the actor's published collections: the paged outbox and
|
|
2
|
-
// followers, following, featured, and the owner-only pending and blocked
|
|
3
|
-
// lists; and the outbox record a post or a boost goes into.
|
|
4
|
-
|
|
5
|
-
import crypto from 'node:crypto';
|
|
6
|
-
import * as wire from '../wire.mjs';
|
|
7
|
-
import * as podOutbox from '../../pod/outbox.mjs';
|
|
8
|
-
import * as podFollowers from '../../pod/followers.mjs';
|
|
9
|
-
import * as podFollowing from '../../pod/following.mjs';
|
|
10
|
-
import * as podFeatured from '../../pod/featured.mjs';
|
|
11
|
-
import * as podPrivate from '../../pod/private.mjs';
|
|
12
|
-
import * as podNotes from '../../pod/notes.mjs';
|
|
13
|
-
|
|
14
|
-
// The default for publishCollections: the whole public surface, ACLs included.
|
|
15
|
-
// A caller that knows what it changed narrows it; a caller that says nothing
|
|
16
|
-
// still gets everything, so a missed call site degrades to the old cost rather
|
|
17
|
-
// than silently publishing nothing.
|
|
18
|
-
export const ALL_COLLECTIONS = { followers: true, following: true, outbox: true, acls: true,
|
|
19
|
-
pending: true, blocked: true, featured: true };
|
|
20
|
-
|
|
21
|
-
// Publish the collections a change actually TOUCHED.
|
|
22
|
-
//
|
|
23
|
-
// Publishing all three on every follower event cost nine pod requests where
|
|
24
|
-
// two do: two reconcile reads, three collection PUTs, and three ACL PUTs
|
|
25
|
-
// whose bodies are a pure function of the WebID and the target URL and so
|
|
26
|
-
// are byte-identical to the ones written at setup. A new follower does not
|
|
27
|
-
// change what this actor follows, and it does not change the outbox.
|
|
28
|
-
//
|
|
29
|
-
// `acls` is true only on the default path, which is publishProfile: that is
|
|
30
|
-
// where the public surface is built, and where verifyPublicSurface already
|
|
31
|
-
// checks the world can read it.
|
|
32
|
-
//
|
|
33
|
-
// Reconciliation stays welded to the collection it guards. It is what stops a
|
|
34
|
-
// restored-and-behind machine publishing a short list over the pod's longer
|
|
35
|
-
// one — erasing followers it would then stop delivering to, and erasing the
|
|
36
|
-
// outbox that `rebuild` reads as its index — so a narrowed publish still runs
|
|
37
|
-
// the one belonging to whatever it is about to overwrite.
|
|
38
|
-
// Publish only the pages that actually changed.
|
|
39
|
-
//
|
|
40
|
-
// `known` is what we last wrote, so a post rewrites the newest page and the
|
|
41
|
-
// head and nothing else — where the flat collection rewrote the actor's whole
|
|
42
|
-
// history on every post. A page gets its ACL when it is first created; the
|
|
43
|
-
// container above it is owner-only, so it cannot be inherited.
|
|
44
|
-
// `force` is for the caller that publishes BECAUSE the pod does not have what
|
|
45
|
-
// the digests say it has. Without it a repair republish rewrote the head and
|
|
46
|
-
// skipped every page — the digests still matched the local record — so the
|
|
47
|
-
// head advertised a `first:` that 404s, readPublishedOutbox came back empty,
|
|
48
|
-
// rebuildStatuses recovered nothing, and the whole thing logged success. That
|
|
49
|
-
// happens to an actor with one post as surely as one with five thousand.
|
|
50
|
-
export async function publishOutbox(publisher, outbox, { acls = false, force = false } = {}) {
|
|
51
|
-
const { urls } = publisher;
|
|
52
|
-
const seen = publisher.store.read('published.json', {});
|
|
53
|
-
const { pages, index } = wire.outboxPaging(outbox, seen.outboxIndex || []);
|
|
54
|
-
const before = force ? {} : (seen.outboxPages || {});
|
|
55
|
-
const after = {};
|
|
56
|
-
let wrote = 0;
|
|
57
|
-
|
|
58
|
-
for (let i = 0; i < pages.length; i++) {
|
|
59
|
-
const n = i + 1; // 1 = oldest
|
|
60
|
-
const doc = wire.outboxPage(urls.outbox, n, pages[i]);
|
|
61
|
-
const digest = crypto.createHash('sha256').update(JSON.stringify(doc)).digest('hex').slice(0, 16);
|
|
62
|
-
after[n] = digest;
|
|
63
|
-
if (before[n] === digest) continue; // sealed and unchanged
|
|
64
|
-
await podOutbox.writePage(publisher.remote, wire.outboxPageId(urls.outbox, n), doc,
|
|
65
|
-
{ publicRead: !before[n] || acls });
|
|
66
|
-
wrote++;
|
|
67
|
-
}
|
|
68
|
-
// Pages above the new count are orphans: the outbox shrank past them, and
|
|
69
|
-
// left where they were they keep serving activities that have been taken
|
|
70
|
-
// back. The head no longer points at them, so nothing walks to them — but
|
|
71
|
-
// the URL is guessable and public.
|
|
72
|
-
const stale = Object.keys(seen.outboxPages || {}).map(Number)
|
|
73
|
-
.filter(n => Number.isFinite(n) && n > pages.length);
|
|
74
|
-
for (const n of stale) {
|
|
75
|
-
await podOutbox.dropPage(publisher.remote, wire.outboxPageId(urls.outbox, n));
|
|
76
|
-
}
|
|
77
|
-
// The head carries totalItems, so it moves whenever the outbox does. Four
|
|
78
|
-
// lines, and constant however much you have posted.
|
|
79
|
-
await podOutbox.writeHead(publisher.remote, urls,
|
|
80
|
-
wire.outboxHead(urls.outbox, outbox.length, pages.length), { publicRead: acls });
|
|
81
|
-
publisher.store.write('published.json',
|
|
82
|
-
{ ...publisher.store.read('published.json', {}), outboxPages: after, outboxIndex: index });
|
|
83
|
-
return wrote;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Every activity in the published outbox, walking the pages. Also understands
|
|
87
|
-
// the flat collection this used to write, so an actor published before paging
|
|
88
|
-
// is still readable — which matters because rebuild reads this to recover
|
|
89
|
-
// posts a lost machine no longer has.
|
|
90
|
-
export async function readPublishedOutbox(publisher) {
|
|
91
|
-
const items = await podOutbox.readPublished(publisher.remote, publisher.urls);
|
|
92
|
-
return Array.isArray(items) ? items.map(wire.outboxLocalItem) : items;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// The followers collection, paged like the outbox: a head that carries only
|
|
96
|
-
// the count and the page bounds, and page documents holding the actor IRIs —
|
|
97
|
-
// so a remote server reads a small head and walks pages instead of pulling one
|
|
98
|
-
// document that grows without limit. Regenerated from the in-memory follow
|
|
99
|
-
// graph: a follow extends the newest page and an unfollow leaves its page one
|
|
100
|
-
// short (wire.pageItems), so only the pages that changed are rewritten.
|
|
101
|
-
export async function publishFollowers(publisher, actors, { acls = false, force = false } = {}) {
|
|
102
|
-
const { urls } = publisher;
|
|
103
|
-
const seen = publisher.store.read('published.json', {});
|
|
104
|
-
const { pages, index } = wire.followersPaging(actors, seen.followersIndex || []);
|
|
105
|
-
const before = force ? {} : (seen.followersPages || {});
|
|
106
|
-
const after = {};
|
|
107
|
-
|
|
108
|
-
for (let i = 0; i < pages.length; i++) {
|
|
109
|
-
const n = i + 1;
|
|
110
|
-
const doc = wire.followersPage(urls.followers, n, pages[i], pages.length);
|
|
111
|
-
const digest = crypto.createHash('sha256').update(JSON.stringify(doc)).digest('hex').slice(0, 16);
|
|
112
|
-
after[n] = digest;
|
|
113
|
-
if (before[n] === digest) continue; // unchanged page
|
|
114
|
-
await podFollowers.writePage(publisher.remote, wire.followersPageId(urls.followers, n), doc,
|
|
115
|
-
{ publicRead: !before[n] || acls });
|
|
116
|
-
}
|
|
117
|
-
// Pages the collection shrank past would keep serving names that no longer
|
|
118
|
-
// follow; the head stops pointing at them but the URL is guessable.
|
|
119
|
-
const stale = Object.keys(seen.followersPages || {}).map(Number)
|
|
120
|
-
.filter(n => Number.isFinite(n) && n > pages.length);
|
|
121
|
-
for (const n of stale) {
|
|
122
|
-
await podFollowers.dropPage(publisher.remote, wire.followersPageId(urls.followers, n));
|
|
123
|
-
}
|
|
124
|
-
await podFollowers.writeHead(publisher.remote, urls,
|
|
125
|
-
wire.followersHead(urls.followers, actors.length, pages.length), { publicRead: acls });
|
|
126
|
-
publisher.store.write('published.json',
|
|
127
|
-
{ ...publisher.store.read('published.json', {}), followersPages: after, followersIndex: index });
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Every actor in the published followers collection, walking pages. Also reads
|
|
131
|
-
// the flat collection this used to write, so an actor published before paging
|
|
132
|
-
// still reconciles.
|
|
133
|
-
export function readPublishedFollowers(publisher) { return podFollowers.readPublished(publisher.remote, publisher.urls); }
|
|
134
|
-
|
|
135
|
-
export async function publishCollections(publisher, which = ALL_COLLECTIONS) {
|
|
136
|
-
const { urls } = publisher;
|
|
137
|
-
// A block takes the blocked out of the followers too (PodStore.setBlocklist),
|
|
138
|
-
// so the published list changes with it.
|
|
139
|
-
if (which.blocked) which = { ...which, followers: true };
|
|
140
|
-
const contacts = publisher.store.getContacts();
|
|
141
|
-
if (which.followers) {
|
|
142
|
-
// Reconcile walks the published pages, so — like the outbox — pay for it
|
|
143
|
-
// only when the local record of what is up there is missing (a restore or
|
|
144
|
-
// a copied machine), not on every ordinary save.
|
|
145
|
-
const knownF = publisher.store.read('published.json', {}).followersIndex;
|
|
146
|
-
if (which.force || !Array.isArray(knownF)) await publisher.reconcileFollowers(contacts);
|
|
147
|
-
// Bluesky-only members are not AP actors; the published collection
|
|
148
|
-
// lists only what a remote server could dereference.
|
|
149
|
-
const actors = contacts.followers.filter(f => !f.bsky).map(f => f.actor);
|
|
150
|
-
await publisher.publishFollowers(actors, { acls: which.acls, force: which.force });
|
|
151
|
-
}
|
|
152
|
-
if (which.following) {
|
|
153
|
-
await podFollowing.write(publisher.remote, urls,
|
|
154
|
-
// newest first (§5): contacts append as follows are made
|
|
155
|
-
wire.orderedCollection(urls.following, contacts.following.filter(f => f.accepted).map(f => f.actor).reverse()),
|
|
156
|
-
{ publicRead: which.acls });
|
|
157
|
-
}
|
|
158
|
-
if (which.pending) await publisher.publishPending();
|
|
159
|
-
if (which.blocked) await publisher.publishBlocked();
|
|
160
|
-
// The pinned posts, written even when there are none. The actor names this
|
|
161
|
-
// collection, and a server showing the profile reads it whether or not
|
|
162
|
-
// anything was ever pinned; with no document there the pod refused every
|
|
163
|
-
// reader, a refusal nothing caches, and every server asked again.
|
|
164
|
-
if (which.featured) await publisher.publishFeatured();
|
|
165
|
-
if (which.outbox) {
|
|
166
|
-
// A group made private takes back what it carried while open, as it goes:
|
|
167
|
-
// those posts were carried for its members, and a group turned private must
|
|
168
|
-
// not go on listing them to the world. Taken back, not hidden, so opening
|
|
169
|
-
// the group again does not put them back.
|
|
170
|
-
if (publisher.config?.kind === 'group' && publisher.config?.private) {
|
|
171
|
-
const carry = (i) => i?.type === 'Announce' || i?.type === 'Undo';
|
|
172
|
-
if (publisher.store.read('outbox.json', []).some(carry)) await unrecordOutbox(publisher, carry);
|
|
173
|
-
}
|
|
174
|
-
const outbox = publisher.store.read('outbox.json', []);
|
|
175
|
-
// Reconcile reads every published page, which is the expensive part of a
|
|
176
|
-
// profile save. It is worth paying only when we are about to write pages
|
|
177
|
-
// we did not write: on a repair, or on a machine whose state no longer
|
|
178
|
-
// records what it put up there — which is exactly the restored backup the
|
|
179
|
-
// reconcile exists for. With an intact record our copy IS what the pod
|
|
180
|
-
// has, and re-reading it to confirm that is a page walk for nothing.
|
|
181
|
-
const known = publisher.store.read('published.json', {}).outboxIndex;
|
|
182
|
-
if (which.force || !Array.isArray(known)) await publisher.reconcileOutbox(outbox);
|
|
183
|
-
await publisher.publishOutbox(outbox, { acls: which.acls, force: which.force });
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// FEP-4ccd: the follows in limbo, as owner-only collections of the Follow
|
|
188
|
-
// activities themselves. Inside the private container so its ACL is
|
|
189
|
-
// inherited — and published only where that ACL provably holds, the same
|
|
190
|
-
// bar private posts clear. A Bluesky-only request has no Follow activity a
|
|
191
|
-
// remote server could ever act on, so it is not listed.
|
|
192
|
-
export async function publishPending(publisher) {
|
|
193
|
-
if (await publisher.privateReady() !== true) return;
|
|
194
|
-
const { urls } = publisher;
|
|
195
|
-
const contacts = publisher.store.getContacts();
|
|
196
|
-
await podPrivate.writePending(publisher.remote, urls, {
|
|
197
|
-
followers: wire.orderedCollection(urls.pendingFollowers,
|
|
198
|
-
publisher.store.getRequests().filter(r => r.activity && !r.bsky).map(r => r.activity)),
|
|
199
|
-
following: wire.orderedCollection(urls.pendingFollowing,
|
|
200
|
-
contacts.following.filter(f => !f.accepted && f.followActivity)
|
|
201
|
-
.map(f => f.followActivity).reverse()),
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// FEP-c648: the blocked actors, as an owner-only collection. Actors only —
|
|
206
|
-
// domain blocks are ours, and the FEP does not carry them.
|
|
207
|
-
export async function publishBlocked(publisher) {
|
|
208
|
-
if (await publisher.privateReady() !== true) return;
|
|
209
|
-
const { urls } = publisher;
|
|
210
|
-
const actors = [...(publisher.store.getBlocklist().actors || [])].reverse();
|
|
211
|
-
await podPrivate.writeBlocked(publisher.remote, urls, wire.orderedCollection(urls.blocked, actors));
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// The outbox is the public record of everything this actor has said, boosts
|
|
215
|
-
// included. A post is recorded by its note id and published as its Create
|
|
216
|
-
// (wire.outboxWireItem); an Announce has only a fragment id, so the activity
|
|
217
|
-
// itself goes in.
|
|
218
|
-
export async function recordOutbox(publisher, item) {
|
|
219
|
-
const outbox = publisher.store.read('outbox.json', []);
|
|
220
|
-
outbox.unshift(item);
|
|
221
|
-
publisher.store.write('outbox.json', outbox);
|
|
222
|
-
await writeEntry(publisher, item);
|
|
223
|
-
await publisher.publishOutbox(outbox);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// An entry kept whole — a boost, an edit, a deletion, an undo — is also written
|
|
227
|
-
// as its own document at its id, beside the posts, so it can be fetched (§3.1).
|
|
228
|
-
// Only for the public record, and only where the id is one of those documents.
|
|
229
|
-
async function writeEntry(publisher, item) {
|
|
230
|
-
const notes = publisher.urls?.notes;
|
|
231
|
-
if (!notes || !item || typeof item !== 'object' || typeof item.id !== 'string' || !item.id.startsWith(notes)) return;
|
|
232
|
-
await podNotes.writeCreate(publisher.remote, item.id, { '@context': wire.AS_CTX, ...item })
|
|
233
|
-
.catch(e => publisher.log?.(`${item.type} ${item.id} not written as its own document: ${e.message}`));
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// Taking something out of the outbox is a DECISION — a post deleted, a boost
|
|
237
|
-
// undone. It leaves a mark for the same reason dropFollower does: the pod's
|
|
238
|
-
// copy is rewritten right after, but a rewrite that fails would otherwise let
|
|
239
|
-
// the next reconcile put the entry back. Bounded, like the follower one.
|
|
240
|
-
//
|
|
241
|
-
// What took it back goes in its place: a Delete for a deleted post, an Undo for
|
|
242
|
-
// a withdrawn boost. A reader catching up from the outbox otherwise never learns
|
|
243
|
-
// the entry it saw earlier was withdrawn. `record(gone)` names that activity (or
|
|
244
|
-
// several, newest last), or null when nothing it cares about was in the outbox
|
|
245
|
-
// (a private post never was). Both land in the one write, so the outbox is
|
|
246
|
-
// never seen with the entry gone and its reason missing.
|
|
247
|
-
export async function unrecordOutbox(publisher, matches, { record = null } = {}) {
|
|
248
|
-
const before = publisher.store.read('outbox.json', []);
|
|
249
|
-
const outbox = before.filter(i => !matches(i));
|
|
250
|
-
const gone = before.filter(i => matches(i))
|
|
251
|
-
.map(i => (typeof i === 'string' ? i : i?.id)).filter(Boolean);
|
|
252
|
-
if (gone.length) {
|
|
253
|
-
const marks = publisher.store.read('outbox-removed.json', []).filter(r => !gone.includes(r.id));
|
|
254
|
-
const at = new Date().toISOString();
|
|
255
|
-
publisher.store.write('outbox-removed.json',
|
|
256
|
-
[...marks, ...gone.map(id => ({ id, at }))].slice(-500));
|
|
257
|
-
}
|
|
258
|
-
const reasons = [].concat((gone.length && record ? record(gone) : null) || []);
|
|
259
|
-
for (const r of reasons) { outbox.unshift(r); await writeEntry(publisher, r); }
|
|
260
|
-
publisher.store.write('outbox.json', outbox);
|
|
261
|
-
await publisher.publishOutbox(outbox);
|
|
262
|
-
publisher.unrecordOwn?.(matches);
|
|
263
|
-
return gone;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// The pinned posts, as the actor's featured collection — the one document a
|
|
267
|
-
// remote server reads when it shows this profile's pins.
|
|
268
|
-
export async function publishFeatured(publisher) {
|
|
269
|
-
const ids = publisher.store.getStatuses().filter(s => s.kind === 'post' && s.pinned).map(s => s.noteId);
|
|
270
|
-
await podFeatured.write(publisher.remote, publisher.urls, wire.orderedCollection(publisher.urls.featured, ids));
|
|
271
|
-
return ids.length;
|
|
272
|
-
}
|