From e0e2fe791e00e4c53a59da7bf36d8d52853ec2b6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sat, 17 Oct 2026 22:52:51 -0700 Subject: [PATCH 01/13] Restored the PostgreSQL store. It comes back from the jp28 move-out commit 5e1c93d3 as it was, with its cases in the shared tests. --- scripts/streams_live_lane.sh | 21 +- temporalio/contrib/streams/README.md | 23 +- temporalio/contrib/streams/_plugin.py | 3 +- .../streams/docs/postgres-guarantees.md | 221 ++++++++++++++++++ .../streams/docs/store-capabilities.md | 3 +- temporalio/contrib/streams/postgres.py | 157 +++++++++++++ tests/contrib/streams/_support.py | 20 ++ .../streams/test_live_notifications.py | 18 +- tests/contrib/streams/test_postgres_docs.py | 24 ++ tests/contrib/streams/test_replay_reads.py | 27 ++- tests/contrib/streams/test_store_docs.py | 4 +- tests/contrib/streams/test_store_plugin.py | 84 +++++++ tests/contrib/streams/test_stream_archive.py | 38 ++- tests/contrib/streams/test_stream_driver.py | 10 +- tests/contrib/streams/test_workflow_reader.py | 26 ++- 15 files changed, 638 insertions(+), 41 deletions(-) create mode 100644 temporalio/contrib/streams/docs/postgres-guarantees.md create mode 100644 temporalio/contrib/streams/postgres.py create mode 100644 tests/contrib/streams/test_postgres_docs.py diff --git a/scripts/streams_live_lane.sh b/scripts/streams_live_lane.sh index dbf2ef2b29..188afd4557 100755 --- a/scripts/streams_live_lane.sh +++ b/scripts/streams_live_lane.sh @@ -19,6 +19,9 @@ # STREAMS_ARCHIVE_S3_URL an `s3://bucket/prefix` the archive cases write to, with the `AWS_*` # settings the stream runtime reads. Without it, the script starts MinIO in # Docker on a free port and removes the container at the end. +# STREAMS_POSTGRES_URL a PostgreSQL 14 or later database the Postgres cases use. Each case makes +# a schema of its own. Without it, the script starts PostgreSQL 17 in Docker +# on a free port and removes the container at the end. # WORK_DIR where to build and keep logs (default: a new temporary directory) # PYTEST_TARGETS the tests to run (default: the stream and Nexus tests). A narrower run fails # the gate, since the gated ids outside it don't run. @@ -238,6 +241,22 @@ if [[ -z "${STREAMS_ARCHIVE_S3_URL:-}" ]]; then "import boto3; boto3.client('s3').create_bucket(Bucket='streams-archive')") fi +if [[ -z "${STREAMS_POSTGRES_URL:-}" ]]; then + pg_port=$(python3 -c 'import socket; s = socket.socket(); s.bind(("127.0.0.1", 0)); print(s.getsockname()[1])') + pg=streams-lane-pg-$$ + # Many cases connect at once, each with a pool and a listener. + docker run -d --rm --name "$pg" -p "127.0.0.1:$pg_port:5432" \ + -e POSTGRES_USER=streams -e POSTGRES_PASSWORD=streams -e POSTGRES_DB=streams \ + postgres:17 -c max_connections=1000 >/dev/null + containers+=("$pg") + for _ in $(seq 60); do + docker exec "$pg" pg_isready -q -U streams -d streams -h 127.0.0.1 && break + sleep 1 + done + export STREAMS_POSTGRES_URL="postgres://streams:streams@127.0.0.1:$pg_port/streams" + STREAMS_POSTGRES_URL+="?sslmode=disable" +fi + cd "$SDK_DIR" export PYTHONPATH="$SDK_DIR${PYTHONPATH:+:$PYTHONPATH}" @@ -299,7 +318,7 @@ uv run --no-sync pytest ${PYTEST_TARGETS:-${default_targets[*]}} \ # A live test that skips here proves nothing, so a skip for a missing notifier, missing Nexus # progress or a missing store fails the lane. -gated='no stream notifier|refused Nexus progress|STREAMS_REDIS_URL|STREAMS_REDIS_CLUSTER_URL|no NexusHandler callbacks|STREAMS_ARCHIVE_S3_URL' +gated='no stream notifier|refused Nexus progress|STREAMS_REDIS_URL|STREAMS_REDIS_CLUSTER_URL|no NexusHandler callbacks|STREAMS_ARCHIVE_S3_URL|STREAMS_POSTGRES_URL' if grep -oE "]*message=\"[^\"]*($gated)[^\"]*\"" "$WORK_DIR/junit.xml"; then echo "live lane: live tests skipped, see above" >&2 status=1 diff --git a/temporalio/contrib/streams/README.md b/temporalio/contrib/streams/README.md index a2ad0f97d2..d4d5b67fd5 100644 --- a/temporalio/contrib/streams/README.md +++ b/temporalio/contrib/streams/README.md @@ -5,7 +5,7 @@ A stream is an ordered log that a Workflow owns. The Workflow publishes to it from Workflow code, and its Activities and any client append to it. Outside readers follow it from a cursor. Records live in the application's -Redis and never pass through Temporal or its History. The +Redis or PostgreSQL and never pass through Temporal or its History. The stream runtime, the `temporalio-streams` crate from the sdk-streams repository, runs the store for every SDK, so Python reads what any other SDK writes. Publishes and @@ -38,6 +38,22 @@ runtime logs a warning when it sees another policy. For tests and local development, `temporalio.contrib.streams.memory.MemoryStreams` keeps streams in the process. +To keep streams in PostgreSQL 14 or later, register +`temporalio.contrib.streams.postgres.PostgresStreams` instead. It makes its +tables when it connects, and keeps records on disk, so a long retention +costs disk, not memory. See +[PostgreSQL store: guarantees and setup](docs/postgres-guarantees.md) for +when to pick it over Redis. + +```python +from temporalio.contrib.streams.postgres import PostgresStreams + +client = await Client.connect( + "localhost:7233", + plugins=[PostgresStreams("postgresql://app:secret@db:5432/app")], +) +``` + ## Path B: an Activity streams to its Workflow An Activity writes to the stream of the Workflow that scheduled it, as @@ -541,7 +557,7 @@ yet. See [Direct reads](docs/nexus.md#direct-reads). producer state, such as `RedisStreams(plain=True)`, the copy lands and every reader drops it. `StreamStorePlugin.capabilities` says which. - **Retention.** A stream keeps records for `retention` (7 days by default, - set on `RedisStreams`) and dies that long after its + set on `RedisStreams` or `PostgresStreams`) and dies that long after its last write. A cursor past dropped records raises `StreamExpiredError`. - **Closing.** Once the Workflow's run chain ends, appends are refused with @@ -554,7 +570,7 @@ yet. See [Direct reads](docs/nexus.md#direct-reads). no reader delivers it, since every read ends at the first `CLOSE` record. - **Readers before the owner.** A read of a Workflow that Temporal doesn't know yet waits for `owner_start_grace` (60 seconds by default, set on - `RedisStreams` or `MemoryStreams`), counted from the read's first owner + `RedisStreams`, `PostgresStreams` or `MemoryStreams`), counted from the read's first owner check. So a reader can start before the Workflow does. After the grace, the read raises `StreamNotFoundError`, so a wrong Workflow id fails after the grace, not at once. Appends and `latest()` don't wait. Zero turns the @@ -570,6 +586,7 @@ yet. See [Direct reads](docs/nexus.md#direct-reads). - [Readers that sleep](docs/notifications.md) - [Store capabilities and guarantees](docs/store-capabilities.md) - [Redis store: guarantees and setup](docs/redis-guarantees.md) +- [PostgreSQL store: guarantees and setup](docs/postgres-guarantees.md) - [Stream wire contract](docs/wire-contract.md) - [Moving from Workflow Streams](docs/migration.md) - [Streams over Nexus](docs/nexus.md) diff --git a/temporalio/contrib/streams/_plugin.py b/temporalio/contrib/streams/_plugin.py index 0e1fb211bf..552afa62e3 100644 --- a/temporalio/contrib/streams/_plugin.py +++ b/temporalio/contrib/streams/_plugin.py @@ -58,7 +58,8 @@ class StreamStorePlugin(SimplePlugin): """The base class of the store configuration classes. - Use :class:`temporalio.contrib.streams.redis.RedisStreams` or + Use :class:`temporalio.contrib.streams.redis.RedisStreams`, + :class:`temporalio.contrib.streams.postgres.PostgresStreams` or :class:`temporalio.contrib.streams.memory.MemoryStreams`. One instance is one store, on one client connection, since the stream runtime asks about each stream's owner over the connection that connected the store. A second diff --git a/temporalio/contrib/streams/docs/postgres-guarantees.md b/temporalio/contrib/streams/docs/postgres-guarantees.md new file mode 100644 index 0000000000..eb2a86b462 --- /dev/null +++ b/temporalio/contrib/streams/docs/postgres-guarantees.md @@ -0,0 +1,221 @@ +# PostgreSQL store: guarantees and setup + +> This package is experimental and may change in future versions. + +Stream records live in your PostgreSQL database. Temporal never sees them, +so what a stream guarantees is what your database guarantees. The stream runtime runs the +store for every SDK, with the SQL in `crates/streams/src/postgres/` of the +sdk-streams repository. This page says what the store promises, how to set it up, +and when to pick it over Redis. + +```python +from temporalio.client import Client +from temporalio.contrib.streams.postgres import PostgresStreams + +client = await Client.connect( + "localhost:7233", + plugins=[PostgresStreams("postgresql://app:secret@db:5432/app")], +) +``` + +PostgreSQL 14 or later is required. The stream runtime refuses an older server when the +client connects the store. Amazon RDS for PostgreSQL and Aurora PostgreSQL +14 and later work. The stream runtime's tests run against PostgreSQL 14 and 17. + +## Postgres or Redis + +Both stores keep the same contract. Readers, cursors, replays and the +notification log behave the same, so code does not change when you move +from one to the other. A stream does not move, so pick before you go to +production. + +Pick Postgres when + +- you already run PostgreSQL and do not want another system to operate, +- you keep streams for weeks or months. Postgres keeps records on disk, so + a long retention costs disk, not memory. Redis keeps every record in + memory, and needs an archive for long retention, +- you want a durable commit with no extra settings. An acknowledged append + is in the write-ahead log, and a synchronous standby keeps it through a + failover. + +Pick Redis when + +- one stream takes thousands of appends a second. One topic's appends run + one at a time in Postgres, so a topic takes about 200 to 1,000 appends a + second on a managed database. A batch of records counts as one append. + Redis takes tens of thousands, +- readers that do not use the server's notifier need a tail in about a + millisecond. See [Waiting reads](#waiting-reads). + +## What an acknowledged append means + +An append is one transaction. It returns after the commit, so a batch is +written in full or not at all, in order. A retry of the newest batch on the +same producer returns the original position and writes nothing. + +How long an acknowledged record lives through a failure depends on the +database. + +- With `synchronous_commit = on`, the PostgreSQL default, a commit waits + for the WAL flush. The record lives through a crash and a power loss. +- With `synchronous_commit = off`, a crash can lose the last few hundred + milliseconds of appends. Do not set it for the store's role. +- A failover to an asynchronous replica can lose appends the primary + acknowledged. Use a synchronous standby, such as RDS Multi-AZ, or Aurora, + which writes to a quorum of storage nodes. + +After a failover, calls fail until the pool reaches the new primary. An +append whose result is not known raises `StreamOutcomeUnknownError`, and a +retry on the same producer answers it with no duplicate. + +## Waiting reads + +A read that waits for new records holds no database connection. Three things +wake it. + +1. An append in the same process wakes its readers at once. +2. Each process polls for all of its waiting reads with one query every + `poll_interval` (100 ms). So a reader in another process sees a new + record within about that time. The cost grows with the number of + processes, not with the number of readers. +3. With `notify_reads=True`, each append also sends `NOTIFY`, and readers in + other processes wake in a few milliseconds. This costs append throughput + when many producers write at once, so it is off by default. + +Readers that sleep on the server's stream notifier, through +`notify_on_append()` or a `StreamDriver`, wake the same way on both stores. +For most readers that is the main path, and the poll is a fallback. Set +`notify_reads` only for readers that do not use the notifier and need a +tail below `poll_interval`. + +## Retention and cleanup + +A janitor deletes records older than `retention` (7 days), once a minute by +default. Every process that connects the store runs one, and an advisory +lock lets one work at a time. It keeps what a Workflow reader's hold or the +archive still needs. + +- A topic whose records are all gone keeps one row for `retention` plus 30 + days past its last write. That lets a reader tell a cursor whose records expired + (`StreamExpiredError`) from a stream that never existed. +- Deleting a Workflow does not delete its streams. To remove them at once, + call `PostgresStreams.delete_workflow_streams(namespace, workflow_id)` or + `delete_activity_streams(namespace, activity_id)`. Run it only after the + chain closed and its producers stopped. A late append writes a fresh + stream. +- Size the disk for your write rate times `retention`. A 256-byte record + takes about 360 bytes with its index entry. + +The janitor's deletes leave dead rows for autovacuum. The default +autovacuum settings keep up at moderate write rates. Watch +`pg_stat_user_tables.n_dead_tup` on `records` at high rates. + +## Migrations + +By default the store makes its tables and functions in `schema` +(`temporal_streams`) when it connects, and upgrades them on a later +release. An advisory lock makes many Workers that start at once apply each +migration once. The store refuses to start when an applied migration +differs from the one the stream runtime holds, or when the database is newer than the +release can read. + +For a database where applications may not change the schema, pass +`skip_migrations=True`. The store then only checks that every migration it +knows is applied. A DBA applies the SQL files in +`crates/streams/src/postgres/migrations/` of the sdk-streams repository, in order, +after `SET search_path = , pg_temp`, and adds a row to +`schema_migrations` for each. Running the store once with a role that may +create the schema does the same. Then grant the application's role the +rights below. It needs no `CREATE`. + +```sql +CREATE ROLE streams_app LOGIN PASSWORD 'secret'; +GRANT USAGE ON SCHEMA temporal_streams TO streams_app; +GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA temporal_streams TO streams_app; +GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA temporal_streams TO streams_app; +``` + +Grant again after a migration adds a table or a function. The stream runtime's conformance +suite runs once as a role with exactly these grants. + +One schema per isolation domain, such as a namespace or a team, with its own +role and grants, keeps domains apart, as a Redis key prefix and ACL do. + +## PgBouncer and other poolers + +The store keeps a pool of `max_connections` (16) per process. Waiting reads +hold none. + +- PgBouncer in session mode works with no setting. +- PgBouncer in transaction mode works from PgBouncer 1.21, with + `max_prepared_statements` set, since the store prepares its statements. + `LISTEN` and the migrations' session lock do not work through + transaction mode. So set `listen_url` to a direct or session-mode URL of + the same database. The store runs its migrations there, and with a + notification log or `notify_reads` it keeps one listening connection per + process there. That connection opens when the store connects, so a + `listen_url` the process can't reach fails the connect. +- RDS Proxy pins a connection that listens. Point `listen_url` at the + instance or cluster endpoint. + +Both URLs must name the primary. A read replica or an Aurora reader +endpoint refuses writes and `LISTEN`. + +## TLS + +The store reads `sslmode` and `sslrootcert` from the URL, as libpq does. +The default is `prefer`, which falls back to no TLS. For a database on +another host, use `sslmode=verify-full`. The stream runtime logs a warning for a remote +host with another mode. RDS and Aurora certificates chain to the Amazon RDS +certificate authorities, which system trust stores do not hold. Download +the RDS bundle and pass it in the URL. + +``` +postgres://app:@:5432/?sslmode=verify-full&sslrootcert=/etc/rds.pem +``` + +IAM database authentication is not in this release. The password comes +from the URL. + +## The archive + +Postgres keeps records on disk, so it does not need an archive to keep +streams for months. An archive is optional, and is worth it for retention +in years, for more than about 1 TB of records, or to keep backups small. + +```python +from datetime import timedelta + +from temporalio.contrib.streams.archive import StreamArchive +from temporalio.contrib.streams.postgres import PostgresStreams + +store = PostgresStreams( + "postgresql://app:secret@db:5432/app", + retention=timedelta(days=7), + archive=StreamArchive("s3://my-bucket/streams"), +).notify_on_append(notification_log=True) +``` + +A running `StreamDriver` copies each stream's records to the archive, and +reads below what Postgres holds read the archive with the same cursors. +Postgres keeps each record the archive does not hold yet, for at most the +archive's `stall_limit` (7 days). See +[Long retention](redis-guarantees.md#long-retention) for how the archive +works. It is the same on both stores. + +## What crosses the wire + +- **Record bodies** go through your data converter's payload codec before + they are stored, so an encrypting codec keeps them encrypted in the + database. +- **Workflow ids, topic names and producer ids** are stored in clear text. + Do not put secrets in them. +- **Content hashes are not encrypted.** Each record carries the SHA-256 of + its body as the converter produced it, before the codec. Anyone who can + read the tables can tell when two records carry the same value. If that + matters for your data, add something unique, such as a random field, to + each value. +- Temporal does not authorize or meter record traffic. Records go straight + between your applications and your database, so access is the database's + job. diff --git a/temporalio/contrib/streams/docs/store-capabilities.md b/temporalio/contrib/streams/docs/store-capabilities.md index 9c40adb1c3..6114f9d58b 100644 --- a/temporalio/contrib/streams/docs/store-capabilities.md +++ b/temporalio/contrib/streams/docs/store-capabilities.md @@ -83,8 +83,9 @@ Y means the store has it, and N means the stream runtime takes the fallback. | `MemoryStreams()` | Y | N | Y | Y | N | Y | Y | Y | Y | | `RedisStreams(...)` | Y | N | Y | Y | N | Y | Y | Y | Y | | `RedisStreams(..., plain=True)` | N | N | N | N | N | Y | Y | Y | Y | +| `PostgresStreams(...)` | Y | N | Y | Y | N | Y | Y | Y | Y | -Memory and Redis have a change feed once +Memory, Redis and PostgreSQL have a change feed once `notify_on_append(notification_log=True)` turns the notification log on. `RedisStreams(plain=True)` refuses the notification log and an archive when the client connects it. diff --git a/temporalio/contrib/streams/postgres.py b/temporalio/contrib/streams/postgres.py new file mode 100644 index 0000000000..2bfc6de4ce --- /dev/null +++ b/temporalio/contrib/streams/postgres.py @@ -0,0 +1,157 @@ +"""Streams in the application's PostgreSQL database.""" + +from __future__ import annotations + +from datetime import timedelta + +from temporalio.bridge.proto.streams import PostgresStoreConfig, StreamStoreConfig +from temporalio.contrib.streams._plugin import ( + StreamStorePlugin, + with_owner_start_grace, +) +from temporalio.contrib.streams.archive import StreamArchive + +__all__ = ["PostgresStreams"] + +_SCHEMES = ("postgres://", "postgresql://") + + +class PostgresStreams(StreamStorePlugin): + """A store in a PostgreSQL database that the stream runtime connects to. + + One instance per database. Pass it to the client as a plugin, and open + handles from the client with + :func:`temporalio.contrib.streams.get_stream_handle`. PostgreSQL 14 or + later is required. The store keeps records on disk, so a long retention + costs disk, not memory. By default it makes and upgrades its tables in + ``schema`` when it connects. + """ + + def __init__( + self, + url: str, + *, + schema: str = "temporal_streams", + retention: timedelta = timedelta(days=7), + max_connections: int | None = None, + response_timeout: timedelta | None = None, + floor_lease: timedelta | None = None, + floor_release_grace: timedelta | None = None, + owner_start_grace: timedelta | None = None, + notify_doorbells: int | None = None, + listen_url: str | None = None, + poll_interval: timedelta | None = None, + notify_reads: bool = False, + skip_migrations: bool = False, + janitor_interval: timedelta | None = None, + archive: StreamArchive | None = None, + ) -> None: + """Create the store's configuration. + + Args: + url: A ``postgres://`` or ``postgresql://`` URL. Credentials come + from the URL. TLS follows its ``sslmode`` and ``sslrootcert`` + as libpq reads them, and ``sslmode=prefer`` when unset. + schema: The schema that holds the store's tables, in lowercase + letters, digits and underscores, at most 55 characters. A + schema per isolation domain, with its own grants, keeps + domains apart. + retention: How long a stream keeps a record. A janitor in each + process deletes older records, one process at a time. + max_connections: How many connections the pool keeps. Waiting + reads hold none. The stream runtime's 16 when unset. + response_timeout: How long a call waits, as the session's + ``statement_timeout``. The stream runtime's 5 seconds when unset. + floor_lease: How long a Workflow reader that replays from the + store, as ``workflow_reader`` does by default, holds the + records it read against retention after its last read. + ``retention`` when unset. + floor_release_grace: How long such a hold lasts after a reader + releases it. One day when unset. A Python Workflow reader + never releases, since its run may replay its reads until it + ends, so its hold lasts ``floor_lease``. + owner_start_grace: How long a read of a Workflow that Temporal + doesn't know yet answers empty before it fails with + :class:`temporalio.contrib.streams.StreamNotFoundError`, so + a reader can start before its owner. 60 seconds when unset. + Zero fails at once. + notify_doorbells: With a notification log, how many channels the + log rings when a partition takes a first entry. A driver + listens on each one. The stream runtime's 16 when unset, at most 64. + listen_url: A URL for the one connection that listens for + notifications, when ``url`` goes through a pooler in + transaction mode, such as PgBouncer. Name the database + directly or through a pooler in session mode. ``url`` when + unset. + poll_interval: How often a process looks for new records for its + waiting reads, with one query for all of them. The stream runtime's 100 ms + when unset. + notify_reads: Each append also sends ``NOTIFY``, so a waiting + read in another process wakes in milliseconds instead of at + the next poll. It costs append throughput when many + producers write at once. + skip_migrations: The store only checks the schema version and + never changes the schema. A DBA applies the migrations, and + the role in ``url`` needs no ``CREATE``. + janitor_interval: How often the janitor deletes expired records. + The stream runtime's one minute when unset. + archive: Object storage that keeps records after ``retention`` + deletes them. A running + :class:`temporalio.contrib.streams.StreamDriver` fills it, + and the store needs + ``notify_on_append(notification_log=True)``. The stream runtime refuses + to connect the store without the log. + + Raises: + ValueError: ``url`` or ``listen_url`` is not a PostgreSQL URL, + ``schema`` is empty, ``retention`` is shorter than a + millisecond, ``notify_doorbells`` is not from 1 to 64, a + duration is not positive, or ``owner_start_grace`` is + negative. + """ + if not url.startswith(_SCHEMES): + raise ValueError(f"PostgresStreams needs a postgres:// URL, got {url!r}") + if listen_url is not None and not listen_url.startswith(_SCHEMES): + raise ValueError( + f"listen_url must be a postgres:// URL, got {listen_url!r}" + ) + if not schema: + raise ValueError("schema must not be empty") + if retention < timedelta(milliseconds=1): + raise ValueError( + f"retention must be at least a millisecond, got {retention}" + ) + if notify_doorbells is not None and not 1 <= notify_doorbells <= 64: + raise ValueError( + f"notify_doorbells must be from 1 to 64, got {notify_doorbells}" + ) + durations = { + "response_timeout": response_timeout, + "floor_lease": floor_lease, + "floor_release_grace": floor_release_grace, + "poll_interval": poll_interval, + "janitor_interval": janitor_interval, + } + for name, value in durations.items(): + if value is not None and value <= timedelta(0): + raise ValueError(f"{name} must be positive, got {value}") + config = PostgresStoreConfig( + url=url, + schema=schema, + max_connections=max_connections or 0, + notify_doorbells=notify_doorbells or 0, + listen_url=listen_url or "", + notify_reads=notify_reads, + skip_migrations=skip_migrations, + ) + config.retention.FromTimedelta(retention) + for name, value in durations.items(): + if value is not None: + getattr(config, name).FromTimedelta(value) + store = StreamStoreConfig(postgres=config) + if archive is not None: + store.archive.CopyFrom(archive._config) + super().__init__( + "temporalio.contrib.streams.PostgresStreams", + with_owner_start_grace(store, owner_start_grace), + ) diff --git a/tests/contrib/streams/_support.py b/tests/contrib/streams/_support.py index 3f0524d85a..9e915cc211 100644 --- a/tests/contrib/streams/_support.py +++ b/tests/contrib/streams/_support.py @@ -5,11 +5,13 @@ import asyncio import functools import json +import os import subprocess import uuid from pathlib import Path from typing import Any, TypeVar +import pytest from google.protobuf.message import Message from temporalio.api.workflowservice.v1 import ( @@ -20,6 +22,7 @@ from temporalio.contrib.streams import StreamStorePlugin from temporalio.contrib.streams._plugin import call, store_for_client from temporalio.contrib.streams.memory import MemoryStreams +from temporalio.contrib.streams.postgres import PostgresStreams from temporalio.converter import DataConverter from temporalio.service import RPCError, RPCStatusCode @@ -96,6 +99,23 @@ async def call_workflow_service( ) from None +def postgres_streams(schema: str | None = None, **settings: Any) -> PostgresStreams: + """A store on ``STREAMS_POSTGRES_URL``, in a schema of its own unless ``schema`` names one. + + Skips the test when the variable is unset. + """ + url = os.environ.get("STREAMS_POSTGRES_URL", "") + if not url: + pytest.skip("set STREAMS_POSTGRES_URL to run on PostgreSQL") + # The test process keeps every store it connects, so each pool stays small. + settings.setdefault("max_connections", 4) + return PostgresStreams(url, schema=schema or new_schema(), **settings) + + +def new_schema() -> str: + return f"streams_{uuid.uuid4().hex}" + + @functools.cache def streams_crate_dir() -> Path: """The checkout of the temporalio-streams crate the bridge builds against. diff --git a/tests/contrib/streams/test_live_notifications.py b/tests/contrib/streams/test_live_notifications.py index a1d897d0b3..766df2e046 100644 --- a/tests/contrib/streams/test_live_notifications.py +++ b/tests/contrib/streams/test_live_notifications.py @@ -54,7 +54,9 @@ from tests.contrib.streams._support import ( connect_with, describe_stream_notifier, + new_schema, new_workflow_id, + postgres_streams, ) from tests.contrib.streams.test_outside_handles import Waits, running_owner from tests.helpers import new_worker @@ -112,6 +114,8 @@ async def skip_without_notifier(client: Client) -> None: def store(kind: str) -> StreamStorePlugin: if kind == "memory": return MemoryStreams() + if kind == "postgres": + return postgres_streams() if kind == "cluster": url = os.environ.get("STREAMS_REDIS_CLUSTER_URL", "") if not url: @@ -123,14 +127,14 @@ def store(kind: str) -> StreamStorePlugin: return RedisStreams(url, key_prefix=f"live-{uuid.uuid4().hex}") -@pytest.fixture(params=["memory", "redis"]) +@pytest.fixture(params=["memory", "redis", "postgres"]) async def notifying(request: pytest.FixtureRequest, client: Client) -> Client: """A client whose store notifies, on a server with the notifier.""" await skip_without_notifier(client) return await connect_with(client, store(request.param)) -@pytest.fixture(params=["memory", "redis", "cluster"]) +@pytest.fixture(params=["memory", "redis", "cluster", "postgres"]) async def driven( request: pytest.FixtureRequest, client: Client ) -> AsyncIterator[Client]: @@ -225,7 +229,7 @@ async def test_live_streams_on_many_slots_all_wake_through_the_driver( await driven.get_workflow_handle(owner).signal(Waits.finish) -@pytest.mark.parametrize("kind", ["redis"]) +@pytest.mark.parametrize("kind", ["redis", "postgres"]) async def test_live_a_client_reader_finds_a_lost_notification_at_the_poll_limit( client: Client, kind: str ): @@ -251,6 +255,12 @@ async def test_live_a_client_reader_finds_a_lost_notification_at_the_poll_limit( async def two_processes(client: Client, kind: str) -> tuple[Client, Client]: """A reader's client that notifies, and a producer's that never does, on one store.""" await skip_without_notifier(client) + if kind == "postgres": + schema = new_schema() + reading = await connect_with( + client, postgres_streams(schema).notify_on_append() + ) + return reading, await connect_with(client, postgres_streams(schema)) url = os.environ.get("STREAMS_REDIS_URL", "") if not url: pytest.skip("set STREAMS_REDIS_URL to share a store across two clients") @@ -759,7 +769,7 @@ async def test_live_a_position_resumes_the_reader_after_continue_as_new( await notifying.get_workflow_handle(owner).signal(Waits.finish) -@pytest.mark.parametrize("kind", ["redis"]) +@pytest.mark.parametrize("kind", ["redis", "postgres"]) async def test_live_a_recheck_finds_a_record_whose_notification_was_lost( client: Client, kind: str ): diff --git a/tests/contrib/streams/test_postgres_docs.py b/tests/contrib/streams/test_postgres_docs.py new file mode 100644 index 0000000000..589abd5db9 --- /dev/null +++ b/tests/contrib/streams/test_postgres_docs.py @@ -0,0 +1,24 @@ +"""The PostgreSQL docs this package ships stay in step with the crate's store.""" + +from __future__ import annotations + +import re +from pathlib import Path + +from tests.contrib.streams._support import streams_crate_dir + +_ROOT = Path(__file__).resolve().parents[3] +_PYTHON_DOC = _ROOT / "temporalio/contrib/streams/docs/postgres-guarantees.md" +# The grants the crate's role test lane runs the store with. +_CORE_DOC = streams_crate_dir() / "docs/postgres.md" + + +def grant_lines(doc: Path) -> list[str]: + return re.findall(r"^GRANT .*$", doc.read_text(), re.MULTILINE) + + +def test_the_documented_grants_are_cores(): + # A role built from an older copy of the grants fails calls once Core's + # store needs another right. + assert grant_lines(_PYTHON_DOC) + assert grant_lines(_PYTHON_DOC) == grant_lines(_CORE_DOC) diff --git a/tests/contrib/streams/test_replay_reads.py b/tests/contrib/streams/test_replay_reads.py index 82e92bc106..471d5a50ac 100644 --- a/tests/contrib/streams/test_replay_reads.py +++ b/tests/contrib/streams/test_replay_reads.py @@ -44,7 +44,7 @@ from temporalio.exceptions import ApplicationError from temporalio.testing import ActivityEnvironment from temporalio.workflow import NondeterminismError -from tests.contrib.streams._support import connect_with +from tests.contrib.streams._support import connect_with, postgres_streams from tests.contrib.streams.test_outside_handles import ( ActivityKeyedCodec, Waits, @@ -59,6 +59,8 @@ def store(kind: str) -> StreamStorePlugin: if kind == "memory": return MemoryStreams() + if kind == "postgres": + return postgres_streams() import os url = os.environ.get("STREAMS_REDIS_URL", "") @@ -67,7 +69,7 @@ def store(kind: str) -> StreamStorePlugin: return RedisStreams(url, key_prefix=f"replay-reads-{uuid.uuid4().hex}") -@pytest.fixture(params=["memory", "redis"]) +@pytest.fixture(params=["memory", "redis", "postgres"]) async def streams(request: pytest.FixtureRequest, client: Client) -> Client: return await connect_with(client, store(request.param)) @@ -385,8 +387,9 @@ def test_the_batch_cache_keeps_its_bytes_bounded(): assert cache.get(range_key(ranges[2])) == big.SerializeToString() +@pytest.mark.parametrize("kind", ["redis", "postgres"]) async def test_a_first_range_trimmed_past_its_hold_is_lost_not_other_records( - client: Client, + client: Client, kind: str ): import os @@ -394,11 +397,19 @@ async def test_a_first_range_trimmed_past_its_hold_is_lost_not_other_records( "retention": timedelta(milliseconds=300), "floor_lease": timedelta(milliseconds=100), } - url = os.environ.get("STREAMS_REDIS_URL", "") - if not url: - pytest.skip("set STREAMS_REDIS_URL to run on Redis") - # Retention trims as the next appends land, once the reader's hold lapsed. - store = RedisStreams(url, key_prefix=f"replay-reads-{uuid.uuid4().hex}", **settings) + if kind == "postgres": + # The janitor trims, so it runs often here. + store: StreamStorePlugin = postgres_streams( + janitor_interval=timedelta(milliseconds=100), **settings + ) + else: + url = os.environ.get("STREAMS_REDIS_URL", "") + if not url: + pytest.skip("set STREAMS_REDIS_URL to run on Redis") + # Retention trims as the next appends land, once the reader's hold lapsed. + store = RedisStreams( + url, key_prefix=f"replay-reads-{uuid.uuid4().hex}", **settings + ) streams = await connect_with(client, store) async with new_worker(streams, Waits) as worker: owner = await running_owner(streams, worker.task_queue) diff --git a/tests/contrib/streams/test_store_docs.py b/tests/contrib/streams/test_store_docs.py index d122e15914..2a88fd2a8b 100644 --- a/tests/contrib/streams/test_store_docs.py +++ b/tests/contrib/streams/test_store_docs.py @@ -16,7 +16,7 @@ from temporalio.contrib.streams import StoreCapabilities, StreamStorePlugin from temporalio.contrib.streams.memory import MemoryStreams from temporalio.contrib.streams.redis import RedisStreams -from tests.contrib.streams._support import connect_with +from tests.contrib.streams._support import connect_with, postgres_streams _DOC = ( Path(__file__).parents[3] / "temporalio/contrib/streams/docs/store-capabilities.md" @@ -55,6 +55,8 @@ def yn(value: bool) -> str: def _store(row: str) -> StreamStorePlugin: if row.startswith("`MemoryStreams"): return MemoryStreams() + if row.startswith("`PostgresStreams"): + return postgres_streams() url = os.environ.get("STREAMS_REDIS_URL", "") if not url: pytest.skip("set STREAMS_REDIS_URL to check the Redis rows") diff --git a/tests/contrib/streams/test_store_plugin.py b/tests/contrib/streams/test_store_plugin.py index b47d41e0b6..6efbcb3b9b 100644 --- a/tests/contrib/streams/test_store_plugin.py +++ b/tests/contrib/streams/test_store_plugin.py @@ -5,6 +5,7 @@ import hashlib import uuid from datetime import timedelta +from typing import Any import pytest @@ -22,7 +23,9 @@ from temporalio.client import Client from temporalio.contrib.streams import StreamError, StreamNotFoundError from temporalio.contrib.streams._plugin import call +from temporalio.contrib.streams.archive import StreamArchive from temporalio.contrib.streams.memory import MemoryStreams +from temporalio.contrib.streams.postgres import PostgresStreams from temporalio.contrib.streams.redis import RedisStreams from temporalio.worker import Worker from tests.contrib.streams._support import connect_with @@ -120,6 +123,87 @@ def test_redis_setting_mistakes_are_value_errors(): RedisStreams("redis://a", retention=timedelta(microseconds=10)) +def test_postgres_settings_go_into_the_store_config(): + archive = StreamArchive("s3://bucket/streams", segment_bytes=1024) + store = PostgresStreams( + "postgresql://app@db:5432/streams", + schema="team_a", + retention=timedelta(days=90), + max_connections=32, + response_timeout=timedelta(seconds=3), + floor_lease=timedelta(hours=1), + floor_release_grace=timedelta(minutes=10), + owner_start_grace=timedelta(seconds=20), + notify_doorbells=8, + listen_url="postgres://app@db-direct:5432/streams", + poll_interval=timedelta(milliseconds=50), + notify_reads=True, + skip_migrations=True, + janitor_interval=timedelta(seconds=30), + archive=archive, + ) + assert store._config.WhichOneof("store") == "postgres" + config = store._config.postgres + assert config.url == "postgresql://app@db:5432/streams" + assert config.schema == "team_a" + assert config.retention.ToTimedelta() == timedelta(days=90) + assert config.max_connections == 32 + assert config.response_timeout.ToTimedelta() == timedelta(seconds=3) + assert config.floor_lease.ToTimedelta() == timedelta(hours=1) + assert config.floor_release_grace.ToTimedelta() == timedelta(minutes=10) + assert config.notify_doorbells == 8 + assert config.listen_url == "postgres://app@db-direct:5432/streams" + assert config.poll_interval.ToTimedelta() == timedelta(milliseconds=50) + assert config.notify_reads and config.skip_migrations + assert config.janitor_interval.ToTimedelta() == timedelta(seconds=30) + assert store._config.owner_start_grace.ToTimedelta() == timedelta(seconds=20) + assert store._config.archive == archive._config + # Unset settings leave Core's defaults. + defaults = PostgresStreams("postgres://db/streams")._config + config = defaults.postgres + assert config.schema == "temporal_streams" + assert config.retention.ToTimedelta() == timedelta(days=7) + assert (config.max_connections, config.notify_doorbells) == (0, 0) + assert config.listen_url == "" + assert not (config.notify_reads or config.skip_migrations) + for name in ( + "response_timeout", + "floor_lease", + "floor_release_grace", + "poll_interval", + "janitor_interval", + ): + assert not config.HasField(name), name + assert not defaults.HasField("owner_start_grace") + assert not defaults.HasField("archive") + + +@pytest.mark.parametrize( + "settings, message", + [ + ({"url": ""}, "postgres:// URL"), + ({"url": "redis://db"}, "postgres:// URL"), + ({"listen_url": "db:5432"}, "listen_url"), + ({"schema": ""}, "schema"), + ({"retention": timedelta(microseconds=10)}, "retention"), + ({"notify_doorbells": 0}, "notify_doorbells"), + ({"notify_doorbells": 65}, "notify_doorbells"), + ({"response_timeout": timedelta(0)}, "response_timeout"), + ({"floor_lease": timedelta(seconds=-1)}, "floor_lease"), + ({"floor_release_grace": timedelta(0)}, "floor_release_grace"), + ({"poll_interval": timedelta(0)}, "poll_interval"), + ({"janitor_interval": timedelta(seconds=-1)}, "janitor_interval"), + ({"owner_start_grace": timedelta(seconds=-1)}, "owner_start_grace"), + ], +) +def test_postgres_setting_mistakes_are_value_errors( + settings: dict[str, Any], message: str +): + settings = {"url": "postgres://db/streams", **settings} + with pytest.raises(ValueError, match=message): + PostgresStreams(**settings) + + async def test_deleting_removes_what_a_workflow_stream_holds(client: Client): store = MemoryStreams() with pytest.raises(ValueError, match="no client has connected"): diff --git a/tests/contrib/streams/test_stream_archive.py b/tests/contrib/streams/test_stream_archive.py index e611c7c806..b3703ddfc1 100644 --- a/tests/contrib/streams/test_stream_archive.py +++ b/tests/contrib/streams/test_stream_archive.py @@ -1,10 +1,11 @@ -"""An archive behind a Redis store keeps the records it trimmed readable. +"""An archive behind a Redis or Postgres store keeps the records it trimmed readable. A StreamDriver fills the archive, and it runs only on a server with the stream notifier, so the live cases run in the Jetty lane. Each live case runs on a local directory and on the S3 server that ``STREAMS_ARCHIVE_S3_URL`` names, with the ``AWS_*`` settings Core reads. -The lane starts MinIO in Docker for it. +The lane starts MinIO in Docker for it. The Postgres cases need +``STREAMS_POSTGRES_URL``. """ from __future__ import annotations @@ -35,7 +36,11 @@ from temporalio.contrib.streams.archive import StreamArchive from temporalio.contrib.streams.redis import RedisStreams from temporalio.worker import Replayer -from tests.contrib.streams._support import connect_with +from tests.contrib.streams._support import ( + connect_with, + new_schema, + postgres_streams, +) from tests.contrib.streams.test_live_notifications import ( TOKENS, Reads, @@ -113,26 +118,37 @@ def archive_for(kind: str, tmp_path: Path) -> StreamArchive: params=[ ("redis", "local"), ("redis", "s3"), + ("postgres", "local"), + ("postgres", "s3"), ], ids=lambda p: "-".join(p), ) async def tiers( request: pytest.FixtureRequest, client: Client, tmp_path: Path ) -> AsyncIterator[Tiers]: - _, where = request.param + kind, where = request.param # A Workflow reader's hold lapses at once, so only the archive holds records. settings: dict[str, Any] = { "retention": RETENTION, "floor_lease": timedelta(milliseconds=100), "floor_release_grace": timedelta(milliseconds=100), } - url = os.environ.get("STREAMS_REDIS_URL", "") - if not url: - pytest.skip("set STREAMS_REDIS_URL to run on Redis") - settings["key_prefix"] = f"archive-{uuid.uuid4().hex}" + if kind == "postgres": + # The janitor trims, so it runs often here. + settings["janitor_interval"] = timedelta(milliseconds=100) + schema = new_schema() + + def hot(archive: StreamArchive | None) -> StreamStorePlugin: + return postgres_streams(schema, archive=archive, **settings) + + else: + url = os.environ.get("STREAMS_REDIS_URL", "") + if not url: + pytest.skip("set STREAMS_REDIS_URL to run on Redis") + settings["key_prefix"] = f"archive-{uuid.uuid4().hex}" - def hot(archive: StreamArchive | None) -> StreamStorePlugin: - return RedisStreams(url, archive=archive, **settings) + def hot(archive: StreamArchive | None) -> StreamStorePlugin: + return RedisStreams(url, archive=archive, **settings) await skip_without_notifier(client) archive = archive_for(where, tmp_path) @@ -173,7 +189,7 @@ async def trim_past(tiers: Tiers, owner: str, after: Cursor, producer: StreamPro await records.aclose() if time.monotonic() > deadline: raise AssertionError("the store did not trim the archived records") - # Redis trims on appends past the retention. + # Redis trims on appends past the retention, and Postgres in its janitor. await asyncio.sleep(RETENTION.total_seconds()) filler += 1 await producer.append(f"filler-{filler}") diff --git a/tests/contrib/streams/test_stream_driver.py b/tests/contrib/streams/test_stream_driver.py index 734f81944f..d21e3ee5b4 100644 --- a/tests/contrib/streams/test_stream_driver.py +++ b/tests/contrib/streams/test_stream_driver.py @@ -19,8 +19,9 @@ get_stream_handle, ) from temporalio.contrib.streams.memory import MemoryStreams +from temporalio.contrib.streams.postgres import PostgresStreams from temporalio.contrib.streams.redis import RedisStreams -from tests.contrib.streams._support import connect_with +from tests.contrib.streams._support import connect_with, postgres_streams from tests.contrib.streams.test_outside_handles import Waits, running_owner from tests.helpers import new_worker @@ -33,6 +34,8 @@ def test_the_log_rides_the_store_config(): assert redis._config.redis.notify_doorbells == 4 with pytest.raises(ValueError, match="notify_doorbells"): RedisStreams("redis://x", notify_doorbells=0) + postgres = PostgresStreams("postgres://x/db", notify_doorbells=64) + assert postgres._config.postgres.notify_doorbells == 64 async def test_a_driver_needs_a_store_with_a_log(client: Client): @@ -62,10 +65,11 @@ async def test_a_driver_takes_its_settings(client: Client): def log_store(kind: str) -> StreamStorePlugin: - return MemoryStreams().notify_on_append(notification_log=True) + store = postgres_streams() if kind == "postgres" else MemoryStreams() + return store.notify_on_append(notification_log=True) -@pytest.mark.parametrize("kind", ["memory"]) +@pytest.mark.parametrize("kind", ["memory", "postgres"]) async def test_a_driver_on_a_server_without_notifiers_fails(client: Client, kind: str): streams = await connect_with(client, log_store(kind)) async with new_worker(streams, Waits) as worker: diff --git a/tests/contrib/streams/test_workflow_reader.py b/tests/contrib/streams/test_workflow_reader.py index 6c59463431..576fe1bd58 100644 --- a/tests/contrib/streams/test_workflow_reader.py +++ b/tests/contrib/streams/test_workflow_reader.py @@ -45,6 +45,7 @@ StreamRecordError, StreamRef, StreamRefusedError, + StreamStorePlugin, StreamUnsupportedError, _workflow, activity_handle, @@ -77,6 +78,7 @@ connect_with, describe_stream_notifier, new_workflow_id, + postgres_streams, ) from tests.contrib.streams.test_outside_handles import ( Waits, @@ -88,6 +90,10 @@ TOKENS = topic("tokens", str) +def new_store(kind: str) -> StreamStorePlugin: + return postgres_streams() if kind == "postgres" else MemoryStreams() + + class FakeReads: """Core's scripted answers for the read Activity, and the inputs it got.""" @@ -655,11 +661,12 @@ async def test_each_reader_of_a_run_has_its_own_subscription(client: Client): assert ids == ["1", "2"] +@pytest.mark.parametrize("kind", ["memory", "postgres"]) async def test_the_read_activity_reads_and_decodes_through_core( - client: Client, + client: Client, kind: str ): # Without the notifier the attach fails, so this drives the read alone. - streams_client = await connect_with(client, MemoryStreams()) + streams_client = await connect_with(client, new_store(kind)) async with new_worker(streams_client, Waits) as worker: owner = await running_owner(streams_client, worker.task_queue) handle = streams_client.get_workflow_handle(owner) @@ -880,13 +887,14 @@ def test_a_read_input_from_before_activity_owners_names_a_workflow(): assert (input.owner_kind, input.activity_id) == ("workflow", "") +@pytest.mark.parametrize("kind", ["memory", "postgres"]) @pytest.mark.parametrize("record_batches", [True, False]) async def test_a_workflow_reads_the_stream_of_a_standalone_activity( - client: Client, record_batches: bool, + client: Client, record_batches: bool, kind: str ): # The Activity closes its stream before the reader starts, so the reader # reads to the close and never sleeps on the notifier. - streams = await connect_with(client, MemoryStreams()) + streams = await connect_with(client, new_store(kind)) activity_id = new_workflow_id() async with new_worker(streams, ReadsAStream, activities=[owns_a_stream]) as worker: owner = await streams.start_activity( @@ -919,10 +927,11 @@ async def test_a_workflow_reads_the_stream_of_a_standalone_activity( ) +@pytest.mark.parametrize("kind", ["memory", "postgres"]) async def test_the_read_activity_reads_a_standalone_activitys_stream( - client: Client, + client: Client, kind: str ): - streams = await connect_with(client, MemoryStreams()) + streams = await connect_with(client, new_store(kind)) activity_id = new_workflow_id() async with new_worker(streams, activities=[owns_a_stream]) as worker: owner = await streams.start_activity( @@ -1065,13 +1074,14 @@ async def run(self, record_batches: bool) -> list[str]: return seen +@pytest.mark.parametrize("kind", ["memory", "postgres"]) @pytest.mark.parametrize("record_batches", [True, False]) async def test_a_workflow_reads_the_stream_of_its_own_activity( - client: Client, record_batches: bool, + client: Client, record_batches: bool, kind: str ): # The Worker closes the tool's stream when the run sees the tool end, so # the reader reads to that close and never sleeps on the notifier. - streams = await connect_with(client, MemoryStreams()) + streams = await connect_with(client, new_store(kind)) async with new_worker( streams, RunsAToolAndReadsIt, activities=[streams_a_tool_call] ) as worker: From c8fd2efc60466d82307a8f40c2f30b464245b8a6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sat, 17 Oct 2026 22:54:23 -0700 Subject: [PATCH 02/13] Pinned sdk-streams so3 with the postgres feature. so3 brings back PostgresStoreConfig, so the stream protos regenerate. --- temporalio/bridge/Cargo.lock | 359 +++++++++++++++++- temporalio/bridge/Cargo.toml | 4 +- temporalio/bridge/proto/streams/__init__.py | 2 + .../bridge/proto/streams/streams_pb2.py | 302 ++++++++------- .../bridge/proto/streams/streams_pb2.pyi | 138 ++++++- 5 files changed, 654 insertions(+), 151 deletions(-) diff --git a/temporalio/bridge/Cargo.lock b/temporalio/bridge/Cargo.lock index 44bce73ca9..64414093ed 100644 --- a/temporalio/bridge/Cargo.lock +++ b/temporalio/bridge/Cargo.lock @@ -191,6 +191,12 @@ version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bindgen" version = "0.72.1" @@ -264,6 +270,12 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.12.1" @@ -355,6 +367,12 @@ dependencies = [ "cc", ] +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + [[package]] name = "combine" version = "4.6.8" @@ -369,6 +387,18 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "convert_case" version = "0.10.0" @@ -471,6 +501,15 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "ctutils" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03bb0e1cc970d482d121d9a1744999169b69a07470b3d644a7894e53fcaf4574" +dependencies = [ + "cmov", +] + [[package]] name = "darling" version = "0.24.1" @@ -505,6 +544,62 @@ dependencies = [ "syn 3.0.6", ] +[[package]] +name = "deadpool" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e98a7e119cd347f4201e1159b19831029e203e2d8b790547708e8157b4acf1e" +dependencies = [ + "deadpool-runtime", + "tokio", +] + +[[package]] +name = "deadpool-postgres" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65a536565624b97fc19f758cd01b15d12908d3344425066efc8162236fbd3749" +dependencies = [ + "async-trait", + "deadpool", + "getrandom 0.4.3", + "tokio", + "tokio-postgres", + "tracing", +] + +[[package]] +name = "deadpool-runtime" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2657f61fb1dd8bf37a8d51093cc7cee4e77125b22f7753f49b289f831bec2bae" +dependencies = [ + "tokio", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid 0.9.6", + "der_derive", + "flagset", + "zeroize", +] + +[[package]] +name = "der_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "derive_more" version = "2.1.1" @@ -545,7 +640,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.1", + "const-oid 0.10.2", "crypto-common 0.2.2", + "ctutils", ] [[package]] @@ -683,6 +780,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + [[package]] name = "fastrand" version = "2.5.0" @@ -711,6 +814,12 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +[[package]] +name = "flagset" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe" + [[package]] name = "flate2" version = "1.1.10" @@ -892,7 +1001,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -971,6 +1080,15 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", +] + [[package]] name = "http" version = "1.5.0" @@ -1506,7 +1624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" dependencies = [ "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.61.2", ] @@ -1598,6 +1716,15 @@ dependencies = [ "objc2-core-foundation", ] +[[package]] +name = "objc2-system-configuration" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" +dependencies = [ + "objc2-core-foundation", +] + [[package]] name = "object_store" version = "0.14.2" @@ -1799,6 +1926,25 @@ dependencies = [ "indexmap", ] +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_shared", + "serde", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + [[package]] name = "pid" version = "4.0.0" @@ -1855,6 +2001,35 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "postgres-protocol" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08808e3c483c46e999108051c78334f473d5adb59d78bb80a1268c7e6aa6c514" +dependencies = [ + "base64 0.22.1", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand 0.10.3", + "sha2 0.11.1", + "stringprep", +] + +[[package]] +name = "postgres-types" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "851ca9db4932932d69f3ea811b1abe63087a0f740a47692619dd40d4899b68be" +dependencies = [ + "bytes", + "fallible-iterator", + "postgres-protocol", +] + [[package]] name = "potential_utf" version = "0.1.6" @@ -2687,6 +2862,17 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha2" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d7069beb7d6ac7b9acd1039986e73443f24234f41074da099d6f994ac9ad19" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "digest 0.11.3", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -2783,12 +2969,33 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3" +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + [[package]] name = "strsim" version = "0.11.1" @@ -3089,13 +3296,14 @@ dependencies = [ [[package]] name = "temporalio-streams" version = "0.1.0" -source = "git+https://github.com/moetemp/sdk-streams?rev=74c98be7a47b287d1224f559095569778b0228d8#74c98be7a47b287d1224f559095569778b0228d8" +source = "git+https://github.com/moetemp/sdk-streams?rev=3187486707646024916d81036178e5088553445d#3187486707646024916d81036178e5088553445d" dependencies = [ "async-trait", "aws-lc-rs", "base64 0.23.1", "bytes", "crc16", + "deadpool-postgres", "futures-util", "gethostname", "lru", @@ -3104,13 +3312,17 @@ dependencies = [ "prost", "prost-wkt-types", "redis", + "rustls", + "rustls-native-certs", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "temporalio-client", "temporalio-common", "thiserror", "tokio", + "tokio-postgres", + "tokio-postgres-rustls", "tokio-util", "tonic", "tonic-prost-build", @@ -3168,6 +3380,27 @@ version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" +[[package]] +name = "tls_codec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de2e01245e2bb89d6f05801c564fa27624dbd7b1846859876c7dad82e90bf6b" +dependencies = [ + "tls_codec_derive", + "zeroize", +] + +[[package]] +name = "tls_codec_derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2e76690929402faae40aebdda620a2c0e25dd6d3b9afe48867dfd95991f4bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "tokio" version = "1.53.2" @@ -3196,6 +3429,46 @@ dependencies = [ "syn 3.0.6", ] +[[package]] +name = "tokio-postgres" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a528f7d280f6d5b9cd149635c8705b0dd049754bc67d81d31fa25169a93809d3" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand 0.10.3", + "socket2", + "tokio", + "tokio-util", + "whoami", +] + +[[package]] +name = "tokio-postgres-rustls" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2ad44aa0ae96db89c4742212ed41645b2f597311ff6e1945542a4d9fadc2fb" +dependencies = [ + "rustls", + "sha2 0.11.1", + "tokio", + "tokio-postgres", + "tokio-rustls", + "x509-cert", +] + [[package]] name = "tokio-rustls" version = "0.26.6" @@ -3518,12 +3791,33 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357cc3acc6a036009fd6c973ed009037c732d60d0b4f6c673e9041497482a28f" +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + [[package]] name = "unicode-ident" version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" +[[package]] +name = "unicode-normalization" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75cd3fb03d5288b3ba9a1ee103ac7e9cbb59f0b03d64f8ddfcc04dd42758a85d" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + [[package]] name = "unicode-segmentation" version = "1.13.3" @@ -3612,6 +3906,15 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + [[package]] name = "wasip2" version = "1.0.4+wasi-0.2.12" @@ -3621,6 +3924,15 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasite" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42" +dependencies = [ + "wasi 0.14.7+wasi-0.2.4", +] + [[package]] name = "wasm-bindgen" version = "0.2.129" @@ -3719,6 +4031,19 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "whoami" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626c4bac6755d76ffc12cb01b2eac751db1996b9e0041de9aa02c8c211ddc82c" +dependencies = [ + "libc", + "libredox", + "objc2-system-configuration", + "wasite", + "web-sys", +] + [[package]] name = "winapi" version = "0.3.9" @@ -3960,6 +4285,18 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" +[[package]] +name = "x509-cert" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" +dependencies = [ + "const-oid 0.9.6", + "der", + "spki", + "tls_codec", +] + [[package]] name = "xattr" version = "1.6.1" @@ -4045,6 +4382,20 @@ name = "zeroize" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] name = "zerotrie" diff --git a/temporalio/bridge/Cargo.toml b/temporalio/bridge/Cargo.toml index 469f0836a9..075d177513 100644 --- a/temporalio/bridge/Cargo.toml +++ b/temporalio/bridge/Cargo.toml @@ -91,9 +91,9 @@ url = "2.2" # makes it use the submodule's crates, so the bridge sees one `Connection` type. [dependencies.temporalio-streams] git = "https://github.com/moetemp/sdk-streams" -rev = "74c98be7a47b287d1224f559095569778b0228d8" +rev = "3187486707646024916d81036178e5088553445d" default-features = false -features = ["archive", "envconfig", "redis"] +features = ["archive", "envconfig", "postgres", "redis"] # The key must match the sdk-rust URL in the sdk-streams manifest byte for byte, or Cargo # ignores the patch with only a warning. diff --git a/temporalio/bridge/proto/streams/__init__.py b/temporalio/bridge/proto/streams/__init__.py index 3aebdf33f8..1b45580fd0 100644 --- a/temporalio/bridge/proto/streams/__init__.py +++ b/temporalio/bridge/proto/streams/__init__.py @@ -38,6 +38,7 @@ MemoryStoreConfig, NamedProducer, OutputRecord, + PostgresStoreConfig, PublishWorkflowTaskRequest, PublishWorkflowTaskResponse, ReadRangeRequest, @@ -122,6 +123,7 @@ "NexusResumeRequest", "NexusStep", "OutputRecord", + "PostgresStoreConfig", "PublishWorkflowTaskRequest", "PublishWorkflowTaskResponse", "ReadRangeRequest", diff --git a/temporalio/bridge/proto/streams/streams_pb2.py b/temporalio/bridge/proto/streams/streams_pb2.py index ff7b8bc2a6..7d8f04a466 100644 --- a/temporalio/bridge/proto/streams/streams_pb2.py +++ b/temporalio/bridge/proto/streams/streams_pb2.py @@ -32,7 +32,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\'temporal/sdk/core/streams/streams.proto\x12\x0f\x63oresdk.streams\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a%temporal/sdk/streams/v1/message.proto\x1a=temporal/api/workflowservice/v1/stream_request_response.proto"\xd3\x02\n\x11StreamStoreConfig\x12\x32\n\x05redis\x18\x01 \x01(\x0b\x32!.coresdk.streams.RedisStoreConfigH\x00\x12\x34\n\x06memory\x18\x02 \x01(\x0b\x32".coresdk.streams.MemoryStoreConfigH\x00\x12\x18\n\x10notify_on_append\x18\x03 \x01(\x08\x12\x15\n\rmax_notifiers\x18\x04 \x01(\r\x12\x34\n\x11owner_start_grace\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notification_log\x18\x07 \x01(\x08\x12/\n\x07\x61rchive\x18\x08 \x01(\x0b\x32\x1e.coresdk.streams.ArchiveConfigB\x07\n\x05storeJ\x04\x08\x05\x10\x06R\x13notify_every_append"\x94\x01\n\rArchiveConfig\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x15\n\rsegment_bytes\x18\x02 \x01(\x04\x12/\n\x0csegment_idle\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0bstall_limit\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration"\xda\x02\n\x10RedisStoreConfig\x12\x0c\n\x04urls\x18\x01 \x03(\t\x12\x0f\n\x07\x63luster\x18\x02 \x01(\x08\x12\x12\n\nkey_prefix\x18\x03 \x01(\t\x12,\n\tretention\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x1f\n\x17\x62locking_reads_per_node\x18\x05 \x01(\r\x12\x33\n\x10response_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0b\x66loor_lease\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x36\n\x13\x66loor_release_grace\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notify_doorbells\x18\t \x01(\r\x12\r\n\x05plain\x18\n \x01(\x08"M\n\x11MemoryStoreConfig\x12\x38\n\x0c\x63\x61pabilities\x18\x01 \x01(\x0b\x32".coresdk.streams.StoreCapabilities"\xa1\x01\n\rStreamAddress\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x34\n\nowner_kind\x18\x02 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\r\n\x05topic\x18\x05 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t"\x92\x01\n\x07\x43hainId\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_run_id\x18\x03 \x01(\t\x12\x34\n\nowner_kind\x18\x04 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0b\x61\x63tivity_id\x18\x05 \x01(\t"5\n\rNamedProducer\x12\x13\n\x0bproducer_id\x18\x01 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x02 \x01(\x03"\x97\x01\n\x10\x41\x63tivityProducer\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x38\n\x14\x61ttempt_started_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xbf\x01\n\x0c\x41ppendRecord\x12\x37\n\x04kind\x18\x01 \x01(\x0e\x32).temporal.sdk.streams.v1.StreamRecordKind\x12-\n\x04\x62ody\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x14\n\x0c\x63ontent_hash\x18\x03 \x01(\x0c\x12\x31\n\x04link\x18\x04 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink"\x85\x02\n\rAppendRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x05named\x18\x02 \x01(\x0b\x32\x1e.coresdk.streams.NamedProducerH\x00\x12\x35\n\x08\x61\x63tivity\x18\x03 \x01(\x0b\x32!.coresdk.streams.ActivityProducerH\x00\x12\x10\n\x08sequence\x18\x04 \x01(\x03\x12.\n\x07records\x18\x05 \x03(\x0b\x32\x1d.coresdk.streams.AppendRecord\x12\x0e\n\x06\x64igest\x18\x06 \x01(\x0c\x42\n\n\x08producer";\n\x0e\x41ppendResponse\x12\x14\n\x0c\x66irst_cursor\x18\x01 \x01(\t\x12\x13\n\x0blast_cursor\x18\x02 \x01(\t"\x82\x02\n\x0bReadRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\r\n\x05\x61\x66ter\x18\x02 \x01(\t\x12\'\n\x04wait\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x04 \x01(\r\x12\r\n\x05state\x18\x05 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x07 \x01(\t\x12\x33\n\nsubscriber\x18\x08 \x01(\x0b\x32\x1f.coresdk.streams.ReadSubscriber\x12\x11\n\tmax_bytes\x18\t \x01(\x04J\x04\x08\x06\x10\x07R\x03\x61rm"b\n\x0eReadSubscriber\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"]\n\x0cSupersession\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x13\n\x0bproducer_id\x18\x02 \x01(\t\x12\x18\n\x10previous_attempt\x18\x03 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x03"\xa3\x01\n\nReadRecord\x12\x0e\n\x06\x63ursor\x18\x01 \x01(\t\x12\x37\n\x06stored\x18\x02 \x01(\x0b\x32%.temporal.sdk.streams.v1.StreamRecordH\x00\x12\x33\n\nsuperseded\x18\x03 \x01(\x0b\x32\x1d.coresdk.streams.SupersessionH\x00\x12\r\n\x05stale\x18\x04 \x01(\x08\x42\x08\n\x06record"\xd7\x02\n\x0cReadResponse\x12,\n\x07records\x18\x01 \x03(\x0b\x32\x1b.coresdk.streams.ReadRecord\x12\x0e\n\x06\x63ursor\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x0c\x12\x0c\n\x04\x64one\x18\x04 \x01(\x08\x12\x12\n\nwake_after\x18\x06 \x01(\x03\x12\x35\n\x0c\x63lose_result\x18\x07 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x08 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\t \x01(\t\x12\x16\n\x0erecords_digest\x18\n \x01(\x0c\x12\x1a\n\x12\x63hain_first_run_id\x18\x0b \x01(\t\x12\x14\n\x0cstart_cursor\x18\x0c \x01(\tJ\x04\x08\x05\x10\x06R\x05\x61rmed"\xe6\x01\n\x10ReadRangeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\r\n\x05\x61\x66ter\x18\x03 \x01(\t\x12\n\n\x02to\x18\x04 \x01(\t\x12\x16\n\x0estored_records\x18\x05 \x01(\r\x12\r\n\x05state\x18\x06 \x01(\x0c\x12\x16\n\x0erecords_digest\x18\x07 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x08 \x01(\t\x12\x16\n\x0estart_from_end\x18\t \x01(\x08"w\n\x13ReleaseFloorRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66loor_holder\x18\x03 \x01(\t"\x16\n\x14ReleaseFloorResponse"\x8d\x02\n\rFollowRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\r\n\x05\x61\x66ter\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x0c\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x05 \x01(\r\x12\x11\n\tmax_depth\x18\x06 \x01(\r\x12\x10\n\x08max_open\x18\x07 \x01(\r\x12\x14\n\x0c\x66loor_holder\x18\x08 \x01(\t\x12\x35\n\nsubscriber\x18\t \x01(\x0b\x32!.coresdk.streams.FollowSubscriber"h\n\x10\x46ollowSubscriber\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1b\n\x13subscription_prefix\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"\x89\x01\n\x0e\x46ollowedRecord\x12\x0e\n\x06source\x18\x01 \x01(\r\x12-\n\x06record\x18\x02 \x01(\x0b\x32\x1b.coresdk.streams.ReadRecordH\x00\x12\x30\n\nlink_state\x18\x03 \x01(\x0b\x32\x1a.coresdk.streams.LinkStateH\x00\x42\x06\n\x04item"\x82\x03\n\tLinkState\x12-\n\x04kind\x18\x01 \x01(\x0e\x32\x1f.coresdk.streams.LinkState.Kind\x12\x31\n\x04link\x18\x02 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink\x12\x35\n\x0c\x63lose_result\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12-\n\x05\x65rror\x18\x05 \x01(\x0b\x32\x1e.coresdk.streams.StreamFailure\x12\x0e\n\x06reason\x18\x06 \x01(\t"d\n\x04Kind\x12\x14\n\x10KIND_UNSPECIFIED\x10\x00\x12\x0f\n\x0bKIND_OPENED\x10\x01\x12\r\n\tKIND_DONE\x10\x02\x12\x14\n\x10KIND_UNAVAILABLE\x10\x03\x12\x10\n\x0cKIND_SKIPPED\x10\x04"{\n\x0c\x46ollowSource\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x0e\n\x06parent\x18\x02 \x01(\r\x12\r\n\x05\x64\x65pth\x18\x03 \x01(\r\x12.\n\x06stream\x18\x04 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x0c\n\x04name\x18\x05 \x01(\t"\xe6\x02\n\x0bSourceRange\x12\x0e\n\x06source\x18\x01 \x01(\r\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_cursor\x18\x03 \x01(\t\x12\x0e\n\x06\x63ursor\x18\x04 \x01(\t\x12\x16\n\x0estored_records\x18\x05 \x01(\r\x12\x10\n\x08state_in\x18\x06 \x01(\x0c\x12\x16\n\x0erecords_digest\x18\x07 \x01(\x0c\x12\x16\n\x0estart_from_end\x18\x08 \x01(\x08\x12\x0c\n\x04\x64one\x18\t \x01(\x08\x12\x35\n\x0c\x63lose_result\x18\n \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12-\n\x05\x65rror\x18\x0c \x01(\x0b\x32\x1e.coresdk.streams.StreamFailure"I\n\nSourceWake\x12\x0e\n\x06source\x18\x01 \x01(\r\x12\x17\n\x0fsubscription_id\x18\x02 \x01(\t\x12\x12\n\nwake_after\x18\x03 \x01(\x03"\xf0\x02\n\x0e\x46ollowResponse\x12\x30\n\x07records\x18\x01 \x03(\x0b\x32\x1f.coresdk.streams.FollowedRecord\x12\r\n\x05state\x18\x02 \x01(\x0c\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12.\n\x07sources\x18\x04 \x03(\x0b\x32\x1d.coresdk.streams.FollowSource\x12,\n\x06ranges\x18\x05 \x03(\x0b\x32\x1c.coresdk.streams.SourceRange\x12*\n\x05wakes\x18\x06 \x03(\x0b\x32\x1b.coresdk.streams.SourceWake\x12\x35\n\x0c\x63lose_result\x18\x07 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x08 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x15\n\rfollow_digest\x18\t \x01(\x0c"\xd6\x01\n\x12\x46ollowRangeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x10\n\x08state_in\x18\x02 \x01(\x0c\x12,\n\x06ranges\x18\x03 \x03(\x0b\x32\x1c.coresdk.streams.SourceRange\x12\x15\n\rfollow_digest\x18\x04 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x05 \x01(\t\x12\x11\n\tmax_depth\x18\x06 \x01(\r\x12\x10\n\x08max_open\x18\x07 \x01(\r"?\n\rLatestRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress" \n\x0eLatestResponse\x12\x0e\n\x06\x63ursor\x18\x01 \x01(\t"\xb5\x01\n\x0c\x43loseRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\x04 \x01(\t"\x84\x01\n\x0bStoredClose\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\x03 \x01(\t"\x0f\n\rCloseResponse"\x1b\n\x19\x46lushNotificationsRequest"\x1c\n\x1a\x46lushNotificationsResponse"\x94\x01\n\x10SubscribeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x04 \x01(\t\x12\x12\n\ngeneration\x18\x05 \x01(\r"Y\n\x11SubscribeResponse\x12\x1a\n\x12\x63hain_first_run_id\x18\x01 \x01(\t\x12\x10\n\x08\x61ttached\x18\x02 \x01(\x08\x12\x16\n\x0enewest_counter\x18\x03 \x01(\x03"\x81\x01\n\x12UnsubscribeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"\x15\n\x13UnsubscribeResponse"c\n\x1aWaitForNotificationRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x15\n\rafter_counter\x18\x02 \x01(\x03"\xd3\x01\n\x1bWaitForNotificationResponse\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x03\x12\x10\n\x08position\x18\x02 \x01(\t\x12\x11\n\ttimed_out\x18\x03 \x01(\x08\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_result\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x06 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x9b\x01\n\x16RunStreamDriverRequest\x12\x10\n\x08\x63onsumer\x18\x01 \x01(\t\x12\x31\n\x0esweep_interval\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12-\n\nclaim_idle\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\r\n\x05\x62\x61tch\x18\x04 \x01(\r"\x19\n\x17RunStreamDriverResponse"\x87\x01\n\x12\x44\x65leteOwnerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x34\n\nowner_kind\x18\x02 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t"&\n\x13\x44\x65leteOwnerResponse\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x04"\xbb\x01\n\x15RetireProducerRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x05named\x18\x02 \x01(\x0b\x32\x1e.coresdk.streams.NamedProducerH\x00\x12\x35\n\x08\x61\x63tivity\x18\x03 \x01(\x0b\x32!.coresdk.streams.ActivityProducerH\x00\x42\n\n\x08producer"\x18\n\x16RetireProducerResponse"\x16\n\x14\x44\x65scribeStoreRequest"_\n\x15\x44\x65scribeStoreResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32".coresdk.streams.StoreCapabilities"\xc1\x02\n\x11StoreCapabilities\x12\x16\n\x0eproducer_state\x18\x01 \x01(\x08\x12\x11\n\tkept_last\x18\x04 \x01(\x08\x12\r\n\x05holds\x18\x05 \x01(\x08\x12\x13\n\x0b\x63hange_feed\x18\x06 \x01(\x08\x12\x12\n\ncheap_logs\x18\x07 \x01(\x08\x12\x14\n\x0c\x64\x65lete_owner\x18\x08 \x01(\x08\x12\x15\n\rtopic_listing\x18\t \x01(\x08\x12\x11\n\tlong_poll\x18\n \x01(\x08\x12\x17\n\x0f\x64\x65nse_positions\x18\x0b \x01(\x08\x12\x31\n\x0ereplay_horizon\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10max_record_bytes\x18\r \x01(\x04\x12\x17\n\x0fmax_batch_bytes\x18\x0e \x01(\x04J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"u\n\rStreamFailure\x12\x30\n\x04kind\x18\x01 \x01(\x0e\x32".coresdk.streams.StreamFailureKind\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0e\n\x06\x63ursor\x18\x03 \x01(\t\x12\x11\n\tclosed_by\x18\x04 \x01(\t"\xa5\x01\n\x12StoreAppendRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x03\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x0e\n\x06\x64igest\x18\x06 \x01(\x0c\x12\x0f\n\x07records\x18\x07 \x03(\x0c"O\n\x13StoreAppendResponse\x12\x16\n\x0e\x66irst_position\x18\x01 \x01(\t\x12\x15\n\rlast_position\x18\x02 \x01(\tJ\x04\x08\x03\x10\x04R\x03\x61rm"\xab\x01\n\x10StoreReadRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t\x12\x16\n\x0e\x61\x66ter_position\x18\x03 \x01(\t\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x05 \x01(\rJ\x04\x08\x06\x10\x07R\x03\x61rm"0\n\x0cStoredRecord\x12\x10\n\x08position\x18\x01 \x01(\t\x12\x0e\n\x06record\x18\x02 \x01(\x0c"\x8d\x01\n\x11StoreReadResponse\x12.\n\x07records\x18\x01 \x03(\x0b\x32\x1d.coresdk.streams.StoredRecord\x12\x0e\n\x06\x63losed\x18\x02 \x01(\x08\x12+\n\x05\x63lose\x18\x04 \x01(\x0b\x32\x1c.coresdk.streams.StoredCloseJ\x04\x08\x03\x10\x04R\x05\x61rmed"L\n\x12StoreLatestRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t"\'\n\x13StoreLatestResponse\x12\x10\n\x08position\x18\x01 \x01(\t"\xf6\x03\n\x1aPublishWorkflowTaskRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x05 \x01(\t\x12\x0e\n\x06run_id\x18\x06 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x07 \x01(\t\x12\x0c\n\x04\x63ron\x18\x08 \x01(\x08\x12\x18\n\x10has_retry_policy\x18\t \x01(\x08\x12\x1d\n\x15task_started_event_id\x18\n \x01(\x03\x12\x17\n\x0f\x66\x61iled_attempts\x18\x0b \x01(\r\x12#\n\x1b\x63ompleted_started_event_ids\x18\x0c \x03(\x03\x12.\n\x07records\x18\r \x03(\x0b\x32\x1d.coresdk.streams.OutputRecord\x12\x42\n\x10terminal_command\x18\x0e \x01(\x0e\x32(.coresdk.streams.WorkflowTerminalCommand\x12I\n\x19resolved_owner_activities\x18\x0f \x03(\x0b\x32&.coresdk.streams.ResolvedOwnerActivity"\x9a\x01\n\x15ResolvedOwnerActivity\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12\x39\n\x07outcome\x18\x02 \x01(\x0e\x32(.coresdk.streams.ResolvedActivityOutcome\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x01\n\x0cOutputRecord\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x37\n\x04kind\x18\x02 \x01(\x0e\x32).temporal.sdk.streams.v1.StreamRecordKind\x12-\n\x04\x62ody\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x31\n\x04link\x18\x05 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink"5\n\x1bPublishWorkflowTaskResponse\x12\x16\n\x0e\x64ropped_topics\x18\x01 \x03(\t"Y\n\x11RunEvictedRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12!\n\x19workflow_execution_ending\x18\x03 \x01(\x08"\x14\n\x12RunEvictedResponse"*\n\x15ShutdownWorkerRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t"\x18\n\x16ShutdownWorkerResponse*\x9d\x01\n\x0fStreamOwnerKind\x12!\n\x1dSTREAM_OWNER_KIND_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSTREAM_OWNER_KIND_WORKFLOW\x10\x01\x12\x1e\n\x1aSTREAM_OWNER_KIND_ACTIVITY\x10\x02\x12\'\n#STREAM_OWNER_KIND_WORKFLOW_ACTIVITY\x10\x03*\xbe\x04\n\x11StreamFailureKind\x12#\n\x1fSTREAM_FAILURE_KIND_UNSPECIFIED\x10\x00\x12*\n&STREAM_FAILURE_KIND_PRODUCER_DIVERGENT\x10\x01\x12&\n"STREAM_FAILURE_KIND_PRODUCER_STALE\x10\x02\x12\'\n#STREAM_FAILURE_KIND_OUTCOME_UNKNOWN\x10\x03\x12\x1f\n\x1bSTREAM_FAILURE_KIND_REFUSED\x10\x04\x12\x1e\n\x1aSTREAM_FAILURE_KIND_CLOSED\x10\x05\x12\x1e\n\x1aSTREAM_FAILURE_KIND_CURSOR\x10\x06\x12\x1f\n\x1bSTREAM_FAILURE_KIND_EXPIRED\x10\x07\x12!\n\x1dSTREAM_FAILURE_KIND_NOT_FOUND\x10\x08\x12\x1e\n\x1aSTREAM_FAILURE_KIND_RECORD\x10\t\x12\x1f\n\x1bSTREAM_FAILURE_KIND_STORAGE\x10\n\x12#\n\x1fSTREAM_FAILURE_KIND_UNSUPPORTED\x10\x0b\x12(\n$STREAM_FAILURE_KIND_INVALID_ARGUMENT\x10\x0c\x12\'\n#STREAM_FAILURE_KIND_REPLAY_MISMATCH\x10\r\x12)\n%STREAM_FAILURE_KIND_REPLAY_RANGE_LOST\x10\x0e*\xbc\x01\n\x17ResolvedActivityOutcome\x12)\n%RESOLVED_ACTIVITY_OUTCOME_UNSPECIFIED\x10\x00\x12\'\n#RESOLVED_ACTIVITY_OUTCOME_COMPLETED\x10\x01\x12$\n RESOLVED_ACTIVITY_OUTCOME_FAILED\x10\x02\x12\'\n#RESOLVED_ACTIVITY_OUTCOME_CANCELLED\x10\x03*\xe5\x01\n\x17WorkflowTerminalCommand\x12)\n%WORKFLOW_TERMINAL_COMMAND_UNSPECIFIED\x10\x00\x12&\n"WORKFLOW_TERMINAL_COMMAND_COMPLETE\x10\x01\x12"\n\x1eWORKFLOW_TERMINAL_COMMAND_FAIL\x10\x02\x12$\n WORKFLOW_TERMINAL_COMMAND_CANCEL\x10\x03\x12-\n)WORKFLOW_TERMINAL_COMMAND_CONTINUE_AS_NEW\x10\x04\x32\xd8\x0e\n\rStreamService\x12I\n\x06\x41ppend\x12\x1e.coresdk.streams.AppendRequest\x1a\x1f.coresdk.streams.AppendResponse\x12\x43\n\x04Read\x12\x1c.coresdk.streams.ReadRequest\x1a\x1d.coresdk.streams.ReadResponse\x12I\n\x06Latest\x12\x1e.coresdk.streams.LatestRequest\x1a\x1f.coresdk.streams.LatestResponse\x12\x46\n\x05\x43lose\x12\x1d.coresdk.streams.CloseRequest\x1a\x1e.coresdk.streams.CloseResponse\x12X\n\x0b\x44\x65leteOwner\x12#.coresdk.streams.DeleteOwnerRequest\x1a$.coresdk.streams.DeleteOwnerResponse\x12\x61\n\x0eRetireProducer\x12&.coresdk.streams.RetireProducerRequest\x1a\'.coresdk.streams.RetireProducerResponse\x12m\n\x12\x46lushNotifications\x12*.coresdk.streams.FlushNotificationsRequest\x1a+.coresdk.streams.FlushNotificationsResponse\x12R\n\tSubscribe\x12!.coresdk.streams.SubscribeRequest\x1a".coresdk.streams.SubscribeResponse\x12X\n\x0bUnsubscribe\x12#.coresdk.streams.UnsubscribeRequest\x1a$.coresdk.streams.UnsubscribeResponse\x12p\n\x13WaitForNotification\x12+.coresdk.streams.WaitForNotificationRequest\x1a,.coresdk.streams.WaitForNotificationResponse\x12\x99\x01\n\x16\x44\x65scribeStreamNotifier\x12>.temporal.api.workflowservice.v1.DescribeStreamNotifierRequest\x1a?.temporal.api.workflowservice.v1.DescribeStreamNotifierResponse\x12\x64\n\x0fRunStreamDriver\x12\'.coresdk.streams.RunStreamDriverRequest\x1a(.coresdk.streams.RunStreamDriverResponse\x12M\n\tReadRange\x12!.coresdk.streams.ReadRangeRequest\x1a\x1d.coresdk.streams.ReadResponse\x12[\n\x0cReleaseFloor\x12$.coresdk.streams.ReleaseFloorRequest\x1a%.coresdk.streams.ReleaseFloorResponse\x12I\n\x06\x46ollow\x12\x1e.coresdk.streams.FollowRequest\x1a\x1f.coresdk.streams.FollowResponse\x12S\n\x0b\x46ollowRange\x12#.coresdk.streams.FollowRangeRequest\x1a\x1f.coresdk.streams.FollowResponse\x12^\n\rDescribeStore\x12%.coresdk.streams.DescribeStoreRequest\x1a&.coresdk.streams.DescribeStoreResponse\x12p\n\x13PublishWorkflowTask\x12+.coresdk.streams.PublishWorkflowTaskRequest\x1a,.coresdk.streams.PublishWorkflowTaskResponse\x12U\n\nRunEvicted\x12".coresdk.streams.RunEvictedRequest\x1a#.coresdk.streams.RunEvictedResponse\x12\x61\n\x0eShutdownWorker\x12&.coresdk.streams.ShutdownWorkerRequest\x1a\'.coresdk.streams.ShutdownWorkerResponseB-\xea\x02*Temporalio::Internal::Bridge::Api::Streamsb\x06proto3' + b'\n\'temporal/sdk/core/streams/streams.proto\x12\x0f\x63oresdk.streams\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a%temporal/sdk/streams/v1/message.proto\x1a=temporal/api/workflowservice/v1/stream_request_response.proto"\x8d\x03\n\x11StreamStoreConfig\x12\x32\n\x05redis\x18\x01 \x01(\x0b\x32!.coresdk.streams.RedisStoreConfigH\x00\x12\x34\n\x06memory\x18\x02 \x01(\x0b\x32".coresdk.streams.MemoryStoreConfigH\x00\x12\x38\n\x08postgres\x18\t \x01(\x0b\x32$.coresdk.streams.PostgresStoreConfigH\x00\x12\x18\n\x10notify_on_append\x18\x03 \x01(\x08\x12\x15\n\rmax_notifiers\x18\x04 \x01(\r\x12\x34\n\x11owner_start_grace\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notification_log\x18\x07 \x01(\x08\x12/\n\x07\x61rchive\x18\x08 \x01(\x0b\x32\x1e.coresdk.streams.ArchiveConfigB\x07\n\x05storeJ\x04\x08\x05\x10\x06R\x13notify_every_append"\x94\x01\n\rArchiveConfig\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x15\n\rsegment_bytes\x18\x02 \x01(\x04\x12/\n\x0csegment_idle\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0bstall_limit\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration"\xda\x02\n\x10RedisStoreConfig\x12\x0c\n\x04urls\x18\x01 \x03(\t\x12\x0f\n\x07\x63luster\x18\x02 \x01(\x08\x12\x12\n\nkey_prefix\x18\x03 \x01(\t\x12,\n\tretention\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x1f\n\x17\x62locking_reads_per_node\x18\x05 \x01(\r\x12\x33\n\x10response_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0b\x66loor_lease\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x36\n\x13\x66loor_release_grace\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notify_doorbells\x18\t \x01(\r\x12\r\n\x05plain\x18\n \x01(\x08"\xda\x03\n\x13PostgresStoreConfig\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12,\n\tretention\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x17\n\x0fmax_connections\x18\x04 \x01(\r\x12\x33\n\x10response_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0b\x66loor_lease\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x36\n\x13\x66loor_release_grace\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notify_doorbells\x18\x08 \x01(\r\x12\x12\n\nlisten_url\x18\t \x01(\t\x12\x30\n\rpoll_interval\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x14\n\x0cnotify_reads\x18\x0b \x01(\x08\x12\x17\n\x0fskip_migrations\x18\x0c \x01(\x08\x12\x33\n\x10janitor_interval\x18\r \x01(\x0b\x32\x19.google.protobuf.Duration"M\n\x11MemoryStoreConfig\x12\x38\n\x0c\x63\x61pabilities\x18\x01 \x01(\x0b\x32".coresdk.streams.StoreCapabilities"\xa1\x01\n\rStreamAddress\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x34\n\nowner_kind\x18\x02 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\r\n\x05topic\x18\x05 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t"\x92\x01\n\x07\x43hainId\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_run_id\x18\x03 \x01(\t\x12\x34\n\nowner_kind\x18\x04 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0b\x61\x63tivity_id\x18\x05 \x01(\t"5\n\rNamedProducer\x12\x13\n\x0bproducer_id\x18\x01 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x02 \x01(\x03"\x97\x01\n\x10\x41\x63tivityProducer\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x38\n\x14\x61ttempt_started_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xbf\x01\n\x0c\x41ppendRecord\x12\x37\n\x04kind\x18\x01 \x01(\x0e\x32).temporal.sdk.streams.v1.StreamRecordKind\x12-\n\x04\x62ody\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x14\n\x0c\x63ontent_hash\x18\x03 \x01(\x0c\x12\x31\n\x04link\x18\x04 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink"\x85\x02\n\rAppendRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x05named\x18\x02 \x01(\x0b\x32\x1e.coresdk.streams.NamedProducerH\x00\x12\x35\n\x08\x61\x63tivity\x18\x03 \x01(\x0b\x32!.coresdk.streams.ActivityProducerH\x00\x12\x10\n\x08sequence\x18\x04 \x01(\x03\x12.\n\x07records\x18\x05 \x03(\x0b\x32\x1d.coresdk.streams.AppendRecord\x12\x0e\n\x06\x64igest\x18\x06 \x01(\x0c\x42\n\n\x08producer";\n\x0e\x41ppendResponse\x12\x14\n\x0c\x66irst_cursor\x18\x01 \x01(\t\x12\x13\n\x0blast_cursor\x18\x02 \x01(\t"\x82\x02\n\x0bReadRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\r\n\x05\x61\x66ter\x18\x02 \x01(\t\x12\'\n\x04wait\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x04 \x01(\r\x12\r\n\x05state\x18\x05 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x07 \x01(\t\x12\x33\n\nsubscriber\x18\x08 \x01(\x0b\x32\x1f.coresdk.streams.ReadSubscriber\x12\x11\n\tmax_bytes\x18\t \x01(\x04J\x04\x08\x06\x10\x07R\x03\x61rm"b\n\x0eReadSubscriber\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"]\n\x0cSupersession\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x13\n\x0bproducer_id\x18\x02 \x01(\t\x12\x18\n\x10previous_attempt\x18\x03 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x03"\xa3\x01\n\nReadRecord\x12\x0e\n\x06\x63ursor\x18\x01 \x01(\t\x12\x37\n\x06stored\x18\x02 \x01(\x0b\x32%.temporal.sdk.streams.v1.StreamRecordH\x00\x12\x33\n\nsuperseded\x18\x03 \x01(\x0b\x32\x1d.coresdk.streams.SupersessionH\x00\x12\r\n\x05stale\x18\x04 \x01(\x08\x42\x08\n\x06record"\xd7\x02\n\x0cReadResponse\x12,\n\x07records\x18\x01 \x03(\x0b\x32\x1b.coresdk.streams.ReadRecord\x12\x0e\n\x06\x63ursor\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x0c\x12\x0c\n\x04\x64one\x18\x04 \x01(\x08\x12\x12\n\nwake_after\x18\x06 \x01(\x03\x12\x35\n\x0c\x63lose_result\x18\x07 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x08 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\t \x01(\t\x12\x16\n\x0erecords_digest\x18\n \x01(\x0c\x12\x1a\n\x12\x63hain_first_run_id\x18\x0b \x01(\t\x12\x14\n\x0cstart_cursor\x18\x0c \x01(\tJ\x04\x08\x05\x10\x06R\x05\x61rmed"\xe6\x01\n\x10ReadRangeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\r\n\x05\x61\x66ter\x18\x03 \x01(\t\x12\n\n\x02to\x18\x04 \x01(\t\x12\x16\n\x0estored_records\x18\x05 \x01(\r\x12\r\n\x05state\x18\x06 \x01(\x0c\x12\x16\n\x0erecords_digest\x18\x07 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x08 \x01(\t\x12\x16\n\x0estart_from_end\x18\t \x01(\x08"w\n\x13ReleaseFloorRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66loor_holder\x18\x03 \x01(\t"\x16\n\x14ReleaseFloorResponse"\x8d\x02\n\rFollowRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\r\n\x05\x61\x66ter\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x0c\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x05 \x01(\r\x12\x11\n\tmax_depth\x18\x06 \x01(\r\x12\x10\n\x08max_open\x18\x07 \x01(\r\x12\x14\n\x0c\x66loor_holder\x18\x08 \x01(\t\x12\x35\n\nsubscriber\x18\t \x01(\x0b\x32!.coresdk.streams.FollowSubscriber"h\n\x10\x46ollowSubscriber\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1b\n\x13subscription_prefix\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"\x89\x01\n\x0e\x46ollowedRecord\x12\x0e\n\x06source\x18\x01 \x01(\r\x12-\n\x06record\x18\x02 \x01(\x0b\x32\x1b.coresdk.streams.ReadRecordH\x00\x12\x30\n\nlink_state\x18\x03 \x01(\x0b\x32\x1a.coresdk.streams.LinkStateH\x00\x42\x06\n\x04item"\x82\x03\n\tLinkState\x12-\n\x04kind\x18\x01 \x01(\x0e\x32\x1f.coresdk.streams.LinkState.Kind\x12\x31\n\x04link\x18\x02 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink\x12\x35\n\x0c\x63lose_result\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12-\n\x05\x65rror\x18\x05 \x01(\x0b\x32\x1e.coresdk.streams.StreamFailure\x12\x0e\n\x06reason\x18\x06 \x01(\t"d\n\x04Kind\x12\x14\n\x10KIND_UNSPECIFIED\x10\x00\x12\x0f\n\x0bKIND_OPENED\x10\x01\x12\r\n\tKIND_DONE\x10\x02\x12\x14\n\x10KIND_UNAVAILABLE\x10\x03\x12\x10\n\x0cKIND_SKIPPED\x10\x04"{\n\x0c\x46ollowSource\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x0e\n\x06parent\x18\x02 \x01(\r\x12\r\n\x05\x64\x65pth\x18\x03 \x01(\r\x12.\n\x06stream\x18\x04 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x0c\n\x04name\x18\x05 \x01(\t"\xe6\x02\n\x0bSourceRange\x12\x0e\n\x06source\x18\x01 \x01(\r\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_cursor\x18\x03 \x01(\t\x12\x0e\n\x06\x63ursor\x18\x04 \x01(\t\x12\x16\n\x0estored_records\x18\x05 \x01(\r\x12\x10\n\x08state_in\x18\x06 \x01(\x0c\x12\x16\n\x0erecords_digest\x18\x07 \x01(\x0c\x12\x16\n\x0estart_from_end\x18\x08 \x01(\x08\x12\x0c\n\x04\x64one\x18\t \x01(\x08\x12\x35\n\x0c\x63lose_result\x18\n \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12-\n\x05\x65rror\x18\x0c \x01(\x0b\x32\x1e.coresdk.streams.StreamFailure"I\n\nSourceWake\x12\x0e\n\x06source\x18\x01 \x01(\r\x12\x17\n\x0fsubscription_id\x18\x02 \x01(\t\x12\x12\n\nwake_after\x18\x03 \x01(\x03"\xf0\x02\n\x0e\x46ollowResponse\x12\x30\n\x07records\x18\x01 \x03(\x0b\x32\x1f.coresdk.streams.FollowedRecord\x12\r\n\x05state\x18\x02 \x01(\x0c\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12.\n\x07sources\x18\x04 \x03(\x0b\x32\x1d.coresdk.streams.FollowSource\x12,\n\x06ranges\x18\x05 \x03(\x0b\x32\x1c.coresdk.streams.SourceRange\x12*\n\x05wakes\x18\x06 \x03(\x0b\x32\x1b.coresdk.streams.SourceWake\x12\x35\n\x0c\x63lose_result\x18\x07 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x08 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x15\n\rfollow_digest\x18\t \x01(\x0c"\xd6\x01\n\x12\x46ollowRangeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x10\n\x08state_in\x18\x02 \x01(\x0c\x12,\n\x06ranges\x18\x03 \x03(\x0b\x32\x1c.coresdk.streams.SourceRange\x12\x15\n\rfollow_digest\x18\x04 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x05 \x01(\t\x12\x11\n\tmax_depth\x18\x06 \x01(\r\x12\x10\n\x08max_open\x18\x07 \x01(\r"?\n\rLatestRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress" \n\x0eLatestResponse\x12\x0e\n\x06\x63ursor\x18\x01 \x01(\t"\xb5\x01\n\x0c\x43loseRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\x04 \x01(\t"\x84\x01\n\x0bStoredClose\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\x03 \x01(\t"\x0f\n\rCloseResponse"\x1b\n\x19\x46lushNotificationsRequest"\x1c\n\x1a\x46lushNotificationsResponse"\x94\x01\n\x10SubscribeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x04 \x01(\t\x12\x12\n\ngeneration\x18\x05 \x01(\r"Y\n\x11SubscribeResponse\x12\x1a\n\x12\x63hain_first_run_id\x18\x01 \x01(\t\x12\x10\n\x08\x61ttached\x18\x02 \x01(\x08\x12\x16\n\x0enewest_counter\x18\x03 \x01(\x03"\x81\x01\n\x12UnsubscribeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"\x15\n\x13UnsubscribeResponse"c\n\x1aWaitForNotificationRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x15\n\rafter_counter\x18\x02 \x01(\x03"\xd3\x01\n\x1bWaitForNotificationResponse\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x03\x12\x10\n\x08position\x18\x02 \x01(\t\x12\x11\n\ttimed_out\x18\x03 \x01(\x08\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_result\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x06 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x9b\x01\n\x16RunStreamDriverRequest\x12\x10\n\x08\x63onsumer\x18\x01 \x01(\t\x12\x31\n\x0esweep_interval\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12-\n\nclaim_idle\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\r\n\x05\x62\x61tch\x18\x04 \x01(\r"\x19\n\x17RunStreamDriverResponse"\x87\x01\n\x12\x44\x65leteOwnerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x34\n\nowner_kind\x18\x02 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t"&\n\x13\x44\x65leteOwnerResponse\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x04"\xbb\x01\n\x15RetireProducerRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x05named\x18\x02 \x01(\x0b\x32\x1e.coresdk.streams.NamedProducerH\x00\x12\x35\n\x08\x61\x63tivity\x18\x03 \x01(\x0b\x32!.coresdk.streams.ActivityProducerH\x00\x42\n\n\x08producer"\x18\n\x16RetireProducerResponse"\x16\n\x14\x44\x65scribeStoreRequest"_\n\x15\x44\x65scribeStoreResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32".coresdk.streams.StoreCapabilities"\xc1\x02\n\x11StoreCapabilities\x12\x16\n\x0eproducer_state\x18\x01 \x01(\x08\x12\x11\n\tkept_last\x18\x04 \x01(\x08\x12\r\n\x05holds\x18\x05 \x01(\x08\x12\x13\n\x0b\x63hange_feed\x18\x06 \x01(\x08\x12\x12\n\ncheap_logs\x18\x07 \x01(\x08\x12\x14\n\x0c\x64\x65lete_owner\x18\x08 \x01(\x08\x12\x15\n\rtopic_listing\x18\t \x01(\x08\x12\x11\n\tlong_poll\x18\n \x01(\x08\x12\x17\n\x0f\x64\x65nse_positions\x18\x0b \x01(\x08\x12\x31\n\x0ereplay_horizon\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10max_record_bytes\x18\r \x01(\x04\x12\x17\n\x0fmax_batch_bytes\x18\x0e \x01(\x04J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"u\n\rStreamFailure\x12\x30\n\x04kind\x18\x01 \x01(\x0e\x32".coresdk.streams.StreamFailureKind\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0e\n\x06\x63ursor\x18\x03 \x01(\t\x12\x11\n\tclosed_by\x18\x04 \x01(\t"\xa5\x01\n\x12StoreAppendRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x03\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x0e\n\x06\x64igest\x18\x06 \x01(\x0c\x12\x0f\n\x07records\x18\x07 \x03(\x0c"O\n\x13StoreAppendResponse\x12\x16\n\x0e\x66irst_position\x18\x01 \x01(\t\x12\x15\n\rlast_position\x18\x02 \x01(\tJ\x04\x08\x03\x10\x04R\x03\x61rm"\xab\x01\n\x10StoreReadRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t\x12\x16\n\x0e\x61\x66ter_position\x18\x03 \x01(\t\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x05 \x01(\rJ\x04\x08\x06\x10\x07R\x03\x61rm"0\n\x0cStoredRecord\x12\x10\n\x08position\x18\x01 \x01(\t\x12\x0e\n\x06record\x18\x02 \x01(\x0c"\x8d\x01\n\x11StoreReadResponse\x12.\n\x07records\x18\x01 \x03(\x0b\x32\x1d.coresdk.streams.StoredRecord\x12\x0e\n\x06\x63losed\x18\x02 \x01(\x08\x12+\n\x05\x63lose\x18\x04 \x01(\x0b\x32\x1c.coresdk.streams.StoredCloseJ\x04\x08\x03\x10\x04R\x05\x61rmed"L\n\x12StoreLatestRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t"\'\n\x13StoreLatestResponse\x12\x10\n\x08position\x18\x01 \x01(\t"\xf6\x03\n\x1aPublishWorkflowTaskRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x05 \x01(\t\x12\x0e\n\x06run_id\x18\x06 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x07 \x01(\t\x12\x0c\n\x04\x63ron\x18\x08 \x01(\x08\x12\x18\n\x10has_retry_policy\x18\t \x01(\x08\x12\x1d\n\x15task_started_event_id\x18\n \x01(\x03\x12\x17\n\x0f\x66\x61iled_attempts\x18\x0b \x01(\r\x12#\n\x1b\x63ompleted_started_event_ids\x18\x0c \x03(\x03\x12.\n\x07records\x18\r \x03(\x0b\x32\x1d.coresdk.streams.OutputRecord\x12\x42\n\x10terminal_command\x18\x0e \x01(\x0e\x32(.coresdk.streams.WorkflowTerminalCommand\x12I\n\x19resolved_owner_activities\x18\x0f \x03(\x0b\x32&.coresdk.streams.ResolvedOwnerActivity"\x9a\x01\n\x15ResolvedOwnerActivity\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12\x39\n\x07outcome\x18\x02 \x01(\x0e\x32(.coresdk.streams.ResolvedActivityOutcome\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x01\n\x0cOutputRecord\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x37\n\x04kind\x18\x02 \x01(\x0e\x32).temporal.sdk.streams.v1.StreamRecordKind\x12-\n\x04\x62ody\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x31\n\x04link\x18\x05 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink"5\n\x1bPublishWorkflowTaskResponse\x12\x16\n\x0e\x64ropped_topics\x18\x01 \x03(\t"Y\n\x11RunEvictedRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12!\n\x19workflow_execution_ending\x18\x03 \x01(\x08"\x14\n\x12RunEvictedResponse"*\n\x15ShutdownWorkerRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t"\x18\n\x16ShutdownWorkerResponse*\x9d\x01\n\x0fStreamOwnerKind\x12!\n\x1dSTREAM_OWNER_KIND_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSTREAM_OWNER_KIND_WORKFLOW\x10\x01\x12\x1e\n\x1aSTREAM_OWNER_KIND_ACTIVITY\x10\x02\x12\'\n#STREAM_OWNER_KIND_WORKFLOW_ACTIVITY\x10\x03*\xbe\x04\n\x11StreamFailureKind\x12#\n\x1fSTREAM_FAILURE_KIND_UNSPECIFIED\x10\x00\x12*\n&STREAM_FAILURE_KIND_PRODUCER_DIVERGENT\x10\x01\x12&\n"STREAM_FAILURE_KIND_PRODUCER_STALE\x10\x02\x12\'\n#STREAM_FAILURE_KIND_OUTCOME_UNKNOWN\x10\x03\x12\x1f\n\x1bSTREAM_FAILURE_KIND_REFUSED\x10\x04\x12\x1e\n\x1aSTREAM_FAILURE_KIND_CLOSED\x10\x05\x12\x1e\n\x1aSTREAM_FAILURE_KIND_CURSOR\x10\x06\x12\x1f\n\x1bSTREAM_FAILURE_KIND_EXPIRED\x10\x07\x12!\n\x1dSTREAM_FAILURE_KIND_NOT_FOUND\x10\x08\x12\x1e\n\x1aSTREAM_FAILURE_KIND_RECORD\x10\t\x12\x1f\n\x1bSTREAM_FAILURE_KIND_STORAGE\x10\n\x12#\n\x1fSTREAM_FAILURE_KIND_UNSUPPORTED\x10\x0b\x12(\n$STREAM_FAILURE_KIND_INVALID_ARGUMENT\x10\x0c\x12\'\n#STREAM_FAILURE_KIND_REPLAY_MISMATCH\x10\r\x12)\n%STREAM_FAILURE_KIND_REPLAY_RANGE_LOST\x10\x0e*\xbc\x01\n\x17ResolvedActivityOutcome\x12)\n%RESOLVED_ACTIVITY_OUTCOME_UNSPECIFIED\x10\x00\x12\'\n#RESOLVED_ACTIVITY_OUTCOME_COMPLETED\x10\x01\x12$\n RESOLVED_ACTIVITY_OUTCOME_FAILED\x10\x02\x12\'\n#RESOLVED_ACTIVITY_OUTCOME_CANCELLED\x10\x03*\xe5\x01\n\x17WorkflowTerminalCommand\x12)\n%WORKFLOW_TERMINAL_COMMAND_UNSPECIFIED\x10\x00\x12&\n"WORKFLOW_TERMINAL_COMMAND_COMPLETE\x10\x01\x12"\n\x1eWORKFLOW_TERMINAL_COMMAND_FAIL\x10\x02\x12$\n WORKFLOW_TERMINAL_COMMAND_CANCEL\x10\x03\x12-\n)WORKFLOW_TERMINAL_COMMAND_CONTINUE_AS_NEW\x10\x04\x32\xd8\x0e\n\rStreamService\x12I\n\x06\x41ppend\x12\x1e.coresdk.streams.AppendRequest\x1a\x1f.coresdk.streams.AppendResponse\x12\x43\n\x04Read\x12\x1c.coresdk.streams.ReadRequest\x1a\x1d.coresdk.streams.ReadResponse\x12I\n\x06Latest\x12\x1e.coresdk.streams.LatestRequest\x1a\x1f.coresdk.streams.LatestResponse\x12\x46\n\x05\x43lose\x12\x1d.coresdk.streams.CloseRequest\x1a\x1e.coresdk.streams.CloseResponse\x12X\n\x0b\x44\x65leteOwner\x12#.coresdk.streams.DeleteOwnerRequest\x1a$.coresdk.streams.DeleteOwnerResponse\x12\x61\n\x0eRetireProducer\x12&.coresdk.streams.RetireProducerRequest\x1a\'.coresdk.streams.RetireProducerResponse\x12m\n\x12\x46lushNotifications\x12*.coresdk.streams.FlushNotificationsRequest\x1a+.coresdk.streams.FlushNotificationsResponse\x12R\n\tSubscribe\x12!.coresdk.streams.SubscribeRequest\x1a".coresdk.streams.SubscribeResponse\x12X\n\x0bUnsubscribe\x12#.coresdk.streams.UnsubscribeRequest\x1a$.coresdk.streams.UnsubscribeResponse\x12p\n\x13WaitForNotification\x12+.coresdk.streams.WaitForNotificationRequest\x1a,.coresdk.streams.WaitForNotificationResponse\x12\x99\x01\n\x16\x44\x65scribeStreamNotifier\x12>.temporal.api.workflowservice.v1.DescribeStreamNotifierRequest\x1a?.temporal.api.workflowservice.v1.DescribeStreamNotifierResponse\x12\x64\n\x0fRunStreamDriver\x12\'.coresdk.streams.RunStreamDriverRequest\x1a(.coresdk.streams.RunStreamDriverResponse\x12M\n\tReadRange\x12!.coresdk.streams.ReadRangeRequest\x1a\x1d.coresdk.streams.ReadResponse\x12[\n\x0cReleaseFloor\x12$.coresdk.streams.ReleaseFloorRequest\x1a%.coresdk.streams.ReleaseFloorResponse\x12I\n\x06\x46ollow\x12\x1e.coresdk.streams.FollowRequest\x1a\x1f.coresdk.streams.FollowResponse\x12S\n\x0b\x46ollowRange\x12#.coresdk.streams.FollowRangeRequest\x1a\x1f.coresdk.streams.FollowResponse\x12^\n\rDescribeStore\x12%.coresdk.streams.DescribeStoreRequest\x1a&.coresdk.streams.DescribeStoreResponse\x12p\n\x13PublishWorkflowTask\x12+.coresdk.streams.PublishWorkflowTaskRequest\x1a,.coresdk.streams.PublishWorkflowTaskResponse\x12U\n\nRunEvicted\x12".coresdk.streams.RunEvictedRequest\x1a#.coresdk.streams.RunEvictedResponse\x12\x61\n\x0eShutdownWorker\x12&.coresdk.streams.ShutdownWorkerRequest\x1a\'.coresdk.streams.ShutdownWorkerResponseB-\xea\x02*Temporalio::Internal::Bridge::Api::Streamsb\x06proto3' ) _STREAMOWNERKIND = DESCRIPTOR.enum_types_by_name["StreamOwnerKind"] @@ -76,6 +76,7 @@ _STREAMSTORECONFIG = DESCRIPTOR.message_types_by_name["StreamStoreConfig"] _ARCHIVECONFIG = DESCRIPTOR.message_types_by_name["ArchiveConfig"] _REDISSTORECONFIG = DESCRIPTOR.message_types_by_name["RedisStoreConfig"] +_POSTGRESSTORECONFIG = DESCRIPTOR.message_types_by_name["PostgresStoreConfig"] _MEMORYSTORECONFIG = DESCRIPTOR.message_types_by_name["MemoryStoreConfig"] _STREAMADDRESS = DESCRIPTOR.message_types_by_name["StreamAddress"] _CHAINID = DESCRIPTOR.message_types_by_name["ChainId"] @@ -185,6 +186,17 @@ ) _sym_db.RegisterMessage(RedisStoreConfig) +PostgresStoreConfig = _reflection.GeneratedProtocolMessageType( + "PostgresStoreConfig", + (_message.Message,), + { + "DESCRIPTOR": _POSTGRESSTORECONFIG, + "__module__": "temporal.sdk.core.streams.streams_pb2", + # @@protoc_insertion_point(class_scope:coresdk.streams.PostgresStoreConfig) + }, +) +_sym_db.RegisterMessage(PostgresStoreConfig) + MemoryStoreConfig = _reflection.GeneratedProtocolMessageType( "MemoryStoreConfig", (_message.Message,), @@ -884,148 +896,150 @@ DESCRIPTOR._serialized_options = ( b"\352\002*Temporalio::Internal::Bridge::Api::Streams" ) - _STREAMOWNERKIND._serialized_start = 9863 - _STREAMOWNERKIND._serialized_end = 10020 - _STREAMFAILUREKIND._serialized_start = 10023 - _STREAMFAILUREKIND._serialized_end = 10597 - _RESOLVEDACTIVITYOUTCOME._serialized_start = 10600 - _RESOLVEDACTIVITYOUTCOME._serialized_end = 10788 - _WORKFLOWTERMINALCOMMAND._serialized_start = 10791 - _WORKFLOWTERMINALCOMMAND._serialized_end = 11020 + _STREAMOWNERKIND._serialized_start = 10398 + _STREAMOWNERKIND._serialized_end = 10555 + _STREAMFAILUREKIND._serialized_start = 10558 + _STREAMFAILUREKIND._serialized_end = 11132 + _RESOLVEDACTIVITYOUTCOME._serialized_start = 11135 + _RESOLVEDACTIVITYOUTCOME._serialized_end = 11323 + _WORKFLOWTERMINALCOMMAND._serialized_start = 11326 + _WORKFLOWTERMINALCOMMAND._serialized_end = 11555 _STREAMSTORECONFIG._serialized_start = 305 - _STREAMSTORECONFIG._serialized_end = 644 - _ARCHIVECONFIG._serialized_start = 647 - _ARCHIVECONFIG._serialized_end = 795 - _REDISSTORECONFIG._serialized_start = 798 - _REDISSTORECONFIG._serialized_end = 1144 - _MEMORYSTORECONFIG._serialized_start = 1146 - _MEMORYSTORECONFIG._serialized_end = 1223 - _STREAMADDRESS._serialized_start = 1226 - _STREAMADDRESS._serialized_end = 1387 - _CHAINID._serialized_start = 1390 - _CHAINID._serialized_end = 1536 - _NAMEDPRODUCER._serialized_start = 1538 - _NAMEDPRODUCER._serialized_end = 1591 - _ACTIVITYPRODUCER._serialized_start = 1594 - _ACTIVITYPRODUCER._serialized_end = 1745 - _APPENDRECORD._serialized_start = 1748 - _APPENDRECORD._serialized_end = 1939 - _APPENDREQUEST._serialized_start = 1942 - _APPENDREQUEST._serialized_end = 2203 - _APPENDRESPONSE._serialized_start = 2205 - _APPENDRESPONSE._serialized_end = 2264 - _READREQUEST._serialized_start = 2267 - _READREQUEST._serialized_end = 2525 - _READSUBSCRIBER._serialized_start = 2527 - _READSUBSCRIBER._serialized_end = 2625 - _SUPERSESSION._serialized_start = 2627 - _SUPERSESSION._serialized_end = 2720 - _READRECORD._serialized_start = 2723 - _READRECORD._serialized_end = 2886 - _READRESPONSE._serialized_start = 2889 - _READRESPONSE._serialized_end = 3232 - _READRANGEREQUEST._serialized_start = 3235 - _READRANGEREQUEST._serialized_end = 3465 - _RELEASEFLOORREQUEST._serialized_start = 3467 - _RELEASEFLOORREQUEST._serialized_end = 3586 - _RELEASEFLOORRESPONSE._serialized_start = 3588 - _RELEASEFLOORRESPONSE._serialized_end = 3610 - _FOLLOWREQUEST._serialized_start = 3613 - _FOLLOWREQUEST._serialized_end = 3882 - _FOLLOWSUBSCRIBER._serialized_start = 3884 - _FOLLOWSUBSCRIBER._serialized_end = 3988 - _FOLLOWEDRECORD._serialized_start = 3991 - _FOLLOWEDRECORD._serialized_end = 4128 - _LINKSTATE._serialized_start = 4131 - _LINKSTATE._serialized_end = 4517 - _LINKSTATE_KIND._serialized_start = 4417 - _LINKSTATE_KIND._serialized_end = 4517 - _FOLLOWSOURCE._serialized_start = 4519 - _FOLLOWSOURCE._serialized_end = 4642 - _SOURCERANGE._serialized_start = 4645 - _SOURCERANGE._serialized_end = 5003 - _SOURCEWAKE._serialized_start = 5005 - _SOURCEWAKE._serialized_end = 5078 - _FOLLOWRESPONSE._serialized_start = 5081 - _FOLLOWRESPONSE._serialized_end = 5449 - _FOLLOWRANGEREQUEST._serialized_start = 5452 - _FOLLOWRANGEREQUEST._serialized_end = 5666 - _LATESTREQUEST._serialized_start = 5668 - _LATESTREQUEST._serialized_end = 5731 - _LATESTRESPONSE._serialized_start = 5733 - _LATESTRESPONSE._serialized_end = 5765 - _CLOSEREQUEST._serialized_start = 5768 - _CLOSEREQUEST._serialized_end = 5949 - _STOREDCLOSE._serialized_start = 5952 - _STOREDCLOSE._serialized_end = 6084 - _CLOSERESPONSE._serialized_start = 6086 - _CLOSERESPONSE._serialized_end = 6101 - _FLUSHNOTIFICATIONSREQUEST._serialized_start = 6103 - _FLUSHNOTIFICATIONSREQUEST._serialized_end = 6130 - _FLUSHNOTIFICATIONSRESPONSE._serialized_start = 6132 - _FLUSHNOTIFICATIONSRESPONSE._serialized_end = 6160 - _SUBSCRIBEREQUEST._serialized_start = 6163 - _SUBSCRIBEREQUEST._serialized_end = 6311 - _SUBSCRIBERESPONSE._serialized_start = 6313 - _SUBSCRIBERESPONSE._serialized_end = 6402 - _UNSUBSCRIBEREQUEST._serialized_start = 6405 - _UNSUBSCRIBEREQUEST._serialized_end = 6534 - _UNSUBSCRIBERESPONSE._serialized_start = 6536 - _UNSUBSCRIBERESPONSE._serialized_end = 6557 - _WAITFORNOTIFICATIONREQUEST._serialized_start = 6559 - _WAITFORNOTIFICATIONREQUEST._serialized_end = 6658 - _WAITFORNOTIFICATIONRESPONSE._serialized_start = 6661 - _WAITFORNOTIFICATIONRESPONSE._serialized_end = 6872 - _RUNSTREAMDRIVERREQUEST._serialized_start = 6875 - _RUNSTREAMDRIVERREQUEST._serialized_end = 7030 - _RUNSTREAMDRIVERRESPONSE._serialized_start = 7032 - _RUNSTREAMDRIVERRESPONSE._serialized_end = 7057 - _DELETEOWNERREQUEST._serialized_start = 7060 - _DELETEOWNERREQUEST._serialized_end = 7195 - _DELETEOWNERRESPONSE._serialized_start = 7197 - _DELETEOWNERRESPONSE._serialized_end = 7235 - _RETIREPRODUCERREQUEST._serialized_start = 7238 - _RETIREPRODUCERREQUEST._serialized_end = 7425 - _RETIREPRODUCERRESPONSE._serialized_start = 7427 - _RETIREPRODUCERRESPONSE._serialized_end = 7451 - _DESCRIBESTOREREQUEST._serialized_start = 7453 - _DESCRIBESTOREREQUEST._serialized_end = 7475 - _DESCRIBESTORERESPONSE._serialized_start = 7477 - _DESCRIBESTORERESPONSE._serialized_end = 7572 - _STORECAPABILITIES._serialized_start = 7575 - _STORECAPABILITIES._serialized_end = 7896 - _STREAMFAILURE._serialized_start = 7898 - _STREAMFAILURE._serialized_end = 8015 - _STOREAPPENDREQUEST._serialized_start = 8018 - _STOREAPPENDREQUEST._serialized_end = 8183 - _STOREAPPENDRESPONSE._serialized_start = 8185 - _STOREAPPENDRESPONSE._serialized_end = 8264 - _STOREREADREQUEST._serialized_start = 8267 - _STOREREADREQUEST._serialized_end = 8438 - _STOREDRECORD._serialized_start = 8440 - _STOREDRECORD._serialized_end = 8488 - _STOREREADRESPONSE._serialized_start = 8491 - _STOREREADRESPONSE._serialized_end = 8632 - _STORELATESTREQUEST._serialized_start = 8634 - _STORELATESTREQUEST._serialized_end = 8710 - _STORELATESTRESPONSE._serialized_start = 8712 - _STORELATESTRESPONSE._serialized_end = 8751 - _PUBLISHWORKFLOWTASKREQUEST._serialized_start = 8754 - _PUBLISHWORKFLOWTASKREQUEST._serialized_end = 9256 - _RESOLVEDOWNERACTIVITY._serialized_start = 9259 - _RESOLVEDOWNERACTIVITY._serialized_end = 9413 - _OUTPUTRECORD._serialized_start = 9416 - _OUTPUTRECORD._serialized_end = 9622 - _PUBLISHWORKFLOWTASKRESPONSE._serialized_start = 9624 - _PUBLISHWORKFLOWTASKRESPONSE._serialized_end = 9677 - _RUNEVICTEDREQUEST._serialized_start = 9679 - _RUNEVICTEDREQUEST._serialized_end = 9768 - _RUNEVICTEDRESPONSE._serialized_start = 9770 - _RUNEVICTEDRESPONSE._serialized_end = 9790 - _SHUTDOWNWORKERREQUEST._serialized_start = 9792 - _SHUTDOWNWORKERREQUEST._serialized_end = 9834 - _SHUTDOWNWORKERRESPONSE._serialized_start = 9836 - _SHUTDOWNWORKERRESPONSE._serialized_end = 9860 - _STREAMSERVICE._serialized_start = 11023 - _STREAMSERVICE._serialized_end = 12903 + _STREAMSTORECONFIG._serialized_end = 702 + _ARCHIVECONFIG._serialized_start = 705 + _ARCHIVECONFIG._serialized_end = 853 + _REDISSTORECONFIG._serialized_start = 856 + _REDISSTORECONFIG._serialized_end = 1202 + _POSTGRESSTORECONFIG._serialized_start = 1205 + _POSTGRESSTORECONFIG._serialized_end = 1679 + _MEMORYSTORECONFIG._serialized_start = 1681 + _MEMORYSTORECONFIG._serialized_end = 1758 + _STREAMADDRESS._serialized_start = 1761 + _STREAMADDRESS._serialized_end = 1922 + _CHAINID._serialized_start = 1925 + _CHAINID._serialized_end = 2071 + _NAMEDPRODUCER._serialized_start = 2073 + _NAMEDPRODUCER._serialized_end = 2126 + _ACTIVITYPRODUCER._serialized_start = 2129 + _ACTIVITYPRODUCER._serialized_end = 2280 + _APPENDRECORD._serialized_start = 2283 + _APPENDRECORD._serialized_end = 2474 + _APPENDREQUEST._serialized_start = 2477 + _APPENDREQUEST._serialized_end = 2738 + _APPENDRESPONSE._serialized_start = 2740 + _APPENDRESPONSE._serialized_end = 2799 + _READREQUEST._serialized_start = 2802 + _READREQUEST._serialized_end = 3060 + _READSUBSCRIBER._serialized_start = 3062 + _READSUBSCRIBER._serialized_end = 3160 + _SUPERSESSION._serialized_start = 3162 + _SUPERSESSION._serialized_end = 3255 + _READRECORD._serialized_start = 3258 + _READRECORD._serialized_end = 3421 + _READRESPONSE._serialized_start = 3424 + _READRESPONSE._serialized_end = 3767 + _READRANGEREQUEST._serialized_start = 3770 + _READRANGEREQUEST._serialized_end = 4000 + _RELEASEFLOORREQUEST._serialized_start = 4002 + _RELEASEFLOORREQUEST._serialized_end = 4121 + _RELEASEFLOORRESPONSE._serialized_start = 4123 + _RELEASEFLOORRESPONSE._serialized_end = 4145 + _FOLLOWREQUEST._serialized_start = 4148 + _FOLLOWREQUEST._serialized_end = 4417 + _FOLLOWSUBSCRIBER._serialized_start = 4419 + _FOLLOWSUBSCRIBER._serialized_end = 4523 + _FOLLOWEDRECORD._serialized_start = 4526 + _FOLLOWEDRECORD._serialized_end = 4663 + _LINKSTATE._serialized_start = 4666 + _LINKSTATE._serialized_end = 5052 + _LINKSTATE_KIND._serialized_start = 4952 + _LINKSTATE_KIND._serialized_end = 5052 + _FOLLOWSOURCE._serialized_start = 5054 + _FOLLOWSOURCE._serialized_end = 5177 + _SOURCERANGE._serialized_start = 5180 + _SOURCERANGE._serialized_end = 5538 + _SOURCEWAKE._serialized_start = 5540 + _SOURCEWAKE._serialized_end = 5613 + _FOLLOWRESPONSE._serialized_start = 5616 + _FOLLOWRESPONSE._serialized_end = 5984 + _FOLLOWRANGEREQUEST._serialized_start = 5987 + _FOLLOWRANGEREQUEST._serialized_end = 6201 + _LATESTREQUEST._serialized_start = 6203 + _LATESTREQUEST._serialized_end = 6266 + _LATESTRESPONSE._serialized_start = 6268 + _LATESTRESPONSE._serialized_end = 6300 + _CLOSEREQUEST._serialized_start = 6303 + _CLOSEREQUEST._serialized_end = 6484 + _STOREDCLOSE._serialized_start = 6487 + _STOREDCLOSE._serialized_end = 6619 + _CLOSERESPONSE._serialized_start = 6621 + _CLOSERESPONSE._serialized_end = 6636 + _FLUSHNOTIFICATIONSREQUEST._serialized_start = 6638 + _FLUSHNOTIFICATIONSREQUEST._serialized_end = 6665 + _FLUSHNOTIFICATIONSRESPONSE._serialized_start = 6667 + _FLUSHNOTIFICATIONSRESPONSE._serialized_end = 6695 + _SUBSCRIBEREQUEST._serialized_start = 6698 + _SUBSCRIBEREQUEST._serialized_end = 6846 + _SUBSCRIBERESPONSE._serialized_start = 6848 + _SUBSCRIBERESPONSE._serialized_end = 6937 + _UNSUBSCRIBEREQUEST._serialized_start = 6940 + _UNSUBSCRIBEREQUEST._serialized_end = 7069 + _UNSUBSCRIBERESPONSE._serialized_start = 7071 + _UNSUBSCRIBERESPONSE._serialized_end = 7092 + _WAITFORNOTIFICATIONREQUEST._serialized_start = 7094 + _WAITFORNOTIFICATIONREQUEST._serialized_end = 7193 + _WAITFORNOTIFICATIONRESPONSE._serialized_start = 7196 + _WAITFORNOTIFICATIONRESPONSE._serialized_end = 7407 + _RUNSTREAMDRIVERREQUEST._serialized_start = 7410 + _RUNSTREAMDRIVERREQUEST._serialized_end = 7565 + _RUNSTREAMDRIVERRESPONSE._serialized_start = 7567 + _RUNSTREAMDRIVERRESPONSE._serialized_end = 7592 + _DELETEOWNERREQUEST._serialized_start = 7595 + _DELETEOWNERREQUEST._serialized_end = 7730 + _DELETEOWNERRESPONSE._serialized_start = 7732 + _DELETEOWNERRESPONSE._serialized_end = 7770 + _RETIREPRODUCERREQUEST._serialized_start = 7773 + _RETIREPRODUCERREQUEST._serialized_end = 7960 + _RETIREPRODUCERRESPONSE._serialized_start = 7962 + _RETIREPRODUCERRESPONSE._serialized_end = 7986 + _DESCRIBESTOREREQUEST._serialized_start = 7988 + _DESCRIBESTOREREQUEST._serialized_end = 8010 + _DESCRIBESTORERESPONSE._serialized_start = 8012 + _DESCRIBESTORERESPONSE._serialized_end = 8107 + _STORECAPABILITIES._serialized_start = 8110 + _STORECAPABILITIES._serialized_end = 8431 + _STREAMFAILURE._serialized_start = 8433 + _STREAMFAILURE._serialized_end = 8550 + _STOREAPPENDREQUEST._serialized_start = 8553 + _STOREAPPENDREQUEST._serialized_end = 8718 + _STOREAPPENDRESPONSE._serialized_start = 8720 + _STOREAPPENDRESPONSE._serialized_end = 8799 + _STOREREADREQUEST._serialized_start = 8802 + _STOREREADREQUEST._serialized_end = 8973 + _STOREDRECORD._serialized_start = 8975 + _STOREDRECORD._serialized_end = 9023 + _STOREREADRESPONSE._serialized_start = 9026 + _STOREREADRESPONSE._serialized_end = 9167 + _STORELATESTREQUEST._serialized_start = 9169 + _STORELATESTREQUEST._serialized_end = 9245 + _STORELATESTRESPONSE._serialized_start = 9247 + _STORELATESTRESPONSE._serialized_end = 9286 + _PUBLISHWORKFLOWTASKREQUEST._serialized_start = 9289 + _PUBLISHWORKFLOWTASKREQUEST._serialized_end = 9791 + _RESOLVEDOWNERACTIVITY._serialized_start = 9794 + _RESOLVEDOWNERACTIVITY._serialized_end = 9948 + _OUTPUTRECORD._serialized_start = 9951 + _OUTPUTRECORD._serialized_end = 10157 + _PUBLISHWORKFLOWTASKRESPONSE._serialized_start = 10159 + _PUBLISHWORKFLOWTASKRESPONSE._serialized_end = 10212 + _RUNEVICTEDREQUEST._serialized_start = 10214 + _RUNEVICTEDREQUEST._serialized_end = 10303 + _RUNEVICTEDRESPONSE._serialized_start = 10305 + _RUNEVICTEDRESPONSE._serialized_end = 10325 + _SHUTDOWNWORKERREQUEST._serialized_start = 10327 + _SHUTDOWNWORKERREQUEST._serialized_end = 10369 + _SHUTDOWNWORKERRESPONSE._serialized_start = 10371 + _SHUTDOWNWORKERRESPONSE._serialized_end = 10395 + _STREAMSERVICE._serialized_start = 11558 + _STREAMSERVICE._serialized_end = 13438 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/streams/streams_pb2.pyi b/temporalio/bridge/proto/streams/streams_pb2.pyi index 421f617dd0..18e865fa8d 100644 --- a/temporalio/bridge/proto/streams/streams_pb2.pyi +++ b/temporalio/bridge/proto/streams/streams_pb2.pyi @@ -218,6 +218,7 @@ class StreamStoreConfig(google.protobuf.message.Message): REDIS_FIELD_NUMBER: builtins.int MEMORY_FIELD_NUMBER: builtins.int + POSTGRES_FIELD_NUMBER: builtins.int NOTIFY_ON_APPEND_FIELD_NUMBER: builtins.int MAX_NOTIFIERS_FIELD_NUMBER: builtins.int OWNER_START_GRACE_FIELD_NUMBER: builtins.int @@ -227,6 +228,8 @@ class StreamStoreConfig(google.protobuf.message.Message): def redis(self) -> global___RedisStoreConfig: ... @property def memory(self) -> global___MemoryStoreConfig: ... + @property + def postgres(self) -> global___PostgresStoreConfig: ... notify_on_append: builtins.bool """Tells each stream's notifier on the server when the stream moves, after every append. That's what wakes a reader that waits on the notifier. Off by default, since most streams have no @@ -260,6 +263,7 @@ class StreamStoreConfig(google.protobuf.message.Message): *, redis: global___RedisStoreConfig | None = ..., memory: global___MemoryStoreConfig | None = ..., + postgres: global___PostgresStoreConfig | None = ..., notify_on_append: builtins.bool = ..., max_notifiers: builtins.int = ..., owner_start_grace: google.protobuf.duration_pb2.Duration | None = ..., @@ -275,6 +279,8 @@ class StreamStoreConfig(google.protobuf.message.Message): b"memory", "owner_start_grace", b"owner_start_grace", + "postgres", + b"postgres", "redis", b"redis", "store", @@ -296,6 +302,8 @@ class StreamStoreConfig(google.protobuf.message.Message): b"notify_on_append", "owner_start_grace", b"owner_start_grace", + "postgres", + b"postgres", "redis", b"redis", "store", @@ -304,7 +312,7 @@ class StreamStoreConfig(google.protobuf.message.Message): ) -> None: ... def WhichOneof( self, oneof_group: typing_extensions.Literal["store", b"store"] - ) -> typing_extensions.Literal["redis", "memory"] | None: ... + ) -> typing_extensions.Literal["redis", "memory", "postgres"] | None: ... global___StreamStoreConfig = StreamStoreConfig @@ -476,6 +484,134 @@ class RedisStoreConfig(google.protobuf.message.Message): global___RedisStoreConfig = RedisStoreConfig +class PostgresStoreConfig(google.protobuf.message.Message): + """Streams in a PostgreSQL database that the service connects to itself, PostgreSQL 14 or later.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + URL_FIELD_NUMBER: builtins.int + SCHEMA_FIELD_NUMBER: builtins.int + RETENTION_FIELD_NUMBER: builtins.int + MAX_CONNECTIONS_FIELD_NUMBER: builtins.int + RESPONSE_TIMEOUT_FIELD_NUMBER: builtins.int + FLOOR_LEASE_FIELD_NUMBER: builtins.int + FLOOR_RELEASE_GRACE_FIELD_NUMBER: builtins.int + NOTIFY_DOORBELLS_FIELD_NUMBER: builtins.int + LISTEN_URL_FIELD_NUMBER: builtins.int + POLL_INTERVAL_FIELD_NUMBER: builtins.int + NOTIFY_READS_FIELD_NUMBER: builtins.int + SKIP_MIGRATIONS_FIELD_NUMBER: builtins.int + JANITOR_INTERVAL_FIELD_NUMBER: builtins.int + url: builtins.str + """A `postgres://` or `postgresql://` URL. Credentials come from the URL. TLS follows the URL's + `sslmode` and `sslrootcert` as libpq reads them. + """ + schema: builtins.str + """The schema that holds the tables. Empty uses `temporal_streams`.""" + @property + def retention(self) -> google.protobuf.duration_pb2.Duration: + """How long a stream keeps a record. Unset keeps seven days.""" + max_connections: builtins.int + """How many connections the pool keeps. Zero uses 16.""" + @property + def response_timeout(self) -> google.protobuf.duration_pb2.Duration: + """How long a call waits, as the session's `statement_timeout`. Unset uses five seconds.""" + @property + def floor_lease(self) -> google.protobuf.duration_pb2.Duration: + """How long a positions-only reader holds a stream's records after its last read. Unset uses + `retention`. + """ + @property + def floor_release_grace(self) -> google.protobuf.duration_pb2.Duration: + """How long a hold lasts after its reader released it. Unset keeps one day.""" + notify_doorbells: builtins.int + """With `StreamStoreConfig.notification_log`, how many doorbells the log rings, from 1 to 64. + Zero uses 16. + """ + listen_url: builtins.str + """A URL for the connection that listens and the one that applies migrations, when `url` goes + through a pooler in transaction mode. Empty uses `url`. + """ + @property + def poll_interval(self) -> google.protobuf.duration_pb2.Duration: + """How often a process looks for new records for its waiting reads. Unset uses 100 ms.""" + notify_reads: builtins.bool + """Each append also sends NOTIFY, so waiting reads in other processes wake in milliseconds. + Costs append throughput when many producers write at once. + """ + skip_migrations: builtins.bool + """The store checks the schema version and never changes it. A DBA applies the migrations.""" + @property + def janitor_interval(self) -> google.protobuf.duration_pb2.Duration: + """How often the janitor trims records past the retention. Unset uses one minute.""" + def __init__( + self, + *, + url: builtins.str = ..., + schema: builtins.str = ..., + retention: google.protobuf.duration_pb2.Duration | None = ..., + max_connections: builtins.int = ..., + response_timeout: google.protobuf.duration_pb2.Duration | None = ..., + floor_lease: google.protobuf.duration_pb2.Duration | None = ..., + floor_release_grace: google.protobuf.duration_pb2.Duration | None = ..., + notify_doorbells: builtins.int = ..., + listen_url: builtins.str = ..., + poll_interval: google.protobuf.duration_pb2.Duration | None = ..., + notify_reads: builtins.bool = ..., + skip_migrations: builtins.bool = ..., + janitor_interval: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "floor_lease", + b"floor_lease", + "floor_release_grace", + b"floor_release_grace", + "janitor_interval", + b"janitor_interval", + "poll_interval", + b"poll_interval", + "response_timeout", + b"response_timeout", + "retention", + b"retention", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "floor_lease", + b"floor_lease", + "floor_release_grace", + b"floor_release_grace", + "janitor_interval", + b"janitor_interval", + "listen_url", + b"listen_url", + "max_connections", + b"max_connections", + "notify_doorbells", + b"notify_doorbells", + "notify_reads", + b"notify_reads", + "poll_interval", + b"poll_interval", + "response_timeout", + b"response_timeout", + "retention", + b"retention", + "schema", + b"schema", + "skip_migrations", + b"skip_migrations", + "url", + b"url", + ], + ) -> None: ... + +global___PostgresStoreConfig = PostgresStoreConfig + class MemoryStoreConfig(google.protobuf.message.Message): """Streams in this process's memory, for tests and local development. Nothing survives the process, and each connect makes a store of its own that shares no streams with another. From ba89f5a0ba52b30d76ff3de9bcae302890487108 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sat, 17 Oct 2026 22:54:31 -0700 Subject: [PATCH 03/13] Kept the PostgreSQL silent producer silent under the notify default. --- tests/contrib/streams/test_live_notifications.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/contrib/streams/test_live_notifications.py b/tests/contrib/streams/test_live_notifications.py index 766df2e046..05ecb2801e 100644 --- a/tests/contrib/streams/test_live_notifications.py +++ b/tests/contrib/streams/test_live_notifications.py @@ -257,10 +257,11 @@ async def two_processes(client: Client, kind: str) -> tuple[Client, Client]: await skip_without_notifier(client) if kind == "postgres": schema = new_schema() - reading = await connect_with( - client, postgres_streams(schema).notify_on_append() + reading = await connect_with(client, postgres_streams(schema)) + silent = await connect_with( + client, postgres_streams(schema).notify_on_append(False) ) - return reading, await connect_with(client, postgres_streams(schema)) + return reading, silent url = os.environ.get("STREAMS_REDIS_URL", "") if not url: pytest.skip("set STREAMS_REDIS_URL to share a store across two clients") From df685046faa6b5bfa79c77603f66a813ee797230 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sat, 17 Oct 2026 23:02:25 -0700 Subject: [PATCH 04/13] Said in the tests README that the lane runs the PostgreSQL cases. --- tests/contrib/streams/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/contrib/streams/README.md b/tests/contrib/streams/README.md index 5f2b0f381b..1873f497b7 100644 --- a/tests/contrib/streams/README.md +++ b/tests/contrib/streams/README.md @@ -9,8 +9,9 @@ skip there with "no stream notifier". limits, and a Redis Cluster of three primaries with one replica each, unless `STREAMS_REDIS_CLUSTER_URL` names one. It then runs the stream tests against them, so the live cases run on memory, Redis and the cluster, the driver cases too. Unless -`STREAMS_ARCHIVE_S3_URL` names a bucket, it starts MinIO in Docker for the archive cases. It -fails when a live test skips or when a gated test did not pass. +`STREAMS_ARCHIVE_S3_URL` names a bucket, it starts MinIO in Docker for the archive cases, and +PostgreSQL 17 for the PostgreSQL cases unless `STREAMS_POSTGRES_URL` names a database. It fails +when a live test skips or when a gated test did not pass. ```bash SERVER_BIN=/path/to/temporal-server PORT_BASE=7941 \ From ed2074200703d2e16478c881d1c03cadaf328908 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sun, 18 Oct 2026 00:50:42 -0700 Subject: [PATCH 05/13] Moved sdk-streams to the new so3. --- temporalio/bridge/Cargo.lock | 2 +- temporalio/bridge/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/temporalio/bridge/Cargo.lock b/temporalio/bridge/Cargo.lock index 64414093ed..834b6b3ba0 100644 --- a/temporalio/bridge/Cargo.lock +++ b/temporalio/bridge/Cargo.lock @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "temporalio-streams" version = "0.1.0" -source = "git+https://github.com/moetemp/sdk-streams?rev=3187486707646024916d81036178e5088553445d#3187486707646024916d81036178e5088553445d" +source = "git+https://github.com/moetemp/sdk-streams?rev=1ff21f09b12777cbe4abca0407008c1c9daf9526#1ff21f09b12777cbe4abca0407008c1c9daf9526" dependencies = [ "async-trait", "aws-lc-rs", diff --git a/temporalio/bridge/Cargo.toml b/temporalio/bridge/Cargo.toml index 075d177513..9d1196b2ef 100644 --- a/temporalio/bridge/Cargo.toml +++ b/temporalio/bridge/Cargo.toml @@ -91,7 +91,7 @@ url = "2.2" # makes it use the submodule's crates, so the bridge sees one `Connection` type. [dependencies.temporalio-streams] git = "https://github.com/moetemp/sdk-streams" -rev = "3187486707646024916d81036178e5088553445d" +rev = "1ff21f09b12777cbe4abca0407008c1c9daf9526" default-features = false features = ["archive", "envconfig", "postgres", "redis"] From 97e2969eeb8b5531d791a477c266a38f788936bf Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sun, 18 Oct 2026 01:49:43 -0700 Subject: [PATCH 06/13] Used the new stream call names in the po2 code. --- temporalio/contrib/streams/postgres.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/contrib/streams/postgres.py b/temporalio/contrib/streams/postgres.py index 2bfc6de4ce..32939feadb 100644 --- a/temporalio/contrib/streams/postgres.py +++ b/temporalio/contrib/streams/postgres.py @@ -21,7 +21,7 @@ class PostgresStreams(StreamStorePlugin): One instance per database. Pass it to the client as a plugin, and open handles from the client with - :func:`temporalio.contrib.streams.get_stream_handle`. PostgreSQL 14 or + :func:`temporalio.contrib.streams.stream_handle`. PostgreSQL 14 or later is required. The store keeps records on disk, so a long retention costs disk, not memory. By default it makes and upgrades its tables in ``schema`` when it connects. From 84218791800daf0d5de451a46ce2207c6eaacb37 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sun, 18 Oct 2026 02:20:11 -0700 Subject: [PATCH 07/13] Moved sdk-streams to the so3 head that withdraws failed task calls. --- temporalio/bridge/Cargo.lock | 2 +- temporalio/bridge/Cargo.toml | 2 +- .../bridge/proto/streams/streams_pb2.py | 264 +++++++++--------- 3 files changed, 134 insertions(+), 134 deletions(-) diff --git a/temporalio/bridge/Cargo.lock b/temporalio/bridge/Cargo.lock index 834b6b3ba0..74c4f75890 100644 --- a/temporalio/bridge/Cargo.lock +++ b/temporalio/bridge/Cargo.lock @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "temporalio-streams" version = "0.1.0" -source = "git+https://github.com/moetemp/sdk-streams?rev=1ff21f09b12777cbe4abca0407008c1c9daf9526#1ff21f09b12777cbe4abca0407008c1c9daf9526" +source = "git+https://github.com/moetemp/sdk-streams?rev=1395ea29c11cbefdfae5cbf2c4606e56facc6ca8#1395ea29c11cbefdfae5cbf2c4606e56facc6ca8" dependencies = [ "async-trait", "aws-lc-rs", diff --git a/temporalio/bridge/Cargo.toml b/temporalio/bridge/Cargo.toml index 9d1196b2ef..3707e4105c 100644 --- a/temporalio/bridge/Cargo.toml +++ b/temporalio/bridge/Cargo.toml @@ -91,7 +91,7 @@ url = "2.2" # makes it use the submodule's crates, so the bridge sees one `Connection` type. [dependencies.temporalio-streams] git = "https://github.com/moetemp/sdk-streams" -rev = "1ff21f09b12777cbe4abca0407008c1c9daf9526" +rev = "1395ea29c11cbefdfae5cbf2c4606e56facc6ca8" default-features = false features = ["archive", "envconfig", "postgres", "redis"] diff --git a/temporalio/bridge/proto/streams/streams_pb2.py b/temporalio/bridge/proto/streams/streams_pb2.py index 7d8f04a466..1b0a57f1fd 100644 --- a/temporalio/bridge/proto/streams/streams_pb2.py +++ b/temporalio/bridge/proto/streams/streams_pb2.py @@ -32,7 +32,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\'temporal/sdk/core/streams/streams.proto\x12\x0f\x63oresdk.streams\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a%temporal/sdk/streams/v1/message.proto\x1a=temporal/api/workflowservice/v1/stream_request_response.proto"\x8d\x03\n\x11StreamStoreConfig\x12\x32\n\x05redis\x18\x01 \x01(\x0b\x32!.coresdk.streams.RedisStoreConfigH\x00\x12\x34\n\x06memory\x18\x02 \x01(\x0b\x32".coresdk.streams.MemoryStoreConfigH\x00\x12\x38\n\x08postgres\x18\t \x01(\x0b\x32$.coresdk.streams.PostgresStoreConfigH\x00\x12\x18\n\x10notify_on_append\x18\x03 \x01(\x08\x12\x15\n\rmax_notifiers\x18\x04 \x01(\r\x12\x34\n\x11owner_start_grace\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notification_log\x18\x07 \x01(\x08\x12/\n\x07\x61rchive\x18\x08 \x01(\x0b\x32\x1e.coresdk.streams.ArchiveConfigB\x07\n\x05storeJ\x04\x08\x05\x10\x06R\x13notify_every_append"\x94\x01\n\rArchiveConfig\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x15\n\rsegment_bytes\x18\x02 \x01(\x04\x12/\n\x0csegment_idle\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0bstall_limit\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration"\xda\x02\n\x10RedisStoreConfig\x12\x0c\n\x04urls\x18\x01 \x03(\t\x12\x0f\n\x07\x63luster\x18\x02 \x01(\x08\x12\x12\n\nkey_prefix\x18\x03 \x01(\t\x12,\n\tretention\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x1f\n\x17\x62locking_reads_per_node\x18\x05 \x01(\r\x12\x33\n\x10response_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0b\x66loor_lease\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x36\n\x13\x66loor_release_grace\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notify_doorbells\x18\t \x01(\r\x12\r\n\x05plain\x18\n \x01(\x08"\xda\x03\n\x13PostgresStoreConfig\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12,\n\tretention\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x17\n\x0fmax_connections\x18\x04 \x01(\r\x12\x33\n\x10response_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0b\x66loor_lease\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x36\n\x13\x66loor_release_grace\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notify_doorbells\x18\x08 \x01(\r\x12\x12\n\nlisten_url\x18\t \x01(\t\x12\x30\n\rpoll_interval\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x14\n\x0cnotify_reads\x18\x0b \x01(\x08\x12\x17\n\x0fskip_migrations\x18\x0c \x01(\x08\x12\x33\n\x10janitor_interval\x18\r \x01(\x0b\x32\x19.google.protobuf.Duration"M\n\x11MemoryStoreConfig\x12\x38\n\x0c\x63\x61pabilities\x18\x01 \x01(\x0b\x32".coresdk.streams.StoreCapabilities"\xa1\x01\n\rStreamAddress\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x34\n\nowner_kind\x18\x02 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\r\n\x05topic\x18\x05 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t"\x92\x01\n\x07\x43hainId\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_run_id\x18\x03 \x01(\t\x12\x34\n\nowner_kind\x18\x04 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0b\x61\x63tivity_id\x18\x05 \x01(\t"5\n\rNamedProducer\x12\x13\n\x0bproducer_id\x18\x01 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x02 \x01(\x03"\x97\x01\n\x10\x41\x63tivityProducer\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x38\n\x14\x61ttempt_started_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xbf\x01\n\x0c\x41ppendRecord\x12\x37\n\x04kind\x18\x01 \x01(\x0e\x32).temporal.sdk.streams.v1.StreamRecordKind\x12-\n\x04\x62ody\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x14\n\x0c\x63ontent_hash\x18\x03 \x01(\x0c\x12\x31\n\x04link\x18\x04 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink"\x85\x02\n\rAppendRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x05named\x18\x02 \x01(\x0b\x32\x1e.coresdk.streams.NamedProducerH\x00\x12\x35\n\x08\x61\x63tivity\x18\x03 \x01(\x0b\x32!.coresdk.streams.ActivityProducerH\x00\x12\x10\n\x08sequence\x18\x04 \x01(\x03\x12.\n\x07records\x18\x05 \x03(\x0b\x32\x1d.coresdk.streams.AppendRecord\x12\x0e\n\x06\x64igest\x18\x06 \x01(\x0c\x42\n\n\x08producer";\n\x0e\x41ppendResponse\x12\x14\n\x0c\x66irst_cursor\x18\x01 \x01(\t\x12\x13\n\x0blast_cursor\x18\x02 \x01(\t"\x82\x02\n\x0bReadRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\r\n\x05\x61\x66ter\x18\x02 \x01(\t\x12\'\n\x04wait\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x04 \x01(\r\x12\r\n\x05state\x18\x05 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x07 \x01(\t\x12\x33\n\nsubscriber\x18\x08 \x01(\x0b\x32\x1f.coresdk.streams.ReadSubscriber\x12\x11\n\tmax_bytes\x18\t \x01(\x04J\x04\x08\x06\x10\x07R\x03\x61rm"b\n\x0eReadSubscriber\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"]\n\x0cSupersession\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x13\n\x0bproducer_id\x18\x02 \x01(\t\x12\x18\n\x10previous_attempt\x18\x03 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x03"\xa3\x01\n\nReadRecord\x12\x0e\n\x06\x63ursor\x18\x01 \x01(\t\x12\x37\n\x06stored\x18\x02 \x01(\x0b\x32%.temporal.sdk.streams.v1.StreamRecordH\x00\x12\x33\n\nsuperseded\x18\x03 \x01(\x0b\x32\x1d.coresdk.streams.SupersessionH\x00\x12\r\n\x05stale\x18\x04 \x01(\x08\x42\x08\n\x06record"\xd7\x02\n\x0cReadResponse\x12,\n\x07records\x18\x01 \x03(\x0b\x32\x1b.coresdk.streams.ReadRecord\x12\x0e\n\x06\x63ursor\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x0c\x12\x0c\n\x04\x64one\x18\x04 \x01(\x08\x12\x12\n\nwake_after\x18\x06 \x01(\x03\x12\x35\n\x0c\x63lose_result\x18\x07 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x08 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\t \x01(\t\x12\x16\n\x0erecords_digest\x18\n \x01(\x0c\x12\x1a\n\x12\x63hain_first_run_id\x18\x0b \x01(\t\x12\x14\n\x0cstart_cursor\x18\x0c \x01(\tJ\x04\x08\x05\x10\x06R\x05\x61rmed"\xe6\x01\n\x10ReadRangeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\r\n\x05\x61\x66ter\x18\x03 \x01(\t\x12\n\n\x02to\x18\x04 \x01(\t\x12\x16\n\x0estored_records\x18\x05 \x01(\r\x12\r\n\x05state\x18\x06 \x01(\x0c\x12\x16\n\x0erecords_digest\x18\x07 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x08 \x01(\t\x12\x16\n\x0estart_from_end\x18\t \x01(\x08"w\n\x13ReleaseFloorRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66loor_holder\x18\x03 \x01(\t"\x16\n\x14ReleaseFloorResponse"\x8d\x02\n\rFollowRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\r\n\x05\x61\x66ter\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x0c\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x05 \x01(\r\x12\x11\n\tmax_depth\x18\x06 \x01(\r\x12\x10\n\x08max_open\x18\x07 \x01(\r\x12\x14\n\x0c\x66loor_holder\x18\x08 \x01(\t\x12\x35\n\nsubscriber\x18\t \x01(\x0b\x32!.coresdk.streams.FollowSubscriber"h\n\x10\x46ollowSubscriber\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1b\n\x13subscription_prefix\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"\x89\x01\n\x0e\x46ollowedRecord\x12\x0e\n\x06source\x18\x01 \x01(\r\x12-\n\x06record\x18\x02 \x01(\x0b\x32\x1b.coresdk.streams.ReadRecordH\x00\x12\x30\n\nlink_state\x18\x03 \x01(\x0b\x32\x1a.coresdk.streams.LinkStateH\x00\x42\x06\n\x04item"\x82\x03\n\tLinkState\x12-\n\x04kind\x18\x01 \x01(\x0e\x32\x1f.coresdk.streams.LinkState.Kind\x12\x31\n\x04link\x18\x02 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink\x12\x35\n\x0c\x63lose_result\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12-\n\x05\x65rror\x18\x05 \x01(\x0b\x32\x1e.coresdk.streams.StreamFailure\x12\x0e\n\x06reason\x18\x06 \x01(\t"d\n\x04Kind\x12\x14\n\x10KIND_UNSPECIFIED\x10\x00\x12\x0f\n\x0bKIND_OPENED\x10\x01\x12\r\n\tKIND_DONE\x10\x02\x12\x14\n\x10KIND_UNAVAILABLE\x10\x03\x12\x10\n\x0cKIND_SKIPPED\x10\x04"{\n\x0c\x46ollowSource\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x0e\n\x06parent\x18\x02 \x01(\r\x12\r\n\x05\x64\x65pth\x18\x03 \x01(\r\x12.\n\x06stream\x18\x04 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x0c\n\x04name\x18\x05 \x01(\t"\xe6\x02\n\x0bSourceRange\x12\x0e\n\x06source\x18\x01 \x01(\r\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_cursor\x18\x03 \x01(\t\x12\x0e\n\x06\x63ursor\x18\x04 \x01(\t\x12\x16\n\x0estored_records\x18\x05 \x01(\r\x12\x10\n\x08state_in\x18\x06 \x01(\x0c\x12\x16\n\x0erecords_digest\x18\x07 \x01(\x0c\x12\x16\n\x0estart_from_end\x18\x08 \x01(\x08\x12\x0c\n\x04\x64one\x18\t \x01(\x08\x12\x35\n\x0c\x63lose_result\x18\n \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12-\n\x05\x65rror\x18\x0c \x01(\x0b\x32\x1e.coresdk.streams.StreamFailure"I\n\nSourceWake\x12\x0e\n\x06source\x18\x01 \x01(\r\x12\x17\n\x0fsubscription_id\x18\x02 \x01(\t\x12\x12\n\nwake_after\x18\x03 \x01(\x03"\xf0\x02\n\x0e\x46ollowResponse\x12\x30\n\x07records\x18\x01 \x03(\x0b\x32\x1f.coresdk.streams.FollowedRecord\x12\r\n\x05state\x18\x02 \x01(\x0c\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12.\n\x07sources\x18\x04 \x03(\x0b\x32\x1d.coresdk.streams.FollowSource\x12,\n\x06ranges\x18\x05 \x03(\x0b\x32\x1c.coresdk.streams.SourceRange\x12*\n\x05wakes\x18\x06 \x03(\x0b\x32\x1b.coresdk.streams.SourceWake\x12\x35\n\x0c\x63lose_result\x18\x07 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x08 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x15\n\rfollow_digest\x18\t \x01(\x0c"\xd6\x01\n\x12\x46ollowRangeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x10\n\x08state_in\x18\x02 \x01(\x0c\x12,\n\x06ranges\x18\x03 \x03(\x0b\x32\x1c.coresdk.streams.SourceRange\x12\x15\n\rfollow_digest\x18\x04 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x05 \x01(\t\x12\x11\n\tmax_depth\x18\x06 \x01(\r\x12\x10\n\x08max_open\x18\x07 \x01(\r"?\n\rLatestRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress" \n\x0eLatestResponse\x12\x0e\n\x06\x63ursor\x18\x01 \x01(\t"\xb5\x01\n\x0c\x43loseRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\x04 \x01(\t"\x84\x01\n\x0bStoredClose\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\x03 \x01(\t"\x0f\n\rCloseResponse"\x1b\n\x19\x46lushNotificationsRequest"\x1c\n\x1a\x46lushNotificationsResponse"\x94\x01\n\x10SubscribeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x04 \x01(\t\x12\x12\n\ngeneration\x18\x05 \x01(\r"Y\n\x11SubscribeResponse\x12\x1a\n\x12\x63hain_first_run_id\x18\x01 \x01(\t\x12\x10\n\x08\x61ttached\x18\x02 \x01(\x08\x12\x16\n\x0enewest_counter\x18\x03 \x01(\x03"\x81\x01\n\x12UnsubscribeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"\x15\n\x13UnsubscribeResponse"c\n\x1aWaitForNotificationRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x15\n\rafter_counter\x18\x02 \x01(\x03"\xd3\x01\n\x1bWaitForNotificationResponse\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x03\x12\x10\n\x08position\x18\x02 \x01(\t\x12\x11\n\ttimed_out\x18\x03 \x01(\x08\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_result\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x06 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x9b\x01\n\x16RunStreamDriverRequest\x12\x10\n\x08\x63onsumer\x18\x01 \x01(\t\x12\x31\n\x0esweep_interval\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12-\n\nclaim_idle\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\r\n\x05\x62\x61tch\x18\x04 \x01(\r"\x19\n\x17RunStreamDriverResponse"\x87\x01\n\x12\x44\x65leteOwnerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x34\n\nowner_kind\x18\x02 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t"&\n\x13\x44\x65leteOwnerResponse\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x04"\xbb\x01\n\x15RetireProducerRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x05named\x18\x02 \x01(\x0b\x32\x1e.coresdk.streams.NamedProducerH\x00\x12\x35\n\x08\x61\x63tivity\x18\x03 \x01(\x0b\x32!.coresdk.streams.ActivityProducerH\x00\x42\n\n\x08producer"\x18\n\x16RetireProducerResponse"\x16\n\x14\x44\x65scribeStoreRequest"_\n\x15\x44\x65scribeStoreResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32".coresdk.streams.StoreCapabilities"\xc1\x02\n\x11StoreCapabilities\x12\x16\n\x0eproducer_state\x18\x01 \x01(\x08\x12\x11\n\tkept_last\x18\x04 \x01(\x08\x12\r\n\x05holds\x18\x05 \x01(\x08\x12\x13\n\x0b\x63hange_feed\x18\x06 \x01(\x08\x12\x12\n\ncheap_logs\x18\x07 \x01(\x08\x12\x14\n\x0c\x64\x65lete_owner\x18\x08 \x01(\x08\x12\x15\n\rtopic_listing\x18\t \x01(\x08\x12\x11\n\tlong_poll\x18\n \x01(\x08\x12\x17\n\x0f\x64\x65nse_positions\x18\x0b \x01(\x08\x12\x31\n\x0ereplay_horizon\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10max_record_bytes\x18\r \x01(\x04\x12\x17\n\x0fmax_batch_bytes\x18\x0e \x01(\x04J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"u\n\rStreamFailure\x12\x30\n\x04kind\x18\x01 \x01(\x0e\x32".coresdk.streams.StreamFailureKind\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0e\n\x06\x63ursor\x18\x03 \x01(\t\x12\x11\n\tclosed_by\x18\x04 \x01(\t"\xa5\x01\n\x12StoreAppendRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x03\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x0e\n\x06\x64igest\x18\x06 \x01(\x0c\x12\x0f\n\x07records\x18\x07 \x03(\x0c"O\n\x13StoreAppendResponse\x12\x16\n\x0e\x66irst_position\x18\x01 \x01(\t\x12\x15\n\rlast_position\x18\x02 \x01(\tJ\x04\x08\x03\x10\x04R\x03\x61rm"\xab\x01\n\x10StoreReadRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t\x12\x16\n\x0e\x61\x66ter_position\x18\x03 \x01(\t\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x05 \x01(\rJ\x04\x08\x06\x10\x07R\x03\x61rm"0\n\x0cStoredRecord\x12\x10\n\x08position\x18\x01 \x01(\t\x12\x0e\n\x06record\x18\x02 \x01(\x0c"\x8d\x01\n\x11StoreReadResponse\x12.\n\x07records\x18\x01 \x03(\x0b\x32\x1d.coresdk.streams.StoredRecord\x12\x0e\n\x06\x63losed\x18\x02 \x01(\x08\x12+\n\x05\x63lose\x18\x04 \x01(\x0b\x32\x1c.coresdk.streams.StoredCloseJ\x04\x08\x03\x10\x04R\x05\x61rmed"L\n\x12StoreLatestRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t"\'\n\x13StoreLatestResponse\x12\x10\n\x08position\x18\x01 \x01(\t"\xf6\x03\n\x1aPublishWorkflowTaskRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x05 \x01(\t\x12\x0e\n\x06run_id\x18\x06 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x07 \x01(\t\x12\x0c\n\x04\x63ron\x18\x08 \x01(\x08\x12\x18\n\x10has_retry_policy\x18\t \x01(\x08\x12\x1d\n\x15task_started_event_id\x18\n \x01(\x03\x12\x17\n\x0f\x66\x61iled_attempts\x18\x0b \x01(\r\x12#\n\x1b\x63ompleted_started_event_ids\x18\x0c \x03(\x03\x12.\n\x07records\x18\r \x03(\x0b\x32\x1d.coresdk.streams.OutputRecord\x12\x42\n\x10terminal_command\x18\x0e \x01(\x0e\x32(.coresdk.streams.WorkflowTerminalCommand\x12I\n\x19resolved_owner_activities\x18\x0f \x03(\x0b\x32&.coresdk.streams.ResolvedOwnerActivity"\x9a\x01\n\x15ResolvedOwnerActivity\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12\x39\n\x07outcome\x18\x02 \x01(\x0e\x32(.coresdk.streams.ResolvedActivityOutcome\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x01\n\x0cOutputRecord\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x37\n\x04kind\x18\x02 \x01(\x0e\x32).temporal.sdk.streams.v1.StreamRecordKind\x12-\n\x04\x62ody\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x31\n\x04link\x18\x05 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink"5\n\x1bPublishWorkflowTaskResponse\x12\x16\n\x0e\x64ropped_topics\x18\x01 \x03(\t"Y\n\x11RunEvictedRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12!\n\x19workflow_execution_ending\x18\x03 \x01(\x08"\x14\n\x12RunEvictedResponse"*\n\x15ShutdownWorkerRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t"\x18\n\x16ShutdownWorkerResponse*\x9d\x01\n\x0fStreamOwnerKind\x12!\n\x1dSTREAM_OWNER_KIND_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSTREAM_OWNER_KIND_WORKFLOW\x10\x01\x12\x1e\n\x1aSTREAM_OWNER_KIND_ACTIVITY\x10\x02\x12\'\n#STREAM_OWNER_KIND_WORKFLOW_ACTIVITY\x10\x03*\xbe\x04\n\x11StreamFailureKind\x12#\n\x1fSTREAM_FAILURE_KIND_UNSPECIFIED\x10\x00\x12*\n&STREAM_FAILURE_KIND_PRODUCER_DIVERGENT\x10\x01\x12&\n"STREAM_FAILURE_KIND_PRODUCER_STALE\x10\x02\x12\'\n#STREAM_FAILURE_KIND_OUTCOME_UNKNOWN\x10\x03\x12\x1f\n\x1bSTREAM_FAILURE_KIND_REFUSED\x10\x04\x12\x1e\n\x1aSTREAM_FAILURE_KIND_CLOSED\x10\x05\x12\x1e\n\x1aSTREAM_FAILURE_KIND_CURSOR\x10\x06\x12\x1f\n\x1bSTREAM_FAILURE_KIND_EXPIRED\x10\x07\x12!\n\x1dSTREAM_FAILURE_KIND_NOT_FOUND\x10\x08\x12\x1e\n\x1aSTREAM_FAILURE_KIND_RECORD\x10\t\x12\x1f\n\x1bSTREAM_FAILURE_KIND_STORAGE\x10\n\x12#\n\x1fSTREAM_FAILURE_KIND_UNSUPPORTED\x10\x0b\x12(\n$STREAM_FAILURE_KIND_INVALID_ARGUMENT\x10\x0c\x12\'\n#STREAM_FAILURE_KIND_REPLAY_MISMATCH\x10\r\x12)\n%STREAM_FAILURE_KIND_REPLAY_RANGE_LOST\x10\x0e*\xbc\x01\n\x17ResolvedActivityOutcome\x12)\n%RESOLVED_ACTIVITY_OUTCOME_UNSPECIFIED\x10\x00\x12\'\n#RESOLVED_ACTIVITY_OUTCOME_COMPLETED\x10\x01\x12$\n RESOLVED_ACTIVITY_OUTCOME_FAILED\x10\x02\x12\'\n#RESOLVED_ACTIVITY_OUTCOME_CANCELLED\x10\x03*\xe5\x01\n\x17WorkflowTerminalCommand\x12)\n%WORKFLOW_TERMINAL_COMMAND_UNSPECIFIED\x10\x00\x12&\n"WORKFLOW_TERMINAL_COMMAND_COMPLETE\x10\x01\x12"\n\x1eWORKFLOW_TERMINAL_COMMAND_FAIL\x10\x02\x12$\n WORKFLOW_TERMINAL_COMMAND_CANCEL\x10\x03\x12-\n)WORKFLOW_TERMINAL_COMMAND_CONTINUE_AS_NEW\x10\x04\x32\xd8\x0e\n\rStreamService\x12I\n\x06\x41ppend\x12\x1e.coresdk.streams.AppendRequest\x1a\x1f.coresdk.streams.AppendResponse\x12\x43\n\x04Read\x12\x1c.coresdk.streams.ReadRequest\x1a\x1d.coresdk.streams.ReadResponse\x12I\n\x06Latest\x12\x1e.coresdk.streams.LatestRequest\x1a\x1f.coresdk.streams.LatestResponse\x12\x46\n\x05\x43lose\x12\x1d.coresdk.streams.CloseRequest\x1a\x1e.coresdk.streams.CloseResponse\x12X\n\x0b\x44\x65leteOwner\x12#.coresdk.streams.DeleteOwnerRequest\x1a$.coresdk.streams.DeleteOwnerResponse\x12\x61\n\x0eRetireProducer\x12&.coresdk.streams.RetireProducerRequest\x1a\'.coresdk.streams.RetireProducerResponse\x12m\n\x12\x46lushNotifications\x12*.coresdk.streams.FlushNotificationsRequest\x1a+.coresdk.streams.FlushNotificationsResponse\x12R\n\tSubscribe\x12!.coresdk.streams.SubscribeRequest\x1a".coresdk.streams.SubscribeResponse\x12X\n\x0bUnsubscribe\x12#.coresdk.streams.UnsubscribeRequest\x1a$.coresdk.streams.UnsubscribeResponse\x12p\n\x13WaitForNotification\x12+.coresdk.streams.WaitForNotificationRequest\x1a,.coresdk.streams.WaitForNotificationResponse\x12\x99\x01\n\x16\x44\x65scribeStreamNotifier\x12>.temporal.api.workflowservice.v1.DescribeStreamNotifierRequest\x1a?.temporal.api.workflowservice.v1.DescribeStreamNotifierResponse\x12\x64\n\x0fRunStreamDriver\x12\'.coresdk.streams.RunStreamDriverRequest\x1a(.coresdk.streams.RunStreamDriverResponse\x12M\n\tReadRange\x12!.coresdk.streams.ReadRangeRequest\x1a\x1d.coresdk.streams.ReadResponse\x12[\n\x0cReleaseFloor\x12$.coresdk.streams.ReleaseFloorRequest\x1a%.coresdk.streams.ReleaseFloorResponse\x12I\n\x06\x46ollow\x12\x1e.coresdk.streams.FollowRequest\x1a\x1f.coresdk.streams.FollowResponse\x12S\n\x0b\x46ollowRange\x12#.coresdk.streams.FollowRangeRequest\x1a\x1f.coresdk.streams.FollowResponse\x12^\n\rDescribeStore\x12%.coresdk.streams.DescribeStoreRequest\x1a&.coresdk.streams.DescribeStoreResponse\x12p\n\x13PublishWorkflowTask\x12+.coresdk.streams.PublishWorkflowTaskRequest\x1a,.coresdk.streams.PublishWorkflowTaskResponse\x12U\n\nRunEvicted\x12".coresdk.streams.RunEvictedRequest\x1a#.coresdk.streams.RunEvictedResponse\x12\x61\n\x0eShutdownWorker\x12&.coresdk.streams.ShutdownWorkerRequest\x1a\'.coresdk.streams.ShutdownWorkerResponseB-\xea\x02*Temporalio::Internal::Bridge::Api::Streamsb\x06proto3' + b'\n\'temporal/sdk/core/streams/streams.proto\x12\x0f\x63oresdk.streams\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a%temporal/sdk/streams/v1/message.proto\x1a=temporal/api/workflowservice/v1/stream_request_response.proto"\x8d\x03\n\x11StreamStoreConfig\x12\x32\n\x05redis\x18\x01 \x01(\x0b\x32!.coresdk.streams.RedisStoreConfigH\x00\x12\x34\n\x06memory\x18\x02 \x01(\x0b\x32".coresdk.streams.MemoryStoreConfigH\x00\x12\x38\n\x08postgres\x18\t \x01(\x0b\x32$.coresdk.streams.PostgresStoreConfigH\x00\x12\x18\n\x10notify_on_append\x18\x03 \x01(\x08\x12\x15\n\rmax_notifiers\x18\x04 \x01(\r\x12\x34\n\x11owner_start_grace\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notification_log\x18\x07 \x01(\x08\x12/\n\x07\x61rchive\x18\x08 \x01(\x0b\x32\x1e.coresdk.streams.ArchiveConfigB\x07\n\x05storeJ\x04\x08\x05\x10\x06R\x13notify_every_append"\x94\x01\n\rArchiveConfig\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x15\n\rsegment_bytes\x18\x02 \x01(\x04\x12/\n\x0csegment_idle\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0bstall_limit\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration"\xda\x02\n\x10RedisStoreConfig\x12\x0c\n\x04urls\x18\x01 \x03(\t\x12\x0f\n\x07\x63luster\x18\x02 \x01(\x08\x12\x12\n\nkey_prefix\x18\x03 \x01(\t\x12,\n\tretention\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x1f\n\x17\x62locking_reads_per_node\x18\x05 \x01(\r\x12\x33\n\x10response_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0b\x66loor_lease\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x36\n\x13\x66loor_release_grace\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notify_doorbells\x18\t \x01(\r\x12\r\n\x05plain\x18\n \x01(\x08"\xda\x03\n\x13PostgresStoreConfig\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12,\n\tretention\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x17\n\x0fmax_connections\x18\x04 \x01(\r\x12\x33\n\x10response_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x0b\x66loor_lease\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x36\n\x13\x66loor_release_grace\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10notify_doorbells\x18\x08 \x01(\r\x12\x12\n\nlisten_url\x18\t \x01(\t\x12\x30\n\rpoll_interval\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x14\n\x0cnotify_reads\x18\x0b \x01(\x08\x12\x17\n\x0fskip_migrations\x18\x0c \x01(\x08\x12\x33\n\x10janitor_interval\x18\r \x01(\x0b\x32\x19.google.protobuf.Duration"M\n\x11MemoryStoreConfig\x12\x38\n\x0c\x63\x61pabilities\x18\x01 \x01(\x0b\x32".coresdk.streams.StoreCapabilities"\xa1\x01\n\rStreamAddress\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x34\n\nowner_kind\x18\x02 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\r\n\x05topic\x18\x05 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t"\x92\x01\n\x07\x43hainId\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_run_id\x18\x03 \x01(\t\x12\x34\n\nowner_kind\x18\x04 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0b\x61\x63tivity_id\x18\x05 \x01(\t"y\n\rNamedProducer\x12\x13\n\x0bproducer_id\x18\x01 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x02 \x01(\x03\x12\x1d\n\x15task_started_event_id\x18\x03 \x01(\x03\x12#\n\x1b\x63ompleted_started_event_ids\x18\x04 \x03(\x03"\x97\x01\n\x10\x41\x63tivityProducer\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x38\n\x14\x61ttempt_started_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xbf\x01\n\x0c\x41ppendRecord\x12\x37\n\x04kind\x18\x01 \x01(\x0e\x32).temporal.sdk.streams.v1.StreamRecordKind\x12-\n\x04\x62ody\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x14\n\x0c\x63ontent_hash\x18\x03 \x01(\x0c\x12\x31\n\x04link\x18\x04 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink"\x85\x02\n\rAppendRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x05named\x18\x02 \x01(\x0b\x32\x1e.coresdk.streams.NamedProducerH\x00\x12\x35\n\x08\x61\x63tivity\x18\x03 \x01(\x0b\x32!.coresdk.streams.ActivityProducerH\x00\x12\x10\n\x08sequence\x18\x04 \x01(\x03\x12.\n\x07records\x18\x05 \x03(\x0b\x32\x1d.coresdk.streams.AppendRecord\x12\x0e\n\x06\x64igest\x18\x06 \x01(\x0c\x42\n\n\x08producer";\n\x0e\x41ppendResponse\x12\x14\n\x0c\x66irst_cursor\x18\x01 \x01(\t\x12\x13\n\x0blast_cursor\x18\x02 \x01(\t"\x82\x02\n\x0bReadRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\r\n\x05\x61\x66ter\x18\x02 \x01(\t\x12\'\n\x04wait\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x04 \x01(\r\x12\r\n\x05state\x18\x05 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x07 \x01(\t\x12\x33\n\nsubscriber\x18\x08 \x01(\x0b\x32\x1f.coresdk.streams.ReadSubscriber\x12\x11\n\tmax_bytes\x18\t \x01(\x04J\x04\x08\x06\x10\x07R\x03\x61rm"b\n\x0eReadSubscriber\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"]\n\x0cSupersession\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x13\n\x0bproducer_id\x18\x02 \x01(\t\x12\x18\n\x10previous_attempt\x18\x03 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x03"\xa3\x01\n\nReadRecord\x12\x0e\n\x06\x63ursor\x18\x01 \x01(\t\x12\x37\n\x06stored\x18\x02 \x01(\x0b\x32%.temporal.sdk.streams.v1.StreamRecordH\x00\x12\x33\n\nsuperseded\x18\x03 \x01(\x0b\x32\x1d.coresdk.streams.SupersessionH\x00\x12\r\n\x05stale\x18\x04 \x01(\x08\x42\x08\n\x06record"\xd7\x02\n\x0cReadResponse\x12,\n\x07records\x18\x01 \x03(\x0b\x32\x1b.coresdk.streams.ReadRecord\x12\x0e\n\x06\x63ursor\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x0c\x12\x0c\n\x04\x64one\x18\x04 \x01(\x08\x12\x12\n\nwake_after\x18\x06 \x01(\x03\x12\x35\n\x0c\x63lose_result\x18\x07 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x08 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\t \x01(\t\x12\x16\n\x0erecords_digest\x18\n \x01(\x0c\x12\x1a\n\x12\x63hain_first_run_id\x18\x0b \x01(\t\x12\x14\n\x0cstart_cursor\x18\x0c \x01(\tJ\x04\x08\x05\x10\x06R\x05\x61rmed"\xe6\x01\n\x10ReadRangeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\r\n\x05\x61\x66ter\x18\x03 \x01(\t\x12\n\n\x02to\x18\x04 \x01(\t\x12\x16\n\x0estored_records\x18\x05 \x01(\r\x12\r\n\x05state\x18\x06 \x01(\x0c\x12\x16\n\x0erecords_digest\x18\x07 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x08 \x01(\t\x12\x16\n\x0estart_from_end\x18\t \x01(\x08"w\n\x13ReleaseFloorRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66loor_holder\x18\x03 \x01(\t"\x16\n\x14ReleaseFloorResponse"\x8d\x02\n\rFollowRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\r\n\x05\x61\x66ter\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x0c\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x05 \x01(\r\x12\x11\n\tmax_depth\x18\x06 \x01(\r\x12\x10\n\x08max_open\x18\x07 \x01(\r\x12\x14\n\x0c\x66loor_holder\x18\x08 \x01(\t\x12\x35\n\nsubscriber\x18\t \x01(\x0b\x32!.coresdk.streams.FollowSubscriber"h\n\x10\x46ollowSubscriber\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1b\n\x13subscription_prefix\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"\x89\x01\n\x0e\x46ollowedRecord\x12\x0e\n\x06source\x18\x01 \x01(\r\x12-\n\x06record\x18\x02 \x01(\x0b\x32\x1b.coresdk.streams.ReadRecordH\x00\x12\x30\n\nlink_state\x18\x03 \x01(\x0b\x32\x1a.coresdk.streams.LinkStateH\x00\x42\x06\n\x04item"\x82\x03\n\tLinkState\x12-\n\x04kind\x18\x01 \x01(\x0e\x32\x1f.coresdk.streams.LinkState.Kind\x12\x31\n\x04link\x18\x02 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink\x12\x35\n\x0c\x63lose_result\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12-\n\x05\x65rror\x18\x05 \x01(\x0b\x32\x1e.coresdk.streams.StreamFailure\x12\x0e\n\x06reason\x18\x06 \x01(\t"d\n\x04Kind\x12\x14\n\x10KIND_UNSPECIFIED\x10\x00\x12\x0f\n\x0bKIND_OPENED\x10\x01\x12\r\n\tKIND_DONE\x10\x02\x12\x14\n\x10KIND_UNAVAILABLE\x10\x03\x12\x10\n\x0cKIND_SKIPPED\x10\x04"{\n\x0c\x46ollowSource\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x0e\n\x06parent\x18\x02 \x01(\r\x12\r\n\x05\x64\x65pth\x18\x03 \x01(\r\x12.\n\x06stream\x18\x04 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x0c\n\x04name\x18\x05 \x01(\t"\xe6\x02\n\x0bSourceRange\x12\x0e\n\x06source\x18\x01 \x01(\r\x12\x1a\n\x12\x63hain_first_run_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_cursor\x18\x03 \x01(\t\x12\x0e\n\x06\x63ursor\x18\x04 \x01(\t\x12\x16\n\x0estored_records\x18\x05 \x01(\r\x12\x10\n\x08state_in\x18\x06 \x01(\x0c\x12\x16\n\x0erecords_digest\x18\x07 \x01(\x0c\x12\x16\n\x0estart_from_end\x18\x08 \x01(\x08\x12\x0c\n\x04\x64one\x18\t \x01(\x08\x12\x35\n\x0c\x63lose_result\x18\n \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12-\n\x05\x65rror\x18\x0c \x01(\x0b\x32\x1e.coresdk.streams.StreamFailure"I\n\nSourceWake\x12\x0e\n\x06source\x18\x01 \x01(\r\x12\x17\n\x0fsubscription_id\x18\x02 \x01(\t\x12\x12\n\nwake_after\x18\x03 \x01(\x03"\xf0\x02\n\x0e\x46ollowResponse\x12\x30\n\x07records\x18\x01 \x03(\x0b\x32\x1f.coresdk.streams.FollowedRecord\x12\r\n\x05state\x18\x02 \x01(\x0c\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12.\n\x07sources\x18\x04 \x03(\x0b\x32\x1d.coresdk.streams.FollowSource\x12,\n\x06ranges\x18\x05 \x03(\x0b\x32\x1c.coresdk.streams.SourceRange\x12*\n\x05wakes\x18\x06 \x03(\x0b\x32\x1b.coresdk.streams.SourceWake\x12\x35\n\x0c\x63lose_result\x18\x07 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x08 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x15\n\rfollow_digest\x18\t \x01(\x0c"\xd6\x01\n\x12\x46ollowRangeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x10\n\x08state_in\x18\x02 \x01(\x0c\x12,\n\x06ranges\x18\x03 \x03(\x0b\x32\x1c.coresdk.streams.SourceRange\x12\x15\n\rfollow_digest\x18\x04 \x01(\x0c\x12\x14\n\x0c\x66loor_holder\x18\x05 \x01(\t\x12\x11\n\tmax_depth\x18\x06 \x01(\r\x12\x10\n\x08max_open\x18\x07 \x01(\r"?\n\rLatestRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress" \n\x0eLatestResponse\x12\x0e\n\x06\x63ursor\x18\x01 \x01(\t"\xb5\x01\n\x0c\x43loseRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\x04 \x01(\t"\x84\x01\n\x0bStoredClose\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tclosed_by\x18\x03 \x01(\t"\x0f\n\rCloseResponse"\x1b\n\x19\x46lushNotificationsRequest"\x1c\n\x1a\x46lushNotificationsResponse"\x94\x01\n\x10SubscribeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x04 \x01(\t\x12\x12\n\ngeneration\x18\x05 \x01(\r"Y\n\x11SubscribeResponse\x12\x1a\n\x12\x63hain_first_run_id\x18\x01 \x01(\t\x12\x10\n\x08\x61ttached\x18\x02 \x01(\x08\x12\x16\n\x0enewest_counter\x18\x03 \x01(\x03"\x81\x01\n\x12UnsubscribeRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x17\n\x0fsubscription_id\x18\x03 \x01(\t\x12\x12\n\ngeneration\x18\x04 \x01(\r"\x15\n\x13UnsubscribeResponse"c\n\x1aWaitForNotificationRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12\x15\n\rafter_counter\x18\x02 \x01(\x03"\xd3\x01\n\x1bWaitForNotificationResponse\x12\x0f\n\x07\x63ounter\x18\x01 \x01(\x03\x12\x10\n\x08position\x18\x02 \x01(\t\x12\x11\n\ttimed_out\x18\x03 \x01(\x08\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_result\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\rclose_failure\x18\x06 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x9b\x01\n\x16RunStreamDriverRequest\x12\x10\n\x08\x63onsumer\x18\x01 \x01(\t\x12\x31\n\x0esweep_interval\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12-\n\nclaim_idle\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\r\n\x05\x62\x61tch\x18\x04 \x01(\r"\x19\n\x17RunStreamDriverResponse"\x87\x01\n\x12\x44\x65leteOwnerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x34\n\nowner_kind\x18\x02 \x01(\x0e\x32 .coresdk.streams.StreamOwnerKind\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t"&\n\x13\x44\x65leteOwnerResponse\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x04"\xbb\x01\n\x15RetireProducerRequest\x12.\n\x06stream\x18\x01 \x01(\x0b\x32\x1e.coresdk.streams.StreamAddress\x12/\n\x05named\x18\x02 \x01(\x0b\x32\x1e.coresdk.streams.NamedProducerH\x00\x12\x35\n\x08\x61\x63tivity\x18\x03 \x01(\x0b\x32!.coresdk.streams.ActivityProducerH\x00\x42\n\n\x08producer"\x18\n\x16RetireProducerResponse"\x16\n\x14\x44\x65scribeStoreRequest"_\n\x15\x44\x65scribeStoreResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32".coresdk.streams.StoreCapabilities"\xc1\x02\n\x11StoreCapabilities\x12\x16\n\x0eproducer_state\x18\x01 \x01(\x08\x12\x11\n\tkept_last\x18\x04 \x01(\x08\x12\r\n\x05holds\x18\x05 \x01(\x08\x12\x13\n\x0b\x63hange_feed\x18\x06 \x01(\x08\x12\x12\n\ncheap_logs\x18\x07 \x01(\x08\x12\x14\n\x0c\x64\x65lete_owner\x18\x08 \x01(\x08\x12\x15\n\rtopic_listing\x18\t \x01(\x08\x12\x11\n\tlong_poll\x18\n \x01(\x08\x12\x17\n\x0f\x64\x65nse_positions\x18\x0b \x01(\x08\x12\x31\n\x0ereplay_horizon\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10max_record_bytes\x18\r \x01(\x04\x12\x17\n\x0fmax_batch_bytes\x18\x0e \x01(\x04J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"u\n\rStreamFailure\x12\x30\n\x04kind\x18\x01 \x01(\x0e\x32".coresdk.streams.StreamFailureKind\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0e\n\x06\x63ursor\x18\x03 \x01(\t\x12\x11\n\tclosed_by\x18\x04 \x01(\t"\xa5\x01\n\x12StoreAppendRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x03\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x0e\n\x06\x64igest\x18\x06 \x01(\x0c\x12\x0f\n\x07records\x18\x07 \x03(\x0c"O\n\x13StoreAppendResponse\x12\x16\n\x0e\x66irst_position\x18\x01 \x01(\t\x12\x15\n\rlast_position\x18\x02 \x01(\tJ\x04\x08\x03\x10\x04R\x03\x61rm"\xab\x01\n\x10StoreReadRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t\x12\x16\n\x0e\x61\x66ter_position\x18\x03 \x01(\t\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bmax_records\x18\x05 \x01(\rJ\x04\x08\x06\x10\x07R\x03\x61rm"0\n\x0cStoredRecord\x12\x10\n\x08position\x18\x01 \x01(\t\x12\x0e\n\x06record\x18\x02 \x01(\x0c"\x8d\x01\n\x11StoreReadResponse\x12.\n\x07records\x18\x01 \x03(\x0b\x32\x1d.coresdk.streams.StoredRecord\x12\x0e\n\x06\x63losed\x18\x02 \x01(\x08\x12+\n\x05\x63lose\x18\x04 \x01(\x0b\x32\x1c.coresdk.streams.StoredCloseJ\x04\x08\x03\x10\x04R\x05\x61rmed"L\n\x12StoreLatestRequest\x12\'\n\x05\x63hain\x18\x01 \x01(\x0b\x32\x18.coresdk.streams.ChainId\x12\r\n\x05topic\x18\x02 \x01(\t"\'\n\x13StoreLatestResponse\x12\x10\n\x08position\x18\x01 \x01(\t"\xf6\x03\n\x1aPublishWorkflowTaskRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tworker_id\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x05 \x01(\t\x12\x0e\n\x06run_id\x18\x06 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x07 \x01(\t\x12\x0c\n\x04\x63ron\x18\x08 \x01(\x08\x12\x18\n\x10has_retry_policy\x18\t \x01(\x08\x12\x1d\n\x15task_started_event_id\x18\n \x01(\x03\x12\x17\n\x0f\x66\x61iled_attempts\x18\x0b \x01(\r\x12#\n\x1b\x63ompleted_started_event_ids\x18\x0c \x03(\x03\x12.\n\x07records\x18\r \x03(\x0b\x32\x1d.coresdk.streams.OutputRecord\x12\x42\n\x10terminal_command\x18\x0e \x01(\x0e\x32(.coresdk.streams.WorkflowTerminalCommand\x12I\n\x19resolved_owner_activities\x18\x0f \x03(\x0b\x32&.coresdk.streams.ResolvedOwnerActivity"\x9a\x01\n\x15ResolvedOwnerActivity\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12\x39\n\x07outcome\x18\x02 \x01(\x0e\x32(.coresdk.streams.ResolvedActivityOutcome\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x01\n\x0cOutputRecord\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x37\n\x04kind\x18\x02 \x01(\x0e\x32).temporal.sdk.streams.v1.StreamRecordKind\x12-\n\x04\x62ody\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x31\n\x04link\x18\x05 \x01(\x0b\x32#.temporal.sdk.streams.v1.StreamLink"5\n\x1bPublishWorkflowTaskResponse\x12\x16\n\x0e\x64ropped_topics\x18\x01 \x03(\t"Y\n\x11RunEvictedRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12!\n\x19workflow_execution_ending\x18\x03 \x01(\x08"\x14\n\x12RunEvictedResponse"*\n\x15ShutdownWorkerRequest\x12\x11\n\tworker_id\x18\x01 \x01(\t"\x18\n\x16ShutdownWorkerResponse*\x9d\x01\n\x0fStreamOwnerKind\x12!\n\x1dSTREAM_OWNER_KIND_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSTREAM_OWNER_KIND_WORKFLOW\x10\x01\x12\x1e\n\x1aSTREAM_OWNER_KIND_ACTIVITY\x10\x02\x12\'\n#STREAM_OWNER_KIND_WORKFLOW_ACTIVITY\x10\x03*\xbe\x04\n\x11StreamFailureKind\x12#\n\x1fSTREAM_FAILURE_KIND_UNSPECIFIED\x10\x00\x12*\n&STREAM_FAILURE_KIND_PRODUCER_DIVERGENT\x10\x01\x12&\n"STREAM_FAILURE_KIND_PRODUCER_STALE\x10\x02\x12\'\n#STREAM_FAILURE_KIND_OUTCOME_UNKNOWN\x10\x03\x12\x1f\n\x1bSTREAM_FAILURE_KIND_REFUSED\x10\x04\x12\x1e\n\x1aSTREAM_FAILURE_KIND_CLOSED\x10\x05\x12\x1e\n\x1aSTREAM_FAILURE_KIND_CURSOR\x10\x06\x12\x1f\n\x1bSTREAM_FAILURE_KIND_EXPIRED\x10\x07\x12!\n\x1dSTREAM_FAILURE_KIND_NOT_FOUND\x10\x08\x12\x1e\n\x1aSTREAM_FAILURE_KIND_RECORD\x10\t\x12\x1f\n\x1bSTREAM_FAILURE_KIND_STORAGE\x10\n\x12#\n\x1fSTREAM_FAILURE_KIND_UNSUPPORTED\x10\x0b\x12(\n$STREAM_FAILURE_KIND_INVALID_ARGUMENT\x10\x0c\x12\'\n#STREAM_FAILURE_KIND_REPLAY_MISMATCH\x10\r\x12)\n%STREAM_FAILURE_KIND_REPLAY_RANGE_LOST\x10\x0e*\xbc\x01\n\x17ResolvedActivityOutcome\x12)\n%RESOLVED_ACTIVITY_OUTCOME_UNSPECIFIED\x10\x00\x12\'\n#RESOLVED_ACTIVITY_OUTCOME_COMPLETED\x10\x01\x12$\n RESOLVED_ACTIVITY_OUTCOME_FAILED\x10\x02\x12\'\n#RESOLVED_ACTIVITY_OUTCOME_CANCELLED\x10\x03*\xe5\x01\n\x17WorkflowTerminalCommand\x12)\n%WORKFLOW_TERMINAL_COMMAND_UNSPECIFIED\x10\x00\x12&\n"WORKFLOW_TERMINAL_COMMAND_COMPLETE\x10\x01\x12"\n\x1eWORKFLOW_TERMINAL_COMMAND_FAIL\x10\x02\x12$\n WORKFLOW_TERMINAL_COMMAND_CANCEL\x10\x03\x12-\n)WORKFLOW_TERMINAL_COMMAND_CONTINUE_AS_NEW\x10\x04\x32\xd8\x0e\n\rStreamService\x12I\n\x06\x41ppend\x12\x1e.coresdk.streams.AppendRequest\x1a\x1f.coresdk.streams.AppendResponse\x12\x43\n\x04Read\x12\x1c.coresdk.streams.ReadRequest\x1a\x1d.coresdk.streams.ReadResponse\x12I\n\x06Latest\x12\x1e.coresdk.streams.LatestRequest\x1a\x1f.coresdk.streams.LatestResponse\x12\x46\n\x05\x43lose\x12\x1d.coresdk.streams.CloseRequest\x1a\x1e.coresdk.streams.CloseResponse\x12X\n\x0b\x44\x65leteOwner\x12#.coresdk.streams.DeleteOwnerRequest\x1a$.coresdk.streams.DeleteOwnerResponse\x12\x61\n\x0eRetireProducer\x12&.coresdk.streams.RetireProducerRequest\x1a\'.coresdk.streams.RetireProducerResponse\x12m\n\x12\x46lushNotifications\x12*.coresdk.streams.FlushNotificationsRequest\x1a+.coresdk.streams.FlushNotificationsResponse\x12R\n\tSubscribe\x12!.coresdk.streams.SubscribeRequest\x1a".coresdk.streams.SubscribeResponse\x12X\n\x0bUnsubscribe\x12#.coresdk.streams.UnsubscribeRequest\x1a$.coresdk.streams.UnsubscribeResponse\x12p\n\x13WaitForNotification\x12+.coresdk.streams.WaitForNotificationRequest\x1a,.coresdk.streams.WaitForNotificationResponse\x12\x99\x01\n\x16\x44\x65scribeStreamNotifier\x12>.temporal.api.workflowservice.v1.DescribeStreamNotifierRequest\x1a?.temporal.api.workflowservice.v1.DescribeStreamNotifierResponse\x12\x64\n\x0fRunStreamDriver\x12\'.coresdk.streams.RunStreamDriverRequest\x1a(.coresdk.streams.RunStreamDriverResponse\x12M\n\tReadRange\x12!.coresdk.streams.ReadRangeRequest\x1a\x1d.coresdk.streams.ReadResponse\x12[\n\x0cReleaseFloor\x12$.coresdk.streams.ReleaseFloorRequest\x1a%.coresdk.streams.ReleaseFloorResponse\x12I\n\x06\x46ollow\x12\x1e.coresdk.streams.FollowRequest\x1a\x1f.coresdk.streams.FollowResponse\x12S\n\x0b\x46ollowRange\x12#.coresdk.streams.FollowRangeRequest\x1a\x1f.coresdk.streams.FollowResponse\x12^\n\rDescribeStore\x12%.coresdk.streams.DescribeStoreRequest\x1a&.coresdk.streams.DescribeStoreResponse\x12p\n\x13PublishWorkflowTask\x12+.coresdk.streams.PublishWorkflowTaskRequest\x1a,.coresdk.streams.PublishWorkflowTaskResponse\x12U\n\nRunEvicted\x12".coresdk.streams.RunEvictedRequest\x1a#.coresdk.streams.RunEvictedResponse\x12\x61\n\x0eShutdownWorker\x12&.coresdk.streams.ShutdownWorkerRequest\x1a\'.coresdk.streams.ShutdownWorkerResponseB-\xea\x02*Temporalio::Internal::Bridge::Api::Streamsb\x06proto3' ) _STREAMOWNERKIND = DESCRIPTOR.enum_types_by_name["StreamOwnerKind"] @@ -896,14 +896,14 @@ DESCRIPTOR._serialized_options = ( b"\352\002*Temporalio::Internal::Bridge::Api::Streams" ) - _STREAMOWNERKIND._serialized_start = 10398 - _STREAMOWNERKIND._serialized_end = 10555 - _STREAMFAILUREKIND._serialized_start = 10558 - _STREAMFAILUREKIND._serialized_end = 11132 - _RESOLVEDACTIVITYOUTCOME._serialized_start = 11135 - _RESOLVEDACTIVITYOUTCOME._serialized_end = 11323 - _WORKFLOWTERMINALCOMMAND._serialized_start = 11326 - _WORKFLOWTERMINALCOMMAND._serialized_end = 11555 + _STREAMOWNERKIND._serialized_start = 10466 + _STREAMOWNERKIND._serialized_end = 10623 + _STREAMFAILUREKIND._serialized_start = 10626 + _STREAMFAILUREKIND._serialized_end = 11200 + _RESOLVEDACTIVITYOUTCOME._serialized_start = 11203 + _RESOLVEDACTIVITYOUTCOME._serialized_end = 11391 + _WORKFLOWTERMINALCOMMAND._serialized_start = 11394 + _WORKFLOWTERMINALCOMMAND._serialized_end = 11623 _STREAMSTORECONFIG._serialized_start = 305 _STREAMSTORECONFIG._serialized_end = 702 _ARCHIVECONFIG._serialized_start = 705 @@ -919,127 +919,127 @@ _CHAINID._serialized_start = 1925 _CHAINID._serialized_end = 2071 _NAMEDPRODUCER._serialized_start = 2073 - _NAMEDPRODUCER._serialized_end = 2126 - _ACTIVITYPRODUCER._serialized_start = 2129 - _ACTIVITYPRODUCER._serialized_end = 2280 - _APPENDRECORD._serialized_start = 2283 - _APPENDRECORD._serialized_end = 2474 - _APPENDREQUEST._serialized_start = 2477 - _APPENDREQUEST._serialized_end = 2738 - _APPENDRESPONSE._serialized_start = 2740 - _APPENDRESPONSE._serialized_end = 2799 - _READREQUEST._serialized_start = 2802 - _READREQUEST._serialized_end = 3060 - _READSUBSCRIBER._serialized_start = 3062 - _READSUBSCRIBER._serialized_end = 3160 - _SUPERSESSION._serialized_start = 3162 - _SUPERSESSION._serialized_end = 3255 - _READRECORD._serialized_start = 3258 - _READRECORD._serialized_end = 3421 - _READRESPONSE._serialized_start = 3424 - _READRESPONSE._serialized_end = 3767 - _READRANGEREQUEST._serialized_start = 3770 - _READRANGEREQUEST._serialized_end = 4000 - _RELEASEFLOORREQUEST._serialized_start = 4002 - _RELEASEFLOORREQUEST._serialized_end = 4121 - _RELEASEFLOORRESPONSE._serialized_start = 4123 - _RELEASEFLOORRESPONSE._serialized_end = 4145 - _FOLLOWREQUEST._serialized_start = 4148 - _FOLLOWREQUEST._serialized_end = 4417 - _FOLLOWSUBSCRIBER._serialized_start = 4419 - _FOLLOWSUBSCRIBER._serialized_end = 4523 - _FOLLOWEDRECORD._serialized_start = 4526 - _FOLLOWEDRECORD._serialized_end = 4663 - _LINKSTATE._serialized_start = 4666 - _LINKSTATE._serialized_end = 5052 - _LINKSTATE_KIND._serialized_start = 4952 - _LINKSTATE_KIND._serialized_end = 5052 - _FOLLOWSOURCE._serialized_start = 5054 - _FOLLOWSOURCE._serialized_end = 5177 - _SOURCERANGE._serialized_start = 5180 - _SOURCERANGE._serialized_end = 5538 - _SOURCEWAKE._serialized_start = 5540 - _SOURCEWAKE._serialized_end = 5613 - _FOLLOWRESPONSE._serialized_start = 5616 - _FOLLOWRESPONSE._serialized_end = 5984 - _FOLLOWRANGEREQUEST._serialized_start = 5987 - _FOLLOWRANGEREQUEST._serialized_end = 6201 - _LATESTREQUEST._serialized_start = 6203 - _LATESTREQUEST._serialized_end = 6266 - _LATESTRESPONSE._serialized_start = 6268 - _LATESTRESPONSE._serialized_end = 6300 - _CLOSEREQUEST._serialized_start = 6303 - _CLOSEREQUEST._serialized_end = 6484 - _STOREDCLOSE._serialized_start = 6487 - _STOREDCLOSE._serialized_end = 6619 - _CLOSERESPONSE._serialized_start = 6621 - _CLOSERESPONSE._serialized_end = 6636 - _FLUSHNOTIFICATIONSREQUEST._serialized_start = 6638 - _FLUSHNOTIFICATIONSREQUEST._serialized_end = 6665 - _FLUSHNOTIFICATIONSRESPONSE._serialized_start = 6667 - _FLUSHNOTIFICATIONSRESPONSE._serialized_end = 6695 - _SUBSCRIBEREQUEST._serialized_start = 6698 - _SUBSCRIBEREQUEST._serialized_end = 6846 - _SUBSCRIBERESPONSE._serialized_start = 6848 - _SUBSCRIBERESPONSE._serialized_end = 6937 - _UNSUBSCRIBEREQUEST._serialized_start = 6940 - _UNSUBSCRIBEREQUEST._serialized_end = 7069 - _UNSUBSCRIBERESPONSE._serialized_start = 7071 - _UNSUBSCRIBERESPONSE._serialized_end = 7092 - _WAITFORNOTIFICATIONREQUEST._serialized_start = 7094 - _WAITFORNOTIFICATIONREQUEST._serialized_end = 7193 - _WAITFORNOTIFICATIONRESPONSE._serialized_start = 7196 - _WAITFORNOTIFICATIONRESPONSE._serialized_end = 7407 - _RUNSTREAMDRIVERREQUEST._serialized_start = 7410 - _RUNSTREAMDRIVERREQUEST._serialized_end = 7565 - _RUNSTREAMDRIVERRESPONSE._serialized_start = 7567 - _RUNSTREAMDRIVERRESPONSE._serialized_end = 7592 - _DELETEOWNERREQUEST._serialized_start = 7595 - _DELETEOWNERREQUEST._serialized_end = 7730 - _DELETEOWNERRESPONSE._serialized_start = 7732 - _DELETEOWNERRESPONSE._serialized_end = 7770 - _RETIREPRODUCERREQUEST._serialized_start = 7773 - _RETIREPRODUCERREQUEST._serialized_end = 7960 - _RETIREPRODUCERRESPONSE._serialized_start = 7962 - _RETIREPRODUCERRESPONSE._serialized_end = 7986 - _DESCRIBESTOREREQUEST._serialized_start = 7988 - _DESCRIBESTOREREQUEST._serialized_end = 8010 - _DESCRIBESTORERESPONSE._serialized_start = 8012 - _DESCRIBESTORERESPONSE._serialized_end = 8107 - _STORECAPABILITIES._serialized_start = 8110 - _STORECAPABILITIES._serialized_end = 8431 - _STREAMFAILURE._serialized_start = 8433 - _STREAMFAILURE._serialized_end = 8550 - _STOREAPPENDREQUEST._serialized_start = 8553 - _STOREAPPENDREQUEST._serialized_end = 8718 - _STOREAPPENDRESPONSE._serialized_start = 8720 - _STOREAPPENDRESPONSE._serialized_end = 8799 - _STOREREADREQUEST._serialized_start = 8802 - _STOREREADREQUEST._serialized_end = 8973 - _STOREDRECORD._serialized_start = 8975 - _STOREDRECORD._serialized_end = 9023 - _STOREREADRESPONSE._serialized_start = 9026 - _STOREREADRESPONSE._serialized_end = 9167 - _STORELATESTREQUEST._serialized_start = 9169 - _STORELATESTREQUEST._serialized_end = 9245 - _STORELATESTRESPONSE._serialized_start = 9247 - _STORELATESTRESPONSE._serialized_end = 9286 - _PUBLISHWORKFLOWTASKREQUEST._serialized_start = 9289 - _PUBLISHWORKFLOWTASKREQUEST._serialized_end = 9791 - _RESOLVEDOWNERACTIVITY._serialized_start = 9794 - _RESOLVEDOWNERACTIVITY._serialized_end = 9948 - _OUTPUTRECORD._serialized_start = 9951 - _OUTPUTRECORD._serialized_end = 10157 - _PUBLISHWORKFLOWTASKRESPONSE._serialized_start = 10159 - _PUBLISHWORKFLOWTASKRESPONSE._serialized_end = 10212 - _RUNEVICTEDREQUEST._serialized_start = 10214 - _RUNEVICTEDREQUEST._serialized_end = 10303 - _RUNEVICTEDRESPONSE._serialized_start = 10305 - _RUNEVICTEDRESPONSE._serialized_end = 10325 - _SHUTDOWNWORKERREQUEST._serialized_start = 10327 - _SHUTDOWNWORKERREQUEST._serialized_end = 10369 - _SHUTDOWNWORKERRESPONSE._serialized_start = 10371 - _SHUTDOWNWORKERRESPONSE._serialized_end = 10395 - _STREAMSERVICE._serialized_start = 11558 - _STREAMSERVICE._serialized_end = 13438 + _NAMEDPRODUCER._serialized_end = 2194 + _ACTIVITYPRODUCER._serialized_start = 2197 + _ACTIVITYPRODUCER._serialized_end = 2348 + _APPENDRECORD._serialized_start = 2351 + _APPENDRECORD._serialized_end = 2542 + _APPENDREQUEST._serialized_start = 2545 + _APPENDREQUEST._serialized_end = 2806 + _APPENDRESPONSE._serialized_start = 2808 + _APPENDRESPONSE._serialized_end = 2867 + _READREQUEST._serialized_start = 2870 + _READREQUEST._serialized_end = 3128 + _READSUBSCRIBER._serialized_start = 3130 + _READSUBSCRIBER._serialized_end = 3228 + _SUPERSESSION._serialized_start = 3230 + _SUPERSESSION._serialized_end = 3323 + _READRECORD._serialized_start = 3326 + _READRECORD._serialized_end = 3489 + _READRESPONSE._serialized_start = 3492 + _READRESPONSE._serialized_end = 3835 + _READRANGEREQUEST._serialized_start = 3838 + _READRANGEREQUEST._serialized_end = 4068 + _RELEASEFLOORREQUEST._serialized_start = 4070 + _RELEASEFLOORREQUEST._serialized_end = 4189 + _RELEASEFLOORRESPONSE._serialized_start = 4191 + _RELEASEFLOORRESPONSE._serialized_end = 4213 + _FOLLOWREQUEST._serialized_start = 4216 + _FOLLOWREQUEST._serialized_end = 4485 + _FOLLOWSUBSCRIBER._serialized_start = 4487 + _FOLLOWSUBSCRIBER._serialized_end = 4591 + _FOLLOWEDRECORD._serialized_start = 4594 + _FOLLOWEDRECORD._serialized_end = 4731 + _LINKSTATE._serialized_start = 4734 + _LINKSTATE._serialized_end = 5120 + _LINKSTATE_KIND._serialized_start = 5020 + _LINKSTATE_KIND._serialized_end = 5120 + _FOLLOWSOURCE._serialized_start = 5122 + _FOLLOWSOURCE._serialized_end = 5245 + _SOURCERANGE._serialized_start = 5248 + _SOURCERANGE._serialized_end = 5606 + _SOURCEWAKE._serialized_start = 5608 + _SOURCEWAKE._serialized_end = 5681 + _FOLLOWRESPONSE._serialized_start = 5684 + _FOLLOWRESPONSE._serialized_end = 6052 + _FOLLOWRANGEREQUEST._serialized_start = 6055 + _FOLLOWRANGEREQUEST._serialized_end = 6269 + _LATESTREQUEST._serialized_start = 6271 + _LATESTREQUEST._serialized_end = 6334 + _LATESTRESPONSE._serialized_start = 6336 + _LATESTRESPONSE._serialized_end = 6368 + _CLOSEREQUEST._serialized_start = 6371 + _CLOSEREQUEST._serialized_end = 6552 + _STOREDCLOSE._serialized_start = 6555 + _STOREDCLOSE._serialized_end = 6687 + _CLOSERESPONSE._serialized_start = 6689 + _CLOSERESPONSE._serialized_end = 6704 + _FLUSHNOTIFICATIONSREQUEST._serialized_start = 6706 + _FLUSHNOTIFICATIONSREQUEST._serialized_end = 6733 + _FLUSHNOTIFICATIONSRESPONSE._serialized_start = 6735 + _FLUSHNOTIFICATIONSRESPONSE._serialized_end = 6763 + _SUBSCRIBEREQUEST._serialized_start = 6766 + _SUBSCRIBEREQUEST._serialized_end = 6914 + _SUBSCRIBERESPONSE._serialized_start = 6916 + _SUBSCRIBERESPONSE._serialized_end = 7005 + _UNSUBSCRIBEREQUEST._serialized_start = 7008 + _UNSUBSCRIBEREQUEST._serialized_end = 7137 + _UNSUBSCRIBERESPONSE._serialized_start = 7139 + _UNSUBSCRIBERESPONSE._serialized_end = 7160 + _WAITFORNOTIFICATIONREQUEST._serialized_start = 7162 + _WAITFORNOTIFICATIONREQUEST._serialized_end = 7261 + _WAITFORNOTIFICATIONRESPONSE._serialized_start = 7264 + _WAITFORNOTIFICATIONRESPONSE._serialized_end = 7475 + _RUNSTREAMDRIVERREQUEST._serialized_start = 7478 + _RUNSTREAMDRIVERREQUEST._serialized_end = 7633 + _RUNSTREAMDRIVERRESPONSE._serialized_start = 7635 + _RUNSTREAMDRIVERRESPONSE._serialized_end = 7660 + _DELETEOWNERREQUEST._serialized_start = 7663 + _DELETEOWNERREQUEST._serialized_end = 7798 + _DELETEOWNERRESPONSE._serialized_start = 7800 + _DELETEOWNERRESPONSE._serialized_end = 7838 + _RETIREPRODUCERREQUEST._serialized_start = 7841 + _RETIREPRODUCERREQUEST._serialized_end = 8028 + _RETIREPRODUCERRESPONSE._serialized_start = 8030 + _RETIREPRODUCERRESPONSE._serialized_end = 8054 + _DESCRIBESTOREREQUEST._serialized_start = 8056 + _DESCRIBESTOREREQUEST._serialized_end = 8078 + _DESCRIBESTORERESPONSE._serialized_start = 8080 + _DESCRIBESTORERESPONSE._serialized_end = 8175 + _STORECAPABILITIES._serialized_start = 8178 + _STORECAPABILITIES._serialized_end = 8499 + _STREAMFAILURE._serialized_start = 8501 + _STREAMFAILURE._serialized_end = 8618 + _STOREAPPENDREQUEST._serialized_start = 8621 + _STOREAPPENDREQUEST._serialized_end = 8786 + _STOREAPPENDRESPONSE._serialized_start = 8788 + _STOREAPPENDRESPONSE._serialized_end = 8867 + _STOREREADREQUEST._serialized_start = 8870 + _STOREREADREQUEST._serialized_end = 9041 + _STOREDRECORD._serialized_start = 9043 + _STOREDRECORD._serialized_end = 9091 + _STOREREADRESPONSE._serialized_start = 9094 + _STOREREADRESPONSE._serialized_end = 9235 + _STORELATESTREQUEST._serialized_start = 9237 + _STORELATESTREQUEST._serialized_end = 9313 + _STORELATESTRESPONSE._serialized_start = 9315 + _STORELATESTRESPONSE._serialized_end = 9354 + _PUBLISHWORKFLOWTASKREQUEST._serialized_start = 9357 + _PUBLISHWORKFLOWTASKREQUEST._serialized_end = 9859 + _RESOLVEDOWNERACTIVITY._serialized_start = 9862 + _RESOLVEDOWNERACTIVITY._serialized_end = 10016 + _OUTPUTRECORD._serialized_start = 10019 + _OUTPUTRECORD._serialized_end = 10225 + _PUBLISHWORKFLOWTASKRESPONSE._serialized_start = 10227 + _PUBLISHWORKFLOWTASKRESPONSE._serialized_end = 10280 + _RUNEVICTEDREQUEST._serialized_start = 10282 + _RUNEVICTEDREQUEST._serialized_end = 10371 + _RUNEVICTEDRESPONSE._serialized_start = 10373 + _RUNEVICTEDRESPONSE._serialized_end = 10393 + _SHUTDOWNWORKERREQUEST._serialized_start = 10395 + _SHUTDOWNWORKERREQUEST._serialized_end = 10437 + _SHUTDOWNWORKERRESPONSE._serialized_start = 10439 + _SHUTDOWNWORKERRESPONSE._serialized_end = 10463 + _STREAMSERVICE._serialized_start = 11626 + _STREAMSERVICE._serialized_end = 13506 # @@protoc_insertion_point(module_scope) From 1093a071dae4e96110e6cbcdbcc83ae33e4ecee3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sun, 18 Oct 2026 11:45:50 -0700 Subject: [PATCH 08/13] Moved sdk-streams to the so3 head with the notifier close comment. --- temporalio/bridge/Cargo.lock | 2 +- temporalio/bridge/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/temporalio/bridge/Cargo.lock b/temporalio/bridge/Cargo.lock index 3ecd02d731..397d4d138e 100644 --- a/temporalio/bridge/Cargo.lock +++ b/temporalio/bridge/Cargo.lock @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "temporalio-streams" version = "0.1.0" -source = "git+https://github.com/moetemp/sdk-streams?rev=6c819b0ead78a90e159ef2a55aa6e3eba290358e#6c819b0ead78a90e159ef2a55aa6e3eba290358e" +source = "git+https://github.com/moetemp/sdk-streams?rev=6c84edbe2a23ac5def54b2ec09004fa6622a4307#6c84edbe2a23ac5def54b2ec09004fa6622a4307" dependencies = [ "async-trait", "aws-lc-rs", diff --git a/temporalio/bridge/Cargo.toml b/temporalio/bridge/Cargo.toml index a6dad389f9..6f062aa499 100644 --- a/temporalio/bridge/Cargo.toml +++ b/temporalio/bridge/Cargo.toml @@ -91,7 +91,7 @@ url = "2.2" # makes it use the submodule's crates, so the bridge sees one `Connection` type. [dependencies.temporalio-streams] git = "https://github.com/moetemp/sdk-streams" -rev = "6c819b0ead78a90e159ef2a55aa6e3eba290358e" +rev = "6c84edbe2a23ac5def54b2ec09004fa6622a4307" default-features = false features = ["archive", "envconfig", "postgres", "redis"] From 94d6eae1128b58301cdad7111e26460cfd844a6d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sun, 18 Oct 2026 21:25:05 -0700 Subject: [PATCH 09/13] Moved sdk-streams to the so3 head that merges the Brook links. --- temporalio/bridge/Cargo.lock | 2 +- temporalio/bridge/Cargo.toml | 2 +- temporalio/bridge/proto/streams/streams_pb2.pyi | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/temporalio/bridge/Cargo.lock b/temporalio/bridge/Cargo.lock index 397d4d138e..263583b51d 100644 --- a/temporalio/bridge/Cargo.lock +++ b/temporalio/bridge/Cargo.lock @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "temporalio-streams" version = "0.1.0" -source = "git+https://github.com/moetemp/sdk-streams?rev=6c84edbe2a23ac5def54b2ec09004fa6622a4307#6c84edbe2a23ac5def54b2ec09004fa6622a4307" +source = "git+https://github.com/moetemp/sdk-streams?rev=f49377031fc85b8b306a0a3349b5d65bbf53148a#f49377031fc85b8b306a0a3349b5d65bbf53148a" dependencies = [ "async-trait", "aws-lc-rs", diff --git a/temporalio/bridge/Cargo.toml b/temporalio/bridge/Cargo.toml index 6f062aa499..e87b455e76 100644 --- a/temporalio/bridge/Cargo.toml +++ b/temporalio/bridge/Cargo.toml @@ -91,7 +91,7 @@ url = "2.2" # makes it use the submodule's crates, so the bridge sees one `Connection` type. [dependencies.temporalio-streams] git = "https://github.com/moetemp/sdk-streams" -rev = "6c84edbe2a23ac5def54b2ec09004fa6622a4307" +rev = "f49377031fc85b8b306a0a3349b5d65bbf53148a" default-features = false features = ["archive", "envconfig", "postgres", "redis"] diff --git a/temporalio/bridge/proto/streams/streams_pb2.pyi b/temporalio/bridge/proto/streams/streams_pb2.pyi index 772a331f6a..3ed2b539e3 100644 --- a/temporalio/bridge/proto/streams/streams_pb2.pyi +++ b/temporalio/bridge/proto/streams/streams_pb2.pyi @@ -863,7 +863,7 @@ class AppendRecord(google.protobuf.message.Message): kind: temporalio.bridge.proto.streams.v1.message_pb2.StreamRecordKind.ValueType @property def body(self) -> temporalio.api.common.v1.message_pb2.Payload: - """Set on DATA only, after lang's payload codec and external storage.""" + """Set on DATA, and optional on LINK, after lang's payload codec and external storage.""" content_hash: builtins.bytes """The SHA-256 of the body as the payload converter made it, before the codec. A codec that encrypts with a fresh nonce makes a retry's bytes differ, so a retry is recognized by this. From 5ae59022306d850a9315198db1cc85822a307c81 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 19 Oct 2026 10:47:59 -0700 Subject: [PATCH 10/13] Pinned sdk-streams so3 with the stale LINK fix. --- temporalio/bridge/Cargo.lock | 2 +- temporalio/bridge/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/temporalio/bridge/Cargo.lock b/temporalio/bridge/Cargo.lock index 263583b51d..eac5f6785f 100644 --- a/temporalio/bridge/Cargo.lock +++ b/temporalio/bridge/Cargo.lock @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "temporalio-streams" version = "0.1.0" -source = "git+https://github.com/moetemp/sdk-streams?rev=f49377031fc85b8b306a0a3349b5d65bbf53148a#f49377031fc85b8b306a0a3349b5d65bbf53148a" +source = "git+https://github.com/moetemp/sdk-streams?rev=5000e7cf82da8c1ea44fd763ee93c2e925fb9cf4#5000e7cf82da8c1ea44fd763ee93c2e925fb9cf4" dependencies = [ "async-trait", "aws-lc-rs", diff --git a/temporalio/bridge/Cargo.toml b/temporalio/bridge/Cargo.toml index e87b455e76..836a098f6b 100644 --- a/temporalio/bridge/Cargo.toml +++ b/temporalio/bridge/Cargo.toml @@ -91,7 +91,7 @@ url = "2.2" # makes it use the submodule's crates, so the bridge sees one `Connection` type. [dependencies.temporalio-streams] git = "https://github.com/moetemp/sdk-streams" -rev = "f49377031fc85b8b306a0a3349b5d65bbf53148a" +rev = "5000e7cf82da8c1ea44fd763ee93c2e925fb9cf4" default-features = false features = ["archive", "envconfig", "postgres", "redis"] From ea066382a9cf17c971c997d386d349e8f67bea78 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 19 Oct 2026 12:23:04 -0700 Subject: [PATCH 11/13] Pinned sdk-streams so3 with the withdrawn segment rule. --- temporalio/bridge/Cargo.lock | 2 +- temporalio/bridge/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/temporalio/bridge/Cargo.lock b/temporalio/bridge/Cargo.lock index eac5f6785f..d2246f2c88 100644 --- a/temporalio/bridge/Cargo.lock +++ b/temporalio/bridge/Cargo.lock @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "temporalio-streams" version = "0.1.0" -source = "git+https://github.com/moetemp/sdk-streams?rev=5000e7cf82da8c1ea44fd763ee93c2e925fb9cf4#5000e7cf82da8c1ea44fd763ee93c2e925fb9cf4" +source = "git+https://github.com/moetemp/sdk-streams?rev=7299fadb528961248350c49da5e7380d077aefed#7299fadb528961248350c49da5e7380d077aefed" dependencies = [ "async-trait", "aws-lc-rs", diff --git a/temporalio/bridge/Cargo.toml b/temporalio/bridge/Cargo.toml index 836a098f6b..925aab3e50 100644 --- a/temporalio/bridge/Cargo.toml +++ b/temporalio/bridge/Cargo.toml @@ -91,7 +91,7 @@ url = "2.2" # makes it use the submodule's crates, so the bridge sees one `Connection` type. [dependencies.temporalio-streams] git = "https://github.com/moetemp/sdk-streams" -rev = "5000e7cf82da8c1ea44fd763ee93c2e925fb9cf4" +rev = "7299fadb528961248350c49da5e7380d077aefed" default-features = false features = ["archive", "envconfig", "postgres", "redis"] From e3ca4bcd943ab93ac29135bc3522f93087fe65ce Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 19 Oct 2026 13:58:34 -0700 Subject: [PATCH 12/13] Pinned sdk-streams so3 with the resume rule. --- temporalio/bridge/Cargo.lock | 2 +- temporalio/bridge/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/temporalio/bridge/Cargo.lock b/temporalio/bridge/Cargo.lock index d2246f2c88..740809a318 100644 --- a/temporalio/bridge/Cargo.lock +++ b/temporalio/bridge/Cargo.lock @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "temporalio-streams" version = "0.1.0" -source = "git+https://github.com/moetemp/sdk-streams?rev=7299fadb528961248350c49da5e7380d077aefed#7299fadb528961248350c49da5e7380d077aefed" +source = "git+https://github.com/moetemp/sdk-streams?rev=df0b18239848750fa3a913b65bb10ba992d07efa#df0b18239848750fa3a913b65bb10ba992d07efa" dependencies = [ "async-trait", "aws-lc-rs", diff --git a/temporalio/bridge/Cargo.toml b/temporalio/bridge/Cargo.toml index 925aab3e50..a8c5741d55 100644 --- a/temporalio/bridge/Cargo.toml +++ b/temporalio/bridge/Cargo.toml @@ -91,7 +91,7 @@ url = "2.2" # makes it use the submodule's crates, so the bridge sees one `Connection` type. [dependencies.temporalio-streams] git = "https://github.com/moetemp/sdk-streams" -rev = "7299fadb528961248350c49da5e7380d077aefed" +rev = "df0b18239848750fa3a913b65bb10ba992d07efa" default-features = false features = ["archive", "envconfig", "postgres", "redis"] From 1a1daeeed63f026cbdb39cb30639c7d1ac1b0734 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 19 Oct 2026 15:11:26 -0700 Subject: [PATCH 13/13] Pinned sdk-streams so3 with the resume gap tests. --- temporalio/bridge/Cargo.lock | 2 +- temporalio/bridge/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/temporalio/bridge/Cargo.lock b/temporalio/bridge/Cargo.lock index 740809a318..47b6d73bc5 100644 --- a/temporalio/bridge/Cargo.lock +++ b/temporalio/bridge/Cargo.lock @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "temporalio-streams" version = "0.1.0" -source = "git+https://github.com/moetemp/sdk-streams?rev=df0b18239848750fa3a913b65bb10ba992d07efa#df0b18239848750fa3a913b65bb10ba992d07efa" +source = "git+https://github.com/moetemp/sdk-streams?rev=88e993da582962df2f850b5ee338c07116c67595#88e993da582962df2f850b5ee338c07116c67595" dependencies = [ "async-trait", "aws-lc-rs", diff --git a/temporalio/bridge/Cargo.toml b/temporalio/bridge/Cargo.toml index a8c5741d55..1e81792f29 100644 --- a/temporalio/bridge/Cargo.toml +++ b/temporalio/bridge/Cargo.toml @@ -91,7 +91,7 @@ url = "2.2" # makes it use the submodule's crates, so the bridge sees one `Connection` type. [dependencies.temporalio-streams] git = "https://github.com/moetemp/sdk-streams" -rev = "df0b18239848750fa3a913b65bb10ba992d07efa" +rev = "88e993da582962df2f850b5ee338c07116c67595" default-features = false features = ["archive", "envconfig", "postgres", "redis"]