@onereach/step-voice 1.2202.1

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/README.md ADDED
@@ -0,0 +1,10 @@
1
+ ### Download steps from environment
2
+
3
+ - ``` npm run download-prod ``` (always development/staging env)
4
+ - ``` npm run download-dev ```
5
+
6
+
7
+ ### Upload steps to environment
8
+
9
+ - ``` npm run upload-prod ```
10
+ - ``` npm run upload-dev ```
@@ -0,0 +1,3 @@
1
+ export default class VoiceChoice extends VoiceStep {
2
+ }
3
+ import VoiceStep from "./voice";
package/dst/Choice.js ADDED
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const voice_1 = (0, tslib_1.__importDefault)(require("./voice"));
5
+ const _ = require('lodash');
6
+ const digitWords = [
7
+ 'zero',
8
+ 'one',
9
+ 'two',
10
+ 'three',
11
+ 'four',
12
+ 'five',
13
+ 'six',
14
+ 'seven',
15
+ 'eight',
16
+ 'nine'
17
+ ];
18
+ const containsOnlyDigits = (stringsList) => {
19
+ let isOnlyDigits = true;
20
+ stringsList.forEach((str) => {
21
+ if (digitWords.includes(String(str).toLowerCase())) {
22
+ // Do nothing
23
+ }
24
+ else if (isNaN(str)) {
25
+ isOnlyDigits = false;
26
+ }
27
+ });
28
+ return isOnlyDigits;
29
+ };
30
+ const getPhrasesForSpeechRec = (choices) => {
31
+ const texts = _.flatMap(choices, (choice) => choice.options.map((opt) => opt.text));
32
+ if (containsOnlyDigits(texts)) {
33
+ return ['$OOV_CLASS_DIGIT_SEQUENCE'];
34
+ }
35
+ return texts;
36
+ };
37
+ const getAsrSettings = (settings, choices) => {
38
+ if (settings.engine === 'google' || settings.engine === 'google_beta') {
39
+ return {
40
+ ...settings,
41
+ config: {
42
+ speechContexts: [
43
+ {
44
+ phrases: getPhrasesForSpeechRec(choices)
45
+ }
46
+ ]
47
+ }
48
+ };
49
+ }
50
+ return settings;
51
+ };
52
+ const isRepromptTrigger = (recogResult, promptsTriggers) => {
53
+ const phrases = recogResult.map((r) => {
54
+ return r.lexical;
55
+ });
56
+ const triggers = promptsTriggers.flatMap((trigger) => {
57
+ if (_.isEmpty(trigger.grammar)) {
58
+ return trigger.text.replace(/`/g, '');
59
+ }
60
+ else {
61
+ return trigger.grammar.value.map((v) => {
62
+ return v.replace(/`/g, '');
63
+ });
64
+ }
65
+ });
66
+ return !_.isEmpty(phrases.filter((e) => triggers.indexOf(e) !== -1));
67
+ };
68
+ class VoiceChoice extends voice_1.default {
69
+ async runStep() {
70
+ /** @type {import('./voice').IVoiceChannel} */
71
+ const channel = await this.fetchData();
72
+ const { textType, asr, tts, sensitiveData, noReplyDelay, usePromptsTriggers } = this.data;
73
+ const exitExists = (exitId) => {
74
+ return _.some(choices, (choice) => choice.exitId === exitId);
75
+ };
76
+ const choices = this.buildChoices({ choices: this.data.choices });
77
+ const ttsSettings = tts.getSettings(channel.tts);
78
+ const asrSettings = getAsrSettings(asr.getSettings(channel.asr), choices);
79
+ const repromptsList = this.buildReprompts({ prompts: this.data.prompts });
80
+ const speechSections = this.buildSections({ sections: this.data.audio, textType, ttsSettings });
81
+ const grammar = {
82
+ id: this.currentStepId,
83
+ choices,
84
+ asr: asrSettings
85
+ };
86
+ const command = {
87
+ name: 'speak',
88
+ params: {
89
+ grammar,
90
+ global: channel.global,
91
+ sections: []
92
+ }
93
+ };
94
+ // There's a specific need to do so. There might be ${variable} section
95
+ return this.triggers
96
+ .once(`in/voice/${channel.id}/event`, async (event) => {
97
+ if (channel.recordCall && sensitiveData) {
98
+ await this.sendCommands(channel, [{ name: 'record-session' }]);
99
+ }
100
+ const reportingSettingsKey = this.rptsStarted ? 'transcriptRepromptResponse' : 'transcriptResponse';
101
+ switch (event.params.type) {
102
+ case 'digit':
103
+ case 'digits': {
104
+ const params = event.params;
105
+ const digit = params.digit || params.digits;
106
+ const exitId = params.exitId;
107
+ // On bargeIn, we should stop playback
108
+ if (exitExists(exitId)) {
109
+ await this.transcript(channel, {
110
+ keyPress: digit,
111
+ message: _.replace(this.getExitStepLabel(exitId), /^(\d+\. )?(~ )?/, ''),
112
+ reportingSettingsKey,
113
+ action: 'Call DTMF',
114
+ actionFromBot: false
115
+ });
116
+ return this.exitStep(exitId, this.exitChoiceData('dtmf', params));
117
+ }
118
+ else if (this.rptsHasMore({ repromptsList })) {
119
+ await this.transcript(channel, {
120
+ message: 'Unrecognized',
121
+ keyPress: digit,
122
+ reportingSettingsKey,
123
+ action: 'Call DTMF',
124
+ actionFromBot: false
125
+ });
126
+ await this.rptsSend(channel, {
127
+ command,
128
+ repromptsList,
129
+ noReplyDelay,
130
+ speechSections,
131
+ textType,
132
+ ttsSettings
133
+ });
134
+ return this.exitFlow();
135
+ }
136
+ await this.transcript(channel, {
137
+ message: 'Not Recognized',
138
+ keyPress: digit,
139
+ reportingSettingsKey,
140
+ action: 'Call DTMF',
141
+ actionFromBot: false
142
+ });
143
+ return this.exitStep('unrecognized', this.exitChoiceData('dtmf', {
144
+ digit
145
+ }));
146
+ }
147
+ case 'recognition': {
148
+ const params = event.params;
149
+ const exitId = params.exitId;
150
+ const phrases = params.phrases;
151
+ if (_.isEmpty(phrases)) {
152
+ return this.exitStep('unrecognized', {});
153
+ }
154
+ const voiceProcessResult = _.chain(phrases)
155
+ .map((p) => p.lexical)
156
+ .join(' | ')
157
+ .value();
158
+ // On bargeIn, we should stop playback
159
+ if (exitExists(exitId)) {
160
+ await this.transcript(channel, {
161
+ message: _.replace(this.getExitStepLabel(exitId), /^(\d+\. )?(~ )?/, ''),
162
+ voiceProcessResult,
163
+ reportingSettingsKey,
164
+ action: 'Call Recognition',
165
+ actionFromBot: false
166
+ });
167
+ // There might be hooks after this step which we will try to avoid
168
+ return this.exitStep(exitId, this.exitChoiceData('voice', params));
169
+ }
170
+ else if (this.rptsHasMore({ repromptsList }) &&
171
+ usePromptsTriggers &&
172
+ isRepromptTrigger(phrases, this.data.promptsTriggers)) {
173
+ await this.transcript(channel, {
174
+ message: 'Unrecognized',
175
+ voiceProcessResult,
176
+ reportingSettingsKey,
177
+ action: 'Call Recognition',
178
+ actionFromBot: false
179
+ });
180
+ await this.rptsSend(channel, {
181
+ command,
182
+ repromptsList,
183
+ noReplyDelay,
184
+ speechSections,
185
+ textType,
186
+ ttsSettings
187
+ });
188
+ return this.exitFlow();
189
+ }
190
+ // There's no more reprompts, should move on to unrecognized direction
191
+ await this.transcript(channel, {
192
+ message: 'Not Recognized',
193
+ voiceProcessResult,
194
+ reportingSettingsKey,
195
+ action: 'Call Recognition',
196
+ actionFromBot: false
197
+ });
198
+ // We might end up in same session
199
+ return this.exitStep('unrecognized', this.exitChoiceData('voice', params));
200
+ }
201
+ case 'timeout': {
202
+ if (this.rptsHasMore({ repromptsList })) {
203
+ await this.transcript(channel, {
204
+ message: 'No Reply',
205
+ reportingSettingsKey,
206
+ action: 'Call Prompt',
207
+ actionFromBot: false
208
+ });
209
+ await this.rptsSend(channel, {
210
+ command,
211
+ repromptsList,
212
+ noReplyDelay,
213
+ speechSections,
214
+ textType,
215
+ ttsSettings
216
+ });
217
+ return this.exitFlow();
218
+ }
219
+ await this.transcript(channel, {
220
+ message: 'Not Replied',
221
+ reportingSettingsKey,
222
+ action: 'Call Prompt',
223
+ actionFromBot: false
224
+ });
225
+ // We might end up in same session
226
+ return this.exitStep('no reply', {});
227
+ }
228
+ case 'hangup': {
229
+ await this.handleHangup(channel);
230
+ return this.end();
231
+ }
232
+ case 'cancel': {
233
+ return this.exitStep('cancel');
234
+ }
235
+ case 'error': {
236
+ return this.exitStep('error', {
237
+ name: event.params.error.name,
238
+ message: event.params.error.message
239
+ });
240
+ }
241
+ default:
242
+ return this.exitFlow();
243
+ }
244
+ })
245
+ .otherwise(async () => {
246
+ await this.transcript(channel, {
247
+ sections: speechSections,
248
+ reprompt: {
249
+ maxAttempts: repromptsList.length,
250
+ attempt: 0
251
+ },
252
+ reportingSettingsKey: 'transcriptPrompt',
253
+ action: 'Call Prompt',
254
+ actionFromBot: true
255
+ });
256
+ command.params.sections = speechSections;
257
+ command.params.timeout = this.rptsTimeout({ noReplyDelay, repromptsList });
258
+ await this.sendCommands(channel, channel.recordCall && sensitiveData ? [{ name: 'stop-record-session' }, command] : [command]);
259
+ return this.exitFlow();
260
+ });
261
+ }
262
+ }
263
+ exports.default = VoiceChoice;
264
+ // --------------------------------------------------------------------
265
+ //# sourceMappingURL=Choice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Choice.js","sourceRoot":"","sources":["../src/Choice.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export default class VoiceGlobalStep extends VoiceStep {
2
+ globThread(): Promise<void>;
3
+ hangup(channel: any, event: any): Promise<unknown>;
4
+ exitThread(event: any, type: any, stepExit: any): Promise<void>;
5
+ exitToThread(): Promise<void>;
6
+ buildGrammar(channel: any, choices: any): Promise<{
7
+ id: string;
8
+ choices: any;
9
+ asr: any;
10
+ }>;
11
+ }
12
+ import VoiceStep from "./voice";
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const voice_1 = (0, tslib_1.__importDefault)(require("./voice"));
5
+ const { nanoid } = require('nanoid');
6
+ const _ = require('lodash');
7
+ class VoiceGlobalStep extends voice_1.default {
8
+ get isGlobal() {
9
+ return true;
10
+ }
11
+ async runStep() {
12
+ /** @type {import('./voice').IVoiceChannel} */
13
+ const channel = await this.fetchData();
14
+ // if (recordCall || _.includes(['bot', 'both'], processHangUp)) {
15
+ // // prevent delete of session by "End" step
16
+ // this.session.set('keepAlive', true);
17
+ // }
18
+ const choices = this.buildChoices({ choices: this.data.choices });
19
+ const grammar = await this.buildGrammar(channel, choices);
20
+ // set grammar into voice conversation
21
+ // this was required by nexmo integrations, could be skipped for now
22
+ // channel.global = grammar;
23
+ const recordSession = this.data.recordCall && !channel.recordCall;
24
+ if (recordSession) {
25
+ channel.recordCall = true;
26
+ }
27
+ // set grammar on voicer
28
+ await this.sendCommands(channel, [
29
+ ...recordSession
30
+ ? [{
31
+ name: 'record-session',
32
+ params: {
33
+ followTransfer: this.data.recordAfterTransfer
34
+ }
35
+ }]
36
+ : [],
37
+ {
38
+ name: 'grammar',
39
+ params: {
40
+ grammar
41
+ }
42
+ }
43
+ ]);
44
+ await this.updateData();
45
+ this.process.runThread({
46
+ state: {
47
+ name: 'globThread',
48
+ step: this.step.id,
49
+ thread: this.conversationThread.id
50
+ },
51
+ local: {
52
+ background: true
53
+ }
54
+ });
55
+ this.exitStep('no commands');
56
+ }
57
+ async globThread() {
58
+ /** @type {import('./voice').IVoiceChannel} */
59
+ const channel = await this.fetchData();
60
+ const choices = this.buildChoices({ choices: this.data.choices });
61
+ const exitExists = (exitId) => {
62
+ return _.some(choices, (choice) => choice.exitId === exitId);
63
+ };
64
+ this.triggers.once(`in/voice/${channel.id}/event`, async (event) => {
65
+ switch (event.params.type) {
66
+ case 'hangup': {
67
+ return await this.hangup(channel, event).finally(async () => {
68
+ await this.sendEventToStep({ event: { ...event, processed: undefined, action: 'local' }, isGlobal: false });
69
+ });
70
+ }
71
+ case 'avm-detected':
72
+ // this.event = {};
73
+ return this.exitThread(event, 'AMD', 'AMD');
74
+ case 'digit':
75
+ case 'digits': {
76
+ const params = event.params;
77
+ const exitId = params.exitId;
78
+ if (exitExists(params.exitId)) {
79
+ await this.transcript(channel, {
80
+ previousTranscriptId: channel.lastTranscriptId,
81
+ keyPress: params.digit,
82
+ message: _.replace(this.getExitStepLabel(exitId), /^(\d+\. )?(~ )?/, ''),
83
+ action: 'Call DTMF',
84
+ reportingSettingsKey: 'transcript',
85
+ actionFromBot: false
86
+ });
87
+ return this.exitThread(event, 'digit', params.exitId);
88
+ }
89
+ return this.exitFlow();
90
+ }
91
+ case 'recognition': {
92
+ const params = event.params;
93
+ const exitId = params.exitId;
94
+ if (exitExists(params.exitId)) {
95
+ const voiceProcessResult = _.chain(params.phrases)
96
+ .map((p) => p.lexical)
97
+ .join(' | ')
98
+ .value();
99
+ await this.transcript(channel, {
100
+ previousTranscriptId: channel.lastTranscriptId,
101
+ message: _.replace(this.getExitStepLabel(exitId), /^(\d+\. )?(~ )?/, ''),
102
+ action: 'Call Recognition',
103
+ voiceProcessResult,
104
+ reportingSettingsKey: 'transcript',
105
+ actionFromBot: false
106
+ });
107
+ return this.exitThread(event, 'voice', params.exitId);
108
+ }
109
+ return this.exitFlow();
110
+ }
111
+ case 'error': {
112
+ return this.exitStep('error', {
113
+ name: event.params.error.name,
114
+ message: event.params.error.message
115
+ });
116
+ }
117
+ default:
118
+ return this.exitFlow();
119
+ }
120
+ });
121
+ }
122
+ async hangup(channel, event) {
123
+ await this.handleHangup(channel);
124
+ // if (channel.recordCall || _.includes(['bot', 'both'], processHangUp)) {
125
+ // // turn off protection of session deletion by "End" step
126
+ // this.session.unset('keepAlive');
127
+ // }
128
+ const isHangedUpByBot = channel.sessionEndedBy === 'Bot';
129
+ const hangUpType = isHangedUpByBot ? 'bot hang up' : 'user hang up';
130
+ // process call recording in hangup event
131
+ if (channel.recordCall && event.params.callRecording) {
132
+ return this.exitThread(event, hangUpType, 'hang up');
133
+ }
134
+ switch (this.data.processHangUp) {
135
+ case 'user':
136
+ return isHangedUpByBot
137
+ ? this.exitFlow()
138
+ : this.exitThread({}, hangUpType, 'hang up');
139
+ case 'bot':
140
+ return isHangedUpByBot
141
+ ? this.exitThread({}, hangUpType, 'hang up')
142
+ : this.exitFlow();
143
+ case 'both':
144
+ return this.exitThread({}, hangUpType, 'hang up');
145
+ case 'none':
146
+ default:
147
+ return this.exitFlow();
148
+ }
149
+ }
150
+ async exitThread(event, type, stepExit) {
151
+ /** @type {import('./voice').IVoiceChannel} */
152
+ // const channel = await this.fetchData()
153
+ // this.log.warn('EXIT HOOK', type, stepExit);
154
+ const params = event.params || {};
155
+ const data = {
156
+ type
157
+ };
158
+ if (!_.isEmpty(params.tags)) {
159
+ data.tags = params.tags;
160
+ }
161
+ if (!_.isEmpty(params.out)) {
162
+ data.out = params.out;
163
+ }
164
+ const digits = params.digits || params.digit;
165
+ if (!_.isEmpty(digits)) {
166
+ data.digit = digits;
167
+ data.value = digits;
168
+ }
169
+ if (!_.isEmpty(params.phrases)) {
170
+ const phrases = params.phrases;
171
+ data.value = phrases[0].text;
172
+ data.interpretation = phrases;
173
+ }
174
+ // add information about call recording to a merge field
175
+ if (!_.isEmpty(params.callRecording)) {
176
+ data.callRecording = params.callRecording;
177
+ }
178
+ // await this.sendCommands(channel, [{
179
+ // name: 'grammar',
180
+ // params: {}
181
+ // }])
182
+ // channel.global = null;
183
+ await this.updateData();
184
+ this.process.runThread({
185
+ id: `${stepExit}_${nanoid(8)}`,
186
+ state: {
187
+ name: 'exitToThread',
188
+ result: {
189
+ conversation: this.conversation,
190
+ conversationThreadId: this.conversationThread.id
191
+ },
192
+ exitStep: this.getExitStepId(stepExit),
193
+ step: this.currentStepId
194
+ }
195
+ });
196
+ // this is required to mark event as handled
197
+ this.gotoState(this.state, { name: 'exiting' });
198
+ }
199
+ async exitToThread() {
200
+ this.thread.jumpTo(this.state.exitStep, this.state.result);
201
+ }
202
+ async buildGrammar(channel, choices) {
203
+ const { asr } = this.data;
204
+ return {
205
+ id: this.currentStepId,
206
+ choices,
207
+ asr: asr.getSettings(channel.asr)
208
+ };
209
+ }
210
+ }
211
+ exports.default = VoiceGlobalStep;
212
+ //# sourceMappingURL=Global%20Commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Global Commands.js","sourceRoot":"","sources":["../src/Global Commands.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export default class Hangup extends VoiceStep {
2
+ }
3
+ import VoiceStep from "./voice";
package/dst/Hangup.js ADDED
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const voice_1 = (0, tslib_1.__importDefault)(require("./voice"));
5
+ class Hangup extends voice_1.default {
6
+ async runStep() {
7
+ /** @type {import('./voice').IVoiceChannel} */
8
+ const channel = await this.fetchData();
9
+ this.triggers.once(`in/voice/${channel.id}/event`, async (event) => {
10
+ switch (event.params.type) {
11
+ case 'hangup':
12
+ await this.handleHangup(channel);
13
+ return this.exitStep('next');
14
+ case 'error':
15
+ return this.exitStep('error', {
16
+ name: event.params.error.name,
17
+ message: event.params.error.message
18
+ });
19
+ case 'cancel': {
20
+ return this.exitStep('cancel');
21
+ }
22
+ default:
23
+ return this.exitFlow();
24
+ }
25
+ });
26
+ this.triggers.otherwise(async () => {
27
+ try {
28
+ await this.sendCommands(channel, [{ name: 'hangup' }]);
29
+ }
30
+ catch (err) {
31
+ this.log.warn(`Catch hangup error: ${err}`);
32
+ return this.exitStep('next');
33
+ }
34
+ return this.exitFlow();
35
+ });
36
+ }
37
+ }
38
+ exports.default = Hangup;
39
+ //# sourceMappingURL=Hangup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hangup.js","sourceRoot":"","sources":["../src/Hangup.js"],"names":[],"mappings":";;;AAAA,iEAA+B;AAE/B,MAAqB,MAAO,SAAQ,eAAS;IAC3C,KAAK,CAAC,OAAO;QACX,8CAA8C;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACjE,QAAQ,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;gBACzB,KAAK,QAAQ;oBACX,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;oBAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;gBAC9B,KAAK,OAAO;oBACV,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;wBAC5B,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI;wBAC7B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;qBACpC,CAAC,CAAA;gBACJ,KAAK,QAAQ,CAAC,CAAC;oBACb,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;iBAC/B;gBACD;oBACE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;aACzB;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YACjC,IAAI;gBACF,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;aACvD;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;gBAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;aAC7B;YAED,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;QACxB,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAjCD,yBAiCC"}
@@ -0,0 +1,3 @@
1
+ export default class IdleMusic extends VoiceStep {
2
+ }
3
+ import VoiceStep from "./voice";
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const voice_1 = (0, tslib_1.__importDefault)(require("./voice"));
5
+ const joi = require('@hapi/joi');
6
+ const timestring = require('timestring');
7
+ const _ = require('lodash');
8
+ class IdleMusic extends voice_1.default {
9
+ async runStep() {
10
+ /** @type {import('./voice').IVoiceChannel} */
11
+ const channel = await this.fetchData();
12
+ const { idleDuration, idleMusicDelay, idleMusicEnabled, customIdleMusic, idleMusicUrl } = this.data;
13
+ const schema = joi.object().keys({
14
+ idleMusicEnabled: joi.boolean().required(),
15
+ idleDuration: joi.number().min(10000).max(1800000).required(),
16
+ idleMusicDelay: joi.when('idleMusicEnabled', {
17
+ is: true,
18
+ then: joi.number().min(1).max(30000).required()
19
+ }),
20
+ customIdleMusic: joi.boolean(),
21
+ idleMusicUrl: joi.when('customIdleMusic', {
22
+ is: true,
23
+ then: joi.string().uri().required()
24
+ })
25
+ });
26
+ const idleDurationMs = timestring(_.get(idleDuration, 'input', '30s'), _.get(idleDuration, 'outputMode', 'ms'));
27
+ const idleMusicDelayMs = timestring(_.get(idleMusicDelay, 'input', '3s'), _.get(idleMusicDelay, 'outputMode', 'ms'));
28
+ const { error: validationError } = await schema.validateAsync({
29
+ idleMusicEnabled,
30
+ customIdleMusic,
31
+ idleMusicUrl,
32
+ idleMusicDelay: idleMusicDelayMs,
33
+ idleDuration: idleDurationMs
34
+ });
35
+ if (validationError)
36
+ throw new Error(validationError.message);
37
+ const command = {
38
+ name: 'idle',
39
+ params: {
40
+ disabled: !idleMusicEnabled,
41
+ timeout: idleMusicDelayMs,
42
+ maxDuration: idleDurationMs,
43
+ musicUrl: idleMusicUrl || null
44
+ }
45
+ };
46
+ await this.sendCommands(channel, [command]);
47
+ return this.exitStep('next');
48
+ }
49
+ }
50
+ exports.default = IdleMusic;
51
+ //# sourceMappingURL=Idle%20Music.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Idle Music.js","sourceRoot":"","sources":["../src/Idle Music.js"],"names":[],"mappings":";;;AAAA,iEAA+B;AAE/B,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAChC,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AAExC,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE3B,MAAqB,SAAU,SAAQ,eAAS;IAC9C,KAAK,CAAC,OAAO;QACX,8CAA8C;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;QAEtC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;QAEnG,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;YAC/B,gBAAgB,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YAC1C,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;YAC7D,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC3C,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;aAChD,CAAC;YACF,eAAe,EAAE,GAAG,CAAC,OAAO,EAAE;YAC9B,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBACxC,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;aACpC,CAAC;SACH,CAAC,CAAA;QAEF,MAAM,cAAc,GAAG,UAAU,CAC/B,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,EACnC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,CACxC,CAAA;QACD,MAAM,gBAAgB,GAAG,UAAU,CACjC,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EACpC,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,IAAI,CAAC,CAC1C,CAAA;QAED,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YAC5D,gBAAgB;YAChB,eAAe;YACf,YAAY;YACZ,cAAc,EAAE,gBAAgB;YAChC,YAAY,EAAE,cAAc;SAC7B,CAAC,CAAA;QAEF,IAAI,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;QAE7D,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE;gBACN,QAAQ,EAAE,CAAC,gBAAgB;gBAC3B,OAAO,EAAE,gBAAgB;gBACzB,WAAW,EAAE,cAAc;gBAC3B,QAAQ,EAAE,YAAY,IAAI,IAAI;aAC/B;SACF,CAAA;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;QAE3C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;CACF;AAtDD,4BAsDC"}
@@ -0,0 +1,9 @@
1
+ export default class InitiateCall extends VoiceStep {
2
+ waitForCall(): Promise<void>;
3
+ error: {
4
+ name: any;
5
+ message: string;
6
+ stack: {};
7
+ } | undefined;
8
+ }
9
+ import VoiceStep from "./voice";