Skip to content

Latest commit

ย 

History

History
481 lines (364 loc) ยท 29.1 KB

File metadata and controls

481 lines (364 loc) ยท 29.1 KB

Mobiletto

Mobiletto ืื™ื– ืึท ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ ืกื˜ืึธืจื™ื“ื–ืฉ ืึทื‘ืกื˜ืจืึทืงืฉืึทืŸ ืฉื™ื›ื˜ืข, ืžื™ื˜ ืึทืคึผืฉืึทื ืึทืœ ื˜ืจืึทื ืกืคึผืขืจืึทื ื˜ ืงืœื™ืขื ื˜-ื–ื™ื™ึทื˜ ืขื ืงืจื™ืคึผืฉืึทืŸ.

ืื™ื ื”ืึทืœื˜

ืœื™ื™ืขื ืขืŸ ื“ืขื ืื™ืŸ ืืŸ ืื ื“ืขืจ ืฉืคึผืจืึทืš

ื“ืขื README.md ื“ืึธืงื•ืžืขื ื˜ ืื™ื– ืื™ื‘ืขืจื’ืขื–ืขืฆื˜, ื“ื•ืจืš hokeylization, ืื™ืŸ ื™ืขื“ืขืจ ืฉืคึผืจืึทืš ื’ืขืฉื˜ื™ืฆื˜ ื“ื•ืจืš Google Translate!

ืื™ืš ื‘ื™ืŸ ื–ื™ื›ืขืจ ืึทื– ืขืก ืื™ื– ื ื™ืฉื˜ ื’ืื ืฅ, ืึธื‘ืขืจ ืื™ืš ื”ืึธืคึฟืŸ ืขืก ืื™ื– ื‘ืขืกืขืจ ื•ื•ื™ ื’ืึธืจื ื™ืฉื˜!

๐Ÿ‡ธ๐Ÿ‡ฆ ืึทืจืึทื‘ื™ืฉ ๐Ÿ‡ง๐Ÿ‡ฉ ื‘ืขื ื’ืึทืœื™ืฉ ๐Ÿ‡ฉ๐Ÿ‡ช ื“ื™ื™ึทื˜ืฉ ๐Ÿ‡บ๐Ÿ‡ธ ืขื ื’ืœื™ืฉ ๐Ÿ‡ช๐Ÿ‡ธ ืฉืคึผืึทื ื™ืฉ ๐Ÿ‡ซ๐Ÿ‡ท ืคืจืื ืฆื•ื™ื–ื™ืฉ ๐Ÿ‡น๐Ÿ‡ฉ Hausa ๐Ÿ‡ฎ๐Ÿ‡ณ ื”ื™ื ื“ื™ืฉ ๐Ÿ‡ฎ๐Ÿ‡ฉ ืื™ื ื“ืึธื ืขื–ื™ืฉ ๐Ÿ‡ฎ๐Ÿ‡น ืื™ื˜ืึทืœื™ืขื ื™ืฉ ๐Ÿ‡ฏ๐Ÿ‡ต ื™ืึทืคึผืึทื ื™ืฉ ๐Ÿ‡ฐ๐Ÿ‡ท ืงืึธืจืขื™ึดืฉ ๐Ÿ‡ฎ๐Ÿ‡ณ Marathi ๐Ÿ‡ต๐Ÿ‡ฑ ืคื•ื™ืœื™ืฉ ๐Ÿ‡ง๐Ÿ‡ท ืคึผืึธืจื˜ื•ื’ืขื–ื™ืฉ ๐Ÿ‡ท๐Ÿ‡บ ืจื•ืกื™ืฉ ๐Ÿ‡ฐ๐Ÿ‡ช ืกื•ื•ืึทื”ื™ืœื™ ๐Ÿ‡ต๐Ÿ‡ญ Tagalog ๐Ÿ‡น๐Ÿ‡ท ื˜ืขืจืงื™ืฉ ๐Ÿ‡ต๐Ÿ‡ฐ ืื•ืจื“ื• ๐Ÿ‡ป๐Ÿ‡ณ ื•ื•ื™ืขื˜ื ืึทืžืขื–ื™ืฉ ๐Ÿ‡จ๐Ÿ‡ณ ื›ื™ื ืขื–ื™ืฉ

ืื™ื– ืขืก ืึท ืคึผืจืึธื‘ืœืขื ืžื™ื˜ ื“ืขื ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืคื•ืŸ ื“ื™ README?

ื“ื™ ื‘ืึทื–ื•ื ื“ืขืจ ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืคื•ืŸ ื“ืขืจ ืึธืจื™ื’ื™ื ืขืœ README ืงืขืŸ ื–ื™ื™ืŸ ืคืœืึธื– - * ืงืขืจืขืงืฉืึทื ื– ื–ืขื ืขืŸ ื–ื™ื™ืขืจ ื‘ืึทื’ืจื™ืกืŸ!* ื‘ื™ื˜ืข ืฉื™ืงืŸ ืึท ืฆื™ืขืŸ ื‘ืขื˜ืŸ ืื•ื™ืฃ ื’ื™ื˜ื”ื•ื‘, ืึธื“ืขืจ ืื•ื™ื‘ ืื™ืจ ื–ืขื ื˜ ื ื™ืฉื˜ ื‘ืึทืงื•ื•ืขื ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืขืคืขื ืขืŸ ืึทืŸ ืึทืจื•ื™ืกื’ืขื‘ืŸ

ื•ื•ืขืŸ ืื™ืจ ืฉืึทืคึฟืŸ ืึท ื ื™ื™ึทืข GitHub ืึทืจื•ื™ืกื’ืขื‘ืŸ ื•ื•ืขื’ืŸ ืึท ืื™ื‘ืขืจื–ืขืฆื•ื ื’, ื‘ื™ื˜ืข ื˜ืึธืŸ:

  • ืึทืจื™ื™ึทื ื ืขืžืขืŸ ื“ื™ URL ืคื•ืŸ ื“ื™ ื‘ืœืึทื˜ (ืงืึธืคึผื™ / ืคึผืึทืคึผ ืคื•ืŸ ื“ืขื ื‘ืœืขื˜ืขืจืขืจ ืึทื“ืจืขืก ื‘ืึทืจ)
  • ืึทืจื™ื™ึทื ื ืขืžืขืŸ ื“ื™ ืคึผื™ื ื˜ืœืขืš ื˜ืขืงืกื˜ ื•ื•ืึธืก ืื™ื– ืคืึทืœืฉ (ืงืึธืคึผื™ / ืคึผืึทืคึผ ืคื•ืŸ ื‘ืœืขื˜ืขืจืขืจ)
  • ื‘ื™ื˜ืข ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื•ื•ืึธืก ืื™ื– ืคืึทืœืฉ - ืื™ื– ื“ื™ ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืคืึทืœืฉ? ืื™ื– ื“ื™ ืคืึธืจืžืึทื˜ื˜ื™ื ื’ ืขืคืขืก ืฆืขื‘ืจืื›ืŸ?
  • ื‘ื™ื˜ืข ืคืึธืจืฉืœืึธื’ืŸ ืึท ืคืึธืจืฉืœืึธื’ ืคื•ืŸ ืึท ื‘ืขืกืขืจ ืื™ื‘ืขืจื–ืขืฆื•ื ื’, ืึธื“ืขืจ ื•ื•ื™ ื“ืขืจ ื˜ืขืงืกื˜ ื–ืึธืœ ื–ื™ื™ืŸ ืจืขื›ื˜ ืคืึธืจืžืึทื˜ื˜ืขื“
  • ืื“ืื ืง!

