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.
		
		
		
		
		
			
		
			
				
					128 lines
				
				5.3 KiB
			
		
		
			
		
	
	
					128 lines
				
				5.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								# @fastify/fast-json-stringify-compiler
							 | 
						||
| 
								 | 
							
								Build and manage the [`fast-json-stringify`](https://www.npmjs.com/package/fast-json-stringify) instances for the fastify framework.
							 | 
						||
| 
								 | 
							
								This package is responsible for compiling the application's `response` JSON schemas into optimized functions to speed up the response time.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](http://standardjs.com/)
							 | 
						||
| 
								 | 
							
								[](https://github.com/fastify/fast-json-stringify-compiler/actions/workflows/ci.yml)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Versions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								| `@fastify/fast-json-stringify-compiler` | `fast-json-stringify` | Supported `fastify` |
							 | 
						||
| 
								 | 
							
								|----------------------------------------:|----------------------:|--------------------:|
							 | 
						||
| 
								 | 
							
								|                                    v1.x |                  v3.x |                ^3.x |
							 | 
						||
| 
								 | 
							
								|                                    v2.x |                  v3.x |                ^4.x |
							 | 
						||
| 
								 | 
							
								|                                    v3.x |                  v4.x |                ^4.x |
							 | 
						||
| 
								 | 
							
								|                                    v4.x |                  v5.x |                ^4.x |
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### fast-json-stringify Configuration
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The `fast-json-stringify` configuration is the default one. You can check it the default settings in the [`fast-json-stringify` option](https://github.com/fastify/fast-json-stringify/#options) documentation.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can also override the default configuration by passing the [`serializerOpts`](https://www.fastify.io/docs/latest/Reference/Server/#serializeropts) configuration to the Fastify instance.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This module is already used as default by Fastify.
							 | 
						||
| 
								 | 
							
								If you need to provide to your server instance a different version, refer to [the official doc](https://www.fastify.io/docs/latest/Reference/Server/#schemacontroller).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### fast-json-stringify Standalone
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`fast-json-stringify@v4.1.0` introduces the [standalone feature](https://github.com/fastify/fast-json-stringify#standalone) that let you to pre-compile your schemas and use them in your application for a faster startup.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To use this feature, you must be aware of the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1. You must generate and save the application's compiled schemas.
							 | 
						||
| 
								 | 
							
								2. Read the compiled schemas from the file and provide them back to your Fastify application.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Generate and save the compiled schemas
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Fastify helps you to generate the serialization schemas functions and it is your choice to save them where you want.
							 | 
						||
| 
								 | 
							
								To accomplish this, you must use a new compiler: `@fastify/fast-json-stringify-compiler/standalone`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You must provide 2 parameters to this compiler:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `readMode: false`: a boolean to indicate that you want generate the schemas functions string.
							 | 
						||
| 
								 | 
							
								- `storeFunction`" a sync function that must store the source code of the schemas functions. You may provide an async function too, but you must manage errors.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When `readMode: false`, **the compiler is meant to be used in development ONLY**.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								const { StandaloneSerializer } = require('@fastify/fast-json-stringify-compiler')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const factory = StandaloneSerializer({
							 | 
						||
| 
								 | 
							
								  readMode: false,
							 | 
						||
| 
								 | 
							
								  storeFunction (routeOpts, schemaSerializationCode) {
							 | 
						||
| 
								 | 
							
								    // routeOpts is like: { schema, method, url, httpStatus }
							 | 
						||
| 
								 | 
							
								    // schemaSerializationCode is a string source code that is the compiled schema function
							 | 
						||
| 
								 | 
							
								    const fileName = generateFileName(routeOpts)
							 | 
						||
| 
								 | 
							
								    fs.writeFileSync(path.join(__dirname, fileName), schemaSerializationCode)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const app = fastify({
							 | 
						||
| 
								 | 
							
								  jsonShorthand: false,
							 | 
						||
| 
								 | 
							
								  schemaController: {
							 | 
						||
| 
								 | 
							
								    compilersFactory: {
							 | 
						||
| 
								 | 
							
								      buildSerializer: factory
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ... add all your routes with schemas ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								app.ready().then(() => {
							 | 
						||
| 
								 | 
							
								  // at this stage all your schemas are compiled and stored in the file system
							 | 
						||
| 
								 | 
							
								  // now it is important to turn off the readMode
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Read the compiled schemas functions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								At this stage, you should have a file for every route's schema.
							 | 
						||
| 
								 | 
							
								To use them, you must use the `@fastify/fast-json-stringify-compiler/standalone` with the parameters:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `readMode: true`: a boolean to indicate that you want read and use the schemas functions string.
							 | 
						||
| 
								 | 
							
								- `restoreFunction`" a sync function that must return a function to serialize the route's payload.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Important keep away before you continue reading the documentation:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- when you use the `readMode: true`, the application schemas are not compiled (they are ignored). So, if you change your schemas, you must recompile them!
							 | 
						||
| 
								 | 
							
								- as you can see, you must relate the route's schema to the file name using the `routeOpts` object. You may use the `routeOpts.schema.$id` field to do so, it is up to you to define a unique schema identifier.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								const { StandaloneSerializer } = require('@fastify/fast-json-stringify-compiler')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const factory = StandaloneSerializer({
							 | 
						||
| 
								 | 
							
								  readMode: true,
							 | 
						||
| 
								 | 
							
								  restoreFunction (routeOpts) {
							 | 
						||
| 
								 | 
							
								    // routeOpts is like: { schema, method, url, httpStatus }
							 | 
						||
| 
								 | 
							
								    const fileName = generateFileName(routeOpts)
							 | 
						||
| 
								 | 
							
								    return require(path.join(__dirname, fileName))
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const app = fastify({
							 | 
						||
| 
								 | 
							
								  jsonShorthand: false,
							 | 
						||
| 
								 | 
							
								  schemaController: {
							 | 
						||
| 
								 | 
							
								    compilersFactory: {
							 | 
						||
| 
								 | 
							
								      buildSerializer: factory
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ... add all your routes with schemas as before...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								app.listen({ port: 3000 })
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### How it works
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This module provide a factory function to produce [Serializer Compilers](https://www.fastify.io/docs/latest/Reference/Server/#serializercompiler) functions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## License
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Licensed under [MIT](./LICENSE).
							 |