channelkit 1.0.0
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 +21 -0
- package/README.md +829 -0
- package/config.example.yaml +37 -0
- package/dist/api/middleware/auth.d.ts +14 -0
- package/dist/api/middleware/auth.d.ts.map +1 -0
- package/dist/api/middleware/auth.js +130 -0
- package/dist/api/middleware/auth.js.map +1 -0
- package/dist/api/routes/config.d.ts +4 -0
- package/dist/api/routes/config.d.ts.map +1 -0
- package/dist/api/routes/config.js +794 -0
- package/dist/api/routes/config.js.map +1 -0
- package/dist/api/routes/dashboard.d.ts +4 -0
- package/dist/api/routes/dashboard.d.ts.map +1 -0
- package/dist/api/routes/dashboard.js +89 -0
- package/dist/api/routes/dashboard.js.map +1 -0
- package/dist/api/routes/inbound.d.ts +4 -0
- package/dist/api/routes/inbound.d.ts.map +1 -0
- package/dist/api/routes/inbound.js +293 -0
- package/dist/api/routes/inbound.js.map +1 -0
- package/dist/api/routes/logs.d.ts +4 -0
- package/dist/api/routes/logs.d.ts.map +1 -0
- package/dist/api/routes/logs.js +49 -0
- package/dist/api/routes/logs.js.map +1 -0
- package/dist/api/routes/mcp.d.ts +4 -0
- package/dist/api/routes/mcp.d.ts.map +1 -0
- package/dist/api/routes/mcp.js +100 -0
- package/dist/api/routes/mcp.js.map +1 -0
- package/dist/api/routes/restart.d.ts +4 -0
- package/dist/api/routes/restart.d.ts.map +1 -0
- package/dist/api/routes/restart.js +11 -0
- package/dist/api/routes/restart.js.map +1 -0
- package/dist/api/routes/send.d.ts +4 -0
- package/dist/api/routes/send.d.ts.map +1 -0
- package/dist/api/routes/send.js +66 -0
- package/dist/api/routes/send.js.map +1 -0
- package/dist/api/routes/settings.d.ts +4 -0
- package/dist/api/routes/settings.d.ts.map +1 -0
- package/dist/api/routes/settings.js +133 -0
- package/dist/api/routes/settings.js.map +1 -0
- package/dist/api/routes/tunnel.d.ts +4 -0
- package/dist/api/routes/tunnel.d.ts.map +1 -0
- package/dist/api/routes/tunnel.js +209 -0
- package/dist/api/routes/tunnel.js.map +1 -0
- package/dist/api/routes/twilio.d.ts +4 -0
- package/dist/api/routes/twilio.d.ts.map +1 -0
- package/dist/api/routes/twilio.js +138 -0
- package/dist/api/routes/twilio.js.map +1 -0
- package/dist/api/routes/update.d.ts +4 -0
- package/dist/api/routes/update.d.ts.map +1 -0
- package/dist/api/routes/update.js +42 -0
- package/dist/api/routes/update.js.map +1 -0
- package/dist/api/server.d.ts +52 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +415 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/types.d.ts +61 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +3 -0
- package/dist/api/types.js.map +1 -0
- package/dist/channels/base.d.ts +15 -0
- package/dist/channels/base.d.ts.map +1 -0
- package/dist/channels/base.js +20 -0
- package/dist/channels/base.js.map +1 -0
- package/dist/channels/email/gmail.d.ts +36 -0
- package/dist/channels/email/gmail.d.ts.map +1 -0
- package/dist/channels/email/gmail.js +351 -0
- package/dist/channels/email/gmail.js.map +1 -0
- package/dist/channels/email/index.d.ts +3 -0
- package/dist/channels/email/index.d.ts.map +1 -0
- package/dist/channels/email/index.js +8 -0
- package/dist/channels/email/index.js.map +1 -0
- package/dist/channels/email/resend.d.ts +29 -0
- package/dist/channels/email/resend.d.ts.map +1 -0
- package/dist/channels/email/resend.js +155 -0
- package/dist/channels/email/resend.js.map +1 -0
- package/dist/channels/endpoint/index.d.ts +21 -0
- package/dist/channels/endpoint/index.d.ts.map +1 -0
- package/dist/channels/endpoint/index.js +80 -0
- package/dist/channels/endpoint/index.js.map +1 -0
- package/dist/channels/sms/index.d.ts +37 -0
- package/dist/channels/sms/index.d.ts.map +1 -0
- package/dist/channels/sms/index.js +163 -0
- package/dist/channels/sms/index.js.map +1 -0
- package/dist/channels/telegram/index.d.ts +24 -0
- package/dist/channels/telegram/index.d.ts.map +1 -0
- package/dist/channels/telegram/index.js +231 -0
- package/dist/channels/telegram/index.js.map +1 -0
- package/dist/channels/voice/index.d.ts +62 -0
- package/dist/channels/voice/index.d.ts.map +1 -0
- package/dist/channels/voice/index.js +286 -0
- package/dist/channels/voice/index.js.map +1 -0
- package/dist/channels/whatsapp/index.d.ts +31 -0
- package/dist/channels/whatsapp/index.d.ts.map +1 -0
- package/dist/channels/whatsapp/index.js +383 -0
- package/dist/channels/whatsapp/index.js.map +1 -0
- package/dist/cli/commands/demo.d.ts +4 -0
- package/dist/cli/commands/demo.d.ts.map +1 -0
- package/dist/cli/commands/demo.js +55 -0
- package/dist/cli/commands/demo.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +254 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install-skill.d.ts +4 -0
- package/dist/cli/commands/install-skill.d.ts.map +1 -0
- package/dist/cli/commands/install-skill.js +60 -0
- package/dist/cli/commands/install-skill.js.map +1 -0
- package/dist/cli/commands/send.d.ts +5 -0
- package/dist/cli/commands/send.d.ts.map +1 -0
- package/dist/cli/commands/send.js +46 -0
- package/dist/cli/commands/send.js.map +1 -0
- package/dist/cli/commands/start.d.ts +5 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +129 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/helpers.d.ts +26 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +120 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +282 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/wizards/channel.d.ts +4 -0
- package/dist/cli/wizards/channel.d.ts.map +1 -0
- package/dist/cli/wizards/channel.js +285 -0
- package/dist/cli/wizards/channel.js.map +1 -0
- package/dist/cli/wizards/provision.d.ts +4 -0
- package/dist/cli/wizards/provision.d.ts.map +1 -0
- package/dist/cli/wizards/provision.js +213 -0
- package/dist/cli/wizards/provision.js.map +1 -0
- package/dist/cli/wizards/service.d.ts +5 -0
- package/dist/cli/wizards/service.d.ts.map +1 -0
- package/dist/cli/wizards/service.js +212 -0
- package/dist/cli/wizards/service.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/parser.d.ts +6 -0
- package/dist/config/parser.d.ts.map +1 -0
- package/dist/config/parser.js +37 -0
- package/dist/config/parser.js.map +1 -0
- package/dist/config/types.d.ts +170 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +3 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/apiServer.d.ts +2 -0
- package/dist/core/apiServer.d.ts.map +1 -0
- package/dist/core/apiServer.js +7 -0
- package/dist/core/apiServer.js.map +1 -0
- package/dist/core/groupStore.d.ts +19 -0
- package/dist/core/groupStore.d.ts.map +1 -0
- package/dist/core/groupStore.js +48 -0
- package/dist/core/groupStore.js.map +1 -0
- package/dist/core/logger.d.ts +42 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +142 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/messageHandler.d.ts +15 -0
- package/dist/core/messageHandler.d.ts.map +1 -0
- package/dist/core/messageHandler.js +309 -0
- package/dist/core/messageHandler.js.map +1 -0
- package/dist/core/restart.d.ts +3 -0
- package/dist/core/restart.d.ts.map +1 -0
- package/dist/core/restart.js +35 -0
- package/dist/core/restart.js.map +1 -0
- package/dist/core/router.d.ts +56 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +168 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/tunnel.d.ts +16 -0
- package/dist/core/tunnel.d.ts.map +1 -0
- package/dist/core/tunnel.js +99 -0
- package/dist/core/tunnel.js.map +1 -0
- package/dist/core/types.d.ts +54 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/updater.d.ts +44 -0
- package/dist/core/updater.d.ts.map +1 -0
- package/dist/core/updater.js +264 -0
- package/dist/core/updater.js.map +1 -0
- package/dist/core/webhook.d.ts +26 -0
- package/dist/core/webhook.d.ts.map +1 -0
- package/dist/core/webhook.js +224 -0
- package/dist/core/webhook.js.map +1 -0
- package/dist/dashboard/assets/browser-D_-rzKir.js +8 -0
- package/dist/dashboard/assets/index-CNa084vI.js +88 -0
- package/dist/dashboard/assets/index-CRvIEyjF.css +1 -0
- package/dist/dashboard/index.html +17 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +551 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +6 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +45 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +197 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +16 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +502 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/media/formatter.d.ts +12 -0
- package/dist/media/formatter.d.ts.map +1 -0
- package/dist/media/formatter.js +147 -0
- package/dist/media/formatter.js.map +1 -0
- package/dist/media/processor.d.ts +33 -0
- package/dist/media/processor.d.ts.map +1 -0
- package/dist/media/processor.js +145 -0
- package/dist/media/processor.js.map +1 -0
- package/dist/media/stt.d.ts +16 -0
- package/dist/media/stt.d.ts.map +1 -0
- package/dist/media/stt.js +298 -0
- package/dist/media/stt.js.map +1 -0
- package/dist/media/tts.d.ts +19 -0
- package/dist/media/tts.d.ts.map +1 -0
- package/dist/media/tts.js +135 -0
- package/dist/media/tts.js.map +1 -0
- package/dist/onboarding/index.d.ts +28 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +144 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +14 -0
- package/dist/paths.js.map +1 -0
- package/dist/provisioning/twilio.d.ts +51 -0
- package/dist/provisioning/twilio.d.ts.map +1 -0
- package/dist/provisioning/twilio.js +175 -0
- package/dist/provisioning/twilio.js.map +1 -0
- package/echo-server.js +163 -0
- package/package.json +79 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Twilio Voice Channel
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 1. Incoming call → POST /inbound/voice/<channel>
|
|
7
|
+
* 2. ChannelKit returns TwiML: greeting + record
|
|
8
|
+
* 3. Recording done → POST /inbound/voice/<channel>/recording
|
|
9
|
+
* 4. ChannelKit: STT → webhook → TTS → respond to caller
|
|
10
|
+
* 5. Loop back to record (default) — webhook returns { endcall: true } to hang up
|
|
11
|
+
*/
|
|
12
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.TwilioVoiceChannel = void 0;
|
|
17
|
+
const crypto_1 = require("crypto");
|
|
18
|
+
const twilio_1 = __importDefault(require("twilio"));
|
|
19
|
+
const base_1 = require("../base");
|
|
20
|
+
class TwilioVoiceChannel extends base_1.Channel {
|
|
21
|
+
client;
|
|
22
|
+
pendingCalls = new Map();
|
|
23
|
+
publicUrl = null;
|
|
24
|
+
audioCache = new Map();
|
|
25
|
+
statusMessage = null;
|
|
26
|
+
constructor(name, config) {
|
|
27
|
+
super(name, config);
|
|
28
|
+
this.connected = false;
|
|
29
|
+
this.statusMessage = 'Waiting for public URL to configure Twilio webhook. Start a tunnel or use --public-url.';
|
|
30
|
+
this.client = (0, twilio_1.default)(config.account_sid, config.auth_token);
|
|
31
|
+
}
|
|
32
|
+
get cfg() {
|
|
33
|
+
return this.config;
|
|
34
|
+
}
|
|
35
|
+
setPublicUrl(url) {
|
|
36
|
+
this.publicUrl = url;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Store an audio buffer in cache and return its ID
|
|
40
|
+
*/
|
|
41
|
+
storeAudio(buffer, mimetype) {
|
|
42
|
+
const id = (0, crypto_1.randomUUID)();
|
|
43
|
+
this.audioCache.set(id, { buffer, mimetype, createdAt: Date.now() });
|
|
44
|
+
// Auto-cleanup after 60s
|
|
45
|
+
setTimeout(() => this.audioCache.delete(id), 60_000);
|
|
46
|
+
return id;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Retrieve and remove an audio buffer from cache
|
|
50
|
+
*/
|
|
51
|
+
getAudio(id) {
|
|
52
|
+
const entry = this.audioCache.get(id);
|
|
53
|
+
if (entry)
|
|
54
|
+
this.audioCache.delete(id);
|
|
55
|
+
return entry;
|
|
56
|
+
}
|
|
57
|
+
async connect() {
|
|
58
|
+
try {
|
|
59
|
+
const numbers = await this.client.incomingPhoneNumbers.list({ phoneNumber: this.cfg.number, limit: 1 });
|
|
60
|
+
if (numbers.length > 0) {
|
|
61
|
+
console.log(`✅ Twilio Voice connected: ${this.name} (${this.cfg.number})`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.warn(`⚠️ Twilio number ${this.cfg.number} not found in account.`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.warn(`⚠️ Could not verify Twilio number: ${err.message}`);
|
|
69
|
+
}
|
|
70
|
+
if (!this.publicUrl) {
|
|
71
|
+
console.log(` 📞 Waiting for public URL to configure voice webhook (use --tunnel or --public-url)`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async disconnect() {
|
|
75
|
+
// Nothing to disconnect
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Set the voice webhook URL on this Twilio number
|
|
79
|
+
*/
|
|
80
|
+
async setWebhookUrl(url) {
|
|
81
|
+
try {
|
|
82
|
+
const numbers = await this.client.incomingPhoneNumbers.list({ phoneNumber: this.cfg.number, limit: 1 });
|
|
83
|
+
if (numbers.length > 0) {
|
|
84
|
+
await this.client.incomingPhoneNumbers(numbers[0].sid).update({
|
|
85
|
+
voiceUrl: url,
|
|
86
|
+
voiceMethod: 'POST',
|
|
87
|
+
});
|
|
88
|
+
console.log(` 📞 Updated Twilio voice webhook for ${this.cfg.number}`);
|
|
89
|
+
this.connected = true;
|
|
90
|
+
this.statusMessage = null;
|
|
91
|
+
this.emit('connected');
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
this.connected = false;
|
|
95
|
+
this.statusMessage = `Phone number ${this.cfg.number} not found in your Twilio account. Check your Twilio console.`;
|
|
96
|
+
this.emit('disconnected');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
this.connected = false;
|
|
101
|
+
this.statusMessage = `Failed to configure Twilio webhook: ${err.message}`;
|
|
102
|
+
this.emit('disconnected');
|
|
103
|
+
console.error(`[voice:${this.name}] Failed to set webhook:`, err);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Handle incoming call — returns TwiML
|
|
108
|
+
*/
|
|
109
|
+
handleIncomingCall(payload, voiceConfig) {
|
|
110
|
+
const callSid = payload.CallSid;
|
|
111
|
+
const from = payload.From || '';
|
|
112
|
+
const VoiceResponse = twilio_1.default.twiml.VoiceResponse;
|
|
113
|
+
const twiml = new VoiceResponse();
|
|
114
|
+
const language = voiceConfig?.language || 'en-US';
|
|
115
|
+
const voiceName = voiceConfig?.voice_name;
|
|
116
|
+
const maxRecord = voiceConfig?.max_record_seconds || 30;
|
|
117
|
+
// Store pending call
|
|
118
|
+
this.pendingCalls.set(callSid, { callSid, from });
|
|
119
|
+
// Greeting
|
|
120
|
+
const greeting = voiceConfig?.greeting || 'Hello. Please speak after the beep.';
|
|
121
|
+
const sayOpts = { language };
|
|
122
|
+
if (voiceName)
|
|
123
|
+
sayOpts.voice = voiceName;
|
|
124
|
+
twiml.say(sayOpts, greeting);
|
|
125
|
+
// Record
|
|
126
|
+
const recordUrl = `${this.publicUrl}/inbound/voice/${this.name}/recording`;
|
|
127
|
+
twiml.record({
|
|
128
|
+
action: recordUrl,
|
|
129
|
+
maxLength: maxRecord,
|
|
130
|
+
playBeep: true,
|
|
131
|
+
transcribe: false, // we do our own STT
|
|
132
|
+
});
|
|
133
|
+
// Fallback if no recording (caller hung up)
|
|
134
|
+
twiml.say(sayOpts, 'No message received. Goodbye.');
|
|
135
|
+
twiml.hangup();
|
|
136
|
+
console.log(`[voice:${this.name}] Incoming call from ${from} (${callSid})`);
|
|
137
|
+
return twiml.toString();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Handle recording callback — downloads audio, emits as message
|
|
141
|
+
*/
|
|
142
|
+
async handleRecording(payload, voiceConfig) {
|
|
143
|
+
const callSid = payload.CallSid;
|
|
144
|
+
const recordingUrl = payload.RecordingUrl;
|
|
145
|
+
const from = payload.From || this.pendingCalls.get(callSid)?.from || '';
|
|
146
|
+
const VoiceResponse = twilio_1.default.twiml.VoiceResponse;
|
|
147
|
+
const twiml = new VoiceResponse();
|
|
148
|
+
const language = voiceConfig?.language || 'en-US';
|
|
149
|
+
const voiceName = voiceConfig?.voice_name;
|
|
150
|
+
const sayOpts = { language };
|
|
151
|
+
if (voiceName)
|
|
152
|
+
sayOpts.voice = voiceName;
|
|
153
|
+
if (!recordingUrl) {
|
|
154
|
+
twiml.say(sayOpts, voiceConfig?.hold_message || 'Sorry, no recording received. Goodbye.');
|
|
155
|
+
twiml.hangup();
|
|
156
|
+
return twiml.toString();
|
|
157
|
+
}
|
|
158
|
+
// Hold message or music while we process
|
|
159
|
+
const holdMessage = voiceConfig?.hold_message;
|
|
160
|
+
const holdMusic = voiceConfig?.hold_music;
|
|
161
|
+
if (holdMessage) {
|
|
162
|
+
twiml.say(sayOpts, holdMessage);
|
|
163
|
+
}
|
|
164
|
+
else if (holdMusic) {
|
|
165
|
+
twiml.play(holdMusic);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
twiml.pause({ length: 1 });
|
|
169
|
+
}
|
|
170
|
+
// Download recording audio
|
|
171
|
+
try {
|
|
172
|
+
const audioUrl = `${recordingUrl}.mp3`;
|
|
173
|
+
const res = await fetch(audioUrl, {
|
|
174
|
+
headers: {
|
|
175
|
+
'Authorization': 'Basic ' + Buffer.from(`${this.cfg.account_sid}:${this.cfg.auth_token}`).toString('base64'),
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
const buffer = Buffer.from(await res.arrayBuffer());
|
|
179
|
+
// Emit as unified message — STT + webhook will be handled by the pipeline
|
|
180
|
+
const unified = {
|
|
181
|
+
id: callSid + '-' + Date.now(),
|
|
182
|
+
channel: 'voice',
|
|
183
|
+
from,
|
|
184
|
+
type: 'audio',
|
|
185
|
+
text: undefined,
|
|
186
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
187
|
+
media: {
|
|
188
|
+
buffer,
|
|
189
|
+
mimetype: 'audio/mpeg',
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
// Store call context for response routing
|
|
193
|
+
unified._callSid = callSid;
|
|
194
|
+
unified._voiceConfig = voiceConfig;
|
|
195
|
+
this.emitMessage(unified);
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
console.error(`[voice:${this.name}] Failed to download recording:`, err);
|
|
199
|
+
twiml.say(sayOpts, 'Sorry, there was an error processing your message. Goodbye.');
|
|
200
|
+
twiml.hangup();
|
|
201
|
+
}
|
|
202
|
+
// Return hold TwiML — the actual response will come via the API
|
|
203
|
+
// We need to use <Redirect> to poll for the response
|
|
204
|
+
const redirectUrl = `${this.publicUrl}/inbound/voice/${this.name}/respond/${callSid}`;
|
|
205
|
+
twiml.redirect({ method: 'POST' }, redirectUrl);
|
|
206
|
+
return twiml.toString();
|
|
207
|
+
}
|
|
208
|
+
// Store responses from webhook for active calls
|
|
209
|
+
callResponses = new Map();
|
|
210
|
+
/**
|
|
211
|
+
* Store a webhook response for an active call
|
|
212
|
+
*/
|
|
213
|
+
setCallResponse(callSid, response) {
|
|
214
|
+
this.callResponses.set(callSid, response);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Handle respond redirect — check if webhook response is ready
|
|
218
|
+
*/
|
|
219
|
+
handleRespond(callSid, voiceConfig) {
|
|
220
|
+
const VoiceResponse = twilio_1.default.twiml.VoiceResponse;
|
|
221
|
+
const twiml = new VoiceResponse();
|
|
222
|
+
const language = voiceConfig?.language || 'en-US';
|
|
223
|
+
const voiceName = voiceConfig?.voice_name;
|
|
224
|
+
const sayOpts = { language };
|
|
225
|
+
if (voiceName)
|
|
226
|
+
sayOpts.voice = voiceName;
|
|
227
|
+
const response = this.callResponses.get(callSid);
|
|
228
|
+
if (!response) {
|
|
229
|
+
// Not ready yet — wait and redirect again
|
|
230
|
+
const holdMessage = voiceConfig?.hold_message;
|
|
231
|
+
const holdMusic = voiceConfig?.hold_music;
|
|
232
|
+
if (holdMusic) {
|
|
233
|
+
twiml.play(holdMusic);
|
|
234
|
+
}
|
|
235
|
+
else if (holdMessage) {
|
|
236
|
+
twiml.say(sayOpts, holdMessage);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
twiml.pause({ length: 2 });
|
|
240
|
+
}
|
|
241
|
+
const redirectUrl = `${this.publicUrl}/inbound/voice/${this.name}/respond/${callSid}`;
|
|
242
|
+
twiml.redirect({ method: 'POST' }, redirectUrl);
|
|
243
|
+
return twiml.toString();
|
|
244
|
+
}
|
|
245
|
+
// Response ready — play it
|
|
246
|
+
this.callResponses.delete(callSid);
|
|
247
|
+
if (response.media?.buffer && response.media.mimetype?.includes('audio')) {
|
|
248
|
+
// TTS audio — store in cache and play via URL
|
|
249
|
+
const audioId = this.storeAudio(Buffer.isBuffer(response.media.buffer) ? response.media.buffer : Buffer.from(response.media.buffer), response.media.mimetype || 'audio/mpeg');
|
|
250
|
+
const audioUrl = `${this.publicUrl}/inbound/voice/${this.name}/audio/${audioId}`;
|
|
251
|
+
twiml.play(audioUrl);
|
|
252
|
+
}
|
|
253
|
+
else if (response.text) {
|
|
254
|
+
twiml.say(sayOpts, response.text);
|
|
255
|
+
}
|
|
256
|
+
if (response.endcall) {
|
|
257
|
+
// Webhook explicitly asked to end the call
|
|
258
|
+
twiml.say(sayOpts, 'Goodbye.');
|
|
259
|
+
twiml.hangup();
|
|
260
|
+
this.pendingCalls.delete(callSid);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Default: loop back to record (keep the conversation going)
|
|
264
|
+
const maxRecord = voiceConfig?.max_record_seconds || 30;
|
|
265
|
+
const recordUrl = `${this.publicUrl}/inbound/voice/${this.name}/recording`;
|
|
266
|
+
twiml.record({
|
|
267
|
+
action: recordUrl,
|
|
268
|
+
maxLength: maxRecord,
|
|
269
|
+
playBeep: true,
|
|
270
|
+
transcribe: false,
|
|
271
|
+
});
|
|
272
|
+
// Fallback if caller stays silent
|
|
273
|
+
twiml.say(sayOpts, 'Goodbye.');
|
|
274
|
+
twiml.hangup();
|
|
275
|
+
}
|
|
276
|
+
return twiml.toString();
|
|
277
|
+
}
|
|
278
|
+
// send() is not used for voice — responses go through TwiML
|
|
279
|
+
async send(_to, response) {
|
|
280
|
+
// Voice responses are handled via setCallResponse + TwiML redirect
|
|
281
|
+
// This is a no-op but required by the Channel interface
|
|
282
|
+
console.log(`[voice:${this.name}] send() called — voice uses TwiML flow, not direct send`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
exports.TwilioVoiceChannel = TwilioVoiceChannel;
|
|
286
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/voice/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;AAEH,mCAAoC;AACpC,oDAA4B;AAC5B,kCAAkC;AAkBlC,MAAa,kBAAmB,SAAQ,cAAO;IACrC,MAAM,CAA4B;IAClC,YAAY,GAA6B,IAAI,GAAG,EAAE,CAAC;IACnD,SAAS,GAAkB,IAAI,CAAC;IAChC,UAAU,GAAiC,IAAI,GAAG,EAAE,CAAC;IACtD,aAAa,GAAkB,IAAI,CAAC;IAE3C,YAAY,IAAY,EAAE,MAAgC;QACxD,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,yFAAyF,CAAC;QAC/G,IAAI,CAAC,MAAM,GAAG,IAAA,gBAAM,EAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9D,CAAC;IAED,IAAY,GAAG;QACb,OAAO,IAAI,CAAC,MAAkC,CAAC;IACjD,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc,EAAE,QAAgB;QACzC,MAAM,EAAE,GAAG,IAAA,mBAAU,GAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrE,yBAAyB;QACzB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,EAAU;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,KAAK;YAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACxG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,GAAG,CAAC,MAAM,wBAAwB,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,uCAAwC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,wBAAwB;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,GAAW;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACxG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;oBAC5D,QAAQ,EAAE,GAAG;oBACb,WAAW,EAAE,MAAM;iBACpB,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,yCAAyC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;gBACxE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,aAAa,GAAG,gBAAgB,IAAI,CAAC,GAAG,CAAC,MAAM,+DAA+D,CAAC;gBACpH,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,uCAAwC,GAAa,CAAC,OAAO,EAAE,CAAC;YACrF,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,0BAA0B,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAY,EAAE,WAAgC;QAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,gBAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAElC,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,OAAO,CAAC;QAClD,MAAM,SAAS,GAAG,WAAW,EAAE,UAAU,CAAC;QAC1C,MAAM,SAAS,GAAG,WAAW,EAAE,kBAAkB,IAAI,EAAE,CAAC;QAExD,qBAAqB;QACrB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,WAAW;QACX,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,qCAAqC,CAAC;QAChF,MAAM,OAAO,GAAQ,EAAE,QAAQ,EAAE,CAAC;QAClC,IAAI,SAAS;YAAE,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;QACzC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE7B,SAAS;QACT,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,IAAI,YAAY,CAAC;QAC3E,KAAK,CAAC,MAAM,CAAC;YACX,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,SAAS;YACpB,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,KAAK,EAAE,oBAAoB;SACxC,CAAC,CAAC;QAEH,4CAA4C;QAC5C,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;QACpD,KAAK,CAAC,MAAM,EAAE,CAAC;QAEf,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,wBAAwB,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC;QAC5E,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,OAAY,EAAE,WAAgC;QAClE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAExE,MAAM,aAAa,GAAG,gBAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,OAAO,CAAC;QAClD,MAAM,SAAS,GAAG,WAAW,EAAE,UAAU,CAAC;QAC1C,MAAM,OAAO,GAAQ,EAAE,QAAQ,EAAE,CAAC;QAClC,IAAI,SAAS;YAAE,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;QAEzC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,IAAI,wCAAwC,CAAC,CAAC;YAC1F,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC;QAED,yCAAyC;QACzC,MAAM,WAAW,GAAG,WAAW,EAAE,YAAY,CAAC;QAC9C,MAAM,SAAS,GAAG,WAAW,EAAE,UAAU,CAAC;QAE1C,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,SAAS,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,GAAG,YAAY,MAAM,CAAC;YACvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBAChC,OAAO,EAAE;oBACP,eAAe,EAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;iBAC7G;aACF,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAEpD,0EAA0E;YAC1E,MAAM,OAAO,GAAmB;gBAC9B,EAAE,EAAE,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;gBAC9B,OAAO,EAAE,OAAO;gBAChB,IAAI;gBACJ,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;gBACxC,KAAK,EAAE;oBACL,MAAM;oBACN,QAAQ,EAAE,YAAY;iBACvB;aACF,CAAC;YAEF,0CAA0C;YACzC,OAAe,CAAC,QAAQ,GAAG,OAAO,CAAC;YACnC,OAAe,CAAC,YAAY,GAAG,WAAW,CAAC;YAE5C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,iCAAiC,EAAE,GAAG,CAAC,CAAC;YACzE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,6DAA6D,CAAC,CAAC;YAClF,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC;QAED,gEAAgE;QAChE,qDAAqD;QACrD,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,IAAI,YAAY,OAAO,EAAE,CAAC;QACtF,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;QAEhD,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,gDAAgD;IACxC,aAAa,GAAiC,IAAI,GAAG,EAAE,CAAC;IAEhE;;OAEG;IACH,eAAe,CAAC,OAAe,EAAE,QAAyB;QACxD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAe,EAAE,WAAgC;QAC7D,MAAM,aAAa,GAAG,gBAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,OAAO,CAAC;QAClD,MAAM,SAAS,GAAG,WAAW,EAAE,UAAU,CAAC;QAC1C,MAAM,OAAO,GAAQ,EAAE,QAAQ,EAAE,CAAC;QAClC,IAAI,SAAS;YAAE,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;QAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,0CAA0C;YAC1C,MAAM,WAAW,GAAG,WAAW,EAAE,YAAY,CAAC;YAC9C,MAAM,SAAS,GAAG,WAAW,EAAE,UAAU,CAAC;YAC1C,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,WAAW,EAAE,CAAC;gBACvB,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,IAAI,YAAY,OAAO,EAAE,CAAC;YACtF,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnC,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACzE,8CAA8C;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAC7B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EACnG,QAAQ,CAAC,KAAK,CAAC,QAAQ,IAAI,YAAY,CACxC,CAAC;YACF,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,IAAI,UAAU,OAAO,EAAE,CAAC;YACjF,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,2CAA2C;YAC3C,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC/B,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,6DAA6D;YAC7D,MAAM,SAAS,GAAG,WAAW,EAAE,kBAAkB,IAAI,EAAE,CAAC;YACxD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,IAAI,YAAY,CAAC;YAC3E,KAAK,CAAC,MAAM,CAAC;gBACX,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;YACH,kCAAkC;YAClC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC/B,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC;QAED,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,QAAyB;QAC/C,mEAAmE;QACnE,wDAAwD;QACxD,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,0DAA0D,CAAC,CAAC;IAC7F,CAAC;CACF;AAjSD,gDAiSC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Channel } from '../base';
|
|
2
|
+
import { WhatsAppChannelConfig } from '../../config/types';
|
|
3
|
+
import { WebhookResponse } from '../../core/types';
|
|
4
|
+
export declare function isBaileysAvailable(): boolean;
|
|
5
|
+
export declare class WhatsAppChannel extends Channel {
|
|
6
|
+
private processedIds;
|
|
7
|
+
/**
|
|
8
|
+
* Pair a new WhatsApp device by showing a QR code.
|
|
9
|
+
* Creates a temporary Baileys connection, waits for successful pairing, then disconnects.
|
|
10
|
+
* Auth state is persisted to authDir for later use by connect().
|
|
11
|
+
*/
|
|
12
|
+
static pair(authDir: string, onQR?: (qr: string) => void): Promise<void>;
|
|
13
|
+
private sock;
|
|
14
|
+
private authDir;
|
|
15
|
+
private reconnectAttempts;
|
|
16
|
+
private reconnectTimer;
|
|
17
|
+
private static readonly MAX_RECONNECT_ATTEMPTS;
|
|
18
|
+
constructor(name: string, config: WhatsAppChannelConfig, authDir?: string);
|
|
19
|
+
private scheduleReconnect;
|
|
20
|
+
getSocket(): any;
|
|
21
|
+
createGroup(name: string, participants: string[]): Promise<{
|
|
22
|
+
id: string;
|
|
23
|
+
subject: string;
|
|
24
|
+
}>;
|
|
25
|
+
sendToJid(jid: string, text: string): Promise<void>;
|
|
26
|
+
connect(): Promise<void>;
|
|
27
|
+
disconnect(): Promise<void>;
|
|
28
|
+
send(to: string, response: WebhookResponse): Promise<void>;
|
|
29
|
+
private toUnified;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/whatsapp/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAkB,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAoBnE,wBAAgB,kBAAkB,IAAI,OAAO,CAO5C;AAED,qBAAa,eAAgB,SAAQ,OAAO;IAC1C,OAAO,CAAC,YAAY,CAA0B;IAC9C;;;;OAIG;WACU,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA6E9E,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAM;gBAExC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,SAAmB;IAMnF,OAAO,CAAC,iBAAiB;IAWzB,SAAS,IAAI,GAAG;IAIV,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAM3F,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8HxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAuChE,OAAO,CAAC,SAAS;CAyClB"}
|