@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
|
@@ -1,50 +1,12 @@
|
|
|
1
|
-
#ifndef
|
|
2
|
-
#define
|
|
1
|
+
#ifndef SRC_BASE64_INL_H_
|
|
2
|
+
#define SRC_BASE64_INL_H_
|
|
3
3
|
|
|
4
4
|
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
5
5
|
|
|
6
|
+
#include "base64.h"
|
|
6
7
|
#include "util.h"
|
|
7
8
|
|
|
8
|
-
#include <cstddef>
|
|
9
|
-
#include <cstdint>
|
|
10
|
-
|
|
11
9
|
namespace node {
|
|
12
|
-
//// Base 64 ////
|
|
13
|
-
static inline constexpr size_t base64_encoded_size(size_t size) {
|
|
14
|
-
return ((size + 2 - ((size + 2) % 3)) / 3 * 4);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// Doesn't check for padding at the end. Can be 1-2 bytes over.
|
|
18
|
-
static inline size_t base64_decoded_size_fast(size_t size) {
|
|
19
|
-
size_t remainder = size % 4;
|
|
20
|
-
|
|
21
|
-
size = (size / 4) * 3;
|
|
22
|
-
if (remainder) {
|
|
23
|
-
if (size == 0 && remainder == 1) {
|
|
24
|
-
// special case: 1-byte input cannot be decoded
|
|
25
|
-
size = 0;
|
|
26
|
-
} else {
|
|
27
|
-
// non-padded input, add 1 or 2 extra bytes
|
|
28
|
-
size += 1 + (remainder == 3);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return size;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
template <typename TypeName>
|
|
36
|
-
size_t base64_decoded_size(const TypeName* src, size_t size) {
|
|
37
|
-
if (size == 0)
|
|
38
|
-
return 0;
|
|
39
|
-
|
|
40
|
-
if (src[size - 1] == '=')
|
|
41
|
-
size--;
|
|
42
|
-
if (size > 0 && src[size - 1] == '=')
|
|
43
|
-
size--;
|
|
44
|
-
|
|
45
|
-
return base64_decoded_size_fast(size);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
10
|
|
|
49
11
|
extern const int8_t unbase64_table[256];
|
|
50
12
|
|
|
@@ -54,27 +16,36 @@ inline static int8_t unbase64(uint8_t x) {
|
|
|
54
16
|
}
|
|
55
17
|
|
|
56
18
|
|
|
19
|
+
inline uint32_t ReadUint32BE(const unsigned char* p) {
|
|
20
|
+
return static_cast<uint32_t>(p[0] << 24U) |
|
|
21
|
+
static_cast<uint32_t>(p[1] << 16U) |
|
|
22
|
+
static_cast<uint32_t>(p[2] << 8U) |
|
|
23
|
+
static_cast<uint32_t>(p[3]);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
#ifdef _MSC_VER
|
|
27
|
+
#pragma warning(push)
|
|
28
|
+
// MSVC C4003: not enough actual parameters for macro 'identifier'
|
|
29
|
+
#pragma warning(disable : 4003)
|
|
30
|
+
#endif
|
|
31
|
+
|
|
57
32
|
template <typename TypeName>
|
|
58
33
|
bool base64_decode_group_slow(char* const dst, const size_t dstlen,
|
|
59
34
|
const TypeName* const src, const size_t srclen,
|
|
60
35
|
size_t* const i, size_t* const k) {
|
|
61
36
|
uint8_t hi;
|
|
62
37
|
uint8_t lo;
|
|
63
|
-
#define V(expr)
|
|
64
|
-
for (;;) {
|
|
65
|
-
const uint8_t c = src[*i];
|
|
66
|
-
lo = unbase64(c);
|
|
67
|
-
*i += 1;
|
|
68
|
-
if (lo < 64)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (*i >= srclen) \
|
|
75
|
-
return false; \
|
|
76
|
-
if (*k >= dstlen) \
|
|
77
|
-
return false; \
|
|
38
|
+
#define V(expr) \
|
|
39
|
+
for (;;) { \
|
|
40
|
+
const uint8_t c = static_cast<uint8_t>(src[*i]); \
|
|
41
|
+
lo = unbase64(c); \
|
|
42
|
+
*i += 1; \
|
|
43
|
+
if (lo < 64) break; /* Legal character. */ \
|
|
44
|
+
if (c == '=' || *i >= srclen) return false; /* Stop decoding. */ \
|
|
45
|
+
} \
|
|
46
|
+
expr; \
|
|
47
|
+
if (*i >= srclen) return false; \
|
|
48
|
+
if (*k >= dstlen) return false; \
|
|
78
49
|
hi = lo;
|
|
79
50
|
V(/* Nothing. */);
|
|
80
51
|
V(dst[(*k)++] = ((hi & 0x3F) << 2) | ((lo & 0x30) >> 4));
|
|
@@ -84,6 +55,9 @@ bool base64_decode_group_slow(char* const dst, const size_t dstlen,
|
|
|
84
55
|
return true; // Continue decoding.
|
|
85
56
|
}
|
|
86
57
|
|
|
58
|
+
#ifdef _MSC_VER
|
|
59
|
+
#pragma warning(pop)
|
|
60
|
+
#endif
|
|
87
61
|
|
|
88
62
|
template <typename TypeName>
|
|
89
63
|
size_t base64_decode_fast(char* const dst, const size_t dstlen,
|
|
@@ -95,11 +69,14 @@ size_t base64_decode_fast(char* const dst, const size_t dstlen,
|
|
|
95
69
|
size_t i = 0;
|
|
96
70
|
size_t k = 0;
|
|
97
71
|
while (i < max_i && k < max_k) {
|
|
98
|
-
const
|
|
99
|
-
unbase64(src[i + 0])
|
|
100
|
-
unbase64(src[i + 1])
|
|
101
|
-
unbase64(src[i + 2])
|
|
102
|
-
unbase64(src[i + 3])
|
|
72
|
+
const unsigned char txt[] = {
|
|
73
|
+
static_cast<unsigned char>(unbase64(static_cast<uint8_t>(src[i + 0]))),
|
|
74
|
+
static_cast<unsigned char>(unbase64(static_cast<uint8_t>(src[i + 1]))),
|
|
75
|
+
static_cast<unsigned char>(unbase64(static_cast<uint8_t>(src[i + 2]))),
|
|
76
|
+
static_cast<unsigned char>(unbase64(static_cast<uint8_t>(src[i + 3]))),
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const uint32_t v = ReadUint32BE(txt);
|
|
103
80
|
// If MSB is set, input contains whitespace or is not valid base64.
|
|
104
81
|
if (v & 0x80808080) {
|
|
105
82
|
if (!base64_decode_group_slow(dst, dstlen, src, srclen, &i, &k))
|
|
@@ -120,6 +97,21 @@ size_t base64_decode_fast(char* const dst, const size_t dstlen,
|
|
|
120
97
|
}
|
|
121
98
|
|
|
122
99
|
|
|
100
|
+
template <typename TypeName>
|
|
101
|
+
size_t base64_decoded_size(const TypeName* src, size_t size) {
|
|
102
|
+
// 1-byte input cannot be decoded
|
|
103
|
+
if (size < 2)
|
|
104
|
+
return 0;
|
|
105
|
+
|
|
106
|
+
if (src[size - 1] == '=') {
|
|
107
|
+
size--;
|
|
108
|
+
if (src[size - 1] == '=')
|
|
109
|
+
size--;
|
|
110
|
+
}
|
|
111
|
+
return base64_decoded_size_fast(size);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
|
|
123
115
|
template <typename TypeName>
|
|
124
116
|
size_t base64_decode(char* const dst, const size_t dstlen,
|
|
125
117
|
const TypeName* const src, const size_t srclen) {
|
|
@@ -127,15 +119,17 @@ size_t base64_decode(char* const dst, const size_t dstlen,
|
|
|
127
119
|
return base64_decode_fast(dst, dstlen, src, srclen, decoded_size);
|
|
128
120
|
}
|
|
129
121
|
|
|
130
|
-
|
|
122
|
+
|
|
123
|
+
inline size_t base64_encode(const char* src,
|
|
131
124
|
size_t slen,
|
|
132
125
|
char* dst,
|
|
133
|
-
size_t dlen
|
|
126
|
+
size_t dlen,
|
|
127
|
+
Base64Mode mode) {
|
|
134
128
|
// We know how much we'll write, just make sure that there's space.
|
|
135
|
-
CHECK(dlen >= base64_encoded_size(slen) &&
|
|
129
|
+
CHECK(dlen >= base64_encoded_size(slen, mode) &&
|
|
136
130
|
"not enough space provided for base64 encode");
|
|
137
131
|
|
|
138
|
-
dlen = base64_encoded_size(slen);
|
|
132
|
+
dlen = base64_encoded_size(slen, mode);
|
|
139
133
|
|
|
140
134
|
unsigned a;
|
|
141
135
|
unsigned b;
|
|
@@ -144,9 +138,7 @@ static size_t base64_encode(const char* src,
|
|
|
144
138
|
unsigned k;
|
|
145
139
|
unsigned n;
|
|
146
140
|
|
|
147
|
-
|
|
148
|
-
"abcdefghijklmnopqrstuvwxyz"
|
|
149
|
-
"0123456789+/";
|
|
141
|
+
const char* table = base64_select_table(mode);
|
|
150
142
|
|
|
151
143
|
i = 0;
|
|
152
144
|
k = 0;
|
|
@@ -166,32 +158,32 @@ static size_t base64_encode(const char* src,
|
|
|
166
158
|
k += 4;
|
|
167
159
|
}
|
|
168
160
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
161
|
+
switch (slen - n) {
|
|
162
|
+
case 1:
|
|
163
|
+
a = src[i + 0] & 0xff;
|
|
164
|
+
dst[k + 0] = table[a >> 2];
|
|
165
|
+
dst[k + 1] = table[(a & 3) << 4];
|
|
166
|
+
if (mode == Base64Mode::NORMAL) {
|
|
175
167
|
dst[k + 2] = '=';
|
|
176
168
|
dst[k + 3] = '=';
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
case 2:
|
|
172
|
+
a = src[i + 0] & 0xff;
|
|
173
|
+
b = src[i + 1] & 0xff;
|
|
174
|
+
dst[k + 0] = table[a >> 2];
|
|
175
|
+
dst[k + 1] = table[((a & 3) << 4) | (b >> 4)];
|
|
176
|
+
dst[k + 2] = table[(b & 0x0f) << 2];
|
|
177
|
+
if (mode == Base64Mode::NORMAL)
|
|
185
178
|
dst[k + 3] = '=';
|
|
186
|
-
|
|
187
|
-
}
|
|
179
|
+
break;
|
|
188
180
|
}
|
|
189
181
|
|
|
190
182
|
return dlen;
|
|
191
183
|
}
|
|
192
|
-
} // namespace node
|
|
193
184
|
|
|
185
|
+
} // namespace node
|
|
194
186
|
|
|
195
187
|
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
196
188
|
|
|
197
|
-
#endif //
|
|
189
|
+
#endif // SRC_BASE64_INL_H_
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#ifndef SRC_BASE64_H_
|
|
2
|
+
#define SRC_BASE64_H_
|
|
3
|
+
|
|
4
|
+
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
5
|
+
|
|
6
|
+
#include "util.h"
|
|
7
|
+
|
|
8
|
+
#include <cmath>
|
|
9
|
+
#include <cstddef>
|
|
10
|
+
#include <cstdint>
|
|
11
|
+
|
|
12
|
+
namespace node {
|
|
13
|
+
//// Base 64 ////
|
|
14
|
+
|
|
15
|
+
enum class Base64Mode {
|
|
16
|
+
NORMAL,
|
|
17
|
+
URL
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
static constexpr char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
21
|
+
"abcdefghijklmnopqrstuvwxyz"
|
|
22
|
+
"0123456789+/";
|
|
23
|
+
|
|
24
|
+
static constexpr char base64_table_url[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
25
|
+
"abcdefghijklmnopqrstuvwxyz"
|
|
26
|
+
"0123456789-_";
|
|
27
|
+
|
|
28
|
+
static inline const char* base64_select_table(Base64Mode mode) {
|
|
29
|
+
switch (mode) {
|
|
30
|
+
case Base64Mode::NORMAL: return base64_table;
|
|
31
|
+
case Base64Mode::URL: return base64_table_url;
|
|
32
|
+
default: UNREACHABLE();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static inline constexpr size_t base64_encoded_size(
|
|
37
|
+
size_t size,
|
|
38
|
+
Base64Mode mode = Base64Mode::NORMAL) {
|
|
39
|
+
return mode == Base64Mode::NORMAL ? ((size + 2) / 3 * 4)
|
|
40
|
+
: static_cast<size_t>(std::ceil(
|
|
41
|
+
static_cast<double>(size * 4) / 3));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Doesn't check for padding at the end. Can be 1-2 bytes over.
|
|
45
|
+
static inline constexpr size_t base64_decoded_size_fast(size_t size) {
|
|
46
|
+
// 1-byte input cannot be decoded
|
|
47
|
+
return size > 1 ? (size / 4) * 3 + (size % 4 + 1) / 2 : 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
inline uint32_t ReadUint32BE(const unsigned char* p);
|
|
51
|
+
|
|
52
|
+
template <typename TypeName>
|
|
53
|
+
size_t base64_decoded_size(const TypeName* src, size_t size);
|
|
54
|
+
|
|
55
|
+
template <typename TypeName>
|
|
56
|
+
size_t base64_decode(char* const dst, const size_t dstlen,
|
|
57
|
+
const TypeName* const src, const size_t srclen);
|
|
58
|
+
|
|
59
|
+
inline size_t base64_encode(const char* src,
|
|
60
|
+
size_t slen,
|
|
61
|
+
char* dst,
|
|
62
|
+
size_t dlen,
|
|
63
|
+
Base64Mode mode = Base64Mode::NORMAL);
|
|
64
|
+
} // namespace node
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
68
|
+
|
|
69
|
+
#endif // SRC_BASE64_H_
|
|
@@ -28,14 +28,7 @@
|
|
|
28
28
|
#include "env-inl.h"
|
|
29
29
|
#include "util.h"
|
|
30
30
|
|
|
31
|
-
#if (__GNUC__ >= 8) && !defined(__clang__)
|
|
32
|
-
#pragma GCC diagnostic push
|
|
33
|
-
#pragma GCC diagnostic ignored "-Wcast-function-type"
|
|
34
|
-
#endif
|
|
35
31
|
#include "v8.h"
|
|
36
|
-
#if (__GNUC__ >= 8) && !defined(__clang__)
|
|
37
|
-
#pragma GCC diagnostic pop
|
|
38
|
-
#endif
|
|
39
32
|
|
|
40
33
|
namespace node {
|
|
41
34
|
|
|
@@ -90,7 +83,8 @@ v8::Local<v8::Object> BaseObject::object() const {
|
|
|
90
83
|
v8::Local<v8::Object> BaseObject::object(v8::Isolate* isolate) const {
|
|
91
84
|
v8::Local<v8::Object> handle = object();
|
|
92
85
|
|
|
93
|
-
DCHECK_EQ(handle->
|
|
86
|
+
DCHECK_EQ(handle->GetCreationContext().ToLocalChecked()->GetIsolate(),
|
|
87
|
+
isolate);
|
|
94
88
|
DCHECK_EQ(env()->isolate(), isolate);
|
|
95
89
|
|
|
96
90
|
return handle;
|
|
@@ -100,15 +94,16 @@ Environment* BaseObject::env() const {
|
|
|
100
94
|
return env_;
|
|
101
95
|
}
|
|
102
96
|
|
|
103
|
-
BaseObject* BaseObject::FromJSObject(v8::Local<v8::
|
|
104
|
-
|
|
97
|
+
BaseObject* BaseObject::FromJSObject(v8::Local<v8::Value> value) {
|
|
98
|
+
v8::Local<v8::Object> obj = value.As<v8::Object>();
|
|
99
|
+
DCHECK_GE(obj->InternalFieldCount(), BaseObject::kSlot);
|
|
105
100
|
return static_cast<BaseObject*>(
|
|
106
101
|
obj->GetAlignedPointerFromInternalField(BaseObject::kSlot));
|
|
107
102
|
}
|
|
108
103
|
|
|
109
104
|
|
|
110
105
|
template <typename T>
|
|
111
|
-
T* BaseObject::FromJSObject(v8::Local<v8::
|
|
106
|
+
T* BaseObject::FromJSObject(v8::Local<v8::Value> object) {
|
|
112
107
|
return static_cast<T*>(FromJSObject(object));
|
|
113
108
|
}
|
|
114
109
|
|
|
@@ -145,16 +140,26 @@ void BaseObject::ClearWeak() {
|
|
|
145
140
|
persistent_handle_.ClearWeak();
|
|
146
141
|
}
|
|
147
142
|
|
|
143
|
+
bool BaseObject::IsWeakOrDetached() const {
|
|
144
|
+
if (persistent_handle_.IsWeak()) return true;
|
|
145
|
+
|
|
146
|
+
if (!has_pointer_data()) return false;
|
|
147
|
+
const PointerData* pd = const_cast<BaseObject*>(this)->pointer_data();
|
|
148
|
+
return pd->wants_weak_jsobj || pd->is_detached;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
void BaseObject::LazilyInitializedJSTemplateConstructor(
|
|
152
|
+
const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
153
|
+
DCHECK(args.IsConstructCall());
|
|
154
|
+
DCHECK_GT(args.This()->InternalFieldCount(), 0);
|
|
155
|
+
args.This()->SetAlignedPointerInInternalField(BaseObject::kSlot, nullptr);
|
|
156
|
+
}
|
|
148
157
|
|
|
149
158
|
v8::Local<v8::FunctionTemplate>
|
|
150
159
|
BaseObject::MakeLazilyInitializedJSTemplate(Environment* env) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
args.This()->SetAlignedPointerInInternalField(BaseObject::kSlot, nullptr);
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
v8::Local<v8::FunctionTemplate> t = env->NewFunctionTemplate(constructor);
|
|
160
|
+
v8::Local<v8::FunctionTemplate> t =
|
|
161
|
+
env->NewFunctionTemplate(LazilyInitializedJSTemplateConstructor);
|
|
162
|
+
t->Inherit(BaseObject::GetConstructorTemplate(env));
|
|
158
163
|
t->InstanceTemplate()->SetInternalFieldCount(
|
|
159
164
|
BaseObject::kInternalFieldCount);
|
|
160
165
|
return t;
|
|
@@ -198,7 +203,7 @@ void BaseObject::decrease_refcount() {
|
|
|
198
203
|
unsigned int new_refcount = --metadata->strong_ptr_count;
|
|
199
204
|
if (new_refcount == 0) {
|
|
200
205
|
if (metadata->is_detached) {
|
|
201
|
-
|
|
206
|
+
OnGCCollect();
|
|
202
207
|
} else if (metadata->wants_weak_jsobj && !persistent_handle_.IsEmpty()) {
|
|
203
208
|
MakeWeak();
|
|
204
209
|
}
|
|
@@ -216,20 +221,22 @@ BaseObject::PointerData*
|
|
|
216
221
|
BaseObjectPtrImpl<T, kIsWeak>::pointer_data() const {
|
|
217
222
|
if (kIsWeak) {
|
|
218
223
|
return data_.pointer_data;
|
|
219
|
-
} else {
|
|
220
|
-
if (get_base_object() == nullptr) return nullptr;
|
|
221
|
-
return get_base_object()->pointer_data();
|
|
222
224
|
}
|
|
225
|
+
if (get_base_object() == nullptr) {
|
|
226
|
+
return nullptr;
|
|
227
|
+
}
|
|
228
|
+
return get_base_object()->pointer_data();
|
|
223
229
|
}
|
|
224
230
|
|
|
225
231
|
template <typename T, bool kIsWeak>
|
|
226
232
|
BaseObject* BaseObjectPtrImpl<T, kIsWeak>::get_base_object() const {
|
|
227
233
|
if (kIsWeak) {
|
|
228
|
-
if (pointer_data() == nullptr)
|
|
234
|
+
if (pointer_data() == nullptr) {
|
|
235
|
+
return nullptr;
|
|
236
|
+
}
|
|
229
237
|
return pointer_data()->self;
|
|
230
|
-
} else {
|
|
231
|
-
return data_.target;
|
|
232
238
|
}
|
|
239
|
+
return data_.target;
|
|
233
240
|
}
|
|
234
241
|
|
|
235
242
|
template <typename T, bool kIsWeak>
|
|
@@ -334,6 +341,20 @@ BaseObjectPtrImpl<T, kIsWeak>::operator bool() const {
|
|
|
334
341
|
return get() != nullptr;
|
|
335
342
|
}
|
|
336
343
|
|
|
344
|
+
template <typename T, bool kIsWeak>
|
|
345
|
+
template <typename U, bool kW>
|
|
346
|
+
bool BaseObjectPtrImpl<T, kIsWeak>::operator ==(
|
|
347
|
+
const BaseObjectPtrImpl<U, kW>& other) const {
|
|
348
|
+
return get() == other.get();
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
template <typename T, bool kIsWeak>
|
|
352
|
+
template <typename U, bool kW>
|
|
353
|
+
bool BaseObjectPtrImpl<T, kIsWeak>::operator !=(
|
|
354
|
+
const BaseObjectPtrImpl<U, kW>& other) const {
|
|
355
|
+
return get() != other.get();
|
|
356
|
+
}
|
|
357
|
+
|
|
337
358
|
template <typename T, typename... Args>
|
|
338
359
|
BaseObjectPtr<T> MakeBaseObject(Args&&... args) {
|
|
339
360
|
return BaseObjectPtr<T>(new T(std::forward<Args>(args)...));
|
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
|
|
25
25
|
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
26
26
|
|
|
27
|
+
#include <type_traits> // std::remove_reference
|
|
27
28
|
#include "memory_tracker.h"
|
|
28
29
|
#include "v8.h"
|
|
29
|
-
#include <type_traits> // std::remove_reference
|
|
30
30
|
|
|
31
31
|
namespace node {
|
|
32
32
|
|
|
@@ -34,6 +34,10 @@ class Environment;
|
|
|
34
34
|
template <typename T, bool kIsWeak>
|
|
35
35
|
class BaseObjectPtrImpl;
|
|
36
36
|
|
|
37
|
+
namespace worker {
|
|
38
|
+
class TransferData;
|
|
39
|
+
}
|
|
40
|
+
|
|
37
41
|
class BaseObject : public MemoryRetainer {
|
|
38
42
|
public:
|
|
39
43
|
enum InternalFields { kSlot, kInternalFieldCount };
|
|
@@ -61,9 +65,11 @@ class BaseObject : public MemoryRetainer {
|
|
|
61
65
|
// was also passed to the `BaseObject()` constructor initially.
|
|
62
66
|
// This may return `nullptr` if the C++ object has not been constructed yet,
|
|
63
67
|
// e.g. when the JS object used `MakeLazilyInitializedJSTemplate`.
|
|
64
|
-
static inline
|
|
68
|
+
static inline void LazilyInitializedJSTemplateConstructor(
|
|
69
|
+
const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
70
|
+
static inline BaseObject* FromJSObject(v8::Local<v8::Value> object);
|
|
65
71
|
template <typename T>
|
|
66
|
-
static inline T* FromJSObject(v8::Local<v8::
|
|
72
|
+
static inline T* FromJSObject(v8::Local<v8::Value> object);
|
|
67
73
|
|
|
68
74
|
// Make the `v8::Global` a weak reference and, `delete` this object once
|
|
69
75
|
// the JS object has been garbage collected and there are no (strong)
|
|
@@ -74,6 +80,11 @@ class BaseObject : public MemoryRetainer {
|
|
|
74
80
|
// root and will not be touched by the garbage collector.
|
|
75
81
|
inline void ClearWeak();
|
|
76
82
|
|
|
83
|
+
// Reports whether this BaseObject is using a weak reference or detached,
|
|
84
|
+
// i.e. whether is can be deleted by GC once no strong BaseObjectPtrs refer
|
|
85
|
+
// to it anymore.
|
|
86
|
+
inline bool IsWeakOrDetached() const;
|
|
87
|
+
|
|
77
88
|
// Utility to create a FunctionTemplate with one internal field (used for
|
|
78
89
|
// the `BaseObject*` pointer) and a constructor that initializes that field
|
|
79
90
|
// to `nullptr`.
|
|
@@ -84,7 +95,7 @@ class BaseObject : public MemoryRetainer {
|
|
|
84
95
|
template <int Field>
|
|
85
96
|
static void InternalFieldGet(v8::Local<v8::String> property,
|
|
86
97
|
const v8::PropertyCallbackInfo<v8::Value>& info);
|
|
87
|
-
template <int Field, bool (v8::Value::*
|
|
98
|
+
template <int Field, bool (v8::Value::*typecheck)() const>
|
|
88
99
|
static void InternalFieldSet(v8::Local<v8::String> property,
|
|
89
100
|
v8::Local<v8::Value> value,
|
|
90
101
|
const v8::PropertyCallbackInfo<void>& info);
|
|
@@ -92,24 +103,75 @@ class BaseObject : public MemoryRetainer {
|
|
|
92
103
|
// This is a bit of a hack. See the override in async_wrap.cc for details.
|
|
93
104
|
virtual bool IsDoneInitializing() const;
|
|
94
105
|
|
|
95
|
-
// Can be used to avoid this object
|
|
106
|
+
// Can be used to avoid this object keeping itself alive as a GC root
|
|
96
107
|
// indefinitely, for example when this object is owned and deleted by another
|
|
97
108
|
// BaseObject once that is torn down. This can only be called when there is
|
|
98
109
|
// a BaseObjectPtr to this object.
|
|
99
110
|
inline void Detach();
|
|
100
111
|
|
|
101
|
-
|
|
112
|
+
static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
|
|
113
|
+
Environment* env);
|
|
114
|
+
|
|
115
|
+
// Interface for transferring BaseObject instances using the .postMessage()
|
|
116
|
+
// method of MessagePorts (and, by extension, Workers).
|
|
117
|
+
// GetTransferMode() returns a transfer mode that indicates how to deal with
|
|
118
|
+
// the current object:
|
|
119
|
+
// - kUntransferable:
|
|
120
|
+
// No transfer is possible, either because this type of BaseObject does
|
|
121
|
+
// not know how to be transferred, or because it is not in a state in
|
|
122
|
+
// which it is possible to do so (e.g. because it has already been
|
|
123
|
+
// transferred).
|
|
124
|
+
// - kTransferable:
|
|
125
|
+
// This object can be transferred in a destructive fashion, i.e. will be
|
|
126
|
+
// rendered unusable on the sending side of the channel in the process
|
|
127
|
+
// of being transferred. (In C++ this would be referred to as movable but
|
|
128
|
+
// not copyable.) Objects of this type need to be listed in the
|
|
129
|
+
// `transferList` argument of the relevant postMessage() call in order to
|
|
130
|
+
// make sure that they are not accidentally destroyed on the sending side.
|
|
131
|
+
// TransferForMessaging() will be called to get a representation of the
|
|
132
|
+
// object that is used for subsequent deserialization.
|
|
133
|
+
// The NestedTransferables() method can be used to transfer other objects
|
|
134
|
+
// along with this one, if a situation requires it.
|
|
135
|
+
// - kCloneable:
|
|
136
|
+
// This object can be cloned without being modified.
|
|
137
|
+
// CloneForMessaging() will be called to get a representation of the
|
|
138
|
+
// object that is used for subsequent deserialization, unless the
|
|
139
|
+
// object is listed in transferList, in which case TransferForMessaging()
|
|
140
|
+
// is attempted first.
|
|
141
|
+
// After a successful clone, FinalizeTransferRead() is called on the receiving
|
|
142
|
+
// end, and can read deserialize JS data possibly serialized by a previous
|
|
143
|
+
// FinalizeTransferWrite() call.
|
|
144
|
+
enum class TransferMode {
|
|
145
|
+
kUntransferable,
|
|
146
|
+
kTransferable,
|
|
147
|
+
kCloneable
|
|
148
|
+
};
|
|
149
|
+
virtual TransferMode GetTransferMode() const;
|
|
150
|
+
virtual std::unique_ptr<worker::TransferData> TransferForMessaging();
|
|
151
|
+
virtual std::unique_ptr<worker::TransferData> CloneForMessaging() const;
|
|
152
|
+
virtual v8::Maybe<std::vector<BaseObjectPtrImpl<BaseObject, false>>>
|
|
153
|
+
NestedTransferables() const;
|
|
154
|
+
virtual v8::Maybe<bool> FinalizeTransferRead(
|
|
155
|
+
v8::Local<v8::Context> context, v8::ValueDeserializer* deserializer);
|
|
156
|
+
|
|
157
|
+
// Indicates whether this object is expected to use a strong reference during
|
|
158
|
+
// a clean process exit (due to an empty event loop).
|
|
159
|
+
virtual bool IsNotIndicativeOfMemoryLeakAtExit() const;
|
|
160
|
+
|
|
102
161
|
virtual inline void OnGCCollect();
|
|
103
162
|
|
|
163
|
+
virtual inline bool is_snapshotable() const { return false; }
|
|
164
|
+
|
|
104
165
|
private:
|
|
105
166
|
v8::Local<v8::Object> WrappedObject() const override;
|
|
167
|
+
bool IsRootNode() const override;
|
|
106
168
|
static void DeleteMe(void* data);
|
|
107
169
|
|
|
108
170
|
// persistent_handle_ needs to be at a fixed offset from the start of the
|
|
109
171
|
// class because it is used by src/node_postmortem_metadata.cc to calculate
|
|
110
172
|
// offsets and generate debug symbols for BaseObject, which assumes that the
|
|
111
173
|
// position of members in memory are predictable. For more information please
|
|
112
|
-
// refer to `doc/
|
|
174
|
+
// refer to `doc/contributing/node-postmortem-support.md`
|
|
113
175
|
friend int GenDebugSymbols();
|
|
114
176
|
friend class CleanupHookCallback;
|
|
115
177
|
template <typename T, bool kIsWeak>
|
|
@@ -131,7 +193,7 @@ class BaseObject : public MemoryRetainer {
|
|
|
131
193
|
// Indicates whether MakeWeak() has been called.
|
|
132
194
|
bool wants_weak_jsobj = false;
|
|
133
195
|
// Indicates whether Detach() has been called. If that is the case, this
|
|
134
|
-
// object will be
|
|
196
|
+
// object will be destroyed once the strong pointer count drops to zero.
|
|
135
197
|
bool is_detached = false;
|
|
136
198
|
// Reference to the original BaseObject. This is used by weak pointers.
|
|
137
199
|
BaseObject* self = nullptr;
|
|
@@ -152,17 +214,15 @@ class BaseObject : public MemoryRetainer {
|
|
|
152
214
|
|
|
153
215
|
// Global alias for FromJSObject() to avoid churn.
|
|
154
216
|
template <typename T>
|
|
155
|
-
inline T* Unwrap(v8::Local<v8::
|
|
217
|
+
inline T* Unwrap(v8::Local<v8::Value> obj) {
|
|
156
218
|
return BaseObject::FromJSObject<T>(obj);
|
|
157
219
|
}
|
|
158
220
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
if (*ptr == nullptr) \
|
|
165
|
-
return __VA_ARGS__; \
|
|
221
|
+
#define ASSIGN_OR_RETURN_UNWRAP(ptr, obj, ...) \
|
|
222
|
+
do { \
|
|
223
|
+
*ptr = static_cast<typename std::remove_reference<decltype(*ptr)>::type>( \
|
|
224
|
+
BaseObject::FromJSObject(obj)); \
|
|
225
|
+
if (*ptr == nullptr) return __VA_ARGS__; \
|
|
166
226
|
} while (0)
|
|
167
227
|
|
|
168
228
|
// Implementation of a generic strong or weak pointer to a BaseObject.
|
|
@@ -196,9 +256,14 @@ class BaseObjectPtrImpl final {
|
|
|
196
256
|
inline T* operator->() const;
|
|
197
257
|
inline operator bool() const;
|
|
198
258
|
|
|
259
|
+
template <typename U, bool kW>
|
|
260
|
+
inline bool operator ==(const BaseObjectPtrImpl<U, kW>& other) const;
|
|
261
|
+
template <typename U, bool kW>
|
|
262
|
+
inline bool operator !=(const BaseObjectPtrImpl<U, kW>& other) const;
|
|
263
|
+
|
|
199
264
|
private:
|
|
200
265
|
union {
|
|
201
|
-
BaseObject* target;
|
|
266
|
+
BaseObject* target; // Used for strong pointers.
|
|
202
267
|
BaseObject::PointerData* pointer_data; // Used for weak pointers.
|
|
203
268
|
} data_;
|
|
204
269
|
|
|
@@ -10,8 +10,8 @@ namespace node {
|
|
|
10
10
|
template <typename R, typename... Args>
|
|
11
11
|
template <typename Fn>
|
|
12
12
|
std::unique_ptr<typename CallbackQueue<R, Args...>::Callback>
|
|
13
|
-
CallbackQueue<R, Args...>::CreateCallback(Fn&& fn,
|
|
14
|
-
return std::make_unique<CallbackImpl<Fn>>(std::move(fn),
|
|
13
|
+
CallbackQueue<R, Args...>::CreateCallback(Fn&& fn, CallbackFlags::Flags flags) {
|
|
14
|
+
return std::make_unique<CallbackImpl<Fn>>(std::move(fn), flags);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
template <typename R, typename... Args>
|
|
@@ -22,8 +22,8 @@ CallbackQueue<R, Args...>::Shift() {
|
|
|
22
22
|
head_ = ret->get_next();
|
|
23
23
|
if (!head_)
|
|
24
24
|
tail_ = nullptr; // The queue is now empty.
|
|
25
|
+
size_--;
|
|
25
26
|
}
|
|
26
|
-
size_--;
|
|
27
27
|
return ret;
|
|
28
28
|
}
|
|
29
29
|
|
|
@@ -57,12 +57,12 @@ size_t CallbackQueue<R, Args...>::size() const {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
template <typename R, typename... Args>
|
|
60
|
-
CallbackQueue<R, Args...>::Callback::Callback(
|
|
61
|
-
:
|
|
60
|
+
CallbackQueue<R, Args...>::Callback::Callback(CallbackFlags::Flags flags)
|
|
61
|
+
: flags_(flags) {}
|
|
62
62
|
|
|
63
63
|
template <typename R, typename... Args>
|
|
64
|
-
|
|
65
|
-
return
|
|
64
|
+
CallbackFlags::Flags CallbackQueue<R, Args...>::Callback::flags() const {
|
|
65
|
+
return flags_;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
template <typename R, typename... Args>
|
|
@@ -80,8 +80,8 @@ void CallbackQueue<R, Args...>::Callback::set_next(
|
|
|
80
80
|
template <typename R, typename... Args>
|
|
81
81
|
template <typename Fn>
|
|
82
82
|
CallbackQueue<R, Args...>::CallbackImpl<Fn>::CallbackImpl(
|
|
83
|
-
Fn&& callback,
|
|
84
|
-
: Callback(
|
|
83
|
+
Fn&& callback, CallbackFlags::Flags flags)
|
|
84
|
+
: Callback(flags),
|
|
85
85
|
callback_(std::move(callback)) {}
|
|
86
86
|
|
|
87
87
|
template <typename R, typename... Args>
|