//
function transport_ws(doc, xynt_streaming, page)
{
+ // if four arguments manage if WS or WSS connection
+ if (arguments.length > 3)
+ this.is_secure = arguments[3];
+ else
+ this.is_secure = false;
+
+ if (this.is_secure)
+ this.name = "WebSocketSecure";
+ else
+ this.name = "WebSocket";
this.ctx_new = "";
var self = this;
this.failed = false;
this.xynt_streaming = xynt_streaming;
try {
-this.xynt_streaming.log("PAGE: "+page);
+ this.xynt_streaming.log("PAGE: "+page);
this.ws = new WebSocket(page);
this.ws.onopen = function () {
+ console.log('WS On open');
+
self.xynt_streaming.log("onopen");
if (this.readyState == 1) {
// connected
}
};
this.ws.onmessage = function (msg) {
+ console.log('WS On message');
self.xynt_streaming.log("onmessage");
// new data in msg.data
self.ctx_new += msg.data;
};
this.ws.onclose = function (msg) {
- this.onopen = null;
- this.onclose = null;
- this.onerror = null;
+ console.log('WS On close');
+ self.onopen = null;
+ self.onclose = null;
+ self.onerror = null;
self.xynt_streaming.log("onclose"+self.init_steps);
if (self.init_steps == 0)
self.ws_cb("error");
transport_ws.prototype = {
doc: null,
+ name: null,
xynt_streaming: "ready",
ws: null,
stopped: true,
}
}
}
+ else if (from == "open") {
+ this.flush_out_queue();
+ }
+
if (this.ws != null && this.ws.readyState > 1) {
this.stopped = true;
}
},
+ flush_out_queue: function() {
+ var l_out = this.xynt_streaming.out_queue.length;
+
+ if (l_out == 0)
+ return;
+
+ console.log('flush_out_queue: ' + l_out);
+ for (var i = 0 ; i < l_out ; i++) {
+ if (this.ws.readyState != 1) {
+ break;
+ }
+ var item = this.xynt_streaming.out_queue.shift();
+ var sent = true;
+ try {
+ this.ws.send(item);
+ }
+ catch (ex) {
+ this.xynt_streaming.out_queue.unshift(item);
+ break;
+ }
+ }
+ },
+
+ send: function(msg) {
+ console.log('new send');
+ if (this.ws && this.ws.readyState == 1) {
+ try {
+ console.log('Try send ... ');
+ this.flush_out_queue();
+ this.ws.send(msg);
+ console.log(' ... done');
+ }
+ catch (ex) {
+ console.log(' ... catched exception');
+ this.xynt_streaming.out_queue.push(msg);
+ }
+ }
+ else {
+ console.log('ws not ready: push into out_queue');
+ this.xynt_streaming.out_queue.push(msg);
+ }
+ },
+
ws_abort: function() {
if (this.ws != null) {
this.xynt_streaming.log("WSCLOSE");
//
function transport_xhr(doc, xynt_streaming, page)
{
+ this.name = "XHR";
this.doc = doc;
this.xynt_streaming = xynt_streaming;
this.xhr = createXMLHttpRequest();
transport_xhr.prototype = {
doc: null,
+ name: null,
xynt_streaming: "ready",
xhr: null,
stopped: true,
//
function transport_htmlfile(doc, xynt_streaming, page)
{
+ this.name = "HTMLFile";
this.doc = doc;
this.xynt_streaming = xynt_streaming;
this.transfdoc = new ActiveXObject("htmlfile");
transport_htmlfile.prototype = {
doc: null,
+ name: null,
xynt_streaming: null,
stopped: true,
ifra: null,
//
function transport_iframe(doc, xynt_streaming, page)
{
+ this.name = "IFRAME";
this.doc = doc;
this.xynt_streaming = xynt_streaming;
this.ifra = doc.createElement("iframe");
transport_iframe.prototype = {
doc: null,
+ name: null,
xynt_streaming: null,
stopped: true,
ifra: null,
this.doc = win.document;
this.keepalive_old = -1;
this.keepalive_new = -1;
+ this.out_queue = [];
this.mon_errtime = this.keepalives_eq_max * this.watchdog_checktm * this.watchdog_timeout;
this.mon_wrntime = this.mon_errtime / 2;
win: null,
transp_type: null,
transp_port: 80,
+ transp_type_cur: null,
+ transp_port_cur: 80,
transp_fback: 0,
transp: null,
console: null,
comm_match: /_*@BEGIN@(.*?)@END@/g,
comm_clean: /_*@BEGIN@(.*?)@END@/,
stream: "",
+ out_queue: null,
the_end: false,
mon_time: -1,
// page arrangement
this.page = url_complete(this.win.location.href, this.page);
+ // DEFAULT TRANSPORT PROTOCOL HERE websocketsec, websocket
if (this.transp_fback > 0) {
- transp_type = "websocket";
- transp_port = (this.transp_fback == 2 ? 80 : 8080);
+ if (location.protocol == 'https:') {
+ transp_type = "websocketsec";
+ transp_port = 443;
+ }
+ else {
+ transp_type = "websocket";
+ transp_port = (this.transp_fback == 2 ? 80 : 8080);
+ }
+
}
else {
transp_type = this.transp_type;
transp_port = this.transp_port;
}
- if (transp_type == "websocket") {
- var end_proto, first_slash;
+ this.transp_type_cur = transp_type;
+ this.transp_port_cur = transp_port;
+
+ if (transp_type == "websocket" || transp_type == "websocketsec") {
+ var end_proto, first_slash, newpage;
// change protocol
this.log("precha ["+this.page+"]");
- end_proto = this.page.indexOf("://");
- first_slash = this.page.substring(end_proto+3).indexOf("/");
+ if (transp_type == "websocketsec") {
+ newpage = this.page.replace(/\.php$/g, "_wss.php").replace(/\.php\?/g, "_wss.php?");
+ }
+ else {
+ newpage = this.page;
+ }
+ end_proto = newpage.indexOf("://");
+ first_slash = newpage.substring(end_proto+3).indexOf("/");
- page = "ws://" + this.page.substring(end_proto+3, end_proto+3+first_slash) + ":" + transp_port + this.page.substring(end_proto+3 + first_slash);
+ page = (transp_type == "websocketsec" ? "wss://" : "ws://")
+ + newpage.substring(end_proto+3, end_proto+3 + first_slash) + ":"
+ + transp_port + newpage.substring(end_proto+3 + first_slash);
+ // this.log("MOP WS: " + page);
}
else {
page = this.page;
try {
// transport instantiation
- if (transp_type == "websocket") {
+ if (transp_type == "websocketsec") {
+ page = url_append_args(page, "transp", "websocketsec");
+ this.transp = new transport_ws(this.doc, this, page, true);
+ }
+ else if (transp_type == "websocket") {
page = url_append_args(page, "transp", "websocket");
this.transp = new transport_ws(this.doc, this, page);
}
var ctx_new_len;
if (this.sandbox != null) {
- // from old: var zug = "POLL sess = "+sess+" stat = "+stat+" subst = "+subst+" step = "+this.gst.st+" step_loc = "+this.gst.st_loc+" step_loc_new = "+this.gst.st_loc_new+" STOP: "+this.stopped;
- var zug = "WATCHDOG sess = ["+this.sess+"] step = "+this.gst.st+" step_loc = "+this.gst.st_loc+" step_loc_new = "+this.gst.st_loc_new;
+ var zug = "WATCHDOG sess = ["+this.sess+"] step = "+this.gst.st+" step_loc = "+this.gst.st_loc+" step_loc_new = "+this.gst.st_loc_new+"Transport: "+this.transp.name;
if (zug != this.sandbox.innerHTML)
this.sandbox.innerHTML = zug;
}
//xx this.hbit("+");
// alert("SINGLE: ["+singlecomm+"]");
+ // window.console.log("["+singlecomm+"]");
this.cmdproc(singlecomm);
+ if (this.transp_type_cur) {
+ this.transp_type = this.transp_type_cur;
+ this.transp_port = this.transp_port_cur;
+ }
again = 1;
}
} while (again);
return;
},
+ send: function(msg) {
+ if (typeof(this.transp.send) == 'undefined') {
+ this.log('send not implemented for ' + this.transp_type);
+ return;
+ }
+
+ return this.transp.send(msg);
+ },
+
//
// moved to xynt-streaming-ifra as push()
//