0.0.34 • Published 1 month ago

@storacha/encrypt-upload-client v0.0.34

Weekly downloads
-
License
Apache-2.0 OR MIT
Repository
github
Last release
1 month ago

About

This library leverages @storacha/cli and @lit-protocol/lit-node-client to provide a simple interface for encrypting files with Lit Protocol and uploading them to the Storacha Network. It also enables anyone with a valid space/content/decrypt UCAN delegation to decrypt the file. With Lit Protocol, encryption keys are managed in a decentralized way, so you don’t have to handle them yourself.

Install

You can add the @storacha/encrypt-upload-client package to your JavaScript or TypeScript project with npm:

npm @storacha/encrypt-upload-client

Usage

To use this library, you'll need to install @storacha/cli and @lit-protocol/lit-node-client, as they are required for initialization—though the Lit client is optional. You must also provide a crypto adapter that implements the CryptoAdapter interface. A ready-to-use Node.js crypto adapter is already available.

CryptoAdapter Interface

interface CryptoAdapter {
  encryptStream(data: BlobLike): EncryptOutput
  decryptStream(encryptedData: ReadableStream, key: Uint8Array, iv: Uint8Array): ReadableStream
}

interface EncryptOutput {
  key: Uint8Array,
  iv: Uint8Array,
  encryptedStream: ReadableStream
}

Example Usage

const encryptedClient = await EncryptClient.create({
  storachaClient,
  cryptoAdapter: new NodeCryptoAdapter(),
})

Encryption

The encryption process automatically generates a custom Access Control Condition (ACC) based on the current space setup in your Storacha client. It then creates a symmetric key to encrypt the file and uses Lit Protocol to encrypt that key, so you don’t have to manage it yourself. Once encrypted, both the file and the generated encrypted metadata are uploaded to Storacha.

Example Usage

const fileContent = await fs.promises.readFile('./README.md')
const blob = new Blob([fileContent])
const cid = await encryptedClient.uploadEncryptedFile(blob)

You can find a full example in examples/encrypt-test.js.

Decryption

To decrypt a file, you'll need the CID returned from uploadEncryptedFile, a UCAN delegation CAR with the space/content/decrypt capability (proving that the file owner has granted you decryption access), and an Ethereum wallet with available Capacity Credits on the Lit Network to cover the decryption cost.

For details on minting Capacity Credits, check out the official documentation.

Example Usage

const decryptedContent = await encryptedClient.retrieveAndDecryptFile(
  wallet,
  cid,
  delegationCarBuffer
)

You can find a full example in examples/decrypt-test.js.

Contributing

Feel free to join in. All welcome. Please open an issue!

License

Dual-licensed under MIT + Apache 2.0