@blockcast/window-multicast-bridge
浏览器 MESC 多元填充器,可以找到本地的 Blockcast 桥 (Beacon app, an
孤立的Web App或本土的BCDS桥,通过Web Transport与它连接,以及
安装 window.multicast 在页面上.
import { initMulticastBridge } from '@blockcast/window-multicast-bridge';
window.addEventListener('multicast-bridge-ready', () => {
// window.multicast is installed; resolve it with @blockcast/multicast-browser.
});
initMulticastBridge({ autoStart: true });
包船在 dist/数字 :
| 导出 | 文件 | 这是什么 |
|---|---|---|
. | dist/multicast-bridge.js | 发现,即 BCDS-v1 Web Transport客户端,以及 window.multicast |
./bootstrap | dist/bridge-bootstrap.js | 以下描述的页上自带的拖网协调员 |
./beacon-connect | dist/beacon-connect.js | 以下描述的iOS连接灯塔链接 |
来源居住在 src/。浏览器直接加载已建模块和捆绑器
它可以作为一个普通的依赖.
页面拖带协调员
src/bridge-bootstrap.js 是canonial的网页协调员.
createBridgeBootstrap() 拥有发现之上的地层——能力
诊断、临终状态、有限度的发现预算和复苏——同时
initMulticastBridge() 继续拥有发现, BCDS-v1网络运输
握个手 window.multicast 安装。 它从来没有描述媒体和
从来没有嵌入一个玩家.
任何探测前都要报告能力(probeBridgeCapabilities():
网络运输支持、安全环境、每个东道方的混合内容可行性、,
和精细的本地网络访问权限。 一个缺失的能力是
有原因的地位(webtransport-unsupported, (中文(简体) ), insecure-context, (中文(简体) ),
local-network-denied),从不开放探测回路. 年长者
local-network-access 别名保留信息:它报告 denied 打开
Chromium 建在给予两种优异的许可的地方。 掷出
发射途径是遵守同一合同而不是逃避:终止
与 launch-threw,所以一页 带有敌意 window.multicast 访问器
得到一个倒数而不是一个 checking 状态永远无法解决.
每站可以通过触发器而不是定时器恢复:扩展
准备、 本地网络许可更改、 来源批准
(单位:千美元)originApproved()),或桥接变化. 一个桥上的例子
由于原生桥薄荷a
每次运行时启动时的新证书; 明确的描述符 instanceId
当一个人存在时获胜。 复数以 maxDiscoveryAttempts 财务报告和审定财务报表
maxRetries。 。 。 .
transportPolicy 是荣誉,而不是假设。 仅 auto (和 moq-only,哪个
直接跳过桥)报告 fallback: 'moq-quic',返回页面
到它开始的QUIC/MoQ路径. 下 multicast-only 终端状态
不得倒计时:强迫本土/AMT要求沉默地继续
QUIC 读作多播回放 .
浏览器页面范围
发现 . 财务报告和审定财务报表 ./bootstrap )是一个通用浏览器桥,没有本地的交接或app-assexation
合同:通用链接、App链接、AASA/资产链接文件、 /live*
路线,以及 blockcast.network 主机不是桥梁发现的一部分或
授权。 可选 ./beacon-connect 条目( 下) 构建灯塔
通用链接; 发现和授权从未读过 .
initMulticastBridge() 发现本地的 BCDS 桥并可能
安装 window.multicast 在任何浏览器页面上( 包括非 Blockcast)
HTTPS 来源, 移动浏览器页面, 或本地开发页面 ; 它没有
检查页面主机或路径名。 发现使用配置的浏览器
桥的源代码,然后直接连接
网易运输. 玩家可以从任何一页导入并武装桥; /live*
浏览器使用不需要.
证书 pinning 不批准 iOS 背景执行: 当 Beacon 是 同分机桥,暂停灯塔 暂停该桥为浏览器. 一个单独的总是运行的局域网网关 独立于电话应用程序 生命周期.
连接灯塔( iOS)
Safari通过Beacon的Safari扩展找到Beacon的桥. 克罗姆,
Firefox, Edge等iOS浏览器没有扩展名, WebKit 块
一个 HTTPS 页面的回路 /health 探测器,所以发现无法到达灯塔
他们. ./beacon-connect 给任何一页的一图配对链接 :
<a id="beacon-connect" hidden>Connect Beacon</a>
import { initMulticastBridge } from '@blockcast/window-multicast-bridge';
import { offerBeaconConnect } from '@blockcast/window-multicast-bridge/beacon-connect';
offerBeaconConnect(document.getElementById('beacon-connect'));
initMulticastBridge({ autoStart: true });
该提议遵循了桥梁的窗口事件,所以无论谁建造
在此窗口中带有此软件包的控制器( 0. 4. 0 或 后期): 此页面,
createBridgeBootstrap(),或玩家库。 当控制器运行时,每个
过渡 initMulticastBridge()是因为 onStatus 报告也于
window 作为 multicast-bridge-status,与
detail: { phase, ok, reason, fromCache, takeover } 没有终点和针.
phase 实值 discovery, (中文(简体) ), connect, (中文(简体) ), disconnect 或者说 extension· ; ok 设置在
discovery 财务报告和审定财务报表 connect· ; reason (单位:千美元)miss 或者说 lock-busy在发现上
老师 事件没有重播, 所以在控制器前创建要约
启动, 或种子 offer.onStatus 自己(同样需要)
createBridgeBootstrap()自己的状态, 没有发送 。 链接
显示在发现丢失或连接失败上,所以一个页面已经
配对时从不闪出,而一发一发又能提供. 现予撤回
multicast-bridge-ready。 。 。 .
它只在iOS上提供,超过HTTPS,在顶级页面中提供. 水龙头去
https://www.blockcast.network/beacon/connect,或改为
https://blockcast.network/beacon/connect 从页面上 www。 。 。 . return=
chrome, Firefox 或 Edge; 所有其他 iOS 浏览器, 和一个 iPad 浏览器
请求桌面站点而无需其产品代号,则返回到 Safari .
to= 指定页面名称,不附带证书或搜索发现字段
逃到RFC 3986, 正如Beacon描述的。 灯塔开通了桥 重新开放
在浏览器的页面 与桥的针 在碎片.
initMulticastBridge() 保持针作为配对,所以以后的访问连接
灯塔桥开通时没有水龙头;一个不再连接的接针
再次提供链接。 灯塔使用自己的原产地 to。 。 。 .
iOS 打开灯塔只用于在用户自带时的导航
在顶级框中处理到顶级页面以外的主机.
让控制保持一个真正的链接;帮助者在水龙头内部重建其螺旋. 这个
帮助显示并隐藏它 hidden,所以不要给它 display 规则
没有匹配 [hidden] { display: none }。当iOS不交出水龙头时
到灯塔(Beacon未安装,或私人标签,其中Chrome和Firefox)
它不会从链接中打开应用程序,而是在该地址打开网页.
beaconConnectUrl() 返回自成一体的页面的赤壁
控制系统.
发现边界
当一个信任的呼叫者提供已知的主机名和证书针时,浏览器
直接连接; 不获取 /health 或者说 /certificate.sha256数字 :
https://player.example/watch?mc_bridge=beacon.local&wt_port=33445&fingerprint=<64-hex-SHA256>
监督办必须解决实际广告问题 .local 主机名; 一个 DNS- SD 服务
实例名称本身不是主机名称。 针是全叶的SHA-256
证书 DER, 通过认证的信道提供, 而不是从
HTTP或未签名的Bonjour TXT唱片. 明确的针绕过发现缓存
并拯救了门户。 错误的,过期的,或者变形的指针不能关闭. 一个已知
主机名不建立初始 pin 信任, 而服务器 pin 不建立
取代桥的原产地接纳政策.
双方出席 mc_bridge 财务报告和审定财务报表 fingerprint (或 fp)选择此严格
路径,即使一个值是空的。 空或错构值为配置
错误, 不允许发现另一个网关; 删除参数到
请求普通的发现。 一个赤裸的 fingerprint 无 mc_bridge 没有
桥梁配置.
HTTPS 页面上一个明确的回回回接被直接拨出并保留 根据浏览器本地网络权限。 永远无法改变 保存 AutotLS 网关以绕过此策略 .
网络运输封存证书有效期不得超过14天. 这个 本地桥目前每次运行时都会发出新证书,所以 呼叫者必须在重启或旋转后提供当前指针。 这个直接 路径不添加 pin-distribution 服务或手动证书 UI.
普通 HTTPS JavaScript 无法列举 DNS- SD/ mDNS 服务或发行
DNS-SD/mDNS查询. 没有明确的钉子配置, 发现探测的原生
桥的回转 /health 终点( e)localhost 或者说 127.0.0.1· ; localhost
也覆盖一条连接到 ::1, (中文(简体) ),
验证BCDS-v1能力并完成SHA-256证书指纹,
然后打开一个直接的Web Transport(QUIC)连接
指纹.
这个 HTTP 靴子陷阱依赖于浏览器政策, 并且被 Safari 屏蔽在
HTTPS页面;它不是一个通用的移动发现机制.
局域网发现是一个单独的平台能力. 已安装的 IWA, 浏览器
扩展,或本地平台代理可以使用其平台 DNS-SD 堆栈
发现 _multicast-bridge._udp.local. 并提供一个配置的混凝土
浏览器的私人端点 。 常规页面没有列出
服务本身。 桥仍然只有桥:它携带多播字节到
window.multicast,而浏览器拥有演示文稿分辨率和媒体
翻译.
批发包packets 活动)
此桥返回的字节订阅也发出 packets: 每一个
将读取器装入一个发送批次解码,按到达顺序排列
冷冻阵列。 每一个元素都是一样的 bytes 事件会
携带(a) ArrayBuffer,或 { data, receiveTime, receiveTimeOrigin?, receiveTimestampSource } 当框架有计时元数据时)。 批次结束
读取器同步运行已经结束——在其现有的出产点,
或者在Web Transport的结尾读到,所以没有包在计时器和
批次没有添加自身大小常数.
packets 是提供者扩展名,而非被冻结 v1 的一部分
window.multicast 合同。 在使用和听完之前先发现它
两个表面之一:
if (subscription.eventTypes?.includes('packets')) {
subscription.addEventListener('packets', (event) => {
for (const packet of event.detail) consume(packet);
});
} else {
subscription.addEventListener('bytes', (event) => consume(event.detail));
}
订阅只构建一些听众要求的事件,所以
packets- 只有消费者从来不为每件DOM事件付费(计量) dispatchEvent + 键 CustomEvent 每条主线约22毫秒
第二组在Kirin 659上为~450包/秒. bench/packet-dispatch.mjs 驱动
真实读取器为真实的订阅并报告 DOM 事件和 CPU 时间
两个表层的包.
宣布交货subscription.delivery(中文(简体) )
一个字节订阅报告其数据包是如何到达该页面的,作为桥梁
服务器 已经申报了 subscribe_response数字 :
'ordered-relay': 每一个包都穿行订阅器的一个可靠的BCDS 按套接字读取顺序排列的单流 。 服务器可能降下最老的队列 包在溢出但从不重排,所以页面看到一个子序列 套接字的接收订单.native-bcds-bridge(iOS灯塔桥) 宣布 此; 它没有发送数据格网媒体 .'datagram',或undefined当服务器没有声明时:否 命令承诺.
@blockcast/mmt-transport是因为 MulticastTransport 读一次每个加入和,因为
'ordered-relay',已经 FECManager 按流序决定 FEC 块归宿
代替数据克不活动截止日期:中继暂停不会丢失
资料。 在最后期限之后,50-200 ms在溪流上停放失败了~7%-9%
iPhone Safari上的块,电线损失只有~0.2%。 客户
将声明通过并永不推断; 服务器也可以
将 WT 数据显示为订阅(例如,国际水协会服务人员)
已启用数据映射介质) 不得声明 'ordered-relay'。该值为
用于页面订阅寿命的固定; 宣告的重联重播
不同的记录,没有应用.
建筑和测试
npm --prefix packages/window-multicast-bridge install --include=dev
npm --prefix packages/window-multicast-bridge run build # src/ -> minified dist/
npm --prefix packages/window-multicast-bridge test
npm --prefix packages/window-multicast-bridge run test:dist # same suite on the minified dist/
test/vectors/ 拥有跨语言合同载体 本土桥梁
对(或packet-id-allow-list-v1.json, (中文(简体) ), bridge-enrollment-v1.json) (中文(简体) ).
与桥梁服务器同步修改; test/vectors.test.mjs 钉住他们
文摘,所以要更改,也要更新接针.
释放
桥版独立于合同 和适配器,所以它骑
自己的标签: 推 window-multicast-bridge-v<version>匹配 version 内
这个 package.jsonCI 建立,测试和包装,检查标签与
包装版本,并通过 npm 信任的出版以出处出版.
第一次公布这个名字需要一次性的靴子
../multicast-contract/docs/RELEASE.md。 。 。 .