ืคืืจื•ื•ืืก ืžืึธื‘ื™ืœืขื˜ื˜ืึธ?

ื–ื™ื™ึท ื’ืขื–ื•ื ื˜ ืคืึทืจืงื•ื™ืคืขืจ ืฉืœืึธืก-ืื™ืŸ!

ื“ื™ ืคืึทืจืฉื™ื“ืŸ ื•ื•ืึธืœืงืŸ ืกื˜ืึธืจื™ื“ื–ืฉ ืคึผืจืึทื•ื•ื™ื™ื“ืขืจื– ื”ืึธื‘ืŸ ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืึทืคึผื™ืก. ืืคื™ืœื• ื“ื™ ื•ื•ืึธืก ืฉื˜ืจืขื‘ืŸ ืคึฟืึทืจ "S3 ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™" ื”ืึธื‘ืŸ ืื™ื“ื™ืึธืกื™ื ืงืจืึทื˜ื™ืง ื‘ื™ื›ื™ื™ื•ื•ื™ืขืจื–.

ื•ื•ืขืŸ ืื™ืจ ืงืœื™ื™ึทื‘ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืกื˜ืึธืจื™ื“ื–ืฉ ืคืึทืจืงื•ื™ืคืขืจ ืคึฟืึทืจ ื“ื™ื™ืŸ ืึทืคึผ, ืื•ื™ื‘ ืื™ืจ ืงืึธื“ ื’ืœื™ื™ึทืš ืฆื• ื–ื™ื™ืขืจ ืึทืคึผื™, ื“ื™ื™ืŸ ืึทืคึผ ืื™ื– ืื™ืฆื˜ ืึธืคืขื ื’ื™ืง ืื•ื™ืฃ ื“ืขื ื“ื™ื ืกื˜. ื•ื•ื™ ืฆื™ื™ื˜ ื’ื™ื™ื˜ ื“ื•ืจืš ืื•ืŸ ืงืึธื“ ืึทืงื™ื•ืžื™ืึทืœื™ื™ืฅ, ื˜ืฉืึทื ื’ื™ื ื’ ื•ื•ืขื ื“ืึธืจืก ื•ื•ืขืจื˜ ื™ื ืงืจื™ืกื™ื ื’ืœื™ ืึทื ื˜ืขื ืึทื‘ืึทืœ. ื‘ืจื•ื›ื™ื ื”ื‘ืื™ื ืฆื• ื“ืขืจ ืฉืคึผืึทืก ื•ื•ืขืœื˜ ืคื•ืŸ ืคืึทืจืงื•ื™ืคืขืจ ืฉืœืึธืก-ืื™ืŸ!

Mobiletto ืื™ื– ื“ื™ื–ื™ื™ื ื“ ืฆื• ืกืึธืœื•ื•ืข ื“ืขื ืคึผืจืึธื‘ืœืขื. ื“ื•ืจืš ืงืึธื•ื“ื™ื ื’ ื“ื™ื™ืŸ ืึทืคึผ ืฆื• Mobiletto's API, ืื™ืจ ืงืขื ืขืŸ ืœื™ื™ื›ื˜ ื˜ื•ื™ืฉืŸ ืกื˜ืึธืจื™ื“ื–ืฉ ืคึผืจืึทื•ื•ื™ื™ื“ืขืจื– ืื•ืŸ ื•ื•ื™ืกืŸ ืึทื– ื“ื™ ืกื˜ืึธืจื™ื“ื–ืฉ ืฉื™ื›ื˜ืข ืคื•ืŸ ื“ื™ื™ืŸ ืึทืคึผ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื™ื™ื“ืขื ื™ืงืึทืœ.

ื‘ืจื™ื™ื˜ืข ื˜ืขืกื˜ื™ื ื’

ืึทืœืข ื“ืจื™ื•ื•ืขืจืก ื–ืขื ืขืŸ ื˜ืขืกื˜ืขื“ ืคึฟืึทืจ ื™ื™ื“ืขื ื™ืงืึทืœ ื ืึทื˜ื•ืจ ืžื™ื˜ 60+ ื˜ืขืกืฅ ืคึฟืึทืจ ื™ืขื“ืขืจ ืฉืึธืคืขืจ. ืžื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืึทืœืข ื“ืจื™ื•ื•ืขืจืก ืžื™ื˜ ื™ืขื“ืขืจ ืงืึธืžื‘ื™ื ืึทืฆื™ืข ืคื•ืŸ:

  • ืขื ืงืจื™ืคึผืฉืึทืŸ: ื‘ื™ื™ื“ืข ืขื ื™ื™ื‘ืึทืœื“ ืื•ืŸ ืคืึทืจืงืจื™ืคึผืœื˜
  • ืจืขื“ื™ืก ืงืึทืฉ: ื‘ื™ื™ื“ืข ืขื ื™ื™ื‘ืึทืœื“ ืื•ืŸ ืคืึทืจืงืจื™ืคึผืœื˜

ื“ืขืจ ืฆื•ื’ืึทื ื’ ื’ื™ื˜ ืื•ื ื“ื– ืฉืœื•ื ืคื•ืŸ ืžื™ื™ื ื•ื ื’ ืึทื– ืžืึธื‘ื™ืœืขื˜ื˜ืึธ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ื™ ื–ืขืœื‘ืข ืจืึทื’ืึทืจื“ืœืึทืก ืคื•ืŸ ื•ื•ืึธืก ืฉืึธืคืขืจ ืื™ืจ ื ื•ืฆืŸ, ืื•ืŸ ืจืึทื’ืึทืจื“ืœืึทืก ืคื•ืŸ ืฆื™ ืื™ืจ ื’ืขื‘ืŸ ืงืึทื˜ืฉื™ื ื’ ืื•ืŸ / ืึธื“ืขืจ ืขื ืงืจื™ืคึผืฉืึทืŸ.

ื“ืจื™ื™ื•ื•ืขืจ ืฉื˜ื™ืฆืŸ

ืงืจืึทื ื˜ Mobiletto ืกื˜ืึธืจื™ื“ื–ืฉ ื“ืจื™ื•ื•ืขืจืก:

  • s3 : Amazon S3

  • b2 : Backblaze B2

  • local : ื”ื™ื’ืข ืคื™ืœืขืกื™ืกื˜ืขื

  • ืงืึทื ื˜ืจื™ื‘ื™ื•ืฉืึทื ื– ืฆื• ืฉื˜ื™ืฆืŸ ืžืขืจ ื•ื•ืึธืœืงืŸ ืกื˜ืึธืจื™ื“ื–ืฉ ืคึผืจืึทื•ื•ื™ื™ื“ืขืจื– ื–ืขื ืขืŸ ื–ื™ื™ืขืจ ื‘ืึทื’ืจื™ืกืŸ!*

