diff --git a/.nvmrc b/.nvmrc index f64b6e4..dae199a 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v12 \ No newline at end of file +v12 diff --git a/src/ObjectMultiplex.ts b/src/ObjectMultiplex.ts index 07e0f04..b4f9a6a 100644 --- a/src/ObjectMultiplex.ts +++ b/src/ObjectMultiplex.ts @@ -23,6 +23,16 @@ export class ObjectMultiplex extends Duplex { } createStream(name: string): Substream { + // guard stream against destroyed already + if (this.destroyed) { + throw new Error('ObjectMultiplex - parent stream already destroyed'); + } + + // guard stream against ended already + if (this._readableState.ended || this._writableState.ended) { + throw new Error('ObjectMultiplex - parent stream already ended'); + } + // validate name if (!name) { throw new Error('ObjectMultiplex - name must not be empty'); diff --git a/test/index.js b/test/index.js index df85139..5f45690 100644 --- a/test/index.js +++ b/test/index.js @@ -79,6 +79,28 @@ test('roundtrip', (t) => { setTimeout(() => outTransport.destroy(), 100); }); +test('error on createStream if destroyed', (t) => { + const stream = new ObjMultiplex(); + stream.destroy(); + try { + stream.createStream('controller'); + } catch (e) { + t.assert(e.message.includes('already destroyed'), true); + t.end(); + } +}); + +test('error on createStream if ended', (t) => { + const stream = new ObjMultiplex(); + stream.end(); + try { + stream.createStream('controller'); + } catch (e) { + t.assert(e.message.includes('already ended'), true); + t.end(); + } +}); + // util function basicTestSetup() {