genPomeloProtoNew.js 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284
  1. ///**
  2. // * Created by lusongjie on 2015/4/17.
  3. // */
  4. //处理参数
  5. function processArgv() {
  6. var ret = {};
  7. var args = process.argv.slice(2);
  8. for (var i in args) {
  9. var list = args[i].split('=');
  10. ret[list[0]] = list[1];
  11. }
  12. return ret;
  13. }
  14. var argv = processArgv();
  15. /*-----------------------------------------------编译proto文件--------------------------------------------------*/
  16. var fs = require('fs');
  17. var ProtoBuf = require("protobufjs");
  18. var util = require("util");
  19. var buildProto = function (argv) {
  20. var builder = ProtoBuf.newBuilder();
  21. var protoDir = argv.input;
  22. fs.readdirSync(protoDir).forEach(function (filename) {
  23. if (!/\.proto$/.test(filename)) {
  24. return;
  25. }
  26. ProtoBuf.loadProtoFile(protoDir + '\\' + filename, builder);
  27. });
  28. builder.build();
  29. return builder;
  30. }
  31. var builder = buildProto(argv);
  32. //console.log(util.inspect(builder,{depth:5}));
  33. /*-----------------------------------------------通用函数--------------------------------------------------*/
  34. //首字母大写
  35. function firstUpperCase(str) {
  36. return str.replace(/\b\w/g, function (m) {
  37. return m.toUpperCase();
  38. });
  39. }
  40. function firstLowerCase(str) {
  41. return str.replace(/\b\w/g, function (m) {
  42. return m.toLowerCase();
  43. });
  44. }
  45. //生成空行
  46. function genSpaceLine() {
  47. return '\n';
  48. }
  49. //生成缩进
  50. function genIndent(nest) {
  51. var str = '';
  52. for (var i = 0; i < nest; ++i) {
  53. str += '\t'
  54. }
  55. return str;
  56. }
  57. //写入文件
  58. function writeFile(output, fileName, code) {
  59. fs.writeFileSync(output + '/' + fileName, code);
  60. }
  61. /*-----------------------------------------------结构解析--------------------------------------------------*/
  62. var handlers = {};
  63. var sockets = {};
  64. function push2handler(str) {
  65. return str.replace(/Push/g, function (m) {
  66. return 'Handler';
  67. });
  68. }
  69. function isPush(name) {
  70. var ret = name.match(/Push$/g);
  71. return ret !== null;
  72. }
  73. function isNotify(name) {
  74. var ret = name.match(/Notify$/g);
  75. return ret !== null;
  76. }
  77. function isRequest(name) {
  78. var ret = name.match(/Request$/g);
  79. return ret !== null;
  80. }
  81. function isHandler(name) {
  82. var ret = name.match(/Handler/g);
  83. return ret !== null;
  84. }
  85. //handler成员变量名
  86. function handlerFieldName(name) {
  87. return name.replace(/\b\w/g, function (m) {
  88. return m.toLowerCase();
  89. });
  90. }
  91. //request函数参数列表
  92. function requestParams(reflectT) {
  93. var array = [];
  94. for (var key in reflectT.children) {
  95. var field = reflectT.children[key];
  96. var type = field.type.name;
  97. if (field.resolvedType != null) {
  98. type = field.resolvedType.name;
  99. }
  100. var params = {
  101. type: type,
  102. name: field.name,
  103. repeated: field.repeated,
  104. required: field.required
  105. };
  106. array.push(params);
  107. }
  108. return array;
  109. }
  110. var socketMap = {
  111. gateHandler: 'GateSocket',
  112. loginHandler: 'GateSocket'
  113. }
  114. var getSocketName = function (name) {
  115. var socket = socketMap[name];
  116. if (socket) {
  117. return socket;
  118. }
  119. return 'GameSocket';
  120. }
  121. /**
  122. * 添加socket
  123. * @param socketName
  124. */
  125. var addSocket = function (socketName) {
  126. if (sockets[socketName] === undefined) {
  127. sockets[socketName] = {
  128. name: socketName,
  129. base: 'PomeloClient',
  130. type: 'socket',
  131. fields: [/*{
  132. type: 'ProtobufSerializer',
  133. name: 'serializer',
  134. notUppder: true
  135. }*/],
  136. events: [],
  137. usings: {},
  138. socket: socketName
  139. };
  140. }
  141. }
  142. /***
  143. * 添加handler
  144. * @param reflectT
  145. */
  146. var addHandler = function (reflectT) {
  147. var fullHandlerName = reflectT.parent.name + '.' + reflectT.name;
  148. var handlerName = reflectT.name;
  149. var socketName = getSocketName(handlerName);
  150. if (handlers[fullHandlerName] === undefined) {
  151. handlers[fullHandlerName] = {
  152. name: firstUpperCase(handlerName),
  153. type: 'handler',
  154. fields: [{ type: 'PomeloClient', name: 'socket', skipProp: true },
  155. /*{ type: 'ProtobufSerializer', name: 'serializer', skipProp: true }*/],
  156. requests: [],
  157. notifies: [],
  158. events: [],
  159. responses: [],
  160. socket: socketName,
  161. ns: reflectT.parent.name
  162. }
  163. if (isHandler(handlerName)) {
  164. //socket的handler数组
  165. sockets[socketName].fields.push({
  166. type: firstUpperCase(handlerName),
  167. name: handlerFieldName(handlerName),
  168. notUppder: true
  169. });
  170. sockets[socketName].usings[reflectT.parent.name] = true;
  171. }
  172. for (var keyRpc in reflectT.children) {
  173. var rpc = reflectT.children[keyRpc];
  174. var rpcName = rpc.name;
  175. var route = fullHandlerName + '.' + rpcName;
  176. //创建request response
  177. if (isRequest(rpcName)) {
  178. handlers[fullHandlerName].requests.push({
  179. route: route,
  180. type: rpcName,
  181. requestType: rpc.resolvedRequestType.name,
  182. responseType: rpc.resolvedResponseType.name,
  183. params: requestParams(rpc.resolvedRequestType)
  184. });
  185. }
  186. //创建notify
  187. else if (isNotify(rpcName)) {
  188. handlers[fullHandlerName].notifies.push({
  189. route: route,
  190. type: rpcName,
  191. requestType: rpc.resolvedRequestType.name,
  192. responseType: rpc.resolvedResponseType.name,
  193. params: requestParams(rpc.resolvedRequestType)
  194. });
  195. }
  196. //创建event
  197. else if (isPush(rpcName)) {
  198. var pushHandler = push2handler(handlerName);
  199. var event = {
  200. route: route,
  201. type: rpcName,
  202. requestType: rpc.resolvedRequestType.name,
  203. responseType: rpc.resolvedResponseType.name,
  204. params: requestParams(rpc.resolvedRequestType),
  205. handler: pushHandler
  206. };
  207. try {
  208. var fullPushHandler = reflectT.parent.name + '.' + pushHandler;
  209. handlers[fullPushHandler].events.push(event);
  210. sockets[socketName].events.push(event);
  211. }
  212. catch (e) {
  213. console.log("generate error: handler name must br same as filename!!!!!: " + fullPushHandler + "\n" + e);
  214. throw e;
  215. }
  216. }
  217. else {
  218. throw new Error("api must postfix with Push or Request or Notify: " + fullHandlerName + " " + rpcName);
  219. }
  220. // handlers[service.name].responses.push({name: rpc.response, fields: responseParams(key)});
  221. if (rpc.responseName !== 'Void') {
  222. handlers[fullHandlerName].fields.push({ type: rpc.responseName, name: 'last' + rpc.responseName });
  223. }
  224. }
  225. }
  226. }
  227. /**
  228. * 添加节点
  229. * @param reflectT
  230. */
  231. var addNode = function (reflectT) {
  232. //service对应handler
  233. if (reflectT.className === 'Service') {
  234. addHandler(reflectT);
  235. return;
  236. }
  237. //message对应message
  238. else if (reflectT.className === 'Message') {
  239. // addMessage(reflectT);
  240. }
  241. //遍历子节点
  242. for (var key in reflectT.children) {
  243. addNode(reflectT.children[key]);
  244. }
  245. }
  246. //创建所有的对象
  247. var createAll = function () {
  248. addSocket('GateSocket');
  249. addSocket('GameSocket');
  250. addNode(builder.ns);
  251. }
  252. createAll();
  253. //console.log(util.inspect(handlers, false, null, true));
  254. ///*--------------------------------------------C#代码生成--------------------------------------------------------*/
  255. //成员变量类型名字
  256. function fieldTypeName(field) {
  257. if (field.repeated == 'repeated') {
  258. return 'List<' + field.type + '>';
  259. }
  260. return field.type;
  261. }
  262. //protobuf 和c#的基本类型映射
  263. var typeMap = {
  264. 'Int32': 'int',
  265. 'int32': 'int',
  266. 'uInt32': 'uint',
  267. 'Int64': 'long',
  268. 'int64': 'long',
  269. 'uInt64': 'ulong',
  270. 'string': 'string',
  271. 'bytes': 'byte[]'
  272. }
  273. //转化为c#的类型
  274. function toCSharpType(type) {
  275. var ret = typeMap[type];
  276. if (ret === undefined) {
  277. ret = type;
  278. }
  279. return ret;
  280. }
  281. //生成文件头注释
  282. function genComment() {
  283. var code = '/*-----------------------------------------------\n';
  284. code += ' *本文件由代码生成器自动生成,\n';
  285. code += ' *千万不要修改本文件的任何代码,\n';
  286. code += ' *修改的的任何代码都会被覆盖掉!\n';
  287. code += ' --------------------------------------------------*/\n';
  288. code += genSpaceLine();
  289. return code;
  290. }
  291. //生成引用
  292. function genUsing(usings) {
  293. var pre = 'using System.IO;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Pomelo.DotNetClient;\n';
  294. if (usings) {
  295. for (var key in usings) {
  296. pre += 'using pomelo.' + key + ';\n';
  297. }
  298. }
  299. return pre;
  300. }
  301. //生成名称空间开头
  302. function genNameSpaceBegin(indent, name) {
  303. return genIndent(indent) + 'namespace ' + name + '\n{';
  304. }
  305. //生成名称空间结尾
  306. function genNameSpaceEnd(indent) {
  307. return genSpaceLine() + genIndent(indent) + '}';
  308. }
  309. //生成类开头
  310. function genClassBegin(indent, name, base) {
  311. var str = genIndent(indent) + 'public class ' + name;
  312. if (base !== undefined) {
  313. str += ' : ' + base;
  314. }
  315. return str + '\n' + genIndent(indent) + '{\n';
  316. }
  317. //生成类结尾
  318. function genClassEnd(indent) {
  319. return genSpaceLine() + genIndent(indent) + '}';
  320. }
  321. //生成成员变量
  322. function genFieldDeclare(indent, field) {
  323. var type = fieldTypeName(field);
  324. if (type == "PomeloClient") {
  325. var code = genIndent(indent) + 'private ' + type + ' _' + field.name;
  326. code += ';\n';
  327. return code;
  328. } else {
  329. return '';
  330. }
  331. }
  332. //生成成员变量属性
  333. function genFieldProperty(indent, field) {
  334. var code = genIndent(indent) + 'public ' + fieldTypeName(field) + ' ' + field.name + ' { get { return _socket.GetLastResponse<' + fieldTypeName(field) + '>(); } }';
  335. return code;
  336. }
  337. function genSocketFieldDeclare(indent, field) {
  338. var type = fieldTypeName(field);
  339. var code = genIndent(indent) + 'private ' + type + ' _' + field.name;
  340. code += ';\n';
  341. return code;
  342. }
  343. function genSocketFieldProperty(indent, field) {
  344. var code = genIndent(indent) + 'public ' + fieldTypeName(field) + ' ' + field.name + '\n';
  345. code += genIndent(indent) + '{\n';
  346. code += genIndent(indent + 1) + 'get { return _' + field.name + ';}\n';
  347. code += genIndent(indent + 1) + 'set { _' + field.name + ' = value; }\n';
  348. code += genIndent(indent) + '}\n';
  349. return code;
  350. }
  351. //生成函数开头
  352. function genMethodBegin(indent, name, params, ret) {
  353. var code = genIndent(indent) + 'public ';
  354. code += ret + ' ';
  355. code += name + '(';
  356. if (params !== undefined) {
  357. for (var i in params) {
  358. var param = params[i];
  359. // code+= fieldTypeName(param)+' '+ param.name;
  360. if (param.repeated) {
  361. code += 'List<' + toCSharpType(param.type) + '> ' + param.name;
  362. }
  363. else {
  364. code += toCSharpType(param.type) + ' ' + param.name;
  365. }
  366. if (param.default != undefined) {
  367. code += ' = ' + param.default;
  368. }
  369. code += ',';
  370. }
  371. if (code[code.length - 1] === ',') {
  372. code = code.substring(0, code.length - 1);
  373. }
  374. }
  375. code += ')\n' + genIndent(indent) + '{\n';
  376. return code;
  377. }
  378. function genConstructorMethodBegin(indent, name, params, base) {
  379. var code = genIndent(indent) + 'public ';
  380. code += name + '(';
  381. if (params !== undefined) {
  382. for (var i in params) {
  383. var param = params[i];
  384. // code+= fieldTypeName(param)+' '+ param.name;
  385. if (param.repeated) {
  386. code += 'List<' + toCSharpType(param.type) + '> ' + param.name;
  387. }
  388. else {
  389. code += toCSharpType(param.type) + ' ' + param.name;
  390. }
  391. if (param.default != undefined) {
  392. code += ' = ' + param.default;
  393. }
  394. code += ',';
  395. }
  396. if (code[code.length - 1] === ',') {
  397. code = code.substring(0, code.length - 1);
  398. }
  399. }
  400. code += ')' + base + '\n' + genIndent(indent) + '{\n';
  401. return code;
  402. }
  403. //生成函数结尾
  404. function genMethodEnd(indent) {
  405. return genSpaceLine() + genIndent(indent) + '}';
  406. }
  407. //生成构造函数
  408. function genConstuctor(indent, classInfo) {
  409. var code = '';
  410. if (classInfo.type === 'socket') {
  411. code += genConstructorMethodBegin(indent, classInfo.name, [{ type: 'ISerializer', name: 'serializer' }], ' : base(serializer)');
  412. for (var i in classInfo.fields) {
  413. var field = classInfo.fields[i];
  414. if (field.type === 'ISerializer') {
  415. // code += genIndent(indent + 1) + '_' + field.name + ' = new ' + field.type + '();\n';
  416. // code += genIndent(indent + 1) + '_' + field.name + ' = base.Serializer;\n';
  417. }
  418. else {
  419. code += genIndent(indent + 1) + '_' + field.name + ' = new ' + field.type + '(this);\n';
  420. }
  421. }
  422. code += genMethodEnd(indent);
  423. }
  424. else if (classInfo.type === 'handler') {
  425. //静态构造
  426. code += genIndent(indent) + "static " + classInfo.name + "()\n";
  427. code += genIndent(indent) + "{\n"
  428. for (var i in classInfo.events) {
  429. var event = classInfo.events[i];
  430. code += genIndent(indent + 1) + "EventTypes.RegistPushType(\"" + event.route + "\", typeof(" + event.requestType + "));\n"
  431. }
  432. for (var i in classInfo.requests) {
  433. var request = classInfo.requests[i];
  434. code += genIndent(indent + 1) + "EventTypes.RegistRequestType(\"" + request.route + "\", typeof(" + request.requestType + "), typeof(" + request.responseType + "));\n"
  435. }
  436. for (var i in classInfo.notifies) {
  437. var notify = classInfo.notifies[i];
  438. code += genIndent(indent + 1) + "EventTypes.RegistNotifyType(\"" + notify.route + "\", typeof(" + notify.requestType + "));\n"
  439. }
  440. code += genIndent(indent) + "}\n";
  441. //构造
  442. code += genConstructorMethodBegin(indent, classInfo.name,
  443. [{ type: 'PomeloClient', name: 'socket' }, ],
  444. '');
  445. code += genIndent(indent + 1) + 'this._socket = socket;\n';
  446. //code += genIndent(indent + 1) + 'this._serializer = serializer;\n';
  447. code += genMethodEnd(indent);
  448. }
  449. return code;
  450. }
  451. //生成request函数
  452. function genRequest(indent, classInfo, request) {
  453. var code = '';
  454. request.params.push({ type: 'Action<PomeloException,' + request.responseType + '>', name: 'cb' });
  455. request.params.push({ type: 'object', name: 'option', default: 'null' });
  456. code += genMethodBegin(indent, request.type, request.params, 'void');
  457. request.params.pop();
  458. request.params.pop();
  459. //code += genIndent(indent + 1) + '_socket.onRequestStart("' + request.route + '", option);\n';
  460. code += genIndent(indent + 1) + 'var request = new ' + request.requestType + '();\n';
  461. for (var i in request.params) {
  462. var param = request.params[i];
  463. if (param.repeated) {
  464. code += genIndent(indent + 1) + 'request.' + param.name + '.AddRange(' + param.name + ');\n';
  465. }
  466. else {
  467. code += genIndent(indent + 1) + 'request.' + param.name + '= ' + param.name + ';\n';
  468. }
  469. }
  470. //code += '\n';
  471. //code += genIndent(indent+1)+'MemoryStream input = new MemoryStream();\n';
  472. //code += genIndent(indent+1)+'_serializer.Serialize(input, request);\n\n';
  473. var respName = request.responseType;
  474. code += genIndent(indent + 1) + '_socket.request<' + respName + '>(request, (object msg, out int s2c_code, out string s2c_msg) => {\n';
  475. code += genIndent(indent + 2) + 'var rsp = msg as ' + respName + ';\n';
  476. code += genIndent(indent + 2) + 's2c_code = rsp.s2c_code;\n';
  477. code += genIndent(indent + 2) + 's2c_msg = rsp.s2c_msg;\n';
  478. code += genIndent(indent + 2) + 'return s2c_code == 200;\n';
  479. code += genIndent(indent + 1) + '}, cb, option);\n';
  480. /**
  481. code += genIndent(indent + 1) + '_socket.request("' + request.route + '", _serializer, request, output => {\n';
  482. code += genIndent(indent + 2) + 'try\n';
  483. code += genIndent(indent + 2) + '{\n';
  484. code += genIndent(indent + 3) + 'var stream = (MemoryStream)output;\n';
  485. code += genIndent(indent + 3) + respName + ' response = _serializer.Deserialize(stream, null, typeof(' + respName + ')) as ' + respName + ';\n';
  486. code += genIndent(indent + 3) + 'last' + respName + ' = response;\n';
  487. code += '\n';
  488. code += genIndent(indent + 3) + 'int code = response.s2c_code;\n';
  489. code += genIndent(indent + 3) + 'if (code == 200)\n';
  490. code += genIndent(indent + 3) + '{\n';
  491. code += genIndent(indent + 4) + '_socket.onRequestEnd("' + request.route + '", null, last' + respName + ', option);\n';
  492. code += genIndent(indent + 4) + 'cb(null, last' + respName + ');\n';
  493. code += genIndent(indent + 3) + '}\n';
  494. code += genIndent(indent + 3) + 'else\n';
  495. code += genIndent(indent + 3) + '{\n';
  496. code += genIndent(indent + 4) + 'string msg = response.s2c_msg;\n';
  497. code += genIndent(indent + 4) + 'PomeloException exp = new PomeloException(code, msg);\n';
  498. code += genIndent(indent + 4) + '_socket.onRequestEnd("' + request.route + '",exp, null, option);\n';
  499. code += genIndent(indent + 4) + ' cb(exp, null);\n';
  500. code += genIndent(indent + 3) + '}\n';
  501. code += genIndent(indent + 2) + '}\n';
  502. code += genIndent(indent + 2) + 'catch (Exception e)\n';
  503. code += genIndent(indent + 2) + '{\n';
  504. code += genIndent(indent + 3) + 'PomeloException exp = new PomeloException(501, e.Message + \"\\n\" + e.StackTrace);\n';
  505. code += genIndent(indent + 3) + '_socket.onRequestEnd("' + request.route + '",exp, null, option);\n';
  506. code += genIndent(indent + 3) + 'cb(exp, null);\n';
  507. code += genIndent(indent + 2) + '}\n';
  508. code += genIndent(indent + 2) + 'cb = null;\n';
  509. code += genIndent(indent + 1) + '});\n';
  510. */
  511. code += genMethodEnd(indent);
  512. return code;
  513. }
  514. //生成notify函数
  515. function genNotify(indent, classInfo, notify) {
  516. var code = '';
  517. code += genMethodBegin(indent, notify.type, notify.params, 'void');
  518. code += genIndent(indent + 1) + 'var notify = new ' + notify.requestType + '();\n';
  519. for (var i in notify.params) {
  520. var param = notify.params[i];
  521. if (param.repeated) {
  522. code += genIndent(indent + 1) + 'notify.' + param.name + '.AddRange(' + param.name + ');\n';
  523. }
  524. else {
  525. code += genIndent(indent + 1) + 'notify.' + param.name + '= ' + param.name + ';\n';
  526. }
  527. }
  528. code += '\n';
  529. //code += genIndent(indent+1)+'MemoryStream input = new MemoryStream();\n';
  530. //code += genIndent(indent+1)+'_serializer.Serialize(input, notify);\n\n';
  531. code += genIndent(indent + 1) + '_socket.notify(notify);\n';
  532. code += genMethodEnd(indent);
  533. return code;
  534. }
  535. var eventOnName = function (name) {
  536. var ret = name.match(/^on/g) != null;
  537. if (ret) {
  538. return name;
  539. }
  540. return 'on' + firstUpperCase(name);
  541. }
  542. //生成事件响应函数
  543. function genEvent(indent, classInfo, event) {
  544. var code = '';
  545. var responseType = event.requestType;
  546. var eventName = event.type;
  547. var params = [{ type: 'Action<' + responseType + '>', name: 'cb' }];
  548. code += genMethodBegin(indent, eventOnName(eventName), params, 'void');
  549. if (classInfo.type == 'socket') {
  550. code += genIndent(indent + 1) + '_' + event.handler + '.' + eventOnName(eventName) + '(cb);\n';
  551. }
  552. else {
  553. //code += genIndent(indent + 1) + '_socket.listen("' + event.route + '", stream => {\n';
  554. if (event.route === 'area.playerPush.battleEventPush') {
  555. //code += genIndent(indent + 2) + 'BattleEventPush push = new BattleEventPush();\n';
  556. //code += genIndent(indent + 2) + 'push.s2c_data = (stream as MemoryStream).ToArray();\n';
  557. }
  558. else {
  559. code += genIndent(indent + 1) + '_socket.listen_once<' + responseType + '>(cb);';
  560. //code += genIndent(indent + 2) + responseType + ' push = _serializer.Deserialize(stream, null, typeof(' + responseType + ')) as ' + event.requestType + ';\n';
  561. //code += genIndent(indent + 2) + responseType + ' push = stream as ' + event.requestType + ';\n';//_serializer.Deserialize(stream, null, typeof(' + responseType + ')) as ' + event.requestType + ';\n';
  562. //code += genIndent(indent + 2) + 'cb(push);\n';
  563. }
  564. //code += genIndent(indent + 1) + '});\n';
  565. }
  566. code += genMethodEnd(indent);
  567. return code;
  568. }
  569. //生成类
  570. function genClass(indent, classInfo) {
  571. var code = '';
  572. code += genClassBegin(indent, classInfo.name, classInfo.base);
  573. if (classInfo.base == "PomeloClient") {
  574. for (var i in classInfo.fields) {
  575. var field = classInfo.fields[i];
  576. code += genSocketFieldDeclare(indent + 1, field);
  577. }
  578. code += genSpaceLine();
  579. //生成属性
  580. for (var i in classInfo.fields) {
  581. var field = classInfo.fields[i];
  582. if (field.skipProp) {
  583. continue;
  584. }
  585. code += genSocketFieldProperty(indent + 1, field);
  586. code += genSpaceLine();
  587. }
  588. } else {
  589. for (var i in classInfo.fields) {
  590. var field = classInfo.fields[i];
  591. code += genFieldDeclare(indent + 1, field);
  592. }
  593. code += genSpaceLine();
  594. //生成属性
  595. for (var i in classInfo.fields) {
  596. var field = classInfo.fields[i];
  597. if (field.skipProp) {
  598. continue;
  599. }
  600. code += genFieldProperty(indent + 1, field);
  601. code += genSpaceLine();
  602. }
  603. }
  604. //生成构造函数
  605. code += genConstuctor(indent + 1, classInfo);
  606. code += genSpaceLine();
  607. //生成request
  608. for (var i in classInfo.requests) {
  609. var request = classInfo.requests[i];
  610. code += genRequest(indent + 1, classInfo, request);
  611. code += genSpaceLine();
  612. }
  613. //生成notify
  614. for (var i in classInfo.notifies) {
  615. var notify = classInfo.notifies[i];
  616. code += genNotify(indent + 1, classInfo, notify);
  617. code += genSpaceLine();
  618. }
  619. //生成event
  620. for (var i in classInfo.events) {
  621. var event = classInfo.events[i];
  622. code += genEvent(indent + 1, classInfo, event);
  623. code += genSpaceLine();
  624. }
  625. code += genClassEnd(indent);
  626. return code;
  627. }
  628. //生成文件开头
  629. function genFileBegin(classInfo) {
  630. var code = '';
  631. code += genComment();
  632. code += genUsing(classInfo.usings);
  633. code += genSpaceLine();
  634. var ns = classInfo.ns;
  635. if (!ns) {
  636. ns = 'Pomelo.DotNetClient';
  637. }
  638. else {
  639. ns = 'pomelo.' + ns;
  640. }
  641. code += genNameSpaceBegin(0, ns);
  642. code += genSpaceLine();
  643. return code;
  644. }
  645. //生成文件结尾
  646. function genFileEnd() {
  647. return genNameSpaceEnd(0);
  648. }
  649. function genFile(classInfos) {
  650. var code = '';
  651. code += genFileBegin(classInfos[0]);
  652. for (var i in classInfos) {
  653. code += genClass(1, classInfos[i]);
  654. code += genSpaceLine();
  655. code += genSpaceLine();
  656. }
  657. code += genFileEnd();
  658. return code;
  659. }
  660. //socket文件
  661. for (var keySocket in sockets) {
  662. writeFile(argv.output, sockets[keySocket].name + '.cs', genFile([sockets[keySocket]]));
  663. process.stdout.write('gen cs : ' + sockets[keySocket].name + '.cs' + '\n');
  664. }
  665. //handler文件
  666. for (var keyHandler in handlers) {
  667. var fileName = handlers[keyHandler].name;
  668. if (isHandler(fileName)) {
  669. writeFile(argv.output, firstUpperCase(fileName) + '.cs', genFile([handlers[keyHandler]]));
  670. process.stdout.write('gen cs : ' + fileName + '\n');
  671. }
  672. }
  673. //
  674. ///*--------------------------------------------Lua代码生成--------------------------------------------------------*/
  675. function genLuaMethodBegin(indent, name, params) {
  676. var code = genIndent(indent) + 'function ';
  677. code += name + '(';
  678. if (params !== undefined) {
  679. for (var i in params) {
  680. var param = params[i];
  681. code += param.name;
  682. code += ',';
  683. }
  684. if (code[code.length - 1] === ',') {
  685. code = code.substring(0, code.length - 1);
  686. }
  687. }
  688. code += ')\n';
  689. return code;
  690. }
  691. function genLuaMethodEnd(indent) {
  692. return genIndent(indent) + 'end\n\n';
  693. }
  694. function fullLuaName(className) {
  695. return 'Pomelo.' + className;
  696. }
  697. function genLuaEncodeMethodBegin(indent, name) {
  698. var code = genIndent(indent) + 'local function ';
  699. code += name + 'Encoder(msg)\n';
  700. return code;
  701. }
  702. function genLuaDecodeMethodBegin(indent, name) {
  703. var code = genIndent(indent) + 'local function ';
  704. code += name + 'Decoder(stream)\n';
  705. return code;
  706. }
  707. function genLuaRequest(indent, classInfo, request) {
  708. var code = '';
  709. code += genLuaEncodeMethodBegin(indent, request.type);
  710. code += genIndent(indent + 1) + 'local input = ' + firstLowerCase(classInfo.name) + '_pb.' + request.requestType + '()\n';
  711. code += genIndent(indent + 1) + 'protobuf.FromMessage(input,msg)\n';
  712. code += genIndent(indent + 1) + "return (input:SerializeToString())\n";
  713. code += genLuaMethodEnd(indent);
  714. code += genLuaDecodeMethodBegin(indent, request.type);
  715. //code += genIndent(indent + 1) + 'stream = ZZBase64.decode(stream)\n';
  716. code += genIndent(indent + 1) + 'local res = ' + firstLowerCase(classInfo.name) + '_pb.' + request.responseType + '()\n';
  717. code += genIndent(indent + 1) + 'res:ParseFromString(stream)\n';
  718. code += genIndent(indent + 1) + "return res\n";
  719. code += genLuaMethodEnd(indent);
  720. request.params.push({ type: 'Action<PomeloException,' + request.responseType + '>', name: 'cb' });
  721. request.params.push({ type: 'object', name: 'option', default: 'null' });
  722. code += genLuaMethodBegin(indent, fullLuaName(classInfo.name) + '.' + request.type, request.params);
  723. request.params.pop();
  724. request.params.pop();
  725. if (request.params.length == 0) {
  726. code += genIndent(indent + 1) + 'local input = nil\n';
  727. }
  728. else {
  729. code += genIndent(indent + 1) + 'local msg = {}\n';
  730. for (var i in request.params) {
  731. var param = request.params[i];
  732. code += genIndent(indent + 1) + 'msg.' + param.name + ' = ' + param.name + '\n';
  733. }
  734. }
  735. code += genIndent(indent + 1) + 'Socket.OnRequestStart("' + request.route + '", option)\n';
  736. if (request.params.length == 0) {
  737. code += genIndent(indent + 1) + 'Socket.Request("' + request.route + '", input, function(res)\n';
  738. }
  739. else {
  740. code += genIndent(indent + 1) + 'Socket.Request("' + request.route + '", msg, function(res)\n';
  741. }
  742. code += genIndent(indent + 2) + 'if(res.s2c_code == 200) then\n';
  743. code += genIndent(indent + 3) + 'Pomelo.' + classInfo.name + '.last' + request.responseType + ' = res\n';
  744. code += genIndent(indent + 3) + 'Socket.OnRequestEnd("' + request.route + '", true)\n';
  745. code += genIndent(indent + 3) + 'cb(nil,res)\n';
  746. code += genIndent(indent + 2) + 'else\n';
  747. code += genIndent(indent + 3) + 'local ex = {}\n';
  748. code += genIndent(indent + 3) + 'if(res.s2c_code) then\n';
  749. code += genIndent(indent + 4) + 'ex.Code = res.s2c_code\n';
  750. code += genIndent(indent + 4) + 'ex.Message = res.s2c_msg\n';
  751. code += genIndent(indent + 3) + 'else\n';
  752. code += genIndent(indent + 4) + 'ex.Code = 501\n';
  753. code += genIndent(indent + 4) + 'ex.Message = \"[LuaXmdsNetClient] ' + request.route + ' decode error!!\"\n';
  754. code += genIndent(indent + 3) + 'end\n';
  755. code += genIndent(indent + 3) + 'Socket.OnRequestEnd("' + request.route + '", false,ex.Code,ex.Message)\n';
  756. code += genIndent(indent + 3) + 'cb(ex,nil)\n';
  757. code += genIndent(indent + 2) + 'end\n';
  758. //code += genIndent(indent+2) + 'if(ex == nil) then\n';
  759. //code += genIndent(indent+3) + fullLuaName(classInfo.name)+'.last'+ request.responseType +' = res\n';
  760. //code += genIndent(indent+2) + 'end\n';
  761. //code += genIndent(indent+2) + 'cb(ex,res)\n';
  762. code += genIndent(indent + 1) + 'end, ' + request.type + 'Encoder, ' + request.type + 'Decoder)\n';
  763. code += genLuaMethodEnd(indent);
  764. return code;
  765. }
  766. function genLuaNotify(indent, classInfo, notify) {
  767. var code = '';
  768. code += genLuaEncodeMethodBegin(indent, notify.type);
  769. code += genIndent(indent + 1) + 'local input = ' + firstLowerCase(classInfo.name) + '_pb.' + notify.requestType + '()\n';
  770. code += genIndent(indent + 1) + 'protobuf.FromMessage(input,msg)\n';
  771. code += genIndent(indent + 1) + "return (input:SerializeToString())\n";
  772. code += genLuaMethodEnd(indent);
  773. code += genLuaMethodBegin(indent, fullLuaName(classInfo.name) + '.' + notify.type, notify.params);
  774. if (notify.params.length == 0) {
  775. code += genIndent(indent + 1) + 'local msg = nil\n';
  776. }
  777. else {
  778. code += genIndent(indent + 1) + 'local msg = {}\n';
  779. for (var i in notify.params) {
  780. var param = notify.params[i];
  781. code += genIndent(indent + 1) + 'msg.' + param.name + ' = ' + param.name + '\n';
  782. }
  783. //code += genIndent(indent + 1) + 'local input = {}\n';
  784. }
  785. //for(var i in notify.params){
  786. // var param = notify.params[i];
  787. // code += genIndent(indent+1)+'input.'+ param.name +' = '+ param.name+'\n';
  788. //}
  789. code += genIndent(indent + 1) + 'Socket.Notify("' + notify.route + '", msg, ' + notify.type + 'Encoder' + ')\n';
  790. code += genLuaMethodEnd(indent);
  791. return code;
  792. }
  793. function genLuaEvent(indent, classInfo, event) {
  794. var code = '';
  795. code += genLuaDecodeMethodBegin(indent, event.type);
  796. //code += genIndent(indent + 1) + 'stream = ZZBase64.decode(stream)\n';
  797. code += genIndent(indent + 1) + 'local res = ' + firstLowerCase(event.handler) + '_pb.' + event.requestType + '()\n';
  798. code += genIndent(indent + 1) + 'res:ParseFromString(stream)\n';
  799. code += genIndent(indent + 1) + "return res\n";
  800. code += genLuaMethodEnd(indent);
  801. code += genLuaMethodBegin(indent, fullLuaName(classInfo.name) + '.' + event.type, [{ name: 'cb' }]);
  802. code += genIndent(indent + 1) + 'Socket.On("' + event.route + '", function(res) \n';
  803. code += genIndent(indent + 2) + 'if(res.s2c_code == 200) then \n';
  804. code += genIndent(indent + 3) + 'Pomelo.' + classInfo.name + '.last' + event.requestType + ' = res\n';
  805. // code += genIndent(indent+3)+'Pomelo.MasteryHandler.lastUpqualityResponse = res \n';
  806. //code += genIndent(indent + 3) + 'Socket.OnRequestEnd("' + event.route + '", true) \n';
  807. code += genIndent(indent + 3) + 'cb(nil,res) \n';
  808. code += genIndent(indent + 2) + 'else \n';
  809. code += genIndent(indent + 3) + 'local ex = {} \n';
  810. code += genIndent(indent + 3) + 'if(res.s2c_code) then \n';
  811. code += genIndent(indent + 4) + 'ex.Code = res.s2c_code \n';
  812. code += genIndent(indent + 4) + 'ex.Message = res.s2c_msg \n';
  813. code += genIndent(indent + 3) + 'else \n';
  814. code += genIndent(indent + 4) + 'ex.Code = 501 \n';
  815. code += genIndent(indent + 4) + 'ex.Message = "[LuaXmdsNetClient] ' + event.route + ' decode error!!" \n';
  816. code += genIndent(indent + 3) + 'end \n';
  817. //code += genIndent(indent + 3) + 'Socket.OnRequestEnd("' + event.route + '", false,ex.Code,ex.Message) \n';
  818. code += genIndent(indent + 3) + 'cb(ex,nil) \n';
  819. code += genIndent(indent + 2) + 'end \n';
  820. code += genIndent(indent + 1) + 'end, ' + event.type + 'Decoder' + ') \n';
  821. // code += genIndent(indent+1)+'Socket.On("'+ event.route + '", cb) \n';
  822. code += genLuaMethodEnd(indent);
  823. return code;
  824. }
  825. function genLuaClass(indent, classInfo) {
  826. var code = '';
  827. code += '--------------------------------' + classInfo.name + '-------------------------------\n';
  828. code += 'Pomelo.' + classInfo.name + ' = {}\n';
  829. code += genSpaceLine();
  830. //生成request
  831. for (var i in classInfo.requests) {
  832. var request = classInfo.requests[i];
  833. code += genLuaRequest(indent, classInfo, request);
  834. code += genSpaceLine();
  835. }
  836. //生成notify
  837. for (var i in classInfo.notifies) {
  838. var notify = classInfo.notifies[i];
  839. code += genLuaNotify(indent, classInfo, notify);
  840. code += genSpaceLine();
  841. }
  842. //生成event
  843. for (var i in classInfo.events) {
  844. var event = classInfo.events[i];
  845. code += genLuaEvent(indent, classInfo, event);
  846. code += genSpaceLine();
  847. }
  848. return code;
  849. }
  850. //生成文件头注释
  851. function genLuaComment() {
  852. var code = '-------------------------------------------------\n';
  853. code += '-- 本文件由代码生成器自动生成,\n';
  854. code += '-- 千万不要修改本文件的任何代码,\n';
  855. code += '-- 修改的的任何代码都会被覆盖掉!\n';
  856. code += '----------------------------------------------------\n';
  857. code += genSpaceLine();
  858. return code;
  859. }
  860. function genLuaFile(classInfos) {
  861. var code = '';
  862. code += genLuaComment();
  863. code += 'local Socket = require "' + argv.pathLua + '.Lua' + classInfos[0].socket + '"\n';
  864. //code += 'local cjson = require "cjson"\n';
  865. code += 'require "base64"\n';
  866. if (classInfos[0].type === 'handler') {
  867. code += 'require "' + firstLowerCase(classInfos[0].name) + '_pb"\n';
  868. }
  869. code += genSpaceLine();
  870. code += '--------------------------------Pomelo-------------------------------\n';
  871. code += 'Pomelo = Pomelo or {}\n';
  872. code += genSpaceLine();
  873. for (var i in classInfos) {
  874. code += genLuaClass(0, classInfos[i]);
  875. code += genSpaceLine();
  876. code += genSpaceLine();
  877. }
  878. code += '--------------------------------Pomelo-------------------------------\n';
  879. code += 'return Pomelo\n';
  880. return code;
  881. }
  882. function genRequire() {
  883. var code = '';
  884. for (var keySocket in sockets) {
  885. code += 'require "' + argv.pathLua + '.' + sockets[keySocket].name + '"\n';
  886. }
  887. for (var keyHandler in handlers) {
  888. if (isHandler(handlers[keyHandler].name)) {
  889. code += 'require "' + argv.pathLua + '.' + firstUpperCase(handlers[keyHandler].name) + '"\n';
  890. }
  891. }
  892. return code;
  893. }
  894. //socket文件
  895. for (var keySocket in sockets) {
  896. writeFile(argv.outputLua, sockets[keySocket].name + '.lua', genLuaFile([sockets[keySocket]]));
  897. process.stdout.write('gen lua : ' + sockets[keySocket].name + '.lua' + '\n');
  898. }
  899. //handler文件
  900. for (var keyHandler in handlers) {
  901. var fileName = handlers[keyHandler].name;
  902. if (isHandler(fileName)) {
  903. writeFile(argv.outputLua, firstUpperCase(fileName) + '.lua', genLuaFile([handlers[keyHandler]]));
  904. process.stdout.write('gen lua : ' + fileName + '\n');
  905. }
  906. }
  907. writeFile(argv.outputLua, 'Pomelo.lua', genRequire());
  908. process.stdout.write('gen lua : Pomelo.lua \n');
  909. /*--------------------------------------------js代码生成--------------------------------------------------------*/
  910. function genJsMethodBegin(indent, className, method, isAsync) {
  911. var code = genIndent(indent) + className + '.prototype.' + method.type + ' = ';
  912. if (isAsync) {
  913. code += 'async(';
  914. }
  915. code += 'function(';
  916. if (method.params !== undefined) {
  917. for (var i in method.params) {
  918. var param = method.params[i];
  919. code += param.name;
  920. code += ',';
  921. }
  922. if (code[code.length - 1] === ',') {
  923. code = code.substring(0, code.length - 1);
  924. }
  925. }
  926. code += '){\n';
  927. return code;
  928. }
  929. function genJsMethodEnd(indent, isAsync) {
  930. var code = '';
  931. code += genIndent(indent) + '}';
  932. if (isAsync) {
  933. code += ')';
  934. }
  935. code += ';\n';
  936. return code;
  937. }
  938. function genJsRequest(indent, classInfo, request) {
  939. var code = '';
  940. code += genJsMethodBegin(indent, classInfo.name, request, true);
  941. code += genIndent(indent + 1) + 'return await(this.socket.requestAsync(\'' + request.route + '\',{';
  942. for (var i in request.params) {
  943. var param = request.params[i];
  944. code += param.name + ':' + param.name;
  945. if (i < request.params.length - 1) {
  946. code += ',';
  947. }
  948. }
  949. code += '}));\n';
  950. code += genJsMethodEnd(indent, true);
  951. return code;
  952. }
  953. function genJsNotify(indent, classInfo, notify) {
  954. var code = '';
  955. code += genJsMethodBegin(indent, classInfo.name, notify, false);
  956. code += genIndent(indent + 1) + 'return this.socket.notify(\'' + notify.route + '\',{';
  957. for (var i in notify.params) {
  958. var param = notify.params[i];
  959. code += param.name + ':' + param.name;
  960. if (i < notify.params.length - 1) {
  961. code += ',';
  962. }
  963. }
  964. code += '});\n';
  965. code += genJsMethodEnd(indent, false);
  966. return code;
  967. }
  968. function genJsEvent(indent, classInfo, event) {
  969. var code = '';
  970. code += genIndent(indent) + classInfo.name + '.prototype.on' + firstUpperCase(event.type) + ' = function(cb){\n';
  971. if (isHandler(classInfo.name)) {
  972. code += genIndent(indent + 1) + 'this.socket.on(\'' + event.route + '\',cb);\n';
  973. }
  974. else {
  975. code += genIndent(indent + 1) + 'this.on(\'' + event.route + '\',cb);\n';
  976. }
  977. code += genIndent(indent) + '}';
  978. return code;
  979. }
  980. function genJsConstructor(indent, classInfo) {
  981. var code = '';
  982. if (classInfo.type == 'socket') {
  983. code += genIndent(indent) + 'var ' + classInfo.name + ' = function(protoPath){\n';
  984. code += genIndent(indent + 1) + 'Socket.call(this,protoPath);\n';
  985. for (var i in classInfo.fields) {
  986. var name = classInfo.fields[i].type;
  987. if (isHandler(name)) {
  988. code += genIndent(indent + 1) + 'this.' + firstLowerCase(name) + ' = new ' + name + '(this);\n';
  989. }
  990. }
  991. }
  992. else if (classInfo.type == 'handler') {
  993. code += genIndent(indent) + 'var ' + classInfo.name + ' = function(socket){\n';
  994. code += genIndent(indent + 1) + 'this.socket = socket;\n';
  995. }
  996. code += genIndent(indent) + '}\n';
  997. return code;
  998. }
  999. function genJsClass(indent, classInfo) {
  1000. var code = '';
  1001. //handlers
  1002. if (classInfo.type == 'socket') {
  1003. for (var i in classInfo.fields) {
  1004. var name = classInfo.fields[i].type;
  1005. if (isHandler(name)) {
  1006. code += genIndent(indent) + 'var ' + firstUpperCase(name) + ' = require(\'./' + firstLowerCase(name) + '\');\n';
  1007. }
  1008. }
  1009. }
  1010. //构造函数
  1011. code += genSpaceLine();
  1012. code += genJsConstructor(indent, classInfo);
  1013. code += genSpaceLine();
  1014. if (classInfo.type == 'socket') {
  1015. code += genSpaceLine();
  1016. code += genIndent(indent) + 'util.inherits(' + firstUpperCase(classInfo.name) + ', Socket);\n';
  1017. code += genSpaceLine();
  1018. }
  1019. //生成request
  1020. for (var i in classInfo.requests) {
  1021. var request = classInfo.requests[i];
  1022. code += genJsRequest(indent, classInfo, request);
  1023. code += genSpaceLine();
  1024. }
  1025. //生成notify
  1026. for (var i in classInfo.notifies) {
  1027. var notify = classInfo.notifies[i];
  1028. code += genJsNotify(indent, classInfo, notify);
  1029. code += genSpaceLine();
  1030. }
  1031. //生成event
  1032. for (var i in classInfo.events) {
  1033. var event = classInfo.events[i];
  1034. code += genSpaceLine();
  1035. code += genJsEvent(indent, classInfo, event);
  1036. code += genSpaceLine();
  1037. }
  1038. return code;
  1039. }
  1040. //生成文件头注释
  1041. function genJsComment() {
  1042. var code = '/*-----------------------------------------------\n';
  1043. code += ' *本文件由代码生成器自动生成,\n';
  1044. code += ' *千万不要修改本文件的任何代码,\n';
  1045. code += ' *修改的的任何代码都会被覆盖掉!\n';
  1046. code += ' --------------------------------------------------*/\n';
  1047. code += genSpaceLine();
  1048. return code;
  1049. }
  1050. function genJsFile(classInfo) {
  1051. var code = '';
  1052. code += genJsComment();
  1053. if (classInfo.type == 'socket') {
  1054. code += 'var util = require(\'util\');\n';
  1055. code += 'var Socket = require(\'Xmds-csharp\').Socket;\n';
  1056. }
  1057. else if (classInfo.type == 'handler') {
  1058. code += 'var async = require(\'asyncawait/async\');\n';
  1059. code += 'var await = require(\'asyncawait/await\');\n';
  1060. }
  1061. code += genSpaceLine();
  1062. code += genJsClass(0, classInfo);
  1063. code += genSpaceLine();
  1064. code += 'module.exports = ' + firstUpperCase(classInfo.name) + ';\n';
  1065. return code;
  1066. }
  1067. if (!!argv.outputJs) {
  1068. //socket文件
  1069. for (var keySocket in sockets) {
  1070. writeFile(argv.outputJs, sockets[keySocket].name + '.js', genJsFile(sockets[keySocket]));
  1071. process.stdout.write('gen js : ' + sockets[keySocket].name + '.js' + '\n');
  1072. }
  1073. //handler文件
  1074. for (var keyHandler in handlers) {
  1075. var fileName = handlers[keyHandler].name;
  1076. if (isHandler(fileName)) {
  1077. writeFile(argv.outputJs, firstLowerCase(fileName) + '.js', genJsFile(handlers[keyHandler]));
  1078. process.stdout.write('gen js : ' + fileName + '\n');
  1079. }
  1080. }
  1081. }