vidspotai-shared 1.0.113 → 1.0.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/lib/globals/types.d.ts +9 -1
  2. package/lib/globals/types.d.ts.map +1 -1
  3. package/lib/globals/types.js +9 -0
  4. package/lib/libs/index.d.ts +1 -0
  5. package/lib/libs/index.d.ts.map +1 -1
  6. package/lib/libs/index.js +1 -0
  7. package/lib/libs/mediaStore.d.ts +3 -31
  8. package/lib/libs/mediaStore.d.ts.map +1 -1
  9. package/lib/libs/mediaStore.js +16 -140
  10. package/lib/libs/storage/GcsBackend.d.ts +9 -0
  11. package/lib/libs/storage/GcsBackend.d.ts.map +1 -0
  12. package/lib/libs/storage/GcsBackend.js +42 -0
  13. package/lib/libs/storage/MediaStorage.d.ts +80 -0
  14. package/lib/libs/storage/MediaStorage.d.ts.map +1 -0
  15. package/lib/libs/storage/MediaStorage.js +105 -0
  16. package/lib/libs/storage/R2Backend.d.ts +23 -0
  17. package/lib/libs/storage/R2Backend.d.ts.map +1 -0
  18. package/lib/libs/storage/R2Backend.js +156 -0
  19. package/lib/libs/storage/StorageBackend.d.ts +41 -0
  20. package/lib/libs/storage/StorageBackend.d.ts.map +1 -0
  21. package/lib/libs/storage/StorageBackend.js +2 -0
  22. package/lib/libs/storage/index.d.ts +5 -0
  23. package/lib/libs/storage/index.d.ts.map +1 -0
  24. package/lib/libs/storage/index.js +20 -0
  25. package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts.map +1 -1
  26. package/lib/services/agent/tools/generateAvatarVideo.tool.js +3 -5
  27. package/lib/services/aiGen/providers/alibaba/alibaba.d.ts.map +1 -1
  28. package/lib/services/aiGen/providers/alibaba/alibaba.js +5 -11
  29. package/lib/services/aiGen/providers/bytedance/bytedance.service.d.ts.map +1 -1
  30. package/lib/services/aiGen/providers/bytedance/bytedance.service.js +5 -0
  31. package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.d.ts.map +1 -1
  32. package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.js +3 -7
  33. package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
  34. package/lib/services/aiGen/providers/google/google.service.js +7 -4
  35. package/lib/services/aiGen/providers/google/googleMusic.d.ts.map +1 -1
  36. package/lib/services/aiGen/providers/google/googleMusic.js +3 -7
  37. package/lib/services/aiGen/providers/kling/kling.service.d.ts +16 -7
  38. package/lib/services/aiGen/providers/kling/kling.service.d.ts.map +1 -1
  39. package/lib/services/aiGen/providers/kling/kling.service.js +2 -2
  40. package/lib/services/aiGen/providers/kling/klingImage.service.d.ts.map +1 -1
  41. package/lib/services/aiGen/providers/kling/klingImage.service.js +3 -5
  42. package/lib/services/aiGen/providers/kling/klingStatus.d.ts +1 -1
  43. package/lib/services/aiGen/providers/kling/klingStatus.d.ts.map +1 -1
  44. package/lib/services/aiGen/providers/kling/klingStatus.js +8 -19
  45. package/lib/services/aiGen/providers/minimax/minimax.service.d.ts.map +1 -1
  46. package/lib/services/aiGen/providers/minimax/minimax.service.js +7 -17
  47. package/lib/services/aiGen/providers/openai/openai.service.d.ts.map +1 -1
  48. package/lib/services/aiGen/providers/openai/openai.service.js +5 -13
  49. package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts.map +1 -1
  50. package/lib/services/aiGen/providers/pixverse/pixverse.service.js +5 -0
  51. package/lib/services/aiGen/providers/runway/runway.service.d.ts.map +1 -1
  52. package/lib/services/aiGen/providers/runway/runway.service.js +5 -10
  53. package/lib/services/gcp/uploadAudioBuffer.d.ts.map +1 -1
  54. package/lib/services/gcp/uploadAudioBuffer.js +4 -0
  55. package/package.json +1 -1
