ajsfw
Version:
Ajs Framework
547 lines (546 loc) • 30.5 kB
JavaScript
"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;