import { KeyOfValueWithType } from 'tslang'; import { ISyncable, SyncableRef } from './syncable'; import { ISyncableAdapter } from './syncable-adapter'; import { ISyncableObject } from './syncable-object'; declare type RefDictToSyncableDict = { [TName in keyof TRefDict]: TRefDict[TName] extends ISyncableObject ? TRefDict[TName]['syncable'] : TRefDict[TName] extends ISyncableObject[] ? TRefDict[TName][number]['syncable'] : never; }; export declare type RefDictToSyncableObjectDict = T extends object ? { [TName in KeyOfValueWithType, SyncableRef>]: NonNullable extends SyncableRef ? TSyncableObject | (undefined extends T[TName] ? undefined : never) : never; } & { [TName in KeyOfValueWithType, SyncableRef[]>]: NonNullable extends SyncableRef[] ? TSyncableObject[] | (undefined extends T[TName] ? undefined : never) : never; } : never; export declare class SyncableContainer { readonly adapter: ISyncableAdapter; private typeToIdToSyncableMapMap; private typeToIdToSyncableObjectMapMap; constructor(adapter: ISyncableAdapter); buildSyncableDict(refDict: TRefDict): RefDictToSyncableDict; buildSyncableObjectDict(refDict: TRefDict): RefDictToSyncableObjectDict; getSyncables(type?: TType): Extract[]; getSyncable({ type, id, }: TRef): Extract['syncable'] | undefined; requireSyncable(ref: TRef): Extract['syncable']; existsSyncable({ type, id }: SyncableRef): boolean; getSyncableObjects(type?: TType): Extract[]; getSyncableObject(ref: TRef): Extract | undefined; requireSyncableObject(ref: TRef): Extract; /** * Add a syncable, please notice that it won't change the reference of the * originally stored syncable. Instead, differences will be applied to it. */ addSyncable(snapshot: ISyncable, clock?: number): void; updateMatchingSyncable(snapshot: ISyncable, clock?: number): void; removeSyncable({ type, id }: SyncableRef): void; clear(): void; } export {};