in source/module.c [75:164]
napi_status aws_byte_buf_init_from_napi(struct aws_byte_buf *buf, napi_env env, napi_value node_str) {
AWS_ASSERT(buf);
napi_valuetype type = napi_undefined;
AWS_NAPI_CALL(env, napi_typeof(env, node_str, &type), { return status; });
if (type == napi_string) {
size_t length = 0;
AWS_NAPI_CALL(env, napi_get_value_string_utf8(env, node_str, NULL, 0, &length), { return status; });
/* Node requires that the null terminator be written */
if (aws_byte_buf_init(buf, aws_napi_get_allocator(), length + 1)) {
return napi_generic_failure;
}
AWS_NAPI_CALL(env, napi_get_value_string_utf8(env, node_str, (char *)buf->buffer, buf->capacity, &buf->len), {
return status;
});
AWS_ASSERT(length == buf->len);
return napi_ok;
} else if (type == napi_object) {
bool is_expected = false;
/* Try ArrayBuffer */
AWS_NAPI_CALL(env, napi_is_arraybuffer(env, node_str, &is_expected), { return status; });
if (is_expected) {
napi_status status = napi_get_arraybuffer_info(env, node_str, (void **)&buf->buffer, &buf->len);
buf->capacity = buf->len;
return status;
}
/* Try DataView */
AWS_NAPI_CALL(env, napi_is_dataview(env, node_str, &is_expected), { return status; });
if (is_expected) {
napi_status status = napi_get_dataview_info(env, node_str, &buf->len, (void **)&buf->buffer, NULL, NULL);
buf->capacity = buf->len;
return status;
}
/* Try TypedArray */
AWS_NAPI_CALL(env, napi_is_typedarray(env, node_str, &is_expected), { return status; });
if (is_expected) {
napi_typedarray_type array_type = napi_uint8_array;
size_t length = 0;
AWS_NAPI_CALL(
env, napi_get_typedarray_info(env, node_str, &array_type, &length, (void **)&buf->buffer, NULL, NULL), {
return status;
});
size_t element_size = 0;
/* whoever added napi_bigint64_array to the node api deserves a good thrashing!!!! */
int type_hack = array_type;
switch (type_hack) {
case napi_int8_array:
case napi_uint8_array:
case napi_uint8_clamped_array:
element_size = 1;
break;
case napi_int16_array:
case napi_uint16_array:
element_size = 2;
break;
case napi_int32_array:
case napi_uint32_array:
case napi_float32_array:
element_size = 4;
break;
case napi_float64_array:
case 9: /*napi_bigint64_array */
case 10: /*napi_biguint64_array*/
element_size = 8;
break;
}
buf->len = length * element_size;
buf->capacity = buf->len;
return napi_ok;
}
}
return napi_invalid_arg;
}