zero-remote
Version:
常连接网络
230 lines (229 loc) • 7.34 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.GameVisitor = exports.Visitor = void 0;
const zero_dispatcher_1 = __importDefault(require("zero-dispatcher"));
const IZeroRomeote_1 = require("./IZeroRomeote");
/**
* Ginger用户基础
* 访客
* 一个来访产出一个实例
* CSV: Client, Server, Value 客户端访问服务端的消息
* SCV: Client, Server, Value 服务端推送客户端的消息
*/
class Visitor {
constructor(channel, server) {
this.channel = channel;
this.server = server;
this.isClear = false;
}
clear() {
this.isClear = true;
}
start() {
}
kick() {
this.clear();
this.channel.close();
}
close() {
this.channel.close();
}
}
exports.Visitor = Visitor;
/**
* 通信基础
*/
class ZeroRemote extends zero_dispatcher_1.default {
constructor(ws, callback, pack = IZeroRomeote_1.jsonPack) {
super();
this.ws = ws;
this.pack = pack;
ws.on("connection", (socket, request) => {
let user = callback({
close: () => {
socket.close();
},
send: (body) => {
if (socket.readyState < 2) {
let value = pack.stringify(body);
if (value != null) {
socket.send(value, (err) => {
if (err) {
// console.warn(err)
// console.log(value)
}
});
}
else {
console.warn("ZeroServer: can't stringify for Json");
}
}
else {
console.log("ZeroServer: socket close");
}
}
}, this);
socket.on("message", (data) => {
let body = this.pack.parse(data);
if (body) {
user.receive(body);
}
else {
console.warn("ZeroServer: can't parse for data");
console.warn("可能出现 粘包拆包");
}
});
socket.on("close", (code, reason) => {
user.clear();
});
user.start();
});
}
}
exports.default = ZeroRemote;
/**
* 添加 ping
* 添加 callback
* 添加 kick
* 添加 router
*/
class GameVisitor extends Visitor {
constructor() {
super(...arguments);
// protected routerPool: { [key: string]: ZeroDispatcher } = {}
this.routerPool = {};
this.pingTime = 0;
}
receive(body) {
if (body.route == null) {
if (body.data) {
this.pingTime = body.data;
}
this.channel.send({}); //空对象当ping
}
else {
if (body.cbs) {
for (const key in body.cbs) {
if (body.cbs.hasOwnProperty(key)) {
const element = body.cbs[key];
body.data[key] = (...cbArgs) => {
if (!this.isClear) {
this.channel.send({
code: IZeroRomeote_1.ReportCode.CALLBACK,
ci: element,
args: cbArgs
});
}
};
}
}
}
let back = undefined;
if (body.index != null) {
back = (isError, data) => {
if (!this.isClear) {
this.channel.send({
code: IZeroRomeote_1.ReportCode.CALLBACK,
ci: body.index,
args: [isError, data]
});
}
};
}
this.handle(body.route, body.key, body.data, back);
}
}
handle(route, key, data, back) {
let router = this.routerPool[route];
if (router != null) {
let callback = router[key];
if (callback != null) {
let value;
try {
value = callback(data);
if (back != null) {
if (value instanceof Promise) {
value.then((valueThen) => {
back(true, valueThen);
}).catch((error) => {
if (error instanceof Error) {
back(false, error.message);
}
else {
back(false, error);
}
});
}
else {
back(true, value);
}
}
}
catch (error) {
if (back != null) {
back(false, error);
}
}
}
else {
if (back != null) {
back(false, route + " " + key + "这个接口没有实现");
}
}
}
else {
if (back != null) {
back(false, route + " 这个路由没有实现");
}
}
}
getReceiver(route) {
return new Proxy({}, {
get: (target, p, receiver) => {
return (callback) => {
let router = this.routerPool[route];
if (router == null) {
router = {};
this.routerPool[route] = router;
}
router[p] = (data) => {
if (Array.isArray(data)) {
return callback(...data);
}
else {
return callback(data);
}
};
};
}
});
}
getSender(route) {
return new Proxy({}, {
get: (target, p, receiver) => {
return (data) => {
let sendInfo = {
route: route,
key: p,
data: data
};
this.channel.send(sendInfo);
};
}
});
}
/**
* @param data
*/
kick(data = 0) {
this.channel.send({ code: IZeroRomeote_1.ReportCode.KICK, data: data });
super.kick();
}
error(message) {
this.channel.send({ code: IZeroRomeote_1.ReportCode.ERROR, error: message });
}
}
exports.GameVisitor = GameVisitor;
;