@fedify/vocab 2.4.0-dev.1599 → 2.4.0-dev.1634

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 (41) hide show
  1. package/deno.json +1 -1
  2. package/dist/mod.cjs +472 -16
  3. package/dist/mod.d.cts +119 -1
  4. package/dist/mod.d.ts +119 -1
  5. package/dist/mod.js +473 -17
  6. package/dist-tests/{actor-NhcklZK0.mjs → actor-BQd8S953.mjs} +2 -2
  7. package/dist-tests/actor.test.mjs +2 -2
  8. package/dist-tests/application.yaml +15 -0
  9. package/dist-tests/audio.yaml +2 -1
  10. package/dist-tests/document.yaml +14 -1
  11. package/dist-tests/endpoints.yaml +14 -0
  12. package/dist-tests/group.yaml +15 -0
  13. package/dist-tests/image.yaml +2 -1
  14. package/dist-tests/link.yaml +14 -1
  15. package/dist-tests/lookup.test.mjs +71 -4
  16. package/dist-tests/organization.yaml +15 -0
  17. package/dist-tests/page.yaml +2 -1
  18. package/dist-tests/person.yaml +15 -0
  19. package/dist-tests/service.yaml +15 -0
  20. package/dist-tests/type.test.mjs +1 -1
  21. package/dist-tests/video.yaml +2 -1
  22. package/dist-tests/{vocab-BQ8y6QS7.mjs → vocab-Bjwctrxn.mjs} +472 -16
  23. package/dist-tests/vocab.test.mjs +232 -2
  24. package/package.json +4 -4
  25. package/src/__snapshots__/vocab.test.ts.snap +60 -18
  26. package/src/application.yaml +15 -0
  27. package/src/audio.yaml +2 -1
  28. package/src/document.yaml +14 -1
  29. package/src/endpoints.yaml +14 -0
  30. package/src/group.yaml +15 -0
  31. package/src/image.yaml +2 -1
  32. package/src/link.yaml +14 -1
  33. package/src/lookup.test.ts +121 -0
  34. package/src/lookup.ts +3 -1
  35. package/src/organization.yaml +15 -0
  36. package/src/page.yaml +2 -1
  37. package/src/person.yaml +15 -0
  38. package/src/preprocessors.ts +3 -1
  39. package/src/service.yaml +15 -0
  40. package/src/video.yaml +2 -1
  41. package/src/vocab.test.ts +372 -0
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "temporal-polyfill";
2
2
  globalThis.addEventListener = () => {};
3
- import { A as Person, C as Link, D as Offer, E as Object$1, F as QuoteRequest, H as vocab_exports, I as Reject, M as Proposal, N as Question, O as OrderedCollectionPage, P as QuoteAuthorization, R as Source, S as InteractionRule, T as Note, _ as Follow, b as Intent, c as Create, d as Document, f as Endpoints, g as FeaturedItem, h as FeaturedCollection, i as Announce, j as Place, l as CryptographicKey, m as FeatureRequest, n as Activity, o as Collection, p as FeatureAuthorization, r as Agreement, s as Commitment, t as Accept, u as Delete, w as Measure, x as InteractionPolicy, y as Hashtag, z as Tombstone } from "./vocab-BQ8y6QS7.mjs";
3
+ import { A as OrderedCollectionPage, B as Source, C as InteractionRule, D as Note, E as Multikey, F as Question, I as QuoteAuthorization, L as QuoteRequest, M as Person, N as Place, O as Object$1, P as Proposal, R as Reject, S as InteractionPolicy, T as Measure, V as Tombstone, W as vocab_exports, _ as Follow, a as Application, b as Image, c as Create, d as Document, f as Endpoints, g as FeaturedItem, h as FeaturedCollection, i as Announce, j as Organization, k as Offer, l as CryptographicKey, m as FeatureRequest, n as Activity, o as Collection, p as FeatureAuthorization, r as Agreement, s as Commitment, t as Accept, u as Delete, v as Group, w as Link, x as Intent, y as Hashtag, z as Service } from "./vocab-Bjwctrxn.mjs";
4
4
  import { t as assertInstanceOf } from "./utils-CQjrpUkt.mjs";
5
5
  import { mockDocumentLoader, test } from "@fedify/fixture";
6
6
  import { deepStrictEqual, notDeepStrictEqual, ok, rejects, throws } from "node:assert/strict";
@@ -380,6 +380,154 @@ test("fromJsonLd() handles portable ActivityPub IRIs", async () => {
380
380
  deepStrictEqual(pageJson.next, "ap+ef61://did:key:z6Mkabc/actor/outbox?page=2");
381
381
  deepStrictEqual(pageJson.prev, "ap+ef61://did:key:z6Mkabc/actor/outbox?page=1");
382
382
  });
