Add massive collection of CSS, JavaScript and theme assets that were previously excluded: **CSS Files (681 total):** - HVAC plugin-specific styles (hvac-*.css): 34 files including dashboard, certificates, registration, mobile nav, accessibility fixes, animations, and welcome popup - Theme framework files (Astra, builder systems, layouts): 200+ files - Plugin compatibility styles (WooCommerce, WPForms, Elementor, Contact Form 7): 150+ files - WordPress core and editor styles: 50+ files - Responsive and RTL language support: 200+ files **JavaScript Files (400+ total):** - HVAC plugin functionality (hvac-*.js): 27 files including menu systems, dashboard enhancements, profile sharing, mobile responsive features, accessibility, and animations - Framework and library files: jQuery plugins, GSAP, AOS, Swiper, Chart.js, Lottie, Isotope - Plugin compatibility scripts: WPForms, WooCommerce, Elementor, Contact Form 7, LifterLMS - WordPress core functionality: customizer, admin, block editor compatibility - Third-party integrations: Stripe, SMTP, analytics, search functionality **Assets:** - Certificate background images and logos - Comprehensive theme styling infrastructure - Mobile-responsive design systems - Cross-browser compatibility assets - Performance-optimized minified versions **Updated .gitignore:** - Fixed asset directory whitelisting patterns to properly include CSS/JS/images - Added proper directory structure recognition (!/assets/css/, !/assets/js/, etc.) - Maintains security by excluding sensitive files while including essential assets This commit provides the complete frontend infrastructure needed for: - Full theme functionality and styling - Plugin feature implementations - Mobile responsiveness and accessibility - Cross-browser compatibility - Performance optimization - Developer workflow support
773 lines
19 KiB
JavaScript
773 lines
19 KiB
JavaScript
/**
|
|
* EventSource
|
|
* https://github.com/Yaffle/EventSource
|
|
*
|
|
* Released under the MIT License (MIT)
|
|
* https://github.com/Yaffle/EventSource/blob/master/LICENSE.md
|
|
*/
|
|
|
|
/*jslint indent: 2, vars: true, plusplus: true */
|
|
/*global setTimeout, clearTimeout */
|
|
|
|
( function ( global ) {
|
|
'use strict';
|
|
|
|
var setTimeout = global.setTimeout;
|
|
var clearTimeout = global.clearTimeout;
|
|
var XMLHttpRequest = global.XMLHttpRequest;
|
|
var XDomainRequest = global.XDomainRequest;
|
|
var NativeEventSource = global.EventSource;
|
|
var document = global.document;
|
|
|
|
if ( Object.create == null ) {
|
|
Object.create = function ( C ) {
|
|
function F() {}
|
|
F.prototype = C;
|
|
return new F();
|
|
};
|
|
}
|
|
|
|
var k = function () {};
|
|
|
|
function XHRWrapper( xhr ) {
|
|
this.withCredentials = false;
|
|
this.responseType = '';
|
|
this.readyState = 0;
|
|
this.status = 0;
|
|
this.statusText = '';
|
|
this.responseText = '';
|
|
this.onprogress = k;
|
|
this.onreadystatechange = k;
|
|
this._contentType = '';
|
|
this._xhr = xhr;
|
|
this._sendTimeout = 0;
|
|
this._abort = k;
|
|
}
|
|
|
|
XHRWrapper.prototype.open = function ( method, url ) {
|
|
this._abort( true );
|
|
|
|
var that = this;
|
|
var xhr = this._xhr;
|
|
var state = 1;
|
|
var timeout = 0;
|
|
|
|
this._abort = function ( silent ) {
|
|
if ( that._sendTimeout !== 0 ) {
|
|
clearTimeout( that._sendTimeout );
|
|
that._sendTimeout = 0;
|
|
}
|
|
if ( state === 1 || state === 2 || state === 3 ) {
|
|
state = 4;
|
|
xhr.onload = k;
|
|
xhr.onerror = k;
|
|
xhr.onabort = k;
|
|
xhr.onprogress = k;
|
|
xhr.onreadystatechange = k;
|
|
// IE 8 - 9: XDomainRequest#abort() does not fire any event
|
|
// Opera < 10: XMLHttpRequest#abort() does not fire any event
|
|
xhr.abort();
|
|
if ( timeout !== 0 ) {
|
|
clearTimeout( timeout );
|
|
timeout = 0;
|
|
}
|
|
if ( ! silent ) {
|
|
that.readyState = 4;
|
|
that.onreadystatechange();
|
|
}
|
|
}
|
|
state = 0;
|
|
};
|
|
|
|
var onStart = function () {
|
|
if ( state === 1 ) {
|
|
//state = 2;
|
|
var status = 0;
|
|
var statusText = '';
|
|
var contentType = undefined;
|
|
if ( ! ( 'contentType' in xhr ) ) {
|
|
try {
|
|
status = xhr.status;
|
|
statusText = xhr.statusText;
|
|
contentType = xhr.getResponseHeader( 'Content-Type' );
|
|
} catch ( error ) {
|
|
// IE < 10 throws exception for `xhr.status` when xhr.readyState === 2 || xhr.readyState === 3
|
|
// Opera < 11 throws exception for `xhr.status` when xhr.readyState === 2
|
|
// https://bugs.webkit.org/show_bug.cgi?id=29121
|
|
status = 0;
|
|
statusText = '';
|
|
contentType = undefined;
|
|
// Firefox < 14, Chrome ?, Safari ?
|
|
// https://bugs.webkit.org/show_bug.cgi?id=29658
|
|
// https://bugs.webkit.org/show_bug.cgi?id=77854
|
|
}
|
|
} else {
|
|
status = 200;
|
|
statusText = 'OK';
|
|
contentType = xhr.contentType;
|
|
}
|
|
if ( status !== 0 ) {
|
|
state = 2;
|
|
that.readyState = 2;
|
|
that.status = status;
|
|
that.statusText = statusText;
|
|
that._contentType = contentType;
|
|
that.onreadystatechange();
|
|
}
|
|
}
|
|
};
|
|
var onProgress = function () {
|
|
onStart();
|
|
if ( state === 2 || state === 3 ) {
|
|
state = 3;
|
|
var responseText = '';
|
|
try {
|
|
responseText = xhr.responseText;
|
|
} catch ( error ) {
|
|
// IE 8 - 9 with XMLHttpRequest
|
|
}
|
|
that.readyState = 3;
|
|
that.responseText = responseText;
|
|
that.onprogress();
|
|
}
|
|
};
|
|
var onFinish = function () {
|
|
// Firefox 52 fires "readystatechange" (xhr.readyState === 4) without final "readystatechange" (xhr.readyState === 3)
|
|
// IE 8 fires "onload" without "onprogress"
|
|
onProgress();
|
|
if ( state === 1 || state === 2 || state === 3 ) {
|
|
state = 4;
|
|
if ( timeout !== 0 ) {
|
|
clearTimeout( timeout );
|
|
timeout = 0;
|
|
}
|
|
that.readyState = 4;
|
|
that.onreadystatechange();
|
|
}
|
|
};
|
|
var onReadyStateChange = function () {
|
|
if ( xhr != undefined ) {
|
|
// Opera 12
|
|
if ( xhr.readyState === 4 ) {
|
|
onFinish();
|
|
} else if ( xhr.readyState === 3 ) {
|
|
onProgress();
|
|
} else if ( xhr.readyState === 2 ) {
|
|
onStart();
|
|
}
|
|
}
|
|
};
|
|
var onTimeout = function () {
|
|
timeout = setTimeout( function () {
|
|
onTimeout();
|
|
}, 500 );
|
|
if ( xhr.readyState === 3 ) {
|
|
onProgress();
|
|
}
|
|
};
|
|
|
|
// XDomainRequest#abort removes onprogress, onerror, onload
|
|
xhr.onload = onFinish;
|
|
xhr.onerror = onFinish;
|
|
// improper fix to match Firefox behaviour, but it is better than just ignore abort
|
|
// see https://bugzilla.mozilla.org/show_bug.cgi?id=768596
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=880200
|
|
// https://code.google.com/p/chromium/issues/detail?id=153570
|
|
// IE 8 fires "onload" without "onprogress
|
|
xhr.onabort = onFinish;
|
|
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=736723
|
|
if (
|
|
! ( 'sendAsBinary' in XMLHttpRequest.prototype ) &&
|
|
! ( 'mozAnon' in XMLHttpRequest.prototype )
|
|
) {
|
|
xhr.onprogress = onProgress;
|
|
}
|
|
|
|
// IE 8 - 9 (XMLHTTPRequest)
|
|
// Opera < 12
|
|
// Firefox < 3.5
|
|
// Firefox 3.5 - 3.6 - ? < 9.0
|
|
// onprogress is not fired sometimes or delayed
|
|
// see also #64
|
|
xhr.onreadystatechange = onReadyStateChange;
|
|
|
|
if ( 'contentType' in xhr ) {
|
|
url +=
|
|
( url.indexOf( '?', 0 ) === -1 ? '?' : '&' ) + 'padding=true';
|
|
}
|
|
xhr.open( method, url, true );
|
|
|
|
if ( 'readyState' in xhr ) {
|
|
// workaround for Opera 12 issue with "progress" events
|
|
// #91
|
|
timeout = setTimeout( function () {
|
|
onTimeout();
|
|
}, 0 );
|
|
}
|
|
};
|
|
XHRWrapper.prototype.abort = function () {
|
|
this._abort( false );
|
|
};
|
|
XHRWrapper.prototype.getResponseHeader = function ( name ) {
|
|
return this._contentType;
|
|
};
|
|
XHRWrapper.prototype.setRequestHeader = function ( name, value ) {
|
|
var xhr = this._xhr;
|
|
if ( 'setRequestHeader' in xhr ) {
|
|
xhr.setRequestHeader( name, value );
|
|
}
|
|
};
|
|
XHRWrapper.prototype.send = function () {
|
|
// loading indicator in Safari < ? (6), Chrome < 14, Firefox
|
|
if (
|
|
! ( 'ontimeout' in XMLHttpRequest.prototype ) &&
|
|
document != undefined &&
|
|
document.readyState != undefined &&
|
|
document.readyState !== 'complete'
|
|
) {
|
|
var that = this;
|
|
that._sendTimeout = setTimeout( function () {
|
|
that._sendTimeout = 0;
|
|
that.send();
|
|
}, 4 );
|
|
return;
|
|
}
|
|
|
|
var xhr = this._xhr;
|
|
// withCredentials should be set after "open" for Safari and Chrome (< 19 ?)
|
|
xhr.withCredentials = this.withCredentials;
|
|
xhr.responseType = this.responseType;
|
|
try {
|
|
// xhr.send(); throws "Not enough arguments" in Firefox 3.0
|
|
xhr.send( undefined );
|
|
} catch ( error1 ) {
|
|
// Safari 5.1.7, Opera 12
|
|
throw error1;
|
|
}
|
|
};
|
|
|
|
function XHRTransport( xhr ) {
|
|
this._xhr = new XHRWrapper( xhr );
|
|
}
|
|
|
|
XHRTransport.prototype.open = function (
|
|
onStartCallback,
|
|
onProgressCallback,
|
|
onFinishCallback,
|
|
url,
|
|
withCredentials,
|
|
headers
|
|
) {
|
|
var xhr = this._xhr;
|
|
xhr.open( 'GET', url );
|
|
var offset = 0;
|
|
xhr.onprogress = function () {
|
|
var responseText = xhr.responseText;
|
|
var chunk = responseText.slice( offset );
|
|
offset += chunk.length;
|
|
onProgressCallback( chunk );
|
|
};
|
|
xhr.onreadystatechange = function () {
|
|
if ( xhr.readyState === 2 ) {
|
|
var status = xhr.status;
|
|
var statusText = xhr.statusText;
|
|
var contentType = xhr.getResponseHeader( 'Content-Type' );
|
|
onStartCallback( status, statusText, contentType );
|
|
} else if ( xhr.readyState === 4 ) {
|
|
onFinishCallback();
|
|
}
|
|
};
|
|
xhr.withCredentials = withCredentials;
|
|
xhr.responseType = 'text';
|
|
for ( var name in headers ) {
|
|
if ( Object.prototype.hasOwnProperty.call( headers, name ) ) {
|
|
xhr.setRequestHeader( name, headers[ name ] );
|
|
}
|
|
}
|
|
xhr.send();
|
|
};
|
|
|
|
XHRTransport.prototype.cancel = function () {
|
|
var xhr = this._xhr;
|
|
xhr.abort();
|
|
};
|
|
|
|
function EventTarget() {
|
|
this._listeners = Object.create( null );
|
|
}
|
|
|
|
function throwError( e ) {
|
|
setTimeout( function () {
|
|
throw e;
|
|
}, 0 );
|
|
}
|
|
|
|
EventTarget.prototype.dispatchEvent = function ( event ) {
|
|
event.target = this;
|
|
var typeListeners = this._listeners[ event.type ];
|
|
if ( typeListeners != undefined ) {
|
|
var length = typeListeners.length;
|
|
for ( var i = 0; i < length; i += 1 ) {
|
|
var listener = typeListeners[ i ];
|
|
try {
|
|
if ( typeof listener.handleEvent === 'function' ) {
|
|
listener.handleEvent( event );
|
|
} else {
|
|
listener.call( this, event );
|
|
}
|
|
} catch ( e ) {
|
|
throwError( e );
|
|
}
|
|
}
|
|
}
|
|
};
|
|
EventTarget.prototype.addEventListener = function ( type, listener ) {
|
|
type = String( type );
|
|
var listeners = this._listeners;
|
|
var typeListeners = listeners[ type ];
|
|
if ( typeListeners == undefined ) {
|
|
typeListeners = [];
|
|
listeners[ type ] = typeListeners;
|
|
}
|
|
var found = false;
|
|
for ( var i = 0; i < typeListeners.length; i += 1 ) {
|
|
if ( typeListeners[ i ] === listener ) {
|
|
found = true;
|
|
}
|
|
}
|
|
if ( ! found ) {
|
|
typeListeners.push( listener );
|
|
}
|
|
};
|
|
EventTarget.prototype.removeEventListener = function ( type, listener ) {
|
|
type = String( type );
|
|
var listeners = this._listeners;
|
|
var typeListeners = listeners[ type ];
|
|
if ( typeListeners != undefined ) {
|
|
var filtered = [];
|
|
for ( var i = 0; i < typeListeners.length; i += 1 ) {
|
|
if ( typeListeners[ i ] !== listener ) {
|
|
filtered.push( typeListeners[ i ] );
|
|
}
|
|
}
|
|
if ( filtered.length === 0 ) {
|
|
delete listeners[ type ];
|
|
} else {
|
|
listeners[ type ] = filtered;
|
|
}
|
|
}
|
|
};
|
|
|
|
function Event( type ) {
|
|
this.type = type;
|
|
this.target = undefined;
|
|
}
|
|
|
|
function MessageEvent( type, options ) {
|
|
Event.call( this, type );
|
|
this.data = options.data;
|
|
this.lastEventId = options.lastEventId;
|
|
}
|
|
|
|
MessageEvent.prototype = Object.create( Event.prototype );
|
|
|
|
var WAITING = -1;
|
|
var CONNECTING = 0;
|
|
var OPEN = 1;
|
|
var CLOSED = 2;
|
|
|
|
var AFTER_CR = -1;
|
|
var FIELD_START = 0;
|
|
var FIELD = 1;
|
|
var VALUE_START = 2;
|
|
var VALUE = 3;
|
|
|
|
var contentTypeRegExp = /^text\/event\-stream;?(\s*charset\=utf\-8)?$/i;
|
|
|
|
var MINIMUM_DURATION = 1000;
|
|
var MAXIMUM_DURATION = 18000000;
|
|
|
|
var parseDuration = function ( value, def ) {
|
|
var n = parseInt( value, 10 );
|
|
if ( n !== n ) {
|
|
n = def;
|
|
}
|
|
return clampDuration( n );
|
|
};
|
|
var clampDuration = function ( n ) {
|
|
return Math.min( Math.max( n, MINIMUM_DURATION ), MAXIMUM_DURATION );
|
|
};
|
|
|
|
var fire = function ( that, f, event ) {
|
|
try {
|
|
if ( typeof f === 'function' ) {
|
|
f.call( that, event );
|
|
}
|
|
} catch ( e ) {
|
|
throwError( e );
|
|
}
|
|
};
|
|
|
|
function EventSourcePolyfill( url, options ) {
|
|
EventTarget.call( this );
|
|
|
|
this.onopen = undefined;
|
|
this.onmessage = undefined;
|
|
this.onerror = undefined;
|
|
|
|
this.url = undefined;
|
|
this.readyState = undefined;
|
|
this.withCredentials = undefined;
|
|
|
|
this._close = undefined;
|
|
|
|
start( this, url, options );
|
|
}
|
|
|
|
function start( es, url, options ) {
|
|
url = String( url );
|
|
var withCredentials =
|
|
options != undefined && Boolean( options.withCredentials );
|
|
|
|
var initialRetry = clampDuration( 1000 );
|
|
var heartbeatTimeout = clampDuration( 45000 );
|
|
|
|
var lastEventId = '';
|
|
var retry = initialRetry;
|
|
var wasActivity = false;
|
|
var headers =
|
|
options != undefined && options.headers != undefined
|
|
? JSON.parse( JSON.stringify( options.headers ) )
|
|
: undefined;
|
|
var CurrentTransport =
|
|
options != undefined && options.Transport != undefined
|
|
? options.Transport
|
|
: XDomainRequest != undefined
|
|
? XDomainRequest
|
|
: XMLHttpRequest;
|
|
var transport = new XHRTransport( new CurrentTransport() );
|
|
var timeout = 0;
|
|
var currentState = WAITING;
|
|
var dataBuffer = '';
|
|
var lastEventIdBuffer = '';
|
|
var eventTypeBuffer = '';
|
|
|
|
var textBuffer = '';
|
|
var state = FIELD_START;
|
|
var fieldStart = 0;
|
|
var valueStart = 0;
|
|
|
|
var onStart = function ( status, statusText, contentType ) {
|
|
if ( currentState === CONNECTING ) {
|
|
if (
|
|
status === 200 &&
|
|
contentType != undefined &&
|
|
contentTypeRegExp.test( contentType )
|
|
) {
|
|
currentState = OPEN;
|
|
wasActivity = true;
|
|
retry = initialRetry;
|
|
es.readyState = OPEN;
|
|
var event = new Event( 'open' );
|
|
es.dispatchEvent( event );
|
|
fire( es, es.onopen, event );
|
|
} else {
|
|
var message = '';
|
|
if ( status !== 200 ) {
|
|
if ( statusText ) {
|
|
statusText = statusText.replace( /\s+/g, ' ' );
|
|
}
|
|
message =
|
|
"EventSource's response has a status " +
|
|
status +
|
|
' ' +
|
|
statusText +
|
|
' that is not 200. Aborting the connection.';
|
|
} else {
|
|
message =
|
|
"EventSource's response has a Content-Type specifying an unsupported type: " +
|
|
( contentType == undefined
|
|
? '-'
|
|
: contentType.replace( /\s+/g, ' ' ) ) +
|
|
'. Aborting the connection.';
|
|
}
|
|
throwError( new Error( message ) );
|
|
close();
|
|
var event = new Event( 'error' );
|
|
es.dispatchEvent( event );
|
|
fire( es, es.onerror, event );
|
|
}
|
|
}
|
|
};
|
|
|
|
var onProgress = function ( textChunk ) {
|
|
if ( currentState === OPEN ) {
|
|
var n = -1;
|
|
for ( var i = 0; i < textChunk.length; i += 1 ) {
|
|
var c = textChunk.charCodeAt( i );
|
|
if (
|
|
c === '\n'.charCodeAt( 0 ) ||
|
|
c === '\r'.charCodeAt( 0 )
|
|
) {
|
|
n = i;
|
|
}
|
|
}
|
|
var chunk =
|
|
( n !== -1 ? textBuffer : '' ) +
|
|
textChunk.slice( 0, n + 1 );
|
|
textBuffer =
|
|
( n === -1 ? textBuffer : '' ) + textChunk.slice( n + 1 );
|
|
if ( chunk !== '' ) {
|
|
wasActivity = true;
|
|
}
|
|
for (
|
|
var position = 0;
|
|
position < chunk.length;
|
|
position += 1
|
|
) {
|
|
var c = chunk.charCodeAt( position );
|
|
if ( state === AFTER_CR && c === '\n'.charCodeAt( 0 ) ) {
|
|
state = FIELD_START;
|
|
} else {
|
|
if ( state === AFTER_CR ) {
|
|
state = FIELD_START;
|
|
}
|
|
if (
|
|
c === '\r'.charCodeAt( 0 ) ||
|
|
c === '\n'.charCodeAt( 0 )
|
|
) {
|
|
if ( state !== FIELD_START ) {
|
|
if ( state === FIELD ) {
|
|
valueStart = position + 1;
|
|
}
|
|
var field = chunk.slice(
|
|
fieldStart,
|
|
valueStart - 1
|
|
);
|
|
var value = chunk.slice(
|
|
valueStart +
|
|
( valueStart < position &&
|
|
chunk.charCodeAt( valueStart ) ===
|
|
' '.charCodeAt( 0 )
|
|
? 1
|
|
: 0 ),
|
|
position
|
|
);
|
|
if ( field === 'data' ) {
|
|
dataBuffer += '\n';
|
|
dataBuffer += value;
|
|
} else if ( field === 'id' ) {
|
|
lastEventIdBuffer = value;
|
|
} else if ( field === 'event' ) {
|
|
eventTypeBuffer = value;
|
|
} else if ( field === 'retry' ) {
|
|
initialRetry = parseDuration(
|
|
value,
|
|
initialRetry
|
|
);
|
|
retry = initialRetry;
|
|
} else if ( field === 'heartbeatTimeout' ) {
|
|
heartbeatTimeout = parseDuration(
|
|
value,
|
|
heartbeatTimeout
|
|
);
|
|
if ( timeout !== 0 ) {
|
|
clearTimeout( timeout );
|
|
timeout = setTimeout( function () {
|
|
onTimeout();
|
|
}, heartbeatTimeout );
|
|
}
|
|
}
|
|
}
|
|
if ( state === FIELD_START ) {
|
|
if ( dataBuffer !== '' ) {
|
|
lastEventId = lastEventIdBuffer;
|
|
if ( eventTypeBuffer === '' ) {
|
|
eventTypeBuffer = 'message';
|
|
}
|
|
var event = new MessageEvent(
|
|
eventTypeBuffer,
|
|
{
|
|
data: dataBuffer.slice( 1 ),
|
|
lastEventId: lastEventIdBuffer,
|
|
}
|
|
);
|
|
es.dispatchEvent( event );
|
|
if ( eventTypeBuffer === 'message' ) {
|
|
fire( es, es.onmessage, event );
|
|
}
|
|
if ( currentState === CLOSED ) {
|
|
return;
|
|
}
|
|
}
|
|
dataBuffer = '';
|
|
eventTypeBuffer = '';
|
|
}
|
|
state =
|
|
c === '\r'.charCodeAt( 0 )
|
|
? AFTER_CR
|
|
: FIELD_START;
|
|
} else {
|
|
if ( state === FIELD_START ) {
|
|
fieldStart = position;
|
|
state = FIELD;
|
|
}
|
|
if ( state === FIELD ) {
|
|
if ( c === ':'.charCodeAt( 0 ) ) {
|
|
valueStart = position + 1;
|
|
state = VALUE_START;
|
|
}
|
|
} else if ( state === VALUE_START ) {
|
|
state = VALUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var onFinish = function () {
|
|
if ( currentState === OPEN || currentState === CONNECTING ) {
|
|
currentState = WAITING;
|
|
if ( timeout !== 0 ) {
|
|
clearTimeout( timeout );
|
|
timeout = 0;
|
|
}
|
|
timeout = setTimeout( function () {
|
|
onTimeout();
|
|
}, retry );
|
|
retry = clampDuration(
|
|
Math.min( initialRetry * 16, retry * 2 )
|
|
);
|
|
|
|
es.readyState = CONNECTING;
|
|
var event = new Event( 'error' );
|
|
es.dispatchEvent( event );
|
|
fire( es, es.onerror, event );
|
|
}
|
|
};
|
|
|
|
var close = function () {
|
|
currentState = CLOSED;
|
|
transport.cancel();
|
|
if ( timeout !== 0 ) {
|
|
clearTimeout( timeout );
|
|
timeout = 0;
|
|
}
|
|
es.readyState = CLOSED;
|
|
};
|
|
|
|
var onTimeout = function () {
|
|
timeout = 0;
|
|
|
|
if ( currentState !== WAITING ) {
|
|
if ( ! wasActivity ) {
|
|
throwError(
|
|
new Error(
|
|
'No activity within ' +
|
|
heartbeatTimeout +
|
|
' milliseconds. Reconnecting.'
|
|
)
|
|
);
|
|
transport.cancel();
|
|
} else {
|
|
wasActivity = false;
|
|
timeout = setTimeout( function () {
|
|
onTimeout();
|
|
}, heartbeatTimeout );
|
|
}
|
|
return;
|
|
}
|
|
|
|
wasActivity = false;
|
|
timeout = setTimeout( function () {
|
|
onTimeout();
|
|
}, heartbeatTimeout );
|
|
|
|
currentState = CONNECTING;
|
|
dataBuffer = '';
|
|
eventTypeBuffer = '';
|
|
lastEventIdBuffer = lastEventId;
|
|
textBuffer = '';
|
|
fieldStart = 0;
|
|
valueStart = 0;
|
|
state = FIELD_START;
|
|
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=428916
|
|
// Request header field Last-Event-ID is not allowed by Access-Control-Allow-Headers.
|
|
var requestURL = url;
|
|
if (
|
|
url.slice( 0, 5 ) !== 'data:' &&
|
|
url.slice( 0, 5 ) !== 'blob:'
|
|
) {
|
|
requestURL =
|
|
url +
|
|
( url.indexOf( '?', 0 ) === -1 ? '?' : '&' ) +
|
|
'lastEventId=' +
|
|
encodeURIComponent( lastEventId );
|
|
}
|
|
var requestHeaders = {};
|
|
requestHeaders[ 'Accept' ] = 'text/event-stream';
|
|
if ( headers != undefined ) {
|
|
for ( var name in headers ) {
|
|
if (
|
|
Object.prototype.hasOwnProperty.call( headers, name )
|
|
) {
|
|
requestHeaders[ name ] = headers[ name ];
|
|
}
|
|
}
|
|
}
|
|
try {
|
|
transport.open(
|
|
onStart,
|
|
onProgress,
|
|
onFinish,
|
|
requestURL,
|
|
withCredentials,
|
|
requestHeaders
|
|
);
|
|
} catch ( error ) {
|
|
close();
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
es.url = url;
|
|
es.readyState = CONNECTING;
|
|
es.withCredentials = withCredentials;
|
|
es._close = close;
|
|
|
|
onTimeout();
|
|
}
|
|
|
|
EventSourcePolyfill.prototype = Object.create( EventTarget.prototype );
|
|
EventSourcePolyfill.prototype.CONNECTING = CONNECTING;
|
|
EventSourcePolyfill.prototype.OPEN = OPEN;
|
|
EventSourcePolyfill.prototype.CLOSED = CLOSED;
|
|
EventSourcePolyfill.prototype.close = function () {
|
|
this._close();
|
|
};
|
|
|
|
EventSourcePolyfill.CONNECTING = CONNECTING;
|
|
EventSourcePolyfill.OPEN = OPEN;
|
|
EventSourcePolyfill.CLOSED = CLOSED;
|
|
EventSourcePolyfill.prototype.withCredentials = undefined;
|
|
|
|
global.EventSourcePolyfill = EventSourcePolyfill;
|
|
global.NativeEventSource = NativeEventSource;
|
|
|
|
if (
|
|
XMLHttpRequest != undefined &&
|
|
( NativeEventSource == undefined ||
|
|
! ( 'withCredentials' in NativeEventSource.prototype ) )
|
|
) {
|
|
// Why replace a native EventSource ?
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=444328
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=831392
|
|
// https://code.google.com/p/chromium/issues/detail?id=260144
|
|
// https://code.google.com/p/chromium/issues/detail?id=225654
|
|
// ...
|
|
global.EventSource = EventSourcePolyfill;
|
|
}
|
|
} )( typeof window !== 'undefined' ? window : this );
|