feat: fix cloud function for audio merge

This commit is contained in:
2026-03-03 15:13:39 +01:00
parent 7241d46937
commit 4755c0d8e2
4 changed files with 245 additions and 1524 deletions
-1359
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -5,7 +5,7 @@ const admin = require('firebase-admin')
admin.initializeApp() admin.initializeApp()
const db = admin.firestore() const db = admin.firestore()
const REGION = process.env.FIREBASE_REGION || 'europe-west1' const REGION = 'europe-west1'
exports.db = db exports.db = db
exports.REGION = REGION exports.REGION = REGION
+157 -131
View File
@@ -31,6 +31,13 @@
"node": "20" "node": "20"
} }
}, },
"node_modules/@cfworker/json-schema": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz",
"integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==",
"license": "MIT",
"optional": true
},
"node_modules/@colors/colors": { "node_modules/@colors/colors": {
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
@@ -359,12 +366,12 @@
} }
}, },
"node_modules/@genkit-ai/ai": { "node_modules/@genkit-ai/ai": {
"version": "1.27.0", "version": "1.29.0",
"resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.27.0.tgz", "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.29.0.tgz",
"integrity": "sha512-Vogp21a0pBgL7UsdHj1Jm79PjrQdLNRK5dZT05Xvr3f7GwCNMv0k6Olxp+qrgwLi6DbRsVPi7c+wcldekMlLFQ==", "integrity": "sha512-a5rc3b6xyOk1e0q8uFjN6PrBAELLfILuLs8y2ozwe4daNjwx3DUfgWdHAr7zDxsAzZfTyCxDwuaOetd8fdJ/eQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@genkit-ai/core": "1.27.0", "@genkit-ai/core": "1.29.0",
"@opentelemetry/api": "^1.9.0", "@opentelemetry/api": "^1.9.0",
"@types/node": "^20.11.19", "@types/node": "^20.11.19",
"colorette": "^2.0.20", "colorette": "^2.0.20",
@@ -377,9 +384,9 @@
} }
}, },
"node_modules/@genkit-ai/ai/node_modules/@types/node": { "node_modules/@genkit-ai/ai/node_modules/@types/node": {
"version": "20.19.28", "version": "20.19.35",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.28.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.35.tgz",
"integrity": "sha512-VyKBr25BuFDzBFCK5sUM6ZXiWfqgCTwTAOK8qzGV/m9FCirXYDlmczJ+d5dXBAQALGCdRRdbteKYfJ84NGEusw==", "integrity": "sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.21.0" "undici-types": "~6.21.0"
@@ -399,9 +406,9 @@
} }
}, },
"node_modules/@genkit-ai/core": { "node_modules/@genkit-ai/core": {
"version": "1.27.0", "version": "1.29.0",
"resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.27.0.tgz", "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.29.0.tgz",
"integrity": "sha512-2dcr/yKixcxNj0U9pFpx9qNOTJcRdEjEz76qd5+o6Ac31foRBMb3J9Bvrfr+SaaPI4kiMnFUxN1X+w5yNjryQg==", "integrity": "sha512-nu4+rSEol1vtmgCbqTWDoEh5hHqXdAOkws4iPgXcIqZqw7/fyUwzNYrBnlFTRJlGUCd6lSQdAvzruqrOHZpR3Q==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@opentelemetry/api": "^1.9.0", "@opentelemetry/api": "^1.9.0",
@@ -415,7 +422,6 @@
"ajv": "^8.12.0", "ajv": "^8.12.0",
"ajv-formats": "^3.0.1", "ajv-formats": "^3.0.1",
"async-mutex": "^0.5.0", "async-mutex": "^0.5.0",
"body-parser": "^1.20.3",
"cors": "^2.8.5", "cors": "^2.8.5",
"dotprompt": "^1.1.1", "dotprompt": "^1.1.1",
"express": "^4.21.0", "express": "^4.21.0",
@@ -425,13 +431,14 @@
"zod-to-json-schema": "^3.22.4" "zod-to-json-schema": "^3.22.4"
}, },
"optionalDependencies": { "optionalDependencies": {
"@cfworker/json-schema": "^4.1.1",
"@genkit-ai/firebase": "^1.16.1" "@genkit-ai/firebase": "^1.16.1"
} }
}, },
"node_modules/@genkit-ai/core/node_modules/ajv": { "node_modules/@genkit-ai/core/node_modules/ajv": {
"version": "8.17.1", "version": "8.18.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
@@ -451,19 +458,19 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@genkit-ai/firebase": { "node_modules/@genkit-ai/firebase": {
"version": "1.27.0", "version": "1.29.0",
"resolved": "https://registry.npmjs.org/@genkit-ai/firebase/-/firebase-1.27.0.tgz", "resolved": "https://registry.npmjs.org/@genkit-ai/firebase/-/firebase-1.29.0.tgz",
"integrity": "sha512-/ChX1A/m9hIrfJLR8oP81+kg+sw9Qa4QMAUAF1UXZhCdiIzBhxDWRlkW4Hp5sotg+cMXlMY1JJKmweK6X0HWDg==", "integrity": "sha512-yypycQpULLyT9zqJVnCnad0gDw5CRawDQeEq9JmnIii1tEpcfO2s2kIWbb8ofWCPbNhNJMKkLcAHHU27NG6w9g==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@genkit-ai/google-cloud": "^1.27.0" "@genkit-ai/google-cloud": "^1.29.0"
}, },
"peerDependencies": { "peerDependencies": {
"@google-cloud/firestore": "^7.11.0", "@google-cloud/firestore": "^7.11.0",
"firebase": ">=11.5.0", "firebase": ">=11.5.0",
"firebase-admin": ">=12.2", "firebase-admin": ">=12.2",
"genkit": "^1.27.0" "genkit": "^1.29.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"firebase": { "firebase": {
@@ -472,9 +479,9 @@
} }
}, },
"node_modules/@genkit-ai/google-cloud": { "node_modules/@genkit-ai/google-cloud": {
"version": "1.27.0", "version": "1.29.0",
"resolved": "https://registry.npmjs.org/@genkit-ai/google-cloud/-/google-cloud-1.27.0.tgz", "resolved": "https://registry.npmjs.org/@genkit-ai/google-cloud/-/google-cloud-1.29.0.tgz",
"integrity": "sha512-t+vyZDd8Xojp1Se/+oPUoij3H2Hz2iWX/Gxegwfptkh/UemvHp3L7I0hsDe0du8zTBGMHZnhwnVnomgo4QFw+g==", "integrity": "sha512-sw50/370stlmxpgFdZ8P9mZmD/hgllUQA5T6ETzI83a25Ml9ufcH0UAQQlgna75mWcLi2iR0EKe1u49ZS5utSw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -498,13 +505,13 @@
"winston": "^3.12.0" "winston": "^3.12.0"
}, },
"peerDependencies": { "peerDependencies": {
"genkit": "^1.27.0" "genkit": "^1.29.0"
} }
}, },
"node_modules/@genkit-ai/googleai": { "node_modules/@genkit-ai/googleai": {
"version": "1.27.0", "version": "1.28.0",
"resolved": "https://registry.npmjs.org/@genkit-ai/googleai/-/googleai-1.27.0.tgz", "resolved": "https://registry.npmjs.org/@genkit-ai/googleai/-/googleai-1.28.0.tgz",
"integrity": "sha512-oX9QYLGteFZT5Ug3IHZC/TOWlZgJ8LoUuRC4J486iPhs9yPGSrRiIlW4nfrTWhe/nqmzmCyF8JTvHXKhfSkIag==", "integrity": "sha512-K39g1UbuZbaQaX0CyJbLW5nLKxv8HkghyQqezy4EtDK92SqoCEXK4DQKtEi+9JLRa9MHutaBxX9+fSHu7KPE1A==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@google/generative-ai": "^0.24.0", "@google/generative-ai": "^0.24.0",
@@ -512,7 +519,7 @@
"node-fetch": "^3.3.2" "node-fetch": "^3.3.2"
}, },
"peerDependencies": { "peerDependencies": {
"genkit": "^1.27.0" "genkit": "^1.28.0"
} }
}, },
"node_modules/@google-cloud/common": { "node_modules/@google-cloud/common": {
@@ -541,6 +548,7 @@
"resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz", "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz",
"integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==", "integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"@opentelemetry/api": "^1.3.0", "@opentelemetry/api": "^1.3.0",
"fast-deep-equal": "^3.1.1", "fast-deep-equal": "^3.1.1",
@@ -700,6 +708,7 @@
"version": "10.5.0", "version": "10.5.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
"deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
"license": "ISC", "license": "ISC",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -718,18 +727,17 @@
} }
}, },
"node_modules/@google-cloud/modelarmor/node_modules/google-auth-library": { "node_modules/@google-cloud/modelarmor/node_modules/google-auth-library": {
"version": "10.5.0", "version": "10.6.1",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.1.tgz",
"integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", "integrity": "sha512-5awwuLrzNol+pFDmKJd0dKtZ0fPLAtoA5p7YO4ODsDu6ONJUVqbYwvv8y2ZBO5MBNp9TJXigB19710kYpBPdtA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"base64-js": "^1.3.0", "base64-js": "^1.3.0",
"ecdsa-sig-formatter": "^1.0.11", "ecdsa-sig-formatter": "^1.0.11",
"gaxios": "^7.0.0", "gaxios": "7.1.3",
"gcp-metadata": "^8.0.0", "gcp-metadata": "8.1.2",
"google-logging-utils": "^1.0.0", "google-logging-utils": "1.1.3",
"gtoken": "^8.0.0",
"jws": "^4.0.0" "jws": "^4.0.0"
}, },
"engines": { "engines": {
@@ -769,20 +777,6 @@
"node": ">=14" "node": ">=14"
} }
}, },
"node_modules/@google-cloud/modelarmor/node_modules/gtoken": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz",
"integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==",
"license": "MIT",
"optional": true,
"dependencies": {
"gaxios": "^7.0.0",
"jws": "^4.0.0"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@google-cloud/modelarmor/node_modules/https-proxy-agent": { "node_modules/@google-cloud/modelarmor/node_modules/https-proxy-agent": {
"version": "7.0.6", "version": "7.0.6",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
@@ -798,13 +792,13 @@
} }
}, },
"node_modules/@google-cloud/modelarmor/node_modules/minimatch": { "node_modules/@google-cloud/modelarmor/node_modules/minimatch": {
"version": "9.0.5", "version": "9.0.9",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
"license": "ISC", "license": "ISC",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"brace-expansion": "^2.0.1" "brace-expansion": "^2.0.2"
}, },
"engines": { "engines": {
"node": ">=16 || 14 >=14.17" "node": ">=16 || 14 >=14.17"
@@ -1016,9 +1010,9 @@
} }
}, },
"node_modules/@google-cloud/storage": { "node_modules/@google-cloud/storage": {
"version": "7.18.0", "version": "7.19.0",
"resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.18.0.tgz", "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.19.0.tgz",
"integrity": "sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==", "integrity": "sha512-n2FjE7NAOYyshogdc7KQOl/VZb4sneqPjWouSyia9CMDdMhRX5+RIbqalNmC7LOLzuLAN89VlF2HvG8na9G+zQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@google-cloud/paginator": "^5.0.0", "@google-cloud/paginator": "^5.0.0",
@@ -1027,7 +1021,7 @@
"abort-controller": "^3.0.0", "abort-controller": "^3.0.0",
"async-retry": "^1.3.3", "async-retry": "^1.3.3",
"duplexify": "^4.1.3", "duplexify": "^4.1.3",
"fast-xml-parser": "^4.4.1", "fast-xml-parser": "^5.3.4",
"gaxios": "^6.0.2", "gaxios": "^6.0.2",
"google-auth-library": "^9.6.3", "google-auth-library": "^9.6.3",
"html-entities": "^2.5.2", "html-entities": "^2.5.2",
@@ -1568,13 +1562,13 @@
} }
}, },
"node_modules/@isaacs/cliui/node_modules/strip-ansi": { "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
"version": "7.1.2", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
"integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"ansi-regex": "^6.0.1" "ansi-regex": "^6.2.2"
}, },
"engines": { "engines": {
"node": ">=12" "node": ">=12"
@@ -1654,6 +1648,7 @@
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
"integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"engines": { "engines": {
"node": ">=8.0.0" "node": ">=8.0.0"
} }
@@ -1749,6 +1744,7 @@
"resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz",
"integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"@opentelemetry/semantic-conventions": "1.25.1" "@opentelemetry/semantic-conventions": "1.25.1"
}, },
@@ -2936,6 +2932,7 @@
"resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz",
"integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"@opentelemetry/core": "1.25.1", "@opentelemetry/core": "1.25.1",
"@opentelemetry/semantic-conventions": "1.25.1" "@opentelemetry/semantic-conventions": "1.25.1"
@@ -2978,6 +2975,7 @@
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz",
"integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"@opentelemetry/core": "1.25.1", "@opentelemetry/core": "1.25.1",
"@opentelemetry/resources": "1.25.1", "@opentelemetry/resources": "1.25.1",
@@ -3073,9 +3071,9 @@
} }
}, },
"node_modules/@opentelemetry/semantic-conventions": { "node_modules/@opentelemetry/semantic-conventions": {
"version": "1.38.0", "version": "1.40.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz",
"integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true, "optional": true,
"engines": { "engines": {
@@ -3384,9 +3382,9 @@
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.19.5", "version": "22.19.13",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.5.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.13.tgz",
"integrity": "sha512-HfF8+mYcHPcPypui3w3mvzuIErlNOh2OAG+BCeBZCEwyiD5ls2SiCwEyT47OELtf7M3nHxBdu0FsmzdKxkN52Q==", "integrity": "sha512-akNQMv0wW5uyRpD2v2IEyRSZiR+BeGuoB6L310EgGObO44HSMNT8z1xzio28V8qOrgYaopIDNA18YgdXd+qTiw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.21.0" "undici-types": "~6.21.0"
@@ -3547,10 +3545,11 @@
} }
}, },
"node_modules/acorn": { "node_modules/acorn": {
"version": "8.15.0", "version": "8.16.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"acorn": "bin/acorn" "acorn": "bin/acorn"
}, },
@@ -3590,9 +3589,9 @@
} }
}, },
"node_modules/ajv": { "node_modules/ajv": {
"version": "6.12.6", "version": "6.14.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -3624,9 +3623,9 @@
} }
}, },
"node_modules/ajv-formats/node_modules/ajv": { "node_modules/ajv-formats/node_modules/ajv": {
"version": "8.17.1", "version": "8.18.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
@@ -3727,13 +3726,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.13.2", "version": "1.13.6",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz",
"integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.11",
"form-data": "^4.0.4", "form-data": "^4.0.5",
"proxy-from-env": "^1.1.0" "proxy-from-env": "^1.1.0"
} }
}, },
@@ -4058,9 +4057,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/cors": { "node_modules/cors": {
"version": "2.8.5", "version": "2.8.6",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"object-assign": "^4", "object-assign": "^4",
@@ -4068,6 +4067,10 @@
}, },
"engines": { "engines": {
"node": ">= 0.10" "node": ">= 0.10"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
} }
}, },
"node_modules/cross-spawn": { "node_modules/cross-spawn": {
@@ -4377,6 +4380,7 @@
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1", "@eslint-community/regexpp": "^4.6.1",
@@ -4717,10 +4721,22 @@
], ],
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/fast-xml-builder": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz",
"integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
"license": "MIT"
},
"node_modules/fast-xml-parser": { "node_modules/fast-xml-parser": {
"version": "4.5.3", "version": "5.4.2",
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.2.tgz",
"integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", "integrity": "sha512-pw/6pIl4k0CSpElPEJhDppLzaixDEuWui2CUQQBH/ECDf7+y6YwA4Gf7Tyb0Rfe4DIMuZipYj4AEL0nACKglvQ==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@@ -4729,7 +4745,8 @@
], ],
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"strnum": "^1.1.1" "fast-xml-builder": "^1.0.0",
"strnum": "^2.1.2"
}, },
"bin": { "bin": {
"fxparser": "src/cli/cli.js" "fxparser": "src/cli/cli.js"
@@ -4871,6 +4888,7 @@
"resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.7.0.tgz", "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.7.0.tgz",
"integrity": "sha512-raFIrOyTqREbyXsNkSHyciQLfv8AUZazehPaQS1lZBSCDYW74FYXU0nQZa3qHI4K+hawohlDbywZ4+qce9YNxA==", "integrity": "sha512-raFIrOyTqREbyXsNkSHyciQLfv8AUZazehPaQS1lZBSCDYW74FYXU0nQZa3qHI4K+hawohlDbywZ4+qce9YNxA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"@fastify/busboy": "^3.0.0", "@fastify/busboy": "^3.0.0",
"@firebase/database-compat": "1.0.8", "@firebase/database-compat": "1.0.8",
@@ -4941,9 +4959,9 @@
} }
}, },
"node_modules/flatted": { "node_modules/flatted": {
"version": "3.3.3", "version": "3.3.4",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.4.tgz",
"integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "integrity": "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==",
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
@@ -5171,13 +5189,14 @@
} }
}, },
"node_modules/genkit": { "node_modules/genkit": {
"version": "1.27.0", "version": "1.29.0",
"resolved": "https://registry.npmjs.org/genkit/-/genkit-1.27.0.tgz", "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.29.0.tgz",
"integrity": "sha512-54OAzw9+dlOs2H4bWnktMwKVA1wwY9XmudKBAz2uBdWhep5r0xHy1qNE6tUVnSgn+LGGaR/0xfYRSs8uqNPFVw==", "integrity": "sha512-m0oqw4AU8l6LTELH/0JmWPUA5ZuEVwm4ZhgUaVopy86gqgWyDF+SdNIpIxtXqdTmxxQHK9stQXuq/zJUDCLF4Q==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"@genkit-ai/ai": "1.27.0", "@genkit-ai/ai": "1.29.0",
"@genkit-ai/core": "1.27.0", "@genkit-ai/core": "1.29.0",
"uuid": "^10.0.0" "uuid": "^10.0.0"
} }
}, },
@@ -5256,7 +5275,7 @@
"version": "7.2.3", "version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"deprecated": "Glob versions prior to v9 are no longer supported", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
"dev": true, "dev": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@@ -5946,12 +5965,11 @@
} }
}, },
"node_modules/jwks-rsa": { "node_modules/jwks-rsa": {
"version": "3.2.0", "version": "3.2.2",
"resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.2.0.tgz", "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.2.2.tgz",
"integrity": "sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==", "integrity": "sha512-BqTyEDV+lS8F2trk3A+qJnxV5Q9EqKCBJOPti3W97r7qTympCZjb7h2X6f2kc+0K3rsSTY1/6YG2eaXKoj497w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/express": "^4.17.20",
"@types/jsonwebtoken": "^9.0.4", "@types/jsonwebtoken": "^9.0.4",
"debug": "^4.3.4", "debug": "^4.3.4",
"jose": "^4.15.4", "jose": "^4.15.4",
@@ -6025,9 +6043,9 @@
} }
}, },
"node_modules/lodash": { "node_modules/lodash": {
"version": "4.17.21", "version": "4.17.23",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/lodash.camelcase": { "node_modules/lodash.camelcase": {
@@ -6213,9 +6231,9 @@
} }
}, },
"node_modules/minimatch": { "node_modules/minimatch": {
"version": "3.1.2", "version": "3.1.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true, "dev": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
@@ -6235,10 +6253,10 @@
} }
}, },
"node_modules/minipass": { "node_modules/minipass": {
"version": "7.1.2", "version": "7.1.3",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
"license": "ISC", "license": "BlueOak-1.0.0",
"optional": true, "optional": true,
"engines": { "engines": {
"node": ">=16 || 14 >=14.17" "node": ">=16 || 14 >=14.17"
@@ -6567,9 +6585,9 @@
} }
}, },
"node_modules/pg-protocol": { "node_modules/pg-protocol": {
"version": "1.10.3", "version": "1.12.0",
"resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.12.0.tgz",
"integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", "integrity": "sha512-uOANXNRACNdElMXJ0tPz6RBM0XQ61nONGAwlt8da5zs/iUOOCLBQOHSXnrC6fMsvtjxbOJrZZl5IScGv+7mpbg==",
"license": "MIT", "license": "MIT",
"optional": true "optional": true
}, },
@@ -6590,6 +6608,12 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/postal-mime": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/postal-mime/-/postal-mime-2.7.3.tgz",
"integrity": "sha512-MjhXadAJaWgYzevi46+3kLak8y6gbg0ku14O1gO/LNOuay8dO+1PtcSGvAdgDR0DoIsSaiIA8y/Ddw6MnrO0Tw==",
"license": "MIT-0"
},
"node_modules/postgres-array": { "node_modules/postgres-array": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
@@ -6744,9 +6768,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/pump": { "node_modules/pump": {
"version": "3.0.3", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
"integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -6777,9 +6801,9 @@
} }
}, },
"node_modules/qs": { "node_modules/qs": {
"version": "6.14.1", "version": "6.14.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
"integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"dependencies": { "dependencies": {
"side-channel": "^1.1.0" "side-channel": "^1.1.0"
@@ -6883,11 +6907,12 @@
} }
}, },
"node_modules/resend": { "node_modules/resend": {
"version": "6.7.0", "version": "6.9.3",
"resolved": "https://registry.npmjs.org/resend/-/resend-6.7.0.tgz", "resolved": "https://registry.npmjs.org/resend/-/resend-6.9.3.tgz",
"integrity": "sha512-2ZV0NDZsh4Gh+Nd1hvluZIitmGJ59O4+OxMufymG6Y8uz1Jgt2uS1seSENnkIUlmwg7/dwmfIJC9rAufByz7wA==", "integrity": "sha512-GRXjH9XZBJA+daH7bBVDuTShr22iWCxXA8P7t495G4dM/RC+d+3gHBK/6bz9K6Vpcq11zRQKmD+B+jECwQlyGQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"postal-mime": "2.7.3",
"svix": "1.84.1" "svix": "1.84.1"
}, },
"engines": { "engines": {
@@ -7044,9 +7069,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.7.3", "version": "7.7.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC", "license": "ISC",
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
@@ -7426,9 +7451,9 @@
} }
}, },
"node_modules/stripe": { "node_modules/stripe": {
"version": "19.3.1", "version": "19.3.0",
"resolved": "https://registry.npmjs.org/stripe/-/stripe-19.3.1.tgz", "resolved": "https://registry.npmjs.org/stripe/-/stripe-19.3.0.tgz",
"integrity": "sha512-5NXhLxTZ+4uO1wnsmNysILVuyeZ1Xia7niz/8ykBkGJkCcrY2WyQZwcfYuWZmZEJtWr2+0j49JXwNC6y9CHL7Q==", "integrity": "sha512-3MbqRkw5LXb4LWP1LgIEYxUAYhYDDU5pcHZj4Xha6VWPnN1wrUmQ7Htsgm8wR584s0hn1aQg1lYD0Hi+F37E5g==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"qs": "^6.11.0" "qs": "^6.11.0"
@@ -7446,9 +7471,9 @@
} }
}, },
"node_modules/strnum": { "node_modules/strnum": {
"version": "1.1.2", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz",
"integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@@ -8014,6 +8039,7 @@
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"funding": { "funding": {
"url": "https://github.com/sponsors/colinhacks" "url": "https://github.com/sponsors/colinhacks"
} }
+87 -33
View File
@@ -32,59 +32,54 @@ async function downloadToFile(url, destPath) {
const SCALE_FILTER = const SCALE_FILTER =
"scale='trunc(min(1920,iw)/2)*2':'trunc(min(1920,ih)/2)*2':force_original_aspect_ratio=decrease" "scale='trunc(min(1920,iw)/2)*2':'trunc(min(1920,ih)/2)*2':force_original_aspect_ratio=decrease"
// functions/mergeVideoAndAudio.js
async function muxAudioIntoVideo({ videoPath, audioPath, outPath, syncOffset = 0 }) { async function muxAudioIntoVideo({ videoPath, audioPath, outPath, syncOffset = 0 }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const command = ffmpeg() let command = ffmpeg()
const offset = Number(syncOffset) || 0 // L'offset : si > 0, on retarde la vidéo. Si < 0, on retarde l'audio.
if (syncOffset > 0) command.inputOptions(['-itsoffset', String(syncOffset)])
command.input(videoPath)
// Si offset > 0 : la vidéo est en avance (ou capturée en retard dans le passé relatif ?), on veut la retarder pour qu'elle commence plus tard if (syncOffset < 0) command.inputOptions(['-itsoffset', String(Math.abs(syncOffset))])
// c-à-d on décale le flux vidéo. command.input(audioPath)
// Si offset < 0 : on décale l'audio.
if (offset > 0) {
command.inputOptions(['-itsoffset', String(offset)])
}
command.input(videoPath) // 0:v
if (offset < 0) {
command.inputOptions(['-itsoffset', String(Math.abs(offset))])
}
command.input(audioPath) // 1:a
// Remplace le bloc .save(outPath) par celui-ci :
command command
.outputOptions([ .outputOptions([
'-map', '-map',
'0:v:0', // garder la 1re piste vidéo de l'entrée 0 '0:v:0',
'-map', '-map',
'1:a:0', // prendre la 1re piste audio de l'entrée 1 '1:a:0',
// Force une sortie H264 1080p max pour compatibilité totale iOS (les WebM VP8/9 posaient problème)
'-vf', '-vf',
SCALE_FILTER, `fps=30,${SCALE_FILTER}`,
'-af',
'aresample=async=1',
'-c:v', '-c:v',
'libx264', 'libx264',
'-preset', '-preset',
'veryfast', 'superfast',
'-crf', '-crf',
'22', '23',
'-pix_fmt',
'yuv420p',
'-profile:v',
'high',
'-level:v',
'4.1',
'-c:a', '-c:a',
'aac', 'aac',
'-b:a', '-b:a',
'192k', '128k',
'-movflags', '-movflags',
'+faststart', '+faststart',
'-shortest', // couper à la plus courte des 2 sources '-shortest',
'-tag:v',
'avc1',
]) ])
.on('error', reject) .on('error', (err) => {
.on('end', resolve) console.error('FFmpeg Error:', err)
.save(outPath) reject(err)
})
.on('end', () => {
console.log('Processing finished !')
resolve()
})
.output(outPath) // On définit la sortie ici
.run() // Et on lance l'exécution ici
}) })
} }
@@ -175,6 +170,65 @@ exports.mergeVideoAndAudio = onCall(
return result return result
} }
) )
/**
* Fusionne une vidéo et un audio avec correction de synchronisation.
* Gère les paramètres : videoUrl, audioUrl, storagePath, projectId, syncOffset
*/
exports.mergeVideoAndAudio = onCall(
{ region: REGION, timeoutSeconds: 540, memory: '1GiB' },
async (request) => {
// Dans v2, les arguments sont dans request.data
const { data, auth } = request;
const uid = auth?.uid;
if (!uid) {
throw new HttpsError('unauthenticated', 'Authentification requise');
}
const { videoUrl, audioUrl, storagePath, projectId, syncOffset } = data || {};
// 1. Validation des paramètres
if (!videoUrl || !audioUrl || !storagePath) {
throw new HttpsError(
'invalid-argument',
'Paramètres manquants : videoUrl, audioUrl et storagePath sont requis.'
);
}
// 2. Sécurité : Vérifier que l'utilisateur écrit dans son propre dossier
const expectedPrefix = `users/${uid}/`;
if (!storagePath.startsWith(expectedPrefix)) {
throw new HttpsError(
'permission-denied',
`Accès refusé : le chemin doit commencer par ${expectedPrefix}`
);
}
try {
logger.info(`[merge] Début du traitement pour le projet : ${projectId || 'inconnu'}`);
// 3. Appel de la logique de traitement (download -> ffmpeg -> upload)
// On passe le syncOffset s'il existe (ex: -0.150 pour 150ms de latence)
const result = await uploadPlaybackAsset({
videoUrl,
audioUrl,
storagePath,
syncOffset: syncOffset || 0
});
// 4. Marquer la compatibilité dans Firestore si un ID de projet est fourni
if (projectId) {
await markPlaybackCompatibility({ projectId, initiatorUid: uid });
}
return result;
} catch (error) {
logger.error('[merge] Erreur fatale lors de la fusion', error);
if (error instanceof HttpsError) throw error;
throw new HttpsError('internal', error.message || 'Erreur interne de fusion');
}
}
);
exports.reencodePlayback = onCall( exports.reencodePlayback = onCall(
{ region: REGION, timeoutSeconds: 540, memory: '1GiB' }, { region: REGION, timeoutSeconds: 540, memory: '1GiB' },