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