Internal Context

Middy is built to be async even at it’s core. Middlewares can set promises to internal. This approach allows them to be resolved together just when you need them.

import middy from '@middy/core'
import {getInternal} from '@middy/util'

const lambdaHandler = async (event, context, { signal }) => {

}

const config = {
  internal: new Proxy({}, {
    get: (target, prop, receiver) => {
      // ...
      return Reflect.get(...arguments)
    },
    set: (obj, prop, value) => {
      // ... ie if `prop` changes, trigger something
      obj[prop] = value
      return true
    }
  })
}

export const handler = middy(config)
  // Incase you want to add values on to internal directly
  .before((async (request) => {
    request.internal = {
      env: process.env.NODE_ENV
    }
  }))
  .use(sts(...))
  .use(ssm(...))
  .use(rdsSigner(...))
  .use(secretsManager(...))
  .before(async (request) => {
    // internal == { key: 'value' }

    // Map with same name
    Object.assign(request.context, await getInternal(['key'], request))
    // -> context == { key: 'value'}

    // Map to new name
    Object.assign(request.context, await getInternal({'newKey':'key'}, request))
    // -> context == { newKey: 'value'}

    // get all the values, only if you really need to,
    // but you should only request what you need for the handler
    Object.assign(request.context, await getInternal(true, request))
    // -> context == { key: 'value'}
  })
  .handler(lambdaHandler)