@fedify/fedify 2.0.0-pr.490.2 → 2.0.0-pr.559.4

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 (267) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +64 -37
  3. package/dist/{builder-4syLV1-z.js → builder-DTlQwmVF.js} +10 -3
  4. package/dist/{client-BsGzbnV-.d.ts → client-CUTUGgvJ.d.ts} +18 -18
  5. package/dist/{client-pY7-3icS.js → client-Dg7OfUDA.js} +28 -23
  6. package/dist/{client-94iWEfQa.d.cts → client-by-PEGAJ.d.cts} +18 -18
  7. package/dist/compat/mod.cjs +1 -1
  8. package/dist/compat/mod.d.cts +6 -10
  9. package/dist/compat/mod.d.ts +6 -10
  10. package/dist/compat/mod.js +1 -1
  11. package/dist/compat/transformers.test.js +22 -21
  12. package/dist/{context-PxGADCsD.d.cts → context-B6X-7loD.d.cts} +206 -74
  13. package/dist/{context-V-XS2_6O.d.ts → context-CJaICYPw.d.ts} +206 -74
  14. package/dist/context-CZ5llAss.js +109 -0
  15. package/dist/deno-DGx1JZHr.js +124 -0
  16. package/dist/{testing-BslrM_9E.js → dist-B5f6a8Tt.js} +90 -110
  17. package/dist/{docloader-DndkGj0O.js → docloader-D8UHsyqD.js} +3 -3
  18. package/dist/{esm-VlKMJQqV.js → esm-DGl7uK1r.js} +1 -1
  19. package/dist/federation/builder.test.js +7 -5
  20. package/dist/federation/collection.test.js +2 -3
  21. package/dist/federation/handler.test.js +24 -23
  22. package/dist/federation/idempotency.test.js +59 -22
  23. package/dist/federation/inbox.test.js +4 -3
  24. package/dist/federation/keycache.test.js +4 -4
  25. package/dist/federation/kv.test.js +56 -3
  26. package/dist/federation/middleware.test.js +307 -93
  27. package/dist/federation/mod.cjs +9 -10
  28. package/dist/federation/mod.d.cts +7 -11
  29. package/dist/federation/mod.d.ts +7 -11
  30. package/dist/federation/mod.js +8 -11
  31. package/dist/federation/mq.test.js +167 -16
  32. package/dist/federation/negotiation.test.js +2 -3
  33. package/dist/federation/retry.test.js +2 -3
  34. package/dist/federation/router.test.js +2 -2
  35. package/dist/federation/send.test.js +93 -11
  36. package/dist/{webfinger/handler.test.js → federation/webfinger.test.js} +24 -22
  37. package/dist/{federation-CRpdnOMS.cjs → federation-CE0CJ_0G.cjs} +116 -10
  38. package/dist/{federation-jcR8-ZxP.js → federation-D6FVaeAR.js} +122 -16
  39. package/dist/{http-YhR_TMMQ.js → http-CL3G0rnf.js} +126 -9
  40. package/dist/{http-M8k5mKc0.d.cts → http-ClB3pLcL.d.cts} +1 -1
  41. package/dist/{http-Dxpqz4hE.cjs → http-DKBUv5zZ.cjs} +139 -16
  42. package/dist/{http-BbO0ejuk.d.ts → http-DLBDPal9.d.ts} +1 -1
  43. package/dist/{http-DH47B-h3.js → http-LGtYlSfN.js} +3 -2
  44. package/dist/{inbox-CEyHvxOo.js → inbox-DbtWQY2D.js} +2 -1
  45. package/dist/{key-x7E5PYI0.js → key-BCtt1Ugy.js} +3 -3
  46. package/dist/{keycache-BRXuBDuy.js → keycache-DRxpZ5r9.js} +1 -1
  47. package/dist/{keys-DLk_8H-l.js → keys-ZbcByPg9.js} +1 -1
  48. package/dist/{kv-Bxr0Q87_.d.cts → kv-B4vFhIYL.d.cts} +30 -1
  49. package/dist/{kv-BKNZ-Tb-.d.ts → kv-CYySNrsn.d.ts} +30 -1
  50. package/dist/{kv-CRZrzyXm.js → kv-QzKcOQgP.js} +22 -0
  51. package/dist/{kv-cache-HFnFIjSD.js → kv-cache-0786BfqY.js} +3 -3
  52. package/dist/{kv-cache-DN9pfMBe.js → kv-cache-B__dHl7g.js} +15 -2
  53. package/dist/{kv-cache-BMpfJFTx.cjs → kv-cache-DCJojeTn.cjs} +3 -3
  54. package/dist/{ld-CRPaU6c8.js → ld-QlZPwGEH.js} +4 -3
  55. package/dist/middleware-B3jUPnDa.js +12 -0
  56. package/dist/middleware-BFiwWMA2.cjs +12 -0
  57. package/dist/middleware-DMx6DyIw.js +26 -0
  58. package/dist/{middleware-DfLpMu7C.js → middleware-Dm58nObp.js} +280 -166
  59. package/dist/{middleware-BIqFwRwI.js → middleware-WokE4qxc.js} +245 -178
  60. package/dist/{middleware-Ck7O6mb0.cjs → middleware-hWyKOO_6.cjs} +332 -206
  61. package/dist/{mod-DMpuiKXi.d.cts → mod-BHXq4Q3x.d.cts} +7 -7
  62. package/dist/{mod-DgxG-byT.d.cts → mod-BrS8tiad.d.cts} +2 -2
  63. package/dist/mod-CoMP50Rf.d.ts +64 -0
  64. package/dist/{mod-BoRKfJPE.d.cts → mod-DScazwCW.d.cts} +4 -4
  65. package/dist/mod-DTzN6Pv3.d.cts +62 -0
  66. package/dist/{mod-aAE2wOWV.d.ts → mod-DZmuPaKv.d.ts} +7 -7
  67. package/dist/{mod-D5Z2tISD.d.ts → mod-jOa7W503.d.ts} +2 -2
  68. package/dist/{mod-Cdo6SYlJ.d.ts → mod-xKJ57rwu.d.ts} +4 -4
  69. package/dist/mod.cjs +12 -93
  70. package/dist/mod.d.cts +11 -15
  71. package/dist/mod.d.ts +11 -15
  72. package/dist/mod.js +11 -15
  73. package/dist/nodeinfo/client.test.js +3 -4
  74. package/dist/nodeinfo/handler.test.js +22 -21
  75. package/dist/nodeinfo/mod.cjs +2 -2
  76. package/dist/nodeinfo/mod.d.cts +2 -2
  77. package/dist/nodeinfo/mod.d.ts +2 -2
  78. package/dist/nodeinfo/mod.js +2 -2
  79. package/dist/nodeinfo/types.test.js +2 -3
  80. package/dist/otel/exporter.test.js +893 -0
  81. package/dist/otel/mod.cjs +256 -0
  82. package/dist/otel/mod.d.cts +230 -0
  83. package/dist/otel/mod.d.ts +232 -0
  84. package/dist/otel/mod.js +255 -0
  85. package/dist/{owner-kQRGVXG1.d.ts → owner-BgI8C-VY.d.ts} +1 -2
  86. package/dist/{owner-B4HbyP8s.d.cts → owner-C-zfmVAD.d.cts} +1 -2
  87. package/dist/{owner-CIWnopkT.js → owner-Cejm-F7S.js} +2 -2
  88. package/dist/{proof-D-5ri6rf.js → proof-BOQBHd-i.js} +3 -2
  89. package/dist/{proof-fEwcA7LA.cjs → proof-Bmi8ZIcW.cjs} +24 -25
  90. package/dist/{proof-C8-2l0zH.js → proof-CnaEQ_Ev.js} +4 -5
  91. package/dist/router-D9eI0s4b.js +118 -0
  92. package/dist/{send-CPGk9QKZ.js → send-jFxXfsN8.js} +38 -4
  93. package/dist/sig/http.test.js +6 -7
  94. package/dist/sig/key.test.js +5 -5
  95. package/dist/sig/ld.test.js +6 -6
  96. package/dist/sig/mod.cjs +3 -5
  97. package/dist/sig/mod.d.cts +3 -5
  98. package/dist/sig/mod.d.ts +3 -5
  99. package/dist/sig/mod.js +3 -5
  100. package/dist/sig/owner.test.js +6 -7
  101. package/dist/sig/proof.test.js +6 -6
  102. package/dist/testing/mod.d.ts +173 -7006
  103. package/dist/testing/mod.js +4 -3
  104. package/dist/{transformers-CoBS-oFG.cjs → transformers-BjBg6Lag.cjs} +2 -2
  105. package/dist/{transformers-BFT6d7J5.js → transformers-N_ip_y4P.js} +2 -2
  106. package/dist/{types-BtUjyi5y.js → types-8l28uC8o.js} +30 -25
  107. package/dist/{types-CWgzGaqk.cjs → types-B6z6CqIz.cjs} +30 -25
  108. package/dist/{types-C2XVl6gj.js → types-CPz01LGH.js} +3 -3
  109. package/dist/utils/docloader.test.js +7 -8
  110. package/dist/utils/kv-cache.test.js +5 -3
  111. package/dist/utils/mod.cjs +3 -5
  112. package/dist/utils/mod.d.cts +3 -4
  113. package/dist/utils/mod.d.ts +3 -4
  114. package/dist/utils/mod.js +3 -5
  115. package/dist/vocab/mod.cjs +8 -81
  116. package/dist/vocab/mod.d.cts +1 -4
  117. package/dist/vocab/mod.d.ts +1 -4
  118. package/dist/vocab/mod.js +1 -5
  119. package/package.json +27 -27
  120. package/dist/actor-BT-e5fn9.js +0 -146
  121. package/dist/actor-B_gRMloq.js +0 -41647
  122. package/dist/actor-CBfPjuWj.cjs +0 -42079
  123. package/dist/actor-DqFajh9s.d.ts +0 -130
  124. package/dist/actor-f2NtjyCg.d.cts +0 -128
  125. package/dist/fixtures/activitypub.academy/users/brauca_darradiul.json +0 -83
  126. package/dist/fixtures/example.com/announce.json +0 -6
  127. package/dist/fixtures/example.com/collection.json +0 -19
  128. package/dist/fixtures/example.com/create.json +0 -6
  129. package/dist/fixtures/example.com/cross-origin-actor.json +0 -6
  130. package/dist/fixtures/example.com/hong-gildong.json +0 -11
  131. package/dist/fixtures/example.com/invite.json +0 -7
  132. package/dist/fixtures/example.com/key.json +0 -7
  133. package/dist/fixtures/example.com/key2.json +0 -6
  134. package/dist/fixtures/example.com/object.json +0 -6
  135. package/dist/fixtures/example.com/orderedcollectionpage.json +0 -24
  136. package/dist/fixtures/example.com/paged/a.json +0 -13
  137. package/dist/fixtures/example.com/paged/b.json +0 -16
  138. package/dist/fixtures/example.com/paged-collection.json +0 -6
  139. package/dist/fixtures/example.com/person.json +0 -22
  140. package/dist/fixtures/example.com/person2.json +0 -40
  141. package/dist/fixtures/example.com/test.json +0 -5
  142. package/dist/fixtures/example.com/users/handle.json +0 -16
  143. package/dist/fixtures/example.com/wrong-type.json +0 -3
  144. package/dist/fixtures/media.example.com/avatars/test-avatar.jpg.json +0 -6
  145. package/dist/fixtures/oeee.cafe/ap/users/3609fd4e-d51d-4db8-9f04-4189815864dd.json +0 -24
  146. package/dist/fixtures/remote.domain/users/bob.json +0 -20
  147. package/dist/fixtures/server.example/users/alice.json +0 -20
  148. package/dist/fixtures/w3id.org/identity/v1.json +0 -152
  149. package/dist/fixtures/w3id.org/security/data-integrity/v1.json +0 -74
  150. package/dist/fixtures/w3id.org/security/multikey/v1.json +0 -35
  151. package/dist/fixtures/w3id.org/security/v1.json +0 -50
  152. package/dist/fixtures/wizard.casa/users/hongminhee.json +0 -69
  153. package/dist/fixtures/www.w3.org/ns/activitystreams.json +0 -379
  154. package/dist/fixtures/www.w3.org/ns/did/v1.json +0 -58
  155. package/dist/lookup-BTqtVATt.cjs +0 -266
  156. package/dist/lookup-DOSnR912.js +0 -254
  157. package/dist/lookup-Dj9-mgOn.js +0 -42184
  158. package/dist/middleware-CxswDtQn.js +0 -15
  159. package/dist/middleware-CyITsnX0.js +0 -26
  160. package/dist/middleware-Z8lc_drL.cjs +0 -15
  161. package/dist/mod-BlVovdcy.d.ts +0 -309
  162. package/dist/mod-BxRCHTz-.d.cts +0 -307
  163. package/dist/mod-C58MZ7Wx.d.cts +0 -113
  164. package/dist/mod-CcDPcLJW.d.cts +0 -1
  165. package/dist/mod-Ds0mpFZU.d.ts +0 -115
  166. package/dist/mod-bjzj5QIb.d.ts +0 -2
  167. package/dist/otel-1BmGPuZc.js +0 -64
  168. package/dist/src/vocab/accept.yaml +0 -15
  169. package/dist/src/vocab/activity.yaml +0 -98
  170. package/dist/src/vocab/add.yaml +0 -16
  171. package/dist/src/vocab/announce.yaml +0 -30
  172. package/dist/src/vocab/application.yaml +0 -324
  173. package/dist/src/vocab/arrive.yaml +0 -15
  174. package/dist/src/vocab/article.yaml +0 -46
  175. package/dist/src/vocab/audio.yaml +0 -11
  176. package/dist/src/vocab/block.yaml +0 -16
  177. package/dist/src/vocab/chatmessage.yaml +0 -50
  178. package/dist/src/vocab/collection.yaml +0 -154
  179. package/dist/src/vocab/collectionpage.yaml +0 -55
  180. package/dist/src/vocab/create.yaml +0 -28
  181. package/dist/src/vocab/dataintegrityproof.yaml +0 -56
  182. package/dist/src/vocab/delete.yaml +0 -27
  183. package/dist/src/vocab/didservice.yaml +0 -22
  184. package/dist/src/vocab/dislike.yaml +0 -14
  185. package/dist/src/vocab/document.yaml +0 -31
  186. package/dist/src/vocab/emoji.yaml +0 -12
  187. package/dist/src/vocab/emojireact.yaml +0 -17
  188. package/dist/src/vocab/endpoints.yaml +0 -85
  189. package/dist/src/vocab/event.yaml +0 -11
  190. package/dist/src/vocab/export.yaml +0 -9
  191. package/dist/src/vocab/flag.yaml +0 -15
  192. package/dist/src/vocab/follow.yaml +0 -19
  193. package/dist/src/vocab/group.yaml +0 -324
  194. package/dist/src/vocab/hashtag.yaml +0 -14
  195. package/dist/src/vocab/ignore.yaml +0 -14
  196. package/dist/src/vocab/image.yaml +0 -9
  197. package/dist/src/vocab/intransitiveactivity.yaml +0 -15
  198. package/dist/src/vocab/invite.yaml +0 -14
  199. package/dist/src/vocab/join.yaml +0 -14
  200. package/dist/src/vocab/key.yaml +0 -28
  201. package/dist/src/vocab/leave.yaml +0 -14
  202. package/dist/src/vocab/like.yaml +0 -16
  203. package/dist/src/vocab/link.yaml +0 -101
  204. package/dist/src/vocab/listen.yaml +0 -12
  205. package/dist/src/vocab/mention.yaml +0 -9
  206. package/dist/src/vocab/move.yaml +0 -15
  207. package/dist/src/vocab/multikey.yaml +0 -36
  208. package/dist/src/vocab/note.yaml +0 -48
  209. package/dist/src/vocab/object.yaml +0 -404
  210. package/dist/src/vocab/offer.yaml +0 -15
  211. package/dist/src/vocab/orderedcollection.yaml +0 -39
  212. package/dist/src/vocab/orderedcollectionpage.yaml +0 -50
  213. package/dist/src/vocab/organization.yaml +0 -324
  214. package/dist/src/vocab/page.yaml +0 -11
  215. package/dist/src/vocab/person.yaml +0 -324
  216. package/dist/src/vocab/place.yaml +0 -75
  217. package/dist/src/vocab/profile.yaml +0 -26
  218. package/dist/src/vocab/propertyvalue.yaml +0 -32
  219. package/dist/src/vocab/question.yaml +0 -103
  220. package/dist/src/vocab/read.yaml +0 -13
  221. package/dist/src/vocab/reject.yaml +0 -14
  222. package/dist/src/vocab/relationship.yaml +0 -52
  223. package/dist/src/vocab/remove.yaml +0 -14
  224. package/dist/src/vocab/service.yaml +0 -324
  225. package/dist/src/vocab/source.yaml +0 -26
  226. package/dist/src/vocab/tentativeaccept.yaml +0 -14
  227. package/dist/src/vocab/tentativereject.yaml +0 -14
  228. package/dist/src/vocab/tombstone.yaml +0 -24
  229. package/dist/src/vocab/travel.yaml +0 -16
  230. package/dist/src/vocab/undo.yaml +0 -26
  231. package/dist/src/vocab/update.yaml +0 -58
  232. package/dist/src/vocab/video.yaml +0 -11
  233. package/dist/src/vocab/view.yaml +0 -13
  234. package/dist/testing/docloader.test.js +0 -22
  235. package/dist/vocab/actor.test.js +0 -5963
  236. package/dist/vocab/lookup.test.d.ts +0 -3
  237. package/dist/vocab/lookup.test.js +0 -476
  238. package/dist/vocab/type.test.d.ts +0 -3
  239. package/dist/vocab/type.test.js +0 -24
  240. package/dist/vocab/vocab.test.d.ts +0 -3
  241. package/dist/vocab/vocab.test.js +0 -9397
  242. package/dist/vocab-BCWe1Ih5.d.ts +0 -14905
  243. package/dist/vocab-ByUp-A2_.js +0 -260
  244. package/dist/vocab-CeDBzu-f.d.cts +0 -14903
  245. package/dist/vocab-X_X5T8D3.cjs +0 -296
  246. package/dist/webfinger/handler.test.d.ts +0 -3
  247. package/dist/webfinger/lookup.test.d.ts +0 -3
  248. package/dist/webfinger/lookup.test.js +0 -193
  249. package/dist/webfinger/mod.cjs +0 -8
  250. package/dist/webfinger/mod.d.cts +0 -2
  251. package/dist/webfinger/mod.d.ts +0 -4
  252. package/dist/webfinger/mod.js +0 -8
  253. package/dist/webfinger-C72Y8lrh.js +0 -4
  254. package/dist/webfinger-vAtLmxOF.cjs +0 -4
  255. /package/dist/{collection-BzWsN9pB.js → collection-CcnIw1qY.js} +0 -0
  256. /package/dist/{testing/docloader.test.d.ts → federation/webfinger.test.d.ts} +0 -0
  257. /package/dist/{mod-CVgZgliM.d.ts → mod-1E3W847c.d.ts} +0 -0
  258. /package/dist/{mod-B-hUPT2N.d.cts → mod-C81L6_lQ.d.cts} +0 -0
  259. /package/dist/{negotiation-C4nFufNk.js → negotiation-5NPJL6zp.js} +0 -0
  260. /package/dist/{nodeinfo-BnthBobC.js → nodeinfo-BlLsRSiT.js} +0 -0
  261. /package/dist/{nodeinfo-CdN0rEnZ.cjs → nodeinfo-DuMYTpbZ.cjs} +0 -0
  262. /package/dist/{vocab/actor.test.d.ts → otel/exporter.test.d.ts} +0 -0
  263. /package/dist/{retry-CfF8Gn4d.js → retry-D4GJ670a.js} +0 -0
  264. /package/dist/{sig-C34-oHBl.js → sig-CwuONEzF.js} +0 -0
  265. /package/dist/{sig-YYj5tCnr.cjs → sig-DeXX2xnj.cjs} +0 -0
  266. /package/dist/{utils-DyRU1gdZ.cjs → utils-Db0ZmjcD.cjs} +0 -0
  267. /package/dist/{utils-D-Va7aXC.js → utils-Wranxuoe.js} +0 -0
