@fedify/fedify 1.9.0-pr.443.1682 → 1.9.0

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 (139) hide show
  1. package/README.md +3 -0
  2. package/dist/{actor-BfM4acO7.js → actor-BFB3So4a.js} +6169 -2946
  3. package/dist/{actor-DNoKtm0e.js → actor-BscXI9ov.js} +1 -1
  4. package/dist/{actor-sT_gcgkl.d.ts → actor-C1Euqngb.d.ts} +1 -1
  5. package/dist/{actor-C84MVjvg.cjs → actor-CrrVlr_l.cjs} +6169 -2946
  6. package/dist/{actor-D8GmZX63.d.cts → actor-Ydzhc8dj.d.cts} +1 -1
  7. package/dist/{authdocloader-BMUj-LDP.js → authdocloader-BAZpg_xi.js} +3 -3
  8. package/dist/{authdocloader-CSF0HpUd.js → authdocloader-C0GexsrH.js} +3 -3
  9. package/dist/{authdocloader-BZ3wxRbU.cjs → authdocloader-oIwkuaiO.cjs} +3 -3
  10. package/dist/{builder-DbzYJjYW.js → builder-CHQYD4vV.js} +14 -8
  11. package/dist/{client-BXo-ifnJ.js → client-Csz-Cfna.js} +1 -1
  12. package/dist/compat/mod.d.cts +7 -7
  13. package/dist/compat/mod.d.ts +7 -7
  14. package/dist/compat/transformers.test.js +16 -16
  15. package/dist/{context-Cp-kboln.d.ts → context-CXUibY4L.d.ts} +179 -116
  16. package/dist/{context-BkqGJwLI.d.cts → context-CwUAkopp.d.cts} +179 -116
  17. package/dist/{docloader-C8VNT_Xq.cjs → docloader-Bh_ukbSk.cjs} +2 -2
  18. package/dist/{docloader-vwID5KeD.js → docloader-DUaVPUP7.js} +2 -2
  19. package/dist/{esm-BrKG8Ydq.js → esm-CRJSDGg9.js} +1 -1
  20. package/dist/federation/builder.test.js +5 -5
  21. package/dist/federation/collection.test.js +3 -3
  22. package/dist/federation/handler.test.js +17 -17
  23. package/dist/federation/idempotency.test.d.ts +3 -0
  24. package/dist/federation/idempotency.test.js +202 -0
  25. package/dist/federation/inbox.test.js +4 -4
  26. package/dist/federation/keycache.test.js +4 -4
  27. package/dist/federation/kv.test.js +3 -3
  28. package/dist/federation/middleware.test.js +18 -18
  29. package/dist/federation/mod.cjs +10 -10
  30. package/dist/federation/mod.d.cts +7 -7
  31. package/dist/federation/mod.d.ts +7 -7
  32. package/dist/federation/mod.js +10 -10
  33. package/dist/federation/mq.test.js +3 -3
  34. package/dist/federation/retry.test.js +3 -3
  35. package/dist/federation/router.test.js +3 -3
  36. package/dist/federation/send.test.js +10 -10
  37. package/dist/fixtures/media.example.com/avatars/test-avatar.jpg.json +6 -0
  38. package/dist/{http-B9UPBFJz.d.cts → http-B1_DzfAU.d.cts} +1 -1
  39. package/dist/{http-D21OQwhJ.cjs → http-B8N8ZAUZ.cjs} +3 -3
  40. package/dist/{http-1S7OolRE.js → http-Br_sidK9.js} +3 -3
  41. package/dist/{http-PJ3EklL0.js → http-BybYoFJw.js} +2 -2
  42. package/dist/{http-BGqh2jzk.d.ts → http-wsGR6KkT.d.ts} +1 -1
  43. package/dist/{inbox-4wLOWRkP.js → inbox-DkogbJk7.js} +29 -7
  44. package/dist/{key-DTUnLJZM.js → key-B2K1baWY.js} +3 -3
  45. package/dist/{key-DbudJOUz.js → key-BL_pkpWg.js} +4 -4
  46. package/dist/{key-CH7qaiOX.js → key-C1K0KFXJ.js} +2 -2
  47. package/dist/{key-7YeppNTi.js → key-DU95vugc.js} +2 -2
  48. package/dist/key-DneI16bw.cjs +10 -0
  49. package/dist/{key-Bt6aeupK.cjs → key-PbwtKiy9.cjs} +2 -2
  50. package/dist/{keycache-OXZYOWra.js → keycache-9ty5PJKq.js} +1 -1
  51. package/dist/{keys-DMbcSHvH.js → keys-D_B7NUKq.js} +1 -1
  52. package/dist/{ld-BLx5h_2L.js → ld-C2wK2NCY.js} +2 -2
  53. package/dist/{lookup-tJvVI01W.js → lookup-BU2mZhd6.js} +1 -1
  54. package/dist/{lookup-BQHLqqvB.cjs → lookup-CQIpaRVB.cjs} +1 -1
  55. package/dist/{lookup-B8X3pPjF.js → lookup-GLSo3KJA.js} +21 -12
  56. package/dist/{middleware-DpNXnRa6.js → middleware-B2Zp4CQO.js} +78 -47
  57. package/dist/{middleware-CPgUeSYU.js → middleware-B96_0LKI.js} +43 -40
  58. package/dist/middleware-BZel7aTg.js +26 -0
  59. package/dist/{middleware-BN1ZyxrJ.cjs → middleware-CHdtkzPX.cjs} +78 -47
  60. package/dist/middleware-DxIA-f2s.cjs +17 -0
  61. package/dist/middleware-akUN3fZs.js +17 -0
  62. package/dist/{mod-DxjZ8kbs.d.cts → mod-BUbqxBev.d.cts} +19 -1
  63. package/dist/{mod-OfRtcQo1.d.ts → mod-BcObK1Lz.d.ts} +2 -2
  64. package/dist/{mod-CnEwcmyF.d.ts → mod-CDObsV1d.d.ts} +19 -1
  65. package/dist/{mod-TsyIDkKn.d.ts → mod-CIbqfZW0.d.ts} +1 -1
  66. package/dist/{mod-Cuem8g-I.d.ts → mod-DgcYoyZK.d.ts} +2 -2
  67. package/dist/{mod-bscaBAIo.d.cts → mod-Dt-G9ZOS.d.cts} +1 -1
  68. package/dist/{mod-BihGJmMM.d.cts → mod-fjqfsrty.d.cts} +2 -2
  69. package/dist/{mod-Ds5wiXHw.d.cts → mod-mXx9V0q5.d.cts} +2 -2
  70. package/dist/mod.cjs +10 -10
  71. package/dist/mod.d.cts +10 -10
  72. package/dist/mod.d.ts +10 -10
  73. package/dist/mod.js +10 -10
  74. package/dist/nodeinfo/client.test.js +5 -5
  75. package/dist/nodeinfo/handler.test.js +16 -16
  76. package/dist/nodeinfo/mod.cjs +2 -2
  77. package/dist/nodeinfo/mod.js +2 -2
  78. package/dist/nodeinfo/semver.test.js +3 -3
  79. package/dist/nodeinfo/types.test.js +3 -3
  80. package/dist/{owner-BYxDl2qi.d.cts → owner-6KSEp9eV.d.cts} +2 -2
  81. package/dist/{owner-DOUl7e-t.d.ts → owner-BbeUDvOu.d.ts} +2 -2
  82. package/dist/{owner-DeXz0uXj.js → owner-DdgOG5UM.js} +2 -2
  83. package/dist/{proof-1YMXAyHu.cjs → proof-C1YQwafO.cjs} +3 -3
  84. package/dist/{proof-DEbHE-Rp.js → proof-nDt6_5lP.js} +2 -2
  85. package/dist/{proof-C5AaUlDb.js → proof-s1G_SRlt.js} +3 -3
  86. package/dist/runtime/authdocloader.test.js +9 -9
  87. package/dist/runtime/docloader.test.js +4 -4
  88. package/dist/runtime/key.test.js +5 -5
  89. package/dist/runtime/langstr.test.js +3 -3
  90. package/dist/runtime/link.test.js +3 -3
  91. package/dist/runtime/mod.cjs +6 -6
  92. package/dist/runtime/mod.d.cts +3 -3
  93. package/dist/runtime/mod.d.ts +3 -3
  94. package/dist/runtime/mod.js +6 -6
  95. package/dist/runtime/multibase/multibase.test.js +3 -3
  96. package/dist/runtime/url.test.js +3 -3
  97. package/dist/{send-ZLr2Fq_j.js → send-YlMc7DGj.js} +2 -2
  98. package/dist/sig/http.test.js +8 -8
  99. package/dist/sig/key.test.js +6 -6
  100. package/dist/sig/ld.test.js +7 -7
  101. package/dist/sig/mod.cjs +6 -6
  102. package/dist/sig/mod.d.cts +5 -5
  103. package/dist/sig/mod.d.ts +5 -5
  104. package/dist/sig/mod.js +6 -6
  105. package/dist/sig/owner.test.js +7 -7
  106. package/dist/sig/proof.test.js +7 -7
  107. package/dist/testing/docloader.test.js +3 -3
  108. package/dist/testing/mod.d.ts +341 -379
  109. package/dist/testing/mod.js +3 -3
  110. package/dist/{testing-CyBcyXDK.js → testing-B1zhVQn5.js} +2 -2
  111. package/dist/{type-C9v8GMO6.js → type-CAbzJEbL.js} +6298 -3075
  112. package/dist/{types-B2Gwh9uw.cjs → types-BGWxE9S1.cjs} +1 -1
  113. package/dist/{types-KhFFD-xZ.js → types-BgqeGOUD.js} +1 -1
  114. package/dist/vocab/actor.test.js +5 -5
  115. package/dist/vocab/lookup.test.js +255 -5
  116. package/dist/vocab/mod.cjs +4 -4
  117. package/dist/vocab/mod.d.cts +3 -3
  118. package/dist/vocab/mod.d.ts +3 -3
  119. package/dist/vocab/mod.js +4 -4
  120. package/dist/vocab/type.test.js +3 -3
  121. package/dist/vocab/vocab.test.js +395 -24
  122. package/dist/{vocab-BW6SWH9P.d.ts → vocab-CDHNj5zp.d.ts} +158 -497
  123. package/dist/{vocab-qpRpljdS.d.cts → vocab-Cfs0937i.d.cts} +158 -497
  124. package/dist/{vocab-95nbu41B.cjs → vocab-DiA70N1V.cjs} +23 -14
  125. package/dist/{vocab-DUIA4PK3.js → vocab-qc770nrv.js} +23 -14
  126. package/dist/webfinger/handler.test.js +16 -16
  127. package/dist/webfinger/lookup.test.js +4 -4
  128. package/dist/webfinger/mod.cjs +2 -2
  129. package/dist/webfinger/mod.js +2 -2
  130. package/dist/x/cfworkers.test.js +3 -3
  131. package/dist/x/hono.d.cts +6 -6
  132. package/dist/x/hono.d.ts +6 -6
  133. package/dist/x/sveltekit.d.cts +6 -6
  134. package/dist/x/sveltekit.d.ts +6 -6
  135. package/package.json +3 -3
  136. package/dist/key-C-eEPc5P.cjs +0 -10
  137. package/dist/middleware-BKKzirBh.cjs +0 -17
  138. package/dist/middleware-D9dqPUdF.js +0 -17
  139. package/dist/middleware-ofHkiPKA.js +0 -26
