Skip to content

Commit

Permalink
Merge pull request #9 from byjg/jquery-sse-8
Browse files Browse the repository at this point in the history
jquery-sse-8 Fix behavior on Edge/IE
  • Loading branch information
byjg committed Oct 30, 2018
2 parents 8d95ced + f6b5d07 commit 74dfeb6
Showing 1 changed file with 108 additions and 69 deletions.
177 changes: 108 additions & 69 deletions jquery.sse.js
Expand Up @@ -29,6 +29,7 @@
$.extend(settings, customSettings);

sse._url = url;
sse._remoteHost = null;
sse._settings = settings;

// Start the proper EventSource object or Ajax fallback
Expand Down Expand Up @@ -64,7 +65,6 @@
this.type = null;

return true;

};

return sse;
Expand Down Expand Up @@ -102,92 +102,131 @@
me.instance = {successCount: 0, id: null, retry: 3000, data: "", event: ""};
runAjax(me);
}

function handleAjax(me, receivedData) {
if (!me.instance) {
return;
}

if (me.instance.successCount++ === 0) {
me._settings.onOpen();
}

var lines = receivedData.split("\n");

// Process the return to generate a compatible SSE response
me.instance.data = "";
var countBreakLine = 0;
for (var key in lines) {
var separatorPos = lines[key].indexOf(":");
var item = [
lines[key].substr(0, separatorPos),
lines[key].substr(separatorPos + 1)
];
switch (item[0]) {
// If the first part is empty, needed to check another sequence
case "":
if (!item[1] && countBreakLine++ === 1) { // Avoid comments!
eventMessage = {
data: me.instance.data,
lastEventId: me.instance.id,
origin: 'http://' + me._remoteHost,
returnValue: true
};

// If there are a custom event then call it
if (me.instance.event && me._settings.events[me.instance.event]) {
me._settings.events[me.instance.event](eventMessage);
} else {
me._settings.onMessage(eventMessage);
}
me.instance.data = "";
me.instance.event = "";
countBreakLine = 0;
}
break;

// Define the new retry object;
case "retry":
countBreakLine = 0;
me.instance.retry = parseInt(item[1].trim());
break;

// Define the new ID
case "id":
countBreakLine = 0;
me.instance.id = item[1].trim();
break;

// Define a custom event
case "event":
countBreakLine = 0;
me.instance.event = item[1].trim();
break;

// Define the data to be processed.
case "data":
countBreakLine = 0;
me.instance.data += (me.instance.data !== "" ? "\n" : "") + item[1].trim();
break;

default:
countBreakLine = 0;
}
}
}

function getRemoteHost(me) {
$.ajax({
type: 'HEAD',
headers: me._settings.headers,
url: me._url,
complete: function(xhr) {
me._remoteHost = xhr.getResponseHeader('Host');
}
});
}

// Handle the continous Ajax request (fallback)
function runAjax(me) {
if (!me.instance) {
return;
}

if (!me._remoteHost) {
getRemoteHost(me);
}

var headers = {'Last-Event-ID': me.instance.id};

$.extend(headers, me._settings.headers);

// https://stackoverflow.com/questions/7740646/jquery-read-ajax-stream-incrementally
var lastResponseLen = false;
var thisResponse = "";
$.ajax({
url: me._url,
method: 'GET',
headers: headers,
success: function (receivedData, status, info) {
if (!me.instance) {
return;
}

if (me.instance.successCount++ === 0) {
me._settings.onOpen();
}
xhrFields: {
onprogress: function(e) {
var response = e.currentTarget.response;
if(lastResponseLen === false) {
thisResponse += response;
} else {
thisResponse += response.substring(lastResponseLen);
}
lastResponseLen = response.length;

var lines = receivedData.split("\n");

// Process the return to generate a compatible SSE response
me.instance.data = "";
var countBreakLine = 0;
for (var key in lines) {
var separatorPos = lines[key].indexOf(":");
var item = [
lines[key].substr(0, separatorPos),
lines[key].substr(separatorPos + 1)
];
switch (item[0]) {
// If the first part is empty, needed to check another sequence
case "":
if (!item[1] && countBreakLine++ === 1) { // Avoid comments!
eventMessage = {
data: me.instance.data,
lastEventId: me.instance.id,
origin: 'http://' + info.getResponseHeader('Host'),
returnValue: true
};

// If there are a custom event then call it
if (me.instance.event && me._settings.events[me.instance.event]) {
me._settings.events[me.instance.event](eventMessage);
} else {
me._settings.onMessage(eventMessage);
}
me.instance.data = "";
me.instance.event = "";
countBreakLine = 0;
}
break;

// Define the new retry object;
case "retry":
countBreakLine = 0;
me.instance.retry = parseInt(item[1].trim());
break;

// Define the new ID
case "id":
countBreakLine = 0;
me.instance.id = item[1].trim();
break;

// Define a custom event
case "event":
countBreakLine = 0;
me.instance.event = item[1].trim();
break;

// Define the data to be processed.
case "data":
countBreakLine = 0;
me.instance.data += (me.instance.data !== "" ? "\n" : "") + item[1].trim();
break;

default:
countBreakLine = 0;
var hasFullMessage = thisResponse.lastIndexOf("\n\n");
if (hasFullMessage >= 0) {
var chunk = thisResponse.substring(0, hasFullMessage + 2);
thisResponse = thisResponse.substring(hasFullMessage + 2);
handleAjax(me, chunk)
}
}
},
success: function () {
setTimeout(function () {
runAjax(me);
}, me.instance.retry);
Expand Down

0 comments on commit 74dfeb6

Please sign in to comment.