@fedify/fedify 1.5.0-dev.731 → 1.5.0-dev.738

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.
Files changed (51) hide show
  1. package/CHANGES.md +73 -0
  2. package/esm/deno.js +1 -1
  3. package/esm/deps/jsr.io/@std/encoding/1.0.8/_common16.js +45 -0
  4. package/esm/deps/jsr.io/@std/encoding/1.0.8/_common64.js +98 -0
  5. package/esm/deps/jsr.io/@std/encoding/1.0.8/_common_detach.js +13 -0
  6. package/esm/deps/jsr.io/@std/encoding/1.0.8/base64.js +82 -0
  7. package/esm/deps/jsr.io/@std/encoding/1.0.8/base64url.js +72 -0
  8. package/esm/deps/jsr.io/@std/encoding/1.0.8/hex.js +87 -0
  9. package/esm/federation/collection.js +3 -3
  10. package/esm/federation/handler.js +5 -2
  11. package/esm/federation/middleware.js +63 -25
  12. package/esm/federation/mq.js +31 -0
  13. package/esm/runtime/key.js +3 -3
  14. package/esm/sig/http.js +2 -2
  15. package/esm/sig/ld.js +2 -2
  16. package/esm/sig/proof.js +1 -1
  17. package/esm/vocab/lookup.js +1 -1
  18. package/esm/vocab/vocab.js +176 -176
  19. package/package.json +1 -1
  20. package/types/deps/jsr.io/@std/async/{1.0.11 → 1.0.12}/delay.d.ts.map +1 -1
  21. package/types/deps/jsr.io/@std/encoding/1.0.8/_common16.d.ts +21 -0
  22. package/types/deps/jsr.io/@std/encoding/1.0.8/_common16.d.ts.map +1 -0
  23. package/types/deps/jsr.io/@std/encoding/1.0.8/_common64.d.ts +21 -0
  24. package/types/deps/jsr.io/@std/encoding/1.0.8/_common64.d.ts.map +1 -0
  25. package/types/deps/jsr.io/@std/encoding/1.0.8/_common_detach.d.ts +4 -0
  26. package/types/deps/jsr.io/@std/encoding/1.0.8/_common_detach.d.ts.map +1 -0
  27. package/types/deps/jsr.io/@std/encoding/{1.0.7 → 1.0.8}/_types.d.ts.map +1 -1
  28. package/types/deps/jsr.io/@std/encoding/1.0.8/base64.d.ts.map +1 -0
  29. package/types/deps/jsr.io/@std/encoding/1.0.8/base64url.d.ts.map +1 -0
  30. package/types/deps/jsr.io/@std/encoding/1.0.8/hex.d.ts.map +1 -0
  31. package/types/federation/collection.d.ts +2 -2
  32. package/types/federation/handler.d.ts.map +1 -1
  33. package/types/federation/middleware.d.ts.map +1 -1
  34. package/types/federation/mq.d.ts +11 -0
  35. package/types/federation/mq.d.ts.map +1 -1
  36. package/esm/deps/jsr.io/@std/encoding/1.0.7/_validate_binary_like.js +0 -26
  37. package/esm/deps/jsr.io/@std/encoding/1.0.7/base64.js +0 -163
  38. package/esm/deps/jsr.io/@std/encoding/1.0.7/base64url.js +0 -81
  39. package/esm/deps/jsr.io/@std/encoding/1.0.7/hex.js +0 -109
  40. package/types/deps/jsr.io/@std/encoding/1.0.7/_validate_binary_like.d.ts +0 -2
  41. package/types/deps/jsr.io/@std/encoding/1.0.7/_validate_binary_like.d.ts.map +0 -1
  42. package/types/deps/jsr.io/@std/encoding/1.0.7/base64.d.ts.map +0 -1
  43. package/types/deps/jsr.io/@std/encoding/1.0.7/base64url.d.ts.map +0 -1
  44. package/types/deps/jsr.io/@std/encoding/1.0.7/hex.d.ts.map +0 -1
  45. /package/esm/deps/jsr.io/@std/async/{1.0.11 → 1.0.12}/delay.js +0 -0
  46. /package/esm/deps/jsr.io/@std/encoding/{1.0.7 → 1.0.8}/_types.js +0 -0
  47. /package/types/deps/jsr.io/@std/async/{1.0.11 → 1.0.12}/delay.d.ts +0 -0
  48. /package/types/deps/jsr.io/@std/encoding/{1.0.7 → 1.0.8}/_types.d.ts +0 -0
  49. /package/types/deps/jsr.io/@std/encoding/{1.0.7 → 1.0.8}/base64.d.ts +0 -0
  50. /package/types/deps/jsr.io/@std/encoding/{1.0.7 → 1.0.8}/base64url.d.ts +0 -0
  51. /package/types/deps/jsr.io/@std/encoding/{1.0.7 → 1.0.8}/hex.d.ts +0 -0
