now has better hrtMeasurement
This commit is contained in:
		
							
								
								
									
										22
									
								
								dist/early.hrtMeasurement.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								dist/early.hrtMeasurement.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| /** | ||||
|  * easy high resolution time measurement | ||||
|  */ | ||||
| export declare class HrtMeasurement { | ||||
|     nanoSeconds: number; | ||||
|     milliSeconds: number; | ||||
|     private _hrTimeStart; | ||||
|     private _hrTimeStopDiff; | ||||
|     private _started; | ||||
|     /** | ||||
|      * start the measurement | ||||
|      */ | ||||
|     start(): void; | ||||
|     /** | ||||
|      * stop the measurement | ||||
|      */ | ||||
|     stop(): this; | ||||
|     /** | ||||
|      * reset the measurement | ||||
|      */ | ||||
|     reset(): void; | ||||
| } | ||||
							
								
								
									
										47
									
								
								dist/early.hrtMeasurement.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								dist/early.hrtMeasurement.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| "use strict"; | ||||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| const process = require("process"); | ||||
| /** | ||||
|  * easy high resolution time measurement | ||||
|  */ | ||||
| class HrtMeasurement { | ||||
|     constructor() { | ||||
|         this.nanoSeconds = null; | ||||
|         this.milliSeconds = null; | ||||
|         this._hrTimeStart = null; | ||||
|         this._hrTimeStopDiff = null; | ||||
|         this._started = false; | ||||
|     } | ||||
|     /** | ||||
|      * start the measurement | ||||
|      */ | ||||
|     start() { | ||||
|         this._started = true; | ||||
|         this._hrTimeStart = process.hrtime(); | ||||
|     } | ||||
|     /** | ||||
|      * stop the measurement | ||||
|      */ | ||||
|     stop() { | ||||
|         if (this._started === false) { | ||||
|             console.log('Hasn\'t started yet'); | ||||
|             return; | ||||
|         } | ||||
|         this._hrTimeStopDiff = process.hrtime(this._hrTimeStart); | ||||
|         this.nanoSeconds = (this._hrTimeStopDiff[0] * 1e9) + this._hrTimeStopDiff[1]; | ||||
|         this.milliSeconds = this.nanoSeconds / 1000000; | ||||
|         return this; | ||||
|     } | ||||
|     /** | ||||
|      * reset the measurement | ||||
|      */ | ||||
|     reset() { | ||||
|         this.nanoSeconds = null; | ||||
|         this.milliSeconds = null; | ||||
|         this._hrTimeStart = null; | ||||
|         this._hrTimeStopDiff = null; | ||||
|         this._started = false; | ||||
|     } | ||||
| } | ||||
| exports.HrtMeasurement = HrtMeasurement; | ||||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWFybHkuaHJ0TWVhc3VyZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9lYXJseS5ocnRNZWFzdXJlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQUFrQztBQUVsQzs7R0FFRztBQUNIO0lBQUE7UUFDRSxnQkFBVyxHQUFXLElBQUksQ0FBQTtRQUMxQixpQkFBWSxHQUFXLElBQUksQ0FBQTtRQUNuQixpQkFBWSxHQUFHLElBQUksQ0FBQTtRQUNuQixvQkFBZSxHQUFHLElBQUksQ0FBQTtRQUN0QixhQUFRLEdBQVksS0FBSyxDQUFBO0lBa0NuQyxDQUFDO0lBaENDOztPQUVHO0lBQ0gsS0FBSztRQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUk7UUFDRixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1lBQ2xDLE1BQU0sQ0FBQTtRQUNSLENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ3hELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDNUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQTtRQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO0lBQ3ZCLENBQUM7Q0FDRjtBQXZDRCx3Q0F1Q0MifQ== | ||||
							
								
								
									
										11
									
								
								dist/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								dist/index.d.ts
									
									
									
									
										vendored
									
									
								
							| @@ -1,15 +1,8 @@ | ||||
