creator 上使用 ts 的 pomelo 客户端插件

pomelo 是一个使用简单的 js 游戏框架, 具体架构这里不再赘述.
由于 js 语言过于宽泛, 经常会出现命名等手误, 导致很尴尬的事情, 最近研究了下 ts, 发现是个不错的解决方案. pomelo 框架使用 ts 也毫无压力, 但这不是重点, 感兴趣的朋友可以一起聊聊!

这里我要说的一个客户端框架 是指 我这次研究 ts 语言时整理出来的, 可直接在 creator 内作为 node_modules 引入

例如:
npm install pomelo-creator --save

新建ts脚本内:
import { pomelo } from “pomelo-creator”;

如果之前用过 pomelo 的 cocos2dx 或者 creator 的客户端代码的同学可能会发现有一定的差异
1: 接口全部使用 async 函数
例如: request 请求, 可以直接 await request, 返回值 就是服务器的返回数据! 如果报错了 可以 catch 或者 捕获 reject

2: 断线重连概念的重构
这里把 登录鉴权和连接鉴权的概念分离, 比如 web 服务中, login 是指通过账号密码认证, 认证通过后服务器会写入 session 内, 下次用户 web 请求直接使用 cookie 内的 sessionid 就能获得到对应的账号信息, 前者是 login 登录鉴权, 后者是连接鉴权. 这里这么做其实是为了解决更复杂的断线重连. 特别是 pomelo 长连接 断线重连后 其实客户端根本不需要再次走一遍login 的鉴权行为的.

最后:
热乎的代码,有兴趣可一起讨论,学习!
github: https://github.com/DMedivh/pomelo-creator-ts

有点意思啊 老哥,pomelo 客户端插件 具体是怎么个 说法呢

就是一个带有 pomelo 协议解析的客户端代码库

pinus了解一下~

恩 pomelo 的 fork 分支! 一群有情怀的人, 值得支持! 不过我现在用原来的 pomelo 也挺好! 想怎么改怎么改还是比较爽的!
例如 原生的 pomelo handler 文件可以这么写

import {NEXTWORK_CODE} from "../../../../utils/constants";
import {SESSION} from "../../../schemas/session";
import {promisify} from "util";
import {Application} from "../../../../utils/pomelo";

/// 这是路由函数中的 中间路由名称 比如 connector.session.connect 中的 session 
export const name: string = 'session';

/**
 * 恢复 session 的合法数据
 *
 * @param msg
 * @param session
 * @param next
 */
export async function connect(msg: any, session: any, next: Function) {
    if (!!session.uid) {
        return next(null, {code: NEXTWORK_CODE.OK});
    }

    let sinfo = await SESSION.get(msg.passport);
    if (!sinfo || sinfo.appid !== msg.appid || sinfo.device !== msg.device || sinfo.version !== msg.version) {
        //return next(null, { code: NEXTWORK_CODE.EXPIRED });
        sinfo = {uid: '10001'};
    }
    session.bind(sinfo.uid);
    for (let i in sinfo) {
        session.set(i, sinfo[i]);
    }
    await promisify(session.pushAll.bind(session))();
    const app: Application = require('pomelo').app;
    if (sinfo.ingame) {
        await promisify(app.rpc.game.session.reconnect)(sinfo.ingame, {});
    }
    await promisify(app.rpc.player.session.reconnect)(session, {
        frontendId: session.frontendId,
        id: session.id,
        uid: session.uid
    });

    next();
}

mark