@fedify/fedify 2.0.0-dev.323 → 2.0.0-dev.335

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 (60) hide show
  1. package/dist/{builder-CvKuNW7P.js → builder-RHW0dkbP.js} +8 -3
  2. package/dist/compat/mod.d.cts +2 -2
  3. package/dist/compat/mod.d.ts +2 -2
  4. package/dist/compat/transformers.test.js +11 -11
  5. package/dist/{context-Zqld1re2.d.cts → context-Cf0-LmZC.d.cts} +92 -1
  6. package/dist/{context-CJO1oqSa.d.ts → context-liIe6DFH.d.ts} +92 -1
  7. package/dist/{deno-BTAi5-ur.js → deno-Dhe5E7NK.js} +1 -1
  8. package/dist/{docloader-D8dzb6AT.js → docloader-D6VuU143.js} +2 -2
  9. package/dist/federation/builder.test.js +3 -3
  10. package/dist/federation/handler.test.js +11 -11
  11. package/dist/federation/idempotency.test.js +11 -11
  12. package/dist/federation/inbox.test.js +2 -2
  13. package/dist/federation/middleware.test.js +171 -11
  14. package/dist/federation/mod.cjs +5 -4
  15. package/dist/federation/mod.d.cts +3 -3
  16. package/dist/federation/mod.d.ts +3 -3
  17. package/dist/federation/mod.js +5 -5
  18. package/dist/federation/send.test.js +89 -6
  19. package/dist/federation/webfinger.test.js +11 -11
  20. package/dist/{http-C4WANccp.js → http-CSqVEUdE.js} +2 -2
  21. package/dist/{http-BCfCt7nq.cjs → http-ChlQCtql.cjs} +1 -1
  22. package/dist/{http-C02fQ5SX.js → http-DZrrJD77.js} +1 -1
  23. package/dist/{inbox-CdBcxHA7.js → inbox-9F91oWJU.js} +1 -1
  24. package/dist/{key-BI6sqU5u.js → key-DFPkYar3.js} +1 -1
  25. package/dist/{kv-cache-BLxaWwPk.js → kv-cache-1TNWtgx7.js} +1 -1
  26. package/dist/{kv-cache-Dk9UX_M2.cjs → kv-cache-DwcKE9EQ.cjs} +1 -1
  27. package/dist/{ld-qTcTL2A4.js → ld-kAhyoO55.js} +2 -2
  28. package/dist/{middleware-BhYGJwH9.js → middleware-BgurYNZ4.js} +4 -4
  29. package/dist/{middleware-nW8ONmt3.cjs → middleware-CULfPNt-.cjs} +85 -6
  30. package/dist/middleware-ChlsNVu2.cjs +12 -0
  31. package/dist/{middleware-LQKxYF7X.js → middleware-DQriD-Kq.js} +80 -7
  32. package/dist/{middleware-DG4UsFBP.js → middleware-DebYvXJs.js} +11 -11
  33. package/dist/{middleware-DaOdxVOc.js → middleware-zvH5O0zk.js} +45 -11
  34. package/dist/{mod-Bpuc-q64.d.ts → mod-B9_l3te3.d.ts} +1 -1
  35. package/dist/{mod-CKtAEVny.d.cts → mod-Do_sZWAA.d.cts} +1 -1
  36. package/dist/{mod-C92O3FpJ.d.ts → mod-Dquroqiv.d.ts} +1 -1
  37. package/dist/{mod-DFWeUq2q.d.cts → mod-H3ScYaOb.d.cts} +1 -1
  38. package/dist/mod.cjs +6 -4
  39. package/dist/mod.d.cts +5 -5
  40. package/dist/mod.d.ts +5 -5
  41. package/dist/mod.js +6 -5
  42. package/dist/nodeinfo/handler.test.js +11 -11
  43. package/dist/{owner-Cfmtlwoe.js → owner-DcyH0sQg.js} +1 -1
  44. package/dist/{proof-Bc8ULrzP.js → proof-D7C8ouBO.js} +2 -2
  45. package/dist/{proof-OjMPhNWs.js → proof-JtZEQaKw.js} +1 -1
  46. package/dist/{proof-BoqEqbih.cjs → proof-_Rz8hNBt.cjs} +1 -1
  47. package/dist/{send-BKW3wSXo.js → send-mAsnzegg.js} +38 -4
  48. package/dist/sig/http.test.js +3 -3
  49. package/dist/sig/key.test.js +2 -2
  50. package/dist/sig/ld.test.js +3 -3
  51. package/dist/sig/mod.cjs +2 -2
  52. package/dist/sig/mod.js +2 -2
  53. package/dist/sig/owner.test.js +3 -3
  54. package/dist/sig/proof.test.js +3 -3
  55. package/dist/testing/mod.d.ts +80 -0
  56. package/dist/utils/docloader.test.js +4 -4
  57. package/dist/utils/mod.cjs +2 -2
  58. package/dist/utils/mod.js +2 -2
  59. package/package.json +5 -5
  60. package/dist/middleware-Dsrm1uhx.cjs +0 -12
