UNPKG

cnpmcore

Version:

Private NPM Registry for Enterprise

85 lines 6.53 kB
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 { randomUUID } from 'node:crypto'; import { AccessLevel, Inject, SingletonProto } from 'egg'; const ONE_DAY = 3600 * 24; let CacheAdapter = class CacheAdapter { async setBytes(key, bytes) { await this.redis.setex(key, ONE_DAY, bytes); } async getBytes(key) { return await this.redis.getBuffer(key); } async set(key, text) { await this.redis.setex(key, ONE_DAY, text); } async get(key) { return await this.redis.get(key); } async delete(key) { await this.redis.del(key); } async lock(key, seconds) { const lockName = this.getLockName(key); const now = Date.now(); const existsTimestamp = await this.redis.get(lockName); if (existsTimestamp) { if (now < Number.parseInt(existsTimestamp)) { return null; } // lock timeout, delete it await this.redis.del(lockName); } // token format: `<expiry>.<uuid>` // - keep the numeric expiry prefix so the timeout check above can recover it via Number.parseInt() // - append a random uuid so every acquisition gets a unique token, even when now and seconds are identical const timestamp = `${now + seconds * 1000}.${randomUUID()}`; const code = await this.redis.setnx(lockName, timestamp); // setnx fail, lock fail if (code === 0) return null; // expire await this.redis.expire(lockName, seconds); return timestamp; } async unlock(key, lockTimestamp) { const lockName = this.getLockName(key); const existsTimestamp = await this.redis.get(lockName); if (!existsTimestamp || lockTimestamp !== existsTimestamp) return; await this.redis.del(lockName); } async usingLock(key, seconds, func) { const lockTimestamp = await this.lock(key, seconds); if (!lockTimestamp) return false; try { await func(); } finally { await this.unlock(key, lockTimestamp); } return true; } getLockName(key) { return `CNPMCORE_L_${key}`; } }; __decorate([ Inject(), __metadata("design:type", Function) ], CacheAdapter.prototype, "redis", void 0); CacheAdapter = __decorate([ SingletonProto({ accessLevel: AccessLevel.PUBLIC, }) ], CacheAdapter); export { CacheAdapter }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FjaGVBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXBwL2NvbW1vbi9hZGFwdGVyL0NhY2hlQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUsxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBS25CLElBQU0sWUFBWSxHQUFsQixNQUFNLFlBQVk7SUFJdkIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUN2QyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBVztRQUN4QixPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLElBQVk7UUFDakMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVc7UUFDbkIsT0FBTyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQVc7UUFDdEIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FB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