OfflineRest.js
3.15 KB
//>>built
define("dojox/rpc/OfflineRest",["dojo","dojox","dojox/data/ClientFilter","dojox/rpc/Rest","dojox/storage"],function(g,d){function l(a){return a.replace(/[^0-9A-Za-z_]/g,"_")}function p(a,b){m&&!r&&(b||a&&a.__id)&&d.storage.put(l(b||a.__id),"object"==typeof a?d.json.ref.toJson(a):a,function(){},"dojox_rpc_OfflineRest")}function u(a){return a instanceof Error&&(503==a.status||12E3<a.status||!a.status)}function v(){if(m){var a=d.storage.get("dirty","dojox_rpc_OfflineRest");if(a)for(var b in a)w(b,a)}}
function t(){f.sendChanges();f.downloadChanges()}function x(a,b,c,e,h){"delete"==a?d.storage.remove(l(b),"dojox_rpc_OfflineRest"):d.storage.put(l(c),e,function(){},"dojox_rpc_OfflineRest");if(a=h&&h._store)a.updateResultSet(a._localBaseResults,a._localBaseFetch),d.storage.put(l(h._getRequest(a._localBaseFetch.query).url),d.json.ref.toJson(a._localBaseResults),function(){},"dojox_rpc_OfflineRest")}function w(a,b){var c=b[a],e=d.rpc.JsonRest.getServiceAndId(c.id),e=y(c.method,e.service,e.id,c.content);
b[a]=c;d.storage.put("dirty",b,function(){},"dojox_rpc_OfflineRest");e.addBoth(function(b){if(u(b))return null;var c=d.storage.get("dirty","dojox_rpc_OfflineRest")||{};delete c[a];d.storage.put("dirty",c,function(){},"dojox_rpc_OfflineRest");return b});return e}var n=d.rpc.Rest,m,q=n._index;d.storage.manager.addOnLoad(function(){m=d.storage.manager.available;for(var a in q)p(q[a],a)});var r,f,A=setInterval(t,15E3);g.connect(document,"ononline",t);f=d.rpc.OfflineRest={turnOffAutoSync:function(){clearInterval(A)},
sync:t,sendChanges:v,downloadChanges:function(){},addStore:function(a,b){f.stores.push(a);a.fetch({queryOptions:{cache:!0},query:b,onComplete:function(b,d){a._localBaseResults=b;a._localBaseFetch=d}})}};f.stores=[];var B=n._get;n._get=function(a,b){try{v();if(window.navigator&&!1===navigator.onLine)throw Error();var c=B(a,b)}catch(h){c=new g.Deferred,c.errback(h)}var e=d.rpc._sync;c.addCallback(function(d){p(d,a._getRequest(b).url);return d});c.addErrback(function(h){if(m){if(u(h)){var f={},z=function(a,
b){if(f[a])return b;b=g.fromJson(d.storage.get(l(a),"dojox_rpc_OfflineRest"))||b;f[a]=b;for(var c in b){var e=b[c];if(a=e&&e.$ref)a.substring&&"cid:"==a.substring(0,4)&&(a=a.substring(4)),b[c]=z(a,e)}if(b instanceof Array)for(c=0;c<b.length;c++)void 0===b[c]&&b.splice(c--,1);return b};r=!0;var k=z(a._getRequest(b).url);if(!k)return h;r=!1;return k}return h}if(e)return Error("Storage manager not loaded, can not continue");c=new g.Deferred;c.addCallback(arguments.callee);d.storage.manager.addOnLoad(function(){c.callback()});
return c});return c};g.addOnLoad(function(){g.connect(d.data,"restListener",function(a){var b=a.channel,c=a.event.toLowerCase(),e=d.rpc.JsonRest&&d.rpc.JsonRest.getServiceAndId(b).service;x(c,b,"post"==c?b+a.result.id:b,g.toJson(a.result),e)})});var y=n._change;n._change=function(a,b,c,e){if(!m)return y.apply(this,arguments);var h=b._getRequest(c).url;x(a,h,d.rpc.JsonRest._contentId,e,b);var g=d.storage.get("dirty","dojox_rpc_OfflineRest")||{};if("put"==a||"delete"==a)var f=h;else{var f=0,k;for(k in g)isNaN(parseInt(k))||
(f=k);f++}g[f]={method:a,id:h,content:e};return w(f,g)};g.connect(q,"onLoad",p);g.connect(q,"onUpdate",p);return f});