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

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