@ 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/typedrequest8个然后是日志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认可任何衍生作品.