@@ -10,6 +10,7 @@ import (
1010 "reflect"
1111 "strconv"
1212 "strings"
13+ "sync"
1314
1415 "github.com/google/uuid"
1516 "github.com/wavetermdev/waveterm/tsunami/rpctypes"
@@ -30,6 +31,7 @@ type RootElem struct {
3031 EffectWorkQueue []* vdom.EffectWorkElem
3132 NeedsRenderMap map [string ]bool
3233 Atoms map [string ]* vdom.Atom
34+ atomLock sync.Mutex
3335 RefOperations []rpctypes.VDomRefOperation
3436}
3537
@@ -44,6 +46,20 @@ func (r *RootElem) AddEffectWork(id string, effectIndex int) {
4446 r .EffectWorkQueue = append (r .EffectWorkQueue , & vdom.EffectWorkElem {Id : id , EffectIndex : effectIndex })
4547}
4648
49+ func (r * RootElem ) GetDataMap () map [string ]any {
50+ r .atomLock .Lock ()
51+ defer r .atomLock .Unlock ()
52+
53+ result := make (map [string ]any )
54+ for atomName , atom := range r .Atoms {
55+ if strings .HasPrefix (atomName , "$data." ) {
56+ strippedName := strings .TrimPrefix (atomName , "$data." )
57+ result [strippedName ] = atom .Val
58+ }
59+ }
60+ return result
61+ }
62+
4763func MakeRoot () * RootElem {
4864 return & RootElem {
4965 Root : nil ,
@@ -53,7 +69,7 @@ func MakeRoot() *RootElem {
5369 }
5470}
5571
56- func (r * RootElem ) GetAtom (name string ) * vdom.Atom {
72+ func (r * RootElem ) ensureAtomNoLock (name string ) * vdom.Atom {
5773 atom , ok := r .Atoms [name ]
5874 if ! ok {
5975 atom = & vdom.Atom {UsedBy : make (map [string ]bool )}
@@ -62,12 +78,47 @@ func (r *RootElem) GetAtom(name string) *vdom.Atom {
6278 return atom
6379}
6480
81+
82+ func (r * RootElem ) AtomSetUsedBy (atomName string , waveId string , used bool ) {
83+ r .atomLock .Lock ()
84+ defer r .atomLock .Unlock ()
85+
86+ atom := r .ensureAtomNoLock (atomName )
87+ if used {
88+ atom .UsedBy [waveId ] = true
89+ } else {
90+ delete (atom .UsedBy , waveId )
91+ }
92+ }
93+
94+ func (r * RootElem ) AtomAddRenderWork (atomName string ) {
95+ r .atomLock .Lock ()
96+ defer r .atomLock .Unlock ()
97+
98+ atom , ok := r .Atoms [atomName ]
99+ if ! ok {
100+ return
101+ }
102+ for compId := range atom .UsedBy {
103+ r .AddRenderWork (compId )
104+ }
105+ }
106+
65107func (r * RootElem ) GetAtomVal (name string ) any {
66- atom := r .GetAtom (name )
108+ r .atomLock .Lock ()
109+ defer r .atomLock .Unlock ()
110+
111+ atom , ok := r .Atoms [name ]
112+ if ! ok {
113+ return nil
114+ }
67115 return atom .Val
68116}
69117
70118func (r * RootElem ) GetStateSync (full bool ) []rpctypes.VDomStateSync {
119+ r .atomLock .Lock ()
120+ defer r .atomLock .Unlock ()
121+
71122 stateSync := make ([]rpctypes.VDomStateSync , 0 )
72123 for atomName , atom := range r .Atoms {
73124 if atom .Dirty || full {
@@ -79,7 +130,10 @@ func (r *RootElem) GetStateSync(full bool) []rpctypes.VDomStateSync {
79130}
80131
81132func (r * RootElem ) SetAtomVal (name string , val any , markDirty bool ) {
82- atom := r .GetAtom (name )
133+ r .atomLock .Lock ()
134+ defer r .atomLock .Unlock ()
135+
136+ atom := r .ensureAtomNoLock (name )
83137 if ! markDirty {
84138 atom .Val = val
85139 return
0 commit comments