UNPKG

superbuffer

Version:

A simple way to serialize JavaScript objects into ArrayBuffers for high compression on the wire.

43 lines (42 loc) 1.86 kB
import type { Model } from './model'; import type { Schema } from './schema'; /** * The string prefix name of a TypedArray. */ export type TypedArrayName = 'Uint8' | 'Uint16' | 'Uint32' | 'Int8' | 'Int16' | 'Int32' | 'Float32' | 'Float64' | 'BigInt64' | 'BigUint64'; /** * A type that can be serialized into ArrayBuffer. */ export type Serializable = string | number | bigint | boolean; /** * Defines a TypedArray within an ArrayBuffer. */ export type BufferView<T extends Serializable = Serializable> = { readonly type: T extends string ? 'String' : T extends boolean ? 'Boolean' : T extends number ? 'Uint8' | 'Uint16' | 'Uint32' | 'Int8' | 'Int16' | 'Int32' | 'Float32' | 'Float64' : 'BigInt64' | 'BigUint64'; readonly bytes: number; }; /** * A BufferView, BufferView array, Schema, or Schema array. */ export type BufferViewOrSchema = BufferView | [BufferView] | Schema | [Schema]; /** * Defines a BufferSchema. */ export type SchemaDefinition<T> = { [K in keyof T]: T[K] extends BufferViewOrSchema ? T[K] : T[K] extends Record<string, unknown> ? SchemaDefinition<T[K]> : never; }; /** * Extracts the plain object representation of the schema definition. */ export type SchemaObject<T> = { [K in keyof T]: T[K] extends BufferView<infer U> ? U : T[K] extends BufferView<infer U>[] ? U[] : T[K] extends Schema<infer U> ? SchemaObject<U> : T[K] extends Schema<infer U>[] ? SchemaObject<U>[] : T[K] extends Record<string, unknown> ? SchemaObject<T[K]> : never; }; export type SchemaData<T> = SchemaObject<T> | SchemaObject<T>[]; /** * Extract the SchemaDefinition type from a Model. */ export type ExtractSchemaDefinition<T> = T extends Model<infer U> ? SchemaDefinition<U> : never; /** * Extract the SchemaObject type from a Model. */ export type ExtractSchemaObject<T> = T extends Model<infer U> ? SchemaObject<U> : never;