MOBIN-F opened a new pull request, #12465:
URL: https://github.com/apache/seatunnel/pull/12465

   <!--
   
   Thank you for contributing to SeaTunnel! Please make sure that your code 
changes
   are covered with tests. And in case of new features or big changes
   remember to adjust the documentation.
   
   Feel free to ping committers for the review!
   
   ## Contribution Checklist
     - Make sure that the pull request corresponds to a [GITHUB 
issue](https://github.com/apache/seatunnel/issues).
     - Name the pull request in the form "[Feature] [component] Title of the 
pull request", where *Feature* can be replaced by `Hotfix`, `Bug`, etc.
     - Minor fixes should be named following this pattern: `[hotfix] [docs] Fix 
typo in README.md doc`.
   -->
   
   ### Purpose of this pull request
   
   SeaTunnel currently has no general-purpose WebSocket source. The only 
WebSocket capability in the repo is buried inside connector-graphql 
(GraphQLWebSocket), which is tied to the GraphQL subscription protocol and 
cannot be used against plain ws:// / wss:// push services (market data feeds, 
IoT telemetry, log streams, exchange APIs). connector-socket only speaks raw 
TCP and connector-http is request/response polling only.
   
   This PR adds a new connector-websocket module providing a WebSocket source 
that:
   
   - connects to a ws:// / wss:// endpoint (any other scheme is rejected at 
config validation time);
   - sends ordered subscribe / auth messages after the handshake via 
open_messages, re-sent on every reconnect;
   - supports custom handshake headers (e.g. Authorization), plus 
ping_interval_ms keep-alive;
   - deserializes frames with schema + format (JSON / TEXT), reusing 
seatunnel-format-json and seatunnel-format-text; without schema each frame is 
emitted verbatim into a single value STRING column;
   - auto-reconnects with enable_reconnect / max_reconnect_times / 
reconnect_interval_ms, and fails the task (instead of hanging silently) once 
reconnects are exhausted;
   - buffers into a bounded queue (queue_capacity) so a slow downstream 
back-pressures the server instead of growing the heap;
   - terminates in BATCH mode via max_records / read_timeout_ms — a batch job 
with neither is rejected up front, since a WebSocket stream has no natural end.
   
   Implementation is based on OkHttp 4.12 (okhttp3.WebSocket), already managed 
in the root pom and already used by connector-graphql / connector-typesense, so 
no new third-party dependency is introduced. okhttp3 / okio are relocated to 
shaded.* via maven-shade-plugin to avoid clashing with Spark's bundled OkHttp 
3.12.
   
   
   ### Does this PR introduce _any_ user-facing change?
   
   Yes — a new WebSocket source plugin, documented in 
docs/en/connectors/source/WebSocket.md and 
docs/zh/connectors/source/WebSocket.md. It is a pure addition: no existing 
connector, option, default value or SPI contract is modified, so no migration 
is required.
   
   
   <!--
   Note that it means *any* user-facing change including all aspects such as 
the documentation fix.
   If yes, please clarify the previous behavior and the change this PR proposes 
- provide the console output, description and/or an example to show the 
behavior difference if possible.
   If possible, please also clarify if this is a user-facing change compared to 
the released SeaTunnel versions or within the unreleased branches such as dev.
   If no, write 'No'.
   If you are adding/modifying connector documents, please follow our new 
specifications: https://github.com/apache/seatunnel/issues/4544.
   -->
   
   
   ### How was this patch tested?
   
   - Unit tests (24, all passing) — WebSocketFactoryTest (option rule / missing 
url), WebSocketSourceConfigTest (defaults, scheme validation, numeric bounds), 
WebSocketSourceTest (schema vs schema-less row type, boundedness matrix), 
WebSocketSourceReaderTest (end-to-end read against OkHttp MockWebServer: JSON 
rows + max_records stop, JSON array fan-out, schema-less passthrough, TEXT with 
custom delimiter, open_messages ordering, idle read_timeout_ms stop).
   - Repo-wide gates — ./mvnw test -pl seatunnel-ci-tools: 34 tests, 0 failures 
(option-class naming, markdown/doc rules, import & UT naming checks). ./mvnw 
spotless:apply clean, ./mvnw -q -DskipTests verify passes.
   - E2E — WebSocketSourceIT (host-side MockWebServer exposed to containers via 
Testcontainers.exposeHostPorts, BATCH job asserted with the Assert sink): 5/5 
passing on Flink 1.13.6 / 1.15.3 / 1.18.0 / 1.20.1 and Zeta. The 2 Spark cases 
could not run locally because AbstractTestSparkContainer hardcodes 
bitnami/spark:2.4.6, which Bitnami has removed from Docker Hub (docker manifest 
inspect → no such manifest) — a pre-existing, repo-wide limitation unrelated to 
this PR; CI should cover them if its mirror still has the image.
   
   <!--
   If tests were added, say they were added here. Please make sure to add some 
test cases that check the changes thoroughly including negative and positive 
cases if possible.
   If it was tested in a way different from regular unit tests, please clarify 
how you tested step by step, ideally copy and paste-able, so that other 
reviewers can test and check, and descendants can verify in the future.
   If tests were not added, please describe why they were not added and/or why 
it was difficult to add.
   If you are adding E2E test cases, maybe refer to 
https://github.com/apache/seatunnel/blob/dev/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-cdc-mysql-e2e/src/test/resources/mysqlcdc_to_mysql.conf,
 here is a good example.
   -->
   
   
   ### Check list
   
   * [ ] If any new Jar binary package adding in your PR, please add License 
Notice according
     [New License 
Guide](https://github.com/apache/seatunnel/blob/dev/docs/en/developer/new-license.md)
   * [ ] If necessary, please update the documentation to describe the new 
feature. https://github.com/apache/seatunnel/tree/dev/docs
   * [ ] If necessary, please update `incompatible-changes.md` to describe the 
incompatibility caused by this PR.
   * [ ] If you are contributing the connector code, please check that the 
following files are updated:
     1. Update 
[plugin-mapping.properties](https://github.com/apache/seatunnel/blob/dev/plugin-mapping.properties)
 and add new connector information in it
     2. Update the pom file of 
[seatunnel-dist](https://github.com/apache/seatunnel/blob/dev/seatunnel-dist/pom.xml)
     3. Add ci label in 
[label-scope-conf](https://github.com/apache/seatunnel/blob/dev/.github/workflows/labeler/label-scope-conf.yml)
     4. Add e2e testcase in 
[seatunnel-e2e](https://github.com/apache/seatunnel/tree/dev/seatunnel-e2e/seatunnel-connector-v2-e2e/)
     5. Update connector 
[plugin_config](https://github.com/apache/seatunnel/blob/dev/config/plugin_config)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to