Usage
Getting Started
Copy the demo HTML file into your IDE and open it in two browser tabs to test P2P.
Register Domain
Register your domain to activate the P2P service.
Localhost is always whitelisted, so no additional configuration is needed to test locally.
Prepare
CORS
Make sure your file servers have proper CORS (Cross-Origin Resource Sharing) headers configured so that data can be fetched across domains.
OPTIONS REQUEST
OPTIONS requests are required to perform RANGE requests in a cross-domain environment. In general, add the following header to the HTTP response:
Access-Control-Allow-Methods: GET, OPTIONS
RANGE REQUEST
RANGE requests are required for P2P. Add the following header to the HTTP response:
Access-Control-Allow-Headers: Range
Some browsers, such as Firefox, require Access-Control-Expose-Headers to be set in the HTTP response header in order to read the file size:
Access-Control-Expose-Headers: Content-Length
Include
Script
Include the pre-built script for the latest version:
<script src="https://cdn.jsdelivr.net/npm/@swarmcloud/file"></script>
File
Download here
This needs to be included before your player code. You can either prepend it to your compiled code or include it in a <script> before it.
Browserify / Webpack
npm install --save @swarmcloud/file
To include @swarmcloud/file, require it in your player module:
var P2PEngineFile = require('@swarmcloud/file');
If you're using ES6 import syntax:
import P2PEngineFile from '@swarmcloud/file';
Usage
Create a P2PEngineFile instance, passing the url as a parameter.
var downloader = new P2PEngineFile('path/to/your.file');
downloader.on('finished', function (file) {
file.save('name.file');
file.revokeBlobURL(); // free the blob
});
downloader.on('failed', function (e) {
// fallback to normal download
});
downloader.on('progress', function (e) {
// show progress to user
});
downloader.start();
Save file by ServiceWorker Stream
Instead of saving data to client-side storage or memory and then saving via a blob URL, you can now create a writable stream directly to the file system. This works by emulating how a server would instruct the browser to save a file, using response headers together with a service worker. This creates a man-in-the-middle page that installs the service worker in a secure context, hosted via an iframe on GitHub Pages. You can also host mitm.html yourself.
var downloader = new P2PEngineFile('path/to/your.file', {
// mitm: './mitm.html', // https://github.com/cdnbye/file-p2p-engine/blob/master/demo/mitm.html
});
if (downloader.isSaveByStreamSupported()) {
downloader.saveByServiceWorkerStream("filename")
.catch(err => {
console.error(err)
// you need to make the fallback strategy by yourself
});
} else {
// you need to make the fallback strategy by yourself
}
downloader.start();
See the save-by-stream demo