@fedify/fedify 1.10.0-dev.2 → 2.0.0-dev.12

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 (271) hide show
  1. package/README.md +3 -0
  2. package/dist/{actor-eIATKOh7.js → actor-C-FuEZU4.js} +220 -705
  3. package/dist/{actor-C1Euqngb.d.ts → actor-DqFajh9s.d.ts} +2 -2
  4. package/dist/{actor-8zynMl2a.cjs → actor-_9UN5RVT.cjs} +952 -1479
  5. package/dist/{actor-Ydzhc8dj.d.cts → actor-f2NtjyCg.d.cts} +2 -2
  6. package/dist/{actor-Bv7llTFW.js → actor-rOm0sXHU.js} +1 -1
  7. package/dist/{assert_rejects-DiIiJbZn.js → assert_rejects-Ce45JcFg.js} +1 -1
  8. package/dist/{assert_is_error-BPGph1Jx.js → assert_throws-BNXdRGWP.js} +31 -1
  9. package/dist/{builder-C7fApQY_.js → builder-hArjoWjW.js} +3 -4
  10. package/dist/{client-DjT_tegg.d.cts → client-94iWEfQa.d.cts} +3 -75
  11. package/dist/{client-DF8anIB5.d.ts → client-BsGzbnV-.d.ts} +3 -75
  12. package/dist/{client-Bwnrdh_A.js → client-pY7-3icS.js} +3 -22
  13. package/dist/compat/mod.d.cts +10 -12
  14. package/dist/compat/mod.d.ts +10 -12
  15. package/dist/compat/transformers.test.js +20 -20
  16. package/dist/{context-CwUAkopp.d.cts → context-PxGADCsD.d.cts} +152 -27
  17. package/dist/{context-CXUibY4L.d.ts → context-V-XS2_6O.d.ts} +152 -27
  18. package/dist/{authdocloader-TNeksncq.js → docloader-CE1lRhEV.js} +17 -8
  19. package/dist/{esm-aj4vkb76.js → esm-BEFbR5eN.js} +32 -17
  20. package/dist/federation/builder.test.js +9 -12
  21. package/dist/federation/collection.test.js +7 -9
  22. package/dist/federation/handler.test.js +28 -149
  23. package/dist/federation/idempotency.test.js +26 -27
  24. package/dist/federation/inbox.test.js +4 -6
  25. package/dist/federation/keycache.test.js +3 -4
  26. package/dist/federation/kv.test.js +6 -8
  27. package/dist/federation/middleware.test.js +270 -93
  28. package/dist/federation/mod.cjs +9 -11
  29. package/dist/federation/mod.d.cts +10 -12
  30. package/dist/federation/mod.d.ts +10 -12
  31. package/dist/federation/mod.js +9 -11
  32. package/dist/federation/mq.test.js +10 -10
  33. package/dist/federation/negotiation.test.js +26 -0
  34. package/dist/federation/retry.test.js +4 -5
  35. package/dist/federation/router.test.js +6 -8
  36. package/dist/federation/send.test.js +14 -16
  37. package/dist/{http-wsGR6KkT.d.ts → http-BbO0ejuk.d.ts} +2 -2
  38. package/dist/{http-DXmKLE1t.js → http-Bmx7ea3F.js} +2 -2
  39. package/dist/{http-B1_DzfAU.d.cts → http-M8k5mKc0.d.cts} +2 -2
  40. package/dist/{http-DMJrVRf0.js → http-Q_l4fCEE.js} +256 -6
  41. package/dist/{http-CK80ff9S.cjs → http-So5V_Tgv.cjs} +289 -9
  42. package/dist/{inbox-Dt-Q2rJt.js → inbox-B9PjFn2S.js} +2 -7
  43. package/dist/{key-Tt9B2Qkj.js → key-khQpfFdw.js} +3 -2
  44. package/dist/{keycache-CXF4YAON.js → keycache-BU3fsZFa.js} +1 -1
  45. package/dist/{keys-CAUbEZtV.js → keys-BaMFfIdL.js} +2 -1
  46. package/dist/kv-cache-DN9pfMBe.js +94 -0
  47. package/dist/kv-cache-R1oW382l.js +122 -0
  48. package/dist/kv-cache-X2ggcnHI.cjs +134 -0
  49. package/dist/{ld-CqoYKNwB.js → ld-BLMebnep.js} +3 -2
  50. package/dist/{type-E_91dusN.js → lookup-C7SSHgK7.js} +542 -5394
  51. package/dist/{lookup-BXlOCJsH.cjs → lookup-CLaDFNx1.cjs} +134 -5
  52. package/dist/{lookup-8Ik9lSMm.js → lookup-CtC3x1M6.js} +125 -2
  53. package/dist/middleware-BYBwqvTv.cjs +15 -0
  54. package/dist/{middleware-DnXc8LK4.js → middleware-Bda2JO66.js} +38 -84
  55. package/dist/{middleware-nSw7nWf8.js → middleware-C3ml59Hp.js} +43 -146
  56. package/dist/middleware-DC7h2qq-.js +26 -0
  57. package/dist/{middleware-bN29Orv5.cjs → middleware-DFLterpx.cjs} +58 -104
  58. package/dist/middleware-mQR2SM7T.js +15 -0
  59. package/dist/{mod-CDObsV1d.d.ts → mod-BlVovdcy.d.ts} +2 -2
  60. package/dist/{mod-mXx9V0q5.d.cts → mod-BoRKfJPE.d.cts} +2 -2
  61. package/dist/{mod-BUbqxBev.d.cts → mod-BxRCHTz-.d.cts} +2 -2
  62. package/dist/{mod-jQ4OODsl.d.cts → mod-C58MZ7Wx.d.cts} +1 -1
  63. package/dist/{mod-BcObK1Lz.d.ts → mod-Cdo6SYlJ.d.ts} +2 -2
  64. package/dist/{mod-DgcYoyZK.d.ts → mod-D5Z2tISD.d.ts} +3 -3
  65. package/dist/mod-DMpuiKXi.d.cts +107 -0
  66. package/dist/{mod-fjqfsrty.d.cts → mod-DgxG-byT.d.cts} +3 -3
  67. package/dist/{mod-DBzN0aCM.d.ts → mod-Ds0mpFZU.d.ts} +1 -1
  68. package/dist/mod-aAE2wOWV.d.ts +109 -0
  69. package/dist/mod.cjs +19 -34
  70. package/dist/mod.d.cts +15 -17
  71. package/dist/mod.d.ts +15 -17
  72. package/dist/mod.js +14 -16
  73. package/dist/negotiation-C4nFufNk.js +71 -0
  74. package/dist/nodeinfo/client.test.js +30 -111
  75. package/dist/nodeinfo/handler.test.js +25 -26
  76. package/dist/nodeinfo/mod.cjs +3 -6
  77. package/dist/nodeinfo/mod.d.cts +3 -5
  78. package/dist/nodeinfo/mod.d.ts +3 -5
  79. package/dist/nodeinfo/mod.js +3 -4
  80. package/dist/nodeinfo/types.test.js +8 -15
  81. package/dist/{owner-6KSEp9eV.d.cts → owner-B4HbyP8s.d.cts} +3 -3
  82. package/dist/{owner-9jSx_21P.js → owner-XzzTSr4S.js} +3 -2
  83. package/dist/{owner-BbeUDvOu.d.ts → owner-kQRGVXG1.d.ts} +3 -3
  84. package/dist/{proof-BT3OPhWQ.js → proof-B-qOSAuQ.js} +5 -4
  85. package/dist/{proof-BuLnngRI.cjs → proof-BzJkFBBF.cjs} +18 -17
  86. package/dist/{proof-B5YI7sn5.js → proof-C9sfVit1.js} +2 -2
  87. package/dist/{send-DlPE7bKe.js → send-yEkZlxzW.js} +2 -2
  88. package/dist/sig/http.test.js +12 -13
  89. package/dist/sig/key.test.js +9 -11
  90. package/dist/sig/ld.test.js +8 -10
  91. package/dist/sig/mod.cjs +9 -11
  92. package/dist/sig/mod.d.cts +5 -7
  93. package/dist/sig/mod.d.ts +5 -7
  94. package/dist/sig/mod.js +5 -7
  95. package/dist/sig/owner.test.js +11 -13
  96. package/dist/sig/proof.test.js +13 -14
  97. package/dist/src/vocab/accept.yaml +1 -1
  98. package/dist/src/vocab/activity.yaml +1 -1
  99. package/dist/src/vocab/add.yaml +1 -1
  100. package/dist/src/vocab/announce.yaml +1 -1
  101. package/dist/src/vocab/application.yaml +1 -1
  102. package/dist/src/vocab/arrive.yaml +1 -1
  103. package/dist/src/vocab/article.yaml +1 -1
  104. package/dist/src/vocab/audio.yaml +1 -1
  105. package/dist/src/vocab/block.yaml +1 -1
  106. package/dist/src/vocab/chatmessage.yaml +1 -1
  107. package/dist/src/vocab/collection.yaml +1 -1
  108. package/dist/src/vocab/collectionpage.yaml +1 -1
  109. package/dist/src/vocab/create.yaml +1 -1
  110. package/dist/src/vocab/dataintegrityproof.yaml +1 -1
  111. package/dist/src/vocab/delete.yaml +1 -1
  112. package/dist/src/vocab/didservice.yaml +1 -1
  113. package/dist/src/vocab/dislike.yaml +1 -1
  114. package/dist/src/vocab/document.yaml +1 -1
  115. package/dist/src/vocab/emoji.yaml +1 -1
  116. package/dist/src/vocab/emojireact.yaml +1 -1
  117. package/dist/src/vocab/endpoints.yaml +1 -1
  118. package/dist/src/vocab/event.yaml +1 -1
  119. package/dist/src/vocab/export.yaml +1 -1
  120. package/dist/src/vocab/flag.yaml +1 -1
  121. package/dist/src/vocab/follow.yaml +1 -1
  122. package/dist/src/vocab/group.yaml +1 -1
  123. package/dist/src/vocab/hashtag.yaml +1 -1
  124. package/dist/src/vocab/ignore.yaml +1 -1
  125. package/dist/src/vocab/image.yaml +1 -1
  126. package/dist/src/vocab/intransitiveactivity.yaml +1 -1
  127. package/dist/src/vocab/invite.yaml +1 -1
  128. package/dist/src/vocab/join.yaml +1 -1
  129. package/dist/src/vocab/key.yaml +1 -1
  130. package/dist/src/vocab/leave.yaml +1 -1
  131. package/dist/src/vocab/like.yaml +1 -1
  132. package/dist/src/vocab/link.yaml +1 -1
  133. package/dist/src/vocab/listen.yaml +1 -1
  134. package/dist/src/vocab/mention.yaml +1 -1
  135. package/dist/src/vocab/move.yaml +1 -1
  136. package/dist/src/vocab/multikey.yaml +1 -1
  137. package/dist/src/vocab/note.yaml +1 -1
  138. package/dist/src/vocab/object.yaml +1 -1
  139. package/dist/src/vocab/offer.yaml +1 -1
  140. package/dist/src/vocab/orderedcollection.yaml +1 -1
  141. package/dist/src/vocab/orderedcollectionpage.yaml +1 -1
  142. package/dist/src/vocab/organization.yaml +1 -1
  143. package/dist/src/vocab/page.yaml +1 -1
  144. package/dist/src/vocab/person.yaml +1 -1
  145. package/dist/src/vocab/place.yaml +1 -1
  146. package/dist/src/vocab/profile.yaml +1 -1
  147. package/dist/src/vocab/propertyvalue.yaml +1 -1
  148. package/dist/src/vocab/question.yaml +1 -1
  149. package/dist/src/vocab/read.yaml +1 -1
  150. package/dist/src/vocab/reject.yaml +1 -1
  151. package/dist/src/vocab/relationship.yaml +1 -1
  152. package/dist/src/vocab/remove.yaml +1 -1
  153. package/dist/src/vocab/service.yaml +1 -1
  154. package/dist/src/vocab/source.yaml +1 -1
  155. package/dist/src/vocab/tentativeaccept.yaml +1 -1
  156. package/dist/src/vocab/tentativereject.yaml +1 -1
  157. package/dist/src/vocab/tombstone.yaml +1 -1
  158. package/dist/src/vocab/travel.yaml +1 -1
  159. package/dist/src/vocab/undo.yaml +1 -1
  160. package/dist/src/vocab/update.yaml +1 -1
  161. package/dist/src/vocab/video.yaml +1 -1
  162. package/dist/src/vocab/view.yaml +1 -1
  163. package/dist/testing/docloader.test.js +6 -8
  164. package/dist/testing/mod.d.ts +10 -119
  165. package/dist/testing/mod.js +2 -3
  166. package/dist/{testing-B17zODFD.js → testing-D-nLIHkh.js} +1 -2
  167. package/dist/{types-By5LByL1.js → types-BtUjyi5y.js} +5 -166
  168. package/dist/{types-BIgY6c-l.js → types-C2XVl6gj.js} +1 -3
  169. package/dist/{types-Ci8XKEfO.cjs → types-CWgzGaqk.cjs} +6 -179
  170. package/dist/{runtime/authdocloader.test.js → utils/docloader.test.js} +14 -15
  171. package/dist/utils/kv-cache.test.js +209 -0
  172. package/dist/utils/mod.cjs +12 -0
  173. package/dist/utils/mod.d.cts +5 -0
  174. package/dist/utils/mod.d.ts +7 -0
  175. package/dist/utils/mod.js +11 -0
  176. package/dist/vocab/actor.test.js +8 -10
  177. package/dist/vocab/lookup.test.js +8 -10
  178. package/dist/vocab/mod.cjs +3 -4
  179. package/dist/vocab/mod.d.cts +3 -5
  180. package/dist/vocab/mod.d.ts +3 -5
  181. package/dist/vocab/mod.js +3 -4
  182. package/dist/vocab/type.test.js +2 -3
  183. package/dist/vocab/vocab.test.js +7618 -1973
  184. package/dist/{vocab-CDHNj5zp.d.ts → vocab-BCWe1Ih5.d.ts} +9 -25
  185. package/dist/{vocab-BjnZ49Xt.cjs → vocab-C96aggZM.cjs} +5 -5
  186. package/dist/{vocab-Cfs0937i.d.cts → vocab-CeDBzu-f.d.cts} +9 -25
  187. package/dist/{vocab-CthegyUc.js → vocab-axlR_8k0.js} +3 -3
  188. package/dist/webfinger/handler.test.js +24 -25
  189. package/dist/webfinger/lookup.test.js +7 -9
  190. package/dist/webfinger/mod.cjs +2 -3
  191. package/dist/webfinger/mod.d.cts +1 -3
  192. package/dist/webfinger/mod.d.ts +1 -3
  193. package/dist/webfinger/mod.js +2 -3
  194. package/package.json +20 -51
  195. package/dist/assert_throws-BOO88avQ.js +0 -39
  196. package/dist/authdocloader-BEPeTSD8.cjs +0 -58
  197. package/dist/authdocloader-BNIyrORx.js +0 -52
  198. package/dist/denokv-D0nfNQ1x.js +0 -57
  199. package/dist/docloader-CLYexeNv.js +0 -4825
  200. package/dist/docloader-CdsuyjrU.cjs +0 -4891
  201. package/dist/docloader-CxWcuWqQ.d.ts +0 -221
  202. package/dist/docloader-D-MrRyHl.d.cts +0 -219
  203. package/dist/key-BL8DRhuI.js +0 -10
  204. package/dist/key-BU1Vsq8S.cjs +0 -290
  205. package/dist/key-DTzAk78O.js +0 -10
  206. package/dist/key-DWDJFZzD.js +0 -260
  207. package/dist/key-gZEWdYwT.cjs +0 -10
  208. package/dist/lookup-Co4Y1ycg.js +0 -336
  209. package/dist/middleware-09gZVY21.cjs +0 -17
  210. package/dist/middleware-B8Q9c1ys.js +0 -26
  211. package/dist/middleware-DHUCp8iq.js +0 -17
  212. package/dist/mod-CIbqfZW0.d.ts +0 -104
  213. package/dist/mod-Dt-G9ZOS.d.cts +0 -102
  214. package/dist/mq-B7R1Q-M5.d.cts +0 -140
  215. package/dist/mq-CRGm1e_F.d.ts +0 -143
  216. package/dist/nodeinfo/semver.test.js +0 -143
  217. package/dist/runtime/docloader.test.js +0 -588
  218. package/dist/runtime/key.test.d.ts +0 -3
  219. package/dist/runtime/key.test.js +0 -103
  220. package/dist/runtime/langstr.test.d.ts +0 -3
  221. package/dist/runtime/langstr.test.js +0 -40
  222. package/dist/runtime/link.test.d.ts +0 -3
  223. package/dist/runtime/link.test.js +0 -61
  224. package/dist/runtime/mod.cjs +0 -25
  225. package/dist/runtime/mod.d.cts +0 -6
  226. package/dist/runtime/mod.d.ts +0 -8
  227. package/dist/runtime/mod.js +0 -13
  228. package/dist/runtime/multibase/multibase.test.d.ts +0 -3
  229. package/dist/runtime/multibase/multibase.test.js +0 -358
  230. package/dist/runtime/url.test.d.ts +0 -3
  231. package/dist/runtime/url.test.js +0 -45
  232. package/dist/semver-dArNLkR9.js +0 -149
  233. package/dist/vocab/schema.yaml +0 -247
  234. package/dist/x/cfworkers.cjs +0 -100
  235. package/dist/x/cfworkers.d.cts +0 -59
  236. package/dist/x/cfworkers.d.ts +0 -61
  237. package/dist/x/cfworkers.js +0 -98
  238. package/dist/x/cfworkers.test.d.ts +0 -3
  239. package/dist/x/cfworkers.test.js +0 -179
  240. package/dist/x/hono.cjs +0 -61
  241. package/dist/x/hono.d.cts +0 -54
  242. package/dist/x/hono.d.ts +0 -56
  243. package/dist/x/hono.js +0 -60
  244. package/dist/x/sveltekit.cjs +0 -69
  245. package/dist/x/sveltekit.d.cts +0 -46
  246. package/dist/x/sveltekit.d.ts +0 -48
  247. package/dist/x/sveltekit.js +0 -68
  248. /package/dist/{assert_not_equals-f3m3epl3.js → assert_not_equals-C80BG-_5.js} +0 -0
  249. /package/dist/{collection-CSzG2j1P.js → collection-BzWsN9pB.js} +0 -0
  250. /package/dist/{nodeinfo/semver.test.d.ts → federation/negotiation.test.d.ts} +0 -0
  251. /package/dist/{federation-H2_En3j5.cjs → federation-CRpdnOMS.cjs} +0 -0
  252. /package/dist/{federation-D1U8YY9t.js → federation-jcR8-ZxP.js} +0 -0
  253. /package/dist/{kv-C7sopW2E.d.ts → kv-BKNZ-Tb-.d.ts} +0 -0
  254. /package/dist/{kv-63Cil1MD.d.cts → kv-Bxr0Q87_.d.cts} +0 -0
  255. /package/dist/{mod-C2tOeRkN.d.cts → mod-B-hUPT2N.d.cts} +0 -0
  256. /package/dist/{mod-1pDWKvUL.d.ts → mod-CVgZgliM.d.ts} +0 -0
  257. /package/dist/{mod-FZd39qVq.d.cts → mod-CcDPcLJW.d.cts} +0 -0
  258. /package/dist/{mod-g0xFzAP9.d.ts → mod-bjzj5QIb.d.ts} +0 -0
  259. /package/dist/{nodeinfo-DfycQ8Wf.js → nodeinfo-BnthBobC.js} +0 -0
  260. /package/dist/{nodeinfo-Co9lJrWl.cjs → nodeinfo-CdN0rEnZ.cjs} +0 -0
  261. /package/dist/{otel-Chy5T2Xh.js → otel-1BmGPuZc.js} +0 -0
  262. /package/dist/{retry-D4GJ670a.js → retry-CfF8Gn4d.js} +0 -0
  263. /package/dist/{runtime-DPYEDf-o.js → sig-C34-oHBl.js} +0 -0
  264. /package/dist/{runtime-C58AJWSv.cjs → sig-YYj5tCnr.cjs} +0 -0
  265. /package/dist/{std__assert-X-_kMxKM.js → std__assert-DWivtrGR.js} +0 -0
  266. /package/dist/{runtime → utils}/docloader.test.d.ts +0 -0
  267. /package/dist/{runtime/authdocloader.test.d.ts → utils/kv-cache.test.d.ts} +0 -0
  268. /package/dist/{sig-Cj3tk-ig.js → utils-D-Va7aXC.js} +0 -0
  269. /package/dist/{sig-ByHXzqUi.cjs → utils-DyRU1gdZ.cjs} +0 -0
  270. /package/dist/{webfinger-De_bU0iE.js → webfinger-C72Y8lrh.js} +0 -0
  271. /package/dist/{webfinger-BjOEdFPs.cjs → webfinger-vAtLmxOF.cjs} +0 -0
