@middy/core 3.0.0-alpha.2 → 3.0.0-alpha.6
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.d.ts +3 -1
- package/index.js +104 -30
- package/package.json +4 -6
package/index.d.ts
CHANGED
|
@@ -42,8 +42,10 @@ 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
46
|
|
|
46
|
-
export interface MiddyfiedHandler<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext> extends MiddyInputHandler<TEvent, TResult, TContext
|
|
47
|
+
export interface MiddyfiedHandler<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext> extends MiddyInputHandler<TEvent, TResult, TContext>,
|
|
48
|
+
MiddyInputPromiseHandler<TEvent, TResult, TContext> {
|
|
47
49
|
use: UseFn<TEvent, TResult, TErr, TContext>
|
|
48
50
|
before: AttachMiddlewareFn<TEvent, TResult, TErr, TContext>
|
|
49
51
|
after: AttachMiddlewareFn<TEvent, TResult, TErr, TContext>
|
package/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const defaultLambdaHandler = () => {};
|
|
4
4
|
|
|
5
5
|
const defaultPlugin = {
|
|
6
6
|
timeoutEarlyInMillis: 5,
|
|
@@ -9,17 +9,18 @@ const defaultPlugin = {
|
|
|
9
9
|
}
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
-
const middy = (
|
|
12
|
+
const middy = (lambdaHandler = defaultLambdaHandler, plugin = {}) => {
|
|
13
13
|
var _plugin$beforePrefetc, _plugin;
|
|
14
14
|
|
|
15
|
-
if (typeof
|
|
16
|
-
plugin =
|
|
17
|
-
|
|
15
|
+
if (typeof lambdaHandler !== 'function') {
|
|
16
|
+
plugin = lambdaHandler;
|
|
17
|
+
lambdaHandler = defaultLambdaHandler;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
plugin = { ...defaultPlugin,
|
|
21
21
|
...plugin
|
|
22
22
|
};
|
|
23
|
+
plugin.timeoutEarly = plugin.timeoutEarlyInMillis > 0;
|
|
23
24
|
(_plugin$beforePrefetc = (_plugin = plugin).beforePrefetch) === null || _plugin$beforePrefetc === void 0 ? void 0 : _plugin$beforePrefetc.call(_plugin);
|
|
24
25
|
const beforeMiddlewares = [];
|
|
25
26
|
const afterMiddlewares = [];
|
|
@@ -36,7 +37,7 @@ const middy = (baseHandler = defaultBaseHandler, plugin = {}) => {
|
|
|
36
37
|
error: undefined,
|
|
37
38
|
internal: plugin.internal ?? {}
|
|
38
39
|
};
|
|
39
|
-
return runRequest(request, [...beforeMiddlewares],
|
|
40
|
+
return runRequest(request, [...beforeMiddlewares], lambdaHandler, [...afterMiddlewares], [...onErrorMiddlewares], plugin);
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
middy.use = middlewares => {
|
|
@@ -78,14 +79,19 @@ const middy = (baseHandler = defaultBaseHandler, plugin = {}) => {
|
|
|
78
79
|
return middy;
|
|
79
80
|
};
|
|
80
81
|
|
|
81
|
-
middy.handler =
|
|
82
|
-
|
|
82
|
+
middy.handler = replaceLambdaHandler => {
|
|
83
|
+
lambdaHandler = replaceLambdaHandler;
|
|
84
|
+
return middy;
|
|
83
85
|
};
|
|
84
86
|
|
|
85
87
|
return middy;
|
|
86
88
|
};
|
|
87
89
|
|
|
88
|
-
const runRequest = async (request, beforeMiddlewares,
|
|
90
|
+
const runRequest = async (request, beforeMiddlewares, lambdaHandler, afterMiddlewares, onErrorMiddlewares, plugin) => {
|
|
91
|
+
const {
|
|
92
|
+
timeoutEarly
|
|
93
|
+
} = plugin;
|
|
94
|
+
|
|
89
95
|
try {
|
|
90
96
|
await runMiddlewares(request, beforeMiddlewares, plugin);
|
|
91
97
|
|
|
@@ -94,16 +100,17 @@ const runRequest = async (request, beforeMiddlewares, baseHandler, afterMiddlewa
|
|
|
94
100
|
|
|
95
101
|
(_plugin$beforeHandler = plugin.beforeHandler) === null || _plugin$beforeHandler === void 0 ? void 0 : _plugin$beforeHandler.call(plugin);
|
|
96
102
|
const handlerAbort = new AbortController();
|
|
97
|
-
|
|
98
|
-
|
|
103
|
+
let timeoutAbort;
|
|
104
|
+
if (timeoutEarly) timeoutAbort = new AbortController();
|
|
105
|
+
request.response = await Promise.race([lambdaHandler(request.event, request.context, {
|
|
99
106
|
signal: handlerAbort.signal
|
|
100
|
-
}),
|
|
107
|
+
}), timeoutEarly ? setTimeoutPromise(request.context.getRemainingTimeInMillis() - plugin.timeoutEarlyInMillis, {
|
|
101
108
|
signal: timeoutAbort.signal
|
|
102
109
|
}).then(() => {
|
|
103
110
|
handlerAbort.abort();
|
|
104
111
|
return plugin.timeoutEarlyResponse();
|
|
105
112
|
}) : Promise.race([])]);
|
|
106
|
-
timeoutAbort.abort();
|
|
113
|
+
if (timeoutEarly) timeoutAbort.abort();
|
|
107
114
|
(_plugin$afterHandler = plugin.afterHandler) === null || _plugin$afterHandler === void 0 ? void 0 : _plugin$afterHandler.call(plugin);
|
|
108
115
|
await runMiddlewares(request, afterMiddlewares, plugin);
|
|
109
116
|
}
|
|
@@ -144,25 +151,92 @@ const runMiddlewares = async (request, middlewares, plugin) => {
|
|
|
144
151
|
}
|
|
145
152
|
};
|
|
146
153
|
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
154
|
+
const polyfillAbortController = () => {
|
|
155
|
+
if (process.version < 'v15.0.0') {
|
|
156
|
+
class AbortSignal {
|
|
157
|
+
constructor() {
|
|
158
|
+
this.eventEmitter = new EventEmitter();
|
|
159
|
+
this.onabort = null;
|
|
160
|
+
this.aborted = false;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
toString() {
|
|
164
|
+
return '[object AbortSignal]';
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
get [Symbol.toStringTag]() {
|
|
168
|
+
return 'AbortSignal';
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
removeEventListener(name, handler) {
|
|
172
|
+
this.eventEmitter.removeListener(name, handler);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
addEventListener(name, handler) {
|
|
176
|
+
this.eventEmitter.on(name, handler);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
dispatchEvent(type) {
|
|
180
|
+
const event = {
|
|
181
|
+
type,
|
|
182
|
+
target: this
|
|
183
|
+
};
|
|
184
|
+
const handlerName = `on${type}`;
|
|
185
|
+
if (typeof this[handlerName] === 'function') this[handlerName](event);
|
|
186
|
+
this.eventEmitter.emit(type, event);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return class AbortController {
|
|
192
|
+
constructor() {
|
|
193
|
+
this.signal = new AbortSignal();
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
abort() {
|
|
197
|
+
if (this.signal.aborted) return;
|
|
198
|
+
this.signal.aborted = true;
|
|
199
|
+
this.signal.dispatchEvent('abort');
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
toString() {
|
|
203
|
+
return '[object AbortController]';
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
get [Symbol.toStringTag]() {
|
|
207
|
+
return 'AbortController';
|
|
208
|
+
}
|
|
153
209
|
|
|
154
|
-
return new Promise((resolve, reject) => {
|
|
155
|
-
const abortHandler = () => {
|
|
156
|
-
clearTimeout(timeout);
|
|
157
|
-
reject(new Error('Aborted', 'AbortError'));
|
|
158
210
|
};
|
|
211
|
+
} else {
|
|
212
|
+
return AbortController;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
global.AbortController = polyfillAbortController();
|
|
159
217
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
signal.
|
|
165
|
-
|
|
218
|
+
const polyfillSetTimeoutPromise = () => {
|
|
219
|
+
return (ms, {
|
|
220
|
+
signal
|
|
221
|
+
}) => {
|
|
222
|
+
if (signal.aborted) {
|
|
223
|
+
return Promise.reject(new Error('Aborted', 'AbortError'));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return new Promise((resolve, reject) => {
|
|
227
|
+
const abortHandler = () => {
|
|
228
|
+
clearTimeout(timeout);
|
|
229
|
+
reject(new Error('Aborted', 'AbortError'));
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
const timeout = setTimeout(() => {
|
|
233
|
+
resolve();
|
|
234
|
+
signal.removeEventListener('abort', abortHandler);
|
|
235
|
+
}, ms);
|
|
236
|
+
signal.addEventListener('abort', abortHandler);
|
|
237
|
+
});
|
|
238
|
+
};
|
|
166
239
|
};
|
|
167
240
|
|
|
241
|
+
const setTimeoutPromise = polyfillSetTimeoutPromise();
|
|
168
242
|
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.6",
|
|
4
4
|
"description": "🛵 The stylish Node.js middleware engine for AWS Lambda (core package)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
],
|
|
19
19
|
"scripts": {
|
|
20
20
|
"test": "npm run test:unit",
|
|
21
|
-
"test:unit": "ava"
|
|
21
|
+
"test:unit": "ava",
|
|
22
|
+
"test:benchmark": "node __benchmarks__/index.js"
|
|
22
23
|
},
|
|
23
24
|
"license": "MIT",
|
|
24
25
|
"keywords": [
|
|
@@ -46,8 +47,5 @@
|
|
|
46
47
|
"@types/aws-lambda": "^8.10.76",
|
|
47
48
|
"@types/node": "^17.0.0"
|
|
48
49
|
},
|
|
49
|
-
"gitHead": "
|
|
50
|
-
"dependencies": {
|
|
51
|
-
"node-abort-controller": "3.0.1"
|
|
52
|
-
}
|
|
50
|
+
"gitHead": "176660ed3e0716d6bfb635c77251b301e0e24720"
|
|
53
51
|
}
|