@fedify/fedify 2.0.0-dev.1961 → 2.0.0-dev.206
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 -36
- package/dist/{builder-BrqBKkVi.js → builder-BU9qEchZ.js} +5 -3
- package/dist/{client-BsGzbnV-.d.ts → client-CUTUGgvJ.d.ts} +18 -18
- package/dist/{client-pY7-3icS.js → client-Dg7OfUDA.js} +28 -23
- package/dist/{client-94iWEfQa.d.cts → client-by-PEGAJ.d.cts} +18 -18
- package/dist/compat/mod.cjs +1 -1
- package/dist/compat/mod.d.cts +6 -10
- package/dist/compat/mod.d.ts +6 -10
- package/dist/compat/mod.js +1 -1
- package/dist/compat/transformers.test.js +22 -21
- package/dist/context-Bns6uTJq.js +109 -0
- package/dist/{context-V-XS2_6O.d.ts → context-C7vzWilY.d.ts} +63 -65
- package/dist/{context-PxGADCsD.d.cts → context-CrB9RFy5.d.cts} +63 -65
- package/dist/deno-BUTHG7dM.js +117 -0
- package/dist/{testing-DpRy1YTU.js → dist-B5f6a8Tt.js} +90 -110
- package/dist/{docloader-HB61Uc88.js → docloader-BaYIAi2d.js} +3 -3
- package/dist/{esm-DaZiDvFW.js → esm-DGl7uK1r.js} +1 -1
- package/dist/federation/builder.test.js +7 -5
- package/dist/federation/collection.test.js +2 -3
- package/dist/federation/handler.test.js +110 -22
- package/dist/federation/idempotency.test.js +23 -22
- package/dist/federation/inbox.test.js +4 -3
- package/dist/federation/keycache.test.js +4 -4
- package/dist/federation/kv.test.js +56 -3
- package/dist/federation/middleware.test.js +95 -93
- package/dist/federation/mod.cjs +8 -10
- package/dist/federation/mod.d.cts +7 -11
- package/dist/federation/mod.d.ts +7 -11
- package/dist/federation/mod.js +8 -11
- package/dist/federation/mq.test.js +5 -6
- package/dist/federation/negotiation.test.js +2 -3
- package/dist/federation/retry.test.js +2 -3
- package/dist/federation/router.test.js +2 -2
- package/dist/federation/send.test.js +51 -9
- package/dist/{webfinger/handler.test.js → federation/webfinger.test.js} +24 -22
- package/dist/{federation-CRpdnOMS.cjs → federation-B431K2gm.cjs} +22 -0
- package/dist/{federation-jcR8-ZxP.js → federation-BbZwNNWj.js} +28 -6
- package/dist/{http-B2bao4EB.js → http-BxDH6plL.js} +3 -2
- package/dist/{http-M8k5mKc0.d.cts → http-ClB3pLcL.d.cts} +1 -1
- package/dist/{http-BbO0ejuk.d.ts → http-DLBDPal9.d.ts} +1 -1
- package/dist/{http-CUsGQiwU.js → http-DbN7EWyT.js} +119 -9
- package/dist/{http-BxgYWxTY.cjs → http-xz1rOLDK.cjs} +132 -16
- package/dist/{inbox-CAojlSWc.js → inbox-Cv5jVEEr.js} +2 -1
- package/dist/{key-Dz-KWCap.js → key-s_Hu2h8g.js} +3 -3
- package/dist/{keycache-Czcf33al.js → keycache-DRxpZ5r9.js} +1 -1
- package/dist/{keys-BN4nelft.js → keys-ZbcByPg9.js} +1 -1
- package/dist/{kv-Bxr0Q87_.d.cts → kv-B4vFhIYL.d.cts} +30 -1
- package/dist/{kv-BKNZ-Tb-.d.ts → kv-CYySNrsn.d.ts} +30 -1
- package/dist/{kv-CRZrzyXm.js → kv-QzKcOQgP.js} +22 -0
- package/dist/{kv-cache-5j5Pb-V6.cjs → kv-cache-BCBmDkwr.cjs} +2 -2
- package/dist/{kv-cache-DN9pfMBe.js → kv-cache-BEeqyGER.js} +14 -1
- package/dist/{kv-cache-Bq6kUUoG.js → kv-cache-CCkFOmOl.js} +2 -2
- package/dist/{ld-CEJHYq8u.js → ld-DXqgYcc9.js} +4 -3
- package/dist/middleware-CTmdJqh8.cjs +12 -0
- package/dist/middleware-CjwpmFSb.js +26 -0
- package/dist/{middleware-DgrceAHB.js → middleware-DzYMj3P9.js} +162 -165
- package/dist/middleware-FbKIfGNn.js +12 -0
- package/dist/{middleware-DW3rJHWy.cjs → middleware-IW3LA3Vi.cjs} +210 -194
- package/dist/{middleware-Df9OWALM.js → middleware-mAVYJs2q.js} +164 -154
- package/dist/{mod-DMpuiKXi.d.cts → mod-0p9zUdzg.d.cts} +6 -6
- package/dist/mod-0qnPv4EC.d.cts +62 -0
- package/dist/{mod-DgxG-byT.d.cts → mod-BrS8tiad.d.cts} +2 -2
- package/dist/mod-C3SOvTD1.d.ts +64 -0
- package/dist/{mod-BoRKfJPE.d.cts → mod-D6pS5_xJ.d.cts} +4 -4
- package/dist/{mod-D5Z2tISD.d.ts → mod-jOa7W503.d.ts} +2 -2
- package/dist/{mod-Cdo6SYlJ.d.ts → mod-waqu-BL_.d.ts} +4 -4
- package/dist/{mod-aAE2wOWV.d.ts → mod-xc20HhMD.d.ts} +6 -6
- package/dist/mod.cjs +11 -93
- package/dist/mod.d.cts +11 -15
- package/dist/mod.d.ts +11 -15
- package/dist/mod.js +11 -15
- package/dist/nodeinfo/client.test.js +3 -4
- package/dist/nodeinfo/handler.test.js +22 -21
- package/dist/nodeinfo/mod.cjs +2 -2
- package/dist/nodeinfo/mod.d.cts +2 -2
- package/dist/nodeinfo/mod.d.ts +2 -2
- package/dist/nodeinfo/mod.js +2 -2
- package/dist/nodeinfo/types.test.js +2 -3
- 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-kQRGVXG1.d.ts → owner-BgI8C-VY.d.ts} +1 -2
- package/dist/{owner-B4HbyP8s.d.cts → owner-C-zfmVAD.d.cts} +1 -2
- package/dist/{owner-JwI-WzF-.js → owner-VcVFcfvO.js} +44 -8
- package/dist/{proof-CObJuclI.cjs → proof-LJKB8sTg.cjs} +63 -28
- package/dist/{proof-xH0V1mdD.js → proof-Q-IWSQjT.js} +46 -11
- package/dist/{proof-Dhqndmfg.js → proof-VthB8GiV.js} +3 -2
- package/dist/router-D9eI0s4b.js +118 -0
- package/dist/{send-1o7D-GGL.js → send-Bb7N5G5a.js} +9 -4
- package/dist/sig/http.test.js +6 -7
- package/dist/sig/key.test.js +5 -5
- package/dist/sig/ld.test.js +6 -6
- package/dist/sig/mod.cjs +3 -5
- package/dist/sig/mod.d.cts +3 -5
- package/dist/sig/mod.d.ts +3 -5
- package/dist/sig/mod.js +3 -5
- package/dist/sig/owner.test.js +29 -6
- package/dist/sig/proof.test.js +6 -6
- package/dist/testing/mod.d.ts +70 -6999
- package/dist/testing/mod.js +4 -3
- 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-BtUjyi5y.js → types-8l28uC8o.js} +30 -25
- package/dist/{types-CWgzGaqk.cjs → types-B6z6CqIz.cjs} +30 -25
- package/dist/{types-C2XVl6gj.js → types-CPz01LGH.js} +3 -3
- package/dist/utils/docloader.test.js +7 -8
- package/dist/utils/kv-cache.test.js +5 -3
- package/dist/utils/mod.cjs +3 -5
- package/dist/utils/mod.d.cts +3 -4
- package/dist/utils/mod.d.ts +3 -4
- package/dist/utils/mod.js +3 -5
- package/package.json +24 -35
- package/dist/actor-DhgrrgXz.cjs +0 -42079
- package/dist/actor-DiKHxw_H.js +0 -41647
- package/dist/actor-DqFajh9s.d.ts +0 -130
- package/dist/actor-Kqyoic-M.js +0 -146
- package/dist/actor-f2NtjyCg.d.cts +0 -128
- 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/lookup-D8hvtZHY.js +0 -42178
- package/dist/lookup-_Hap2IXS.cjs +0 -265
- package/dist/lookup-gMu_9ZKY.js +0 -253
- package/dist/middleware-19QFZj7b.js +0 -26
- package/dist/middleware-BbbcXY4w.cjs +0 -15
- package/dist/middleware-CSTK543z.js +0 -15
- package/dist/mod-BlVovdcy.d.ts +0 -309
- package/dist/mod-BxRCHTz-.d.cts +0 -307
- package/dist/mod-C58MZ7Wx.d.cts +0 -113
- package/dist/mod-CcDPcLJW.d.cts +0 -1
- package/dist/mod-Ds0mpFZU.d.ts +0 -115
- package/dist/mod-bjzj5QIb.d.ts +0 -2
- 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 -22
- package/dist/vocab/actor.test.js +0 -5963
- package/dist/vocab/lookup.test.d.ts +0 -3
- package/dist/vocab/lookup.test.js +0 -454
- package/dist/vocab/mod.cjs +0 -86
- package/dist/vocab/mod.d.cts +0 -4
- package/dist/vocab/mod.d.ts +0 -6
- package/dist/vocab/mod.js +0 -9
- package/dist/vocab/type.test.d.ts +0 -3
- package/dist/vocab/type.test.js +0 -24
- package/dist/vocab/vocab.test.d.ts +0 -3
- package/dist/vocab/vocab.test.js +0 -9397
- package/dist/vocab-BCWe1Ih5.d.ts +0 -14905
- package/dist/vocab-CAwj263k.js +0 -255
- package/dist/vocab-CeDBzu-f.d.cts +0 -14903
- package/dist/vocab-DgHGCFcw.cjs +0 -291
- 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 -193
- package/dist/webfinger/mod.cjs +0 -8
- package/dist/webfinger/mod.d.cts +0 -2
- package/dist/webfinger/mod.d.ts +0 -4
- package/dist/webfinger/mod.js +0 -8
- package/dist/webfinger-C72Y8lrh.js +0 -4
- package/dist/webfinger-vAtLmxOF.cjs +0 -4
- /package/dist/{collection-BzWsN9pB.js → collection-CcnIw1qY.js} +0 -0
- /package/dist/{testing/docloader.test.d.ts → federation/webfinger.test.d.ts} +0 -0
- /package/dist/{mod-CVgZgliM.d.ts → mod-1E3W847c.d.ts} +0 -0
- /package/dist/{mod-B-hUPT2N.d.cts → mod-C81L6_lQ.d.cts} +0 -0
- /package/dist/{negotiation-C4nFufNk.js → negotiation-5NPJL6zp.js} +0 -0
- /package/dist/{nodeinfo-BnthBobC.js → nodeinfo-BlLsRSiT.js} +0 -0
- /package/dist/{nodeinfo-CdN0rEnZ.cjs → nodeinfo-DuMYTpbZ.cjs} +0 -0
- /package/dist/{vocab/actor.test.d.ts → otel/exporter.test.d.ts} +0 -0
- /package/dist/{retry-CfF8Gn4d.js → retry-D4GJ670a.js} +0 -0
- /package/dist/{sig-C34-oHBl.js → sig-CwuONEzF.js} +0 -0
- /package/dist/{sig-YYj5tCnr.cjs → sig-DeXX2xnj.cjs} +0 -0
- /package/dist/{utils-DyRU1gdZ.cjs → utils-Db0ZmjcD.cjs} +0 -0
- /package/dist/{utils-D-Va7aXC.js → utils-Wranxuoe.js} +0 -0
|
@@ -3,25 +3,28 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import { getNodeInfo } from "./client-
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
6
|
+
import { deno_default } from "./deno-BUTHG7dM.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-s_Hu2h8g.js";
|
|
11
|
+
import { verifyRequest } from "./http-BxDH6plL.js";
|
|
12
|
+
import { detachSignature, hasSignature, signJsonLd, verifyJsonLd } from "./ld-DXqgYcc9.js";
|
|
13
|
+
import { doesActorOwnKey, getKeyOwner } from "./owner-VcVFcfvO.js";
|
|
14
|
+
import { signObject, verifyObject } from "./proof-VthB8GiV.js";
|
|
15
|
+
import { getAuthenticatedDocumentLoader } from "./docloader-BaYIAi2d.js";
|
|
16
|
+
import { kvCache } from "./kv-cache-BEeqyGER.js";
|
|
17
|
+
import { routeActivity } from "./inbox-Cv5jVEEr.js";
|
|
18
|
+
import { FederationBuilderImpl } from "./builder-BU9qEchZ.js";
|
|
19
|
+
import { buildCollectionSynchronizationHeader } from "./collection-CcnIw1qY.js";
|
|
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-Bb7N5G5a.js";
|
|
24
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";
|
|
25
28
|
import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
|
|
26
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";
|
|
27
30
|
import { domainToASCII } from "node:url";
|
|
@@ -62,7 +65,7 @@ function autoIdAssigner(activity, context$1) {
|
|
|
62
65
|
* activity like this:
|
|
63
66
|
*
|
|
64
67
|
* ```typescript
|
|
65
|
-
* import { Follow, Person } from "@fedify/
|
|
68
|
+
* import { Follow, Person } from "@fedify/vocab";
|
|
66
69
|
* const input = new Follow({
|
|
67
70
|
* id: new URL("http://example.com/activities/1"),
|
|
68
71
|
* actor: new Person({
|
|
@@ -81,7 +84,7 @@ function autoIdAssigner(activity, context$1) {
|
|
|
81
84
|
* The result of applying this transformer would be:
|
|
82
85
|
*
|
|
83
86
|
* ```typescript
|
|
84
|
-
* import { Follow, Person } from "@fedify/
|
|
87
|
+
* import { Follow, Person } from "@fedify/vocab";
|
|
85
88
|
* const output = new Follow({
|
|
86
89
|
* id: new URL("http://example.com/activities/1"),
|
|
87
90
|
* actor: new URL("http://example.com/actors/1"),
|
|
@@ -154,151 +157,6 @@ function handleNodeInfoJrd(_request, context$1) {
|
|
|
154
157
|
return Promise.resolve(response);
|
|
155
158
|
}
|
|
156
159
|
|
|
157
|
-
//#endregion
|
|
158
|
-
//#region src/vocab/constants.ts
|
|
159
|
-
/**
|
|
160
|
-
* The special public collection for [public addressing]. *Do not mutate this
|
|
161
|
-
* object.*
|
|
162
|
-
*
|
|
163
|
-
* [public addressing]: https://www.w3.org/TR/activitypub/#public-addressing
|
|
164
|
-
*
|
|
165
|
-
* @since 0.7.0
|
|
166
|
-
*/
|
|
167
|
-
const PUBLIC_COLLECTION = new URL("https://www.w3.org/ns/activitystreams#Public");
|
|
168
|
-
|
|
169
|
-
//#endregion
|
|
170
|
-
//#region src/webfinger/handler.ts
|
|
171
|
-
const logger = getLogger([
|
|
172
|
-
"fedify",
|
|
173
|
-
"webfinger",
|
|
174
|
-
"server"
|
|
175
|
-
]);
|
|
176
|
-
/**
|
|
177
|
-
* Handles a WebFinger request. You would not typically call this function
|
|
178
|
-
* directly, but instead use {@link Federation.fetch} method.
|
|
179
|
-
* @param request The WebFinger request to handle.
|
|
180
|
-
* @param parameters The parameters for handling the request.
|
|
181
|
-
* @returns The response to the request.
|
|
182
|
-
*/
|
|
183
|
-
async function handleWebFinger(request, options) {
|
|
184
|
-
if (options.tracer == null) return await handleWebFingerInternal(request, options);
|
|
185
|
-
return await options.tracer.startActiveSpan("webfinger.handle", { kind: SpanKind.SERVER }, async (span) => {
|
|
186
|
-
try {
|
|
187
|
-
const response = await handleWebFingerInternal(request, options);
|
|
188
|
-
span.setStatus({ code: response.ok ? SpanStatusCode.UNSET : SpanStatusCode.ERROR });
|
|
189
|
-
return response;
|
|
190
|
-
} catch (error) {
|
|
191
|
-
span.setStatus({
|
|
192
|
-
code: SpanStatusCode.ERROR,
|
|
193
|
-
message: String(error)
|
|
194
|
-
});
|
|
195
|
-
throw error;
|
|
196
|
-
} finally {
|
|
197
|
-
span.end();
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
async function handleWebFingerInternal(request, { context: context$1, host, actorDispatcher, actorHandleMapper, actorAliasMapper, onNotFound, span, webFingerLinksDispatcher }) {
|
|
202
|
-
if (actorDispatcher == null) {
|
|
203
|
-
logger.error("Actor dispatcher is not set.");
|
|
204
|
-
return await onNotFound(request);
|
|
205
|
-
}
|
|
206
|
-
const resource = context$1.url.searchParams.get("resource");
|
|
207
|
-
if (resource == null) return new Response("Missing resource parameter.", { status: 400 });
|
|
208
|
-
span?.setAttribute("webfinger.resource", resource);
|
|
209
|
-
let resourceUrl;
|
|
210
|
-
try {
|
|
211
|
-
resourceUrl = new URL(resource);
|
|
212
|
-
} catch (e) {
|
|
213
|
-
if (e instanceof TypeError) return new Response("Invalid resource URL.", { status: 400 });
|
|
214
|
-
throw e;
|
|
215
|
-
}
|
|
216
|
-
span?.setAttribute("webfinger.resource.scheme", resourceUrl.protocol.replace(/:$/, ""));
|
|
217
|
-
async function mapUsernameToIdentifier(username) {
|
|
218
|
-
if (actorHandleMapper == null) {
|
|
219
|
-
logger.error("No actor handle mapper is set; use the WebFinger username {username} as the actor's internal identifier.", { username });
|
|
220
|
-
return username;
|
|
221
|
-
}
|
|
222
|
-
const identifier$1 = await actorHandleMapper(context$1, username);
|
|
223
|
-
if (identifier$1 == null) {
|
|
224
|
-
logger.error("Actor {username} not found.", { username });
|
|
225
|
-
return null;
|
|
226
|
-
}
|
|
227
|
-
return identifier$1;
|
|
228
|
-
}
|
|
229
|
-
let identifier = null;
|
|
230
|
-
const uriParsed = context$1.parseUri(resourceUrl);
|
|
231
|
-
if (uriParsed?.type != "actor") {
|
|
232
|
-
const match = /^acct:([^@]+)@([^@]+)$/.exec(resource);
|
|
233
|
-
if (match == null) {
|
|
234
|
-
const result = await actorAliasMapper?.(context$1, resourceUrl);
|
|
235
|
-
if (result == null) return await onNotFound(request);
|
|
236
|
-
if ("identifier" in result) identifier = result.identifier;
|
|
237
|
-
else identifier = await mapUsernameToIdentifier(result.username);
|
|
238
|
-
} else {
|
|
239
|
-
const portMatch = /:\d+$/.exec(match[2]);
|
|
240
|
-
const normalizedHost = portMatch == null ? domainToASCII(match[2].toLowerCase()) : domainToASCII(match[2].substring(0, portMatch.index).toLowerCase()) + portMatch[0];
|
|
241
|
-
if (normalizedHost != context$1.url.host && normalizedHost != host) return await onNotFound(request);
|
|
242
|
-
else {
|
|
243
|
-
identifier = await mapUsernameToIdentifier(match[1]);
|
|
244
|
-
resourceUrl = new URL(`acct:${match[1]}@${normalizedHost}`);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
} else identifier = uriParsed.identifier;
|
|
248
|
-
if (identifier == null) return await onNotFound(request);
|
|
249
|
-
const actor = await actorDispatcher(context$1, identifier);
|
|
250
|
-
if (actor == null) {
|
|
251
|
-
logger.error("Actor {identifier} not found.", { identifier });
|
|
252
|
-
return await onNotFound(request);
|
|
253
|
-
}
|
|
254
|
-
const links = [{
|
|
255
|
-
rel: "self",
|
|
256
|
-
href: context$1.getActorUri(identifier).href,
|
|
257
|
-
type: "application/activity+json"
|
|
258
|
-
}];
|
|
259
|
-
for (const url of actor.urls) if (url instanceof Link && url.href != null) links.push({
|
|
260
|
-
rel: url.rel ?? "http://webfinger.net/rel/profile-page",
|
|
261
|
-
href: url.href.href,
|
|
262
|
-
type: url.mediaType == null ? void 0 : url.mediaType
|
|
263
|
-
});
|
|
264
|
-
else if (url instanceof URL) links.push({
|
|
265
|
-
rel: "http://webfinger.net/rel/profile-page",
|
|
266
|
-
href: url.href
|
|
267
|
-
});
|
|
268
|
-
for await (const image of actor.getIcons()) {
|
|
269
|
-
if (image.url?.href == null) continue;
|
|
270
|
-
const link = {
|
|
271
|
-
rel: "http://webfinger.net/rel/avatar",
|
|
272
|
-
href: image.url.href.toString()
|
|
273
|
-
};
|
|
274
|
-
if (image.mediaType != null) link.type = image.mediaType;
|
|
275
|
-
links.push(link);
|
|
276
|
-
}
|
|
277
|
-
if (webFingerLinksDispatcher != null) {
|
|
278
|
-
const customLinks = await webFingerLinksDispatcher(context$1, resourceUrl);
|
|
279
|
-
if (customLinks != null) for (const link of customLinks) links.push(link);
|
|
280
|
-
}
|
|
281
|
-
const aliases = [];
|
|
282
|
-
if (resourceUrl.protocol != "acct:" && actor.preferredUsername != null) {
|
|
283
|
-
aliases.push(`acct:${actor.preferredUsername}@${host ?? context$1.url.host}`);
|
|
284
|
-
if (host != null && host !== context$1.url.host) aliases.push(`acct:${actor.preferredUsername}@${context$1.url.host}`);
|
|
285
|
-
}
|
|
286
|
-
if (resourceUrl.href !== context$1.getActorUri(identifier).href) aliases.push(context$1.getActorUri(identifier).href);
|
|
287
|
-
if (resourceUrl.protocol === "acct:" && host != null && host !== context$1.url.host && !resourceUrl.href.endsWith(`@${host}`)) {
|
|
288
|
-
const username = resourceUrl.href.replace(/^acct:/, "").replace(/@.*$/, "");
|
|
289
|
-
aliases.push(`acct:${username}@${host}`);
|
|
290
|
-
}
|
|
291
|
-
const jrd = {
|
|
292
|
-
subject: resourceUrl.href,
|
|
293
|
-
aliases,
|
|
294
|
-
links
|
|
295
|
-
};
|
|
296
|
-
return new Response(JSON.stringify(jrd), { headers: {
|
|
297
|
-
"Content-Type": "application/jrd+json",
|
|
298
|
-
"Access-Control-Allow-Origin": "*"
|
|
299
|
-
} });
|
|
300
|
-
}
|
|
301
|
-
|
|
302
160
|
//#endregion
|
|
303
161
|
//#region src/federation/handler.ts
|
|
304
162
|
/**
|
|
@@ -780,6 +638,13 @@ async function handleInboxInternal(request, parameters, span) {
|
|
|
780
638
|
}
|
|
781
639
|
if (activity.id != null) span.setAttribute("activitypub.activity.id", activity.id.href);
|
|
782
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
|
+
});
|
|
783
648
|
if (httpSigKey != null && !await doesActorOwnKey(activity, httpSigKey, ctx)) {
|
|
784
649
|
logger$2.error("The signer ({keyId}) and the actor ({actorId}) do not match.", {
|
|
785
650
|
activity: json,
|
|
@@ -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
|
/**
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
3
|
+
import { URLPattern } from "urlpattern-polyfill";
|
|
4
|
+
|
|
5
|
+
import "./transformers-N_ip_y4P.js";
|
|
6
|
+
import "./http-DbN7EWyT.js";
|
|
7
|
+
import { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer, createFederation } from "./middleware-mAVYJs2q.js";
|
|
8
|
+
import "./proof-Q-IWSQjT.js";
|
|
9
|
+
import "./types-8l28uC8o.js";
|
|
10
|
+
import "./kv-cache-CCkFOmOl.js";
|
|
11
|
+
|
|
12
|
+
export { FederationImpl };
|