File indexing completed on 2025-09-15 09:02:40
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #ifndef SRC_NODE_H_
0023 #define SRC_NODE_H_
0024
0025 #ifdef _WIN32
0026 # ifndef BUILDING_NODE_EXTENSION
0027 # define NODE_EXTERN __declspec(dllexport)
0028 # else
0029 # define NODE_EXTERN __declspec(dllimport)
0030 # endif
0031 #else
0032 # define NODE_EXTERN __attribute__((visibility("default")))
0033 #endif
0034
0035
0036
0037
0038
0039 #ifdef NODE_SHARED_MODE
0040 #define NODE_EXTERN_PRIVATE NODE_EXTERN
0041 #else
0042 #define NODE_EXTERN_PRIVATE
0043 #endif
0044
0045 #ifdef BUILDING_NODE_EXTENSION
0046 # undef BUILDING_V8_SHARED
0047 # undef BUILDING_UV_SHARED
0048 # define USING_V8_SHARED 1
0049 # define USING_UV_SHARED 1
0050 #endif
0051
0052
0053
0054 #if defined(__MINGW32__) || defined(_MSC_VER)
0055 #ifndef _WIN32_WINNT
0056 # define _WIN32_WINNT 0x0600
0057 #endif
0058
0059 #ifndef NOMINMAX
0060 # define NOMINMAX
0061 #endif
0062
0063 #endif
0064
0065 #if defined(_MSC_VER)
0066 #define PATH_MAX MAX_PATH
0067 #endif
0068
0069 #ifdef _WIN32
0070 #define SIGQUIT 3
0071 #define SIGKILL 9
0072 #endif
0073
0074 #include "v8.h" // NOLINT(build/include_order)
0075
0076 #include "v8-platform.h" // NOLINT(build/include_order)
0077 #include "node_version.h" // NODE_MODULE_VERSION
0078
0079 #define NAPI_EXPERIMENTAL
0080 #include "node_api.h"
0081
0082 #include <functional>
0083 #include <memory>
0084 #include <optional>
0085 #include <ostream>
0086
0087
0088
0089 #ifndef _WIN32
0090 #include <signal.h>
0091 #endif
0092
0093 #define NODE_MAKE_VERSION(major, minor, patch) \
0094 ((major) * 0x1000 + (minor) * 0x100 + (patch))
0095
0096 #ifdef __clang__
0097 # define NODE_CLANG_AT_LEAST(major, minor, patch) \
0098 (NODE_MAKE_VERSION(major, minor, patch) <= \
0099 NODE_MAKE_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__))
0100 #else
0101 # define NODE_CLANG_AT_LEAST(major, minor, patch) (0)
0102 #endif
0103
0104 #ifdef __GNUC__
0105 # define NODE_GNUC_AT_LEAST(major, minor, patch) \
0106 (NODE_MAKE_VERSION(major, minor, patch) <= \
0107 NODE_MAKE_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__))
0108 #else
0109 # define NODE_GNUC_AT_LEAST(major, minor, patch) (0)
0110 #endif
0111
0112 #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
0113 # define NODE_DEPRECATED(message, declarator) declarator
0114 #else
0115 # if NODE_CLANG_AT_LEAST(2, 9, 0) || NODE_GNUC_AT_LEAST(4, 5, 0)
0116 # define NODE_DEPRECATED(message, declarator) \
0117 __attribute__((deprecated(message))) declarator
0118 # elif defined(_MSC_VER)
0119 # define NODE_DEPRECATED(message, declarator) \
0120 __declspec(deprecated) declarator
0121 # else
0122 # define NODE_DEPRECATED(message, declarator) declarator
0123 # endif
0124 #endif
0125
0126
0127 struct uv_loop_s;
0128
0129
0130
0131 namespace node {
0132
0133 struct SnapshotData;
0134
0135 namespace tracing {
0136
0137 class TracingController;
0138
0139 }
0140
0141 NODE_EXTERN v8::Local<v8::Value> ErrnoException(v8::Isolate* isolate,
0142 int errorno,
0143 const char* syscall = nullptr,
0144 const char* message = nullptr,
0145 const char* path = nullptr);
0146 NODE_EXTERN v8::Local<v8::Value> UVException(v8::Isolate* isolate,
0147 int errorno,
0148 const char* syscall = nullptr,
0149 const char* message = nullptr,
0150 const char* path = nullptr,
0151 const char* dest = nullptr);
0152
0153 NODE_DEPRECATED("Use ErrnoException(isolate, ...)",
0154 inline v8::Local<v8::Value> ErrnoException(
0155 int errorno,
0156 const char* syscall = nullptr,
0157 const char* message = nullptr,
0158 const char* path = nullptr) {
0159 return ErrnoException(v8::Isolate::GetCurrent(),
0160 errorno,
0161 syscall,
0162 message,
0163 path);
0164 })
0165
0166 NODE_DEPRECATED("Use UVException(isolate, ...)",
0167 inline v8::Local<v8::Value> UVException(int errorno,
0168 const char* syscall = nullptr,
0169 const char* message = nullptr,
0170 const char* path = nullptr) {
0171 return UVException(v8::Isolate::GetCurrent(),
0172 errorno,
0173 syscall,
0174 message,
0175 path);
0176 })
0177
0178
0179
0180
0181
0182
0183
0184
0185 NODE_DEPRECATED("Use MakeCallback(..., async_context)",
0186 NODE_EXTERN v8::Local<v8::Value> MakeCallback(
0187 v8::Isolate* isolate,
0188 v8::Local<v8::Object> recv,
0189 const char* method,
0190 int argc,
0191 v8::Local<v8::Value>* argv));
0192 NODE_DEPRECATED("Use MakeCallback(..., async_context)",
0193 NODE_EXTERN v8::Local<v8::Value> MakeCallback(
0194 v8::Isolate* isolate,
0195 v8::Local<v8::Object> recv,
0196 v8::Local<v8::String> symbol,
0197 int argc,
0198 v8::Local<v8::Value>* argv));
0199 NODE_DEPRECATED("Use MakeCallback(..., async_context)",
0200 NODE_EXTERN v8::Local<v8::Value> MakeCallback(
0201 v8::Isolate* isolate,
0202 v8::Local<v8::Object> recv,
0203 v8::Local<v8::Function> callback,
0204 int argc,
0205 v8::Local<v8::Value>* argv));
0206
0207 }
0208
0209 #include <cassert>
0210 #include <cstdint>
0211
0212 #ifndef NODE_STRINGIFY
0213 # define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n)
0214 # define NODE_STRINGIFY_HELPER(n) #n
0215 #endif
0216
0217 #ifdef _WIN32
0218 #if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED)
0219 typedef intptr_t ssize_t;
0220 # define _SSIZE_T_
0221 # define _SSIZE_T_DEFINED
0222 #endif
0223 #else
0224 # include <sys/types.h> // size_t, ssize_t
0225 #endif
0226
0227
0228 namespace node {
0229
0230 class IsolateData;
0231 class Environment;
0232 class MultiIsolatePlatform;
0233 class InitializationResultImpl;
0234
0235 namespace ProcessInitializationFlags {
0236 enum Flags : uint32_t {
0237 kNoFlags = 0,
0238
0239
0240 kEnableStdioInheritance = 1 << 0,
0241
0242 kDisableNodeOptionsEnv = 1 << 1,
0243
0244 kDisableCLIOptions = 1 << 2,
0245
0246 kNoICU = 1 << 3,
0247
0248 kNoStdioInitialization = 1 << 4,
0249
0250
0251 kNoDefaultSignalHandling = 1 << 5,
0252
0253 kNoInitializeV8 = 1 << 6,
0254
0255 kNoInitializeNodeV8Platform = 1 << 7,
0256
0257 kNoInitOpenSSL = 1 << 8,
0258
0259 kNoParseGlobalDebugVariables = 1 << 9,
0260
0261 kNoAdjustResourceLimits = 1 << 10,
0262
0263 kNoUseLargePages = 1 << 11,
0264
0265 kNoPrintHelpOrVersionOutput = 1 << 12,
0266
0267
0268
0269 kNoInitializeCppgc = 1 << 13,
0270
0271 kGeneratePredictableSnapshot = 1 << 14,
0272
0273
0274
0275
0276 kLegacyInitializeNodeWithArgsBehavior =
0277 kNoStdioInitialization | kNoDefaultSignalHandling | kNoInitializeV8 |
0278 kNoInitializeNodeV8Platform | kNoInitOpenSSL |
0279 kNoParseGlobalDebugVariables | kNoAdjustResourceLimits |
0280 kNoUseLargePages | kNoPrintHelpOrVersionOutput | kNoInitializeCppgc,
0281 };
0282 }
0283 namespace ProcessFlags = ProcessInitializationFlags;
0284
0285 namespace StopFlags {
0286 enum Flags : uint32_t {
0287 kNoFlags = 0,
0288
0289
0290 kDoNotTerminateIsolate = 1 << 0,
0291 };
0292 }
0293
0294 class NODE_EXTERN InitializationResult {
0295 public:
0296 virtual ~InitializationResult() = default;
0297
0298
0299 virtual int exit_code() const = 0;
0300
0301
0302 virtual bool early_return() const = 0;
0303
0304
0305 virtual const std::vector<std::string>& args() const = 0;
0306
0307
0308 virtual const std::vector<std::string>& exec_args() const = 0;
0309
0310
0311
0312 virtual const std::vector<std::string>& errors() const = 0;
0313
0314
0315
0316 virtual MultiIsolatePlatform* platform() const = 0;
0317
0318 private:
0319 InitializationResult() = default;
0320 friend class InitializationResultImpl;
0321 };
0322
0323
0324
0325 NODE_EXTERN int Start(int argc, char* argv[]);
0326
0327
0328
0329 NODE_EXTERN int Stop(Environment* env,
0330 StopFlags::Flags flags = StopFlags::kNoFlags);
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340 NODE_DEPRECATED("Use InitializeOncePerProcess() instead",
0341 NODE_EXTERN int InitializeNodeWithArgs(
0342 std::vector<std::string>* argv,
0343 std::vector<std::string>* exec_argv,
0344 std::vector<std::string>* errors,
0345 ProcessInitializationFlags::Flags flags =
0346 ProcessInitializationFlags::kNoFlags));
0347
0348
0349
0350
0351
0352
0353 NODE_EXTERN std::shared_ptr<InitializationResult> InitializeOncePerProcess(
0354 const std::vector<std::string>& args,
0355 ProcessInitializationFlags::Flags flags =
0356 ProcessInitializationFlags::kNoFlags);
0357
0358
0359 NODE_EXTERN void TearDownOncePerProcess();
0360
0361
0362 inline std::shared_ptr<InitializationResult> InitializeOncePerProcess(
0363 const std::vector<std::string>& args,
0364 std::initializer_list<ProcessInitializationFlags::Flags> list) {
0365 uint64_t flags_accum = ProcessInitializationFlags::kNoFlags;
0366 for (const auto flag : list) flags_accum |= static_cast<uint64_t>(flag);
0367 return InitializeOncePerProcess(
0368 args, static_cast<ProcessInitializationFlags::Flags>(flags_accum));
0369 }
0370
0371 enum OptionEnvvarSettings {
0372
0373
0374 kAllowedInEnvvar = 0,
0375
0376
0377 kDisallowedInEnvvar = 1,
0378
0379 kAllowedInEnvironment = kAllowedInEnvvar,
0380
0381 kDisallowedInEnvironment = kDisallowedInEnvvar,
0382 };
0383
0384
0385
0386
0387
0388
0389
0390
0391 NODE_EXTERN int ProcessGlobalArgs(std::vector<std::string>* args,
0392 std::vector<std::string>* exec_args,
0393 std::vector<std::string>* errors,
0394 OptionEnvvarSettings settings);
0395
0396 class NodeArrayBufferAllocator;
0397
0398
0399
0400
0401
0402
0403
0404 class NODE_EXTERN ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
0405 public:
0406
0407
0408
0409
0410 static std::unique_ptr<ArrayBufferAllocator> Create(
0411 bool always_debug = false);
0412
0413 private:
0414 virtual NodeArrayBufferAllocator* GetImpl() = 0;
0415
0416 friend class IsolateData;
0417 };
0418
0419
0420 NODE_EXTERN ArrayBufferAllocator* CreateArrayBufferAllocator();
0421 NODE_EXTERN void FreeArrayBufferAllocator(ArrayBufferAllocator* allocator);
0422
0423 class NODE_EXTERN IsolatePlatformDelegate {
0424 public:
0425 virtual std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner() = 0;
0426 virtual bool IdleTasksEnabled() = 0;
0427 };
0428
0429 class NODE_EXTERN MultiIsolatePlatform : public v8::Platform {
0430 public:
0431 ~MultiIsolatePlatform() override = default;
0432
0433
0434
0435 virtual bool FlushForegroundTasks(v8::Isolate* isolate) = 0;
0436 virtual void DrainTasks(v8::Isolate* isolate) = 0;
0437
0438
0439
0440
0441
0442
0443 virtual void RegisterIsolate(v8::Isolate* isolate,
0444 struct uv_loop_s* loop) = 0;
0445
0446
0447
0448
0449 virtual void RegisterIsolate(v8::Isolate* isolate,
0450 IsolatePlatformDelegate* delegate) = 0;
0451
0452
0453
0454
0455 virtual void UnregisterIsolate(v8::Isolate* isolate) = 0;
0456
0457
0458
0459
0460 virtual void AddIsolateFinishedCallback(v8::Isolate* isolate,
0461 void (*callback)(void*),
0462 void* data) = 0;
0463
0464 static std::unique_ptr<MultiIsolatePlatform> Create(
0465 int thread_pool_size,
0466 v8::TracingController* tracing_controller = nullptr,
0467 v8::PageAllocator* page_allocator = nullptr);
0468 };
0469
0470 enum IsolateSettingsFlags {
0471 MESSAGE_LISTENER_WITH_ERROR_LEVEL = 1 << 0,
0472 DETAILED_SOURCE_POSITIONS_FOR_PROFILING = 1 << 1,
0473 SHOULD_NOT_SET_PROMISE_REJECTION_CALLBACK = 1 << 2,
0474 SHOULD_NOT_SET_PREPARE_STACK_TRACE_CALLBACK = 1 << 3,
0475 ALLOW_MODIFY_CODE_GENERATION_FROM_STRINGS_CALLBACK = 0,
0476 };
0477
0478 struct IsolateSettings {
0479 uint64_t flags = MESSAGE_LISTENER_WITH_ERROR_LEVEL |
0480 DETAILED_SOURCE_POSITIONS_FOR_PROFILING;
0481 v8::MicrotasksPolicy policy = v8::MicrotasksPolicy::kExplicit;
0482
0483
0484 v8::Isolate::AbortOnUncaughtExceptionCallback
0485 should_abort_on_uncaught_exception_callback = nullptr;
0486 v8::FatalErrorCallback fatal_error_callback = nullptr;
0487 v8::OOMErrorCallback oom_error_callback = nullptr;
0488 v8::PrepareStackTraceCallback prepare_stack_trace_callback = nullptr;
0489
0490
0491 v8::PromiseRejectCallback promise_reject_callback = nullptr;
0492 v8::AllowWasmCodeGenerationCallback
0493 allow_wasm_code_generation_callback = nullptr;
0494 v8::ModifyCodeGenerationFromStringsCallback2
0495 modify_code_generation_from_strings_callback = nullptr;
0496 };
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523 class EmbedderSnapshotData {
0524 public:
0525 struct DeleteSnapshotData {
0526 void operator()(const EmbedderSnapshotData*) const;
0527 };
0528 using Pointer =
0529 std::unique_ptr<const EmbedderSnapshotData, DeleteSnapshotData>;
0530
0531
0532
0533
0534 static Pointer BuiltinSnapshotData();
0535
0536
0537
0538
0539
0540 static Pointer FromFile(FILE* in);
0541 static Pointer FromBlob(const std::vector<char>& in);
0542 static Pointer FromBlob(std::string_view in);
0543
0544
0545
0546
0547 void ToFile(FILE* out) const;
0548 std::vector<char> ToBlob() const;
0549
0550
0551
0552 static bool CanUseCustomSnapshotPerIsolate();
0553
0554 EmbedderSnapshotData(const EmbedderSnapshotData&) = delete;
0555 EmbedderSnapshotData& operator=(const EmbedderSnapshotData&) = delete;
0556 EmbedderSnapshotData(EmbedderSnapshotData&&) = delete;
0557 EmbedderSnapshotData& operator=(EmbedderSnapshotData&&) = delete;
0558
0559 protected:
0560 EmbedderSnapshotData(const SnapshotData* impl, bool owns_impl);
0561
0562 private:
0563 const SnapshotData* impl_;
0564 bool owns_impl_;
0565 friend struct SnapshotData;
0566 friend class CommonEnvironmentSetup;
0567 };
0568
0569
0570
0571 NODE_EXTERN void SetIsolateUpForNode(v8::Isolate* isolate,
0572 const IsolateSettings& settings);
0573
0574
0575
0576 NODE_EXTERN void SetIsolateUpForNode(v8::Isolate* isolate);
0577
0578
0579
0580
0581
0582 NODE_EXTERN v8::Isolate* NewIsolate(
0583 ArrayBufferAllocator* allocator,
0584 struct uv_loop_s* event_loop,
0585 MultiIsolatePlatform* platform,
0586 const EmbedderSnapshotData* snapshot_data = nullptr,
0587 const IsolateSettings& settings = {});
0588 NODE_EXTERN v8::Isolate* NewIsolate(
0589 std::shared_ptr<ArrayBufferAllocator> allocator,
0590 struct uv_loop_s* event_loop,
0591 MultiIsolatePlatform* platform,
0592 const EmbedderSnapshotData* snapshot_data = nullptr,
0593 const IsolateSettings& settings = {});
0594
0595
0596 NODE_EXTERN v8::Local<v8::Context> NewContext(
0597 v8::Isolate* isolate,
0598 v8::Local<v8::ObjectTemplate> object_template =
0599 v8::Local<v8::ObjectTemplate>());
0600
0601
0602
0603 NODE_EXTERN v8::Maybe<bool> InitializeContext(v8::Local<v8::Context> context);
0604
0605
0606
0607
0608 NODE_EXTERN IsolateData* CreateIsolateData(
0609 v8::Isolate* isolate,
0610 struct uv_loop_s* loop,
0611 MultiIsolatePlatform* platform = nullptr,
0612 ArrayBufferAllocator* allocator = nullptr,
0613 const EmbedderSnapshotData* snapshot_data = nullptr);
0614 NODE_EXTERN void FreeIsolateData(IsolateData* isolate_data);
0615
0616 struct ThreadId {
0617 uint64_t id = static_cast<uint64_t>(-1);
0618 };
0619 NODE_EXTERN ThreadId AllocateEnvironmentThreadId();
0620
0621 namespace EnvironmentFlags {
0622 enum Flags : uint64_t {
0623 kNoFlags = 0,
0624
0625 kDefaultFlags = 1 << 0,
0626
0627
0628
0629 kOwnsProcessState = 1 << 1,
0630
0631
0632
0633 kOwnsInspector = 1 << 2,
0634
0635
0636
0637 kNoRegisterESMLoader = 1 << 3,
0638
0639
0640 kTrackUnmanagedFds = 1 << 4,
0641
0642
0643
0644 kHideConsoleWindows = 1 << 5,
0645
0646
0647
0648
0649
0650 kNoNativeAddons = 1 << 6,
0651
0652
0653
0654
0655 kNoGlobalSearchPaths = 1 << 7,
0656
0657 kNoBrowserGlobals = 1 << 8,
0658
0659
0660
0661
0662 kNoCreateInspector = 1 << 9,
0663
0664
0665
0666 kNoStartDebugSignalHandler = 1 << 10,
0667
0668
0669
0670 kNoWaitForInspectorFrontend = 1 << 11
0671 };
0672 }
0673
0674 enum class SnapshotFlags : uint32_t {
0675 kDefault = 0,
0676
0677
0678
0679
0680 kWithoutCodeCache = 1 << 0,
0681 };
0682
0683 struct SnapshotConfig {
0684 SnapshotFlags flags = SnapshotFlags::kDefault;
0685
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698 std::optional<std::string> builder_script_path;
0699 };
0700
0701 struct InspectorParentHandle {
0702 virtual ~InspectorParentHandle() = default;
0703 };
0704
0705
0706
0707
0708
0709
0710 NODE_EXTERN Environment* CreateEnvironment(
0711 IsolateData* isolate_data,
0712 v8::Local<v8::Context> context,
0713 const std::vector<std::string>& args,
0714 const std::vector<std::string>& exec_args,
0715 EnvironmentFlags::Flags flags = EnvironmentFlags::kDefaultFlags,
0716 ThreadId thread_id = {} ,
0717 std::unique_ptr<InspectorParentHandle> inspector_parent_handle = {});
0718
0719
0720
0721
0722
0723
0724
0725
0726 NODE_EXTERN std::unique_ptr<InspectorParentHandle> GetInspectorParentHandle(
0727 Environment* parent_env,
0728 ThreadId child_thread_id,
0729 const char* child_url);
0730
0731 NODE_EXTERN std::unique_ptr<InspectorParentHandle> GetInspectorParentHandle(
0732 Environment* parent_env,
0733 ThreadId child_thread_id,
0734 const char* child_url,
0735 const char* name);
0736
0737 struct StartExecutionCallbackInfo {
0738 v8::Local<v8::Object> process_object;
0739 v8::Local<v8::Function> native_require;
0740 v8::Local<v8::Function> run_cjs;
0741 };
0742
0743 using StartExecutionCallback =
0744 std::function<v8::MaybeLocal<v8::Value>(const StartExecutionCallbackInfo&)>;
0745 using EmbedderPreloadCallback =
0746 std::function<void(Environment* env,
0747 v8::Local<v8::Value> process,
0748 v8::Local<v8::Value> require)>;
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764 NODE_EXTERN v8::MaybeLocal<v8::Value> LoadEnvironment(
0765 Environment* env,
0766 StartExecutionCallback cb,
0767 EmbedderPreloadCallback preload = nullptr);
0768 NODE_EXTERN v8::MaybeLocal<v8::Value> LoadEnvironment(
0769 Environment* env,
0770 std::string_view main_script_source_utf8,
0771 EmbedderPreloadCallback preload = nullptr);
0772 NODE_EXTERN void FreeEnvironment(Environment* env);
0773
0774
0775
0776
0777
0778
0779
0780
0781 NODE_EXTERN void SetProcessExitHandler(
0782 Environment* env,
0783 std::function<void(Environment*, int)>&& handler);
0784 NODE_EXTERN void DefaultProcessExitHandler(Environment* env, int exit_code);
0785
0786
0787 NODE_EXTERN Environment* GetCurrentEnvironment(v8::Local<v8::Context> context);
0788 NODE_EXTERN IsolateData* GetEnvironmentIsolateData(Environment* env);
0789 NODE_EXTERN ArrayBufferAllocator* GetArrayBufferAllocator(IsolateData* data);
0790
0791
0792 NODE_EXTERN v8::Local<v8::Context> GetMainContext(Environment* env);
0793
0794 [[noreturn]] NODE_EXTERN void OnFatalError(const char* location,
0795 const char* message);
0796 NODE_EXTERN void PromiseRejectCallback(v8::PromiseRejectMessage message);
0797 NODE_EXTERN bool AllowWasmCodeGenerationCallback(v8::Local<v8::Context> context,
0798 v8::Local<v8::String>);
0799 NODE_EXTERN bool ShouldAbortOnUncaughtException(v8::Isolate* isolate);
0800 NODE_EXTERN v8::MaybeLocal<v8::Value> PrepareStackTraceCallback(
0801 v8::Local<v8::Context> context,
0802 v8::Local<v8::Value> exception,
0803 v8::Local<v8::Array> trace);
0804
0805
0806
0807
0808
0809
0810
0811 NODE_EXTERN std::string TriggerNodeReport(v8::Isolate* isolate,
0812 const char* message,
0813 const char* trigger,
0814 const std::string& filename,
0815 v8::Local<v8::Value> error);
0816 NODE_EXTERN std::string TriggerNodeReport(Environment* env,
0817 const char* message,
0818 const char* trigger,
0819 const std::string& filename,
0820 v8::Local<v8::Value> error);
0821 NODE_EXTERN void GetNodeReport(v8::Isolate* isolate,
0822 const char* message,
0823 const char* trigger,
0824 v8::Local<v8::Value> error,
0825 std::ostream& out);
0826 NODE_EXTERN void GetNodeReport(Environment* env,
0827 const char* message,
0828 const char* trigger,
0829 v8::Local<v8::Value> error,
0830 std::ostream& out);
0831
0832
0833
0834 NODE_EXTERN MultiIsolatePlatform* GetMultiIsolatePlatform(Environment* env);
0835 NODE_EXTERN MultiIsolatePlatform* GetMultiIsolatePlatform(IsolateData* env);
0836
0837 NODE_DEPRECATED("Use MultiIsolatePlatform::Create() instead",
0838 NODE_EXTERN MultiIsolatePlatform* CreatePlatform(
0839 int thread_pool_size,
0840 v8::TracingController* tracing_controller));
0841 NODE_DEPRECATED("Use MultiIsolatePlatform::Create() instead",
0842 NODE_EXTERN void FreePlatform(MultiIsolatePlatform* platform));
0843
0844
0845
0846
0847
0848
0849
0850 NODE_EXTERN v8::TracingController* GetTracingController();
0851 NODE_EXTERN void SetTracingController(v8::TracingController* controller);
0852
0853
0854
0855 NODE_EXTERN v8::Maybe<bool> EmitProcessBeforeExit(Environment* env);
0856 NODE_DEPRECATED("Use Maybe version (EmitProcessBeforeExit) instead",
0857 NODE_EXTERN void EmitBeforeExit(Environment* env));
0858
0859
0860 NODE_EXTERN v8::Maybe<int> EmitProcessExit(Environment* env);
0861 NODE_DEPRECATED("Use Maybe version (EmitProcessExit) instead",
0862 NODE_EXTERN int EmitExit(Environment* env));
0863
0864
0865
0866 NODE_EXTERN void RunAtExit(Environment* env);
0867
0868
0869
0870 NODE_EXTERN struct uv_loop_s* GetCurrentEventLoop(v8::Isolate* isolate);
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883 NODE_EXTERN v8::Maybe<int> SpinEventLoop(Environment* env);
0884
0885 NODE_EXTERN std::string GetAnonymousMainPath();
0886
0887 class NODE_EXTERN CommonEnvironmentSetup {
0888 public:
0889 ~CommonEnvironmentSetup();
0890
0891
0892
0893
0894
0895
0896
0897 template <typename... EnvironmentArgs>
0898 static std::unique_ptr<CommonEnvironmentSetup> Create(
0899 MultiIsolatePlatform* platform,
0900 std::vector<std::string>* errors,
0901 EnvironmentArgs&&... env_args);
0902 template <typename... EnvironmentArgs>
0903 static std::unique_ptr<CommonEnvironmentSetup> CreateFromSnapshot(
0904 MultiIsolatePlatform* platform,
0905 std::vector<std::string>* errors,
0906 const EmbedderSnapshotData* snapshot_data,
0907 EnvironmentArgs&&... env_args);
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929 static std::unique_ptr<CommonEnvironmentSetup> CreateForSnapshotting(
0930 MultiIsolatePlatform* platform,
0931 std::vector<std::string>* errors,
0932 const std::vector<std::string>& args = {},
0933 const std::vector<std::string>& exec_args = {},
0934 const SnapshotConfig& snapshot_config = {});
0935 EmbedderSnapshotData::Pointer CreateSnapshot();
0936
0937 struct uv_loop_s* event_loop() const;
0938 v8::SnapshotCreator* snapshot_creator();
0939
0940 std::shared_ptr<ArrayBufferAllocator> array_buffer_allocator() const;
0941 v8::Isolate* isolate() const;
0942 IsolateData* isolate_data() const;
0943 Environment* env() const;
0944 v8::Local<v8::Context> context() const;
0945
0946 CommonEnvironmentSetup(const CommonEnvironmentSetup&) = delete;
0947 CommonEnvironmentSetup& operator=(const CommonEnvironmentSetup&) = delete;
0948 CommonEnvironmentSetup(CommonEnvironmentSetup&&) = delete;
0949 CommonEnvironmentSetup& operator=(CommonEnvironmentSetup&&) = delete;
0950
0951 private:
0952 enum Flags : uint32_t {
0953 kNoFlags = 0,
0954 kIsForSnapshotting = 1,
0955 };
0956
0957 struct Impl;
0958 Impl* impl_;
0959
0960 CommonEnvironmentSetup(
0961 MultiIsolatePlatform*,
0962 std::vector<std::string>*,
0963 std::function<Environment*(const CommonEnvironmentSetup*)>);
0964 CommonEnvironmentSetup(
0965 MultiIsolatePlatform*,
0966 std::vector<std::string>*,
0967 const EmbedderSnapshotData*,
0968 uint32_t flags,
0969 std::function<Environment*(const CommonEnvironmentSetup*)>,
0970 const SnapshotConfig* config = nullptr);
0971 };
0972
0973
0974 template <typename... EnvironmentArgs>
0975 std::unique_ptr<CommonEnvironmentSetup> CommonEnvironmentSetup::Create(
0976 MultiIsolatePlatform* platform,
0977 std::vector<std::string>* errors,
0978 EnvironmentArgs&&... env_args) {
0979 auto ret = std::unique_ptr<CommonEnvironmentSetup>(new CommonEnvironmentSetup(
0980 platform, errors,
0981 [&](const CommonEnvironmentSetup* setup) -> Environment* {
0982 return CreateEnvironment(
0983 setup->isolate_data(), setup->context(),
0984 std::forward<EnvironmentArgs>(env_args)...);
0985 }));
0986 if (!errors->empty()) ret.reset();
0987 return ret;
0988 }
0989
0990
0991
0992 template <typename... EnvironmentArgs>
0993 std::unique_ptr<CommonEnvironmentSetup>
0994 CommonEnvironmentSetup::CreateFromSnapshot(
0995 MultiIsolatePlatform* platform,
0996 std::vector<std::string>* errors,
0997 const EmbedderSnapshotData* snapshot_data,
0998 EnvironmentArgs&&... env_args) {
0999 auto ret = std::unique_ptr<CommonEnvironmentSetup>(new CommonEnvironmentSetup(
1000 platform,
1001 errors,
1002 snapshot_data,
1003 Flags::kNoFlags,
1004 [&](const CommonEnvironmentSetup* setup) -> Environment* {
1005 return CreateEnvironment(setup->isolate_data(),
1006 setup->context(),
1007 std::forward<EnvironmentArgs>(env_args)...);
1008 }));
1009 if (!errors->empty()) ret.reset();
1010 return ret;
1011 }
1012
1013
1014 NODE_DEPRECATED("Use v8::Date::New() directly",
1015 inline v8::Local<v8::Value> NODE_UNIXTIME_V8(double time) {
1016 return v8::Date::New(
1017 v8::Isolate::GetCurrent()->GetCurrentContext(),
1018 1000 * time)
1019 .ToLocalChecked();
1020 })
1021 #define NODE_UNIXTIME_V8 node::NODE_UNIXTIME_V8
1022 NODE_DEPRECATED("Use v8::Date::ValueOf() directly",
1023 inline double NODE_V8_UNIXTIME(v8::Local<v8::Date> date) {
1024 return date->ValueOf() / 1000;
1025 })
1026 #define NODE_V8_UNIXTIME node::NODE_V8_UNIXTIME
1027
1028 #define NODE_DEFINE_CONSTANT(target, constant) \
1029 do { \
1030 v8::Isolate* isolate = target->GetIsolate(); \
1031 v8::Local<v8::Context> context = isolate->GetCurrentContext(); \
1032 v8::Local<v8::String> constant_name = v8::String::NewFromUtf8Literal( \
1033 isolate, #constant, v8::NewStringType::kInternalized); \
1034 v8::Local<v8::Number> constant_value = \
1035 v8::Number::New(isolate, static_cast<double>(constant)); \
1036 v8::PropertyAttribute constant_attributes = \
1037 static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete); \
1038 (target) \
1039 ->DefineOwnProperty( \
1040 context, constant_name, constant_value, constant_attributes) \
1041 .Check(); \
1042 } while (0)
1043
1044 #define NODE_DEFINE_HIDDEN_CONSTANT(target, constant) \
1045 do { \
1046 v8::Isolate* isolate = target->GetIsolate(); \
1047 v8::Local<v8::Context> context = isolate->GetCurrentContext(); \
1048 v8::Local<v8::String> constant_name = v8::String::NewFromUtf8Literal( \
1049 isolate, #constant, v8::NewStringType::kInternalized); \
1050 v8::Local<v8::Number> constant_value = \
1051 v8::Number::New(isolate, static_cast<double>(constant)); \
1052 v8::PropertyAttribute constant_attributes = \
1053 static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete | \
1054 v8::DontEnum); \
1055 (target) \
1056 ->DefineOwnProperty( \
1057 context, constant_name, constant_value, constant_attributes) \
1058 .Check(); \
1059 } while (0)
1060
1061
1062 inline void NODE_SET_METHOD(v8::Local<v8::Template> recv,
1063 const char* name,
1064 v8::FunctionCallback callback) {
1065 v8::Isolate* isolate = v8::Isolate::GetCurrent();
1066 v8::HandleScope handle_scope(isolate);
1067 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate,
1068 callback);
1069 v8::Local<v8::String> fn_name = v8::String::NewFromUtf8(isolate, name,
1070 v8::NewStringType::kInternalized).ToLocalChecked();
1071 t->SetClassName(fn_name);
1072 recv->Set(fn_name, t);
1073 }
1074
1075
1076 inline void NODE_SET_METHOD(v8::Local<v8::Object> recv,
1077 const char* name,
1078 v8::FunctionCallback callback) {
1079 v8::Isolate* isolate = v8::Isolate::GetCurrent();
1080 v8::HandleScope handle_scope(isolate);
1081 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1082 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate,
1083 callback);
1084 v8::Local<v8::Function> fn = t->GetFunction(context).ToLocalChecked();
1085 v8::Local<v8::String> fn_name = v8::String::NewFromUtf8(isolate, name,
1086 v8::NewStringType::kInternalized).ToLocalChecked();
1087 fn->SetName(fn_name);
1088 recv->Set(context, fn_name, fn).Check();
1089 }
1090 #define NODE_SET_METHOD node::NODE_SET_METHOD
1091
1092
1093
1094 inline void NODE_SET_PROTOTYPE_METHOD(v8::Local<v8::FunctionTemplate> recv,
1095 const char* name,
1096 v8::FunctionCallback callback) {
1097 v8::Isolate* isolate = v8::Isolate::GetCurrent();
1098 v8::HandleScope handle_scope(isolate);
1099 v8::Local<v8::Signature> s = v8::Signature::New(isolate, recv);
1100 v8::Local<v8::FunctionTemplate> t =
1101 v8::FunctionTemplate::New(isolate, callback, v8::Local<v8::Value>(), s);
1102 v8::Local<v8::String> fn_name = v8::String::NewFromUtf8(isolate, name,
1103 v8::NewStringType::kInternalized).ToLocalChecked();
1104 t->SetClassName(fn_name);
1105 recv->PrototypeTemplate()->Set(fn_name, t);
1106 }
1107 #define NODE_SET_PROTOTYPE_METHOD node::NODE_SET_PROTOTYPE_METHOD
1108
1109
1110
1111 enum encoding {
1112 ASCII,
1113 UTF8,
1114 BASE64,
1115 UCS2,
1116 BINARY,
1117 HEX,
1118 BUFFER,
1119 BASE64URL,
1120 LATIN1 = BINARY
1121 };
1122
1123 NODE_EXTERN enum encoding ParseEncoding(
1124 v8::Isolate* isolate,
1125 v8::Local<v8::Value> encoding_v,
1126 enum encoding default_encoding = LATIN1);
1127
1128 NODE_EXTERN void FatalException(v8::Isolate* isolate,
1129 const v8::TryCatch& try_catch);
1130
1131 NODE_EXTERN v8::Local<v8::Value> Encode(v8::Isolate* isolate,
1132 const char* buf,
1133 size_t len,
1134 enum encoding encoding = LATIN1);
1135
1136
1137
1138 NODE_EXTERN v8::Local<v8::Value> Encode(v8::Isolate* isolate,
1139 const uint16_t* buf,
1140 size_t len);
1141
1142
1143 NODE_EXTERN ssize_t DecodeBytes(v8::Isolate* isolate,
1144 v8::Local<v8::Value>,
1145 enum encoding encoding = LATIN1);
1146
1147 NODE_EXTERN ssize_t DecodeWrite(v8::Isolate* isolate,
1148 char* buf,
1149 size_t buflen,
1150 v8::Local<v8::Value>,
1151 enum encoding encoding = LATIN1);
1152 #ifdef _WIN32
1153 NODE_EXTERN v8::Local<v8::Value> WinapiErrnoException(
1154 v8::Isolate* isolate,
1155 int errorno,
1156 const char* syscall = nullptr,
1157 const char* msg = "",
1158 const char* path = nullptr);
1159 #endif
1160
1161 const char* signo_string(int errorno);
1162
1163
1164 typedef void (*addon_register_func)(
1165 v8::Local<v8::Object> exports,
1166 v8::Local<v8::Value> module,
1167 void* priv);
1168
1169 typedef void (*addon_context_register_func)(
1170 v8::Local<v8::Object> exports,
1171 v8::Local<v8::Value> module,
1172 v8::Local<v8::Context> context,
1173 void* priv);
1174
1175 enum ModuleFlags {
1176 kLinked = 0x02
1177 };
1178
1179 struct node_module {
1180 int nm_version;
1181 unsigned int nm_flags;
1182 void* nm_dso_handle;
1183 const char* nm_filename;
1184 node::addon_register_func nm_register_func;
1185 node::addon_context_register_func nm_context_register_func;
1186 const char* nm_modname;
1187 void* nm_priv;
1188 struct node_module* nm_link;
1189 };
1190
1191 extern "C" NODE_EXTERN void node_module_register(void* mod);
1192
1193 #ifdef _WIN32
1194 # define NODE_MODULE_EXPORT __declspec(dllexport)
1195 #else
1196 # define NODE_MODULE_EXPORT __attribute__((visibility("default")))
1197 #endif
1198
1199 #ifdef NODE_SHARED_MODE
1200 # define NODE_CTOR_PREFIX
1201 #else
1202 # define NODE_CTOR_PREFIX static
1203 #endif
1204
1205 #if defined(_MSC_VER)
1206 #define NODE_C_CTOR(fn) \
1207 NODE_CTOR_PREFIX void __cdecl fn(void); \
1208 namespace { \
1209 struct fn##_ { \
1210 fn##_() { fn(); }; \
1211 } fn##_v_; \
1212 } \
1213 NODE_CTOR_PREFIX void __cdecl fn(void)
1214 #else
1215 #define NODE_C_CTOR(fn) \
1216 NODE_CTOR_PREFIX void fn(void) __attribute__((constructor)); \
1217 NODE_CTOR_PREFIX void fn(void)
1218 #endif
1219
1220 #define NODE_MODULE_X(modname, regfunc, priv, flags) \
1221 extern "C" { \
1222 static node::node_module _module = \
1223 { \
1224 NODE_MODULE_VERSION, \
1225 flags, \
1226 NULL, \
1227 __FILE__, \
1228 (node::addon_register_func) (regfunc), \
1229 NULL, \
1230 NODE_STRINGIFY(modname), \
1231 priv, \
1232 NULL \
1233 }; \
1234 NODE_C_CTOR(_register_ ## modname) { \
1235 node_module_register(&_module); \
1236 } \
1237 }
1238
1239 #define NODE_MODULE_CONTEXT_AWARE_X(modname, regfunc, priv, flags) \
1240 extern "C" { \
1241 static node::node_module _module = \
1242 { \
1243 NODE_MODULE_VERSION, \
1244 flags, \
1245 NULL, \
1246 __FILE__, \
1247 NULL, \
1248 (node::addon_context_register_func) (regfunc), \
1249 NODE_STRINGIFY(modname), \
1250 priv, \
1251 NULL \
1252 }; \
1253 NODE_C_CTOR(_register_ ## modname) { \
1254 node_module_register(&_module); \
1255 } \
1256 }
1257
1258
1259
1260
1261 #define NODE_MODULE(modname, regfunc) \
1262 NODE_MODULE_X(modname, regfunc, NULL, 0)
1263
1264 #define NODE_MODULE_CONTEXT_AWARE(modname, regfunc) \
1265 \
1266 NODE_MODULE_CONTEXT_AWARE_X(modname, regfunc, NULL, 0)
1267
1268
1269
1270
1271 #define NODE_MODULE_LINKED(modname, regfunc) \
1272 \
1273 NODE_MODULE_CONTEXT_AWARE_X(modname, regfunc, NULL, \
1274 node::ModuleFlags::kLinked)
1275
1276
1277
1278
1279 #define NODE_MODULE_DECL
1280
1281 #define NODE_MODULE_INITIALIZER_BASE node_register_module_v
1282
1283 #define NODE_MODULE_INITIALIZER_X(base, version) \
1284 NODE_MODULE_INITIALIZER_X_HELPER(base, version)
1285
1286 #define NODE_MODULE_INITIALIZER_X_HELPER(base, version) base##version
1287
1288 #define NODE_MODULE_INITIALIZER \
1289 NODE_MODULE_INITIALIZER_X(NODE_MODULE_INITIALIZER_BASE, \
1290 NODE_MODULE_VERSION)
1291
1292 #define NODE_MODULE_INIT() \
1293 extern "C" NODE_MODULE_EXPORT void \
1294 NODE_MODULE_INITIALIZER(v8::Local<v8::Object> exports, \
1295 v8::Local<v8::Value> module, \
1296 v8::Local<v8::Context> context); \
1297 NODE_MODULE_CONTEXT_AWARE(NODE_GYP_MODULE_NAME, \
1298 NODE_MODULE_INITIALIZER) \
1299 void NODE_MODULE_INITIALIZER(v8::Local<v8::Object> exports, \
1300 v8::Local<v8::Value> module, \
1301 v8::Local<v8::Context> context)
1302
1303
1304
1305
1306
1307
1308 NODE_EXTERN void AddLinkedBinding(Environment* env, const node_module& mod);
1309 NODE_EXTERN void AddLinkedBinding(Environment* env,
1310 const struct napi_module& mod);
1311 NODE_EXTERN void AddLinkedBinding(Environment* env,
1312 const char* name,
1313 addon_context_register_func fn,
1314 void* priv);
1315 NODE_EXTERN void AddLinkedBinding(
1316 Environment* env,
1317 const char* name,
1318 napi_addon_register_func fn,
1319 int32_t module_api_version = NODE_API_DEFAULT_MODULE_API_VERSION);
1320
1321
1322
1323
1324
1325 NODE_EXTERN void AtExit(Environment* env,
1326 void (*cb)(void* arg),
1327 void* arg);
1328
1329 typedef double async_id;
1330 struct async_context {
1331 ::node::async_id async_id;
1332 ::node::async_id trigger_async_id;
1333 };
1334
1335
1336
1337
1338
1339
1340 NODE_EXTERN void AddEnvironmentCleanupHook(v8::Isolate* isolate,
1341 void (*fun)(void* arg),
1342 void* arg);
1343
1344 NODE_EXTERN void RemoveEnvironmentCleanupHook(v8::Isolate* isolate,
1345 void (*fun)(void* arg),
1346 void* arg);
1347
1348
1349
1350
1351 struct ACHHandle;
1352 struct NODE_EXTERN DeleteACHHandle { void operator()(ACHHandle*) const; };
1353 typedef std::unique_ptr<ACHHandle, DeleteACHHandle> AsyncCleanupHookHandle;
1354
1355
1356
1357 NODE_EXTERN ACHHandle* AddEnvironmentCleanupHookInternal(
1358 v8::Isolate* isolate,
1359 void (*fun)(void* arg, void (*cb)(void*), void* cbarg),
1360 void* arg);
1361 inline AsyncCleanupHookHandle AddEnvironmentCleanupHook(
1362 v8::Isolate* isolate,
1363 void (*fun)(void* arg, void (*cb)(void*), void* cbarg),
1364 void* arg) {
1365 return AsyncCleanupHookHandle(AddEnvironmentCleanupHookInternal(isolate, fun,
1366 arg));
1367 }
1368
1369
1370
1371 NODE_EXTERN void RemoveEnvironmentCleanupHookInternal(ACHHandle* holder);
1372 inline void RemoveEnvironmentCleanupHook(AsyncCleanupHookHandle holder) {
1373 RemoveEnvironmentCleanupHookInternal(holder.get());
1374 }
1375
1376
1377
1378
1379
1380
1381 NODE_EXTERN void RequestInterrupt(Environment* env,
1382 void (*fun)(void* arg),
1383 void* arg);
1384
1385
1386
1387
1388 NODE_EXTERN async_id AsyncHooksGetExecutionAsyncId(v8::Isolate* isolate);
1389
1390
1391
1392
1393 NODE_EXTERN async_id
1394 AsyncHooksGetExecutionAsyncId(v8::Local<v8::Context> context);
1395
1396
1397 NODE_EXTERN async_id AsyncHooksGetTriggerAsyncId(v8::Isolate* isolate);
1398
1399
1400
1401
1402
1403
1404
1405
1406 NODE_EXTERN async_context EmitAsyncInit(v8::Isolate* isolate,
1407 v8::Local<v8::Object> resource,
1408 const char* name,
1409 async_id trigger_async_id = -1);
1410
1411 NODE_EXTERN async_context EmitAsyncInit(v8::Isolate* isolate,
1412 v8::Local<v8::Object> resource,
1413 v8::Local<v8::String> name,
1414 async_id trigger_async_id = -1);
1415
1416
1417
1418
1419
1420
1421
1422 NODE_EXTERN void EmitAsyncDestroy(v8::Isolate* isolate,
1423 async_context asyncContext);
1424 NODE_EXTERN void EmitAsyncDestroy(Environment* env,
1425 async_context asyncContext);
1426
1427 class InternalCallbackScope;
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444 class NODE_EXTERN CallbackScope {
1445 public:
1446 CallbackScope(v8::Isolate* isolate,
1447 v8::Local<v8::Object> resource,
1448 async_context asyncContext);
1449 CallbackScope(Environment* env,
1450 v8::Local<v8::Object> resource,
1451 async_context asyncContext);
1452 ~CallbackScope();
1453
1454 void operator=(const CallbackScope&) = delete;
1455 void operator=(CallbackScope&&) = delete;
1456 CallbackScope(const CallbackScope&) = delete;
1457 CallbackScope(CallbackScope&&) = delete;
1458
1459 private:
1460 InternalCallbackScope* private_;
1461 v8::TryCatch try_catch_;
1462 };
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474 NODE_EXTERN
1475 v8::MaybeLocal<v8::Value> MakeCallback(v8::Isolate* isolate,
1476 v8::Local<v8::Object> recv,
1477 v8::Local<v8::Function> callback,
1478 int argc,
1479 v8::Local<v8::Value>* argv,
1480 async_context asyncContext);
1481 NODE_EXTERN
1482 v8::MaybeLocal<v8::Value> MakeCallback(v8::Isolate* isolate,
1483 v8::Local<v8::Object> recv,
1484 const char* method,
1485 int argc,
1486 v8::Local<v8::Value>* argv,
1487 async_context asyncContext);
1488 NODE_EXTERN
1489 v8::MaybeLocal<v8::Value> MakeCallback(v8::Isolate* isolate,
1490 v8::Local<v8::Object> recv,
1491 v8::Local<v8::String> symbol,
1492 int argc,
1493 v8::Local<v8::Value>* argv,
1494 async_context asyncContext);
1495
1496
1497
1498
1499 class NODE_EXTERN AsyncResource {
1500 public:
1501 AsyncResource(v8::Isolate* isolate,
1502 v8::Local<v8::Object> resource,
1503 const char* name,
1504 async_id trigger_async_id = -1);
1505
1506 virtual ~AsyncResource();
1507
1508 AsyncResource(const AsyncResource&) = delete;
1509 void operator=(const AsyncResource&) = delete;
1510
1511 v8::MaybeLocal<v8::Value> MakeCallback(
1512 v8::Local<v8::Function> callback,
1513 int argc,
1514 v8::Local<v8::Value>* argv);
1515
1516 v8::MaybeLocal<v8::Value> MakeCallback(
1517 const char* method,
1518 int argc,
1519 v8::Local<v8::Value>* argv);
1520
1521 v8::MaybeLocal<v8::Value> MakeCallback(
1522 v8::Local<v8::String> symbol,
1523 int argc,
1524 v8::Local<v8::Value>* argv);
1525
1526 v8::Local<v8::Object> get_resource();
1527 async_id get_async_id() const;
1528 async_id get_trigger_async_id() const;
1529
1530 protected:
1531 class NODE_EXTERN CallbackScope : public node::CallbackScope {
1532 public:
1533 explicit CallbackScope(AsyncResource* res);
1534 };
1535
1536 private:
1537 Environment* env_;
1538 v8::Global<v8::Object> resource_;
1539 async_context async_context_;
1540 };
1541
1542 #ifndef _WIN32
1543
1544
1545
1546
1547
1548
1549 NODE_EXTERN
1550 void RegisterSignalHandler(int signal,
1551 void (*handler)(int signal,
1552 siginfo_t* info,
1553 void* ucontext),
1554 bool reset_handler = false);
1555 #endif
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572 NODE_EXTERN void SetCppgcReference(v8::Isolate* isolate,
1573 v8::Local<v8::Object> object,
1574 void* wrappable);
1575
1576 }
1577
1578 #endif