# @design\.estate/dees-comms 中文文档

规范地址：https://npmcn.com/package/%40design.estate/dees-comms/

版本：2\.1\.0
npm 元数据更新时间：2026-10-13T08:32:20.762Z
中文译文更新时间：2026-11-12T01:15:19.146Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40design.estate/dees-comms
原文对照：https://npmcn.com/package/%40design.estate/dees-comms/?lang=original

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：2.4 MB，23 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：3 个
- 首次发布：2023-08-07T23:12:30.337Z
- 最新版本发布：2026-10-13T08:32:19.751Z
- 近 30 天下载量：7330（2026-10-12 至 2026-11-10，npm 官方下载统计）
- 已发布版本数：11（近 12 个月 9 个）

## 中文简介

一个通信模块,用于实现基于DOM的通讯和浏览器标签和工人之间的同步.

## 安装

```sh
npm install @design.estate/dees-comms
```

也可以使用：`pnpm add @design.estate/dees-comms`、`yarn add @design.estate/dees-comms`、`bun add @design.estate/dees-comms`

## README

# @ dedesign.estate/dees-comms (英语)

在一个 BroadChannel 的标签、帧和工作者之间打入消息: 输入了需要答案的请求, 输入了没有答案的事件 .

## 问题报告和安全

关于报告错误、问题或安全弱点,请访问 [社区. fos.global/](https://community.foss.global/)这是所有问题报告的中央社区中心。 签署和遵守我们缴款协议并经过身份验证的开发者也可获得 [代码.fos.global/](https://code.foss.global/) 账户直接提交 Pull 请求.

## 安装

```bash
pnpm add @design.estate/dees-comms
```

## 使用量

### 频道

每个 `DeesComms` 在一个广播频道上进行实例谈话。 案件只有在使用同一频道名称时,在任何标签、帧或同一来源的工人中才能互相听到.

```typescript
import { DeesComms } from '@design.estate/dees-comms';

// the default channel, 'dees-comms'
const comms = new DeesComms();

// a channel of this application's own
const appComms = new DeesComms({ channelName: 'my-app' });

console.log(DeesComms.defaultChannelName); // 'dees-comms'
console.log(appComms.channelName); // 'my-app'
```

未使用名称创建实例 `DeesComms.defaultChannelName`,在名字存在之前使用的每一个实例。 其他的软件包 : `DomTools` 联 合 国 `@design.estate/dees-domtools` 在那座乐园里,有一位服务者 `@api.global/typedserver` 与那里的网页交换其信息。 给您的应用程序的信息 一条自己的通道, 这样他们不会到达 或干扰交通.

这个平台 `BroadcastChannel` 用于任何有(浏览器、工人、节点.js)的地方 [`broadcast-channel`](https://www.npmjs.com/package/broadcast-channel) 包裹代表它.

### 输入的请求

一个打出的请求会到频道上的其他每一个实例;一个有处理器的实例会回答它.

```typescript
import { DeesComms } from '@design.estate/dees-comms';
import type { ITypedRequest } from '@api.global/typedrequest-interfaces';

interface IGreetRequest extends ITypedRequest {
  method: 'greet';
  request: {
    name: string;
  };
  response: {
    reply: string;
  };
}

// in one tab or worker
const answering = new DeesComms({ channelName: 'my-app' });
answering.createTypedHandler<IGreetRequest>('greet', async (request) => {
  return { reply: `Hello ${request.name}, nice to meet you!` };
});

// in another one
const asking = new DeesComms({ channelName: 'my-app' });
const response = await asking.createTypedRequest<IGreetRequest>('greet').fire({ name: 'Alice' });
console.log(response.reply); // 'Hello Alice, nice to meet you!'
```

`postMessage()` 显示按原样输入的请求对象; `typedrouter` 财务报告和审定财务报表 `typedtarget` 这是 `@api.global/typedrequest` 9个路由器 并瞄准实例路线。 处理者用它返回的东西来回答, `false`, (中文(简体) ), `0` 财务报告和审定财务报表 `''` 包含; 一个不返回答案的处理器 `response: null`。 。 。 .

-   频道上的其他每一个实例都听到一个请求,但只有一个有处理器来回答它;其他的则保持沉默. 当有多个实例对此有处理器时,第一个到达的答案是反应,而后面的答案被丢弃.
-   每种方法最多有一个处理者: `createTypedHandler()` 拒绝第二个.
-   发出请求的事例本身不回答,即使它有处理方法.

#### 等着答案

一个请求默认等待30秒的答案. `responseTimeoutMs` 确定每个请求的限值;1至2147483647必须为整毫秒;或 `RangeError`达到极限的请求以 `Error` (单位:千美元)`TypedTarget response timed out after …ms`) (中文(简体) ).

一个请求可以少等待 `timeoutMs`,其呼叫者可以使用 `AbortSignal`数字 :

```typescript
import { DeesComms, TypedRequestTimeoutError } from '@design.estate/dees-comms';

const asking = new DeesComms({ channelName: 'my-app', responseTimeoutMs: 10_000 });
const greet = asking.createTypedRequest<IGreetRequest>('greet');

try {
  await greet.fire({ name: 'Alice' }, { timeoutMs: 1_000 });
} catch (error) {
  if (error instanceof TypedRequestTimeoutError) {
    console.log(`nobody answered within ${error.timeoutMs} ms`);
  }
}

const controller = new AbortController();
const pending = greet.fire({ name: 'Bob' }, { abortSignal: controller.signal });
controller.abort(new Error('the tab is closing'));
await pending.catch((reason) => console.log(reason.message)); // 'the tab is closing'
```

-   自己的请求 `timeoutMs` 终止于它自己期限的较早 和实例 `responseTimeoutMs`,并用 `TypedRequestTimeoutError` (载运) `timeoutMs`当它自己的最后期限到来时.
-   中止的请求立即以信号的理由拒绝 。 已经中止的信号发出的请求从未发出 。 已经处理中止请求的处理器仍然完成;其答案被放弃.

#### 拒绝请求

处理者拒绝请求 扔出 `TypedResponseError`它的呼叫者立即用这个错误来拒绝,并用它 `errorText` 财务报告和审定财务报表 `errorData`,而不是等待它的暂停:

```typescript
import { DeesComms, TypedResponseError } from '@design.estate/dees-comms';

answering.createTypedHandler<IGreetRequest>('greet', async (request) => {
  if (request.name === '') {
    throw new TypedResponseError('name-required', { field: 'name' });
  }
  return { reply: `Hello ${request.name}, nice to meet you!` };
});

try {
  await asking.createTypedRequest<IGreetRequest>('greet').fire({ name: '' });
} catch (error) {
  if (error instanceof TypedResponseError) {
    console.log(error.errorText, error.errorData); // 'name-required' { field: 'name' }
  }
}
```

-   丢出其它错误的处理器 `TypedResponseError` 谁 `errorText` 实值 `Internal server error`;错误本身不旅行.
-   拒绝是一种回答:当几个实例对方法有处理器时,第一个答案胜出,无论是回应还是拒绝. 这种情况不能不把请求留给其他人处理,而是要删除处理者,而不是拒绝.
-   `TypedResponseError` 财务报告和审定财务报表 `TypedRequestTimeoutError` 导出于 `@design.estate/dees-comms` 他们是各阶级的 `@api.global/typedrequest` 它的路线。 使用这些导出 `instanceof`: 依赖另一个版本的应用程序 `@api.global/typedrequest` 存在自己的类别,错误不是实例.

#### 删除处理器

`createTypedHandler()` 解决的手柄 `remove()` 停止处理器 :

```typescript
const handler = await answering.createTypedHandler<IGreetRequest>('greet', async (request) => {
  return { reply: `Hello ${request.name}!` };
});

// later: the requests are left to the other instances
handler.remove();
```

有一次请求是在 `remove()` 被留待其他情况处理, 仿佛这个没有处理器; 一个处理器仍在处理中, 这种方法可以重新使用新的 `createTypedHandler()`调用 `remove()` 又无所事事.

### 类型事件

一个打出的事件会被发送到频道上的其他每一个实例,并且期望没有答案. 被宣布为 `ITypedEvent` 联 合 国 `@api.global/typedrequest-interfaces`页:1 `name` 是合同,它的 `payload` 这是旅行.

```typescript
import { DeesComms } from '@design.estate/dees-comms';
import type { ITypedEvent } from '@api.global/typedrequest-interfaces';

interface ISettingsChangedEvent extends ITypedEvent<{ section: string }> {
  name: 'settingsChanged';
  uniqueEventId: string;
  payload: {
    section: string;
  };
}

// in every tab that has to follow
const listening = new DeesComms({ channelName: 'my-app' });
const subscription = listening.subscribe<ISettingsChangedEvent>('settingsChanged', (payload, event) => {
  console.log(`settings changed in ${payload.section}`, event.uniqueEventId);
});

// in the tab where it happened
const telling = new DeesComms({ channelName: 'my-app' });
await telling.broadcast<ISettingsChangedEvent>('settingsChanged', { section: 'profile' });

// later
subscription.unsubscribe();
```

-   广播某一事件的例子并没有收到;频道上的其他每一个例子都是在同一上下文或另一上下文中收到的.
-   `broadcast()` 给每个事件带来新的 `uniqueEventId`。 。 。 .
-   一个名字的处理者按他们订阅的顺序运行. 投出或拒绝的处理器将报告给 `console.error`,命名事件和出错,但绝不使用有效载荷,也不阻止其他人运行。 一个处理器,如果一个较早的人在同一事件期间不订阅,则不要求这样做.
-   事件和打出的请求分开:一个事件从未到达打出处理器,一个打出的请求也从未到达订阅器,不管它们的名字是什么.
-   以1.0.32为例,它作为打字请求收到的每一条消息;在平台自己的广播频道上, `@api.global/typedrequest` 8个然后是日志 `TypedRouter received a malformed request DTO` 每一个事件。 这也是在您申请的频道播放的原因之一.

### 闭幕

```typescript
await comms.close();
```

一个已关闭的实例一无所获:其订阅结束,而且其输入的处理器已不再被询问. `postMessage()`, (中文(简体) ), `broadcast()` 所请求的,是否认的 `subscribe()` 掷出. 当频道关闭无法接收且在超时结束时, 仍在等待响应的已键入请求; 用其终止此请求 `AbortSignal` 立刻结束 关门没什么用.

在Node.js中,一个实例只让过程活着,而有东西在听,作为一个 `MessagePort` 与信件收听者进行:虽然它有订阅或打入的处理器. 一个没人听的事例,比如那个 `@design.estate/dees-domtools` 导入时打开,让进程结束。 订阅结束, 处理器被删除的例也让它结束, 就像一个关闭的例一样, 所以删除每个输入的处理器, 或者用一个测试或脚本打开的例关闭每个例。 在浏览器和工人中,没有什么变化.

### 什么样的旅行

请求,响应和事件被与结构化克隆算法相复制,因此它们携带数据,而不是函数或类实例. "广播频道"仅限于其来源,但该来源的每个剧本都可以在它知道名字的频道上收听:不发送任何秘密,也没有识别一个人的任何内容.

## 许可证和法律资料

这个寄存器包含根据麻省理工学院许可证许可的开源代码. 许可证副本可以在寄存器许可证文件中找到.

**请注意:** 麻省理工学院许可证不准许使用该项目的商品名、商标、服务标记或产品名称,除非在描述作品来源和复制NOTICE文件内容时需要合理和习惯使用.

### 商标

这个项目由Task Venture Capital GmbH拥有和维护。 与Task Venture Capital GmbH相关的名称和标志以及任何相关的产品或服务是Task Venture Capital GmbH或第三方的商标,不属于本文授予的麻省理工学院许可证的范围.

使用这些商标必须符合Wasure Venture Capital GmbH的商标准则或各自的第三方所有者的准则,任何使用都必须获得书面批准。 此处使用的第三方商标是其各自所有者的财产并仅以描述方式使用,例如用于实施API或类似的.

### 企业信息

任务风险资本股份有限公司  
在德国不来梅地区法院注册的HRB 35230 HB

如欲了解任何法律查询或进一步情况,请通过电子邮件与我们联系 [你好@ task.vc](mailto:hello@task.vc)。 。 。 .

通过使用这个寄存器,你承认你读过这个部分,同意遵守它的条款,并且明白代码的许可并不意味着Task Venture Capital GmbH认可任何衍生作品.

## 常见问题

### @design\.estate/dees-comms 是什么？

一个通信模块,用于实现基于DOM的通讯和浏览器标签和工人之间的同步\.

### 如何安装 @design\.estate/dees-comms？

在项目目录运行 npm install @design\.estate/dees-comms，或使用 pnpm add / yarn add / bun add。

### @design\.estate/dees-comms 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @design\.estate/dees-comms 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @design\.estate/dees-comms 可以商用吗？

@design\.estate/dees-comms 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @design\.estate/dees-comms 的下载量有多少？

根据 npm 官方下载统计，@design\.estate/dees-comms 在 2026/10/12 – 2026/11/10 这 30 天内被下载 7,330 次，日均约 244 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @design\.estate/dees-comms 还在维护吗？

最新版本 2\.1\.0 发布于 2026/10/13（29 天前）；至今共发布 11 个版本，其中过去 12 个月发布了 9 个；首次发布于 2023/08/08。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

