node-datachannel 0.28.0 → 0.30.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.
Files changed (59) hide show
  1. package/.clang-format +17 -0
  2. package/.prettierignore +3 -0
  3. package/API.md +30 -0
  4. package/BULDING.md +2 -1
  5. package/CMakeLists.txt +7 -2
  6. package/dist/cjs/lib/index.cjs +4 -1
  7. package/dist/cjs/lib/index.cjs.map +1 -1
  8. package/dist/cjs/polyfill/Events.cjs.map +1 -1
  9. package/dist/cjs/polyfill/RTCDataChannel.cjs +18 -5
  10. package/dist/cjs/polyfill/RTCDataChannel.cjs.map +1 -1
  11. package/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +1 -1
  12. package/dist/cjs/polyfill/RTCPeerConnection.cjs +6 -1
  13. package/dist/cjs/polyfill/RTCPeerConnection.cjs.map +1 -1
  14. package/dist/cjs/polyfill/RTCSctpTransport.cjs.map +1 -1
  15. package/dist/esm/lib/index.mjs +4 -2
  16. package/dist/esm/lib/index.mjs.map +1 -1
  17. package/dist/esm/polyfill/Events.mjs.map +1 -1
  18. package/dist/esm/polyfill/RTCDataChannel.mjs +18 -5
  19. package/dist/esm/polyfill/RTCDataChannel.mjs.map +1 -1
  20. package/dist/esm/polyfill/RTCDtlsTransport.mjs.map +1 -1
  21. package/dist/esm/polyfill/RTCPeerConnection.mjs +6 -1
  22. package/dist/esm/polyfill/RTCPeerConnection.mjs.map +1 -1
  23. package/dist/esm/polyfill/RTCSctpTransport.mjs.map +1 -1
  24. package/dist/types/lib/index.d.ts +14 -3
  25. package/dist/types/lib/types.d.ts +24 -1
  26. package/dist/types/polyfill/RTCPeerConnection.d.ts +1 -2
  27. package/package.json +4 -2
  28. package/src/cpp/data-channel-wrapper.cpp +432 -411
  29. package/src/cpp/data-channel-wrapper.h +0 -2
  30. package/src/cpp/ice-udp-mux-listener-wrapper.cpp +157 -0
  31. package/src/cpp/ice-udp-mux-listener-wrapper.h +43 -0
  32. package/src/cpp/main.cpp +12 -10
  33. package/src/cpp/media-audio-wrapper.cpp +291 -294
  34. package/src/cpp/media-audio-wrapper.h +1 -3
  35. package/src/cpp/media-direction.cpp +32 -32
  36. package/src/cpp/media-direction.h +1 -1
  37. package/src/cpp/media-rtcpreceivingsession-wrapper.cpp +24 -28
  38. package/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -5
  39. package/src/cpp/media-track-wrapper.cpp +350 -339
  40. package/src/cpp/media-track-wrapper.h +0 -3
  41. package/src/cpp/media-video-wrapper.cpp +312 -313
  42. package/src/cpp/media-video-wrapper.h +1 -3
  43. package/src/cpp/peer-connection-wrapper.cpp +1097 -984
  44. package/src/cpp/peer-connection-wrapper.h +1 -2
  45. package/src/cpp/rtc-wrapper.cpp +142 -138
  46. package/src/cpp/rtc-wrapper.h +8 -10
  47. package/src/cpp/thread-safe-callback.cpp +39 -50
  48. package/src/cpp/thread-safe-callback.h +26 -28
  49. package/src/cpp/web-socket-server-wrapper.cpp +205 -199
  50. package/src/cpp/web-socket-server-wrapper.h +0 -4
  51. package/src/cpp/web-socket-wrapper.cpp +625 -598
  52. package/src/cpp/web-socket-wrapper.h +0 -3
  53. package/src/lib/index.ts +14 -1
  54. package/src/lib/types.ts +26 -0
  55. package/src/polyfill/Events.ts +4 -1
  56. package/src/polyfill/RTCDataChannel.ts +24 -5
  57. package/src/polyfill/RTCDtlsTransport.ts +1 -1
  58. package/src/polyfill/RTCPeerConnection.ts +9 -3
  59. package/src/polyfill/RTCSctpTransport.ts +2 -2
