Skip to content

Commit f850c9a

Browse files
committed
Extension processing and cloudevent right parse
Signed-off-by: Fabio José <[email protected]>
1 parent 2cb2639 commit f850c9a

File tree

1 file changed

+62
-7
lines changed

1 file changed

+62
-7
lines changed

lib/bindings/http/receiver_structured_0_2.js

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,40 @@ parser_by_mime[Constants.MIME_CE_JSON] = jsonParserSpec02;
1515
const allowed_content_types = [];
1616
allowed_content_types.push(Constants.MIME_CE_JSON);
1717

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+
1852
function validate_args(payload, attributes) {
1953
if(!payload){
2054
throw {message: "payload is null or undefined"};
@@ -25,8 +59,10 @@ function validate_args(payload, attributes) {
2559
}
2660

2761
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+
};
3066
}
3167
}
3268

@@ -42,8 +78,10 @@ Receiver.prototype.check = function(payload, headers) {
4278
// Validation Level 1
4379
if(!allowed_content_types
4480
.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+
};
4785
}
4886

4987
// No erros! Its contains the minimum required attributes
@@ -57,11 +95,28 @@ Receiver.prototype.parse = function(payload, headers) {
5795
var contentType = sanity_headers[Constants.HEADER_CONTENT_TYPE];
5896

5997
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;
60106

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+
}
62113

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+
);
65120

66121
return cloudevent;
67122
}

0 commit comments

Comments
 (0)