@@ -8,25 +8,25 @@ import { assertEquals } from "../assert_equals-DSbWqCm3.js";
8
8
  import { assert } from "../assert-MZs1qjMx.js";
9
9
  import { assertInstanceOf } from "../assert_instance_of-DHz7EHNU.js";
10
10
  import { MemoryKvStore } from "../kv-QzKcOQgP.js";
11
- import "../deno-BTAi5-ur.js";
12
- import { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer, createFederation } from "../middleware-DaOdxVOc.js";
11
+ import "../deno-Dhe5E7NK.js";
12
+ import { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer, createFederation } from "../middleware-zvH5O0zk.js";
13
13
  import "../client-Dg7OfUDA.js";
14
14
  import { RouterError } from "../router-D9eI0s4b.js";
15
15
  import "../types-CPz01LGH.js";
16
- import "../key-BI6sqU5u.js";
17
- import { signRequest, verifyRequest } from "../http-C4WANccp.js";
18
- import { detachSignature, signJsonLd, verifyJsonLd } from "../ld-qTcTL2A4.js";
19
- import { doesActorOwnKey } from "../owner-Cfmtlwoe.js";
20
- import { signObject, verifyObject } from "../proof-Bc8ULrzP.js";
21
- import { fetchDocumentLoader, getAuthenticatedDocumentLoader } from "../docloader-D8dzb6AT.js";
16
+ import "../key-DFPkYar3.js";
17
+ import { signRequest, verifyRequest } from "../http-CSqVEUdE.js";
18
+ import { detachSignature, signJsonLd, verifyJsonLd } from "../ld-kAhyoO55.js";
19
+ import { doesActorOwnKey } from "../owner-DcyH0sQg.js";
20
+ import { signObject, verifyObject } from "../proof-D7C8ouBO.js";
21
+ import { fetchDocumentLoader, getAuthenticatedDocumentLoader } from "../docloader-D6VuU143.js";
22
22
  import "../kv-cache-B__dHl7g.js";
23
- import "../inbox-CdBcxHA7.js";
24
- import "../builder-CvKuNW7P.js";
23
+ import "../inbox-9F91oWJU.js";
24
+ import "../builder-RHW0dkbP.js";
25
25
  import "../collection-CcnIw1qY.js";
26
26
  import "../keycache-DRxpZ5r9.js";
27
27
  import "../negotiation-5NPJL6zp.js";
28
28
  import "../retry-D4GJ670a.js";
29
- import "../send-BKW3wSXo.js";
29
+ import "../send-mAsnzegg.js";
30
30
  import { assertStrictEquals } from "../std__assert-DWivtrGR.js";
31
31
  import { assertFalse, assertRejects } from "../assert_rejects-Ce45JcFg.js";
32
32
  import { assertThrows } from "../assert_throws-BNXdRGWP.js";
@@ -1383,6 +1383,166 @@ test("FederationImpl.processQueuedTask()", async (t) => {
1383
1383
  }]);
1384
1384
  });
1385
1385
  });
