frc-ui
Version:
React Web UI
124 lines (123 loc) • 4.19 kB
JavaScript
const __socket = (function instanceInit() {
let instance;
return (newInstance) => {
if (newInstance)
instance = newInstance;
Object.seal(instance);
return instance;
};
})();
class Socket {
constructor() {
this.worker = null;
this._callbacks = {};
this.leave = () => {
if (this.worker) {
this.worker.close();
}
};
this.start = (opt) => {
const { userId, token, host, path } = opt;
if (!userId || !token || !Object.prototype.hasOwnProperty.call(window, 'SharedWork')) {
return;
}
if (this.worker) {
return;
}
const option = {
token: JSON.stringify({ token }),
query(data) {
try {
return JSON.parse(data);
}
catch (e) {
console.error(e);
return null;
}
}
};
// @ts-ignore
this.worker = new window.SharedWork(`${host || ''}${path || ''}`, option);
this.worker.on('login', (event) => {
const { code } = event;
if (code === 0) {
console.log('Socket Login: ', event);
this.emit('login', event);
}
else {
console.log('Socket Login Fail: ', event);
this.emit('login-fail', event);
}
});
this.worker.on('connect', (event) => {
console.log('Socket Connect : ', event);
this.emit('connect', event);
});
this.worker.on('reconnect', (event) => {
console.log('Socket Reconnect : ', event);
this.emit('reconnect', event);
});
this.worker.on('close', (event) => {
console.log('Socket Close : ', event);
this.emit('close', event);
});
this.worker.on('error', (event) => {
console.log('Socket Error : ', event);
this.emit('error', event);
});
this.worker.on('message', (event) => {
console.log('Socket Message : ', event);
this.emit('message', event);
});
};
this.on = (event, fn) => {
this._callbacks = this._callbacks || {};
(this._callbacks['$' + event] = this._callbacks['$' + event] || []).push(fn);
return this;
};
this.off = (event, fn) => {
this._callbacks = this._callbacks || {};
if (!event && !fn) {
this._callbacks = {};
return this;
}
let callbacks = this._callbacks['$' + event];
if (!callbacks)
return this;
if (!!event && !fn) {
delete this._callbacks['$' + event];
return this;
}
let cb;
for (var i = 0; i < callbacks.length; i++) {
cb = callbacks[i];
if (cb === fn || cb.fn === fn) {
callbacks.splice(i, 1);
break;
}
}
return this;
};
this.emit = (event, arg) => {
this._callbacks = this._callbacks || {};
// @ts-ignore
let callbacks = this._callbacks['$' + event];
if (callbacks) {
callbacks = callbacks.slice(0);
for (let i = 0, len = callbacks.length; i < len; ++i) {
if (typeof callbacks[i] === 'function')
callbacks[i](arg);
}
}
return this;
};
const instance = __socket();
if (instance) {
return instance;
}
this.off.bind(this);
window.addEventListener('beforeunload', this.leave);
__socket(this);
}
}
export default new Socket();