4
4
import json
5
5
from observablecollections .observablelist import ObservableList
6
6
import traceback
7
+ from collections import defaultdict
7
8
8
9
g_components = {}
9
10
g_instances = {}
@@ -156,11 +157,11 @@ def call_watcher(o, k):
156
157
if callable (watcher ):
157
158
watcher (getattr (o , k ))
158
159
159
- all = []
160
+ all = defaultdict ( lambda : set ([]))
160
161
KEY_ATOMIC = '_v_ATOMIC'
161
162
async def broadcast_update (id , k , v ):
162
- a = all .copy ()
163
- all [:] = []
163
+ a = all [ id ] .copy ()
164
+ all [id ]. clear ()
164
165
if k == KEY_ATOMIC :
165
166
comm = 'ATOMIC'
166
167
else :
@@ -170,7 +171,7 @@ async def broadcast_update(id, k, v):
170
171
v = sanitize (v )
171
172
await ws .send (comm + ' ' + str (id )+ ' ' + str (k )+ ' ' + json .dumps (v ))
172
173
info ('OUT' , comm , id , k , '{:.80} ...' .format (json .dumps (v )))
173
- all . append (ws )
174
+ all [ id ]. add (ws )
174
175
except :
175
176
pass
176
177
@@ -181,16 +182,15 @@ def next_instance_id():
181
182
return str (_previd [0 ])
182
183
183
184
async def handleClient (websocket , path ):
184
- # TODO: these all should be per-id? to avoid unncessary calls?
185
185
# TODO: cleanup g_instances (on socket disconnect at least)
186
- all .append (websocket )
187
186
try :
188
187
while True :
189
188
comm = await websocket .recv ()
190
189
if comm == 'INIT' or comm == 'INFO' :
191
190
clss_name = await websocket .recv ()
192
191
info ('IN' , comm , clss_name )
193
192
if clss_name == 'ROOT' :
193
+ all [clss_name ].add (websocket )
194
194
id = clss_name
195
195
o = g_instances [id ]
196
196
clss = type (o )
@@ -201,6 +201,7 @@ async def handleClient(websocket, path):
201
201
clss = g_components [clss_name ]
202
202
o = clss ()
203
203
id = next_instance_id ()
204
+ all [id ].add (websocket )
204
205
setattr (o , '__id' , id )
205
206
setup_model_object_infra (o )
206
207
g_instances [id ] = o
0 commit comments