1386
+ test("FederationImpl.processQueuedTask() permanent failure", async (t) => {
1387
+ esm_default.spyGlobal();
1388
+ esm_default.post("https://gone.example/inbox", {
1389
+ status: 410,
1390
+ body: "Gone"
1391
+ });
1392
+ esm_default.post("https://notfound.example/inbox", {
1393
+ status: 404,
1394
+ body: "Not Found"
1395
+ });
1396
+ esm_default.post("https://error.example/inbox", {
1397
+ status: 500,
1398
+ body: "Internal Server Error"
1399
+ });
1400
+ esm_default.post("https://legal.example/inbox", {
1401
+ status: 451,
1402
+ body: "Unavailable For Legal Reasons"
1403
+ });
1404
+ function setup(options = {}) {
1405
+ const kv = new MemoryKvStore();
1406
+ const queuedMessages = [];
1407
+ const queue = {
1408
+ ...options.nativeRetrial ? { nativeRetrial: true } : {},
1409
+ enqueue(message, _options) {
1410
+ queuedMessages.push(message);
1411
+ return Promise.resolve();
1412
+ },
1413
+ listen(_handler, _options) {
1414
+ return Promise.resolve();
1415
+ }
1416
+ };
1417
+ const federation = new FederationImpl({
1418
+ kv,
1419
+ queue,
1420
+ ...options.permanentFailureStatusCodes ? { permanentFailureStatusCodes: options.permanentFailureStatusCodes } : {}
1421
+ });
1422
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox");
1423
+ return {
1424
+ federation,
1425
+ queuedMessages
1426
+ };
1427
+ }
1428
+ function createOutboxMessage(inbox, activityId, actorIds) {
1429
+ return {
1430
+ type: "outbox",
1431
+ id: crypto.randomUUID(),
1432
+ baseUrl: "https://example.com",
1433
+ keys: [],
1434
+ activity: {
1435
+ "@context": "https://www.w3.org/ns/activitystreams",
1436
+ type: "Create",
1437
+ id: activityId,
1438
+ actor: "https://example.com/users/alice",
1439
+ object: {
1440
+ type: "Note",
1441
+ content: "test"
1442
+ }
1443
+ },
1444
+ activityType: "https://www.w3.org/ns/activitystreams#Create",
1445
+ inbox,
1446
+ sharedInbox: false,
1447
+ ...actorIds != null ? { actorIds } : {},
1448
+ started: (/* @__PURE__ */ new Date()).toISOString(),
1449
+ attempt: 0,
1450
+ headers: {},
1451
+ traceContext: {}
1452
+ };
1453
+ }
1454
+ await t.step("410 Gone triggers permanent failure handler", async () => {
1455
+ const { federation, queuedMessages } = setup();
1456
+ let handlerCalled = false;
1457
+ let handlerValues = {};
1458
+ federation.setOutboxPermanentFailureHandler((_ctx, values) => {
1459
+ handlerCalled = true;
1460
+ handlerValues = { ...values };
1461
+ });
1462
+ await federation.processQueuedTask(void 0, createOutboxMessage("https://gone.example/inbox", "https://example.com/activity/1", ["https://gone.example/users/bob", "https://gone.example/users/charlie"]));
1463
+ assert(handlerCalled, "Permanent failure handler should be called");
1464
+ assertEquals(handlerValues.inbox, new URL("https://gone.example/inbox"));
1465
+ assertEquals(handlerValues.statusCode, 410);
1466
+ assertInstanceOf(handlerValues.activity, vocab.Create);
1467
+ assertEquals(handlerValues.actorIds, [new URL("https://gone.example/users/bob"), new URL("https://gone.example/users/charlie")]);
1468
+ assertEquals(queuedMessages, []);
1469
+ });
1470
+ await t.step("404 Not Found triggers permanent failure handler", async () => {
1471
+ const { federation, queuedMessages } = setup();
1472
+ let handlerCalled = false;
1473
+ let handlerStatusCode = 0;
1474
+ federation.setOutboxPermanentFailureHandler((_ctx, values) => {
1475
+ handlerCalled = true;
1476
+ handlerStatusCode = values.statusCode;
1477
+ });
1478
+ await federation.processQueuedTask(void 0, createOutboxMessage("https://notfound.example/inbox", "https://example.com/activity/2", ["https://notfound.example/users/bob"]));
1479
+ assert(handlerCalled, "Permanent failure handler should be called");
1480
+ assertEquals(handlerStatusCode, 404);
1481
+ assertEquals(queuedMessages, []);
1482
+ });
1483
+ await t.step("500 error does NOT trigger permanent failure handler", async () => {
1484
+ const { federation, queuedMessages } = setup();
1485
+ let handlerCalled = false;
1486
+ federation.setOutboxPermanentFailureHandler(() => {
1487
+ handlerCalled = true;
1488
+ });
1489
+ await federation.processQueuedTask(void 0, createOutboxMessage("https://error.example/inbox", "https://example.com/activity/3", ["https://error.example/users/bob"]));
1490
+ assertFalse(handlerCalled, "Permanent failure handler should NOT be called");
1491
+ assertEquals(queuedMessages.length, 1);
1492
+ assertEquals(queuedMessages[0].attempt, 1);
1493
+ });
1494
+ await t.step("custom permanentFailureStatusCodes", async () => {
1495
+ const { federation, queuedMessages } = setup({ permanentFailureStatusCodes: [
1496
+ 404,
1497
+ 410,
1498
+ 451
1499
+ ] });
1500
+ let handlerCalled = false;
1501
+ let handlerStatusCode = 0;
1502
+ federation.setOutboxPermanentFailureHandler((_ctx, values) => {
1503
+ handlerCalled = true;
1504
+ handlerStatusCode = values.statusCode;
1505
+ });
1506
+ await federation.processQueuedTask(void 0, createOutboxMessage("https://legal.example/inbox", "https://example.com/activity/4", ["https://legal.example/users/bob"]));
1507
+ assert(handlerCalled, "Permanent failure handler should be called for 451");
1508
+ assertEquals(handlerStatusCode, 451);
1509
+ assertEquals(queuedMessages, []);
1510
+ });
1511
+ await t.step("handler exception is caught and logged", async () => {
1512
+ const { federation, queuedMessages } = setup();
1513
+ federation.setOutboxPermanentFailureHandler(() => {
1514
+ throw new Error("Handler error that should be ignored");
1515
+ });
1516
+ await federation.processQueuedTask(void 0, createOutboxMessage("https://gone.example/inbox", "https://example.com/activity/5", ["https://gone.example/users/bob"]));
1517
+ assertEquals(queuedMessages, []);
1518
+ });
1519
+ await t.step("permanent failure skips retry without handler registered", async () => {
1520
+ const { federation, queuedMessages } = setup();
1521
+ await federation.processQueuedTask(void 0, createOutboxMessage("https://gone.example/inbox", "https://example.com/activity/6", []));
1522
+ assertEquals(queuedMessages, []);
1523
+ });
1524
+ await t.step("nativeRetrial: permanent failure does not re-throw", async () => {
1525
+ const { federation, queuedMessages } = setup({ nativeRetrial: true });
1526
+ let handlerCalled = false;
1527
+ federation.setOutboxPermanentFailureHandler(() => {
1528
+ handlerCalled = true;
1529
+ });
1530
+ await federation.processQueuedTask(void 0, createOutboxMessage("https://gone.example/inbox", "https://example.com/activity/7", ["https://gone.example/users/bob"]));
1531
+ assert(handlerCalled, "Permanent failure handler should be called");
1532
+ assertEquals(queuedMessages, []);
1533
+ });
1534
+ await t.step("actorIds missing from message defaults to empty array", async () => {
1535
+ const { federation, queuedMessages } = setup();
1536
+ let handlerActorIds = [];
1537
+ federation.setOutboxPermanentFailureHandler((_ctx, values) => {
1538
+ handlerActorIds = values.actorIds;
1539
+ });
1540
+ await federation.processQueuedTask(void 0, createOutboxMessage("https://gone.example/inbox", "https://example.com/activity/8"));
1541
+ assertEquals(handlerActorIds, []);
1542
+ assertEquals(queuedMessages, []);
1543
+ });
1544
+ esm_default.hardReset();
1545
+ });
1386
1546
  test("ContextImpl.lookupObject()", async (t) => {
1387
1547
  esm_default.spyGlobal();
1388
1548
  esm_default.get("begin:https://localhost/.well-known/webfinger", {
@@ -3,18 +3,19 @@
3
3
  const { URLPattern } = require("urlpattern-polyfill");
4
4
 
5
5
  require('../transformers-3g8GZwkZ.cjs');
6
- require('../http-BCfCt7nq.cjs');
7
- const require_middleware = require('../middleware-nW8ONmt3.cjs');
8
- require('../proof-BoqEqbih.cjs');
6
+ require('../http-ChlQCtql.cjs');
7
+ const require_middleware = require('../middleware-CULfPNt-.cjs');
8
+ require('../proof-_Rz8hNBt.cjs');
9
9
  const require_federation = require('../federation-Bp3HI26G.cjs');
10
10
  require('../types-Cd_hszr_.cjs');
11
- require('../kv-cache-Dk9UX_M2.cjs');
11
+ require('../kv-cache-DwcKE9EQ.cjs');
12
12
 
13
13
  exports.InProcessMessageQueue = require_federation.InProcessMessageQueue;
14
14
  exports.MemoryKvStore = require_federation.MemoryKvStore;
15
15
  exports.ParallelMessageQueue = require_federation.ParallelMessageQueue;
16
16
  exports.Router = require_middleware.Router;
17
17
  exports.RouterError = require_middleware.RouterError;
18
+ exports.SendActivityError = require_middleware.SendActivityError;
18
19
  exports.buildCollectionSynchronizationHeader = require_middleware.buildCollectionSynchronizationHeader;
19
20
  exports.createExponentialBackoffPolicy = require_middleware.createExponentialBackoffPolicy;
20
21
  exports.createFederation = require_middleware.createFederation;
@@ -1,7 +1,7 @@
1
1
  import "../client-CwkOPN13.cjs";
2
2
  import "../http-CCEu-x1_.cjs";
3
3
  import "../owner-9yZ5Ibsb.cjs";
4
- import { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable } from "../context-Zqld1re2.cjs";
4
+ import { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, OutboxPermanentFailureHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityError, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable } from "../context-Cf0-LmZC.cjs";
5
5
  import { KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore } from "../kv-g9jFc34-.cjs";
6
- import { WebFingerHandlerParameters, handleWebFinger } from "../mod-CKtAEVny.cjs";
7
- export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable };
6
+ import { WebFingerHandlerParameters, handleWebFinger } from "../mod-Do_sZWAA.cjs";
7
+ export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, OutboxPermanentFailureHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityError, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable };
@@ -3,7 +3,7 @@ import { URLPattern } from "urlpattern-polyfill";
3
3
  import "../client-a7NwzhA2.js";
4
4
  import "../http-CODSJcKx.js";
5
5
  import "../owner-DQYAbVmX.js";
6
- import { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable } from "../context-CJO1oqSa.js";
6
+ import { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, OutboxPermanentFailureHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityError, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable } from "../context-liIe6DFH.js";
7
7
  import { KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore } from "../kv-jg_8SMc1.js";
8
- import { WebFingerHandlerParameters, handleWebFinger } from "../mod-C92O3FpJ.js";
9
- export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable };
8
+ import { WebFingerHandlerParameters, handleWebFinger } from "../mod-Dquroqiv.js";
9
+ export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CreateFederationOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxErrorHandler, OutboxPermanentFailureHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityError, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable };
@@ -3,11 +3,11 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
 
