@verdaccio/server-fastify
Version:
fastify server api implementation
70 lines (56 loc) • 2.03 kB
text/typescript
/* eslint-disable @typescript-eslint/no-unused-vars */
import buildDebug from 'debug';
import { FastifyInstance } from 'fastify';
import { HEADERS, HEADER_TYPE } from '@verdaccio/core';
const debug = buildDebug('verdaccio:fastify:tarball');
interface ParamsInterface {
package: string;
filename: string;
}
async function tarballRoute(fastify: FastifyInstance) {
fastify.get<{ Params: ParamsInterface }>('/:package/-/:filename', async (request, reply) => {
const { package: pkg, filename } = request.params;
debug('stream tarball for %s@%s', pkg, filename);
const abort = new AbortController();
const stream = (await fastify.storage.getTarballNext(pkg, filename, {
signal: abort.signal,
// enableRemote: true,
})) as any;
stream.on('content-length', (size: number) => {
reply.header(HEADER_TYPE.CONTENT_LENGTH, size);
});
// request.socket.on('abort', () => {
// debug('request aborted for %o', request.url);
// abort.abort();
// });
return stream;
});
interface ScopeParamsInterface {
filename: string;
scope: string;
name: string;
}
fastify.get<{ Params: ScopeParamsInterface }>(
'/:scope/:name/-/:filename',
async (request, reply) => {
const abort = new AbortController();
const { scope, name, filename } = request.params;
const scopedPackage = `${scope}/${name}`;
debug('stream scope tarball for %s@%s', scopedPackage, filename);
const stream = (await fastify.storage.getTarballNext(scopedPackage, filename, {
signal: abort.signal,
// enableRemote: true,
})) as any;
stream.on('content-length', (size: number) => {
reply.header(HEADER_TYPE.CONTENT_LENGTH, size);
});
// request.socket.on('abort', () => {
// debug('request aborted for %o', request.url);
// abort.abort();
// });
reply.header(HEADERS.CONTENT_TYPE, HEADERS.OCTET_STREAM);
return stream;
}
);
}
export default tarballRoute;