ืžืึธื‘ื™ืœืขื˜ื˜ืึธ-ืงืœื™

Mobiletto ืื™ื– ื‘ื“ืขื” ืฆื• ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ื•ื•ื™ ืึท ื‘ื™ื‘ืœื™ืึธื˜ืขืง ื“ื•ืจืš ืื ื“ืขืจืข ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ ืงืึธื“.

ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ืžืึธื‘ื™ืœืขื˜ื˜ืึธ ื‘ื™ื™ ื“ื™ ื‘ืึทืคึฟืขืœืŸ ืฉื•ืจื”, ื ื•ืฆืŸ mobiletto-cli

ืžืงื•ืจ

ืฉื˜ื™ืฆืŸ ืื•ืŸ ืคืึทื ื“ื™ื ื’

ืื™ืš ื‘ื™ืŸ ื˜ืจื™ื™ื ื’ ืฆื• ื–ื™ื™ืŸ ืึท ืคืึทื›ืžืึทืŸ ืึธืคึฟืŸ ืžืงื•ืจ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจ. ืื™ืš ื”ืื‘ ื’ืขืืจื‘ืขื˜ ืื™ืŸ ื“ื™ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืื™ื ื“ื•ืกื˜ืจื™ืข ืคึฟืึทืจ ืคื™ืœืข ื™ืึธืจืŸ, ืื™ืš ื”ืึธื‘ืŸ ืกื˜ืึทืจื˜ืขื“ ืžืฆืœื™ื— ืงืึธืžืคึผืึทื ื™ืขืก ืื•ืŸ ืกืึธืœื“ ื–ื™ื™ ืฆื• ืฆื™ื‘ื•ืจ ืงืึธืžืคึผืึทื ื™ืขืก. ืœืขืฆื˜ื ืก ืื™ืš ืคืึทืจืคืึทืœืŸ ืžื™ื™ืŸ ืึทืจื‘ืขื˜, ืื•ืŸ ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื˜ืึทืงืข ื”ืึธื‘ืŸ ืงื™ื™ืŸ ืื ื“ืขืจืข ืึทืจื‘ืขื˜ ืœื™ื™ื ื“ ืึทืจื•ื™ืฃ

ืึทื–ื•ื™ ืื™ืš ื•ื•ืขืœ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื ื•ืฆื™ืง ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืื•ืŸ ื–ืขืŸ ืื•ื™ื‘ ื“ืึธืก ืึทืจื‘ืขื˜

ืื•ื™ื‘ ืื™ืจ ื”ื ืื” ื ื™ืฆืŸ ื“ืขื ื•ื•ื™ื™ื›ื•ื•ืืจื’, ืื™ืš ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ื–ื™ื™ืขืจ ื“ืึทื ืงื‘ืึทืจ ืคึฟืึทืจ ืืคื™ืœื• ื“ื™ ืงืœืขื ืกื˜ืขืจ ื›ื•ื™ื“ืขืฉืœืขืš ืฆื•ืฉื˜ื™ื™ึทืขืจ ื“ื•ืจืš Patreon

ืื“ืื ืง!

ื™ื ืกื˜ืึทืœื™ืจื•ื ื’

ื™ื ืกื˜ืึทืœื™ืจืŸ ืžื™ื˜ npm ืึธื“ืขืจ yarn . ืื™ืจ ืžื™ืกื˜ืึธืžืข ื•ื•ื™ืœืŸ ื“ื™ lite ื•ื•ืขืจืกื™ืข ื•ื•ืึธืก ื˜ื•ื˜ ื ื™ืฉื˜ ืึทืจื™ื™ึทื ื ืขืžืขืŸ ืึทืœืข ื“ื™ ืื™ื‘ืขืจื’ืขื–ืขืฆื˜ืข README ื˜ืขืงืขืก:

npm install mobiletto-lite
yarn add mobiletto-lite

ืื•ื™ื‘ ืื™ืจ ื˜ืึทืงืข ื•ื•ื™ืœืŸ ื“ื™ README ื˜ืขืงืขืก ืื™ืŸ ื™ืขื“ืขืจ ืฉืคึผืจืึทืš, ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ ืคื•ืœ ื•ื•ืขืจืกื™ืข:

npm install mobiletto
yarn add mobiletto

ืฉื ืขืœ ืึธื ื”ื™ื™ื‘

ื ืงื•ืจืฅ ื‘ื™ื™ึทืฉืคึผื™ืœ ื ื™ืฆืŸ ื“ื™ Mobiletto s3 ืฉืึธืคืขืจ.

ื“ืขืจ ืงืึธื“ ื•ื•ืึธืœื˜ ืœื•ื™ืคืŸ ื“ื™ ื–ืขืœื‘ืข ืื•ื™ื‘ ื“ืขืจ ืฉืึธืคืขืจ ืื™ื– ื’ืขื•ื•ืขืŸ b2 ืึธื“ืขืจ local .

const storage = require('mobiletto')
const bucket = await storage.connect('s3', aws_key, aws_secret, {bucket: 'bk'})

// list objects: returns array of metadata objects
const listing = await bucket.list()
const dirList = await bucket.list('some/dir/')
const everything = await bucket.list('', {recursive: true})

// write an entire file
let bytesWritten = await bucket.writeFile('some/path', someBufferOfData)

// write a file from a stream/generator
bytesWritten = await bucket.write('some/path', streamOrGenerator)

// read an entire file
// returns null if an exception would otherwise be thrown
const bufferOrNull = await bucket.safeReadFile('some/path')

// stream-read a file, passing data to callback
const bytesRead = await bucket.read('some/path', (chunk) => { ...do something with chunk... } )

// remove a file, returns the path removed
let removed = await bucket.remove('some/path') // removed is a string

// remove a directory, returns array of paths removed
removed = await bucket.remove('some/directory', {recursive: true}) // removed is now an array!

ื™ืงืขืจื“ื™ืง ื‘ืึทื ื™ืฅ

ื ืคื™ืœ ืžืขืจ ื‘ืจื™ื™ื˜ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื•ื•ื™ื™ื–ื•ื ื’ ืจื•ื‘ึฟ ืคื•ืŸ ื“ื™ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ื’ืขืคึฟื™ื ื˜:

const { mobiletto } = require('mobiletto')

// General usage
const api = await mobiletto(driverName, key, secret, opts)

// To use 'local' driver:
// * key: base directory
// * secret: ignored, can be null
// * opts object:
// * readOnly: optional, never change anything on the filesystem; default is false
// * fileMode: optional, permissions used when creating new files, default is 0600. can be string or integer
// * dirMode: optional, permissions used when creating new directories, default is 0700. can be string or integer
const local = await mobiletto('local', '/home/ubuntu/tmp', null, {fileMode: 0o0600, dirMode: '0700'})

// To use 's3' driver:
// * key: AWS Access Key ID
// * secret: AWS Secret Key
// * opts object:
// * readOnly: optional, never change anything on the bucket; default is false
// * bucket: required, name of the S3 bucket
// * region: optional, the AWS region to communicate with, default is us-east-1
// * prefix: optional, all read/writes within the S3 bucket will be under this prefix
// * delimiter: optional, directory delimiter, default is '/' (note: always '/' when encryption is enabled)
const s3 = await mobiletto('s3', aws_key, aws_secret, {bucket: 'bk', region: 'us-east-1'})

