Firebase Cloud Functions streamline lengthy tasks by avoiding the risk of hitting a time threshold

Upon uploading videos to firebase storage, I am faced with the task of transcoding webm files to mp4 format. While I have a functional code demo available here, the issue arises when dealing with large video files. The conversion process often exceeds the timeout limit set by firebase functions, resulting in an incomplete transcode. Increasing the timeout limit is an option, but it feels like a temporary fix since there's no guarantee that the process will always finish within the extended timeframe.

Is there a way to prevent firebase from timing out without simply extending the maximum timeout limit?

If not, how can I efficiently handle time-consuming tasks such as video conversion while utilizing firebase function triggers?

In the event that completing demanding processes through firebase functions is not viable, is there a method to accelerate fluent-ffmpeg conversion speeds without significantly compromising quality? (I understand this might be a challenging request, and I'm willing to adjust quality levels if necessary, especially for compatibility with IOS devices)

For easier reference, here is a key excerpt from the mentioned demo. Although the complete code can be viewed here, the following section highlights the Promise responsible for ensuring successful video transcoding. The full script spans around 70 lines, making it relatively manageable for review if needed.

const functions = require('firebase-functions');
const mkdirp = require('mkdirp-promise');
const gcs = require('@google-cloud/storage')();
const Promise = require('bluebird');
const ffmpeg = require('fluent-ffmpeg');
const ffmpeg_static = require('ffmpeg-static');

(This is followed by text parsing routines and the below onChange event snippet)

function promisifyCommand (command) {
    return new Promise( (cb) => {
        command
        .on( 'end',   ()      => { cb(null)  } )
        .on( 'error', (error) => { cb(error) } )
        .run();
    })
}
return mkdirp(tempLocalDir).then(() => {
    console.log('Directory Created')
    //Download item from bucket
    const bucket = gcs.bucket(object.bucket);
    return bucket.file(filePath).download({destination: tempLocalFile}).then(() => {
      console.log('file downloaded to convert. Location:', tempLocalFile)
      cmd = ffmpeg({source:tempLocalFile})
               .setFfmpegPath(ffmpeg_static.path)
               .inputFormat(fileExtension)
               .output(tempLocalMP4File)
      cmd = promisifyCommand(cmd)
      return cmd.then(() => {
        //The delay occurs here due to the lengthy video transcoding process!
        console.log('mp4 created at ', tempLocalMP4File)
        return bucket.upload(tempLocalMP4File, {
            destination: MP4FilePath
        }).then(() => {
          console.log('mp4 uploaded at', filePath);
        });
      })
    });
  });

Answer №1

Cloud Functions for Firebase may not be the best choice if you need to run tasks that exceed the maximum timeout limit. To handle heavy compute operations using Cloud Functions alone, you'll have to divide the work into smaller parts and then combine the results afterward. This approach can be particularly challenging for complex tasks like video transcoding.

Alternatively, you could consider triggering long-running tasks in App Engine or Compute Engine using a function.

Answer №2

For those seeking a way to bypass transcoding videos or similar lengthy processes, here's an alternative approach. Instead of the usual method, this code example involves sending an http request to a google app engine process for file transcoding. While there is currently no documentation available, examining the Firebase/functions/index.js and app.js code may provide some insight into resolving your issue.

https://github.com/Scew5145/GCSConvertDemo

Wishing you success in your endeavors.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Error: An unexpected 'if' token was not caught

Encountering an error related to the question title while working with this code snippet: $LAB.queue(function setup() { FB.init({ appId: '00000000', status: true, cookie: true, xfbml: true, logging: &ap ...

Issue with binding click events on dynamically generated elements

After making an ajax call and successfully building button elements, I encountered an issue where I couldn't add a click event to the buttons. ... .done(function(data) { $('#data-message').empty(); $(&apo ...

Utilizing jQuery to Extract Values from a List of Options Separated by Commas

While usually simple, on Mondays it becomes incredibly challenging. ^^ I have some HTML code that is fixed and cannot be changed, like so: <a class="boxed" href="#foo" rel="type: 'box', image: '/media/images/theimage.jpg', param3: ...

Looking to resolve an issue that is arising in the antd tree component

Having trouble with the antd tree component - when searching and checking/unchecking a field, all previously selected data is unchecked. I want to only update the field that is currently being changed. Not sure how to fix this issue, any help would be appr ...

Looping through multiple table rows with AngularJS ng-repeat

I am currently working on making the code below functional, which involves data being retrieved from an API: ... <tbody ng-repeat="verbinding in data.connection" style="border-bottom:2px solid black;"> <tr> <td></td> ...

What is the reason for the failure of the require("perf_hooks") function?

My understanding is that "perf_hooks" is a component of Node.js. However, when I run tests with npm test, it fails for me and shows the following error (some file names have been altered): Error: ENOENT: no such file or directory, open 'perf_hooks&apo ...

An unexpected error occurred: [$injector:modulerr] (unidentified)

My website is running smoothly with AngularJS on one page, but I'm encountering an error in the console on other pages that do not use AngularJS. The error message reads: Uncaught Error: [$injector:modulerr] http://errors.angularjs.org/1.3.13/$in ...

Divide the string into a collection of individual elements

Recently, I received a string from the backend that looks like this: var string = "{name: Hello, age: 20}, {name: Nadia, age: 30}". To transform it into an object, I attempted to push it into an empty array using the following code: var array = [ ...

The function assigned to [variable].onclick is not being executed, despite no errors being displayed in the console

I'm new to javascript and I'm looking for help with a simple task. I want to create a code that when clicking on an image, it will open in a modal. This feature is important for viewing full-size images on my portfolio. Although there are no erro ...

Ensure the initial value in the dropdown menu is automatically set to the first value in VueJs

How can I set the first value of my time object as the default value for my dropdown in Vue? I want the first value to be pre-selected when a user enters the website, but currently only display the value without actually selecting it. time Object:- { &quo ...

In order to access the localStorage from a different component, a page refresh is required as it is

UPDATE: Just to clarify, this question is NOT duplicate of how to retrieve the value from localstorage. My scenario is unique and the issue lies with Angular itself rather than localStorage. I am currently developing an Angular7 application. In one of my ...

Grabbing a section of a URL through a bookmarklet: A simple guide

Recently, I've been using this handy bookmarklet: javascript:currentUrl=document.location.href;document.location.assign(currentUrl+'embed'); This neat tool grabs the current URL, such as www.example.com/knZg_INW8fL/, and adds embed to it f ...

Exploring through file names and sorting by category

Hello developers, I'm currently working on a webpage to showcase documents. My goal is to implement a search functionality based on 'filename' and 'category'. I have set up a dropdown for selecting file categories and a search inpu ...

The git clone operation encounters a problem with the error message: unable to connect, connection refused on localhost port 80

Currently for my project, I'm utilizing isomorphic-git. However, when I try to implement the git.clone function, I encounter the error message Error: connect ECONNREFUSED 127.0.0.1:80. To provide an example of what I am attempting to achieve: import ...

"Exploring the Intersection of Meteor, NPM Packages, and Fiber Callbacks

I am currently utilizing request and cheerio to extract specific content, particularly a quote, from a website. Here is the code snippet ( server.js ) : q = new Mongo.Collection('quotelist'); postList = new Mongo.Collection('quotes&apos ...

Having trouble passing parameters in a Node.js express POST request?

Here is the code snippet I am currently working with: const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: false })); app.post('/rasp&apos ...

There seems to be an issue with the import class for React PropTypes. The prop

I have multiple oversized items that are utilized in numerous components, so I created a PropTypes file for each item. For example: PropTypes/PropLargeObject.js This file contains: import PropTypes from "prop-types"; const PropLargeObject = Prop ...

Alternating the tooltip icon based on the field's condition

Looking for a way to create a tooltip for an input field that involves changing icons based on certain conditions. An example scenario is the password field in a registration form. Seeking advice on the best approach to achieve this. Currently, here' ...

Internet Explorer does not return results when using AJAX during the onchange event (specifically for IE only

My code is functioning correctly on other browsers, however in IE it does not provide any result when I select the dropdown button. Instead, it changes and displays an empty result. This is my AJAX: $("#book").change(function(){ var DOMBULK = $(" ...

Creating a promise instance with the axios create method

As someone who is new to TypeScript, I am learning as I go along. One thing I want to do is create an axios instance that can be reused in my code by passing props only where needed. The framework I'm using is React. // Located in a utils folder // a ...