@iexec/dataprotector
Version:
This product enables users to confidentially store data–such as mail address, documents, personal information ...
67 lines (61 loc) • 1.67 kB
text/typescript
import {
DEFAULT_ARWEAVE_GATEWAY,
DEFAULT_ARWEAVE_UPLOAD_API,
ARWEAVE_FREE_UPLOAD_MAX_SIZE,
} from '../config/config.js';
interface AddOptions {
arweaveUploadApi?: string;
arweaveGateway?: string;
}
const add = async (
content: Uint8Array,
{ arweaveGateway, arweaveUploadApi }: AddOptions = {}
): Promise<string> => {
if (content.length >= ARWEAVE_FREE_UPLOAD_MAX_SIZE) {
throw Error(
`Arweave upload ${(ARWEAVE_FREE_UPLOAD_MAX_SIZE / 1024).toFixed(
0
)}kb size limit reached`
);
}
let arweaveId: string;
try {
const payload = new FormData();
payload.append('file', new Blob([content]));
const res = await fetch(
`${arweaveUploadApi || DEFAULT_ARWEAVE_UPLOAD_API}/upload`,
{
method: 'POST',
body: payload,
}
);
if (!res.ok) {
throw Error(`Arweave upload API answered with status ${res.status}`);
}
try {
const data = await res.json();
arweaveId = data?.arweaveId;
if (!arweaveId) {
throw Error('missing arweaveId');
}
} catch (e) {
throw Error('Arweave upload API answered with an invalid response', {
cause: e,
});
}
} catch (e) {
throw Error('Failed to add file on Arweave', { cause: e });
}
const publicUrl = `${arweaveGateway || DEFAULT_ARWEAVE_GATEWAY}/${arweaveId}`;
await fetch(publicUrl)
.then((res) => {
if (!res.ok) {
throw Error(`Arweave gateway answered with status ${res.status}`);
}
})
.catch((e) => {
throw Error(`Failed to load uploaded file at ${publicUrl}`, { cause: e });
});
return arweaveId;
};
export { add };