| import 'typings-global'; | ||||
| import { HrtMeasurement } from './early.hrtMeasurement'; | ||||
| export { HrtMeasurement }; | ||||
| /** | ||||
|  * start the loading | ||||
|  */ | ||||
| export declare let start: (moduleNameArg?: string, loaderLengthArg?: string) => void; | ||||
| export declare let stop: () => Promise<number>; | ||||
| export declare class hrtMeasurement { | ||||
|     private _started; | ||||
|     private _hrTimeStart; | ||||
|     start(): void; | ||||
|     stop(): { | ||||
|         nanoSeconds: number; | ||||
|         milliSeconds: number; | ||||
|     }; | ||||
| } | ||||
|   | ||||
							
								
								
									
										35
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -3,10 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| require("typings-global"); | ||||
| const beautycolor = require("beautycolor"); | ||||
| const smartq = require("smartq"); | ||||
| const process = require("process"); | ||||
| const early_hrtMeasurement_1 = require("./early.hrtMeasurement"); | ||||
| exports.HrtMeasurement = early_hrtMeasurement_1.HrtMeasurement; | ||||
| let doText = false; | ||||
| let moduleName = 'undefined module name'; | ||||
| let startTime = Date.now(); | ||||
| let startHrt; | ||||
| if (process.argv.indexOf('-v') === -1) { | ||||
|     doText = true; | ||||
| } | ||||
| @@ -15,40 +16,18 @@ if (process.argv.indexOf('-v') === -1) { | ||||
|  */ | ||||
| exports.start = function (moduleNameArg = '', loaderLengthArg = '10') { | ||||
|     moduleName = moduleNameArg; | ||||
|     startHrt = new early_hrtMeasurement_1.HrtMeasurement(); | ||||
|     startHrt.start(); | ||||
|     if (doText) { | ||||
|         console.log(`**** starting ${beautycolor.coloredString(moduleNameArg, 'green')} ****`); | ||||
|     } | ||||
| }; | ||||
| exports.stop = () => { | ||||
|     let done = smartq.defer(); | ||||
|     let endTime = Date.now(); | ||||
|     let earlyExecutionTime = (endTime - startTime); | ||||
|     let earlyExecutionTime = startHrt.stop().milliSeconds; | ||||
|     let earlyExecutionTimeString = (earlyExecutionTime / 1000).toString(); | ||||
|     console.log(`OK! -> finished loading within ${beautycolor.coloredString(earlyExecutionTimeString, 'blue')}`); | ||||
|     done.resolve(earlyExecutionTime); | ||||
|     return done.promise; | ||||
| }; | ||||
| class hrtMeasurement { | ||||
|     constructor() { | ||||
|         this._started = false; | ||||
|     } | ||||
|     start() { | ||||
|         this._started = true; | ||||
|         this._hrTimeStart = process.hrtime(); | ||||
|     } | ||||
|     stop() { | ||||
|         if (this._started === false) { | ||||
|             console.log('Hasn\'t started yet'); | ||||
|             return; | ||||
|         } | ||||
|         let diffTime = process.hrtime(this._hrTimeStart); | ||||
|         let nanoSeconds = (diffTime[0] * 1e9) + diffTime[1]; | ||||
|         let milliSeconds = nanoSeconds / 1000000; | ||||
|         return { | ||||
|             nanoSeconds: nanoSeconds, | ||||
|             milliSeconds: milliSeconds | ||||
|         }; | ||||
|     } | ||||
| } | ||||
| exports.hrtMeasurement = hrtMeasurement; | ||||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBCQUF1QjtBQUN2QiwyQ0FBMEM7QUFDMUMsaUNBQWdDO0FBQ2hDLG1DQUFrQztBQUVsQyxJQUFJLE1BQU0sR0FBWSxLQUFLLENBQUE7QUFDM0IsSUFBSSxVQUFVLEdBQVcsdUJBQXVCLENBQUE7QUFDaEQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO0FBRTFCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxNQUFNLEdBQUcsSUFBSSxDQUFBO0FBQ2YsQ0FBQztBQUVEOztHQUVHO0FBQ1EsUUFBQSxLQUFLLEdBQUcsVUFBVSxnQkFBd0IsRUFBRSxFQUFFLGtCQUEwQixJQUFJO0lBQ3JGLFVBQVUsR0FBRyxhQUFhLENBQUE7SUFDMUIsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLFdBQVcsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4RixDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBRVUsUUFBQSxJQUFJLEdBQUc7SUFDaEIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBVSxDQUFBO0lBQ2pDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUN4QixJQUFJLGtCQUFrQixHQUFXLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFBO0lBQ3RELElBQUksd0JBQXdCLEdBQVcsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUM3RSxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxXQUFXLENBQUMsYUFBYSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUM1RyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7QUFDckIsQ0FBQyxDQUFBO0FBRUQ7SUFBQTtRQUNVLGFBQVEsR0FBWSxLQUFLLENBQUE7SUFtQm5DLENBQUM7SUFqQkMsS0FBSztRQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ3RDLENBQUM7SUFDRCxJQUFJO1FBQ0YsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQTtZQUNsQyxNQUFNLENBQUE7UUFDUixDQUFDO1FBQ0QsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDaEQsSUFBSSxXQUFXLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ25ELElBQUksWUFBWSxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUE7UUFDeEMsTUFBTSxDQUFDO1lBQ0wsV0FBVyxFQUFFLFdBQVc7WUFDeEIsWUFBWSxFQUFFLFlBQVk7U0FDM0IsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQXBCRCx3Q0FvQkMifQ== | ||||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBCQUF1QjtBQUN2QiwyQ0FBMEM7QUFDMUMsaUNBQWdDO0FBQ2hDLGlFQUF1RDtBQUdyRCx5QkFITyxxQ0FBYyxDQUdQO0FBR2hCLElBQUksTUFBTSxHQUFZLEtBQUssQ0FBQTtBQUMzQixJQUFJLFVBQVUsR0FBVyx1QkFBdUIsQ0FBQTtBQUNoRCxJQUFJLFFBQXdCLENBQUE7QUFFNUIsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sR0FBRyxJQUFJLENBQUE7QUFDZixDQUFDO0FBRUQ7O0dBRUc7QUFDUSxRQUFBLEtBQUssR0FBRyxVQUFVLGdCQUF3QixFQUFFLEVBQUUsa0JBQTBCLElBQUk7SUFDckYsVUFBVSxHQUFHLGFBQWEsQ0FBQTtJQUMxQixRQUFRLEdBQUcsSUFBSSxxQ0FBYyxFQUFFLENBQUE7SUFDL0IsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2hCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEYsQ0FBQztBQUNILENBQUMsQ0FBQTtBQUVVLFFBQUEsSUFBSSxHQUFHO0lBQ2hCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQVUsQ0FBQTtJQUNqQyxJQUFJLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLENBQUE7SUFDckQsSUFBSSx3QkFBd0IsR0FBVyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQzdFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLFdBQVcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzVHLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtBQUNyQixDQUFDLENBQUEifQ== | ||||
| @@ -12,7 +12,7 @@ tap.test('.stop()', async () => { | ||||
| }) | ||||
|  | ||||
| tap.test('hrTime Measurement', async () => { | ||||
|   let earlyHr = new early.hrtMeasurement() | ||||
|   let earlyHr = new early.HrtMeasurement() | ||||
|   earlyHr.start() | ||||
|   await smartdelay.delayFor(1000) | ||||
|   let measuredTime = earlyHr.stop() | ||||
|   | ||||
							
								
								
									
										45
									
								
								ts/early.hrtMeasurement.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								ts/early.hrtMeasurement.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| import * as process from 'process' | ||||
|  | ||||
| /** | ||||
|  * easy high resolution time measurement | ||||
|  */ | ||||
| export class HrtMeasurement { | ||||
|   nanoSeconds: number = null | ||||
|   milliSeconds: number = null | ||||
|   private _hrTimeStart = null | ||||
|   private _hrTimeStopDiff = null | ||||
|   private _started: boolean = false | ||||
|  | ||||
|   /** | ||||
|    * start the measurement | ||||
|    */ | ||||
|   start () { | ||||
|     this._started = true | ||||
|     this._hrTimeStart = process.hrtime() | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * stop the measurement | ||||
|    */ | ||||
|   stop () { | ||||
|     if (this._started === false) { | ||||
|       console.log('Hasn\'t started yet') | ||||
|       return | ||||
|     } | ||||
|     this._hrTimeStopDiff = process.hrtime(this._hrTimeStart) | ||||
|     this.nanoSeconds = (this._hrTimeStopDiff[0] * 1e9) + this._hrTimeStopDiff[1] | ||||
|     this.milliSeconds = this.nanoSeconds / 1000000 | ||||
|     return this | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * reset the measurement | ||||
|    */ | ||||
|   reset () { | ||||
|     this.nanoSeconds = null | ||||
|     this.milliSeconds = null | ||||
|     this._hrTimeStart = null | ||||
|     this._hrTimeStopDiff = null | ||||
|     this._started = false | ||||
|   } | ||||
| } | ||||
							
								
								
									
										35
									
								
								ts/index.ts
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								ts/index.ts
									
									
									
									
									
								
							| @@ -1,11 +1,15 @@ | ||||
| import 'typings-global' | ||||
| import * as beautycolor from 'beautycolor' | ||||
| import * as smartq from 'smartq' | ||||
| import * as process from 'process' | ||||
| import { HrtMeasurement } from './early.hrtMeasurement' | ||||
|  | ||||
| export { | ||||
|   HrtMeasurement | ||||
| } | ||||
|  | ||||
| let doText: boolean = false | ||||
| let moduleName: string = 'undefined module name' | ||||
| let startTime = Date.now() | ||||
| let startHrt: HrtMeasurement | ||||
|  | ||||
| if (process.argv.indexOf('-v') === -1) { | ||||
|   doText = true | ||||
| @@ -16,6 +20,8 @@ if (process.argv.indexOf('-v') === -1) { | ||||
|  */ | ||||
| export let start = function (moduleNameArg: string = '', loaderLengthArg: string = '10') { | ||||
|   moduleName = moduleNameArg | ||||
|   startHrt = new HrtMeasurement() | ||||
|   startHrt.start() | ||||
|   if (doText) { | ||||
|     console.log(`**** starting ${beautycolor.coloredString(moduleNameArg, 'green')} ****`) | ||||
|   } | ||||
| @@ -23,32 +29,9 @@ export let start = function (moduleNameArg: string = '', loaderLengthArg: string | ||||
|  | ||||
| export let stop = (): Promise<number> => { | ||||
|   let done = smartq.defer<number>() | ||||
|   let endTime = Date.now() | ||||
|   let earlyExecutionTime: number = (endTime - startTime) | ||||
|   let earlyExecutionTime = startHrt.stop().milliSeconds | ||||
|   let earlyExecutionTimeString: string = (earlyExecutionTime / 1000).toString() | ||||
|   console.log(`OK! -> finished loading within ${beautycolor.coloredString(earlyExecutionTimeString, 'blue')}`) | ||||
|   done.resolve(earlyExecutionTime) | ||||
|   return done.promise | ||||
| } | ||||
|  | ||||
| export class hrtMeasurement { | ||||
|   private _started: boolean = false | ||||
|   private _hrTimeStart | ||||
|   start () { | ||||
|     this._started = true | ||||
|     this._hrTimeStart = process.hrtime() | ||||
|   } | ||||
|   stop () { | ||||
|     if (this._started === false) { | ||||
|       console.log('Hasn\'t started yet') | ||||
|       return | ||||
|     } | ||||
|     let diffTime = process.hrtime(this._hrTimeStart) | ||||
|     let nanoSeconds = (diffTime[0] * 1e9) + diffTime[1] | ||||
|     let milliSeconds = nanoSeconds / 1000000 | ||||
|     return { | ||||
|       nanoSeconds: nanoSeconds, | ||||
|       milliSeconds: milliSeconds | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user