_model.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. const { fork } = require('child_process');
  2. const fs = require('fs');
  3. const path = require('path');
  4. const WebSocket = require('ws'); // 引入 WebSocket 库
  5. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  6. //Initialize codes.
  7. AutoLoadPlugins();
  8. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. //You can load the plugins in global field, if the next line codes are uncommented.
  10. //AutoLoadGlobalPlugins();
  11. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. //Sample codes.
  13. let ws_global = null; // 用于保存 WebSocket 实例,全局可访问
  14. // 暴露变量,由 callback.js 负责注册监听
  15. exports.OnMonacoSaveRequest = null; // 实现保存时的回调
  16. exports.OnMonacoOpenRequest = null; // 实现打开时的回调
  17. exports.StartupMonacoEdit = function (cb) {
  18. // 启动 monaco 的 Node.js 服务端(server.js)
  19. fork(path.join(unit.dir, 'monaco', 'server.js'))
  20. .on('message', msg => {
  21. if (msg.type === 'ready') { cb(); }
  22. });
  23. // 启动 WebSocket 服务器,监听 3999 端口
  24. const wss = new WebSocket.Server({ port: 3999 });
  25. // 当前端连接建立时的回调
  26. wss.on('connection', ws => {
  27. ws_global = ws;
  28. console.log("WebSocket 连接成功");
  29. // 监听来自前端的消息
  30. ws.on('message', msg => {
  31. try {
  32. const data = JSON.parse(msg); // 尝试解析消息内容为 JSON 对象
  33. if (data.type === 'save') {
  34. // 收到保存请求,调用外部定义的保存回调函数
  35. exports.OnMonacoSaveRequest(data.content, filepath => {
  36. // 执行实际文件保存操作
  37. fs.writeFileSync(filepath, data.content, 'utf-8');
  38. // 将保存结果通过 WebSocket 返回给前端
  39. ws.send(JSON.stringify({
  40. type: 'save_success',
  41. filename: path.basename(filepath), // 提取文件名
  42. fullpath: filepath // 完整路径
  43. }));
  44. });
  45. } else if (data.type === 'open') {
  46. // 收到打开请求,调用外部定义的打开回调函数
  47. exports.OnMonacoOpenRequest(filepath => {
  48. // 读取文件内容
  49. const content = fs.readFileSync(filepath, 'utf-8');
  50. // 将内容通过 WebSocket 发送给前端
  51. ws.send(JSON.stringify({
  52. type: 'open_success',
  53. filename: path.basename(filepath),
  54. fullpath: filepath,
  55. content: content
  56. }));
  57. });
  58. }
  59. } catch (err) {
  60. // 捕获解析或处理过程中的异常
  61. console.error("WebSocket 消息解析失败:", err);
  62. }
  63. });
  64. });
  65. };
  66. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  67. //Put you codes here
  68. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  69. // AutoLoadPlugins Function Implement Start.
  70. function extractPluginName(filename) {
  71. const regex = /js_ext_comx_(.*?)-(native)/;
  72. const match = filename.match(regex);
  73. if (match) {
  74. return match[1];
  75. }
  76. return null;
  77. }
  78. function isSysPluginName(filename) {
  79. const knownPlugins = ['kul', 'qt', 'qtshell', 'resource', 'mutex', 'encrypt', 'encryptshell'];
  80. return knownPlugins.includes(extractPluginName(filename));
  81. }
  82. function requirePlugin(filedir) {
  83. const cache = {};
  84. requirePlugin = function(filedir) {
  85. const filename = path.basename(filedir);
  86. if(isSysPluginName(filename)){return;}
  87. if (cache[filename]) {
  88. //console.log(cache[filename], 'has been loaded');
  89. } else {
  90. cache[filename] = filedir;
  91. require(filedir);
  92. }
  93. };
  94. requirePlugin(filedir);
  95. }
  96. function AutoLoadPlugins() {
  97. var plugin_dir = (__dirname + '/../addon/');
  98. if (!fs.existsSync(plugin_dir)) {
  99. return;
  100. }
  101. var files = fs.readdirSync(plugin_dir);
  102. files.forEach(function(filename) {
  103. var filedir = path.join(plugin_dir, filename);
  104. var stats = fs.statSync(filedir);
  105. if (!stats.isDirectory()) {
  106. if (filedir.indexOf('-linux.node') !== -1 && require('os').platform() === 'linux') {
  107. requirePlugin(filedir);
  108. }
  109. if (filedir.indexOf('-win.node') !== -1 && require('os').platform() === 'win32') {
  110. requirePlugin(filedir);
  111. }
  112. if (filedir.indexOf('-darwin.node') !== -1 && require('os').platform() === 'darwin') {
  113. requirePlugin(filedir);
  114. }
  115. }
  116. });
  117. }
  118. function AutoLoadGlobalPlugins() {
  119. var plugin_dir = (process.env.COMX_SDK + 'addon/');
  120. if (!fs.existsSync(plugin_dir)) {
  121. return;
  122. }
  123. var files = fs.readdirSync(plugin_dir);
  124. files.forEach(function(filename) {
  125. var filedir = path.join(plugin_dir, filename);
  126. var stats = fs.statSync(filedir);
  127. if (!stats.isDirectory()) {
  128. if (filedir.indexOf('-linux.node') !== -1 && require('os').platform() === 'linux') {
  129. requirePlugin(filedir);
  130. }
  131. if (filedir.indexOf('-win.node') !== -1 && require('os').platform() === 'win32') {
  132. requirePlugin(filedir);
  133. }
  134. if (filedir.indexOf('-darwin.node') !== -1 && require('os').platform() === 'darwin') {
  135. requirePlugin(filedir);
  136. }
  137. }
  138. });
  139. }
  140. //AutoLoadPlugins Function Implement End.
  141. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  142. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  143. // ide_info Function Implement Start.
  144. exports.ide_info = (msg) => {
  145. if (process.send) {
  146. process.send({
  147. type: 'debug',
  148. info: msg
  149. });
  150. }
  151. };
  152. //ide_info Function Implement End.
  153. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////