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.
		
		
		
		
		
			
		
			
				
					206 lines
				
				6.3 KiB
			
		
		
			
		
	
	
					206 lines
				
				6.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								import cookie from '../plugin';
							 | 
						||
| 
								 | 
							
								import { expectType } from 'tsd';
							 | 
						||
| 
								 | 
							
								import * as fastifyCookieStar from '..';
							 | 
						||
| 
								 | 
							
								import fastifyCookieCjsImport = require('..');
							 | 
						||
| 
								 | 
							
								import fastifyCookieDefault, { fastifyCookie as fastifyCookieNamed  } from '..';
							 | 
						||
| 
								 | 
							
								import fastify, { FastifyInstance,  FastifyReply, setCookieWrapper } from 'fastify';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const fastifyCookieCjs = require('..');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const app: FastifyInstance = fastify();
							 | 
						||
| 
								 | 
							
								app.register(fastifyCookieNamed);
							 | 
						||
| 
								 | 
							
								app.register(fastifyCookieDefault);
							 | 
						||
| 
								 | 
							
								app.register(fastifyCookieCjs);
							 | 
						||
| 
								 | 
							
								app.register(fastifyCookieCjsImport.default);
							 | 
						||
| 
								 | 
							
								app.register(fastifyCookieCjsImport.fastifyCookie);
							 | 
						||
| 
								 | 
							
								app.register(fastifyCookieStar.default);
							 | 
						||
| 
								 | 
							
								app.register(fastifyCookieStar.fastifyCookie);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.FastifyCookie>(fastifyCookieNamed);
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.FastifyCookie>(fastifyCookieDefault);
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.FastifyCookie>(fastifyCookieCjsImport.default);
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.FastifyCookie>(fastifyCookieCjsImport.fastifyCookie);
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.FastifyCookie>(fastifyCookieStar.default);
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.FastifyCookie>(
							 | 
						||
| 
								 | 
							
								  fastifyCookieStar.fastifyCookie
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								expectType<any>(fastifyCookieCjs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.Sign>(fastifyCookieDefault.sign);
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.Unsign>(fastifyCookieDefault.unsign);
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.SignerFactory >(fastifyCookieDefault.signerFactory );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.Sign>(fastifyCookieNamed.sign);
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.Unsign>(fastifyCookieNamed.unsign);
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.SignerFactory >(fastifyCookieNamed.signerFactory );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const server = fastify();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								server.register(cookie);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								server.after((_err) => {
							 | 
						||
| 
								 | 
							
								  expectType<{ [key: string]: string }>(
							 | 
						||
| 
								 | 
							
								    // See https://github.com/fastify/fastify-cookie#manual-cookie-parsing
							 | 
						||
| 
								 | 
							
								    server.parseCookie('sessionId=aYb4uTIhdBXC')
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  server.get('/', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    const test = request.cookies.test;
							 | 
						||
| 
								 | 
							
								    expectType<string | undefined>(test);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    expectType<setCookieWrapper>(reply.cookie);
							 | 
						||
| 
								 | 
							
								    expectType<setCookieWrapper>(reply.setCookie);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    expectType<FastifyReply>(
							 | 
						||
| 
								 | 
							
								      reply
							 | 
						||
| 
								 | 
							
								        .setCookie('test', test!, { domain: 'example.com', path: '/' })
							 | 
						||
| 
								 | 
							
								        .clearCookie('foo')
							 | 
						||
| 
								 | 
							
								        .send({ hello: 'world' })
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const serverWithHttp2 = fastify({ http2: true });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								serverWithHttp2.register(cookie);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								serverWithHttp2.after(() => {
							 | 
						||
| 
								 | 
							
								  serverWithHttp2.get('/', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    const test = request.cookies.test;
							 | 
						||
| 
								 | 
							
								    reply
							 | 
						||
| 
								 | 
							
								      .setCookie('test', test!, { domain: 'example.com', path: '/' })
							 | 
						||
| 
								 | 
							
								      .clearCookie('foo')
							 | 
						||
| 
								 | 
							
								      .send({ hello: 'world' });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const testSamesiteOptionsApp = fastify();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								testSamesiteOptionsApp.register(cookie);
							 | 
						||
| 
								 | 
							
								testSamesiteOptionsApp.after(() => {
							 | 
						||
| 
								 | 
							
								  server.get('/test-samesite-option-true', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    const test = request.cookies.test;
							 | 
						||
| 
								 | 
							
								    reply.setCookie('test', test!, { sameSite: true }).send({ hello: 'world' });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  server.get('/test-samesite-option-false', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    const test = request.cookies.test;
							 | 
						||
| 
								 | 
							
								    reply.setCookie('test', test!, { sameSite: false }).send({ hello: 'world' });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  server.get('/test-samesite-option-lax', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    const test = request.cookies.test;
							 | 
						||
| 
								 | 
							
								    reply.setCookie('test', test!, { sameSite: 'lax' }).send({ hello: 'world' });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  server.get('/test-samesite-option-strict', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    const test = request.cookies.test;
							 | 
						||
| 
								 | 
							
								    reply
							 | 
						||
| 
								 | 
							
								      .setCookie('test', test!, { sameSite: 'strict' })
							 | 
						||
| 
								 | 
							
								      .send({ hello: 'world' });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  server.get('/test-samesite-option-none', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    const test = request.cookies.test;
							 | 
						||
| 
								 | 
							
								    reply
							 | 
						||
| 
								 | 
							
								      .setCookie('test', test!, { sameSite: 'none' })
							 | 
						||
| 
								 | 
							
								      .send({ hello: 'world' });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const appWithImplicitHttpSigned = fastify();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								appWithImplicitHttpSigned.register(cookie, {
							 | 
						||
| 
								 | 
							
								  secret: 'testsecret',
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								appWithImplicitHttpSigned.register(cookie, {
							 | 
						||
| 
								 | 
							
								  secret: 'testsecret',
							 | 
						||
| 
								 | 
							
								  algorithm: 'sha512'
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								appWithImplicitHttpSigned.after(() => {
							 | 
						||
| 
								 | 
							
								  server.get('/', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    appWithImplicitHttpSigned.unsignCookie(request.cookies.test!);
							 | 
						||
| 
								 | 
							
								    appWithImplicitHttpSigned.unsignCookie('test');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    reply.unsignCookie(request.cookies.test!);
							 | 
						||
| 
								 | 
							
								    reply.unsignCookie('test');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    request.unsignCookie(request.cookies.anotherTest!);
							 | 
						||
| 
								 | 
							
								    request.unsignCookie('anotherTest');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    reply.send({ hello: 'world' });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const appWithRotationSecret = fastify();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								appWithRotationSecret.register(cookie, {
							 | 
						||
| 
								 | 
							
								  secret: ['testsecret'],
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								appWithRotationSecret.after(() => {
							 | 
						||
| 
								 | 
							
								  server.get('/', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    reply.unsignCookie(request.cookies.test!);
							 | 
						||
| 
								 | 
							
								    const { valid, renew, value } = reply.unsignCookie('test');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    expectType<boolean>(valid);
							 | 
						||
| 
								 | 
							
								    expectType<boolean>(renew);
							 | 
						||
| 
								 | 
							
								    expectType<string | null>(value);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    reply.send({ hello: 'world' });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const appWithParseOptions = fastify();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const parseOptions: fastifyCookieStar.CookieSerializeOptions = {
							 | 
						||
| 
								 | 
							
								  domain: 'example.com',
							 | 
						||
| 
								 | 
							
								  encode: (value: string) => value,
							 | 
						||
| 
								 | 
							
								  expires: new Date(),
							 | 
						||
| 
								 | 
							
								  httpOnly: true,
							 | 
						||
| 
								 | 
							
								  maxAge: 3600,
							 | 
						||
| 
								 | 
							
								  path: '/',
							 | 
						||
| 
								 | 
							
								  sameSite: 'lax',
							 | 
						||
| 
								 | 
							
								  secure: true,
							 | 
						||
| 
								 | 
							
								  signed: true,
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								expectType<fastifyCookieStar.CookieSerializeOptions>(parseOptions);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								appWithParseOptions.register(cookie, {
							 | 
						||
| 
								 | 
							
								  secret: 'testsecret',
							 | 
						||
| 
								 | 
							
								  parseOptions,
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								appWithParseOptions.after(() => {
							 | 
						||
| 
								 | 
							
								  server.get('/', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    const { valid, renew, value } = reply.unsignCookie(request.cookies.test!);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    expectType<boolean>(valid);
							 | 
						||
| 
								 | 
							
								    expectType<boolean>(renew);
							 | 
						||
| 
								 | 
							
								    expectType<string | null>(value);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const appWithCustomSigner = fastify()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								appWithCustomSigner.register(cookie, {
							 | 
						||
| 
								 | 
							
								  secret: {
							 | 
						||
| 
								 | 
							
								    sign: (x) => x + '.signed',
							 | 
						||
| 
								 | 
							
								    unsign: (x) => {
							 | 
						||
| 
								 | 
							
								      if (x.endsWith('.signed')) { return { renew: false, valid: true, value: x.slice(0, -7) } }
							 | 
						||
| 
								 | 
							
								      return { renew: false, valid: false, value: null }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								appWithCustomSigner.after(() => {
							 | 
						||
| 
								 | 
							
								  server.get('/', (request, reply) => {
							 | 
						||
| 
								 | 
							
								    reply.unsignCookie(request.cookies.test!)
							 | 
						||
| 
								 | 
							
								    const { valid, renew, value } = reply.unsignCookie('test')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    expectType<boolean>(valid)
							 | 
						||
| 
								 | 
							
								    expectType<boolean>(renew)
							 | 
						||
| 
								 | 
							
								    expectType<string | null>(value)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    reply.send({ hello: 'world' })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								new fastifyCookieStar.Signer('secretString')
							 | 
						||
| 
								 | 
							
								new fastifyCookieStar.Signer(['secretStringInArray'])
							 | 
						||
| 
								 | 
							
								const signer = new fastifyCookieStar.Signer(['secretStringInArray'], 'sha256')
							 | 
						||
| 
								 | 
							
								signer.sign('Lorem Ipsum')
							 | 
						||
| 
								 | 
							
								signer.unsign('Lorem Ipsum')
							 |