@@ -3,7 +3,7 @@ package client
33import (
44 "bufio"
55 "context"
6- "crypto/rand"
6+ cryptoRand "crypto/rand"
77 "encoding/json"
88 "fmt"
99 "log"
@@ -12,6 +12,8 @@ import (
1212 "sync/atomic"
1313 "time"
1414
15+ "math/rand"
16+
1517 "github.com/DeliciousBuding/codex-browser-bridge/internal/discovery"
1618 "github.com/DeliciousBuding/codex-browser-bridge/internal/protocol"
1719)
@@ -114,12 +116,28 @@ func Connect(pipeName string, logger *log.Logger) (*Client, error) {
114116// that establish the transport themselves.
115117func NewFromConn (conn net.Conn , logger * log.Logger ) * Client {
116118 ctx , cancel := context .WithCancel (context .Background ())
119+
120+ sessionID , err := newUUID ()
121+ if err != nil {
122+ if logger != nil {
123+ logger .Printf ("newUUID failed, using fallback: %v" , err )
124+ }
125+ sessionID = fallbackUUID ()
126+ }
127+ turnID , err := newUUID ()
128+ if err != nil {
129+ if logger != nil {
130+ logger .Printf ("newUUID failed, using fallback: %v" , err )
131+ }
132+ turnID = fallbackUUID ()
133+ }
134+
117135 c := & Client {
118136 conn : conn ,
119137 reader : bufio .NewReaderSize (conn , 256 * 1024 ),
120138 session : protocol.SessionParams {
121- SessionID : newUUID () ,
122- TurnID : newUUID () ,
139+ SessionID : sessionID ,
140+ TurnID : turnID ,
123141 },
124142 pending : make (map [int ]chan * protocol.Response ),
125143 ctx : ctx ,
@@ -255,10 +273,22 @@ func truncate(s string, n int) string {
255273}
256274
257275// newUUID generates a UUID v4 string without external dependencies.
258- func newUUID () string {
276+ func newUUID () (string , error ) {
277+ var b [16 ]byte
278+ if _ , err := cryptoRand .Read (b [:]); err != nil {
279+ return "" , fmt .Errorf ("crypto/rand failed: %w" , err )
280+ }
281+ b [6 ] = (b [6 ] & 0x0f ) | 0x40 // version 4
282+ b [8 ] = (b [8 ] & 0x3f ) | 0x80 // variant 10
283+ return fmt .Sprintf ("%08x-%04x-%04x-%04x-%012x" ,
284+ b [0 :4 ], b [4 :6 ], b [6 :8 ], b [8 :10 ], b [10 :16 ]), nil
285+ }
286+
287+ // fallbackUUID generates a UUID v4 using math/rand when crypto/rand is unavailable.
288+ func fallbackUUID () string {
259289 var b [16 ]byte
260- if _ , err := rand . Read ( b [:]); err != nil {
261- panic ( fmt . Sprintf ( "crypto/rand failed: %v" , err ))
290+ for i := range b {
291+ b [ i ] = byte ( rand . Intn ( 256 ))
262292 }
263293 b [6 ] = (b [6 ] & 0x0f ) | 0x40 // version 4
264294 b [8 ] = (b [8 ] & 0x3f ) | 0x80 // variant 10
0 commit comments