@lark-apaas/coding-vite-preset 1.0.16 → 1.0.17-beta.0

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.
@@ -13,8 +13,9 @@
13
13
  * 但 reload 走的是旧的死 HTTP/2 连接,不是新 TCP。
14
14
  *
15
15
  * 解决方案:
16
- * 通过 Vite transform hook 拦截 @vite/client,直接移除 WS 重连后的 location.reload()
17
- * 用户若需要获取最新代码,手动刷新即可(符合云端 IDE 使用预期)。
16
+ * 通过 Vite transform hook 拦截 @vite/client,把 WS 重连后的 location.reload() 换成
17
+ * transport.connect() 重连——与探活同为 WebSocket 通道,不碰 HTTP/2 连接池,上述白屏
18
+ * 不再触发;失败只打 warn,由用户决定是否刷新。
18
19
  *
19
20
  * 适用范围:仅 dev server (apply: 'serve')
20
21
  */
@@ -1 +1 @@
1
- {"version":3,"file":"vite-client-patch-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/vite-client-patch-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAkBnC,wBAAgB,qBAAqB,IAAI,MAAM,CAmE9C"}
1
+ {"version":3,"file":"vite-client-patch-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/vite-client-patch-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAgCnC,wBAAgB,qBAAqB,IAAI,MAAM,CA2F9C"}
@@ -14,19 +14,32 @@
14
14
  * 但 reload 走的是旧的死 HTTP/2 连接,不是新 TCP。
15
15
  *
16
16
  * 解决方案:
17
- * 通过 Vite transform hook 拦截 @vite/client,直接移除 WS 重连后的 location.reload()
18
- * 用户若需要获取最新代码,手动刷新即可(符合云端 IDE 使用预期)。
17
+ * 通过 Vite transform hook 拦截 @vite/client,把 WS 重连后的 location.reload() 换成
18
+ * transport.connect() 重连——与探活同为 WebSocket 通道,不碰 HTTP/2 连接池,上述白屏
19
+ * 不再触发;失败只打 warn,由用户决定是否刷新。
19
20
  *
20
21
  * 适用范围:仅 dev server (apply: 'serve')
21
22
  */
22
23
  Object.defineProperty(exports, "__esModule", { value: true });
23
24
  exports.viteClientPatchPlugin = viteClientPatchPlugin;
24
25
  /**
25
- * 匹配 vite:ws:disconnect 处理器中的重连刷新代码:
26
+ * 匹配 vite:ws:disconnect 处理器中的断线恢复代码(三行连续):
27
+ * url.search = "";
26
28
  * await waitForSuccessfulPing(url.href);
27
29
  * location.reload();
30
+ * 其中 url.search = "" 会把 sandbox_token 一并抹掉,导致探活恒被沙箱网关 401
31
+ * (ws_proxy_service.go 的 token == "" 判断),故一并重写。
28
32
  */
