OctagonStateMachine.h [plain text]
#if OCTAGON
#import <Foundation/Foundation.h>
#import "keychain/ckks/CKKSResultOperation.h"
#import "keychain/ckks/CKKSCondition.h"
#import "keychain/ckks/CKKSLockStateTracker.h"
#import "keychain/ot/OctagonStateMachineHelpers.h"
#import "keychain/ot/OctagonStateMachineObservers.h"
#import "keychain/ot/OctagonFlags.h"
#import "keychain/ot/OctagonPendingFlag.h"
NS_ASSUME_NONNULL_BEGIN
@protocol OctagonStateOnqueuePendingFlagHandler
- (void)_onqueueHandlePendingFlag:(OctagonPendingFlag*)pendingFlag;
@end
@protocol OctagonStateMachineEngine
- (CKKSResultOperation<OctagonStateTransitionOperationProtocol>* _Nullable)_onqueueNextStateMachineTransition:(OctagonState*)currentState
flags:(OctagonFlags*)flags
pendingFlags:(id<OctagonStateOnqueuePendingFlagHandler>)pendingFlagHandler;
@end
@protocol OctagonStateFlagHandler
- (void)handleFlag:(OctagonFlag*)flag;
- (void)handlePendingFlag:(OctagonPendingFlag*)pendingFlag;
@end
@interface OctagonStateMachine : NSObject <OctagonStateFlagHandler, OctagonStateOnqueuePendingFlagHandler>
@property (readonly) OctagonState* currentState;
@property (readonly) id<OctagonFlagContainer> flags;
@property NSMutableDictionary<OctagonState*, CKKSCondition*>* stateConditions;
@property (readonly) CKKSCondition* paused;
@property (readonly) NSSet* allowableStates;
@property (nonatomic) uint64_t timeout;
@property (nullable) CKKSLockStateTracker* lockStateTracker;
- (instancetype)initWithName:(NSString*)name
states:(NSSet<OctagonState*>*)possibleStates
initialState:(OctagonState*)initialState
queue:(dispatch_queue_t)queue
stateEngine:(id<OctagonStateMachineEngine>)stateEngine
lockStateTracker:(CKKSLockStateTracker* _Nullable)lockStateTracker;
- (void)startOperation;
- (void)haltOperation;
- (void)pokeStateMachine;
- (void)_onqueuePokeStateMachine;
- (void)handleFlag:(OctagonFlag*)flag;
- (void)handlePendingFlag:(OctagonPendingFlag *)pendingFlag;
- (NSDictionary<NSString*, NSString*>*)dumpPendingFlags;
- (NSArray<OctagonFlag*>*)possiblePendingFlags;
- (void)disablePendingFlags;
- (void)handleExternalRequest:(OctagonStateTransitionRequest<CKKSResultOperation<OctagonStateTransitionOperationProtocol>*>*)request;
- (void)registerStateTransitionWatcher:(OctagonStateTransitionWatcher*)watcher;
- (void)doSimpleStateMachineRPC:(NSString*)name
op:(CKKSResultOperation<OctagonStateTransitionOperationProtocol>*)op
sourceStates:(NSSet<OctagonState*>*)sourceStates
reply:(nonnull void (^)(NSError * _Nullable))reply;
- (void)doWatchedStateMachineRPC:(NSString*)name
sourceStates:(NSSet<OctagonState*>*)sourceStates
path:(OctagonStateTransitionPath*)path
reply:(nonnull void (^)(NSError *error))reply;
- (void)setWatcherTimeout:(uint64_t)timeout;
- (BOOL)isPaused;
- (OctagonState* _Nonnull)waitForState:(OctagonState* _Nonnull)wantedState wait:(uint64_t)timeout;
@end
NS_ASSUME_NONNULL_END
#endif