UNPKG

lakutata

Version:

An IoC-based universal application framework.

197 lines (180 loc) 5.64 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const t = require("events"); const e = require("mysql2"); const s = t => t && t.__esModule ? t : { default: t }; const a = s(t); const o = s(e); var n; var i; var r = t => { t = t.replace(/#/g, "%23"); const e = new URL(t); const s = { user: decodeURIComponent(e.username), password: decodeURIComponent(e.password) || void 0, host: e.hostname, port: e.port ? Number.parseInt(e.port, 10) : void 0, database: decodeURIComponent(e.pathname.slice(1)) }; for (const t of Object.keys(s)) { if (s[t] === void 0) { delete s[t]; } } return s; }; var c = (t, e = {}) => { if (i !== t) { n = void 0; i = t; } const s = r(t); const a = { ...s, ...e }; n ??= o.default.createPool(a); return n.promise(); }; var E = () => { if (n) { n.end(); } i = void 0; }; var l = new Set([ "adapter", "compression", "connect", "dialect", "keySize", "table", "ttl", "uri" ]); var u = class extends a.default { ttlSupport=false; opts; namespace; query; constructor(t) { super(); let e = { dialect: "mysql", uri: "mysql://localhost" }; if (typeof t === "string") { e.uri = t; } else { e = { ...e, ...t }; } if (e.intervalExpiration !== void 0 && e.intervalExpiration > 0) { this.ttlSupport = true; } const s = Object.fromEntries(Object.entries(e).filter((([t]) => !l.has(t)))); delete s.namespace; delete s.serialize; delete s.deserialize; const a = async () => { const t = c(e.uri, s); return async e => { const s = await t.query(e); return s[0]; }; }; this.opts = { table: "keyv", keySize: 255, ...e }; const o = `CREATE TABLE IF NOT EXISTS ${this.opts.table}(id VARCHAR(${Number(this.opts.keySize)}) PRIMARY KEY, value TEXT)`; const n = a().then((async t => { await t(o); if (this.opts.intervalExpiration !== void 0 && this.opts.intervalExpiration > 0) { await t("SET GLOBAL event_scheduler = ON;"); await t("DROP EVENT IF EXISTS keyv_delete_expired_keys;"); await t(`CREATE EVENT IF NOT EXISTS keyv_delete_expired_keys ON SCHEDULE EVERY ${this.opts.intervalExpiration} SECOND\n\t\t\t\t\tDO DELETE FROM ${this.opts.table}\n\t\t\t\t\tWHERE CAST(value->'$.expires' AS UNSIGNED) BETWEEN 1 AND UNIX_TIMESTAMP(NOW(3)) * 1000;`); } return t; })).catch((t => this.emit("error", t))); this.query = async t => { const e = await n; return e(t); }; } async get(t) { const e = `SELECT * FROM ${this.opts.table} WHERE id = ?`; const s = o.default.format(e, [ t ]); const a = await this.query(s); const n = a[0]; return n?.value; } async getMany(t) { const e = `SELECT * FROM ${this.opts.table} WHERE id IN (?)`; const s = o.default.format(e, [ t ]); const a = await this.query(s); const n = []; for (const e of t) { const t = a.findIndex((t => t.id === e)); n.push(t === -1 ? void 0 : a[t].value); } return n; } async set(t, e) { const s = `INSERT INTO ${this.opts.table} (id, value)\n\t\t\tVALUES(?, ?) \n\t\t\tON DUPLICATE KEY UPDATE value=?;`; const a = [ t, e, e ]; const n = o.default.format(s, a); return this.query(n); } async delete(t) { const e = `SELECT * FROM ${this.opts.table} WHERE id = ?`; const s = o.default.format(e, [ t ]); const a = `DELETE FROM ${this.opts.table} WHERE id = ?`; const n = o.default.format(a, [ t ]); const i = await this.query(s); const r = i[0]; if (r === void 0) { return false; } await this.query(n); return true; } async deleteMany(t) { const e = `DELETE FROM ${this.opts.table} WHERE id IN (?)`; const s = o.default.format(e, [ t ]); const a = await this.query(s); return a.affectedRows !== 0; } async clear() { const t = `DELETE FROM ${this.opts.table} WHERE id LIKE ?`; const e = o.default.format(t, [ this.namespace ? `${this.namespace}:%` : "%" ]); await this.query(e); } async* iterator(t) { const e = Number.parseInt(this.opts.iterationLimit, 10) || 10; async function* s(a, n, i) { const r = `SELECT * FROM ${n.table} WHERE id LIKE ? LIMIT ? OFFSET ?`; const c = o.default.format(r, [ `${t ? t + ":" : ""}%`, e, a ]); const E = await i(c); if (E.length === 0) { return; } for (const t of E) { a += 1; yield [ t.id, t.value ]; } yield* s(a, n, i); } yield* s(0, this.opts, this.query); } async has(t) { const e = `SELECT EXISTS ( SELECT * FROM ${this.opts.table} WHERE id = '${t}' )`; const s = await this.query(e); return Object.values(s[0])[0] === 1; } async disconnect() { E(); } }; var d = u; exports.KeyvMysql = u; exports.default = d;