import { TextDecoderEsque } from '../internals/esque.js';
import { serialized, TsonBranded, TsonTypeTesterCustom, TsonType } from '../sync/syncTypes.js';
import { TsonStreamInterruptedError } from './asyncErrors.js';
import '../errors.js';

type TsonAsyncStringifierIterable<TValue> = AsyncIterable<string> & {
    [serialized]: TValue;
};
type BrandSerialized<TType, TValue> = TType & {
    [serialized]: TValue;
};
type TsonAsyncStringifier = <TValue>(value: TValue, space?: number) => TsonAsyncStringifierIterable<TValue>;
type TsonAsyncIndex = TsonBranded<number, "AsyncRegistered">;
interface TsonTransformerSerializeDeserializeAsync<TValue, TSerializedValue> {
    async: true;
    /**
     * From JSON-serializable value
     */
    deserialize: (opts: {
        /**
         * Close the controller for the ReadableStream of values
         */
        close: () => void;
        /**
         * Reader for the ReadableStream of values
         */
        reader: ReadableStreamDefaultReader<TSerializedValue | TsonStreamInterruptedError>;
    }) => TValue;
    /**
     * The key to use when serialized
     */
    key: string;
    /**
     * JSON-serializable value
     */
    serializeIterator: (opts: {
        /**
         * The value we're serializing
         */
        value: TValue;
    }) => AsyncIterable<TSerializedValue>;
}
interface TsonAsyncType<TValue, TSerializedValue> extends TsonTransformerSerializeDeserializeAsync<TValue, TSerializedValue>, TsonTypeTesterCustom {
}
interface TsonAsyncOptions {
    /**
     * The nonce function every time we start serializing a new object
     * Should return a unique value every time it's called
     * @default `${crypto.randomUUID} if available, otherwise a random string generated by Math.random`
     */
    nonce?: () => number | string;
    /**
     * Customize a text decoder if your runtime doesn't support the `TextDecoder` API
     * @default TextDecoder
     */
    textDecoder?: TextDecoderEsque;
    /**
     * The list of types to use
     */
    types: (TsonAsyncType<any, any> | TsonType<any, any> | TsonType<any, never>)[];
}

export { BrandSerialized, TsonAsyncIndex, TsonAsyncOptions, TsonAsyncStringifier, TsonAsyncStringifierIterable, TsonAsyncType, TsonTransformerSerializeDeserializeAsync };
