Storacle - เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบŸเบฅเปŒเปเบšเบšเบเบฐเบˆเบฒเบ

Storacle - เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบŸเบฅเปŒเปเบšเบšเบเบฐเบˆเบฒเบ

เบเปˆเบญเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบญเบญเบเป„เบ› เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบกเบฑเบ™เบˆเบฐเปเบˆเป‰เบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบš.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเบˆเบฐเป€เบšเบดเปˆเบ‡เบŠเบฑเป‰เบ™เบ—เบตเปˆเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบŸเบฅเปŒ, เปเบฅเบฐเบงเบดเบ—เบตเบ—เบตเปˆเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เป‚เบ”เบเปƒเบœ. Storacle เปเบกเปˆเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เปเบšเบšเบ”เปˆเบฝเบง, เบšเปเปˆเบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบ”เบปเบ™เบ•เบต. เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบˆเบฑเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹เบเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบญเบ‡โ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เปƒเบ”โ€‹เบซเบ™เบถเปˆเบ‡โ€‹.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰ "เบกเป‰เบงเบ™เบ–เบฑเบ‡" เป€เบฅเบฑเบเบ™เป‰เบญเบ ipfs, เปเบ•เปˆเบ™เบตเป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เปเบ™เปˆเบ™เบญเบ™เปƒเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ‚เบญเบ‡เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบ‚เป‰เบญเบเบเปเบฒเบฅเบฑเบ‡เปเบเป‰เป„เบ‚. เป‚เบ”เบเบฅเบงเบก, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เป€เบขเบฑเบ™. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบกเบฑเบเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบ™เบตเป‰เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบ”เป‰เบ”เบตเบ‚เบถเป‰เบ™เปเบฅเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เป‚เบซเบผเบ”เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐ nodes เปเบฅเบฐเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบขเบนเปˆเปƒเบ™เบ‚เบญเบšเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบซเบ™เบถเปˆเบ‡, เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบšเปˆเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบญเบญเบเป€เบ›เบฑเบ™เบ•เปˆเบญเบ™เบ•เบฒเบกเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบšเบฒเบ‡เบขเปˆเบฒเบ‡, เบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เป‚เบซเบผเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ storacle เปƒเบŠเป‰เบเบปเบ™เป„เบ เบชเบฒเบกเบฒเบ”เปเบœเปˆเบ‚เบฐเบซเบเบฒเบเป„เบ”เป‰ เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบ. เบ„เบธเบ™โ€‹เบ™เบฐโ€‹เบชเบปเบกโ€‹เบšเบฑเบ”โ€‹เบ—เบตเปˆโ€‹เบชเปเบฒโ€‹เบ„เบฑเบ™โ€‹:

  • เป„เบŸเบฅเปŒเบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆ repository เบœเปˆเบฒเบ™ node เปƒเบ”.
  • เป„เบŸเบฅเปŒเบ–เบทเบเบšเบฑเบ™เบ—เบถเบเบ—เบฑเบ‡เบซเบกเบปเบ”, เบšเปเปˆเปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบšเบฅเบฑเบญเบ.
  • เปเบ•เปˆเบฅเบฐเป„เบŸเบฅเปŒเบกเบต hash เป€เบ™เบทเป‰เบญเบซเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบ•เปเปˆเป„เบ›เบเบฑเบšเบกเบฑเบ™.
  • เป„เบŸเบฅเปŒเบชเบฒเบกเบฒเบ”เบ–เบทเบเบŠเป‰เปเบฒเบเบฑเบ™เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบทเบซเบผเบฒเบเบ‚เบถเป‰เบ™
  • เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เปƒเบ™โ€‹เบซเบ™เบถเปˆเบ‡ node เปเบกเปˆเบ™โ€‹เบˆเปเบฒโ€‹เบเบฑเบ”โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เป‚เบ”เบโ€‹เบฅเบฐโ€‹เบšเบปเบšโ€‹เป„เบŸเบฅโ€‹เปŒ (เบกเบตโ€‹เบ‚เปเป‰โ€‹เบเบปเบโ€‹เป€เบงเบฑเป‰เบ™โ€‹, เป€เบžเบตเปˆเบกโ€‹เป€เบ•เบตเบกโ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ‚เป‰เบฒเบ‡โ€‹เบฅเบธเปˆเบกโ€‹เบ™เบตเป‰โ€‹)
  • เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เป„เบŸเบฅเปŒเปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ–เบทเบเบˆเปเบฒเบเบฑเบ”เป‚เบ”เบเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เปเบœเปˆเบเบฐเบˆเบฒเบเป„เบ”เป‰เบ•เบฒเบกเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ nodes เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เป€เบŠเบดเปˆเบ‡เปƒเบ™เบชเบฐเบšเบฑเบšเบ—เบตเบชเบญเบ‡เบˆเบฐเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบˆเปเบฒเบ™เบงเบ™ nodes เบ—เบตเปˆเบšเปเปˆเบกเบตเบ‚เบญเบšเป€เบ‚เบ” (เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบญเบทเปˆเบ™)

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เบˆเบฒเบเป‚เบ„เบ‡เบเบฒเบ™:

เป€เบŠเบตเบšเป€เบงเบต:

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);
  }
})();

เป€เบšเบดเปˆเบ‡เบžเบฒเบเปƒเบ™

เบšเปเปˆโ€‹เบกเบตโ€‹เบซเบเบฑเบ‡ fancy เบžเบฒเบโ€‹เปƒเบ•เป‰โ€‹เบเบฒเบ™ Hood เป„เบ”เป‰โ€‹. เบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เป„เบŸเบฅเปŒ, เบ‚เบฐเบซเบ™เบฒเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปเบฅเบฐเบˆเบธเบ”เบญเบทเปˆเบ™เป†เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบฅเบฐเบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡เป€เบกเบทเปˆเบญเป„เบŸเบฅเปŒเบ–เบทเบเบฅเบถเบšเปเบฅเบฐเป€เบžเบตเปˆเบก, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบฅเบฐเบšเบปเบšเป„เบŸเบฅเปŒเป€เบฅเบทเป‰เบญเบเป†. เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เปเบกเปˆเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เบ•เบปเบงเป€เบเบฑเบšเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เปเบœเปˆเบเบฐเบˆเบฒเบเป„เบŸเบฅเปŒเป€เบกเบทเปˆเบญเป€เบ–เบดเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™, เปเบฅเบฐเบšเปเปˆเบซเป‰เบฒเบกเบเบฒเบ™เป€เบžเบตเปˆเบกเบญเบฑเบ™เปƒเบซเบกเปˆ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบ‚เป‰เบฒเบกเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ, เปเบฅเบฐเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป„เบŸเบฅเปŒเบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบ (> เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบฅเป‰เบฒเบ™) เบชเบฒเบกเบฒเบ”เบ™เปเบฒเป„เบ›เบชเบนเปˆเบเบฒเบ™เป‚เบซเบผเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™. เปเบฅเบฐเบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบŸเบฅเปŒเบซเบ™เป‰เบญเบเบฅเบปเบ‡เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ nodes เบซเบผเบฒเบ. เบ–เป‰เบฒ "เป€เบ„เบทเปˆเบญเบ‡เป€เบฎเบฑเบ”เบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”" เบ–เบทเบเบ›เบดเบ”, เบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง.

เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบŸเบฅเปŒเบ›เบฐเบเบญเบšเบ”เป‰เบงเบ 256 เป‚เบŸเบ™เป€เบ”เบตเปเบฅเบฐ 2 เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡เบฎเบฑเบ‡. เป„เบŸเบฅเปŒเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เป‚เบŸเบ™เป€เบ”เบตเบฅเบฐเบ”เบฑเบšเบ—เบตเบชเบญเบ‡. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ–เป‰เบฒเบกเบต 1 เบฅเป‰เบฒเบ™. เบกเบฑเบ™เบˆเบฐเบกเบตเบ›เบฐเบกเบฒเบ™ 62500 เป„เบŸเบฅเปŒเปƒเบ™เปเบ•เปˆเบฅเบฐเป‚เบŸเป€เบ”เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง (1000000 / sqrt(256)).

