diff --git a/rpc/typed_api.go b/rpc/typed_api.go index 797a1ce0..8f6ebc99 100644 --- a/rpc/typed_api.go +++ b/rpc/typed_api.go @@ -106,11 +106,11 @@ type TypedSignalClient = SignalClient[livekit.NodeID] type TypedSignalServer = SignalServer[livekit.NodeID] func NewTypedSignalClient(nodeID livekit.NodeID, bus psrpc.MessageBus, opts ...psrpc.ClientOption) (TypedSignalClient, error) { - return NewSignalClient[livekit.NodeID](bus, append(opts[:len(opts):len(opts)], psrpc.WithClientID(string(nodeID)))...) + return NewSignalClient[livekit.NodeID](bus, psrpc.WithClientOptions(opts...), psrpc.WithClientID(string(nodeID))) } func NewTypedSignalServer(nodeID livekit.NodeID, svc SignalServerImpl, bus psrpc.MessageBus, opts ...psrpc.ServerOption) (TypedSignalServer, error) { - return NewSignalServer[livekit.NodeID](svc, bus, append(opts[:len(opts):len(opts)], psrpc.WithServerID(string(nodeID)))...) + return NewSignalServer[livekit.NodeID](svc, bus, psrpc.WithServerOptions(opts...), psrpc.WithServerID(string(nodeID))) } type TypedRoomManagerClient = RoomManagerClient[livekit.NodeID] diff --git a/utils/clock.go b/utils/clock.go index 199994fa..ea8816c7 100644 --- a/utils/clock.go +++ b/utils/clock.go @@ -1,3 +1,17 @@ +// Copyright 2023 LiveKit, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package utils import ( diff --git a/utils/closers.go b/utils/closers.go new file mode 100644 index 00000000..b95f544c --- /dev/null +++ b/utils/closers.go @@ -0,0 +1,62 @@ +// Copyright 2023 LiveKit, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "io" + + "go.uber.org/multierr" +) + +type Closers []io.Closer + +func CombineClosers(cs ...io.Closer) Closers { + return append([]io.Closer{}, cs...) +} + +func (s *Closers) Close() error { + var err error + for _, c := range *s { + if c != nil { + err = multierr.Append(err, c.Close()) + } + } + + *s = (*s)[:0] + + return err +} + +type CloseFuncType interface { + ~func() error | ~func() +} + +func CloseFunc[T CloseFuncType](fn T) io.Closer { + return closeFunc[T]{fn} +} + +type closeFunc[T CloseFuncType] struct { + fn T +} + +func (f closeFunc[T]) Close() error { + switch fn := any(f.fn).(type) { + case func() error: + return fn() + case func(): + fn() + } + return nil +}