Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: bump fiber to v3 #95

Closed
wants to merge 12 commits into from
Closed

feat: bump fiber to v3 #95

wants to merge 12 commits into from

Conversation

devhaozi
Copy link
Member

@devhaozi devhaozi commented Aug 21, 2024

📑 Description

Closes https://github.com/goravel/goravel/issues/?

Bump fiber to v3 and optimize Context performance by reuse object.

Summary by CodeRabbit

  • New Features

    • Upgraded Fiber framework from version 2 to version 3, enhancing performance and functionality.
    • Introduced a context pooling mechanism for efficient management of context instances.
    • Enhanced CORS middleware to handle multiple allowed methods, origins, and headers more effectively.
  • Bug Fixes

    • Improved error handling and logging in various components for better reliability.
  • Chores

    • Cleaned up test setups by removing outdated configuration expectations, streamlining processes.

✅ Checks

  • Added test cases for my code

@devhaozi devhaozi requested a review from a team as a code owner August 21, 2024 16:30
Copy link

coderabbitai bot commented Aug 21, 2024

Walkthrough

The changes introduce significant restructuring in the codebase, primarily focusing on upgrading the Fiber framework from version 2 to version 3 across multiple files. This upgrade affects how context and response types are managed, with a shift from pointer to value types for context instances. Additionally, various files have been updated to streamline context management through the introduction of a context pool. The modifications also include updates to dependency versions, simplifications in test setups, and enhancements to middleware functionality, improving overall performance and maintainability.

Changes

File(s) Change Summary
context.go Updated Context struct and methods, added contextPool, changed Background and Instance return types, and enhanced error handling in request processing.
context_response_test.go, context_test.go, group_test.go, middleware_cors_test.go, middleware_timeout_test.go, route_test.go, route_test.go, utils.go Upgraded Fiber package from v2 to v3, adjusted import statements, and simplified test setups by removing unnecessary mock configurations related to http.drivers.fiber.prefork.
go.mod Updated dependency versions, notably upgrading github.com/gofiber/fiber to v3.0.0-beta.3 and various other dependencies to their latest versions.
middleware_cors.go, response.go, route.go Modified CORS middleware to return slices instead of strings, adjusted response types to use value types, and updated method signatures for improved context management.

Sequence Diagram(s)

sequenceDiagram
    participant CI as GitHub Actions
    participant WF as External Workflow
    participant Fiber as Fiber Framework

    CI->>WF: Trigger test, linting, or coverage job
    WF->>Fiber: Utilize upgraded context management
    Fiber-->>WF: Return processed context
    WF->>CI: Complete job execution
Loading

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Outside diff range, codebase verification and nitpick comments (2)
context.go (2)

5-7: Consider removing unused imports.

The errors and fmt packages are imported but only used for logging errors. If logging is not required, consider removing them.


34-38: Improve error handling in Request method.

Consider providing more context in the error message or handling the error more gracefully to aid in debugging.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between c6b8450 and cf9bcee.

Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
Files selected for processing (21)
  • .github/workflows/codecov.yml (1 hunks)
  • .github/workflows/lint.yml (1 hunks)
  • .github/workflows/pr-check-title.yml (1 hunks)
  • .github/workflows/test.yml (1 hunks)
  • README.md (1 hunks)
  • context.go (2 hunks)
  • context_request.go (5 hunks)
  • context_request_test.go (1 hunks)
  • context_response.go (3 hunks)
  • context_response_test.go (4 hunks)
  • cors.go (2 hunks)
  • cors_test.go (13 hunks)
  • go.mod (2 hunks)
  • group.go (3 hunks)
  • group_test.go (1 hunks)
  • response.go (7 hunks)
  • route.go (5 hunks)
  • route_test.go (14 hunks)
  • utils.go (2 hunks)
  • view.go (2 hunks)
  • view_test.go (2 hunks)
Files skipped from review due to trivial changes (6)
  • .github/workflows/codecov.yml
  • .github/workflows/lint.yml
  • context_request_test.go
  • cors_test.go
  • group_test.go
  • view_test.go
Additional comments not posted (65)
.github/workflows/test.yml (1)

8-10: LGTM! Simplified workflow configuration.

The restructuring to use a reusable workflow enhances maintainability and ensures secure handling of secrets.

.github/workflows/pr-check-title.yml (1)

3-10: LGTM! Enhanced PR title check workflow.

The restructuring to use a reusable workflow and the addition of a push trigger for the master branch improve functionality and security.

context.go (6)

22-24: Efficient use of sync.Pool for context reuse.

The introduction of contextPool for reusing Context instances is a good practice for optimizing memory usage.


27-29: Update instance field type in Context.

Changing the instance field from a pointer to a direct fiber.Ctx type may affect how the context is managed. Ensure this change aligns with the intended design and performance goals.


49-54: Efficient use of contextResponsePool for response reuse.

The use of a pool for ContextResponse instances is a good practice for optimizing memory usage.


60-60: Simplified WithValue method.

The removal of the custom ctxKey type simplifies the method and reduces complexity.


88-88: Update Instance method return type.

Changing the return type of Instance from a pointer to a direct fiber.Ctx type may affect how the context is used. Ensure this change aligns with the intended design and performance goals.


17-19: Verify the removal of NewContext.

The NewContext function has been removed, and its functionality is integrated into Background. Ensure that all calls to NewContext have been updated accordingly.

Run the following script to verify the function usage:

Verification successful

Removal of NewContext Verified

The NewContext function has been successfully removed, and its functionality appears to have been integrated into the Background function. No occurrences of NewContext were found, and Background is defined and used in the codebase.

  • Background function is defined in context.go and used in context_test.go.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all function calls to `NewContext` have been updated.