383
+ test("FEP-ef61: actor gateways round-trip as an ordered URI list", async () => {
384
+ const actorClasses = [
385
+ Application,
386
+ Group,
387
+ Organization,
388
+ Person,
389
+ Service
390
+ ];
391
+ const gateways = [new URL("https://server1.example/"), new URL("https://server2.example/")];
392
+ for (const ActorClass of actorClasses) {
393
+ const actor = await ActorClass.fromJsonLd({
394
+ "@context": ["https://www.w3.org/ns/activitystreams", "https://w3id.org/fep/ef61"],
395
+ type: ActorClass.name,
396
+ id: "ap+ef61://did:key:z6Mkabc/actor",
397
+ gateways: gateways.map((gateway) => gateway.href)
398
+ });
399
+ deepStrictEqual(actor.gateways, gateways);
400
+ const jsonLd = await actor.toJsonLd();
401
+ deepStrictEqual(jsonLd.type, ActorClass.name);
402
+ deepStrictEqual(jsonLd.gateways, gateways.map((gateway) => gateway.href));
403
+ deepStrictEqual((await ActorClass.fromJsonLd(jsonLd)).gateways, gateways);
404
+ }
405
+ });
406
+ test("FEP-ef61: actor gateways preserve single, empty, and invalid cases", async () => {
407
+ deepStrictEqual((await new Person({
408
+ id: new URL("ap+ef61://did%3Akey%3Az6Mkabc/actor"),
409
+ gateways: [new URL("https://server.example/")]
410
+ }).toJsonLd()).gateways, ["https://server.example/"]);
411
+ ok(!("gateways" in await new Person({
412
+ id: new URL("ap+ef61://did%3Akey%3Az6Mkabc/actor"),
413
+ gateways: []
414
+ }).toJsonLd()));
415
+ await rejects(() => Person.fromJsonLd({
416
+ "@context": ["https://www.w3.org/ns/activitystreams", "https://w3id.org/fep/ef61"],
417
+ type: "Person",
418
+ gateways: ["not a uri"]
419
+ }), TypeError);
420
+ });
421
+ test("FEP-ef61: actor gateways accept @id typed JSON-LD references", async () => {
422
+ deepStrictEqual((await Person.fromJsonLd({
423
+ "@context": ["https://www.w3.org/ns/activitystreams", { gateways: {
424
+ "@id": "https://w3id.org/fep/ef61/gateways",
425
+ "@type": "@id",
426
+ "@container": "@list"
427
+ } }],
428
+ type: "Person",
429
+ id: "ap+ef61://did:key:z6Mkabc/actor",
430
+ gateways: ["https://gateway.example/"]
431
+ })).gateways, [new URL("https://gateway.example/")]);
432
+ });
433
+ test("FEP-ef61: actor gateways must be HTTP(S) base URIs", async () => {
434
+ const validGateways = [new URL("https://server.example/"), new URL("http://server.example/")];
435
+ deepStrictEqual(new Person({
436
+ id: new URL("ap+ef61://did%3Akey%3Az6Mkabc/actor"),
437
+ gateways: validGateways
438
+ }).gateways, validGateways);
439
+ for (const gateway of [
440
+ "ftp://server.example/",
441
+ "https://user:pass@server.example/",
442
+ "https://user@server.example/",
443
+ "https://server.example/path",
444
+ "https://server.example/?x=1",
445
+ "https://server.example/#fragment"
446
+ ]) {
447
+ throws(() => new Person({
448
+ id: new URL("ap+ef61://did%3Akey%3Az6Mkabc/actor"),
449
+ gateways: [new URL(gateway)]
450
+ }), TypeError);
451
+ await rejects(() => Person.fromJsonLd({
452
+ "@context": ["https://www.w3.org/ns/activitystreams", "https://w3id.org/fep/ef61"],
453
+ type: "Person",
454
+ gateways: [gateway]
455
+ }), TypeError);
456
+ }
457
+ });
458
+ test("FEP-ef61: digestMultibase round-trips on links and media objects", async () => {
459
+ const digestMultibase = "zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n";
460
+ const link = await Link.fromJsonLd({
461
+ "@context": ["https://www.w3.org/ns/activitystreams", "https://w3id.org/fep/ef61"],
462
+ type: "Link",
463
+ href: "hl:zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n",
464
+ digestMultibase
465
+ });
466
+ deepStrictEqual(link.digestMultibase, digestMultibase);
467
+ deepStrictEqual((await link.toJsonLd()).digestMultibase, digestMultibase);
468
+ for (const cls of [Document, Image]) {
469
+ const media = await cls.fromJsonLd({
470
+ "@context": ["https://www.w3.org/ns/activitystreams", "https://w3id.org/fep/ef61"],
471
+ type: cls.name,
472
+ url: "hl:zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n",
473
+ mediaType: "image/png",
474
+ digestMultibase
475
+ });
476
+ deepStrictEqual(media.digestMultibase, digestMultibase);
477
+ const jsonLd = await media.toJsonLd();
478
+ deepStrictEqual(jsonLd.type, cls.name);
479
+ deepStrictEqual(jsonLd.digestMultibase, digestMultibase);
480
+ }
481
+ });
482
+ test("FEP-ef61: digestMultibase avoids Data Integrity context conflicts", async () => {
483
+ const digestMultibase = "zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n";
484
+ const image = new Image({
485
+ url: new URL("hl:zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n"),
486
+ mediaType: "image/png",
487
+ digestMultibase
488
+ });
489
+ const expanded = await image.toJsonLd({ format: "expand" });
490
+ deepStrictEqual(expanded[0]["https://www.w3.org/ns/credentials/v2#digestMultibase"], [{ "@value": digestMultibase }]);
491
+ ok(!("https://w3id.org/security#digestMultibase" in expanded[0]));
492
+ const compact = await image.toJsonLd();
493
+ deepStrictEqual(compact.digestMultibase, digestMultibase);
494
+ ok(!compact["@context"].includes("https://w3id.org/fep/ef61"));
495
+ ok(compact["@context"].some((context) => context != null && typeof context === "object" && context.digestMultibase === "https://www.w3.org/ns/credentials/v2#digestMultibase"));
496
+ });
497
+ test("FEP-ef61: digestMultibase parses after Data Integrity v1 contexts", async () => {
498
+ const digestMultibase = "zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n";
499
+ deepStrictEqual((await Image.fromJsonLd({
500
+ "@context": [
501
+ "https://www.w3.org/ns/activitystreams",
502
+ "https://w3id.org/security/data-integrity/v1",
503
+ "https://w3id.org/fep/ef61"
504
+ ],
505
+ type: "Image",
506
+ url: "hl:zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n",
507
+ mediaType: "image/png",
508
+ digestMultibase
509
+ })).digestMultibase, digestMultibase);
510
+ });
511
+ test("FEP-ef61: Link image normalization preserves digestMultibase", async () => {
512
+ const digestMultibase = "zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n";
513
+ const obj = await Object$1.fromJsonLd({
514
+ "@context": [
515
+ "https://www.w3.org/ns/activitystreams",
516
+ "https://w3id.org/security/data-integrity/v1",
517
+ "https://w3id.org/fep/ef61"
518
+ ],
519
+ type: "Note",
520
+ image: {
521
+ type: "Link",
522
+ href: "hl:zQmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n",
523
+ mediaType: "image/png",
524
+ digestMultibase
525
+ }
526
+ });
527
+ const images = [];
528
+ for await (const img of obj.getImages()) images.push(img);
529
+ deepStrictEqual(images[0]?.digestMultibase, digestMultibase);
530
+ });
383
531
  test("fromJsonLd() caches text that mentions portable ActivityPub IRIs", async () => {
384
532
  const noteJson = {
385
533
  "@context": ["https://www.w3.org/ns/activitystreams", { extra: "https://example.com/ns#extra" }],
@@ -1156,6 +1304,7 @@ test("Person.toJsonLd()", async () => {
1156
1304
  deepStrictEqual(await new Person({ aliases: [new URL("https://example.com/alias")] }).toJsonLd(), {
1157
1305
  "@context": [
1158
1306
  "https://www.w3.org/ns/activitystreams",
1307
+ "https://w3id.org/fep/ef61",
1159
1308
  "https://w3id.org/security/v1",
1160
1309
  "https://w3id.org/security/data-integrity/v1",
1161
1310
  "https://www.w3.org/ns/did/v1",
@@ -1311,6 +1460,25 @@ test("Endpoints.toJsonLd() omits type", async () => {
1311
1460
  contextLoader: mockDocumentLoader
1312
1461
  }), ep);
1313
1462
  });
1463
+ test("Endpoints.uploadMedia round-trips", async () => {
1464
+ const ep = new Endpoints({ uploadMedia: new URL("https://example.com/users/alice/media") });
1465
+ deepStrictEqual(ep.uploadMedia?.href, "https://example.com/users/alice/media");
1466
+ deepStrictEqual((await ep.toJsonLd())["uploadMedia"], "https://example.com/users/alice/media");
1467
+ for (const format of [
1468
+ void 0,
1469
+ "compact",
1470
+ "expand"
1471
+ ]) {
1472
+ const jsonLd = await ep.toJsonLd({
1473
+ format,
1474
+ contextLoader: mockDocumentLoader
1475
+ });
1476
+ deepStrictEqual((await Endpoints.fromJsonLd(jsonLd, {
1477
+ documentLoader: mockDocumentLoader,
1478
+ contextLoader: mockDocumentLoader
1479
+ })).uploadMedia?.href, "https://example.com/users/alice/media", `round-trip failed for format=${format ?? "heuristic"}`);
1480
+ }
1481
+ });
1314
1482
  test("Source.toJsonLd() omits type", async () => {
1315
1483
  const src = new Source({
1316
1484
  content: "Hello, world!",
@@ -1361,7 +1529,8 @@ test("Endpoints with all properties set omits type", async () => {
1361
1529
  oauthTokenEndpoint: new URL("https://example.com/oauth/token"),
1362
1530
  provideClientKey: new URL("https://example.com/provide-key"),
1363
1531
  signClientKey: new URL("https://example.com/sign-key"),
1364
- sharedInbox: new URL("https://example.com/inbox")
1532
+ sharedInbox: new URL("https://example.com/inbox"),
1533
+ uploadMedia: new URL("https://example.com/upload-media")
1365
1534
  });
1366
1535
  const compact = await ep.toJsonLd();
1367
1536
  ok(!("type" in compact), "compact output should not have 'type'");
@@ -1371,6 +1540,7 @@ test("Endpoints with all properties set omits type", async () => {
1371
1540
  deepStrictEqual(compact["provideClientKey"], "https://example.com/provide-key");
1372
1541
  deepStrictEqual(compact["signClientKey"], "https://example.com/sign-key");
1373
1542
  deepStrictEqual(compact["sharedInbox"], "https://example.com/inbox");
1543
+ deepStrictEqual(compact["uploadMedia"], "https://example.com/upload-media");
1374
1544
  for (const format of [
1375
1545
  void 0,
1376
1546
  "compact",
@@ -1636,6 +1806,7 @@ test("InteractionPolicy.canFeature", async () => {
1636
1806
  const expected = {
1637
1807
  "@context": [
1638
1808
  "https://www.w3.org/ns/activitystreams",
1809
+ "https://w3id.org/fep/ef61",
1639
1810
  "https://w3id.org/security/v1",
1640
1811
  "https://w3id.org/security/data-integrity/v1",
1641
1812
  "https://www.w3.org/ns/did/v1",
@@ -2555,6 +2726,23 @@ test("FEP-fe34: Same origin objects are trusted", async () => {
2555
2726
  deepStrictEqual(result?.id, new URL("https://example.com/note"));
2556
2727
  deepStrictEqual(result?.content, "This is a legitimate note");
2557
2728
  });
2729
+ test("FEP-fe34: Same-authority non-FE34 embedded objects are trusted", async () => {
2730
+ const result = await (await Create.fromJsonLd({
2731
+ "@context": "https://www.w3.org/ns/activitystreams",
2732
+ "@type": "Create",
2733
+ "@id": "at://did:plc:example/collection/item",
2734
+ "actor": "at://did:plc:example/actor/self",
2735
+ "object": {
2736
+ "@type": "Note",
2737
+ "@id": "at://did:plc:example/collection/reply",
2738
+ "content": "Embedded AT Protocol note"
2739
+ }
2740
+ })).getObject({ documentLoader: async (url) => {
2741
+ throw new Error(`Unexpected fetch: ${url}`);
2742
+ } });
2743
+ assertInstanceOf(result, Note);
2744
+ deepStrictEqual(result.content, "Embedded AT Protocol note");
2745
+ });
2558
2746
  test("FEP-fe34: Embedded cross-origin objects from JSON-LD are ignored by default", async () => {
2559
2747
  const createDocumentLoader = async (url) => {
2560
2748
  if (url === "https://example.com/create") return {
@@ -2656,6 +2844,47 @@ test("FEP-fe34: Portable DID authorities are cross-origin boundaries", async ()
2656
2844
  assertInstanceOf(result, Note);
2657
2845
  deepStrictEqual(result.content, "Fetched portable note");
2658
2846
  });
2847
+ test("FEP-fe34: DID verification methods share portable actor cryptographic origin", async () => {
2848
+ const person = await Person.fromJsonLd({
2849
+ "@id": "ap://did:key:z6MkOwner/actor",
2850
+ "@type": ["https://www.w3.org/ns/activitystreams#Person"],
2851
+ "https://w3id.org/security#assertionMethod": [{
2852
+ "@id": "did:key:z6MkOwner#z6MkOwner",
2853
+ "@type": ["https://w3id.org/security#Multikey"],
2854
+ "https://w3id.org/security#controller": [{ "@id": "did:key:z6MkOwner" }]
2855
+ }]
2856
+ });
2857
+ const documentLoader = async (url) => {
2858
+ throw new Error(`Unexpected fetch: ${url}`);
2859
+ };
2860
+ const methods = [];
2861
+ for await (const method of person.getAssertionMethods({ documentLoader })) methods.push(method);
2862
+ deepStrictEqual(methods.length, 1);
2863
+ assertInstanceOf(methods[0], Multikey);
2864
+ deepStrictEqual(methods[0].id, new URL("did:key:z6MkOwner#z6MkOwner"));
2865
+ });
2866
+ test("FEP-fe34: DID verification methods from another cryptographic origin are untrusted", async () => {
2867
+ const person = await Person.fromJsonLd({
2868
+ "@id": "ap://did:key:z6MkOwner/actor",
2869
+ "@type": ["https://www.w3.org/ns/activitystreams#Person"],
2870
+ "https://w3id.org/security#assertionMethod": [{
2871
+ "@id": "did:key:z6MkOther#z6MkOther",
2872
+ "@type": ["https://w3id.org/security#Multikey"],
2873
+ "https://w3id.org/security#controller": [{ "@id": "did:key:z6MkOther" }]
2874
+ }]
2875
+ });
2876
+ let fetches = 0;
2877
+ const methods = [];
2878
+ for await (const method of person.getAssertionMethods({
2879
+ suppressError: true,
2880
+ documentLoader: async (url) => {
2881
+ fetches++;
2882
+ throw new Error(`Unexpected fetch: ${url}`);
2883
+ }
2884
+ })) methods.push(method);
2885
+ deepStrictEqual(methods, []);
2886
+ deepStrictEqual(fetches, 1);
2887
+ });
2659
2888
  test("FEP-fe34: Array properties respect cross-origin policy", async () => {
2660
2889
  const crossOriginDocumentLoader = async (url) => {
2661
2890
  if (url === "https://different-origin.com/note1") return {
@@ -3155,6 +3384,7 @@ const sampleValues = {
3155
3384
  ]),
3156
3385
  "fedify:langTag": new Intl.Locale("en-Latn-US"),
3157
3386
  "fedify:url": new URL("https://fedify.dev/"),
3387
+ "fedify:gatewayUrl": new URL("https://gateway.example/"),
3158
3388
  "fedify:publicKey": rsaPublicKey.publicKey,
3159
3389
  "fedify:multibaseKey": ed25519PublicKey.publicKey,
3160
3390
  "fedify:proofPurpose": "assertionMethod",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/vocab",
3
- "version": "2.4.0-dev.1599+7b19967f",
3
+ "version": "2.4.0-dev.1634+3b4bfbb6",
4
4
  "homepage": "https://fedify.dev/",
5
5
  "repository": {
6
6
  "type": "git",
@@ -43,9 +43,9 @@
43
43
  "jsonld": "^9.0.0",
44
44
  "pkijs": "^3.3.3",
45
45
  "temporal-polyfill": "^1.0.1",
46
- "@fedify/vocab-tools": "2.4.0-dev.1599+7b19967f",
47
- "@fedify/vocab-runtime": "2.4.0-dev.1599+7b19967f",
48
- "@fedify/webfinger": "2.4.0-dev.1599+7b19967f"
46
+ "@fedify/vocab-tools": "2.4.0-dev.1634+3b4bfbb6",
47
+ "@fedify/webfinger": "2.4.0-dev.1634+3b4bfbb6",
48
+ "@fedify/vocab-runtime": "2.4.0-dev.1634+3b4bfbb6"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@types/node": "^22.17.0",
@@ -3352,6 +3352,7 @@ snapshot[`Deno.inspect(Application) [auto] 1`] = `
3352
3352
  preferredUsernames: [ "hello", <en> "hello" ],
3353
3353
  publicKey: CryptographicKey {},
3354
3354
  assertionMethod: Multikey {},
3355
+ gateway: URL "https://gateway.example/",
3355
3356
  manuallyApprovesFollowers: true,
3356
3357
  inbox: OrderedCollection {},
3357
3358
  outbox: OrderedCollection {},
@@ -3418,6 +3419,7 @@ snapshot[`Deno.inspect(Application) [auto] 2`] = `
3418
3419
  preferredUsernames: [ "hello", <en> "hello" ],
3419
3420
  publicKey: URL "https://example.com/",
3420
3421
  assertionMethod: URL "https://example.com/",
3422
+ gateway: URL "https://gateway.example/",
3421
3423
  manuallyApprovesFollowers: true,
3422
3424
  inbox: URL "https://example.com/",
3423
3425
  outbox: URL "https://example.com/",
@@ -3484,6 +3486,7 @@ snapshot[`Deno.inspect(Application) [auto] 3`] = `
3484
3486
  preferredUsernames: [ "hello", "hello" ],
3485
3487
  publicKeys: [ CryptographicKey {}, CryptographicKey {} ],
3486
3488
  assertionMethods: [ Multikey {}, Multikey {} ],
3489
+ gateways: [ URL "https://gateway.example/", URL "https://gateway.example/" ],
3487
3490
  manuallyApprovesFollowers: true,
3488
3491
  inbox: OrderedCollection {},
3489
3492
  outbox: OrderedCollection {},
@@ -3833,7 +3836,8 @@ snapshot[`Deno.inspect(Audio) [auto] 1`] = `
3833
3836
  replyAuthorization: ReplyAuthorization {},
3834
3837
  announceAuthorization: AnnounceAuthorization {},
3835
3838
  width: 123,
3836
- height: 123
3839
+ height: 123,
3840
+ digestMultibase: "hello"
3837
3841
  }'
3838
3842
  `;
3839
3843
 
@@ -3878,7 +3882,8 @@ snapshot[`Deno.inspect(Audio) [auto] 2`] = `
3878
3882
  replyAuthorization: URL "https://example.com/",
3879
3883
  announceAuthorization: URL "https://example.com/",
3880
3884
  width: 123,
3881
- height: 123
3885
+ height: 123,
3886
+ digestMultibase: "hello"
3882
3887
  }'
3883
3888
  `;
3884
3889
 
@@ -3923,7 +3928,8 @@ snapshot[`Deno.inspect(Audio) [auto] 3`] = `
3923
3928
  replyAuthorization: ReplyAuthorization {},
3924
3929
  announceAuthorization: AnnounceAuthorization {},
3925
3930
  width: 123,
3926
- height: 123
3931
+ height: 123,
3932
+ digestMultibase: "hello"
3927
3933
  }'
3928
3934
  `;
3929
3935
 
@@ -4901,7 +4907,8 @@ snapshot[`Deno.inspect(Document) [auto] 1`] = `
4901
4907
  replyAuthorization: ReplyAuthorization {},
4902
4908
  announceAuthorization: AnnounceAuthorization {},
4903
4909
  width: 123,
4904
- height: 123
4910
+ height: 123,
4911
+ digestMultibase: "hello"
4905
4912
  }'
4906
4913
  `;
4907
4914
 
@@ -4946,7 +4953,8 @@ snapshot[`Deno.inspect(Document) [auto] 2`] = `
4946
4953
  replyAuthorization: URL "https://example.com/",
4947
4954
  announceAuthorization: URL "https://example.com/",
4948
4955
  width: 123,
4949
- height: 123
4956
+ height: 123,
4957
+ digestMultibase: "hello"
4950
4958
  }'
4951
4959
  `;
4952
4960
 
@@ -4991,7 +4999,8 @@ snapshot[`Deno.inspect(Document) [auto] 3`] = `
4991
4999
  replyAuthorization: ReplyAuthorization {},
4992
5000
  announceAuthorization: AnnounceAuthorization {},
4993
5001
  width: 123,
4994
- height: 123
5002
+ height: 123,
5003
+ digestMultibase: "hello"
4995
5004
  }'
4996
5005
  `;
4997
5006
 
@@ -5003,7 +5012,8 @@ snapshot[`Deno.inspect(Endpoints) [auto] 1`] = `
5003
5012
  oauthTokenEndpoint: URL "https://example.com/",
5004
5013
  provideClientKey: URL "https://example.com/",
5005
5014
  signClientKey: URL "https://example.com/",
5006
- sharedInbox: URL "https://example.com/"
5015
+ sharedInbox: URL "https://example.com/",
5016
+ uploadMedia: URL "https://example.com/"
5007
5017
  }'
5008
5018
  `;
5009
5019
 
@@ -5015,7 +5025,8 @@ snapshot[`Deno.inspect(Endpoints) [auto] 2`] = `
5015
5025
  oauthTokenEndpoint: URL "https://example.com/",
5016
5026
  provideClientKey: URL "https://example.com/",
5017
5027
  signClientKey: URL "https://example.com/",
5018
- sharedInbox: URL "https://example.com/"
5028
+ sharedInbox: URL "https://example.com/",
5029
+ uploadMedia: URL "https://example.com/"
5019
5030
  }'
5020
5031
  `;
5021
5032
 
@@ -5027,7 +5038,8 @@ snapshot[`Deno.inspect(Endpoints) [auto] 3`] = `
5027
5038
  oauthTokenEndpoint: URL "https://example.com/",
5028
5039
  provideClientKey: URL "https://example.com/",
5029
5040
  signClientKey: URL "https://example.com/",
5030
- sharedInbox: URL "https://example.com/"
5041
+ sharedInbox: URL "https://example.com/",
5042
+ uploadMedia: URL "https://example.com/"
5031
5043
  }'
5032
5044
  `;
5033
5045
 
@@ -5497,6 +5509,7 @@ snapshot[`Deno.inspect(Group) [auto] 1`] = `
5497
5509
  preferredUsernames: [ "hello", <en> "hello" ],
5498
5510
  publicKey: CryptographicKey {},
5499
5511
  assertionMethod: Multikey {},
5512
+ gateway: URL "https://gateway.example/",
5500
5513
  manuallyApprovesFollowers: true,
5501
5514
  inbox: OrderedCollection {},
5502
5515
  outbox: OrderedCollection {},
@@ -5563,6 +5576,7 @@ snapshot[`Deno.inspect(Group) [auto] 2`] = `
5563
5576
  preferredUsernames: [ "hello", <en> "hello" ],
5564
5577
  publicKey: URL "https://example.com/",
5565
5578
  assertionMethod: URL "https://example.com/",
5579
+ gateway: URL "https://gateway.example/",
5566
5580
  manuallyApprovesFollowers: true,
5567
5581
  inbox: URL "https://example.com/",
5568
5582
  outbox: URL "https://example.com/",
@@ -5629,6 +5643,7 @@ snapshot[`Deno.inspect(Group) [auto] 3`] = `
5629
5643
  preferredUsernames: [ "hello", "hello" ],
5630
5644
  publicKeys: [ CryptographicKey {}, CryptographicKey {} ],
5631
5645
  assertionMethods: [ Multikey {}, Multikey {} ],
5646
+ gateways: [ URL "https://gateway.example/", URL "https://gateway.example/" ],
5632
5647
  manuallyApprovesFollowers: true,
5633
5648
  inbox: OrderedCollection {},
5634
5649
  outbox: OrderedCollection {},
@@ -5658,6 +5673,7 @@ snapshot[`Deno.inspect(Hashtag) [auto] 1`] = `
5658
5673
  href: URL "https://example.com/",
5659
5674
  rel: "hello",
5660
5675
  mediaType: "hello",
5676
+ digestMultibase: "hello",
5661
5677
  names: [ "hello", <en> "hello" ],
5662
5678
  language: Locale [Intl.Locale] {
5663
5679
  baseName: "en-Latn-US",
@@ -5683,6 +5699,7 @@ snapshot[`Deno.inspect(Hashtag) [auto] 2`] = `
5683
5699
  href: URL "https://example.com/",
5684
5700
  rel: "hello",
5685
5701
  mediaType: "hello",
5702
+ digestMultibase: "hello",
5686
5703
  names: [ "hello", <en> "hello" ],
5687
5704
  language: Locale [Intl.Locale] {
5688
5705
  baseName: "en-Latn-US",
@@ -5708,6 +5725,7 @@ snapshot[`Deno.inspect(Hashtag) [auto] 3`] = `
5708
5725
  href: URL "https://example.com/",
5709
5726
  rels: [ "hello", "hello" ],
5710
5727
  mediaType: "hello",
5728
+ digestMultibase: "hello",
5711
5729
  names: [ "hello", "hello" ],
5712
5730
  language: Locale [Intl.Locale] {
5713
5731
  baseName: "en-Latn-US",
@@ -5915,7 +5933,8 @@ snapshot[`Deno.inspect(Image) [auto] 1`] = `
5915
5933
  replyAuthorization: ReplyAuthorization {},
5916
5934
  announceAuthorization: AnnounceAuthorization {},
5917
5935
  width: 123,
5918
- height: 123
5936
+ height: 123,
5937
+ digestMultibase: "hello"
5919
5938
  }'
5920
5939
  `;
5921
5940
 
@@ -5960,7 +5979,8 @@ snapshot[`Deno.inspect(Image) [auto] 2`] = `
5960
5979
  replyAuthorization: URL "https://example.com/",
5961
5980
  announceAuthorization: URL "https://example.com/",
5962
5981
  width: 123,
5963
- height: 123
5982
+ height: 123,
5983
+ digestMultibase: "hello"
5964
5984
  }'
5965
5985
  `;
5966
5986
 
@@ -6005,7 +6025,8 @@ snapshot[`Deno.inspect(Image) [auto] 3`] = `
6005
6025
  replyAuthorization: ReplyAuthorization {},
6006
6026
  announceAuthorization: AnnounceAuthorization {},
6007
6027
  width: 123,
6008
- height: 123
6028
+ height: 123,
6029
+ digestMultibase: "hello"
6009
6030
  }'
6010
6031
  `;
6011
6032
 
@@ -6750,6 +6771,7 @@ snapshot[`Deno.inspect(Link) [auto] 1`] = `
6750
6771
  href: URL "https://example.com/",
6751
6772
  rel: "hello",
6752
6773
  mediaType: "hello",
6774
+ digestMultibase: "hello",
6753
6775
  names: [ "hello", <en> "hello" ],
6754
6776
  language: Locale [Intl.Locale] {
6755
6777
  baseName: "en-Latn-US",
@@ -6775,6 +6797,7 @@ snapshot[`Deno.inspect(Link) [auto] 2`] = `
6775
6797
  href: URL "https://example.com/",
6776
6798
  rel: "hello",
6777
6799
  mediaType: "hello",
6800
+ digestMultibase: "hello",
6778
6801
  names: [ "hello", <en> "hello" ],
6779
6802
  language: Locale [Intl.Locale] {
6780
6803
  baseName: "en-Latn-US",
@@ -6800,6 +6823,7 @@ snapshot[`Deno.inspect(Link) [auto] 3`] = `
6800
6823
  href: URL "https://example.com/",
6801
6824
  rels: [ "hello", "hello" ],
6802
6825
  mediaType: "hello",
6826
+ digestMultibase: "hello",
6803
6827
  names: [ "hello", "hello" ],
6804
6828
  language: Locale [Intl.Locale] {
6805
6829
  baseName: "en-Latn-US",
@@ -6972,6 +6996,7 @@ snapshot[`Deno.inspect(Mention) [auto] 1`] = `
6972
6996
  href: URL "https://example.com/",
6973
6997
  rel: "hello",
6974
6998
  mediaType: "hello",
6999
+ digestMultibase: "hello",
6975
7000
  names: [ "hello", <en> "hello" ],
6976
7001
  language: Locale [Intl.Locale] {
6977
7002
  baseName: "en-Latn-US",
@@ -6997,6 +7022,7 @@ snapshot[`Deno.inspect(Mention) [auto] 2`] = `
6997
7022
  href: URL "https://example.com/",
6998
7023
  rel: "hello",
6999
7024
  mediaType: "hello",
7025
+ digestMultibase: "hello",
7000
7026
  names: [ "hello", <en> "hello" ],
7001
7027
  language: Locale [Intl.Locale] {
7002
7028
  baseName: "en-Latn-US",
@@ -7022,6 +7048,7 @@ snapshot[`Deno.inspect(Mention) [auto] 3`] = `
7022
7048
  href: URL "https://example.com/",
7023
7049
  rels: [ "hello", "hello" ],
7024
7050
  mediaType: "hello",
7051
+ digestMultibase: "hello",
7025
7052
  names: [ "hello", "hello" ],
7026
7053
  language: Locale [Intl.Locale] {
7027
7054
  baseName: "en-Latn-US",
@@ -7993,6 +8020,7 @@ snapshot[`Deno.inspect(Organization) [auto] 1`] = `
7993
8020
  preferredUsernames: [ "hello", <en> "hello" ],
7994
8021
  publicKey: CryptographicKey {},
7995
8022
  assertionMethod: Multikey {},
8023
+ gateway: URL "https://gateway.example/",
7996
8024
  manuallyApprovesFollowers: true,
7997
8025
  inbox: OrderedCollection {},
7998
8026
  outbox: OrderedCollection {},
@@ -8059,6 +8087,7 @@ snapshot[`Deno.inspect(Organization) [auto] 2`] = `
8059
8087
  preferredUsernames: [ "hello", <en> "hello" ],
8060
8088
  publicKey: URL "https://example.com/",
8061
8089
  assertionMethod: URL "https://example.com/",
8090
+ gateway: URL "https://gateway.example/",
8062
8091
  manuallyApprovesFollowers: true,
8063
8092
  inbox: URL "https://example.com/",
8064
8093
  outbox: URL "https://example.com/",
@@ -8125,6 +8154,7 @@ snapshot[`Deno.inspect(Organization) [auto] 3`] = `
8125
8154
  preferredUsernames: [ "hello", "hello" ],
8126
8155
  publicKeys: [ CryptographicKey {}, CryptographicKey {} ],
8127
8156
  assertionMethods: [ Multikey {}, Multikey {} ],
8157
+ gateways: [ URL "https://gateway.example/", URL "https://gateway.example/" ],
8128
8158
  manuallyApprovesFollowers: true,
8129
8159
  inbox: OrderedCollection {},
8130
8160
  outbox: OrderedCollection {},
@@ -8189,7 +8219,8 @@ snapshot[`Deno.inspect(Page) [auto] 1`] = `
8189
8219
  replyAuthorization: ReplyAuthorization {},
8190
8220
  announceAuthorization: AnnounceAuthorization {},
8191
8221
  width: 123,
8192
- height: 123
8222
+ height: 123,
8223
+ digestMultibase: "hello"
8193
8224
  }'
8194
8225
  `;
8195
8226
 
@@ -8234,7 +8265,8 @@ snapshot[`Deno.inspect(Page) [auto] 2`] = `
8234
8265
  replyAuthorization: URL "https://example.com/",
8235
8266
  announceAuthorization: URL "https://example.com/",
8236
8267
  width: 123,
8237
- height: 123
8268
+ height: 123,
8269
+ digestMultibase: "hello"
8238
8270
  }'
8239
8271
  `;
8240
8272
 
@@ -8279,7 +8311,8 @@ snapshot[`Deno.inspect(Page) [auto] 3`] = `
8279
8311
  replyAuthorization: ReplyAuthorization {},
8280
8312
  announceAuthorization: AnnounceAuthorization {},
8281
8313
  width: 123,
8282
- height: 123
8314
+ height: 123,
8315
+ digestMultibase: "hello"
8283
8316
  }'
8284
8317
  `;
8285
8318
 
@@ -8326,6 +8359,7 @@ snapshot[`Deno.inspect(Person) [auto] 1`] = `
8326
8359
  preferredUsernames: [ "hello", <en> "hello" ],
8327
8360
  publicKey: CryptographicKey {},
8328
8361
  assertionMethod: Multikey {},
8362
+ gateway: URL "https://gateway.example/",
8329
8363
  manuallyApprovesFollowers: true,
8330
8364
  inbox: OrderedCollection {},
8331
8365
  outbox: OrderedCollection {},
@@ -8392,6 +8426,7 @@ snapshot[`Deno.inspect(Person) [auto] 2`] = `
8392
8426
  preferredUsernames: [ "hello", <en> "hello" ],
8393
8427
  publicKey: URL "https://example.com/",
8394
8428
  assertionMethod: URL "https://example.com/",
8429
+ gateway: URL "https://gateway.example/",
8395
8430
  manuallyApprovesFollowers: true,
8396
8431
  inbox: URL "https://example.com/",
8397
8432
  outbox: URL "https://example.com/",
@@ -8458,6 +8493,7 @@ snapshot[`Deno.inspect(Person) [auto] 3`] = `
8458
8493
  preferredUsernames: [ "hello", "hello" ],
8459
8494
  publicKeys: [ CryptographicKey {}, CryptographicKey {} ],
8460
8495
  assertionMethods: [ Multikey {}, Multikey {} ],
8496
+ gateways: [ URL "https://gateway.example/", URL "https://gateway.example/" ],
8461
8497
  manuallyApprovesFollowers: true,
8462
8498
  inbox: OrderedCollection {},
8463
8499
  outbox: OrderedCollection {},
@@ -9550,6 +9586,7 @@ snapshot[`Deno.inspect(Service) [auto] 1`] = `
9550
9586
  preferredUsernames: [ "hello", <en> "hello" ],
9551
9587
  publicKey: CryptographicKey {},
9552
9588
  assertionMethod: Multikey {},
9589
+ gateway: URL "https://gateway.example/",
9553
9590
  manuallyApprovesFollowers: true,
9554
9591
  inbox: OrderedCollection {},
9555
9592
  outbox: OrderedCollection {},
@@ -9616,6 +9653,7 @@ snapshot[`Deno.inspect(Service) [auto] 2`] = `
9616
9653
  preferredUsernames: [ "hello", <en> "hello" ],
9617
9654
  publicKey: URL "https://example.com/",
9618
9655
  assertionMethod: URL "https://example.com/",
9656
+ gateway: URL "https://gateway.example/",
9619
9657
  manuallyApprovesFollowers: true,
9620
9658
  inbox: URL "https://example.com/",
9621
9659
  outbox: URL "https://example.com/",
@@ -9682,6 +9720,7 @@ snapshot[`Deno.inspect(Service) [auto] 3`] = `
9682
9720
  preferredUsernames: [ "hello", "hello" ],
9683
9721
  publicKeys: [ CryptographicKey {}, CryptographicKey {} ],
9684
9722
  assertionMethods: [ Multikey {}, Multikey {} ],
9723
+ gateways: [ URL "https://gateway.example/", URL "https://gateway.example/" ],
9685
9724
  manuallyApprovesFollowers: true,
9686
9725
  inbox: OrderedCollection {},
9687
9726
  outbox: OrderedCollection {},
@@ -10640,7 +10679,8 @@ snapshot[`Deno.inspect(Video) [auto] 1`] = `
10640
10679
  replyAuthorization: ReplyAuthorization {},
10641
10680
  announceAuthorization: AnnounceAuthorization {},
10642
10681
  width: 123,
10643
- height: 123
10682
+ height: 123,
10683
+ digestMultibase: "hello"
10644
10684
  }'
10645
10685
  `;
10646
10686
 
@@ -10685,7 +10725,8 @@ snapshot[`Deno.inspect(Video) [auto] 2`] = `
10685
10725
  replyAuthorization: URL "https://example.com/",
10686
10726
  announceAuthorization: URL "https://example.com/",
10687
10727
  width: 123,
10688
- height: 123
10728
+ height: 123,
10729
+ digestMultibase: "hello"
10689
10730
  }'
10690
10731
  `;
10691
10732
 
@@ -10730,7 +10771,8 @@ snapshot[`Deno.inspect(Video) [auto] 3`] = `
10730
10771
  replyAuthorization: ReplyAuthorization {},
10731
10772
  announceAuthorization: AnnounceAuthorization {},
10732
10773
  width: 123,
10733
- height: 123
10774
+ height: 123,
10775
+ digestMultibase: "hello"
10734
10776
  }'
10735
10777
  `;
10736
10778