22// Use of this source code is governed by a MIT license that can be found in the LICENSE file.
33// SPDX-License-Identifier: MIT
44
5+ using System . Threading ;
56using Deepgram . Models . Authenticate . v1 ;
67using Deepgram . Models . Live . v1 ;
78
@@ -17,6 +18,7 @@ public class Client : Attribute, IDisposable
1718
1819 private ClientWebSocket ? _clientWebSocket ;
1920 private CancellationTokenSource ? _cancellationTokenSource ;
21+ private readonly Mutex _mutex = new Mutex ( ) ;
2022 #endregion
2123
2224 /// <param name="apiKey">Required DeepgramApiKey</param>
@@ -35,18 +37,18 @@ public Client(string? apiKey = null, DeepgramWsClientOptions? options = null)
3537 Log . Verbose ( "LiveClient" , "LEAVE" ) ;
3638 }
3739
38- #region Subscribe Events
40+ #region Event Handlers
3941 /// <summary>
4042 /// Fires when an event is received from the Deepgram API
4143 /// </summary>
42- public event EventHandler < OpenResponse > ? _openReceived ;
43- public event EventHandler < MetadataResponse > ? _metadataReceived ;
44- public event EventHandler < ResultResponse > ? _resultsReceived ;
45- public event EventHandler < UtteranceEndResponse > ? _utteranceEndReceived ;
46- public event EventHandler < SpeechStartedResponse > ? _speechStartedReceived ;
47- public event EventHandler < CloseResponse > ? _closeReceived ;
48- public event EventHandler < UnhandledResponse > ? _unhandledReceived ;
49- public event EventHandler < ErrorResponse > ? _errorReceived ;
44+ private event EventHandler < OpenResponse > ? _openReceived ;
45+ private event EventHandler < MetadataResponse > ? _metadataReceived ;
46+ private event EventHandler < ResultResponse > ? _resultsReceived ;
47+ private event EventHandler < UtteranceEndResponse > ? _utteranceEndReceived ;
48+ private event EventHandler < SpeechStartedResponse > ? _speechStartedReceived ;
49+ private event EventHandler < CloseResponse > ? _closeReceived ;
50+ private event EventHandler < UnhandledResponse > ? _unhandledReceived ;
51+ private event EventHandler < ErrorResponse > ? _errorReceived ;
5052 #endregion
5153
5254 /// <summary>
@@ -161,36 +163,111 @@ void StartKeepAliveBackgroundThread() => _ = Task.Factory.StartNew(
161163 Log . Verbose ( "LiveClient.Connect" , "LEAVE" ) ;
162164 }
163165
164- //// TODO: convienence method for subscribing to events
165- //public void On<T>(T e, EventHandler<T> eventHandler) {
166- // switch (e)
167- // {
168- // case OpenResponse open:
169- // OpenReceived += (sender, e) => eventHandler;
170- // break;
171- // case MetadataResponse metadata:
172- // MetadataReceived += (sender, e) => eventHandler;
173- // break;
174- // case ResultResponse result:
175- // ResultsReceived += (sender, e) => eventHandler;
176- // break;
177- // case UtteranceEndResponse utteranceEnd:
178- // UtteranceEndReceived += (sender, e) => eventHandler;
179- // break;
180- // case SpeechStartedResponse speechStarted:
181- // SpeechStartedReceived += (sender, e) => eventHandler;
182- // break;
183- // case CloseResponse close:
184- // CloseReceived += (sender, e) => eventHandler;
185- // break;
186- // case UnhandledResponse unhandled:
187- // UnhandledReceived += (sender, e) => eventHandler;
188- // break;
189- // case ErrorResponse error:
190- // ErrorReceived += (sender, e) => eventHandler;
191- // break;
192- // }
193- //}
166+ #region Subscribe Event
167+ /// <summary>
168+ /// Subscribe to an Open event from the Deepgram API
169+ /// </summary>
170+ /// <param name="eventHandler"></param>
171+ /// <returns>True if successful</returns>
172+ public bool Subscribe ( EventHandler < OpenResponse > eventHandler )
173+ {
174+ lock ( _mutex )
175+ {
176+ _openReceived += ( sender , e ) => eventHandler ( sender , e ) ;
177+ }
178+
179+ return true ;
180+ }
181+
182+ /// <summary>
183+ /// Subscribe to a Metadata event from the Deepgram API
184+ /// </summary>
185+ /// <param name="eventHandler"></param>
186+ /// <returns>True if successful</returns>
187+ public bool Subscribe ( EventHandler < MetadataResponse > eventHandler )
188+ {
189+ lock ( _mutex )
190+ {
191+ _metadataReceived += ( sender , e ) => eventHandler ( sender , e ) ;
192+ }
193+ return true ;
194+ }
195+
196+ /// <summary>
197+ /// Subscribe to a Results event from the Deepgram API
198+ /// </summary>
199+ /// <returns>True if successful</returns>
200+ public bool Subscribe ( EventHandler < ResultResponse > eventHandler )
201+ {
202+ lock ( _mutex )
203+ {
204+ _resultsReceived += ( sender , e ) => eventHandler ( sender , e ) ;
205+ }
206+ return true ;
207+ }
208+
209+ /// <summary>
210+ /// Subscribe to an UtteranceEnd event from the Deepgram API
211+ /// </summary>
212+ /// <returns>True if successful</returns>
213+ public bool Subscribe ( EventHandler < UtteranceEndResponse > eventHandler )
214+ {
215+ lock ( _mutex )
216+ {
217+ _utteranceEndReceived += ( sender , e ) => eventHandler ( sender , e ) ;
218+ }
219+ return true ;
220+ }
221+
222+ /// <summary>
223+ /// Subscribe to a SpeechStarted event from the Deepgram API
224+ /// </summary>
225+ /// <returns>True if successful</returns>
226+ public bool Subscribe ( EventHandler < SpeechStartedResponse > eventHandler )
227+ {
228+ _speechStartedReceived += ( sender , e ) => eventHandler ( sender , e ) ;
229+ return true ;
230+ }
231+
232+ /// <summary>
233+ /// Subscribe to a Close event from the Deepgram API
234+ /// </summary>
235+ /// <returns>True if successful</returns>
236+ public bool Subscribe ( EventHandler < CloseResponse > eventHandler )
237+ {
238+ lock ( _mutex )
239+ {
240+ _closeReceived += ( sender , e ) => eventHandler ( sender , e ) ;
241+ }
242+ return true ;
243+ }
244+
245+ /// <summary>
246+ /// Subscribe to an Unhandled event from the Deepgram API
247+ /// </summary>
248+ /// <returns>True if successful</returns>
249+ public bool Subscribe ( EventHandler < UnhandledResponse > eventHandler )
250+ {
251+ lock ( _mutex )
252+ {
253+ _unhandledReceived += ( sender , e ) => eventHandler ( sender , e ) ;
254+ }
255+ return true ;
256+ }
257+
258+ /// <summary>
259+ /// Subscribe to an Error event from the Deepgram API
260+ /// </summary>
261+ /// <returns>True if successful</returns>
262+ public bool Subscribe ( EventHandler < ErrorResponse > eventHandler )
263+ {
264+ lock ( _mutex )
265+ {
266+ _errorReceived += ( sender , e ) => eventHandler ( sender , e ) ;
267+ }
268+ return true ;
269+ }
270+ #endregion
194271
195272 /// <summary>
196273 /// Sends a binary message over the WebSocket connection.
0 commit comments