github.com/0chain/gosdk@v1.17.11/wasmsdk/jsbridge/timer.go (about)

     1  //go:build js && wasm
     2  // +build js,wasm
     3  
     4  package jsbridge
     5  
     6  import (
     7  	"sync"
     8  	"syscall/js"
     9  	"time"
    10  )
    11  
    12  type Timer struct {
    13  	sync.Mutex
    14  	id       js.Value
    15  	enabled  bool
    16  	interval time.Duration
    17  	callback func()
    18  }
    19  
    20  func NewTimer(interval time.Duration, callback func()) *Timer {
    21  	return &Timer{
    22  		interval: interval,
    23  		callback: callback,
    24  	}
    25  }
    26  
    27  func (t *Timer) Start() {
    28  	t.Lock()
    29  	defer t.Unlock()
    30  
    31  	if !t.enabled {
    32  		cb, _ := promise(t.updated)
    33  		t.id = js.Global().Call("setInterval", cb, t.interval.Milliseconds())
    34  		t.enabled = true
    35  	}
    36  }
    37  
    38  func (t *Timer) Stop() {
    39  	if t.enabled {
    40  		js.Global().Call("clearInterval", t.id)
    41  	}
    42  
    43  	t.enabled = false
    44  }
    45  
    46  func (t *Timer) updated() {
    47  	if t.enabled {
    48  		t.callback()
    49  	}
    50  }