uno-ws-client
Version:
websocket客户端
175 lines (151 loc) • 4.72 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import { Ws } from './websocket';
import { merge, isNil, omitBy } from 'lodash-es';
var defaultParser = function defaultParser(data) {
return data;
};
var defaultOptions = {
extraWs: {}
};
var defEventList = {};
export var SDKBase = /*#__PURE__*/function () {
function SDKBase(options) {
this.eventList = defEventList;
this.listenedEvents = {};
this.checkSdk = true;
this.options = void 0;
this.wsClient = void 0;
this.options = _extends({}, defaultOptions, options);
this.options.checkSdk && (this.checkSdk = this.options.checkSdk);
this.init();
}
/**
* 有效的message转化为事件
* @param eventName 事件/sdk名称
* @param callback 回调函数,如果校验通过返回通信数据,校验不通过返回错误信息
*/
var _proto = SDKBase.prototype;
_proto.listener = function listener(eventName, callback) {
if (Object.keys(this.eventList).indexOf(eventName) > -1) {
var parser = this.eventList[eventName];
if (this.listenedEvents[eventName]) {
window.removeEventListener(eventName, this.listenedEvents[eventName]);
}
this.listenedEvents[eventName] = function (e) {
var obj = parser(e.detail);
if (obj.error) {
callback && callback(false, obj.data, obj.error);
} else {
callback && callback(true, obj.data);
}
};
window.addEventListener(eventName, this.listenedEvents[eventName]);
}
}
/**
* 注册自定义事件(备注:目前可以替换初始事件的parser)
* @param eventName 事件名称
* @param parser 数据处理方法
*/
;
_proto.registerEvent = function registerEvent(eventName, parser) {
this.eventList[eventName] = parser || defaultParser;
}
/**
* 发送消息
* @param event
* @param data
*/
;
_proto.send = function send(_ref) {
var _this$wsClient;
var event = _ref.event,
data = _ref.data,
entity = _ref.entity,
sdk = _ref.sdk;
(_this$wsClient = this.wsClient) === null || _this$wsClient === void 0 ? void 0 : _this$wsClient.send(_extends({}, this.options.customData ? this.options.customData : {}, {
type: event,
// 兼容原高速数据结构字段,后面看是否可以删除,
entity: entity,
event: event
}, sdk ? {
sdk: sdk
} : {}, this.options.source ? {
source: this.options.source
} : {}, this.options.target ? {
target: this.options.target
} : {}, this.options.roomExclude ? {
roomExclude: this.options.roomExclude
} : {}, {
data: omitBy(data, isNil)
}));
}
/**
* 更新配置后重新初始化
* @param opts 配置
*/
;
_proto.updateOptRetry = function updateOptRetry(opts) {
this.options = merge(this.options, opts);
this.init();
}
/**
* sdk检查过滤
*/
;
_proto.sdkParser = function sdkParser(msg) {
return new CustomEvent(msg.event, {
detail: {
error: false,
data: msg.data
}
});
}
/**
* 销毁
*/
;
_proto.destroy = function destroy() {
var _this$wsClient2;
(_this$wsClient2 = this.wsClient) === null || _this$wsClient2 === void 0 ? void 0 : _this$wsClient2.destroy();
this.wsClient = undefined;
for (var _key in this.listenedEvents) {
if (Object.prototype.hasOwnProperty.call(this.listenedEvents, _key)) {
window.removeEventListener(_key, this.listenedEvents[_key]);
}
}
this.listenedEvents = {};
this.eventList = defEventList;
};
_proto.init = function init() {
var _this = this;
if (this.wsClient) {
this.destroy();
}
if (this.options.service && this.options.registerData.group) {
this.wsClient = new Ws(this.options.service, _extends({
registerData: {
source: this.options.source,
target: this.options.target,
roomExclude: this.options.roomExclude,
data: this.options.registerData,
event: 'register'
},
callback: function callback(msg) {
if (msg.event && msg.data) {
var newEvent = _this.sdkParser(msg);
window.dispatchEvent(newEvent);
} // TODO 这块逻辑先不需要,还没想清楚
// if (data.action) {
// const actionEventName = `${eventName}.${data.action}`;
// const actionEvent = new CustomEvent(actionEventName, {
// detail: omit(verifiedData, ['action']),
// });
// window.dispatchEvent(actionEvent);
// }
}
}, this.options.extraWs));
}
};
return SDKBase;
}();