@@ -1,9 +1,7 @@
1
1
  #ifndef PEER_CONNECTION_WRAPPER_H
2
2
  #define PEER_CONNECTION_WRAPPER_H
3
3
 
4
- #include <iostream>
5
4
  #include <string>
6
- #include <variant>
7
5
  #include <memory>
8
6
  #include <unordered_set>
9
7
 
@@ -38,6 +36,7 @@ public:
38
36
  Napi::Value iceState(const Napi::CallbackInfo &info);
39
37
  Napi::Value signalingState(const Napi::CallbackInfo &info);
40
38
  Napi::Value gatheringState(const Napi::CallbackInfo &info);
39
+ Napi::Value remoteFingerprint(const Napi::CallbackInfo &info);
41
40
 
42
41
  // Callbacks
43
42
  void onLocalDescription(const Napi::CallbackInfo &info);
@@ -18,184 +18,188 @@
18
18
 
19
19
  Napi::Object RtcWrapper::Init(Napi::Env env, Napi::Object exports)
20
20
  {
21
- Napi::HandleScope scope(env);
21
+ Napi::HandleScope scope(env);
22
22
 
23
- exports.Set("initLogger", Napi::Function::New(env, &RtcWrapper::initLogger));
24
- exports.Set("cleanup", Napi::Function::New(env, &RtcWrapper::cleanup));
25
- exports.Set("preload", Napi::Function::New(env, &RtcWrapper::preload));
26
- exports.Set("setSctpSettings", Napi::Function::New(env, &RtcWrapper::setSctpSettings));
27
- exports.Set("getLibraryVersion", Napi::Function::New(env, &RtcWrapper::getLibraryVersion));
23
+ exports.Set("initLogger", Napi::Function::New(env, &RtcWrapper::initLogger));
24
+ exports.Set("cleanup", Napi::Function::New(env, &RtcWrapper::cleanup));
25
+ exports.Set("preload", Napi::Function::New(env, &RtcWrapper::preload));
26
+ exports.Set("setSctpSettings", Napi::Function::New(env, &RtcWrapper::setSctpSettings));
27
+ exports.Set("getLibraryVersion", Napi::Function::New(env, &RtcWrapper::getLibraryVersion));
28
28
 
29
- return exports;
29
+ return exports;
30
30
  }
31
31
 
32
32
  void RtcWrapper::preload(const Napi::CallbackInfo &info)
33
33
  {
34
- PLOG_DEBUG << "preload() called";
35
- Napi::Env env = info.Env();
36
- try
37
- {
38
- rtc::Preload();
39
- }
40
- catch (std::exception &ex)
41
- {
42
- Napi::Error::New(env, std::string("libdatachannel error# ") + ex.what()).ThrowAsJavaScriptException();
43
- }
34
+ PLOG_DEBUG << "preload() called";
35
+ Napi::Env env = info.Env();
36
+ try
37
+ {
38
+ rtc::Preload();
39
+ }
40
+ catch (std::exception &ex)
41
+ {
42
+ Napi::Error::New(env, std::string("libdatachannel error# ") + ex.what()).ThrowAsJavaScriptException();
43
+ }
44
44
  }
45
45
 
46
46
  void RtcWrapper::initLogger(const Napi::CallbackInfo &info)
