[WIP]Add experimental SSE support to Java emitter by XiaofeiCao · Pull Request #12312 · microsoft/typespec · GitHub
Skip to content

[WIP]Add experimental SSE support to Java emitter - #12312

Draft
Xiaofei Cao (XiaofeiCao) wants to merge 11 commits into
microsoft:mainfrom
XiaofeiCao:xiaofeicao-java-sse-experimental
Draft

Xiaofei Cao (XiaofeiCao) wants to merge 11 commits into
microsoft:mainfrom
XiaofeiCao:xiaofeicao-java-sse-experimental

Conversation

@XiaofeiCao

@XiaofeiCao Xiaofei Cao (XiaofeiCao) commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Summary

  • add opt-in Azure-flavor generation for named JSON server-sent event streams behind dev-options.enable-sse
  • consume TCGC SSE metadata and generate payload-driven event wrappers, converters, sync/async stream methods, and incremental runtime parsing
  • centralize Java SSE naming, package placement, collision detection, and cross-package constructor access in the generator
  • preserve protocol-only operations and configured sync-method generation modes
  • retain standard generated-file ownership markers so removed or renamed SSE files are cleaned safely
  • add committed generated-client and executable runtime coverage for framing, UTF-8 fragmentation, unknown and terminal events, validation, cancellation, raw overloads, and resource closure
  • restore strict option-schema acceptance for the existing float32-as-double emitter option

Validation

  • package and repository formatting
  • emitter lint and TypeScript typecheck
  • emitter tests: 56/56
  • full Java emitter package build and generator reactor tests
  • generated SSE runtime fixture tests: 7/7
  • generated fixture regeneration and byte verification
  • stale SSE file cleanup tests, including two-generation rename/removal behavior that preserves unmarked user files
  • Azure Search Java 21 and Temurin Java 8 main/test/sample compilation
  • Azure Search focused retrieval/runtime tests: 113/113
  • Azure Search 468-file comparison: zero semantic, import, whitespace, body, or line-ending differences; the only 12 differences are correctness-required generated ownership comments
  • git diff --check
  • final complete-diff review gate passed

The feature remains experimental and disabled unless dev-options.enable-sse is set.

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
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

@XiaofeiCao
Xiaofei Cao (XiaofeiCao) marked this pull request as draft October 20, 2026 12:15
@XiaofeiCao Xiaofei Cao (XiaofeiCao) changed the title Add experimental SSE support to Java emitter [WIP]Add experimental SSE support to Java emitter Oct 20, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

Unresolved generation failures, API visibility and module-export defects, and fixture-regeneration errors block approval.

6 open issues
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);
@azure-sdk-automation

azure-sdk-automation Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

You can try these changes here

🛝 Playground 🌐 Website 🛝 VSCode Extension

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
@JoshLove-msft

Copy link
Copy Markdown
Contributor

add opt-in Azure-flavor generation for named JSON server-sent event streams behind dev-options.enable-sse

Curious why this is opt-in rather than just enabled?

@XiaofeiCao

Copy link
Copy Markdown
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

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

emitter:client:java Issue for the Java client emitter: @typespec/http-client-java

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants