@fedify/fedify 2.5.0-dev.2440 → 2.5.0-dev.2448
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/dist/{activity-listener-C-BSbKI7.mjs → activity-listener-CELFAodc.mjs} +8 -4
- package/dist/{builder-CTasaZgj.mjs → builder-DbC8bn6k.mjs} +5 -5
- package/dist/compat/mod.d.cts +1 -1
- package/dist/compat/mod.d.ts +1 -1
- package/dist/compat/transformers.test.mjs +1 -1
- package/dist/{compound-proof-D5r-dQMr.mjs → compound-proof-heeXW2_A.mjs} +2 -2
- package/dist/{context-DPocjp1l.d.cts → context-BazwQrHn.d.cts} +307 -5
- package/dist/{context-8Tu9kea0.mjs → context-COHd1Rsh.mjs} +2 -0
- package/dist/{context-2wLkQrjb.d.ts → context-GlHrzdSP.d.ts} +307 -5
- package/dist/{deno-DR1uYWpm.mjs → deno-Dpewt_jJ.mjs} +1 -1
- package/dist/{docloader-BpCJ2dHm.mjs → docloader-CpsDyqVN.mjs} +2 -2
- package/dist/federation/builder.test.mjs +1 -1
- package/dist/federation/compound-fanout.test.mjs +3 -3
- package/dist/federation/handler-compound-proof.test.mjs +5 -5
- package/dist/federation/handler.test.mjs +21 -6
- package/dist/federation/hashlink-media.test.mjs +2 -2
- package/dist/federation/idempotency.test.mjs +2 -2
- package/dist/federation/inbox-actorless.test.d.mts +2 -0
- package/dist/federation/inbox-actorless.test.mjs +487 -0
- package/dist/federation/inbox-authentication.test.d.mts +2 -0
- package/dist/federation/inbox-authentication.test.mjs +116 -0
- package/dist/federation/inbox-report.test.mjs +5 -5
- package/dist/federation/inbox-view.test.d.mts +2 -0
- package/dist/federation/inbox-view.test.mjs +369 -0
- package/dist/federation/inbox.test.mjs +22 -12
- package/dist/federation/metrics.test.mjs +1 -1
- package/dist/federation/middleware.test.mjs +24 -9
- package/dist/federation/mod.cjs +2 -1
- package/dist/federation/mod.d.cts +3 -3
- package/dist/federation/mod.d.ts +3 -3
- package/dist/federation/mod.js +8 -2
- package/dist/federation/mq.test.mjs +36 -1
- package/dist/federation/outgoing-proof.test.mjs +4 -4
- package/dist/federation/portable-actor.test.mjs +3 -3
- package/dist/federation/portable-chain.test.mjs +3 -3
- package/dist/federation/portable-collection.test.mjs +4 -4
- package/dist/federation/portable-delivery.test.mjs +2 -2
- package/dist/federation/portable-gateway-keys.test.mjs +6 -6
- package/dist/federation/portable-inbox.test.mjs +4 -4
- package/dist/federation/portable-parse-uri.test.mjs +1 -1
- package/dist/federation/portable-route-activity.test.mjs +2 -2
- package/dist/federation/portable.test.mjs +3 -3
- package/dist/federation/send.test.mjs +3 -3
- package/dist/federation/tasks/enqueue.test.mjs +3 -3
- package/dist/federation/tasks/tasks.test.mjs +4 -4
- package/dist/federation/temporal.test.mjs +1 -1
- package/dist/federation/webfinger.test.mjs +2 -2
- package/dist/{federation-eYRUxkUW.cjs → federation-D8YexkP1.cjs} +1174 -132
- package/dist/{http-CgaoFGXV.js → http-BBr-VLil.js} +143 -16
- package/dist/{http-CRrg14tX.mjs → http-BZkyQIkb.mjs} +4 -4
- package/dist/{http-CmFHJm6o.cjs → http-CAl7Num5.cjs} +161 -16
- package/dist/inbox-authentication-DflPYlLL.mjs +171 -0
- package/dist/inbox-view-NE9wXdLo.mjs +385 -0
- package/dist/inbox-wDuMKaFW.mjs +312 -0
- package/dist/{kv-cache-MxJrD9gD.mjs → kv-cache-CTQSfkmp.mjs} +1 -1
- package/dist/{kv-cache-DvVRGOMw.cjs → kv-cache-CjgCOz3i.cjs} +1 -1
- package/dist/{kv-cache-DeagaIIB.js → kv-cache-U7uz5nx4.js} +1 -1
- package/dist/{ld-CUM16-EE.mjs → ld-CQFuiah9.mjs} +52 -9
- package/dist/ld-CcuZ4NZa.d.ts +250 -0
- package/dist/ld-Cel1RRZ5.d.cts +250 -0
- package/dist/{metrics-DIM8ZCKq.mjs → metrics-B-QxRSSR.mjs} +1 -1
- package/dist/{middleware-Bx_QxJ0s.mjs → middleware-BdlNa8BD.mjs} +1 -1
- package/dist/{middleware-CDdFG6xf.mjs → middleware-CuVa0UuS.mjs} +461 -99
- package/dist/{middleware-CGfFooYv.js → middleware-P-AZEQMn.js} +1171 -142
- package/dist/mod-B2783_3v.d.cts +154 -0
- package/dist/mod-BHQE-7WQ.d.ts +154 -0
- package/dist/{mod-Dm-7RdhR.d.ts → mod-DjZfJj9R.d.ts} +1 -1
- package/dist/{mod-DKGoPoQC.d.cts → mod-DvWOv2Ho.d.cts} +1 -1
- package/dist/mod.cjs +5 -4
- package/dist/mod.d.cts +6 -6
- package/dist/mod.d.ts +6 -6
- package/dist/mod.js +5 -5
- package/dist/{mq-Dm1Wmtm-.mjs → mq-eF96QxUT.mjs} +6 -0
- package/dist/nodeinfo/handler.test.mjs +2 -2
- package/dist/{owner-DoQDS_g0.mjs → owner-ccKkQOAf.mjs} +3 -3
- package/dist/{portable-collection-DiBqtGSM.mjs → portable-collection-CndnpXfo.mjs} +2 -2
- package/dist/{portable-collection-BVKSWfBe.js → portable-collection-DUlQ3s2M.js} +1 -1
- package/dist/{portable-collection-C-etRRF0.cjs → portable-collection-TC-kvkVI.cjs} +1 -1
- package/dist/{portable-key-DSRuCUpF.mjs → portable-key-D5tFOoV-.mjs} +1 -1
- package/dist/{proof-DWpruPWs.mjs → proof-DPoF06nz.mjs} +98 -10
- package/dist/{send-H0z9Ey5l.mjs → send-CF44O1Df.mjs} +3 -3
- package/dist/sig/compound-proof-discovery.test.mjs +1 -1
- package/dist/sig/compound-proof-producer.test.mjs +1 -1
- package/dist/sig/compound-proof-verification.test.mjs +2 -2
- package/dist/sig/compound-proof.test.mjs +2 -2
- package/dist/sig/http.test.mjs +2 -2
- package/dist/sig/key.test.mjs +1 -1
- package/dist/sig/ld.test.mjs +1 -1
- package/dist/sig/mitra-receive-interop.test.mjs +4 -4
- package/dist/sig/mitra-send-interop.test.mjs +3 -3
- package/dist/sig/mod.cjs +2 -2
- package/dist/sig/mod.d.cts +2 -2
- package/dist/sig/mod.d.ts +2 -2
- package/dist/sig/mod.js +2 -2
- package/dist/sig/owner.test.mjs +1 -1
- package/dist/sig/portable-collection.test.mjs +1 -1
- package/dist/sig/portable-interop.test.mjs +3 -3
- package/dist/sig/portable-key.test.mjs +5 -5
- package/dist/sig/proof.test.mjs +44 -4
- package/dist/sig/tootik-request-interop.test.mjs +4 -4
- package/dist/sig/tootik-send-interop.test.mjs +3 -3
- package/dist/sig/verification.test.mjs +3 -3
- package/dist/{temporal-BiSBCImA.mjs → temporal-XlZ4Wb94.mjs} +1 -1
- package/dist/testing/kv.test.mjs +1 -1
- package/dist/testing/mod.d.mts +265 -3
- package/dist/testing/mod.mjs +2 -2
- package/dist/{testing-t8xDeJZ5.mjs → testing-Dbr21vZk.mjs} +1 -1
- package/dist/utils/docloader.test.mjs +2 -2
- package/dist/utils/kv-cache.test.mjs +1 -1
- package/dist/utils/mod.cjs +1 -1
- package/dist/utils/mod.js +1 -1
- package/package.json +7 -7
- package/dist/inbox-BwPoSUEv.mjs +0 -188
- package/dist/mod-BRpER-B0.d.ts +0 -320
- package/dist/mod-xAfaLS4T.d.cts +0 -320
- package/dist/owner-BF0L9cMt.d.cts +0 -78
- package/dist/owner-BSzr5-I8.d.ts +0 -78
|
@@ -1,16 +1,45 @@
|
|
|
1
1
|
/// <reference lib="esnext.temporal" />
|
|
2
2
|
import { o as JsonValue, s as NodeInfo, t as GetNodeInfoOptions } from "./client-D-XP_Ccb.js";
|
|
3
3
|
import { _ as InboxVerificationKey, d as InboxProofPolicyFailureReason, h as InboxVerificationAttempt, w as VerifyRequestFailureReason, y as HttpMessageSignaturesSpec } from "./key-DhsBxxZN.js";
|
|
4
|
-
import {
|
|
4
|
+
import { m as GetKeyOwnerOptions, n as EffectiveContextLoaderPolicy } from "./ld-CcuZ4NZa.js";
|
|
5
5
|
import { n as KvStore, t as KvKey } from "./kv-B2mzK5tl.js";
|
|
6
6
|
import { Router } from "@fedify/uri-template";
|
|
7
7
|
import { Activity, Actor, Collection, CryptographicKey, Hashtag, Link, LookupObjectOptions, Multikey, Object as Object$1, Recipient, Tombstone, TraverseCollectionOptions } from "@fedify/vocab";
|
|
8
8
|
import { MeterProvider, Span, Tracer, TracerProvider } from "@opentelemetry/api";
|
|
9
|
-
import { AuthenticatedDocumentLoaderFactory, DocumentLoader, DocumentLoaderFactory, GetUserAgentOptions, PortableObjectVerifier } from "@fedify/vocab-runtime";
|
|
9
|
+
import { AuthenticatedDocumentLoaderFactory, DocumentLoader, DocumentLoaderFactory, GetUserAgentOptions, PortableObjectVerifier, RemoteDocument } from "@fedify/vocab-runtime";
|
|
10
10
|
import { Link as Link$1, LookupWebFingerOptions, ResourceDescriptor } from "@fedify/webfinger";
|
|
11
11
|
import { MeterProvider as MeterProvider$1, MetricReader } from "@opentelemetry/sdk-metrics";
|
|
12
12
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
13
13
|
|
|
14
|
+
//#region src/federation/activity-listener.d.ts
|
|
15
|
+
/**
|
|
16
|
+
* Options for an inbox listener.
|
|
17
|
+
* @since 2.5.0
|
|
18
|
+
*/
|
|
19
|
+
interface InboxListenerOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Whether activities that declare no `actor` at all may reach the listener.
|
|
22
|
+
*
|
|
23
|
+
* Some protocols identify the requester without an `actor`; for example,
|
|
24
|
+
* Mastodon sends [FEP-7aa9] `FeatureRequest` activities without one. When
|
|
25
|
+
* this is `true`, such an activity is dispatched to the listener if Fedify
|
|
26
|
+
* authenticated at least one principal for it, i.e., the signer of its
|
|
27
|
+
* Object Integrity Proofs or Linked Data Signature, or otherwise the signer
|
|
28
|
+
* of the HTTP request, and its `id`, if any, has the same origin as that
|
|
29
|
+
* principal. The listener is then responsible for authorizing the request
|
|
30
|
+
* with {@link InboxContext.authentication}, e.g., with
|
|
31
|
+
* `featureInteraction.verifyRequest()` from
|
|
32
|
+
* `@fedify/interaction-controls`.
|
|
33
|
+
*
|
|
34
|
+
* An activity that declares an `actor` is never affected by this option;
|
|
35
|
+
* its actor must be authenticated as usual.
|
|
36
|
+
*
|
|
37
|
+
* [FEP-7aa9]: https://w3id.org/fep/7aa9
|
|
38
|
+
* @default `false`
|
|
39
|
+
*/
|
|
40
|
+
readonly allowActorless?: boolean;
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
14
43
|
//#region src/federation/inbox-report.d.ts
|
|
15
44
|
/**
|
|
16
45
|
* A JSON value retained from the incoming request.
|
|
@@ -53,6 +82,13 @@ type InboxAuthentication = {
|
|
|
53
82
|
readonly type: "activityOriginMismatch";
|
|
54
83
|
readonly activityId: URL;
|
|
55
84
|
readonly actorIds: readonly URL[];
|
|
85
|
+
} | {
|
|
86
|
+
/**
|
|
87
|
+
* The activity declares no actor, and no principal was authenticated
|
|
88
|
+
* for it, although its listener allows activities without an actor.
|
|
89
|
+
* @since 2.5.0
|
|
90
|
+
*/
|
|
91
|
+
readonly type: "noAuthenticatedPrincipal";
|
|
56
92
|
};
|
|
57
93
|
} | {
|
|
58
94
|
readonly status: "skipped";
|
|
@@ -951,6 +987,18 @@ interface MessageQueue {
|
|
|
951
987
|
*/
|
|
952
988
|
readonly atomicEnqueueMany?: boolean;
|
|
953
989
|
/**
|
|
990
|
+
* The largest message, in bytes, that the backend can hold. Fedify compares
|
|
991
|
+
* it with a conservative estimate of a message's serialized size: the
|
|
992
|
+
* length of its JSON serialization encoded in UTF-8, plus 8 bytes for each
|
|
993
|
+
* JSON value in it, plus what encoding strings beyond Latin-1 as UTF-16
|
|
994
|
+
* adds, which also bounds binary serialization formats. When an
|
|
995
|
+
* incoming activity would make a larger inbox message, Fedify processes the
|
|
996
|
+
* activity right away instead of enqueueing it, as if there were no inbox
|
|
997
|
+
* queue. When omitted, messages are enqueued regardless of their size.
|
|
998
|
+
* @since 2.5.0
|
|
999
|
+
*/
|
|
1000
|
+
readonly maxMessageSize?: number;
|
|
1001
|
+
/**
|
|
954
1002
|
* Enqueues a message in the queue.
|
|
955
1003
|
* @param message The message to enqueue.
|
|
956
1004
|
* @param options Additional options for enqueuing the message.
|
|
@@ -1076,6 +1124,11 @@ declare class ParallelMessageQueue implements MessageQueue {
|
|
|
1076
1124
|
* @since 2.4.0
|
|
1077
1125
|
*/
|
|
1078
1126
|
readonly atomicEnqueueMany?: boolean;
|
|
1127
|
+
/**
|
|
1128
|
+
* Inherits the message size limit from the wrapped queue.
|
|
1129
|
+
* @since 2.5.0
|
|
1130
|
+
*/
|
|
1131
|
+
readonly maxMessageSize?: number;
|
|
1079
1132
|
readonly getDepth?: () => Promise<MessageQueueDepth>;
|
|
1080
1133
|
/**
|
|
1081
1134
|
* Constructs a new {@link ParallelMessageQueue} with the given queue and
|
|
@@ -1092,6 +1145,211 @@ declare class ParallelMessageQueue implements MessageQueue {
|
|
|
1092
1145
|
listen(handler: (message: any) => Promise<void> | void, options?: MessageQueueListenOptions): Promise<void>;
|
|
1093
1146
|
}
|
|
1094
1147
|
//#endregion
|
|
1148
|
+
//#region src/federation/inbox-authentication.d.ts
|
|
1149
|
+
/**
|
|
1150
|
+
* A party that Fedify authenticated for an incoming activity, independently
|
|
1151
|
+
* of the activity's declared `actor`.
|
|
1152
|
+
* @since 2.5.0
|
|
1153
|
+
*/
|
|
1154
|
+
interface InboxPrincipal {
|
|
1155
|
+
/**
|
|
1156
|
+
* What {@link InboxPrincipal.id} is:
|
|
1157
|
+
*
|
|
1158
|
+
* - `"actor"`: an actor whose ownership of the verifying key Fedify
|
|
1159
|
+
* confirmed with the actor's own document.
|
|
1160
|
+
* - `"portableAuthority"`: a DID whose verification method made a valid
|
|
1161
|
+
* Object Integrity Proof. It authenticates the [FEP-ef61] portable
|
|
1162
|
+
* actors of that DID, and nothing else.
|
|
1163
|
+
*
|
|
1164
|
+
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
1165
|
+
*/
|
|
1166
|
+
readonly kind: "actor" | "portableAuthority";
|
|
1167
|
+
/** The actor ID, or the DID if {@link kind} is `"portableAuthority"`. */
|
|
1168
|
+
readonly id: URL;
|
|
1169
|
+
/**
|
|
1170
|
+
* How the principal was authenticated:
|
|
1171
|
+
*
|
|
1172
|
+
* - `"httpSignatures"`: it signed the HTTP request.
|
|
1173
|
+
* - `"linkedDataSignatures"`: it made the Linked Data Signature of the
|
|
1174
|
+
* activity.
|
|
1175
|
+
* - `"objectIntegrityProofs"`: it made an Object Integrity Proof of the
|
|
1176
|
+
* activity.
|
|
1177
|
+
* - `"origin"`: the activity was fetched again from the actor's own web
|
|
1178
|
+
* origin, which happens only for `Context.routeActivity()`.
|
|
1179
|
+
*/
|
|
1180
|
+
readonly mechanism: "httpSignatures" | "linkedDataSignatures" | "objectIntegrityProofs" | "origin";
|
|
1181
|
+
/** The key or verification method that authenticated the principal. */
|
|
1182
|
+
readonly keyId: URL | null;
|
|
1183
|
+
}
|
|
1184
|
+
/**
|
|
1185
|
+
* Who Fedify authenticated for an incoming activity, and the interpretation of
|
|
1186
|
+
* the activity it authenticated. Inbox listeners receive it as
|
|
1187
|
+
* {@link InboxContext.authentication}.
|
|
1188
|
+
*
|
|
1189
|
+
* Authenticated principals are independent of the activity's declared
|
|
1190
|
+
* `actor`: an activity forwarded by a relay is signed by the relay in its
|
|
1191
|
+
* HTTP request, but its document may be signed by its author, and some
|
|
1192
|
+
* activities, such as [FEP-7aa9] `FeatureRequest`s sent by Mastodon, declare
|
|
1193
|
+
* no `actor` at all. A valid signature alone does not authorize anything;
|
|
1194
|
+
* use {@link isActorAuthenticated} to check whether a specific actor was
|
|
1195
|
+
* authenticated.
|
|
1196
|
+
*
|
|
1197
|
+
* [FEP-7aa9]: https://w3id.org/fep/7aa9
|
|
1198
|
+
* @since 2.5.0
|
|
1199
|
+
*/
|
|
1200
|
+
interface InboxAuthenticationEvidence {
|
|
1201
|
+
/**
|
|
1202
|
+
* Whether signatures were verified at all. It is `false` only when
|
|
1203
|
+
* signature verification is skipped, or when there is no evidence, e.g.,
|
|
1204
|
+
* for an activity queued by an older version of Fedify. In that case all
|
|
1205
|
+
* the principal lists are empty.
|
|
1206
|
+
*/
|
|
1207
|
+
readonly verified: boolean;
|
|
1208
|
+
/**
|
|
1209
|
+
* The principals that signed the HTTP request, i.e., the server that
|
|
1210
|
+
* delivered the activity, which may have forwarded it. It is empty when
|
|
1211
|
+
* the activity document was authenticated by its own signatures, so that
|
|
1212
|
+
* HTTP Signatures did not need to be verified.
|
|
1213
|
+
*/
|
|
1214
|
+
readonly requestSigners: readonly InboxPrincipal[];
|
|
1215
|
+
/**
|
|
1216
|
+
* The principals that made the verified Linked Data Signature or Object
|
|
1217
|
+
* Integrity Proofs of the activity document. All of them are listed when
|
|
1218
|
+
* there are several proofs.
|
|
1219
|
+
*/
|
|
1220
|
+
readonly documentSigners: readonly InboxPrincipal[];
|
|
1221
|
+
/**
|
|
1222
|
+
* The actors authenticated because `Context.routeActivity()` fetched the
|
|
1223
|
+
* activity again from their own web origin. It is always empty for
|
|
1224
|
+
* activities delivered to an inbox.
|
|
1225
|
+
*/
|
|
1226
|
+
readonly originAuthenticated: readonly InboxPrincipal[];
|
|
1227
|
+
/**
|
|
1228
|
+
* The activity as Fedify interpreted it while authenticating it, in
|
|
1229
|
+
* expanded JSON-LD. Typed vocabulary objects omit some values, such as
|
|
1230
|
+
* blank node references and values they cannot decode, so authorization
|
|
1231
|
+
* that has to count every value of a property, e.g., that a property has
|
|
1232
|
+
* exactly one value, should inspect this instead. It is deeply frozen.
|
|
1233
|
+
* It is empty when there is no evidence.
|
|
1234
|
+
*/
|
|
1235
|
+
readonly expandedActivity: readonly Record<string, unknown>[];
|
|
1236
|
+
/**
|
|
1237
|
+
* The base URL the activity was decoded with, e.g., the URL an activity
|
|
1238
|
+
* fetched by `Context.routeActivity()` was finally retrieved from, or
|
|
1239
|
+
* `null` if none was given. Relative IRIs left in
|
|
1240
|
+
* {@link expandedActivity} resolve against it, or against the activity's
|
|
1241
|
+
* own `@id` if it is `null`, as the decoder resolves them.
|
|
1242
|
+
*/
|
|
1243
|
+
readonly baseUrl: URL | null;
|
|
1244
|
+
}
|
|
1245
|
+
/**
|
|
1246
|
+
* Options for {@link isActorAuthenticated}.
|
|
1247
|
+
* @since 2.5.0
|
|
1248
|
+
*/
|
|
1249
|
+
interface IsActorAuthenticatedOptions {
|
|
1250
|
+
/**
|
|
1251
|
+
* Which principals to consider:
|
|
1252
|
+
*
|
|
1253
|
+
* - `"effective"` (default): the document signers if there are any,
|
|
1254
|
+
* otherwise the request signers if there are any, otherwise the actors
|
|
1255
|
+
* authenticated by their origin.
|
|
1256
|
+
* - `"document"`: the document signers only.
|
|
1257
|
+
*/
|
|
1258
|
+
readonly scope?: "effective" | "document";
|
|
1259
|
+
}
|
|
1260
|
+
/**
|
|
1261
|
+
* Checks whether the given evidence authenticates the given actor.
|
|
1262
|
+
*
|
|
1263
|
+
* Actor IDs are compared exactly, except that [FEP-ef61] portable IDs and
|
|
1264
|
+
* compatible identifiers are compared by their canonical portable IDs, and
|
|
1265
|
+
* a portable authority (a DID) authenticates the portable actors of that DID.
|
|
1266
|
+
*
|
|
1267
|
+
* @example
|
|
1268
|
+
* ``` typescript
|
|
1269
|
+
* federation
|
|
1270
|
+
* .setInboxListeners("/users/{identifier}/inbox", "/inbox")
|
|
1271
|
+
* .on(Follow, async (ctx, follow) => {
|
|
1272
|
+
* if (follow.actorId == null) return;
|
|
1273
|
+
* // The actor is always authenticated for activities that declare one,
|
|
1274
|
+
* // but the same check works for any actor an activity names:
|
|
1275
|
+
* isActorAuthenticated(ctx.authentication, follow.actorId);
|
|
1276
|
+
* });
|
|
1277
|
+
* ```
|
|
1278
|
+
*
|
|
1279
|
+
* [FEP-ef61]: https://w3id.org/fep/ef61
|
|
1280
|
+
* @param evidence The authentication evidence, usually
|
|
1281
|
+
* {@link InboxContext.authentication}.
|
|
1282
|
+
* @param actorId The actor ID to check.
|
|
1283
|
+
* @param options Options.
|
|
1284
|
+
* @returns `true` if the actor is authenticated.
|
|
1285
|
+
* @since 2.5.0
|
|
1286
|
+
*/
|
|
1287
|
+
declare function isActorAuthenticated(evidence: InboxAuthenticationEvidence, actorId: URL, options?: IsActorAuthenticatedOptions): boolean;
|
|
1288
|
+
/**
|
|
1289
|
+
* A {@link InboxPrincipal} as stored in a queued message.
|
|
1290
|
+
* @internal
|
|
1291
|
+
*/
|
|
1292
|
+
interface SerializedInboxPrincipal {
|
|
1293
|
+
readonly kind: InboxPrincipal["kind"];
|
|
1294
|
+
readonly id: string;
|
|
1295
|
+
readonly mechanism: InboxPrincipal["mechanism"];
|
|
1296
|
+
readonly keyId: string | null;
|
|
1297
|
+
}
|
|
1298
|
+
/**
|
|
1299
|
+
* The principals of an {@link InboxAuthenticationEvidence} as stored in
|
|
1300
|
+
* a queued message. The expanded activity and the base URL are restored
|
|
1301
|
+
* from the queued verified view instead.
|
|
1302
|
+
* @internal
|
|
1303
|
+
*/
|
|
1304
|
+
interface SerializedInboxAuthentication {
|
|
1305
|
+
readonly verified: boolean;
|
|
1306
|
+
readonly requestSigners: readonly SerializedInboxPrincipal[];
|
|
1307
|
+
readonly documentSigners: readonly SerializedInboxPrincipal[];
|
|
1308
|
+
readonly originAuthenticated: readonly SerializedInboxPrincipal[];
|
|
1309
|
+
}
|
|
1310
|
+
//#endregion
|
|
1311
|
+
//#region src/federation/inbox-view.d.ts
|
|
1312
|
+
/**
|
|
1313
|
+
* A {@link ContextSnapshotEntry} as stored in a queued message. A response
|
|
1314
|
+
* that equals the one Fedify bundles for the URL is stored as a reference to
|
|
1315
|
+
* the bundled context, along with its hash for diagnostics.
|
|
1316
|
+
* @internal
|
|
1317
|
+
*/
|
|
1318
|
+
type SerializedContextSnapshotEntry = {
|
|
1319
|
+
readonly policy: EffectiveContextLoaderPolicy;
|
|
1320
|
+
readonly url: string; /** The SHA-256 of the canonical JSON of the whole response. */
|
|
1321
|
+
readonly sha256: string;
|
|
1322
|
+
} & ({
|
|
1323
|
+
readonly bundled: true;
|
|
1324
|
+
} | {
|
|
1325
|
+
readonly response: RemoteDocument;
|
|
1326
|
+
});
|
|
1327
|
+
/**
|
|
1328
|
+
* The interpretation of an incoming activity that Fedify authenticated, as
|
|
1329
|
+
* stored in a queued message. The document itself is not copied; it is
|
|
1330
|
+
* a field of the message.
|
|
1331
|
+
* @internal
|
|
1332
|
+
*/
|
|
1333
|
+
interface SerializedVerifiedActivityView {
|
|
1334
|
+
/** The format version. */
|
|
1335
|
+
readonly version: 1;
|
|
1336
|
+
/** The context loader policy the activity was parsed with. */
|
|
1337
|
+
readonly policy: EffectiveContextLoaderPolicy;
|
|
1338
|
+
/**
|
|
1339
|
+
* Which document the activity was parsed from, with its Linked Data
|
|
1340
|
+
* Signature detached: the `activity` of the message, i.e., the payload as
|
|
1341
|
+
* received, or its `normalizedActivity`, i.e., the payload compacted for
|
|
1342
|
+
* Linked Data Signatures.
|
|
1343
|
+
*/
|
|
1344
|
+
readonly source: "activity" | "normalizedActivity";
|
|
1345
|
+
/** The `baseUrl` option the activity was parsed with. */
|
|
1346
|
+
readonly baseUrl: string | null;
|
|
1347
|
+
/** The context responses the interpretation used. */
|
|
1348
|
+
readonly contexts: readonly SerializedContextSnapshotEntry[];
|
|
1349
|
+
/** The digest of the expanded activity. */
|
|
1350
|
+
readonly expandedDigest: string;
|
|
1351
|
+
}
|
|
1352
|
+
//#endregion
|
|
1095
1353
|
//#region src/federation/handler.d.ts
|
|
1096
1354
|
/**
|
|
1097
1355
|
* Options for the {@link respondWithObject} and
|
|
@@ -1506,6 +1764,21 @@ interface InboxMessage {
|
|
|
1506
1764
|
* @internal
|
|
1507
1765
|
*/
|
|
1508
1766
|
readonly ldSignatureVerified?: boolean;
|
|
1767
|
+
/**
|
|
1768
|
+
* The interpretation of the activity that Fedify authenticated, i.e., which
|
|
1769
|
+
* document it was parsed from and every JSON-LD context response the parse
|
|
1770
|
+
* used, so that the worker and its retries dispatch the very same
|
|
1771
|
+
* interpretation without loading contexts again. Absent in messages queued
|
|
1772
|
+
* by older Fedify versions.
|
|
1773
|
+
* @internal
|
|
1774
|
+
*/
|
|
1775
|
+
readonly verifiedView?: SerializedVerifiedActivityView;
|
|
1776
|
+
/**
|
|
1777
|
+
* Who Fedify authenticated for the activity. Absent in messages queued by
|
|
1778
|
+
* older Fedify versions.
|
|
1779
|
+
* @internal
|
|
1780
|
+
*/
|
|
1781
|
+
readonly authentication?: SerializedInboxAuthentication;
|
|
1509
1782
|
readonly started: string;
|
|
1510
1783
|
readonly attempt: number;
|
|
1511
1784
|
readonly identifier: string | null;
|
|
@@ -2886,11 +3159,27 @@ interface InboxListenerSetters<TContextData> {
|
|
|
2886
3159
|
/**
|
|
2887
3160
|
* Registers a listener for a specific incoming activity type.
|
|
2888
3161
|
*
|
|
3162
|
+
* @example
|
|
3163
|
+
* ``` typescript
|
|
3164
|
+
* federation
|
|
3165
|
+
* .setInboxListeners("/users/{identifier}/inbox", "/inbox")
|
|
3166
|
+
* // Mastodon sends FeatureRequest activities without an actor:
|
|
3167
|
+
* .on(FeatureRequest, async (ctx, request) => {
|
|
3168
|
+
* const verification = await featureInteraction.verifyRequest(ctx, {
|
|
3169
|
+
* request,
|
|
3170
|
+
* authentication: ctx.authentication,
|
|
3171
|
+
* });
|
|
3172
|
+
* // ...
|
|
3173
|
+
* }, { allowActorless: true });
|
|
3174
|
+
* ```
|
|
3175
|
+
*
|
|
2889
3176
|
* @param type A subclass of {@link Activity} to listen to.
|
|
2890
3177
|
* @param listener A callback to handle an incoming activity.
|
|
3178
|
+
* @param options Options for the listener. See
|
|
3179
|
+
* {@link InboxListenerOptions}. (Since 2.5.0.)
|
|
2891
3180
|
* @returns The setters object so that settings can be chained.
|
|
2892
3181
|
*/
|
|
2893
|
-
on<TActivity extends Activity>(type: new (...args: any[]) => TActivity, listener: InboxListener<TContextData, TActivity
|
|
3182
|
+
on<TActivity extends Activity>(type: new (...args: any[]) => TActivity, listener: InboxListener<TContextData, TActivity>, options?: InboxListenerOptions): InboxListenerSetters<TContextData>;
|
|
2894
3183
|
/**
|
|
2895
3184
|
* Registers an error handler for inbox listeners. Any exceptions thrown
|
|
2896
3185
|
* from the listeners are caught and passed to this handler.
|
|
@@ -3732,7 +4021,9 @@ interface Context<TContextData> {
|
|
|
3732
4021
|
* Looks up a WebFinger resource.
|
|
3733
4022
|
*
|
|
3734
4023
|
* It's almost the same as the {@link lookupWebFinger} function, but it uses
|
|
3735
|
-
* the context's configuration by default.
|
|
4024
|
+
* the context's configuration by default. Unlike {@link lookupWebFinger},
|
|
4025
|
+
* it does not support the `withDiagnostics` option; it always returns the
|
|
4026
|
+
* resource descriptor or `null`.
|
|
3736
4027
|
*
|
|
3737
4028
|
* @param resource The resource URL to look up.
|
|
3738
4029
|
* @param options Extra options for looking up the resource.
|
|
@@ -4417,6 +4708,17 @@ interface InboxContext<TContextData> extends Context<TContextData> {
|
|
|
4417
4708
|
*/
|
|
4418
4709
|
readonly recipient: string | null;
|
|
4419
4710
|
/**
|
|
4711
|
+
* Who Fedify authenticated for the incoming activity, independently of its
|
|
4712
|
+
* declared `actor`, and the interpretation of the activity that was
|
|
4713
|
+
* authenticated. It is preserved through the inbox queue and its retries.
|
|
4714
|
+
*
|
|
4715
|
+
* Use it with {@link isActorAuthenticated} to authorize requests that do
|
|
4716
|
+
* not declare an `actor`, which reach a listener only if it is registered
|
|
4717
|
+
* with the `allowActorless` option.
|
|
4718
|
+
* @since 2.5.0
|
|
4719
|
+
*/
|
|
4720
|
+
readonly authentication: InboxAuthenticationEvidence;
|
|
4721
|
+
/**
|
|
4420
4722
|
* Creates a new context with the same properties as this one,
|
|
4421
4723
|
* but with the given data.
|
|
4422
4724
|
* @param data The new data to associate with the context.
|
|
@@ -4836,4 +5138,4 @@ interface ActorKeyPair extends CryptoKeyPair {
|
|
|
4836
5138
|
readonly multikey: Multikey;
|
|
4837
5139
|
}
|
|
4838
5140
|
//#endregion
|
|
4839
|
-
export { respondWithObject as $,
|
|
5141
|
+
export { respondWithObject as $, SendActivityError as $t, InboxChallengePolicy as A, CollectionCursor as At, createFederation as B, NodeInfoDispatcher as Bt, FederationBenchmarkOptions as C, parseCircuitBreakerKvState as Ct, FederationStartQueueOptions as D, ActorKeyPairsDispatcher as Dt, FederationOptions as E, ActorHandleMapper as Et, PortableInboxForwardingOptions as F, HashlinkMediaDispatcher as Ft, TaskEnqueueOptions as G, OutboxListenerErrorHandler as Gt, createFederationBuilder as H, ObjectDispatcher as Ht, Rfc6570Expression as I, HashlinkMediaRequest as It, CreateExponentialBackoffPolicyOptions as J, PortableCollectionOwnerMapper as Jt, TaskHandler as K, OutboxPermanentFailureHandler as Kt, FederationKvPrefixes as L, InboxErrorHandler as Lt, MediaUploaderSetters as M, CustomCollectionCounter as Mt, ObjectCallbackSetters as N, CustomCollectionCursor as Nt, IdempotencyKeyCallback as O, AuthorizePredicate as Ot, OutboxListenerSetters as P, CustomCollectionDispatcher as Pt, RespondWithObjectOptions as Q, WebFingerLinksDispatcher as Qt, FederationOrigin as R, InboxListener as Rt, Federation as S, normalizeCircuitBreakerOptions as St, FederationFetchOptions as T, ActorDispatcher as Tt, TaskDefinition as U, OutboxErrorHandler as Ut, Message as V, ObjectAuthorizePredicate as Vt, TaskDefinitionOptions as W, OutboxListener as Wt, RetryPolicy as X, UnverifiedActivityHandler as Xt, RetryContext as Y, SharedInboxKeyDispatcher as Yt, createExponentialBackoffPolicy as Z, UnverifiedActivityReason as Zt, ActorCallbackSetters as _, CircuitBreakerKvState as _t, GetObjectOptions as a, InboxAuthentication as an, InProcessMessageQueue as at, CustomCollectionCallbackSetters as b, CircuitBreakerStateChange as bt, IsSignedByAudienceOptions as c, InboxRequestOutcome as cn, MessageQueueDepth as ct, ParseUriResult as d, ParallelMessageQueue as dt, SenderKeyPair as en, respondWithObjectIfAcceptable as et, PortableRequest as f, CircuitBreaker as ft, SendActivityOptionsForCollection as g, CircuitBreakerFailurePolicy as gt, SendActivityOptions as h, CircuitBreakerCreateOptions as ht, GetActorOptions as i, ActivityTransformer as in, isActorAuthenticated as it, InboxListenerSetters as j, CollectionDispatcher as jt, IdempotencyStrategy as k, CollectionCounter as kt, OutboxContext as l, InboxRequestReport as ln, MessageQueueEnqueueOptions as lt, RouteActivityOptions as m, CircuitBreakerBeforeSendDecision as mt, Context as n, buildCollectionSynchronizationHeader as nn, InboxPrincipal as nt, GetSignedKeyOptions as o, InboxJsonValue as on, InProcessMessageQueueOptions as ot, RequestContext as p, CircuitBreakerActivityDrop as pt, TaskRegistry as q, PortableActorIdMapper as qt, ForwardActivityOptions as r, digest as rn, IsActorAuthenticatedOptions as rt, InboxContext as s, InboxRequestFinishedHandler as sn, MessageQueue as st, ActorKeyPair as t, PageItems as tn, InboxAuthenticationEvidence as tt, ParseUriOptions as u, InboxListenerOptions as un, MessageQueueListenOptions as ut, CollectionCallbackSetters as v, CircuitBreakerOptions as vt, FederationBuilder as w, ActorAliasMapper as wt, Federatable as x, NormalizedCircuitBreakerOptions as xt, ConstructorWithTypeId as y, CircuitBreakerState as yt, FederationQueueOptions as z, MediaUploaderCallback as zt };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "temporal-polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import {
|
|
5
|
-
import { n as doubleKnock } from "./http-
|
|
4
|
+
import { D as validateCryptoKey } from "./ld-CQFuiah9.mjs";
|
|
5
|
+
import { n as doubleKnock } from "./http-BZkyQIkb.mjs";
|
|
6
6
|
import { getLogger } from "@logtape/logtape";
|
|
7
7
|
import { FetchError, UrlError, createActivityPubRequest, getRemoteDocument, logRequest, resolveDocumentLoaderTimeout, validatePublicUrl, withDocumentLoaderTimeout } from "@fedify/vocab-runtime";
|
|
8
8
|
import { curry } from "es-toolkit";
|
|
@@ -7,7 +7,7 @@ import { t as assertExists } from "../assert_exists-cffSpJ7X.mjs";
|
|
|
7
7
|
import { t as assertThrows } from "../assert_throws-BYITOvPO.mjs";
|
|
8
8
|
import "../std__assert-DvMDRPes.mjs";
|
|
9
9
|
import { t as assertStrictEquals } from "../assert_strict_equals-CYvBmkpC.mjs";
|
|
10
|
-
import { r as createFederationBuilder } from "../builder-
|
|
10
|
+
import { r as createFederationBuilder } from "../builder-DbC8bn6k.mjs";
|
|
11
11
|
import { DisallowedOperatorError, DisallowedVarSpecModifierError, DuplicateRouteVariableError, RouteTemplateOptionsNotMatchedError, RouterError } from "@fedify/uri-template";
|
|
12
12
|
import { Activity, Note, Person } from "@fedify/vocab";
|
|
13
13
|
import { test } from "@fedify/fixture";
|
|
@@ -6,11 +6,11 @@ import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
|
|
|
6
6
|
import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
|
|
7
7
|
import "../std__assert-DvMDRPes.mjs";
|
|
8
8
|
import { t as assert } from "../assert-D1Eafmd_.mjs";
|
|
9
|
-
import {
|
|
9
|
+
import { x as exportJwk } from "../ld-CQFuiah9.mjs";
|
|
10
10
|
import { r as normalizeOutgoingActivityJsonLd } from "../outgoing-jsonld-4IJqPYos.mjs";
|
|
11
|
-
import {
|
|
11
|
+
import { h as verifyProof, s as signObject } from "../proof-DPoF06nz.mjs";
|
|
12
12
|
import { i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2 } from "../keys-DIJNHW-Y.mjs";
|
|
13
|
-
import { n as FederationImpl } from "../middleware-
|
|
13
|
+
import { n as FederationImpl } from "../middleware-CuVa0UuS.mjs";
|
|
14
14
|
import { Create, DataIntegrityProof, Note } from "@fedify/vocab";
|
|
15
15
|
import { exportDidKey, parseIri } from "@fedify/vocab-runtime";
|
|
16
16
|
import { mockDocumentLoader, test } from "@fedify/fixture";
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import "temporal-polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { r as createRequestContext, t as createInboxContext } from "../context-
|
|
4
|
+
import { r as createRequestContext, t as createInboxContext } from "../context-COHd1Rsh.mjs";
|
|
5
5
|
import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
|
|
6
6
|
import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
|
|
7
7
|
import "../std__assert-DvMDRPes.mjs";
|
|
8
|
-
import { a as compactJsonLd,
|
|
9
|
-
import { l as signRequest } from "../http-
|
|
8
|
+
import { a as compactJsonLd, h as verifyCompactJsonLd, m as signJsonLd } from "../ld-CQFuiah9.mjs";
|
|
9
|
+
import { l as signRequest } from "../http-BZkyQIkb.mjs";
|
|
10
10
|
import { a as rsaPrivateKey3, c as rsaPublicKey3, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2 } from "../keys-DIJNHW-Y.mjs";
|
|
11
|
-
import { f as handleInbox, o as createFederation } from "../middleware-
|
|
12
|
-
import { t as ActivityListenerSet } from "../activity-listener-
|
|
11
|
+
import { f as handleInbox, o as createFederation } from "../middleware-CuVa0UuS.mjs";
|
|
12
|
+
import { t as ActivityListenerSet } from "../activity-listener-CELFAodc.mjs";
|
|
13
13
|
import { t as map_local_create_note_default } from "../map-local-create-note-B0SeXJms.mjs";
|
|
14
14
|
import { Create, CryptographicKey, Multikey, Person, Update } from "@fedify/vocab";
|
|
15
15
|
import { encodeMultibase, exportDidKey, parseIri } from "@fedify/vocab-runtime";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Temporal } from "temporal-polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { n as createOutboxContext, r as createRequestContext, t as createInboxContext } from "../context-
|
|
4
|
+
import { n as createOutboxContext, r as createRequestContext, t as createInboxContext } from "../context-COHd1Rsh.mjs";
|
|
5
5
|
import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
|
|
6
6
|
import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
|
|
7
7
|
import { t as assertGreaterOrEqual } from "../assert_greater_or_equal-BlafOF4-.mjs";
|
|
@@ -11,12 +11,12 @@ import "../std__assert-DvMDRPes.mjs";
|
|
|
11
11
|
import { t as assertRejects } from "../assert_rejects-CTptdYck.mjs";
|
|
12
12
|
import { t as assert } from "../assert-D1Eafmd_.mjs";
|
|
13
13
|
import { r as parseAcceptSignature } from "../accept-CPVqki78.mjs";
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { l as signRequest } from "../http-
|
|
14
|
+
import { T as generateCryptoKeyPair, a as compactJsonLd, m as signJsonLd } from "../ld-CQFuiah9.mjs";
|
|
15
|
+
import { s as signObject } from "../proof-DPoF06nz.mjs";
|
|
16
|
+
import { l as signRequest } from "../http-BZkyQIkb.mjs";
|
|
17
17
|
import { a as rsaPrivateKey3, c as rsaPublicKey3, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-DIJNHW-Y.mjs";
|
|
18
|
-
import { d as handleCustomCollection, f as handleInbox, g as respondWithObjectIfAcceptable, h as respondWithObject, l as handleActor, m as handleOutbox, o as createFederation, p as handleObject, u as handleCollection } from "../middleware-
|
|
19
|
-
import { t as ActivityListenerSet } from "../activity-listener-
|
|
18
|
+
import { d as handleCustomCollection, f as handleInbox, g as respondWithObjectIfAcceptable, h as respondWithObject, l as handleActor, m as handleOutbox, o as createFederation, p as handleObject, u as handleCollection } from "../middleware-CuVa0UuS.mjs";
|
|
19
|
+
import { t as ActivityListenerSet } from "../activity-listener-CELFAodc.mjs";
|
|
20
20
|
import { t as FedifySpanExporter } from "../exporter-DThFfe7P.mjs";
|
|
21
21
|
import { configure, getLogger, reset, withContext } from "@logtape/logtape";
|
|
22
22
|
import { Activity, Create, CryptographicKey, Multikey, Note, Person, Tombstone } from "@fedify/vocab";
|
|
@@ -3246,11 +3246,26 @@ test("handleInbox() caches normalizedActivity for queued signature-bearing fallb
|
|
|
3246
3246
|
activity: unsignedBody,
|
|
3247
3247
|
normalizedActivity: await compactJsonLd(unsignedBody, sourceContextLoader),
|
|
3248
3248
|
ldSignatureVerified: false,
|
|
3249
|
+
verifiedView: inboxMessage.verifiedView,
|
|
3250
|
+
authentication: {
|
|
3251
|
+
verified: true,
|
|
3252
|
+
requestSigners: [{
|
|
3253
|
+
kind: "actor",
|
|
3254
|
+
id: "https://example.com/person2",
|
|
3255
|
+
mechanism: "httpSignatures",
|
|
3256
|
+
keyId: "https://example.com/person2#key3"
|
|
3257
|
+
}],
|
|
3258
|
+
documentSigners: [],
|
|
3259
|
+
originAuthenticated: []
|
|
3260
|
+
},
|
|
3249
3261
|
started: inboxMessage.started,
|
|
3250
3262
|
attempt: 0,
|
|
3251
3263
|
identifier: "someone",
|
|
3252
3264
|
traceContext: inboxMessage.traceContext
|
|
3253
3265
|
});
|
|
3266
|
+
assertEquals(inboxMessage.verifiedView?.policy, "standard");
|
|
3267
|
+
assertEquals(inboxMessage.verifiedView?.source, "activity");
|
|
3268
|
+
assert(inboxMessage.verifiedView?.contexts.some((entry) => entry.url === "https://remote.example/contexts/ext" && "response" in entry));
|
|
3254
3269
|
});
|
|
3255
3270
|
test("respondWithObject()", async () => {
|
|
3256
3271
|
const response = await respondWithObject(new Note({
|
|
@@ -10,8 +10,8 @@ import "../std__assert-DvMDRPes.mjs";
|
|
|
10
10
|
import { t as assertStrictEquals } from "../assert_strict_equals-CYvBmkpC.mjs";
|
|
11
11
|
import { t as assert } from "../assert-D1Eafmd_.mjs";
|
|
12
12
|
import { r as ed25519PublicKey } from "../keys-DIJNHW-Y.mjs";
|
|
13
|
-
import { o as createFederation, x as parseHashlinkGatewayRequest } from "../middleware-
|
|
14
|
-
import { r as createFederationBuilder } from "../builder-
|
|
13
|
+
import { o as createFederation, x as parseHashlinkGatewayRequest } from "../middleware-CuVa0UuS.mjs";
|
|
14
|
+
import { r as createFederationBuilder } from "../builder-DbC8bn6k.mjs";
|
|
15
15
|
import { n as RouterError } from "../router-u5O5KCQr.mjs";
|
|
16
16
|
import { Note } from "@fedify/vocab";
|
|
17
17
|
import { computeDigestMultibase, encodeMultibase, exportDidKey } from "@fedify/vocab-runtime";
|
|
@@ -4,9 +4,9 @@ globalThis.addEventListener = () => {};
|
|
|
4
4
|
import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
|
|
5
5
|
import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
|
|
6
6
|
import "../std__assert-DvMDRPes.mjs";
|
|
7
|
-
import {
|
|
7
|
+
import { s as signObject } from "../proof-DPoF06nz.mjs";
|
|
8
8
|
import { n as ed25519PrivateKey, r as ed25519PublicKey, t as ed25519Multikey } from "../keys-DIJNHW-Y.mjs";
|
|
9
|
-
import { o as createFederation } from "../middleware-
|
|
9
|
+
import { o as createFederation } from "../middleware-CuVa0UuS.mjs";
|
|
10
10
|
import { Create, Follow, Person } from "@fedify/vocab";
|
|
11
11
|
import { mockDocumentLoader, test } from "@fedify/fixture";
|
|
12
12
|
//#region src/federation/idempotency.test.ts
|