@@ -226,31 +226,34 @@ func newStreamingResponseHandler(logger log.Logger, db database.DB, feature type
226
226
return eventWriter
227
227
})
228
228
229
+ // Isolate writing events.
230
+ var mu sync.Mutex
231
+ writeEvent := func (name string , data any ) error {
232
+ mu .Lock ()
233
+ defer mu .Unlock ()
234
+ if ev := eventWriter (); ev != nil {
235
+ return ev .Event (name , data )
236
+ }
237
+ return nil
238
+ }
239
+
229
240
// Always send a final done event so clients know the stream is shutting down.
230
241
firstEventObserved := false
231
242
defer func () {
232
243
if firstEventObserved {
233
- if ev := eventWriter (); ev != nil {
234
- _ = ev .Event ("done" , map [string ]any {})
235
- }
244
+ _ = writeEvent ("done" , map [string ]any {})
236
245
}
237
246
}()
238
247
start := time .Now ()
239
248
eventSink := func (e types.CompletionResponse ) error {
240
- if w := eventWriter (); w != nil {
241
- return w .Event ("completion" , e )
242
- }
243
- return nil
249
+ return writeEvent ("completion" , e )
244
250
}
245
251
attributionErrorLog := func (err error ) {
246
252
l := trace .Logger (ctx , logger )
247
- ev := eventWriter ()
248
- if ev != nil {
249
- if err := ev .Event ("attribution-error" , map [string ]string {"error" : err .Error ()}); err != nil {
250
- l .Error ("error reporting attribution error" , log .Error (err ))
251
- } else {
252
- return
253
- }
253
+ if err := writeEvent ("attribution-error" , map [string ]string {"error" : err .Error ()}); err != nil {
254
+ l .Error ("error reporting attribution error" , log .Error (err ))
255
+ } else {
256
+ return
254
257
}
255
258
l .Error ("attribution error" , log .Error (err ))
256
259
}
@@ -325,20 +328,16 @@ func newStreamingResponseHandler(logger log.Logger, db database.DB, feature type
325
328
firstEventObserved = true
326
329
timeToFirstEventMetrics .Observe (time .Since (start ).Seconds (), 1 , nil , requestParams .Model )
327
330
}
328
- if ev := eventWriter (); ev != nil {
329
- if err := ev .Event ("error" , map [string ]string {"error" : err .Error ()}); err != nil {
330
- l .Error ("error reporting streaming completion error" , log .Error (err ))
331
- }
331
+ if err := writeEvent ("error" , map [string ]string {"error" : err .Error ()}); err != nil {
332
+ l .Error ("error reporting streaming completion error" , log .Error (err ))
332
333
}
333
334
return
334
335
}
335
336
if f != nil { // if autocomplete-attribution enabled
336
337
if err := f .WaitDone (ctx ); err != nil {
337
338
l := trace .Logger (ctx , logger )
338
- if ev := eventWriter (); ev != nil {
339
- if err := ev .Event ("error" , map [string ]string {"error" : err .Error ()}); err != nil {
340
- l .Error ("error reporting streaming completion error" , log .Error (err ))
341
- }
339
+ if err := writeEvent ("error" , map [string ]string {"error" : err .Error ()}); err != nil {
340
+ l .Error ("error reporting streaming completion error" , log .Error (err ))
342
341
}
343
342
}
344
343
}
0 commit comments