@middy/core 3.0.0-alpha.0 → 3.0.0-alpha.1
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 -0
- package/package.json +3 -2
package/index.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { AbortController } from 'node-abort-controller';
|
|
2
|
+
|
|
3
|
+
const defaultBaseHandler = () => {};
|
|
4
|
+
|
|
5
|
+
const defaultPlugin = {
|
|
6
|
+
timeoutEarlyInMillis: 5,
|
|
7
|
+
timeoutEarlyResponse: () => {
|
|
8
|
+
throw new Error('Timeout');
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const middy = (baseHandler = defaultBaseHandler, plugin = {}) => {
|
|
13
|
+
var _plugin$beforePrefetc, _plugin;
|
|
14
|
+
|
|
15
|
+
if (typeof baseHandler !== 'function') {
|
|
16
|
+
plugin = baseHandler;
|
|
17
|
+
baseHandler = defaultBaseHandler;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
plugin = { ...defaultPlugin,
|
|
21
|
+
...plugin
|
|
22
|
+
};
|
|
23
|
+
(_plugin$beforePrefetc = (_plugin = plugin).beforePrefetch) === null || _plugin$beforePrefetc === void 0 ? void 0 : _plugin$beforePrefetc.call(_plugin);
|
|
24
|
+
const beforeMiddlewares = [];
|
|
25
|
+
const afterMiddlewares = [];
|
|
26
|
+
const onErrorMiddlewares = [];
|
|
27
|
+
|
|
28
|
+
const middy = (event = {}, context = {}) => {
|
|
29
|
+
var _plugin$requestStart, _plugin2;
|
|
30
|
+
|
|
31
|
+
(_plugin$requestStart = (_plugin2 = plugin).requestStart) === null || _plugin$requestStart === void 0 ? void 0 : _plugin$requestStart.call(_plugin2);
|
|
32
|
+
const request = {
|
|
33
|
+
event,
|
|
34
|
+
context,
|
|
35
|
+
response: undefined,
|
|
36
|
+
error: undefined,
|
|
37
|
+
internal: plugin.internal ?? {}
|
|
38
|
+
};
|
|
39
|
+
return runRequest(request, [...beforeMiddlewares], baseHandler, [...afterMiddlewares], [...onErrorMiddlewares], plugin);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
middy.use = middlewares => {
|
|
43
|
+
if (!Array.isArray(middlewares)) {
|
|
44
|
+
middlewares = [middlewares];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
for (const middleware of middlewares) {
|
|
48
|
+
const {
|
|
49
|
+
before,
|
|
50
|
+
after,
|
|
51
|
+
onError
|
|
52
|
+
} = middleware;
|
|
53
|
+
|
|
54
|
+
if (!before && !after && !onError) {
|
|
55
|
+
throw new Error('Middleware must be an object containing at least one key among "before", "after", "onError"');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (before) middy.before(before);
|
|
59
|
+
if (after) middy.after(after);
|
|
60
|
+
if (onError) middy.onError(onError);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return middy;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
middy.before = beforeMiddleware => {
|
|
67
|
+
beforeMiddlewares.push(beforeMiddleware);
|
|
68
|
+
return middy;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
middy.after = afterMiddleware => {
|
|
72
|
+
afterMiddlewares.unshift(afterMiddleware);
|
|
73
|
+
return middy;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
middy.onError = onErrorMiddleware => {
|
|
77
|
+
onErrorMiddlewares.unshift(onErrorMiddleware);
|
|
78
|
+
return middy;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
middy.handler = replaceBaseHandler => {
|
|
82
|
+
baseHandler = replaceBaseHandler;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
return middy;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const runRequest = async (request, beforeMiddlewares, baseHandler, afterMiddlewares, onErrorMiddlewares, plugin) => {
|
|
89
|
+
try {
|
|
90
|
+
await runMiddlewares(request, beforeMiddlewares, plugin);
|
|
91
|
+
|
|
92
|
+
if (request.response === undefined) {
|
|
93
|
+
var _plugin$beforeHandler, _plugin$afterHandler;
|
|
94
|
+
|
|
95
|
+
(_plugin$beforeHandler = plugin.beforeHandler) === null || _plugin$beforeHandler === void 0 ? void 0 : _plugin$beforeHandler.call(plugin);
|
|
96
|
+
const handlerAbort = new AbortController();
|
|
97
|
+
const timeoutAbort = new AbortController();
|
|
98
|
+
request.response = await Promise.race([baseHandler(request.event, request.context, {
|
|
99
|
+
signal: handlerAbort.signal
|
|
100
|
+
}), plugin.timeoutEarlyInMillis > 0 ? setTimeoutPromise(request.context.getRemainingTimeInMillis() - plugin.timeoutEarlyInMillis, {
|
|
101
|
+
signal: timeoutAbort.signal
|
|
102
|
+
}).then(() => {
|
|
103
|
+
handlerAbort.abort();
|
|
104
|
+
return plugin.timeoutEarlyResponse();
|
|
105
|
+
}) : Promise.race([])]);
|
|
106
|
+
timeoutAbort.abort();
|
|
107
|
+
(_plugin$afterHandler = plugin.afterHandler) === null || _plugin$afterHandler === void 0 ? void 0 : _plugin$afterHandler.call(plugin);
|
|
108
|
+
await runMiddlewares(request, afterMiddlewares, plugin);
|
|
109
|
+
}
|
|
110
|
+
} catch (e) {
|
|
111
|
+
request.response = undefined;
|
|
112
|
+
request.error = e;
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
await runMiddlewares(request, onErrorMiddlewares, plugin);
|
|
116
|
+
} catch (e) {
|
|
117
|
+
e.originalError = request.error;
|
|
118
|
+
request.error = e;
|
|
119
|
+
throw request.error;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (request.response === undefined) throw request.error;
|
|
123
|
+
} finally {
|
|
124
|
+
var _plugin$requestEnd;
|
|
125
|
+
|
|
126
|
+
await ((_plugin$requestEnd = plugin.requestEnd) === null || _plugin$requestEnd === void 0 ? void 0 : _plugin$requestEnd.call(plugin, request));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return request.response;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const runMiddlewares = async (request, middlewares, plugin) => {
|
|
133
|
+
for (const nextMiddleware of middlewares) {
|
|
134
|
+
var _plugin$beforeMiddlew, _plugin$afterMiddlewa;
|
|
135
|
+
|
|
136
|
+
(_plugin$beforeMiddlew = plugin.beforeMiddleware) === null || _plugin$beforeMiddlew === void 0 ? void 0 : _plugin$beforeMiddlew.call(plugin, nextMiddleware.name);
|
|
137
|
+
const res = await nextMiddleware(request);
|
|
138
|
+
(_plugin$afterMiddlewa = plugin.afterMiddleware) === null || _plugin$afterMiddlewa === void 0 ? void 0 : _plugin$afterMiddlewa.call(plugin, nextMiddleware.name);
|
|
139
|
+
|
|
140
|
+
if (res !== undefined) {
|
|
141
|
+
request.response = res;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const setTimeoutPromise = (ms, {
|
|
148
|
+
signal
|
|
149
|
+
}) => {
|
|
150
|
+
if (signal.aborted) {
|
|
151
|
+
return Promise.reject(new Error('Aborted', 'AbortError'));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return new Promise((resolve, reject) => {
|
|
155
|
+
const abortHandler = () => {
|
|
156
|
+
clearTimeout(timeout);
|
|
157
|
+
reject(new Error('Aborted', 'AbortError'));
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const timeout = setTimeout(() => {
|
|
161
|
+
resolve();
|
|
162
|
+
signal.removeEventListener('abort', abortHandler);
|
|
163
|
+
}, ms);
|
|
164
|
+
signal.addEventListener('abort', abortHandler);
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
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.1",
|
|
4
4
|
"description": "🛵 The stylish Node.js middleware engine for AWS Lambda (core package)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"exports": "./index.js",
|
|
14
14
|
"types": "index.d.ts",
|
|
15
15
|
"files": [
|
|
16
|
+
"index.js",
|
|
16
17
|
"index.d.ts"
|
|
17
18
|
],
|
|
18
19
|
"scripts": {
|
|
@@ -45,7 +46,7 @@
|
|
|
45
46
|
"@types/aws-lambda": "^8.10.76",
|
|
46
47
|
"@types/node": "^17.0.0"
|
|
47
48
|
},
|
|
48
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "a14125c6b2e21b181824f9985a919a47f1e4711f",
|
|
49
50
|
"dependencies": {
|
|
50
51
|
"node-abort-controller": "3.0.1"
|
|
51
52
|
}
|