@@ -3,7 +3,7 @@
3
3
  const { URLPattern } = require("urlpattern-polyfill");
4
4
 
5
5
  const require_chunk = require('./chunk-DqRYRqnO.cjs');
6
- const require_docloader = require('./docloader-C8VNT_Xq.cjs');
6
+ const require_docloader = require('./docloader-Bh_ukbSk.cjs');
7
7
  const __logtape_logtape = require_chunk.__toESM(require("@logtape/logtape"));
8
8
 
9
9
  //#region src/nodeinfo/semver.ts
@@ -2,7 +2,7 @@
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
 
5
- import { getUserAgent } from "./docloader-vwID5KeD.js";
5
+ import { getUserAgent } from "./docloader-DUaVPUP7.js";
6
6
  import { getLogger } from "@logtape/logtape";
7
7
 
8
8
  //#region src/nodeinfo/semver.ts
@@ -3,19 +3,19 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { Application, Group, Organization, Person, Service, __export } from "../type-C9v8GMO6.js";
6
+ import { Application, Group, Organization, Person, Service, __export } from "../type-CAbzJEbL.js";
7
7
  import { assertEquals } from "../assert_equals-DSbWqCm3.js";
8
8
  import { assert } from "../assert-MZs1qjMx.js";
9
9
  import "../assert_instance_of-DHz7EHNU.js";
