@mux/mux-node
NPM |
Package Docs |
Mux Docs |
Mux API Reference
Official Mux API wrapper for Node projects, supporting both Mux Data and Mux Video.
Mux Video is an API-first platform, powered by data and designed by video experts to make beautiful video possible for every development team.
Mux Data is a platform for monitoring your video streaming performance with just a few lines of code. Get in-depth quality of service analytics on web, mobile, and OTT devices.
This library is intended to provide Mux API convenience methods for applications written in server-side Javascript. Please note that this package uses Mux access tokens and secret keys and is intended to be used in server-side code only.
Not familiar with Mux? Check out https://mux.com/ for more information.
Documentation
See the Mux-Node docs
Installation
npm install @mux/mux-node --save
or
yarn add @mux/mux-node
Usage
Please note: The instructions below are for CommonJS modules and the use thereof (require
in vanilla NodeJS). This library also exports an experimental ESModule and all you should need to do is import Mux from '@mux/mux-node'
in place of require('@mux/mux-node')
below. If you run into any problems, please file an issue!
To start, you will need a Mux access token and secret for your Mux environment. For more information on where to get
an access token, visit the Mux Getting Started guide https://docs.mux.com/docs
Require the @mux/mux-node
npm module and create a Mux instance. Your Mux instance will have Data
and Video
properties
that will allow you to access the Mux Data and Video APIs.
const Mux = require('@mux/mux-node');
const dotenv = require('dotenv');
dotenv.config();
const { Video, Data } = new Mux(accessToken, secret);
If a token ID and secret aren't included as parameters, the SDK will attempt to use the MUX_TOKEN_ID
and MUX_TOKEN_SECRET
environment variables.
const muxClient = new Mux();
As an example, you can create a Mux asset and playback ID by using the below functions on your Video instance.
const asset = await Video.Assets.create({
input: 'https://storage.googleapis.com/muxdemofiles/mux-video-intro.mp4',
"playback_policy": [
"public"
],
});
Or, if you don't have the files online already, you can ingest one via the direct uploads API.
const fs = require('fs')
const fetch = require('node-fetch');
let upload = await Video.Uploads.create({
new_asset_settings: { playback_policy: 'public' },
});
const readStream = await fs.createReadStream('/path/to/your/file');
await fetch(upload.url, { method: 'PUT', body: readStream });
let updatedUpload = await Video.Uploads.get(upload.id);
let asset = await Video.Assets.get(updatedUpload['asset_id']);
You can access the Mux Data API in the same way by using your Data instance. For example, you can list all of the
values across every breakdown for the aggregate_startup_time
metric by using the below function.
const breakdown = await Data.Metrics.breakdown('aggregate_startup_time', {
group_by: 'browser',
});
Usage Details
Every function will return a chainable Promise.
Video.Assets.create({
input: 'https://storage.googleapis.com/muxdemofiles/mux-video-intro.mp4',
}).then((asset) => {
});
Verifying Webhook Signatures
Verifying Webhook Signatures is optional. Learn more in our Webhook Security Guide
Mux.Webhooks.verifyHeader(rawBody, header, secret);
Note that when passing in the payload (rawBody
) you want to pass in the raw un-parsed request body, not the parsed JSON.
Here's an example if you are using express.
const Mux = require('@mux/mux-node');
const { Webhooks } = Mux;
const express = require('express');
const bodyParser = require('body-parser');
const webhookSecret = process.env.WEBHOOK_SECRET;
const app = express();
app.post(
'/webhooks',
bodyParser.raw({ type: 'application/json' }),
async (req, res) => {
try {
const sig = req.headers['mux-signature'];
const isValidSignature = Webhooks.verifyHeader(
req.body,
sig,
webhookSecret
);
console.log('Success:', isValidSignature);
const jsonFormattedBody = JSON.parse(req.body);
res.json({ received: true });
} catch (err) {
return res.status(400).send(`Webhook Error: ${err.message}`);
}
}
);
app.listen(3000, () => {
console.log('Example app listening on port 3000!');
});
You can use any JWT-compatible library, but we've included some light helpers in the SDK to make it easier to get up and running.
const token = Mux.JWT.signPlaybackId('some-playback-id');
const thumbParams = { time: 14, width: 100 };
const thumbToken = Mux.JWT.signPlaybackId('some-playback-id', {
type: 'thumbnail',
params: thumbParams,
});
const gifToken = Mux.JWT.signPlaybackId('some-playback-id', { type: 'gif' });
const storyboardToken = Mux.JWT.signPlaybackId('some-playback-id', {
type: 'storyboard',
});
const spaceToken = Mux.JWT.signSpaceId('some-space-id')
request
and response
events
The SDK returns the data
key for every object, because in the Mux API that's always the thing you actually want to see. Sometimes, however, it's useful to see more details about the request being made or the full response object. You can listen for request
and response
events to get these raw objects.
muxClient.on('request', (req) => {
});
muxClient.on('response', (res) => {
});
See the Mux-Node docs for a list of all available functions.
Development
Run unit tests: yarn test
or yarn test:unit
Run integration tests: yarn test:int
- this will run integration tests with nock
and NOCK_BACK_MODE
set to record
. This means that previously recorded API requests will be stubbed and any missing ones will be recorded.
You can also run integration tests with real requests by running yarn test:int:wild
. Make sure you have MUX_TOKEN_ID
and MUX_TOKEN_SECRET
set as environment variables so your requests are authenticated. This is useful to run locally to verify that actual API requests work as expected. When running the whole suite locally you might run into Mux API rate limits so keep that in mind.
Pro Tip Use mocha -g
option to run only a specific test or group of tests. For example: yarn test -g 'creates a new Assets'
.
To generate the ESDocs, run:
yarn esdoc
open ./docs/index.html
Contributing
Find a bug or want to add a useful feature? That'd be amazing! If you'd like to submit a pull request to the project with changes, please do something along these lines:
- Fork the project wherever you'd like
- Create a meaningful branch name that relates to your contribution. Consider including an issue number if available.
git co -b add-node-lts-support
- Make any changes you'd like in your forked branch.
- Add any relevant tests for your changes
- Open the pull request! :tada:
Running integration tests will require a Mux account with valid seed data for /video
and /data
endpoints. If you are contributing and you don't have this, please add unit test coverage and someone from the Mux will help get integration tests added if necessary.