@scriptc/runtime 0.0.0 → 0.0.2

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 (416) hide show
  1. package/LICENSE +202 -0
  2. package/package.json +16 -6
  3. package/src/scr_array.c +488 -0
  4. package/src/scr_assert.c +1393 -0
  5. package/src/scr_async.c +2593 -0
  6. package/src/scr_async_dyn.c +607 -0
  7. package/src/scr_bytes.c +1425 -0
  8. package/src/scr_bytes_io.c +161 -0
  9. package/src/scr_child.c +3587 -0
  10. package/src/scr_closure.c +214 -0
  11. package/src/scr_console.c +143 -0
  12. package/src/scr_cycle.c +218 -0
  13. package/src/scr_dc.c +805 -0
  14. package/src/scr_dgram.c +1007 -0
  15. package/src/scr_dyn_handle.c +154 -0
  16. package/src/scr_dyn_invoke.c +644 -0
  17. package/src/scr_error.c +332 -0
  18. package/src/scr_events.c +714 -0
  19. package/src/scr_events_emitter.c +699 -0
  20. package/src/scr_exception.c +242 -0
  21. package/src/scr_fetch.c +1130 -0
  22. package/src/scr_fetch_curl.c +654 -0
  23. package/src/scr_http.c +3482 -0
  24. package/src/scr_http2.c +3030 -0
  25. package/src/scr_inspect.c +803 -0
  26. package/src/scr_inspect_island.c +51 -0
  27. package/src/scr_island.c +9363 -0
  28. package/src/scr_json.c +2151 -0
  29. package/src/scr_lib.c +3612 -0
  30. package/src/scr_loop_epoll.c +241 -0
  31. package/src/scr_loop_kqueue.c +121 -0
  32. package/src/scr_loop_wsapoll.c +208 -0
  33. package/src/scr_map.c +591 -0
  34. package/src/scr_net.c +3017 -0
  35. package/src/scr_net_island.c +458 -0
  36. package/src/scr_number.c +115 -0
  37. package/src/scr_object.c +25 -0
  38. package/src/scr_path.c +1266 -0
  39. package/src/scr_platform.h +119 -0
  40. package/src/scr_readline.c +287 -0
  41. package/src/scr_regex.c +1080 -0
  42. package/src/scr_runtime.h +5046 -0
  43. package/src/scr_stream.c +2877 -0
  44. package/src/scr_string.c +1264 -0
  45. package/src/scr_symbol.c +132 -0
  46. package/src/scr_test.c +662 -0
  47. package/src/scr_tls.c +1520 -0
  48. package/src/scr_union.c +105 -0
  49. package/src/scr_url.c +911 -0
  50. package/src/scr_url_internal.h +29 -0
  51. package/src/scr_url_params.c +561 -0
  52. package/src/scr_watch.c +568 -0
  53. package/src/scr_web.c +1778 -0
  54. package/src/scr_win.c +76 -0
  55. package/src/scr_zlib.c +197 -0
  56. package/src/scr_zlib_island.c +15 -0
  57. package/vendor/README.md +52 -0
  58. package/vendor/curl/COPYRIGHT +534 -0
  59. package/vendor/curl/include/curl/curl.h +3214 -0
  60. package/vendor/curl/include/curl/curlver.h +79 -0
  61. package/vendor/curl/include/curl/easy.h +125 -0
  62. package/vendor/curl/include/curl/header.h +74 -0
  63. package/vendor/curl/include/curl/mprintf.h +52 -0
  64. package/vendor/curl/include/curl/multi.h +460 -0
  65. package/vendor/curl/include/curl/options.h +70 -0
  66. package/vendor/curl/include/curl/stdcheaders.h +35 -0
  67. package/vendor/curl/include/curl/system.h +508 -0
  68. package/vendor/curl/include/curl/typecheck-gcc.h +716 -0
  69. package/vendor/curl/include/curl/urlapi.h +149 -0
  70. package/vendor/curl/include/curl/websockets.h +84 -0
  71. package/vendor/mbedtls/LICENSE +553 -0
  72. package/vendor/mbedtls/include/CMakeLists.txt +22 -0
  73. package/vendor/mbedtls/include/mbedtls/aes.h +631 -0
  74. package/vendor/mbedtls/include/mbedtls/aria.h +343 -0
  75. package/vendor/mbedtls/include/mbedtls/asn1.h +642 -0
  76. package/vendor/mbedtls/include/mbedtls/asn1write.h +390 -0
  77. package/vendor/mbedtls/include/mbedtls/base64.h +82 -0
  78. package/vendor/mbedtls/include/mbedtls/bignum.h +1088 -0
  79. package/vendor/mbedtls/include/mbedtls/block_cipher.h +76 -0
  80. package/vendor/mbedtls/include/mbedtls/build_info.h +194 -0
  81. package/vendor/mbedtls/include/mbedtls/camellia.h +305 -0
  82. package/vendor/mbedtls/include/mbedtls/ccm.h +526 -0
  83. package/vendor/mbedtls/include/mbedtls/chacha20.h +209 -0
  84. package/vendor/mbedtls/include/mbedtls/chachapoly.h +351 -0
  85. package/vendor/mbedtls/include/mbedtls/check_config.h +1149 -0
  86. package/vendor/mbedtls/include/mbedtls/cipher.h +1250 -0
  87. package/vendor/mbedtls/include/mbedtls/cmac.h +246 -0
  88. package/vendor/mbedtls/include/mbedtls/compat-2.x.h +46 -0
  89. package/vendor/mbedtls/include/mbedtls/config_adjust_legacy_crypto.h +578 -0
  90. package/vendor/mbedtls/include/mbedtls/config_adjust_legacy_from_psa.h +873 -0
  91. package/vendor/mbedtls/include/mbedtls/config_adjust_psa_from_legacy.h +359 -0
  92. package/vendor/mbedtls/include/mbedtls/config_adjust_psa_superset_legacy.h +145 -0
  93. package/vendor/mbedtls/include/mbedtls/config_adjust_ssl.h +91 -0
  94. package/vendor/mbedtls/include/mbedtls/config_adjust_x509.h +35 -0
  95. package/vendor/mbedtls/include/mbedtls/config_psa.h +61 -0
  96. package/vendor/mbedtls/include/mbedtls/constant_time.h +36 -0
  97. package/vendor/mbedtls/include/mbedtls/ctr_drbg.h +596 -0
  98. package/vendor/mbedtls/include/mbedtls/debug.h +156 -0
  99. package/vendor/mbedtls/include/mbedtls/des.h +385 -0
  100. package/vendor/mbedtls/include/mbedtls/dhm.h +972 -0
  101. package/vendor/mbedtls/include/mbedtls/ecdh.h +455 -0
  102. package/vendor/mbedtls/include/mbedtls/ecdsa.h +674 -0
  103. package/vendor/mbedtls/include/mbedtls/ecjpake.h +298 -0
  104. package/vendor/mbedtls/include/mbedtls/ecp.h +1517 -0
  105. package/vendor/mbedtls/include/mbedtls/entropy.h +274 -0
  106. package/vendor/mbedtls/include/mbedtls/error.h +201 -0
  107. package/vendor/mbedtls/include/mbedtls/gcm.h +387 -0
  108. package/vendor/mbedtls/include/mbedtls/hkdf.h +124 -0
  109. package/vendor/mbedtls/include/mbedtls/hmac_drbg.h +434 -0
  110. package/vendor/mbedtls/include/mbedtls/lms.h +440 -0
  111. package/vendor/mbedtls/include/mbedtls/mbedtls_config.h +4446 -0
  112. package/vendor/mbedtls/include/mbedtls/md.h +526 -0
  113. package/vendor/mbedtls/include/mbedtls/md5.h +190 -0
  114. package/vendor/mbedtls/include/mbedtls/memory_buffer_alloc.h +142 -0
  115. package/vendor/mbedtls/include/mbedtls/net_sockets.h +299 -0
  116. package/vendor/mbedtls/include/mbedtls/nist_kw.h +166 -0
  117. package/vendor/mbedtls/include/mbedtls/oid.h +727 -0
  118. package/vendor/mbedtls/include/mbedtls/pem.h +160 -0
  119. package/vendor/mbedtls/include/mbedtls/pk.h +1303 -0
  120. package/vendor/mbedtls/include/mbedtls/pkcs12.h +186 -0
  121. package/vendor/mbedtls/include/mbedtls/pkcs5.h +198 -0
  122. package/vendor/mbedtls/include/mbedtls/pkcs7.h +252 -0
  123. package/vendor/mbedtls/include/mbedtls/platform.h +516 -0
  124. package/vendor/mbedtls/include/mbedtls/platform_time.h +79 -0
  125. package/vendor/mbedtls/include/mbedtls/platform_util.h +247 -0
  126. package/vendor/mbedtls/include/mbedtls/poly1305.h +168 -0
  127. package/vendor/mbedtls/include/mbedtls/private_access.h +20 -0
  128. package/vendor/mbedtls/include/mbedtls/psa_util.h +207 -0
  129. package/vendor/mbedtls/include/mbedtls/ripemd160.h +136 -0
  130. package/vendor/mbedtls/include/mbedtls/rsa.h +1170 -0
  131. package/vendor/mbedtls/include/mbedtls/sha1.h +219 -0
  132. package/vendor/mbedtls/include/mbedtls/sha256.h +200 -0
  133. package/vendor/mbedtls/include/mbedtls/sha3.h +172 -0
  134. package/vendor/mbedtls/include/mbedtls/sha512.h +208 -0
  135. package/vendor/mbedtls/include/mbedtls/ssl.h +5887 -0
  136. package/vendor/mbedtls/include/mbedtls/ssl_cache.h +187 -0
  137. package/vendor/mbedtls/include/mbedtls/ssl_ciphersuites.h +482 -0
  138. package/vendor/mbedtls/include/mbedtls/ssl_cookie.h +106 -0
  139. package/vendor/mbedtls/include/mbedtls/ssl_ticket.h +199 -0
  140. package/vendor/mbedtls/include/mbedtls/threading.h +167 -0
  141. package/vendor/mbedtls/include/mbedtls/timing.h +94 -0
  142. package/vendor/mbedtls/include/mbedtls/version.h +78 -0
  143. package/vendor/mbedtls/include/mbedtls/x509.h +500 -0
  144. package/vendor/mbedtls/include/mbedtls/x509_crl.h +184 -0
  145. package/vendor/mbedtls/include/mbedtls/x509_crt.h +1208 -0
  146. package/vendor/mbedtls/include/mbedtls/x509_csr.h +382 -0
  147. package/vendor/mbedtls/include/psa/build_info.h +20 -0
  148. package/vendor/mbedtls/include/psa/crypto.h +4998 -0
  149. package/vendor/mbedtls/include/psa/crypto_adjust_auto_enabled.h +31 -0
  150. package/vendor/mbedtls/include/psa/crypto_adjust_config_dependencies.h +51 -0
  151. package/vendor/mbedtls/include/psa/crypto_adjust_config_key_pair_types.h +101 -0
  152. package/vendor/mbedtls/include/psa/crypto_adjust_config_synonyms.h +49 -0
  153. package/vendor/mbedtls/include/psa/crypto_builtin_composites.h +214 -0
  154. package/vendor/mbedtls/include/psa/crypto_builtin_key_derivation.h +118 -0
  155. package/vendor/mbedtls/include/psa/crypto_builtin_primitives.h +114 -0
  156. package/vendor/mbedtls/include/psa/crypto_compat.h +230 -0
  157. package/vendor/mbedtls/include/psa/crypto_config.h +145 -0
  158. package/vendor/mbedtls/include/psa/crypto_driver_common.h +44 -0
  159. package/vendor/mbedtls/include/psa/crypto_driver_contexts_composites.h +151 -0
  160. package/vendor/mbedtls/include/psa/crypto_driver_contexts_key_derivation.h +52 -0
  161. package/vendor/mbedtls/include/psa/crypto_driver_contexts_primitives.h +105 -0
  162. package/vendor/mbedtls/include/psa/crypto_extra.h +2145 -0
  163. package/vendor/mbedtls/include/psa/crypto_legacy.h +88 -0
  164. package/vendor/mbedtls/include/psa/crypto_platform.h +102 -0
  165. package/vendor/mbedtls/include/psa/crypto_se_driver.h +1383 -0
  166. package/vendor/mbedtls/include/psa/crypto_sizes.h +1319 -0
  167. package/vendor/mbedtls/include/psa/crypto_struct.h +527 -0
  168. package/vendor/mbedtls/include/psa/crypto_types.h +508 -0
  169. package/vendor/mbedtls/include/psa/crypto_values.h +2782 -0
  170. package/vendor/mbedtls/library/aes.c +2294 -0
  171. package/vendor/mbedtls/library/aesce.c +624 -0
  172. package/vendor/mbedtls/library/aesce.h +136 -0
  173. package/vendor/mbedtls/library/aesni.c +846 -0
  174. package/vendor/mbedtls/library/aesni.h +162 -0
  175. package/vendor/mbedtls/library/alignment.h +704 -0
  176. package/vendor/mbedtls/library/aria.c +969 -0
  177. package/vendor/mbedtls/library/asn1parse.c +468 -0
  178. package/vendor/mbedtls/library/asn1write.c +440 -0
  179. package/vendor/mbedtls/library/base64.c +322 -0
  180. package/vendor/mbedtls/library/base64_internal.h +45 -0
  181. package/vendor/mbedtls/library/bignum.c +2583 -0
  182. package/vendor/mbedtls/library/bignum_core.c +1240 -0
  183. package/vendor/mbedtls/library/bignum_core.h +872 -0
  184. package/vendor/mbedtls/library/bignum_core_invasive.h +38 -0
  185. package/vendor/mbedtls/library/bignum_internal.h +122 -0
  186. package/vendor/mbedtls/library/bignum_mod.c +394 -0
  187. package/vendor/mbedtls/library/bignum_mod.h +452 -0
  188. package/vendor/mbedtls/library/bignum_mod_raw.c +276 -0
  189. package/vendor/mbedtls/library/bignum_mod_raw.h +416 -0
  190. package/vendor/mbedtls/library/bignum_mod_raw_invasive.h +34 -0
  191. package/vendor/mbedtls/library/block_cipher.c +207 -0
  192. package/vendor/mbedtls/library/block_cipher_internal.h +99 -0
  193. package/vendor/mbedtls/library/bn_mul.h +1094 -0
  194. package/vendor/mbedtls/library/camellia.c +1058 -0
  195. package/vendor/mbedtls/library/ccm.c +777 -0
  196. package/vendor/mbedtls/library/chacha20.c +563 -0
  197. package/vendor/mbedtls/library/chacha20_internal.h +23 -0
  198. package/vendor/mbedtls/library/chachapoly.c +487 -0
  199. package/vendor/mbedtls/library/check_crypto_config.h +136 -0
  200. package/vendor/mbedtls/library/cipher.c +1712 -0
  201. package/vendor/mbedtls/library/cipher_invasive.h +28 -0
  202. package/vendor/mbedtls/library/cipher_wrap.c +2482 -0
  203. package/vendor/mbedtls/library/cipher_wrap.h +178 -0
  204. package/vendor/mbedtls/library/cmac.c +1067 -0
  205. package/vendor/mbedtls/library/common.h +487 -0
  206. package/vendor/mbedtls/library/constant_time.c +247 -0
  207. package/vendor/mbedtls/library/constant_time_impl.h +541 -0
  208. package/vendor/mbedtls/library/constant_time_internal.h +579 -0
  209. package/vendor/mbedtls/library/ctr.h +35 -0
  210. package/vendor/mbedtls/library/ctr_drbg.c +1016 -0
  211. package/vendor/mbedtls/library/debug.c +475 -0
  212. package/vendor/mbedtls/library/debug_internal.h +185 -0
  213. package/vendor/mbedtls/library/des.c +1042 -0
  214. package/vendor/mbedtls/library/dhm.c +700 -0
  215. package/vendor/mbedtls/library/ecdh.c +696 -0
  216. package/vendor/mbedtls/library/ecdsa.c +858 -0
  217. package/vendor/mbedtls/library/ecjpake.c +1216 -0
  218. package/vendor/mbedtls/library/ecp.c +3674 -0
  219. package/vendor/mbedtls/library/ecp_curves.c +6125 -0
  220. package/vendor/mbedtls/library/ecp_curves_new.c +9 -0
  221. package/vendor/mbedtls/library/ecp_internal_alt.h +287 -0
  222. package/vendor/mbedtls/library/ecp_invasive.h +305 -0
  223. package/vendor/mbedtls/library/entropy.c +680 -0
  224. package/vendor/mbedtls/library/entropy_poll.c +233 -0
  225. package/vendor/mbedtls/library/entropy_poll.h +64 -0
  226. package/vendor/mbedtls/library/error.c +878 -0
  227. package/vendor/mbedtls/library/gcm.c +1330 -0
  228. package/vendor/mbedtls/library/hkdf.c +161 -0
  229. package/vendor/mbedtls/library/hmac_drbg.c +633 -0
  230. package/vendor/mbedtls/library/lmots.c +789 -0
  231. package/vendor/mbedtls/library/lmots.h +288 -0
  232. package/vendor/mbedtls/library/lms.c +778 -0
  233. package/vendor/mbedtls/library/md.c +1108 -0
  234. package/vendor/mbedtls/library/md5.c +426 -0
  235. package/vendor/mbedtls/library/md_psa.h +26 -0
  236. package/vendor/mbedtls/library/md_wrap.h +46 -0
  237. package/vendor/mbedtls/library/memory_buffer_alloc.c +751 -0
  238. package/vendor/mbedtls/library/mps_common.h +181 -0
  239. package/vendor/mbedtls/library/mps_error.h +89 -0
  240. package/vendor/mbedtls/library/mps_reader.c +538 -0
  241. package/vendor/mbedtls/library/mps_reader.h +366 -0
  242. package/vendor/mbedtls/library/mps_trace.c +112 -0
  243. package/vendor/mbedtls/library/mps_trace.h +154 -0
  244. package/vendor/mbedtls/library/net_sockets.c +694 -0
  245. package/vendor/mbedtls/library/nist_kw.c +729 -0
  246. package/vendor/mbedtls/library/oid.c +1166 -0
  247. package/vendor/mbedtls/library/padlock.c +157 -0
  248. package/vendor/mbedtls/library/padlock.h +111 -0
  249. package/vendor/mbedtls/library/pem.c +554 -0
  250. package/vendor/mbedtls/library/pk.c +1602 -0
  251. package/vendor/mbedtls/library/pk_ecc.c +261 -0
  252. package/vendor/mbedtls/library/pk_internal.h +241 -0
  253. package/vendor/mbedtls/library/pk_wrap.c +1618 -0
  254. package/vendor/mbedtls/library/pk_wrap.h +138 -0
  255. package/vendor/mbedtls/library/pkcs12.c +437 -0
  256. package/vendor/mbedtls/library/pkcs5.c +500 -0
  257. package/vendor/mbedtls/library/pkcs7.c +787 -0
  258. package/vendor/mbedtls/library/pkparse.c +1392 -0
  259. package/vendor/mbedtls/library/pkwrite.c +631 -0
  260. package/vendor/mbedtls/library/pkwrite.h +121 -0
  261. package/vendor/mbedtls/library/platform.c +402 -0
  262. package/vendor/mbedtls/library/platform_util.c +258 -0
  263. package/vendor/mbedtls/library/poly1305.c +492 -0
  264. package/vendor/mbedtls/library/psa_crypto.c +9532 -0
  265. package/vendor/mbedtls/library/psa_crypto_aead.c +646 -0
  266. package/vendor/mbedtls/library/psa_crypto_aead.h +499 -0
  267. package/vendor/mbedtls/library/psa_crypto_cipher.c +747 -0
  268. package/vendor/mbedtls/library/psa_crypto_cipher.h +316 -0
  269. package/vendor/mbedtls/library/psa_crypto_client.c +22 -0
  270. package/vendor/mbedtls/library/psa_crypto_core.h +983 -0
  271. package/vendor/mbedtls/library/psa_crypto_core_common.h +52 -0
  272. package/vendor/mbedtls/library/psa_crypto_driver_wrappers.h +2896 -0
  273. package/vendor/mbedtls/library/psa_crypto_driver_wrappers_no_static.c +256 -0
  274. package/vendor/mbedtls/library/psa_crypto_driver_wrappers_no_static.h +31 -0
  275. package/vendor/mbedtls/library/psa_crypto_ecp.c +594 -0
  276. package/vendor/mbedtls/library/psa_crypto_ecp.h +267 -0
  277. package/vendor/mbedtls/library/psa_crypto_ffdh.c +361 -0
  278. package/vendor/mbedtls/library/psa_crypto_ffdh.h +131 -0
  279. package/vendor/mbedtls/library/psa_crypto_hash.c +470 -0
  280. package/vendor/mbedtls/library/psa_crypto_hash.h +211 -0
  281. package/vendor/mbedtls/library/psa_crypto_invasive.h +92 -0
  282. package/vendor/mbedtls/library/psa_crypto_its.h +131 -0
  283. package/vendor/mbedtls/library/psa_crypto_mac.c +505 -0
  284. package/vendor/mbedtls/library/psa_crypto_mac.h +264 -0
  285. package/vendor/mbedtls/library/psa_crypto_pake.c +571 -0
  286. package/vendor/mbedtls/library/psa_crypto_pake.h +159 -0
  287. package/vendor/mbedtls/library/psa_crypto_random.c +181 -0
  288. package/vendor/mbedtls/library/psa_crypto_random.h +72 -0
  289. package/vendor/mbedtls/library/psa_crypto_random_impl.h +200 -0
  290. package/vendor/mbedtls/library/psa_crypto_rsa.c +714 -0
  291. package/vendor/mbedtls/library/psa_crypto_rsa.h +321 -0
  292. package/vendor/mbedtls/library/psa_crypto_se.c +373 -0
  293. package/vendor/mbedtls/library/psa_crypto_se.h +192 -0
  294. package/vendor/mbedtls/library/psa_crypto_slot_management.c +1137 -0
  295. package/vendor/mbedtls/library/psa_crypto_slot_management.h +344 -0
  296. package/vendor/mbedtls/library/psa_crypto_storage.c +481 -0
  297. package/vendor/mbedtls/library/psa_crypto_storage.h +392 -0
  298. package/vendor/mbedtls/library/psa_its_file.c +254 -0
  299. package/vendor/mbedtls/library/psa_util.c +614 -0
  300. package/vendor/mbedtls/library/psa_util_internal.h +100 -0
  301. package/vendor/mbedtls/library/ripemd160.c +490 -0
  302. package/vendor/mbedtls/library/rsa.c +3121 -0
  303. package/vendor/mbedtls/library/rsa_alt_helpers.c +455 -0
  304. package/vendor/mbedtls/library/rsa_alt_helpers.h +209 -0
  305. package/vendor/mbedtls/library/rsa_internal.h +188 -0
  306. package/vendor/mbedtls/library/sha1.c +480 -0
  307. package/vendor/mbedtls/library/sha256.c +983 -0
  308. package/vendor/mbedtls/library/sha3.c +721 -0
  309. package/vendor/mbedtls/library/sha512.c +1115 -0
  310. package/vendor/mbedtls/library/ssl_cache.c +410 -0
  311. package/vendor/mbedtls/library/ssl_ciphersuites.c +2050 -0
  312. package/vendor/mbedtls/library/ssl_ciphersuites_internal.h +154 -0
  313. package/vendor/mbedtls/library/ssl_client.c +1023 -0
  314. package/vendor/mbedtls/library/ssl_client.h +22 -0
  315. package/vendor/mbedtls/library/ssl_cookie.c +384 -0
  316. package/vendor/mbedtls/library/ssl_debug_helpers.h +85 -0
  317. package/vendor/mbedtls/library/ssl_debug_helpers_generated.c +251 -0
  318. package/vendor/mbedtls/library/ssl_misc.h +3198 -0
  319. package/vendor/mbedtls/library/ssl_msg.c +6619 -0
  320. package/vendor/mbedtls/library/ssl_ticket.c +556 -0
  321. package/vendor/mbedtls/library/ssl_tls.c +10234 -0
  322. package/vendor/mbedtls/library/ssl_tls12_client.c +3688 -0
  323. package/vendor/mbedtls/library/ssl_tls12_server.c +4311 -0
  324. package/vendor/mbedtls/library/ssl_tls13_client.c +3208 -0
  325. package/vendor/mbedtls/library/ssl_tls13_generic.c +1793 -0
  326. package/vendor/mbedtls/library/ssl_tls13_invasive.h +23 -0
  327. package/vendor/mbedtls/library/ssl_tls13_keys.c +1918 -0
  328. package/vendor/mbedtls/library/ssl_tls13_keys.h +668 -0
  329. package/vendor/mbedtls/library/ssl_tls13_server.c +3624 -0
  330. package/vendor/mbedtls/library/threading.c +193 -0
  331. package/vendor/mbedtls/library/threading_internal.h +28 -0
  332. package/vendor/mbedtls/library/timing.c +152 -0
  333. package/vendor/mbedtls/library/version.c +32 -0
  334. package/vendor/mbedtls/library/version_features.c +856 -0
  335. package/vendor/mbedtls/library/x509.c +1776 -0
  336. package/vendor/mbedtls/library/x509_create.c +570 -0
  337. package/vendor/mbedtls/library/x509_crl.c +708 -0
  338. package/vendor/mbedtls/library/x509_crt.c +3311 -0
  339. package/vendor/mbedtls/library/x509_csr.c +648 -0
  340. package/vendor/mbedtls/library/x509_internal.h +101 -0
  341. package/vendor/mbedtls/library/x509write.c +174 -0
  342. package/vendor/mbedtls/library/x509write_crt.c +688 -0
  343. package/vendor/mbedtls/library/x509write_csr.c +336 -0
  344. package/vendor/quickjs-ng/CMakeLists.txt +566 -0
  345. package/vendor/quickjs-ng/LICENSE +24 -0
  346. package/vendor/quickjs-ng/README.md +24 -0
  347. package/vendor/quickjs-ng/api-test.c +1195 -0
  348. package/vendor/quickjs-ng/builtin-array-fromasync.h +119 -0
  349. package/vendor/quickjs-ng/builtin-iterator-zip-keyed.h +332 -0
  350. package/vendor/quickjs-ng/builtin-iterator-zip.h +337 -0
  351. package/vendor/quickjs-ng/cutils.h +1998 -0
  352. package/vendor/quickjs-ng/dtoa.c +1619 -0
  353. package/vendor/quickjs-ng/dtoa.h +87 -0
  354. package/vendor/quickjs-ng/gen/function_source.c +81 -0
  355. package/vendor/quickjs-ng/gen/hello.c +53 -0
  356. package/vendor/quickjs-ng/gen/hello_module.c +106 -0
  357. package/vendor/quickjs-ng/gen/repl.c +3036 -0
  358. package/vendor/quickjs-ng/gen/standalone.c +323 -0
  359. package/vendor/quickjs-ng/gen/test_fib.c +81 -0
  360. package/vendor/quickjs-ng/libregexp-opcode.h +73 -0
  361. package/vendor/quickjs-ng/libregexp.c +3474 -0
  362. package/vendor/quickjs-ng/libregexp.h +101 -0
  363. package/vendor/quickjs-ng/libunicode-table.h +5173 -0
  364. package/vendor/quickjs-ng/libunicode.c +2069 -0
  365. package/vendor/quickjs-ng/libunicode.h +172 -0
  366. package/vendor/quickjs-ng/list.h +107 -0
  367. package/vendor/quickjs-ng/lre-test.c +52 -0
  368. package/vendor/quickjs-ng/qjs.c +762 -0
  369. package/vendor/quickjs-ng/qjsc.c +673 -0
  370. package/vendor/quickjs-ng/quickjs-atom.h +280 -0
  371. package/vendor/quickjs-ng/quickjs-c-atomics.h +54 -0
  372. package/vendor/quickjs-ng/quickjs-libc.c +5037 -0
  373. package/vendor/quickjs-ng/quickjs-libc.h +87 -0
  374. package/vendor/quickjs-ng/quickjs-opcode.h +377 -0
  375. package/vendor/quickjs-ng/quickjs.c +64041 -0
  376. package/vendor/quickjs-ng/quickjs.h +1447 -0
  377. package/vendor/quickjs-ng/run-test262.c +2374 -0
  378. package/vendor/quickjs-ng/unicode_gen.c +3121 -0
  379. package/vendor/quickjs-ng/unicode_gen_def.h +310 -0
  380. package/vendor/ryu/LICENSE-Boost +23 -0
  381. package/vendor/ryu/common.h +114 -0
  382. package/vendor/ryu/d2s.c +509 -0
  383. package/vendor/ryu/d2s_full_table.h +367 -0
  384. package/vendor/ryu/d2s_intrinsics.h +357 -0
  385. package/vendor/ryu/d2s_small_table.h +186 -0
  386. package/vendor/ryu/digit_table.h +35 -0
  387. package/vendor/ryu/ryu.h +46 -0
  388. package/vendor/zlib/LICENSE +22 -0
  389. package/vendor/zlib/adler32.c +164 -0
  390. package/vendor/zlib/compress.c +75 -0
  391. package/vendor/zlib/crc32.c +1049 -0
  392. package/vendor/zlib/crc32.h +9446 -0
  393. package/vendor/zlib/deflate.c +2139 -0
  394. package/vendor/zlib/deflate.h +377 -0
  395. package/vendor/zlib/gzclose.c +23 -0
  396. package/vendor/zlib/gzguts.h +214 -0
  397. package/vendor/zlib/gzlib.c +582 -0
  398. package/vendor/zlib/gzread.c +602 -0
  399. package/vendor/zlib/gzwrite.c +631 -0
  400. package/vendor/zlib/infback.c +628 -0
  401. package/vendor/zlib/inffast.c +320 -0
  402. package/vendor/zlib/inffast.h +11 -0
  403. package/vendor/zlib/inffixed.h +94 -0
  404. package/vendor/zlib/inflate.c +1526 -0
  405. package/vendor/zlib/inflate.h +126 -0
  406. package/vendor/zlib/inftrees.c +299 -0
  407. package/vendor/zlib/inftrees.h +62 -0
  408. package/vendor/zlib/trees.c +1117 -0
  409. package/vendor/zlib/trees.h +128 -0
  410. package/vendor/zlib/uncompr.c +85 -0
  411. package/vendor/zlib/zconf.h +543 -0
  412. package/vendor/zlib/zlib.h +1938 -0
  413. package/vendor/zlib/zutil.c +299 -0
  414. package/vendor/zlib/zutil.h +254 -0
  415. package/README.md +0 -3
  416. package/index.js +0 -2
