@memberjunction/ai-bridge-twilio 6.2.0-edge.2 → 6.2.0-edge.3
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/dist/real-twilio-bindings.d.ts +59 -5
- package/dist/real-twilio-bindings.d.ts.map +1 -1
- package/dist/real-twilio-bindings.js +63 -15
- package/dist/real-twilio-bindings.js.map +1 -1
- package/dist/twilio-call-sdk.d.ts +13 -0
- package/dist/twilio-call-sdk.d.ts.map +1 -1
- package/dist/twilio-call-sdk.js +13 -0
- package/dist/twilio-call-sdk.js.map +1 -1
- package/dist/twilio-ingress.d.ts +19 -1
- package/dist/twilio-ingress.d.ts.map +1 -1
- package/dist/twilio-ingress.js +30 -2
- package/dist/twilio-ingress.js.map +1 -1
- package/dist/twilio-rest-client.d.ts +2 -1
- package/dist/twilio-rest-client.d.ts.map +1 -1
- package/dist/twilio-rest-client.js +10 -1
- package/dist/twilio-rest-client.js.map +1 -1
- package/package.json +5 -5
|
@@ -26,6 +26,12 @@
|
|
|
26
26
|
* @see `/plans/realtime/bridges-and-widget/telephony-vendor-bindings.md` §2, §3 (T1).
|
|
27
27
|
*/
|
|
28
28
|
import { ITwilioClientBindings } from './twilio-call-sdk.js';
|
|
29
|
+
/**
|
|
30
|
+
* The custom-parameter name MJ stamps on every `<Stream>` it emits (`<Parameter name="mjToken" .../>`).
|
|
31
|
+
* Twilio echoes it back on the Media-Streams `start` frame as `start.customParameters.mjToken`, which is
|
|
32
|
+
* how the media websocket proves it belongs to a call MJ itself accepted or placed.
|
|
33
|
+
*/
|
|
34
|
+
export declare const TWILIO_MEDIA_TOKEN_PARAMETER = "mjToken";
|
|
29
35
|
/**
|
|
30
36
|
* Builds the outbound-dial / inbound-answer TwiML that opens a **bidirectional** Media-Streams websocket
|
|
31
37
|
* to the agent's media endpoint. `<Connect><Stream>` (not `<Start><Stream>`) is the bidirectional form:
|
|
@@ -35,9 +41,11 @@ import { ITwilioClientBindings } from './twilio-call-sdk.js';
|
|
|
35
41
|
* Pure + exported so it unit-tests with no network and the MJAPI router can reuse it verbatim.
|
|
36
42
|
*
|
|
37
43
|
* @param streamUrl The `wss://…` Media-Streams endpoint Twilio connects the call's audio to.
|
|
44
|
+
* @param parameters Optional custom `<Parameter>` name/value pairs Twilio echoes back on the `start` frame
|
|
45
|
+
* (`start.customParameters`). MJ passes the per-call media token here so the websocket can be authenticated.
|
|
38
46
|
* @returns The TwiML document string to return to Twilio (REST `twiml` param or webhook response body).
|
|
39
47
|
*/
|
|
40
|
-
export declare function BuildConnectStreamTwiML(streamUrl: string): string;
|
|
48
|
+
export declare function BuildConnectStreamTwiML(streamUrl: string, parameters?: Record<string, string>): string;
|
|
41
49
|
/** @deprecated Use {@link BuildConnectStreamTwiML}. */
|
|
42
50
|
export declare function buildConnectStreamTwiML(streamUrl: string): string;
|
|
43
51
|
/** One Twilio Media-Streams `media` frame as it appears (post-JSON-parse) on the websocket. */
|
|
@@ -104,12 +112,22 @@ export interface TwilioCreateCallParams {
|
|
|
104
112
|
Twiml: string;
|
|
105
113
|
/** Optional status-callback URL for lifecycle events. Maps to Twilio's `statusCallback`. */
|
|
106
114
|
StatusCallback?: string;
|
|
115
|
+
/** Lifecycle events to post to {@link StatusCallback} (`initiated`/`ringing`/`answered`/`completed`). Maps to `statusCallbackEvent`. */
|
|
116
|
+
StatusCallbackEvents?: string[];
|
|
117
|
+
/**
|
|
118
|
+
* Enables **asynchronous** answering-machine detection: Twilio keeps the call flowing (so the agent can
|
|
119
|
+
* start speaking) and later POSTs the verdict (`AnsweredBy`) to {@link AsyncAmdStatusCallback}. Maps to
|
|
120
|
+
* `machineDetection: 'Enable'` + `asyncAmd: 'true'`.
|
|
121
|
+
*/
|
|
122
|
+
AsyncAmd?: boolean;
|
|
123
|
+
/** URL Twilio POSTs the async-AMD verdict to. Maps to `asyncAmdStatusCallback`. Required when {@link AsyncAmd} is set. */
|
|
124
|
+
AsyncAmdStatusCallback?: string;
|
|
107
125
|
}
|
|
108
126
|
/** The REST update payload {@link ITwilioRestLike} `calls(sid).update` accepts (the subset we use). */
|
|
109
127
|
export interface TwilioUpdateCallParams {
|
|
110
128
|
/** New call status — `'completed'` ends the call. */
|
|
111
129
|
Status?: 'completed' | 'canceled';
|
|
112
|
-
/** Replacement TwiML — used for transfer (`<Dial>…`) and
|
|
130
|
+
/** Replacement TwiML — used for transfer (`<Dial>…`) and the goodbye-and-hang-up (`<Say>…<Hangup/>`). */
|
|
113
131
|
Twiml?: string;
|
|
114
132
|
}
|
|
115
133
|
/**
|
|
@@ -135,6 +153,12 @@ export interface ITwilioMediaPump {
|
|
|
135
153
|
OnFrame(callSid: string, handler: (frame: TwilioMediaFrame) => void): void;
|
|
136
154
|
/** Registers the call's stream-SID resolver, so outbound frames address the right stream. */
|
|
137
155
|
GetStreamSid(callSid: string): string;
|
|
156
|
+
/**
|
|
157
|
+
* **Optional.** Registers the per-call media-socket token for a call MJ has just placed (the REST
|
|
158
|
+
* `calls.create` response is the first moment the Call SID is known). The pump uses it to authenticate
|
|
159
|
+
* the Media-Streams `start` frame; a pump that does not authenticate sockets may omit it.
|
|
160
|
+
*/
|
|
161
|
+
ExpectCall?(callSid: string, token: string): void;
|
|
138
162
|
}
|
|
139
163
|
/** Options {@link RealTwilioBindings} needs at construction — the injected client surfaces + the stream URL. */
|
|
140
164
|
export interface RealTwilioBindingsOptions {
|
|
@@ -146,7 +170,14 @@ export interface RealTwilioBindingsOptions {
|
|
|
146
170
|
StreamUrl: string;
|
|
147
171
|
/** Optional status-callback URL passed on outbound `createCall`. */
|
|
148
172
|
StatusCallbackUrl?: string;
|
|
173
|
+
/**
|
|
174
|
+
* When set, outbound calls enable asynchronous answering-machine detection and Twilio POSTs the verdict
|
|
175
|
+
* to this URL (`asyncAmdStatusCallback`). Omit to place calls without AMD.
|
|
176
|
+
*/
|
|
177
|
+
AsyncAmdStatusCallbackUrl?: string;
|
|
149
178
|
}
|
|
179
|
+
/** The lifecycle events requested on {@link TwilioCreateCallParams.StatusCallbackEvents} for every outbound call. */
|
|
180
|
+
export declare const TWILIO_STATUS_CALLBACK_EVENTS: readonly string[];
|
|
150
181
|
/**
|
|
151
182
|
* Production {@link ITwilioClientBindings} over the real Twilio REST API + Media Streams, expressed against
|
|
152
183
|
* the injected {@link ITwilioRestLike} / {@link ITwilioMediaPump} surfaces so it builds and unit-tests with
|
|
@@ -163,8 +194,15 @@ export declare class RealTwilioBindings implements ITwilioClientBindings {
|
|
|
163
194
|
private readonly mediaPump;
|
|
164
195
|
private readonly streamUrl;
|
|
165
196
|
private readonly statusCallbackUrl?;
|
|
197
|
+
private readonly asyncAmdStatusCallbackUrl?;
|
|
166
198
|
constructor(options: RealTwilioBindingsOptions);
|
|
167
|
-
/**
|
|
199
|
+
/**
|
|
200
|
+
* @inheritdoc
|
|
201
|
+
*
|
|
202
|
+
* Generates the per-call media token BEFORE the REST call (it rides in the TwiML the call executes), then
|
|
203
|
+
* registers it with the media pump under the returned Call SID so the Media-Streams socket can be
|
|
204
|
+
* authenticated when Twilio connects it.
|
|
205
|
+
*/
|
|
168
206
|
createCall(toNumber: string, fromNumber: string, args?: Record<string, unknown>): Promise<string>;
|
|
169
207
|
/** @inheritdoc */
|
|
170
208
|
acceptInbound(_callSid: string): Promise<void>;
|
|
@@ -174,9 +212,18 @@ export declare class RealTwilioBindings implements ITwilioClientBindings {
|
|
|
174
212
|
pushStreamAudio(callSid: string, pcm: ArrayBuffer): void;
|
|
175
213
|
/** @inheritdoc */
|
|
176
214
|
onStreamAudio(callSid: string, cb: (pcm: ArrayBuffer) => void): void;
|
|
177
|
-
/**
|
|
215
|
+
/**
|
|
216
|
+
* @inheritdoc
|
|
217
|
+
*
|
|
218
|
+
* Sent IN-BAND over the media stream as synthesized tones. The REST alternative (`<Play digits>`) replaces the
|
|
219
|
+
* call's TwiML, which ends `<Connect><Stream>` — the agent would lose the call's audio and the stream `stop`
|
|
220
|
+
* would tear the whole call down. Tones go out in 20 ms frames like any other agent audio, so they queue
|
|
221
|
+
* behind whatever the agent is already saying.
|
|
222
|
+
*/
|
|
178
223
|
playDigits(callSid: string, digits: string): Promise<void>;
|
|
179
224
|
/** @inheritdoc */
|
|
225
|
+
sayAndHangup(callSid: string, message: string): Promise<void>;
|
|
226
|
+
/** @inheritdoc */
|
|
180
227
|
onDigits(callSid: string, cb: (digits: string) => void): void;
|
|
181
228
|
/** @inheritdoc */
|
|
182
229
|
redirectCall(callSid: string, toNumber: string): Promise<void>;
|
|
@@ -185,7 +232,14 @@ export declare class RealTwilioBindings implements ITwilioClientBindings {
|
|
|
185
232
|
/** @inheritdoc */
|
|
186
233
|
flushOutbound(callSid: string): void;
|
|
187
234
|
}
|
|
188
|
-
/** Builds the `<
|
|
235
|
+
/** Builds the `<Say>…</Say><Hangup/>` TwiML that speaks a goodbye and ends the call (REST update). */
|
|
236
|
+
export declare function BuildSayHangupTwiML(message: string): string;
|
|
237
|
+
/**
|
|
238
|
+
* Builds the `<Play digits>` TwiML for a REST-update DTMF send.
|
|
239
|
+
*
|
|
240
|
+
* Not used for live agent calls: replacing the TwiML ends the `<Connect><Stream>`, so {@link RealTwilioBindings}
|
|
241
|
+
* sends DTMF in-band instead. Kept for callers outside a media-streamed call.
|
|
242
|
+
*/
|
|
189
243
|
export declare function BuildPlayDigitsTwiML(digits: string): string;
|
|
190
244
|
/** @deprecated Use {@link BuildPlayDigitsTwiML}. */
|
|
191
245
|
export declare function buildPlayDigitsTwiML(digits: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"real-twilio-bindings.d.ts","sourceRoot":"","sources":["../src/real-twilio-bindings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"real-twilio-bindings.d.ts","sourceRoot":"","sources":["../src/real-twilio-bindings.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,13 @@
|
|
|
25
25
|
* @see {@link ITwilioClientBindings} — the seam this implements.
|
|
26
26
|
* @see `/plans/realtime/bridges-and-widget/telephony-vendor-bindings.md` §2, §3 (T1).
|
|
27
27
|
*/
|
|
28
|
-
import { muLawToPcm16Buffer, pcm16ToMuLawBuffer } from '@memberjunction/ai-bridge-base';
|
|
28
|
+
import { GenerateDtmfPcm16, GenerateMediaToken, muLawToPcm16Buffer, pcm16ToMuLawBuffer } from '@memberjunction/ai-bridge-base';
|
|
29
|
+
/**
|
|
30
|
+
* The custom-parameter name MJ stamps on every `<Stream>` it emits (`<Parameter name="mjToken" .../>`).
|
|
31
|
+
* Twilio echoes it back on the Media-Streams `start` frame as `start.customParameters.mjToken`, which is
|
|
32
|
+
* how the media websocket proves it belongs to a call MJ itself accepted or placed.
|
|
33
|
+
*/
|
|
34
|
+
export const TWILIO_MEDIA_TOKEN_PARAMETER = 'mjToken';
|
|
29
35
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
30
36
|
// Pure helpers — TwiML + Media-Streams frame transcode. No network, no SDK.
|
|
31
37
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
@@ -38,16 +44,17 @@ import { muLawToPcm16Buffer, pcm16ToMuLawBuffer } from '@memberjunction/ai-bridg
|
|
|
38
44
|
* Pure + exported so it unit-tests with no network and the MJAPI router can reuse it verbatim.
|
|
39
45
|
*
|
|
40
46
|
* @param streamUrl The `wss://…` Media-Streams endpoint Twilio connects the call's audio to.
|
|
47
|
+
* @param parameters Optional custom `<Parameter>` name/value pairs Twilio echoes back on the `start` frame
|
|
48
|
+
* (`start.customParameters`). MJ passes the per-call media token here so the websocket can be authenticated.
|
|
41
49
|
* @returns The TwiML document string to return to Twilio (REST `twiml` param or webhook response body).
|
|
42
50
|
*/
|
|
43
|
-
export function BuildConnectStreamTwiML(streamUrl) {
|
|
51
|
+
export function BuildConnectStreamTwiML(streamUrl, parameters) {
|
|
44
52
|
const escaped = escapeXmlAttribute(streamUrl);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
'
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
'</Response>');
|
|
53
|
+
const params = Object.entries(parameters ?? {})
|
|
54
|
+
.map(([name, value]) => `<Parameter name="${escapeXmlAttribute(name)}" value="${escapeXmlAttribute(value)}"/>`)
|
|
55
|
+
.join('');
|
|
56
|
+
const stream = params ? `<Stream url="${escaped}">${params}</Stream>` : `<Stream url="${escaped}" />`;
|
|
57
|
+
return '<?xml version="1.0" encoding="UTF-8"?><Response><Connect>' + stream + '</Connect></Response>';
|
|
51
58
|
}
|
|
52
59
|
/** @deprecated Use {@link BuildConnectStreamTwiML}. */
|
|
53
60
|
export function buildConnectStreamTwiML(streamUrl) {
|
|
@@ -130,6 +137,8 @@ function base64ToArrayBuffer(base64) {
|
|
|
130
137
|
function arrayBufferToBase64(buffer) {
|
|
131
138
|
return Buffer.from(new Uint8Array(buffer)).toString('base64');
|
|
132
139
|
}
|
|
140
|
+
/** The lifecycle events requested on {@link TwilioCreateCallParams.StatusCallbackEvents} for every outbound call. */
|
|
141
|
+
export const TWILIO_STATUS_CALLBACK_EVENTS = ['initiated', 'ringing', 'answered', 'completed'];
|
|
133
142
|
/**
|
|
134
143
|
* Production {@link ITwilioClientBindings} over the real Twilio REST API + Media Streams, expressed against
|
|
135
144
|
* the injected {@link ITwilioRestLike} / {@link ITwilioMediaPump} surfaces so it builds and unit-tests with
|
|
@@ -147,16 +156,27 @@ export class RealTwilioBindings {
|
|
|
147
156
|
this.mediaPump = options.MediaPump;
|
|
148
157
|
this.streamUrl = options.StreamUrl;
|
|
149
158
|
this.statusCallbackUrl = options.StatusCallbackUrl;
|
|
159
|
+
this.asyncAmdStatusCallbackUrl = options.AsyncAmdStatusCallbackUrl;
|
|
150
160
|
}
|
|
151
|
-
/**
|
|
161
|
+
/**
|
|
162
|
+
* @inheritdoc
|
|
163
|
+
*
|
|
164
|
+
* Generates the per-call media token BEFORE the REST call (it rides in the TwiML the call executes), then
|
|
165
|
+
* registers it with the media pump under the returned Call SID so the Media-Streams socket can be
|
|
166
|
+
* authenticated when Twilio connects it.
|
|
167
|
+
*/
|
|
152
168
|
async createCall(toNumber, fromNumber, args) {
|
|
153
169
|
const statusCallback = readStatusCallback(args) ?? this.statusCallbackUrl;
|
|
154
|
-
|
|
170
|
+
const token = GenerateMediaToken();
|
|
171
|
+
const callSid = await this.rest.CreateCall({
|
|
155
172
|
To: toNumber,
|
|
156
173
|
From: fromNumber,
|
|
157
|
-
Twiml: BuildConnectStreamTwiML(this.streamUrl),
|
|
158
|
-
...(statusCallback ? { StatusCallback: statusCallback } : {}),
|
|
174
|
+
Twiml: BuildConnectStreamTwiML(this.streamUrl, { [TWILIO_MEDIA_TOKEN_PARAMETER]: token }),
|
|
175
|
+
...(statusCallback ? { StatusCallback: statusCallback, StatusCallbackEvents: [...TWILIO_STATUS_CALLBACK_EVENTS] } : {}),
|
|
176
|
+
...(this.asyncAmdStatusCallbackUrl ? { AsyncAmd: true, AsyncAmdStatusCallback: this.asyncAmdStatusCallbackUrl } : {}),
|
|
159
177
|
});
|
|
178
|
+
this.mediaPump.ExpectCall?.(callSid, token);
|
|
179
|
+
return callSid;
|
|
160
180
|
}
|
|
161
181
|
/** @inheritdoc */
|
|
162
182
|
async acceptInbound(_callSid) {
|
|
@@ -181,9 +201,24 @@ export class RealTwilioBindings {
|
|
|
181
201
|
}
|
|
182
202
|
});
|
|
183
203
|
}
|
|
184
|
-
/**
|
|
204
|
+
/**
|
|
205
|
+
* @inheritdoc
|
|
206
|
+
*
|
|
207
|
+
* Sent IN-BAND over the media stream as synthesized tones. The REST alternative (`<Play digits>`) replaces the
|
|
208
|
+
* call's TwiML, which ends `<Connect><Stream>` — the agent would lose the call's audio and the stream `stop`
|
|
209
|
+
* would tear the whole call down. Tones go out in 20 ms frames like any other agent audio, so they queue
|
|
210
|
+
* behind whatever the agent is already saying.
|
|
211
|
+
*/
|
|
185
212
|
async playDigits(callSid, digits) {
|
|
186
|
-
|
|
213
|
+
const tones = GenerateDtmfPcm16(digits, TWILIO_MEDIA_SAMPLE_RATE);
|
|
214
|
+
for (let offset = 0; offset < tones.length; offset += TWILIO_FRAME_SAMPLES) {
|
|
215
|
+
const frame = tones.slice(offset, offset + TWILIO_FRAME_SAMPLES);
|
|
216
|
+
this.pushStreamAudio(callSid, frame.buffer.slice(frame.byteOffset, frame.byteOffset + frame.byteLength));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/** @inheritdoc */
|
|
220
|
+
async sayAndHangup(callSid, message) {
|
|
221
|
+
await this.rest.UpdateCall(callSid, { Twiml: BuildSayHangupTwiML(message) });
|
|
187
222
|
}
|
|
188
223
|
/** @inheritdoc */
|
|
189
224
|
onDigits(callSid, cb) {
|
|
@@ -212,7 +247,20 @@ export class RealTwilioBindings {
|
|
|
212
247
|
this.mediaPump.Send(callSid, EncodeTwilioClearFrame(streamSid));
|
|
213
248
|
}
|
|
214
249
|
}
|
|
215
|
-
/**
|
|
250
|
+
/** Twilio Media Streams audio rate (G.711 μ-law at 8 kHz). */
|
|
251
|
+
const TWILIO_MEDIA_SAMPLE_RATE = 8000;
|
|
252
|
+
/** Samples per 20 ms Media-Streams frame at {@link TWILIO_MEDIA_SAMPLE_RATE}. */
|
|
253
|
+
const TWILIO_FRAME_SAMPLES = 160;
|
|
254
|
+
/** Builds the `<Say>…</Say><Hangup/>` TwiML that speaks a goodbye and ends the call (REST update). */
|
|
255
|
+
export function BuildSayHangupTwiML(message) {
|
|
256
|
+
return '<?xml version="1.0" encoding="UTF-8"?><Response>' + `<Say>${escapeXmlAttribute(message)}</Say><Hangup/>` + '</Response>';
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Builds the `<Play digits>` TwiML for a REST-update DTMF send.
|
|
260
|
+
*
|
|
261
|
+
* Not used for live agent calls: replacing the TwiML ends the `<Connect><Stream>`, so {@link RealTwilioBindings}
|
|
262
|
+
* sends DTMF in-band instead. Kept for callers outside a media-streamed call.
|
|
263
|
+
*/
|
|
216
264
|
export function BuildPlayDigitsTwiML(digits) {
|
|
217
265
|
return ('<?xml version="1.0" encoding="UTF-8"?>' +
|
|
218
266
|
'<Response>' +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"real-twilio-bindings.js","sourceRoot":"","sources":["../src/real-twilio-bindings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"real-twilio-bindings.js","sourceRoot":"","sources":["../src/real-twilio-bindings.ts"],"names":[],"mappings":"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"}
|
|
@@ -117,6 +117,15 @@ export interface ITwilioClientBindings {
|
|
|
117
117
|
* @param callSid The Call SID whose playback buffer to clear.
|
|
118
118
|
*/
|
|
119
119
|
flushOutbound(callSid: string): void;
|
|
120
|
+
/**
|
|
121
|
+
* **Optional.** Speaks `message` to the caller and then hangs up, in one carrier-side step (REST
|
|
122
|
+
* `calls(sid).update({ twiml: '<Say>…</Say><Hangup/>' })`). The call is ending anyway, so replacing its TwiML
|
|
123
|
+
* (which ends the media stream) is what we want here. When absent the SDK just completes the call.
|
|
124
|
+
*
|
|
125
|
+
* @param callSid The Call SID.
|
|
126
|
+
* @param message The text to speak.
|
|
127
|
+
*/
|
|
128
|
+
sayAndHangup?(callSid: string, message: string): Promise<void>;
|
|
120
129
|
}
|
|
121
130
|
/**
|
|
122
131
|
* Twilio's implementation of the {@link ITelephonyCallSdk} telephony seam over **Twilio Programmable
|
|
@@ -159,6 +168,10 @@ export declare class TwilioCallSdk implements ITelephonyCallSdk {
|
|
|
159
168
|
onCallEnded(cb: () => void): void;
|
|
160
169
|
/** @inheritdoc */
|
|
161
170
|
flushOutbound(): void;
|
|
171
|
+
/** @inheritdoc — after a transfer / goodbye Twilio owns the call; just forget it locally, never hang it up. */
|
|
172
|
+
detach(_callId: string): Promise<void>;
|
|
173
|
+
/** @inheritdoc — speaks the message and hangs up at Twilio; completes the call when the bindings cannot speak. */
|
|
174
|
+
playMessageAndHangup(callId: string, message: string): Promise<void>;
|
|
162
175
|
/** Binds the active Call SID and (re-)registers any handlers the driver set before the call existed. */
|
|
163
176
|
private bindCall;
|
|
164
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twilio-call-sdk.d.ts","sourceRoot":"","sources":["../src/twilio-call-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IAClC;;;;;;;;OAQG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAElG;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;;;OAIG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IAEzD;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC;IAErE;;;;;OAKG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAE9D;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/D;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAEpD;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"twilio-call-sdk.d.ts","sourceRoot":"","sources":["../src/twilio-call-sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/twilio-call-sdk.js
CHANGED
|
@@ -134,6 +134,19 @@ export class TwilioCallSdk {
|
|
|
134
134
|
this.bindings.flushOutbound(this.activeCallSid);
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
+
/** @inheritdoc — after a transfer / goodbye Twilio owns the call; just forget it locally, never hang it up. */
|
|
138
|
+
async detach(_callId) {
|
|
139
|
+
this.activeCallSid = null;
|
|
140
|
+
}
|
|
141
|
+
/** @inheritdoc — speaks the message and hangs up at Twilio; completes the call when the bindings cannot speak. */
|
|
142
|
+
async playMessageAndHangup(callId, message) {
|
|
143
|
+
if (this.bindings.sayAndHangup) {
|
|
144
|
+
await this.bindings.sayAndHangup(callId, message);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
await this.bindings.completeCall(callId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
137
150
|
/** Binds the active Call SID and (re-)registers any handlers the driver set before the call existed. */
|
|
138
151
|
bindCall(callSid) {
|
|
139
152
|
this.activeCallSid = callSid;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twilio-call-sdk.js","sourceRoot":"","sources":["../src/twilio-call-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;
|
|
1
|
+
{"version":3,"file":"twilio-call-sdk.js","sourceRoot":"","sources":["../src/twilio-call-sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/twilio-ingress.d.ts
CHANGED
|
@@ -52,9 +52,10 @@ export declare function computeTwilioSignature(authToken: string, url: string, p
|
|
|
52
52
|
* inbound and outbound legs share one media contract.
|
|
53
53
|
*
|
|
54
54
|
* @param streamWssUrl The `wss://…/telephony/twilio/media` endpoint to connect the inbound call's audio to.
|
|
55
|
+
* @param parameters Optional custom `<Parameter>`s Twilio echoes on the `start` frame (the per-call media token).
|
|
55
56
|
* @returns The TwiML document string to return to Twilio as the webhook response.
|
|
56
57
|
*/
|
|
57
|
-
export declare function BuildInboundVoiceTwiML(streamWssUrl: string): string;
|
|
58
|
+
export declare function BuildInboundVoiceTwiML(streamWssUrl: string, parameters?: Record<string, string>): string;
|
|
58
59
|
/** @deprecated Use {@link BuildInboundVoiceTwiML}. */
|
|
59
60
|
export declare function buildInboundVoiceTwiML(streamWssUrl: string): string;
|
|
60
61
|
/** The resolved identity of an inbound Twilio call, mapped from the voice-webhook params. */
|
|
@@ -78,4 +79,21 @@ export interface ResolvedInboundCall {
|
|
|
78
79
|
export declare function ResolveInboundCall(params: Record<string, string>): ResolvedInboundCall;
|
|
79
80
|
/** @deprecated Use {@link ResolveInboundCall}. */
|
|
80
81
|
export declare function resolveInboundCall(params: Record<string, string>): ResolvedInboundCall;
|
|
82
|
+
/**
|
|
83
|
+
* Whether a Twilio `CallStatus` is terminal (`completed`, `busy`, `failed`, `no-answer`, `canceled`). Pure.
|
|
84
|
+
* An unknown or missing status is NOT terminal — an unrecognized value must never tear down a live call.
|
|
85
|
+
*
|
|
86
|
+
* @param status The `CallStatus` param from a status-callback webhook.
|
|
87
|
+
* @returns `true` when the call has ended.
|
|
88
|
+
*/
|
|
89
|
+
export declare function IsTerminalTwilioCallStatus(status: string | undefined): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Whether an async-AMD `AnsweredBy` verdict means a machine (or fax) picked up rather than a person:
|
|
92
|
+
* `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`, `fax`. `human` and
|
|
93
|
+
* `unknown` are NOT machines — an inconclusive verdict must never hang up on a possible human. Pure.
|
|
94
|
+
*
|
|
95
|
+
* @param answeredBy The `AnsweredBy` param from the async-AMD callback.
|
|
96
|
+
* @returns `true` when the verdict is a machine or fax.
|
|
97
|
+
*/
|
|
98
|
+
export declare function IsMachineAnsweredBy(answeredBy: string | undefined): boolean;
|
|
81
99
|
//# sourceMappingURL=twilio-ingress.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twilio-ingress.d.ts","sourceRoot":"","sources":["../src/twilio-ingress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAMT;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAET;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAG7G;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAE7G;AAED
|
|
1
|
+
{"version":3,"file":"twilio-ingress.d.ts","sourceRoot":"","sources":["../src/twilio-ingress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAMT;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAET;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAG7G;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAE7G;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAExG;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,6FAA6F;AAC7F,MAAM,WAAW,mBAAmB;IAChC,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAWtF;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAEtF;AAKD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE9E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAM3E"}
|
package/dist/twilio-ingress.js
CHANGED
|
@@ -67,10 +67,11 @@ export function computeTwilioSignature(authToken, url, params) {
|
|
|
67
67
|
* inbound and outbound legs share one media contract.
|
|
68
68
|
*
|
|
69
69
|
* @param streamWssUrl The `wss://…/telephony/twilio/media` endpoint to connect the inbound call's audio to.
|
|
70
|
+
* @param parameters Optional custom `<Parameter>`s Twilio echoes on the `start` frame (the per-call media token).
|
|
70
71
|
* @returns The TwiML document string to return to Twilio as the webhook response.
|
|
71
72
|
*/
|
|
72
|
-
export function BuildInboundVoiceTwiML(streamWssUrl) {
|
|
73
|
-
return BuildConnectStreamTwiML(streamWssUrl);
|
|
73
|
+
export function BuildInboundVoiceTwiML(streamWssUrl, parameters) {
|
|
74
|
+
return BuildConnectStreamTwiML(streamWssUrl, parameters);
|
|
74
75
|
}
|
|
75
76
|
/** @deprecated Use {@link BuildInboundVoiceTwiML}. */
|
|
76
77
|
export function buildInboundVoiceTwiML(streamWssUrl) {
|
|
@@ -99,6 +100,33 @@ export function ResolveInboundCall(params) {
|
|
|
99
100
|
export function resolveInboundCall(params) {
|
|
100
101
|
return ResolveInboundCall(params);
|
|
101
102
|
}
|
|
103
|
+
/** Twilio call-status values that mean the call is over and will never carry media again. */
|
|
104
|
+
const TWILIO_TERMINAL_CALL_STATUSES = new Set(['completed', 'busy', 'failed', 'no-answer', 'canceled']);
|
|
105
|
+
/**
|
|
106
|
+
* Whether a Twilio `CallStatus` is terminal (`completed`, `busy`, `failed`, `no-answer`, `canceled`). Pure.
|
|
107
|
+
* An unknown or missing status is NOT terminal — an unrecognized value must never tear down a live call.
|
|
108
|
+
*
|
|
109
|
+
* @param status The `CallStatus` param from a status-callback webhook.
|
|
110
|
+
* @returns `true` when the call has ended.
|
|
111
|
+
*/
|
|
112
|
+
export function IsTerminalTwilioCallStatus(status) {
|
|
113
|
+
return status !== undefined && TWILIO_TERMINAL_CALL_STATUSES.has(status.trim().toLowerCase());
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Whether an async-AMD `AnsweredBy` verdict means a machine (or fax) picked up rather than a person:
|
|
117
|
+
* `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`, `fax`. `human` and
|
|
118
|
+
* `unknown` are NOT machines — an inconclusive verdict must never hang up on a possible human. Pure.
|
|
119
|
+
*
|
|
120
|
+
* @param answeredBy The `AnsweredBy` param from the async-AMD callback.
|
|
121
|
+
* @returns `true` when the verdict is a machine or fax.
|
|
122
|
+
*/
|
|
123
|
+
export function IsMachineAnsweredBy(answeredBy) {
|
|
124
|
+
if (!answeredBy) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
const value = answeredBy.trim().toLowerCase();
|
|
128
|
+
return value.startsWith('machine') || value === 'fax';
|
|
129
|
+
}
|
|
102
130
|
/** Concatenates params sorted by key as `key + value` (Twilio's signature input), with no separators. */
|
|
103
131
|
function concatSortedParams(params) {
|
|
104
132
|
return Object.keys(params)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twilio-ingress.js","sourceRoot":"","sources":["../src/twilio-ingress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,qBAAqB,CACjC,SAAiB,EACjB,eAAmC,EACnC,GAAW,EACX,MAA8B;IAE9B,IAAI,CAAC,eAAe,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAChE,OAAO,kBAAkB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AACzD,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,qBAAqB,CACjC,SAAiB,EACjB,eAAmC,EACnC,GAAW,EACX,MAA8B;IAE9B,OAAO,qBAAqB,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,GAAW,EAAE,MAA8B;IACjG,MAAM,IAAI,GAAG,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/E,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,GAAW,EAAE,MAA8B;IACjG,OAAO,sBAAsB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"twilio-ingress.js","sourceRoot":"","sources":["../src/twilio-ingress.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,7 +68,8 @@ export declare const defaultTwilioRestModuleLoader: TwilioRestModuleLoader;
|
|
|
68
68
|
/**
|
|
69
69
|
* A real {@link ITwilioRestLike} over the `twilio` SDK's Programmable Voice REST API.
|
|
70
70
|
*
|
|
71
|
-
* - `CreateCall` → `client.calls.create({ to, from, twiml, statusCallback
|
|
71
|
+
* - `CreateCall` → `client.calls.create({ to, from, twiml, statusCallback, statusCallbackEvent, machineDetection, asyncAmd, … })`,
|
|
72
|
+
* resolving the new Call SID.
|
|
72
73
|
* - `UpdateCall` → `client.calls(sid).update({ status, twiml })` for hangup / transfer / DTMF.
|
|
73
74
|
*
|
|
74
75
|
* The constructed client is built once on first use and reused for the life of the instance.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twilio-rest-client.d.ts","sourceRoot":"","sources":["../src/twilio-rest-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAOjH,gGAAgG;AAChG,MAAM,WAAW,sBAAsB;IACnC,GAAG,EAAE,MAAM,CAAC;CACf;AAED,uGAAuG;AACvG,MAAM,WAAW,qBAAqB;IAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACpC,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACzC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC5E;AAED,iEAAiE;AACjE,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,uBAAuB,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAC9B,oBAAoB,EAAE,MAAM,EAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,KAC7B,oBAAoB,CAAC;AAE1B,2GAA2G;AAC3G,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAExE,qHAAqH;AACrH,MAAM,WAAW,qBAAqB;IAClC,qHAAqH;IACrH,UAAU,EAAE,MAAM,CAAC;IACnB,wHAAwH;IACxH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kHAAkH;IAClH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,sBAe3C,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,6BAA6B,EAAE,sBAAsD,CAAC;AAanG
|
|
1
|
+
{"version":3,"file":"twilio-rest-client.d.ts","sourceRoot":"","sources":["../src/twilio-rest-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAOjH,gGAAgG;AAChG,MAAM,WAAW,sBAAsB;IACnC,GAAG,EAAE,MAAM,CAAC;CACf;AAED,uGAAuG;AACvG,MAAM,WAAW,qBAAqB;IAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACpC,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACzC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC5E;AAED,iEAAiE;AACjE,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,uBAAuB,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAC9B,oBAAoB,EAAE,MAAM,EAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,KAC7B,oBAAoB,CAAC;AAE1B,2GAA2G;AAC3G,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAExE,qHAAqH;AACrH,MAAM,WAAW,qBAAqB;IAClC,qHAAqH;IACrH,UAAU,EAAE,MAAM,CAAC;IACnB,wHAAwH;IACxH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kHAAkH;IAClH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,sBAe3C,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,6BAA6B,EAAE,sBAAsD,CAAC;AAanG;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,kFAAkF;IAClF,OAAO,CAAC,aAAa,CAAC,CAAgC;IAEtD;;;OAGG;gBACS,WAAW,EAAE,qBAAqB,EAAE,UAAU,GAAE,sBAAsD;IAKlH,kBAAkB;IACL,UAAU,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBxE,kBAAkB;IACL,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvF,4GAA4G;IAC5G,OAAO,CAAC,YAAY;IAOpB,6GAA6G;YAC/F,WAAW;CAW5B"}
|
|
@@ -51,7 +51,8 @@ function unwrapTwilioFactory(mod) {
|
|
|
51
51
|
/**
|
|
52
52
|
* A real {@link ITwilioRestLike} over the `twilio` SDK's Programmable Voice REST API.
|
|
53
53
|
*
|
|
54
|
-
* - `CreateCall` → `client.calls.create({ to, from, twiml, statusCallback
|
|
54
|
+
* - `CreateCall` → `client.calls.create({ to, from, twiml, statusCallback, statusCallbackEvent, machineDetection, asyncAmd, … })`,
|
|
55
|
+
* resolving the new Call SID.
|
|
55
56
|
* - `UpdateCall` → `client.calls(sid).update({ status, twiml })` for hangup / transfer / DTMF.
|
|
56
57
|
*
|
|
57
58
|
* The constructed client is built once on first use and reused for the life of the instance.
|
|
@@ -73,6 +74,14 @@ export class RealTwilioRestClient {
|
|
|
73
74
|
from: params.From,
|
|
74
75
|
twiml: params.Twiml,
|
|
75
76
|
...(params.StatusCallback ? { statusCallback: params.StatusCallback } : {}),
|
|
77
|
+
...(params.StatusCallbackEvents?.length ? { statusCallbackEvent: params.StatusCallbackEvents } : {}),
|
|
78
|
+
...(params.AsyncAmd && params.AsyncAmdStatusCallback
|
|
79
|
+
? {
|
|
80
|
+
machineDetection: 'Enable',
|
|
81
|
+
asyncAmd: 'true',
|
|
82
|
+
asyncAmdStatusCallback: params.AsyncAmdStatusCallback,
|
|
83
|
+
}
|
|
84
|
+
: {}),
|
|
76
85
|
});
|
|
77
86
|
if (!created?.sid) {
|
|
78
87
|
throw new Error('Twilio calls.create returned no Call SID.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twilio-rest-client.js","sourceRoot":"","sources":["../src/twilio-rest-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA0DH;;;;GAIG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAA2B,KAAK,IAAkC,EAAE;IAC1G,IAAI,CAAC;QACD,MAAM,GAAG,GAAY,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,OAA8B,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CACX,0FAA0F;YACtF,2FAA2F,OAAO,EAAE,CAC3G,CAAC;IACN,CAAC;AACL,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,6BAA6B,GAA2B,6BAA6B,CAAC;AAEnG,sFAAsF;AACtF,SAAS,mBAAmB,CAAC,GAAY;IACrC,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC;IACf,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;QACrD,OAAQ,GAA4B,CAAC,OAAO,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"twilio-rest-client.js","sourceRoot":"","sources":["../src/twilio-rest-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ai-bridge-twilio",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.2.0-edge.
|
|
4
|
+
"version": "6.2.0-edge.3",
|
|
5
5
|
"description": "MemberJunction: Twilio Realtime Bridge driver (telephony). Connects the realtime agent engine to a phone call over Twilio Programmable Voice + Media Streams — outbound dial, inbound DID routing, single-party audio in/out, DTMF send/receive, and call transfer — via an injectable telephony call SDK seam. Audio only: no video, no screen, no Meeting Controls.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
"author": "MemberJunction.com",
|
|
12
12
|
"license": "BUSL-1.1",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@memberjunction/core": "6.2.0-edge.
|
|
15
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
16
|
-
"@memberjunction/core-entities": "6.2.0-edge.
|
|
17
|
-
"@memberjunction/ai-bridge-base": "6.2.0-edge.
|
|
14
|
+
"@memberjunction/core": "6.2.0-edge.3",
|
|
15
|
+
"@memberjunction/global": "6.2.0-edge.3",
|
|
16
|
+
"@memberjunction/core-entities": "6.2.0-edge.3",
|
|
17
|
+
"@memberjunction/ai-bridge-base": "6.2.0-edge.3"
|
|
18
18
|
},
|
|
19
19
|
"//optionalDependencies": "twilio is an OPTIONAL PEER SDK (CLAUDE rule 8, category 2): the package never statically imports it. Production wires RealTwilioBindings over the real twilio REST client + a Media-Streams websocket through the injected ITwilioRestLike/ITwilioMediaPump surfaces, so the package builds and unit-tests with no twilio install and no network. Loaded only when the Twilio provider is configured at deployment.",
|
|
20
20
|
"optionalDependencies": {
|