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

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 (2) hide show
  1. package/index.js +168 -169
  2. package/package.json +2 -2
package/index.js CHANGED
@@ -1,250 +1,249 @@
1
- const defaultLambdaHandler = () => {}
1
+ const defaultLambdaHandler = () => {};
2
+
2
3
  const defaultPlugin = {
3
4
  timeoutEarlyInMillis: 5,
4
- timeoutEarlyResponse: () => { throw new Error('Timeout') }
5
- }
5
+ timeoutEarlyResponse: () => {
6
+ throw new Error('Timeout');
7
+ }
8
+ };
6
9
 
7
10
  const middy = (lambdaHandler = defaultLambdaHandler, plugin = {}) => {
8
- // Allow base handler to be set using .handler()
11
+ var _plugin$beforePrefetc, _plugin;
12
+
9
13
  if (typeof lambdaHandler !== 'function') {
10
- plugin = lambdaHandler
11
- lambdaHandler = defaultLambdaHandler
14
+ plugin = lambdaHandler;
15
+ lambdaHandler = defaultLambdaHandler;
12
16
  }
13
- plugin = { ...defaultPlugin, ...plugin }
14
- plugin.timeoutEarly = plugin.timeoutEarlyInMillis > 0
15
17
 
16
- plugin.beforePrefetch?.()
17
- const beforeMiddlewares = []
18
- const afterMiddlewares = []
19
- const onErrorMiddlewares = []
18
+ plugin = { ...defaultPlugin,
19
+ ...plugin
20
+ };
21
+ plugin.timeoutEarly = plugin.timeoutEarlyInMillis > 0;
22
+ (_plugin$beforePrefetc = (_plugin = plugin).beforePrefetch) === null || _plugin$beforePrefetc === void 0 ? void 0 : _plugin$beforePrefetc.call(_plugin);
23
+ const beforeMiddlewares = [];
24
+ const afterMiddlewares = [];
25
+ const onErrorMiddlewares = [];
20
26
 
21
27
  const middy = (event = {}, context = {}) => {
22
- plugin.requestStart?.()
28
+ var _plugin$requestStart, _plugin2;
29
+
30
+ (_plugin$requestStart = (_plugin2 = plugin).requestStart) === null || _plugin$requestStart === void 0 ? void 0 : _plugin$requestStart.call(_plugin2);
23
31
  const request = {
24
32
  event,
25
33
  context,
26
34
  response: undefined,
27
35
  error: undefined,
28
36
  internal: plugin.internal ?? {}
29
- }
37
+ };
38
+ return runRequest(request, [...beforeMiddlewares], lambdaHandler, [...afterMiddlewares], [...onErrorMiddlewares], plugin);
39
+ };
30
40
 
