lambder 1.0.38 → 1.0.40
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/dist/Lambder.d.ts +4 -2
- package/dist/Lambder.js +19 -11
- package/dist/Resolver.d.ts +12 -12
- package/dist/Resolver.js +2 -3
- package/dist/{ResolverLight.d.ts → ResponseBuilder.d.ts} +1 -1
- package/dist/{ResolverLight.js → ResponseBuilder.js} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/Lambder.ts +21 -15
- package/src/Resolver.ts +12 -13
- package/src/{ResolverLight.ts → ResponseBuilder.ts} +2 -36
- package/src/index.ts +1 -1
package/dist/Lambder.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { APIGatewayProxyEvent, APIGatewayProxyEventHeaders, Context } from "aws-lambda";
|
|
2
2
|
import Resolver from "./Resolver.js";
|
|
3
|
-
import
|
|
3
|
+
import ResponseBuilder, { ResolverResponse } from "./ResponseBuilder.js";
|
|
4
4
|
type DDBSession = {
|
|
5
5
|
userId: string;
|
|
6
6
|
userIdHash: string;
|
|
@@ -36,7 +36,7 @@ type HookBeforeRenderFunction = (renderContext: RenderContext, resolver: Resolve
|
|
|
36
36
|
type HookAfterRenderFunction = (renderContext: RenderContext, resolver: Resolver, renderResult: ResolverResponse) => ResolverResponse | Promise<ResolverResponse>;
|
|
37
37
|
type HookFallbackFunction = (renderContext: RenderContext, resolver: Resolver) => ResolverResponse | Promise<ResolverResponse>;
|
|
38
38
|
type HookCompletedFunction = (renderResult: ResolverResponse) => ResolverResponse | Promise<ResolverResponse>;
|
|
39
|
-
type GlobalErrorHandlerFunction = (err: Error, renderContext: RenderContext | null,
|
|
39
|
+
type GlobalErrorHandlerFunction = (err: Error, renderContext: RenderContext | null, response: ResponseBuilder) => ResolverResponse | Promise<ResolverResponse>;
|
|
40
40
|
type RouteFallbackHandlerFunction = (renderContext: RenderContext, resolver: Resolver) => ResolverResponse;
|
|
41
41
|
type ApiFallbackHandlerFunction = (renderContext: RenderContext, resolver: Resolver) => ResolverResponse;
|
|
42
42
|
export declare const createContext: (event: APIGatewayProxyEvent, lambdaContext: Context) => RenderContext;
|
|
@@ -71,6 +71,8 @@ export default class Lambder {
|
|
|
71
71
|
addHook(hookEvent: 'afterRender', hookFn: HookAfterRenderFunction, priority?: number): Promise<void>;
|
|
72
72
|
addHook(hookEvent: 'fallback', hookFn: HookFallbackFunction, priority?: number): Promise<void>;
|
|
73
73
|
addHook(hookEvent: 'completed', hookFn: HookCompletedFunction, priority?: number): Promise<void>;
|
|
74
|
+
getResponseBuilder(): ResponseBuilder;
|
|
75
|
+
getResolver(resolve: (renderResult: ResolverResponse) => void, reject: (err: Error) => void): Resolver;
|
|
74
76
|
render(event: APIGatewayProxyEvent, lambdaContext: Context): Promise<ResolverResponse>;
|
|
75
77
|
}
|
|
76
78
|
export {};
|
package/dist/Lambder.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import querystring from "querystring";
|
|
2
2
|
import cookieParser from "cookie";
|
|
3
3
|
import Resolver from "./Resolver.js";
|
|
4
|
-
import
|
|
4
|
+
import ResponseBuilder from "./ResponseBuilder.js";
|
|
5
5
|
export const createContext = (event, lambdaContext) => {
|
|
6
6
|
const host = event.headers.Host || event.headers.host || "";
|
|
7
7
|
const url = event.path;
|
|
@@ -147,23 +147,30 @@ export default class Lambder {
|
|
|
147
147
|
this._hookList[hookEvent].sort((a, b) => a.priority - b.priority);
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
150
|
+
getResponseBuilder() {
|
|
151
|
+
return new ResponseBuilder({
|
|
152
|
+
isCorsEnabled: this.isCorsEnabled,
|
|
153
|
+
publicPath: this.publicPath,
|
|
154
|
+
apiVersion: this.apiVersion,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
;
|
|
158
|
+
getResolver(resolve, reject) {
|
|
159
|
+
return new Resolver({
|
|
153
160
|
isCorsEnabled: this.isCorsEnabled,
|
|
154
161
|
publicPath: this.publicPath,
|
|
155
162
|
apiVersion: this.apiVersion,
|
|
163
|
+
resolve, reject
|
|
156
164
|
});
|
|
165
|
+
}
|
|
166
|
+
;
|
|
167
|
+
async render(event, lambdaContext) {
|
|
168
|
+
let eventRenderContext = null;
|
|
157
169
|
try {
|
|
158
170
|
let renderContext = createContext(event, lambdaContext);
|
|
159
171
|
eventRenderContext = renderContext;
|
|
160
172
|
return await new Promise(async (resolve, reject) => {
|
|
161
|
-
const resolver =
|
|
162
|
-
isCorsEnabled: this.isCorsEnabled,
|
|
163
|
-
publicPath: this.publicPath,
|
|
164
|
-
apiVersion: this.apiVersion,
|
|
165
|
-
resolve, reject
|
|
166
|
-
});
|
|
173
|
+
const resolver = this.getResolver(resolve, reject);
|
|
167
174
|
if (renderContext.method === "OPTIONS")
|
|
168
175
|
return resolver.cors();
|
|
169
176
|
const firstMatchedAction = await (async () => {
|
|
@@ -193,9 +200,10 @@ export default class Lambder {
|
|
|
193
200
|
});
|
|
194
201
|
}
|
|
195
202
|
catch (err) {
|
|
203
|
+
const responseBuilder = this.getResponseBuilder();
|
|
196
204
|
const wrappedError = err instanceof Error ? err : new Error("Error: " + String(err));
|
|
197
205
|
if (this.globalErrorHandler) {
|
|
198
|
-
return this.globalErrorHandler(wrappedError, eventRenderContext,
|
|
206
|
+
return this.globalErrorHandler(wrappedError, eventRenderContext, responseBuilder);
|
|
199
207
|
}
|
|
200
208
|
return { statusCode: 500, body: "Internal Server Error.", };
|
|
201
209
|
}
|
package/dist/Resolver.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import
|
|
1
|
+
import ResponseBuilder, { ResolverResponse } from "./ResponseBuilder.js";
|
|
2
2
|
type MethodType<T, M extends keyof T> = T[M] extends (...args: any[]) => any ? T[M] : never;
|
|
3
3
|
interface DieResolverMethods {
|
|
4
|
-
raw: MethodType<
|
|
5
|
-
json: MethodType<
|
|
6
|
-
xml: MethodType<
|
|
7
|
-
html: MethodType<
|
|
8
|
-
status301: MethodType<
|
|
9
|
-
status404: MethodType<
|
|
10
|
-
cors: MethodType<
|
|
11
|
-
fileBase64: MethodType<
|
|
12
|
-
file: MethodType<
|
|
13
|
-
api: MethodType<
|
|
4
|
+
raw: MethodType<ResponseBuilder, 'raw'>;
|
|
5
|
+
json: MethodType<ResponseBuilder, 'json'>;
|
|
6
|
+
xml: MethodType<ResponseBuilder, 'xml'>;
|
|
7
|
+
html: MethodType<ResponseBuilder, 'html'>;
|
|
8
|
+
status301: MethodType<ResponseBuilder, 'status301'>;
|
|
9
|
+
status404: MethodType<ResponseBuilder, 'status404'>;
|
|
10
|
+
cors: MethodType<ResponseBuilder, 'cors'>;
|
|
11
|
+
fileBase64: MethodType<ResponseBuilder, 'fileBase64'>;
|
|
12
|
+
file: MethodType<ResponseBuilder, 'file'>;
|
|
13
|
+
api: MethodType<ResponseBuilder, 'api'>;
|
|
14
14
|
}
|
|
15
|
-
export default class Resolver extends
|
|
15
|
+
export default class Resolver extends ResponseBuilder {
|
|
16
16
|
resolve: (renderResult: ResolverResponse) => void;
|
|
17
17
|
reject: (err: Error) => void;
|
|
18
18
|
die: DieResolverMethods;
|
package/dist/Resolver.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
export default class Resolver extends
|
|
1
|
+
import ResponseBuilder from "./ResponseBuilder.js";
|
|
2
|
+
export default class Resolver extends ResponseBuilder {
|
|
3
3
|
resolve;
|
|
4
4
|
reject;
|
|
5
5
|
die;
|
|
@@ -7,7 +7,6 @@ export default class Resolver extends ResolverLight {
|
|
|
7
7
|
super({ isCorsEnabled, publicPath, apiVersion });
|
|
8
8
|
this.resolve = resolve;
|
|
9
9
|
this.reject = reject;
|
|
10
|
-
// Bind ResolverLight methods to `this` for `die` and automatically resolve
|
|
11
10
|
this.die = {
|
|
12
11
|
raw: this.autoResolve(this.raw),
|
|
13
12
|
json: this.autoResolve(this.json),
|
|
@@ -8,7 +8,7 @@ const CORS_HEADERS = convertToMultiHeader({
|
|
|
8
8
|
"Access-Control-Allow-Origin": "*",
|
|
9
9
|
"Access-Control-Allow-Methods": "OPTIONS,POST",
|
|
10
10
|
});
|
|
11
|
-
export default class
|
|
11
|
+
export default class ResponseBuilder {
|
|
12
12
|
isCorsEnabled;
|
|
13
13
|
publicPath;
|
|
14
14
|
apiVersion;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Lambder from './Lambder.js';
|
|
2
2
|
export default Lambder;
|
|
3
3
|
export { default as LambderCaller } from "./LambderCaller.js";
|
|
4
|
-
export { default as
|
|
4
|
+
export { default as ResponseBuilder } from "./ResponseBuilder.js";
|
|
5
5
|
export { default as Resolver } from "./Resolver.js";
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Lambder from './Lambder.js';
|
|
2
2
|
export default Lambder;
|
|
3
3
|
export { default as LambderCaller } from "./LambderCaller.js";
|
|
4
|
-
export { default as
|
|
4
|
+
export { default as ResponseBuilder } from "./ResponseBuilder.js";
|
|
5
5
|
export { default as Resolver } from "./Resolver.js";
|
package/package.json
CHANGED
package/src/Lambder.ts
CHANGED
|
@@ -3,7 +3,7 @@ import cookieParser from "cookie";
|
|
|
3
3
|
|
|
4
4
|
import type { APIGatewayProxyEvent, APIGatewayProxyEventHeaders, Context } from "aws-lambda";
|
|
5
5
|
import Resolver from "./Resolver.js";
|
|
6
|
-
import
|
|
6
|
+
import ResponseBuilder, { ResolverResponse } from "./ResponseBuilder.js";
|
|
7
7
|
|
|
8
8
|
type DDBSession = {
|
|
9
9
|
userId: string,
|
|
@@ -37,7 +37,7 @@ type HookAfterRenderFunction = (renderContext: RenderContext, resolver: Resolver
|
|
|
37
37
|
type HookFallbackFunction = (renderContext: RenderContext, resolver: Resolver) => ResolverResponse|Promise<ResolverResponse>;
|
|
38
38
|
type HookCompletedFunction = (renderResult: ResolverResponse) => ResolverResponse|Promise<ResolverResponse>;
|
|
39
39
|
|
|
40
|
-
type GlobalErrorHandlerFunction = (err: Error, renderContext: RenderContext|null,
|
|
40
|
+
type GlobalErrorHandlerFunction = (err: Error, renderContext: RenderContext|null, response: ResponseBuilder) => ResolverResponse|Promise<ResolverResponse>;
|
|
41
41
|
type RouteFallbackHandlerFunction = (renderContext:RenderContext, resolver: Resolver) => ResolverResponse;
|
|
42
42
|
type ApiFallbackHandlerFunction = (renderContext:RenderContext, resolver: Resolver) => ResolverResponse;
|
|
43
43
|
|
|
@@ -222,18 +222,28 @@ export default class Lambder {
|
|
|
222
222
|
}
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
+
public getResponseBuilder(){
|
|
226
|
+
return new ResponseBuilder({
|
|
227
|
+
isCorsEnabled: this.isCorsEnabled,
|
|
228
|
+
publicPath: this.publicPath,
|
|
229
|
+
apiVersion: this.apiVersion,
|
|
230
|
+
});
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
public getResolver(resolve: (renderResult: ResolverResponse) => void, reject: (err: Error) => void){
|
|
234
|
+
return new Resolver({
|
|
235
|
+
isCorsEnabled: this.isCorsEnabled,
|
|
236
|
+
publicPath: this.publicPath,
|
|
237
|
+
apiVersion: this.apiVersion,
|
|
238
|
+
resolve, reject
|
|
239
|
+
});
|
|
240
|
+
};
|
|
225
241
|
|
|
226
242
|
async render(
|
|
227
243
|
event: APIGatewayProxyEvent,
|
|
228
244
|
lambdaContext: Context
|
|
229
245
|
): Promise<ResolverResponse>{
|
|
230
246
|
let eventRenderContext:RenderContext|null = null;
|
|
231
|
-
const resolverLight = new ResolverLight({
|
|
232
|
-
isCorsEnabled: this.isCorsEnabled,
|
|
233
|
-
publicPath: this.publicPath,
|
|
234
|
-
apiVersion: this.apiVersion,
|
|
235
|
-
})
|
|
236
|
-
|
|
237
247
|
try {
|
|
238
248
|
let renderContext = createContext(event, lambdaContext);
|
|
239
249
|
eventRenderContext = renderContext;
|
|
@@ -242,12 +252,7 @@ export default class Lambder {
|
|
|
242
252
|
resolve:(renderResult: ResolverResponse)=>void,
|
|
243
253
|
reject:(err: Error)=>void
|
|
244
254
|
)=> {
|
|
245
|
-
const resolver =
|
|
246
|
-
isCorsEnabled: this.isCorsEnabled,
|
|
247
|
-
publicPath: this.publicPath,
|
|
248
|
-
apiVersion: this.apiVersion,
|
|
249
|
-
resolve, reject
|
|
250
|
-
});
|
|
255
|
+
const resolver = this.getResolver(resolve, reject);
|
|
251
256
|
if(renderContext.method === "OPTIONS") return resolver.cors();
|
|
252
257
|
|
|
253
258
|
const firstMatchedAction = await (async () => {
|
|
@@ -275,9 +280,10 @@ export default class Lambder {
|
|
|
275
280
|
return renderResult;
|
|
276
281
|
});
|
|
277
282
|
}catch(err){
|
|
283
|
+
const responseBuilder = this.getResponseBuilder();
|
|
278
284
|
const wrappedError = err instanceof Error ? err : new Error("Error: " + String(err));
|
|
279
285
|
if(this.globalErrorHandler){
|
|
280
|
-
return this.globalErrorHandler(wrappedError, eventRenderContext,
|
|
286
|
+
return this.globalErrorHandler(wrappedError, eventRenderContext, responseBuilder);
|
|
281
287
|
}
|
|
282
288
|
return { statusCode: 500, body: "Internal Server Error.", }
|
|
283
289
|
|
package/src/Resolver.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import
|
|
1
|
+
import ResponseBuilder, { ResolverResponse } from "./ResponseBuilder.js";
|
|
2
2
|
|
|
3
3
|
type MethodType<T, M extends keyof T> = T[M] extends (...args: any[]) => any ? T[M] : never;
|
|
4
4
|
|
|
5
5
|
interface DieResolverMethods {
|
|
6
|
-
raw: MethodType<
|
|
7
|
-
json: MethodType<
|
|
8
|
-
xml: MethodType<
|
|
9
|
-
html: MethodType<
|
|
10
|
-
status301: MethodType<
|
|
11
|
-
status404: MethodType<
|
|
12
|
-
cors: MethodType<
|
|
13
|
-
fileBase64: MethodType<
|
|
14
|
-
file: MethodType<
|
|
15
|
-
api: MethodType<
|
|
6
|
+
raw: MethodType<ResponseBuilder, 'raw'>;
|
|
7
|
+
json: MethodType<ResponseBuilder, 'json'>;
|
|
8
|
+
xml: MethodType<ResponseBuilder, 'xml'>;
|
|
9
|
+
html: MethodType<ResponseBuilder, 'html'>;
|
|
10
|
+
status301: MethodType<ResponseBuilder, 'status301'>;
|
|
11
|
+
status404: MethodType<ResponseBuilder, 'status404'>;
|
|
12
|
+
cors: MethodType<ResponseBuilder, 'cors'>;
|
|
13
|
+
fileBase64: MethodType<ResponseBuilder, 'fileBase64'>;
|
|
14
|
+
file: MethodType<ResponseBuilder, 'file'>;
|
|
15
|
+
api: MethodType<ResponseBuilder, 'api'>;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export default class Resolver extends
|
|
18
|
+
export default class Resolver extends ResponseBuilder {
|
|
19
19
|
public resolve: (renderResult: ResolverResponse) => void;
|
|
20
20
|
public reject: (err: Error) => void;
|
|
21
21
|
public die: DieResolverMethods;
|
|
@@ -34,7 +34,6 @@ export default class Resolver extends ResolverLight {
|
|
|
34
34
|
this.resolve = resolve;
|
|
35
35
|
this.reject = reject;
|
|
36
36
|
|
|
37
|
-
// Bind ResolverLight methods to `this` for `die` and automatically resolve
|
|
38
37
|
this.die = {
|
|
39
38
|
raw: this.autoResolve(this.raw),
|
|
40
39
|
json: this.autoResolve(this.json),
|
|
@@ -23,7 +23,7 @@ export type ResolverResponse = {
|
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
export default class
|
|
26
|
+
export default class ResponseBuilder {
|
|
27
27
|
private isCorsEnabled: boolean;
|
|
28
28
|
private publicPath: string;
|
|
29
29
|
private apiVersion: string|null;
|
|
@@ -187,38 +187,4 @@ export default class ResolverLight {
|
|
|
187
187
|
}, headers);
|
|
188
188
|
};
|
|
189
189
|
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
interface IResolverMethods {
|
|
195
|
-
raw(param: {
|
|
196
|
-
statusCode: number,
|
|
197
|
-
isBase64Encoded?: boolean,
|
|
198
|
-
body: null | string,
|
|
199
|
-
multiValueHeaders: { [key: string]: string[] },
|
|
200
|
-
}): ResolverResponse;
|
|
201
|
-
json(data: { [key: string]: any }, headers?: { [key: string]: string | string[] }): ResolverResponse;
|
|
202
|
-
xml(data: string): ResolverResponse;
|
|
203
|
-
html(data: string, headers?: { [key: string]: string | string[] }): ResolverResponse;
|
|
204
|
-
status301(url: string, headers?: { [key: string]: string | string[] }): ResolverResponse;
|
|
205
|
-
status404(data: string, headers?: { [key: string]: string | string[] }): ResolverResponse;
|
|
206
|
-
cors(): ResolverResponse;
|
|
207
|
-
fileBase64(fileBase64: string, mimeType: string, headers?: { [key: string]: string | string[] }): ResolverResponse;
|
|
208
|
-
file(filePath: string, headers?: { [key: string]: string | string[] }): ResolverResponse;
|
|
209
|
-
api({
|
|
210
|
-
payload,
|
|
211
|
-
versionExpired, sessionExpired, notAuthorized,
|
|
212
|
-
message, errorMessage,
|
|
213
|
-
...other
|
|
214
|
-
}: {
|
|
215
|
-
payload?: any;
|
|
216
|
-
versionExpired?: boolean;
|
|
217
|
-
sessionExpired?: boolean;
|
|
218
|
-
notAuthorized?: boolean;
|
|
219
|
-
message?: any;
|
|
220
|
-
errorMessage?: any;
|
|
221
|
-
},
|
|
222
|
-
headers?: { [key:string]: string|string[] }
|
|
223
|
-
): ResolverResponse;
|
|
224
|
-
}
|
|
190
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -2,5 +2,5 @@ import Lambder from './Lambder.js';
|
|
|
2
2
|
|
|
3
3
|
export default Lambder;
|
|
4
4
|
export { default as LambderCaller } from "./LambderCaller.js";
|
|
5
|
-
export { default as
|
|
5
|
+
export { default as ResponseBuilder } from "./ResponseBuilder.js";
|
|
6
6
|
export { default as Resolver } from "./Resolver.js";
|