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.
		
		
		
		
		
			
		
			
				
					
					
						
							133 lines
						
					
					
						
							4.3 KiB
						
					
					
				
			
		
		
	
	
							133 lines
						
					
					
						
							4.3 KiB
						
					
					
				| 'use strict'
 | |
| 
 | |
| const Ajv = require('ajv')
 | |
| const fs = require('fs')
 | |
| const path = require('path')
 | |
| const pack = require('ajv-pack')
 | |
| 
 | |
| const ajv = new Ajv({
 | |
|   sourceCode: true, // this option is required by ajv-pack
 | |
|   removeAdditional: true,
 | |
|   useDefaults: true,
 | |
|   coerceTypes: true
 | |
| })
 | |
| 
 | |
| const defaultInitOptions = {
 | |
|   connectionTimeout: 0, // 0 sec
 | |
|   keepAliveTimeout: 5000, // 5 sec
 | |
|   forceCloseConnections: false, // keep-alive connections
 | |
|   maxRequestsPerSocket: 0, // no limit
 | |
|   requestTimeout: 0, // no limit
 | |
|   bodyLimit: 1024 * 1024, // 1 MiB
 | |
|   caseSensitive: true,
 | |
|   disableRequestLogging: false,
 | |
|   jsonShorthand: true,
 | |
|   ignoreTrailingSlash: false,
 | |
|   maxParamLength: 100,
 | |
|   onProtoPoisoning: 'error',
 | |
|   onConstructorPoisoning: 'error',
 | |
|   pluginTimeout: 10000,
 | |
|   requestIdHeader: 'request-id',
 | |
|   requestIdLogLabel: 'reqId',
 | |
|   http2SessionTimeout: 5000
 | |
| }
 | |
| 
 | |
| function customRule0 (schemaParamValue, validatedParamValue, validationSchemaObject, currentDataPath, validatedParamObject, validatedParam) {
 | |
|   validatedParamObject[validatedParam] = schemaParamValue
 | |
|   return true
 | |
| }
 | |
| 
 | |
| // We add a keyword that allow us to set default values
 | |
| ajv.addKeyword('setDefaultValue', {
 | |
|   modifying: true,
 | |
|   validate: customRule0,
 | |
|   errors: false
 | |
| })
 | |
| 
 | |
| const schema = {
 | |
|   type: 'object',
 | |
|   additionalProperties: false,
 | |
|   properties: {
 | |
|     connectionTimeout: { type: 'integer', default: defaultInitOptions.connectionTimeout },
 | |
|     keepAliveTimeout: { type: 'integer', default: defaultInitOptions.keepAliveTimeout },
 | |
|     forceCloseConnections: { type: 'boolean', default: defaultInitOptions.forceCloseConnections },
 | |
|     maxRequestsPerSocket: { type: 'integer', default: defaultInitOptions.maxRequestsPerSocket, nullable: true },
 | |
|     requestTimeout: { type: 'integer', default: defaultInitOptions.requestTimeout },
 | |
|     bodyLimit: { type: 'integer', default: defaultInitOptions.bodyLimit },
 | |
|     caseSensitive: { type: 'boolean', default: defaultInitOptions.caseSensitive },
 | |
|     http2: { type: 'boolean' },
 | |
|     https: {
 | |
|       if: {
 | |
|         not: {
 | |
|           oneOf: [
 | |
|             { type: 'boolean' },
 | |
|             { type: 'null' },
 | |
|             {
 | |
|               type: 'object',
 | |
|               additionalProperties: false,
 | |
|               required: ['allowHTTP1'],
 | |
|               properties: {
 | |
|                 allowHTTP1: { type: 'boolean' }
 | |
|               }
 | |
|             }
 | |
|           ]
 | |
|         }
 | |
|       },
 | |
|       then: { setDefaultValue: true }
 | |
|     },
 | |
|     ignoreTrailingSlash: { type: 'boolean', default: defaultInitOptions.ignoreTrailingSlash },
 | |
|     disableRequestLogging: {
 | |
|       type: 'boolean',
 | |
|       default: false
 | |
|     },
 | |
|     jsonShorthand: { type: 'boolean', default: defaultInitOptions.jsonShorthand },
 | |
|     maxParamLength: { type: 'integer', default: defaultInitOptions.maxParamLength },
 | |
|     onProtoPoisoning: { type: 'string', default: defaultInitOptions.onProtoPoisoning },
 | |
|     onConstructorPoisoning: { type: 'string', default: defaultInitOptions.onConstructorPoisoning },
 | |
|     pluginTimeout: { type: 'integer', default: defaultInitOptions.pluginTimeout },
 | |
|     requestIdHeader: { type: 'string', default: defaultInitOptions.requestIdHeader },
 | |
|     requestIdLogLabel: { type: 'string', default: defaultInitOptions.requestIdLogLabel },
 | |
|     http2SessionTimeout: { type: 'integer', default: defaultInitOptions.http2SessionTimeout },
 | |
|     // deprecated style of passing the versioning constraint
 | |
|     versioning: {
 | |
|       type: 'object',
 | |
|       additionalProperties: true,
 | |
|       required: ['storage', 'deriveVersion'],
 | |
|       properties: {
 | |
|         storage: { },
 | |
|         deriveVersion: { }
 | |
|       }
 | |
|     },
 | |
|     constraints: {
 | |
|       type: 'object',
 | |
|       additionalProperties: {
 | |
|         type: 'object',
 | |
|         required: ['name', 'storage', 'validate', 'deriveConstraint'],
 | |
|         additionalProperties: true,
 | |
|         properties: {
 | |
|           name: { type: 'string' },
 | |
|           storage: { },
 | |
|           validate: { },
 | |
|           deriveConstraint: { }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| const validate = ajv.compile(schema)
 | |
| 
 | |
| const moduleCode = `// This file is autogenerated by ${__filename.replace(__dirname, 'build')}, do not edit
 | |
| /* istanbul ignore file */
 | |
| // constant needed for customRule0 to work
 | |
| const self = {}
 | |
| 
 | |
| ${pack(ajv, validate)}
 | |
| 
 | |
| ${customRule0.toString()}
 | |
| 
 | |
| module.exports.defaultInitOptions = ${JSON.stringify(defaultInitOptions)}
 | |
| `
 | |
| 
 | |
| fs.writeFileSync(path.join(__dirname, '..', 'lib', 'configValidator.js'), moduleCode)
 |