@@ -11,7 +11,7 @@ const axios_1 = __importDefault(require("axios"));
11
11
  const http_1 = __importDefault(require("http"));
12
12
  const https_1 = __importDefault(require("https"));
13
13
  const types_1 = require("../../../../globals/types");
14
- const firebase_1 = require("../../../../libs/firebase");
14
+ const storage_1 = require("../../../../libs/storage");
15
15
  const logger_1 = require("../../../../utils/logger");
16
16
  /**
17
17
  * Kling status polling + result stashing. Extracted from KlingService so the
@@ -43,7 +43,7 @@ function parseKlingDurationSec(raw) {
43
43
  * this helper in a separate commit.
44
44
  */
45
45
  async function stashVideoToGcs(videoUrl, outputFilePath, outputFilename, timeout, logContext) {
46
- const file = (0, firebase_1.getBucket)().file(`${outputFilePath}/${outputFilename}.mp4`);
46
+ const filePath = `${outputFilePath}/${outputFilename}.mp4`;
47
47
  const maxAttempts = 3;
48
48
  let lastErr;
49
49
  let downloadHost = "unknown";
@@ -63,11 +63,8 @@ async function stashVideoToGcs(videoUrl, outputFilePath, outputFilename, timeout
63
63
  httpAgent: v4Http,
64
64
  httpsAgent: v4Https,
65
65
  });
66
- await file.save(Buffer.from(videoResp.data), { contentType: "video/mp4" });
67
- const [signedUrl] = await file.getSignedUrl({
68
- action: "read",
69
- expires: "03-09-2491",
70
- });
66
+ // mediaStorage: GCS write + best-effort R2 mirror (zero-egress delivery).
67
+ const signedUrl = await storage_1.mediaStorage.put(filePath, Buffer.from(videoResp.data), "video/mp4");
71
68
  return signedUrl;
72
69
  }
