Skip to content

Commit 2b2036b

Browse files
committed
feat(slimrpc): Move and refactor slimrpc python example
1 parent 5599313 commit 2b2036b

File tree

17 files changed

+650
-334
lines changed

17 files changed

+650
-334
lines changed

data-plane/bindings/python/.gitignore

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# Generated bindings (Maturin creates this during development)
2-
slim_uniffi_bindings/_slim_bindings/
3-
slim_uniffi_bindings/generated/
4-
generated/
2+
slim_bindings/_slim_bindings
53

64
# Python
75
__pycache__/

data-plane/bindings/python/examples/slimrpc/__init__.py

Whitespace-only changes.

data-plane/bindings/python/examples/slimrpc/simple/__init__.py

Whitespace-only changes.

data-plane/python/integrations/slimrpc/slimrpc/examples/simple/buf.gen.yaml renamed to data-plane/bindings/python/examples/slimrpc/simple/buf.gen.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ inputs:
1010
- proto_file: example.proto
1111
plugins:
1212
# Generates _pb2_slimrpc.py files
13-
- local: ../../../../../../target/release/protoc-slimrpc-plugin
13+
- local: ../../../../../target/release/protoc-slimrpc-plugin
1414
out: types
1515
# Generate python protobuf related code
1616
# Generates *_pb2.py files, one for each .proto
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import asyncio
2+
import logging
3+
from collections.abc import AsyncGenerator
4+
from datetime import timedelta
5+
6+
import slim_bindings
7+
from examples.slimrpc.simple.types.example_pb2 import ExampleRequest
8+
from examples.slimrpc.simple.types.example_pb2_slimrpc import TestStub
9+
10+
logger = logging.getLogger(__name__)
11+
12+
13+
async def amain() -> None:
14+
# Initialize service
15+
tracing_config = slim_bindings.new_tracing_config()
16+
runtime_config = slim_bindings.new_runtime_config()
17+
service_config = slim_bindings.new_service_config()
18+
19+
tracing_config.log_level = "info"
20+
21+
slim_bindings.initialize_with_configs(
22+
tracing_config=tracing_config,
23+
runtime_config=runtime_config,
24+
service_config=[service_config],
25+
)
26+
27+
service = slim_bindings.get_global_service()
28+
29+
# Create local and remote names
30+
local_name = slim_bindings.Name("agntcy", "grpc", "client")
31+
remote_name = slim_bindings.Name("agntcy", "grpc", "server")
32+
33+
# Connect to SLIM
34+
client_config = slim_bindings.new_insecure_client_config("http://localhost:46357")
35+
conn_id = await service.connect_async(client_config)
36+
37+
# Create app with shared secret
38+
local_app = service.create_app_with_secret(
39+
local_name, "my_shared_secret_for_testing_purposes_only"
40+
)
41+
42+
# Subscribe to local name
43+
await local_app.subscribe_async(local_name, conn_id)
44+
45+
# Create channel
46+
channel = slim_bindings.Channel.new_with_connection(local_app, remote_name, conn_id)
47+
48+
# Create stubs
49+
stubs = TestStub(channel)
50+
51+
# Call method
52+
try:
53+
request = ExampleRequest(example_integer=1, example_string="hello")
54+
response = await stubs.ExampleUnaryUnary(request, timeout=timedelta(seconds=2))
55+
56+
logger.info(f"Response: {response}")
57+
58+
async for resp in stubs.ExampleUnaryStream(
59+
request, timeout=timedelta(seconds=2)
60+
):
61+
logger.info(f"Stream Response: {resp}")
62+
63+
async def stream_requests() -> AsyncGenerator[ExampleRequest, None]:
64+
for i in range(10):
65+
yield ExampleRequest(example_integer=i, example_string=f"Request {i}")
66+
67+
response = await stubs.ExampleStreamUnary(
68+
stream_requests(), timeout=timedelta(seconds=2)
69+
)
70+
logger.info(f"Stream Unary Response: {response}")
71+
72+
async for resp in stubs.ExampleStreamStream(
73+
stream_requests(), timeout=timedelta(seconds=2)
74+
):
75+
logger.info(f"Stream Stream Response: {resp}")
76+
logger.info("Stream Stream completed")
77+
78+
except asyncio.TimeoutError:
79+
logger.exception("timeout while waiting for response")
80+
81+
await asyncio.sleep(1)
82+
83+
84+
def main() -> None:
85+
"""
86+
Main entry point for the client.
87+
"""
88+
logging.basicConfig(level=logging.INFO)
89+
try:
90+
asyncio.run(amain())
91+
except KeyboardInterrupt:
92+
print("Client interrupted by user.")

data-plane/python/integrations/slimrpc/slimrpc/examples/simple/example.proto renamed to data-plane/bindings/python/examples/slimrpc/simple/example.proto