// To use 'b2' driver:
// * key: Backblaze Key ID
// * secret: Backblaze Application Key
// * opts object:
// * readOnly: optional, never change anything on the bucket; default is false
// * bucket: required, the ID (**not the name**) of the B2 bucket
// * prefix: optional, all read/writes within the B2 bucket will be under this prefix
// * delimiter: optional, directory delimiter, default is '/' (note: always '/' when encryption is enabled)
// * partSize: optional, large files will be split into chunks of this size when uploading
const b3 = await mobiletto('b2', b2_key_id, b2_app_key, {bucket: 'bk', partSize: 10000000})

// List files
api.list() // --> returns an array of metadata objects

// List files recursively
api.list({ recursive: true })

// List files in a directory
const path = 'some/path'
api.list(path)
api.list(path, { recursive: true }) // also supports recursive flag

// Visit files in a directory -- visitor function must be async
api.list(path, { visitor: myAsyncFunc })
api.list(path, { visitor: myAsyncFunc, recursive: true })

// The `list` method throws MobilettoNotFoundError if the path does not exist
// When you call `safeList` on a non-existent path, it returns an empty array
api.safeList('/path/that/does/not/exist') // returns []

// Read metadata for a file
api.metadata(path) // returns metadata object

// The `metadata` method throws MobilettoNotFoundError if the path does not exist
// When you call `safeMetadata` on a non-existent path, it returns null
api.safeMetadata('/tmp/does_not_exist') // returns null

// Read a file
// Provide a callback that writes the data someplace
const callback = (chunk) => { ... write chunk somewhere ... }
api.read(path, callback) // returns count of bytes read

// Read an entire file at once
const data = await api.readFile(path) // returns a byte Buffer of the file contents

// Read an entire file at once
// returns null if an exception would otherwise be thrown
const bufferOrNull = await bucket.safeReadFile('some/path')

// Write a file
// Provide a generator function that yields chunks of data
const generator = function* () {
  while ( ... more-data-to-return ... ) {
    data = ... load-data ...
    yield data
  }
}
local.api(path, generator) // returns count of bytes written

// Write an entire file at once (convenience method)
await api.writeFile(path, bufferOrString) // returns count of bytes written

// Delete a file
// Quiet param is optional (default false), when set errors will not be thrown if the path does not exist
// Always returns a value or throws an error.
// Return value may be a single string of the file removed, or an array of all files removed (driver-dependent)
const quiet = true
api.remove(path, {quiet}) // returns single path removed

// Recursively delete a directory and do it quietly (do not report errors)
const recursive = true
const quiet = true
api.remove(path, {recursive, quiet}) // returns array of paths removed

ืžืขื˜ืึทื“ืึทื˜ืึท

ื“ื™ metadata ื‘ืึทืคึฟืขืœ ืงืขืจื˜ ืžืขื˜ืึทื“ืึทื˜ืึท ื•ื•ืขื’ืŸ ืึท ืื™ื™ืŸ ื˜ืขืงืข ืกื™ืกื˜ืขื ืคึผืึธื–ื™ืฆื™ืข. ืคึผื•ื ืงื˜ ืึทื–ื•ื™, ื“ืขืจ ืฆื•ืจื™ืงืงืขืจ ื•ื•ืขืจื˜ ืคื•ืŸ ื“ื™ list ื‘ืึทืคึฟืขืœ ืื™ื– ืึท ืžืขื ื’ืข ืคื•ืŸ ืžืขื˜ืึทื“ืึทื˜ืึท ืึทื‘ื“ื–ืฉืขืงืฅ.

ื ืžืขื˜ืึทื“ืึทื˜ืึท ื›ื™ื™ืคืขืฅ ืงื•ืงื˜ ื•ื•ื™ ื“ืึธืก:

{
  "name": "fully/qualified/path/to/file",
  "type": "entry-type",
  "size": size-in-bytes,
  "ctime": creation-time-epoch-millis,
  "mtime": modification-time-epoch-millis
}

ื“ื™ type ืคืึทืจืžืึธื’ ืงืขื ืขืŸ ื–ื™ื™ืŸ file , dir , link ืึธื“ืขืจ special .

ื“ืขืคึผืขื ื“ื™ื ื’ ืื•ื™ืฃ ื“ืขื ื˜ื™ืคึผ ืคื•ืŸ ืฉืึธืคืขืจ, ืึท list ื‘ืึทืคึฟืขืœ ืงืขืŸ ื ื™ืฉื˜ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืึทืœืข ืคืขืœื“ืขืจ. ื“ื™ name ืื•ืŸ type ืคึผืจืึธืคึผืขืจื˜ื™ืขืก ื–ืึธืœ ืฉื˜ืขื ื“ื™ืง ื–ื™ื™ืŸ ืคืึธืจืฉื˜ืขืœืŸ. ื ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ metadata ื‘ืึทืคึฟืขืœ ื•ื•ืขื˜ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืึทืœืข ื‘ื ื™ืžืฆื ืคึผืจืึธืคึผืขืจื˜ื™ืขืก.

ืึธืœื˜ืขืจื ืึทื˜ื™ื•ื• ืึทืจื™ื™ึทื ืคื™ืจ ื ื•ืกื—

ืึทืจื™ื™ึทื ืคื™ืจ ื“ื™ ื’ืึธืจ- connect ืžืึธื“ื•ืœืข ืื•ืŸ ื ื•ืฆืŸ ื“ื™ 'ืคืึทืจื‘ื™ื ื“ืŸ' ืคึฟื•ื ืงืฆื™ืข:

const storage = require('mobiletto')
const opts = {bucket: 'bk', region: 'us-east-1'}
const s3 = await storage.connect('s3', aws_key, aws_secret, opts)
const objectData = await s3.readFile('some/path')

ืงืึทื˜ืฉื™ื ื’

Mobiletto ืึทืจื‘ืขื˜ ื‘ืขืกื˜ืขืจ ืžื™ื˜ ืึท ืจืขื“ื™ืก ืงืึทืฉ.

Mobiletto ื•ื•ืขื˜ ืคึผืจื•ื•ื•ืŸ ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ืฆื• ืึท ืจืขื“ื™ืก ื‘ื™ื™ึทืฉืคึผื™ืœ ืื•ื™ืฃ 127.0.0.1:6379

ืื™ืจ ืงืขื ืขืŸ ืึธื•ื•ื•ืขืจืจื™ื™ื“ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™:

  • ืฉื˜ืขืœืŸ ื“ื™ MOBILETTO_REDIS_HOST ืขื ื•ื• ื•ื•ืึทืจ, ืžืึธื‘ื™ืœืขื˜ ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ื“ืึธ ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ืœืึธืงืึทืœื”ืึธืกื˜
  • ืฉื˜ืขืœืŸ ื“ื™ MOBILETTO_REDIS_PORT ืขื ื•ื• ื•ื•ืึทืจ, ื“ืขื ืคึผืึธืจื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜

