@middy/core 3.0.0-alpha.3 → 3.0.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +23 -13
  2. package/index.d.ts +1 -1
  3. package/index.js +2 -249
  4. package/package.json +2 -2
package/README.md CHANGED
@@ -1,26 +1,36 @@
1
- # Middy Core
2
-
3
- <div align="center">
4
- <img alt="Middy logo" src="https://raw.githubusercontent.com/middyjs/middy/main/docs/img/middy-logo.png"/>
5
- </div>
6
-
7
1
  <div align="center">
2
+ <h1>Middy Core</h1>
3
+ <img alt="Middy logo" src="https://raw.githubusercontent.com/middyjs/middy/main/docs/img/middy-logo.svg"/>
8
4
  <p><strong>Core component of the middy framework, the stylish Node.js middleware engine for AWS Lambda</strong></p>
9
- </div>
10
-
11
- <div align="center">
12
5
  <p>
13
- <a href="http://badge.fury.io/js/%40middy%2Fcore">
6
+ <a href="https://www.npmjs.com/package/@middy/core?activeTab=versions">
14
7
  <img src="https://badge.fury.io/js/%40middy%2Fcore.svg" alt="npm version" style="max-width:100%;">
15
8
  </a>
9
+ <a href="https://packagephobia.com/result?p=@middy/core">
10
+ <img src="https://packagephobia.com/badge?p=@middy/core" alt="npm install size" style="max-width:100%;">
11
+ </a>
12
+ <a href="https://github.com/middyjs/middy/actions">
13
+ <img src="https://github.com/middyjs/middy/workflows/Tests/badge.svg" alt="GitHub Actions test status badge" style="max-width:100%;">
14
+ </a>
15
+ <br/>
16
+ <a href="https://standardjs.com/">
17
+ <img src="https://img.shields.io/badge/code_style-standard-brightgreen.svg" alt="Standard Code Style" style="max-width:100%;">
18
+ </a>
16
19
  <a href="https://snyk.io/test/github/middyjs/middy">
17
20
  <img src="https://snyk.io/test/github/middyjs/middy/badge.svg" alt="Known Vulnerabilities" data-canonical-src="https://snyk.io/test/github/middyjs/middy" style="max-width:100%;">
18
21
  </a>
19
- <a href="https://standardjs.com/">
20
- <img src="https://img.shields.io/badge/code_style-standard-brightgreen.svg" alt="Standard Code Style" style="max-width:100%;">
22
+ <a href="https://lgtm.com/projects/g/middyjs/middy/context:javascript">
23
+ <img src="https://img.shields.io/lgtm/grade/javascript/g/middyjs/middy.svg?logo=lgtm&logoWidth=18" alt="Language grade: JavaScript" style="max-width:100%;">
24
+ </a>
25
+ <a href="https://bestpractices.coreinfrastructure.org/projects/5280">
26
+ <img src="https://bestpractices.coreinfrastructure.org/projects/5280/badge" alt="Core Infrastructure Initiative (CII) Best Practices" style="max-width:100%;">
21
27
  </a>
28
+ <br/>
22
29
  <a href="https://gitter.im/middyjs/Lobby">
23
- <img src="https://badges.gitter.im/gitterHQ/gitter.svg" alt="Chat on Gitter" style="max-width:100%;">
30
+ <img src="https://badges.gitter.im/gitterHQ/gitter.svg" alt="Chat on Gitter" style="max-width:100%;">
31
+ </a>
32
+ <a href="https://stackoverflow.com/questions/tagged/middy?sort=Newest&uqlId=35052">
33
+ <img src="https://img.shields.io/badge/StackOverflow-[middy]-yellow" alt="Ask questions on StackOverflow" style="max-width:100%;">
24
34
  </a>
25
35
  </p>
26
36
  </div>
package/index.d.ts CHANGED
@@ -42,7 +42,7 @@ export interface MiddlewareObj<TEvent = any, TResult = any, TErr = Error, TConte
42
42
  // The AWS provided Handler type uses void | Promise<TResult> so we have no choice but to follow and suppress the linter warning
43
43
  // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
44
44
  type MiddyInputHandler<TEvent, TResult, TContext extends LambdaContext = LambdaContext> = (event: TEvent, context: TContext, callback: LambdaCallback<TResult>) => void | Promise<TResult>
45
- type MiddyInputPromiseHandler<TEvent, TResult, TContext extends LambdaContext = LambdaContext> = ( event: TEvent, context: TContext, ) => Promise<TResult>;
45
+ type MiddyInputPromiseHandler<TEvent, TResult, TContext extends LambdaContext = LambdaContext> = (event: TEvent, context: TContext,) => Promise<TResult>
46
46
 
