This is the official Node.js SDK for Transloadit's file uploading and encoding service.
Transloadit is a service that helps you handle file uploads, resize, crop and watermark your images, make GIFs, transcode your videos, extract thumbnails, generate audio waveforms, and so much more. In short, Transloadit is the Swiss Army Knife for your files.
This is a Node.js SDK to make it easy to talk to the Transloadit REST API.
- Node.js version 14 or newer
- A Transloadit account (free signup)
- Your API credentials (
authKey
,authSecret
)
Note: This documentation is for the current version (v3). Looking for v2 docs? Looking for breaking changes from v2 to v3?
Inside your project, type:
yarn add transloadit
or
npm install --save transloadit
The following code will upload an image and resize it to a thumbnail:
const { Transloadit } = require('transloadit')
const transloadit = new Transloadit({
authKey: 'YOUR_TRANSLOADIT_KEY',
authSecret: 'YOUR_TRANSLOADIT_SECRET',
})
try {
const options = {
files: {
file1: '/PATH/TO/FILE.jpg',
},
params: {
steps: {
// You can have many Steps. In this case we will just resize any inputs (:original)
resize: {
use: ':original',
robot: '/image/resize',
result: true,
width: 75,
height: 75,
},
},
// OR if you already created a template, you can use it instead of "steps":
// template_id: 'YOUR_TEMPLATE_ID',
},
waitForCompletion: true, // Wait for the Assembly (job) to finish executing before returning
}
const status = await transloadit.createAssembly(options)
if (status.results.resize) {
console.log('✅ Success - Your resized image:', status.results.resize[0].ssl_url)
} else {
console.log("❌ The Assembly didn't produce any output. Make sure you used a valid image file")
}
} catch (err) {
console.error('❌ Unable to process Assembly.', err)
if (err instanceof ApiError && err.assemblyId) {
console.error(`💡 More info: https://transloadit.com/assemblies/${err.assemblyId}`)
}
}
You can find details about your executed Assemblies here.
- Upload and resize image
- Upload image and convert to WebP
- Crop a face out of an image and download the result
- Retry example
- Calculate total costs (GB usage)
- Templates CRUD
For more fully working examples take a look at examples/
.
For more example use cases and information about the available robots and their parameters, check out the Transloadit website.
These are the public methods on the Transloadit
object and their descriptions. The methods are based on the Transloadit API.
Table of contents:
Returns a new instance of the client.
The options
object can contain the following keys:
authKey
(required) - see requirementsauthSecret
(required) - see requirementsendpoint
(default'https://api2.transloadit.com'
)maxRetries
(default5
) - see Rate limiting & auto retrygotRetry
(default0
) - see Rate limiting & auto retrytimeout
(default60000
: 1 minute) - the timeout (in milliseconds) for all requests (exceptcreateAssembly
)
Creates a new Assembly on Transloadit and optionally upload the specified files
and uploads
.
You can provide the following keys inside the options
object:
params
(required) - An object containing keys defining the Assembly's behavior with the following keys: (See also API doc and examples)steps
- Assembly instructions - See Transloadit docs and demos for inspiration.template_id
- The ID of the Template that contains your Assembly Instructions. One of eithersteps
ortemplate_id
is required. If you specify both, then any Steps will overrule the template.fields
- An object of form fields to add to the request, to make use of in the Assembly instructions via Assembly variables.notify_url
- Transloadit can send a Pingback to your server when the Assembly is completed. We'll send the Assembly Status in JSON encoded string inside a transloadit field in a multipart POST request to the URL supplied here.
files
- An object (key-value pairs) containing one or more file paths to upload and use in your Assembly. The key is the field name and the value is the path to the file to be uploaded. The field name and the file's name may be used in the (Assembly instructions) (params
.steps
) to refer to the particular file. See example below.'fieldName': '/path/to/file'
- more files...
uploads
- An object (key-value pairs) containing one or more files to upload and use in your Assembly. The key is the file name and the value is the content of the file to be uploaded. Value can be one of many types:'fieldName': (Readable | Buffer | TypedArray | ArrayBuffer | string | Iterable<Buffer | string> | AsyncIterable<Buffer | string> | Promise)
.- more uploads...
waitForCompletion
- A boolean (default isfalse
) to indicate whether you want to wait for the Assembly to finish with all encoding results present before the promise is fulfilled. IfwaitForCompletion
istrue
, this SDK will poll for status updates and fulfill the promise when all encoding work is done.timeout
- Number of milliseconds to wait before aborting (default86400000
: 24 hours).onUploadProgress
- An optional function that will be periodically called with the file upload progress, which is an with an object containing:uploadedBytes
- Number of bytes uploaded so far.totalBytes
- Total number of bytes to upload orundefined
if unknown (Streams).
onAssemblyProgress
- Once the Assembly has started processing this will be periodically called with the Assembly Execution Status (result ofgetAssembly
) only ifwaitForCompletion
istrue
.chunkSize
- (for uploads) a number indicating the maximum size of a tusPATCH
request body in bytes. Default toInfinity
for file uploads and 50MB for streams of unknown length. See tus-js-client.uploadConcurrency
- Maximum number of concurrent tus file uploads to occur at any given time (default 10.)
NOTE: Make sure the key in files
and uploads
is not one of signature
, params
or max_size
.
Example code showing all options:
await transloadit.createAssembly({
files: {
file1: '/path/to/file.jpg'
// ...
},
uploads: {
'file2.bin': Buffer.from([0, 0, 7]), // A buffer
'file3.txt': 'file contents', // A string
'file4.jpg': process.stdin // A stream
// ...
},
params: {
steps: { ... },
template_id: 'MY_TEMPLATE_ID',
fields: {
field1: 'Field value',
// ...
},
notify_url: 'https://example.com/notify-url',
},
waitForCompletion: true,
timeout: 60000,
onUploadProgress,
onAssemblyProgress,
})
Example onUploadProgress
and onAssemblyProgress
handlers:
function onUploadProgress({ uploadedBytes, totalBytes }) {
// NOTE: totalBytes may be undefined
console.log(`♻️ Upload progress polled: ${uploadedBytes} of ${totalBytes} bytes uploaded.`)
}
function onAssemblyProgress(assembly) {
console.log(
`♻️ Assembly progress polled: ${assembly.error ? assembly.error : assembly.ok} ${
assembly.assembly_id
} ... `
)
}
Tip: createAssembly
returns a Promise
with an extra property assemblyId
. This can be used to retrieve the Assembly ID before the Assembly has even been created. Useful for debugging by logging this ID when the request starts, for example:
const promise = transloadit.createAssembly(options)
console.log('Creating', promise.assemblyId)
const status = await promise
See also:
- API documentation
- Error codes and retry logic below
Retrieve Assemblies according to the given params
.
Valid params can be page
, pagesize
, type
, fromdate
, todate
and keywords
. Please consult the API documentation for details.
The method returns an object containing these properties:
items
: AnArray
of up topagesize
Assembliescount
: Total number of Assemblies
Creates an objectMode
Readable
stream that automates handling of listAssemblies
pagination. It accepts the same params
as listAssemblies
.
This can be used to iterate through Assemblies:
const assemblyStream = transloadit.streamAssemblies({ fromdate: '2016-08-19 01:15:00 UTC' })
assemblyStream.on('readable', function () {
const assembly = assemblyStream.read()
if (assembly == null) console.log('end of stream')
console.log(assembly.id)
})
Results can also be piped. Here's an example using through2:
const assemblyStream = transloadit.streamAssemblies({ fromdate: '2016-08-19 01:15:00 UTC' })
assemblyStream
.pipe(
through.obj(function (chunk, enc, callback) {
this.push(chunk.id + '\n')
callback()
})
)
.pipe(fs.createWriteStream('assemblies.txt'))
Retrieves the JSON status of the Assembly identified by the given assemblyId
. See API documentation.
Removes the Assembly identified by the given assemblyId
from the memory of the Transloadit machines, ultimately cancelling it. This does not delete the Assembly from the database - you can still access it on https://transloadit.com/assemblies/{assembly_id}
in your Transloadit account. This also does not delete any files associated with the Assembly from the Transloadit servers. See API documentation.
Replays the Assembly identified by the given assemblyId
(required argument). Optionally you can also provide a notify_url
key inside params
if you want to change the notification target. See API documentation for more info about params
.
The response from the replayAssembly
is minimal and does not contain much information about the replayed assembly. Please call getAssembly
or awaitAssemblyCompletion
after replay to get more information:
const replayAssemblyResponse = await transloadit.replayAssembly(failedAssemblyId)
const assembly = await transloadit.getAssembly(replayAssemblyResponse.assembly_id)
// Or
const completedAssembly = await transloadit.awaitAssemblyCompletion(
replayAssemblyResponse.assembly_id
)
This function will continously poll the specified Assembly assemblyId
and resolve when it is done uploading and executing (until result.ok
is no longer ASSEMBLY_UPLOADING
, ASSEMBLY_EXECUTING
or ASSEMBLY_REPLAYING
). It resolves with the same value as getAssembly
.
opts
is an object with the keys:
onAssemblyProgress
- A progress function called on each poll. SeecreateAssembly
timeout
- How many milliseconds until polling times out (default: no timeout)interval
- Poll interval in milliseconds (default1000
)
Returns the internal url that was used for the last call to createAssembly
. This is meant to be used for debugging purposes.
Replays the notification for the Assembly identified by the given assemblyId
(required argument). Optionally you can also provide a notify_url
key inside params
if you want to change the notification target. See API documentation for more info about params
.
Templates are Steps that can be reused. See example template code.
Creates a template the provided params. The required params
keys are:
name
- The template nametemplate
- The template JSON object containing itssteps
See also API documentation.
const template = {
steps: {
encode: {
use: ':original',
robot: '/video/encode',
preset: 'ipad-high',
},
thumbnail: {
use: 'encode',
robot: '/video/thumbnails',
},
},
}
const result = await transloadit.createTemplate({ name: 'my-template-name', template })
console.log('✅ Template created with template_id', result.id)
Updates the template represented by the given templateId
with the new value. The params
works just like the one from the createTemplate
call. See API documentation.
Retrieves the name and the template JSON for the template represented by the given templateId
. See API documentation.
Deletes the template represented by the given templateId
. See API documentation.
Retrieve all your templates. See API documentation for more info about params
.
The method returns an object containing these properties:
items
: AnArray
of up topagesize
templatescount
: Total number of templates
Creates an objectMode
Readable
stream that automates handling of listTemplates
pagination. Similar to streamAssemblies
.
Same as constructor
timeout
option: Set the default timeout (in milliseconds) for all requests (except createAssembly
)
Retrieves the billing data for a given date
string with format YYYY-MM
. See API documentation.
Calculates a signature for the given params
JSON object. If the params
object does not include an authKey
or expires
keys (and their values) in the auth
sub-key, then they are set automatically.
This function returns an object with the key signature
(containing the calculated signature string) and a key params
, which contains the stringified version of the passed params
object (including the set expires and authKey keys).
Constructs a signed Smart CDN URL, as defined in the API documentation. params
must be an object with the following properties:
workspace
- Workspace slug (required)template
- Template slug or template ID (required)input
- Input value that is provided as${fields.input}
in the template (required)urlParams
- Object with additional parameters for the URL query string (optional)expiresAt
- Expiration timestamp of the signature in milliseconds since UNIX epoch. Defaults to 1 hour from now. (optional)
Example:
const client = new Transloadit({ authKey: 'foo_key', authSecret: 'foo_secret' })
const url = client.getSignedSmartCDNUrl({
workspace: 'foo_workspace',
template: 'foo_template',
input: 'foo_input',
urlParams: {
foo: 'bar',
},
})
// url is:
// https://foo_workspace.tlcdn.com/foo_template/foo_input?auth_key=foo_key&exp=1714525200000&foo=bar&sig=sha256:9548915ec70a5f0d05de9497289e792201ceec19a526fe315f4f4fd2e7e377ac
Any errors originating from Node.js will be passed on and we use GOT v11 for HTTP requests. Errors from got
will also be passed on, except the got.HTTPError
which will be replaced with a transloadit.ApiError
, which will have its cause
property set to the instance of the original got.HTTPError
. transloadit.ApiError
has these properties:
code
(string
) - The Transloadit API error code.rawMessage
(string
) - A textual representation of the Transloadit API error.assemblyId
: (string
) - If the request is related to an assembly, this will be the ID of the assembly.assemblySslUrl
(string
) - If the request is related to an assembly, this will be the SSL URL to the assembly .
To identify errors you can either check its props or use instanceof
, e.g.:
try {
await transloadit.createAssembly(options)
} catch (err) {
if (err instanceof got.TimeoutError) {
return console.error('The request timed out', err)
}
if (err.code === 'ENOENT') {
return console.error('Cannot open file', err)
}
if (err instanceof ApiError && err.code === 'ASSEMBLY_INVALID_STEPS') {
return console.error('Invalid Assembly Steps', err)
}
}
Note: Assemblies that have an error status (assembly.error
) will only result in an error being thrown from createAssembly
and replayAssembly
. For other Assembly methods, no errors will be thrown, but any error can be found in the response's error
property (also ApiError.code
).
There are three kinds of retries:
All functions of the client automatically obey all rate limiting imposed by Transloadit (e.g. RATE_LIMIT_REACHED
), so there is no need to write your own wrapper scripts to handle rate limits. The SDK will by default retry requests 5 times with auto back-off (See maxRetries
constructor option).
Because we use got under the hood, you can pass a gotRetry
constructor option which is passed on to got
. This offers great flexibility for handling retries on network errors and HTTP status codes with auto back-off. See got
retry
object documentation.
Note that the above maxRetries
option does not affect the gotRetry
logic.
If you want to retry on other errors, please see the retry example code.
- https://transloadit.com/docs/api/rate-limiting/
- https://transloadit.com/blog/2012/04/introducing-rate-limiting/
This project uses debug so you can run node with the DEBUG=transloadit
evironment variable to enable verbose logging. Example:
DEBUG=transloadit* node examples/template_api.js
See Releases
Thanks to Ian Hansen for donating the transloadit
npm name. You can still access his code under v0.0.0
.
This project uses Vitest for testing. There are two types of tests:
Run unit tests with:
yarn test-unit
This will also generate a coverage report in the coverage
directory.
Run integration tests with:
yarn test-integration
Note: Integration tests require valid Transloadit credentials.
Coverage reports are:
- Generated locally in the
coverage
directory - Uploaded to Codecov for tracking
- Enforced in CI (builds will fail if coverage drops below thresholds)
View the coverage report locally by opening coverage/index.html
in your browser.