Mobiletto ื•ื•ืขื˜ ืงืจืึธื ืึทืœืข ื–ื™ื™ืŸ ืจืขื“ื™ืก ืฉืœื™ืกืœืขืŸ ืžื™ื˜ ื“ื™ ืคึผืจืขืคื™ืงืก _mobiletto__ . ืื™ืจ ืงืขื ืขืŸ ื˜ื•ื™ืฉืŸ ื“ืขื ื“ื•ืจืš ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ MOBILETTO_REDIS_PREFIX env var.

ืื™ืจ ืงืขื ืขืŸ ืื•ื™ืš ืฉื˜ืขืœืŸ ืคึผืขืจ-ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’ ืงืึทื˜ืฉื™ื ื’ ืžื™ื˜ ื“ื™ opts.redisConfig ื›ื™ื™ืคืขืฅ:

const redisConfig = {
    enabled: true, // optional, default is true. if false other props are ignored
    host: '127.0.0.1',
    port: 6379,
    prefix: '_mobiletto__'
}
const opts = { redisConfig, bucket: 'bk', region: 'us-east-1' }
const s3 = await storage.connect('s3', aws_key, aws_secret, opts)

ื“ื• ื–ืืœืกื˜ ื ื™ืฉื˜ ื•ื•ืขืœืŸ ืจืขื“ื™ืก ืงืึทื˜ืฉื™ื ื’?

ืฆื• ื“ื™ืกื™ื™ื‘ืึทืœ: ืคืึธืจืŸ enabled: false ืื™ืŸ ื“ื™ื™ืŸ opts.redisConfig ื›ื™ื™ืคืขืฅ ื•ื•ืขืŸ ืื™ืจ ืคืึทืจืœื™ื™ื’ืŸ ื“ื™ื™ืŸ ืงืฉืจ.

ื•ื•ื™ ื“ื™ืกืงืึทืกื˜ ืื•ื ื˜ืŸ, ื“ื™ืกื™ื™ื‘ืึทืœื™ื ื’ ืงืึทื˜ืฉื™ื ื’ ื•ื•ืขื˜ ื”ืึธื‘ืŸ ืึท ืึทื“ื•ื•ืขืจืก ื•ื•ื™ืจืงื•ื ื’ ืื•ื™ืฃ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื•ืŸ ื”ืึธื‘ืŸ ืžืขืจ ืจื™ืงื•ื•ืขืก ืฆื• ืกื˜ืึธืจื™ื“ื–ืฉ ืึทื– ืื™ืจ ื˜ืึทืงืข ื“ืึทืจืคึฟืŸ ืฆื•.

ืงืึทื˜ืฉื™ื ื’ ื’ื™ื™ื“ืึทื ืก

** ืขื ืงืจื™ืคึผื˜ื™ื“ ืกื˜ืึธืจื™ื“ื–ืฉ **: ืœื™ื™ืขื ืขืŸ / ืฉืจื™ื™ื‘ืŸ ืขื ืงืจื™ืคึผื˜ื™ื“ ืกื˜ืึธืจื™ื“ื–ืฉ ืื™ื– ื‘ืœื•ื™ื– ืึท ื‘ื™ืกืœ ืกืœืึธื•ืขืจ ื•ื•ื™ ื ืึธืจืžืึทืœ, ืึธื‘ืขืจ ื ืึทื•ื•ืึทื’ื™ื™ื˜ื™ื ื’ ืึทืจื•ื ื“ื™ื™ืจืขืงื˜ืขืจื™ื– (ื•ื•ืึธืก ืขื˜ืœืขื›ืข ื˜ื™ื ื’ื– ื˜ืึธืŸ) ืื™ื– ื’ืึทื ืฅ ื˜ื™ื™ึทืขืจ. ื ื™ืฆืŸ ืึท ืจืขื“ื™ืก ืงืึทืฉ ื•ื•ืขื˜ ื’ืขื‘ืŸ ืื™ืจ ืึท ื‘ืึทื˜ื™ื™ื˜ื™ืง ืคืึธืจืฉื˜ืขืœื•ื ื’ ื‘ื•ืกื˜.

ื“ื™ ืคืขืœื™ืงื™ื™ึทื˜ ืงืึทืฉ ืื™ื– ื–ื™ื›ืขืจ, ืึธื‘ืขืจ ื˜ื•ื˜ ื ื™ืฉื˜ ืึทืจื‘ืขื˜ืŸ ื’ืขื–ื•ื ื˜ ืื•ื™ื‘ ืื™ืจ ื”ืึธื‘ืŸ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืฉืจื™ื™ึทื‘ืŸ / ืึทืจืึธืคึผื ืขืžืขืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื–. ืงื™ื™ืŸ ืฉืจื™ื™ื‘ืŸ ืึธื“ืขืจ ืึทืจืึธืคึผื ืขืžืขืŸ ืึธืคึผืขืจืึทืฆื™ืข ื™ื ื•ื•ืึทืœืึทื“ื™ื™ืฅ ื“ื™ ื’ืื ืฆืข ืงืึทืฉ, ื™ื ืฉื•ืจื™ื ื’ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ืœื™ื™ืขื ืขืŸ ื•ื•ืขื˜ ื–ืขืŸ ื“ื™ ืœืขืฆื˜ ืขื ื“ืขืจื•ื ื’ืขืŸ.

CLI ืžื›ืฉื™ืจื™ื

ืื•ื™ื‘ ืื™ืจ ื ื•ืฆืŸ ืึท CLI ื’ืขืฆื™ื™ึทื’ ื•ื•ื™ mobiletto-cli, ืื™ืจ ื•ื•ืขื˜ ื‘ืืฉื˜ื™ืžื˜ ื•ื•ืขืœืŸ ื“ื™ ืจืขื“ื™ืก ืงืึทืฉ ืขื ื™ื™ื‘ืึทืœื“, ื•ื•ื™ื™ึทืœ ืขืก ืœืึทืกืฅ ืื™ื‘ืขืจ ื™ื ื•ื•ืึทืงื™ื™ืฉืึทื ื– ืคื•ืŸ ื“ื™ mo ื‘ืึทืคึฟืขืœ.

ืฉืคื™ื’ืœืขืŸ

// Copy a local filesystem mobiletto to S3
s3.mirror(local)

// Mirror a local subdirectory from one mobiletto to an S3 mobiletto, with it's own subdirectory
local.mirror(s3, 'some/local-folder', 'some/s3-folder')

ื“ืขืจ mirror ื‘ืึทืคึฟืขืœ ืคึผืขืจืคืึธืจืžื– ืึท ืื™ื™ืŸ ืžืึธืœ ืงืึธืคึผื™ืข ืคื•ืŸ ืึทืœืข ื˜ืขืงืขืก ืคื•ืŸ ืื™ื™ืŸ ืžืึธื‘ื™ืœืขื˜ื˜ืึธ ืฆื• ืื ื“ืขืจืŸ. ืขืก ื˜ื•ื˜ ื ื™ืฉื˜ ืœื•ื™ืคืŸ ืงื™ื™ืŸ ืคึผืจืึธืฆืขืก ืฆื• ื˜ื™ื™ึทื ืขืŸ ื“ืขืจ ืฉืคึผื™ื’ืœ ืื™ื‘ืขืจ ืฆื™ื™ึทื˜. ืœื•ื™ืคืŸ ื“ื™ mirror ื‘ืึทืคึฟืขืœ ื•ื•ื™ื“ืขืจ ืฆื• ืกื™ื ื’ืงืจืึทื ื™ื™ื– ืงื™ื™ืŸ ืคืขืœื ื“ื™ืง ื˜ืขืงืขืก.

