@fedify/fedify 2.0.0-dev.1961 → 2.0.0-dev.211
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-CBUaUcr5.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-Ldk6cZ5y.js +117 -0
- package/dist/{testing-DpRy1YTU.js → dist-B5f6a8Tt.js} +90 -110
- package/dist/{docloader-HB61Uc88.js → docloader-CX_8i5G9.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-M8k5mKc0.d.cts → http-ClB3pLcL.d.cts} +1 -1
- package/dist/{http-CUsGQiwU.js → http-CnZ1IHUS.js} +119 -9
- package/dist/{http-BbO0ejuk.d.ts → http-DLBDPal9.d.ts} +1 -1
- package/dist/{http-B2bao4EB.js → http-DNpKjQw7.js} +3 -2
- package/dist/{http-BxgYWxTY.cjs → http-dzRhLC1t.cjs} +132 -16
- package/dist/{inbox-CAojlSWc.js → inbox-DR-Gk02p.js} +2 -1
- package/dist/{key-Dz-KWCap.js → key-C1rxalIW.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-DN9pfMBe.js → kv-cache-BEeqyGER.js} +14 -1
- package/dist/{kv-cache-5j5Pb-V6.cjs → kv-cache-BlS1sett.cjs} +2 -2
- package/dist/{kv-cache-Bq6kUUoG.js → kv-cache-DpIq7Isv.js} +2 -2
- package/dist/{ld-CEJHYq8u.js → ld-Cm6SNnYj.js} +4 -3
- package/dist/middleware-BJ396MAL.cjs +12 -0
- package/dist/{middleware-DW3rJHWy.cjs → middleware-CBBhOrXl.cjs} +210 -194
- package/dist/middleware-CRk4rARo.js +12 -0
- package/dist/middleware-DaemJ_4r.js +26 -0
- package/dist/{middleware-DgrceAHB.js → middleware-DmcjHVg8.js} +162 -165
- package/dist/{middleware-Df9OWALM.js → middleware-JPuzpoIQ.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-D-ZwLwaI.js} +44 -8
- package/dist/{proof-Dhqndmfg.js → proof-B-5l6HNZ.js} +3 -2
- package/dist/{proof-CObJuclI.cjs → proof-C2oMTHcU.cjs} +63 -28
- package/dist/{proof-xH0V1mdD.js → proof-lN5nVUla.js} +46 -11
- package/dist/router-D9eI0s4b.js +118 -0
- package/dist/{send-1o7D-GGL.js → send-D0AlkVEU.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
|
@@ -2,22 +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 { getNodeInfo, nodeInfoToJson } from "./types-BtUjyi5y.js";
|
|
11
|
-
import { getAuthenticatedDocumentLoader, kvCache } from "./kv-cache-Bq6kUUoG.js";
|
|
12
|
-
import { lookupObject, traverseCollection } from "./vocab-CAwj263k.js";
|
|
5
|
+
import { getDefaultActivityTransformers } from "./transformers-N_ip_y4P.js";
|
|
6
|
+
import { deno_default, doubleKnock, exportJwk, importJwk, validateCryptoKey, verifyRequest } from "./http-CnZ1IHUS.js";
|
|
7
|
+
import { detachSignature, doesActorOwnKey, getKeyOwner, hasSignature, signJsonLd, signObject, verifyJsonLd, verifyObject } from "./proof-lN5nVUla.js";
|
|
8
|
+
import { getNodeInfo, nodeInfoToJson } from "./types-8l28uC8o.js";
|
|
9
|
+
import { getAuthenticatedDocumentLoader, kvCache } from "./kv-cache-DpIq7Isv.js";
|
|
13
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";
|
|
14
12
|
import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
|
|
15
|
-
import { getDocumentLoader } from "@fedify/vocab-runtime";
|
|
16
13
|
import { cloneDeep } from "es-toolkit";
|
|
17
14
|
import { Router } from "uri-template-router";
|
|
18
15
|
import { parseTemplate } from "url-template";
|
|
19
16
|
import { encodeHex } from "byte-encodings/hex";
|
|
20
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";
|
|
21
20
|
import { domainToASCII } from "node:url";
|
|
22
21
|
|
|
23
22
|
//#region src/federation/inbox.ts
|
|
@@ -338,7 +337,7 @@ var FederationBuilderImpl = class {
|
|
|
338
337
|
this.collectionTypeIds = {};
|
|
339
338
|
}
|
|
340
339
|
async build(options) {
|
|
341
|
-
const { FederationImpl: FederationImpl$1 } = await import("./middleware-
|
|
340
|
+
const { FederationImpl: FederationImpl$1 } = await import("./middleware-CRk4rARo.js");
|
|
342
341
|
const f = new FederationImpl$1(options);
|
|
343
342
|
const trailingSlashInsensitiveValue = f.router.trailingSlashInsensitive;
|
|
344
343
|
f.router = this.router.clone();
|
|
@@ -1490,6 +1489,13 @@ async function handleInboxInternal(request, parameters, span) {
|
|
|
1490
1489
|
}
|
|
1491
1490
|
if (activity.id != null) span.setAttribute("activitypub.activity.id", activity.id.href);
|
|
1492
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
|
+
});
|
|
1493
1499
|
if (httpSigKey != null && !await doesActorOwnKey(activity, httpSigKey, ctx)) {
|
|
1494
1500
|
logger$1.error("The signer ({keyId}) and the actor ({actorId}) do not match.", {
|
|
1495
1501
|
activity: json,
|
|
@@ -2030,139 +2036,6 @@ function handleNodeInfoJrd(_request, context$1) {
|
|
|
2030
2036
|
return Promise.resolve(response);
|
|
2031
2037
|
}
|
|
2032
2038
|
|
|
2033
|
-
//#endregion
|
|
2034
|
-
//#region src/webfinger/handler.ts
|
|
2035
|
-
const logger = getLogger([
|
|
2036
|
-
"fedify",
|
|
2037
|
-
"webfinger",
|
|
2038
|
-
"server"
|
|
2039
|
-
]);
|
|
2040
|
-
/**
|
|
2041
|
-
* Handles a WebFinger request. You would not typically call this function
|
|
2042
|
-
* directly, but instead use {@link Federation.fetch} method.
|
|
2043
|
-
* @param request The WebFinger request to handle.
|
|
2044
|
-
* @param parameters The parameters for handling the request.
|
|
2045
|
-
* @returns The response to the request.
|
|
2046
|
-
*/
|
|
2047
|
-
async function handleWebFinger(request, options) {
|
|
2048
|
-
if (options.tracer == null) return await handleWebFingerInternal(request, options);
|
|
2049
|
-
return await options.tracer.startActiveSpan("webfinger.handle", { kind: SpanKind.SERVER }, async (span) => {
|
|
2050
|
-
try {
|
|
2051
|
-
const response = await handleWebFingerInternal(request, options);
|
|
2052
|
-
span.setStatus({ code: response.ok ? SpanStatusCode.UNSET : SpanStatusCode.ERROR });
|
|
2053
|
-
return response;
|
|
2054
|
-
} catch (error) {
|
|
2055
|
-
span.setStatus({
|
|
2056
|
-
code: SpanStatusCode.ERROR,
|
|
2057
|
-
message: String(error)
|
|
2058
|
-
});
|
|
2059
|
-
throw error;
|
|
2060
|
-
} finally {
|
|
2061
|
-
span.end();
|
|
2062
|
-
}
|
|
2063
|
-
});
|
|
2064
|
-
}
|
|
2065
|
-
async function handleWebFingerInternal(request, { context: context$1, host, actorDispatcher, actorHandleMapper, actorAliasMapper, onNotFound, span, webFingerLinksDispatcher }) {
|
|
2066
|
-
if (actorDispatcher == null) {
|
|
2067
|
-
logger.error("Actor dispatcher is not set.");
|
|
2068
|
-
return await onNotFound(request);
|
|
2069
|
-
}
|
|
2070
|
-
const resource = context$1.url.searchParams.get("resource");
|
|
2071
|
-
if (resource == null) return new Response("Missing resource parameter.", { status: 400 });
|
|
2072
|
-
span?.setAttribute("webfinger.resource", resource);
|
|
2073
|
-
let resourceUrl;
|
|
2074
|
-
try {
|
|
2075
|
-
resourceUrl = new URL(resource);
|
|
2076
|
-
} catch (e) {
|
|
2077
|
-
if (e instanceof TypeError) return new Response("Invalid resource URL.", { status: 400 });
|
|
2078
|
-
throw e;
|
|
2079
|
-
}
|
|
2080
|
-
span?.setAttribute("webfinger.resource.scheme", resourceUrl.protocol.replace(/:$/, ""));
|
|
2081
|
-
async function mapUsernameToIdentifier(username) {
|
|
2082
|
-
if (actorHandleMapper == null) {
|
|
2083
|
-
logger.error("No actor handle mapper is set; use the WebFinger username {username} as the actor's internal identifier.", { username });
|
|
2084
|
-
return username;
|
|
2085
|
-
}
|
|
2086
|
-
const identifier$1 = await actorHandleMapper(context$1, username);
|
|
2087
|
-
if (identifier$1 == null) {
|
|
2088
|
-
logger.error("Actor {username} not found.", { username });
|
|
2089
|
-
return null;
|
|
2090
|
-
}
|
|
2091
|
-
return identifier$1;
|
|
2092
|
-
}
|
|
2093
|
-
let identifier = null;
|
|
2094
|
-
const uriParsed = context$1.parseUri(resourceUrl);
|
|
2095
|
-
if (uriParsed?.type != "actor") {
|
|
2096
|
-
const match = /^acct:([^@]+)@([^@]+)$/.exec(resource);
|
|
2097
|
-
if (match == null) {
|
|
2098
|
-
const result = await actorAliasMapper?.(context$1, resourceUrl);
|
|
2099
|
-
if (result == null) return await onNotFound(request);
|
|
2100
|
-
if ("identifier" in result) identifier = result.identifier;
|
|
2101
|
-
else identifier = await mapUsernameToIdentifier(result.username);
|
|
2102
|
-
} else {
|
|
2103
|
-
const portMatch = /:\d+$/.exec(match[2]);
|
|
2104
|
-
const normalizedHost = portMatch == null ? domainToASCII(match[2].toLowerCase()) : domainToASCII(match[2].substring(0, portMatch.index).toLowerCase()) + portMatch[0];
|
|
2105
|
-
if (normalizedHost != context$1.url.host && normalizedHost != host) return await onNotFound(request);
|
|
2106
|
-
else {
|
|
2107
|
-
identifier = await mapUsernameToIdentifier(match[1]);
|
|
2108
|
-
resourceUrl = new URL(`acct:${match[1]}@${normalizedHost}`);
|
|
2109
|
-
}
|
|
2110
|
-
}
|
|
2111
|
-
} else identifier = uriParsed.identifier;
|
|
2112
|
-
if (identifier == null) return await onNotFound(request);
|
|
2113
|
-
const actor = await actorDispatcher(context$1, identifier);
|
|
2114
|
-
if (actor == null) {
|
|
2115
|
-
logger.error("Actor {identifier} not found.", { identifier });
|
|
2116
|
-
return await onNotFound(request);
|
|
2117
|
-
}
|
|
2118
|
-
const links = [{
|
|
2119
|
-
rel: "self",
|
|
2120
|
-
href: context$1.getActorUri(identifier).href,
|
|
2121
|
-
type: "application/activity+json"
|
|
2122
|
-
}];
|
|
2123
|
-
for (const url of actor.urls) if (url instanceof Link && url.href != null) links.push({
|
|
2124
|
-
rel: url.rel ?? "http://webfinger.net/rel/profile-page",
|
|
2125
|
-
href: url.href.href,
|
|
2126
|
-
type: url.mediaType == null ? void 0 : url.mediaType
|
|
2127
|
-
});
|
|
2128
|
-
else if (url instanceof URL) links.push({
|
|
2129
|
-
rel: "http://webfinger.net/rel/profile-page",
|
|
2130
|
-
href: url.href
|
|
2131
|
-
});
|
|
2132
|
-
for await (const image of actor.getIcons()) {
|
|
2133
|
-
if (image.url?.href == null) continue;
|
|
2134
|
-
const link = {
|
|
2135
|
-
rel: "http://webfinger.net/rel/avatar",
|
|
2136
|
-
href: image.url.href.toString()
|
|
2137
|
-
};
|
|
2138
|
-
if (image.mediaType != null) link.type = image.mediaType;
|
|
2139
|
-
links.push(link);
|
|
2140
|
-
}
|
|
2141
|
-
if (webFingerLinksDispatcher != null) {
|
|
2142
|
-
const customLinks = await webFingerLinksDispatcher(context$1, resourceUrl);
|
|
2143
|
-
if (customLinks != null) for (const link of customLinks) links.push(link);
|
|
2144
|
-
}
|
|
2145
|
-
const aliases = [];
|
|
2146
|
-
if (resourceUrl.protocol != "acct:" && actor.preferredUsername != null) {
|
|
2147
|
-
aliases.push(`acct:${actor.preferredUsername}@${host ?? context$1.url.host}`);
|
|
2148
|
-
if (host != null && host !== context$1.url.host) aliases.push(`acct:${actor.preferredUsername}@${context$1.url.host}`);
|
|
2149
|
-
}
|
|
2150
|
-
if (resourceUrl.href !== context$1.getActorUri(identifier).href) aliases.push(context$1.getActorUri(identifier).href);
|
|
2151
|
-
if (resourceUrl.protocol === "acct:" && host != null && host !== context$1.url.host && !resourceUrl.href.endsWith(`@${host}`)) {
|
|
2152
|
-
const username = resourceUrl.href.replace(/^acct:/, "").replace(/@.*$/, "");
|
|
2153
|
-
aliases.push(`acct:${username}@${host}`);
|
|
2154
|
-
}
|
|
2155
|
-
const jrd = {
|
|
2156
|
-
subject: resourceUrl.href,
|
|
2157
|
-
aliases,
|
|
2158
|
-
links
|
|
2159
|
-
};
|
|
2160
|
-
return new Response(JSON.stringify(jrd), { headers: {
|
|
2161
|
-
"Content-Type": "application/jrd+json",
|
|
2162
|
-
"Access-Control-Allow-Origin": "*"
|
|
2163
|
-
} });
|
|
2164
|
-
}
|
|
2165
|
-
|
|
2166
2039
|
//#endregion
|
|
2167
2040
|
//#region src/federation/retry.ts
|
|
2168
2041
|
/**
|
|
@@ -2189,8 +2062,8 @@ function createExponentialBackoffPolicy(options = {}) {
|
|
|
2189
2062
|
milliseconds *= 1 + Math.random();
|
|
2190
2063
|
milliseconds = Math.round(milliseconds);
|
|
2191
2064
|
}
|
|
2192
|
-
const delay
|
|
2193
|
-
return Temporal.Duration.compare(delay
|
|
2065
|
+
const delay = Temporal.Duration.from({ milliseconds });
|
|
2066
|
+
return Temporal.Duration.compare(delay, maxDelay) > 0 ? maxDelay : delay;
|
|
2194
2067
|
};
|
|
2195
2068
|
}
|
|
2196
2069
|
|
|
@@ -2242,7 +2115,7 @@ function sendActivity(options) {
|
|
|
2242
2115
|
await sendActivityInternal({
|
|
2243
2116
|
...options,
|
|
2244
2117
|
tracerProvider
|
|
2245
|
-
});
|
|
2118
|
+
}, span);
|
|
2246
2119
|
} catch (e) {
|
|
2247
2120
|
span.setStatus({
|
|
2248
2121
|
code: SpanStatusCode.ERROR,
|
|
@@ -2254,7 +2127,7 @@ function sendActivity(options) {
|
|
|
2254
2127
|
}
|
|
2255
2128
|
});
|
|
2256
2129
|
}
|
|
2257
|
-
async function sendActivityInternal({ activity, activityId, keys, inbox, headers, specDeterminer, tracerProvider }) {
|
|
2130
|
+
async function sendActivityInternal({ activity, activityId, keys, inbox, headers, specDeterminer, tracerProvider }, span) {
|
|
2258
2131
|
const logger$1 = getLogger([
|
|
2259
2132
|
"fedify",
|
|
2260
2133
|
"federation",
|
|
@@ -2309,6 +2182,143 @@ async function sendActivityInternal({ activity, activityId, keys, inbox, headers
|
|
|
2309
2182
|
});
|
|
2310
2183
|
throw new Error(`Failed to send activity ${activityId} to ${inbox.href} (${response.status} ${response.statusText}):\n${error}`);
|
|
2311
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
|
+
} });
|
|
2312
2322
|
}
|
|
2313
2323
|
|
|
2314
2324
|
//#endregion
|
|
@@ -2615,11 +2625,11 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2615
2625
|
});
|
|
2616
2626
|
throw error;
|
|
2617
2627
|
}
|
|
2618
|
-
const delay
|
|
2628
|
+
const delay = this.outboxRetryPolicy({
|
|
2619
2629
|
elapsedTime: Temporal.Instant.from(message.started).until(Temporal.Now.instant()),
|
|
2620
2630
|
attempts: message.attempt
|
|
2621
2631
|
});
|
|
2622
|
-
if (delay
|
|
2632
|
+
if (delay != null) {
|
|
2623
2633
|
logger$1.error("Failed to send activity {activityId} to {inbox} (attempt #{attempt}); retry...:\n{error}", {
|
|
2624
2634
|
...logData,
|
|
2625
2635
|
error
|
|
@@ -2627,7 +2637,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2627
2637
|
await this.outboxQueue?.enqueue({
|
|
2628
2638
|
...message,
|
|
2629
2639
|
attempt: message.attempt + 1
|
|
2630
|
-
}, { delay: Temporal.Duration.compare(delay
|
|
2640
|
+
}, { delay: Temporal.Duration.compare(delay, { seconds: 0 }) < 0 ? Temporal.Duration.from({ seconds: 0 }) : delay });
|
|
2631
2641
|
} else logger$1.error("Failed to send activity {activityId} to {inbox} after {attempt} attempts; giving up:\n{error}", {
|
|
2632
2642
|
...logData,
|
|
2633
2643
|
error
|
|
@@ -2714,11 +2724,11 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2714
2724
|
span$1.end();
|
|
2715
2725
|
throw error;
|
|
2716
2726
|
}
|
|
2717
|
-
const delay
|
|
2727
|
+
const delay = this.inboxRetryPolicy({
|
|
2718
2728
|
elapsedTime: Temporal.Instant.from(message.started).until(Temporal.Now.instant()),
|
|
2719
2729
|
attempts: message.attempt
|
|
2720
2730
|
});
|
|
2721
|
-
if (delay
|
|
2731
|
+
if (delay != null) {
|
|
2722
2732
|
logger$1.error("Failed to process the incoming activity {activityId} (attempt #{attempt}); retry...:\n{error}", {
|
|
2723
2733
|
error,
|
|
2724
2734
|
attempt: message.attempt,
|
|
@@ -2729,7 +2739,7 @@ var FederationImpl = class extends FederationBuilderImpl {
|
|
|
2729
2739
|
await this.inboxQueue?.enqueue({
|
|
2730
2740
|
...message,
|
|
2731
2741
|
attempt: message.attempt + 1
|
|
2732
|
-
}, { delay: Temporal.Duration.compare(delay
|
|
2742
|
+
}, { delay: Temporal.Duration.compare(delay, { seconds: 0 }) < 0 ? Temporal.Duration.from({ seconds: 0 }) : delay });
|
|
2733
2743
|
} else logger$1.error("Failed to process the incoming activity {activityId} after {trial} attempts; giving up:\n{error}", {
|
|
2734
2744
|
error,
|
|
2735
2745
|
activityId: activity.id?.href,
|
|
@@ -4144,4 +4154,4 @@ function getRequestId(request) {
|
|
|
4144
4154
|
}
|
|
4145
4155
|
|
|
4146
4156
|
//#endregion
|
|
4147
|
-
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 };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { HttpMessageSignaturesSpecDeterminer } from "./http-
|
|
2
|
-
import { KvKey, KvStore } from "./kv-
|
|
1
|
+
import { HttpMessageSignaturesSpecDeterminer } from "./http-ClB3pLcL.cjs";
|
|
2
|
+
import { KvKey, KvStore } from "./kv-B4vFhIYL.cjs";
|
|
3
3
|
import { DocumentLoader, DocumentLoaderFactoryOptions } from "@fedify/vocab-runtime";
|
|
4
4
|
import { TracerProvider } from "@opentelemetry/api";
|
|
5
5
|
|
|
@@ -72,16 +72,16 @@ interface KvCacheParameters {
|
|
|
72
72
|
/**
|
|
73
73
|
* The document loader to decorate with a cache.
|
|
74
74
|
*/
|
|
75
|
-
loader: DocumentLoader;
|
|
75
|
+
readonly loader: DocumentLoader;
|
|
76
76
|
/**
|
|
77
77
|
* The key–value store to use for backing the cache.
|
|
78
78
|
*/
|
|
79
|
-
kv: KvStore;
|
|
79
|
+
readonly kv: KvStore;
|
|
80
80
|
/**
|
|
81
81
|
* The key prefix to use for namespacing the cache.
|
|
82
82
|
* `["_fedify", "remoteDocument"]` by default.
|
|
83
83
|
*/
|
|
84
|
-
prefix?: KvKey;
|
|
84
|
+
readonly prefix?: KvKey;
|
|
85
85
|
/**
|
|
86
86
|
* The per-URL cache rules in the array of `[urlPattern, duration]` pairs
|
|
87
87
|
* where `urlPattern` is either a string, a {@link URL}, or
|
|
@@ -90,7 +90,7 @@ interface KvCacheParameters {
|
|
|
90
90
|
*
|
|
91
91
|
* By default, 5 minutes for all URLs.
|
|
92
92
|
*/
|
|
93
|
-
rules?: [string | URL | URLPattern, Temporal.Duration | Temporal.DurationLike][];
|
|
93
|
+
readonly rules?: readonly [string | URL | URLPattern, Temporal.Duration | Temporal.DurationLike][];
|
|
94
94
|
}
|
|
95
95
|
/**
|
|
96
96
|
* Decorates a {@link DocumentLoader} with a cache backed by a {@link Deno.Kv}.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ActorAliasMapper, ActorDispatcher, ActorHandleMapper, RequestContext, WebFingerLinksDispatcher } from "./context-CrB9RFy5.cjs";
|
|
2
|
+
import { Span, Tracer } from "@opentelemetry/api";
|
|
3
|
+
|
|
4
|
+
//#region src/federation/webfinger.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Parameters for {@link handleWebFinger}.
|
|
7
|
+
*/
|
|
8
|
+
interface WebFingerHandlerParameters<TContextData> {
|
|
9
|
+
/**
|
|
10
|
+
* The request context.
|
|
11
|
+
*/
|
|
12
|
+
context: RequestContext<TContextData>;
|
|
13
|
+
/**
|
|
14
|
+
* The canonical hostname of the server, if it's explicitly configured.
|
|
15
|
+
* @since 1.5.0
|
|
16
|
+
*/
|
|
17
|
+
host?: string;
|
|
18
|
+
/**
|
|
19
|
+
* The callback for dispatching the actor.
|
|
20
|
+
*/
|
|
21
|
+
actorDispatcher?: ActorDispatcher<TContextData>;
|
|
22
|
+
/**
|
|
23
|
+
* The callback for mapping a WebFinger username to the corresponding actor's
|
|
24
|
+
* internal identifier, or `null` if the username is not found.
|
|
25
|
+
* @since 0.15.0
|
|
26
|
+
*/
|
|
27
|
+
actorHandleMapper?: ActorHandleMapper<TContextData>;
|
|
28
|
+
/**
|
|
29
|
+
* The callback for mapping a WebFinger query to the corresponding actor's
|
|
30
|
+
* internal identifier or username, or `null` if the query is not found.
|
|
31
|
+
* @since 1.4.0
|
|
32
|
+
*/
|
|
33
|
+
actorAliasMapper?: ActorAliasMapper<TContextData>;
|
|
34
|
+
/**
|
|
35
|
+
* The callback for dispatching the Links of webFinger.
|
|
36
|
+
*/
|
|
37
|
+
webFingerLinksDispatcher?: WebFingerLinksDispatcher<TContextData>;
|
|
38
|
+
/**
|
|
39
|
+
* The function to call when the actor is not found.
|
|
40
|
+
*/
|
|
41
|
+
onNotFound(request: Request): Response | Promise<Response>;
|
|
42
|
+
/**
|
|
43
|
+
* The OpenTelemetry tracer.
|
|
44
|
+
* @since 1.3.0
|
|
45
|
+
*/
|
|
46
|
+
tracer?: Tracer;
|
|
47
|
+
/**
|
|
48
|
+
* The span for the request.
|
|
49
|
+
* @since 1.3.0
|
|
50
|
+
*/
|
|
51
|
+
span?: Span;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Handles a WebFinger request. You would not typically call this function
|
|
55
|
+
* directly, but instead use {@link Federation.fetch} method.
|
|
56
|
+
* @param request The WebFinger request to handle.
|
|
57
|
+
* @param parameters The parameters for handling the request.
|
|
58
|
+
* @returns The response to the request.
|
|
59
|
+
*/
|
|
60
|
+
declare function handleWebFinger<TContextData>(request: Request, options: WebFingerHandlerParameters<TContextData>): Promise<Response>;
|
|
61
|
+
//#endregion
|
|
62
|
+
export { WebFingerHandlerParameters, handleWebFinger };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { KeyCache } from "./http-ClB3pLcL.cjs";
|
|
2
|
+
import { CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1 } from "@fedify/vocab";
|
|
3
3
|
import { DocumentLoader } from "@fedify/vocab-runtime";
|
|
4
4
|
import { TracerProvider } from "@opentelemetry/api";
|
|
5
5
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
+
import { ActorAliasMapper, ActorDispatcher, ActorHandleMapper, RequestContext, WebFingerLinksDispatcher } from "./context-C7vzWilY.js";
|
|
4
|
+
import { Span, Tracer } from "@opentelemetry/api";
|
|
5
|
+
|
|
6
|
+
//#region src/federation/webfinger.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* Parameters for {@link handleWebFinger}.
|
|
9
|
+
*/
|
|
10
|
+
interface WebFingerHandlerParameters<TContextData> {
|
|
11
|
+
/**
|
|
12
|
+
* The request context.
|
|
13
|
+
*/
|
|
14
|
+
context: RequestContext<TContextData>;
|
|
15
|
+
/**
|
|
16
|
+
* The canonical hostname of the server, if it's explicitly configured.
|
|
17
|
+
* @since 1.5.0
|
|
18
|
+
*/
|
|
19
|
+
host?: string;
|
|
20
|
+
/**
|
|
21
|
+
* The callback for dispatching the actor.
|
|
22
|
+
*/
|
|
23
|
+
actorDispatcher?: ActorDispatcher<TContextData>;
|
|
24
|
+
/**
|
|
25
|
+
* The callback for mapping a WebFinger username to the corresponding actor's
|
|
26
|
+
* internal identifier, or `null` if the username is not found.
|
|
27
|
+
* @since 0.15.0
|
|
28
|
+
*/
|
|
29
|
+
actorHandleMapper?: ActorHandleMapper<TContextData>;
|
|
30
|
+
/**
|
|
31
|
+
* The callback for mapping a WebFinger query to the corresponding actor's
|
|
32
|
+
* internal identifier or username, or `null` if the query is not found.
|
|
33
|
+
* @since 1.4.0
|
|
34
|
+
*/
|
|
35
|
+
actorAliasMapper?: ActorAliasMapper<TContextData>;
|
|
36
|
+
/**
|
|
37
|
+
* The callback for dispatching the Links of webFinger.
|
|
38
|
+
*/
|
|
39
|
+
webFingerLinksDispatcher?: WebFingerLinksDispatcher<TContextData>;
|
|
40
|
+
/**
|
|
41
|
+
* The function to call when the actor is not found.
|
|
42
|
+
*/
|
|
43
|
+
onNotFound(request: Request): Response | Promise<Response>;
|
|
44
|
+
/**
|
|
45
|
+
* The OpenTelemetry tracer.
|
|
46
|
+
* @since 1.3.0
|
|
47
|
+
*/
|
|
48
|
+
tracer?: Tracer;
|
|
49
|
+
/**
|
|
50
|
+
* The span for the request.
|
|
51
|
+
* @since 1.3.0
|
|
52
|
+
*/
|
|
53
|
+
span?: Span;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Handles a WebFinger request. You would not typically call this function
|
|
57
|
+
* directly, but instead use {@link Federation.fetch} method.
|
|
58
|
+
* @param request The WebFinger request to handle.
|
|
59
|
+
* @param parameters The parameters for handling the request.
|
|
60
|
+
* @returns The response to the request.
|
|
61
|
+
*/
|
|
62
|
+
declare function handleWebFinger<TContextData>(request: Request, options: WebFingerHandlerParameters<TContextData>): Promise<Response>;
|
|
63
|
+
//#endregion
|
|
64
|
+
export { WebFingerHandlerParameters, handleWebFinger };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { ActivityTransformer, Context } from "./context-CrB9RFy5.cjs";
|
|
2
|
+
import { Activity } from "@fedify/vocab";
|
|
3
3
|
|
|
4
4
|
//#region src/compat/transformers.d.ts
|
|
5
5
|
|
|
@@ -28,7 +28,7 @@ declare function autoIdAssigner<TContextData>(activity: Activity, context: Conte
|
|
|
28
28
|
* activity like this:
|
|
29
29
|
*
|
|
30
30
|
* ```typescript
|
|
31
|
-
* import { Follow, Person } from "@fedify/
|
|
31
|
+
* import { Follow, Person } from "@fedify/vocab";
|
|
32
32
|
* const input = new Follow({
|
|
33
33
|
* id: new URL("http://example.com/activities/1"),
|
|
34
34
|
* actor: new Person({
|
|
@@ -47,7 +47,7 @@ declare function autoIdAssigner<TContextData>(activity: Activity, context: Conte
|
|
|
47
47
|
* The result of applying this transformer would be:
|
|
48
48
|
*
|
|
49
49
|
* ```typescript
|
|
50
|
-
* import { Follow, Person } from "@fedify/
|
|
50
|
+
* import { Follow, Person } from "@fedify/vocab";
|
|
51
51
|
* const output = new Follow({
|
|
52
52
|
* id: new URL("http://example.com/activities/1"),
|
|
53
53
|
* actor: new URL("http://example.com/actors/1"),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { KeyCache } from "./http-DLBDPal9.js";
|
|
4
|
+
import { CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1 } from "@fedify/vocab";
|
|
5
5
|
import { TracerProvider } from "@opentelemetry/api";
|
|
6
6
|
import { DocumentLoader } from "@fedify/vocab-runtime";
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { ActivityTransformer, Context } from "./context-C7vzWilY.js";
|
|
4
|
+
import { Activity } from "@fedify/vocab";
|
|
5
5
|
|
|
6
6
|
//#region src/compat/transformers.d.ts
|
|
7
7
|
|
|
@@ -30,7 +30,7 @@ declare function autoIdAssigner<TContextData>(activity: Activity, context: Conte
|
|
|
30
30
|
* activity like this:
|
|
31
31
|
*
|
|
32
32
|
* ```typescript
|
|
33
|
-
* import { Follow, Person } from "@fedify/
|
|
33
|
+
* import { Follow, Person } from "@fedify/vocab";
|
|
34
34
|
* const input = new Follow({
|
|
35
35
|
* id: new URL("http://example.com/activities/1"),
|
|
36
36
|
* actor: new Person({
|
|
@@ -49,7 +49,7 @@ declare function autoIdAssigner<TContextData>(activity: Activity, context: Conte
|
|
|
49
49
|
* The result of applying this transformer would be:
|
|
50
50
|
*
|
|
51
51
|
* ```typescript
|
|
52
|
-
* import { Follow, Person } from "@fedify/
|
|
52
|
+
* import { Follow, Person } from "@fedify/vocab";
|
|
53
53
|
* const output = new Follow({
|
|
54
54
|
* id: new URL("http://example.com/activities/1"),
|
|
55
55
|
* actor: new URL("http://example.com/actors/1"),
|