fileType.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. function _slicedToArray(r, e) {
  2. return (
  3. _arrayWithHoles(r) ||
  4. _iterableToArrayLimit(r, e) ||
  5. _unsupportedIterableToArray(r, e) ||
  6. _nonIterableRest()
  7. );
  8. }
  9. function _nonIterableRest() {
  10. throw new TypeError(
  11. 'Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'
  12. );
  13. }
  14. function _unsupportedIterableToArray(r, a) {
  15. if (r) {
  16. if ('string' == typeof r) return _arrayLikeToArray(r, a);
  17. var t = {}.toString.call(r).slice(8, -1);
  18. return (
  19. 'Object' === t && r.constructor && (t = r.constructor.name),
  20. 'Map' === t || 'Set' === t
  21. ? Array.from(r)
  22. : 'Arguments' === t ||
  23. /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)
  24. ? _arrayLikeToArray(r, a)
  25. : void 0
  26. );
  27. }
  28. }
  29. function _arrayLikeToArray(r, a) {
  30. (null == a || a > r.length) && (a = r.length);
  31. for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
  32. return n;
  33. }
  34. function _iterableToArrayLimit(r, l) {
  35. var t =
  36. null == r
  37. ? null
  38. : ('undefined' != typeof Symbol && r[Symbol.iterator]) ||
  39. r['@@iterator'];
  40. if (null != t) {
  41. var e,
  42. n,
  43. i,
  44. u,
  45. a = [],
  46. f = !0,
  47. o = !1;
  48. try {
  49. if (((i = (t = t.call(r)).next), 0 === l)) {
  50. if (Object(t) !== t) return;
  51. f = !1;
  52. } else
  53. for (
  54. ;
  55. !(f = (e = i.call(t)).done) &&
  56. (a.push(e.value), a.length !== l);
  57. f = !0
  58. );
  59. } catch (r) {
  60. (o = !0), (n = r);
  61. } finally {
  62. try {
  63. if (
  64. !f &&
  65. null != t.return &&
  66. ((u = t.return()), Object(u) !== u)
  67. )
  68. return;
  69. } finally {
  70. if (o) throw n;
  71. }
  72. }
  73. return a;
  74. }
  75. }
  76. function _arrayWithHoles(r) {
  77. if (Array.isArray(r)) return r;
  78. }
  79. var type = require('./type');
  80. var mime = require('./mime');
  81. var isFn = require('./isFn');
  82. exports = function(input) {
  83. if (type(input) !== 'uint8array') {
  84. input = new Uint8Array(input);
  85. }
  86. for (var i = 0, len = types.length; i < len; i++) {
  87. var _type = types[i];
  88. var _type2 = _slicedToArray(_type, 3),
  89. ext = _type2[0],
  90. magic = _type2[1],
  91. offset = _type2[2];
  92. if (isFn(magic)) {
  93. if (magic(input)) {
  94. return {
  95. ext: ext,
  96. mime: mime(ext)
  97. };
  98. }
  99. } else if (check(input, magic, offset)) {
  100. return {
  101. ext: ext,
  102. mime: mime(ext)
  103. };
  104. }
  105. }
  106. };
  107. var types = [
  108. ['jpg', [0xff, 0xd8, 0xff]],
  109. ['png', [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]],
  110. ['gif', [0x47, 0x49, 0x46]],
  111. ['webp', [0x57, 0x45, 0x42, 0x50], 8],
  112. ['bmp', [0x42, 0x4d]],
  113. ['gz', [0x1f, 0x8b, 0x8]],
  114. [
  115. 'zip',
  116. function(input) {
  117. return (
  118. check(input, [0x50, 0x4b]) &&
  119. (input[2] === 0x3 || input[2] === 0x5 || input[2] === 0x7) &&
  120. (input[3] === 0x4 || input[3] === 0x6 || input[3] === 0x8)
  121. );
  122. }
  123. ],
  124. [
  125. 'rar',
  126. function(input) {
  127. return (
  128. check(input, [0x52, 0x61, 0x72, 0x21, 0x1a, 0x7]) &&
  129. (input[6] === 0x0 || input[6] === 0x1)
  130. );
  131. }
  132. ],
  133. ['pdf', [0x25, 0x50, 0x44, 0x46]],
  134. ['exe', [0x4d, 0x5a]]
  135. ];
  136. function check(input, magic) {
  137. var offset =
  138. arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  139. for (var i = 0, len = magic.length; i < len; i++) {
  140. if (input[offset + i] !== magic[i]) {
  141. return false;
  142. }
  143. }
  144. return true;
  145. }
  146. module.exports = exports;