@fedify/fedify 2.4.0-pr.936.41 → 2.5.0-dev.2271

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 (244) hide show
  1. package/README.md +50 -39
  2. package/dist/{assert-CJ1KXcvv.mjs → assert-D1Eafmd_.mjs} +1 -1
  3. package/dist/{assert_equals-BV7oLMxm.mjs → assert_equals-Z6IcEbWU.mjs} +2 -28
  4. package/dist/assert_exists-cffSpJ7X.mjs +28 -0
  5. package/dist/assert_false-CPdRnc3E.mjs +23 -0
  6. package/dist/assert_greater_or_equal-BlafOF4-.mjs +31 -0
  7. package/dist/{assert_instance_of-Q9KTBnrf.mjs → assert_instance_of-mrXWWNY-.mjs} +1 -1
  8. package/dist/{assert_not_equals-EPJPoxuf.mjs → assert_not_equals-CpPK2t89.mjs} +2 -1
  9. package/dist/assert_rejects-CTptdYck.mjs +39 -0
  10. package/dist/{assert_strict_equals-Ec20AUwa.mjs → assert_strict_equals-CYvBmkpC.mjs} +2 -1
  11. package/dist/{assert_throws-NiFfqbnH.mjs → assert_throws-BYITOvPO.mjs} +2 -1
  12. package/dist/assertion_error-B-cx0fFA.mjs +31 -0
  13. package/dist/audience-CHQ-FlLD.mjs +95 -0
  14. package/dist/{builder-DonuxRl_.mjs → builder-Bda6LK7A.mjs} +169 -14
  15. package/dist/{circuit-breaker-CBGyz5F7.mjs → circuit-breaker-XJ53md4S.mjs} +224 -17
  16. package/dist/circuit-breaker-test-utils-DW6YC_Pe.mjs +14 -0
  17. package/dist/{client-CjF5IYQS.mjs → client-CEnNz8O7.mjs} +144 -8
  18. package/dist/{codec-BBga-FWI.mjs → codec-C6rTrpIp.mjs} +26 -3
  19. package/dist/{collection-BIhlldqK.mjs → collection-CnnP1UAv.mjs} +1 -1
  20. package/dist/compat/mod.cjs +1 -1
  21. package/dist/compat/mod.d.cts +1 -1
  22. package/dist/compat/mod.d.ts +1 -1
  23. package/dist/compat/mod.js +1 -1
  24. package/dist/compat/outgoing-jsonld.test.mjs +71 -3
  25. package/dist/compat/public-audience.test.mjs +14 -5
  26. package/dist/compat/secured-document.test.d.mts +2 -0
  27. package/dist/compat/secured-document.test.mjs +58 -0
  28. package/dist/compat/transformers.test.mjs +5 -5
  29. package/dist/compound-proof-B-9mXxFW.mjs +989 -0
  30. package/dist/{context-Zii1f5xS.d.ts → context-7NyiqIcg.d.ts} +1600 -25
  31. package/dist/{context-BJXxPElm.mjs → context-8Tu9kea0.mjs} +21 -63
  32. package/dist/{context-lxX6I7as.d.cts → context-tsYPJ2Ew.d.cts} +1600 -25
  33. package/dist/{deno-BHzKn9Ig.mjs → deno-oR5aJKpU.mjs} +1 -1
  34. package/dist/dist-DJQM4u7i.mjs +189 -0
  35. package/dist/docloader-DBoYbvYW.mjs +87 -0
  36. package/dist/{esm-yYQfPhIY.mjs → esm-BHXXx4Wx.mjs} +13 -6
  37. package/dist/federation/audience.test.d.mts +2 -0
  38. package/dist/federation/audience.test.mjs +130 -0
  39. package/dist/federation/builder.test.mjs +54 -5
  40. package/dist/federation/circuit-breaker.test.mjs +838 -7
  41. package/dist/federation/collection.test.mjs +3 -3
  42. package/dist/federation/compound-fanout.test.d.mts +2 -0
  43. package/dist/federation/compound-fanout.test.mjs +228 -0
  44. package/dist/federation/handler-compound-proof.test.d.mts +2 -0
  45. package/dist/federation/handler-compound-proof.test.mjs +384 -0
  46. package/dist/federation/handler.test.mjs +385 -15
  47. package/dist/federation/hashlink-media.test.d.mts +2 -0
  48. package/dist/federation/hashlink-media.test.mjs +422 -0
  49. package/dist/federation/idempotency.test.mjs +6 -6
  50. package/dist/federation/inbox-report.test.d.mts +2 -0
  51. package/dist/federation/inbox-report.test.mjs +475 -0
  52. package/dist/federation/inbox.test.mjs +3 -3
  53. package/dist/federation/keycache.test.mjs +215 -14
  54. package/dist/federation/kv.test.mjs +3 -3
  55. package/dist/federation/metrics.test.mjs +5 -5
  56. package/dist/federation/middleware.test.mjs +967 -35
  57. package/dist/federation/mod.cjs +18 -261
  58. package/dist/federation/mod.d.cts +5 -5
  59. package/dist/federation/mod.d.ts +5 -5
  60. package/dist/federation/mod.js +279 -1
  61. package/dist/federation/mq.test.mjs +123 -47
  62. package/dist/federation/negotiation.test.mjs +4 -4
  63. package/dist/federation/outgoing-proof.test.d.mts +2 -0
  64. package/dist/federation/outgoing-proof.test.mjs +931 -0
  65. package/dist/federation/portable-actor.test.d.mts +2 -0
  66. package/dist/federation/portable-actor.test.mjs +496 -0
  67. package/dist/federation/portable-chain.test.d.mts +2 -0
  68. package/dist/federation/portable-chain.test.mjs +370 -0
  69. package/dist/federation/portable-collection.test.d.mts +2 -0
  70. package/dist/federation/portable-collection.test.mjs +832 -0
  71. package/dist/federation/portable-delivery.test.d.mts +2 -0
  72. package/dist/federation/portable-delivery.test.mjs +746 -0
  73. package/dist/federation/portable-gateway-keys.test.d.mts +2 -0
  74. package/dist/federation/portable-gateway-keys.test.mjs +686 -0
  75. package/dist/federation/portable-inbox.test.d.mts +2 -0
  76. package/dist/federation/portable-inbox.test.mjs +1535 -0
  77. package/dist/federation/portable-parse-uri.test.d.mts +2 -0
  78. package/dist/federation/portable-parse-uri.test.mjs +348 -0
  79. package/dist/federation/portable-route-activity.test.d.mts +2 -0
  80. package/dist/federation/portable-route-activity.test.mjs +259 -0
  81. package/dist/federation/portable.test.d.mts +2 -0
  82. package/dist/federation/portable.test.mjs +1072 -0
  83. package/dist/federation/retry.test.mjs +4 -3
  84. package/dist/federation/router.test.mjs +9 -159
  85. package/dist/federation/send.test.mjs +245 -27
  86. package/dist/federation/tasks/codec.test.mjs +4 -4
  87. package/dist/federation/tasks/enqueue.test.mjs +42 -4
  88. package/dist/federation/tasks/tasks.test.mjs +7 -6
  89. package/dist/federation/temporal.test.mjs +4 -4
  90. package/dist/federation/webfinger.test.mjs +275 -12
  91. package/dist/{middleware-FrSMAYEx.cjs → federation-CkZiAcWY.cjs} +8640 -3722
  92. package/dist/http-B5JT115n.cjs +10630 -0
  93. package/dist/http-DydWCB7R.js +6527 -0
  94. package/dist/{http-CPVMUgsW.mjs → http-siciWkmx.mjs} +397 -168
  95. package/dist/key-BspPiXqn.mjs +951 -0
  96. package/dist/key-C1nv7_jD.d.ts +1125 -0
  97. package/dist/key-DYxuyd-s.d.cts +1125 -0
  98. package/dist/key-owner-evidence-APB6NpSk.mjs +108 -0
  99. package/dist/keycache-Da8A8mZa.mjs +200 -0
  100. package/dist/{kv-D6hNiMTK.d.ts → kv-B2mzK5tl.d.cts} +3 -2
  101. package/dist/{kv-gJ8LYbxX.d.cts → kv-B2mzK5tl.d.ts} +3 -2
  102. package/dist/kv-DBRWVx3Q.mjs +104 -0
  103. package/dist/{kv-cache-KyGqJqSp.mjs → kv-cache-BF1hnW65.mjs} +1 -1
  104. package/dist/{kv-cache-5bnX3-Jq.js → kv-cache-CTQr1tbn.js} +54 -16
  105. package/dist/{kv-cache-DQ29C4XL.cjs → kv-cache-DCac1nEU.cjs} +55 -19
  106. package/dist/{ld-Cj9F_5AP.mjs → ld-CzaP-hJl.mjs} +44 -12
  107. package/dist/map-local-context-conflict-DOYEEJ3u.mjs +204 -0
  108. package/dist/map-local-create-note-B0SeXJms.mjs +214 -0
  109. package/dist/{metrics-DMk-nTxI.mjs → metrics-CYg9yxBL.mjs} +3 -2
  110. package/dist/metrics-DVKYY6K1.d.cts +36 -0
  111. package/dist/metrics-DoRtI0qU.d.ts +36 -0
  112. package/dist/{middleware-Y-kpsp6S.js → middleware-CsDDXKuL.js} +5493 -1103
  113. package/dist/{middleware-CvwTUgnP.mjs → middleware-D7_LO-Vs.mjs} +3157 -272
  114. package/dist/{middleware-CEctxBN6.mjs → middleware-DWjrfpcz.mjs} +1 -1
  115. package/dist/{mod-gOlPDuT8.d.cts → mod-BojP2Bw3.d.cts} +1 -1
  116. package/dist/mod-CavhAgLw.d.cts +320 -0
  117. package/dist/mod-CtpF2BU5.d.ts +320 -0
  118. package/dist/{mod-BtEaIEcD.d.cts → mod-DEZXwV6J.d.ts} +10 -4
  119. package/dist/{mod-UMmveiO0.d.ts → mod-Dw-nPxQh.d.cts} +10 -4
  120. package/dist/{mod-DLc2Ot6f.d.ts → mod-Xj5P4s4d.d.ts} +1 -1
  121. package/dist/mod.cjs +40 -39
  122. package/dist/mod.d.cts +10 -11
  123. package/dist/mod.d.ts +10 -11
  124. package/dist/mod.js +9 -9
  125. package/dist/{mq-llHKivST.mjs → mq-Dm1Wmtm-.mjs} +6 -0
  126. package/dist/nodeinfo/client.test.mjs +139 -4
  127. package/dist/nodeinfo/handler.test.mjs +5 -5
  128. package/dist/nodeinfo/mod.cjs +1 -1
  129. package/dist/nodeinfo/mod.d.cts +1 -1
  130. package/dist/nodeinfo/mod.d.ts +1 -1
  131. package/dist/nodeinfo/mod.js +1 -1
  132. package/dist/nodeinfo/types.test.mjs +4 -4
  133. package/dist/otel/exporter.test.mjs +3 -3
  134. package/dist/otel/mod.cjs +0 -1
  135. package/dist/otel/mod.d.cts +1 -1
  136. package/dist/otel/mod.d.ts +1 -1
  137. package/dist/{outgoing-jsonld-URuqsICz.mjs → outgoing-jsonld-4IJqPYos.mjs} +12 -10
  138. package/dist/{owner-DEvZuyOE.d.cts → owner-BF0L9cMt.d.cts} +11 -0
  139. package/dist/{owner-CnngXDNJ.d.ts → owner-BSzr5-I8.d.ts} +11 -0
  140. package/dist/owner-DYgfTFHy.mjs +267 -0
  141. package/dist/portable-collection-BpsVsRov.js +670 -0
  142. package/dist/portable-collection-C74P1vtC.mjs +418 -0
  143. package/dist/portable-collection-DZd2bm7M.cjs +686 -0
  144. package/dist/portable-key-BIMLrAP4.mjs +549 -0
  145. package/dist/portable-key-id-Ca30-hOa.mjs +248 -0
  146. package/dist/proof-Dxy6ByqI.mjs +1299 -0
  147. package/dist/{public-audience-Cr5MsnMq.mjs → public-audience--klBIOk1.mjs} +15 -10
  148. package/dist/router-u5O5KCQr.mjs +156 -0
  149. package/dist/runtime/mod.cjs +1 -1
  150. package/dist/runtime/mod.js +1 -1
  151. package/dist/secured-document-CxzZZ9nL.mjs +35 -0
  152. package/dist/send-C4dDpAxm.mjs +495 -0
  153. package/dist/sig/accept.test.mjs +1 -1
  154. package/dist/sig/compound-proof-discovery.test.d.mts +2 -0
  155. package/dist/sig/compound-proof-discovery.test.mjs +331 -0
  156. package/dist/sig/compound-proof-producer.test.d.mts +2 -0
  157. package/dist/sig/compound-proof-producer.test.mjs +107 -0
  158. package/dist/sig/compound-proof-verification.test.d.mts +2 -0
  159. package/dist/sig/compound-proof-verification.test.mjs +833 -0
  160. package/dist/sig/compound-proof.test.d.mts +2 -0
  161. package/dist/sig/compound-proof.test.mjs +411 -0
  162. package/dist/sig/http.test.mjs +702 -31
  163. package/dist/sig/key-owner-evidence.test.d.mts +2 -0
  164. package/dist/sig/key-owner-evidence.test.mjs +100 -0
  165. package/dist/sig/key.test.mjs +220 -8
  166. package/dist/sig/ld.test.mjs +65 -7
  167. package/dist/sig/mitra-receive-interop.test.d.mts +2 -0
  168. package/dist/sig/mitra-receive-interop.test.mjs +260 -0
  169. package/dist/sig/mitra-send-interop.test.d.mts +2 -0
  170. package/dist/sig/mitra-send-interop.test.mjs +461 -0
  171. package/dist/sig/mod.cjs +18 -16
  172. package/dist/sig/mod.d.cts +4 -4
  173. package/dist/sig/mod.d.ts +4 -4
  174. package/dist/sig/mod.js +3 -3
  175. package/dist/sig/owner.test.mjs +108 -9
  176. package/dist/sig/portable-collection.test.d.mts +2 -0
  177. package/dist/sig/portable-collection.test.mjs +697 -0
  178. package/dist/sig/portable-interop.test.d.mts +2 -0
  179. package/dist/sig/portable-interop.test.mjs +156 -0
  180. package/dist/sig/portable-key-id.test.d.mts +2 -0
  181. package/dist/sig/portable-key-id.test.mjs +67 -0
  182. package/dist/sig/portable-key.test.d.mts +2 -0
  183. package/dist/sig/portable-key.test.mjs +1439 -0
  184. package/dist/sig/proof.test.mjs +1753 -16
  185. package/dist/sig/tootik-request-interop.test.d.mts +2 -0
  186. package/dist/sig/tootik-request-interop.test.mjs +190 -0
  187. package/dist/sig/tootik-send-interop.test.d.mts +2 -0
  188. package/dist/sig/tootik-send-interop.test.mjs +331 -0
  189. package/dist/sig/verification.test.d.mts +2 -0
  190. package/dist/sig/verification.test.mjs +310 -0
  191. package/dist/std__assert-DvMDRPes.mjs +8 -0
  192. package/dist/{testing-CO7ftO8A.mjs → tasks-IG3pHfvZ.mjs} +2 -2
  193. package/dist/{temporal-fsXO5IvD.mjs → temporal-D0KJI4NF.mjs} +3 -3
  194. package/dist/testing/context.test.d.mts +2 -0
  195. package/dist/testing/context.test.mjs +19 -0
  196. package/dist/testing/kv.test.d.mts +2 -0
  197. package/dist/testing/kv.test.mjs +101 -0
  198. package/dist/testing/mod.d.mts +1617 -48
  199. package/dist/testing/mod.mjs +6 -3
  200. package/dist/testing-t8xDeJZ5.mjs +8 -0
  201. package/dist/{transformers-DGwl-hD1.cjs → transformers-BalCrSsr.cjs} +0 -1
  202. package/dist/{types-DC1pNgJA.js → types-_S2_MeLF.js} +144 -8
  203. package/dist/{types-CPym83zc.cjs → types-poIao40f.cjs} +160 -7
  204. package/dist/utils/docloader.test.mjs +530 -8
  205. package/dist/utils/kv-cache.test.mjs +2 -2
  206. package/dist/utils/mod.cjs +1 -1
  207. package/dist/utils/mod.d.cts +1 -1
  208. package/dist/utils/mod.d.ts +1 -1
  209. package/dist/utils/mod.js +1 -1
  210. package/dist/verification-C3954hQh.mjs +5 -0
  211. package/dist/verification-Dpfcw8ml.mjs +105 -0
  212. package/dist/vocab/cjs.test.mjs +1 -1
  213. package/package.json +8 -8
  214. package/dist/assert_rejects-EgstcQy5.mjs +0 -82
  215. package/dist/docloader-e1khNUKy.mjs +0 -49
  216. package/dist/http-CsmQ-BQ4.js +0 -2483
  217. package/dist/http-VyDTd4G3.d.cts +0 -553
  218. package/dist/http-hlIjmewS.cjs +0 -2694
  219. package/dist/http-lf8Hsd91.d.ts +0 -553
  220. package/dist/key-DfPsX8hv.mjs +0 -453
  221. package/dist/keycache-_DHqz5z_.mjs +0 -97
  222. package/dist/metrics-CoUJLQhZ.d.cts +0 -276
  223. package/dist/metrics-Dc4jR-IC.d.ts +0 -276
  224. package/dist/mod-B0hW12_O.d.cts +0 -307
  225. package/dist/mod-COIAjwRS.d.ts +0 -307
  226. package/dist/owner-Br9YYzn_.mjs +0 -120
  227. package/dist/proof-B4ngoaNQ.mjs +0 -316
  228. package/dist/proof-B6E0XUXJ.js +0 -1415
  229. package/dist/proof-NN4xCQGL.cjs +0 -1562
  230. package/dist/send-CxHKUNzv.mjs +0 -239
  231. package/dist/std__assert-B2NnY9bq.mjs +0 -79
  232. package/dist/temporal-polyfill-BCdTHexd.cjs +0 -3565
  233. /package/dist/{accept-8PiolDP7.mjs → accept-CPVqki78.mjs} +0 -0
  234. /package/dist/{activity-listener-BtTSxZWA.mjs → activity-listener-C-BSbKI7.mjs} +0 -0
  235. /package/dist/{client-CAM_bQXx.d.cts → client-D-XP_Ccb.d.cts} +0 -0
  236. /package/dist/{client-CSddvgWN.d.ts → client-D-XP_Ccb.d.ts} +0 -0
  237. /package/dist/{keys-Dbyd7bhl.mjs → keys-DIJNHW-Y.mjs} +0 -0
  238. /package/dist/{kv-CXBAok3k.mjs → kv-DCHkaJ9-.mjs} +0 -0
  239. /package/dist/{negotiation-RuwrPFqi.mjs → negotiation-CCocWT_N.mjs} +0 -0
  240. /package/dist/{retry-DgFqeS5k.mjs → retry-zX5xw5e0.mjs} +0 -0
  241. /package/dist/{chunk-D5IdezsZ.js → rolldown-runtime-BC-Eo5Mj.js} +0 -0
  242. /package/dist/{chunk-Czpeue4M.cjs → rolldown-runtime-Dmm3t92W.cjs} +0 -0
  243. /package/dist/{transformers-DXze6FUB.js → transformers-DAtXl_Kc.js} +0 -0
  244. /package/dist/{types-CrtdVuDP.mjs → types-DE_LV1JB.mjs} +0 -0
