#if OCTAGON
#import <Foundation/Foundation.h>
#import <SecurityFoundation/SFKey.h>
#import "CKKSRecordHolder.h"
NS_ASSUME_NONNULL_BEGIN
extern NSString* const CKKSManifestZoneKey;
extern NSString* const CKKSManifestSignerIDKey;
extern NSString* const CKKSManifestGenCountKey;
@class CKKSManifestMasterRecord;
@class CKRecord;
@class CKKSItem;
@class CKKSCurrentItemPointer;
@interface CKKSManifest : CKKSCKRecordHolder
@property (readonly, class) NSUInteger greatestKnownGenerationCount;
@property (nonatomic, readonly) NSData* digestValue;
@property (nonatomic, readonly) NSUInteger generationCount;
@property (nonatomic, readonly) NSString* signerID;
+ (void)performWithAccountInfo:(void (^)(void))action;
+ (bool)shouldSyncManifests;
+ (bool)shouldEnforceManifests;
+ (nullable instancetype)manifestForZone:(NSString*)zone peerID:(NSString*)peerID error:(NSError**)error;
+ (nullable instancetype)manifestForRecordName:(NSString*)recordName error:(NSError**)error;
+ (nullable instancetype)latestTrustedManifestForZone:(NSString*)zone error:(NSError**)error;
- (BOOL)updateWithRecord:(CKRecord*)record error:(NSError**)error;
- (BOOL)validateWithError:(NSError**)error;
- (BOOL)validateItem:(CKKSItem*)item withError:(NSError**)error;
- (BOOL)validateCurrentItem:(CKKSCurrentItemPointer*)currentItem withError:(NSError**)error;
- (BOOL)itemUUIDExistsInManifest:(NSString*)uuid;
- (BOOL)contentsAreEqualToManifest:(CKKSManifest*)otherManifest;
@end
@interface CKKSPendingManifest : CKKSManifest
@property (readonly, getter=isReadyToCommmit) BOOL readyToCommit;
- (nullable CKKSManifest*)commitToDatabaseWithError:(NSError**)error;
@end
@interface CKKSEgoManifest : CKKSManifest
+ (nullable CKKSEgoManifest*)tryCurrentEgoManifestForZone:(NSString*)zone;
+ (nullable instancetype)newManifestForZone:(NSString*)zone
withItems:(NSArray<CKKSItem*>*)items
peerManifestIDs:(NSArray<NSString*>*)peerManifestIDs
currentItems:(NSDictionary*)currentItems
error:(NSError**)error;
- (void)updateWithNewOrChangedRecords:(NSArray<CKRecord*>*)newOrChangedRecords
deletedRecordIDs:(NSArray<CKRecordID*>*)deletedRecordIDs;
- (void)setCurrentItemUUID:(NSString*)newCurrentItemUUID forIdentifier:(NSString*)currentPointerIdentifier;
- (NSArray<CKRecord*>*)allCKRecordsWithZoneID:(CKRecordZoneID*)zoneID;
@end
@class CKKSManifestInjectionPointHelper;
@interface CKKSManifest (UnitTesting)
- (void)nilAllIvars;
@end
@interface CKKSEgoManifest (UnitTesting)
+ (nullable instancetype)newFakeManifestForZone:(NSString*)zone
withItemRecords:(NSArray<CKRecord*>*)itemRecords
currentItems:(NSDictionary*)currentItems
signerID:(NSString*)signerID
keyPair:(SFECKeyPair*)keyPair
error:(NSError**)error;
@end
@interface CKKSManifestInjectionPointHelper : NSObject
@property (class) BOOL ignoreChanges;
+ (void)registerEgoPeerID:(NSString*)egoPeerID keyPair:(SFECKeyPair*)keyPair;
@end
NS_ASSUME_NONNULL_END
#endif