@fedify/fedify 2.0.0-dev.1690 → 2.0.0-dev.170

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 (317) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +70 -34
  3. package/dist/{assert_rejects-DiIiJbZn.js → assert_rejects-Ce45JcFg.js} +1 -1
  4. package/dist/{assert_is_error-BPGph1Jx.js → assert_throws-BNXdRGWP.js} +31 -1
  5. package/dist/{builder-CYOcDUkj.js → builder-_MVsWtsS.js} +9 -8
  6. package/dist/{client-bgSdkFa2.d.ts → client-CUTUGgvJ.d.ts} +19 -19
  7. package/dist/{client-CnOdwLLN.js → client-Dg7OfUDA.js} +28 -23
  8. package/dist/{client-CegPX0Rn.d.cts → client-by-PEGAJ.d.cts} +19 -19
  9. package/dist/compat/mod.cjs +1 -1
  10. package/dist/compat/mod.d.cts +6 -12
  11. package/dist/compat/mod.d.ts +6 -12
  12. package/dist/compat/mod.js +1 -1
  13. package/dist/compat/transformers.test.js +19 -18
  14. package/dist/context-Bns6uTJq.js +109 -0
  15. package/dist/{context-ByZprN0S.d.ts → context-C7vzWilY.d.ts} +314 -182
  16. package/dist/{context-C5BsZkDr.d.cts → context-CrB9RFy5.d.cts} +314 -182
  17. package/dist/deno-DhWON59o.js +117 -0
  18. package/dist/{testing-BWNCAbL-.js → dist-B5f6a8Tt.js} +90 -111
  19. package/dist/{authdocloader-Brax1A32.js → docloader-Cni79dmb.js} +17 -8
  20. package/dist/{esm-DnIzfEj0.js → esm-DGl7uK1r.js} +32 -17
  21. package/dist/federation/builder.test.js +11 -11
  22. package/dist/federation/collection.test.js +5 -8
  23. package/dist/federation/handler.test.js +111 -24
  24. package/dist/federation/idempotency.test.js +24 -24
  25. package/dist/federation/inbox.test.js +5 -6
  26. package/dist/federation/keycache.test.js +4 -5
  27. package/dist/federation/kv.test.js +60 -9
  28. package/dist/federation/middleware.test.js +102 -101
  29. package/dist/federation/mod.cjs +8 -12
  30. package/dist/federation/mod.d.cts +7 -13
  31. package/dist/federation/mod.d.ts +7 -13
  32. package/dist/federation/mod.js +8 -13
  33. package/dist/federation/mq.test.js +9 -10
  34. package/dist/federation/negotiation.test.js +5 -8
  35. package/dist/federation/retry.test.js +2 -4
  36. package/dist/federation/router.test.js +6 -8
  37. package/dist/federation/send.test.js +55 -15
  38. package/dist/{webfinger/handler.test.js → federation/webfinger.test.js} +25 -24
  39. package/dist/{federation-H2_En3j5.cjs → federation-B431K2gm.cjs} +22 -0
  40. package/dist/{federation-D1U8YY9t.js → federation-BbZwNNWj.js} +28 -6
  41. package/dist/{http-C7vbQwbz.cjs → http-7RQPvAkX.cjs} +410 -14
  42. package/dist/{http-BxbM8sEy.js → http-CZXlv4xU.js} +371 -11
  43. package/dist/{http-D-e6AFwR.d.cts → http-ClB3pLcL.d.cts} +2 -2
  44. package/dist/{http-BNOYnVsU.js → http-CwsBL5_A.js} +3 -2
  45. package/dist/{http-D6Uj2x2y.d.ts → http-DLBDPal9.d.ts} +2 -2
  46. package/dist/{inbox-BRru9pX3.js → inbox-CukSCwad.js} +2 -1
  47. package/dist/{key-1KXru8Ug.js → key-DKkHKzvg.js} +3 -2
  48. package/dist/{keycache-CN61iGVj.js → keycache-DRxpZ5r9.js} +1 -1
  49. package/dist/{keys-BPdFKgiy.js → keys-ZbcByPg9.js} +2 -1
  50. package/dist/{kv-63Cil1MD.d.cts → kv-B4vFhIYL.d.cts} +30 -1
  51. package/dist/{kv-C7sopW2E.d.ts → kv-CYySNrsn.d.ts} +30 -1
  52. package/dist/{kv-CRZrzyXm.js → kv-QzKcOQgP.js} +22 -0
  53. package/dist/kv-cache-BEeqyGER.js +107 -0
  54. package/dist/kv-cache-BVA7CrnS.cjs +134 -0
  55. package/dist/kv-cache-HDuc4ZaJ.js +122 -0
  56. package/dist/{ld-Dv8DNNAT.js → ld-CM6OO5ar.js} +4 -2
  57. package/dist/middleware--i9t8nKh.js +26 -0
  58. package/dist/middleware-C567nJlD.cjs +12 -0
  59. package/dist/middleware-D9oWuacw.js +12 -0
  60. package/dist/{middleware-DY9B2lL8.js → middleware-DXRcwk_y.js} +185 -192
  61. package/dist/{middleware-BmoOlgc1.cjs → middleware-TufpQUzj.cjs} +251 -241
  62. package/dist/{middleware-Bz_A2jeJ.js → middleware-eDeNdyRA.js} +195 -191
  63. package/dist/mod-0p9zUdzg.d.cts +107 -0
  64. package/dist/mod-0qnPv4EC.d.cts +62 -0
  65. package/dist/{mod-Djzcw2ry.d.cts → mod-BrS8tiad.d.cts} +3 -3
  66. package/dist/mod-C3SOvTD1.d.ts +64 -0
  67. package/dist/{mod-8DMWKtQE.d.cts → mod-D6pS5_xJ.d.cts} +4 -4
  68. package/dist/{mod-BhUKmBJD.d.ts → mod-jOa7W503.d.ts} +3 -3
  69. package/dist/{mod-D6hQoxC5.d.ts → mod-waqu-BL_.d.ts} +4 -4
  70. package/dist/mod-xc20HhMD.d.ts +109 -0
  71. package/dist/mod.cjs +17 -112
  72. package/dist/mod.d.cts +11 -17
  73. package/dist/mod.d.ts +11 -17
  74. package/dist/mod.js +11 -17
  75. package/dist/nodeinfo/client.test.js +7 -10
  76. package/dist/nodeinfo/handler.test.js +23 -23
  77. package/dist/nodeinfo/mod.cjs +2 -3
  78. package/dist/nodeinfo/mod.d.cts +2 -4
  79. package/dist/nodeinfo/mod.d.ts +2 -4
  80. package/dist/nodeinfo/mod.js +2 -3
  81. package/dist/nodeinfo/types.test.js +6 -9
  82. package/dist/otel/exporter.test.js +893 -0
  83. package/dist/otel/mod.cjs +256 -0
  84. package/dist/otel/mod.d.cts +230 -0
  85. package/dist/otel/mod.d.ts +232 -0
  86. package/dist/otel/mod.js +255 -0
  87. package/dist/{owner-e3FYDhsk.js → owner-BOEfZQv2.js} +45 -8
  88. package/dist/{owner-hd9lvQcP.d.ts → owner-BgI8C-VY.d.ts} +2 -3
  89. package/dist/{owner-BN_tO3cY.d.cts → owner-C-zfmVAD.d.cts} +2 -3
  90. package/dist/{proof-B-eqv0Ug.cjs → proof-CaDQpGJD.cjs} +69 -33
  91. package/dist/{proof-DfgvA3al.js → proof-iYIDiv8I.js} +47 -11
  92. package/dist/{proof-6gFMwMNJ.js → proof-iw6KtIyj.js} +3 -2
  93. package/dist/router-D9eI0s4b.js +118 -0
  94. package/dist/{send-Tl9NOnmO.js → send-Bn8o0mjW.js} +9 -4
  95. package/dist/sig/http.test.js +11 -13
  96. package/dist/sig/key.test.js +9 -11
  97. package/dist/sig/ld.test.js +8 -10
  98. package/dist/sig/mod.cjs +7 -11
  99. package/dist/sig/mod.d.cts +3 -7
  100. package/dist/sig/mod.d.ts +3 -7
  101. package/dist/sig/mod.js +3 -7
  102. package/dist/sig/owner.test.js +33 -12
  103. package/dist/sig/proof.test.js +13 -14
  104. package/dist/testing/mod.d.ts +183 -7194
  105. package/dist/testing/mod.js +4 -4
  106. package/dist/{transformers-CoBS-oFG.cjs → transformers-BjBg6Lag.cjs} +2 -2
  107. package/dist/{transformers-BFT6d7J5.js → transformers-N_ip_y4P.js} +2 -2
  108. package/dist/{types-DqxyTxOf.js → types-8l28uC8o.js} +31 -26
  109. package/dist/{types-zqdWZh4O.cjs → types-B6z6CqIz.cjs} +33 -28
  110. package/dist/{types-BSuWJsOm.js → types-CPz01LGH.js} +3 -3
  111. package/dist/{runtime/authdocloader.test.js → utils/docloader.test.js} +13 -15
  112. package/dist/utils/kv-cache.test.js +211 -0
  113. package/dist/utils/mod.cjs +10 -0
  114. package/dist/utils/mod.d.cts +4 -0
  115. package/dist/utils/mod.d.ts +6 -0
  116. package/dist/utils/mod.js +9 -0
  117. package/package.json +34 -75
  118. package/dist/actor-Be0ThtXy.cjs +0 -42609
  119. package/dist/actor-ChbPLm6n.js +0 -42135
  120. package/dist/actor-D6K058Tb.d.cts +0 -128
  121. package/dist/actor-DuCeRiNh.js +0 -146
  122. package/dist/actor-T6RyhRgk.d.ts +0 -130
  123. package/dist/assert_throws-BOO88avQ.js +0 -39
  124. package/dist/authdocloader-CrxhFL8e.js +0 -52
  125. package/dist/authdocloader-OSn_teLV.cjs +0 -58
  126. package/dist/denokv-Bv33Xxea.js +0 -57
  127. package/dist/docloader-CCqXeagZ.cjs +0 -4861
  128. package/dist/docloader-CxWcuWqQ.d.ts +0 -221
  129. package/dist/docloader-D-MrRyHl.d.cts +0 -219
  130. package/dist/docloader-XK3y2jn5.js +0 -4795
  131. package/dist/fixtures/activitypub.academy/users/brauca_darradiul.json +0 -83
  132. package/dist/fixtures/example.com/announce.json +0 -6
  133. package/dist/fixtures/example.com/collection.json +0 -19
  134. package/dist/fixtures/example.com/create.json +0 -6
  135. package/dist/fixtures/example.com/cross-origin-actor.json +0 -6
  136. package/dist/fixtures/example.com/hong-gildong.json +0 -11
  137. package/dist/fixtures/example.com/invite.json +0 -7
  138. package/dist/fixtures/example.com/key.json +0 -7
  139. package/dist/fixtures/example.com/key2.json +0 -6
  140. package/dist/fixtures/example.com/object.json +0 -6
  141. package/dist/fixtures/example.com/orderedcollectionpage.json +0 -24
  142. package/dist/fixtures/example.com/paged/a.json +0 -13
  143. package/dist/fixtures/example.com/paged/b.json +0 -16
  144. package/dist/fixtures/example.com/paged-collection.json +0 -6
  145. package/dist/fixtures/example.com/person.json +0 -22
  146. package/dist/fixtures/example.com/person2.json +0 -40
  147. package/dist/fixtures/example.com/test.json +0 -5
  148. package/dist/fixtures/example.com/users/handle.json +0 -16
  149. package/dist/fixtures/example.com/wrong-type.json +0 -3
  150. package/dist/fixtures/media.example.com/avatars/test-avatar.jpg.json +0 -6
  151. package/dist/fixtures/oeee.cafe/ap/users/3609fd4e-d51d-4db8-9f04-4189815864dd.json +0 -24
  152. package/dist/fixtures/remote.domain/users/bob.json +0 -20
  153. package/dist/fixtures/server.example/users/alice.json +0 -20
  154. package/dist/fixtures/w3id.org/identity/v1.json +0 -152
  155. package/dist/fixtures/w3id.org/security/data-integrity/v1.json +0 -74
  156. package/dist/fixtures/w3id.org/security/multikey/v1.json +0 -35
  157. package/dist/fixtures/w3id.org/security/v1.json +0 -50
  158. package/dist/fixtures/wizard.casa/users/hongminhee.json +0 -69
  159. package/dist/fixtures/www.w3.org/ns/activitystreams.json +0 -379
  160. package/dist/fixtures/www.w3.org/ns/did/v1.json +0 -58
  161. package/dist/key-B3uag-rz.js +0 -10
  162. package/dist/key-BiBmb1Yy.cjs +0 -10
  163. package/dist/key-DK_nfU4I.js +0 -10
  164. package/dist/key-Z6ceKnZC.cjs +0 -290
  165. package/dist/key-jyNTxCvK.js +0 -260
  166. package/dist/lookup-BPviO8ij.js +0 -131
  167. package/dist/lookup-hnMAAU5r.cjs +0 -137
  168. package/dist/lookup-pV0JOsuV.js +0 -331
  169. package/dist/middleware-CI0-zw4U.js +0 -26
  170. package/dist/middleware-QNK-W-jE.cjs +0 -17
  171. package/dist/middleware-_vjt6FWU.js +0 -17
  172. package/dist/mod-CerN_Sza.d.ts +0 -104
  173. package/dist/mod-Cj1tHXBR.d.cts +0 -102
  174. package/dist/mod-CxkWO3Mg.d.cts +0 -307
  175. package/dist/mod-DBzN0aCM.d.ts +0 -115
  176. package/dist/mod-DlU8ISoa.d.ts +0 -309
  177. package/dist/mod-FZd39qVq.d.cts +0 -1
  178. package/dist/mod-g0xFzAP9.d.ts +0 -2
  179. package/dist/mod-jQ4OODsl.d.cts +0 -113
  180. package/dist/mq-B7R1Q-M5.d.cts +0 -140
  181. package/dist/mq-CRGm1e_F.d.ts +0 -143
  182. package/dist/runtime/docloader.test.js +0 -522
  183. package/dist/runtime/key.test.js +0 -103
  184. package/dist/runtime/langstr.test.d.ts +0 -3
  185. package/dist/runtime/langstr.test.js +0 -39
  186. package/dist/runtime/link.test.d.ts +0 -3
  187. package/dist/runtime/link.test.js +0 -61
  188. package/dist/runtime/mod.cjs +0 -25
  189. package/dist/runtime/mod.d.cts +0 -6
  190. package/dist/runtime/mod.d.ts +0 -8
  191. package/dist/runtime/mod.js +0 -13
  192. package/dist/runtime/multibase/multibase.test.d.ts +0 -3
  193. package/dist/runtime/multibase/multibase.test.js +0 -358
  194. package/dist/runtime/url.test.d.ts +0 -3
  195. package/dist/runtime/url.test.js +0 -45
  196. package/dist/src/vocab/accept.yaml +0 -15
  197. package/dist/src/vocab/activity.yaml +0 -98
  198. package/dist/src/vocab/add.yaml +0 -16
  199. package/dist/src/vocab/announce.yaml +0 -30
  200. package/dist/src/vocab/application.yaml +0 -324
  201. package/dist/src/vocab/arrive.yaml +0 -15
  202. package/dist/src/vocab/article.yaml +0 -46
  203. package/dist/src/vocab/audio.yaml +0 -11
  204. package/dist/src/vocab/block.yaml +0 -16
  205. package/dist/src/vocab/chatmessage.yaml +0 -50
  206. package/dist/src/vocab/collection.yaml +0 -154
  207. package/dist/src/vocab/collectionpage.yaml +0 -55
  208. package/dist/src/vocab/create.yaml +0 -28
  209. package/dist/src/vocab/dataintegrityproof.yaml +0 -56
  210. package/dist/src/vocab/delete.yaml +0 -27
  211. package/dist/src/vocab/didservice.yaml +0 -22
  212. package/dist/src/vocab/dislike.yaml +0 -14
  213. package/dist/src/vocab/document.yaml +0 -31
  214. package/dist/src/vocab/emoji.yaml +0 -12
  215. package/dist/src/vocab/emojireact.yaml +0 -17
  216. package/dist/src/vocab/endpoints.yaml +0 -85
  217. package/dist/src/vocab/event.yaml +0 -11
  218. package/dist/src/vocab/export.yaml +0 -9
  219. package/dist/src/vocab/flag.yaml +0 -15
  220. package/dist/src/vocab/follow.yaml +0 -19
  221. package/dist/src/vocab/group.yaml +0 -324
  222. package/dist/src/vocab/hashtag.yaml +0 -14
  223. package/dist/src/vocab/ignore.yaml +0 -14
  224. package/dist/src/vocab/image.yaml +0 -9
  225. package/dist/src/vocab/intransitiveactivity.yaml +0 -15
  226. package/dist/src/vocab/invite.yaml +0 -14
  227. package/dist/src/vocab/join.yaml +0 -14
  228. package/dist/src/vocab/key.yaml +0 -28
  229. package/dist/src/vocab/leave.yaml +0 -14
  230. package/dist/src/vocab/like.yaml +0 -16
  231. package/dist/src/vocab/link.yaml +0 -101
  232. package/dist/src/vocab/listen.yaml +0 -12
  233. package/dist/src/vocab/mention.yaml +0 -9
  234. package/dist/src/vocab/move.yaml +0 -15
  235. package/dist/src/vocab/multikey.yaml +0 -36
  236. package/dist/src/vocab/note.yaml +0 -48
  237. package/dist/src/vocab/object.yaml +0 -404
  238. package/dist/src/vocab/offer.yaml +0 -15
  239. package/dist/src/vocab/orderedcollection.yaml +0 -39
  240. package/dist/src/vocab/orderedcollectionpage.yaml +0 -50
  241. package/dist/src/vocab/organization.yaml +0 -324
  242. package/dist/src/vocab/page.yaml +0 -11
  243. package/dist/src/vocab/person.yaml +0 -324
  244. package/dist/src/vocab/place.yaml +0 -75
  245. package/dist/src/vocab/profile.yaml +0 -26
  246. package/dist/src/vocab/propertyvalue.yaml +0 -32
  247. package/dist/src/vocab/question.yaml +0 -103
  248. package/dist/src/vocab/read.yaml +0 -13
  249. package/dist/src/vocab/reject.yaml +0 -14
  250. package/dist/src/vocab/relationship.yaml +0 -52
  251. package/dist/src/vocab/remove.yaml +0 -14
  252. package/dist/src/vocab/service.yaml +0 -324
  253. package/dist/src/vocab/source.yaml +0 -26
  254. package/dist/src/vocab/tentativeaccept.yaml +0 -14
  255. package/dist/src/vocab/tentativereject.yaml +0 -14
  256. package/dist/src/vocab/tombstone.yaml +0 -24
  257. package/dist/src/vocab/travel.yaml +0 -16
  258. package/dist/src/vocab/undo.yaml +0 -26
  259. package/dist/src/vocab/update.yaml +0 -58
  260. package/dist/src/vocab/video.yaml +0 -11
  261. package/dist/src/vocab/view.yaml +0 -13
  262. package/dist/testing/docloader.test.js +0 -24
  263. package/dist/type-C69ZBu7f.js +0 -47010
  264. package/dist/vocab/actor.test.d.ts +0 -3
  265. package/dist/vocab/actor.test.js +0 -5965
  266. package/dist/vocab/lookup.test.d.ts +0 -3
  267. package/dist/vocab/lookup.test.js +0 -456
  268. package/dist/vocab/mod.cjs +0 -87
  269. package/dist/vocab/mod.d.cts +0 -6
  270. package/dist/vocab/mod.d.ts +0 -8
  271. package/dist/vocab/mod.js +0 -10
  272. package/dist/vocab/schema.yaml +0 -247
  273. package/dist/vocab/type.test.d.ts +0 -3
  274. package/dist/vocab/type.test.js +0 -25
  275. package/dist/vocab/vocab.test.d.ts +0 -3
  276. package/dist/vocab/vocab.test.js +0 -3787
  277. package/dist/vocab-B39-pFl9.cjs +0 -291
  278. package/dist/vocab-BI0Ak5lL.d.ts +0 -14924
  279. package/dist/vocab-BWoeZsME.js +0 -255
  280. package/dist/vocab-Dw1-yVGg.d.cts +0 -14922
  281. package/dist/webfinger/handler.test.d.ts +0 -3
  282. package/dist/webfinger/lookup.test.d.ts +0 -3
  283. package/dist/webfinger/lookup.test.js +0 -195
  284. package/dist/webfinger/mod.cjs +0 -9
  285. package/dist/webfinger/mod.d.cts +0 -4
  286. package/dist/webfinger/mod.d.ts +0 -6
  287. package/dist/webfinger/mod.js +0 -9
  288. package/dist/webfinger-BjOEdFPs.cjs +0 -4
  289. package/dist/webfinger-De_bU0iE.js +0 -4
  290. package/dist/x/cfworkers.cjs +0 -100
  291. package/dist/x/cfworkers.d.cts +0 -59
  292. package/dist/x/cfworkers.d.ts +0 -61
  293. package/dist/x/cfworkers.js +0 -98
  294. package/dist/x/cfworkers.test.d.ts +0 -3
  295. package/dist/x/cfworkers.test.js +0 -179
  296. package/dist/x/hono.cjs +0 -61
  297. package/dist/x/hono.d.cts +0 -54
  298. package/dist/x/hono.d.ts +0 -56
  299. package/dist/x/hono.js +0 -60
  300. package/dist/x/sveltekit.cjs +0 -69
  301. package/dist/x/sveltekit.d.cts +0 -46
  302. package/dist/x/sveltekit.d.ts +0 -48
  303. package/dist/x/sveltekit.js +0 -68
  304. /package/dist/{assert_not_equals-f3m3epl3.js → assert_not_equals-C80BG-_5.js} +0 -0
  305. /package/dist/{runtime/authdocloader.test.d.ts → federation/webfinger.test.d.ts} +0 -0
  306. /package/dist/{mod-1pDWKvUL.d.ts → mod-1E3W847c.d.ts} +0 -0
  307. /package/dist/{mod-C2tOeRkN.d.cts → mod-C81L6_lQ.d.cts} +0 -0
  308. /package/dist/{nodeinfo-DfycQ8Wf.js → nodeinfo-BlLsRSiT.js} +0 -0
  309. /package/dist/{nodeinfo-Co9lJrWl.cjs → nodeinfo-DuMYTpbZ.cjs} +0 -0
  310. /package/dist/{runtime/docloader.test.d.ts → otel/exporter.test.d.ts} +0 -0
  311. /package/dist/{runtime-DPYEDf-o.js → sig-CwuONEzF.js} +0 -0
  312. /package/dist/{runtime-C58AJWSv.cjs → sig-DeXX2xnj.cjs} +0 -0
  313. /package/dist/{std__assert-X-_kMxKM.js → std__assert-DWivtrGR.js} +0 -0
  314. /package/dist/{testing → utils}/docloader.test.d.ts +0 -0
  315. /package/dist/{runtime/key.test.d.ts → utils/kv-cache.test.d.ts} +0 -0
  316. /package/dist/{sig-ByHXzqUi.cjs → utils-Db0ZmjcD.cjs} +0 -0
  317. /package/dist/{sig-Cj3tk-ig.js → utils-Wranxuoe.js} +0 -0
