UNPKG

@khoohaoyit/image-size

Version:

A stream based image size extractor in Node

64 lines (63 loc) 3.45 kB
"use strict"; var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); } var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractWebpSize = void 0; exports.extractWebpSize = function (stream) { return __asyncGenerator(this, arguments, function* () { const riffHeader = 'RIFF' === (yield __await(stream.read(0, 4))) + ''; const webpHeader = 'WEBP' === (yield __await(stream.read(8, 4))) + ''; const vp8Header = 'VP8' === (yield __await(stream.read(12, 3))) + ''; if (!riffHeader || !webpHeader || !vp8Header) return yield __await(void 0); switch (yield __await(stream.readString(12, 4))) { default: break; case 'VP8X': { const extendedHeader = yield __await(stream.readUint8(20)); const validStart = (extendedHeader & 0xc0) === 0; const validEnd = (extendedHeader & 0x01) === 0; if (!validStart || !validEnd) break; return yield __await(yield yield __await({ width: 1 + (yield __await(stream.readUIntLE(20 + 4, 3))), height: 1 + (yield __await(stream.readUIntLE(20 + 7, 3))), })); } break; case 'VP8 ': { // `& 0x3fff` returns the last 14 bits // TO-DO: include webp scaling in the calculations return yield __await(yield yield __await({ width: (yield __await(stream.readInt16LE(20 + 6))) & 0x3fff, height: (yield __await(stream.readInt16LE(20 + 8))) & 0x3fff, })); } break; case 'VP8L': { const signature = yield __await(stream.read(20 + 3, 3)); if (signature.toString('hex') === '9d012a') break; const buffer = yield __await(stream.read(20 + 1, 4)); return yield __await(yield yield __await({ width: 1 + (((buffer[1] & 0x3f) << 8) | buffer[0]), height: 1 + (((buffer[3] & 0xf) << 10) | (buffer[2] << 2) | ((buffer[1] & 0xc0) >> 6)), })); } break; } }); };