17c3ed0c0SDouglas Lowder // Copyright 2015-present 650 Industries. All rights reserved.
27c3ed0c0SDouglas Lowder 
37c3ed0c0SDouglas Lowder #import <Foundation/Foundation.h>
47c3ed0c0SDouglas Lowder #import "EXAppFetcher.h"
57c3ed0c0SDouglas Lowder #import "EXCachedResource.h"
67c3ed0c0SDouglas Lowder 
77c3ed0c0SDouglas Lowder @class EXKernelAppRecord;
87c3ed0c0SDouglas Lowder @class EXAbstractLoader;
994af3edaSWill Schurman @class EXManifestsManifest;
107c3ed0c0SDouglas Lowder 
117c3ed0c0SDouglas Lowder NS_ASSUME_NONNULL_BEGIN
127c3ed0c0SDouglas Lowder 
137c3ed0c0SDouglas Lowder FOUNDATION_EXPORT NSTimeInterval const kEXAppLoaderDefaultTimeout;
147c3ed0c0SDouglas Lowder FOUNDATION_EXPORT NSTimeInterval const kEXJSBundleTimeout;
157c3ed0c0SDouglas Lowder 
167c3ed0c0SDouglas Lowder typedef enum EXAppLoaderStatus {
177c3ed0c0SDouglas Lowder   kEXAppLoaderStatusNew,
187c3ed0c0SDouglas Lowder   kEXAppLoaderStatusHasManifest, // possibly optimistic
197c3ed0c0SDouglas Lowder   kEXAppLoaderStatusHasManifestAndBundle,
207c3ed0c0SDouglas Lowder   kEXAppLoaderStatusError,
217c3ed0c0SDouglas Lowder } EXAppLoaderStatus;
227c3ed0c0SDouglas Lowder 
237c3ed0c0SDouglas Lowder typedef enum EXAppLoaderRemoteUpdateStatus {
247c3ed0c0SDouglas Lowder   kEXAppLoaderRemoteUpdateStatusChecking,
257c3ed0c0SDouglas Lowder   kEXAppLoaderRemoteUpdateStatusDownloading
267c3ed0c0SDouglas Lowder } EXAppLoaderRemoteUpdateStatus;
277c3ed0c0SDouglas Lowder 
287c3ed0c0SDouglas Lowder @protocol EXAppLoaderDelegate <NSObject>
297c3ed0c0SDouglas Lowder 
307c3ed0c0SDouglas Lowder - (void)appLoader:(EXAbstractLoader *)appLoader didLoadOptimisticManifest:(EXManifestsManifest *)manifest;
317c3ed0c0SDouglas Lowder - (void)appLoader:(EXAbstractLoader *)appLoader didLoadBundleWithProgress:(EXLoadingProgress *)progress;
327c3ed0c0SDouglas Lowder - (void)appLoader:(EXAbstractLoader *)appLoader didFinishLoadingManifest:(EXManifestsManifest *)manifest bundle:(NSData *)data;
337c3ed0c0SDouglas Lowder - (void)appLoader:(EXAbstractLoader *)appLoader didFailWithError:(NSError *)error;
347c3ed0c0SDouglas Lowder - (void)appLoader:(EXAbstractLoader *)appLoader didResolveUpdatedBundleWithManifest:(EXManifestsManifest * _Nullable)manifest isFromCache:(BOOL)isFromCache error:(NSError * _Nullable)error;
357c3ed0c0SDouglas Lowder 
367c3ed0c0SDouglas Lowder @end
377c3ed0c0SDouglas Lowder 
387c3ed0c0SDouglas Lowder /**
397c3ed0c0SDouglas Lowder  Class with stub methods to load apps.
407c3ed0c0SDouglas Lowder  It has two subclasses: EXHomeLoader (for loading the home app), and
417c3ed0c0SDouglas Lowder  EXAppLoaderExpoUpdates (for loading and displaying apps in the home UI)
427c3ed0c0SDouglas Lowder  */
43*b8addc5dSWill Schurman @interface EXAbstractLoader : NSObject <EXAppFetcherDelegate, EXAppFetcherCacheDataSource>
447c3ed0c0SDouglas Lowder 
457c3ed0c0SDouglas Lowder @property (nonatomic, readonly) NSURL *manifestUrl;
467c3ed0c0SDouglas Lowder @property (nonatomic, readonly) EXManifestsManifest * _Nullable manifest; // possibly optimistic
477c3ed0c0SDouglas Lowder @property (nonatomic, readonly) EXManifestsManifest * _Nullable cachedManifest; // we definitely have this manifest and its bundle on the device
487c3ed0c0SDouglas Lowder @property (nonatomic, readonly) NSData * _Nullable bundle;
497c3ed0c0SDouglas Lowder @property (nonatomic, readonly) EXAppLoaderStatus status;
507c3ed0c0SDouglas Lowder @property (nonatomic, readonly) EXAppLoaderRemoteUpdateStatus remoteUpdateStatus;
517c3ed0c0SDouglas Lowder @property (nonatomic, readonly) BOOL shouldShowRemoteUpdateStatus;
527c3ed0c0SDouglas Lowder @property (nonatomic, readonly) BOOL isUpToDate;
537c3ed0c0SDouglas Lowder 
547c3ed0c0SDouglas Lowder @property (nonatomic, weak) id<EXAppLoaderDelegate> delegate;
557c3ed0c0SDouglas Lowder @property (nonatomic, weak) id<EXAppFetcherDataSource> dataSource;
567c3ed0c0SDouglas Lowder 
577c3ed0c0SDouglas Lowder - (instancetype)initWithManifestUrl:(NSURL *)url;
587c3ed0c0SDouglas Lowder - (instancetype)initWithLocalManifest:(EXManifestsManifest * _Nonnull)manifest;
597c3ed0c0SDouglas Lowder 
607c3ed0c0SDouglas Lowder /**
617c3ed0c0SDouglas Lowder  *  Begin a new request.
627c3ed0c0SDouglas Lowder  *  In production, this will fetch a manifest and a bundle using the caching behavior specified by the Updates API.
637c3ed0c0SDouglas Lowder  *  If the manifest enables developer tools, this will stop after it gets a manifest, and wait for `forceBundleReload`.
647c3ed0c0SDouglas Lowder  */
657c3ed0c0SDouglas Lowder - (void)request;
667c3ed0c0SDouglas Lowder 
677c3ed0c0SDouglas Lowder /**
687c3ed0c0SDouglas Lowder  *  Begin a new request, but only use the most recently cached manifest.
697c3ed0c0SDouglas Lowder  *  In production, this will fetch a manifest and a bundle using the caching behavior specified by the Updates API.
707c3ed0c0SDouglas Lowder  *  If the manifest enables developer tools, this will stop after it gets a manifest, and wait for `forceBundleReload`.
717c3ed0c0SDouglas Lowder  */
727c3ed0c0SDouglas Lowder - (void)requestFromCache;
737c3ed0c0SDouglas Lowder 
747c3ed0c0SDouglas Lowder /**
757c3ed0c0SDouglas Lowder  *  Tell this AppLoader that everything has finished successfully and its manifest resource can be cached.
767c3ed0c0SDouglas Lowder  */
777c3ed0c0SDouglas Lowder - (void)writeManifestToCache;
787c3ed0c0SDouglas Lowder 
797c3ed0c0SDouglas Lowder /**
807c3ed0c0SDouglas Lowder  *  Reset status to `kEXAppLoaderStatusHasManifest` and fetch the bundle at the existing
817c3ed0c0SDouglas Lowder  *  manifest. This is called when RN devtools reload an AppManager/RCTBridge directly
827c3ed0c0SDouglas Lowder  *  via reload, live reload, etc.
837c3ed0c0SDouglas Lowder  *
847c3ed0c0SDouglas Lowder  *  This will throw if not supported, i.e. if `supportsBundleReload` returns false.
857c3ed0c0SDouglas Lowder  */
867c3ed0c0SDouglas Lowder - (void)forceBundleReload;
877c3ed0c0SDouglas Lowder 
887c3ed0c0SDouglas Lowder /**
897c3ed0c0SDouglas Lowder  *  Return whether this AppLoader supports directly reloading the bundle. Right now the only case
907c3ed0c0SDouglas Lowder  *  where that's possible is if we're running an app in dev mode.
917c3ed0c0SDouglas Lowder  */
927c3ed0c0SDouglas Lowder - (BOOL)supportsBundleReload;
937c3ed0c0SDouglas Lowder 
947c3ed0c0SDouglas Lowder /**
957c3ed0c0SDouglas Lowder  * Fetch manifest without any side effects or interaction with the timer.
967c3ed0c0SDouglas Lowder  */
977c3ed0c0SDouglas Lowder - (void)fetchManifestWithCacheBehavior:(EXManifestCacheBehavior)cacheBehavior success:(void (^)(EXManifestsManifest *))success failure:(void (^)(NSError *))failure;
987c3ed0c0SDouglas Lowder 
997c3ed0c0SDouglas Lowder @end
1007c3ed0c0SDouglas Lowder 
1017c3ed0c0SDouglas Lowder NS_ASSUME_NONNULL_END
102