You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
import ByteBuffer from 'bytebuffer';
 | 
						|
import { MAX_USERNAME_BYTES } from '../constants';
 | 
						|
 | 
						|
export type Encoding = 'base64' | 'hex' | 'binary' | 'utf8';
 | 
						|
export type BufferType = ByteBuffer | Buffer | ArrayBuffer | Uint8Array;
 | 
						|
 | 
						|
/**
 | 
						|
 * Take a string value with the given encoding and converts it to an `ArrayBuffer`.
 | 
						|
 * @param value The string value.
 | 
						|
 * @param encoding The encoding of the string value.
 | 
						|
 */
 | 
						|
export function encode(value: string, encoding: Encoding): ArrayBuffer {
 | 
						|
  return ByteBuffer.wrap(value, encoding).toArrayBuffer();
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Take a buffer and convert it to a string with the given encoding.
 | 
						|
 * @param buffer The buffer.
 | 
						|
 * @param stringEncoding The encoding of the converted string value.
 | 
						|
 */
 | 
						|
export function decode(buffer: BufferType, stringEncoding: Encoding): string {
 | 
						|
  return ByteBuffer.wrap(buffer).toString(stringEncoding);
 | 
						|
}
 | 
						|
 | 
						|
export const toHex = (d: BufferType) => decode(d, 'hex');
 | 
						|
export const fromHex = (d: string) => encode(d, 'hex');
 | 
						|
 | 
						|
export const fromHexToArray = (d: string) => new Uint8Array(fromHex(d));
 | 
						|
 | 
						|
export const fromBase64ToArrayBuffer = (d: string) => encode(d, 'base64');
 | 
						|
export const fromBase64ToArray = (d: string) => new Uint8Array(fromBase64ToArrayBuffer(d));
 | 
						|
 | 
						|
export const fromArrayBufferToBase64 = (d: BufferType) => decode(d, 'base64');
 | 
						|
export const fromUInt8ArrayToBase64 = (d: Uint8Array) => decode(d, 'base64');
 | 
						|
 | 
						|
export const stringToArrayBuffer = (str: string): ArrayBuffer => {
 | 
						|
  if (typeof str !== 'string') {
 | 
						|
    throw new TypeError("'string' must be a string");
 | 
						|
  }
 | 
						|
 | 
						|
  return encode(str, 'binary');
 | 
						|
};
 | 
						|
 | 
						|
export const stringToUint8Array = (str?: string): Uint8Array => {
 | 
						|
  if (!str) {
 | 
						|
    return new Uint8Array();
 | 
						|
  }
 | 
						|
  return new Uint8Array(stringToArrayBuffer(str));
 | 
						|
};
 | 
						|
 | 
						|
// Regex to match all characters which are forbidden in display names
 | 
						|
const forbiddenDisplayCharRegex = /\uFFD2*/g;
 | 
						|
 | 
						|
/**
 | 
						|
 *
 | 
						|
 * This function removes any forbidden char from a given display name.
 | 
						|
 * This does not trim it as otherwise, a user cannot type User A as when he hits the space, it gets trimmed right away.
 | 
						|
 * The trimming should hence happen after calling this and on saving the display name.
 | 
						|
 *
 | 
						|
 * This functions makes sure that the MAX_USERNAME_BYTES is verified for utf8 byte length
 | 
						|
 * @param inputName the input to sanitize
 | 
						|
 * @returns a sanitized string, untrimmed
 | 
						|
 */
 | 
						|
export const sanitizeSessionUsername = (inputName: string) => {
 | 
						|
  const validChars = inputName.replace(forbiddenDisplayCharRegex, '');
 | 
						|
 | 
						|
  const lengthBytes = encode(validChars, 'utf8').byteLength;
 | 
						|
  if (lengthBytes > MAX_USERNAME_BYTES) {
 | 
						|
    throw new Error('Display name is too long');
 | 
						|
  }
 | 
						|
 | 
						|
  return validChars;
 | 
						|
};
 |