Skip to content

Commit

Permalink
offline improve of auth.js and status code change in reachability; wi…
Browse files Browse the repository at this point in the history
…th bugfix of external.js with https://
  • Loading branch information
brandnewera committed Feb 17, 2014
1 parent d09438d commit a3badbf
Show file tree
Hide file tree
Showing 10 changed files with 213 additions and 64 deletions.
2 changes: 1 addition & 1 deletion sumeru/build/build.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
var path = require('path');
var fs = require('fs');
var _debug = true;
var _debug = false;

var baseDir = path.join(__dirname, '../../');
var sumeruDir = path.join(__dirname, '/../');
Expand Down
2 changes: 1 addition & 1 deletion sumeru/build/buildJavascript.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/
var sumeru = require(__dirname + '/../src/newPkg.js')();
require(__dirname + '/../src/log.js')(sumeru);
var _debug = true;
var _debug = false;

module.exports = function(sumeruDir, dstDir) {
var fs = require('fs');
Expand Down
45 changes: 34 additions & 11 deletions sumeru/src/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@

var pkgAuth = fw.addSubPackage('auth');
var inited = false;
var isOnline =fw.reachability ? fw.reachability.getStatus() == fw.reachability.STATUS_CONNECTED : false;

fw.eventStack._on('online',function(){
isOnline = true;
});

fw.eventStack._on('offline',function(){
isOnline = false;
});

// fw.utils.cpp(auth,fw.utils.emitter);

var __emit = auth.emit;
Expand All @@ -24,6 +34,19 @@
}
};

/**
* 检查网络和是否已初始化,如果未初始化则触发auth的error事件并返回false,否则返回true。
*/
var checkWorking = function(cb, msg){
return function(){
if(isOnline && inited){
return cb && cb.apply(null,arguments);
}
emit('error',new Error(msg || "unconnected network"));
return;
};
};

var netMessage = fw.netMessage;
var cookie = Library.cookie;
var pubsub = new fw.pubsub._pubsubObject();
Expand Down Expand Up @@ -181,7 +204,7 @@
};

var logout = function(){

authMethod = cookie.getCookie('authMethod');

// 在非登陆状态下,或cookie里没有authMethod,不能完成退出操作,直接退出
Expand Down Expand Up @@ -316,15 +339,15 @@


fw.utils.cpp(auth,{
'login':login,
'logout':logout,
'modifyUserInfo':modifyUserInfo,
'modifyPassword':modifyPassword,
'registerValidate':registerValidate,
'register':register,
'getStatus':getStatus,
'getLastError':getLastError,
'getUserInfo':getUserInfo,
'login':checkWorking(login),
'logout':checkWorking(logout),
'modifyUserInfo':checkWorking(modifyUserInfo),
'modifyPassword':checkWorking(modifyPassword),
'registerValidate':checkWorking(registerValidate),
'register':checkWorking(register),
'getStatus':checkWorking(getStatus),
'getLastError':checkWorking(getLastError),
'getUserInfo':checkWorking(getUserInfo),
'isInited':function(){
return inited;
},
Expand All @@ -348,4 +371,4 @@
// sumeru.auth.on('statusChange',function(err,status,userinfo){console.log(err,status,userinfo)});

return;
})(sumeru);
})(sumeru);
86 changes: 86 additions & 0 deletions sumeru/src/eventStack.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/**
* eventStack
* @author [email protected]
* usage:
var targetObj = window;
var onlineHandle = function(){console.log('window online')};
var offlineHandle = function(){console.log('window offline')};
sumeru.eventStack._on(targetObj,'online',onlineHandle);
sumeru.eventStack._trigger(targetObj,'online');
sumeru.eventStack._off(targetObj,'online',onlineHandle);
sumeru.eventStack._trigger(targetObj,'online');
当targetObj 省略时 targetObj == sumeru
sumeru.eventStack._on('online',onlineHandle);
sumeru.eventStack._on('offline',offlineHandle);
*/


