diff --git a/app.js b/app.js
index 2840f59..799e635 100644
--- a/app.js
+++ b/app.js
@@ -10,21 +10,18 @@ const morgan = require('morgan')
// const fileUpload = require('express-fileupload')
const rateLimiter = require('express-rate-limit')
-const helmet = require('helmet')
-const xss = require('xss-clean')
-const cors = require('cors')
// Swagger
const swaggerUI = require('swagger-ui-express')
const YAML = require('yamljs')
-const swaggerDocument = YAML.load('./swagger.yaml')
-
-// database
-const connectDB = require('./db/connect')
+const swaggerDocument = YAML.load('./swagger.yaml')
+const helmet = require('helmet')
+const xss = require('xss-clean')
+const cors = require('cors')
+
// routers
-const nlRouter = require('./routes/naturalLanguageRoute')
-
+const nlRouter = require('./routes/naturalLanguageRoute')
const notFoundMiddlware = require('./middleware/not-found')
const errorHandlerMiddleware = require('./middleware/error-handler')
@@ -35,7 +32,7 @@ app.use(rateLimiter({
windowMs: 15 * 60 * 1000,
max: 60,
}))
-
+
// Security packages
app.use(helmet())
app.use(cors())
@@ -43,17 +40,15 @@ app.use(xss())
app.use(morgan('tiny'))
app.use(express.json())
-
-// app.use(express.static('./public'))
+
// app.use(fileUpload())
-
app.get('/', (req, res) => {
res.send('
Sentiment API
Documentation')
-})
+})
app.use('/api-docs', swaggerUI.serve, swaggerUI.setup(swaggerDocument))
-
+
app.use('/api/v1/nl', nlRouter)
app.use(notFoundMiddlware)
diff --git a/controllers/naturalLanguageController.js b/controllers/naturalLanguageController.js
index 95049e9..ada6b74 100644
--- a/controllers/naturalLanguageController.js
+++ b/controllers/naturalLanguageController.js
@@ -1,8 +1,16 @@
const { StatusCodes } = require("http-status-codes")
-const { sentiment, convertTextToSpeech, listVoice } = require("../utils")
+const { sentiment, convertTextToSpeech, listVoice, convertAudioToLinear16, getAudioDuration } = require("../utils")
const language = require('@google-cloud/language').v2
const CustomError = require('../errors')
-const voiceConfigList = require('../mockData/voice.json')
+const voiceConfigList = require('../mockData/voice.json')
+const languageCodes = require('../mockData/languageCodes.json')
+const path = require('path')
+const fs = require('fs')
+const speech = require('@google-cloud/speech')
+const { speechToText, speechToTextJob } = require('../utils')
+const client = new speech.SpeechClient()
+const protobuf = require('protobufjs')
+
const getSentiment = async (req, res) => {
@@ -16,7 +24,7 @@ const getSentiment = async (req, res) => {
const getAudioFromText = async (req, res) => {
const { text, voice_name, voice_gender, languageCode } = req.query
-
+
if ((voice_name || voice_gender || languageCode) && languageCode == 'pt-BR') {
const config = { voice_name, voice_gender, languageCode }
@@ -39,18 +47,16 @@ const getAudioFromText = async (req, res) => {
const audioBuffer = await convertTextToSpeech(text, voice_name, voice_gender, languageCode)
- if (voice_name && voice_gender && languageCode){
+ if (voice_name && voice_gender && languageCode) {
filename = `${voice_name}_${voice_gender}_${languageCode}.mp3`
}
- else{
+ else {
filename = `pt-BR-Standard-B_MALE_pt-BR.mp3`
}
-
+
// Set the Content-Disposition header
// res.set("Content-Disposition", `attachment; filename="${filename}"`);
- res.set("Content-Disposition", `inline; filename="${filename}"`);
-
-
+ res.set("Content-Disposition", `inline; filename="${filename}"`)
res.contentType('audio/mpeg')
@@ -58,6 +64,134 @@ const getAudioFromText = async (req, res) => {
}
+const getTextFromAudio = async (req, res) => {
+
+ const { languageCode } = req.body
+
+ const audio = req.file
+
+ if (!audio)
+ throw new CustomError.BadRequestError(`Missing the audio file`)
+
+ if (languageCode) {
+ const existLanguageCode = languageCodes.find(l => l.languageCode == languageCode)
+
+ if (!existLanguageCode) {
+ fs.unlinkSync(audio.path)
+ throw new CustomError.BadRequestError(`Invalid language code`)
+ }
+
+ }
+ const inputFile = path.resolve(audio.path)
+
+ const fileName = path.basename(inputFile, path.extname(inputFile))
+
+ const outputFile = path.join(__dirname, '..', 'public', 'uploads', `${fileName}.wav`)
+
+ const filePath = await convertAudioToLinear16(inputFile, outputFile)
+
+ fs.unlinkSync(inputFile)
+
+ const obj = await speechToText(filePath, languageCode)
+
+ fs.unlinkSync(filePath)
+
+ if (obj?.transcription) return res.status(StatusCodes.OK).json({ transcription: obj.transcription })
+
+ res.status(obj.status).json({ msg: obj.msg })
+
+}
+
+const uploadAudioToTranscript = async (req, res) => {
+
+ const { languageCode } = req.body
+
+ const audio = req.file
+
+ if (!audio)
+ throw new CustomError.BadRequestError(`Missing the audio file`)
+
+ if (languageCode) {
+ const existLanguageCode = languageCodes.find(l => l.languageCode == languageCode)
+
+ if (!existLanguageCode) {
+ fs.unlinkSync(audio.path)
+ throw new CustomError.BadRequestError(`Invalid language code`)
+ }
+
+ }
+
+ const inputFile = path.resolve(audio.path)
+
+ const fileName = path.basename(inputFile, path.extname(inputFile))
+
+ const outputFile = path.join(__dirname, '..', 'public', 'uploads', `${fileName}.wav`)
+
+ const filePath = await convertAudioToLinear16(inputFile, outputFile)
+
+ fs.unlinkSync(inputFile)
+
+ const obj = await speechToTextJob(filePath, languageCode)
+
+ fs.unlinkSync(filePath)
+
+ if (obj?.operationName) return res.status(StatusCodes.OK).json({ operationId: obj.operationName })
+
+ res.status(obj.status).json({ msg: obj.msg })
+}
+
+const getJobStatus = async (req, res) => {
+
+ const { operationName } = req.query
+
+ if (!operationName)
+ throw new CustomError.BadRequestError(`Missing operationName query parameter`)
+
+ // Get the operation using the operationName
+ const [response] = await client.getOperation({ name: operationName })
+
+ if (!response) {
+ return res.status(404).json({ msg: "Operation not found" })
+ }
+
+ if (response.done) {
+
+ // Load the protobuf message types
+ const root = new protobuf.Root()
+ root.loadSync(path.join(__dirname, '..', 'node_modules', 'google-proto-files', 'google', 'rpc', 'status.proto'), { keepCase: true })
+ root.loadSync(path.join(__dirname, '..', 'node_modules', 'google-proto-files', 'google', 'protobuf', 'duration.proto'), { keepCase: true })
+ root.loadSync(path.join(__dirname, '..', 'node_modules', 'google-proto-files', 'google', 'cloud', 'speech', 'v1', 'cloud_speech.proto'), { keepCase: true })
+
+ // Get the message type
+ const LongRunningRecognizeResponse = root.lookupType('google.cloud.speech.v1.LongRunningRecognizeResponse')
+
+ if (!response) {
+ return res.status(StatusCodes.NOT_FOUND).json({ msg: "Operation not found" })
+ }
+
+ // Decode the response value to get transcribed text
+ const longRunningResponse = LongRunningRecognizeResponse.decode(response.response.value)
+ if (longRunningResponse.error) {
+ console.error('Error:', longRunningResponse.error)
+ res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ msg: longRunningResponse.error })
+ } else {
+
+ const transcriptions = longRunningResponse.results.map(result => result.alternatives[0].transcript)
+
+ const fullTranscription = transcriptions.join(' ')
+
+ // console.log('Full Transcription:', fullTranscription)
+
+ res.status(StatusCodes.OK).json({ transcription: fullTranscription })
+
+ }
+
+ } else {
+ res.status(StatusCodes.ACCEPTED).json({ msg: "Transcription in progress" })
+ }
+
+}
+
const getVoiceConfig = async (req, res) => {
const { languageCode } = req.query
@@ -72,5 +206,8 @@ const getVoiceConfig = async (req, res) => {
module.exports = {
getSentiment,
getAudioFromText,
- getVoiceConfig
+ getTextFromAudio,
+ getVoiceConfig,
+ getJobStatus,
+ uploadAudioToTranscript
}
\ No newline at end of file
diff --git a/mockData/languageCodes.json b/mockData/languageCodes.json
new file mode 100644
index 0000000..30ab822
--- /dev/null
+++ b/mockData/languageCodes.json
@@ -0,0 +1,59 @@
+[
+ { "languageCode": "af-ZA" },
+ { "languageCode": "ar-XA" },
+ { "languageCode": "bg-BG" },
+ { "languageCode": "bn-IN" },
+ { "languageCode": "ca-ES" },
+ { "languageCode": "cmn-CN" },
+ { "languageCode": "cmn-TW" },
+ { "languageCode": "cs-CZ" },
+ { "languageCode": "da-DK" },
+ { "languageCode": "de-DE" },
+ { "languageCode": "el-GR" },
+ { "languageCode": "en-AU" },
+ { "languageCode": "en-GB" },
+ { "languageCode": "en-IN" },
+ { "languageCode": "en-US" },
+ { "languageCode": "es-ES" },
+ { "languageCode": "es-US" },
+ { "languageCode": "eu-ES" },
+ { "languageCode": "fi-FI" },
+ { "languageCode": "fil-PH" },
+ { "languageCode": "fr-CA" },
+ { "languageCode": "fr-FR" },
+ { "languageCode": "gl-ES" },
+ { "languageCode": "gu-IN" },
+ { "languageCode": "he-IL" },
+ { "languageCode": "hi-IN" },
+ { "languageCode": "hu-HU" },
+ { "languageCode": "id-ID" },
+ { "languageCode": "is-IS" },
+ { "languageCode": "it-IT" },
+ { "languageCode": "ja-JP" },
+ { "languageCode": "kn-IN" },
+ { "languageCode": "ko-KR" },
+ { "languageCode": "lt-LT" },
+ { "languageCode": "lv-LV" },
+ { "languageCode": "ml-IN" },
+ { "languageCode": "mr-IN" },
+ { "languageCode": "ms-MY" },
+ { "languageCode": "nb-NO" },
+ { "languageCode": "nl-BE" },
+ { "languageCode": "nl-NL" },
+ { "languageCode": "pa-IN" },
+ { "languageCode": "pl-PL" },
+ { "languageCode": "pt-BR" },
+ { "languageCode": "pt-PT" },
+ { "languageCode": "ro-RO" },
+ { "languageCode": "ru-RU" },
+ { "languageCode": "sk-SK" },
+ { "languageCode": "sr-RS" },
+ { "languageCode": "sv-SE" },
+ { "languageCode": "ta-IN" },
+ { "languageCode": "te-IN" },
+ { "languageCode": "th-TH" },
+ { "languageCode": "tr-TR" },
+ { "languageCode": "uk-UA" },
+ { "languageCode": "vi-VN" },
+ { "languageCode": "yue-HK" }
+]
diff --git a/package-lock.json b/package-lock.json
index 8636b27..bb3490b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,8 @@
"license": "ISC",
"dependencies": {
"@google-cloud/language": "^6.1.0",
+ "@google-cloud/speech": "^6.0.2",
+ "@google-cloud/storage": "^7.4.0",
"@google-cloud/text-to-speech": "^5.0.1",
"bcryptjs": "^2.4.3",
"cookie-parser": "^1.4.5",
@@ -20,11 +22,17 @@
"express-fileupload": "^1.2.1",
"express-mongo-sanitize": "^2.1.0",
"express-rate-limit": "^5.4.1",
+ "fluent-ffmpeg": "^2.1.2",
+ "google-gax": "^4.0.5",
+ "google-proto-files": "^4.0.0",
+ "google-protobuf": "^3.21.2",
"helmet": "^4.6.0",
"http-status-codes": "^2.1.4",
"joi": "^17.4.0",
"mongoose": "^7.3.1",
"morgan": "^1.10.0",
+ "multer": "^1.4.5-lts.1",
+ "protobufjs": "^7.2.5",
"swagger-ui-express": "^4.1.6",
"validator": "^13.6.0",
"xss-clean": "^0.1.1",
@@ -539,6 +547,33 @@
"node": ">=12"
}
},
+ "node_modules/@google-cloud/common": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.1.tgz",
+ "integrity": "sha512-7NBC5vD0au75nkctVs2vEGpdUPFs1BaHTMpeI+RVEgQSMe5/wEU6dx9p0fmZA0bj4HgdpobMKeegOcLUiEoxng==",
+ "dependencies": {
+ "@google-cloud/projectify": "^4.0.0",
+ "@google-cloud/promisify": "^4.0.0",
+ "arrify": "^2.0.1",
+ "duplexify": "^4.1.1",
+ "ent": "^2.2.0",
+ "extend": "^3.0.2",
+ "google-auth-library": "^9.0.0",
+ "retry-request": "^7.0.0",
+ "teeny-request": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@google-cloud/common/node_modules/arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/@google-cloud/language": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@google-cloud/language/-/language-6.1.0.tgz",
@@ -550,6 +585,104 @@
"node": ">=14.0.0"
}
},
+ "node_modules/@google-cloud/paginator": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz",
+ "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==",
+ "dependencies": {
+ "arrify": "^2.0.0",
+ "extend": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@google-cloud/paginator/node_modules/arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@google-cloud/projectify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz",
+ "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@google-cloud/promisify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz",
+ "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@google-cloud/speech": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@google-cloud/speech/-/speech-6.0.2.tgz",
+ "integrity": "sha512-wMMsGGa0gUNVL9iIC9UOcQbmr6g3j18youpI9CtCVejXxEY51AAcjvalT+KalFhJta96TfwL9rjOWyXVxgTjQw==",
+ "dependencies": {
+ "@google-cloud/common": "^5.0.0",
+ "@types/pumpify": "^1.4.1",
+ "google-gax": "^4.0.3",
+ "pumpify": "^2.0.0",
+ "stream-events": "^1.0.4",
+ "uuid": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@google-cloud/storage": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.5.0.tgz",
+ "integrity": "sha512-IKrep5++7tOacx7QsrucGkhlKEk3Lb68bj0rCLOK+CUCM4pXKJQsOkIKfvCmMnpbPfx8x4wa52yJtNeP7/MMSQ==",
+ "dependencies": {
+ "@google-cloud/paginator": "^5.0.0",
+ "@google-cloud/projectify": "^4.0.0",
+ "@google-cloud/promisify": "^4.0.0",
+ "abort-controller": "^3.0.0",
+ "async-retry": "^1.3.3",
+ "compressible": "^2.0.12",
+ "duplexify": "^4.0.0",
+ "ent": "^2.2.0",
+ "fast-xml-parser": "^4.3.0",
+ "gaxios": "^6.0.2",
+ "google-auth-library": "^9.0.0",
+ "mime": "^3.0.0",
+ "mime-types": "^2.0.8",
+ "p-limit": "^3.0.1",
+ "retry-request": "^7.0.0",
+ "teeny-request": "^9.0.0",
+ "uuid": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@google-cloud/storage/node_modules/mime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@google-cloud/storage/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/@google-cloud/text-to-speech": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/@google-cloud/text-to-speech/-/text-to-speech-5.0.1.tgz",
@@ -562,9 +695,9 @@
}
},
"node_modules/@grpc/grpc-js": {
- "version": "1.9.5",
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.5.tgz",
- "integrity": "sha512-iouYNlPxRAwZ2XboDT+OfRKHuaKHiqjB5VFYZ0NFrHkbEF+AV3muIUY9olQsp8uxU4VvRCMiRk9ftzFDGb61aw==",
+ "version": "1.9.9",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.9.tgz",
+ "integrity": "sha512-vQ1qwi/Kiyprt+uhb1+rHMpyk4CVRMTGNUGGPRGS7pLNfWkdCHrGEnT6T3/JyC2VZgoOX/X1KwdoU0WYQAeYcQ==",
"dependencies": {
"@grpc/proto-loader": "^0.7.8",
"@types/node": ">=12.12.47"
@@ -721,6 +854,14 @@
"node": ">=6"
}
},
+ "node_modules/@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
@@ -745,6 +886,19 @@
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
"dev": true
},
+ "node_modules/@types/caseless": {
+ "version": "0.12.4",
+ "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.4.tgz",
+ "integrity": "sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g=="
+ },
+ "node_modules/@types/duplexify": {
+ "version": "3.6.3",
+ "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.3.tgz",
+ "integrity": "sha512-KE0Yb3JraglJMB53+A/RMXbd9w//pQfiSqkrsoAxKcNOEIe1EHfEgbvoi2lkk2AvhhJtplugJSB2Mptc3DZMNA==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/long": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
@@ -767,6 +921,31 @@
"integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==",
"dev": true
},
+ "node_modules/@types/pumpify": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@types/pumpify/-/pumpify-1.4.3.tgz",
+ "integrity": "sha512-ie6+WgKnjXYFA37OdIfI72b+RSQ4lIlOwcp38SYr16xJo6qOGAovvVR4j2UuBohgkAGiYWRwMNCfxdRGQloEyw==",
+ "dependencies": {
+ "@types/duplexify": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/request": {
+ "version": "2.48.11",
+ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.11.tgz",
+ "integrity": "sha512-HuihY1+Vss5RS9ZHzRyTGIzwPTdrJBkCm/mAeLRYrOQu/MGqyezKXWOK1VhCnR+SDbp9G2mRUP+OVEqCrzpcfA==",
+ "dependencies": {
+ "@types/caseless": "*",
+ "@types/node": "*",
+ "@types/tough-cookie": "*",
+ "form-data": "^2.5.0"
+ }
+ },
+ "node_modules/@types/tough-cookie": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.4.tgz",
+ "integrity": "sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A=="
+ },
"node_modules/@types/webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
@@ -973,6 +1152,11 @@
"node": ">= 8"
}
},
+ "node_modules/append-field": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
+ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
+ },
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -1005,6 +1189,24 @@
"node": ">=0.10.0"
}
},
+ "node_modules/async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "node_modules/async-retry": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
+ "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
+ "dependencies": {
+ "retry": "0.13.1"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1138,6 +1340,11 @@
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
},
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
"node_modules/busboy": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz",
@@ -1345,6 +1552,17 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/compare-func": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
@@ -1355,11 +1573,58 @@
"dot-prop": "^5.1.0"
}
},
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/concat-stream/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/concat-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
"node_modules/configstore": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
@@ -1463,6 +1728,11 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
"node_modules/cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
@@ -1623,6 +1893,14 @@
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
"dev": true
},
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -1727,6 +2005,11 @@
"once": "^1.4.0"
}
},
+ "node_modules/ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA=="
+ },
"node_modules/error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -1901,6 +2184,27 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
+ "node_modules/fast-xml-parser": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz",
+ "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/naturalintelligence"
+ }
+ ],
+ "dependencies": {
+ "strnum": "^1.0.5"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -1946,6 +2250,42 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/fluent-ffmpeg": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz",
+ "integrity": "sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==",
+ "dependencies": {
+ "async": ">=0.2.9",
+ "which": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/fluent-ffmpeg/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -2110,11 +2450,11 @@
}
},
"node_modules/google-gax": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.0.4.tgz",
- "integrity": "sha512-Yoey/ABON2HaTUIRUt5tTQAvwQ6E/2etSyFXwHNVcYtIiYDpKix7G4oorZdkp17gFiYovzRCRhRZYrfdCgRK9Q==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.0.5.tgz",
+ "integrity": "sha512-yLoYtp4zE+8OQA74oBEbNkbzI6c95W01JSL7RqC8XERKpRvj3ytZp1dgnbA6G9aRsc8pZB25xWYBcCmrbYOEhA==",
"dependencies": {
- "@grpc/grpc-js": "~1.9.0",
+ "@grpc/grpc-js": "~1.9.6",
"@grpc/proto-loader": "^0.7.0",
"@types/long": "^4.0.0",
"abort-controller": "^3.0.0",
@@ -2124,12 +2464,29 @@
"object-hash": "^3.0.0",
"proto3-json-serializer": "^2.0.0",
"protobufjs": "7.2.5",
- "retry-request": "^6.0.0"
+ "retry-request": "^7.0.0"
},
"engines": {
"node": ">=14"
}
},
+ "node_modules/google-proto-files": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-4.0.0.tgz",
+ "integrity": "sha512-SMzJqJkuwJ50ON15+UBF6KQWHNqnJZzlDGPq5Z6xgAFiQTlfXFVBiyFjz5jd4RHWWAsyEE6KGUMy3txul5dUsA==",
+ "dependencies": {
+ "protobufjs": "^7.0.0",
+ "walkdir": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/google-protobuf": {
+ "version": "3.21.2",
+ "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz",
+ "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA=="
+ },
"node_modules/got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
@@ -2247,6 +2604,51 @@
"node": ">= 0.6"
}
},
+ "node_modules/http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "dependencies": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http-proxy-agent/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/http-proxy-agent/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
"node_modules/http-status-codes": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.1.4.tgz",
@@ -2578,11 +2980,15 @@
"integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
"dev": true
},
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
},
"node_modules/joi": {
"version": "17.4.0",
@@ -3038,7 +3444,6 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -3057,6 +3462,17 @@
"node": ">= 6"
}
},
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
"node_modules/mongodb": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.6.0.tgz",
@@ -3192,6 +3608,42 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
+ "node_modules/multer": {
+ "version": "1.4.5-lts.1",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
+ "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
+ "dependencies": {
+ "append-field": "^1.0.0",
+ "busboy": "^1.0.0",
+ "concat-stream": "^1.5.2",
+ "mkdirp": "^0.5.4",
+ "object-assign": "^4.1.1",
+ "type-is": "^1.6.4",
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/multer/node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/multer/node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
"node_modules/negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
@@ -3428,7 +3880,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
"dependencies": {
"yocto-queue": "^0.1.0"
},
@@ -3592,6 +4043,11 @@
"node": ">=4"
}
},
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
"node_modules/proto3-json-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.0.tgz",
@@ -3648,12 +4104,21 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
+ "node_modules/pumpify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz",
+ "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==",
+ "dependencies": {
+ "duplexify": "^4.1.1",
+ "inherits": "^2.0.3",
+ "pump": "^3.0.0"
+ }
+ },
"node_modules/punycode": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
@@ -3977,13 +4442,23 @@
"lowercase-keys": "^1.0.0"
}
},
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/retry-request": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-6.0.0.tgz",
- "integrity": "sha512-24kaFMd3wCnT3n4uPnsQh90ZSV8OISpfTFXJ00Wi+/oD2OPrp63EQ8hznk6rhxdlpwx2QBhQSDz2Fg46ki852g==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.1.tgz",
+ "integrity": "sha512-ZI6vJp9rfB71mrZpw+n9p/B6HCsd7QJlSEQftZ+xfJzr3cQ9EPGKw1FF0BnViJ0fYREX6FhymBD2CARpmsFciQ==",
"dependencies": {
+ "@types/request": "^2.48.8",
"debug": "^4.1.1",
- "extend": "^3.0.2"
+ "extend": "^3.0.2",
+ "teeny-request": "^9.0.0"
},
"engines": {
"node": ">=14"
@@ -4226,6 +4701,14 @@
"node": ">= 0.6"
}
},
+ "node_modules/stream-events": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
+ "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==",
+ "dependencies": {
+ "stubs": "^3.0.0"
+ }
+ },
"node_modules/stream-shift": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
@@ -4320,6 +4803,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
+ },
+ "node_modules/stubs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz",
+ "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw=="
+ },
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -4363,6 +4856,65 @@
"express": ">=4.0.0 || >=5.0.0-beta"
}
},
+ "node_modules/teeny-request": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
+ "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
+ "dependencies": {
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "node-fetch": "^2.6.9",
+ "stream-events": "^1.0.5",
+ "uuid": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/teeny-request/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/teeny-request/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/teeny-request/node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/teeny-request/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
"node_modules/term-size": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
@@ -4524,6 +5076,11 @@
"node": ">= 0.6"
}
},
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ },
"node_modules/typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
@@ -4645,6 +5202,18 @@
"node": ">= 0.4.0"
}
},
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
@@ -4677,6 +5246,14 @@
"node": ">= 0.8"
}
},
+ "node_modules/walkdir": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
+ "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
@@ -4779,6 +5356,14 @@
"resolved": "https://registry.npmjs.org/xss-filters/-/xss-filters-1.2.6.tgz",
"integrity": "sha1-aLOQicsd/4udvIiUhIObL1B/XFU="
},
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -4851,7 +5436,6 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
"engines": {
"node": ">=10"
},
@@ -5255,6 +5839,29 @@
"@jridgewell/trace-mapping": "0.3.9"
}
},
+ "@google-cloud/common": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.1.tgz",
+ "integrity": "sha512-7NBC5vD0au75nkctVs2vEGpdUPFs1BaHTMpeI+RVEgQSMe5/wEU6dx9p0fmZA0bj4HgdpobMKeegOcLUiEoxng==",
+ "requires": {
+ "@google-cloud/projectify": "^4.0.0",
+ "@google-cloud/promisify": "^4.0.0",
+ "arrify": "^2.0.1",
+ "duplexify": "^4.1.1",
+ "ent": "^2.2.0",
+ "extend": "^3.0.2",
+ "google-auth-library": "^9.0.0",
+ "retry-request": "^7.0.0",
+ "teeny-request": "^9.0.0"
+ },
+ "dependencies": {
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="
+ }
+ }
+ },
"@google-cloud/language": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@google-cloud/language/-/language-6.1.0.tgz",
@@ -5263,6 +5870,81 @@
"google-gax": "^4.0.3"
}
},
+ "@google-cloud/paginator": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz",
+ "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==",
+ "requires": {
+ "arrify": "^2.0.0",
+ "extend": "^3.0.2"
+ },
+ "dependencies": {
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="
+ }
+ }
+ },
+ "@google-cloud/projectify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz",
+ "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA=="
+ },
+ "@google-cloud/promisify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz",
+ "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g=="
+ },
+ "@google-cloud/speech": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@google-cloud/speech/-/speech-6.0.2.tgz",
+ "integrity": "sha512-wMMsGGa0gUNVL9iIC9UOcQbmr6g3j18youpI9CtCVejXxEY51AAcjvalT+KalFhJta96TfwL9rjOWyXVxgTjQw==",
+ "requires": {
+ "@google-cloud/common": "^5.0.0",
+ "@types/pumpify": "^1.4.1",
+ "google-gax": "^4.0.3",
+ "pumpify": "^2.0.0",
+ "stream-events": "^1.0.4",
+ "uuid": "^9.0.0"
+ }
+ },
+ "@google-cloud/storage": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.5.0.tgz",
+ "integrity": "sha512-IKrep5++7tOacx7QsrucGkhlKEk3Lb68bj0rCLOK+CUCM4pXKJQsOkIKfvCmMnpbPfx8x4wa52yJtNeP7/MMSQ==",
+ "requires": {
+ "@google-cloud/paginator": "^5.0.0",
+ "@google-cloud/projectify": "^4.0.0",
+ "@google-cloud/promisify": "^4.0.0",
+ "abort-controller": "^3.0.0",
+ "async-retry": "^1.3.3",
+ "compressible": "^2.0.12",
+ "duplexify": "^4.0.0",
+ "ent": "^2.2.0",
+ "fast-xml-parser": "^4.3.0",
+ "gaxios": "^6.0.2",
+ "google-auth-library": "^9.0.0",
+ "mime": "^3.0.0",
+ "mime-types": "^2.0.8",
+ "p-limit": "^3.0.1",
+ "retry-request": "^7.0.0",
+ "teeny-request": "^9.0.0",
+ "uuid": "^8.0.0"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+ }
+ }
+ },
"@google-cloud/text-to-speech": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/@google-cloud/text-to-speech/-/text-to-speech-5.0.1.tgz",
@@ -5272,9 +5954,9 @@
}
},
"@grpc/grpc-js": {
- "version": "1.9.5",
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.5.tgz",
- "integrity": "sha512-iouYNlPxRAwZ2XboDT+OfRKHuaKHiqjB5VFYZ0NFrHkbEF+AV3muIUY9olQsp8uxU4VvRCMiRk9ftzFDGb61aw==",
+ "version": "1.9.9",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.9.tgz",
+ "integrity": "sha512-vQ1qwi/Kiyprt+uhb1+rHMpyk4CVRMTGNUGGPRGS7pLNfWkdCHrGEnT6T3/JyC2VZgoOX/X1KwdoU0WYQAeYcQ==",
"requires": {
"@grpc/proto-loader": "^0.7.8",
"@types/node": ">=12.12.47"
@@ -5413,6 +6095,11 @@
"defer-to-connect": "^1.0.1"
}
},
+ "@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="
+ },
"@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
@@ -5437,6 +6124,19 @@
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
"dev": true
},
+ "@types/caseless": {
+ "version": "0.12.4",
+ "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.4.tgz",
+ "integrity": "sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g=="
+ },
+ "@types/duplexify": {
+ "version": "3.6.3",
+ "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.3.tgz",
+ "integrity": "sha512-KE0Yb3JraglJMB53+A/RMXbd9w//pQfiSqkrsoAxKcNOEIe1EHfEgbvoi2lkk2AvhhJtplugJSB2Mptc3DZMNA==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
"@types/long": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
@@ -5459,6 +6159,31 @@
"integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==",
"dev": true
},
+ "@types/pumpify": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@types/pumpify/-/pumpify-1.4.3.tgz",
+ "integrity": "sha512-ie6+WgKnjXYFA37OdIfI72b+RSQ4lIlOwcp38SYr16xJo6qOGAovvVR4j2UuBohgkAGiYWRwMNCfxdRGQloEyw==",
+ "requires": {
+ "@types/duplexify": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/request": {
+ "version": "2.48.11",
+ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.11.tgz",
+ "integrity": "sha512-HuihY1+Vss5RS9ZHzRyTGIzwPTdrJBkCm/mAeLRYrOQu/MGqyezKXWOK1VhCnR+SDbp9G2mRUP+OVEqCrzpcfA==",
+ "requires": {
+ "@types/caseless": "*",
+ "@types/node": "*",
+ "@types/tough-cookie": "*",
+ "form-data": "^2.5.0"
+ }
+ },
+ "@types/tough-cookie": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.4.tgz",
+ "integrity": "sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A=="
+ },
"@types/webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
@@ -5615,6 +6340,11 @@
"picomatch": "^2.0.4"
}
},
+ "append-field": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
+ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
+ },
"arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -5644,6 +6374,24 @@
"integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
"dev": true
},
+ "async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "async-retry": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
+ "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
+ "requires": {
+ "retry": "0.13.1"
+ }
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -5739,6 +6487,11 @@
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
},
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
"busboy": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz",
@@ -5894,6 +6647,14 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
"compare-func": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
@@ -5904,11 +6665,54 @@
"dot-prop": "^5.1.0"
}
},
+ "compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "requires": {
+ "mime-db": ">= 1.43.0 < 2"
+ }
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
"configstore": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
@@ -5985,6 +6789,11 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
"cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
@@ -6094,6 +6903,11 @@
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
"dev": true
},
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -6180,6 +6994,11 @@
"once": "^1.4.0"
}
},
+ "ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA=="
+ },
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -6317,6 +7136,14 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
+ "fast-xml-parser": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz",
+ "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==",
+ "requires": {
+ "strnum": "^1.0.5"
+ }
+ },
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -6350,6 +7177,35 @@
"path-exists": "^4.0.0"
}
},
+ "fluent-ffmpeg": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz",
+ "integrity": "sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==",
+ "requires": {
+ "async": ">=0.2.9",
+ "which": "^1.1.1"
+ },
+ "dependencies": {
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -6469,11 +7325,11 @@
}
},
"google-gax": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.0.4.tgz",
- "integrity": "sha512-Yoey/ABON2HaTUIRUt5tTQAvwQ6E/2etSyFXwHNVcYtIiYDpKix7G4oorZdkp17gFiYovzRCRhRZYrfdCgRK9Q==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.0.5.tgz",
+ "integrity": "sha512-yLoYtp4zE+8OQA74oBEbNkbzI6c95W01JSL7RqC8XERKpRvj3ytZp1dgnbA6G9aRsc8pZB25xWYBcCmrbYOEhA==",
"requires": {
- "@grpc/grpc-js": "~1.9.0",
+ "@grpc/grpc-js": "~1.9.6",
"@grpc/proto-loader": "^0.7.0",
"@types/long": "^4.0.0",
"abort-controller": "^3.0.0",
@@ -6483,9 +7339,23 @@
"object-hash": "^3.0.0",
"proto3-json-serializer": "^2.0.0",
"protobufjs": "7.2.5",
- "retry-request": "^6.0.0"
+ "retry-request": "^7.0.0"
}
},
+ "google-proto-files": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-4.0.0.tgz",
+ "integrity": "sha512-SMzJqJkuwJ50ON15+UBF6KQWHNqnJZzlDGPq5Z6xgAFiQTlfXFVBiyFjz5jd4RHWWAsyEE6KGUMy3txul5dUsA==",
+ "requires": {
+ "protobufjs": "^7.0.0",
+ "walkdir": "^0.4.0"
+ }
+ },
+ "google-protobuf": {
+ "version": "3.21.2",
+ "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz",
+ "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA=="
+ },
"got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
@@ -6576,6 +7446,39 @@
"toidentifier": "1.0.0"
}
},
+ "http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "requires": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "requires": {
+ "debug": "4"
+ }
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
"http-status-codes": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.1.4.tgz",
@@ -6816,11 +7719,15 @@
"integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
"dev": true
},
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
},
"joi": {
"version": "17.4.0",
@@ -7184,8 +8091,7 @@
"minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
},
"minimist-options": {
"version": "4.1.0",
@@ -7198,6 +8104,14 @@
"kind-of": "^6.0.3"
}
},
+ "mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "requires": {
+ "minimist": "^1.2.6"
+ }
+ },
"mongodb": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.6.0.tgz",
@@ -7291,6 +8205,35 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
+ "multer": {
+ "version": "1.4.5-lts.1",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
+ "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
+ "requires": {
+ "append-field": "^1.0.0",
+ "busboy": "^1.0.0",
+ "concat-stream": "^1.5.2",
+ "mkdirp": "^0.5.4",
+ "object-assign": "^4.1.1",
+ "type-is": "^1.6.4",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "requires": {
+ "streamsearch": "^1.1.0"
+ }
+ },
+ "streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="
+ }
+ }
+ },
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
@@ -7463,7 +8406,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
"requires": {
"yocto-queue": "^0.1.0"
}
@@ -7575,6 +8517,11 @@
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
"dev": true
},
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
"proto3-json-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.0.tgz",
@@ -7621,12 +8568,21 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
"requires": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
+ "pumpify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz",
+ "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==",
+ "requires": {
+ "duplexify": "^4.1.1",
+ "inherits": "^2.0.3",
+ "pump": "^3.0.0"
+ }
+ },
"punycode": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
@@ -7872,13 +8828,20 @@
"lowercase-keys": "^1.0.0"
}
},
+ "retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="
+ },
"retry-request": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-6.0.0.tgz",
- "integrity": "sha512-24kaFMd3wCnT3n4uPnsQh90ZSV8OISpfTFXJ00Wi+/oD2OPrp63EQ8hznk6rhxdlpwx2QBhQSDz2Fg46ki852g==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.1.tgz",
+ "integrity": "sha512-ZI6vJp9rfB71mrZpw+n9p/B6HCsd7QJlSEQftZ+xfJzr3cQ9EPGKw1FF0BnViJ0fYREX6FhymBD2CARpmsFciQ==",
"requires": {
+ "@types/request": "^2.48.8",
"debug": "^4.1.1",
- "extend": "^3.0.2"
+ "extend": "^3.0.2",
+ "teeny-request": "^9.0.0"
},
"dependencies": {
"debug": {
@@ -8081,6 +9044,14 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
+ "stream-events": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
+ "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==",
+ "requires": {
+ "stubs": "^3.0.0"
+ }
+ },
"stream-shift": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
@@ -8145,6 +9116,16 @@
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true
},
+ "strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
+ },
+ "stubs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz",
+ "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw=="
+ },
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -8173,6 +9154,50 @@
"swagger-ui-dist": ">=4.11.0"
}
},
+ "teeny-request": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
+ "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
+ "requires": {
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "node-fetch": "^2.6.9",
+ "stream-events": "^1.0.5",
+ "uuid": "^9.0.0"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "requires": {
+ "debug": "4"
+ }
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
"term-size": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
@@ -8279,6 +9304,11 @@
"mime-types": "~2.1.24"
}
},
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ },
"typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
@@ -8372,6 +9402,11 @@
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
+ "uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="
+ },
"v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
@@ -8398,6 +9433,11 @@
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
+ "walkdir": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
+ "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ=="
+ },
"webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
@@ -8476,6 +9516,11 @@
"resolved": "https://registry.npmjs.org/xss-filters/-/xss-filters-1.2.6.tgz",
"integrity": "sha1-aLOQicsd/4udvIiUhIObL1B/XFU="
},
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -8533,8 +9578,7 @@
"yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
}
}
}
diff --git a/package.json b/package.json
index 5e9079e..32c6139 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,8 @@
"license": "ISC",
"dependencies": {
"@google-cloud/language": "^6.1.0",
+ "@google-cloud/speech": "^6.0.2",
+ "@google-cloud/storage": "^7.4.0",
"@google-cloud/text-to-speech": "^5.0.1",
"bcryptjs": "^2.4.3",
"cookie-parser": "^1.4.5",
@@ -21,14 +23,20 @@
"express-fileupload": "^1.2.1",
"express-mongo-sanitize": "^2.1.0",
"express-rate-limit": "^5.4.1",
+ "fluent-ffmpeg": "^2.1.2",
+ "google-gax": "^4.0.5",
+ "google-proto-files": "^4.0.0",
+ "google-protobuf": "^3.21.2",
"helmet": "^4.6.0",
"http-status-codes": "^2.1.4",
"joi": "^17.4.0",
"mongoose": "^7.3.1",
"morgan": "^1.10.0",
+ "multer": "^1.4.5-lts.1",
+ "protobufjs": "^7.2.5",
+ "swagger-ui-express": "^4.1.6",
"validator": "^13.6.0",
"xss-clean": "^0.1.1",
- "swagger-ui-express": "^4.1.6",
"yamljs": "^0.3.0"
},
"devDependencies": {
diff --git a/public/uploads/computer-5.jpeg b/public/uploads/computer-5.jpeg
deleted file mode 100644
index dff46c4..0000000
Binary files a/public/uploads/computer-5.jpeg and /dev/null differ
diff --git a/public/uploads/example.jpg b/public/uploads/example.jpg
deleted file mode 100644
index 3b53c80..0000000
Binary files a/public/uploads/example.jpg and /dev/null differ
diff --git a/routes/naturalLanguageRoute.js b/routes/naturalLanguageRoute.js
index 679b1c3..246f797 100644
--- a/routes/naturalLanguageRoute.js
+++ b/routes/naturalLanguageRoute.js
@@ -1,11 +1,14 @@
const express = require('express')
const router = express.Router()
const { authorization, } = require('../middleware/authentication')
-
-const { getSentiment, getAudioFromText, getVoiceConfig } = require('../controllers/naturalLanguageController')
+const { audioUpload } = require("../utils")
+const { getSentiment, getAudioFromText, getTextFromAudio, getVoiceConfig, uploadAudioToTranscript, getJobStatus } = require('../controllers/naturalLanguageController')
router.route('/sentiment').post(authorization, getSentiment)
router.route('/text-to-speech').get(getAudioFromText)
+router.route('/speech-to-text').post(audioUpload.single('audio'), getTextFromAudio)
+router.route('/upload-audio-to-transcript').post(audioUpload.single('audio'), uploadAudioToTranscript)
+router.route('/query-job-status').get(getJobStatus)
router.route('/voice-config').get(getVoiceConfig)
module.exports = router
diff --git a/swagger.yaml b/swagger.yaml
index 472dc04..f5ce5ae 100644
--- a/swagger.yaml
+++ b/swagger.yaml
@@ -2,6 +2,7 @@ openapi: 3.0.0
info:
title: Natural Language API
contact: {}
+ description: This API describes the endpoints and parameters to use resources from google cloud api.
version: '1.0'
servers:
- url: http://localhost:6001/api/v1/nl/
diff --git a/utils/audioUpload.js b/utils/audioUpload.js
new file mode 100644
index 0000000..3790fdd
--- /dev/null
+++ b/utils/audioUpload.js
@@ -0,0 +1,25 @@
+const multer = require('multer')
+const path = require('path')
+
+//Destination to store the file
+const audioStorage = multer.diskStorage({
+ destination: function (req, file, cb) {
+ cb(null, `public/uploads`)
+ },
+ filename: function (req, file, cb) {
+ cb(null, Date.now() + String(Math.floor(Math.random() * 1000)) + path.extname(file.originalname))
+ }
+})
+
+const audioUpload = multer({
+ storage: audioStorage,
+ fileFilter(req, file, cb) {
+ if (!file.originalname.match(/\.(mp3|wav|ogg|flac|aac|wma|m4a|mp4|webm|opus|mpeg)$/i)) {
+ return cb(new Error('Invalid file type. Send only an audio file!'))
+ }
+ cb(undefined, true)
+ }
+
+})
+
+module.exports = audioUpload
\ No newline at end of file
diff --git a/utils/audioUploadToBucket.js b/utils/audioUploadToBucket.js
new file mode 100644
index 0000000..6dc902e
--- /dev/null
+++ b/utils/audioUploadToBucket.js
@@ -0,0 +1,35 @@
+// Imports the Google Cloud client library
+const { Storage } = require('@google-cloud/storage')
+
+async function audioUploadToBucket(
+ bucketName,
+ filePath,
+ destFileName,
+) {
+ // [START storage_upload_file]
+
+ // Creates a client
+ const storage = new Storage()
+
+ async function uploadFile() {
+ const options = {
+ destination: destFileName,
+ }
+
+ await storage.bucket(bucketName).upload(filePath, options)
+ console.log(`${filePath} uploaded to ${bucketName}`)
+ }
+
+ try {
+ await uploadFile()
+ return true
+ } catch (error) {
+ console.error(error)
+ return false
+ }
+ // [END storage_upload_file]
+}
+
+
+
+module.exports = audioUploadToBucket
\ No newline at end of file
diff --git a/utils/convertAudioToLinear16.js b/utils/convertAudioToLinear16.js
new file mode 100644
index 0000000..7feaa38
--- /dev/null
+++ b/utils/convertAudioToLinear16.js
@@ -0,0 +1,16 @@
+const ffmpeg = require('fluent-ffmpeg')
+
+async function convertToLINEAR16(inputFile, outputFile) {
+ return new Promise((resolve, reject) => {
+ ffmpeg(inputFile)
+ .audioCodec('pcm_s16le') // Set the audio codec to LINEAR16
+ .audioFrequency(16000) // Set the sample rate to 16,000 Hz
+ .audioChannels(1)
+ .on('end', () => resolve(outputFile))
+ .on('error', (err) => reject(err))
+ .save(outputFile)
+ })
+}
+
+module.exports = convertToLINEAR16
+
\ No newline at end of file
diff --git a/utils/getAudioDuration.js b/utils/getAudioDuration.js
new file mode 100644
index 0000000..316e0d7
--- /dev/null
+++ b/utils/getAudioDuration.js
@@ -0,0 +1,17 @@
+const ffmpeg = require('fluent-ffmpeg')
+
+async function getAudioDuration(filePath) {
+ return new Promise((resolve, reject) => {
+ ffmpeg.ffprobe(filePath, (err, metadata) => {
+ if (err) {
+ reject(err)
+ } else {
+ resolve(Math.round(metadata.format.duration))
+ }
+ })
+ })
+}
+
+module.exports = getAudioDuration
+
+
diff --git a/utils/index.js b/utils/index.js
index b96e8e4..2bbec66 100644
--- a/utils/index.js
+++ b/utils/index.js
@@ -2,13 +2,24 @@
// const createTokenUser = require('./createTokenUser')
// const checkPermissions = require('./checkPermissions')
-const sentiment = require('./sentiment')
+const sentiment = require('./sentiment')
const convertTextToSpeech = require('./textToSpeech')
const listVoice = require('./listVoice')
+const convertAudioToLinear16 = require('./convertAudioToLinear16')
+const getAudioDuration = require('./getAudioDuration')
+const audioUploadToBucket = require('./audioUploadToBucket')
+const audioUpload = require('./audioUpload')
+const speechToText = require('./speechToText')
+const speechToTextJob = require('./speechToTextJob')
module.exports = {
- sentiment,
+ sentiment,
convertTextToSpeech,
- listVoice
+ listVoice,
+ convertAudioToLinear16,
+ getAudioDuration,
+ audioUploadToBucket,
+ audioUpload,
+ speechToText,
+ speechToTextJob
}
-
\ No newline at end of file
diff --git a/utils/speechToText.js b/utils/speechToText.js
new file mode 100644
index 0000000..2d93306
--- /dev/null
+++ b/utils/speechToText.js
@@ -0,0 +1,67 @@
+// Imports the Google Cloud client library
+const speech = require('@google-cloud/speech')
+const { StatusCodes } = require("http-status-codes")
+const path = require('path')
+const fs = require('fs')
+ const getAudioDuration = require('./getAudioDuration')
+const audioUploadToBucket = require('./audioUploadToBucket')
+
+async function speechToText(filename, languageCode = 'pt-Br', bucket = 'speect-to-text-bucket', sampleRateHertz = 16000, encoding = 'LINEAR16') {
+
+ const client = new speech.SpeechClient()
+
+ let audio
+
+ const config = {
+ encoding: encoding,
+ sampleRateHertz: sampleRateHertz,
+ languageCode: languageCode,
+ }
+
+ const seconds = await getAudioDuration(filename)
+
+ if (seconds >= 28800) {
+ return { msg: 'Audio file is higher than 480 minute', status: StatusCodes.BAD_REQUEST }
+ }
+ else if (seconds <= 59) {
+ audio = {
+ content: fs.readFileSync(filename).toString('base64'),
+ }
+ } else if (seconds >= 60) {
+ const uploaded = await audioUploadToBucket(bucket, filename, path.basename(filename))
+
+ if (uploaded) {
+ audio = {
+ uri: `gs://${bucket}/${path.basename(filename)}`,
+ }
+ }
+ }
+
+ if (!audio) return { msg: `Error on try upload the file to google cloud bucket(${bucket}) storage`, status: StatusCodes.INTERNAL_SERVER_ERROR }
+
+ const request = {
+ config: config,
+ audio: audio,
+ }
+
+ try {
+ // Detects speech in the audio file. This creates a recognition job that you
+ // can wait for now, or get its result later.
+ const [operation] = await client.longRunningRecognize(request)
+ // Get a Promise representation of the final result of the job
+ const [response] = await operation.promise()
+ const transcription = response.results
+ .map(result => result.alternatives[0].transcript)
+ .join('\n')
+ console.log(`Transcription: ${transcription}`)
+
+ return { msg: `Transcript success`, status: StatusCodes.OK, transcription }
+ } catch (error) {
+ console.log('ERROR ON TRY TRANSCRIPT: ', error)
+ return { msg: `Error on try transcript the file`, status: StatusCodes.INTERNAL_SERVER_ERROR }
+ }
+}
+
+module.exports = speechToText
+
+
diff --git a/utils/speechToTextJob.js b/utils/speechToTextJob.js
new file mode 100644
index 0000000..6b30563
--- /dev/null
+++ b/utils/speechToTextJob.js
@@ -0,0 +1,64 @@
+// Imports the Google Cloud client library
+const speech = require('@google-cloud/speech')
+const path = require('path')
+const fs = require('fs')
+const getAudioDuration = require('./getAudioDuration')
+const audioUploadToBucket = require('./audioUploadToBucket')
+const { StatusCodes } = require("http-status-codes")
+
+
+async function speechToTextJob(filename, languageCode = 'pt-Br', bucket = 'speect-to-text-bucket', sampleRateHertz = 16000, encoding = 'LINEAR16') {
+
+ const client = new speech.SpeechClient()
+
+ let audio
+
+ const config = {
+ encoding: encoding,
+ sampleRateHertz: sampleRateHertz,
+ languageCode: languageCode,
+ }
+
+ const seconds = await getAudioDuration(filename)
+
+ if (seconds >= 28800) {
+ return { msg: 'Audio file is higher than 480 minute', status: StatusCodes.BAD_REQUEST }
+ }
+ else if (seconds <= 59) {
+ audio = {
+ content: fs.readFileSync(filename).toString('base64'),
+ }
+ } else if (seconds >= 60) {
+ const uploaded = await audioUploadToBucket(bucket, filename, path.basename(filename))
+
+ if (uploaded) {
+ audio = {
+ uri: `gs://${bucket}/${path.basename(filename)}`,
+ }
+ }
+ }
+
+ if (!audio) return { msg: `Error on try upload the file to google cloud bucket(${bucket}) storage`, status: StatusCodes.INTERNAL_SERVER_ERROR }
+
+ const request = {
+ config: config,
+ audio: audio,
+ }
+
+ try {
+ // Detects speech in the audio file. This creates a recognition job that you
+ // can wait for now, or get its result later.
+ const [operation] = await client.longRunningRecognize(request)
+
+ console.log('===========> operationName: ', operation.name)
+
+ return { msg: `success`, status: StatusCodes.OK, operationName: operation.name }
+ } catch (error) {
+ console.log('ERROR ON TRY TRANSCRIPT: ', error)
+ return { msg: `Error on try transcript the file`, status: StatusCodes.INTERNAL_SERVER_ERROR }
+ }
+}
+
+module.exports = speechToTextJob
+
+