获取事件源
这个软件包提供了更好的 API 用于制作 源请求 - 也称为服务器发送事件 - 包含所有可用的特性 获取 API。 。 。 .
这个 默认浏览器事件源代码 API 对允许你提出的请求的类型实施若干限制: 只有参数 你被允许通过是 url 财务报告和审定财务报表 withCredentials,因此:
- 您不能在请求正文中通过 : 您必须在 URL 内编码执行请求所需的所有信息, 即 限于2000个字符 在大多数浏览器中.
- 您无法通过自定义请求头
- 您只能请求获取 - 无法指定其它方法 .
- 如果连接被切断,你对重试策略没有任何控制:浏览器会默默地为您重试几次,然后停下来,这不足以用于任何类型的强力应用.
这个库为消费服务器发送事件提供了一个替代界面,基于Frief API. 它完全兼容 事件流格式,所以如果你已经有一个服务器 发布这些事件,你可以像以前一样消耗它。 然而,你们现在对请求和答复有更大的控制权,因此:
- 您可以使用任何请求方法/ 标题/ body, 加上所有通过获取而暴露的其他功能 () 。 如果默认的浏览器执行对您无效, 您甚至可以提供替代抓取执行 .
- 如果您想要在解析事件源之前做一些自定义验证/处理, 您可以访问响应对象 。 如果您在应用程序服务器前有 API 网关( 如 nginx) , 此功能将会有用 : 如果网关返回错误, 您可能想要正确处理它 .
- 如果连接被剪切或出错, 您将完全控制重试策略 .
此外,这个库还插入了浏览器的 页面可见度 API 因此,如果文档被隐藏(例如,用户将窗口最小化),连接就会关闭,当最后一个事件ID再次被可见时会自动重试。 这可以减少服务器上的负载, 因为它没有不必要地打开连接( 但是如果需要, 您可以选择退出此行为 )
安装
npm install @microsoft/fetch-event-source
使用量
// BEFORE:
const sse = new EventSource('/api/sse');
sse.onmessage = (ev) => {
console.log(ev.data);
};
// AFTER:
import { fetchEventSource } from '@microsoft/fetch-event-source';
await fetchEventSource('/api/sse', {
onmessage(ev) {
console.log(ev.data);
}
});
你可以通过所有的 其他参数 默认获取 API 时曝光, 例如 :
const ctrl = new AbortController();
fetchEventSource('/api/sse', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
foo: 'bar'
}),
signal: ctrl.signal,
});
您可以添加更好的错误处理, 例如 :
class RetriableError extends Error { }
class FatalError extends Error { }
fetchEventSource('/api/sse', {
async onopen(response) {
if (response.ok && response.headers.get('content-type') === EventStreamContentType) {
return; // everything's good
} else if (response.status >= 400 && response.status < 500 && response.status !== 429) {
// client-side errors are usually non-retriable:
throw new FatalError();
} else {
throw new RetriableError();
}
},
onmessage(msg) {
// if the server emits an error message, throw an exception
// so it gets handled by the onerror callback below:
if (msg.event === 'FatalError') {
throw new FatalError(msg.data);
}
},
onclose() {
// if the server closes the connection unexpectedly, retry:
throw new RetriableError();
},
onerror(err) {
if (err instanceof FatalError) {
throw err; // rethrow to stop the operation
} else {
// do nothing to automatically retry. You can also
// return a specific retry interval here.
}
}
});
兼容性
这个库以打字符来写作,目标为ES2017特性,得到所有常绿浏览器(Chrome,Firefox,Safari,Edge)的支持. 你也许需要 多填充文本解析器 用于旧边缘(版本 < 79),但:
require('fast-text-encoding');
捐款
该项目欢迎各方的贡献和建议。 大多数捐款要求您同意 撰稿人许可协议(CLA)宣布,你有权并且实际上确实给了我们 有权使用您的贡献。 详情请访问 https://cla.opensource.microsoft.com 互联网档案馆的存檔,存档日期2014-10-02。 。 。 .
当您提交拉拉请求时, CLA bot 会自动确定您是否需要提供 a CLA并适当装饰PR(如状态检查、评论)。 只要听从指示 由机器人提供。 你只需要用我们的CLA 一次就能完成.
该项目通过了 Microsoft 开源行为守则。 。 。 . 更多信息见 《行为守则》 或者说 联系人 打开码@ microsoft.com 并附上任何其他问题或评论.