-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRoomsConfigManager.js
115 lines (93 loc) · 4 KB
/
RoomsConfigManager.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/* @flow */
import { ConfigManagerClass } from './ConfigManager';
import type {
ThingMetadataType,
ThingStateType,
ConfigChangeCallbackType,
ConfigType
} from './ConfigManager';
export type RoomConfigChangeCallbackType = (roomId: string, config: ConfigType) => any;
export type RoomThingStateChangeCallbackType = (roomId: string, meta: ThingMetadataType, state: ThingStateType) => any;
class RoomConfigManagerClass {
_SocketLibrary: Object;
_configChangeCallbacks: Array<RoomConfigChangeCallbackType> = [];
_thingStateChangeCallbacks: Array<RoomThingStateChangeCallbackType> = [];
_configManagers: {[string]: ConfigManagerClass} = {}; // room name -> config manager
initialize(socketLibrary: Object) {
this._SocketLibrary = socketLibrary;
this._SocketLibrary.setOnMessage(this.onMiddlewareUpdate.bind(this));
}
reset() {
for (var key in this._configManagers)
this._configManagers[key].reset();
}
onMiddlewareUpdate(update: Object) {
update = JSON.parse(JSON.stringify(update));
if (!("__room_id" in update)) // no room, no deal
return;
var room = update.__room_id;
if (room in this._configManagers) {
delete update.__room_id;
this._configManagers[room].onMiddlewareUpdate(update);
}
}
createCustomSendFunc(roomId: string): ((Object, ?boolean, ?boolean) => any) {
return (msg, b1, b2) => this._SocketLibrary.sendMessage({...msg, __room_id: roomId}, b1, b2);
}
addRoom(roomId: string) {
if (!(roomId in this._configManagers)) {
this._configManagers[roomId] = new ConfigManagerClass();
this._configManagers[roomId].initialize(this._SocketLibrary, this.createCustomSendFunc(roomId));
this._SocketLibrary.setOnMessage(this.onMiddlewareUpdate.bind(this)); // reset this to us
this._configManagers[roomId].registerThingStateChangeCallback('__all', (meta, state) => this.onThingStateChange(roomId, meta, state))
this._configManagers[roomId].registerConfigChangeCallback(cfg => this.onConfigChange(roomId, cfg));
}
}
getConfigManager(roomId: string): ConfigManagerClass {
return this._configManagers[roomId];
}
CM(roomId: string): ConfigManagerClass {
return this._configManagers[roomId];
}
onConfigChange(roomId: string, config: ConfigType) {
for (var i = 0; i < this._configChangeCallbacks.length; i++) {
this._configChangeCallbacks[i] (roomId, config);
}
}
onThingStateChange(roomId: string, meta: ThingMetadataType, state: ThingStateType) {
for (var i = 0; i < this._thingStateChangeCallbacks.length; i++) {
this._thingStateChangeCallbacks[i] (roomId, meta, state);
}
}
registerConfigChangeCallback(cb: RoomConfigChangeCallbackType): () => boolean {
this._configChangeCallbacks.push(cb);
return () => this.deregisterConfigChangeCallback(cb);
}
deregisterConfigChangeCallback(cb: RoomConfigChangeCallbackType): boolean {
for (var c = 0; c < this._configChangeCallbacks.length; c++) {
if (this._configChangeCallbacks[c] == cb) {
this._configChangeCallbacks.splice(c, 1);
return true;
}
}
return false;
}
registerRoomChangeCallback(cb: RoomThingStateChangeCallbackType): () => boolean {
this._thingStateChangeCallbacks.push(cb);
return () => this.deregisterRoomChangeCallback(cb);
}
deregisterRoomChangeCallback(cb: RoomThingStateChangeCallbackType): boolean {
for (var i = 0; i < this._thingStateChangeCallbacks.length; i++) {
if (this._thingStateChangeCallbacks[i] == cb) {
this._thingStateChangeCallbacks.splice(i, 1);
return true;
}
}
return false;
}
};
const RoomConfigManager = new RoomConfigManagerClass();
module.exports = {
RoomConfigManager,
RoomConfigManagerClass,
};