unspoken
Version:
Pack network messages more efficiently. Compress keyed objects into keyless arrays. Decompress arrays back into usable objects.
49 lines (37 loc) • 1.54 kB
text/typescript
const METADATA_KEY = Symbol('unspoken:index')
export type PropertyCallback = {(target:object, propertyKey:string):void}
export type NewableAny = {new(...params:any[]):any}
export type Newable<T> = {new(...params:any[]):T}
export type NewableNoArgs<T> = {new():T}
export type IndexAtMeta = {
propertyKey:string,
typeHint?:NewableAny,
isArray:boolean
}
export function getIndexStore(target:object) {
let store:(IndexAtMeta[] | undefined) = Reflect.getOwnMetadata(METADATA_KEY, target)
if (!store) {
store = new Array<IndexAtMeta>()
// If this is the first time we're defining a metadata store for this
// object, get the superclass's metadata first, and merge it into our
// store.
const superStore = Reflect.getMetadata(METADATA_KEY, target)
if (superStore !== undefined && Array.isArray(superStore)) {
store.push(...superStore)
}
Reflect.defineMetadata(METADATA_KEY, store, target)
}
return store
}
export function getIndexingMetas(origin:Object):IndexAtMeta[] {
// This function returns metadata about which fields are
// indexed on an object, and in which order.
// Note: If a class extends an Unspoken object but doesn't
// define any of its own fields, then we need to get indexing
// data from the superclass.
// The following first checks the object for metadata,
// then the superclass, then finally fails gracefully
return Reflect.getOwnMetadata(METADATA_KEY, origin) ??
Reflect.getMetadata(METADATA_KEY, origin) ??
[]
}