47
47
  {
48
- Napi::Env env = info.Env();
49
- int length = info.Length();
50
-
51
- // We expect (String, Object, Function) as param
52
- if (length < 1 || !info[0].IsString())
48
+ Napi::Env env = info.Env();
49
+ int length = info.Length();
50
+
51
+ // We expect (String, Object, Function) as param
52
+ if (length < 1 || !info[0].IsString())
53
+ {
54
+ Napi::TypeError::New(env, "LogLevel(String) expected").ThrowAsJavaScriptException();
55
+ return;
56
+ }
57
+
58
+ std::string logLevelStr = info[0].As<Napi::String>().ToString();
59
+ rtc::LogLevel logLevel = rtc::LogLevel::None;
60
+
61
+ if (logLevelStr == "Verbose")
62
+ logLevel = rtc::LogLevel::Verbose;
63
+ if (logLevelStr == "Debug")
64
+ logLevel = rtc::LogLevel::Debug;
65
+ if (logLevelStr == "Info")
66
+ logLevel = rtc::LogLevel::Info;
67
+ if (logLevelStr == "Warning")
68
+ logLevel = rtc::LogLevel::Warning;
69
+ if (logLevelStr == "Error")
70
+ logLevel = rtc::LogLevel::Error;
71
+ if (logLevelStr == "Fatal")
72
+ logLevel = rtc::LogLevel::Fatal;
73
+
74
+ try
75
+ {
76
+ if (length < 2)
53
77
  {
54
- Napi::TypeError::New(env, "LogLevel(String) expected").ThrowAsJavaScriptException();
55
- return;
78
+ rtc::InitLogger(logLevel);
56
79
  }
57
-
58
- std::string logLevelStr = info[0].As<Napi::String>().ToString();
59
- rtc::LogLevel logLevel = rtc::LogLevel::None;
60
-
61
- if (logLevelStr == "Verbose")
62
- logLevel = rtc::LogLevel::Verbose;
63
- if (logLevelStr == "Debug")
64
- logLevel = rtc::LogLevel::Debug;
65
- if (logLevelStr == "Info")
66
- logLevel = rtc::LogLevel::Info;
67
- if (logLevelStr == "Warning")
68
- logLevel = rtc::LogLevel::Warning;
69
- if (logLevelStr == "Error")
70
- logLevel = rtc::LogLevel::Error;
71
- if (logLevelStr == "Fatal")
72
- logLevel = rtc::LogLevel::Fatal;
73
-
74
- try
75
- {
76
- if (length < 2)
77
- {
78
- rtc::InitLogger(logLevel);
79
- }
80
- else
81
- {
82
- if (!info[1].IsFunction())
83
- {
84
- Napi::TypeError::New(env, "Function expected").ThrowAsJavaScriptException();
85
- return;
86
- }
87
- logCallback = std::make_unique<ThreadSafeCallback>(info[1].As<Napi::Function>());
88
- rtc::InitLogger(logLevel, [&](rtc::LogLevel level, std::string message)
89
- {
90
- if (logCallback)
91
- logCallback->call([level, message = std::move(message)](Napi::Env env, std::vector<napi_value> &args) {
92
- // This will run in main thread and needs to construct the
93
- // arguments for the call
94
-
95
- std::string logLevel;
96
- if (level == rtc::LogLevel::Verbose)
97
- logLevel = "Verbose";
98
- if (level == rtc::LogLevel::Debug)
99
- logLevel = "Debug";
100
- if (level == rtc::LogLevel::Info)
101
- logLevel = "Info";
102
- if (level == rtc::LogLevel::Warning)
103
- logLevel = "Warning";
104
- if (level == rtc::LogLevel::Error)
105
- logLevel = "Error";
106
- if (level == rtc::LogLevel::Fatal)
107
- logLevel = "Fatal";
108
- args = {Napi::String::New(env, logLevel), Napi::String::New(env, message)};
109
- }); });
110
- }
111
- }
112
- catch (std::exception &ex)
80
+ else
113
81
  {
114
- Napi::Error::New(env, std::string("libdatachannel error# ") + ex.what()).ThrowAsJavaScriptException();
82
+ if (!info[1].IsFunction())
83
+ {
84
+ Napi::TypeError::New(env, "Function expected").ThrowAsJavaScriptException();
115
85
  return;
86
+ }
87
+ logCallback = std::make_unique<ThreadSafeCallback>(info[1].As<Napi::Function>());
88
+ rtc::InitLogger(logLevel,
89
+ [&](rtc::LogLevel level, std::string message)
90
+ {
91
+ if (logCallback)
92
+ logCallback->call(
93
+ [level, message = std::move(message)](Napi::Env env, std::vector<napi_value> &args)
94
+ {
95
+ // This will run in main thread and needs to construct the
96
+ // arguments for the call
97
+
98
+ std::string logLevel;
99
+ if (level == rtc::LogLevel::Verbose)
100
+ logLevel = "Verbose";
101
+ if (level == rtc::LogLevel::Debug)
102
+ logLevel = "Debug";
103
+ if (level == rtc::LogLevel::Info)
104
+ logLevel = "Info";
105
+ if (level == rtc::LogLevel::Warning)
106
+ logLevel = "Warning";
107
+ if (level == rtc::LogLevel::Error)
108
+ logLevel = "Error";
109
+ if (level == rtc::LogLevel::Fatal)
110
+ logLevel = "Fatal";
111
+ args = {Napi::String::New(env, logLevel), Napi::String::New(env, message)};
112
+ });
113
+ });
116
114
  }
115
+ }
116
+ catch (std::exception &ex)
117
+ {
118
+ Napi::Error::New(env, std::string("libdatachannel error# ") + ex.what()).ThrowAsJavaScriptException();
119
+ return;
120
+ }
117
121
  }
