@@ -38,6 +38,32 @@ export interface DataConverter {
38
38
* reason.
39
39
*/
40
40
fromPayloads < T > ( index : number , content ?: Payload [ ] | null ) : Promise < T > ;
41
+
42
+ /**
43
+ * Sync conversion of single payload, used in the Workflow runtime
44
+ */
45
+ toPayloadSync < T > ( value : T ) : Payload ;
46
+
47
+ /**
48
+ * Sync conversion from a single payload, used in the Workflow runtime
49
+ */
50
+ fromPayloadSync < T > ( payload : Payload ) : T ;
51
+ /**
52
+ * Sync conversion of all arguments, used in the Workflow runtime
53
+ *
54
+ * Implements conversion of a list of values.
55
+ *
56
+ * @param values JS values to convert to Payloads.
57
+ * @return converted value
58
+ * @throws DataConverterError if conversion of the value passed as parameter failed for any
59
+ * reason.
60
+ */
61
+ toPayloadsSync ( ...values : unknown [ ] ) : Payload [ ] | undefined ;
62
+
63
+ /**
64
+ * Sync version of {@link fromPayloads}
65
+ */
66
+ fromPayloadsSync < T > ( index : number , content ?: Payload [ ] | null ) : T ;
41
67
}
42
68
43
69
export class CompositeDataConverter implements DataConverter {
@@ -59,6 +85,14 @@ export class CompositeDataConverter implements DataConverter {
59
85
throw new ValueError ( `Cannot serialize ${ value } ` ) ;
60
86
}
61
87
88
+ public toPayloadSync < T > ( value : T ) : Payload {
89
+ for ( const converter of this . converters ) {
90
+ const result = converter . toDataSync ( value ) ;
91
+ if ( result !== undefined ) return result ;
92
+ }
93
+ throw new ValueError ( `Cannot serialize ${ value } ` ) ;
94
+ }
95
+
62
96
public async fromPayload < T > ( payload : Payload ) : Promise < T > {
63
97
if ( payload . metadata === undefined || payload . metadata === null ) {
64
98
throw new ValueError ( 'Missing payload metadata' ) ;
@@ -71,20 +105,47 @@ export class CompositeDataConverter implements DataConverter {
71
105
return await converter . fromData ( payload ) ;
72
106
}
73
107
108
+ public fromPayloadSync < T > ( payload : Payload ) : T {
109
+ if ( payload . metadata === undefined || payload . metadata === null ) {
110
+ throw new ValueError ( 'Missing payload metadata' ) ;
111
+ }
112
+ const encoding = str ( payload . metadata [ METADATA_ENCODING_KEY ] ) ;
113
+ const converter = this . converterByEncoding . get ( encoding ) ;
114
+ if ( converter === undefined ) {
115
+ throw new ValueError ( `Unknown encoding: ${ encoding } ` ) ;
116
+ }
117
+ return converter . fromDataSync ( payload ) ;
118
+ }
119
+
74
120
public async toPayloads ( ...values : unknown [ ] ) : Promise < Payload [ ] | undefined > {
75
121
if ( values . length === 0 ) {
76
122
return undefined ;
77
123
}
78
124
return await Promise . all ( values . map ( ( value ) => this . toPayload ( value ) ) ) ;
79
125
}
80
126
127
+ public toPayloadsSync ( ...values : unknown [ ] ) : Payload [ ] | undefined {
128
+ if ( values . length === 0 ) {
129
+ return undefined ;
130
+ }
131
+ return values . map ( ( value ) => this . toPayloadSync ( value ) ) ;
132
+ }
133
+
81
134
public async fromPayloads < T > ( index : number , payloads ?: Payload [ ] | null ) : Promise < T > {
82
135
// To make adding arguments a backwards compatible change
83
136
if ( payloads === undefined || payloads === null || index >= payloads . length ) {
84
137
return undefined as any ;
85
138
}
86
139
return await this . fromPayload ( payloads [ index ] ) ;
87
140
}
141
+
142
+ public fromPayloadsSync < T > ( index : number , payloads ?: Payload [ ] | null ) : T {
143
+ // To make adding arguments a backwards compatible change
144
+ if ( payloads === undefined || payloads === null || index >= payloads . length ) {
145
+ return undefined as any ;
146
+ }
147
+ return this . fromPayloadSync ( payloads [ index ] ) ;
148
+ }
88
149
}
89
150
90
151
export async function arrayFromPayloads ( converter : DataConverter , content ?: Payload [ ] | null ) : Promise < unknown [ ] > {
@@ -105,6 +166,22 @@ export async function mapToPayloads<K extends string>(
105
166
) as Record < K , Payload > ;
106
167
}
107
168
169
+ export function arrayFromPayloadsSync ( converter : DataConverter , content ?: Payload [ ] | null ) : unknown [ ] {
170
+ if ( ! content ) {
171
+ return [ ] ;
172
+ }
173
+ return content . map ( ( payload : Payload ) => converter . fromPayloadSync ( payload ) ) ;
174
+ }
175
+
176
+ export function mapToPayloadsSync < K extends string > (
177
+ converter : DataConverter ,
178
+ source : Record < K , any >
179
+ ) : Record < K , Payload > {
180
+ return Object . fromEntries (
181
+ Object . entries ( source ) . map ( ( [ k , v ] ) : [ K , Payload ] => [ k as K , converter . toPayloadSync ( v ) ] )
182
+ ) as Record < K , Payload > ;
183
+ }
184
+
108
185
export const defaultDataConverter = new CompositeDataConverter (
109
186
new UndefinedPayloadConverter ( ) ,
110
187
new BinaryPayloadConverter ( ) ,
0 commit comments