var runnable = function(sumeru){
if(sumeru.eventStack){
return;
}
//func将附加到target上,stackname是其在target上的属性名。
var STACKNAME ='_smr_eventFuncStack';

var api = sumeru.addSubPackage('eventStack');

//on是去重的。
var _on = function(target,eventName,func){
if(arguments.length==2){
var func = arguments[1];
var eventName = arguments[0];
var target = sumeru;
}
target[STACKNAME] = target[STACKNAME]||{};
target[STACKNAME][eventName] = target[STACKNAME][eventName]||[];
var hasIt = false;
Array.prototype.forEach.call(target[STACKNAME][eventName],function(item){
if(item===func){
hasIt = true;
}
})
if(!hasIt)target[STACKNAME][eventName].push(func);
};
var _off = function(target,eventName,func){
if(arguments.length==2){
var func = arguments[1];
var eventName = arguments[0];
var target = sumeru;
}
var funcs,p,len,i;
if(target[STACKNAME]&&target[STACKNAME][eventName]){
funcs = target[STACKNAME][eventName];
len = funcs.length;
for(i=0;i<len;i++){
if(funcs[i]===func){
funcs.splice(i,1);
return;//_on是去重的,所以匹配的只可能有一个。
}
}
}
};
var _trigger = function(target,eventName){
if(arguments.length==1){
var eventName = arguments[0];
var target = sumeru;
}
if(target[STACKNAME]&&target[STACKNAME][eventName]){
Array.prototype.forEach.call(target[STACKNAME][eventName],function(item){
item.call(this);
})
}
};
api.__reg('_on', _on, 'private');
api.__reg('_off', _off, 'private');
api.__reg('_trigger', _trigger, 'private');
}
if(typeof module !='undefined' && module.exports){
// 本函数只运行在client
//module.exports = runnable;
}else{
runnable(sumeru);

}
6 changes: 3 additions & 3 deletions sumeru/src/external.js
Original file line number Diff line number Diff line change
Expand Up @@ -285,11 +285,11 @@ var runnable = function(fw, findDiff, publishBaseDir, externalConfig, http, http
return;
}
try{
var remoteData = config.resolve(data);
var remoteData = config.resolve(data, pubName, url);
remoteData = Array.isArray(remoteData) ? remoteData : [remoteData];
return remoteData;
}catch(e){
fw.log("Please check fetch url, 3rd-party server encounters an error: ", url, "\n" ,data, "\n");
fw.log("Please check fetch url, 3rd-party server encounters an error: ", url, "\n" ,data, "\n",e.stack);
return ;
}

Expand Down Expand Up @@ -806,7 +806,7 @@ var runnable = function(fw, findDiff, publishBaseDir, externalConfig, http, http
external.__reg('post', sendPostRequest);
external.__reg('sync', synchronize);

}
};

