áá«áá
ááẠáá«ááœááºááœá¬ážááááºá
á€áá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááẠááá¯ááºáá»á¬ážááᯠááááºážáááºážááẠáá¬áááºááŸááá±á¬ á¡ááœáŸá¬ááŸáá·áº áááºážááá¯áááºáá°áááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºááŒá±á¬ááºážááᯠááŒáá·áºááŸá¯ááá¯áá«áááºá
ááááºáá±á¬ááºážáá«ážááœááºá áá»áœááºá¯ááºááẠ"á ááºááá¯ááŸááá·áº" áááºá ipfsáá«áá±ááá·áº áá«ááŒá±ááŸááºážáá±áá²á· ááŒá¿áá¬áá²á· á¡ááŒá±á¡áá±ááŸá¬ áá®áá¬á á¡ááá¡áá» ááŒá áºááœá¬ážáááºá ááŒá¯á¶ááŒá®ážááŒá±á¬áááẠáá®ááá±á¬áá»ááºá ááá¯ááºáááºáááºáááºá ááá°áá®áá±á¬áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážá¡ááœáẠááá°áá®áá±á¬ááœááºáááºáá»á¬ážááᯠáááºáá®ážááá¯ááºááŸá¯ááᯠáá»áœááºá¯ááºááŸá áºáááºáá«áááºá áááºážááẠááá·áºá¡á¬áž ááœá²á·á ááºážáá¯á¶ááᯠááá¯ááá¯áá±á¬ááºážááœááºá áœá¬ á á¯á ááºážááá¯ááºá á±ááŒá®áž node áá áºáá¯áá»ááºážá á®ááŸáá·áº ááœááºáááºáá áºáá¯áá¯á¶ážááœáẠáááºááᯠáá»áŸá±á¬á·áá»ááá¯ááºá á±áá«áááºá ááá±á¬áá»ááºáá áºáá¯ááá±á¬ááºá¡ááœááºážáááẠááá¯á¡ááºáá«áá áááºááẠá¡áá»áá¯á·áá±á¬áááºááŸááºáá»ááºáá»á¬ážááŸáá·áºá¡áá® ááœááºáááºááᯠá¡ááá¯ááºážááá¯ááºážááœá²á á¡áá¯á¶ážá á¯á¶áááºá¡á¬ážáá»áŸá±á¬á·áá»ááá¯ááºáááºá
áá«ááŒá±á¬áá·áº storacle á ááá¹ááá¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
- áááºááá·áº node ááŸáááá¯ááá¯ááºáá»á¬ážááᯠrepository ááá¯á·ááá·áºááá¯ááºáááºá
- ááá¯ááºáá»á¬ážááᯠááá±á¬ááºáá»á¬ážááœáẠááá¯ááºáá² áá¯á¶ážá ááááºážáááºážáá¬ážáááºá
- ááá¯ááºáá áºáá¯á á®ááœáẠáááºážááŸáá·áºáááºáááºáá¯ááºáá±á¬ááºáááºá¡ááœáẠáááºážáááá¯ááºááá¯ááºáá°ážááŒá¬ážáá±á¬á¡ááŒá±á¬ááºážá¡áᬠhash ááŸááááºá
- ááá¯ááá¯áá¯á¶ááŒááºá áááºáá»áááŸá¯á¡ááœáẠááá¯ááºáá»á¬ážááᯠááœá¬ážááá¯ááºáááºá
- node áá áºáá¯ááŸá ááá¯ááºá¡áá±á¡ááœááºááᯠááá¯ááºá áá áºááŒáá·áºáᬠááá·áºáááºáá¬ážáá«ááẠ(ááŒáœááºážáá»ááºáá áºáᯠááŸááá«áááºá á¡á±á¬ááºááœáẠáá±á¬ááºááẠá¡ááŒá±á¬ááºážá¡áá¬áá áºáᯠááŸááá±áááº)
- áá¯ááááá¬ážááŸááºážááœáẠá¡ááá·áºá¡áááºáááŸá node á¡áá±á¡ááœááºááŸáá·áº á¡áá¯ááºáá¯ááºááá¯ááºá á±ááá·áº ááœááºáááºá¡ááœááºážááŸá ááŸááºáááºáá±á¬ node á¡áá±á¡ááœááºá¡ááá¯áẠááŒáá·áºáá»ááºááá¯ááºáá±á¬á áœááºážáááºáá»á¬ážááŒáá·áº ááœááºáááºá¡ááœááºážááŸá ááá¯ááºá¡áá±á¡ááœááºááᯠááá·áºáááºáá¬ážáááºá
áááºážááẠáááá¯ááááºá០áá±áá°áá»á¡áá¯ááºáá¯ááºáá¯á¶á ááá¯ážááŸááºážáá±á¬ á¥ááá¬áá áºáá¯á
áá¬áá¬-
const Node = require('storacle').Node;
(async () => {
try {
const node = new Node({
port: 4000,
hostname: 'localhost'
});
await node.init();
}
catch(err) {
console.error(err.stack);
process.exit(1);
}
})();
áá±á¬ááºáááº-
const Client = require('storacle').Client;
(async () => {
try {
const client = new Client({
address: 'localhost:4000'
});
await client.init();
const hash = await client.storeFile('./my-file');
const link = await client.getFileLink(hash);
await client.removeFile(hash);
}
catch(err) {
console.error(err.stack);
process.exit(1);
}
})();
á¡ááŒááºá¡ááœááºážá¡ááŒááº
áá±á«ááºážá¡á¯á¶ážá¡á±á¬ááºááŸá¬ áá¬á០áá°ážáá°ážááŒá¬ážááŒá¬áž áááŸááá«áá°ážá ááá¯ááºá¡áá±á¡ááœááºá áááºážááá¯á·á á á¯á á¯áá±á«ááºážá¡ááœááºá¡á á¬ážááŸáá·áº á¡ááŒá¬ážá¡áá»ááºáá»á¬ážá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºáá»á¬ážááᯠáááºááá¯áá®áá±áá¬áá±á·á áºááœáẠááááºážáááºážáá¬ážááŒá®áž ááá¯ááºáá»á¬ážááᯠáá»ááºááá¯ááºááá·áºá¡áá«ááœáẠá¡ááºááááºáá¯ááºáá¬ážáá±á¬ááŒá±á¬áá·áº ááá¯ááºá áá áºá¡á¬áž áááŒá¬áá áááºáá±á¬ááºááŒáá·áºááŸá¯ááẠáááá¯á¡ááºáá«á ááŒáœááºážáá»ááºáá áºáá¯ááẠááá¯ááŸá±á¬ááºááŸá¯á¡ááœááºá¡á á¬ážááá¯á·áá±á¬ááºááŸáááá·áºá¡áá« ááá¯ááºáá»á¬ážááᯠááŒáá·áºáá±ááẠááá¯á¡ááºááá·áºá¡áá«ááœáẠá¡ááŸáá¯ááºá á¯áá±á¬ááºážáá°ááᯠááœáá·áºáá±ážááŒá®áž á¡áá áºáá»á¬ážááᯠááá·áºááŒááºážááᯠáá¬ážááŒá áºáá¬ážáááºá á€ááá á¹á ááœááºá áááºááẠááá¯ááŸá±á¬ááºááŸá¯ááᯠáá»á±á¬áºááŒááºááẠááá¯á¡ááºááŒá®áž ááá¯ááºá¡áá»á¬ážá¡ááŒá¬áž (> áá áºáááºážáá¯ááá¯áááº) ááŒáá·áº áá¯ááºáá±á¬ááºááŒááºážááẠáááá¬áááºááŸá¬ážáá±á¬ áááºáá¯ááºáááºááá¯ážáá»á¬ážáá®ááá¯á· áŠážáááºááœá¬ážááá¯ááºáááºá ááá¯ááºá¡áááºážáááºááᯠááááºážáááºážááŒá®áž node áá»á¬ážááᯠááá¯ááá¯áá¯ááºáá±á¬ááºááŒááºážááẠááá¯áá±á¬ááºážáá«áááºá "ááá·áºááŸááºážáá±áž" ááá¯ááááºáá¬ážáá«áááá¯áá²á·ááá¯á·áá±á¬ááŒá¿áá¬áááŸááá«á
ááá¯ááºááá¯ááŸá±á¬ááºááŸá¯ááœáẠááá¯ááºááœá² 256 ááá¯ááºááœá²ááŸáá·áº nesting á¡ááá·áº 2 áá«áááºáááºá ááá¯ááºáá»á¬ážááᯠáá¯áááá¡ááá·áº ááá¯ááºááœá²áá»á¬ážááœáẠááááºážáááºážáá¬ážáááºá á¡á²áá«á á áááºážááŸááááºá ááá¯ááá¯áá«áá áºáá¯á á®ááœáẠááá¯ááºáá±á«ááºáž 1 ááá·áº (62500 / sqrt(1000000)) ááá·áºááŸááá«áááºá
ááá¯ááºááœá²á¡áááºáá»á¬ážááᯠhash ááá¯áááá«á áááºážááᯠáá»ááºááŒááºá áœá¬áááºáá±á¬ááºááá¯ááºááẠááá¯áẠhash ááŸááœá²á·á ááºážáá¬ážáá«áááºá
á€ááœá²á·á ááºážáá¯á¶á¡á¬áž ááá°áá®áá±á¬ ááá¯ááŸá±á¬ááºááŸá¯ááá¯á¡ááºáá»ááºá¡áá»á¬ážá¡ááŒá¬ážá¡áá±á«áº á¡ááŒá±áá¶á ááœá±ážáá»ááºáá¬ážáááº- ááá¯ááºá áá áºáá áºáá¯ááœáẠááá¯ááºáá»á¬ážá áœá¬ááŸáááẠáááá¯áá¬ážá¡ááºáá±á¬ á¡á¬ážáááºážáá±á¬ ááá¯ááºá áá áºáá»á¬ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯á ááá¯á¡ááºáá«á ááá¯ááºááœá²á¡á¬ážáá¯á¶ážááᯠá¡ááŒááºááŒááºáááºážááŒááºáž á áááºááŒáá·áºá ááœáŸá±áá áºáá»áá¯ážáá»áá¯ážááᯠááá¯ááá¯áááºá
ááááºážáááºážááŒááºážá
ááá¯ááºáá»á¬ážááá·áºááá·áºá¡áá«á¡ááŒáẠáááºážááá¯á·ááá¯áááºáá¶ááá·áºá¡áá«ááœááºá ááá¯ááºáá»á¬ážááá¯á· ááá·áºááºáá»á¬ážááᯠáááºááŸáºááœááºáá±ážáá¬ážáááºá
áááºážááŒá±á¬áá·áºá ááá¯ááºáá
áºáá¯ááŸá¬ááœá±ááẠááœááºáááºáá
áºáá¯áá¯á¶ážááᯠáááŒá¬ááááŒááºáááºážááẠáááá¯á¡ááºáá«á áááºážááẠááá·áºááºáá»á¬ážá áááºáá¶ááŸá¯ááᯠá¡ááŸáááºááŒáŸáá·áºáá±ážááŒá®áž ááœááºáááºáá±á«áºááŸá áááºááᯠáá»áŸá±á¬á·áá»áá±ážáááºá Caching ááẠhttp headers ááŸáááá·áºáááºáž ááŒá
áºáá±á«áºáá«áááºá
Isomorphy
client ááᯠjavascript ááŒáá·áºáá±ážáá¬ážáá¬ážááŒá®áž isomorphic ááŒá
áºáááºá áááºážááᯠbrowser ááŸááá¯ááºááá¯ááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
ááá¯ááºááᯠá¡ááºáá¯ááºáá¯ááºááá¯ááºáá«áááºá
ááœáŸá±á·ááá¯ááºážáá¬ážáá±á¬ááá·áºáá»á¬áž
á áááºáááºá á¬ážá áá¬áá±á¬ááºážááá·áº á¡ááºá¹áá«áááºááŸá¬ âááœáŸá±á·ááá¯ááºážáá¬ážáá±á¬ á¡ááá¯ážá¡áá¬ážâ ááŒá áºáááºá áááºážááẠá€áá±áá¬ááŸáá·áº ááᯠáááŒáá¯ááºáááºáááºáž ááá°ááá¯ááºááá·áº ááá¯ááºáá áºáá¯á ááá·áºááºáá áºáá¯ááŒá áºááŒá®áž áááºážááᯠááá¯ááŸá±á¬ááºááŸá¯ááœáẠááœá±á·ááŸáááŒá®ážááá·áºá¡áá« ááá¯ááºááᯠááœá²áá¯ááºááœá¬ážáááºááŒá áºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºááẠsite áá±á«áºááœááºá¡áá»áá¯á·áá±á¬áá¯á¶áá»á¬ážááá¯ááŒááááºááá¯á¡ááºáá±á¬á¡áá«áááºážáááºá¡ááœááºá¡áááºááŒá±áááºá áá»áœááºá¯ááºááá¯á·ááẠsrc ááœááºááœáŸá±á·ááá¯ááºážáá¬ážáá±á¬ááá·áºááºááá¯áááºááá¯ááºáááºááŸáá·áºáá«áááºá á¡ááŸá¯á¡áááºážáá»á¬ážá áœá¬áá²á· áááºáá¬ááá¯ááºáá«áááºá
áá¯á¶ážá áœá²áá° API
- async Client.prototype.storeFile() - ááá¯ááºááá¯ááááºážáááºážáá«á
- async Client.prototype.getFileLink() - ááá¯ááºááá¯á·ááá¯ááºááá¯ááºááá·áºááºáá áºáá¯ááá°ááŒááºážá
- async Client.prototype.getFileLinks() â áááºážáááºááŸáááá·áºáá±áá¬á¡á¬ážáá¯á¶ážá០ááá¯ááºáá áºáá¯ááá¯á· ááá¯ááºááá¯ááºááá·áºááºáá»á¬ážá á¬áááºážááᯠááá°ááŒááºážá
- async Client.prototype.getFileToBuffer() - ááá¯ááºááᯠááŒá¬ážáá¶áá²ááá¯á·ááá·áºáá«á
- async Client.prototype.getFileToPath() - ááá¯ááºá áá áºáá²ááá¯á· ááá¯ááºáá áºáá¯ááá°áá«á
- async Client.prototype.getFileToBlob() â ááá¯ááºááᯠblob (ááá±á¬ááºáá¬áá¬ážááŸááºážá¡ááœááº) ááá°áá«á
- async Client.prototype.removeFile() - ááá¯ááºáá áºáá¯ááá¯áá»ááºáá«á
- Client.prototype.createRequestedFileLink() - ááœáŸá±á·ááá¯ááºážáá¬ážáá±á¬ááá·áºááºááᯠáááºáá®ážáá«á
ááá¯ááºáá»á¬ážááᯠá¡ááŒá¬ážáá¬áá¬ááá¯á· áááºááá¯á·áá«á
ááá¯ááºáá»á¬ážááᯠá¡ááŒá¬áž node ááá¯á· ááœáŸá²ááŒá±á¬ááºážáááºá¡ááœááºá áááºáá¯ááºááá¯ááºáááº-
- áááºáááºáá»á¬ážááŸáá·áºá¡áá° ááá¯ááŸá±á¬ááºááŸá¯ááá¯áá«áá áºáá¯áá¯á¶ážááᯠáá°ážáá°áá«á (áá«á á¡áá¬áááºááŸá¬ á¡áá¯ááºáááŒá áºááá¯ááºáá«áá°áž)
- ááá¯áá«ááᯠááá¯ááºáá»á¬ážááŒáá·áºáᬠáá°ážáá°áá«á ááá¯á·áá±á¬áºá€ááá á¹á ááœááºá áááºááẠfunction ááá¯áá áºááŒáááºáá¯ááºáá±á¬ááºáááºááá¯á¡ááºáááá·áºáááºá node.normalizeFilesInfo()á¡áá»ááºá¡áááºá¡á¬ážáá¯á¶ážááᯠááŒááºáááºááœááºáá»ááºááŒá®áž áá±áá¬áá±á·á áºáá²ááá¯á· ááá·áºáá«á
- function ááá¯áá¯á¶ážáá«á node.exportFiles()áááºážááẠááá¯ááºáá»á¬ážááᯠáá°ážáá°ááŒááºáž á áááºáááºááŒá áºáááºá
á¡ááŒá±áᶠnode áááºáááºáá»á¬áž
ááá¯ááŸá±á¬ááºááŸá¯ node ááá¯á
áááºáá±á¬á¡áá«á ááá¯á¡ááºáá±á¬áááºáááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠáááºáááºááŸááºááá¯ááºáááºá
á¡ááŒá±áá¶á¡áá»áá¯á¶ážááœá±ááᯠáá«áá±á¬áºááŒáááºá áá»ááºáá¬ááœá±ááᯠGithub ááŸá¬ ááŸá¬ááœá±á·ááá¯ááºáá«áááºá
- storage.data á¡ááœááºá¡á á¬áž â ááá¯ááºáá»á¬ážáá«ááŸááá±á¬ ááá¯ááºááœá²á á¡ááœááºá¡á á¬áž
- storage.tempSize - áá¬áá®ááá¯ááºááœá²á¡ááœááºá¡á á¬áž
- storage.autoCleanSize - ááááºážááááºážáá¬ážáááºááá¯á¡ááºáá±á¬ á¡áááºážáá¯á¶ážááá¯ááŸá±á¬ááºááŸá¯á¡ááœááºá¡á á¬ážá á¡áááºá áááºááẠá€ááá·áºáááºáá»ááºááᯠáááºááŸááºáá«áá áá±áá¬ááœááºá ááŒá¯áá¬áááºááŸáá·áºáááŒáá¯ááºáááºá á¡áá¯á¶ážá¡áááºážáá¯á¶ážááá¯ááºáá»á¬ážááᯠáá»ááºáá áºáááºááŒá áºáááºá
- file.maxSize - á¡áá»á¬ážáá¯á¶ážááá¯ááºá¡ááœááºá¡á á¬áž
- file.minSize - á¡áááºážáá¯á¶ážááá¯ááºá¡ááœááºá¡á á¬áž
- file.preferredDuplicates - ááœááºáááºáá±á«áºááŸá ááá¯ááºááœá¬ážáá»á¬áž ááŸá áºáááºáᬠá¡áá±á¡ááœááº
- file.mimeWhitelist - ááá¬ážáááºááá¯ááºá¡áá»áá¯ážá¡á á¬ážáá»á¬áž
- file.mimeBlacklist - áááŸááºáááºáá±á¬ ááá¯ááºá¡áá»áá¯ážá¡á á¬ážáá»á¬áž
- file.extWhitelist - ááŸááºáááºáá±á¬ááá¯ááºááá¯ážáá»á²á·ááŸá¯áá»á¬áž
- file.extBlacklist - áááŸááºáááºáá±á¬ ááá¯ááºááá¯ážáá»á²á·ááŸá¯áá»á¬áž
- file.linkCache - á¡áá»áá¯ážáá»áá¯ážáá±á¬ link caching áááºáááºáá»á¬áž
Dimens ááŸáá·áºáááºááá¯ááºááá·áº áá±á¬ááºá¡á¬ážáá¯á¶ážáá®ážáá«ážááᯠabsolute ááŸáá·áº relative values ââááŸá áºáá¯áá¯á¶ážááœáẠááá·áºááœááºážááá¯ááºáááºá
command line ááŸáááá·áºá¡áá¯ááºáá¯ááºáááºá
á
á¬ááŒáá·áºááá¯ááºááᯠcommand line ááŸáááá·áºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá áááºážááá¯áá¯ááºáá±á¬ááºááẠáááºááẠáááºážááᯠáá
áºááá¹áá¬áá¯á¶ážááœáẠááá·áºááœááºážááẠááá¯á¡ááºáááº- npm i -g storacle. áááºážááŒá®ážáá±á¬ááºá node ááŸáááá·áº ááá±á¬áá»ááºáááºážááœáŸááºá០ááá¯á¡ááºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáááºá
áááºááá¯ááºáááºá á¥ááá¬á¡á¬ážááŒááºá·, storacle -a storeFile -f ./file.txt -c ./config.jsááá¯ááºááá¯ááá·áºáááºá áá¯ááºáá±á¬ááºáá»ááºá¡á¬ážáá¯á¶ážááᯠááœá±á·ááá¯ááºáááºá
áá«ááᯠáá¬ááŒá±á¬áá·áº ááá¯á¡ááºááá¯ááºááá²á
- á¡áááºá áááºááẠá¡áááºááŒá±áá±á¬áááºážáááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááá¯ááºáá»á¬ážááŸáá·áº ááááºážáááºážáááºááŸáá·áº áá¯ááºáá±á¬ááºááẠá á®á ááºáá¬ážááá·áº áááá¯áá»á¯ááºááá¯ááºááŸá¯áá»áŸá±á¬á·áá»áá¬ážáá±á¬ ááá±á¬áá»ááºáá áºáá»áá¯ážááᯠáááºáá®ážááá¯áá«áá á¥ááá¬á¡á¬ážááŒáá·áºá áá±á¬ááºážáá«ážá¡á ááŸáááá·áºááºááœááºáá±á¬áºááŒáá¬ážáá±á¬áá®áááá±á¬áá»ááºááá¯á¡áá¯á¶ážááŒá¯áááºá ááá¯ááŸá±á¬ááºáá¯á¶.
- á¡áááºá áááºááẠááá¯ááºáá»á¬ážááᯠááŒáá·áºáá±áááºážááŒáá·áº ááááºážáááºážááẠááá¯á¡ááºááá·áº á¡ááŒá¬ážááá±á¬áá»ááºáá áºáá¯áá¯ááœáẠá¡áá¯ááºáá¯ááºáá«áá áááºáááááºáá¬ážáá±á¬ááœááºáááºááᯠá¡ááœááºááá°áááºáá±á¬ááºááá¯ááºáááºá node áá»á¬ážááᯠááá¯ááºáá»á±á¬áá®ááœá±ááŒá áºá¡á±á¬ááºááŒááºáááºááŒá®áž ááá¯á¡ááºááá·áºá¡áá« á¡áá áºáá»á¬ážááá¯ááá·áºááá¯ááºáááºá
- á¡áááºá áááºááẠááá·áºáááºááá¯ááºááá¯ááºáá»á¬ážááᯠáá áºáá±áá¬áá¬ááœáẠááááºážáááºážáá¬ážááẠááá¯á¡ááºááŒá®áž á¡áá¬á¡á¬ážáá¯á¶ážááᯠáááºááá¯ááºááá¯ááºáá±ážááẠá¡ááœááºáá»á¬ážáá±áá«áá á€á á¬ááŒáá·áºááá¯ááºááẠááá·áºááá á¹á ááœáẠá¡ááŒá¬ážáá°áá»á¬ážááẠááá¯ááá·áºáá»á±á¬áºáááºá
- ááá·áºááœáẠááá¯ááºáá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºááá·áº ááá±á¬áá»ááºáá áºáá¯ááŸááá»áŸááºáá±á¬áºáááºážáá±á¬ááºáž ááá±á¬ááºáá¬á០ááá¯ááºááœááºááŒá±ááŸááºážááŸá¯á¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºááá¯áá«áááºá áá¬áá¬áá¯ááºáá±ážááŒááºážááᯠááŸá±á¬ááºááŸá¬ážááá¯ááºáááºá
áá»áœááºá¯ááºááááºááœááºááẠ-
source: www.habr.com