in packages/dubbo/src/protocol/async-iterable.ts [784:838]
export function transformSerializeEnvelope<T>(
serialization: Serialization<T>
): AsyncIterableTransform<T, EnvelopedMessage>;
/**
* Creates an AsyncIterableTransform that takes a value or special end type, and
* serializes it as an enveloped message.
*
* For example, a source with { end: true, value: ... } is serialized using
* the given endSerialization, and the resulting enveloped message has the
* given endStreamFlag.
*
* A source with { end: false, value: ... } is serialized using the given
* serialization, and the resulting enveloped message does not have the given
* endStreamFlag.
*
* @private Internal code, does not follow semantic versioning.
*/
export function transformSerializeEnvelope<T, E>(
serialization: Serialization<T>,
endStreamFlag: number,
endSerialization: Serialization<E>
): AsyncIterableTransform<ParsedEnvelopedMessage<T, E>, EnvelopedMessage>;
export function transformSerializeEnvelope<T, E>(
serialization: Serialization<T>,
endStreamFlag?: number,
endSerialization?: Serialization<E>
):
| AsyncIterableTransform<T, EnvelopedMessage>
| AsyncIterableTransform<ParsedEnvelopedMessage<T, E>, EnvelopedMessage> {
if (endStreamFlag === undefined || endSerialization === undefined) {
return async function* (
iterable: AsyncIterable<T>
): AsyncIterable<EnvelopedMessage> {
for await (const chunk of iterable) {
const data = serialization.serialize(chunk);
yield { flags: 0, data };
}
};
}
return async function* (
iterable: AsyncIterable<ParsedEnvelopedMessage<T, E>>
): AsyncIterable<EnvelopedMessage> {
for await (const chunk of iterable) {
let data: Uint8Array;
let flags = 0;
if (chunk.end) {
flags = flags | endStreamFlag;
data = endSerialization.serialize(chunk.value);
} else {
data = serialization.serialize(chunk.value);
}
yield { flags, data };
}
};
}