标签: whatwg-streams-api

使用ReadableStream作为请求主体获取

我试图用一个ReadableStream.在这个例子中,ReadableStream应该无限期地重复"Some data ...".

fetch('/', {
  method: 'POST', 
  body: new ReadableStream({
    pull: function(controller) {
      console.log('pull called!');
      controller.enqueue('Some data...');
    }
  })
});
Run Code Online (Sandbox Code Playgroud)

这不起作用.而pull被执行一次,没有数据被请求体中的发送.

POST / HTTP/1.1
Host: example.com
Connection: keep-alive
Content-Length: 0
Origin: https://example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Accept: */*
Referer: https://example.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8
Run Code Online (Sandbox Code Playgroud)

如何使用fetch可用的ReadableStream(或任何我可以编写动态数据的流)?

或者,如果这还不可能,请您说明一下吗?谢谢.

注意:这是一个更具体的衍生问题: 通过HTTP将数据从浏览器传输到服务器的方法

stream fetch fetch-api whatwg-streams-api

15
推荐指数
1
解决办法
3330
查看次数

如何使用fetch()和WhatWG流来获取文件上载进度

注意:我不是在寻找任何替代方案.我知道这可以通过XMLHttpRequest来完成.我也不关心浏览器支持.我只想了解新的/即将推出的标准.

我有一个  File对象,我可以使用像这样的fetch上传它:

fetch(url, {
    method: "PUT",
    body: fileObject,
});
Run Code Online (Sandbox Code Playgroud)

如何从中获取上传进度?

据我所知body,fetch选项可以是ReadableStream.那么也许有一种方法可以将File对象包装到ReadableStream并从中获取进度状态?

例如.这样的事情

fetch(url, {
    method: "PUT",
    body: asReadableStream(fileObject, onProgress),
});
Run Code Online (Sandbox Code Playgroud)

谢谢.

javascript fetch-api whatwg-streams-api

11
推荐指数
1
解决办法
1788
查看次数

Chrome:播放正在通过 fetch/XHR 下载的视频

我想要实现的是让 Chrome 将视频文件作为数据加载(通过 Fetch API、XHR 等),并<video>在它仍在下载时使用它来播放它,而无需对同一 URL 发出两个单独的请求,也无需等到文件已完全下载。

ReadableStream从 Fetch API ( response.body)获取 a 很容易,但我找不到将它提供给video元素的方法。我发现我需要一个blobURL,它可以使用MediaSource对象创建。但是,该SourceBuffer#appendStream方法听起来正是所需要的,但并未在 Chrome 中实现,因此我无法将流直接连接到MediaSource对象。

我可能可以分块读取流,从中创建Uint8Arrays 并使用SourceBuffer#appendBuffer,但这意味着除非块大小非常小,否则播放不会立即开始。此外,感觉就像手动做一些所有这些 API 应该能够立即完成的事情。如果没有其他解决方案,而我走这条路,我应该期待什么警告?

是否有其他方法可以为 a 创建 blob URL ReadableStream?或者有没有办法提出fetch<video>分享请求?有很多新的 API,我很容易错过一些东西。

javascript html5-video media-source fetch-api whatwg-streams-api

7
推荐指数
1
解决办法
2288
查看次数

使用 Web Streams,从多个 TransformStream 创建一个 TransformStream

是否可以使用 Whatwg Streams(Web Streams API )从其他几个 TransformStream 中创建一个TransformStream

例如,如果我有两个按顺序运行的 TransformStream,如transformer1transformer2

readable.pipeThrough(transformer1).pipeThrough(transformer2).pipeTo(writable)
Run Code Online (Sandbox Code Playgroud)

最终,我希望能够将其转换为

readable.pipeThrough(allTransformers).pipeTo(writable)
Run Code Online (Sandbox Code Playgroud)

allTransformersTransformStream 组合transformer1和 的位置在哪里transformer2

下面不是真正的功能代码,但我认为有一种方法可以做到这样的事情:

const allTransformers = transformer1.pipeThrough(transformer2)
Run Code Online (Sandbox Code Playgroud)

这显然是一个简化的示例,但您可以想象有许多转换流,我想重构为单个可重用的转换管道。

javascript whatwg-streams-api

5
推荐指数
1
解决办法
787
查看次数