118
122
 
119
123
  void RtcWrapper::cleanup(const Napi::CallbackInfo &info)
120
124
  {
121
- PLOG_DEBUG << "cleanup() called";
122
- Napi::Env env = info.Env();
123
- try
124
- {
125
- PeerConnectionWrapper::CloseAll();
126
- DataChannelWrapper::CloseAll();
125
+ PLOG_DEBUG << "cleanup() called";
126
+ Napi::Env env = info.Env();
127
+ try
128
+ {
129
+ PeerConnectionWrapper::CloseAll();
130
+ DataChannelWrapper::CloseAll();
127
131
 
128
132
  #if RTC_ENABLE_MEDIA == 1
129
- TrackWrapper::CloseAll();
133
+ TrackWrapper::CloseAll();
130
134
  #endif
131
135
 
132
136
  #if RTC_ENABLE_WEBSOCKET == 1
133
- WebSocketWrapper::CloseAll();
134
- WebSocketServerWrapper::StopAll();
137
+ WebSocketWrapper::CloseAll();
138
+ WebSocketServerWrapper::StopAll();
135
139
  #endif
136
140
 
137
- const auto timeout = std::chrono::seconds(10);
138
- if (rtc::Cleanup().wait_for(std::chrono::seconds(timeout)) == std::future_status::timeout)
139
- throw std::runtime_error("cleanup timeout (possible deadlock)");
141
+ const auto timeout = std::chrono::seconds(10);
142
+ if (rtc::Cleanup().wait_for(std::chrono::seconds(timeout)) == std::future_status::timeout)
143
+ throw std::runtime_error("cleanup timeout (possible deadlock)");
140
144
 
141
- // Cleanup the instances
142
- PeerConnectionWrapper::CleanupAll();
143
- DataChannelWrapper::CleanupAll();
145
+ // Cleanup the instances
146
+ PeerConnectionWrapper::CleanupAll();
147
+ DataChannelWrapper::CleanupAll();
144
148
 
145
149
  #if RTC_ENABLE_MEDIA == 1
146
- TrackWrapper::CleanupAll();
150
+ TrackWrapper::CleanupAll();
147
151
  #endif
148
152
 
149
153
  #if RTC_ENABLE_WEBSOCKET == 1
150
- WebSocketWrapper::CleanupAll();
154
+ WebSocketWrapper::CleanupAll();
151
155
  #endif
152
156
 
153
- if (logCallback)
154
- logCallback.reset();
155
- }
156
- catch (std::exception &ex)
157
- {
158
- Napi::Error::New(env, std::string("libdatachannel error# ") + ex.what()).ThrowAsJavaScriptException();
159
- return;
160
- }
157
+ if (logCallback)
158
+ logCallback.reset();
159
+ }
160
+ catch (std::exception &ex)
161
+ {
162
+ Napi::Error::New(env, std::string("libdatachannel error# ") + ex.what()).ThrowAsJavaScriptException();
163
+ return;
164
+ }
161
165
  }
162
166
 
163
167
  void RtcWrapper::setSctpSettings(const Napi::CallbackInfo &info)
