* simulate-job * generated protobuf * wip * job_cost * Update livekit_agent.proto * generated protobuf * Update livekit_agent.proto * generated protobuf * Update livekit_agent.proto * Update livekit_agent.proto * Update livekit_agent.proto * generated protobuf * Update livekit_agent.proto * renamed to pong Co-authored-by: David Zhao <dz@livekit.io> * Update livekit_agent.proto * Update livekit_agent.proto * generated protobuf * remove job_cost & ParticipantPermission * generated protobuf * Update livekit_agent.proto * generated protobuf * wip * generated protobuf * generated protobuf * Update livekit_agent.proto * generated protobuf * generated protobuf * handler namespace * generated protobuf --------- Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: David Zhao <dz@livekit.io> Co-authored-by: David Colburn <xero73@gmail.com>
53 lines
830 B
Go
53 lines
830 B
Go
package utils
|
|
|
|
var closedPromiseChan = make(chan struct{})
|
|
|
|
func init() {
|
|
close(closedPromiseChan)
|
|
}
|
|
|
|
type Promise[T any] struct {
|
|
Result T
|
|
Err error
|
|
done chan struct{}
|
|
}
|
|
|
|
func NewPromise[T any]() *Promise[T] {
|
|
return &Promise[T]{
|
|
done: make(chan struct{}),
|
|
}
|
|
}
|
|
|
|
func GoPromise[T any](f func() (T, error)) *Promise[T] {
|
|
p := NewPromise[T]()
|
|
go func() { p.Resolve(f()) }()
|
|
return p
|
|
}
|
|
|
|
func NewResolvedPromise[T any](result T, err error) *Promise[T] {
|
|
return &Promise[T]{
|
|
Result: result,
|
|
Err: err,
|
|
done: closedPromiseChan,
|
|
}
|
|
}
|
|
|
|
func (p *Promise[T]) Resolve(result T, err error) {
|
|
p.Result = result
|
|
p.Err = err
|
|
close(p.done)
|
|
}
|
|
|
|
func (p *Promise[T]) Done() <-chan struct{} {
|
|
return p.done
|
|
}
|
|
|
|
func (p *Promise[T]) Resolved() bool {
|
|
select {
|
|
case <-p.done:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|