5
5
  import "../transformers-C3FLHUd6.js";
6
- import "../http-C02fQ5SX.js";
7
- import { Router, RouterError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable } from "../middleware-LQKxYF7X.js";
8
- import "../proof-OjMPhNWs.js";
6
+ import "../http-DZrrJD77.js";
7
+ import { Router, RouterError, SendActivityError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable } from "../middleware-DQriD-Kq.js";
8
+ import "../proof-JtZEQaKw.js";
9
9
  import { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue } from "../federation-DaMfqRm4.js";
10
10
  import "../types-C93Ob9cU.js";
11
- import "../kv-cache-BLxaWwPk.js";
11
+ import "../kv-cache-1TNWtgx7.js";
12
12
 
13
- export { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue, Router, RouterError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable };
13
+ export { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue, Router, RouterError, SendActivityError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable };
@@ -6,12 +6,12 @@
6
6
  import { createTestTracerProvider, mockDocumentLoader, test } from "../dist-B5f6a8Tt.js";
7
7
  import { assertEquals } from "../assert_equals-DSbWqCm3.js";
8
8
  import { assert } from "../assert-MZs1qjMx.js";
9
- import "../assert_instance_of-DHz7EHNU.js";
10
- import "../deno-BTAi5-ur.js";
11
- import "../key-BI6sqU5u.js";
12
- import { verifyRequest } from "../http-C4WANccp.js";
13
- import { doesActorOwnKey } from "../owner-Cfmtlwoe.js";
14
- import { extractInboxes, sendActivity } from "../send-BKW3wSXo.js";
9
+ import { assertInstanceOf } from "../assert_instance_of-DHz7EHNU.js";
10
+ import "../deno-Dhe5E7NK.js";
11
+ import "../key-DFPkYar3.js";
12
+ import { verifyRequest } from "../http-CSqVEUdE.js";
13
+ import { doesActorOwnKey } from "../owner-DcyH0sQg.js";
14
+ import { SendActivityError, extractInboxes, sendActivity } from "../send-mAsnzegg.js";
15
15
  import "../std__assert-DWivtrGR.js";