73
70
  catch (err) {
@@ -192,18 +189,14 @@ async function checkRegularVideoStatus(deps, { task, outputFilename, outputFileP
192
189
  };
193
190
  }
194
191
  const filePath = `${outputFilePath}/${outputFilename}.mp4`;
195
- const file = (0, firebase_1.getBucket)().file(filePath);
196
192
  // Download video using axios — use generateTimeout since video files can be large
197
193
  const videoResp = await axios_1.default.get(videoUrl, {
198
194
  responseType: "arraybuffer",
199
195
  timeout: deps.generateTimeout,
200
196
  });
201
197
  const buffer = Buffer.from(videoResp.data);
202
- await file.save(buffer, { contentType: "video/mp4" });
203
- const [signedUrl] = await file.getSignedUrl({
204
- action: "read",
205
- expires: "03-09-2491",
206
- });
198
+ // mediaStorage: GCS write + best-effort R2 mirror (zero-egress delivery).
199
+ const signedUrl = await storage_1.mediaStorage.put(filePath, buffer, "video/mp4");
207
200
  return {
208
201
  videoUrl: signedUrl,
209
202
  status: types_1.EVideoSceneStatus.COMPLETED,
@@ -248,7 +241,6 @@ async function checkAvatarVideoStatus(deps, { task, outputFilename, outputFilePa
248
241
  // status that's already known. Wrap the post-success work in its own
249
242
  // bounded retry so a transient blip doesn't poison the poll loop.
250
243
  const filePath = `${outputFilePath}/${outputFilename}.mp4`;
251
- const file = (0, firebase_1.getBucket)().file(filePath);
252
244
  const maxAttempts = 3;
253
245
  let lastErr;
254
246
  // Force IPv4 on the download. The Kling-returned video URL frequently
@@ -274,11 +266,8 @@ async function checkAvatarVideoStatus(deps, { task, outputFilename, outputFilePa
274
266
  httpsAgent: v4Https,
275
267
  });
276
268
  const buffer = Buffer.from(videoResp.data);
277
- await file.save(buffer, { contentType: "video/mp4" });
278
- const [signedUrl] = await file.getSignedUrl({
279
- action: "read",
280
- expires: "03-09-2491",
281
- });
269
+ // mediaStorage: GCS write + best-effort R2 mirror (zero-egress delivery).
270
+ const signedUrl = await storage_1.mediaStorage.put(filePath, buffer, "video/mp4");
282
271
  return {
283
272
  videoUrl: signedUrl,
284
273
  status: types_1.EVideoSceneStatus.COMPLETED,
@@ -1 +1 @@
1
- {"version":3,"file":"minimax.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/minimax/minimax.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAUlB;;;GAGG;AAGH,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AAuHpE,qBAAa,cAAe,SAAQ,wBAAwB;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;YAUlB,OAAO;IAuDf,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAgE3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6EjD;;;;OAIG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAuDjC;;;;;OAKG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA+CjC,aAAa,CAAC,EACZ,QAAQ,EACR,UAAmB,EACnB,QAAY,EACZ,SAAiB,EACjB,SAAa,EACb,WAAW,GACZ,EAAE,iBAAiB,GAAG,MAAM;CAgC9B"}
1
+ {"version":3,"file":"minimax.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/minimax/minimax.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAUlB;;;GAGG;AAGH,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AAuHpE,qBAAa,cAAe,SAAQ,wBAAwB;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;YAUlB,OAAO;IAuDf,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAgE3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwEjD;;;;OAIG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAqDjC;;;;;OAKG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA2CjC,aAAa,CAAC,EACZ,QAAQ,EACR,UAAmB,EACnB,QAAY,EACZ,SAAiB,EACjB,SAAa,EACb,WAAW,GACZ,EAAE,iBAAiB,GAAG,MAAM;CAgC9B"}
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.MinimaxService = exports.MINIMAX_USER_INPUT_ERROR_PREFIX = void 0;
7
7
  const axios_1 = __importDefault(require("axios"));
8
8
  const aiModels_1 = require("../../../../globals/aiModels");
9
- const firebase_1 = require("../../../../libs/firebase");
9
+ const storage_1 = require("../../../../libs/storage");
10
10
  const types_1 = require("../../../../globals/types");
11
11
  const helpers_1 = require("../../helpers");
12
12
  const errors_1 = require("../../../../utils/errors");
@@ -266,12 +266,8 @@ class MinimaxService extends baseAiGenProvider_service_1.BaseAiGenProviderServic
266
266
  }
267
267
  const buffer = Buffer.from(videoResp.data);
268
268
  const filePath = `${outputFilePath}/${outputFilename}.mp4`;
269
- const file = (0, firebase_1.getBucket)().file(filePath);
270
- await file.save(buffer, { contentType: "video/mp4" });
271
- const [signedUrl] = await file.getSignedUrl({
272
- action: "read",
273
- expires: "03-09-2491",
274
- });
269
+ // mediaStorage: GCS write + best-effort R2 mirror (zero-egress delivery).
270
+ const signedUrl = await storage_1.mediaStorage.put(filePath, buffer, "video/mp4");
275
271
  return {
276
272
  videoUrl: signedUrl,
277
273
  status: types_1.EVideoSceneStatus.COMPLETED,
@@ -314,7 +310,6 @@ class MinimaxService extends baseAiGenProvider_service_1.BaseAiGenProviderServic
314
310
  if (!remoteUrls.length) {
315
311
  throw new Error("MiniMax image API returned no image_urls");
316
312
  }
317
- const bucket = (0, firebase_1.getBucket)();
318
313
  const ts = Date.now();
319
314
  const urls = [];
320
315
  for (let i = 0; i < remoteUrls.length; i++) {
@@ -324,9 +319,8 @@ class MinimaxService extends baseAiGenProvider_service_1.BaseAiGenProviderServic
324
319
  timeout: 60000,
325
320
  });
326
321
  const path = `images/minimax/${ts}-${Math.random().toString(36).slice(2, 8)}-${i}.png`;
327
- const file = bucket.file(path);
328
- await file.save(Buffer.from(r.data), { contentType: "image/png" });
329
- const [signed] = await file.getSignedUrl({ action: "read", expires: "03-09-2491" });
322
+ // mediaStorage: GCS write + best-effort R2 mirror (zero-egress delivery).
323
+ const signed = await storage_1.mediaStorage.put(path, Buffer.from(r.data), "image/png");
330
324
  urls.push(signed);
331
325
  }
332
326
  return {
@@ -369,12 +363,8 @@ class MinimaxService extends baseAiGenProvider_service_1.BaseAiGenProviderServic
369
363
  }
370
364
  const buffer = Buffer.from(audioHex, "hex");
371
365
  const path = `music/minimax/${params.outputFilename}.mp3`;
372
- const file = (0, firebase_1.getBucket)().file(path);
373
- await file.save(buffer, { contentType: "audio/mpeg" });
374
- const [signed] = await file.getSignedUrl({
375
- action: "read",
376
- expires: "03-09-2491",
377
- });
366
+ // mediaStorage: GCS write + best-effort R2 mirror (zero-egress delivery).
367
+ const signed = await storage_1.mediaStorage.put(path, buffer, "audio/mpeg");
378
368
  return {
379
369
  audioUrl: signed,
380
370
  mimeType: "audio/mpeg",
@@ -1 +1 @@
1
- {"version":3,"file":"openai.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/openai/openai.service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAclB,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,MAAM,CAAS;;IAQjB,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAwF3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsC3C,YAAY,CAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC;IA2ChC;;;;OAIG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA6HjC,aAAa,CAAC,EACZ,QAAQ,EACR,UAAuB,EACvB,QAAY,EACZ,SAAiB,EACjB,SAAa,EACb,OAAO,EACP,WAAW,GACZ,EAAE,iBAAiB,GAAG,MAAM;CAqB9B"}
1
+ {"version":3,"file":"openai.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/openai/openai.service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAclB,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,MAAM,CAAS;;IAQjB,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAwF3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA8B3C,YAAY,CAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC;IA2ChC;;;;OAIG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA2HjC,aAAa,CAAC,EACZ,QAAQ,EACR,UAAuB,EACvB,QAAY,EACZ,SAAiB,EACjB,SAAa,EACb,OAAO,EACP,WAAW,GACZ,EAAE,iBAAiB,GAAG,MAAM;CAqB9B"}
@@ -38,7 +38,7 @@ exports.OpenaiService = void 0;
38
38
  const openai_1 = __importStar(require("openai"));
39
39
  const aiModels_1 = require("../../../../globals/aiModels");
40
40
  const types_1 = require("../../../../globals/types");
41
- const firebase_1 = require("../../../../libs/firebase");
41
+ const storage_1 = require("../../../../libs/storage");
42
42
  const utils_1 = require("../../../../utils");
43
43
  const logger_1 = require("../../../../utils/logger");
44
44
  const errors_1 = require("../../../../utils/errors");
@@ -148,15 +148,9 @@ class OpenaiService extends baseAiGenProvider_service_1.BaseAiGenProviderService
148
148
  const response = await this.client.videos.downloadContent(task);
149
149
  const blob = await response.blob();
150
150
  const buffer = Buffer.from(await blob.arrayBuffer());
151
- // Upload to Firebase Storage
151
+ // Upload to storage — GCS write + best-effort R2 mirror (zero-egress).
152
152
  const filePath = `${outputFilePath}/${outputFilename}.mp4`;
153
- const file = (0, firebase_1.getBucket)().file(filePath);
154
- await file.save(buffer, { contentType: "video/mp4" });
155
- // Generate a signed URL
156
- const [signedUrl] = await file.getSignedUrl({
157
- action: "read",
158
- expires: "03-09-2491",
159
- });
153
+ const signedUrl = await storage_1.mediaStorage.put(filePath, buffer, "video/mp4");
160
154
  return {
161
155
  status: types_1.EVideoSceneStatus.COMPLETED,
162
156
  videoUrl: signedUrl,
@@ -307,7 +301,6 @@ class OpenaiService extends baseAiGenProvider_service_1.BaseAiGenProviderService
307
301
  }
308
302
  }
309
303
  const data = resp.data ?? [];
310
- const bucket = (0, firebase_1.getBucket)();
311
304
  const ts = Date.now();
312
305
  const ext = params.outputFormat ?? "png";
313
306
  const urls = [];
@@ -323,9 +316,8 @@ class OpenaiService extends baseAiGenProvider_service_1.BaseAiGenProviderService
323
316
  else
324
317
  continue;
325
318
  const path = `images/openai/${ts}-${Math.random().toString(36).slice(2, 8)}-${i}.${ext}`;
326
- const file = bucket.file(path);
327
- await file.save(bytes, { contentType: `image/${ext}` });
328
- const [signed] = await file.getSignedUrl({ action: "read", expires: "03-09-2491" });
319
+ // mediaStorage: GCS write + best-effort R2 mirror (zero-egress delivery).
320
+ const signed = await storage_1.mediaStorage.put(path, bytes, `image/${ext}`);
329
321
  urls.push(signed);
330
322
  }
331
323
  if (!urls.length)
@@ -1 +1 @@
1
- {"version":3,"file":"pixverse.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/pixverse/pixverse.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AA+FlB,qBAAa,eAAgB,SAAQ,wBAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkD;IAK1E;;;;;;OAMG;YACW,WAAW;IA6CnB,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAyL3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+GjD,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;CAkDjD"}
1
+ {"version":3,"file":"pixverse.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/pixverse/pixverse.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAgGlB,qBAAa,eAAgB,SAAQ,wBAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkD;IAK1E;;;;;;OAMG;YACW,WAAW;IA6CnB,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAyL3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAoHjD,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;CAkDjD"}
@@ -10,6 +10,7 @@ const helpers_1 = require("../../helpers");
10
10
  const aiModels_1 = require("../../../../globals/aiModels");
11
11
  const types_1 = require("../../../../globals/types");
12
12
  const firebase_1 = require("../../../../libs/firebase");
13
+ const storage_1 = require("../../../../libs/storage");
13
14
  const helpers_2 = require("../../../../utils/helpers");
14
15
  const mp4Duration_1 = require("../../../../utils/mp4Duration");
15
16
  const logger_1 = require("../../../../utils/logger");
@@ -372,6 +373,10 @@ class PixVerseService extends baseAiGenProvider_service_1.BaseAiGenProviderServi
372
373
  },
373
374
  },
