15
15
)
16
16
from localstack .services .dynamodb .server import DynamodbServer
17
17
from localstack .services .dynamodb .utils import modify_ddblocal_arns
18
- from localstack .services .dynamodb .v2 .provider import DynamoDBProvider
18
+ from localstack .services .dynamodb .v2 .provider import DynamoDBProvider , modify_context_region
19
+ from localstack .services .dynamodbstreams .dynamodbstreams_api import get_original_region
19
20
from localstack .services .plugins import ServiceLifecycleHook
20
21
from localstack .utils .aws .arns import parse_arn
21
22
@@ -33,6 +34,14 @@ def on_after_init(self):
33
34
def on_before_start (self ):
34
35
self .server .start_dynamodb ()
35
36
37
+ def _forward_request (
38
+ self , context : RequestContext , region : str | None , service_request : ServiceRequest
39
+ ) -> ServiceResponse :
40
+ if region :
41
+ with modify_context_region (context , region ):
42
+ return self .forward_request (context , service_request = service_request )
43
+ return self .forward_request (context , service_request = service_request )
44
+
36
45
def forward_request (
37
46
self , context : RequestContext , service_request : ServiceRequest = None
38
47
) -> ServiceResponse :
@@ -55,12 +64,19 @@ def describe_stream(
55
64
context : RequestContext ,
56
65
payload : DescribeStreamInput ,
57
66
) -> DescribeStreamOutput :
67
+ global_table_region = get_original_region (context = context , stream_arn = payload ["StreamArn" ])
58
68
request = payload .copy ()
59
69
request ["StreamArn" ] = self .modify_stream_arn_for_ddb_local (request .get ("StreamArn" , "" ))
60
- return self .forward_request (context , request )
70
+ return self ._forward_request (
71
+ context = context , service_request = request , region = global_table_region
72
+ )
61
73
62
74
@handler ("GetRecords" , expand = False )
63
75
def get_records (self , context : RequestContext , payload : GetRecordsInput ) -> GetRecordsOutput :
76
+ # Limitation note: With this current implementation, we are not able to get the records from a stream of a
77
+ # replicated table. To do so, we would need to kept track of the emitted ShardIterators and the originating
78
+ # region in `GetShardIterator`.
79
+
64
80
request = payload .copy ()
65
81
request ["ShardIterator" ] = self .modify_stream_arn_for_ddb_local (
66
82
request .get ("ShardIterator" , "" )
@@ -77,5 +93,8 @@ def get_shard_iterator(
77
93
78
94
@handler ("ListStreams" , expand = False )
79
95
def list_streams (self , context : RequestContext , payload : ListStreamsInput ) -> ListStreamsOutput :
96
+ global_table_region = get_original_region (context = context , stream_arn = payload ["TableName" ])
80
97
# TODO: look into `ExclusiveStartStreamArn` param
81
- return self .forward_request (context , payload )
98
+ return self ._forward_request (
99
+ context = context , service_request = payload , region = global_table_region
100
+ )
0 commit comments