#3481·ava

(关键架构错误): 当 `workerThreads: false` 时,共享 Worker 插件崩溃且测试 Worker 发生冲突

作者: codeCraft-Ritik创建于 2026年9月15日更新于 2026年9月15日
标签needs triage

^ 第 期:- (Critical Architecture Bug): 共享工人插件 Crash & Test 工人碰撞时“ 工人图解: 虚假”

元数据

  • ** title**:`[Bug] 共享的工人插件与 TypeError(不可序列化信件端口)相撞,当工人 Threads: fulse' 时会碰撞到未定义的线程上 。
  • Severity:临界值(在进程隔离下打破共享工人插件API)
  • ** 受影响的文件**:
  • [lib/worker/channel.js'](文件:///C:/Users/ritik/.ZGemini/antigravity/scratch/ava/lib/worker/channel.js#L142-L153)(登记共享工人')
  • [lib/plugin-support/shared-works.js'](文件:///C:/Users/ritik/.ZGemini/antigravity/scratch/ava/lib/plugin-support/shared-works.js#L114-L126)(观察工人程序')
  • [lib/fork.js' (文件:///C:/Users/ritik/.ZGemini/反重力/scratch/ava/lib/fork.js#L156-L160)(threadId')

问题摘要 AVA支持在工人线程("工人线程:真实",默认)或子进程("工人线程:假",对本地绑定,内存隔离或调试至关重要)中运行测试文件.

然而,共享工人插件基础设施依赖于两个在子进程执行中完全破裂的假设:

  1. " lib/worker/channel.js " 向 " handle.send () " 发送 " 港口:他们的港口 " ( " MessagePort " )。 在儿童过程中,手'使用IpcHandle',它称Node'process.send ()'为序列化':`先进''。 在 Node.js 中, “ v8. 序列化( {端口: 新信件Channel (. port1 } ) ) ” 丢出致命的“ TypeError [ERR INVALID STATE]: 不可序列化的主机对象: MessagePort , 因为“ MessagePort” 不能在 OS 进程中被克隆 。
  2. 在 " lib/fork.js " 中, " ThreadId: work.thread " Id被用作唯一的测试工人标识。 关于儿童过程,工人.线程' Id未定义'。 因此,所有同时进行的测试文件在共享-工人-装载者.js'中以id:未定义'登记。 当任何单一的测试文件完成并解登记`id:un defined'时,它会过早地关闭所有运行的测试文件的共享工人.

根由分析

  1. ** 不可序列化信息端口在进程IPC**: 在 " lib/worker/channel.js " 第142至153行:
zz
const {port1: our Port, port2: their Port} = 新信件频道 ();
Const shareWorkerHandle = 新的信件PortHandle(我们的Port);

handle.send ({ {
类型 : “ 共享- 工人- 连接” ,
频道ID,
文件名 ,
初始数据,
端口:它们的端口,
[他们的口]);

当`运行儿童程序'属实时: [JavaScript] handle = 新的 IpcHandle(控制花(进程));

`IpcHandle.send ' 称`This.sendRaw({ava: evt})'`没有转让清单。 通过 “ port: their Port ” 进入 “ process. send () ” 触发 V8 序列化 :
```2ZZ
///Node.js 反应试验:
= 需要('node:worker threads');
const {port1} = 新信件频道 ();
需要('node:v8'). 序列化({port: port1});
// QQ TypeError [ERR INVALID STAE]:不可序列化的主机对象:消息端口
  1. ** 未定义的工人识别器**: . . . . . . .