@fedify/fedify 2.0.0-dev.1690 → 2.0.0-dev.170
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 +70 -34
- package/dist/{assert_rejects-DiIiJbZn.js → assert_rejects-Ce45JcFg.js} +1 -1
- package/dist/{assert_is_error-BPGph1Jx.js → assert_throws-BNXdRGWP.js} +31 -1
- package/dist/{builder-CYOcDUkj.js → builder-_MVsWtsS.js} +9 -8
- package/dist/{client-bgSdkFa2.d.ts → client-CUTUGgvJ.d.ts} +19 -19
- package/dist/{client-CnOdwLLN.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 +19 -18
- package/dist/context-Bns6uTJq.js +109 -0
- package/dist/{context-ByZprN0S.d.ts → context-C7vzWilY.d.ts} +314 -182
- package/dist/{context-C5BsZkDr.d.cts → context-CrB9RFy5.d.cts} +314 -182
- package/dist/deno-DhWON59o.js +117 -0
- package/dist/{testing-BWNCAbL-.js → dist-B5f6a8Tt.js} +90 -111
- package/dist/{authdocloader-Brax1A32.js → docloader-Cni79dmb.js} +17 -8
- package/dist/{esm-DnIzfEj0.js → esm-DGl7uK1r.js} +32 -17
- package/dist/federation/builder.test.js +11 -11
- package/dist/federation/collection.test.js +5 -8
- package/dist/federation/handler.test.js +111 -24
- package/dist/federation/idempotency.test.js +24 -24
- package/dist/federation/inbox.test.js +5 -6
- package/dist/federation/keycache.test.js +4 -5
- package/dist/federation/kv.test.js +60 -9
- package/dist/federation/middleware.test.js +102 -101
- 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 +9 -10
- package/dist/federation/negotiation.test.js +5 -8
- package/dist/federation/retry.test.js +2 -4
- package/dist/federation/router.test.js +6 -8
- package/dist/federation/send.test.js +55 -15
- package/dist/{webfinger/handler.test.js → federation/webfinger.test.js} +25 -24
- package/dist/{federation-H2_En3j5.cjs → federation-B431K2gm.cjs} +22 -0
- package/dist/{federation-D1U8YY9t.js → federation-BbZwNNWj.js} +28 -6
- package/dist/{http-C7vbQwbz.cjs → http-7RQPvAkX.cjs} +410 -14
- package/dist/{http-BxbM8sEy.js → http-CZXlv4xU.js} +371 -11
- package/dist/{http-D-e6AFwR.d.cts → http-ClB3pLcL.d.cts} +2 -2
- package/dist/{http-BNOYnVsU.js → http-CwsBL5_A.js} +3 -2
- package/dist/{http-D6Uj2x2y.d.ts → http-DLBDPal9.d.ts} +2 -2
- package/dist/{inbox-BRru9pX3.js → inbox-CukSCwad.js} +2 -1
- package/dist/{key-1KXru8Ug.js → key-DKkHKzvg.js} +3 -2
- package/dist/{keycache-CN61iGVj.js → keycache-DRxpZ5r9.js} +1 -1
- package/dist/{keys-BPdFKgiy.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-BEeqyGER.js +107 -0
- package/dist/kv-cache-BVA7CrnS.cjs +134 -0
- package/dist/kv-cache-HDuc4ZaJ.js +122 -0
- package/dist/{ld-Dv8DNNAT.js → ld-CM6OO5ar.js} +4 -2
- package/dist/middleware--i9t8nKh.js +26 -0
- package/dist/middleware-C567nJlD.cjs +12 -0
- package/dist/middleware-D9oWuacw.js +12 -0
- package/dist/{middleware-DY9B2lL8.js → middleware-DXRcwk_y.js} +185 -192
- package/dist/{middleware-BmoOlgc1.cjs → middleware-TufpQUzj.cjs} +251 -241
- package/dist/{middleware-Bz_A2jeJ.js → middleware-eDeNdyRA.js} +195 -191
- package/dist/mod-0p9zUdzg.d.cts +107 -0
- package/dist/mod-0qnPv4EC.d.cts +62 -0
- package/dist/{mod-Djzcw2ry.d.cts → mod-BrS8tiad.d.cts} +3 -3
- package/dist/mod-C3SOvTD1.d.ts +64 -0
- package/dist/{mod-8DMWKtQE.d.cts → mod-D6pS5_xJ.d.cts} +4 -4
- package/dist/{mod-BhUKmBJD.d.ts → mod-jOa7W503.d.ts} +3 -3
- package/dist/{mod-D6hQoxC5.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/nodeinfo/client.test.js +7 -10
- package/dist/nodeinfo/handler.test.js +23 -23
- 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 +6 -9
- 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-e3FYDhsk.js → owner-BOEfZQv2.js} +45 -8
- package/dist/{owner-hd9lvQcP.d.ts → owner-BgI8C-VY.d.ts} +2 -3
- package/dist/{owner-BN_tO3cY.d.cts → owner-C-zfmVAD.d.cts} +2 -3
- package/dist/{proof-B-eqv0Ug.cjs → proof-CaDQpGJD.cjs} +69 -33
- package/dist/{proof-DfgvA3al.js → proof-iYIDiv8I.js} +47 -11
- package/dist/{proof-6gFMwMNJ.js → proof-iw6KtIyj.js} +3 -2
- package/dist/router-D9eI0s4b.js +118 -0
- package/dist/{send-Tl9NOnmO.js → send-Bn8o0mjW.js} +9 -4
- package/dist/sig/http.test.js +11 -13
- package/dist/sig/key.test.js +9 -11
- 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 +33 -12
- package/dist/sig/proof.test.js +13 -14
- package/dist/testing/mod.d.ts +183 -7194
- 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-DqxyTxOf.js → types-8l28uC8o.js} +31 -26
- package/dist/{types-zqdWZh4O.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} +13 -15
- 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-Be0ThtXy.cjs +0 -42609
- package/dist/actor-ChbPLm6n.js +0 -42135
- package/dist/actor-D6K058Tb.d.cts +0 -128
- package/dist/actor-DuCeRiNh.js +0 -146
- package/dist/actor-T6RyhRgk.d.ts +0 -130
- package/dist/assert_throws-BOO88avQ.js +0 -39
- package/dist/authdocloader-CrxhFL8e.js +0 -52
- package/dist/authdocloader-OSn_teLV.cjs +0 -58
- package/dist/denokv-Bv33Xxea.js +0 -57
- package/dist/docloader-CCqXeagZ.cjs +0 -4861
- package/dist/docloader-CxWcuWqQ.d.ts +0 -221
- package/dist/docloader-D-MrRyHl.d.cts +0 -219
- package/dist/docloader-XK3y2jn5.js +0 -4795
- 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/media.example.com/avatars/test-avatar.jpg.json +0 -6
- 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-B3uag-rz.js +0 -10
- package/dist/key-BiBmb1Yy.cjs +0 -10
- package/dist/key-DK_nfU4I.js +0 -10
- package/dist/key-Z6ceKnZC.cjs +0 -290
- package/dist/key-jyNTxCvK.js +0 -260
- package/dist/lookup-BPviO8ij.js +0 -131
- package/dist/lookup-hnMAAU5r.cjs +0 -137
- package/dist/lookup-pV0JOsuV.js +0 -331
- package/dist/middleware-CI0-zw4U.js +0 -26
- package/dist/middleware-QNK-W-jE.cjs +0 -17
- package/dist/middleware-_vjt6FWU.js +0 -17
- package/dist/mod-CerN_Sza.d.ts +0 -104
- package/dist/mod-Cj1tHXBR.d.cts +0 -102
- package/dist/mod-CxkWO3Mg.d.cts +0 -307
- package/dist/mod-DBzN0aCM.d.ts +0 -115
- package/dist/mod-DlU8ISoa.d.ts +0 -309
- package/dist/mod-FZd39qVq.d.cts +0 -1
- 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.d.ts +0 -3
- package/dist/runtime/langstr.test.js +0 -39
- package/dist/runtime/link.test.d.ts +0 -3
- 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-C69ZBu7f.js +0 -47010
- 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 -456
- 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 -3787
- package/dist/vocab-B39-pFl9.cjs +0 -291
- package/dist/vocab-BI0Ak5lL.d.ts +0 -14924
- package/dist/vocab-BWoeZsME.js +0 -255
- package/dist/vocab-Dw1-yVGg.d.cts +0 -14922
- 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/{assert_not_equals-f3m3epl3.js → assert_not_equals-C80BG-_5.js} +0 -0
- /package/dist/{runtime/authdocloader.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/docloader.test.d.ts → otel/exporter.test.d.ts} +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/{std__assert-X-_kMxKM.js → std__assert-DWivtrGR.js} +0 -0
- /package/dist/{testing → utils}/docloader.test.d.ts +0 -0
- /package/dist/{runtime/key.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
|
@@ -2,23 +2,21 @@
|
|
|
2
2
|
import { Temporal } from "@js-temporal/polyfill";
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
|
|
5
|
-
import { getDefaultActivityTransformers } from "./transformers-
|
|
6
|
-
import { deno_default,
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { doubleKnock, verifyRequest } from "./http-BxbM8sEy.js";
|
|
11
|
-
import { detachSignature, doesActorOwnKey, getKeyOwner, hasSignature, signJsonLd, signObject, verifyJsonLd, verifyObject } from "./proof-DfgvA3al.js";
|
|
12
|
-
import { getNodeInfo, nodeInfoToJson } from "./types-DqxyTxOf.js";
|
|
13
|
-
import { getAuthenticatedDocumentLoader } from "./authdocloader-CrxhFL8e.js";
|
|
14
|
-
import { lookupObject, traverseCollection } from "./vocab-BWoeZsME.js";
|
|
5
|
+
import { getDefaultActivityTransformers } from "./transformers-N_ip_y4P.js";
|
|
6
|
+
import { deno_default, doubleKnock, exportJwk, importJwk, validateCryptoKey, verifyRequest } from "./http-CZXlv4xU.js";
|
|
7
|
+
import { detachSignature, doesActorOwnKey, getKeyOwner, hasSignature, signJsonLd, signObject, verifyJsonLd, verifyObject } from "./proof-iYIDiv8I.js";
|
|
8
|
+
import { getNodeInfo, nodeInfoToJson } from "./types-8l28uC8o.js";
|
|
9
|
+
import { getAuthenticatedDocumentLoader, kvCache } from "./kv-cache-HDuc4ZaJ.js";
|
|
15
10
|
import { getLogger, withContext } from "@logtape/logtape";
|
|
11
|
+
import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
|
|
16
12
|
import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
|
|
17
|
-
import { encodeHex } from "byte-encodings/hex";
|
|
18
13
|
import { cloneDeep } from "es-toolkit";
|
|
19
14
|
import { Router } from "uri-template-router";
|
|
20
15
|
import { parseTemplate } from "url-template";
|
|
16
|
+
import { encodeHex } from "byte-encodings/hex";
|
|
21
17
|
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";
|
|
18
|
+
import { getDocumentLoader } from "@fedify/vocab-runtime";
|
|
19
|
+
import { lookupWebFinger } from "@fedify/webfinger";
|
|
22
20
|
import { domainToASCII } from "node:url";
|
|
23
21
|
|
|
24
22
|
//#region src/federation/inbox.ts
|
|
@@ -339,7 +337,7 @@ var FederationBuilderImpl = class {
|
|
|
339
337
|
this.collectionTypeIds = {};
|
|
340
338
|
}
|
|
341
339
|
async build(options) {
|
|
342
|
-
const { FederationImpl: FederationImpl$1 } = await import("./middleware-
|
|
340
|
+
const { FederationImpl: FederationImpl$1 } = await import("./middleware-D9oWuacw.js");
|
|
343
341
|
const f = new FederationImpl$1(options);
|
|
344
342
|
const trailingSlashInsensitiveValue = f.router.trailingSlashInsensitive;
|
|
345
343
|
f.router = this.router.clone();
|
|
@@ -792,11 +790,11 @@ var FederationBuilderImpl = class {
|
|
|
792
790
|
};
|
|
793
791
|
return setters;
|
|
794
792
|
}
|
|
795
|
-
setCollectionDispatcher(name,
|
|
796
|
-
return this.#setCustomCollectionDispatcher(name, "collection",
|
|
793
|
+
setCollectionDispatcher(name, itemType, path, dispatcher) {
|
|
794
|
+
return this.#setCustomCollectionDispatcher(name, "collection", itemType, path, dispatcher);
|
|
797
795
|
}
|
|
798
|
-
setOrderedCollectionDispatcher(name,
|
|
799
|
-
return this.#setCustomCollectionDispatcher(name, "orderedCollection",
|
|
796
|
+
setOrderedCollectionDispatcher(name, itemType, path, dispatcher) {
|
|
797
|
+
return this.#setCustomCollectionDispatcher(name, "orderedCollection", itemType, path, dispatcher);
|
|
800
798
|
}
|
|
801
799
|
#setCustomCollectionDispatcher(name, collectionType, itemType, path, dispatcher) {
|
|
802
800
|
const strName = String(name);
|
|
@@ -1491,6 +1489,13 @@ async function handleInboxInternal(request, parameters, span) {
|
|
|
1491
1489
|
}
|
|
1492
1490
|
if (activity.id != null) span.setAttribute("activitypub.activity.id", activity.id.href);
|
|
1493
1491
|
span.setAttribute("activitypub.activity.type", getTypeId(activity).href);
|
|
1492
|
+
span.addEvent("activitypub.activity.received", {
|
|
1493
|
+
"activitypub.activity.json": JSON.stringify(json),
|
|
1494
|
+
"activitypub.activity.verified": activity != null,
|
|
1495
|
+
"ld_signatures.verified": ldSigVerified,
|
|
1496
|
+
"http_signatures.verified": httpSigKey != null,
|
|
1497
|
+
"http_signatures.key_id": httpSigKey?.id?.href ?? ""
|
|
1498
|
+
});
|
|
1494
1499
|
if (httpSigKey != null && !await doesActorOwnKey(activity, httpSigKey, ctx)) {
|
|
1495
1500
|
logger$1.error("The signer ({keyId}) and the actor ({actorId}) do not match.", {
|
|
1496
1501
|
activity: json,
|
|
@@ -1550,7 +1555,7 @@ async function handleInboxInternal(request, parameters, span) {
|
|
|
1550
1555
|
/**
|
|
1551
1556
|
* Handles a custom collection request.
|
|
1552
1557
|
* @template TItem The type of items in the collection.
|
|
1553
|
-
* @template
|
|
1558
|
+
* @template TParam The parameter names of the requested URL.
|
|
1554
1559
|
* @template TContext The type of the context, extending {@link RequestContext}.
|
|
1555
1560
|
* @template TContextData The context data to pass to the `TContext`.
|
|
1556
1561
|
* @param request The HTTP request.
|
|
@@ -1568,7 +1573,7 @@ async function _handleCustomCollection(request, { name, values, context: context
|
|
|
1568
1573
|
/**
|
|
1569
1574
|
* Handles an ordered collection request.
|
|
1570
1575
|
* @template TItem The type of items in the collection.
|
|
1571
|
-
* @template
|
|
1576
|
+
* @template TParam The parameter names of the requested URL.
|
|
1572
1577
|
* @template TContext The type of the context, extending {@link RequestContext}.
|
|
1573
1578
|
* @template TContextData The context data to pass to the `TContext`.
|
|
1574
1579
|
* @param request The HTTP request.
|
|
@@ -1588,7 +1593,7 @@ async function _handleOrderedCollection(request, { name, values, context: contex
|
|
|
1588
1593
|
* The main flow is on `getCollection`, `dispatch`.
|
|
1589
1594
|
*
|
|
1590
1595
|
* @template TItem The type of items in the collection.
|
|
1591
|
-
* @template
|
|
1596
|
+
* @template TParam The parameter names of the requested URL.
|
|
1592
1597
|
* @template TContext The type of the context. {@link Context} or {@link RequestContext}.
|
|
1593
1598
|
* @template TContextData The context data to pass to the `TContext`.
|
|
1594
1599
|
* @template TCollection The type of the collection, extending {@link Collection}.
|
|
@@ -1622,14 +1627,14 @@ var CustomCollectionHandler = class {
|
|
|
1622
1627
|
#collection = null;
|
|
1623
1628
|
/**
|
|
1624
1629
|
* Creates a new CustomCollection instance.
|
|
1625
|
-
* @param
|
|
1626
|
-
* @param
|
|
1627
|
-
* @param
|
|
1628
|
-
* @param
|
|
1629
|
-
* @param
|
|
1630
|
-
* @param
|
|
1631
|
-
* @param
|
|
1632
|
-
* @param
|
|
1630
|
+
* @param name The name of the collection.
|
|
1631
|
+
* @param values The parameter values for the collection.
|
|
1632
|
+
* @param context The request context.
|
|
1633
|
+
* @param callbacks The collection callbacks.
|
|
1634
|
+
* @param tracerProvider The tracer provider for telemetry.
|
|
1635
|
+
* @param Collection The Collection constructor.
|
|
1636
|
+
* @param CollectionPage The CollectionPage constructor.
|
|
1637
|
+
* @param filterPredicate Optional filter predicate for items.
|
|
1633
1638
|
*/
|
|
1634
1639
|
constructor(name, values, context$1, callbacks, tracerProvider = trace.getTracerProvider(), Collection$1, CollectionPage$1, filterPredicate) {
|
|
1635
1640
|
this.name = name;
|
|
@@ -1754,7 +1759,7 @@ var CustomCollectionHandler = class {
|
|
|
1754
1759
|
/**
|
|
1755
1760
|
* Creates a function to wrap the dispatcher so tracing can be applied.
|
|
1756
1761
|
* @param params Parameters including cursor and total items.
|
|
1757
|
-
* @returns
|
|
1762
|
+
* @returns A function that handles the span operation.
|
|
1758
1763
|
*/
|
|
1759
1764
|
spanPages = ({ totalItems = null, cursor = null }) => async (span) => {
|
|
1760
1765
|
try {
|
|
@@ -1775,23 +1780,23 @@ var CustomCollectionHandler = class {
|
|
|
1775
1780
|
};
|
|
1776
1781
|
/**
|
|
1777
1782
|
* Dispatches the collection request to get items.
|
|
1778
|
-
* @param
|
|
1779
|
-
* @returns
|
|
1783
|
+
* @param cursor The cursor for pagination, or null for the first page.
|
|
1784
|
+
* @returns A promise that resolves to the page items.
|
|
1780
1785
|
*/
|
|
1781
1786
|
async dispatch(cursor = null) {
|
|
1782
1787
|
return await this.#dispatcher(this.context, this.values, cursor) ?? new ItemsNotFoundError().throw();
|
|
1783
1788
|
}
|
|
1784
1789
|
/**
|
|
1785
1790
|
* Filters the items in the collection.
|
|
1786
|
-
* @param
|
|
1787
|
-
* @returns
|
|
1791
|
+
* @param items The items to filter.
|
|
1792
|
+
* @returns The filtered items.
|
|
1788
1793
|
*/
|
|
1789
1794
|
filterItems(items) {
|
|
1790
1795
|
return filterCollectionItems(items, this.name, this.filterPredicate);
|
|
1791
1796
|
}
|
|
1792
1797
|
/**
|
|
1793
1798
|
* Appends a cursor to the URL if it exists.
|
|
1794
|
-
* @param
|
|
1799
|
+
* @param cursor The cursor to append, or null/undefined.
|
|
1795
1800
|
* @returns The URL with cursor appended, or null if cursor is null/undefined.
|
|
1796
1801
|
*/
|
|
1797
1802
|
appendToUrl(cursor) {
|
|
@@ -1799,8 +1804,7 @@ var CustomCollectionHandler = class {
|
|
|
1799
1804
|
}
|
|
1800
1805
|
/**
|
|
1801
1806
|
* Gets the stored collection or collection page.
|
|
1802
|
-
* @returns
|
|
1803
|
-
the collection or collection page.
|
|
1807
|
+
* @returns A promise that resolves to the collection or collection page.
|
|
1804
1808
|
*/
|
|
1805
1809
|
get collection() {
|
|
1806
1810
|
if (this.#collection === null) this.#collection = this.getCollection();
|
|
@@ -1808,8 +1812,8 @@ var CustomCollectionHandler = class {
|
|
|
1808
1812
|
}
|
|
1809
1813
|
/**
|
|
1810
1814
|
* Gets the total number of items in the collection.
|
|
1811
|
-
* @returns
|
|
1812
|
-
|
|
1815
|
+
* @returns A promise that resolves to the total items count,
|
|
1816
|
+
* or null if not available.
|
|
1813
1817
|
*/
|
|
1814
1818
|
get totalItems() {
|
|
1815
1819
|
if (this.#totalItems === void 0) this.totalItems = this.callbacks.counter?.(this.context, this.values);
|
|
@@ -1825,8 +1829,8 @@ var CustomCollectionHandler = class {
|
|
|
1825
1829
|
}
|
|
1826
1830
|
/**
|
|
1827
1831
|
* Gets the first cursor for pagination.
|
|
1828
|
-
* @returns
|
|
1829
|
-
or null if not available.
|
|
1832
|
+
* @returns A promise that resolves to the first cursor,
|
|
1833
|
+
* or null if not available.
|
|
1830
1834
|
*/
|
|
1831
1835
|
get firstCursor() {
|
|
1832
1836
|
const cursor = this.callbacks.firstCursor?.(this.context, this.values);
|
|
@@ -2032,139 +2036,6 @@ function handleNodeInfoJrd(_request, context$1) {
|
|
|
2032
2036
|
return Promise.resolve(response);
|
|
2033
2037
|
}
|
|
2034
2038
|
|
|
2035
|
-
//#endregion
|
|
2036
|
-
//#region src/webfinger/handler.ts
|
|
2037
|
-
const logger = getLogger([
|
|
2038
|
-
"fedify",
|
|
2039
|
-
"webfinger",
|
|
2040
|
-
"server"
|
|
2041
|
-
]);
|
|
2042
|
-
/**
|
|
2043
|
-
* Handles a WebFinger request. You would not typically call this function
|
|
2044
|
-
* directly, but instead use {@link Federation.fetch} method.
|
|
2045
|
-
* @param request The WebFinger request to handle.
|
|
2046
|
-
* @param parameters The parameters for handling the request.
|
|
2047
|
-
* @returns The response to the request.
|
|
2048
|
-
*/
|
|
2049
|
-
async function handleWebFinger(request, options) {
|
|
2050
|
-
if (options.tracer == null) return await handleWebFingerInternal(request, options);
|
|
2051
|
-
return await options.tracer.startActiveSpan("webfinger.handle", { kind: SpanKind.SERVER }, async (span) => {
|
|
2052
|
-
try {
|
|
2053
|
-
const response = await handleWebFingerInternal(request, options);
|
|
2054
|
-
span.setStatus({ code: response.ok ? SpanStatusCode.UNSET : SpanStatusCode.ERROR });
|
|
2055
|
-
return response;
|
|
2056
|
-
} catch (error) {
|
|
2057
|
-
span.setStatus({
|
|
2058
|
-
code: SpanStatusCode.ERROR,
|
|
2059
|
-
message: String(error)
|
|
2060
|
-
});
|
|
2061
|
-
throw error;
|
|
2062
|
-
} finally {
|
|
2063
|
-
span.end();
|
|
2064
|
-
}
|
|
2065
|
-
});
|
|
2066
|
-
}
|
|
2067
|
-
async function handleWebFingerInternal(request, { context: context$1, host, actorDispatcher, actorHandleMapper, actorAliasMapper, onNotFound, span, webFingerLinksDispatcher }) {
|
|
2068
|
-
if (actorDispatcher == null) {
|
|
2069
|
-
logger.error("Actor dispatcher is not set.");
|
|
2070
|
-
return await onNotFound(request);
|
|
2071
|
-
}
|
|
2072
|
-
const resource = context$1.url.searchParams.get("resource");
|
|
2073
|
-
if (resource == null) return new Response("Missing resource parameter.", { status: 400 });
|
|
2074
|
-
span?.setAttribute("webfinger.resource", resource);
|
|
2075
|
-
let resourceUrl;
|
|
2076
|
-
try {
|
|
2077
|
-
resourceUrl = new URL(resource);
|
|
2078
|
-
} catch (e) {
|
|
2079
|
-
if (e instanceof TypeError) return new Response("Invalid resource URL.", { status: 400 });
|
|
2080
|
-
throw e;
|
|
2081
|
-
}
|
|
2082
|
-
span?.setAttribute("webfinger.resource.scheme", resourceUrl.protocol.replace(/:$/, ""));
|
|
2083
|
-
async function mapUsernameToIdentifier(username) {
|
|
2084
|
-
if (actorHandleMapper == null) {
|
|
2085
|
-
logger.error("No actor handle mapper is set; use the WebFinger username {username} as the actor's internal identifier.", { username });
|
|
2086
|
-
return username;
|
|
2087
|
-
}
|
|
2088
|
-
const identifier$1 = await actorHandleMapper(context$1, username);
|
|
2089
|
-
if (identifier$1 == null) {
|
|
2090
|
-
logger.error("Actor {username} not found.", { username });
|
|
2091
|
-
return null;
|
|
2092
|
-
}
|
|
2093
|
-
return identifier$1;
|
|
2094
|
-
}
|
|
2095
|
-
let identifier = null;
|
|
2096
|
-
const uriParsed = context$1.parseUri(resourceUrl);
|
|
2097
|
-
if (uriParsed?.type != "actor") {
|
|
2098
|
-
const match = /^acct:([^@]+)@([^@]+)$/.exec(resource);
|
|
2099
|
-
if (match == null) {
|
|
2100
|
-
const result = await actorAliasMapper?.(context$1, resourceUrl);
|
|
2101
|
-
if (result == null) return await onNotFound(request);
|
|
2102
|
-
if ("identifier" in result) identifier = result.identifier;
|
|
2103
|
-
else identifier = await mapUsernameToIdentifier(result.username);
|
|
2104
|
-
} else {
|
|
2105
|
-
const portMatch = /:\d+$/.exec(match[2]);
|
|
2106
|
-
const normalizedHost = portMatch == null ? domainToASCII(match[2].toLowerCase()) : domainToASCII(match[2].substring(0, portMatch.index).toLowerCase()) + portMatch[0];
|
|
2107
|
-
if (normalizedHost != context$1.url.host && normalizedHost != host) return await onNotFound(request);
|
|
2108
|
-
else {
|
|
2109
|
-
identifier = await mapUsernameToIdentifier(match[1]);
|
|
2110
|
-
resourceUrl = new URL(`acct:${match[1]}@${normalizedHost}`);
|
|
2111
|
-
}
|
|
2112
|
-
}
|
|
2113
|
-
} else identifier = uriParsed.identifier;
|
|
2114
|
-
if (identifier == null) return await onNotFound(request);
|
|
2115
|
-
const actor = await actorDispatcher(context$1, identifier);
|
|
2116
|
-
if (actor == null) {
|
|
2117
|
-
logger.error("Actor {identifier} not found.", { identifier });
|
|
2118
|
-
return await onNotFound(request);
|
|
2119
|
-
}
|
|
2120
|
-
const links = [{
|
|
2121
|
-
rel: "self",
|
|
2122
|
-
href: context$1.getActorUri(identifier).href,
|
|
2123
|
-
type: "application/activity+json"
|
|
2124
|
-
}];
|
|
2125
|
-
for (const url of actor.urls) if (url instanceof Link && url.href != null) links.push({
|
|
2126
|
-
rel: url.rel ?? "http://webfinger.net/rel/profile-page",
|
|
2127
|
-
href: url.href.href,
|
|
2128
|
-
type: url.mediaType == null ? void 0 : url.mediaType
|
|
2129
|
-
});
|
|
2130
|
-
else if (url instanceof URL) links.push({
|
|
2131
|
-
rel: "http://webfinger.net/rel/profile-page",
|
|
2132
|
-
href: url.href
|
|
2133
|
-
});
|
|
2134
|
-
for await (const image of actor.getIcons()) {
|
|
2135
|
-
if (image.url?.href == null) continue;
|
|
2136
|
-
const link = {
|
|
2137
|
-
rel: "http://webfinger.net/rel/avatar",
|
|
2138
|
-
href: image.url.href.toString()
|
|
2139
|
-
};
|
|
2140
|
-
if (image.mediaType != null) link.type = image.mediaType;
|
|
2141
|
-
links.push(link);
|
|
2142
|
-
}
|
|
2143
|
-
if (webFingerLinksDispatcher != null) {
|
|
2144
|
-
const customLinks = await webFingerLinksDispatcher(context$1, resourceUrl);
|
|
2145
|
-
if (customLinks != null) for (const link of customLinks) links.push(link);
|
|
2146
|
-
}
|
|
2147
|
-
const aliases = [];
|
|
2148
|
-
if (resourceUrl.protocol != "acct:" && actor.preferredUsername != null) {
|
|
2149
|
-
aliases.push(`acct:${actor.preferredUsername}@${host ?? context$1.url.host}`);
|
|
2150
|
-
if (host != null && host !== context$1.url.host) aliases.push(`acct:${actor.preferredUsername}@${context$1.url.host}`);
|
|
2151
|
-
}
|
|
2152
|
-
if (resourceUrl.href !== context$1.getActorUri(identifier).href) aliases.push(context$1.getActorUri(identifier).href);
|
|
2153
|
-
if (resourceUrl.protocol === "acct:" && host != null && host !== context$1.url.host && !resourceUrl.href.endsWith(`@${host}`)) {
|
|
2154
|
-
const username = resourceUrl.href.replace(/^acct:/, "").replace(/@.*$/, "");
|
|
2155
|
-
aliases.push(`acct:${username}@${host}`);
|
|
2156
|
-
}
|
|
2157
|
-
const jrd = {
|
|
2158
|
-
subject: resourceUrl.href,
|
|
2159
|
-
aliases,
|
|
2160
|
-
links
|
|
2161
|
-
};
|
|
2162
|
-
return new Response(JSON.stringify(jrd), { headers: {
|
|
2163
|
-
"Content-Type": "application/jrd+json",
|
|
2164
|
-
"Access-Control-Allow-Origin": "*"
|
|
2165
|
-
} });
|
|
2166
|
-
}
|
|
2167
|
-
|
|
2168
2039
|
//#endregion
|
|
2169
2040
|
//#region src/federation/retry.ts
|
|
2170
2041
|
/**
|
|
@@ -2191,8 +2062,8 @@ function createExponentialBackoffPolicy(options = {}) {
|
|
|
2191
2062
|
milliseconds *= 1 + Math.random();
|
|
2192
2063
|
milliseconds = Math.round(milliseconds);
|
|
2193
2064
|
}
|
|
2194
|
-
const delay
|
|
2195
|
-
return Temporal.Duration.compare(delay
|
|
2065
|
+
const delay = Temporal.Duration.from({ milliseconds });
|
|
2066
|
+
return Temporal.Duration.compare(delay, maxDelay) > 0 ? maxDelay : delay;
|
|
2196
2067
|
};
|
|
2197
2068
|
}
|
|
2198
2069
|
|
|
@@ -2244,7 +2115,7 @@ function sendActivity(options) {
|
|
|
2244
2115
|
await sendActivityInternal({
|
|
2245
2116
|
...options,
|
|
2246
2117
|
tracerProvider
|
|
2247
|
-
});
|
|
2118
|
+
}, span);
|
|
2248
2119
|
} catch (e) {
|
|
2249
2120
|
span.setStatus({
|
|
2250
2121
|
code: SpanStatusCode.ERROR,
|
|
@@ -2256,7 +2127,7 @@ function sendActivity(options) {
|
|
|
2256
2127
|
}
|
|
2257
2128
|
});
|
|
2258
2129
|
}
|
|
2259
|
-
async function sendActivityInternal({ activity, activityId, keys, inbox, headers, specDeterminer, tracerProvider }) {
|
|
2130
|
+
async function sendActivityInternal({ activity, activityId, keys, inbox, headers, specDeterminer, tracerProvider }, span) {
|
|
2260
2131
|
const logger$1 = getLogger([
|
|
2261
2132
|
"fedify",
|
|
2262
2133
|
"federation",
|
|
@@ -2311,6 +2182,143 @@ async function sendActivityInternal({ activity, activityId, keys, inbox, headers
|
|
|
2311
2182
|
});
|
|
2312
2183
|
throw new Error(`Failed to send activity ${activityId} to ${inbox.href} (${response.status} ${response.statusText}):\n${error}`);
|
|
2313
2184
|
}
|
|
2185
|
+
span.addEvent("activitypub.activity.sent", {
|
|
2186
|
+
"activitypub.activity.json": JSON.stringify(activity),
|
|
2187
|
+
"activitypub.inbox.url": inbox.href,
|
|
2188
|
+
"activitypub.activity.id": activityId ?? ""
|
|
2189
|
+
});
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2192
|
+
//#endregion
|
|
2193
|
+
//#region src/federation/webfinger.ts
|
|
2194
|
+
const logger = getLogger([
|
|
2195
|
+
"fedify",
|
|
2196
|
+
"webfinger",
|
|
2197
|
+
"server"
|
|
2198
|
+
]);
|
|
2199
|
+
/**
|
|
2200
|
+
* Handles a WebFinger request. You would not typically call this function
|
|
2201
|
+
* directly, but instead use {@link Federation.fetch} method.
|
|
2202
|
+
* @param request The WebFinger request to handle.
|
|
2203
|
+
* @param parameters The parameters for handling the request.
|
|
2204
|
+
* @returns The response to the request.
|
|
2205
|
+
*/
|
|
2206
|
+
async function handleWebFinger(request, options) {
|
|
2207
|
+
if (options.tracer == null) return await handleWebFingerInternal(request, options);
|
|
2208
|
+
return await options.tracer.startActiveSpan("webfinger.handle", { kind: SpanKind.SERVER }, async (span) => {
|
|
2209
|
+
try {
|
|
2210
|
+
const response = await handleWebFingerInternal(request, options);
|
|
2211
|
+
span.setStatus({ code: response.ok ? SpanStatusCode.UNSET : SpanStatusCode.ERROR });
|
|
2212
|
+
return response;
|
|
2213
|
+
} catch (error) {
|
|
2214
|
+
span.setStatus({
|
|
2215
|
+
code: SpanStatusCode.ERROR,
|
|
2216
|
+
message: String(error)
|
|
2217
|
+
});
|
|
2218
|
+
throw error;
|
|
2219
|
+
} finally {
|
|
2220
|
+
span.end();
|
|
2221
|
+
}
|
|
2222
|
+
});
|
|
2223
|
+
}
|
|
2224
|
+
async function handleWebFingerInternal(request, { context: context$1, host, actorDispatcher, actorHandleMapper, actorAliasMapper, onNotFound, span, webFingerLinksDispatcher }) {
|
|
2225
|
+
if (actorDispatcher == null) {
|
|
2226
|
+
logger.error("Actor dispatcher is not set.");
|
|
2227
|
+
return await onNotFound(request);
|
|
2228
|
+
}
|
|
2229
|
+
const resource = context$1.url.searchParams.get("resource");
|
|
2230
|
+
if (resource == null) return new Response("Missing resource parameter.", { status: 400 });
|
|
2231
|
+
span?.setAttribute("webfinger.resource", resource);
|
|
2232
|
+
let resourceUrl;
|
|
2233
|
+
try {
|
|
2234
|
+
resourceUrl = new URL(resource);
|
|
2235
|
+
} catch (e) {
|
|
2236
|
+
if (e instanceof TypeError) return new Response("Invalid resource URL.", { status: 400 });
|
|
2237
|
+
throw e;
|
|
2238
|
+
}
|
|
2239
|
+
span?.setAttribute("webfinger.resource.scheme", resourceUrl.protocol.replace(/:$/, ""));
|
|
2240
|
+
async function mapUsernameToIdentifier(username) {
|
|
2241
|
+
if (actorHandleMapper == null) {
|
|
2242
|
+
logger.error("No actor handle mapper is set; use the WebFinger username {username} as the actor's internal identifier.", { username });
|
|
2243
|
+
return username;
|
|
2244
|
+
}
|
|
2245
|
+
const identifier$1 = await actorHandleMapper(context$1, username);
|
|
2246
|
+
if (identifier$1 == null) {
|
|
2247
|
+
logger.error("Actor {username} not found.", { username });
|
|
2248
|
+
return null;
|
|
2249
|
+
}
|
|
2250
|
+
return identifier$1;
|
|
2251
|
+
}
|
|
2252
|
+
let identifier = null;
|
|
2253
|
+
const uriParsed = context$1.parseUri(resourceUrl);
|
|
2254
|
+
if (uriParsed?.type != "actor") {
|
|
2255
|
+
const match = /^acct:([^@]+)@([^@]+)$/.exec(resource);
|
|
2256
|
+
if (match == null) {
|
|
2257
|
+
const result = await actorAliasMapper?.(context$1, resourceUrl);
|
|
2258
|
+
if (result == null) return await onNotFound(request);
|
|
2259
|
+
if ("identifier" in result) identifier = result.identifier;
|
|
2260
|
+
else identifier = await mapUsernameToIdentifier(result.username);
|
|
2261
|
+
} else {
|
|
2262
|
+
const portMatch = /:\d+$/.exec(match[2]);
|
|
2263
|
+
const normalizedHost = portMatch == null ? domainToASCII(match[2].toLowerCase()) : domainToASCII(match[2].substring(0, portMatch.index).toLowerCase()) + portMatch[0];
|
|
2264
|
+
if (normalizedHost != context$1.url.host && normalizedHost != host) return await onNotFound(request);
|
|
2265
|
+
else {
|
|
2266
|
+
identifier = await mapUsernameToIdentifier(match[1]);
|
|
2267
|
+
resourceUrl = new URL(`acct:${match[1]}@${normalizedHost}`);
|
|
2268
|
+
}
|
|
2269
|
+
}
|
|
2270
|
+
} else identifier = uriParsed.identifier;
|
|
2271
|
+
if (identifier == null) return await onNotFound(request);
|
|
2272
|
+
const actor = await actorDispatcher(context$1, identifier);
|
|
2273
|
+
if (actor == null) {
|
|
2274
|
+
logger.error("Actor {identifier} not found.", { identifier });
|
|
2275
|
+
return await onNotFound(request);
|
|
2276
|
+
}
|
|
2277
|
+
const links = [{
|
|
2278
|
+
rel: "self",
|
|
2279
|
+
href: context$1.getActorUri(identifier).href,
|
|
2280
|
+
type: "application/activity+json"
|
|
2281
|
+
}];
|
|
2282
|
+
for (const url of actor.urls) if (url instanceof Link && url.href != null) links.push({
|
|
2283
|
+
rel: url.rel ?? "http://webfinger.net/rel/profile-page",
|
|
2284
|
+
href: url.href.href,
|
|
2285
|
+
type: url.mediaType == null ? void 0 : url.mediaType
|
|
2286
|
+
});
|
|
2287
|
+
else if (url instanceof URL) links.push({
|
|
2288
|
+
rel: "http://webfinger.net/rel/profile-page",
|
|
2289
|
+
href: url.href
|
|
2290
|
+
});
|
|
2291
|
+
for await (const image of actor.getIcons()) {
|
|
2292
|
+
if (image.url?.href == null) continue;
|
|
2293
|
+
links.push({
|
|
2294
|
+
rel: "http://webfinger.net/rel/avatar",
|
|
2295
|
+
href: image.url.href.toString(),
|
|
2296
|
+
...image.mediaType != null && { type: image.mediaType }
|
|
2297
|
+
});
|
|
2298
|
+
}
|
|
2299
|
+
if (webFingerLinksDispatcher != null) {
|
|
2300
|
+
const customLinks = await webFingerLinksDispatcher(context$1, resourceUrl);
|
|
2301
|
+
if (customLinks != null) for (const link of customLinks) links.push(link);
|
|
2302
|
+
}
|
|
2303
|
+
const aliases = [];
|
|
2304
|
+
if (resourceUrl.protocol != "acct:" && actor.preferredUsername != null) {
|
|
2305
|
+
aliases.push(`acct:${actor.preferredUsername}@${host ?? context$1.url.host}`);
|
|
2306
|
+
if (host != null && host !== context$1.url.host) aliases.push(`acct:${actor.preferredUsername}@${context$1.url.host}`);
|
|
2307
|
+
}
|
|
2308
|
+
if (resourceUrl.href !== context$1.getActorUri(identifier).href) aliases.push(context$1.getActorUri(identifier).href);
|
|
2309
|
+
if (resourceUrl.protocol === "acct:" && host != null && host !== context$1.url.host && !resourceUrl.href.endsWith(`@${host}`)) {
|
|
2310
|
+
const username = resourceUrl.href.replace(/^acct:/, "").replace(/@.*$/, "");
|
|
2311
|
+
aliases.push(`acct:${username}@${host}`);
|
|
2312
|
+
}
|
|
2313
|
+
const jrd = {
|
|
2314
|
+
subject: resourceUrl.href,
|
|
2315
|
+
aliases,
|
|
2316
|
+
links
|
|
2317
|
+
};
|
|
2318
|
+
return new Response(JSON.stringify(jrd), { headers: {
|
|
2319
|
+
"Content-Type": "application/jrd+json",
|
|
2320
|
+
"Access-Control-Allow-Origin": "*"
|
|
2321
|
+
} });
|
|
2314
2322
|
}
|
|
2315
2323
|
|
|
2316
2324
|
//#endregion
|
|
@@ -2350,7 +2358,6 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2350
2358
|
firstKnock;
|
|
2351
2359
|
constructor(options) {
|
|
2352
2360
|
super();
|
|
2353
|
-
const logger$1 = getLogger(["fedify", "federation"]);
|
|
2354
2361
|
this.kv = options.kv;
|
|
2355
2362
|
this.kvPrefixes = {
|
|
2356
2363
|
activityIdempotence: ["_fedify", "activityIdempotence"],
|
|
@@ -2398,8 +2405,9 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2398
2405
|
this.router.trailingSlashInsensitive = options.trailingSlashInsensitive ?? false;
|
|
2399
2406
|
this._initializeRouter();
|
|
2400
2407
|
if (options.allowPrivateAddress || options.userAgent != null) {
|
|
2401
|
-
if (options.
|
|
2402
|
-
|
|
2408
|
+
if (options.documentLoaderFactory != null) throw new TypeError("Cannot set documentLoaderFactory with allowPrivateAddress or userAgent options.");
|
|
2409
|
+
if (options.contextLoaderFactory != null) throw new TypeError("Cannot set contextLoaderFactory with allowPrivateAddress or userAgent options.");
|
|
2410
|
+
if (options.authenticatedDocumentLoaderFactory != null) throw new TypeError("Cannot set authenticatedDocumentLoaderFactory with allowPrivateAddress or userAgent options.");
|
|
2403
2411
|
}
|
|
2404
2412
|
const { allowPrivateAddress, userAgent } = options;
|
|
2405
2413
|
this.allowPrivateAddress = allowPrivateAddress ?? false;
|
|
@@ -2413,11 +2421,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2413
2421
|
prefix: this.kvPrefixes.remoteDocument
|
|
2414
2422
|
});
|
|
2415
2423
|
});
|
|
2416
|
-
|
|
2417
|
-
if (options.contextLoaderFactory != null) throw new TypeError("Cannot set both contextLoader and contextLoaderFactory options at a time; use contextLoaderFactory only.");
|
|
2418
|
-
this.contextLoaderFactory = () => options.contextLoader;
|
|
2419
|
-
logger$1.warn("The contextLoader option is deprecated; use contextLoaderFactory option instead.");
|
|
2420
|
-
} else this.contextLoaderFactory = options.contextLoaderFactory ?? this.documentLoaderFactory;
|
|
2424
|
+
this.contextLoaderFactory = options.contextLoaderFactory ?? this.documentLoaderFactory;
|
|
2421
2425
|
this.authenticatedDocumentLoaderFactory = options.authenticatedDocumentLoaderFactory ?? ((identity) => getAuthenticatedDocumentLoader(identity, {
|
|
2422
2426
|
allowPrivateAddress,
|
|
2423
2427
|
userAgent,
|
|
@@ -2621,11 +2625,11 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2621
2625
|
});
|
|
2622
2626
|
throw error;
|
|
2623
2627
|
}
|
|
2624
|
-
const delay
|
|
2628
|
+
const delay = this.outboxRetryPolicy({
|
|
2625
2629
|
elapsedTime: Temporal.Instant.from(message.started).until(Temporal.Now.instant()),
|
|
2626
2630
|
attempts: message.attempt
|
|
2627
2631
|
});
|
|
2628
|
-
if (delay
|
|
2632
|
+
if (delay != null) {
|
|
2629
2633
|
logger$1.error("Failed to send activity {activityId} to {inbox} (attempt #{attempt}); retry...:\n{error}", {
|
|
2630
2634
|
...logData,
|
|
2631
2635
|
error
|
|
@@ -2633,7 +2637,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2633
2637
|
await this.outboxQueue?.enqueue({
|
|
2634
2638
|
...message,
|
|
2635
2639
|
attempt: message.attempt + 1
|
|
2636
|
-
}, { delay: Temporal.Duration.compare(delay
|
|
2640
|
+
}, { delay: Temporal.Duration.compare(delay, { seconds: 0 }) < 0 ? Temporal.Duration.from({ seconds: 0 }) : delay });
|
|
2637
2641
|
} else logger$1.error("Failed to send activity {activityId} to {inbox} after {attempt} attempts; giving up:\n{error}", {
|
|
2638
2642
|
...logData,
|
|
2639
2643
|
error
|
|
@@ -2720,11 +2724,11 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2720
2724
|
span$1.end();
|
|
2721
2725
|
throw error;
|
|
2722
2726
|
}
|
|
2723
|
-
const delay
|
|
2727
|
+
const delay = this.inboxRetryPolicy({
|
|
2724
2728
|
elapsedTime: Temporal.Instant.from(message.started).until(Temporal.Now.instant()),
|
|
2725
2729
|
attempts: message.attempt
|
|
2726
2730
|
});
|
|
2727
|
-
if (delay
|
|
2731
|
+
if (delay != null) {
|
|
2728
2732
|
logger$1.error("Failed to process the incoming activity {activityId} (attempt #{attempt}); retry...:\n{error}", {
|
|
2729
2733
|
error,
|
|
2730
2734
|
attempt: message.attempt,
|
|
@@ -2735,7 +2739,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2735
2739
|
await this.inboxQueue?.enqueue({
|
|
2736
2740
|
...message,
|
|
2737
2741
|
attempt: message.attempt + 1
|
|
2738
|
-
}, { delay: Temporal.Duration.compare(delay
|
|
2742
|
+
}, { delay: Temporal.Duration.compare(delay, { seconds: 0 }) < 0 ? Temporal.Duration.from({ seconds: 0 }) : delay });
|
|
2739
2743
|
} else logger$1.error("Failed to process the incoming activity {activityId} after {trial} attempts; giving up:\n{error}", {
|
|
2740
2744
|
error,
|
|
2741
2745
|
activityId: activity.id?.href,
|
|
@@ -4150,4 +4154,4 @@ function getRequestId(request) {
|
|
|
4150
4154
|
}
|
|
4151
4155
|
|
|
4152
4156
|
//#endregion
|
|
4153
|
-
export { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer, Router$1 as Router, RouterError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable };
|
|
4157
|
+
export { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer, Router$1 as Router, RouterError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable };
|