visaljs 0.0.10 → 0.0.11

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 (221) hide show
  1. package/README.md +12 -4
  2. package/THIRD_PARTY_LICENSES +31 -1
  3. package/cli.js +962 -68
  4. package/node/include/js_node.h +11 -1
  5. package/node/prelude/_http_common.js +29 -0
  6. package/node/prelude/async_hooks.js +50 -11
  7. package/node/prelude/child_process.js +31 -4
  8. package/node/prelude/console.js +311 -143
  9. package/node/prelude/crypto.js +6 -4
  10. package/node/prelude/dgram.js +1169 -0
  11. package/node/prelude/diagnostics_channel.js +3 -1
  12. package/node/prelude/dns.js +250 -45
  13. package/node/prelude/dns_promises.js +8 -2
  14. package/node/prelude/fs_promises.js +9 -1
  15. package/node/prelude/http.js +395 -86
  16. package/node/prelude/https.js +13 -4
  17. package/node/prelude/internal/console_class.js +7 -0
  18. package/node/prelude/internal/console_global.js +25 -0
  19. package/node/prelude/internal/crypto/key_encryption.js +217 -0
  20. package/node/prelude/internal/crypto/keys.js +161 -26
  21. package/node/prelude/internal/crypto/random.js +24 -0
  22. package/node/prelude/internal/crypto/util.js +2 -1
  23. package/node/prelude/internal/crypto_x509.js +161 -0
  24. package/node/prelude/internal/dns_classes.js +6 -0
  25. package/node/prelude/internal/dns_resolver.js +371 -0
  26. package/node/prelude/internal/errors.js +9 -0
  27. package/node/prelude/internal/events_on.js +82 -37
  28. package/node/prelude/internal/features.js +8 -4
  29. package/node/prelude/internal/fs_filehandle.js +10 -4
  30. package/node/prelude/internal/perf_histogram.js +1 -1
  31. package/node/prelude/internal/process_more.js +32 -17
  32. package/node/prelude/internal/process_signals.js +8 -2
  33. package/node/prelude/internal/punycode.ts +163 -0
  34. package/node/prelude/internal/readline.js +648 -274
  35. package/node/prelude/internal/readline_editor.js +1240 -0
  36. package/node/prelude/internal/string_width.js +43 -0
  37. package/node/prelude/internal/tls/common.js +145 -33
  38. package/node/prelude/internal/tls/wrap.js +182 -49
  39. package/node/prelude/internal/tls/x509.js +4 -1
  40. package/node/prelude/internal/udp.js +177 -0
  41. package/node/prelude/net.js +13 -1
  42. package/node/prelude/os.js +24 -6
  43. package/node/prelude/perf_hooks.js +37 -2
  44. package/node/prelude/punycode.js +2 -130
  45. package/node/prelude/readline.js +113 -4
  46. package/node/prelude/readline_promises.js +56 -32
  47. package/node/prelude/tls.js +21 -4
  48. package/node/prelude/util.js +3 -16
  49. package/node/src/host_dns.c +623 -0
  50. package/node/src/host_http.c +12 -0
  51. package/node/src/host_net.c +46 -0
  52. package/node/src/host_os.c +1 -6
  53. package/node/src/host_sys.c +70 -0
  54. package/node/src/host_udp.c +418 -0
  55. package/node/third_party/c-ares/LICENSE.md +24 -0
  56. package/node/third_party/c-ares/config/darwin/ares_config.h +573 -0
  57. package/node/third_party/c-ares/config/freebsd/ares_config.h +573 -0
  58. package/node/third_party/c-ares/config/linux/ares_config.h +573 -0
  59. package/node/third_party/c-ares/config/openbsd/ares_config.h +583 -0
  60. package/node/third_party/c-ares/include/ares.h +1237 -0
  61. package/node/third_party/c-ares/include/ares_build.h +202 -0
  62. package/node/third_party/c-ares/include/ares_dns.h +127 -0
  63. package/node/third_party/c-ares/include/ares_dns_record.h +1119 -0
  64. package/node/third_party/c-ares/include/ares_nameser.h +510 -0
  65. package/node/third_party/c-ares/include/ares_version.h +47 -0
  66. package/node/third_party/c-ares/src/lib/ares_addrinfo2hostent.c +305 -0
  67. package/node/third_party/c-ares/src/lib/ares_addrinfo_localhost.c +245 -0
  68. package/node/third_party/c-ares/src/lib/ares_android.c +496 -0
  69. package/node/third_party/c-ares/src/lib/ares_android.h +38 -0
  70. package/node/third_party/c-ares/src/lib/ares_cancel.c +87 -0
  71. package/node/third_party/c-ares/src/lib/ares_close_sockets.c +137 -0
  72. package/node/third_party/c-ares/src/lib/ares_conn.c +511 -0
  73. package/node/third_party/c-ares/src/lib/ares_conn.h +202 -0
  74. package/node/third_party/c-ares/src/lib/ares_cookie.c +461 -0
  75. package/node/third_party/c-ares/src/lib/ares_data.c +168 -0
  76. package/node/third_party/c-ares/src/lib/ares_data.h +92 -0
  77. package/node/third_party/c-ares/src/lib/ares_destroy.c +159 -0
  78. package/node/third_party/c-ares/src/lib/ares_free_hostent.c +54 -0
  79. package/node/third_party/c-ares/src/lib/ares_free_string.c +33 -0
  80. package/node/third_party/c-ares/src/lib/ares_freeaddrinfo.c +67 -0
  81. package/node/third_party/c-ares/src/lib/ares_getaddrinfo.c +806 -0
  82. package/node/third_party/c-ares/src/lib/ares_getenv.c +38 -0
  83. package/node/third_party/c-ares/src/lib/ares_getenv.h +34 -0
  84. package/node/third_party/c-ares/src/lib/ares_gethostbyaddr.c +229 -0
  85. package/node/third_party/c-ares/src/lib/ares_gethostbyname.c +341 -0
  86. package/node/third_party/c-ares/src/lib/ares_getnameinfo.c +437 -0
  87. package/node/third_party/c-ares/src/lib/ares_hosts_file.c +960 -0
  88. package/node/third_party/c-ares/src/lib/ares_inet_net_pton.h +31 -0
  89. package/node/third_party/c-ares/src/lib/ares_init.c +631 -0
  90. package/node/third_party/c-ares/src/lib/ares_ipv6.h +115 -0
  91. package/node/third_party/c-ares/src/lib/ares_library_init.c +190 -0
  92. package/node/third_party/c-ares/src/lib/ares_metrics.c +261 -0
  93. package/node/third_party/c-ares/src/lib/ares_options.c +492 -0
  94. package/node/third_party/c-ares/src/lib/ares_parse_into_addrinfo.c +179 -0
  95. package/node/third_party/c-ares/src/lib/ares_private.h +648 -0
  96. package/node/third_party/c-ares/src/lib/ares_process.c +1649 -0
  97. package/node/third_party/c-ares/src/lib/ares_qcache.c +442 -0
  98. package/node/third_party/c-ares/src/lib/ares_query.c +151 -0
  99. package/node/third_party/c-ares/src/lib/ares_search.c +623 -0
  100. package/node/third_party/c-ares/src/lib/ares_send.c +300 -0
  101. package/node/third_party/c-ares/src/lib/ares_set_socket_functions.c +590 -0
  102. package/node/third_party/c-ares/src/lib/ares_setup.h +224 -0
  103. package/node/third_party/c-ares/src/lib/ares_socket.c +427 -0
  104. package/node/third_party/c-ares/src/lib/ares_socket.h +163 -0
  105. package/node/third_party/c-ares/src/lib/ares_sortaddrinfo.c +447 -0
  106. package/node/third_party/c-ares/src/lib/ares_strerror.c +91 -0
  107. package/node/third_party/c-ares/src/lib/ares_sysconfig.c +642 -0
  108. package/node/third_party/c-ares/src/lib/ares_sysconfig_files.c +851 -0
  109. package/node/third_party/c-ares/src/lib/ares_sysconfig_mac.c +373 -0
  110. package/node/third_party/c-ares/src/lib/ares_sysconfig_win.c +673 -0
  111. package/node/third_party/c-ares/src/lib/ares_timeout.c +162 -0
  112. package/node/third_party/c-ares/src/lib/ares_update_servers.c +1376 -0
  113. package/node/third_party/c-ares/src/lib/ares_version.c +36 -0
  114. package/node/third_party/c-ares/src/lib/config-dos.h +114 -0
  115. package/node/third_party/c-ares/src/lib/config-win32.h +396 -0
  116. package/node/third_party/c-ares/src/lib/dsa/ares_array.c +409 -0
  117. package/node/third_party/c-ares/src/lib/dsa/ares_htable.c +451 -0
  118. package/node/third_party/c-ares/src/lib/dsa/ares_htable.h +174 -0
  119. package/node/third_party/c-ares/src/lib/dsa/ares_htable_asvp.c +224 -0
  120. package/node/third_party/c-ares/src/lib/dsa/ares_htable_dict.c +230 -0
  121. package/node/third_party/c-ares/src/lib/dsa/ares_htable_strvp.c +210 -0
  122. package/node/third_party/c-ares/src/lib/dsa/ares_htable_szvp.c +188 -0
  123. package/node/third_party/c-ares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  124. package/node/third_party/c-ares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  125. package/node/third_party/c-ares/src/lib/dsa/ares_llist.c +385 -0
  126. package/node/third_party/c-ares/src/lib/dsa/ares_slist.c +479 -0
  127. package/node/third_party/c-ares/src/lib/dsa/ares_slist.h +207 -0
  128. package/node/third_party/c-ares/src/lib/event/ares_event.h +191 -0
  129. package/node/third_party/c-ares/src/lib/event/ares_event_configchg.c +746 -0
  130. package/node/third_party/c-ares/src/lib/event/ares_event_epoll.c +192 -0
  131. package/node/third_party/c-ares/src/lib/event/ares_event_kqueue.c +248 -0
  132. package/node/third_party/c-ares/src/lib/event/ares_event_poll.c +140 -0
  133. package/node/third_party/c-ares/src/lib/event/ares_event_select.c +159 -0
  134. package/node/third_party/c-ares/src/lib/event/ares_event_thread.c +575 -0
  135. package/node/third_party/c-ares/src/lib/event/ares_event_wake_pipe.c +172 -0
  136. package/node/third_party/c-ares/src/lib/event/ares_event_win32.c +981 -0
  137. package/node/third_party/c-ares/src/lib/event/ares_event_win32.h +161 -0
  138. package/node/third_party/c-ares/src/lib/include/ares_array.h +276 -0
  139. package/node/third_party/c-ares/src/lib/include/ares_buf.h +732 -0
  140. package/node/third_party/c-ares/src/lib/include/ares_htable_asvp.h +130 -0
  141. package/node/third_party/c-ares/src/lib/include/ares_htable_dict.h +123 -0
  142. package/node/third_party/c-ares/src/lib/include/ares_htable_strvp.h +130 -0
  143. package/node/third_party/c-ares/src/lib/include/ares_htable_szvp.h +118 -0
  144. package/node/third_party/c-ares/src/lib/include/ares_htable_vpstr.h +111 -0
  145. package/node/third_party/c-ares/src/lib/include/ares_htable_vpvp.h +128 -0
  146. package/node/third_party/c-ares/src/lib/include/ares_llist.h +239 -0
  147. package/node/third_party/c-ares/src/lib/include/ares_mem.h +41 -0
  148. package/node/third_party/c-ares/src/lib/include/ares_str.h +261 -0
  149. package/node/third_party/c-ares/src/lib/inet_net_pton.c +451 -0
  150. package/node/third_party/c-ares/src/lib/inet_ntop.c +219 -0
  151. package/node/third_party/c-ares/src/lib/legacy/ares_create_query.c +78 -0
  152. package/node/third_party/c-ares/src/lib/legacy/ares_expand_name.c +99 -0
  153. package/node/third_party/c-ares/src/lib/legacy/ares_expand_string.c +107 -0
  154. package/node/third_party/c-ares/src/lib/legacy/ares_fds.c +80 -0
  155. package/node/third_party/c-ares/src/lib/legacy/ares_getsock.c +85 -0
  156. package/node/third_party/c-ares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  157. package/node/third_party/c-ares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  158. package/node/third_party/c-ares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  159. package/node/third_party/c-ares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  160. package/node/third_party/c-ares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  161. package/node/third_party/c-ares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  162. package/node/third_party/c-ares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  163. package/node/third_party/c-ares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  164. package/node/third_party/c-ares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  165. package/node/third_party/c-ares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  166. package/node/third_party/c-ares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  167. package/node/third_party/c-ares/src/lib/record/ares_dns_mapping.c +982 -0
  168. package/node/third_party/c-ares/src/lib/record/ares_dns_multistring.c +309 -0
  169. package/node/third_party/c-ares/src/lib/record/ares_dns_multistring.h +72 -0
  170. package/node/third_party/c-ares/src/lib/record/ares_dns_name.c +736 -0
  171. package/node/third_party/c-ares/src/lib/record/ares_dns_parse.c +1360 -0
  172. package/node/third_party/c-ares/src/lib/record/ares_dns_private.h +273 -0
  173. package/node/third_party/c-ares/src/lib/record/ares_dns_record.c +1701 -0
  174. package/node/third_party/c-ares/src/lib/record/ares_dns_write.c +1229 -0
  175. package/node/third_party/c-ares/src/lib/str/ares_buf.c +1510 -0
  176. package/node/third_party/c-ares/src/lib/str/ares_str.c +562 -0
  177. package/node/third_party/c-ares/src/lib/str/ares_strsplit.c +90 -0
  178. package/node/third_party/c-ares/src/lib/str/ares_strsplit.h +51 -0
  179. package/node/third_party/c-ares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  180. package/node/third_party/c-ares/src/lib/util/ares_iface_ips.c +640 -0
  181. package/node/third_party/c-ares/src/lib/util/ares_iface_ips.h +140 -0
  182. package/node/third_party/c-ares/src/lib/util/ares_math.c +167 -0
  183. package/node/third_party/c-ares/src/lib/util/ares_math.h +58 -0
  184. package/node/third_party/c-ares/src/lib/util/ares_rand.c +389 -0
  185. package/node/third_party/c-ares/src/lib/util/ares_rand.h +36 -0
  186. package/node/third_party/c-ares/src/lib/util/ares_threads.c +613 -0
  187. package/node/third_party/c-ares/src/lib/util/ares_threads.h +60 -0
  188. package/node/third_party/c-ares/src/lib/util/ares_time.h +49 -0
  189. package/node/third_party/c-ares/src/lib/util/ares_timeval.c +95 -0
  190. package/node/third_party/c-ares/src/lib/util/ares_uri.c +1627 -0
  191. package/node/third_party/c-ares/src/lib/util/ares_uri.h +252 -0
  192. package/node/third_party/c-ares/src/lib/windows_port.c +29 -0
  193. package/package.json +1 -1
  194. package/prebuilt/darwin-arm64/cares-a6286c65ca9374a3.a +0 -0
  195. package/prebuilt/darwin-x64/cares-a6286c65ca9374a3.a +0 -0
  196. package/prebuilt/linux-arm64/cares-4ba05ac8e948af8e.a +0 -0
  197. package/prebuilt/linux-arm64-musl/cares-4ba05ac8e948af8e.a +0 -0
  198. package/prebuilt/linux-x64/cares-4ba05ac8e948af8e.a +0 -0
  199. package/prebuilt/linux-x64-musl/cares-4ba05ac8e948af8e.a +0 -0
  200. package/prebuilt/win32-x64/boringssl-ce573858472b7fc9.a +0 -0
  201. package/prebuilt/win32-x64/brotli-20d86a61f30baeb3.a +0 -0
  202. package/prebuilt/win32-x64/cares-49c9ec95162b912d.a +0 -0
  203. package/prebuilt/win32-x64/uv-b11bae65d7fced82.a +0 -0
  204. package/prebuilt/win32-x64/zlib-4ce2317a4c3f5fb5.a +0 -0
  205. package/prebuilt/win32-x64/zstd-015315ac7c784c73.a +0 -0
  206. package/runtime/include/js_builtins.h +5 -0
  207. package/runtime/include/js_crypto.h +11 -0
  208. package/runtime/include/js_gc.h +13 -10
  209. package/runtime/include/js_jobs.h +2 -0
  210. package/runtime/include/js_object.h +58 -0
  211. package/runtime/include/jscontext.h +1 -0
  212. package/runtime/src/crypto_internal.h +1 -0
  213. package/runtime/src/crypto_subtle.c +66 -7
  214. package/runtime/src/crypto_tls.c +265 -19
  215. package/runtime/src/gc.c +73 -92
  216. package/runtime/src/inspect.c +18 -1
  217. package/runtime/src/jobs.c +37 -22
  218. package/runtime/src/object.c +49 -2
  219. package/runtime/src/os.c +16 -6
  220. package/runtime/src/os.h +2 -0
  221. package/runtime/src/process.c +97 -10