29
- const RECONNECT_RELOAD_PATTERN = /(await waitForSuccessfulPing\(url\.href\);)\r?\n(\s*)location\.reload\(\);/;
33
+ const DISCONNECT_RECOVERY_PATTERN = /url\.search = "";\r?\n(\s*)await waitForSuccessfulPing\(url\.href\);\r?\n\s*location\.reload\(\);/;
34
+ /**
35
+ * 匹配 transport 里的 HMR 心跳定时器:
36
+ * pingIntervalId = setInterval(() => { ... }, pingInterval);
37
+ * Vite 被动断开只走 close → onDisconnection(),不清定时器;且 pingIntervalId 被下次
38
+ * connect 覆盖后再也清不掉,重连后每断一次泄漏一个。改成 IIFE 内的局部 id 自清(不能清
39
+ * 共享变量,会误杀新连接的心跳;用 IIFE 而非 const 声明,避免注入点落在无大括号的语句
40
+ * 位置时产生语法错误)。已实测 Vite 7.3.x / 8.0.x 文本一致。
41
+ */
42
+ const PING_INTERVAL_LEAK_PATTERN = /pingIntervalId = setInterval\(\(\) => \{\s*if \(socket\.readyState === socket\.OPEN\) socket\.send\(JSON\.stringify\(\{ type: "ping" \}\)\);\s*\}, pingInterval\);/;
30
43
  /**
31
44
  * 匹配 @vite/client 顶层那处悬空的 HMR 建链调用(无 .catch):
32
45
  * transport.connect(createHMRHandler(handleMessage));
@@ -43,12 +56,19 @@ function viteClientPatchPlugin() {
43
56
  return;
44
57
  }
45
58
  let patched = code;
46
- // patch 1: 移除 WS 重连后的 location.reload()(云端死连接导致 ~18s 白屏)
47
- if (RECONNECT_RELOAD_PATTERN.test(patched)) {
48
- patched = patched.replace(RECONNECT_RELOAD_PATTERN, (_, pingLine) => pingLine);
59
+ // patch 1: 重写断线恢复——探活保住 sandbox_token,探活成功后重连(失败只打 warn)
60
+ if (DISCONNECT_RECOVERY_PATTERN.test(patched)) {
61
+ patched = patched.replace(DISCONNECT_RECOVERY_PATTERN, (_, indent) => 'const __st = url.searchParams.get("sandbox_token");\n' +
62
+ indent +
63
+ 'url.search = __st ? "?sandbox_token=" + encodeURIComponent(__st) : "";\n' +
64
+ indent +
65
+ 'await waitForSuccessfulPing(url.href);\n' +
66
+ indent +
67
+ 'transport.connect(createHMRHandler(handleMessage)).catch((e) => { ' +
68
+ "console.warn('[fullstack-vite-client-patch] HMR reconnect failed (ignored):', e); });");
49
69
  }
50
70
  else {
51
- console.warn('[fullstack-vite-client-patch] Warning: Could not find the reconnect-reload pattern ' +
71
+ console.warn('[fullstack-vite-client-patch] Warning: Could not find the disconnect-recovery pattern ' +
52
72
  'in @vite/client. The patch has NOT been applied. ' +
53
73
  'Check if this Vite version changed the vite:ws:disconnect handler.');
54
74
  }
@@ -79,6 +99,17 @@ function viteClientPatchPlugin() {
79
99
  'createHMRHandler(handleMessage))` call in @vite/client. The closed-error guard ' +
80
100
  'has NOT been applied. Check if this Vite version changed the HMR client bootstrap.');
81
101
  }
102
+ // patch 4: 心跳定时器自清,修 patch 1 自动重连放大的 Vite 定时器泄漏
103
+ if (PING_INTERVAL_LEAK_PATTERN.test(patched)) {
104
+ patched = patched.replace(PING_INTERVAL_LEAK_PATTERN, 'pingIntervalId = (() => { const id = setInterval(() => { ' +
105
+ 'if (socket.readyState === socket.OPEN) socket.send(JSON.stringify({ type: "ping" })); ' +
106
+ 'else clearInterval(id); }, pingInterval); return id; })();');
107
+ }
108
+ else {
109
+ console.warn('[fullstack-vite-client-patch] Warning: Could not find the ping-interval pattern ' +
110
+ 'in @vite/client; stale heartbeat timers will leak on reconnect. ' +
111
+ 'Check if this Vite version changed createWebSocketModuleRunnerTransport.');
112
+ }
82
113
  return patched === code ? undefined : { code: patched };
83
114
  },
84
115
  };
@@ -1 +1 @@
1
- {"version":3,"file":"vite-client-patch-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/vite-client-patch-plugin.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;AAoBH,sDAmEC;AAnFD;;;;GAIG;AACH,MAAM,wBAAwB,GAC5B,4EAA4E,CAAC;AAE/E;;;;GAIG;AACH,MAAM,eAAe,GACnB,8EAA8E,CAAC;AAEjF,SAAgB,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,OAAO;QAEd,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,IAAI,OAAO,GAAG,IAAI,CAAC;YAEnB,yDAAyD;YACzD,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3C,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,wBAAwB,EACxB,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAC1B,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,qFAAqF;oBACnF,mDAAmD;oBACnD,oEAAoE,CACvE,CAAC;YACJ,CAAC;YAED,4DAA4D;YAC5D,qEAAqE;YACrE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YACpD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;oBAChD,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,wBAAwB,EACxB,GAAG,EAAE,CAAC,oCAAoC,OAAO,EAAE,CACpD,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CACV,uFAAuF;wBACrF,mFAAmF,CACtF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,2CAA2C;YAC3C,8DAA8D;YAC9D,kFAAkF;YAClF,uDAAuD;YACvD,uDAAuD;YACvD,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,eAAe,EACf,oEAAoE;oBAClE,qFAAqF,CACxF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,+EAA+E;oBAC7E,iFAAiF;oBACjF,oFAAoF,CACvF,CAAC;YACJ,CAAC;YAED,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"vite-client-patch-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/vite-client-patch-plugin.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;AAkCH,sDA2FC;AAzHD;;;;;;;GAOG;AACH,MAAM,2BAA2B,GAC/B,mGAAmG,CAAC;AAEtG;;;;;;;GAOG;AACH,MAAM,0BAA0B,GAC9B,oKAAoK,CAAC;AAEvK;;;;GAIG;AACH,MAAM,eAAe,GACnB,8EAA8E,CAAC;AAEjF,SAAgB,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,OAAO;QAEd,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,IAAI,OAAO,GAAG,IAAI,CAAC;YAEnB,yDAAyD;YACzD,IAAI,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9C,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,2BAA2B,EAC3B,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACZ,uDAAuD;oBACvD,MAAM;oBACN,0EAA0E;oBAC1E,MAAM;oBACN,0CAA0C;oBAC1C,MAAM;oBACN,oEAAoE;oBACpE,uFAAuF,CAC1F,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,wFAAwF;oBACtF,mDAAmD;oBACnD,oEAAoE,CACvE,CAAC;YACJ,CAAC;YAED,4DAA4D;YAC5D,qEAAqE;YACrE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YACpD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;oBAChD,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,wBAAwB,EACxB,GAAG,EAAE,CAAC,oCAAoC,OAAO,EAAE,CACpD,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CACV,uFAAuF;wBACrF,mFAAmF,CACtF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,2CAA2C;YAC3C,8DAA8D;YAC9D,kFAAkF;YAClF,uDAAuD;YACvD,uDAAuD;YACvD,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,eAAe,EACf,oEAAoE;oBAClE,qFAAqF,CACxF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,+EAA+E;oBAC7E,iFAAiF;oBACjF,oFAAoF,CACvF,CAAC;YACJ,CAAC;YAED,gDAAgD;YAChD,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,0BAA0B,EAC1B,2DAA2D;oBACzD,wFAAwF;oBACxF,4DAA4D,CAC/D,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,kFAAkF;oBAChF,kEAAkE;oBAClE,0EAA0E,CAC7E,CAAC;YACJ,CAAC;YAED,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/coding-vite-preset",
3
- "version": "1.0.16",
3
+ "version": "1.0.17-beta.0",
4
4
  "description": "Vite 8 preset for OpenClaw projects",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",