@design.estate/dees-comms

中文文档
2.1.0发布于 2026/10/13MITTypeScriptES Module近 30 天下载 7330

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

中文使用文档
文档目录11 节
  1. 问题报告和安全
  2. 安装
  3. 使用量
  4. 频道
  5. 输入的请求
  6. 类型事件
  7. 闭幕
  8. 什么样的旅行
  9. 许可证和法律资料
  10. 商标
  11. 企业信息

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

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

问题报告和安全

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

安装

pnpm add @design.estate/dees-comms

使用量

频道

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

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 包裹代表它.

输入的请求

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

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数字 :

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,而不是等待它的暂停:

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() 停止处理器 :

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 这是旅行.

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 每一个事件。 这也是在您申请的频道播放的原因之一.

闭幕

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。 。 。 .

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

版本与发布记录

@design.estate/dees-comms 共发布 11 个版本,首次发布于 2023/08/08;过去 12 个月发布了 9 个版本。

版本发布日期距今
2.1.0latest2026/10/1329 天前
2.0.02026/10/031 个月前
1.1.22026/10/021 个月前
1.1.12026/09/291 个月前
1.1.02026/09/231 个月前
1.0.322026/08/312 个月前

关于 @design.estate/dees-comms 的常见问题

@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 和提交记录判断。