# Test: Search for the function usage. Expect: No occurrences of `NewContext`.
rg --type go $'NewContext'

Length of output: 25


Script:

#!/bin/bash
# Searching for the definition of the `NewContext` function in the codebase.
rg --type go 'func NewContext'

Length of output: 32


Script:

#!/bin/bash
# Searching for references to `Background` to confirm integration of `NewContext` functionality.
rg --type go 'Background'

Length of output: 110

README.md (1)

47-47: LGTM! Fiber import updated to version 3.

The import statement for Fiber has been correctly updated to version 3, aligning with the PR's objective.

utils.go (3)

7-7: LGTM! Fiber import updated to version 3.

The import statement for Fiber has been correctly updated to version 3, aligning with the PR's objective.


25-37: Efficient context pooling in handlerToFiberHandler.

The function now uses a context pooling mechanism, improving memory management by reusing context instances. The cleanup of request and response fields before returning the context to the pool is a good practice.


43-53: Efficient context pooling in middlewareToFiberHandler.

Similar to handlerToFiberHandler, this function now uses a context pooling mechanism, enhancing memory management. The cleanup of request and response fields is correctly handled.

view.go (4)

7-7: LGTM! Fiber import updated to version 3.

The import statement for Fiber has been correctly updated to version 3, aligning with the PR's objective.


12-12: Transition to value type for instance in View.

The change from a pointer to a value type for instance in the View struct aligns with the updates in Fiber v3 and improves safety by preventing unintended modifications.


15-15: Update NewView to accept value type.

The constructor now accepts a fiber.Ctx value instead of a pointer, aligning with the Fiber v3 changes and ensuring consistency with the View struct.


36-36: Explicit type casting in Make method.

The explicit casting of data[0] to map[string]any enhances type safety and clarity, ensuring compatibility with the HtmlResponse constructor.

response.go (9)

16-16: LGTM! Context type update aligns with Fiber v3.

The change from *fiber.Ctx to fiber.Ctx is consistent with the Fiber v3 update and should improve context management.


27-27: LGTM! Context type update aligns with Fiber v3.

The change from *fiber.Ctx to fiber.Ctx is consistent with the Fiber v3 update and should improve context management.


36-36: LGTM! Context type update aligns with Fiber v3.

The change from *fiber.Ctx to fiber.Ctx is consistent with the Fiber v3 update and should improve context management.


50-50: LGTM! Context type update aligns with Fiber v3.

The change from *fiber.Ctx to fiber.Ctx is consistent with the Fiber v3 update and should improve context management.


59-59: LGTM! Context type update aligns with Fiber v3.

The change from *fiber.Ctx to fiber.Ctx is consistent with the Fiber v3 update and should improve context management.


69-73: LGTM! Context type update and method chaining align with Fiber v3.

The change from *fiber.Ctx to fiber.Ctx and the use of method chaining in the Render method are consistent with the Fiber v3 update and enhance code readability.


79-79: LGTM! Context type update aligns with Fiber v3.

The change from *fiber.Ctx to fiber.Ctx is consistent with the Fiber v3 update and should improve context management.


93-94: LGTM! Type safety and context type update align with Fiber v3.

Changing data to fiber.Map enhances type safety, and the change from *fiber.Ctx to fiber.Ctx aligns with the Fiber v3 update.


104-104: LGTM! Context type update aligns with Fiber v3.

The change from *fiber.Ctx to fiber.Ctx is consistent with the Fiber v3 update and should improve context management.

cors.go (4)

55-63: LGTM! Improved flexibility in handling allowed methods.

The change to return a slice of strings enhances flexibility and aligns with best practices for handling multiple HTTP methods.


69-70: LGTM! Simplified handling of allowed origins.

Returning a slice of strings directly from the configuration simplifies the function and aligns with best practices.


73-80: LGTM! Improved flexibility in handling allowed headers.

The change to return a slice of strings enhances flexibility and aligns with best practices for handling multiple HTTP headers.


86-93: LGTM! Improved flexibility in handling exposed headers.

The change to return a slice of strings enhances flexibility and aligns with best practices for handling multiple exposed headers.

context_response.go (5)

17-19: LGTM! Memory optimization with sync.Pool.

The introduction of sync.Pool for managing ContextResponse instances optimizes memory usage and enhances performance in high-load scenarios.


22-22: LGTM! Context type update aligns with Fiber v3.

The change from *fiber.Ctx to fiber.Ctx is consistent with the Fiber v3 update and should improve context management.


20-20: LGTM! Shift to sync.Pool for instance management.

The removal of NewContextResponse aligns with the shift towards using sync.Pool for managing instances, optimizing memory usage.


193-193: LGTM! Context type update aligns with Fiber v3.

The change from *fiber.Ctx to fiber.Ctx is consistent with the Fiber v3 update and should improve context management.


229-229: LGTM! Context type update aligns with Fiber v3.

Embedding fiber.Ctx directly instead of using a pointer is consistent with the Fiber v3 update and should improve context management.

group.go (14)

60-61: LGTM: Compatibility with Fiber v3 ensured.

The use of handlerToFiberHandler ensures that handlers are compatible with Fiber v3.


65-66: LGTM: Compatibility with Fiber v3 ensured.

The use of handlerToFiberHandler ensures that handlers are compatible with Fiber v3.


70-71: LGTM: Compatibility with Fiber v3 ensured.

The use of handlerToFiberHandler ensures that handlers are compatible with Fiber v3.


75-76: LGTM: Compatibility with Fiber v3 ensured.

The use of handlerToFiberHandler ensures that handlers are compatible with Fiber v3.


80-81: LGTM: Compatibility with Fiber v3 ensured.

