@fedify/fedify 2.0.0-dev.1604 → 2.0.0-dev.161

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 (292) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +66 -30
  3. package/dist/{assert_rejects-7UF4R_Qs.js → assert_rejects-Ce45JcFg.js} +1 -1
  4. package/dist/{assert_is_error-B035L3om.js → assert_throws-BNXdRGWP.js} +31 -1
  5. package/dist/{builder-D9zidAqR.js → builder-CulJ6Oa9.js} +15 -8
  6. package/dist/chunk-DqRYRqnO.cjs +34 -0
  7. package/dist/client-94iWEfQa.d.cts +222 -0
  8. package/dist/{client-bgSdkFa2.d.ts → client-BivSNrEg.d.ts} +1 -1
  9. package/dist/{client-Bsj0vQPr.js → client-CgMTXmAD.js} +1 -1
  10. package/dist/compat/mod.cjs +10 -0
  11. package/dist/compat/mod.d.cts +7 -0
  12. package/dist/compat/mod.d.ts +6 -12
  13. package/dist/compat/mod.js +5 -5
  14. package/dist/compat/transformers.test.js +21 -19
  15. package/dist/compat-DmDDELst.cjs +4 -0
  16. package/dist/compat-nxUqe4Z-.js +4 -0
  17. package/dist/context-Bns6uTJq.js +109 -0
  18. package/dist/{context-CDSZdQHD.d.ts → context-CYZ2i00R.d.ts} +321 -129
  19. package/dist/context-D2MrtLch.d.cts +2447 -0
  20. package/dist/deno-DIwNGswC.js +117 -0
  21. package/dist/{testing-CdBSI4xF.js → dist-B5f6a8Tt.js} +90 -111
  22. package/dist/{authdocloader-CzpPQC01.js → docloader-D2992pGD.js} +17 -8
  23. package/dist/{esm-CXF1VoeR.js → esm-DGl7uK1r.js} +32 -17
  24. package/dist/federation/builder.test.js +9 -9
  25. package/dist/federation/collection.test.js +3 -6
  26. package/dist/federation/handler.test.js +113 -145
  27. package/dist/federation/idempotency.test.js +202 -0
  28. package/dist/federation/inbox.test.js +5 -6
  29. package/dist/federation/keycache.test.js +4 -5
  30. package/dist/federation/kv.test.js +59 -7
  31. package/dist/federation/middleware.test.js +306 -111
  32. package/dist/federation/mod.cjs +25 -0
  33. package/dist/federation/mod.d.cts +7 -0
  34. package/dist/federation/mod.d.ts +7 -13
  35. package/dist/federation/mod.js +11 -16
  36. package/dist/federation/mq.test.js +7 -8
  37. package/dist/federation/negotiation.test.js +25 -0
  38. package/dist/federation/retry.test.js +2 -4
  39. package/dist/federation/router.test.js +4 -6
  40. package/dist/federation/send.test.js +53 -13
  41. package/dist/{webfinger/handler.test.js → federation/webfinger.test.js} +25 -23
  42. package/dist/federation-B431K2gm.cjs +266 -0
  43. package/dist/{federation-CMX7WzeL.js → federation-BbZwNNWj.js} +31 -9
  44. package/dist/{http-B_pxY5of.js → http-3fEbsHa0.js} +374 -14
  45. package/dist/{http-CSYNybkH.js → http-BV9SKFK0.js} +3 -2
  46. package/dist/http-C06iL_Qv.cjs +1222 -0
  47. package/dist/http-ClB3pLcL.d.cts +253 -0
  48. package/dist/{http-DqSNLFNY.d.ts → http-DLBDPal9.d.ts} +2 -2
  49. package/dist/{inbox-DoJlwIE4.js → inbox-DCV2fS3F.js} +25 -7
  50. package/dist/{key-BOzqiGbl.js → key-Bdc11xlQ.js} +3 -2
  51. package/dist/{keycache--NYDYifd.js → keycache-DRxpZ5r9.js} +1 -1
  52. package/dist/{keys-MacD9GP6.js → keys-ZbcByPg9.js} +2 -1
  53. package/dist/{kv-C7sopW2E.d.ts → kv-CtOmTRNc.d.ts} +30 -1
  54. package/dist/kv-D8q9fLkA.d.cts +110 -0
  55. package/dist/{kv-CRZrzyXm.js → kv-QzKcOQgP.js} +22 -0
  56. package/dist/kv-cache-B4-ASVht.js +122 -0
  57. package/dist/kv-cache-BEeqyGER.js +107 -0
  58. package/dist/kv-cache-CQjPwWHu.cjs +134 -0
  59. package/dist/{ld-D9oTBLrs.js → ld-C7be04RF.js} +4 -2
  60. package/dist/middleware-9RlUwILK.js +12 -0
  61. package/dist/middleware-B_mOdzoC.cjs +4242 -0
  62. package/dist/{middleware-CgNm3XOJ.js → middleware-C3xnTI2Z.js} +230 -327
  63. package/dist/{middleware-C0w2M0tb.js → middleware-C4_a2DNI.js} +272 -271
  64. package/dist/middleware-C9iGBAP1.cjs +12 -0
  65. package/dist/middleware-CYlahvpt.js +26 -0
  66. package/dist/mod-BrS8tiad.d.cts +266 -0
  67. package/dist/mod-C81L6_lQ.d.cts +1 -0
  68. package/dist/mod-CJgbdSqb.d.ts +109 -0
  69. package/dist/mod-CNNTHyBC.d.cts +80 -0
  70. package/dist/mod-CS-MS7gZ.d.cts +62 -0
  71. package/dist/{mod-RI3-KvUI.d.ts → mod-D_cmv2il.d.ts} +4 -4
  72. package/dist/mod-DcPRcifg.d.cts +107 -0
  73. package/dist/mod-DqFSzJA0.d.ts +64 -0
  74. package/dist/{mod-Drmz72EK.d.ts → mod-jOa7W503.d.ts} +3 -3
  75. package/dist/mod.cjs +55 -0
  76. package/dist/mod.d.cts +11 -0
  77. package/dist/mod.d.ts +11 -17
  78. package/dist/mod.js +15 -21
  79. package/dist/negotiation-5NPJL6zp.js +71 -0
  80. package/dist/nodeinfo/client.test.js +5 -8
  81. package/dist/nodeinfo/handler.test.js +23 -22
  82. package/dist/nodeinfo/mod.cjs +10 -0
  83. package/dist/nodeinfo/mod.d.cts +3 -0
  84. package/dist/nodeinfo/mod.d.ts +2 -4
  85. package/dist/nodeinfo/mod.js +5 -6
  86. package/dist/nodeinfo/types.test.js +4 -7
  87. package/dist/nodeinfo-BlLsRSiT.js +4 -0
  88. package/dist/nodeinfo-DuMYTpbZ.cjs +4 -0
  89. package/dist/otel/exporter.test.js +899 -0
  90. package/dist/otel/mod.cjs +262 -0
  91. package/dist/otel/mod.d.cts +230 -0
  92. package/dist/otel/mod.d.ts +232 -0
  93. package/dist/otel/mod.js +261 -0
  94. package/dist/{owner-CQPnQVtf.d.ts → owner-BgI8C-VY.d.ts} +2 -3
  95. package/dist/{owner-gB-pDKA-.js → owner-Bs5Y5twE.js} +45 -8
  96. package/dist/owner-C-zfmVAD.d.cts +66 -0
  97. package/dist/{proof-VPikK_0V.js → proof-C-751PeN.js} +50 -14
  98. package/dist/{proof-CScVkkIT.js → proof-CFwktc0B.js} +3 -2
  99. package/dist/proof-CaA7ysDp.cjs +709 -0
  100. package/dist/router-D9eI0s4b.js +118 -0
  101. package/dist/{send-flZ7H10-.js → send-C288Vw8b.js} +9 -4
  102. package/dist/sig/http.test.js +9 -11
  103. package/dist/sig/key.test.js +7 -9
  104. package/dist/sig/ld.test.js +8 -10
  105. package/dist/sig/mod.cjs +26 -0
  106. package/dist/sig/mod.d.cts +4 -0
  107. package/dist/sig/mod.d.ts +3 -7
  108. package/dist/sig/mod.js +6 -10
  109. package/dist/sig/owner.test.js +31 -10
  110. package/dist/sig/proof.test.js +11 -12
  111. package/dist/sig-CwuONEzF.js +4 -0
  112. package/dist/sig-DeXX2xnj.cjs +4 -0
  113. package/dist/testing/mod.d.ts +179 -6918
  114. package/dist/testing/mod.js +4 -4
  115. package/dist/transformers-BjBg6Lag.cjs +116 -0
  116. package/dist/{transformers-Dna8Fg7k.js → transformers-N_ip_y4P.js} +5 -5
  117. package/dist/types-Q-qkJXBV.cjs +315 -0
  118. package/dist/{types-Vo0qKhN7.js → types-hKTi53FO.js} +4 -4
  119. package/dist/{runtime/authdocloader.test.js → utils/docloader.test.js} +11 -13
  120. package/dist/utils/kv-cache.test.js +211 -0
  121. package/dist/utils/mod.cjs +10 -0
  122. package/dist/utils/mod.d.cts +4 -0
  123. package/dist/utils/mod.d.ts +6 -0
  124. package/dist/utils/mod.js +9 -0
  125. package/dist/utils-Db0ZmjcD.cjs +4 -0
  126. package/dist/utils-Wranxuoe.js +4 -0
  127. package/package.json +69 -55
  128. package/dist/actor-BC3XtGTj.js +0 -37312
  129. package/dist/actor-C22bXuuC.d.ts +0 -130
  130. package/dist/actor-CmRlosMl.js +0 -146
  131. package/dist/assert_throws-53_pKeP3.js +0 -39
  132. package/dist/authdocloader-D-DICGXT.js +0 -52
  133. package/dist/compat-Bb5myD13.js +0 -4
  134. package/dist/denokv-jZ0Z2h0M.js +0 -57
  135. package/dist/docloader-CkASOfZ5.js +0 -4615
  136. package/dist/docloader-CxWcuWqQ.d.ts +0 -221
  137. package/dist/fixtures/activitypub.academy/users/brauca_darradiul.json +0 -83
  138. package/dist/fixtures/example.com/announce.json +0 -6
  139. package/dist/fixtures/example.com/collection.json +0 -19
  140. package/dist/fixtures/example.com/create.json +0 -6
  141. package/dist/fixtures/example.com/cross-origin-actor.json +0 -6
  142. package/dist/fixtures/example.com/hong-gildong.json +0 -11
  143. package/dist/fixtures/example.com/invite.json +0 -7
  144. package/dist/fixtures/example.com/key.json +0 -7
  145. package/dist/fixtures/example.com/key2.json +0 -6
  146. package/dist/fixtures/example.com/object.json +0 -6
  147. package/dist/fixtures/example.com/orderedcollectionpage.json +0 -24
  148. package/dist/fixtures/example.com/paged/a.json +0 -13
  149. package/dist/fixtures/example.com/paged/b.json +0 -16
  150. package/dist/fixtures/example.com/paged-collection.json +0 -6
  151. package/dist/fixtures/example.com/person.json +0 -22
  152. package/dist/fixtures/example.com/person2.json +0 -40
  153. package/dist/fixtures/example.com/test.json +0 -5
  154. package/dist/fixtures/example.com/users/handle.json +0 -16
  155. package/dist/fixtures/example.com/wrong-type.json +0 -3
  156. package/dist/fixtures/oeee.cafe/ap/users/3609fd4e-d51d-4db8-9f04-4189815864dd.json +0 -24
  157. package/dist/fixtures/remote.domain/users/bob.json +0 -20
  158. package/dist/fixtures/server.example/users/alice.json +0 -20
  159. package/dist/fixtures/w3id.org/identity/v1.json +0 -152
  160. package/dist/fixtures/w3id.org/security/data-integrity/v1.json +0 -74
  161. package/dist/fixtures/w3id.org/security/multikey/v1.json +0 -35
  162. package/dist/fixtures/w3id.org/security/v1.json +0 -50
  163. package/dist/fixtures/wizard.casa/users/hongminhee.json +0 -69
  164. package/dist/fixtures/www.w3.org/ns/activitystreams.json +0 -379
  165. package/dist/fixtures/www.w3.org/ns/did/v1.json +0 -58
  166. package/dist/key-Bif4eMj7.js +0 -260
  167. package/dist/key-BteSu1lX.js +0 -10
  168. package/dist/key-DWWqeyaq.js +0 -10
  169. package/dist/lookup-Cz9VSYxw.js +0 -131
  170. package/dist/lookup-DuzrBbTj.js +0 -322
  171. package/dist/middleware-CNfiKLIZ.js +0 -25
  172. package/dist/middleware-CnvU63kV.js +0 -17
  173. package/dist/mod-Cxt4Kpf6.d.ts +0 -291
  174. package/dist/mod-DBzN0aCM.d.ts +0 -115
  175. package/dist/mod-TFoH2Ql8.d.ts +0 -104
  176. package/dist/mod-g0xFzAP9.d.ts +0 -2
  177. package/dist/mq-CRGm1e_F.d.ts +0 -143
  178. package/dist/nodeinfo-CyEbLjHs.js +0 -4
  179. package/dist/runtime/docloader.test.js +0 -522
  180. package/dist/runtime/key.test.js +0 -103
  181. package/dist/runtime/langstr.test.js +0 -39
  182. package/dist/runtime/mod.d.ts +0 -8
  183. package/dist/runtime/mod.js +0 -13
  184. package/dist/runtime/multibase/multibase.test.js +0 -358
  185. package/dist/runtime/url.test.d.ts +0 -3
  186. package/dist/runtime/url.test.js +0 -45
  187. package/dist/runtime-BSkOVUWM.js +0 -4
  188. package/dist/sig-BXJO--F9.js +0 -4
  189. package/dist/src/vocab/accept.yaml +0 -15
  190. package/dist/src/vocab/activity.yaml +0 -98
  191. package/dist/src/vocab/add.yaml +0 -16
  192. package/dist/src/vocab/announce.yaml +0 -30
  193. package/dist/src/vocab/application.yaml +0 -324
  194. package/dist/src/vocab/arrive.yaml +0 -15
  195. package/dist/src/vocab/article.yaml +0 -46
  196. package/dist/src/vocab/audio.yaml +0 -11
  197. package/dist/src/vocab/block.yaml +0 -16
  198. package/dist/src/vocab/chatmessage.yaml +0 -50
  199. package/dist/src/vocab/collection.yaml +0 -154
  200. package/dist/src/vocab/collectionpage.yaml +0 -55
  201. package/dist/src/vocab/create.yaml +0 -28
  202. package/dist/src/vocab/dataintegrityproof.yaml +0 -56
  203. package/dist/src/vocab/delete.yaml +0 -27
  204. package/dist/src/vocab/didservice.yaml +0 -22
  205. package/dist/src/vocab/dislike.yaml +0 -14
  206. package/dist/src/vocab/document.yaml +0 -31
  207. package/dist/src/vocab/emoji.yaml +0 -12
  208. package/dist/src/vocab/emojireact.yaml +0 -17
  209. package/dist/src/vocab/endpoints.yaml +0 -85
  210. package/dist/src/vocab/event.yaml +0 -11
  211. package/dist/src/vocab/export.yaml +0 -9
  212. package/dist/src/vocab/flag.yaml +0 -15
  213. package/dist/src/vocab/follow.yaml +0 -19
  214. package/dist/src/vocab/group.yaml +0 -324
  215. package/dist/src/vocab/hashtag.yaml +0 -14
  216. package/dist/src/vocab/ignore.yaml +0 -14
  217. package/dist/src/vocab/image.yaml +0 -9
  218. package/dist/src/vocab/intransitiveactivity.yaml +0 -15
  219. package/dist/src/vocab/invite.yaml +0 -14
  220. package/dist/src/vocab/join.yaml +0 -14
  221. package/dist/src/vocab/key.yaml +0 -28
  222. package/dist/src/vocab/leave.yaml +0 -14
  223. package/dist/src/vocab/like.yaml +0 -16
  224. package/dist/src/vocab/link.yaml +0 -101
  225. package/dist/src/vocab/listen.yaml +0 -12
  226. package/dist/src/vocab/mention.yaml +0 -9
  227. package/dist/src/vocab/move.yaml +0 -15
  228. package/dist/src/vocab/multikey.yaml +0 -36
  229. package/dist/src/vocab/note.yaml +0 -48
  230. package/dist/src/vocab/object.yaml +0 -404
  231. package/dist/src/vocab/offer.yaml +0 -15
  232. package/dist/src/vocab/orderedcollection.yaml +0 -39
  233. package/dist/src/vocab/orderedcollectionpage.yaml +0 -50
  234. package/dist/src/vocab/organization.yaml +0 -324
  235. package/dist/src/vocab/page.yaml +0 -11
  236. package/dist/src/vocab/person.yaml +0 -324
  237. package/dist/src/vocab/place.yaml +0 -75
  238. package/dist/src/vocab/profile.yaml +0 -26
  239. package/dist/src/vocab/propertyvalue.yaml +0 -32
  240. package/dist/src/vocab/question.yaml +0 -103
  241. package/dist/src/vocab/read.yaml +0 -13
  242. package/dist/src/vocab/reject.yaml +0 -14
  243. package/dist/src/vocab/relationship.yaml +0 -52
  244. package/dist/src/vocab/remove.yaml +0 -14
  245. package/dist/src/vocab/service.yaml +0 -324
  246. package/dist/src/vocab/source.yaml +0 -26
  247. package/dist/src/vocab/tentativeaccept.yaml +0 -14
  248. package/dist/src/vocab/tentativereject.yaml +0 -14
  249. package/dist/src/vocab/tombstone.yaml +0 -24
  250. package/dist/src/vocab/travel.yaml +0 -16
  251. package/dist/src/vocab/undo.yaml +0 -26
  252. package/dist/src/vocab/update.yaml +0 -58
  253. package/dist/src/vocab/video.yaml +0 -11
  254. package/dist/src/vocab/view.yaml +0 -13
  255. package/dist/testing/docloader.test.js +0 -24
  256. package/dist/type-CAteiET0.js +0 -42007
  257. package/dist/vocab/actor.test.d.ts +0 -3
  258. package/dist/vocab/actor.test.js +0 -5965
  259. package/dist/vocab/lookup.test.d.ts +0 -3
  260. package/dist/vocab/lookup.test.js +0 -206
  261. package/dist/vocab/mod.d.ts +0 -8
  262. package/dist/vocab/mod.js +0 -10
  263. package/dist/vocab/schema.yaml +0 -247
  264. package/dist/vocab/type.test.d.ts +0 -3
  265. package/dist/vocab/type.test.js +0 -25
  266. package/dist/vocab/vocab.test.d.ts +0 -3
  267. package/dist/vocab/vocab.test.js +0 -3363
  268. package/dist/vocab-89qErSc9.js +0 -246
  269. package/dist/vocab-SOE1ifCr.d.ts +0 -14634
  270. package/dist/webfinger/handler.test.d.ts +0 -3
  271. package/dist/webfinger/lookup.test.d.ts +0 -3
  272. package/dist/webfinger/lookup.test.js +0 -195
  273. package/dist/webfinger/mod.d.ts +0 -6
  274. package/dist/webfinger/mod.js +0 -9
  275. package/dist/webfinger-C3GIyXIg.js +0 -4
  276. package/dist/x/cfworkers.d.ts +0 -61
  277. package/dist/x/cfworkers.js +0 -98
  278. package/dist/x/cfworkers.test.d.ts +0 -3
  279. package/dist/x/cfworkers.test.js +0 -179
  280. package/dist/x/hono.d.ts +0 -56
  281. package/dist/x/hono.js +0 -60
  282. package/dist/x/sveltekit.d.ts +0 -48
  283. package/dist/x/sveltekit.js +0 -68
  284. /package/dist/{runtime/authdocloader.test.d.ts → federation/idempotency.test.d.ts} +0 -0
  285. /package/dist/{runtime/docloader.test.d.ts → federation/negotiation.test.d.ts} +0 -0
  286. /package/dist/{runtime/key.test.d.ts → federation/webfinger.test.d.ts} +0 -0
  287. /package/dist/{mod-1pDWKvUL.d.ts → mod-1E3W847c.d.ts} +0 -0
  288. /package/dist/{runtime/langstr.test.d.ts → otel/exporter.test.d.ts} +0 -0
  289. /package/dist/{retry-CfF8Gn4d.js → retry-D4GJ670a.js} +0 -0
  290. /package/dist/{types-BSuWJsOm.js → types-BEdCLHqP.js} +0 -0
  291. /package/dist/{testing → utils}/docloader.test.d.ts +0 -0
  292. /package/dist/{runtime/multibase/multibase.test.d.ts → utils/kv-cache.test.d.ts} +0 -0
