Skip to content

Commit 1f8f153

Browse files
authored
feat: Support Stream<T> endpoints containing records (serverpod#3266)
1 parent ae2c03c commit 1f8f153

File tree

18 files changed

+1980
-65
lines changed

18 files changed

+1980
-65
lines changed

packages/serverpod_serialization/lib/src/websocket_messages.dart

+12-12
Original file line numberDiff line numberDiff line change
@@ -447,16 +447,18 @@ class MethodStreamMessage extends WebSocketMessage
447447
/// The object that was sent.
448448
final dynamic object;
449449

450+
final SerializationManager _serializationManager;
451+
450452
/// Creates a new [MethodStreamMessage].
451453
/// The [object] must be an object processed by the
452454
/// [SerializationManager.wrapWithClassName] method.
453-
MethodStreamMessage(Map data, SerializationManager serializationManager)
455+
MethodStreamMessage(Map data, this._serializationManager)
454456
: endpoint = data[WebSocketMessageDataKey.endpoint],
455457
method = data[WebSocketMessageDataKey.method],
456458
connectionId = UuidValueJsonExtension.fromJson(
457459
data[WebSocketMessageDataKey.connectionId]),
458460
parameter = data[WebSocketMessageDataKey.parameter],
459-
object = serializationManager
461+
object = _serializationManager
460462
.deserializeByClassName(data[WebSocketMessageDataKey.object]);
461463

462464
/// Builds a [MethodStreamMessage] message.
@@ -479,16 +481,14 @@ class MethodStreamMessage extends WebSocketMessage
479481
}
480482

481483
@override
482-
String toString() => WebSocketMessage._buildMessage(
483-
_messageType,
484-
{
485-
WebSocketMessageDataKey.endpoint: endpoint,
486-
WebSocketMessageDataKey.method: method,
487-
WebSocketMessageDataKey.connectionId: connectionId,
488-
if (parameter != null) WebSocketMessageDataKey.parameter: parameter,
489-
WebSocketMessageDataKey.object: object,
490-
},
491-
).toString();
484+
String toString() => buildMessage(
485+
endpoint: endpoint,
486+
method: method,
487+
connectionId: connectionId,
488+
parameter: parameter,
489+
object: object,
490+
serializationManager: _serializationManager,
491+
);
492492
}
493493

494494
/// A message sent when a bad request is received.

tests/serverpod_test_client/lib/src/protocol/client.dart

+121
Original file line numberDiff line numberDiff line change
@@ -2212,6 +2212,15 @@ class EndpointRecordParameters extends _i1.EndpointRef {
22122212
{'record': _i19.mapRecordToJson(record)},
22132213
);
22142214

2215+
_i2.Stream<(int?,)?> streamNullableRecordOfNullableInt(
2216+
_i2.Stream<(int?,)?> values) =>
2217+
caller.callStreamingServerEndpoint<_i2.Stream<(int?,)?>, (int?,)?>(
2218+
'recordParameters',
2219+
'streamNullableRecordOfNullableInt',
2220+
{},
2221+
{'values': values},
2222+
);
2223+
22152224
_i2.Future<(int, String)> returnIntStringRecord((int, String) record) =>
22162225
caller.callServerEndpoint<(int, String)>(
22172226
'recordParameters',
@@ -2430,6 +2439,32 @@ class EndpointRecordParameters extends _i1.EndpointRef {
24302439
'returnListOfNestedPositionalAndNamedRecord',
24312440
{'recordList': _i19.mapRecordContainingContainerToJson(recordList)},
24322441
);
2442+
2443+
_i2.Stream<
2444+
List<
2445+
(
2446+
(int, String), {
2447+
(_i10.SimpleData, double) namedSubRecord
2448+
})?>?> streamNullableListOfNullableNestedPositionalAndNamedRecord(
2449+
List<((int, String), {(_i10.SimpleData, double) namedSubRecord})?>?
2450+
initialValue,
2451+
_i2.Stream<
2452+
List<((int, String), {(_i10.SimpleData, double) namedSubRecord})?>?>
2453+
values,
2454+
) =>
2455+
caller.callStreamingServerEndpoint<
2456+
_i2.Stream<
2457+
List<
2458+
(
2459+
(int, String), {
2460+
(_i10.SimpleData, double) namedSubRecord
2461+
})?>?>,
2462+
List<((int, String), {(_i10.SimpleData, double) namedSubRecord})?>?>(
2463+
'recordParameters',
2464+
'streamNullableListOfNullableNestedPositionalAndNamedRecord',
2465+
{'initialValue': initialValue},
2466+
{'values': values},
2467+
);
24332468
}
24342469

