@uncefact/untp-utils 0.1.0 → 0.3.0

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 (389) hide show
  1. package/README.md +52 -2
  2. package/artefacts/context/untp/0.6.0/dcc.json +1241 -0
  3. package/artefacts/context/untp/0.6.0/dfr.json +619 -0
  4. package/artefacts/context/untp/0.6.0/dia.json +162 -0
  5. package/artefacts/context/untp/0.6.0/dpp.json +1078 -0
  6. package/artefacts/context/untp/0.6.0/dte.json +1285 -0
  7. package/artefacts/context/untp/0.6.1/dcc.json +1388 -0
  8. package/artefacts/context/untp/0.6.1/dfr.json +690 -0
  9. package/artefacts/context/untp/0.6.1/dia.json +196 -0
  10. package/artefacts/context/untp/0.6.1/dpp.json +1164 -0
  11. package/artefacts/context/untp/0.6.1/dte.json +1340 -0
  12. package/artefacts/context/untp/0.7.0/untp.json +3493 -0
  13. package/artefacts/context/vcdm/2/credentials.json +301 -0
  14. package/artefacts/manifest.json +214 -0
  15. package/artefacts/schema/untp/0.6.0/dcc.json +1131 -0
  16. package/artefacts/schema/untp/0.6.0/dfr.json +1028 -0
  17. package/artefacts/schema/untp/0.6.0/dia.json +236 -0
  18. package/artefacts/schema/untp/0.6.0/dpp.json +1219 -0
  19. package/artefacts/schema/untp/0.6.0/dte.json +845 -0
  20. package/artefacts/schema/untp/0.6.1/dcc.json +1196 -0
  21. package/artefacts/schema/untp/0.6.1/dfr.json +1037 -0
  22. package/artefacts/schema/untp/0.6.1/dia.json +236 -0
  23. package/artefacts/schema/untp/0.6.1/dpp.json +1229 -0
  24. package/artefacts/schema/untp/0.6.1/dte.json +845 -0
  25. package/artefacts/schema/untp/0.7.0/cvc.json +701 -0
  26. package/artefacts/schema/untp/0.7.0/dcc.json +1133 -0
  27. package/artefacts/schema/untp/0.7.0/dfr.json +1245 -0
  28. package/artefacts/schema/untp/0.7.0/dia.json +443 -0
  29. package/artefacts/schema/untp/0.7.0/dpp.json +1300 -0
  30. package/artefacts/schema/untp/0.7.0/dte.json +1226 -0
  31. package/artefacts/schema/untp/0.7.0/linkset.json +119 -0
  32. package/artefacts/schema/vcdm/2/verifiable-credential.json +318 -0
  33. package/build/artefacts/detect-version-from-context.d.ts +46 -0
  34. package/build/artefacts/detect-version-from-context.js +77 -0
  35. package/build/artefacts/detect-version-from-context.js.map +1 -0
  36. package/build/artefacts/detect-version-from-context.test.d.ts +1 -0
  37. package/build/artefacts/detect-version-from-context.test.js +69 -0
  38. package/build/artefacts/detect-version-from-context.test.js.map +1 -0
  39. package/build/artefacts/index.d.ts +3 -0
  40. package/build/artefacts/index.js +4 -0
  41. package/build/artefacts/index.js.map +1 -0
  42. package/build/artefacts/urls.d.ts +85 -0
  43. package/build/artefacts/urls.js +141 -0
  44. package/build/artefacts/urls.js.map +1 -0
  45. package/build/artefacts/urls.test.d.ts +1 -0
  46. package/build/artefacts/urls.test.js +99 -0
  47. package/build/artefacts/urls.test.js.map +1 -0
  48. package/build/artefacts/version.d.ts +9 -0
  49. package/build/artefacts/version.js +17 -0
  50. package/build/artefacts/version.js.map +1 -0
  51. package/build/artefacts/version.test.d.ts +1 -0
  52. package/build/artefacts/version.test.js +16 -0
  53. package/build/artefacts/version.test.js.map +1 -0
  54. package/build/bundle/artefacts/context/untp/0.6.0/dcc.d.ts +2 -0
  55. package/build/bundle/artefacts/context/untp/0.6.0/dcc.js +1244 -0
  56. package/build/bundle/artefacts/context/untp/0.6.0/dcc.js.map +1 -0
  57. package/build/bundle/artefacts/context/untp/0.6.0/dfr.d.ts +2 -0
  58. package/build/bundle/artefacts/context/untp/0.6.0/dfr.js +622 -0
  59. package/build/bundle/artefacts/context/untp/0.6.0/dfr.js.map +1 -0
  60. package/build/bundle/artefacts/context/untp/0.6.0/dia.d.ts +2 -0
  61. package/build/bundle/artefacts/context/untp/0.6.0/dia.js +165 -0
  62. package/build/bundle/artefacts/context/untp/0.6.0/dia.js.map +1 -0
  63. package/build/bundle/artefacts/context/untp/0.6.0/dpp.d.ts +2 -0
  64. package/build/bundle/artefacts/context/untp/0.6.0/dpp.js +1081 -0
  65. package/build/bundle/artefacts/context/untp/0.6.0/dpp.js.map +1 -0
  66. package/build/bundle/artefacts/context/untp/0.6.0/dte.d.ts +2 -0
  67. package/build/bundle/artefacts/context/untp/0.6.0/dte.js +1288 -0
  68. package/build/bundle/artefacts/context/untp/0.6.0/dte.js.map +1 -0
  69. package/build/bundle/artefacts/context/untp/0.6.1/dcc.d.ts +2 -0
  70. package/build/bundle/artefacts/context/untp/0.6.1/dcc.js +1391 -0
  71. package/build/bundle/artefacts/context/untp/0.6.1/dcc.js.map +1 -0
  72. package/build/bundle/artefacts/context/untp/0.6.1/dfr.d.ts +2 -0
  73. package/build/bundle/artefacts/context/untp/0.6.1/dfr.js +693 -0
  74. package/build/bundle/artefacts/context/untp/0.6.1/dfr.js.map +1 -0
  75. package/build/bundle/artefacts/context/untp/0.6.1/dia.d.ts +2 -0
  76. package/build/bundle/artefacts/context/untp/0.6.1/dia.js +199 -0
  77. package/build/bundle/artefacts/context/untp/0.6.1/dia.js.map +1 -0
  78. package/build/bundle/artefacts/context/untp/0.6.1/dpp.d.ts +2 -0
  79. package/build/bundle/artefacts/context/untp/0.6.1/dpp.js +1167 -0
  80. package/build/bundle/artefacts/context/untp/0.6.1/dpp.js.map +1 -0
  81. package/build/bundle/artefacts/context/untp/0.6.1/dte.d.ts +2 -0
  82. package/build/bundle/artefacts/context/untp/0.6.1/dte.js +1343 -0
  83. package/build/bundle/artefacts/context/untp/0.6.1/dte.js.map +1 -0
  84. package/build/bundle/artefacts/context/untp/0.7.0/untp.d.ts +2 -0
  85. package/build/bundle/artefacts/context/untp/0.7.0/untp.js +3496 -0
  86. package/build/bundle/artefacts/context/untp/0.7.0/untp.js.map +1 -0
  87. package/build/bundle/artefacts/context/vcdm/2/credentials.d.ts +2 -0
  88. package/build/bundle/artefacts/context/vcdm/2/credentials.js +304 -0
  89. package/build/bundle/artefacts/context/vcdm/2/credentials.js.map +1 -0
  90. package/build/bundle/artefacts/schema/untp/0.6.0/dcc.d.ts +2 -0
  91. package/build/bundle/artefacts/schema/untp/0.6.0/dcc.js +1134 -0
  92. package/build/bundle/artefacts/schema/untp/0.6.0/dcc.js.map +1 -0
  93. package/build/bundle/artefacts/schema/untp/0.6.0/dfr.d.ts +2 -0
  94. package/build/bundle/artefacts/schema/untp/0.6.0/dfr.js +1031 -0
  95. package/build/bundle/artefacts/schema/untp/0.6.0/dfr.js.map +1 -0
  96. package/build/bundle/artefacts/schema/untp/0.6.0/dia.d.ts +2 -0
  97. package/build/bundle/artefacts/schema/untp/0.6.0/dia.js +239 -0
  98. package/build/bundle/artefacts/schema/untp/0.6.0/dia.js.map +1 -0
  99. package/build/bundle/artefacts/schema/untp/0.6.0/dpp.d.ts +2 -0
  100. package/build/bundle/artefacts/schema/untp/0.6.0/dpp.js +1222 -0
  101. package/build/bundle/artefacts/schema/untp/0.6.0/dpp.js.map +1 -0
  102. package/build/bundle/artefacts/schema/untp/0.6.0/dte.d.ts +2 -0
  103. package/build/bundle/artefacts/schema/untp/0.6.0/dte.js +848 -0
  104. package/build/bundle/artefacts/schema/untp/0.6.0/dte.js.map +1 -0
  105. package/build/bundle/artefacts/schema/untp/0.6.1/dcc.d.ts +2 -0
  106. package/build/bundle/artefacts/schema/untp/0.6.1/dcc.js +1199 -0
  107. package/build/bundle/artefacts/schema/untp/0.6.1/dcc.js.map +1 -0
  108. package/build/bundle/artefacts/schema/untp/0.6.1/dfr.d.ts +2 -0
  109. package/build/bundle/artefacts/schema/untp/0.6.1/dfr.js +1040 -0
  110. package/build/bundle/artefacts/schema/untp/0.6.1/dfr.js.map +1 -0
  111. package/build/bundle/artefacts/schema/untp/0.6.1/dia.d.ts +2 -0
  112. package/build/bundle/artefacts/schema/untp/0.6.1/dia.js +239 -0
  113. package/build/bundle/artefacts/schema/untp/0.6.1/dia.js.map +1 -0
  114. package/build/bundle/artefacts/schema/untp/0.6.1/dpp.d.ts +2 -0
  115. package/build/bundle/artefacts/schema/untp/0.6.1/dpp.js +1232 -0
  116. package/build/bundle/artefacts/schema/untp/0.6.1/dpp.js.map +1 -0
  117. package/build/bundle/artefacts/schema/untp/0.6.1/dte.d.ts +2 -0
  118. package/build/bundle/artefacts/schema/untp/0.6.1/dte.js +848 -0
  119. package/build/bundle/artefacts/schema/untp/0.6.1/dte.js.map +1 -0
  120. package/build/bundle/artefacts/schema/untp/0.7.0/cvc.d.ts +2 -0
  121. package/build/bundle/artefacts/schema/untp/0.7.0/cvc.js +704 -0
  122. package/build/bundle/artefacts/schema/untp/0.7.0/cvc.js.map +1 -0
  123. package/build/bundle/artefacts/schema/untp/0.7.0/dcc.d.ts +2 -0
  124. package/build/bundle/artefacts/schema/untp/0.7.0/dcc.js +1136 -0
  125. package/build/bundle/artefacts/schema/untp/0.7.0/dcc.js.map +1 -0
  126. package/build/bundle/artefacts/schema/untp/0.7.0/dfr.d.ts +2 -0
  127. package/build/bundle/artefacts/schema/untp/0.7.0/dfr.js +1248 -0
  128. package/build/bundle/artefacts/schema/untp/0.7.0/dfr.js.map +1 -0
  129. package/build/bundle/artefacts/schema/untp/0.7.0/dia.d.ts +2 -0
  130. package/build/bundle/artefacts/schema/untp/0.7.0/dia.js +446 -0
  131. package/build/bundle/artefacts/schema/untp/0.7.0/dia.js.map +1 -0
  132. package/build/bundle/artefacts/schema/untp/0.7.0/dpp.d.ts +2 -0
  133. package/build/bundle/artefacts/schema/untp/0.7.0/dpp.js +1303 -0
  134. package/build/bundle/artefacts/schema/untp/0.7.0/dpp.js.map +1 -0
  135. package/build/bundle/artefacts/schema/untp/0.7.0/dte.d.ts +2 -0
  136. package/build/bundle/artefacts/schema/untp/0.7.0/dte.js +1229 -0
  137. package/build/bundle/artefacts/schema/untp/0.7.0/dte.js.map +1 -0
  138. package/build/bundle/artefacts/schema/untp/0.7.0/linkset.d.ts +2 -0
  139. package/build/bundle/artefacts/schema/untp/0.7.0/linkset.js +122 -0
  140. package/build/bundle/artefacts/schema/untp/0.7.0/linkset.js.map +1 -0
  141. package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.d.ts +2 -0
  142. package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.js +321 -0
  143. package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.js.map +1 -0
  144. package/build/bundle/fallback.d.ts +41 -0
  145. package/build/bundle/fallback.js +62 -0
  146. package/build/bundle/fallback.js.map +1 -0
  147. package/build/bundle/fallback.test.d.ts +1 -0
  148. package/build/bundle/fallback.test.js +124 -0
  149. package/build/bundle/fallback.test.js.map +1 -0
  150. package/build/bundle/index.d.ts +4 -0
  151. package/build/bundle/index.js +77 -0
  152. package/build/bundle/index.js.map +1 -0
  153. package/build/bundle/lookup.d.ts +14 -0
  154. package/build/bundle/lookup.js +40 -0
  155. package/build/bundle/lookup.js.map +1 -0
  156. package/build/bundle/lookup.test.d.ts +1 -0
  157. package/build/bundle/lookup.test.js +70 -0
  158. package/build/bundle/lookup.test.js.map +1 -0
  159. package/build/bundle/public.d.ts +25 -0
  160. package/build/bundle/public.js +56 -0
  161. package/build/bundle/public.js.map +1 -0
  162. package/build/bundle/public.test.d.ts +1 -0
  163. package/build/bundle/public.test.js +35 -0
  164. package/build/bundle/public.test.js.map +1 -0
  165. package/build/bundle/refresh-classify.test.d.ts +1 -0
  166. package/build/bundle/refresh-classify.test.js +20 -0
  167. package/build/bundle/refresh-classify.test.js.map +1 -0
  168. package/build/bundle/refresh-main.test.d.ts +1 -0
  169. package/build/bundle/refresh-main.test.js +98 -0
  170. package/build/bundle/refresh-main.test.js.map +1 -0
  171. package/build/cache/in-memory-ttl-cache.d.ts +2 -0
  172. package/build/cache/in-memory-ttl-cache.js +76 -0
  173. package/build/cache/in-memory-ttl-cache.js.map +1 -0
  174. package/build/cache/in-memory-ttl-cache.test.d.ts +1 -0
  175. package/build/cache/in-memory-ttl-cache.test.js +236 -0
  176. package/build/cache/in-memory-ttl-cache.test.js.map +1 -0
  177. package/build/cache/index.d.ts +2 -0
  178. package/build/cache/index.js +2 -0
  179. package/build/cache/index.js.map +1 -0
  180. package/build/cache/ttl-cache.d.ts +22 -0
  181. package/build/cache/ttl-cache.js +2 -0
  182. package/build/cache/ttl-cache.js.map +1 -0
  183. package/build/common/as-date-time.d.ts +13 -0
  184. package/build/common/as-date-time.js +44 -0
  185. package/build/common/as-date-time.js.map +1 -0
  186. package/build/common/as-date-time.test.d.ts +1 -0
  187. package/build/common/as-date-time.test.js +42 -0
  188. package/build/common/as-date-time.test.js.map +1 -0
  189. package/build/common/as-non-empty-string.d.ts +14 -0
  190. package/build/common/as-non-empty-string.js +20 -0
  191. package/build/common/as-non-empty-string.js.map +1 -0
  192. package/build/common/as-non-empty-string.test.d.ts +1 -0
  193. package/build/common/as-non-empty-string.test.js +30 -0
  194. package/build/common/as-non-empty-string.test.js.map +1 -0
  195. package/build/common/index.d.ts +4 -0
  196. package/build/common/index.js +5 -0
  197. package/build/common/index.js.map +1 -0
  198. package/build/common/require-string.d.ts +12 -0
  199. package/build/common/require-string.js +27 -0
  200. package/build/common/require-string.js.map +1 -0
  201. package/build/common/require-string.test.d.ts +1 -0
  202. package/build/common/require-string.test.js +53 -0
  203. package/build/common/require-string.test.js.map +1 -0
  204. package/build/common/validity-window.d.ts +45 -0
  205. package/build/common/validity-window.js +68 -0
  206. package/build/common/validity-window.js.map +1 -0
  207. package/build/common/validity-window.test.d.ts +1 -0
  208. package/build/common/validity-window.test.js +67 -0
  209. package/build/common/validity-window.test.js.map +1 -0
  210. package/build/conformity-vocabulary/codes.d.ts +10 -0
  211. package/build/conformity-vocabulary/codes.js +10 -0
  212. package/build/conformity-vocabulary/codes.js.map +1 -0
  213. package/build/conformity-vocabulary/errors.d.ts +44 -0
  214. package/build/conformity-vocabulary/errors.js +68 -0
  215. package/build/conformity-vocabulary/errors.js.map +1 -0
  216. package/build/conformity-vocabulary/index.d.ts +6 -0
  217. package/build/conformity-vocabulary/index.js +7 -0
  218. package/build/conformity-vocabulary/index.js.map +1 -0
  219. package/build/conformity-vocabulary/parse-conformity-catalogue.d.ts +26 -0
  220. package/build/conformity-vocabulary/parse-conformity-catalogue.js +106 -0
  221. package/build/conformity-vocabulary/parse-conformity-catalogue.js.map +1 -0
  222. package/build/conformity-vocabulary/parse-conformity-catalogue.test.d.ts +1 -0
  223. package/build/conformity-vocabulary/parse-conformity-catalogue.test.js +327 -0
  224. package/build/conformity-vocabulary/parse-conformity-catalogue.test.js.map +1 -0
  225. package/build/conformity-vocabulary/parse-conformity-scheme.d.ts +28 -0
  226. package/build/conformity-vocabulary/parse-conformity-scheme.js +47 -0
  227. package/build/conformity-vocabulary/parse-conformity-scheme.js.map +1 -0
  228. package/build/conformity-vocabulary/parse-conformity-scheme.test.d.ts +1 -0
  229. package/build/conformity-vocabulary/parse-conformity-scheme.test.js +284 -0
  230. package/build/conformity-vocabulary/parse-conformity-scheme.test.js.map +1 -0
  231. package/build/conformity-vocabulary/parsers/v0-7-0.parser.d.ts +19 -0
  232. package/build/conformity-vocabulary/parsers/v0-7-0.parser.js +219 -0
  233. package/build/conformity-vocabulary/parsers/v0-7-0.parser.js.map +1 -0
  234. package/build/conformity-vocabulary/types.d.ts +180 -0
  235. package/build/conformity-vocabulary/types.js +2 -0
  236. package/build/conformity-vocabulary/types.js.map +1 -0
  237. package/build/conformity-vocabulary/validate-conformity-claim.d.ts +26 -0
  238. package/build/conformity-vocabulary/validate-conformity-claim.js +165 -0
  239. package/build/conformity-vocabulary/validate-conformity-claim.js.map +1 -0
  240. package/build/conformity-vocabulary/validate-conformity-claim.test.d.ts +1 -0
  241. package/build/conformity-vocabulary/validate-conformity-claim.test.js +478 -0
  242. package/build/conformity-vocabulary/validate-conformity-claim.test.js.map +1 -0
  243. package/build/http-headers/index.d.ts +5 -0
  244. package/build/http-headers/index.js +6 -0
  245. package/build/http-headers/index.js.map +1 -0
  246. package/build/http-headers/is-safe-header-value.d.ts +10 -0
  247. package/build/http-headers/is-safe-header-value.js +15 -0
  248. package/build/http-headers/is-safe-header-value.js.map +1 -0
  249. package/build/http-headers/is-safe-header-value.test.d.ts +1 -0
  250. package/build/http-headers/is-safe-header-value.test.js +37 -0
  251. package/build/http-headers/is-safe-header-value.test.js.map +1 -0
  252. package/build/http-headers/parse-entity-tag.d.ts +9 -0
  253. package/build/http-headers/parse-entity-tag.js +18 -0
  254. package/build/http-headers/parse-entity-tag.js.map +1 -0
  255. package/build/http-headers/parse-entity-tag.test.d.ts +1 -0
  256. package/build/http-headers/parse-entity-tag.test.js +41 -0
  257. package/build/http-headers/parse-entity-tag.test.js.map +1 -0
  258. package/build/http-headers/parse-imf-date.d.ts +13 -0
  259. package/build/http-headers/parse-imf-date.js +23 -0
  260. package/build/http-headers/parse-imf-date.js.map +1 -0
  261. package/build/http-headers/parse-imf-date.test.d.ts +1 -0
  262. package/build/http-headers/parse-imf-date.test.js +31 -0
  263. package/build/http-headers/parse-imf-date.test.js.map +1 -0
  264. package/build/http-headers/parse-media-type.d.ts +8 -0
  265. package/build/http-headers/parse-media-type.js +21 -0
  266. package/build/http-headers/parse-media-type.js.map +1 -0
  267. package/build/http-headers/parse-media-type.test.d.ts +1 -0
  268. package/build/http-headers/parse-media-type.test.js +39 -0
  269. package/build/http-headers/parse-media-type.test.js.map +1 -0
  270. package/build/http-headers/user-agent.d.ts +35 -0
  271. package/build/http-headers/user-agent.js +45 -0
  272. package/build/http-headers/user-agent.js.map +1 -0
  273. package/build/http-headers/user-agent.test.d.ts +1 -0
  274. package/build/http-headers/user-agent.test.js +27 -0
  275. package/build/http-headers/user-agent.test.js.map +1 -0
  276. package/build/index.d.ts +1 -1
  277. package/build/index.js +1 -1
  278. package/build/index.js.map +1 -1
  279. package/build/loaders/errors.d.ts +21 -0
  280. package/build/loaders/errors.js +45 -0
  281. package/build/loaders/errors.js.map +1 -0
  282. package/build/loaders/index.d.ts +5 -0
  283. package/build/loaders/index.js +5 -0
  284. package/build/loaders/index.js.map +1 -0
  285. package/build/loaders/jsonld-document-loader.d.ts +48 -0
  286. package/build/loaders/jsonld-document-loader.js +43 -0
  287. package/build/loaders/jsonld-document-loader.js.map +1 -0
  288. package/build/loaders/jsonld-document-loader.test.d.ts +1 -0
  289. package/build/loaders/jsonld-document-loader.test.js +111 -0
  290. package/build/loaders/jsonld-document-loader.test.js.map +1 -0
  291. package/build/loaders/schema-loader.d.ts +31 -0
  292. package/build/loaders/schema-loader.js +83 -0
  293. package/build/loaders/schema-loader.js.map +1 -0
  294. package/build/loaders/schema-loader.ssrf.test.d.ts +1 -0
  295. package/build/loaders/schema-loader.ssrf.test.js +55 -0
  296. package/build/loaders/schema-loader.ssrf.test.js.map +1 -0
  297. package/build/loaders/schema-loader.test.d.ts +1 -0
  298. package/build/loaders/schema-loader.test.js +217 -0
  299. package/build/loaders/schema-loader.test.js.map +1 -0
  300. package/build/multibase-digest/multibase-digest.d.ts +23 -0
  301. package/build/multibase-digest/multibase-digest.js +40 -0
  302. package/build/multibase-digest/multibase-digest.js.map +1 -1
  303. package/build/multibase-digest/multibase-digest.test.js +46 -0
  304. package/build/multibase-digest/multibase-digest.test.js.map +1 -1
  305. package/build/node/errors.d.ts +47 -0
  306. package/build/node/errors.js +86 -0
  307. package/build/node/errors.js.map +1 -0
  308. package/build/node/index.d.ts +3 -0
  309. package/build/node/index.js +4 -0
  310. package/build/node/index.js.map +1 -0
  311. package/build/node/is-private-ip.d.ts +45 -0
  312. package/build/node/is-private-ip.fail-closed.test.d.ts +1 -0
  313. package/build/node/is-private-ip.fail-closed.test.js +36 -0
  314. package/build/node/is-private-ip.fail-closed.test.js.map +1 -0
  315. package/build/node/is-private-ip.js +203 -0
  316. package/build/node/is-private-ip.js.map +1 -0
  317. package/build/node/is-private-ip.test.d.ts +1 -0
  318. package/build/node/is-private-ip.test.js +124 -0
  319. package/build/node/is-private-ip.test.js.map +1 -0
  320. package/build/node/validate-public-url.d.ts +81 -0
  321. package/build/node/validate-public-url.js +128 -0
  322. package/build/node/validate-public-url.js.map +1 -0
  323. package/build/node/validate-public-url.test.d.ts +1 -0
  324. package/build/node/validate-public-url.test.js +324 -0
  325. package/build/node/validate-public-url.test.js.map +1 -0
  326. package/build/resolvers/errors.d.ts +73 -0
  327. package/build/resolvers/errors.js +133 -0
  328. package/build/resolvers/errors.js.map +1 -0
  329. package/build/resolvers/index.d.ts +5 -0
  330. package/build/resolvers/index.js +6 -0
  331. package/build/resolvers/index.js.map +1 -0
  332. package/build/resolvers/resolve-document-if-changed.d.ts +48 -0
  333. package/build/resolvers/resolve-document-if-changed.js +42 -0
  334. package/build/resolvers/resolve-document-if-changed.js.map +1 -0
  335. package/build/resolvers/resolve-document-if-changed.test.d.ts +1 -0
  336. package/build/resolvers/resolve-document-if-changed.test.js +116 -0
  337. package/build/resolvers/resolve-document-if-changed.test.js.map +1 -0
  338. package/build/resolvers/resolve-document.d.ts +106 -0
  339. package/build/resolvers/resolve-document.integration.test.d.ts +1 -0
  340. package/build/resolvers/resolve-document.integration.test.js +108 -0
  341. package/build/resolvers/resolve-document.integration.test.js.map +1 -0
  342. package/build/resolvers/resolve-document.js +319 -0
  343. package/build/resolvers/resolve-document.js.map +1 -0
  344. package/build/resolvers/resolve-document.test.d.ts +1 -0
  345. package/build/resolvers/resolve-document.test.js +749 -0
  346. package/build/resolvers/resolve-document.test.js.map +1 -0
  347. package/build/resolvers/resolve-json-document.d.ts +43 -0
  348. package/build/resolvers/resolve-json-document.js +43 -0
  349. package/build/resolvers/resolve-json-document.js.map +1 -0
  350. package/build/resolvers/resolve-json-document.test.d.ts +1 -0
  351. package/build/resolvers/resolve-json-document.test.js +78 -0
  352. package/build/resolvers/resolve-json-document.test.js.map +1 -0
  353. package/build/structured-error.d.ts +49 -0
  354. package/build/structured-error.js +17 -0
  355. package/build/structured-error.js.map +1 -0
  356. package/build/structured-error.test.d.ts +1 -0
  357. package/build/structured-error.test.js +112 -0
  358. package/build/structured-error.test.js.map +1 -0
  359. package/build/validation/describe-jsonld-failure.d.ts +90 -0
  360. package/build/validation/describe-jsonld-failure.js +171 -0
  361. package/build/validation/describe-jsonld-failure.js.map +1 -0
  362. package/build/validation/describe-jsonld-failure.test.d.ts +1 -0
  363. package/build/validation/describe-jsonld-failure.test.js +226 -0
  364. package/build/validation/describe-jsonld-failure.test.js.map +1 -0
  365. package/build/validation/errors.d.ts +40 -0
  366. package/build/validation/errors.js +75 -0
  367. package/build/validation/errors.js.map +1 -0
  368. package/build/validation/index.d.ts +5 -0
  369. package/build/validation/index.js +5 -0
  370. package/build/validation/index.js.map +1 -0
  371. package/build/validation/validate-against-schemas.d.ts +22 -0
  372. package/build/validation/validate-against-schemas.js +65 -0
  373. package/build/validation/validate-against-schemas.js.map +1 -0
  374. package/build/validation/validate-against-schemas.test.d.ts +1 -0
  375. package/build/validation/validate-against-schemas.test.js +169 -0
  376. package/build/validation/validate-against-schemas.test.js.map +1 -0
  377. package/build/validation/validate-jsonld.context-cache.test.d.ts +1 -0
  378. package/build/validation/validate-jsonld.context-cache.test.js +32 -0
  379. package/build/validation/validate-jsonld.context-cache.test.js.map +1 -0
  380. package/build/validation/validate-jsonld.d.ts +59 -0
  381. package/build/validation/validate-jsonld.js +126 -0
  382. package/build/validation/validate-jsonld.js.map +1 -0
  383. package/build/validation/validate-jsonld.ssrf.test.d.ts +1 -0
  384. package/build/validation/validate-jsonld.ssrf.test.js +108 -0
  385. package/build/validation/validate-jsonld.ssrf.test.js.map +1 -0
  386. package/build/validation/validate-jsonld.test.d.ts +1 -0
  387. package/build/validation/validate-jsonld.test.js +257 -0
  388. package/build/validation/validate-jsonld.test.js.map +1 -0
  389. package/package.json +86 -5
