-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpayloadConverter.js
More file actions
96 lines (76 loc) · 2.49 KB
/
payloadConverter.js
File metadata and controls
96 lines (76 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
const fs = require('fs');
const resolverCache = {};
const converterCache = {};
const rendererCache = {};
const resolverGroup = 'resolvers';
const rendererGroup = 'renderers';
const converterGroup = 'converters';
const defaultConverter = (payload) => ({...payload}); //this simply maps the object to itself, effectively relaying the payload to the receiver without changing it.
module.exports = {
loadComponent(group, name) {
return require(`./${group}/${name}`) ?? require(name);
},
getComponent(group, name, cache) {
if(!name) {
return null;
}
let component;
if(component = cache[name]) {
console.log(`component ${group}/${name} found in cache`);
return component;
}
component = this.loadComponent(group, name);
if(!component) {
console.error(`no component named ${group}/${name} found`);
throw new Error(`cannot resolve component ${group}/${name}`);
}
cache[name] = component;
console.log(`cached component ${group}/${name}`, component);
return component;
},
getResolver(name) {
return this.getComponent(resolverGroup, name, resolverCache);
},
getConverter(name) {
return this.getComponent(converterGroup, name, converterCache);
},
getRenderer(name) {
return this.getComponent(rendererGroup, name, rendererCache);
},
convertPayload(url, originalPayload) {
const payload = {...originalPayload, plain: JSON.stringify(originalPayload, undefined, 2)};
let rendered, template;
if(template = this.getMessageTemplate(url, originalPayload)) {
rendered = this.render(template, payload, url);
}
return this.convert(url, originalPayload, rendered);
},
convert(url, payload, rendered) {
let convertFunction = this.getConverter(url.converter);
if(!convertFunction)
convertFunction = defaultConverter;
return convertFunction(payload, rendered);
},
render(template, payload, url) {
const renderFunction = this.getRenderer(url.renderer);
if(renderFunction == null) {
return null;
}
return renderFunction(template, payload);
},
getMessageTemplate(url, payload) {
if(!url.resolver)
return null;
const resolver = this.getResolver(url.resolver);
if(resolver == null)
return null;
const path = resolver(payload);
return this.readTemplateContent(`./templates/${path}`);
},
readTemplateContent(path) {
if(!fs.existsSync(path)) {
return null;
}
return fs.readFileSync(path, 'utf-8');
}
};