You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							92 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
	
	
							92 lines
						
					
					
						
							1.7 KiB
						
					
					
				const queryUtils = require('query-string'); | 
						|
 | 
						|
class FileRequest { | 
						|
  /** | 
						|
   * @param {string} request | 
						|
   */ | 
						|
  constructor(request) { | 
						|
    const { file, query } = FileRequest.parse(request); | 
						|
    this.file = file; | 
						|
    this.query = query; | 
						|
  } | 
						|
 | 
						|
  /** | 
						|
   * @param {string} request | 
						|
   * @return {{file: string, query: Object}} | 
						|
   */ | 
						|
  static parse(request) { | 
						|
    const parts = request.split('?'); | 
						|
    const file = parts[0]; | 
						|
    const query = parts[1] ? queryUtils.parse(parts[1]) : null; | 
						|
    return { file, query }; | 
						|
  } | 
						|
 | 
						|
  /** | 
						|
   * @return {string} | 
						|
   */ | 
						|
  toString() { | 
						|
    const { file, query } = this; | 
						|
    const queryEncoded = query ? `?${queryUtils.stringify(query)}` : ''; | 
						|
 | 
						|
    return `${file}${queryEncoded}`; | 
						|
  } | 
						|
 | 
						|
  /** | 
						|
   * @return {string} | 
						|
   */ | 
						|
  stringify() { | 
						|
    return this.toString(); | 
						|
  } | 
						|
 | 
						|
  /** | 
						|
   * @return {string} | 
						|
   */ | 
						|
  stringifyQuery() { | 
						|
    return queryUtils.stringify(this.query); | 
						|
  } | 
						|
 | 
						|
  /** | 
						|
   * @param {FileRequest} request | 
						|
   * @return {boolean} | 
						|
   */ | 
						|
  equals(request) { | 
						|
    if (!(request instanceof FileRequest)) { | 
						|
      throw TypeError('request should be instance of FileRequest'); | 
						|
    } | 
						|
    return this.toString() === request.toString(); | 
						|
  } | 
						|
 | 
						|
  /** | 
						|
   * @param {FileRequest} request | 
						|
   * @return {boolean} | 
						|
   */ | 
						|
  fileEquals(request) { | 
						|
    return this.file === request.file; | 
						|
  } | 
						|
 | 
						|
  /** | 
						|
   * @param {FileRequest} request | 
						|
   * @return {boolean} | 
						|
   */ | 
						|
  queryEquals(request) { | 
						|
    return this.stringifyQuery() === request.stringifyQuery(); | 
						|
  } | 
						|
 | 
						|
  /** | 
						|
   * @param {string} param | 
						|
   * @return {boolean} | 
						|
   */ | 
						|
  hasParam(param) { | 
						|
    return this.query && param in this.query; | 
						|
  } | 
						|
 | 
						|
  /** | 
						|
   * @param {string} param | 
						|
   * @return {string|null} | 
						|
   */ | 
						|
  getParam(param) { | 
						|
    return this.hasParam(param) ? this.query[param] : null; | 
						|
  } | 
						|
} | 
						|
 | 
						|
module.exports = FileRequest;
 | 
						|
 |