@@ -0,0 +1,654 @@
1
+ /* fetch for the dynamic island, over the system libcurl — the RETIRED
2
+ * REFERENCE implementation. The default fetch is scr_fetch.c (scriptc's
3
+ * own net stack: scr_net + scr_tls + scr_http's client parser + zlib);
4
+ * this file stays compilable for one release behind SCRIPTC_FETCH_CURL=1
5
+ * (cc.ts selects exactly one of the two — same scr_fetch_install symbol,
6
+ * same island surface, same fixture contract) as the flip's reference,
7
+ * the C-backend-vs-LLVM precedent. Compiled and linked ONLY into
8
+ * --dynamic builds whose embedded npm graph references fetch (emit gates
9
+ * on moduleUsesFetch; the emitted main calls scr_fetch_install before
10
+ * any island entry) — fetch-free binaries keep their exact link line and
11
+ * never load libcurl.
12
+ *
13
+ * Architecture (SEMANTICS.md has the user-facing story):
14
+ * - The JS half (fetch_glue below) defines globalThis.fetch over two host
15
+ * functions: host.start(req, cbs) begins a transfer and host.abort(id)
16
+ * cancels one (response-body cancel). fetch() returns a REAL island
17
+ * promise; the Response's body is an island ReadableStream fed by
18
+ * C→engine callbacks as data arrives.
19
+ * - The C half drives curl_multi from the event loop's io hook, exactly
20
+ * like child_process's waitpid polling: at loop quiescence the island's
21
+ * io poll (scr_island.c) drains engine jobs, then calls scr_fetch_poll,
22
+ * which SLEEPS on curl's fds (curl_multi_poll, capped by the loop's next
23
+ * deadline), performs transfers, fires callbacks for arrived data, and
24
+ * the drain that follows runs the resolved .then chains. The loop stays
25
+ * alive while transfers are live (scr_fetch_pending).
26
+ * - fetch SEMANTICS, matched to Node/undici: HTTP errors RESOLVE (only
27
+ * network failure rejects, with TypeError "fetch failed" — Node's exact
28
+ * message); redirects are followed (curl FOLLOWLOCATION, 20 hops like
29
+ * fetch's limit, POST→GET rewriting on 301/302/303 per libcurl's
30
+ * default, response.url = the final URL, response.redirected set);
31
+ * status/headers surface at header-complete, the body streams; gzip
32
+ * arrives decompressed (ACCEPT_ENCODING "") like fetch. AbortSignal is
33
+ * wired (init.signal, or the Request's): an already-aborted signal
34
+ * rejects with its reason before any transfer starts; aborting a live
35
+ * transfer cancels the curl handle through host.abort (silent on the C
36
+ * side — the glue owns the rejection) and rejects the fetch promise —
37
+ * or errors the body stream when the response already resolved — with
38
+ * signal.reason (default: DOMException AbortError "This operation was
39
+ * aborted", Node's exact shape; AbortSignal.timeout's TimeoutError rides
40
+ * the island timer machinery in scr_web.c, its deadline capping the
41
+ * transfer poll's sleep below).
42
+ * - Ownership: each transfer owns +1 on its JS callbacks object and its
43
+ * header/body copies; everything is freed when the transfer finishes,
44
+ * and teardown (registered with the island) frees whatever is still
45
+ * live before the engine goes down, so the island audit stays zero.
46
+ */
47
+ #ifdef SCR_DYNAMIC
48
+
49
+ #include "scr_runtime.h"
50
+
51
+ #include <stdio.h>
52
+ #include <stdlib.h>
53
+ #include <string.h>
54
+ #include <strings.h>
55
+
56
+ #include <curl/curl.h>
57
+
58
+ #include "quickjs.h"
59
+
60
+ /* ── transfers ───────────────────────────────────────────────────────── */
61
+
62
+ typedef struct FxTransfer {
63
+ int id;
64
+ CURL *easy;
65
+ JSContext *ctx;
66
+ JSValue cbs; /* { onResponse, onData, onEnd, onError } — owned */
67
+ struct curl_slist *req_headers;
68
+ /* The CURRENT response block's status line + headers (a redirect hop or
69
+ * 1xx resets it — only the final block reaches the island). */
70
+ long status;
71
+ char *status_text;
72
+ char **hdr; /* name,value alternating */
73
+ size_t nhdr, hdr_cap;
74
+ bool responded; /* onResponse fired */
75
+ bool cancelled; /* island cancelled the body stream */
76
+ char errbuf[CURL_ERROR_SIZE];
77
+ struct FxTransfer *next;
78
+ } FxTransfer;
79
+
80
+ static CURLM *fx_multi = NULL;
81
+ static FxTransfer *fx_live = NULL;
82
+ static size_t fx_nlive = 0;
83
+ static int fx_next_id = 1;
84
+ static bool fx_in_perform = false; /* abort-during-perform must defer */
85
+
86
+ static void fx_oom(void) {
87
+ fputs("scriptc: out of memory\n", stderr);
88
+ abort();
89
+ }
90
+
91
+ static void fx_headers_reset(FxTransfer *t) {
92
+ for (size_t i = 0; i < t->nhdr; i++) free(t->hdr[i]);
93
+ t->nhdr = 0;
94
+ free(t->status_text);
95
+ t->status_text = NULL;
96
+ t->status = 0;
97
+ }
98
+
99
+ static void fx_free(FxTransfer *t) {
100
+ fx_headers_reset(t);
101
+ free(t->hdr);
102
+ if (t->easy) {
103
+ curl_multi_remove_handle(fx_multi, t->easy);
104
+ curl_easy_cleanup(t->easy);
105
+ }
106
+ curl_slist_free_all(t->req_headers);
107
+ JS_FreeValue(t->ctx, t->cbs);
108
+ free(t);
109
+ }
110
+
111
+ static void fx_unlink(FxTransfer *t) {
112
+ for (FxTransfer **link = &fx_live; *link; link = &(*link)->next) {
113
+ if (*link == t) {
114
+ *link = t->next;
115
+ fx_nlive--;
116
+ return;
117
+ }
118
+ }
119
+ }
120
+
121
+ /* Calls one callback off the cbs object, swallowing (but reporting) any
122
+ * engine exception — the callbacks are our own glue and must not throw;
123
+ * dying here would take down a transfer for an internal bug. */
124
+ static void fx_call(FxTransfer *t, const char *name, int argc, JSValueConst *argv) {
125
+ JSContext *ctx = t->ctx;
126
+ JSValue fn = JS_GetPropertyStr(ctx, t->cbs, name);
127
+ JSValue r = JS_Call(ctx, fn, JS_UNDEFINED, argc, argv);
128
+ JS_FreeValue(ctx, fn);
129
+ if (JS_IsException(r)) {
130
+ JSValue e = JS_GetException(ctx);
131
+ const char *msg = JS_ToCString(ctx, e);
132
+ fprintf(stderr, "scriptc: fetch internal callback '%s' threw: %s\n", name,
133
+ msg ? msg : "?");
134
+ if (msg) JS_FreeCString(ctx, msg);
135
+ JS_FreeValue(ctx, e);
136
+ return;
137
+ }
138
+ JS_FreeValue(ctx, r);
139
+ }
140
+
141
+ /* status/headers → the island (fires once, lazily: at the first body byte
142
+ * or at DONE, whichever comes first — a header block curl is about to
143
+ * follow away from never fires). */
144
+ static void fx_fire_response(FxTransfer *t) {
145
+ if (t->responded) return;
146
+ t->responded = true;
147
+ JSContext *ctx = t->ctx;
148
+ JSValue hdrs = JS_NewArray(ctx);
149
+ for (size_t i = 0; i < t->nhdr; i++) {
150
+ JS_SetPropertyUint32(ctx, hdrs, (uint32_t)i, JS_NewString(ctx, t->hdr[i]));
151
+ }
152
+ char *eff = NULL;
153
+ long redirects = 0;
154
+ curl_easy_getinfo(t->easy, CURLINFO_EFFECTIVE_URL, &eff);
155
+ curl_easy_getinfo(t->easy, CURLINFO_REDIRECT_COUNT, &redirects);
156
+ JSValue argv[5] = {
157
+ JS_NewInt32(ctx, (int32_t)t->status),
158
+ JS_NewString(ctx, t->status_text ? t->status_text : ""),
159
+ hdrs,
160
+ JS_NewString(ctx, eff ? eff : ""),
161
+ JS_NewBool(ctx, redirects > 0),
162
+ };
163
+ fx_call(t, "onResponse", 5, argv);
164
+ for (int i = 0; i < 5; i++) JS_FreeValue(ctx, argv[i]);
165
+ }
166
+
167
+ /* ── curl callbacks (fired inside curl_multi_perform) ────────────────── */
168
+
169
+ static size_t fx_header_cb(char *buf, size_t size, size_t n, void *ud) {
170
+ FxTransfer *t = (FxTransfer *)ud;
171
+ size_t len = size * n;
172
+ if (len >= 5 && strncmp(buf, "HTTP/", 5) == 0) {
173
+ /* A new response block (initial, redirect hop, or post-1xx): reset. */
174
+ fx_headers_reset(t);
175
+ const char *sp = memchr(buf, ' ', len);
176
+ if (sp) {
177
+ t->status = strtol(sp + 1, NULL, 10);
178
+ const char *reason = memchr(sp + 1, ' ', len - (size_t)(sp + 1 - buf));
179
+ if (reason) {
180
+ reason++;
181
+ size_t rlen = len - (size_t)(reason - buf);
182
+ while (rlen > 0 && (reason[rlen - 1] == '\r' || reason[rlen - 1] == '\n')) rlen--;
183
+ t->status_text = malloc(rlen + 1);
184
+ if (!t->status_text) fx_oom();
185
+ memcpy(t->status_text, reason, rlen);
186
+ t->status_text[rlen] = '\0';
187
+ }
188
+ }
189
+ return len;
190
+ }
191
+ const char *colon = memchr(buf, ':', len);
192
+ if (!colon || colon == buf) return len; /* the blank terminator, or junk */
193
+ size_t nlen = (size_t)(colon - buf);
194
+ const char *v = colon + 1;
195
+ size_t vlen = len - nlen - 1;
196
+ while (vlen > 0 && (*v == ' ' || *v == '\t')) { v++; vlen--; }
197
+ while (vlen > 0 && (v[vlen - 1] == '\r' || v[vlen - 1] == '\n' || v[vlen - 1] == ' ' || v[vlen - 1] == '\t')) vlen--;
198
+ if (t->nhdr + 2 > t->hdr_cap) {
199
+ t->hdr_cap = t->hdr_cap ? t->hdr_cap * 2 : 16;
200
+ t->hdr = realloc(t->hdr, t->hdr_cap * sizeof(char *));
201
+ if (!t->hdr) fx_oom();
202
+ }
203
+ char *name = malloc(nlen + 1);
204
+ char *value = malloc(vlen + 1);
205
+ if (!name || !value) fx_oom();
206
+ memcpy(name, buf, nlen);
207
+ name[nlen] = '\0';
208
+ memcpy(value, v, vlen);
209
+ value[vlen] = '\0';
210
+ t->hdr[t->nhdr++] = name;
211
+ t->hdr[t->nhdr++] = value;
212
+ return len;
213
+ }
214
+
215
+ static size_t fx_write_cb(char *ptr, size_t size, size_t n, void *ud) {
216
+ FxTransfer *t = (FxTransfer *)ud;
217
+ size_t len = size * n;
218
+ if (t->cancelled) return 0; /* aborts the transfer (CURLE_WRITE_ERROR) */
219
+ if (t->status >= 300 && t->status <= 399) {
220
+ /* A redirect body curl is following away from: fetch never delivers
221
+ * it. (A FINAL 3xx — no Location — ends with an empty body here; the
222
+ * documented corner.) */
223
+ return len;
224
+ }
225
+ fx_fire_response(t);
226
+ JSValue chunk = JS_NewUint8ArrayCopy(t->ctx, (const uint8_t *)ptr, len);
227
+ fx_call(t, "onData", 1, (JSValueConst *)&chunk);
228
+ JS_FreeValue(t->ctx, chunk);
229
+ return len;
230
+ }
231
+
232
+ /* ── completion ──────────────────────────────────────────────────────── */
233
+
234
+ static void fx_finish(FxTransfer *t, CURLcode result) {
235
+ if (t->cancelled) {
236
+ /* The island cancelled the body: nothing to deliver. */
237
+ } else if (result == CURLE_OK) {
238
+ fx_fire_response(t); /* bodyless responses respond here */
239
+ fx_call(t, "onEnd", 0, NULL);
240
+ } else {
241
+ /* Node's fetch failure carries a CAUSE (undici): a plain Error whose
242
+ * message/code the AI-SDK-style wrappers read (`error.cause.message`,
243
+ * the ECONNREFUSED classification). Shape the two common network
244
+ * failures exactly like Node — connect ECONNREFUSED host:port and
245
+ * getaddrinfo ENOTFOUND host — and pass everything else through as
246
+ * curl's detail string. (Node also sets errno/address/port on the
247
+ * cause; those stay off — a documented approximation.) */
248
+ const char *detail = t->errbuf[0] ? t->errbuf : curl_easy_strerror(result);
249
+ const char *code = NULL;
250
+ char shaped[512];
251
+ if (result == CURLE_COULDNT_CONNECT || result == CURLE_COULDNT_RESOLVE_HOST) {
252
+ char *eff = NULL;
253
+ curl_easy_getinfo(t->easy, CURLINFO_EFFECTIVE_URL, &eff);
254
+ CURLU *u = curl_url();
255
+ char *host = NULL, *port = NULL, *scheme = NULL;
256
+ if (u && eff && curl_url_set(u, CURLUPART_URL, eff, 0) == CURLUE_OK) {
257
+ curl_url_get(u, CURLUPART_HOST, &host, 0);
258
+ curl_url_get(u, CURLUPART_PORT, &port, 0);
259
+ curl_url_get(u, CURLUPART_SCHEME, &scheme, 0);
260
+ }
261
+ const char *h = host ? host : "";
262
+ const char *p = port ? port
263
+ : (scheme && strcmp(scheme, "https") == 0 ? "443" : "80");
264
+ if (result == CURLE_COULDNT_CONNECT) {
265
+ snprintf(shaped, sizeof shaped, "connect ECONNREFUSED %s:%s", h, p);
266
+ code = "ECONNREFUSED";
267
+ } else {
268
+ snprintf(shaped, sizeof shaped, "getaddrinfo ENOTFOUND %s", h);
269
+ code = "ENOTFOUND";
270
+ }
271
+ detail = shaped;
272
+ if (host) curl_free(host);
273
+ if (port) curl_free(port);
274
+ if (scheme) curl_free(scheme);
275
+ if (u) curl_url_cleanup(u);
276
+ }
277
+ JSValue args[2];
278
+ args[0] = JS_NewString(t->ctx, detail);
279
+ args[1] = code ? JS_NewString(t->ctx, code) : JS_UNDEFINED;
280
+ fx_call(t, "onError", 2, (JSValueConst *)args);
281
+ JS_FreeValue(t->ctx, args[0]);
282
+ JS_FreeValue(t->ctx, args[1]);
283
+ }
284
+ fx_free(t);
285
+ }
286
+
287
+ /* ── the loop's fetch half (called from scr_island.c's io poll) ───────── */
288
+
289
+ static bool fx_pending(void) { return fx_nlive > 0; }
290
+
291
+ static void fx_poll(double max_wait_ms) {
292
+ if (fx_nlive == 0) return;
293
+ if (max_wait_ms > 0) {
294
+ int ms = max_wait_ms > 1000 ? 1000 : (int)max_wait_ms;
295
+ curl_multi_poll(fx_multi, NULL, 0, ms, NULL);
296
+ }
297
+ int running = 0;
298
+ fx_in_perform = true;
299
+ curl_multi_perform(fx_multi, &running);
300
+ fx_in_perform = false;
301
+ for (;;) {
302
+ int left = 0;
303
+ CURLMsg *msg = curl_multi_info_read(fx_multi, &left);
304
+ if (!msg) break;
305
+ if (msg->msg != CURLMSG_DONE) continue;
306
+ FxTransfer *t = NULL;
307
+ curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &t);
308
+ if (!t) continue;
309
+ fx_unlink(t);
310
+ fx_finish(t, msg->data.result);
311
+ }
312
+ }
313
+
314
+ /* ── host functions (called by the fetch glue, inside the engine) ────── */
315
+
316
+ /* host.start({url, method, headers: [n,v,...], body: Uint8Array|undefined},
317
+ * cbs) → transfer id. Everything is copied out of the engine before curl
318
+ * sees it. */
319
+ static JSValue fx_host_start(JSContext *ctx, JSValueConst this_val, int argc,
320
+ JSValueConst *argv) {
321
+ (void)this_val;
322
+ (void)argc;
323
+ JSValueConst req = argv[0];
324
+ FxTransfer *t = calloc(1, sizeof *t);
325
+ if (!t) fx_oom();
326
+ t->ctx = ctx;
327
+ t->id = fx_next_id++;
328
+ t->cbs = JS_DupValue(ctx, argv[1]);
329
+ t->easy = curl_easy_init();
330
+ if (!t->easy) {
331
+ JS_FreeValue(ctx, t->cbs);
332
+ free(t);
333
+ return JS_ThrowTypeError(ctx, "fetch failed");
334
+ }
335
+ CURL *e = t->easy;
336
+
337
+ JSValue urlv = JS_GetPropertyStr(ctx, req, "url");
338
+ const char *url = JS_ToCString(ctx, urlv);
339
+ JS_FreeValue(ctx, urlv);
340
+ JSValue methodv = JS_GetPropertyStr(ctx, req, "method");
341
+ const char *method = JS_ToCString(ctx, methodv);
342
+ JS_FreeValue(ctx, methodv);
343
+ if (!url || !method) {
344
+ if (url) JS_FreeCString(ctx, url);
345
+ if (method) JS_FreeCString(ctx, method);
346
+ fx_free(t);
347
+ return JS_EXCEPTION;
348
+ }
349
+
350
+ curl_easy_setopt(e, CURLOPT_URL, url);
351
+ curl_easy_setopt(e, CURLOPT_PRIVATE, t);
352
+ curl_easy_setopt(e, CURLOPT_WRITEFUNCTION, fx_write_cb);
353
+ curl_easy_setopt(e, CURLOPT_WRITEDATA, t);
354
+ curl_easy_setopt(e, CURLOPT_HEADERFUNCTION, fx_header_cb);
355
+ curl_easy_setopt(e, CURLOPT_HEADERDATA, t);
356
+ curl_easy_setopt(e, CURLOPT_ERRORBUFFER, t->errbuf);
357
+ curl_easy_setopt(e, CURLOPT_NOSIGNAL, 1L);
358
+ curl_easy_setopt(e, CURLOPT_FOLLOWLOCATION, 1L);
359
+ curl_easy_setopt(e, CURLOPT_MAXREDIRS, 20L); /* fetch's redirect limit */
360
+ curl_easy_setopt(e, CURLOPT_ACCEPT_ENCODING, ""); /* gzip in, transparent out */
361
+ curl_easy_setopt(e, CURLOPT_PROTOCOLS_STR, "http,https");
362
+ curl_easy_setopt(e, CURLOPT_SUPPRESS_CONNECT_HEADERS, 1L);
363
+ /* Node parity: undici's global fetch IGNORES http_proxy/https_proxy/
364
+ * all_proxy environment variables unless NODE_USE_ENV_PROXY=1 opts in
365
+ * (Node 24's EnvHttpProxyAgent). libcurl's default is the opposite —
366
+ * honor them — so an empty CURLOPT_PROXY switches the env lookup off;
367
+ * with the opt-in set, libcurl's own env handling stands in for
368
+ * undici's agent (same variables, same no_proxy exclusions). */
369
+ const char *env_proxy = getenv("NODE_USE_ENV_PROXY");
370
+ if (env_proxy == NULL || strcmp(env_proxy, "1") != 0) {
371
+ curl_easy_setopt(e, CURLOPT_PROXY, "");
372
+ }
373
+
374
+ /* Request headers: fetch never sends Expect: 100-continue; a body with
375
+ * no explicit content-type must not inherit curl's form default. */
376
+ bool has_content_type = false;
377
+ JSValue hdrs = JS_GetPropertyStr(ctx, req, "headers");
378
+ JSValue lenv = JS_GetPropertyStr(ctx, hdrs, "length");
379
+ uint32_t hn = 0;
380
+ JS_ToUint32(ctx, &hn, lenv);
381
+ JS_FreeValue(ctx, lenv);
382
+ for (uint32_t i = 0; i + 1 < hn; i += 2) {
383
+ JSValue nv = JS_GetPropertyUint32(ctx, hdrs, i);
384
+ JSValue vv = JS_GetPropertyUint32(ctx, hdrs, i + 1);
385
+ const char *hname = JS_ToCString(ctx, nv);
386
+ const char *hvalue = JS_ToCString(ctx, vv);
387
+ if (hname && hvalue) {
388
+ if (strcasecmp(hname, "content-type") == 0) has_content_type = true;
389
+ size_t linelen = strlen(hname) + 2 + strlen(hvalue) + 1;
390
+ char *line = malloc(linelen);
391
+ if (!line) fx_oom();
392
+ /* An empty value still SETS the header: curl's "name;" form. */
393
+ if (hvalue[0] == '\0') snprintf(line, linelen, "%s;", hname);
394
+ else snprintf(line, linelen, "%s: %s", hname, hvalue);
395
+ t->req_headers = curl_slist_append(t->req_headers, line);
396
+ free(line);
397
+ }
398
+ if (hname) JS_FreeCString(ctx, hname);
399
+ if (hvalue) JS_FreeCString(ctx, hvalue);
400
+ JS_FreeValue(ctx, nv);
401
+ JS_FreeValue(ctx, vv);
402
+ }
403
+ JS_FreeValue(ctx, hdrs);
404
+ t->req_headers = curl_slist_append(t->req_headers, "Expect:");
405
+
406
+ /* Body: copied by COPYPOSTFIELDS; binary-safe via POSTFIELDSIZE. */
407
+ JSValue bodyv = JS_GetPropertyStr(ctx, req, "body");
408
+ if (!JS_IsUndefined(bodyv) && !JS_IsNull(bodyv)) {
409
+ size_t blen = 0;
410
+ uint8_t *bytes = JS_GetUint8Array(ctx, &blen, bodyv);
411
+ if (bytes || blen == 0) {
412
+ curl_easy_setopt(e, CURLOPT_POSTFIELDSIZE, (long)blen);
413
+ curl_easy_setopt(e, CURLOPT_COPYPOSTFIELDS, (const char *)bytes);
414
+ if (!has_content_type) {
415
+ t->req_headers = curl_slist_append(t->req_headers, "Content-Type:");
416
+ }
417
+ }
418
+ }
419
+ JS_FreeValue(ctx, bodyv);
420
+
421
+ /* Method: bodies default curl to POST; anything else is CUSTOMREQUEST.
422
+ * HEAD is NOBODY so curl won't wait for a body that never comes. */
423
+ if (strcasecmp(method, "HEAD") == 0) {
424
+ curl_easy_setopt(e, CURLOPT_NOBODY, 1L);
425
+ } else if (strcasecmp(method, "GET") != 0 && strcasecmp(method, "POST") != 0) {
426
+ curl_easy_setopt(e, CURLOPT_CUSTOMREQUEST, method);
427
+ }
428
+ curl_easy_setopt(e, CURLOPT_HTTPHEADER, t->req_headers);
429
+
430
+ JS_FreeCString(ctx, url);
431
+ JS_FreeCString(ctx, method);
432
+
433
+ t->next = fx_live;
434
+ fx_live = t;
435
+ fx_nlive++;
436
+ curl_multi_add_handle(fx_multi, t->easy);
437
+ return JS_NewInt32(ctx, t->id);
438
+ }
439
+
440
+ /* host.abort(id): the island cancelled the response body stream. The
441
+ * transfer dies quietly — no onError, no onEnd. */
442
+ static JSValue fx_host_abort(JSContext *ctx, JSValueConst this_val, int argc,
443
+ JSValueConst *argv) {
444
+ (void)this_val;
445
+ (void)argc;
446
+ int32_t id = 0;
447
+ JS_ToInt32(ctx, &id, argv[0]);
448
+ for (FxTransfer *t = fx_live; t; t = t->next) {
449
+ if (t->id == id) {
450
+ if (fx_in_perform) {
451
+ /* curl frames are live on the stack: the write callback returns 0
452
+ * next delivery, the transfer errors out, and fx_finish sees
453
+ * `cancelled` and dies silently. */
454
+ t->cancelled = true;
455
+ } else {
456
+ fx_unlink(t);
457
+ fx_free(t);
458
+ }
459
+ break;
460
+ }
461
+ }
462
+ return JS_UNDEFINED;
463
+ }
464
+
465
+ /* ── the JS half ─────────────────────────────────────────────────────── */
466
+
467
+ static const char fx_glue[] =
468
+ "(host) => {\n"
469
+ " 'use strict';\n"
470
+ " const g = globalThis;\n"
471
+ " const NULL_BODY = { 204: true, 205: true, 304: true };\n"
472
+ " g.fetch = function fetch(input, init) {\n"
473
+ " return new Promise((resolve, reject) => {\n"
474
+ " let url;\n"
475
+ " let method = 'GET';\n"
476
+ " let headers = null;\n"
477
+ " let body = null;\n"
478
+ " let signal = null;\n"
479
+ " if (input instanceof g.Request) {\n"
480
+ " url = input.url;\n"
481
+ " method = input.method;\n"
482
+ " headers = new g.Headers(input.headers);\n"
483
+ " body = input._body instanceof Uint8Array ? input._body : null;\n"
484
+ " signal = input._signal;\n"
485
+ " } else {\n"
486
+ " url = String(input);\n"
487
+ " }\n"
488
+ " init = init === undefined || init === null ? {} : init;\n"
489
+ " // An explicit init.signal overrides the Request's, null included.\n"
490
+ " if (init.signal !== undefined) {\n"
491
+ " if (init.signal !== null && !(init.signal instanceof g.AbortSignal)) {\n"
492
+ " throw new TypeError('fetch init.signal must be an AbortSignal or null');\n"
493
+ " }\n"
494
+ " signal = init.signal;\n"
495
+ " }\n"
496
+ " if (init.redirect !== undefined && init.redirect !== 'follow') {\n"
497
+ " throw new Error(\"scriptc: only redirect: 'follow' is supported by the embedded fetch\");\n"
498
+ " }\n"
499
+ " // Reuse Request's init handling: method normalization, header\n"
500
+ " // collection, body coercion with its implicit content-type, and the\n"
501
+ " // GET/HEAD-with-body TypeError.\n"
502
+ " const reqInit = {};\n"
503
+ " if (init.method !== undefined) reqInit.method = init.method;\n"
504
+ " if (init.headers !== undefined) reqInit.headers = init.headers;\n"
505
+ " if (init.body !== undefined && init.body !== null) reqInit.body = init.body;\n"
506
+ " if (reqInit.method !== undefined || reqInit.headers !== undefined || reqInit.body !== undefined || headers === null) {\n"
507
+ " const base = input instanceof g.Request ? input : url;\n"
508
+ " const r = new g.Request(base, reqInit);\n"
509
+ " method = r.method;\n"
510
+ " headers = r.headers;\n"
511
+ " if (r._body instanceof Uint8Array) body = r._body;\n"
512
+ " }\n"
513
+ " if (body !== null && !(body instanceof Uint8Array)) {\n"
514
+ " throw new TypeError('streaming request bodies are not supported in the scriptc island');\n"
515
+ " }\n"
516
+ " // An already-aborted signal rejects with ITS reason before any\n"
517
+ " // transfer starts (Node: validation above still throws first).\n"
518
+ " if (signal !== null && signal.aborted) {\n"
519
+ " reject(signal.reason);\n"
520
+ " return;\n"
521
+ " }\n"
522
+ " let controller = null;\n"
523
+ " let resolved = false;\n"
524
+ " let done = false;\n"
525
+ " let id = 0;\n"
526
+ " // The transfer is over (delivered, failed, cancelled, or aborted):\n"
527
+ " // a later signal abort must not touch it.\n"
528
+ " const finish = () => {\n"
529
+ " done = true;\n"
530
+ " if (signal !== null) signal.removeEventListener('abort', onAbort);\n"
531
+ " };\n"
532
+ " const onAbort = () => {\n"
533
+ " if (done) return;\n"
534
+ " finish();\n"
535
+ " host.abort(id); // the C side dies quietly; rejection is ours\n"
536
+ " if (!resolved) {\n"
537
+ " resolved = true;\n"
538
+ " reject(signal.reason);\n"
539
+ " } else if (controller !== null) {\n"
540
+ " // Mid-stream: pending and future reads reject with the reason,\n"
541
+ " // exactly Node's aborted-body behavior.\n"
542
+ " try { controller.error(signal.reason); } catch (_e) { /* already closed */ }\n"
543
+ " controller = null;\n"
544
+ " }\n"
545
+ " };\n"
546
+ " const flat = [];\n"
547
+ " for (const pair of headers) { flat.push(pair[0], pair[1]); }\n"
548
+ " id = host.start(\n"
549
+ " { url, method, headers: flat, body: body === null ? undefined : body },\n"
550
+ " {\n"
551
+ " onResponse(status, statusText, raw, finalUrl, redirected) {\n"
552
+ " resolved = true;\n"
553
+ " const h = new g.Headers();\n"
554
+ " for (let i = 0; i + 1 < raw.length; i += 2) {\n"
555
+ " try { h.append(raw[i], raw[i + 1]); } catch (_e) { /* junk line */ }\n"
556
+ " }\n"
557
+ " let stream = null;\n"
558
+ " if (method !== 'HEAD' && NULL_BODY[status] !== true) {\n"
559
+ " stream = new g.ReadableStream({\n"
560
+ " start(c) { controller = c; },\n"
561
+ " cancel() { controller = null; finish(); host.abort(id); },\n"
562
+ " });\n"
563
+ " }\n"
564
+ " resolve(g.__scr_mk_response(status, statusText, h, finalUrl, redirected, stream));\n"
565
+ " },\n"
566
+ " onData(chunk) {\n"
567
+ " if (controller !== null) {\n"
568
+ " try { controller.enqueue(chunk); } catch (_e) { /* consumer went away */ }\n"
569
+ " }\n"
570
+ " },\n"
571
+ " onEnd() {\n"
572
+ " finish();\n"
573
+ " if (controller !== null) {\n"
574
+ " try { controller.close(); } catch (_e) { /* already errored */ }\n"
575
+ " controller = null;\n"
576
+ " }\n"
577
+ " },\n"
578
+ " onError(detail, code) {\n"
579
+ " finish();\n"
580
+ " if (!resolved) {\n"
581
+ " // Node's shape: TypeError 'fetch failed' with a CAUSE the\n"
582
+ " // wrappers classify (message + code for the network cases).\n"
583
+ " const cause = new Error(String(detail));\n"
584
+ " if (code !== undefined) cause.code = code;\n"
585
+ " if (code === 'ECONNREFUSED') cause.syscall = 'connect';\n"
586
+ " else if (code === 'ENOTFOUND') cause.syscall = 'getaddrinfo';\n"
587
+ " const err = new TypeError('fetch failed');\n"
588
+ " err.cause = cause;\n"
589
+ " reject(err);\n"
590
+ " } else if (controller !== null) {\n"
591
+ " try { controller.error(new TypeError('terminated')); } catch (_e) { /* already closed */ }\n"
592
+ " controller = null;\n"
593
+ " }\n"
594
+ " },\n"
595
+ " },\n"
596
+ " );\n"
597
+ " if (signal !== null) signal.addEventListener('abort', onAbort, { once: true });\n"
598
+ " });\n"
599
+ " };\n"
600
+ "}\n";
601
+
602
+ /* ── boot / teardown (registered with the island) ────────────────────── */
603
+
604
+ static void fx_boot(void *jsctx) {
605
+ JSContext *ctx = (JSContext *)jsctx;
606
+ JSValue fn = JS_Eval(ctx, fx_glue, sizeof fx_glue - 1, "<scr-fetch>", JS_EVAL_TYPE_GLOBAL);
607
+ if (JS_IsException(fn)) {
608
+ fprintf(stderr, "scriptc: island fetch glue failed to evaluate\n");
609
+ abort();
610
+ }
611
+ JSValue host = JS_NewObject(ctx);
612
+ JS_SetPropertyStr(ctx, host, "start", JS_NewCFunction(ctx, fx_host_start, "start", 2));
613
+ JS_SetPropertyStr(ctx, host, "abort", JS_NewCFunction(ctx, fx_host_abort, "abort", 1));
614
+ JSValue r = JS_Call(ctx, fn, JS_UNDEFINED, 1, (JSValueConst *)&host);
615
+ JS_FreeValue(ctx, host);
616
+ JS_FreeValue(ctx, fn);
617
+ if (JS_IsException(r)) {
618
+ fprintf(stderr, "scriptc: island fetch glue failed to run\n");
619
+ abort();
620
+ }
621
+ JS_FreeValue(ctx, r);
622
+ }
623
+
624
+ /* Engine teardown with transfers still live (process.exit mid-request, or
625
+ * an exit with an abandoned body stream): free their engine values FIRST
626
+ * so the island's counting allocator returns to zero. */
627
+ static void fx_teardown(void) {
628
+ while (fx_live) {
629
+ FxTransfer *t = fx_live;
630
+ fx_live = t->next;
631
+ fx_nlive--;
632
+ fx_free(t);
633
+ }
634
+ if (fx_multi) {
635
+ curl_multi_cleanup(fx_multi);
636
+ fx_multi = NULL;
637
+ }
638
+ curl_global_cleanup();
639
+ }
640
+
641
+ /* The emitted main calls this (before any island entry) in builds whose
642
+ * embedded graph references fetch. */
643
+ void scr_fetch_install(void) {
644
+ if (fx_multi) return;
645
+ curl_global_init(CURL_GLOBAL_DEFAULT);
646
+ fx_multi = curl_multi_init();
647
+ if (!fx_multi) {
648
+ fputs("scriptc: curl_multi_init failed\n", stderr);
649
+ abort();
650
+ }
651
+ scr_island_set_fetch(fx_boot, fx_pending, fx_poll, fx_teardown);
652
+ }
653
+
654
+ #endif /* SCR_DYNAMIC */