@@ -388,21 +388,14 @@ export class FieldEncryptionExecutorTransform implements FieldTransform {
388
388
encryptedDek = await kmsClient . encrypt ( rawDek )
389
389
}
390
390
const newVersion = isExpired ? dek ! . version ! + 1 : null
391
- const newDekId : DekId = {
392
- kekName : this . kekName ,
393
- subject : ctx . subject ,
394
- version : newVersion ,
395
- algorithm : this . cryptor . dekFormat ,
396
- deleted : isRead ,
397
- }
398
- // encryptedDek may be passed as null if kek is shared
399
- dek = await this . storeDekToRegistry ( newDekId , encryptedDek )
400
- if ( dek == null ) {
401
- // handle conflicts (409)
402
- dek = await this . retrieveDekFromRegistry ( dekId )
403
- }
404
- if ( dek == null ) {
405
- throw new RuleError ( `no dek found for ${ this . kekName } during produce` )
391
+ try {
392
+ dek = await this . createDek ( dekId , newVersion , encryptedDek )
393
+ } catch ( err ) {
394
+ if ( dek == null ) {
395
+ throw err ;
396
+ }
397
+ console . warn ( "failed to create dek for %s, subject %s, version %d, using existing dek" ,
398
+ this . kekName , ctx . subject , newVersion )
406
399
}
407
400
}
408
401
@@ -419,6 +412,27 @@ export class FieldEncryptionExecutorTransform implements FieldTransform {
419
412
return dek
420
413
}
421
414
415
+ async createDek ( dekId : DekId , newVersion : number | null , encryptedDek : Buffer | null ) : Promise < Dek > {
416
+ const newDekId : DekId = {
417
+ kekName : dekId . kekName ,
418
+ subject : dekId . subject ,
419
+ version : newVersion ,
420
+ algorithm : dekId . algorithm ,
421
+ deleted : dekId . deleted ,
422
+ }
423
+ // encryptedDek may be passed as null if kek is shared
424
+ let dek = await this . storeDekToRegistry ( newDekId , encryptedDek )
425
+ if ( dek == null ) {
426
+ // handle conflicts (409)
427
+ dek = await this . retrieveDekFromRegistry ( dekId )
428
+ }
429
+ if ( dek == null ) {
430
+ throw new RuleError ( `no dek found for ${ dekId . kekName } during produce` )
431
+ }
432
+
433
+ return dek
434
+ }
435
+
422
436
async retrieveDekFromRegistry ( key : DekId ) : Promise < Dek | null > {
423
437
try {
424
438
let dek : Dek
0 commit comments