Repository navigation
Conversation
moetemp
force-pushed
the
moe/up/typescript-client-target
branch
from
November 3, 2026 15:22
70a1fbb to
5e2ddc6
Compare
moetemp
force-pushed
the
moe/up/dotnet-client-target
branch
from
November 3, 2026 15:22
841a56f to
1457f2a
Compare
moetemp
force-pushed
the
moe/up/typescript-client-target
branch
from
November 4, 2026 09:34
5e2ddc6 to
cf55965
Compare
moetemp
force-pushed
the
moe/up/dotnet-client-target
branch
from
November 4, 2026 09:34
1457f2a to
ba06fdf
Compare
moetemp
force-pushed
the
moe/up/typescript-client-target
branch
from
November 5, 2026 05:19
cf55965 to
ea2b628
Compare
moetemp
force-pushed
the
moe/up/dotnet-client-target
branch
from
November 5, 2026 05:19
ba06fdf to
14721c5
Compare
moetemp
force-pushed
the
moe/up/typescript-client-target
branch
from
November 5, 2026 07:27
ea2b628 to
a386d04
Compare
moetemp
force-pushed
the
moe/up/dotnet-client-target
branch
from
November 5, 2026 07:27
14721c5 to
a121114
Compare
moetemp
force-pushed
the
moe/up/typescript-client-target
branch
from
November 5, 2026 22:22
a386d04 to
e314cbb
Compare
moetemp
force-pushed
the
moe/up/dotnet-client-target
branch
from
November 5, 2026 22:22
a121114 to
7295bd9
Compare
A resource with `@nexus.type-parameter "<alias>"` is generic in Python, TypeScript and .NET. An operation that returns it, or that its method binds, takes a runtime type for each type parameter of its output, so a response decodes its generic values.
The kept fixtures cover an undeclared type parameter, a generic resource in a record field or in a result with no proto message, and a language that refuses it. The others test directive syntax, rare name clashes or another copy of a kept check.
Co-authored-by: Tim Conley <timothy.conley@temporal.io>
A resource that uses a type parameter, also through its records, is generic in it, as a record is. So a resource needs no annotation, and `@nexus.type-parameter` is valid only on a type alias again.
Only a returned resource gives its type parameters, as the guide says, so a parameter or field that holds one doesn't. The declaration order doesn't change when a method moves.
A list, map, tuple, result or variant case builds the resource from the record's message too, so it gets no type argument either.
The old reason said a proto message holds the type arguments, which it doesn't.
Two type parameters such as `body` and `body-t` give the same runtime type name, and a method can take it too. Either one makes a duplicate parameter or member.
The typed hook of a generic response took only the request, so the terminal decoded `ReadRecordsResponse[Turn]` with the plain class and lost `Turn`.
C# generics are invariant, so the `<object>` checks refused a `Stream<Turn>` call. The dispatch now compares generic type definitions and keeps the call's types.
A subclass such as `class TurnStream(Stream[Turn])` has no `__orig_class__`, so the handle reads `__orig_bases__` too. A factory tests `body_type is None`, since a class can be falsy.
The TypeScript stream test now decodes a body with a runtime type. The Python test decodes to the bare handle class, since a generic alias fails for another reason.
No release has the Python constructor change, so it belongs with the added entry. The fixed entry now describes the System Nexus dispatch fixes.
A few comments used "name" as a verb, ran over two lines or over 100 columns. The guide's first paragraph read as one long sentence.
Drop the tests that repeat another test or restate generated code, and keep the ones that guard behavior. Shorten the guide section and the comments.
Python can't subscript a function, so each generic call is an object whose subscript binds the types, as in `client.get_stream[Turn](ref=ref)`. A factory's optional field defaults to `None`. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
`@nexus.close` marks the method that ends a resource. Python calls it at the end of `async with`, and a call that returns the resource returns a `ResourceCall`. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
`@nexus.varargs` makes a resource method take a list's items as positional arguments, and a list of a flattened one-field record takes that field's values. The Stream's publish takes values and returns the last offset. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
Workflow code gets a handle on an existing Stream with `get_stream[T]`, from the fields of its ref, with no call. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
Each client call and client resource method takes `rpc_metadata` and `rpc_timeout`, and passes them to the `start_operation` of its Nexus client. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
`@nexus.flatten-in-api` on a request field makes that call take the fields of the field's record, and the models keep the record. The Stream create takes the id, the owner and the backend of its ref this way, and the other Stream calls keep `ref`. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
A field can leave the API of one target and take a source in another. A call of a target that omits a required list sends it empty. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
moetemp
force-pushed
the
moe/up/typescript-client-target
branch
from
November 6, 2026 08:01
e314cbb to
a983f84
Compare
moetemp
force-pushed
the
moe/up/dotnet-client-target
branch
from
November 6, 2026 08:01
7295bd9 to
34791b9
Compare
temporalio/api#895 moves the Producer and the withdrawal fields of a write into one StreamWriter. The sample WIT also takes the final directives of the open nexgen PRs. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
moetemp
force-pushed
the
moe/up/dotnet-client-target
branch
from
November 6, 2026 09:08
34791b9 to
1c68eb9
Compare
moetemp
force-pushed
the
moe/up/typescript-client-target
branch
from
November 6, 2026 09:08
a983f84 to
e6111ad
Compare
…removal This syncs the stream sample with the owner and withdrawal removal. The WIT and the stream protos drop the owner, the read-side withdrawal machinery and the `OWNER_*` close statuses, and add the `StreamClose` read item with the kind-oneof `Producer`. The Python, TypeScript and .NET bindings and samples are regenerated, and the hand-written support and tests follow. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
Co-authored-by: Tim Conley <timothy.conley@temporal.io>
The stream sample's TypeScript output gets the client API and the read iterator that Python has. A client resource takes a service-bound Nexus client, as in Python.
The stream sample's .NET output gets the client API and the read iterator that Python has. A client resource takes the `NexusClient` of its service, as in Python.
moetemp
force-pushed
the
moe/up/typescript-client-target
branch
from
November 9, 2026 07:57
e6111ad to
23c26b2
Compare
moetemp
force-pushed
the
moe/up/dotnet-client-target
branch
from
November 9, 2026 07:57
1c68eb9 to
e8f8aca
Compare
moetemp
force-pushed
the
moe/up/typescript-client-target
branch
from
November 13, 2026 22:22
23c26b2 to
a61ab4c
Compare
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.
What changed?
This PR adds the client target to the .NET generator, with the
@nexus.polliterator.--targets workflow,clientadds a<namespace>.Clientnamespace withITemporalClientextension methods per service, client resources and aGet<Resource>factory. A client resource takes theNexusClientof its service.@nexus.pollwith adotnethelper gives<Name>PagesAsync, anIAsyncEnumerableof the pages with aCancellationToken.Why?
The Python client target has no .NET half.
How did you test it?
Link to a test plan if any -
StreamClientChecks.cschecks a create, an append, a rebuilt handle and the read loop with a fake client. Fixtures cover the .NET name clashes and a result record that holds a resource.