diff --git a/lib/tasks/dialogflow/index.js b/lib/tasks/dialogflow/index.js index 8554c8eb..1190e073 100644 --- a/lib/tasks/dialogflow/index.js +++ b/lib/tasks/dialogflow/index.js @@ -47,6 +47,7 @@ class Dialogflow extends Task { this.language = this.data.tts.language || 'default'; this.voice = this.data.tts.voice || 'default'; } + this.bargein = this.data.bargein; } get name() { return TaskName.Dialogflow; } @@ -266,7 +267,7 @@ class Dialogflow extends Task { * @param {*} ep - media server endpoint * @param {*} evt - event data */ - _onTranscription(ep, cs, evt) { + async _onTranscription(ep, cs, evt) { const transcription = new Transcription(this.logger, evt); if (this.events.includes('transcription') && transcription.isFinal) { @@ -281,6 +282,13 @@ class Dialogflow extends Task { transcription.confidence > 0.8) { ep.play(this.data.thinkingSound).catch((err) => this.logger.info(err, 'Error playing typing sound')); } + + // interrupt playback on speaking if bargein = true + if (this.bargein && this.playInProgress) { + this.logger.debug('terminating playback due to speech bargein'); + this.playInProgress = false; + await ep.api('uuid_break', ep.uuid); + } } /** diff --git a/lib/tasks/gather.js b/lib/tasks/gather.js index e7e00d38..9613da26 100644 --- a/lib/tasks/gather.js +++ b/lib/tasks/gather.js @@ -10,15 +10,18 @@ class TaskGather extends Task { [ 'finishOnKey', 'hints', 'input', 'numDigits', - 'partialResultHook', 'profanityFilter', + 'partialResultHook', 'speechTimeout', 'timeout', 'say', 'play' ].forEach((k) => this[k] = this.data[k]); this.timeout = (this.timeout || 5) * 1000; this.interim = this.partialResultCallback; if (this.data.recognizer) { - this.language = this.data.recognizer.language || 'en-US'; - this.vendor = this.data.recognizer.vendor; + const recognizer = this.data.recognizer; + this.language = recognizer.language; + if (recognizer.hints && recognizer.hints.length > 0) { + this.hints = recognizer.hints.join(','); + } } this.digitBuffer = ''; diff --git a/lib/tasks/specs.json b/lib/tasks/specs.json index c9e3be58..b8dc769d 100644 --- a/lib/tasks/specs.json +++ b/lib/tasks/specs.json @@ -134,7 +134,8 @@ "noInputEvent": "string", "passDtmfAsTextInput": "boolean", "thinkingMusic": "string", - "tts": "#synthesizer" + "tts": "#synthesizer", + "bargein": "boolean" }, "required": [ "project", @@ -271,7 +272,8 @@ "earlyMedia": "boolean" }, "required": [ - "transcriptionHook" + "transcriptionHook", + "recognizer" ] }, "target": { @@ -327,13 +329,47 @@ "properties": { "vendor": { "type": "string", - "enum": ["google"] + "enum": ["google", "aws"] }, "language": "string", "hints": "array", + "altLanguages": "array", "profanityFilter": "boolean", "interim": "boolean", - "dualChannel": "boolean" + "singleUtterance": "boolean", + "dualChannel": "boolean", + "separateRecognitionPerChannel": "boolean", + "punctuation": "boolean", + "enhancedModel": "boolean", + "words": "boolean", + "diarization": "boolean", + "diarizationMinSpeakers": "number", + "diarizationMaxSpeakers": "number", + "interactionType": { + "type": "string", + "enum": [ + "unspecified", + "discussion", + "presentation", + "phone_call", + "voicemail", + "voice_search", + "voice_command", + "dictation" + ] + }, + "naicsCode": "number", + "identifyChannels": "boolean", + "vocabularyName": "string", + "vocabularyFilterName": "string", + "filterMethod": { + "type": "string", + "enum": [ + "remove", + "mask", + "tag" + ] + } }, "required": [ "vendor" diff --git a/lib/tasks/transcribe.js b/lib/tasks/transcribe.js index b324ad2f..10697d36 100644 --- a/lib/tasks/transcribe.js +++ b/lib/tasks/transcribe.js @@ -1,5 +1,10 @@ const Task = require('./task'); -const {TaskName, TaskPreconditions, TranscriptionEvents} = require('../utils/constants'); +const { + TaskName, + TaskPreconditions, + GoogleTranscriptionEvents, + AwsTranscriptionEvents +} = require('../utils/constants'); class TaskTranscribe extends Task { constructor(logger, opts, parentTask) { @@ -8,12 +13,33 @@ class TaskTranscribe extends Task { this.transcriptionHook = this.data.transcriptionHook; this.earlyMedia = this.data.earlyMedia === true || (parentTask && parentTask.earlyMedia); - if (this.data.recognizer) { - this.language = this.data.recognizer.language || 'en-US'; - this.vendor = this.data.recognizer.vendor; - this.interim = this.data.recognizer.interim === true; - this.dualChannel = this.data.recognizer.dualChannel === true; - } + + const recognizer = this.data.recognizer; + this.vendor = recognizer.vendor; + if ('default' === this.vendor || !this.vendor) this.vendor = this.callSession.speechRecognizerVendor + this.language = recognizer.language; + if ('default' === this.language || !this.language) this.language = this.callSession.speechRecognizerLanguage; + this.interim = !!recognizer.interim; + this.separateRecognitionPerChannel = recognizer.separateRecognitionPerChannel; + + /* google-specific options */ + this.hints = recognizer.hints || []; + this.profanityFilter = recognizer.profanityFilter; + this.punctuation = !!recognizer.punctuation; + this.enhancedModel = !!recognizer.enhancedModel; + this.words = !!recognizer.words; + this.diarization = !!recognizer.diarization; + this.diarizationMinSpeakers = recognizer.diarizationMinSpeakers || 0; + this.diarizationMaxSpeakers = recognizer.diarizationMaxSpeakers || 0; + this.interactionType = recognizer.interactionType || 'unspecified'; + this.naicsCode = recognizer.naicsCode || 0; + this.altLanguages = recognizer.altLanguages || []; + + /* aws-specific options */ + this.identifyChannels = !!recognizer.identifyChannels; + this.vocabularyName = recognizer.vocabularyName; + this.vocabularyFilterName = recognizer.vocabularyFilterName; + this.filterMethod = recognizer.filterMethod; } get name() { return TaskName.Transcribe; } @@ -27,15 +53,19 @@ class TaskTranscribe extends Task { } catch (err) { this.logger.info(err, 'TaskTranscribe:exec - error'); } - ep.removeCustomEventListener(TranscriptionEvents.Transcription); - ep.removeCustomEventListener(TranscriptionEvents.NoAudioDetected); - ep.removeCustomEventListener(TranscriptionEvents.MaxDurationExceeded); + ep.removeCustomEventListener(GoogleTranscriptionEvents.Transcription); + ep.removeCustomEventListener(GoogleTranscriptionEvents.NoAudioDetected); + ep.removeCustomEventListener(GoogleTranscriptionEvents.MaxDurationExceeded); + ep.removeCustomEventListener(AwsTranscriptionEvents.Transcription); + ep.removeCustomEventListener(AwsTranscriptionEvents.NoAudioDetected); + ep.removeCustomEventListener(AwsTranscriptionEvents.MaxDurationExceeded); } async kill(cs) { super.kill(cs); if (this.ep.connected) { - this.ep.stopTranscription().catch((err) => this.logger.info(err, 'Error TaskTranscribe:kill')); + this.ep.stopTranscription({vendor: this.vendor}) + .catch((err) => this.logger.info(err, 'Error TaskTranscribe:kill')); // hangup after 1 sec if we don't get a final transcription this._timer = setTimeout(() => this.notifyTaskDone(), 1000); @@ -45,34 +75,83 @@ class TaskTranscribe extends Task { } async _startTranscribing(ep) { - const opts = { - GOOGLE_SPEECH_USE_ENHANCED: true, - GOOGLE_SPEECH_MODEL: 'phone_call' - }; - if (this.hints) { - Object.assign(opts, {'GOOGLE_SPEECH_HINTS': this.hints.join(',')}); - } - if (this.profanityFilter) { - Object.assign(opts, {'GOOGLE_SPEECH_PROFANITY_FILTER': true}); - } - if (this.dualChannel) { - Object.assign(opts, {'GOOGLE_SPEECH_SEPARATE_RECOGNITION_PER_CHANNEL': true}); - } - await ep.set(opts) - .catch((err) => this.logger.info(err, 'TaskTranscribe:_startTranscribing')); + const opts = {}; - ep.addCustomEventListener(TranscriptionEvents.Transcription, this._onTranscription.bind(this, ep)); - ep.addCustomEventListener(TranscriptionEvents.NoAudioDetected, this._onNoAudio.bind(this, ep)); - ep.addCustomEventListener(TranscriptionEvents.MaxDurationExceeded, this._onMaxDurationExceeded.bind(this, ep)); + ep.addCustomEventListener(GoogleTranscriptionEvents.Transcription, this._onTranscription.bind(this, ep)); + ep.addCustomEventListener(GoogleTranscriptionEvents.NoAudioDetected, this._onNoAudio.bind(this, ep)); + ep.addCustomEventListener(GoogleTranscriptionEvents.MaxDurationExceeded, + this._onMaxDurationExceeded.bind(this, ep)); + ep.addCustomEventListener(AwsTranscriptionEvents.Transcription, this._onTranscription.bind(this, ep)); + ep.addCustomEventListener(AwsTranscriptionEvents.NoAudioDetected, this._onNoAudio.bind(this, ep)); + ep.addCustomEventListener(AwsTranscriptionEvents.MaxDurationExceeded, + this._onMaxDurationExceeded.bind(this, ep)); + if (this.vendor === 'google') { + [ + ['enhancedModel', 'GOOGLE_SPEECH_USE_ENHANCED'], + ['separateRecognitionPerChannel', 'GOOGLE_SPEECH_SEPARATE_RECOGNITION_PER_CHANNEL'], + ['profanityFilter', 'GOOGLE_SPEECH_PROFANITY_FILTER'], + ['punctuation', 'GOOGLE_SPEECH_ENABLE_AUTOMATIC_PUNCTUATION'], + ['words', 'GOOGLE_SPEECH_ENABLE_WORD_TIME_OFFSETS'], + ['diarization', 'GOOGLE_SPEECH_PROFANITY_FILTER'] + ].forEach((arr) => { + if (this[arr[0]]) opts[arr[1]] = true; + }); + if (this.hints.length > 1) opts.GOOGLE_SPEECH_HINTS = this.hints.join(','); + if (this.altLanguages.length > 1) opts.GOOGLE_SPEECH_ALTERNATIVE_LANGUAGE_CODES = this.altLanguages.join(','); + if ('unspecified' !== this.interactionType) { + opts.GOOGLE_SPEECH_METADATA_INTERACTION_TYPE = this.interactionType; + + // additionally set model if appropriate + if ('phone_call' === this.interactionType) opts.GOOGLE_SPEECH_MODEL = 'phone_call'; + else if (['voice_search', 'voice_command'].includes(this.interactionType)) { + opts.GOOGLE_SPEECH_MODEL = 'command_and_search'; + } + else opts.GOOGLE_SPEECH_MODEL = 'phone_call'; + } + else opts.GOOGLE_SPEECH_MODEL = 'phone_call'; + if (this.diarization && this.diarizationMinSpeakers > 0) { + opts.GOOGLE_SPEECH_SPEAKER_DIARIZATION_MIN_SPEAKER_COUNT = this.diarizationMinSpeakers; + } + if (this.diarization && this.diarizationMaxSpeakers > 0) { + opts.GOOGLE_SPEECH_SPEAKER_DIARIZATION_MAX_SPEAKER_COUNT = this.diarizationMaxSpeakers; + } + if (this.naicsCode > 0) opts.GOOGLE_SPEECH_METADATA_INDUSTRY_NAICS_CODE = this.naicsCode; + + await ep.set(opts) + .catch((err) => this.logger.info(err, 'TaskTranscribe:_startTranscribing with google')); + } + else if (this.vendor === 'aws') { + [ + ['diarization', 'AWS_SHOW_SPEAKER_LABEL'], + ['identifyChannels', 'AWS_ENABLE_CHANNEL_IDENTIFICATION'] + ].forEach((arr) => { + if (this[arr[0]]) opts[arr[1]] = true; + }); + if (this.vocabularyName) opts.AWS_VOCABULARY_NAME = this.vocabularyName; + if (this.vocabularyFilterName) { + opts.AWS_VOCABULARY_NAME = this.vocabularyFilterName; + opts.AWS_VOCABULARY_FILTER_METHOD = this.filterMethod || 'mask'; + } + + Object.assign(opts, { + AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID, + AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY, + AWS_REGION: process.env.AWS_REGION + }); + + await ep.set(opts) + .catch((err) => this.logger.info(err, 'TaskTranscribe:_startTranscribing with aws')); + } await this._transcribe(ep); } async _transcribe(ep) { - await this.ep.startTranscription({ + await ep.startTranscription({ + vendor: this.vendor, interim: this.interim ? true : false, - language: this.language || this.callSession.speechRecognizerLanguage, - channels: this.dualChannel ? 2 : 1 + language: this.language, + channels: this.separateRecognitionPerChannel ? 2 : 1 }); } diff --git a/lib/utils/constants.json b/lib/utils/constants.json index 737f080f..06d5cded 100644 --- a/lib/utils/constants.json +++ b/lib/utils/constants.json @@ -51,12 +51,18 @@ "StableCall": "stable-call", "UnansweredCall": "unanswered-call" }, - "TranscriptionEvents": { + "GoogleTranscriptionEvents": { "Transcription": "google_transcribe::transcription", "EndOfUtterance": "google_transcribe::end_of_utterance", "NoAudioDetected": "google_transcribe::no_audio_detected", "MaxDurationExceeded": "google_transcribe::max_duration_exceeded" }, + "AwsTranscriptionEvents": { + "Transcription": "aws_transcribe::transcription", + "EndOfTranscript": "aws_transcribe::end_of_transcript", + "NoAudioDetected": "aws_transcribe::no_audio_detected", + "MaxDurationExceeded": "aws_transcribe::max_duration_exceeded" + }, "ListenEvents": { "Connect": "mod_audio_fork::connect", "ConnectFailure": "mod_audio_fork::connect_failed", diff --git a/package-lock.json b/package-lock.json index 863a180d..16407252 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "jambonz-feature-server", - "version": "0.2.4", + "version": "0.2.5", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -298,9 +298,9 @@ } }, "@grpc/grpc-js": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.2.4.tgz", - "integrity": "sha512-z+EI20HYHLd3/uERtwOqP8Q4EPhGbz5RKUpiyo6xPWfR3pcjpf8sfNvY9XytDQ4xo1wNz7NqH1kh2UBonwzbfg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.2.5.tgz", + "integrity": "sha512-CBCNwedw8McnEBq9jvoiJikws16WN0OiHFejQPovY71XkFWSiIqgvydYiDwpvIYDJmhPQ7qZNzW9BPndhXbx1Q==", "requires": { "@types/node": "^12.12.47", "google-auth-library": "^6.1.1", @@ -336,9 +336,9 @@ "dev": true }, "@jambonz/db-helpers": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@jambonz/db-helpers/-/db-helpers-0.5.10.tgz", - "integrity": "sha512-NzcdkbE0pb1sX7AESJ3cNZKBAjQJW2LY/73TUXfRV2C/akoE9bsn8RtWoSeAsoJTVdl/welMCEOnqyny0W7i+g==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@jambonz/db-helpers/-/db-helpers-0.5.11.tgz", + "integrity": "sha512-3IV28+SD07AFPAf4a9BMjbBlPc4LOQ62uNdVO4hFY4rG7ttj/eWRYoKFItI0564MbSTHXtNyx1DsqHpI+60ZwA==", "requires": { "debug": "^4.3.1", "mysql2": "^2.2.5", @@ -593,9 +593,9 @@ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" }, "aws-sdk": { - "version": "2.830.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.830.0.tgz", - "integrity": "sha512-vFatoWkdJmRzpymWbqsuwVsAJdhdAvU2JcM9jKRENTNKJw90ljnLyeP1eKCp4O3/4Lg43PVBwY/KUqPy4wL+OA==", + "version": "2.834.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.834.0.tgz", + "integrity": "sha512-9WRULrn4qAmgXI+tEW/IG5s/6ixJGZqjPOrmJsFZQev7/WRkxAZmJAjcwd4Ifm/jsJbXx2FSwO76gOPEvu2LqA==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -1092,21 +1092,20 @@ "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" }, "drachtio-fsmrf": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/drachtio-fsmrf/-/drachtio-fsmrf-2.0.2.tgz", - "integrity": "sha512-f/oYrRQxTQAkKwi2lVVsZfkpktFPVezqxjVtXFRYaYwC4hiTL2QVhgPxEnUWx0NStzZTURGhrPbV8L9tNjVgPw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/drachtio-fsmrf/-/drachtio-fsmrf-2.0.5.tgz", + "integrity": "sha512-4LcNOILnvppoJFIk/CMcK1X3dPyNJuOmT1jxde701fxHd6Ybk5ohVACBpStW+RBzmRKZxkxkycEHnDUAG27MWg==", "requires": { "async": "^1.4.2", "debug": "^2.2.0", "delegates": "^0.1.0", "drachtio-modesl": "^1.2.0", - "drachtio-srf": "^4.4.15", + "drachtio-srf": "^4.4.47", "lodash": "^4.17.20", - "minimist": "^1.2.0", - "moment": "^2.13.0", + "minimist": "^1.2.5", "only": "0.0.2", - "sdp-transform": "^2.7.0", - "uuid": "^3.0.0" + "sdp-transform": "^2.14.0", + "uuid": "^3.4.0" }, "dependencies": { "debug": { @@ -1117,10 +1116,39 @@ "ms": "2.0.0" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "drachtio-srf": { + "version": "4.4.47", + "resolved": "https://registry.npmjs.org/drachtio-srf/-/drachtio-srf-4.4.47.tgz", + "integrity": "sha512-dpbutyaRWj0llqRShkd02nsaLj0dlSaKJhG6IzxeLQSiyY6h5/vtqEDaw/uft/sSqwrMWwu+6SlkutKjb5ei0A==", + "requires": { + "async": "^1.4.2", + "debug": "^3.2.7", + "delegates": "^0.1.0", + "deprecate": "^1.1.1", + "drachtio-sip": "^0.5.2", + "node-noop": "0.0.1", + "only": "0.0.2", + "sdp-transform": "^2.14.1", + "short-uuid": "^4.1.0", + "sip-methods": "^0.3.0", + "utils-merge": "1.0.0", + "uuid": "^3.4.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } }, "ms": { "version": "2.0.0", @@ -1164,9 +1192,9 @@ } }, "drachtio-srf": { - "version": "4.4.46", - "resolved": "https://registry.npmjs.org/drachtio-srf/-/drachtio-srf-4.4.46.tgz", - "integrity": "sha512-tw3sJNfgVvk3un9O51mPkozmcqtu0JTNLNyrHb5tq423KmJuQCIU3rXRDw8mHLpLNfpRC1+y9Oqxwa45lS1ODA==", + "version": "4.4.47", + "resolved": "https://registry.npmjs.org/drachtio-srf/-/drachtio-srf-4.4.47.tgz", + "integrity": "sha512-dpbutyaRWj0llqRShkd02nsaLj0dlSaKJhG6IzxeLQSiyY6h5/vtqEDaw/uft/sSqwrMWwu+6SlkutKjb5ei0A==", "requires": { "async": "^1.4.2", "debug": "^3.2.7", @@ -1190,11 +1218,6 @@ "ms": "^2.1.1" } }, - "sdp-transform": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz", - "integrity": "sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw==" - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -1320,9 +1343,9 @@ "dev": true }, "eslint": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", - "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", + "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1844,9 +1867,9 @@ } }, "google-auth-library": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.4.tgz", - "integrity": "sha512-q0kYtGWnDd9XquwiQGAZeI2Jnglk7NDi0cChE4tWp6Kpo/kbqnt9scJb0HP+/xqt03Beqw/xQah1OPrci+pOxw==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.6.tgz", + "integrity": "sha512-Q+ZjUEvLQj/lrVHF/IQwRo6p3s8Nc44Zk/DALsN+ac3T4HY/g/3rrufkgtl+nZ1TW7DNAw5cTChdVp4apUXVgQ==", "requires": { "arrify": "^2.0.0", "base64-js": "^1.3.0", @@ -1892,21 +1915,13 @@ "dev": true }, "gtoken": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.2.0.tgz", - "integrity": "sha512-qbf6JWEYFMj3WMAluvYXl8GAiji6w8d9OmAGCbBg0xF4xD/yu6ZaO6BhoXNddRjKcOUpZD81iea1H5B45gAo1g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.2.1.tgz", + "integrity": "sha512-OY0BfPKe3QnMsY9MzTHTSKn+Vl2l1CcLe6BwDEQj00mbbkl5nyQ/7EUREstg4fQNZ8iYE7br4JJ7TdKeDOPWmw==", "requires": { "gaxios": "^4.0.0", "google-p12-pem": "^3.0.3", - "jws": "^4.0.0", - "mime": "^2.2.0" - }, - "dependencies": { - "mime": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", - "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==" - } + "jws": "^4.0.0" } }, "has": { @@ -2438,8 +2453,7 @@ "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash.camelcase": { "version": "4.3.0", @@ -3160,9 +3174,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "sdp-transform": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.0.tgz", - "integrity": "sha512-8ZYOau/o9PzRhY0aMuRzvmiM6/YVQR8yjnBScvZHSdBnywK5oZzAJK+412ZKkDq29naBmR3bRw8MFu0C01Gehg==" + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz", + "integrity": "sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw==" }, "semver": { "version": "6.3.0", diff --git a/package.json b/package.json index 785fb12d..3734339f 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,8 @@ "cidr-matcher": "^2.1.1", "debug": "^4.3.1", "deepcopy": "^2.1.0", - "drachtio-fsmrf": "^2.0.2", - "drachtio-srf": "^4.4.46", + "drachtio-fsmrf": "^2.0.5", + "drachtio-srf": "^4.4.47", "express": "^4.17.1", "ip": "^1.1.5", "jambonz-mw-registrar": "^0.1.3", @@ -48,7 +48,7 @@ "devDependencies": { "blue-tape": "^1.0.0", "clear-module": "^4.1.1", - "eslint": "^7.18.0", + "eslint": "^7.19.0", "eslint-plugin-promise": "^4.2.1", "lodash": "4.17.20", "nyc": "^15.1.0",