164
168
  {
165
- PLOG_DEBUG << "setSctpSettings() called";
166
- Napi::Env env = info.Env();
167
- int length = info.Length();
168
-
169
- // We expect (Object) as param
170
- if (length < 1 || !info[0].IsObject())
171
- {
172
- Napi::TypeError::New(env, "Configuration (Object) expected").ThrowAsJavaScriptException();
173
- return;
174
- }
175
-
176
- rtc::SctpSettings settings;
177
- Napi::Object config = info[0].As<Napi::Object>();
178
-
179
- if (config.Get("recvBufferSize").IsNumber())
180
- settings.recvBufferSize = config.Get("recvBufferSize").As<Napi::Number>().Uint32Value();
181
- if (config.Get("sendBufferSize").IsNumber())
182
- settings.sendBufferSize = config.Get("sendBufferSize").As<Napi::Number>().Uint32Value();
183
- if (config.Get("maxChunksOnQueue").IsNumber())
184
- settings.maxChunksOnQueue = config.Get("maxChunksOnQueue").As<Napi::Number>().Uint32Value();
185
- if (config.Get("initialCongestionWindow").IsNumber())
186
- settings.initialCongestionWindow = config.Get("initialCongestionWindow").As<Napi::Number>().Uint32Value();
187
- if (config.Get("congestionControlModule").IsNumber())
188
- settings.congestionControlModule = config.Get("congestionControlModule").As<Napi::Number>().Uint32Value();
189
- if (config.Get("delayedSackTime").IsNumber())
190
- settings.delayedSackTime = std::chrono::milliseconds(config.Get("delayedSackTime").As<Napi::Number>().Uint32Value());
191
-
192
- rtc::SetSctpSettings(settings);
169
+ PLOG_DEBUG << "setSctpSettings() called";
170
+ Napi::Env env = info.Env();
171
+ int length = info.Length();
172
+
173
+ // We expect (Object) as param
174
+ if (length < 1 || !info[0].IsObject())
175
+ {
176
+ Napi::TypeError::New(env, "Configuration (Object) expected").ThrowAsJavaScriptException();
177
+ return;
178
+ }
179
+
180
+ rtc::SctpSettings settings;
181
+ Napi::Object config = info[0].As<Napi::Object>();
182
+
183
+ if (config.Get("recvBufferSize").IsNumber())
184
+ settings.recvBufferSize = config.Get("recvBufferSize").As<Napi::Number>().Uint32Value();
185
+ if (config.Get("sendBufferSize").IsNumber())
186
+ settings.sendBufferSize = config.Get("sendBufferSize").As<Napi::Number>().Uint32Value();
187
+ if (config.Get("maxChunksOnQueue").IsNumber())
188
+ settings.maxChunksOnQueue = config.Get("maxChunksOnQueue").As<Napi::Number>().Uint32Value();
189
+ if (config.Get("initialCongestionWindow").IsNumber())
190
+ settings.initialCongestionWindow = config.Get("initialCongestionWindow").As<Napi::Number>().Uint32Value();
191
+ if (config.Get("congestionControlModule").IsNumber())
192
+ settings.congestionControlModule = config.Get("congestionControlModule").As<Napi::Number>().Uint32Value();
193
+ if (config.Get("delayedSackTime").IsNumber())
194
+ settings.delayedSackTime =
195
+ std::chrono::milliseconds(config.Get("delayedSackTime").As<Napi::Number>().Uint32Value());
196
+
197
+ rtc::SetSctpSettings(settings);
193
198
  }
194
199
 
195
-
196
200
  Napi::Value RtcWrapper::getLibraryVersion(const Napi::CallbackInfo &info)
197
201
  {
198
- PLOG_DEBUG << "getLibraryVersion() called";
199
- Napi::Env env = info.Env();
200
- return Napi::String::New(info.Env(), RTC_VERSION);
202
+ PLOG_DEBUG << "getLibraryVersion() called";
203
+ Napi::Env env = info.Env();
204
+ return Napi::String::New(info.Env(), RTC_VERSION);
201
205
  }
@@ -1,9 +1,6 @@
1
1
  #ifndef RTC_WRAPPER_H
2
2
  #define RTC_WRAPPER_H
3
3
 