31
- return runRequest(
32
- request,
33
- [...beforeMiddlewares],
34
- lambdaHandler,
35
- [...afterMiddlewares],
36
- [...onErrorMiddlewares],
37
- plugin
38
- )
39
- }
40
-
41
- middy.use = (middlewares) => {
41
+ middy.use = middlewares => {
42
42
  if (!Array.isArray(middlewares)) {
43
- middlewares = [middlewares]
43
+ middlewares = [middlewares];
44
44
  }
45
+
45
46
  for (const middleware of middlewares) {
46
- const { before, after, onError } = middleware
47
+ const {
48
+ before,
49
+ after,
50
+ onError
51
+ } = middleware;
47
52
 
48
53
  if (!before && !after && !onError) {
49
- throw new Error(
50
- 'Middleware must be an object containing at least one key among "before", "after", "onError"'
51
- )
54
+ throw new Error('Middleware must be an object containing at least one key among "before", "after", "onError"');
52
55
  }
53
56
 
54
- if (before) middy.before(before)
55
- if (after) middy.after(after)
56
- if (onError) middy.onError(onError)
57
+ if (before) middy.before(before);
58
+ if (after) middy.after(after);
59
+ if (onError) middy.onError(onError);
57
60
  }
58
- return middy
59
- }
60
61
 
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
- }
62
+ return middy;
63
+ };
64
+
65
+ middy.before = beforeMiddleware => {
66
+ beforeMiddlewares.push(beforeMiddleware);
67
+ return middy;
68
+ };
69
+
70
+ middy.after = afterMiddleware => {
71
+ afterMiddlewares.unshift(afterMiddleware);
72
+ return middy;
73
+ };
74
+
75
+ middy.onError = onErrorMiddleware => {
76
+ onErrorMiddlewares.unshift(onErrorMiddleware);
77
+ return middy;
78
+ };
79
+
80
+ middy.handler = replaceLambdaHandler => {
81
+ lambdaHandler = replaceLambdaHandler;
82
+ };
83
+
84
+ return middy;
85
+ };
86
+
87
+ const runRequest = async (request, beforeMiddlewares, lambdaHandler, afterMiddlewares, onErrorMiddlewares, plugin) => {
88
+ const {
89
+ timeoutEarly
90
+ } = plugin;
77
91
 
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
92
  try {
91
- await runMiddlewares(request, beforeMiddlewares, plugin)
92
- // Check if before stack hasn't exit early
93
+ await runMiddlewares(request, beforeMiddlewares, plugin);
94
+
93
95
  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)
96
+ var _plugin$beforeHandler, _plugin$afterHandler;
97
+
98
+ (_plugin$beforeHandler = plugin.beforeHandler) === null || _plugin$beforeHandler === void 0 ? void 0 : _plugin$beforeHandler.call(plugin);
99
+ const handlerAbort = new AbortController();
100
+ let timeoutAbort;
101
+ if (timeoutEarly) timeoutAbort = new AbortController();
102
+ request.response = await Promise.race([lambdaHandler(request.event, request.context, {
103
+ signal: handlerAbort.signal
104
+ }), timeoutEarly ? setTimeoutPromise(request.context.getRemainingTimeInMillis() - plugin.timeoutEarlyInMillis, {
105
+ signal: timeoutAbort.signal
106
+ }).then(() => {
107
+ handlerAbort.abort();
108
+ return plugin.timeoutEarlyResponse();
109
+ }) : Promise.race([])]);
110
+ if (timeoutEarly) timeoutAbort.abort();
111
+ (_plugin$afterHandler = plugin.afterHandler) === null || _plugin$afterHandler === void 0 ? void 0 : _plugin$afterHandler.call(plugin);
112
+ await runMiddlewares(request, afterMiddlewares, plugin);
113
113
  }
114
114
  } catch (e) {
115
- // Reset response changes made by after stack before error thrown
116
- request.response = undefined
117
- request.error = e
115
+ request.response = undefined;
116
+ request.error = e;
117
+
118
118
  try {
119
- await runMiddlewares(request, onErrorMiddlewares, plugin)
119
+ await runMiddlewares(request, onErrorMiddlewares, plugin);
120
120
  } catch (e) {
121
- // Save error that wasn't handled
122
- e.originalError = request.error
123
- request.error = e
124
-
125
- throw request.error
121
+ e.originalError = request.error;
122
+ request.error = e;
123
+ throw request.error;
126
124
  }
127
- // Catch if onError stack hasn't handled the error
128
- if (request.response === undefined) throw request.error
125
+
126
+ if (request.response === undefined) throw request.error;
129
127
  } finally {
130
- await plugin.requestEnd?.(request)
128
+ var _plugin$requestEnd;
129
+
130
+ await ((_plugin$requestEnd = plugin.requestEnd) === null || _plugin$requestEnd === void 0 ? void 0 : _plugin$requestEnd.call(plugin, request));
131
131
  }
132
132
 
133
- return request.response
134
- }
133
+ return request.response;
134
+ };
135
135
 
136
136
  const runMiddlewares = async (request, middlewares, plugin) => {
137
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
138
+ var _plugin$beforeMiddlew, _plugin$afterMiddlewa;
139
+
140
+ (_plugin$beforeMiddlew = plugin.beforeMiddleware) === null || _plugin$beforeMiddlew === void 0 ? void 0 : _plugin$beforeMiddlew.call(plugin, nextMiddleware.name);
141
+ const res = await nextMiddleware(request);
142
+ (_plugin$afterMiddlewa = plugin.afterMiddleware) === null || _plugin$afterMiddlewa === void 0 ? void 0 : _plugin$afterMiddlewa.call(plugin, nextMiddleware.name);
143
+
142
144
  if (res !== undefined) {
143
- request.response = res
144
- return
145
+ request.response = res;
146
+ return;
145
147
  }
146
148
  }
