aws-lambda-api-tools 0.1.19 → 0.1.20
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { APIGatewayEvent, APIGatewayProxyEvent, APIGatewayProxyEventV2 } from
|
|
2
|
-
import { RouteConfig, ConfigRouteEntry, RouteArguments, RouteModule } from
|
|
1
|
+
import { APIGatewayEvent, APIGatewayProxyEvent, APIGatewayProxyEventV2 } from "aws-lambda";
|
|
2
|
+
import { RouteConfig, ConfigRouteEntry, RouteArguments, RouteModule } from "./types-and-interfaces";
|
|
3
3
|
export declare const getRouteModule: (config: RouteConfig, method: string, path: string, availableRouteModules: {
|
|
4
4
|
[key: string]: any;
|
|
5
5
|
}) => RouteModule;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambda-route-proxy-entry-handler.d.ts","sourceRoot":"","sources":["../../src/lib/lambda-route-proxy-entry-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lambda-route-proxy-entry-handler.d.ts","sourceRoot":"","sources":["../../src/lib/lambda-route-proxy-entry-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAsBhC,eAAO,MAAM,cAAc,WACjB,WAAW,UACX,MAAM,QACR,MAAM;;MAEX,WAYF,CAAC;AAUF,eAAO,MAAM,oBAAoB,mBACf,WAAW,YACjB,cAAc,KACvB,QAAQ,GAAG,CAMb,CAAC;AAuCF,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,EAAE,GAC1B,gBAAgB,GAAG;IAAE,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CAAE,CAmB3D;AAED,eAAO,MAAM,4BAA4B,WAC9B,WAAW;;cAEX,sBAAsB,GAAG,oBAAoB,GAAG,eAAe,iBAmHvE,CAAC"}
|
|
@@ -3,10 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.lambdaRouteProxyEntryHandler = exports.getRouteConfigByPath = exports.getRouteModuleResult = exports.getRouteModule = void 0;
|
|
4
4
|
const custom_error_1 = require("./custom-error");
|
|
5
5
|
const authorization_helper_1 = require("./authorization-helper");
|
|
6
|
-
const getRouteConfigEntry = (config, method, path) => config.routes.find(r => r.path.toLowerCase() === path.toLowerCase() &&
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
const getRouteConfigEntry = (config, method, path) => config.routes.find((r) => r.path.toLowerCase() === path.toLowerCase() &&
|
|
7
|
+
r.method.toLowerCase() === method.toLowerCase());
|
|
8
|
+
const shouldAuthorizeRoute = (routesConfig, routeConfigEntry) => (routesConfig.authorizeAllRoutes &&
|
|
9
|
+
routeConfigEntry.authorizeRoute !== false) ||
|
|
10
|
+
routeConfigEntry.authorizeRoute === true;
|
|
10
11
|
const getRouteModule = (config, method, path, availableRouteModules) => {
|
|
11
12
|
const routeEntry = getRouteConfigEntry(config, method, path);
|
|
12
13
|
let routeModule = null;
|
|
@@ -30,13 +31,14 @@ exports.getRouteModuleResult = getRouteModuleResult;
|
|
|
30
31
|
function pathToRegex(path) {
|
|
31
32
|
// Convert route path to regex pattern
|
|
32
33
|
return path
|
|
33
|
-
.replace(/\//g,
|
|
34
|
-
.replace(/{([^}]+)}/g,
|
|
34
|
+
.replace(/\//g, "\\/") // Escape forward slashes
|
|
35
|
+
.replace(/{([^}]+)}/g, "(?<$1>[^/]+)"); // Convert {param} to named capture groups
|
|
35
36
|
}
|
|
36
37
|
const v2ApiGatewayEvent = (event) => {
|
|
37
38
|
return {
|
|
38
39
|
routeKey: event.routeKey,
|
|
39
|
-
queryStringParameters: event.queryStringParameters ??
|
|
40
|
+
queryStringParameters: event.queryStringParameters ??
|
|
41
|
+
{},
|
|
40
42
|
pathParameters: event.pathParameters ?? {},
|
|
41
43
|
body: event.body,
|
|
42
44
|
isBase64Encoded: event.isBase64Encoded,
|
|
@@ -53,8 +55,8 @@ const v1ApiGatewayEvent = (event, config) => {
|
|
|
53
55
|
};
|
|
54
56
|
};
|
|
55
57
|
function getRouteConfigByPath(eventPath, method, configs) {
|
|
56
|
-
eventPath = eventPath.replace(/\?.*$/,
|
|
57
|
-
const normalizedPath = eventPath.replace(/^\//,
|
|
58
|
+
eventPath = eventPath.replace(/\?.*$/, ""); // Remove query string
|
|
59
|
+
const normalizedPath = eventPath.replace(/^\//, ""); // Remove leading slash
|
|
58
60
|
for (const config of configs) {
|
|
59
61
|
const pattern = pathToRegex(config.path);
|
|
60
62
|
const regex = new RegExp(`^${pattern}$`);
|
|
@@ -67,25 +69,29 @@ function getRouteConfigByPath(eventPath, method, configs) {
|
|
|
67
69
|
return config;
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
|
-
throw new custom_error_1.CustomError(JSON.stringify({ message:
|
|
72
|
+
throw new custom_error_1.CustomError(JSON.stringify({ message: "path no found" }), 400);
|
|
71
73
|
}
|
|
72
74
|
exports.getRouteConfigByPath = getRouteConfigByPath;
|
|
73
75
|
const lambdaRouteProxyEntryHandler = (config, availableRouteModules) => async (event) => {
|
|
74
76
|
console.log(`Event Data: ${JSON.stringify(event)}`);
|
|
75
|
-
const isV2 = event.version ===
|
|
76
|
-
const isProxied = !isV2 && event.hasOwnProperty(
|
|
77
|
-
const newEvent = isV2
|
|
77
|
+
const isV2 = event.version === "2.0";
|
|
78
|
+
const isProxied = !isV2 && event.hasOwnProperty("requestContext");
|
|
79
|
+
const newEvent = isV2
|
|
80
|
+
? v2ApiGatewayEvent(event)
|
|
81
|
+
: v1ApiGatewayEvent(event, config);
|
|
78
82
|
const { routeKey, queryStringParameters, pathParameters, body, isBase64Encoded, } = newEvent;
|
|
79
83
|
let retVal = {};
|
|
80
84
|
try {
|
|
81
|
-
const [method =
|
|
85
|
+
const [method = "", path = ""] = routeKey.split(" ");
|
|
82
86
|
if (shouldAuthorizeRoute(config, getRouteConfigEntry(config, method, path))) {
|
|
83
87
|
await (0, authorization_helper_1.authorizeRoute)(event);
|
|
84
88
|
}
|
|
85
89
|
const routeModule = (0, exports.getRouteModule)(config, method, path, availableRouteModules);
|
|
86
90
|
console.log(`isBase64Encoded: ${isBase64Encoded}`);
|
|
87
91
|
console.log(`body: ${body}`);
|
|
88
|
-
const decodedBody = isBase64Encoded
|
|
92
|
+
const decodedBody = isBase64Encoded
|
|
93
|
+
? Buffer.from(body, "base64").toString("utf-8")
|
|
94
|
+
: undefined;
|
|
89
95
|
console.log(`decodedBody:
|
|
90
96
|
${decodedBody}`);
|
|
91
97
|
retVal = await (0, exports.getRouteModuleResult)(routeModule, {
|
|
@@ -96,42 +102,64 @@ const lambdaRouteProxyEntryHandler = (config, availableRouteModules) => async (e
|
|
|
96
102
|
});
|
|
97
103
|
if (isProxied) {
|
|
98
104
|
if (retVal.statusCode && !retVal.body) {
|
|
99
|
-
console.log(
|
|
100
|
-
throw new custom_error_1.CustomError(
|
|
105
|
+
console.log("body must be included when status code is set", retVal);
|
|
106
|
+
throw new custom_error_1.CustomError("No body found", 500);
|
|
101
107
|
}
|
|
102
108
|
else if (retVal.statusCode && retVal.body) {
|
|
103
109
|
retVal = {
|
|
104
110
|
...retVal,
|
|
105
111
|
isBase64Encoded: false,
|
|
106
112
|
headers: {
|
|
107
|
-
|
|
108
|
-
...retVal.headers ?? {}
|
|
113
|
+
"Content-Type": "application/json",
|
|
114
|
+
...(retVal.headers ?? {}),
|
|
109
115
|
},
|
|
110
|
-
body: typeof retVal.body ===
|
|
116
|
+
body: typeof retVal.body === "object"
|
|
117
|
+
? JSON.stringify(retVal.body)
|
|
118
|
+
: retVal.body,
|
|
111
119
|
};
|
|
112
120
|
}
|
|
113
121
|
else {
|
|
114
122
|
retVal = {
|
|
115
123
|
statusCode: 200,
|
|
116
124
|
body: JSON.stringify(retVal),
|
|
117
|
-
|
|
125
|
+
"Content-Type": "application/json",
|
|
118
126
|
};
|
|
119
127
|
}
|
|
120
128
|
}
|
|
121
129
|
}
|
|
122
130
|
catch (error) {
|
|
123
131
|
console.error(JSON.stringify({ error, stack: error.stack }));
|
|
132
|
+
let headers = {
|
|
133
|
+
"Content-Type": "application/json",
|
|
134
|
+
};
|
|
135
|
+
let statusCode = 500;
|
|
136
|
+
if (isProxied) {
|
|
137
|
+
const isOptions = event.requestContext.httpMethod === "OPTIONS";
|
|
138
|
+
if (isOptions) {
|
|
139
|
+
statusCode = 200;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
statusCode = error.httpStatusCode || 500;
|
|
143
|
+
}
|
|
144
|
+
headers = {
|
|
145
|
+
...headers,
|
|
146
|
+
"Access-Control-Allow-Origin": "*",
|
|
147
|
+
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
|
|
148
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization, X-Amz-Date, X-Api-Key, X-Amz-Security-Token",
|
|
149
|
+
"Access-Control-Allow-Credentials": "true",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
124
152
|
if (error instanceof custom_error_1.CustomError) {
|
|
125
153
|
retVal = {
|
|
126
|
-
statusCode
|
|
127
|
-
headers
|
|
154
|
+
statusCode,
|
|
155
|
+
headers,
|
|
128
156
|
body: error.message,
|
|
129
157
|
};
|
|
130
158
|
}
|
|
131
159
|
else {
|
|
132
160
|
retVal = {
|
|
133
|
-
statusCode
|
|
134
|
-
headers
|
|
161
|
+
statusCode,
|
|
162
|
+
headers,
|
|
135
163
|
body: error.message || JSON.stringify(error),
|
|
136
164
|
};
|
|
137
165
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambda-route-proxy-entry-handler.js","sourceRoot":"","sources":["../../src/lib/lambda-route-proxy-entry-handler.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"lambda-route-proxy-entry-handler.js","sourceRoot":"","sources":["../../src/lib/lambda-route-proxy-entry-handler.ts"],"names":[],"mappings":"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"}
|