index.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. 'use strict';
  2. var fs = require('fs');
  3. var path = require('path');
  4. var detector = require('./detector');
  5. var handlers = {};
  6. var types = require('./types');
  7. types.forEach(function(type) {
  8. handlers[type] = require('./types/' + type);
  9. });
  10. var MaxBufferSize = 128 * 1024;
  11. function lookup(buffer, filepath) {
  12. var type = detector(buffer, filepath);
  13. if (type in handlers) {
  14. var size = handlers[type].calculate(buffer, filepath);
  15. if (size !== false) {
  16. size.type = type;
  17. return size;
  18. }
  19. }
  20. throw new TypeError('Unsupported file type');
  21. }
  22. function asyncFileToBuffer(filepath, callback) {
  23. fs.open(filepath, 'r', function(err0, descriptor) {
  24. if (err0) {
  25. return callback(err0);
  26. }
  27. var size = fs.fstatSync(descriptor).size;
  28. var bufferSize = Math.min(size, MaxBufferSize);
  29. var buffer = new Buffer(bufferSize);
  30. fs.read(descriptor, buffer, 0, bufferSize, 0, function(err1) {
  31. if (err1) {
  32. return callback(err1);
  33. }
  34. fs.close(descriptor, function(err2) {
  35. callback(err2, buffer);
  36. });
  37. });
  38. });
  39. }
  40. function syncFileToBuffer(filepath) {
  41. var descriptor = fs.openSync(filepath, 'r');
  42. var size = fs.fstatSync(descriptor).size;
  43. var bufferSize = Math.min(size, MaxBufferSize);
  44. var buffer = new Buffer(bufferSize);
  45. fs.readSync(descriptor, buffer, 0, bufferSize, 0);
  46. fs.closeSync(descriptor);
  47. return buffer;
  48. }
  49. /**
  50. * Returns the dimensions of the image file
  51. * @param[in] input: input image path
  52. * @param[in] callback(option): if specified, gets size async.
  53. */
  54. module.exports = function(input, callback) {
  55. if (typeof input !== 'string') {
  56. throw new TypeError('Input must be file name');
  57. }
  58. var filepath = path.resolve(input);
  59. if (typeof callback === 'function') {
  60. asyncFileToBuffer(filepath, function(err, buffer) {
  61. if (err) {
  62. return callback(err);
  63. }
  64. var dimensions;
  65. try {
  66. dimensions = lookup(buffer, filepath);
  67. } catch (e) {
  68. err = e;
  69. }
  70. callback(err, dimensions);
  71. });
  72. } else {
  73. var buffer = syncFileToBuffer(filepath);
  74. return lookup(buffer, filepath);
  75. }
  76. };