เบŠเบทเปˆเป‚เบŸเบ™เป€เบ”เบตเบ–เบทเบเบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบ‚เบถเป‰เบ™เบˆเบฒเบเป„เบŸเบฅเปŒ hash เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเบซเบฒเบกเบฑเบ™เป„เบ”เป‰เป„เบงเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบฎเบนเป‰เบˆเบฑเบ hash.

เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเป€เบฅเบทเบญเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบฒเบ: เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบฅเบฐเบšเบปเบšเป„เบŸเบฅเปŒเบ—เบตเปˆเบญเปˆเบญเบ™เปเบญ, เบšเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบกเบตเป„เบŸเบฅเปŒเบซเบผเบฒเบเปƒเบ™เป‚เบŸเบ™เป€เบ”เบตเบ”เบฝเบง, เบเบฒเบ™เป‚เบญเบ™เบเป‰เบฒเบเป„เบงเบ‚เบญเบ‡เป‚เบŸเบ™เป€เบ”เบตเบ—เบฑเบ‡เบซเบกเบปเบ”เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบšเบฒเบ‡เบŠเบฐเบ™เบดเบ”เบ‚เบญเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบ—เบญเบ‡.

เบเบฒเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™

เป€เบกเบทเปˆเบญเป€เบžเบตเปˆเบกเป„เบŸเบฅเปŒ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเป€เบกเบทเปˆเบญเป„เบ”เป‰เบฎเบฑเบšเบžเบงเบเบกเบฑเบ™, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป„เบŸเบฅเปŒเบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™เปเบ„เบ”.
เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เป€เบฅเบทเป‰เบญเบเป†เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบœเปˆเบฒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบเบฒเบ™เบŠเบญเบเบซเบฒเป„เบŸเบฅเปŒ. เบ™เบตเป‰เป€เบฅเบฑเปˆเบ‡เบเบฒเบ™เบฎเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบฅเบฐเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ. Caching เบเบฑเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป‚เบ”เบเบœเปˆเบฒเบ™ http headers.

Isomorphy

เบฅเบนเบเบ„เป‰เบฒเบ–เบทเบเบ‚เบฝเบ™เปƒเบ™ javascript เปเบฅเบฐเป€เบ›เบฑเบ™ isomorphic, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบเบปเบ‡เบˆเบฒเบเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš. 
เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเบฑเบšเป‚เบซเบฅเบ”เป„เบŸเบฅเปŒ https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js เป€เบ›เบฑเบ™ script เปเบฅเบฐเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ window.ClientStoracle เบซเบผเบทเบ™เปเบฒเป€เบ‚เบปเป‰เบฒเป‚เบ”เบเบœเปˆเบฒเบ™เบฅเบฐเบšเบปเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡, เปเบฅเบฐเบญเบทเปˆเบ™เป†.

เบฅเบดเป‰เบ‡เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ

เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปเบกเปˆเบ™ "เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ". เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป„เบŸเบฅเปŒเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบš synchronously, เบ—เบตเปˆเบ™เบตเป‰เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เปเบฅเบฐเป„เบŸเบฅเปŒเบˆเบฐเบ–เบทเบเบ”เบถเบ‡เบ‚เบถเป‰เบ™เป€เบกเบทเปˆเบญเบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเบ”เบงเบเบซเบผเบฒเบเป€เบกเบทเปˆเบญ, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเบฐเปเบ”เบ‡เบฎเบนเบšเบžเบฒเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒ. เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเปƒเบชเปˆเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เบฅเบปเบ‡เปƒเบ™ src เปเบฅเบฐเบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบกเบฑเบ™. เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบกเบฒโ€‹เป€เบ–เบดเบ‡โ€‹เบเบฑเบšโ€‹เบซเบผเบฒเบโ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹.