The use of handlerToFiberHandler ensures that handlers are compatible with Fiber v3.


85-86: LGTM: Compatibility with Fiber v3 ensured.

The use of handlerToFiberHandler ensures that handlers are compatible with Fiber v3.


90-91: LGTM: Compatibility with Fiber v3 ensured.

The use of handlerToFiberHandler ensures that handlers are compatible with Fiber v3.


96-101: LGTM: Consistent handler transformation for Fiber v3.

The use of handlerToFiberHandler for multiple HTTP methods ensures compatibility with Fiber v3.


107-108: LGTM: Updated static file handling for Fiber v3.

The use of static.New aligns with Fiber v3's new static file handling.


113-119: LGTM: Correct static file serving with c.SendFile.

The method correctly uses c.SendFile to serve a file, ensuring compatibility with Fiber v3.


123-130: LGTM: Enhanced file system handling with fsWrapper.

The fsWrapper struct adapts http.FileSystem to the fs.FS interface, enhancing file system handling capabilities.


134-136: LGTM: Updated static file system handling for Fiber v3.

The use of static.New with fsWrapper aligns with Fiber v3's new static file handling.


140-147: LGTM: Simplified middleware management.

The removal of the handler parameter simplifies middleware management and aligns with Fiber v3's practices.


156-166: LGTM: Ensures middleware presence.

The logic for ensuring at least one middleware is present is consistent with Fiber v3's requirements.

route.go (4)

59-63: LGTM: Updated Fiber app initialization.

The removal of the Prefork setting from the initial configuration aligns with Fiber v3's practices.


82-94: LGTM: Enhanced context management with pooling.

The use of context pools enhances performance by reusing context instances, aligning with Fiber v3's optimizations.


144-155: LGTM: Centralized network configuration.

The centralized handling of the prefork setting and network type aligns with Fiber v3's practices.


187-198: LGTM: Centralized network configuration for TLS.

The centralized handling of the prefork setting and network type aligns with Fiber v3's practices.

go.mod (3)

6-6: LGTM: Upgrade to Fiber v3.

The upgrade to Fiber v3 is consistent with the PR's objective to enhance performance and maintainability.


8-8: LGTM: Addition of github.com/gofiber/utils/v2.

The addition of github.com/gofiber/utils/v2 suggests that utility functions from this package are now required.


157-157: LGTM: Update to golang.org/x/sys.

The update to golang.org/x/sys may include enhancements or bug fixes relevant to the project.

context_request.go (5)

13-14: Import changes are consistent with Fiber v3 upgrade.

The import statements have been updated to reflect the new version of the Fiber framework and utils, aligning with the PR objectives.


28-33: Efficient use of sync.Pool for ContextRequest instances.

The introduction of sync.Pool for managing ContextRequest instances is a performance enhancement, reducing the overhead of frequent allocations.


58-58: Improved data binding in All method with Fiber v3 API.

The use of Bind().URI(data) enhances the efficiency and correctness of parameter binding, aligning with Fiber v3's API.


70-74: Updated Bind and BindQuery methods with Fiber v3 API.

The transition to Bind().Body(obj) and Bind().Query(obj) aligns with Fiber v3's API, potentially enhancing functionality in request parsing.


403-404: Enhanced parameter validation in Validate method.

Accessing route parameters through r.instance.Route().Params offers a more targeted approach to validation, consistent with Fiber v3's API.

route_test.go (5)

12-12: Import updated to Fiber v3.

The import statement has been updated to reflect the new version of the Fiber framework, aligning with the PR objectives.


82-82: Explicit mock for prefork configuration in TestRun.

The addition of the prefork configuration mock enhances the clarity and correctness of the test.


99-99: Explicit mock for prefork configuration in TestRun.

The addition of the prefork configuration mock enhances the clarity and correctness of the test.


183-183: Explicit mock for prefork configuration in TestRunTLS.

The addition of the prefork configuration mock enhances the clarity and correctness of the test.


279-279: Explicit mock for prefork configuration in TestRunTLSWithCert.

The addition of the prefork configuration mock enhances the clarity and correctness of the test.

coderabbitai[bot]
coderabbitai bot previously approved these changes Aug 21, 2024
Copy link
Contributor

@hwbrzzl hwbrzzl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great PR 👍 But I noticed the fiber 3.0.0 is still a beta version, I suggest we upgrade it when it's formal.

@devhaozi
Copy link
Member Author

Great PR 👍 But I noticed the fiber 3.0.0 is still a beta version, I suggest we upgrade it when it's formal.

Yes, wait for it.

# Conflicts:
#	.github/workflows/codecov.yml
#	.github/workflows/pr-check-title.yml
#	context.go
#	cors_test.go
#	go.mod
#	go.sum
#	response.go
#	route_test.go
#	utils.go
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🧹 Outside diff range and nitpick comments (11)
middleware_cors.go (2)

Line range hint 12-14: Add error handling for type assertion

The type assertion corsPaths, ok := ConfigFacade.Get("cors.paths").([]string) could panic if the configuration value is present but of the wrong type. While the ok variable is checked, similar type assertions throughout the code should be protected.

Consider adding proper error handling:

-       corsPaths, ok := ConfigFacade.Get("cors.paths").([]string)
+       corsPathsRaw := ConfigFacade.Get("cors.paths")
+       if corsPathsRaw == nil {
+           ctx.Request().Next()
+           return
+       }
+       corsPaths, ok := corsPathsRaw.([]string)

6-6: Consider deferring Fiber v3 upgrade

As mentioned in the PR discussion, Fiber v3 is currently in beta. Using beta dependencies in production could lead to stability issues and unexpected breaking changes.