@@ -3,8 +3,8 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import "../type-CAteiET0.js";
7
- import "../lookup-DuzrBbTj.js";
8
- import { createInboxContext, createRequestContext, test, testDefinitions } from "../testing-CdBSI4xF.js";
6
+ import { testDefinitions } from "../dist-B5f6a8Tt.js";
7
+ import "../router-D9eI0s4b.js";
8
+ import { createInboxContext, createRequestContext } from "../context-Bns6uTJq.js";
9
9
 
10
- export { createInboxContext, createRequestContext, test, testDefinitions };
10
+ export { createInboxContext, createRequestContext, testDefinitions };
@@ -0,0 +1,116 @@
1
+
2
+ const { Temporal } = require("@js-temporal/polyfill");
3
+ const { URLPattern } = require("urlpattern-polyfill");
4
+
5
+ const require_chunk = require('./chunk-DqRYRqnO.cjs');
6
+ const __logtape_logtape = require_chunk.__toESM(require("@logtape/logtape"));
7
+
8
+ //#region src/compat/transformers.ts
9
+ const logger = (0, __logtape_logtape.getLogger)([
10
+ "fedify",
11
+ "compat",
12
+ "transformers"
13
+ ]);
14
+ /**
15
+ * An activity transformer that assigns a new random ID to an activity if it
16
+ * does not already have one. This is useful for ensuring that activities
17
+ * have an ID before they are sent to other servers.
18
+ *
19
+ * The generated ID is an origin URI with a fragment which contains an activity
20
+ * type name with a random UUID:
21
+ *
22
+ * ```
23
+ * https://example.com/#Follow/12345678-1234-5678-1234-567812345678
24
+ * ```
25
+ *
26
+ * @template TContextData The type of the context data.
27
+ * @param activity The activity to assign an ID to.
28
+ * @param context The context of the activity.
29
+ * @return The activity with an ID assigned.
30
+ * @since 1.4.0
31
+ */
32
+ function autoIdAssigner(activity, context) {
33
+ if (activity.id != null) return activity;
34
+ const id = new URL(`/#${activity.constructor.name}/${crypto.randomUUID()}`, context.origin);
35
+ logger.warn("As the activity to send does not have an id, a new id {id} has been generated for it. However, it is recommended to explicitly set the id for the activity.", { id: id.href });
36
+ return activity.clone({ id });
37
+ }
38
+ /**
39
+ * An activity transformer that dehydrates the actor property of an activity
40
+ * so that it only contains the actor's URI. For example, suppose we have an
41
+ * activity like this:
42
+ *
43
+ * ```typescript
44
+ * import { Follow, Person } from "@fedify/vocab";
45
+ * const input = new Follow({
46
+ * id: new URL("http://example.com/activities/1"),
47
+ * actor: new Person({
48
+ * id: new URL("http://example.com/actors/1"),
49
+ * name: "Alice",
50
+ * preferredUsername: "alice",
51
+ * }),
52
+ * object: new Person({
53
+ * id: new URL("http://example.com/actors/2"),
54
+ * name: "Bob",
55
+ * preferredUsername: "bob",
56
+ * }),
57
+ * });
58
+ * ```
59
+ *
60
+ * The result of applying this transformer would be:
61
+ *
62
+ * ```typescript
63
+ * import { Follow, Person } from "@fedify/vocab";
64
+ * const output = new Follow({
65
+ * id: new URL("http://example.com/activities/1"),
66
+ * actor: new URL("http://example.com/actors/1"),
67
+ * object: new Person({
68
+ * id: new URL("http://example.com/actors/2"),
69
+ * name: "Bob",
70
+ * preferredUsername: "bob",
71
+ * }),
72
+ * });
73
+ * ```
74
+ *
75
+ * As some ActivityPub implementations like Threads fail to deal with inlined
76
+ * actor objects, this transformer can be used to work around this issue.
77
+ * @template TContextData The type of the context data.
78
+ * @param activity The activity to dehydrate the actor property of.
79
+ * @param context The context of the activity.
80
+ * @returns The dehydrated activity.
81
+ * @since 1.4.0
82
+ */
83
+ function actorDehydrator(activity, _context) {
84
+ if (activity.actorIds.length < 1) return activity;
85
+ return activity.clone({ actors: activity.actorIds });
86
+ }
87
+ /**
88
+ * Gets the default activity transformers that are applied to all outgoing
89
+ * activities.
90
+ * @template TContextData The type of the context data.
91
+ * @returns The default activity transformers.
92
+ * @since 1.4.0
93
+ */
94
+ function getDefaultActivityTransformers() {
95
+ return [autoIdAssigner, actorDehydrator];
96
+ }
97
+
98
+ //#endregion
99
+ Object.defineProperty(exports, 'actorDehydrator', {
100
+ enumerable: true,
101
+ get: function () {
102
+ return actorDehydrator;
103
+ }
104
+ });
105
+ Object.defineProperty(exports, 'autoIdAssigner', {
106
+ enumerable: true,
107
+ get: function () {
108
+ return autoIdAssigner;
109
+ }
110
+ });
111
+ Object.defineProperty(exports, 'getDefaultActivityTransformers', {
112
+ enumerable: true,
113
+ get: function () {
114
+ return getDefaultActivityTransformers;
115
+ }
116
+ });
@@ -1,7 +1,7 @@
1
1
 
