Що таке Duplex stream?
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, який можна успадкувати:
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();Результат:
Прочитано: Привіт
Прочитано: з
Прочитано: 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()
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.