mudb
Version:
Real-time database for multiplayer games
58 lines • 2.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const protocol_1 = require("./protocol");
class MuRPCServer {
constructor(spec) {
const logger = spec.logger;
const schemas = this.schemas = new protocol_1.MuRPCSchemas(spec.protocol);
this.transport = spec.transport;
this.transport.listen(schemas, spec.authorize, async (conn, arg, response) => {
try {
const method = arg.type;
const handler = spec.handlers[method];
if (!handler) {
logger && logger.error(`invalid rpc method: ${method}`);
response.type = 'error';
response.data = `invalid rpc method: ${method}`;
}
else {
const retSchema = schemas.protocol.api[method].ret;
if (handler.length === 3) {
const ret = retSchema.alloc();
const actualRet = await handler(conn, arg.data, ret);
response.type = 'success';
const retInfo = response.data = schemas.retSchema.alloc();
retInfo.type = method;
if (ret === actualRet) {
retInfo.data = ret;
}
else {
logger && logger.log(`warning, handler for ${method} did not use storage for return type`);
retSchema.free(ret);
retInfo.data = actualRet;
}
}
else {
const ret = await handler(conn, arg.data, undefined);
response.type = 'success';
const retInfo = response.data = schemas.retSchema.alloc();
retInfo.type = method;
retInfo.data = retSchema.clone(ret);
}
}
}
catch (e) {
logger && logger.error(e);
response.type = 'error';
if (e instanceof Error && e.message) {
response.data = e.message;
}
else {
response.data = e;
}
}
});
}
}
exports.MuRPCServer = MuRPCServer;
//# sourceMappingURL=server.js.map