Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке Duplex stream?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Duplex Stream** - потік, що одночасно є Readable і Writable, тобто може і читати, і записувати дані; типовий приклад - TCP-сокет (`net.Socket`), де читання й запис відбуваються незалежно, через два окремі внутрішні буфери. **Ключове:** на відміну від Transform, у Duplex вхід і вихід **не пов'язані** - те, що записали, і те, що прочитали, це різні, незалежні потоки даних.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Duplex Stream** - це потік у Node.js, який **одночасно є і Readable, і Writable**, тобто може **і читати, і записувати дані**. Якщо `Readable` - джерело даних, а `Writable` - приймач, то `Duplex` поєднує обидві ролі - і джерело, і приймач в одному об'єкті. ## Приклад із реального життя Можна уявити Duplex Stream як **двосторонню трубу**: з одного кінця в неї щось записують, а з іншого - зчитують. Так працює, наприклад: - TCP-сокет (`net.Socket`) - WebSocket-з'єднання - `process.stdin` + `process.stdout` у деяких контекстах - `crypto.createCipher()` / `createDecipher()` (шифрування/дешифрування) ## Схема відношень потоків | Тип потоку | Може читати? | Може писати? | |---|---|---| | Readable | Так | Ні | | Writable | Ні | Так | | Duplex | Так | Так | | Transform | Так | Так (але змінює дані під час проходження) | ## Приклад Duplex Stream Node.js надає базовий клас `stream.Duplex`, який можна успадкувати: ```javascript const { Duplex } = require('stream'); class MyDuplex extends Duplex { constructor(options) { super(options); this.data = ['Привіт', 'з', 'Duplex!']; } // Реалізація читання _read() { if (this.data.length === 0) { this.push(null); // сигнал завершення } else { const chunk = this.data.shift(); this.push(chunk); } } // Реалізація запису _write(chunk, encoding, callback) { console.log('Записано:', chunk.toString()); callback(); // обов'язково викликати callback! } } const duplex = new MyDuplex(); duplex.on('data', (chunk) => { console.log('Прочитано:', chunk.toString()); }); duplex.write('Hello'); duplex.write('World'); duplex.end(); ``` **Результат:** ```javascript Прочитано: Привіт Прочитано: з Прочитано: Duplex! Записано: Hello Записано: World ``` ## Як працює Duplex Stream Duplex-потік має **два незалежні буфери**: - один для читання (`readableBuffer`), - інший для запису (`writableBuffer`). Це означає, що запис і читання можуть відбуватися **асинхронно й незалежно**: дані можна писати в потік, не чекаючи, поки він щось прочитає, і навпаки. ## Duplex vs Transform Хоча обидва можуть читати й писати, різниця така: | Критерій | Duplex | Transform | |---|---|---| | Зв'язок між входом і виходом | Незалежні | Вхід перетворюється у вихід | | Приклад | TCP socket | gzip-стиснення, JSON-парсинг | | Методи | `_read()` + `_write()` | `_transform()` | ## Приклади вбудованих Duplex-потоків | Модуль | Приклад | |---|---| | `net` | `net.Socket` (двостороння передача даних) | | `tls` | `tls.TLSSocket` | | `crypto` | `crypto.Cipher`, `crypto.Decipher` | | `zlib` | `zlib.Deflate`, `zlib.Inflate` | ## Переваги Duplex Streams - Двостороння комунікація (читання й запис одночасно) - Використовується для мережевих і шифрувальних операцій - Ефективна обробка великих обсягів даних - Можна комбінувати з іншими потоками через `.pipe()`Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.