import { Delta } from 'jsondiffpatch'; import { KeyOfValueWithType } from 'tslang'; import { IContext } from '../context'; import { AccessRight, ISyncable, ISyncableObject, RefDictToSyncableObjectDict, SyncableContainer, SyncableRef } from '../syncable'; import { NumericTimestamp } from '../types'; import { ChangePacket, ChangePacketId, GeneralChange, IChange, SyncableCreationRef } from './change'; export declare type RefDictToSyncableOrCreationRefDict = T extends object ? { [TName in KeyOfValueWithType, SyncableRef>]: NonNullable extends SyncableRef ? TSyncableObject['syncable'] | (undefined extends T[TName] ? undefined : never) : never; } & { [TName in KeyOfValueWithType, SyncableRef[]>]: NonNullable extends SyncableRef[] ? TSyncableObject['syncable'][] | (undefined extends T[TName] ? undefined : never) : never; } & { [TName in KeyOfValueWithType, SyncableCreationRef>]: T[TName]; } : never; declare type ChangeToSyncableObjectRefDict = RefDictToSyncableObjectDict; declare type ChangeToSyncableOrCreationRefDict = RefDictToSyncableOrCreationRefDict; export interface ChangePlantProcessingResultUpdateItem { delta: Delta; snapshot: ISyncable; } export interface ChangePlantProcessingResult { id: ChangePacketId; creations: ISyncable[]; updates: ChangePlantProcessingResultUpdateItem[]; removals: SyncableRef[]; notifications: unknown[]; changes: GeneralChange[]; } export interface ChangePlantProcessingResultWithClock extends ChangePlantProcessingResult { clock: number; } export declare type ChangePlantProcessorCreateOperation = (creation: ISyncable) => void; export declare type ChangePlantProcessorRemoveOperation = (object: ISyncableObject) => void; export declare type ChangePlantProcessorIsBeingRemovedTest = (object: ISyncableObject) => boolean; export declare type ChangePlantProcessorGrantOperation = (object: TSyncableObject, fieldNames: Extract[], rights: AccessRight[]) => void; export declare type ChangePlantProcessorAbortOperation = () => void; export declare type ChangePlantProcessorChangeOperation = (change: TChange) => void; export declare type ChangePlantProcessorPrepareOperation = (object: T) => T['syncable']; export declare type ChangePlantProcessorNotifyOperation = (notification: TNotification) => void; export interface ChangePlantProcessorExtra { context: TGenericParams['context']; container: SyncableContainer; type: TSpecificChange['type']; refs: TSpecificChange['refs']; options: TSpecificChange['options']; create: ChangePlantProcessorCreateOperation; remove: ChangePlantProcessorRemoveOperation; isBeingRemoved: ChangePlantProcessorIsBeingRemovedTest; grant: ChangePlantProcessorGrantOperation; prepare: ChangePlantProcessorPrepareOperation; abort: ChangePlantProcessorAbortOperation; change: ChangePlantProcessorChangeOperation; notify: ChangePlantProcessorNotifyOperation; createdAt: NumericTimestamp; } export declare type ChangePlantResolver = (syncables: ChangeToSyncableOrCreationRefDict, options: TGenericParams['change']['options']) => SyncableRef[]; declare type ChangePlantSpecificResolver = ChangePlantResolver<{ context: TGenericParams['context']; syncableObject: TGenericParams['syncableObject']; change: Extract; notification: TGenericParams['notification']; }>; export declare type ChangePlantProcessor = (syncables: ChangeToSyncableOrCreationRefDict, objects: ChangeToSyncableObjectRefDict, extra: ChangePlantProcessorExtra) => void; declare type ChangePlantSpecificProcessor = ChangePlantProcessor<{ context: TGenericParams['context']; syncableObject: TGenericParams['syncableObject']; change: TGenericParams['change']; notification: TGenericParams['notification']; }, Extract>; export interface ChangePlantProcessorOptions { processor: ChangePlantProcessor; resolver: ChangePlantResolver; } interface ChangePlantSpecificProcessorOptions { processor: ChangePlantSpecificProcessor; resolver: ChangePlantSpecificResolver; } export declare type ChangePlantBlueprint = { [TType in TGenericParams['change']['type']]: ChangePlantSpecificProcessor | ChangePlantSpecificProcessorOptions; }; export interface IChangePlantBlueprintGenericParams { context: IContext; syncableObject: ISyncableObject; change: IChange; notification: unknown; } export interface GeneralChangePlantBlueprintGenericParams extends IChangePlantBlueprintGenericParams { change: GeneralChange; } export declare type ChangePlantResolveSyncableLoader = (refs: SyncableRef[]) => Promise; export declare class ChangePlant { private blueprint; constructor(blueprint: ChangePlantBlueprint); resolve({ type, refs: refDict, options }: ChangePacket, syncables: ISyncable[]): SyncableRef[]; process(packet: ChangePacket, context: IContext, container: SyncableContainer): ChangePlantProcessingResult; process(packet: ChangePacket, context: IContext, container: SyncableContainer, clock: number): ChangePlantProcessingResultWithClock; } export {};