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
						
					
					
				'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
 | 
						|
}
 |