@@ -13,10 +13,11 @@ import (
1313)
1414
1515// RegisterBridge registers all streaming bridge functions on the given bridge instance.
16- func RegisterBridge (b * bridge.Bridge , manager internal.Manager , config internal.Config ) error {
16+ // It accepts resolver functions so that values are resolved at request time (after all extensions are initialized).
17+ func RegisterBridge (b * bridge.Bridge , managerFn func () internal.Manager , configFn func () internal.Config ) error {
1718 reg := & bridgeRegistry {
18- manager : manager ,
19- config : config ,
19+ managerFn : managerFn ,
20+ configFn : configFn ,
2021 }
2122
2223 // Stats
@@ -95,10 +96,11 @@ func RegisterBridge(b *bridge.Bridge, manager internal.Manager, config internal.
9596 return nil
9697}
9798
98- // bridgeRegistry holds references for bridge function handlers.
99+ // bridgeRegistry holds resolver functions for bridge function handlers.
100+ // Values are resolved at request time to avoid nil references during extension startup.
99101type bridgeRegistry struct {
100- manager internal.Manager
101- config internal.Config
102+ managerFn func () internal.Manager
103+ configFn func () internal.Config
102104}
103105
104106// ---- Parameter types ----
@@ -193,8 +195,21 @@ type actionResult struct {
193195
194196// ---- Handler implementations ----
195197
198+ // resolveManager returns the manager, or an error if it's not yet initialized.
199+ func (r * bridgeRegistry ) resolveManager () (internal.Manager , error ) {
200+ m := r .managerFn ()
201+ if m == nil {
202+ return nil , errors .New ("streaming manager not initialized" )
203+ }
204+ return m , nil
205+ }
206+
196207func (r * bridgeRegistry ) getStats (ctx bridge.Context , params emptyParams ) (* statsResponse , error ) {
197- stats , err := r .manager .GetStats (context .Background ())
208+ manager , err := r .resolveManager ()
209+ if err != nil {
210+ return nil , err
211+ }
212+ stats , err := manager .GetStats (context .Background ())
198213 if err != nil {
199214 return nil , err
200215 }
@@ -211,7 +226,11 @@ func (r *bridgeRegistry) getStats(ctx bridge.Context, params emptyParams) (*stat
211226}
212227
213228func (r * bridgeRegistry ) getRooms (ctx bridge.Context , params emptyParams ) ([]roomResponse , error ) {
214- rooms , err := r .manager .ListRooms (context .Background ())
229+ manager , err := r .resolveManager ()
230+ if err != nil {
231+ return nil , err
232+ }
233+ rooms , err := manager .ListRooms (context .Background ())
215234 if err != nil {
216235 return nil , err
217236 }
@@ -241,9 +260,14 @@ func (r *bridgeRegistry) getRoom(ctx bridge.Context, params roomIDParams) (*room
241260 return nil , errors .New ("room_id is required" )
242261 }
243262
263+ manager , err := r .resolveManager ()
264+ if err != nil {
265+ return nil , err
266+ }
267+
244268 bgCtx := context .Background ()
245269
246- room , err := r . manager .GetRoom (bgCtx , params .RoomID )
270+ room , err := manager .GetRoom (bgCtx , params .RoomID )
247271 if err != nil {
248272 return nil , err
249273 }
@@ -263,7 +287,11 @@ func (r *bridgeRegistry) getRoom(ctx bridge.Context, params roomIDParams) (*room
263287}
264288
265289func (r * bridgeRegistry ) getChannels (ctx bridge.Context , params emptyParams ) ([]channelResponse , error ) {
266- channels , err := r .manager .ListChannels (context .Background ())
290+ manager , err := r .resolveManager ()
291+ if err != nil {
292+ return nil , err
293+ }
294+ channels , err := manager .ListChannels (context .Background ())
267295 if err != nil {
268296 return nil , err
269297 }
@@ -286,7 +314,11 @@ func (r *bridgeRegistry) getChannels(ctx bridge.Context, params emptyParams) ([]
286314}
287315
288316func (r * bridgeRegistry ) getConnections (ctx bridge.Context , params emptyParams ) ([]connectionResponse , error ) {
289- conns := r .manager .GetAllConnections ()
317+ manager , err := r .resolveManager ()
318+ if err != nil {
319+ return nil , err
320+ }
321+ conns := manager .GetAllConnections ()
290322 result := make ([]connectionResponse , 0 , len (conns ))
291323
292324 for _ , conn := range conns {
@@ -304,7 +336,11 @@ func (r *bridgeRegistry) getConnections(ctx bridge.Context, params emptyParams)
304336}
305337
306338func (r * bridgeRegistry ) getPresence (ctx bridge.Context , params emptyParams ) ([]presenceResponse , error ) {
307- conns := r .manager .GetAllConnections ()
339+ manager , err := r .resolveManager ()
340+ if err != nil {
341+ return nil , err
342+ }
343+ conns := manager .GetAllConnections ()
308344 bgCtx := context .Background ()
309345
310346 seen := make (map [string ]bool )
@@ -318,7 +354,7 @@ func (r *bridgeRegistry) getPresence(ctx bridge.Context, params emptyParams) ([]
318354
319355 seen [uid ] = true
320356
321- presence , _ := r . manager .GetPresence (bgCtx , uid )
357+ presence , _ := manager .GetPresence (bgCtx , uid )
322358 resp := presenceResponse {
323359 UserID : uid ,
324360 Status : "online" ,
@@ -346,6 +382,11 @@ func (r *bridgeRegistry) createRoom(ctx bridge.Context, params createRoomParams)
346382 return nil , errors .New ("room owner is required" )
347383 }
348384
385+ manager , err := r .resolveManager ()
386+ if err != nil {
387+ return nil , err
388+ }
389+
349390 room := local .NewRoom (internal.RoomOptions {
350391 ID : uuid .New ().String (),
351392 Name : params .Name ,
@@ -354,7 +395,7 @@ func (r *bridgeRegistry) createRoom(ctx bridge.Context, params createRoomParams)
354395 Private : params .Private ,
355396 })
356397
357- if err := r . manager .CreateRoom (context .Background (), room ); err != nil {
398+ if err := manager .CreateRoom (context .Background (), room ); err != nil {
358399 return nil , err
359400 }
360401
@@ -370,7 +411,12 @@ func (r *bridgeRegistry) deleteRoom(ctx bridge.Context, params roomIDParams) (*a
370411 return nil , errors .New ("room_id is required" )
371412 }
372413
373- if err := r .manager .DeleteRoom (context .Background (), params .RoomID ); err != nil {
414+ manager , err := r .resolveManager ()
415+ if err != nil {
416+ return nil , err
417+ }
418+
419+ if err := manager .DeleteRoom (context .Background (), params .RoomID ); err != nil {
374420 return nil , err
375421 }
376422
@@ -389,6 +435,11 @@ func (r *bridgeRegistry) sendMessage(ctx bridge.Context, params sendMessageParam
389435 return nil , errors .New ("message is required" )
390436 }
391437
438+ manager , err := r .resolveManager ()
439+ if err != nil {
440+ return nil , err
441+ }
442+
392443 msg := & internal.Message {
393444 ID : uuid .New ().String (),
394445 Type : internal .MessageTypeMessage ,
@@ -398,7 +449,7 @@ func (r *bridgeRegistry) sendMessage(ctx bridge.Context, params sendMessageParam
398449 Timestamp : time .Now (),
399450 }
400451
401- if err := r . manager .BroadcastToRoom (context .Background (), params .RoomID , msg ); err != nil {
452+ if err := manager .BroadcastToRoom (context .Background (), params .RoomID , msg ); err != nil {
402453 return nil , err
403454 }
404455
@@ -410,18 +461,19 @@ func (r *bridgeRegistry) sendMessage(ctx bridge.Context, params sendMessageParam
410461}
411462
412463func (r * bridgeRegistry ) getConfig (ctx bridge.Context , params emptyParams ) (* configResponse , error ) {
464+ config := r .configFn ()
413465 return & configResponse {
414- Backend : r . config .Backend ,
415- Distributed : r . config .EnableDistributed ,
416- Rooms : r . config .EnableRooms ,
417- Channels : r . config .EnableChannels ,
418- Presence : r . config .EnablePresence ,
419- TypingIndicators : r . config .EnableTypingIndicators ,
420- MessageHistory : r . config .EnableMessageHistory ,
421- SessionResumption : r . config .EnableSessionResumption ,
422- MaxConnsPerUser : r . config .MaxConnectionsPerUser ,
423- MaxRoomsPerUser : r . config .MaxRoomsPerUser ,
424- MaxChannelsPerUser : r . config .MaxChannelsPerUser ,
425- MaxMessageSize : r . config .MaxMessageSize ,
466+ Backend : config .Backend ,
467+ Distributed : config .EnableDistributed ,
468+ Rooms : config .EnableRooms ,
469+ Channels : config .EnableChannels ,
470+ Presence : config .EnablePresence ,
471+ TypingIndicators : config .EnableTypingIndicators ,
472+ MessageHistory : config .EnableMessageHistory ,
473+ SessionResumption : config .EnableSessionResumption ,
474+ MaxConnsPerUser : config .MaxConnectionsPerUser ,
475+ MaxRoomsPerUser : config .MaxRoomsPerUser ,
476+ MaxChannelsPerUser : config .MaxChannelsPerUser ,
477+ MaxMessageSize : config .MaxMessageSize ,
426478 }, nil
427479}
0 commit comments