signalr-no-jquery
Version:
Javascript SignalR client without jQuery dependency
134 lines (115 loc) • 3.58 kB
JavaScript
;
const jQueryDeferred = require('jquery-deferred');
const jQueryParam = require('jquery-param');
const qs = data => {
let results = [];
for (const name in data)
results.push(`${name}=${encodeURIComponent(data[name])}`);
return results.join('&');
};
const jqueryFunction = function(subject) {
let events = subject.events || {};
if (subject && subject === subject.window)
return {
0: subject,
load: (handler) => subject.addEventListener('load', handler, false),
bind: (event, handler) => subject.addEventListener(event, handler, false),
unbind: (event, handler) => subject.removeEventListener(event, handler, false)
};
return {
0: subject,
unbind(event, handler) {
let handlers = events[event] || [];
if (handler) {
let idx = handlers.indexOf(handler);
if (idx !== -1) handlers.splice(idx, 1);
} else handlers = [];
events[event] = handlers;
subject.events = events;
},
bind(event, handler) {
let current = events[event] || [];
events[event] = current.concat(handler);
subject.events = events;
},
triggerHandler(event, args) {
let handlers = events[event] || [];
handlers.forEach(fn => {
if (args && args[0] && args[0].type === undefined) {
args = [{
type: event
}].concat(args || []);
} else {
args = args || [];
}
fn.apply(this, args);
});
}
};
};
const xhr = function() {
try {
return new window.XMLHttpRequest();
} catch (e) {}
};
const ajax = function(options) {
const request = xhr();
if (options.xhrFields && options.xhrFields.withCredentials) {
request.withCredentials = true;
}
request.onreadystatechange = () => {
if (request.readyState !== 4) {
return;
}
if (request.status === 200 && !request._hasError) {
try {
options.success && options.success(JSON.parse(request.responseText));
} catch (e) {
options.error && options.error(request);
}
} else {
options.error && options.error(request);
}
};
request.withCredentials = options.xhrFields.withCredentials;
var cacheBuster = "_=" + new Date().getTime();
if (options.url.indexOf("?") === -1) {
options.url += "?" + cacheBuster;
} else if (options.url.indexOf("_=") === -1) {
options.url += "&" + cacheBuster;
} else {
options.url = options.url.replace(/_=\d+/, cacheBuster);
}
request.open(options.type, options.url);
request.setRequestHeader('content-type', options.contentType);
if (options.headers) {
Object.keys(options.headers).forEach(key => {
const value = options.headers[key];
request.setRequestHeader(key, value);
});
}
request.send(options.data && qs(options.data));
return {
abort: function(reason) {
return request.abort(reason);
}
};
};
module.exports = jQueryDeferred.extend(
jqueryFunction,
jQueryDeferred,
{
defaultAjaxHeaders: null,
ajax: ajax,
inArray: (arr,item) => arr.indexOf(item) !== -1,
trim: str => str && str.trim(),
isEmptyObject: obj => !obj || Object.keys(obj).length === 0,
makeArray: arr => [].slice.call(arr,0),
param: obj => jQueryParam(obj),
support: {
cors: (function() {
const xhrObj = xhr();
return !!xhrObj && ("withCredentials" in xhrObj);
})()
}
});