16
16
  import { assertFalse, assertRejects } from "../assert_rejects-Ce45JcFg.js";
17
17
  import "../assert_throws-BNXdRGWP.js";
@@ -210,6 +210,89 @@ test("sendActivity()", async (t) => {
210
210
  inbox: new URL("https://example.com/inbox2")
211
211
  }), Error, "Failed to send activity https://example.com/activity to https://example.com/inbox2 (500 Internal Server Error):\nsomething went wrong");
212
212
  });
213
+ await t.step("failure throws SendActivityError", async () => {
214
+ const activity = {
215
+ "@context": "https://www.w3.org/ns/activitystreams",
216
+ "type": "Create",
217
+ "id": "https://example.com/activity",
218
+ "actor": "https://example.com/person"
219
+ };
220
+ try {
221
+ await sendActivity({
222
+ activity,
223
+ activityId: "https://example.com/activity",
224
+ keys: [{
225
+ privateKey: rsaPrivateKey2,
226
+ keyId: rsaPublicKey2.id
227
+ }],
228
+ inbox: new URL("https://example.com/inbox2")
229
+ });
230
+ assert(false, "Should have thrown");
231
+ } catch (e) {
232
+ assertInstanceOf(e, SendActivityError);
233
+ assertEquals(e.statusCode, 500);
234
+ assertEquals(e.inbox, new URL("https://example.com/inbox2"));
235
+ assertEquals(e.responseBody, "something went wrong");
236
+ }
237
+ });
238
+ esm_default.post("https://example.com/inbox-gone", {
239
+ status: 410,
240
+ body: "Gone"
241
+ });
242
+ await t.step("410 Gone throws SendActivityError", async () => {
243
+ const activity = {
244
+ "@context": "https://www.w3.org/ns/activitystreams",
245
+ "type": "Create",
246
+ "id": "https://example.com/activity",
247
+ "actor": "https://example.com/person"
248
+ };
249
+ try {
250
+ await sendActivity({
251
+ activity,
252
+ activityId: "https://example.com/activity",
253
+ keys: [{
254
+ privateKey: rsaPrivateKey2,
255
+ keyId: rsaPublicKey2.id
256
+ }],
257
+ inbox: new URL("https://example.com/inbox-gone")
258
+ });
259
+ assert(false, "Should have thrown");
260
+ } catch (e) {
261
+ assertInstanceOf(e, SendActivityError);
262
+ assertEquals(e.statusCode, 410);
263
+ assertEquals(e.inbox, new URL("https://example.com/inbox-gone"));
264
+ assertEquals(e.responseBody, "Gone");
265
+ }
266
+ });
267
+ esm_default.post("https://example.com/inbox-notfound", {
268
+ status: 404,
269
+ body: "Not Found"
270
+ });
271
+ await t.step("404 Not Found throws SendActivityError", async () => {
272
+ const activity = {
273
+ "@context": "https://www.w3.org/ns/activitystreams",
274
+ "type": "Create",
275
+ "id": "https://example.com/activity",
276
+ "actor": "https://example.com/person"
277
+ };
278
+ try {
279
+ await sendActivity({
280
+ activity,
281
+ activityId: "https://example.com/activity",
282
+ keys: [{
283
+ privateKey: rsaPrivateKey2,
284
+ keyId: rsaPublicKey2.id
285
+ }],
286
+ inbox: new URL("https://example.com/inbox-notfound")
287
+ });
288
+ assert(false, "Should have thrown");
289
+ } catch (e) {
290
+ assertInstanceOf(e, SendActivityError);
291
+ assertEquals(e.statusCode, 404);
292
+ assertEquals(e.inbox, new URL("https://example.com/inbox-notfound"));
293
+ assertEquals(e.responseBody, "Not Found");
294
+ }
295
+ });
213
296
  esm_default.hardReset();
