Napi::Value Next()

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;
}