@blockcast/multicast-contract
冰冻的V1 window.multicast 合同,其只读状态表面,以及
可执行兼容套件.
零运行时间依赖,故意. 此软件包是导入的汇
DAG,它阻止了 犬科全球宣言被拉入
一个包循环。 在此增加一个依赖性,特别是: @blockcast/shared 或者说
@blockcast/transport —— 重新创建此软件包存在的循环以打破和
将未发布的软件包拖入公共表面。 CI声称依赖性
设置保持为空.
一页看
import type { MulticastGateway, Subscription } from '@blockcast/multicast-contract';
// Feature-detect the GLOBAL, never its methods. The global is genuinely absent
// when no provider is installed; every member is required once it exists.
if (!window.multicast) throw new Error('no multicast provider installed');
const subscription = await window.multicast.subscribe({
group: '232.0.0.99', // IPv4 (IGMPv3) or IPv6 (MLDv2) literal
port: 9876,
source: '198.51.100.1', // omit for any-source multicast
consume: 'bytes',
});
subscription.addEventListener('bytes', (event) => {
// event.detail is an ArrayBuffer, always.
decode(event.detail);
});
subscription.addEventListener('transportchange', (event) => {
// 'native' | 'amt' — fires on every resolution, including failover.
reportLeg(event.detail);
});
await subscription.unsubscribe();
有五样东西会咬你
- 比较错误代码, 永远不要
instanceof。 。 。 . 提供人跳是 JSON系列化,没有结构化克隆,所以Error子类丢失 中转中原型链. 使用multicastErrorCodeOf(err)。 。 。 . not-ready继续其事业err.readiness代码里没有. 那边 是一个not-ready成员,不是每个原因一个:十向原因生活在Readiness记录err.readiness.code),这是相同的词汇evaluateReadiness返回。 因此,"不允许"读作err.code === 'not-ready' && err.readiness?.code === 'network-permission-denied', (中文(简体) ), 故意与network-permission-required- 那个 首先需要用户推翻拒绝,第二需要一个提示 尚未显示 .err.readiness实值undefined提供商预定时间 此字段; 这意味着 不详永远 准备说明origin-not-trusted是一个单独的拒绝(页面来源,而不是OS本地网络访问),并且是 完全没有准备的密码.- 随函附上
bytes听者迅速. 最多EARLY_BYTES_RETENTION_LIMIT(128) 在第一个有效载荷之前保留 随从听受. 溢出时 整个 前缀被删除——故意, 因为重放一个部分前缀,然后恢复现场发送会 编织出一条跨越真正不连续的无间隙流. origin要求每个非成员参加. 一个装入的配置relay编号 :relayPort但是没有origin: 'amt'匹配遗留的 IP 多播 换成成员。 TypeScript 拒绝; plain JavaScript 默地倒回 本土多播并忽略了接力.- 一个可选的能力字段,即
undefined表示 不详没有 无。 。 。 . 提供者先于地. 将缺席视为"无" 禁用实际有效的运输工具.
准备情况
evaluateReadiness 纯粹是呼叫者提供观测的功能。 这个
报告; 它从不提示、 给予或打开窗口
关于已部署的系统,一个网关呼叫自动打开 a
供应商窗口,所以一个自我测试的准备状态 API会弹出一个窗口仅用于
被问到一个问题.
import { evaluateReadiness } from '@blockcast/multicast-contract';
const readiness = evaluateReadiness(observation);
if (!readiness.ready) console.warn(readiness.code, readiness.detail);
3个区分,结果类型分开,每个区分都向 崩溃时错误修正 :
provider-unobservable对provider-absent- 供应商检测是一种 火和遗忘探测器,没有内置的超时,所以在最后期限之前 相克相克,沉默不是判决.udp-bind-unverified对udp-bind-failed——提供方只尝试绑定 一旦两个许可,所以udpBind是三态和null表示 未尝试。 。 。 .network-permission-required对network-permission-denied- 一个unsupported权限名称不是拒绝。 铬为它取名 不执行,本地网络名称在不同的 拼写.
iwa-not-installed 财务报告和审定财务报表 iwa-extension-disconnected 门 扩展
仅指地形键入 extensionResponded === true。两个现场提供者
不对称:扩展安装 window.multicast 时间 document_start
对IWA一无所知 然后通过IWA接通所有电话
global 的存在证明什么也没有; 桥式多填充安装 global
只有在连接之后, 所以存在已经意味着一个活桥和它
绝对不会说扩展。 测量两个地貌 将报告一个
健康的多填充后页为断开.
权威授权名称是 local-network 财务报告和审定财务报表 loopback-network。 。 。 .
年长者 local-network-access 别名报告 denied 健康系统
仅提供信息;以 describeLegacyPermissionAlias。 。 。 .
位置是可选的和外部订阅语义的. evaluateReadiness
从来没有咨询过它,和 runConformanceSuite 在每次跑道上标出分隔线
通过驱动独立 location-outside-readiness-suite 检查,哪个
扫描每个备战代码一个观察.
遵约
import { runConformanceSuite } from '@blockcast/multicast-contract/conformance';
const report = await runConformanceSuite(driver);
if (!report.conformant) console.error(report.checks.filter((c) => c.status !== 'pass'));
对照一个 ConformanceDriver,不反对浏览器,所以一个
“符合者”的定义涵盖浏览器提供者、参考假名和
iOS/Android适配器. 忽略可选控制钩的驱动程序使
需要它报告的检查 skipped - 和 跳过检查从不通过数字 :
report.conformant 虚伪而无所观察.
FakeMulticastProvider 是一个符合参考标准的模拟提供者。 用这个
而不是手卷另一个 window.multicast stub; 它可以调用字节
通过与真正的运输相同的基数64跳, 所以消费者测试通过
反之亦能活过序列边界.
import { runConformanceSuite } from '@blockcast/multicast-contract/conformance';
import { FakeMulticastProvider } from '@blockcast/multicast-contract/fake-gateway';
const report = await runConformanceSuite(new FakeMulticastProvider());
图标
npm run typecheck # tsc --noEmit
npm test # node --test, no install of anything beyond typescript
npm run build # emits dist/ with declarations
正在同时安装 @blockcast/mmt-transport
@blockcast/mmt-transport 自有船只 declare global 块
Window.multicast键入 WindowMulticastGateway此软件包已声明
相同的全球范围 MulticastGateway - 唯一能说明问题的宣言 两者在
一个TypeScript程序是宣告-相接冲突.
对照 @blockcast/mmt-transport 0.2.0、0.2.1和0.2.2(每个稳定
在TypeScript 5.9.3上发布至今):
| 您的代码 | skipLibCheck: false | skipLibCheck: true |
|---|---|---|
读取 window.multicast; 此软件包首先导入 | TS2717 | 干净 |
读取 window.multicast· ; mmt-transport 首次导入 | TS2717 + 键 TS2322 | TS2322,在自己的文件中 |
从不命名全局——使用 getGateway() | TS2717 | 干净 |
二事随顺.
TS2717 在安装两个软件包时是不可避免的. 据报
在一个依赖的 .d.ts和平常一样 skipLibCheck: true 压制之.
它不影响发射.
TS2322 是可避免的,而且不依赖进口订单来避免. 哪个
声明胜出 合并由整个模块加载顺序决定
程序,不是通过一个文件的导入列表,所以今天干净的构建可以中断
当添加一个无关的文件时。 相反,从不命名全局类型:使用
getGateway() 编号 : hasGateway() 从 @blockcast/multicast-browser,哪个
返回时 MulticastGateway | null。 。 。 .
import { getGateway } from '@blockcast/multicast-browser';
const gateway = getGateway(); // MulticastGateway | null
if (gateway) await gateway.subscribe(config);
没有 @blockcast/* 软件包取决于 mmt-transport因此它到达了你的树
只有你自己安装它——没有过渡路径.