@@ -1,3 +0,0 @@
1
- import { Temporal } from "@js-temporal/polyfill";
2
- import { URLPattern } from "urlpattern-polyfill";
3
- globalThis.addEventListener = () => {};
@@ -1,476 +0,0 @@
1
-
2
- import { Temporal } from "@js-temporal/polyfill";
3
- import { URLPattern } from "urlpattern-polyfill";
4
- globalThis.addEventListener = () => {};
5
-
6
- import { Collection, Note, Object as Object$1, Person, lookupObject, traverseCollection } from "../lookup-Dj9-mgOn.js";
7
- import { assertEquals } from "../assert_equals-DSbWqCm3.js";
8
- import { assert } from "../assert-MZs1qjMx.js";
9
- import { assertInstanceOf } from "../assert_instance_of-DHz7EHNU.js";
10
- import { mockDocumentLoader, test } from "../testing-BslrM_9E.js";
11
- import "../std__assert-DWivtrGR.js";
12
- import { assertRejects } from "../assert_rejects-Ce45JcFg.js";
13
- import "../assert_throws-BNXdRGWP.js";
14
- import "../assert_not_equals-C80BG-_5.js";
15
- import { createTestTracerProvider } from "../otel-1BmGPuZc.js";
16
- import { esm_default } from "../esm-VlKMJQqV.js";
17
-
18
- //#region src/vocab/lookup.test.ts
19
- test("lookupObject()", {
20
- sanitizeResources: false,
21
- sanitizeOps: false
22
- }, async (t) => {
23
- esm_default.spyGlobal();
24
- esm_default.get("begin:https://example.com/.well-known/webfinger", {
25
- subject: "acct:johndoe@example.com",
26
- links: [
27
- {
28
- rel: "alternate",
29
- href: "https://example.com/object",
30
- type: "application/activity+json"
31
- },
32
- {
33
- rel: "self",
34
- href: "https://example.com/html/person",
35
- type: "text/html"
36
- },
37
- {
38
- rel: "self",
39
- href: "https://example.com/person",
40
- type: "application/activity+json"
41
- }
42
- ]
43
- });
44
- const options = {
45
- documentLoader: mockDocumentLoader,
46
- contextLoader: mockDocumentLoader
47
- };
48
- await t.step("actor", async () => {
49
- const person = await lookupObject("@johndoe@example.com", options);
50
- assertInstanceOf(person, Person);
51
- assertEquals(person.id, new URL("https://example.com/person"));
52
- assertEquals(person.name, "John Doe");
53
- const person2 = await lookupObject("johndoe@example.com", options);
54
- assertEquals(person2, person);
55
- const person3 = await lookupObject("acct:johndoe@example.com", options);
56
- assertEquals(person3, person);
57
- });
58
- await t.step("object", async () => {
59
- const object = await lookupObject("https://example.com/object", options);
60
- assertInstanceOf(object, Object$1);
61
- assertEquals(object, new Object$1({
62
- id: new URL("https://example.com/object"),
63
- name: "Fetched object"
64
- }));
65
- const person = await lookupObject("https://example.com/hong-gildong", options);
66
- assertInstanceOf(person, Person);
67
- assertEquals(person, new Person({
68
- id: new URL("https://example.com/hong-gildong"),
69
- name: "Hong Gildong"
70
- }));
71
- });
72
- esm_default.removeRoutes();
73
- esm_default.get("begin:https://example.com/.well-known/webfinger", {
74
- subject: "acct:janedoe@example.com",
75
- links: [{
76
- rel: "self",
77
- href: "https://example.com/404",
78
- type: "application/activity+json"
79
- }]
80
- });
81
- await t.step("not found", async () => {
82
- assertEquals(await lookupObject("janedoe@example.com", options), null);
83
- assertEquals(await lookupObject("https://example.com/404", options), null);
84
- });
85
- esm_default.removeRoutes();
86
- esm_default.get("begin:https://example.com/.well-known/webfinger", () => new Promise((resolve) => {
87
- setTimeout(() => {
88
- resolve({
89
- subject: "acct:johndoe@example.com",
90
- links: [{
91
- rel: "self",
92
- href: "https://example.com/person",
93
- type: "application/activity+json"
94
- }]
95
- });
96
- }, 1e3);
97
- }));
98
- await t.step("request cancellation", async () => {
99
- const controller = new AbortController();
100
- const promise = lookupObject("johndoe@example.com", {
101
- ...options,
102
- signal: controller.signal
103
- });
104
- controller.abort();
105
- assertEquals(await promise, null);
106
- });
107
- esm_default.removeRoutes();
108
- esm_default.get("begin:https://example.com/.well-known/webfinger", {
109
- subject: "acct:johndoe@example.com",
110
- links: [{
111
- rel: "self",
112
- href: "https://example.com/person",
113
- type: "application/activity+json"
114
- }]
115
- });
116
- await t.step("successful request with signal", async () => {
117
- const controller = new AbortController();
118
- const person = await lookupObject("johndoe@example.com", {
119
- ...options,
120
- signal: controller.signal
121
- });
122
- assertInstanceOf(person, Person);
123
- assertEquals(person.id, new URL("https://example.com/person"));
124
- });
125
- esm_default.removeRoutes();
126
- esm_default.get("begin:https://example.com/.well-known/webfinger", () => new Promise((resolve) => {
127
- setTimeout(() => {
128
- resolve({
129
- subject: "acct:johndoe@example.com",
130
- links: [{
131
- rel: "self",
132
- href: "https://example.com/person",
133
- type: "application/activity+json"
134
- }]
135
- });
136
- }, 500);
137
- }));
138
- await t.step("cancellation with immediate abort", async () => {
139
- const controller = new AbortController();
140
- controller.abort();
141
- const result = await lookupObject("johndoe@example.com", {
142
- ...options,
143
- signal: controller.signal
144
- });
145
- assertEquals(result, null);
146
- });
147
- esm_default.removeRoutes();
148
- esm_default.get("https://example.com/slow-object", () => new Promise((resolve) => {
149
- setTimeout(() => {
150
- resolve({
151
- status: 200,
152
- headers: { "Content-Type": "application/activity+json" },
153
- body: {
154
- "@context": "https://www.w3.org/ns/activitystreams",
155
- type: "Note",
156
- content: "Slow response"
157
- }
158
- });
159
- }, 1e3);
160
- }));
161
- await t.step("direct object fetch cancellation", async () => {
162
- const controller = new AbortController();
163
- const promise = lookupObject("https://example.com/slow-object", {
164
- contextLoader: mockDocumentLoader,
165
- signal: controller.signal
166
- });
167
- controller.abort();
168
- assertEquals(await promise, null);
169
- });
170
- esm_default.hardReset();
171
- esm_default.removeRoutes();
172
- });
173
- test("traverseCollection()", {
174
- sanitizeResources: false,
175
- sanitizeOps: false
176
- }, async () => {
177
- const options = {
178
- documentLoader: mockDocumentLoader,
179
- contextLoader: mockDocumentLoader
180
- };
181
- const collection = await lookupObject("https://example.com/collection", options);
182
- assertInstanceOf(collection, Collection);
183
- assertEquals(await Array.fromAsync(traverseCollection(collection, options)), [
184
- new Note({ content: "This is a simple note" }),
185
- new Note({ content: "This is another simple note" }),
186
- new Note({ content: "This is a third simple note" })
187
- ]);
188
- const pagedCollection = await lookupObject("https://example.com/paged-collection", options);
189
- assertInstanceOf(pagedCollection, Collection);
190
- assertEquals(await Array.fromAsync(traverseCollection(pagedCollection, options)), [
191
- new Note({ content: "This is a simple note" }),
192
- new Note({ content: "This is another simple note" }),
193
- new Note({ content: "This is a third simple note" })
194
- ]);
195
- assertEquals(await Array.fromAsync(traverseCollection(pagedCollection, {
196
- ...options,
197
- interval: { milliseconds: 250 }
198
- })), [
199
- new Note({ content: "This is a simple note" }),
200
- new Note({ content: "This is another simple note" }),
201
- new Note({ content: "This is a third simple note" })
202
- ]);
203
- });
204
- test("FEP-fe34: lookupObject() cross-origin security", {
205
- sanitizeResources: false,
206
- sanitizeOps: false
207
- }, async (t) => {
208
- await t.step("crossOrigin: ignore (default) - returns null for cross-origin objects", async () => {
209
- const crossOriginDocumentLoader = async (url) => {
210
- if (url === "https://example.com/note") return {
211
- documentUrl: url,
212
- contextUrl: null,
213
- document: {
214
- "@context": "https://www.w3.org/ns/activitystreams",
215
- type: "Note",
216
- id: "https://malicious.com/fake-note",
217
- content: "This is a spoofed note from a different origin"
218
- }
219
- };
220
- throw new Error(`Unexpected URL: ${url}`);
221
- };
222
- const result = await lookupObject("https://example.com/note", {
223
- documentLoader: crossOriginDocumentLoader,
224
- contextLoader: mockDocumentLoader
225
- });
226
- assertEquals(result, null);
227
- });
228
- await t.step("crossOrigin: throw - throws error for cross-origin objects", async () => {
229
- const crossOriginDocumentLoader = async (url) => {
230
- if (url === "https://example.com/note") return {
231
- documentUrl: url,
232
- contextUrl: null,
233
- document: {
234
- "@context": "https://www.w3.org/ns/activitystreams",
235
- type: "Note",
236
- id: "https://malicious.com/fake-note",
237
- content: "This is a spoofed note from a different origin"
238
- }
239
- };
240
- throw new Error(`Unexpected URL: ${url}`);
241
- };
242
- await assertRejects(() => lookupObject("https://example.com/note", {
243
- documentLoader: crossOriginDocumentLoader,
244
- contextLoader: mockDocumentLoader,
245
- crossOrigin: "throw"
246
- }), Error, "The object's @id (https://malicious.com/fake-note) has a different origin than the document URL (https://example.com/note)");
247
- });
248
- await t.step("crossOrigin: trust - allows cross-origin objects", async () => {
249
- const crossOriginDocumentLoader = async (url) => {
250
- if (url === "https://example.com/note") return {
251
- documentUrl: url,
252
- contextUrl: null,
253
- document: {
254
- "@context": "https://www.w3.org/ns/activitystreams",
255
- type: "Note",
256
- id: "https://malicious.com/fake-note",
257
- content: "This is a spoofed note from a different origin"
258
- }
259
- };
260
- throw new Error(`Unexpected URL: ${url}`);
261
- };
262
- const result = await lookupObject("https://example.com/note", {
263
- documentLoader: crossOriginDocumentLoader,
264
- contextLoader: mockDocumentLoader,
265
- crossOrigin: "trust"
266
- });
267
- assertInstanceOf(result, Note);
268
- assertEquals(result.id, new URL("https://malicious.com/fake-note"));
269
- assertEquals(result.content, "This is a spoofed note from a different origin");
270
- });
271
- await t.step("same-origin objects are always trusted", async () => {
272
- const sameOriginDocumentLoader = async (url) => {
273
- if (url === "https://example.com/note") return {
274
- documentUrl: url,
275
- contextUrl: null,
276
- document: {
277
- "@context": "https://www.w3.org/ns/activitystreams",
278
- type: "Note",
279
- id: "https://example.com/note",
280
- content: "This is a legitimate note from the same origin"
281
- }
282
- };
283
- throw new Error(`Unexpected URL: ${url}`);
284
- };
285
- const result = await lookupObject("https://example.com/note", {
286
- documentLoader: sameOriginDocumentLoader,
287
- contextLoader: mockDocumentLoader
288
- });
289
- assertInstanceOf(result, Note);
290
- assertEquals(result.id, new URL("https://example.com/note"));
291
- assertEquals(result.content, "This is a legitimate note from the same origin");
292
- });
293
- await t.step("objects without @id are trusted", async () => {
294
- const noIdDocumentLoader = async (url) => {
295
- if (url === "https://example.com/note") return {
296
- documentUrl: url,
297
- contextUrl: null,
298
- document: {
299
- "@context": "https://www.w3.org/ns/activitystreams",
300
- type: "Note",
301
- content: "This is a note without an ID"
302
- }
303
- };
304
- throw new Error(`Unexpected URL: ${url}`);
305
- };
306
- const result = await lookupObject("https://example.com/note", {
307
- documentLoader: noIdDocumentLoader,
308
- contextLoader: mockDocumentLoader
309
- });
310
- assertInstanceOf(result, Note);
311
- assertEquals(result.id, null);
312
- assertEquals(result.content, "This is a note without an ID");
313
- });
314
- await t.step("WebFinger lookup with cross-origin actor URL", async () => {
315
- esm_default.spyGlobal();
316
- esm_default.get("begin:https://example.com/.well-known/webfinger", {
317
- subject: "acct:user@example.com",
318
- links: [{
319
- rel: "self",
320
- href: "https://different-origin.com/actor",
321
- type: "application/activity+json"
322
- }]
323
- });
324
- const webfingerDocumentLoader = async (url) => {
325
- if (url === "https://different-origin.com/actor") return {
326
- documentUrl: url,
327
- contextUrl: null,
328
- document: {
329
- "@context": "https://www.w3.org/ns/activitystreams",
330
- type: "Person",
331
- id: "https://malicious.com/fake-actor",
332
- name: "Fake Actor"
333
- }
334
- };
335
- throw new Error(`Unexpected URL: ${url}`);
336
- };
337
- const result1 = await lookupObject("@user@example.com", {
338
- documentLoader: webfingerDocumentLoader,
339
- contextLoader: mockDocumentLoader
340
- });
341
- assertEquals(result1, null);
342
- await assertRejects(() => lookupObject("@user@example.com", {
343
- documentLoader: webfingerDocumentLoader,
344
- contextLoader: mockDocumentLoader,
345
- crossOrigin: "throw"
346
- }), Error, "The object's @id (https://malicious.com/fake-actor) has a different origin than the document URL (https://different-origin.com/actor)");
347
- const result2 = await lookupObject("@user@example.com", {
348
- documentLoader: webfingerDocumentLoader,
349
- contextLoader: mockDocumentLoader,
350
- crossOrigin: "trust"
351
- });
352
- assertInstanceOf(result2, Person);
353
- assertEquals(result2.id, new URL("https://malicious.com/fake-actor"));
354
- esm_default.removeRoutes();
355
- esm_default.hardReset();
356
- });
357
- await t.step("subdomain same-origin check", async () => {
358
- const subdomainDocumentLoader = async (url) => {
359
- if (url === "https://api.example.com/note") return {
360
- documentUrl: url,
361
- contextUrl: null,
362
- document: {
363
- "@context": "https://www.w3.org/ns/activitystreams",
364
- type: "Note",
365
- id: "https://www.example.com/note",
366
- content: "Cross-subdomain note"
367
- }
368
- };
369
- throw new Error(`Unexpected URL: ${url}`);
370
- };
371
- const result = await lookupObject("https://api.example.com/note", {
372
- documentLoader: subdomainDocumentLoader,
373
- contextLoader: mockDocumentLoader
374
- });
375
- assertEquals(result, null);
376
- });
377
- await t.step("different port same-origin check", async () => {
378
- const differentPortDocumentLoader = async (url) => {
379
- if (url === "https://example.com:8080/note") return {
380
- documentUrl: url,
381
- contextUrl: null,
382
- document: {
383
- "@context": "https://www.w3.org/ns/activitystreams",
384
- type: "Note",
385
- id: "https://example.com:9090/note",
386
- content: "Cross-port note"
387
- }
388
- };
389
- throw new Error(`Unexpected URL: ${url}`);
390
- };
391
- const result = await lookupObject("https://example.com:8080/note", {
392
- documentLoader: differentPortDocumentLoader,
393
- contextLoader: mockDocumentLoader
394
- });
395
- assertEquals(result, null);
396
- });
397
- await t.step("protocol difference same-origin check", async () => {
398
- const differentProtocolDocumentLoader = async (url) => {
399
- if (url === "https://example.com/note") return {
400
- documentUrl: url,
401
- contextUrl: null,
402
- document: {
403
- "@context": "https://www.w3.org/ns/activitystreams",
404
- type: "Note",
405
- id: "http://example.com/note",
406
- content: "Cross-protocol note"
407
- }
408
- };
409
- throw new Error(`Unexpected URL: ${url}`);
410
- };
411
- const result = await lookupObject("https://example.com/note", {
412
- documentLoader: differentProtocolDocumentLoader,
413
- contextLoader: mockDocumentLoader
414
- });
415
- assertEquals(result, null);
416
- });
417
- await t.step("error handling with crossOrigin throw option", async () => {
418
- const errorDocumentLoader = async (_url) => {
419
- throw new Error("Network error");
420
- };
421
- const result = await lookupObject("https://example.com/note", {
422
- documentLoader: errorDocumentLoader,
423
- contextLoader: mockDocumentLoader,
424
- crossOrigin: "throw"
425
- });
426
- assertEquals(result, null);
427
- });
428
- await t.step("malformed JSON handling with cross-origin policy", async () => {
429
- const malformedJsonDocumentLoader = async (url) => {
430
- if (url === "https://example.com/note") return {
431
- documentUrl: url,
432
- contextUrl: null,
433
- document: "invalid json"
434
- };
435
- throw new Error(`Unexpected URL: ${url}`);
436
- };
437
- assertEquals(await lookupObject("https://example.com/note", {
438
- documentLoader: malformedJsonDocumentLoader,
439
- contextLoader: mockDocumentLoader,
440
- crossOrigin: "ignore"
441
- }), null);
442
- assertEquals(await lookupObject("https://example.com/note", {
443
- documentLoader: malformedJsonDocumentLoader,
444
- contextLoader: mockDocumentLoader,
445
- crossOrigin: "throw"
446
- }), null);
447
- assertEquals(await lookupObject("https://example.com/note", {
448
- documentLoader: malformedJsonDocumentLoader,
449
- contextLoader: mockDocumentLoader,
450
- crossOrigin: "trust"
451
- }), null);
452
- });
453
- });
454
- test("lookupObject() records OpenTelemetry span events", async () => {
455
- const [tracerProvider, exporter] = createTestTracerProvider();
456
- const object = await lookupObject("https://example.com/object", {
457
- documentLoader: mockDocumentLoader,
458
- contextLoader: mockDocumentLoader,
459
- tracerProvider
460
- });
461
- assertInstanceOf(object, Object$1);
462
- const spans = exporter.getSpans("activitypub.lookup_object");
463
- assertEquals(spans.length, 1);
464
- const span = spans[0];
465
- assertEquals(span.attributes["activitypub.object.id"], "https://example.com/object");
466
- const events = exporter.getEvents("activitypub.lookup_object", "activitypub.object.fetched");
467
- assertEquals(events.length, 1);
468
- const event = events[0];
469
- assert(event.attributes != null);
470
- assert(typeof event.attributes["activitypub.object.type"] === "string");
471
- assert(typeof event.attributes["activitypub.object.json"] === "string");
472
- const recordedObject = JSON.parse(event.attributes["activitypub.object.json"]);
473
- assertEquals(recordedObject.id, "https://example.com/object");
474
- });
475
-
476
- //#endregion
@@ -1,3 +0,0 @@
1
- import { Temporal } from "@js-temporal/polyfill";
2
- import { URLPattern } from "urlpattern-polyfill";
3
- globalThis.addEventListener = () => {};
@@ -1,24 +0,0 @@
1
-
2
- import { Temporal } from "@js-temporal/polyfill";
3
- import { URLPattern } from "urlpattern-polyfill";
4
- globalThis.addEventListener = () => {};
5
-
6
- import { Person, getTypeId } from "../lookup-Dj9-mgOn.js";
7
- import { assertEquals } from "../assert_equals-DSbWqCm3.js";
8
- import { test } from "../testing-BslrM_9E.js";
9
-
10
- //#region src/vocab/type.test.ts
11
- test("getTypeId()", () => {
12
- const obj = new Person({});
13
- assertEquals(getTypeId(obj), new URL("https://www.w3.org/ns/activitystreams#Person"));
14
- const obj2 = null;
15
- assertEquals(getTypeId(obj2), null);
16
- const obj3 = void 0;
17
- assertEquals(getTypeId(obj3), void 0);
18
- const obj4 = null;
19
- assertEquals(getTypeId(obj4), null);
20
- const obj5 = void 0;
21
- assertEquals(getTypeId(obj5), void 0);
22
- });
23
-
24
- //#endregion
@@ -1,3 +0,0 @@
1
- import { Temporal } from "@js-temporal/polyfill";
2
- import { URLPattern } from "urlpattern-polyfill";
3
- globalThis.addEventListener = () => {};