@intuitionrobotics/ts-common
Version:
40 lines • 1.79 kB
JavaScript
/*
* ts-common is the basic building blocks of our typescript projects
*
* Copyright (C) 2020 Intuition Robotics
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Use the Web Crypto API via globalThis.crypto instead of Node's "crypto"
// module. Both environments expose getRandomValues() — Node since v19, every
// modern browser since forever. Importing "crypto" at module top-level
// otherwise pulls the crypto-browserify polyfill chain into browser bundles,
// where it produces "ReferenceError: exports is not defined" at runtime.
export function generateHex(length) {
const bytes = new Uint8Array(Math.ceil(length / 2));
const crypto = globalThis.crypto;
if (!crypto?.getRandomValues)
throw new Error('Web Crypto API (globalThis.crypto.getRandomValues) is not available in this environment');
crypto.getRandomValues(bytes);
let hex = '';
for (const b of bytes)
hex += b.toString(16).padStart(2, '0');
return hex.slice(0, length).toLowerCase();
}
export function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
//# sourceMappingURL=random-tools.js.map