4
- #include <iostream>
5
- #include <string>
6
-
7
4
  #include <napi.h>
8
5
 
9
6
  #include "rtc/rtc.hpp"
@@ -13,14 +10,15 @@
13
10
  class RtcWrapper
14
11
  {
15
12
  public:
16
- static Napi::Object Init(Napi::Env env, Napi::Object exports);
17
- static void preload(const Napi::CallbackInfo &info);
18
- static void initLogger(const Napi::CallbackInfo &info);
19
- static void cleanup(const Napi::CallbackInfo &info);
20
- static void setSctpSettings(const Napi::CallbackInfo &info);
21
- static Napi::Value getLibraryVersion(const Napi::CallbackInfo &info);
13
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
14
+ static void preload(const Napi::CallbackInfo &info);
15
+ static void initLogger(const Napi::CallbackInfo &info);
16
+ static void cleanup(const Napi::CallbackInfo &info);
17
+ static void setSctpSettings(const Napi::CallbackInfo &info);
18
+ static Napi::Value getLibraryVersion(const Napi::CallbackInfo &info);
19
+
22
20
  private:
23
- static inline std::unique_ptr<ThreadSafeCallback> logCallback = nullptr;
21
+ static inline std::unique_ptr<ThreadSafeCallback> logCallback = nullptr;
24
22
  };
25
23
 
26
24
  #endif // RTC_WRAPPER_H
@@ -2,67 +2,56 @@
2
2
 
3
3
  #include <stdexcept>
4
4
 
5
- const char *ThreadSafeCallback::CancelException::what() const throw()
6
- {
7
- return "ThreadSafeCallback cancelled";
8
- }
5
+ const char *ThreadSafeCallback::CancelException::what() const throw() { return "ThreadSafeCallback cancelled"; }
9
6
 
10
7
  ThreadSafeCallback::ThreadSafeCallback(Napi::Function callback)
11
8
  {
12
- Napi::Env env = callback.Env();
9
+ Napi::Env env = callback.Env();
13
10
 
14
- if (!callback.IsFunction())
15
- throw Napi::Error::New(env, "Callback must be a function");
11
+ if (!callback.IsFunction())
12
+ throw Napi::Error::New(env, "Callback must be a function");
16
13
 
17
- tsfn = tsfn_t::New(env,
18
- std::move(callback),
19
- "ThreadSafeCallback callback",
20
- 0, // unlimited queue
21
- 1);
14
+ tsfn = tsfn_t::New(env, std::move(callback), "ThreadSafeCallback callback",
15
+ 0, // unlimited queue
16
+ 1);
22
17
  }
23
18
 
24
- ThreadSafeCallback::~ThreadSafeCallback()
25
- {
26
- tsfn.Abort();
27
- }
19
+ ThreadSafeCallback::~ThreadSafeCallback() { tsfn.Abort(); }
28
20
 
29
21
  void ThreadSafeCallback::call(arg_func_t argFunc, cleanup_func_t cleanupFunc)
30
22
  {
31
- CallbackData *data = new CallbackData{std::move(argFunc), std::move(cleanupFunc)};
32
- if (tsfn.BlockingCall(data) != napi_ok)
33
- {
34
- delete data;
35
- throw std::runtime_error("Failed to call JavaScript callback");
36
- }
23
+ CallbackData *data = new CallbackData{std::move(argFunc), std::move(cleanupFunc)};
24
+ if (tsfn.BlockingCall(data) != napi_ok)
25
+ {
26
+ delete data;
27
+ throw std::runtime_error("Failed to call JavaScript callback");
28
+ }
37
29
  }
38
30
 
