UNPKG

webgme-engine

Version:

WebGME server and Client API without a GUI

146 lines (119 loc) 3.78 kB
/*globals define*/ /*eslint-env node, browser*/ /** * @author kecso / https://github.com/kecso * * collection of functions that uses random Numbers in WebGME */ define(['chance', 'common/Constants'], function (ChanceJs, CONSTANTS) { 'use strict'; var guidPool = '0123456789abcdef', relidPool = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM', excludeList = ['atr', 'reg', 'ovr'], maxTry = 2, chance = new ChanceJs(), randFunction = function (max) { //return Math.floor(Math.random() * max); return chance.natural({max: max - 1}); }, relidRegexp = _generateRelidRegexp(), random = { generateGuid: generateGuid, generateRelid: generateRelid, isValidRelid: isValidRelid, isValidPath: isValidPath, relidToInteger: relidToInteger, generateRandomString: generateRandomString }; function _generateRelidRegexp() { var regexp = '', i; //adding excludes if (excludeList.length > 0) { for (i = 0; i < excludeList.length; i += 1) { regexp += '(?!(^' + excludeList[i] + '$))'; } } //adding the pool regexp += '^(-)?[' + relidPool + ']+$'; return new RegExp(regexp); } function getRandomCharacter(pool) { return pool.charAt(randFunction(pool.length)); } function generateGuid() { var s4 = function () { return getRandomCharacter(guidPool) + getRandomCharacter(guidPool) + getRandomCharacter(guidPool) + getRandomCharacter(guidPool); }; return (s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4()); } function generateRelid(object, minimalLength) { var relid, i, length = minimalLength || 1, tries = 0; do { if (tries >= maxTry) { tries = 0; length += 1; } relid = ''; for (i = 0; i < length; i += 1) { relid += getRandomCharacter(relidPool); } tries += 1; } while (Object.hasOwn(object, relid) === true || isValidRelid(relid) === false); return relid; } function generateRandomString(length) { return chance.string({ pool: relidPool, length: length }); } function isValidRelid(relid) { if (typeof relid !== 'string') { return false; } return relidRegexp.test(relid); } function isValidPath(path) { var relid; if (path === CONSTANTS.PROJECT_ROOT_ID) { return true; } path = path.split(CONSTANTS.CORE.PATH_SEP); relid = path.shift(); if (relid !== CONSTANTS.PROJECT_ROOT_ID) { return false; } do { relid = path.shift(); if (typeof relid === 'string' && relidRegexp.test(relid) === false) { return false; } } while (relid); return true; } function relidToInteger(relid) { var num = 'NaN', //negative = false, i; if (isValidRelid(relid)) { num = 0; for (i = 0; i < relid.length; i += 1) { if (relid.charAt(i) === '-') { //negative = true; } else { num = num * relidPool.length; num += relidPool.indexOf(relid.charAt(i)); } } } return num; } return random; });