{"_id":"@metric-im/media-mixin","_rev":"26-4980bf4778d27a16bdee1b153dfdf627","name":"@metric-im/media-mixin","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@metric-im/media-mixin","version":"1.0.0","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.0","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"d3037ec0a8ae5534efa02372bd492345e511b83a","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.0.tgz","fileCount":7,"integrity":"sha512-pGMPdRa74zGVcsmzoeTo6KRJXq204/TCxvcBvJSj2SrwKu3MxwxJpMoJWjcYfaWPF3REwf9sSZRZF8e1T/F+wA==","signatures":[{"sig":"MEUCIBSHIbidenUgJ0+3qhppb7ea8lVMaNtdjA28ZF4kgtS5AiEAtWBUfOR9DuPt81RIlxyKX9TGIFQ3D0oDfAwFQ1cfc4w=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":19787},"main":"index.mjs","type":"module","gitHead":"7c92658b177988bebf9d9bbb3f2b908eadc5913f","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"jimp":"^0.22.8","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.0_1685468337861_0.14485889557191167","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@metric-im/media-mixin","version":"1.0.1","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.1","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"bc2f4acb5fa4cc7b8f2b34072096c2096a018b44","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.1.tgz","fileCount":7,"integrity":"sha512-C3efMStRVG2bVc3fGgRPsy3JqSS/vuDvIRPryz2buO/tsTLZTZK/tOJNgr9ugLROtrnPHSZlDsyjCaCnlfFkFw==","signatures":[{"sig":"MEUCIQDSAFfI0lyRMMNRV3sk3NidJJTHqpQewrb7xtL5EIHxmgIgPGfRrccpc1jjg7seB4N8vPjEaWH5hu0URlclO/28O4I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":19982},"main":"index.mjs","type":"module","gitHead":"a02dbafa572854230e2d227c4f471afe17cb6e5d","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"jimp":"^0.22.8","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.1_1685550732626_0.23879039844460137","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"@metric-im/media-mixin","version":"1.0.2","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.2","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"5bbce7e39840b58e5d5e4efe3cb2ca30c185027b","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.2.tgz","fileCount":7,"integrity":"sha512-Tv2CyGMRZpqVqf8vGolxU6oNUVSEJXHndxTr2JVRyrJceeeLWT78LGtr9gsveiow0f9Bg//nJj3do+D9I8rVpw==","signatures":[{"sig":"MEUCIQDZ4tPAouLYiiQ9dp5fhbJoaIxgJEGpYZ3h25eQqIsb5QIgWqpZSvd0UHGXk2X6W7VXsgYeoyxcv1PnsipkF+kKq6o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":20602},"main":"index.mjs","type":"module","gitHead":"903efe7118710a21954c793ef2f9d8eebeefdb66","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"jimp":"^0.22.8","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.2_1685640369040_0.06495330315070369","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"@metric-im/media-mixin","version":"1.0.3","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.3","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"8e99908b9cac200ec38c594e82e84834ac767a4f","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.3.tgz","fileCount":7,"integrity":"sha512-NqUFIole3CEn0sE2z2qfgIqFl5ffspphymFP3P048vKklQ+uEX/Qpxg1KeFTz9FiqilI83NVvBH4Eh9JPMsFmQ==","signatures":[{"sig":"MEUCID//tBAg7JC9FuxTIw3JhAqR1eQZQxXZQDD//k+7yWokAiEA7cTwIaKtwxoPDx+yE1WvSVHalkL/DAuagvA7rFUBEsU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":20818},"main":"index.mjs","type":"module","gitHead":"41b017e2f652ba5276fb601af559b15c0defd7cc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"jimp":"^0.22.8","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.3_1685726859743_0.9730284733285357","host":"s3://npm-registry-packages"}},"1.0.4":{"name":"@metric-im/media-mixin","version":"1.0.4","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.4","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"4860a7fee14e976bc74bc950463af665a9f789a0","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.4.tgz","fileCount":7,"integrity":"sha512-YpZE3fkBDUy4AWVyC6mmxhomgiXNU3SE6cOIa193qgyD7bJRWtfw5eHfnbc2+LecnlTEf6tEMsM/gCfzJBL2pQ==","signatures":[{"sig":"MEQCIA81ARMOFlg74QuEMT9GO/NwdahGFS2YYsQ40AxBmG5hAiAG4LU0RyeI1QyvUoUNlTV5o5tGQWB64+uxvMDTSosu0Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":20864},"main":"index.mjs","type":"module","gitHead":"e74d55f0c5e797378ec1a9df8a0a37deab65a70f","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"jimp":"^0.22.8","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.4_1685729297741_0.9580054866465479","host":"s3://npm-registry-packages"}},"1.0.5":{"name":"@metric-im/media-mixin","version":"1.0.5","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.5","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"08785719be7daf55c68ac9bea8d0647ab2561591","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.5.tgz","fileCount":7,"integrity":"sha512-T+awthfgSaEHFwFoNfPIkldm2FR5PK0MIvkQ7Swaerk5+CA0+r8y619QlWml4Blv5MJzHgq0jep7SmNYBQ0BGw==","signatures":[{"sig":"MEUCIA9TSkc73UkxPdMDyA5Ms4lnkGi+peZe+tCbAMZcLZ6cAiEAy3SX2sF97Y0RaU92+DgB3hZUCXd94E2cBeiQL4Q6ZaQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26208},"main":"index.mjs","type":"module","gitHead":"35f30c84a6d755d2812f3f57d6423c682532cf11","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"jimp":"^0.22.8","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.5_1685980733343_0.05445286851050013","host":"s3://npm-registry-packages"}},"1.0.6":{"name":"@metric-im/media-mixin","version":"1.0.6","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.6","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"de0ea6c447cd02f92736b2c793197f8dc4f1ec04","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.6.tgz","fileCount":7,"integrity":"sha512-/P+fGY9hE9jyN1dJj3FirjVFG/ysh5s1zKElnzkT1y68ga0j6hijgb/V2efUZbXYIFOIUQVswsRL3Zd/9peWHw==","signatures":[{"sig":"MEUCIGL1JRwj8SX6QslBWIkFPfJf22Mp7RPE0pPbbgmrM3RbAiEAv6QXUkdrLzX0G8CPvmspAvtQ71VOGB+SeI0/UGWHUB0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26679},"main":"index.mjs","type":"module","gitHead":"175c1d04792da683261e855e6a072bc2a02d145b","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.6_1686011630824_0.7344327135793032","host":"s3://npm-registry-packages"}},"1.0.7":{"name":"@metric-im/media-mixin","version":"1.0.7","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.7","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"1ab629da0af8a1698b04e90580182d1d0c954350","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.7.tgz","fileCount":7,"integrity":"sha512-SNZCVhSCzzvTZhMP8a1KQD6JRNsYcPthD7GopNkk93meRDiiT8mz5WWJ0BFHw4FLUFwdXP591c9ifR1MxNdXRA==","signatures":[{"sig":"MEQCIFYilCGoDVnLw3C038pHAvtkCcyYgu9cRi0cmnqUPcREAiB+LucnwMZ+9qvq/EghsoEqCJh5I0+CmeKWtVtuOtuVfg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":27040},"main":"index.mjs","type":"module","gitHead":"2d8af90b7cf1bea84d55a5e7872ffcaa7601beca","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.7_1687813133020_0.962623937567449","host":"s3://npm-registry-packages"}},"1.0.8":{"name":"@metric-im/media-mixin","version":"1.0.8","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.8","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"d751186fd9f36d56c6395b4d921c0e50a8679408","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.8.tgz","fileCount":7,"integrity":"sha512-pG0FxEOQPaYceiLXdJnJIQjF23/ELkm7AjXAFJva5Rkv379akZgUyYVsVa4dlZNkN5XHA9lXtBYPdAsWF2Fd8w==","signatures":[{"sig":"MEUCIAOBAgygpVa/f/qvsW8+wuX1glvFpcqLUfJDpN2fkf0wAiEAisrprCX1A5j2Vs0rkk6jkzTceMJPh3R8x7WdfW/8Sp4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":27112},"main":"index.mjs","type":"module","gitHead":"7c0c0e9de4bab714470c61ba1d1a093ee1cb99cb","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.8_1688021112770_0.9964347803833495","host":"s3://npm-registry-packages"}},"1.0.9":{"name":"@metric-im/media-mixin","version":"1.0.9","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.9","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"5cd536c0765e0d20000f1a9fb14b17a89334329d","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.9.tgz","fileCount":7,"integrity":"sha512-qGhEI5ZiU6SmMFUvIclEuIuFFSJeyGIR/ao7mzl0Re37CtQlTOs3Duqo/xr0EBTRkDafACF1Fe7uEAFQW3c4rg==","signatures":[{"sig":"MEUCIBUS/BgsVVZD3fvIHiSzBNaWMUt0S2gWLC3BRkQfYPPLAiEAxT9T+x5IaU9n29CHsuElA0il7LJaNVYaYmv9Gzk80GY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":27088},"main":"index.mjs","type":"module","gitHead":"a02e5bdb626b71cbf88c4aa9b01021978d2d4331","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.9_1689447855803_0.4820278531117821","host":"s3://npm-registry-packages"}},"1.0.10":{"name":"@metric-im/media-mixin","version":"1.0.10","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.10","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"6bbdb74a7531a970309d006a97bdc8a9d2582fa7","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.10.tgz","fileCount":7,"integrity":"sha512-8mrWdpHdy8n3TsnI5tl9e2S6TjGeF1vDlepDycfvSfMJUtSKRRgG4XBZWYehg0zkHKGeGTXUHwM73kBwn6xZdA==","signatures":[{"sig":"MEYCIQC59WSI1UgRarl8SUpo+ETjtfw85DrEZIo6uvrL4dS9GwIhANO67u8CaJcoEIRN3f8zrDJDrTFH6EprUtEZVDiMkb0W","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":27380},"main":"index.mjs","type":"module","gitHead":"0336d58276c3a34cfffd33792ea8527bfa79517a","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.10_1691193234748_0.07600528195525702","host":"s3://npm-registry-packages"}},"1.0.11":{"name":"@metric-im/media-mixin","version":"1.0.11","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.11","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"1fa906836cdccd03596b0f8c0099242bc9e6611d","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.11.tgz","fileCount":10,"integrity":"sha512-8W0WumGeGITmqNnIly3ATcxlgO9tP6Q6uhMCzQRvYLCwBPv013dRBS5RZd9ilDu+dLFp+DiQa93sW5ASrsMw5A==","signatures":[{"sig":"MEYCIQD/rWyIC8gwQHUM9ZJ5UKThgxbDCcgVm0hs1gdOHwCyhwIhAJK2cDbWatbpyWVC5Dz559gAmN36c/tH8fu/BOkmTSF+","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33700},"main":"index.mjs","type":"module","gitHead":"64d5d3ea57156b48eb1cf77510076d7026f46900","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.11_1692918300410_0.6478528783865292","host":"s3://npm-registry-packages"}},"1.0.12":{"name":"@metric-im/media-mixin","version":"1.0.12","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.12","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"84755d25fb4a8116dd2d47c625f7700522ca0136","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.12.tgz","fileCount":10,"integrity":"sha512-zoZfLFRkRvvqIbXljf/SuY+UpsL4xsGctXhL6rffKXkVW553tF5vYEejgOopYejl78H/GuFuWp+SgvO5pZAt6g==","signatures":[{"sig":"MEUCIGq/xVU17PkdG/N5Os5ojykPhEDicWPOf9SkJr4inWuKAiEAs1r6NX1n1O7lFdTwTlLl+lJqpahmZelnBRtQZTHsOqE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34533},"main":"index.mjs","type":"module","gitHead":"31f49ff6f23e4cc315391b91c68c91eaf5e325c4","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.12_1693159832847_0.7902780237033138","host":"s3://npm-registry-packages"}},"1.0.13":{"name":"@metric-im/media-mixin","version":"1.0.13","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.0.13","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"aa41946a61dda929919f140c07aee5b8c6da7b54","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.0.13.tgz","fileCount":10,"integrity":"sha512-hpBh3FLtaeF+tTmKcUkXJOCP+3QotJRCSrxrOJWpj4RcUCXajbmZp2MxSPGnnCi9RdjvqBiiCUqqrHQj0XZJgQ==","signatures":[{"sig":"MEYCIQCqcUsVTlEpR+tBxSqu37v+ChOi4NTycHBH6sV893by5wIhAKfbqPRzzvqd7bD6wdvdFRdrQKJlQSw57zhSiCioD+3Y","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34533},"main":"index.mjs","type":"module","gitHead":"8bd21634417319cfe4ff2d7d13c468c190d2f753","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"9.2.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"18.13.0","dependencies":{"axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.0.13_1693160207387_0.08939512859697563","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@metric-im/media-mixin","version":"1.1.0","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.1.0","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"283347803ae0ba3b2d67fd44af38e7fa3df7181c","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.1.0.tgz","fileCount":13,"integrity":"sha512-KcTyY9nWaVVRHaCWCiGx6A8LgtKR03PqTCp4bL8FTVboTzOym+bWk2hXTG+1V4kN+aauFInQ8oIg5yjehUvItw==","signatures":[{"sig":"MEYCIQCLxN48mWNDYH/vVwGEHR01MpOJVHtHomyTPmegMFZkqQIhAKnO0+CYb4vwzQxfL0+3cKD28ApBi/XJo3Q48KsD6VFg","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47646},"main":"index.mjs","type":"module","gitHead":"048cdca14e865b1fb05d1845533b5a8f01dc8993","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"10.5.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"20.11.1","dependencies":{"bson":"^6.7.0","axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","mongodb":"^6.6.1","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.1.0_1715532141908_0.5614787838946371","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"@metric-im/media-mixin","version":"1.1.1","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.1.1","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"ee44fcd0f298309f0fee0b4867fd7ed31a05e0c5","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.1.1.tgz","fileCount":15,"integrity":"sha512-CC0dGOuKY2L9vYQpOGxAlbV95NrjkYdS6CFtCU2t99j9pX9sCLnSYGs3pjDEVPKcSi+Sf1yR3e0lw9s8BmzhNg==","signatures":[{"sig":"MEQCIGsu1UZdDZaUO7cVzuLcHMERM+Klaw2r0Bb0UuirNzS/AiA0P3pMPTCXx41vF0G1yXp/c+cR5zuKAsWJDm4IPJfUew==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":53143},"main":"index.mjs","type":"module","gitHead":"eadafd63435a76aef3ab337962e6c9a6c00547a6","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"10.5.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"20.11.1","dependencies":{"bson":"^6.7.0","axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","mongodb":"^6.6.1","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.1.1_1717373806668_0.3519487417949161","host":"s3://npm-registry-packages"}},"1.1.2":{"name":"@metric-im/media-mixin","version":"1.1.2","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.1.2","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"8530bb767d6053d18d2b84af69760f93e0ac0c75","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.1.2.tgz","fileCount":15,"integrity":"sha512-N9B/euuWnApvotxoJ7Z4GhocWdI7eiSSQ2rGWQW80mw7mES3RzG2t0vptGHB7sjN0qB2YrVm5Zliy1c9/Esekw==","signatures":[{"sig":"MEUCIDeeiwBxaYXpxO4HD0Howuxp9U7R+noNaXIbNnDSgekrAiEAzly9A2no/mmc23eCzzf+v/VAZJ9iTwY4rn1HV8E+bEU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":53378},"main":"index.mjs","type":"module","gitHead":"06941ed42b4c3858f372c0f820db65e3a11159b4","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"10.5.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"20.11.1","dependencies":{"bson":"^6.7.0","axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","mongodb":"^6.6.1","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0","@metric-im/media-mixin":"^1.1.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.1.2_1717382741828_0.8814434339610402","host":"s3://npm-registry-packages"}},"1.1.3":{"name":"@metric-im/media-mixin","version":"1.1.3","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.1.3","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"c5a90b9352c4b2e2ce05aa942e26cde902d7ba26","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.1.3.tgz","fileCount":15,"integrity":"sha512-jU5WwF6dBkgbDYybmc4cP201fyebVkzrdhlJJ97b8DYykZ3KdYRx+3ez3ZqmLKDl4M1IBbNAiWYEil73JWmxdg==","signatures":[{"sig":"MEUCIBEUdeK3Kctu6ZGfKORMmKEjtzl1+26dakuUuS8V+L6ZAiEA57ZiapfleQ6drgTezs90Dsaxj0N2S/aVB1uMDwGN0BM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":53278},"main":"index.mjs","type":"module","gitHead":"44109acd7fe6196751cdb349fadbc1553bfd687a","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"10.8.2","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"20.11.1","dependencies":{"bson":"^6.7.0","axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","mongodb":"^6.6.1","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0","@metric-im/media-mixin":"^1.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.1.3_1725916385008_0.7592765791481755","host":"s3://npm-registry-packages"}},"1.1.4":{"name":"@metric-im/media-mixin","version":"1.1.4","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.1.4","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"2e69e8fff98752eb2bb367d3388c920ac01437da","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.1.4.tgz","fileCount":17,"integrity":"sha512-pctZw+soKWG+dhTZJnnaFBSzUXyg7P2am2VRH4wz2RLSC2joTLMhFo1Yzg/3e/08OsJIQacQU+d7/MhDLeyQ0A==","signatures":[{"sig":"MEUCIQCtH++poYj5uRY0CL/RCprNrG5uLmxsijERKcaNM9fWoAIgFa3WjTDyJ2Ebbt9tudFiOZzvAOW42UTdTBd7BfMIceM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":53025},"main":"index.mjs","type":"module","gitHead":"179d84485b1525fdc50d963d246e82817a94628c","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"10.8.2","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"20.11.1","dependencies":{"bson":"^6.7.0","axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","mongodb":"^6.6.1","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0","@metric-im/media-mixin":"^1.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.1.4_1725922920264_0.023293644397397895","host":"s3://npm-registry-packages"}},"1.1.5":{"name":"@metric-im/media-mixin","version":"1.1.5","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.1.5","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"176ecbfe5071375a4001bbb847c2538418553d4b","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.1.5.tgz","fileCount":17,"integrity":"sha512-7CfhrLmCNAwFtYijLe3FL76DltjlL/hVWNqoJobRUOdQAM2rbUJzwpZstvarWTMQhaJ7e4MVbCY9nIzEdUqBPQ==","signatures":[{"sig":"MEUCIHBW5OVSHaJEgNdPVNAJ0u76jPASfeJbFn6prWa1avkNAiEAq9P0pqHg+Ya51ZDDYbmJJgn17/ynvU0WtM1TizK2LdY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":52985},"main":"index.mjs","type":"module","gitHead":"c96953f4b007b2d96908f4c750866aeb2198893f","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"10.8.2","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"20.11.1","dependencies":{"bson":"^6.7.0","axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","mongodb":"^6.6.1","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.1.5_1726009353298_0.10293849853574488","host":"s3://npm-registry-packages"}},"1.1.6":{"name":"@metric-im/media-mixin","version":"1.1.6","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.1.6","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"f5250af293834248fb9dc7524ad4b175e0965a53","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.1.6.tgz","fileCount":17,"integrity":"sha512-G8K6osc4tYi1lbX1tif2sMVVe4ZgLPwh+DAUzlCAApO5711+zOP3ELLnG1ntnRcIDflMBMKINCSR42/sxdoiDg==","signatures":[{"sig":"MEUCIDGSlpeH0pXizAvmYRTWPUz1mqzXMQZZR7nLeCL4kbMyAiEAyCLpVCVeneMX/TY70kBoZT7mgLRaFNfwFcPgy4VwR44=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":54377},"main":"index.mjs","type":"module","gitHead":"17a81f5fac9e31c1d38818219f18950369967433","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"10.8.2","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"20.11.1","dependencies":{"bson":"^6.7.0","axios":"^1.4.0","sharp":"^0.32.1","express":"^4.18.2","mongodb":"^6.6.1","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.1.6_1727749743826_0.14099563863020115","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"@metric-im/media-mixin","version":"1.2.0","author":{"name":"Michael Sprague"},"license":"ISC","_id":"@metric-im/media-mixin@1.2.0","maintainers":[{"name":"mespr","email":"michael@sprague.com"}],"dist":{"shasum":"0e8e8cb974d6eb503283cc2dde9c36f60fc35734","tarball":"https://registry.npmjs.org/@metric-im/media-mixin/-/media-mixin-1.2.0.tgz","fileCount":18,"integrity":"sha512-FD0EjcGFvV+tci63fMp114J2m1np7SgDxgsehCtjNqVqF/yP1tWno3CPKLz/aG7bnIPVkIt4q+kuNQw8/bBHoA==","signatures":[{"sig":"MEUCICubkPsEmZCeO8PnXsTcuWTd6DJdYByFh0IySia0RMEWAiEA2XZ5FgcKJIfc7udz9bkIUpCzLTTU8QUkbFvzm3c3Izs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":63196},"main":"index.mjs","type":"module","gitHead":"9312d841524d916008258270103c52c2d025d9c1","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"mespr","email":"michael@sprague.com"},"_npmVersion":"10.9.0","description":"Componentry tools for image and video","directories":{},"_nodeVersion":"20.11.1","dependencies":{"bson":"^6.7.0","axios":"^1.4.0","sharp":"^0.32.1","aws-sdk":"^2.1692.0","express":"^4.18.2","mongodb":"^6.6.1","@aws-sdk/client-s3":"^3.335.0","express-fileupload":"^1.4.0","@metric-im/componentry":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media-mixin_1.2.0_1731708859657_0.10353320868484017","host":"s3://npm-registry-packages"}}},"time":{"created":"2023-05-30T17:38:57.861Z","modified":"2025-06-24T21:40:11.057Z","1.0.0":"2023-05-30T17:38:58.005Z","1.0.1":"2023-05-31T16:32:12.814Z","1.0.2":"2023-06-01T17:26:09.256Z","1.0.3":"2023-06-02T17:27:39.919Z","1.0.4":"2023-06-02T18:08:17.919Z","1.0.5":"2023-06-05T15:58:53.518Z","1.0.6":"2023-06-06T00:33:51.073Z","1.0.7":"2023-06-26T20:58:53.164Z","1.0.8":"2023-06-29T06:45:12.909Z","1.0.9":"2023-07-15T19:04:16.065Z","1.0.10":"2023-08-04T23:53:54.904Z","1.0.11":"2023-08-24T23:05:00.659Z","1.0.12":"2023-08-27T18:10:33.047Z","1.0.13":"2023-08-27T18:16:47.600Z","1.1.0":"2024-05-12T16:42:22.064Z","1.1.1":"2024-06-03T00:16:47.060Z","1.1.2":"2024-06-03T02:45:41.979Z","1.1.3":"2024-09-09T21:13:05.202Z","1.1.4":"2024-09-09T23:02:00.446Z","1.1.5":"2024-09-10T23:02:33.544Z","1.1.6":"2024-10-01T02:29:04.038Z","1.2.0":"2024-11-15T22:14:19.846Z"},"author":{"name":"Michael Sprague"},"license":"ISC","description":"Componentry tools for image and video","maintainers":[{"email":"michael@sprague.com","name":"mespr"},{"email":"dehax12@gmail.com","name":"dehax"},{"email":"eunie.chai@gmail.com","name":"misseunie"},{"email":"davis.west20@gmail.com","name":"daviswest"}],"readme":"# Metric Media Mixin Studio\n\nBlob storage for metric apps. This is currently optimized for image uploads, but should adapt\nfor all file types.\n\nPUT an image by providing a local file upload or an online url. The image is assigned an id\nand stored in the configured storage system. It is then retrieved with the id through GET.\nThe request can include image manipulation specifications, such as cropping or scaling. These\nalterations are applied before returning the image. The rendering is saved back to storage\nas a new file qualified with the requested specs. If the same rendering is requested again,\nwe return the previously saved file for efficiency and speed. \n\n> **NOTE**: This documentation is ahead of the current implementation. It introduces some\n> new syntax and storage models. This message will be removed when the code matches the spec.\n> The basic mechanisms are unchanged.\n\n## Use cases\n\n### Store an image used for an ad campaign across networks\nThe same image will have different rendering specs depending on the display target.\nFor example, Facebook expects images to be 960x600, Outbrain wants 640x480, the\nsystem console wants icons sized to 50x50.\n\nFacebook, Outbrain and Icon are all considered labelled variants of the original\nrendered to the default spec established in the application manifest. When asked\nfor the \"facebook\" variant you get the original auto-cropped and sized to fit 960x600.\n\nNote that once a network is referred an image url (as done when a campaign is created),\nthey make a copy and never return the source provided.\n\n### Customize the rendering spec for an image\nThe defaults can be manually modified by dragging or zooming a box\nwith the same aspect ratio around the original image.\nThis custom sizing overrides the default. You can also request custom rendering for\nthe original image, thus creating an unlabelled variant.\n\n### List all items in an account\nGet an array of media item id's for the given account. A user wil only be able\nto list and access files in an account for which they have read access.\n\nThere is no case for listing all files known across accounts that need be\nexposed. Only a sys admin would do this for the purposes of backup or such.\n\n### Delete a file\nRemove the original and all variants of an item from storage\n\n### Rotate an image\nRotate the source image ninety degrees left or right. All variants will need\nto be re-rendered. This should be done on demand, as if the source image were newly\nupdated.\n\n### Update an image or file\nThis is a rare case, but needs to be available. A new image is uploaded with the\nsame id as the original. All variants are deleted. They will be rerendered when\nfirst requested after the update.\n\nThis is different from deleting a file and replacing with a new one as the identity\nis maintained. Image id's may travel outside our system. For example, id of the image\nused in a campaign ad will be referenced in the campaign link hosted by a network.\nThat id enables us to too track the impact of a specific image as usage data comes\nback to us, either through our own data or from foreign sources such as Google Analytics\nor Facebook stats.\n\n## Usage\nThe mechanics of uploading and retrieving files is handled by the chosen\n[Storage Bridge](/#StorageBridge). The storage bridge implements the atomic\nCRUD operations, create, read, update, delete. The storage bridge is\nidentified with an environment variable. The default is \"aws\".\n\n### Upload File\nUploading a file is a two-step process. First the file is staged with /stage, creating an id and\nupload key. Then the file is uploaded with /upload. Upload is monitored to show progress to the\nend user.\n\nImages should all be cast to PNG format. If process.env.MEDIA_MAXWIDTH is defined, the image\nshould be sized accordingly before being saved. \n\n> *NOTE*: We are currently concerned only with images, but should expect other file\n> types over time. The API should be segmented to accommodate the needs of different\n> file types. We only document the /image requests here.\n\n> *syntax*: `PUT /media/stage`\n> *syntax*: `PUT /media/upload/{fileKey}`\n\nBody contains the file mime type, file size, origin (\"upload\" or \"url\") and server\ncredentials. Returns a generated id. Initiate the upload with this id. The imported\npackage, express-fileupload, handles progress notifications.\n\n| name | description                                                                                                                                                                             |\n|------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| _id  | The Identifier should be `collection/objectid`. Or props.collection/props.data._id. If left blank, an id is generated. This format ensure uniqueness and organizes the storage structure|\n| type | Mime type of the file                                                                                                                                                                   |\n| size | Byte size of the file                                                                                                                                                                   |\n| origin | 'upload' or 'url'|\n| captured | (optional) The creation date of the original file when uploaded locally                                                                                                             |\n\nThe file key is a combination of the account name and the generated image identifier\n(accountId/imageId). The account is used manage all files in an account. In AWS S3\nthis translates to a bucket\n\n### Import Url\nSame result as uploading a file except the media source is not the local system but a\npublicly accessible URL.\n\n> *syntax*: `PUT /media/import/{url}[?options]`\n\n### Get a Image File\n\n> *syntax*: `GET /media/image/id/{id}[?options]`\n\nRetrieve a file from storage and send it to the client according to the file's mimetype.\nUse options to alter the image rendering. For example, `?scale=400,400`. The storage\nsystem may store this rendering so the same spec needn't be re-rendered to re-deliver.\n\n### Get a Image From a URL\n> *syntax*: `GET /media/image/url/{id}[?options]`\n\nThe purpose of fetching an image url through the media-mixin is to automatically size\nit for the target display. Unlike import url, the image is not saved. It is fetched,\nmanipulated and delivered to the client in one step.\n\n### Rotate an Image\n> *syntax*: `GET /media/image/rotate/{id}/{degrees}\n\nRotate the original image the *degrees* given. As with any update to a known image,\nvariations of the original are deleted. They will be generated on request as normal.\n\n## Media Manipulation Options\n\nWhen getting or putting a file, options can be provided in the query string. Files are PUT with a\nroot name, but when the same file is requested with the same options, a copy is saved for efficiency.\n\nThese options can be used together. Scale takes precedence for performance.\n\n| name | value                                                                                                                                                               |\n| --- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| scale | Absolute pixel width provided as width,height & fit (optional, cover is default). `&scale=900,600`. `*` can be used to float width while setting height             |\n| crop | Relative cropping, in percents: left, top, width, height. `&crop=20,20,60,60`                                                                                       |\n| fit | Same as object-fit in css. Values are cover, contain, fill, inside or outside. Cover is the default. The value is ignored if both height and width are not provided |\nSee https://sharp.pixelplumbing.com/. This is the image library in use. \"scale\" is sharp.resize. \"crop\" is sharp.extract, after percentages are translated to absolute pixels.\n\n### List Images\n> *syntax*: `GET /media/list/{accountId}`\n\nReturn image ID's for all source images recorded to the given account.\n\n## <a src=\"#StorageBridge\"></a>Storage Bridge\nThree storage bridges have been declared: aws, database, and storj. The chosen bridge is\nprovided with the environment variable, MEDIA_STORAGE. Only one bridge can be utilized\nfor an installation.\n\nStorage implementations are found in `/modules/StorageBridge`. Each bridge inherits from Index\nwhich selects the bridge and establishes a common interface.\n\n* list(account)\n* getItem(id)\n* get(id,options)\n* putImage(id,image)\n* remove(id)\n* rotate(id)\n\n### AWS Storage Bridge\nThis is the default and most robust bridge. It is implemented on top of S3.\n\nAs is a file system, S3 has limited capacity for search and meta data, but\nis fully adequate for our needs. We initially implemented a media item in\nS3 as a file with a corresponding record in the media collection. This\nproved to be unnecessary and more fragile as the file system and database\nsystem needed to stay in sync to represent the media items under management.\n\n\n### Database Storage Bridge\nThe database bridge stores image binaries in the database. There is a file\nsize limit of 16M. Use MEDIA_MAXWIDTH to scale large images down to 1024 width\nor so.\n\nDatabase storage is convenient for simple, standalone installations with relatively\nsmall libraries. Meta data and other attributes can be stored directly with the\nimage in the same record.\n\n### Storj Storage Bridge\n\nStorj is a system of shared and sharded storage resources spread across the\nglobe on dedicated and personal machines alike.\n\nThis bridge is not yet implemented, however, we have previously implemented\nan integration with Storj that can be borrowed. See samizdat-media. The npm\npackage is public.\n\n## Data Structure\nLogical structure\n\n| attribute | description                                                                   |\n|-----------|-------------------------------------------------------------------------------|\n| id        | the unique identifier of the media item. System generated alphnumeric string. |\n| account | id of the account or collection or bucket in which to store this item |\n| type      | mime type of the item                                                         |\n| size      | size of the item                                                              |\n| created   | the date this item was uploaded                                               |\n| captured  | the date this item was captured, optional and only if available               |\n| variants  | an array of renders, each with a label for defaults and lookup                |\n\nMost Storage Bridge implementations are/will be file systems with limited options for meta data.\nWe use a common id structure to overload the file name for easier management and lookup. This\nis preferable to having the item's data split across a file system and a database, requiring\ncontinuous synchronization.\n\n### File Names\nThis is the format used for aws and similar file systems\n```text\nsprague/lwy82j2yhpbkxpuh[.{label} | .customSpec].png\n-------|----------------|---------|------------|---\nacct id|    item id        label     options    ext\n```\n* Acct id (account id), translates to a folder or bucket.\n* Item id is the unique id for this file and hosts the original source of the item\n* Label is a variant of the source custom rendered to fit the target while improving the visual.\n* Options is the same string as the query string that specified the custom rendering. It follows a period. It's optional\n* Ext is the item extension derived from the mime-type. It is the string following the last period\n\ntilde and period are used as they are url safe. However, acceptable characters is a trait\nof the Storage System. These overloaded ids are rarely used out of context. In\nmost cases the item is referred to externally by item id alone. We could hash the\noptions string, but it has not been necessary. On item requests, the options string\nis in the query string where many more characters are acceptable.\n\n### Meta Data\nWhen using a file system for storage, additional meta data, if any, should be stored in\na JSON file with the same root id. This simplifies management of the object in a single\nsystem. It is convenient for backup, deletion and other maintenance operations.\n\nCurrently, we do not record any meta data. We may soon add back keywords to classify an\nimage. These keywords would be stored in the json file for that image. For example:\n```text\n# source image\nlwy82j2yhpbkxpuh.png                        \n# rendered to the default Facebook spec\nlwy82j2yhpbkxpuh~FB.png                     \n# rendered to a custom spec for Outbrain\nlwy82j2yhpbkxpuh~OB.scale=640,480,cover&crop=20,80,20,0.png\n# rendered to the default icon spec\nlwy82j2yhpbkxpuh~icon.png                   \n# json data relevant to this image\nlwy82j2yhpbkxpuh.json                       \n```\n\n## Examples\nFrom a host component:\n```javascript\nimport Componentry from '@metric-im/componentry';\nimport CommonMixin from '@metric-im/common-mixin';\nimport MediaMixin from '../metric-im/media-mixin/index.mjs';\nimport InputImage from \"./InputImage.mjs\";\n\nlet componentry = new Componentry(app,await Profile());\nawait componentry.init(MediaMixin,CommonMixin);\n\nthis.inputImage = await this.draw(InputImage,{\n  data:this.item,\n  account:'myAccountName',\n  name:\"icon\",\n  title:\"icon\",\n  options:\"scale=400,400\"\n},this.element);\n```\n>NOTE: For prerelease integration, componentry elements can be referenced with a relative path\n\naccount / data._id will be the media object id. So if data._id is \"asdf\", and account is\nmyAccountName ...\n\n```http request\n/media/myAccountName/asdf\n```\n\nand if modifications are required...\n\n```http request\n/media/myAccountName/asdf?scale=900,600\n```\n","readmeFilename":"README.md"}