47
47
  export interface MiddyfiedHandler<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext> extends MiddyInputHandler<TEvent, TResult, TContext>,
48
48
  MiddyInputPromiseHandler<TEvent, TResult, TContext> {
package/index.js CHANGED
@@ -1,250 +1,3 @@
1
- const defaultLambdaHandler = () => {}
2
- const defaultPlugin = {
3
- timeoutEarlyInMillis: 5,
4
- timeoutEarlyResponse: () => { throw new Error('Timeout') }
5
- }
1
+ import{EventEmitter}from'events';const defaultLambdaHandler=()=>{};const defaultPlugin={timeoutEarlyInMillis:5,timeoutEarlyResponse:()=>{throw new Error('Timeout')}};const middy=(lambdaHandler=defaultLambdaHandler,plugin={})=>{if(typeof lambdaHandler!=='function'){plugin=lambdaHandler;lambdaHandler=defaultLambdaHandler}plugin={...defaultPlugin,...plugin};plugin.timeoutEarly=plugin.timeoutEarlyInMillis>0;plugin.beforePrefetch?.();const beforeMiddlewares=[];const afterMiddlewares=[];const onErrorMiddlewares=[];const middy1=(event={},context={})=>{plugin.requestStart?.();const request={event,context,response:undefined,error:undefined,internal:plugin.internal??{}};return runRequest(request,[...beforeMiddlewares],lambdaHandler,[...afterMiddlewares],[...onErrorMiddlewares],plugin)};middy1.use=middlewares=>{if(!Array.isArray(middlewares)){middlewares=[middlewares]}for(const middleware of middlewares){const{before,after,onError}=middleware;if(!before&&!after&&!onError){throw new Error('Middleware must be an object containing at least one key among "before", "after", "onError"')}if(before)middy1.before(before);if(after)middy1.after(after);if(onError)middy1.onError(onError)}return middy1};middy1.before=beforeMiddleware=>{beforeMiddlewares.push(beforeMiddleware);return middy1};middy1.after=afterMiddleware=>{afterMiddlewares.unshift(afterMiddleware);return middy1};middy1.onError=onErrorMiddleware=>{onErrorMiddlewares.unshift(onErrorMiddleware);return middy1};middy1.handler=replaceLambdaHandler=>{lambdaHandler=replaceLambdaHandler;return middy1};return middy1};const runRequest=async(request,beforeMiddlewares,lambdaHandler,afterMiddlewares,onErrorMiddlewares,plugin)=>{const timeoutEarly=plugin.timeoutEarly&&request.context.getRemainingTimeInMillis;try{await runMiddlewares(request,beforeMiddlewares,plugin);if(request.response===undefined){plugin.beforeHandler?.();const handlerAbort=new AbortController();let timeoutAbort;if(timeoutEarly)timeoutAbort=new AbortController();request.response=await Promise.race([lambdaHandler(request.event,request.context,{signal:handlerAbort.signal}),timeoutEarly?setTimeoutPromise(request.context.getRemainingTimeInMillis()-plugin.timeoutEarlyInMillis,{signal:timeoutAbort.signal}).then(()=>{handlerAbort.abort();return plugin.timeoutEarlyResponse()}):Promise.race([])]);if(timeoutEarly)timeoutAbort.abort();plugin.afterHandler?.();await runMiddlewares(request,afterMiddlewares,plugin)}}catch(e){request.response=undefined;request.error=e;try{await runMiddlewares(request,onErrorMiddlewares,plugin)}catch(e){e.originalError=request.error;request.error=e;throw request.error}if(request.response===undefined)throw request.error}finally{await plugin.requestEnd?.(request)}return request.response};const runMiddlewares=async(request,middlewares,plugin)=>{for(const nextMiddleware of middlewares){plugin.beforeMiddleware?.(nextMiddleware.name);const res=await nextMiddleware(request);plugin.afterMiddleware?.(nextMiddleware.name);if(res!==undefined){request.response=res;return}}};const polyfillAbortController=()=>{if(process.version<'v15.0.0'){var tmp=Symbol.toStringTag;class AbortSignal{toString(){return'[object AbortSignal]'}get[tmp](){return'AbortSignal'}removeEventListener(name,handler){this.eventEmitter.removeListener(name,handler)}addEventListener(name,handler){this.eventEmitter.on(name,handler)}dispatchEvent(type){const event={type,target:this};const handlerName=`on${type}`;if(typeof this[handlerName]==='function')this[handlerName](event);this.eventEmitter.emit(type,event)}constructor(){this.eventEmitter=new EventEmitter();this.onabort=null;this.aborted=false}}return(function(){var tmp=Symbol.toStringTag;class AbortController{abort(){if(this.signal.aborted)return;this.signal.aborted=true;this.signal.dispatchEvent('abort')}toString(){return'[object AbortController]'}get[tmp](){return'AbortController'}constructor(){this.signal=new AbortSignal()}}return AbortController})()}else{return AbortController}};global.AbortController=polyfillAbortController();const polyfillSetTimeoutPromise=()=>{return(ms,{signal})=>{if(signal.aborted){return Promise.reject(new Error('Aborted','AbortError'))}return new Promise((resolve,reject)=>{const abortHandler=()=>{clearTimeout(timeout);reject(new Error('Aborted','AbortError'))};const timeout=setTimeout(()=>{resolve();signal.removeEventListener('abort',abortHandler)},ms);signal.addEventListener('abort',abortHandler)})}};const setTimeoutPromise=polyfillSetTimeoutPromise();export default middy
6
2
 
7
- const middy = (lambdaHandler = defaultLambdaHandler, plugin = {}) => {
8
- // Allow base handler to be set using .handler()
9
- if (typeof lambdaHandler !== 'function') {
10
- plugin = lambdaHandler
11
- lambdaHandler = defaultLambdaHandler
12
- }
13
- plugin = { ...defaultPlugin, ...plugin }
14
- plugin.timeoutEarly = plugin.timeoutEarlyInMillis > 0
15
-
16
- plugin.beforePrefetch?.()
17
- const beforeMiddlewares = []
18
- const afterMiddlewares = []
19
- const onErrorMiddlewares = []
20
-
21
- const middy = (event = {}, context = {}) => {
22
- plugin.requestStart?.()
23
- const request = {
24
- event,
25
- context,
26
- response: undefined,
27
- error: undefined,
28
- internal: plugin.internal ?? {}
29
- }
30
-
31
- return runRequest(
32
- request,
33
- [...beforeMiddlewares],
34
- lambdaHandler,
35
- [...afterMiddlewares],
36
- [...onErrorMiddlewares],
37
- plugin
38
- )
39
- }
40
-
41
- middy.use = (middlewares) => {
42
- if (!Array.isArray(middlewares)) {
43
- middlewares = [middlewares]
44
- }
45
- for (const middleware of middlewares) {
46
- const { before, after, onError } = middleware
47
-
48
- if (!before && !after && !onError) {
49
- throw new Error(
50
- 'Middleware must be an object containing at least one key among "before", "after", "onError"'
51
- )
52
- }
53
-
54
- if (before) middy.before(before)
55
- if (after) middy.after(after)
56
- if (onError) middy.onError(onError)
57
- }
58
- return middy
59
- }
60
-
61
- // Inline Middlewares
62
- middy.before = (beforeMiddleware) => {
63
- beforeMiddlewares.push(beforeMiddleware)
64
- return middy
65
- }
66
- middy.after = (afterMiddleware) => {
67
- afterMiddlewares.unshift(afterMiddleware)
68
- return middy
69
- }
70
- middy.onError = (onErrorMiddleware) => {
71
- onErrorMiddlewares.unshift(onErrorMiddleware)
72
- return middy
73
- }
74
- middy.handler = (replaceLambdaHandler) => {
75
- lambdaHandler = replaceLambdaHandler
76
- }
77
-
78
- return middy
79
- }
80
-
81
- const runRequest = async (
82
- request,
83
- beforeMiddlewares,
84
- lambdaHandler,
85
- afterMiddlewares,
86
- onErrorMiddlewares,
87
- plugin
88
- ) => {
89
- const { timeoutEarly } = plugin
90
- try {
91
- await runMiddlewares(request, beforeMiddlewares, plugin)
92
- // Check if before stack hasn't exit early
93
- if (request.response === undefined) {
94
- plugin.beforeHandler?.()
95
-
96
- const handlerAbort = new AbortController()
97
- let timeoutAbort
98
- if (timeoutEarly) timeoutAbort = new AbortController()
99
- request.response = await Promise.race([
100
- lambdaHandler(request.event, request.context, { signal: handlerAbort.signal }),
101
- timeoutEarly
102
- ? setTimeoutPromise(request.context.getRemainingTimeInMillis() - plugin.timeoutEarlyInMillis, { signal: timeoutAbort.signal })
103
- .then(() => {
104
- handlerAbort.abort()
105
- return plugin.timeoutEarlyResponse()
106
- })
107
- : Promise.race([])
108
- ])
109
- if (timeoutEarly) timeoutAbort.abort() // lambdaHandler may not be a promise
110
-
111
- plugin.afterHandler?.()
112
- await runMiddlewares(request, afterMiddlewares, plugin)
113
- }
114
- } catch (e) {
115
- // Reset response changes made by after stack before error thrown
116
- request.response = undefined
117
- request.error = e
118
- try {
119
- await runMiddlewares(request, onErrorMiddlewares, plugin)
120
- } catch (e) {
121
- // Save error that wasn't handled
122
- e.originalError = request.error
123
- request.error = e
124
-
125
- throw request.error
126
- }
127
- // Catch if onError stack hasn't handled the error
128
- if (request.response === undefined) throw request.error
129
- } finally {
130
- await plugin.requestEnd?.(request)
131
- }
132
-
133
- return request.response
134
- }
135
-
136
- const runMiddlewares = async (request, middlewares, plugin) => {
137
- for (const nextMiddleware of middlewares) {
138
- plugin.beforeMiddleware?.(nextMiddleware.name)
139
- const res = await nextMiddleware(request)
140
- plugin.afterMiddleware?.(nextMiddleware.name)
141
- // short circuit chaining and respond early
142
- if (res !== undefined) {
143
- request.response = res
144
- return
145
- }
146
- }
147
- }
148
-
149
- // Start Polyfill (Nodejs v14)
150
- /*
151
- MIT License
152
-
153
- Copyright (c) 2019 Steve Faulkner
154
-
155
- node-abort-controller
156
- */
157
- const polyfillAbortController = async () => {
158
- if (process.version < 'v15.0.0') {
159
- const events = await import('events')
160
- const { EventEmitter } = events
161
-
162
- class AbortSignal {
163
- constructor () {
164
- this.eventEmitter = new EventEmitter()
165
- this.onabort = null
166
- this.aborted = false
167
- }
168
-
169
- toString () {
170
- return '[object AbortSignal]'
171
- }
172
-
173
- get [Symbol.toStringTag] () {
174
- return 'AbortSignal'
175
- }
176
-
177
- removeEventListener (name, handler) {
178
- this.eventEmitter.removeListener(name, handler)
179
- }
180
-
181
- addEventListener (name, handler) {
182
- this.eventEmitter.on(name, handler)
183
- }
184
-
185
- dispatchEvent (type) {
186
- const event = { type, target: this }
187
- const handlerName = `on${type}`
188
-
189
- if (typeof this[handlerName] === 'function') this[handlerName](event)
190
-
191
- this.eventEmitter.emit(type, event)
192
- }
193
- }
194
-
195
- return class AbortController {
196
- constructor () {
197
- this.signal = new AbortSignal()
198
- }
199
-
200
- abort () {
201
- if (this.signal.aborted) return
202
-
203
- this.signal.aborted = true
204
- this.signal.dispatchEvent('abort')
205
- }
206
-
207
- toString () {
208
- return '[object AbortController]'
209
- }
210
-
211
- get [Symbol.toStringTag] () {
212
- return 'AbortController'
213
- }
214
- }
215
- } else {
216
- return AbortController
217
- }
218
- }
219
- global.AbortController = await polyfillAbortController()
220
-
221
- const polyfillSetTimeoutPromise = async () => {
222
-
223
- if (process.version < 'v15.0.0') {
224
- return (ms, { signal }) => {
225
- if (signal.aborted) {
226
- return Promise.reject(new Error('Aborted', 'AbortError'))
227
- }
228
- return new Promise((resolve, reject) => {
229
- const abortHandler = () => {
230
- clearTimeout(timeout)
231
- reject(new Error('Aborted', 'AbortError'))
232
- }
233
- // start async operation
234
- const timeout = setTimeout(() => {
235
- resolve()
236
- signal.removeEventListener('abort', abortHandler)
237
- }, ms)
238
- signal.addEventListener('abort', abortHandler)
239
- })
240
- }
241
- } else {
242
- const timers = await import('timers/promises')
243
- return timers.setTimeout
244
- }
245
- }
246
- global.setTimeoutPromise = await polyfillSetTimeoutPromise()
247
- // import { setTimeout as setTimeoutPromise } from 'timers/promises'
248
- // End Polyfill
249
-
250
- export default middy
3
+ //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@middy/core",
3
- "version": "3.0.0-alpha.3",
3
+ "version": "3.0.0-alpha.7",
4
4
  "description": "🛵 The stylish Node.js middleware engine for AWS Lambda (core package)",
5
5
  "type": "module",
6
6
  "engines": {
@@ -47,5 +47,5 @@
47
47
  "@types/aws-lambda": "^8.10.76",
48
48
  "@types/node": "^17.0.0"
49
49
  },
50
- "gitHead": "1441158711580313765e6d156046ef0fade0d156"
50
+ "gitHead": "5cef39ebe49c201f97d71bb0680004de4b82cb91"
51
51
  }