sync-types.ts

1.8 KB · raw

1/**2 * Types for Peach Sync - encrypted cross-device credential synchronization3 */45export interface TrustedNetwork {6  ssid?: string;7  bssid?: string;8  isTailscale: boolean;9  addedAt: number;10}1112export interface PairedDevice {13  deviceId: string;14  displayName: string;15  x25519PublicKey: string;16  pairedAt: number;17  lastSeenAt?: number;18  lastSyncAt?: number;19}2021export type SyncMessage =22  | { type: "SYNC_HELLO"; deviceId: string; clockMs: number; vaultVersion: number }23  | { type: "SYNC_MANIFEST"; entries: Array<{ id: string; modifiedAt: number; deletedAt?: number; hash: string }> }24  | { type: "SYNC_REQUEST"; ids: string[] }25  | { type: "SYNC_ENTRIES"; entries: EncryptedSyncEntry[] }26  | { type: "SYNC_DONE" }27  | { type: "SYNC_ERROR"; code: string; message: string }28  | { type: "PAIR_REQUEST"; edPublicKey: string; name: string; code: string }29  | { type: "PAIR_ACCEPT"; edPublicKey: string; name: string }30  | { type: "PAIR_REJECT"; reason: string };3132export interface EncryptedSyncEntry {33  id: string;34  modifiedAt: number;35  deletedAt?: number;36  ciphertext: string;37  nonce: string;38  tag: string;39}4041export type SyncStatus = "synced" | "syncing" | "no_peers" | "not_trusted" | "offline";4243export interface SyncState {44  status: SyncStatus;45  lastSyncAt?: number;46  pairedDevices: PairedDevice[];47  trustedNetworks: TrustedNetwork[];48  isPro: boolean;49}5051export type PairingStep =52  | { stage: "idle" }53  | { stage: "generating_code"; code: string; expiresAt: number }54  | { stage: "waiting_for_peer" }55  | { stage: "entering_code" }56  | { stage: "connecting"; peerName: string }57  | { stage: "verifying" }58  | { stage: "done"; device: PairedDevice }59  | { stage: "error"; message: string };6061export interface NoiseHandshakeResult {62  sessionKey: Uint8Array;63  sendNonce: number;64  receiveNonce: number;65  isInitiator: boolean;66}