@lark-apaas/fullstack-vite-preset 1.0.20-alpha.1 → 1.0.20-alpha.2

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.
@@ -1,20 +1,11 @@
1
1
  /**
2
- * WebSocket Watchdog Plugin for Vite
3
- *
4
- * 检测沙箱代理链路下的 WebSocket 僵尸连接:客户端每 5s 发 ping、
2
+ * 检测沙箱代理链路下的 WebSocket 僵尸连接:客户端每 5s ping,
5
3
  * 连续 2 次拿不到 pong 即判死,向 parent 发 disconnected 通知。
6
4
  *
7
- * 一站式插件:
8
- * 1) WS handler 注册 `apaas:ws-watchdog:ping`,echo 回 `apaas:ws-watchdog:pong`
9
- * 2) Dev middleware 暴露 `/@apaas-ws-watchdog.js`,read 同包 plain `.mjs` 客户端
10
- * 并做 process.env 占位符替换、`Cache-Control: no-cache` 送出
11
- * 3) `transformIndexHtml` 注入 `<script type="module">` 让客户端在沙箱启动时自动跑
12
- *
13
5
  * 设计 spec: docs/superpowers/specs/2026-04-27-sandbox-ws-watchdog-design.md
14
6
  */
15
7
  import type { Plugin } from 'vite';
16
8
  export interface WsWatchdogPluginOptions {
17
- /** 自定义事件名,默认带 apaas:ws-watchdog: 前缀避免冲突 */
18
9
  pingEvent?: string;
19
10
  pongEvent?: string;
20
11
  /**
@@ -24,10 +15,8 @@ export interface WsWatchdogPluginOptions {
24
15
  */
25
16
  simulateZombie?: boolean;
26
17
  /**
27
- * 客户端 base 路径(如 `/app/app_xxx`)。aiforce 等网关会把
28
- * 完整路径透传给 Vite,middleware 必须用 base + 虚拟路径来匹配;
29
- * 注入到 HTML 的 <script src> 也同样要带 base。
30
- * 与 error-overlay-plugin / runtime-injection-plugin 同款约定。
18
+ * 客户端 base 路径(如 `/app/app_xxx`)。aiforce 等网关把完整路径透传给 Vite,
19
+ * middleware 匹配和注入的 <script src> 都必须带 base;空串退化为本地裸路径。
31
20
  */
32
21
  clientBasePath?: string;
33
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ws-watchdog-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/ws-watchdog-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AAwBtD,MAAM,WAAW,uBAAuB;IACtC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAmFR;AAED,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"ws-watchdog-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/ws-watchdog-plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AAqBtD,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAgFR;AAED,eAAe,sBAAsB,CAAC"}
@@ -1,16 +1,8 @@
1
1
  "use strict";
2
2
  /**
3
- * WebSocket Watchdog Plugin for Vite
4
- *
5
- * 检测沙箱代理链路下的 WebSocket 僵尸连接:客户端每 5s 发 ping、
3
+ * 检测沙箱代理链路下的 WebSocket 僵尸连接:客户端每 5s ping,
6
4
  * 连续 2 次拿不到 pong 即判死,向 parent 发 disconnected 通知。
7
5
  *
8
- * 一站式插件:
9
- * 1) WS handler 注册 `apaas:ws-watchdog:ping`,echo 回 `apaas:ws-watchdog:pong`
10
- * 2) Dev middleware 暴露 `/@apaas-ws-watchdog.js`,read 同包 plain `.mjs` 客户端
11
- * 并做 process.env 占位符替换、`Cache-Control: no-cache` 送出
12
- * 3) `transformIndexHtml` 注入 `<script type="module">` 让客户端在沙箱启动时自动跑
13
- *
14
6
  * 设计 spec: docs/superpowers/specs/2026-04-27-sandbox-ws-watchdog-design.md
15
7
  */
