diff --git a/lib/session/call-session.js b/lib/session/call-session.js index f9639739..469854dd 100644 --- a/lib/session/call-session.js +++ b/lib/session/call-session.js @@ -804,6 +804,7 @@ class CallSession extends Emitter { speech_credential_sid: credential.speech_credential_sid, accessKeyId: credential.access_key_id, secretAccessKey: credential.secret_access_key, + roleArn: credential.role_arn, region: credential.aws_region || AWS_REGION }; } diff --git a/lib/tasks/stt-task.js b/lib/tasks/stt-task.js index a1baca87..be96f44e 100644 --- a/lib/tasks/stt-task.js +++ b/lib/tasks/stt-task.js @@ -166,7 +166,7 @@ class SttTask extends Task { } async _initSpeechCredentials(cs, vendor, label) { - const {getNuanceAccessToken, getIbmAccessToken} = cs.srf.locals.dbHelpers; + const {getNuanceAccessToken, getIbmAccessToken, getAwsAuthToken} = cs.srf.locals.dbHelpers; let credentials = cs.getSpeechCredentials(vendor, 'stt', label); if (!credentials) { @@ -194,6 +194,12 @@ class SttTask extends Task { const {access_token, servedFromCache} = await getIbmAccessToken(stt_api_key); this.logger.debug({stt_api_key}, `got ibm access token ${servedFromCache ? 'from cache' : ''}`); credentials = {...credentials, access_token, stt_region}; + } else if (['aws', 'polly'].includes(vendor) && credentials.roleArn) { + /* get aws access token */ + const {roleArn} = credentials; + const {accessKeyId, secretAccessKey, sessionToken, servedFromCache} = await getAwsAuthToken(roleArn); + this.logger.debug({roleArn}, `got aws access token ${servedFromCache ? 'from cache' : ''}`); + credentials = {...credentials, accessKeyId, secretAccessKey, sessionToken}; } return credentials; } diff --git a/lib/utils/db-utils.js b/lib/utils/db-utils.js index abf98699..0d672195 100644 --- a/lib/utils/db-utils.js +++ b/lib/utils/db-utils.js @@ -41,6 +41,7 @@ const speechMapper = (cred) => { const o = JSON.parse(decrypt(credential)); obj.access_key_id = o.access_key_id; obj.secret_access_key = o.secret_access_key; + obj.role_arn = o.role_arn; obj.aws_region = o.aws_region; } else if ('microsoft' === obj.vendor) { diff --git a/lib/utils/install-srf-locals.js b/lib/utils/install-srf-locals.js index 8684b8fd..2158d75c 100644 --- a/lib/utils/install-srf-locals.js +++ b/lib/utils/install-srf-locals.js @@ -179,6 +179,7 @@ function installSrfLocals(srf, logger) { addFileToCache, getNuanceAccessToken, getIbmAccessToken, + getAwsAuthToken } = require('@jambonz/speech-utils')({}, logger); const { writeAlerts, @@ -216,6 +217,7 @@ function installSrfLocals(srf, logger) { listCalls, deleteCall, synthAudio, + getAwsAuthToken, addFileToCache, createHash, retrieveHash, diff --git a/lib/utils/transcription-utils.js b/lib/utils/transcription-utils.js index e83aa99f..8ad150d7 100644 --- a/lib/utils/transcription-utils.js +++ b/lib/utils/transcription-utils.js @@ -552,9 +552,10 @@ module.exports = (logger) => { ...(rOpts.vocabularyFilterName && {AWS_VOCABULARY_FILTER_NAME: rOpts.vocabularyFilterName}), ...(rOpts.filterMethod && {AWS_VOCABULARY_FILTER_METHOD: rOpts.filterMethod}), ...(sttCredentials && { - AWS_ACCESS_KEY_ID: sttCredentials.accessKeyId, - AWS_SECRET_ACCESS_KEY: sttCredentials.secretAccessKey, - AWS_REGION: sttCredentials.region + ...(sttCredentials.accessKeyId && {AWS_ACCESS_KEY_ID: sttCredentials.accessKeyId}), + ...(sttCredentials.secretAccessKey && {AWS_SECRET_ACCESS_KEY: sttCredentials.secretAccessKey}), + AWS_REGION: sttCredentials.region, + ...(sttCredentials.sessionToken && {AWS_SESSION_TOKEN: sttCredentials.sessionToken}), }), }; } diff --git a/package-lock.json b/package-lock.json index e599e038..7c51fd9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@jambonz/http-health-check": "^0.0.1", "@jambonz/mw-registrar": "^0.2.7", "@jambonz/realtimedb-helpers": "^0.8.8", - "@jambonz/speech-utils": "^0.0.51", + "@jambonz/speech-utils": "^0.1.0", "@jambonz/stats-collector": "^0.1.9", "@jambonz/time-series": "^0.2.8", "@jambonz/verb-specifications": "^0.0.69", @@ -2322,9 +2322,9 @@ } }, "node_modules/@jambonz/speech-utils": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@jambonz/speech-utils/-/speech-utils-0.0.51.tgz", - "integrity": "sha512-3Zk2CERs1PYQiCG08NDMNBbDzBBfPuEwgADTANMP56dd07PpW360ufL8CcQfkBmWKGVma0wevRrv6DQLu2Ifdg==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@jambonz/speech-utils/-/speech-utils-0.1.0.tgz", + "integrity": "sha512-45K6Vrl2PMEbbcnvm65afCDujDxck/bEUq7+P6KRw/cei3mrKtwjGh3HXi1cKhC1gA5UF1+5YrUoPO9LdoZnog==", "dependencies": { "@aws-sdk/client-polly": "^3.496.0", "@aws-sdk/client-sts": "^3.496.0", @@ -11954,9 +11954,9 @@ } }, "@jambonz/speech-utils": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@jambonz/speech-utils/-/speech-utils-0.0.51.tgz", - "integrity": "sha512-3Zk2CERs1PYQiCG08NDMNBbDzBBfPuEwgADTANMP56dd07PpW360ufL8CcQfkBmWKGVma0wevRrv6DQLu2Ifdg==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@jambonz/speech-utils/-/speech-utils-0.1.0.tgz", + "integrity": "sha512-45K6Vrl2PMEbbcnvm65afCDujDxck/bEUq7+P6KRw/cei3mrKtwjGh3HXi1cKhC1gA5UF1+5YrUoPO9LdoZnog==", "requires": { "@aws-sdk/client-polly": "^3.496.0", "@aws-sdk/client-sts": "^3.496.0", diff --git a/package.json b/package.json index f34a8b49..c73910e3 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@jambonz/http-health-check": "^0.0.1", "@jambonz/mw-registrar": "^0.2.7", "@jambonz/realtimedb-helpers": "^0.8.8", - "@jambonz/speech-utils": "^0.0.51", + "@jambonz/speech-utils": "^0.1.0", "@jambonz/stats-collector": "^0.1.9", "@jambonz/time-series": "^0.2.8", "@jambonz/verb-specifications": "^0.0.69",