@@ -2,23 +2,21 @@
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
 
5
- import { getDefaultActivityTransformers } from "./transformers-BFT6d7J5.js";
6
- import { deno_default, getDocumentLoader, kvCache } from "./docloader-XK3y2jn5.js";
7
- import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, getTypeId } from "./actor-ChbPLm6n.js";
8
- import { lookupWebFinger } from "./lookup-BPviO8ij.js";
9
- import { exportJwk, importJwk, validateCryptoKey } from "./key-jyNTxCvK.js";
10
- import { doubleKnock, verifyRequest } from "./http-BxbM8sEy.js";
11
- import { detachSignature, doesActorOwnKey, getKeyOwner, hasSignature, signJsonLd, signObject, verifyJsonLd, verifyObject } from "./proof-DfgvA3al.js";
12
- import { getNodeInfo, nodeInfoToJson } from "./types-DqxyTxOf.js";
13
- import { getAuthenticatedDocumentLoader } from "./authdocloader-CrxhFL8e.js";
14
- import { lookupObject, traverseCollection } from "./vocab-BWoeZsME.js";
5
+ import { getDefaultActivityTransformers } from "./transformers-N_ip_y4P.js";
6
+ import { deno_default, doubleKnock, exportJwk, importJwk, validateCryptoKey, verifyRequest } from "./http-CZXlv4xU.js";
7
+ import { detachSignature, doesActorOwnKey, getKeyOwner, hasSignature, signJsonLd, signObject, verifyJsonLd, verifyObject } from "./proof-iYIDiv8I.js";
8
+ import { getNodeInfo, nodeInfoToJson } from "./types-8l28uC8o.js";
9
+ import { getAuthenticatedDocumentLoader, kvCache } from "./kv-cache-HDuc4ZaJ.js";
15
10
  import { getLogger, withContext } from "@logtape/logtape";
