@fedify/fedify 1.10.0-dev.5 → 2.0.0-dev.12
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/README.md +3 -0
- package/dist/{actor-BXsV2bEo.js → actor-C-FuEZU4.js} +220 -705
- package/dist/{actor-C1Euqngb.d.ts → actor-DqFajh9s.d.ts} +2 -2
- package/dist/{actor-Cn_Wo2Sr.cjs → actor-_9UN5RVT.cjs} +952 -1479
- package/dist/{actor-Ydzhc8dj.d.cts → actor-f2NtjyCg.d.cts} +2 -2
- package/dist/{actor-B1L4qxfi.js → actor-rOm0sXHU.js} +1 -1
- 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-C-PtyBzf.js → builder-hArjoWjW.js} +3 -4
- package/dist/{client-DjT_tegg.d.cts → client-94iWEfQa.d.cts} +3 -75
- package/dist/{client-DF8anIB5.d.ts → client-BsGzbnV-.d.ts} +3 -75
- package/dist/{client-DQu9XLnH.js → client-pY7-3icS.js} +3 -22
- package/dist/compat/mod.d.cts +10 -12
- package/dist/compat/mod.d.ts +10 -12
- package/dist/compat/transformers.test.js +20 -20
- package/dist/{context-CwUAkopp.d.cts → context-PxGADCsD.d.cts} +152 -27
- package/dist/{context-CXUibY4L.d.ts → context-V-XS2_6O.d.ts} +152 -27
- package/dist/{authdocloader-Cx_DgATa.js → docloader-CE1lRhEV.js} +17 -8
- package/dist/{esm-BHq8vvU6.js → esm-BEFbR5eN.js} +32 -17
- package/dist/federation/builder.test.js +9 -12
- package/dist/federation/collection.test.js +7 -9
- package/dist/federation/handler.test.js +28 -149
- package/dist/federation/idempotency.test.js +26 -27
- package/dist/federation/inbox.test.js +4 -6
- package/dist/federation/keycache.test.js +3 -4
- package/dist/federation/kv.test.js +6 -8
- package/dist/federation/middleware.test.js +270 -93
- package/dist/federation/mod.cjs +9 -11
- package/dist/federation/mod.d.cts +10 -12
- package/dist/federation/mod.d.ts +10 -12
- package/dist/federation/mod.js +9 -11
- package/dist/federation/mq.test.js +10 -10
- package/dist/federation/negotiation.test.js +26 -0
- package/dist/federation/retry.test.js +4 -5
- package/dist/federation/router.test.js +6 -8
- package/dist/federation/send.test.js +14 -16
- package/dist/{http-wsGR6KkT.d.ts → http-BbO0ejuk.d.ts} +2 -2
- package/dist/{http-ZepHDnAP.js → http-Bmx7ea3F.js} +2 -2
- package/dist/{http-B1_DzfAU.d.cts → http-M8k5mKc0.d.cts} +2 -2
- package/dist/{http-C4Oi5eIq.js → http-Q_l4fCEE.js} +256 -6
- package/dist/{http-BtKvhGUI.cjs → http-So5V_Tgv.cjs} +289 -9
- package/dist/{inbox-D6-aBaqR.js → inbox-B9PjFn2S.js} +2 -7
- package/dist/{key-Dwqt62bf.js → key-khQpfFdw.js} +3 -2
- package/dist/{keycache-DZ51X_tY.js → keycache-BU3fsZFa.js} +1 -1
- package/dist/{keys-D9SlcZrs.js → keys-BaMFfIdL.js} +2 -1
- package/dist/kv-cache-DN9pfMBe.js +94 -0
- package/dist/kv-cache-R1oW382l.js +122 -0
- package/dist/kv-cache-X2ggcnHI.cjs +134 -0
- package/dist/{ld-CTGnKRt0.js → ld-BLMebnep.js} +3 -2
- package/dist/{type-BBugK2n5.js → lookup-C7SSHgK7.js} +542 -5394
- package/dist/{lookup-aQOlOGdF.cjs → lookup-CLaDFNx1.cjs} +134 -5
- package/dist/{lookup-BnxmqZLB.js → lookup-CtC3x1M6.js} +125 -2
- package/dist/middleware-BYBwqvTv.cjs +15 -0
- package/dist/{middleware-BtJedzGJ.js → middleware-Bda2JO66.js} +38 -84
- package/dist/{middleware-DHDM-Bzb.js → middleware-C3ml59Hp.js} +43 -146
- package/dist/middleware-DC7h2qq-.js +26 -0
- package/dist/{middleware-DTIx6DRv.cjs → middleware-DFLterpx.cjs} +58 -104
- package/dist/middleware-mQR2SM7T.js +15 -0
- package/dist/{mod-CDObsV1d.d.ts → mod-BlVovdcy.d.ts} +2 -2
- package/dist/{mod-mXx9V0q5.d.cts → mod-BoRKfJPE.d.cts} +2 -2
- package/dist/{mod-BUbqxBev.d.cts → mod-BxRCHTz-.d.cts} +2 -2
- package/dist/{mod-jQ4OODsl.d.cts → mod-C58MZ7Wx.d.cts} +1 -1
- package/dist/{mod-BcObK1Lz.d.ts → mod-Cdo6SYlJ.d.ts} +2 -2
- package/dist/{mod-DgcYoyZK.d.ts → mod-D5Z2tISD.d.ts} +3 -3
- package/dist/mod-DMpuiKXi.d.cts +107 -0
- package/dist/{mod-fjqfsrty.d.cts → mod-DgxG-byT.d.cts} +3 -3
- package/dist/{mod-DBzN0aCM.d.ts → mod-Ds0mpFZU.d.ts} +1 -1
- package/dist/mod-aAE2wOWV.d.ts +109 -0
- package/dist/mod.cjs +19 -34
- package/dist/mod.d.cts +15 -17
- package/dist/mod.d.ts +15 -17
- package/dist/mod.js +14 -16
- package/dist/negotiation-C4nFufNk.js +71 -0
- package/dist/nodeinfo/client.test.js +30 -111
- package/dist/nodeinfo/handler.test.js +25 -26
- package/dist/nodeinfo/mod.cjs +3 -6
- package/dist/nodeinfo/mod.d.cts +3 -5
- package/dist/nodeinfo/mod.d.ts +3 -5
- package/dist/nodeinfo/mod.js +3 -4
- package/dist/nodeinfo/types.test.js +8 -15
- package/dist/{owner-6KSEp9eV.d.cts → owner-B4HbyP8s.d.cts} +3 -3
- package/dist/{owner-DxpcLcST.js → owner-XzzTSr4S.js} +3 -2
- package/dist/{owner-BbeUDvOu.d.ts → owner-kQRGVXG1.d.ts} +3 -3
- package/dist/{proof-OAc97dy3.js → proof-B-qOSAuQ.js} +5 -4
- package/dist/{proof-ADZwDCs9.cjs → proof-BzJkFBBF.cjs} +18 -17
- package/dist/{proof-DBJnG2Jh.js → proof-C9sfVit1.js} +2 -2
- package/dist/{send-Df2mI5_D.js → send-yEkZlxzW.js} +2 -2
- package/dist/sig/http.test.js +12 -13
- package/dist/sig/key.test.js +9 -11
- package/dist/sig/ld.test.js +8 -10
- package/dist/sig/mod.cjs +9 -11
- package/dist/sig/mod.d.cts +5 -7
- package/dist/sig/mod.d.ts +5 -7
- package/dist/sig/mod.js +5 -7
- package/dist/sig/owner.test.js +11 -13
- package/dist/sig/proof.test.js +13 -14
- package/dist/src/vocab/accept.yaml +1 -1
- package/dist/src/vocab/activity.yaml +1 -1
- package/dist/src/vocab/add.yaml +1 -1
- package/dist/src/vocab/announce.yaml +1 -1
- package/dist/src/vocab/application.yaml +1 -1
- package/dist/src/vocab/arrive.yaml +1 -1
- package/dist/src/vocab/article.yaml +1 -1
- package/dist/src/vocab/audio.yaml +1 -1
- package/dist/src/vocab/block.yaml +1 -1
- package/dist/src/vocab/chatmessage.yaml +1 -1
- package/dist/src/vocab/collection.yaml +1 -1
- package/dist/src/vocab/collectionpage.yaml +1 -1
- package/dist/src/vocab/create.yaml +1 -1
- package/dist/src/vocab/dataintegrityproof.yaml +1 -1
- package/dist/src/vocab/delete.yaml +1 -1
- package/dist/src/vocab/didservice.yaml +1 -1
- package/dist/src/vocab/dislike.yaml +1 -1
- package/dist/src/vocab/document.yaml +1 -1
- package/dist/src/vocab/emoji.yaml +1 -1
- package/dist/src/vocab/emojireact.yaml +1 -1
- package/dist/src/vocab/endpoints.yaml +1 -1
- package/dist/src/vocab/event.yaml +1 -1
- package/dist/src/vocab/export.yaml +1 -1
- package/dist/src/vocab/flag.yaml +1 -1
- package/dist/src/vocab/follow.yaml +1 -1
- package/dist/src/vocab/group.yaml +1 -1
- package/dist/src/vocab/hashtag.yaml +1 -1
- package/dist/src/vocab/ignore.yaml +1 -1
- package/dist/src/vocab/image.yaml +1 -1
- package/dist/src/vocab/intransitiveactivity.yaml +1 -1
- package/dist/src/vocab/invite.yaml +1 -1
- package/dist/src/vocab/join.yaml +1 -1
- package/dist/src/vocab/key.yaml +1 -1
- package/dist/src/vocab/leave.yaml +1 -1
- package/dist/src/vocab/like.yaml +1 -1
- package/dist/src/vocab/link.yaml +1 -1
- package/dist/src/vocab/listen.yaml +1 -1
- package/dist/src/vocab/mention.yaml +1 -1
- package/dist/src/vocab/move.yaml +1 -1
- package/dist/src/vocab/multikey.yaml +1 -1
- package/dist/src/vocab/note.yaml +1 -1
- package/dist/src/vocab/object.yaml +1 -1
- package/dist/src/vocab/offer.yaml +1 -1
- package/dist/src/vocab/orderedcollection.yaml +1 -1
- package/dist/src/vocab/orderedcollectionpage.yaml +1 -1
- package/dist/src/vocab/organization.yaml +1 -1
- package/dist/src/vocab/page.yaml +1 -1
- package/dist/src/vocab/person.yaml +1 -1
- package/dist/src/vocab/place.yaml +1 -1
- package/dist/src/vocab/profile.yaml +1 -1
- package/dist/src/vocab/propertyvalue.yaml +1 -1
- package/dist/src/vocab/question.yaml +1 -1
- package/dist/src/vocab/read.yaml +1 -1
- package/dist/src/vocab/reject.yaml +1 -1
- package/dist/src/vocab/relationship.yaml +1 -1
- package/dist/src/vocab/remove.yaml +1 -1
- package/dist/src/vocab/service.yaml +1 -1
- package/dist/src/vocab/source.yaml +1 -1
- package/dist/src/vocab/tentativeaccept.yaml +1 -1
- package/dist/src/vocab/tentativereject.yaml +1 -1
- package/dist/src/vocab/tombstone.yaml +1 -1
- package/dist/src/vocab/travel.yaml +1 -1
- package/dist/src/vocab/undo.yaml +1 -1
- package/dist/src/vocab/update.yaml +1 -1
- package/dist/src/vocab/video.yaml +1 -1
- package/dist/src/vocab/view.yaml +1 -1
- package/dist/testing/docloader.test.js +6 -8
- package/dist/testing/mod.d.ts +10 -119
- package/dist/testing/mod.js +2 -3
- package/dist/{testing-J7AQVhyi.js → testing-D-nLIHkh.js} +1 -2
- package/dist/{types-C-qRy7Sr.js → types-BtUjyi5y.js} +5 -166
- package/dist/{types-BIgY6c-l.js → types-C2XVl6gj.js} +1 -3
- package/dist/{types-Bzu6UrRZ.cjs → types-CWgzGaqk.cjs} +6 -179
- package/dist/{runtime/authdocloader.test.js → utils/docloader.test.js} +14 -15
- package/dist/utils/kv-cache.test.js +209 -0
- package/dist/utils/mod.cjs +12 -0
- package/dist/utils/mod.d.cts +5 -0
- package/dist/utils/mod.d.ts +7 -0
- package/dist/utils/mod.js +11 -0
- package/dist/vocab/actor.test.js +8 -10
- package/dist/vocab/lookup.test.js +8 -10
- package/dist/vocab/mod.cjs +3 -4
- package/dist/vocab/mod.d.cts +3 -5
- package/dist/vocab/mod.d.ts +3 -5
- package/dist/vocab/mod.js +3 -4
- package/dist/vocab/type.test.js +2 -3
- package/dist/vocab/vocab.test.js +7618 -1973
- package/dist/{vocab-CDHNj5zp.d.ts → vocab-BCWe1Ih5.d.ts} +9 -25
- package/dist/{vocab-BmNpY-Qt.cjs → vocab-C96aggZM.cjs} +5 -5
- package/dist/{vocab-Cfs0937i.d.cts → vocab-CeDBzu-f.d.cts} +9 -25
- package/dist/{vocab-LbNRAL-4.js → vocab-axlR_8k0.js} +3 -3
- package/dist/webfinger/handler.test.js +24 -25
- package/dist/webfinger/lookup.test.js +7 -9
- package/dist/webfinger/mod.cjs +2 -3
- package/dist/webfinger/mod.d.cts +1 -3
- package/dist/webfinger/mod.d.ts +1 -3
- package/dist/webfinger/mod.js +2 -3
- package/package.json +20 -51
- package/dist/assert_throws-BOO88avQ.js +0 -39
- package/dist/authdocloader-D9EszOkX.js +0 -52
- package/dist/authdocloader-Drjjh5Im.cjs +0 -58
- package/dist/denokv-D0nfNQ1x.js +0 -57
- package/dist/docloader-Bmu3XCd9.js +0 -4825
- package/dist/docloader-Ca3eoIku.cjs +0 -4891
- package/dist/docloader-CxWcuWqQ.d.ts +0 -221
- package/dist/docloader-D-MrRyHl.d.cts +0 -219
- package/dist/key-B0fFsgYk.js +0 -10
- package/dist/key-BvTvHoN1.js +0 -10
- package/dist/key-CPuhWBwH.cjs +0 -290
- package/dist/key-DUfn16_4.js +0 -260
- package/dist/key-DZieB9_P.cjs +0 -10
- package/dist/lookup-DSMnJERg.js +0 -336
- package/dist/middleware-BnRluVn4.js +0 -17
- package/dist/middleware-CkMXhJ9g.cjs +0 -17
- package/dist/middleware-DhE-His4.js +0 -26
- package/dist/mod-CIbqfZW0.d.ts +0 -104
- package/dist/mod-Dt-G9ZOS.d.cts +0 -102
- package/dist/mq-B7R1Q-M5.d.cts +0 -140
- package/dist/mq-CRGm1e_F.d.ts +0 -143
- package/dist/nodeinfo/semver.test.js +0 -143
- package/dist/runtime/docloader.test.js +0 -588
- package/dist/runtime/key.test.d.ts +0 -3
- package/dist/runtime/key.test.js +0 -103
- package/dist/runtime/langstr.test.d.ts +0 -3
- package/dist/runtime/langstr.test.js +0 -40
- 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/semver-dArNLkR9.js +0 -149
- package/dist/vocab/schema.yaml +0 -247
- 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/{collection-CSzG2j1P.js → collection-BzWsN9pB.js} +0 -0
- /package/dist/{nodeinfo/semver.test.d.ts → federation/negotiation.test.d.ts} +0 -0
- /package/dist/{federation-H2_En3j5.cjs → federation-CRpdnOMS.cjs} +0 -0
- /package/dist/{federation-D1U8YY9t.js → federation-jcR8-ZxP.js} +0 -0
- /package/dist/{kv-C7sopW2E.d.ts → kv-BKNZ-Tb-.d.ts} +0 -0
- /package/dist/{kv-63Cil1MD.d.cts → kv-Bxr0Q87_.d.cts} +0 -0
- /package/dist/{mod-C2tOeRkN.d.cts → mod-B-hUPT2N.d.cts} +0 -0
- /package/dist/{mod-1pDWKvUL.d.ts → mod-CVgZgliM.d.ts} +0 -0
- /package/dist/{mod-FZd39qVq.d.cts → mod-CcDPcLJW.d.cts} +0 -0
- /package/dist/{mod-g0xFzAP9.d.ts → mod-bjzj5QIb.d.ts} +0 -0
- /package/dist/{nodeinfo-DfycQ8Wf.js → nodeinfo-BnthBobC.js} +0 -0
- /package/dist/{nodeinfo-Co9lJrWl.cjs → nodeinfo-CdN0rEnZ.cjs} +0 -0
- /package/dist/{otel-Chy5T2Xh.js → otel-1BmGPuZc.js} +0 -0
- /package/dist/{retry-D4GJ670a.js → retry-CfF8Gn4d.js} +0 -0
- /package/dist/{runtime-DPYEDf-o.js → sig-C34-oHBl.js} +0 -0
- /package/dist/{runtime-C58AJWSv.cjs → sig-YYj5tCnr.cjs} +0 -0
- /package/dist/{std__assert-X-_kMxKM.js → std__assert-DWivtrGR.js} +0 -0
- /package/dist/{runtime → utils}/docloader.test.d.ts +0 -0
- /package/dist/{runtime/authdocloader.test.d.ts → utils/kv-cache.test.d.ts} +0 -0
- /package/dist/{sig-Cj3tk-ig.js → utils-D-Va7aXC.js} +0 -0
- /package/dist/{sig-ByHXzqUi.cjs → utils-DyRU1gdZ.cjs} +0 -0
- /package/dist/{webfinger-De_bU0iE.js → webfinger-C72Y8lrh.js} +0 -0
- /package/dist/{webfinger-BjOEdFPs.cjs → webfinger-vAtLmxOF.cjs} +0 -0
package/dist/federation/mod.cjs
CHANGED
|
@@ -3,17 +3,15 @@
|
|
|
3
3
|
const { URLPattern } = require("urlpattern-polyfill");
|
|
4
4
|
|
|
5
5
|
require('../transformers-CoBS-oFG.cjs');
|
|
6
|
-
require('../
|
|
7
|
-
require('../actor-
|
|
8
|
-
const require_middleware = require('../middleware-
|
|
9
|
-
require('../
|
|
10
|
-
require('../
|
|
11
|
-
require('../
|
|
12
|
-
require('../
|
|
13
|
-
|
|
14
|
-
require('../
|
|
15
|
-
require('../authdocloader-Drjjh5Im.cjs');
|
|
16
|
-
require('../vocab-BmNpY-Qt.cjs');
|
|
6
|
+
require('../lookup-CLaDFNx1.cjs');
|
|
7
|
+
require('../actor-_9UN5RVT.cjs');
|
|
8
|
+
const require_middleware = require('../middleware-DFLterpx.cjs');
|
|
9
|
+
require('../http-So5V_Tgv.cjs');
|
|
10
|
+
require('../proof-BzJkFBBF.cjs');
|
|
11
|
+
const require_federation = require('../federation-CRpdnOMS.cjs');
|
|
12
|
+
require('../types-CWgzGaqk.cjs');
|
|
13
|
+
require('../kv-cache-X2ggcnHI.cjs');
|
|
14
|
+
require('../vocab-C96aggZM.cjs');
|
|
17
15
|
|
|
18
16
|
exports.InProcessMessageQueue = require_federation.InProcessMessageQueue;
|
|
19
17
|
exports.MemoryKvStore = require_federation.MemoryKvStore;
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import "../
|
|
3
|
-
import "../
|
|
4
|
-
import "../
|
|
5
|
-
import "../
|
|
6
|
-
import "../
|
|
7
|
-
import "../
|
|
8
|
-
import "../
|
|
9
|
-
import "../
|
|
10
|
-
import
|
|
11
|
-
import { InProcessMessageQueue, InProcessMessageQueueOptions, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, ParallelMessageQueue } from "../mq-B7R1Q-M5.cjs";
|
|
12
|
-
import "../mod-C2tOeRkN.cjs";
|
|
1
|
+
import "../client-94iWEfQa.cjs";
|
|
2
|
+
import "../vocab-CeDBzu-f.cjs";
|
|
3
|
+
import "../actor-f2NtjyCg.cjs";
|
|
4
|
+
import "../http-M8k5mKc0.cjs";
|
|
5
|
+
import "../owner-B4HbyP8s.cjs";
|
|
6
|
+
import "../mod-BxRCHTz-.cjs";
|
|
7
|
+
import "../mod-C58MZ7Wx.cjs";
|
|
8
|
+
import { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable } from "../context-PxGADCsD.cjs";
|
|
9
|
+
import { KvKey, KvStore, KvStoreSetOptions, MemoryKvStore } from "../kv-Bxr0Q87_.cjs";
|
|
10
|
+
import "../mod-CcDPcLJW.cjs";
|
|
13
11
|
export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable };
|
package/dist/federation/mod.d.ts
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
import
|
|
4
|
-
import "../
|
|
5
|
-
import "../
|
|
6
|
-
import "../
|
|
7
|
-
import "../
|
|
8
|
-
import "../
|
|
9
|
-
import "../
|
|
10
|
-
import "../
|
|
11
|
-
import "../
|
|
12
|
-
import
|
|
13
|
-
import { InProcessMessageQueue, InProcessMessageQueueOptions, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, ParallelMessageQueue } from "../mq-CRGm1e_F.js";
|
|
14
|
-
import "../mod-g0xFzAP9.js";
|
|
3
|
+
import "../client-BsGzbnV-.js";
|
|
4
|
+
import "../vocab-BCWe1Ih5.js";
|
|
5
|
+
import "../actor-DqFajh9s.js";
|
|
6
|
+
import "../http-BbO0ejuk.js";
|
|
7
|
+
import "../owner-kQRGVXG1.js";
|
|
8
|
+
import "../mod-BlVovdcy.js";
|
|
9
|
+
import "../mod-Ds0mpFZU.js";
|
|
10
|
+
import { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable } from "../context-V-XS2_6O.js";
|
|
11
|
+
import { KvKey, KvStore, KvStoreSetOptions, MemoryKvStore } from "../kv-BKNZ-Tb-.js";
|
|
12
|
+
import "../mod-bjzj5QIb.js";
|
|
15
13
|
export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable };
|
package/dist/federation/mod.js
CHANGED
|
@@ -3,16 +3,14 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
|
|
5
5
|
import "../transformers-BFT6d7J5.js";
|
|
6
|
-
import "../
|
|
7
|
-
import "../actor-
|
|
8
|
-
import { Router, RouterError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable } from "../middleware-
|
|
9
|
-
import "../
|
|
10
|
-
import "../
|
|
11
|
-
import "../
|
|
12
|
-
import "../
|
|
13
|
-
import
|
|
14
|
-
import "../
|
|
15
|
-
import "../authdocloader-D9EszOkX.js";
|
|
16
|
-
import "../vocab-LbNRAL-4.js";
|
|
6
|
+
import "../lookup-CtC3x1M6.js";
|
|
7
|
+
import "../actor-C-FuEZU4.js";
|
|
8
|
+
import { Router, RouterError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable } from "../middleware-Bda2JO66.js";
|
|
9
|
+
import "../http-Q_l4fCEE.js";
|
|
10
|
+
import "../proof-B-qOSAuQ.js";
|
|
11
|
+
import { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue } from "../federation-jcR8-ZxP.js";
|
|
12
|
+
import "../types-BtUjyi5y.js";
|
|
13
|
+
import "../kv-cache-R1oW382l.js";
|
|
14
|
+
import "../vocab-axlR_8k0.js";
|
|
17
15
|
|
|
18
16
|
export { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue, Router, RouterError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable };
|
|
@@ -3,17 +3,15 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import "../
|
|
6
|
+
import "../lookup-C7SSHgK7.js";
|
|
7
7
|
import { assertEquals } from "../assert_equals-DSbWqCm3.js";
|
|
8
8
|
import { assert } from "../assert-MZs1qjMx.js";
|
|
9
9
|
import "../assert_instance_of-DHz7EHNU.js";
|
|
10
|
-
import "../
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import
|
|
14
|
-
import "../
|
|
15
|
-
import "../assert_not_equals-f3m3epl3.js";
|
|
16
|
-
import "../assert_throws-BOO88avQ.js";
|
|
10
|
+
import { test } from "../testing-D-nLIHkh.js";
|
|
11
|
+
import { assertGreater, assertGreaterOrEqual } from "../std__assert-DWivtrGR.js";
|
|
12
|
+
import { assertFalse } from "../assert_rejects-Ce45JcFg.js";
|
|
13
|
+
import "../assert_throws-BNXdRGWP.js";
|
|
14
|
+
import "../assert_not_equals-C80BG-_5.js";
|
|
17
15
|
import { delay } from "es-toolkit";
|
|
18
16
|
|
|
19
17
|
//#region src/federation/mq.ts
|
|
@@ -227,7 +225,8 @@ test("InProcessMessageQueue", async (t) => {
|
|
|
227
225
|
});
|
|
228
226
|
test("MessageQueue.nativeRetrial", async (t) => {
|
|
229
227
|
if ("Deno" in globalThis && "openKv" in globalThis.Deno && typeof globalThis.Deno.openKv === "function") await t.step("DenoKvMessageQueue", async () => {
|
|
230
|
-
const
|
|
228
|
+
const packageName = "@fedify/denokv";
|
|
229
|
+
const { DenoKvMessageQueue } = await import(packageName);
|
|
231
230
|
const mq = new DenoKvMessageQueue(await globalThis.Deno.openKv(":memory:"));
|
|
232
231
|
assert(mq.nativeRetrial);
|
|
233
232
|
if (Symbol.dispose in mq) {
|
|
@@ -266,7 +265,8 @@ test("MessageQueue.nativeRetrial", async (t) => {
|
|
|
266
265
|
});
|
|
267
266
|
const queues = { InProcessMessageQueue: () => Promise.resolve(new InProcessMessageQueue()) };
|
|
268
267
|
if ("Deno" in globalThis && "openKv" in globalThis.Deno && typeof globalThis.Deno.openKv === "function") {
|
|
269
|
-
const
|
|
268
|
+
const packageName = "@fedify/denokv";
|
|
269
|
+
const { DenoKvMessageQueue } = await import(packageName);
|
|
270
270
|
queues.DenoKvMessageQueue = async () => new DenoKvMessageQueue(await globalThis.Deno.openKv(":memory:"));
|
|
271
271
|
}
|
|
272
272
|
for (const mqName in queues) test({
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
|
|
2
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
3
|
+
import { URLPattern } from "urlpattern-polyfill";
|
|
4
|
+
globalThis.addEventListener = () => {};
|
|
5
|
+
|
|
6
|
+
import "../lookup-C7SSHgK7.js";
|
|
7
|
+
import "../assert_equals-DSbWqCm3.js";
|
|
8
|
+
import { assert } from "../assert-MZs1qjMx.js";
|
|
9
|
+
import "../assert_instance_of-DHz7EHNU.js";
|
|
10
|
+
import { acceptsJsonLd } from "../negotiation-C4nFufNk.js";
|
|
11
|
+
import { test } from "../testing-D-nLIHkh.js";
|
|
12
|
+
import "../std__assert-DWivtrGR.js";
|
|
13
|
+
import { assertFalse } from "../assert_rejects-Ce45JcFg.js";
|
|
14
|
+
import "../assert_throws-BNXdRGWP.js";
|
|
15
|
+
import "../assert_not_equals-C80BG-_5.js";
|
|
16
|
+
|
|
17
|
+
//#region src/federation/negotiation.test.ts
|
|
18
|
+
test("acceptsJsonLd()", () => {
|
|
19
|
+
assert(acceptsJsonLd(new Request("https://example.com/", { headers: { Accept: "application/activity+json" } })));
|
|
20
|
+
assert(acceptsJsonLd(new Request("https://example.com/", { headers: { Accept: "application/ld+json" } })));
|
|
21
|
+
assert(acceptsJsonLd(new Request("https://example.com/", { headers: { Accept: "application/json" } })));
|
|
22
|
+
assertFalse(acceptsJsonLd(new Request("https://example.com/", { headers: { Accept: "application/ld+json; q=0.5, text/html; q=0.8" } })));
|
|
23
|
+
assertFalse(acceptsJsonLd(new Request("https://example.com/", { headers: { Accept: "application/ld+json; q=0.4, application/xhtml+xml; q=0.9" } })));
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
@@ -3,12 +3,11 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import "../
|
|
6
|
+
import "../lookup-C7SSHgK7.js";
|
|
7
7
|
import { AssertionError, assertEquals } from "../assert_equals-DSbWqCm3.js";
|
|
8
|
-
import "../
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { assertNotEquals } from "../assert_not_equals-f3m3epl3.js";
|
|
8
|
+
import { createExponentialBackoffPolicy } from "../retry-CfF8Gn4d.js";
|
|
9
|
+
import { test } from "../testing-D-nLIHkh.js";
|
|
10
|
+
import { assertNotEquals } from "../assert_not_equals-C80BG-_5.js";
|
|
12
11
|
|
|
13
12
|
//#region src/federation/retry.test.ts
|
|
14
13
|
test("createExponentialBackoffPolicy()", () => {
|
|
@@ -3,17 +3,15 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import "../
|
|
6
|
+
import { Router, RouterError } from "../lookup-C7SSHgK7.js";
|
|
7
7
|
import { assertEquals } from "../assert_equals-DSbWqCm3.js";
|
|
8
8
|
import { assert } from "../assert-MZs1qjMx.js";
|
|
9
9
|
import "../assert_instance_of-DHz7EHNU.js";
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
12
|
-
import "../
|
|
13
|
-
import {
|
|
14
|
-
import "../
|
|
15
|
-
import "../assert_not_equals-f3m3epl3.js";
|
|
16
|
-
import { assertThrows } from "../assert_throws-BOO88avQ.js";
|
|
10
|
+
import { test } from "../testing-D-nLIHkh.js";
|
|
11
|
+
import "../std__assert-DWivtrGR.js";
|
|
12
|
+
import { assertFalse } from "../assert_rejects-Ce45JcFg.js";
|
|
13
|
+
import { assertThrows } from "../assert_throws-BNXdRGWP.js";
|
|
14
|
+
import "../assert_not_equals-C80BG-_5.js";
|
|
17
15
|
|
|
18
16
|
//#region src/federation/router.test.ts
|
|
19
17
|
function setUp(options = {}) {
|
|
@@ -3,25 +3,23 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import { Activity, Application, Endpoints, Group, Person, Service } from "../
|
|
6
|
+
import { Activity, Application, Endpoints, Group, Person, Service } from "../lookup-C7SSHgK7.js";
|
|
7
7
|
import { assertEquals } from "../assert_equals-DSbWqCm3.js";
|
|
8
8
|
import { assert } from "../assert-MZs1qjMx.js";
|
|
9
9
|
import "../assert_instance_of-DHz7EHNU.js";
|
|
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 { createTestTracerProvider } from "../otel-Chy5T2Xh.js";
|
|
24
|
-
import { esm_default } from "../esm-BHq8vvU6.js";
|
|
10
|
+
import "../actor-rOm0sXHU.js";
|
|
11
|
+
import "../key-khQpfFdw.js";
|
|
12
|
+
import { verifyRequest } from "../http-Bmx7ea3F.js";
|
|
13
|
+
import { doesActorOwnKey } from "../owner-XzzTSr4S.js";
|
|
14
|
+
import { extractInboxes, sendActivity } from "../send-yEkZlxzW.js";
|
|
15
|
+
import { mockDocumentLoader, test } from "../testing-D-nLIHkh.js";
|
|
16
|
+
import "../std__assert-DWivtrGR.js";
|
|
17
|
+
import { assertFalse, assertRejects } from "../assert_rejects-Ce45JcFg.js";
|
|
18
|
+
import "../assert_throws-BNXdRGWP.js";
|
|
19
|
+
import { assertNotEquals } from "../assert_not_equals-C80BG-_5.js";
|
|
20
|
+
import { ed25519Multikey, ed25519PrivateKey, rsaPrivateKey2, rsaPublicKey2 } from "../keys-BaMFfIdL.js";
|
|
21
|
+
import { createTestTracerProvider } from "../otel-1BmGPuZc.js";
|
|
22
|
+
import { esm_default } from "../esm-BEFbR5eN.js";
|
|
25
23
|
|
|
26
24
|
//#region src/federation/send.test.ts
|
|
27
25
|
test("extractInboxes()", () => {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
import {
|
|
4
|
-
import { CryptographicKey, Multikey } from "./vocab-CDHNj5zp.js";
|
|
3
|
+
import { CryptographicKey, Multikey } from "./vocab-BCWe1Ih5.js";
|
|
5
4
|
import { TracerProvider } from "@opentelemetry/api";
|
|
5
|
+
import { DocumentLoader } from "@fedify/vocab-runtime";
|
|
6
6
|
|
|
7
7
|
//#region src/sig/key.d.ts
|
|
8
8
|
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
globalThis.addEventListener = () => {};
|
|
5
5
|
|
|
6
|
-
import { CryptographicKey, deno_default } from "./
|
|
7
|
-
import { fetchKey, validateCryptoKey } from "./key-
|
|
6
|
+
import { CryptographicKey, deno_default } from "./lookup-C7SSHgK7.js";
|
|
7
|
+
import { fetchKey, validateCryptoKey } from "./key-khQpfFdw.js";
|
|
8
8
|
import { getLogger } from "@logtape/logtape";
|
|
9
9
|
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
10
10
|
import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, ATTR_URL_FULL } from "@opentelemetry/semantic-conventions";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { CryptographicKey, Multikey } from "./vocab-CeDBzu-f.cjs";
|
|
2
|
+
import { DocumentLoader } from "@fedify/vocab-runtime";
|
|
3
3
|
import { TracerProvider } from "@opentelemetry/api";
|
|
4
4
|
|
|
5
5
|
//#region src/sig/key.d.ts
|
|
@@ -2,16 +2,266 @@
|
|
|
2
2
|
import { Temporal } from "@js-temporal/polyfill";
|
|
3
3
|
import { URLPattern } from "urlpattern-polyfill";
|
|
4
4
|
|
|
5
|
-
import { deno_default } from "./
|
|
6
|
-
import { CryptographicKey } from "./actor-
|
|
7
|
-
import { fetchKey, validateCryptoKey } from "./key-DUfn16_4.js";
|
|
5
|
+
import { deno_default } from "./lookup-CtC3x1M6.js";
|
|
6
|
+
import { CryptographicKey, Object as Object$1, isActor } from "./actor-C-FuEZU4.js";
|
|
8
7
|
import { getLogger } from "@logtape/logtape";
|
|
9
|
-
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
10
|
-
import {
|
|
8
|
+
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
9
|
+
import { getDocumentLoader } from "@fedify/vocab-runtime";
|
|
11
10
|
import { encodeHex } from "byte-encodings/hex";
|
|
12
11
|
import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, ATTR_URL_FULL } from "@opentelemetry/semantic-conventions";
|
|
12
|
+
import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
|
|
13
13
|
import { Item, decodeDict, encodeItem } from "structured-field-values";
|
|
14
14
|
|
|
15
|
+
//#region src/sig/key.ts
|
|
16
|
+
/**
|
|
17
|
+
* Checks if the given key is valid and supported. No-op if the key is valid,
|
|
18
|
+
* otherwise throws an error.
|
|
19
|
+
* @param key The key to check.
|
|
20
|
+
* @param type Which type of key to check. If not specified, the key can be
|
|
21
|
+
* either public or private.
|
|
22
|
+
* @throws {TypeError} If the key is invalid or unsupported.
|
|
23
|
+
*/
|
|
24
|
+
function validateCryptoKey(key, type) {
|
|
25
|
+
if (type != null && key.type !== type) throw new TypeError(`The key is not a ${type} key.`);
|
|
26
|
+
if (!key.extractable) throw new TypeError("The key is not extractable.");
|
|
27
|
+
if (key.algorithm.name !== "RSASSA-PKCS1-v1_5" && key.algorithm.name !== "Ed25519") throw new TypeError("Currently only RSASSA-PKCS1-v1_5 and Ed25519 keys are supported. More algorithms will be added in the future!");
|
|
28
|
+
if (key.algorithm.name === "RSASSA-PKCS1-v1_5") {
|
|
29
|
+
const algorithm = key.algorithm;
|
|
30
|
+
if (algorithm.hash.name !== "SHA-256") throw new TypeError("For compatibility with the existing Fediverse software (e.g., Mastodon), hash algorithm for RSASSA-PKCS1-v1_5 keys must be SHA-256.");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generates a key pair which is appropriate for Fedify.
|
|
35
|
+
* @param algorithm The algorithm to use. Currently only RSASSA-PKCS1-v1_5 and
|
|
36
|
+
* Ed25519 are supported.
|
|
37
|
+
* @returns The generated key pair.
|
|
38
|
+
* @throws {TypeError} If the algorithm is unsupported.
|
|
39
|
+
*/
|
|
40
|
+
function generateCryptoKeyPair(algorithm) {
|
|
41
|
+
if (algorithm == null) getLogger([
|
|
42
|
+
"fedify",
|
|
43
|
+
"sig",
|
|
44
|
+
"key"
|
|
45
|
+
]).warn("No algorithm specified. Using RSASSA-PKCS1-v1_5 by default, but it is recommended to specify the algorithm explicitly as the parameter will be required in the future.");
|
|
46
|
+
if (algorithm == null || algorithm === "RSASSA-PKCS1-v1_5") return crypto.subtle.generateKey({
|
|
47
|
+
name: "RSASSA-PKCS1-v1_5",
|
|
48
|
+
modulusLength: 4096,
|
|
49
|
+
publicExponent: new Uint8Array([
|
|
50
|
+
1,
|
|
51
|
+
0,
|
|
52
|
+
1
|
|
53
|
+
]),
|
|
54
|
+
hash: "SHA-256"
|
|
55
|
+
}, true, ["sign", "verify"]);
|
|
56
|
+
else if (algorithm === "Ed25519") return crypto.subtle.generateKey("Ed25519", true, ["sign", "verify"]);
|
|
57
|
+
throw new TypeError("Unsupported algorithm: " + algorithm);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Exports a key in JWK format.
|
|
61
|
+
* @param key The key to export. Either public or private key.
|
|
62
|
+
* @returns The exported key in JWK format. The key is suitable for
|
|
63
|
+
* serialization and storage.
|
|
64
|
+
* @throws {TypeError} If the key is invalid or unsupported.
|
|
65
|
+
*/
|
|
66
|
+
async function exportJwk(key) {
|
|
67
|
+
validateCryptoKey(key);
|
|
68
|
+
const jwk = await crypto.subtle.exportKey("jwk", key);
|
|
69
|
+
if (jwk.crv === "Ed25519") jwk.alg = "Ed25519";
|
|
70
|
+
return jwk;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Imports a key from JWK format.
|
|
74
|
+
* @param jwk The key in JWK format.
|
|
75
|
+
* @param type Which type of key to import, either `"public"` or `"private"`.
|
|
76
|
+
* @returns The imported key.
|
|
77
|
+
* @throws {TypeError} If the key is invalid or unsupported.
|
|
78
|
+
*/
|
|
79
|
+
async function importJwk(jwk, type) {
|
|
80
|
+
let key;
|
|
81
|
+
if (jwk.kty === "RSA" && jwk.alg === "RS256") key = await crypto.subtle.importKey("jwk", jwk, {
|
|
82
|
+
name: "RSASSA-PKCS1-v1_5",
|
|
83
|
+
hash: "SHA-256"
|
|
84
|
+
}, true, type === "public" ? ["verify"] : ["sign"]);
|
|
85
|
+
else if (jwk.kty === "OKP" && jwk.crv === "Ed25519") {
|
|
86
|
+
if (navigator?.userAgent === "Cloudflare-Workers") {
|
|
87
|
+
jwk = { ...jwk };
|
|
88
|
+
delete jwk.alg;
|
|
89
|
+
}
|
|
90
|
+
key = await crypto.subtle.importKey("jwk", jwk, "Ed25519", true, type === "public" ? ["verify"] : ["sign"]);
|
|
91
|
+
} else throw new TypeError("Unsupported JWK format.");
|
|
92
|
+
validateCryptoKey(key, type);
|
|
93
|
+
return key;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Fetches a {@link CryptographicKey} or {@link Multikey} from the given URL.
|
|
97
|
+
* If the given URL contains an {@link Actor} object, it tries to find
|
|
98
|
+
* the corresponding key in the `publicKey` or `assertionMethod` property.
|
|
99
|
+
* @template T The type of the key to fetch. Either {@link CryptographicKey}
|
|
100
|
+
* or {@link Multikey}.
|
|
101
|
+
* @param keyId The URL of the key.
|
|
102
|
+
* @param cls The class of the key to fetch. Either {@link CryptographicKey}
|
|
103
|
+
* or {@link Multikey}.
|
|
104
|
+
* @param options Options for fetching the key. See {@link FetchKeyOptions}.
|
|
105
|
+
* @returns The fetched key or `null` if the key is not found.
|
|
106
|
+
* @since 1.3.0
|
|
107
|
+
*/
|
|
108
|
+
function fetchKey(keyId, cls, options = {}) {
|
|
109
|
+
const tracerProvider = options.tracerProvider ?? trace.getTracerProvider();
|
|
110
|
+
const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
|
|
111
|
+
keyId = typeof keyId === "string" ? new URL(keyId) : keyId;
|
|
112
|
+
return tracer.startActiveSpan("activitypub.fetch_key", {
|
|
113
|
+
kind: SpanKind.CLIENT,
|
|
114
|
+
attributes: {
|
|
115
|
+
"http.method": "GET",
|
|
116
|
+
"url.full": keyId.href,
|
|
117
|
+
"url.scheme": keyId.protocol.replace(/:$/, ""),
|
|
118
|
+
"url.domain": keyId.hostname,
|
|
119
|
+
"url.path": keyId.pathname,
|
|
120
|
+
"url.query": keyId.search.replace(/^\?/, ""),
|
|
121
|
+
"url.fragment": keyId.hash.replace(/^#/, "")
|
|
122
|
+
}
|
|
123
|
+
}, async (span) => {
|
|
124
|
+
try {
|
|
125
|
+
const result = await fetchKeyInternal(keyId, cls, options);
|
|
126
|
+
span.setAttribute("activitypub.actor.key.cached", result.cached);
|
|
127
|
+
return result;
|
|
128
|
+
} catch (e) {
|
|
129
|
+
span.setStatus({
|
|
130
|
+
code: SpanStatusCode.ERROR,
|
|
131
|
+
message: String(e)
|
|
132
|
+
});
|
|
133
|
+
throw e;
|
|
134
|
+
} finally {
|
|
135
|
+
span.end();
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
async function fetchKeyInternal(keyId, cls, { documentLoader, contextLoader, keyCache, tracerProvider } = {}) {
|
|
140
|
+
const logger = getLogger([
|
|
141
|
+
"fedify",
|
|
142
|
+
"sig",
|
|
143
|
+
"key"
|
|
144
|
+
]);
|
|
145
|
+
const cacheKey = typeof keyId === "string" ? new URL(keyId) : keyId;
|
|
146
|
+
keyId = typeof keyId === "string" ? keyId : keyId.href;
|
|
147
|
+
if (keyCache != null) {
|
|
148
|
+
const cachedKey = await keyCache.get(cacheKey);
|
|
149
|
+
if (cachedKey instanceof cls && cachedKey.publicKey != null) {
|
|
150
|
+
logger.debug("Key {keyId} found in cache.", { keyId });
|
|
151
|
+
return {
|
|
152
|
+
key: cachedKey,
|
|
153
|
+
cached: true
|
|
154
|
+
};
|
|
155
|
+
} else if (cachedKey === null) {
|
|
156
|
+
logger.debug("Entry {keyId} found in cache, but it is unavailable.", { keyId });
|
|
157
|
+
return {
|
|
158
|
+
key: null,
|
|
159
|
+
cached: true
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
logger.debug("Fetching key {keyId} to verify signature...", { keyId });
|
|
164
|
+
let document;
|
|
165
|
+
try {
|
|
166
|
+
const remoteDocument = await (documentLoader ?? getDocumentLoader())(keyId);
|
|
167
|
+
document = remoteDocument.document;
|
|
168
|
+
} catch (_) {
|
|
169
|
+
logger.debug("Failed to fetch key {keyId}.", { keyId });
|
|
170
|
+
await keyCache?.set(cacheKey, null);
|
|
171
|
+
return {
|
|
172
|
+
key: null,
|
|
173
|
+
cached: false
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
let object;
|
|
177
|
+
try {
|
|
178
|
+
object = await Object$1.fromJsonLd(document, {
|
|
179
|
+
documentLoader,
|
|
180
|
+
contextLoader,
|
|
181
|
+
tracerProvider
|
|
182
|
+
});
|
|
183
|
+
} catch (e) {
|
|
184
|
+
if (!(e instanceof TypeError)) throw e;
|
|
185
|
+
try {
|
|
186
|
+
object = await cls.fromJsonLd(document, {
|
|
187
|
+
documentLoader,
|
|
188
|
+
contextLoader,
|
|
189
|
+
tracerProvider
|
|
190
|
+
});
|
|
191
|
+
} catch (e$1) {
|
|
192
|
+
if (e$1 instanceof TypeError) {
|
|
193
|
+
logger.debug("Failed to verify; key {keyId} returned an invalid object.", { keyId });
|
|
194
|
+
await keyCache?.set(cacheKey, null);
|
|
195
|
+
return {
|
|
196
|
+
key: null,
|
|
197
|
+
cached: false
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
throw e$1;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
let key = null;
|
|
204
|
+
if (object instanceof cls) key = object;
|
|
205
|
+
else if (isActor(object)) {
|
|
206
|
+
const keys = cls === CryptographicKey ? object.getPublicKeys({
|
|
207
|
+
documentLoader,
|
|
208
|
+
contextLoader,
|
|
209
|
+
tracerProvider
|
|
210
|
+
}) : object.getAssertionMethods({
|
|
211
|
+
documentLoader,
|
|
212
|
+
contextLoader,
|
|
213
|
+
tracerProvider
|
|
214
|
+
});
|
|
215
|
+
let length = 0;
|
|
216
|
+
let lastKey = null;
|
|
217
|
+
for await (const k of keys) {
|
|
218
|
+
length++;
|
|
219
|
+
lastKey = k;
|
|
220
|
+
if (k.id?.href === keyId) {
|
|
221
|
+
key = k;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const keyIdUrl = new URL(keyId);
|
|
226
|
+
if (key == null && keyIdUrl.hash === "" && length === 1) key = lastKey;
|
|
227
|
+
if (key == null) {
|
|
228
|
+
logger.debug("Failed to verify; object {keyId} returned an {actorType}, but has no key matching {keyId}.", {
|
|
229
|
+
keyId,
|
|
230
|
+
actorType: object.constructor.name
|
|
231
|
+
});
|
|
232
|
+
await keyCache?.set(cacheKey, null);
|
|
233
|
+
return {
|
|
234
|
+
key: null,
|
|
235
|
+
cached: false
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
} else {
|
|
239
|
+
logger.debug("Failed to verify; key {keyId} returned an invalid object.", { keyId });
|
|
240
|
+
await keyCache?.set(cacheKey, null);
|
|
241
|
+
return {
|
|
242
|
+
key: null,
|
|
243
|
+
cached: false
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
if (key.publicKey == null) {
|
|
247
|
+
logger.debug("Failed to verify; key {keyId} has no publicKeyPem field.", { keyId });
|
|
248
|
+
await keyCache?.set(cacheKey, null);
|
|
249
|
+
return {
|
|
250
|
+
key: null,
|
|
251
|
+
cached: false
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
if (keyCache != null) {
|
|
255
|
+
await keyCache.set(cacheKey, key);
|
|
256
|
+
logger.debug("Key {keyId} cached.", { keyId });
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
key,
|
|
260
|
+
cached: false
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
//#endregion
|
|
15
265
|
//#region src/sig/http.ts
|
|
16
266
|
/**
|
|
17
267
|
* Signs a request using the given private key.
|
|
@@ -805,4 +1055,4 @@ function timingSafeEqual(a, b) {
|
|
|
805
1055
|
}
|
|
806
1056
|
|
|
807
1057
|
//#endregion
|
|
808
|
-
export { doubleKnock, signRequest, verifyRequest };
|
|
1058
|
+
export { doubleKnock, exportJwk, fetchKey, generateCryptoKeyPair, importJwk, signRequest, validateCryptoKey, verifyRequest };
|