What is Nostr?
Tom
npub19at…upzr
2024-08-20 12:06:59
in reply to nevent1q…gmt0

Tom on Nostr: Unless you have a prior project with IPFS I would simply use blossom. But since you ...

Unless you have a prior project with IPFS I would simply use blossom. But since you asked:

# Step 1: Get filesize and hash using ipfs-car. The hash is the CID.
```
const { exec } = require('child_process');

async function getFileHashAndSize(file) {
return new Promise((resolve, reject) => {
const npxPath = '/usr/local/bin/npx'; // Full path to npx

exec(`${npxPath} ipfs-car hash ${file}`, (error, stdout, stderr) => {
if (error) {
return reject(new Error(`Error getting file hash: ${error.message}`));
}

const hashOutput = stdout.trim();

const hash = hashOutput.split(' ')[0];

exec(`wc -c < ${file}`, (error, stdout, stderr) => {
if (error) {
console.error(`Error executing wc command: ${stderr}`);
return reject(new Error(`Error getting file size: ${error.message}`));
}

const size = stdout.trim();

resolve({ hash, size });
});
});
});
}

```

# Step 2: Create JSON to upload to endpoint using acquired hash and filesize
```
function createStoreJson({ hash, size }) {
try {
if (!hash || !size) {
throw new Error('Invalid hash or size');
}
return {
tasks: [
[
'store/add',
'did:key:{StorageRepoID}',
{
link: {
'/': hash,
},
size: parseInt(size, 10),
},
],
],
};
} catch (error) {
throw new Error(`Error creating JSON: ${error.message}`);
}
}

```

# Step 3: Post JSON (not file) to web3 endpoint. This then tells you whether the data already exists or if you have to then upload the file as well.

```
// WEB3_STORAGE.ENDPOINT = https://up.web3.storage/bridge

async function postFun(json) {
try {
const response = await axios.post(WEB3_STORAGE.ENDPOINT, json, {
headers: {
'X-Auth-Secret': WEB3_STORAGE.SECRET,
'Authorization': WEB3_STORAGE.AUTH,
'Content-Type': 'application/json',
},
});

return response.data;
} catch (error) {
let errorMsg = `Error posting to ${WEB3_STORAGE.ENDPOINT}: ${error.message}`;
if (error.response) {
errorMsg += `\nResponse status: ${error.response.status}`;
errorMsg += `\nResponse data: ${JSON.stringify(error.response.data)}`;
}
throw new Error(errorMsg);
}
}
```

# Step 4: Post the file if step 3 returns false. The endpoint (puturl in this case) will be provided by the previous step, and is ALWAYS an AWS endpoint 😀
I've left the JSDoc comment here since there's a few more parameters.

```
/**
* Function to upload a file using a PUT request.
* @param {Object} params - The parameters for the PUT request.
* @param {string} params.putUrl - The URL to send the PUT request to.
* @param {number} params.size - The size of the file in bytes.
* @param {string} params.checksumSha256 - The SHA-256 checksum of the file.
* @param {string} params.filename - The path to the file to be uploaded.
* @returns {Promise<Object>} - An object containing the status and data of the response.
*/
async function putFun({ putUrl, size, checksumSha256, filename }) {
try {
const response = await axios.put(putUrl, fs.createReadStream(filename), {
headers: {
'Content-Length': size,
'x-amz-checksum-sha256': checksumSha256,
},
maxBodyLength: Infinity,
});

return { status: response.status, data: response.data };
} catch (error) {
let errorMsg = `Error putting file: ${error.message}`;
if (error.response) {
errorMsg += `\nResponse status: ${error.response.status}`;
errorMsg += `\nResponse status: ${error.response.data}`;
}
throw new Error(errorMsg);
}
}
```
Author Public Key
npub19at4nqjjymca2lh3v546vcg5ktun3al4c5xu2pts3ewckv0y70ys0gupzr