사용자:Hsl0/연구소/숫자야구 live/실시간-json.js

리버티게임, 모두가 만들어가는 자유로운 게임

참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.

  • 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
  • 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
  • 인터넷 익스플로러 / 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
  • 오페라: Ctrl-F5를 입력.
import {LiveClient} from '/w/index.php?title=사용자:Hsl0/연구소/숫자야구_live/실시간.js&action=raw&ctype=text/javascript';

const CLIENTS = Symbol('clients_list');

export class JSONHandler {
	constructor(clients, actions = {}, config = {}) {
		this.actions = actions;
		if(config.handle) this.handle = config.handle;
		this.handle = this.handle.bind(this);
		this[CLIENTS] = new Set();
		
		if(clients) this.connect(clients);
	}
	
	get clients() {
		return [...this[CLIENTS]];
	}
	
	set(action, handler) {
		if(typeof action === 'object') Object.assign(this.actions, action);
		else if(typeof handler === 'function') this.actions[action] = handler;
		else throw new TypeError('set 메소드에 올바른 인자를 넣지 않았습니다');
		
		return this;
	}
	remove(action) {
		if(typeof action === 'string' || typeof action === 'number') delete this.actions[action];
		else throw new TypeError('올바른 동작 이름이 아닙니다');
		
		return this;
	}
	handle({detail}) {
		for(const rev of detail.revisions) {
			if(rev.contentmodel && rev.contentmodel !== 'json') continue;
			const content = JSON.parse(rev.content);
			this.actions[content.action](content, rev);
		}
	}
	connect(...clients) {
		if(clients[0][Symbol.iterator]) clients = clients[0];
		
		for(const client of clients) {
			if(!(client instanceof LiveClient)) throw new TypeError('JSONHandler에 LiveClient가 아닌 객체를 연결하려 시도했습니다');
			if(this[CLIENTS].has(client)) continue;
			
			this[CLIENTS].add(client);
			client.addEventListener('update', this.handle);
		}
		
		return this;
	}
	disconnect(...clients) {
		if(clients[0][Symbol.iterator]) clients = clients[0];
		if(clients.length <= 0) clients = this.clients;
		
		for(const client of clients) {
			if(!(client instanceof LiveClient)) throw new TypeError('JSONHandler에 LiveClient가 아닌 객체를 연결하려 시도했습니다');
			if(!this[CLIENTS].has(client)) continue;
			
			client.removeEventListener('update', this.handle);
			this[CLIENTS].delete(client);
		}
		
		return this;
	}
}

export * from '/w/index.php?title=사용자:Hsl0/연구소/숫자야구_live/실시간.js&action=raw&ctype=text/javascript';