将客户端生成的响应作为下载进行流式传输,无需 Service Worker

假设我有一个在客户端生成的大文件,我希望允许用户将其保存到他们的硬盘驱动器上。

通常的方法是创建一个 Blob,然后为其创建一个对象 URL:

const blob = new Blob([chunks], {type: 'application/example'});
linkEl.href = URL.createObjectUrl(blob);
Run Code Online (Sandbox Code Playgroud)

这是可行的,但效率不高,因为它会很快耗尽所有可用内存,因为生成的文件必须保留在内存中。

更好的方法是启用流式传输。像这样的东西:

const outputStream = new WritableStream();
linkEl.href = URL.createObjectUrl(outputStream);
while (let chunk = await getChunk()) {
  outputStream.write();
}
outputStream.end();
Run Code Online (Sandbox Code Playgroud)

今天有直接的方法吗?

我见过的像这样的流式传输的唯一方法是使用 Service Worker。不幸的是,在许多情况下 Service Worker 不可用。隐私模式可能会绕过所有服务工作线程。硬刷新页面会禁用它们。打开浏览器工具可以重置 Service Worker 状态。工作人员随时可能被杀死,并且尝试通过消息传递使其保持活动状态并不能保证有效。所有这些黑客都已在此处的一个优秀项目中实现: https://github.com/jimmywarting/StreamSaver.js 但是,归根结底,由于这些浏览器限制,它是不可靠的。

是否存在适当的 API 可以在不使用 Service Worker 的情况下流式传输“下载”客户端?

html javascript whatwg-streams-api

4
推荐指数
1
解决办法
2276
查看次数

Streams API:可以撤消 .pipeTo() 吗?

Streams APIReadableStream提供了一种通过管道将 a 传送到WritableStreamusing的巧妙方法readableStream.pipeTo(writableStream)。这似乎比获取readableStream.getReader()并手动将其粘合到writableStream.getWriter()或直接粘合到底层功能更方便。

\n

我有一个用例,其中向我提供了一个ReadableStream对象,该对象最终可能需要“消失”并被新ReadableStream对象替换。最好使用单个自定义WritableStream来包装这些对象所连接的功能,ReadableStream并根据需要将它们通过管道连接在一起,但还没有找到如何“撤消”管道过程。

\n

问:是否可以“撤消”/“中断”/“拆卸”使用 创建的管道.pipeTo(),或者管道是否“永久”且不适合此用例?

\n

使用Serial API 的示例,我希望能够调用doConnectPort()然后doDisconnectPort()重复:

\n
var customWritable = new WritableStream(\xe2\x80\xa6);\nvar port;\n\nasync function doConnectPort() {\n  port = await navigator.serial.requestPort();\n  await port.open({ baudrate: \xe2\x80\xa6});\n  await port.readable.pipeTo(customWritable);\n}\n\nasync function doDisconnectPort() {\n  // What to do here? Can\'t close the port yet\xe2\x80\x94port.readable is still locked!\n  await port.close();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

目前,我手动将东西粘合在一起,并在需要断开端口时进行清理:

\n
var …
Run Code Online (Sandbox Code Playgroud)

javascript serial-port whatwg-streams-api

2
推荐指数
1
解决办法
1063
查看次数

如何在 Javascript 中将两个 ReadableStreams 通过管道传输到一个 WritableStream 中?

我有两个 ReadableStream,我想将它们通过管道传输到一个 WritableStream,其中通过 ReadableStream 的任何数据都会立即直接进入 WritableStream。

我可以做相反的事情,通过使用ReadableStream.prototype.tee()将一个 ReadableStream 一分为二,但我不知道如何将两个合并为一个。

const textarea = document.querySelector("textarea");


// This is a ReadableStream which says "Mom! " every 1 second.
const momReadableStream = new ReadableStream({ start: controller => {
  const sayMom = () => controller.enqueue("Mom! ");
  setInterval(sayMom, 1000);
}});

// This is a ReadableStream which says "Lois! " every 0.7 seconds.
const loisReadableStream = new ReadableStream({ start: controller => {
  const sayLois = () => controller.enqueue("Lois! ");
  setInterval(sayLois, 700);
}});

// …
Run Code Online (Sandbox Code Playgroud)

javascript pipeline tee whatwg-streams-api

2
推荐指数
1
解决办法
560
查看次数