UNPKG

h5-cli

Version:

hello

451 lines (382 loc) 15.5 kB
'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'] = {}));