module WolfCore::LambdaFunctionDataSource

def client

def client
  @@client
end

def init

def init
  timeout = ENV.fetch('AWS_LAMBDA_CLIENT_TIMEOUT', 900)
  client_config = {
    access_key_id: ENV.fetch('AWS_KEY_ID', nil),
    secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY', nil),
    region: ENV.fetch('AWS_REGION', nil),
    endpoint: ENV.fetch('AWS_LAMBDA_FUNCTION_ENDPOINT', nil),
    http_open_timeout: timeout,
    http_read_timeout: timeout,
  }
  client_config = client_config.compact
  return if client_config.empty?
  @@client = Aws::Lambda::Client.new(client_config)
end

def invoke(function_name:, payload:, invocation_type: nil)

def invoke(function_name:, payload:, invocation_type: nil)
  parsed_payload = JSON.generate(payload)
  invocation_type ||= 'Event'
  # use invocation_type = 'Event' to make an asynchronous call
  # use invocation_type = 'RequestResponse' to make a synchronous call
  response = @@client.invoke({
    function_name: function_name,
    invocation_type: invocation_type,
    log_type: 'Tail',
    payload: parsed_payload
  })
  return if invocation_type == 'Event'
  JSON.parse(response.payload.string)
end