10
- import "../lookup-B8X3pPjF.js";
11
- import { getActorClassByTypeName, getActorHandle, getActorTypeName, isActor, normalizeActorHandle } from "../actor-DNoKtm0e.js";
12
- import { test } from "../testing-CyBcyXDK.js";
10
+ import "../lookup-GLSo3KJA.js";
11
+ import { getActorClassByTypeName, getActorHandle, getActorTypeName, isActor, normalizeActorHandle } from "../actor-BscXI9ov.js";
12
+ import { test } from "../testing-B1zhVQn5.js";
13
13
  import { assertStrictEquals } from "../std__assert-X-_kMxKM.js";
14
14
  import { assertFalse, assertRejects } from "../assert_rejects-DiIiJbZn.js";
15
15
  import "../assert_is_error-BPGph1Jx.js";
16
16
  import "../assert_not_equals-f3m3epl3.js";
17
17
  import { assertThrows } from "../assert_throws-BOO88avQ.js";
18
- import { esm_default } from "../esm-BrKG8Ydq.js";
18
+ import { esm_default } from "../esm-CRJSDGg9.js";
19
19
 
20
20
  //#region ../../node_modules/.pnpm/fast-check@3.23.2/node_modules/fast-check/lib/esm/check/precondition/PreconditionFailure.js
