in source/io.c [528:608]
napi_value aws_napi_io_socket_options_new(napi_env env, napi_callback_info info) {
napi_value node_args[7];
size_t num_args = AWS_ARRAY_SIZE(node_args);
if (napi_get_cb_info(env, info, &num_args, node_args, NULL, NULL)) {
napi_throw_error(env, NULL, "Failed to retrieve callback information");
return NULL;
}
if (num_args != AWS_ARRAY_SIZE(node_args)) {
napi_throw_error(env, NULL, "io_socket_options_new requires exactly 7 arguments");
return NULL;
}
struct aws_socket_options options;
uint32_t enum_value = 0;
if (napi_get_value_uint32(env, node_args[0], &enum_value) || enum_value > AWS_SOCKET_DGRAM) {
napi_throw_type_error(env, NULL, "First argument (type) must be a Number between 0 and 1");
return NULL;
}
options.type = (enum aws_socket_type)enum_value;
if (napi_get_value_uint32(env, node_args[1], &enum_value) || enum_value > AWS_SOCKET_LOCAL) {
napi_throw_type_error(env, NULL, "Second argument (domain) must be a Number between 0 and 2");
return NULL;
}
options.domain = (enum aws_socket_domain)enum_value;
if (napi_get_value_uint32(env, node_args[2], &enum_value) || enum_value > UINT16_MAX) {
napi_throw_type_error(env, NULL, "Third argument (connect_timeout_ms) must be a Number");
return NULL;
}
options.connect_timeout_ms = (uint16_t)enum_value;
uint32_t keep_alive_interval_sec;
if (napi_get_value_uint32(env, node_args[3], &keep_alive_interval_sec)) {
napi_throw_type_error(
env, NULL, "Fourth argument (keep_alive_interval_sec) must be a Number between 0 and 32767");
return NULL;
}
options.keep_alive_interval_sec = (keep_alive_interval_sec > 0x7fff) ? 0x7fff : (uint16_t)keep_alive_interval_sec;
uint32_t keep_alive_timeout_sec;
if (napi_get_value_uint32(env, node_args[4], &keep_alive_timeout_sec)) {
napi_throw_type_error(
env, NULL, "Fifth argument (keep_alive_timeout_sec) must be a Number between 0 and 32767");
return NULL;
}
options.keep_alive_timeout_sec = (keep_alive_timeout_sec > 0x7fff) ? 0x7fff : (uint16_t)keep_alive_timeout_sec;
uint32_t keep_alive_max_failed_probes;
if (napi_get_value_uint32(env, node_args[5], &keep_alive_max_failed_probes)) {
napi_throw_type_error(
env, NULL, "Sixth argument (keep_alive_max_failed_probes) must be a Number between 0 and 32767");
return NULL;
}
options.keep_alive_max_failed_probes =
(keep_alive_max_failed_probes > 0x7fff) ? 0x7fff : (uint16_t)keep_alive_max_failed_probes;
if (napi_get_value_bool(env, node_args[6], &options.keepalive)) {
napi_throw_type_error(env, NULL, "Seventh argument (keepalive) must be a Boolean value");
return NULL;
}
struct aws_allocator *allocator = aws_napi_get_allocator();
struct aws_socket_options *socket_options = aws_mem_acquire(allocator, sizeof(struct aws_socket_options));
if (!socket_options) {
aws_napi_throw_last_error(env);
return NULL;
}
*socket_options = options;
napi_value node_external;
if (napi_create_external(env, socket_options, s_socket_options_finalize, NULL, &node_external)) {
aws_mem_release(allocator, socket_options);
aws_napi_throw_last_error(env);
return NULL;
}
return node_external;
}