@@ -41,11 +41,14 @@ const MUTATING_ACTIONS: [Action, Action, Action] = [
4141 Action . Delete ,
4242] ;
4343
44- export type HandlerSignature = Callable <
44+ export type HandlerSignature < T extends BaseModel > = Callable <
4545 [ Optional < SessionProxy > , any , Dict , LoggerProxy ] ,
46- Promise < ProgressEvent >
46+ Promise < ProgressEvent < T > >
4747> ;
48- export class HandlerSignatures extends Map < Action , HandlerSignature > { }
48+ export class HandlerSignatures < T extends BaseModel > extends Map <
49+ Action ,
50+ HandlerSignature < T >
51+ > { }
4952class HandlerEvents extends Map < Action , string | symbol > { }
5053
5154/**
@@ -69,8 +72,8 @@ function ensureSerialize<T extends BaseModel>(toResponse = false): MethodDecorat
6972 descriptor . value = async function (
7073 event : any | Dict ,
7174 context : any
72- ) : Promise < ProgressEvent | CfnResponse < T > > {
73- const progress : ProgressEvent = await originalMethod . apply ( this , [
75+ ) : Promise < ProgressEvent < T > | CfnResponse < T > > {
76+ const progress : ProgressEvent < T > = await originalMethod . apply ( this , [
7477 event ,
7578 context ,
7679 ] ) ;
@@ -106,12 +109,12 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
106109 private providerEventsLogger : CloudWatchLogPublisher | S3LogPublisher ;
107110
108111 constructor (
109- public typeName : string ,
110- private modelCls : Constructor < T > ,
111- private handlers ?: HandlerSignatures
112+ public readonly typeName : string ,
113+ public readonly modelTypeReference : Constructor < T > ,
114+ private handlers ?: HandlerSignatures < T >
112115 ) {
113116 this . typeName = typeName || '' ;
114- this . handlers = handlers || new HandlerSignatures ( ) ;
117+ this . handlers = handlers || new HandlerSignatures < T > ( ) ;
115118
116119 this . lambdaLogger = console ;
117120
@@ -256,7 +259,10 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
256259 }
257260 }
258261
259- public addHandler = ( action : Action , f : HandlerSignature ) : HandlerSignature => {
262+ public addHandler = (
263+ action : Action ,
264+ f : HandlerSignature < T >
265+ ) : HandlerSignature < T > => {
260266 this . handlers . set ( action , f ) ;
261267 return f ;
262268 } ;
@@ -266,24 +272,24 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
266272 request : BaseResourceHandlerRequest < T > ,
267273 action : Action ,
268274 callbackContext : Dict
269- ) : Promise < ProgressEvent > => {
270- const handle : HandlerSignature = this . handlers . get ( action ) ;
271- if ( ! handle ) {
272- return ProgressEvent . failed (
273- HandlerErrorCode . InternalFailure ,
274- `No handler for ${ action } `
275- ) ;
275+ ) : Promise < ProgressEvent < T > > => {
276+ const actionName = action == null ? '<null>' : action . toString ( ) ;
277+ if ( ! this . handlers . has ( action ) ) {
278+ throw new Error ( `Unknown action ${ actionName } ` ) ;
276279 }
280+ const handle : HandlerSignature < T > = this . handlers . get ( action ) ;
277281 // We will make the callback context and resource states readonly
278282 // to avoid modification at a later time
279283 deepFreeze ( callbackContext ) ;
280284 deepFreeze ( request ) ;
285+ this . log ( `[${ action } ] invoking handler...` ) ;
281286 const progress = await handle (
282287 session ,
283288 request ,
284289 callbackContext ,
285290 this . loggerProxy
286291 ) ;
292+ this . log ( `[${ action } ] handler invoked` ) ;
287293 const isInProgress = progress . status === OperationStatus . InProgress ;
288294 const isMutable = MUTATING_ACTIONS . some ( ( x ) => x === action ) ;
289295 if ( isInProgress && ! isMutable ) {
@@ -310,7 +316,7 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
310316 ) ;
311317 }
312318 request = UnmodeledRequest . deserialize ( event . request ) . toModeled < T > (
313- this . modelCls
319+ this . modelTypeReference
314320 ) ;
315321
316322 this . callerSession = SessionProxy . getSession ( creds , event . region ) ;
@@ -327,15 +333,18 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
327333 // @ts -ignore
328334 public async testEntrypoint (
329335 eventData : any | Dict ,
330- context : any
331- ) : Promise < ProgressEvent > ;
336+ context ? : any
337+ ) : Promise < ProgressEvent < T > > ;
332338 @boundMethod
333339 @ensureSerialize < T > ( )
334- public async testEntrypoint ( eventData : Dict , context : any ) : Promise < ProgressEvent > {
340+ public async testEntrypoint (
341+ eventData : Dict ,
342+ context ?: any
343+ ) : Promise < ProgressEvent < T > > {
335344 let msg = 'Uninitialized' ;
336- let progress : ProgressEvent ;
345+ let progress : ProgressEvent < T > ;
337346 try {
338- if ( ! this . modelCls ) {
347+ if ( ! this . modelTypeReference ) {
339348 throw new exceptions . InternalFailure (
340349 'Missing Model class to be used to deserialize JSON data.'
341350 ) ;
@@ -356,11 +365,14 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
356365 err . stack = `${ new Error ( ) . stack } \n${ err . stack } ` ;
357366 if ( err instanceof BaseHandlerException ) {
358367 this . log ( `Handler error: ${ err . message } ` , err ) ;
359- progress = err . toProgressEvent ( ) ;
368+ progress = err . toProgressEvent < T > ( ) ;
360369 } else {
361370 this . log ( `Exception caught: ${ err . message } ` , err ) ;
362371 msg = err . message || msg ;
363- progress = ProgressEvent . failed ( HandlerErrorCode . InternalFailure , msg ) ;
372+ progress = ProgressEvent . failed < ProgressEvent < T > > (
373+ HandlerErrorCode . InternalFailure ,
374+ msg
375+ ) ;
364376 }
365377 }
366378 return Promise . resolve ( progress ) ;
@@ -411,7 +423,7 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
411423 logicalResourceIdentifier : request . requestData . logicalResourceId ,
412424 region : request . region ,
413425 } ) ;
414- return unmodeled . toModeled < T > ( this . modelCls ) ;
426+ return unmodeled . toModeled < T > ( this . modelTypeReference ) ;
415427 } catch ( err ) {
416428 this . log ( 'Invalid request' ) ;
417429 throw new InvalidRequest ( `${ err } (${ err . name } )` ) ;
@@ -428,11 +440,11 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
428440 public async entrypoint (
429441 eventData : Dict ,
430442 context : LambdaContext
431- ) : Promise < ProgressEvent > {
432- let progress : ProgressEvent ;
443+ ) : Promise < ProgressEvent < T > > {
444+ let progress : ProgressEvent < T > ;
433445 let bearerToken : string ;
434446 try {
435- if ( ! this . modelCls ) {
447+ if ( ! this . modelTypeReference ) {
436448 throw new exceptions . InternalFailure (
437449 'Missing Model class to be used to deserialize JSON data.'
438450 ) ;
@@ -495,10 +507,10 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
495507 err . stack = `${ new Error ( ) . stack } \n${ err . stack } ` ;
496508 if ( err instanceof BaseHandlerException ) {
497509 this . log ( `Handler error: ${ err . message } ` , err ) ;
498- progress = err . toProgressEvent ( ) ;
510+ progress = err . toProgressEvent < T > ( ) ;
499511 } else {
500512 this . log ( `Exception caught: ${ err . message } ` , err ) ;
501- progress = ProgressEvent . failed (
513+ progress = ProgressEvent . failed < ProgressEvent < T > > (
502514 HandlerErrorCode . InternalFailure ,
503515 err . message
504516 ) ;
0 commit comments