Делал что-то подобное, решение свелось к созданию набора процедур отрисовывающих что-то на канвасе, и синхронизирующегося хранилища (заюзал PouchDB).
Иными словами, когда пользователь например ставит точку с координатами [1,1] (читай MouseEvent {x: 1, y: 1}), мы сначала пишем документ { type: 'point', x: 1, y: 1 }, сохраняем в базу и оповещаем клиентов (включая себя). И только после того как документ сохранился и пришёл на клиенты, вызываем ctx.arc(...