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.
		
		
		
		
		
			
		
			
				
					85 lines
				
				2.8 KiB
			
		
		
			
		
	
	
					85 lines
				
				2.8 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const { | ||
|  |   kAvvioBoot, | ||
|  |   kChildren, | ||
|  |   kRoutePrefix, | ||
|  |   kLogLevel, | ||
|  |   kLogSerializers, | ||
|  |   kHooks, | ||
|  |   kSchemaController, | ||
|  |   kContentTypeParser, | ||
|  |   kReply, | ||
|  |   kRequest, | ||
|  |   kFourOhFour, | ||
|  |   kPluginNameChain | ||
|  | } = require('./symbols.js') | ||
|  | 
 | ||
|  | const Reply = require('./reply') | ||
|  | const Request = require('./request') | ||
|  | const SchemaController = require('./schema-controller') | ||
|  | const ContentTypeParser = require('./contentTypeParser') | ||
|  | const { buildHooks } = require('./hooks') | ||
|  | const pluginUtils = require('./pluginUtils') | ||
|  | 
 | ||
|  | // Function that runs the encapsulation magic.
 | ||
|  | // Everything that need to be encapsulated must be handled in this function.
 | ||
|  | module.exports = function override (old, fn, opts) { | ||
|  |   const shouldSkipOverride = pluginUtils.registerPlugin.call(old, fn) | ||
|  | 
 | ||
|  |   if (shouldSkipOverride) { | ||
|  |     // after every plugin registration we will enter a new name
 | ||
|  |     old[kPluginNameChain].push(pluginUtils.getDisplayName(fn)) | ||
|  |     return old | ||
|  |   } | ||
|  | 
 | ||
|  |   const instance = Object.create(old) | ||
|  |   old[kChildren].push(instance) | ||
|  |   instance.ready = old[kAvvioBoot].bind(instance) | ||
|  |   instance[kChildren] = [] | ||
|  | 
 | ||
|  |   instance[kReply] = Reply.buildReply(instance[kReply]) | ||
|  |   instance[kReply].prototype.server = instance | ||
|  | 
 | ||
|  |   instance[kRequest] = Request.buildRequest(instance[kRequest]) | ||
|  |   instance[kRequest].prototype.server = instance | ||
|  | 
 | ||
|  |   instance[kContentTypeParser] = ContentTypeParser.helpers.buildContentTypeParser(instance[kContentTypeParser]) | ||
|  |   instance[kHooks] = buildHooks(instance[kHooks]) | ||
|  |   instance[kRoutePrefix] = buildRoutePrefix(instance[kRoutePrefix], opts.prefix) | ||
|  |   instance[kLogLevel] = opts.logLevel || instance[kLogLevel] | ||
|  |   instance[kSchemaController] = SchemaController.buildSchemaController(old[kSchemaController]) | ||
|  |   instance.getSchema = instance[kSchemaController].getSchema.bind(instance[kSchemaController]) | ||
|  |   instance.getSchemas = instance[kSchemaController].getSchemas.bind(instance[kSchemaController]) | ||
|  |   instance[pluginUtils.registeredPlugins] = Object.create(instance[pluginUtils.registeredPlugins]) | ||
|  |   instance[kPluginNameChain] = [pluginUtils.getPluginName(fn) || pluginUtils.getFuncPreview(fn)] | ||
|  | 
 | ||
|  |   if (instance[kLogSerializers] || opts.logSerializers) { | ||
|  |     instance[kLogSerializers] = Object.assign(Object.create(instance[kLogSerializers]), opts.logSerializers) | ||
|  |   } | ||
|  | 
 | ||
|  |   if (opts.prefix) { | ||
|  |     instance[kFourOhFour].arrange404(instance) | ||
|  |   } | ||
|  | 
 | ||
|  |   for (const hook of instance[kHooks].onRegister) hook.call(this, instance, opts) | ||
|  | 
 | ||
|  |   return instance | ||
|  | } | ||
|  | 
 | ||
|  | function buildRoutePrefix (instancePrefix, pluginPrefix) { | ||
|  |   if (!pluginPrefix) { | ||
|  |     return instancePrefix | ||
|  |   } | ||
|  | 
 | ||
|  |   // Ensure that there is a '/' between the prefixes
 | ||
|  |   if (instancePrefix.endsWith('/') && pluginPrefix[0] === '/') { | ||
|  |     // Remove the extra '/' to avoid: '/first//second'
 | ||
|  |     pluginPrefix = pluginPrefix.slice(1) | ||
|  |   } else if (pluginPrefix[0] !== '/') { | ||
|  |     pluginPrefix = '/' + pluginPrefix | ||
|  |   } | ||
|  | 
 | ||
|  |   return instancePrefix + pluginPrefix | ||
|  | } |