21
21
  var PreconditionFailure = class PreconditionFailure extends Error {
@@ -3,18 +3,18 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { Collection, Note, Object as Object$1, Person } from "../type-C9v8GMO6.js";
6
+ import { Collection, Note, Object as Object$1, Person } from "../type-CAbzJEbL.js";
7
7
  import { assertEquals } from "../assert_equals-DSbWqCm3.js";
8
8
  import "../assert-MZs1qjMx.js";
9
9
  import { assertInstanceOf } from "../assert_instance_of-DHz7EHNU.js";
10
- import { lookupObject, traverseCollection } from "../lookup-B8X3pPjF.js";
11
- import { mockDocumentLoader, test } from "../testing-CyBcyXDK.js";
10
+ import { lookupObject, traverseCollection } from "../lookup-GLSo3KJA.js";
11
+ import { mockDocumentLoader, test } from "../testing-B1zhVQn5.js";
12
12
  import "../std__assert-X-_kMxKM.js";
13
- import "../assert_rejects-DiIiJbZn.js";
13
+ import { assertRejects } from "../assert_rejects-DiIiJbZn.js";
14
14
  import "../assert_is_error-BPGph1Jx.js";
15
15
  import "../assert_not_equals-f3m3epl3.js";
16
16
  import "../assert_throws-BOO88avQ.js";
17
- import { esm_default } from "../esm-BrKG8Ydq.js";
17
+ import { esm_default } from "../esm-CRJSDGg9.js";
18
18
 
19
19
  //#region src/vocab/lookup.test.ts
20
20
  test("lookupObject()", {
@@ -202,5 +202,255 @@ test("traverseCollection()", {
202
202
  new Note({ content: "This is a third simple note" })
203
203
  ]);
204
204
  });
205
+ test("FEP-fe34: lookupObject() cross-origin security", {
206
+ sanitizeResources: false,
207
+ sanitizeOps: false
208
+ }, async (t) => {
209
+ await t.step("crossOrigin: ignore (default) - returns null for cross-origin objects", async () => {
210
+ const crossOriginDocumentLoader = async (url) => {
211
+ if (url === "https://example.com/note") return {
212
+ documentUrl: url,
213
+ contextUrl: null,
214
+ document: {
215
+ "@context": "https://www.w3.org/ns/activitystreams",
216
+ type: "Note",
217
+ id: "https://malicious.com/fake-note",
218
+ content: "This is a spoofed note from a different origin"
219
+ }
220
+ };
221
+ throw new Error(`Unexpected URL: ${url}`);
222
+ };
223
+ const result = await lookupObject("https://example.com/note", {
224
+ documentLoader: crossOriginDocumentLoader,
225
+ contextLoader: mockDocumentLoader
226
+ });
227
+ assertEquals(result, null);
228
+ });
229
+ await t.step("crossOrigin: throw - throws error for cross-origin objects", async () => {
230
+ const crossOriginDocumentLoader = async (url) => {
231
+ if (url === "https://example.com/note") return {
232
+ documentUrl: url,
233
+ contextUrl: null,
234
+ document: {
235
+ "@context": "https://www.w3.org/ns/activitystreams",
236
+ type: "Note",
237
+ id: "https://malicious.com/fake-note",
238
+ content: "This is a spoofed note from a different origin"
239
+ }
240
+ };
241
+ throw new Error(`Unexpected URL: ${url}`);
242
+ };
243
+ await assertRejects(() => lookupObject("https://example.com/note", {
244
+ documentLoader: crossOriginDocumentLoader,
245
+ contextLoader: mockDocumentLoader,
246
+ crossOrigin: "throw"
247
+ }), Error, "The object's @id (https://malicious.com/fake-note) has a different origin than the document URL (https://example.com/note)");
248
+ });
249
+ await t.step("crossOrigin: trust - allows cross-origin objects", async () => {
250
+ const crossOriginDocumentLoader = async (url) => {
251
+ if (url === "https://example.com/note") return {
252
+ documentUrl: url,
253
+ contextUrl: null,
254
+ document: {
255
+ "@context": "https://www.w3.org/ns/activitystreams",
256
+ type: "Note",
257
+ id: "https://malicious.com/fake-note",
258
+ content: "This is a spoofed note from a different origin"
259
+ }
260
+ };
261
+ throw new Error(`Unexpected URL: ${url}`);
262
+ };
263
+ const result = await lookupObject("https://example.com/note", {
264
+ documentLoader: crossOriginDocumentLoader,
265
+ contextLoader: mockDocumentLoader,
266
+ crossOrigin: "trust"
267
+ });
268
+ assertInstanceOf(result, Note);
269
+ assertEquals(result.id, new URL("https://malicious.com/fake-note"));
270
+ assertEquals(result.content, "This is a spoofed note from a different origin");
271
+ });
272
+ await t.step("same-origin objects are always trusted", async () => {
273
+ const sameOriginDocumentLoader = async (url) => {
274
+ if (url === "https://example.com/note") return {
275
+ documentUrl: url,
276
+ contextUrl: null,
277
+ document: {
278
+ "@context": "https://www.w3.org/ns/activitystreams",
279
+ type: "Note",
280
+ id: "https://example.com/note",
281
+ content: "This is a legitimate note from the same origin"
282
+ }
283
+ };
284
+ throw new Error(`Unexpected URL: ${url}`);
285
+ };
286
+ const result = await lookupObject("https://example.com/note", {
287
+ documentLoader: sameOriginDocumentLoader,
288
+ contextLoader: mockDocumentLoader
289
+ });
290
+ assertInstanceOf(result, Note);
291
+ assertEquals(result.id, new URL("https://example.com/note"));
292
+ assertEquals(result.content, "This is a legitimate note from the same origin");
293
+ });
294
+ await t.step("objects without @id are trusted", async () => {
295
+ const noIdDocumentLoader = async (url) => {
296
+ if (url === "https://example.com/note") return {
297
+ documentUrl: url,
298
+ contextUrl: null,
299
+ document: {
300
+ "@context": "https://www.w3.org/ns/activitystreams",
301
+ type: "Note",
302
+ content: "This is a note without an ID"
303
+ }
304
+ };
305
+ throw new Error(`Unexpected URL: ${url}`);
306
+ };
307
+ const result = await lookupObject("https://example.com/note", {
308
+ documentLoader: noIdDocumentLoader,
309
+ contextLoader: mockDocumentLoader
310
+ });
311
+ assertInstanceOf(result, Note);
312
+ assertEquals(result.id, null);
313
+ assertEquals(result.content, "This is a note without an ID");
314
+ });
315
+ await t.step("WebFinger lookup with cross-origin actor URL", async () => {
316
+ esm_default.spyGlobal();
317
+ esm_default.get("begin:https://example.com/.well-known/webfinger", {
318
+ subject: "acct:user@example.com",
319
+ links: [{
320
+ rel: "self",
321
+ href: "https://different-origin.com/actor",
322
+ type: "application/activity+json"
323
+ }]
324
+ });
325
+ const webfingerDocumentLoader = async (url) => {
326
+ if (url === "https://different-origin.com/actor") return {
327
+ documentUrl: url,
328
+ contextUrl: null,
329
+ document: {
330
+ "@context": "https://www.w3.org/ns/activitystreams",
331
+ type: "Person",
332
+ id: "https://malicious.com/fake-actor",
333
+ name: "Fake Actor"
334
+ }
335
+ };
336
+ throw new Error(`Unexpected URL: ${url}`);
337
+ };
338
+ const result1 = await lookupObject("@user@example.com", {
339
+ documentLoader: webfingerDocumentLoader,
340
+ contextLoader: mockDocumentLoader
341
+ });
342
+ assertEquals(result1, null);
343
+ await assertRejects(() => lookupObject("@user@example.com", {
344
+ documentLoader: webfingerDocumentLoader,
345
+ contextLoader: mockDocumentLoader,
346
+ crossOrigin: "throw"
347
+ }), Error, "The object's @id (https://malicious.com/fake-actor) has a different origin than the document URL (https://different-origin.com/actor)");
348
+ const result2 = await lookupObject("@user@example.com", {
349
+ documentLoader: webfingerDocumentLoader,
350
+ contextLoader: mockDocumentLoader,
351
+ crossOrigin: "trust"
352
+ });
353
+ assertInstanceOf(result2, Person);
354
+ assertEquals(result2.id, new URL("https://malicious.com/fake-actor"));
355
+ esm_default.removeRoutes();
356
+ esm_default.hardReset();
357
+ });
358
+ await t.step("subdomain same-origin check", async () => {
359
+ const subdomainDocumentLoader = async (url) => {
360
+ if (url === "https://api.example.com/note") return {
361
+ documentUrl: url,
362
+ contextUrl: null,
363
+ document: {
364
+ "@context": "https://www.w3.org/ns/activitystreams",
365
+ type: "Note",
366
+ id: "https://www.example.com/note",
367
+ content: "Cross-subdomain note"
368
+ }
369
+ };
370
+ throw new Error(`Unexpected URL: ${url}`);
371
+ };
372
+ const result = await lookupObject("https://api.example.com/note", {
373
+ documentLoader: subdomainDocumentLoader,
374
+ contextLoader: mockDocumentLoader
375
+ });
376
+ assertEquals(result, null);
377
+ });
378
+ await t.step("different port same-origin check", async () => {
379
+ const differentPortDocumentLoader = async (url) => {
380
+ if (url === "https://example.com:8080/note") return {
381
+ documentUrl: url,
382
+ contextUrl: null,
383
+ document: {
384
+ "@context": "https://www.w3.org/ns/activitystreams",
385
+ type: "Note",
386
+ id: "https://example.com:9090/note",
387
+ content: "Cross-port note"
388
+ }
389
+ };
390
+ throw new Error(`Unexpected URL: ${url}`);
391
+ };
392
+ const result = await lookupObject("https://example.com:8080/note", {
393
+ documentLoader: differentPortDocumentLoader,
394
+ contextLoader: mockDocumentLoader
395
+ });
396
+ assertEquals(result, null);
397
+ });
398
+ await t.step("protocol difference same-origin check", async () => {
399
+ const differentProtocolDocumentLoader = async (url) => {
400
+ if (url === "https://example.com/note") return {
401
+ documentUrl: url,
402
+ contextUrl: null,
403
+ document: {
404
+ "@context": "https://www.w3.org/ns/activitystreams",
405
+ type: "Note",
406
+ id: "http://example.com/note",
407
+ content: "Cross-protocol note"
408
+ }
409
+ };
410
+ throw new Error(`Unexpected URL: ${url}`);
411
+ };
412
+ const result = await lookupObject("https://example.com/note", {
413
+ documentLoader: differentProtocolDocumentLoader,
414
+ contextLoader: mockDocumentLoader
415
+ });
416
+ assertEquals(result, null);
417
+ });
418
+ await t.step("error handling with crossOrigin throw option", async () => {
419
+ const errorDocumentLoader = async (_url) => {
420
+ throw new Error("Network error");
421
+ };
422
+ const result = await lookupObject("https://example.com/note", {
423
+ documentLoader: errorDocumentLoader,
424
+ contextLoader: mockDocumentLoader,
425
+ crossOrigin: "throw"
426
+ });
427
+ assertEquals(result, null);
428
+ });
429
+ await t.step("malformed JSON handling with cross-origin policy", async () => {
430
+ const malformedJsonDocumentLoader = async (url) => {
431
+ if (url === "https://example.com/note") return {
432
+ documentUrl: url,
433
+ contextUrl: null,
434
+ document: "invalid json"
435
+ };
436
+ throw new Error(`Unexpected URL: ${url}`);
437
+ };
438
+ assertEquals(await lookupObject("https://example.com/note", {
439
+ documentLoader: malformedJsonDocumentLoader,
440
+ contextLoader: mockDocumentLoader,
441
+ crossOrigin: "ignore"
442
+ }), null);
443
+ assertEquals(await lookupObject("https://example.com/note", {
444
+ documentLoader: malformedJsonDocumentLoader,
445
+ contextLoader: mockDocumentLoader,
446
+ crossOrigin: "throw"
447
+ }), null);
448
+ assertEquals(await lookupObject("https://example.com/note", {
449
+ documentLoader: malformedJsonDocumentLoader,
450
+ contextLoader: mockDocumentLoader,
451
+ crossOrigin: "trust"
452
+ }), null);
453
+ });
454
+ });
205
455
 
206
456
  //#endregion
@@ -2,10 +2,10 @@
2
2
  const { Temporal } = require("@js-temporal/polyfill");
3
3
  const { URLPattern } = require("urlpattern-polyfill");
4
4
 
5
- require('../docloader-C8VNT_Xq.cjs');
6
- const require_actor = require('../actor-C84MVjvg.cjs');
7
- require('../lookup-BQHLqqvB.cjs');
8
- const require_vocab = require('../vocab-95nbu41B.cjs');
5
+ require('../docloader-Bh_ukbSk.cjs');
6
+ const require_actor = require('../actor-CrrVlr_l.cjs');
7
+ require('../lookup-CQIpaRVB.cjs');
8
+ const require_vocab = require('../vocab-DiA70N1V.cjs');
9
9
 
10
10
  exports.Accept = require_actor.Accept;
11
11
  exports.Activity = require_actor.Activity;
@@ -1,6 +1,6 @@
1
1
  import "../kv-63Cil1MD.cjs";
2
2
  import "../docloader-D-MrRyHl.cjs";
3
- import { Accept, Activity, Add, Announce, Application, Arrive, Article, Audio, Block, ChatMessage, Collection, CollectionPage, Create, CryptographicKey, DataIntegrityProof, Delete, DidService, Dislike, Document, Emoji, EmojiReact, Endpoints, Event, Export, Flag, Follow, Group, Hashtag, Ignore, Image, IntransitiveActivity, Invite, Join, Leave, Like, Link, Listen, Mention, Move, Multikey, Note, Object as Object$1, Offer, OrderedCollection, OrderedCollectionPage, Organization, Page, Person, Place, Profile, PropertyValue, Question, Read, Reject, Relationship, Remove, Service, Source, TentativeAccept, TentativeReject, Tombstone, Travel, Undo, Update, Video, View } from "../vocab-qpRpljdS.cjs";
4
- import { Actor, ActorTypeName, GetActorHandleOptions, NormalizeActorHandleOptions, Recipient, getActorClassByTypeName, getActorHandle, getActorTypeName, isActor, normalizeActorHandle } from "../actor-D8GmZX63.cjs";
5
- import { FediverseHandle, LookupObjectOptions, PUBLIC_COLLECTION, TraverseCollectionOptions, getTypeId, isFediverseHandle, lookupObject, parseFediverseHandle, toAcctUrl, traverseCollection } from "../mod-DxjZ8kbs.cjs";
3
+ import { Accept, Activity, Add, Announce, Application, Arrive, Article, Audio, Block, ChatMessage, Collection, CollectionPage, Create, CryptographicKey, DataIntegrityProof, Delete, DidService, Dislike, Document, Emoji, EmojiReact, Endpoints, Event, Export, Flag, Follow, Group, Hashtag, Ignore, Image, IntransitiveActivity, Invite, Join, Leave, Like, Link, Listen, Mention, Move, Multikey, Note, Object as Object$1, Offer, OrderedCollection, OrderedCollectionPage, Organization, Page, Person, Place, Profile, PropertyValue, Question, Read, Reject, Relationship, Remove, Service, Source, TentativeAccept, TentativeReject, Tombstone, Travel, Undo, Update, Video, View } from "../vocab-Cfs0937i.cjs";
4
+ import { Actor, ActorTypeName, GetActorHandleOptions, NormalizeActorHandleOptions, Recipient, getActorClassByTypeName, getActorHandle, getActorTypeName, isActor, normalizeActorHandle } from "../actor-Ydzhc8dj.cjs";
5
+ import { FediverseHandle, LookupObjectOptions, PUBLIC_COLLECTION, TraverseCollectionOptions, getTypeId, isFediverseHandle, lookupObject, parseFediverseHandle, toAcctUrl, traverseCollection } from "../mod-BUbqxBev.cjs";
6
6
  export { Accept, Activity, Actor, ActorTypeName, Add, Announce, Application, Arrive, Article, Audio, Block, ChatMessage, Collection, CollectionPage, Create, CryptographicKey, DataIntegrityProof, Delete, DidService, Dislike, Document, Emoji, EmojiReact, Endpoints, Event, Export, FediverseHandle, Flag, Follow, GetActorHandleOptions, Group, Hashtag, Ignore, Image, IntransitiveActivity, Invite, Join, Leave, Like, Link, Listen, LookupObjectOptions, Mention, Move, Multikey, NormalizeActorHandleOptions, Note, Object$1 as Object, Offer, OrderedCollection, OrderedCollectionPage, Organization, PUBLIC_COLLECTION, Page, Person, Place, Profile, PropertyValue, Question, Read, Recipient, Reject, Relationship, Remove, Service, Source, TentativeAccept, TentativeReject, Tombstone, Travel, TraverseCollectionOptions, Undo, Update, Video, View, getActorClassByTypeName, getActorHandle, getActorTypeName, getTypeId, isActor, isFediverseHandle, lookupObject, normalizeActorHandle, parseFediverseHandle, toAcctUrl, traverseCollection };
@@ -2,7 +2,7 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
3
  import "../kv-C7sopW2E.js";
4
4
  import "../docloader-CxWcuWqQ.js";
5
- import { Accept, Activity, Add, Announce, Application, Arrive, Article, Audio, Block, ChatMessage, Collection, CollectionPage, Create, CryptographicKey, DataIntegrityProof, Delete, DidService, Dislike, Document, Emoji, EmojiReact, Endpoints, Event, Export, Flag, Follow, Group, Hashtag, Ignore, Image, IntransitiveActivity, Invite, Join, Leave, Like, Link, Listen, Mention, Move, Multikey, Note, Object as Object$1, Offer, OrderedCollection, OrderedCollectionPage, Organization, Page, Person, Place, Profile, PropertyValue, Question, Read, Reject, Relationship, Remove, Service, Source, TentativeAccept, TentativeReject, Tombstone, Travel, Undo, Update, Video, View } from "../vocab-BW6SWH9P.js";
6
- import { Actor, ActorTypeName, GetActorHandleOptions, NormalizeActorHandleOptions, Recipient, getActorClassByTypeName, getActorHandle, getActorTypeName, isActor, normalizeActorHandle } from "../actor-sT_gcgkl.js";
7
- import { FediverseHandle, LookupObjectOptions, PUBLIC_COLLECTION, TraverseCollectionOptions, getTypeId, isFediverseHandle, lookupObject, parseFediverseHandle, toAcctUrl, traverseCollection } from "../mod-CnEwcmyF.js";
5
+ import { Accept, Activity, Add, Announce, Application, Arrive, Article, Audio, Block, ChatMessage, Collection, CollectionPage, Create, CryptographicKey, DataIntegrityProof, Delete, DidService, Dislike, Document, Emoji, EmojiReact, Endpoints, Event, Export, Flag, Follow, Group, Hashtag, Ignore, Image, IntransitiveActivity, Invite, Join, Leave, Like, Link, Listen, Mention, Move, Multikey, Note, Object as Object$1, Offer, OrderedCollection, OrderedCollectionPage, Organization, Page, Person, Place, Profile, PropertyValue, Question, Read, Reject, Relationship, Remove, Service, Source, TentativeAccept, TentativeReject, Tombstone, Travel, Undo, Update, Video, View } from "../vocab-CDHNj5zp.js";
6
+ import { Actor, ActorTypeName, GetActorHandleOptions, NormalizeActorHandleOptions, Recipient, getActorClassByTypeName, getActorHandle, getActorTypeName, isActor, normalizeActorHandle } from "../actor-C1Euqngb.js";
7
+ import { FediverseHandle, LookupObjectOptions, PUBLIC_COLLECTION, TraverseCollectionOptions, getTypeId, isFediverseHandle, lookupObject, parseFediverseHandle, toAcctUrl, traverseCollection } from "../mod-CDObsV1d.js";
8
8
  export { Accept, Activity, Actor, ActorTypeName, Add, Announce, Application, Arrive, Article, Audio, Block, ChatMessage, Collection, CollectionPage, Create, CryptographicKey, DataIntegrityProof, Delete, DidService, Dislike, Document, Emoji, EmojiReact, Endpoints, Event, Export, FediverseHandle, Flag, Follow, GetActorHandleOptions, Group, Hashtag, Ignore, Image, IntransitiveActivity, Invite, Join, Leave, Like, Link, Listen, LookupObjectOptions, Mention, Move, Multikey, NormalizeActorHandleOptions, Note, Object$1 as Object, Offer, OrderedCollection, OrderedCollectionPage, Organization, PUBLIC_COLLECTION, Page, Person, Place, Profile, PropertyValue, Question, Read, Recipient, Reject, Relationship, Remove, Service, Source, TentativeAccept, TentativeReject, Tombstone, Travel, TraverseCollectionOptions, Undo, Update, Video, View, getActorClassByTypeName, getActorHandle, getActorTypeName, getTypeId, isActor, isFediverseHandle, lookupObject, normalizeActorHandle, parseFediverseHandle, toAcctUrl, traverseCollection };
package/dist/vocab/mod.js CHANGED
@@ -2,9 +2,9 @@
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
 
5
- import "../docloader-vwID5KeD.js";
6
- import { Accept, Activity, Add, Announce, Application, Arrive, Article, Audio, Block, ChatMessage, Collection, CollectionPage, Create, CryptographicKey, DataIntegrityProof, Delete, DidService, Dislike, Document, Emoji, EmojiReact, Endpoints, Event, Export, Flag, Follow, Group, Hashtag, Ignore, Image, IntransitiveActivity, Invite, Join, Leave, Like, Link, Listen, Mention, Move, Multikey, Note, Object as Object$1, Offer, OrderedCollection, OrderedCollectionPage, Organization, Page, Person, Place, Profile, PropertyValue, Question, Read, Reject, Relationship, Remove, Service, Source, TentativeAccept, TentativeReject, Tombstone, Travel, Undo, Update, Video, View, getActorClassByTypeName, getActorHandle, getActorTypeName, getTypeId, isActor, normalizeActorHandle } from "../actor-BfM4acO7.js";
7
- import "../lookup-tJvVI01W.js";
8
- import { PUBLIC_COLLECTION, isFediverseHandle, lookupObject, parseFediverseHandle, toAcctUrl, traverseCollection } from "../vocab-DUIA4PK3.js";
5
+ import "../docloader-DUaVPUP7.js";
6
+ import { Accept, Activity, Add, Announce, Application, Arrive, Article, Audio, Block, ChatMessage, Collection, CollectionPage, Create, CryptographicKey, DataIntegrityProof, Delete, DidService, Dislike, Document, Emoji, EmojiReact, Endpoints, Event, Export, Flag, Follow, Group, Hashtag, Ignore, Image, IntransitiveActivity, Invite, Join, Leave, Like, Link, Listen, Mention, Move, Multikey, Note, Object as Object$1, Offer, OrderedCollection, OrderedCollectionPage, Organization, Page, Person, Place, Profile, PropertyValue, Question, Read, Reject, Relationship, Remove, Service, Source, TentativeAccept, TentativeReject, Tombstone, Travel, Undo, Update, Video, View, getActorClassByTypeName, getActorHandle, getActorTypeName, getTypeId, isActor, normalizeActorHandle } from "../actor-BFB3So4a.js";
7
+ import "../lookup-BU2mZhd6.js";
8
+ import { PUBLIC_COLLECTION, isFediverseHandle, lookupObject, parseFediverseHandle, toAcctUrl, traverseCollection } from "../vocab-qc770nrv.js";
9
9
 
10
10
  export { Accept, Activity, Add, Announce, Application, Arrive, Article, Audio, Block, ChatMessage, Collection, CollectionPage, Create, CryptographicKey, DataIntegrityProof, Delete, DidService, Dislike, Document, Emoji, EmojiReact, Endpoints, Event, Export, Flag, Follow, Group, Hashtag, Ignore, Image, IntransitiveActivity, Invite, Join, Leave, Like, Link, Listen, Mention, Move, Multikey, Note, Object$1 as Object, Offer, OrderedCollection, OrderedCollectionPage, Organization, PUBLIC_COLLECTION, Page, Person, Place, Profile, PropertyValue, Question, Read, Reject, Relationship, Remove, Service, Source, TentativeAccept, TentativeReject, Tombstone, Travel, Undo, Update, Video, View, getActorClassByTypeName, getActorHandle, getActorTypeName, getTypeId, isActor, isFediverseHandle, lookupObject, normalizeActorHandle, parseFediverseHandle, toAcctUrl, traverseCollection };
@@ -3,10 +3,10 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { Person, getTypeId } from "../type-C9v8GMO6.js";
6
+ import { Person, getTypeId } from "../type-CAbzJEbL.js";
7
7
  import { assertEquals } from "../assert_equals-DSbWqCm3.js";
8
- import "../lookup-B8X3pPjF.js";
9
- import { test } from "../testing-CyBcyXDK.js";
8
+ import "../lookup-GLSo3KJA.js";
9
+ import { test } from "../testing-B1zhVQn5.js";
10
10
 
11
11
  //#region src/vocab/type.test.ts
12
12
  test("getTypeId()", () => {