@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.
- package/index.js +168 -169
- 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: () => {
|
|
5
|
-
|
|
5
|
+
timeoutEarlyResponse: () => {
|
|
6
|
+
throw new Error('Timeout');
|
|
7
|
+
}
|
|
8
|
+
};
|
|
6
9
|
|
|
7
10
|
const middy = (lambdaHandler = defaultLambdaHandler, plugin = {}) => {
|
|
8
|
-
|
|
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
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
middy.
|
|
75
|
-
|
|
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
|
-
|
|
93
|
+
await runMiddlewares(request, beforeMiddlewares, plugin);
|
|
94
|
+
|
|
93
95
|
if (request.response === undefined) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
116
|
-
request.
|
|
117
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
request.error
|
|
124
|
-
|
|
125
|
-
throw request.error
|
|
121
|
+
e.originalError = request.error;
|
|
122
|
+
request.error = e;
|
|
123
|
+
throw request.error;
|
|
126
124
|
}
|
|
127
|
-
|
|
128
|
-
if (request.response === undefined) throw request.error
|
|
125
|
+
|
|
126
|
+
if (request.response === undefined) throw request.error;
|
|
129
127
|
} finally {
|
|
130
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
plugin.
|
|
141
|
-
|
|
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 {
|
|
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
|
|
178
|
-
this.eventEmitter.removeListener(name, handler)
|
|
173
|
+
removeEventListener(name, handler) {
|
|
174
|
+
this.eventEmitter.removeListener(name, handler);
|
|
179
175
|
}
|
|
180
176
|
|
|
181
|
-
addEventListener
|
|
182
|
-
this.eventEmitter.on(name, handler)
|
|
177
|
+
addEventListener(name, handler) {
|
|
178
|
+
this.eventEmitter.on(name, handler);
|
|
183
179
|
}
|
|
184
180
|
|
|
185
|
-
dispatchEvent
|
|
186
|
-
const event = {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
this
|
|
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.
|
|
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
|
-
|
|
218
|
+
global.AbortController = await polyfillAbortController();
|
|
222
219
|
|
|
220
|
+
const polyfillSetTimeoutPromise = async () => {
|
|
223
221
|
if (process.version < 'v15.0.0') {
|
|
224
|
-
return (ms, {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
"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": "
|
|
50
|
+
"gitHead": "d4bea7f4e21f6a9bbb1f6f6908361169598b9e53"
|
|
51
51
|
}
|