common.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. 'use strict';
  2. var TYPED_OK = (typeof Uint8Array !== 'undefined') &&
  3. (typeof Uint16Array !== 'undefined') &&
  4. (typeof Int32Array !== 'undefined');
  5. exports.assign = function (obj /*from1, from2, from3, ...*/) {
  6. var sources = Array.prototype.slice.call(arguments, 1);
  7. while (sources.length) {
  8. var source = sources.shift();
  9. if (!source) { continue; }
  10. if (typeof source !== 'object') {
  11. throw new TypeError(source + 'must be non-object');
  12. }
  13. for (var p in source) {
  14. if (source.hasOwnProperty(p)) {
  15. obj[p] = source[p];
  16. }
  17. }
  18. }
  19. return obj;
  20. };
  21. // reduce buffer size, avoiding mem copy
  22. exports.shrinkBuf = function (buf, size) {
  23. if (buf.length === size) { return buf; }
  24. if (buf.subarray) { return buf.subarray(0, size); }
  25. buf.length = size;
  26. return buf;
  27. };
  28. var fnTyped = {
  29. arraySet: function (dest, src, src_offs, len, dest_offs) {
  30. if (src.subarray && dest.subarray) {
  31. dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
  32. return;
  33. }
  34. // Fallback to ordinary array
  35. for (var i = 0; i < len; i++) {
  36. dest[dest_offs + i] = src[src_offs + i];
  37. }
  38. },
  39. // Join array of chunks to single array.
  40. flattenChunks: function (chunks) {
  41. var i, l, len, pos, chunk, result;
  42. // calculate data length
  43. len = 0;
  44. for (i = 0, l = chunks.length; i < l; i++) {
  45. len += chunks[i].length;
  46. }
  47. // join chunks
  48. result = new Uint8Array(len);
  49. pos = 0;
  50. for (i = 0, l = chunks.length; i < l; i++) {
  51. chunk = chunks[i];
  52. result.set(chunk, pos);
  53. pos += chunk.length;
  54. }
  55. return result;
  56. }
  57. };
  58. var fnUntyped = {
  59. arraySet: function (dest, src, src_offs, len, dest_offs) {
  60. for (var i = 0; i < len; i++) {
  61. dest[dest_offs + i] = src[src_offs + i];
  62. }
  63. },
  64. // Join array of chunks to single array.
  65. flattenChunks: function (chunks) {
  66. return [].concat.apply([], chunks);
  67. }
  68. };
  69. // Enable/Disable typed arrays use, for testing
  70. //
  71. exports.setTyped = function (on) {
  72. if (on) {
  73. exports.Buf8 = Uint8Array;
  74. exports.Buf16 = Uint16Array;
  75. exports.Buf32 = Int32Array;
  76. exports.assign(exports, fnTyped);
  77. } else {
  78. exports.Buf8 = Array;
  79. exports.Buf16 = Array;
  80. exports.Buf32 = Array;
  81. exports.assign(exports, fnUntyped);
  82. }
  83. };
  84. exports.setTyped(TYPED_OK);