@@ -0,0 +1,331 @@
1
+ import "temporal-polyfill";
2
+ import "urlpattern-polyfill";
3
+ globalThis.addEventListener = () => {};
4
+ import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
5
+ import "../std__assert-DvMDRPes.mjs";
6
+ import { a as inspectCompoundPortableObjectApplicability, n as discoverCompoundProofDocuments } from "../compound-proof-B-9mXxFW.mjs";
7
+ import { t as map_local_create_note_default } from "../map-local-create-note-B0SeXJms.mjs";
8
+ import { test } from "@fedify/fixture";
9
+ //#region src/sig/compound-proof-discovery.test.ts
10
+ const limits = {
11
+ maxDepth: 16,
12
+ maxMaps: 32,
13
+ maxProofs: 8,
14
+ maxBytes: 16384
15
+ };
16
+ test("portable applicability is bounded and ignores metadata", () => {
17
+ assertEquals(inspectCompoundPortableObjectApplicability({
18
+ "@context": { id: "ap://did:key:context/object" },
19
+ proof: { id: "ap://did:key:proof/object" },
20
+ object: { id: "https://example.com/objects/1" }
21
+ }, limits), "absent");
22
+ assertEquals(inspectCompoundPortableObjectApplicability({ object: [{ "@id": "AP+EF61://did:key:child/objects/1" }] }, limits), "present");
23
+ assertEquals(inspectCompoundPortableObjectApplicability({ values: new Array(2e4).fill(0) }, {
24
+ ...limits,
25
+ maxBytes: 1e3
26
+ }), "indeterminate");
27
+ });
28
+ test("discoverCompoundProofDocuments() returns immutable deepest-first candidates", () => {
29
+ const input = {
30
+ id: "ap://example.test/activities/1",
31
+ object: {
32
+ id: "ap://example.test/objects/1",
33
+ content: "one",
34
+ proof: {
35
+ type: "DataIntegrityProof",
36
+ proofValue: "zInner"
37
+ }
38
+ },
39
+ items: [{
40
+ id: "ap://example.test/objects/2",
41
+ content: "two",
42
+ proof: {
43
+ type: "DataIntegrityProof",
44
+ proofValue: "zArray"
45
+ }
46
+ }],
47
+ "a/b~c": {
48
+ "@id": "ap://example.test/objects/3",
49
+ proof: {
50
+ type: "DataIntegrityProof",
51
+ proofValue: "zEscaped"
52
+ }
53
+ },
54
+ proof: {
55
+ type: "DataIntegrityProof",
56
+ proofValue: "zOuter",
57
+ proof: {
58
+ type: "DataIntegrityProof",
59
+ proofValue: "zNotADocument"
60
+ }
61
+ }
62
+ };
63
+ const before = structuredClone(input);
64
+ const result = discoverCompoundProofDocuments(input, limits);
65
+ assertEquals(input, before);
66
+ assertEquals(result.status, "ok");
67
+ if (result.status !== "ok") return;
68
+ assertEquals(result.documents.map(({ path, id, depth }) => ({
69
+ path,
70
+ id,
71
+ depth
72
+ })), [
73
+ {
74
+ path: "/items/0",
75
+ id: "ap://example.test/objects/2",
76
+ depth: 2
77
+ },
78
+ {
79
+ path: "/a~1b~0c",
80
+ id: "ap://example.test/objects/3",
81
+ depth: 1
82
+ },
83
+ {
84
+ path: "/object",
85
+ id: "ap://example.test/objects/1",
86
+ depth: 1
87
+ },
88
+ {
89
+ path: "",
90
+ id: "ap://example.test/activities/1",
91
+ depth: 0
92
+ }
93
+ ]);
94
+ assertEquals(result.documents[0].securedDocument, input.items[0]);
95
+ assertEquals(result.documents[0].proof, input.items[0].proof);
96
+ assertEquals(result.statistics.proofCount, 4);
97
+ input.items[0].content = "mutated after discovery";
98
+ assertEquals(result.documents[0].securedDocument.content, "two");
99
+ assertEquals(result.snapshot.items[0].content, "two");
100
+ });
101
+ test("discoverCompoundProofDocuments() is independent of member order", () => {
102
+ const first = {
103
+ z: {
104
+ id: "z",
105
+ proof: { proofValue: "z" }
106
+ },
107
+ a: {
108
+ id: "a",
109
+ proof: { proofValue: "a" }
110
+ },
111
+ proof: { proofValue: "root" }
112
+ };
113
+ const second = {
114
+ proof: { proofValue: "root" },
115
+ a: {
116
+ proof: { proofValue: "a" },
117
+ id: "a"
118
+ },
119
+ z: {
120
+ proof: { proofValue: "z" },
121
+ id: "z"
122
+ }
123
+ };
124
+ const firstResult = discoverCompoundProofDocuments(first, limits);
125
+ const secondResult = discoverCompoundProofDocuments(second, limits);
126
+ assertEquals(firstResult.status, "ok");
127
+ assertEquals(secondResult.status, "ok");
128
+ if (firstResult.status !== "ok" || secondResult.status !== "ok") return;
129
+ assertEquals(firstResult.documents.map((candidate) => candidate.path), [
130
+ "/a",
131
+ "/z",
132
+ ""
133
+ ]);
134
+ assertEquals(secondResult.documents.map((candidate) => candidate.path), [
135
+ "/a",
136
+ "/z",
137
+ ""
138
+ ]);
139
+ });
140
+ test("discoverCompoundProofDocuments() does not inspect context definitions", () => {
141
+ const result = discoverCompoundProofDocuments({
142
+ "@context": {
143
+ proof: "https://w3id.org/security#proof",
144
+ portable: {
145
+ "@id": "ap://did:key:z6MkContext/objects/1",
146
+ "@context": { proof: "https://example.com/nested-proof" }
147
+ }
148
+ },
149
+ id: "https://social.example/objects/1",
150
+ type: "Note"
151
+ }, limits);
152
+ assertEquals(result.status, "ok");
153
+ if (result.status !== "ok") return;
154
+ assertEquals(result.documents, []);
155
+ assertEquals(result.statistics.proofCount, 0);
156
+ });
157
+ test("discoverCompoundProofDocuments() preserves the recorded compound vector", () => {
158
+ const result = discoverCompoundProofDocuments(map_local_create_note_default.documents.finalSecuredCompound, limits);
159
+ assertEquals(result.status, "ok");
160
+ if (result.status !== "ok") return;
161
+ assertEquals(result.documents.map(({ path }) => path), ["/object", ""]);
162
+ assertEquals(result.documents[0].securedDocument, map_local_create_note_default.documents.securedInner);
163
+ assertEquals(result.documents[1].securedDocument, map_local_create_note_default.documents.finalSecuredCompound);
164
+ });
165
+ test("discoverCompoundProofDocuments() rejects unsupported proof shapes atomically", () => {
166
+ for (const proof of [
167
+ null,
168
+ "remote-proof",
169
+ [{ proofValue: "z" }]
170
+ ]) assertEquals(discoverCompoundProofDocuments({
171
+ object: { proof: { proofValue: "valid candidate" } },
172
+ other: { proof }
173
+ }, limits), {
174
+ status: "unsupported",
175
+ reason: {
176
+ type: "unsupportedProofShape",
177
+ path: "/other/proof"
178
+ }
179
+ });
180
+ });
181
+ test("discoverCompoundProofDocuments() applies resource limits atomically", () => {
182
+ const cases = [
183
+ {
184
+ input: { child: { child: { proof: {} } } },
185
+ limits: {
186
+ ...limits,
187
+ maxDepth: 1
188
+ },
189
+ limit: "depth",
190
+ maximum: 1
191
+ },
192
+ {
193
+ input: {
194
+ first: {},
195
+ second: { proof: {} }
196
+ },
197
+ limits: {
198
+ ...limits,
199
+ maxMaps: 2
200
+ },
201
+ limit: "maps",
202
+ maximum: 2
203
+ },
204
+ {
205
+ input: {
206
+ first: { proof: {} },
207
+ second: { proof: {} }
208
+ },
209
+ limits: {
210
+ ...limits,
211
+ maxProofs: 1
212
+ },
213
+ limit: "proofs",
214
+ maximum: 1
215
+ },
216
+ {
217
+ input: {
218
+ content: "too large",
219
+ proof: {}
220
+ },
221
+ limits: {
222
+ ...limits,
223
+ maxBytes: 8
224
+ },
225
+ limit: "bytes",
226
+ maximum: 8
227
+ }
228
+ ];
229
+ for (const fixture of cases) {
230
+ const result = discoverCompoundProofDocuments(fixture.input, fixture.limits);
231
+ assertEquals(result.status, "unsupported");
232
+ if (result.status !== "unsupported") continue;
233
+ assertEquals(result.reason.type, "limitExceeded");
234
+ if (result.reason.type !== "limitExceeded") continue;
235
+ assertEquals(result.reason.limit, fixture.limit);
236
+ assertEquals(result.reason.maximum, fixture.maximum);
237
+ }
238
+ });
239
+ test("discoverCompoundProofDocuments() rejects values that are not JSON trees", () => {
240
+ const cyclic = { proof: {} };
241
+ cyclic.self = cyclic;
242
+ const shared = { proof: {} };
243
+ const symbolKeyed = { [Symbol("hidden")]: { proof: {} } };
244
+ for (const input of [
245
+ [],
246
+ { value: void 0 },
247
+ { value: NaN },
248
+ cyclic,
249
+ {
250
+ first: shared,
251
+ second: shared
252
+ },
253
+ symbolKeyed
254
+ ]) {
255
+ const result = discoverCompoundProofDocuments(input, limits);
256
+ assertEquals(result.status, "unsupported");
257
+ if (result.status !== "unsupported") continue;
258
+ assertEquals(result.reason.type, "invalidJsonTree");
259
+ }
260
+ });
261
+ test("discoverCompoundProofDocuments() handles wide JSON containers", () => {
262
+ const input = { values: new Array(2e5).fill(0) };
263
+ const result = discoverCompoundProofDocuments(input, {
264
+ maxDepth: 2,
265
+ maxMaps: 1,
266
+ maxProofs: 0,
267
+ maxBytes: 1048576
268
+ });
269
+ assertEquals(result.status, "ok");
270
+ if (result.status !== "ok") return;
271
+ assertEquals(result.statistics.byteLength, JSON.stringify(input).length);
272
+ });
273
+ test("discoverCompoundProofDocuments() rejects accessors without invoking them", () => {
274
+ let getterCalls = 0;
275
+ const accessorMap = {};
276
+ Object.defineProperty(accessorMap, "object", {
277
+ enumerable: true,
278
+ get() {
279
+ getterCalls++;
280
+ return { proof: {} };
281
+ }
282
+ });
283
+ const accessorArray = [{}];
284
+ Object.defineProperty(accessorArray, 0, {
285
+ enumerable: true,
286
+ get() {
287
+ getterCalls++;
288
+ return { proof: {} };
289
+ }
290
+ });
291
+ for (const input of [accessorMap, { items: accessorArray }]) {
292
+ const result = discoverCompoundProofDocuments(input, limits);
293
+ assertEquals(result.status, "unsupported");
294
+ if (result.status !== "unsupported") continue;
295
+ assertEquals(result.reason.type, "invalidJsonTree");
296
+ }
297
+ assertEquals(getterCalls, 0);
298
+ });
299
+ test("discoverCompoundProofDocuments() rejects non-enumerable map properties", () => {
300
+ const input = {};
301
+ Object.defineProperty(input, "proof", {
302
+ value: {},
303
+ enumerable: false
304
+ });
305
+ const result = discoverCompoundProofDocuments(input, limits);
306
+ assertEquals(result.status, "unsupported");
307
+ if (result.status !== "unsupported") return;
308
+ assertEquals(result.reason.type, "invalidJsonTree");
309
+ });
310
+ test("discoverCompoundProofDocuments() rejects non-JSON array properties", () => {
311
+ const namedProperty = Object.assign([], { extra: { proof: {} } });
312
+ const sparse = new Array(2);
313
+ sparse[1] = null;
314
+ const nonEnumerableIndex = [];
315
+ Object.defineProperty(nonEnumerableIndex, 0, {
316
+ value: { proof: {} },
317
+ enumerable: false
318
+ });
319
+ for (const input of [
320
+ { items: namedProperty },
321
+ { items: sparse },
322
+ { items: nonEnumerableIndex }
323
+ ]) {
324
+ const result = discoverCompoundProofDocuments(input, limits);
325
+ assertEquals(result.status, "unsupported");
326
+ if (result.status !== "unsupported") continue;
327
+ assertEquals(result.reason.type, "invalidJsonTree");
328
+ }
329
+ });
330
+ //#endregion
331
+ export {};
@@ -0,0 +1,2 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ import { URLPattern } from "urlpattern-polyfill";
@@ -0,0 +1,107 @@
1
+ import "temporal-polyfill";
2
+ import "urlpattern-polyfill";
3
+ globalThis.addEventListener = () => {};
4
+ import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
5
+ import "../std__assert-DvMDRPes.mjs";
6
+ import { a as inspectCompoundPortableObjectApplicability, i as findUnsupportedCompoundProofShape, t as containsCompoundPortableObject } from "../compound-proof-B-9mXxFW.mjs";
7
+ import { test } from "@fedify/fixture";
8
+ //#region src/sig/compound-proof-producer.test.ts
9
+ const portableId = "ap+ef61://did:key:z6MkAlice/objects/1";
10
+ const proof = {
11
+ type: "DataIntegrityProof",
12
+ proofValue: "z"
13
+ };
14
+ function nest(depth, leaf) {
15
+ let value = leaf;
16
+ for (let i = 0; i < depth; i++) value = {
17
+ type: "Note",
18
+ content: value
19
+ };
20
+ return value;
21
+ }
22
+ test("containsCompoundPortableObject() finds portable maps", () => {
23
+ const cases = [
24
+ [{ id: portableId }, true],
25
+ [{ "@id": "AP://did:key:z6MkAlice/actor" }, true],
26
+ [{
27
+ id: "https://example.com/1",
28
+ object: [{}, { id: portableId }]
29
+ }, true],
30
+ [{
31
+ id: "https://example.com/1",
32
+ actor: portableId
33
+ }, false],
34
+ [{
35
+ id: "https://example.com/1",
36
+ proof: { id: portableId }
37
+ }, false],
38
+ [{
39
+ "@context": [{ id: portableId }],
40
+ id: "https://example.com/1"
41
+ }, false],
42
+ [{
43
+ id: "https://example.com/1",
44
+ object: { id: "ap-like" }
45
+ }, false],
46
+ [[{ id: portableId }], true],
47
+ [null, false]
48
+ ];
49
+ for (const [json, expected] of cases) assertEquals(containsCompoundPortableObject(json), expected, `${json}`);
50
+ });
51
+ test("containsCompoundPortableObject() ignores the inbox limits", () => {
52
+ const deep = nest(100, { id: portableId });
53
+ const limits = {
54
+ maxDepth: 64,
55
+ maxMaps: 1e4,
56
+ maxProofs: 32,
57
+ maxBytes: 10 * 1024 * 1024
58
+ };
59
+ assertEquals(inspectCompoundPortableObjectApplicability(deep, limits), "indeterminate");
60
+ assertEquals(containsCompoundPortableObject(deep), true);
61
+ const large = {
62
+ id: "https://example.com/1",
63
+ content: "x".repeat(11 * 1024 * 1024),
64
+ proof: [proof, proof]
65
+ };
66
+ assertEquals(inspectCompoundPortableObjectApplicability(large, limits), "indeterminate");
67
+ assertEquals(containsCompoundPortableObject(large), false);
68
+ });
69
+ test("containsCompoundPortableObject() terminates on repeated maps", () => {
70
+ const shared = { type: "Note" };
71
+ const cyclic = {
72
+ a: shared,
73
+ b: shared
74
+ };
75
+ shared.parent = cyclic;
76
+ assertEquals(containsCompoundPortableObject(cyclic), false);
77
+ shared.id = portableId;
78
+ assertEquals(containsCompoundPortableObject(cyclic), true);
79
+ });
80
+ test("findUnsupportedCompoundProofShape() reports non-map proofs", () => {
81
+ const cases = [
82
+ [{ proof }, null],
83
+ [{ proof: [proof, proof] }, "/proof"],
84
+ [{ proof: [proof] }, "/proof"],
85
+ [{ proof: [] }, "/proof"],
86
+ [{ proof: null }, "/proof"],
87
+ [{ proof: "z" }, "/proof"],
88
+ [{ proof: 1 }, "/proof"],
89
+ [{ proof: true }, "/proof"],
90
+ [{
91
+ proof,
92
+ object: { proof: [proof, proof] }
93
+ }, "/object/proof"],
94
+ [{ items: [{ proof }, { proof: [proof] }] }, "/items/1/proof"],
95
+ [{ "a/b~c": { proof: [proof] } }, "/a~1b~0c/proof"],
96
+ [{ proof: {
97
+ ...proof,
98
+ nested: { proof: [proof] }
99
+ } }, null],
100
+ [{ "@context": [{ proof: [proof] }] }, null],
101
+ [{ object: { id: portableId } }, null]
102
+ ];
103
+ for (const [json, expected] of cases) assertEquals(findUnsupportedCompoundProofShape(json), expected, JSON.stringify(json));
104
+ assertEquals(findUnsupportedCompoundProofShape(nest(100, { proof: [proof, proof] })), "/content".repeat(100) + "/proof");
105
+ });
106
+ //#endregion
107
+ export {};
@@ -0,0 +1,2 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ import { URLPattern } from "urlpattern-polyfill";