From c614e6f5d73b3b4314c7f6abf52260e58cc176ad Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 17 Nov 2017 01:24:44 +0900 Subject: #925, #926, and refactoring --- .../app/common/scripts/streaming/stream-manager.ts | 73 ++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/web/app/common/scripts/streaming/stream-manager.ts (limited to 'src/web/app/common/scripts/streaming/stream-manager.ts') diff --git a/src/web/app/common/scripts/streaming/stream-manager.ts b/src/web/app/common/scripts/streaming/stream-manager.ts new file mode 100644 index 0000000000..de27235426 --- /dev/null +++ b/src/web/app/common/scripts/streaming/stream-manager.ts @@ -0,0 +1,73 @@ +import { EventEmitter } from 'eventemitter3'; +import * as uuid from 'uuid'; +import Connection from './stream'; + +/** + * ストリーム接続を管理するクラス + * 複数の場所から同じストリームを利用する際、接続をまとめたりする + */ +export default abstract class StreamManager extends EventEmitter { + protected _connection: T = null; + + /** + * コネクションを必要としているユーザー + */ + private users = []; + + protected set connection(connection: T) { + this._connection = connection; + + if (this._connection == null) { + this.emit('disconnected'); + } else { + this.emit('connected', this._connection); + } + } + + protected get connection() { + return this._connection; + } + + /** + * コネクションを持っているか否か + */ + public get hasConnection() { + return this._connection != null; + } + + /** + * コネクションを要求します + */ + public abstract getConnection(): T; + + public borrow() { + return this._connection; + } + + /** + * コネクションを要求するためのユーザーIDを発行します + */ + public use() { + // ユーザーID生成 + const userId = uuid(); + + this.users.push(userId); + + return userId; + } + + /** + * コネクションを利用し終わってもう必要ないことを通知します + * @param userId use で発行したユーザーID + */ + public dispose(userId) { + this.users = this.users.filter(id => id != userId); + + // 誰もコネクションの利用者がいなくなったら + if (this.users.length == 0) { + // コネクションを切断する + this.connection.close(); + this.connection = null; + } + } +} -- cgit v1.2.3-freya From bb0f9d5de9298d7629aeb091cfe737080e2cfd4f Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 17 Nov 2017 01:30:15 +0900 Subject: Fix access level --- src/web/app/common/scripts/streaming/stream-manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/web/app/common/scripts/streaming/stream-manager.ts') diff --git a/src/web/app/common/scripts/streaming/stream-manager.ts b/src/web/app/common/scripts/streaming/stream-manager.ts index de27235426..98dbcf9d8d 100644 --- a/src/web/app/common/scripts/streaming/stream-manager.ts +++ b/src/web/app/common/scripts/streaming/stream-manager.ts @@ -7,7 +7,7 @@ import Connection from './stream'; * 複数の場所から同じストリームを利用する際、接続をまとめたりする */ export default abstract class StreamManager extends EventEmitter { - protected _connection: T = null; + private _connection: T = null; /** * コネクションを必要としているユーザー -- cgit v1.2.3-freya From 96d2aadd703ec5db6dba1323b22ae37f338e0a93 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 17 Nov 2017 01:30:47 +0900 Subject: Add note --- src/web/app/common/scripts/streaming/stream-manager.ts | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/web/app/common/scripts/streaming/stream-manager.ts') diff --git a/src/web/app/common/scripts/streaming/stream-manager.ts b/src/web/app/common/scripts/streaming/stream-manager.ts index 98dbcf9d8d..1383b97828 100644 --- a/src/web/app/common/scripts/streaming/stream-manager.ts +++ b/src/web/app/common/scripts/streaming/stream-manager.ts @@ -40,6 +40,9 @@ export default abstract class StreamManager extends EventE */ public abstract getConnection(): T; + /** + * 現在接続しているコネクションを取得します + */ public borrow() { return this._connection; } -- cgit v1.2.3-freya From 3ca3cd8d650a690a314feaf18373c0fce48aad90 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 17 Nov 2017 21:14:03 +0900 Subject: #928 --- src/web/app/common/scripts/streaming/stream-manager.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'src/web/app/common/scripts/streaming/stream-manager.ts') diff --git a/src/web/app/common/scripts/streaming/stream-manager.ts b/src/web/app/common/scripts/streaming/stream-manager.ts index 1383b97828..23ad48970e 100644 --- a/src/web/app/common/scripts/streaming/stream-manager.ts +++ b/src/web/app/common/scripts/streaming/stream-manager.ts @@ -9,6 +9,8 @@ import Connection from './stream'; export default abstract class StreamManager extends EventEmitter { private _connection: T = null; + private disposeTimerId: any; + /** * コネクションを必要としているユーザー */ @@ -51,6 +53,12 @@ export default abstract class StreamManager extends EventE * コネクションを要求するためのユーザーIDを発行します */ public use() { + // タイマー解除 + if (this.disposeTimerId) { + clearTimeout(this.disposeTimerId); + this.disposeTimerId = null; + } + // ユーザーID生成 const userId = uuid(); @@ -68,9 +76,12 @@ export default abstract class StreamManager extends EventE // 誰もコネクションの利用者がいなくなったら if (this.users.length == 0) { - // コネクションを切断する - this.connection.close(); - this.connection = null; + // また直ぐに再利用される可能性があるので、一定時間待ち、 + // 新たな利用者が現れなければコネクションを切断する + this.disposeTimerId = setTimeout(() => { + this.connection.close(); + this.connection = null; + }, 3000); } } } -- cgit v1.2.3-freya From 918f2cf6cf64663048ab78af349818b0f33d5455 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 17 Nov 2017 21:17:30 +0900 Subject: :v: --- src/web/app/common/scripts/streaming/stream-manager.ts | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/web/app/common/scripts/streaming/stream-manager.ts') diff --git a/src/web/app/common/scripts/streaming/stream-manager.ts b/src/web/app/common/scripts/streaming/stream-manager.ts index 23ad48970e..5bb0dc701c 100644 --- a/src/web/app/common/scripts/streaming/stream-manager.ts +++ b/src/web/app/common/scripts/streaming/stream-manager.ts @@ -79,6 +79,8 @@ export default abstract class StreamManager extends EventE // また直ぐに再利用される可能性があるので、一定時間待ち、 // 新たな利用者が現れなければコネクションを切断する this.disposeTimerId = setTimeout(() => { + this.disposeTimerId = null; + this.connection.close(); this.connection = null; }, 3000); -- cgit v1.2.3-freya