16
8
  var __importDefault = (this && this.__importDefault) || function (mod) {
@@ -21,12 +13,9 @@ exports.createWsWatchdogPlugin = createWsWatchdogPlugin;
21
13
  const node_fs_1 = __importDefault(require("node:fs"));
22
14
  const node_path_1 = __importDefault(require("node:path"));
23
15
  const CLIENT_RUNTIME_PATH = '/@apaas-ws-watchdog.js';
24
- // __dirname 而非 import.meta.url——本包 tsconfig "module": "CommonJS"。
25
- // 同款 fallback 写法见 src/vite-plugins/error-overlay-plugin.ts:38-44。
16
+ // 本包是 CommonJS,所以走 __dirname;编译后/源码两种布局各一套候选。
26
17
  const CLIENT_RUNTIME_CANDIDATES = [
27
- // 编译后位于 lib/vite-plugins/,回退到 ../../src/runtime/
28
18
  node_path_1.default.resolve(__dirname, '../../src/runtime/ws-watchdog-client.mjs'),
29
- // 开发时位于 src/vite-plugins/,回退到 ../runtime/
30
19
  node_path_1.default.resolve(__dirname, '../runtime/ws-watchdog-client.mjs'),
31
20
  ];
32
21
  function getClientRuntimePath() {
@@ -49,7 +38,6 @@ function createWsWatchdogPlugin(options = {}) {
49
38
  console.warn('[fullstack-ws-watchdog] simulateZombie 已启用,pong 将不会回应。' +
50
39
  '此模式仅用于测试,生产环境必须关闭。');
51
40
  }
52
- // ① WS handler:心跳
53
41
  server.ws.on(pingEvent, (data, client) => {
54
42
  if (simulateZombie)
55
43
  return;
@@ -57,10 +45,8 @@ function createWsWatchdogPlugin(options = {}) {
57
45
  return;
58
46
  client.send(pongEvent, { echo: data.t });
59
47
  });
60
- // Middleware:暴露 /@apaas-ws-watchdog.js
61
- // fs.readFileSync plain JS(不走 server.transformRequest)
62
- // process.env 占位符替换(编译期注入)
63
- // Cache-Control: no-cache(版本升降级时浏览器必须立刻拉新脚本)
48
+ // 直出 plain .mjs,跳过 server.transformRequest;no-cache 让 npm 版本升降级
49
+ // 时浏览器立刻拉新脚本,避免"旧 client + server"的 stale 窗口。
64
50
  server.middlewares.use((req, res, next) => {
65
51
  if (req.url !== watchdogPath)
66
52
  return next();
@@ -74,6 +60,7 @@ function createWsWatchdogPlugin(options = {}) {
74
60
  let code = node_fs_1.default.readFileSync(clientPath, 'utf-8');
75
61
  const replacements = {
76
62
  'process.env.FORCE_FRAMEWORK_DOMAIN_MAIN': JSON.stringify(process.env.FORCE_FRAMEWORK_DOMAIN_MAIN ?? ''),
63
+ 'process.env.CLIENT_BASE_PATH': JSON.stringify(clientBasePath),
77
64
  };
78
65
  for (const [key, value] of Object.entries(replacements)) {
79
66
  code = code.replace(new RegExp(key.replace(/\./g, '\\.'), 'g'), value);
@@ -89,7 +76,6 @@ function createWsWatchdogPlugin(options = {}) {
89
76
  }
90
77
  });
91
78
  },
92
- // ③ HTML 注入:让 Vite 沙箱页面加载时自动执行客户端
93
79
  transformIndexHtml() {
94
80
  const tags = [
95
81
  {
@@ -1 +1 @@
1
- {"version":3,"file":"ws-watchdog-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/ws-watchdog-plugin.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;AA+CH,wDAqFC;AAlID,sDAAyB;AACzB,0DAA6B;AAG7B,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAErD,oEAAoE;AACpE,kEAAkE;AAClE,MAAM,yBAAyB,GAAG;IAChC,iDAAiD;IACjD,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,0CAA0C,CAAC;IACnE,0CAA0C;IAC1C,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mCAAmC,CAAC;CAC7D,CAAC;AAEF,SAAS,oBAAoB;IAC3B,KAAK,MAAM,CAAC,IAAI,yBAAyB,EAAE,CAAC;QAC1C,IAAI,iBAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,KAAK,CACX,mDAAmD,EACnD,yBAAyB,CAC1B,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAqBD,SAAgB,sBAAsB,CACpC,UAAmC,EAAE;IAErC,MAAM,EACJ,SAAS,GAAG,wBAAwB,EACpC,SAAS,GAAG,wBAAwB,EACpC,cAAc,GAAG,KAAK,EACtB,cAAc,GAAG,EAAE,GACpB,GAAG,OAAO,CAAC;IACZ,MAAM,YAAY,GAAG,cAAc,GAAG,mBAAmB,CAAC;IAE1D,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,OAAO;QAEd,eAAe,CAAC,MAAM;YACpB,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC/C,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CACV,wDAAwD;oBACtD,oBAAoB,CACvB,CAAC;YACJ,CAAC;YAED,kBAAkB;YAClB,MAAM,CAAC,EAAE,CAAC,EAAE,CACV,SAAS,EACT,CAAC,IAAgC,EAAE,MAAM,EAAE,EAAE;gBAC3C,IAAI,cAAc;oBAAE,OAAO;gBAC3B,IAAI,OAAO,IAAI,EAAE,CAAC,KAAK,QAAQ;oBAAE,OAAO;gBACxC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC,CACF,CAAC;YAEF,yCAAyC;YACzC,4DAA4D;YAC5D,8BAA8B;YAC9B,gDAAgD;YAChD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxC,IAAI,GAAG,CAAC,GAAG,KAAK,YAAY;oBAAE,OAAO,IAAI,EAAE,CAAC;gBAC5C,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;gBAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;oBACxC,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC;oBACH,IAAI,IAAI,GAAG,iBAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAChD,MAAM,YAAY,GAA2B;wBAC3C,yCAAyC,EAAE,IAAI,CAAC,SAAS,CACvD,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAC9C;qBACF,CAAC;oBACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;wBACxD,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,EAC1C,KAAK,CACN,CAAC;oBACJ,CAAC;oBACD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;oBACxD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;oBAC3C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CACX,iDAAiD,EACjD,CAAC,CACF,CAAC;oBACF,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,kCAAkC;QAClC,kBAAkB;YAChB,MAAM,IAAI,GAAwB;gBAChC;oBACE,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE;oBAC5C,QAAQ,EAAE,cAAc;iBACzB;aACF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"ws-watchdog-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/ws-watchdog-plugin.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAyCH,wDAkFC;AAzHD,sDAAyB;AACzB,0DAA6B;AAG7B,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAErD,8CAA8C;AAC9C,MAAM,yBAAyB,GAAG;IAChC,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,0CAA0C,CAAC;IACnE,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mCAAmC,CAAC;CAC7D,CAAC;AAEF,SAAS,oBAAoB;IAC3B,KAAK,MAAM,CAAC,IAAI,yBAAyB,EAAE,CAAC;QAC1C,IAAI,iBAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,KAAK,CACX,mDAAmD,EACnD,yBAAyB,CAC1B,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAkBD,SAAgB,sBAAsB,CACpC,UAAmC,EAAE;IAErC,MAAM,EACJ,SAAS,GAAG,wBAAwB,EACpC,SAAS,GAAG,wBAAwB,EACpC,cAAc,GAAG,KAAK,EACtB,cAAc,GAAG,EAAE,GACpB,GAAG,OAAO,CAAC;IACZ,MAAM,YAAY,GAAG,cAAc,GAAG,mBAAmB,CAAC;IAE1D,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,OAAO;QAEd,eAAe,CAAC,MAAM;YACpB,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC/C,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CACV,wDAAwD;oBACtD,oBAAoB,CACvB,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,EAAE,CAAC,EAAE,CACV,SAAS,EACT,CAAC,IAAgC,EAAE,MAAM,EAAE,EAAE;gBAC3C,IAAI,cAAc;oBAAE,OAAO;gBAC3B,IAAI,OAAO,IAAI,EAAE,CAAC,KAAK,QAAQ;oBAAE,OAAO;gBACxC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC,CACF,CAAC;YAEF,gEAAgE;YAChE,gDAAgD;YAChD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxC,IAAI,GAAG,CAAC,GAAG,KAAK,YAAY;oBAAE,OAAO,IAAI,EAAE,CAAC;gBAC5C,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;gBAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;oBACxC,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC;oBACH,IAAI,IAAI,GAAG,iBAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAChD,MAAM,YAAY,GAA2B;wBAC3C,yCAAyC,EAAE,IAAI,CAAC,SAAS,CACvD,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAC9C;wBACD,8BAA8B,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;qBAC/D,CAAC;oBACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;wBACxD,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,EAC1C,KAAK,CACN,CAAC;oBACJ,CAAC;oBACD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;oBACxD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;oBAC3C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CACX,iDAAiD,EACjD,CAAC,CACF,CAAC;oBACF,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,kBAAkB;YAChB,MAAM,IAAI,GAAwB;gBAChC;oBACE,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE;oBAC5C,QAAQ,EAAE,cAAc;iBACzB;aACF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,sBAAsB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/fullstack-vite-preset",
3
- "version": "1.0.20-alpha.1",
3
+ "version": "1.0.20-alpha.2",
4
4
  "files": [
5
5
  "lib",
6
6
  "src/empty.css",
@@ -1,19 +1,10 @@
1
1
  /* eslint-env browser */
2
2
 
3
3
  /**
4
- * WebSocket Watchdog Client (plain ESM)
4
+ * WebSocket Watchdog Client。在 Vite 沙箱 iframe 内自启动;
5
+ * 通过 createHotContext 走 HMR 通道发 ping/收 pong;判死后 postMessage 给 parent。
5
6
  *
6
7
  * 设计 spec: docs/superpowers/specs/2026-04-27-sandbox-ws-watchdog-design.md
7
- *
8
- * 注入路径:通过 ws-watchdog-plugin.ts 的 transformIndexHtml 自动注入到 Vite 沙箱页面 head。
9
- * 通过 await import('/@vite/client') 拿 createHotContext 订阅 HMR 自定义事件
10
- * (middleware 直出的 raw module 拿不到 import.meta.hot;对齐 src/overlay/vite-client.js:424)。
11
- *
12
- * .mjs 而非 .ts/.js 的原因:
13
- * - 本包是 CommonJS(tsconfig "module": "CommonJS",无 "type": "module"),plain `.js` + ESM
14
- * 语法在某些工具链下会被当 CJS 解析报错;`.mjs` 强制 ESM
15
- * - 不依赖 @lark-apaas/client-toolkit(fullstack-vite-preset 不依赖 toolkit 避免循环依赖),
16
- * 所以 origin 解析逻辑直接 inline,参照 toolkit/src/utils/postMessage.ts:23-49
17
8
  */
18
9
 
19
10
  /**
@@ -35,7 +26,7 @@
35
26
  */
36
27
 
37
28
  /**
38
- * 不返回 disposewatchdog 跟 iframe 同生命周期。
29
+ * 不返回 dispose——watchdog 跟 iframe 同生命周期,无独立销毁路径。
39
30
  * @param {WatchdogDeps} deps
40
31
  * @param {WatchdogOptions} [options]
41
32
  */
@@ -54,14 +45,11 @@ export function createWatchdog(deps, options = {}) {
54
45
  const recentPings = new Map();
55
46
 
56
47
  function onTick() {
57
- // 顺序硬约束:missed++ 必须在 sendCustom 之前——
58
- // 即使 deps.sendCustom 抛错(理论上不会,生产侧已 try/catch),missed 已累加,
59
- // 下一次 tick 仍会触发 disconnected post。spec §4.4.3 #1 + #5。
48
+ // missed++ 必须先于 sendCustom:发送侧抛错时 missed 已累加,下一 tick 仍能判死。
60
49
  missed += 1;
61
50
  const seq = ++pingSeq;
62
51
  const now = Date.now();
63
52
  recentPings.set(seq, now);
64
- // 只保留最近 echoFreshnessMs 内的 ping,避免 map 无限增长
65
53
  for (const [s, ts] of recentPings) {
66
54
  if (now - ts > echoFreshnessMs) recentPings.delete(s);
67
55
  }
@@ -86,8 +74,7 @@ export function createWatchdog(deps, options = {}) {
86
74
  deps.setInterval(onTick, intervalMs);
87
75
  }
88
76
 
89
- // ───── inline parent origin 解析(spec §3.2 invariant 1 等价实现)─────
90
- // 完整对齐 toolkit/src/utils/postMessage.ts:23-49——禁止改成 parent.postMessage(msg, '*')。
77
+ // postMessage targetOrigin 必须显式指定,禁止用 '*'。
91
78
 
92
79
  const PARENT_ORIGIN_KEY = '__parentOrigin';
93
80
 
@@ -116,7 +103,7 @@ function getLegacyParentOrigin() {
116
103
  function resolveParentOrigin() {
117
104
  const paramOrigin = getParentOriginFromParams();
118
105
  if (paramOrigin) return paramOrigin;
119
- // plugin middleware 编译期替换成字符串字面量
106
+ // plugin middleware 在送出脚本时把这个 token 编译期替换成字符串字面量。
120
107
  return process.env.FORCE_FRAMEWORK_DOMAIN_MAIN || getLegacyParentOrigin();
121
108
  }
122
109
 
@@ -133,17 +120,19 @@ function postStatus(status) {
133
120
  }
134
121
  }
135
122
 
136
- // ───── 自启动(生产路径;浏览器 iframe 内执行;vitest jsdom 环境下 window.parent === window 不执行)─────
137
- // 关键:middleware 直出的 raw module 拿不到 import.meta.hot——必须用 createHotContext
138
- // 对齐 src/overlay/vite-client.js:424 的做法。
123
+ // 仅在 iframe 内自启动;jsdom(vitest)下 window.parent === window 自然跳过。
124
+ // 直出的 raw module 拿不到 import.meta.hot,所以借 createHotContext 走 HMR 通道。
125
+ // CLIENT_BASE_PATH plugin 编译期替换;缺前缀会被网关 404。
126
+ const CLIENT_BASE_PATH = process.env.CLIENT_BASE_PATH || '';
127
+
139
128
  if (typeof window !== 'undefined' && window.parent !== window) {
140
129
  (async () => {
141
130
  try {
142
- const { createHotContext } = await import('/@vite/client');
143
- const hot = createHotContext('/@apaas-ws-watchdog.js');
131
+ const { createHotContext } = await import(CLIENT_BASE_PATH + '/@vite/client');
132
+ const hot = createHotContext(CLIENT_BASE_PATH + '/@apaas-ws-watchdog.js');
144
133
  createWatchdog({
145
134
  sendCustom: (event, data) => {
146
- // spec §4.4.3 #5:hot.send 断连场景可能抛错;吞掉,missed 已在 onTick 顶部累加。
135
+ // 断连时 hot.send 可能抛;吞掉即可——missed 已在 onTick 顶部累加。
147
136
  try { hot.send(event, data); }
148
137
  catch (e) { console.warn('[fullstack-ws-watchdog] send failed:', e); }
149
138
  },