ื“ืขืจ ืฆื•ืจื™ืงืงืขืจ ื•ื•ืขืจื˜ ืคื•ืŸ mirror ืื™ื– ืึท ืคึผืฉื•ื˜ ื›ื™ื™ืคืขืฅ ืžื™ื˜ ืงืึธื•ื ื˜ืขืจืก ืคึฟืึทืจ ื•ื•ื™ ืคื™ืœืข ื˜ืขืงืขืก ื–ืขื ืขืŸ ื”ืฆืœื—ื” ืžื™ืจืขืจื“ ืื•ืŸ ื•ื•ื™ ืคื™ืœืข ื˜ืขืงืขืก ื”ืึธื‘ืŸ ืขืจืจืึธืจืก:

{
  success: count-of-files-mirrored,
  errors: count-of-files-with-errors
}

ื•ื•ืืจืขื ื•ื ื’: ืžื™ืจืขืจื™ื ื’ ื’ืจื•ื™ืก ื“ืึทื˜ืŸ ืฉื˜ืขืœื˜ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื–ื™ื™ืขืจ ืฆื™ื™ื˜-ืงืึทื ืกื•ืžื™ื ื’ ืื•ืŸ ื‘ืึทื ื“ื•ื•ื™ื“ื˜-ืื™ื ื˜ืขื ืกื™ื•ื•ืข

ืžื™ื˜ ื“ื™ mirror ืจื•ืคืŸ ืกืขืžืึทื ื˜ื™ืงืก ืขืก ืงืขืŸ ืžืืœ ื–ื™ื™ืŸ ืงืึทื ืคื™ื•ื–ื™ื ื’ ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ืขืจ ืื™ื– ื“ืขืจ ืœื™ื™ืขื ืขืจ ืื•ืŸ ื•ื•ืขืจ ืื™ื– ื“ืขืจ ืฉืจื™ื™ื‘ืขืจ. ื™ืžืึทื“ื–ืฉืึทืŸ ืขืก ื•ื•ื™ ืึท ืึทืกื™ื™ื ืžืึทื ื˜ ื•ื™ืกื–ืึธื’ื•ื ื’: ื“ื™ "ืœื™ื ืงืก ืžืึธื‘ื™ืœืขื˜ื˜ืึธ" ืื™ื– ื“ื™ ื–ืึทืš ื•ื•ืึธืก ืื™ื– ืึทืกื™ื™ื ื“ ืฆื• (ืžื™ืจืขืจื“ ื“ืึทื˜ืŸ ื’ืขืฉืจื™ื‘ืŸ), ืื•ืŸ ื“ื™ "ืจืขื›ื˜-ื”ืึทื ื˜ ืžืึธื‘ื™ืœืขื˜ื˜ืึธ" (ื“ื™ ืึทืจื’ื•ืžืขื ื˜ ืฆื• ื“ืขืจ mirror ืื•ืคึฟืŸ) ืื™ื– ื“ื™ ื•ื•ืขืจื˜ ืึทืกื™ื™ื ื“ (ืžื™ืจืขืจื“ ื“ืึทื˜ืŸ ืื™ื– ืœื™ื™ืขื ืขืŸ).

ื˜ืจืึทื ืกืคึผืขืจืึทื ื˜ ืขื ืงืจื™ืคึผืฉืึทืŸ

ื’ืขื‘ืŸ ื˜ืจืึทื ืกืคึผืขืจืึทื ื˜ ืงืœื™ืขื ื˜-ื–ื™ื™ึทื˜ ืขื ืงืจื™ืคึผืฉืึทืŸ:

// Pass encryption parameters
const encryption = {
  // key is required, must be >= 16 chars
  key: randomstring.generate(128),

  // optional, the default is to derive IV from key
  // when set, IV must be >= 16 chars
  iv: randomstring.generate(128),

  // optional, the default is aes-256-cbc
  algo: 'aes-256-cbc'
}
const api = await mobiletto(driverName, key, secret, opts, encryption)

// Subsequent write operations will encrypt data (client side) when writing
// Subsequent read operations will decrypt data (client side) when reading

ื•ื•ืืก ื˜ื•ื˜ ื–ื™ืš? ื ื‘ืึทื–ื•ื ื“ืขืจ "ื“ืขืจื•ื•ื™ื™ึทื– ืคึผืึธื–ื™ืฆื™ืข" (ื“ื™ืจืขื ื˜) ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ (ืขื ืงืจื™ืคึผื˜ื™ื“) ื˜ืจืึทืงืก ื•ื•ืึธืก ื˜ืขืงืขืก ื–ืขื ืขืŸ ืื™ืŸ ื“ืขื ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ (ืึทืงืึท ื“ื™ ื“ื™ืจืขืงื˜ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ).

  • ื“ื™ list ื‘ืึทืคึฟืขืœ ืœื™ื™ืขื ื˜ ื“ื™ Directory ืคึผืึธื–ื™ืฆื™ืข ื˜ืขืงืขืก, ื“ืขืงืจื™ืคึผื˜ ื™ืขื“ืขืจ ื“ืจืš ืœื™ืกื˜ืขื“; ื“ืขืจื ืึธืš ืงืขืจื˜ ืžืขื˜ืึทื“ืึทื˜ืึท ืคึฟืึทืจ ื™ืขื“ืขืจ ื˜ืขืงืข
  • list ืงืึทืžืึทื ื“ื– ื–ืขื ืขืŸ ืžืขืจ ื‘ืึทื˜ืœืึธื ื™ืฉ, ืกืคึผืขืฆื™ืขืœ ืคึฟืึทืจ ื“ื™ื™ืจืขืงื˜ืขืจื™ื– ืžื™ื˜ ืึท ื’ืจื•ื™ืก ื ื•ืžืขืจ ืคื•ืŸ ื˜ืขืงืขืก
  • ื“ืขืจ write ื‘ืึทืคึฟืขืœ ืฉืจื™ื™ื‘ื˜ ื“ื™ืจืขืงื˜ ื˜ืขืงืขืก ืื™ืŸ ื“ื™ ื“ื™ืจืขืงื˜ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ืคื•ืŸ ื™ืขื“ืขืจ ืคืึธื˜ืขืจ, ืจืขืงื•ืจืกื™ื•ื•ืœื™; ื“ืขืžืึธืœื˜ ืฉืจื™ื™ื‘ื˜ ื“ื™ ื˜ืขืงืข
  • write ืงืึทืžืึทื ื“ื– ื•ื•ืขื˜ ืžืึทื›ืŸ ืึธ (ืขืŸ) ืฉืจื™ื™ื‘ื˜, ืžื™ื˜ N = ื˜ื™ืคืงื™ื™ึทื˜ ืื™ืŸ ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ื›ื™ื™ืขืจืึทืจืงื™
  • ื“ื™ remove ื‘ืึทืคึฟืขืœ ืจื™ืžื•ื•ื•ื– ื“ื™ ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ื“ื™ืจืขืงื˜ ื˜ืขืงืข, ืื•ืŸ ื–ื™ื™ืŸ ืคืึธื˜ืขืจ ืื•ื™ื‘ ืœื™ื™ื“ื™ืง, ืจืขืงื•ืจืกื™ื•ื•ืœื™; ื“ืขืžืึธืœื˜ ืจื™ืžื•ื•ื•ื– ื“ื™ ื˜ืขืงืข
  • ื ื™ื˜-ืจืขืงื•ืจืกื™ื•ื•ืข remove ืงืึทืžืึทื ื“ื– ื•ื•ืขื˜ ืžืึทื›ืŸ ืึธ (ืขืŸ) ืœื™ื™ืขื ื˜ ืื•ืŸ ืคึผืึทื˜ืขื ื˜ืฉืึทืœื™ ื•ื•ื™ ืคื™ืœืข ื“ื™ืœื™ืฅ, ืžื™ื˜ N = ื˜ื™ืคืงื™ื™ึทื˜ ืื™ืŸ ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ื›ื™ื™ืขืจืึทืจืงื™
  • ืจืขืงื•ืจืกื™ื•ื•ืข remove ืงืึทืžืึทื ื“ื– ืื•ื™ืฃ ื’ืจื•ื™ืก ืื•ืŸ ื˜ื™ืฃ ืคื™ืœืขืกื™ืกื˜ืขืžืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื˜ื™ื™ึทืขืจ

