const MAX_RQ_GROW_SIZE = 40 * 1024 * 1024; // 40 MiB
-const typedArrayToString = (function () {
- // This is only for PhantomJS, which doesn't like apply-ing
- // with Typed Arrays
- try {
- const arr = new Uint8Array([1, 2, 3]);
- String.fromCharCode.apply(null, arr);
- return function (a) { return String.fromCharCode.apply(null, a); };
- } catch (ex) {
- return function (a) {
- return String.fromCharCode.apply(
- null, Array.prototype.slice.call(a));
- };
- }
-})();
-
Websock.prototype = {
// Getters and Setters
get_sQ: function () {
rQshiftStr: function (len) {
if (typeof(len) === 'undefined') { len = this.rQlen(); }
- const arr = new Uint8Array(this._rQ.buffer, this._rQi, len);
- this._rQi += len;
- return typedArrayToString(arr);
+ const arr = this.rQshiftBytes(len);
+ let str = "";
+ // Handle large arrays in steps to avoid long strings on the stack
+ for (let i = 0; i < len; i += 4096) {
+ let part = arr.slice(i, i + Math.min(4096, len));
+ str = str.concat(String.fromCharCode.apply(null, part));
+ }
+ return str;
},
rQshiftBytes: function (len) {