-
-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathsimsimi.js
67 lines (64 loc) · 1.46 KB
/
simsimi.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
'use strict';
const https = require('https');
const post = (url, headers, body) =>
new Promise((resolve, reject) => {
const req = https.request(url, {
method: 'POST',
headers
}, resolve);
req.on('error', reject);
if(body) {
if(typeof body !== 'string') body = JSON.stringify(body);
req.write(body);
}
req.end();
});
const readStream = stream =>
new Promise((resolve, reject) => {
var buf = '';
stream
.on('error', reject)
.on('data', chunk => buf += chunk)
.on('end', () => resolve(buf));
});
const format = response => {
switch (response.status) {
case 200:
return response;
default:
const err = new Error(response.statusMessage);
err.response = response;
err.code = response.status;
throw err;
}
};
/**
* simsimi
* https://workshop.simsimi.com/document?lc=en
*/
module.exports = options => {
const {
key,
lang = 'en',
api = 'https://wsapi.simsimi.com/190410/talk'
} = options;
return (query, cb) => {
if (typeof query === 'string')
query = { utext: query, lang };
const headers = {
'x-api-key': key,
'Content-Type': 'application/json',
};
return Promise
.resolve()
.then(() => post(api, headers, query))
.then(readStream)
.then(JSON.parse)
.then(format)
.then(res => (cb && cb(null, res.atext, res), res.atext))
.catch(err => {
if(cb) cb(err)
else throw err;
})
};
};