StructureJS
0.15.2A class based utility library for building modular and scalable web platform applications. Features opt-in classes and utilities which provide a solid foundation and toolset to build your next project.
import ApplicationCacheEvent from '../event/ApplicationCacheEvent';
import EventDispatcher from '../event/EventDispatcher';
/**
* The ApplicationCacheService is a static class works with the window applicationCache object.
*
* @class ApplicationCacheService
* @module StructureJS
* @submodule controller
* @requires ApplicationCacheEvent
* @requires EventDispatcher
* @static
* @author Robert S. (www.codeBelt.com)
*/
class ApplicationCacheService
{
/**
* A reference to the applicationCache property on the window object.
*
* @property _appCache
* @type {ApplicationCache}
* @private
* @static
*/
private static _appCache:ApplicationCache = window.applicationCache;
/**
* A reference to the EventDispatcher object.
*
* @property _eventDispatcher
* @type {EventDispatcher}
* @private
* @static
*/
private static _eventDispatcher:EventDispatcher = new EventDispatcher();
/**
* The isEnabled property is used to keep track of the enabled state.
*
* @property isEnabled
* @type {boolean}
* @default false
* @public
* @static
*/
public static isEnabled:boolean = false;
constructor()
{
throw new Error('[ApplicationCacheService] Do not instantiate the ApplicationCacheService class because it is a static class.');
}
/**
* @overridden BaseObject.enable
*/
public static enable():void
{
if (ApplicationCacheService._appCache == null || ApplicationCacheService.isEnabled === true)
{
return;
}
// Native Browser Event Listener
ApplicationCacheService._appCache.addEventListener(ApplicationCacheEvent.CACHED, this._onCached.bind(this), false);
ApplicationCacheService._appCache.addEventListener(ApplicationCacheEvent.CHECKING, this._onChecking.bind(this), false);
ApplicationCacheService._appCache.addEventListener(ApplicationCacheEvent.DOWNLOADING, this._onDownloading.bind(this), false);
ApplicationCacheService._appCache.addEventListener(ApplicationCacheEvent.NO_UPDATE, this._onNoUpdate.bind(this), false);
ApplicationCacheService._appCache.addEventListener(ApplicationCacheEvent.OBSOLETE, this._onObsolete.bind(this), false);
ApplicationCacheService._appCache.addEventListener(ApplicationCacheEvent.PROGRESS, this._onProgress.bind(this), false);
ApplicationCacheService._appCache.addEventListener(ApplicationCacheEvent.UPDATE_READY, this._onUpdateReady.bind(this), false);
ApplicationCacheService._appCache.addEventListener(ApplicationCacheEvent.ERROR, this._onError.bind(this), false);
ApplicationCacheService.isEnabled = true;
}
/**
* @overridden BaseObject.disable
*/
public static disable():void
{
if (ApplicationCacheService._appCache == null || ApplicationCacheService.isEnabled === false)
{
return;
}
ApplicationCacheService._appCache.removeEventListener(ApplicationCacheEvent.CACHED, ApplicationCacheService._onCached.bind(this), false);
ApplicationCacheService._appCache.removeEventListener(ApplicationCacheEvent.CHECKING, ApplicationCacheService._onChecking.bind(this), false);
ApplicationCacheService._appCache.removeEventListener(ApplicationCacheEvent.DOWNLOADING, ApplicationCacheService._onDownloading.bind(this), false);
ApplicationCacheService._appCache.removeEventListener(ApplicationCacheEvent.NO_UPDATE, ApplicationCacheService._onNoUpdate.bind(this), false);
ApplicationCacheService._appCache.removeEventListener(ApplicationCacheEvent.OBSOLETE, ApplicationCacheService._onObsolete.bind(this), false);
ApplicationCacheService._appCache.removeEventListener(ApplicationCacheEvent.PROGRESS, ApplicationCacheService._onProgress.bind(this), false);
ApplicationCacheService._appCache.removeEventListener(ApplicationCacheEvent.UPDATE_READY, ApplicationCacheService._onUpdateReady.bind(this), false);
ApplicationCacheService._appCache.removeEventListener(ApplicationCacheEvent.ERROR, ApplicationCacheService._onError.bind(this), false);
ApplicationCacheService.isEnabled = true;
}
public static update()
{
ApplicationCacheService._appCache.update();
}
public static getStatus():string
{
switch (ApplicationCacheService._appCache.status)
{
case ApplicationCacheService._appCache.UNCACHED: // UNCACHED === 0
return 'UNCACHED';
case ApplicationCacheService._appCache.IDLE: // IDLE === 1
return 'IDLE';
case ApplicationCacheService._appCache.CHECKING: // CHECKING === 2
return 'CHECKING';
case ApplicationCacheService._appCache.DOWNLOADING: // DOWNLOADING === 3
return 'DOWNLOADING';
case ApplicationCacheService._appCache.UPDATEREADY: // UPDATEREADY === 4
return 'UPDATEREADY';
case ApplicationCacheService._appCache.OBSOLETE: // OBSOLETE === 5
return 'OBSOLETE';
default:
return 'UKNOWN CACHE STATUS';
}
}
/**
* The resources listed in the manifest have been fully downloaded, and the application is
* now cached locally.
*
* @method _onCached
* @param event {DOMApplicationCacheEvent} The native browser event from the DOMApplicationCache.
* @private
* @static
*/
private static _onCached(event)
{
//console.log('[ApplicationCacheService]', 'ApplicationCacheEvent:',ApplicationCacheEvent.CACHED, event);
ApplicationCacheService.dispatchEvent(new ApplicationCacheEvent(ApplicationCacheEvent.CACHED, false, false, event));
}
/**
* The browser is checking for an update, or is attempting to download
* the cache manifest for the first time. This is always the first event
* in the sequence.
*
* @method _onChecking
* @param event {DOMApplicationCacheEvent} The native browser event from the DOMApplicationCache.
* @private
* @static
*/
private static _onChecking(event)
{
//console.log('[ApplicationCacheService]', 'ApplicationCacheEvent:',ApplicationCacheEvent.CHECKING, event);
ApplicationCacheService.dispatchEvent(new ApplicationCacheEvent(ApplicationCacheEvent.CHECKING, false, false, event));
}
/**
* The browser has started to download the cache manifest, either for the
* first time or because changes have been detected.
*
* @method _onDownloading
* @param event {DOMApplicationCacheEvent} The native browser event from the DOMApplicationCache.
* @private
* @static
*/
private static _onDownloading(event)
{
//console.log('[ApplicationCacheService]', 'ApplicationCacheEvent:',ApplicationCacheEvent.DOWNLOADING, event);
ApplicationCacheService.dispatchEvent(new ApplicationCacheEvent(ApplicationCacheEvent.DOWNLOADING, false, false, event));
}
/**
* An error occurred at some point - this could be caused by a number of things. This will
* always be the last event in the sequence.
*
* @method _onError
* @param event {DOMApplicationCacheEvent} The native browser event from the DOMApplicationCache.
* @private
* @static
*/
private static _onError(event)
{
//console.log('[ApplicationCacheService]', 'ApplicationCacheEvent:',ApplicationCacheEvent.ERROR, event);
ApplicationCacheService.dispatchEvent(new ApplicationCacheEvent(ApplicationCacheEvent.ERROR, false, false, event));
}
/**
* The cache manifest hadn't changed.
*
* @method _onNoUpdate
* @param event {DOMApplicationCacheEvent} The native browser event from the DOMApplicationCache.
* @private
* @static
*/
private static _onNoUpdate(event)
{
//console.log('[ApplicationCacheService]', 'ApplicationCacheEvent:',ApplicationCacheEvent.NO_UPDATE, event);
ApplicationCacheService.dispatchEvent(new ApplicationCacheEvent(ApplicationCacheEvent.NO_UPDATE, false, false, event));
}
/**
* The cache manifest file could not be found, indicating that the cache is no longer needed.
* The application cache is being deleted.
*
* @method _onObsolete
* @param event {DOMApplicationCacheEvent} The native browser event from the DOMApplicationCache.
* @private
* @static
*/
private static _onObsolete(event)
{
//console.log('[ApplicationCacheService]', 'ApplicationCacheEvent:',ApplicationCacheEvent.OBSOLETE, event);
ApplicationCacheService.dispatchEvent(new ApplicationCacheEvent(ApplicationCacheEvent.OBSOLETE, false, false, event));
}
/**
* The browser had downloaded and cached an asset. This is fired once for
* every file that is downloaded (including the current page which is cached implicitly).
*
* @method _onProgress
* @param event {DOMApplicationCacheEvent} The native browser event from the DOMApplicationCache.
* @private
* @static
*/
private static _onProgress(event)
{
//console.log('[ApplicationCacheService]', 'ApplicationCacheEvent:',ApplicationCacheEvent.PROGRESS, event);
ApplicationCacheService.dispatchEvent(new ApplicationCacheEvent(ApplicationCacheEvent.PROGRESS, false, false, event));
}
/**
* The resources listed in the manifest have been newly re-downloaded, and the script can
* use swapCache() to switch to the new cache.
*
* @method _onUpdateReady
* @param event {DOMApplicationCacheEvent} The native browser event from the DOMApplicationCache.
* @private
* @static
*/
private static _onUpdateReady(event)
{
//console.log('[ApplicationCacheService]', 'ApplicationCacheEvent:',ApplicationCacheEvent.UPDATE_READY, event);
ApplicationCacheService.dispatchEvent(new ApplicationCacheEvent(ApplicationCacheEvent.UPDATE_READY, false, false, event));
}
/**
* Registers an event listener object with an ApplicationCacheService object so that the listener receives notification of an event.
*
* @method addEventListener
* @param type {String} The type of event.
* @param callback {Function} The listener function that processes the event. This function must accept an Event object as its only parameter and must return nothing, as this example shows. @example function(event:Event):void
* @param scope {any} Binds the scope to a particular object (scope is basically what "this" refers to in your function). This can be very useful in JavaScript because scope isn't generally maintained.
* @param [priority=0] {int} Influences the order in which the listeners are called. Listeners with lower priorities are called after ones with higher priorities.
* @static
* @example
* ApplicationCacheService.addEventListener(ApplicationCacheEvent.UPDATE_READY, this._handlerMethod, this);
* _handlerMethod(event) {
* console.log(event.target + " sent the event.");
* }
*/
public static addEventListener(type:string, callback:Function, scope:any, priority:number = 0):any
{
ApplicationCacheService._eventDispatcher.addEventListener(type, callback, scope, priority);
}
/**
* Removes a specified listener from the ApplicationCacheService object.
*
* @method removeEventListener
* @param type {String} The type of event.
* @param callback {Function} The listener object to remove.
* @param scope {any} The scope of the listener object to be removed. This was added because it was need for the {{#crossLink "ApplicationCacheService"}}{{/crossLink}} class.
* To keep things consistent this parameter is required.
* @static
* @example
* ApplicationCacheService.removeEventListener(ApplicationCacheEvent.UPDATE_READY, this._handlerMethod, this);
* _handlerMethod(event) {
* console.log(event.target + " sent the event.");
* }
*/
public static removeEventListener(type:string, callback:Function, scope:any):any
{
ApplicationCacheService._eventDispatcher.removeEventListener(type, callback, scope);
}
/**
* <p>Dispatches an event within the ApplicationCacheService object.</p>
*
* @method dispatchEvent
* @param event {ApplicationCacheEvent} The Event object that is dispatched into the event flow. You can create custom events, the only requirement is all events must
* extend the {{#crossLink "ApplicationCacheEvent"}}{{/crossLink}}.
* @static
* @example
* let event = new ApplicationCacheEvent(ApplicationCacheEvent.UPDATE_READY);
* ApplicationCacheService.dispatchEvent(event);
*
* // Here is a common inline event being dispatched
* ApplicationCacheService.dispatchEvent(new ApplicationCacheEvent(ApplicationCacheEvent.UPDATE_READY));
*/
public static dispatchEvent(event:ApplicationCacheEvent):any
{
ApplicationCacheService._eventDispatcher.dispatchEvent(event);
}
}
export default ApplicationCacheService;