@fedify/fedify 2.0.0-dev.1641 → 2.0.0-dev.166
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/LICENSE +1 -1
- package/README.md +66 -30
- package/dist/{assert_rejects-7UF4R_Qs.js → assert_rejects-Ce45JcFg.js} +1 -1
- package/dist/{assert_is_error-B035L3om.js → assert_throws-BNXdRGWP.js} +31 -1
- package/dist/{builder-E2Icrl_a.js → builder-Khy2m25E.js} +15 -8
- package/dist/{client-bgSdkFa2.d.ts → client-CUTUGgvJ.d.ts} +19 -19
- package/dist/{client-BW4V0OJx.js → client-Dg7OfUDA.js} +28 -23
- package/dist/{client-CegPX0Rn.d.cts → client-by-PEGAJ.d.cts} +19 -19
- package/dist/compat/mod.cjs +1 -1
- package/dist/compat/mod.d.cts +6 -12
- package/dist/compat/mod.d.ts +6 -12
- package/dist/compat/mod.js +1 -1
- package/dist/compat/transformers.test.js +21 -19
- package/dist/context-Bns6uTJq.js +109 -0
- package/dist/{context-CDSZdQHD.d.ts → context-C7vzWilY.d.ts} +374 -182
- package/dist/{context-Dq8aCtMH.d.cts → context-CrB9RFy5.d.cts} +374 -182
- package/dist/deno-Cif1-iL_.js +117 -0
- package/dist/{testing-ByQmUvf-.js → dist-B5f6a8Tt.js} +90 -111
- package/dist/{authdocloader-BkIZCKQv.js → docloader-CVaWaEcp.js} +17 -8
- package/dist/{esm-mtx3XJAD.js → esm-DGl7uK1r.js} +32 -17
- package/dist/federation/builder.test.js +9 -9
- package/dist/federation/collection.test.js +3 -6
- package/dist/federation/handler.test.js +113 -145
- package/dist/federation/idempotency.test.js +202 -0
- package/dist/federation/inbox.test.js +5 -6
- package/dist/federation/keycache.test.js +4 -5
- package/dist/federation/kv.test.js +58 -7
- package/dist/federation/middleware.test.js +306 -111
- package/dist/federation/mod.cjs +8 -12
- package/dist/federation/mod.d.cts +7 -13
- package/dist/federation/mod.d.ts +7 -13
- package/dist/federation/mod.js +8 -13
- package/dist/federation/mq.test.js +7 -8
- package/dist/federation/negotiation.test.js +25 -0
- package/dist/federation/retry.test.js +2 -4
- package/dist/federation/router.test.js +4 -6
- package/dist/federation/send.test.js +53 -13
- package/dist/{webfinger/handler.test.js → federation/webfinger.test.js} +25 -23
- package/dist/{federation-H2_En3j5.cjs → federation-B431K2gm.cjs} +22 -0
- package/dist/{federation-D1U8YY9t.js → federation-BbZwNNWj.js} +28 -6
- package/dist/{http-Cox5GsED.js → http-B99rtXjf.js} +3 -2
- package/dist/{http-C7uYFcBo.js → http-CY-Bbe9s.js} +371 -11
- package/dist/{http-BS6766zs.d.cts → http-ClB3pLcL.d.cts} +2 -2
- package/dist/{http-DqSNLFNY.d.ts → http-DLBDPal9.d.ts} +2 -2
- package/dist/{http-ZhcoaYEa.cjs → http-DfyrqzT4.cjs} +410 -14
- package/dist/{inbox-BDdRbWNI.js → inbox-BC3B2xqc.js} +25 -7
- package/dist/{key-CfiBDu3o.js → key-Bw4eVboO.js} +3 -2
- package/dist/{keycache-CVBjz3xi.js → keycache-DRxpZ5r9.js} +1 -1
- package/dist/{keys-CBKbYaJA.js → keys-ZbcByPg9.js} +2 -1
- package/dist/{kv-63Cil1MD.d.cts → kv-B4vFhIYL.d.cts} +30 -1
- package/dist/{kv-C7sopW2E.d.ts → kv-CYySNrsn.d.ts} +30 -1
- package/dist/{kv-CRZrzyXm.js → kv-QzKcOQgP.js} +22 -0
- package/dist/kv-cache-BCsLgQXU.js +122 -0
- package/dist/kv-cache-BEeqyGER.js +107 -0
- package/dist/kv-cache-Cerg94jw.cjs +134 -0
- package/dist/{ld-CxgmnSO3.js → ld-1OEVoX2N.js} +4 -2
- package/dist/{middleware-DXidHY4N.js → middleware-7qNi2Qwp.js} +254 -254
- package/dist/middleware-B7mdNwwo.js +12 -0
- package/dist/{middleware-ByPnvMMS.js → middleware-CQv0UNYy.js} +215 -313
- package/dist/{middleware-LyCG_YVM.cjs → middleware-CvNusBTn.cjs} +309 -303
- package/dist/middleware-Dem4kH_q.js +26 -0
- package/dist/middleware-TgcMW8QT.cjs +12 -0
- package/dist/mod-0p9zUdzg.d.cts +107 -0
- package/dist/mod-0qnPv4EC.d.cts +62 -0
- package/dist/{mod-BClfg3ej.d.cts → mod-BrS8tiad.d.cts} +3 -3
- package/dist/mod-C3SOvTD1.d.ts +64 -0
- package/dist/{mod-BhMnAkFX.d.cts → mod-D6pS5_xJ.d.cts} +4 -4
- package/dist/{mod-Drmz72EK.d.ts → mod-jOa7W503.d.ts} +3 -3
- package/dist/{mod-RI3-KvUI.d.ts → mod-waqu-BL_.d.ts} +4 -4
- package/dist/mod-xc20HhMD.d.ts +109 -0
- package/dist/mod.cjs +17 -112
- package/dist/mod.d.cts +11 -17
- package/dist/mod.d.ts +11 -17
- package/dist/mod.js +11 -17
- package/dist/negotiation-5NPJL6zp.js +71 -0
- package/dist/nodeinfo/client.test.js +5 -8
- package/dist/nodeinfo/handler.test.js +23 -22
- package/dist/nodeinfo/mod.cjs +2 -3
- package/dist/nodeinfo/mod.d.cts +2 -4
- package/dist/nodeinfo/mod.d.ts +2 -4
- package/dist/nodeinfo/mod.js +2 -3
- package/dist/nodeinfo/types.test.js +4 -7
- package/dist/otel/exporter.test.js +893 -0
- package/dist/otel/mod.cjs +256 -0
- package/dist/otel/mod.d.cts +230 -0
- package/dist/otel/mod.d.ts +232 -0
- package/dist/otel/mod.js +255 -0
- package/dist/{owner-CQPnQVtf.d.ts → owner-BgI8C-VY.d.ts} +2 -3
- package/dist/{owner-B-7Ptt_m.d.cts → owner-C-zfmVAD.d.cts} +2 -3
- package/dist/{owner-Cxob5_PK.js → owner-w_YNARRI.js} +45 -8
- package/dist/{proof-BiSQNUmQ.js → proof-C8vStykH.js} +3 -2
- package/dist/{proof-2Gcor0_N.cjs → proof-CJZ5gNjq.cjs} +69 -33
- package/dist/{proof-DkxwMaWE.js → proof-aPT2G2bY.js} +47 -11
- package/dist/router-D9eI0s4b.js +118 -0
- package/dist/{send-DSEhWIYD.js → send-C77cZsvd.js} +9 -4
- package/dist/sig/http.test.js +9 -11
- package/dist/sig/key.test.js +7 -9
- package/dist/sig/ld.test.js +8 -10
- package/dist/sig/mod.cjs +7 -11
- package/dist/sig/mod.d.cts +3 -7
- package/dist/sig/mod.d.ts +3 -7
- package/dist/sig/mod.js +3 -7
- package/dist/sig/owner.test.js +31 -10
- package/dist/sig/proof.test.js +11 -12
- package/dist/testing/mod.d.ts +243 -6982
- package/dist/testing/mod.js +4 -4
- package/dist/{transformers-CoBS-oFG.cjs → transformers-BjBg6Lag.cjs} +2 -2
- package/dist/{transformers-BFT6d7J5.js → transformers-N_ip_y4P.js} +2 -2
- package/dist/{types-l2uh_ZhP.js → types-8l28uC8o.js} +31 -26
- package/dist/{types-Bqt2EgP0.cjs → types-B6z6CqIz.cjs} +33 -28
- package/dist/{types-BSuWJsOm.js → types-CPz01LGH.js} +3 -3
- package/dist/{runtime/authdocloader.test.js → utils/docloader.test.js} +11 -13
- package/dist/utils/kv-cache.test.js +211 -0
- package/dist/utils/mod.cjs +10 -0
- package/dist/utils/mod.d.cts +4 -0
- package/dist/utils/mod.d.ts +6 -0
- package/dist/utils/mod.js +9 -0
- package/package.json +34 -75
- package/dist/actor-C22bXuuC.d.ts +0 -130
- package/dist/actor-CP03csrm.cjs +0 -37786
- package/dist/actor-DMgu-ZjT.d.cts +0 -128
- package/dist/actor-DU511yTk.js +0 -37312
- package/dist/actor-DVpsNXhn.js +0 -146
- package/dist/assert_throws-53_pKeP3.js +0 -39
- package/dist/authdocloader-BnsFSERg.cjs +0 -58
- package/dist/authdocloader-DCgMyo82.js +0 -52
- package/dist/denokv-jZ0Z2h0M.js +0 -57
- package/dist/docloader-BtqIh1OE.js +0 -4795
- package/dist/docloader-CxWcuWqQ.d.ts +0 -221
- package/dist/docloader-D-MrRyHl.d.cts +0 -219
- package/dist/docloader-kae6M-GI.cjs +0 -4861
- package/dist/fixtures/activitypub.academy/users/brauca_darradiul.json +0 -83
- package/dist/fixtures/example.com/announce.json +0 -6
- package/dist/fixtures/example.com/collection.json +0 -19
- package/dist/fixtures/example.com/create.json +0 -6
- package/dist/fixtures/example.com/cross-origin-actor.json +0 -6
- package/dist/fixtures/example.com/hong-gildong.json +0 -11
- package/dist/fixtures/example.com/invite.json +0 -7
- package/dist/fixtures/example.com/key.json +0 -7
- package/dist/fixtures/example.com/key2.json +0 -6
- package/dist/fixtures/example.com/object.json +0 -6
- package/dist/fixtures/example.com/orderedcollectionpage.json +0 -24
- package/dist/fixtures/example.com/paged/a.json +0 -13
- package/dist/fixtures/example.com/paged/b.json +0 -16
- package/dist/fixtures/example.com/paged-collection.json +0 -6
- package/dist/fixtures/example.com/person.json +0 -22
- package/dist/fixtures/example.com/person2.json +0 -40
- package/dist/fixtures/example.com/test.json +0 -5
- package/dist/fixtures/example.com/users/handle.json +0 -16
- package/dist/fixtures/example.com/wrong-type.json +0 -3
- package/dist/fixtures/oeee.cafe/ap/users/3609fd4e-d51d-4db8-9f04-4189815864dd.json +0 -24
- package/dist/fixtures/remote.domain/users/bob.json +0 -20
- package/dist/fixtures/server.example/users/alice.json +0 -20
- package/dist/fixtures/w3id.org/identity/v1.json +0 -152
- package/dist/fixtures/w3id.org/security/data-integrity/v1.json +0 -74
- package/dist/fixtures/w3id.org/security/multikey/v1.json +0 -35
- package/dist/fixtures/w3id.org/security/v1.json +0 -50
- package/dist/fixtures/wizard.casa/users/hongminhee.json +0 -69
- package/dist/fixtures/www.w3.org/ns/activitystreams.json +0 -379
- package/dist/fixtures/www.w3.org/ns/did/v1.json +0 -58
- package/dist/key-B9Z5ZuX9.js +0 -10
- package/dist/key-Cc0JlcKe.js +0 -260
- package/dist/key-CgwCzDC4.js +0 -10
- package/dist/key-D-7DPHNl.cjs +0 -10
- package/dist/key-HqzOCwDc.cjs +0 -290
- package/dist/lookup-CiU3QxQz.js +0 -322
- package/dist/lookup-NuT9cCSl.js +0 -131
- package/dist/lookup-QHjmy4Og.cjs +0 -137
- package/dist/middleware-BHboQ4BE.js +0 -25
- package/dist/middleware-Bp3I9z8r.js +0 -17
- package/dist/middleware-oYqSU5ky.cjs +0 -17
- package/dist/mod-Cxt4Kpf6.d.ts +0 -291
- package/dist/mod-DBzN0aCM.d.ts +0 -115
- package/dist/mod-Dc_-mf8s.d.cts +0 -102
- package/dist/mod-FZd39qVq.d.cts +0 -1
- package/dist/mod-TFoH2Ql8.d.ts +0 -104
- package/dist/mod-evzlRVZq.d.cts +0 -289
- package/dist/mod-g0xFzAP9.d.ts +0 -2
- package/dist/mod-jQ4OODsl.d.cts +0 -113
- package/dist/mq-B7R1Q-M5.d.cts +0 -140
- package/dist/mq-CRGm1e_F.d.ts +0 -143
- package/dist/runtime/docloader.test.js +0 -522
- package/dist/runtime/key.test.js +0 -103
- package/dist/runtime/langstr.test.js +0 -39
- package/dist/runtime/link.test.js +0 -61
- package/dist/runtime/mod.cjs +0 -25
- package/dist/runtime/mod.d.cts +0 -6
- package/dist/runtime/mod.d.ts +0 -8
- package/dist/runtime/mod.js +0 -13
- package/dist/runtime/multibase/multibase.test.d.ts +0 -3
- package/dist/runtime/multibase/multibase.test.js +0 -358
- package/dist/runtime/url.test.d.ts +0 -3
- package/dist/runtime/url.test.js +0 -45
- package/dist/src/vocab/accept.yaml +0 -15
- package/dist/src/vocab/activity.yaml +0 -98
- package/dist/src/vocab/add.yaml +0 -16
- package/dist/src/vocab/announce.yaml +0 -30
- package/dist/src/vocab/application.yaml +0 -324
- package/dist/src/vocab/arrive.yaml +0 -15
- package/dist/src/vocab/article.yaml +0 -46
- package/dist/src/vocab/audio.yaml +0 -11
- package/dist/src/vocab/block.yaml +0 -16
- package/dist/src/vocab/chatmessage.yaml +0 -50
- package/dist/src/vocab/collection.yaml +0 -154
- package/dist/src/vocab/collectionpage.yaml +0 -55
- package/dist/src/vocab/create.yaml +0 -28
- package/dist/src/vocab/dataintegrityproof.yaml +0 -56
- package/dist/src/vocab/delete.yaml +0 -27
- package/dist/src/vocab/didservice.yaml +0 -22
- package/dist/src/vocab/dislike.yaml +0 -14
- package/dist/src/vocab/document.yaml +0 -31
- package/dist/src/vocab/emoji.yaml +0 -12
- package/dist/src/vocab/emojireact.yaml +0 -17
- package/dist/src/vocab/endpoints.yaml +0 -85
- package/dist/src/vocab/event.yaml +0 -11
- package/dist/src/vocab/export.yaml +0 -9
- package/dist/src/vocab/flag.yaml +0 -15
- package/dist/src/vocab/follow.yaml +0 -19
- package/dist/src/vocab/group.yaml +0 -324
- package/dist/src/vocab/hashtag.yaml +0 -14
- package/dist/src/vocab/ignore.yaml +0 -14
- package/dist/src/vocab/image.yaml +0 -9
- package/dist/src/vocab/intransitiveactivity.yaml +0 -15
- package/dist/src/vocab/invite.yaml +0 -14
- package/dist/src/vocab/join.yaml +0 -14
- package/dist/src/vocab/key.yaml +0 -28
- package/dist/src/vocab/leave.yaml +0 -14
- package/dist/src/vocab/like.yaml +0 -16
- package/dist/src/vocab/link.yaml +0 -101
- package/dist/src/vocab/listen.yaml +0 -12
- package/dist/src/vocab/mention.yaml +0 -9
- package/dist/src/vocab/move.yaml +0 -15
- package/dist/src/vocab/multikey.yaml +0 -36
- package/dist/src/vocab/note.yaml +0 -48
- package/dist/src/vocab/object.yaml +0 -404
- package/dist/src/vocab/offer.yaml +0 -15
- package/dist/src/vocab/orderedcollection.yaml +0 -39
- package/dist/src/vocab/orderedcollectionpage.yaml +0 -50
- package/dist/src/vocab/organization.yaml +0 -324
- package/dist/src/vocab/page.yaml +0 -11
- package/dist/src/vocab/person.yaml +0 -324
- package/dist/src/vocab/place.yaml +0 -75
- package/dist/src/vocab/profile.yaml +0 -26
- package/dist/src/vocab/propertyvalue.yaml +0 -32
- package/dist/src/vocab/question.yaml +0 -103
- package/dist/src/vocab/read.yaml +0 -13
- package/dist/src/vocab/reject.yaml +0 -14
- package/dist/src/vocab/relationship.yaml +0 -52
- package/dist/src/vocab/remove.yaml +0 -14
- package/dist/src/vocab/service.yaml +0 -324
- package/dist/src/vocab/source.yaml +0 -26
- package/dist/src/vocab/tentativeaccept.yaml +0 -14
- package/dist/src/vocab/tentativereject.yaml +0 -14
- package/dist/src/vocab/tombstone.yaml +0 -24
- package/dist/src/vocab/travel.yaml +0 -16
- package/dist/src/vocab/undo.yaml +0 -26
- package/dist/src/vocab/update.yaml +0 -58
- package/dist/src/vocab/video.yaml +0 -11
- package/dist/src/vocab/view.yaml +0 -13
- package/dist/testing/docloader.test.js +0 -24
- package/dist/type-B4NJkfVg.js +0 -42187
- package/dist/vocab/actor.test.d.ts +0 -3
- package/dist/vocab/actor.test.js +0 -5965
- package/dist/vocab/lookup.test.d.ts +0 -3
- package/dist/vocab/lookup.test.js +0 -206
- package/dist/vocab/mod.cjs +0 -87
- package/dist/vocab/mod.d.cts +0 -6
- package/dist/vocab/mod.d.ts +0 -8
- package/dist/vocab/mod.js +0 -10
- package/dist/vocab/schema.yaml +0 -247
- package/dist/vocab/type.test.d.ts +0 -3
- package/dist/vocab/type.test.js +0 -25
- package/dist/vocab/vocab.test.d.ts +0 -3
- package/dist/vocab/vocab.test.js +0 -3398
- package/dist/vocab-B0-5a8pw.cjs +0 -282
- package/dist/vocab-DJTYMqyU.d.cts +0 -14632
- package/dist/vocab-SOE1ifCr.d.ts +0 -14634
- package/dist/vocab-lBFcVxVF.js +0 -246
- package/dist/webfinger/handler.test.d.ts +0 -3
- package/dist/webfinger/lookup.test.d.ts +0 -3
- package/dist/webfinger/lookup.test.js +0 -195
- package/dist/webfinger/mod.cjs +0 -9
- package/dist/webfinger/mod.d.cts +0 -4
- package/dist/webfinger/mod.d.ts +0 -6
- package/dist/webfinger/mod.js +0 -9
- package/dist/webfinger-BjOEdFPs.cjs +0 -4
- package/dist/webfinger-De_bU0iE.js +0 -4
- package/dist/x/cfworkers.cjs +0 -100
- package/dist/x/cfworkers.d.cts +0 -59
- package/dist/x/cfworkers.d.ts +0 -61
- package/dist/x/cfworkers.js +0 -98
- package/dist/x/cfworkers.test.d.ts +0 -3
- package/dist/x/cfworkers.test.js +0 -179
- package/dist/x/hono.cjs +0 -61
- package/dist/x/hono.d.cts +0 -54
- package/dist/x/hono.d.ts +0 -56
- package/dist/x/hono.js +0 -60
- package/dist/x/sveltekit.cjs +0 -69
- package/dist/x/sveltekit.d.cts +0 -46
- package/dist/x/sveltekit.d.ts +0 -48
- package/dist/x/sveltekit.js +0 -68
- /package/dist/{runtime/authdocloader.test.d.ts → federation/idempotency.test.d.ts} +0 -0
- /package/dist/{runtime/docloader.test.d.ts → federation/negotiation.test.d.ts} +0 -0
- /package/dist/{runtime/key.test.d.ts → federation/webfinger.test.d.ts} +0 -0
- /package/dist/{mod-1pDWKvUL.d.ts → mod-1E3W847c.d.ts} +0 -0
- /package/dist/{mod-C2tOeRkN.d.cts → mod-C81L6_lQ.d.cts} +0 -0
- /package/dist/{nodeinfo-DfycQ8Wf.js → nodeinfo-BlLsRSiT.js} +0 -0
- /package/dist/{nodeinfo-Co9lJrWl.cjs → nodeinfo-DuMYTpbZ.cjs} +0 -0
- /package/dist/{runtime/langstr.test.d.ts → otel/exporter.test.d.ts} +0 -0
- /package/dist/{retry-CfF8Gn4d.js → retry-D4GJ670a.js} +0 -0
- /package/dist/{runtime-DPYEDf-o.js → sig-CwuONEzF.js} +0 -0
- /package/dist/{runtime-C58AJWSv.cjs → sig-DeXX2xnj.cjs} +0 -0
- /package/dist/{testing → utils}/docloader.test.d.ts +0 -0
- /package/dist/{runtime/link.test.d.ts → utils/kv-cache.test.d.ts} +0 -0
- /package/dist/{sig-ByHXzqUi.cjs → utils-Db0ZmjcD.cjs} +0 -0
- /package/dist/{sig-Cj3tk-ig.js → utils-Wranxuoe.js} +0 -0
|
@@ -3,23 +3,28 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import { getNodeInfo } from "./client-
|
|
8
|
-
import { RouterError
|
|
9
|
-
import { nodeInfoToJson } from "./types-
|
|
10
|
-
import { exportJwk, importJwk, validateCryptoKey } from "./key-
|
|
11
|
-
import { verifyRequest } from "./http-
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
6
|
+
import { deno_default } from "./deno-Cif1-iL_.js";
|
|
7
|
+
import { getNodeInfo } from "./client-Dg7OfUDA.js";
|
|
8
|
+
import { RouterError } from "./router-D9eI0s4b.js";
|
|
9
|
+
import { nodeInfoToJson } from "./types-CPz01LGH.js";
|
|
10
|
+
import { exportJwk, importJwk, validateCryptoKey } from "./key-Bw4eVboO.js";
|
|
11
|
+
import { verifyRequest } from "./http-B99rtXjf.js";
|
|
12
|
+
import { detachSignature, hasSignature, signJsonLd, verifyJsonLd } from "./ld-1OEVoX2N.js";
|
|
13
|
+
import { doesActorOwnKey, getKeyOwner } from "./owner-w_YNARRI.js";
|
|
14
|
+
import { signObject, verifyObject } from "./proof-C8vStykH.js";
|
|
15
|
+
import { getAuthenticatedDocumentLoader } from "./docloader-CVaWaEcp.js";
|
|
16
|
+
import { kvCache } from "./kv-cache-BEeqyGER.js";
|
|
17
|
+
import { routeActivity } from "./inbox-BC3B2xqc.js";
|
|
18
|
+
import { FederationBuilderImpl } from "./builder-Khy2m25E.js";
|
|
18
19
|
import { buildCollectionSynchronizationHeader } from "./collection-CcnIw1qY.js";
|
|
19
|
-
import { KvKeyCache } from "./keycache-
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
20
|
+
import { KvKeyCache } from "./keycache-DRxpZ5r9.js";
|
|
21
|
+
import { acceptsJsonLd } from "./negotiation-5NPJL6zp.js";
|
|
22
|
+
import { createExponentialBackoffPolicy } from "./retry-D4GJ670a.js";
|
|
23
|
+
import { extractInboxes, sendActivity } from "./send-C77cZsvd.js";
|
|
22
24
|
import { getLogger, withContext } from "@logtape/logtape";
|
|
25
|
+
import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
|
|
26
|
+
import { getDocumentLoader } from "@fedify/vocab-runtime";
|
|
27
|
+
import { lookupWebFinger } from "@fedify/webfinger";
|
|
23
28
|
import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
|
|
24
29
|
import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, ATTR_HTTP_RESPONSE_HEADER, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_URL_FULL } from "@opentelemetry/semantic-conventions";
|
|
25
30
|
import { domainToASCII } from "node:url";
|
|
@@ -60,7 +65,7 @@ function autoIdAssigner(activity, context$1) {
|
|
|
60
65
|
* activity like this:
|
|
61
66
|
*
|
|
62
67
|
* ```typescript
|
|
63
|
-
* import { Follow, Person } from "@fedify/
|
|
68
|
+
* import { Follow, Person } from "@fedify/vocab";
|
|
64
69
|
* const input = new Follow({
|
|
65
70
|
* id: new URL("http://example.com/activities/1"),
|
|
66
71
|
* actor: new Person({
|
|
@@ -79,7 +84,7 @@ function autoIdAssigner(activity, context$1) {
|
|
|
79
84
|
* The result of applying this transformer would be:
|
|
80
85
|
*
|
|
81
86
|
* ```typescript
|
|
82
|
-
* import { Follow, Person } from "@fedify/
|
|
87
|
+
* import { Follow, Person } from "@fedify/vocab";
|
|
83
88
|
* const output = new Follow({
|
|
84
89
|
* id: new URL("http://example.com/activities/1"),
|
|
85
90
|
* actor: new URL("http://example.com/actors/1"),
|
|
@@ -152,218 +157,8 @@ function handleNodeInfoJrd(_request, context$1) {
|
|
|
152
157
|
return Promise.resolve(response);
|
|
153
158
|
}
|
|
154
159
|
|
|
155
|
-
//#endregion
|
|
156
|
-
//#region src/vocab/constants.ts
|
|
157
|
-
/**
|
|
158
|
-
* The special public collection for [public addressing]. *Do not mutate this
|
|
159
|
-
* object.*
|
|
160
|
-
*
|
|
161
|
-
* [public addressing]: https://www.w3.org/TR/activitypub/#public-addressing
|
|
162
|
-
*
|
|
163
|
-
* @since 0.7.0
|
|
164
|
-
*/
|
|
165
|
-
const PUBLIC_COLLECTION = new URL("https://www.w3.org/ns/activitystreams#Public");
|
|
166
|
-
|
|
167
|
-
//#endregion
|
|
168
|
-
//#region src/webfinger/handler.ts
|
|
169
|
-
const logger = getLogger([
|
|
170
|
-
"fedify",
|
|
171
|
-
"webfinger",
|
|
172
|
-
"server"
|
|
173
|
-
]);
|
|
174
|
-
/**
|
|
175
|
-
* Handles a WebFinger request. You would not typically call this function
|
|
176
|
-
* directly, but instead use {@link Federation.fetch} method.
|
|
177
|
-
* @param request The WebFinger request to handle.
|
|
178
|
-
* @param parameters The parameters for handling the request.
|
|
179
|
-
* @returns The response to the request.
|
|
180
|
-
*/
|
|
181
|
-
async function handleWebFinger(request, options) {
|
|
182
|
-
if (options.tracer == null) return await handleWebFingerInternal(request, options);
|
|
183
|
-
return await options.tracer.startActiveSpan("webfinger.handle", { kind: SpanKind.SERVER }, async (span) => {
|
|
184
|
-
try {
|
|
185
|
-
const response = await handleWebFingerInternal(request, options);
|
|
186
|
-
span.setStatus({ code: response.ok ? SpanStatusCode.UNSET : SpanStatusCode.ERROR });
|
|
187
|
-
return response;
|
|
188
|
-
} catch (error) {
|
|
189
|
-
span.setStatus({
|
|
190
|
-
code: SpanStatusCode.ERROR,
|
|
191
|
-
message: String(error)
|
|
192
|
-
});
|
|
193
|
-
throw error;
|
|
194
|
-
} finally {
|
|
195
|
-
span.end();
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
async function handleWebFingerInternal(request, { context: context$1, host, actorDispatcher, actorHandleMapper, actorAliasMapper, onNotFound, span, webFingerLinksDispatcher }) {
|
|
200
|
-
if (actorDispatcher == null) {
|
|
201
|
-
logger.error("Actor dispatcher is not set.");
|
|
202
|
-
return await onNotFound(request);
|
|
203
|
-
}
|
|
204
|
-
const resource = context$1.url.searchParams.get("resource");
|
|
205
|
-
if (resource == null) return new Response("Missing resource parameter.", { status: 400 });
|
|
206
|
-
span?.setAttribute("webfinger.resource", resource);
|
|
207
|
-
let resourceUrl;
|
|
208
|
-
try {
|
|
209
|
-
resourceUrl = new URL(resource);
|
|
210
|
-
} catch (e) {
|
|
211
|
-
if (e instanceof TypeError) return new Response("Invalid resource URL.", { status: 400 });
|
|
212
|
-
throw e;
|
|
213
|
-
}
|
|
214
|
-
span?.setAttribute("webfinger.resource.scheme", resourceUrl.protocol.replace(/:$/, ""));
|
|
215
|
-
async function mapUsernameToIdentifier(username) {
|
|
216
|
-
if (actorHandleMapper == null) {
|
|
217
|
-
logger.error("No actor handle mapper is set; use the WebFinger username {username} as the actor's internal identifier.", { username });
|
|
218
|
-
return username;
|
|
219
|
-
}
|
|
220
|
-
const identifier$1 = await actorHandleMapper(context$1, username);
|
|
221
|
-
if (identifier$1 == null) {
|
|
222
|
-
logger.error("Actor {username} not found.", { username });
|
|
223
|
-
return null;
|
|
224
|
-
}
|
|
225
|
-
return identifier$1;
|
|
226
|
-
}
|
|
227
|
-
let identifier = null;
|
|
228
|
-
const uriParsed = context$1.parseUri(resourceUrl);
|
|
229
|
-
if (uriParsed?.type != "actor") {
|
|
230
|
-
const match = /^acct:([^@]+)@([^@]+)$/.exec(resource);
|
|
231
|
-
if (match == null) {
|
|
232
|
-
const result = await actorAliasMapper?.(context$1, resourceUrl);
|
|
233
|
-
if (result == null) return await onNotFound(request);
|
|
234
|
-
if ("identifier" in result) identifier = result.identifier;
|
|
235
|
-
else identifier = await mapUsernameToIdentifier(result.username);
|
|
236
|
-
} else {
|
|
237
|
-
const portMatch = /:\d+$/.exec(match[2]);
|
|
238
|
-
const normalizedHost = portMatch == null ? domainToASCII(match[2].toLowerCase()) : domainToASCII(match[2].substring(0, portMatch.index).toLowerCase()) + portMatch[0];
|
|
239
|
-
if (normalizedHost != context$1.url.host && normalizedHost != host) return await onNotFound(request);
|
|
240
|
-
else {
|
|
241
|
-
identifier = await mapUsernameToIdentifier(match[1]);
|
|
242
|
-
resourceUrl = new URL(`acct:${match[1]}@${normalizedHost}`);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
} else identifier = uriParsed.identifier;
|
|
246
|
-
if (identifier == null) return await onNotFound(request);
|
|
247
|
-
const actor = await actorDispatcher(context$1, identifier);
|
|
248
|
-
if (actor == null) {
|
|
249
|
-
logger.error("Actor {identifier} not found.", { identifier });
|
|
250
|
-
return await onNotFound(request);
|
|
251
|
-
}
|
|
252
|
-
const links = [{
|
|
253
|
-
rel: "self",
|
|
254
|
-
href: context$1.getActorUri(identifier).href,
|
|
255
|
-
type: "application/activity+json"
|
|
256
|
-
}];
|
|
257
|
-
for (const url of actor.urls) if (url instanceof Link && url.href != null) links.push({
|
|
258
|
-
rel: url.rel ?? "http://webfinger.net/rel/profile-page",
|
|
259
|
-
href: url.href.href,
|
|
260
|
-
type: url.mediaType == null ? void 0 : url.mediaType
|
|
261
|
-
});
|
|
262
|
-
else if (url instanceof URL) links.push({
|
|
263
|
-
rel: "http://webfinger.net/rel/profile-page",
|
|
264
|
-
href: url.href
|
|
265
|
-
});
|
|
266
|
-
for await (const image of actor.getIcons()) {
|
|
267
|
-
if (image.url?.href == null) continue;
|
|
268
|
-
const link = {
|
|
269
|
-
rel: "http://webfinger.net/rel/avatar",
|
|
270
|
-
href: image.url.href.toString()
|
|
271
|
-
};
|
|
272
|
-
if (image.mediaType != null) link.type = image.mediaType;
|
|
273
|
-
links.push(link);
|
|
274
|
-
}
|
|
275
|
-
if (webFingerLinksDispatcher != null) {
|
|
276
|
-
const customLinks = await webFingerLinksDispatcher(context$1, resourceUrl);
|
|
277
|
-
if (customLinks != null) for (const link of customLinks) links.push(link);
|
|
278
|
-
}
|
|
279
|
-
const aliases = [];
|
|
280
|
-
if (resourceUrl.protocol != "acct:" && actor.preferredUsername != null) {
|
|
281
|
-
aliases.push(`acct:${actor.preferredUsername}@${host ?? context$1.url.host}`);
|
|
282
|
-
if (host != null && host !== context$1.url.host) aliases.push(`acct:${actor.preferredUsername}@${context$1.url.host}`);
|
|
283
|
-
}
|
|
284
|
-
if (resourceUrl.href !== context$1.getActorUri(identifier).href) aliases.push(context$1.getActorUri(identifier).href);
|
|
285
|
-
if (resourceUrl.protocol === "acct:" && host != null && host !== context$1.url.host && !resourceUrl.href.endsWith(`@${host}`)) {
|
|
286
|
-
const username = resourceUrl.href.replace(/^acct:/, "").replace(/@.*$/, "");
|
|
287
|
-
aliases.push(`acct:${username}@${host}`);
|
|
288
|
-
}
|
|
289
|
-
const jrd = {
|
|
290
|
-
subject: resourceUrl.href,
|
|
291
|
-
aliases,
|
|
292
|
-
links
|
|
293
|
-
};
|
|
294
|
-
return new Response(JSON.stringify(jrd), { headers: {
|
|
295
|
-
"Content-Type": "application/jrd+json",
|
|
296
|
-
"Access-Control-Allow-Origin": "*"
|
|
297
|
-
} });
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
//#endregion
|
|
301
|
-
//#region src/federation/negotiation.ts
|
|
302
|
-
function compareSpecs(a, b) {
|
|
303
|
-
return b.q - a.q || (b.s ?? 0) - (a.s ?? 0) || (a.o ?? 0) - (b.o ?? 0) || a.i - b.i || 0;
|
|
304
|
-
}
|
|
305
|
-
function isQuality(spec) {
|
|
306
|
-
return spec.q > 0;
|
|
307
|
-
}
|
|
308
|
-
const simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;
|
|
309
|
-
function splitKeyValuePair(str) {
|
|
310
|
-
const [key, value] = str.split("=");
|
|
311
|
-
return [key.toLowerCase(), value];
|
|
312
|
-
}
|
|
313
|
-
function parseMediaType(str, i) {
|
|
314
|
-
const match = simpleMediaTypeRegExp.exec(str);
|
|
315
|
-
if (!match) return;
|
|
316
|
-
const [, type, subtype, parameters] = match;
|
|
317
|
-
if (!type || !subtype) return;
|
|
318
|
-
const params = Object.create(null);
|
|
319
|
-
let q = 1;
|
|
320
|
-
if (parameters) {
|
|
321
|
-
const kvps = parameters.split(";").map((p) => p.trim()).map(splitKeyValuePair);
|
|
322
|
-
for (const [key, val] of kvps) {
|
|
323
|
-
const value = val && val[0] === `"` && val[val.length - 1] === `"` ? val.slice(1, val.length - 1) : val;
|
|
324
|
-
if (key === "q" && value) {
|
|
325
|
-
q = parseFloat(value);
|
|
326
|
-
break;
|
|
327
|
-
}
|
|
328
|
-
params[key] = value;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
return {
|
|
332
|
-
type,
|
|
333
|
-
subtype,
|
|
334
|
-
params,
|
|
335
|
-
i,
|
|
336
|
-
o: void 0,
|
|
337
|
-
q,
|
|
338
|
-
s: void 0
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
function parseAccept(accept) {
|
|
342
|
-
const accepts = accept.split(",").map((p) => p.trim());
|
|
343
|
-
const mediaTypes = [];
|
|
344
|
-
for (const [index, accept$1] of accepts.entries()) {
|
|
345
|
-
const mediaType = parseMediaType(accept$1.trim(), index);
|
|
346
|
-
if (mediaType) mediaTypes.push(mediaType);
|
|
347
|
-
}
|
|
348
|
-
return mediaTypes;
|
|
349
|
-
}
|
|
350
|
-
function getFullType(spec) {
|
|
351
|
-
return `${spec.type}/${spec.subtype}`;
|
|
352
|
-
}
|
|
353
|
-
function preferredMediaTypes(accept) {
|
|
354
|
-
const accepts = parseAccept(accept === void 0 ? "*/*" : accept ?? "");
|
|
355
|
-
return accepts.filter(isQuality).sort(compareSpecs).map(getFullType);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
160
|
//#endregion
|
|
359
161
|
//#region src/federation/handler.ts
|
|
360
|
-
function acceptsJsonLd(request) {
|
|
361
|
-
const accept = request.headers.get("Accept");
|
|
362
|
-
const types = accept ? preferredMediaTypes(accept) : ["*/*"];
|
|
363
|
-
if (types == null) return true;
|
|
364
|
-
if (types[0] === "text/html" || types[0] === "application/xhtml+xml") return false;
|
|
365
|
-
return types.includes("application/activity+json") || types.includes("application/ld+json") || types.includes("application/json");
|
|
366
|
-
}
|
|
367
162
|
/**
|
|
368
163
|
* Handles an actor request.
|
|
369
164
|
* @template TContextData The context data to pass to the context.
|
|
@@ -371,7 +166,7 @@ function acceptsJsonLd(request) {
|
|
|
371
166
|
* @param parameters The parameters for handling the actor.
|
|
372
167
|
* @returns A promise that resolves to an HTTP response.
|
|
373
168
|
*/
|
|
374
|
-
async function handleActor(request, { identifier, context: context$1, actorDispatcher, authorizePredicate, onNotFound,
|
|
169
|
+
async function handleActor(request, { identifier, context: context$1, actorDispatcher, authorizePredicate, onNotFound, onUnauthorized }) {
|
|
375
170
|
const logger$2 = getLogger([
|
|
376
171
|
"fedify",
|
|
377
172
|
"federation",
|
|
@@ -386,7 +181,6 @@ async function handleActor(request, { identifier, context: context$1, actorDispa
|
|
|
386
181
|
logger$2.debug("Actor {identifier} not found.", { identifier });
|
|
387
182
|
return await onNotFound(request);
|
|
388
183
|
}
|
|
389
|
-
if (!acceptsJsonLd(request)) return await onNotAcceptable(request);
|
|
390
184
|
if (authorizePredicate != null) {
|
|
391
185
|
let key = await context$1.getSignedKey();
|
|
392
186
|
key = key?.clone({}, { $warning: {
|
|
@@ -421,11 +215,10 @@ async function handleActor(request, { identifier, context: context$1, actorDispa
|
|
|
421
215
|
* @param parameters The parameters for handling the object.
|
|
422
216
|
* @returns A promise that resolves to an HTTP response.
|
|
423
217
|
*/
|
|
424
|
-
async function handleObject(request, { values, context: context$1, objectDispatcher, authorizePredicate, onNotFound,
|
|
218
|
+
async function handleObject(request, { values, context: context$1, objectDispatcher, authorizePredicate, onNotFound, onUnauthorized }) {
|
|
425
219
|
if (objectDispatcher == null) return await onNotFound(request);
|
|
426
220
|
const object = await objectDispatcher(context$1, values);
|
|
427
221
|
if (object == null) return await onNotFound(request);
|
|
428
|
-
if (!acceptsJsonLd(request)) return await onNotAcceptable(request);
|
|
429
222
|
if (authorizePredicate != null) {
|
|
430
223
|
let key = await context$1.getSignedKey();
|
|
431
224
|
key = key?.clone({}, { $warning: {
|
|
@@ -463,7 +256,7 @@ async function handleObject(request, { values, context: context$1, objectDispatc
|
|
|
463
256
|
* @param parameters The parameters for handling the collection.
|
|
464
257
|
* @returns A promise that resolves to an HTTP response.
|
|
465
258
|
*/
|
|
466
|
-
async function handleCollection(request, { name, identifier, uriGetter, filter, filterPredicate, context: context$1, collectionCallbacks, tracerProvider, onUnauthorized, onNotFound
|
|
259
|
+
async function handleCollection(request, { name, identifier, uriGetter, filter, filterPredicate, context: context$1, collectionCallbacks, tracerProvider, onUnauthorized, onNotFound }) {
|
|
467
260
|
const spanName = name.trim().replace(/\s+/g, "_");
|
|
468
261
|
tracerProvider = tracerProvider ?? trace.getTracerProvider();
|
|
469
262
|
const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
|
|
@@ -576,7 +369,6 @@ async function handleCollection(request, { name, identifier, uriGetter, filter,
|
|
|
576
369
|
partOf
|
|
577
370
|
});
|
|
578
371
|
}
|
|
579
|
-
if (!acceptsJsonLd(request)) return await onNotAcceptable(request);
|
|
580
372
|
if (collectionCallbacks.authorizePredicate != null) {
|
|
581
373
|
let key = await context$1.getSignedKey();
|
|
582
374
|
key = key?.clone({}, { $warning: {
|
|
@@ -671,7 +463,8 @@ async function handleInbox(request, options) {
|
|
|
671
463
|
* @param span The OpenTelemetry span for tracing.
|
|
672
464
|
* @returns A promise that resolves to an HTTP response.
|
|
673
465
|
*/
|
|
674
|
-
async function handleInboxInternal(request,
|
|
466
|
+
async function handleInboxInternal(request, parameters, span) {
|
|
467
|
+
const { recipient, context: ctx, inboxContextFactory, kv, kvPrefixes, queue, actorDispatcher, inboxListeners, inboxErrorHandler, onNotFound, signatureTimeWindow, skipSignatureVerification, tracerProvider } = parameters;
|
|
675
468
|
const logger$2 = getLogger([
|
|
676
469
|
"fedify",
|
|
677
470
|
"federation",
|
|
@@ -845,6 +638,13 @@ async function handleInboxInternal(request, { recipient, context: ctx, inboxCont
|
|
|
845
638
|
}
|
|
846
639
|
if (activity.id != null) span.setAttribute("activitypub.activity.id", activity.id.href);
|
|
847
640
|
span.setAttribute("activitypub.activity.type", getTypeId(activity).href);
|
|
641
|
+
span.addEvent("activitypub.activity.received", {
|
|
642
|
+
"activitypub.activity.json": JSON.stringify(json),
|
|
643
|
+
"activitypub.activity.verified": activity != null,
|
|
644
|
+
"ld_signatures.verified": ldSigVerified,
|
|
645
|
+
"http_signatures.verified": httpSigKey != null,
|
|
646
|
+
"http_signatures.key_id": httpSigKey?.id?.href ?? ""
|
|
647
|
+
});
|
|
848
648
|
if (httpSigKey != null && !await doesActorOwnKey(activity, httpSigKey, ctx)) {
|
|
849
649
|
logger$2.error("The signer ({keyId}) and the actor ({actorId}) do not match.", {
|
|
850
650
|
activity: json,
|
|
@@ -873,7 +673,8 @@ async function handleInboxInternal(request, { recipient, context: ctx, inboxCont
|
|
|
873
673
|
kvPrefixes,
|
|
874
674
|
queue,
|
|
875
675
|
span,
|
|
876
|
-
tracerProvider
|
|
676
|
+
tracerProvider,
|
|
677
|
+
idempotencyStrategy: parameters.idempotencyStrategy
|
|
877
678
|
});
|
|
878
679
|
if (routeResult === "alreadyProcessed") return new Response(`Activity <${activity.id}> has already been processed.`, {
|
|
879
680
|
status: 202,
|
|
@@ -903,7 +704,7 @@ async function handleInboxInternal(request, { recipient, context: ctx, inboxCont
|
|
|
903
704
|
/**
|
|
904
705
|
* Handles a custom collection request.
|
|
905
706
|
* @template TItem The type of items in the collection.
|
|
906
|
-
* @template
|
|
707
|
+
* @template TParam The parameter names of the requested URL.
|
|
907
708
|
* @template TContext The type of the context, extending {@link RequestContext}.
|
|
908
709
|
* @template TContextData The context data to pass to the `TContext`.
|
|
909
710
|
* @param request The HTTP request.
|
|
@@ -914,7 +715,6 @@ async function handleInboxInternal(request, { recipient, context: ctx, inboxCont
|
|
|
914
715
|
const handleCustomCollection = exceptWrapper(_handleCustomCollection);
|
|
915
716
|
async function _handleCustomCollection(request, { name, values, context: context$1, tracerProvider, collectionCallbacks: callbacks, filterPredicate }) {
|
|
916
717
|
verifyDefined(callbacks);
|
|
917
|
-
verifyJsonLdRequest(request);
|
|
918
718
|
await authIfNeeded(context$1, values, callbacks);
|
|
919
719
|
const cursor = new URL(request.url).searchParams.get("cursor");
|
|
920
720
|
return await new CustomCollectionHandler(name, values, context$1, callbacks, tracerProvider, Collection, CollectionPage, filterPredicate).fetchCollection(cursor).toJsonLd().then(respondAsActivity);
|
|
@@ -922,7 +722,7 @@ async function _handleCustomCollection(request, { name, values, context: context
|
|
|
922
722
|
/**
|
|
923
723
|
* Handles an ordered collection request.
|
|
924
724
|
* @template TItem The type of items in the collection.
|
|
925
|
-
* @template
|
|
725
|
+
* @template TParam The parameter names of the requested URL.
|
|
926
726
|
* @template TContext The type of the context, extending {@link RequestContext}.
|
|
927
727
|
* @template TContextData The context data to pass to the `TContext`.
|
|
928
728
|
* @param request The HTTP request.
|
|
@@ -933,7 +733,6 @@ async function _handleCustomCollection(request, { name, values, context: context
|
|
|
933
733
|
const handleOrderedCollection = exceptWrapper(_handleOrderedCollection);
|
|
934
734
|
async function _handleOrderedCollection(request, { name, values, context: context$1, tracerProvider, collectionCallbacks: callbacks, filterPredicate }) {
|
|
935
735
|
verifyDefined(callbacks);
|
|
936
|
-
verifyJsonLdRequest(request);
|
|
937
736
|
await authIfNeeded(context$1, values, callbacks);
|
|
938
737
|
const cursor = new URL(request.url).searchParams.get("cursor");
|
|
939
738
|
return await new CustomCollectionHandler(name, values, context$1, callbacks, tracerProvider, OrderedCollection, OrderedCollectionPage, filterPredicate).fetchCollection(cursor).toJsonLd().then(respondAsActivity);
|
|
@@ -943,7 +742,7 @@ async function _handleOrderedCollection(request, { name, values, context: contex
|
|
|
943
742
|
* The main flow is on `getCollection`, `dispatch`.
|
|
944
743
|
*
|
|
945
744
|
* @template TItem The type of items in the collection.
|
|
946
|
-
* @template
|
|
745
|
+
* @template TParam The parameter names of the requested URL.
|
|
947
746
|
* @template TContext The type of the context. {@link Context} or {@link RequestContext}.
|
|
948
747
|
* @template TContextData The context data to pass to the `TContext`.
|
|
949
748
|
* @template TCollection The type of the collection, extending {@link Collection}.
|
|
@@ -977,14 +776,14 @@ var CustomCollectionHandler = class {
|
|
|
977
776
|
#collection = null;
|
|
978
777
|
/**
|
|
979
778
|
* Creates a new CustomCollection instance.
|
|
980
|
-
* @param
|
|
981
|
-
* @param
|
|
982
|
-
* @param
|
|
983
|
-
* @param
|
|
984
|
-
* @param
|
|
985
|
-
* @param
|
|
986
|
-
* @param
|
|
987
|
-
* @param
|
|
779
|
+
* @param name The name of the collection.
|
|
780
|
+
* @param values The parameter values for the collection.
|
|
781
|
+
* @param context The request context.
|
|
782
|
+
* @param callbacks The collection callbacks.
|
|
783
|
+
* @param tracerProvider The tracer provider for telemetry.
|
|
784
|
+
* @param Collection The Collection constructor.
|
|
785
|
+
* @param CollectionPage The CollectionPage constructor.
|
|
786
|
+
* @param filterPredicate Optional filter predicate for items.
|
|
988
787
|
*/
|
|
989
788
|
constructor(name, values, context$1, callbacks, tracerProvider = trace.getTracerProvider(), Collection$1, CollectionPage$1, filterPredicate) {
|
|
990
789
|
this.name = name;
|
|
@@ -1109,7 +908,7 @@ var CustomCollectionHandler = class {
|
|
|
1109
908
|
/**
|
|
1110
909
|
* Creates a function to wrap the dispatcher so tracing can be applied.
|
|
1111
910
|
* @param params Parameters including cursor and total items.
|
|
1112
|
-
* @returns
|
|
911
|
+
* @returns A function that handles the span operation.
|
|
1113
912
|
*/
|
|
1114
913
|
spanPages = ({ totalItems = null, cursor = null }) => async (span) => {
|
|
1115
914
|
try {
|
|
@@ -1130,23 +929,23 @@ var CustomCollectionHandler = class {
|
|
|
1130
929
|
};
|
|
1131
930
|
/**
|
|
1132
931
|
* Dispatches the collection request to get items.
|
|
1133
|
-
* @param
|
|
1134
|
-
* @returns
|
|
932
|
+
* @param cursor The cursor for pagination, or null for the first page.
|
|
933
|
+
* @returns A promise that resolves to the page items.
|
|
1135
934
|
*/
|
|
1136
935
|
async dispatch(cursor = null) {
|
|
1137
936
|
return await this.#dispatcher(this.context, this.values, cursor) ?? new ItemsNotFoundError().throw();
|
|
1138
937
|
}
|
|
1139
938
|
/**
|
|
1140
939
|
* Filters the items in the collection.
|
|
1141
|
-
* @param
|
|
1142
|
-
* @returns
|
|
940
|
+
* @param items The items to filter.
|
|
941
|
+
* @returns The filtered items.
|
|
1143
942
|
*/
|
|
1144
943
|
filterItems(items) {
|
|
1145
944
|
return filterCollectionItems(items, this.name, this.filterPredicate);
|
|
1146
945
|
}
|
|
1147
946
|
/**
|
|
1148
947
|
* Appends a cursor to the URL if it exists.
|
|
1149
|
-
* @param
|
|
948
|
+
* @param cursor The cursor to append, or null/undefined.
|
|
1150
949
|
* @returns The URL with cursor appended, or null if cursor is null/undefined.
|
|
1151
950
|
*/
|
|
1152
951
|
appendToUrl(cursor) {
|
|
@@ -1154,8 +953,7 @@ var CustomCollectionHandler = class {
|
|
|
1154
953
|
}
|
|
1155
954
|
/**
|
|
1156
955
|
* Gets the stored collection or collection page.
|
|
1157
|
-
* @returns
|
|
1158
|
-
the collection or collection page.
|
|
956
|
+
* @returns A promise that resolves to the collection or collection page.
|
|
1159
957
|
*/
|
|
1160
958
|
get collection() {
|
|
1161
959
|
if (this.#collection === null) this.#collection = this.getCollection();
|
|
@@ -1163,8 +961,8 @@ var CustomCollectionHandler = class {
|
|
|
1163
961
|
}
|
|
1164
962
|
/**
|
|
1165
963
|
* Gets the total number of items in the collection.
|
|
1166
|
-
* @returns
|
|
1167
|
-
|
|
964
|
+
* @returns A promise that resolves to the total items count,
|
|
965
|
+
* or null if not available.
|
|
1168
966
|
*/
|
|
1169
967
|
get totalItems() {
|
|
1170
968
|
if (this.#totalItems === void 0) this.totalItems = this.callbacks.counter?.(this.context, this.values);
|
|
@@ -1180,8 +978,8 @@ var CustomCollectionHandler = class {
|
|
|
1180
978
|
}
|
|
1181
979
|
/**
|
|
1182
980
|
* Gets the first cursor for pagination.
|
|
1183
|
-
* @returns
|
|
1184
|
-
or null if not available.
|
|
981
|
+
* @returns A promise that resolves to the first cursor,
|
|
982
|
+
* or null if not available.
|
|
1185
983
|
*/
|
|
1186
984
|
get firstCursor() {
|
|
1187
985
|
const cursor = this.callbacks.firstCursor?.(this.context, this.values);
|
|
@@ -1211,10 +1009,9 @@ function exceptWrapper(handler) {
|
|
|
1211
1009
|
try {
|
|
1212
1010
|
return await handler(request, handlerParams);
|
|
1213
1011
|
} catch (error) {
|
|
1214
|
-
const { onNotFound,
|
|
1012
|
+
const { onNotFound, onUnauthorized } = handlerParams;
|
|
1215
1013
|
switch (error?.constructor) {
|
|
1216
1014
|
case ItemsNotFoundError: return await onNotFound(request);
|
|
1217
|
-
case NotAcceptableError: return await onNotAcceptable(request);
|
|
1218
1015
|
case UnauthorizedError: return await onUnauthorized(request);
|
|
1219
1016
|
default: throw error;
|
|
1220
1017
|
}
|
|
@@ -1232,15 +1029,6 @@ const verifyDefined = (callbacks) => {
|
|
|
1232
1029
|
if (callbacks === void 0) throw new ItemsNotFoundError();
|
|
1233
1030
|
};
|
|
1234
1031
|
/**
|
|
1235
|
-
* Verifies that a request accepts JSON-LD content type.
|
|
1236
|
-
* @param request The HTTP request to verify.
|
|
1237
|
-
* @throws {NotAcceptableError} If the request doesn't accept JSON-LD.
|
|
1238
|
-
* @since 1.8.0
|
|
1239
|
-
*/
|
|
1240
|
-
const verifyJsonLdRequest = (request) => {
|
|
1241
|
-
if (!acceptsJsonLd(request)) throw new NotAcceptableError();
|
|
1242
|
-
};
|
|
1243
|
-
/**
|
|
1244
1032
|
* Performs authorization if needed based on the authorization predicate.
|
|
1245
1033
|
* @template TContextData The context data type.
|
|
1246
1034
|
* @param {RequestContext<TContextData>} context The request context.
|
|
@@ -1324,15 +1112,6 @@ var ItemsNotFoundError = class extends HandlerError {
|
|
|
1324
1112
|
}
|
|
1325
1113
|
};
|
|
1326
1114
|
/**
|
|
1327
|
-
* Error thrown when the request is not acceptable (e.g., wrong content type).
|
|
1328
|
-
* @since 1.8.0
|
|
1329
|
-
*/
|
|
1330
|
-
var NotAcceptableError = class extends HandlerError {
|
|
1331
|
-
constructor() {
|
|
1332
|
-
super("The request is not acceptable.");
|
|
1333
|
-
}
|
|
1334
|
-
};
|
|
1335
|
-
/**
|
|
1336
1115
|
* Error thrown when access to a collection is unauthorized.
|
|
1337
1116
|
* @since 1.8.0
|
|
1338
1117
|
*/
|
|
@@ -1368,6 +1147,138 @@ async function respondWithObjectIfAcceptable(object, request, options) {
|
|
|
1368
1147
|
return response;
|
|
1369
1148
|
}
|
|
1370
1149
|
|
|
1150
|
+
//#endregion
|
|
1151
|
+
//#region src/federation/webfinger.ts
|
|
1152
|
+
const logger = getLogger([
|
|
1153
|
+
"fedify",
|
|
1154
|
+
"webfinger",
|
|
1155
|
+
"server"
|
|
1156
|
+
]);
|
|
1157
|
+
/**
|
|
1158
|
+
* Handles a WebFinger request. You would not typically call this function
|
|
1159
|
+
* directly, but instead use {@link Federation.fetch} method.
|
|
1160
|
+
* @param request The WebFinger request to handle.
|
|
1161
|
+
* @param parameters The parameters for handling the request.
|
|
1162
|
+
* @returns The response to the request.
|
|
1163
|
+
*/
|
|
1164
|
+
async function handleWebFinger(request, options) {
|
|
1165
|
+
if (options.tracer == null) return await handleWebFingerInternal(request, options);
|
|
1166
|
+
return await options.tracer.startActiveSpan("webfinger.handle", { kind: SpanKind.SERVER }, async (span) => {
|
|
1167
|
+
try {
|
|
1168
|
+
const response = await handleWebFingerInternal(request, options);
|
|
1169
|
+
span.setStatus({ code: response.ok ? SpanStatusCode.UNSET : SpanStatusCode.ERROR });
|
|
1170
|
+
return response;
|
|
1171
|
+
} catch (error) {
|
|
1172
|
+
span.setStatus({
|
|
1173
|
+
code: SpanStatusCode.ERROR,
|
|
1174
|
+
message: String(error)
|
|
1175
|
+
});
|
|
1176
|
+
throw error;
|
|
1177
|
+
} finally {
|
|
1178
|
+
span.end();
|
|
1179
|
+
}
|
|
1180
|
+
});
|
|
1181
|
+
}
|
|
1182
|
+
async function handleWebFingerInternal(request, { context: context$1, host, actorDispatcher, actorHandleMapper, actorAliasMapper, onNotFound, span, webFingerLinksDispatcher }) {
|
|
1183
|
+
if (actorDispatcher == null) {
|
|
1184
|
+
logger.error("Actor dispatcher is not set.");
|
|
1185
|
+
return await onNotFound(request);
|
|
1186
|
+
}
|
|
1187
|
+
const resource = context$1.url.searchParams.get("resource");
|
|
1188
|
+
if (resource == null) return new Response("Missing resource parameter.", { status: 400 });
|
|
1189
|
+
span?.setAttribute("webfinger.resource", resource);
|
|
1190
|
+
let resourceUrl;
|
|
1191
|
+
try {
|
|
1192
|
+
resourceUrl = new URL(resource);
|
|
1193
|
+
} catch (e) {
|
|
1194
|
+
if (e instanceof TypeError) return new Response("Invalid resource URL.", { status: 400 });
|
|
1195
|
+
throw e;
|
|
1196
|
+
}
|
|
1197
|
+
span?.setAttribute("webfinger.resource.scheme", resourceUrl.protocol.replace(/:$/, ""));
|
|
1198
|
+
async function mapUsernameToIdentifier(username) {
|
|
1199
|
+
if (actorHandleMapper == null) {
|
|
1200
|
+
logger.error("No actor handle mapper is set; use the WebFinger username {username} as the actor's internal identifier.", { username });
|
|
1201
|
+
return username;
|
|
1202
|
+
}
|
|
1203
|
+
const identifier$1 = await actorHandleMapper(context$1, username);
|
|
1204
|
+
if (identifier$1 == null) {
|
|
1205
|
+
logger.error("Actor {username} not found.", { username });
|
|
1206
|
+
return null;
|
|
1207
|
+
}
|
|
1208
|
+
return identifier$1;
|
|
1209
|
+
}
|
|
1210
|
+
let identifier = null;
|
|
1211
|
+
const uriParsed = context$1.parseUri(resourceUrl);
|
|
1212
|
+
if (uriParsed?.type != "actor") {
|
|
1213
|
+
const match = /^acct:([^@]+)@([^@]+)$/.exec(resource);
|
|
1214
|
+
if (match == null) {
|
|
1215
|
+
const result = await actorAliasMapper?.(context$1, resourceUrl);
|
|
1216
|
+
if (result == null) return await onNotFound(request);
|
|
1217
|
+
if ("identifier" in result) identifier = result.identifier;
|
|
1218
|
+
else identifier = await mapUsernameToIdentifier(result.username);
|
|
1219
|
+
} else {
|
|
1220
|
+
const portMatch = /:\d+$/.exec(match[2]);
|
|
1221
|
+
const normalizedHost = portMatch == null ? domainToASCII(match[2].toLowerCase()) : domainToASCII(match[2].substring(0, portMatch.index).toLowerCase()) + portMatch[0];
|
|
1222
|
+
if (normalizedHost != context$1.url.host && normalizedHost != host) return await onNotFound(request);
|
|
1223
|
+
else {
|
|
1224
|
+
identifier = await mapUsernameToIdentifier(match[1]);
|
|
1225
|
+
resourceUrl = new URL(`acct:${match[1]}@${normalizedHost}`);
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
} else identifier = uriParsed.identifier;
|
|
1229
|
+
if (identifier == null) return await onNotFound(request);
|
|
1230
|
+
const actor = await actorDispatcher(context$1, identifier);
|
|
1231
|
+
if (actor == null) {
|
|
1232
|
+
logger.error("Actor {identifier} not found.", { identifier });
|
|
1233
|
+
return await onNotFound(request);
|
|
1234
|
+
}
|
|
1235
|
+
const links = [{
|
|
1236
|
+
rel: "self",
|
|
1237
|
+
href: context$1.getActorUri(identifier).href,
|
|
1238
|
+
type: "application/activity+json"
|
|
1239
|
+
}];
|
|
1240
|
+
for (const url of actor.urls) if (url instanceof Link && url.href != null) links.push({
|
|
1241
|
+
rel: url.rel ?? "http://webfinger.net/rel/profile-page",
|
|
1242
|
+
href: url.href.href,
|
|
1243
|
+
type: url.mediaType == null ? void 0 : url.mediaType
|
|
1244
|
+
});
|
|
1245
|
+
else if (url instanceof URL) links.push({
|
|
1246
|
+
rel: "http://webfinger.net/rel/profile-page",
|
|
1247
|
+
href: url.href
|
|
1248
|
+
});
|
|
1249
|
+
for await (const image of actor.getIcons()) {
|
|
1250
|
+
if (image.url?.href == null) continue;
|
|
1251
|
+
links.push({
|
|
1252
|
+
rel: "http://webfinger.net/rel/avatar",
|
|
1253
|
+
href: image.url.href.toString(),
|
|
1254
|
+
...image.mediaType != null && { type: image.mediaType }
|
|
1255
|
+
});
|
|
1256
|
+
}
|
|
1257
|
+
if (webFingerLinksDispatcher != null) {
|
|
1258
|
+
const customLinks = await webFingerLinksDispatcher(context$1, resourceUrl);
|
|
1259
|
+
if (customLinks != null) for (const link of customLinks) links.push(link);
|
|
1260
|
+
}
|
|
1261
|
+
const aliases = [];
|
|
1262
|
+
if (resourceUrl.protocol != "acct:" && actor.preferredUsername != null) {
|
|
1263
|
+
aliases.push(`acct:${actor.preferredUsername}@${host ?? context$1.url.host}`);
|
|
1264
|
+
if (host != null && host !== context$1.url.host) aliases.push(`acct:${actor.preferredUsername}@${context$1.url.host}`);
|
|
1265
|
+
}
|
|
1266
|
+
if (resourceUrl.href !== context$1.getActorUri(identifier).href) aliases.push(context$1.getActorUri(identifier).href);
|
|
1267
|
+
if (resourceUrl.protocol === "acct:" && host != null && host !== context$1.url.host && !resourceUrl.href.endsWith(`@${host}`)) {
|
|
1268
|
+
const username = resourceUrl.href.replace(/^acct:/, "").replace(/@.*$/, "");
|
|
1269
|
+
aliases.push(`acct:${username}@${host}`);
|
|
1270
|
+
}
|
|
1271
|
+
const jrd = {
|
|
1272
|
+
subject: resourceUrl.href,
|
|
1273
|
+
aliases,
|
|
1274
|
+
links
|
|
1275
|
+
};
|
|
1276
|
+
return new Response(JSON.stringify(jrd), { headers: {
|
|
1277
|
+
"Content-Type": "application/jrd+json",
|
|
1278
|
+
"Access-Control-Allow-Origin": "*"
|
|
1279
|
+
} });
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1371
1282
|
//#endregion
|
|
1372
1283
|
//#region src/federation/middleware.ts
|
|
1373
1284
|
/**
|
|
@@ -1405,7 +1316,6 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
1405
1316
|
firstKnock;
|
|
1406
1317
|
constructor(options) {
|
|
1407
1318
|
super();
|
|
1408
|
-
const logger$2 = getLogger(["fedify", "federation"]);
|
|
1409
1319
|
this.kv = options.kv;
|
|
1410
1320
|
this.kvPrefixes = {
|
|
1411
1321
|
activityIdempotence: ["_fedify", "activityIdempotence"],
|
|
@@ -1453,8 +1363,9 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
1453
1363
|
this.router.trailingSlashInsensitive = options.trailingSlashInsensitive ?? false;
|
|
1454
1364
|
this._initializeRouter();
|
|
1455
1365
|
if (options.allowPrivateAddress || options.userAgent != null) {
|
|
1456
|
-
if (options.
|
|
1457
|
-
|
|
1366
|
+
if (options.documentLoaderFactory != null) throw new TypeError("Cannot set documentLoaderFactory with allowPrivateAddress or userAgent options.");
|
|
1367
|
+
if (options.contextLoaderFactory != null) throw new TypeError("Cannot set contextLoaderFactory with allowPrivateAddress or userAgent options.");
|
|
1368
|
+
if (options.authenticatedDocumentLoaderFactory != null) throw new TypeError("Cannot set authenticatedDocumentLoaderFactory with allowPrivateAddress or userAgent options.");
|
|
1458
1369
|
}
|
|
1459
1370
|
const { allowPrivateAddress, userAgent } = options;
|
|
1460
1371
|
this.allowPrivateAddress = allowPrivateAddress ?? false;
|
|
@@ -1468,11 +1379,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
1468
1379
|
prefix: this.kvPrefixes.remoteDocument
|
|
1469
1380
|
});
|
|
1470
1381
|
});
|
|
1471
|
-
|
|
1472
|
-
if (options.contextLoaderFactory != null) throw new TypeError("Cannot set both contextLoader and contextLoaderFactory options at a time; use contextLoaderFactory only.");
|
|
1473
|
-
this.contextLoaderFactory = () => options.contextLoader;
|
|
1474
|
-
logger$2.warn("The contextLoader option is deprecated; use contextLoaderFactory option instead.");
|
|
1475
|
-
} else this.contextLoaderFactory = options.contextLoaderFactory ?? this.documentLoaderFactory;
|
|
1382
|
+
this.contextLoaderFactory = options.contextLoaderFactory ?? this.documentLoaderFactory;
|
|
1476
1383
|
this.authenticatedDocumentLoaderFactory = options.authenticatedDocumentLoaderFactory ?? ((identity) => getAuthenticatedDocumentLoader(identity, {
|
|
1477
1384
|
allowPrivateAddress,
|
|
1478
1385
|
userAgent,
|
|
@@ -2011,6 +1918,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2011
1918
|
span,
|
|
2012
1919
|
tracer
|
|
2013
1920
|
});
|
|
1921
|
+
if (acceptsJsonLd(request)) response.headers.set("Vary", "Accept");
|
|
2014
1922
|
} catch (error) {
|
|
2015
1923
|
span.setStatus({
|
|
2016
1924
|
code: SpanStatusCode.ERROR,
|
|
@@ -2074,6 +1982,9 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2074
1982
|
context: context$1,
|
|
2075
1983
|
nodeInfoDispatcher: this.nodeInfoDispatcher
|
|
2076
1984
|
});
|
|
1985
|
+
}
|
|
1986
|
+
if (request.method !== "POST" && !acceptsJsonLd(request)) return await onNotAcceptable(request);
|
|
1987
|
+
switch (routeName) {
|
|
2077
1988
|
case "actor":
|
|
2078
1989
|
context$1 = this.#createContext(request, contextData, { invokedFromActorDispatcher: { identifier: route.values.identifier ?? route.values.handle } });
|
|
2079
1990
|
return await handleActor(request, {
|
|
@@ -2082,8 +1993,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2082
1993
|
actorDispatcher: this.actorCallbacks?.dispatcher,
|
|
2083
1994
|
authorizePredicate: this.actorCallbacks?.authorizePredicate,
|
|
2084
1995
|
onUnauthorized,
|
|
2085
|
-
onNotFound
|
|
2086
|
-
onNotAcceptable
|
|
1996
|
+
onNotFound
|
|
2087
1997
|
});
|
|
2088
1998
|
case "object": {
|
|
2089
1999
|
const typeId = route.name.replace(/^object:/, "");
|
|
@@ -2099,8 +2009,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2099
2009
|
objectDispatcher: callbacks?.dispatcher,
|
|
2100
2010
|
authorizePredicate: callbacks?.authorizePredicate,
|
|
2101
2011
|
onUnauthorized,
|
|
2102
|
-
onNotFound
|
|
2103
|
-
onNotAcceptable
|
|
2012
|
+
onNotFound
|
|
2104
2013
|
});
|
|
2105
2014
|
}
|
|
2106
2015
|
case "outbox": return await handleCollection(request, {
|
|
@@ -2111,8 +2020,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2111
2020
|
collectionCallbacks: this.outboxCallbacks,
|
|
2112
2021
|
tracerProvider: this.tracerProvider,
|
|
2113
2022
|
onUnauthorized,
|
|
2114
|
-
onNotFound
|
|
2115
|
-
onNotAcceptable
|
|
2023
|
+
onNotFound
|
|
2116
2024
|
});
|
|
2117
2025
|
case "inbox":
|
|
2118
2026
|
if (request.method !== "POST") return await handleCollection(request, {
|
|
@@ -2123,8 +2031,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2123
2031
|
collectionCallbacks: this.inboxCallbacks,
|
|
2124
2032
|
tracerProvider: this.tracerProvider,
|
|
2125
2033
|
onUnauthorized,
|
|
2126
|
-
onNotFound
|
|
2127
|
-
onNotAcceptable
|
|
2034
|
+
onNotFound
|
|
2128
2035
|
});
|
|
2129
2036
|
context$1 = this.#createContext(request, contextData, { documentLoader: await context$1.getDocumentLoader({ identifier: route.values.identifier ?? route.values.handle }) });
|
|
2130
2037
|
case "sharedInbox":
|
|
@@ -2146,7 +2053,8 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2146
2053
|
onNotFound,
|
|
2147
2054
|
signatureTimeWindow: this.signatureTimeWindow,
|
|
2148
2055
|
skipSignatureVerification: this.skipSignatureVerification,
|
|
2149
|
-
tracerProvider: this.tracerProvider
|
|
2056
|
+
tracerProvider: this.tracerProvider,
|
|
2057
|
+
idempotencyStrategy: this.idempotencyStrategy
|
|
2150
2058
|
});
|
|
2151
2059
|
case "following": return await handleCollection(request, {
|
|
2152
2060
|
name: "following",
|
|
@@ -2156,8 +2064,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2156
2064
|
collectionCallbacks: this.followingCallbacks,
|
|
2157
2065
|
tracerProvider: this.tracerProvider,
|
|
2158
2066
|
onUnauthorized,
|
|
2159
|
-
onNotFound
|
|
2160
|
-
onNotAcceptable
|
|
2067
|
+
onNotFound
|
|
2161
2068
|
});
|
|
2162
2069
|
case "followers": {
|
|
2163
2070
|
let baseUrl = url.searchParams.get("base-url");
|
|
@@ -2180,8 +2087,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2180
2087
|
collectionCallbacks: this.followersCallbacks,
|
|
2181
2088
|
tracerProvider: this.tracerProvider,
|
|
2182
2089
|
onUnauthorized,
|
|
2183
|
-
onNotFound
|
|
2184
|
-
onNotAcceptable
|
|
2090
|
+
onNotFound
|
|
2185
2091
|
});
|
|
2186
2092
|
}
|
|
2187
2093
|
case "liked": return await handleCollection(request, {
|
|
@@ -2192,8 +2098,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2192
2098
|
collectionCallbacks: this.likedCallbacks,
|
|
2193
2099
|
tracerProvider: this.tracerProvider,
|
|
2194
2100
|
onUnauthorized,
|
|
2195
|
-
onNotFound
|
|
2196
|
-
onNotAcceptable
|
|
2101
|
+
onNotFound
|
|
2197
2102
|
});
|
|
2198
2103
|
case "featured": return await handleCollection(request, {
|
|
2199
2104
|
name: "featured",
|
|
@@ -2203,8 +2108,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2203
2108
|
collectionCallbacks: this.featuredCallbacks,
|
|
2204
2109
|
tracerProvider: this.tracerProvider,
|
|
2205
2110
|
onUnauthorized,
|
|
2206
|
-
onNotFound
|
|
2207
|
-
onNotAcceptable
|
|
2111
|
+
onNotFound
|
|
2208
2112
|
});
|
|
2209
2113
|
case "featuredTags": return await handleCollection(request, {
|
|
2210
2114
|
name: "featured tags",
|
|
@@ -2214,8 +2118,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2214
2118
|
collectionCallbacks: this.featuredTagsCallbacks,
|
|
2215
2119
|
tracerProvider: this.tracerProvider,
|
|
2216
2120
|
onUnauthorized,
|
|
2217
|
-
onNotFound
|
|
2218
|
-
onNotAcceptable
|
|
2121
|
+
onNotFound
|
|
2219
2122
|
});
|
|
2220
2123
|
case "collection": {
|
|
2221
2124
|
const name = route.name.replace(/^collection:/, "");
|
|
@@ -2227,8 +2130,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2227
2130
|
collectionCallbacks: callbacks,
|
|
2228
2131
|
tracerProvider: this.tracerProvider,
|
|
2229
2132
|
onUnauthorized,
|
|
2230
|
-
onNotFound
|
|
2231
|
-
onNotAcceptable
|
|
2133
|
+
onNotFound
|
|
2232
2134
|
});
|
|
2233
2135
|
}
|
|
2234
2136
|
case "orderedCollection": {
|
|
@@ -2241,8 +2143,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2241
2143
|
collectionCallbacks: callbacks,
|
|
2242
2144
|
tracerProvider: this.tracerProvider,
|
|
2243
2145
|
onUnauthorized,
|
|
2244
|
-
onNotFound
|
|
2245
|
-
onNotAcceptable
|
|
2146
|
+
onNotFound
|
|
2246
2147
|
});
|
|
2247
2148
|
}
|
|
2248
2149
|
default: {
|
|
@@ -2896,7 +2797,8 @@ var ContextImpl = class ContextImpl {
|
|
|
2896
2797
|
kvPrefixes: this.federation.kvPrefixes,
|
|
2897
2798
|
queue: this.federation.inboxQueue,
|
|
2898
2799
|
span,
|
|
2899
|
-
tracerProvider: options.tracerProvider ?? this.tracerProvider
|
|
2800
|
+
tracerProvider: options.tracerProvider ?? this.tracerProvider,
|
|
2801
|
+
idempotencyStrategy: this.federation.idempotencyStrategy
|
|
2900
2802
|
});
|
|
2901
2803
|
return routeResult === "alreadyProcessed" || routeResult === "enqueued" || routeResult === "unsupportedActivity" || routeResult === "success";
|
|
2902
2804
|
}
|
|
@@ -3210,4 +3112,4 @@ function getRequestId(request) {
|
|
|
3210
3112
|
}
|
|
3211
3113
|
|
|
3212
3114
|
//#endregion
|
|
3213
|
-
export { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer,
|
|
3115
|
+
export { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer, actorDehydrator, autoIdAssigner, createFederation, handleActor, handleCollection, handleCustomCollection, handleInbox, handleNodeInfo, handleNodeInfoJrd, handleObject, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable };
|