// --- Request ---
otpReq := &entities.OTPRequest{}
data, err := proto.Marshal(otpReq)
if err != nil {
return err
}
frame := protocol.NewHapticFrame(entities.FrameType_OTP_REQUEST, data)
if err := frame.WriteFrame(stream); err != nil {
return err
}
// --- Response ---
respFrame, err := protocol.ReadNextFrame(stream)
if err != nil {
return err
}
if respFrame.Type != entities.FrameType_OTP_RESPONSE {
return fmt.Errorf("unexpected frame type: %v", respFrame.Type)
}
otpResp := &entities.OTPResponse{}
if err := proto.Unmarshal(respFrame.Data, otpResp); err != nil {
return err
}
if otpResp.Error != "" {
return fmt.Errorf("OTP generation failed: %s", otpResp.Error)
}
fmt.Printf("OTP: %s, expires at: %d ms\n", otpResp.Otp, otpResp.ExpiresAtMs)