UNPKG

ajsfw

Version:
547 lines (546 loc) 30.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var logger = require("ajsfw/dbg/logger"); var utils = require("ajsfw/utils"); var ui = require("ajsfw/ui"); var exceptions = require("./exceptions"); var logmsg = require("./Strings_Log.Debug"); var consts = require("./constants"); var storages = require("./storages"); var enums_1 = require("./enums"); var enums_2 = require("./enums"); var enums_3 = require("./enums"); var enums_4 = require("./enums"); var ResourceLoader_1 = require("./ResourceLoader"); var ResourceManager = (function () { function ResourceManager(ajsIndexedDb, config) { logger.log(logger.LogType.Constructor, 0, logmsg.LOG_AJSRES, this); this.__ajsIndexedDb = ajsIndexedDb; if (config === undefined) { this.__config = this._defaultConfig(); } else { this.__config = config; } this.__initialized = false; logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); } Object.defineProperty(ResourceManager.prototype, "managedResources", { get: function () { return this.__managedResources; }, enumerable: true, configurable: true }); ResourceManager.prototype.initialize = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); if (this.__initialized) { logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return [2]; } this.__initialized = true; this.__resourceLoader = new ResourceLoader_1.ResourceLoader(); this.__storageLocal = new storages.StorageLocal(this.__config.localCacheSize); this.__storagesession = new storages.StorageSession(this.__config.sessionCacheSize); this.__storageMemory = new storages.StorageMemory(this.__config.memoryCacheSize); this.__storageIndexedDb = new storages.StorageIndexedDb(this.__config.indexedBbCacheSize); this.__storageIndexedDb.db = this.__ajsIndexedDb; return [4, Promise.all([ this.__storageMemory.initialize(), this.__storageLocal.initialize(), this.__storagesession.initialize(), this.__storageIndexedDb.initialize() ])]; case 1: _a.sent(); this.__managedResources = this._getManagedResources(); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_LOCAL_STORAGE_USED_SPACE + this.__storageLocal.usedSpace + "/" + this.__storageLocal.cacheSize); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_LOCAL_STORAGE_RES_COUNT + this.__storageLocal.resources.length); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_SESSION_STORAGE_USED_SPACE + this.__storagesession.usedSpace + "/" + this.__storagesession.cacheSize); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_SESSION_STORAGE_RES_COUNT + this.__storagesession.resources.length); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_INDEXEDDB_STORAGE_USED_SPACE + this.__storageIndexedDb.usedSpace + "/" + this.__storageIndexedDb.cacheSize); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_INDEXEDDB_STORAGE_RES_COUNT + this.__storageIndexedDb.resources.length); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_MEMORY_STORAGE_USED_SPACE + this.__storageMemory.usedSpace + "/" + this.__storageMemory.cacheSize); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_MEMORY_STORAGE_RES_COUNT + this.__storageMemory.resources.length); if (this.__config.removeResourcesOlderThan !== undefined) { logger.log(logger.LogType.Warning, 0, logmsg.LOG_AJSRES, this, "IMPLEMENT: ResourceManager.constructor - removeResourcesOlderThan functionality"); } logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return [2]; } }); }); }; ResourceManager.prototype._defaultConfig = function () { logger.log(logger.LogType.Warning, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_DEFAULT_CONFIG); return { memoryCacheSize: consts.MEMORY_CACHE_SIZE, sessionCacheSize: consts.SESSION_CACHE_SIZE, localCacheSize: consts.LOCAL_CACHE_SIZE, indexedBbCacheSize: consts.INDEXEDDB_CACHE_SIZE }; }; ResourceManager.prototype._getManagedResources = function () { logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_LIST_OF_MANAGED_RESOURCES); var managedResources = []; function collectResources(storage) { for (var _i = 0, _a = storage.resources; _i < _a.length; _i++) { var mr = _a[_i]; managedResources.push({ url: mr.url, storageType: storage.type, cachePolicy: mr.cachePolicy }); } } logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_NUM_MANAGED_RESOURCES_LOCAL + this.__storageLocal.resources.length); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_NUM_MANAGED_RESOURCES_SESSION + this.__storagesession.resources); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_NUM_MANAGED_RESOURCES_INDEXEDDB + this.__storageIndexedDb.resources.length); collectResources(this.__storageLocal); collectResources(this.__storagesession); collectResources(this.__storageIndexedDb); logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return managedResources; }; ResourceManager.prototype.registerManagedResources = function (managedResources) { logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_REGISTER_MANAGED_RESOURCES + managedResources.length, managedResources); for (var _i = 0, managedResources_1 = managedResources; _i < managedResources_1.length; _i++) { var mr = managedResources_1[_i]; var managedResource = this.__getManagedResourceInfo(mr.url, mr.storageType); if (managedResource === null) { logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_REGISTER_MANAGED_RESOURCE + mr.url + " [" + enums_1.StorageType[mr.storageType] + ":" + enums_2.CachePolicy[mr.cachePolicy] + "]"); this.managedResources.push({ url: mr.url, storageType: mr.storageType, cachePolicy: mr.cachePolicy }); } } logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); }; ResourceManager.prototype.getCachedResource = function (url, storageType) { return __awaiter(this, void 0, void 0, function () { var storage; return __generator(this, function (_a) { logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_GETTING_CACHED_RESOURCE + url + ", " + enums_1.StorageType[storageType]); storage = this.__getStorageFromType(storageType); if (storage !== null) { logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return [2, storage.getResource(url)]; } else { logger.log(logger.LogType.Error, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_INVALID_STORAGE_TYPE); throw new exceptions.StorageTypeNotSupportedException(); } return [2]; }); }); }; ResourceManager.prototype.setCachedResource = function (url, data, storageType, cachePolicy) { return __awaiter(this, void 0, void 0, function () { var storage, resource; return __generator(this, function (_a) { logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_SETTING_CACHED_RESOURCE + url + " " + enums_1.StorageType[storageType] + " " + enums_2.CachePolicy[cachePolicy]); storage = this.__getStorageFromType(storageType); if (storage !== null) { this.registerManagedResources([{ url: url, storageType: storageType, cachePolicy: cachePolicy }]); resource = { url: url, data: data, cachePolicy: cachePolicy, lastModified: new Date() }; logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return [2, storage.updateResource(resource)]; } else { logger.log(logger.LogType.Error, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_INVALID_STORAGE_TYPE); throw new exceptions.StorageTypeNotSupportedException(); } return [2]; }); }); }; ResourceManager.prototype.removeCachedResource = function (url, storageType) { return __awaiter(this, void 0, void 0, function () { var storage, i; return __generator(this, function (_a) { logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_REMOVING_CAHCED_RESOURCE + url + " " + enums_1.StorageType[storageType]); storage = this.__getStorageFromType(storageType); if (storage !== null) { for (i = 0; i < this.__managedResources.length; i++) { if (this.__managedResources[i].url === url && this.__managedResources[i].storageType === storageType) { this.managedResources.splice(i, 1); break; } } logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return [2, storage.removeResource(url)]; } else { logger.log(logger.LogType.Error, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_INVALID_STORAGE_TYPE); throw new exceptions.StorageTypeNotSupportedException(); } return [2]; }); }); }; ResourceManager.prototype.cleanCaches = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, Promise.all([ this.__storageLocal.clear(), this.__storagesession.clear(), this.__storageMemory.clear(), this.__managedResources = [] ])]; case 1: _a.sent(); return [2]; } }); }); }; ResourceManager.prototype.getResource = function (url, storageType, cachePolicy, loadingPreference, runScript) { return __awaiter(this, void 0, void 0, function () { var localResource, managedResource, storage, cachedResource, resource; return __generator(this, function (_a) { switch (_a.label) { case 0: logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); if (loadingPreference === undefined) { loadingPreference = enums_3.LoadingPreference.Server; } logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_GETTING_RESOURCE + url + ", " + enums_3.LoadingPreference[loadingPreference]); localResource = url.substring(0, consts.LOCAL_ONLY_PREFIX.length) === consts.LOCAL_ONLY_PREFIX; if (storageType !== undefined) { managedResource = this.__getManagedResourceInfo(url, storageType); } else { managedResource = null; } if (!(managedResource !== null && (loadingPreference === enums_3.LoadingPreference.Cache || localResource))) return [3, 7]; storage = this.__getStorageFromType(managedResource.storageType); if (!(storage !== null)) return [3, 5]; return [4, storage.getResource(url)]; case 1: cachedResource = _a.sent(); if (!(cachedResource !== null)) return [3, 3]; ui.ProgressBar.resourceLoaded(url); return [4, utils.nextTickAsync()]; case 2: _a.sent(); resource = { url: url, type: this.__getResourceTypeFromURL(url), data: cachedResource.data, cached: true, storage: storage, cachePolicy: cachedResource.cachePolicy, lastModified: cachedResource.lastModified }; this.__load(url, managedResource.storageType, managedResource.cachePolicy, runScript, false); logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return [2, resource]; case 3: if (localResource) { logger.log(logger.LogType.Error, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_LOCAL_RESOURCE_NOT_CACHED); throw new exceptions.LocalResourceRequestedDoesNotExistException(url); } else { logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_RESOURCE_NOT_CACHED); logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return [2, this.__load(url, storageType, cachePolicy, runScript, true)]; } _a.label = 4; case 4: return [3, 6]; case 5: logger.log(logger.LogType.Error, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_INVALID_STORAGE_TYPE); throw new exceptions.StorageTypeNotSupportedException(url); case 6: return [3, 8]; case 7: if (localResource) { logger.log(logger.LogType.Error, 0, "ajs.resources", this, logmsg.LOG_LOCAL_RESOURCE_NOT_CACHED); throw new exceptions.LocalResourceRequestedDoesNotExistException(url); } if (storageType === undefined || cachePolicy === undefined) { storageType = enums_1.StorageType.None; cachePolicy = enums_2.CachePolicy.None; } logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return [2, this.__load(url, storageType, cachePolicy, runScript, true)]; case 8: return [2]; } }); }); }; ResourceManager.prototype.getMultipleResources = function (urls, storageType, cachePolicy, loadingPreference, runScripts) { return __awaiter(this, void 0, void 0, function () { var gettedResources, resources, i, i; return __generator(this, function (_a) { switch (_a.label) { case 0: logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); if (!(urls instanceof Array)) { urls = []; } if (loadingPreference === undefined) { loadingPreference = enums_3.LoadingPreference.Server; } if (runScripts === undefined) { runScripts = true; } logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_GETTING_MULTIPLE + urls.length + ", " + enums_1.StorageType[storageType] + ", " + enums_2.CachePolicy[cachePolicy], urls); resources = []; for (i = 0; i < urls.length; i++) { resources.push(this.getResource(urls[i], storageType, cachePolicy, loadingPreference, false)); } return [4, Promise.all(resources)]; case 1: gettedResources = _a.sent(); if (runScripts) { for (i = 0; i < gettedResources.length; i++) { if (gettedResources[i].type === enums_4.ResourceType.Script) { if (consts.USE_EVAL) { this.__evalScript(gettedResources[i]); } else { this.__addScriptTag(gettedResources[i]); } } } } logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return [2, gettedResources]; } }); }); }; ResourceManager.prototype.__load = function (url, storageType, cachePolicy, runScript, updateProgressBar) { return __awaiter(this, void 0, void 0, function () { var storage, resource, managedResource, cachedResource, response; return __generator(this, function (_a) { switch (_a.label) { case 0: logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); if (runScript === undefined) { runScript = true; } logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_LOADING_RESOURCE + url + ", " + enums_1.StorageType[storageType] + ", " + enums_2.CachePolicy[cachePolicy]); storage = this.__getStorageFromType(storageType); if (storage !== null) { if (!storage.supported) { logger.log(logger.LogType.Error, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_INVALID_STORAGE_TYPE); throw new exceptions.StorageTypeNotSupportedException(); } if (cachePolicy === undefined || cachePolicy === enums_2.CachePolicy.None) { logger.log(logger.LogType.Error, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_INVALID_CACHE_POLICY); throw new exceptions.CachePolicyMustBeSetException(); } } else { logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_FALLBACK_POLICY); cachePolicy = enums_2.CachePolicy.None; } resource = null; managedResource = this.__getManagedResourceInfo(url, storageType); if (!(managedResource !== null)) return [3, 2]; return [4, this.getCachedResource(url, managedResource.storageType)]; case 1: cachedResource = _a.sent(); if (cachedResource !== null) { resource = { url: url, type: this.__getResourceTypeFromURL(url), data: cachedResource.data, cached: true, storage: this.__getStorageFromType(managedResource.storageType), cachePolicy: managedResource.cachePolicy, lastModified: cachedResource.lastModified }; } return [3, 3]; case 2: if (storage !== null && cachePolicy !== enums_2.CachePolicy.None) { this.__managedResources.push({ url: url, storageType: storageType, cachePolicy: cachePolicy }); } _a.label = 3; case 3: if (resource === null) { resource = { url: url, type: this.__getResourceTypeFromURL(url), data: null, cached: false, storage: storage, cachePolicy: cachePolicy, lastModified: null }; } return [4, this.__resourceLoader.loadResource(url, resource.type === enums_4.ResourceType.Binary, resource.lastModified)]; case 4: response = _a.sent(); resource = this.__processResourceResponse(resource, response, runScript); if (!updateProgressBar) return [3, 6]; ui.ProgressBar.resourceLoaded(resource.url); return [4, utils.nextTickAsync()]; case 5: _a.sent(); _a.label = 6; case 6: logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return [2, resource]; } }); }); }; ResourceManager.prototype.__processResourceResponse = function (resource, response, runScript) { logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_PROCESSING_RESOURCE + resource.url); var loaded; if (runScript === undefined) { runScript = true; } if (response.httpStatus === 200) { switch (resource.type) { case enums_4.ResourceType.Binary: logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_BINARY_LOADED); resource.data = new Uint8Array(response.data); break; default: logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_TEXT_LOADED); resource.data = response.data; } if (resource.storage !== null) { logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_CACHING + resource.url); var cachedResource = { url: resource.url, data: resource.data, cachePolicy: resource.cachePolicy, lastModified: new Date() }; resource.storage.updateResource(cachedResource); resource.cached = true; } loaded = true; } else { if (resource.cached) { logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_NOT_MODIFIED + resource.url); loaded = true; } else { logger.log(logger.LogType.Warning, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_FAILED_LOAD_NOT_CACHED + resource.url); loaded = false; } } if (!loaded) { logger.log(logger.LogType.Error, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_FAILED_LOAD + resource.url + ":" + response.httpStatus.toString()); throw new exceptions.ResourceFailedToLoadException(resource.url + ":" + response.httpStatus.toString()); } if (resource.type === enums_4.ResourceType.Script && runScript) { if (consts.USE_EVAL) { this.__evalScript(resource); } else { this.__addScriptTag(resource); } } logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return resource; }; ResourceManager.prototype.__getManagedResourceInfo = function (url, storageType) { logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_LOOKING_RESOURCE + url); for (var i = 0; i < this.__managedResources.length; i++) { if (this.__managedResources[i].url === url && this.__managedResources[i].storageType === storageType) { logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return this.__managedResources[i]; } } logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return null; }; ResourceManager.prototype.__getStorageFromType = function (storageType) { switch (storageType) { case enums_1.StorageType.Local: return this.__storageLocal; case enums_1.StorageType.Session: return this.__storagesession; case enums_1.StorageType.IndexedDb: return this.__storageIndexedDb; case enums_1.StorageType.Memory: return this.__storageMemory; default: return null; } }; ResourceManager.prototype.__getResourceTypeFromURL = function (url) { var ext = url.substring(url.lastIndexOf(".")); if (consts.RESOURCE_TYPES.script.indexOf(ext) >= 0) { return enums_4.ResourceType.Script; } if (consts.RESOURCE_TYPES.style.indexOf(ext) >= 0) { return enums_4.ResourceType.Style; } if (consts.RESOURCE_TYPES.text.indexOf(ext) >= 0) { return enums_4.ResourceType.Text; } if (consts.RESOURCE_TYPES.binary.indexOf(ext) >= 0) { return enums_4.ResourceType.Binary; } return enums_4.ResourceType.Unknown; }; ResourceManager.prototype.__evalScript = function (resource) { logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_EVAL_RESOURCE + resource.url, resource); if (resource !== null && resource.data != null) { var content = resource.data; if (content.indexOf("//# sourceMappingURL") !== -1) { content = content.substring(0, content.lastIndexOf("\n")) + "\n//# sourceMappingURL=" + resource.url + ".map" + "\n//# sourceURL=" + resource.url; } eval.call(null, content); } logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); }; ResourceManager.prototype.__addScriptTag = function (resource) { logger.log(logger.LogType.Enter, 0, logmsg.LOG_AJSRES, this); logger.log(logger.LogType.Info, 0, logmsg.LOG_AJSRES, this, logmsg.LOG_ADDING_SCRIPT, resource); var nodeList = document.head.getElementsByTagName("script"); for (var i = 0; i < nodeList.length; i++) { if (nodeList.item(i).id === resource.url) { logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); return; } } var script = document.createElement("script"); script.id = resource.url; script.type = "text/javascript"; script.innerText = resource.data; document.head.appendChild(script); logger.log(logger.LogType.Exit, 0, logmsg.LOG_AJSRES, this); }; return ResourceManager; }()); exports.ResourceManager = ResourceManager;