{"version":3,"sources":["jsdelivr-header.js","/npm/redis-tagging@2.0.1/lib/index.js"],"names":[],"mappings":"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","file":"/npm/redis-tagging@2.0.1/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/redis-tagging@2.0.1/lib/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst redis_1 = require(\"redis\");\nconst client_1 = __importDefault(require(\"@node-redis/client/dist/lib/client\"));\nconst ERRORS = {\n    generic: (name, message) => {\n        const error = new Error(message);\n        error.name = name;\n        error.message = message ?? \"unknown\";\n        return error;\n    },\n    missingParameter: (item) => ERRORS.generic(\"missingParameter\", `No ${item} supplied`),\n    invalidFormat: (item) => ERRORS.generic(\"invalidFormat\", `Invalid ${item} format`),\n    cannotQuitExternalClient: () => ERRORS.generic(\"cannotQuitExternalClient\", \"Cannot quit external client\"),\n};\nclass RedisTagging {\n    constructor(options = {}) {\n        this.externalClient = false;\n        this.VALID = { bucket: /^([a-zA-Z0-9_-]){1,80}$/ };\n        this.redisns = (options.nsprefix || \"rt\") + \":\";\n        let port = options.port || 6379;\n        let host = options.host || \"127.0.0.1\";\n        if (options.client instanceof client_1.default) {\n            this.redis = options.client;\n            this.externalClient = true;\n        }\n        else {\n            this.redis = (0, redis_1.createClient)(options.options ?? { socket: { port, host } });\n            this.redis.on(\"error\", err => console.log(\"Redis Client Error\", err));\n        }\n    }\n    quit() {\n        if (this.externalClient) {\n            throw ERRORS.cannotQuitExternalClient();\n        }\n        if (this.redis.isOpen)\n            return this.redis.quit();\n        return Promise.resolve();\n    }\n    async get(options) {\n        const o = this.validate(options, [\"bucket\", \"id\"]);\n        let ns = this.redisns + o.bucket;\n        if (!this.redis.isOpen)\n            await this.redis.connect();\n        return this.redis.sMembers(`${ns}:ID:${o.id}`);\n    }\n    async set(options) {\n        const o = this.validate(options, [\"bucket\", \"id\", \"tags\", \"score\"]);\n        let ns = this.redisns + o.bucket;\n        let id_index = `${ns}:ID:${o.id}`;\n        const mc = await this.deleteID(ns, o.id);\n        for (const tag of o.tags) {\n            mc.push([\"zincrby\", ns + \":TAGCOUNT\", 1, tag]);\n            mc.push([\"sadd\", id_index, tag]);\n            mc.push([\"zadd\", `${ns}:TAGS:${tag}`, o.score, o.id]);\n        }\n        if (o.tags.length) {\n            mc.push([\"sadd\", ns + \":IDS\", o.id]);\n        }\n        if (mc.length === 0)\n            return true;\n        if (!this.redis.isOpen)\n            await this.redis.connect();\n        const resp = await this.redis.multiExecutor(mc.map(v => ({ args: v.map(n => n.toString()) })));\n        return true;\n    }\n    async remove(options) {\n        const o = this.validate(options, [\"bucket\", \"id\"]);\n        return this.set({ ...o, tags: [] });\n    }\n    async allids(options) {\n        const o = this.validate(options, [\"bucket\"]);\n        let ns = this.redisns + o.bucket;\n        if (!this.redis.isOpen)\n            await this.redis.connect();\n        return this.redis.sMembers(ns + \":IDS\");\n    }\n    async tags(options) {\n        const o = this.validate(options, [\"bucket\", \"tags\", \"offset\", \"limit\", \"withscores\", \"order\", \"type\"]);\n        let rndkey, resultkey, tagsresult;\n        const ns = this.redisns + o.bucket;\n        const prefix = ns + \":TAGS:\";\n        const lastelement = o.offset + o.limit - 1;\n        const mc = [];\n        if (!o.tags.length) {\n            return {\n                total_items: 0,\n                items: [],\n                limit: o.limit,\n                offset: o.offset,\n            };\n        }\n        if (o.tags.length > 1) {\n            rndkey =\n                ns +\n                    new Date().getTime() +\n                    \"_\" +\n                    Math.floor(Math.random() * 9999999999);\n            const _keys = o.tags.map((tag) => prefix + tag);\n            mc.push([`z${o.type}store`, rndkey, _keys.length]\n                .concat(_keys)\n                .concat([\"AGGREGATE\", \"MIN\"]));\n            if (o.limit > 0) {\n                resultkey = rndkey;\n            }\n        }\n        else if (o.tags.length === 1) {\n            mc.push([\"zcard\", prefix + o.tags[0]]);\n            if (o.limit > 0) {\n                resultkey = prefix + o.tags[0];\n            }\n        }\n        if (o.limit > 0) {\n            tagsresult = [\n                `z${o.order}range`,\n                resultkey,\n                o.offset,\n                lastelement,\n            ];\n            if (o.withscores) {\n                tagsresult.push(\"WITHSCORES\");\n            }\n            mc.push(tagsresult);\n        }\n        if (o.tags.length > 1) {\n            mc.push([\"del\", rndkey]);\n        }\n        if (!this.redis.isOpen)\n            await this.redis.connect();\n        const resp = await this.redis.multiExecutor(mc.map(v => ({ args: v.map(n => n.toString()) })));\n        let rows;\n        if (o.limit === 0) {\n            rows = [];\n        }\n        else {\n            rows = resp[1];\n        }\n        if (rows.length && o.withscores) {\n            rows = rows.reduce((acc, curr, i, a) => {\n                if (i % 2 === 0) {\n                    acc.push({\n                        id: curr,\n                        score: +a[i + 1],\n                    });\n                }\n                return acc;\n            }, []);\n        }\n        return {\n            total_items: resp[0] ? +resp[0] : 0,\n            items: rows,\n            limit: o.limit,\n            offset: o.offset,\n        };\n    }\n    async toptags(options) {\n        const o = this.validate(options, [\"bucket\", \"amount\"]);\n        const ns = this.redisns + o.bucket;\n        o.amount = o.amount - 1;\n        const rediskey = ns + \":TAGCOUNT\";\n        const mc = [\n            [\"zcard\", rediskey],\n            [\"zrevrange\", rediskey, 0, o.amount, \"WITHSCORES\"],\n        ];\n        if (!this.redis.isOpen)\n            await this.redis.connect();\n        const resp = await this.redis.multiExecutor(mc.map(v => ({\n            args: v.map(n => n.toString())\n        })));\n        const rows = resp[1].reduce((acc, curr, i, a) => {\n            if (i % 2 === 0) {\n                acc.push({\n                    tag: curr,\n                    count: +a[i + 1],\n                });\n            }\n            return acc;\n        }, []);\n        return {\n            total_items: resp[0] ? +resp[0] : 0,\n            items: rows,\n        };\n    }\n    async buckets() {\n        if (!this.redis.isOpen)\n            await this.redis.connect();\n        const resp = await this.redis.keys(this.redisns + \"*:TAGCOUNT\");\n        return resp.map((v) => v.split(\":\")[1]);\n    }\n    async removebucket(options) {\n        const o = this.validate(options, [\"bucket\"]);\n        const ns = this.redisns + o.bucket;\n        const mc = [\n            [\"smembers\", ns + \":IDS\"],\n            [\"zrange\", ns + \":TAGCOUNT\", 0, -1],\n        ];\n        if (!this.redis.isOpen)\n            await this.redis.connect();\n        const resp = await this.redis.multiExecutor(mc.map(v => ({ args: v.map(n => n.toString()) })));\n        const rkeys = [ns + \":IDS\", ns + \":TAGCOUNT\"];\n        for (const e of resp[0]) {\n            rkeys.push(ns + \":ID:\" + e);\n        }\n        for (const e of resp[1]) {\n            rkeys.push(ns + \":TAGS:\" + e);\n        }\n        if (!this.redis.isOpen)\n            await this.redis.connect();\n        await this.redis.del(rkeys);\n        return true;\n    }\n    async deleteID(ns, id) {\n        const mc = [];\n        const id_index = ns + \":ID:\" + id;\n        if (!this.redis.isOpen)\n            await this.redis.connect();\n        const resp = await this.redis.sMembers(id_index);\n        if (resp.length) {\n            for (const tag of resp) {\n                mc.push([\"zincrby\", ns + \":TAGCOUNT\", -1, tag]);\n                mc.push([\"zrem\", `${ns}:TAGS:${tag}`, id]);\n            }\n            mc.push([\"del\", id_index]);\n            mc.push([\"srem\", ns + \":IDS\", id]);\n            mc.push([\"zremrangebyscore\", ns + \":TAGCOUNT\", 0, 0]);\n        }\n        return mc;\n    }\n    validate(options, keys) {\n        const validOptions = {};\n        for (const key of keys) {\n            switch (key) {\n                case \"bucket\":\n                    if (!options[key])\n                        throw ERRORS.missingParameter(key);\n                    validOptions[key] = options[key].toString();\n                    if (!this.VALID[key].test(validOptions[key]))\n                        throw ERRORS.invalidFormat(key);\n                    break;\n                case \"id\":\n                    if (!options[key])\n                        throw ERRORS.missingParameter(key);\n                    validOptions[key] = options[key].toString();\n                    if (!validOptions[key].length)\n                        throw ERRORS.missingParameter(key);\n                    break;\n                case \"tags\":\n                    if (!options[key])\n                        throw ERRORS.missingParameter(key);\n                    if (!Array.isArray(options[key])) {\n                        throw ERRORS.invalidFormat(key);\n                    }\n                    validOptions[key] = options[key].map(v => v.toString());\n                    break;\n                case \"score\":\n                    validOptions[key] = options[key] ? options[key] : 0;\n                    if (typeof validOptions[key] === \"string\")\n                        validOptions[key] = parseInt(options[key], 10);\n                    if (isNaN(validOptions[key]))\n                        throw ERRORS.invalidFormat(key);\n                    break;\n                case \"limit\":\n                    if (isNaN(options[key]))\n                        validOptions[key] = 100;\n                    else\n                        validOptions[key] = Math.abs(options[key]);\n                    break;\n                case \"offset\":\n                case \"withscores\":\n                case \"amount\":\n                    validOptions[key] = options[key] ? options[key] : 0;\n                    if (typeof validOptions[key] === \"string\")\n                        validOptions[key] = parseInt(validOptions[key], 10);\n                    if (isNaN(validOptions[key]))\n                        throw ERRORS.invalidFormat(key);\n                    validOptions[key] = Math.abs(validOptions[key]);\n                    break;\n                case \"order\":\n                    validOptions[key] = options[key] === \"asc\" ? \"\" : \"rev\";\n                    break;\n                case \"type\":\n                    if (options[key]?.toLowerCase() === \"union\")\n                        validOptions[key] = \"union\";\n                    else\n                        validOptions[key] = \"inter\";\n                    break;\n                default:\n                    throw ERRORS.invalidFormat(key);\n            }\n        }\n        return validOptions;\n    }\n}\nexports.default = RedisTagging;\n"]}