occaecatidicta
Version:
56 lines (42 loc) • 1.61 kB
text/typescript
import { Application, ServerInfo, FrontendSession } from 'omelox';
import { createHash } from 'crypto';
import { Code, ConnectorHost, common } from '../common';
// 网关处理
export class GateHandler {
constructor(private app: Application) {
}
hashDispatch(id: string, servers: ServerInfo[]) {
if (servers.length === 0) {
return;
}
if (id === null || id === undefined) {
return servers[0];
}
if (typeof (id) !== 'string') {
id = String(id);
}
let md5 = createHash('md5').update(id).digest('hex');
let hash = parseInt(md5.substr(0, 8), 16);
return servers[hash % servers.length];
}
// 查询该用哪个connector
public async queryEntry(msg: { openid: string }, session: FrontendSession): Promise<ConnectorHost> {
// console.log("queryEntry" + msg.openid);
let openid = msg.openid;
if (!openid) {
return {code: Code.FAIL};
}
let connectors = this.app.getServersByType('connector');
if (!connectors || connectors.length === 0) {
return {code: Code.FA_NO_SERVER_AVAILABLE};
}
let res = this.hashDispatch(openid, connectors);
let connectorHost = {code: Code.OK, host: res.clientHost, port: res.clientPort, openid: openid, hash: '' };
// 计算出hash给connector验证
connectorHost.hash = common.calcConnectorHostHash(connectorHost);
return connectorHost;
}
}
export default function(app: Application) {
return new GateHandler(app);
}