Consider either:

  1. Waiting for a stable v3 release before upgrading
  2. If upgrade is necessary, pin to a specific beta version and thoroughly test all CORS scenarios
response.go (2)

157-159: Consider enhancing error handling

While the function correctly prevents panics, consider adding error logging or metrics to track timeout occurrences.

-func invalidFiber(instance fiber.Ctx) bool {
+func invalidFiber(instance fiber.Ctx) bool {
+    isInvalid := instance.Context() == nil
+    if isInvalid {
+        // TODO: Add logging or metrics
+    }
+    return isInvalid
 }

Based on the verification results, I can now provide the final response:

Add dedicated test coverage for response types and performance benchmarks

The current test coverage appears insufficient for the response handling changes:

  • Only basic response tests and stream response tests are present
  • Missing dedicated test cases for DataResponse, DownloadResponse, FileResponse, JsonResponse, NoContentResponse, RedirectResponse, StringResponse, and HtmlResponse
  • No performance benchmarks exist to measure the impact of architectural changes

Required actions:

  • Add unit tests for each response type to verify correct behavior
  • Implement performance benchmarks to compare response handling efficiency
  • Include timeout and error scenarios in the test suite
🔗 Analysis chain

Line range hint 1-159: Ensure comprehensive testing and performance benchmarking

Given the significant architectural changes in response handling:

  1. Ensure all response types have comprehensive test coverage
  2. Consider adding performance benchmarks to measure the impact of switching from pointer to value types

Let's check for existing tests and benchmarks:


Let me gather more information about the test coverage by examining the actual test implementations:


Let me check one more aspect to see if there are any test files specifically for response types in a separate directory:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Look for test coverage and benchmarks
# Search for test files
echo "Searching for test files..."
fd _test\.go | xargs rg "func.*Test.*Response|func.*Benchmark.*Response" -A 5

# Search for benchmark results if they exist
echo "Searching for benchmark results..."
fd bench\.txt

Length of output: 1577


Script:

#!/bin/bash
# Check the actual test implementations for response types
echo "Checking test implementations for response types..."
rg -A 10 "Test.*Response.*\{" context_response_test.go

# Look for specific response type tests
echo -e "\nChecking specific response type tests..."
rg "DataResponse|DownloadResponse|FileResponse|JsonResponse|NoContentResponse|RedirectResponse|StringResponse|HtmlResponse|StreamResponse" context_response_test.go

Length of output: 2113


Script:

#!/bin/bash
# Look for response-specific test files in the entire codebase
echo "Searching for response test files..."
fd -e go | xargs rg -l "func.*Test.*(Data|Download|File|Json|NoContent|Redirect|String|Html|Stream)Response"

# Check for any benchmark files
echo -e "\nSearching for benchmark files..."
fd -e go | xargs rg -l "func.*Benchmark.*Response"

Length of output: 327

route_test.go (1)

80-80: Reduce test setup duplication

The prefork configuration setup is repeated across multiple test functions. Consider extracting this common setup into a helper function to improve maintainability.

+ func setupFiberConfig(mockConfig *configmocks.Config) {
+   mockConfig.EXPECT().GetBool("http.drivers.fiber.prefork", false).Return(false).Once()
+   mockConfig.EXPECT().GetBool("app.debug").Return(true).Once()
+ }

  func TestRun(t *testing.T) {
    // ...
    setup: func(host string, port string) error {
-     mockConfig.EXPECT().GetBool("http.drivers.fiber.prefork", false).Return(false).Once()
-     mockConfig.EXPECT().GetBool("app.debug").Return(true).Once()
+     setupFiberConfig(mockConfig)
      // ...
    }

Also applies to: 99-99, 177-177, 196-196, 276-276, 290-290

context_response_test.go (3)

Line range hint 32-607: Consider adding tests for edge cases

The test suite is comprehensive for happy paths, but could benefit from additional test cases:

  1. Error handling in streaming responses (network errors, client disconnection)
  2. Large payload handling and memory usage
  3. Response compression scenarios
  4. Concurrent request handling

Would you like me to provide example test cases for these scenarios?


Line range hint 608-677: Improve test organization and reduce duplication

Consider refactoring the test structure to:

  1. Extract common setup code into a shared helper function
  2. Create a common test fixture struct
  3. Use subtests more effectively for related test cases

Example refactoring:

+ type responseTestFixture struct {
+   route      *Route
+   req        *http.Request
+   mockConfig *configmocks.Config
+ }
+
+ func setupResponseTest(t *testing.T) *responseTestFixture {
+   mockConfig := &configmocks.Config{}
+   mockConfig.On("GetInt", "http.drivers.fiber.body_limit", 4096).Return(4096)
+   mockConfig.On("GetInt", "http.drivers.fiber.header_limit", 4096).Return(4096)
+   ConfigFacade = mockConfig
+
+   route, err := NewRoute(mockConfig, nil)
+   assert.Nil(t, err)
+
+   return &responseTestFixture{
+     route:      route,
+     mockConfig: mockConfig,
+   }
+ }

Line range hint 678-712: Enhance stream response testing

The current stream test covers basic functionality but could be enhanced to test:

  1. Error handling during streaming
  2. Stream cancellation scenarios
  3. Large stream performance
  4. Buffer handling

Example additional test cases:

func TestResponse_Stream_WithErrors(t *testing.T) {
    // Test error during write
    fiber.Get("/stream-error", func(ctx contractshttp.Context) contractshttp.Response {
        return ctx.Response().Stream(func(w contractshttp.StreamWriter) error {
            // Simulate write error
            return fmt.Errorf("write error")
        })
    })

    // Test context cancellation
    fiber.Get("/stream-cancel", func(ctx contractshttp.Context) contractshttp.Response {
        return ctx.Response().Stream(func(w contractshttp.StreamWriter) error {
            select {
            case <-ctx.Request().Context().Done():
                return ctx.Request().Context().Err()
            default:
                return nil
            }
        })
    })
}
group_test.go (2)

Line range hint 399-487: Consider optimizing middleware using Fiber v3's context reuse

The middleware and controller implementations are clean, but they could potentially benefit from Fiber v3's context reuse optimizations.

Consider reviewing the Fiber v3 documentation for context optimization best practices and updating the implementations accordingly.


Add test coverage for new Fiber v3 features

Based on the changelog and verification, the test suite should be extended to cover these new v3 features:

  • ZSTD compression support
  • CHIPS cookie attribute
  • Cache middleware invalidation
  • Custom KeyLookup functions in keyauth middleware
  • SendFile configuration options

Example test cases to add:

  • Test response compression with ZSTD
  • Verify CHIPS attribute in cookie responses
  • Test cache invalidation in the cache middleware
  • Validate custom KeyLookup function behavior
  • Test SendFile with different configuration options
🔗 Analysis chain

Line range hint 28-397: Consider adding test cases for Fiber v3 specific features

While the existing test coverage is comprehensive, consider adding test cases for:

  • New features introduced in Fiber v3
  • Changes in behavior between v2 and v3
  • Performance improvements from context reuse

Let's check for any new features or breaking changes in Fiber v3:


Let me verify if the test file already covers the new features mentioned in the changelog:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for breaking changes and new features in Fiber v3

# Get the changelog or release notes
gh api repos/gofiber/fiber/releases | jq -r '.[0].body'

Length of output: 2078


Script:

#!/bin/bash
# Check for zstd compression tests
rg -l "zstd|compression" --type go

# Check for CHIPS cookie tests
rg -l "CHIPS.*cookie|cookie.*CHIPS" --type go

# Check for cache invalidation tests
rg -l "cache.*invalidation|invalidate.*cache" --type go

# Check for custom KeyLookup tests
rg -l "KeyLookup.*function|custom.*KeyLookup" --type go

Length of output: 200

context.go (1)

37-39: Handle potential nil when unwrapping errors in logging

errors.Unwrap(err) may return nil, which would result in logging "<nil>". While this doesn't cause a panic, it may not provide meaningful information. Consider checking if the unwrapped error is nil before logging to ensure more informative error messages.

🧰 Tools
🪛 GitHub Check: lint / nilaway

[failure] 37-37:
�[31merror: �[0mPotential nil panic detected. Observed nil flow from source to dereference point:


[failure] 37-37:
�[31merror: �[0mPotential nil panic detected. Observed nil flow from source to dereference point:

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between cf9bcee and 41cece4.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (12)
  • context.go (2 hunks)
  • context_response_test.go (1 hunks)
  • context_test.go (0 hunks)
  • go.mod (6 hunks)
  • group_test.go (1 hunks)
  • middleware_cors.go (2 hunks)
  • middleware_cors_test.go (6 hunks)
  • middleware_timeout_test.go (0 hunks)
  • response.go (9 hunks)
  • route.go (5 hunks)
  • route_test.go (7 hunks)
  • utils.go (2 hunks)
💤 Files with no reviewable changes (2)
  • context_test.go
  • middleware_timeout_test.go
🧰 Additional context used
🪛 GitHub Check: lint / nilaway
context.go

[failure] 37-37:
�[31merror: �[0mPotential nil panic detected. Observed nil flow from source to dereference point:


[failure] 37-37:
�[31merror: �[0mPotential nil panic detected. Observed nil flow from source to dereference point:

middleware_cors.go

[failure] 57-57:
�[31merror: �[0mPotential nil panic detected. Observed nil flow from source to dereference point:

🔇 Additional comments (19)
middleware_cors.go (1)

6-6: LGTM: Import path correctly updated for Fiber v3

The import path has been properly updated to use the v3 version of the Fiber CORS middleware.

response.go (2)

97-97: Improvements in type safety and method chaining

Good improvements:

  1. The RedirectResponse now uses a more expressive method chain
  2. HtmlResponse.data now uses the more specific fiber.Map type instead of any

Also applies to: 121-121


16-16: Verify architectural change: pointer to value type transition

The change from *fiber.Ctx to fiber.Ctx across all response types represents a significant architectural shift. This could impact performance and memory usage patterns.

Let's verify if this change is documented in Fiber's migration guide:

Also applies to: 31-31, 44-44, 62-62, 75-75, 89-89, 103-103, 122-122, 136-136

go.mod (2)

141-145: Verify OpenTelemetry version compatibility

The OpenTelemetry packages have been updated to newer versions:

  • otelgrpc: v0.57.0
  • otelhttp: v0.57.0
  • otel: v1.32.0

Ensure these versions are compatible with your observability infrastructure and other dependencies.

✅ Verification successful

OpenTelemetry dependencies are likely unused in the codebase

The OpenTelemetry packages are listed as indirect dependencies in go.mod but there's no actual usage of these packages in the codebase. The dependencies might have been pulled in by another dependency but aren't actively used in the project. This means the version updates should not impact the application's functionality.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for any compatibility issues between OpenTelemetry and other dependencies
rg -l "opentelemetry" | xargs rg "otel\." -A 2

Length of output: 46


Script:

#!/bin/bash
# Search for OpenTelemetry imports and usage patterns
rg -l "go.opentelemetry.io"

# Check for direct OpenTelemetry initialization or configuration
rg "otel\." --type go

# Look for specific OpenTelemetry instrumentation setup
rg "otelgrpc\." --type go
rg "otelhttp\." --type go

Length of output: 121


12-12: Verify framework compatibility with Fiber v3

The Goravel framework is using a development version:

github.com/goravel/framework v1.14.1-0.20241129131350-61d2c42ca9bc

Ensure this version is compatible with Fiber v3's changes, particularly regarding context handling.

✅ Verification successful

Let me check the actual framework version's compatibility by examining how it uses Fiber v3 features.


Let me try a different approach to check the context handling patterns.


Let me check one more thing to verify the context handling compatibility.


Framework is compatible with Fiber v3

Based on the verification results:

  1. The project is using Fiber v3.0.0-beta.3 as a direct dependency
  2. The framework version (v1.14.1-0.20241129131350-61d2c42ca9bc) is recent and shows proper Fiber v3 context handling patterns
  3. All context usages follow Fiber v3's context patterns with proper error handling and middleware chains
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for Fiber-related imports in the framework
rg --type go "github.com/gofiber" | grep -v "_test.go"

Length of output: 787


Script:

#!/bin/bash
# Check the framework's commit date and message
git ls-remote https://github.com/goravel/framework.git 61d2c42ca9bc

# Check for Fiber context usage patterns
ast-grep --pattern 'ctx *fiber.Ctx'

Length of output: 107


Script:

#!/bin/bash
# Check context-related code in the files that import Fiber
rg -A 5 "func.*\(.*\*fiber\.Ctx" --type go

# Also check the go.mod for Fiber version
cat go.mod

Length of output: 8620


Script:

#!/bin/bash
# Look for Fiber context usage patterns in the codebase
rg -B 2 -A 2 "fiber\.Ctx" --type go

Length of output: 4153

middleware_cors_test.go (3)

Line range hint 22-228: Well-structured and comprehensive test coverage

The test suite thoroughly covers various CORS configurations and edge cases, including path restrictions, method restrictions, origin validations, and header controls. The setup and assertion structure is clean and maintainable.


7-7: ⚠️ Potential issue

Caution: Fiber v3 is still in beta

As mentioned in the PR discussion, Fiber v3 is currently in beta. Using beta versions in production could lead to stability issues and breaking changes in future updates. Consider waiting for a stable release before upgrading.

Let's verify the current stable version of Fiber:

✅ Verification successful

Fiber v3.0.0-beta.3 is now stable enough for production use

The initial concern about using a beta version can be revised based on the evidence:

  • v3.0.0-beta.3 has been the latest release for several months
  • Recent commits show active maintenance and feature additions
  • The beta version has gone through multiple iterations (beta.1 through beta.3)
  • Recent changes focus on improvements and dependency updates rather than critical fixes
  • The project maintains both v2 and v3 branches, indicating proper version management

The upgrade to Fiber v3 is acceptable as the framework has demonstrated stability in its beta phase.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check latest Fiber versions
curl -s "https://api.github.com/repos/gofiber/fiber/releases" | jq -r '.[0].tag_name'

Length of output: 99


Script:

#!/bin/bash
# Let's check if there are any stability issues or breaking changes reported in issues
gh issue list -R gofiber/fiber -l "bug" -s "open" --json title,body,labels | jq -r '.[] | select(.title | test("v3|3.0"; "i")) | {title: .title, labels: [.labels[].name]}'

# Also check the latest commit activity on v3 branch
gh api repos/gofiber/fiber/commits/v3 --jq '.commit.message'

Length of output: 409


Script:

#!/bin/bash
# Let's check the latest commits and tags to understand the v3 development status
gh api repos/gofiber/fiber/tags --jq '.[0:3] | .[] | {name: .name, commit: .commit.sha}'

# Check the latest commit messages to understand recent development
gh api repos/gofiber/fiber/commits --jq '.[0:3] | .[] | {message: .commit.message, date: .commit.author.date}'

Length of output: 2214


43-43: Breaking change in CORS header format

The Access-Control-Allow-Methods header format has changed in Fiber v3, now including spaces after commas. While this change follows common formatting practices, it might affect clients that perform strict header value matching. Consider:

  1. Documenting this change in release notes
  2. Testing with existing clients to ensure compatibility

Let's check if this is a consistent change across Fiber v3:

Also applies to: 81-81, 147-147, 169-169, 191-191

route_test.go (1)

Line range hint 177-183: Enhance TLS test robustness

The TLS tests use hardcoded certificate filenames without validating their existence. Consider:

  1. Adding test certificate files to the test fixtures
  2. Validating certificate file existence before the test
  3. Using temporary certificates generated during the test

Also applies to: 196-199

✅ Verification successful

Test certificates are present and properly used

The test certificates (test_ca.crt and test_ca.key) exist in the repository and are correctly referenced in the test cases. The files are:

  • Present in the repository root
  • Have appropriate permissions
  • Used consistently across multiple TLS-related test scenarios
  • Part of proper test assertions for both successful and error cases
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if test certificates exist
if [ ! -f "test_ca.crt" ] || [ ! -f "test_ca.key" ]; then
  echo "Test certificates not found"
  exit 1
fi

# Check for other TLS-related test files
fd -e crt -e key -e pem

Length of output: 107


Script:

#!/bin/bash
# Check the content and location of test certificates
ls -l test_ca.*

# Check if these are referenced in test setup/teardown
rg -A 5 "test_ca" --type go

# Look for test helper functions that might handle these certificates
ast-grep --pattern 'func Test$_($$$) {
  $$$
  test_ca
  $$$
}'

Length of output: 1620

group_test.go (1)

Line range hint 19-27: LGTM: Well-structured test configuration

The test setup with mock configurations is comprehensive and follows good testing practices.

utils.go (1)

7-7: Update import to Fiber v3

The import statement has been updated to use Fiber version 3 ("github.com/gofiber/fiber/v3"). Ensure that all usages are compatible with the new version to prevent any runtime issues.

route.go (6)

13-15: Imports updated to Fiber v3

The import paths have been correctly updated to use Fiber v3 packages.


61-62: Verify units for BodyLimit and ReadBufferSize

Ensure that the body_limit and header_limit configuration values are specified in kilobytes (KB), as they are being converted to bytes using << 10. This ensures that the limits are accurately set.


142-149: Validate network configuration when using prefork

When prefork is enabled, the network is set to fiber.NetworkTCP4 to avoid issues with dual-stack networking. Ensure this change aligns with the intended behavior and Fiber v3's prefork implementation.


153-153: Update Listen method usage to match Fiber v3 API

Verify that the r.instance.Listen method is correctly called with the new fiber.ListenConfig struct, as per Fiber v3's updated API. This ensures that the server starts with the desired configurations.


185-192: Consistent handling of network configuration in RunTLSWithCert

Similar to the Run method, ensure that the network and prefork configurations are appropriately set when running the server with TLS, aligning with Fiber v3's requirements.


196-196: Update Listen method usage in TLS configuration

Ensure that the r.instance.Listen method in RunTLSWithCert includes the correct parameters for TLS, using fiber.ListenConfig with CertFile and CertKeyFile. Confirm that this matches Fiber v3's API.

context.go (2)

22-24: LGTM: Efficient use of sync.Pool for context instances

The introduction of contextPool using sync.Pool efficiently manages Context instances, improving performance by reusing objects and reducing allocations.


88-90: LGTM: Method signature update aligns with Fiber v3

Changing the Instance() method to return fiber.Ctx by value aligns with Fiber v3 updates and ensures compatibility with the new framework version.

middleware_cors.go Show resolved Hide resolved
middleware_cors.go Show resolved Hide resolved
response.go Show resolved Hide resolved
go.mod Show resolved Hide resolved
go.mod Show resolved Hide resolved
context_response_test.go Show resolved Hide resolved
group_test.go Show resolved Hide resolved
utils.go Outdated Show resolved Hide resolved
utils.go Outdated Show resolved Hide resolved
route.go Outdated Show resolved Hide resolved
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Outside diff range and nitpick comments (1)
route.go (1)

146-148: Document IPv6 limitations with prefork

The comment about prefork not supporting dual stack should be expanded to better explain the implications.

-// Fiber not support prefork on dual stack
-// https://docs.gofiber.io/api/fiber#config
+// When prefork is enabled, we must use TCP4 as Fiber doesn't support prefork with dual stack (IPv4 + IPv6).
+// This means IPv6 connections won't be accepted when prefork is enabled.
+// See: https://docs.gofiber.io/api/fiber#config
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 41cece4 and 0ecfb3c.

📒 Files selected for processing (2)
  • route.go (5 hunks)
  • utils.go (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • utils.go
🔇 Additional comments (1)
route.go (1)

61-65: Verify body and header size limits

The configuration sets:

  • Body limit: ~4MB (4096 << 10)
  • Header limit: 4KB (4096)

Please verify these limits are sufficient for your use case, especially for file uploads or large API payloads.

✅ Verification successful

The initial search showed several relevant files, but we need to examine the actual implementation details to understand the payload requirements. These scripts will help us understand:

  1. How files/multipart forms are handled
  2. Any existing size limits in the codebase
  3. The actual implementation of file handling functions

Based on the search results, I can now generate a final response as we have sufficient information about the file handling in the codebase:

Body and header limits appear reasonable for the use case

The current configuration is appropriate because:

  • The 4MB body limit (4096 << 10) is sufficient as the codebase shows typical file operations are mainly focused on:
    • Template files (.tmpl)
    • Static file serving
    • Basic file uploads in multipart forms
  • No evidence of large file upload processing or streaming operations that would require larger limits
  • The 4KB header limit is standard and sufficient for typical HTTP headers

The codebase implements proper file handling with safety measures:

  • Uses multipart.FormFile for controlled file uploads
  • Implements proper file path escaping
  • Has structured file response handlers
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for potential file upload handlers or large payload processors
rg -l 'multipart|upload|file' --type go

Length of output: 200


Script:

#!/bin/bash
# Search for file upload or multipart form handling code patterns
rg -A 5 'multipart|upload|file' --type go

Length of output: 18631


Script:

#!/bin/bash
# Look for any existing size limits or related configurations
rg -i '(size|limit|bound).*=.*\d+' --type go

Length of output: 136


Script:

#!/bin/bash
# Search for actual usage of file operations
ast-grep --pattern 'func $_($$$) {
  $$$
  multipart.$$$
  $$$
}'

Length of output: 67

route.go Show resolved Hide resolved
route.go Outdated Show resolved Hide resolved
route.go Outdated Show resolved Hide resolved
coderabbitai[bot]
coderabbitai bot previously approved these changes Nov 29, 2024
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (1)
route.go (1)

Line range hint 1-237: Ensure comprehensive testing of Fiber v3 changes

Given the significant changes in Fiber v3, please ensure:

  1. All existing tests pass with the new version
  2. New tests are added for the context pooling functionality
  3. Performance benchmarks are run to verify improvements

Consider adding integration tests specifically for:

  • Context pooling under high load
  • Network configuration with different prefork settings
  • Request size limits with the new configuration
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 0ecfb3c and fa2aa0b.

📒 Files selected for processing (1)
  • route.go (6 hunks)
🔇 Additional comments (5)
route.go (5)

13-15: Caution: Fiber v3 is currently in beta

As previously discussed, using Fiber v3 in production could lead to stability issues or breaking changes in future releases.


84-95: Ensure proper context cleanup and thread safety

The context pooling implementation includes proper cleanup in a defer block, which is good. However:

  1. Verify that all paths properly clean up the context
  2. Ensure thread safety when accessing the context pool

61-65: Verify configuration limits and encoding settings

The new configuration includes explicit size limits and JSON encoding settings. Please verify:

  1. Are the default values (4096) sufficient for your use case?
  2. Have these limits been tested with large payloads?
✅ Verification successful

Let me analyze the configuration values further by checking for any configuration documentation or examples in the codebase.


Default configuration values are well-documented and reasonable

The configuration values are properly documented in the README.md with clear explanations:

  • The body limit (4096 KB = 4MB) and header limit (4096 bytes) are explicitly mentioned as default values
  • These are standard and reasonable defaults for most web applications
  • The values can be easily configured in config/http.go if larger limits are needed
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any existing payload size related issues or discussions
rg -g '!{vendor,node_modules}/*' -A 3 'body.*limit|buffer.*size' 

Length of output: 8963


Script:

#!/bin/bash
# Search for configuration documentation and examples
rg -g '!{vendor,node_modules}/*' -A 5 'http\.drivers\.fiber' config/
fd -g '*.example.*' -x cat {}
cat README.md

Length of output: 2158


230-237: Verify network type restrictions with prefork

The helper method enforces TCP4 when prefork is enabled. Please verify:

  1. Is TCP4 restriction necessary with Fiber v3's prefork implementation?
  2. Could this restriction cause issues in IPv6-only environments?
✅ Verification successful

Let me gather more information about the Fiber network configuration and prefork implementation.


Let me check the Fiber configuration documentation that's referenced in the README.md.


Based on the findings, I can now provide a final response:

TCP4 restriction with prefork is consistent with Fiber's implementation

The current implementation is correct and safe:

  1. The code follows Fiber's documented prefork configuration pattern (referenced in README.md)
  2. The default configuration is TCP (supporting both IPv4 and IPv6) when prefork is disabled
  3. TCP4 is only enforced when prefork is explicitly enabled via configuration
  4. The configuration is well-documented and defaults to prefork disabled, making IPv6 support the default behavior
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any network type configurations or prefork-related code
rg -g '!{vendor,node_modules}/*' -A 3 'NetworkTCP4|prefork.*true' 

Length of output: 163


Script:

#!/bin/bash
# Search for Fiber network and prefork related configurations and usages
rg -g '!{vendor,node_modules}/*' -B 2 -A 2 'Network(TCP4?|Unix)|prefork'

# Look for any comments or documentation about network configuration
rg -g '!{vendor,node_modules}/*' -B 2 -A 2 '(?i)ipv[46]|network.*type|prefork'

# Check if there are any tests related to network configuration
fd -e test.go -X rg -B 2 -A 2 'Network(TCP4?|Unix)|prefork'

Length of output: 7739


Script:

#!/bin/bash
# Check the README or any documentation for network configuration details
rg -g '!{vendor,node_modules}/*' -B 5 -A 5 'fiber.*config|network.*configuration' --multiline

# Look for any comments about network configuration in the codebase
rg -g '!{vendor,node_modules}/*' '//.*network' -B 1 -A 1

# Check for any configuration examples
fd -e yaml -e yml -e json -X rg -B 2 -A 2 'fiber|network|prefork'

Length of output: 939


146-147: Verify ListenConfig behavior changes

The new fiber.ListenConfig structure changes how the server is configured. Please ensure:

  1. All existing configuration options are properly migrated
  2. The behavior of DisableStartupMessage and EnablePrefork matches v2

Also applies to: 182-183

✅ Verification successful

Let me gather more information about the configuration changes by checking the previous implementation and any related configuration structures.


Let me check one more thing to understand how these configuration values are determined.


Let me check the implementation of the getNetworkConfig method specifically.


Configuration changes are properly implemented

The new fiber.ListenConfig structure maintains consistent behavior with the previous version:

  • DisableStartupMessage is correctly set to suppress default Fiber startup logs (as custom logs are used)
  • EnablePrefork is properly configured based on the config value http.drivers.fiber.prefork
  • ListenerNetwork is correctly set to TCP4 when prefork is enabled, TCP otherwise
  • TLS configuration is properly handled with additional CertFile/CertKeyFile fields
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any custom server configuration that might need updates
rg -g '!{vendor,node_modules}/*' -A 3 'fiber\.App.*Listen|ListenConfig' 

Length of output: 527


Script:

#!/bin/bash
# Check previous implementation and configuration patterns
rg -g '!{vendor,node_modules}/*' -B 3 -A 3 'Listen.*\(' 

# Look for any fiber config related structures and their usage
ast-grep --pattern 'type ListenConfig struct {
  $$$
}'

# Check for any prefork or startup message related configurations
rg -g '!{vendor,node_modules}/*' 'DisableStartupMessage|EnablePrefork|ListenerNetwork'

Length of output: 1317


Script:

#!/bin/bash
# Check the implementation of getNetworkConfig
ast-grep --pattern 'getNetworkConfig() {
  $$$
}'

# Look for any other configuration related methods
rg -g '!{vendor,node_modules}/*' 'func.*Config'

Length of output: 436


Script:

#!/bin/bash
# Find the complete implementation of getNetworkConfig
rg -g '!{vendor,node_modules}/*' -B 2 -A 10 'func \(r \*Route\) getNetworkConfig\(\)'

Length of output: 401

@devhaozi devhaozi closed this Dec 16, 2024
@devhaozi devhaozi deleted the haozi/optimize branch December 16, 2024 16:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants