• Stars
    star
    335
  • Rank 125,904 (Top 3 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created almost 6 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Uploads Chunks! Takes big files, splits them up, then uploads each one with care (and PUT requests).

Mux Logo

UpChunk

Build Status

UpChunk uploads chunks of files! It's a JavaScript module for handling large file uploads via chunking and making a put request for each chunk with the correct range request headers. Uploads can be paused and resumed, they're fault tolerant, and it should work just about anywhere.

UpChunk is designed to be used with Mux direct uploads, but should work with any server that supports resumable uploads in the same manner. This library will:

  • Split a file into chunks (in multiples of 256KB).
  • Make a PUT request for each chunk, specifying the correct Content-Length and Content-Range headers for each one.
  • Retry a chunk upload on failures.
  • Allow for pausing and resuming an upload.

Installation

NPM

npm install --save @mux/upchunk

Yarn

yarn add @mux/upchunk

Script Tags

<script src="https://unpkg.com/@mux/upchunk@2"></script>

Basic Usage

Getting an upload URL from Mux.

You'll need to have a route in your application that returns an upload URL from Mux. If you're using the Mux Node SDK, you might do something that looks like this.

const Mux = require('@mux/mux-node');
const { Video } = new Mux();

module.exports = async (req, res) => {
  // This ultimately just makes a POST request to https://api.mux.com/video/v1/uploads with the supplied options.
  const upload = await Video.Uploads.create({
    cors_origin: 'https://your-app.com',
    new_asset_settings: {
      playback_policy: 'public',
    },
  });

  // Save the Upload ID in your own DB somewhere, then
  // return the upload URL to the end-user.
  res.end(upload.url);
};

Then, in the browser with plain Javascript

import * as UpChunk from '@mux/upchunk';

// Pretend you have an HTML page with an input like: <input id="picker" type="file" />
const picker = document.getElementById('picker');

picker.onchange = () => {
  const getUploadUrl = () =>
    fetch('/the-endpoint-above').then(res =>
      res.ok ? res.text() : throw new Error('Error getting an upload URL :(')
    );

  const upload = UpChunk.createUpload({
    endpoint: getUploadUrl,
    file: picker.files[0],
    chunkSize: 30720, // Uploads the file in ~30 MB chunks
  });

  // subscribe to events
  upload.on('error', err => {
    console.error('💥 🙀', err.detail);
  });

  upload.on('progress', progress => {
    console.log(`So far we've uploaded ${progress.detail}% of this file.`);
  });

  upload.on('success', () => {
    console.log("Wrap it up, we're done here. 👋");
  });
};

Or, in the browser with React

import React, { useState } from 'react';
import * as UpChunk from '@mux/upchunk';

function Page() {
  const [progress, setProgress] = useState(0);
  const [statusMessage, setStatusMessage] = useState(null);

  const handleUpload = async (inputRef) => {
    try {
      const response = await fetch('/your-server-endpoint', { method: 'POST' });
      const url = await response.text();
    
      const upload = UpChunk.createUpload({
        endpoint: url, // Authenticated url
        file: inputRef.files[0], // File object with your video file’s properties
        chunkSize: 30720, // Uploads the file in ~30 MB chunks
      });
    
      // Subscribe to events
      upload.on('error', error => {
        setStatusMessage(error.detail);
      });

      upload.on('progress', progress => {
        setProgress(progress.detail);
      });

      upload.on('success', () => {
        setStatusMessage("Wrap it up, we're done here. 👋");
      });
    } catch (error) {
      setErrorMessage(error);
    }
  }

  return (
    <div className="page-container">
      <h1>File upload button</h1>
      <label htmlFor="file-picker">Select a video file:</label>
      <input type="file" onChange={(e) => handleUpload(e.target)}
        id="file-picker" name="file-picker"/ >

      <label htmlFor="upload-progress">Downloading progress:</label>
      <progress value={progress} max="100"/>
      
      <em>{statusMessage}</em>
        
    </div>
  );
}

export default Page;

API

createUpload(options)

Returns an instance of UpChunk and begins uploading the specified File.

options object parameters

  • endpoint type: string | function (required)

    URL to upload the file to. This can be either a string of the authenticated URL to upload to, or a function that returns a promise that resolves that URL string. The function will be passed the file as a parameter.

  • file type: File (required)

    The file you'd like to upload. For example, you might just want to use the file from an input with a type of "file".

  • headers type: Object | function

    An object, a function that returns an object, or a function that returns a promise of an object. The resulting object contains any headers you'd like included with the PUT request for each chunk.

  • chunkSize type: integer, default:30720

    The size in kB of the chunks to split the file into, with the exception of the final chunk which may be smaller. This parameter must be in multiples of 256.

  • maxFileSize type: integer

    The maximum size of the file in kb of the input file to be uploaded. The maximum size can technically be smaller than the chunk size, and in that case there would be exactly one chunk.

  • attempts type: integer, default: 5

    The number of times to retry any given chunk.

  • delayBeforeAttempt type: integer, default: 1

    The time in seconds to wait before attempting to upload a chunk again.

  • method type: "PUT" | "PATCH" | "POST", default: PUT

    The HTTP method to use when uploading each chunk.

  • dynamicChunkSize type: boolean, default: false

    Whether or not the system should dynamically scale the chunkSize up and down to adjust to network conditions.

  • maxChunkSize type: integer, default: 512000

    When dynamicChunkSize is true, the largest chunk size that will be used, in kB.

  • minChunkSize type: integer, default: 256

    When dynamicChunkSize is true, the smallest chunk size that will be used, in kB.

UpChunk Instance Methods

  • pause()

    Pauses an upload after the current in-flight chunk is finished uploading.

  • resume()

    Resumes an upload that was previously paused.

  • abort()

    The same behavior as pause(), but also aborts the in-flight XHR request.

UpChunk Instance Events

Events are fired with a CustomEvent object. The detail key is null if an interface isn't specified.

  • attempt { detail: { chunkNumber: Integer, chunkSize: Integer } }

    Fired immediately before a chunk upload is attempted. chunkNumber is the number of the current chunk being attempted, and chunkSize is the size (in bytes) of that chunk.

  • attemptFailure { detail: { message: String, chunkNumber: Integer, attemptsLeft: Integer } }

    Fired when an attempt to upload a chunk fails.

  • chunkSuccess { detail: { chunk: Integer, attempts: Integer, response: XhrResponse } }

    Fired when an indvidual chunk is successfully uploaded.

  • error { detail: { message: String, chunkNumber: Integer, attempts: Integer } }

    Fired when a chunk has reached the max number of retries or the response code is fatal and implies that retries should not be attempted.

  • offline

    Fired when the client has gone offline.

  • online

    Fired when the client has gone online.

  • progress { detail: [0..100] }

    Fired continuously with incremental upload progress. This returns the current percentage of the file that's been uploaded.

  • success

    Fired when the upload is finished successfully.

FAQ

How do I cancel an upload?

Our typical suggestion is to use pause() or abort(), and then clean up the UpChunk instance however you'd like. For example, you could do something like this:

// upload is an UpChunk instance currently in-flight
upload.abort();

// In many cases, just `abort` should be fine assuming the instance will get picked up by garbage collection
// If you want to be sure, you can manually delete the instance.
delete upload;

Credit

The original idea for this came from the awesome huge uploader project, which is what you need if you're looking to do multipart form data uploads. 👏

Also, @gabrielginter ported upchunk to Flutter.

More Repositories

1

media-chrome

Custom elements (web components) for making audio and video player controls that look great in your website or app.
TypeScript
1,215
star
2

next-video

The easiest way to add video in your Nextjs app.
TypeScript
757
star
3

stream.new

The repo for https://stream.new
TypeScript
499
star
4

meet

A meeting app built on Mux Real-Time Video.
TypeScript
278
star
5

elements

Custom elements for working with media in the browser that Just Work™
TypeScript
235
star
6

certificate-expiry-monitor

Utility that exposes the expiry of TLS certificates as Prometheus metrics
Go
160
star
7

mux-node-sdk

Official Mux API wrapper for Node projects, supporting both Mux Data and Mux Video.
TypeScript
152
star
8

video-course-starter-kit

A starter template to help create a video course with Mux + Next.js
TypeScript
131
star
9

player.style

A fresh collection of media player themes for every use case!
HTML
125
star
10

examples

Example playground!
TypeScript
110
star
11

mux-go

Official Mux API wrapper for golang projects, supporting both Mux Data and Mux Video.
Go
89
star
12

webrtc-rebroadcaster

A "simple" webrtc rebroadcaster using FFmpeg
C++
88
star
13

mux-elixir

Official Mux API wrapper for Elixir projects, supporting both Mux Data and Mux Video.
Elixir
77
star
14

chromium_broadcast_demo

A simple demo showing how to use chromium as a WebRTC rendering engine
HTML
67
star
15

hlstools

Tools for analyzing and processing hls streams
C++
65
star
16

mux-ruby

Official Mux API wrapper for ruby projects, supporting both Mux Data and Mux Video.
Ruby
50
star
17

mux-python

Official Mux API wrapper for python projects, supporting both Mux Data and Mux Video.
Python
47
star
18

mux-stats-sdk-avplayer

Mux integration with `AVPlayer` for iOS Native Applications
Objective-C
43
star
19

mux-php

Official Mux API wrapper for PHP projects, supporting both Mux Data and Mux Video.
PHP
38
star
20

hls-video-element

A custom element (web component) for playing HTTP Live Streaming (HLS) videos.
JavaScript
38
star
21

youtube-video-element

A custom element (web component) for the YouTube player.
JavaScript
33
star
22

videojs-mux-kit

JavaScript
33
star
23

vmaf_analyzer

Estimates the average delivered VMAF for hls manifests
Go
32
star
24

example-ios-live-streaming

An example app for live streaming from an iOS device using the Mux live streaming service.
Swift
30
star
25

castable-video

Cast your video element to the big screen with ease!
JavaScript
25
star
26

strapi-plugin-mux-video-uploader

A Strapi plugin for managing uploads to Mux.
TypeScript
23
star
27

example-android-live-streaming

C++
23
star
28

videojs-super-resolution

Super Resolution for Video JS
JavaScript
21
star
29

truckload

Migrate your videos to any supported service
TypeScript
19
star
30

mux-stats-sdk-exoplayer

Monitors an ExoPlayer instance and reports player analytics to Mux Data
Java
19
star
31

mux-stats-sdk-react-native-video

JavaScript
17
star
32

stats-sdk-objc

Mux Stats SDK for iOS and tvOS
Objective-C
16
star
33

media-playlist

A custom element for playing through a set of audio and video elements.
JavaScript
15
star
34

bot-watcher

Example of using headless Chrome to test different aspects of a player
JavaScript
15
star
35

blurhash

Using woltapp/blurhash to make nice placeholders for Mux videos. Works nicely with Mux Player.
TypeScript
14
star
36

media-elements

A collection of HTMLMediaElement compatible elements and add-ons
JavaScript
13
star
37

cli

Command Mux from the command line like a boss.
TypeScript
11
star
38

media-group

👯‍♀️ mediagroup / MediaController which can be used to sync and control multiple audio / video elements
TypeScript
11
star
39

media-offset

✂️ Configures a media element to lock playback to a defined segment of the media
JavaScript
11
star
40

trivia.dev

IT'S TRIVIA! FOR DEVS! GO!
JavaScript
10
star
41

chromium_livestreamer

Take web pages and turn them into a live streams
Shell
8
star
42

custom-media-element

A custom element for extending the native media elements (<audio> or <video>)
JavaScript
8
star
43

chunked-transfer-demo

Webserver that demonstrates delivery of HLS media with HTTP chunked transfer encoding
Go
7
star
44

custom-video-element

A custom element for extending the native video element.
JavaScript
7
star
45

mux-csharp

C#
7
star
46

hls-subtitles-vexillographer

A simple proxy service which changes subtitles flags in HLS manifests.
Ruby
6
star
47

swift-upload-sdk

Mux's Video Upload SDK for iOS. The Swift equivalent of UpChunk.
Swift
6
star
48

shaka-video-element

A custom element (web component) for Shaka Player.
JavaScript
6
star
49

mux-player-swift

Use Mux Player Swift to stream and monitor video from Mux with AVKit and AVFoundation
Swift
6
star
50

android-upload-sdk

Mux's Video Upload SDK for Android. The Android equivalent of UpChunk.
Kotlin
5
star
51

chromecast-mux

JavaScript
5
star
52

roku-mux

Brightscript
5
star
53

mux-stats-sdk-media3

Mux Data SDK for AndroidX Media3
Kotlin
5
star
54

web-player-framework

JavaScript
5
star
55

mux-studio-demo

TypeScript
4
star
56

jamstack-conf-2020-workshop

JavaScript
4
star
57

next-video-site

TypeScript
4
star
58

mux-stats-google-ima

Swift
4
star
59

mux-protobuf

Mux Protobuf definition files
3
star
60

mux-android-distribution

A Gradle Plugin for distributing android builds, with support for Artifactory
Groovy
3
star
61

mux-player-android

Java
3
star
62

packaging_examples

Samples files packaged by mux
3
star
63

spaces-livekit-broadcast-layouts

TypeScript
3
star
64

mux-stats-sdk-theoplayer-ios

Mux Data Integration for THEOplayer's iOS SDK
Swift
2
star
65

meetup_colorspace_demo

HTML
2
star
66

mux-stats-sdk-theoplayer-android

Java
2
star
67

protogen

Protobuf Specification Generator written in Go
Go
2
star
68

media-tracks

Polyfill audio and video tracks with renditions.
TypeScript
2
star
69

video-archivist

A helpful Github bot that listens for links to videos in new issues, then asks maintainers if they want to archive it so it doesn't ever go away.
TypeScript
2
star
70

mux-java

Java
2
star
71

blurup

Generate a blurry image placeholder for a Mux video.
HTML
2
star
72

nextjs-backend-example

JavaScript
2
star
73

kaper

Kapacitor client written in Elixir.
Elixir
1
star
74

mux-stats-sdk-mediaplayer

Java
1
star
75

stackpath-urlauth

Golang library to sign Stackpath CDN URLs
Go
1
star
76

stats-sdk-exoplayer

Mux Stats SDK for ExoPlayer
Java
1
star
77

media-woofer

Kick up the bass on your media element!
JavaScript
1
star
78

webos-mux

LG WebOS
JavaScript
1
star
79

mux-docs

Docs for Mux SDKs and APIs
1
star
80

mux-delete-all-assets

Python
1
star
81

mipp

mipp - Pixel processing in JavaScript
C++
1
star
82

.github

Mux's shared templates and workflows.
1
star
83

stats-sdk-android

Core library for our Data SDKs for Android
Kotlin
1
star
84

tizen-mux

JavaScript
1
star
85

mux-stats-sdk-kaltura-android

A library for integration Mux Data with the Kaltura Playkit on Android
Java
1
star
86

blur-up-thumbs

HTML
1
star
87

simple-local-video-test-server

Uses a simple static server to host media files (with expected mimetype mappings).
HTML
1
star
88

templates

Repository of useful templates for use with Mux products
1
star
89

mux-stats-sdk-jwplayer-ios

Mux Data Integration for JWPlayer's iOS SDK
Objective-C
1
star