@hangox/mg-cli 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -267,8 +267,8 @@ var ConnectionManager = class {
267
267
  allConnections = /* @__PURE__ */ new Map();
268
268
  /** 心跳检查定时器 */
269
269
  heartbeatTimer = null;
270
- constructor(logger) {
271
- this.logger = logger;
270
+ constructor(logger2) {
271
+ this.logger = logger2;
272
272
  }
273
273
  /**
274
274
  * 启动心跳检查
@@ -495,9 +495,9 @@ var RequestHandler = class {
495
495
  connectionManager;
496
496
  /** 待处理的请求 */
497
497
  pendingRequests = /* @__PURE__ */ new Map();
498
- constructor(connectionManager, logger) {
498
+ constructor(connectionManager, logger2) {
499
499
  this.connectionManager = connectionManager;
500
- this.logger = logger;
500
+ this.logger = logger2;
501
501
  }
502
502
  /**
503
503
  * 处理 Consumer 请求
@@ -675,6 +675,60 @@ function getVersion() {
675
675
  }
676
676
  }
677
677
 
678
+ // src/server/analytics.ts
679
+ import { PostHog } from "posthog-node";
680
+ var POSTHOG_API_KEY = "phc_cSZZIxZOPhWOlsw92Wz8tmKQ5z8eQYsI3m9aM2Ujia9";
681
+ var POSTHOG_HOST = "https://us.i.posthog.com";
682
+ var posthogClient = null;
683
+ var logger = null;
684
+ function isTelemetryDisabled() {
685
+ return process.env.MG_TELEMETRY_DISABLED === "1" || process.env.MG_TELEMETRY_DISABLED === "true" || process.env.DO_NOT_TRACK === "1" || process.env.DO_NOT_TRACK === "true";
686
+ }
687
+ function initServerAnalytics(serverLogger) {
688
+ logger = serverLogger;
689
+ if (isTelemetryDisabled()) {
690
+ logger.info("\u9065\u6D4B\u5DF2\u7981\u7528 (MG_TELEMETRY_DISABLED \u6216 DO_NOT_TRACK)");
691
+ return;
692
+ }
693
+ if (!posthogClient) {
694
+ posthogClient = new PostHog(POSTHOG_API_KEY, {
695
+ host: POSTHOG_HOST,
696
+ // Server 端使用批量模式,减少网络请求
697
+ flushAt: 10,
698
+ flushInterval: 3e4
699
+ // 30 秒
700
+ });
701
+ logger.info("PostHog Analytics \u5DF2\u521D\u59CB\u5316");
702
+ }
703
+ }
704
+ function trackEvent(eventData) {
705
+ if (!posthogClient) {
706
+ return;
707
+ }
708
+ try {
709
+ posthogClient.capture({
710
+ distinctId: eventData.distinctId,
711
+ event: eventData.event,
712
+ properties: eventData.properties
713
+ });
714
+ logger?.info(`\u7EDF\u8BA1\u4E8B\u4EF6\u5DF2\u8BB0\u5F55: ${eventData.event}`, eventData.properties);
715
+ } catch (error) {
716
+ logger?.error("\u7EDF\u8BA1\u4E8B\u4EF6\u8BB0\u5F55\u5931\u8D25:", error);
717
+ }
718
+ }
719
+ async function shutdownServerAnalytics() {
720
+ if (posthogClient) {
721
+ try {
722
+ logger?.info("\u6B63\u5728\u53D1\u9001\u5269\u4F59\u7EDF\u8BA1\u4E8B\u4EF6...");
723
+ await posthogClient.shutdown();
724
+ logger?.info("PostHog Analytics \u5DF2\u5173\u95ED");
725
+ } catch (error) {
726
+ logger?.error("\u5173\u95ED PostHog \u5931\u8D25:", error);
727
+ }
728
+ posthogClient = null;
729
+ }
730
+ }
731
+
678
732
  // src/server/websocket-server.ts
679
733
  var MGServer = class {
680
734
  wss = null;
@@ -706,6 +760,7 @@ var MGServer = class {
706
760
  this.startedAt = /* @__PURE__ */ new Date();
707
761
  this.logger.info(`Server \u542F\u52A8\u6210\u529F\uFF0C\u76D1\u542C\u7AEF\u53E3: ${port2}`);
708
762
  this.connectionManager.startHeartbeatCheck(HEARTBEAT_INTERVAL);
763
+ initServerAnalytics(this.logger);
709
764
  resolve2(port2);
710
765
  });
711
766
  this.wss.on("error", (error) => {
@@ -765,6 +820,10 @@ var MGServer = class {
765
820
  this.handleRegister(ws, message);
766
821
  return;
767
822
  }
823
+ if (message.type === "track_analytics" /* TRACK_ANALYTICS */) {
824
+ this.handleTrackAnalytics(message);
825
+ return;
826
+ }
768
827
  const managedWs = ws;
769
828
  if (!managedWs.connectionId) {
770
829
  this.logger.warn("\u672A\u6CE8\u518C\u7684\u8FDE\u63A5\u53D1\u9001\u6D88\u606F\uFF0C\u5FFD\u7565");
@@ -842,6 +901,9 @@ var MGServer = class {
842
901
  case "navigate_to_node" /* NAVIGATE_TO_NODE */:
843
902
  this.handleNavigateToNode(ws, message);
844
903
  break;
904
+ case "track_analytics" /* TRACK_ANALYTICS */:
905
+ this.handleTrackAnalytics(message);
906
+ break;
845
907
  case "response" /* RESPONSE */:
846
908
  case "error" /* ERROR */:
847
909
  this.requestHandler.handleResponse(message);
@@ -987,6 +1049,15 @@ var MGServer = class {
987
1049
  }
988
1050
  });
989
1051
  }
1052
+ /**
1053
+ * 处理统计事件
1054
+ */
1055
+ handleTrackAnalytics(message) {
1056
+ const eventData = message.data;
1057
+ if (eventData) {
1058
+ trackEvent(eventData);
1059
+ }
1060
+ }
990
1061
  /**
991
1062
  * 处理节点导航请求
992
1063
  */
@@ -1060,6 +1131,7 @@ var MGServer = class {
1060
1131
  return;
1061
1132
  }
1062
1133
  this.logger.info("\u6B63\u5728\u505C\u6B62 Server...");
1134
+ await shutdownServerAnalytics();
1063
1135
  this.requestHandler.cleanupAll();
1064
1136
  this.connectionManager.closeAll();
1065
1137
  return new Promise((resolve2) => {
@@ -1120,14 +1192,14 @@ async function startServerForeground(port2) {
1120
1192
  );
1121
1193
  }
1122
1194
  ensureConfigDir();
1123
- const logger = createLogger({
1195
+ const logger2 = createLogger({
1124
1196
  console: true,
1125
1197
  file: true,
1126
1198
  minLevel: "INFO" /* INFO */
1127
1199
  });
1128
1200
  const server = createServer({
1129
1201
  port: port2 || DEFAULT_PORT,
1130
- logger
1202
+ logger: logger2
1131
1203
  });
1132
1204
  const cleanup = async () => {
1133
1205
  console.log("\n\u6B63\u5728\u505C\u6B62 Server...");
@@ -1153,7 +1225,7 @@ MG Server \u542F\u52A8\u6210\u529F`);
1153
1225
  console.log(`
1154
1226
  \u6309 Ctrl+C \u505C\u6B62...`);
1155
1227
  } catch (error) {
1156
- logger.error("Server \u542F\u52A8\u5931\u8D25:", error);
1228
+ logger2.error("Server \u542F\u52A8\u5931\u8D25:", error);
1157
1229
  throw error;
1158
1230
  }
1159
1231
  }