@@ -41,11 +41,14 @@ const MUTATING_ACTIONS: [Action, Action, Action] = [
41
41
Action . Delete ,
42
42
] ;
43
43
44
- export type HandlerSignature = Callable <
44
+ export type HandlerSignature < T extends BaseModel > = Callable <
45
45
[ Optional < SessionProxy > , any , Dict , LoggerProxy ] ,
46
- Promise < ProgressEvent >
46
+ Promise < ProgressEvent < T > >
47
47
> ;
48
- export class HandlerSignatures extends Map < Action , HandlerSignature > { }
48
+ export class HandlerSignatures < T extends BaseModel > extends Map <
49
+ Action ,
50
+ HandlerSignature < T >
51
+ > { }
49
52
class HandlerEvents extends Map < Action , string | symbol > { }
50
53
51
54
/**
@@ -69,8 +72,8 @@ function ensureSerialize<T extends BaseModel>(toResponse = false): MethodDecorat
69
72
descriptor . value = async function (
70
73
event : any | Dict ,
71
74
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 , [
74
77
event ,
75
78
context ,
76
79
] ) ;
@@ -106,12 +109,12 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
106
109
private providerEventsLogger : CloudWatchLogPublisher | S3LogPublisher ;
107
110
108
111
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 >
112
115
) {
113
116
this . typeName = typeName || '' ;
114
- this . handlers = handlers || new HandlerSignatures ( ) ;
117
+ this . handlers = handlers || new HandlerSignatures < T > ( ) ;
115
118
116
119
this . lambdaLogger = console ;
117
120
@@ -256,7 +259,10 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
256
259
}
257
260
}
258
261
259
- public addHandler = ( action : Action , f : HandlerSignature ) : HandlerSignature => {
262
+ public addHandler = (
263
+ action : Action ,
264
+ f : HandlerSignature < T >
265
+ ) : HandlerSignature < T > => {
260
266
this . handlers . set ( action , f ) ;
261
267
return f ;
262
268
} ;
@@ -266,24 +272,24 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
266
272
request : BaseResourceHandlerRequest < T > ,
267
273
action : Action ,
268
274
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 } ` ) ;
276
279
}
280
+ const handle : HandlerSignature < T > = this . handlers . get ( action ) ;
277
281
// We will make the callback context and resource states readonly
278
282
// to avoid modification at a later time
279
283
deepFreeze ( callbackContext ) ;
280
284
deepFreeze ( request ) ;
285
+ this . log ( `[${ action } ] invoking handler...` ) ;
281
286
const progress = await handle (
282
287
session ,
283
288
request ,
284
289
callbackContext ,
285
290
this . loggerProxy
286
291
) ;
292
+ this . log ( `[${ action } ] handler invoked` ) ;
287
293
const isInProgress = progress . status === OperationStatus . InProgress ;
288
294
const isMutable = MUTATING_ACTIONS . some ( ( x ) => x === action ) ;
289
295
if ( isInProgress && ! isMutable ) {
@@ -310,7 +316,7 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
310
316
) ;
311
317
}
312
318
request = UnmodeledRequest . deserialize ( event . request ) . toModeled < T > (
313
- this . modelCls
319
+ this . modelTypeReference
314
320
) ;
315
321
316
322
this . callerSession = SessionProxy . getSession ( creds , event . region ) ;
@@ -327,15 +333,18 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
327
333
// @ts -ignore
328
334
public async testEntrypoint (
329
335
eventData : any | Dict ,
330
- context : any
331
- ) : Promise < ProgressEvent > ;
336
+ context ? : any
337
+ ) : Promise < ProgressEvent < T > > ;
332
338
@boundMethod
333
339
@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 > > {
335
344
let msg = 'Uninitialized' ;
336
- let progress : ProgressEvent ;
345
+ let progress : ProgressEvent < T > ;
337
346
try {
338
- if ( ! this . modelCls ) {
347
+ if ( ! this . modelTypeReference ) {
339
348
throw new exceptions . InternalFailure (
340
349
'Missing Model class to be used to deserialize JSON data.'
341
350
) ;
@@ -356,11 +365,14 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
356
365
err . stack = `${ new Error ( ) . stack } \n${ err . stack } ` ;
357
366
if ( err instanceof BaseHandlerException ) {
358
367
this . log ( `Handler error: ${ err . message } ` , err ) ;
359
- progress = err . toProgressEvent ( ) ;
368
+ progress = err . toProgressEvent < T > ( ) ;
360
369
} else {
361
370
this . log ( `Exception caught: ${ err . message } ` , err ) ;
362
371
msg = err . message || msg ;
363
- progress = ProgressEvent . failed ( HandlerErrorCode . InternalFailure , msg ) ;
372
+ progress = ProgressEvent . failed < ProgressEvent < T > > (
373
+ HandlerErrorCode . InternalFailure ,
374
+ msg
375
+ ) ;
364
376
}
365
377
}
366
378
return Promise . resolve ( progress ) ;
@@ -411,7 +423,7 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
411
423
logicalResourceIdentifier : request . requestData . logicalResourceId ,
412
424
region : request . region ,
413
425
} ) ;
414
- return unmodeled . toModeled < T > ( this . modelCls ) ;
426
+ return unmodeled . toModeled < T > ( this . modelTypeReference ) ;
415
427
} catch ( err ) {
416
428
this . log ( 'Invalid request' ) ;
417
429
throw new InvalidRequest ( `${ err } (${ err . name } )` ) ;
@@ -428,11 +440,11 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
428
440
public async entrypoint (
429
441
eventData : Dict ,
430
442
context : LambdaContext
431
- ) : Promise < ProgressEvent > {
432
- let progress : ProgressEvent ;
443
+ ) : Promise < ProgressEvent < T > > {
444
+ let progress : ProgressEvent < T > ;
433
445
let bearerToken : string ;
434
446
try {
435
- if ( ! this . modelCls ) {
447
+ if ( ! this . modelTypeReference ) {
436
448
throw new exceptions . InternalFailure (
437
449
'Missing Model class to be used to deserialize JSON data.'
438
450
) ;
@@ -495,10 +507,10 @@ export abstract class BaseResource<T extends BaseModel = BaseModel> {
495
507
err . stack = `${ new Error ( ) . stack } \n${ err . stack } ` ;
496
508
if ( err instanceof BaseHandlerException ) {
497
509
this . log ( `Handler error: ${ err . message } ` , err ) ;
498
- progress = err . toProgressEvent ( ) ;
510
+ progress = err . toProgressEvent < T > ( ) ;
499
511
} else {
500
512
this . log ( `Exception caught: ${ err . message } ` , err ) ;
501
- progress = ProgressEvent . failed (
513
+ progress = ProgressEvent . failed < ProgressEvent < T > > (
502
514
HandlerErrorCode . InternalFailure ,
503
515
err . message
504
516
) ;
0 commit comments