Skip to main content

Що таке 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, який можна успадкувати:

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

Хоча обидва можуть читати й писати, різниця така:

КритерійDuplexTransform
Зв'язок між входом і виходомНезалежніВхід перетворюється у вихід
ПрикладTCP socketgzip-стиснення, JSON-парсинг
Методи_read() + _write()_transform()

Приклади вбудованих Duplex-потоків

МодульПриклад
netnet.Socket (двостороння передача даних)
tlstls.TLSSocket
cryptocrypto.Cipher, crypto.Decipher
zlibzlib.Deflate, zlib.Inflate

Переваги Duplex Streams

  • Двостороння комунікація (читання й запис одночасно)
  • Використовується для мережевих і шифрувальних операцій
  • Ефективна обробка великих обсягів даних
  • Можна комбінувати з іншими потоками через .pipe()

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.