1
- /**
2
- * Abstract class for batch processors
3
- */
4
- import {
1
+ import type {
5
2
BaseRecord ,
6
3
BatchProcessingOptions ,
7
4
EventSourceDataClassTypes ,
8
5
FailureResponse ,
9
6
ResultType ,
10
7
SuccessResponse ,
11
- } from '.' ;
8
+ } from './types ' ;
12
9
10
+ /**
11
+ * Abstract class for batch processors.
12
+ */
13
13
abstract class BasePartialProcessor {
14
14
public exceptions : Error [ ] ;
15
15
@@ -34,6 +34,40 @@ abstract class BasePartialProcessor {
34
34
this . handler = new Function ( ) ;
35
35
}
36
36
37
+ /**
38
+ * Call instance's handler for each record
39
+ * @returns List of processed records
40
+ */
41
+ public async asyncProcess ( ) : Promise < ( SuccessResponse | FailureResponse ) [ ] > {
42
+ /**
43
+ * If this is an sync processor, user should have called process instead,
44
+ * so we call the method early to throw the error early thus failing fast.
45
+ */
46
+ if ( this . constructor . name === 'BatchProcessor' ) {
47
+ await this . asyncProcessRecord ( this . records [ 0 ] ) ;
48
+ }
49
+ this . prepare ( ) ;
50
+
51
+ const processingPromises : Promise < SuccessResponse | FailureResponse > [ ] =
52
+ this . records . map ( ( record ) => this . asyncProcessRecord ( record ) ) ;
53
+
54
+ const processedRecords : ( SuccessResponse | FailureResponse ) [ ] =
55
+ await Promise . all ( processingPromises ) ;
56
+
57
+ this . clean ( ) ;
58
+
59
+ return processedRecords ;
60
+ }
61
+
62
+ /**
63
+ * Process a record with an asyncronous handler
64
+ *
65
+ * @param record Record to be processed
66
+ */
67
+ public abstract asyncProcessRecord (
68
+ record : BaseRecord
69
+ ) : Promise < SuccessResponse | FailureResponse > ;
70
+
37
71
/**
38
72
* Clean class instance after processing
39
73
*/
@@ -50,7 +84,6 @@ abstract class BasePartialProcessor {
50
84
exception : Error
51
85
) : FailureResponse {
52
86
const entry : FailureResponse = [ 'fail' , exception . message , record ] ;
53
- // console.debug('Record processing exception: ' + exception.message);
54
87
this . exceptions . push ( exception ) ;
55
88
this . failureMessages . push ( record ) ;
56
89
@@ -66,12 +99,19 @@ abstract class BasePartialProcessor {
66
99
* Call instance's handler for each record
67
100
* @returns List of processed records
68
101
*/
69
- public async process ( ) : Promise < ( SuccessResponse | FailureResponse ) [ ] > {
102
+ public process ( ) : ( SuccessResponse | FailureResponse ) [ ] {
103
+ /**
104
+ * If this is an async processor, user should have called processAsync instead,
105
+ * so we call the method early to throw the error early thus failing fast.
106
+ */
107
+ if ( this . constructor . name === 'AsyncBatchProcessor' ) {
108
+ this . processRecord ( this . records [ 0 ] ) ;
109
+ }
70
110
this . prepare ( ) ;
71
111
72
112
const processedRecords : ( SuccessResponse | FailureResponse ) [ ] = [ ] ;
73
113
for ( const record of this . records ) {
74
- processedRecords . push ( await this . processRecord ( record ) ) ;
114
+ processedRecords . push ( this . processRecord ( record ) ) ;
75
115
}
76
116
77
117
this . clean ( ) ;
@@ -85,7 +125,7 @@ abstract class BasePartialProcessor {
85
125
*/
86
126
public abstract processRecord (
87
127
record : BaseRecord
88
- ) : Promise < SuccessResponse | FailureResponse > ;
128
+ ) : SuccessResponse | FailureResponse ;
89
129
90
130
/**
91
131
* Set class instance attributes before execution
0 commit comments