h5-cli
Version:
hello
451 lines (382 loc) • 15.5 kB
JavaScript
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
;(function (win, lib) {
var Promise = win.Promise;
var doc = win.document;
var ua = win.navigator.userAgent;
var isIOS = /iPhone|iPad|iPod/i.test(ua);
var isAndroid = /Android/i.test(ua);
var osVersion = ua.match(/(?:OS|Android)[\/\s](\d+[._]\d+(?:[._]\d+)?)/i);
var wvVersion = ua.match(/WindVane[\/\s](\d+[._]\d+[._]\d+)/);
var hasOwnProperty = Object.prototype.hasOwnProperty;
var WindVane = lib.windvane = win.WindVane || (win.WindVane = {});
var WindVane_Native = win.WindVane_Native;
var inc = 1,
iframePool = [],
iframeLimit = 3;
var LOCAL_PROTOCOL = 'hybrid';
var WV_PROTOCOL = 'wv_hybrid';
var IFRAME_PREFIX = 'iframe_';
var SUCCESS_PREFIX = 'suc_';
var FAILURE_PREFIX = 'err_';
var DEFERRED_PREFIX = 'defer_';
var PARAM_PREFIX = 'param_';
var CHUNK_PREFIX = 'chunk_';
var CALL_GC_TIME = 60 * 1000 * 10;
var CHUNK_GC_TIME = 60 * 1000 * 10;
var PARAM_GC_TIME = 60 * 1000;
function compareVersion(v1, v2) {
v1 = v1.toString().split('.');
v2 = v2.toString().split('.');
for (var i = 0; i < v1.length || i < v2.length; i++) {
var n1 = parseInt(v1[i], 10),
n2 = parseInt(v2[i], 10);
if (window.isNaN(n1)) {
n1 = 0;
}
if (window.isNaN(n2)) {
n2 = 0;
}
if (n1 < n2) {
return -1;
} else if (n1 > n2) {
return 1;
}
}
return 0;
}
if (osVersion) {
osVersion = (osVersion[1] || '0.0.0').replace(/\_/g, '.');
} else {
osVersion = '0.0.0';
}
if (wvVersion) {
wvVersion = (wvVersion[1] || '0.0.0').replace(/\_/g, '.');
} else {
wvVersion = '0.0.0';
}
/**
* @namespace lib
*/
/**
* @namespace windvane
* @memberOf lib
*/
var WV_Core = {
isAvailable: compareVersion(wvVersion, '0') === 1,
/**
* @method call
* @memberOf lib.windvane
* @param {String} obj \u8981\u8c03\u7528\u7684\u5ba2\u6237\u7aef\u7c7b\u540d
* @param {String} method \u8981\u8c03\u7528\u7684\u5ba2\u6237\u7aef\u65b9\u6cd5\u540d
* @param {Object} params \u8981\u4f20\u9012\u7ed9\u5ba2\u6237\u7aef\u7684\u53c2\u6570
* @param {Function} [success] \u6267\u884c\u6210\u529f\u540e\u7684\u56de\u8c03
* @param {Function} [failure] \u6267\u884c\u5931\u8d25\u540e\u7684\u56de\u8c03
* @param {Number} [timeout] \u6267\u884c\u8d85\u65f6\uff0c\u8d85\u65f6\u540e\u81ea\u52a8\u4ee5 {ret:['HY_TIMEOUT']}
* @return {Promise} \u5982\u679c\u5f53\u524d\u8fd0\u884c\u73af\u5883\u652f\u6301Promise\uff0c\u5219\u8fd4\u56de\u4e00\u4e2aPromise\u5b9e\u4f8b\u3002
*/
call: function call(obj, method, params, success, failure, timeout) {
var sid;
var deferred;
if (typeof arguments[arguments.length - 1] === 'number') {
timeout = arguments[arguments.length - 1];
}
if (typeof success !== 'function') {
success = null;
}
if (typeof failure !== 'function') {
failure = null;
}
if (Promise) {
deferred = {};
deferred.promise = new Promise(function (resolve, reject) {
deferred.resolve = resolve;
deferred.reject = reject;
});
}
if (timeout > 0) {
sid = setTimeout(function () {
WV_Core.onFailure(sid, { ret: 'HY_TIMEOUT' });
}, timeout);
} else {
sid = WV_Private.getSid();
}
WV_Private.registerCall(sid, success, failure, deferred);
WV_Private.registerGC(sid, timeout);
WV_Private.callMethod(obj, method, params, sid);
if (deferred) {
return deferred.promise;
}
},
fireEvent: function fireEvent(eventname, eventdata, sid) {
// \u5f53native\u9700\u8981\u901a\u77e5js\u7684\u65f6\u5019\uff08\u901a\u4fe1\uff09\uff0c\u7528\u89e6\u53d1\u4e8b\u4ef6\u7684\u65b9\u5f0f\u8fdb\u884c
var ev = doc.createEvent('HTMLEvents');
ev.initEvent(eventname, false, true);
ev.param = WV_Private.parseData(eventdata || WV_Private.getData(sid));
doc.dispatchEvent(ev);
},
getParam: function getParam(sid) {
return WV_Private.getParam(sid);
},
setData: function setData(sid, chunk) {
WV_Private.setData(sid, chunk);
},
onSuccess: function onSuccess(sid, data) {
// native\u4ee3\u7801\u5904\u7406\u6210\u529f\u540e\uff0c\u8c03\u7528\u8be5\u65b9\u6cd5\u6765\u901a\u77e5js
//alert(window.location.href)
if (sid == "0") {
//native\u5411h5\u53d1\u9001\u4fe1\u606f
this.fire(data, 'success');
return;
}
WV_Private.onComplete(sid, data, 'success');
},
onFailure: function onFailure(sid, data) {
//hybrid://nativeClassname:1/methodName?{"a":1,"b":2}
// native\u4ee3\u7801\u5904\u7406\u5931\u8d25\u540e\uff0c\u8c03\u7528\u8be5\u65b9\u6cd5\u6765\u901a\u77e5js
WV_Private.onComplete(sid, data, 'failure');
},
EVER: "onever",
READY: "onready",
ACTIVEATION: "onactivation",
PAUSE: "onpause",
eventListener: {
"onever": [], //\u4efb\u4f55\u6ca1\u6709\u5b9a\u4e49\u7684\u4e8b\u4ef6
"onready": [], //\u9875\u9762\u52a0\u8f7d\u5b8c\u6210
"onactivation": [], //\u9875\u9762\u91cd\u65b0\u88ab\u6fc0\u6d3b
"onpause": [] //\u9875\u9762\u5230\u540e\u53f0
},
//\u76d1\u542c native \u56de\u8c03
on: function on(eventType, func) {
//\u4e4b\u524d\u63a5\u6536\u5ba2\u6237\u7aef\u4e8b\u4ef6\u662f\u6ca1\u6709eventType\u5b57\u6bb5\u7684\uff0c\u517c\u5bb9\u8001\u4ee3\u7801
if (typeof eventType == "function") {
func = eventType;
eventType = this.EVER;
}
if (typeof func == "function") {
this.eventListener[eventType].push(func);
}
},
// off:function( func ){
// if( typeof func == "function"){
// for(var i=0; i<this.eventListener.length; i++){
// if( func == this.eventListener[i] ){
// this.eventListener.splice(i, 1);
// i--;
// }
// }
// }
// },
fire: function fire(data) {
var eventType = this.EVER;
if (data && data.type == "event") {
eventType = data.name;
}
var eventListener = this.eventListener[eventType] || [];
for (var i = 0; i < eventListener.length; i++) {
try {
eventListener[i](data);
} catch (e) {
console.log(e);
}
}
}
};
var WV_Private = {
params: {},
chunks: {},
calls: {},
getSid: function getSid() {
return Math.floor(Math.random() * (1 << 50)) + '' + inc++;
},
buildParam: function buildParam(obj) {
if (obj && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object') {
return JSON.stringify(obj);
} else {
return obj || '';
}
},
getParam: function getParam(sid) {
// \u56e0\u4e3aios\u4e0biframe\u534f\u8bae\uff0c\u5bf9\u4e8eurl\u957f\u5ea6\u6709\u9650\u5236\uff0c\u6240\u4ee5\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\u7684map\u3002
return this.params[PARAM_PREFIX + sid] || '';
},
setParam: function setParam(sid, params) {
this.params[PARAM_PREFIX + sid] = params;
},
parseData: function parseData(str) {
var rst;
if (str && typeof str === 'string') {
try {
rst = JSON.parse(str);
} catch (e) {
rst = { ret: ['WV_ERR::PARAM_PARSE_ERROR'] };
}
} else {
rst = str || {};
}
return rst;
},
setData: function setData() {
// android\u4e0b\uff0c\u56de\u4f20\u51fd\u6570\u4f1a\u8d85\u957f\uff0c\u901a\u8fc7\u5206\u6bb5set\u7684\u65b9\u5f0f\u6765\u4f20\u9012
this.chunks[CHUNK_PREFIX + sid] = this.chunks[CHUNK_PREFIX + sid] || [];
this.chunks[CHUNK_PREFIX + sid].push(chunk);
},
getData: function getData(sid) {
if (this.chunks[CHUNK_PREFIX + sid]) {
return this.chunks[CHUNK_PREFIX + sid].join('');
} else {
return '';
}
},
registerCall: function registerCall(sid, success, failure, deferred) {
if (success) {
this.calls[SUCCESS_PREFIX + sid] = success;
}
if (failure) {
this.calls[FAILURE_PREFIX + sid] = failure;
}
if (deferred) {
this.calls[DEFERRED_PREFIX + sid] = deferred;
}
},
unregisterCall: function unregisterCall(sid) {
var sucId = SUCCESS_PREFIX + sid;
var failId = FAILURE_PREFIX + sid;
var defId = DEFERRED_PREFIX + sid;
var call = {};
if (this.calls[sucId]) {
call.success = this.calls[sucId];
delete this.calls[sucId];
}
if (this.calls[failId]) {
call.failure = this.calls[failId];
delete this.calls[failId];
}
if (this.calls[defId]) {
call.deferred = this.calls[defId];
delete this.calls[defId];
}
return call;
},
useIframe: function useIframe(sid, url) {
var iframeid = IFRAME_PREFIX + sid;
var iframe = iframePool.pop();
if (!iframe) {
iframe = doc.createElement('iframe');
iframe.setAttribute('frameborder', '0');
iframe.style.cssText = 'width:0;height:0;border:0;display:none;';
}
iframe.setAttribute('id', iframeid);
iframe.setAttribute('src', url);
if (!iframe.parentNode) {
setTimeout(function () {
doc.body.appendChild(iframe);
}, 5);
}
},
retrieveIframe: function retrieveIframe(sid) {
var iframeid = IFRAME_PREFIX + sid;
var iframe = doc.querySelector('#' + iframeid);
if (iframePool.length >= iframeLimit) {
doc.body.removeChild(iframe);
} else {
iframePool.push(iframe);
}
},
callMethod: function callMethod(obj, method, params, sid) {
// hybrid://objectName:sid/methodName?params
params = WV_Private.buildParam(params);
var uri = LOCAL_PROTOCOL + '://' + obj + ':' + sid + '/' + method + '?' + params;
if (nihao.getPlatform() === 'ios' && nihao.version.gt(3, 4, 9)) {
uri = LOCAL_PROTOCOL + '://' + obj + '-' + sid + '/' + method + '?' + params;
}
if (isIOS || true) {
// iOS\u4e0b\u7528iframe\u8c03\u7528
this.setParam(sid, params);
this.useIframe(sid, uri);
} else if (isAndroid) {
//\u542f\u7528 \u4ee3\u519b
// Android\u4e0b\u7528window.prompt\u8c03\u7528\u8c03\u7528
var value = WV_PROTOCOL + ':';
window.prompt(uri, value);
}
},
registerGC: function registerGC(sid, timeout) {
// \u5783\u573e\u56de\u6536
var that = this;
var callGCTime = Math.max(timeout || 0, CALL_GC_TIME);
var paramGCTime = Math.max(timeout || 0, PARAM_GC_TIME);
var chunkGCTime = Math.max(timeout || 0, CHUNK_GC_TIME);
setTimeout(function () {
that.unregisterCall(sid);
}, callGCTime);
if (isIOS) {
// ios\u4e0b\u5904\u7406params\u7684\u56de\u6536
setTimeout(function () {
if (that.params[PARAM_PREFIX + sid]) {
delete that.params[PARAM_PREFIX + sid];
}
}, paramGCTime);
} else if (isAndroid) {
// android\u4e0b\u5904\u7406chunk\u7684\u56de\u6536
setTimeout(function () {
if (that.chunks[CHUNK_PREFIX + sid]) {
delete that.chunks[CHUNK_PREFIX + sid];
}
}, chunkGCTime);
}
},
onComplete: function onComplete(sid, data, type) {
// console.log(sid, data, type)
clearTimeout(sid);
var call = this.unregisterCall(sid);
var success = call.success;
var failure = call.failure;
var deferred = call.deferred;
data = data ? data : this.getData(sid);
data = this.parseData(data);
var ret = data.ret;
if (typeof ret === 'string') {
data = data.value || data;
if (!data.ret) {
data.ret = [ret];
}
}
if (type === 'success') {
success && success(data);
deferred && deferred.resolve(data);
} else if (type === 'failure') {
failure && failure(data);
deferred && deferred.reject(data);
}
if (isIOS) {
//iOS\u4e0b\u56de\u6536iframe
this.retrieveIframe(sid);
if (this.params[PARAM_PREFIX + sid]) {
delete this.params[PARAM_PREFIX + sid];
}
} else if (isAndroid) {
if (this.chunks[CHUNK_PREFIX + sid]) {
delete this.chunks[CHUNK_PREFIX + sid];
}
}
}
};
for (var key in WV_Core) {
if (!hasOwnProperty.call(WindVane, key)) {
WindVane[key] = WV_Core[key];
}
}
//debug
window.windVane = WindVane;
window.WV_Private = WV_Private;
if (typeof define === 'function') {
// AMD. Register as an anonymous module.
define("libs/windvane", function () {
return windVane;
});
} else if (typeof module !== 'undefined' && module.exports) {
module.exports = WindVane;
module.exports.windVane = WindVane;
}
})(window, window['lib'] || (window['lib'] = {}));