ื‘ืึทืžืขืจืงื•ื ื’ ืึทื– ืืคื™ืœื• ืžื™ื˜ ืขื ืงืจื™ืคึผืฉืึทืŸ ืคื•ืŸ ืงืœื™ืขื ื˜ ื–ื™ื™ึทื˜, ืึท ืงืขื’ื ืขืจ ืžื™ื˜ ืคื•ืœ ื•ื•ื™ื–ืึทื‘ื™ืœื™ื˜ื™ ืื™ืŸ ื“ื™ื™ืŸ ื™ื ืงืจื™ืคึผื˜ื™ื“ ืกืขืจื•ื•ืขืจ ื–ื™ื™ึทื˜ ืกื˜ืึธืจื™ื“ื–ืฉ, ืืคื™ืœื• ืึธืŸ ื“ื™ ืฉืœื™ืกืœ, ืงืขื ืขืŸ ื ืึธืš ื–ืขืŸ ื“ื™ ื’ืึทื ืฅ ื ื•ืžืขืจ ืคื•ืŸ ื“ื™ืจืขืงื˜ืขืจื™ื– ืื•ืŸ ื•ื•ื™ ืคื™ืœืข ื˜ืขืงืขืก ื–ืขื ืขืŸ ืื™ืŸ ื™ืขื“ืขืจ, ืื•ืŸ ืžื™ื˜ ืขื˜ืœืขื›ืข ืžื™, ืึทื ื˜ื“ืขืงืŸ ืขื˜ืœืขื›ืข ืึธื“ืขืจ ืึทืœืข ืคื•ืŸ ื“ื™ ืงื•ื™ืœืขืœื“ื™ืง ืกื˜ืจื•ืงื˜ื•ืจ ืคื•ืŸ ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ื›ื™ื™ืขืจืึทืจืงื™. ื‘ืึทืžืขืจืงื•ื ื’: ื ื™ืฆืŸ ืึท ืœืขืคื™ืขืจืขืš ืคืœืึทืš ืกื˜ืจื•ืงื˜ื•ืจ ืคึฟืึทืจ ื‘ืขืกืขืจ ื–ื™ื›ืขืจื”ื™ื™ื˜. ื“ืขืจ ืงืขื’ื ืขืจ ื•ื•ืึธืœื˜ ื ื™ืฉื˜ ื•ื•ื™ืกืŸ ื“ื™ ื ืขืžืขืŸ ืคื•ืŸ ื“ื™ ื“ื™ืจืขืงื˜ืขืจื™ื– / ื˜ืขืงืขืก ืื•ื™ื‘ ื–ื™ื™ ืื•ื™ืš ื•ื•ื™ืกืŸ ื“ื™ื™ืŸ ืขื ืงืจื™ืคึผืฉืึทืŸ ืฉืœื™ืกืœ ืึธื“ืขืจ ื”ืื˜ ืึทื ื“ืขืจืฉ ื”ืฆืœื—ื” ืงืจืึทืงื˜ ื“ื™ ืขื ืงืจื™ืคึผืฉืึทืŸ. ืึทืœืข ื‘ืขืฅ ื–ืขื ืขืŸ ืึทื•ื•ืขืง ื“ืขืžืึธืœื˜!

ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื•ืŸ ืงืึทื˜ืฉื™ื ื’

ืึธืคึผืขืจืึทื˜ื™ืึธื ืก ืื•ื™ืฃ ื™ื ืงืจื™ืคึผื˜ื™ื“ ืกื˜ืึธืจื™ื“ื–ืฉ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืคึผืึทืžืขืœืขืš. ืจืขืงื•ืจืกื™ื•ื•ืข ืœื™ืกื˜ื™ื ื’ืก ืื•ืŸ ืจื™ืžื•ื•ื•ืึทืœื– ืงืขื ืขืŸ ื–ื™ื™ืŸ ื–ื™ื™ืขืจ ืคึผืึทืžืขืœืขืš. ืงืึทื˜ืฉื™ื ื’ ื“ื•ืจืš ืจืขื“ื™ืก ื”ืขืœืคึผืก ื˜ืจื™ืžืขื ื“ืึทืกืœื™, ืึธื‘ืขืจ ื˜ืึธืŸ ืึทื– ื“ื™ ืงืึทืฉ ืื™ื– ืคืœืึทืฉื˜ ืื•ื™ืฃ ืงื™ื™ืŸ ืฉืจื™ื™ื‘ื˜ ืึธื“ืขืจ ืจื™ืžื•ื•ื•ื–.

ืฉืœื™ืกืœ ืจืึธื•ื˜ื™ื™ืฉืึทืŸ

ืฉืึทืคึฟืŸ ืึท ืžืึธื‘ื™ืœืขื˜ื˜ืึธ ืžื™ื˜ ื“ื™ื™ืŸ ื ื™ื™ึทืข ืฉืœื™ืกืœ, ืื•ืŸ ืฉืคึผื™ื’ืœ ื“ื™ ืึทืœื˜ ื“ืึทื˜ืŸ ืื™ืŸ ืขืก:

const storage = require('mobiletto')

const oldEncryption = { key: .... }
const oldStorage = await storage.connect('s3', aws_key, aws_secret, {bucket: 'bk', region: 'us-east-1'}, oldEncryption)

const newEncryption = { key: .... }
const newStorage = await storage.connect('s3', aws_key, aws_secret, {bucket: 'zz', region: 'us-east-1'}, newEncryption)

newStorage.mirror(oldStorage) // if oldStorage is very large, this may take a looooooong time...

