lakutata
Version:
An IoC-based universal application framework.
738 lines (609 loc) • 19.7 kB
JavaScript
/* Build Date: Mon Jan 05 2026 23:52:23 GMT+0800 (China Standard Time) */
;
Object.defineProperty(exports, Symbol.toStringTag, {
value: "Module"
});
const e = require("../../../vendor/Package.internal.3.cjs");
const r = require("events");
require("buffer");
const t = require("../../../vendor/Package.internal.524.cjs");
const s = require("../../lib/core/Component.cjs");
const i = require("../../decorators/di/Configurable.cjs");
const a = require("../../lib/helpers/As.cjs");
const c = require("./adapters/CreateFileCacheAdapter.cjs");
const n = require("./adapters/CreateRedisCacheAdapter.cjs");
const o = require("./adapters/CreateMemcacheCacheAdapter.cjs");
const l = require("./adapters/CreateMongoCacheAdapter.cjs");
const u = require("./adapters/CreateSqliteCacheAdapter.cjs");
const h = require("./adapters/CreatePostgresCacheAdapter.cjs");
const d = require("./adapters/CreateMysqlCacheAdapter.cjs");
const p = require("../../../vendor/Package.internal.7.cjs");
const m = require("./options/FileCacheOptions.cjs");
const y = require("./options/RedisCacheOptions.cjs");
const j = require("./options/MemcacheCacheOptions.cjs");
const q = require("./options/MongoCacheOptions.cjs");
const f = require("./options/SqliteCacheOptions.cjs");
const b = require("./options/PostgresCacheOptions.cjs");
const C = require("./options/MysqlCacheOptions.cjs");
require("../../../vendor/Package.internal.4.cjs");
require("../../lib/base/async-constructor/AsyncConstructor.cjs");
require("../../lib/base/async-constructor/Append.cjs");
require("../../lib/helpers/IsPromiseLike.cjs");
require("../../lib/helpers/IsPromise.cjs");
require("util/types");
require("../../decorators/di/Lifetime.cjs");
require("../../lib/base/internal/ObjectLifetime.cjs");
require("../../constants/DIMetadataKey.cjs");
require("../../../vendor/Package.internal.1.cjs");
require("../../../vendor/Package.internal.2.cjs");
require("../../exceptions/di/LifetimeLockedException.cjs");
require("../../lib/base/abstracts/Exception.cjs");
require("../../../vendor/Package.internal.5.cjs");
require("../../../vendor/Package.internal.6.cjs");
require("../../lib/base/internal/ThrowWarning.cjs");
require("../../lib/helpers/Templating.cjs");
require("../../lib/base/internal/CamelCase.cjs");
require("../../lib/helpers/NoCase.cjs");
require("../../lib/helpers/DevNull.cjs");
require("../../exceptions/MethodNotFoundException.cjs");
require("../../lib/ioc/DependencyInjectionContainer.cjs");
require("util");
require("../../lib/ioc/Errors.cjs");
require("../../exceptions/di/DependencyInjectionException.cjs");
require("../../lib/base/internal/ConstructorSymbol.cjs");
require("node:crypto");
require("../../lib/base/internal/DataValidator.cjs");
require("node:util/types");
require("../../lib/validation/VLD.cjs");
require("url");
require("../../exceptions/dto/InvalidValueException.cjs");
require("../../../vendor/Package.internal.8.cjs");
require("../../lib/helpers/IsHtml.cjs");
require("../../lib/helpers/IsXML.cjs");
require("../../constants/DTOMetadataKey.cjs");
require("../../lib/helpers/ObjectConstructor.cjs");
require("../../lib/helpers/ObjectParentConstructors.cjs");
require("../../lib/helpers/ObjectParentConstructor.cjs");
require("../../lib/helpers/ObjectPrototype.cjs");
require("../../lib/ioc/InjectionMode.cjs");
require("../../lib/ioc/Lifetime.cjs");
require("../../lib/ioc/ListModules.cjs");
require("os");
require("path");
require("stream");
require("fs");
require("../../lib/ioc/Utils.cjs");
require("../../lib/ioc/FunctionTokenizer.cjs");
require("../../lib/ioc/LoadModules.cjs");
require("../../lib/ioc/Resolvers.cjs");
require("../../lib/ioc/ParamParser.cjs");
require("../../lib/base/internal/ObjectWeakRefs.cjs");
require("../../lib/base/internal/ConfigurableRecordsInjection.cjs");
require("../../lib/base/internal/ObjectConfiguration.cjs");
require("../../lib/base/internal/ObjectInjection.cjs");
require("../../lib/base/internal/ObjectContainer.cjs");
require("../../decorators/dto/Expect.cjs");
require("../../decorators/dto/IndexSignature.cjs");
require("../../decorators/dto/Accept.cjs");
require("../../lib/base/internal/MethodValidation.cjs");
require("../../exceptions/dto/InvalidMethodAcceptException.cjs");
require("../../exceptions/dto/InvalidMethodReturnException.cjs");
require("../../lib/helpers/IsEmptyObject.cjs");
require("../../lib/base/EventEmitter.cjs");
require("../../lib/core/Provider.cjs");
require("../../../vendor/Package.internal.310.cjs");
require("fs/promises");
require("./lib/IsDriverPackageInstalled.cjs");
require("./exceptions/CacheDriverNotFoundException.cjs");
require("../../lib/helpers/URLBuilder.cjs");
const g = e => e && e.__esModule ? e : {
default: e
};
const v = g(r);
var k = new Map;
function P(e) {
return k.has(e);
}
function w(e) {
k.set(e, []);
}
function O(e) {
k.delete(e);
}
function A(e, r) {
const t = M(e);
t.push(r);
k.set(e, t);
}
function M(e) {
return k.get(e) ?? [];
}
async function S(e) {
return new Promise((r, t) => {
const s = {
resolve: r,
reject: t
};
A(e, s);
});
}
function x(e) {
const r = M(e);
O(e);
return r;
}
function _(e) {
const {key: r, error: t, result: s} = e;
for (const e of x(r)) {
if (t) {
e.reject(t);
} else {
e.resolve(s);
}
}
}
async function I(e, r) {
if (!P(e)) {
w(e);
try {
const t = await Promise.resolve(r());
_({
key: e,
result: t
});
return t;
} catch (r) {
_({
key: e,
error: r
});
throw r;
}
}
return S(e);
}
function T(e) {
return e !== null && typeof e === "object" && !Array.isArray(e);
}
function D(e, r) {
return typeof e === "number" && typeof r === "number" ? e < r : false;
}
function L(e, ...r) {
return typeof e === "function" ? e(...r) : e;
}
var E = e => e === 0 ? "primary" : `secondary:${e - 1}`;
var B = e => {
const r = new v.default;
const s = new t.Keyv;
s.serialize = void 0;
s.deserialize = void 0;
const i = e?.stores?.length ? e.stores : [ s ];
const a = e?.nonBlocking ?? false;
const c = e?.cacheId ?? Math.random().toString(36).slice(2);
const n = async e => {
let t;
if (a) {
try {
t = await Promise.race(i.map(async r => r.get(e)));
if (t === void 0) {
return void 0;
}
} catch (t) {
r.emit("get", {
key: e,
error: t
});
}
} else {
for (let s = 0; s < i.length; s++) {
const a = i[s];
try {
const i = await a.get(e);
if (i !== void 0) {
t = i;
r.emit("get", {
key: e,
value: t,
store: E(s)
});
break;
}
} catch (t) {
r.emit("get", {
key: e,
error: t,
store: E(s)
});
}
}
}
return t;
};
const o = async e => {
let t = e.map(() => void 0);
if (a) {
try {
t = await Promise.race(i.map(async r => r.getMany(e)));
} catch (t) {
r.emit("mget", {
keys: e,
error: t
});
}
} else {
for (const s of i) {
try {
const r = t.map((r, t) => r === void 0 ? {
originalIndex: t,
key: e[t]
} : void 0).filter(e => e !== void 0);
if (r.length === 0) {
break;
}
const i = r.map(e => e.key);
const a = await s.getMany(i);
for (const [e, s] of a.entries()) {
if (s === void 0) {
continue;
}
const {originalIndex: i} = r[e];
t[i] = s;
}
} catch (t) {
r.emit("mget", {
keys: e,
error: t
});
}
}
}
r.emit("mget", {
keys: e,
values: t
});
return t;
};
const l = async e => {
let t;
if (a) {
try {
t = await Promise.race(i.map(async r => r.get(e, {
raw: true
})));
if (t === void 0) {
return void 0;
}
} catch (t) {
r.emit("ttl", {
key: e,
error: t
});
}
} else {
for (const s of i) {
try {
const i = await s.get(e, {
raw: true
});
if (i !== void 0) {
t = i;
r.emit("ttl", {
key: e,
value: t
});
break;
}
} catch (t) {
r.emit("ttl", {
key: e,
error: t
});
}
}
}
if (t?.expires) {
return t.expires;
}
return void 0;
};
const u = async (t, s, i, c) => {
try {
const n = t.map(async (t, a) => {
await t.set(s, i, c ?? e?.ttl);
r.emit("set", {
key: s,
value: i,
store: E(a)
});
});
if (a) {
Promise.all(n);
r.emit("set", {
key: s,
value: i
});
return i;
}
await Promise.all(n);
r.emit("set", {
key: s,
value: i
});
return i;
} catch (e) {
r.emit("set", {
key: s,
value: i,
error: e
});
return Promise.reject(e);
}
};
const h = async (t, s) => {
const i = s.map(({key: r, value: t, ttl: s}) => ({
key: r,
value: t,
ttl: s ?? e?.ttl
}));
try {
const e = t.map(async e => e.setMany(i));
if (a) {
Promise.all(e);
r.emit("mset", {
list: i
});
return i;
}
await Promise.all(e);
r.emit("mset", {
list: i
});
return i;
} catch (e) {
r.emit("mset", {
list: i,
error: e
});
return Promise.reject(e);
}
};
const d = async e => {
try {
if (a) {
Promise.all(i.map(async r => r.delete(e)));
r.emit("del", {
key: e
});
return true;
}
await Promise.all(i.map(async r => r.delete(e)));
r.emit("del", {
key: e
});
return true;
} catch (t) {
r.emit("del", {
key: e,
error: t
});
return Promise.reject(t);
}
};
const p = async e => {
try {
const t = [];
for (const r of e) {
t.push(...i.map(async e => e.delete(r)));
}
if (a) {
Promise.all(t);
r.emit("mdel", {
keys: e
});
return true;
}
await Promise.all(t);
r.emit("mdel", {
keys: e
});
return true;
} catch (t) {
r.emit("mdel", {
keys: e,
error: t
});
return Promise.reject(t);
}
};
const m = async () => {
try {
if (a) {
Promise.all(i.map(async e => e.clear()));
r.emit("clear");
return true;
}
await Promise.all(i.map(async e => e.clear()));
r.emit("clear");
return true;
} catch (e) {
r.emit("clear", e);
return Promise.reject(e);
}
};
const y = async (t, s, a, n) => I(`${c}::${t}`, async () => {
let o;
let l;
let h = 0;
let d;
const {ttl: p, refreshThreshold: m, raw: y} = T(a) ? a : {
ttl: a,
refreshThreshold: n
};
const j = r => L(p, r) ?? e?.ttl;
for (;h < i.length; h++) {
try {
const e = await i[h].get(t, {
raw: true
});
if (e !== void 0) {
o = e.value;
l = e;
if (typeof e.expires === "number") {
d = Math.max(0, e.expires - Date.now());
}
break;
}
} catch {}
}
if (o === void 0) {
const e = await s();
const r = j(e);
await u(i, t, e, r);
return y ? {
value: e,
expires: Date.now() + r
} : e;
}
const q = D(d, L(m, o) ?? e?.refreshThreshold);
if (q) {
I(`+++${c}__${t}`, s).then(async s => {
try {
await u(e?.refreshAllStores ? i : i.slice(0, h + 1), t, s, j(s));
r.emit("refresh", {
key: t,
value: s
});
} catch (e) {
r.emit("refresh", {
key: t,
value: o,
error: e
});
}
}).catch(e => {
r.emit("refresh", {
key: t,
value: o,
error: e
});
});
}
if (!q && h > 0) {
await u(i.slice(0, h), t, o, j(o));
}
return y ? l : o;
});
const j = (e, t) => r.addListener(e, t);
const q = (e, t) => r.removeListener(e, t);
const f = async () => {
try {
await Promise.all(i.map(async e => e.disconnect()));
} catch (e) {
return Promise.reject(e);
}
};
const b = () => c;
return {
get: n,
mget: o,
ttl: l,
set: async (e, r, t) => u(i, e, r, t),
mset: async e => h(i, e),
del: d,
mdel: p,
clear: m,
wrap: y,
on: j,
off: q,
disconnect: f,
cacheId: b,
stores: i
};
};
const R = e => ({
class: Cacher,
stores: e?.stores,
ttl: e?.ttl,
refreshThreshold: e?.refreshThreshold,
refreshAllStores: e?.refreshAllStores,
nonBlocking: e?.nonBlocking,
cacheId: e?.cacheId
});
class Cacher extends s.Component {
async init() {
const e = this.stores ? Array.isArray(this.stores) ? this.stores : [ this.stores ] : [];
const r = await Promise.all(e.map(e => {
switch (e.type) {
case "file":
return c.CreateFileCacheAdapter(e);
case "redis":
return n.CreateRedisCacheAdapter(e);
case "memcache":
return o.CreateMemcacheCacheAdapter(e);
case "mongo":
return l.CreateMongoCacheAdapter(e);
case "sqlite":
return u.CreateSqliteCacheAdapter(e);
case "postgres":
return h.CreatePostgresCacheAdapter(e);
case "mysql":
return d.CreateMysqlCacheAdapter(e);
default:
return undefined;
}
}));
const t = r.filter(e => !!e);
this.cache = B({
stores: t.length ? t : undefined,
ttl: this.ttl,
refreshThreshold: this.refreshThreshold,
refreshAllStores: this.refreshAllStores,
nonBlocking: this.nonBlocking,
cacheId: this.cacheId || this.$uuid
});
this.cache.on("set", e => this.emit("set", e));
this.cache.on("del", e => this.emit("del", e));
this.cache.on("clear", e => this.emit("clear", e));
this.cache.on("refresh", e => this.emit("refresh", e));
}
async destroy() {
await this.cache.disconnect();
}
async set(e, r, t) {
return await this.cache.set(e, r, t);
}
async multipleSet(e) {
return await this.cache.mset(e);
}
async get(e) {
return a.As(await this.cache.get(e));
}
async multipleGet(e) {
return await this.cache.mget(e);
}
async getTTL(e) {
const r = await this.cache.ttl(e);
if (r === undefined) return -1;
return r;
}
async del(e) {
return await this.cache.del(e);
}
async multipleDel(e) {
return await this.cache.mdel(e);
}
async clear() {
return await this.cache.clear();
}
on(e, r) {
return super.on(e, r);
}
}
e.__decorate([ i.Configurable(p.DTO.Alternatives(p.DTO.Array(p.DTO.Alternatives(m.FileCacheOptions.Schema(), y.RedisCacheOptions.Schema(), j.MemcacheCacheOptions.Schema(), q.MongoCacheOptions.Schema(), f.SqliteCacheOptions.Schema(), b.PostgresCacheOptions.Schema(), C.MysqlCacheOptions.Schema())), m.FileCacheOptions.Schema(), y.RedisCacheOptions.Schema(), j.MemcacheCacheOptions.Schema(), q.MongoCacheOptions.Schema(), f.SqliteCacheOptions.Schema(), b.PostgresCacheOptions.Schema(), C.MysqlCacheOptions.Schema()).optional()), e.__metadata("design:type", Object) ], Cacher.prototype, "stores", void 0);
e.__decorate([ i.Configurable(p.DTO.Number().positive().integer().optional()), e.__metadata("design:type", Number) ], Cacher.prototype, "ttl", void 0);
e.__decorate([ i.Configurable(p.DTO.Number().positive().integer().optional()), e.__metadata("design:type", Number) ], Cacher.prototype, "refreshThreshold", void 0);
e.__decorate([ i.Configurable(p.DTO.Boolean().optional()), e.__metadata("design:type", Boolean) ], Cacher.prototype, "refreshAllStores", void 0);
e.__decorate([ i.Configurable(p.DTO.Boolean().optional()), e.__metadata("design:type", Boolean) ], Cacher.prototype, "nonBlocking", void 0);
e.__decorate([ i.Configurable(p.DTO.String().optional()), e.__metadata("design:type", String) ], Cacher.prototype, "cacheId", void 0);
exports.BuildCacherOptions = R;
exports.Cacher = Cacher;