@@ -100,6 +100,25 @@ export function mapFromPayloads<K extends string, T = unknown>(
100
100
) as Record < K , T > ;
101
101
}
102
102
103
+ export declare const rawPayloadTypeBrand : unique symbol ;
104
+ /**
105
+ * RawValue is a wrapper over a payload.
106
+ * A payload that belongs to a RawValue is special in that it bypasses user-defined payload converters,
107
+ * instead using the default payload converter. The payload still undergoes codec conversion.
108
+ */
109
+ export class RawValue < T = unknown > {
110
+ private readonly _payload : Payload ;
111
+ private readonly [ rawPayloadTypeBrand ] : T = undefined as T ;
112
+
113
+ constructor ( value : T , payloadConverter : PayloadConverter = defaultPayloadConverter ) {
114
+ this . _payload = payloadConverter . toPayload ( value ) ;
115
+ }
116
+
117
+ get payload ( ) : Payload {
118
+ return this . _payload ;
119
+ }
120
+ }
121
+
103
122
export interface PayloadConverterWithEncoding {
104
123
/**
105
124
* Converts a value to a {@link Payload}.
@@ -143,6 +162,9 @@ export class CompositePayloadConverter implements PayloadConverter {
143
162
* Returns the first successful result, throws {@link ValueError} if there is no converter that can handle the value.
144
163
*/
145
164
public toPayload < T > ( value : T ) : Payload {
165
+ if ( value instanceof RawValue ) {
166
+ return value . payload ;
167
+ }
146
168
for ( const converter of this . converters ) {
147
169
const result = converter . toPayload ( value ) ;
148
170
if ( result !== undefined ) {
@@ -160,6 +182,7 @@ export class CompositePayloadConverter implements PayloadConverter {
160
182
if ( payload . metadata === undefined || payload . metadata === null ) {
161
183
throw new ValueError ( 'Missing payload metadata' ) ;
162
184
}
185
+
163
186
const encoding = decode ( payload . metadata [ METADATA_ENCODING_KEY ] ) ;
164
187
const converter = this . converterByEncoding . get ( encoding ) ;
165
188
if ( converter === undefined ) {
0 commit comments