Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Scope each request independently #559

Merged
merged 2 commits into from
Aug 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions packages/core/__tests__/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,24 +144,26 @@ describe('🛵 Middy test suite', () => {
return callback(null, { foo: 'bar' })
})

const executedBefore = []
const executedAfter = []
const m1 = () => ({
before: (handler, next) => {
handler.executedBefore = ['m1']
executedBefore.push('m1')
next()
},
after: (handler, next) => {
handler.executedAfter.push('m1')
executedAfter.push('m1')
next()
}
})

const m2 = () => ({
before: (handler, next) => {
handler.executedBefore.push('m2')
executedBefore.push('m2')
next()
},
after: (handler, next) => {
handler.executedAfter = ['m2']
executedAfter.push('m2')
next()
}
})
Expand All @@ -172,15 +174,17 @@ describe('🛵 Middy test suite', () => {

// executes the handler
handler({}, {}, (_, response) => {
expect(handler.executedBefore).toEqual(['m1', 'm2'])
expect(handler.executedAfter).toEqual(['m2', 'm1'])
expect(executedBefore).toEqual(['m1', 'm2'])
expect(executedAfter).toEqual(['m2', 'm1'])
expect(response).toEqual({ foo: 'bar' })
endTest()
})
})

test('"before" middlewares should be able to change event', (endTest) => {
let handlerEvent
const handler = middy((event, context, callback) => {
handlerEvent = event
return callback(null, { foo: 'bar' })
})

Expand All @@ -192,7 +196,7 @@ describe('🛵 Middy test suite', () => {
handler.before(changeEventMiddleware)

handler({}, {}, () => {
expect(handler.event.modified).toBe(true)
expect(handlerEvent.modified).toBe(true)
endTest()
})
})
Expand Down Expand Up @@ -230,8 +234,9 @@ describe('🛵 Middy test suite', () => {

handler.after(changeResponseMiddleware)

handler({}, {}, () => {
expect(handler.response.modified).toBe(true)
handler({}, {}, (err, response) => {
expect(err).toBeNull()
expect(response.modified).toBe(true)
endTest()
})
})
Expand Down Expand Up @@ -625,13 +630,8 @@ describe('🛵 Middy test suite', () => {
})

test('It should handle async middlewares', (endTest) => {
const asyncBefore = async (handler) => {
handler.event.asyncBefore = true
}

const asyncAfter = async (handler) => {
handler.event.asyncAfter = true
}
const asyncBefore = jest.fn(async () => {})
const asyncAfter = jest.fn(async () => {})

const handler = middy((event, context, callback) => {
return callback(null, { some: 'response' })
Expand All @@ -643,8 +643,8 @@ describe('🛵 Middy test suite', () => {

handler({}, {}, (err, response) => {
expect(err).toBeNull()
expect(handler.event.asyncBefore).toBeTruthy()
expect(handler.event.asyncAfter).toBeTruthy()
expect(asyncBefore).toHaveBeenCalled()
expect(asyncAfter).toHaveBeenCalled()
endTest()
})
})
Expand Down
45 changes: 23 additions & 22 deletions packages/core/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ const once = require('once')
* @property {middlewareFunction} onError - the middleware function to attach as *error* middleware
*/

const runMiddlewares = (middlewares, instance, done) => {
const runMiddlewares = (middlewares, request, done) => {
const stack = Array.from(middlewares)
const runNext = (err) => {
try {
Expand All @@ -75,7 +75,7 @@ const runMiddlewares = (middlewares, instance, done) => {
const nextMiddleware = stack.shift()

if (nextMiddleware) {
const retVal = nextMiddleware(instance, runNext)
const retVal = nextMiddleware(request, runNext)

if (retVal) {
if (!isPromise(retVal)) {
Expand All @@ -99,19 +99,19 @@ const runMiddlewares = (middlewares, instance, done) => {
runNext()
}

const runErrorMiddlewares = (middlewares, instance, done) => {
const runErrorMiddlewares = (middlewares, request, done) => {
const stack = Array.from(middlewares)
instance.__handledError = false
request.__handledError = false
const runNext = (err) => {
try {
if (!err) {
instance.__handledError = true
request.__handledError = true
}

const nextMiddleware = stack.shift()

if (nextMiddleware) {
const retVal = nextMiddleware(instance, runNext)
const retVal = nextMiddleware(request, runNext)

if (retVal) {
if (!isPromise(retVal)) {
Expand All @@ -129,13 +129,13 @@ const runErrorMiddlewares = (middlewares, instance, done) => {
return
}

return done(instance.__handledError ? null : err)
return done(request.__handledError ? null : err)
} catch (err) {
return done(err)
}
}

runNext(instance.error)
runNext(request.error)
}

/**
Expand All @@ -149,44 +149,45 @@ const middy = (handler) => {
const errorMiddlewares = []

const instance = (event, context, callback) => {
instance.event = event
instance.context = context
instance.callback = callback
instance.response = null
instance.error = null
const request = {}
request.event = event
request.context = context
request.callback = callback
request.response = null
request.error = null

const middyPromise = new Promise((resolve, reject) => {
const terminate = (err) => {
if (err) {
return callback ? callback(err) : reject(err)
}

return callback ? callback(null, instance.response) : resolve(instance.response)
return callback ? callback(null, request.response) : resolve(request.response)
}

const errorHandler = err => {
instance.error = err
return runErrorMiddlewares(errorMiddlewares, instance, terminate)
request.error = err
return runErrorMiddlewares(errorMiddlewares, request, terminate)
}

runMiddlewares(beforeMiddlewares, instance, (err) => {
runMiddlewares(beforeMiddlewares, request, (err) => {
if (err) return errorHandler(err)

const onHandlerError = once((err) => {
instance.response = null
request.response = null
errorHandler(err)
})

const onHandlerSuccess = once((response) => {
instance.response = response
runMiddlewares(afterMiddlewares, instance, (err) => {
request.response = response
runMiddlewares(afterMiddlewares, request, (err) => {
if (err) return errorHandler(err)

terminate()
})
})

const handlerReturnValue = handler.call(instance, instance.event, instance.context, (err, response) => {
const handlerReturnValue = handler.call(request, request.event, request.context, (err, response) => {
if (err) return onHandlerError(err)
onHandlerSuccess(response)
})
Expand All @@ -203,7 +204,7 @@ const middy = (handler) => {
}
})
})
if (!instance.callback) return middyPromise
if (!request.callback) return middyPromise
}

instance.use = (middlewares) => {
Expand Down