@@ -1,588 +0,0 @@
1
-
2
- import { Temporal } from "@js-temporal/polyfill";
3
- import { URLPattern } from "urlpattern-polyfill";
4
- globalThis.addEventListener = () => {};
5
-
6
- import { FetchError, UrlError, contexts_default, deno_default, getDocumentLoader, getUserAgent, kvCache } from "../type-E_91dusN.js";
7
- import { assertEquals } from "../assert_equals-DSbWqCm3.js";
8
- import "../assert-MZs1qjMx.js";
9
- import "../assert_instance_of-DHz7EHNU.js";
10
- import { MemoryKvStore } from "../kv-CRZrzyXm.js";
11
- import "../lookup-Co4Y1ycg.js";
12
- import { mockDocumentLoader, test } from "../testing-B17zODFD.js";
13
- import "../std__assert-X-_kMxKM.js";
14
- import { assertRejects } from "../assert_rejects-DiIiJbZn.js";
15
- import "../assert_is_error-BPGph1Jx.js";
16
- import "../assert_not_equals-f3m3epl3.js";
17
- import { assertThrows } from "../assert_throws-BOO88avQ.js";
18
- import { createTestTracerProvider } from "../otel-Chy5T2Xh.js";
19
- import { esm_default } from "../esm-aj4vkb76.js";
20
- import process from "node:process";
21
-
22
- //#region src/runtime/docloader.test.ts
23
- test("new FetchError()", () => {
24
- const e = new FetchError("https://example.com/", "An error message.");
25
- assertEquals(e.name, "FetchError");
26
- assertEquals(e.url, new URL("https://example.com/"));
27
- assertEquals(e.message, "https://example.com/: An error message.");
28
- const e2 = new FetchError(new URL("https://example.org/"));
29
- assertEquals(e2.url, new URL("https://example.org/"));
30
- assertEquals(e2.message, "https://example.org/");
31
- });
32
- test("getDocumentLoader()", async (t) => {
33
- const fetchDocumentLoader = getDocumentLoader();
34
- esm_default.spyGlobal();
35
- esm_default.get("https://example.com/object", { body: {
36
- "@context": "https://www.w3.org/ns/activitystreams",
37
- id: "https://example.com/object",
38
- name: "Fetched object",
39
- type: "Object"
40
- } });
41
- await t.step("ok", async () => {
42
- assertEquals(await fetchDocumentLoader("https://example.com/object"), {
43
- contextUrl: null,
44
- documentUrl: "https://example.com/object",
45
- document: {
46
- "@context": "https://www.w3.org/ns/activitystreams",
47
- id: "https://example.com/object",
48
- name: "Fetched object",
49
- type: "Object"
50
- }
51
- });
52
- });
53
- esm_default.get("https://example.com/link-ctx", {
54
- body: {
55
- id: "https://example.com/link-ctx",
56
- name: "Fetched object",
57
- type: "Object"
58
- },
59
- headers: {
60
- "Content-Type": "application/activity+json",
61
- Link: "<https://www.w3.org/ns/activitystreams>; rel=\"http://www.w3.org/ns/json-ld#context\"; type=\"application/ld+json\""
62
- }
63
- });
64
- esm_default.get("https://example.com/link-obj", { headers: {
65
- "Content-Type": "text/html; charset=utf-8",
66
- Link: "<https://example.com/object>; rel=\"alternate\"; type=\"application/activity+json\""
67
- } });
68
- esm_default.get("https://example.com/link-obj-relative", { headers: {
69
- "Content-Type": "text/html; charset=utf-8",
70
- Link: "</object>; rel=\"alternate\"; type=\"application/activity+json\""
71
- } });
72
- esm_default.get("https://example.com/obj-w-wrong-link", {
73
- body: {
74
- "@context": "https://www.w3.org/ns/activitystreams",
75
- id: "https://example.com/obj-w-wrong-link",
76
- name: "Fetched object",
77
- type: "Object"
78
- },
79
- headers: {
80
- "Content-Type": "text/html; charset=utf-8",
81
- Link: "<https://example.com/object>; rel=\"alternate\"; type=\"application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"\""
82
- }
83
- });
84
- await t.step("Link header", async () => {
85
- assertEquals(await fetchDocumentLoader("https://example.com/link-ctx"), {
86
- contextUrl: "https://www.w3.org/ns/activitystreams",
87
- documentUrl: "https://example.com/link-ctx",
88
- document: {
89
- id: "https://example.com/link-ctx",
90
- name: "Fetched object",
91
- type: "Object"
92
- }
93
- });
94
- assertEquals(await fetchDocumentLoader("https://example.com/link-obj"), {
95
- contextUrl: null,
96
- documentUrl: "https://example.com/object",
97
- document: {
98
- "@context": "https://www.w3.org/ns/activitystreams",
99
- id: "https://example.com/object",
100
- name: "Fetched object",
101
- type: "Object"
102
- }
103
- });
104
- });
105
- await t.step("Link header relative url", async () => {
106
- assertEquals(await fetchDocumentLoader("https://example.com/link-ctx"), {
107
- contextUrl: "https://www.w3.org/ns/activitystreams",
108
- documentUrl: "https://example.com/link-ctx",
109
- document: {
110
- id: "https://example.com/link-ctx",
111
- name: "Fetched object",
112
- type: "Object"
113
- }
114
- });
115
- assertEquals(await fetchDocumentLoader("https://example.com/link-obj-relative"), {
116
- contextUrl: null,
117
- documentUrl: "https://example.com/object",
118
- document: {
119
- "@context": "https://www.w3.org/ns/activitystreams",
120
- id: "https://example.com/object",
121
- name: "Fetched object",
122
- type: "Object"
123
- }
124
- });
125
- });
126
- await t.step("wrong Link header syntax", async () => {
127
- assertEquals(await fetchDocumentLoader("https://example.com/obj-w-wrong-link"), {
128
- contextUrl: null,
129
- documentUrl: "https://example.com/obj-w-wrong-link",
130
- document: {
131
- "@context": "https://www.w3.org/ns/activitystreams",
132
- id: "https://example.com/obj-w-wrong-link",
133
- name: "Fetched object",
134
- type: "Object"
135
- }
136
- });
137
- });
138
- esm_default.get("https://example.com/html-link", {
139
- body: `<html>
140
- <head>
141
- <meta charset=utf-8>
142
- <link
143
- rel=alternate
144
- type='application/activity+json'
145
- href="https://example.com/object">
146
- </head>
147
- </html>`,
148
- headers: { "Content-Type": "text/html; charset=utf-8" }
149
- });
150
- await t.step("HTML <link>", async () => {
151
- assertEquals(await fetchDocumentLoader("https://example.com/html-link"), {
152
- contextUrl: null,
153
- documentUrl: "https://example.com/object",
154
- document: {
155
- "@context": "https://www.w3.org/ns/activitystreams",
156
- id: "https://example.com/object",
157
- name: "Fetched object",
158
- type: "Object"
159
- }
160
- });
161
- });
162
- esm_default.get("https://example.com/xhtml-link", {
163
- body: `<html>
164
- <head>
165
- <meta charset="utf-8" />
166
- <link
167
- rel=alternate
168
- type="application/activity+json"
169
- href="https://example.com/object" />
170
- </head>
171
- </html>`,
172
- headers: { "Content-Type": "application/xhtml+xml; charset=utf-8" }
173
- });
174
- await t.step("XHTML <link>", async () => {
175
- assertEquals(await fetchDocumentLoader("https://example.com/xhtml-link"), {
176
- contextUrl: null,
177
- documentUrl: "https://example.com/object",
178
- document: {
179
- "@context": "https://www.w3.org/ns/activitystreams",
180
- id: "https://example.com/object",
181
- name: "Fetched object",
182
- type: "Object"
183
- }
184
- });
185
- });
186
- esm_default.get("https://example.com/html-a", {
187
- body: `<html>
188
- <head>
189
- <meta charset=utf-8>
190
- </head>
191
- <body>
192
- <a
193
- rel=alternate
194
- type=application/activity+json
195
- href=https://example.com/object>test</a>
196
- </body>
197
- </html>`,
198
- headers: { "Content-Type": "text/html; charset=utf-8" }
199
- });
200
- await t.step("HTML <a>", async () => {
201
- assertEquals(await fetchDocumentLoader("https://example.com/html-a"), {
202
- contextUrl: null,
203
- documentUrl: "https://example.com/object",
204
- document: {
205
- "@context": "https://www.w3.org/ns/activitystreams",
206
- id: "https://example.com/object",
207
- name: "Fetched object",
208
- type: "Object"
209
- }
210
- });
211
- });
212
- esm_default.get("https://example.com/wrong-content-type", {
213
- body: {
214
- "@context": "https://www.w3.org/ns/activitystreams",
215
- id: "https://example.com/wrong-content-type",
216
- name: "Fetched object",
217
- type: "Object"
218
- },
219
- headers: { "Content-Type": "text/html; charset=utf-8" }
220
- });
221
- await t.step("Wrong Content-Type", async () => {
222
- assertEquals(await fetchDocumentLoader("https://example.com/wrong-content-type"), {
223
- contextUrl: null,
224
- documentUrl: "https://example.com/wrong-content-type",
225
- document: {
226
- "@context": "https://www.w3.org/ns/activitystreams",
227
- id: "https://example.com/wrong-content-type",
228
- name: "Fetched object",
229
- type: "Object"
230
- }
231
- });
232
- });
233
- esm_default.get("https://example.com/404", { status: 404 });
234
- await t.step("not ok", async () => {
235
- await assertRejects(() => fetchDocumentLoader("https://example.com/404"), FetchError, "HTTP 404: https://example.com/404");
236
- });
237
- await t.step("preloaded contexts", async () => {
238
- for (const [url, document] of Object.entries(contexts_default)) assertEquals(await fetchDocumentLoader(url), {
239
- contextUrl: null,
240
- documentUrl: url,
241
- document
242
- });
243
- });
244
- await t.step("deny non-HTTP/HTTPS", async () => {
245
- await assertRejects(() => fetchDocumentLoader("ftp://localhost"), UrlError);
246
- });
247
- esm_default.get("https://example.com/localhost-redirect", {
248
- status: 302,
249
- headers: { Location: "https://localhost/object" }
250
- });
251
- esm_default.get("https://example.com/localhost-link", {
252
- body: `<html>
253
- <head>
254
- <meta charset=utf-8>
255
- <link
256
- rel=alternate
257
- type='application/activity+json'
258
- href="https://localhost/object">
259
- </head>
260
- </html>`,
261
- headers: { "Content-Type": "text/html; charset=utf-8" }
262
- });
263
- esm_default.get("https://localhost/object", { body: {
264
- "@context": "https://www.w3.org/ns/activitystreams",
265
- id: "https://localhost/object",
266
- name: "Fetched object",
267
- type: "Object"
268
- } });
269
- await t.step("allowPrivateAddress: false", async () => {
270
- await assertRejects(() => fetchDocumentLoader("https://localhost/object"), UrlError);
271
- await assertRejects(() => fetchDocumentLoader("https://example.com/localhost-redirect"), UrlError);
272
- await assertRejects(() => fetchDocumentLoader("https://example.com/localhost-link"), UrlError);
273
- });
274
- const fetchDocumentLoader2 = getDocumentLoader({ allowPrivateAddress: true });
275
- await t.step("allowPrivateAddress: true", async () => {
276
- const expected = {
277
- contextUrl: null,
278
- documentUrl: "https://localhost/object",
279
- document: {
280
- "@context": "https://www.w3.org/ns/activitystreams",
281
- id: "https://localhost/object",
282
- name: "Fetched object",
283
- type: "Object"
284
- }
285
- };
286
- assertEquals(await fetchDocumentLoader2("https://localhost/object"), expected);
287
- assertEquals(await fetchDocumentLoader2("https://example.com/localhost-redirect"), expected);
288
- assertEquals(await fetchDocumentLoader2("https://example.com/localhost-link"), expected);
289
- });
290
- esm_default.hardReset();
291
- });
292
- test("kvCache()", async (t) => {
293
- const kv = new MemoryKvStore();
294
- await t.step("cached", async () => {
295
- const loader = kvCache({
296
- kv,
297
- loader: mockDocumentLoader,
298
- rules: [
299
- ["https://example.org/", Temporal.Duration.from({ days: 1 })],
300
- [new URL("https://example.net/"), Temporal.Duration.from({ days: 1 })],
301
- [new URLPattern("https://example.com/*"), Temporal.Duration.from({ days: 30 })]
302
- ],
303
- prefix: ["_test", "cached"]
304
- });
305
- const result = await loader("https://example.com/object");
306
- assertEquals(result, {
307
- contextUrl: null,
308
- documentUrl: "https://example.com/object",
309
- document: {
310
- "@context": "https://www.w3.org/ns/activitystreams",
311
- id: "https://example.com/object",
312
- name: "Fetched object",
313
- type: "Object"
314
- }
315
- });
316
- const cache = await kv.get([
317
- "_test",
318
- "cached",
319
- "https://example.com/object"
320
- ]);
321
- assertEquals(cache, result);
322
- await kv.set([
323
- "_test",
324
- "cached",
325
- "https://example.org/"
326
- ], {
327
- contextUrl: null,
328
- documentUrl: "https://example.org/",
329
- document: { "id": "https://example.org/" }
330
- });
331
- const result2 = await loader("https://example.org/");
332
- assertEquals(result2, {
333
- contextUrl: null,
334
- documentUrl: "https://example.org/",
335
- document: { "id": "https://example.org/" }
336
- });
337
- await kv.set([
338
- "_test",
339
- "cached",
340
- "https://example.net/"
341
- ], {
342
- contextUrl: null,
343
- documentUrl: "https://example.net/",
344
- document: { "id": "https://example.net/" }
345
- });
346
- const result3 = await loader("https://example.net/");
347
- assertEquals(result3, {
348
- contextUrl: null,
349
- documentUrl: "https://example.net/",
350
- document: { "id": "https://example.net/" }
351
- });
352
- });
353
- await t.step("not cached", async () => {
354
- const loader = kvCache({
355
- kv,
356
- loader: mockDocumentLoader,
357
- rules: [],
358
- prefix: ["_test", "not cached"]
359
- });
360
- const result = await loader("https://example.com/object");
361
- assertEquals(result, {
362
- contextUrl: null,
363
- documentUrl: "https://example.com/object",
364
- document: {
365
- "@context": "https://www.w3.org/ns/activitystreams",
366
- id: "https://example.com/object",
367
- name: "Fetched object",
368
- type: "Object"
369
- }
370
- });
371
- const cache = await kv.get([
372
- "test2",
373
- "not cached",
374
- "https://example.com/object"
375
- ]);
376
- assertEquals(cache, void 0);
377
- });
378
- await t.step("maximum cache duration", () => {
379
- assertThrows(() => kvCache({
380
- kv,
381
- loader: mockDocumentLoader,
382
- rules: [["https://example.com/", Temporal.Duration.from({
383
- days: 30,
384
- seconds: 1
385
- })]]
386
- }), TypeError, "The maximum cache duration is 30 days");
387
- assertThrows(() => kvCache({
388
- kv,
389
- loader: mockDocumentLoader,
390
- rules: [[new URLPattern("https://example.com/*"), Temporal.Duration.from({
391
- days: 30,
392
- seconds: 1
393
- })]]
394
- }), TypeError, "The maximum cache duration is 30 days");
395
- });
396
- await t.step("on kv store exception", async () => {
397
- class KvStoreThrowsException {
398
- get(_key) {
399
- throw new Error("Failed to get key");
400
- }
401
- set(_key, _value, _options) {
402
- throw new Error("Failed to set key");
403
- }
404
- delete(_key) {
405
- throw new Error("Failed to delete key");
406
- }
407
- }
408
- const loader = kvCache({
409
- kv: new KvStoreThrowsException(),
410
- loader: mockDocumentLoader,
411
- rules: [
412
- ["https://example.org/", Temporal.Duration.from({ days: 1 })],
413
- [new URL("https://example.net/"), Temporal.Duration.from({ days: 1 })],
414
- [new URLPattern("https://example.com/*"), Temporal.Duration.from({ days: 30 })]
415
- ],
416
- prefix: ["_test", "not cached"]
417
- });
418
- const result = await loader("https://example.com/object");
419
- assertEquals(result, {
420
- contextUrl: null,
421
- documentUrl: "https://example.com/object",
422
- document: {
423
- "@context": "https://www.w3.org/ns/activitystreams",
424
- id: "https://example.com/object",
425
- name: "Fetched object",
426
- type: "Object"
427
- }
428
- });
429
- });
430
- await t.step("preloaded contexts bypass cache", async () => {
431
- const kv$1 = new MemoryKvStore();
432
- let loaderCalled = false;
433
- const mockLoader = (url) => {
434
- loaderCalled = true;
435
- return Promise.resolve({
436
- contextUrl: null,
437
- documentUrl: url,
438
- document: { "mock": "document" }
439
- });
440
- };
441
- const loader = kvCache({
442
- kv: kv$1,
443
- loader: mockLoader,
444
- prefix: ["_test", "preloaded"]
445
- });
446
- const activityStreamsUrl = "https://www.w3.org/ns/activitystreams";
447
- loaderCalled = false;
448
- const result = await loader(activityStreamsUrl);
449
- assertEquals(result, {
450
- contextUrl: null,
451
- documentUrl: activityStreamsUrl,
452
- document: contexts_default[activityStreamsUrl]
453
- });
454
- assertEquals(loaderCalled, false, "Loader should not be called for preloaded contexts");
455
- const cachedValue = await kv$1.get([
456
- "_test",
457
- "preloaded",
458
- activityStreamsUrl
459
- ]);
460
- assertEquals(cachedValue, void 0, "Preloaded contexts should not be cached in KV store");
461
- const securityUrl = "https://w3id.org/security/v1";
462
- loaderCalled = false;
463
- const result2 = await loader(securityUrl);
464
- assertEquals(result2, {
465
- contextUrl: null,
466
- documentUrl: securityUrl,
467
- document: contexts_default[securityUrl]
468
- });
469
- assertEquals(loaderCalled, false, "Loader should not be called for preloaded contexts");
470
- const nonPreloadedUrl = "https://example.com/not-preloaded";
471
- loaderCalled = false;
472
- const result3 = await loader(nonPreloadedUrl);
473
- assertEquals(result3, {
474
- contextUrl: null,
475
- documentUrl: nonPreloadedUrl,
476
- document: { "mock": "document" }
477
- });
478
- assertEquals(loaderCalled, true, "Loader should be called for non-preloaded URLs");
479
- const cachedValue2 = await kv$1.get([
480
- "_test",
481
- "preloaded",
482
- nonPreloadedUrl
483
- ]);
484
- assertEquals(cachedValue2, result3, "Non-preloaded URLs should be cached");
485
- });
486
- });
487
- test("getUserAgent()", () => {
488
- if ("Deno" in globalThis) {
489
- assertEquals(getUserAgent(), `Fedify/${deno_default.version} (Deno/${Deno.version.deno})`);
490
- assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Deno/${Deno.version.deno})`);
491
- assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${deno_default.version} (Deno/${Deno.version.deno}; +https://example.com/)`);
492
- assertEquals(getUserAgent({
493
- software: "MyApp/1.0.0",
494
- url: new URL("https://example.com/")
495
- }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Deno/${Deno.version.deno}; +https://example.com/)`);
496
- } else if ("Bun" in globalThis) {
497
- assertEquals(getUserAgent(), `Fedify/${deno_default.version} (Bun/${Bun.version})`);
498
- assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Bun/${Bun.version})`);
499
- assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${deno_default.version} (Bun/${Bun.version}; +https://example.com/)`);
500
- assertEquals(getUserAgent({
501
- software: "MyApp/1.0.0",
502
- url: new URL("https://example.com/")
503
- }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Bun/${Bun.version}; +https://example.com/)`);
504
- } else if (navigator.userAgent === "Cloudflare-Workers") {
505
- assertEquals(getUserAgent(), `Fedify/${deno_default.version} (Cloudflare-Workers)`);
506
- assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Cloudflare-Workers)`);
507
- assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${deno_default.version} (Cloudflare-Workers; +https://example.com/)`);
508
- assertEquals(getUserAgent({
509
- software: "MyApp/1.0.0",
510
- url: new URL("https://example.com/")
511
- }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Cloudflare-Workers; +https://example.com/)`);
512
- } else {
513
- assertEquals(getUserAgent(), `Fedify/${deno_default.version} (Node.js/${process.versions.node})`);
514
- assertEquals(getUserAgent({ software: "MyApp/1.0.0" }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Node.js/${process.versions.node})`);
515
- assertEquals(getUserAgent({ url: "https://example.com/" }), `Fedify/${deno_default.version} (Node.js/${process.versions.node}; +https://example.com/)`);
516
- assertEquals(getUserAgent({
517
- software: "MyApp/1.0.0",
518
- url: new URL("https://example.com/")
519
- }), `MyApp/1.0.0 (Fedify/${deno_default.version}; Node.js/${process.versions.node}; +https://example.com/)`);
520
- }
521
- });
522
- test("getDocumentLoader() records OpenTelemetry span", async (t) => {
523
- const [tracerProvider, exporter] = createTestTracerProvider();
524
- esm_default.spyGlobal();
525
- await t.step("successful fetch", async () => {
526
- esm_default.get("https://example.com/doc", {
527
- status: 200,
528
- headers: { "Content-Type": "application/activity+json" },
529
- body: JSON.stringify({
530
- "@context": "https://www.w3.org/ns/activitystreams",
531
- type: "Note"
532
- })
533
- });
534
- const loader = getDocumentLoader();
535
- const { trace } = await import("@opentelemetry/api");
536
- const originalProvider = trace.getTracerProvider();
537
- trace.setGlobalTracerProvider(tracerProvider);
538
- try {
539
- const result = await loader("https://example.com/doc");
540
- assertEquals(result.documentUrl, "https://example.com/doc");
541
- const spans = exporter.getSpans("activitypub.fetch_document");
542
- assertEquals(spans.length, 1);
543
- const span = spans[0];
544
- assertEquals(span.attributes["url.full"], "https://example.com/doc");
545
- assertEquals(span.attributes["http.response.status_code"], 200);
546
- assertEquals(span.attributes["docloader.document_url"], "https://example.com/doc");
547
- } finally {
548
- trace.setGlobalTracerProvider(originalProvider);
549
- exporter.clear();
550
- esm_default.hardReset();
551
- }
552
- });
553
- await t.step("redirect", async () => {
554
- esm_default.spyGlobal();
555
- esm_default.get("https://example.com/doc", {
556
- status: 302,
557
- headers: { "Location": "https://example.com/new-doc" }
558
- });
559
- esm_default.get("https://example.com/new-doc", {
560
- status: 200,
561
- headers: { "Content-Type": "application/activity+json" },
562
- body: JSON.stringify({
563
- "@context": "https://www.w3.org/ns/activitystreams",
564
- type: "Note"
565
- })
566
- });
567
- const loader = getDocumentLoader();
568
- const { trace } = await import("@opentelemetry/api");
569
- const originalProvider = trace.getTracerProvider();
570
- trace.setGlobalTracerProvider(tracerProvider);
571
- try {
572
- const result = await loader("https://example.com/doc");
573
- assertEquals(result.documentUrl, "https://example.com/new-doc");
574
- const spans = exporter.getSpans("activitypub.fetch_document");
575
- assertEquals(spans.length, 2);
576
- const redirectSpan = spans[spans.length - 1];
577
- assertEquals(redirectSpan.attributes["url.full"], "https://example.com/doc");
578
- assertEquals(redirectSpan.attributes["http.response.status_code"], 302);
579
- assertEquals(redirectSpan.attributes["http.redirect.url"], "https://example.com/new-doc");
580
- } finally {
581
- trace.setGlobalTracerProvider(originalProvider);
582
- exporter.clear();
583
- esm_default.hardReset();
584
- }
585
- });
586
- });
587
-
588
- //#endregion
@@ -1,3 +0,0 @@
1
- import { Temporal } from "@js-temporal/polyfill";
2
- import { URLPattern } from "urlpattern-polyfill";
3
- globalThis.addEventListener = () => {};