jaydata
Version:
Cross-platform HTML5 data-management, JavaScript Language Query (JSLQ) support for OData, SQLite, WebSQL, IndexedDB, YQL and Facebook (packaged for Node.JS)
267 lines (242 loc) • 11.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _index = require('../TypeSystem/index.js');
var _index2 = _interopRequireDefault(_index);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_index2.default.Class.define('$data.StorageProviderLoaderBase', null, null, {
isSupported: function isSupported(providerName) {
_index2.default.Trace.log('Detecting ' + providerName + ' provider support');
var supported = true;
switch (providerName) {
case 'indexedDb':
supported = _index2.default.__global.indexedDB || _index2.default.__global.webkitIndexedDB || _index2.default.__global.mozIndexedDB || _index2.default.__global.msIndexedDB && !/^file:/.test(_index2.default.__global.location && _index2.default.__global.location.href);
break;
case 'storm':
supported = 'XMLHttpRequest' in _index2.default.__global;
break;
case 'webSql':
case 'sqLite':
supported = 'openDatabase' in _index2.default.__global;
break;
case 'LocalStore':
supported = 'localStorage' in _index2.default.__global && _index2.default.__global.localStorage ? true : false;
break;
case 'sqLite':
supported = 'openDatabase' in _index2.default.__global;
break;
case 'mongoDB':
supported = _index2.default.mongoDBDriver;
break;
default:
break;
}
_index2.default.Trace.log(providerName + ' provider is ' + (supported ? '' : 'not') + ' supported');
return supported;
},
scriptLoadTimeout: { type: 'int', value: 1000 },
scriptLoadInterval: { type: 'int', value: 50 },
npmModules: {
value: {
'indexedDb': 'jaydata-indexeddb',
'InMemory': 'jaydata-inmemory',
'LocalStore': 'jaydata-inmemory',
'mongoDB': 'jaydata-mongodb',
'oData': 'jaydata-odata',
'webApi': 'jaydata-webapi',
'sqLite': 'jaydata-sqlite',
'webSql': 'jaydata-sqlite',
'storm': 'jaydata-storm'
}
},
ProviderNames: {
value: {
'indexedDb': 'IndexedDb',
'InMemory': 'InMemory',
'LocalStore': 'InMemory',
'oData': 'oData',
'webApi': 'WebApi',
'sqLite': 'SqLite',
'webSql': 'SqLite',
'storm': 'Storm'
}
},
load: function load(providerList, callback) {
_index2.default.RegisteredStorageProviders = _index2.default.RegisteredStorageProviders || {};
_index2.default.Trace.log('Loading provider(s): ' + providerList);
callback = _index2.default.PromiseHandlerBase.createCallbackSettings(callback);
var self = this;
var cacheKey = providerList.join(',');
self._fallbackCache = self._fallbackCache || {};
if (self._fallbackCache[cacheKey]) {
callback.success(self._fallbackCache[cacheKey]);
} else {
this.find(providerList, {
success: function success(provider, selectedProvider) {
self._fallbackCache[cacheKey] = provider;
callback.success.call(this, provider);
},
error: callback.error
});
}
},
find: function find(providerList, callback) {
var currentProvider = providerList.shift();
var currentProvider = this.getVirtual(currentProvider);
if (Array.isArray(currentProvider)) {
providerList = currentProvider;
currentProvider = providerList.shift();
}
while (currentProvider && !this.isSupported(currentProvider)) {
currentProvider = providerList.shift();
}
_index2.default.Trace.log('First supported provider is ' + currentProvider);
if (!currentProvider) {
_index2.default.Trace.log('Provider fallback failed');
callback.error();
}
if (_index2.default.RegisteredStorageProviders) {
_index2.default.Trace.log('Is the ' + currentProvider + ' provider already registered?');
var provider = _index2.default.RegisteredStorageProviders[currentProvider];
if (provider) {
_index2.default.Trace.log(currentProvider + ' provider registered');
callback.success(provider);
return;
} else {
_index2.default.Trace.log(currentProvider + ' provider not registered');
}
}
if (!process.browser) {
// NodeJS
_index2.default.Trace.log('node.js detected trying to load NPM module');
this.loadNpmModule(currentProvider, providerList, callback);
} else {
_index2.default.Trace.log('Browser detected trying to load provider');
this.loadProvider(currentProvider, providerList, callback);
}
},
loadProvider: function loadProvider(currentProvider, providerList, callback) {
var self = this;
var mappedName = _index2.default.StorageProviderLoader.ProviderNames[currentProvider] || currentProvider;
_index2.default.Trace.log(currentProvider + ' provider is mapped to name ' + mappedName + 'Provider');
if (mappedName) {
var url = this.getUrl(mappedName);
_index2.default.Trace.log(currentProvider + ' provider from URL: ' + url);
var loader = this.loadScript;
if (document && document.createElement) {
_index2.default.Trace.log('document and document.createElement detected, using script element loader method');
loader = this.loadScriptElement;
}
loader.call(this, url, currentProvider, function (successful) {
var provider = _index2.default.RegisteredStorageProviders[currentProvider];
if (successful && provider) {
_index2.default.Trace.log(currentProvider + ' provider successfully registered');
callback.success(provider);
} else if (providerList.length > 0) {
_index2.default.Trace.log(currentProvider + ' provider failed to load, trying to fallback to ' + providerList + ' provider(s)');
self.find(providerList, callback);
} else {
_index2.default.Trace.log(currentProvider + ' provider failed to load');
callback.error();
}
});
}
},
getUrl: function getUrl(providerName) {
var jaydataScriptMin = document.querySelector('script[src$="jaydata.min.js"]');
var jaydataScript = document.querySelector('script[src$="jaydata.js"]');
if (jaydataScriptMin) return jaydataScriptMin.src.substring(0, jaydataScriptMin.src.lastIndexOf('/') + 1) + 'jaydataproviders/' + providerName + 'Provider.min.js';else if (jaydataScript) return jaydataScript.src.substring(0, jaydataScript.src.lastIndexOf('/') + 1) + 'jaydataproviders/' + providerName + 'Provider.js';else return 'jaydataproviders/' + providerName + 'Provider.js';
},
loadScript: function loadScript(url, currentProvider, callback) {
if (!url) {
callback(false);
return;
}
function getHttpRequest() {
if (_index2.default.__global.XMLHttpRequest) return new XMLHttpRequest();else if (_index2.default.__global.ActiveXObject !== undefined) return new ActiveXObject("MsXml2.XmlHttp");else {
_index2.default.Trace.log('XMLHttpRequest or MsXml2.XmlHttp ActiveXObject not found');
callback(false);
return;
}
}
var oXmlHttp = getHttpRequest();
oXmlHttp.onreadystatechange = function () {
_index2.default.Trace.log('HTTP request is in state: ' + oXmlHttp.readyState);
if (oXmlHttp.readyState == 4) {
if (oXmlHttp.status == 200 || oXmlHttp.status == 304) {
_index2.default.Trace.log('HTTP request succeeded');
_index2.default.Trace.log('HTTP request response text: ' + oXmlHttp.responseText);
eval.call(_index2.default.__global, oXmlHttp.responseText);
if (typeof callback === 'function') callback(true);else _index2.default.Trace.log('Callback function is undefined');
} else {
_index2.default.Trace.log('HTTP request status: ', oXmlHttp.status);
if (typeof callback === 'function') callback(false);else _index2.default.Trace.log('Callback function is undefined');
}
}
};
oXmlHttp.open('GET', url, true);
oXmlHttp.send(null);
},
loadScriptElement: function loadScriptElement(url, currentProvider, callback) {
var head = document.getElementsByTagName('head')[0] || document.documentElement;
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
_index2.default.Trace.log('Appending child ' + script + ' to ' + head);
head.appendChild(script);
var loadInterval = this.scriptLoadInterval || 50;
var iteration = Math.ceil(this.scriptLoadTimeout / loadInterval);
_index2.default.Trace.log('Script element watcher iterating ' + iteration + ' times');
function watcher() {
_index2.default.Trace.log('Script element watcher iteration ' + iteration);
var provider = _index2.default.RegisteredStorageProviders[currentProvider];
if (provider) {
_index2.default.Trace.log(currentProvider + ' provider registered');
callback(true);
} else {
iteration--;
if (iteration > 0) {
_index2.default.Trace.log('Script element watcher next iteration');
setTimeout(watcher, loadInterval);
} else {
_index2.default.Trace.log('Script element loader failed');
callback(false);
}
}
}
setTimeout(watcher, loadInterval);
},
loadNpmModule: function loadNpmModule(currentProvider, providerList, callback) {
var provider = null;
try {
global["require"](this.npmModules[currentProvider]);
provider = _index2.default.RegisteredStorageProviders[currentProvider];
_index2.default.Trace.log('NPM module loader successfully registered ' + currentProvider + ' provider');
} catch (e) {
_index2.default.Trace.log('NPM module loader failed for ' + currentProvider + ' provider');
}
if (provider) {
callback.success(provider);
} else if (providerList.length > 0) {
this.find(providerList, callback);
} else {
callback.error();
}
},
virtualProviders: {
type: _index2.default.Array,
value: {
local: {
fallbacks: ['webSql', 'indexedDb', 'LocalStore']
}
}
},
getVirtual: function getVirtual(name) {
if (this.virtualProviders[name]) return [].concat(this.virtualProviders[name].fallbacks);
return name;
}
});
_index2.default.StorageProviderLoader = new _index2.default.StorageProviderLoaderBase();
exports.default = _index2.default;
module.exports = exports['default'];