@tiledesk/tiledesk-voice-twilio-connector 0.1.28 → 0.2.0-rc3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +179 -0
- package/README.md +44 -0
- package/index.js +7 -1562
- package/package.json +23 -22
- package/src/app.js +146 -0
- package/src/config/index.js +32 -0
- package/src/controllers/VoiceController.js +488 -0
- package/src/controllers/VoiceController.original.js +811 -0
- package/src/middlewares/httpLogger.js +31 -0
- package/src/models/KeyValueStore.js +78 -0
- package/src/routes/manageApp.js +298 -0
- package/src/routes/voice.js +22 -0
- package/src/services/AiService.js +219 -0
- package/src/services/AiService.sdk.js +367 -0
- package/src/services/IntegrationService.js +74 -0
- package/src/services/MessageService.js +133 -0
- package/src/services/README_SDK.md +107 -0
- package/src/services/SessionService.js +143 -0
- package/src/services/SpeechService.js +134 -0
- package/src/services/TiledeskMessageBuilder.js +135 -0
- package/src/services/TwilioService.js +122 -0
- package/src/services/UploadService.js +78 -0
- package/src/services/channels/TiledeskChannel.js +269 -0
- package/{tiledesk → src/services/channels}/VoiceChannel.js +17 -56
- package/src/services/clients/TiledeskSubscriptionClient.js +78 -0
- package/src/services/index.js +45 -0
- package/src/services/translators/TiledeskTwilioTranslator.js +509 -0
- package/{tiledesk/TiledeskTwilioTranslator.js → src/services/translators/TiledeskTwilioTranslator.original.js} +119 -212
- package/src/utils/fileUtils.js +24 -0
- package/src/utils/logger.js +32 -0
- package/{tiledesk → src/utils}/utils-message.js +6 -21
- package/logs/app.log +0 -3082
- package/routes/manageApp.js +0 -419
- package/tiledesk/KVBaseMongo.js +0 -101
- package/tiledesk/TiledeskChannel.js +0 -363
- package/tiledesk/TiledeskSubscriptionClient.js +0 -135
- package/tiledesk/fileUtils.js +0 -55
- package/tiledesk/services/AiService.js +0 -230
- package/tiledesk/services/IntegrationService.js +0 -81
- package/tiledesk/services/UploadService.js +0 -88
- /package/{winston.js → src/config/logger.js} +0 -0
- /package/{tiledesk → src}/services/voiceEventEmitter.js +0 -0
- /package/{template → src/template}/configure.html +0 -0
- /package/{template → src/template}/css/configure.css +0 -0
- /package/{template → src/template}/css/error.css +0 -0
- /package/{template → src/template}/css/style.css +0 -0
- /package/{template → src/template}/error.html +0 -0
- /package/{tiledesk → src/utils}/constants.js +0 -0
- /package/{tiledesk → src/utils}/errors.js +0 -0
- /package/{tiledesk → src/utils}/utils.js +0 -0
package/package.json
CHANGED
|
@@ -1,48 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiledesk/tiledesk-voice-twilio-connector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-rc3",
|
|
4
4
|
"description": "Tiledesk VOICE Twilio connector",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Gabriele Panico",
|
|
7
7
|
"main": "index.js",
|
|
8
|
+
"files": [
|
|
9
|
+
"index.js",
|
|
10
|
+
"src/**/*",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
8
14
|
"repository": {
|
|
9
15
|
"type": "git",
|
|
10
16
|
"url": "https://github.com/Tiledesk/tiledesk-voice-twilio-connector"
|
|
11
17
|
},
|
|
12
18
|
"scripts": {
|
|
13
|
-
"test": "
|
|
19
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
14
20
|
"start": "node index.js"
|
|
15
21
|
},
|
|
16
|
-
"engines": {
|
|
17
|
-
"node": ">=18.0.0",
|
|
18
|
-
"npm": ">=8.15.0"
|
|
19
|
-
},
|
|
20
|
-
"keywords": [],
|
|
21
22
|
"dependencies": {
|
|
22
23
|
"app-root-path": "^3.0.0",
|
|
23
24
|
"axios": "^0.27.2",
|
|
24
|
-
"axios-retry": "^4.5.0",
|
|
25
|
-
"bluebird": "^3.7.2",
|
|
26
25
|
"body-parser": "^1.20.2",
|
|
27
|
-
"dotenv": "^16.
|
|
28
|
-
"
|
|
26
|
+
"dotenv": "^16.4.5",
|
|
27
|
+
"elevenlabs": "^1.59.0",
|
|
28
|
+
"express": "^4.19.2",
|
|
29
29
|
"form-data": "^4.0.0",
|
|
30
30
|
"handlebars": "^4.7.7",
|
|
31
|
-
"jobs-worker-queued": "^0.0.5",
|
|
32
31
|
"jsonwebtoken": "^8.5.1",
|
|
33
32
|
"mongodb": "^3.5.5",
|
|
34
|
-
"mongoose": "^6.5.0",
|
|
35
|
-
"multer": "^1.4.5-lts.1",
|
|
36
33
|
"redis": "^4.6.13",
|
|
37
|
-
"redis-lock": "^1.0.0",
|
|
38
|
-
"redlock": "^4.2.0",
|
|
39
34
|
"remove-markdown": "^0.6.2",
|
|
40
35
|
"twilio": "^5.2.1",
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
"winston": "^3.3.3"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=18.0.0",
|
|
40
|
+
"npm": ">=8.15.0"
|
|
44
41
|
},
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
|
|
42
|
+
"keywords": [
|
|
43
|
+
"node",
|
|
44
|
+
"tiledesk",
|
|
45
|
+
"twilio",
|
|
46
|
+
"voice",
|
|
47
|
+
"connector"
|
|
48
|
+
]
|
|
48
49
|
}
|
package/src/app.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
const express = require('express');
|
|
2
|
+
const config = require('./config');
|
|
3
|
+
const logger = require('./utils/logger');
|
|
4
|
+
const redis = require('redis');
|
|
5
|
+
|
|
6
|
+
// Services
|
|
7
|
+
const { VoiceChannel } = require('./services/channels/VoiceChannel');
|
|
8
|
+
// Use SDK version (with automatic HTTP fallback if SDK not available)
|
|
9
|
+
const { AiService } = require('./services/AiService.sdk');
|
|
10
|
+
// const { AiService } = require('./services/AiService');
|
|
11
|
+
const { IntegrationService } = require('./services/IntegrationService');
|
|
12
|
+
const { UploadService } = require('./services/UploadService');
|
|
13
|
+
const { KVBaseMongo } = require('./models/KeyValueStore');
|
|
14
|
+
|
|
15
|
+
// Routes
|
|
16
|
+
const voiceRoutes = require('./routes/voice');
|
|
17
|
+
const manageApp = require('./routes/manageApp');
|
|
18
|
+
const httpLogger = require('./middlewares/httpLogger');
|
|
19
|
+
|
|
20
|
+
const app = express();
|
|
21
|
+
app.use(express.json());
|
|
22
|
+
app.use(express.urlencoded({ extended: true }));
|
|
23
|
+
app.use(httpLogger);
|
|
24
|
+
|
|
25
|
+
app.get('/health-check', (req, res) => {
|
|
26
|
+
res.send("(VOICE) Health check passed");
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Merge configuration from options parameter with config (which already reads from process.env)
|
|
31
|
+
* Options parameter takes priority over config (which contains process.env values)
|
|
32
|
+
*/
|
|
33
|
+
function mergeConfig(options = {}) {
|
|
34
|
+
return {
|
|
35
|
+
port: options.PORT || config.port || 3000,
|
|
36
|
+
api: {
|
|
37
|
+
url: options.API_URL || config.api.url,
|
|
38
|
+
baseUrl: options.BASE_URL || config.api.baseUrl,
|
|
39
|
+
baseFileUrl: options.BASE_FILE_URL || config.api.baseFileUrl
|
|
40
|
+
},
|
|
41
|
+
database: {
|
|
42
|
+
mongodbUri: options.MONGODB_URI || config.database.mongodbUri
|
|
43
|
+
},
|
|
44
|
+
redis: {
|
|
45
|
+
host: options.REDIS_HOST || config.redis.host,
|
|
46
|
+
port: options.REDIS_PORT || config.redis.port,
|
|
47
|
+
password: options.REDIS_PASSWORD || config.redis.password
|
|
48
|
+
},
|
|
49
|
+
ai: {
|
|
50
|
+
openaiEndpoint: options.OPENAI_ENDPOINT || config.ai.openaiEndpoint,
|
|
51
|
+
elevenlabsEndpoint: options.ELEVENLABS_ENDPOINT || config.ai.elevenlabsEndpoint || "https://api.elevenlabs.io",
|
|
52
|
+
gptKey: options.GPT_KEY || config.ai.gptKey,
|
|
53
|
+
useElevenLabsSDK: options.USE_ELEVENLABS_SDK !== undefined
|
|
54
|
+
? (options.USE_ELEVENLABS_SDK === 'true' || options.USE_ELEVENLABS_SDK === '1' || options.USE_ELEVENLABS_SDK === true)
|
|
55
|
+
: config.ai.useElevenLabsSDK
|
|
56
|
+
},
|
|
57
|
+
app: {
|
|
58
|
+
brandName: options.BRAND_NAME || config.app.brandName,
|
|
59
|
+
basePoolingDelay: options.BASE_POOLING_DELAY || config.app.basePoolingDelay,
|
|
60
|
+
maxPollingTime: options.MAX_POLLING_TIME || config.app.maxPollingTime,
|
|
61
|
+
logLevel: options.VOICE_TWILIO_LOG || config.app.logLevel || "info"
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function startServer(options = {}) {
|
|
67
|
+
try {
|
|
68
|
+
// Merge configuration: options parameter takes priority over process.env
|
|
69
|
+
const mergedConfig = mergeConfig(options);
|
|
70
|
+
|
|
71
|
+
// Redis
|
|
72
|
+
let redisClient;
|
|
73
|
+
if (mergedConfig.redis.host && mergedConfig.redis.port) {
|
|
74
|
+
logger.info("Redis config: " + JSON.stringify(mergedConfig.redis));
|
|
75
|
+
redisClient = redis.createClient({
|
|
76
|
+
url: mergedConfig.redis.password ? `redis://:${mergedConfig.redis.password}@${mergedConfig.redis.host}:${mergedConfig.redis.port}` : `redis://${mergedConfig.redis.host}:${mergedConfig.redis.port}`
|
|
77
|
+
});
|
|
78
|
+
await redisClient.connect();
|
|
79
|
+
logger.info("Redis connected");
|
|
80
|
+
} else {
|
|
81
|
+
logger.error("Missing redis parameters");
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Mongo
|
|
85
|
+
const db = new KVBaseMongo('kvstore');
|
|
86
|
+
await db.connect(mergedConfig.database.mongodbUri);
|
|
87
|
+
logger.info("KVBaseMongo successfully connected.");
|
|
88
|
+
|
|
89
|
+
// Services
|
|
90
|
+
const voiceChannel = new VoiceChannel({
|
|
91
|
+
BASE_POOLING_DELAY: mergedConfig.app.basePoolingDelay,
|
|
92
|
+
redis_client: redisClient,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// Use SDK version (with automatic HTTP fallback if SDK not available)
|
|
96
|
+
const useSDK = mergedConfig.ai.useElevenLabsSDK;
|
|
97
|
+
|
|
98
|
+
if (useSDK) {
|
|
99
|
+
logger.info("Using ElevenLabs SDK implementation (with HTTP fallback if needed)");
|
|
100
|
+
} else {
|
|
101
|
+
logger.info("Using ElevenLabs HTTP implementation (SDK disabled via config)");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const aiService = new AiService({
|
|
105
|
+
OPENAI_ENDPOINT: mergedConfig.ai.openaiEndpoint,
|
|
106
|
+
ELEVENLABS_ENDPOINT: mergedConfig.ai.elevenlabsEndpoint,
|
|
107
|
+
API_URL: mergedConfig.api.url,
|
|
108
|
+
useSDK: useSDK // Pass flag to service to enable/disable SDK usage
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const integrationService = new IntegrationService({
|
|
112
|
+
API_URL: mergedConfig.api.url,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const uploadService = new UploadService({
|
|
116
|
+
API_URL: mergedConfig.api.baseFileUrl,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const services = {
|
|
120
|
+
voiceChannel,
|
|
121
|
+
aiService,
|
|
122
|
+
integrationService,
|
|
123
|
+
uploadService,
|
|
124
|
+
db,
|
|
125
|
+
redisClient,
|
|
126
|
+
config: {
|
|
127
|
+
API_URL: mergedConfig.api.url,
|
|
128
|
+
BASE_URL: mergedConfig.api.baseUrl,
|
|
129
|
+
GPT_KEY: mergedConfig.ai.gptKey,
|
|
130
|
+
MAX_POLLING_TIME: mergedConfig.app.maxPollingTime
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
app.use('/', voiceRoutes(services));
|
|
135
|
+
app.use('/manage', manageApp(services));
|
|
136
|
+
|
|
137
|
+
app.listen(mergedConfig.port, "0.0.0.0", () => {
|
|
138
|
+
logger.info("VOICE connector listening on port: " + mergedConfig.port);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
} catch (err) {
|
|
142
|
+
logger.error("Unable to start tiledesk-voice-twilio-connector.", err);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
module.exports = { app, startServer };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require('dotenv').config();
|
|
2
|
+
|
|
3
|
+
const config = {
|
|
4
|
+
port: process.env.PORT || 3000,
|
|
5
|
+
api: {
|
|
6
|
+
url: process.env.API_URL,
|
|
7
|
+
baseUrl: process.env.BASE_URL,
|
|
8
|
+
baseFileUrl: process.env.BASE_FILE_URL
|
|
9
|
+
},
|
|
10
|
+
database: {
|
|
11
|
+
mongodbUri: process.env.MONGODB_URI
|
|
12
|
+
},
|
|
13
|
+
redis: {
|
|
14
|
+
host: process.env.REDIS_HOST,
|
|
15
|
+
port: process.env.REDIS_PORT,
|
|
16
|
+
password: process.env.REDIS_PASSWORD
|
|
17
|
+
},
|
|
18
|
+
ai: {
|
|
19
|
+
openaiEndpoint: process.env.OPENAI_ENDPOINT,
|
|
20
|
+
elevenlabsEndpoint: process.env.ELEVENLABS_ENDPOINT || "https://api.elevenlabs.io",
|
|
21
|
+
gptKey: process.env.GPT_KEY,
|
|
22
|
+
useElevenLabsSDK: process.env.USE_ELEVENLABS_SDK === 'true' || process.env.USE_ELEVENLABS_SDK === '1'
|
|
23
|
+
},
|
|
24
|
+
app: {
|
|
25
|
+
brandName: process.env.BRAND_NAME,
|
|
26
|
+
basePoolingDelay: process.env.BASE_POOLING_DELAY,
|
|
27
|
+
maxPollingTime: process.env.MAX_POLLING_TIME,
|
|
28
|
+
logLevel: process.env.VOICE_TWILIO_LOG || "info"
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
module.exports = config;
|