lambder 1.0.54 → 1.0.56

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 CHANGED
@@ -26,10 +26,9 @@ type RenderContext = {
26
26
  type ConditionFunction = (ctx: RenderContext) => boolean;
27
27
  type ActionFunction = (ctx: RenderContext, resolver: Resolver) => ResolverResponse | Promise<ResolverResponse>;
28
28
  type HookCreatedFunction = (lambderInstance: Lambder) => Promise<void>;
29
- type HookBeforeRenderFunction = (ctx: RenderContext, resolver: Resolver) => RenderContext | Promise<RenderContext>;
30
- type HookAfterRenderFunction = (ctx: RenderContext, resolver: Resolver, response: ResolverResponse) => ResolverResponse | Promise<ResolverResponse>;
31
- type HookFallbackFunction = (ctx: RenderContext, resolver: Resolver) => ResolverResponse | Promise<ResolverResponse>;
32
- type HookCompletedFunction = (response: ResolverResponse) => ResolverResponse | Promise<ResolverResponse>;
29
+ type HookBeforeRenderFunction = (ctx: RenderContext, resolver: Resolver) => RenderContext | Error | Promise<RenderContext | Error>;
30
+ type HookAfterRenderFunction = (ctx: RenderContext, resolver: Resolver, response: ResolverResponse) => ResolverResponse | Error | Promise<ResolverResponse | Error>;
31
+ type HookFallbackFunction = (ctx: RenderContext, resolver: Resolver) => void | Promise<void>;
33
32
  type GlobalErrorHandlerFunction = (err: Error, ctx: RenderContext | null, response: ResponseBuilder) => ResolverResponse | Promise<ResolverResponse>;
34
33
  type RouteFallbackHandlerFunction = (ctx: RenderContext, resolver: Resolver) => ResolverResponse;
35
34
  type ApiFallbackHandlerFunction = (ctx: RenderContext, resolver: Resolver) => ResolverResponse;
@@ -66,7 +65,6 @@ export default class Lambder {
66
65
  addHook(hookEvent: 'beforeRender', hookFn: HookBeforeRenderFunction, priority?: number): Promise<void>;
67
66
  addHook(hookEvent: 'afterRender', hookFn: HookAfterRenderFunction, priority?: number): Promise<void>;
68
67
  addHook(hookEvent: 'fallback', hookFn: HookFallbackFunction, priority?: number): Promise<void>;
69
- addHook(hookEvent: 'completed', hookFn: HookCompletedFunction, priority?: number): Promise<void>;
70
68
  getResponseBuilder(): ResponseBuilder;
71
69
  private getResolver;
72
70
  render(event: APIGatewayProxyEvent, lambdaContext: Context): Promise<ResolverResponse>;
package/dist/Lambder.js CHANGED
@@ -48,7 +48,6 @@ export default class Lambder {
48
48
  "beforeRender": [],
49
49
  "afterRender": [],
50
50
  "fallback": [],
51
- "completed": []
52
51
  };
53
52
  }
54
53
  setRouteFallbackHandler(routeFallbackHandler) {
@@ -199,30 +198,37 @@ export default class Lambder {
199
198
  let ctx = createContext(event, lambdaContext);
200
199
  eventRenderContext = ctx;
201
200
  return await new Promise(async (resolve, reject) => {
202
- const resolver = this.getResolver(resolve, reject);
203
- if (ctx.method === "OPTIONS")
204
- return resolver.cors();
205
- const firstMatchedAction = this.actionList.find(action => action.conditionFn(ctx));
206
- if (firstMatchedAction) {
207
- for (const hook of this.hookList["beforeRender"]) {
208
- ctx = await hook.hookFn(ctx, resolver);
201
+ try {
202
+ const resolver = this.getResolver(resolve, reject);
203
+ if (ctx.method === "OPTIONS")
204
+ return resolver.cors();
205
+ const firstMatchedAction = this.actionList.find(action => action.conditionFn(ctx));
206
+ if (firstMatchedAction) {
207
+ for (const hook of this.hookList["beforeRender"]) {
208
+ const hookCtx = await hook.hookFn(ctx, resolver);
209
+ if (hookCtx instanceof Error) {
210
+ throw hookCtx;
211
+ }
212
+ ctx = hookCtx;
213
+ }
214
+ let response = await firstMatchedAction.actionFn(ctx, resolver);
215
+ for (const hook of this.hookList["afterRender"]) {
216
+ const hookResponse = await hook.hookFn(ctx, resolver, response);
217
+ if (hookResponse instanceof Error) {
218
+ throw hookResponse;
219
+ }
220
+ response = hookResponse;
221
+ }
222
+ resolve(response);
209
223
  }
210
- let response = await firstMatchedAction.actionFn(ctx, resolver);
211
- for (const hook of this.hookList["afterRender"]) {
212
- response = await hook.hookFn(ctx, resolver, response);
224
+ else {
225
+ return this.handleNoMatchedAction(ctx, resolver);
213
226
  }
214
- resolve(response);
215
227
  }
216
- else {
217
- return this.handleNoMatchedAction(ctx, resolver);
228
+ catch (err) {
229
+ const wrappedError = err instanceof Error ? err : new Error("Error: " + String(err));
230
+ reject(wrappedError);
218
231
  }
219
- }).then(async (response) => {
220
- for (const hook of this.hookList["completed"]) {
221
- response = await hook.hookFn(response);
222
- }
223
- return response;
224
- }).catch((reason) => {
225
- throw reason;
226
232
  });
227
233
  }
228
234
  catch (err) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lambder",
3
- "version": "1.0.54",
3
+ "version": "1.0.56",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/Lambder.ts CHANGED
@@ -36,19 +36,18 @@ type ActionFunction = (ctx: RenderContext, resolver: Resolver) => ResolverRespon
36
36
  type ActionObject = { conditionFn: ConditionFunction, actionFn: ActionFunction };
37
37
 
38
38
  type HookCreatedFunction = (lambderInstance: Lambder) => Promise<void>;
39
- type HookBeforeRenderFunction = (ctx: RenderContext, resolver: Resolver) => RenderContext|Promise<RenderContext>;
40
- type HookAfterRenderFunction = (ctx: RenderContext, resolver: Resolver, response: ResolverResponse) => ResolverResponse|Promise<ResolverResponse>;
41
- type HookFallbackFunction = (ctx: RenderContext, resolver: Resolver) => ResolverResponse|Promise<ResolverResponse>;
42
- type HookCompletedFunction = (response: ResolverResponse) => ResolverResponse|Promise<ResolverResponse>;
39
+ type HookBeforeRenderFunction = (ctx: RenderContext, resolver: Resolver) => RenderContext|Error|Promise<RenderContext|Error>;
40
+ type HookAfterRenderFunction = (ctx: RenderContext, resolver: Resolver, response: ResolverResponse) => ResolverResponse|Error|Promise<ResolverResponse|Error>;
41
+ type HookFallbackFunction = (ctx: RenderContext, resolver: Resolver) => void|Promise<void>;
43
42
 
44
43
  type GlobalErrorHandlerFunction = (err: Error, ctx: RenderContext|null, response: ResponseBuilder) => ResolverResponse|Promise<ResolverResponse>;
45
44
  type RouteFallbackHandlerFunction = (ctx:RenderContext, resolver: Resolver) => ResolverResponse;
46
45
  type ApiFallbackHandlerFunction = (ctx:RenderContext, resolver: Resolver) => ResolverResponse;
47
46
 
48
- type HookEventType = "created"|"beforeRender"|"afterRender"|"fallback"|"completed";
47
+ type HookEventType = "created"|"beforeRender"|"afterRender"|"fallback";
49
48
  type HookListType = {
50
49
  priority: number,
51
- hookFn: HookCreatedFunction|HookBeforeRenderFunction|HookAfterRenderFunction|HookFallbackFunction|HookCompletedFunction,
50
+ hookFn: HookCreatedFunction|HookBeforeRenderFunction|HookAfterRenderFunction|HookFallbackFunction,
52
51
  }[];
53
52
 
54
53
  export const createContext = (
@@ -85,7 +84,6 @@ export default class Lambder {
85
84
  "beforeRender": { priority: number, hookFn: HookBeforeRenderFunction }[],
86
85
  "afterRender": { priority: number, hookFn: HookAfterRenderFunction }[],
87
86
  "fallback": { priority: number, hookFn: HookFallbackFunction }[],
88
- "completed": { priority: number, hookFn: HookCompletedFunction }[]
89
87
  };
90
88
  private globalErrorHandler: GlobalErrorHandlerFunction|null = null;
91
89
  private routeFallbackHandler: RouteFallbackHandlerFunction|null = null;
@@ -105,7 +103,6 @@ export default class Lambder {
105
103
  "beforeRender": [],
106
104
  "afterRender": [],
107
105
  "fallback": [],
108
- "completed": []
109
106
  };
110
107
  }
111
108
 
@@ -137,7 +134,7 @@ export default class Lambder {
137
134
  };
138
135
 
139
136
  private async handleNoMatchedAction(ctx: RenderContext, resolver: Resolver){
140
- for(const hook of this.hookList["fallback"]){ await hook.hookFn(ctx, resolver); }
137
+ for(const hook of this.hookList["fallback"]){ await hook.hookFn(ctx, resolver); }
141
138
 
142
139
  const isAPI = ctx.path === this.apiPath;
143
140
  if(isAPI && this.apiFallbackHandler){
@@ -170,6 +167,7 @@ export default class Lambder {
170
167
  }else if(condition?.constructor == RegExp){
171
168
  ctx.pathParams = ctx.path.match(condition);
172
169
  }
170
+
173
171
  return await actionFn(ctx, resolver);
174
172
  }
175
173
  });
@@ -230,15 +228,13 @@ export default class Lambder {
230
228
  });
231
229
  };
232
230
 
233
-
234
231
  async addHook(hookEvent: 'created', hookFn: HookCreatedFunction, priority?: number): Promise<void>;
235
232
  async addHook(hookEvent: 'beforeRender', hookFn: HookBeforeRenderFunction, priority?: number): Promise<void>;
236
233
  async addHook(hookEvent: 'afterRender', hookFn: HookAfterRenderFunction, priority?: number): Promise<void>;
237
234
  async addHook(hookEvent: 'fallback', hookFn: HookFallbackFunction, priority?: number): Promise<void>;
238
- async addHook(hookEvent: 'completed', hookFn: HookCompletedFunction, priority?: number): Promise<void>;
239
235
  async addHook(
240
236
  hookEvent:HookEventType,
241
- hookFn: HookCreatedFunction & HookBeforeRenderFunction & HookAfterRenderFunction & HookFallbackFunction & HookCompletedFunction,
237
+ hookFn: HookCreatedFunction & HookBeforeRenderFunction & HookAfterRenderFunction & HookFallbackFunction,
242
238
  priority = 0
243
239
  ): Promise<void> {
244
240
  if(hookEvent === "created"){
@@ -280,23 +276,31 @@ export default class Lambder {
280
276
  resolve:(response: ResolverResponse)=>void,
281
277
  reject:(err: Error)=>void
282
278
  )=> {
283
- const resolver = this.getResolver(resolve, reject);
284
- if(ctx.method === "OPTIONS") return resolver.cors();
285
-
286
- const firstMatchedAction = this.actionList.find(action => action.conditionFn(ctx));
287
- if(firstMatchedAction){
288
- for(const hook of this.hookList["beforeRender"]){ ctx = await hook.hookFn(ctx, resolver); }
289
- let response = await firstMatchedAction.actionFn(ctx, resolver);
290
- for(const hook of this.hookList["afterRender"]){ response = await hook.hookFn(ctx, resolver, response); }
291
- resolve(response);
292
- }else{
293
- return this.handleNoMatchedAction(ctx, resolver);
279
+ try{
280
+ const resolver = this.getResolver(resolve, reject);
281
+ if(ctx.method === "OPTIONS") return resolver.cors();
282
+
283
+ const firstMatchedAction = this.actionList.find(action => action.conditionFn(ctx));
284
+ if(firstMatchedAction){
285
+ for(const hook of this.hookList["beforeRender"]){
286
+ const hookCtx = await hook.hookFn(ctx, resolver);
287
+ if(hookCtx instanceof Error){ throw hookCtx; }
288
+ ctx = hookCtx;
289
+ }
290
+ let response = await firstMatchedAction.actionFn(ctx, resolver);
291
+ for(const hook of this.hookList["afterRender"]){
292
+ const hookResponse = await hook.hookFn(ctx, resolver, response);
293
+ if(hookResponse instanceof Error){ throw hookResponse; }
294
+ response = hookResponse;
295
+ }
296
+ resolve(response);
297
+ }else{
298
+ return this.handleNoMatchedAction(ctx, resolver);
299
+ }
300
+ } catch(err){
301
+ const wrappedError = err instanceof Error ? err : new Error("Error: " + String(err));
302
+ reject(wrappedError);
294
303
  }
295
- }).then(async (response: ResolverResponse):Promise<ResolverResponse> => {
296
- for(const hook of this.hookList["completed"]){ response = await hook.hookFn(response); }
297
- return response;
298
- }).catch((reason: Error)=>{
299
- throw reason;
300
304
  })
301
305
  }catch(err){
302
306
  if(this.globalErrorHandler){