@@ -1289,7 +1289,7 @@ export class FederationImpl {
1289
1289
  this._startQueueInternal(ctx.data);
1290
1290
  const carrier = {};
1291
1291
  propagation.inject(context.active(), carrier);
1292
- const promises = [];
1292
+ const messages = [];
1293
1293
  for (const inbox in inboxes) {
1294
1294
  const message = {
1295
1295
  type: "outbox",
@@ -1308,18 +1308,31 @@ export class FederationImpl {
1308
1308
  },
1309
1309
  traceContext: carrier,
1310
1310
  };
1311
- promises.push(this.outboxQueue.enqueue(message));
1311
+ messages.push(message);
1312
+ }
1313
+ const { outboxQueue } = this;
1314
+ if (outboxQueue.enqueueMany == null) {
1315
+ const promises = messages.map((m) => outboxQueue.enqueue(m));
1316
+ const results = await Promise.allSettled(promises);
1317
+ const errors = results
1318
+ .filter((r) => r.status === "rejected")
1319
+ .map((r) => r.reason);
1320
+ if (errors.length > 0) {
1321
+ logger.error("Failed to enqueue activity {activityId} to send later: {errors}", { activityId: activity.id.href, errors });
1322
+ if (errors.length > 1) {
1323
+ throw new AggregateError(errors, `Failed to enqueue activity ${activityId} to send later.`);
1324
+ }
1325
+ throw errors[0];
1326
+ }
1312
1327
  }
1313
- const results = await Promise.allSettled(promises);
1314
- const errors = results
1315
- .filter((r) => r.status === "rejected")
1316
- .map((r) => r.reason);
1317
- if (errors.length > 0) {
1318
- logger.error("Failed to enqueue activity {activityId} to send later: {errors}", { activityId: activity.id.href, errors });
1319
- if (errors.length > 1) {
1320
- throw new AggregateError(errors, `Failed to enqueue activity ${activityId} to send later.`);
1328
+ else {
1329
+ try {
1330
+ await outboxQueue.enqueueMany(messages);
1331
+ }
1332
+ catch (error) {
1333
+ logger.error("Failed to enqueue activity {activityId} to send later: {error}", { activityId: activity.id.href, error });
1334
+ throw error;
1321
1335
  }
1322
- throw errors[0];
1323
1336
  }
1324
1337
  }
1325
1338
  fetch(request, options) {
@@ -1531,7 +1544,13 @@ export class FederationImpl {
1531
1544
  return await handleCollection(request, {
1532
1545
  name: "followers",
1533
1546
  identifier: route.values.identifier ?? route.values.handle,
1534
- uriGetter: context.getFollowersUri.bind(context),
1547
+ uriGetter: baseUrl == null
1548
+ ? context.getFollowersUri.bind(context)
1549
+ : (identifier) => {
1550
+ const uri = context.getFollowersUri(identifier);
1551
+ uri.searchParams.set("base-url", baseUrl);
1552
+ return uri;
1553
+ },
1535
1554
  context,
1536
1555
  filter: baseUrl != null ? new URL(baseUrl) : undefined,
1537
1556
  filterPredicate: baseUrl != null
@@ -2161,6 +2180,12 @@ export class ContextImpl {
2161
2180
  throw new Error("No first cursor dispatcher registered for followers collection.");
2162
2181
  }
2163
2182
  let cursor = await this.federation.followersCallbacks.firstCursor(this, identifier);
2183
+ if (cursor != null) {
2184
+ getLogger(["fedify", "federation", "outbox"]).warn("Since the followers collection dispatcher returned null for no " +
2185
+ "cursor (i.e., one-shot dispatcher), the pagination is used to fetch " +
2186
+ '"followers". However, it is recommended to implement the one-shot ' +
2187
+ "dispatcher for better performance.", { identifier });
2188
+ }
2164
2189
  while (cursor != null) {
2165
2190
  const result = await this.federation.followersCallbacks.dispatcher(this, identifier, cursor);
2166
2191
  if (result == null)
@@ -2516,7 +2541,7 @@ export class InboxContextImpl extends ContextImpl {
2516
2541
  }
2517
2542
  const carrier = {};
2518
2543
  propagation.inject(context.active(), carrier);
2519
- const promises = [];
2544
+ const messages = [];
2520
2545
  for (const inbox in inboxes) {
2521
2546
  const message = {
2522
2547
  type: "outbox",
@@ -2533,18 +2558,31 @@ export class InboxContextImpl extends ContextImpl {
2533
2558
  headers: {},
2534
2559
  traceContext: carrier,
2535
2560
  };
2536
- promises.push(this.federation.outboxQueue.enqueue(message));
2537
- }
2538
- const results = await Promise.allSettled(promises);
2539
- const errors = results
2540
- .filter((r) => r.status === "rejected")
2541
- .map((r) => r.reason);
2542
- if (errors.length > 0) {
2543
- logger.error("Failed to enqueue activity {activityId} to forward later:\n{errors}", { activityId: this.activityId, errors });
2544
- if (errors.length > 1) {
2545
- throw new AggregateError(errors, `Failed to enqueue activity ${this.activityId} to forward later.`);
2546
- }
2547
- throw errors[0];
2561
+ messages.push(message);
2562
+ }
2563
+ const { outboxQueue } = this.federation;
2564
+ if (outboxQueue.enqueueMany == null) {
2565
+ const promises = messages.map((m) => outboxQueue.enqueue(m));
2566
+ const results = await Promise.allSettled(promises);
2567
+ const errors = results
2568
+ .filter((r) => r.status === "rejected")
2569
+ .map((r) => r.reason);
2570
+ if (errors.length > 0) {
2571
+ logger.error("Failed to enqueue activity {activityId} to forward later:\n{errors}", { activityId: this.activityId, errors });
2572
+ if (errors.length > 1) {
2573
+ throw new AggregateError(errors, `Failed to enqueue activity ${this.activityId} to forward later.`);
2574
+ }
2575
+ throw errors[0];
2576
+ }
2577
+ }
2578
+ else {
2579
+ try {
2580
+ await outboxQueue.enqueueMany(messages);
2581
+ }
2582
+ catch (error) {
2583
+ logger.error("Failed to enqueue activity {activityId} to forward later:\n{error}", { activityId: this.activityId, error });
2584
+ throw error;
2585
+ }
2548
2586
  }
2549
2587
  }
2550
2588
  }
@@ -39,6 +39,22 @@ export class InProcessMessageQueue {
39
39
  }
40
40
  return Promise.resolve();
41
41
  }
42
+ enqueueMany(messages, options) {
43
+ if (messages.length === 0)
44
+ return Promise.resolve();
45
+ const delay = options?.delay == null
46
+ ? 0
47
+ : Math.max(options.delay.total("millisecond"), 0);
48
+ if (delay > 0) {
49
+ setTimeout(() => this.enqueueMany(messages, { ...options, delay: undefined }), delay);
50
+ return Promise.resolve();
51
+ }
52
+ this.#messages.push(...messages);
53
+ for (const monitorId in this.#monitors) {
54
+ this.#monitors[monitorId]();
55
+ }
56
+ return Promise.resolve();
57
+ }
42
58
  async listen(handler, options = {}) {
43
59
  const signal = options.signal;
44
60
  while (signal == null || !signal.aborted) {
@@ -107,6 +123,21 @@ export class ParallelMessageQueue {
107
123
  enqueue(message, options) {
108
124
  return this.queue.enqueue(message, options);
109
125
  }
126
+ async enqueueMany(messages, options) {
127
+ if (this.queue.enqueueMany == null) {
128
+ const results = await Promise.allSettled(messages.map((message) => this.queue.enqueue(message, options)));
129
+ const errors = results
130
+ .filter((r) => r.status === "rejected")
131
+ .map((r) => r.reason);
132
+ if (errors.length > 1) {
133
+ throw new AggregateError(errors, "Failed to enqueue messages.");
134
+ }
135
+ else if (errors.length === 1)
136
+ throw errors[0];
137
+ return;
138
+ }
139
+ await this.queue.enqueueMany(messages, options);
140
+ }
110
141
  listen(handler, options = {}) {
111
142
  const workers = new Map();
112
143
  return this.queue.listen(async (message) => {
@@ -1,8 +1,8 @@
1
1
  import * as dntShim from "../_dnt.shims.js";
2
2
  import { concat } from "../deps/jsr.io/@std/bytes/1.0.5/concat.js";
3
- import { decodeBase64, encodeBase64 } from "../deps/jsr.io/@std/encoding/1.0.7/base64.js";
4
- import { decodeBase64Url } from "../deps/jsr.io/@std/encoding/1.0.7/base64url.js";
5
- import { decodeHex } from "../deps/jsr.io/@std/encoding/1.0.7/hex.js";
3
+ import { decodeBase64, encodeBase64 } from "../deps/jsr.io/@std/encoding/1.0.8/base64.js";
4
+ import { decodeBase64Url } from "../deps/jsr.io/@std/encoding/1.0.8/base64url.js";
5
+ import { decodeHex } from "../deps/jsr.io/@std/encoding/1.0.8/hex.js";
6
6
  import { Integer, Sequence } from "asn1js";
7
7
  import { decode, encode } from "./multibase/index.js";
8
8
  import { addPrefix, getCodeFromData, rmPrefix } from "multicodec";
package/esm/sig/http.js CHANGED
@@ -3,8 +3,8 @@ import { getLogger } from "@logtape/logtape";
3
3
  import { SpanStatusCode, trace, } from "@opentelemetry/api";
4
4
  import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, ATTR_URL_FULL, } from "@opentelemetry/semantic-conventions";
5
5
  import { equals } from "../deps/jsr.io/@std/bytes/1.0.5/mod.js";
6
- import { decodeBase64, encodeBase64 } from "../deps/jsr.io/@std/encoding/1.0.7/base64.js";
7
- import { encodeHex } from "../deps/jsr.io/@std/encoding/1.0.7/hex.js";
6
+ import { decodeBase64, encodeBase64 } from "../deps/jsr.io/@std/encoding/1.0.8/base64.js";
7
+ import { encodeHex } from "../deps/jsr.io/@std/encoding/1.0.8/hex.js";
8
8
  import metadata from "../deno.js";
9
9
  import { CryptographicKey } from "../vocab/vocab.js";
10
10
  import { fetchKey, validateCryptoKey } from "./key.js";
package/esm/sig/ld.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as dntShim from "../_dnt.shims.js";
2
2
  import { getLogger } from "@logtape/logtape";
3
3
  import { SpanStatusCode, trace } from "@opentelemetry/api";
4
- import { decodeBase64, encodeBase64 } from "../deps/jsr.io/@std/encoding/1.0.7/base64.js";
5
- import { encodeHex } from "../deps/jsr.io/@std/encoding/1.0.7/hex.js";
4
+ import { decodeBase64, encodeBase64 } from "../deps/jsr.io/@std/encoding/1.0.8/base64.js";
5
+ import { encodeHex } from "../deps/jsr.io/@std/encoding/1.0.8/hex.js";
6
6
  // @ts-ignore TS7016
7
7
  import jsonld from "jsonld";
8
8
  import metadata from "../deno.js";
package/esm/sig/proof.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as dntShim from "../_dnt.shims.js";
2
2
  import { getLogger } from "@logtape/logtape";
3
3
  import { SpanStatusCode, trace } from "@opentelemetry/api";
4
- import { encodeHex } from "../deps/jsr.io/@std/encoding/1.0.7/hex.js";
4
+ import { encodeHex } from "../deps/jsr.io/@std/encoding/1.0.8/hex.js";
5
5
  // @ts-ignore: json-canon is not typed
6
6
  import serialize from "json-canon";
7
7
  import metadata from "../deno.js";
@@ -1,7 +1,7 @@
1
1
  import * as dntShim from "../_dnt.shims.js";
2
2
  import { getLogger } from "@logtape/logtape";
3
3
  import { SpanStatusCode, trace } from "@opentelemetry/api";
4
- import { delay } from "../deps/jsr.io/@std/async/1.0.11/delay.js";
4
+ import { delay } from "../deps/jsr.io/@std/async/1.0.12/delay.js";
5
5
  import metadata from "../deno.js";
6
6
  import { getDocumentLoader, } from "../runtime/docloader.js";
7
7
  import { lookupWebFinger } from "../webfinger/lookup.js";