@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
|
@@ -3,24 +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-DhWON59o.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-DKkHKzvg.js";
|
|
11
|
+
import { verifyRequest } from "./http-CwsBL5_A.js";
|
|
12
|
+
import { detachSignature, hasSignature, signJsonLd, verifyJsonLd } from "./ld-CM6OO5ar.js";
|
|
13
|
+
import { doesActorOwnKey, getKeyOwner } from "./owner-BOEfZQv2.js";
|
|
14
|
+
import { signObject, verifyObject } from "./proof-iw6KtIyj.js";
|
|
15
|
+
import { getAuthenticatedDocumentLoader } from "./docloader-Cni79dmb.js";
|
|
16
|
+
import { kvCache } from "./kv-cache-BEeqyGER.js";
|
|
17
|
+
import { routeActivity } from "./inbox-CukSCwad.js";
|
|
18
|
+
import { FederationBuilderImpl } from "./builder-_MVsWtsS.js";
|
|
18
19
|
import { buildCollectionSynchronizationHeader } from "./collection-CcnIw1qY.js";
|
|
19
|
-
import { KvKeyCache } from "./keycache-
|
|
20
|
+
import { KvKeyCache } from "./keycache-DRxpZ5r9.js";
|
|
20
21
|
import { acceptsJsonLd } from "./negotiation-5NPJL6zp.js";
|
|
21
22
|
import { createExponentialBackoffPolicy } from "./retry-D4GJ670a.js";
|
|
22
|
-
import { extractInboxes, sendActivity } from "./send-
|
|
23
|
+
import { extractInboxes, sendActivity } from "./send-Bn8o0mjW.js";
|
|
23
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";
|
|
24
28
|
import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
|
|
25
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";
|
|
26
30
|
import { domainToASCII } from "node:url";
|
|
@@ -61,7 +65,7 @@ function autoIdAssigner(activity, context$1) {
|
|
|
61
65
|
* activity like this:
|
|
62
66
|
*
|
|
63
67
|
* ```typescript
|
|
64
|
-
* import { Follow, Person } from "@fedify/
|
|
68
|
+
* import { Follow, Person } from "@fedify/vocab";
|
|
65
69
|
* const input = new Follow({
|
|
66
70
|
* id: new URL("http://example.com/activities/1"),
|
|
67
71
|
* actor: new Person({
|
|
@@ -80,7 +84,7 @@ function autoIdAssigner(activity, context$1) {
|
|
|
80
84
|
* The result of applying this transformer would be:
|
|
81
85
|
*
|
|
82
86
|
* ```typescript
|
|
83
|
-
* import { Follow, Person } from "@fedify/
|
|
87
|
+
* import { Follow, Person } from "@fedify/vocab";
|
|
84
88
|
* const output = new Follow({
|
|
85
89
|
* id: new URL("http://example.com/activities/1"),
|
|
86
90
|
* actor: new URL("http://example.com/actors/1"),
|
|
@@ -153,151 +157,6 @@ function handleNodeInfoJrd(_request, context$1) {
|
|
|
153
157
|
return Promise.resolve(response);
|
|
154
158
|
}
|
|
155
159
|
|
|
156
|
-
//#endregion
|
|
157
|
-
//#region src/vocab/constants.ts
|
|
158
|
-
/**
|
|
159
|
-
* The special public collection for [public addressing]. *Do not mutate this
|
|
160
|
-
* object.*
|
|
161
|
-
*
|
|
162
|
-
* [public addressing]: https://www.w3.org/TR/activitypub/#public-addressing
|
|
163
|
-
*
|
|
164
|
-
* @since 0.7.0
|
|
165
|
-
*/
|
|
166
|
-
const PUBLIC_COLLECTION = new URL("https://www.w3.org/ns/activitystreams#Public");
|
|
167
|
-
|
|
168
|
-
//#endregion
|
|
169
|
-
//#region src/webfinger/handler.ts
|
|
170
|
-
const logger = getLogger([
|
|
171
|
-
"fedify",
|
|
172
|
-
"webfinger",
|
|
173
|
-
"server"
|
|
174
|
-
]);
|
|
175
|
-
/**
|
|
176
|
-
* Handles a WebFinger request. You would not typically call this function
|
|
177
|
-
* directly, but instead use {@link Federation.fetch} method.
|
|
178
|
-
* @param request The WebFinger request to handle.
|
|
179
|
-
* @param parameters The parameters for handling the request.
|
|
180
|
-
* @returns The response to the request.
|
|
181
|
-
*/
|
|
182
|
-
async function handleWebFinger(request, options) {
|
|
183
|
-
if (options.tracer == null) return await handleWebFingerInternal(request, options);
|
|
184
|
-
return await options.tracer.startActiveSpan("webfinger.handle", { kind: SpanKind.SERVER }, async (span) => {
|
|
185
|
-
try {
|
|
186
|
-
const response = await handleWebFingerInternal(request, options);
|
|
187
|
-
span.setStatus({ code: response.ok ? SpanStatusCode.UNSET : SpanStatusCode.ERROR });
|
|
188
|
-
return response;
|
|
189
|
-
} catch (error) {
|
|
190
|
-
span.setStatus({
|
|
191
|
-
code: SpanStatusCode.ERROR,
|
|
192
|
-
message: String(error)
|
|
193
|
-
});
|
|
194
|
-
throw error;
|
|
195
|
-
} finally {
|
|
196
|
-
span.end();
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
async function handleWebFingerInternal(request, { context: context$1, host, actorDispatcher, actorHandleMapper, actorAliasMapper, onNotFound, span, webFingerLinksDispatcher }) {
|
|
201
|
-
if (actorDispatcher == null) {
|
|
202
|
-
logger.error("Actor dispatcher is not set.");
|
|
203
|
-
return await onNotFound(request);
|
|
204
|
-
}
|
|
205
|
-
const resource = context$1.url.searchParams.get("resource");
|
|
206
|
-
if (resource == null) return new Response("Missing resource parameter.", { status: 400 });
|
|
207
|
-
span?.setAttribute("webfinger.resource", resource);
|
|
208
|
-
let resourceUrl;
|
|
209
|
-
try {
|
|
210
|
-
resourceUrl = new URL(resource);
|
|
211
|
-
} catch (e) {
|
|
212
|
-
if (e instanceof TypeError) return new Response("Invalid resource URL.", { status: 400 });
|
|
213
|
-
throw e;
|
|
214
|
-
}
|
|
215
|
-
span?.setAttribute("webfinger.resource.scheme", resourceUrl.protocol.replace(/:$/, ""));
|
|
216
|
-
async function mapUsernameToIdentifier(username) {
|
|
217
|
-
if (actorHandleMapper == null) {
|
|
218
|
-
logger.error("No actor handle mapper is set; use the WebFinger username {username} as the actor's internal identifier.", { username });
|
|
219
|
-
return username;
|
|
220
|
-
}
|
|
221
|
-
const identifier$1 = await actorHandleMapper(context$1, username);
|
|
222
|
-
if (identifier$1 == null) {
|
|
223
|
-
logger.error("Actor {username} not found.", { username });
|
|
224
|
-
return null;
|
|
225
|
-
}
|
|
226
|
-
return identifier$1;
|
|
227
|
-
}
|
|
228
|
-
let identifier = null;
|
|
229
|
-
const uriParsed = context$1.parseUri(resourceUrl);
|
|
230
|
-
if (uriParsed?.type != "actor") {
|
|
231
|
-
const match = /^acct:([^@]+)@([^@]+)$/.exec(resource);
|
|
232
|
-
if (match == null) {
|
|
233
|
-
const result = await actorAliasMapper?.(context$1, resourceUrl);
|
|
234
|
-
if (result == null) return await onNotFound(request);
|
|
235
|
-
if ("identifier" in result) identifier = result.identifier;
|
|
236
|
-
else identifier = await mapUsernameToIdentifier(result.username);
|
|
237
|
-
} else {
|
|
238
|
-
const portMatch = /:\d+$/.exec(match[2]);
|
|
239
|
-
const normalizedHost = portMatch == null ? domainToASCII(match[2].toLowerCase()) : domainToASCII(match[2].substring(0, portMatch.index).toLowerCase()) + portMatch[0];
|
|
240
|
-
if (normalizedHost != context$1.url.host && normalizedHost != host) return await onNotFound(request);
|
|
241
|
-
else {
|
|
242
|
-
identifier = await mapUsernameToIdentifier(match[1]);
|
|
243
|
-
resourceUrl = new URL(`acct:${match[1]}@${normalizedHost}`);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
} else identifier = uriParsed.identifier;
|
|
247
|
-
if (identifier == null) return await onNotFound(request);
|
|
248
|
-
const actor = await actorDispatcher(context$1, identifier);
|
|
249
|
-
if (actor == null) {
|
|
250
|
-
logger.error("Actor {identifier} not found.", { identifier });
|
|
251
|
-
return await onNotFound(request);
|
|
252
|
-
}
|
|
253
|
-
const links = [{
|
|
254
|
-
rel: "self",
|
|
255
|
-
href: context$1.getActorUri(identifier).href,
|
|
256
|
-
type: "application/activity+json"
|
|
257
|
-
}];
|
|
258
|
-
for (const url of actor.urls) if (url instanceof Link && url.href != null) links.push({
|
|
259
|
-
rel: url.rel ?? "http://webfinger.net/rel/profile-page",
|
|
260
|
-
href: url.href.href,
|
|
261
|
-
type: url.mediaType == null ? void 0 : url.mediaType
|
|
262
|
-
});
|
|
263
|
-
else if (url instanceof URL) links.push({
|
|
264
|
-
rel: "http://webfinger.net/rel/profile-page",
|
|
265
|
-
href: url.href
|
|
266
|
-
});
|
|
267
|
-
for await (const image of actor.getIcons()) {
|
|
268
|
-
if (image.url?.href == null) continue;
|
|
269
|
-
const link = {
|
|
270
|
-
rel: "http://webfinger.net/rel/avatar",
|
|
271
|
-
href: image.url.href.toString()
|
|
272
|
-
};
|
|
273
|
-
if (image.mediaType != null) link.type = image.mediaType;
|
|
274
|
-
links.push(link);
|
|
275
|
-
}
|
|
276
|
-
if (webFingerLinksDispatcher != null) {
|
|
277
|
-
const customLinks = await webFingerLinksDispatcher(context$1, resourceUrl);
|
|
278
|
-
if (customLinks != null) for (const link of customLinks) links.push(link);
|
|
279
|
-
}
|
|
280
|
-
const aliases = [];
|
|
281
|
-
if (resourceUrl.protocol != "acct:" && actor.preferredUsername != null) {
|
|
282
|
-
aliases.push(`acct:${actor.preferredUsername}@${host ?? context$1.url.host}`);
|
|
283
|
-
if (host != null && host !== context$1.url.host) aliases.push(`acct:${actor.preferredUsername}@${context$1.url.host}`);
|
|
284
|
-
}
|
|
285
|
-
if (resourceUrl.href !== context$1.getActorUri(identifier).href) aliases.push(context$1.getActorUri(identifier).href);
|
|
286
|
-
if (resourceUrl.protocol === "acct:" && host != null && host !== context$1.url.host && !resourceUrl.href.endsWith(`@${host}`)) {
|
|
287
|
-
const username = resourceUrl.href.replace(/^acct:/, "").replace(/@.*$/, "");
|
|
288
|
-
aliases.push(`acct:${username}@${host}`);
|
|
289
|
-
}
|
|
290
|
-
const jrd = {
|
|
291
|
-
subject: resourceUrl.href,
|
|
292
|
-
aliases,
|
|
293
|
-
links
|
|
294
|
-
};
|
|
295
|
-
return new Response(JSON.stringify(jrd), { headers: {
|
|
296
|
-
"Content-Type": "application/jrd+json",
|
|
297
|
-
"Access-Control-Allow-Origin": "*"
|
|
298
|
-
} });
|
|
299
|
-
}
|
|
300
|
-
|
|
301
160
|
//#endregion
|
|
302
161
|
//#region src/federation/handler.ts
|
|
303
162
|
/**
|
|
@@ -779,6 +638,13 @@ async function handleInboxInternal(request, parameters, span) {
|
|
|
779
638
|
}
|
|
780
639
|
if (activity.id != null) span.setAttribute("activitypub.activity.id", activity.id.href);
|
|
781
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
|
+
});
|
|
782
648
|
if (httpSigKey != null && !await doesActorOwnKey(activity, httpSigKey, ctx)) {
|
|
783
649
|
logger$2.error("The signer ({keyId}) and the actor ({actorId}) do not match.", {
|
|
784
650
|
activity: json,
|
|
@@ -838,7 +704,7 @@ async function handleInboxInternal(request, parameters, span) {
|
|
|
838
704
|
/**
|
|
839
705
|
* Handles a custom collection request.
|
|
840
706
|
* @template TItem The type of items in the collection.
|
|
841
|
-
* @template
|
|
707
|
+
* @template TParam The parameter names of the requested URL.
|
|
842
708
|
* @template TContext The type of the context, extending {@link RequestContext}.
|
|
843
709
|
* @template TContextData The context data to pass to the `TContext`.
|
|
844
710
|
* @param request The HTTP request.
|
|
@@ -856,7 +722,7 @@ async function _handleCustomCollection(request, { name, values, context: context
|
|
|
856
722
|
/**
|
|
857
723
|
* Handles an ordered collection request.
|
|
858
724
|
* @template TItem The type of items in the collection.
|
|
859
|
-
* @template
|
|
725
|
+
* @template TParam The parameter names of the requested URL.
|
|
860
726
|
* @template TContext The type of the context, extending {@link RequestContext}.
|
|
861
727
|
* @template TContextData The context data to pass to the `TContext`.
|
|
862
728
|
* @param request The HTTP request.
|
|
@@ -876,7 +742,7 @@ async function _handleOrderedCollection(request, { name, values, context: contex
|
|
|
876
742
|
* The main flow is on `getCollection`, `dispatch`.
|
|
877
743
|
*
|
|
878
744
|
* @template TItem The type of items in the collection.
|
|
879
|
-
* @template
|
|
745
|
+
* @template TParam The parameter names of the requested URL.
|
|
880
746
|
* @template TContext The type of the context. {@link Context} or {@link RequestContext}.
|
|
881
747
|
* @template TContextData The context data to pass to the `TContext`.
|
|
882
748
|
* @template TCollection The type of the collection, extending {@link Collection}.
|
|
@@ -910,14 +776,14 @@ var CustomCollectionHandler = class {
|
|
|
910
776
|
#collection = null;
|
|
911
777
|
/**
|
|
912
778
|
* Creates a new CustomCollection instance.
|
|
913
|
-
* @param
|
|
914
|
-
* @param
|
|
915
|
-
* @param
|
|
916
|
-
* @param
|
|
917
|
-
* @param
|
|
918
|
-
* @param
|
|
919
|
-
* @param
|
|
920
|
-
* @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.
|
|
921
787
|
*/
|
|
922
788
|
constructor(name, values, context$1, callbacks, tracerProvider = trace.getTracerProvider(), Collection$1, CollectionPage$1, filterPredicate) {
|
|
923
789
|
this.name = name;
|
|
@@ -1042,7 +908,7 @@ var CustomCollectionHandler = class {
|
|
|
1042
908
|
/**
|
|
1043
909
|
* Creates a function to wrap the dispatcher so tracing can be applied.
|
|
1044
910
|
* @param params Parameters including cursor and total items.
|
|
1045
|
-
* @returns
|
|
911
|
+
* @returns A function that handles the span operation.
|
|
1046
912
|
*/
|
|
1047
913
|
spanPages = ({ totalItems = null, cursor = null }) => async (span) => {
|
|
1048
914
|
try {
|
|
@@ -1063,23 +929,23 @@ var CustomCollectionHandler = class {
|
|
|
1063
929
|
};
|
|
1064
930
|
/**
|
|
1065
931
|
* Dispatches the collection request to get items.
|
|
1066
|
-
* @param
|
|
1067
|
-
* @returns
|
|
932
|
+
* @param cursor The cursor for pagination, or null for the first page.
|
|
933
|
+
* @returns A promise that resolves to the page items.
|
|
1068
934
|
*/
|
|
1069
935
|
async dispatch(cursor = null) {
|
|
1070
936
|
return await this.#dispatcher(this.context, this.values, cursor) ?? new ItemsNotFoundError().throw();
|
|
1071
937
|
}
|
|
1072
938
|
/**
|
|
1073
939
|
* Filters the items in the collection.
|
|
1074
|
-
* @param
|
|
1075
|
-
* @returns
|
|
940
|
+
* @param items The items to filter.
|
|
941
|
+
* @returns The filtered items.
|
|
1076
942
|
*/
|
|
1077
943
|
filterItems(items) {
|
|
1078
944
|
return filterCollectionItems(items, this.name, this.filterPredicate);
|
|
1079
945
|
}
|
|
1080
946
|
/**
|
|
1081
947
|
* Appends a cursor to the URL if it exists.
|
|
1082
|
-
* @param
|
|
948
|
+
* @param cursor The cursor to append, or null/undefined.
|
|
1083
949
|
* @returns The URL with cursor appended, or null if cursor is null/undefined.
|
|
1084
950
|
*/
|
|
1085
951
|
appendToUrl(cursor) {
|
|
@@ -1087,8 +953,7 @@ var CustomCollectionHandler = class {
|
|
|
1087
953
|
}
|
|
1088
954
|
/**
|
|
1089
955
|
* Gets the stored collection or collection page.
|
|
1090
|
-
* @returns
|
|
1091
|
-
the collection or collection page.
|
|
956
|
+
* @returns A promise that resolves to the collection or collection page.
|
|
1092
957
|
*/
|
|
1093
958
|
get collection() {
|
|
1094
959
|
if (this.#collection === null) this.#collection = this.getCollection();
|
|
@@ -1096,8 +961,8 @@ var CustomCollectionHandler = class {
|
|
|
1096
961
|
}
|
|
1097
962
|
/**
|
|
1098
963
|
* Gets the total number of items in the collection.
|
|
1099
|
-
* @returns
|
|
1100
|
-
|
|
964
|
+
* @returns A promise that resolves to the total items count,
|
|
965
|
+
* or null if not available.
|
|
1101
966
|
*/
|
|
1102
967
|
get totalItems() {
|
|
1103
968
|
if (this.#totalItems === void 0) this.totalItems = this.callbacks.counter?.(this.context, this.values);
|
|
@@ -1113,8 +978,8 @@ var CustomCollectionHandler = class {
|
|
|
1113
978
|
}
|
|
1114
979
|
/**
|
|
1115
980
|
* Gets the first cursor for pagination.
|
|
1116
|
-
* @returns
|
|
1117
|
-
or null if not available.
|
|
981
|
+
* @returns A promise that resolves to the first cursor,
|
|
982
|
+
* or null if not available.
|
|
1118
983
|
*/
|
|
1119
984
|
get firstCursor() {
|
|
1120
985
|
const cursor = this.callbacks.firstCursor?.(this.context, this.values);
|
|
@@ -1282,6 +1147,138 @@ async function respondWithObjectIfAcceptable(object, request, options) {
|
|
|
1282
1147
|
return response;
|
|
1283
1148
|
}
|
|
1284
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
|
+
|
|
1285
1282
|
//#endregion
|
|
1286
1283
|
//#region src/federation/middleware.ts
|
|
1287
1284
|
/**
|
|
@@ -1319,7 +1316,6 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
1319
1316
|
firstKnock;
|
|
1320
1317
|
constructor(options) {
|
|
1321
1318
|
super();
|
|
1322
|
-
const logger$2 = getLogger(["fedify", "federation"]);
|
|
1323
1319
|
this.kv = options.kv;
|
|
1324
1320
|
this.kvPrefixes = {
|
|
1325
1321
|
activityIdempotence: ["_fedify", "activityIdempotence"],
|
|
@@ -1367,8 +1363,9 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
1367
1363
|
this.router.trailingSlashInsensitive = options.trailingSlashInsensitive ?? false;
|
|
1368
1364
|
this._initializeRouter();
|
|
1369
1365
|
if (options.allowPrivateAddress || options.userAgent != null) {
|
|
1370
|
-
if (options.
|
|
1371
|
-
|
|
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.");
|
|
1372
1369
|
}
|
|
1373
1370
|
const { allowPrivateAddress, userAgent } = options;
|
|
1374
1371
|
this.allowPrivateAddress = allowPrivateAddress ?? false;
|
|
@@ -1382,11 +1379,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
1382
1379
|
prefix: this.kvPrefixes.remoteDocument
|
|
1383
1380
|
});
|
|
1384
1381
|
});
|
|
1385
|
-
|
|
1386
|
-
if (options.contextLoaderFactory != null) throw new TypeError("Cannot set both contextLoader and contextLoaderFactory options at a time; use contextLoaderFactory only.");
|
|
1387
|
-
this.contextLoaderFactory = () => options.contextLoader;
|
|
1388
|
-
logger$2.warn("The contextLoader option is deprecated; use contextLoaderFactory option instead.");
|
|
1389
|
-
} else this.contextLoaderFactory = options.contextLoaderFactory ?? this.documentLoaderFactory;
|
|
1382
|
+
this.contextLoaderFactory = options.contextLoaderFactory ?? this.documentLoaderFactory;
|
|
1390
1383
|
this.authenticatedDocumentLoaderFactory = options.authenticatedDocumentLoaderFactory ?? ((identity) => getAuthenticatedDocumentLoader(identity, {
|
|
1391
1384
|
allowPrivateAddress,
|
|
1392
1385
|
userAgent,
|