214
297
  });
215
298
  test("sendActivity() records OpenTelemetry span events", async (t) => {
@@ -8,25 +8,25 @@ import { assertEquals } from "../assert_equals-DSbWqCm3.js";
8
8
  import "../assert-MZs1qjMx.js";
9
9
  import "../assert_instance_of-DHz7EHNU.js";
10
10
  import { MemoryKvStore } from "../kv-QzKcOQgP.js";
11
- import "../deno-BTAi5-ur.js";
12
- import { createFederation, handleWebFinger } from "../middleware-DaOdxVOc.js";
11
+ import "../deno-Dhe5E7NK.js";
12
+ import { createFederation, handleWebFinger } from "../middleware-zvH5O0zk.js";
13
13
  import "../client-Dg7OfUDA.js";
14
14
  import "../router-D9eI0s4b.js";
15
15
  import "../types-CPz01LGH.js";
16
- import "../key-BI6sqU5u.js";
17
- import "../http-C4WANccp.js";
18
- import "../ld-qTcTL2A4.js";
19
- import "../owner-Cfmtlwoe.js";
20
- import "../proof-Bc8ULrzP.js";
21
- import "../docloader-D8dzb6AT.js";
16
+ import "../key-DFPkYar3.js";
17
+ import "../http-CSqVEUdE.js";
18
+ import "../ld-kAhyoO55.js";
19
+ import "../owner-DcyH0sQg.js";
20
+ import "../proof-D7C8ouBO.js";
21
+ import "../docloader-D6VuU143.js";
22
22
  import "../kv-cache-B__dHl7g.js";
23
- import "../inbox-CdBcxHA7.js";
24
- import "../builder-CvKuNW7P.js";
23
+ import "../inbox-9F91oWJU.js";
24
+ import "../builder-RHW0dkbP.js";
25
25
  import "../collection-CcnIw1qY.js";
26
26
  import "../keycache-DRxpZ5r9.js";
27
27
  import "../negotiation-5NPJL6zp.js";
28
28
  import "../retry-D4GJ670a.js";
29
- import "../send-BKW3wSXo.js";
29
+ import "../send-mAsnzegg.js";
30
30
  import "../std__assert-DWivtrGR.js";
31
31
  import "../assert_rejects-Ce45JcFg.js";
32
32
  import "../assert_throws-BNXdRGWP.js";
@@ -3,8 +3,8 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { deno_default } from "./deno-BTAi5-ur.js";
7
- import { fetchKey, validateCryptoKey } from "./key-BI6sqU5u.js";
6
+ import { deno_default } from "./deno-Dhe5E7NK.js";
7
+ import { fetchKey, validateCryptoKey } from "./key-DFPkYar3.js";
8
8
  import { getLogger } from "@logtape/logtape";
9
9
  import { CryptographicKey } from "@fedify/vocab";
10
10
  import { SpanStatusCode, trace } from "@opentelemetry/api";
@@ -14,7 +14,7 @@ const __fedify_vocab_runtime = require_chunk.__toESM(require("@fedify/vocab-runt
14
14
 
15
15
  //#region deno.json
16
16
  var name = "@fedify/fedify";
17
- var version = "2.0.0-dev.323+1d796545";
17
+ var version = "2.0.0-dev.335+6fe86704";
18
18
  var license = "MIT";
19
19
  var exports$1 = {
20
20
  ".": "./src/mod.ts",
@@ -13,7 +13,7 @@ import { getDocumentLoader } from "@fedify/vocab-runtime";
13
13
 
14
14
  //#region deno.json
15
15
  var name = "@fedify/fedify";
16
- var version = "2.0.0-dev.323+1d796545";
16
+ var version = "2.0.0-dev.335+6fe86704";
17
17
  var license = "MIT";
18
18
  var exports = {
19
19
  ".": "./src/mod.ts",
@@ -3,7 +3,7 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { deno_default } from "./deno-BTAi5-ur.js";
6
+ import { deno_default } from "./deno-Dhe5E7NK.js";
7
7
  import { getLogger } from "@logtape/logtape";
8
8
  import { Activity, getTypeId } from "@fedify/vocab";
9
9
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
@@ -3,7 +3,7 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { deno_default } from "./deno-BTAi5-ur.js";
6
+ import { deno_default } from "./deno-Dhe5E7NK.js";
7
7
  import { getLogger } from "@logtape/logtape";
8
8
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
9
9
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -2,7 +2,7 @@
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
 
5
- import { doubleKnock, validateCryptoKey } from "./http-C02fQ5SX.js";
5
+ import { doubleKnock, validateCryptoKey } from "./http-DZrrJD77.js";
6
6
  import { getLogger } from "@logtape/logtape";
7
7
  import { curry } from "es-toolkit";
8
8
  import { UrlError, createActivityPubRequest, getDocumentLoader, getRemoteDocument, logRequest, preloadedContexts, validatePublicUrl } from "@fedify/vocab-runtime";
@@ -3,7 +3,7 @@
3
3
  const { URLPattern } = require("urlpattern-polyfill");
4
4
 
5
5
  const require_chunk = require('./chunk-CGaQZ11T.cjs');
6
- const require_http = require('./http-BCfCt7nq.cjs');
6
+ const require_http = require('./http-ChlQCtql.cjs');
7
7
  const __logtape_logtape = require_chunk.__toESM(require("@logtape/logtape"));
8
8
  const es_toolkit = require_chunk.__toESM(require("es-toolkit"));
9
9
  const __fedify_vocab_runtime = require_chunk.__toESM(require("@fedify/vocab-runtime"));
@@ -3,8 +3,8 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { deno_default } from "./deno-BTAi5-ur.js";
7
- import { fetchKey, validateCryptoKey } from "./key-BI6sqU5u.js";
6
+ import { deno_default } from "./deno-Dhe5E7NK.js";
7
+ import { fetchKey, validateCryptoKey } from "./key-DFPkYar3.js";
8
8
  import { getLogger } from "@logtape/logtape";
9
9
  import { Activity, CryptographicKey, Object as Object$1, getTypeId } from "@fedify/vocab";
10
10
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -3,10 +3,10 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
 
5
5
  import "./transformers-C3FLHUd6.js";
6
- import "./http-C02fQ5SX.js";
7
- import { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer, createFederation } from "./middleware-LQKxYF7X.js";
8
- import "./proof-OjMPhNWs.js";
6
+ import "./http-DZrrJD77.js";
7
+ import { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer, createFederation } from "./middleware-DQriD-Kq.js";
8
+ import "./proof-JtZEQaKw.js";
9
9
  import "./types-C93Ob9cU.js";
10
- import "./kv-cache-BLxaWwPk.js";
10
+ import "./kv-cache-1TNWtgx7.js";
11
11
 
12
12
  export { FederationImpl };