refactor(sdk): simplify credential creation by internal error handling

The NewCredential function in the SDK now handles credential creation failures internally with a fatal log, removing the need for callers to check errors. This eliminates repetitive error handling across demo-app, relay-server, and tests, while ensuring failures result in immediate program termination.

lemon-mint committed Oct 28, 2025 at 23:16 UTC 024eb777675c82ac29d829e55391e7e88ac6b7a3
5 files changed +16 -40
cmd/demo-app/main.go
+1 -4
@@ -170,10 +170,7 @@ func (c *Canvas) handleWS(w http.ResponseWriter, r *http.Request) {
170
171 func runPaint(cmd *cobra.Command, args []string) error {
172 // 1) Create credential for this paint app
173 - cred, err := sdk.NewCredential()
174 - if err != nil {
175 - return fmt.Errorf("new credential: %w", err)
176 - }
173 + cred := sdk.NewCredential()
174
175 // 2) Create SDK client and connect to relay(s)
176 client, err := sdk.NewClient(func(c *sdk.RDClientConfig) {
cmd/relay-server/main.go
+2 -5
@@ -13,7 +13,7 @@ import (
13 "github.com/spf13/cobra"
14
15 "github.com/gosuda/relaydns/relaydns"
16 - "github.com/gosuda/relaydns/relaydns/core/cryptoops"
16 + "github.com/gosuda/relaydns/sdk"
17 )
18
19 var rootCmd = &cobra.Command{
@@ -46,10 +46,7 @@ func runServer(cmd *cobra.Command, args []string) error {
46 ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
47 defer stop()
48
49 - cred, err := cryptoops.NewCredential()
50 - if err != nil {
51 - return err
52 - }
49 + cred := sdk.NewCredential()
50
51 serv := relaydns.NewRelayServer(cred, flagBootstraps)
52 serv.Start()
cmd/relay-server/view.go
+1 -5
@@ -84,11 +84,7 @@ func serveHTTP(ctx context.Context, addr string, serv *relaydns.RelayServer, nod
84 targetALPN := alpns[0] // Use the first ALPN
85
86 // Temporary credential for this proxy connection
87 - cred, err := sdk.NewCredential()
88 - if err != nil {
89 - http.Error(w, "credential error: "+err.Error(), http.StatusInternalServerError)
90 - return
91 - }
87 + cred := sdk.NewCredential()
88
89 client, err := initProxyClient(r)
90 if err != nil {
sdk/sdk.go
+6 -2
@@ -18,8 +18,12 @@ import (
18 "github.com/rs/zerolog/log"
19 )
20
21 -func NewCredential() (*cryptoops.Credential, error) {
22 - return cryptoops.NewCredential()
21 +func NewCredential() *cryptoops.Credential {
22 + cred, err := cryptoops.NewCredential()
23 + if err != nil {
24 + log.Fatal().Err(err).Msg("Failed to create credential")
25 + }
26 + return cred
27 }
28
29 func webSocketDialer() func(context.Context, string) (io.ReadWriteCloser, error) {
sdk/sdk_e2e_test.go
+6 -24
@@ -86,10 +86,7 @@ func TestE2E_ClientToAppThroughRelay(t *testing.T) {
86
87 // 3. Create app credential and SDK client
88 log.Info().Msg("[TEST] Step 3: Creating app (listener) credential")
89 - appCred, err := NewCredential()
90 - if err != nil {
91 - t.Fatalf("Failed to create app credential: %v", err)
92 - }
89 + appCred := NewCredential()
90 log.Debug().Str("app_id", appCred.ID()).Msg("[TEST] App credential created")
91
92 // 4. Create app SDK client and register listener
@@ -138,10 +135,7 @@ func TestE2E_ClientToAppThroughRelay(t *testing.T) {
135
136 // 7. Create client credential
137 log.Info().Msg("[TEST] Step 7: Creating client credential")
141 - clientCred, err := NewCredential()
142 - if err != nil {
143 - t.Fatalf("Failed to create client credential: %v", err)
144 - }
138 + clientCred := NewCredential()
139 log.Debug().Str("client_id", clientCred.ID()).Msg("[TEST] Client credential created")
140
141 // 8. Create client SDK client
@@ -272,10 +266,7 @@ func TestE2E_MultipleConnections(t *testing.T) {
266 time.Sleep(500 * time.Millisecond)
267
268 // Setup app
275 - appCred, err := NewCredential()
276 - if err != nil {
277 - t.Fatalf("Failed to create app credential: %v", err)
278 - }
269 + appCred := NewCredential()
270
271 appClient, err := NewClient(func(c *RDClientConfig) {
272 c.BootstrapServers = []string{"ws://127.0.0.1:14018/relay"}
@@ -308,10 +299,7 @@ func TestE2E_MultipleConnections(t *testing.T) {
299 time.Sleep(1 * time.Second)
300
301 // Create client
311 - clientCred, err := NewCredential()
312 - if err != nil {
313 - t.Fatalf("Failed to create client credential: %v", err)
314 - }
302 + clientCred := NewCredential()
303
304 clientSDK, err := NewClient(func(c *RDClientConfig) {
305 c.BootstrapServers = []string{"ws://127.0.0.1:14018/relay"}
@@ -372,10 +360,7 @@ func TestE2E_ConnectionTimeout(t *testing.T) {
360 log.Info().Msg("=== Starting Connection Timeout Test ===")
361
362 // Create client with non-existent relay
375 - clientCred, err := NewCredential()
376 - if err != nil {
377 - t.Fatalf("Failed to create client credential: %v", err)
378 - }
363 + clientCred := NewCredential()
364
365 // This should fail or timeout appropriately
366 ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
@@ -401,10 +386,7 @@ func TestE2E_ConnectionTimeout(t *testing.T) {
386 }
387
388 // Try to dial to non-existent lease
404 - relayServerCred, err := cryptoops.NewCredential()
405 - if err != nil {
406 - t.Fatalf("Failed to create relay server credential: %v", err)
407 - }
389 + relayServerCred := NewCredential()
390
391 relayServer := relaydns.NewRelayServer(relayServerCred, []string{"ws://127.0.0.1:14019/relay"})
392 relayServer.Start()