374
375
  });
376
+ // mediaStorage: best-effort R2 mirror (zero-egress delivery). GCS keeps the
377
+ // firebaseStorage download-token URL as the stored system-of-record URL; the
378
+ // CDN Worker resolves either URL family to the same R2 object.
379
+ await storage_1.mediaStorage.mirrorBytes(filePath, buffer, "video/mp4");
375
380
  const publicVideoUrl = `https://firebasestorage.googleapis.com/v0/b/${bucket.name}` +
376
381
  `/o/${encodeURIComponent(filePath)}?alt=media&token=${downloadToken}`;
377
382
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"runway.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/runway/runway.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAIlB,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;YAUlB,OAAO;IAgCf,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA6G3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4DjD,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAY,EAAE,SAAiB,EAAE,SAAa,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,iBAAiB,GAAG,MAAM;IA0BhI;;;;;;;;OAQG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;CA0ElC"}
1
+ {"version":3,"file":"runway.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/runway/runway.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAIlB,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;YAUlB,OAAO;IAgCf,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA6G3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuDjD,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAY,EAAE,SAAiB,EAAE,SAAa,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,iBAAiB,GAAG,MAAM;IA0BhI;;;;;;;;OAQG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;CAyElC"}
@@ -7,7 +7,7 @@ exports.RunwayService = void 0;
7
7
  const axios_1 = __importDefault(require("axios"));