if(typeof module !='undefined' && module.exports){
module.exports = runnable;
Expand Down
60 changes: 60 additions & 0 deletions sumeru/src/netStatus.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/**
* netStatus
* 包装原生的 window.navigator.onLine 及window的online、offline事件。
* @author [email protected]
*/
var runnable = function(sumeru){
if(sumeru.netStatus){
return;
}
var api = sumeru.addSubPackage('netStatus');

var NET_OFFLINE = 0x00;//network offline
var NET_ONLINE = 0x100;//netnork online
var status_ = window.navigator.onLine?NET_ONLINE:NET_OFFLINE; //默认取浏览器的在线状态,如果在壳里运行,需要配置壳的连接状态。

var TYPE_WIFI = 0x01;
var TYPE_3G = 0x11;
var TYPE_EDGE = 0x111;
var TYPE_GPRS = 0x1111;
var type_ = 0x00; //默认没有网络类型,暂未实现type的识别

var getNetworkInfo = function(){
return status_==NET_ONLINE?{
'type':type_,
'status':status_
}:false;
};
var setStatus_ = function(status){
status_ = status;
return status_;
};
var getStatus_ = function(){
return status_;
};

var onlineHandle = function(){
//trigger socket reconnect...
sumeru.reconnect && sumeru.reconnect();//重连
}
var offlineHandle = function(){
sumeru.netStatus.setStatus_(STATUS_OFFLINE);
sumeru.reachability.setStatus_(STATUS_OFFLINE);
sumeru.closeConnect && sumeru.closeConnect();//断开连接
}
//监听在线状态变化
window.addEventListener("offline", offlineHandle, false);
window.addEventListener("online", onlineHandle, false);

api.__reg('info', getNetworkInfo, 'publish');
api.__reg('setStatus_', setStatus_, 'publish');
api.__reg('getStatus_', getStatus_, 'publish');

}
if(typeof module !='undefined' && module.exports){
// 本函数只运行在client
//module.exports = runnable;
}else{
runnable(sumeru);

}
2 changes: 1 addition & 1 deletion sumeru/src/package.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion sumeru/src/pubsub.js
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ var runnable = function(fw,PublishContainer){
//for offline render中会执行callback,里面会用到return的 collection,所以需要延迟执行。--jin
if(cache!=null){
//collection.render();
setTimeout((function(c){return function(){c.render()}})(collection),2);
setTimeout((function(c){return function(){c.render()}})(collection),0);
}
return collection;
//when data received from server, will run the onComplete
Expand Down
61 changes: 17 additions & 44 deletions sumeru/src/reachability.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,45 +7,29 @@
* @author [email protected]
*/
var runnable = function(sumeru){

var STATUS_OFFLINE = 0x00;
var STATUS_CONNECTING = 0x10;
var STATUS_CONNECTOPEN = 0x11;
var STATUS_CONNECTED = 0x100;

var TYPE_WIFI = 0x01;
var TYPE_3G = 0x11;
var TYPE_EDGE = 0x111;
var TYPE_GPRS = 0x1111;

var status_ = STATUS_OFFLINE; //默认离线
var type_ = 0x00; //默认没有网络类型,暂未实现type的识别

if(sumeru.reachability){
return;
}

var api = sumeru.addSubPackage('reachability');

var functionstack = {};
var STATUS_OFFLINE = 0x00;
var STATUS_CONNECTING = 0x10;//network online,正在尝试连接socket
var STATUS_CONNECTOPEN = 0x11;//scoket 已连接,服务器正在等待客户端echo 握手
var STATUS_CONNECTED = 0x100;//cs已连接

var trigger_reachability = function(status){
if (status === STATUS_OFFLINE) {
functionstack.offline && functionstack.offline();
}else if(status === STATUS_CONNECTING) {
functionstack.connecting && functionstack.connecting();
}else if(status === STATUS_CONNECTOPEN) {
functionstack.connectopen && functionstack.connectopen();
}else if(status === STATUS_CONNECTED) {
functionstack.online && functionstack.online();
}
}
var setEvent = function(type,func){
functionstack[type] = func;
}
var status_ = STATUS_OFFLINE; //默认离线


var setStatus = function(status){
trigger_reachability(status);
status_ = status;
if(status_!=status){
if(status_==STATUS_CONNECTED&&status==STATUS_OFFLINE){
sumeru.eventStack._trigger('offline');
}
if(status==STATUS_CONNECTED){
sumeru.eventStack._trigger('online');
}
status_ = status;
}
return status_;
};

Expand All @@ -57,24 +41,13 @@ var runnable = function(sumeru){
api.STATUS_CONNECTING = STATUS_CONNECTING;
api.STATUS_CONNECTOPEN = STATUS_CONNECTOPEN;
api.STATUS_CONNECTED = STATUS_CONNECTED;

//FIXME 完善在线功能,添加trigger online、offline方法。
//因为断线有两种可能,一种是与server中断(可能server故障),第二种是失去网络连接

if (typeof module =='undefined' || !module.exports) {
//前端绑定
window.addEventListener("offline", function(){
sumeru.reachability.setStatus_(STATUS_OFFLINE);
sumeru.closeConnect && sumeru.closeConnect();//重连
}, false);
window.addEventListener("online", function(){
//trigger socket reconnect...
sumeru.reconnect && sumeru.reconnect();//重连
}, false);
}

api.__reg('setStatus_', setStatus, 'private');
api.__reg('getStatus', getStatus, 'private');
api.__reg('setEvent', setEvent, 'private');
};

if(typeof module !='undefined' && module.exports){
Expand Down
11 changes: 9 additions & 2 deletions sumeru/src/router.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ var SUMERU_ROUTER = SUMERU_ROUTER === undefined ? true : SUMERU_ROUTER;
}
return hash.join("&");

}
};
/**
* 将session部份,拼入hash
* 修改by孙东,此函数作为session改造的一部分,在压入url的session只能压入本controller的内容
Expand Down Expand Up @@ -128,12 +128,19 @@ var SUMERU_ROUTER = SUMERU_ROUTER === undefined ? true : SUMERU_ROUTER;
isControllerChange = uriParts.controller != lastController;
lastController = uriParts.controller;

//处理arguments change
isParamsChange = lastParams != uriParts.contr_argu.join("/");
lastParams = uriParts.contr_argu.join("/");

// 如果session序列化发生变化,或者controller变化,则将从url恢复到session中,但不需要触发commit
if(isSessionChange || isControllerChange){
fw.session.preResume(lastSession,lastController);
}
if (isParamsChange || isSessionChange){
isforce = true;
}

if(isIgnore == false && (isControllerChange || isParamsChange)){
if(isforce){
// 进入目标controller.
fw.init((function(contr, params){
return function(){
Expand Down

0 comments on commit a3badbf

Please sign in to comment.