@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.
Files changed (3) hide show
  1. package/index.d.ts +3 -1
  2. package/index.js +104 -30
  3. 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 { AbortController } from 'node-abort-controller';
1
+ import { EventEmitter } from 'events';
2
2
 
3
- const defaultBaseHandler = () => {};
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 = (baseHandler = defaultBaseHandler, plugin = {}) => {
12
+ const middy = (lambdaHandler = defaultLambdaHandler, plugin = {}) => {
13
13
  var _plugin$beforePrefetc, _plugin;
14
14
 
15
- if (typeof baseHandler !== 'function') {
16
- plugin = baseHandler;
17
- baseHandler = defaultBaseHandler;
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], baseHandler, [...afterMiddlewares], [...onErrorMiddlewares], plugin);
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 = replaceBaseHandler => {
82
- baseHandler = replaceBaseHandler;
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, baseHandler, afterMiddlewares, onErrorMiddlewares, plugin) => {
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
- const timeoutAbort = new AbortController();
98
- request.response = await Promise.race([baseHandler(request.event, request.context, {
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
- }), plugin.timeoutEarlyInMillis > 0 ? setTimeoutPromise(request.context.getRemainingTimeInMillis() - plugin.timeoutEarlyInMillis, {
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 setTimeoutPromise = (ms, {
148
- signal
149
- }) => {
150
- if (signal.aborted) {
151
- return Promise.reject(new Error('Aborted', 'AbortError'));
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
- const timeout = setTimeout(() => {
161
- resolve();
162
- signal.removeEventListener('abort', abortHandler);
163
- }, ms);
164
- signal.addEventListener('abort', abortHandler);
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.2",
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": "de30419273ecbff08f367f47c7e320ec981cf145",
50
- "dependencies": {
51
- "node-abort-controller": "3.0.1"
52
- }
50
+ "gitHead": "176660ed3e0716d6bfb635c77251b301e0e24720"
53
51
  }