{"id":335555,"date":"2022-07-11T09:00:14","date_gmt":"2022-07-11T09:00:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=335555"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=335555","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 2<\/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 \u0432\u0442\u043e\u0440\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><a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/675676\/\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/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=\"#5-%D0%BF%D1%80%D0%B5%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%B8%D0%B5%D0%BC%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-ws-%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\"><code>5. \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 WS<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438<\/a><br \/> \n<ul>\n<li><a href=\"#51-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%82%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0-rs\"><code>5.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 RS<\/code><\/a><\/li>\n<li><a href=\"#52-%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-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC%D1%8B%D1%85-%D1%87%D0%B0%D0%BD%D0%BA%D0%BE%D0%B2\">5.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 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0447\u0430\u043d\u043a\u043e\u0432<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#6-%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-ts\"><code>6. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 TS<\/code><\/a><br \/> \n<ul>\n<li><a href=\"#61-%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B5-ts\"><code>6.1. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 TS<\/code><\/a><\/li>\n<li><a href=\"#611-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B4%D0%B5%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0-%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2-%D0%B2-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B5-utf-8\"><code>6.1.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 UTF-8<\/code><\/a><\/li>\n<li><a href=\"#612-%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-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B4%D0%BB%D1%8F-%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D1%8F-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0-%D0%B4%D0%BB%D1%8F-%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B2%D1%85%D0%BE%D0%B4%D0%B0\">6.1.2. \u041f\u0440\u0438\u043c\u0435\u0440: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#7-%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BA%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%BD%D1%8B%D1%85-ts\"><code>7. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 TS<\/code><\/a><br \/> \n<ul>\n<li><a href=\"#71-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D1%87%D0%B0%D0%BD%D0%BA%D0%BE%D0%B2-%D0%B2-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA-%D1%81%D1%82%D1%80%D0%BE%D0%BA\">7.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0447\u0430\u043d\u043a\u043e\u0432 \u0432 \u043f\u043e\u0442\u043e\u043a \u0441\u0442\u0440\u043e\u043a<\/a><\/li>\n<li><a href=\"#72-%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B-%D1%82%D0%B0%D0%BA%D0%B6%D0%B5-%D0%BE%D1%82%D0%BB%D0%B8%D1%87%D0%BD%D0%BE-%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8F%D1%82-%D0%B4%D0%BB%D1%8F-%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0\">7.2. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#8-%D0%B4%D0%B5%D1%82%D0%B0%D0%BB%D0%B8-%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\">8. \u0414\u0435\u0442\u0430\u043b\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/a><br \/> \n<ul>\n<li><a href=\"#81-%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%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\">8.1. \u0421\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/a><\/li>\n<li><a href=\"#82-%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\">8.2. \u041e\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=\"#821-%D0%BA%D0%BE%D0%B4-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B8%D0%B9-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B2-ws-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-writer\"><code>8.2.1. \u041a\u043e\u0434, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 WS<\/code> \u0447\u0435\u0440\u0435\u0437 <code>Writer<\/code><\/a><\/li>\n<li><a href=\"#822-%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B9-%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA-rs\"><code>8.2.2. \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a RS<\/code><\/a><\/li>\n<li><a href=\"#823-%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B9-%D0%BF%D1%80%D0%B8%D0%B5%D0%BC%D0%BD%D0%B8%D0%BA-ws\"><code>8.2.3. \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a WS<\/code><\/a><\/li>\n<li><a href=\"#824-ts-writable-readable\"><code>8.2.4. TS<\/code> (writable-readable)<\/a><\/li>\n<li><a href=\"#825-pipeto-rs---ws\"><code>8.2.5. pipeTo()<\/code> (RS -> WS)<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#9-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8-%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2\">9. \u041f\u043e\u0442\u043e\u043a\u0438 \u0431\u0430\u0439\u0442\u043e\u0432<\/a><br \/> \n<ul>\n<li><a href=\"#91-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D1%8B%D0%B9-%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%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2\">9.1. \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432<\/a><\/li>\n<li><a href=\"#92-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B1%D0%B5%D1%81%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D1%8B%D0%B9-%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%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2-%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D0%B5%D0%BC%D1%8B%D0%B9-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8\">9.2. \u041f\u0440\u0438\u043c\u0435\u0440: \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/a><\/li>\n<li><a href=\"#93-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D0%BE%D0%B3%D0%BE-%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-%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2\">9.3. \u041f\u0440\u0438\u043c\u0435\u0440: \u0441\u0436\u0430\u0442\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0431\u0430\u0439\u0442\u043e\u0432<\/a><\/li>\n<li><a href=\"#94-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2%D0%B5%D0%B1-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-fetch\"><code>9.4. \u041f\u0440\u0438\u043c\u0435\u0440: \u0447\u0442\u0435\u043d\u0438\u0435 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e fetch()<\/code><\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#10-%D1%81%D0%BF%D0%B5%D1%86%D0%B8%D1%84%D0%B8%D1%87%D0%BD%D1%8B%D0%B5-%D0%B4%D0%BB%D1%8F-nodejs-%D0%B2%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8\"><code>10. \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f Node.js<\/code> \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"5-prevraschenie-priemnikov-dannyh-v-ws-s-pomoschyu-upakovki\">5. \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 <code>WS<\/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 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u0447\u0435\u0440\u0435\u0437 <code>WS<\/code>, \u044d\u0442\u043e\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u043e\u0431\u044a\u0435\u043a\u0442-\u0430\u0434\u0430\u043f\u0442\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u043e\u043c (underlying sink):<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">new WritableStream(underlyingSink?, queuingStrategy?);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\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 UnderlyingSink&lt;TChunk> {   start?(     controller: WritableStreamDefaultController   ): void | Promise&lt;void>;    write?(     chunk: TChunk,     controller: WritableStreamDefaultController   ): void | Promise&lt;void>;    close?(): void | Promise&lt;void>;    abort?(reason?: any): void | 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>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>WS<\/code>. \u0414\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0438\u0441. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043a \u0437\u0430\u043f\u0438\u0441\u0438;<\/li>\n<li><code>write(chunk, controller)<\/code>: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0447\u0430\u043d\u043a\u0430 \u043a \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a. \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f \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 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f;<\/li>\n<li><code>close()<\/code>: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>writeStream.close()<\/code> \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0441\u0435\u0445 \u0447\u0430\u043d\u043a\u043e\u0432 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438;<\/li>\n<li><code>abort(reason)<\/code>: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>writeStream.abort()<\/code> \u0438\u043b\u0438 <code>writer.abort()<\/code>. <code>reason<\/code> \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0435 \u044d\u0442\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>controller<\/code> \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>start<\/code> \u0438 <code>write<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c <code>WS<\/code> \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \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\">interface WritableStreamDefaultController {   readonly signal: AbortSignal;   error(err?: any): void; }<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>signal<\/code>: <code>AbortSignal<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u043b\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0430;<\/li>\n<li><code>error(err)<\/code>: \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 <code>WS<\/code>, \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 \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=\"51-primer-trassirovka-rs\">5.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 <code>RS<\/code><\/h3>\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> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a <code>WS<\/code> \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043a\u0430\u043a <code>RS<\/code> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0447\u0430\u043d\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const readableStream = new RS({   start(controller) {     controller.enqueue(\"\u041f\u0435\u0440\u0432\u044b\u0439 \u0447\u0430\u043d\u043a\");     controller.enqueue(\"\u0412\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u043d\u043a\");     controller.close();   }, });  await readableStream.pipeTo(   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);     },   }) ); \/**  * \u0417\u0410\u041f\u0418\u0421\u042c \"\u041f\u0435\u0440\u0432\u044b\u0439 \u0447\u0430\u043d\u043a\"  * \u0417\u0410\u041f\u0418\u0421\u042c \"\u0412\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u043d\u043a\"  * \u0417\u0410\u041a\u0420\u042b\u0422\u0418\u0415 *\/<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"52-primer-formirovanie-stroki-iz-zapisyvaemyh-chankov\">5.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 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0447\u0430\u043d\u043a\u043e\u0432<\/h3>\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 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441 <code>WS<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0447\u0430\u043d\u043a\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443. \u041c\u0435\u0442\u043e\u0434 <code>getString<\/code> \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0440\u043e\u043a\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">class WritableStringStream extends WS {   #string = \"\";    constructor() {     super({       \/\/ \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u043a `this` `WritableStringStream`,       \/\/ \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e       write: (chunk) => {         this.#string += chunk;       },     });   }    getString() {     return this.#string;   } }  const stringStream = new WritableStringStream();  const writer = stringStream.getWriter();  try {   await writer.write(\"\u041a\u0430\u043a\");   await writer.write(\" \u0442\u0432\u043e\u0438 \");   await writer.write(\" \u0434\u0435\u043b\u0430?\");   await writer.close(); } finally {   writer.releaseLock() }  assert.equal(   stringStream.getString(),   \"\u041a\u0430\u043a \u0442\u0432\u043e\u0438 \u0434\u0435\u043b\u0430?\" );<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u0435 <code>API<\/code>: <code>WS API<\/code> \u0438 <code>API<\/code> \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 <code>WS<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function createWritableStringStream() {   let string = \"\";    return {     stream: new WS({       write(chunk) {         string += chunk;       },     }),      getString() {       return string;     },   }; }  const stringStream = createWritableStringStream();  const writer = stringStream.stream.getWriter();  try {   await writer.write(\"\u041a\u0430\u043a\");   await writer.write(\" \u0442\u0432\u043e\u0438 \");   await writer.write(\" \u0434\u0435\u043b\u0430?\");   await writer.close(); } finally {   writer.releaseLock() }  assert.equal(   stringStream.getString(),   \"\u041a\u0430\u043a \u0442\u0432\u043e\u0438 \u0434\u0435\u043b\u0430?\" );<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0430 (\u0432\u043c\u0435\u0441\u0442\u043e \u0444\u0430\u0431\u0440\u0438\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432).<\/p>\n<p>  <\/p>\n<h2 id=\"6-ispolzovanie-ts\">6. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>TS<\/code><\/h2>\n<p>  <\/p>\n<p><code>TS<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 (writable side), <code>WS<\/code>;<\/li>\n<li>\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435;<\/li>\n<li>\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f (readable side), <code>RS<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f <code>TS<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043d\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (pipe through) \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const transformedStream = readableStream.pipeThrough(transformStream);<\/code><\/pre>\n<p>  <\/p>\n<p><code>pipeThrough()<\/code> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 <code>RS<\/code> \u043a \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 <code>TS<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 <code>RS<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 <code>RS<\/code>.<\/p>\n<p>  <\/p>\n<p><code>pipeThrough()<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <code>TS<\/code>, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0442\u0430\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface ReadableWritablePair&lt;RChunk, WChunk> {   readable: RS&lt;RChunk>;   writable: WS&lt;WChunk>; }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"61-standartnye-ts\">6.1. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 <code>TS<\/code><\/h3>\n<p>  <\/p>\n<p><code>Node.js<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 <code>TS<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/encoding.spec.whatwg.org\/\">\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 WHATWG)<\/a> \u2014 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/TextEncoderStream#browser_compatibility\">TextEncoderStream<\/a> \u0438 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/TextDecoderStream#browser_compatibility\">TextDecoderStream<\/a>:<br \/> \n<ul>\n<li>\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <code>UTF-8<\/code>, \u043d\u043e \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 <a href=\"https:\/\/encoding.spec.whatwg.org\/#names-and-labels\">\u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438<\/a>;<\/li>\n<li>\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u0430\u044f \u043a\u043e\u0434\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 (code point) \u042e\u043d\u0438\u043a\u043e\u0434\u0430 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043a\u043e\u0434\u0430 <code>UFT-8<\/code>, \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0434\u043e 4 \u0431\u0430\u0439\u0442. \u0412 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043a\u043e\u0434\u0430 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0447\u0430\u043d\u043a\u0438. <code>TextDecoderStream<\/code> \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443;<\/li>\n<li>\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 <code>JS-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c<\/code>;<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/wicg.github.io\/compression\/\">\u041f\u043e\u0442\u043e\u043a\u0438 \u0434\u043b\u044f \u0441\u0436\u0430\u0442\u0438\u044f (\u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 W3C)<\/a> \u2014 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/CompressionStream\">CompressionStream<\/a> \u0438 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/DecompressionStream\">DecompressionStream<\/a>:<br \/> \n<ul>\n<li><a href=\"https:\/\/wicg.github.io\/compression\/#supported-formats\">\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0441\u0436\u0430\u0442\u0438\u044f<\/a>: <code>deflate<\/code>, <code>deflate-raw<\/code>, <code>gzip<\/code>;<\/li>\n<li>\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 \u043c\u043d\u043e\u0433\u0438\u0445 <code>JS-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<h4 id=\"611-primer-dekodirovanie-potoka-baytov-v-kodirovke-utf-8\">6.1.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 <code>UTF-8<\/code><\/h4>\n<p>  <\/p>\n<pre><code class=\"javascript\">const response = await fetch(\"https:\/\/example.com\"); const readableByteStream = response.body;  const readableStream = readableByteStream   .pipeThrough(new TextDecoderStream(\"utf-8\"));  for await (const stringChunk of readableStream) {   console.log(stringChunk); }<\/code><\/pre>\n<p>  <\/p>\n<p><code>response.body<\/code> \u2014 \u044d\u0442\u043e <code>ReadableByteStream<\/code> (\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432), \u0447\u0430\u043d\u043a\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u043c\u0438 <code>Uint8Array<\/code>. \u041c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u043e\u0442\u043e\u043a \u0447\u0435\u0440\u0435\u0437 <code>TextDecoderStream<\/code> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u0447\u0430\u043d\u043a\u0438.<\/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\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u0447\u0430\u043d\u043a\u0430 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>TextDecoder<\/code>) \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u0430\u0439\u0442\u044b \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043a\u043e\u0434\u0430 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0447\u0430\u043d\u043a\u0430\u0445.<\/p>\n<p>  <\/p>\n<h4 id=\"612-primer-sozdanie-dostupnogo-dlya-chteniya-strokovogo-potoka-dlya-standartnogo-vhoda\">6.1.2. \u041f\u0440\u0438\u043c\u0435\u0440: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430<\/h4>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <code>Node.js<\/code> \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0432\u0441\u0435, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u0445\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import { Readable } from \"node:stream\";  const webStream = Readable.toWeb(process.stdin)   .pipeThrough(new TextDecoderStream(\"utf-8\"));  for await (const chunk of webStream) {   console.log(\">>>\", chunk); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 \u0432\u0445\u043e\u0434\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0442\u043e\u043a, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439\u0441\u044f \u0432 <code>process.stdin<\/code>. \u0411\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u0435\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Readable.toWeb()<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a. \u041e\u043d \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>TextDecoderStream<\/code> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430.<\/p>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u2014 \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0447\u0430\u043d\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c, \u043e\u043d \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0436\u0434\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0432\u043e\u0434\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0441 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"7-realizaciya-kastomnyh-ts\">7. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 <code>TS<\/code><\/h2>\n<p>  <\/p>\n<p>\u041a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 <code>TS<\/code> \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>Transformer<\/code> \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>TS<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \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\">interface Transformer&lt;TInChunk, TOutChunk> {   start?(     controller: TransformStreamDefaultController&lt;TOutChunk>   ): void | Promise&lt;void>;    transform?(     chunk: TInChunk,     controller: TransformStreamDefaultController&lt;TOutChunk>   ): void | Promise&lt;void>;    flush?(     controller: TransformStreamDefaultController&lt;TOutChunk>   ): void | 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>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>TS<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u043c;<\/li>\n<li><code>transform(chunk, controller)<\/code>: \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0447\u0430\u043d\u043a \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>controller<\/code> \u0434\u043b\u044f \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0447\u0430\u043d\u043a\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c;<\/li>\n<li><code>flush(controller)<\/code>: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0447\u0430\u043d\u043a\u043e\u0432. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0443.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\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 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \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 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>controller<\/code> \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\">interface TransformStreamDefaultController&lt;TOutChunk> {   enqueue(chunk?: TOutChunk): void;    readonly desiredSize: number | null;    terminate(): void;    error(err?: any): 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>enqueue(chunk)<\/code>: \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0447\u0430\u043d\u043a \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f (\u0432\u044b\u0432\u043e\u0434) <code>TS<\/code>;<\/li>\n<li><code>desiredSize<\/code>: \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f (\u0432\u044b\u0432\u043e\u0434\u0430) <code>TS<\/code>;<\/li>\n<li><code>terminate()<\/code>: \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f (\u0432\u044b\u0432\u043e\u0434) \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 (\u0432\u0445\u043e\u0434) <code>TS<\/code> \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \u041c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d \u0432 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0447\u0430\u043d\u043a\u0430\u0445 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 (\u0432\u0445\u043e\u0434\u0430) \u0438 \u0445\u043e\u0447\u0435\u0442 \u0438\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c;<\/li>\n<li><code>error(err)<\/code>: \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 <code>TS<\/code> \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \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<p>\u0427\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f? \u041f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f (\u0432\u044b\u0445\u043e\u0434\u0430) \u043a \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 (\u0432\u0445\u043e\u0434). \u041e\u0431\u044b\u0447\u043d\u043e, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>transformStreamDefaultController.desiredSize<\/code> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043f\u0440\u043e\u043c\u0438\u0441\u0430 \u0438\u0437 <code>transformer.transform()<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"71-primer-preobrazovanie-potoka-proizvolnyh-chankov-v-potok-strok\">7.1. \u041f\u0440\u0438\u043c\u0435\u0440: \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0447\u0430\u043d\u043a\u043e\u0432 \u0432 \u043f\u043e\u0442\u043e\u043a \u0441\u0442\u0440\u043e\u043a<\/h3>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441 <code>TS<\/code> \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0447\u0430\u043d\u043a\u043e\u0432 \u0432 \u043f\u043e\u0442\u043e\u043a, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0430\u043d\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u0447\u0430\u043d\u043a, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e, \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c <code>\\n<\/code> \u0432 <code>Unix<\/code> \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 <code>\\r\\n<\/code> \u0432 <code>Windows<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">class ChunksToLinesTransformer {   #previous = \"\";    transform(chunk, controller) {     let startSearch = this.#previous.length;      this.#previous += chunk;      while (true) {       \/\/ \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f EOL === \"\\n\" \u0438 EOL === \"\\r\\n\"       const eolIndex = this.#previous.indexOf(\"\\n\", startSearch);        if (eolIndex &lt; 0) break;        \/\/ \u0421\u0442\u0440\u043e\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 EOL       const line = this.#previous.slice(0, eolIndex + 1);        controller.enqueue(line);        this.#previous = this.#previous.slice(eolIndex + 1);        startSearch = 0;     }   }    flush(controller) {     \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0442\u0435\u043a\u0441\u0442     if (this.#previous.length > 0) {       controller.enqueue(this.#previous);     }   } }  class ChunksToLinesStream extends TS {   constructor() {     super(new ChunksToLinesTransformer());   } }  const stream = new RS({   async start(controller) {     controller.enqueue(\"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e\\n\u0441\u0442\u0440\u043e\u043a\\n\u0442\u0435\u043a\u0441\u0442\u0430\");     controller.close();   }, });  const transformStream = new ChunksToLinesStream();  const transformed = stream.pipeThrough(transformStream);  for await (const line of transformed) {   console.log(\">>>\", JSON.stringify(line)); } \/**  * >>> \"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e\\n\"  * >>> \"\u0441\u0442\u0440\u043e\u043a\\n\"  * >>> \"\u0442\u0435\u043a\u0441\u0442\u0430\" *\/<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: <code>Deno<\/code> \u0438\u043c\u0435\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 <a href=\"https:\/\/doc.deno.land\/https:\/\/deno.land\/std@0.141.0\/streams\/mod.ts\/~\/TextLineStream\">TextLineStream<\/a> \u0441\u043e \u0441\u0445\u043e\u0436\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c.<\/p>\n<p>  <\/p>\n<h3 id=\"72-asinhronnye-generatory-takzhe-otlichno-podhodyat-dlya-preobrazovaniya-potoka\">7.2. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>RS<\/code> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u043c\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0438\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u043e\u0447\u0435\u043d\u044c \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const stream = new RS({   async start(controller) {     controller.enqueue(\"\u0440\u0430\u0437\");     controller.enqueue(\"\u0434\u0432\u0430\");     controller.enqueue(\"\u0442\u0440\u0438\");     controller.close();   }, });  async function* prefixChunks(prefix, asyncIterable) {   for await (const chunk of asyncIterable) {     yield \"> \" + chunk;   } }  const transformedAsyncIterable = prefixChunks(\"> \", stream);  for await (const transformedChunk of transformedAsyncIterable) {   console.log(transformedChunk); } \/**  * > \u0440\u0430\u0437  * > \u0434\u0432\u0430  * > \u0442\u0440\u0438 *\/<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"8-detali-protivodavleniya\">8. \u0414\u0435\u0442\u0430\u043b\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">rs.pipeThrough(ts).pipeTo(ws);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u044d\u0442\u0438\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c (<code>pipeThrough()<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>pipeTo()<\/code> \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f <code>rs<\/code> \u043a \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 <code>ts<\/code>):<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">rs -pipeTo-> ts{writable,readable} -pipeTo-> ws<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a <code>rs<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <code>rs<\/code>;<\/li>\n<li>\u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a <code>ws<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430 <code>ws<\/code>;<\/li>\n<li>\u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u043c\u0435\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440: \u0431\u0443\u0444\u0435\u0440\u044b <code>RS<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0437\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438, \u0431\u0443\u0444\u0435\u0440\u044b <code>WS<\/code> \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430\u043c\u0438.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a <code>ws<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0431\u0443\u0444\u0435\u0440\u0430 <code>ws<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>ws<\/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><code>pipeTo<\/code> \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 <code>ts.readable<\/code>;<\/li>\n<li><code>ts.readable<\/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><code>ts<\/code> \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0447\u0430\u043d\u043a\u043e\u0432 \u0438\u0437 <code>ts.writable<\/code> \u0432 <code>ts.readable<\/code>;<\/li>\n<li><code>ts.writable<\/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><code>pipeTo<\/code> \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>rs<\/code>;<\/li>\n<li><code>rs<\/code> \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u043c\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443;<\/li>\n<li>\u0431\u0430\u0437\u043e\u0432\u044b\u0439 \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.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 2 \u0432\u0438\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f;<\/li>\n<li>\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u0430\u0445.<\/p>\n<p>  <\/p>\n<h3 id=\"81-signalizaciya-protivodavleniya\">8.1. \u0421\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435. \u0412\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u0438 \u0438\u043c\u0435\u044e\u0442 2 \u0442\u0430\u043a\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>WS<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>write<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>Writer<\/code>;<\/li>\n<li><code>RS<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>enqueue<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>ReadableStreamDefaultController<\/code> \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439. \u0421\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041a\u0430\u043a \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c?<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043e\u0447\u0435\u0440\u0435\u0434\u044c <code>WS<\/code> \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 <code>WritableStreamDefaultController<\/code>;<\/li>\n<li>\u043e\u0447\u0435\u0440\u0435\u0434\u044c <code>RS<\/code> \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 <code>ReadableStreamDefaultController<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0416\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 (desired size) \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e, \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0435 \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 (\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u043a\u043e\u043c\u043d\u0430\u0442\u044b) (room) \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0435\u0441\u043b\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f, \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435;<\/li>\n<li>\u0435\u0441\u043b\u0438 \u043c\u0435\u0441\u0442\u0430 \u043d\u0435\u0442, \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0432\u043d\u043e <code>0<\/code>;<\/li>\n<li>\u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0430, \u0447\u0438\u0441\u043b\u043e \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 <code>&lt;= 0<\/code>. \u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0447\u0435\u0440\u0435\u0437 \u0433\u0435\u0442\u0442\u0435\u0440 <code>desiredSize<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u044c.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440? \u0427\u0435\u0440\u0435\u0437 \u043e\u0431\u044a\u0435\u043a\u0442, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c (queuing strategy). <code>RS<\/code> \u0438 <code>WS<\/code> \u0438\u043c\u0435\u044e\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \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, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <a href=\"https:\/\/streams.spec.whatwg.org\/#dictdef-queuingstrategy\">QueuingStrategy<\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 2 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043c\u0435\u0442\u043e\u0434 <code>size(chunk)<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 <code>chunk<\/code>;<br \/> \n<ul>\n<li>\u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u2014 \u044d\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445\u0441\u044f \u0432 \u043d\u0435\u0439 \u0447\u0430\u043d\u043a\u043e\u0432;<\/li>\n<\/ul>\n<\/li>\n<li>\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>highWaterMark<\/code> (\u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0430) \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \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.<\/li>\n<\/ul>\n<p>  <\/p>\n<p><em>\u0416\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u2014 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u043c\u0438\u043d\u0443\u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0447\u0435\u0440\u0435\u0434\u0438<\/em>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">desiredSize = highWaterMark - [chunks].reduce((x, y) => x + y, 0);<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"82-obrabotka-protivodavleniya\">8.2. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<h4 id=\"821-kod-zapisyvayuschiy-dannye-v-ws-cherez-writer\">8.2.1. \u041a\u043e\u0434, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 <code>WS<\/code> \u0447\u0435\u0440\u0435\u0437 <code>Writer<\/code><\/h4>\n<p>  <\/p>\n<ul>\n<li>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0436\u0434\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043c\u0438\u0441\u0430 \u0432 <code>writer.ready<\/code>. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u041f\u0440\u043e\u043c\u0438\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\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 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>writer.desiredSize<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c;<\/li>\n<li>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b, \u043c\u043e\u0436\u043d\u043e \u0436\u0434\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043c\u0438\u0441\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e <code>writer.write()<\/code>. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0447\u0430\u043d\u043a\u043e\u0432 \u0432 <code>writer.desiredSize<\/code>.<\/p>\n<p>  <\/p>\n<h4 id=\"822-bazovyy-istochnik-rs\">8.2.2. \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a <code>RS<\/code><\/h4>\n<p>  <\/p>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f <code>RS<\/code>, \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a. \u041e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0432\u0435\u043d\u043e\u043c \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u043f\u0435\u0440\u0435\u0434 <code>RS<\/code>.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 pull-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f;<\/li>\n<li>\u0431\u0430\u0437\u043e\u0432\u044b\u0435 push-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c <code>controller.desiredSize<\/code> \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c: \u0435\u0441\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 <code>&lt;=0<\/code>, \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0435\u043c \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432.<\/li>\n<\/ul>\n<p>  <\/p>\n<h4 id=\"823-bazovyy-priemnik-ws\">8.2.3. \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a <code>WS<\/code><\/h4>\n<p>  <\/p>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u0432 <code>WS<\/code>, \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a. \u041e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0432\u0435\u043d\u043e\u043c \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 <code>WS<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 (\u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442). \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043f\u0440\u043e\u043c\u0438\u0441\u0430 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 <code>write<\/code>, \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\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438. \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u043c\u0435\u0435\u0442\u0441\u044f <a href=\"https:\/\/streams.spec.whatwg.org\/#example-ws-backpressure\">\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/a>.<\/p>\n<p>  <\/p>\n<h4 id=\"824-ts-writable-readable\">8.2.4. <code>TS<\/code> (writable-readable)<\/h4>\n<p>  <\/p>\n<p><code>TS<\/code> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043a \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0439. \u041e\u043d \u0438\u043c\u0435\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u043b\u043e\u0442 <code>[[backpressure]]<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041c\u0435\u0442\u043e\u0434 <code>write<\/code> \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0447\u0430\u043d\u043a\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e <code>TS<\/code> (<a href=\"https:\/\/streams.spec.whatwg.org\/#transform-stream-default-sink-write-algorithm\">TransformStreamDefaultSinkWriteAlgorithm<\/a>). \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0447\u0435\u0440\u0435\u0437 <code>TransformStreamDefaultController<\/code>. <em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: <code>write()<\/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\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430. \u0414\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u0438\u0441\u0430 <code>WS<\/code> \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0443\u0435\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0435\u0435 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440;<\/li>\n<li>\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <code>TS<\/code> \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0447\u0430\u043d\u043a \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>TransformStreamDefaultController<\/code> \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0439 ((TransformStreamDefaultControllerEnqueue)[<a href=\"https:\/\/streams.spec.whatwg.org\/#transform-stream-default-controller-enqueue\">https:\/\/streams.spec.whatwg.org\/#transform-stream-default-controller-enqueue<\/a>]);<\/li>\n<li>\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <code>TS<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 <code>Reader<\/code> ((ReadableStreamDefaultReaderRead)[<a href=\"https:\/\/streams.spec.whatwg.org\/#readable-stream-default-reader-read\">https:\/\/streams.spec.whatwg.org\/#readable-stream-default-reader-read<\/a>]);<br \/> \n<ul>\n<li>\u0435\u0441\u043b\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u043d\u0430\u0442\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>pull()<\/code> ((<code>[[PullSteps]]<\/code>)[<a href=\"https:\/\/streams.spec.whatwg.org\/#rs-default-controller-private-pull\">https:\/\/streams.spec.whatwg.org\/#rs-default-controller-private-pull<\/a>]);<\/li>\n<li><code>pull()<\/code> \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 ((TransformStreamDefaultSourcePullAlgorithm)[<a href=\"https:\/\/streams.spec.whatwg.org\/#transform-stream-default-source-pull\">https:\/\/streams.spec.whatwg.org\/#transform-stream-default-source-pull<\/a>]).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<h4 id=\"825-pipeto-rs---ws\">8.2.5. <code>pipeTo()<\/code> (RS -> WS)<\/h4>\n<p>  <\/p>\n<p><code>pipeTo()<\/code> \u0447\u0438\u0442\u0430\u0435\u0442 \u0447\u0430\u043d\u043a\u0438 \u0438\u0437 <code>RS<\/code> \u0447\u0435\u0440\u0435\u0437 <code>Reader<\/code> \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 <code>WS<\/code> \u0447\u0435\u0440\u0435\u0437 <code>Writer<\/code>. \u041e\u043d \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 <code>writer.desiredSize &lt;= 0<\/code> (\u0448\u0430\u0433 15 (ReadableStreamPipeTo)[<a href=\"https:\/\/streams.spec.whatwg.org\/#readable-stream-pipe-to\">https:\/\/streams.spec.whatwg.org\/#readable-stream-pipe-to<\/a>]).<\/p>\n<p>  <\/p>\n<h2 id=\"9-potoki-baytov\">9. \u041f\u043e\u0442\u043e\u043a\u0438 \u0431\u0430\u0439\u0442\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445, \u043f\u043e\u0442\u043e\u043a\u0430\u0445, \u0447\u0430\u043d\u043a\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u041d\u043e <code>Web streams API<\/code> \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u0438 \u0431\u0430\u0439\u0442\u043e\u0432 \u0434\u043b\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0433\u0434\u0435 \u0447\u0430\u043d\u043a\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <code>Uint8Arrays<\/code> (\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438):<\/p>\n<p>  <\/p>\n<ul>\n<li><code>RS<\/code> \u0438\u043c\u0435\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c (mode) <code>bytes<\/code>;<\/li>\n<li>\u0434\u043b\u044f <code>WS<\/code> \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u0447\u0435\u043c \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u043d\u043a\u0438, \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 <code>Uint8Arrays<\/code>. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u0430\u043a\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>WS<\/code> \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a;<\/li>\n<li>\u043a\u0430\u043a\u043e\u0439 \u0432\u0438\u0434 \u0447\u0430\u043d\u043a\u043e\u0432 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c <code>TS<\/code> \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0435\u0433\u043e <code>Transformer<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<h3 id=\"91-dostupnyy-dlya-chteniya-potok-baytov\">9.1. \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u0422\u0438\u043f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c <code>RS<\/code> \u043f\u043e\u0442\u043e\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>type<\/code> \u0435\u0433\u043e \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>underlyingSource<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0435\u0441\u043b\u0438 <code>type<\/code> \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d \u0438\u043b\u0438 <code>underlyingSource<\/code> \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d, \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a;<\/li>\n<li>\u0435\u0441\u043b\u0438 <code>type<\/code> \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>\"bytes\"<\/code> (\u0441\u0442\u0440\u043e\u043a\u0430), \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432:<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"javascript\">const readableByteStream = new RS({   type: \"bytes\",   async start() {}   \/\/ ... });<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u0447\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u0440\u0435\u0436\u0438\u043c <code>bytes<\/code>?<\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0432\u0438\u0434 \u0447\u0430\u043d\u043a\u043e\u0432. \u0412 &#171;\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u043c&#187; \u0440\u0435\u0436\u0438\u043c\u0435 \u0447\u0430\u043d\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c <code>ArrayBufferViews<\/code>, \u0442.\u0435. <code>TypedArrays<\/code> (\u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a <code>Uint8Arrays<\/code>) \u0438\u043b\u0438 <code>DataViews<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c 2 \u0432\u0438\u0434\u0430 <code>Reader<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>getReader()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>ReadableStreamDefaultReader<\/code>;<\/li>\n<li><code>getReader({ mode: \"byob\" })<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>ReadableStreamBYOBReader<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p><code>BYOB<\/code> \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a <code>Bring Your Own Buffer<\/code> (\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440) \u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440 (<code>ArrayBufferView<\/code>) \u0432 <code>reader.read()<\/code>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0439 <code>ArrayBufferView<\/code> \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u041e\u0434\u043d\u0430\u043a\u043e <code>read()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043d\u043e\u0432\u043e\u0433\u043e <code>ArrayBufferView<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f \u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0442\u043e\u0439 \u0436\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0433\u043e <code>ArrayBuffer<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0438 \u0431\u0430\u0439\u0442\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b: \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u043c\u0438 <code>ReadableByteStreamController<\/code> (\u0430 \u043d\u0435 <code>ReadableStreamDefaultController<\/code>). \u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u0438\u043d\u0443\u0436\u0434\u0435\u043d\u0438\u044f (forcing) \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c <code>ArrayBufferViews<\/code> (<code>TypedArrays<\/code> \u0438\u043b\u0438 <code>DataViews<\/code>), \u043e\u043d\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 <code>ReadableStreamBYOBReaders<\/code> \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <a href=\"https:\/\/streams.spec.whatwg.org\/#rbs-controller-prototype\">byobRequest<\/a>. \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e <a href=\"https:\/\/streams.spec.whatwg.org\/#creating-examples\"><code>2 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f byobRequest<\/code><\/a>.<\/p>\n<p>  <\/p>\n<h3 id=\"92-primer-beskonechnyy-dostupnyy-dlya-chteniya-potok-baytov-zapolnyaemyy-proizvolnymi-dannymi\">9.2. \u041f\u0440\u0438\u043c\u0435\u0440: \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/h3>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0447\u0430\u043d\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import { promisify } from \"node:util\"; import { randomFill } from \"node:crypto\";  const asyncRandomFill = promisify(randomFill);  const readableByteStream = new RS({   type: \"bytes\",    async pull(controller) {     const byobRequest = controller.byobRequest;      await asyncRandomFill(byobRequest.view);      byobRequest.respond(byobRequest.view.byteLength);   }, });  const reader = readableByteStream.getReader({ mode: \"byob\" });  const buffer = new Uint8Array(10); \/\/ (1)  const firstChunk = await reader.read(buffer); \/\/ (2) console.log(firstChunk);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>readableByteStream<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0446\u0438\u043a\u043b\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0447\u0430\u043d\u043a (2).<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 (1) \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 <code>reader.read()<\/code> (2) \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<h3 id=\"93-primer-szhatie-dostupnogo-dlya-chteniya-potoka-baytov\">9.3. \u041f\u0440\u0438\u043c\u0435\u0440: \u0441\u0436\u0430\u0442\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0431\u0430\u0439\u0442\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0442\u043e\u043a, \u0441\u0436\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 <code>GZIP<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const readableByteStream = new RS({   type: \"bytes\",    start(controller) {     \/\/ 256 \u043d\u0443\u043b\u0435\u0439     controller.enqueue(new Uint8Array(256));     controller.close();   }, });  const transformedStream = readableByteStream.pipeThrough(   new CompressionStream(\"gzip\"));  await logChunks(transformedStream);  async function logChunks(readableByteStream) {   const reader = transformedStream.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<h3 id=\"94-primer-chtenie-veb-stranicy-s-pomoschyu-fetch\">9.4. \u041f\u0440\u0438\u043c\u0435\u0440: \u0447\u0442\u0435\u043d\u0438\u0435 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>fetch()<\/code><\/h3>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 <code>fetch()<\/code> \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u0430, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>body<\/code> \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>TextDecoderStream<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const response = await fetch(\"https:\/\/example.com\"); const readableByteStream = response.body;  const readableStream = readableByteStream.pipeThrough(   new TextDecoderStream(\"utf-8\"));  for await (const stringChunk of readableStream) {   console.log(stringChunk); }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"10-specifichnye-dlya-nodejs-vspomogatelnye-funkcii\">10. \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f <code>Node.js<\/code> \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h2>\n<p>  <\/p>\n<p><code>Node.js<\/code> \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u043c\u0435\u043d\u0443\u0435\u043c\u044b\u0435 <a href=\"https:\/\/nodejs.org\/api\/webstreams.html#utility-consumers\">utility consumers<\/a> (\u0443\u0442\u0438\u043b\u0438\u0442\u0430\u043c\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f?):<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import {   arrayBuffer,   blob,   buffer,   json,   text, } from \"node:stream\/consumers\";<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0432\u0435\u0431 <code>RS<\/code>, <code>Readables<\/code> <code>Node.js<\/code> \u0438 <code>AsyncIterators<\/code> \u0432 \u043f\u0440\u043e\u043c\u0438\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>ArrayBuffers<\/code> \u2014 <code>arrayBuffer()<\/code>;<\/li>\n<li><code>Blobs<\/code> \u2014 <code>blob()<\/code>;<\/li>\n<li>\u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438 <code>Node.js<\/code> \u2014 <code>buffer()<\/code>;<\/li>\n<li>\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 <code>JSON<\/code> \u2014 <code>json()<\/code>;<\/li>\n<li>\u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u2014 <code>text()<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 <code>UTF-8<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import * as streamConsumers from \"node:stream\/consumers\";  const readableByteStream = new RS({   type: \"bytes\",    start(controller) {     \/\/ TextEncoder \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432  Uint8Arrays \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 UTF-8     const encoder = new TextEncoder();      const view = encoder.encode(`\"?\"`);      assert.deepEqual(       view,       Uint8Array.of(34, 240, 159, 152, 128, 34)     );      controller.enqueue(view);      controller.close();   }, });  const jsonData = await streamConsumers.json(readableByteStream);  assert.equal(jsonData, \"?\");<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import * as streamConsumers from \"node:stream\/consumers\";  const readableByteStream = new RS({   start(controller) {     controller.enqueue(`\"?\"`);      controller.close();   }, });  const jsonData = await streamConsumers.json(readableByteStream);  assert.equal(jsonData, \"?\");<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b <code>API<\/code> \u0432\u0435\u0431-\u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0412\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/2ality.com\/2022\/06\/web-streams-nodejs.html#further-reading\">\u0441\u0441\u044b\u043b\u043e\u043a \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u044b, \u043a\u0430\u043a \u0438 \u044f, \u0443\u0437\u043d\u0430\u043b\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435 \u0438 \u043d\u0435 \u0436\u0430\u043b\u0435\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/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\/676210\/\"> https:\/\/habr.com\/ru\/company\/timeweb\/blog\/676210\/<\/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 \u0432\u0442\u043e\u0440\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><a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/675676\/\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/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-335555","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335555","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=335555"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335555\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=335555"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=335555"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=335555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}