@state-weaver/interface
Version:
An interface for the State Weaver library, enabling seamless synchronization of JavaScript objects with CRDTs such as Yjs, Json-Joy, etc
49 lines (46 loc) • 2.24 kB
TypeScript
import { JsonObject } from 'type-fest';
import { Patches } from 'mutative';
type NoChangeUpdateResult = {
changed: false;
};
type ChangeUpdateResult<T, U> = {
changed: true;
oldState: T;
newState: T;
patches: Patches;
update: U;
};
type UpdateResult<T, U> = ChangeUpdateResult<T, U> | NoChangeUpdateResult;
type NoChangeApplyUpdateResult = {
changed: false;
};
type ChangeApplyUpdateResult<T> = {
changed: true;
oldState: T;
newState: T;
patches: Patches;
};
type ApplyUpdateResult<T> = ChangeApplyUpdateResult<T> | NoChangeApplyUpdateResult;
type NoChangeFromObjectResult<T extends JsonObject, U, D, Wrapper extends CRDTWrapper<T, U, D> = CRDTWrapper<T, U, D>> = {
changed: false;
wrapper: Wrapper;
state: T;
};
type ChangeFromObjectResult<T extends JsonObject, U, D, Wrapper extends CRDTWrapper<T, U, D> = CRDTWrapper<T, U, D>> = {
changed: true;
wrapper: Wrapper;
state: T;
update: U;
};
type FromObjectResult<T extends JsonObject, U, D, Wrapper extends CRDTWrapper<T, U, D> = CRDTWrapper<T, U, D>> = ChangeFromObjectResult<T, U, D, Wrapper> | NoChangeFromObjectResult<T, U, D, Wrapper>;
type NoChangeFromUpdatesResult<T extends JsonObject, U, D, Wrapper extends CRDTWrapper<T, U, D> = CRDTWrapper<T, U, D>> = NoChangeFromObjectResult<T, U, D, Wrapper>;
type ChangeFromUpdatesResult<T extends JsonObject, U, D, Wrapper extends CRDTWrapper<T, U, D> = CRDTWrapper<T, U, D>> = Omit<ChangeFromObjectResult<T, U, D, Wrapper>, "update">;
type FromUpdatesResult<T extends JsonObject, U, D, Wrapper extends CRDTWrapper<T, U, D> = CRDTWrapper<T, U, D>> = NoChangeFromUpdatesResult<T, U, D, Wrapper> | ChangeFromUpdatesResult<T, U, D, Wrapper>;
interface CRDTWrapper<T extends JsonObject, U, D = unknown> {
doc: D;
state: T;
update(changeFn: (value: T) => void): UpdateResult<T, U>;
applyUpdates(updates: U[]): ApplyUpdateResult<T>;
[Symbol.dispose](): void;
}
export type { ApplyUpdateResult, CRDTWrapper, ChangeApplyUpdateResult, ChangeFromObjectResult, ChangeFromUpdatesResult, ChangeUpdateResult, FromObjectResult, FromUpdatesResult, NoChangeApplyUpdateResult, NoChangeFromObjectResult, NoChangeFromUpdatesResult, NoChangeUpdateResult, UpdateResult };