11
+ import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
16
12
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
17
- import { encodeHex } from "byte-encodings/hex";
18
13
  import { cloneDeep } from "es-toolkit";
19
14
  import { Router } from "uri-template-router";
20
15
  import { parseTemplate } from "url-template";
16
+ import { encodeHex } from "byte-encodings/hex";
21
17
  import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, ATTR_HTTP_RESPONSE_HEADER, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_URL_FULL } from "@opentelemetry/semantic-conventions";
18
+ import { getDocumentLoader } from "@fedify/vocab-runtime";
19
+ import { lookupWebFinger } from "@fedify/webfinger";
22
20
  import { domainToASCII } from "node:url";
23
21
 
24
22
  //#region src/federation/inbox.ts
@@ -339,7 +337,7 @@ var FederationBuilderImpl = class {
339
337
  this.collectionTypeIds = {};
340
338
  }
341
339
  async build(options) {
342
- const { FederationImpl: FederationImpl$1 } = await import("./middleware-_vjt6FWU.js");
340
+ const { FederationImpl: FederationImpl$1 } = await import("./middleware-D9oWuacw.js");
343
341
  const f = new FederationImpl$1(options);
344
342
  const trailingSlashInsensitiveValue = f.router.trailingSlashInsensitive;
345
343
  f.router = this.router.clone();
@@ -792,11 +790,11 @@ var FederationBuilderImpl = class {
792
790
  };
793
791
  return setters;
794
792
  }