39
- void ThreadSafeCallback::callbackFunc(Napi::Env env,
40
- Napi::Function callback,
41
- ContextType *context,
42
- CallbackData *data)
31
+ void ThreadSafeCallback::callbackFunc(Napi::Env env, Napi::Function callback, ContextType *context, CallbackData *data)
43
32
  {
44
- // if env is gone, it could mean this cb was destroyed. See issue#176
45
- if (!data || !env)
46
- return;
47
-
48
- arg_vector_t args;
49
- arg_func_t argFunc(std::move(data->argFunc));
50
- cleanup_func_t cleanup(std::move(data->cleanupFunc));
51
- delete data;
52
-
53
- try
54
- {
55
- argFunc(env, args);
56
- }
57
- catch (CancelException &)
58
- {
59
- return;
60
- }
61
-
62
- if (callback)
63
- {
64
- callback.Call(args);
65
- }
66
-
67
- cleanup();
33
+ // if env is gone, it could mean this cb was destroyed. See issue#176
34
+ if (!data || !env)
35
+ return;
36
+
37
+ arg_vector_t args;
38
+ arg_func_t argFunc(std::move(data->argFunc));
39
+ cleanup_func_t cleanup(std::move(data->cleanupFunc));
40
+ delete data;
41
+
42
+ try
43
+ {
44
+ argFunc(env, args);
45
+ }
46
+ catch (CancelException &)
47
+ {
48
+ return;
49
+ }
50
+
51
+ if (callback)
52
+ {
53
+ callback.Call(args);
54
+ }
55
+
56
+ cleanup();
68
57
  }
@@ -9,41 +9,39 @@
9
9
  class ThreadSafeCallback
10
10
  {
11
11
  public:
12
- using arg_vector_t = std::vector<napi_value>;
13
- using arg_func_t = std::function<void(napi_env, arg_vector_t &)>;
14
- using cleanup_func_t = std::function<void()>;
12
+ using arg_vector_t = std::vector<napi_value>;
13
+ using arg_func_t = std::function<void(napi_env, arg_vector_t &)>;
14
+ using cleanup_func_t = std::function<void()>;
15
15
 
16
- ThreadSafeCallback(Napi::Function callback);
17
- ~ThreadSafeCallback();
16
+ ThreadSafeCallback(Napi::Function callback);
17
+ ~ThreadSafeCallback();
18
18
 
19
- ThreadSafeCallback(const ThreadSafeCallback &) = delete;
20
- ThreadSafeCallback(ThreadSafeCallback &&) = delete;
19
+ ThreadSafeCallback(const ThreadSafeCallback &) = delete;
20
+ ThreadSafeCallback(ThreadSafeCallback &&) = delete;
21
21
 
22
- ThreadSafeCallback &operator=(const ThreadSafeCallback &) = delete;
23
- ThreadSafeCallback &operator=(ThreadSafeCallback &&) = delete;
22
+ ThreadSafeCallback &operator=(const ThreadSafeCallback &) = delete;
23
+ ThreadSafeCallback &operator=(ThreadSafeCallback &&) = delete;
24
24
 
25
- void call(arg_func_t argFunc, cleanup_func_t cleanupFunc = []() {});
25
+ void call(
26
+ arg_func_t argFunc, cleanup_func_t cleanupFunc = []() {});
26
27
 
27
- class CancelException : public std::exception
28
- {
29
- const char *what() const throw();
30
- };
28
+ class CancelException : public std::exception
29
+ {
30
+ const char *what() const throw();
31
+ };
31
32
 
32
33
  private:
33
- using ContextType = std::nullptr_t;
34
- struct CallbackData
35
- {
36
- arg_func_t argFunc;
37
- cleanup_func_t cleanupFunc;
38
- };
39
-
40
- static void callbackFunc(Napi::Env env,
41
- Napi::Function callback,
42
- ContextType *context,
43
- CallbackData *data);
44
-
45
- using tsfn_t = Napi::TypedThreadSafeFunction<ContextType, CallbackData, callbackFunc>;
46
- tsfn_t tsfn;
34
+ using ContextType = std::nullptr_t;
35
+ struct CallbackData
36
+ {
37
+ arg_func_t argFunc;
38
+ cleanup_func_t cleanupFunc;
39
+ };
40
+
41
+ static void callbackFunc(Napi::Env env, Napi::Function callback, ContextType *context, CallbackData *data);
42
+
43
+ using tsfn_t = Napi::TypedThreadSafeFunction<ContextType, CallbackData, callbackFunc>;
44
+ tsfn_t tsfn;
47
45
  };
48
46
 
49
47
  #endif // THREAD_SAFE_CALLBACK_H