@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.
- package/LICENSE +202 -0
- package/package.json +16 -6
- package/src/scr_array.c +488 -0
- package/src/scr_assert.c +1393 -0
- package/src/scr_async.c +2593 -0
- package/src/scr_async_dyn.c +607 -0
- package/src/scr_bytes.c +1425 -0
- package/src/scr_bytes_io.c +161 -0
- package/src/scr_child.c +3587 -0
- package/src/scr_closure.c +214 -0
- package/src/scr_console.c +143 -0
- package/src/scr_cycle.c +218 -0
- package/src/scr_dc.c +805 -0
- package/src/scr_dgram.c +1007 -0
- package/src/scr_dyn_handle.c +154 -0
- package/src/scr_dyn_invoke.c +644 -0
- package/src/scr_error.c +332 -0
- package/src/scr_events.c +714 -0
- package/src/scr_events_emitter.c +699 -0
- package/src/scr_exception.c +242 -0
- package/src/scr_fetch.c +1130 -0
- package/src/scr_fetch_curl.c +654 -0
- package/src/scr_http.c +3482 -0
- package/src/scr_http2.c +3030 -0
- package/src/scr_inspect.c +803 -0
- package/src/scr_inspect_island.c +51 -0
- package/src/scr_island.c +9363 -0
- package/src/scr_json.c +2151 -0
- package/src/scr_lib.c +3612 -0
- package/src/scr_loop_epoll.c +241 -0
- package/src/scr_loop_kqueue.c +121 -0
- package/src/scr_loop_wsapoll.c +208 -0
- package/src/scr_map.c +591 -0
- package/src/scr_net.c +3017 -0
- package/src/scr_net_island.c +458 -0
- package/src/scr_number.c +115 -0
- package/src/scr_object.c +25 -0
- package/src/scr_path.c +1266 -0
- package/src/scr_platform.h +119 -0
- package/src/scr_readline.c +287 -0
- package/src/scr_regex.c +1080 -0
- package/src/scr_runtime.h +5046 -0
- package/src/scr_stream.c +2877 -0
- package/src/scr_string.c +1264 -0
- package/src/scr_symbol.c +132 -0
- package/src/scr_test.c +662 -0
- package/src/scr_tls.c +1520 -0
- package/src/scr_union.c +105 -0
- package/src/scr_url.c +911 -0
- package/src/scr_url_internal.h +29 -0
- package/src/scr_url_params.c +561 -0
- package/src/scr_watch.c +568 -0
- package/src/scr_web.c +1778 -0
- package/src/scr_win.c +76 -0
- package/src/scr_zlib.c +197 -0
- package/src/scr_zlib_island.c +15 -0
- package/vendor/README.md +52 -0
- package/vendor/curl/COPYRIGHT +534 -0
- package/vendor/curl/include/curl/curl.h +3214 -0
- package/vendor/curl/include/curl/curlver.h +79 -0
- package/vendor/curl/include/curl/easy.h +125 -0
- package/vendor/curl/include/curl/header.h +74 -0
- package/vendor/curl/include/curl/mprintf.h +52 -0
- package/vendor/curl/include/curl/multi.h +460 -0
- package/vendor/curl/include/curl/options.h +70 -0
- package/vendor/curl/include/curl/stdcheaders.h +35 -0
- package/vendor/curl/include/curl/system.h +508 -0
- package/vendor/curl/include/curl/typecheck-gcc.h +716 -0
- package/vendor/curl/include/curl/urlapi.h +149 -0
- package/vendor/curl/include/curl/websockets.h +84 -0
- package/vendor/mbedtls/LICENSE +553 -0
- package/vendor/mbedtls/include/CMakeLists.txt +22 -0
- package/vendor/mbedtls/include/mbedtls/aes.h +631 -0
- package/vendor/mbedtls/include/mbedtls/aria.h +343 -0
- package/vendor/mbedtls/include/mbedtls/asn1.h +642 -0
- package/vendor/mbedtls/include/mbedtls/asn1write.h +390 -0
- package/vendor/mbedtls/include/mbedtls/base64.h +82 -0
- package/vendor/mbedtls/include/mbedtls/bignum.h +1088 -0
- package/vendor/mbedtls/include/mbedtls/block_cipher.h +76 -0
- package/vendor/mbedtls/include/mbedtls/build_info.h +194 -0
- package/vendor/mbedtls/include/mbedtls/camellia.h +305 -0
- package/vendor/mbedtls/include/mbedtls/ccm.h +526 -0
- package/vendor/mbedtls/include/mbedtls/chacha20.h +209 -0
- package/vendor/mbedtls/include/mbedtls/chachapoly.h +351 -0
- package/vendor/mbedtls/include/mbedtls/check_config.h +1149 -0
- package/vendor/mbedtls/include/mbedtls/cipher.h +1250 -0
- package/vendor/mbedtls/include/mbedtls/cmac.h +246 -0
- package/vendor/mbedtls/include/mbedtls/compat-2.x.h +46 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_legacy_crypto.h +578 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_legacy_from_psa.h +873 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_psa_from_legacy.h +359 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_psa_superset_legacy.h +145 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_ssl.h +91 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_x509.h +35 -0
- package/vendor/mbedtls/include/mbedtls/config_psa.h +61 -0
- package/vendor/mbedtls/include/mbedtls/constant_time.h +36 -0
- package/vendor/mbedtls/include/mbedtls/ctr_drbg.h +596 -0
- package/vendor/mbedtls/include/mbedtls/debug.h +156 -0
- package/vendor/mbedtls/include/mbedtls/des.h +385 -0
- package/vendor/mbedtls/include/mbedtls/dhm.h +972 -0
- package/vendor/mbedtls/include/mbedtls/ecdh.h +455 -0
- package/vendor/mbedtls/include/mbedtls/ecdsa.h +674 -0
- package/vendor/mbedtls/include/mbedtls/ecjpake.h +298 -0
- package/vendor/mbedtls/include/mbedtls/ecp.h +1517 -0
- package/vendor/mbedtls/include/mbedtls/entropy.h +274 -0
- package/vendor/mbedtls/include/mbedtls/error.h +201 -0
- package/vendor/mbedtls/include/mbedtls/gcm.h +387 -0
- package/vendor/mbedtls/include/mbedtls/hkdf.h +124 -0
- package/vendor/mbedtls/include/mbedtls/hmac_drbg.h +434 -0
- package/vendor/mbedtls/include/mbedtls/lms.h +440 -0
- package/vendor/mbedtls/include/mbedtls/mbedtls_config.h +4446 -0
- package/vendor/mbedtls/include/mbedtls/md.h +526 -0
- package/vendor/mbedtls/include/mbedtls/md5.h +190 -0
- package/vendor/mbedtls/include/mbedtls/memory_buffer_alloc.h +142 -0
- package/vendor/mbedtls/include/mbedtls/net_sockets.h +299 -0
- package/vendor/mbedtls/include/mbedtls/nist_kw.h +166 -0
- package/vendor/mbedtls/include/mbedtls/oid.h +727 -0
- package/vendor/mbedtls/include/mbedtls/pem.h +160 -0
- package/vendor/mbedtls/include/mbedtls/pk.h +1303 -0
- package/vendor/mbedtls/include/mbedtls/pkcs12.h +186 -0
- package/vendor/mbedtls/include/mbedtls/pkcs5.h +198 -0
- package/vendor/mbedtls/include/mbedtls/pkcs7.h +252 -0
- package/vendor/mbedtls/include/mbedtls/platform.h +516 -0
- package/vendor/mbedtls/include/mbedtls/platform_time.h +79 -0
- package/vendor/mbedtls/include/mbedtls/platform_util.h +247 -0
- package/vendor/mbedtls/include/mbedtls/poly1305.h +168 -0
- package/vendor/mbedtls/include/mbedtls/private_access.h +20 -0
- package/vendor/mbedtls/include/mbedtls/psa_util.h +207 -0
- package/vendor/mbedtls/include/mbedtls/ripemd160.h +136 -0
- package/vendor/mbedtls/include/mbedtls/rsa.h +1170 -0
- package/vendor/mbedtls/include/mbedtls/sha1.h +219 -0
- package/vendor/mbedtls/include/mbedtls/sha256.h +200 -0
- package/vendor/mbedtls/include/mbedtls/sha3.h +172 -0
- package/vendor/mbedtls/include/mbedtls/sha512.h +208 -0
- package/vendor/mbedtls/include/mbedtls/ssl.h +5887 -0
- package/vendor/mbedtls/include/mbedtls/ssl_cache.h +187 -0
- package/vendor/mbedtls/include/mbedtls/ssl_ciphersuites.h +482 -0
- package/vendor/mbedtls/include/mbedtls/ssl_cookie.h +106 -0
- package/vendor/mbedtls/include/mbedtls/ssl_ticket.h +199 -0
- package/vendor/mbedtls/include/mbedtls/threading.h +167 -0
- package/vendor/mbedtls/include/mbedtls/timing.h +94 -0
- package/vendor/mbedtls/include/mbedtls/version.h +78 -0
- package/vendor/mbedtls/include/mbedtls/x509.h +500 -0
- package/vendor/mbedtls/include/mbedtls/x509_crl.h +184 -0
- package/vendor/mbedtls/include/mbedtls/x509_crt.h +1208 -0
- package/vendor/mbedtls/include/mbedtls/x509_csr.h +382 -0
- package/vendor/mbedtls/include/psa/build_info.h +20 -0
- package/vendor/mbedtls/include/psa/crypto.h +4998 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_auto_enabled.h +31 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_config_dependencies.h +51 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_config_key_pair_types.h +101 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_config_synonyms.h +49 -0
- package/vendor/mbedtls/include/psa/crypto_builtin_composites.h +214 -0
- package/vendor/mbedtls/include/psa/crypto_builtin_key_derivation.h +118 -0
- package/vendor/mbedtls/include/psa/crypto_builtin_primitives.h +114 -0
- package/vendor/mbedtls/include/psa/crypto_compat.h +230 -0
- package/vendor/mbedtls/include/psa/crypto_config.h +145 -0
- package/vendor/mbedtls/include/psa/crypto_driver_common.h +44 -0
- package/vendor/mbedtls/include/psa/crypto_driver_contexts_composites.h +151 -0
- package/vendor/mbedtls/include/psa/crypto_driver_contexts_key_derivation.h +52 -0
- package/vendor/mbedtls/include/psa/crypto_driver_contexts_primitives.h +105 -0
- package/vendor/mbedtls/include/psa/crypto_extra.h +2145 -0
- package/vendor/mbedtls/include/psa/crypto_legacy.h +88 -0
- package/vendor/mbedtls/include/psa/crypto_platform.h +102 -0
- package/vendor/mbedtls/include/psa/crypto_se_driver.h +1383 -0
- package/vendor/mbedtls/include/psa/crypto_sizes.h +1319 -0
- package/vendor/mbedtls/include/psa/crypto_struct.h +527 -0
- package/vendor/mbedtls/include/psa/crypto_types.h +508 -0
- package/vendor/mbedtls/include/psa/crypto_values.h +2782 -0
- package/vendor/mbedtls/library/aes.c +2294 -0
- package/vendor/mbedtls/library/aesce.c +624 -0
- package/vendor/mbedtls/library/aesce.h +136 -0
- package/vendor/mbedtls/library/aesni.c +846 -0
- package/vendor/mbedtls/library/aesni.h +162 -0
- package/vendor/mbedtls/library/alignment.h +704 -0
- package/vendor/mbedtls/library/aria.c +969 -0
- package/vendor/mbedtls/library/asn1parse.c +468 -0
- package/vendor/mbedtls/library/asn1write.c +440 -0
- package/vendor/mbedtls/library/base64.c +322 -0
- package/vendor/mbedtls/library/base64_internal.h +45 -0
- package/vendor/mbedtls/library/bignum.c +2583 -0
- package/vendor/mbedtls/library/bignum_core.c +1240 -0
- package/vendor/mbedtls/library/bignum_core.h +872 -0
- package/vendor/mbedtls/library/bignum_core_invasive.h +38 -0
- package/vendor/mbedtls/library/bignum_internal.h +122 -0
- package/vendor/mbedtls/library/bignum_mod.c +394 -0
- package/vendor/mbedtls/library/bignum_mod.h +452 -0
- package/vendor/mbedtls/library/bignum_mod_raw.c +276 -0
- package/vendor/mbedtls/library/bignum_mod_raw.h +416 -0
- package/vendor/mbedtls/library/bignum_mod_raw_invasive.h +34 -0
- package/vendor/mbedtls/library/block_cipher.c +207 -0
- package/vendor/mbedtls/library/block_cipher_internal.h +99 -0
- package/vendor/mbedtls/library/bn_mul.h +1094 -0
- package/vendor/mbedtls/library/camellia.c +1058 -0
- package/vendor/mbedtls/library/ccm.c +777 -0
- package/vendor/mbedtls/library/chacha20.c +563 -0
- package/vendor/mbedtls/library/chacha20_internal.h +23 -0
- package/vendor/mbedtls/library/chachapoly.c +487 -0
- package/vendor/mbedtls/library/check_crypto_config.h +136 -0
- package/vendor/mbedtls/library/cipher.c +1712 -0
- package/vendor/mbedtls/library/cipher_invasive.h +28 -0
- package/vendor/mbedtls/library/cipher_wrap.c +2482 -0
- package/vendor/mbedtls/library/cipher_wrap.h +178 -0
- package/vendor/mbedtls/library/cmac.c +1067 -0
- package/vendor/mbedtls/library/common.h +487 -0
- package/vendor/mbedtls/library/constant_time.c +247 -0
- package/vendor/mbedtls/library/constant_time_impl.h +541 -0
- package/vendor/mbedtls/library/constant_time_internal.h +579 -0
- package/vendor/mbedtls/library/ctr.h +35 -0
- package/vendor/mbedtls/library/ctr_drbg.c +1016 -0
- package/vendor/mbedtls/library/debug.c +475 -0
- package/vendor/mbedtls/library/debug_internal.h +185 -0
- package/vendor/mbedtls/library/des.c +1042 -0
- package/vendor/mbedtls/library/dhm.c +700 -0
- package/vendor/mbedtls/library/ecdh.c +696 -0
- package/vendor/mbedtls/library/ecdsa.c +858 -0
- package/vendor/mbedtls/library/ecjpake.c +1216 -0
- package/vendor/mbedtls/library/ecp.c +3674 -0
- package/vendor/mbedtls/library/ecp_curves.c +6125 -0
- package/vendor/mbedtls/library/ecp_curves_new.c +9 -0
- package/vendor/mbedtls/library/ecp_internal_alt.h +287 -0
- package/vendor/mbedtls/library/ecp_invasive.h +305 -0
- package/vendor/mbedtls/library/entropy.c +680 -0
- package/vendor/mbedtls/library/entropy_poll.c +233 -0
- package/vendor/mbedtls/library/entropy_poll.h +64 -0
- package/vendor/mbedtls/library/error.c +878 -0
- package/vendor/mbedtls/library/gcm.c +1330 -0
- package/vendor/mbedtls/library/hkdf.c +161 -0
- package/vendor/mbedtls/library/hmac_drbg.c +633 -0
- package/vendor/mbedtls/library/lmots.c +789 -0
- package/vendor/mbedtls/library/lmots.h +288 -0
- package/vendor/mbedtls/library/lms.c +778 -0
- package/vendor/mbedtls/library/md.c +1108 -0
- package/vendor/mbedtls/library/md5.c +426 -0
- package/vendor/mbedtls/library/md_psa.h +26 -0
- package/vendor/mbedtls/library/md_wrap.h +46 -0
- package/vendor/mbedtls/library/memory_buffer_alloc.c +751 -0
- package/vendor/mbedtls/library/mps_common.h +181 -0
- package/vendor/mbedtls/library/mps_error.h +89 -0
- package/vendor/mbedtls/library/mps_reader.c +538 -0
- package/vendor/mbedtls/library/mps_reader.h +366 -0
- package/vendor/mbedtls/library/mps_trace.c +112 -0
- package/vendor/mbedtls/library/mps_trace.h +154 -0
- package/vendor/mbedtls/library/net_sockets.c +694 -0
- package/vendor/mbedtls/library/nist_kw.c +729 -0
- package/vendor/mbedtls/library/oid.c +1166 -0
- package/vendor/mbedtls/library/padlock.c +157 -0
- package/vendor/mbedtls/library/padlock.h +111 -0
- package/vendor/mbedtls/library/pem.c +554 -0
- package/vendor/mbedtls/library/pk.c +1602 -0
- package/vendor/mbedtls/library/pk_ecc.c +261 -0
- package/vendor/mbedtls/library/pk_internal.h +241 -0
- package/vendor/mbedtls/library/pk_wrap.c +1618 -0
- package/vendor/mbedtls/library/pk_wrap.h +138 -0
- package/vendor/mbedtls/library/pkcs12.c +437 -0
- package/vendor/mbedtls/library/pkcs5.c +500 -0
- package/vendor/mbedtls/library/pkcs7.c +787 -0
- package/vendor/mbedtls/library/pkparse.c +1392 -0
- package/vendor/mbedtls/library/pkwrite.c +631 -0
- package/vendor/mbedtls/library/pkwrite.h +121 -0
- package/vendor/mbedtls/library/platform.c +402 -0
- package/vendor/mbedtls/library/platform_util.c +258 -0
- package/vendor/mbedtls/library/poly1305.c +492 -0
- package/vendor/mbedtls/library/psa_crypto.c +9532 -0
- package/vendor/mbedtls/library/psa_crypto_aead.c +646 -0
- package/vendor/mbedtls/library/psa_crypto_aead.h +499 -0
- package/vendor/mbedtls/library/psa_crypto_cipher.c +747 -0
- package/vendor/mbedtls/library/psa_crypto_cipher.h +316 -0
- package/vendor/mbedtls/library/psa_crypto_client.c +22 -0
- package/vendor/mbedtls/library/psa_crypto_core.h +983 -0
- package/vendor/mbedtls/library/psa_crypto_core_common.h +52 -0
- package/vendor/mbedtls/library/psa_crypto_driver_wrappers.h +2896 -0
- package/vendor/mbedtls/library/psa_crypto_driver_wrappers_no_static.c +256 -0
- package/vendor/mbedtls/library/psa_crypto_driver_wrappers_no_static.h +31 -0
- package/vendor/mbedtls/library/psa_crypto_ecp.c +594 -0
- package/vendor/mbedtls/library/psa_crypto_ecp.h +267 -0
- package/vendor/mbedtls/library/psa_crypto_ffdh.c +361 -0
- package/vendor/mbedtls/library/psa_crypto_ffdh.h +131 -0
- package/vendor/mbedtls/library/psa_crypto_hash.c +470 -0
- package/vendor/mbedtls/library/psa_crypto_hash.h +211 -0
- package/vendor/mbedtls/library/psa_crypto_invasive.h +92 -0
- package/vendor/mbedtls/library/psa_crypto_its.h +131 -0
- package/vendor/mbedtls/library/psa_crypto_mac.c +505 -0
- package/vendor/mbedtls/library/psa_crypto_mac.h +264 -0
- package/vendor/mbedtls/library/psa_crypto_pake.c +571 -0
- package/vendor/mbedtls/library/psa_crypto_pake.h +159 -0
- package/vendor/mbedtls/library/psa_crypto_random.c +181 -0
- package/vendor/mbedtls/library/psa_crypto_random.h +72 -0
- package/vendor/mbedtls/library/psa_crypto_random_impl.h +200 -0
- package/vendor/mbedtls/library/psa_crypto_rsa.c +714 -0
- package/vendor/mbedtls/library/psa_crypto_rsa.h +321 -0
- package/vendor/mbedtls/library/psa_crypto_se.c +373 -0
- package/vendor/mbedtls/library/psa_crypto_se.h +192 -0
- package/vendor/mbedtls/library/psa_crypto_slot_management.c +1137 -0
- package/vendor/mbedtls/library/psa_crypto_slot_management.h +344 -0
- package/vendor/mbedtls/library/psa_crypto_storage.c +481 -0
- package/vendor/mbedtls/library/psa_crypto_storage.h +392 -0
- package/vendor/mbedtls/library/psa_its_file.c +254 -0
- package/vendor/mbedtls/library/psa_util.c +614 -0
- package/vendor/mbedtls/library/psa_util_internal.h +100 -0
- package/vendor/mbedtls/library/ripemd160.c +490 -0
- package/vendor/mbedtls/library/rsa.c +3121 -0
- package/vendor/mbedtls/library/rsa_alt_helpers.c +455 -0
- package/vendor/mbedtls/library/rsa_alt_helpers.h +209 -0
- package/vendor/mbedtls/library/rsa_internal.h +188 -0
- package/vendor/mbedtls/library/sha1.c +480 -0
- package/vendor/mbedtls/library/sha256.c +983 -0
- package/vendor/mbedtls/library/sha3.c +721 -0
- package/vendor/mbedtls/library/sha512.c +1115 -0
- package/vendor/mbedtls/library/ssl_cache.c +410 -0
- package/vendor/mbedtls/library/ssl_ciphersuites.c +2050 -0
- package/vendor/mbedtls/library/ssl_ciphersuites_internal.h +154 -0
- package/vendor/mbedtls/library/ssl_client.c +1023 -0
- package/vendor/mbedtls/library/ssl_client.h +22 -0
- package/vendor/mbedtls/library/ssl_cookie.c +384 -0
- package/vendor/mbedtls/library/ssl_debug_helpers.h +85 -0
- package/vendor/mbedtls/library/ssl_debug_helpers_generated.c +251 -0
- package/vendor/mbedtls/library/ssl_misc.h +3198 -0
- package/vendor/mbedtls/library/ssl_msg.c +6619 -0
- package/vendor/mbedtls/library/ssl_ticket.c +556 -0
- package/vendor/mbedtls/library/ssl_tls.c +10234 -0
- package/vendor/mbedtls/library/ssl_tls12_client.c +3688 -0
- package/vendor/mbedtls/library/ssl_tls12_server.c +4311 -0
- package/vendor/mbedtls/library/ssl_tls13_client.c +3208 -0
- package/vendor/mbedtls/library/ssl_tls13_generic.c +1793 -0
- package/vendor/mbedtls/library/ssl_tls13_invasive.h +23 -0
- package/vendor/mbedtls/library/ssl_tls13_keys.c +1918 -0
- package/vendor/mbedtls/library/ssl_tls13_keys.h +668 -0
- package/vendor/mbedtls/library/ssl_tls13_server.c +3624 -0
- package/vendor/mbedtls/library/threading.c +193 -0
- package/vendor/mbedtls/library/threading_internal.h +28 -0
- package/vendor/mbedtls/library/timing.c +152 -0
- package/vendor/mbedtls/library/version.c +32 -0
- package/vendor/mbedtls/library/version_features.c +856 -0
- package/vendor/mbedtls/library/x509.c +1776 -0
- package/vendor/mbedtls/library/x509_create.c +570 -0
- package/vendor/mbedtls/library/x509_crl.c +708 -0
- package/vendor/mbedtls/library/x509_crt.c +3311 -0
- package/vendor/mbedtls/library/x509_csr.c +648 -0
- package/vendor/mbedtls/library/x509_internal.h +101 -0
- package/vendor/mbedtls/library/x509write.c +174 -0
- package/vendor/mbedtls/library/x509write_crt.c +688 -0
- package/vendor/mbedtls/library/x509write_csr.c +336 -0
- package/vendor/quickjs-ng/CMakeLists.txt +566 -0
- package/vendor/quickjs-ng/LICENSE +24 -0
- package/vendor/quickjs-ng/README.md +24 -0
- package/vendor/quickjs-ng/api-test.c +1195 -0
- package/vendor/quickjs-ng/builtin-array-fromasync.h +119 -0
- package/vendor/quickjs-ng/builtin-iterator-zip-keyed.h +332 -0
- package/vendor/quickjs-ng/builtin-iterator-zip.h +337 -0
- package/vendor/quickjs-ng/cutils.h +1998 -0
- package/vendor/quickjs-ng/dtoa.c +1619 -0
- package/vendor/quickjs-ng/dtoa.h +87 -0
- package/vendor/quickjs-ng/gen/function_source.c +81 -0
- package/vendor/quickjs-ng/gen/hello.c +53 -0
- package/vendor/quickjs-ng/gen/hello_module.c +106 -0
- package/vendor/quickjs-ng/gen/repl.c +3036 -0
- package/vendor/quickjs-ng/gen/standalone.c +323 -0
- package/vendor/quickjs-ng/gen/test_fib.c +81 -0
- package/vendor/quickjs-ng/libregexp-opcode.h +73 -0
- package/vendor/quickjs-ng/libregexp.c +3474 -0
- package/vendor/quickjs-ng/libregexp.h +101 -0
- package/vendor/quickjs-ng/libunicode-table.h +5173 -0
- package/vendor/quickjs-ng/libunicode.c +2069 -0
- package/vendor/quickjs-ng/libunicode.h +172 -0
- package/vendor/quickjs-ng/list.h +107 -0
- package/vendor/quickjs-ng/lre-test.c +52 -0
- package/vendor/quickjs-ng/qjs.c +762 -0
- package/vendor/quickjs-ng/qjsc.c +673 -0
- package/vendor/quickjs-ng/quickjs-atom.h +280 -0
- package/vendor/quickjs-ng/quickjs-c-atomics.h +54 -0
- package/vendor/quickjs-ng/quickjs-libc.c +5037 -0
- package/vendor/quickjs-ng/quickjs-libc.h +87 -0
- package/vendor/quickjs-ng/quickjs-opcode.h +377 -0
- package/vendor/quickjs-ng/quickjs.c +64041 -0
- package/vendor/quickjs-ng/quickjs.h +1447 -0
- package/vendor/quickjs-ng/run-test262.c +2374 -0
- package/vendor/quickjs-ng/unicode_gen.c +3121 -0
- package/vendor/quickjs-ng/unicode_gen_def.h +310 -0
- package/vendor/ryu/LICENSE-Boost +23 -0
- package/vendor/ryu/common.h +114 -0
- package/vendor/ryu/d2s.c +509 -0
- package/vendor/ryu/d2s_full_table.h +367 -0
- package/vendor/ryu/d2s_intrinsics.h +357 -0
- package/vendor/ryu/d2s_small_table.h +186 -0
- package/vendor/ryu/digit_table.h +35 -0
- package/vendor/ryu/ryu.h +46 -0
- package/vendor/zlib/LICENSE +22 -0
- package/vendor/zlib/adler32.c +164 -0
- package/vendor/zlib/compress.c +75 -0
- package/vendor/zlib/crc32.c +1049 -0
- package/vendor/zlib/crc32.h +9446 -0
- package/vendor/zlib/deflate.c +2139 -0
- package/vendor/zlib/deflate.h +377 -0
- package/vendor/zlib/gzclose.c +23 -0
- package/vendor/zlib/gzguts.h +214 -0
- package/vendor/zlib/gzlib.c +582 -0
- package/vendor/zlib/gzread.c +602 -0
- package/vendor/zlib/gzwrite.c +631 -0
- package/vendor/zlib/infback.c +628 -0
- package/vendor/zlib/inffast.c +320 -0
- package/vendor/zlib/inffast.h +11 -0
- package/vendor/zlib/inffixed.h +94 -0
- package/vendor/zlib/inflate.c +1526 -0
- package/vendor/zlib/inflate.h +126 -0
- package/vendor/zlib/inftrees.c +299 -0
- package/vendor/zlib/inftrees.h +62 -0
- package/vendor/zlib/trees.c +1117 -0
- package/vendor/zlib/trees.h +128 -0
- package/vendor/zlib/uncompr.c +85 -0
- package/vendor/zlib/zconf.h +543 -0
- package/vendor/zlib/zlib.h +1938 -0
- package/vendor/zlib/zutil.c +299 -0
- package/vendor/zlib/zutil.h +254 -0
- package/README.md +0 -3
- 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 */
|