import type { AbstractBatchOperation, AbstractLevel } from 'abstract-level'; import type { BlockId } from '../types'; import type { ServerBatch, ServerSnapshot } from '../../remote/types'; import type { PubSub } from '../../pubsub'; export type BinStrLevel = AbstractLevel; export type BinStrLevelOperation = AbstractBatchOperation; export interface BlockMeta { /** * The latest logical time that was successfully synced with the remote. This * is the patch start time, plus the patch span `patch.id.time + patch.span()`. * * Empty block starts from 0. The smallest time is 1. */ time: number; /** * The sequence number of the last remote batch that was successfully pulled. */ seq: number; /** * Whether to track the history of the block. By default the block will * store only the latest state model. If history tracking is enabled to block * will store historic batches and the starting snapshot model, from * which to apply the batches. */ hist?: boolean; /** * Timestamp when the last time the block with successfully or unsuccessfully * synced with the remote. */ syncTs?: number; /** * The number of consecutive sync failures, if any. */ syncFailures?: number; } /** * The remote batch sequence number which the the client has seen. */ export type LevelLocalRepoCursor = number; export interface CrudLocalRepoCipher { encrypt(plaintext: Uint8Array): Promise; decrypt(ciphertext: Uint8Array): Promise; } export type BlockSyncRecord = [ /** * Unencrypted block ID. */ id: BlockId, /** * Time when block was marked as dirty. */ ts: number ]; export type SyncResult = [block: BlockId, success: boolean, err?: Error | unknown | undefined]; export type LocalBatch = ServerBatch; export type LocalSnapshot = ServerSnapshot; export type LevelLocalRepoPubSub = PubSub; export type LevelLocalRepoPubSubMessage = LevelLocalRepoPubSubMessageRemoteReset | LevelLocalRepoPubSubMessageRemoteMerge | LevelLocalRepoPubSubMessageLocalRebase | LevelLocalRepoPubSubMessageDelete; export interface LevelLocalRepoPubSubMessageRemoteReset { type: 'reset'; id: BlockId; model: Uint8Array; } export interface LevelLocalRepoPubSubMessageRemoteMerge { type: 'merge'; id: BlockId; patches: Uint8Array[]; seq: number; } export interface LevelLocalRepoPubSubMessageLocalRebase { type: 'rebase'; id: BlockId; patches: Uint8Array[]; session?: number; } export interface LevelLocalRepoPubSubMessageDelete { type: 'del'; id: BlockId; }