@@ -24,49 +24,55 @@ import '../json_request_utils.dart';
2424import '../request_context.dart' ;
2525import '../typedefs.dart' ;
2626
27- class CloudEventFunctionTarget extends FunctionTarget {
28- final CloudEventHandler function;
27+ abstract class _CloudEventFunctionTarget <T > extends FunctionTarget {
28+ _CloudEventFunctionTarget ();
29+
30+ Future <CloudEvent <T >> _eventFromRequest (Request request) async =>
31+ _requiredBinaryHeader.every (request.headers.containsKey)
32+ ? await _decodeBinary (request, _decode)
33+ : await _decodeStructured (request, _decode);
34+
35+ T _decode (Map <String , dynamic > json) => json as T ;
36+ }
37+
38+ class CloudEventFunctionTarget <T > extends _CloudEventFunctionTarget <T > {
39+ final CloudEventHandler <T > function;
2940
3041 @override
3142 FunctionType get type => FunctionType .cloudevent;
3243
3344 @override
3445 FutureOr <Response > handler (Request request) async {
3546 final event = await _eventFromRequest (request);
36-
3747 await function (event);
38-
3948 return Response .ok ('' );
4049 }
4150
4251 CloudEventFunctionTarget (this .function);
4352}
4453
45- class CloudEventWithContextFunctionTarget extends FunctionTarget {
46- final CloudEventWithContextHandler function;
54+ class CloudEventWithContextFunctionTarget <T >
55+ extends _CloudEventFunctionTarget <T > {
56+ final CloudEventWithContextHandler <T > function;
4757
4858 @override
4959 FunctionType get type => FunctionType .cloudevent;
5060
5161 @override
5262 Future <Response > handler (Request request) async {
5363 final event = await _eventFromRequest (request);
54-
5564 final context = contextForRequest (request);
5665 await function (event, context);
57-
5866 return Response .ok ('' , headers: context.responseHeaders);
5967 }
6068
6169 CloudEventWithContextFunctionTarget (this .function);
6270}
6371
64- Future <CloudEvent > _eventFromRequest (Request request) =>
65- _requiredBinaryHeader.every (request.headers.containsKey)
66- ? _decodeBinary (request)
67- : _decodeStructured (request);
68-
69- Future <CloudEvent > _decodeStructured (Request request) async {
72+ Future <CloudEvent <T >> _decodeStructured <T >(
73+ Request request,
74+ FromJson <T > fromJson,
75+ ) async {
7076 final type = mediaTypeFromRequest (request);
7177
7278 mustBeJson (type);
@@ -79,13 +85,20 @@ Future<CloudEvent> _decodeStructured(Request request) async {
7985 };
8086 }
8187
82- return _decodeValidCloudEvent (jsonObject, 'structured-mode message' );
88+ return _decodeValidCloudEvent (
89+ jsonObject,
90+ 'structured-mode message' ,
91+ fromJson,
92+ );
8393}
8494
8595const _cloudEventPrefix = 'ce-' ;
8696const _clientEventPrefixLength = _cloudEventPrefix.length;
8797
88- Future <CloudEvent > _decodeBinary (Request request) async {
98+ Future <CloudEvent <T >> _decodeBinary <T >(
99+ Request request,
100+ FromJson <T > fromJson,
101+ ) async {
89102 final type = mediaTypeFromRequest (request);
90103 mustBeJson (type);
91104
@@ -97,15 +110,16 @@ Future<CloudEvent> _decodeBinary(Request request) async {
97110 'data' : await decodeJson (request),
98111 };
99112
100- return _decodeValidCloudEvent (map, 'binary-mode message' );
113+ return _decodeValidCloudEvent (map, 'binary-mode message' , fromJson );
101114}
102115
103- CloudEvent _decodeValidCloudEvent (
116+ CloudEvent < T > _decodeValidCloudEvent < T > (
104117 Map <String , dynamic > map,
105118 String messageType,
119+ FromJson <T > fromJson,
106120) {
107121 try {
108- return CloudEvent .fromJson (map);
122+ return CloudEvent .fromJson (map, fromJson );
109123 } catch (e, stackTrace) {
110124 throw BadRequestException (
111125 400 ,
0 commit comments