147
- }
148
-
149
- // Start Polyfill (Nodejs v14)
150
- /*
151
- MIT License
152
-
153
- Copyright (c) 2019 Steve Faulkner
149
+ };
154
150
 
155
- node-abort-controller
156
- */
157
151
  const polyfillAbortController = async () => {
158
152
  if (process.version < 'v15.0.0') {
159
- const events = await import('events')
160
- const { EventEmitter } = events
153
+ const events = await import('events');
154
+ const {
155
+ EventEmitter
156
+ } = events;
161
157
 
162
158
  class AbortSignal {
163
- constructor () {
164
- this.eventEmitter = new EventEmitter()
165
- this.onabort = null
166
- this.aborted = false
159
+ constructor() {
160
+ this.eventEmitter = new EventEmitter();
161
+ this.onabort = null;
162
+ this.aborted = false;
167
163
  }
168
164
 
169
- toString () {
170
- return '[object AbortSignal]'
165
+ toString() {
166
+ return '[object AbortSignal]';
171
167
  }
172
168
 
173
- get [Symbol.toStringTag] () {
174
- return 'AbortSignal'
169
+ get [Symbol.toStringTag]() {
170
+ return 'AbortSignal';
175
171
  }
176
172
 
177
- removeEventListener (name, handler) {
178
- this.eventEmitter.removeListener(name, handler)
173
+ removeEventListener(name, handler) {
174
+ this.eventEmitter.removeListener(name, handler);
179
175
  }
180
176
 
181
- addEventListener (name, handler) {
182
- this.eventEmitter.on(name, handler)
177
+ addEventListener(name, handler) {
178
+ this.eventEmitter.on(name, handler);
183
179
  }
184
180
 
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)
181
+ dispatchEvent(type) {
182
+ const event = {
183
+ type,
184
+ target: this
185
+ };
186
+ const handlerName = `on${type}`;
187
+ if (typeof this[handlerName] === 'function') this[handlerName](event);
188
+ this.eventEmitter.emit(type, event);
192
189
  }
190
+
193
191
  }
194
192
 
195
193
  return class AbortController {
196
- constructor () {
197
- this.signal = new AbortSignal()
194
+ constructor() {
195
+ this.signal = new AbortSignal();
198
196
  }
199
197
 
200
- abort () {
201
- if (this.signal.aborted) return
202
-
203
- this.signal.aborted = true
204
- this.signal.dispatchEvent('abort')
198
+ abort() {
199
+ if (this.signal.aborted) return;
200
+ this.signal.aborted = true;
201
+ this.signal.dispatchEvent('abort');
205
202
  }
206
203
 
207
- toString () {
208
- return '[object AbortController]'
204
+ toString() {
205
+ return '[object AbortController]';
209
206
  }
210
207
 
211
- get [Symbol.toStringTag] () {
212
- return 'AbortController'
208
+ get [Symbol.toStringTag]() {
209
+ return 'AbortController';
213
210
  }
214
- }
211
+
212
+ };
215
213
  } else {
216
- return AbortController
214
+ return AbortController;
217
215
  }
218
- }
219
- global.AbortController = await polyfillAbortController()
216
+ };
220
217
 
221
- const polyfillSetTimeoutPromise = async () => {
218
+ global.AbortController = await polyfillAbortController();
222
219
 
220
+ const polyfillSetTimeoutPromise = async () => {
223
221
  if (process.version < 'v15.0.0') {
224
- return (ms, { signal }) => {
222
+ return (ms, {
223
+ signal
224
+ }) => {
225
225
  if (signal.aborted) {
226
- return Promise.reject(new Error('Aborted', 'AbortError'))
226
+ return Promise.reject(new Error('Aborted', 'AbortError'));
227
227
  }
228
+
228
229
  return new Promise((resolve, reject) => {
229
230
  const abortHandler = () => {
230
- clearTimeout(timeout)
231
- reject(new Error('Aborted', 'AbortError'))
232
- }
233
- // start async operation
231
+ clearTimeout(timeout);
232
+ reject(new Error('Aborted', 'AbortError'));
233
+ };
234
+
234
235
  const timeout = setTimeout(() => {
235
- resolve()
236
- signal.removeEventListener('abort', abortHandler)
237
- }, ms)
238
- signal.addEventListener('abort', abortHandler)
239
- })
240
- }
236
+ resolve();
237
+ signal.removeEventListener('abort', abortHandler);
238
+ }, ms);
239
+ signal.addEventListener('abort', abortHandler);
240
+ });
241
+ };
241
242
  } else {
242
- const timers = await import('timers/promises')
243
- return timers.setTimeout
243
+ const timers = await import('timers/promises');
244
+ return timers.setTimeout;
244
245
  }
245
- }
246
- global.setTimeoutPromise = await polyfillSetTimeoutPromise()
247
- // import { setTimeout as setTimeoutPromise } from 'timers/promises'
248
- // End Polyfill
246
+ };
249
247
 
250
- export default middy
248
+ global.setTimeoutPromise = await polyfillSetTimeoutPromise();
249
+ export default middy;
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.4",
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": "d4bea7f4e21f6a9bbb1f6f6908361169598b9e53"
51
51
  }