in source/auth.c [541:617]
static napi_value s_aws_sign_request(napi_env env, const struct aws_napi_callback_info *cb_info) {
struct aws_allocator *allocator = aws_napi_get_allocator();
const struct aws_napi_argument *arg = NULL;
struct signer_sign_request_state *state = aws_mem_calloc(allocator, 1, sizeof(struct signer_sign_request_state));
if (!state) {
return NULL;
}
/* Temp buffers */
struct aws_byte_buf region_buf;
AWS_ZERO_STRUCT(region_buf);
struct aws_byte_buf service_buf;
AWS_ZERO_STRUCT(service_buf);
struct aws_byte_buf signed_body_value_buf;
AWS_ZERO_STRUCT(signed_body_value_buf);
/* Get request */
aws_napi_method_next_argument(napi_object, cb_info, &arg);
napi_create_reference(env, arg->node, 1, &state->node_request);
state->request = aws_napi_http_message_unwrap(env, arg->node);
state->signable = aws_signable_new_http_request(allocator, state->request);
/* Populate config */
struct aws_signing_config_aws config;
AWS_ZERO_STRUCT(config);
aws_napi_method_next_argument(napi_object, cb_info, &arg);
napi_value js_config = arg->node;
if (s_get_config_from_js_config(
env, &config, js_config, ®ion_buf, &service_buf, &signed_body_value_buf, state, allocator)) {
/* error already raised */
goto error;
}
aws_napi_method_next_argument(napi_function, cb_info, &arg);
AWS_NAPI_CALL(
env,
aws_napi_create_threadsafe_function(
env,
arg->node,
"aws_signer_on_signing_complete",
s_aws_sign_request_complete_call,
state,
&state->on_complete),
{
napi_throw_type_error(env, NULL, "on_shutdown must be a valid callback or undefined");
goto error;
});
if (aws_sign_request_aws(
allocator,
state->signable,
(struct aws_signing_config_base *)&config,
s_aws_sign_request_complete,
state)) {
aws_napi_throw_last_error(env);
AWS_NAPI_ENSURE(env, aws_napi_release_threadsafe_function(state->on_complete, napi_tsfn_abort));
}
goto done;
error:
// Additional cleanup needed when we didn't successfully bind the on_complete function
s_destroy_signing_binding(env, allocator, state);
done:
// Shared cleanup
aws_credentials_provider_release(config.credentials_provider);
aws_byte_buf_clean_up(®ion_buf);
aws_byte_buf_clean_up(&service_buf);
aws_byte_buf_clean_up(&signed_body_value_buf);
return NULL;
}