cnpmcore
Version:
Private NPM Registry for Enterprise
136 lines • 11.1 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { setTimeout } from 'node:timers/promises';
import { ContextProto, AccessLevel, Inject, } from 'egg';
import { isTimeoutError } from "../ErrorUtil.js";
const INSTANCE_NAME = 'npmRegistry';
let NPMRegistry = class NPMRegistry {
constructor() {
this.timeout = 10_000;
}
get registry() {
return this.registryHost || this.config.cnpmcore.sourceRegistry;
}
setRegistryHost(registryHost = '') {
this.registryHost = registryHost;
}
async getFullManifests(fullname, optionalConfig) {
const res = await this.getFullManifestsBuffer(fullname, optionalConfig);
// @ts-expect-error JSON.parse accepts Buffer in Node.js, though TypeScript types don't reflect this
res.data = JSON.parse(res.data);
return res;
}
async getFullManifestsBuffer(fullname, optionalConfig) {
let retries = optionalConfig?.retries || 3;
// set query t=timestamp, make sure CDN cache disable
// cache=0 is sync worker request flag
const url = `${this.registry}/${encodeURIComponent(fullname)}?t=${Date.now()}&cache=0`;
let lastError;
while (retries > 0) {
try {
// large package: https://r.cnpmjs.org/%40procore%2Fcore-icons
// https://r.cnpmjs.org/intraactive-sdk-ui 44s
const authorization = this.genAuthorizationHeader(optionalConfig?.remoteAuthToken);
return await this.requestBuffer('GET', url, undefined, {
timeout: 120_000,
headers: { authorization },
});
}
catch (err) {
if (isTimeoutError(err)) {
throw err;
}
lastError = err;
}
retries--;
if (retries > 0) {
// sleep 1s ~ 4s in random
const delay = process.env.NODE_ENV === 'test' ? 1 : 1000 + Math.random() * 4000;
await setTimeout(delay);
}
}
throw lastError;
}
// app.put('/:name/sync', sync.sync);
async createSyncTask(fullname, optionalConfig) {
const authorization = this.genAuthorizationHeader(optionalConfig?.remoteAuthToken);
const url = `${this.registry}/${encodeURIComponent(fullname)}/sync?sync_upstream=true&nodeps=true`;
// {
// ok: true,
// logId: logId
// };
return await this.requestJSON('PUT', url, undefined, { authorization });
}
// app.get('/:name/sync/log/:id', sync.getSyncLog);
async getSyncTask(fullname, id, offset, optionalConfig) {
const authorization = this.genAuthorizationHeader(optionalConfig?.remoteAuthToken);
const url = `${this.registry}/${encodeURIComponent(fullname)}/sync/log/${id}?offset=${offset}`;
// { ok: true, syncDone: boolean, log: string, logUrl: string, error?: string }
// https://registry.npmmirror.com/viewport-cli/sync/log/6943749899c5663aad8a534c
return await this.requestJSON('GET', url, undefined, { authorization });
}
async getDownloadRanges(registry, fullname, start, end, optionalConfig) {
const authorization = this.genAuthorizationHeader(optionalConfig?.remoteAuthToken);
const url = `${registry}/downloads/range/${start}:${end}/${encodeURIComponent(fullname)}`;
return await this.requestJSON('GET', url, undefined, { authorization });
}
async requestJSON(method, url, params, options) {
return await this.request(method, url, params, {
...options,
dataType: 'json',
});
}
async requestBuffer(method, url, params, options) {
return await this.request(method, url, params, {
...options,
dataType: 'buffer',
});
}
async request(method, url, params, options) {
const res = (await this.httpClient.request(url, {
method,
data: params,
timing: true,
retry: 3,
timeout: this.timeout,
followRedirect: true,
gzip: true,
...options,
}));
this.logger.info('[NPMRegistry:request] %s %s, status: %s', method, url, res.status);
return {
method,
...res,
};
}
genAuthorizationHeader(remoteAuthToken) {
return remoteAuthToken ? `Bearer ${remoteAuthToken}` : '';
}
};
__decorate([
Inject(),
__metadata("design:type", Function)
], NPMRegistry.prototype, "logger", void 0);
__decorate([
Inject(),
__metadata("design:type", Function)
], NPMRegistry.prototype, "httpClient", void 0);
__decorate([
Inject(),
__metadata("design:type", Object)
], NPMRegistry.prototype, "config", void 0);
NPMRegistry = __decorate([
ContextProto({
name: INSTANCE_NAME,
accessLevel: AccessLevel.PUBLIC,
})
], NPMRegistry);
export { NPMRegistry };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTlBNUmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hcHAvY29tbW9uL2FkYXB0ZXIvTlBNUmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFDTCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sR0FNUCxNQUFNLEtBQUssQ0FBQztBQUdiLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUlqRCxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUM7QUFRN0IsSUFBTSxXQUFXLEdBQWpCLE1BQU0sV0FBVztJQUFqQjtRQU9HLFlBQU8sR0FBRyxNQUFNLENBQUM7SUE0STNCLENBQUM7SUF6SUMsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztJQUNsRSxDQUFDO0lBRU0sZUFBZSxDQUFDLFlBQVksR0FBRyxFQUFFO1FBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCLENBQzNCLFFBQWdCLEVBQ2hCLGNBQStEO1FBRS9ELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN4RSxvR0FBb0c7UUFDcEcsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxPQUFPLEdBQXVELENBQUM7SUFDakUsQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0IsQ0FDakMsUUFBZ0IsRUFDaEIsY0FBK0Q7UUFFL0QsSUFBSSxPQUFPLEdBQUcsY0FBYyxFQUFFLE9BQU8sSUFBSSxDQUFDLENB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