diff --git a/src/client/app/common/scripts/stream.ts b/src/client/app/common/scripts/stream.ts index b866baba7..3fbfa4b63 100644 --- a/src/client/app/common/scripts/stream.ts +++ b/src/client/app/common/scripts/stream.ts @@ -46,6 +46,11 @@ export default class Stream extends EventEmitter { this.sharedConnections = this.sharedConnections.filter(c => c !== connection); } + @autobind + public removeSharedConnectionPool(pool: Pool) { + this.sharedConnectionPools = this.sharedConnectionPools.filter(p => p !== pool); + } + @autobind public connectToChannel(channel: string, params?: any): NonSharedConnection { const connection = new NonSharedConnection(this, channel, params); @@ -71,9 +76,7 @@ export default class Stream extends EventEmitter { // チャンネル再接続 if (isReconnect) { this.sharedConnectionPools.forEach(p => { - if (p.users > 0) { - p.connect(); - } + p.connect(); }); this.nonSharedConnections.forEach(c => { c.connect(); @@ -152,6 +155,13 @@ class Pool { this.stream = stream; this.id = Math.random().toString(); + + this.stream.on('_disconnected_', this.onStreamDisconnected); + } + + @autobind + private onStreamDisconnected() { + this.isConnected = false; } @autobind @@ -185,6 +195,7 @@ class Pool { @autobind public connect() { + if (this.isConnected) return; this.isConnected = true; this.stream.send('connect', { channel: this.channel, @@ -194,9 +205,9 @@ class Pool { @autobind private disconnect() { - this.isConnected = false; - this.disposeTimerId = null; + this.stream.off('_disconnected_', this.onStreamDisconnected); this.stream.send('disconnect', { id: this.id }); + this.stream.removeSharedConnectionPool(this); } }