#pragma once
#include <cstdint>
#include <iosfwd>
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <node-addon-api/napi.h>
#include "src/converters.h"
#include "src/converters/macros.h"
#include "src/functional/maybe.h"
#include "src/functional/validation.h"
#define CONVERT_OR_THROW_AND_RETURN_NAPI(E, I, O, T) \
auto NODE_WEBRTC_UNIQUE_NAME(validation) = \
From<detail::argument_type<void(T)>::type>(std::make_pair(E, I)); \
if (NODE_WEBRTC_UNIQUE_NAME(validation).IsInvalid()) { \
auto error = NODE_WEBRTC_UNIQUE_NAME(validation).ToErrors()[0]; \
Napi::TypeError::New(E, error).ThrowAsJavaScriptException(); \
return E.Undefined(); \
} \
auto O = NODE_WEBRTC_UNIQUE_NAME(validation).UnsafeFromValid();
#define CONVERT_OR_THROW_AND_RETURN_VOID_NAPI(E, I, O, T) \
auto NODE_WEBRTC_UNIQUE_NAME(validation) = \
From<detail::argument_type<void(T)>::type>(std::make_pair(E, I)); \
if (NODE_WEBRTC_UNIQUE_NAME(validation).IsInvalid()) { \
auto error = NODE_WEBRTC_UNIQUE_NAME(validation).ToErrors()[0]; \
Napi::TypeError::New(E, error).ThrowAsJavaScriptException(); \
return; \
} \
auto O = NODE_WEBRTC_UNIQUE_NAME(validation).UnsafeFromValid();
#define CONVERT_OR_REJECT_AND_RETURN_NAPI(D, I, O, T) \
auto NODE_WEBRTC_UNIQUE_NAME(validation) = \
From<detail::argument_type<void(T)>::type>(std::make_pair(D.Env(), I)); \
if (NODE_WEBRTC_UNIQUE_NAME(validation).IsInvalid()) { \
auto error = NODE_WEBRTC_UNIQUE_NAME(validation).ToErrors()[0]; \
D.Reject(Napi::TypeError::New(D.Env(), error).Value()); \
return D.Env().Undefined(); \
} \
auto O = NODE_WEBRTC_UNIQUE_NAME(validation).UnsafeFromValid();
namespace node_webrtc {
#define DECLARE_TO_NAPI(T) \
DECLARE_CONVERTER(std::pair<Napi::Env COMMA T>, Napi::Value)
#define DECLARE_FROM_NAPI(T) DECLARE_CONVERTER(Napi::Value, T)
#define DECLARE_TO_AND_FROM_NAPI(T) \
DECLARE_TO_NAPI(T) \
DECLARE_FROM_NAPI(T)
#define TO_NAPI_IMPL(T, V) \
CONVERTER_IMPL(std::pair<Napi::Env COMMA T>, Napi::Value, V)
#define FROM_NAPI_IMPL(T, V) CONVERTER_IMPL(Napi::Value, T, V)
DECLARE_TO_AND_FROM_NAPI(bool)
DECLARE_TO_AND_FROM_NAPI(double)
DECLARE_TO_AND_FROM_NAPI(uint8_t)
DECLARE_TO_AND_FROM_NAPI(uint16_t)
DECLARE_TO_AND_FROM_NAPI(uint32_t)
DECLARE_TO_AND_FROM_NAPI(uint64_t)
DECLARE_TO_AND_FROM_NAPI(int8_t)
DECLARE_TO_AND_FROM_NAPI(int16_t)
DECLARE_TO_AND_FROM_NAPI(int32_t)
DECLARE_TO_AND_FROM_NAPI(int64_t)
DECLARE_TO_AND_FROM_NAPI(std::string)
DECLARE_TO_NAPI(Napi::Error)
DECLARE_FROM_NAPI(Napi::Function)
DECLARE_FROM_NAPI(Napi::Object)
DECLARE_TO_NAPI(Napi::Value)
DECLARE_TO_NAPI(std::vector<bool>)
DECLARE_FROM_NAPI(Napi::ArrayBuffer)
template <typename T> struct Converter<Napi::Value, Maybe<T>> {
static Validation<Maybe<T>> Convert(const Napi::Value value) {
return value.IsUndefined() ? Pure(MakeNothing<T>())
: From<T>(value).Map(&MakeJust<T>);
}
};
template <typename T>
struct Converter<std::pair<Napi::Env, Maybe<T>>, Napi::Value> {
static Validation<Napi::Value>
Convert(const std::pair<Napi::Env, Maybe<T>> pair) {
return pair.second.IsJust() ? From<Napi::Value>(std::make_pair(
pair.first, pair.second.UnsafeFromJust()))
: Pure(pair.first.Null());
}
};
template <> struct Converter<Napi::Value, Napi::Array> {
static Validation<Napi::Array> Convert(Napi::Value value) {
return value.IsArray()
? Pure(value.As<Napi::Array>())
: Validation<Napi::Array>::Invalid(("Expected an array"));
}
};
template <typename T> struct Converter<Napi::Array, std::vector<T>> {
static Validation<std::vector<T>> Convert(const Napi::Array array) {
auto validated = std::vector<T>();
validated.reserve(array.Length());
for (uint32_t i = 0; i < array.Length(); i++) {
auto maybeValue = array.Get(i);
if (maybeValue.Env().IsExceptionPending()) {
return Validation<std::vector<T>>::Invalid(
maybeValue.Env().GetAndClearPendingException().Message());
}
auto maybeValidated = From<T>(maybeValue);
if (maybeValidated.IsInvalid()) {
return Validation<std::vector<T>>::Invalid(maybeValidated.ToErrors());
}
validated.push_back(maybeValidated.UnsafeFromValid());
}
return Pure(validated);
}
};
template <typename T> struct Converter<Napi::Value, std::vector<T>> {
static Validation<std::vector<T>> Convert(const Napi::Value value) {
return Converter<Napi::Value, Napi::Array>::Convert(value)
.FlatMap<std::vector<T>>(
Converter<Napi::Array, std::vector<T>>::Convert);
}
};
template <typename T>
struct Converter<std::pair<Napi::Env, std::vector<T>>, Napi::Value> {
static Validation<Napi::Value>
Convert(std::pair<Napi::Env, std::vector<T>> pair) {
auto env = pair.first;
Napi::EscapableHandleScope scope(env);
auto values = pair.second;
auto maybeArray = Napi::Array::New(env, values.size());
if (maybeArray.Env().IsExceptionPending()) {
return Validation<Napi::Value>::Invalid(
maybeArray.Env().GetAndClearPendingException().Message());
}
uint32_t i = 0;
for (const auto &value : values) {
auto maybeValue = From<Napi::Value>(std::make_pair(env, value));
if (maybeValue.IsInvalid()) {
return Validation<Napi::Value>::Invalid(maybeValue.ToErrors());
}
maybeArray.Set(i++, maybeValue.UnsafeFromValid());
if (maybeArray.Env().IsExceptionPending()) {
return Validation<Napi::Value>::Invalid(
maybeArray.Env().GetAndClearPendingException().Message());
}
}
return Pure(scope.Escape(maybeArray));
}
};
template <typename T> struct Converter<Napi::Object, std::map<std::string, T>> {
using Result = Validation<std::map<std::string, T>>;
static Result Convert(const Napi::Object o) {
auto validated = std::map<std::string, T>();
auto propertyNames = o.GetPropertyNames();
if (propertyNames.Env().IsExceptionPending()) {
return Result::Invalid(
propertyNames.Env().GetAndClearPendingException().Message());
}
for (uint32_t i = 0; i < propertyNames.Length(); i++) {
auto key = propertyNames.Get(i);
if (key.Env().IsExceptionPending()) {
return Result::Invalid(
key.Env().GetAndClearPendingException().Message());
}
if (!o.HasOwnProperty(key)) {
continue;
}
auto maybeKey = From<std::string>(key);
if (maybeKey.IsInvalid()) {
return Result::Invalid(maybeKey.ToErrors());
}
auto value = o.Get(key);
if (value.Env().IsExceptionPending()) {
return Result::Invalid(
value.Env().GetAndClearPendingException().Message());
}
auto maybeValue = From<T>(value);
if (maybeValue.IsInvalid()) {
return Result::Invalid(maybeValue.ToErrors());
}
validated[maybeKey.UnsafeFromValid()] = maybeValue.UnsafeFromValid();
}
return P
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
node-webrtc基于webrtc-m126差异性修改 (208个子文件)
rtc_peer_connection.cc 36KB
rtc_data_channel.cc 14KB
media_stream.cc 13KB
test_audio_device_module.cc 11KB
media_stream_track.cc 10KB
napi.cc 9KB
rtc_rtp_sender.cc 8KB
rtc_ice_transport.cc 8KB
rtc_rtp_receiver.cc 7KB
rtc_dtls_transport.cc 7KB
rtc_rtp_transceiver.cc 6KB
get_user_media.cc 6KB
peer_connection_factory.cc 6KB
ice_candidate_interface.cc 5KB
rtc_on_data_event_dict.cc 5KB
rtc_sctp_transport.cc 5KB
error_factory.cc 4KB
rtc_video_source.cc 4KB
rtp_encoding_parameters.cc 4KB
media_track_settings.cc 4KB
rtc_audio_sink.cc 4KB
i420_helpers.cc 4KB
test.cc 4KB
some_error.cc 4KB
video_frame_buffer.cc 4KB
rtp_codec_parameters.cc 3KB
rtp_parameters.cc 3KB
extended_rtc_configuration.cc 3KB
rtp_codec_capability.cc 3KB
rtc_session_description_init.cc 3KB
ice_server.cc 3KB
rtc_video_sink.cc 3KB
rtc_stats_report.cc 3KB
binding.cc 3KB
rtc_configuration.cc 3KB
rtc_error.cc 2KB
data_channel_init.cc 2KB
rtc_audio_source.cc 2KB
rtp_transceiver_init.cc 2KB
rtp_header_extension_parameters.cc 2KB
rtc_offer_options.cc 2KB
rtcp_parameters.cc 1KB
set_session_description_observer.cc 1KB
unsigned_short_range.cc 1KB
create_session_description_observer.cc 1KB
async_context_releaser.cc 1KB
rtc_stats.cc 1KB
rtp_capabilities.cc 1KB
image_data.cc 1KB
video_frame.cc 1003B
deferrer.cc 805B
rtp_source.cc 764B
webrtc.cc 755B
rtc_stats_collector.cc 672B
rtp_header_extension_capability.cc 626B
get_display_media.cc 597B
rtc_answer_options.cc 573B
rtc_video_source_init.cc 572B
rtc_dtls_fingerprint.cc 566B
rtc_outh_credential.cc 521B
attribute.cc 468B
rtc_media_stream_init.cc 451B
undefined.cc 321B
null.cc 302B
rtp_transceiver_direction.cc 222B
sdp_semantics.cc 198B
rtc_ice_credential_type.cc 151B
rtc_ice_candidate_type.cc 149B
video_frame_buffer_type.cc 146B
degradation_preference.cc 143B
peer_connection_state.cc 142B
dtls_transport_state.cc 140B
ice_connection_state.cc 140B
sctp_transport_state.cc 140B
rtc_priority_type.cc 139B
rtc_ice_component.cc 139B
ice_gathering_state.cc 138B
ice_transport_state.cc 138B
ice_transports_type.cc 138B
rtc_dtx_status.cc 133B
rtcp_mux_policy.cc 130B
signaling_state.cc 130B
rtc_sdp_type.cc 129B
media_type.cc 128B
binary_type.cc 127B
bundle_policy.cc 126B
track_state.cc 122B
data_state.cc 120B
ice_role.cc 116B
.DS_Store 8KB
.DS_Store 6KB
.DS_Store 6KB
napi.h 10KB
validation.h 7KB
either.h 5KB
rtc_peer_connection.h 5KB
bidi_map.h 5KB
arguments.h 4KB
maybe.h 4KB
rtc_data_channel.h 4KB
共 208 条
- 1
- 2
- 3
资源评论
lpt111111111
- 粉丝: 85
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 主要特点: 美观的界面:清新简约的设计,使得使用过程愉悦,日历视图清晰明了 高效的日程管理:支持添加、编辑和删除日程事件,方
- 基于openCV和Qt的视频光斑中心动态监测程序源码+文档说明(毕业设计)
- lecture7-chatglm4-llama-factory
- 基于QT+C++开发的德州扑克游戏项目源码+详细文档说明(期末大作业)
- 2024年MathorCup大数据挑战赛-赛道A初赛-第四版论文.zip
- 医学图像分类数据集:19种器官细胞图像识别数据集(包括划分好的数据【文件夹保存】、类别字典文件)
- 需要确认下 发H8是 什么场景会让状态回到0 . 看起来是测得这个点
- 技术资料分享0a-esp8266ex-datasheet-cn-v1.0很好的技术资料.zip
- 基于QT+C++开发的德州扑克游戏项目源码+详细文档说明(毕业设计)
- 基于asp.net+sqlserver 银行大厅自助信息系统的开发与实现毕业设计(源代码+论文)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功