API เบฅเบนเบเบ„เป‰เบฒ

  • async Client.prototype.storeFile() - เบŠเปˆเบงเบโ€‹เบ›เบฐโ€‹เบขเบฑเบ”โ€‹เป„เบŸเบฅโ€‹เปŒโ€‹
  • async Client.prototype.getFileLink() โ€” เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เป‚เบ”เบโ€‹เบเบปเบ‡โ€‹เบเบฑเบšโ€‹เป„เบŸเบฅโ€‹เปŒโ€‹
  • async Client.prototype.getFileLinks() โ€” เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เป‚เบ”เบโ€‹เบเบปเบ‡โ€‹เบเบฑเบšโ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เบˆเบฒเบโ€‹เบ‚เปเป‰โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบ—เบตเปˆโ€‹เบกเบฑเบ™โ€‹เบกเบตโ€‹เบขเบนเปˆโ€‹
  • async Client.prototype.getFileToBuffer() - เป€เบญเบปเบฒเป„เบŸเบฅเปŒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ buffer
  • async Client.prototype.getFileToPath() - เป€เบญเบปเบฒเป„เบŸเบฅเปŒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฐเบšเบปเบšเป„เบŸเบฅเปŒ
  • async Client.prototype.getFileToBlob() - เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เปƒเบ™ blob (เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบ•เบปเบงโ€‹เบ—เปˆเบญเบ‡โ€‹เป€เบงเบฑเบšโ€‹)
  • async Client.prototype.removeFile() - เบฅเบถเบšโ€‹เป„เบŸเบฅโ€‹เปŒโ€‹
  • Client.prototype.createRequestedFileLink() โ€” เบชเป‰เบฒเบ‡โ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เบ—เบตเปˆโ€‹เบŠเบฑเบโ€‹เบŠเป‰เบฒโ€‹

เบชเบปเปˆเบ‡เบญเบญเบเป„เบŸเบฅเปŒเป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบญเบทเปˆเบ™

เป€เบžเบทเปˆเบญเป‚เบญเบ™เป„เบŸเบฅเปŒเป„เบ›เบซเบฒ node เบญเบทเปˆเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”:

  • เบžเบฝเบ‡เปเบ•เปˆเบ„เบฑเบ”เบฅเบญเบเป‚เบŸเป€เบ”เบตเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบžเป‰เบญเบกเบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ. (เบญเบฑเบ™เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”)
  • เบ„เบฑเบ”เบฅเบญเบเบžเบฝเบ‡เปเบ•เปˆเป‚เบŸเบ™เป€เบ”เบตเบ—เบตเปˆเบกเบตเป„เบŸเบฅเปŒ. เปเบ•เปˆ, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ„เบฑเป‰เบ‡ node.normalizeFilesInfo()เป€เบžเบทเปˆเบญเบ„เบดเบ”เป„เบฅเปˆเบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเปƒเบชเปˆเบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.
  • เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ node.exportFiles()เป€เบŠเบดเปˆเบ‡เบˆเบฐเป€เบฅเบตเปˆเบกเบเบฒเบ™เบชเบณเป€เบ™เบปเบฒเป„เบŸเบฅเปŒ.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบซเบ™เบ”เบžเบทเป‰เบ™เบ–เบฒเบ™
เป€เบกเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ node เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”.
เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบชเบธเบ”, เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบชเบฒเบกเบฒเบ”เบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™ Github.

  • storage.dataSize โ€” เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ‚เบญเบ‡โ€‹เป‚เบŸเบ™โ€‹เป€เบ”เบตโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เป„เบŸเบฅโ€‹เปŒโ€‹
  • storage.tempSize - เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เป‚เบŸโ€‹เป€เบ”เบตโ€‹เบŠเบปเปˆเบงโ€‹เบ„เบฒเบงโ€‹
  • storage.autoCleanSize โ€” เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ•เปเบฒโ€‹เปˆโ€‹เบชเบธเบ”โ€‹เบ—เบตเปˆโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ–เบทโ€‹. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบฅเบฐเบšเบธเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ™เบตเป‰, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเบžเบทเป‰เบ™เบ—เบตเปˆเป€เบฅเบตเปˆเบกเบซเบกเบปเบ”, เป„เบŸเบฅเปŒเบ—เบตเปˆเปƒเบŠเป‰เบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เบˆเบฐเบ–เบทเบเบฅเบถเบšเบ–เบดเป‰เบก.
  • file.maxSize - เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เบชเบนเบ‡โ€‹เบชเบธเบ”โ€‹
  • file.minSize - เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เบ•เปเบฒโ€‹เปˆโ€‹เบชเบธเบ”โ€‹เบ—เบตเปˆโ€‹
  • file.preferredDuplicates โ€” เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ—เบตเปˆโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เป€เบญโ€‹เบเบฐโ€‹เบชเบฒเบ™โ€‹เบŠเปเป‰เบฒโ€‹เบเบฑเบ™โ€‹เปƒเบ™โ€‹เป€เบ„เบทเบญโ€‹เบ‚เปˆเบฒเบโ€‹
  • file.mimeWhitelist - เบ›เบฐเป€เบžเบ”เป„เบŸเบฅเปŒเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡
  • file.mimeBlacklist - เบ›เบฐเป€เบžเบ”เป„เบŸเบฅเปŒเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡
  • file.extWhitelist - เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเป„เบŸเบฅเปŒเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡
  • file.extBlacklist - เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเป„เบŸเบฅเปŒเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡
  • file.linkCache - เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบ–เบฒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบˆเปเบฒโ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เบ•เปˆเบฒเบ‡เป†โ€‹

