import { EmailString, Member, MemberType, PlatformID, SecureString } from '@digitaldefiance/ecies-lib'; import { MemberStatusType } from '../../enumerations/memberStatusType'; import { Checksum } from '../../types/checksum'; import { IStoredBackupCode } from '../userManagement'; import { IPasswordWrappedPrivateKey } from './passwordWrappedPrivateKey'; /** * Public member data stored in CBL */ export interface IPublicMemberData { id: TID; type: MemberType; name: string; dateCreated: Date; dateUpdated: Date; publicKey: Uint8Array; votingPublicKey: Uint8Array; status: MemberStatusType; lastSeen: Date; reputation: number; storageContributed: number; storageUsed: number; region?: string; geographicSpread?: number; } /** * Private member data stored in CBL */ export interface IPrivateMemberData { id: TID; contactEmail: EmailString; recoveryData?: Uint8Array; /** bcrypt password hash — present only for members with password-based auth */ passwordHash?: string; /** Stored backup codes — encrypted per the upstream Argon2id/AEAD/ECIES scheme (see IStoredBackupCode) */ backupCodes?: IStoredBackupCode[]; /** Password-wrapped ECIES private key (AES-256-GCM + PBKDF2) */ passwordWrappedPrivateKey?: IPasswordWrappedPrivateKey; /** Mnemonic encrypted with the system user's ECIES public key (hex-encoded) */ mnemonicRecovery?: string; trustedPeers: TID[]; blockedPeers: TID[]; settings: { autoReplication: boolean; minRedundancy: number; preferredRegions: string[]; /** PEM-encoded X.509 certificate for S/MIME encryption and signing */ smimeCertificate?: string; /** ASCII-armored GPG public key */ gpgPublicKey?: string; }; activityLog: Array<{ timestamp: Date; action: string; details: Record; }>; } /** * Member reference for use in documents */ export interface IMemberReference { id: TID; type: MemberType; dateVerified: Date; publicCBL?: Checksum; } /** * Member index entry */ export interface IMemberIndexEntry { id: TID; publicCBL: Checksum; privateCBL: Checksum; publicProfileCBL?: Checksum; privateProfileCBL?: Checksum; type: MemberType; status: MemberStatusType; lastUpdate: Date; region?: string; reputation: number; /** Member display name — used to populate the in-memory name→id index. */ name?: string; /** Member contact email — used to populate the in-memory email→id index. */ email?: string; } /** * Query criteria for member lookups */ export interface IMemberQueryCriteria { id?: TID; name?: string; email?: string; type?: MemberType; status?: MemberStatusType; region?: string; minReputation?: number; maxReputation?: number; limit?: number; offset?: number; } /** * Member changes for updates */ export interface IMemberChanges { id: TID; publicChanges?: Partial>; privateChanges?: Partial>; indexChanges?: Partial>; } /** * Data for creating a new member */ export interface INewMemberData { type: MemberType; name: string; contactEmail: EmailString; region?: string; /** When provided, the member keypair is derived from this mnemonic instead of generating a random one. */ forceMnemonic?: SecureString; settings?: { autoReplication?: boolean; minRedundancy?: number; preferredRegions?: string[]; }; } /** * Member hydration service */ export interface IMemberHydrator { referenceToMember(ref: IMemberReference): Promise>; memberToReference(member: Member): IMemberReference; cachePublicData(id: TID, data: IPublicMemberData): void; invalidateCache(id: TID): void; } /** * Member store service */ export interface IMemberStore { createMember(data: INewMemberData): Promise<{ reference: IMemberReference; mnemonic: SecureString; }>; getMember(id: TID): Promise>; /** * Returns the hex-encoded public key for a member. * Reads from the `users` DB collection when available (fast path for * seeded users whose CBL blocks are not stored). Falls back to getMember() * for members created via createMember() which do have CBL blocks. */ getMemberPublicKeyHex(id: TID): Promise; updateMember(id: TID, changes: IMemberChanges): Promise; deleteMember(id: TID): Promise; updateIndex(entry: IMemberIndexEntry): Promise; queryIndex(criteria: IMemberQueryCriteria): Promise[]>; syncShard(region: string): Promise; propagateChanges(changes: IMemberChanges[]): Promise; } //# sourceMappingURL=memberData.d.ts.map