{"version":3,"file":"index.mjs","sources":["../src/watcher/module.ts","../src/config/utils.ts","../src/config/module.ts","../src/driver/client.ts","../src/driver/cluster.ts","../src/json-adapter/module.ts","../src/key/escape.ts","../src/key/path/constants.ts","../src/key/path/build.ts","../src/key/path/parse.ts","../src/score-board/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { EventEmitter } from 'node:events';\nimport type { Redis } from 'ioredis';\nimport type { WatcherEvent } from './consants';\nimport type { WatcherOptions } from './types';\n\nexport class Watcher extends EventEmitter {\n    protected client: Redis;\n\n    protected subscriberClient : Redis | undefined;\n\n    protected subscribePatterns: string[];\n\n    protected options : WatcherOptions;\n\n    //--------------------------------------------------------------------\n\n    constructor(\n        client: Redis,\n        options: WatcherOptions = {},\n    ) {\n        super();\n\n        this.client = client;\n        this.options = options;\n\n        let patterns : string[];\n        if (this.options.pattern) {\n            if (Array.isArray(this.options.pattern)) {\n                patterns = this.options.pattern.map(\n                    (pattern) => `__key*__:${pattern}`,\n                );\n            } else {\n                patterns = [`__key*__:${this.options.pattern}`];\n            }\n        } else {\n            patterns = ['__key*__:*'];\n        }\n\n        this.subscribePatterns = patterns;\n    }\n\n    //--------------------------------------------------------------------\n\n    override on(event: `${WatcherEvent}`, listener: (key: string) => any) : this;\n\n    override on(event: 'error', listener: (error: Error) => any) : this;\n\n    override on(event: string, listener: (...args: any[]) => any) : this {\n        return super.on(event, listener);\n    }\n\n    /* istanbul ignore next */\n    async start() : Promise<void> {\n        if (this.subscriberClient) {\n            return;\n        }\n\n        const subscriber = this.client.duplicate();\n\n        await subscriber.config('SET', 'notify-keyspace-events', 'KA');\n\n        await subscriber.psubscribe(...this.subscribePatterns);\n\n        subscriber.on('error', (error) => {\n            this.emit('error', error);\n        });\n\n        subscriber.on('pmessage', (_pattern, _channel, event) => {\n            if (this.subscribePatterns.indexOf(_pattern) === -1) {\n                return;\n            }\n\n            if (!_channel.startsWith('__keyspace')) {\n                return;\n            }\n\n            const key = _channel.split('__:').pop();\n            if (key && key.length > 0) {\n                this.emit(event, key);\n            }\n        });\n\n        this.subscriberClient = subscriber;\n    }\n\n    /* istanbul ignore next */\n    async stop() : Promise<void> {\n        if (!this.subscriberClient) return;\n\n        await this.subscriberClient.punsubscribe(...this.subscribePatterns);\n        this.subscriberClient.disconnect();\n        this.subscriberClient = undefined;\n    }\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Config, ConfigInput } from './type';\n\nexport function buildConfigWithDefaults(\n    input?: ConfigInput,\n) {\n    input = input || {};\n    input.options = {\n        enableReadyCheck: true,\n        retryStrategy(times: number): number | void | null {\n            /* istanbul ignore next */\n            return times === 3 ? null : Math.min(times * 50, 2000);\n        },\n        reconnectOnError(error: Error): boolean {\n            /* istanbul ignore next */\n            return error.message.includes('ECONNRESET');\n        },\n    };\n\n    return buildConfig(input);\n}\n\nexport function buildConfig(input?: ConfigInput) : Config {\n    input = input || {};\n\n    return {\n        ...input,\n        clusterNodes: input.clusterNodes || [],\n        clusterOptions: input.clusterOptions || {},\n        options: input.options || {},\n    };\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Config, ConfigInput } from './type';\nimport { buildConfig, buildConfigWithDefaults } from './utils';\n\nconst getAlias = (alias?: string) => alias || 'default';\n\nconst instances : Record<string, Config> = {};\n\nexport function setConfig(\n    value: ConfigInput,\n    alias?: string,\n) {\n    alias = getAlias(alias);\n\n    instances[alias] = buildConfig(value);\n}\n\nexport function hasConfig(alias?: string) {\n    alias = getAlias(alias);\n\n    return Object.prototype.hasOwnProperty.call(instances, alias);\n}\n\nexport function useConfig(\n    alias?: string,\n): Config {\n    alias = getAlias(alias);\n\n    if (Object.prototype.hasOwnProperty.call(instances, alias)) {\n        return instances[alias];\n    }\n\n    return buildConfigWithDefaults();\n}\n\nexport function unsetConfig(\n    alias?: string,\n) {\n    alias = getAlias(alias);\n\n    if (Object.prototype.hasOwnProperty.call(instances, alias)) {\n        delete instances[alias];\n    }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Redis } from 'ioredis';\nimport type { ConfigInput } from '../config';\nimport { useConfig } from '../config';\nimport type { Client } from './type';\n\nconst getAlias = (key?: string) => key || 'default';\n\nconst instances: Record<string, Client> = {};\n\nexport function useClient(alias?: string) : Client {\n    alias = getAlias(alias);\n\n    if (Object.prototype.hasOwnProperty.call(instances, alias)) {\n        return instances[alias];\n    }\n\n    const config = useConfig(alias);\n    instances[alias] = createClient(config);\n\n    return instances[alias];\n}\n\nexport function unsetClient(alias?: string) {\n    alias = getAlias(alias);\n\n    if (Object.prototype.hasOwnProperty.call(instances, alias)) {\n        instances[alias].disconnect();\n\n        delete instances[alias];\n    }\n}\n\nexport function hasClient(alias?: string) {\n    alias = getAlias(alias);\n\n    return Object.prototype.hasOwnProperty.call(instances, alias);\n}\n\nexport function setClient(value: Client, alias?: string) : Client {\n    alias = getAlias(alias);\n\n    instances[alias] = value;\n\n    return instances[alias];\n}\n\nexport function createClient(config?: ConfigInput) : Client {\n    config = config || {};\n\n    if (\n        config.connectionString &&\n        config.options\n    ) {\n        return new Redis(\n            config.connectionString,\n            config.options,\n        );\n    }\n\n    if (config.options) {\n        return new Redis(config.options);\n    }\n\n    if (config.connectionString) {\n        return new Redis(config.connectionString);\n    }\n\n    return new Redis();\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Cluster } from 'ioredis';\nimport type { ConfigInput } from '../config';\nimport { buildConfig, useConfig } from '../config';\nimport type { ClusterNode } from './type';\n\nconst getAlias = (alias?: string) => alias || 'default';\n\nconst instances: Record<string, Cluster> = {};\n\nexport function useCluster(alias?: string) : Cluster {\n    alias = getAlias(alias);\n\n    const config = useConfig(alias);\n\n    if (Object.prototype.hasOwnProperty.call(instances, alias)) {\n        return instances[alias];\n    }\n\n    instances[alias] = createCluster(config);\n\n    return instances[alias];\n}\n\nexport function setCluster(value: Cluster, alias?: string) : Cluster {\n    alias = getAlias(alias);\n\n    instances[alias] = value;\n\n    return instances[alias];\n}\n\nexport function hasCluster(alias?: string) {\n    alias = getAlias(alias);\n\n    return Object.prototype.hasOwnProperty.call(instances, alias);\n}\n\nexport function createCluster(input?: ConfigInput) : Cluster {\n    const config = buildConfig(input);\n\n    let nodes : ClusterNode[] = [];\n    if (config.clusterNodes) {\n        nodes = config.clusterNodes;\n    }\n\n    if (\n        nodes.length === 0 &&\n        config.connectionString\n    ) {\n        nodes = [config.connectionString];\n    }\n\n    return new Cluster(\n        nodes,\n        config.clusterOptions,\n    );\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '../driver';\nimport type { JSONAdapterSetOptions } from './types';\n\nexport class JsonAdapter {\n    protected client : Client;\n\n    constructor(client: Client) {\n        this.client = client;\n    }\n\n    async set(key: string, value: any, options: JSONAdapterSetOptions = {}) {\n        let milliseconds : number | undefined;\n        if (options.milliseconds) {\n            milliseconds = options.milliseconds;\n        } else if (options.seconds) {\n            milliseconds = options.seconds * 1000;\n        }\n\n        /* istanbul ignore next */\n        if (options.keepTTL) {\n            if (options.ifExists) {\n                await this.client.set(key, JSON.stringify(value), 'KEEPTTL', 'XX');\n            } else if (options.ifNotExists) {\n                await this.client.set(key, JSON.stringify(value), 'KEEPTTL', 'NX');\n            } else {\n                await this.client.set(key, JSON.stringify(value), 'KEEPTTL');\n            }\n\n            return;\n        }\n\n        if (milliseconds) {\n            if (options.ifExists) {\n                await this.client.set(key, JSON.stringify(value), 'PX', milliseconds, 'XX');\n            } else if (options.ifNotExists) {\n                await this.client.set(key, JSON.stringify(value), 'PX', milliseconds, 'NX');\n            } else {\n                await this.client.set(key, JSON.stringify(value), 'PX', milliseconds);\n            }\n\n            return;\n        }\n\n        await this.client.set(key, JSON.stringify(value));\n    }\n\n    async get<T = any>(key: string) : Promise<undefined | T> {\n        try {\n            const entry = await this.client.get(key);\n            if (entry === null || typeof entry === 'undefined') {\n                return undefined;\n            }\n\n            return JSON.parse(entry) as T;\n        } catch (e) {\n            /* istanbul ignore next */\n            return undefined;\n        }\n    }\n\n    async drop(key: string) : Promise<boolean> {\n        return await this.client.del(key) === 1;\n    }\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function escapeKey(input: string): string {\n    return input.replace(/([*?[\\]\\\\])/g, '\\\\$1');\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum KeyPathSeparator {\n    PREFIX = '#p#',\n    SUFFIX = '#s#',\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { KeyPathSeparator } from './constants';\nimport type { KeyPath } from './types';\n\nexport function buildKeyPath(options: KeyPath) : string {\n    const parts = [];\n    if (options.prefix) {\n        parts.push(options.prefix);\n        parts.push(KeyPathSeparator.PREFIX);\n    }\n\n    parts.push(options.key);\n\n    if (options.suffix) {\n        parts.push(KeyPathSeparator.SUFFIX);\n        parts.push(options.suffix);\n    }\n\n    return parts.join('');\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { KeyPathSeparator } from './constants';\nimport type { KeyPath } from './types';\n\nexport function parseKeyPath(\n    keyPath: string,\n) : KeyPath {\n    keyPath = keyPath.replace(/\\s/g, '');\n\n    let prefix : string | undefined;\n    let suffix : string | undefined;\n\n    const prefixSeparatorIndex = keyPath.indexOf(KeyPathSeparator.PREFIX);\n    if (prefixSeparatorIndex !== -1) {\n        prefix = keyPath.substring(0, prefixSeparatorIndex);\n        keyPath = keyPath.substring(prefixSeparatorIndex + KeyPathSeparator.PREFIX.length);\n    }\n\n    const suffixSeparatorIndex = keyPath.lastIndexOf(KeyPathSeparator.SUFFIX);\n    if (suffixSeparatorIndex !== -1) {\n        suffix = keyPath.substring(suffixSeparatorIndex + KeyPathSeparator.SUFFIX.length);\n        keyPath = keyPath.substring(0, suffixSeparatorIndex);\n    }\n\n    return {\n        ...(prefix ? { prefix } : {}),\n        key: keyPath,\n        ...(suffix ? { suffix } : {}),\n    };\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '../driver';\nimport type {\n    ScoreBoardGetOptions, ScoreBoardGetOutput,\n    ScoreBoardItem,\n    ScoreBoardOptions, ScoreBoardOptionsInput,\n} from './types';\n\nexport class ScoreBoard {\n    protected client: Client;\n\n    protected options: ScoreBoardOptions;\n\n    constructor(client: Client, options: ScoreBoardOptionsInput = {}) {\n        this.client = client;\n        this.options = {\n            ...options,\n            key: 'score-board',\n        };\n    }\n\n    //--------------------------------------------------------------------\n\n    async get(options: ScoreBoardGetOptions = {}) : Promise<ScoreBoardGetOutput> {\n        options.sort = options.sort || 'DESC';\n\n        let data : string[];\n\n        if (typeof options.limit === 'undefined') {\n            if (options.sort === 'DESC') {\n                data = await this.client.zrevrangebyscore(\n                    this.options.key,\n                    '+inf',\n                    '-inf',\n                    'WITHSCORES',\n                );\n            } else {\n                data = await this.client.zrangebyscore(\n                    this.options.key,\n                    '-inf',\n                    '+inf',\n                    'WITHSCORES',\n                );\n            }\n        } else {\n            options.offset ??= 0;\n            if (options.sort === 'DESC') {\n                data = await this.client.zrevrangebyscore(\n                    this.options.key,\n                    '+inf',\n                    '-inf',\n                    'WITHSCORES',\n                    'LIMIT',\n                    options.offset,\n                    options.limit,\n                );\n            } else {\n                data = await this.client.zrangebyscore(\n                    this.options.key,\n                    '-inf',\n                    '+inf',\n                    'WITHSCORES',\n                    'LIMIT',\n                    options.offset,\n                    options.limit,\n                );\n            }\n        }\n\n        const items : ScoreBoardItem[] = [];\n\n        for (let i = 0; i < data.length; i += 2) {\n            items.push({\n                id: data[i],\n                score: parseInt(data[i + 1], 10),\n            });\n        }\n\n        const total = await this.client.zcard(this.options.key);\n\n        return {\n            data: items,\n            meta: {\n                total: total || 0,\n                ...(options.limit ? { limit: options.limit } : {}),\n                ...(options.offset ? { offset: options.offset } : {}),\n            },\n        };\n    }\n\n    async clear() {\n        this.client.del(this.options.key);\n    }\n\n    //--------------------------------------------------------------------\n\n    /**\n     * Set the score for a given key.\n     * THe score will be set on default to performance.now()\n     *\n     * @param id\n     * @param score\n     */\n    async add(id: string, score?: number) {\n        await this.client.zadd(\n            this.options.key,\n            score || performance.now(),\n            `${id}`,\n        );\n    }\n\n    /**\n     * Clear the score for a given key.\n     *\n     * @param id\n     */\n    async drop(id: string) {\n        await this.client.zrem(\n            this.options.key,\n            `${id}`,\n        );\n    }\n}\n"],"names":["Watcher","EventEmitter","on","event","listener","start","subscriberClient","subscriber","client","duplicate","config","psubscribe","subscribePatterns","error","emit","_pattern","_channel","indexOf","startsWith","key","split","pop","length","stop","punsubscribe","disconnect","undefined","options","patterns","pattern","Array","isArray","map","buildConfigWithDefaults","input","enableReadyCheck","retryStrategy","times","Math","min","reconnectOnError","message","includes","buildConfig","clusterNodes","clusterOptions","getAlias","alias","instances","setConfig","value","hasConfig","Object","prototype","hasOwnProperty","call","useConfig","unsetConfig","useClient","createClient","unsetClient","hasClient","setClient","connectionString","Redis","useCluster","createCluster","setCluster","hasCluster","nodes","Cluster","JsonAdapter","set","milliseconds","seconds","keepTTL","ifExists","JSON","stringify","ifNotExists","get","entry","parse","e","drop","del","escapeKey","replace","KeyPathSeparator","buildKeyPath","parts","prefix","push","PREFIX","suffix","SUFFIX","join","parseKeyPath","keyPath","prefixSeparatorIndex","substring","suffixSeparatorIndex","lastIndexOf","ScoreBoard","sort","data","limit","zrevrangebyscore","zrangebyscore","offset","items","i","id","score","parseInt","total","zcard","meta","clear","add","zadd","performance","now","zrem"],"mappings":"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"}