@@ -197,7 +197,7 @@ static JSValue specific_type(JSContext *ctx, JSValue v) {
197
197
  JSValue s = js_concat(ctx, prefix, quoted);
198
198
  return js_is_exception(s) ? s : js_concat(ctx, s, suffix);
199
199
  }
200
- const char *type = js_is_number(v) ? "number" : js_is_bool(v) ? "boolean" : "symbol";
200
+ const char *type = js_is_number(v) ? "number" : js_is_bool(v) ? "boolean" : js_is_symbol(v) ? "symbol" : "bigint";
201
201
  JSValue shown = js_is_symbol(v) ? js_symbol_descriptive_string(ctx, v) : js_inspect(ctx, v);
202
202
  if (js_is_exception(shown)) return shown;
203
203
  snprintf(buf, sizeof buf, "type %s (", type);
@@ -293,8 +293,7 @@ NATIVE(process_getgid) { UNUSED_ARGS; (void)ctx, (void)argc, (void)argv; return
293
293
  NATIVE(process_getegid) { UNUSED_ARGS; (void)ctx, (void)argc, (void)argv; return js_number((double)getegid()); }
294
294
  #endif
295
295
 
296
- /* nextTick(callback, ...args): Node runs these before promise jobs; visaljs queues them
297
- * with them. */
296
+ /* nextTick(callback, ...args): on the tick queue, which runs before the promise jobs */
298
297
  NATIVE(process_next_tick) {
299
298
  UNUSED_ARGS;
300
299
  if (!js_is_callable(ARG(0))) return invalid_arg_type(ctx, "callback", "of type function", ARG(0));
@@ -304,7 +303,7 @@ NATIVE(process_next_tick) {
304
303
  if (js_is_exception(args)) return args;
305
304
  }
306
305
  JSJob job = { JS_JOB_CALLBACK, NULL, argv[0], args, JS_UNDEFINED, JS_UNDEFINED };
307
- js_enqueue_microtask(ctx, &job);
306
+ js_enqueue_tick(ctx, &job);
308
307
  return JS_UNDEFINED;
309
308
  }
310
309
 
@@ -467,6 +466,88 @@ static const char *arch(void) {
467
466
  #endif
468
467
  }
469
468
 
469
+ /* ---- process.env ------------------------------------------------------------------------------ */
470
+
471
+ /* Node's process.env interceptors (src/node_env_var.cc): a value is stored as a string and set in
472
+ * the C environment, a delete unsets it, and only plain data properties are accepted. Reads are
473
+ * ordinary (no get_own_property hook), so they stay as fast as a plain object's; writes aren't
474
+ * cached, so each reaches env_define. */
475
+ static bool env_populating; /* new_process copying environ in: nothing to set */
476
+
477
+ static char *env_utf8(JSContext *ctx, JSValue s) {
478
+ JSStrView v = js_string_view(ctx, s);
479
+ size_t n = js_view_to_utf8(v, NULL, 0);
480
+ char *out = malloc(n + 1);
481
+ if (!out) js_fatal("out of memory in process.env");
482
+ js_view_to_utf8(v, out, n + 1);
483
+ out[n] = '\0';
484
+ return out;
485
+ }
486
+
487
+ static void env_apply(JSContext *ctx, JSValue key, JSValue value) {
488
+ char *k = env_utf8(ctx, key);
489
+ if (js_is_undefined(value)) {
490
+ #ifdef _WIN32
491
+ _putenv_s(k, "");
492
+ #else
493
+ unsetenv(k);
494
+ #endif
495
+ } else {
496
+ char *v = env_utf8(ctx, value);
497
+ #ifdef _WIN32
498
+ _putenv_s(k, v);
499
+ #else
500
+ setenv(k, v, 1);
501
+ #endif
502
+ free(v);
503
+ }
504
+ if (strcmp(k, "TZ") == 0) js_os_timezone_changed();
505
+ free(k);
506
+ }
507
+
508
+ static int env_define(JSContext *ctx, JSObject *o, JSValue key, const JSPropertyDescriptor *desc, bool throw_on_fail) {
509
+ (void)throw_on_fail;
510
+ if (env_populating) return JS_ORDINARY;
511
+ if (js_is_symbol(key)) {
512
+ js_discard(js_throw_type_error(ctx, "Cannot convert a Symbol value to a string"));
513
+ return -1;
514
+ }
515
+ if (desc->has & (JS_DESC_GET | JS_DESC_SET)) {
516
+ js_discard(throw_with_code(ctx, JS_TYPE_ERROR, "ERR_INVALID_OBJECT_DEFINE_PROPERTY",
517
+ js_new_string_cstr(ctx, "'process.env' does not accept an accessor(getter/setter) descriptor")));
518
+ return -1;
519
+ }
520
+ const uint8_t all = JS_DESC_WRITABLE | JS_DESC_ENUMERABLE | JS_DESC_CONFIGURABLE;
521
+ bool full = (desc->has & JS_DESC_VALUE) && (desc->has & all) == all && (desc->attrs & JS_PROP_DEFAULT) == JS_PROP_DEFAULT;
522
+ /* an assignment to a variable already set: [[Set]] redefines it with the value alone */
523
+ JSPropertyDescriptor existing;
524
+ bool assign = (desc->has & JS_DESC_VALUE) && !(desc->has & all) && js_ordinary_get_own_property(ctx, o, key, &existing) == 1;
525
+ if (!full && !assign) {
526
+ js_discard(throw_with_code(ctx, JS_TYPE_ERROR, "ERR_INVALID_OBJECT_DEFINE_PROPERTY",
527
+ js_new_string_cstr(ctx, "'process.env' only accepts a configurable, writable, and enumerable data descriptor")));
528
+ return -1;
529
+ }
530
+ JSValue value = js_to_string(ctx, desc->value);
531
+ if (js_is_exception(value)) return -1;
532
+ JSValue name = js_to_string(ctx, key);
533
+ if (js_is_exception(name)) return -1;
534
+ if (js_string_length(name) == 0) return 1; /* as Node's: setenv refuses an empty name, nothing is stored */
535
+ env_apply(ctx, name, value);
536
+ JSPropertyDescriptor d = js_data_descriptor(value, JS_PROP_DEFAULT);
537
+ return js_ordinary_define_own_property(ctx, o, key, &d, true);
538
+ }
539
+
540
+ static int env_delete(JSContext *ctx, JSObject *o, JSValue key, bool throw_on_fail) {
541
+ (void)o, (void)throw_on_fail;
542
+ if (env_populating || js_is_symbol(key)) return JS_ORDINARY;
543
+ JSValue name = js_to_string(ctx, key);
544
+ if (js_is_exception(name)) return -1;
545
+ env_apply(ctx, name, JS_UNDEFINED);
546
+ return JS_ORDINARY;
547
+ }
548
+
549
+ static const JSClass env_class = { "Object", sizeof(JSObject), NULL, env_define, env_delete, NULL, NULL, NULL, NULL };
550
+
470
551
  static JSValue new_process(JSContext *ctx) {
471
552
  JSValue process = js_new_object(ctx);
472
553
  if (js_is_exception(process)) return process;
@@ -494,9 +575,11 @@ static JSValue new_process(JSContext *ctx) {
494
575
  define(ctx, p, "execArgv", js_new_array(ctx, 0)); /* Node's own options: a compiled program has none */
495
576
  define(ctx, p, "execPath", exec);
496
577
 
497
- /* env: a snapshot (writes don't reach the C environment) */
498
- JSValue env = js_new_object(ctx);
499
- if (js_is_exception(env)) return env;
578
+ /* env: the environment as it was at startup, in an object whose writes and deletes reach the C
579
+ * environment (env_class) */
580
+ JSValue env = js_object_value(js_alloc_object(ctx, JS_CELL_OBJECT, js_shape_root(ctx, &env_class,
581
+ ctx->intrinsics[JS_INTRINSIC_OBJECT_PROTOTYPE], JS_DEFAULT_INLINE_SLOTS)));
582
+ env_populating = true;
500
583
  for (size_t i = 0; environ && environ[i]; i++) {
501
584
  const char *eq = strchr(environ[i] + 1, '=');
502
585
  if (!eq) continue;
@@ -507,6 +590,7 @@ static JSValue new_process(JSContext *ctx) {
507
590
  if (js_is_exception(key)) return key;
508
591
  js_define_data(ctx, js_as_object(env), key, value, JS_PROP_DEFAULT);
509
592
  }
593
+ env_populating = false;
510
594
  define(ctx, p, "env", env);
511
595
  define(ctx, p, "pid", js_int32((int32_t)getpid()));
512
596
  /* version and versions: the Node API implemented, and visaljs's own; read-only, as Node's,
@@ -516,13 +600,16 @@ static JSValue new_process(JSContext *ctx) {
516
600
  if (js_is_exception(versions)) return versions;
517
601
  js_define_data(ctx, js_as_object(versions), js_atom_from_cstr(ctx, "node"), js_new_string_cstr(ctx, JS_NODE_VERSION), JS_PROP_ENUMERABLE | JS_PROP_CONFIGURABLE);
518
602
  js_define_data(ctx, js_as_object(versions), js_atom_from_cstr(ctx, "visaljs"), js_new_string_cstr(ctx, JS_VISALJS_VERSION), JS_PROP_ENUMERABLE | JS_PROP_CONFIGURABLE);
603
+ /* Node 24.21's OpenSSL: crypto is BoringSSL, but behaves as Node's (its errors and limits), so programs
604
+ and Node's tests see the Node they expect. Node's own check for crypto is Boolean(process.versions.openssl). */
605
+ js_define_data(ctx, js_as_object(versions), js_atom_from_cstr(ctx, "openssl"), js_new_string_cstr(ctx, "3.5.5"), JS_PROP_ENUMERABLE | JS_PROP_CONFIGURABLE);
519
606
  js_define_data(ctx, p, js_atom_from_cstr(ctx, "versions"), versions, JS_PROP_ENUMERABLE | JS_PROP_CONFIGURABLE);
520
- /* features: what this build has, in Node 24's names. No inspector, TLS from
521
- BoringSSL without OCSP stapling, require() of ES modules, no QUIC, no type stripping */
607
+ /* features: what this build has, in Node 24's names. No inspector, TLS without OCSP stapling, require()
608
+ of ES modules, no QUIC, no type stripping; openssl_is_boringssl false, as crypto behaves as OpenSSL's */
522
609
  static const struct { const char *name; bool on; } features[] = {
523
610
  { "inspector", false }, { "debug", false }, { "uv", true }, { "ipv6", true },
524
611
  { "tls_alpn", true }, { "tls_sni", true }, { "tls_ocsp", false }, { "tls", true },
525
- { "openssl_is_boringssl", true }, { "cached_builtins", true }, { "require_module", true }, { "quic", false },
612
+ { "openssl_is_boringssl", false }, { "cached_builtins", true }, { "require_module", true }, { "quic", false },
526
613
  { "typescript", false },
527
614
  };
528
615
  JSValue feats = js_new_object(ctx);