@@ -15,6 +15,40 @@ parser_by_mime[Constants.MIME_CE_JSON] = jsonParserSpec02;
15
15
const allowed_content_types = [ ] ;
16
16
allowed_content_types . push ( Constants . MIME_CE_JSON ) ;
17
17
18
+ const setter_reflections = { } ;
19
+ setter_reflections [ Constants . STRUCTURED_ATTRS_02 . TYPE ] = {
20
+ name : "type" ,
21
+ parser : ( v ) => v
22
+ } ;
23
+ setter_reflections [ Constants . STRUCTURED_ATTRS_02 . SPEC_VERSION ] = {
24
+ name : "specversion" ,
25
+ parser : ( v ) => v
26
+ } ;
27
+ setter_reflections [ Constants . STRUCTURED_ATTRS_02 . SOURCE ] = {
28
+ name : "source" ,
29
+ parser : ( v ) => v
30
+ } ;
31
+ setter_reflections [ Constants . STRUCTURED_ATTRS_02 . ID ] = {
32
+ name : "id" ,
33
+ parser : ( v ) => v
34
+ } ;
35
+ setter_reflections [ Constants . STRUCTURED_ATTRS_02 . TIME ] = {
36
+ name : "time" ,
37
+ parser : ( v ) => new Date ( Date . parse ( v ) )
38
+ } ;
39
+ setter_reflections [ Constants . STRUCTURED_ATTRS_02 . SCHEMA_URL ] = {
40
+ name : "schemaurl" ,
41
+ parser : ( v ) => v
42
+ } ;
43
+ setter_reflections [ Constants . STRUCTURED_ATTRS_02 . CONTENT_TYPE ] = {
44
+ name : "contenttype" ,
45
+ parser : ( v ) => v
46
+ } ;
47
+ setter_reflections [ Constants . STRUCTURED_ATTRS_02 . DATA ] = {
48
+ name : "data" ,
49
+ parser : ( v ) => v
50
+ } ;
51
+
18
52
function validate_args ( payload , attributes ) {
19
53
if ( ! payload ) {
20
54
throw { message : "payload is null or undefined" } ;
@@ -25,8 +59,10 @@ function validate_args(payload, attributes) {
25
59
}
26
60
27
61
if ( ( typeof payload ) !== "object" && ( typeof payload ) !== "string" ) {
28
- throw { message : "payload must be an object or string" ,
29
- erros : [ typeof payload ] } ;
62
+ throw {
63
+ message : "payload must be an object or string" ,
64
+ errors : [ typeof payload ]
65
+ } ;
30
66
}
31
67
}
32
68
@@ -42,8 +78,10 @@ Receiver.prototype.check = function(payload, headers) {
42
78
// Validation Level 1
43
79
if ( ! allowed_content_types
44
80
. includes ( sanity_headers [ Constants . HEADER_CONTENT_TYPE ] ) ) {
45
- throw { message : "invalid content type" ,
46
- errors : [ sanity_headers [ Constants . HEADER_CONTENT_TYPE ] ] } ;
81
+ throw {
82
+ message : "invalid content type" ,
83
+ errors : [ sanity_headers [ Constants . HEADER_CONTENT_TYPE ] ]
84
+ } ;
47
85
}
48
86
49
87
// No erros! Its contains the minimum required attributes
@@ -57,11 +95,28 @@ Receiver.prototype.parse = function(payload, headers) {
57
95
var contentType = sanity_headers [ Constants . HEADER_CONTENT_TYPE ] ;
58
96
59
97
var parser = parser_by_mime [ contentType ] ;
98
+ var event = parser . parse ( payload ) ;
99
+ spec02 . check ( event ) ;
100
+
101
+ var processed_attributes = [ ] ;
102
+ var cloudevent = new Cloudevent ( Spec02 ) ;
103
+ for ( attribute in setter_reflections ) {
104
+ var setter_name = setter_reflections [ attribute ] . name ;
105
+ var parser_fn = setter_reflections [ attribute ] . parser ;
60
106
61
- var cloudevent = parser . parse ( payload ) ;
107
+ // invoke the setter function
108
+ cloudevent [ setter_name ] ( parser_fn ( event [ attribute ] ) ) ;
109
+
110
+ // to use ahead, for extensions processing
111
+ processed_attributes . push ( attribute ) ;
112
+ }
62
113
63
- // Must follow the spec
64
- spec02 . check ( cloudevent ) ;
114
+ // Every unprocessed attribute should be an extension
115
+ Array . from ( Object . keys ( event ) )
116
+ . filter ( attribute => ! processed_attributes . includes ( attribute ) )
117
+ . forEach ( extension =>
118
+ cloudevent . addExtension ( extension , event [ extension ] )
119
+ ) ;
65
120
66
121
return cloudevent ;
67
122
}
0 commit comments