
Research
Namastex.ai npm Packages Hit with TeamPCP-Style CanisterWorm Malware
Malicious Namastex.ai npm packages appear to replicate TeamPCP-style Canister Worm tradecraft, including exfiltration and self-propagation.
@mux/upchunk
Advanced tools
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:
PUT request for each chunk, specifying the correct Content-Length and Content-Range headers for each one.npm install --save @mux/upchunk
yarn add @mux/upchunk
<script src="https://unpkg.com/@mux/upchunk@3"></script>
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 mux = new Mux({
tokenId: process.env.MUX_TOKEN_ID,
tokenSecret: process.env.MUX_TOKEN_SECRET,
});
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 mux.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);
};
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. 👋");
});
};
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;
createUpload(options)Returns an instance of UpChunk and begins uploading the specified File.
options object parametersendpoint type: string (url) | 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 (kB), 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 if the upload attempt fails with a retriable response status (see: retryCodes, below). After attempting attempts times, an error event will be dispatched and uploading will halt.
delayBeforeAttempt type: number (seconds), default: 1.0
The time in seconds to wait before attempting to upload a chunk again.
retryCodes type: number[] (HTTP Status), default: [408, 502, 503, 504]
The HTTP Status codes that indicate a given (failed) chunk upload request attempt is retriable. See also: attempts option, above.
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 (kB), default: 512000
When dynamicChunkSize is true, the largest chunk size that will be used, in kB.
minChunkSize type: integer (kB), default: 256
When dynamicChunkSize is true, the smallest chunk size that will be used, in kB.
useLargeFileWorkaround type: boolean, default: false
Falls back to reading entire file into memory for cases where support for streams is unreliable (see, e.g. this upchunk issue and the corresponding webkit bug report).
offline type: (readonly) boolean default: false
Indicates whether or not currently offline. While offline, uploading will pause and resume automatically once back online. See also: offline and online events, below.
paused type: (readonly) boolean default: false
Indicates whether or not uploading has been temporarily paused via the pause() method. See also: pause() and resume() methods, below.
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.
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.
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;
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.
FAQs
Dead simple chunked file uploads using Fetch
The npm package @mux/upchunk receives a total of 82,817 weekly downloads. As such, @mux/upchunk popularity was classified as popular.
We found that @mux/upchunk demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
Malicious Namastex.ai npm packages appear to replicate TeamPCP-style Canister Worm tradecraft, including exfiltration and self-propagation.

Product
Explore exportable charts for vulnerabilities, dependencies, and usage with Reports, Socket’s new extensible reporting framework.

Product
Socket for Jira lets teams turn alerts into Jira tickets with manual creation, automated ticketing rules, and two-way sync.