{"id":335411,"date":"2022-07-07T15:00:42","date_gmt":"2022-07-07T15:00:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=335411"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=335411","title":{"rendered":"<span>Node.js: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0427\u0430\u0441\u0442\u044c 1<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/4-\/hn\/8w\/4-hn8wkkaeafijehpfybkgcounq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/4-\/hn\/8w\/4-hn8wkkaeafijehpfybkgcounq.png\"\/>  <\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 <a href=\"https:\/\/2ality.com\/2022\/06\/web-streams-nodejs.html\">\u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u0438 (web streams) \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (streams), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0432\u0435\u0431-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c\u0438: \u0432\u0435\u0431-\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u043c\u0438, <a href=\"https:\/\/nodejs.org\/\">Node.js<\/a> \u0438 <a href=\"https:\/\/deno.land\/\">Deno<\/a>. \u041f\u043e\u0442\u043e\u043a\u0438 \u2014 \u044d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u2014 \u0444\u0430\u0439\u043b\u043e\u0432, \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0438 \u0442.\u0434.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/API\/Fetch_API\/Using_Fetch\">fetch<\/a> (\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u043d\u043b\u0430\u0439\u043d-\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432) \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 (<code>Response<\/code>), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>body<\/code> \u0441 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u0438 \u0432 <code>Node.js<\/code>, \u043d\u043e \u0442\u043e, \u043e \u0447\u0435\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e \u043a \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u0439 \u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"soderzhanie\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"#1-%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-%D0%B2%D0%B5%D0%B1-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA\">1. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a?<\/a><br \/> \n<ul>\n<li><a href=\"#11-%D0%B2%D0%B8%D0%B4%D1%8B-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%B2\">1.1. \u0412\u0438\u0434\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432<\/a><\/li>\n<li><a href=\"#12-%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D0%B9%D0%B5%D1%80\">1.2. \u041a\u043e\u043d\u0432\u0435\u0439\u0435\u0440<\/a><\/li>\n<li><a href=\"#13-%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2%D0%BE%D0%B4%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\">1.3. \u041f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/a><\/li>\n<li><a href=\"#14-%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B0-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%B2-%D0%B2-nodejs\">1.4. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 Node.js<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#2-%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D0%B7-rs\">2. \u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 RS<\/a><br \/> \n<ul>\n<li><a href=\"#21-%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-rs-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-readers\">2.1. \u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 RS \u0447\u0435\u0440\u0435\u0437 Readers<\/a><\/li>\n<li><a href=\"#211-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-rs\">2.1.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 RS<\/a><\/li>\n<li><a href=\"#212-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8-%D0%B8%D0%B7-%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B3%D0%BE-rs\">2.1.2. \u041f\u0440\u0438\u043c\u0435\u0440: \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e RS<\/a><\/li>\n<li><a href=\"#22-%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-rs-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%D0%B0\">2.2. \u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 RS \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430<\/a><\/li>\n<li><a href=\"#221-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%D0%B0-%D0%B4%D0%BB%D1%8F-%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0\">2.2.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430<\/a><\/li>\n<li><a href=\"#222-%D0%B2-%D0%BD%D0%B0%D1%81%D1%82%D0%BE%D1%8F%D1%89%D0%B5%D0%B5-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F-%D0%B1%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80%D1%8B-%D0%BD%D0%B5-%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D1%8E%D1%82-%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80-rs\">2.2.2. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 RS<\/a><\/li>\n<li><a href=\"#23-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D0%B9%D0%B5%D1%80%D0%B0\">2.3. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#3-%D0%BF%D1%80%D0%B5%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-rs-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D1%83%D0%BF%D0%B0%D0%BA%D0%BE%D0%B2%D0%BA%D0%B8\">3. \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 RS \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438<\/a><br \/> \n<ul>\n<li><a href=\"#31-%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8-%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B0\">3.1. \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430<\/a><\/li>\n<li><a href=\"#32-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-rs-%D0%B4%D0%BB%D1%8F-%D0%BE%D0%B1%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-push--%D0%B8%D0%BB%D0%B8-pull-%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B0\">3.2. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 RS \u0434\u043b\u044f \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f push- \u0438\u043b\u0438 pull-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430<\/a><\/li>\n<li><a href=\"#321-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-rs-%D0%B8%D0%B7-push-%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B0-%D1%81-%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%BE%D0%B9-%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2%D0%BE%D0%B4%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F\">3.2.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 RS \u0438\u0437 push-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/a><\/li>\n<li><a href=\"#322-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-rs-%D0%B8%D0%B7-pull-%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B0\">3.2.2. \u041f\u0440\u0438\u043c\u0435\u0440: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 RS \u0438\u0437 pull-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#4-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B2-ws\">4. \u0417\u0430\u043f\u0438\u0441\u044c \u0432 WS<\/a><br \/> \n<ul>\n<li><a href=\"#41-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B2-ws-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-writers\">4.1. \u0417\u0430\u043f\u0438\u0441\u044c \u0432 WS \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Writers<\/a><\/li>\n<li><a href=\"#411-%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4-1-%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-write-%D0%BD%D0%B5%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2%D0%BE%D0%B4%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F\">4.1.1. \u041f\u043e\u0434\u0445\u043e\u0434 1: \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 write() (\u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f)<\/a><\/li>\n<li><a href=\"#412-%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4-2-%D0%B8%D0%B3%D0%BD%D0%BE%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BE%D1%82%D0%BA%D0%BB%D0%BE%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-write-%D0%B8%D0%B3%D0%BD%D0%BE%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2%D0%BE%D0%B4%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F\">4.1.2. \u041f\u043e\u0434\u0445\u043e\u0434 2: \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f write() (\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f)<\/a><\/li>\n<li><a href=\"#413-%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4-3-%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-ready-%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2%D0%BE%D0%B4%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F\">4.1.3. \u041f\u043e\u0434\u0445\u043e\u0434 3: \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 ready (\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f)<\/a><\/li>\n<li><a href=\"#414-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-writer\">4.1.4. \u041f\u0440\u0438\u043c\u0435\u0440: \u0437\u0430\u043f\u0438\u0441\u044c \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Writer<\/a><\/li>\n<li><a href=\"#42-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA-ws\">4.2. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a WS<\/a><\/li>\n<li><a href=\"#421-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%B8%D1%82-%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%BE\">4.2.1. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e<\/a><\/li>\n<li><a href=\"#422-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA-ws-%D0%B4%D0%BB%D1%8F-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0\">4.2.2. \u041f\u0440\u0438\u043c\u0435\u0440: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a WS \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430<\/a><\/li>\n<li><a href=\"#423-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B4%D0%B2%D1%83%D1%85-rs-%D0%B2-%D0%BE%D0%B4%D0%B8%D0%BD-ws\">4.2.3. \u041f\u0440\u0438\u043c\u0435\u0440: \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0432\u0443\u0445 RS \u0432 \u043e\u0434\u0438\u043d WS<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"1-chto-takoe-veb-potok\">1. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a?<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0442\u043e\u043a \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (data structure) \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0442\u0430\u043a\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u043a\u0430\u043a:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0444\u0430\u0439\u043b\u044b;<\/li>\n<li>\u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435;<\/li>\n<li>\u0438 \u0442.\u0434.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0414\u0432\u0443\u043c\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442 \u0438\u0445 \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 (\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 &#171;\u0447\u0430\u043d\u043a\u0430\u043c\u0438&#187;\/chunks), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0437\u0430 \u0440\u0430\u0437;<\/li>\n<li>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u0438 (&#171;\u0432\u0435\u0431&#187; \u0447\u0430\u0441\u0442\u043e \u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f) \u2014 \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u043c\u0438, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 <code>Node.js<\/code> \u0438 <code>Deno<\/code>, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Streams_API#browser_compatibility\">\u044d\u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0427\u0430\u043d\u043a\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 2 \u0432\u0438\u0434\u043e\u0432:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 (text streams): \u0441\u0442\u0440\u043e\u043a\u0438;<\/li>\n<li>\u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 (\u043f\u043e\u0442\u043e\u043a\u0438 \u0431\u0430\u0439\u0442\u043e\u0432) (binary streams): <a href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Uint8Array\">Uint8Array<\/a> (\u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c <a href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/TypedArray\">TypedArray<\/a> (\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432)).<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"11-vidy-potokov\">1.1. \u0412\u0438\u0434\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 3 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0438\u0434\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>RS<\/code> (\u043f\u043e\u0442\u043e\u043a \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f) (\u0434\u0430\u043b\u0435\u0435 \u2014 <code>RS<\/code>) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 (source). \u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u043c (consumer);<\/li>\n<li><code>WS<\/code> (\u043f\u043e\u0442\u043e\u043a \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438) (\u0434\u0430\u043b\u0435\u0435 \u2014 <code>WS<\/code>) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a (sink). \u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c (producer);<\/li>\n<li><code>TS<\/code> (\u043f\u043e\u0442\u043e\u043a \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f) (\u0434\u0430\u043b\u0435\u0435 \u2014 <code>TS<\/code>) \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 2 \u043f\u043e\u0442\u043e\u043a\u043e\u0432:<br \/> \n<ul>\n<li>\u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b (\u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438) (writable side), <code>WS<\/code>;<\/li>\n<li>\u043e\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 (\u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f) (readable side), <code>RS<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f <code>TS<\/code> \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043d\u043d\u0435\u043b\u044c (\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440) (pipe). \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 <code>TS<\/code> \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0445 <code>JavaScript<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 <code>JS<\/code> \u0438\u043c\u0435\u044e\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 <code>UTF-16<\/code>, \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 <code>UTF-8<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435. <code>TextDecoderStream<\/code> \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0438;<\/li>\n<li><code>TextEncoderStream<\/code> \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 <code>UTF-8<\/code>;<\/li>\n<li><code>CompressionStream<\/code> \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 <code>GZIP<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0441\u0436\u0430\u0442\u0438\u044f;<\/li>\n<li><code>DecompressionStream<\/code> \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 <code>GZIP<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432.<\/li>\n<\/ul>\n<p>  <\/p>\n<p><code>RS<\/code>, <code>WS<\/code> \u0438 <code>TS<\/code> \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0438\u043b\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0411\u0430\u0439\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043b\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0440\u0430\u0442\u043a\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435.<\/p>\n<p>  <\/p>\n<h3 id=\"12-konveyer\">1.2. \u041a\u043e\u043d\u0432\u0435\u0439\u0435\u0440<\/h3>\n<p>  <\/p>\n<p>&#171;\u0422\u0443\u043d\u043d\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&#187; (piping) \u2014 \u044d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c (pipe) <code>RS<\/code> \u0438 <code>WS<\/code>: \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 <code>RS<\/code> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0434\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0445 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 <code>WS<\/code>. \u041f\u0440\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 2 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430). \u041e\u0434\u043d\u0430\u043a\u043e, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 2 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 <code>RS<\/code>;<\/li>\n<li>\u0437\u0430\u0442\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 <code>TS<\/code>;<\/li>\n<li>\u0446\u0435\u043f\u043e\u0447\u043a\u0430 (chain) \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f <code>WS<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"13-protivodavlenie\">1.3. \u041f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u0437\u0432\u0435\u043d\u044c\u0435\u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0435\u043c \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u041f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (\u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435) (backpressure) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443: \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044e \u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 (\u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f).<\/p>\n<p>  <\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0432\u0435\u043d\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u0446\u0435\u043f\u043e\u0447\u043a\u0438. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">RS -> TS -> WS<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0443\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>WS<\/code> \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445;<\/li>\n<li>\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 <code>TS<\/code>;<\/li>\n<li>\u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f (\u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f) \u0432\u043d\u0443\u0442\u0440\u0438 <code>TS<\/code> (\u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439\/buffering);<\/li>\n<li><code>TS<\/code> \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u0438;<\/li>\n<li>\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 <code>RS<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041c\u044b \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0438. \u041f\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 <code>RS<\/code>, \u0443 <code>WS<\/code> \u0435\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435. \u041f\u043e\u0441\u043b\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f <code>WS<\/code> \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e\u0442 \u0441\u0438\u0433\u043d\u0430\u043b \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<h3 id=\"14-podderzhka-potokov-v-nodejs\">1.4. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 <code>Node.js<\/code><\/h3>\n<p>  <\/p>\n<p>\u0412 <code>Node.js<\/code> \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u0437 2 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f <code>node:stream\/web<\/code>;<\/li>\n<li>\u0447\u0435\u0440\u0435\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 (\u043a\u0430\u043a \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435).<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d <code>API<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u0438 \u0432 <code>Node.js<\/code> \u2014 <code>Fetch API<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const response = await fetch(\"https:\/\/exmple.com\"); const readableStream = response.body;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u043e\u0434\u0443\u043b\u044f <code>node:stream<\/code> \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>Node.js-\u043f\u043e\u0442\u043e\u043a\u0430<\/code> \u0432 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a, \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>Readable<\/code>:<br \/> \n<ul>\n<li><code>Readable.toWeb(nodeReadable)<\/code>;<\/li>\n<li><code>Readable.fromWeb(webReadableStream, options?)<\/code>;<\/li>\n<\/ul>\n<\/li>\n<li><code>Writable<\/code>:<br \/> \n<ul>\n<li><code>Writable.toWeb(nodeWritable)<\/code>;<\/li>\n<li><code>Writable.fromWeb(webWritableStream, options)<\/code>;<\/li>\n<\/ul>\n<\/li>\n<li><code>Duplex<\/code>:<br \/> \n<ul>\n<li><code>Duplex.toWeb(nodeDuplex)<\/code>;<\/li>\n<li><code>Duplex.fromWeb(webTransformStream, options?)<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p><code>FileHandle<\/code> \u2014 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d <code>API<\/code>, \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>readableWebStream<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"2-chtenie-iz-rs\">2. \u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 <code>RS<\/code><\/h2>\n<p>  <\/p>\n<p><code>RS<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0430\u043d\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432. \u041e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface RS&lt;TChunk> {   getReader(): ReadableStreamDefaultReader&lt;TChunk>;    readonly locked: boolean;    [Symbol.asyncIterator](): AsyncIterator&lt;TChunk>;    cancel(reason?: any): Promise&lt;void>;    pipeTo(     destination: WS&lt;TChunk>,     options?: StreamPipeOptions   ): Promise&lt;void>;    pipeThrough&lt;TChunk2>(     transform: ReadableWritablePair&lt;TChunk2, TChunk>,     options?: StreamPipeOptions   ): RS&lt;TChunk2>;    \/\/ \u041d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u044c\u0435   tee(): [RS&lt;TChunk>, RS&lt;TChunk>]; }  interface StreamPipeOptions {   signal?: AbortSignal;   preventClose?: boolean;   preventAbort?: boolean;   preventCancel?: boolean; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>getReader()<\/code>: \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Reader<\/code> \u2014 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 <code>RS<\/code>. <code>Readers<\/code> \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u043c\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438;<\/li>\n<li><code>locked<\/code>: \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d <code>Reader<\/code> \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e <code>RS<\/code>. <code>RS<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>Reader<\/code>, <code>getReader()<\/code> \u0432 \u044d\u0442\u043e\u0442 \u043f\u0435\u0440\u0438\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442;<\/li>\n<li><code>[Symbol.asyncIterator]()<\/code>: \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u0435\u043b\u0430\u0435\u0442 <code>RS<\/code> <a href=\"https:\/\/exploringjs.com\/impatient-js\/ch_async-iteration.html\">\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u043c\u0438<\/a>. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c;<\/li>\n<li><code>cancel()<\/code>: \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u0442\u043e\u043a, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432 \u043d\u0435\u043c \u043d\u0435 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d. <code>reason<\/code> (\u043f\u0440\u0438\u0447\u0438\u043d\u0430) \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a (underlying source) <code>RS<\/code> (\u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435). \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u043c\u0438\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438;<\/li>\n<li><code>pipeTo()<\/code>: \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>RS<\/code> \u0432 <code>WS<\/code>. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u043c\u0438\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. <code>pipeTo()<\/code> \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f, \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0442.\u043f. \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:<br \/> \n<ul>\n<li><code>signal<\/code>: \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c <code>AbortSignal<\/code> \u0434\u043b\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>AbortController<\/code>;<\/li>\n<li><code>preventClose<\/code>: \u0435\u0441\u043b\u0438 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>true<\/code>, \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 <code>WS<\/code> \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438 <code>RS<\/code>. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 <code>RS<\/code> \u043a \u043e\u0434\u043d\u043e\u043c\u0443 <code>WS<\/code>;<\/li>\n<li>\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/streams.spec.whatwg.org\/#rs-prototype\">\u0437\u0434\u0435\u0441\u044c<\/a>;<\/li>\n<\/ul>\n<\/li>\n<li><code>pipeThrough()<\/code>: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 <code>RS<\/code> \u043a <code>ReadableWritablePair<\/code> (\u043f\u043e \u0441\u0443\u0442\u0438, <code>TS<\/code>, \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435). \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 <code>RS<\/code> (\u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f <code>ReadableWritablePair<\/code>).<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 2 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f <code>RS<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>Readers<\/code>;<\/li>\n<li>\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"21-potreblenie-rs-cherez-readers\">2.1. \u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 <code>RS<\/code> \u0447\u0435\u0440\u0435\u0437 <code>Readers<\/code><\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 <code>RS<\/code> \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>Readers<\/code>. \u041e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface ReadableStreamGenericReader {   readonly closed: Promise&lt;undefined>;   cancel(reason?: any): Promise&lt;void>; }  interface ReadableStreamDefaultReader&lt;TChunk>   extends ReadableStreamGenericReader {   releaseLock(): void;   read(): Promise&lt;ReadableStreamReadResult&lt;TChunk>>; }  interface ReadableStreamReadResult&lt;TChunk> {   done: boolean;   value: TChunk | undefined; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>closed<\/code>: \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u0438\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430. \u041e\u043d \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043b\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 <code>Reader<\/code> \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430;<\/li>\n<li><code>cancel()<\/code>: \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c <code>Reader<\/code> \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <code>RS<\/code>;<\/li>\n<li><code>releaseLock()<\/code>: \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 <code>Reader<\/code> \u0438 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a;<\/li>\n<li><code>read()<\/code>: \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0438\u0441 \u0434\u043b\u044f <code>ReadableStreamReadResult<\/code> (\u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u0447\u0430\u043d\u043a\u0430) \u0441 2 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438:<br \/> \n<ul>\n<li><code>done<\/code>: \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 <code>false<\/code>, \u0435\u0441\u043b\u0438 \u0447\u0430\u043d\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f, <code>true<\/code> \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0447\u0430\u043d\u043a\u0430;<\/li>\n<li><code>value<\/code>: \u0447\u0430\u043d\u043a \u0438\u043b\u0438 <code>undefined<\/code> \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0447\u0430\u043d\u043a\u0430.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p><code>RS<\/code> \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, <code>Readers<\/code> \u2014 \u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0430 <code>ReadableStreamReadResult<\/code> \u2014 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>next<\/code> \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0434, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>Readers<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const reader = readableStream.getReader(); \/\/ 1  assert.equal(readableStream.locked, true); \/\/ 2  try {   while (true) {     const { done, value: chunk } = await reader.read(); \/\/ 3      if (done) break;     \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c `chunk`   } } finally {   reader.releaseLock(); \/\/ 4 }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 <code>Reader<\/code><\/strong>. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 <code>RS<\/code>. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>Reader<\/code> (1). \u041a\u0430\u0436\u0434\u044b\u0439 <code>RS<\/code> \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d <code>Reader<\/code>. \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <code>Reader<\/code> <code>RS<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f (2). \u041f\u0435\u0440\u0435\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>getReader()<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>releaseLock()<\/code> (4).<\/p>\n<p>  <\/p>\n<p><strong>\u0427\u0442\u0435\u043d\u0438\u0435 \u0447\u0430\u043d\u043a\u043e\u0432<\/strong>. <code>read()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0438\u0441 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 <code>done<\/code> \u0438 <code>value<\/code> (3). \u041f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0447\u0430\u043d\u043a\u0430 <code>done<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>true<\/code>. \u042d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0432 <code>JS<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440.<\/p>\n<p>  <\/p>\n<h4 id=\"211-primer-chtenie-fayla-cherez-rs\">2.1.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 <code>RS<\/code><\/h4>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0447\u0430\u043d\u043a\u0438 (\u0441\u0442\u0440\u043e\u043a\u0438) \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 <code>data.txt<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import * as fs from \"node:fs\"; import { Readable } from \"node:stream\";  const nodeReadable = fs.createReadStream(   \"data.txt\",   { encoding: \"utf-8\" } );  const webReadableStream = Readable.toWeb(nodeReadable); \/\/ 1  const reader = webReadableStream.getReader();  try {   while (true) {     const { done, value } = await reader.read();      if (done) break;      console.log(value);   } } finally {   reader.releaseLock(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0442\u043e\u043a <code>Node.js<\/code> \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a. \u0417\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0447\u0430\u043d\u043a\u043e\u0432.<\/p>\n<p>  <\/p>\n<h4 id=\"212-primer-formirovanie-stroki-iz-soderzhimogo-rs\">2.1.2. \u041f\u0440\u0438\u043c\u0435\u0440: \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e <code>RS<\/code><\/h4>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0447\u0430\u043d\u043a\u0438 \u0438\u0437 <code>RS<\/code> \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">async function readableStreamToString(readableStream) {   const reader = readableStream.getReader();    try {     let result = \"\";      while (true) {       const { done, value } = await reader.read();        if (done) {         return result; \/\/ 1       }        result += value;     }   } finally {     reader.releaseLock(); \/\/ 2   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u043b\u043e\u043a <code>finally<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u0434\u0430, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0431\u043b\u043e\u043a\u0430 <code>try<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f (2) \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 (1).<\/p>\n<p>  <\/p>\n<h3 id=\"22-potreblenie-rs-s-pomoschyu-asinhronnogo-perebora\">2.2. \u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 <code>RS<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430<\/h3>\n<p>  <\/p>\n<p><code>RS<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const iterator = readableStream[Symbol.iterator]();  let exhaustive = false;  try {   while (true) {     let chunk;      ({ done: exhaustive, value: chunk } = await iterator.next());      if (exhaustive) break;      console.log(chunk);   } } finally {   \/\/ \u0415\u0441\u043b\u0438 \u0446\u0438\u043a\u043b \u0431\u044b\u043b \u043f\u0440\u0435\u0440\u0432\u0430\u043d \u0434\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e (exhaustive) \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430   \/\/ (\u0447\u0435\u0440\u0435\u0437 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 `return`), \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c `iterator.return`   if (!exhaustive) {     iterator.return();   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0446\u0438\u043a\u043b <code>for-await-of<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">for await (const chunk of readableStream) {   console.log(chunk); }<\/code><\/pre>\n<p>  <\/p>\n<h4 id=\"221-primer-ispolzovanie-asinhronnogo-perebora-dlya-chteniya-potoka\">2.2.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430<\/h4>\n<p>  <\/p>\n<pre><code class=\"javascript\">import * as fs from \"node:fs\"; import { Readable } from \"node:stream\";  const nodeReadable = fs.createReadStream(   \"data.txt\",   { encoding: \"utf-8\" } );  const webReadableStream = Readable.toWeb(nodeReadable);  for await (const chunk of webReadableStream) {   console.log(chunk); }<\/code><\/pre>\n<p>  <\/p>\n<h4 id=\"222-v-nastoyaschee-vremya-brauzery-ne-podderzhivayut-asinhronnyy-perebor-rs\">2.2.2. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 <code>RS<\/code><\/h4>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 <code>RS<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f <code>Node.js<\/code> \u0438 <code>Deno<\/code>, \u043d\u043e \u043d\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u043c\u0438. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 <a href=\"https:\/\/github.com\/whatwg\/streams\/issues\/778\">\u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 GitHub<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u0435\u0440\u0442\u043a\u0430 \u0438\u0437 <a href=\"https:\/\/bugs.chromium.org\/p\/chromium\/issues\/detail?id=929585#c10\">\u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u0447\u0435\u0442\u0435 \u043e \u0431\u0430\u0433\u0430\u0445 Chromium<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">async function* getAsyncIterableFor(readableStream) {   const reader = readableStream.getReader();    try {     while (true) {       const { done, value } = await reader.read();        if (done) return;        yield value;     }   } finally {     reader.releaseLock();   } }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"23-sozdanie-konveyera\">2.3. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430<\/h3>\n<p>  <\/p>\n<p><code>RS<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 2 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>readableStream.pipeTo(writeableStream)<\/code>: \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0438\u0441 <code>p<\/code>. \u041e\u043d \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u0441\u0435 \u0447\u0430\u043d\u043a\u0438 <code>RS<\/code> \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 <code>WS<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f <code>p<\/code> \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>pipeTo()<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e <code>WS<\/code>.<\/p>\n<p>  <\/p>\n<ul>\n<li><code>readableStream.pipeThrough(transformStream)<\/code> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 <code>RS<\/code> \u043a <code>transformStream.writable<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>transformStream.readable<\/code> (\u043a\u0430\u0436\u0434\u044b\u0439 <code>TS<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u0442\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0438 \u0447\u0438\u0442\u0430\u044e\u0449\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u044b). \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0434\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e <code>RS<\/code> \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f <code>TS<\/code> \u043a <code>RS<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>pipeThrough()<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e <code>TS<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"3-prevraschenie-istochnikov-dannyh-v-rs-s-pomoschyu-upakovki\">3. \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 <code>RS<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438<\/h2>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>RS<\/code>, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u043e\u0431\u044a\u0435\u043a\u0442-\u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>RS<\/code>. \u041e\u0431\u044a\u0435\u043a\u0442-\u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c (underlying source) <code>RS<\/code> (\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c (queuing strategies) \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0438\u0436\u0435, \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044e):<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">new ReadableStream(underlyingSource?, queuingStrategy?)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface UnderlyingSource&lt;TChunk> {   start?(     controller: ReadableStreamController&lt;TChunk>   ): void | Promise&lt;void>;    pull?(     controller: ReadableStreamController&lt;TChunk>   ): void | Promise&lt;void>;    cancel?(reason?: any): void | Promise&lt;void>;    \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u0438 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f   type: \"bytes\" | undefined;   autoAllocateChunkSize: bigint; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>start(controller)<\/code>: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 <code>RS<\/code>;<\/li>\n<li><code>pull(controller)<\/code>: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 (\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u043a\u043e\u043c\u043d\u0430\u0442\u044b) (room) \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 <code>RS<\/code>. \u041e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f <code>start()<\/code>. \u0415\u0441\u043b\u0438 <code>pull()<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f;<\/li>\n<li><code>cancel(reason)<\/code>: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c <code>RS<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>readableStream.cancel()<\/code> \u0438\u043b\u0438 <code>reader.cancel().reason<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u044d\u0442\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u043c\u0438\u0441, \u0434\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>  <\/p>\n<p><code>controller<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u0432 <code>start()<\/code> \u0438 <code>pull()<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u0442\u043e\u043a\u0443. \u041e\u043d \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type ReadableStreamController&lt;TChunk> =   | ReadableStreamDefaultController&lt;TChunk>   \/\/ \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f   | ReadableByteStreamController&lt;TChunk>;  interface ReadableStreamDefaultController&lt;TChunk> {   enqueue(chunk?: TChunk): void;    readonly desiredSize: number | null;    close(): void;    error(err?: any): void; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b (\u0447\u0430\u043d\u043a\u0438 \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438):<\/p>\n<p>  <\/p>\n<ul>\n<li><code>enqueue(chunk)<\/code>: \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 <code>chunk<\/code> \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c <code>RS<\/code>;<\/li>\n<li><code>desiredSize<\/code>: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0438\u0448\u0435\u0442 <code>enqueue()<\/code>. \u0418\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>0<\/code> \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0415\u0441\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 (desired size) <code>&lt;= 0<\/code>, \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c;<br \/> \n<ul>\n<li>\u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442, \u0435\u0433\u043e <code>desiredSize<\/code> \u0440\u0430\u0432\u0435\u043d <code>0<\/code>;<\/li>\n<li>\u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u0435\u0433\u043e <code>desiredSize<\/code> \u0440\u0430\u0432\u0435\u043d <code>null<\/code>;<\/li>\n<\/ul>\n<\/li>\n<li><code>close()<\/code>: \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 <code>RS<\/code>. \u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0431\u0443\u0434\u0443 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0443\u0441\u0442\u043e\u0448\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f. \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0432\u044b\u0437\u044b\u0432\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f;<\/li>\n<li><code>error(err)<\/code>: \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043a \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0438\u043c \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>err<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"31-pervyy-primer-realizacii-bazovogo-istochnika\">3.1. \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430<\/h3>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434 <code>start()<\/code>. \u0421\u043b\u0443\u0447\u0430\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>pull()<\/code> \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const readableStream = new ReadableStream({   start(controller) {     controller.enqueue(\"\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n\"); \/\/ (1)     controller.enqueue(\"\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n\"); \/\/ (2)     controller.close(); \/\/ (3)   }, });  for await (const chunk of readableStream) {   console.log(chunk); } \/**  * \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n  * \u0412\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0441 2 \u0447\u0430\u043d\u043a\u0430\u043c\u0438 (1 \u0438 2). \u0412\u0430\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u043f\u043e\u0442\u043e\u043a (3). \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0446\u0438\u043a\u043b <code>for-await-of<\/code> \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0447\u0430\u043d\u043a\u043e\u0432 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c \u2014 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0438\u0441\u043a \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0421\u043a\u043e\u0440\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0438\u0441\u043a\u0430.<\/p>\n<p>  <\/p>\n<h3 id=\"32-ispolzovanie-rs-dlya-oborachivaniya-push--ili-pull-istochnika\">3.2. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>RS<\/code> \u0434\u043b\u044f \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f push- \u0438\u043b\u0438 pull-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430<\/h3>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 push- \u0438\u043b\u0438 pull-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0432 <code>RS<\/code>. \u0412\u0438\u0434 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 (push \u0438\u043b\u0438 pull) \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a <code>RS<\/code> \u0438\u0437 <code>UnderlyingSource<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li>push-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a: \u0442\u0430\u043a\u043e\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u043d\u0430\u0441 \u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>start<\/code>. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>pull()<\/code> \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d. \u041f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f (applying backpressure);<\/li>\n<li>pull-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a: \u0442\u0430\u043a\u043e\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0447\u0430\u0441\u0442\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>pull()<\/code>, \u0430 \u043d\u0435 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>start()<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h4 id=\"321-primer-sozdanie-rs-iz-push-istochnika-s-podderzhkoy-protivodavleniya\">3.2.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 <code>RS<\/code> \u0438\u0437 push-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/h4>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <code>RS<\/code> \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 &#171;\u043f\u0443\u0448\u0438\u0442&#187; \u043d\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0435 (\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0441):<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function makeReadableBackpressureSocketStream(host, port) {   const socket = createBackpressureSocket(host, port);    return new RS({     start(controller) {       socket.ondata = (event) => {         controller.enqueue(event.data);          if (controller.desiredSize &lt;= 0) {           \/\/ \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043b\u0430\u0441\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c           \/\/ \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u043c\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443           socket.readStop();         }       };        socket.onend = () => controller.close();        socket.onerror = () => controller.error(         new Error(\"\u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430!\"));     },      pull() {       \/\/ \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u043f\u0443\u0441\u0442\u0435\u043b\u0430, \u043d\u043e       \/\/ \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u0430 \u0445\u043e\u0447\u0435\u0442 \u0435\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.       \/\/ \u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445       socket.readStart();     },      cancel() {       socket.close();     },   }); }<\/code><\/pre>\n<p>  <\/p>\n<h4 id=\"322-primer-sozdanie-rs-iz-pull-istochnika\">3.2.2. \u041f\u0440\u0438\u043c\u0435\u0440: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 <code>RS<\/code> \u0438\u0437 pull-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430<\/h4>\n<p>  <\/p>\n<p>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>iterableToReadableStream<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0441 \u0447\u0430\u043d\u043a\u0430\u043c\u0438 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0438\u0445 \u0432 <code>RS<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/**  * @param iterable \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c (\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0438\u043b\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f)  *\/  function iterableToReadableStream(iterable) {   return new RS({     start() {       if (typeof iterable[Symbol.asyncIterator] === \"function\") {          this.iterator = iterable[Symbol.asyncIterator]();        } else if (typeof iterable[Symbol.iterator] === \"function\") {          this.iterator = iterable[Symbol.iterator]();        } else {         throw new Error(iterable + \" \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e\");       }     },      async pull(controller) {       if (this.iterator === null) return;       \/\/ \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u043d\u0435 \u043f\u0440\u043e\u043c\u0438\u0441\u044b)       \/\/ \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f `await` \u044d\u0442\u043e \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435       const { value, done } = await this.iterator.next();        if (done) {         this.iterator = null;         controller.close();         return;       }        controller.enqueue(value);     },      cancel() {       this.iterator = null;       controller.close();     },   }); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0435\u0435 \u0432 <code>RS<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">async function* genAsyncIterable() {   yield \"\u043a\u0430\u043a\";   yield \"\u0442\u0432\u043e\u0438\";   yield \"\u0434\u0435\u043b\u0430?\"; }  const readableStream = iterableToReadableStream(genAsyncIterable());  for await (const chunk of readableStream) {   console.log(chunk); } \/**  * \u043a\u0430\u043a  * \u0442\u0432\u043e\u0438  * \u0434\u0435\u043b\u0430? *\/  \/\/ iterableToReadableStream() \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438 const syncIterable = [\"\u0432\u0441\u0435\u043c\", \"\u043f\u0440\u0438\u0432\u0435\u0442\"];  const readableStream = iterableToReadableStream(syncIterable);  for await (const chunk of readableStream) {   console.log(chunk); } \/**  * \u0432\u0441\u0435\u043c  * \u043f\u0440\u0438\u0432\u0435\u0442 *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>RS.from()<\/code>, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 (\u0441\u043c. <a href=\"https:\/\/github.com\/whatwg\/streams\/pull\/1083\">\u044d\u0442\u043e\u0442 \u043f\u0443\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442<\/a>).<\/p>\n<p>  <\/p>\n<h2 id=\"4-zapis-v-ws\">4. \u0417\u0430\u043f\u0438\u0441\u044c \u0432 <code>WS<\/code><\/h2>\n<p>  <\/p>\n<p><code>WS<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0447\u0430\u043d\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0438. \u041e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface WS&lt;TChunk> {   getWriter(): WritableStreamDefaultWriter&lt;TChunk>;    readonly locked: boolean;    close(): Promise&lt;void>;    abort(reason?: any): Promise&lt;void>; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>getWriter()<\/code>: \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Writer<\/code> \u2014 \u043e\u0431\u044a\u0435\u043a\u0442, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>WS<\/code>;<\/li>\n<li><code>locked<\/code>: \u043e\u0434\u0438\u043d <code>WS<\/code> \u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e <code>Writer<\/code>. \u0414\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 <code>Writer<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, <code>WS<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0430 \u043c\u0435\u0442\u043e\u0434 <code>getWriter()<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442;<\/li>\n<li><code>close()<\/code>: \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a:<br \/> \n<ul>\n<li>\u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a (underlying sink) (\u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435) \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0447\u0430\u043d\u043a\u0438 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438;<\/li>\n<li>\u0432\u0441\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0438\u0445\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f \u043d\u0438\u0447\u0435\u043c (\u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a);<\/li>\n<li>\u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u0432\u0441\u0435\u0445 \u0447\u0430\u043d\u043a\u043e\u0432 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430. \u041f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u043e\u043c\u0438\u0441 \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442\u0441\u044f;<\/li>\n<\/ul>\n<\/li>\n<li><code>abort()<\/code>: \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a:<br \/> \n<ul>\n<li>\u043f\u043e\u0442\u043e\u043a \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438;<\/li>\n<li>\u043f\u0440\u043e\u043c\u0438\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 \u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 2 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 <code>WS<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Writers<\/code>;<\/li>\n<li>\u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a <code>WS<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"41-zapis-v-ws-s-pomoschyu-writers\">4.1. \u0417\u0430\u043f\u0438\u0441\u044c \u0432 <code>WS<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Writers<\/code><\/h3>\n<p>  <\/p>\n<p><code>Writers<\/code> \u0438\u043c\u0435\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface WritableStreamDefaultWriter&lt;TChunk> {   readonly desiredSize: number | null;    readonly ready: Promise&lt;undefined>;    write(chunk?: TChunk): Promise&lt;void>;    releaseLock(): void;    close(): Promise&lt;void>;    readonly closed: Promise&lt;undefined>;    abort(reason?: any): Promise&lt;void>; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>desiredSize<\/code>: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 <code>WS<\/code>. \u0415\u0441\u043b\u0438 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>0<\/code>, \u0437\u043d\u0430\u0447\u0438\u0442, \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430, \u0435\u0441\u043b\u0438 \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 <code>&lt;= 0<\/code>, \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c;<br \/> \n<ul>\n<li>\u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442, \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0440\u0430\u0432\u0435\u043d <code>0<\/code>;<\/li>\n<li>\u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0440\u0430\u0432\u0435\u043d <code>null<\/code>;<\/li>\n<\/ul>\n<\/li>\n<li><code>ready<\/code>: \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0430. \u0415\u0441\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u043d\u043e\u0432\u044c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f non-positive, \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439 (pending) \u043f\u0440\u043e\u043c\u0438\u0441;<\/li>\n<li><code>write()<\/code>: \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0447\u0430\u043d\u043a \u0432 \u043f\u043e\u0442\u043e\u043a. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435;<\/li>\n<li><code>releaseLock()<\/code>: \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0442\u043e\u043a\u0430;<\/li>\n<li><code>close()<\/code>: \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u044d\u0444\u0444\u0435\u043a\u0442, \u0447\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430;<\/li>\n<li><code>closed<\/code>: \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0438\u0441, \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0430;<\/li>\n<li><code>abort()<\/code>: \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u044d\u0444\u0444\u0435\u043a\u0442, \u0447\u0442\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u043e\u0434, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>Writers<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const writer = writableStream.getWriter(); \/\/ (1)  assert.equal(writableStream.locked, true); \/\/ (2)  try {   \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0447\u0430\u043d\u043a\u0438 (\u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435) } finally {   writer.releaseLock(); \/\/ (3) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 <code>WS<\/code>. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f <code>Writer<\/code> (1). \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <code>Writer<\/code> <code>WS<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f (2). \u041f\u0435\u0440\u0435\u0434 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>getWriter()<\/code> \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>releaseLock()<\/code> (3).<\/p>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 3 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0447\u0430\u043d\u043a\u043e\u0432.<\/p>\n<p>  <\/p>\n<h4 id=\"411-podhod-1-ozhidanie-write-neeffektivnaya-obrabotka-protivodavleniya\">4.1.1. \u041f\u043e\u0434\u0445\u043e\u0434 1: \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 <code>write()<\/code> (\u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f)<\/h4>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 <code>write()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">await writer.write(\"\u0427\u0430\u043d\u043a 1\"); await writer.write(\"\u0427\u0430\u043d\u043a 2\"); await writer.close();<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u043c\u0438\u0441, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 <code>write()<\/code>, \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0447\u0430\u043d\u043a\u0430. \u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 &#171;\u0443\u0441\u043f\u0435\u0448\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c&#187;, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>WS<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0444\u0430\u0439\u043b\u043e\u043c, \u0447\u0430\u043d\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u0435\u0448\u0435, \u0442.\u0435. \u043d\u0435 \u0431\u044b\u0442\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u0434\u0438\u0441\u043a.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u043c\u0438\u0441, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 <code>close()<\/code>, \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f: \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u0441\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<h4 id=\"412-podhod-2-ignorirovanie-otkloneniya-write-ignorirovanie-protivodavleniya\">4.1.2. \u041f\u043e\u0434\u0445\u043e\u0434 2: \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f <code>write()<\/code> (\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f)<\/h4>\n<p>  <\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u043c\u0438\u0441\u043e\u0432, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 <code>write()<\/code>, \u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u043c\u0438\u0441\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e <code>close()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">writer.write(\"\u0427\u0430\u043d\u043a 1\").catch(() => {}); \/\/ (1) writer.write(\"\u0427\u0430\u043d\u043a 2\").catch(() => {}); \/\/ (2) await writer.close(); \/\/ C\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>write()<\/code> \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0447\u0430\u043d\u043a\u0438 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c <code>WS<\/code>. \u041c\u044b \u043d\u0435 \u0436\u0434\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u0447\u0430\u043d\u043a\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 <code>close()<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u043f\u0443\u0441\u0442\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0447\u0430\u043d\u043a\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 <code>catch()<\/code> (1 \u0438 2) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439 \u043e \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\u0445 \u043f\u0440\u043e\u043c\u0438\u0441\u0430 \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e. \u041c\u044b \u043c\u043e\u0436\u0435\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 <code>write()<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>close()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">ignoreRejections(   writer.write(\"\u0427\u0430\u043d\u043a 1\"),   writer.write(\"\u0427\u0430\u043d\u043a 2\"), ); await writer.close(); \/\/ \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445  function ignoreRejections(...promises) {   for (const promise of promises) {     promise.catch(() => {});   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430: \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<h4 id=\"413-podhod-3-ozhidanie-ready-effektivnaya-obrabotka-protivodavleniya\">4.1.3. \u041f\u043e\u0434\u0445\u043e\u0434 3: \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 <code>ready<\/code> (\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f)<\/h4>\n<p>  <\/p>\n<p>\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0433\u0435\u0442\u0442\u0435\u0440\u0430 <code>ready<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">await writer.ready; \/\/ \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \/\/ \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430? console.log(writer.desiredSize); writer.write(\"\u0427\u0430\u043d\u043a 1\").catch(() => {});  await writer.ready; \/\/ \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \/\/ \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430? console.log(writer.desiredSize); writer.write(\"\u0427\u0430\u043d\u043a 2\").catch(() => {});  await writer.close(); \/\/ \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u043c\u0438\u0441 \u0432 <code>ready<\/code> \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0435\u0433\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f.<\/p>\n<p>  <\/p>\n<h4 id=\"414-primer-zapis-fayla-s-pomoschyu-writer\">4.1.4. \u041f\u0440\u0438\u043c\u0435\u0440: \u0437\u0430\u043f\u0438\u0441\u044c \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Writer<\/code><\/h4>\n<p>  <\/p>\n<pre><code class=\"javascript\">import * as fs from \"node:fs\"; import { Writable } from \"node:stream\";  const nodeWritable = fs.createWriteStream(   \"data.txt\",   { encoding: \"utf-8\" } ); \/\/ (1)  const webWritableStream = Writable.toWeb(nodeWritable); \/\/ (2)  const writer = webWritableStream.getWriter();  try {   await writer.write(\"\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n\");   await writer.write(\"\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n\");   await writer.close(); } finally {   writer.releaseLock() }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u0442\u043e\u043a <code>Node.js<\/code> \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 <code>data.txt<\/code> (1). \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u043e\u0442\u043e\u043a \u0432 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a (2). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>Writer<\/code> \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043d\u0435\u0433\u043e \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p>  <\/p>\n<h3 id=\"42-podklyuchenie-k-ws\">4.2. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a <code>WS<\/code><\/h3>\n<p>  <\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>Writers<\/code>, \u0432 <code>WS<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 <code>RS<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">await readableStream.pipeTo(writableStream);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u043c\u0438\u0441 \u0438\u0437 <code>pipeTo()<\/code> \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<h4 id=\"421-podklyuchenie-proishodit-asinhronno\">4.2.1. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e<\/h4>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u042d\u0442\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const readableStream = new RS({ \/\/ (1)   start(controller) {     controller.enqueue(\"\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n\");     controller.enqueue(\"\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n\");     controller.close();   }, });  const writableStream = new WritableStream({ \/\/ (2)   write(chunk) {     console.log(\"\u0417\u0410\u041f\u0418\u0421\u042c \" + JSON.stringify(chunk));   },    close() {     console.log(\"\u0417\u0410\u041a\u0420\u042b\u0422\u0418\u0415 WS\");   }, });  console.log(\"\u0414\u043e .pipeTo()\");  const promise = readableStream.pipeTo(writableStream); \/\/ (3)  promise.then(() => console.log(\"\u041f\u0440\u043e\u043c\u0438\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\"));  console.log(\"\u041f\u043e\u0441\u043b\u0435 .pipeTo()\"); \/**  * \u0414\u043e .pipeTo()  * \u041f\u043e\u0441\u043b\u0435 .pipeTo()  * \u0417\u0410\u041f\u0418\u0421\u042c \"\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n\"  * \u0417\u0410\u041f\u0418\u0421\u042c \"\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n\"  * \u0417\u0410\u041a\u0420\u042b\u0422\u0418\u0415 WS  * \u041f\u0440\u043e\u043c\u0438\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c <code>RS<\/code> (1). \u0421\u043e\u0437\u0434\u0430\u0435\u043c <code>WS<\/code> (2).<\/p>\n<p>  <\/p>\n<p>\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e <code>pipeTo()<\/code> (3) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u0412 \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0447\u0430\u043d\u043a\u0438 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f. \u0417\u0430\u0442\u0435\u043c <code>WS<\/code> \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438 <code>promise<\/code> \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<h4 id=\"422-primer-podklyuchenie-k-ws-dlya-fayla\">4.2.2. \u041f\u0440\u0438\u043c\u0435\u0440: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a <code>WS<\/code> \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430<\/h4>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c <code>WS<\/code> \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a \u043d\u0435\u043c\u0443 <code>RS<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const webReadableStream = new RS({ \/\/ (1)   async start(controller) {     controller.enqueue(\"\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n\");     controller.enqueue(\"\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\\n\");     controller.close();   }, });  const nodeWritable = fs.createWriteStream( \/\/ (2)   \"data.txt\",   { encoding: \"utf-8\" } );  const webWritableStream = Writable.toWeb(nodeWritable); \/\/ (3)  await webReadableStream.pipeTo(webWritableStream); \/\/ (4)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c <code>RS<\/code> (1). \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u0442\u043e\u043a <code>Node.js<\/code> \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 <code>data.txt<\/code> (2). \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a (3). \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c <code>webReadableStream<\/code> \u043a <code>RS<\/code> \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>  <\/p>\n<h4 id=\"423-primer-zapis-dvuh-rs-v-odin-ws\">4.2.3. \u041f\u0440\u0438\u043c\u0435\u0440: \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0432\u0443\u0445 <code>RS<\/code> \u0432 \u043e\u0434\u0438\u043d <code>WS<\/code><\/h4>\n<p>  <\/p>\n<pre><code class=\"javascript\">const createReadableStream = (prefix) =>   new ReadableStream({     async start(controller) {       controller.enqueue(prefix + \"\u0447\u0430\u043d\u043a 1\");       controller.enqueue(prefix + \"\u0447\u0430\u043d\u043a 2\");       controller.close();     },   });  const writableStream = new WritableStream({   write(chunk) {     console.log(\"\u0417\u0410\u041f\u0418\u0421\u042c \" + JSON.stringify(chunk));   },    close() {     console.log(\"\u0417\u0410\u041a\u0420\u042b\u0422\u0418\u0415\");   },    abort(err) {     console.log(\"\u041f\u0420\u0415\u0420\u042b\u0412\u0410\u041d\u0418\u0415 \" + err);   }, });  await createReadableStream(\"\u041f\u043e\u0442\u043e\u043a 1: \")   .pipeTo(writableStream, { preventClose: true }); \/\/ (1)  await createReadableStream(\"\u041f\u043e\u0442\u043e\u043a 2: \")   .pipeTo(writableStream, { preventClose: true }); \/\/ (2)  await writableStream.close(); \/**  * \u0417\u0410\u041f\u0418\u0421\u042c \"\u041f\u043e\u0442\u043e\u043a 1: \u0447\u0430\u043d\u043a 1\"  * \u0417\u0410\u041f\u0418\u0421\u042c \"\u041f\u043e\u0442\u043e\u043a 1: \u0447\u0430\u043d\u043a 2\"  * \u0417\u0410\u041f\u0418\u0421\u042c \"\u041f\u043e\u0442\u043e\u043a 2: \u0447\u0430\u043d\u043a 1\"  * \u0417\u0410\u041f\u0418\u0421\u042c \"\u041f\u043e\u0442\u043e\u043a 2: \u0447\u0430\u043d\u043a 2\"  * \u0417\u0410\u041a\u0420\u042b\u0422\u0418\u0415 *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c <code>pipeTo()<\/code> \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c <code>WS<\/code> \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f <code>RS<\/code> (1 \u0438 2). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <code>WS<\/code> \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c, \u0438 \u043a \u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 <code>RS<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d.<\/p>\n<p>  <\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 happy coding!<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<p><a href=\"https:\/\/cloud.timeweb.com\/vds-promo-10-rub?utm_source=habr&amp;utm_medium=banner&amp;utm_campaign=vds-promo-10-rub\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/co\/e2\/kh\/coe2kha8u8_pypip-2k3wk3ppa0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/co\/e2\/kh\/coe2kha8u8_pypip-2k3wk3ppa0.png\"\/><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/675676\/\"> https:\/\/habr.com\/ru\/company\/timeweb\/blog\/675676\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/4-\/hn\/8w\/4-hn8wkkaeafijehpfybkgcounq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/4-\/hn\/8w\/4-hn8wkkaeafijehpfybkgcounq.png\"\/>  <\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 <a href=\"https:\/\/2ality.com\/2022\/06\/web-streams-nodejs.html\">\u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u0438 (web streams) \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (streams), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0432\u0435\u0431-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c\u0438: \u0432\u0435\u0431-\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u043c\u0438, <a href=\"https:\/\/nodejs.org\/\">Node.js<\/a> \u0438 <a href=\"https:\/\/deno.land\/\">Deno<\/a>. \u041f\u043e\u0442\u043e\u043a\u0438 \u2014 \u044d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u2014 \u0444\u0430\u0439\u043b\u043e\u0432, \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0438 \u0442.\u0434.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/API\/Fetch_API\/Using_Fetch\">fetch<\/a> (\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u043d\u043b\u0430\u0439\u043d-\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432) \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 (<code>Response<\/code>), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>body<\/code> \u0441 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u0438 \u0432 <code>Node.js<\/code>, \u043d\u043e \u0442\u043e, \u043e \u0447\u0435\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e \u043a \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u0439 \u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-335411","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335411","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=335411"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335411\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=335411"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=335411"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=335411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}