@@ -0,0 +1,42 @@
1
+ import { resolveDocument } from './resolve-document.js';
2
+ /**
3
+ * Conditional-fetch wrapper around {@link resolveDocument} that implements
4
+ * the skip chain from ADR-033 §1.
5
+ *
6
+ * Three short-circuits, in order:
7
+ *
8
+ * 1. **`304 Not Modified`** from the upstream (driven by `If-None-Match`
9
+ * and `If-Modified-Since` headers built from `cached.etag` and
10
+ * `cached.lastModifiedHeader`).
11
+ * 2. **Body-digest match** after a `200 OK` (the upstream ignored the
12
+ * conditional headers but returned the same content; compared against
13
+ * `cached.bodyDigest`).
14
+ * 3. Otherwise, the fresh {@link LoadResult} is returned under the
15
+ * `loaded` discriminator.
16
+ *
17
+ * Errors from the underlying {@link resolveDocument} propagate unchanged.
18
+ */
19
+ export async function resolveDocumentIfChanged(url, cached, options) {
20
+ // HTTP header names are case-insensitive on the wire, but a plain
21
+ // `Record<string, string>` is not: a caller-supplied `'if-none-match'`
22
+ // and our `'If-None-Match'` would survive as two distinct keys and
23
+ // undici would emit both. Normalise every key to lower-case so the
24
+ // cached validator wins cleanly.
25
+ const conditionalHeaders = {};
26
+ for (const [key, value] of Object.entries(options?.headers ?? {})) {
27
+ conditionalHeaders[key.toLowerCase()] = value;
28
+ }
29
+ if (cached.etag)
30
+ conditionalHeaders['if-none-match'] = cached.etag;
31
+ if (cached.lastModifiedHeader)
32
+ conditionalHeaders['if-modified-since'] = cached.lastModifiedHeader;
33
+ const result = await resolveDocument(url, { ...options, headers: conditionalHeaders });
34
+ if (result.status === 304) {
35
+ return { kind: 'unchanged' };
36
+ }
37
+ if (cached.bodyDigest && result.bodyDigest.toString() === cached.bodyDigest.toString()) {
38
+ return { kind: 'unchanged' };
39
+ }
40
+ return { kind: 'loaded', result };
41
+ }
42
+ //# sourceMappingURL=resolve-document-if-changed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-document-if-changed.js","sourceRoot":"","sources":["../../src/resolvers/resolve-document-if-changed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAgD,MAAM,uBAAuB,CAAC;AA2BtG;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,GAAW,EACX,MAAsB,EACtB,OAAgC;IAEhC,kEAAkE;IAClE,uEAAuE;IACvE,mEAAmE;IACnE,mEAAmE;IACnE,iCAAiC;IACjC,MAAM,kBAAkB,GAA2B,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAClE,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;IAChD,CAAC;IACD,IAAI,MAAM,CAAC,IAAI;QAAE,kBAAkB,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;IACnE,IAAI,MAAM,CAAC,kBAAkB;QAAE,kBAAkB,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAEnG,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAEvF,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;QACvF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { jest } from '@jest/globals';
2
+ import { MultibaseDigest } from '../multibase-digest/index.js';
3
+ import { ResolverNetworkError } from './errors.js';
4
+ const resolveDocument = jest.fn();
5
+ jest.unstable_mockModule('./resolve-document.js', () => ({
6
+ resolveDocument,
7
+ }));
8
+ const { resolveDocumentIfChanged } = await import('./resolve-document-if-changed.js');
9
+ async function digestOf(text) {
10
+ return MultibaseDigest.fromData(new TextEncoder().encode(text), { algorithm: 'sha2-256', base: 'base58btc' });
11
+ }
12
+ function loadResult(overrides) {
13
+ return {
14
+ status: 200,
15
+ body: new Uint8Array(0),
16
+ finalUrl: '',
17
+ bodyDigest: overrides.bodyDigest,
18
+ ...overrides,
19
+ };
20
+ }
21
+ describe('resolveDocumentIfChanged', () => {
22
+ beforeEach(() => {
23
+ resolveDocument.mockReset();
24
+ });
25
+ describe('conditional headers', () => {
26
+ it('sends If-None-Match when cached.etag is supplied', async () => {
27
+ resolveDocument.mockResolvedValue(loadResult({ status: 304, bodyDigest: await digestOf('') }));
28
+ await resolveDocumentIfChanged('https://example.com/', { etag: '"abc"' });
29
+ const passedOptions = resolveDocument.mock.calls[0][1];
30
+ expect(passedOptions.headers['if-none-match']).toBe('"abc"');
31
+ });
32
+ it('sends If-Modified-Since when cached.lastModifiedHeader is supplied', async () => {
33
+ const ts = 'Wed, 21 May 2026 12:00:00 GMT';
34
+ resolveDocument.mockResolvedValue(loadResult({ status: 304, bodyDigest: await digestOf('') }));
35
+ await resolveDocumentIfChanged('https://example.com/', { lastModifiedHeader: ts });
36
+ const passedOptions = resolveDocument.mock.calls[0][1];
37
+ expect(passedOptions.headers['if-modified-since']).toBe(ts);
38
+ });
39
+ it('preserves caller-supplied headers alongside conditional ones', async () => {
40
+ resolveDocument.mockResolvedValue(loadResult({ status: 304, bodyDigest: await digestOf('') }));
41
+ await resolveDocumentIfChanged('https://example.com/', { etag: '"abc"' }, { headers: { Accept: 'application/json' } });
42
+ const passedOptions = resolveDocument.mock.calls[0][1];
43
+ expect(passedOptions.headers['accept']).toBe('application/json');
44
+ expect(passedOptions.headers['if-none-match']).toBe('"abc"');
45
+ });
46
+ it('forwards private permission alongside conditional headers', async () => {
47
+ resolveDocument.mockResolvedValue(loadResult({ status: 304, bodyDigest: await digestOf('') }));
48
+ await resolveDocumentIfChanged('https://example.com/', { etag: '"abc"' }, { allowPrivateAddresses: true });
49
+ const passedOptions = resolveDocument.mock.calls[0][1];
50
+ expect(passedOptions.allowPrivateAddresses).toBe(true);
51
+ expect(passedOptions.headers['if-none-match']).toBe('"abc"');
52
+ });
53
+ it('does not emit duplicate conditional headers when the caller supplies a differently-cased variant', async () => {
54
+ resolveDocument.mockResolvedValue(loadResult({ status: 304, bodyDigest: await digestOf('') }));
55
+ await resolveDocumentIfChanged('https://example.com/', { etag: '"new"' },
56
+ // Caller passes a stale variant under a differently-cased key.
57
+ // The cached etag must win and only one normalised header lands on the wire.
58
+ { headers: { 'IF-NONE-MATCH': '"stale"' } });
59
+ const passedOptions = resolveDocument.mock.calls[0][1];
60
+ const keys = Object.keys(passedOptions.headers);
61
+ const ifNoneMatchKeys = keys.filter((k) => k.toLowerCase() === 'if-none-match');
62
+ expect(ifNoneMatchKeys).toEqual(['if-none-match']);
63
+ expect(passedOptions.headers['if-none-match']).toBe('"new"');
64
+ });
65
+ });
66
+ describe('skip chain', () => {
67
+ it('returns { kind: "unchanged" } on a 304 response', async () => {
68
+ resolveDocument.mockResolvedValue(loadResult({ status: 304, bodyDigest: await digestOf('') }));
69
+ await expect(resolveDocumentIfChanged('https://example.com/', { etag: '"abc"' })).resolves.toEqual({
70
+ kind: 'unchanged',
71
+ });
72
+ });
73
+ it('returns { kind: "unchanged" } on a 200 response whose body digest matches the cached one', async () => {
74
+ const digest = await digestOf('same content');
75
+ resolveDocument.mockResolvedValue(loadResult({ status: 200, body: new TextEncoder().encode('same content'), bodyDigest: digest }));
76
+ await expect(resolveDocumentIfChanged('https://example.com/', { bodyDigest: digest })).resolves.toEqual({
77
+ kind: 'unchanged',
78
+ });
79
+ });
80
+ it('returns { kind: "loaded", result } on a 200 response with a different body digest', async () => {
81
+ const oldDigest = await digestOf('old content');
82
+ const newDigest = await digestOf('new content');
83
+ const result = loadResult({
84
+ status: 200,
85
+ body: new TextEncoder().encode('new content'),
86
+ finalUrl: 'https://example.com/',
87
+ bodyDigest: newDigest,
88
+ });
89
+ resolveDocument.mockResolvedValue(result);
90
+ await expect(resolveDocumentIfChanged('https://example.com/', { bodyDigest: oldDigest })).resolves.toEqual({
91
+ kind: 'loaded',
92
+ result,
93
+ });
94
+ });
95
+ it('returns { kind: "loaded", result } on a 200 response when no cached body digest is supplied', async () => {
96
+ const result = loadResult({
97
+ status: 200,
98
+ body: new TextEncoder().encode('fresh'),
99
+ finalUrl: 'https://example.com/',
100
+ bodyDigest: await digestOf('fresh'),
101
+ });
102
+ resolveDocument.mockResolvedValue(result);
103
+ await expect(resolveDocumentIfChanged('https://example.com/', { etag: '"abc"' })).resolves.toEqual({
104
+ kind: 'loaded',
105
+ result,
106
+ });
107
+ });
108
+ });
109
+ describe('error propagation', () => {
110
+ it('propagates errors thrown by the underlying resolveDocument call', async () => {
111
+ resolveDocument.mockRejectedValue(new ResolverNetworkError('https://example.com/', new Error('boom')));
112
+ await expect(resolveDocumentIfChanged('https://example.com/', {})).rejects.toBeInstanceOf(ResolverNetworkError);
113
+ });
114
+ });
115
+ });
116
+ //# sourceMappingURL=resolve-document-if-changed.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-document-if-changed.test.js","sourceRoot":"","sources":["../../src/resolvers/resolve-document-if-changed.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { MultibaseDigest } from '../multibase-digest/index.js';
2
+ import { type PublicUrlLookup } from '../node/index.js';
3
+ /**
4
+ * Defaults applied by {@link resolveDocument} (and, via composition,
5
+ * by {@link import('./resolve-document-if-changed.js').resolveDocumentIfChanged})
6
+ * when the caller does not supply a value.
7
+ */
8
+ export declare const RESOLVER_DEFAULTS: {
9
+ /** Body-size cap in bytes; exceeding throws {@link ResolverTooLargeError}. */
10
+ readonly maxResponseBytes: 1048576;
11
+ /** Total wait for asynchronous DNS and fetch work in milliseconds. Synchronous work cannot be interrupted, and DNS itself is not cancelled. */
12
+ readonly totalTimeoutMs: 10000;
13
+ /** Maximum additional hops after the initial request; exceeding throws {@link ResolverTooManyRedirectsError}. */
14
+ readonly maxRedirects: 3;
15
+ /** Multibase digest algorithm used to hash response bodies. */
16
+ readonly digestAlgorithm: "sha2-256";
17
+ /** Multibase encoding used for response body digests. */
18
+ readonly digestEncoding: "base58btc";
19
+ };
20
+ /**
21
+ * Result of a fetch that produced a final response (any non-redirect status,
22
+ * including `304 Not Modified`).
23
+ *
24
+ * Only an allowlisted subset of response headers is exposed (the ones
25
+ * downstream consumers need: `etag` and `last-modified` for the conditional-
26
+ * fetch skip chain, `content-type` for body-type checks).
27
+ *
28
+ * All fields are `readonly`: a `LoadResult` is a frozen snapshot of one
29
+ * fetch and must not be mutated by consumers.
30
+ */
31
+ export interface LoadResult {
32
+ /** Final URL after redirect chasing (matches `url` when there were no redirects). */
33
+ readonly finalUrl: string;
34
+ /** HTTP status code of the final response (the redirect chain terminator, or `304`). */
35
+ readonly status: number;
36
+ /** Raw response body bytes. */
37
+ readonly body: Uint8Array;
38
+ /** Multibase digest of {@link body} (algorithm/encoding per {@link RESOLVER_DEFAULTS}). */
39
+ readonly bodyDigest: MultibaseDigest;
40
+ /** The response's `ETag` header if present. */
41
+ readonly etag?: string;
42
+ /** The response's `Last-Modified` header if present. */
43
+ readonly lastModified?: string;
44
+ /** The response's `Content-Type` header if present. */
45
+ readonly contentType?: string;
46
+ }
47
+ /**
48
+ * Options accepted by {@link resolveDocument} and
49
+ * {@link import('./resolve-document-if-changed.js').resolveDocumentIfChanged}.
50
+ *
51
+ * Header keys are case-insensitive on the wire; `resolveDocumentIfChanged`
52
+ * lowercases all keys before merging and reserves `if-none-match` /
53
+ * `if-modified-since` for its conditional-fetch wiring.
54
+ */
55
+ export interface ResolveDocumentOptions {
56
+ /** Override {@link RESOLVER_DEFAULTS.maxResponseBytes}. */
57
+ maxResponseBytes?: number;
58
+ /** Override {@link RESOLVER_DEFAULTS.totalTimeoutMs}. */
59
+ totalTimeoutMs?: number;
60
+ /** Override {@link RESOLVER_DEFAULTS.maxRedirects}. */
61
+ maxRedirects?: number;
62
+ /** Additional headers to send with the request (e.g. `Accept`). */
63
+ headers?: Record<string, string>;
64
+ /** Allowed URL schemes (forwarded to {@link import('../node/index.js').validatePublicUrl}). */
65
+ allowedSchemes?: readonly string[];
66
+ /** Permit private and reserved destinations while retaining every other guard. */
67
+ allowPrivateAddresses?: boolean;
68
+ /**
69
+ * Optional hostname lookup for tests and diagnostics. This is not a policy
70
+ * switch: its answers still pass through `validatePublicUrl`'s hostname and
71
+ * address guard before they reach the pinned connector. When omitted, the
72
+ * existing `node:dns/promises` lookup is used.
73
+ */
74
+ lookup?: PublicUrlLookup;
75
+ }
76
+ /**
77
+ * Fetches `url` with the standard SSRF / size / timeout / redirect guards
78
+ * applied, returning the response body + metadata as a {@link LoadResult}.
79
+ *
80
+ * Each redirect hop is re-validated through
81
+ * {@link import('../node/index.js').validatePublicUrl}, and the connection to
82
+ * each hop is pinned to the set of addresses its validation resolved, so an
83
+ * upstream cannot rebind its hostname between check and connect. Node's
84
+ * address selection tries those addresses within the request budget, so a
85
+ * `localhost` that resolves to both `::1` and `127.0.0.1` reaches whichever
86
+ * listens. Private and reserved destinations remain rejected unless
87
+ * `allowPrivateAddresses` is exactly true.
88
+ *
89
+ * Only two awaits convert a foreign rejection into a resolver error: the undici
90
+ * fetch and the body read. Every other throw inside this function, whether a
91
+ * guard error or a defect in this module, propagates exactly as thrown. That
92
+ * is the contract #995 settled, and it is why `verify-did-web.ts:104` now
93
+ * surfaces a resolver defect to its caller instead of reporting it as a
94
+ * retryable network fault.
95
+ *
96
+ * @throws {UrlValidationError} for URL / scheme / hostname / DNS / private-address rejections from `validatePublicUrl`, propagated unwrapped.
97
+ * @throws {ResolverNetworkError} when the fetch rejects before producing a response, or when a mid-body read rejects, and the rejection was not classified as this request's timeout; a non-abort-shaped rejection arriving after the deadline is also reported here.
98
+ * @throws {ResolverHttpError} on a non-2xx response status (with `.status`).
99
+ * @throws {ResolverTooLargeError} when the body exceeds the size cap (with `.limit`).
100
+ * @throws {ResolverTooManyRedirectsError} when the redirect chain exceeds the hop cap (with `.limit`, and `.lastHopUrl` for the hop that answered the exhausting redirect).
101
+ * @throws {ResolverTimedOutError} before a hop or while the guard was waiting on DNS, once the deadline has passed; in flight or mid-body, when this request's abort is what the failing call observed (with `.timeoutMs`).
102
+ * @throws {ResolverRedirectMissingLocationError} for a 3xx with no / unparseable Location header.
103
+ *
104
+ * @see https://owasp.org/www-community/attacks/Server_Side_Request_Forgery
105
+ */
106
+ export declare function resolveDocument(url: string, options?: ResolveDocumentOptions): Promise<LoadResult>;
@@ -0,0 +1,108 @@
1
+ import { createServer } from 'node:http';
2
+ import { resolveJsonDocument } from './resolve-json-document.js';
3
+ const listeners = [];
4
+ async function startListener(host, port, handler) {
5
+ const requests = [];
6
+ const server = createServer((request, response) => {
7
+ requests.push(request.url ?? '');
8
+ handler(request, response);
9
+ });
10
+ await new Promise((resolve, reject) => {
11
+ server.once('error', reject);
12
+ server.listen(port, host, resolve);
13
+ });
14
+ const address = server.address();
15
+ if (!address || typeof address === 'string') {
16
+ throw new Error(`Listener did not expose an address for ${host}`);
17
+ }
18
+ const { port: boundPort } = address;
19
+ const listener = {
20
+ host,
21
+ port: boundPort,
22
+ requests,
23
+ close: () => new Promise((resolve, reject) => {
24
+ server.close((error) => (error ? reject(error) : resolve()));
25
+ }),
26
+ };
27
+ listeners.push(listener);
28
+ return listener;
29
+ }
30
+ function jsonResponse(response, value) {
31
+ response.writeHead(200, { 'content-type': 'application/json' });
32
+ response.end(JSON.stringify(value));
33
+ }
34
+ function address(host) {
35
+ return { address: host, family: host.includes(':') ? 6 : 4 };
36
+ }
37
+ function controlledLookup(answers, calls) {
38
+ return async (hostname, _options) => {
39
+ calls.push(hostname);
40
+ const answer = answers.shift();
41
+ if (!answer)
42
+ throw new Error(`Unexpected lookup for ${hostname}`);
43
+ return answer;
44
+ };
45
+ }
46
+ afterEach(async () => {
47
+ await Promise.all(listeners.splice(0).map((listener) => listener.close()));
48
+ });
49
+ describe('resolveJsonDocument real socket pinning', () => {
50
+ // Both listeners use loopback addresses. The explicit private-address
51
+ // allowance is only for this local fixture; the callback's answers still
52
+ // pass through the resolver's hostname and address guard.
53
+ it('connects to the address validated first even when the next lookup answer changes', async () => {
54
+ const listenerA = await startListener('127.0.0.1', 0, (_request, response) => {
55
+ jsonResponse(response, { listener: 'A' });
56
+ });
57
+ const listenerB = await startListener('::1', listenerA.port, (_request, response) => {
58
+ jsonResponse(response, { listener: 'B' });
59
+ });
60
+ const lookupCalls = [];
61
+ const lookup = controlledLookup([[address(listenerA.host)], [address(listenerB.host)]], lookupCalls);
62
+ const result = await resolveJsonDocument(`http://accepted.test:${listenerA.port}/document`, {
63
+ allowPrivateAddresses: true,
64
+ lookup,
65
+ });
66
+ expect(result.json).toEqual({ listener: 'A' });
67
+ expect(listenerA.requests).toEqual(['/document']);
68
+ expect(listenerB.requests).toEqual([]);
69
+ expect(lookupCalls).toEqual(['accepted.test']);
70
+ });
71
+ it('re-validates and re-pins a redirect hop to the second listener', async () => {
72
+ let redirectLocation = '';
73
+ const listenerA = await startListener('127.0.0.1', 0, (_request, response) => {
74
+ response.writeHead(302, { location: redirectLocation });
75
+ response.end();
76
+ });
77
+ const listenerB = await startListener('::1', listenerA.port, (_request, response) => {
78
+ jsonResponse(response, { listener: 'B' });
79
+ });
80
+ redirectLocation = `http://redirect-target.test:${listenerA.port}/final`;
81
+ const lookupCalls = [];
82
+ const lookup = controlledLookup([[address(listenerA.host)], [address(listenerB.host)]], lookupCalls);
83
+ const result = await resolveJsonDocument(`http://redirect-source.test:${listenerA.port}/start`, {
84
+ allowPrivateAddresses: true,
85
+ lookup,
86
+ });
87
+ expect(result.json).toEqual({ listener: 'B' });
88
+ expect(listenerA.requests).toEqual(['/start']);
89
+ expect(listenerB.requests).toEqual(['/final']);
90
+ expect(lookupCalls).toEqual(['redirect-source.test', 'redirect-target.test']);
91
+ });
92
+ it('tries the second validated address when the first address refuses the connection', async () => {
93
+ const listenerB = await startListener('127.0.0.1', 0, (_request, response) => {
94
+ jsonResponse(response, { listener: 'B' });
95
+ });
96
+ const refusedAddress = '::1';
97
+ const lookupCalls = [];
98
+ const lookup = controlledLookup([[address(refusedAddress), address(listenerB.host)]], lookupCalls);
99
+ const result = await resolveJsonDocument(`http://failover.test:${listenerB.port}/document`, {
100
+ allowPrivateAddresses: true,
101
+ lookup,
102
+ });
103
+ expect(result.json).toEqual({ listener: 'B' });
104
+ expect(listenerB.requests).toEqual(['/document']);
105
+ expect(lookupCalls).toEqual(['failover.test']);
106
+ });
107
+ });
108
+ //# sourceMappingURL=resolve-document.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-document.integration.test.js","sourceRoot":"","sources":["../../src/resolvers/resolve-document.integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AAGpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAWjE,MAAM,SAAS,GAAuB,EAAE,CAAC;AAEzC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,IAAY,EAAE,OAAuB;IAC9E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAChD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAsB,CAAC;IACnD,MAAM,QAAQ,GAAG;QACf,IAAI;QACJ,IAAI,EAAE,SAAS;QACf,QAAQ;QACR,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC;KACL,CAAC;IACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,QAAwB,EAAE,KAA6B;IAC3E,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,gBAAgB,CACvB,OAA0B,EAC1B,KAAe;IAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;QAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,sEAAsE;IACtE,yEAAyE;IACzE,0DAA0D;IAC1D,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAC3E,YAAY,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAClF,YAAY,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAErG,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,wBAAwB,SAAS,CAAC,IAAI,WAAW,EAAE;YAC1F,qBAAqB,EAAE,IAAI;YAC3B,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAC3E,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACxD,QAAQ,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAClF,YAAY,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,gBAAgB,GAAG,+BAA+B,SAAS,CAAC,IAAI,QAAQ,CAAC;QACzE,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAErG,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,+BAA+B,SAAS,CAAC,IAAI,QAAQ,EAAE;YAC9F,qBAAqB,EAAE,IAAI;YAC3B,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,sBAAsB,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAC3E,YAAY,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,KAAK,CAAC;QAC7B,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAEnG,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,wBAAwB,SAAS,CAAC,IAAI,WAAW,EAAE;YAC1F,qBAAqB,EAAE,IAAI;YAC3B,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}