เป€เบเบทเบญเบšเบ—เบธเบเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบชเบฒเบกเบฒเบ”เบ–เบทเบเปƒเบชเปˆเปƒเบ™เบ—เบฑเบ‡เบ„เปˆเบฒเบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡เปเบฅเบฐเบ„เปˆเบฒเบžเบตเปˆเบ™เป‰เบญเบ‡.

เป€เบฎเบฑเบ”เบงเบฝเบเบœเปˆเบฒเบ™เป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡
เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบœเปˆเบฒเบ™เป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เบ—เบปเปˆเบงเป‚เบฅเบ: npm i -g storacle. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบตเบ”เบ•เบปเบงเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบˆเบฒเบเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเป‚เบ„เบ‡เบเบฒเบ™เบšเปˆเบญเบ™เบ—เบตเปˆ node เปเบกเปˆเบ™. เบเบปเบโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡, storacle -a storeFile -f ./file.txt -c ./config.jsเป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเป„เบŸเบฅเปŒ. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบฒเบกเบฒเบ”เบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™ https://github.com/ortexx/storacle/blob/master/bin/actions.js

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบฑเบ™เบ™เบตเป‰?

  • เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบšเบฒเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เปเบšเปˆเบ‡เบ‚เบฑเป‰เบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบงเบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบˆเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเปเบฅเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป„เบŸเบฅเปŒเป‚เบ”เบเปƒเบŠเป‰เบงเบดเบ—เบตเบ—เบตเปˆเบชเบฐเบ”เบงเบ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เป‚เบ„เบ‡เบเบฒเบ™เบ”เบปเบ™เบ•เบตเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเปƒเบŠเป‰ เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™.
  • เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบŸเบฅเปŒเปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเปเบˆเบเบขเบฒเบ. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ›เบดเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ, เบ›เบฑเบšเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ™เบ”เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™ เปเบฅเบฐเป€เบžเบตเปˆเบกเบญเบฑเบ™เปƒเปเปˆเป€เบกเบทเปˆเบญเบ•เป‰เบญเบ‡เบเบฒเบ™.
  • เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบŸเบฅเปŒเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบšเปˆเบญเบ™เบซเบ™เบถเปˆเบ‡เปเบฅเบฐเบกเบฑเบ™เบซเบผเบฒเบเป€เบเบตเบ™เป„เบ›เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡. เบšเบฒเบ‡เบ—เบตเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ™เบตเป‰ เป€เปเบฒเบฐ เบชเบปเบกเบเบงเปˆเบฒเบšเปˆเบญเบ™เบญเบทเปˆเบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ.
  • เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป„เบŸเบฅเปŒ, เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบซเบกเบนเบ™เปƒเบŠเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฒเบเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เป€เบŠเบตเบŸเป€เบงเบต.

เบฅเบฒเบเบŠเบทเปˆเบœเบนเป‰เบ•เบดเบ”เบ•เปเปˆเบ‚เบญเบ‡เบ‚เป‰เบญเบ:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™