import randombytes from "../randombytes";
'use strict';
function oldBrowser() {
    throw new Error('secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11');
}
var kBufferMaxLength = Buffer.kMaxLength;
var crypto = global.crypto || global.msCrypto;
var kMaxUint32 = Math.pow(2, 32) - 1;
function assertOffset(offset, length) {
    if (typeof offset !== 'number' || offset !== offset) { // eslint-disable-line no-self-compare
        throw new TypeError('offset must be a number');
    }
    if (offset > kMaxUint32 || offset < 0) {
        throw new TypeError('offset must be a uint32');
    }
    if (offset > kBufferMaxLength || offset > length) {
        throw new RangeError('offset out of range');
    }
}
function assertSize(size, offset, length) {
    if (typeof size !== 'number' || size !== size) { // eslint-disable-line no-self-compare
        throw new TypeError('size must be a number');
    }
    if (size > kMaxUint32 || size < 0) {
        throw new TypeError('size must be a uint32');
    }
    if (size + offset > length || size > kBufferMaxLength) {
        throw new RangeError('buffer too small');
    }
}
if ((crypto && crypto.getRandomValues) || !process.browser) {
}
else {
}
function randomFill(buf, offset, size, cb) {
    if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) {
        throw new TypeError('"buf" argument must be a Buffer or Uint8Array');
    }
    if (typeof offset === 'function') {
        cb = offset;
        offset = 0;
        size = buf.length;
    }
    else if (typeof size === 'function') {
        cb = size;
        size = buf.length - offset;
    }
    else if (typeof cb !== 'function') {
        throw new TypeError('"cb" argument must be a function');
    }
    assertOffset(offset, buf.length);
    assertSize(size, offset, buf.length);
    return actualFill(buf, offset, size, cb);
}
function actualFill(buf, offset, size, cb) {
    if (process.browser) {
        var ourBuf = buf.buffer;
        var uint = new Uint8Array(ourBuf, offset, size);
        crypto.getRandomValues(uint);
        if (cb) {
            process.nextTick(function () {
                cb(null, buf);
            });
            return;
        }
        return buf;
    }
    if (cb) {
        randombytes(size, function (err, bytes) {
            if (err) {
                return cb(err);
            }
            bytes.copy(buf, offset);
            cb(null, buf);
        });
        return;
    }
    var bytes = randombytes(size);
    bytes.copy(buf, offset);
    return buf;
}
function randomFillSync(buf, offset, size) {
    if (typeof offset === 'undefined') {
        offset = 0;
    }
    if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) {
        throw new TypeError('"buf" argument must be a Buffer or Uint8Array');
    }
    assertOffset(offset, buf.length);
    if (size === undefined)
        size = buf.length - offset;
    assertSize(size, offset, buf.length);
    return actualFill(buf, offset, size);
}
export { randomFill };
export { randomFillSync };