0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2025-02-03 23:09:17 -05:00
verdaccio/packages/mock/src/server.ts

272 lines
7.2 KiB
TypeScript
Raw Normal View History

import assert from 'assert';
import _ from 'lodash';
import buildDebug from 'debug';
import { API_MESSAGE, HEADERS, HTTP_STATUS, TOKEN_BASIC } from '@verdaccio/commons-api';
import { buildToken } from '@verdaccio/utils';
2020-11-14 16:52:37 +01:00
import smartRequest, { PromiseAssert } from './request';
2020-03-03 23:59:19 +01:00
import { CREDENTIALS } from './constants';
2020-03-03 23:59:19 +01:00
import getPackage from './fixtures/package';
2013-09-25 14:01:55 +04:00
const buildAuthHeader = (user, pass): string => {
return buildToken(TOKEN_BASIC, Buffer.from(`${user}:${pass}`).toString('base64'));
2017-04-19 21:15:28 +02:00
};
2013-09-25 14:01:55 +04:00
const debug = buildDebug('verdaccio:mock:server');
2020-11-14 16:52:37 +01:00
export interface IRequestPromise {
status(reason: any): any;
body_ok(reason: any): any;
body_error(reason: any): any;
request(reason: any): any;
response(reason: any): any;
send(reason: any): any;
}
export interface IServerBridge {
url: string;
userAgent: string;
authstr: string;
request(options: any): typeof PromiseAssert;
auth(name: string, password: string): IRequestPromise;
auth(name: string, password: string): IRequestPromise;
logout(token: string): Promise<any>;
getPackage(name: string): Promise<any>;
putPackage(name: string, data: any): Promise<any>;
putVersion(name: string, version: string, data: any): Promise<any>;
getTarball(name: string, filename: string): Promise<any>;
putTarball(name: string, filename: string, data: any): Promise<any>;
removeTarball(name: string): Promise<any>;
removeSingleTarball(name: string, filename: string): Promise<any>;
addTag(name: string, tag: string, version: string): Promise<any>;
putTarballIncomplete(
name: string,
filename: string,
data: any,
size: number,
cb: Function
): Promise<any>;
addPackage(name: string): Promise<any>;
whoami(): Promise<any>;
ping(): Promise<any>;
debug(): IRequestPromise;
}
export default class Server implements IServerBridge {
public url: string;
public userAgent: string;
public authstr: string;
public constructor(url: string) {
this.url = url.replace(/\/$/, '');
2017-06-30 23:11:12 +02:00
this.userAgent = 'node/v8.1.2 linux x64';
this.authstr = buildAuthHeader(CREDENTIALS.user, CREDENTIALS.password);
}
public request(options: any): any {
debug('request to %o', options.uri);
assert(options.uri);
2017-12-03 22:23:06 +01:00
const headers = options.headers || {};
headers.accept = headers.accept || HEADERS.JSON;
headers['user-agent'] = headers['user-agent'] || this.userAgent;
headers.authorization = headers.authorization || this.authstr;
debug('request headers %o', headers);
return smartRequest({
url: this.url + options.uri,
method: options.method || 'GET',
headers: headers,
encoding: options.encoding,
2020-03-03 23:59:19 +01:00
json: _.isNil(options.json) === false ? options.json : true,
});
}
public auth(name: string, password: string) {
debug('request auth %o:%o', name, password);
this.authstr = buildAuthHeader(name, password);
return this.request({
uri: `/-/user/org.couchdb.user:${encodeURIComponent(name)}/-rev/undefined`,
method: 'PUT',
json: {
name,
password,
email: `${CREDENTIALS.user}@example.com`,
_id: `org.couchdb.user:${name}`,
type: 'user',
roles: [],
2020-03-03 23:59:19 +01:00
date: new Date(),
},
});
}
public logout(token: string) {
return this.request({
uri: `/-/user/token/${encodeURIComponent(token)}`,
2020-03-03 23:59:19 +01:00
method: 'DELETE',
});
}
public getPackage(name: string) {
return this.request({
uri: `/${encodeURIComponent(name)}`,
2020-03-03 23:59:19 +01:00
method: 'GET',
});
}
public putPackage(name: string, data) {
if (_.isObject(data) && !Buffer.isBuffer(data)) {
data = JSON.stringify(data);
}
return this.request({
uri: `/${encodeURIComponent(name)}`,
method: 'PUT',
headers: {
2020-03-03 23:59:19 +01:00
[HEADERS.CONTENT_TYPE]: HEADERS.JSON,
},
}).send(data);
}
public putVersion(name: string, version: string, data: any) {
if (_.isObject(data) && !Buffer.isBuffer(data)) {
data = JSON.stringify(data);
}
return this.request({
uri: `/${encodeURIComponent(name)}/${encodeURIComponent(version)}/-tag/latest`,
method: 'PUT',
headers: {
2020-03-03 23:59:19 +01:00
[HEADERS.CONTENT_TYPE]: HEADERS.JSON,
},
}).send(data);
}
public getTarball(name: string, filename: string) {
return this.request({
uri: `/${encodeURIComponent(name)}/-/${encodeURIComponent(filename)}`,
method: 'GET',
2020-03-03 23:59:19 +01:00
encoding: null,
});
}
public putTarball(name: string, filename: string, data: any) {
return this.request({
uri: `/${encodeURIComponent(name)}/-/${encodeURIComponent(filename)}/whatever`,
method: 'PUT',
headers: {
2020-03-03 23:59:19 +01:00
[HEADERS.CONTENT_TYPE]: HEADERS.OCTET_STREAM,
},
}).send(data);
}
public removeTarball(name: string) {
return this.request({
uri: `/${encodeURIComponent(name)}/-rev/whatever`,
method: 'DELETE',
headers: {
2020-03-03 23:59:19 +01:00
[HEADERS.CONTENT_TYPE]: HEADERS.JSON_CHARSET,
},
});
}
public removeSingleTarball(name: string, filename: string) {
return this.request({
uri: `/${encodeURIComponent(name)}/-/${filename}/-rev/whatever`,
method: 'DELETE',
headers: {
2020-03-03 23:59:19 +01:00
[HEADERS.CONTENT_TYPE]: HEADERS.JSON_CHARSET,
},
});
}
public addTag(name: string, tag: string, version: string) {
return this.request({
uri: `/${encodeURIComponent(name)}/${encodeURIComponent(tag)}`,
method: 'PUT',
headers: {
2020-03-03 23:59:19 +01:00
[HEADERS.CONTENT_TYPE]: HEADERS.JSON,
},
}).send(JSON.stringify(version));
}
public putTarballIncomplete(
pkgName: string,
filename: string,
data: any,
headerContentSize: number
): Promise<any> {
2020-03-03 23:59:19 +01:00
const promise = this.request({
2019-09-26 18:22:14 +02:00
uri: `/${encodeURIComponent(pkgName)}/-/${encodeURIComponent(filename)}/whatever`,
method: 'PUT',
headers: {
2019-05-19 21:37:43 +02:00
[HEADERS.CONTENT_TYPE]: HEADERS.OCTET_STREAM,
2020-03-03 23:59:19 +01:00
[HEADERS.CONTENT_LENGTH]: headerContentSize,
},
2020-03-03 23:59:19 +01:00
timeout: 1000,
});
promise.request(function (req) {
req.write(data);
2019-09-26 18:22:14 +02:00
// it auto abort the request
setTimeout(function () {
req.req.abort();
}, 20);
});
return new Promise<void>(function (resolve, reject) {
promise
.then(function () {
reject(Error('no error'));
})
.catch(function (err) {
if (err.code === 'ECONNRESET') {
// @ts-ignore
resolve();
} else {
reject(err);
}
});
});
}
public addPackage(name: string) {
return this.putPackage(name, getPackage(name))
.status(HTTP_STATUS.CREATED)
.body_ok(API_MESSAGE.PKG_CREATED);
}
public whoami() {
debug('request whoami');
2017-06-30 23:11:12 +02:00
return this.request({
uri: '/-/whoami',
})
.status(HTTP_STATUS.OK)
.then(function (body) {
debug('request whoami body %o', body);
2017-06-30 23:11:12 +02:00
return body.username;
2017-04-19 21:15:28 +02:00
});
}
public ping() {
return this.request({
uri: '/-/ping',
})
.status(HTTP_STATUS.OK)
.then(function (body) {
return body;
});
}
public debug() {
return this.request({
uri: '/-/_debug',
method: 'GET',
headers: {
2020-03-03 23:59:19 +01:00
[HEADERS.CONTENT_TYPE]: HEADERS.JSON,
},
});
}
}