@fedify/fedify 0.12.0-dev.263 → 0.12.0-dev.265
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/CHANGES.md +34 -0
- package/esm/federation/handler.js +41 -21
- package/esm/federation/middleware.js +167 -29
- package/esm/federation/mod.js +1 -0
- package/esm/federation/mq.js +1 -1
- package/esm/federation/retry.js +34 -0
- package/package.json +1 -1
- package/types/federation/callback.d.ts +4 -4
- package/types/federation/callback.d.ts.map +1 -1
- package/types/federation/handler.d.ts +4 -2
- package/types/federation/handler.d.ts.map +1 -1
- package/types/federation/middleware.d.ts +21 -5
- package/types/federation/middleware.d.ts.map +1 -1
- package/types/federation/mod.d.ts +1 -0
- package/types/federation/mod.d.ts.map +1 -1
- package/types/federation/mq.d.ts +2 -0
- package/types/federation/mq.d.ts.map +1 -1
- package/types/federation/queue.d.ts +11 -1
- package/types/federation/queue.d.ts.map +1 -1
- package/types/federation/retry.d.ts +64 -0
- package/types/federation/retry.d.ts.map +1 -0
- package/types/federation/retry.test.d.ts.map +1 -0
package/CHANGES.md
CHANGED
@@ -8,6 +8,29 @@ Version 0.12.0
|
|
8
8
|
|
9
9
|
To be released.
|
10
10
|
|
11
|
+
- Incoming activities are now queued before being dispatched to the inbox
|
12
|
+
listener if the `queue` option is provided to the `createFederation()`
|
13
|
+
function. [[#70]]
|
14
|
+
|
15
|
+
- The type of `InboxListener` callback type's first parameter became
|
16
|
+
`Context` (was `RequestContext`).
|
17
|
+
- The type of `InboxErrorHandler` callback type's first parameter became
|
18
|
+
`Context` (was `RequestContext`).
|
19
|
+
- The type of `SharedInboxKeyDispatcher` callback type's first parameter
|
20
|
+
became `Context` (was `RequestContext`).
|
21
|
+
|
22
|
+
- Implemented fully customizable retry policy for failed tasks in the task
|
23
|
+
queue. By default, the task queue retries the failed tasks with
|
24
|
+
an exponential backoff policy with decorrelated jitter.
|
25
|
+
|
26
|
+
- Added `outboxRetryPolicy` option to `CreateFederationOptions` interface.
|
27
|
+
- Added `inboxRetryPolicy` option to `CreateFederationOptions` interface.
|
28
|
+
[[#70]]
|
29
|
+
- Added `RetryPolicy` callback type.
|
30
|
+
- Added `RetryContext` interface.
|
31
|
+
- Added `createExponentialBackoffPolicy()` function.
|
32
|
+
- Added `CreateExponentialBackoffPolicyOptions` interface.
|
33
|
+
|
11
34
|
- Added `ChatMessage` class to Activity Vocabulary API. [[#85]]
|
12
35
|
|
13
36
|
- Improved multitenancy (virtual hosting) support. [[#66]]
|
@@ -18,7 +41,18 @@ To be released.
|
|
18
41
|
- The type of `ActorKeyPairsDispatcher<TContextData>`'s first parameter
|
19
42
|
became `Context` (was `TContextData`).
|
20
43
|
|
44
|
+
- Deprecated `Federation.sendActivity()` method.
|
45
|
+
|
46
|
+
- The last parameter of `Federation.sendActivity()` method is no longer
|
47
|
+
optional. Also, it now takes the required `contextData` option.
|
48
|
+
|
49
|
+
- Added more log messages using the [LogTape] library. Currently the below
|
50
|
+
logger categories are used:
|
51
|
+
|
52
|
+
- `["fedify", "federation", "queue"]`
|
53
|
+
|
21
54
|
[#66]: https://github.com/dahlia/fedify/issues/66
|
55
|
+
[#70]: https://github.com/dahlia/fedify/issues/70
|
22
56
|
[#85]: https://github.com/dahlia/fedify/issues/85
|
23
57
|
|
24
58
|
|
@@ -166,7 +166,7 @@ function filterCollectionItems(items, collectionName, filterPredicate) {
|
|
166
166
|
}
|
167
167
|
return result;
|
168
168
|
}
|
169
|
-
export async function handleInbox(request, { handle, context, kv, kvPrefix, actorDispatcher,
|
169
|
+
export async function handleInbox(request, { handle, context, kv, kvPrefix, queue, actorDispatcher, inboxListenerDispatcher, inboxErrorHandler, onNotFound, signatureTimeWindow, }) {
|
170
170
|
const logger = getLogger(["fedify", "federation", "inbox"]);
|
171
171
|
if (actorDispatcher == null) {
|
172
172
|
logger.error("Actor dispatcher is not set.", { handle });
|
@@ -185,7 +185,12 @@ export async function handleInbox(request, { handle, context, kv, kvPrefix, acto
|
|
185
185
|
}
|
186
186
|
catch (error) {
|
187
187
|
logger.error("Failed to parse JSON:\n{error}", { handle, error });
|
188
|
-
|
188
|
+
try {
|
189
|
+
await inboxErrorHandler?.(context, error);
|
190
|
+
}
|
191
|
+
catch (error) {
|
192
|
+
logger.error("An unexpected error occurred in inbox error handler:\n{error}", { error, activity: json });
|
193
|
+
}
|
189
194
|
return new Response("Invalid JSON.", {
|
190
195
|
status: 400,
|
191
196
|
headers: { "Content-Type": "text/plain; charset=utf-8" },
|
@@ -197,7 +202,12 @@ export async function handleInbox(request, { handle, context, kv, kvPrefix, acto
|
|
197
202
|
}
|
198
203
|
catch (error) {
|
199
204
|
logger.error("Failed to parse activity:\n{error}", { handle, json, error });
|
200
|
-
|
205
|
+
try {
|
206
|
+
await inboxErrorHandler?.(context, error);
|
207
|
+
}
|
208
|
+
catch (error) {
|
209
|
+
logger.error("An unexpected error occurred in inbox error handler:\n{error}", { error, activity: json });
|
210
|
+
}
|
201
211
|
return new Response("Invalid activity.", {
|
202
212
|
status: 400,
|
203
213
|
headers: { "Content-Type": "text/plain; charset=utf-8" },
|
@@ -256,29 +266,39 @@ export async function handleInbox(request, { handle, context, kv, kvPrefix, acto
|
|
256
266
|
});
|
257
267
|
return response;
|
258
268
|
}
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
269
|
+
if (queue != null) {
|
270
|
+
await queue.enqueue({
|
271
|
+
type: "inbox",
|
272
|
+
baseUrl: request.url,
|
273
|
+
activity: json,
|
274
|
+
handle,
|
275
|
+
attempt: 0,
|
276
|
+
started: new Date().toISOString(),
|
277
|
+
});
|
278
|
+
return new Response("Activity is enqueued.", {
|
279
|
+
status: 202,
|
280
|
+
headers: { "Content-Type": "text/plain; charset=utf-8" },
|
281
|
+
});
|
282
|
+
}
|
283
|
+
const listener = inboxListenerDispatcher(activity);
|
284
|
+
if (listener == null) {
|
285
|
+
logger.error("Unsupported activity type:\n{activity}", { activity: json });
|
286
|
+
return new Response("", {
|
287
|
+
status: 202,
|
288
|
+
headers: { "Content-Type": "text/plain; charset=utf-8" },
|
289
|
+
});
|
274
290
|
}
|
275
|
-
const listener = inboxListeners.get(cls);
|
276
291
|
try {
|
277
292
|
await listener(context, activity);
|
278
293
|
}
|
279
294
|
catch (error) {
|
280
|
-
|
281
|
-
|
295
|
+
try {
|
296
|
+
await inboxErrorHandler?.(context, error);
|
297
|
+
}
|
298
|
+
catch (error) {
|
299
|
+
logger.error("An unexpected error occurred in inbox error handler:\n{error}", { error, activityId: activity.id?.href, activity: json });
|
300
|
+
}
|
301
|
+
logger.error("Failed to process the incoming activity {activityId}:\n{error}", { error, activityId: activity.id?.href, activity: json });
|
282
302
|
return new Response("Internal server error.", {
|
283
303
|
status: 500,
|
284
304
|
headers: { "Content-Type": "text/plain; charset=utf-8" },
|
@@ -9,6 +9,7 @@ import { Activity, CryptographicKey, Multikey, } from "../vocab/vocab.js";
|
|
9
9
|
import { handleWebFinger } from "../webfinger/handler.js";
|
10
10
|
import { buildCollectionSynchronizationHeader } from "./collection.js";
|
11
11
|
import { handleActor, handleCollection, handleInbox, handleObject, } from "./handler.js";
|
12
|
+
import { createExponentialBackoffPolicy } from "./retry.js";
|
12
13
|
import { Router, RouterError } from "./router.js";
|
13
14
|
import { extractInboxes, sendActivity } from "./send.js";
|
14
15
|
const invokedByCreateFederation = Symbol("invokedByCreateFederation");
|
@@ -25,6 +26,7 @@ export function createFederation(options) {
|
|
25
26
|
[invokedByCreateFederation]: true,
|
26
27
|
});
|
27
28
|
}
|
29
|
+
const invokedByContext = Symbol("invokedByContext");
|
28
30
|
/**
|
29
31
|
* An object that registers federation-related business logic and dispatches
|
30
32
|
* requests to the appropriate handlers.
|
@@ -59,13 +61,15 @@ export class Federation {
|
|
59
61
|
#treatHttps;
|
60
62
|
#onOutboxError;
|
61
63
|
#signatureTimeWindow;
|
62
|
-
#
|
64
|
+
#outboxRetryPolicy;
|
65
|
+
#inboxRetryPolicy;
|
63
66
|
/**
|
64
67
|
* Create a new {@link Federation} instance.
|
65
68
|
* @param parameters Parameters for initializing the instance.
|
66
69
|
* @deprecated Use {@link createFederation} method instead.
|
67
70
|
*/
|
68
|
-
constructor(
|
71
|
+
constructor(parameters) {
|
72
|
+
const options = parameters;
|
69
73
|
const logger = getLogger(["fedify", "federation"]);
|
70
74
|
// @ts-ignore: This is a private symbol.
|
71
75
|
if (!options[invokedByCreateFederation]) {
|
@@ -97,37 +101,42 @@ export class Federation {
|
|
97
101
|
options.authenticatedDocumentLoaderFactory ??
|
98
102
|
getAuthenticatedDocumentLoader;
|
99
103
|
this.#onOutboxError = options.onOutboxError;
|
100
|
-
this.#treatHttps =
|
101
|
-
if (
|
104
|
+
this.#treatHttps = parameters.treatHttps ?? false;
|
105
|
+
if (parameters.treatHttps) {
|
102
106
|
logger.warn("The treatHttps option is deprecated and will be removed in " +
|
103
107
|
"a future release. Instead, use the x-forwarded-fetch library" +
|
104
108
|
" to recognize the X-Forwarded-Host and X-Forwarded-Proto " +
|
105
109
|
"headers. See also: <https://github.com/dahlia/x-forwarded-fetch>.");
|
106
110
|
}
|
107
111
|
this.#signatureTimeWindow = options.signatureTimeWindow ?? { minutes: 1 };
|
108
|
-
this.#
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
15 * 60000,
|
113
|
-
60 * 60000,
|
114
|
-
].map((ms) => dntShim.Temporal.Duration.from({ milliseconds: ms }));
|
112
|
+
this.#outboxRetryPolicy = options.outboxRetryPolicy ??
|
113
|
+
createExponentialBackoffPolicy();
|
114
|
+
this.#inboxRetryPolicy = options.inboxRetryPolicy ??
|
115
|
+
createExponentialBackoffPolicy();
|
115
116
|
}
|
116
|
-
#startQueue() {
|
117
|
+
#startQueue(ctxData) {
|
117
118
|
if (this.#queue != null && !this.#queueStarted) {
|
118
|
-
const logger = getLogger(["fedify", "federation", "
|
119
|
-
logger.debug("Starting
|
120
|
-
this.#queue?.listen(this.#listenQueue
|
119
|
+
const logger = getLogger(["fedify", "federation", "queue"]);
|
120
|
+
logger.debug("Starting a task queue.");
|
121
|
+
this.#queue?.listen((msg) => this.#listenQueue(ctxData, msg));
|
121
122
|
this.#queueStarted = true;
|
122
123
|
}
|
123
124
|
}
|
124
|
-
async #listenQueue(message) {
|
125
|
+
async #listenQueue(ctxData, message) {
|
126
|
+
if (message.type === "outbox") {
|
127
|
+
await this.#listenOutboxMessage(ctxData, message);
|
128
|
+
}
|
129
|
+
else if (message.type === "inbox") {
|
130
|
+
await this.#listenInboxMessage(ctxData, message);
|
131
|
+
}
|
132
|
+
}
|
133
|
+
async #listenOutboxMessage(_, message) {
|
125
134
|
const logger = getLogger(["fedify", "federation", "outbox"]);
|
126
135
|
const logData = {
|
127
136
|
keyIds: message.keys.map((pair) => pair.keyId),
|
128
137
|
inbox: message.inbox,
|
129
138
|
activity: message.activity,
|
130
|
-
|
139
|
+
attempt: message.attempt,
|
131
140
|
headers: message.headers,
|
132
141
|
};
|
133
142
|
let activity = null;
|
@@ -167,22 +176,120 @@ export class Federation {
|
|
167
176
|
catch (error) {
|
168
177
|
logger.error("An unexpected error occurred in onError handler:\n{error}", { ...logData, error, activityId: activity?.id?.href });
|
169
178
|
}
|
170
|
-
|
171
|
-
|
172
|
-
|
179
|
+
const delay = this.#outboxRetryPolicy({
|
180
|
+
elapsedTime: dntShim.Temporal.Instant.from(message.started).until(dntShim.Temporal.Now.instant()),
|
181
|
+
attempts: message.attempt,
|
182
|
+
});
|
183
|
+
if (delay != null) {
|
184
|
+
logger.error("Failed to send activity {activityId} to {inbox} (attempt " +
|
185
|
+
"#{attempt}); retry...:\n{error}", { ...logData, error, activityId: activity?.id?.href });
|
173
186
|
this.#queue?.enqueue({
|
174
187
|
...message,
|
175
|
-
|
176
|
-
}, {
|
188
|
+
attempt: message.attempt + 1,
|
189
|
+
}, {
|
190
|
+
delay: dntShim.Temporal.Duration.compare(delay, { seconds: 0 }) < 0
|
191
|
+
? dntShim.Temporal.Duration.from({ seconds: 0 })
|
192
|
+
: delay,
|
193
|
+
});
|
177
194
|
}
|
178
195
|
else {
|
179
|
-
logger.error("Failed to send activity {activityId} to {inbox} after {
|
180
|
-
"
|
196
|
+
logger.error("Failed to send activity {activityId} to {inbox} after {attempt} " +
|
197
|
+
"attempts; giving up:\n{error}", { ...logData, error, activityId: activity?.id?.href });
|
181
198
|
}
|
182
199
|
return;
|
183
200
|
}
|
184
201
|
logger.info("Successfully sent activity {activityId} to {inbox}.", { ...logData, activityId: activity?.id?.href });
|
185
202
|
}
|
203
|
+
async #listenInboxMessage(ctxData, message) {
|
204
|
+
const logger = getLogger(["fedify", "federation", "inbox"]);
|
205
|
+
const baseUrl = new URL(message.baseUrl);
|
206
|
+
let context = this.#createContext(baseUrl, ctxData);
|
207
|
+
if (message.handle) {
|
208
|
+
context = this.#createContext(baseUrl, ctxData, {
|
209
|
+
documentLoader: await context.getDocumentLoader({
|
210
|
+
handle: message.handle,
|
211
|
+
}),
|
212
|
+
});
|
213
|
+
}
|
214
|
+
else if (this.#sharedInboxKeyDispatcher != null) {
|
215
|
+
const identity = await this.#sharedInboxKeyDispatcher(context);
|
216
|
+
if (identity != null) {
|
217
|
+
context = this.#createContext(baseUrl, ctxData, {
|
218
|
+
documentLoader: "handle" in identity
|
219
|
+
? await context.getDocumentLoader(identity)
|
220
|
+
: context.getDocumentLoader(identity),
|
221
|
+
});
|
222
|
+
}
|
223
|
+
}
|
224
|
+
const activity = await Activity.fromJsonLd(message.activity, context);
|
225
|
+
const cacheKey = activity.id == null ? null : [
|
226
|
+
...this.#kvPrefixes.activityIdempotence,
|
227
|
+
activity.id.href,
|
228
|
+
];
|
229
|
+
if (cacheKey != null) {
|
230
|
+
const cached = await this.#kv.get(cacheKey);
|
231
|
+
if (cached === true) {
|
232
|
+
logger.debug("Activity {activityId} has already been processed.", {
|
233
|
+
activityId: activity.id?.href,
|
234
|
+
activity: message.activity,
|
235
|
+
});
|
236
|
+
return;
|
237
|
+
}
|
238
|
+
}
|
239
|
+
const listener = this.#dispatchInboxListener(activity);
|
240
|
+
if (listener == null) {
|
241
|
+
logger.error("Unsupported activity type:\n{activity}", { activity: message.activity, trial: message.attempt });
|
242
|
+
return;
|
243
|
+
}
|
244
|
+
try {
|
245
|
+
await listener(context, activity);
|
246
|
+
}
|
247
|
+
catch (error) {
|
248
|
+
try {
|
249
|
+
await this.#inboxErrorHandler?.(context, error);
|
250
|
+
}
|
251
|
+
catch (error) {
|
252
|
+
logger.error("An unexpected error occurred in inbox error handler:\n{error}", {
|
253
|
+
error,
|
254
|
+
trial: message.attempt,
|
255
|
+
activityId: activity.id?.href,
|
256
|
+
activity: message.activity,
|
257
|
+
});
|
258
|
+
}
|
259
|
+
const delay = this.#inboxRetryPolicy({
|
260
|
+
elapsedTime: dntShim.Temporal.Instant.from(message.started).until(dntShim.Temporal.Now.instant()),
|
261
|
+
attempts: message.attempt,
|
262
|
+
});
|
263
|
+
if (delay != null) {
|
264
|
+
logger.error("Failed to process the incoming activity {activityId} (attempt " +
|
265
|
+
"#{attempt}); retry...:\n{error}", {
|
266
|
+
error,
|
267
|
+
attempt: message.attempt,
|
268
|
+
activityId: activity.id?.href,
|
269
|
+
activity: message.activity,
|
270
|
+
});
|
271
|
+
this.#queue?.enqueue({
|
272
|
+
...message,
|
273
|
+
attempt: message.attempt + 1,
|
274
|
+
}, {
|
275
|
+
delay: dntShim.Temporal.Duration.compare(delay, { seconds: 0 }) < 0
|
276
|
+
? dntShim.Temporal.Duration.from({ seconds: 0 })
|
277
|
+
: delay,
|
278
|
+
});
|
279
|
+
}
|
280
|
+
else {
|
281
|
+
logger.error("Failed to process the incoming activity {activityId} after " +
|
282
|
+
"{trial} attempts; giving up:\n{error}", { error, activityId: activity.id?.href, activity: message.activity });
|
283
|
+
}
|
284
|
+
return;
|
285
|
+
}
|
286
|
+
if (cacheKey != null) {
|
287
|
+
await this.#kv.set(cacheKey, true, {
|
288
|
+
ttl: dntShim.Temporal.Duration.from({ days: 1 }),
|
289
|
+
});
|
290
|
+
}
|
291
|
+
logger.info("Activity {activityId} has been processed.", { activityId: activity.id?.href, activity: message.activity });
|
292
|
+
}
|
186
293
|
createContext(urlOrRequest, contextData) {
|
187
294
|
return urlOrRequest instanceof Request
|
188
295
|
? this.#createContext(urlOrRequest, contextData)
|
@@ -849,6 +956,25 @@ export class Federation {
|
|
849
956
|
};
|
850
957
|
return setters;
|
851
958
|
}
|
959
|
+
#dispatchInboxListener(activity) {
|
960
|
+
// deno-lint-ignore no-explicit-any
|
961
|
+
let cls = activity
|
962
|
+
// deno-lint-ignore no-explicit-any
|
963
|
+
.constructor;
|
964
|
+
const inboxListeners = this.#inboxListeners;
|
965
|
+
if (inboxListeners == null) {
|
966
|
+
return null;
|
967
|
+
}
|
968
|
+
while (true) {
|
969
|
+
if (inboxListeners.has(cls))
|
970
|
+
break;
|
971
|
+
if (cls === Activity)
|
972
|
+
return null;
|
973
|
+
cls = globalThis.Object.getPrototypeOf(cls);
|
974
|
+
}
|
975
|
+
const listener = inboxListeners.get(cls);
|
976
|
+
return listener;
|
977
|
+
}
|
852
978
|
/**
|
853
979
|
* Sends an activity to recipients' inboxes. You would typically use
|
854
980
|
* {@link Context.sendActivity} instead of this method.
|
@@ -858,9 +984,15 @@ export class Federation {
|
|
858
984
|
* @param activity The activity to send.
|
859
985
|
* @param options Options for sending the activity.
|
860
986
|
* @throws {TypeError} If the activity to send does not have an actor.
|
987
|
+
* @deprecated Use {@link Context.sendActivity} instead.
|
861
988
|
*/
|
862
|
-
async sendActivity(keys, recipients, activity,
|
989
|
+
async sendActivity(keys, recipients, activity, options) {
|
863
990
|
const logger = getLogger(["fedify", "federation", "outbox"]);
|
991
|
+
if (!(invokedByContext in options) || !options[invokedByContext]) {
|
992
|
+
logger.warn("The Federation.sendActivity() method is deprecated. Use " +
|
993
|
+
"Context.sendActivity() instead.");
|
994
|
+
}
|
995
|
+
const { preferSharedInbox, immediate, excludeBaseUris, collectionSync, contextData, } = options;
|
864
996
|
if (keys.length < 1) {
|
865
997
|
throw new TypeError("The sender's keys must not be empty.");
|
866
998
|
}
|
@@ -871,7 +1003,7 @@ export class Federation {
|
|
871
1003
|
logger.error("Activity {activityId} to send does not have an actor.", { activity, activityId: activity?.id?.href });
|
872
1004
|
throw new TypeError("The activity to send must have at least one actor property.");
|
873
1005
|
}
|
874
|
-
this.#startQueue();
|
1006
|
+
this.#startQueue(contextData);
|
875
1007
|
if (activity.id == null) {
|
876
1008
|
activity = activity.clone({
|
877
1009
|
id: new URL(`urn:uuid:${dntShim.crypto.randomUUID()}`),
|
@@ -925,7 +1057,8 @@ export class Federation {
|
|
925
1057
|
keys: keyJwkPairs,
|
926
1058
|
activity: activityJson,
|
927
1059
|
inbox,
|
928
|
-
|
1060
|
+
started: new Date().toISOString(),
|
1061
|
+
attempt: 0,
|
929
1062
|
headers: collectionSync == null ? {} : {
|
930
1063
|
"Collection-Synchronization": await buildCollectionSynchronizationHeader(collectionSync, inboxes[inbox]),
|
931
1064
|
},
|
@@ -1067,7 +1200,7 @@ export class Federation {
|
|
1067
1200
|
kv: this.#kv,
|
1068
1201
|
kvPrefix: this.#kvPrefixes.activityIdempotence,
|
1069
1202
|
actorDispatcher: this.#actorCallbacks?.dispatcher,
|
1070
|
-
|
1203
|
+
inboxListenerDispatcher: this.#dispatchInboxListener.bind(this),
|
1071
1204
|
inboxErrorHandler: this.#inboxErrorHandler,
|
1072
1205
|
onNotFound,
|
1073
1206
|
signatureTimeWindow: this.#signatureTimeWindow,
|
@@ -1451,7 +1584,12 @@ class ContextImpl {
|
|
1451
1584
|
else {
|
1452
1585
|
keys = [sender];
|
1453
1586
|
}
|
1454
|
-
const opts = {
|
1587
|
+
const opts = {
|
1588
|
+
contextData: this.data,
|
1589
|
+
...options,
|
1590
|
+
// @ts-ignore: This is a private symbol
|
1591
|
+
[invokedByContext]: true,
|
1592
|
+
};
|
1455
1593
|
let expandedRecipients;
|
1456
1594
|
if (Array.isArray(recipients)) {
|
1457
1595
|
expandedRecipients = recipients;
|
package/esm/federation/mod.js
CHANGED
package/esm/federation/mq.js
CHANGED
@@ -13,7 +13,7 @@ export class InProcessMessageQueue {
|
|
13
13
|
enqueue(message, options) {
|
14
14
|
const delay = options?.delay == null
|
15
15
|
? 0
|
16
|
-
: options.delay.total("millisecond");
|
16
|
+
: Math.max(options.delay.total("millisecond"), 0);
|
17
17
|
setTimeout(() => {
|
18
18
|
for (const handler of this.#handlers)
|
19
19
|
handler(message);
|
@@ -0,0 +1,34 @@
|
|
1
|
+
/**
|
2
|
+
* The context passed to a {@link RetryPolicy} callback.
|
3
|
+
* @since 0.12.0
|
4
|
+
*/
|
5
|
+
import * as dntShim from "../_dnt.shims.js";
|
6
|
+
/**
|
7
|
+
* Creates an exponential backoff retry policy. The delay between retries
|
8
|
+
* starts at the `initialDelay` and is multiplied by the `factor` for each
|
9
|
+
* subsequent retry, up to the `maxDelay`. The policy will give up after
|
10
|
+
* `maxAttempts` attempts. The actual delay is randomized to avoid
|
11
|
+
* synchronization (jitter).
|
12
|
+
* @param options The options for the policy.
|
13
|
+
* @returns The retry policy.
|
14
|
+
* @since 0.12.0
|
15
|
+
*/
|
16
|
+
export function createExponentialBackoffPolicy(options = {}) {
|
17
|
+
const initialDelay = dntShim.Temporal.Duration.from(options.initialDelay ?? { seconds: 1 });
|
18
|
+
const maxDelay = dntShim.Temporal.Duration.from(options.maxDelay ?? { hours: 12 });
|
19
|
+
const maxAttempts = options.maxAttempts ?? 10;
|
20
|
+
const factor = options.factor ?? 2;
|
21
|
+
const jitter = options.jitter ?? true;
|
22
|
+
return ({ attempts }) => {
|
23
|
+
if (attempts >= maxAttempts)
|
24
|
+
return null;
|
25
|
+
let milliseconds = initialDelay.total("millisecond");
|
26
|
+
milliseconds *= factor ** attempts;
|
27
|
+
if (jitter) {
|
28
|
+
milliseconds *= 1 + Math.random();
|
29
|
+
milliseconds = Math.round(milliseconds);
|
30
|
+
}
|
31
|
+
const delay = dntShim.Temporal.Duration.from({ milliseconds });
|
32
|
+
return dntShim.Temporal.Duration.compare(delay, maxDelay) > 0 ? maxDelay : delay;
|
33
|
+
};
|
34
|
+
}
|
package/package.json
CHANGED
@@ -73,25 +73,25 @@ export type CollectionCursor<TContextData, TFilter> = (context: RequestContext<T
|
|
73
73
|
* @typeParam TContextData The context data to pass to the {@link Context}.
|
74
74
|
* @typeParam TActivity The type of activity to listen for.
|
75
75
|
*/
|
76
|
-
export type InboxListener<TContextData, TActivity extends Activity> = (context:
|
76
|
+
export type InboxListener<TContextData, TActivity extends Activity> = (context: Context<TContextData>, activity: TActivity) => void | Promise<void>;
|
77
77
|
/**
|
78
78
|
* A callback that handles errors in an inbox.
|
79
79
|
*
|
80
80
|
* @typeParam TContextData The context data to pass to the {@link Context}.
|
81
81
|
*/
|
82
|
-
export type InboxErrorHandler<TContextData> = (context:
|
82
|
+
export type InboxErrorHandler<TContextData> = (context: Context<TContextData>, error: Error) => void | Promise<void>;
|
83
83
|
/**
|
84
84
|
* A callback that dispatches the key pair for the authenticated document loader
|
85
85
|
* of the {@link Context} passed to the shared inbox listener.
|
86
86
|
*
|
87
87
|
* @typeParam TContextData The context data to pass to the {@link Context}.
|
88
|
-
* @param context The
|
88
|
+
* @param context The context.
|
89
89
|
* @returns The handle of the actor or the key pair for the authenticated
|
90
90
|
* document loader of the {@link Context} passed to the shared inbox
|
91
91
|
* listener. If `null` is returned, the request is not authorized.
|
92
92
|
* @since 0.11.0
|
93
93
|
*/
|
94
|
-
export type SharedInboxKeyDispatcher<TContextData> = (context:
|
94
|
+
export type SharedInboxKeyDispatcher<TContextData> = (context: Context<TContextData>) => SenderKeyPair | {
|
95
95
|
handle: string;
|
96
96
|
} | null | Promise<SenderKeyPair | {
|
97
97
|
handle: string;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../src/federation/callback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,YAAY,IAAI,CAC7C,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,KAClC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAElC;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,CAAC,YAAY,IAAI,CAC1C,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,gBAAgB,GAAG,IAAI,KACzB,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,CAAC,YAAY,IAAI,CAClD,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,EAC9B,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,CAAC,YAAY,IAAI,CACjD,WAAW,EAAE,YAAY,EACzB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;AAE1E;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,CAC1B,YAAY,EACZ,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,MAAM,IACnB,CACF,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,EACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3B,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAE9C;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,IAAI,CAC/D,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,CAAC,EAAE,OAAO,KACb,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,CAAC,YAAY,EAAE,OAAO,IAAI,CACrD,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,OAAO,KACb,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;AAE9D;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,CAAC,YAAY,EAAE,OAAO,IAAI,CACpD,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,OAAO,KACb,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,MAAM,aAAa,CAAC,YAAY,EAAE,SAAS,SAAS,QAAQ,IAAI,CACpE,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../src/federation/callback.ts"],"names":[],"mappings":"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"}
|
@@ -7,6 +7,7 @@ import { Activity, Link, Object } from "../vocab/vocab.js";
|
|
7
7
|
import type { ActorDispatcher, AuthorizePredicate, CollectionCounter, CollectionCursor, CollectionDispatcher, InboxErrorHandler, InboxListener, ObjectAuthorizePredicate, ObjectDispatcher } from "./callback.js";
|
8
8
|
import type { RequestContext } from "./context.js";
|
9
9
|
import type { KvKey, KvStore } from "./kv.js";
|
10
|
+
import type { MessageQueue } from "./mq.js";
|
10
11
|
export declare function acceptsJsonLd(request: Request): boolean;
|
11
12
|
export interface ActorHandlerParameters<TContextData> {
|
12
13
|
handle: string;
|
@@ -70,13 +71,14 @@ export interface InboxHandlerParameters<TContextData> {
|
|
70
71
|
context: RequestContext<TContextData>;
|
71
72
|
kv: KvStore;
|
72
73
|
kvPrefix: KvKey;
|
74
|
+
queue?: MessageQueue;
|
73
75
|
actorDispatcher?: ActorDispatcher<TContextData>;
|
74
|
-
|
76
|
+
inboxListenerDispatcher: (activity: Activity) => InboxListener<TContextData, Activity> | null;
|
75
77
|
inboxErrorHandler?: InboxErrorHandler<TContextData>;
|
76
78
|
onNotFound(request: Request): Response | Promise<Response>;
|
77
79
|
signatureTimeWindow: dntShim.Temporal.DurationLike;
|
78
80
|
}
|
79
|
-
export declare function handleInbox<TContextData>(request: Request, { handle, context, kv, kvPrefix, actorDispatcher,
|
81
|
+
export declare function handleInbox<TContextData>(request: Request, { handle, context, kv, kvPrefix, queue, actorDispatcher, inboxListenerDispatcher, inboxErrorHandler, onNotFound, signatureTimeWindow, }: InboxHandlerParameters<TContextData>): Promise<Response>;
|
80
82
|
/**
|
81
83
|
* Options for the {@link respondWithObject} and
|
82
84
|
* {@link respondWithObjectIfAcceptable} functions.
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/federation/handler.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,QAAQ,EAER,IAAI,EACJ,MAAM,EAGP,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/federation/handler.ts"],"names":[],"mappings":"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"}
|
@@ -8,6 +8,7 @@ import type { ActorDispatcher, ActorKeyPairDispatcher, ActorKeyPairsDispatcher,
|
|
8
8
|
import type { Context, RequestContext, SendActivityOptions } from "./context.js";
|
9
9
|
import type { KvKey, KvStore } from "./kv.js";
|
10
10
|
import type { MessageQueue } from "./mq.js";
|
11
|
+
import { type RetryPolicy } from "./retry.js";
|
11
12
|
import { type SenderKeyPair } from "./send.js";
|
12
13
|
/**
|
13
14
|
* Options for {@link createFederation} function.
|
@@ -60,12 +61,26 @@ export interface CreateFederationOptions {
|
|
60
61
|
* the window is a minute.
|
61
62
|
*/
|
62
63
|
signatureTimeWindow?: dntShim.Temporal.DurationLike;
|
64
|
+
/**
|
65
|
+
* The retry policy for sending activities to recipients' inboxes.
|
66
|
+
* By default, this uses an exponential backoff strategy with a maximum of
|
67
|
+
* 10 attempts and a maximum delay of 12 hours.
|
68
|
+
* @since 0.12.0
|
69
|
+
*/
|
70
|
+
outboxRetryPolicy?: RetryPolicy;
|
71
|
+
/**
|
72
|
+
* The retry policy for processing incoming activities. By default, this
|
73
|
+
* uses an exponential backoff strategy with a maximum of 10 attempts and a
|
74
|
+
* maximum delay of 12 hours.
|
75
|
+
* @since 0.12.0
|
76
|
+
*/
|
77
|
+
inboxRetryPolicy?: RetryPolicy;
|
63
78
|
}
|
64
79
|
/**
|
65
80
|
* Parameters for initializing a {@link Federation} instance.
|
66
81
|
* @deprecated
|
67
82
|
*/
|
68
|
-
export interface FederationParameters extends CreateFederationOptions {
|
83
|
+
export interface FederationParameters extends Omit<CreateFederationOptions, "outboxRetryPolicy" | "inboxRetryPolicy"> {
|
69
84
|
/**
|
70
85
|
* The message queue for sending activities to recipients' inboxes.
|
71
86
|
* If not provided, activities will not be queued and will be sent
|
@@ -118,7 +133,6 @@ export interface FederationParameters extends CreateFederationOptions {
|
|
118
133
|
* @deprecated
|
119
134
|
*/
|
120
135
|
treatHttps?: boolean;
|
121
|
-
backoffSchedule?: dntShim.Temporal.Duration[];
|
122
136
|
}
|
123
137
|
/**
|
124
138
|
* Prefixes for namespacing keys in the Deno KV store.
|
@@ -156,7 +170,7 @@ export declare class Federation<TContextData> {
|
|
156
170
|
* @param parameters Parameters for initializing the instance.
|
157
171
|
* @deprecated Use {@link createFederation} method instead.
|
158
172
|
*/
|
159
|
-
constructor(
|
173
|
+
constructor(parameters: FederationParameters);
|
160
174
|
/**
|
161
175
|
* Create a new context.
|
162
176
|
* @param baseUrl The base URL of the server. The `pathname` remains root,
|
@@ -451,8 +465,9 @@ export declare class Federation<TContextData> {
|
|
451
465
|
* @param activity The activity to send.
|
452
466
|
* @param options Options for sending the activity.
|
453
467
|
* @throws {TypeError} If the activity to send does not have an actor.
|
468
|
+
* @deprecated Use {@link Context.sendActivity} instead.
|
454
469
|
*/
|
455
|
-
sendActivity(keys: SenderKeyPair[], recipients: Recipient | Recipient[], activity: Activity,
|
470
|
+
sendActivity(keys: SenderKeyPair[], recipients: Recipient | Recipient[], activity: Activity, options: SendActivityInternalOptions<TContextData>): Promise<void>;
|
456
471
|
/**
|
457
472
|
* Handles a request related to federation. If a request is not related to
|
458
473
|
* federation, the `onNotFound` or `onNotAcceptable` callback is called.
|
@@ -615,8 +630,9 @@ export interface InboxListenerSetters<TContextData> {
|
|
615
630
|
*/
|
616
631
|
setSharedKeyDispatcher(dispatcher: SharedInboxKeyDispatcher<TContextData>): InboxListenerSetters<TContextData>;
|
617
632
|
}
|
618
|
-
interface SendActivityInternalOptions extends SendActivityOptions {
|
633
|
+
interface SendActivityInternalOptions<TContextData> extends SendActivityOptions {
|
619
634
|
collectionSync?: string;
|
635
|
+
contextData: TContextData;
|
620
636
|
}
|
621
637
|
export {};
|
622
638
|
//# sourceMappingURL=middleware.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/federation/middleware.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EACL,KAAK,kCAAkC,EACvC,KAAK,cAAc,EAIpB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EACL,QAAQ,EAER,KAAK,OAAO,EACZ,KAAK,IAAI,EAET,KAAK,MAAM,EACZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAEV,OAAO,EAEP,cAAc,EACd,mBAAmB,EACpB,MAAM,cAAc,CAAC;AAQtB,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/federation/middleware.ts"],"names":[],"mappings":"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"}
|
@@ -10,6 +10,7 @@ export { respondWithObject, respondWithObjectIfAcceptable, type RespondWithObjec
|
|
10
10
|
export * from "./kv.js";
|
11
11
|
export * from "./middleware.js";
|
12
12
|
export * from "./mq.js";
|
13
|
+
export * from "./retry.js";
|
13
14
|
export * from "./router.js";
|
14
15
|
export { type SenderKeyPair } from "./send.js";
|
15
16
|
//# sourceMappingURL=mod.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/federation/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,iBAAiB,EACjB,6BAA6B,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,cAAc,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC"}
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/federation/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,iBAAiB,EACjB,6BAA6B,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,cAAc,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC"}
|
package/types/federation/mq.d.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mq.d.ts","sourceRoot":"","sources":["../../src/federation/mq.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,MAAM,WAAW,0BAA0B;IACzC
|
1
|
+
{"version":3,"file":"mq.d.ts","sourceRoot":"","sources":["../../src/federation/mq.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,MAAM,WAAW,0BAA0B;IACzC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;CACnC;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3E;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CAC/D;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,YAAW,YAAY;;IAGxD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1E;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;CAG9D"}
|
@@ -3,12 +3,22 @@ export interface SenderKeyJwkPair {
|
|
3
3
|
keyId: string;
|
4
4
|
privateKey: dntShim.JsonWebKey;
|
5
5
|
}
|
6
|
+
export type Message = OutboxMessage | InboxMessage;
|
6
7
|
export interface OutboxMessage {
|
7
8
|
type: "outbox";
|
8
9
|
keys: SenderKeyJwkPair[];
|
9
10
|
activity: unknown;
|
10
11
|
inbox: string;
|
11
|
-
|
12
|
+
started: string;
|
13
|
+
attempt: number;
|
12
14
|
headers: Record<string, string>;
|
13
15
|
}
|
16
|
+
export interface InboxMessage {
|
17
|
+
type: "inbox";
|
18
|
+
baseUrl: string;
|
19
|
+
activity: unknown;
|
20
|
+
started: string;
|
21
|
+
attempt: number;
|
22
|
+
handle: string | null;
|
23
|
+
}
|
14
24
|
//# sourceMappingURL=queue.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/federation/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/federation/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;CAChC;AAED,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG,YAAY,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB"}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
/**
|
2
|
+
* The context passed to a {@link RetryPolicy} callback.
|
3
|
+
* @since 0.12.0
|
4
|
+
*/
|
5
|
+
import * as dntShim from "../_dnt.shims.js";
|
6
|
+
export interface RetryContext {
|
7
|
+
/**
|
8
|
+
* The elapsed time since the first attempt.
|
9
|
+
*/
|
10
|
+
readonly elapsedTime: dntShim.Temporal.Duration;
|
11
|
+
/**
|
12
|
+
* The number of attempts so far.
|
13
|
+
*/
|
14
|
+
readonly attempts: number;
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* A policy that determines the delay before the next retry.
|
18
|
+
* @param context The retry context.
|
19
|
+
* @returns The delay before the next retry, or `null` to stop retrying.
|
20
|
+
* It must not negative.
|
21
|
+
* @since 0.12.0
|
22
|
+
*/
|
23
|
+
export type RetryPolicy = (context: RetryContext) => dntShim.Temporal.Duration | null;
|
24
|
+
/**
|
25
|
+
* Options for {@link createExponentialBackoffPolicy} function.
|
26
|
+
* @since 0.12.0
|
27
|
+
*/
|
28
|
+
export interface CreateExponentialBackoffPolicyOptions {
|
29
|
+
/**
|
30
|
+
* The initial delay before the first retry. Defaults to 1 second.
|
31
|
+
*/
|
32
|
+
readonly initialDelay?: dntShim.Temporal.DurationLike;
|
33
|
+
/**
|
34
|
+
* The maximum delay between retries. Defaults to 12 hours.
|
35
|
+
*/
|
36
|
+
readonly maxDelay?: dntShim.Temporal.DurationLike;
|
37
|
+
/**
|
38
|
+
* The maximum number of attempts before giving up.
|
39
|
+
* Defaults to 10.
|
40
|
+
*/
|
41
|
+
readonly maxAttempts?: number;
|
42
|
+
/**
|
43
|
+
* The factor to multiply the previous delay by for each retry.
|
44
|
+
* Defaults to 2.
|
45
|
+
*/
|
46
|
+
readonly factor?: number;
|
47
|
+
/**
|
48
|
+
* Whether to add jitter to the delay to avoid synchronization.
|
49
|
+
* Turned on by default.
|
50
|
+
*/
|
51
|
+
readonly jitter?: boolean;
|
52
|
+
}
|
53
|
+
/**
|
54
|
+
* Creates an exponential backoff retry policy. The delay between retries
|
55
|
+
* starts at the `initialDelay` and is multiplied by the `factor` for each
|
56
|
+
* subsequent retry, up to the `maxDelay`. The policy will give up after
|
57
|
+
* `maxAttempts` attempts. The actual delay is randomized to avoid
|
58
|
+
* synchronization (jitter).
|
59
|
+
* @param options The options for the policy.
|
60
|
+
* @returns The retry policy.
|
61
|
+
* @since 0.12.0
|
62
|
+
*/
|
63
|
+
export declare function createExponentialBackoffPolicy(options?: CreateExponentialBackoffPolicyOptions): RetryPolicy;
|
64
|
+
//# sourceMappingURL=retry.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/federation/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAEhD;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;AAEtF;;;GAGG;AACH,MAAM,WAAW,qCAAqC;IACpD;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAEtD;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAElD;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,qCAA0C,GAClD,WAAW,CAmBb"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"retry.test.d.ts","sourceRoot":"","sources":["../../src/federation/retry.test.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
|