UNPKG

tupleson

Version:

A hackable JSON serializer/deserializer

85 lines (77 loc) 2.01 kB
import { TextDecoderEsque } from "../internals/esque.js"; import { TsonBranded, TsonType, TsonTypeTesterCustom, serialized, } from "../sync/syncTypes.js"; import { TsonStreamInterruptedError } from "./asyncErrors.js"; export type TsonAsyncStringifierIterable<TValue> = AsyncIterable<string> & { [serialized]: TValue; }; export type BrandSerialized<TType, TValue> = TType & { [serialized]: TValue; }; export type TsonAsyncStringifier = <TValue>( value: TValue, space?: number, ) => TsonAsyncStringifierIterable<TValue>; export type TsonAsyncIndex = TsonBranded<number, "AsyncRegistered">; export 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>; } export interface TsonAsyncType<TValue, TSerializedValue> extends TsonTransformerSerializeDeserializeAsync<TValue, TSerializedValue>, TsonTypeTesterCustom {} export 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> )[]; }