@fedify/fedify 0.11.0-dev.229 → 0.11.0-dev.234

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 CHANGED
@@ -8,6 +8,10 @@ Version 0.11.0
8
8
 
9
9
  To be released.
10
10
 
11
+ - Improved runtime type error messages for Activity Vocabulary API. [[#79]]
12
+
13
+ - Added `Federation.setInboxDispatcher()` method. [[#71]]
14
+
11
15
  - Frequently used JSON-LD contexts are now preloaded. [[74]]
12
16
 
13
17
  - The `fetchDocumentLoader()` function now preloads the following JSON-LD
@@ -25,8 +29,10 @@ To be released.
25
29
  - Added `Offer` class to Activity Vocabulary API.
26
30
  [[#65], [#76] by Lee Dogeon]
27
31
 
32
+ [#71]: https://github.com/dahlia/fedify/issues/71
28
33
  [#74]: https://github.com/dahlia/fedify/issues/74
29
34
  [#76]: https://github.com/dahlia/fedify/pull/76
35
+ [#79]: https://github.com/dahlia/fedify/issues/79
30
36
 
31
37
 
32
38
  Version 0.10.0
@@ -42,6 +42,8 @@ export class Federation {
42
42
  #actorCallbacks;
43
43
  #objectCallbacks;
44
44
  #objectTypeIds;
45
+ #inboxPath;
46
+ #inboxCallbacks;
45
47
  #outboxCallbacks;
46
48
  #followingCallbacks;
47
49
  #followersCallbacks;
@@ -79,7 +81,6 @@ export class Federation {
79
81
  this.#router = new Router();
80
82
  this.#router.add("/.well-known/webfinger", "webfinger");
81
83
  this.#router.add("/.well-known/nodeinfo", "nodeInfoJrd");
82
- this.#inboxListeners = new Map();
83
84
  this.#objectCallbacks = {};
84
85
  this.#objectTypeIds = {};
85
86
  this.#documentLoader = options.documentLoader ?? kvCache({
@@ -405,6 +406,58 @@ export class Federation {
405
406
  };
406
407
  return setters;
407
408
  }
409
+ /**
410
+ * Registers an inbox dispatcher.
411
+ *
412
+ * @param path The URI path pattern for the outbox dispatcher. The syntax is
413
+ * based on URI Template
414
+ * ([RFC 6570](https://tools.ietf.org/html/rfc6570)). The path
415
+ * must have one variable: `{handle}`, and must match the inbox
416
+ * listener path.
417
+ * @param dispatcher An inbox dispatcher callback to register.
418
+ * @throws {@link RouterError} Thrown if the path pattern is invalid.
419
+ * @since 0.11.0
420
+ */
421
+ setInboxDispatcher(path, dispatcher) {
422
+ if (this.#inboxCallbacks != null) {
423
+ throw new RouterError("Inbox dispatcher already set.");
424
+ }
425
+ if (this.#router.has("inbox")) {
426
+ if (this.#inboxPath !== path) {
427
+ throw new RouterError("Inbox dispatcher path must match inbox listener path.");
428
+ }
429
+ }
430
+ else {
431
+ const variables = this.#router.add(path, "inbox");
432
+ if (variables.size !== 1 || !variables.has("handle")) {
433
+ throw new RouterError("Path for inbox dispatcher must have one variable: {handle}");
434
+ }
435
+ this.#inboxPath = path;
436
+ }
437
+ const callbacks = {
438
+ dispatcher,
439
+ };
440
+ this.#inboxCallbacks = callbacks;
441
+ const setters = {
442
+ setCounter(counter) {
443
+ callbacks.counter = counter;
444
+ return setters;
445
+ },
446
+ setFirstCursor(cursor) {
447
+ callbacks.firstCursor = cursor;
448
+ return setters;
449
+ },
450
+ setLastCursor(cursor) {
451
+ callbacks.lastCursor = cursor;
452
+ return setters;
453
+ },
454
+ authorize(predicate) {
455
+ callbacks.authorizePredicate = predicate;
456
+ return setters;
457
+ },
458
+ };
459
+ return setters;
460
+ }
408
461
  /**
409
462
  * Registers an outbox dispatcher.
410
463
  *
@@ -567,7 +620,8 @@ export class Federation {
567
620
  * @param inboxPath The URI path pattern for the inbox. The syntax is based
568
621
  * on URI Template
569
622
  * ([RFC 6570](https://tools.ietf.org/html/rfc6570)).
570
- * The path must have one variable: `{handle}`.
623
+ * The path must have one variable: `{handle}`, and must
624
+ * match the inbox dispatcher path.
571
625
  * @param sharedInboxPath An optional URI path pattern for the shared inbox.
572
626
  * The syntax is based on URI Template
573
627
  * ([RFC 6570](https://tools.ietf.org/html/rfc6570)).
@@ -576,12 +630,19 @@ export class Federation {
576
630
  * @throws {RouteError} Thrown if the path pattern is invalid.
577
631
  */
578
632
  setInboxListeners(inboxPath, sharedInboxPath) {
633
+ if (this.#inboxListeners != null) {
634
+ throw new RouterError("Inbox listeners already set.");
635
+ }
579
636
  if (this.#router.has("inbox")) {
580
- throw new RouterError("Inbox already set.");
637
+ if (this.#inboxPath !== inboxPath) {
638
+ throw new RouterError("Inbox listener path must match inbox dispatcher path.");
639
+ }
581
640
  }
582
- const variables = this.#router.add(inboxPath, "inbox");
583
- if (variables.size !== 1 || !variables.has("handle")) {
584
- throw new RouterError("Path for inbox must have one variable: {handle}");
641
+ else {
642
+ const variables = this.#router.add(inboxPath, "inbox");
643
+ if (variables.size !== 1 || !variables.has("handle")) {
644
+ throw new RouterError("Path for inbox must have one variable: {handle}");
645
+ }
585
646
  }
586
647
  if (sharedInboxPath != null) {
587
648
  const siVars = this.#router.add(sharedInboxPath, "sharedInbox");
@@ -589,7 +650,7 @@ export class Federation {
589
650
  throw new RouterError("Path for shared inbox must have no variables.");
590
651
  }
591
652
  }
592
- const listeners = this.#inboxListeners;
653
+ const listeners = this.#inboxListeners = new Map();
593
654
  const setter = {
594
655
  on(
595
656
  // deno-lint-ignore no-explicit-any
@@ -790,6 +851,17 @@ export class Federation {
790
851
  onNotAcceptable,
791
852
  });
792
853
  case "inbox":
854
+ if (request.method !== "POST") {
855
+ return await handleCollection(request, {
856
+ name: "inbox",
857
+ handle: route.values.handle,
858
+ context,
859
+ collectionCallbacks: this.#inboxCallbacks,
860
+ onUnauthorized,
861
+ onNotFound,
862
+ onNotAcceptable,
863
+ });
864
+ }
793
865
  context = this.#createContext(request, contextData, {
794
866
  documentLoader: await context.getDocumentLoader({
795
867
  handle: route.values.handle,
@@ -803,7 +875,7 @@ export class Federation {
803
875
  kv: this.#kv,
804
876
  kvPrefix: this.#kvPrefixes.activityIdempotence,
805
877
  actorDispatcher: this.#actorCallbacks?.dispatcher,
806
- inboxListeners: this.#inboxListeners,
878
+ inboxListeners: this.#inboxListeners ?? new Map(),
807
879
  inboxErrorHandler: this.#inboxErrorHandler,
808
880
  onNotFound,
809
881
  signatureTimeWindow: this.#signatureTimeWindow,