diff --git a/game/game.js b/game/game.js index 1b642b754..257a41015 100644 --- a/game/game.js +++ b/game/game.js @@ -354,6 +354,83 @@ } }], }, + /** + * **无名杀频道推送机制** + * + * 模拟`Golang`的`channel`,仅保留部分特征 + * + * @template T + */ + channel: class { + constructor() { + /** + * @type {"active" | "receiving" | "sending"} + */ + this.status = "active"; + + /** + * @type {Promise | [T, Promise] | null} + */ + this._buffer = null; + } + + /** + * @param {T} value + * @returns {Promise} + */ + send(value) { + return new Promise((resolve, reject) => { + switch (this.status) { + case "sending": + // TODO: handle the error. + reject(new Error()); + break; + case "receiving": + /** + * @type {Promise} + */ + const buffer = this._buffer; + this._buffer = null; + buffer(value); + this.status = "active"; + resolve(); + break ; + case "active": + this.status = "sending"; + this._buffer = [value, resolve]; + break; + } + }); + } + + /** + * @returns {Promise} + */ + receive() { + return new Promise((resolve, reject) => { + switch (this.status) { + case "receiving": + // TODO: handle the error. + reject(new Error()); + break; + case "sending": + /** + * @type {[T, Promise]} + */ + const buffer = this._buffer; + this._buffer = null; + resolve(buffer[0]); + this.status = "active"; + buffer[1](); + break ; + case "active": + this.status = "receiving"; + this._buffer = resolve; + break; + } + }); + } + }, /** * **无名杀消息推送库** *