visaljs 0.0.9 → 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 (232) hide show
  1. package/README.md +12 -4
  2. package/THIRD_PARTY_LICENSES +31 -1
  3. package/cli.js +3745 -890
  4. package/node/include/js_node.h +12 -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 +405 -94
  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/http_chars.ts +22 -0
  31. package/node/prelude/internal/perf_histogram.js +1 -1
  32. package/node/prelude/internal/process_more.js +32 -17
  33. package/node/prelude/internal/process_signals.js +8 -2
  34. package/node/prelude/internal/punycode.ts +163 -0
  35. package/node/prelude/internal/readline.js +648 -274
  36. package/node/prelude/internal/readline_editor.js +1240 -0
  37. package/node/prelude/internal/string_width.js +43 -0
  38. package/node/prelude/internal/tls/common.js +145 -33
  39. package/node/prelude/internal/tls/wrap.js +182 -49
  40. package/node/prelude/internal/tls/x509.js +4 -1
  41. package/node/prelude/internal/udp.js +177 -0
  42. package/node/prelude/net.js +30 -14
  43. package/node/prelude/os.js +24 -6
  44. package/node/prelude/perf_hooks.js +37 -2
  45. package/node/prelude/punycode.js +2 -130
  46. package/node/prelude/readline.js +113 -4
  47. package/node/prelude/readline_promises.js +56 -32
  48. package/node/prelude/tls.js +21 -4
  49. package/node/prelude/util.js +3 -16
  50. package/node/src/host_dns.c +623 -0
  51. package/node/src/host_http.c +12 -0
  52. package/node/src/host_net.c +46 -0
  53. package/node/src/host_os.c +1 -6
  54. package/node/src/host_sys.c +79 -0
  55. package/node/src/host_udp.c +418 -0
  56. package/node/third_party/c-ares/LICENSE.md +24 -0
  57. package/node/third_party/c-ares/config/darwin/ares_config.h +573 -0
  58. package/node/third_party/c-ares/config/freebsd/ares_config.h +573 -0
  59. package/node/third_party/c-ares/config/linux/ares_config.h +573 -0
  60. package/node/third_party/c-ares/config/openbsd/ares_config.h +583 -0
  61. package/node/third_party/c-ares/include/ares.h +1237 -0
  62. package/node/third_party/c-ares/include/ares_build.h +202 -0
  63. package/node/third_party/c-ares/include/ares_dns.h +127 -0
  64. package/node/third_party/c-ares/include/ares_dns_record.h +1119 -0
  65. package/node/third_party/c-ares/include/ares_nameser.h +510 -0
  66. package/node/third_party/c-ares/include/ares_version.h +47 -0
  67. package/node/third_party/c-ares/src/lib/ares_addrinfo2hostent.c +305 -0
  68. package/node/third_party/c-ares/src/lib/ares_addrinfo_localhost.c +245 -0
  69. package/node/third_party/c-ares/src/lib/ares_android.c +496 -0
  70. package/node/third_party/c-ares/src/lib/ares_android.h +38 -0
  71. package/node/third_party/c-ares/src/lib/ares_cancel.c +87 -0
  72. package/node/third_party/c-ares/src/lib/ares_close_sockets.c +137 -0
  73. package/node/third_party/c-ares/src/lib/ares_conn.c +511 -0
  74. package/node/third_party/c-ares/src/lib/ares_conn.h +202 -0
  75. package/node/third_party/c-ares/src/lib/ares_cookie.c +461 -0
  76. package/node/third_party/c-ares/src/lib/ares_data.c +168 -0
  77. package/node/third_party/c-ares/src/lib/ares_data.h +92 -0
  78. package/node/third_party/c-ares/src/lib/ares_destroy.c +159 -0
  79. package/node/third_party/c-ares/src/lib/ares_free_hostent.c +54 -0
  80. package/node/third_party/c-ares/src/lib/ares_free_string.c +33 -0
  81. package/node/third_party/c-ares/src/lib/ares_freeaddrinfo.c +67 -0
  82. package/node/third_party/c-ares/src/lib/ares_getaddrinfo.c +806 -0
  83. package/node/third_party/c-ares/src/lib/ares_getenv.c +38 -0
  84. package/node/third_party/c-ares/src/lib/ares_getenv.h +34 -0
  85. package/node/third_party/c-ares/src/lib/ares_gethostbyaddr.c +229 -0
  86. package/node/third_party/c-ares/src/lib/ares_gethostbyname.c +341 -0
  87. package/node/third_party/c-ares/src/lib/ares_getnameinfo.c +437 -0
  88. package/node/third_party/c-ares/src/lib/ares_hosts_file.c +960 -0
  89. package/node/third_party/c-ares/src/lib/ares_inet_net_pton.h +31 -0
  90. package/node/third_party/c-ares/src/lib/ares_init.c +631 -0
  91. package/node/third_party/c-ares/src/lib/ares_ipv6.h +115 -0
  92. package/node/third_party/c-ares/src/lib/ares_library_init.c +190 -0
  93. package/node/third_party/c-ares/src/lib/ares_metrics.c +261 -0
  94. package/node/third_party/c-ares/src/lib/ares_options.c +492 -0
  95. package/node/third_party/c-ares/src/lib/ares_parse_into_addrinfo.c +179 -0
  96. package/node/third_party/c-ares/src/lib/ares_private.h +648 -0
  97. package/node/third_party/c-ares/src/lib/ares_process.c +1649 -0
  98. package/node/third_party/c-ares/src/lib/ares_qcache.c +442 -0
  99. package/node/third_party/c-ares/src/lib/ares_query.c +151 -0
  100. package/node/third_party/c-ares/src/lib/ares_search.c +623 -0
  101. package/node/third_party/c-ares/src/lib/ares_send.c +300 -0
  102. package/node/third_party/c-ares/src/lib/ares_set_socket_functions.c +590 -0
  103. package/node/third_party/c-ares/src/lib/ares_setup.h +224 -0
  104. package/node/third_party/c-ares/src/lib/ares_socket.c +427 -0
  105. package/node/third_party/c-ares/src/lib/ares_socket.h +163 -0
  106. package/node/third_party/c-ares/src/lib/ares_sortaddrinfo.c +447 -0
  107. package/node/third_party/c-ares/src/lib/ares_strerror.c +91 -0
  108. package/node/third_party/c-ares/src/lib/ares_sysconfig.c +642 -0
  109. package/node/third_party/c-ares/src/lib/ares_sysconfig_files.c +851 -0
  110. package/node/third_party/c-ares/src/lib/ares_sysconfig_mac.c +373 -0
  111. package/node/third_party/c-ares/src/lib/ares_sysconfig_win.c +673 -0
  112. package/node/third_party/c-ares/src/lib/ares_timeout.c +162 -0
  113. package/node/third_party/c-ares/src/lib/ares_update_servers.c +1376 -0
  114. package/node/third_party/c-ares/src/lib/ares_version.c +36 -0
  115. package/node/third_party/c-ares/src/lib/config-dos.h +114 -0
  116. package/node/third_party/c-ares/src/lib/config-win32.h +396 -0
  117. package/node/third_party/c-ares/src/lib/dsa/ares_array.c +409 -0
  118. package/node/third_party/c-ares/src/lib/dsa/ares_htable.c +451 -0
  119. package/node/third_party/c-ares/src/lib/dsa/ares_htable.h +174 -0
  120. package/node/third_party/c-ares/src/lib/dsa/ares_htable_asvp.c +224 -0
  121. package/node/third_party/c-ares/src/lib/dsa/ares_htable_dict.c +230 -0
  122. package/node/third_party/c-ares/src/lib/dsa/ares_htable_strvp.c +210 -0
  123. package/node/third_party/c-ares/src/lib/dsa/ares_htable_szvp.c +188 -0
  124. package/node/third_party/c-ares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  125. package/node/third_party/c-ares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  126. package/node/third_party/c-ares/src/lib/dsa/ares_llist.c +385 -0
  127. package/node/third_party/c-ares/src/lib/dsa/ares_slist.c +479 -0
  128. package/node/third_party/c-ares/src/lib/dsa/ares_slist.h +207 -0
  129. package/node/third_party/c-ares/src/lib/event/ares_event.h +191 -0
  130. package/node/third_party/c-ares/src/lib/event/ares_event_configchg.c +746 -0
  131. package/node/third_party/c-ares/src/lib/event/ares_event_epoll.c +192 -0
  132. package/node/third_party/c-ares/src/lib/event/ares_event_kqueue.c +248 -0
  133. package/node/third_party/c-ares/src/lib/event/ares_event_poll.c +140 -0
  134. package/node/third_party/c-ares/src/lib/event/ares_event_select.c +159 -0
  135. package/node/third_party/c-ares/src/lib/event/ares_event_thread.c +575 -0
  136. package/node/third_party/c-ares/src/lib/event/ares_event_wake_pipe.c +172 -0
  137. package/node/third_party/c-ares/src/lib/event/ares_event_win32.c +981 -0
  138. package/node/third_party/c-ares/src/lib/event/ares_event_win32.h +161 -0
  139. package/node/third_party/c-ares/src/lib/include/ares_array.h +276 -0
  140. package/node/third_party/c-ares/src/lib/include/ares_buf.h +732 -0
  141. package/node/third_party/c-ares/src/lib/include/ares_htable_asvp.h +130 -0
  142. package/node/third_party/c-ares/src/lib/include/ares_htable_dict.h +123 -0
  143. package/node/third_party/c-ares/src/lib/include/ares_htable_strvp.h +130 -0
  144. package/node/third_party/c-ares/src/lib/include/ares_htable_szvp.h +118 -0
  145. package/node/third_party/c-ares/src/lib/include/ares_htable_vpstr.h +111 -0
  146. package/node/third_party/c-ares/src/lib/include/ares_htable_vpvp.h +128 -0
  147. package/node/third_party/c-ares/src/lib/include/ares_llist.h +239 -0
  148. package/node/third_party/c-ares/src/lib/include/ares_mem.h +41 -0
  149. package/node/third_party/c-ares/src/lib/include/ares_str.h +261 -0
  150. package/node/third_party/c-ares/src/lib/inet_net_pton.c +451 -0
  151. package/node/third_party/c-ares/src/lib/inet_ntop.c +219 -0
  152. package/node/third_party/c-ares/src/lib/legacy/ares_create_query.c +78 -0
  153. package/node/third_party/c-ares/src/lib/legacy/ares_expand_name.c +99 -0
  154. package/node/third_party/c-ares/src/lib/legacy/ares_expand_string.c +107 -0
  155. package/node/third_party/c-ares/src/lib/legacy/ares_fds.c +80 -0
  156. package/node/third_party/c-ares/src/lib/legacy/ares_getsock.c +85 -0
  157. package/node/third_party/c-ares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  158. package/node/third_party/c-ares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  159. package/node/third_party/c-ares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  160. package/node/third_party/c-ares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  161. package/node/third_party/c-ares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  162. package/node/third_party/c-ares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  163. package/node/third_party/c-ares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  164. package/node/third_party/c-ares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  165. package/node/third_party/c-ares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  166. package/node/third_party/c-ares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  167. package/node/third_party/c-ares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  168. package/node/third_party/c-ares/src/lib/record/ares_dns_mapping.c +982 -0
  169. package/node/third_party/c-ares/src/lib/record/ares_dns_multistring.c +309 -0
  170. package/node/third_party/c-ares/src/lib/record/ares_dns_multistring.h +72 -0
  171. package/node/third_party/c-ares/src/lib/record/ares_dns_name.c +736 -0
  172. package/node/third_party/c-ares/src/lib/record/ares_dns_parse.c +1360 -0
  173. package/node/third_party/c-ares/src/lib/record/ares_dns_private.h +273 -0
  174. package/node/third_party/c-ares/src/lib/record/ares_dns_record.c +1701 -0
  175. package/node/third_party/c-ares/src/lib/record/ares_dns_write.c +1229 -0
  176. package/node/third_party/c-ares/src/lib/str/ares_buf.c +1510 -0
  177. package/node/third_party/c-ares/src/lib/str/ares_str.c +562 -0
  178. package/node/third_party/c-ares/src/lib/str/ares_strsplit.c +90 -0
  179. package/node/third_party/c-ares/src/lib/str/ares_strsplit.h +51 -0
  180. package/node/third_party/c-ares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  181. package/node/third_party/c-ares/src/lib/util/ares_iface_ips.c +640 -0
  182. package/node/third_party/c-ares/src/lib/util/ares_iface_ips.h +140 -0
  183. package/node/third_party/c-ares/src/lib/util/ares_math.c +167 -0
  184. package/node/third_party/c-ares/src/lib/util/ares_math.h +58 -0
  185. package/node/third_party/c-ares/src/lib/util/ares_rand.c +389 -0
  186. package/node/third_party/c-ares/src/lib/util/ares_rand.h +36 -0
  187. package/node/third_party/c-ares/src/lib/util/ares_threads.c +613 -0
  188. package/node/third_party/c-ares/src/lib/util/ares_threads.h +60 -0
  189. package/node/third_party/c-ares/src/lib/util/ares_time.h +49 -0
  190. package/node/third_party/c-ares/src/lib/util/ares_timeval.c +95 -0
  191. package/node/third_party/c-ares/src/lib/util/ares_uri.c +1627 -0
  192. package/node/third_party/c-ares/src/lib/util/ares_uri.h +252 -0
  193. package/node/third_party/c-ares/src/lib/windows_port.c +29 -0
  194. package/package.json +1 -1
  195. package/prebuilt/darwin-arm64/cares-a6286c65ca9374a3.a +0 -0
  196. package/prebuilt/darwin-x64/cares-a6286c65ca9374a3.a +0 -0
  197. package/prebuilt/linux-arm64/cares-4ba05ac8e948af8e.a +0 -0
  198. package/prebuilt/linux-arm64-musl/cares-4ba05ac8e948af8e.a +0 -0
  199. package/prebuilt/linux-x64/cares-4ba05ac8e948af8e.a +0 -0
  200. package/prebuilt/linux-x64-musl/cares-4ba05ac8e948af8e.a +0 -0
  201. package/prebuilt/win32-x64/boringssl-ce573858472b7fc9.a +0 -0
  202. package/prebuilt/win32-x64/brotli-20d86a61f30baeb3.a +0 -0
  203. package/prebuilt/win32-x64/cares-49c9ec95162b912d.a +0 -0
  204. package/prebuilt/win32-x64/uv-b11bae65d7fced82.a +0 -0
  205. package/prebuilt/win32-x64/zlib-4ce2317a4c3f5fb5.a +0 -0
  206. package/prebuilt/win32-x64/zstd-015315ac7c784c73.a +0 -0
  207. package/runtime/include/js_buffer.h +185 -0
  208. package/runtime/include/js_builtins.h +58 -0
  209. package/runtime/include/js_crypto.h +11 -0
  210. package/runtime/include/js_exception.h +3 -0
  211. package/runtime/include/js_function.h +1 -1
  212. package/runtime/include/js_gc.h +13 -10
  213. package/runtime/include/js_jobs.h +2 -0
  214. package/runtime/include/js_object.h +79 -3
  215. package/runtime/include/js_ops.h +27 -0
  216. package/runtime/include/js_runtime.h +1 -0
  217. package/runtime/include/js_web.h +0 -3
  218. package/runtime/include/jscontext.h +8 -0
  219. package/runtime/src/builtins.c +17 -4
  220. package/runtime/src/crypto_internal.h +1 -0
  221. package/runtime/src/crypto_subtle.c +66 -7
  222. package/runtime/src/crypto_tls.c +265 -19
  223. package/runtime/src/function.c +37 -10
  224. package/runtime/src/gc.c +76 -93
  225. package/runtime/src/inspect.c +18 -1
  226. package/runtime/src/iterator.c +5 -1
  227. package/runtime/src/jobs.c +37 -22
  228. package/runtime/src/object.c +91 -8
  229. package/runtime/src/os.c +16 -6
  230. package/runtime/src/os.h +2 -0
  231. package/runtime/src/process.c +97 -10
  232. package/runtime/src/typedarray.c +23 -0
