From 617f7af4af21e85f68923f2b5d5d2f8f058e20a0 Mon Sep 17 00:00:00 2001 From: Quan HL Date: Wed, 31 May 2023 21:53:18 +0700 Subject: [PATCH] feat: ioredis and getsize of tts cache --- config/test.json | 4 +- index.js | 23 +++-- lib/get-ibm-access-token.js | 2 +- lib/get-nuance-access-token.js | 2 +- lib/get-tts-size.js | 14 +++ lib/purge-tts-cache.js | 10 +- lib/synth-audio.js | 6 +- package-lock.json | 181 ++++++++++++++++++++------------- package.json | 5 +- test/ibm.js | 4 +- test/list-voices.js | 12 +-- test/nuance.js | 4 +- test/synth.js | 23 +++-- 13 files changed, 176 insertions(+), 114 deletions(-) create mode 100644 lib/get-tts-size.js diff --git a/config/test.json b/config/test.json index 0d3ad28..5e9fb9e 100644 --- a/config/test.json +++ b/config/test.json @@ -8,6 +8,8 @@ }, "redis-auth": { "host": "127.0.0.1", - "port": 3380 + "port": 3380, + "username": "daveh", + "password": "foobarbazzle" } } \ No newline at end of file diff --git a/index.js b/index.js index e34b4c0..a9f0e0c 100644 --- a/index.js +++ b/index.js @@ -1,15 +1,23 @@ const {noopLogger} = require('./lib/utils'); -const promisify = require('@jambonz/promisify-redis'); -const redis = promisify(require('redis')); +const Redis = require('ioredis'); module.exports = (opts, logger) => { - const {host = '127.0.0.1', port = 6379, tls = false} = opts; logger = logger || noopLogger; + const connectionOpts = {...opts}; + // Support legacy app + if (process.env.JAMBONES_REDIS_USERNAME && process.env.JAMBONES_REDIS_PASSWORD) { + if (Array.isArray(connectionOpts)) { + for (const o of opts) { + o.username = process.env.JAMBONES_REDIS_USERNAME; + o.password = process.env.JAMBONES_REDIS_PASSWORD; + } + } else { + connectionOpts.username = process.env.JAMBONES_REDIS_USERNAME; + connectionOpts.password = process.env.JAMBONES_REDIS_PASSWORD; + } + } - const url = process.env.JAMBONES_REDIS_USERNAME && process.env.JAMBONES_REDIS_PASSWORD ? - `${process.env.JAMBONES_REDIS_USERNAME}:${process.env.JAMBONES_REDIS_PASSWORD}@${host}:${port}` : - `${host}:${port}`; - const client = redis.createClient(tls ? `rediss://${url}` : `redis://${url}`); + const client = new Redis(connectionOpts); ['ready', 'connect', 'reconnecting', 'error', 'end', 'warning'] .forEach((event) => { client.on(event, (...args) => { @@ -23,6 +31,7 @@ module.exports = (opts, logger) => { return { client, + getTtsSize: require('./lib/get-tts-size').bind(null, client, logger), purgeTtsCache: require('./lib/purge-tts-cache').bind(null, client, logger), synthAudio: require('./lib/synth-audio').bind(null, client, logger), getNuanceAccessToken: require('./lib/get-nuance-access-token').bind(null, client, logger), diff --git a/lib/get-ibm-access-token.js b/lib/get-ibm-access-token.js index 0e48192..3ebaef5 100644 --- a/lib/get-ibm-access-token.js +++ b/lib/get-ibm-access-token.js @@ -9,7 +9,7 @@ async function getIbmAccessToken(client, logger, apiKey) { logger = logger || noopLogger; try { const key = makeIbmKey(apiKey); - const access_token = await client.getAsync(key); + const access_token = await client.get(key); if (access_token) return {access_token, servedFromCache: true}; /* access token not found in cache, so fetch it from Ibm */ diff --git a/lib/get-nuance-access-token.js b/lib/get-nuance-access-token.js index a13c75a..1cc1383 100644 --- a/lib/get-nuance-access-token.js +++ b/lib/get-nuance-access-token.js @@ -9,7 +9,7 @@ async function getNuanceAccessToken(client, logger, clientId, secret, scope) { logger = logger || noopLogger; try { const key = makeNuanceKey(clientId, secret, scope); - const access_token = await client.getAsync(key); + const access_token = await client.get(key); if (access_token) return {access_token, servedFromCache: true}; /* access token not found in cache, so fetch it from Nuance */ diff --git a/lib/get-tts-size.js b/lib/get-tts-size.js new file mode 100644 index 0000000..f69fb86 --- /dev/null +++ b/lib/get-tts-size.js @@ -0,0 +1,14 @@ +const {noopLogger} = require('./utils'); +const debug = require('debug')('jambonz:realtimedb-helpers'); + +async function getTtsSize(client, logger, pattern = null) { + let keys; + if (pattern) { + keys = await client.keys(pattern); + } else { + keys = await client.keys('tts:*'); + } + return keys.length; +} + +module.exports = getTtsSize; \ No newline at end of file diff --git a/lib/purge-tts-cache.js b/lib/purge-tts-cache.js index f0ab7a1..1b26ab6 100644 --- a/lib/purge-tts-cache.js +++ b/lib/purge-tts-cache.js @@ -19,12 +19,12 @@ async function purgeTtsCache(client, logger, {all, account_sid, vendor, try { if (all) { - const keys = await client.keysAsync('tts:*'); - purgedCount = await client.delAsync(keys); + const keys = await client.keys('tts:*'); + purgedCount = await client.del(keys); } else if (account_sid && !vendor && !language && !voice && !engine && !text) { - const keys = await client.keysAsync(`tts:${account_sid}:*`); - purgedCount = await client.delAsync(keys); + const keys = await client.keys(`tts:${account_sid}:*`); + purgedCount = await client.del(keys); } else { const key = makeSynthKey({ @@ -35,7 +35,7 @@ async function purgeTtsCache(client, logger, {all, account_sid, vendor, engine, text, }); - purgedCount = await client.delAsync(key); + purgedCount = await client.del(key); if (purgedCount === 0) error = 'Specified item not found'; } diff --git a/lib/synth-audio.js b/lib/synth-audio.js index 4c3bc0b..d0524f5 100644 --- a/lib/synth-audio.js +++ b/lib/synth-audio.js @@ -111,7 +111,7 @@ async function synthAudio(client, logger, stats, { account_sid, debug(`synth key is ${key}`); let cached; if (!disableTtsCache) { - cached = await client.getAsync(key); + cached = await client.get(key); } if (cached) { // found in cache - extend the expiry and use it @@ -119,7 +119,7 @@ async function synthAudio(client, logger, stats, { account_sid, servedFromCache = true; stats.increment('tts.cache.requests', ['found:yes']); audioBuffer = Buffer.from(cached, 'base64'); - client.expireAsync(key, EXPIRES).catch((err) => logger.info(err, 'Error setting expires')); + client.expire(key, EXPIRES).catch((err) => logger.info(err, 'Error setting expires')); } if (!cached) { // not found in cache - go get it from speech vendor and add to cache @@ -168,7 +168,7 @@ async function synthAudio(client, logger, stats, { account_sid, debug(`tts rtt time for ${text.length} chars on ${vendorLabel}: ${rtt}`); logger.info(`tts rtt time for ${text.length} chars on ${vendorLabel}: ${rtt}`); - client.setexAsync(key, EXPIRES, audioBuffer.toString('base64')) + client.setex(key, EXPIRES, audioBuffer.toString('base64')) .catch((err) => logger.error(err, `error calling setex on key ${key}`)); } diff --git a/package-lock.json b/package-lock.json index bf6025f..13f9df8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,14 +12,13 @@ "@aws-sdk/client-polly": "^3.303.0", "@google-cloud/text-to-speech": "^4.2.1", "@grpc/grpc-js": "^1.8.13", - "@jambonz/promisify-redis": "^0.0.6", "bent": "^7.3.12", "debug": "^4.3.4", "form-urlencoded": "^6.1.0", "google-protobuf": "^3.21.2", "ibm-watson": "^8.0.0", + "ioredis": "^5.3.2", "microsoft-cognitiveservices-speech-sdk": "^1.26.0", - "redis": "^3.1.2", "undici": "^5.21.0" }, "devDependencies": { @@ -1516,6 +1515,11 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1633,17 +1637,6 @@ "node": ">=8" } }, - "node_modules/@jambonz/promisify-redis": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@jambonz/promisify-redis/-/promisify-redis-0.0.6.tgz", - "integrity": "sha512-9KmWV+ODDOPwdqijhgXOXkloGNm7nmCf3ch4D1vN46lh9FQLmnlQmEmBHIFaKB3vAgIgcMzNzcNmY23JGCGguA==", - "dependencies": { - "redis-commands": "^1.6.0" - }, - "peerDependencies": { - "redis": "^3.0.0" - } - }, "node_modules/@jest/types": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", @@ -2443,6 +2436,14 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2634,14 +2635,6 @@ "node": ">=0.4.0" } }, - "node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", @@ -4038,6 +4031,37 @@ "node": ">= 0.4" } }, + "node_modules/ioredis": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", + "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ioredis/node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -4828,12 +4852,22 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, "node_modules/lodash.isempty": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", @@ -5877,29 +5911,6 @@ "node": ">= 12.13.0" } }, - "node_modules/redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "dependencies": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-redis" - } - }, - "node_modules/redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", @@ -6284,6 +6295,11 @@ "node": ">=8" } }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -8231,6 +8247,11 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -8320,14 +8341,6 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, - "@jambonz/promisify-redis": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@jambonz/promisify-redis/-/promisify-redis-0.0.6.tgz", - "integrity": "sha512-9KmWV+ODDOPwdqijhgXOXkloGNm7nmCf3ch4D1vN46lh9FQLmnlQmEmBHIFaKB3vAgIgcMzNzcNmY23JGCGguA==", - "requires": { - "redis-commands": "^1.6.0" - } - }, "@jest/types": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", @@ -8959,6 +8972,11 @@ "wrap-ansi": "^7.0.0" } }, + "cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9108,11 +9126,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, "diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", @@ -10147,6 +10160,29 @@ "side-channel": "^1.0.4" } }, + "ioredis": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", + "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", + "requires": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "dependencies": { + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + } + } + }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -10726,12 +10762,22 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, "lodash.isempty": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", @@ -11513,22 +11559,6 @@ "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", "dev": true }, - "redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "requires": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - } - }, - "redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, "redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", @@ -11797,6 +11827,11 @@ } } }, + "standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, "stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", diff --git a/package.json b/package.json index 23d38df..219d28e 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "test": "test" }, "scripts": { - "test": "NODE_ENV=test JAMBONES_REDIS_USERNAME=daveh JAMBONES_REDIS_PASSWORD=foobarbazzle node test/ ", + "test": "NODE_ENV=test node test/ ", "coverage": "nyc --reporter html --report-dir ./coverage npm run test", "jslint": "eslint index.js lib", "build": "./build_stubs.sh" @@ -27,14 +27,13 @@ "@aws-sdk/client-polly": "^3.303.0", "@google-cloud/text-to-speech": "^4.2.1", "@grpc/grpc-js": "^1.8.13", - "@jambonz/promisify-redis": "^0.0.6", "bent": "^7.3.12", "debug": "^4.3.4", "form-urlencoded": "^6.1.0", "google-protobuf": "^3.21.2", "ibm-watson": "^8.0.0", "microsoft-cognitiveservices-speech-sdk": "^1.26.0", - "redis": "^3.1.2", + "ioredis": "^5.3.2", "undici": "^5.21.0" }, "devDependencies": { diff --git a/test/ibm.js b/test/ibm.js index a3a1218..15217a7 100644 --- a/test/ibm.js +++ b/test/ibm.js @@ -31,7 +31,7 @@ test('IBM - create access key', async(t) => { //console.log({obj}, 'received access token from IBM - second request'); t.ok(obj.access_token && obj.servedFromCache, 'successfully received access token from cache'); - await client.flushallAsync(); + await client.flushall(); t.end(); } catch (err) { @@ -65,7 +65,7 @@ test('IBM - retrieve tts voices test', async(t) => { t.ok(voices.length > 0 && voices[0].language, `GetVoices: successfully retrieved ${voices.length} voices from IBM`); - await client.flushallAsync(); + await client.flushall(); t.end(); diff --git a/test/list-voices.js b/test/list-voices.js index befd2b4..f27dc75 100644 --- a/test/list-voices.js +++ b/test/list-voices.js @@ -31,7 +31,7 @@ test('IBM - create access key', async(t) => { //console.log({obj}, 'received access token from IBM - second request'); t.ok(obj.access_token && obj.servedFromCache, 'successfully received access token from cache'); - await client.flushallAsync(); + await client.flushall(); t.end(); } catch (err) { @@ -65,7 +65,7 @@ test('IBM - retrieve tts voices test', async(t) => { t.ok(voices.length > 0 && voices[0].language, `GetVoices: successfully retrieved ${voices.length} voices from IBM`); - await client.flushallAsync(); + await client.flushall(); t.end(); @@ -99,7 +99,7 @@ test('Nuance hosted tests', async(t) => { t.ok(voices.length > 0 && voices[0].language, `GetVoices: successfully retrieved ${voices.length} voices from Nuance`); - await client.flushallAsync(); + await client.flushall(); t.end(); @@ -132,7 +132,7 @@ test('Nuance on-prem tests', async(t) => { t.ok(voices.length > 0 && voices[0].language, `GetVoices: successfully retrieved ${voices.length} voices from Nuance`); - await client.flushallAsync(); + await client.flushall(); t.end(); @@ -162,7 +162,7 @@ test('Google tests', async(t) => { let result = await getTtsVoices(opts); t.ok(result[0].voices.length > 0, `GetVoices: successfully retrieved ${result[0].voices.length} voices from Google`); - await client.flushallAsync(); + await client.flushall(); t.end(); } @@ -193,7 +193,7 @@ test('AWS tests', async(t) => { let result = await getTtsVoices(opts); t.ok(result?.Voices?.length > 0, `GetVoices: successfully retrieved ${result.Voices.length} voices from AWS`); - await client.flushallAsync(); + await client.flushall(); t.end(); } diff --git a/test/nuance.js b/test/nuance.js index 299b504..5735df9 100644 --- a/test/nuance.js +++ b/test/nuance.js @@ -34,7 +34,7 @@ test('Nuance hosted tests', async(t) => { t.ok(voices.length > 0 && voices[0].language, `GetVoices: successfully retrieved ${voices.length} voices from Nuance`); - await client.flushallAsync(); + await client.flushall(); t.end(); @@ -67,7 +67,7 @@ test('Nuance on-prem tests', async(t) => { t.ok(voices.length > 0 && voices[0].language, `GetVoices: successfully retrieved ${voices.length} voices from Nuance`); - await client.flushallAsync(); + await client.flushall(); t.end(); diff --git a/test/synth.js b/test/synth.js index 2fb412d..a536751 100644 --- a/test/synth.js +++ b/test/synth.js @@ -413,18 +413,21 @@ test('Custom Vendor speech synth tests', async(t) => { test('TTS Cache tests', async(t) => { const fn = require('..'); - const {purgeTtsCache, client} = fn(opts, logger); + const {purgeTtsCache, getTtsSize, client} = fn(opts, logger); try { // save some random tts keys to cache const minRecords = 8; for (const i in Array(minRecords).fill(0)) { - await client.setAsync(makeSynthKey({vendor: i, language: i, voice: i, engine: i, text: i}), i); + await client.set(makeSynthKey({vendor: i, language: i, voice: i, engine: i, text: i}), i); } + const count = await getTtsSize(); + t.ok(count >= minRecords, 'getTtsSize worked.'); + const {purgedCount} = await purgeTtsCache(); t.ok(purgedCount >= minRecords, `successfully purged at least ${minRecords} tts records from cache`); - const cached = (await client.keysAsync('tts:*')).length; + const cached = (await client.keys('tts:*')).length; t.equal(cached, 0, `successfully purged all tts records from cache`); } catch (err) { @@ -435,11 +438,11 @@ test('TTS Cache tests', async(t) => { try { // save some random tts keys to cache for (const i in Array(10).fill(0)) { - await client.setAsync(makeSynthKey({vendor: i, language: i, voice: i, engine: i, text: i}), i); + await client.set(makeSynthKey({vendor: i, language: i, voice: i, engine: i, text: i}), i); } // save a specific key to tts cache const opts = {vendor: 'aws', language: 'en-US', voice: 'MALE', engine: 'Engine', text: 'Hello World!'}; - await client.setAsync(makeSynthKey(opts), opts.text); + await client.set(makeSynthKey(opts), opts.text); const {purgedCount} = await purgeTtsCache({all: false, ...opts}); t.ok(purgedCount === 1, `successfully purged one specific tts record from cache`); @@ -455,7 +458,7 @@ test('TTS Cache tests', async(t) => { t.ok(error, `error returned when specified key was not found`); // make sure other tts keys are still there - const cached = (await client.keysAsync('tts:*')).length; + const cached = (await client.keys('tts:*')).length; t.ok(cached >= 1, `successfully kept all non-specified tts records in cache`); } catch (err) { @@ -471,21 +474,21 @@ test('TTS Cache tests', async(t) => { const account_sid = "12412512_cabc_5aff" const account_sid2 = "22412512_cabc_5aff" for (const i in Array(minRecords).fill(0)) { - await client.setAsync(makeSynthKey({account_sid, vendor: i, language: i, voice: i, engine: i, text: i}), i); + await client.set(makeSynthKey({account_sid, vendor: i, language: i, voice: i, engine: i, text: i}), i); } for (const i in Array(minRecords).fill(0)) { - await client.setAsync(makeSynthKey({account_sid: account_sid2, vendor: i, language: i, voice: i, engine: i, text: i}), i); + await client.set(makeSynthKey({account_sid: account_sid2, vendor: i, language: i, voice: i, engine: i, text: i}), i); } const {purgedCount} = await purgeTtsCache({account_sid}); t.equal(purgedCount, minRecords, `successfully purged at least ${minRecords} tts records from cache for account_sid:${account_sid}`); - let cached = (await client.keysAsync('tts:*')).length; + let cached = (await client.keys('tts:*')).length; t.equal(cached, minRecords, `successfully purged all tts records from cache for account_sid:${account_sid}`); const {purgedCount: purgedCount2} = await purgeTtsCache({account_sid: account_sid2}); t.equal(purgedCount2, minRecords, `successfully purged at least ${minRecords} tts records from cache for account_sid:${account_sid2}`); - cached = (await client.keysAsync('tts:*')).length; + cached = (await client.keys('tts:*')).length; t.equal(cached, 0, `successfully purged all tts records from cache`); } catch (err) {