123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- if(!dojo._hasResource["dojox.socket"]){
- dojo._hasResource["dojox.socket"] = true;
- dojo.provide("dojox.socket");
- dojo.require("dojo.cookie");
- var WebSocket = window.WebSocket;
- function Socket(/*dojo.__XhrArgs*/ argsOrUrl){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if(typeof argsOrUrl == "string"){
- argsOrUrl = {url: argsOrUrl};
- }
- return WebSocket ? dojox.socket.WebSocket(argsOrUrl, true) : dojox.socket.LongPoll(argsOrUrl);
- };
- dojox.socket = Socket;
- Socket.WebSocket = function(args, fallback){
-
-
- var ws = new WebSocket(new dojo._Url(document.baseURI.replace(/^http/i,'ws'), args.url));
- ws.on = function(type, listener){
- ws.addEventListener(type, listener, true);
- };
- var opened;
- dojo.connect(ws, "onopen", function(event){
- opened = true;
- });
- dojo.connect(ws, "onclose", function(event){
- if(opened){
- return;
- }
- if(fallback){
- Socket.replace(ws, dojox.socket.LongPoll(args), true);
- }
- });
- return ws;
- };
- Socket.replace = function(socket, newSocket, listenForOpen){
-
- socket.send = dojo.hitch(newSocket, "send");
- socket.close = dojo.hitch(newSocket, "close");
- if(listenForOpen){
- proxyEvent("open");
- }
-
- dojo.forEach(["message", "close", "error"], proxyEvent);
- function proxyEvent(type){
- (newSocket.addEventListener || newSocket.on).call(newSocket, type, function(event){
- var newEvent = document.createEvent("MessageEvent");
- newEvent.initMessageEvent(event.type, false, false, event.data, event.origin, event.lastEventId, event.source);
- socket.dispatchEvent(newEvent);
- }, true);
- }
- };
- Socket.LongPoll = function(/*dojo.__XhrArgs*/ args){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var cancelled = false,
- first = true,
- timeoutId,
- connections = [];
-
-
- var socket = {
- send: function(data){
-
-
- var sendArgs = dojo.delegate(args);
- sendArgs.rawBody = data;
- clearTimeout(timeoutId);
- var deferred = first ? (first = false) || socket.firstRequest(sendArgs) :
- socket.transport(sendArgs);
- connections.push(deferred);
- deferred.then(function(response){
-
- socket.readyState = 1;
-
- connections.splice(dojo.indexOf(connections, deferred), 1);
-
-
- if(!connections.length){
- timeoutId = setTimeout(connect, args.interval);
- }
- if(response){
-
- fire("message", {data: response}, deferred);
- }
- }, function(error){
- connections.splice(dojo.indexOf(connections, deferred), 1);
-
- if(!cancelled){
- fire("error", {error:error}, deferred);
- if(!connections.length){
- socket.readyState = 3;
- fire("close", {wasClean:false}, deferred);
- }
- }
- });
- return deferred;
- },
- close: function(){
-
-
- socket.readyState = 2;
- cancelled = true;
- for(var i = 0; i < connections.length; i++){
- connections[i].cancel();
- }
- socket.readyState = 3;
- fire("close", {wasClean:true});
- },
- transport: args.transport || dojo.xhrPost,
- args: args,
- url: args.url,
- readyState: 0,
- CONNECTING: 0,
- OPEN: 1,
- CLOSING: 2,
- CLOSED: 3,
- dispatchEvent: function(event){
- fire(event.type, event);
- },
- on: function(type, callback){
- return dojo.connect(this, "on" + type, callback);
- },
- firstRequest: function(args){
-
-
-
-
-
-
-
-
- var headers = (args.headers || (args.headers = {}));
- headers.Pragma = "start-long-poll";
- try{
- return this.transport(args);
- }finally{
-
- delete headers.Pragma;
- }
- }
- };
- function connect(){
- if(socket.readyState == 0){
-
-
-
- fire("open",{});
- }
-
- if(!connections.length){
- socket.send();
- }
- }
- function fire(type, object, deferred){
- if(socket["on" + type]){
- var event = document.createEvent("HTMLEvents");
- event.initEvent(type, false, false);
- dojo.mixin(event, object);
- event.ioArgs = deferred && deferred.ioArgs;
- socket["on" + type](event);
- }
- }
-
- socket.connect = socket.on;
-
- setTimeout(connect);
- return socket;
- };
- }
|