2
- import { Temporal } from "@js-temporal/polyfill";
3
- import { URLPattern } from "urlpattern-polyfill";
4
-
2
+ import { Temporal } from "@js-temporal/polyfill";
3
+ import { URLPattern } from "urlpattern-polyfill";
4
+
5
5
  import { getLogger } from "@logtape/logtape";
6
6
 
7
7
  //#region src/compat/transformers.ts
@@ -40,7 +40,7 @@ function autoIdAssigner(activity, context) {
40
40
  * activity like this:
41
41
  *
42
42
  * ```typescript
43
- * import { Follow, Person } from "@fedify/fedify/vocab";
43
+ * import { Follow, Person } from "@fedify/vocab";
44
44
  * const input = new Follow({
45
45
  * id: new URL("http://example.com/activities/1"),
46
46
  * actor: new Person({
@@ -59,7 +59,7 @@ function autoIdAssigner(activity, context) {
59
59
  * The result of applying this transformer would be:
60
60
  *
61
61
  * ```typescript
62
- * import { Follow, Person } from "@fedify/fedify/vocab";
62
+ * import { Follow, Person } from "@fedify/vocab";
63
63
  * const output = new Follow({
64
64
  * id: new URL("http://example.com/activities/1"),
65
65
  * actor: new URL("http://example.com/actors/1"),
@@ -0,0 +1,315 @@
1
+
2
+ const { Temporal } = require("@js-temporal/polyfill");
3
+ const { URLPattern } = require("urlpattern-polyfill");
4
+
5
+ const require_chunk = require('./chunk-DqRYRqnO.cjs');
6
+ const __logtape_logtape = require_chunk.__toESM(require("@logtape/logtape"));
7
+ const __fedify_vocab_runtime = require_chunk.__toESM(require("@fedify/vocab-runtime"));
8
+
9
+ //#region src/nodeinfo/client.ts
10
+ const logger = (0, __logtape_logtape.getLogger)([
11
+ "fedify",
12
+ "nodeinfo",
13
+ "client"
14
+ ]);
15
+ async function getNodeInfo(url, options = {}) {
16
+ try {
17
+ let nodeInfoUrl = url;
18
+ if (!options.direct) {
19
+ const wellKnownUrl = new URL("/.well-known/nodeinfo", url);
20
+ const wellKnownResponse = await fetch(wellKnownUrl, { headers: {
21
+ Accept: "application/json",
22
+ "User-Agent": typeof options.userAgent === "string" ? options.userAgent : (0, __fedify_vocab_runtime.getUserAgent)(options.userAgent)
23
+ } });
24
+ if (!wellKnownResponse.ok) {
25
+ logger.error("Failed to fetch {url}: {status} {statusText}", {
26
+ url: wellKnownUrl.href,
27
+ status: wellKnownResponse.status,
28
+ statusText: wellKnownResponse.statusText
29
+ });
30
+ return void 0;
31
+ }
32
+ const wellKnownRd = await wellKnownResponse.json();
33
+ const link = wellKnownRd?.links?.find((link$1) => link$1 != null && "rel" in link$1 && (link$1.rel === "http://nodeinfo.diaspora.software/ns/schema/2.0" || link$1.rel === "http://nodeinfo.diaspora.software/ns/schema/2.1") && "href" in link$1 && link$1.href != null);
34
+ if (link == null || link.href == null) {
35
+ logger.error("Failed to find a NodeInfo document link from {url}: {resourceDescriptor}", {
36
+ url: wellKnownUrl.href,
37
+ resourceDescriptor: wellKnownRd
38
+ });
39
+ return void 0;
40
+ }
41
+ nodeInfoUrl = link.href;
42
+ }
43
+ const response = await fetch(nodeInfoUrl, { headers: {
44
+ Accept: "application/json",
45
+ "User-Agent": typeof options.userAgent === "string" ? options.userAgent : (0, __fedify_vocab_runtime.getUserAgent)(options.userAgent)
46
+ } });
47
+ if (!response.ok) {
48
+ logger.error("Failed to fetch NodeInfo document from {url}: {status} {statusText}", {
49
+ url: nodeInfoUrl.toString(),
50
+ status: response.status,
51
+ statusText: response.statusText
52
+ });
53
+ return void 0;
54
+ }
55
+ const data = await response.json();
56
+ if (options.parse === "none") return data;
57
+ return parseNodeInfo(data, { tryBestEffort: options.parse === "best-effort" }) ?? void 0;
58
+ } catch (error) {
59
+ logger.error("Failed to fetch NodeInfo document from {url}: {error}", {
60
+ url: url.toString(),
61
+ error
62
+ });
63
+ return void 0;
64
+ }
65
+ }
66
+ /**
67
+ * Parses a NodeInfo document.
68
+ * @param data A JSON value that complies with the NodeInfo schema.
69
+ * @param options Options for parsing the NodeInfo document.
70
+ * @returns The parsed NodeInfo document if it is valid. Otherwise, `null`
71
+ * is returned.
72
+ * @since 1.2.0
73
+ */
74
+ function parseNodeInfo(data, options = {}) {
75
+ if (typeof data !== "object" || data == null || !("software" in data)) return null;
76
+ const software = parseSoftware(data.software, options);
77
+ if (software == null) return null;
78
+ let protocols = [];
79
+ if ("protocols" in data && Array.isArray(data.protocols)) {
80
+ const ps = data.protocols.map(parseProtocol);
81
+ protocols = ps.filter((p) => p != null);
82
+ if (ps.length != protocols.length && !options.tryBestEffort) return null;
83
+ } else if (!options.tryBestEffort) return null;
84
+ let services;
85
+ if ("services" in data) {
86
+ if (typeof data.services === "object" && data.services != null) {
87
+ const ss = parseServices(data.services, options);
88
+ if (ss == null) {
89
+ if (!options.tryBestEffort) return null;
90
+ } else services = ss;
91
+ } else if (!options.tryBestEffort) return null;
92
+ }
93
+ let openRegistrations;
94
+ if ("openRegistrations" in data) {
95
+ if (typeof data.openRegistrations === "boolean") openRegistrations = data.openRegistrations;
96
+ else if (!options.tryBestEffort) return null;
97
+ }
98
+ let usage = {
99
+ users: {},
100
+ localPosts: 0,
101
+ localComments: 0
102
+ };
103
+ if ("usage" in data) {
104
+ const u = parseUsage(data.usage, options);
105
+ if (u == null) {
106
+ if (!options.tryBestEffort) return null;
107
+ } else usage = u;
108
+ }
109
+ let metadata;
110
+ if ("metadata" in data) {
111
+ if (typeof data.metadata === "object" && data.metadata != null) metadata = Object.fromEntries(Object.entries(data.metadata));
112
+ else if (!options.tryBestEffort) return null;
113
+ }
114
+ const result = {
115
+ software,
116
+ protocols,
117
+ usage
118
+ };
119
+ if (services != null) result.services = services;
120
+ if (openRegistrations != null) result.openRegistrations = openRegistrations;
121
+ if (metadata != null) result.metadata = metadata;
122
+ return result;
123
+ }
124
+ function parseSoftware(data, options = {}) {
125
+ if (typeof data !== "object" || data == null) {
126
+ if (!options.tryBestEffort) data = {};
127
+ return null;
128
+ }
129
+ let name;
130
+ if ("name" in data && typeof data.name === "string" && data.name.match(/^\s*[A-Za-z0-9-]+\s*$/)) {
131
+ if (!data.name.match(/^[a-z0-9-]+$/) && !options.tryBestEffort) return null;
132
+ name = data.name.trim().toLowerCase();
133
+ } else return null;
134
+ let version;
135
+ if ("version" in data) version = String(data.version);
136
+ else {
137
+ if (!options.tryBestEffort) return null;
138
+ version = "0.0.0";
139
+ }
140
+ let repository;
141
+ if ("repository" in data) {
142
+ if (typeof data.repository === "string") try {
143
+ repository = new URL(data.repository);
144
+ } catch {
145
+ if (!options.tryBestEffort) return null;
146
+ }
147
+ else if (!options.tryBestEffort) return null;
148
+ }
149
+ let homepage;
150
+ if ("homepage" in data) {
151
+ if (typeof data.homepage === "string") try {
152
+ homepage = new URL(data.homepage);
153
+ } catch {
154
+ if (!options.tryBestEffort) return null;
155
+ }
156
+ else if (!options.tryBestEffort) return null;
157
+ }
158
+ const result = {
159
+ name,
160
+ version
161
+ };
162
+ if (repository != null) result.repository = repository;
163
+ if (homepage != null) result.homepage = homepage;
164
+ return result;
165
+ }
166
+ function parseProtocol(data) {
167
+ if (data === "activitypub" || data === "buddycloud" || data === "dfrn" || data === "diaspora" || data === "libertree" || data === "ostatus" || data === "pumpio" || data === "tent" || data === "xmpp" || data === "zot") return data;
168
+ return null;
169
+ }
170
+ function parseServices(data, options = {}) {
171
+ if (!(typeof data === "object") || data == null) {
172
+ if (options.tryBestEffort) return {};
173
+ return null;
174
+ }
175
+ let inbound;
176
+ if ("inbound" in data && Array.isArray(data.inbound)) {
177
+ const is = data.inbound.map(parseInboundService);
178
+ inbound = is.filter((i) => i != null);
179
+ if (is.length > inbound.length && !options.tryBestEffort) return null;
180
+ }
181
+ let outbound;
182
+ if ("outbound" in data && Array.isArray(data.outbound)) {
183
+ const os = data.outbound.map(parseOutboundService);
184
+ outbound = os.filter((o) => o != null);
185
+ if (os.length > outbound.length && !options.tryBestEffort) return null;
186
+ }
187
+ const result = {};
188
+ if (inbound != null) result.inbound = inbound;
189
+ if (outbound != null) result.outbound = outbound;
190
+ return result;
191
+ }
192
+ function parseInboundService(data) {
193
+ if (data === "atom1.0" || data === "gnusocial" || data === "imap" || data === "pnut" || data === "pop3" || data === "pumpio" || data === "rss2.0" || data === "twitter") return data;
194
+ return null;
195
+ }
196
+ function parseOutboundService(data) {
197
+ if (data === "atom1.0" || data === "blogger" || data === "buddycloud" || data === "diaspora" || data === "dreamwidth" || data === "drupal" || data === "facebook" || data === "friendica" || data === "gnusocial" || data === "google" || data === "insanejournal" || data === "libertree" || data === "linkedin" || data === "livejournal" || data === "mediagoblin" || data === "myspace" || data === "pinterest" || data === "pnut" || data === "posterous" || data === "pumpio" || data === "redmatrix" || data === "rss2.0" || data === "smtp" || data === "tent" || data === "tumblr" || data === "twitter" || data === "wordpress" || data === "xmpp") return data;
198
+ return null;
199
+ }
200
+ function parseUsage(data, options = {}) {
201
+ if (typeof data !== "object" || data == null) return null;
202
+ const users = {};
203
+ if ("users" in data && typeof data.users === "object" && data.users != null) {
204
+ if ("total" in data.users) if (typeof data.users.total === "number") users.total = data.users.total;
205
+ else {
206
+ if (!options.tryBestEffort) return null;
207
+ if (typeof data.users.total === "string") {
208
+ const n = parseInt(data.users.total);
209
+ if (!isNaN(n)) users.total = n;
210
+ }
211
+ }
212
+ if ("activeHalfyear" in data.users) if (typeof data.users.activeHalfyear === "number") users.activeHalfyear = data.users.activeHalfyear;
213
+ else {
214
+ if (!options.tryBestEffort) return null;
215
+ if (typeof data.users.activeHalfyear === "string") {
216
+ const n = parseInt(data.users.activeHalfyear);
217
+ if (!isNaN(n)) users.activeHalfyear = n;
218
+ }
219
+ }
220
+ if ("activeMonth" in data.users) if (typeof data.users.activeMonth === "number") users.activeMonth = data.users.activeMonth;
221
+ else {
222
+ if (!options.tryBestEffort) return null;
223
+ if (typeof data.users.activeMonth === "string") {
224
+ const n = parseInt(data.users.activeMonth);
225
+ if (!isNaN(n)) users.activeMonth = n;
226
+ }
227
+ }
228
+ } else if (!options.tryBestEffort) return null;
229
+ let localPosts = 0;
230
+ if ("localPosts" in data) if (typeof data.localPosts === "number") localPosts = data.localPosts;
231
+ else {
232
+ if (!options.tryBestEffort) return null;
233
+ if (typeof data.localPosts === "string") {
234
+ const n = parseInt(data.localPosts);
235
+ if (!isNaN(n)) localPosts = n;
236
+ }
237
+ }
238
+ let localComments = 0;
239
+ if ("localComments" in data) if (typeof data.localComments === "number") localComments = data.localComments;
240
+ else {
241
+ if (!options.tryBestEffort) return null;
242
+ if (typeof data.localComments === "string") {
243
+ const n = parseInt(data.localComments);
244
+ if (!isNaN(n)) localComments = n;
245
+ }
246
+ }
247
+ return {
248
+ users,
249
+ localPosts,
250
+ localComments
251
+ };
252
+ }
253
+
254
+ //#endregion
255
+ //#region src/nodeinfo/types.ts
256
+ /**
257
+ * Converts a {@link NodeInfo} object to a JSON value.
258
+ * @param nodeInfo The {@link NodeInfo} object to convert.
259
+ * @returns The JSON value that complies with the NodeInfo schema.
260
+ * @throws {TypeError} If the {@link NodeInfo} object is invalid.
261
+ */
262
+ function nodeInfoToJson(nodeInfo) {
263
+ if (!nodeInfo.software.name.match(/^[a-z0-9-]+$/)) throw new TypeError("Invalid software name.");
264
+ if (nodeInfo.protocols.length < 1) throw new TypeError("At least one protocol must be supported.");
265
+ if (nodeInfo.usage.users.total != null && (nodeInfo.usage.users.total < 0 || !Number.isInteger(nodeInfo.usage.users.total))) throw new TypeError("Invalid total users.");
266
+ if (nodeInfo.usage.users.activeHalfyear != null && (nodeInfo.usage.users.activeHalfyear < 0 || !Number.isInteger(nodeInfo.usage.users.activeHalfyear))) throw new TypeError("Invalid active halfyear users.");
267
+ if (nodeInfo.usage.users.activeMonth != null && (nodeInfo.usage.users.activeMonth < 0 || !Number.isInteger(nodeInfo.usage.users.activeMonth))) throw new TypeError("Invalid active month users.");
268
+ if (nodeInfo.usage.localPosts < 0 || !Number.isInteger(nodeInfo.usage.localPosts)) throw new TypeError("Invalid local posts.");
269
+ if (nodeInfo.usage.localComments < 0 || !Number.isInteger(nodeInfo.usage.localComments)) throw new TypeError("Invalid local comments.");
270
+ return {
271
+ "$schema": "http://nodeinfo.diaspora.software/ns/schema/2.1#",
272
+ version: "2.1",
273
+ software: {
274
+ name: nodeInfo.software.name,
275
+ version: nodeInfo.software.version,
276
+ repository: nodeInfo.software.repository?.href,
277
+ homepage: nodeInfo.software.homepage?.href
278
+ },
279
+ protocols: nodeInfo.protocols,
280
+ services: nodeInfo.services == null ? {
281
+ inbound: [],
282
+ outbound: []
283
+ } : {
284
+ inbound: nodeInfo.services.inbound ?? [],
285
+ outbound: nodeInfo.services.outbound ?? []
286
+ },
287
+ openRegistrations: nodeInfo.openRegistrations ?? false,
288
+ usage: {
289
+ users: nodeInfo.usage.users,
290
+ localPosts: nodeInfo.usage.localPosts,
291
+ localComments: nodeInfo.usage.localComments
292
+ },
293
+ metadata: nodeInfo.metadata ?? {}
294
+ };
295
+ }
296
+
297
+ //#endregion
298
+ Object.defineProperty(exports, 'getNodeInfo', {
299
+ enumerable: true,
300
+ get: function () {
301
+ return getNodeInfo;
302
+ }
303
+ });
304
+ Object.defineProperty(exports, 'nodeInfoToJson', {
305
+ enumerable: true,
306
+ get: function () {
307
+ return nodeInfoToJson;
308
+ }
309
+ });
310
+ Object.defineProperty(exports, 'parseNodeInfo', {
311
+ enumerable: true,
312
+ get: function () {
313
+ return parseNodeInfo;
314
+ }
315
+ });
@@ -1,9 +1,9 @@
1
1
 
2
- import { Temporal } from "@js-temporal/polyfill";
3
- import { URLPattern } from "urlpattern-polyfill";
4
-
5
- import { getUserAgent } from "./docloader-CkASOfZ5.js";
2
+ import { Temporal } from "@js-temporal/polyfill";
3
+ import { URLPattern } from "urlpattern-polyfill";
4
+
6
5
  import { getLogger } from "@logtape/logtape";
6
+ import { getUserAgent } from "@fedify/vocab-runtime";
7
7
 
8
8
  //#region src/nodeinfo/client.ts
9
9
  const logger = getLogger([
@@ -3,25 +3,23 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { UrlError } from "../type-CAteiET0.js";
6
+ import { mockDocumentLoader, test } from "../dist-B5f6a8Tt.js";
7
7
  import { assertEquals } from "../assert_equals-DSbWqCm3.js";
8
8
  import "../assert-MZs1qjMx.js";
9
9
  import "../assert_instance_of-DHz7EHNU.js";
10
- import "../lookup-DuzrBbTj.js";
11
- import "../actor-CmRlosMl.js";
12
- import "../key-BOzqiGbl.js";
13
- import { verifyRequest } from "../http-CSYNybkH.js";
14
- import { getAuthenticatedDocumentLoader } from "../authdocloader-CzpPQC01.js";
15
- import { mockDocumentLoader, test } from "../testing-CdBSI4xF.js";
10
+ import "../deno-DIwNGswC.js";
11
+ import "../key-Bdc11xlQ.js";
12
+ import { verifyRequest } from "../http-BV9SKFK0.js";
13
+ import { getAuthenticatedDocumentLoader } from "../docloader-D2992pGD.js";
16
14
  import "../std__assert-DWivtrGR.js";
17
- import { assertRejects } from "../assert_rejects-7UF4R_Qs.js";
18
- import "../assert_is_error-B035L3om.js";
15
+ import { assertRejects } from "../assert_rejects-Ce45JcFg.js";
16
+ import "../assert_throws-BNXdRGWP.js";
19
17
  import "../assert_not_equals-C80BG-_5.js";
20
- import "../assert_throws-53_pKeP3.js";
21
- import { rsaPrivateKey2 } from "../keys-MacD9GP6.js";
22
- import { esm_default } from "../esm-CXF1VoeR.js";
18
+ import { rsaPrivateKey2 } from "../keys-ZbcByPg9.js";
19
+ import { esm_default } from "../esm-DGl7uK1r.js";
20
+ import { UrlError } from "@fedify/vocab-runtime";
23
21
 
24
- //#region src/runtime/authdocloader.test.ts
22
+ //#region src/utils/docloader.test.ts
25
23
  test("getAuthenticatedDocumentLoader()", async (t) => {
26
24
  esm_default.spyGlobal();
27
25
  esm_default.get("begin:https://example.com/object", async (cl) => {