Skip to content

[UPSTREAM-9] feat(python): add @nexus.poll - #55

Closed
moetemp wants to merge 1 commit into
moe/up/python-clientfrom
moe/up/long-poll
Closed

moetemp wants to merge 1 commit into
moe/up/python-clientfrom
moe/up/long-poll

Conversation

@moetemp

@moetemp moetemp commented Oct 22, 2026 •

Copy link
Copy Markdown
Owner

What changed?

This PR adds the @nexus.poll operation directive. It names a support helper, and changes no model or wire byte.

  • The operation and each resource method bound to it get iter_<name>, an async iterator, on both targets.
  • The iterator sends the request, yields the response, and calls the helper with the request and the response. The helper returns the next request, or None to stop.
  • The other targets ignore the directive for now.

Depends on #54 (UPSTREAM-8).
Part of the Brook review series.

Why?

A poll repeats a call and carries something from each response into the next request. The helper owns that step, so the directive names no fields of one kind of poll, such as a stream's offsets. The caller collects the responses, so no page gets lost. Brook's ReadRecords reads a stream page by page with it.

How did you test it?

Brook's stream-service WIT already polls read-records with next_read_request, so this PR adds that helper to the sample support package. A sample test checks that the iterator yields each page and stops when the helper returns None, and compiler rejection fixtures cover a missing or an invalid helper. It's one commit, since today's generator ignores the new directive and has no output to compare.
cargo validate passes and cargo clippy adds no warnings.

@moetemp moetemp changed the title [Upstream] Added @nexus.long-poll to the Python caller. [Upstream] feat: add @nexus.long-poll to the Python caller Oct 22, 2026
@moetemp moetemp changed the title [Upstream] feat: add @nexus.long-poll to the Python caller feat(python): add @nexus.long-poll to the caller Oct 22, 2026
@moetemp moetemp changed the title feat(python): add @nexus.long-poll to the caller [Upstream] feat(python): add @nexus.long-poll to the caller Oct 22, 2026
@moetemp moetemp changed the title [Upstream] feat(python): add @nexus.long-poll to the caller [UPSTREAM-8] feat(python): add @nexus.long-poll to the caller Oct 22, 2026
@moetemp moetemp changed the title [UPSTREAM-8] feat(python): add @nexus.long-poll to the caller [UPSTREAM-9] feat(python): add @nexus.long-poll to the caller Oct 23, 2026
@moetemp
moetemp changed the base branch from moe/up/python-client to moe/up/python-client-wit-resources October 23, 2026 00:39
@moetemp
moetemp changed the base branch from moe/up/python-client-wit-resources to moe/up/python-client October 23, 2026 06:29
moetemp added a commit to temporalio/nexgen that referenced this pull request Oct 23, 2026
)

## What changed?

This PR adds a `stream-service` sample for Python and TypeScript, with today's output. #272 adds .NET with its fix. It has a `stream` resource built from a ref, `create-stream`, append, read, describe and close, with 64-bit offsets, payloads and durations.

Its records are proto-backed, as a stream service's are. Upstream has no stream protos, so the sample has its own small proto in `descriptors/streamsample/v1/`, with checked-in bindings. The samples README has the commands that regenerate them. `build_examples` now loads every `*.bin` under `descriptors/`.

## Why?

Later fixes show their effect as a golden diff on this sample.

## How did you test it?

The goldens. A TypeScript test sends a full `ReadRecordsRequest` through the converter, so the TypeScript type file can't drift from the proto.

## What comes next

These fixes are ready, in this order. Each one adds its shape to this sample, then the fix.

- #272: adds .NET, where the `stream` field of the `Stream` class fails with CS0542, then the fix.
- [moetemp#52](moetemp#52): Check required resource fields of a response. Adds `create-stream` returning the `stream` resource.
- [moetemp#56](moetemp#56): Allow a result record to hold a resource. Adds a `create-stream-result` holder record.
- [moetemp#53](moetemp#53): Emit `@nexus.doc` on resources and methods as Python docstrings.
- [moetemp#70](moetemp#70): Convert 64-bit resource method values to `Long` for a proto request in TypeScript. Adds 64-bit method parameters. Needs #265.
- [moetemp#54](moetemp#54): Generate a Python caller per service over a transport. Turns on the client for the sample.
- [moetemp#55](moetemp#55): Add `@nexus.long-poll` to the Python caller. Marks `read-records` as a long poll.
- [moetemp#57](moetemp#57): Add Python client classes for resources with methods.
- [moetemp#71](moetemp#71): Drop the bare keyword marker from a Python signature with no parameters. Adds a `stream-writer` interface with no endpoint.
- [moetemp#60](moetemp#60): Indent the docstrings of Python caller methods. Adds a doc on a writer operation.
- [moetemp#69](moetemp#69): Import record types that an endpoint-less Python client uses in unpacked parameters. Adds `open-writer`.
- [moetemp#72](moetemp#72): Plan proto unsigned integers as unsigned. Adds a `uint64` writer id.
- [moetemp#73](moetemp#73): Build a returned proto-wire resource in an endpoint-less TypeScript client. Makes `open-writer` return the `writer` resource.

#262 adds a `status` enum to the holder record once it merges.
@moetemp
moetemp force-pushed the moe/up/python-client branch from 3b1fc80 to d38df9d Compare October 25, 2026 22:19
@moetemp
moetemp marked this pull request as ready for review October 25, 2026 22:20
@moetemp
moetemp force-pushed the moe/up/python-client branch 2 times, most recently from 2e720ad to fb988c7 Compare October 26, 2026 22:34
@moetemp moetemp changed the title [UPSTREAM-9] feat(python): add @nexus.long-poll to the caller [UPSTREAM-9] feat(python): add @nexus.poll Oct 26, 2026
@moetemp
moetemp force-pushed the moe/up/python-client branch 2 times, most recently from 4c2e288 to a13f250 Compare October 26, 2026 23:01
@moetemp
moetemp force-pushed the moe/up/long-poll branch 2 times, most recently from 1c3b801 to eeb1418 Compare October 27, 2026 01:06
@moetemp
moetemp force-pushed the moe/up/python-client branch 2 times, most recently from c19f0c9 to d4962e0 Compare October 27, 2026 09:08
@moetemp
moetemp force-pushed the moe/up/long-poll branch 2 times, most recently from ac16c7b to c1e00c3 Compare October 27, 2026 18:07
@moetemp
moetemp force-pushed the moe/up/python-client branch from d4962e0 to 551d4a5 Compare October 27, 2026 18:07
@moetemp
moetemp force-pushed the moe/up/python-client branch from 551d4a5 to 814da54 Compare October 27, 2026 19:00
An operation with @nexus.poll gets an iter_<name> iterator on both targets. A support helper turns each request and response into the next request, or into None to stop, so the directive holds nothing of one kind of poll and the caller collects the responses.
@moetemp

moetemp commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

Closing this. Replaced by temporalio#325.

@moetemp moetemp closed this Oct 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant