forked from xyhtac/whrelay
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
129 lines (100 loc) · 2.97 KB
/
index.js
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/usr/bin/node
// deploy manually
// put into /opt/webhook-relay
// yum install node npm nano
// npm install
// test and stop:
// node index.js
// setup systemctl service
// nano /lib/systemd/system/whrelay.service
/*
[Unit]
Description=whrelay - Webhook Relay service
Documentation=https://github.com/xyhtac/whrelay
After=network.target
[Service]
Environment=NODE_PORT=80
Environment=NODE_ENV=dev
Type=simple
ExecStart=/usr/bin/node /opt/whrelay/index.js
Restart=on-failure
[Install]
WantedBy=multi-user.target
*/
// > systemctl daemon-reload
// > systemctl enable whrelay
// > systemctl start whrelay
// initiate express server
const express = require('express');
const app = express();
// link fetch module
const fetch = require('node-fetch');
const https = require('https');
const httpsAgent = new https.Agent({
rejectUnauthorized: false,
});
const config = {
relay: {
host: "127.0.0.1",
port: "80"
},
endpoints: {
BHNKASUH: {
url: "",
method: "GET",
params: [ "date", "token" ]
}
}
};
app.get(/^\/([A-Z]{8})$/, async function (req, res) {
let requestedService = req.params[0];
let outputFields = {};
let postData;
if ( !config.endpoints[requestedService] || !req.query ) {
res.send({ 'status' : 'Bad request' });
return (0);
}
let paramList = config.endpoints[ requestedService ].params;
for ( let i in paramList ) {
if ( !req.query[ paramList[i] ] ) {
res.send({ 'status' : 'Insufficient data' });
return (0);
}
outputFields[ paramList[i] ] = req.query[ paramList[i] ];
}
let getUrlString = config.endpoints[requestedService].url;
// append url with query for get method
if ( config.endpoints[requestedService].method == "GET" ) {
getUrlString = getUrlString + '/?' + new URLSearchParams( outputFields );
} else {
postData = JSON.stringify(outputFields);
}
await fetch( getUrlString, {
method: config.endpoints[requestedService].method,
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
body: postData,
agent: httpsAgent
}).then(res => res.json())
.then(callback => {
console.log ('Pulled handle: ' + getUrlString );
if ( callback[ "status" ] == "redirect" ) {
// redirect to fetched url
res.redirect( callback['url'] );
console.log ('Response redirect: ' + callback['url'] );
return (0);
} else {
// print fetched status
res.send({ 'status' : callback['status'] });
console.log ('Response status: ' + callback['status'] );
return (0);
}
}).catch(err => {
console.log(err);
res.send({ 'status' : 'Processing failed' });
return(0);
})
});
// initiate web server
app.listen( config.relay.port );
// print diagnostic data to console
console.log('Server started at http://' + config.relay.host + ':' + config.relay.port);