File renamed without changes.
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import asyncio
2+
import logging
3+
from collections.abc import AsyncIterable
4+
5+
import slim_bindings
6+
from examples.slimrpc.simple.types.example_pb2 import ExampleRequest, ExampleResponse
7+
from examples.slimrpc.simple.types.example_pb2_slimrpc import (
8+
TestServicer,
9+
add_TestServicer_to_server,
10+
)
11+
from slim_bindings._slim_bindings.slim_bindings import uniffi_set_event_loop
12+
13+
logger = logging.getLogger(__name__)
14+
15+
16+
class TestService(TestServicer):
17+
async def ExampleUnaryUnary(
18+
self,
19+
request: ExampleRequest,
20+
msg_context: slim_bindings.MessageContext,
21+
session_context: slim_bindings.Context,
22+
) -> ExampleResponse:
23+
logger.info(f"Received unary-unary request: {request}")
24+
25+
return ExampleResponse(example_integer=1, example_string="Hello, World!")
26+
27+
async def ExampleUnaryStream(
28+
self,
29+
request: ExampleRequest,
30+
msg_context: slim_bindings.MessageContext,
31+
session_context: slim_bindings.Context,
32+
) -> AsyncIterable[ExampleResponse]:
33+
logger.info(f"Received unary-stream request: {request}")
34+
35+
# generate async responses stream
36+
for i in range(5):
37+
logger.info(f"Sending response {i}")
38+
yield ExampleResponse(example_integer=i, example_string=f"Response {i}")
39+
40+
async def ExampleStreamUnary(
41+
self,
42+
request_iterator: AsyncIterable[ExampleRequest],
43+
session_context: slim_bindings.Context,
44+
) -> ExampleResponse:
45+
logger.info("Received stream-unary request")
46+
47+
received_strs = []
48+
async for request in request_iterator:
49+
logger.info(f"Received request: {request}")
50+
received_strs.append(request.example_string)
51+
52+
response = ExampleResponse(
53+
example_integer=len(received_strs),
54+
example_string="Saw: " + ", ".join(received_strs),
55+
)
56+
return response
57+
58+
async def ExampleStreamStream(
59+
self,
60+
request_iterator: AsyncIterable[ExampleRequest],
61+
session_context: slim_bindings.Context,
62+
) -> AsyncIterable[ExampleResponse]:
63+
logger.info("Received stream-stream request")
64+
async for request in request_iterator:
65+
logger.info(f"Echoing back request: {request}")
66+
yield ExampleResponse(
67+
example_integer=request.example_integer * 100,
68+
example_string=f"Echo: {request.example_string}",
69+
)
70+
71+
72+
async def amain() -> None:
73+
uniffi_set_event_loop(asyncio.get_running_loop()) # type: ignore[arg-type]
74+
75+
# Initialize service
76+
tracing_config = slim_bindings.new_tracing_config()
77+
runtime_config = slim_bindings.new_runtime_config()
78+
service_config = slim_bindings.new_service_config()
79+
80+
tracing_config.log_level = "info"
81+
82+
slim_bindings.initialize_with_configs(
83+
tracing_config=tracing_config,
84+
runtime_config=runtime_config,
85+
service_config=[service_config],
86+
)
87+
88+
service = slim_bindings.get_global_service()
89+
90+
# Create local name
91+
local_name = slim_bindings.Name("agntcy", "grpc", "server")
92+
93+
# Connect to SLIM
94+
client_config = slim_bindings.new_insecure_client_config("http://localhost:46357")
95+
conn_id = await service.connect_async(client_config)
96+
97+
# Create app with shared secret
98+
local_app = service.create_app_with_secret(
99+
local_name, "my_shared_secret_for_testing_purposes_only"
100+
)
101+
102+
# Subscribe to local name
103+
await local_app.subscribe_async(local_name, conn_id)
104+
105+
# Create server
106+
server = slim_bindings.Server.new_with_connection(local_app, local_name, conn_id)
107+
108+
# Add servicer
109+
add_TestServicer_to_server(TestService(), server)
110+
111+
# Run server
112+
logger.info("Server starting...")
113+
await server.serve_async()
114+
115+
116+
def main() -> None:
117+
"""
118+
Main entry point for the server.
119+
"""
120+
logging.basicConfig(level=logging.DEBUG)
121+
try:
122+
asyncio.run(amain())
123+
except KeyboardInterrupt:
124+
print("Server interrupted by user.")

data-plane/python/integrations/slimrpc/slimrpc/examples/simple/types/example_pb2.py renamed to data-plane/bindings/python/examples/slimrpc/simple/types/example_pb2.py

File renamed without changes.

data-plane/python/integrations/slimrpc/slimrpc/examples/simple/types/example_pb2.pyi renamed to data-plane/bindings/python/examples/slimrpc/simple/types/example_pb2.pyi

File renamed without changes.

0 commit comments

Comments
 (0)