in src/RuntimeClient/runtime-client.cc [45:97]
Napi::Value Next(const Napi::CallbackInfo & info)
{
Napi::Env env = info.Env();
if (CLIENT == nullptr) {
Napi::TypeError::New(env, "Client not initialized").ThrowAsJavaScriptException();
return env.Null();
}
auto outcome = CLIENT->get_next();
if (!outcome.is_success()) {
Napi::TypeError::New(env, "Failed to get next!").ThrowAsJavaScriptException();
return env.Null();
}
// TODO: See if json parsing works on V8:Buffer objects, which might be a way to reduce copying large payloads
auto response = outcome.get_result();
auto response_data = Napi::String::New(env, response.payload.c_str());
// TODO: The current javascript code (InvokeContext.js) to handle the header values itself.
// These type conversions might be replaced by returning the final context object.
auto headers = Napi::Object::New(env);
headers.Set(
Napi::String::New(env, "lambda-runtime-deadline-ms"),
Napi::Number::New(env,
std::chrono::duration_cast<std::chrono::milliseconds>(
response.deadline.time_since_epoch()
).count()
));
headers.Set(
Napi::String::New(env, "lambda-runtime-aws-request-id"),
Napi::String::New(env, response.request_id.c_str()));
headers.Set(
Napi::String::New(env, "lambda-runtime-trace-id"),
Napi::String::New(env, response.xray_trace_id.c_str()));
headers.Set(
Napi::String::New(env, "lambda-runtime-invoked-function-arn"),
Napi::String::New(env, response.function_arn.c_str()));
if (response.client_context != "") {
headers.Set(
Napi::String::New(env, "lambda-runtime-client-context"),
Napi::String::New(env, response.client_context.c_str()));
}
if (response.cognito_identity != "") {
headers.Set(
Napi::String::New(env, "lambda-runtime-cognito-identity"),
Napi::String::New(env, response.cognito_identity.c_str()));
}
auto ret = Napi::Object::New(env);
ret.Set(Napi::String::New(env, "bodyJson"), response_data);
ret.Set(Napi::String::New(env, "headers"), headers);
return ret;
}