{{ message }}
Repository navigation
[WIP]Add experimental SSE support to Java emitter - #12312
Draft
Xiaofei Cao (XiaofeiCao) wants to merge 11 commits into
Draft
Xiaofei Cao (XiaofeiCao) wants to merge 11 commits into
Xiaofei Cao (XiaofeiCao) wants to merge 11 commits into
Conversation
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 14ecbaeb-e976-401b-b4ef-40d8cbcd7bd3
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 14ecbaeb-e976-401b-b4ef-40d8cbcd7bd3
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 14ecbaeb-e976-401b-b4ef-40d8cbcd7bd3
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 678d3568-95a2-4c47-bd96-e338dc8d46ba
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 678d3568-95a2-4c47-bd96-e338dc8d46ba
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 678d3568-95a2-4c47-bd96-e338dc8d46ba
Contributor
Xiaofei Cao (XiaofeiCao)
marked this pull request as draft
October 20, 2026 12:15
Contributor
There was a problem hiding this comment.
🟡 Changes recommended
Unresolved generation failures, API visibility and module-export defects, and fixture-regeneration errors block approval.
6 open issues
Retain BinaryData fallback for Jackson-incompatible SSE conversion · New Handle unsupported array element types in SSE payloads · New Preserve internal visibility for SSE wrapper client methods · New Avoid redeclaring reader variables in nested array converters · New Correct SSE output path when project root is tsp · New Export SSE event packages in generated module-info · New
What changed in this PR
Adds opt-in, experimental server-sent event (SSE) support to the Java emitter’s Azure flavor.
Changes:
- Transfers SSE metadata into generated event wrappers, converters, and synchronous/asynchronous APIs.
- Adds incremental parsing, response validation, and stream cleanup.
- Adds generation fixtures, runtime tests, and changelog entries.
| File | Description |
|---|---|
| packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecPlugin.java | Wires SSE settings and helper generation. |
| packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/model/DevOptions.java | Reads the experimental flag. |
| packages/http-client-java/generator/http-client-generator-test/tsp/sse.tspconfig.yaml | Enables SSE fixture generation. |
| packages/http-client-java/generator/http-client-generator-test/tsp/sse.tsp | Defines the integration fixture. |
| packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/sse/models/implementation/sse/ServerSentEventStreamTests.java | Tests parsing and stream lifecycle. |
| packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/sse/generated/SseClientTestBase.java | Adds generated client test setup. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/tsptest-sse.properties | Supplies fixture SDK metadata. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-sse_metadata.json | Records generated fixture mappings. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/stream/models/TestStreamEvent.java | Adds the generated event base. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/stream/models/TestStartedStreamEvent.java | Wraps started-event payloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/stream/models/TestCompletedStreamEvent.java | Wraps terminal-event payloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/stream/implementation/TestStreamEventConverter.java | Converts fixture event payloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/SseClientBuilder.java | Builds fixture clients. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/SseClient.java | Demonstrates synchronous streaming APIs. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/SseAsyncClient.java | Demonstrates asynchronous streaming APIs. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/package-info.java | Documents the client package. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/models/StartedPayload.java | Adds the started payload model. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/models/package-info.java | Documents the payload package. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/models/implementation/sse/ServerSentEventStreams.java | Adds the generated runtime facade. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/models/implementation/sse/ServerSentEventStreamResponse.java | Adds generated response validation. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/models/implementation/sse/ServerSentEventStream.java | Adds the generated stream parser. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/models/CompletedPayload.java | Adds the completed payload model. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/implementation/StreamOperationsImpl.java | Implements fixture HTTP operations. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/implementation/SseClientImpl.java | Holds fixture client infrastructure. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/sse/implementation/package-info.java | Documents the implementation package. |
| packages/http-client-java/generator/http-client-generator-test/Generate.ps1 | Selects the SSE fixture configuration. |
| packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/SseNamingResolverTests.java | Tests names and collisions. |
| packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/SseMetadataRegistryTests.java | Tests metadata deduplication and collisions. |
| packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/model/javamodel/JavaPackageSseTests.java | Tests generated files and package placement. |
| packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMethodMapperTests.java | Tests SSE generation modes. |
| packages/http-client-java/generator/http-client-generator-core/src/main/resources/ServerSentEventStreams.java | Defines the runtime facade template. |
| packages/http-client-java/generator/http-client-generator-core/src/main/resources/ServerSentEventStreamResponse.java | Defines response validation and cleanup. |
| packages/http-client-java/generator/http-client-generator-core/src/main/resources/ServerSentEventStream.java | Defines incremental parsing and consumption. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/TemplateUtil.java | Marks SSE methods as collection-returning. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/SseUtil.java | Centralizes SSE package placement. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/SseNamingResolver.java | Resolves event and converter names. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/SseMetadataRegistry.java | Deduplicates streams and checks names. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/SseEventModelTemplate.java | Generates typed event wrappers. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/SseEventConverterTemplate.java | Generates JSON event converters. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ConvenienceSyncMethodTemplate.java | Generates synchronous stream calls. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ConvenienceMethodTemplateBase.java | Adds SSE helper imports. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ConvenienceAsyncMethodTemplate.java | Generates asynchronous stream calls. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/javamodel/JavaPackage.java | Emits SSE files with collision checks. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/GenericType.java | Models closeable stream return types. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientMethodType.java | Adds SSE method kinds. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientMethod.java | Carries SSE metadata through methods. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClassType.java | Registers the closeable stream class. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMethodMapper.java | Maps operations to SSE methods. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/extension/plugin/JavaSettings.java | Stores the SSE enablement setting. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/extension/model/codemodel/SseMetadata.java | Represents stream metadata. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/extension/model/codemodel/SseEventMetadata.java | Represents individual event metadata. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/extension/model/codemodel/Operation.java | Attaches SSE metadata to operations. |
| packages/http-client-java/emitter/test/fixtures/sse.tsp | Covers supported and protocol-only operations. |
| packages/http-client-java/emitter/test/fixtures/sse-unsupported.tsp | Covers unsupported payload fallback. |
| packages/http-client-java/emitter/test/code-model.test.ts | Tests opt-in metadata and fallback behavior. |
| packages/http-client-java/emitter/src/options.ts | Defines the experimental SSE option. |
| packages/http-client-java/emitter/src/lib.ts | Adds the unsupported-stream diagnostic. |
| packages/http-client-java/emitter/src/common/operation.ts | Defines TypeScript SSE metadata contracts. |
| packages/http-client-java/emitter/src/code-model-builder.ts | Processes upstream SSE metadata. |
| .chronus/changes/xiaofeicao-implement-sse-naming-2026-9-20-15-3-28.md | Records naming centralization. |
| .chronus/changes/http-client-java-experimental-sse-2026-10-20.md | Documents the experimental feature. |
Review effort: Balanced
| }); | ||
| return undefined; | ||
| }; | ||
| const sseMetadata: SdkSseMetadata | undefined = response.sseMetadata; |
Comment on lines
+1306
to
+1307
| if (event.payloadType.kind !== "model" && event.payloadType.kind !== "array") { | ||
| return undefined; |
Comment on lines
+308
to
+310
| .methodVisibility(JavaVisibility.Public) | ||
| .methodVisibilityInWrapperClient(JavaVisibility.Public) | ||
| .sseMetadata(operation.getSseMetadata()) |
Comment on lines
+121
to
+133
| private static String getJsonReadCallback(IType type) { | ||
| if (type instanceof IterableType) { | ||
| return "reader -> reader.readArray(" + getJsonReadCallback(((IterableType) type).getElementType()) + ")"; | ||
| } | ||
| if (type instanceof ClassType && ((ClassType) type).isSwaggerType()) { | ||
| return type + "::fromJson"; | ||
| } | ||
| String deserialization = type.jsonDeserializationMethod("reader"); | ||
| if (deserialization == null) { | ||
| throw new IllegalStateException("SSE payload type " + type + " does not support JSON deserialization."); | ||
| } | ||
| return "reader -> " + deserialization; | ||
| } |
| # test for include-api-view-properties | ||
| $tspOptions += " --option ""@typespec/http-client-java.include-api-view-properties=false""" | ||
| } elseif ($tspFile -match "tsp[\\/]sse.tsp") { | ||
| $tspConfig = "--config ""$PSScriptRoot/tsp/sse.tspconfig.yaml""" |
| javaPackage.addJavaFromResources(runtimePackage, SseUtil.SERVER_SENT_EVENT_STREAMS); | ||
| javaPackage.addJavaFromResources(runtimePackage, "ServerSentEventStream"); | ||
| javaPackage.addJavaFromResources(runtimePackage, "ServerSentEventStreamResponse"); | ||
| sseMetadata.values().forEach(javaPackage::addSseEventFiles); |
|
You can try these changes here
|
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 678d3568-95a2-4c47-bd96-e338dc8d46ba
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 678d3568-95a2-4c47-bd96-e338dc8d46ba
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 14ecbaeb-e976-401b-b4ef-40d8cbcd7bd3
Contributor
Curious why this is opt-in rather than just enabled? |
Member
Author
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 14ecbaeb-e976-401b-b4ef-40d8cbcd7bd3
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 14ecbaeb-e976-401b-b4ef-40d8cbcd7bd3
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


Summary
dev-options.enable-ssefloat32-as-doubleemitter optionValidation
git diff --checkThe feature remains experimental and disabled unless
dev-options.enable-sseis set.