opacity-streamable
v2.2.1
Published
Arbitrary size interface for the Opacity network
Downloads
2
Readme
opacity-streamable
A proof of concept, streamable implementation of the Opacity Protocol (not fully compatible) with a few significant changes:
- CryptoJS replaced with node-forge
- Encryption/decryption key is the SHA-256 hash of the handle, per-chunk IV (see #109)
- Communication with the nodes via IXI module to save bandwidth
- Pipelined processing:
- File > Encryption > Upload
- Download > Decryption > Blob
API Reference
opacity-streamable
Importing opacity-streamable
Example (As an ES Module)
import Opacity from 'opacity-streamable'
Example (As a Node Module)
const Opacity = require(`opacity-streamable`)
Example (As a UMD Module)
window.Opacity = Opacity.default
Opacity.Download
Kind: static class of opacity-streamable
Emits: METADATA, DOWNLOAD_PROGRESS, FINISH
Download.EVENTS
Events fired during the download lifecycle
Kind: static constant of Download
"DOWNLOAD_PROGRESS"
Fired when a successful poll is performed while retrieving a file
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | progress | Object | a progress object | | progress.progress | Number | the percentage of progress for the download |
"FINISH"
Fired when the file has been reconstructed and is ready for use
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | file | File | Buffer | the file as an object as the target type of the download instance | | metadata | Object | the metadata object associated with the file |
"METADATA"
Fired when the file metadata has been reconstructed and is ready for use
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | fileName | String | the name of the file being downloaded | | ext | String | the file extension of the file being downloaded | | numberOfChunks | Number | the number of chunks that the file is stored in |
Download.toBuffer(handle, options) ⇒ Download
Kind: static method of Download
| Param | Type | Default | Description | | --- | --- | --- | --- | | handle | String | | the handle of the file to download | | options | Object | | the options for the download | | options.iotaProviders | Array.<Object> | Array.<IOTA> | | an array of IOTA initialization Objects or IOTA instances | | [options.autoStart] | Boolean | true | immediately start the download |
Example (To Buffer object (node))
const download = Opacity.Download.toBuffer(handle, {
iotaProviders: [
{ provider: 'https://poll.oysternodes.com:14265/' },
{ provider: 'https://download.oysternodes.com:14265/' }
]
})
download.on('meta', metadata => {
console.log(metadata)
// {fileName: "opacity.txt", ext: "txt", numberOfChunks: 2}
})
download.on('finish', filedata => {
console.log(filedata)
// {file: Buffer(), metadata: {…}, target: Download}
})
Download.toBlob(handle, options) ⇒ Download
Kind: static method of Download
| Param | Type | Default | Description | | --- | --- | --- | --- | | handle | String | | the handle of the file to download | | options | Object | | the options for the download | | options.iotaProviders | Array.<Object> | Array.<IOTA> | | an array of IOTA initialization Objects or IOTA instances | | [options.autoStart] | Boolean | true | immediately start the download |
Example (To Blob object (browser))
const download = Opacity.Download.toBlob(handle, {
iotaProviders: [
{ provider: 'https://poll.oysternodes.com:14265/' },
{ provider: 'https://download.oysternodes.com:14265/' }
]
})
download.on('meta', metadata => {
console.log(metadata)
// {fileName: "opacity.txt", ext: "txt", numberOfChunks: 2}
})
download.on('finish', filedata => {
console.log(filedata)
// {file: Blob(), metadata: {…}, target: Download}
})
Opacity.Upload
Kind: static class of opacity-streamable
Emits: INVOICE, CHUNKS_PROGRESS, UPLOAD_PROGRESS, FINISH
Upload.EVENTS
Events fired during the upload lifecycle
Kind: static constant of Upload
"INVOICE"
Fired when an invoice is recieved from the broker node
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | handle | String | the handle of the file uploaded | | address | String | an ethereum address to send the pearl to | | cost | Number | the cost of the file upload |
"CHUNKS_PROGRESS"
Fired when a chunk is uploaded to the broker
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | progress | Object | a progress object | | progress.progress | Number | the percentage of progress for the chunk upload |
"UPLOADED"
Fired all chunks have been uploaded to the brokers.
Kind: event emitted by EVENTS
"META_ATTACHED"
Fired when the meta chunk has been attached. This is needed in order to resume polling for upload progress.
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | target | Object | the upload object | | handle | String | the handle of the uploaded file | | numberOfChunks | Number | the number of chunks for the file | | metadata | Object | the metadata object |
"UPLOAD_PROGRESS"
Fired when a chunk is attached to the tangle
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | progress | Object | a progress object | | progress.progress | Number | the percentage of progress for the chunk attachment |
"FINISH"
Fired when the file has been completely attached to the tangle
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | handle | String | the handle of the file uploaded | | metadata | Object | the metadata object associated with the file |
Upload.EVENTS
Events fired during the upload lifecycle
Kind: static constant of Upload
"INVOICE"
Fired when an invoice is recieved from the broker node
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | handle | String | the handle of the file uploaded | | address | String | an ethereum address to send the pearl to | | cost | Number | the cost of the file upload |
"CHUNKS_PROGRESS"
Fired when a chunk is uploaded to the broker
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | progress | Object | a progress object | | progress.progress | Number | the percentage of progress for the chunk upload |
"UPLOADED"
Fired all chunks have been uploaded to the brokers.
Kind: event emitted by EVENTS
"META_ATTACHED"
Fired when the meta chunk has been attached. This is needed in order to resume polling for upload progress.
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | target | Object | the upload object | | handle | String | the handle of the uploaded file | | numberOfChunks | Number | the number of chunks for the file | | metadata | Object | the metadata object |
"UPLOAD_PROGRESS"
Fired when a chunk is attached to the tangle
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | progress | Object | a progress object | | progress.progress | Number | the percentage of progress for the chunk attachment |
"FINISH"
Fired when the file has been completely attached to the tangle
Kind: event emitted by EVENTS
Properties
| Name | Type | Description | | --- | --- | --- | | handle | String | the handle of the file uploaded | | metadata | Object | the metadata object associated with the file |
Upload.fromFile(file, options) ⇒ Upload
Kind: static method of Upload
| Param | Type | Default | Description | | --- | --- | --- | --- | | file | File | | the file to upload | | options | Object | | the options for the upload | | options.iotaProvider | Object | IOTA | | an IOTA initialization Object or IOTA instance | | options.alpha | String | | the endpoint for the alpha broker | | options.beta | String | | the endpoint for the beta broker | | options.epochs | Number | | the number of years to store the file | | [options.autoStart] | Boolean | true | immediately start the upload |
Example (From File object (browser))
const file = fileInput.files[0];
const upload = Opacity.Upload.fromFile(file, {
iotaProvider: { provider: 'https://poll.oysternodes.com:14265/' },
alpha: 'https://broker-1.oysternodes.com/',
beta: 'https://broker-2.oysternodes.com/',
epochs: 1
});
upload.on('invoice', invoice => {
console.log(invoice)
// {address: "<ETH_ADDRESS>", cost: 20}
});
upload.on('finish', filedata => {
console.log(filedata)
// {handle: "<OPACITY_HANDLE>", metadata: {…}, target: Upload}
});
Upload.fromData(buffer, filename, options) ⇒ Upload
Kind: static method of Upload
| Param | Type | Default | Description | | --- | --- | --- | --- | | buffer | Buffer | | the data Buffer to upload | | filename | String | | the name of the file | | options | Object | | the options for the upload | | options.iotaProvider | Object | IOTA | | an IOTA initialization Object or IOTA instance | | options.alpha | String | | the endpoint for the alpha broker | | options.beta | String | | the endpoint for the beta broker | | options.epochs | Number | | the number of years to store the file | | [options.autoStart] | Boolean | true | immediately start the upload |
Example (From Buffer object (node))
const fs = require('fs');
const path = './path/to/file';
const filename = 'somefile.txt';
fs.readFile(`${path}/${filename}`, (err, data) => {
if (err) throw err;
const upload = Opacity.Upload.fromData(data, filename, {
iotaProvider: { provider: 'https://poll.oysternodes.com:14265/' },
alpha: 'https://broker-1.oysternodes.com/',
beta: 'https://broker-2.oysternodes.com/',
epochs: 1
});
upload.on('invoice', invoice => {
console.log(invoice)
// {address: "<ETH_ADDRESS>", cost: 20}
});
upload.on('finish', filedata => {
console.log(filedata)
// {handle: "<OPACITY_HANDLE>", metadata: {…}, target: Upload}
});
});
What's next?
Possible things to look into:
- Full compatibility
- Pluggable source streams for uploads and target streams for downloads, allowing:
- Node compatability
- Video streams via MediaSource
- Arbitrary size downloads via StreamSaver
Credits
This repo is based on the official opacity/webinterface and shares a fair amount of code with the project where it makes sense.
Big thanks to everyone working on Opacity!