ื“ืจื™ื™ื•ื•ืขืจ ืฆื•ื‘ื™ื ื“

ื ืฉืึธืคืขืจ ืื™ื– ืงื™ื™ืŸ JS ื˜ืขืงืข ื•ื•ืึธืก ืขืงืกืคึผืึธืจืฅ ืึท 'ืกื˜ืึธืจืึทื’ืขืงืœื™ืขื ื˜' ืคึฟื•ื ืงืฆื™ืข ืžื™ื˜ ื“ืขื ื›ืกื™ืžืข:

function storageClient (key, secret, opts)
  • key : ืึท ืฉื˜ืจื™ืงืœ, ื“ื™ื™ืŸ ืึทืคึผื™ ืฉืœื™ืกืœ (ืคึฟืึทืจ ื“ื™ local ืฉืึธืคืขืจ, ื“ืึธืก ืื™ื– ื“ื™ ื‘ืึทื–ืข ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ)
  • secret : ืึท ืฉื˜ืจื™ืงืœ, ื“ื™ื™ืŸ ืึทืคึผื™ ืกื•ื“ (ืงืขื ืขืŸ ื–ื™ื™ืŸ ืื™ื‘ืขืจื’ืขื”ื™ืคึผืขืจื˜ ืคึฟืึทืจ ื“ื™ local ื“ืจื™ื™ื•ื•ืขืจ)
  • opts : ืึท ื›ื™ื™ืคืขืฅ, ื“ื™ ืคึผืจืึธืคึผืขืจื˜ื™ืขืก ื–ืขื ืขืŸ ืคึผืขืจ ืฉืึธืคืขืจ:
  • ืคึฟืึทืจ local , ื“ื™ fileMode ืื•ืŸ dirMode ืคึผืจืึธืคึผืขืจื˜ื™ืขืก ื‘ืึทืฉื˜ื™ืžืขืŸ ื•ื•ื™ ื ื™ื™ึท ืงืจื™ื™ื™ื˜ื™ื ื’ ื˜ืขืงืขืก ืื•ืŸ ื“ื™ื™ืจืขืงื˜ืขืจื™ื– ื–ืขื ืขืŸ ื‘ืืฉืืคืŸ
  • ืคึฟืึทืจ s3 , ื“ื™ bucket ืคืึทืจืžืึธื’ ืื™ื– ืคืืจืœืื ื’ื˜. ืึธืคึผื˜ื™ืึธื ืึทืœ ืคึผืจืึธืคึผืขืจื˜ื™ืขืก ื–ืขื ืขืŸ:
    • region: the S3 region, default is us-east-1
    • prefix: a prefix to prepend to all S3 paths, default is the empty string
    • delimiter: the directory delimiter, default is '/'

ื“ืขืจ ื›ื™ื™ืคืขืฅ ื•ื•ืึธืก ื“ื™ storageClient ืคื•ื ืงืฆื™ืข ืงืขืจื˜ ืžื•ื–ืŸ ื“ืขืคื™ื ื™ืจืŸ ื“ื™ ืคืึทื ื’ืงืฉืึทื ื–:

// Test the driver before using, ensure proper configuration
async testConfig ()

// List files in path (or from base-directory)
// If recursive is true, list recursively
// If visitor is defined, it will be an async function. await the visitor function on each file found
// Otherwise, perform the listing and return an array of objects
async list (path, recursive = false, visitor = null) // path may be omitted

// Read metadata for a path
async metadata (path)

// Read a file
// callback receives a chunk of data. endCallback is called at end-of-stream
async read (path, callback, endCallback = null)

// Write a file
// driver must be able to handle a generator or a stream
async write (path, generatorOrReadableStream)

// Remove a file, or recursively delete a directory
// returns a string of a single path removed, or an array of multiple paths removed
async remove (path, recursive = false, quiet = false)

ืœืึธื’ื™ื ื’

Mobiletto ื ื™ืฆื˜ ื“ื™ winston ืœืึธื’ื™ื ื’ ื‘ื™ื‘ืœื™ืึธื˜ืขืง.

ืœืึธื’ืก ื•ื•ืขื˜ ืึทื ื˜ื”ืึทืœื˜ืŸ ื˜ืขืงืข ืคึผืึทื˜ืก ืื•ืŸ ื˜ืขื•ืช ืึทืจื˜ื™ืงืœืขืŸ, ืึธื‘ืขืจ ื•ื•ืขื˜ ืงื™ื™ื ืžืึธืœ ืึทื ื˜ื”ืึทืœื˜ืŸ ืฉืœื™ืกืœืขืŸ, ืกื™ืงืจื™ืฅ, ืึธื“ืขืจ ืงื™ื™ืŸ ืื ื“ืขืจืข ืงืฉืจ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข.

ืงืœืึธืฅ ืžื“ืจื’ื”

ื ื™ืฆืŸ ื“ื™ MOBILETTO_LOG_LEVEL ืกื•ื•ื™ื•ื•ืข ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืฆื• ืฉื˜ืขืœืŸ ื“ื™ ืงืœืึธืฅ ืžื“ืจื’ื”, ื ื™ืฆืŸ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ npm ืœืขื•ื•ืขืœืก ื“ื™ืคื™ื™ื ื“ ืื™ืŸ https://www.npmjs.com/package/winston#logging-levels

ื“ื™ ืคืขืœื™ืงื™ื™ึทื˜ ืžื“ืจื’ื” ืื™ื– error . ื“ื™ ืžืขืจืกื˜ ื•ื•ืขืจื‘ืึธื•ืก ืžื“ืจื’ื” ืื™ื– silly , ื›ืึธื˜ืฉ ื“ืขืจื•ื•ื™ื™ึทืœ ืžืึธื‘ื™ืœืขื˜ื˜ืึธ ื˜ื•ื˜ ื ื™ืฉื˜ ืงืœืึธืฅ ืื™ืŸ ืœืขื•ื•ืขืœืก ืื•ื ื˜ืขืจ debug

MOBILETTO_LOG_LEVEL=silly # maximum logs!

ืงืœืึธืฅ ื˜ืขืงืข

ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜, ื“ื™ ืœืึธื’ืขืจ ืฉืจื™ื™ื‘ื˜ ืฆื• ื“ื™ ืงืึทื ืกืึธื•ืœ. ืฆื• ืฉื™ืงืŸ ืœืึธื’ืก ืฆื• ืึท ื˜ืขืงืข, ืฉื˜ืขืœืŸ ื“ื™ MOBILETTO_LOG_FILE ืกื•ื•ื™ื•ื•ืข ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง. ื•ื•ืขืŸ ืœืึธื’ื™ื ื’ ืฆื• ืึท ื˜ืขืงืข, ืœืึธื’ืก ื•ื•ืขื˜ ื ื™ื˜ ืžืขืจ ื–ื™ื™ืŸ ื’ืขืฉืจื™ื‘ืŸ ืฆื• ื“ื™ ืงืึทื ืกืึธื•ืœ.

MOBILETTO_LOG_FILE=/var/my_mobiletto_log

ืฆื• ืงืขืจ ืึทื•ื•ืขืง ืœืึธื’ื™ื ื’:

MOBILETTO_LOG_FILE=/dev/null