UNPKG

browserfs

Version:

A filesystem in your browser!

130 lines 17.5 kB
"use strict"; var path = require('path'); var SUPPORTS_TYPED_ARRAYS = typeof (ArrayBuffer) !== 'undefined'; exports.isIE = typeof navigator !== "undefined" && (/(msie) ([\w.]+)/.exec(navigator.userAgent.toLowerCase()) != null || navigator.userAgent.indexOf('Trident') !== -1); exports.isWebWorker = typeof window === "undefined"; function mkdirpSync(p, mode, fs) { if (!fs.existsSync(p)) { mkdirpSync(path.dirname(p), mode, fs); fs.mkdirSync(p, mode); } } exports.mkdirpSync = mkdirpSync; function buffer2ArrayBuffer(buff) { var u8 = buffer2Uint8array(buff), u8offset = u8.byteOffset, u8Len = u8.byteLength; if (u8offset === 0 && u8Len === u8.buffer.byteLength) { return u8.buffer; } else { return u8.buffer.slice(u8offset, u8offset + u8Len); } } exports.buffer2ArrayBuffer = buffer2ArrayBuffer; function buffer2Uint8array(buff) { if (buff['toUint8Array']) { return buff.toUint8Array(); } else if (buff instanceof Uint8Array) { return buff; } else { return new Uint8Array(buff); } } exports.buffer2Uint8array = buffer2Uint8array; function buffer2Arrayish(buff) { if (typeof (buff[0]) === 'number') { return buff; } else if (SUPPORTS_TYPED_ARRAYS) { return buffer2Uint8array(buff); } else { return buff.toJSON().data; } } exports.buffer2Arrayish = buffer2Arrayish; function arrayish2Buffer(arr) { if (SUPPORTS_TYPED_ARRAYS && arr instanceof Uint8Array) { return uint8Array2Buffer(arr); } else if (arr instanceof Buffer) { return arr; } else { return new Buffer(arr); } } exports.arrayish2Buffer = arrayish2Buffer; function uint8Array2Buffer(u8) { if (u8.byteOffset === 0 && u8.byteLength === u8.buffer.byteLength) { return arrayBuffer2Buffer(u8); } else { return new Buffer(u8); } } exports.uint8Array2Buffer = uint8Array2Buffer; function arrayBuffer2Buffer(ab) { try { return new Buffer(ab); } catch (e) { return new Buffer(new Uint8Array(ab)); } } exports.arrayBuffer2Buffer = arrayBuffer2Buffer; if (typeof (ArrayBuffer) !== 'undefined' && typeof (Uint8Array) !== 'undefined') { if (!Uint8Array.prototype['slice']) { Uint8Array.prototype.slice = function (start, end) { if (start === void 0) { start = 0; } if (end === void 0) { end = this.length; } var self = this; if (start < 0) { start = this.length + start; if (start < 0) { start = 0; } } if (end < 0) { end = this.length + end; if (end < 0) { end = 0; } } if (end < start) { end = start; } return new Uint8Array(self.buffer, self.byteOffset + start, end - start); }; } } function copyingSlice(buff, start, end) { if (start === void 0) { start = 0; } if (end === void 0) { end = buff.length; } if (start < 0 || end < 0 || end > buff.length || start > end) { throw new TypeError("Invalid slice bounds on buffer of length " + buff.length + ": [" + start + ", " + end + "]"); } if (buff.length === 0) { return new Buffer(0); } else if (SUPPORTS_TYPED_ARRAYS) { var u8 = buffer2Uint8array(buff), s0 = buff.readUInt8(0), newS0 = (s0 + 1) % 0xFF; buff.writeUInt8(newS0, 0); if (u8[0] === newS0) { u8[0] = s0; return uint8Array2Buffer(u8.slice(start, end)); } else { buff.writeUInt8(s0, 0); return uint8Array2Buffer(u8.subarray(start, end)); } } else { var buffSlice = new Buffer(end - start); buff.copy(buffSlice, 0, start, end); return buffSlice; } } exports.copyingSlice = copyingSlice; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUlBLElBQU8sSUFBSSxXQUFXLE1BQU0sQ0FBQyxDQUFDO0FBRTlCLElBQU0scUJBQXFCLEdBQUcsT0FBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLFdBQVcsQ0FBQztBQU12RCxZQUFJLEdBQVksT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUt6SyxtQkFBVyxHQUFZLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQztBQVVoRSxvQkFBMkIsQ0FBUyxFQUFFLElBQVksRUFBRSxFQUFjO0lBQ2hFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7QUFDSCxDQUFDO0FBTGUsa0JBQVUsYUFLekIsQ0FBQTtBQU1ELDRCQUFtQyxJQUFZO0lBQzdDLElBQUksRUFBRSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUM5QixRQUFRLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFDeEIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUM7SUFDeEIsRUFBRSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDLE1BQU0s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QUksQ0FBQyxDQUFDO1lBRU4sSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFBQyxJQUFJLENBQUMsQ0FBQztRQUNOLElBQUksU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUEzQmUsb0JBQVksZUEyQjNCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdyYWIgYmFnIG9mIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgYWNyb3NzIHRoZSBjb2RlLlxuICovXG5pbXBvcnQge0ZpbGVTeXN0ZW19IGZyb20gJy4vZmlsZV9zeXN0ZW0nO1xuaW1wb3J0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5cbmNvbnN0IFNVUFBPUlRTX1RZUEVEX0FSUkFZUyA9IHR5cGVvZihBcnJheUJ1ZmZlcikgIT09ICd1bmRlZmluZWQnO1xuXG4vKipcbiAqIENoZWNrcyBmb3IgYW55IElFIHZlcnNpb24sIGluY2x1ZGluZyBJRTExIHdoaWNoIHJlbW92ZWQgTVNJRSBmcm9tIHRoZVxuICogdXNlckFnZW50IHN0cmluZy5cbiAqL1xuZXhwb3J0IHZhciBpc0lFOiBib29sZWFuID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiAoLyhtc2llKSAoW1xcdy5dKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKSAhPSBudWxsIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpICE9PSAtMSk7XG5cbi8qKlxuICogQ2hlY2sgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLlxuICovXG5leHBvcnQgdmFyIGlzV2ViV29ya2VyOiBib29sZWFuID0gdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBcnJheWlzaDxUPiB7XG4gIFtpZHg6IG51bWJlcl06IFQ7XG4gIGxlbmd0aDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFN5bmNocm9ub3VzIHJlY3Vyc2l2ZSBtYWtlZGlyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWtkaXJwU3luYyhwOiBzdHJpbmcsIG1vZGU6IG51bWJlciwgZnM6IEZpbGVTeXN0ZW0pOiB2b2lkIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgbWtkaXJwU3luYyhwYXRoLmRpcm5hbWUocCksIG1vZGUsIGZzKTtcbiAgICBmcy5ta2RpclN5bmMocCwgbW9kZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJ1ZmZlciBpbnRvIGFuIGFycmF5IGJ1ZmZlci4gQXR0ZW1wdHMgdG8gZG8gc28gaW4gYVxuICogemVyby1jb3B5IG1hbm5lciwgZS5nLiB0aGUgYXJyYXkgcmVmZXJlbmNlcyB0aGUgc2FtZSBtZW1vcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXIyQXJyYXlCdWZmZXIoYnVmZjogQnVmZmVyKTogQXJyYXlCdWZmZXIge1xuICB2YXIgdTggPSBidWZmZXIyVWludDhhcnJheShidWZmKSxcbiAgICB1OG9mZnNldCA9IHU4LmJ5dGVPZmZzZXQsXG4gICAgdThMZW4gPSB1OC5ieXRlTGVuZ3RoO1xuICBpZiAodThvZmZzZXQgPT09IDAgJiYgdThMZW4gPT09IHU4LmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIHU4LmJ1ZmZlcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdTguYnVmZmVyLnNsaWNlKHU4b2Zmc2V0LCB1OG9mZnNldCArIHU4TGVuKVxuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBidWZmZXIgaW50byBhIFVpbnQ4QXJyYXkuIEF0dGVtcHRzIHRvIGRvIHNvIGluIGFcbiAqIHplcm8tY29weSBtYW5uZXIsIGUuZy4gdGhlIGFycmF5IHJlZmVyZW5jZXMgdGhlIHNhbWUgbWVtb3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVmZmVyMlVpbnQ4YXJyYXkoYnVmZjogQnVmZmVyKTogVWludDhBcnJheSB7XG4gIGlmIChidWZmWyd0b1VpbnQ4QXJyYXknXSkge1xuICAgIHJldHVybiAoPGFueT4gYnVmZikudG9VaW50OEFycmF5KCk7XG4gIH0gZWxzZSBpZiAoYnVmZiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAvLyBOb2RlIHY0LjAgYnVmZmVycyAqYXJlKiBVaW50OEFycmF5cy5cbiAgICByZXR1cm4gPGFueT4gYnVmZjtcbiAgfSBlbHNlIHtcbiAgICAvLyBVaW50OEFycmF5cyBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBhcnJheWlzaCBudW1iZXJzLlxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGFzc3VtZSB0aGlzIGlzbid0IGEgQkZTIGFycmF5LlxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShidWZmKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBidWZmZXIgaW50byBhIFVpbnQ4IGFycmF5aXNoIGZvcm0uIEF0dGVtcHRzXG4gKiB0byBiZSB6ZXJvLWNvcHkuXG4gKlxuICogUmVxdWlyZWQgZm9yIEJyb3dzZXJGUyBidWZmZXJzLCB3aGljaCBkbyBub3Qgc3VwcG9ydCBpbmRleGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1ZmZlcjJBcnJheWlzaChidWZmOiBCdWZmZXIpOiBBcnJheWlzaDxudW1iZXI+IHtcbiAgaWYgKHR5cGVvZihidWZmWzBdKSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYnVmZjtcbiAgfSBlbHNlIGlmIChTVVBQT1JUU19UWVBFRF9BUlJBWVMpIHtcbiAgICByZXR1cm4gYnVmZmVyMlVpbnQ4YXJyYXkoYnVmZik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1ZmYudG9KU09OKCkuZGF0YTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBhcnJheWlzaCBvYmplY3QgaW50byBhIEJ1ZmZlci4gQXR0ZW1wdHMgdG9cbiAqIGJlIHplcm8tY29weS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5aXNoMkJ1ZmZlcihhcnI6IEFycmF5aXNoPG51bWJlcj4pOiBCdWZmZXIge1xuICBpZiAoU1VQUE9SVFNfVFlQRURfQVJSQVlTICYmIGFyciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gdWludDhBcnJheTJCdWZmZXIoYXJyKTtcbiAgfSBlbHNlIGlmIChhcnIgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gYXJyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKDxudW1iZXJbXT4gYXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBVaW50OEFycmF5IGludG8gYSBCdWZmZXIuIEF0dGVtcHRzIHRvIGJlIHplcm8tY29weS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbnQ4QXJyYXkyQnVmZmVyKHU4OiBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgaWYgKHU4LmJ5dGVPZmZzZXQgPT09IDAgJiYgdTguYnl0ZUxlbmd0aCA9PT0gdTguYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gYXJyYXlCdWZmZXIyQnVmZmVyKHU4KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcih1OCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gYXJyYXkgYnVmZmVyIGludG8gYSBCdWZmZXIuIEF0dGVtcHRzIHRvIGJlXG4gKiB6ZXJvLWNvcHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUJ1ZmZlcjJCdWZmZXIoYWI6IEFycmF5QnVmZmVyKTogQnVmZmVyIHtcbiAgdHJ5IHtcbiAgICAvLyBXb3JrcyBpbiBCRlMgYW5kIE5vZGUgdjQuMi5cbiAgICByZXR1cm4gbmV3IEJ1ZmZlcig8YW55PiBhYik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJIGJlbGlldmUgdGhpcyBjb3BpZXMsIGJ1dCB0aGVyZSdzIG5vIGF2b2lkaW5nIGl0IGluIE5vZGUgPCB2NC4yXG4gICAgcmV0dXJuIG5ldyBCdWZmZXIobmV3IFVpbnQ4QXJyYXkoYWIpKTtcbiAgfVxufVxuXG4vLyBQb2x5ZmlsbCBmb3IgVWludDhBcnJheS5wcm90b3R5cGUuc2xpY2UuXG4vLyBTYWZhcmkgYW5kIHNvbWUgb3RoZXIgYnJvd3NlcnMgZG8gbm90IGRlZmluZSBpdC5cbmlmICh0eXBlb2YoQXJyYXlCdWZmZXIpICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YoVWludDhBcnJheSkgIT09ICd1bmRlZmluZWQnKSB7XG4gIGlmICghVWludDhBcnJheS5wcm90b3R5cGVbJ3NsaWNlJ10pIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKHN0YXJ0OiBudW1iZXIgPSAwLCBlbmQ6IG51bWJlciA9IHRoaXMubGVuZ3RoKTogVWludDhBcnJheSB7XG4gICAgICBsZXQgc2VsZjogVWludDhBcnJheSA9IHRoaXM7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kID0gdGhpcy5sZW5ndGggKyBlbmQ7XG4gICAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgICAgZW5kID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNlbGYuYnVmZmVyLCBzZWxmLmJ5dGVPZmZzZXQgKyBzdGFydCwgZW5kIC0gc3RhcnQpO1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDb3BpZXMgYSBzbGljZSBvZiB0aGUgZ2l2ZW4gYnVmZmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5aW5nU2xpY2UoYnVmZjogQnVmZmVyLCBzdGFydDogbnVtYmVyID0gMCwgZW5kID0gYnVmZi5sZW5ndGgpOiBCdWZmZXIge1xuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA8IDAgfHwgZW5kID4gYnVmZi5sZW5ndGggfHwgc3RhcnQgPiBlbmQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHNsaWNlIGJvdW5kcyBvbiBidWZmZXIgb2YgbGVuZ3RoICR7YnVmZi5sZW5ndGh9OiBbJHtzdGFydH0sICR7ZW5kfV1gKTtcbiAgfVxuICBpZiAoYnVmZi5sZW5ndGggPT09IDApIHtcbiAgICAvLyBBdm9pZCBzMCBjb3JuZXIgY2FzZSBpbiBBcnJheUJ1ZmZlciBjYXNlLlxuICAgIHJldHVybiBuZXcgQnVmZmVyKDApO1xuICB9IGVsc2UgaWYgKFNVUFBPUlRTX1RZUEVEX0FSUkFZUykge1xuICAgIHZhciB1OCA9IGJ1ZmZlcjJVaW50OGFycmF5KGJ1ZmYpLFxuICAgICAgczAgPSBidWZmLnJlYWRVSW50OCgwKSxcbiAgICAgIG5ld1MwID0gKHMwICsgMSkgJSAweEZGO1xuXG4gICAgYnVmZi53cml0ZVVJbnQ4KG5ld1MwLCAwKTtcbiAgICBpZiAodThbMF0gPT09IG5ld1MwKSB7XG4gICAgICAvLyBTYW1lIG1lbW9yeS4gUmV2ZXJ0ICYgY29weS5cbiAgICAgIHU4WzBdID0gczA7XG4gICAgICByZXR1cm4gdWludDhBcnJheTJCdWZmZXIodTguc2xpY2Uoc3RhcnQsIGVuZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXZlcnQuXG4gICAgICBidWZmLndyaXRlVUludDgoczAsIDApO1xuICAgICAgcmV0dXJuIHVpbnQ4QXJyYXkyQnVmZmVyKHU4LnN1YmFycmF5KHN0YXJ0LCBlbmQpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ1ZmZTbGljZSA9IG5ldyBCdWZmZXIoZW5kIC0gc3RhcnQpO1xuICAgIGJ1ZmYuY29weShidWZmU2xpY2UsIDAsIHN0YXJ0LCBlbmQpO1xuICAgIHJldHVybiBidWZmU2xpY2U7XG4gIH1cbn1cbiJdfQ==