8
8
  const aiModels_1 = require("../../../../globals/aiModels");
9
9
  const types_1 = require("../../../../globals/types");
10
- const firebase_1 = require("../../../../libs/firebase");
10
+ const storage_1 = require("../../../../libs/storage");
11
11
  const helpers_1 = require("../../../../utils/helpers");
12
12
  const logger_1 = require("../../../../utils/logger");
13
13
  const helpers_2 = require("../../helpers");
@@ -161,12 +161,8 @@ class RunwayService extends baseAiGenProvider_service_1.BaseAiGenProviderService
161
161
  }
162
162
  const buffer = Buffer.from(videoResp.data);
163
163
  const filePath = `${outputFilePath}/${outputFilename}.mp4`;
164
- const file = (0, firebase_1.getBucket)().file(filePath);
165
- await file.save(buffer, { contentType: "video/mp4" });
166
- const [signedUrl] = await file.getSignedUrl({
167
- action: "read",
168
- expires: "03-09-2491",
169
- });
164
+ // mediaStorage: GCS write + best-effort R2 mirror (zero-egress delivery).
165
+ const signedUrl = await storage_1.mediaStorage.put(filePath, buffer, "video/mp4");
170
166
  return {
171
167
  videoUrl: signedUrl,
172
168
  status: types_1.EVideoSceneStatus.COMPLETED,
@@ -264,9 +260,8 @@ class RunwayService extends baseAiGenProvider_service_1.BaseAiGenProviderService
264
260
  const ext = (contentType.split("/")[1] ?? "png").toLowerCase();
265
261
  const ts = Date.now();
266
262
  const path = `images/runway/${ts}-${Math.random().toString(36).slice(2, 8)}.${ext}`;
267
- const file = (0, firebase_1.getBucket)().file(path);
268
- await file.save(Buffer.from(imgResp.data), { contentType });
269
- const [signed] = await file.getSignedUrl({ action: "read", expires: "03-09-2491" });
263
+ // mediaStorage: GCS write + best-effort R2 mirror (zero-egress delivery).
264
+ const signed = await storage_1.mediaStorage.put(path, Buffer.from(imgResp.data), contentType);
270
265
  return {
271
266
  imageUrl: signed,
272
267
  providerRequestId: run.id,
@@ -1 +1 @@
1
- {"version":3,"file":"uploadAudioBuffer.d.ts","sourceRoot":"","sources":["../../../src/services/gcp/uploadAudioBuffer.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAqB,GACjC,OAAO,CAAC,MAAM,CAAC,CAWjB"}
1
+ {"version":3,"file":"uploadAudioBuffer.d.ts","sourceRoot":"","sources":["../../../src/services/gcp/uploadAudioBuffer.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAqB,GACjC,OAAO,CAAC,MAAM,CAAC,CAcjB"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.uploadAudioBufferToGcs = uploadAudioBufferToGcs;
4
4
  const node_crypto_1 = require("node:crypto");
5
5
  const firebase_1 = require("../../libs/firebase");
6
+ const storage_1 = require("../../libs/storage");
6
7
  /**
7
8
  * Uploads an audio buffer to the project's Firebase Storage bucket and
8
9
  * returns a public download URL. Used by the agent VO pipeline: ElevenLabs
@@ -24,5 +25,8 @@ async function uploadAudioBufferToGcs(buffer, destination, contentType = "audio/
24
25
  metadata: { firebaseStorageDownloadTokens: downloadToken },
25
26
  },
26
27
  });
28
+ // mediaStorage: best-effort R2 mirror (zero-egress delivery). GCS keeps the
29
+ // firebaseStorage download-token URL as the stored system-of-record URL.
30
+ await storage_1.mediaStorage.mirrorBytes(destination, buffer, contentType);
27
31
  return `https://firebasestorage.googleapis.com/v0/b/${bucket.name}/o/${encodeURIComponent(destination)}?alt=media&token=${downloadToken}`;
28
32
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vidspotai-shared",
3
- "version": "1.0.113",
3
+ "version": "1.0.114",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "exports": {