@encharm/cws 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bindings/cws_linux_108.node +0 -0
- package/dist/bindings/cws_linux_64.node +0 -0
- package/dist/bindings/cws_linux_72.node +0 -0
- package/dist/bindings/cws_linux_79.node +0 -0
- package/dist/bindings/cws_linux_83.node +0 -0
- package/dist/bindings/cws_linux_93.node +0 -0
- package/dist/bindings/cws_win32_64.node +0 -0
- package/dist/bindings/cws_win32_72.node +0 -0
- package/dist/bindings/cws_win32_79.node +0 -0
- package/dist/bindings/cws_win32_83.node +0 -0
- package/dist/bindings/cws_win32_93.node +0 -0
- package/package.json +1 -1
- package/src/Addon.h +24 -2
- package/src/HTTPSocket.cpp +1 -1
- package/src/headers/{13 → 18}/aliased_buffer.h +61 -9
- package/src/headers/18/aliased_struct-inl.h +54 -0
- package/src/headers/18/aliased_struct.h +63 -0
- package/src/headers/{12 → 18}/async_wrap-inl.h +0 -0
- package/src/headers/{12 → 18}/async_wrap.h +26 -2
- package/src/headers/{12/base64.h → 18/base64-inl.h} +78 -86
- package/src/headers/18/base64.h +69 -0
- package/src/headers/{12 → 18}/base_object-inl.h +46 -25
- package/src/headers/{12 → 18}/base_object.h +82 -17
- package/src/headers/{12 → 18}/callback_queue-inl.h +9 -9
- package/src/headers/{12 → 18}/callback_queue.h +13 -5
- package/src/headers/18/cares_wrap.h +523 -0
- package/src/headers/{12 → 18}/connect_wrap.h +0 -0
- package/src/headers/{12 → 18}/connection_wrap.h +0 -0
- package/src/headers/18/crypto/crypto_aes.h +89 -0
- package/src/headers/{13/node_crypto_bio.h → 18/crypto/crypto_bio.h} +3 -4
- package/src/headers/18/crypto/crypto_cipher.h +291 -0
- package/src/headers/{13/node_crypto_clienthello-inl.h → 18/crypto/crypto_clienthello-inl.h} +4 -5
- package/src/headers/{13/node_crypto_clienthello.h → 18/crypto/crypto_clienthello.h} +3 -4
- package/src/headers/{12/node_crypto_common.h → 18/crypto/crypto_common.h} +49 -36
- package/src/headers/18/crypto/crypto_context.h +147 -0
- package/src/headers/18/crypto/crypto_dh.h +156 -0
- package/src/headers/18/crypto/crypto_dsa.h +77 -0
- package/src/headers/18/crypto/crypto_ec.h +170 -0
- package/src/headers/{12/node_crypto_groups.h → 18/crypto/crypto_groups.h} +3 -3
- package/src/headers/18/crypto/crypto_hash.h +89 -0
- package/src/headers/18/crypto/crypto_hkdf.h +65 -0
- package/src/headers/18/crypto/crypto_hmac.h +94 -0
- package/src/headers/18/crypto/crypto_keygen.h +305 -0
- package/src/headers/18/crypto/crypto_keys.h +420 -0
- package/src/headers/18/crypto/crypto_pbkdf2.h +76 -0
- package/src/headers/18/crypto/crypto_random.h +130 -0
- package/src/headers/18/crypto/crypto_rsa.h +141 -0
- package/src/headers/18/crypto/crypto_scrypt.h +87 -0
- package/src/headers/18/crypto/crypto_sig.h +168 -0
- package/src/headers/18/crypto/crypto_spkac.h +21 -0
- package/src/headers/18/crypto/crypto_timing.h +20 -0
- package/src/headers/{13/tls_wrap.h → 18/crypto/crypto_tls.h} +137 -66
- package/src/headers/18/crypto/crypto_util.h +791 -0
- package/src/headers/18/crypto/crypto_x509.h +143 -0
- package/src/headers/{12 → 18}/debug_utils-inl.h +0 -0
- package/src/headers/{13 → 18}/debug_utils.h +7 -4
- package/src/headers/{12 → 18}/diagnosticfilename-inl.h +0 -0
- package/src/headers/{12 → 18}/env-inl.h +397 -304
- package/src/headers/{12 → 18}/env.h +397 -172
- package/src/headers/{12 → 18}/handle_wrap.h +7 -3
- package/src/headers/18/histogram-inl.h +107 -0
- package/src/headers/18/histogram.h +239 -0
- package/src/headers/{13 → 18}/inspector_agent.h +4 -7
- package/src/headers/{12 → 18}/inspector_io.h +0 -0
- package/src/headers/{13 → 18}/inspector_profiler.h +17 -5
- package/src/headers/{12 → 18}/inspector_socket.h +0 -0
- package/src/headers/{12 → 18}/inspector_socket_server.h +0 -0
- package/src/headers/18/js_native_api.h +571 -0
- package/src/headers/{13 → 18}/js_native_api_types.h +30 -7
- package/src/headers/{12 → 18}/js_native_api_v8.h +220 -83
- package/src/headers/{12 → 18}/js_native_api_v8_internals.h +6 -5
- package/src/headers/{12 → 18}/js_stream.h +0 -0
- package/src/headers/{12 → 18}/json_utils.h +0 -0
- package/src/headers/{13 → 18}/memory_tracker-inl.h +6 -5
- package/src/headers/{13 → 18}/memory_tracker.h +0 -7
- package/src/headers/{13 → 18}/module_wrap.h +24 -7
- package/src/headers/{13 → 18}/node.h +329 -68
- package/src/headers/18/node_api.h +288 -0
- package/src/headers/18/node_api_internals.h +38 -0
- package/src/headers/{12 → 18}/node_api_types.h +12 -9
- package/src/headers/{12 → 18}/node_binding.h +0 -0
- package/src/headers/18/node_blob.h +191 -0
- package/src/headers/18/node_bob-inl.h +37 -0
- package/src/headers/18/node_bob.h +111 -0
- package/src/headers/{13 → 18}/node_buffer.h +0 -0
- package/src/headers/{13 → 18}/node_constants.h +5 -1
- package/src/headers/{12 → 18}/node_context_data.h +5 -0
- package/src/headers/{12 → 18}/node_contextify.h +37 -2
- package/src/headers/{10/node_win32_perfctr_provider.h → 18/node_crypto.h} +30 -31
- package/src/headers/{12 → 18}/node_dir.h +0 -0
- package/src/headers/{12 → 18}/node_dtrace.h +0 -0
- package/src/headers/{12 → 18}/node_errors.h +90 -24
- package/src/headers/18/node_external_reference.h +145 -0
- package/src/headers/{13 → 18}/node_file-inl.h +38 -21
- package/src/headers/{12 → 18}/node_file.h +74 -13
- package/src/headers/{13 → 18}/node_http2.h +365 -269
- package/src/headers/{12 → 18}/node_http2_state.h +40 -50
- package/src/headers/{13 → 18}/node_http_common-inl.h +25 -5
- package/src/headers/{13 → 18}/node_http_common.h +24 -20
- package/src/headers/{13 → 18}/node_i18n.h +2 -1
- package/src/headers/{12 → 18}/node_internals.h +39 -41
- package/src/headers/{13 → 18}/node_main_instance.h +15 -18
- package/src/headers/{12 → 18}/node_mem-inl.h +0 -0
- package/src/headers/{12 → 18}/node_mem.h +1 -1
- package/src/headers/{13 → 18}/node_messaging.h +170 -23
- package/src/headers/{12 → 18}/node_metadata.h +17 -4
- package/src/headers/{12 → 18}/node_mutex.h +77 -1
- package/src/headers/{12 → 18}/node_native_module.h +11 -1
- package/src/headers/{13 → 18}/node_native_module_env.h +14 -8
- package/src/headers/{12 → 18}/node_object_wrap.h +0 -0
- package/src/headers/{13 → 18}/node_options-inl.h +51 -21
- package/src/headers/{13 → 18}/node_options.h +46 -14
- package/src/headers/18/node_perf.h +168 -0
- package/src/headers/{12 → 18}/node_perf_common.h +16 -22
- package/src/headers/{12 → 18}/node_platform.h +21 -16
- package/src/headers/18/node_process-inl.h +26 -0
- package/src/headers/18/node_process.h +97 -0
- package/src/headers/{13 → 18}/node_report.h +2 -2
- package/src/headers/{13 → 18}/node_revert.h +10 -0
- package/src/headers/{12 → 18}/node_root_certs.h +439 -651
- package/src/headers/18/node_snapshot_builder.h +43 -0
- package/src/headers/18/node_snapshotable.h +130 -0
- package/src/headers/{12 → 18}/node_sockaddr-inl.h +100 -4
- package/src/headers/18/node_sockaddr.h +405 -0
- package/src/headers/{12 → 18}/node_stat_watcher.h +7 -1
- package/src/headers/{12 → 18}/node_union_bytes.h +0 -0
- package/src/headers/{13 → 18}/node_url.h +18 -1
- package/src/headers/18/node_v8.h +41 -0
- package/src/headers/{12 → 18}/node_v8_platform-inl.h +10 -0
- package/src/headers/{13 → 18}/node_version.h +7 -7
- package/src/headers/{12 → 18}/node_wasi.h +0 -0
- package/src/headers/18/node_wasm_web_api.h +55 -0
- package/src/headers/{13 → 18}/node_watchdog.h +0 -0
- package/src/headers/{10 → 18}/node_win32_etw_provider-inl.h +7 -6
- package/src/headers/{10 → 18}/node_win32_etw_provider.h +0 -0
- package/src/headers/{13 → 18}/node_worker.h +24 -17
- package/src/headers/{12 → 18}/pipe_wrap.h +2 -0
- package/src/headers/{12 → 18}/req_wrap-inl.h +0 -0
- package/src/headers/{12 → 18}/req_wrap.h +1 -1
- package/src/headers/{12 → 18}/spawn_sync.h +0 -0
- package/src/headers/{13 → 18}/stream_base-inl.h +58 -22
- package/src/headers/{13 → 18}/stream_base.h +29 -3
- package/src/headers/{13 → 18}/stream_pipe.h +8 -3
- package/src/headers/{12 → 18}/stream_wrap.h +4 -1
- package/src/headers/{13 → 18}/string_bytes.h +0 -7
- package/src/headers/{12 → 18}/string_decoder-inl.h +0 -0
- package/src/headers/{10 → 18}/string_decoder.h +0 -0
- package/src/headers/{13 → 18}/string_search.h +2 -2
- package/src/headers/{12 → 18}/tcp_wrap.h +4 -0
- package/src/headers/{12 → 18}/threadpoolwork-inl.h +0 -0
- package/src/headers/18/timer_wrap-inl.h +32 -0
- package/src/headers/18/timer_wrap.h +85 -0
- package/src/headers/{13 → 18}/tracing/agent.h +1 -1
- package/src/headers/{12 → 18}/tracing/node_trace_buffer.h +0 -0
- package/src/headers/{12 → 18}/tracing/node_trace_writer.h +0 -0
- package/src/headers/{13 → 18}/tracing/trace_event.h +23 -13
- package/src/headers/{12 → 18}/tracing/trace_event_common.h +0 -0
- package/src/headers/{12 → 18}/tracing/traced_value.h +0 -0
- package/src/headers/{13 → 18}/tty_wrap.h +2 -1
- package/src/headers/{13 → 18}/udp_wrap.h +5 -0
- package/src/headers/{13 → 18}/util-inl.h +69 -15
- package/src/headers/{13 → 18}/util.h +93 -31
- package/src/headers/18/v8-fast-api-calls.h +939 -0
- package/src/headers/{12 → 18}/v8abbr.h +2 -2
- package/src/headers/10/aliased_buffer.h +0 -241
- package/src/headers/10/async_wrap-inl.h +0 -106
- package/src/headers/10/async_wrap.h +0 -218
- package/src/headers/10/base64.h +0 -197
- package/src/headers/10/base_object-inl.h +0 -132
- package/src/headers/10/base_object.h +0 -115
- package/src/headers/10/connect_wrap.h +0 -28
- package/src/headers/10/connection_wrap.h +0 -30
- package/src/headers/10/debug_utils.h +0 -128
- package/src/headers/10/env-inl.h +0 -906
- package/src/headers/10/env.h +0 -1046
- package/src/headers/10/handle_wrap.h +0 -114
- package/src/headers/10/inspector_agent.h +0 -137
- package/src/headers/10/inspector_io.h +0 -97
- package/src/headers/10/inspector_socket.h +0 -59
- package/src/headers/10/inspector_socket_server.h +0 -104
- package/src/headers/10/js_stream.h +0 -57
- package/src/headers/10/memory_tracker-inl.h +0 -318
- package/src/headers/10/memory_tracker.h +0 -246
- package/src/headers/10/module_wrap.h +0 -100
- package/src/headers/10/node.h +0 -863
- package/src/headers/10/node_api.h +0 -752
- package/src/headers/10/node_api_types.h +0 -171
- package/src/headers/10/node_buffer.h +0 -90
- package/src/headers/10/node_code_cache.h +0 -17
- package/src/headers/10/node_constants.h +0 -74
- package/src/headers/10/node_context_data.h +0 -39
- package/src/headers/10/node_contextify.h +0 -141
- package/src/headers/10/node_counters.h +0 -59
- package/src/headers/10/node_crypto.h +0 -699
- package/src/headers/10/node_crypto_bio.h +0 -177
- package/src/headers/10/node_crypto_clienthello-inl.h +0 -92
- package/src/headers/10/node_crypto_clienthello.h +0 -131
- package/src/headers/10/node_crypto_groups.h +0 -416
- package/src/headers/10/node_dtrace.h +0 -84
- package/src/headers/10/node_errors.h +0 -118
- package/src/headers/10/node_file.h +0 -373
- package/src/headers/10/node_http2.h +0 -1304
- package/src/headers/10/node_http2_state.h +0 -158
- package/src/headers/10/node_i18n.h +0 -69
- package/src/headers/10/node_internals.h +0 -952
- package/src/headers/10/node_javascript.h +0 -41
- package/src/headers/10/node_messaging.h +0 -219
- package/src/headers/10/node_mutex.h +0 -191
- package/src/headers/10/node_object_wrap.h +0 -130
- package/src/headers/10/node_options-inl.h +0 -444
- package/src/headers/10/node_options.h +0 -397
- package/src/headers/10/node_perf.h +0 -134
- package/src/headers/10/node_perf_common.h +0 -96
- package/src/headers/10/node_persistent.h +0 -30
- package/src/headers/10/node_platform.h +0 -170
- package/src/headers/10/node_revert.h +0 -75
- package/src/headers/10/node_root_certs.h +0 -3393
- package/src/headers/10/node_stat_watcher.h +0 -65
- package/src/headers/10/node_url.h +0 -193
- package/src/headers/10/node_version.h +0 -120
- package/src/headers/10/node_watchdog.h +0 -114
- package/src/headers/10/node_worker.h +0 -94
- package/src/headers/10/pipe_wrap.h +0 -76
- package/src/headers/10/req_wrap-inl.h +0 -166
- package/src/headers/10/req_wrap.h +0 -61
- package/src/headers/10/sharedarraybuffer_metadata.h +0 -67
- package/src/headers/10/spawn_sync.h +0 -240
- package/src/headers/10/stream_base-inl.h +0 -458
- package/src/headers/10/stream_base.h +0 -378
- package/src/headers/10/stream_pipe.h +0 -72
- package/src/headers/10/stream_wrap.h +0 -130
- package/src/headers/10/string_bytes.h +0 -126
- package/src/headers/10/string_decoder-inl.h +0 -38
- package/src/headers/10/string_search.h +0 -620
- package/src/headers/10/tcp_wrap.h +0 -99
- package/src/headers/10/tls_wrap.h +0 -195
- package/src/headers/10/tracing/agent.h +0 -178
- package/src/headers/10/tracing/node_trace_buffer.h +0 -83
- package/src/headers/10/tracing/node_trace_writer.h +0 -75
- package/src/headers/10/tracing/trace_event.h +0 -706
- package/src/headers/10/tracing/trace_event_common.h +0 -1102
- package/src/headers/10/tracing/traced_value.h +0 -68
- package/src/headers/10/tty_wrap.h +0 -63
- package/src/headers/10/udp_wrap.h +0 -102
- package/src/headers/10/util-inl.h +0 -459
- package/src/headers/10/util.h +0 -508
- package/src/headers/10/v8abbr.h +0 -121
- package/src/headers/12/aliased_buffer.h +0 -263
- package/src/headers/12/debug_utils.h +0 -181
- package/src/headers/12/histogram-inl.h +0 -83
- package/src/headers/12/histogram.h +0 -98
- package/src/headers/12/http_parser_adaptor.h +0 -24
- package/src/headers/12/inspector_agent.h +0 -147
- package/src/headers/12/inspector_profiler.h +0 -137
- package/src/headers/12/js_native_api.h +0 -541
- package/src/headers/12/js_native_api_types.h +0 -139
- package/src/headers/12/memory_tracker-inl.h +0 -339
- package/src/headers/12/memory_tracker.h +0 -283
- package/src/headers/12/module_wrap.h +0 -99
- package/src/headers/12/node.h +0 -887
- package/src/headers/12/node_api.h +0 -239
- package/src/headers/12/node_buffer.h +0 -92
- package/src/headers/12/node_constants.h +0 -80
- package/src/headers/12/node_crypto.h +0 -800
- package/src/headers/12/node_crypto_bio.h +0 -195
- package/src/headers/12/node_crypto_clienthello-inl.h +0 -91
- package/src/headers/12/node_crypto_clienthello.h +0 -132
- package/src/headers/12/node_file-inl.h +0 -289
- package/src/headers/12/node_http2.h +0 -1311
- package/src/headers/12/node_http_parser_impl.h +0 -994
- package/src/headers/12/node_i18n.h +0 -144
- package/src/headers/12/node_main_instance.h +0 -97
- package/src/headers/12/node_messaging.h +0 -227
- package/src/headers/12/node_native_module_env.h +0 -65
- package/src/headers/12/node_options-inl.h +0 -447
- package/src/headers/12/node_options.h +0 -479
- package/src/headers/12/node_perf.h +0 -181
- package/src/headers/12/node_process.h +0 -41
- package/src/headers/12/node_report.h +0 -47
- package/src/headers/12/node_revert.h +0 -78
- package/src/headers/12/node_sockaddr.h +0 -123
- package/src/headers/12/node_url.h +0 -188
- package/src/headers/12/node_version.h +0 -98
- package/src/headers/12/node_watchdog.h +0 -152
- package/src/headers/12/node_win32_etw_provider-inl.h +0 -287
- package/src/headers/12/node_win32_etw_provider.h +0 -99
- package/src/headers/12/node_worker.h +0 -142
- package/src/headers/12/sharedarraybuffer_metadata.h +0 -72
- package/src/headers/12/stream_base-inl.h +0 -323
- package/src/headers/12/stream_base.h +0 -431
- package/src/headers/12/stream_pipe.h +0 -72
- package/src/headers/12/string_bytes.h +0 -142
- package/src/headers/12/string_decoder.h +0 -50
- package/src/headers/12/string_search.h +0 -638
- package/src/headers/12/tls_wrap.h +0 -221
- package/src/headers/12/tracing/agent.h +0 -195
- package/src/headers/12/tracing/trace_event.h +0 -710
- package/src/headers/12/tty_wrap.h +0 -64
- package/src/headers/12/udp_wrap.h +0 -222
- package/src/headers/12/util-inl.h +0 -529
- package/src/headers/12/util.h +0 -765
- package/src/headers/13/async_wrap-inl.h +0 -94
- package/src/headers/13/async_wrap.h +0 -224
- package/src/headers/13/base64.h +0 -197
- package/src/headers/13/base_object-inl.h +0 -353
- package/src/headers/13/base_object.h +0 -229
- package/src/headers/13/connect_wrap.h +0 -26
- package/src/headers/13/connection_wrap.h +0 -30
- package/src/headers/13/debug_utils-inl.h +0 -223
- package/src/headers/13/diagnosticfilename-inl.h +0 -33
- package/src/headers/13/env-inl.h +0 -1293
- package/src/headers/13/env.h +0 -1469
- package/src/headers/13/handle_wrap.h +0 -117
- package/src/headers/13/histogram-inl.h +0 -83
- package/src/headers/13/histogram.h +0 -98
- package/src/headers/13/inspector_io.h +0 -78
- package/src/headers/13/inspector_socket.h +0 -60
- package/src/headers/13/inspector_socket_server.h +0 -110
- package/src/headers/13/js_native_api.h +0 -541
- package/src/headers/13/js_native_api_v8.h +0 -303
- package/src/headers/13/js_native_api_v8_internals.h +0 -38
- package/src/headers/13/js_stream.h +0 -52
- package/src/headers/13/json_utils.h +0 -160
- package/src/headers/13/node_api.h +0 -239
- package/src/headers/13/node_api_types.h +0 -44
- package/src/headers/13/node_binding.h +0 -99
- package/src/headers/13/node_context_data.h +0 -39
- package/src/headers/13/node_contextify.h +0 -161
- package/src/headers/13/node_crypto.h +0 -800
- package/src/headers/13/node_crypto_common.h +0 -138
- package/src/headers/13/node_crypto_groups.h +0 -415
- package/src/headers/13/node_dir.h +0 -52
- package/src/headers/13/node_dtrace.h +0 -86
- package/src/headers/13/node_errors.h +0 -210
- package/src/headers/13/node_file.h +0 -364
- package/src/headers/13/node_http2_state.h +0 -144
- package/src/headers/13/node_internals.h +0 -405
- package/src/headers/13/node_mem-inl.h +0 -112
- package/src/headers/13/node_mem.h +0 -41
- package/src/headers/13/node_metadata.h +0 -109
- package/src/headers/13/node_mutex.h +0 -247
- package/src/headers/13/node_native_module.h +0 -99
- package/src/headers/13/node_object_wrap.h +0 -132
- package/src/headers/13/node_perf.h +0 -181
- package/src/headers/13/node_perf_common.h +0 -97
- package/src/headers/13/node_platform.h +0 -190
- package/src/headers/13/node_process.h +0 -41
- package/src/headers/13/node_root_certs.h +0 -3424
- package/src/headers/13/node_sockaddr-inl.h +0 -170
- package/src/headers/13/node_sockaddr.h +0 -123
- package/src/headers/13/node_stat_watcher.h +0 -66
- package/src/headers/13/node_union_bytes.h +0 -103
- package/src/headers/13/node_v8_platform-inl.h +0 -184
- package/src/headers/13/node_wasi.h +0 -108
- package/src/headers/13/node_win32_etw_provider-inl.h +0 -287
- package/src/headers/13/node_win32_etw_provider.h +0 -99
- package/src/headers/13/pipe_wrap.h +0 -78
- package/src/headers/13/req_wrap-inl.h +0 -170
- package/src/headers/13/req_wrap.h +0 -77
- package/src/headers/13/spawn_sync.h +0 -242
- package/src/headers/13/stream_wrap.h +0 -130
- package/src/headers/13/string_decoder-inl.h +0 -37
- package/src/headers/13/string_decoder.h +0 -50
- package/src/headers/13/tcp_wrap.h +0 -101
- package/src/headers/13/threadpoolwork-inl.h +0 -57
- package/src/headers/13/tracing/node_trace_buffer.h +0 -83
- package/src/headers/13/tracing/node_trace_writer.h +0 -75
- package/src/headers/13/tracing/trace_event_common.h +0 -1109
- package/src/headers/13/tracing/traced_value.h +0 -70
- package/src/headers/13/v8abbr.h +0 -124
|
@@ -5,7 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
#include "env.h"
|
|
7
7
|
#include "node_mutex.h"
|
|
8
|
-
#include
|
|
8
|
+
#include "v8.h"
|
|
9
|
+
#include <deque>
|
|
10
|
+
#include <string>
|
|
11
|
+
#include <unordered_map>
|
|
12
|
+
#include <set>
|
|
9
13
|
|
|
10
14
|
namespace node {
|
|
11
15
|
namespace worker {
|
|
@@ -15,6 +19,29 @@ class MessagePort;
|
|
|
15
19
|
|
|
16
20
|
typedef MaybeStackBuffer<v8::Local<v8::Value>, 8> TransferList;
|
|
17
21
|
|
|
22
|
+
// Used to represent the in-flight structure of an object that is being
|
|
23
|
+
// transferred or cloned using postMessage().
|
|
24
|
+
class TransferData : public MemoryRetainer {
|
|
25
|
+
public:
|
|
26
|
+
// Deserialize this object on the receiving end after a .postMessage() call.
|
|
27
|
+
// - `context` may not be the same as `env->context()`. This method should
|
|
28
|
+
// not produce JS objects coming from Contexts other than `context`.
|
|
29
|
+
// - `self` is a unique_ptr for the object that this is being called on.
|
|
30
|
+
// - The return value is treated like a `Maybe`, i.e. if `nullptr` is
|
|
31
|
+
// returned, any further deserialization of the message is stopped and
|
|
32
|
+
// control is returned to the event loop or JS as soon as possible.
|
|
33
|
+
virtual BaseObjectPtr<BaseObject> Deserialize(
|
|
34
|
+
Environment* env,
|
|
35
|
+
v8::Local<v8::Context> context,
|
|
36
|
+
std::unique_ptr<TransferData> self) = 0;
|
|
37
|
+
// FinalizeTransferWrite() is the counterpart to
|
|
38
|
+
// BaseObject::FinalizeTransferRead(). It is called right after the transfer
|
|
39
|
+
// data was created, and defaults to doing nothing. After this function,
|
|
40
|
+
// this object should not hold any more Isolate-specific data.
|
|
41
|
+
virtual v8::Maybe<bool> FinalizeTransferWrite(
|
|
42
|
+
v8::Local<v8::Context> context, v8::ValueSerializer* serializer);
|
|
43
|
+
};
|
|
44
|
+
|
|
18
45
|
// Represents a single communication message.
|
|
19
46
|
class Message : public MemoryRetainer {
|
|
20
47
|
public:
|
|
@@ -22,6 +49,7 @@ class Message : public MemoryRetainer {
|
|
|
22
49
|
// V8 ValueSerializer API. If `payload` is empty, this message indicates
|
|
23
50
|
// that the receiving message port should close itself.
|
|
24
51
|
explicit Message(MallocedBuffer<char>&& payload = MallocedBuffer<char>());
|
|
52
|
+
~Message() = default;
|
|
25
53
|
|
|
26
54
|
Message(Message&& other) = default;
|
|
27
55
|
Message& operator=(Message&& other) = default;
|
|
@@ -34,8 +62,10 @@ class Message : public MemoryRetainer {
|
|
|
34
62
|
|
|
35
63
|
// Deserialize the contained JS value. May only be called once, and only
|
|
36
64
|
// after Serialize() has been called (e.g. by another thread).
|
|
37
|
-
v8::MaybeLocal<v8::Value> Deserialize(
|
|
38
|
-
|
|
65
|
+
v8::MaybeLocal<v8::Value> Deserialize(
|
|
66
|
+
Environment* env,
|
|
67
|
+
v8::Local<v8::Context> context,
|
|
68
|
+
v8::Local<v8::Value>* port_list = nullptr);
|
|
39
69
|
|
|
40
70
|
// Serialize a JS value, and optionally transfer objects, into this message.
|
|
41
71
|
// The Message object retains ownership of all transferred objects until
|
|
@@ -54,16 +84,20 @@ class Message : public MemoryRetainer {
|
|
|
54
84
|
void AddSharedArrayBuffer(std::shared_ptr<v8::BackingStore> backing_store);
|
|
55
85
|
// Internal method of Message that is called once serialization finishes
|
|
56
86
|
// and that transfers ownership of `data` to this message.
|
|
57
|
-
void
|
|
87
|
+
void AddTransferable(std::unique_ptr<TransferData>&& data);
|
|
58
88
|
// Internal method of Message that is called when a new WebAssembly.Module
|
|
59
89
|
// object is encountered in the incoming value's structure.
|
|
60
|
-
uint32_t AddWASMModule(v8::
|
|
90
|
+
uint32_t AddWASMModule(v8::CompiledWasmModule&& mod);
|
|
61
91
|
|
|
62
|
-
// The
|
|
92
|
+
// The host objects that will be transferred, as recorded by Serialize()
|
|
93
|
+
// (e.g. MessagePorts).
|
|
63
94
|
// Used for warning user about posting the target MessagePort to itself,
|
|
64
95
|
// which will as a side effect destroy the communication channel.
|
|
65
|
-
const std::vector<std::unique_ptr<
|
|
66
|
-
return
|
|
96
|
+
const std::vector<std::unique_ptr<TransferData>>& transferables() const {
|
|
97
|
+
return transferables_;
|
|
98
|
+
}
|
|
99
|
+
bool has_transferables() const {
|
|
100
|
+
return !transferables_.empty() || !array_buffers_.empty();
|
|
67
101
|
}
|
|
68
102
|
|
|
69
103
|
void MemoryInfo(MemoryTracker* tracker) const override;
|
|
@@ -73,17 +107,65 @@ class Message : public MemoryRetainer {
|
|
|
73
107
|
|
|
74
108
|
private:
|
|
75
109
|
MallocedBuffer<char> main_message_buf_;
|
|
110
|
+
// TODO(addaleax): Make this a std::variant to save storage size in the common
|
|
111
|
+
// case (which is that all of these vectors are empty) once that is available
|
|
112
|
+
// with C++17.
|
|
76
113
|
std::vector<std::shared_ptr<v8::BackingStore>> array_buffers_;
|
|
77
114
|
std::vector<std::shared_ptr<v8::BackingStore>> shared_array_buffers_;
|
|
78
|
-
std::vector<std::unique_ptr<
|
|
79
|
-
std::vector<v8::
|
|
115
|
+
std::vector<std::unique_ptr<TransferData>> transferables_;
|
|
116
|
+
std::vector<v8::CompiledWasmModule> wasm_modules_;
|
|
80
117
|
|
|
81
118
|
friend class MessagePort;
|
|
82
119
|
};
|
|
83
120
|
|
|
121
|
+
class SiblingGroup final : public std::enable_shared_from_this<SiblingGroup> {
|
|
122
|
+
public:
|
|
123
|
+
// Named SiblingGroup, Used for one-to-many BroadcastChannels.
|
|
124
|
+
static std::shared_ptr<SiblingGroup> Get(const std::string& name);
|
|
125
|
+
|
|
126
|
+
// Anonymous SiblingGroup, Used for one-to-one MessagePort pairs.
|
|
127
|
+
SiblingGroup() = default;
|
|
128
|
+
explicit SiblingGroup(const std::string& name);
|
|
129
|
+
~SiblingGroup();
|
|
130
|
+
|
|
131
|
+
// Dispatches the Message to the collection of associated
|
|
132
|
+
// ports. If there is more than one destination port and
|
|
133
|
+
// the Message contains transferables, Dispatch will fail.
|
|
134
|
+
// Returns Just(true) if successful and the message was
|
|
135
|
+
// dispatched to at least one destination. Returns Just(false)
|
|
136
|
+
// if there were no destinations. Returns Nothing<bool>()
|
|
137
|
+
// if there was an error. If error is not nullptr, it will
|
|
138
|
+
// be set to an error message or warning message as appropriate.
|
|
139
|
+
v8::Maybe<bool> Dispatch(
|
|
140
|
+
MessagePortData* source,
|
|
141
|
+
std::shared_ptr<Message> message,
|
|
142
|
+
std::string* error = nullptr);
|
|
143
|
+
|
|
144
|
+
void Entangle(MessagePortData* data);
|
|
145
|
+
void Entangle(std::initializer_list<MessagePortData*> data);
|
|
146
|
+
void Disentangle(MessagePortData* data);
|
|
147
|
+
|
|
148
|
+
const std::string& name() const { return name_; }
|
|
149
|
+
|
|
150
|
+
size_t size() const { return ports_.size(); }
|
|
151
|
+
|
|
152
|
+
private:
|
|
153
|
+
const std::string name_;
|
|
154
|
+
RwLock group_mutex_; // Protects ports_.
|
|
155
|
+
std::set<MessagePortData*> ports_;
|
|
156
|
+
|
|
157
|
+
static void CheckSiblingGroup(const std::string& name);
|
|
158
|
+
|
|
159
|
+
using Map =
|
|
160
|
+
std::unordered_map<std::string, std::weak_ptr<SiblingGroup>>;
|
|
161
|
+
|
|
162
|
+
static Mutex groups_mutex_;
|
|
163
|
+
static Map groups_;
|
|
164
|
+
};
|
|
165
|
+
|
|
84
166
|
// This contains all data for a `MessagePort` instance that is not tied to
|
|
85
167
|
// a specific Environment/Isolate/event loop, for easier transfer between those.
|
|
86
|
-
class MessagePortData : public
|
|
168
|
+
class MessagePortData : public TransferData {
|
|
87
169
|
public:
|
|
88
170
|
explicit MessagePortData(MessagePort* owner);
|
|
89
171
|
~MessagePortData() override;
|
|
@@ -95,7 +177,10 @@ class MessagePortData : public MemoryRetainer {
|
|
|
95
177
|
|
|
96
178
|
// Add a message to the incoming queue and notify the receiver.
|
|
97
179
|
// This may be called from any thread.
|
|
98
|
-
void AddToIncomingQueue(Message
|
|
180
|
+
void AddToIncomingQueue(std::shared_ptr<Message> message);
|
|
181
|
+
v8::Maybe<bool> Dispatch(
|
|
182
|
+
std::shared_ptr<Message> message,
|
|
183
|
+
std::string* error = nullptr);
|
|
99
184
|
|
|
100
185
|
// Turns `a` and `b` into siblings, i.e. connects the sending side of one
|
|
101
186
|
// to the receiving side of the other. This is not thread-safe.
|
|
@@ -108,6 +193,10 @@ class MessagePortData : public MemoryRetainer {
|
|
|
108
193
|
void Disentangle();
|
|
109
194
|
|
|
110
195
|
void MemoryInfo(MemoryTracker* tracker) const override;
|
|
196
|
+
BaseObjectPtr<BaseObject> Deserialize(
|
|
197
|
+
Environment* env,
|
|
198
|
+
v8::Local<v8::Context> context,
|
|
199
|
+
std::unique_ptr<TransferData> self) override;
|
|
111
200
|
|
|
112
201
|
SET_MEMORY_INFO_NAME(MessagePortData)
|
|
113
202
|
SET_SELF_SIZE(MessagePortData)
|
|
@@ -116,15 +205,14 @@ class MessagePortData : public MemoryRetainer {
|
|
|
116
205
|
// This mutex protects all fields below it, with the exception of
|
|
117
206
|
// sibling_.
|
|
118
207
|
mutable Mutex mutex_;
|
|
119
|
-
std::
|
|
208
|
+
// TODO(addaleax): Make this a std::variant<std::shared_ptr, std::unique_ptr>
|
|
209
|
+
// once that is available with C++17, because std::shared_ptr comes with
|
|
210
|
+
// overhead that is only necessary for BroadcastChannel.
|
|
211
|
+
std::deque<std::shared_ptr<Message>> incoming_messages_;
|
|
120
212
|
MessagePort* owner_ = nullptr;
|
|
121
|
-
|
|
122
|
-
// MessagePorts. If both mutexes are acquired, this one needs to be
|
|
123
|
-
// acquired first.
|
|
124
|
-
std::shared_ptr<Mutex> sibling_mutex_ = std::make_shared<Mutex>();
|
|
125
|
-
MessagePortData* sibling_ = nullptr;
|
|
126
|
-
|
|
213
|
+
std::shared_ptr<SiblingGroup> group_;
|
|
127
214
|
friend class MessagePort;
|
|
215
|
+
friend class SiblingGroup;
|
|
128
216
|
};
|
|
129
217
|
|
|
130
218
|
// A message port that receives messages from other threads, including
|
|
@@ -147,12 +235,14 @@ class MessagePort : public HandleWrap {
|
|
|
147
235
|
// `MessagePortData` object.
|
|
148
236
|
static MessagePort* New(Environment* env,
|
|
149
237
|
v8::Local<v8::Context> context,
|
|
150
|
-
std::unique_ptr<MessagePortData> data =
|
|
238
|
+
std::unique_ptr<MessagePortData> data = {},
|
|
239
|
+
std::shared_ptr<SiblingGroup> sibling_group = {});
|
|
151
240
|
|
|
152
241
|
// Send a message, i.e. deliver it into the sibling's incoming queue.
|
|
153
242
|
// If this port is closed, or if there is no sibling, this message is
|
|
154
243
|
// serialized with transfers, then silently discarded.
|
|
155
244
|
v8::Maybe<bool> PostMessage(Environment* env,
|
|
245
|
+
v8::Local<v8::Context> context,
|
|
156
246
|
v8::Local<v8::Value> message,
|
|
157
247
|
const TransferList& transfer);
|
|
158
248
|
|
|
@@ -167,6 +257,7 @@ class MessagePort : public HandleWrap {
|
|
|
167
257
|
static void PostMessage(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
168
258
|
static void Start(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
169
259
|
static void Stop(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
260
|
+
static void CheckType(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
170
261
|
static void Drain(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
171
262
|
static void ReceiveMessage(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
172
263
|
|
|
@@ -195,16 +286,26 @@ class MessagePort : public HandleWrap {
|
|
|
195
286
|
// NULL pointer to the C++ MessagePort object is also detached.
|
|
196
287
|
inline bool IsDetached() const;
|
|
197
288
|
|
|
289
|
+
TransferMode GetTransferMode() const override;
|
|
290
|
+
std::unique_ptr<TransferData> TransferForMessaging() override;
|
|
291
|
+
|
|
198
292
|
void MemoryInfo(MemoryTracker* tracker) const override;
|
|
199
293
|
SET_MEMORY_INFO_NAME(MessagePort)
|
|
200
294
|
SET_SELF_SIZE(MessagePort)
|
|
201
295
|
|
|
202
296
|
private:
|
|
297
|
+
enum class MessageProcessingMode {
|
|
298
|
+
kNormalOperation,
|
|
299
|
+
kForceReadMessages
|
|
300
|
+
};
|
|
301
|
+
|
|
203
302
|
void OnClose() override;
|
|
204
|
-
void OnMessage();
|
|
303
|
+
void OnMessage(MessageProcessingMode mode);
|
|
205
304
|
void TriggerAsync();
|
|
206
|
-
v8::MaybeLocal<v8::Value> ReceiveMessage(
|
|
207
|
-
|
|
305
|
+
v8::MaybeLocal<v8::Value> ReceiveMessage(
|
|
306
|
+
v8::Local<v8::Context> context,
|
|
307
|
+
MessageProcessingMode mode,
|
|
308
|
+
v8::Local<v8::Value>* port_list = nullptr);
|
|
208
309
|
|
|
209
310
|
std::unique_ptr<MessagePortData> data_ = nullptr;
|
|
210
311
|
bool receiving_messages_ = false;
|
|
@@ -214,6 +315,52 @@ class MessagePort : public HandleWrap {
|
|
|
214
315
|
friend class MessagePortData;
|
|
215
316
|
};
|
|
216
317
|
|
|
318
|
+
// Provide a base class from which JS classes that should be transferable or
|
|
319
|
+
// cloneable by postMesssage() can inherit.
|
|
320
|
+
// See e.g. FileHandle in internal/fs/promises.js for an example.
|
|
321
|
+
class JSTransferable : public BaseObject {
|
|
322
|
+
public:
|
|
323
|
+
JSTransferable(Environment* env, v8::Local<v8::Object> obj);
|
|
324
|
+
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
325
|
+
|
|
326
|
+
TransferMode GetTransferMode() const override;
|
|
327
|
+
std::unique_ptr<TransferData> TransferForMessaging() override;
|
|
328
|
+
std::unique_ptr<TransferData> CloneForMessaging() const override;
|
|
329
|
+
v8::Maybe<std::vector<BaseObjectPtr<BaseObject>>>
|
|
330
|
+
NestedTransferables() const override;
|
|
331
|
+
v8::Maybe<bool> FinalizeTransferRead(
|
|
332
|
+
v8::Local<v8::Context> context,
|
|
333
|
+
v8::ValueDeserializer* deserializer) override;
|
|
334
|
+
|
|
335
|
+
SET_NO_MEMORY_INFO()
|
|
336
|
+
SET_MEMORY_INFO_NAME(JSTransferable)
|
|
337
|
+
SET_SELF_SIZE(JSTransferable)
|
|
338
|
+
|
|
339
|
+
private:
|
|
340
|
+
std::unique_ptr<TransferData> TransferOrClone(TransferMode mode) const;
|
|
341
|
+
|
|
342
|
+
class Data : public TransferData {
|
|
343
|
+
public:
|
|
344
|
+
Data(std::string&& deserialize_info, v8::Global<v8::Value>&& data);
|
|
345
|
+
|
|
346
|
+
BaseObjectPtr<BaseObject> Deserialize(
|
|
347
|
+
Environment* env,
|
|
348
|
+
v8::Local<v8::Context> context,
|
|
349
|
+
std::unique_ptr<TransferData> self) override;
|
|
350
|
+
v8::Maybe<bool> FinalizeTransferWrite(
|
|
351
|
+
v8::Local<v8::Context> context,
|
|
352
|
+
v8::ValueSerializer* serializer) override;
|
|
353
|
+
|
|
354
|
+
SET_NO_MEMORY_INFO()
|
|
355
|
+
SET_MEMORY_INFO_NAME(JSTransferableTransferData)
|
|
356
|
+
SET_SELF_SIZE(Data)
|
|
357
|
+
|
|
358
|
+
private:
|
|
359
|
+
std::string deserialize_info_;
|
|
360
|
+
v8::Global<v8::Value> data_;
|
|
361
|
+
};
|
|
362
|
+
};
|
|
363
|
+
|
|
217
364
|
v8::Local<v8::FunctionTemplate> GetMessagePortConstructorTemplate(
|
|
218
365
|
Environment* env);
|
|
219
366
|
|
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
#include <string>
|
|
7
7
|
#include "node_version.h"
|
|
8
8
|
|
|
9
|
+
#if HAVE_OPENSSL
|
|
10
|
+
#include <openssl/crypto.h>
|
|
11
|
+
#if NODE_OPENSSL_HAS_QUIC
|
|
12
|
+
#include <openssl/quic.h>
|
|
13
|
+
#endif
|
|
14
|
+
#endif // HAVE_OPENSSL
|
|
15
|
+
|
|
9
16
|
namespace node {
|
|
10
17
|
|
|
11
18
|
// if this is a release build and no explicit base has been set
|
|
@@ -31,7 +38,6 @@ namespace node {
|
|
|
31
38
|
V(nghttp2) \
|
|
32
39
|
V(napi) \
|
|
33
40
|
V(llhttp) \
|
|
34
|
-
V(http_parser) \
|
|
35
41
|
|
|
36
42
|
#if HAVE_OPENSSL
|
|
37
43
|
#define NODE_VERSIONS_KEY_CRYPTO(V) V(openssl)
|
|
@@ -49,10 +55,19 @@ namespace node {
|
|
|
49
55
|
#define NODE_VERSIONS_KEY_INTL(V)
|
|
50
56
|
#endif // NODE_HAVE_I18N_SUPPORT
|
|
51
57
|
|
|
58
|
+
#ifdef OPENSSL_INFO_QUIC
|
|
59
|
+
#define NODE_VERSIONS_KEY_QUIC(V) \
|
|
60
|
+
V(ngtcp2) \
|
|
61
|
+
V(nghttp3)
|
|
62
|
+
#else
|
|
63
|
+
#define NODE_VERSIONS_KEY_QUIC(V)
|
|
64
|
+
#endif
|
|
65
|
+
|
|
52
66
|
#define NODE_VERSIONS_KEYS(V) \
|
|
53
67
|
NODE_VERSIONS_KEYS_BASE(V) \
|
|
54
68
|
NODE_VERSIONS_KEY_CRYPTO(V) \
|
|
55
|
-
NODE_VERSIONS_KEY_INTL(V)
|
|
69
|
+
NODE_VERSIONS_KEY_INTL(V) \
|
|
70
|
+
NODE_VERSIONS_KEY_QUIC(V)
|
|
56
71
|
|
|
57
72
|
class Metadata {
|
|
58
73
|
public:
|
|
@@ -102,8 +117,6 @@ class Metadata {
|
|
|
102
117
|
// Per-process global
|
|
103
118
|
namespace per_process {
|
|
104
119
|
extern Metadata metadata;
|
|
105
|
-
extern const char* const llhttp_version;
|
|
106
|
-
extern const char* const http_parser_version;
|
|
107
120
|
}
|
|
108
121
|
|
|
109
122
|
} // namespace node
|
|
@@ -14,9 +14,11 @@ namespace node {
|
|
|
14
14
|
template <typename Traits> class ConditionVariableBase;
|
|
15
15
|
template <typename Traits> class MutexBase;
|
|
16
16
|
struct LibuvMutexTraits;
|
|
17
|
+
struct LibuvRwlockTraits;
|
|
17
18
|
|
|
18
19
|
using ConditionVariable = ConditionVariableBase<LibuvMutexTraits>;
|
|
19
20
|
using Mutex = MutexBase<LibuvMutexTraits>;
|
|
21
|
+
using RwLock = MutexBase<LibuvRwlockTraits>;
|
|
20
22
|
|
|
21
23
|
template <typename T, typename MutexT = Mutex>
|
|
22
24
|
class ExclusiveAccess {
|
|
@@ -32,7 +34,7 @@ class ExclusiveAccess {
|
|
|
32
34
|
|
|
33
35
|
class Scoped {
|
|
34
36
|
public:
|
|
35
|
-
// ExclusiveAccess will commonly be used in
|
|
37
|
+
// ExclusiveAccess will commonly be used in conjunction with std::shared_ptr
|
|
36
38
|
// and without this constructor it's too easy to forget to keep a reference
|
|
37
39
|
// around to the shared_ptr while operating on the ExclusiveAccess object.
|
|
38
40
|
explicit Scoped(const std::shared_ptr<ExclusiveAccess>& shared)
|
|
@@ -70,6 +72,8 @@ class MutexBase {
|
|
|
70
72
|
inline ~MutexBase();
|
|
71
73
|
inline void Lock();
|
|
72
74
|
inline void Unlock();
|
|
75
|
+
inline void RdLock();
|
|
76
|
+
inline void RdUnlock();
|
|
73
77
|
|
|
74
78
|
MutexBase(const MutexBase&) = delete;
|
|
75
79
|
MutexBase& operator=(const MutexBase&) = delete;
|
|
@@ -92,6 +96,21 @@ class MutexBase {
|
|
|
92
96
|
const MutexBase& mutex_;
|
|
93
97
|
};
|
|
94
98
|
|
|
99
|
+
class ScopedReadLock {
|
|
100
|
+
public:
|
|
101
|
+
inline explicit ScopedReadLock(const MutexBase& mutex);
|
|
102
|
+
inline ~ScopedReadLock();
|
|
103
|
+
|
|
104
|
+
ScopedReadLock(const ScopedReadLock&) = delete;
|
|
105
|
+
ScopedReadLock& operator=(const ScopedReadLock&) = delete;
|
|
106
|
+
|
|
107
|
+
private:
|
|
108
|
+
template <typename> friend class ConditionVariableBase;
|
|
109
|
+
const MutexBase& mutex_;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
using ScopedWriteLock = ScopedLock;
|
|
113
|
+
|
|
95
114
|
class ScopedUnlock {
|
|
96
115
|
public:
|
|
97
116
|
inline explicit ScopedUnlock(const ScopedLock& scoped_lock);
|
|
@@ -167,6 +186,42 @@ struct LibuvMutexTraits {
|
|
|
167
186
|
static inline void mutex_unlock(MutexT* mutex) {
|
|
168
187
|
uv_mutex_unlock(mutex);
|
|
169
188
|
}
|
|
189
|
+
|
|
190
|
+
static inline void mutex_rdlock(MutexT* mutex) {
|
|
191
|
+
uv_mutex_lock(mutex);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
static inline void mutex_rdunlock(MutexT* mutex) {
|
|
195
|
+
uv_mutex_unlock(mutex);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
struct LibuvRwlockTraits {
|
|
200
|
+
using MutexT = uv_rwlock_t;
|
|
201
|
+
|
|
202
|
+
static inline int mutex_init(MutexT* mutex) {
|
|
203
|
+
return uv_rwlock_init(mutex);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
static inline void mutex_destroy(MutexT* mutex) {
|
|
207
|
+
uv_rwlock_destroy(mutex);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
static inline void mutex_lock(MutexT* mutex) {
|
|
211
|
+
uv_rwlock_wrlock(mutex);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
static inline void mutex_unlock(MutexT* mutex) {
|
|
215
|
+
uv_rwlock_wrunlock(mutex);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
static inline void mutex_rdlock(MutexT* mutex) {
|
|
219
|
+
uv_rwlock_rdlock(mutex);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
static inline void mutex_rdunlock(MutexT* mutex) {
|
|
223
|
+
uv_rwlock_rdunlock(mutex);
|
|
224
|
+
}
|
|
170
225
|
};
|
|
171
226
|
|
|
172
227
|
template <typename Traits>
|
|
@@ -214,6 +269,16 @@ void MutexBase<Traits>::Unlock() {
|
|
|
214
269
|
Traits::mutex_unlock(&mutex_);
|
|
215
270
|
}
|
|
216
271
|
|
|
272
|
+
template <typename Traits>
|
|
273
|
+
void MutexBase<Traits>::RdLock() {
|
|
274
|
+
Traits::mutex_rdlock(&mutex_);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
template <typename Traits>
|
|
278
|
+
void MutexBase<Traits>::RdUnlock() {
|
|
279
|
+
Traits::mutex_rdunlock(&mutex_);
|
|
280
|
+
}
|
|
281
|
+
|
|
217
282
|
template <typename Traits>
|
|
218
283
|
MutexBase<Traits>::ScopedLock::ScopedLock(const MutexBase& mutex)
|
|
219
284
|
: mutex_(mutex) {
|
|
@@ -229,6 +294,17 @@ MutexBase<Traits>::ScopedLock::~ScopedLock() {
|
|
|
229
294
|
Traits::mutex_unlock(&mutex_.mutex_);
|
|
230
295
|
}
|
|
231
296
|
|
|
297
|
+
template <typename Traits>
|
|
298
|
+
MutexBase<Traits>::ScopedReadLock::ScopedReadLock(const MutexBase& mutex)
|
|
299
|
+
: mutex_(mutex) {
|
|
300
|
+
Traits::mutex_rdlock(&mutex_.mutex_);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
template <typename Traits>
|
|
304
|
+
MutexBase<Traits>::ScopedReadLock::~ScopedReadLock() {
|
|
305
|
+
Traits::mutex_rdunlock(&mutex_.mutex_);
|
|
306
|
+
}
|
|
307
|
+
|
|
232
308
|
template <typename Traits>
|
|
233
309
|
MutexBase<Traits>::ScopedUnlock::ScopedUnlock(const ScopedLock& scoped_lock)
|
|
234
310
|
: mutex_(scoped_lock.mutex_) {
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
class PerProcessTest;
|
|
16
16
|
|
|
17
17
|
namespace node {
|
|
18
|
+
class SnapshotBuilder;
|
|
18
19
|
namespace native_module {
|
|
19
20
|
|
|
20
21
|
using NativeModuleRecordMap = std::map<std::string, UnionBytes>;
|
|
@@ -22,6 +23,11 @@ using NativeModuleCacheMap =
|
|
|
22
23
|
std::unordered_map<std::string,
|
|
23
24
|
std::unique_ptr<v8::ScriptCompiler::CachedData>>;
|
|
24
25
|
|
|
26
|
+
struct CodeCacheInfo {
|
|
27
|
+
std::string id;
|
|
28
|
+
std::vector<uint8_t> data;
|
|
29
|
+
};
|
|
30
|
+
|
|
25
31
|
// The native (C++) side of the NativeModule in JS land, which
|
|
26
32
|
// handles compilation and caching of builtin modules (NativeModule)
|
|
27
33
|
// and bootstrappers, whose source are bundled into the binary
|
|
@@ -29,7 +35,7 @@ using NativeModuleCacheMap =
|
|
|
29
35
|
// This class should not depend on any Environment, or depend on access to
|
|
30
36
|
// the its own singleton - that should be encapsulated in NativeModuleEnv
|
|
31
37
|
// instead.
|
|
32
|
-
class NativeModuleLoader {
|
|
38
|
+
class NODE_EXTERN_PRIVATE NativeModuleLoader {
|
|
33
39
|
public:
|
|
34
40
|
NativeModuleLoader(const NativeModuleLoader&) = delete;
|
|
35
41
|
NativeModuleLoader& operator=(const NativeModuleLoader&) = delete;
|
|
@@ -47,6 +53,8 @@ class NativeModuleLoader {
|
|
|
47
53
|
UnionBytes GetConfig(); // Return data for config.gypi
|
|
48
54
|
|
|
49
55
|
bool Exists(const char* id);
|
|
56
|
+
bool Add(const char* id, const UnionBytes& source);
|
|
57
|
+
|
|
50
58
|
v8::Local<v8::Object> GetSourceObject(v8::Local<v8::Context> context);
|
|
51
59
|
v8::Local<v8::String> GetConfigString(v8::Isolate* isolate);
|
|
52
60
|
std::vector<std::string> GetModuleIds();
|
|
@@ -64,6 +72,8 @@ class NativeModuleLoader {
|
|
|
64
72
|
bool CannotBeRequired(const char* id);
|
|
65
73
|
|
|
66
74
|
NativeModuleCacheMap* code_cache();
|
|
75
|
+
const Mutex& code_cache_mutex() const { return code_cache_mutex_; }
|
|
76
|
+
|
|
67
77
|
v8::ScriptCompiler::CachedData* GetCodeCache(const char* id) const;
|
|
68
78
|
enum class Result { kWithCache, kWithoutCache };
|
|
69
79
|
v8::MaybeLocal<v8::String> LoadBuiltinModuleSource(v8::Isolate* isolate,
|
|
@@ -3,17 +3,20 @@
|
|
|
3
3
|
|
|
4
4
|
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
5
5
|
|
|
6
|
+
#include <vector>
|
|
6
7
|
#include "node_native_module.h"
|
|
7
8
|
|
|
8
9
|
namespace node {
|
|
9
10
|
class Environment;
|
|
10
|
-
|
|
11
|
+
class ExternalReferenceRegistry;
|
|
11
12
|
namespace native_module {
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
// TODO(joyeecheung): since it's safer to make the code cache part of the
|
|
15
|
+
// embedded snapshot, there is no need to separate NativeModuleEnv and
|
|
16
|
+
// NativeModuleLoader. Merge the two.
|
|
15
17
|
class NativeModuleEnv {
|
|
16
18
|
public:
|
|
19
|
+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
|
|
17
20
|
static void Initialize(v8::Local<v8::Object> target,
|
|
18
21
|
v8::Local<v8::Value> unused,
|
|
19
22
|
v8::Local<v8::Context> context,
|
|
@@ -29,12 +32,11 @@ class NativeModuleEnv {
|
|
|
29
32
|
// Returns config.gypi as a JSON string
|
|
30
33
|
static v8::Local<v8::String> GetConfigString(v8::Isolate* isolate);
|
|
31
34
|
static bool Exists(const char* id);
|
|
35
|
+
static bool Add(const char* id, const UnionBytes& source);
|
|
32
36
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// in node_code_cache_stub.cc
|
|
37
|
-
static void InitializeCodeCache();
|
|
37
|
+
static bool CompileAllModules(v8::Local<v8::Context> context);
|
|
38
|
+
static void RefreshCodeCache(const std::vector<CodeCacheInfo>& in);
|
|
39
|
+
static void CopyCodeCache(std::vector<CodeCacheInfo>* out);
|
|
38
40
|
|
|
39
41
|
private:
|
|
40
42
|
static void RecordResult(const char* id,
|
|
@@ -54,6 +56,10 @@ class NativeModuleEnv {
|
|
|
54
56
|
const v8::PropertyCallbackInfo<v8::Value>& info);
|
|
55
57
|
// Compile a specific native module as a function
|
|
56
58
|
static void CompileFunction(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
59
|
+
static void HasCachedBuiltins(
|
|
60
|
+
const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
61
|
+
|
|
62
|
+
static bool has_code_cache_;
|
|
57
63
|
};
|
|
58
64
|
|
|
59
65
|
} // namespace native_module
|
|
File without changes
|