package/runtime/src/os.h CHANGED
@@ -56,5 +56,7 @@ size_t js_os_peak_rss(void);
56
56
  double js_os_time_ms(void);
57
57
  int32_t js_os_local_offset(int64_t seconds, bool *dst);
58
58
  const char *js_os_timezone_id(void);
59
+ /* TZ changed (process.env.TZ): local time and the zone's id are looked up again. */
60
+ void js_os_timezone_changed(void);
59
61
 
60
62
  #endif /* JS_OS_H */
@@ -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);
@@ -1234,6 +1234,26 @@ static double hook_typed_array_length(JSValue v) {
1234
1234
  return out_of_bounds(as_ta(v)) ? -1 : (double)ta_length(as_ta(v));
1235
1235
  }
1236
1236
 
1237
+ /* An element the core may read or write inline: of a typed array, a valid index (§10.4.5.15
1238
+ * IsValidIntegerIndex), a Number element. Its own data property: no prototype, no code runs. */
1239
+ static bool inline_elem(JSValue v, int32_t i) {
1240
+ if (!is_ta(v) || i < 0) return false;
1241
+ const JSTypedArray *ta = as_ta(v);
1242
+ return !is_bigint_type(ta->type) && (size_t)i < ta_length(ta);
1243
+ }
1244
+
1245
+ static bool hook_typed_array_get(JSValue v, int32_t i, JSValue *out) {
1246
+ if (!inline_elem(v, i)) return false;
1247
+ *out = js_number(load_number(as_ta(v), (size_t)i));
1248
+ return true;
1249
+ }
1250
+
1251
+ static bool hook_typed_array_set(JSValue v, int32_t i, double d) {
1252
+ if (!inline_elem(v, i) || immutable(as_ta(v))) return false;
1253
+ store(as_ta(v), (size_t)i, d);
1254
+ return true;
1255
+ }
1256
+
1237
1257
  static bool hook_view_bytes(JSValue v, uint8_t **data, size_t *length) {
1238
1258
  return !js_is_array_buffer(v) && js_buffer_source_bytes(v, data, length);
1239
1259
  }
@@ -1330,6 +1350,9 @@ static void install_typedarray(JSContext *ctx, JSObject *global) {
1330
1350
  ctx->rt->is_typed_array = hook_is_typed_array;
1331
1351
  ctx->rt->typed_array_length = hook_typed_array_length;
1332
1352
  ctx->rt->view_bytes = hook_view_bytes;
1353
+ ctx->rt->typed_array_get = hook_typed_array_get;
1354
+ ctx->rt->typed_array_class = &ta_class;
1355
+ ctx->rt->typed_array_set = hook_typed_array_set;
1333
1356
  }
1334
1357
 
1335
1358
  const JSComponent js_component_typedarray = { "typedarray", install_typedarray };