From 3f2e37ca810fe01695dac93fb0845878fa7878ea Mon Sep 17 00:00:00 2001 From: RafsanNeloy Date: Sun, 30 Mar 2025 20:48:36 +0600 Subject: [PATCH 1/3] Implement code refactoring for improved readability and maintainability --- .../2025/gsoc/Api_Testing_Support.md | 165 ++++++++++++++++++ doc/proposals/2025/gsoc/images/foss.jpeg | Bin 0 -> 52080 bytes 2 files changed, 165 insertions(+) create mode 100644 doc/proposals/2025/gsoc/Api_Testing_Support.md create mode 100644 doc/proposals/2025/gsoc/images/foss.jpeg diff --git a/doc/proposals/2025/gsoc/Api_Testing_Support.md b/doc/proposals/2025/gsoc/Api_Testing_Support.md new file mode 100644 index 00000000..ea832265 --- /dev/null +++ b/doc/proposals/2025/gsoc/Api_Testing_Support.md @@ -0,0 +1,165 @@ +1. Full Name: MD. Rafsanul Islam Neloy +2. Email: rafsanneloy@gmail.com +3. Phone: +880 1325161428 +4. Discord handle: rafsanneloy (756821234259460157) +5. GitHub: https://github.com/RafsanNeloy +6. LinkedIn: https://www.linkedin.com/in/md-rafsanul-neloy +7. Time zone: GMT +6 (Bangladesh) +8. Resume: https://drive.google.com/file/d/1_7YC1meQ0juyK80Bvp4A_9bmbfKqZcB7/view?usp=drive_link + + +### Key Points +- It seems likely that adding support for WebSocket, SSE, MQTT, and gRPC in API Dash will enhance its capabilities for real-time and high-performance API testing. +- The project involves designing the core library architecture, understanding protocol specifications, and implementing testing, visualization, and code generation features. +- Research suggests that this will benefit developers working on modern applications, especially in web, IoT, and microservices, by providing a unified tool. + +--- + +### Introduction to API Dash and Project Scope +API Dash is an open-source, cross-platform API client built with Flutter, supporting macOS, Windows, Linux, Android, and iOS. It currently allows developers to create, customize, and test HTTP and GraphQL API requests, with features like response visualization and code generation in multiple programming languages. This project aims to extend API Dash by adding support for testing, visualization, and integration code generation for WebSocket, Server-Sent Events (SSE), Message Queuing Telemetry Transport (MQTT), and gRPC protocols. + +These protocols are crucial for real-time communication and efficient data exchange, used in applications ranging from web and mobile to Internet of Things (IoT) devices and microservices. By integrating these, API Dash will become a more versatile tool, catering to a broader range of developer needs. + +### Project Details and Implementation +The project involves several key steps: +- **Research and Specification Analysis**: Understand the specifications of WebSocket, SSE, MQTT, and gRPC to ensure correct implementation of their communication patterns. +- **Architecture Design**: Design the core library to integrate these protocols, ensuring modularity and compatibility with existing features. +- **Implementation**: Develop protocol handlers using Dart libraries (e.g., `web_socket_channel` for WebSocket, `mqtt_client` for MQTT, `grpc` for gRPC), create user interfaces with Flutter, and extend visualization and code generation features. +- **Testing and Validation**: Write unit and integration tests, test with real-world scenarios, and gather community feedback. +- **Documentation**: Update API Dash documentation with guides and examples for the new protocols. + +Each protocol will have specific features: +- **WebSocket**: Support connection establishment, sending/receiving text and binary messages, and real-time visualization. +- **SSE**: Enable connecting to endpoints, displaying incoming events with data and type, and handling automatic reconnection. +- **MQTT**: Allow connecting to brokers, subscribing/publishing to topics, and managing QoS levels and connection status. +- **gRPC**: Import .proto files, select services/methods, input parameters, and display responses, initially focusing on unary calls with potential for streaming. + +### Expected Outcomes and Benefits +Upon completion, API Dash will offer full support for testing these protocols, intuitive user interfaces, advanced visualization tools, and code generation in languages like JavaScript, Python, and Java. This will benefit developers by providing a unified tool for diverse API interactions, enhancing productivity and application quality, especially for real-time and high-performance systems. + +An unexpected detail is that the project will also involve ensuring cross-platform compatibility, which is crucial for mobile and desktop users, potentially expanding API Dash's user base. + +--- + +### Survey Note: Detailed Analysis of API Testing Support Expansion in API Dash + +This note provides a comprehensive analysis of the proposed project to extend API Dash, an open-source API client built with Flutter, by adding support for WebSocket, Server-Sent Events (SSE), Message Queuing Telemetry Transport (MQTT), and gRPC protocols. The project aims to enhance testing, visualization, and integration code generation capabilities, catering to modern application development needs. + +#### Background and Context +API Dash, available at [GitHub Repository](https://github.com/foss42/apidash), is designed for cross-platform use, supporting macOS, Windows, Linux, Android, and iOS. It currently facilitates HTTP and GraphQL API testing, with features like response visualization and code generation in languages such as JavaScript, Python, and Java. The project idea, discussed at [API Dash Discussions](https://github.com/foss42/apidash/discussions/565/), addresses the need to support additional protocols essential for real-time communication and high-performance systems, as outlined in related issues: [#15](https://github.com/foss42/apidash/issues/15), [#115](https://github.com/foss42/apidash/issues/115), [#116](https://github.com/foss42/apidash/issues/116), and [#14](https://github.com/foss42/apidash/issues/14). + +The protocols in focus—WebSocket, SSE, MQTT, and gRPC—serve diverse purposes: +- **WebSocket** enables full-duplex communication over a single TCP connection, ideal for real-time web applications like chat and live updates. +- **SSE** is a server-push technology for unidirectional updates from server to client, suitable for live data feeds. +- **MQTT**, a lightweight messaging protocol, is designed for IoT devices, supporting publish-subscribe messaging. +- **gRPC**, using HTTP/2 and Protocol Buffers, facilitates high-performance RPC calls with features like bi-directional streaming and load balancing. + +This expansion aligns with the growing demand for tools supporting real-time and IoT applications, positioning API Dash as a comprehensive solution. + +#### Project Objectives and Scope +The primary objectives include: +1. **Protocol Support Implementation**: Develop modules to handle WebSocket, SSE, MQTT, and gRPC, ensuring compliance with their specifications. +2. **User Interface Enhancements**: Design intuitive UIs for each protocol, maintaining consistency with API Dash's existing design, and supporting features like connection management and message handling. +3. **Visualization Tools**: Create components for displaying requests, responses, and events, with features like syntax highlighting and real-time updates. +4. **Code Generation**: Extend the existing code generation functionality to support these protocols in multiple programming languages, ensuring accuracy and efficiency. +5. **Documentation and Testing**: Provide comprehensive documentation and implement thorough testing to ensure reliability. + +The project, with a difficulty rated as medium-high and requiring skills in understanding specs/protocols, UX design, Dart, and Flutter, is estimated at 350 hours, as per the project idea table: + +| Feature | Details | +|---------|---------| +| API Types Supported | HTTP (✅), GraphQL (✅), SSE (#116), WebSocket (#15), MQTT (#115), gRPC (#14) | +| Import Collection From | Postman (✅), cURL (✅), Insomnia (✅), OpenAPI (#121), hurl (#123), HAR (#122) | +| Code Generation Languages/Libraries | cURL, HAR, C (libcurl), C# (HttpClient, RestSharp), Dart (http, dio), Go (net/http), JavaScript (axios, fetch, node.js axios, node.js fetch), Java (asynchttpclient, HttpClient, okhttp3, Unirest), Julia (HTTP), Kotlin (okhttp3), PHP (curl, guzzle, HTTPlug), Python (requests, http.client), Ruby (faraday, net/http), Rust (hyper, reqwest, ureq, Actix Client), Swift (URLSession) | +| MIME Types for Response Preview | PDF (application/pdf), Various Videos (video/mp4, video/webm, etc.), Images (image/apng, image/avif, etc.), Audio (audio/flac, audio/mpeg, etc.), CSV (text/csv), Syntax Highlighted (application/json, application/xml, etc.) | +| Download Links | iOS/iPad: [App Store](https://apps.apple.com/us/app/api-dash-api-client-testing/id6711353348), macOS: [Release](https://github.com/foss42/apidash/releases/latest/download/apidash-macos.dmg), Windows: [Release](https://github.com/foss42/apidash/releases/latest/download/apidash-windows-x86_64.exe), Linux (deb, rpm, PKGBUILD): [Installation Guide](https://github.com/foss42/apidash/blob/main/INSTALLATION.md) | + +#### Methodology and Implementation Details +The implementation will proceed in phases: +1. **Research and Specification Analysis**: Analyze the specifications of each protocol to understand communication models. For instance, WebSocket uses a single TCP connection for full-duplex communication, while gRPC leverages HTTP/2 and Protocol Buffers for RPC calls. +2. **Architecture Design**: Design the core library to integrate new protocols, ensuring modularity. This involves creating interfaces for protocol handlers and ensuring compatibility with Flutter's cross-platform nature. +3. **Implementation**: Use established Dart packages for efficiency: + - WebSocket: Leverage `web_socket_channel` for connection and message handling. + - SSE: Utilize the `http` package for HTTP-based event streaming. + - MQTT: Use `mqtt_client` for broker connections and publish-subscribe functionality. + - gRPC: Employ the `grpc` package, handling .proto file parsing and method calls. + Develop Flutter UIs for each protocol, ensuring responsiveness across platforms, including mobile devices. +4. **Testing and Validation**: Write unit tests for protocol handlers and integration tests for UI interactions. Test with sample APIs and real-world scenarios, such as connecting to public MQTT brokers or gRPC services. +5. **Documentation**: Update the documentation at [GitHub Repository](https://github.com/foss42/apidash) with guides, including examples for connecting to WebSocket endpoints or calling gRPC methods. + +| **Type of Test** | **Description** | **Examples for Protocols** | +|-----------------------------|-------------------------------------------------------------------------------|-----------------------------------------------------------------| +| **Unit Tests** | Test individual components in isolation to verify functionality. | - Verify WebSocket message encoding/decoding.
- Test gRPC .proto file parsing.
- Check MQTT QoS level handling. | +| **Widget Tests** | Validate UI components to ensure user interactions work as expected. | - Test WebSocket URL input field.
- Verify SSE event display.
- Check gRPC method selection UI. | +| **Integration Tests** | Ensure all components work together for the complete feature flow. | - Test connecting to a WebSocket server, sending a message, and receiving a response.
- Verify MQTT subscribe/publish flow.
- Validate gRPC unary call end-to-end. | +| **Code Generation Tests** | Verify that generated code for each protocol in supported languages is correct and functional. | - Ensure WebSocket code in JavaScript uses standard APIs.
- Validate Python MQTT code with `paho-mqtt` library.
- Check gRPC code generation for Java. | +| **Cross-Platform Tests** | Run tests on different platforms to ensure compatibility and consistent behavior. | - Test WebSocket on macOS, Windows, Linux, Android, and iOS.
- Verify SSE on mobile devices.
- Ensure gRPC works across desktop and mobile. | +| **Edge Case and Error Handling Tests** | Test scenarios like connection failures, invalid inputs, and large data sets to ensure stability. | - Test WebSocket connection failure.
- Verify SSE handles invalid event streams.
- Check gRPC with invalid .proto files.
- Test MQTT with wrong broker credentials. | + + +Specific features for each protocol include: +- **WebSocket**: Connection establishment with URL and headers, sending/receiving messages, and real-time visualization with timestamps. +- **SSE**: Connecting to endpoints, displaying events with data and type, and handling reconnection with retry intervals. +- **MQTT**: Broker connection with authentication, topic subscription/publishing, and QoS level management, with visualization of message history. +- **gRPC**: Importing .proto files, selecting services/methods, inputting parameters, and displaying responses, initially focusing on unary calls with potential for streaming. + +#### Expected Outcomes and Impact +The project will deliver: +- Full support for testing WebSocket, SSE, MQTT, and gRPC APIs, enhancing API Dash's versatility. +- Intuitive UIs for protocol interactions, ensuring a seamless user experience across platforms. +- Advanced visualization tools, such as syntax-highlighted message logs and real-time updates, improving data inspection. +- Code generation for integrating APIs in languages like JavaScript, Python, and Java, using standard libraries (e.g., WebSocket API for JavaScript, `requests` for Python MQTT). +- Comprehensive documentation, aiding developers in leveraging new features. + +An unexpected detail is the focus on cross-platform compatibility, crucial for mobile users, potentially expanding API Dash's adoption in mobile development. This aligns with its current support for iOS and Android, as seen in download links like [App Store](https://apps.apple.com/us/app/api-dash-api-client-testing/id6711353348). + +The benefits include empowering developers working on real-time applications, IoT projects, and microservices, by providing a unified tool. This will enhance productivity and application quality, contributing to the open-source community. + +![FOSS Image](./images/foss.jpeg) +*Testing Diagram* + +#### Potential Challenges and Considerations +Several challenges may arise: +- **Protocol Complexity**: Ensuring compliance with specifications, especially for gRPC with Protocol Buffers and streaming calls. +- **User Interface Design**: Balancing intuitive design with the diverse interaction models of each protocol, while maintaining consistency. +- **Performance**: Handling real-time data streams without impacting UI responsiveness, particularly on mobile devices. +- **Code Generation**: Generating accurate code for multiple languages, considering protocol-specific libraries and best practices. +- **Cross-Platform Compatibility**: Ensuring all features work seamlessly across macOS, Windows, Linux, Android, and iOS, addressing platform-specific issues. + +Solutions include leveraging established Dart packages, following existing UI patterns, optimizing asynchronous programming, researching language-specific libraries, and extensive platform testing. + +#### Conclusion +This project to integrate WebSocket, SSE, MQTT, and gRPC into API Dash will significantly enhance its capabilities, making it a comprehensive tool for API testing and development. It offers valuable experience in protocol implementation, UX design, and cross-platform development, benefiting the open-source community and developers worldwide. + +--- + +### Key Citations + +- [API Dash Discussions Project Ideas List](https://github.com/foss42/apidash/discussions/565/) +- [API Dash Issue WebSocket Support](https://github.com/foss42/apidash/issues/15) +- [API Dash Issue MQTT Support](https://github.com/foss42/apidash/issues/115) +- [API Dash Issue SSE Support](https://github.com/foss42/apidash/issues/116) +- [API Dash Issue gRPC Support](https://github.com/foss42/apidash/issues/14) +- [API Dash iOS App Download Page](https://apps.apple.com/us/app/api-dash-api-client-testing/id6711353348) +- [API Dash macOS Release Download Page](https://github.com/foss42/apidash/releases/latest/download/apidash-macos.dmg) +- [API Dash Windows Release Download Page](https://github.com/foss42/apidash/releases/latest/download/apidash-windows-x86_64.exe) +- [API Dash Linux Installation Guide Page](https://github.com/foss42/apidash/blob/main/INSTALLATION.md) + +### **4. Weekly Timeline** + +| **Week** | **Tasks** | +|----------|----------| +| **Week 1** | Conduct research on WebSocket, SSE, MQTT, and gRPC specifications. Analyze existing API Dash architecture and finalize technical stack. | +| **Week 2** | Design the core library architecture for integrating new protocols. Outline UI requirements for protocol interactions. | +| **Week 3** | Implement WebSocket support: connection establishment, message sending/receiving, and real-time visualization. Write unit tests. | +| **Week 4** | Implement SSE support: event stream handling, automatic reconnection, and real-time event visualization. Conduct initial testing. | +| **Week 5** | Develop MQTT support: broker connection, topic subscription/publishing, QoS management. Implement visualization for messages. | +| **Week 6** | Implement gRPC support: import .proto files, select services/methods, send requests, and visualize responses. Focus on unary calls first. | +| **Week 7** | Extend code generation features for WebSocket, SSE, MQTT, and gRPC in JavaScript, Python, and Java. Validate generated code. | +| **Week 8** | Conduct integration testing for all protocols. Optimize performance and ensure cross-platform compatibility (macOS, Windows, Linux, Android, iOS). | +| **Week 9** | Improve UI/UX for seamless protocol interactions. Add customization options and refine error handling mechanisms. | +| **Week 10** | Perform extensive testing with real-world APIs. Fix bugs, optimize stability, and ensure smooth user experience. | +| **Week 11** | Finalize documentation, create user guides, and add example implementations. Conduct final performance testing. | +| **Week 12** | Prepare project demo, finalize submission, and gather community feedback for improvements. | + +This timeline ensures systematic progress while allowing flexibility for testing and optimization. Let me know if you need any modifications! 🚀 \ No newline at end of file diff --git a/doc/proposals/2025/gsoc/images/foss.jpeg b/doc/proposals/2025/gsoc/images/foss.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..387a9e6374b54452c695941174a57eadcb471492 GIT binary patch literal 52080 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 literal 0 HcmV?d00001 From bcb11b37f07a4d821d0e3e602641b73f366a08f4 Mon Sep 17 00:00:00 2001 From: RafsanNeloy Date: Sun, 30 Mar 2025 21:02:37 +0600 Subject: [PATCH 2/3] Add university information and motivation section to GSoC proposal --- .../2025/gsoc/Api_Testing_Support.md | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/doc/proposals/2025/gsoc/Api_Testing_Support.md b/doc/proposals/2025/gsoc/Api_Testing_Support.md index ea832265..f62fc4c8 100644 --- a/doc/proposals/2025/gsoc/Api_Testing_Support.md +++ b/doc/proposals/2025/gsoc/Api_Testing_Support.md @@ -7,7 +7,42 @@ 7. Time zone: GMT +6 (Bangladesh) 8. Resume: https://drive.google.com/file/d/1_7YC1meQ0juyK80Bvp4A_9bmbfKqZcB7/view?usp=drive_link +### University Info +1. University name: Ahsanullah University Of Science & Technology +2. Program you are enrolled in (Degree & Major/Minor): B.Sc in CSE +3. Year: 4(Final Year) +5. Expected graduation date: 14/05/2026 + +### Motivation & Past Experience + +### **Short Answers:** + +1. **Have you worked on or contributed to a FOSS project before?** + No, I haven't contributed to a FOSS project before, but I'm eager to start with this GSoC opportunity. + +2. **What is your one project/achievement that you are most proud of? Why?** + One of my proudest achievements is developing an **Angry Birds game using iGraphics**. This project pushed me to deeply understand physics-based simulations, collision detection, and game mechanics. It was particularly rewarding because I had to optimize performance while maintaining smooth gameplay, and it solidified my problem-solving skills in real-time rendering. + +3. **What kind of problems or challenges motivate you the most to solve them?** + I am most motivated by challenges that involve **performance optimization, real-time data processing, and system scalability**. Whether it's reducing execution time, handling large-scale data efficiently, or ensuring seamless communication in distributed systems, I find solving such problems both intellectually stimulating and rewarding. + +4. **Will you be working on GSoC full-time?** + Yes, I plan to dedicate my full time to GSoC. I want to immerse myself in the project, actively contribute to discussions, and ensure high-quality deliverables. + +5. **Do you mind regularly syncing up with the project mentors?** + Not at all! Regular sync-ups are essential for feedback and guidance. I believe structured discussions will help me align with project expectations, identify potential roadblocks early, and ensure smooth progress. + +6. **What interests you the most about API Dash?** + What excites me the most about API Dash is its **cross-platform support and extensibility**. The idea of having a unified API testing tool that supports multiple protocols across desktop and mobile platforms is fascinating. Additionally, the opportunity to work on **real-time protocols like WebSocket, SSE, MQTT, and gRPC** aligns perfectly with my interests in high-performance systems. + +7. **Can you mention some areas where the project can be improved?** + - **Real-time Collaboration:** Allow users to share and test APIs collaboratively in real time. + - **Performance Benchmarking:** Add API request performance insights, such as latency breakdowns and server response analytics. + - **Protocol-Specific Debugging Tools:** Enhance error reporting with detailed logs and debugging suggestions for WebSocket, SSE, MQTT, and gRPC failures. + - **Mobile UI Optimization:** Improve API Dash’s UX on mobile devices, ensuring a seamless experience on touch interfaces. + +These improvements can make API Dash an even more powerful tool for developers working on modern applications! 🚀 ### Key Points - It seems likely that adding support for WebSocket, SSE, MQTT, and gRPC in API Dash will enhance its capabilities for real-time and high-performance API testing. - The project involves designing the core library architecture, understanding protocol specifications, and implementing testing, visualization, and code generation features. From bd8fdd60113805dcbe1e4c74119a30584288b074 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 30 Mar 2025 21:16:07 +0530 Subject: [PATCH 3/3] Rename Api_Testing_Support.md to proposal_RafsanNeloy_Api_Testing_Support.md --- ...g_Support.md => proposal_RafsanNeloy_Api_Testing_Support.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename doc/proposals/2025/gsoc/{Api_Testing_Support.md => proposal_RafsanNeloy_Api_Testing_Support.md} (99%) diff --git a/doc/proposals/2025/gsoc/Api_Testing_Support.md b/doc/proposals/2025/gsoc/proposal_RafsanNeloy_Api_Testing_Support.md similarity index 99% rename from doc/proposals/2025/gsoc/Api_Testing_Support.md rename to doc/proposals/2025/gsoc/proposal_RafsanNeloy_Api_Testing_Support.md index f62fc4c8..531e53c3 100644 --- a/doc/proposals/2025/gsoc/Api_Testing_Support.md +++ b/doc/proposals/2025/gsoc/proposal_RafsanNeloy_Api_Testing_Support.md @@ -197,4 +197,4 @@ This project to integrate WebSocket, SSE, MQTT, and gRPC into API Dash will sign | **Week 11** | Finalize documentation, create user guides, and add example implementations. Conduct final performance testing. | | **Week 12** | Prepare project demo, finalize submission, and gather community feedback for improvements. | -This timeline ensures systematic progress while allowing flexibility for testing and optimization. Let me know if you need any modifications! 🚀 \ No newline at end of file +This timeline ensures systematic progress while allowing flexibility for testing and optimization. Let me know if you need any modifications! 🚀