24352470
/// {@category Endpoint}
@@ -3003,6 +3038,92 @@ class EndpointTestTools extends _i1.EndpointRef {
30033038
{'records': _i19.mapRecordContainingContainerToJson(records)},
30043039
);
30053040

3041+
_i2.Stream<
3042+
(String, (Map<String, int>, {bool flag, _i10.SimpleData simpleData}))>
3043+
recordEchoStream(
3044+
(
3045+
String,
3046+
(Map<String, int>, {bool flag, _i10.SimpleData simpleData})
3047+
) initialValue,
3048+
_i2.Stream<
3049+
(
3050+
String,
3051+
(Map<String, int>, {bool flag, _i10.SimpleData simpleData})
3052+
)>
3053+
stream,
3054+
) =>
3055+
caller.callStreamingServerEndpoint<
3056+
_i2.Stream<
3057+
(
3058+
String,
3059+
(Map<String, int>, {bool flag, _i10.SimpleData simpleData})
3060+
)>,
3061+
(
3062+
String,
3063+
(Map<String, int>, {bool flag, _i10.SimpleData simpleData})
3064+
)>(
3065+
'testTools',
3066+
'recordEchoStream',
3067+
{'initialValue': initialValue},
3068+
{'stream': stream},
3069+
);
3070+
3071+
_i2.Stream<List<(String, int)>> listOfRecordEchoStream(
3072+
List<(String, int)> initialValue,
3073+
_i2.Stream<List<(String, int)>> stream,
3074+
) =>
3075+
caller.callStreamingServerEndpoint<_i2.Stream<List<(String, int)>>,
3076+
List<(String, int)>>(
3077+
'testTools',
3078+
'listOfRecordEchoStream',
3079+
{'initialValue': initialValue},
3080+
{'stream': stream},
3081+
);
3082+
3083+
_i2.Stream<
3084+
(
3085+
String,
3086+
(Map<String, int>, {bool flag, _i10.SimpleData simpleData})
3087+
)?> nullableRecordEchoStream(
3088+
(
3089+
String,
3090+
(Map<String, int>, {bool flag, _i10.SimpleData simpleData})
3091+
)? initialValue,
3092+
_i2.Stream<
3093+
(
3094+
String,
3095+
(Map<String, int>, {bool flag, _i10.SimpleData simpleData})
3096+
)?>
3097+
stream,
3098+
) =>
3099+
caller.callStreamingServerEndpoint<
3100+
_i2.Stream<
3101+
(
3102+
String,
3103+
(Map<String, int>, {bool flag, _i10.SimpleData simpleData})
3104+
)?>,
3105+
(
3106+
String,
3107+
(Map<String, int>, {bool flag, _i10.SimpleData simpleData})
3108+
)?>(
3109+
'testTools',
3110+
'nullableRecordEchoStream',
3111+
{'initialValue': initialValue},
3112+
{'stream': stream},
3113+
);
3114+
3115+
_i2.Stream<List<(String, int)>?> nullableListOfRecordEchoStream(
3116+
List<(String, int)>? initialValue,
3117+
_i2.Stream<List<(String, int)>?> stream,
3118+
) =>
3119+
caller.callStreamingServerEndpoint<_i2.Stream<List<(String, int)>?>,
3120+
List<(String, int)>?>(
3121+
'testTools',
3122+
'nullableListOfRecordEchoStream',
3123+
{'initialValue': initialValue},
3124+
{'stream': stream},
3125+
);
3126+
30063127
_i2.Future<void> logMessageWithSession() => caller.callServerEndpoint<void>(
30073128
'testTools',
30083129
'logMessageWithSession',

0 commit comments

Comments
 (0)