UNPKG

zero-remote

Version:

常连接网络

230 lines (229 loc) 7.34 kB
"use strict"; 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;