aws-lambda-api-tools 0.1.18 → 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,7 +55,8 @@ const v1ApiGatewayEvent = (event, config) => {
|
|
|
53
55
|
};
|
|
54
56
|
};
|
|
55
57
|
function getRouteConfigByPath(eventPath, method, configs) {
|
|
56
|
-
|
|
58
|
+
eventPath = eventPath.replace(/\?.*$/, ""); // Remove query string
|
|
59
|
+
const normalizedPath = eventPath.replace(/^\//, ""); // Remove leading slash
|
|
57
60
|
for (const config of configs) {
|
|
58
61
|
const pattern = pathToRegex(config.path);
|
|
59
62
|
const regex = new RegExp(`^${pattern}$`);
|
|
@@ -66,25 +69,29 @@ function getRouteConfigByPath(eventPath, method, configs) {
|
|
|
66
69
|
return config;
|
|
67
70
|
}
|
|
68
71
|
}
|
|
69
|
-
throw new custom_error_1.CustomError(JSON.stringify({ message:
|
|
72
|
+
throw new custom_error_1.CustomError(JSON.stringify({ message: "path no found" }), 400);
|
|
70
73
|
}
|
|
71
74
|
exports.getRouteConfigByPath = getRouteConfigByPath;
|
|
72
75
|
const lambdaRouteProxyEntryHandler = (config, availableRouteModules) => async (event) => {
|
|
73
76
|
console.log(`Event Data: ${JSON.stringify(event)}`);
|
|
74
|
-
const isV2 = event.version ===
|
|
75
|
-
const isProxied = !isV2 && event.hasOwnProperty(
|
|
76
|
-
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);
|
|
77
82
|
const { routeKey, queryStringParameters, pathParameters, body, isBase64Encoded, } = newEvent;
|
|
78
83
|
let retVal = {};
|
|
79
84
|
try {
|
|
80
|
-
const [method =
|
|
85
|
+
const [method = "", path = ""] = routeKey.split(" ");
|
|
81
86
|
if (shouldAuthorizeRoute(config, getRouteConfigEntry(config, method, path))) {
|
|
82
87
|
await (0, authorization_helper_1.authorizeRoute)(event);
|
|
83
88
|
}
|
|
84
89
|
const routeModule = (0, exports.getRouteModule)(config, method, path, availableRouteModules);
|
|
85
90
|
console.log(`isBase64Encoded: ${isBase64Encoded}`);
|
|
86
91
|
console.log(`body: ${body}`);
|
|
87
|
-
const decodedBody = isBase64Encoded
|
|
92
|
+
const decodedBody = isBase64Encoded
|
|
93
|
+
? Buffer.from(body, "base64").toString("utf-8")
|
|
94
|
+
: undefined;
|
|
88
95
|
console.log(`decodedBody:
|
|
89
96
|
${decodedBody}`);
|
|
90
97
|
retVal = await (0, exports.getRouteModuleResult)(routeModule, {
|
|
@@ -95,42 +102,64 @@ const lambdaRouteProxyEntryHandler = (config, availableRouteModules) => async (e
|
|
|
95
102
|
});
|
|
96
103
|
if (isProxied) {
|
|
97
104
|
if (retVal.statusCode && !retVal.body) {
|
|
98
|
-
console.log(
|
|
99
|
-
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);
|
|
100
107
|
}
|
|
101
108
|
else if (retVal.statusCode && retVal.body) {
|
|
102
109
|
retVal = {
|
|
103
110
|
...retVal,
|
|
104
111
|
isBase64Encoded: false,
|
|
105
112
|
headers: {
|
|
106
|
-
|
|
107
|
-
...retVal.headers ?? {}
|
|
113
|
+
"Content-Type": "application/json",
|
|
114
|
+
...(retVal.headers ?? {}),
|
|
108
115
|
},
|
|
109
|
-
body: typeof retVal.body ===
|
|
116
|
+
body: typeof retVal.body === "object"
|
|
117
|
+
? JSON.stringify(retVal.body)
|
|
118
|
+
: retVal.body,
|
|
110
119
|
};
|
|
111
120
|
}
|
|
112
121
|
else {
|
|
113
122
|
retVal = {
|
|
114
123
|
statusCode: 200,
|
|
115
124
|
body: JSON.stringify(retVal),
|
|
116
|
-
|
|
125
|
+
"Content-Type": "application/json",
|
|
117
126
|
};
|
|
118
127
|
}
|
|
119
128
|
}
|
|
120
129
|
}
|
|
121
130
|
catch (error) {
|
|
122
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
|
+
}
|
|
123
152
|
if (error instanceof custom_error_1.CustomError) {
|
|
124
153
|
retVal = {
|
|
125
|
-
statusCode
|
|
126
|
-
headers
|
|
154
|
+
statusCode,
|
|
155
|
+
headers,
|
|
127
156
|
body: error.message,
|
|
128
157
|
};
|
|
129
158
|
}
|
|
130
159
|
else {
|
|
131
160
|
retVal = {
|
|
132
|
-
statusCode
|
|
133
|
-
headers
|
|
161
|
+
statusCode,
|
|
162
|
+
headers,
|
|
134
163
|
body: error.message || JSON.stringify(error),
|
|
135
164
|
};
|
|
136
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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"}
|