795
- setCollectionDispatcher(name, ...args) {
796
- return this.#setCustomCollectionDispatcher(name, "collection", ...args);
793
+ setCollectionDispatcher(name, itemType, path, dispatcher) {
794
+ return this.#setCustomCollectionDispatcher(name, "collection", itemType, path, dispatcher);
797
795
  }
798
- setOrderedCollectionDispatcher(name, ...args) {
799
- return this.#setCustomCollectionDispatcher(name, "orderedCollection", ...args);
796
+ setOrderedCollectionDispatcher(name, itemType, path, dispatcher) {
797
+ return this.#setCustomCollectionDispatcher(name, "orderedCollection", itemType, path, dispatcher);
800
798
  }
801
799
  #setCustomCollectionDispatcher(name, collectionType, itemType, path, dispatcher) {
802
800
  const strName = String(name);
@@ -1491,6 +1489,13 @@ async function handleInboxInternal(request, parameters, span) {
1491
1489
  }
1492
1490
  if (activity.id != null) span.setAttribute("activitypub.activity.id", activity.id.href);
1493
1491
  span.setAttribute("activitypub.activity.type", getTypeId(activity).href);
1492
+ span.addEvent("activitypub.activity.received", {
1493
+ "activitypub.activity.json": JSON.stringify(json),
1494
+ "activitypub.activity.verified": activity != null,
1495
+ "ld_signatures.verified": ldSigVerified,
1496
+ "http_signatures.verified": httpSigKey != null,
1497
+ "http_signatures.key_id": httpSigKey?.id?.href ?? ""
1498
+ });
1494
1499
  if (httpSigKey != null && !await doesActorOwnKey(activity, httpSigKey, ctx)) {
1495
1500
  logger$1.error("The signer ({keyId}) and the actor ({actorId}) do not match.", {
1496
1501
  activity: json,
@@ -1550,7 +1555,7 @@ async function handleInboxInternal(request, parameters, span) {
1550
1555
  /**
1551
1556
  * Handles a custom collection request.
1552
1557
  * @template TItem The type of items in the collection.
1553
- * @template TParams The parameter names of the requested URL.
1558
+ * @template TParam The parameter names of the requested URL.
1554
1559
  * @template TContext The type of the context, extending {@link RequestContext}.
1555
1560
  * @template TContextData The context data to pass to the `TContext`.
1556
1561
  * @param request The HTTP request.
@@ -1568,7 +1573,7 @@ async function _handleCustomCollection(request, { name, values, context: context
1568
1573
  /**
1569
1574
  * Handles an ordered collection request.
1570
1575
  * @template TItem The type of items in the collection.
1571
- * @template TParams The parameter names of the requested URL.
1576
+ * @template TParam The parameter names of the requested URL.
1572
1577
  * @template TContext The type of the context, extending {@link RequestContext}.
1573
1578
  * @template TContextData The context data to pass to the `TContext`.
1574
1579
  * @param request The HTTP request.
@@ -1588,7 +1593,7 @@ async function _handleOrderedCollection(request, { name, values, context: contex
1588
1593
  * The main flow is on `getCollection`, `dispatch`.
1589
1594
  *
1590
1595
  * @template TItem The type of items in the collection.
1591
- * @template TParams The parameter names of the requested URL.
1596
+ * @template TParam The parameter names of the requested URL.
1592
1597
  * @template TContext The type of the context. {@link Context} or {@link RequestContext}.
1593
1598
  * @template TContextData The context data to pass to the `TContext`.
1594
1599
  * @template TCollection The type of the collection, extending {@link Collection}.
@@ -1622,14 +1627,14 @@ var CustomCollectionHandler = class {
1622
1627
  #collection = null;
1623
1628
  /**
1624
1629
  * Creates a new CustomCollection instance.
1625
- * @param {string} name The name of the collection.
1626
- * @param {TParams} values The parameter values for the collection.
1627
- * @param {TContext} context The request context.
1628
- * @param {CustomCollectionCallbacks} callbacks The collection callbacks.
1629
- * @param {TracerProvider} tracerProvider The tracer provider for telemetry.
1630
- * @param {ConstructorWithTypeId<TCollection>} Collection The Collection constructor.
1631
- * @param {ConstructorWithTypeId<TCollectionPage>} CollectionPage The CollectionPage constructor.
1632
- * @param {(item: TItem) => boolean} filterPredicate Optional filter predicate for items.
1630
+ * @param name The name of the collection.
1631
+ * @param values The parameter values for the collection.
1632
+ * @param context The request context.
1633
+ * @param callbacks The collection callbacks.
1634
+ * @param tracerProvider The tracer provider for telemetry.
1635
+ * @param Collection The Collection constructor.
1636
+ * @param CollectionPage The CollectionPage constructor.
1637
+ * @param filterPredicate Optional filter predicate for items.
1633
1638
  */
1634
1639
  constructor(name, values, context$1, callbacks, tracerProvider = trace.getTracerProvider(), Collection$1, CollectionPage$1, filterPredicate) {
1635
1640
  this.name = name;
@@ -1754,7 +1759,7 @@ var CustomCollectionHandler = class {
1754
1759
  /**
1755
1760
  * Creates a function to wrap the dispatcher so tracing can be applied.
1756
1761
  * @param params Parameters including cursor and total items.
1757
- * @returns {(span: Span) => Promise<PageItems<TItem>>} A function that handles the span operation.
1762
+ * @returns A function that handles the span operation.
1758
1763
  */
1759
1764
  spanPages = ({ totalItems = null, cursor = null }) => async (span) => {
1760
1765
  try {
@@ -1775,23 +1780,23 @@ var CustomCollectionHandler = class {
1775
1780
  };
1776
1781
  /**
1777
1782
  * Dispatches the collection request to get items.
1778
- * @param {string | null} cursor The cursor for pagination, or null for the first page.
1779
- * @returns {Promise<PageItems<TItem>>} A promise that resolves to the page items.
1783
+ * @param cursor The cursor for pagination, or null for the first page.
1784
+ * @returns A promise that resolves to the page items.
1780
1785
  */
1781
1786
  async dispatch(cursor = null) {
1782
1787
  return await this.#dispatcher(this.context, this.values, cursor) ?? new ItemsNotFoundError().throw();
1783
1788
  }
1784
1789
  /**
1785
1790
  * Filters the items in the collection.
1786
- * @param {TItem[]} items The items to filter.
1787
- * @returns {(Object | Link | URL)[]} The filtered items.
1791
+ * @param items The items to filter.
1792
+ * @returns The filtered items.
1788
1793
  */
1789
1794
  filterItems(items) {
1790
1795
  return filterCollectionItems(items, this.name, this.filterPredicate);
1791
1796
  }
1792
1797
  /**
1793
1798
  * Appends a cursor to the URL if it exists.
1794
- * @param {string | null | undefined} cursor The cursor to append, or null/undefined.
1799
+ * @param cursor The cursor to append, or null/undefined.
1795
1800
  * @returns The URL with cursor appended, or null if cursor is null/undefined.
1796
1801
  */
1797
1802
  appendToUrl(cursor) {
@@ -1799,8 +1804,7 @@ var CustomCollectionHandler = class {
1799
1804
  }
1800
1805
  /**
1801
1806
  * Gets the stored collection or collection page.
1802
- * @returns {Promise<TCollection | TCollectionPage>} A promise that resolves to
1803
- the collection or collection page.
1807
+ * @returns A promise that resolves to the collection or collection page.
1804
1808
  */
1805
1809
  get collection() {
1806
1810
  if (this.#collection === null) this.#collection = this.getCollection();
@@ -1808,8 +1812,8 @@ var CustomCollectionHandler = class {
1808
1812
  }
1809
1813
  /**
1810
1814
  * Gets the total number of items in the collection.
1811
- * @returns {Promise<number | null>} A promise that
1812
- resolves to the total items count, or null if not available.
1815
+ * @returns A promise that resolves to the total items count,
1816
+ * or null if not available.
1813
1817
  */
1814
1818
  get totalItems() {
1815
1819
  if (this.#totalItems === void 0) this.totalItems = this.callbacks.counter?.(this.context, this.values);
@@ -1825,8 +1829,8 @@ var CustomCollectionHandler = class {
1825
1829
  }
1826
1830
  /**
1827
1831
  * Gets the first cursor for pagination.
1828
- * @returns {Promise<string | null>} A promise that resolves to the first cursor,
1829
- or null if not available.
1832
+ * @returns A promise that resolves to the first cursor,
1833
+ * or null if not available.
1830
1834
  */
1831
1835
  get firstCursor() {
1832
1836
  const cursor = this.callbacks.firstCursor?.(this.context, this.values);
@@ -2032,139 +2036,6 @@ function handleNodeInfoJrd(_request, context$1) {
2032
2036
  return Promise.resolve(response);
2033
2037
  }
2034
2038
 
2035
- //#endregion
2036
- //#region src/webfinger/handler.ts
2037
- const logger = getLogger([
2038
- "fedify",
2039
- "webfinger",
2040
- "server"
2041
- ]);
2042
- /**
2043
- * Handles a WebFinger request. You would not typically call this function
2044
- * directly, but instead use {@link Federation.fetch} method.
2045
- * @param request The WebFinger request to handle.
2046
- * @param parameters The parameters for handling the request.
2047
- * @returns The response to the request.
2048
- */
2049
- async function handleWebFinger(request, options) {
2050
- if (options.tracer == null) return await handleWebFingerInternal(request, options);
2051
- return await options.tracer.startActiveSpan("webfinger.handle", { kind: SpanKind.SERVER }, async (span) => {
2052
- try {
2053
- const response = await handleWebFingerInternal(request, options);
2054
- span.setStatus({ code: response.ok ? SpanStatusCode.UNSET : SpanStatusCode.ERROR });
2055
- return response;
2056
- } catch (error) {
2057
- span.setStatus({
2058
- code: SpanStatusCode.ERROR,
2059
- message: String(error)
2060
- });
2061
- throw error;
2062
- } finally {
2063
- span.end();
2064
- }
2065
- });
2066
- }
2067
- async function handleWebFingerInternal(request, { context: context$1, host, actorDispatcher, actorHandleMapper, actorAliasMapper, onNotFound, span, webFingerLinksDispatcher }) {
2068
- if (actorDispatcher == null) {
2069
- logger.error("Actor dispatcher is not set.");
2070
- return await onNotFound(request);
2071
- }
2072
- const resource = context$1.url.searchParams.get("resource");
2073
- if (resource == null) return new Response("Missing resource parameter.", { status: 400 });
2074
- span?.setAttribute("webfinger.resource", resource);
2075
- let resourceUrl;
2076
- try {
2077
- resourceUrl = new URL(resource);
2078
- } catch (e) {
2079
- if (e instanceof TypeError) return new Response("Invalid resource URL.", { status: 400 });
2080
- throw e;
2081
- }
2082
- span?.setAttribute("webfinger.resource.scheme", resourceUrl.protocol.replace(/:$/, ""));
2083
- async function mapUsernameToIdentifier(username) {
2084
- if (actorHandleMapper == null) {
2085
- logger.error("No actor handle mapper is set; use the WebFinger username {username} as the actor's internal identifier.", { username });
2086
- return username;
2087
- }
2088
- const identifier$1 = await actorHandleMapper(context$1, username);
2089
- if (identifier$1 == null) {
2090
- logger.error("Actor {username} not found.", { username });
2091
- return null;
2092
- }
2093
- return identifier$1;
2094
- }
2095
- let identifier = null;
2096
- const uriParsed = context$1.parseUri(resourceUrl);
2097
- if (uriParsed?.type != "actor") {
2098
- const match = /^acct:([^@]+)@([^@]+)$/.exec(resource);
2099
- if (match == null) {
2100
- const result = await actorAliasMapper?.(context$1, resourceUrl);
2101
- if (result == null) return await onNotFound(request);
2102
- if ("identifier" in result) identifier = result.identifier;
2103
- else identifier = await mapUsernameToIdentifier(result.username);
2104
- } else {
2105
- const portMatch = /:\d+$/.exec(match[2]);
2106
- const normalizedHost = portMatch == null ? domainToASCII(match[2].toLowerCase()) : domainToASCII(match[2].substring(0, portMatch.index).toLowerCase()) + portMatch[0];
2107
- if (normalizedHost != context$1.url.host && normalizedHost != host) return await onNotFound(request);
2108
- else {
2109
- identifier = await mapUsernameToIdentifier(match[1]);
2110
- resourceUrl = new URL(`acct:${match[1]}@${normalizedHost}`);
2111
- }
2112
- }
2113
- } else identifier = uriParsed.identifier;
2114
- if (identifier == null) return await onNotFound(request);
2115
- const actor = await actorDispatcher(context$1, identifier);
2116
- if (actor == null) {
2117
- logger.error("Actor {identifier} not found.", { identifier });
2118
- return await onNotFound(request);
2119
- }
2120
- const links = [{
2121
- rel: "self",
2122
- href: context$1.getActorUri(identifier).href,
2123
- type: "application/activity+json"
2124
- }];
2125
- for (const url of actor.urls) if (url instanceof Link && url.href != null) links.push({
2126
- rel: url.rel ?? "http://webfinger.net/rel/profile-page",
2127
- href: url.href.href,
2128
- type: url.mediaType == null ? void 0 : url.mediaType
2129
- });
2130
- else if (url instanceof URL) links.push({
2131
- rel: "http://webfinger.net/rel/profile-page",
2132
- href: url.href
2133
- });
2134
- for await (const image of actor.getIcons()) {
2135
- if (image.url?.href == null) continue;
2136
- const link = {
2137
- rel: "http://webfinger.net/rel/avatar",
2138
- href: image.url.href.toString()
2139
- };
2140
- if (image.mediaType != null) link.type = image.mediaType;
2141
- links.push(link);
2142
- }
2143
- if (webFingerLinksDispatcher != null) {
2144
- const customLinks = await webFingerLinksDispatcher(context$1, resourceUrl);
2145
- if (customLinks != null) for (const link of customLinks) links.push(link);
2146
- }
2147
- const aliases = [];
2148
- if (resourceUrl.protocol != "acct:" && actor.preferredUsername != null) {
2149
- aliases.push(`acct:${actor.preferredUsername}@${host ?? context$1.url.host}`);
2150
- if (host != null && host !== context$1.url.host) aliases.push(`acct:${actor.preferredUsername}@${context$1.url.host}`);
2151
- }
2152
- if (resourceUrl.href !== context$1.getActorUri(identifier).href) aliases.push(context$1.getActorUri(identifier).href);
2153
- if (resourceUrl.protocol === "acct:" && host != null && host !== context$1.url.host && !resourceUrl.href.endsWith(`@${host}`)) {
2154
- const username = resourceUrl.href.replace(/^acct:/, "").replace(/@.*$/, "");
2155
- aliases.push(`acct:${username}@${host}`);
2156
- }
2157
- const jrd = {
2158
- subject: resourceUrl.href,
2159
- aliases,
2160
- links
2161
- };
2162
- return new Response(JSON.stringify(jrd), { headers: {
2163
- "Content-Type": "application/jrd+json",
2164
- "Access-Control-Allow-Origin": "*"
2165
- } });
2166
- }
2167
-
2168
2039
  //#endregion
2169
2040
  //#region src/federation/retry.ts
2170
2041
  /**
@@ -2191,8 +2062,8 @@ function createExponentialBackoffPolicy(options = {}) {
2191
2062
  milliseconds *= 1 + Math.random();
2192
2063
  milliseconds = Math.round(milliseconds);
2193
2064
  }
2194
- const delay$1 = Temporal.Duration.from({ milliseconds });
2195
- return Temporal.Duration.compare(delay$1, maxDelay) > 0 ? maxDelay : delay$1;
2065
+ const delay = Temporal.Duration.from({ milliseconds });
2066
+ return Temporal.Duration.compare(delay, maxDelay) > 0 ? maxDelay : delay;
2196
2067
  };
2197
2068
  }
2198
2069
 
@@ -2244,7 +2115,7 @@ function sendActivity(options) {
2244
2115
  await sendActivityInternal({
2245
2116
  ...options,
2246
2117
  tracerProvider
2247
- });
2118
+ }, span);
2248
2119
  } catch (e) {
2249
2120
  span.setStatus({
2250
2121
  code: SpanStatusCode.ERROR,
@@ -2256,7 +2127,7 @@ function sendActivity(options) {
2256
2127
  }
2257
2128
  });
2258
2129
  }
2259
- async function sendActivityInternal({ activity, activityId, keys, inbox, headers, specDeterminer, tracerProvider }) {
2130
+ async function sendActivityInternal({ activity, activityId, keys, inbox, headers, specDeterminer, tracerProvider }, span) {
2260
2131
  const logger$1 = getLogger([
2261
2132
  "fedify",
2262
2133
  "federation",
@@ -2311,6 +2182,143 @@ async function sendActivityInternal({ activity, activityId, keys, inbox, headers
2311
2182
  });
2312
2183
  throw new Error(`Failed to send activity ${activityId} to ${inbox.href} (${response.status} ${response.statusText}):\n${error}`);
2313
2184
  }
2185
+ span.addEvent("activitypub.activity.sent", {
2186
+ "activitypub.activity.json": JSON.stringify(activity),
2187
+ "activitypub.inbox.url": inbox.href,
2188
+ "activitypub.activity.id": activityId ?? ""
2189
+ });
2190
+ }
2191
+
2192
+ //#endregion
2193
+ //#region src/federation/webfinger.ts
2194
+ const logger = getLogger([
2195
+ "fedify",
2196
+ "webfinger",
2197
+ "server"
2198
+ ]);
2199
+ /**
2200
+ * Handles a WebFinger request. You would not typically call this function
2201
+ * directly, but instead use {@link Federation.fetch} method.
2202
+ * @param request The WebFinger request to handle.
2203
+ * @param parameters The parameters for handling the request.
2204
+ * @returns The response to the request.
2205
+ */
2206
+ async function handleWebFinger(request, options) {
2207
+ if (options.tracer == null) return await handleWebFingerInternal(request, options);
2208
+ return await options.tracer.startActiveSpan("webfinger.handle", { kind: SpanKind.SERVER }, async (span) => {
2209
+ try {
2210
+ const response = await handleWebFingerInternal(request, options);
2211
+ span.setStatus({ code: response.ok ? SpanStatusCode.UNSET : SpanStatusCode.ERROR });
2212
+ return response;
2213
+ } catch (error) {
2214
+ span.setStatus({
2215
+ code: SpanStatusCode.ERROR,
2216
+ message: String(error)
2217
+ });
2218
+ throw error;
2219
+ } finally {
2220
+ span.end();
2221
+ }
2222
+ });
2223
+ }
2224
+ async function handleWebFingerInternal(request, { context: context$1, host, actorDispatcher, actorHandleMapper, actorAliasMapper, onNotFound, span, webFingerLinksDispatcher }) {
2225
+ if (actorDispatcher == null) {
2226
+ logger.error("Actor dispatcher is not set.");
2227
+ return await onNotFound(request);
2228
+ }
2229
+ const resource = context$1.url.searchParams.get("resource");
2230
+ if (resource == null) return new Response("Missing resource parameter.", { status: 400 });
2231
+ span?.setAttribute("webfinger.resource", resource);
2232
+ let resourceUrl;
2233
+ try {
2234
+ resourceUrl = new URL(resource);
2235
+ } catch (e) {
2236
+ if (e instanceof TypeError) return new Response("Invalid resource URL.", { status: 400 });
2237
+ throw e;
2238
+ }
2239
+ span?.setAttribute("webfinger.resource.scheme", resourceUrl.protocol.replace(/:$/, ""));
2240
+ async function mapUsernameToIdentifier(username) {
2241
+ if (actorHandleMapper == null) {
2242
+ logger.error("No actor handle mapper is set; use the WebFinger username {username} as the actor's internal identifier.", { username });
2243
+ return username;
2244
+ }
2245
+ const identifier$1 = await actorHandleMapper(context$1, username);
2246
+ if (identifier$1 == null) {
2247
+ logger.error("Actor {username} not found.", { username });
2248
+ return null;
2249
+ }
2250
+ return identifier$1;
2251
+ }
2252
+ let identifier = null;
2253
+ const uriParsed = context$1.parseUri(resourceUrl);
2254
+ if (uriParsed?.type != "actor") {
2255
+ const match = /^acct:([^@]+)@([^@]+)$/.exec(resource);
2256
+ if (match == null) {
2257
+ const result = await actorAliasMapper?.(context$1, resourceUrl);
2258
+ if (result == null) return await onNotFound(request);
2259
+ if ("identifier" in result) identifier = result.identifier;
2260
+ else identifier = await mapUsernameToIdentifier(result.username);
2261
+ } else {
2262
+ const portMatch = /:\d+$/.exec(match[2]);
2263
+ const normalizedHost = portMatch == null ? domainToASCII(match[2].toLowerCase()) : domainToASCII(match[2].substring(0, portMatch.index).toLowerCase()) + portMatch[0];
2264
+ if (normalizedHost != context$1.url.host && normalizedHost != host) return await onNotFound(request);
2265
+ else {
2266
+ identifier = await mapUsernameToIdentifier(match[1]);
2267
+ resourceUrl = new URL(`acct:${match[1]}@${normalizedHost}`);
2268
+ }
2269
+ }
2270
+ } else identifier = uriParsed.identifier;
2271
+ if (identifier == null) return await onNotFound(request);
2272
+ const actor = await actorDispatcher(context$1, identifier);
2273
+ if (actor == null) {
2274
+ logger.error("Actor {identifier} not found.", { identifier });
2275
+ return await onNotFound(request);
2276
+ }
2277
+ const links = [{
2278
+ rel: "self",
2279
+ href: context$1.getActorUri(identifier).href,
2280
+ type: "application/activity+json"
2281
+ }];
2282
+ for (const url of actor.urls) if (url instanceof Link && url.href != null) links.push({
2283
+ rel: url.rel ?? "http://webfinger.net/rel/profile-page",
2284
+ href: url.href.href,
2285
+ type: url.mediaType == null ? void 0 : url.mediaType
2286
+ });
2287
+ else if (url instanceof URL) links.push({
2288
+ rel: "http://webfinger.net/rel/profile-page",
2289
+ href: url.href
2290
+ });
2291
+ for await (const image of actor.getIcons()) {
2292
+ if (image.url?.href == null) continue;
2293
+ links.push({
2294
+ rel: "http://webfinger.net/rel/avatar",
2295
+ href: image.url.href.toString(),
2296
+ ...image.mediaType != null && { type: image.mediaType }
2297
+ });
2298
+ }
2299
+ if (webFingerLinksDispatcher != null) {
2300
+ const customLinks = await webFingerLinksDispatcher(context$1, resourceUrl);
2301
+ if (customLinks != null) for (const link of customLinks) links.push(link);
2302
+ }
2303
+ const aliases = [];
2304
+ if (resourceUrl.protocol != "acct:" && actor.preferredUsername != null) {
2305
+ aliases.push(`acct:${actor.preferredUsername}@${host ?? context$1.url.host}`);
2306
+ if (host != null && host !== context$1.url.host) aliases.push(`acct:${actor.preferredUsername}@${context$1.url.host}`);
2307
+ }
2308
+ if (resourceUrl.href !== context$1.getActorUri(identifier).href) aliases.push(context$1.getActorUri(identifier).href);
2309
+ if (resourceUrl.protocol === "acct:" && host != null && host !== context$1.url.host && !resourceUrl.href.endsWith(`@${host}`)) {
2310
+ const username = resourceUrl.href.replace(/^acct:/, "").replace(/@.*$/, "");
2311
+ aliases.push(`acct:${username}@${host}`);
2312
+ }
2313
+ const jrd = {
2314
+ subject: resourceUrl.href,
2315
+ aliases,
2316
+ links
2317
+ };
2318
+ return new Response(JSON.stringify(jrd), { headers: {
2319
+ "Content-Type": "application/jrd+json",
2320
+ "Access-Control-Allow-Origin": "*"
2321
+ } });
2314
2322
  }
2315
2323
 
2316
2324
  //#endregion
@@ -2350,7 +2358,6 @@ var FederationImpl = class extends FederationBuilderImpl {
2350
2358
  firstKnock;
2351
2359
  constructor(options) {
2352
2360
  super();
2353
- const logger$1 = getLogger(["fedify", "federation"]);
2354
2361
  this.kv = options.kv;
2355
2362
  this.kvPrefixes = {
2356
2363
  activityIdempotence: ["_fedify", "activityIdempotence"],
@@ -2398,8 +2405,9 @@ var FederationImpl = class extends FederationBuilderImpl {
2398
2405
  this.router.trailingSlashInsensitive = options.trailingSlashInsensitive ?? false;
2399
2406
  this._initializeRouter();
2400
2407
  if (options.allowPrivateAddress || options.userAgent != null) {
2401
- if (options.contextLoader != null) throw new TypeError("Cannot set contextLoader with allowPrivateAddress or userAgent options.");
2402
- else if (options.authenticatedDocumentLoaderFactory != null) throw new TypeError("Cannot set authenticatedDocumentLoaderFactory with allowPrivateAddress or userAgent options.");
2408
+ if (options.documentLoaderFactory != null) throw new TypeError("Cannot set documentLoaderFactory with allowPrivateAddress or userAgent options.");
2409
+ if (options.contextLoaderFactory != null) throw new TypeError("Cannot set contextLoaderFactory with allowPrivateAddress or userAgent options.");
2410
+ if (options.authenticatedDocumentLoaderFactory != null) throw new TypeError("Cannot set authenticatedDocumentLoaderFactory with allowPrivateAddress or userAgent options.");
2403
2411
  }
2404
2412
  const { allowPrivateAddress, userAgent } = options;
2405
2413
  this.allowPrivateAddress = allowPrivateAddress ?? false;
@@ -2413,11 +2421,7 @@ var FederationImpl = class extends FederationBuilderImpl {
2413
2421
  prefix: this.kvPrefixes.remoteDocument
2414
2422
  });
2415
2423
  });
2416
- if (options.contextLoader != null) {
2417
- if (options.contextLoaderFactory != null) throw new TypeError("Cannot set both contextLoader and contextLoaderFactory options at a time; use contextLoaderFactory only.");
2418
- this.contextLoaderFactory = () => options.contextLoader;
2419
- logger$1.warn("The contextLoader option is deprecated; use contextLoaderFactory option instead.");
2420
- } else this.contextLoaderFactory = options.contextLoaderFactory ?? this.documentLoaderFactory;
2424
+ this.contextLoaderFactory = options.contextLoaderFactory ?? this.documentLoaderFactory;
2421
2425
  this.authenticatedDocumentLoaderFactory = options.authenticatedDocumentLoaderFactory ?? ((identity) => getAuthenticatedDocumentLoader(identity, {
2422
2426
  allowPrivateAddress,
2423
2427
  userAgent,
@@ -2621,11 +2625,11 @@ var FederationImpl = class extends FederationBuilderImpl {
2621
2625
  });
2622
2626
  throw error;
2623
2627
  }
2624
- const delay$1 = this.outboxRetryPolicy({
2628
+ const delay = this.outboxRetryPolicy({
2625
2629
  elapsedTime: Temporal.Instant.from(message.started).until(Temporal.Now.instant()),
2626
2630
  attempts: message.attempt
2627
2631
  });
2628
- if (delay$1 != null) {
2632
+ if (delay != null) {
2629
2633
  logger$1.error("Failed to send activity {activityId} to {inbox} (attempt #{attempt}); retry...:\n{error}", {
2630
2634
  ...logData,
2631
2635
  error
@@ -2633,7 +2637,7 @@ var FederationImpl = class extends FederationBuilderImpl {
2633
2637
  await this.outboxQueue?.enqueue({
2634
2638
  ...message,
2635
2639
  attempt: message.attempt + 1
2636
- }, { delay: Temporal.Duration.compare(delay$1, { seconds: 0 }) < 0 ? Temporal.Duration.from({ seconds: 0 }) : delay$1 });
2640
+ }, { delay: Temporal.Duration.compare(delay, { seconds: 0 }) < 0 ? Temporal.Duration.from({ seconds: 0 }) : delay });
2637
2641
  } else logger$1.error("Failed to send activity {activityId} to {inbox} after {attempt} attempts; giving up:\n{error}", {
2638
2642
  ...logData,
2639
2643
  error
@@ -2720,11 +2724,11 @@ var FederationImpl = class extends FederationBuilderImpl {
2720
2724
  span$1.end();
2721
2725
  throw error;
2722
2726
  }
2723
- const delay$1 = this.inboxRetryPolicy({
2727
+ const delay = this.inboxRetryPolicy({
2724
2728
  elapsedTime: Temporal.Instant.from(message.started).until(Temporal.Now.instant()),
2725
2729
  attempts: message.attempt
2726
2730
  });
2727
- if (delay$1 != null) {
2731
+ if (delay != null) {
2728
2732
  logger$1.error("Failed to process the incoming activity {activityId} (attempt #{attempt}); retry...:\n{error}", {
2729
2733
  error,
2730
2734
  attempt: message.attempt,
@@ -2735,7 +2739,7 @@ var FederationImpl = class extends FederationBuilderImpl {
2735
2739
  await this.inboxQueue?.enqueue({
2736
2740
  ...message,
2737
2741
  attempt: message.attempt + 1
2738
- }, { delay: Temporal.Duration.compare(delay$1, { seconds: 0 }) < 0 ? Temporal.Duration.from({ seconds: 0 }) : delay$1 });
2742
+ }, { delay: Temporal.Duration.compare(delay, { seconds: 0 }) < 0 ? Temporal.Duration.from({ seconds: 0 }) : delay });
2739
2743
  } else logger$1.error("Failed to process the incoming activity {activityId} after {trial} attempts; giving up:\n{error}", {
2740
2744
  error,
2741
2745
  activityId: activity.id?.href,
@@ -4150,4 +4154,4 @@ function getRequestId(request) {
4150
4154
  }
4151
4155
 
4152
4156
  //#endregion
4153
- export { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer, Router$1 as Router, RouterError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, respondWithObject, respondWithObjectIfAcceptable };
4157
+ export { ContextImpl, FederationImpl, InboxContextImpl, KvSpecDeterminer, Router$1 as Router, RouterError, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, respondWithObject, respondWithObjectIfAcceptable };