@maydotinc/q-studio 0.1.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-YGPMHRL3.js +16576 -0
- package/dist/chunk-YGPMHRL3.js.map +1 -0
- package/dist/core.d.ts +1 -0
- package/dist/core.js +41 -0
- package/dist/core.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/{express/index.js → index.js} +12 -9
- package/dist/index.js.map +1 -0
- package/dist/ui/app-icon.svg +130 -0
- package/dist/ui/assets/index.css +1 -0
- package/dist/ui/assets/index.js +511 -0
- package/dist/{core/ui → ui}/index.html +2 -1
- package/package.json +29 -19
- package/dist/core/index.d.ts +0 -864
- package/dist/core/index.js +0 -2490
- package/dist/core/index.js.map +0 -1
- package/dist/core/ui/assets/favicon.ico +0 -0
- package/dist/core/ui/assets/index.css +0 -1
- package/dist/core/ui/assets/index.js +0 -475
- package/dist/express/index.d.ts +0 -38
- package/dist/express/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/@ioredis+commands@1.5.1/node_modules/@ioredis/commands/built/commands.json","../../../node_modules/.pnpm/@ioredis+commands@1.5.1/node_modules/@ioredis/commands/built/index.js","../../../node_modules/.pnpm/standard-as-callback@2.1.0/node_modules/standard-as-callback/built/utils.js","../../../node_modules/.pnpm/standard-as-callback@2.1.0/node_modules/standard-as-callback/built/index.js","../../../node_modules/.pnpm/redis-errors@1.2.0/node_modules/redis-errors/lib/old.js","../../../node_modules/.pnpm/redis-errors@1.2.0/node_modules/redis-errors/lib/modern.js","../../../node_modules/.pnpm/redis-errors@1.2.0/node_modules/redis-errors/index.js","../../../node_modules/.pnpm/cluster-key-slot@1.1.2/node_modules/cluster-key-slot/lib/index.js","../../../node_modules/.pnpm/lodash.defaults@4.2.0/node_modules/lodash.defaults/index.js","../../../node_modules/.pnpm/lodash.isarguments@3.1.0/node_modules/lodash.isarguments/index.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/utils/lodash.js","../../../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/common.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/browser.js","../../../node_modules/.pnpm/has-flag@4.0.0/node_modules/has-flag/index.js","../../../node_modules/.pnpm/supports-color@8.1.1/node_modules/supports-color/index.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/node.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/index.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/utils/debug.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/constants/TLSProfiles.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/utils/index.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/utils/argumentParsers.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/Command.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/errors/ClusterAllFailedError.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/ScanStream.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/autoPipelining.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/Script.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/utils/Commander.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/Pipeline.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/transaction.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/utils/applyMixin.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/cluster/ClusterOptions.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/cluster/util.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/cluster/ClusterSubscriber.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/cluster/ConnectionPool.js","../../../node_modules/.pnpm/denque@2.1.0/node_modules/denque/index.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/cluster/DelayQueue.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/cluster/ShardedSubscriber.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/cluster/ClusterSubscriberGroup.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/cluster/index.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/connectors/AbstractConnector.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/connectors/StandaloneConnector.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/connectors/SentinelConnector/SentinelIterator.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/connectors/SentinelConnector/FailoverDetector.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/connectors/SentinelConnector/index.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/connectors/index.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/errors/MaxRetriesPerRequestError.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/errors/index.js","../../../node_modules/.pnpm/redis-parser@3.0.0/node_modules/redis-parser/lib/parser.js","../../../node_modules/.pnpm/redis-parser@3.0.0/node_modules/redis-parser/index.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/SubscriptionSet.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/DataHandler.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/redis/event_handler.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/redis/RedisOptions.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/Redis.js","../../../node_modules/.pnpm/ioredis@5.10.1/node_modules/ioredis/built/index.js","../../core/src/core/redis-alert-store.ts","../../core/src/core/alert-store.ts","../../core/src/core/alert-destinations.ts","../../core/src/api/handlers.ts","../../core/src/api/router.ts","../../core/src/server/base-path.ts","../../core/src/ui-dist.ts","../../core/src/server/static-assets.ts","../../core/src/server/hono-app.ts","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/compose.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/http-exception.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/request/constants.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/utils/body.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/utils/url.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/request.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/utils/html.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/context.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/router.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/utils/constants.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/hono-base.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/router/reg-exp-router/matcher.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/router/reg-exp-router/node.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/router/reg-exp-router/trie.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/router/reg-exp-router/router.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/router/smart-router/router.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/router/trie-router/node.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/router/trie-router/router.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/hono.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/utils/encode.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/utils/basic-auth.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/utils/crypto.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/utils/buffer.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/middleware/basic-auth/index.js","../../../node_modules/.pnpm/hono@4.12.23/node_modules/hono/dist/middleware/cors/index.js","../../core/src/core/alert-manager.ts","../../core/src/core/discover.ts","../../core/src/core/queue-manager.ts","../../core/src/core/workbench.ts","../../core/src/api/fetch-handler.ts","../../core/src/server/basic-auth.ts"],"sourcesContent":["{\n \"acl\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"append\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"asking\": {\n \"arity\": 1,\n \"flags\": [\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"auth\": {\n \"arity\": -2,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bgrewriteaof\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bgsave\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bitcount\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"bitfield\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"bitfield_ro\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"bitop\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 2,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"bitpos\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"blmove\": {\n \"arity\": 6,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"blmpop\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"blpop\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"brpop\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"brpoplpush\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"bzmpop\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bzpopmax\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"bzpopmin\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"client\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"cluster\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"command\": {\n \"arity\": -1,\n \"flags\": [\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"config\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"copy\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"dbsize\": {\n \"arity\": 1,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"debug\": {\n \"arity\": -2,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"decr\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"decrby\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"del\": {\n \"arity\": -2,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"discard\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"dump\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"echo\": {\n \"arity\": 2,\n \"flags\": [\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"eval\": {\n \"arity\": -3,\n \"flags\": [\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"eval_ro\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"evalsha\": {\n \"arity\": -3,\n \"flags\": [\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"evalsha_ro\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"exec\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"skip_slowlog\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"exists\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"expire\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"expireat\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"expiretime\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"failover\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"fcall\": {\n \"arity\": -3,\n \"flags\": [\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"fcall_ro\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"flushall\": {\n \"arity\": -1,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"flushdb\": {\n \"arity\": -1,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"function\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"geoadd\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geodist\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geohash\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geopos\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadius\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadius_ro\": {\n \"arity\": -6,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadiusbymember\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadiusbymember_ro\": {\n \"arity\": -5,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geosearch\": {\n \"arity\": -7,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geosearchstore\": {\n \"arity\": -8,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"get\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getbit\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getdel\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getex\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getrange\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getset\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hdel\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hello\": {\n \"arity\": -1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"hexists\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hexpire\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hexpireat\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hexpiretime\": {\n \"arity\": -5,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hget\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hgetall\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hgetdel\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hgetex\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hincrby\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hincrbyfloat\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hkeys\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hlen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hmget\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hmset\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hpersist\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hpexpire\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hpexpireat\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hpexpiretime\": {\n \"arity\": -5,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hpttl\": {\n \"arity\": -5,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hrandfield\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hscan\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hset\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hsetex\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hsetnx\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hstrlen\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"httl\": {\n \"arity\": -5,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hvals\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"incr\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"incrby\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"incrbyfloat\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"info\": {\n \"arity\": -1,\n \"flags\": [\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"keys\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lastsave\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"latency\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lcs\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"lindex\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"linsert\": {\n \"arity\": 5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"llen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lmove\": {\n \"arity\": 5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"lmpop\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lolwut\": {\n \"arity\": -1,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lpop\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lpos\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lpush\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lpushx\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lrange\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lrem\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lset\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"ltrim\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"memory\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"mget\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"migrate\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"movablekeys\"\n ],\n \"keyStart\": 3,\n \"keyStop\": 3,\n \"step\": 1\n },\n \"module\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"monitor\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"move\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"mset\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 2\n },\n \"msetnx\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 2\n },\n \"multi\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"object\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"persist\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pexpire\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pexpireat\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pexpiretime\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pfadd\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pfcount\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"pfdebug\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"admin\"\n ],\n \"keyStart\": 2,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"pfmerge\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"pfselftest\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"ping\": {\n \"arity\": -1,\n \"flags\": [\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"psetex\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"psubscribe\": {\n \"arity\": -2,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"psync\": {\n \"arity\": -3,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\",\n \"no_multi\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"pttl\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"publish\": {\n \"arity\": 3,\n \"flags\": [\n \"pubsub\",\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"pubsub\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"punsubscribe\": {\n \"arity\": -1,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"quit\": {\n \"arity\": -1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"randomkey\": {\n \"arity\": 1,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"readonly\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"readwrite\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"rename\": {\n \"arity\": 3,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"renamenx\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"replconf\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"replicaof\": {\n \"arity\": 3,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"stale\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"reset\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"restore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"restore-asking\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"asking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"role\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"rpop\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"rpoplpush\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"rpush\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"rpushx\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sadd\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"save\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\",\n \"no_multi\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"scan\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"scard\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"script\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sdiff\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sdiffstore\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"select\": {\n \"arity\": 2,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"set\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setbit\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setex\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setnx\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setrange\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"shutdown\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\",\n \"no_multi\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sinter\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sintercard\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sinterstore\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sismember\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"slaveof\": {\n \"arity\": 3,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"stale\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"slowlog\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"smembers\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"smismember\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"smove\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"sort\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sort_ro\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"spop\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"spublish\": {\n \"arity\": 3,\n \"flags\": [\n \"pubsub\",\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"srandmember\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"srem\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sscan\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"ssubscribe\": {\n \"arity\": -2,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"strlen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"subscribe\": {\n \"arity\": -2,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"substr\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sunion\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sunionstore\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sunsubscribe\": {\n \"arity\": -1,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"swapdb\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sync\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\",\n \"no_multi\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"time\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"touch\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"ttl\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"type\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"unlink\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"unsubscribe\": {\n \"arity\": -1,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"unwatch\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"wait\": {\n \"arity\": 3,\n \"flags\": [\n \"noscript\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"watch\": {\n \"arity\": -2,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"xack\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xadd\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xautoclaim\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xclaim\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xdel\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xdelex\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xgroup\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xinfo\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xlen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xpending\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xread\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xreadgroup\": {\n \"arity\": -7,\n \"flags\": [\n \"write\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xrevrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xsetid\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xtrim\": {\n \"arity\": -4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zadd\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zcard\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zcount\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zdiff\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zdiffstore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zincrby\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zinter\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zintercard\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zinterstore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zlexcount\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zmpop\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zmscore\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zpopmax\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zpopmin\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrandmember\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrangebylex\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrangebyscore\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrangestore\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"zrank\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrem\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zremrangebylex\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zremrangebyrank\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zremrangebyscore\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrangebylex\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrangebyscore\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrank\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zscan\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zscore\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zunion\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zunionstore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n }\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 });\nexports.getKeyIndexes = exports.hasFlag = exports.exists = exports.list = void 0;\nconst commands_json_1 = __importDefault(require(\"./commands.json\"));\n/**\n * Redis command list\n *\n * All commands are lowercased.\n */\nexports.list = Object.keys(commands_json_1.default);\nconst flags = {};\nexports.list.forEach((commandName) => {\n flags[commandName] = commands_json_1.default[commandName].flags.reduce(function (flags, flag) {\n flags[flag] = true;\n return flags;\n }, {});\n});\n/**\n * Check if the command exists\n */\nfunction exists(commandName, options) {\n commandName = (options === null || options === void 0 ? void 0 : options.caseInsensitive)\n ? String(commandName).toLowerCase()\n : commandName;\n return Boolean(commands_json_1.default[commandName]);\n}\nexports.exists = exists;\n/**\n * Check if the command has the flag\n *\n * Some of possible flags: readonly, noscript, loading\n */\nfunction hasFlag(commandName, flag, options) {\n commandName = (options === null || options === void 0 ? void 0 : options.nameCaseInsensitive)\n ? String(commandName).toLowerCase()\n : commandName;\n if (!flags[commandName]) {\n throw new Error(\"Unknown command \" + commandName);\n }\n return Boolean(flags[commandName][flag]);\n}\nexports.hasFlag = hasFlag;\n/**\n * Get indexes of keys in the command arguments\n *\n * @example\n * ```javascript\n * getKeyIndexes('set', ['key', 'value']) // [0]\n * getKeyIndexes('mget', ['key1', 'key2']) // [0, 1]\n * ```\n */\nfunction getKeyIndexes(commandName, args, options) {\n commandName = (options === null || options === void 0 ? void 0 : options.nameCaseInsensitive)\n ? String(commandName).toLowerCase()\n : commandName;\n const command = commands_json_1.default[commandName];\n if (!command) {\n throw new Error(\"Unknown command \" + commandName);\n }\n if (!Array.isArray(args)) {\n throw new Error(\"Expect args to be an array\");\n }\n const keys = [];\n const parseExternalKey = Boolean(options && options.parseExternalKey);\n const takeDynamicKeys = (args, startIndex) => {\n const keys = [];\n const keyStop = Number(args[startIndex]);\n for (let i = 0; i < keyStop; i++) {\n keys.push(i + startIndex + 1);\n }\n return keys;\n };\n const takeKeyAfterToken = (args, startIndex, token) => {\n for (let i = startIndex; i < args.length - 1; i += 1) {\n if (String(args[i]).toLowerCase() === token.toLowerCase()) {\n return i + 1;\n }\n }\n return null;\n };\n switch (commandName) {\n case \"zunionstore\":\n case \"zinterstore\":\n case \"zdiffstore\":\n keys.push(0, ...takeDynamicKeys(args, 1));\n break;\n case \"eval\":\n case \"evalsha\":\n case \"eval_ro\":\n case \"evalsha_ro\":\n case \"fcall\":\n case \"fcall_ro\":\n case \"blmpop\":\n case \"bzmpop\":\n keys.push(...takeDynamicKeys(args, 1));\n break;\n case \"sintercard\":\n case \"lmpop\":\n case \"zunion\":\n case \"zinter\":\n case \"zmpop\":\n case \"zintercard\":\n case \"zdiff\": {\n keys.push(...takeDynamicKeys(args, 0));\n break;\n }\n case \"georadius\": {\n keys.push(0);\n const storeKey = takeKeyAfterToken(args, 5, \"STORE\");\n if (storeKey)\n keys.push(storeKey);\n const distKey = takeKeyAfterToken(args, 5, \"STOREDIST\");\n if (distKey)\n keys.push(distKey);\n break;\n }\n case \"georadiusbymember\": {\n keys.push(0);\n const storeKey = takeKeyAfterToken(args, 4, \"STORE\");\n if (storeKey)\n keys.push(storeKey);\n const distKey = takeKeyAfterToken(args, 4, \"STOREDIST\");\n if (distKey)\n keys.push(distKey);\n break;\n }\n case \"sort\":\n case \"sort_ro\":\n keys.push(0);\n for (let i = 1; i < args.length - 1; i++) {\n let arg = args[i];\n if (typeof arg !== \"string\") {\n continue;\n }\n const directive = arg.toUpperCase();\n if (directive === \"GET\") {\n i += 1;\n arg = args[i];\n if (arg !== \"#\") {\n if (parseExternalKey) {\n keys.push([i, getExternalKeyNameLength(arg)]);\n }\n else {\n keys.push(i);\n }\n }\n }\n else if (directive === \"BY\") {\n i += 1;\n if (parseExternalKey) {\n keys.push([i, getExternalKeyNameLength(args[i])]);\n }\n else {\n keys.push(i);\n }\n }\n else if (directive === \"STORE\") {\n i += 1;\n keys.push(i);\n }\n }\n break;\n case \"migrate\":\n if (args[2] === \"\") {\n for (let i = 5; i < args.length - 1; i++) {\n const arg = args[i];\n if (typeof arg === \"string\" && arg.toUpperCase() === \"KEYS\") {\n for (let j = i + 1; j < args.length; j++) {\n keys.push(j);\n }\n break;\n }\n }\n }\n else {\n keys.push(2);\n }\n break;\n case \"xreadgroup\":\n case \"xread\":\n // Keys are 1st half of the args after STREAMS argument.\n for (let i = commandName === \"xread\" ? 0 : 3; i < args.length - 1; i++) {\n if (String(args[i]).toUpperCase() === \"STREAMS\") {\n for (let j = i + 1; j <= i + (args.length - 1 - i) / 2; j++) {\n keys.push(j);\n }\n break;\n }\n }\n break;\n default:\n // Step has to be at least one in this case, otherwise the command does\n // not contain a key.\n if (command.step > 0) {\n const keyStart = command.keyStart - 1;\n const keyStop = command.keyStop > 0\n ? command.keyStop\n : args.length + command.keyStop + 1;\n for (let i = keyStart; i < keyStop; i += command.step) {\n keys.push(i);\n }\n }\n break;\n }\n return keys;\n}\nexports.getKeyIndexes = getKeyIndexes;\nfunction getExternalKeyNameLength(key) {\n if (typeof key !== \"string\") {\n key = String(key);\n }\n const hashPos = key.indexOf(\"->\");\n return hashPos === -1 ? key.length : hashPos;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tryCatch = exports.errorObj = void 0;\n//Try catch is not supported in optimizing\n//compiler, so it is isolated\nexports.errorObj = { e: {} };\nlet tryCatchTarget;\nfunction tryCatcher(err, val) {\n try {\n const target = tryCatchTarget;\n tryCatchTarget = null;\n return target.apply(this, arguments);\n }\n catch (e) {\n exports.errorObj.e = e;\n return exports.errorObj;\n }\n}\nfunction tryCatch(fn) {\n tryCatchTarget = fn;\n return tryCatcher;\n}\nexports.tryCatch = tryCatch;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"./utils\");\nfunction throwLater(e) {\n setTimeout(function () {\n throw e;\n }, 0);\n}\nfunction asCallback(promise, nodeback, options) {\n if (typeof nodeback === \"function\") {\n promise.then((val) => {\n let ret;\n if (options !== undefined &&\n Object(options).spread &&\n Array.isArray(val)) {\n ret = utils_1.tryCatch(nodeback).apply(undefined, [null].concat(val));\n }\n else {\n ret =\n val === undefined\n ? utils_1.tryCatch(nodeback)(null)\n : utils_1.tryCatch(nodeback)(null, val);\n }\n if (ret === utils_1.errorObj) {\n throwLater(ret.e);\n }\n }, (cause) => {\n if (!cause) {\n const newReason = new Error(cause + \"\");\n Object.assign(newReason, { cause });\n cause = newReason;\n }\n const ret = utils_1.tryCatch(nodeback)(cause);\n if (ret === utils_1.errorObj) {\n throwLater(ret.e);\n }\n });\n }\n return promise;\n}\nexports.default = asCallback;\n","'use strict'\n\nconst assert = require('assert')\nconst util = require('util')\n\n// RedisError\n\nfunction RedisError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(RedisError, Error)\n\nObject.defineProperty(RedisError.prototype, 'name', {\n value: 'RedisError',\n configurable: true,\n writable: true\n})\n\n// ParserError\n\nfunction ParserError (message, buffer, offset) {\n assert(buffer)\n assert.strictEqual(typeof offset, 'number')\n\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n Error.captureStackTrace(this, this.constructor)\n Error.stackTraceLimit = tmp\n this.offset = offset\n this.buffer = buffer\n}\n\nutil.inherits(ParserError, RedisError)\n\nObject.defineProperty(ParserError.prototype, 'name', {\n value: 'ParserError',\n configurable: true,\n writable: true\n})\n\n// ReplyError\n\nfunction ReplyError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n Error.captureStackTrace(this, this.constructor)\n Error.stackTraceLimit = tmp\n}\n\nutil.inherits(ReplyError, RedisError)\n\nObject.defineProperty(ReplyError.prototype, 'name', {\n value: 'ReplyError',\n configurable: true,\n writable: true\n})\n\n// AbortError\n\nfunction AbortError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(AbortError, RedisError)\n\nObject.defineProperty(AbortError.prototype, 'name', {\n value: 'AbortError',\n configurable: true,\n writable: true\n})\n\n// InterruptError\n\nfunction InterruptError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(InterruptError, AbortError)\n\nObject.defineProperty(InterruptError.prototype, 'name', {\n value: 'InterruptError',\n configurable: true,\n writable: true\n})\n\nmodule.exports = {\n RedisError,\n ParserError,\n ReplyError,\n AbortError,\n InterruptError\n}\n","'use strict'\n\nconst assert = require('assert')\n\nclass RedisError extends Error {\n get name () {\n return this.constructor.name\n }\n}\n\nclass ParserError extends RedisError {\n constructor (message, buffer, offset) {\n assert(buffer)\n assert.strictEqual(typeof offset, 'number')\n\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n super(message)\n Error.stackTraceLimit = tmp\n this.offset = offset\n this.buffer = buffer\n }\n\n get name () {\n return this.constructor.name\n }\n}\n\nclass ReplyError extends RedisError {\n constructor (message) {\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n super(message)\n Error.stackTraceLimit = tmp\n }\n get name () {\n return this.constructor.name\n }\n}\n\nclass AbortError extends RedisError {\n get name () {\n return this.constructor.name\n }\n}\n\nclass InterruptError extends AbortError {\n get name () {\n return this.constructor.name\n }\n}\n\nmodule.exports = {\n RedisError,\n ParserError,\n ReplyError,\n AbortError,\n InterruptError\n}\n","'use strict'\n\nconst Errors = process.version.charCodeAt(1) < 55 && process.version.charCodeAt(2) === 46\n ? require('./lib/old') // Node.js < 7\n : require('./lib/modern')\n\nmodule.exports = Errors\n","/*\n * Copyright 2001-2010 Georges Menie (www.menie.org)\n * Copyright 2010 Salvatore Sanfilippo (adapted to Redis coding style)\n * Copyright 2015 Zihua Li (http://zihua.li) (ported to JavaScript)\n * Copyright 2016 Mike Diarmid (http://github.com/salakar) (re-write for performance, ~700% perf inc)\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of the University of California, Berkeley nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* CRC16 implementation according to CCITT standards.\n *\n * Note by @antirez: this is actually the XMODEM CRC 16 algorithm, using the\n * following parameters:\n *\n * Name : \"XMODEM\", also known as \"ZMODEM\", \"CRC-16/ACORN\"\n * Width : 16 bit\n * Poly : 1021 (That is actually x^16 + x^12 + x^5 + 1)\n * Initialization : 0000\n * Reflect Input byte : False\n * Reflect Output CRC : False\n * Xor constant to output CRC : 0000\n * Output for \"123456789\" : 31C3\n */\n\nvar lookup = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n\n/**\n * Convert a string to a UTF8 array - faster than via buffer\n * @param str\n * @returns {Array}\n */\nvar toUTF8Array = function toUTF8Array(str) {\n var char;\n var i = 0;\n var p = 0;\n var utf8 = [];\n var len = str.length;\n\n for (; i < len; i++) {\n char = str.charCodeAt(i);\n if (char < 128) {\n utf8[p++] = char;\n } else if (char < 2048) {\n utf8[p++] = (char >> 6) | 192;\n utf8[p++] = (char & 63) | 128;\n } else if (\n ((char & 0xFC00) === 0xD800) && (i + 1) < str.length &&\n ((str.charCodeAt(i + 1) & 0xFC00) === 0xDC00)) {\n char = 0x10000 + ((char & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF);\n utf8[p++] = (char >> 18) | 240;\n utf8[p++] = ((char >> 12) & 63) | 128;\n utf8[p++] = ((char >> 6) & 63) | 128;\n utf8[p++] = (char & 63) | 128;\n } else {\n utf8[p++] = (char >> 12) | 224;\n utf8[p++] = ((char >> 6) & 63) | 128;\n utf8[p++] = (char & 63) | 128;\n }\n }\n\n return utf8;\n};\n\n/**\n * Convert a string into a redis slot hash.\n * @param str\n * @returns {number}\n */\nvar generate = module.exports = function generate(str) {\n var char;\n var i = 0;\n var start = -1;\n var result = 0;\n var resultHash = 0;\n var utf8 = typeof str === 'string' ? toUTF8Array(str) : str;\n var len = utf8.length;\n\n while (i < len) {\n char = utf8[i++];\n if (start === -1) {\n if (char === 0x7B) {\n start = i;\n }\n } else if (char !== 0x7D) {\n resultHash = lookup[(char ^ (resultHash >> 8)) & 0xFF] ^ (resultHash << 8);\n } else if (i - 1 !== start) {\n return resultHash & 0x3FFF;\n }\n\n result = lookup[(char ^ (result >> 8)) & 0xFF] ^ (result << 8);\n }\n\n return result & 0x3FFF;\n};\n\n/**\n * Convert an array of multiple strings into a redis slot hash.\n * Returns -1 if one of the keys is not for the same slot as the others\n * @param keys\n * @returns {number}\n */\nmodule.exports.generateMulti = function generateMulti(keys) {\n var i = 1;\n var len = keys.length;\n var base = generate(keys[0]);\n\n while (i < len) {\n if (generate(keys[i++]) !== base) return -1;\n }\n\n return base;\n};\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Used by `_.defaults` to customize its `_.assignIn` use.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\nfunction assignInDefaults(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n assignValue(object, key, newValue === undefined ? source[key] : newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n});\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(args) {\n args.push(undefined, assignInDefaults);\n return apply(assignInWith, undefined, args);\n});\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = defaults;\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\nmodule.exports = isArguments;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isArguments = exports.defaults = exports.noop = void 0;\nconst defaults = require(\"lodash.defaults\");\nexports.defaults = defaults;\nconst isArguments = require(\"lodash.isarguments\");\nexports.isArguments = isArguments;\nfunction noop() { }\nexports.noop = noop;\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet flagForceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tflagForceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m') ||\n\t\t\thasFlag('color=full') ||\n\t\t\thasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream, options = {}) {\n\tconst level = supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options\n\t});\n\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: getSupportLevel({isTTY: tty.isatty(1)}),\n\tstderr: getSupportLevel({isTTY: tty.isatty(2)})\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.genRedactedString = exports.getStringValue = exports.MAX_ARGUMENT_LENGTH = void 0;\nconst debug_1 = require(\"debug\");\nconst MAX_ARGUMENT_LENGTH = 200;\nexports.MAX_ARGUMENT_LENGTH = MAX_ARGUMENT_LENGTH;\nconst NAMESPACE_PREFIX = \"ioredis\";\n/**\n * helper function that tried to get a string value for\n * arbitrary \"debug\" arg\n */\nfunction getStringValue(v) {\n if (v === null) {\n return;\n }\n switch (typeof v) {\n case \"boolean\":\n return;\n case \"number\":\n return;\n case \"object\":\n if (Buffer.isBuffer(v)) {\n return v.toString(\"hex\");\n }\n if (Array.isArray(v)) {\n return v.join(\",\");\n }\n try {\n return JSON.stringify(v);\n }\n catch (e) {\n return;\n }\n case \"string\":\n return v;\n }\n}\nexports.getStringValue = getStringValue;\n/**\n * helper function that redacts a string representation of a \"debug\" arg\n */\nfunction genRedactedString(str, maxLen) {\n const { length } = str;\n return length <= maxLen\n ? str\n : str.slice(0, maxLen) + ' ... <REDACTED full-length=\"' + length + '\">';\n}\nexports.genRedactedString = genRedactedString;\n/**\n * a wrapper for the `debug` module, used to generate\n * \"debug functions\" that trim the values in their output\n */\nfunction genDebugFunction(namespace) {\n const fn = (0, debug_1.default)(`${NAMESPACE_PREFIX}:${namespace}`);\n function wrappedDebug(...args) {\n if (!fn.enabled) {\n return; // no-op\n }\n // we skip the first arg because that is the message\n for (let i = 1; i < args.length; i++) {\n const str = getStringValue(args[i]);\n if (typeof str === \"string\" && str.length > MAX_ARGUMENT_LENGTH) {\n args[i] = genRedactedString(str, MAX_ARGUMENT_LENGTH);\n }\n }\n return fn.apply(null, args);\n }\n Object.defineProperties(wrappedDebug, {\n namespace: {\n get() {\n return fn.namespace;\n },\n },\n enabled: {\n get() {\n return fn.enabled;\n },\n },\n destroy: {\n get() {\n return fn.destroy;\n },\n },\n log: {\n get() {\n return fn.log;\n },\n set(l) {\n fn.log = l;\n },\n },\n });\n return wrappedDebug;\n}\nexports.default = genDebugFunction;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * TLS settings for Redis Cloud. Updated on 2022-08-19.\n */\nconst RedisCloudCA = `-----BEGIN CERTIFICATE-----\nMIIDTzCCAjegAwIBAgIJAKSVpiDswLcwMA0GCSqGSIb3DQEBBQUAMD4xFjAUBgNV\nBAoMDUdhcmFudGlhIERhdGExJDAiBgNVBAMMG1NTTCBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTAeFw0xMzEwMDExMjE0NTVaFw0yMzA5MjkxMjE0NTVaMD4xFjAUBgNV\nBAoMDUdhcmFudGlhIERhdGExJDAiBgNVBAMMG1NTTCBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALZqkh/DczWP\nJnxnHLQ7QL0T4B4CDKWBKCcisriGbA6ZePWVNo4hfKQC6JrzfR+081NeD6VcWUiz\nrmd+jtPhIY4c+WVQYm5PKaN6DT1imYdxQw7aqO5j2KUCEh/cznpLxeSHoTxlR34E\nQwF28Wl3eg2vc5ct8LjU3eozWVk3gb7alx9mSA2SgmuX5lEQawl++rSjsBStemY2\nBDwOpAMXIrdEyP/cVn8mkvi/BDs5M5G+09j0gfhyCzRWMQ7Hn71u1eolRxwVxgi3\nTMn+/vTaFSqxKjgck6zuAYjBRPaHe7qLxHNr1So/Mc9nPy+3wHebFwbIcnUojwbp\n4nctkWbjb2cCAwEAAaNQME4wHQYDVR0OBBYEFP1whtcrydmW3ZJeuSoKZIKjze3w\nMB8GA1UdIwQYMBaAFP1whtcrydmW3ZJeuSoKZIKjze3wMAwGA1UdEwQFMAMBAf8w\nDQYJKoZIhvcNAQEFBQADggEBAG2erXhwRAa7+ZOBs0B6X57Hwyd1R4kfmXcs0rta\nlbPpvgULSiB+TCbf3EbhJnHGyvdCY1tvlffLjdA7HJ0PCOn+YYLBA0pTU/dyvrN6\nSu8NuS5yubnt9mb13nDGYo1rnt0YRfxN+8DM3fXIVr038A30UlPX2Ou1ExFJT0MZ\nuFKY6ZvLdI6/1cbgmguMlAhM+DhKyV6Sr5699LM3zqeI816pZmlREETYkGr91q7k\nBpXJu/dtHaGxg1ZGu6w/PCsYGUcECWENYD4VQPd8N32JjOfu6vEgoEAwfPP+3oGp\nZ4m3ewACcWOAenqflb+cQYC4PsF7qbXDmRaWrbKntOlZ3n0=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGMTCCBBmgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwajELMAkGA1UEBhMCVVMx\nCzAJBgNVBAgMAkNBMQswCQYDVQQHDAJDQTESMBAGA1UECgwJUmVkaXNMYWJzMS0w\nKwYDVQQDDCRSZWRpc0xhYnMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\nMTgwMjI1MTUzNzM3WhcNMjgwMjIzMTUzNzM3WjBfMQswCQYDVQQGEwJVUzELMAkG\nA1UECAwCQ0ExEjAQBgNVBAoMCVJlZGlzTGFiczEvMC0GA1UEAwwmUkNQIEludGVy\nbWVkaWF0ZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQDf9dqbxc8Bq7Ctq9rWcxrGNKKHivqLAFpPq02yLPx6fsOv\nTq7GsDChAYBBc4v7Y2Ap9RD5Vs3dIhEANcnolf27QwrG9RMnnvzk8pCvp1o6zSU4\nVuOE1W66/O1/7e2rVxyrnTcP7UgK43zNIXu7+tiAqWsO92uSnuMoGPGpeaUm1jym\nhjWKtkAwDFSqvHY+XL5qDVBEjeUe+WHkYUg40cAXjusAqgm2hZt29c2wnVrxW25W\nP0meNlzHGFdA2AC5z54iRiqj57dTfBTkHoBczQxcyw6hhzxZQ4e5I5zOKjXXEhZN\nr0tA3YC14CTabKRus/JmZieyZzRgEy2oti64tmLYTqSlAD78pRL40VNoaSYetXLw\nhhNsXCHgWaY6d5bLOc/aIQMAV5oLvZQKvuXAF1IDmhPA+bZbpWipp0zagf1P1H3s\nUzsMdn2KM0ejzgotbtNlj5TcrVwpmvE3ktvUAuA+hi3FkVx1US+2Gsp5x4YOzJ7u\nP1WPk6ShF0JgnJH2ILdj6kttTWwFzH17keSFICWDfH/+kM+k7Y1v3EXMQXE7y0T9\nMjvJskz6d/nv+sQhY04xt64xFMGTnZjlJMzfQNi7zWFLTZnDD0lPowq7l3YiPoTT\nt5Xky83lu0KZsZBo0WlWaDG00gLVdtRgVbcuSWxpi5BdLb1kRab66JptWjxwXQID\nAQABo4HrMIHoMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHBzOi8vcmwtY2Etc2VydmVy\nLnJlZGlzbGFicy5jb20vdjEvY3JsMEYGCCsGAQUFBwEBBDowODA2BggrBgEFBQcw\nAYYqaHR0cHM6Ly9ybC1jYS1zZXJ2ZXIucmVkaXNsYWJzLmNvbS92MS9vY3NwMB0G\nA1UdDgQWBBQHar5OKvQUpP2qWt6mckzToeCOHDAfBgNVHSMEGDAWgBQi42wH6hM4\nL2sujEvLM0/u8lRXTzASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIB\nhjANBgkqhkiG9w0BAQsFAAOCAgEAirEn/iTsAKyhd+pu2W3Z5NjCko4NPU0EYUbr\nAP7+POK2rzjIrJO3nFYQ/LLuC7KCXG+2qwan2SAOGmqWst13Y+WHp44Kae0kaChW\nvcYLXXSoGQGC8QuFSNUdaeg3RbMDYFT04dOkqufeWVccoHVxyTSg9eD8LZuHn5jw\n7QDLiEECBmIJHk5Eeo2TAZrx4Yx6ufSUX5HeVjlAzqwtAqdt99uCJ/EL8bgpWbe+\nXoSpvUv0SEC1I1dCAhCKAvRlIOA6VBcmzg5Am12KzkqTul12/VEFIgzqu0Zy2Jbc\nAUPrYVu/+tOGXQaijy7YgwH8P8n3s7ZeUa1VABJHcxrxYduDDJBLZi+MjheUDaZ1\njQRHYevI2tlqeSBqdPKG4zBY5lS0GiAlmuze5oENt0P3XboHoZPHiqcK3VECgTVh\n/BkJcuudETSJcZDmQ8YfoKfBzRQNg2sv/hwvUv73Ss51Sco8GEt2lD8uEdib1Q6z\nzDT5lXJowSzOD5ZA9OGDjnSRL+2riNtKWKEqvtEG3VBJoBzu9GoxbAc7wIZLxmli\niF5a/Zf5X+UXD3s4TMmy6C4QZJpAA2egsSQCnraWO2ULhh7iXMysSkF/nzVfZn43\niqpaB8++9a37hWq14ZmOv0TJIDz//b2+KC4VFXWQ5W5QC6whsjT+OlG4p5ZYG0jo\n616pxqo=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIIEjzCCA3egAwIBAgIQe55B/ALCKJDZtdNT8kD6hTANBgkqhkiG9w0BAQsFADBM\nMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xv\nYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0yMjAxMjYxMjAwMDBaFw0y\nNTAxMjYwMDAwMDBaMFgxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWdu\nIG52LXNhMS4wLAYDVQQDEyVHbG9iYWxTaWduIEF0bGFzIFIzIE9WIFRMUyBDQSAy\nMDIyIFEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmGmg1LW9b7Lf\n8zDD83yBDTEkt+FOxKJZqF4veWc5KZsQj9HfnUS2e5nj/E+JImlGPsQuoiosLuXD\nBVBNAMcUFa11buFMGMeEMwiTmCXoXRrXQmH0qjpOfKgYc5gHG3BsRGaRrf7VR4eg\nofNMG9wUBw4/g/TT7+bQJdA4NfE7Y4d5gEryZiBGB/swaX6Jp/8MF4TgUmOWmalK\ndZCKyb4sPGQFRTtElk67F7vU+wdGcrcOx1tDcIB0ncjLPMnaFicagl+daWGsKqTh\ncounQb6QJtYHa91KvCfKWocMxQ7OIbB5UARLPmC4CJ1/f8YFm35ebfzAeULYdGXu\njE9CLor0OwIDAQABo4IBXzCCAVswDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG\nCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQW\nBBSH5Zq7a7B/t95GfJWkDBpA8HHqdjAfBgNVHSMEGDAWgBSP8Et/qC5FJK5NUPpj\nmove4t0bvDB7BggrBgEFBQcBAQRvMG0wLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3Nw\nMi5nbG9iYWxzaWduLmNvbS9yb290cjMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9zZWN1\ncmUuZ2xvYmFsc2lnbi5jb20vY2FjZXJ0L3Jvb3QtcjMuY3J0MDYGA1UdHwQvMC0w\nK6ApoCeGJWh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5jb20vcm9vdC1yMy5jcmwwIQYD\nVR0gBBowGDAIBgZngQwBAgIwDAYKKwYBBAGgMgoBAjANBgkqhkiG9w0BAQsFAAOC\nAQEAKRic9/f+nmhQU/wz04APZLjgG5OgsuUOyUEZjKVhNGDwxGTvKhyXGGAMW2B/\n3bRi+aElpXwoxu3pL6fkElbX3B0BeS5LoDtxkyiVEBMZ8m+sXbocwlPyxrPbX6mY\n0rVIvnuUeBH8X0L5IwfpNVvKnBIilTbcebfHyXkPezGwz7E1yhUULjJFm2bt0SdX\ny+4X/WeiiYIv+fTVgZZgl+/2MKIsu/qdBJc3f3TvJ8nz+Eax1zgZmww+RSQWeOj3\n15Iw6Z5FX+NwzY/Ab+9PosR5UosSeq+9HhtaxZttXG1nVh+avYPGYddWmiMT90J5\nZgKnO/Fx2hBgTxhOTMYaD312kg==\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G\nA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp\nZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4\nMTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG\nA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8\nRgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT\ngHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm\nKPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd\nQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ\nXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw\nDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o\nLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU\nRUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp\njjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK\n6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX\nmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs\nMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH\nWD9f\n-----END CERTIFICATE-----`;\nconst TLSProfiles = {\n RedisCloudFixed: { ca: RedisCloudCA },\n RedisCloudFlexible: { ca: RedisCloudCA },\n};\nexports.default = TLSProfiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.noop = exports.defaults = exports.Debug = exports.getPackageMeta = exports.zipMap = exports.CONNECTION_CLOSED_ERROR_MSG = exports.shuffle = exports.sample = exports.resolveTLSProfile = exports.parseURL = exports.optimizeErrorStack = exports.toArg = exports.convertMapToArray = exports.convertObjectToArray = exports.timeout = exports.packObject = exports.isInt = exports.wrapMultiResult = exports.convertBufferToString = void 0;\nconst fs_1 = require(\"fs\");\nconst path_1 = require(\"path\");\nconst url_1 = require(\"url\");\nconst lodash_1 = require(\"./lodash\");\nObject.defineProperty(exports, \"defaults\", { enumerable: true, get: function () { return lodash_1.defaults; } });\nObject.defineProperty(exports, \"noop\", { enumerable: true, get: function () { return lodash_1.noop; } });\nconst debug_1 = require(\"./debug\");\nexports.Debug = debug_1.default;\nconst TLSProfiles_1 = require(\"../constants/TLSProfiles\");\n/**\n * Convert a buffer to string, supports buffer array\n *\n * @example\n * ```js\n * const input = [Buffer.from('foo'), [Buffer.from('bar')]]\n * const res = convertBufferToString(input, 'utf8')\n * expect(res).to.eql(['foo', ['bar']])\n * ```\n */\nfunction convertBufferToString(value, encoding) {\n if (value instanceof Buffer) {\n return value.toString(encoding);\n }\n if (Array.isArray(value)) {\n const length = value.length;\n const res = Array(length);\n for (let i = 0; i < length; ++i) {\n res[i] =\n value[i] instanceof Buffer && encoding === \"utf8\"\n ? value[i].toString()\n : convertBufferToString(value[i], encoding);\n }\n return res;\n }\n return value;\n}\nexports.convertBufferToString = convertBufferToString;\n/**\n * Convert a list of results to node-style\n *\n * @example\n * ```js\n * const input = ['a', 'b', new Error('c'), 'd']\n * const output = exports.wrapMultiResult(input)\n * expect(output).to.eql([[null, 'a'], [null, 'b'], [new Error('c')], [null, 'd'])\n * ```\n */\nfunction wrapMultiResult(arr) {\n // When using WATCH/EXEC transactions, the EXEC will return\n // a null instead of an array\n if (!arr) {\n return null;\n }\n const result = [];\n const length = arr.length;\n for (let i = 0; i < length; ++i) {\n const item = arr[i];\n if (item instanceof Error) {\n result.push([item]);\n }\n else {\n result.push([null, item]);\n }\n }\n return result;\n}\nexports.wrapMultiResult = wrapMultiResult;\n/**\n * Detect if the argument is a int\n * @example\n * ```js\n * > isInt('123')\n * true\n * > isInt('123.3')\n * false\n * > isInt('1x')\n * false\n * > isInt(123)\n * true\n * > isInt(true)\n * false\n * ```\n */\nfunction isInt(value) {\n const x = parseFloat(value);\n return !isNaN(value) && (x | 0) === x;\n}\nexports.isInt = isInt;\n/**\n * Pack an array to an Object\n *\n * @example\n * ```js\n * > packObject(['a', 'b', 'c', 'd'])\n * { a: 'b', c: 'd' }\n * ```\n */\nfunction packObject(array) {\n const result = {};\n const length = array.length;\n for (let i = 1; i < length; i += 2) {\n result[array[i - 1]] = array[i];\n }\n return result;\n}\nexports.packObject = packObject;\n/**\n * Return a callback with timeout\n */\nfunction timeout(callback, timeout) {\n let timer = null;\n const run = function () {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n callback.apply(this, arguments);\n }\n };\n timer = setTimeout(run, timeout, new Error(\"timeout\"));\n return run;\n}\nexports.timeout = timeout;\n/**\n * Convert an object to an array\n * @example\n * ```js\n * > convertObjectToArray({ a: '1' })\n * ['a', '1']\n * ```\n */\nfunction convertObjectToArray(obj) {\n const result = [];\n const keys = Object.keys(obj); // Object.entries requires node 7+\n for (let i = 0, l = keys.length; i < l; i++) {\n result.push(keys[i], obj[keys[i]]);\n }\n return result;\n}\nexports.convertObjectToArray = convertObjectToArray;\n/**\n * Convert a map to an array\n * @example\n * ```js\n * > convertMapToArray(new Map([[1, '2']]))\n * [1, '2']\n * ```\n */\nfunction convertMapToArray(map) {\n const result = [];\n let pos = 0;\n map.forEach(function (value, key) {\n result[pos] = key;\n result[pos + 1] = value;\n pos += 2;\n });\n return result;\n}\nexports.convertMapToArray = convertMapToArray;\n/**\n * Convert a non-string arg to a string\n */\nfunction toArg(arg) {\n if (arg === null || typeof arg === \"undefined\") {\n return \"\";\n }\n return String(arg);\n}\nexports.toArg = toArg;\n/**\n * Optimize error stack\n *\n * @param error actually error\n * @param friendlyStack the stack that more meaningful\n * @param filterPath only show stacks with the specified path\n */\nfunction optimizeErrorStack(error, friendlyStack, filterPath) {\n const stacks = friendlyStack.split(\"\\n\");\n let lines = \"\";\n let i;\n for (i = 1; i < stacks.length; ++i) {\n if (stacks[i].indexOf(filterPath) === -1) {\n break;\n }\n }\n for (let j = i; j < stacks.length; ++j) {\n lines += \"\\n\" + stacks[j];\n }\n if (error.stack) {\n const pos = error.stack.indexOf(\"\\n\");\n error.stack = error.stack.slice(0, pos) + lines;\n }\n return error;\n}\nexports.optimizeErrorStack = optimizeErrorStack;\n/**\n * Parse the redis protocol url\n */\nfunction parseURL(url) {\n if (isInt(url)) {\n return { port: url };\n }\n let parsed = (0, url_1.parse)(url, true, true);\n if (!parsed.slashes && url[0] !== \"/\") {\n url = \"//\" + url;\n parsed = (0, url_1.parse)(url, true, true);\n }\n const options = parsed.query || {};\n const result = {};\n if (parsed.auth) {\n const index = parsed.auth.indexOf(\":\");\n result.username = index === -1 ? parsed.auth : parsed.auth.slice(0, index);\n result.password = index === -1 ? \"\" : parsed.auth.slice(index + 1);\n }\n if (parsed.pathname) {\n if (parsed.protocol === \"redis:\" || parsed.protocol === \"rediss:\") {\n if (parsed.pathname.length > 1) {\n result.db = parsed.pathname.slice(1);\n }\n }\n else {\n result.path = parsed.pathname;\n }\n }\n if (parsed.host) {\n result.host = parsed.hostname;\n }\n if (parsed.port) {\n result.port = parsed.port;\n }\n if (typeof options.family === \"string\") {\n const intFamily = Number.parseInt(options.family, 10);\n if (!Number.isNaN(intFamily)) {\n result.family = intFamily;\n }\n }\n (0, lodash_1.defaults)(result, options);\n return result;\n}\nexports.parseURL = parseURL;\n/**\n * Resolve TLS profile shortcut in connection options\n */\nfunction resolveTLSProfile(options) {\n let tls = options === null || options === void 0 ? void 0 : options.tls;\n if (typeof tls === \"string\")\n tls = { profile: tls };\n const profile = TLSProfiles_1.default[tls === null || tls === void 0 ? void 0 : tls.profile];\n if (profile) {\n tls = Object.assign({}, profile, tls);\n delete tls.profile;\n options = Object.assign({}, options, { tls });\n }\n return options;\n}\nexports.resolveTLSProfile = resolveTLSProfile;\n/**\n * Get a random element from `array`\n */\nfunction sample(array, from = 0) {\n const length = array.length;\n if (from >= length) {\n return null;\n }\n return array[from + Math.floor(Math.random() * (length - from))];\n}\nexports.sample = sample;\n/**\n * Shuffle the array using the Fisher-Yates Shuffle.\n * This method will mutate the original array.\n */\nfunction shuffle(array) {\n let counter = array.length;\n // While there are elements in the array\n while (counter > 0) {\n // Pick a random index\n const index = Math.floor(Math.random() * counter);\n // Decrease counter by 1\n counter--;\n // And swap the last element with it\n [array[counter], array[index]] = [array[index], array[counter]];\n }\n return array;\n}\nexports.shuffle = shuffle;\n/**\n * Error message for connection being disconnected\n */\nexports.CONNECTION_CLOSED_ERROR_MSG = \"Connection is closed.\";\nfunction zipMap(keys, values) {\n const map = new Map();\n keys.forEach((key, index) => {\n map.set(key, values[index]);\n });\n return map;\n}\nexports.zipMap = zipMap;\n/**\n * Memoized package metadata to avoid repeated file system reads.\n *\n * @internal\n */\nlet cachedPackageMeta = null;\n/**\n * Retrieves cached package metadata from package.json.\n *\n * @internal\n * @returns {Promise<{version: string} | null>} Package metadata or null if unavailable\n */\nasync function getPackageMeta() {\n if (cachedPackageMeta) {\n return cachedPackageMeta;\n }\n try {\n const filePath = (0, path_1.resolve)(__dirname, \"..\", \"..\", \"package.json\");\n const data = await fs_1.promises.readFile(filePath, \"utf8\");\n const parsed = JSON.parse(data);\n cachedPackageMeta = {\n version: parsed.version,\n };\n return cachedPackageMeta;\n }\n catch (err) {\n cachedPackageMeta = {\n version: \"error-fetching-version\",\n };\n return cachedPackageMeta;\n }\n}\nexports.getPackageMeta = getPackageMeta;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseBlockOption = exports.parseSecondsArgument = void 0;\n/**\n * Parses a command parameter to a number.\n * @param arg - The command parameter to parse (number, string, or Buffer)\n * @returns The parsed number, or undefined if parsing fails or arg is undefined\n */\nconst parseNumberArgument = (arg) => {\n if (typeof arg === \"number\") {\n return arg;\n }\n if (Buffer.isBuffer(arg)) {\n return parseNumberArgument(arg.toString());\n }\n if (typeof arg === \"string\") {\n const value = Number(arg);\n return Number.isFinite(value) ? value : undefined;\n }\n return undefined;\n};\n/**\n * Parses a command parameter to a string.\n * @param arg - The command parameter to parse (string or Buffer)\n * @returns The parsed string, or undefined if arg is not a string/Buffer or is undefined\n */\nconst parseStringArgument = (arg) => {\n if (typeof arg === \"string\") {\n return arg;\n }\n if (Buffer.isBuffer(arg)) {\n return arg.toString();\n }\n return undefined;\n};\n/**\n * Parses a command parameter as seconds and converts to milliseconds.\n * @param arg - The command parameter representing seconds\n * @returns The value in milliseconds, 0 if value is <= 0, or undefined if parsing fails\n */\nconst parseSecondsArgument = (arg) => {\n const value = parseNumberArgument(arg);\n if (value === undefined) {\n return undefined;\n }\n if (value <= 0) {\n return 0;\n }\n return value * 1000;\n};\nexports.parseSecondsArgument = parseSecondsArgument;\n/**\n * Parses the BLOCK option from Redis command arguments (e.g., XREAD, XREADGROUP).\n * @param args - Array of command parameters to search for the BLOCK option\n * @returns The block duration in milliseconds, 0 if duration is <= 0,\n * null if BLOCK option is not found, or undefined if BLOCK is found but duration is invalid\n */\nconst parseBlockOption = (args) => {\n for (let i = 0; i < args.length; i++) {\n const token = parseStringArgument(args[i]);\n if (token && token.toLowerCase() === \"block\") {\n const duration = parseNumberArgument(args[i + 1]);\n if (duration === undefined) {\n return undefined;\n }\n if (duration <= 0) {\n return 0;\n }\n return duration;\n }\n }\n return null;\n};\nexports.parseBlockOption = parseBlockOption;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst utils_1 = require(\"./utils\");\nconst argumentParsers_1 = require(\"./utils/argumentParsers\");\n/**\n * Command instance\n *\n * It's rare that you need to create a Command instance yourself.\n *\n * ```js\n * var infoCommand = new Command('info', null, function (err, result) {\n * console.log('result', result);\n * });\n *\n * redis.sendCommand(infoCommand);\n *\n * // When no callback provided, Command instance will have a `promise` property,\n * // which will resolve/reject with the result of the command.\n * var getCommand = new Command('get', ['foo']);\n * getCommand.promise.then(function (result) {\n * console.log('result', result);\n * });\n * ```\n */\nclass Command {\n /**\n * Creates an instance of Command.\n * @param name Command name\n * @param args An array of command arguments\n * @param options\n * @param callback The callback that handles the response.\n * If omit, the response will be handled via Promise\n */\n constructor(name, args = [], options = {}, callback) {\n this.name = name;\n this.inTransaction = false;\n this.isResolved = false;\n this.transformed = false;\n this.replyEncoding = options.replyEncoding;\n this.errorStack = options.errorStack;\n this.args = args.flat();\n this.callback = callback;\n this.initPromise();\n if (options.keyPrefix) {\n // @ts-expect-error\n const isBufferKeyPrefix = options.keyPrefix instanceof Buffer;\n // @ts-expect-error\n let keyPrefixBuffer = isBufferKeyPrefix\n ? options.keyPrefix\n : null;\n this._iterateKeys((key) => {\n if (key instanceof Buffer) {\n if (keyPrefixBuffer === null) {\n keyPrefixBuffer = Buffer.from(options.keyPrefix);\n }\n return Buffer.concat([keyPrefixBuffer, key]);\n }\n else if (isBufferKeyPrefix) {\n // @ts-expect-error\n return Buffer.concat([options.keyPrefix, Buffer.from(String(key))]);\n }\n return options.keyPrefix + key;\n });\n }\n if (options.readOnly) {\n this.isReadOnly = true;\n }\n }\n /**\n * Check whether the command has the flag\n */\n static checkFlag(flagName, commandName) {\n commandName = commandName.toLowerCase();\n return !!this.getFlagMap()[flagName][commandName];\n }\n static setArgumentTransformer(name, func) {\n this._transformer.argument[name] = func;\n }\n static setReplyTransformer(name, func) {\n this._transformer.reply[name] = func;\n }\n static getFlagMap() {\n if (!this.flagMap) {\n this.flagMap = Object.keys(Command.FLAGS).reduce((map, flagName) => {\n map[flagName] = {};\n Command.FLAGS[flagName].forEach((commandName) => {\n map[flagName][commandName] = true;\n });\n return map;\n }, {});\n }\n return this.flagMap;\n }\n getSlot() {\n if (typeof this.slot === \"undefined\") {\n const key = this.getKeys()[0];\n this.slot = key == null ? null : calculateSlot(key);\n }\n return this.slot;\n }\n getKeys() {\n return this._iterateKeys();\n }\n /**\n * Convert command to writable buffer or string\n */\n toWritable(_socket) {\n let result;\n const commandStr = \"*\" +\n (this.args.length + 1) +\n \"\\r\\n$\" +\n Buffer.byteLength(this.name) +\n \"\\r\\n\" +\n this.name +\n \"\\r\\n\";\n if (this.bufferMode) {\n const buffers = new MixedBuffers();\n buffers.push(commandStr);\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n if (arg instanceof Buffer) {\n if (arg.length === 0) {\n buffers.push(\"$0\\r\\n\\r\\n\");\n }\n else {\n buffers.push(\"$\" + arg.length + \"\\r\\n\");\n buffers.push(arg);\n buffers.push(\"\\r\\n\");\n }\n }\n else {\n buffers.push(\"$\" +\n Buffer.byteLength(arg) +\n \"\\r\\n\" +\n arg +\n \"\\r\\n\");\n }\n }\n result = buffers.toBuffer();\n }\n else {\n result = commandStr;\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n result +=\n \"$\" +\n Buffer.byteLength(arg) +\n \"\\r\\n\" +\n arg +\n \"\\r\\n\";\n }\n }\n return result;\n }\n stringifyArguments() {\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n if (typeof arg === \"string\") {\n // buffers and strings don't need any transformation\n }\n else if (arg instanceof Buffer) {\n this.bufferMode = true;\n }\n else {\n this.args[i] = (0, utils_1.toArg)(arg);\n }\n }\n }\n /**\n * Convert buffer/buffer[] to string/string[],\n * and apply reply transformer.\n */\n transformReply(result) {\n if (this.replyEncoding) {\n result = (0, utils_1.convertBufferToString)(result, this.replyEncoding);\n }\n const transformer = Command._transformer.reply[this.name];\n if (transformer) {\n result = transformer(result);\n }\n return result;\n }\n /**\n * Set the wait time before terminating the attempt to execute a command\n * and generating an error.\n */\n setTimeout(ms) {\n if (!this._commandTimeoutTimer) {\n this._commandTimeoutTimer = setTimeout(() => {\n if (!this.isResolved) {\n this.reject(new Error(\"Command timed out\"));\n }\n }, ms);\n }\n }\n /**\n * Set a timeout for blocking commands.\n * When the timeout expires, the command resolves with null (matching Redis behavior).\n * This handles the case of undetectable network failures (e.g., docker network disconnect)\n * where the TCP connection becomes a zombie and no close event fires.\n */\n setBlockingTimeout(ms) {\n if (ms <= 0) {\n return;\n }\n // Clear existing timer if any (can happen when command moves from offline to command queue)\n if (this._blockingTimeoutTimer) {\n clearTimeout(this._blockingTimeoutTimer);\n this._blockingTimeoutTimer = undefined;\n }\n const now = Date.now();\n // First call: establish absolute deadline\n if (this._blockingDeadline === undefined) {\n this._blockingDeadline = now + ms;\n }\n // Check if we've already exceeded the deadline\n const remaining = this._blockingDeadline - now;\n if (remaining <= 0) {\n // Resolve with null to indicate timeout (same as Redis behavior)\n this.resolve(null);\n return;\n }\n this._blockingTimeoutTimer = setTimeout(() => {\n if (this.isResolved) {\n this._blockingTimeoutTimer = undefined;\n return;\n }\n this._blockingTimeoutTimer = undefined;\n // Timeout expired - resolve with null (same as Redis behavior when blocking command times out)\n this.resolve(null);\n }, remaining);\n }\n /**\n * Extract the blocking timeout from the command arguments.\n *\n * @returns The timeout in seconds, null for indefinite blocking (timeout of 0),\n * or undefined if this is not a blocking command\n */\n extractBlockingTimeout() {\n const args = this.args;\n if (!args || args.length === 0) {\n return undefined;\n }\n const name = this.name.toLowerCase();\n if (Command.checkFlag(\"LAST_ARG_TIMEOUT_COMMANDS\", name)) {\n return (0, argumentParsers_1.parseSecondsArgument)(args[args.length - 1]);\n }\n if (Command.checkFlag(\"FIRST_ARG_TIMEOUT_COMMANDS\", name)) {\n return (0, argumentParsers_1.parseSecondsArgument)(args[0]);\n }\n if (Command.checkFlag(\"BLOCK_OPTION_COMMANDS\", name)) {\n return (0, argumentParsers_1.parseBlockOption)(args);\n }\n return undefined;\n }\n /**\n * Clear the command and blocking timers\n */\n _clearTimers() {\n const existingTimer = this._commandTimeoutTimer;\n if (existingTimer) {\n clearTimeout(existingTimer);\n delete this._commandTimeoutTimer;\n }\n const blockingTimer = this._blockingTimeoutTimer;\n if (blockingTimer) {\n clearTimeout(blockingTimer);\n delete this._blockingTimeoutTimer;\n }\n }\n initPromise() {\n const promise = new Promise((resolve, reject) => {\n if (!this.transformed) {\n this.transformed = true;\n const transformer = Command._transformer.argument[this.name];\n if (transformer) {\n this.args = transformer(this.args);\n }\n this.stringifyArguments();\n }\n this.resolve = this._convertValue(resolve);\n this.reject = (err) => {\n this._clearTimers();\n if (this.errorStack) {\n reject((0, utils_1.optimizeErrorStack)(err, this.errorStack.stack, __dirname));\n }\n else {\n reject(err);\n }\n };\n });\n this.promise = (0, standard_as_callback_1.default)(promise, this.callback);\n }\n /**\n * Iterate through the command arguments that are considered keys.\n */\n _iterateKeys(transform = (key) => key) {\n if (typeof this.keys === \"undefined\") {\n this.keys = [];\n if ((0, commands_1.exists)(this.name, { caseInsensitive: true })) {\n // @ts-expect-error\n const keyIndexes = (0, commands_1.getKeyIndexes)(this.name, this.args, {\n nameCaseInsensitive: true,\n });\n for (const index of keyIndexes) {\n this.args[index] = transform(this.args[index]);\n this.keys.push(this.args[index]);\n }\n }\n }\n return this.keys;\n }\n /**\n * Convert the value from buffer to the target encoding.\n */\n _convertValue(resolve) {\n return (value) => {\n try {\n this._clearTimers();\n resolve(this.transformReply(value));\n this.isResolved = true;\n }\n catch (err) {\n this.reject(err);\n }\n return this.promise;\n };\n }\n}\nexports.default = Command;\nCommand.FLAGS = {\n VALID_IN_SUBSCRIBER_MODE: [\n \"subscribe\",\n \"psubscribe\",\n \"unsubscribe\",\n \"punsubscribe\",\n \"ssubscribe\",\n \"sunsubscribe\",\n \"ping\",\n \"quit\",\n ],\n VALID_IN_MONITOR_MODE: [\"monitor\", \"auth\"],\n ENTER_SUBSCRIBER_MODE: [\"subscribe\", \"psubscribe\", \"ssubscribe\"],\n EXIT_SUBSCRIBER_MODE: [\"unsubscribe\", \"punsubscribe\", \"sunsubscribe\"],\n WILL_DISCONNECT: [\"quit\"],\n HANDSHAKE_COMMANDS: [\"auth\", \"select\", \"client\", \"readonly\", \"info\"],\n IGNORE_RECONNECT_ON_ERROR: [\"client\"],\n BLOCKING_COMMANDS: [\n \"blpop\",\n \"brpop\",\n \"brpoplpush\",\n \"blmove\",\n \"bzpopmin\",\n \"bzpopmax\",\n \"bzmpop\",\n \"blmpop\",\n \"xread\",\n \"xreadgroup\",\n ],\n LAST_ARG_TIMEOUT_COMMANDS: [\n \"blpop\",\n \"brpop\",\n \"brpoplpush\",\n \"blmove\",\n \"bzpopmin\",\n \"bzpopmax\",\n ],\n FIRST_ARG_TIMEOUT_COMMANDS: [\"bzmpop\", \"blmpop\"],\n BLOCK_OPTION_COMMANDS: [\"xread\", \"xreadgroup\"],\n};\nCommand._transformer = {\n argument: {},\n reply: {},\n};\nconst msetArgumentTransformer = function (args) {\n if (args.length === 1) {\n if (args[0] instanceof Map) {\n return (0, utils_1.convertMapToArray)(args[0]);\n }\n if (typeof args[0] === \"object\" && args[0] !== null) {\n return (0, utils_1.convertObjectToArray)(args[0]);\n }\n }\n return args;\n};\nconst hsetArgumentTransformer = function (args) {\n if (args.length === 2) {\n if (args[1] instanceof Map) {\n return [args[0]].concat((0, utils_1.convertMapToArray)(args[1]));\n }\n if (typeof args[1] === \"object\" && args[1] !== null) {\n return [args[0]].concat((0, utils_1.convertObjectToArray)(args[1]));\n }\n }\n return args;\n};\nCommand.setArgumentTransformer(\"mset\", msetArgumentTransformer);\nCommand.setArgumentTransformer(\"msetnx\", msetArgumentTransformer);\nCommand.setArgumentTransformer(\"hset\", hsetArgumentTransformer);\nCommand.setArgumentTransformer(\"hmset\", hsetArgumentTransformer);\nCommand.setReplyTransformer(\"hgetall\", function (result) {\n if (Array.isArray(result)) {\n const obj = {};\n for (let i = 0; i < result.length; i += 2) {\n const key = result[i];\n const value = result[i + 1];\n if (key in obj) {\n // can only be truthy if the property is special somehow, like '__proto__' or 'constructor'\n // https://github.com/luin/ioredis/issues/1267\n Object.defineProperty(obj, key, {\n value,\n configurable: true,\n enumerable: true,\n writable: true,\n });\n }\n else {\n obj[key] = value;\n }\n }\n return obj;\n }\n return result;\n});\nclass MixedBuffers {\n constructor() {\n this.length = 0;\n this.items = [];\n }\n push(x) {\n this.length += Buffer.byteLength(x);\n this.items.push(x);\n }\n toBuffer() {\n const result = Buffer.allocUnsafe(this.length);\n let offset = 0;\n for (const item of this.items) {\n const length = Buffer.byteLength(item);\n Buffer.isBuffer(item)\n ? item.copy(result, offset)\n : result.write(item, offset, length);\n offset += length;\n }\n return result;\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst redis_errors_1 = require(\"redis-errors\");\nclass ClusterAllFailedError extends redis_errors_1.RedisError {\n constructor(message, lastNodeError) {\n super(message);\n this.lastNodeError = lastNodeError;\n Error.captureStackTrace(this, this.constructor);\n }\n get name() {\n return this.constructor.name;\n }\n}\nexports.default = ClusterAllFailedError;\nClusterAllFailedError.defaultMessage = \"Failed to refresh slots cache.\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\n/**\n * Convenient class to convert the process of scanning keys to a readable stream.\n */\nclass ScanStream extends stream_1.Readable {\n constructor(opt) {\n super(opt);\n this.opt = opt;\n this._redisCursor = \"0\";\n this._redisDrained = false;\n }\n _read() {\n if (this._redisDrained) {\n this.push(null);\n return;\n }\n const args = [this._redisCursor];\n if (this.opt.key) {\n args.unshift(this.opt.key);\n }\n if (this.opt.match) {\n args.push(\"MATCH\", this.opt.match);\n }\n if (this.opt.type) {\n args.push(\"TYPE\", this.opt.type);\n }\n if (this.opt.count) {\n args.push(\"COUNT\", String(this.opt.count));\n }\n if (this.opt.noValues) {\n args.push(\"NOVALUES\");\n }\n this.opt.redis[this.opt.command](args, (err, res) => {\n if (err) {\n this.emit(\"error\", err);\n return;\n }\n this._redisCursor = res[0] instanceof Buffer ? res[0].toString() : res[0];\n if (this._redisCursor === \"0\") {\n this._redisDrained = true;\n }\n this.push(res[1]);\n });\n }\n close() {\n this._redisDrained = true;\n }\n}\nexports.default = ScanStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.executeWithAutoPipelining = exports.getFirstValueInFlattenedArray = exports.shouldUseAutoPipelining = exports.notAllowedAutoPipelineCommands = exports.kCallbacks = exports.kExec = void 0;\nconst lodash_1 = require(\"./utils/lodash\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst commands_1 = require(\"@ioredis/commands\");\nexports.kExec = Symbol(\"exec\");\nexports.kCallbacks = Symbol(\"callbacks\");\nexports.notAllowedAutoPipelineCommands = [\n \"auth\",\n \"info\",\n \"script\",\n \"quit\",\n \"cluster\",\n \"pipeline\",\n \"multi\",\n \"subscribe\",\n \"psubscribe\",\n \"unsubscribe\",\n \"unpsubscribe\",\n \"select\",\n \"client\",\n];\nfunction executeAutoPipeline(client, slotKey) {\n /*\n If a pipeline is already executing, keep queueing up commands\n since ioredis won't serve two pipelines at the same time\n */\n if (client._runningAutoPipelines.has(slotKey)) {\n return;\n }\n if (!client._autoPipelines.has(slotKey)) {\n /*\n Rare edge case. Somehow, something has deleted this running autopipeline in an immediate\n call to executeAutoPipeline.\n \n Maybe the callback in the pipeline.exec is sometimes called in the same tick,\n e.g. if redis is disconnected?\n */\n return;\n }\n client._runningAutoPipelines.add(slotKey);\n // Get the pipeline and immediately delete it so that new commands are queued on a new pipeline\n const pipeline = client._autoPipelines.get(slotKey);\n client._autoPipelines.delete(slotKey);\n const callbacks = pipeline[exports.kCallbacks];\n // Stop keeping a reference to callbacks immediately after the callbacks stop being used.\n // This allows the GC to reclaim objects referenced by callbacks, especially with 16384 slots\n // in Redis.Cluster\n pipeline[exports.kCallbacks] = null;\n // Perform the call\n pipeline.exec(function (err, results) {\n client._runningAutoPipelines.delete(slotKey);\n /*\n Invoke all callback in nextTick so the stack is cleared\n and callbacks can throw errors without affecting other callbacks.\n */\n if (err) {\n for (let i = 0; i < callbacks.length; i++) {\n process.nextTick(callbacks[i], err);\n }\n }\n else {\n for (let i = 0; i < callbacks.length; i++) {\n process.nextTick(callbacks[i], ...results[i]);\n }\n }\n // If there is another pipeline on the same node, immediately execute it without waiting for nextTick\n if (client._autoPipelines.has(slotKey)) {\n executeAutoPipeline(client, slotKey);\n }\n });\n}\nfunction shouldUseAutoPipelining(client, functionName, commandName) {\n return (functionName &&\n client.options.enableAutoPipelining &&\n !client.isPipeline &&\n !exports.notAllowedAutoPipelineCommands.includes(commandName) &&\n !client.options.autoPipeliningIgnoredCommands.includes(commandName));\n}\nexports.shouldUseAutoPipelining = shouldUseAutoPipelining;\nfunction getFirstValueInFlattenedArray(args) {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (typeof arg === \"string\") {\n return arg;\n }\n else if (Array.isArray(arg) || (0, lodash_1.isArguments)(arg)) {\n if (arg.length === 0) {\n continue;\n }\n return arg[0];\n }\n const flattened = [arg].flat();\n if (flattened.length > 0) {\n return flattened[0];\n }\n }\n return undefined;\n}\nexports.getFirstValueInFlattenedArray = getFirstValueInFlattenedArray;\nfunction executeWithAutoPipelining(client, functionName, commandName, args, callback) {\n // On cluster mode let's wait for slots to be available\n if (client.isCluster && !client.slots.length) {\n if (client.status === \"wait\")\n client.connect().catch(lodash_1.noop);\n return (0, standard_as_callback_1.default)(new Promise(function (resolve, reject) {\n client.delayUntilReady((err) => {\n if (err) {\n reject(err);\n return;\n }\n executeWithAutoPipelining(client, functionName, commandName, args, null).then(resolve, reject);\n });\n }), callback);\n }\n // If we have slot information, we can improve routing by grouping slots served by the same subset of nodes\n // Note that the first value in args may be a (possibly empty) array.\n // ioredis will only flatten one level of the array, in the Command constructor.\n const prefix = client.options.keyPrefix || \"\";\n let slotKey = client.isCluster\n ? client.slots[calculateSlot(`${prefix}${getFirstValueInFlattenedArray(args)}`)].join(\",\")\n : \"main\";\n // When scaleReads is enabled, separate read and write commands into different pipelines\n // so they can be routed to replicas and masters respectively\n if (client.isCluster && client.options.scaleReads !== \"master\") {\n const isReadOnly = (0, commands_1.exists)(commandName) && (0, commands_1.hasFlag)(commandName, \"readonly\");\n slotKey += isReadOnly ? \":read\" : \":write\";\n }\n if (!client._autoPipelines.has(slotKey)) {\n const pipeline = client.pipeline();\n pipeline[exports.kExec] = false;\n pipeline[exports.kCallbacks] = [];\n client._autoPipelines.set(slotKey, pipeline);\n }\n const pipeline = client._autoPipelines.get(slotKey);\n /*\n Mark the pipeline as scheduled.\n The symbol will make sure that the pipeline is only scheduled once per tick.\n New commands are appended to an already scheduled pipeline.\n */\n if (!pipeline[exports.kExec]) {\n pipeline[exports.kExec] = true;\n /*\n Deferring with setImmediate so we have a chance to capture multiple\n commands that can be scheduled by I/O events already in the event loop queue.\n */\n setImmediate(executeAutoPipeline, client, slotKey);\n }\n // Create the promise which will execute the command in the pipeline.\n const autoPipelinePromise = new Promise(function (resolve, reject) {\n pipeline[exports.kCallbacks].push(function (err, value) {\n if (err) {\n reject(err);\n return;\n }\n resolve(value);\n });\n if (functionName === \"call\") {\n args.unshift(commandName);\n }\n pipeline[functionName](...args);\n });\n return (0, standard_as_callback_1.default)(autoPipelinePromise, callback);\n}\nexports.executeWithAutoPipelining = executeWithAutoPipelining;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nconst Command_1 = require(\"./Command\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nclass Script {\n constructor(lua, numberOfKeys = null, keyPrefix = \"\", readOnly = false) {\n this.lua = lua;\n this.numberOfKeys = numberOfKeys;\n this.keyPrefix = keyPrefix;\n this.readOnly = readOnly;\n this.sha = (0, crypto_1.createHash)(\"sha1\").update(lua).digest(\"hex\");\n const sha = this.sha;\n const socketHasScriptLoaded = new WeakSet();\n this.Command = class CustomScriptCommand extends Command_1.default {\n toWritable(socket) {\n const origReject = this.reject;\n this.reject = (err) => {\n if (err.message.indexOf(\"NOSCRIPT\") !== -1) {\n socketHasScriptLoaded.delete(socket);\n }\n origReject.call(this, err);\n };\n if (!socketHasScriptLoaded.has(socket)) {\n socketHasScriptLoaded.add(socket);\n this.name = \"eval\";\n this.args[0] = lua;\n }\n else if (this.name === \"eval\") {\n this.name = \"evalsha\";\n this.args[0] = sha;\n }\n return super.toWritable(socket);\n }\n };\n }\n execute(container, args, options, callback) {\n if (typeof this.numberOfKeys === \"number\") {\n args.unshift(this.numberOfKeys);\n }\n if (this.keyPrefix) {\n options.keyPrefix = this.keyPrefix;\n }\n if (this.readOnly) {\n options.readOnly = true;\n }\n const evalsha = new this.Command(\"evalsha\", [this.sha, ...args], options);\n evalsha.promise = evalsha.promise.catch((err) => {\n if (err.message.indexOf(\"NOSCRIPT\") === -1) {\n throw err;\n }\n // Resend the same custom evalsha command that gets transformed\n // to an eval in case it's not loaded yet on the connection.\n const resend = new this.Command(\"evalsha\", [this.sha, ...args], options);\n const client = container.isPipeline ? container.redis : container;\n return client.sendCommand(resend);\n });\n (0, standard_as_callback_1.default)(evalsha.promise, callback);\n return container.sendCommand(evalsha);\n }\n}\nexports.default = Script;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst autoPipelining_1 = require(\"../autoPipelining\");\nconst Command_1 = require(\"../Command\");\nconst Script_1 = require(\"../Script\");\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nclass Commander {\n constructor() {\n this.options = {};\n /**\n * @ignore\n */\n this.scriptsSet = {};\n /**\n * @ignore\n */\n this.addedBuiltinSet = new Set();\n }\n /**\n * Return supported builtin commands\n */\n getBuiltinCommands() {\n return commands.slice(0);\n }\n /**\n * Create a builtin command\n */\n createBuiltinCommand(commandName) {\n return {\n string: generateFunction(null, commandName, \"utf8\"),\n buffer: generateFunction(null, commandName, null),\n };\n }\n /**\n * Create add builtin command\n */\n addBuiltinCommand(commandName) {\n this.addedBuiltinSet.add(commandName);\n this[commandName] = generateFunction(commandName, commandName, \"utf8\");\n this[commandName + \"Buffer\"] = generateFunction(commandName + \"Buffer\", commandName, null);\n }\n /**\n * Define a custom command using lua script\n */\n defineCommand(name, definition) {\n const script = new Script_1.default(definition.lua, definition.numberOfKeys, this.options.keyPrefix, definition.readOnly);\n this.scriptsSet[name] = script;\n this[name] = generateScriptingFunction(name, name, script, \"utf8\");\n this[name + \"Buffer\"] = generateScriptingFunction(name + \"Buffer\", name, script, null);\n }\n /**\n * @ignore\n */\n sendCommand(command, stream, node) {\n throw new Error('\"sendCommand\" is not implemented');\n }\n}\nconst commands = commands_1.list.filter((command) => command !== \"monitor\");\ncommands.push(\"sentinel\");\ncommands.forEach(function (commandName) {\n Commander.prototype[commandName] = generateFunction(commandName, commandName, \"utf8\");\n Commander.prototype[commandName + \"Buffer\"] = generateFunction(commandName + \"Buffer\", commandName, null);\n});\nCommander.prototype.call = generateFunction(\"call\", \"utf8\");\nCommander.prototype.callBuffer = generateFunction(\"callBuffer\", null);\n// @ts-expect-error\nCommander.prototype.send_command = Commander.prototype.call;\nfunction generateFunction(functionName, _commandName, _encoding) {\n if (typeof _encoding === \"undefined\") {\n _encoding = _commandName;\n _commandName = null;\n }\n return function (...args) {\n const commandName = (_commandName || args.shift());\n let callback = args[args.length - 1];\n if (typeof callback === \"function\") {\n args.pop();\n }\n else {\n callback = undefined;\n }\n const options = {\n errorStack: this.options.showFriendlyErrorStack ? new Error() : undefined,\n keyPrefix: this.options.keyPrefix,\n replyEncoding: _encoding,\n };\n // No auto pipeline, use regular command sending\n if (!(0, autoPipelining_1.shouldUseAutoPipelining)(this, functionName, commandName)) {\n return this.sendCommand(\n // @ts-expect-error\n new Command_1.default(commandName, args, options, callback));\n }\n // Create a new pipeline and make sure it's scheduled\n return (0, autoPipelining_1.executeWithAutoPipelining)(this, functionName, commandName, \n // @ts-expect-error\n args, callback);\n };\n}\nfunction generateScriptingFunction(functionName, commandName, script, encoding) {\n return function (...args) {\n const callback = typeof args[args.length - 1] === \"function\" ? args.pop() : undefined;\n const options = {\n replyEncoding: encoding,\n };\n if (this.options.showFriendlyErrorStack) {\n options.errorStack = new Error();\n }\n // No auto pipeline, use regular command sending\n if (!(0, autoPipelining_1.shouldUseAutoPipelining)(this, functionName, commandName)) {\n return script.execute(this, args, options, callback);\n }\n // Create a new pipeline and make sure it's scheduled\n return (0, autoPipelining_1.executeWithAutoPipelining)(this, functionName, commandName, args, callback);\n };\n}\nexports.default = Commander;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst calculateSlot = require(\"cluster-key-slot\");\nconst commands_1 = require(\"@ioredis/commands\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst util_1 = require(\"util\");\nconst Command_1 = require(\"./Command\");\nconst utils_1 = require(\"./utils\");\nconst Commander_1 = require(\"./utils/Commander\");\n/*\n This function derives from the cluster-key-slot implementation.\n Instead of checking that all keys have the same slot, it checks that all slots are served by the same set of nodes.\n If this is satisfied, it returns the first key's slot.\n*/\nfunction generateMultiWithNodes(redis, keys) {\n const slot = calculateSlot(keys[0]);\n const target = redis._groupsBySlot[slot];\n for (let i = 1; i < keys.length; i++) {\n if (redis._groupsBySlot[calculateSlot(keys[i])] !== target) {\n return -1;\n }\n }\n return slot;\n}\nclass Pipeline extends Commander_1.default {\n constructor(redis) {\n super();\n this.redis = redis;\n this.isPipeline = true;\n this.replyPending = 0;\n this._queue = [];\n this._result = [];\n this._transactions = 0;\n this._shaToScript = {};\n this.isCluster =\n this.redis.constructor.name === \"Cluster\" || this.redis.isCluster;\n this.options = redis.options;\n Object.keys(redis.scriptsSet).forEach((name) => {\n const script = redis.scriptsSet[name];\n this._shaToScript[script.sha] = script;\n this[name] = redis[name];\n this[name + \"Buffer\"] = redis[name + \"Buffer\"];\n });\n redis.addedBuiltinSet.forEach((name) => {\n this[name] = redis[name];\n this[name + \"Buffer\"] = redis[name + \"Buffer\"];\n });\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n const _this = this;\n Object.defineProperty(this, \"length\", {\n get: function () {\n return _this._queue.length;\n },\n });\n }\n fillResult(value, position) {\n if (this._queue[position].name === \"exec\" && Array.isArray(value[1])) {\n const execLength = value[1].length;\n for (let i = 0; i < execLength; i++) {\n if (value[1][i] instanceof Error) {\n continue;\n }\n const cmd = this._queue[position - (execLength - i)];\n try {\n value[1][i] = cmd.transformReply(value[1][i]);\n }\n catch (err) {\n value[1][i] = err;\n }\n }\n }\n this._result[position] = value;\n if (--this.replyPending) {\n return;\n }\n if (this.isCluster) {\n let retriable = true;\n let commonError;\n for (let i = 0; i < this._result.length; ++i) {\n const error = this._result[i][0];\n const command = this._queue[i];\n if (error) {\n if (command.name === \"exec\" &&\n error.message ===\n \"EXECABORT Transaction discarded because of previous errors.\") {\n continue;\n }\n if (!commonError) {\n commonError = {\n name: error.name,\n message: error.message,\n };\n }\n else if (commonError.name !== error.name ||\n commonError.message !== error.message) {\n retriable = false;\n break;\n }\n }\n else if (!command.inTransaction) {\n const isReadOnly = (0, commands_1.exists)(command.name, { caseInsensitive: true }) &&\n (0, commands_1.hasFlag)(command.name, \"readonly\", { nameCaseInsensitive: true });\n if (!isReadOnly) {\n retriable = false;\n break;\n }\n }\n }\n if (commonError && retriable) {\n const _this = this;\n const errv = commonError.message.split(\" \");\n const queue = this._queue;\n let inTransaction = false;\n this._queue = [];\n for (let i = 0; i < queue.length; ++i) {\n if (errv[0] === \"ASK\" &&\n !inTransaction &&\n queue[i].name !== \"asking\" &&\n (!queue[i - 1] || queue[i - 1].name !== \"asking\")) {\n const asking = new Command_1.default(\"asking\");\n asking.ignore = true;\n this.sendCommand(asking);\n }\n queue[i].initPromise();\n this.sendCommand(queue[i]);\n inTransaction = queue[i].inTransaction;\n }\n let matched = true;\n if (typeof this.leftRedirections === \"undefined\") {\n this.leftRedirections = {};\n }\n const exec = function () {\n _this.exec();\n };\n const cluster = this.redis;\n cluster.handleError(commonError, this.leftRedirections, {\n moved: function (_slot, key) {\n _this.preferKey = key;\n if (cluster.slots[errv[1]]) {\n if (cluster.slots[errv[1]][0] !== key) {\n cluster.slots[errv[1]] = [key];\n }\n }\n else {\n cluster.slots[errv[1]] = [key];\n }\n cluster._groupsBySlot[errv[1]] =\n cluster._groupsIds[cluster.slots[errv[1]].join(\";\")];\n cluster.refreshSlotsCache();\n _this.exec();\n },\n ask: function (_slot, key) {\n _this.preferKey = key;\n _this.exec();\n },\n tryagain: exec,\n clusterDown: exec,\n connectionClosed: exec,\n maxRedirections: () => {\n matched = false;\n },\n defaults: () => {\n matched = false;\n },\n });\n if (matched) {\n return;\n }\n }\n }\n let ignoredCount = 0;\n for (let i = 0; i < this._queue.length - ignoredCount; ++i) {\n if (this._queue[i + ignoredCount].ignore) {\n ignoredCount += 1;\n }\n this._result[i] = this._result[i + ignoredCount];\n }\n this.resolve(this._result.slice(0, this._result.length - ignoredCount));\n }\n sendCommand(command) {\n if (this._transactions > 0) {\n command.inTransaction = true;\n }\n const position = this._queue.length;\n command.pipelineIndex = position;\n command.promise\n .then((result) => {\n this.fillResult([null, result], position);\n })\n .catch((error) => {\n this.fillResult([error], position);\n });\n this._queue.push(command);\n return this;\n }\n addBatch(commands) {\n let command, commandName, args;\n for (let i = 0; i < commands.length; ++i) {\n command = commands[i];\n commandName = command[0];\n args = command.slice(1);\n this[commandName].apply(this, args);\n }\n return this;\n }\n}\nexports.default = Pipeline;\n// @ts-expect-error\nconst multi = Pipeline.prototype.multi;\n// @ts-expect-error\nPipeline.prototype.multi = function () {\n this._transactions += 1;\n return multi.apply(this, arguments);\n};\n// @ts-expect-error\nconst execBuffer = Pipeline.prototype.execBuffer;\n// @ts-expect-error\nPipeline.prototype.execBuffer = (0, util_1.deprecate)(function () {\n if (this._transactions > 0) {\n this._transactions -= 1;\n }\n return execBuffer.apply(this, arguments);\n}, \"Pipeline#execBuffer: Use Pipeline#exec instead\");\n// NOTE: To avoid an unhandled promise rejection, this will unconditionally always return this.promise,\n// which always has the rejection handled by standard-as-callback\n// adding the provided rejection callback.\n//\n// If a different promise instance were returned, that promise would cause its own unhandled promise rejection\n// errors, even if that promise unconditionally resolved to **the resolved value of** this.promise.\nPipeline.prototype.exec = function (callback) {\n // Wait for the cluster to be connected, since we need nodes information before continuing\n if (this.isCluster && !this.redis.slots.length) {\n if (this.redis.status === \"wait\")\n this.redis.connect().catch(utils_1.noop);\n if (callback && !this.nodeifiedPromise) {\n this.nodeifiedPromise = true;\n (0, standard_as_callback_1.default)(this.promise, callback);\n }\n this.redis.delayUntilReady((err) => {\n if (err) {\n this.reject(err);\n return;\n }\n this.exec(callback);\n });\n return this.promise;\n }\n if (this._transactions > 0) {\n this._transactions -= 1;\n return execBuffer.apply(this, arguments);\n }\n if (!this.nodeifiedPromise) {\n this.nodeifiedPromise = true;\n (0, standard_as_callback_1.default)(this.promise, callback);\n }\n if (!this._queue.length) {\n this.resolve([]);\n }\n let pipelineSlot;\n if (this.isCluster) {\n // List of the first key for each command\n const sampleKeys = [];\n for (let i = 0; i < this._queue.length; i++) {\n const keys = this._queue[i].getKeys();\n if (keys.length) {\n sampleKeys.push(keys[0]);\n }\n // For each command, check that the keys belong to the same slot\n if (keys.length && calculateSlot.generateMulti(keys) < 0) {\n this.reject(new Error(\"All the keys in a pipeline command should belong to the same slot\"));\n return this.promise;\n }\n }\n if (sampleKeys.length) {\n pipelineSlot = generateMultiWithNodes(this.redis, sampleKeys);\n if (pipelineSlot < 0) {\n this.reject(new Error(\"All keys in the pipeline should belong to the same slots allocation group\"));\n return this.promise;\n }\n }\n else {\n // Send the pipeline to a random node\n pipelineSlot = (Math.random() * 16384) | 0;\n }\n }\n const _this = this;\n execPipeline();\n return this.promise;\n function execPipeline() {\n let writePending = (_this.replyPending = _this._queue.length);\n let node;\n if (_this.isCluster) {\n node = {\n slot: pipelineSlot,\n redis: _this.redis.connectionPool.nodes.all[_this.preferKey],\n };\n }\n let data = \"\";\n let buffers;\n const stream = {\n isPipeline: true,\n destination: _this.isCluster ? node : { redis: _this.redis },\n write(writable) {\n if (typeof writable !== \"string\") {\n if (!buffers) {\n buffers = [];\n }\n if (data) {\n buffers.push(Buffer.from(data, \"utf8\"));\n data = \"\";\n }\n buffers.push(writable);\n }\n else {\n data += writable;\n }\n if (!--writePending) {\n if (buffers) {\n if (data) {\n buffers.push(Buffer.from(data, \"utf8\"));\n }\n stream.destination.redis.stream.write(Buffer.concat(buffers));\n }\n else {\n stream.destination.redis.stream.write(data);\n }\n // Reset writePending for resending\n writePending = _this._queue.length;\n data = \"\";\n buffers = undefined;\n }\n },\n };\n for (let i = 0; i < _this._queue.length; ++i) {\n _this.redis.sendCommand(_this._queue[i], stream, node);\n }\n return _this.promise;\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.addTransactionSupport = void 0;\nconst utils_1 = require(\"./utils\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst Pipeline_1 = require(\"./Pipeline\");\nfunction addTransactionSupport(redis) {\n redis.pipeline = function (commands) {\n const pipeline = new Pipeline_1.default(this);\n if (Array.isArray(commands)) {\n pipeline.addBatch(commands);\n }\n return pipeline;\n };\n const { multi } = redis;\n redis.multi = function (commands, options) {\n if (typeof options === \"undefined\" && !Array.isArray(commands)) {\n options = commands;\n commands = null;\n }\n if (options && options.pipeline === false) {\n return multi.call(this);\n }\n const pipeline = new Pipeline_1.default(this);\n // @ts-expect-error\n pipeline.multi();\n if (Array.isArray(commands)) {\n pipeline.addBatch(commands);\n }\n const exec = pipeline.exec;\n pipeline.exec = function (callback) {\n // Wait for the cluster to be connected, since we need nodes information before continuing\n if (this.isCluster && !this.redis.slots.length) {\n if (this.redis.status === \"wait\")\n this.redis.connect().catch(utils_1.noop);\n return (0, standard_as_callback_1.default)(new Promise((resolve, reject) => {\n this.redis.delayUntilReady((err) => {\n if (err) {\n reject(err);\n return;\n }\n this.exec(pipeline).then(resolve, reject);\n });\n }), callback);\n }\n if (this._transactions > 0) {\n exec.call(pipeline);\n }\n // Returns directly when the pipeline\n // has been called multiple times (retries).\n if (this.nodeifiedPromise) {\n return exec.call(pipeline);\n }\n const promise = exec.call(pipeline);\n return (0, standard_as_callback_1.default)(promise.then(function (result) {\n const execResult = result[result.length - 1];\n if (typeof execResult === \"undefined\") {\n throw new Error(\"Pipeline cannot be used to send any commands when the `exec()` has been called on it.\");\n }\n if (execResult[0]) {\n execResult[0].previousErrors = [];\n for (let i = 0; i < result.length - 1; ++i) {\n if (result[i][0]) {\n execResult[0].previousErrors.push(result[i][0]);\n }\n }\n throw execResult[0];\n }\n return (0, utils_1.wrapMultiResult)(execResult[1]);\n }), callback);\n };\n // @ts-expect-error\n const { execBuffer } = pipeline;\n // @ts-expect-error\n pipeline.execBuffer = function (callback) {\n if (this._transactions > 0) {\n execBuffer.call(pipeline);\n }\n return pipeline.exec(callback);\n };\n return pipeline;\n };\n const { exec } = redis;\n redis.exec = function (callback) {\n return (0, standard_as_callback_1.default)(exec.call(this).then(function (results) {\n if (Array.isArray(results)) {\n results = (0, utils_1.wrapMultiResult)(results);\n }\n return results;\n }), callback);\n };\n}\nexports.addTransactionSupport = addTransactionSupport;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction applyMixin(derivedConstructor, mixinConstructor) {\n Object.getOwnPropertyNames(mixinConstructor.prototype).forEach((name) => {\n Object.defineProperty(derivedConstructor.prototype, name, Object.getOwnPropertyDescriptor(mixinConstructor.prototype, name));\n });\n}\nexports.default = applyMixin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_CLUSTER_OPTIONS = void 0;\nconst dns_1 = require(\"dns\");\nexports.DEFAULT_CLUSTER_OPTIONS = {\n clusterRetryStrategy: (times) => Math.min(100 + times * 2, 2000),\n enableOfflineQueue: true,\n enableReadyCheck: true,\n scaleReads: \"master\",\n maxRedirections: 16,\n retryDelayOnMoved: 0,\n retryDelayOnFailover: 100,\n retryDelayOnClusterDown: 100,\n retryDelayOnTryAgain: 100,\n slotsRefreshTimeout: 1000,\n useSRVRecords: false,\n resolveSrv: dns_1.resolveSrv,\n dnsLookup: dns_1.lookup,\n enableAutoPipelining: false,\n autoPipeliningIgnoredCommands: [],\n shardedSubscribers: false,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getConnectionName = exports.weightSrvRecords = exports.groupSrvRecords = exports.getUniqueHostnamesFromOptions = exports.normalizeNodeOptions = exports.nodeKeyToRedisOptions = exports.getNodeKey = void 0;\nconst utils_1 = require(\"../utils\");\nconst net_1 = require(\"net\");\nfunction getNodeKey(node) {\n node.port = node.port || 6379;\n node.host = node.host || \"127.0.0.1\";\n return node.host + \":\" + node.port;\n}\nexports.getNodeKey = getNodeKey;\nfunction nodeKeyToRedisOptions(nodeKey) {\n const portIndex = nodeKey.lastIndexOf(\":\");\n if (portIndex === -1) {\n throw new Error(`Invalid node key ${nodeKey}`);\n }\n return {\n host: nodeKey.slice(0, portIndex),\n port: Number(nodeKey.slice(portIndex + 1)),\n };\n}\nexports.nodeKeyToRedisOptions = nodeKeyToRedisOptions;\nfunction normalizeNodeOptions(nodes) {\n return nodes.map((node) => {\n const options = {};\n if (typeof node === \"object\") {\n Object.assign(options, node);\n }\n else if (typeof node === \"string\") {\n Object.assign(options, (0, utils_1.parseURL)(node));\n }\n else if (typeof node === \"number\") {\n options.port = node;\n }\n else {\n throw new Error(\"Invalid argument \" + node);\n }\n if (typeof options.port === \"string\") {\n options.port = parseInt(options.port, 10);\n }\n // Cluster mode only support db 0\n delete options.db;\n if (!options.port) {\n options.port = 6379;\n }\n if (!options.host) {\n options.host = \"127.0.0.1\";\n }\n return (0, utils_1.resolveTLSProfile)(options);\n });\n}\nexports.normalizeNodeOptions = normalizeNodeOptions;\nfunction getUniqueHostnamesFromOptions(nodes) {\n const uniqueHostsMap = {};\n nodes.forEach((node) => {\n uniqueHostsMap[node.host] = true;\n });\n return Object.keys(uniqueHostsMap).filter((host) => !(0, net_1.isIP)(host));\n}\nexports.getUniqueHostnamesFromOptions = getUniqueHostnamesFromOptions;\nfunction groupSrvRecords(records) {\n const recordsByPriority = {};\n for (const record of records) {\n if (!recordsByPriority.hasOwnProperty(record.priority)) {\n recordsByPriority[record.priority] = {\n totalWeight: record.weight,\n records: [record],\n };\n }\n else {\n recordsByPriority[record.priority].totalWeight += record.weight;\n recordsByPriority[record.priority].records.push(record);\n }\n }\n return recordsByPriority;\n}\nexports.groupSrvRecords = groupSrvRecords;\nfunction weightSrvRecords(recordsGroup) {\n if (recordsGroup.records.length === 1) {\n recordsGroup.totalWeight = 0;\n return recordsGroup.records.shift();\n }\n // + `recordsGroup.records.length` to support `weight` 0\n const random = Math.floor(Math.random() * (recordsGroup.totalWeight + recordsGroup.records.length));\n let total = 0;\n for (const [i, record] of recordsGroup.records.entries()) {\n total += 1 + record.weight;\n if (total > random) {\n recordsGroup.totalWeight -= record.weight;\n recordsGroup.records.splice(i, 1);\n return record;\n }\n }\n}\nexports.weightSrvRecords = weightSrvRecords;\nfunction getConnectionName(component, nodeConnectionName) {\n const prefix = `ioredis-cluster(${component})`;\n return nodeConnectionName ? `${prefix}:${nodeConnectionName}` : prefix;\n}\nexports.getConnectionName = getConnectionName;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst util_1 = require(\"./util\");\nconst utils_1 = require(\"../utils\");\nconst Redis_1 = require(\"../Redis\");\nconst debug = (0, utils_1.Debug)(\"cluster:subscriber\");\nclass ClusterSubscriber {\n constructor(connectionPool, emitter, isSharded = false) {\n this.connectionPool = connectionPool;\n this.emitter = emitter;\n this.isSharded = isSharded;\n this.started = false;\n //There is only one connection for the entire pool\n this.subscriber = null;\n //The slot range for which this subscriber is responsible\n this.slotRange = [];\n this.onSubscriberEnd = () => {\n if (!this.started) {\n debug(\"subscriber has disconnected, but ClusterSubscriber is not started, so not reconnecting.\");\n return;\n }\n // If the subscriber closes whilst it's still the active connection,\n // we might as well try to connecting to a new node if possible to\n // minimise the number of missed publishes.\n debug(\"subscriber has disconnected, selecting a new one...\");\n this.selectSubscriber();\n };\n // If the current node we're using as the subscriber disappears\n // from the node pool for some reason, we will select a new one\n // to connect to.\n // Note that this event is only triggered if the connection to\n // the node has been used; cluster subscriptions are setup with\n // lazyConnect = true. It's possible for the subscriber node to\n // disappear without this method being called!\n // See https://github.com/luin/ioredis/pull/1589\n this.connectionPool.on(\"-node\", (_, key) => {\n if (!this.started || !this.subscriber) {\n return;\n }\n if ((0, util_1.getNodeKey)(this.subscriber.options) === key) {\n debug(\"subscriber has left, selecting a new one...\");\n this.selectSubscriber();\n }\n });\n this.connectionPool.on(\"+node\", () => {\n if (!this.started || this.subscriber) {\n return;\n }\n debug(\"a new node is discovered and there is no subscriber, selecting a new one...\");\n this.selectSubscriber();\n });\n }\n getInstance() {\n return this.subscriber;\n }\n /**\n * Associate this subscriber to a specific slot range.\n *\n * Returns the range or an empty array if the slot range couldn't be associated.\n *\n * BTW: This is more for debugging and testing purposes.\n *\n * @param range\n */\n associateSlotRange(range) {\n if (this.isSharded) {\n this.slotRange = range;\n }\n return this.slotRange;\n }\n start() {\n this.started = true;\n this.selectSubscriber();\n debug(\"started\");\n }\n stop() {\n this.started = false;\n if (this.subscriber) {\n this.subscriber.disconnect();\n this.subscriber = null;\n }\n }\n isStarted() {\n return this.started;\n }\n selectSubscriber() {\n const lastActiveSubscriber = this.lastActiveSubscriber;\n // Disconnect the previous subscriber even if there\n // will not be a new one.\n if (lastActiveSubscriber) {\n lastActiveSubscriber.off(\"end\", this.onSubscriberEnd);\n lastActiveSubscriber.disconnect();\n }\n if (this.subscriber) {\n this.subscriber.off(\"end\", this.onSubscriberEnd);\n this.subscriber.disconnect();\n }\n const sampleNode = (0, utils_1.sample)(this.connectionPool.getNodes());\n if (!sampleNode) {\n debug(\"selecting subscriber failed since there is no node discovered in the cluster yet\");\n this.subscriber = null;\n return;\n }\n const { options } = sampleNode;\n debug(\"selected a subscriber %s:%s\", options.host, options.port);\n /*\n * Create a specialized Redis connection for the subscription.\n * Note that auto reconnection is enabled here.\n *\n * `enableReadyCheck` is also enabled because although subscription is allowed\n * while redis is loading data from the disk, we can check if the password\n * provided for the subscriber is correct, and if not, the current subscriber\n * will be disconnected and a new subscriber will be selected.\n */\n let connectionPrefix = \"subscriber\";\n if (this.isSharded)\n connectionPrefix = \"ssubscriber\";\n this.subscriber = new Redis_1.default({\n port: options.port,\n host: options.host,\n username: options.username,\n password: options.password,\n enableReadyCheck: true,\n connectionName: (0, util_1.getConnectionName)(connectionPrefix, options.connectionName),\n lazyConnect: true,\n tls: options.tls,\n // Don't try to reconnect the subscriber connection. If the connection fails\n // we will get an end event (handled below), at which point we'll pick a new\n // node from the pool and try to connect to that as the subscriber connection.\n retryStrategy: null,\n });\n // Ignore the errors since they're handled in the connection pool.\n this.subscriber.on(\"error\", utils_1.noop);\n this.subscriber.on(\"moved\", () => {\n this.emitter.emit(\"forceRefresh\");\n });\n // The node we lost connection to may not come back up in a\n // reasonable amount of time (e.g. a slave that's taken down\n // for maintainence), we could potentially miss many published\n // messages so we should reconnect as quickly as possible, to\n // a different node if needed.\n this.subscriber.once(\"end\", this.onSubscriberEnd);\n // Re-subscribe previous channels\n const previousChannels = { subscribe: [], psubscribe: [], ssubscribe: [] };\n if (lastActiveSubscriber) {\n const condition = lastActiveSubscriber.condition || lastActiveSubscriber.prevCondition;\n if (condition && condition.subscriber) {\n previousChannels.subscribe = condition.subscriber.channels(\"subscribe\");\n previousChannels.psubscribe =\n condition.subscriber.channels(\"psubscribe\");\n previousChannels.ssubscribe =\n condition.subscriber.channels(\"ssubscribe\");\n }\n }\n if (previousChannels.subscribe.length ||\n previousChannels.psubscribe.length ||\n previousChannels.ssubscribe.length) {\n let pending = 0;\n for (const type of [\"subscribe\", \"psubscribe\", \"ssubscribe\"]) {\n const channels = previousChannels[type];\n if (channels.length == 0) {\n continue;\n }\n debug(\"%s %d channels\", type, channels.length);\n if (type === \"ssubscribe\") {\n for (const channel of channels) {\n pending += 1;\n this.subscriber[type](channel)\n .then(() => {\n if (!--pending) {\n this.lastActiveSubscriber = this.subscriber;\n }\n })\n .catch(() => {\n // TODO: should probably disconnect the subscriber and try again.\n debug(\"failed to ssubscribe to channel: %s\", channel);\n });\n }\n }\n else {\n pending += 1;\n this.subscriber[type](channels)\n .then(() => {\n if (!--pending) {\n this.lastActiveSubscriber = this.subscriber;\n }\n })\n .catch(() => {\n // TODO: should probably disconnect the subscriber and try again.\n debug(\"failed to %s %d channels\", type, channels.length);\n });\n }\n }\n }\n else {\n this.lastActiveSubscriber = this.subscriber;\n }\n for (const event of [\n \"message\",\n \"messageBuffer\",\n ]) {\n this.subscriber.on(event, (arg1, arg2) => {\n this.emitter.emit(event, arg1, arg2);\n });\n }\n for (const event of [\"pmessage\", \"pmessageBuffer\"]) {\n this.subscriber.on(event, (arg1, arg2, arg3) => {\n this.emitter.emit(event, arg1, arg2, arg3);\n });\n }\n if (this.isSharded == true) {\n for (const event of [\n \"smessage\",\n \"smessageBuffer\",\n ]) {\n this.subscriber.on(event, (arg1, arg2) => {\n this.emitter.emit(event, arg1, arg2);\n });\n }\n }\n }\n}\nexports.default = ClusterSubscriber;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst utils_1 = require(\"../utils\");\nconst util_1 = require(\"./util\");\nconst Redis_1 = require(\"../Redis\");\nconst debug = (0, utils_1.Debug)(\"cluster:connectionPool\");\nclass ConnectionPool extends events_1.EventEmitter {\n constructor(redisOptions) {\n super();\n this.redisOptions = redisOptions;\n // master + slave = all\n this.nodes = {\n all: {},\n master: {},\n slave: {},\n };\n this.specifiedOptions = {};\n }\n getNodes(role = \"all\") {\n const nodes = this.nodes[role];\n return Object.keys(nodes).map((key) => nodes[key]);\n }\n getInstanceByKey(key) {\n return this.nodes.all[key];\n }\n getSampleInstance(role) {\n const keys = Object.keys(this.nodes[role]);\n const sampleKey = (0, utils_1.sample)(keys);\n return this.nodes[role][sampleKey];\n }\n /**\n * Add a master node to the pool\n * @param node\n */\n addMasterNode(node) {\n const key = (0, util_1.getNodeKey)(node.options);\n const redis = this.createRedisFromOptions(node, node.options.readOnly);\n //Master nodes aren't read-only\n if (!node.options.readOnly) {\n this.nodes.all[key] = redis;\n this.nodes.master[key] = redis;\n return true;\n }\n return false;\n }\n /**\n * Creates a Redis connection instance from the node options\n * @param node\n * @param readOnly\n */\n createRedisFromOptions(node, readOnly) {\n const redis = new Redis_1.default((0, utils_1.defaults)({\n // Never try to reconnect when a node is lose,\n // instead, waiting for a `MOVED` error and\n // fetch the slots again.\n retryStrategy: null,\n // Offline queue should be enabled so that\n // we don't need to wait for the `ready` event\n // before sending commands to the node.\n enableOfflineQueue: true,\n readOnly: readOnly,\n }, node, this.redisOptions, { lazyConnect: true }));\n return redis;\n }\n /**\n * Find or create a connection to the node\n */\n findOrCreate(node, readOnly = false) {\n const key = (0, util_1.getNodeKey)(node);\n readOnly = Boolean(readOnly);\n if (this.specifiedOptions[key]) {\n Object.assign(node, this.specifiedOptions[key]);\n }\n else {\n this.specifiedOptions[key] = node;\n }\n let redis;\n if (this.nodes.all[key]) {\n redis = this.nodes.all[key];\n if (redis.options.readOnly !== readOnly) {\n redis.options.readOnly = readOnly;\n debug(\"Change role of %s to %s\", key, readOnly ? \"slave\" : \"master\");\n redis[readOnly ? \"readonly\" : \"readwrite\"]().catch(utils_1.noop);\n if (readOnly) {\n delete this.nodes.master[key];\n this.nodes.slave[key] = redis;\n }\n else {\n delete this.nodes.slave[key];\n this.nodes.master[key] = redis;\n }\n }\n }\n else {\n debug(\"Connecting to %s as %s\", key, readOnly ? \"slave\" : \"master\");\n redis = this.createRedisFromOptions(node, readOnly);\n this.nodes.all[key] = redis;\n this.nodes[readOnly ? \"slave\" : \"master\"][key] = redis;\n redis.once(\"end\", () => {\n this.removeNode(key);\n this.emit(\"-node\", redis, key);\n if (!Object.keys(this.nodes.all).length) {\n this.emit(\"drain\");\n }\n });\n this.emit(\"+node\", redis, key);\n redis.on(\"error\", function (error) {\n this.emit(\"nodeError\", error, key);\n });\n }\n return redis;\n }\n /**\n * Reset the pool with a set of nodes.\n * The old node will be removed.\n */\n reset(nodes) {\n debug(\"Reset with %O\", nodes);\n const newNodes = {};\n nodes.forEach((node) => {\n const key = (0, util_1.getNodeKey)(node);\n // Don't override the existing (master) node\n // when the current one is slave.\n if (!(node.readOnly && newNodes[key])) {\n newNodes[key] = node;\n }\n });\n Object.keys(this.nodes.all).forEach((key) => {\n if (!newNodes[key]) {\n debug(\"Disconnect %s because the node does not hold any slot\", key);\n this.nodes.all[key].disconnect();\n this.removeNode(key);\n }\n });\n Object.keys(newNodes).forEach((key) => {\n const node = newNodes[key];\n this.findOrCreate(node, node.readOnly);\n });\n }\n /**\n * Remove a node from the pool.\n */\n removeNode(key) {\n const { nodes } = this;\n if (nodes.all[key]) {\n debug(\"Remove %s from the pool\", key);\n delete nodes.all[key];\n }\n delete nodes.master[key];\n delete nodes.slave[key];\n }\n}\nexports.default = ConnectionPool;\n","'use strict';\n\n/**\n * Custom implementation of a double ended queue.\n */\nfunction Denque(array, options) {\n var options = options || {};\n this._capacity = options.capacity;\n\n this._head = 0;\n this._tail = 0;\n\n if (Array.isArray(array)) {\n this._fromArray(array);\n } else {\n this._capacityMask = 0x3;\n this._list = new Array(4);\n }\n}\n\n/**\n * --------------\n * PUBLIC API\n * -------------\n */\n\n/**\n * Returns the item at the specified index from the list.\n * 0 is the first element, 1 is the second, and so on...\n * Elements at negative values are that many from the end: -1 is one before the end\n * (the last element), -2 is two before the end (one before last), etc.\n * @param index\n * @returns {*}\n */\nDenque.prototype.peekAt = function peekAt(index) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n var len = this.size();\n if (i >= len || i < -len) return undefined;\n if (i < 0) i += len;\n i = (this._head + i) & this._capacityMask;\n return this._list[i];\n};\n\n/**\n * Alias for peekAt()\n * @param i\n * @returns {*}\n */\nDenque.prototype.get = function get(i) {\n return this.peekAt(i);\n};\n\n/**\n * Returns the first item in the list without removing it.\n * @returns {*}\n */\nDenque.prototype.peek = function peek() {\n if (this._head === this._tail) return undefined;\n return this._list[this._head];\n};\n\n/**\n * Alias for peek()\n * @returns {*}\n */\nDenque.prototype.peekFront = function peekFront() {\n return this.peek();\n};\n\n/**\n * Returns the item that is at the back of the queue without removing it.\n * Uses peekAt(-1)\n */\nDenque.prototype.peekBack = function peekBack() {\n return this.peekAt(-1);\n};\n\n/**\n * Returns the current length of the queue\n * @return {Number}\n */\nObject.defineProperty(Denque.prototype, 'length', {\n get: function length() {\n return this.size();\n }\n});\n\n/**\n * Return the number of items on the list, or 0 if empty.\n * @returns {number}\n */\nDenque.prototype.size = function size() {\n if (this._head === this._tail) return 0;\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Add an item at the beginning of the list.\n * @param item\n */\nDenque.prototype.unshift = function unshift(item) {\n if (arguments.length === 0) return this.size();\n var len = this._list.length;\n this._head = (this._head - 1 + len) & this._capacityMask;\n this._list[this._head] = item;\n if (this._tail === this._head) this._growArray();\n if (this._capacity && this.size() > this._capacity) this.pop();\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Remove and return the first item on the list,\n * Returns undefined if the list is empty.\n * @returns {*}\n */\nDenque.prototype.shift = function shift() {\n var head = this._head;\n if (head === this._tail) return undefined;\n var item = this._list[head];\n this._list[head] = undefined;\n this._head = (head + 1) & this._capacityMask;\n if (head < 2 && this._tail > 10000 && this._tail <= this._list.length >>> 2) this._shrinkArray();\n return item;\n};\n\n/**\n * Add an item to the bottom of the list.\n * @param item\n */\nDenque.prototype.push = function push(item) {\n if (arguments.length === 0) return this.size();\n var tail = this._tail;\n this._list[tail] = item;\n this._tail = (tail + 1) & this._capacityMask;\n if (this._tail === this._head) {\n this._growArray();\n }\n if (this._capacity && this.size() > this._capacity) {\n this.shift();\n }\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Remove and return the last item on the list.\n * Returns undefined if the list is empty.\n * @returns {*}\n */\nDenque.prototype.pop = function pop() {\n var tail = this._tail;\n if (tail === this._head) return undefined;\n var len = this._list.length;\n this._tail = (tail - 1 + len) & this._capacityMask;\n var item = this._list[this._tail];\n this._list[this._tail] = undefined;\n if (this._head < 2 && tail > 10000 && tail <= len >>> 2) this._shrinkArray();\n return item;\n};\n\n/**\n * Remove and return the item at the specified index from the list.\n * Returns undefined if the list is empty.\n * @param index\n * @returns {*}\n */\nDenque.prototype.removeOne = function removeOne(index) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n if (this._head === this._tail) return void 0;\n var size = this.size();\n var len = this._list.length;\n if (i >= size || i < -size) return void 0;\n if (i < 0) i += size;\n i = (this._head + i) & this._capacityMask;\n var item = this._list[i];\n var k;\n if (index < size / 2) {\n for (k = index; k > 0; k--) {\n this._list[i] = this._list[i = (i - 1 + len) & this._capacityMask];\n }\n this._list[i] = void 0;\n this._head = (this._head + 1 + len) & this._capacityMask;\n } else {\n for (k = size - 1 - index; k > 0; k--) {\n this._list[i] = this._list[i = (i + 1 + len) & this._capacityMask];\n }\n this._list[i] = void 0;\n this._tail = (this._tail - 1 + len) & this._capacityMask;\n }\n return item;\n};\n\n/**\n * Remove number of items from the specified index from the list.\n * Returns array of removed items.\n * Returns undefined if the list is empty.\n * @param index\n * @param count\n * @returns {array}\n */\nDenque.prototype.remove = function remove(index, count) {\n var i = index;\n var removed;\n var del_count = count;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n if (this._head === this._tail) return void 0;\n var size = this.size();\n var len = this._list.length;\n if (i >= size || i < -size || count < 1) return void 0;\n if (i < 0) i += size;\n if (count === 1 || !count) {\n removed = new Array(1);\n removed[0] = this.removeOne(i);\n return removed;\n }\n if (i === 0 && i + count >= size) {\n removed = this.toArray();\n this.clear();\n return removed;\n }\n if (i + count > size) count = size - i;\n var k;\n removed = new Array(count);\n for (k = 0; k < count; k++) {\n removed[k] = this._list[(this._head + i + k) & this._capacityMask];\n }\n i = (this._head + i) & this._capacityMask;\n if (index + count === size) {\n this._tail = (this._tail - count + len) & this._capacityMask;\n for (k = count; k > 0; k--) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n }\n return removed;\n }\n if (index === 0) {\n this._head = (this._head + count + len) & this._capacityMask;\n for (k = count - 1; k > 0; k--) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n }\n return removed;\n }\n if (i < size / 2) {\n this._head = (this._head + index + count + len) & this._capacityMask;\n for (k = index; k > 0; k--) {\n this.unshift(this._list[i = (i - 1 + len) & this._capacityMask]);\n }\n i = (this._head - 1 + len) & this._capacityMask;\n while (del_count > 0) {\n this._list[i = (i - 1 + len) & this._capacityMask] = void 0;\n del_count--;\n }\n if (index < 0) this._tail = i;\n } else {\n this._tail = i;\n i = (i + count + len) & this._capacityMask;\n for (k = size - (count + index); k > 0; k--) {\n this.push(this._list[i++]);\n }\n i = this._tail;\n while (del_count > 0) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n del_count--;\n }\n }\n if (this._head < 2 && this._tail > 10000 && this._tail <= len >>> 2) this._shrinkArray();\n return removed;\n};\n\n/**\n * Native splice implementation.\n * Remove number of items from the specified index from the list and/or add new elements.\n * Returns array of removed items or empty array if count == 0.\n * Returns undefined if the list is empty.\n *\n * @param index\n * @param count\n * @param {...*} [elements]\n * @returns {array}\n */\nDenque.prototype.splice = function splice(index, count) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n var size = this.size();\n if (i < 0) i += size;\n if (i > size) return void 0;\n if (arguments.length > 2) {\n var k;\n var temp;\n var removed;\n var arg_len = arguments.length;\n var len = this._list.length;\n var arguments_index = 2;\n if (!size || i < size / 2) {\n temp = new Array(i);\n for (k = 0; k < i; k++) {\n temp[k] = this._list[(this._head + k) & this._capacityMask];\n }\n if (count === 0) {\n removed = [];\n if (i > 0) {\n this._head = (this._head + i + len) & this._capacityMask;\n }\n } else {\n removed = this.remove(i, count);\n this._head = (this._head + i + len) & this._capacityMask;\n }\n while (arg_len > arguments_index) {\n this.unshift(arguments[--arg_len]);\n }\n for (k = i; k > 0; k--) {\n this.unshift(temp[k - 1]);\n }\n } else {\n temp = new Array(size - (i + count));\n var leng = temp.length;\n for (k = 0; k < leng; k++) {\n temp[k] = this._list[(this._head + i + count + k) & this._capacityMask];\n }\n if (count === 0) {\n removed = [];\n if (i != size) {\n this._tail = (this._head + i + len) & this._capacityMask;\n }\n } else {\n removed = this.remove(i, count);\n this._tail = (this._tail - leng + len) & this._capacityMask;\n }\n while (arguments_index < arg_len) {\n this.push(arguments[arguments_index++]);\n }\n for (k = 0; k < leng; k++) {\n this.push(temp[k]);\n }\n }\n return removed;\n } else {\n return this.remove(i, count);\n }\n};\n\n/**\n * Soft clear - does not reset capacity.\n */\nDenque.prototype.clear = function clear() {\n this._list = new Array(this._list.length);\n this._head = 0;\n this._tail = 0;\n};\n\n/**\n * Returns true or false whether the list is empty.\n * @returns {boolean}\n */\nDenque.prototype.isEmpty = function isEmpty() {\n return this._head === this._tail;\n};\n\n/**\n * Returns an array of all queue items.\n * @returns {Array}\n */\nDenque.prototype.toArray = function toArray() {\n return this._copyArray(false);\n};\n\n/**\n * -------------\n * INTERNALS\n * -------------\n */\n\n/**\n * Fills the queue with items from an array\n * For use in the constructor\n * @param array\n * @private\n */\nDenque.prototype._fromArray = function _fromArray(array) {\n var length = array.length;\n var capacity = this._nextPowerOf2(length);\n\n this._list = new Array(capacity);\n this._capacityMask = capacity - 1;\n this._tail = length;\n\n for (var i = 0; i < length; i++) this._list[i] = array[i];\n};\n\n/**\n *\n * @param fullCopy\n * @param size Initialize the array with a specific size. Will default to the current list size\n * @returns {Array}\n * @private\n */\nDenque.prototype._copyArray = function _copyArray(fullCopy, size) {\n var src = this._list;\n var capacity = src.length;\n var length = this.length;\n size = size | length;\n\n // No prealloc requested and the buffer is contiguous\n if (size == length && this._head < this._tail) {\n // Simply do a fast slice copy\n return this._list.slice(this._head, this._tail);\n }\n\n var dest = new Array(size);\n\n var k = 0;\n var i;\n if (fullCopy || this._head > this._tail) {\n for (i = this._head; i < capacity; i++) dest[k++] = src[i];\n for (i = 0; i < this._tail; i++) dest[k++] = src[i];\n } else {\n for (i = this._head; i < this._tail; i++) dest[k++] = src[i];\n }\n\n return dest;\n}\n\n/**\n * Grows the internal list array.\n * @private\n */\nDenque.prototype._growArray = function _growArray() {\n if (this._head != 0) {\n // double array size and copy existing data, head to end, then beginning to tail.\n var newList = this._copyArray(true, this._list.length << 1);\n\n this._tail = this._list.length;\n this._head = 0;\n\n this._list = newList;\n } else {\n this._tail = this._list.length;\n this._list.length <<= 1;\n }\n\n this._capacityMask = (this._capacityMask << 1) | 1;\n};\n\n/**\n * Shrinks the internal list array.\n * @private\n */\nDenque.prototype._shrinkArray = function _shrinkArray() {\n this._list.length >>>= 1;\n this._capacityMask >>>= 1;\n};\n\n/**\n * Find the next power of 2, at least 4\n * @private\n * @param {number} num \n * @returns {number}\n */\nDenque.prototype._nextPowerOf2 = function _nextPowerOf2(num) {\n var log2 = Math.log(num) / Math.log(2);\n var nextPow2 = 1 << (log2 + 1);\n\n return Math.max(nextPow2, 4);\n}\n\nmodule.exports = Denque;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst Deque = require(\"denque\");\nconst debug = (0, utils_1.Debug)(\"delayqueue\");\n/**\n * Queue that runs items after specified duration\n */\nclass DelayQueue {\n constructor() {\n this.queues = {};\n this.timeouts = {};\n }\n /**\n * Add a new item to the queue\n *\n * @param bucket bucket name\n * @param item function that will run later\n * @param options\n */\n push(bucket, item, options) {\n const callback = options.callback || process.nextTick;\n if (!this.queues[bucket]) {\n this.queues[bucket] = new Deque();\n }\n const queue = this.queues[bucket];\n queue.push(item);\n if (!this.timeouts[bucket]) {\n this.timeouts[bucket] = setTimeout(() => {\n callback(() => {\n this.timeouts[bucket] = null;\n this.execute(bucket);\n });\n }, options.timeout);\n }\n }\n execute(bucket) {\n const queue = this.queues[bucket];\n if (!queue) {\n return;\n }\n const { length } = queue;\n if (!length) {\n return;\n }\n debug(\"send %d commands in %s queue\", length, bucket);\n this.queues[bucket] = null;\n while (queue.length > 0) {\n queue.shift()();\n }\n }\n}\nexports.default = DelayQueue;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst util_1 = require(\"./util\");\nconst utils_1 = require(\"../utils\");\nconst Redis_1 = require(\"../Redis\");\nconst debug = (0, utils_1.Debug)(\"cluster:subscriberGroup:shardedSubscriber\");\nconst SubscriberStatus = {\n IDLE: \"idle\",\n STARTING: \"starting\",\n CONNECTED: \"connected\",\n STOPPING: \"stopping\",\n ENDED: \"ended\",\n};\nconst ALLOWED_STATUS_UPDATES = {\n [SubscriberStatus.IDLE]: [\n SubscriberStatus.STARTING,\n SubscriberStatus.STOPPING,\n SubscriberStatus.ENDED,\n ],\n [SubscriberStatus.STARTING]: [\n SubscriberStatus.CONNECTED,\n SubscriberStatus.STOPPING,\n SubscriberStatus.ENDED,\n ],\n [SubscriberStatus.CONNECTED]: [\n SubscriberStatus.STOPPING,\n SubscriberStatus.ENDED,\n ],\n [SubscriberStatus.STOPPING]: [SubscriberStatus.ENDED],\n [SubscriberStatus.ENDED]: [],\n};\nclass ShardedSubscriber {\n constructor(emitter, options, redisOptions) {\n var _a;\n this.emitter = emitter;\n this.status = SubscriberStatus.IDLE;\n this.instance = null;\n this.connectPromise = null;\n // Store listener references for cleanup\n this.messageListeners = new Map();\n this.onEnd = () => {\n this.updateStatus(SubscriberStatus.ENDED);\n this.emitter.emit(\"-node\", this.instance, this.nodeKey);\n };\n this.onError = (error) => {\n this.emitter.emit(\"nodeError\", error, this.nodeKey);\n };\n this.onMoved = () => {\n this.emitter.emit(\"moved\");\n };\n this.instance = new Redis_1.default((0, utils_1.defaults)({\n enableReadyCheck: false,\n enableOfflineQueue: true,\n connectionName: (0, util_1.getConnectionName)(\"ssubscriber\", options.connectionName),\n /**\n * Disable auto reconnection for subscribers.\n * The ClusterSubscriberGroup will handle the reconnection.\n */\n retryStrategy: null,\n lazyConnect: true,\n }, options, redisOptions));\n this.lazyConnect = (_a = redisOptions === null || redisOptions === void 0 ? void 0 : redisOptions.lazyConnect) !== null && _a !== void 0 ? _a : true;\n this.nodeKey = (0, util_1.getNodeKey)(options);\n // Register listeners\n this.instance.on(\"end\", this.onEnd);\n this.instance.on(\"error\", this.onError);\n this.instance.on(\"moved\", this.onMoved);\n for (const event of [\"smessage\", \"smessageBuffer\"]) {\n const listener = (...args) => {\n this.emitter.emit(event, ...args);\n };\n this.messageListeners.set(event, listener);\n this.instance.on(event, listener);\n }\n }\n async start() {\n if (this.connectPromise) {\n return this.connectPromise;\n }\n if (this.status === SubscriberStatus.STARTING ||\n this.status === SubscriberStatus.CONNECTED) {\n return;\n }\n if (this.status === SubscriberStatus.ENDED || !this.instance) {\n throw new Error(`Sharded subscriber ${this.nodeKey} cannot be restarted once ended.`);\n }\n this.updateStatus(SubscriberStatus.STARTING);\n this.connectPromise = this.instance.connect();\n try {\n await this.connectPromise;\n this.updateStatus(SubscriberStatus.CONNECTED);\n }\n catch (err) {\n this.updateStatus(SubscriberStatus.ENDED);\n throw err;\n }\n finally {\n this.connectPromise = null;\n }\n }\n stop() {\n this.updateStatus(SubscriberStatus.STOPPING);\n if (this.instance) {\n this.instance.disconnect();\n this.instance.removeAllListeners();\n this.messageListeners.clear();\n this.instance = null;\n }\n this.updateStatus(SubscriberStatus.ENDED);\n debug(\"stopped %s\", this.nodeKey);\n }\n isStarted() {\n return [\n SubscriberStatus.CONNECTED,\n SubscriberStatus.STARTING,\n ].includes(this.status);\n }\n get subscriberStatus() {\n return this.status;\n }\n isHealthy() {\n return ((this.status === SubscriberStatus.IDLE ||\n this.status === SubscriberStatus.CONNECTED ||\n this.status === SubscriberStatus.STARTING) &&\n this.instance !== null);\n }\n getInstance() {\n return this.instance;\n }\n getNodeKey() {\n return this.nodeKey;\n }\n isLazyConnect() {\n return this.lazyConnect;\n }\n updateStatus(nextStatus) {\n if (this.status === nextStatus) {\n return;\n }\n if (!ALLOWED_STATUS_UPDATES[this.status].includes(nextStatus)) {\n debug(\"Invalid status transition for %s: %s -> %s\", this.nodeKey, this.status, nextStatus);\n return;\n }\n this.status = nextStatus;\n }\n}\nexports.default = ShardedSubscriber;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst util_1 = require(\"./util\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst ShardedSubscriber_1 = require(\"./ShardedSubscriber\");\nconst debug = (0, utils_1.Debug)(\"cluster:subscriberGroup\");\n/**\n * Redis distinguishes between \"normal\" and sharded PubSub. When using the normal PubSub feature,\n * exactly one subscriber exists per cluster instance because the Redis cluster bus forwards\n * messages between shards. Sharded PubSub removes this limitation by making each shard\n * responsible for its own messages.\n *\n * This class coordinates one ShardedSubscriber per master node in the cluster, providing\n * sharded PubSub support while keeping the public API backward compatible.\n */\nclass ClusterSubscriberGroup {\n /**\n * Register callbacks\n *\n * @param cluster\n */\n constructor(subscriberGroupEmitter, options) {\n this.subscriberGroupEmitter = subscriberGroupEmitter;\n this.options = options;\n this.shardedSubscribers = new Map();\n this.clusterSlots = [];\n // Simple [min, max] slot ranges aren't enough because you can migrate single slots\n this.subscriberToSlotsIndex = new Map();\n this.channels = new Map();\n this.failedAttemptsByNode = new Map();\n // Only latest pending reset kept; throttled by refreshSlotsCache's isRefreshing + backoff delay\n this.isResetting = false;\n this.pendingReset = null;\n /**\n * Handles failed subscriber connections by emitting an event to refresh the slots cache\n * after a backoff period.\n *\n * @param error\n * @param nodeKey\n */\n this.handleSubscriberConnectFailed = (error, nodeKey) => {\n const currentAttempts = this.failedAttemptsByNode.get(nodeKey) || 0;\n const failedAttempts = currentAttempts + 1;\n this.failedAttemptsByNode.set(nodeKey, failedAttempts);\n const attempts = Math.min(failedAttempts, ClusterSubscriberGroup.MAX_RETRY_ATTEMPTS);\n const backoff = Math.min(ClusterSubscriberGroup.BASE_BACKOFF_MS * 2 ** attempts, ClusterSubscriberGroup.MAX_BACKOFF_MS);\n const jitter = Math.floor((Math.random() - 0.5) * (backoff * 0.5));\n const delay = Math.max(0, backoff + jitter);\n debug(\"Failed to connect subscriber for %s. Refreshing slots in %dms\", nodeKey, delay);\n this.subscriberGroupEmitter.emit(\"subscriberConnectFailed\", {\n delay,\n error,\n });\n };\n /**\n * Handles successful subscriber connections by resetting the failed attempts counter.\n *\n * @param nodeKey\n */\n this.handleSubscriberConnectSucceeded = (nodeKey) => {\n this.failedAttemptsByNode.delete(nodeKey);\n };\n }\n /**\n * Get the responsible subscriber.\n *\n * @param slot\n */\n getResponsibleSubscriber(slot) {\n const nodeKey = this.clusterSlots[slot][0];\n const sub = this.shardedSubscribers.get(nodeKey);\n if (sub && sub.subscriberStatus === \"idle\") {\n sub\n .start()\n .then(() => {\n this.handleSubscriberConnectSucceeded(sub.getNodeKey());\n })\n .catch((err) => {\n this.handleSubscriberConnectFailed(err, sub.getNodeKey());\n });\n }\n return sub;\n }\n /**\n * Adds a channel for which this subscriber group is responsible\n *\n * @param channels\n */\n addChannels(channels) {\n const slot = calculateSlot(channels[0]);\n // Check if the all channels belong to the same slot and otherwise reject the operation\n for (const c of channels) {\n if (calculateSlot(c) !== slot) {\n return -1;\n }\n }\n const currChannels = this.channels.get(slot);\n if (!currChannels) {\n this.channels.set(slot, channels);\n }\n else {\n this.channels.set(slot, currChannels.concat(channels));\n }\n return Array.from(this.channels.values()).reduce((sum, array) => sum + array.length, 0);\n }\n /**\n * Removes channels for which the subscriber group is responsible by optionally unsubscribing\n * @param channels\n */\n removeChannels(channels) {\n const slot = calculateSlot(channels[0]);\n // Check if the all channels belong to the same slot and otherwise reject the operation\n for (const c of channels) {\n if (calculateSlot(c) !== slot) {\n return -1;\n }\n }\n const slotChannels = this.channels.get(slot);\n if (slotChannels) {\n const updatedChannels = slotChannels.filter((c) => !channels.includes(c));\n this.channels.set(slot, updatedChannels);\n }\n return Array.from(this.channels.values()).reduce((sum, array) => sum + array.length, 0);\n }\n /**\n * Disconnect all subscribers and clear some of the internal state.\n */\n stop() {\n for (const s of this.shardedSubscribers.values()) {\n s.stop();\n }\n // Clear subscriber instances and pending operations.\n // Channels are preserved for resubscription on reconnect.\n this.pendingReset = null;\n this.shardedSubscribers.clear();\n this.subscriberToSlotsIndex.clear();\n }\n /**\n * Start all not yet started subscribers\n */\n start() {\n const startPromises = [];\n for (const s of this.shardedSubscribers.values()) {\n if (this.shouldStartSubscriber(s)) {\n startPromises.push(s\n .start()\n .then(() => {\n this.handleSubscriberConnectSucceeded(s.getNodeKey());\n })\n .catch((err) => {\n this.handleSubscriberConnectFailed(err, s.getNodeKey());\n }));\n this.subscriberGroupEmitter.emit(\"+subscriber\");\n }\n }\n return Promise.all(startPromises);\n }\n /**\n * Resets the subscriber group by disconnecting all subscribers that are no longer needed and connecting new ones.\n */\n async reset(clusterSlots, clusterNodes) {\n if (this.isResetting) {\n this.pendingReset = { slots: clusterSlots, nodes: clusterNodes };\n return;\n }\n this.isResetting = true;\n try {\n const hasTopologyChanged = this._refreshSlots(clusterSlots);\n const hasFailedSubscribers = this.hasUnhealthySubscribers();\n if (!hasTopologyChanged && !hasFailedSubscribers) {\n debug(\"No topology change detected or failed subscribers. Skipping reset.\");\n return;\n }\n // For each of the sharded subscribers\n for (const [nodeKey, shardedSubscriber] of this.shardedSubscribers) {\n if (\n // If the subscriber is still responsible for a slot range and is healthy then keep it\n this.subscriberToSlotsIndex.has(nodeKey) &&\n shardedSubscriber.isHealthy()) {\n debug(\"Skipping deleting subscriber for %s\", nodeKey);\n continue;\n }\n debug(\"Removing subscriber for %s\", nodeKey);\n // Otherwise stop the subscriber and remove it\n shardedSubscriber.stop();\n this.shardedSubscribers.delete(nodeKey);\n this.subscriberGroupEmitter.emit(\"-subscriber\");\n }\n const startPromises = [];\n // For each node in slots cache\n for (const [nodeKey, _] of this.subscriberToSlotsIndex) {\n const existingSubscriber = this.shardedSubscribers.get(nodeKey);\n // If we already have a subscriber for this node, only ensure it is healthy\n // when it now owns slots with active channel subscriptions.\n if (existingSubscriber && existingSubscriber.isHealthy()) {\n debug(\"Skipping creating new subscriber for %s\", nodeKey);\n if (!existingSubscriber.isStarted() &&\n this.shouldStartSubscriber(existingSubscriber)) {\n startPromises.push(existingSubscriber\n .start()\n .then(() => {\n this.handleSubscriberConnectSucceeded(nodeKey);\n })\n .catch((error) => {\n this.handleSubscriberConnectFailed(error, nodeKey);\n }));\n }\n continue;\n }\n // If we have an existing subscriber but it is not healthy, stop it\n if (existingSubscriber && !existingSubscriber.isHealthy()) {\n debug(\"Replacing subscriber for %s\", nodeKey);\n existingSubscriber.stop();\n this.shardedSubscribers.delete(nodeKey);\n this.subscriberGroupEmitter.emit(\"-subscriber\");\n }\n debug(\"Creating new subscriber for %s\", nodeKey);\n // Otherwise create a new subscriber\n const redis = clusterNodes.find((node) => {\n return (0, util_1.getNodeKey)(node.options) === nodeKey;\n });\n if (!redis) {\n debug(\"Failed to find node for key %s\", nodeKey);\n continue;\n }\n const sub = new ShardedSubscriber_1.default(this.subscriberGroupEmitter, redis.options, this.options.redisOptions);\n this.shardedSubscribers.set(nodeKey, sub);\n if (this.shouldStartSubscriber(sub)) {\n startPromises.push(sub\n .start()\n .then(() => {\n this.handleSubscriberConnectSucceeded(nodeKey);\n })\n .catch((error) => {\n this.handleSubscriberConnectFailed(error, nodeKey);\n }));\n }\n this.subscriberGroupEmitter.emit(\"+subscriber\");\n }\n // It's vital to await the start promises before resubscribing\n // Otherwise we might try to resubscribe to a subscriber that is not yet connected\n // This can cause a race condition\n await Promise.all(startPromises);\n this._resubscribe();\n this.subscriberGroupEmitter.emit(\"subscribersReady\");\n }\n finally {\n this.isResetting = false;\n if (this.pendingReset) {\n const { slots, nodes } = this.pendingReset;\n this.pendingReset = null;\n await this.reset(slots, nodes);\n }\n }\n }\n /**\n * Refreshes the subscriber-related slot ranges\n *\n * Returns false if no refresh was needed\n *\n * @param targetSlots\n */\n _refreshSlots(targetSlots) {\n //If there was an actual change, then reassign the slot ranges\n // Also rebuild if subscriberToSlotsIndex is empty (e.g., after stop() was called)\n if (this._slotsAreEqual(targetSlots) && this.subscriberToSlotsIndex.size > 0) {\n debug(\"Nothing to refresh because the new cluster map is equal to the previous one.\");\n return false;\n }\n debug(\"Refreshing the slots of the subscriber group.\");\n //Rebuild the slots index\n this.subscriberToSlotsIndex = new Map();\n for (let slot = 0; slot < targetSlots.length; slot++) {\n const node = targetSlots[slot][0];\n if (!this.subscriberToSlotsIndex.has(node)) {\n this.subscriberToSlotsIndex.set(node, []);\n }\n this.subscriberToSlotsIndex.get(node).push(Number(slot));\n }\n //Update the cached slots map\n this.clusterSlots = JSON.parse(JSON.stringify(targetSlots));\n return true;\n }\n /**\n * Resubscribes to the previous channels\n *\n * @private\n */\n _resubscribe() {\n if (this.shardedSubscribers) {\n this.shardedSubscribers.forEach((s, nodeKey) => {\n const subscriberSlots = this.subscriberToSlotsIndex.get(nodeKey);\n if (subscriberSlots) {\n //Resubscribe on the underlying connection\n subscriberSlots.forEach((ss) => {\n //Might return null if being disconnected\n const redis = s.getInstance();\n const channels = this.channels.get(ss);\n if (channels && channels.length > 0) {\n if (!redis || redis.status === \"end\") {\n return;\n }\n if (redis.status === \"ready\") {\n redis.ssubscribe(...channels).catch((err) => {\n // TODO: Should we emit an error event here?\n debug(\"Failed to ssubscribe on node %s: %s\", nodeKey, err);\n });\n }\n else {\n redis.once(\"ready\", () => {\n redis.ssubscribe(...channels).catch((err) => {\n // TODO: Should we emit an error event here?\n debug(\"Failed to ssubscribe on node %s: %s\", nodeKey, err);\n });\n });\n }\n }\n });\n }\n });\n }\n }\n /**\n * Deep equality of the cluster slots objects\n *\n * @param other\n * @private\n */\n _slotsAreEqual(other) {\n if (this.clusterSlots === undefined) {\n return false;\n }\n else {\n return JSON.stringify(this.clusterSlots) === JSON.stringify(other);\n }\n }\n /**\n * Checks if any subscribers are in an unhealthy state.\n *\n * A subscriber is considered unhealthy if:\n * - It exists but is not started (failed/disconnected)\n * - It's missing entirely for a node that should have one\n *\n * @returns true if any subscribers need to be recreated\n */\n hasUnhealthySubscribers() {\n const hasFailedSubscribers = Array.from(this.shardedSubscribers.values()).some((sub) => !sub.isHealthy());\n const hasMissingSubscribers = Array.from(this.subscriberToSlotsIndex.keys()).some((nodeKey) => !this.shardedSubscribers.has(nodeKey));\n return hasFailedSubscribers || hasMissingSubscribers;\n }\n shouldStartSubscriber(sub) {\n if (sub.isStarted()) {\n return false;\n }\n if (!sub.isLazyConnect()) {\n return true;\n }\n const subscriberSlots = this.subscriberToSlotsIndex.get(sub.getNodeKey());\n if (!subscriberSlots) {\n return false;\n }\n return subscriberSlots.some((slot) => {\n const channels = this.channels.get(slot);\n return Boolean(channels && channels.length > 0);\n });\n }\n}\nexports.default = ClusterSubscriberGroup;\n// Retry strategy\nClusterSubscriberGroup.MAX_RETRY_ATTEMPTS = 10;\nClusterSubscriberGroup.MAX_BACKOFF_MS = 2000;\nClusterSubscriberGroup.BASE_BACKOFF_MS = 100;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst events_1 = require(\"events\");\nconst redis_errors_1 = require(\"redis-errors\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst Command_1 = require(\"../Command\");\nconst ClusterAllFailedError_1 = require(\"../errors/ClusterAllFailedError\");\nconst Redis_1 = require(\"../Redis\");\nconst ScanStream_1 = require(\"../ScanStream\");\nconst transaction_1 = require(\"../transaction\");\nconst utils_1 = require(\"../utils\");\nconst applyMixin_1 = require(\"../utils/applyMixin\");\nconst Commander_1 = require(\"../utils/Commander\");\nconst ClusterOptions_1 = require(\"./ClusterOptions\");\nconst ClusterSubscriber_1 = require(\"./ClusterSubscriber\");\nconst ConnectionPool_1 = require(\"./ConnectionPool\");\nconst DelayQueue_1 = require(\"./DelayQueue\");\nconst util_1 = require(\"./util\");\nconst Deque = require(\"denque\");\nconst ClusterSubscriberGroup_1 = require(\"./ClusterSubscriberGroup\");\nconst debug = (0, utils_1.Debug)(\"cluster\");\nconst REJECT_OVERWRITTEN_COMMANDS = new WeakSet();\n/**\n * Client for the official Redis Cluster\n */\nclass Cluster extends Commander_1.default {\n /**\n * Creates an instance of Cluster.\n */\n //TODO: Add an option that enables or disables sharded PubSub\n constructor(startupNodes, options = {}) {\n super();\n this.slots = [];\n /**\n * @ignore\n */\n this._groupsIds = {};\n /**\n * @ignore\n */\n this._groupsBySlot = Array(16384);\n /**\n * @ignore\n */\n this.isCluster = true;\n this.retryAttempts = 0;\n this.delayQueue = new DelayQueue_1.default();\n this.offlineQueue = new Deque();\n this.isRefreshing = false;\n this._refreshSlotsCacheCallbacks = [];\n this._autoPipelines = new Map();\n this._runningAutoPipelines = new Set();\n this._readyDelayedCallbacks = [];\n /**\n * Every time Cluster#connect() is called, this value will be\n * auto-incrementing. The purpose of this value is used for\n * discarding previous connect attampts when creating a new\n * connection.\n */\n this.connectionEpoch = 0;\n events_1.EventEmitter.call(this);\n this.startupNodes = startupNodes;\n this.options = (0, utils_1.defaults)({}, options, ClusterOptions_1.DEFAULT_CLUSTER_OPTIONS, this.options);\n if (this.options.shardedSubscribers) {\n this.createShardedSubscriberGroup();\n }\n if (this.options.redisOptions &&\n this.options.redisOptions.keyPrefix &&\n !this.options.keyPrefix) {\n this.options.keyPrefix = this.options.redisOptions.keyPrefix;\n }\n // validate options\n if (typeof this.options.scaleReads !== \"function\" &&\n [\"all\", \"master\", \"slave\"].indexOf(this.options.scaleReads) === -1) {\n throw new Error('Invalid option scaleReads \"' +\n this.options.scaleReads +\n '\". Expected \"all\", \"master\", \"slave\" or a custom function');\n }\n this.connectionPool = new ConnectionPool_1.default(this.options.redisOptions);\n this.connectionPool.on(\"-node\", (redis, key) => {\n this.emit(\"-node\", redis);\n });\n this.connectionPool.on(\"+node\", (redis) => {\n this.emit(\"+node\", redis);\n });\n this.connectionPool.on(\"drain\", () => {\n this.setStatus(\"close\");\n });\n this.connectionPool.on(\"nodeError\", (error, key) => {\n this.emit(\"node error\", error, key);\n });\n this.subscriber = new ClusterSubscriber_1.default(this.connectionPool, this);\n if (this.options.scripts) {\n Object.entries(this.options.scripts).forEach(([name, definition]) => {\n this.defineCommand(name, definition);\n });\n }\n if (this.options.lazyConnect) {\n this.setStatus(\"wait\");\n }\n else {\n this.connect().catch((err) => {\n debug(\"connecting failed: %s\", err);\n });\n }\n }\n /**\n * Connect to a cluster\n */\n connect() {\n return new Promise((resolve, reject) => {\n if (this.status === \"connecting\" ||\n this.status === \"connect\" ||\n this.status === \"ready\") {\n reject(new Error(\"Redis is already connecting/connected\"));\n return;\n }\n const epoch = ++this.connectionEpoch;\n this.setStatus(\"connecting\");\n this.resolveStartupNodeHostnames()\n .then((nodes) => {\n if (this.connectionEpoch !== epoch) {\n debug(\"discard connecting after resolving startup nodes because epoch not match: %d != %d\", epoch, this.connectionEpoch);\n reject(new redis_errors_1.RedisError(\"Connection is discarded because a new connection is made\"));\n return;\n }\n if (this.status !== \"connecting\") {\n debug(\"discard connecting after resolving startup nodes because the status changed to %s\", this.status);\n reject(new redis_errors_1.RedisError(\"Connection is aborted\"));\n return;\n }\n this.connectionPool.reset(nodes);\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers\n .reset(this.slots, this.connectionPool.getNodes(\"all\"))\n .catch((err) => {\n // TODO should we emit an error event here?\n debug(\"Error while starting subscribers: %s\", err);\n });\n }\n const readyHandler = () => {\n this.setStatus(\"ready\");\n this.retryAttempts = 0;\n this.executeOfflineCommands();\n this.resetNodesRefreshInterval();\n resolve();\n };\n let closeListener = undefined;\n const refreshListener = () => {\n this.invokeReadyDelayedCallbacks(undefined);\n this.removeListener(\"close\", closeListener);\n this.manuallyClosing = false;\n this.setStatus(\"connect\");\n if (this.options.enableReadyCheck) {\n this.readyCheck((err, fail) => {\n if (err || fail) {\n debug(\"Ready check failed (%s). Reconnecting...\", err || fail);\n if (this.status === \"connect\") {\n this.disconnect(true);\n }\n }\n else {\n readyHandler();\n }\n });\n }\n else {\n readyHandler();\n }\n };\n closeListener = () => {\n const error = new Error(\"None of startup nodes is available\");\n this.removeListener(\"refresh\", refreshListener);\n this.invokeReadyDelayedCallbacks(error);\n reject(error);\n };\n this.once(\"refresh\", refreshListener);\n this.once(\"close\", closeListener);\n this.once(\"close\", this.handleCloseEvent.bind(this));\n this.refreshSlotsCache((err) => {\n if (err && err.message === ClusterAllFailedError_1.default.defaultMessage) {\n Redis_1.default.prototype.silentEmit.call(this, \"error\", err);\n this.connectionPool.reset([]);\n }\n });\n this.subscriber.start();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.start().catch((err) => {\n // TODO should we emit an error event here?\n debug(\"Error while starting subscribers: %s\", err);\n });\n }\n })\n .catch((err) => {\n this.setStatus(\"close\");\n this.handleCloseEvent(err);\n this.invokeReadyDelayedCallbacks(err);\n reject(err);\n });\n });\n }\n /**\n * Disconnect from every node in the cluster.\n */\n disconnect(reconnect = false) {\n const status = this.status;\n this.setStatus(\"disconnecting\");\n if (!reconnect) {\n this.manuallyClosing = true;\n }\n if (this.reconnectTimeout && !reconnect) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n debug(\"Canceled reconnecting attempts\");\n }\n this.clearNodesRefreshInterval();\n this.subscriber.stop();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.stop();\n }\n if (status === \"wait\") {\n this.setStatus(\"close\");\n this.handleCloseEvent();\n }\n else {\n this.connectionPool.reset([]);\n }\n }\n /**\n * Quit the cluster gracefully.\n */\n quit(callback) {\n const status = this.status;\n this.setStatus(\"disconnecting\");\n this.manuallyClosing = true;\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n this.clearNodesRefreshInterval();\n this.subscriber.stop();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.stop();\n }\n if (status === \"wait\") {\n const ret = (0, standard_as_callback_1.default)(Promise.resolve(\"OK\"), callback);\n // use setImmediate to make sure \"close\" event\n // being emitted after quit() is returned\n setImmediate(function () {\n this.setStatus(\"close\");\n this.handleCloseEvent();\n }.bind(this));\n return ret;\n }\n return (0, standard_as_callback_1.default)(Promise.all(this.nodes().map((node) => node.quit().catch((err) => {\n // Ignore the error caused by disconnecting since\n // we're disconnecting...\n if (err.message === utils_1.CONNECTION_CLOSED_ERROR_MSG) {\n return \"OK\";\n }\n throw err;\n }))).then(() => \"OK\"), callback);\n }\n /**\n * Create a new instance with the same startup nodes and options as the current one.\n *\n * @example\n * ```js\n * var cluster = new Redis.Cluster([{ host: \"127.0.0.1\", port: \"30001\" }]);\n * var anotherCluster = cluster.duplicate();\n * ```\n */\n duplicate(overrideStartupNodes = [], overrideOptions = {}) {\n const startupNodes = overrideStartupNodes.length > 0\n ? overrideStartupNodes\n : this.startupNodes.slice(0);\n const options = Object.assign({}, this.options, overrideOptions);\n return new Cluster(startupNodes, options);\n }\n /**\n * Get nodes with the specified role\n */\n nodes(role = \"all\") {\n if (role !== \"all\" && role !== \"master\" && role !== \"slave\") {\n throw new Error('Invalid role \"' + role + '\". Expected \"all\", \"master\" or \"slave\"');\n }\n return this.connectionPool.getNodes(role);\n }\n /**\n * This is needed in order not to install a listener for each auto pipeline\n *\n * @ignore\n */\n delayUntilReady(callback) {\n this._readyDelayedCallbacks.push(callback);\n }\n /**\n * Get the number of commands queued in automatic pipelines.\n *\n * This is not available (and returns 0) until the cluster is connected and slots information have been received.\n */\n get autoPipelineQueueSize() {\n let queued = 0;\n for (const pipeline of this._autoPipelines.values()) {\n queued += pipeline.length;\n }\n return queued;\n }\n /**\n * Refresh the slot cache\n *\n * @ignore\n */\n refreshSlotsCache(callback) {\n if (callback) {\n this._refreshSlotsCacheCallbacks.push(callback);\n }\n if (this.isRefreshing) {\n return;\n }\n this.isRefreshing = true;\n const _this = this;\n const wrapper = (error) => {\n this.isRefreshing = false;\n for (const callback of this._refreshSlotsCacheCallbacks) {\n callback(error);\n }\n this._refreshSlotsCacheCallbacks = [];\n };\n const nodes = (0, utils_1.shuffle)(this.connectionPool.getNodes());\n let lastNodeError = null;\n function tryNode(index) {\n if (index === nodes.length) {\n const error = new ClusterAllFailedError_1.default(ClusterAllFailedError_1.default.defaultMessage, lastNodeError);\n return wrapper(error);\n }\n const node = nodes[index];\n const key = `${node.options.host}:${node.options.port}`;\n debug(\"getting slot cache from %s\", key);\n _this.getInfoFromNode(node, function (err) {\n switch (_this.status) {\n case \"close\":\n case \"end\":\n return wrapper(new Error(\"Cluster is disconnected.\"));\n case \"disconnecting\":\n return wrapper(new Error(\"Cluster is disconnecting.\"));\n }\n if (err) {\n _this.emit(\"node error\", err, key);\n lastNodeError = err;\n tryNode(index + 1);\n }\n else {\n _this.emit(\"refresh\");\n wrapper();\n }\n });\n }\n tryNode(0);\n }\n /**\n * @ignore\n */\n sendCommand(command, stream, node) {\n if (this.status === \"wait\") {\n this.connect().catch(utils_1.noop);\n }\n if (this.status === \"end\") {\n command.reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return command.promise;\n }\n let to = this.options.scaleReads;\n if (to !== \"master\") {\n const isCommandReadOnly = command.isReadOnly ||\n ((0, commands_1.exists)(command.name) && (0, commands_1.hasFlag)(command.name, \"readonly\"));\n if (!isCommandReadOnly) {\n to = \"master\";\n }\n }\n let targetSlot = node ? node.slot : command.getSlot();\n const ttl = {};\n const _this = this;\n if (!node && !REJECT_OVERWRITTEN_COMMANDS.has(command)) {\n REJECT_OVERWRITTEN_COMMANDS.add(command);\n const reject = command.reject;\n command.reject = function (err) {\n const partialTry = tryConnection.bind(null, true);\n _this.handleError(err, ttl, {\n moved: function (slot, key) {\n debug(\"command %s is moved to %s\", command.name, key);\n targetSlot = Number(slot);\n if (_this.slots[slot]) {\n _this.slots[slot][0] = key;\n }\n else {\n _this.slots[slot] = [key];\n }\n _this._groupsBySlot[slot] =\n _this._groupsIds[_this.slots[slot].join(\";\")];\n _this.connectionPool.findOrCreate(_this.natMapper(key));\n tryConnection();\n debug(\"refreshing slot caches... (triggered by MOVED error)\");\n _this.refreshSlotsCache();\n },\n ask: function (slot, key) {\n debug(\"command %s is required to ask %s:%s\", command.name, key);\n const mapped = _this.natMapper(key);\n _this.connectionPool.findOrCreate(mapped);\n tryConnection(false, `${mapped.host}:${mapped.port}`);\n },\n tryagain: partialTry,\n clusterDown: partialTry,\n connectionClosed: partialTry,\n maxRedirections: function (redirectionError) {\n reject.call(command, redirectionError);\n },\n defaults: function () {\n reject.call(command, err);\n },\n });\n };\n }\n tryConnection();\n function tryConnection(random, asking) {\n if (_this.status === \"end\") {\n command.reject(new redis_errors_1.AbortError(\"Cluster is ended.\"));\n return;\n }\n let redis;\n if (_this.status === \"ready\" || command.name === \"cluster\") {\n if (node && node.redis) {\n redis = node.redis;\n }\n else if (Command_1.default.checkFlag(\"ENTER_SUBSCRIBER_MODE\", command.name) ||\n Command_1.default.checkFlag(\"EXIT_SUBSCRIBER_MODE\", command.name)) {\n if (_this.options.shardedSubscribers &&\n (command.name == \"ssubscribe\" || command.name == \"sunsubscribe\")) {\n const sub = _this.shardedSubscribers.getResponsibleSubscriber(targetSlot);\n if (!sub) {\n command.reject(new redis_errors_1.AbortError(`No sharded subscriber for slot: ${targetSlot}`));\n return;\n }\n let status = -1;\n if (command.name == \"ssubscribe\") {\n status = _this.shardedSubscribers.addChannels(command.getKeys());\n }\n if (command.name == \"sunsubscribe\") {\n status = _this.shardedSubscribers.removeChannels(command.getKeys());\n }\n if (status !== -1) {\n redis = sub.getInstance();\n }\n else {\n command.reject(new redis_errors_1.AbortError(\"Possible CROSSSLOT error: All channels must hash to the same slot\"));\n }\n }\n else {\n redis = _this.subscriber.getInstance();\n }\n if (!redis) {\n command.reject(new redis_errors_1.AbortError(\"No subscriber for the cluster\"));\n return;\n }\n }\n else {\n if (!random) {\n if (typeof targetSlot === \"number\" && _this.slots[targetSlot]) {\n const nodeKeys = _this.slots[targetSlot];\n if (typeof to === \"function\") {\n const nodes = nodeKeys.map(function (key) {\n return _this.connectionPool.getInstanceByKey(key);\n });\n redis = to(nodes, command);\n if (Array.isArray(redis)) {\n redis = (0, utils_1.sample)(redis);\n }\n if (!redis) {\n redis = nodes[0];\n }\n }\n else {\n let key;\n if (to === \"all\") {\n key = (0, utils_1.sample)(nodeKeys);\n }\n else if (to === \"slave\" && nodeKeys.length > 1) {\n key = (0, utils_1.sample)(nodeKeys, 1);\n }\n else {\n key = nodeKeys[0];\n }\n redis = _this.connectionPool.getInstanceByKey(key);\n }\n }\n if (asking) {\n redis = _this.connectionPool.getInstanceByKey(asking);\n redis.asking();\n }\n }\n if (!redis) {\n redis =\n (typeof to === \"function\"\n ? null\n : _this.connectionPool.getSampleInstance(to)) ||\n _this.connectionPool.getSampleInstance(\"all\");\n }\n }\n if (node && !node.redis) {\n node.redis = redis;\n }\n }\n if (redis) {\n redis.sendCommand(command, stream);\n }\n else if (_this.options.enableOfflineQueue) {\n _this.offlineQueue.push({\n command: command,\n stream: stream,\n node: node,\n });\n }\n else {\n command.reject(new Error(\"Cluster isn't ready and enableOfflineQueue options is false\"));\n }\n }\n return command.promise;\n }\n sscanStream(key, options) {\n return this.createScanStream(\"sscan\", { key, options });\n }\n sscanBufferStream(key, options) {\n return this.createScanStream(\"sscanBuffer\", { key, options });\n }\n hscanStream(key, options) {\n return this.createScanStream(\"hscan\", { key, options });\n }\n hscanBufferStream(key, options) {\n return this.createScanStream(\"hscanBuffer\", { key, options });\n }\n zscanStream(key, options) {\n return this.createScanStream(\"zscan\", { key, options });\n }\n zscanBufferStream(key, options) {\n return this.createScanStream(\"zscanBuffer\", { key, options });\n }\n /**\n * @ignore\n */\n handleError(error, ttl, handlers) {\n if (typeof ttl.value === \"undefined\") {\n ttl.value = this.options.maxRedirections;\n }\n else {\n ttl.value -= 1;\n }\n if (ttl.value <= 0) {\n handlers.maxRedirections(new Error(\"Too many Cluster redirections. Last error: \" + error));\n return;\n }\n const errv = error.message.split(\" \");\n if (errv[0] === \"MOVED\") {\n const timeout = this.options.retryDelayOnMoved;\n if (timeout && typeof timeout === \"number\") {\n this.delayQueue.push(\"moved\", handlers.moved.bind(null, errv[1], errv[2]), { timeout });\n }\n else {\n handlers.moved(errv[1], errv[2]);\n }\n }\n else if (errv[0] === \"ASK\") {\n handlers.ask(errv[1], errv[2]);\n }\n else if (errv[0] === \"TRYAGAIN\") {\n this.delayQueue.push(\"tryagain\", handlers.tryagain, {\n timeout: this.options.retryDelayOnTryAgain,\n });\n }\n else if (errv[0] === \"CLUSTERDOWN\" &&\n this.options.retryDelayOnClusterDown > 0) {\n this.delayQueue.push(\"clusterdown\", handlers.connectionClosed, {\n timeout: this.options.retryDelayOnClusterDown,\n callback: this.refreshSlotsCache.bind(this),\n });\n }\n else if (error.message === utils_1.CONNECTION_CLOSED_ERROR_MSG &&\n this.options.retryDelayOnFailover > 0 &&\n this.status === \"ready\") {\n this.delayQueue.push(\"failover\", handlers.connectionClosed, {\n timeout: this.options.retryDelayOnFailover,\n callback: this.refreshSlotsCache.bind(this),\n });\n }\n else {\n handlers.defaults();\n }\n }\n resetOfflineQueue() {\n this.offlineQueue = new Deque();\n }\n clearNodesRefreshInterval() {\n if (this.slotsTimer) {\n clearTimeout(this.slotsTimer);\n this.slotsTimer = null;\n }\n }\n resetNodesRefreshInterval() {\n if (this.slotsTimer || !this.options.slotsRefreshInterval) {\n return;\n }\n const nextRound = () => {\n this.slotsTimer = setTimeout(() => {\n debug('refreshing slot caches... (triggered by \"slotsRefreshInterval\" option)');\n this.refreshSlotsCache(() => {\n nextRound();\n });\n }, this.options.slotsRefreshInterval);\n };\n nextRound();\n }\n /**\n * Change cluster instance's status\n */\n setStatus(status) {\n debug(\"status: %s -> %s\", this.status || \"[empty]\", status);\n this.status = status;\n process.nextTick(() => {\n this.emit(status);\n });\n }\n /**\n * Called when closed to check whether a reconnection should be made\n */\n handleCloseEvent(reason) {\n var _a;\n if (reason) {\n debug(\"closed because %s\", reason);\n }\n let retryDelay;\n if (!this.manuallyClosing &&\n typeof this.options.clusterRetryStrategy === \"function\") {\n retryDelay = this.options.clusterRetryStrategy.call(this, ++this.retryAttempts, reason);\n }\n if (typeof retryDelay === \"number\") {\n this.setStatus(\"reconnecting\");\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n debug(\"Cluster is disconnected. Retrying after %dms\", retryDelay);\n this.connect().catch(function (err) {\n debug(\"Got error %s when reconnecting. Ignoring...\", err);\n });\n }, retryDelay);\n }\n else {\n if (this.options.shardedSubscribers) {\n (_a = this.subscriberGroupEmitter) === null || _a === void 0 ? void 0 : _a.removeAllListeners();\n }\n this.setStatus(\"end\");\n this.flushQueue(new Error(\"None of startup nodes is available\"));\n }\n }\n /**\n * Flush offline queue with error.\n */\n flushQueue(error) {\n let item;\n while ((item = this.offlineQueue.shift())) {\n item.command.reject(error);\n }\n }\n executeOfflineCommands() {\n if (this.offlineQueue.length) {\n debug(\"send %d commands in offline queue\", this.offlineQueue.length);\n const offlineQueue = this.offlineQueue;\n this.resetOfflineQueue();\n let item;\n while ((item = offlineQueue.shift())) {\n this.sendCommand(item.command, item.stream, item.node);\n }\n }\n }\n natMapper(nodeKey) {\n const key = typeof nodeKey === \"string\"\n ? nodeKey\n : `${nodeKey.host}:${nodeKey.port}`;\n let mapped = null;\n if (this.options.natMap && typeof this.options.natMap === \"function\") {\n mapped = this.options.natMap(key);\n }\n else if (this.options.natMap && typeof this.options.natMap === \"object\") {\n mapped = this.options.natMap[key];\n }\n if (mapped) {\n debug(\"NAT mapping %s -> %O\", key, mapped);\n return Object.assign({}, mapped);\n }\n return typeof nodeKey === \"string\"\n ? (0, util_1.nodeKeyToRedisOptions)(nodeKey)\n : nodeKey;\n }\n getInfoFromNode(redis, callback) {\n if (!redis) {\n return callback(new Error(\"Node is disconnected\"));\n }\n // Use a duplication of the connection to avoid\n // timeouts when the connection is in the blocking\n // mode (e.g. waiting for BLPOP).\n const duplicatedConnection = redis.duplicate({\n enableOfflineQueue: true,\n enableReadyCheck: false,\n retryStrategy: null,\n connectionName: (0, util_1.getConnectionName)(\"refresher\", this.options.redisOptions && this.options.redisOptions.connectionName),\n });\n // Ignore error events since we will handle\n // exceptions for the CLUSTER SLOTS command.\n duplicatedConnection.on(\"error\", utils_1.noop);\n duplicatedConnection.cluster(\"SLOTS\", (0, utils_1.timeout)((err, result) => {\n duplicatedConnection.disconnect();\n if (err) {\n debug(\"error encountered running CLUSTER.SLOTS: %s\", err);\n return callback(err);\n }\n if (this.status === \"disconnecting\" ||\n this.status === \"close\" ||\n this.status === \"end\") {\n debug(\"ignore CLUSTER.SLOTS results (count: %d) since cluster status is %s\", result.length, this.status);\n callback();\n return;\n }\n const nodes = [];\n debug(\"cluster slots result count: %d\", result.length);\n for (let i = 0; i < result.length; ++i) {\n const items = result[i];\n const slotRangeStart = items[0];\n const slotRangeEnd = items[1];\n const keys = [];\n for (let j = 2; j < items.length; j++) {\n if (!items[j][0]) {\n continue;\n }\n const node = this.natMapper({\n host: items[j][0],\n port: items[j][1],\n });\n node.readOnly = j !== 2;\n nodes.push(node);\n keys.push(node.host + \":\" + node.port);\n }\n debug(\"cluster slots result [%d]: slots %d~%d served by %s\", i, slotRangeStart, slotRangeEnd, keys);\n for (let slot = slotRangeStart; slot <= slotRangeEnd; slot++) {\n this.slots[slot] = keys;\n }\n }\n // Assign to each node keys a numeric value to make autopipeline comparison faster.\n this._groupsIds = Object.create(null);\n let j = 0;\n for (let i = 0; i < 16384; i++) {\n const target = (this.slots[i] || []).join(\";\");\n if (!target.length) {\n this._groupsBySlot[i] = undefined;\n continue;\n }\n if (!this._groupsIds[target]) {\n this._groupsIds[target] = ++j;\n }\n this._groupsBySlot[i] = this._groupsIds[target];\n }\n this.connectionPool.reset(nodes);\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers\n .reset(this.slots, this.connectionPool.getNodes(\"all\"))\n .catch((err) => {\n // TODO should we emit an error event here?\n debug(\"Error while starting subscribers: %s\", err);\n });\n }\n callback();\n }, this.options.slotsRefreshTimeout));\n }\n invokeReadyDelayedCallbacks(err) {\n for (const c of this._readyDelayedCallbacks) {\n process.nextTick(c, err);\n }\n this._readyDelayedCallbacks = [];\n }\n /**\n * Check whether Cluster is able to process commands\n */\n readyCheck(callback) {\n this.cluster(\"INFO\", (err, res) => {\n if (err) {\n return callback(err);\n }\n if (typeof res !== \"string\") {\n return callback();\n }\n let state;\n const lines = res.split(\"\\r\\n\");\n for (let i = 0; i < lines.length; ++i) {\n const parts = lines[i].split(\":\");\n if (parts[0] === \"cluster_state\") {\n state = parts[1];\n break;\n }\n }\n if (state === \"fail\") {\n debug(\"cluster state not ok (%s)\", state);\n callback(null, state);\n }\n else {\n callback();\n }\n });\n }\n resolveSrv(hostname) {\n return new Promise((resolve, reject) => {\n this.options.resolveSrv(hostname, (err, records) => {\n if (err) {\n return reject(err);\n }\n const self = this, groupedRecords = (0, util_1.groupSrvRecords)(records), sortedKeys = Object.keys(groupedRecords).sort((a, b) => parseInt(a) - parseInt(b));\n function tryFirstOne(err) {\n if (!sortedKeys.length) {\n return reject(err);\n }\n const key = sortedKeys[0], group = groupedRecords[key], record = (0, util_1.weightSrvRecords)(group);\n if (!group.records.length) {\n sortedKeys.shift();\n }\n self.dnsLookup(record.name).then((host) => resolve({\n host,\n port: record.port,\n }), tryFirstOne);\n }\n tryFirstOne();\n });\n });\n }\n dnsLookup(hostname) {\n return new Promise((resolve, reject) => {\n this.options.dnsLookup(hostname, (err, address) => {\n if (err) {\n debug(\"failed to resolve hostname %s to IP: %s\", hostname, err.message);\n reject(err);\n }\n else {\n debug(\"resolved hostname %s to IP %s\", hostname, address);\n resolve(address);\n }\n });\n });\n }\n /**\n * Normalize startup nodes, and resolving hostnames to IPs.\n *\n * This process happens every time when #connect() is called since\n * #startupNodes and DNS records may chanage.\n */\n async resolveStartupNodeHostnames() {\n if (!Array.isArray(this.startupNodes) || this.startupNodes.length === 0) {\n throw new Error(\"`startupNodes` should contain at least one node.\");\n }\n const startupNodes = (0, util_1.normalizeNodeOptions)(this.startupNodes);\n const hostnames = (0, util_1.getUniqueHostnamesFromOptions)(startupNodes);\n if (hostnames.length === 0) {\n return startupNodes;\n }\n const configs = await Promise.all(hostnames.map((this.options.useSRVRecords ? this.resolveSrv : this.dnsLookup).bind(this)));\n const hostnameToConfig = (0, utils_1.zipMap)(hostnames, configs);\n return startupNodes.map((node) => {\n const config = hostnameToConfig.get(node.host);\n if (!config) {\n return node;\n }\n if (this.options.useSRVRecords) {\n return Object.assign({}, node, config);\n }\n return Object.assign({}, node, { host: config });\n });\n }\n createScanStream(command, { key, options = {} }) {\n return new ScanStream_1.default({\n objectMode: true,\n key: key,\n redis: this,\n command: command,\n ...options,\n });\n }\n createShardedSubscriberGroup() {\n this.subscriberGroupEmitter = new events_1.EventEmitter();\n this.shardedSubscribers = new ClusterSubscriberGroup_1.default(this.subscriberGroupEmitter, this.options);\n // Error handler used only for sharded-subscriber-triggered slots cache refreshes.\n // Normal (non-subscriber) connections are created with lazyConnect: true and can\n // become zombied. For sharded subscribers, a ClusterAllFailedError means\n // we have lost all nodes from the subscriber perspective and must tear down.\n const refreshSlotsCacheCallback = (err) => {\n // Disconnect only when refreshing the slots cache fails with ClusterAllFailedError\n if (err instanceof ClusterAllFailedError_1.default) {\n this.disconnect(true);\n }\n };\n this.subscriberGroupEmitter.on(\"-node\", (redis, nodeKey) => {\n this.emit(\"-node\", redis, nodeKey);\n this.refreshSlotsCache(refreshSlotsCacheCallback);\n });\n this.subscriberGroupEmitter.on(\"subscriberConnectFailed\", ({ delay, error }) => {\n this.emit(\"error\", error);\n setTimeout(() => {\n this.refreshSlotsCache(refreshSlotsCacheCallback);\n }, delay);\n });\n this.subscriberGroupEmitter.on(\"moved\", () => {\n this.refreshSlotsCache(refreshSlotsCacheCallback);\n });\n this.subscriberGroupEmitter.on(\"-subscriber\", () => {\n this.emit(\"-subscriber\");\n });\n this.subscriberGroupEmitter.on(\"+subscriber\", () => {\n this.emit(\"+subscriber\");\n });\n this.subscriberGroupEmitter.on(\"nodeError\", (error, nodeKey) => {\n this.emit(\"nodeError\", error, nodeKey);\n });\n this.subscriberGroupEmitter.on(\"subscribersReady\", () => {\n this.emit(\"subscribersReady\");\n });\n for (const event of [\"smessage\", \"smessageBuffer\"]) {\n this.subscriberGroupEmitter.on(event, (arg1, arg2, arg3) => {\n this.emit(event, arg1, arg2, arg3);\n });\n }\n }\n}\n(0, applyMixin_1.default)(Cluster, events_1.EventEmitter);\n(0, transaction_1.addTransactionSupport)(Cluster.prototype);\nexports.default = Cluster;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst debug = (0, utils_1.Debug)(\"AbstractConnector\");\nclass AbstractConnector {\n constructor(disconnectTimeout) {\n this.connecting = false;\n this.disconnectTimeout = disconnectTimeout;\n }\n check(info) {\n return true;\n }\n disconnect() {\n this.connecting = false;\n if (this.stream) {\n const stream = this.stream; // Make sure callbacks refer to the same instance\n const timeout = setTimeout(() => {\n debug(\"stream %s:%s still open, destroying it\", stream.remoteAddress, stream.remotePort);\n stream.destroy();\n }, this.disconnectTimeout);\n stream.on(\"close\", () => clearTimeout(timeout));\n stream.end();\n }\n }\n}\nexports.default = AbstractConnector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst net_1 = require(\"net\");\nconst tls_1 = require(\"tls\");\nconst utils_1 = require(\"../utils\");\nconst AbstractConnector_1 = require(\"./AbstractConnector\");\nclass StandaloneConnector extends AbstractConnector_1.default {\n constructor(options) {\n super(options.disconnectTimeout);\n this.options = options;\n }\n connect(_) {\n const { options } = this;\n this.connecting = true;\n let connectionOptions;\n if (\"path\" in options && options.path) {\n connectionOptions = {\n path: options.path,\n };\n }\n else {\n connectionOptions = {};\n if (\"port\" in options && options.port != null) {\n connectionOptions.port = options.port;\n }\n if (\"host\" in options && options.host != null) {\n connectionOptions.host = options.host;\n }\n if (\"family\" in options && options.family != null) {\n connectionOptions.family = options.family;\n }\n }\n if (options.tls) {\n Object.assign(connectionOptions, options.tls);\n }\n // TODO:\n // We use native Promise here since other Promise\n // implementation may use different schedulers that\n // cause issue when the stream is resolved in the\n // next tick.\n // Should use the provided promise in the next major\n // version and do not connect before resolved.\n return new Promise((resolve, reject) => {\n process.nextTick(() => {\n if (!this.connecting) {\n reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return;\n }\n try {\n if (options.tls) {\n this.stream = (0, tls_1.connect)(connectionOptions);\n }\n else {\n this.stream = (0, net_1.createConnection)(connectionOptions);\n }\n }\n catch (err) {\n reject(err);\n return;\n }\n this.stream.once(\"error\", (err) => {\n this.firstError = err;\n });\n resolve(this.stream);\n });\n });\n }\n}\nexports.default = StandaloneConnector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isSentinelEql(a, b) {\n return ((a.host || \"127.0.0.1\") === (b.host || \"127.0.0.1\") &&\n (a.port || 26379) === (b.port || 26379));\n}\nclass SentinelIterator {\n constructor(sentinels) {\n this.cursor = 0;\n this.sentinels = sentinels.slice(0);\n }\n next() {\n const done = this.cursor >= this.sentinels.length;\n return { done, value: done ? undefined : this.sentinels[this.cursor++] };\n }\n reset(moveCurrentEndpointToFirst) {\n if (moveCurrentEndpointToFirst &&\n this.sentinels.length > 1 &&\n this.cursor !== 1) {\n this.sentinels.unshift(...this.sentinels.splice(this.cursor - 1));\n }\n this.cursor = 0;\n }\n add(sentinel) {\n for (let i = 0; i < this.sentinels.length; i++) {\n if (isSentinelEql(sentinel, this.sentinels[i])) {\n return false;\n }\n }\n this.sentinels.push(sentinel);\n return true;\n }\n toString() {\n return `${JSON.stringify(this.sentinels)} @${this.cursor}`;\n }\n}\nexports.default = SentinelIterator;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FailoverDetector = void 0;\nconst utils_1 = require(\"../../utils\");\nconst debug = (0, utils_1.Debug)(\"FailoverDetector\");\nconst CHANNEL_NAME = \"+switch-master\";\nclass FailoverDetector {\n // sentinels can't be used for regular commands after this\n constructor(connector, sentinels) {\n this.isDisconnected = false;\n this.connector = connector;\n this.sentinels = sentinels;\n }\n cleanup() {\n this.isDisconnected = true;\n for (const sentinel of this.sentinels) {\n sentinel.client.disconnect();\n }\n }\n async subscribe() {\n debug(\"Starting FailoverDetector\");\n const promises = [];\n for (const sentinel of this.sentinels) {\n const promise = sentinel.client.subscribe(CHANNEL_NAME).catch((err) => {\n debug(\"Failed to subscribe to failover messages on sentinel %s:%s (%s)\", sentinel.address.host || \"127.0.0.1\", sentinel.address.port || 26739, err.message);\n });\n promises.push(promise);\n sentinel.client.on(\"message\", (channel) => {\n if (!this.isDisconnected && channel === CHANNEL_NAME) {\n this.disconnect();\n }\n });\n }\n await Promise.all(promises);\n }\n disconnect() {\n // Avoid disconnecting more than once per failover.\n // A new FailoverDetector will be created after reconnecting.\n this.isDisconnected = true;\n debug(\"Failover detected, disconnecting\");\n // Will call this.cleanup()\n this.connector.disconnect();\n }\n}\nexports.FailoverDetector = FailoverDetector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SentinelIterator = void 0;\nconst net_1 = require(\"net\");\nconst utils_1 = require(\"../../utils\");\nconst tls_1 = require(\"tls\");\nconst SentinelIterator_1 = require(\"./SentinelIterator\");\nexports.SentinelIterator = SentinelIterator_1.default;\nconst AbstractConnector_1 = require(\"../AbstractConnector\");\nconst Redis_1 = require(\"../../Redis\");\nconst FailoverDetector_1 = require(\"./FailoverDetector\");\nconst debug = (0, utils_1.Debug)(\"SentinelConnector\");\nclass SentinelConnector extends AbstractConnector_1.default {\n constructor(options) {\n super(options.disconnectTimeout);\n this.options = options;\n this.emitter = null;\n this.failoverDetector = null;\n if (!this.options.sentinels.length) {\n throw new Error(\"Requires at least one sentinel to connect to.\");\n }\n if (!this.options.name) {\n throw new Error(\"Requires the name of master.\");\n }\n this.sentinelIterator = new SentinelIterator_1.default(this.options.sentinels);\n }\n check(info) {\n const roleMatches = !info.role || this.options.role === info.role;\n if (!roleMatches) {\n debug(\"role invalid, expected %s, but got %s\", this.options.role, info.role);\n // Start from the next item.\n // Note that `reset` will move the cursor to the previous element,\n // so we advance two steps here.\n this.sentinelIterator.next();\n this.sentinelIterator.next();\n this.sentinelIterator.reset(true);\n }\n return roleMatches;\n }\n disconnect() {\n super.disconnect();\n if (this.failoverDetector) {\n this.failoverDetector.cleanup();\n }\n }\n connect(eventEmitter) {\n this.connecting = true;\n this.retryAttempts = 0;\n let lastError;\n const connectToNext = async () => {\n const endpoint = this.sentinelIterator.next();\n if (endpoint.done) {\n this.sentinelIterator.reset(false);\n const retryDelay = typeof this.options.sentinelRetryStrategy === \"function\"\n ? this.options.sentinelRetryStrategy(++this.retryAttempts)\n : null;\n let errorMsg = typeof retryDelay !== \"number\"\n ? \"All sentinels are unreachable and retry is disabled.\"\n : `All sentinels are unreachable. Retrying from scratch after ${retryDelay}ms.`;\n if (lastError) {\n errorMsg += ` Last error: ${lastError.message}`;\n }\n debug(errorMsg);\n const error = new Error(errorMsg);\n if (typeof retryDelay === \"number\") {\n eventEmitter(\"error\", error);\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n return connectToNext();\n }\n else {\n throw error;\n }\n }\n let resolved = null;\n let err = null;\n try {\n resolved = await this.resolve(endpoint.value);\n }\n catch (error) {\n err = error;\n }\n if (!this.connecting) {\n throw new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG);\n }\n const endpointAddress = endpoint.value.host + \":\" + endpoint.value.port;\n if (resolved) {\n debug(\"resolved: %s:%s from sentinel %s\", resolved.host, resolved.port, endpointAddress);\n if (this.options.enableTLSForSentinelMode && this.options.tls) {\n Object.assign(resolved, this.options.tls);\n this.stream = (0, tls_1.connect)(resolved);\n this.stream.once(\"secureConnect\", this.initFailoverDetector.bind(this));\n }\n else {\n this.stream = (0, net_1.createConnection)(resolved);\n this.stream.once(\"connect\", this.initFailoverDetector.bind(this));\n }\n this.stream.once(\"error\", (err) => {\n this.firstError = err;\n });\n return this.stream;\n }\n else {\n const errorMsg = err\n ? \"failed to connect to sentinel \" +\n endpointAddress +\n \" because \" +\n err.message\n : \"connected to sentinel \" +\n endpointAddress +\n \" successfully, but got an invalid reply: \" +\n resolved;\n debug(errorMsg);\n eventEmitter(\"sentinelError\", new Error(errorMsg));\n if (err) {\n lastError = err;\n }\n return connectToNext();\n }\n };\n return connectToNext();\n }\n async updateSentinels(client) {\n if (!this.options.updateSentinels) {\n return;\n }\n const result = await client.sentinel(\"sentinels\", this.options.name);\n if (!Array.isArray(result)) {\n return;\n }\n result\n .map(utils_1.packObject)\n .forEach((sentinel) => {\n const flags = sentinel.flags ? sentinel.flags.split(\",\") : [];\n if (flags.indexOf(\"disconnected\") === -1 &&\n sentinel.ip &&\n sentinel.port) {\n const endpoint = this.sentinelNatResolve(addressResponseToAddress(sentinel));\n if (this.sentinelIterator.add(endpoint)) {\n debug(\"adding sentinel %s:%s\", endpoint.host, endpoint.port);\n }\n }\n });\n debug(\"Updated internal sentinels: %s\", this.sentinelIterator);\n }\n async resolveMaster(client) {\n const result = await client.sentinel(\"get-master-addr-by-name\", this.options.name);\n await this.updateSentinels(client);\n return this.sentinelNatResolve(Array.isArray(result)\n ? { host: result[0], port: Number(result[1]) }\n : null);\n }\n async resolveSlave(client) {\n const result = await client.sentinel(\"slaves\", this.options.name);\n if (!Array.isArray(result)) {\n return null;\n }\n const availableSlaves = result\n .map(utils_1.packObject)\n .filter((slave) => slave.flags && !slave.flags.match(/(disconnected|s_down|o_down)/));\n return this.sentinelNatResolve(selectPreferredSentinel(availableSlaves, this.options.preferredSlaves));\n }\n sentinelNatResolve(item) {\n if (!item || !this.options.natMap)\n return item;\n const key = `${item.host}:${item.port}`;\n let result = item;\n if (typeof this.options.natMap === \"function\") {\n result = this.options.natMap(key) || item;\n }\n else if (typeof this.options.natMap === \"object\") {\n result = this.options.natMap[key] || item;\n }\n return result;\n }\n connectToSentinel(endpoint, options) {\n const redis = new Redis_1.default({\n port: endpoint.port || 26379,\n host: endpoint.host,\n username: this.options.sentinelUsername || null,\n password: this.options.sentinelPassword || null,\n family: endpoint.family ||\n // @ts-expect-error\n (\"path\" in this.options && this.options.path\n ? undefined\n : // @ts-expect-error\n this.options.family),\n tls: this.options.sentinelTLS,\n retryStrategy: null,\n enableReadyCheck: false,\n connectTimeout: this.options.connectTimeout,\n commandTimeout: this.options.sentinelCommandTimeout,\n ...options,\n });\n // @ts-expect-error\n return redis;\n }\n async resolve(endpoint) {\n const client = this.connectToSentinel(endpoint);\n // ignore the errors since resolve* methods will handle them\n client.on(\"error\", noop);\n try {\n if (this.options.role === \"slave\") {\n return await this.resolveSlave(client);\n }\n else {\n return await this.resolveMaster(client);\n }\n }\n finally {\n client.disconnect();\n }\n }\n async initFailoverDetector() {\n var _a;\n if (!this.options.failoverDetector) {\n return;\n }\n // Move the current sentinel to the first position\n this.sentinelIterator.reset(true);\n const sentinels = [];\n // In case of a large amount of sentinels, limit the number of concurrent connections\n while (sentinels.length < this.options.sentinelMaxConnections) {\n const { done, value } = this.sentinelIterator.next();\n if (done) {\n break;\n }\n const client = this.connectToSentinel(value, {\n lazyConnect: true,\n retryStrategy: this.options.sentinelReconnectStrategy,\n });\n client.on(\"reconnecting\", () => {\n var _a;\n // Tests listen to this event\n (_a = this.emitter) === null || _a === void 0 ? void 0 : _a.emit(\"sentinelReconnecting\");\n });\n sentinels.push({ address: value, client });\n }\n this.sentinelIterator.reset(false);\n if (this.failoverDetector) {\n // Clean up previous detector\n this.failoverDetector.cleanup();\n }\n this.failoverDetector = new FailoverDetector_1.FailoverDetector(this, sentinels);\n await this.failoverDetector.subscribe();\n // Tests listen to this event\n (_a = this.emitter) === null || _a === void 0 ? void 0 : _a.emit(\"failoverSubscribed\");\n }\n}\nexports.default = SentinelConnector;\nfunction selectPreferredSentinel(availableSlaves, preferredSlaves) {\n if (availableSlaves.length === 0) {\n return null;\n }\n let selectedSlave;\n if (typeof preferredSlaves === \"function\") {\n selectedSlave = preferredSlaves(availableSlaves);\n }\n else if (preferredSlaves !== null && typeof preferredSlaves === \"object\") {\n const preferredSlavesArray = Array.isArray(preferredSlaves)\n ? preferredSlaves\n : [preferredSlaves];\n // sort by priority\n preferredSlavesArray.sort((a, b) => {\n // default the priority to 1\n if (!a.prio) {\n a.prio = 1;\n }\n if (!b.prio) {\n b.prio = 1;\n }\n // lowest priority first\n if (a.prio < b.prio) {\n return -1;\n }\n if (a.prio > b.prio) {\n return 1;\n }\n return 0;\n });\n // loop over preferred slaves and return the first match\n for (let p = 0; p < preferredSlavesArray.length; p++) {\n for (let a = 0; a < availableSlaves.length; a++) {\n const slave = availableSlaves[a];\n if (slave.ip === preferredSlavesArray[p].ip) {\n if (slave.port === preferredSlavesArray[p].port) {\n selectedSlave = slave;\n break;\n }\n }\n }\n if (selectedSlave) {\n break;\n }\n }\n }\n // if none of the preferred slaves are available, a random available slave is returned\n if (!selectedSlave) {\n selectedSlave = (0, utils_1.sample)(availableSlaves);\n }\n return addressResponseToAddress(selectedSlave);\n}\nfunction addressResponseToAddress(input) {\n return { host: input.ip, port: Number(input.port) };\n}\nfunction noop() { }\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SentinelConnector = exports.StandaloneConnector = void 0;\nconst StandaloneConnector_1 = require(\"./StandaloneConnector\");\nexports.StandaloneConnector = StandaloneConnector_1.default;\nconst SentinelConnector_1 = require(\"./SentinelConnector\");\nexports.SentinelConnector = SentinelConnector_1.default;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst redis_errors_1 = require(\"redis-errors\");\nclass MaxRetriesPerRequestError extends redis_errors_1.AbortError {\n constructor(maxRetriesPerRequest) {\n const message = `Reached the max retries per request limit (which is ${maxRetriesPerRequest}). Refer to \"maxRetriesPerRequest\" option for details.`;\n super(message);\n Error.captureStackTrace(this, this.constructor);\n }\n get name() {\n return this.constructor.name;\n }\n}\nexports.default = MaxRetriesPerRequestError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaxRetriesPerRequestError = void 0;\nconst MaxRetriesPerRequestError_1 = require(\"./MaxRetriesPerRequestError\");\nexports.MaxRetriesPerRequestError = MaxRetriesPerRequestError_1.default;\n","'use strict'\n\nconst Buffer = require('buffer').Buffer\nconst StringDecoder = require('string_decoder').StringDecoder\nconst decoder = new StringDecoder()\nconst errors = require('redis-errors')\nconst ReplyError = errors.ReplyError\nconst ParserError = errors.ParserError\nvar bufferPool = Buffer.allocUnsafe(32 * 1024)\nvar bufferOffset = 0\nvar interval = null\nvar counter = 0\nvar notDecreased = 0\n\n/**\n * Used for integer numbers only\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number}\n */\nfunction parseSimpleNumbers (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n var sign = 1\n\n if (parser.buffer[offset] === 45) {\n sign = -1\n offset++\n }\n\n while (offset < length) {\n const c1 = parser.buffer[offset++]\n if (c1 === 13) { // \\r\\n\n parser.offset = offset + 1\n return sign * number\n }\n number = (number * 10) + (c1 - 48)\n }\n}\n\n/**\n * Used for integer numbers in case of the returnNumbers option\n *\n * Reading the string as parts of n SMI is more efficient than\n * using a string directly.\n *\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|string}\n */\nfunction parseStringNumbers (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n var res = ''\n\n if (parser.buffer[offset] === 45) {\n res += '-'\n offset++\n }\n\n while (offset < length) {\n var c1 = parser.buffer[offset++]\n if (c1 === 13) { // \\r\\n\n parser.offset = offset + 1\n if (number !== 0) {\n res += number\n }\n return res\n } else if (number > 429496728) {\n res += (number * 10) + (c1 - 48)\n number = 0\n } else if (c1 === 48 && number === 0) {\n res += 0\n } else {\n number = (number * 10) + (c1 - 48)\n }\n }\n}\n\n/**\n * Parse a '+' redis simple string response but forward the offsets\n * onto convertBufferRange to generate a string.\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|string|Buffer}\n */\nfunction parseSimpleString (parser) {\n const start = parser.offset\n const buffer = parser.buffer\n const length = buffer.length - 1\n var offset = start\n\n while (offset < length) {\n if (buffer[offset++] === 13) { // \\r\\n\n parser.offset = offset + 1\n if (parser.optionReturnBuffers === true) {\n return parser.buffer.slice(start, offset - 1)\n }\n return parser.buffer.toString('utf8', start, offset - 1)\n }\n }\n}\n\n/**\n * Returns the read length\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number}\n */\nfunction parseLength (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n\n while (offset < length) {\n const c1 = parser.buffer[offset++]\n if (c1 === 13) {\n parser.offset = offset + 1\n return number\n }\n number = (number * 10) + (c1 - 48)\n }\n}\n\n/**\n * Parse a ':' redis integer response\n *\n * If stringNumbers is activated the parser always returns numbers as string\n * This is important for big numbers (number > Math.pow(2, 53)) as js numbers\n * are 64bit floating point numbers with reduced precision\n *\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number|string}\n */\nfunction parseInteger (parser) {\n if (parser.optionStringNumbers === true) {\n return parseStringNumbers(parser)\n }\n return parseSimpleNumbers(parser)\n}\n\n/**\n * Parse a '$' redis bulk string response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|null|string}\n */\nfunction parseBulkString (parser) {\n const length = parseLength(parser)\n if (length === undefined) {\n return\n }\n if (length < 0) {\n return null\n }\n const offset = parser.offset + length\n if (offset + 2 > parser.buffer.length) {\n parser.bigStrSize = offset + 2\n parser.totalChunkSize = parser.buffer.length\n parser.bufferCache.push(parser.buffer)\n return\n }\n const start = parser.offset\n parser.offset = offset + 2\n if (parser.optionReturnBuffers === true) {\n return parser.buffer.slice(start, offset)\n }\n return parser.buffer.toString('utf8', start, offset)\n}\n\n/**\n * Parse a '-' redis error response\n * @param {JavascriptRedisParser} parser\n * @returns {ReplyError}\n */\nfunction parseError (parser) {\n var string = parseSimpleString(parser)\n if (string !== undefined) {\n if (parser.optionReturnBuffers === true) {\n string = string.toString()\n }\n return new ReplyError(string)\n }\n}\n\n/**\n * Parsing error handler, resets parser buffer\n * @param {JavascriptRedisParser} parser\n * @param {number} type\n * @returns {undefined}\n */\nfunction handleError (parser, type) {\n const err = new ParserError(\n 'Protocol error, got ' + JSON.stringify(String.fromCharCode(type)) + ' as reply type byte',\n JSON.stringify(parser.buffer),\n parser.offset\n )\n parser.buffer = null\n parser.returnFatalError(err)\n}\n\n/**\n * Parse a '*' redis array response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|null|any[]}\n */\nfunction parseArray (parser) {\n const length = parseLength(parser)\n if (length === undefined) {\n return\n }\n if (length < 0) {\n return null\n }\n const responses = new Array(length)\n return parseArrayElements(parser, responses, 0)\n}\n\n/**\n * Push a partly parsed array to the stack\n *\n * @param {JavascriptRedisParser} parser\n * @param {any[]} array\n * @param {number} pos\n * @returns {undefined}\n */\nfunction pushArrayCache (parser, array, pos) {\n parser.arrayCache.push(array)\n parser.arrayPos.push(pos)\n}\n\n/**\n * Parse chunked redis array response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|any[]}\n */\nfunction parseArrayChunks (parser) {\n const tmp = parser.arrayCache.pop()\n var pos = parser.arrayPos.pop()\n if (parser.arrayCache.length) {\n const res = parseArrayChunks(parser)\n if (res === undefined) {\n pushArrayCache(parser, tmp, pos)\n return\n }\n tmp[pos++] = res\n }\n return parseArrayElements(parser, tmp, pos)\n}\n\n/**\n * Parse redis array response elements\n * @param {JavascriptRedisParser} parser\n * @param {Array} responses\n * @param {number} i\n * @returns {undefined|null|any[]}\n */\nfunction parseArrayElements (parser, responses, i) {\n const bufferLength = parser.buffer.length\n while (i < responses.length) {\n const offset = parser.offset\n if (parser.offset >= bufferLength) {\n pushArrayCache(parser, responses, i)\n return\n }\n const response = parseType(parser, parser.buffer[parser.offset++])\n if (response === undefined) {\n if (!(parser.arrayCache.length || parser.bufferCache.length)) {\n parser.offset = offset\n }\n pushArrayCache(parser, responses, i)\n return\n }\n responses[i] = response\n i++\n }\n\n return responses\n}\n\n/**\n * Called the appropriate parser for the specified type.\n *\n * 36: $\n * 43: +\n * 42: *\n * 58: :\n * 45: -\n *\n * @param {JavascriptRedisParser} parser\n * @param {number} type\n * @returns {*}\n */\nfunction parseType (parser, type) {\n switch (type) {\n case 36:\n return parseBulkString(parser)\n case 43:\n return parseSimpleString(parser)\n case 42:\n return parseArray(parser)\n case 58:\n return parseInteger(parser)\n case 45:\n return parseError(parser)\n default:\n return handleError(parser, type)\n }\n}\n\n/**\n * Decrease the bufferPool size over time\n *\n * Balance between increasing and decreasing the bufferPool.\n * Decrease the bufferPool by 10% by removing the first 10% of the current pool.\n * @returns {undefined}\n */\nfunction decreaseBufferPool () {\n if (bufferPool.length > 50 * 1024) {\n if (counter === 1 || notDecreased > counter * 2) {\n const minSliceLen = Math.floor(bufferPool.length / 10)\n const sliceLength = minSliceLen < bufferOffset\n ? bufferOffset\n : minSliceLen\n bufferOffset = 0\n bufferPool = bufferPool.slice(sliceLength, bufferPool.length)\n } else {\n notDecreased++\n counter--\n }\n } else {\n clearInterval(interval)\n counter = 0\n notDecreased = 0\n interval = null\n }\n}\n\n/**\n * Check if the requested size fits in the current bufferPool.\n * If it does not, reset and increase the bufferPool accordingly.\n *\n * @param {number} length\n * @returns {undefined}\n */\nfunction resizeBuffer (length) {\n if (bufferPool.length < length + bufferOffset) {\n const multiplier = length > 1024 * 1024 * 75 ? 2 : 3\n if (bufferOffset > 1024 * 1024 * 111) {\n bufferOffset = 1024 * 1024 * 50\n }\n bufferPool = Buffer.allocUnsafe(length * multiplier + bufferOffset)\n bufferOffset = 0\n counter++\n if (interval === null) {\n interval = setInterval(decreaseBufferPool, 50)\n }\n }\n}\n\n/**\n * Concat a bulk string containing multiple chunks\n *\n * Notes:\n * 1) The first chunk might contain the whole bulk string including the \\r\n * 2) We are only safe to fully add up elements that are neither the first nor any of the last two elements\n *\n * @param {JavascriptRedisParser} parser\n * @returns {String}\n */\nfunction concatBulkString (parser) {\n const list = parser.bufferCache\n const oldOffset = parser.offset\n var chunks = list.length\n var offset = parser.bigStrSize - parser.totalChunkSize\n parser.offset = offset\n if (offset <= 2) {\n if (chunks === 2) {\n return list[0].toString('utf8', oldOffset, list[0].length + offset - 2)\n }\n chunks--\n offset = list[list.length - 2].length + offset\n }\n var res = decoder.write(list[0].slice(oldOffset))\n for (var i = 1; i < chunks - 1; i++) {\n res += decoder.write(list[i])\n }\n res += decoder.end(list[i].slice(0, offset - 2))\n return res\n}\n\n/**\n * Concat the collected chunks from parser.bufferCache.\n *\n * Increases the bufferPool size beforehand if necessary.\n *\n * @param {JavascriptRedisParser} parser\n * @returns {Buffer}\n */\nfunction concatBulkBuffer (parser) {\n const list = parser.bufferCache\n const oldOffset = parser.offset\n const length = parser.bigStrSize - oldOffset - 2\n var chunks = list.length\n var offset = parser.bigStrSize - parser.totalChunkSize\n parser.offset = offset\n if (offset <= 2) {\n if (chunks === 2) {\n return list[0].slice(oldOffset, list[0].length + offset - 2)\n }\n chunks--\n offset = list[list.length - 2].length + offset\n }\n resizeBuffer(length)\n const start = bufferOffset\n list[0].copy(bufferPool, start, oldOffset, list[0].length)\n bufferOffset += list[0].length - oldOffset\n for (var i = 1; i < chunks - 1; i++) {\n list[i].copy(bufferPool, bufferOffset)\n bufferOffset += list[i].length\n }\n list[i].copy(bufferPool, bufferOffset, 0, offset - 2)\n bufferOffset += offset - 2\n return bufferPool.slice(start, bufferOffset)\n}\n\nclass JavascriptRedisParser {\n /**\n * Javascript Redis Parser constructor\n * @param {{returnError: Function, returnReply: Function, returnFatalError?: Function, returnBuffers: boolean, stringNumbers: boolean }} options\n * @constructor\n */\n constructor (options) {\n if (!options) {\n throw new TypeError('Options are mandatory.')\n }\n if (typeof options.returnError !== 'function' || typeof options.returnReply !== 'function') {\n throw new TypeError('The returnReply and returnError options have to be functions.')\n }\n this.setReturnBuffers(!!options.returnBuffers)\n this.setStringNumbers(!!options.stringNumbers)\n this.returnError = options.returnError\n this.returnFatalError = options.returnFatalError || options.returnError\n this.returnReply = options.returnReply\n this.reset()\n }\n\n /**\n * Reset the parser values to the initial state\n *\n * @returns {undefined}\n */\n reset () {\n this.offset = 0\n this.buffer = null\n this.bigStrSize = 0\n this.totalChunkSize = 0\n this.bufferCache = []\n this.arrayCache = []\n this.arrayPos = []\n }\n\n /**\n * Set the returnBuffers option\n *\n * @param {boolean} returnBuffers\n * @returns {undefined}\n */\n setReturnBuffers (returnBuffers) {\n if (typeof returnBuffers !== 'boolean') {\n throw new TypeError('The returnBuffers argument has to be a boolean')\n }\n this.optionReturnBuffers = returnBuffers\n }\n\n /**\n * Set the stringNumbers option\n *\n * @param {boolean} stringNumbers\n * @returns {undefined}\n */\n setStringNumbers (stringNumbers) {\n if (typeof stringNumbers !== 'boolean') {\n throw new TypeError('The stringNumbers argument has to be a boolean')\n }\n this.optionStringNumbers = stringNumbers\n }\n\n /**\n * Parse the redis buffer\n * @param {Buffer} buffer\n * @returns {undefined}\n */\n execute (buffer) {\n if (this.buffer === null) {\n this.buffer = buffer\n this.offset = 0\n } else if (this.bigStrSize === 0) {\n const oldLength = this.buffer.length\n const remainingLength = oldLength - this.offset\n const newBuffer = Buffer.allocUnsafe(remainingLength + buffer.length)\n this.buffer.copy(newBuffer, 0, this.offset, oldLength)\n buffer.copy(newBuffer, remainingLength, 0, buffer.length)\n this.buffer = newBuffer\n this.offset = 0\n if (this.arrayCache.length) {\n const arr = parseArrayChunks(this)\n if (arr === undefined) {\n return\n }\n this.returnReply(arr)\n }\n } else if (this.totalChunkSize + buffer.length >= this.bigStrSize) {\n this.bufferCache.push(buffer)\n var tmp = this.optionReturnBuffers ? concatBulkBuffer(this) : concatBulkString(this)\n this.bigStrSize = 0\n this.bufferCache = []\n this.buffer = buffer\n if (this.arrayCache.length) {\n this.arrayCache[0][this.arrayPos[0]++] = tmp\n tmp = parseArrayChunks(this)\n if (tmp === undefined) {\n return\n }\n }\n this.returnReply(tmp)\n } else {\n this.bufferCache.push(buffer)\n this.totalChunkSize += buffer.length\n return\n }\n\n while (this.offset < this.buffer.length) {\n const offset = this.offset\n const type = this.buffer[this.offset++]\n const response = parseType(this, type)\n if (response === undefined) {\n if (!(this.arrayCache.length || this.bufferCache.length)) {\n this.offset = offset\n }\n return\n }\n\n if (type === 45) {\n this.returnError(response)\n } else {\n this.returnReply(response)\n }\n }\n\n this.buffer = null\n }\n}\n\nmodule.exports = JavascriptRedisParser\n","'use strict'\n\nmodule.exports = require('./lib/parser')\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Tiny class to simplify dealing with subscription set\n */\nclass SubscriptionSet {\n constructor() {\n this.set = {\n subscribe: {},\n psubscribe: {},\n ssubscribe: {},\n };\n }\n add(set, channel) {\n this.set[mapSet(set)][channel] = true;\n }\n del(set, channel) {\n delete this.set[mapSet(set)][channel];\n }\n channels(set) {\n return Object.keys(this.set[mapSet(set)]);\n }\n isEmpty() {\n return (this.channels(\"subscribe\").length === 0 &&\n this.channels(\"psubscribe\").length === 0 &&\n this.channels(\"ssubscribe\").length === 0);\n }\n}\nexports.default = SubscriptionSet;\nfunction mapSet(set) {\n if (set === \"unsubscribe\") {\n return \"subscribe\";\n }\n if (set === \"punsubscribe\") {\n return \"psubscribe\";\n }\n if (set === \"sunsubscribe\") {\n return \"ssubscribe\";\n }\n return set;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Command_1 = require(\"./Command\");\nconst utils_1 = require(\"./utils\");\nconst RedisParser = require(\"redis-parser\");\nconst SubscriptionSet_1 = require(\"./SubscriptionSet\");\nconst debug = (0, utils_1.Debug)(\"dataHandler\");\nclass DataHandler {\n constructor(redis, parserOptions) {\n this.redis = redis;\n const parser = new RedisParser({\n stringNumbers: parserOptions.stringNumbers,\n returnBuffers: true,\n returnError: (err) => {\n this.returnError(err);\n },\n returnFatalError: (err) => {\n this.returnFatalError(err);\n },\n returnReply: (reply) => {\n this.returnReply(reply);\n },\n });\n // prependListener ensures the parser receives and processes data before socket timeout checks are performed\n redis.stream.prependListener(\"data\", (data) => {\n parser.execute(data);\n });\n // prependListener() doesn't enable flowing mode automatically - we need to resume the stream manually\n redis.stream.resume();\n }\n returnFatalError(err) {\n err.message += \". Please report this.\";\n this.redis.recoverFromFatalError(err, err, { offlineQueue: false });\n }\n returnError(err) {\n const item = this.shiftCommand(err);\n if (!item) {\n return;\n }\n err.command = {\n name: item.command.name,\n args: item.command.args,\n };\n if (item.command.name == \"ssubscribe\" && err.message.includes(\"MOVED\")) {\n this.redis.emit(\"moved\");\n return;\n }\n this.redis.handleReconnection(err, item);\n }\n returnReply(reply) {\n if (this.handleMonitorReply(reply)) {\n return;\n }\n if (this.handleSubscriberReply(reply)) {\n return;\n }\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (Command_1.default.checkFlag(\"ENTER_SUBSCRIBER_MODE\", item.command.name)) {\n this.redis.condition.subscriber = new SubscriptionSet_1.default();\n this.redis.condition.subscriber.add(item.command.name, reply[1].toString());\n if (!fillSubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n }\n else if (Command_1.default.checkFlag(\"EXIT_SUBSCRIBER_MODE\", item.command.name)) {\n if (!fillUnsubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n }\n else {\n item.command.resolve(reply);\n }\n }\n handleSubscriberReply(reply) {\n if (!this.redis.condition.subscriber) {\n return false;\n }\n const replyType = Array.isArray(reply) ? reply[0].toString() : null;\n debug('receive reply \"%s\" in subscriber mode', replyType);\n switch (replyType) {\n case \"message\":\n if (this.redis.listeners(\"message\").length > 0) {\n // Check if there're listeners to avoid unnecessary `toString()`.\n this.redis.emit(\"message\", reply[1].toString(), reply[2] ? reply[2].toString() : \"\");\n }\n this.redis.emit(\"messageBuffer\", reply[1], reply[2]);\n break;\n case \"pmessage\": {\n const pattern = reply[1].toString();\n if (this.redis.listeners(\"pmessage\").length > 0) {\n this.redis.emit(\"pmessage\", pattern, reply[2].toString(), reply[3].toString());\n }\n this.redis.emit(\"pmessageBuffer\", pattern, reply[2], reply[3]);\n break;\n }\n case \"smessage\": {\n if (this.redis.listeners(\"smessage\").length > 0) {\n this.redis.emit(\"smessage\", reply[1].toString(), reply[2] ? reply[2].toString() : \"\");\n }\n this.redis.emit(\"smessageBuffer\", reply[1], reply[2]);\n break;\n }\n case \"ssubscribe\":\n case \"subscribe\":\n case \"psubscribe\": {\n const channel = reply[1].toString();\n this.redis.condition.subscriber.add(replyType, channel);\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (!fillSubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n break;\n }\n case \"sunsubscribe\":\n case \"unsubscribe\":\n case \"punsubscribe\": {\n const channel = reply[1] ? reply[1].toString() : null;\n if (channel) {\n this.redis.condition.subscriber.del(replyType, channel);\n }\n const count = reply[2];\n if (Number(count) === 0) {\n this.redis.condition.subscriber = false;\n }\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (!fillUnsubCommand(item.command, count)) {\n this.redis.commandQueue.unshift(item);\n }\n break;\n }\n default: {\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n item.command.resolve(reply);\n }\n }\n return true;\n }\n handleMonitorReply(reply) {\n if (this.redis.status !== \"monitoring\") {\n return false;\n }\n const replyStr = reply.toString();\n if (replyStr === \"OK\") {\n // Valid commands in the monitoring mode are AUTH and MONITOR,\n // both of which always reply with 'OK'.\n // So if we got an 'OK', we can make certain that\n // the reply is made to AUTH & MONITOR.\n return false;\n }\n // Since commands sent in the monitoring mode will trigger an exception,\n // any replies we received in the monitoring mode should consider to be\n // realtime monitor data instead of result of commands.\n const len = replyStr.indexOf(\" \");\n const timestamp = replyStr.slice(0, len);\n const argIndex = replyStr.indexOf('\"');\n const args = replyStr\n .slice(argIndex + 1, -1)\n .split('\" \"')\n .map((elem) => elem.replace(/\\\\\"/g, '\"'));\n const dbAndSource = replyStr.slice(len + 2, argIndex - 2).split(\" \");\n this.redis.emit(\"monitor\", timestamp, args, dbAndSource[1], dbAndSource[0]);\n return true;\n }\n shiftCommand(reply) {\n const item = this.redis.commandQueue.shift();\n if (!item) {\n const message = \"Command queue state error. If you can reproduce this, please report it.\";\n const error = new Error(message +\n (reply instanceof Error\n ? ` Last error: ${reply.message}`\n : ` Last reply: ${reply.toString()}`));\n this.redis.emit(\"error\", error);\n return null;\n }\n return item;\n }\n}\nexports.default = DataHandler;\nconst remainingRepliesMap = new WeakMap();\nfunction fillSubCommand(command, count) {\n let remainingReplies = remainingRepliesMap.has(command)\n ? remainingRepliesMap.get(command)\n : command.args.length;\n remainingReplies -= 1;\n if (remainingReplies <= 0) {\n command.resolve(count);\n remainingRepliesMap.delete(command);\n return true;\n }\n remainingRepliesMap.set(command, remainingReplies);\n return false;\n}\nfunction fillUnsubCommand(command, count) {\n let remainingReplies = remainingRepliesMap.has(command)\n ? remainingRepliesMap.get(command)\n : command.args.length;\n if (remainingReplies === 0) {\n if (Number(count) === 0) {\n remainingRepliesMap.delete(command);\n command.resolve(count);\n return true;\n }\n return false;\n }\n remainingReplies -= 1;\n if (remainingReplies <= 0) {\n command.resolve(count);\n return true;\n }\n remainingRepliesMap.set(command, remainingReplies);\n return false;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readyHandler = exports.errorHandler = exports.closeHandler = exports.connectHandler = void 0;\nconst redis_errors_1 = require(\"redis-errors\");\nconst Command_1 = require(\"../Command\");\nconst errors_1 = require(\"../errors\");\nconst utils_1 = require(\"../utils\");\nconst DataHandler_1 = require(\"../DataHandler\");\nconst debug = (0, utils_1.Debug)(\"connection\");\nfunction connectHandler(self) {\n return function () {\n var _a;\n self.setStatus(\"connect\");\n self.resetCommandQueue();\n // AUTH command should be processed before any other commands\n let flushed = false;\n const { connectionEpoch } = self;\n if (self.condition.auth) {\n self.auth(self.condition.auth, function (err) {\n if (connectionEpoch !== self.connectionEpoch) {\n return;\n }\n if (err) {\n if (err.message.indexOf(\"no password is set\") !== -1) {\n console.warn(\"[WARN] Redis server does not require a password, but a password was supplied.\");\n }\n else if (err.message.indexOf(\"without any password configured for the default user\") !== -1) {\n console.warn(\"[WARN] This Redis server's `default` user does not require a password, but a password was supplied\");\n }\n else if (err.message.indexOf(\"wrong number of arguments for 'auth' command\") !== -1) {\n console.warn(`[ERROR] The server returned \"wrong number of arguments for 'auth' command\". You are probably passing both username and password to Redis version 5 or below. You should only pass the 'password' option for Redis version 5 and under.`);\n }\n else {\n flushed = true;\n self.recoverFromFatalError(err, err);\n }\n }\n });\n }\n if (self.condition.select) {\n self.select(self.condition.select).catch((err) => {\n // If the node is in cluster mode, select is disallowed.\n // In this case, reconnect won't help.\n self.silentEmit(\"error\", err);\n });\n }\n /*\n No need to keep the reference of DataHandler here\n because we don't need to do the cleanup.\n `Stream#end()` will remove all listeners for us.\n */\n new DataHandler_1.default(self, {\n stringNumbers: self.options.stringNumbers,\n });\n const clientCommandPromises = [];\n if (self.options.connectionName) {\n debug(\"set the connection name [%s]\", self.options.connectionName);\n clientCommandPromises.push(self.client(\"setname\", self.options.connectionName).catch(utils_1.noop));\n }\n if (!self.options.disableClientInfo) {\n debug(\"set the client info\");\n clientCommandPromises.push((0, utils_1.getPackageMeta)()\n .then((packageMeta) => {\n return self\n .client(\"SETINFO\", \"LIB-VER\", packageMeta.version)\n .catch(utils_1.noop);\n })\n .catch(utils_1.noop));\n clientCommandPromises.push(self\n .client(\"SETINFO\", \"LIB-NAME\", ((_a = self.options) === null || _a === void 0 ? void 0 : _a.clientInfoTag)\n ? `ioredis(${self.options.clientInfoTag})`\n : \"ioredis\")\n .catch(utils_1.noop));\n }\n Promise.all(clientCommandPromises)\n .catch(utils_1.noop)\n .finally(() => {\n if (!self.options.enableReadyCheck) {\n exports.readyHandler(self)();\n }\n if (self.options.enableReadyCheck) {\n self._readyCheck(function (err, info) {\n if (connectionEpoch !== self.connectionEpoch) {\n return;\n }\n if (err) {\n if (!flushed) {\n self.recoverFromFatalError(new Error(\"Ready check failed: \" + err.message), err);\n }\n }\n else {\n if (self.connector.check(info)) {\n exports.readyHandler(self)();\n }\n else {\n self.disconnect(true);\n }\n }\n });\n }\n });\n };\n}\nexports.connectHandler = connectHandler;\nfunction abortError(command) {\n const err = new redis_errors_1.AbortError(\"Command aborted due to connection close\");\n err.command = {\n name: command.name,\n args: command.args,\n };\n return err;\n}\n// If a contiguous set of pipeline commands starts from index zero then they\n// can be safely reattempted. If however we have a chain of pipelined commands\n// starting at index 1 or more it means we received a partial response before\n// the connection close and those pipelined commands must be aborted. For\n// example, if the queue looks like this: [2, 3, 4, 0, 1, 2] then after\n// aborting and purging we'll have a queue that looks like this: [0, 1, 2]\nfunction abortIncompletePipelines(commandQueue) {\n var _a;\n let expectedIndex = 0;\n for (let i = 0; i < commandQueue.length;) {\n const command = (_a = commandQueue.peekAt(i)) === null || _a === void 0 ? void 0 : _a.command;\n const pipelineIndex = command.pipelineIndex;\n if (pipelineIndex === undefined || pipelineIndex === 0) {\n expectedIndex = 0;\n }\n if (pipelineIndex !== undefined && pipelineIndex !== expectedIndex++) {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n continue;\n }\n i++;\n }\n}\n// If only a partial transaction result was received before connection close,\n// we have to abort any transaction fragments that may have ended up in the\n// offline queue\nfunction abortTransactionFragments(commandQueue) {\n var _a;\n for (let i = 0; i < commandQueue.length;) {\n const command = (_a = commandQueue.peekAt(i)) === null || _a === void 0 ? void 0 : _a.command;\n if (command.name === \"multi\") {\n break;\n }\n if (command.name === \"exec\") {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n break;\n }\n if (command.inTransaction) {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n }\n else {\n i++;\n }\n }\n}\nfunction closeHandler(self) {\n return function () {\n const prevStatus = self.status;\n self.setStatus(\"close\");\n if (self.commandQueue.length) {\n abortIncompletePipelines(self.commandQueue);\n }\n if (self.offlineQueue.length) {\n abortTransactionFragments(self.offlineQueue);\n }\n if (prevStatus === \"ready\") {\n if (!self.prevCondition) {\n self.prevCondition = self.condition;\n }\n if (self.commandQueue.length) {\n self.prevCommandQueue = self.commandQueue;\n }\n }\n if (self.manuallyClosing) {\n self.manuallyClosing = false;\n debug(\"skip reconnecting since the connection is manually closed.\");\n return close();\n }\n if (typeof self.options.retryStrategy !== \"function\") {\n debug(\"skip reconnecting because `retryStrategy` is not a function\");\n return close();\n }\n const retryDelay = self.options.retryStrategy(++self.retryAttempts);\n if (typeof retryDelay !== \"number\") {\n debug(\"skip reconnecting because `retryStrategy` doesn't return a number\");\n return close();\n }\n debug(\"reconnect in %sms\", retryDelay);\n self.setStatus(\"reconnecting\", retryDelay);\n self.reconnectTimeout = setTimeout(function () {\n self.reconnectTimeout = null;\n self.connect().catch(utils_1.noop);\n }, retryDelay);\n const { maxRetriesPerRequest } = self.options;\n if (typeof maxRetriesPerRequest === \"number\") {\n if (maxRetriesPerRequest < 0) {\n debug(\"maxRetriesPerRequest is negative, ignoring...\");\n }\n else {\n const remainder = self.retryAttempts % (maxRetriesPerRequest + 1);\n if (remainder === 0) {\n debug(\"reach maxRetriesPerRequest limitation, flushing command queue...\");\n self.flushQueue(new errors_1.MaxRetriesPerRequestError(maxRetriesPerRequest));\n }\n }\n }\n };\n function close() {\n self.setStatus(\"end\");\n self.flushQueue(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n }\n}\nexports.closeHandler = closeHandler;\nfunction errorHandler(self) {\n return function (error) {\n debug(\"error: %s\", error);\n self.silentEmit(\"error\", error);\n };\n}\nexports.errorHandler = errorHandler;\nfunction readyHandler(self) {\n return function () {\n self.setStatus(\"ready\");\n self.retryAttempts = 0;\n if (self.options.monitor) {\n self.call(\"monitor\").then(() => self.setStatus(\"monitoring\"), (error) => self.emit(\"error\", error));\n const { sendCommand } = self;\n self.sendCommand = function (command) {\n if (Command_1.default.checkFlag(\"VALID_IN_MONITOR_MODE\", command.name)) {\n return sendCommand.call(self, command);\n }\n command.reject(new Error(\"Connection is in monitoring mode, can't process commands.\"));\n return command.promise;\n };\n self.once(\"close\", function () {\n delete self.sendCommand;\n });\n return;\n }\n const finalSelect = self.prevCondition\n ? self.prevCondition.select\n : self.condition.select;\n if (self.options.readOnly) {\n debug(\"set the connection to readonly mode\");\n self.readonly().catch(utils_1.noop);\n }\n if (self.prevCondition) {\n const condition = self.prevCondition;\n self.prevCondition = null;\n if (condition.subscriber && self.options.autoResubscribe) {\n // We re-select the previous db first since\n // `SELECT` command is not valid in sub mode.\n if (self.condition.select !== finalSelect) {\n debug(\"connect to db [%d]\", finalSelect);\n self.select(finalSelect);\n }\n const subscribeChannels = condition.subscriber.channels(\"subscribe\");\n if (subscribeChannels.length) {\n debug(\"subscribe %d channels\", subscribeChannels.length);\n self.subscribe(subscribeChannels);\n }\n const psubscribeChannels = condition.subscriber.channels(\"psubscribe\");\n if (psubscribeChannels.length) {\n debug(\"psubscribe %d channels\", psubscribeChannels.length);\n self.psubscribe(psubscribeChannels);\n }\n const ssubscribeChannels = condition.subscriber.channels(\"ssubscribe\");\n if (ssubscribeChannels.length) {\n debug(\"ssubscribe %s\", ssubscribeChannels.length);\n for (const channel of ssubscribeChannels) {\n self.ssubscribe(channel);\n }\n }\n }\n }\n if (self.prevCommandQueue) {\n if (self.options.autoResendUnfulfilledCommands) {\n debug(\"resend %d unfulfilled commands\", self.prevCommandQueue.length);\n while (self.prevCommandQueue.length > 0) {\n const item = self.prevCommandQueue.shift();\n if (item.select !== self.condition.select &&\n item.command.name !== \"select\") {\n self.select(item.select);\n }\n self.sendCommand(item.command, item.stream);\n }\n }\n else {\n self.prevCommandQueue = null;\n }\n }\n if (self.offlineQueue.length) {\n debug(\"send %d commands in offline queue\", self.offlineQueue.length);\n const offlineQueue = self.offlineQueue;\n self.resetOfflineQueue();\n while (offlineQueue.length > 0) {\n const item = offlineQueue.shift();\n if (item.select !== self.condition.select &&\n item.command.name !== \"select\") {\n self.select(item.select);\n }\n self.sendCommand(item.command, item.stream);\n }\n }\n if (self.condition.select !== finalSelect) {\n debug(\"connect to db [%d]\", finalSelect);\n self.select(finalSelect);\n }\n };\n}\nexports.readyHandler = readyHandler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_REDIS_OPTIONS = void 0;\nexports.DEFAULT_REDIS_OPTIONS = {\n // Connection\n port: 6379,\n host: \"localhost\",\n family: 0,\n connectTimeout: 10000,\n disconnectTimeout: 2000,\n retryStrategy: function (times) {\n return Math.min(times * 50, 2000);\n },\n keepAlive: 0,\n noDelay: true,\n connectionName: null,\n disableClientInfo: false,\n clientInfoTag: undefined,\n // Sentinel\n sentinels: null,\n name: null,\n role: \"master\",\n sentinelRetryStrategy: function (times) {\n return Math.min(times * 10, 1000);\n },\n sentinelReconnectStrategy: function () {\n // This strategy only applies when sentinels are used for detecting\n // a failover, not during initial master resolution.\n // The deployment can still function when some of the sentinels are down\n // for a long period of time, so we may not want to attempt reconnection\n // very often. Therefore the default interval is fairly long (1 minute).\n return 60000;\n },\n natMap: null,\n enableTLSForSentinelMode: false,\n updateSentinels: true,\n failoverDetector: false,\n // Status\n username: null,\n password: null,\n db: 0,\n // Others\n enableOfflineQueue: true,\n enableReadyCheck: true,\n autoResubscribe: true,\n autoResendUnfulfilledCommands: true,\n lazyConnect: false,\n keyPrefix: \"\",\n reconnectOnError: null,\n readOnly: false,\n stringNumbers: false,\n maxRetriesPerRequest: 20,\n maxLoadingRetryTime: 10000,\n enableAutoPipelining: false,\n autoPipeliningIgnoredCommands: [],\n sentinelMaxConnections: 10,\n blockingTimeoutGrace: 100,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst events_1 = require(\"events\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst cluster_1 = require(\"./cluster\");\nconst Command_1 = require(\"./Command\");\nconst connectors_1 = require(\"./connectors\");\nconst SentinelConnector_1 = require(\"./connectors/SentinelConnector\");\nconst eventHandler = require(\"./redis/event_handler\");\nconst RedisOptions_1 = require(\"./redis/RedisOptions\");\nconst ScanStream_1 = require(\"./ScanStream\");\nconst transaction_1 = require(\"./transaction\");\nconst utils_1 = require(\"./utils\");\nconst applyMixin_1 = require(\"./utils/applyMixin\");\nconst Commander_1 = require(\"./utils/Commander\");\nconst lodash_1 = require(\"./utils/lodash\");\nconst Deque = require(\"denque\");\nconst debug = (0, utils_1.Debug)(\"redis\");\n/**\n * This is the major component of ioredis.\n * Use it to connect to a standalone Redis server or Sentinels.\n *\n * ```typescript\n * const redis = new Redis(); // Default port is 6379\n * async function main() {\n * redis.set(\"foo\", \"bar\");\n * redis.get(\"foo\", (err, result) => {\n * // `result` should be \"bar\"\n * console.log(err, result);\n * });\n * // Or use Promise\n * const result = await redis.get(\"foo\");\n * }\n * ```\n */\nclass Redis extends Commander_1.default {\n constructor(arg1, arg2, arg3) {\n super();\n this.status = \"wait\";\n /**\n * @ignore\n */\n this.isCluster = false;\n this.reconnectTimeout = null;\n this.connectionEpoch = 0;\n this.retryAttempts = 0;\n this.manuallyClosing = false;\n // Prepare autopipelines structures\n this._autoPipelines = new Map();\n this._runningAutoPipelines = new Set();\n this.parseOptions(arg1, arg2, arg3);\n events_1.EventEmitter.call(this);\n this.resetCommandQueue();\n this.resetOfflineQueue();\n if (this.options.Connector) {\n this.connector = new this.options.Connector(this.options);\n }\n else if (this.options.sentinels) {\n const sentinelConnector = new SentinelConnector_1.default(this.options);\n sentinelConnector.emitter = this;\n this.connector = sentinelConnector;\n }\n else {\n this.connector = new connectors_1.StandaloneConnector(this.options);\n }\n if (this.options.scripts) {\n Object.entries(this.options.scripts).forEach(([name, definition]) => {\n this.defineCommand(name, definition);\n });\n }\n // end(or wait) -> connecting -> connect -> ready -> end\n if (this.options.lazyConnect) {\n this.setStatus(\"wait\");\n }\n else {\n this.connect().catch(lodash_1.noop);\n }\n }\n /**\n * Create a Redis instance.\n * This is the same as `new Redis()` but is included for compatibility with node-redis.\n */\n static createClient(...args) {\n return new Redis(...args);\n }\n get autoPipelineQueueSize() {\n let queued = 0;\n for (const pipeline of this._autoPipelines.values()) {\n queued += pipeline.length;\n }\n return queued;\n }\n /**\n * Create a connection to Redis.\n * This method will be invoked automatically when creating a new Redis instance\n * unless `lazyConnect: true` is passed.\n *\n * When calling this method manually, a Promise is returned, which will\n * be resolved when the connection status is ready. The promise can reject\n * if the connection fails, times out, or if Redis is already connecting/connected.\n */\n connect(callback) {\n const promise = new Promise((resolve, reject) => {\n if (this.status === \"connecting\" ||\n this.status === \"connect\" ||\n this.status === \"ready\") {\n reject(new Error(\"Redis is already connecting/connected\"));\n return;\n }\n this.connectionEpoch += 1;\n this.setStatus(\"connecting\");\n const { options } = this;\n this.condition = {\n select: options.db,\n auth: options.username\n ? [options.username, options.password]\n : options.password,\n subscriber: false,\n };\n const _this = this;\n (0, standard_as_callback_1.default)(this.connector.connect(function (type, err) {\n _this.silentEmit(type, err);\n }), function (err, stream) {\n if (err) {\n _this.flushQueue(err);\n _this.silentEmit(\"error\", err);\n reject(err);\n _this.setStatus(\"end\");\n return;\n }\n let CONNECT_EVENT = options.tls ? \"secureConnect\" : \"connect\";\n if (\"sentinels\" in options &&\n options.sentinels &&\n !options.enableTLSForSentinelMode) {\n CONNECT_EVENT = \"connect\";\n }\n _this.stream = stream;\n if (options.noDelay) {\n stream.setNoDelay(true);\n }\n // Node ignores setKeepAlive before connect, therefore we wait for the event:\n // https://github.com/nodejs/node/issues/31663\n if (typeof options.keepAlive === \"number\") {\n if (stream.connecting) {\n stream.once(CONNECT_EVENT, () => {\n stream.setKeepAlive(true, options.keepAlive);\n });\n }\n else {\n stream.setKeepAlive(true, options.keepAlive);\n }\n }\n if (stream.connecting) {\n stream.once(CONNECT_EVENT, eventHandler.connectHandler(_this));\n if (options.connectTimeout) {\n /*\n * Typically, Socket#setTimeout(0) will clear the timer\n * set before. However, in some platforms (Electron 3.x~4.x),\n * the timer will not be cleared. So we introduce a variable here.\n *\n * See https://github.com/electron/electron/issues/14915\n */\n let connectTimeoutCleared = false;\n stream.setTimeout(options.connectTimeout, function () {\n if (connectTimeoutCleared) {\n return;\n }\n stream.setTimeout(0);\n stream.destroy();\n const err = new Error(\"connect ETIMEDOUT\");\n // @ts-expect-error\n err.errorno = \"ETIMEDOUT\";\n // @ts-expect-error\n err.code = \"ETIMEDOUT\";\n // @ts-expect-error\n err.syscall = \"connect\";\n eventHandler.errorHandler(_this)(err);\n });\n stream.once(CONNECT_EVENT, function () {\n connectTimeoutCleared = true;\n stream.setTimeout(0);\n });\n }\n }\n else if (stream.destroyed) {\n const firstError = _this.connector.firstError;\n if (firstError) {\n process.nextTick(() => {\n eventHandler.errorHandler(_this)(firstError);\n });\n }\n process.nextTick(eventHandler.closeHandler(_this));\n }\n else {\n process.nextTick(eventHandler.connectHandler(_this));\n }\n if (!stream.destroyed) {\n stream.once(\"error\", eventHandler.errorHandler(_this));\n stream.once(\"close\", eventHandler.closeHandler(_this));\n }\n const connectionReadyHandler = function () {\n _this.removeListener(\"close\", connectionCloseHandler);\n resolve();\n };\n var connectionCloseHandler = function () {\n _this.removeListener(\"ready\", connectionReadyHandler);\n reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n };\n _this.once(\"ready\", connectionReadyHandler);\n _this.once(\"close\", connectionCloseHandler);\n });\n });\n return (0, standard_as_callback_1.default)(promise, callback);\n }\n /**\n * Disconnect from Redis.\n *\n * This method closes the connection immediately,\n * and may lose some pending replies that haven't written to client.\n * If you want to wait for the pending replies, use Redis#quit instead.\n */\n disconnect(reconnect = false) {\n if (!reconnect) {\n this.manuallyClosing = true;\n }\n if (this.reconnectTimeout && !reconnect) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.status === \"wait\") {\n eventHandler.closeHandler(this)();\n }\n else {\n this.connector.disconnect();\n }\n }\n /**\n * Disconnect from Redis.\n *\n * @deprecated\n */\n end() {\n this.disconnect();\n }\n /**\n * Create a new instance with the same options as the current one.\n *\n * @example\n * ```js\n * var redis = new Redis(6380);\n * var anotherRedis = redis.duplicate();\n * ```\n */\n duplicate(override) {\n return new Redis({ ...this.options, ...override });\n }\n /**\n * Mode of the connection.\n *\n * One of `\"normal\"`, `\"subscriber\"`, or `\"monitor\"`. When the connection is\n * not in `\"normal\"` mode, certain commands are not allowed.\n */\n get mode() {\n var _a;\n return this.options.monitor\n ? \"monitor\"\n : ((_a = this.condition) === null || _a === void 0 ? void 0 : _a.subscriber)\n ? \"subscriber\"\n : \"normal\";\n }\n /**\n * Listen for all requests received by the server in real time.\n *\n * This command will create a new connection to Redis and send a\n * MONITOR command via the new connection in order to avoid disturbing\n * the current connection.\n *\n * @param callback The callback function. If omit, a promise will be returned.\n * @example\n * ```js\n * var redis = new Redis();\n * redis.monitor(function (err, monitor) {\n * // Entering monitoring mode.\n * monitor.on('monitor', function (time, args, source, database) {\n * console.log(time + \": \" + util.inspect(args));\n * });\n * });\n *\n * // supports promise as well as other commands\n * redis.monitor().then(function (monitor) {\n * monitor.on('monitor', function (time, args, source, database) {\n * console.log(time + \": \" + util.inspect(args));\n * });\n * });\n * ```\n */\n monitor(callback) {\n const monitorInstance = this.duplicate({\n monitor: true,\n lazyConnect: false,\n });\n return (0, standard_as_callback_1.default)(new Promise(function (resolve, reject) {\n monitorInstance.once(\"error\", reject);\n monitorInstance.once(\"monitoring\", function () {\n resolve(monitorInstance);\n });\n }), callback);\n }\n /**\n * Send a command to Redis\n *\n * This method is used internally and in most cases you should not\n * use it directly. If you need to send a command that is not supported\n * by the library, you can use the `call` method:\n *\n * ```js\n * const redis = new Redis();\n *\n * redis.call('set', 'foo', 'bar');\n * // or\n * redis.call(['set', 'foo', 'bar']);\n * ```\n *\n * @ignore\n */\n sendCommand(command, stream) {\n var _a, _b;\n if (this.status === \"wait\") {\n this.connect().catch(lodash_1.noop);\n }\n if (this.status === \"end\") {\n command.reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return command.promise;\n }\n if (((_a = this.condition) === null || _a === void 0 ? void 0 : _a.subscriber) &&\n !Command_1.default.checkFlag(\"VALID_IN_SUBSCRIBER_MODE\", command.name)) {\n command.reject(new Error(\"Connection in subscriber mode, only subscriber commands may be used\"));\n return command.promise;\n }\n if (typeof this.options.commandTimeout === \"number\") {\n command.setTimeout(this.options.commandTimeout);\n }\n const blockingTimeout = this.getBlockingTimeoutInMs(command);\n let writable = this.status === \"ready\" ||\n (!stream &&\n this.status === \"connect\" &&\n (0, commands_1.exists)(command.name, { caseInsensitive: true }) &&\n ((0, commands_1.hasFlag)(command.name, \"loading\", { nameCaseInsensitive: true }) ||\n Command_1.default.checkFlag(\"HANDSHAKE_COMMANDS\", command.name)));\n if (!this.stream) {\n writable = false;\n }\n else if (!this.stream.writable) {\n writable = false;\n // @ts-expect-error\n }\n else if (this.stream._writableState && this.stream._writableState.ended) {\n // TODO: We should be able to remove this as the PR has already been merged.\n // https://github.com/iojs/io.js/pull/1217\n writable = false;\n }\n if (!writable) {\n if (!this.options.enableOfflineQueue) {\n command.reject(new Error(\"Stream isn't writeable and enableOfflineQueue options is false\"));\n return command.promise;\n }\n if (command.name === \"quit\" && this.offlineQueue.length === 0) {\n this.disconnect();\n command.resolve(Buffer.from(\"OK\"));\n return command.promise;\n }\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"queue command[%s]: %d -> %s(%o)\", this._getDescription(), this.condition.select, command.name, command.args);\n }\n this.offlineQueue.push({\n command: command,\n stream: stream,\n select: this.condition.select,\n });\n // For blocking commands in the offline queue, arm a client-side timeout\n // only when blockingTimeout is configured. Without this option, queued\n // blocking commands may wait indefinitely on a dead connection.\n if (Command_1.default.checkFlag(\"BLOCKING_COMMANDS\", command.name)) {\n const offlineTimeout = this.getConfiguredBlockingTimeout();\n if (offlineTimeout !== undefined) {\n command.setBlockingTimeout(offlineTimeout);\n }\n }\n }\n else {\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"write command[%s]: %d -> %s(%o)\", this._getDescription(), (_b = this.condition) === null || _b === void 0 ? void 0 : _b.select, command.name, command.args);\n }\n if (stream) {\n if (\"isPipeline\" in stream && stream.isPipeline) {\n stream.write(command.toWritable(stream.destination.redis.stream));\n }\n else {\n stream.write(command.toWritable(stream));\n }\n }\n else {\n this.stream.write(command.toWritable(this.stream));\n }\n this.commandQueue.push({\n command: command,\n stream: stream,\n select: this.condition.select,\n });\n if (blockingTimeout !== undefined) {\n command.setBlockingTimeout(blockingTimeout);\n }\n if (Command_1.default.checkFlag(\"WILL_DISCONNECT\", command.name)) {\n this.manuallyClosing = true;\n }\n if (this.options.socketTimeout !== undefined && this.socketTimeoutTimer === undefined) {\n this.setSocketTimeout();\n }\n }\n if (command.name === \"select\" && (0, utils_1.isInt)(command.args[0])) {\n const db = parseInt(command.args[0], 10);\n if (this.condition.select !== db) {\n this.condition.select = db;\n this.emit(\"select\", db);\n debug(\"switch to db [%d]\", this.condition.select);\n }\n }\n return command.promise;\n }\n getBlockingTimeoutInMs(command) {\n var _a;\n if (!Command_1.default.checkFlag(\"BLOCKING_COMMANDS\", command.name)) {\n return undefined;\n }\n // Feature is opt-in: only enabled when blockingTimeout is set to a positive number\n const configuredTimeout = this.getConfiguredBlockingTimeout();\n if (configuredTimeout === undefined) {\n return undefined;\n }\n const timeout = command.extractBlockingTimeout();\n if (typeof timeout === \"number\") {\n if (timeout > 0) {\n // Finite timeout from command args - add grace period\n return timeout + ((_a = this.options.blockingTimeoutGrace) !== null && _a !== void 0 ? _a : RedisOptions_1.DEFAULT_REDIS_OPTIONS.blockingTimeoutGrace);\n }\n // Command has timeout=0 (block forever), use blockingTimeout option as safety net\n return configuredTimeout;\n }\n if (timeout === null) {\n // No BLOCK option found (e.g., XREAD without BLOCK), use blockingTimeout as safety net\n return configuredTimeout;\n }\n return undefined;\n }\n getConfiguredBlockingTimeout() {\n if (typeof this.options.blockingTimeout === \"number\" &&\n this.options.blockingTimeout > 0) {\n return this.options.blockingTimeout;\n }\n return undefined;\n }\n setSocketTimeout() {\n this.socketTimeoutTimer = setTimeout(() => {\n this.stream.destroy(new Error(`Socket timeout. Expecting data, but didn't receive any in ${this.options.socketTimeout}ms.`));\n this.socketTimeoutTimer = undefined;\n }, this.options.socketTimeout);\n // this handler must run after the \"data\" handler in \"DataHandler\"\n // so that `this.commandQueue.length` will be updated\n this.stream.once(\"data\", () => {\n clearTimeout(this.socketTimeoutTimer);\n this.socketTimeoutTimer = undefined;\n if (this.commandQueue.length === 0)\n return;\n this.setSocketTimeout();\n });\n }\n scanStream(options) {\n return this.createScanStream(\"scan\", { options });\n }\n scanBufferStream(options) {\n return this.createScanStream(\"scanBuffer\", { options });\n }\n sscanStream(key, options) {\n return this.createScanStream(\"sscan\", { key, options });\n }\n sscanBufferStream(key, options) {\n return this.createScanStream(\"sscanBuffer\", { key, options });\n }\n hscanStream(key, options) {\n return this.createScanStream(\"hscan\", { key, options });\n }\n hscanBufferStream(key, options) {\n return this.createScanStream(\"hscanBuffer\", { key, options });\n }\n zscanStream(key, options) {\n return this.createScanStream(\"zscan\", { key, options });\n }\n zscanBufferStream(key, options) {\n return this.createScanStream(\"zscanBuffer\", { key, options });\n }\n /**\n * Emit only when there's at least one listener.\n *\n * @ignore\n */\n silentEmit(eventName, arg) {\n let error;\n if (eventName === \"error\") {\n error = arg;\n if (this.status === \"end\") {\n return;\n }\n if (this.manuallyClosing) {\n // ignore connection related errors when manually disconnecting\n if (error instanceof Error &&\n (error.message === utils_1.CONNECTION_CLOSED_ERROR_MSG ||\n // @ts-expect-error\n error.syscall === \"connect\" ||\n // @ts-expect-error\n error.syscall === \"read\")) {\n return;\n }\n }\n }\n if (this.listeners(eventName).length > 0) {\n return this.emit.apply(this, arguments);\n }\n if (error && error instanceof Error) {\n console.error(\"[ioredis] Unhandled error event:\", error.stack);\n }\n return false;\n }\n /**\n * @ignore\n */\n recoverFromFatalError(_commandError, err, options) {\n this.flushQueue(err, options);\n this.silentEmit(\"error\", err);\n this.disconnect(true);\n }\n /**\n * @ignore\n */\n handleReconnection(err, item) {\n var _a;\n let needReconnect = false;\n if (this.options.reconnectOnError &&\n !Command_1.default.checkFlag(\"IGNORE_RECONNECT_ON_ERROR\", item.command.name)) {\n needReconnect = this.options.reconnectOnError(err);\n }\n switch (needReconnect) {\n case 1:\n case true:\n if (this.status !== \"reconnecting\") {\n this.disconnect(true);\n }\n item.command.reject(err);\n break;\n case 2:\n if (this.status !== \"reconnecting\") {\n this.disconnect(true);\n }\n if (((_a = this.condition) === null || _a === void 0 ? void 0 : _a.select) !== item.select &&\n item.command.name !== \"select\") {\n this.select(item.select);\n }\n // TODO\n // @ts-expect-error\n this.sendCommand(item.command);\n break;\n default:\n item.command.reject(err);\n }\n }\n /**\n * Get description of the connection. Used for debugging.\n */\n _getDescription() {\n let description;\n if (\"path\" in this.options && this.options.path) {\n description = this.options.path;\n }\n else if (this.stream &&\n this.stream.remoteAddress &&\n this.stream.remotePort) {\n description = this.stream.remoteAddress + \":\" + this.stream.remotePort;\n }\n else if (\"host\" in this.options && this.options.host) {\n description = this.options.host + \":\" + this.options.port;\n }\n else {\n // Unexpected\n description = \"\";\n }\n if (this.options.connectionName) {\n description += ` (${this.options.connectionName})`;\n }\n return description;\n }\n resetCommandQueue() {\n this.commandQueue = new Deque();\n }\n resetOfflineQueue() {\n this.offlineQueue = new Deque();\n }\n parseOptions(...args) {\n const options = {};\n let isTls = false;\n for (let i = 0; i < args.length; ++i) {\n const arg = args[i];\n if (arg === null || typeof arg === \"undefined\") {\n continue;\n }\n if (typeof arg === \"object\") {\n (0, lodash_1.defaults)(options, arg);\n }\n else if (typeof arg === \"string\") {\n (0, lodash_1.defaults)(options, (0, utils_1.parseURL)(arg));\n if (arg.startsWith(\"rediss://\")) {\n isTls = true;\n }\n }\n else if (typeof arg === \"number\") {\n options.port = arg;\n }\n else {\n throw new Error(\"Invalid argument \" + arg);\n }\n }\n if (isTls) {\n (0, lodash_1.defaults)(options, { tls: true });\n }\n (0, lodash_1.defaults)(options, Redis.defaultOptions);\n if (typeof options.port === \"string\") {\n options.port = parseInt(options.port, 10);\n }\n if (typeof options.db === \"string\") {\n options.db = parseInt(options.db, 10);\n }\n // @ts-expect-error\n this.options = (0, utils_1.resolveTLSProfile)(options);\n }\n /**\n * Change instance's status\n */\n setStatus(status, arg) {\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"status[%s]: %s -> %s\", this._getDescription(), this.status || \"[empty]\", status);\n }\n this.status = status;\n process.nextTick(this.emit.bind(this, status, arg));\n }\n createScanStream(command, { key, options = {} }) {\n return new ScanStream_1.default({\n objectMode: true,\n key: key,\n redis: this,\n command: command,\n ...options,\n });\n }\n /**\n * Flush offline queue and command queue with error.\n *\n * @param error The error object to send to the commands\n * @param options options\n */\n flushQueue(error, options) {\n options = (0, lodash_1.defaults)({}, options, {\n offlineQueue: true,\n commandQueue: true,\n });\n let item;\n if (options.offlineQueue) {\n while ((item = this.offlineQueue.shift())) {\n item.command.reject(error);\n }\n }\n if (options.commandQueue) {\n if (this.commandQueue.length > 0) {\n if (this.stream) {\n this.stream.removeAllListeners(\"data\");\n }\n while ((item = this.commandQueue.shift())) {\n item.command.reject(error);\n }\n }\n }\n }\n /**\n * Check whether Redis has finished loading the persistent data and is able to\n * process commands.\n */\n _readyCheck(callback) {\n const _this = this;\n this.info(function (err, res) {\n if (err) {\n if (err.message && err.message.includes(\"NOPERM\")) {\n console.warn(`Skipping the ready check because INFO command fails: \"${err.message}\". You can disable ready check with \"enableReadyCheck\". More: https://github.com/luin/ioredis/wiki/Disable-ready-check.`);\n return callback(null, {});\n }\n return callback(err);\n }\n if (typeof res !== \"string\") {\n return callback(null, res);\n }\n const info = {};\n const lines = res.split(\"\\r\\n\");\n for (let i = 0; i < lines.length; ++i) {\n const [fieldName, ...fieldValueParts] = lines[i].split(\":\");\n const fieldValue = fieldValueParts.join(\":\");\n if (fieldValue) {\n info[fieldName] = fieldValue;\n }\n }\n if (!info.loading || info.loading === \"0\") {\n callback(null, info);\n }\n else {\n const loadingEtaMs = (info.loading_eta_seconds || 1) * 1000;\n const retryTime = _this.options.maxLoadingRetryTime &&\n _this.options.maxLoadingRetryTime < loadingEtaMs\n ? _this.options.maxLoadingRetryTime\n : loadingEtaMs;\n debug(\"Redis server still loading, trying again in \" + retryTime + \"ms\");\n setTimeout(function () {\n _this._readyCheck(callback);\n }, retryTime);\n }\n }).catch(lodash_1.noop);\n }\n}\nRedis.Cluster = cluster_1.default;\nRedis.Command = Command_1.default;\n/**\n * Default options\n */\nRedis.defaultOptions = RedisOptions_1.DEFAULT_REDIS_OPTIONS;\n(0, applyMixin_1.default)(Redis, events_1.EventEmitter);\n(0, transaction_1.addTransactionSupport)(Redis.prototype);\nexports.default = Redis;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.print = exports.ReplyError = exports.SentinelIterator = exports.SentinelConnector = exports.AbstractConnector = exports.Pipeline = exports.ScanStream = exports.Command = exports.Cluster = exports.Redis = exports.default = void 0;\nexports = module.exports = require(\"./Redis\").default;\nvar Redis_1 = require(\"./Redis\");\nObject.defineProperty(exports, \"default\", { enumerable: true, get: function () { return Redis_1.default; } });\nvar Redis_2 = require(\"./Redis\");\nObject.defineProperty(exports, \"Redis\", { enumerable: true, get: function () { return Redis_2.default; } });\nvar cluster_1 = require(\"./cluster\");\nObject.defineProperty(exports, \"Cluster\", { enumerable: true, get: function () { return cluster_1.default; } });\n/**\n * @ignore\n */\nvar Command_1 = require(\"./Command\");\nObject.defineProperty(exports, \"Command\", { enumerable: true, get: function () { return Command_1.default; } });\n/**\n * @ignore\n */\nvar ScanStream_1 = require(\"./ScanStream\");\nObject.defineProperty(exports, \"ScanStream\", { enumerable: true, get: function () { return ScanStream_1.default; } });\n/**\n * @ignore\n */\nvar Pipeline_1 = require(\"./Pipeline\");\nObject.defineProperty(exports, \"Pipeline\", { enumerable: true, get: function () { return Pipeline_1.default; } });\n/**\n * @ignore\n */\nvar AbstractConnector_1 = require(\"./connectors/AbstractConnector\");\nObject.defineProperty(exports, \"AbstractConnector\", { enumerable: true, get: function () { return AbstractConnector_1.default; } });\n/**\n * @ignore\n */\nvar SentinelConnector_1 = require(\"./connectors/SentinelConnector\");\nObject.defineProperty(exports, \"SentinelConnector\", { enumerable: true, get: function () { return SentinelConnector_1.default; } });\nObject.defineProperty(exports, \"SentinelIterator\", { enumerable: true, get: function () { return SentinelConnector_1.SentinelIterator; } });\n// No TS typings\nexports.ReplyError = require(\"redis-errors\").ReplyError;\n/**\n * @ignore\n */\nObject.defineProperty(exports, \"Promise\", {\n get() {\n console.warn(\"ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.\");\n return Promise;\n },\n set(_lib) {\n console.warn(\"ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.\");\n },\n});\n/**\n * @ignore\n */\nfunction print(err, reply) {\n if (err) {\n console.log(\"Error: \" + err);\n }\n else {\n console.log(\"Reply: \" + reply);\n }\n}\nexports.print = print;\n","import type { RedisOptions } from \"bullmq\";\nimport { Redis } from \"ioredis\";\nimport type {\n AlertContactPoint,\n AlertRule,\n AlertStore,\n AlertsOptions,\n} from \"./types\";\n\nexport interface RedisAlertStoreOptions {\n connection: string | RedisOptions;\n /** BullMQ-style prefix; keys are `${prefix}:workbench:alerts:*` */\n prefix?: string;\n /** Imported once when Redis has no stored config yet */\n seed?: Pick<AlertsOptions, \"contactPoints\" | \"rules\">;\n}\n\nfunction createRedisClient(connection: string | RedisOptions): Redis {\n if (typeof connection === \"string\") {\n return new Redis(connection, { maxRetriesPerRequest: null });\n }\n const { url, ...rest } = connection as RedisOptions & { url?: string };\n if (url) {\n return new Redis(url, { ...rest, maxRetriesPerRequest: null });\n }\n return new Redis({ ...rest, maxRetriesPerRequest: null });\n}\n\n/**\n * Persists alert contact points and rules in the user's Redis.\n * Webhook URLs and rules created in the dashboard survive process restarts.\n */\nexport class RedisAlertStore implements AlertStore {\n private readonly client: Redis;\n private readonly contactPointsKey: string;\n private readonly rulesKey: string;\n private readonly seed?: Pick<AlertsOptions, \"contactPoints\" | \"rules\">;\n private seeded = false;\n\n constructor(options: RedisAlertStoreOptions) {\n this.client = createRedisClient(options.connection);\n const prefix = options.prefix ?? \"bull\";\n this.contactPointsKey = `${prefix}:workbench:alerts:contact-points`;\n this.rulesKey = `${prefix}:workbench:alerts:rules`;\n this.seed = options.seed;\n }\n\n async close(): Promise<void> {\n await this.client.quit().catch(() => this.client.disconnect());\n }\n\n private async ensureSeeded(): Promise<void> {\n if (this.seeded) return;\n this.seeded = true;\n\n const [cpCount, ruleCount] = await Promise.all([\n this.client.hlen(this.contactPointsKey),\n this.client.hlen(this.rulesKey),\n ]);\n\n if (cpCount > 0 || ruleCount > 0) return;\n if (!this.seed?.contactPoints?.length && !this.seed?.rules?.length) return;\n\n const pipeline = this.client.pipeline();\n for (const cp of this.seed.contactPoints ?? []) {\n pipeline.hset(this.contactPointsKey, cp.id, JSON.stringify(cp));\n }\n for (const rule of this.seed.rules ?? []) {\n pipeline.hset(this.rulesKey, rule.id, JSON.stringify(rule));\n }\n await pipeline.exec();\n }\n\n private async readHash<T>(key: string): Promise<T[]> {\n const raw = await this.client.hgetall(key);\n const items: T[] = [];\n for (const value of Object.values(raw)) {\n try {\n items.push(JSON.parse(value) as T);\n } catch {\n // skip corrupt entries\n }\n }\n return items;\n }\n\n async getContactPoints(): Promise<AlertContactPoint[]> {\n await this.ensureSeeded();\n const items = await this.readHash<AlertContactPoint>(this.contactPointsKey);\n return items.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n async getContactPoint(id: string): Promise<AlertContactPoint | undefined> {\n await this.ensureSeeded();\n const raw = await this.client.hget(this.contactPointsKey, id);\n if (!raw) return undefined;\n return JSON.parse(raw) as AlertContactPoint;\n }\n\n async createContactPoint(\n input: Omit<AlertContactPoint, \"id\" | \"createdAt\" | \"updatedAt\">,\n ): Promise<AlertContactPoint> {\n await this.ensureSeeded();\n const now = Date.now();\n const cp: AlertContactPoint = {\n ...input,\n id: crypto.randomUUID(),\n createdAt: now,\n updatedAt: now,\n };\n await this.client.hset(this.contactPointsKey, cp.id, JSON.stringify(cp));\n return cp;\n }\n\n async updateContactPoint(\n id: string,\n input: Partial<Omit<AlertContactPoint, \"id\" | \"createdAt\" | \"updatedAt\">>,\n ): Promise<AlertContactPoint | undefined> {\n await this.ensureSeeded();\n const existing = await this.getContactPoint(id);\n if (!existing) return undefined;\n const updated: AlertContactPoint = {\n ...existing,\n ...input,\n id,\n createdAt: existing.createdAt,\n updatedAt: Date.now(),\n };\n await this.client.hset(this.contactPointsKey, id, JSON.stringify(updated));\n return updated;\n }\n\n async deleteContactPoint(id: string): Promise<boolean> {\n await this.ensureSeeded();\n const removed = await this.client.hdel(this.contactPointsKey, id);\n return removed > 0;\n }\n\n async getRules(): Promise<AlertRule[]> {\n await this.ensureSeeded();\n const items = await this.readHash<AlertRule>(this.rulesKey);\n return items.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n async getRule(id: string): Promise<AlertRule | undefined> {\n await this.ensureSeeded();\n const raw = await this.client.hget(this.rulesKey, id);\n if (!raw) return undefined;\n return JSON.parse(raw) as AlertRule;\n }\n\n async createRule(\n input: Omit<AlertRule, \"id\" | \"createdAt\" | \"updatedAt\">,\n ): Promise<AlertRule> {\n await this.ensureSeeded();\n const now = Date.now();\n const rule: AlertRule = {\n ...input,\n id: crypto.randomUUID(),\n createdAt: now,\n updatedAt: now,\n };\n await this.client.hset(this.rulesKey, rule.id, JSON.stringify(rule));\n return rule;\n }\n\n async updateRule(\n id: string,\n input: Partial<Omit<AlertRule, \"id\" | \"createdAt\" | \"updatedAt\">>,\n ): Promise<AlertRule | undefined> {\n await this.ensureSeeded();\n const existing = await this.getRule(id);\n if (!existing) return undefined;\n const updated: AlertRule = {\n ...existing,\n ...input,\n id,\n createdAt: existing.createdAt,\n updatedAt: Date.now(),\n };\n await this.client.hset(this.rulesKey, id, JSON.stringify(updated));\n return updated;\n }\n\n async deleteRule(id: string): Promise<boolean> {\n await this.ensureSeeded();\n const removed = await this.client.hdel(this.rulesKey, id);\n return removed > 0;\n }\n}\n","import { RedisAlertStore } from \"./redis-alert-store\";\nimport type {\n AlertContactPoint,\n AlertContactPointPublic,\n AlertPersistence,\n AlertRule,\n AlertStore,\n AlertsOptions,\n} from \"./types\";\n\nfunction maskUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const segments = parsed.pathname.split(\"/\").filter(Boolean);\n const secret = segments[segments.length - 1] ?? \"\";\n const tail = secret.length >= 4 ? secret.slice(-4) : \"****\";\n return `${parsed.hostname}/…${tail}`;\n } catch {\n return \"••••••••\";\n }\n}\n\nexport function toPublicContactPoint(\n cp: AlertContactPoint,\n): AlertContactPointPublic {\n const { url, ...rest } = cp;\n return { ...rest, urlMasked: maskUrl(url) };\n}\n\n/**\n * Use {@link createAlertStore} — defaults to Redis when a connection is available.\n */\nexport type { AlertPersistence, AlertStore } from \"./types\";\n\nexport interface CreateAlertStoreContext {\n /** Workbench-level Redis connection (auto-discovery) */\n redis?: string | import(\"bullmq\").RedisOptions;\n /** Connection from the first mounted BullMQ queue (BullMQ `ConnectionOptions`) */\n queueConnection?: unknown;\n /** Key prefix for Redis storage; defaults to Workbench `prefix` or `\"bull\"` */\n prefix?: string;\n}\n\n/**\n * Resolve the alert config store. Redis is the default when a connection exists.\n * Code-defined `contactPoints` / `rules` seed Redis on first run only.\n */\nexport function createAlertStore(\n alerts: AlertsOptions,\n ctx: CreateAlertStoreContext,\n): { store: AlertStore; persistence: AlertPersistence } {\n if (alerts.store) {\n return { store: alerts.store, persistence: \"custom\" };\n }\n\n if (alerts.persistence === \"memory\") {\n return {\n store: new MemoryAlertStore({\n contactPoints: alerts.contactPoints,\n rules: alerts.rules,\n }),\n persistence: \"memory\",\n };\n }\n\n const connection = (ctx.queueConnection ?? ctx.redis) as\n | string\n | import(\"bullmq\").RedisOptions\n | undefined;\n if (connection) {\n return {\n store: new RedisAlertStore({\n connection,\n prefix: alerts.storagePrefix ?? ctx.prefix ?? \"bull\",\n seed: {\n contactPoints: alerts.contactPoints,\n rules: alerts.rules,\n },\n }),\n persistence: \"redis\",\n };\n }\n\n return {\n store: new MemoryAlertStore({\n contactPoints: alerts.contactPoints,\n rules: alerts.rules,\n }),\n persistence: \"memory\",\n };\n}\n\nexport class MemoryAlertStore implements AlertStore {\n private contactPoints = new Map<string, AlertContactPoint>();\n private rules = new Map<string, AlertRule>();\n\n constructor(seed?: Pick<AlertsOptions, \"contactPoints\" | \"rules\">) {\n for (const cp of seed?.contactPoints ?? []) {\n this.contactPoints.set(cp.id, { ...cp });\n }\n for (const rule of seed?.rules ?? []) {\n this.rules.set(rule.id, { ...rule });\n }\n }\n\n async getContactPoints(): Promise<AlertContactPoint[]> {\n return Array.from(this.contactPoints.values()).sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n }\n\n async getContactPoint(id: string): Promise<AlertContactPoint | undefined> {\n return this.contactPoints.get(id);\n }\n\n async createContactPoint(\n input: Omit<AlertContactPoint, \"id\" | \"createdAt\" | \"updatedAt\">,\n ): Promise<AlertContactPoint> {\n const now = Date.now();\n const cp: AlertContactPoint = {\n ...input,\n id: crypto.randomUUID(),\n createdAt: now,\n updatedAt: now,\n };\n this.contactPoints.set(cp.id, cp);\n return cp;\n }\n\n async updateContactPoint(\n id: string,\n input: Partial<Omit<AlertContactPoint, \"id\" | \"createdAt\" | \"updatedAt\">>,\n ): Promise<AlertContactPoint | undefined> {\n const existing = this.contactPoints.get(id);\n if (!existing) return undefined;\n const updated: AlertContactPoint = {\n ...existing,\n ...input,\n id,\n createdAt: existing.createdAt,\n updatedAt: Date.now(),\n };\n this.contactPoints.set(id, updated);\n return updated;\n }\n\n async deleteContactPoint(id: string): Promise<boolean> {\n return this.contactPoints.delete(id);\n }\n\n async getRules(): Promise<AlertRule[]> {\n return Array.from(this.rules.values()).sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n }\n\n async getRule(id: string): Promise<AlertRule | undefined> {\n return this.rules.get(id);\n }\n\n async createRule(\n input: Omit<AlertRule, \"id\" | \"createdAt\" | \"updatedAt\">,\n ): Promise<AlertRule> {\n const now = Date.now();\n const rule: AlertRule = {\n ...input,\n id: crypto.randomUUID(),\n createdAt: now,\n updatedAt: now,\n };\n this.rules.set(rule.id, rule);\n return rule;\n }\n\n async updateRule(\n id: string,\n input: Partial<Omit<AlertRule, \"id\" | \"createdAt\" | \"updatedAt\">>,\n ): Promise<AlertRule | undefined> {\n const existing = this.rules.get(id);\n if (!existing) return undefined;\n const updated: AlertRule = {\n ...existing,\n ...input,\n id,\n createdAt: existing.createdAt,\n updatedAt: Date.now(),\n };\n this.rules.set(id, updated);\n return updated;\n }\n\n async deleteRule(id: string): Promise<boolean> {\n return this.rules.delete(id);\n }\n}\n","import type { AlertContactPoint, AlertEvent } from \"./types\";\n\n/** Default Workbench notification identity */\nexport const DEFAULT_ALERT_SENDER_NAME = \"Workbench Alerts\";\n\n/** Inline SVG data URI for Workbench app icon (used as Slack avatar when supported) */\nexport const DEFAULT_WORKBENCH_ICON_URL =\n \"https://raw.githubusercontent.com/pontusab/workbench/main/packages/core/src/ui/public/app-icon.svg\";\n\n/** Slack incoming webhook URLs (modern app or legacy custom integration). */\nexport function isSlackIncomingWebhookUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return (\n parsed.protocol === \"https:\" &&\n (parsed.hostname === \"hooks.slack.com\" ||\n parsed.hostname === \"hooks.slack-gov.com\") &&\n parsed.pathname.startsWith(\"/services/\")\n );\n } catch {\n return false;\n }\n}\n\nexport function validateContactPointUrl(\n preset: AlertContactPoint[\"preset\"],\n url: string,\n): string | undefined {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n return \"URL must use http or https\";\n }\n } catch {\n return \"Invalid URL\";\n }\n\n if (preset === \"slack\" && !isSlackIncomingWebhookUrl(url)) {\n return \"Slack contact points require an incoming webhook URL (https://hooks.slack.com/services/...)\";\n }\n\n return undefined;\n}\n\nconst SLACK_HEADER_MAX = 150;\n\nconst SEVERITY_EMOJI: Record<string, string> = {\n critical: \"🔴\",\n warning: \"🟡\",\n info: \"🔵\",\n};\n\nfunction severityLabel(severity: string): string {\n return severity.charAt(0).toUpperCase() + severity.slice(1);\n}\n\nfunction buildDashboardLink(\n dashboardUrl: string | undefined,\n event: AlertEvent,\n): string | undefined {\n if (!dashboardUrl) return undefined;\n const base = dashboardUrl.replace(/\\/$/, \"\");\n if (event.queue && event.jobId) {\n return `${base}/queues/${encodeURIComponent(event.queue)}/jobs/${encodeURIComponent(event.jobId)}`;\n }\n if (event.queue) {\n return `${base}/queues/${encodeURIComponent(event.queue)}?status=failed`;\n }\n return `${base}/`;\n}\n\nexport interface FormattedDestinationPayload {\n url: string;\n headers: Record<string, string>;\n body: unknown;\n}\n\nexport function formatSlackPayload(\n contactPoint: AlertContactPoint,\n event: AlertEvent,\n dashboardUrl?: string,\n): FormattedDestinationPayload {\n const emoji = SEVERITY_EMOJI[event.severity] ?? \"⚪\";\n const link = buildDashboardLink(dashboardUrl, event);\n const senderName = contactPoint.displayName ?? DEFAULT_ALERT_SENDER_NAME;\n const iconUrl = contactPoint.iconUrl ?? DEFAULT_WORKBENCH_ICON_URL;\n\n const fields: Array<{ type: string; text: string }> = [];\n if (event.queue) {\n fields.push({ type: \"mrkdwn\", text: `*Queue:*\\n${event.queue}` });\n }\n if (event.jobName || event.jobId) {\n fields.push({\n type: \"mrkdwn\",\n text: `*Job:*\\n${event.jobName ?? \"—\"} (\\`${event.jobId ?? \"—\"}\\`)`,\n });\n }\n if (event.failedReason) {\n fields.push({\n type: \"mrkdwn\",\n text: `*Reason:*\\n${event.failedReason.slice(0, 500)}`,\n });\n }\n if (event.counts) {\n const parts: string[] = [];\n if (event.counts.failed !== undefined) {\n parts.push(`Failed: ${event.counts.failed}`);\n }\n if (event.counts.backlog !== undefined) {\n parts.push(`Backlog: ${event.counts.backlog}`);\n }\n if (event.counts.workers !== undefined && event.counts.workers !== null) {\n parts.push(`Workers: ${event.counts.workers}`);\n }\n if (parts.length > 0) {\n fields.push({ type: \"mrkdwn\", text: `*Counts:*\\n${parts.join(\" · \")}` });\n }\n }\n\n const blocks: unknown[] = [\n {\n type: \"header\",\n text: {\n type: \"plain_text\",\n text: `${emoji} ${event.ruleName}`.slice(0, SLACK_HEADER_MAX),\n emoji: true,\n },\n },\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `*${severityLabel(event.severity)}* · \\`${event.trigger}\\`\\n${event.message}`,\n },\n },\n ];\n\n if (fields.length > 0) {\n blocks.push({\n type: \"section\",\n fields: fields.slice(0, 10),\n });\n }\n\n if (link?.startsWith(\"https://\")) {\n blocks.push({\n type: \"actions\",\n elements: [\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Open in Workbench\", emoji: true },\n url: link,\n },\n ],\n });\n } else if (link) {\n blocks.push({\n type: \"context\",\n elements: [{ type: \"mrkdwn\", text: `<${link}|Open in Workbench>` }],\n });\n }\n\n blocks.push({\n type: \"context\",\n elements: [\n {\n type: \"mrkdwn\",\n text: event.status === \"resolved\" ? \"✅ Resolved\" : \"🔔 Firing\",\n },\n ],\n });\n\n const body: Record<string, unknown> = {\n username: senderName,\n icon_url: iconUrl,\n blocks,\n text: `${emoji} ${event.ruleName}: ${event.message}`,\n };\n\n return {\n url: contactPoint.url,\n headers: { \"Content-Type\": \"application/json\" },\n body,\n };\n}\n\nexport function formatWebhookPayload(\n contactPoint: AlertContactPoint,\n event: AlertEvent,\n dashboardUrl?: string,\n): FormattedDestinationPayload {\n const link = buildDashboardLink(dashboardUrl, event);\n const body = {\n source: \"workbench\",\n version: 1,\n contactPoint: { id: contactPoint.id, name: contactPoint.name },\n event: {\n id: event.id,\n ruleId: event.ruleId,\n ruleName: event.ruleName,\n trigger: event.trigger,\n severity: event.severity,\n status: event.status,\n fingerprint: event.fingerprint,\n message: event.message,\n queue: event.queue,\n jobId: event.jobId,\n jobName: event.jobName,\n failedReason: event.failedReason,\n attemptsMade: event.attemptsMade,\n counts: event.counts,\n firedAt: event.firedAt,\n resolvedAt: event.resolvedAt,\n dashboardUrl: link,\n },\n };\n\n return {\n url: contactPoint.url,\n headers: {\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Workbench-Alerts/1.0\",\n ...contactPoint.headers,\n },\n body,\n };\n}\n\nexport function formatDestinationPayload(\n contactPoint: AlertContactPoint,\n event: AlertEvent,\n dashboardUrl?: string,\n): FormattedDestinationPayload {\n if (contactPoint.preset === \"slack\") {\n return formatSlackPayload(contactPoint, event, dashboardUrl);\n }\n return formatWebhookPayload(contactPoint, event, dashboardUrl);\n}\n\nexport async function deliverToContactPoint(\n contactPoint: AlertContactPoint,\n event: AlertEvent,\n dashboardUrl?: string,\n): Promise<{ success: boolean; error?: string }> {\n if (!contactPoint.enabled) {\n return { success: false, error: \"Contact point disabled\" };\n }\n\n const { url, headers, body } = formatDestinationPayload(\n contactPoint,\n event,\n dashboardUrl,\n );\n\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(15_000),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n let error = `HTTP ${res.status}`;\n try {\n const json = JSON.parse(text) as { error?: string; ok?: boolean };\n if (json.error) error += `: ${json.error}`;\n } catch {\n if (text) error += `: ${text.slice(0, 200)}`;\n }\n return { success: false, error };\n }\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : \"Delivery failed\",\n };\n }\n}\n","import { validateContactPointUrl } from \"../core/alert-destinations\";\nimport { toPublicContactPoint } from \"../core/alert-store\";\nimport type {\n AlertContactPoint,\n AlertRule,\n CreateFlowRequest,\n JobStatus,\n SortOptions,\n TestJobRequest,\n} from \"../core/types\";\nimport type { WorkbenchCore } from \"../core/workbench\";\n\n/**\n * Framework-agnostic HTTP method.\n */\nexport type HttpMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\n\n/**\n * Normalized input passed to every handler. Adapters are responsible for\n * mapping their framework-specific request shape to this.\n */\nexport interface HandlerInput {\n params: Record<string, string>;\n query: Record<string, string | undefined>;\n body?: unknown;\n}\n\n/**\n * Normalized output returned by every handler. Adapters serialize this\n * onto their framework-specific response object.\n */\nexport interface HandlerResult {\n status: number;\n body: unknown;\n}\n\n/**\n * A framework-agnostic route handler. Closes over a `WorkbenchCore` and\n * takes a normalized request envelope.\n */\nexport type Handler = (input: HandlerInput) => Promise<HandlerResult>;\n\n/**\n * A framework-agnostic route definition.\n *\n * `path` uses `:param` syntax compatible with Hono, Express, and Fastify.\n * Paths are relative to `/api` — adapters mount them under that prefix.\n */\nexport interface RouteDef {\n method: HttpMethod;\n path: string;\n handler: Handler;\n}\n\n/**\n * Parse sort query param in format \"field:direction\" (e.g., \"timestamp:desc\")\n * Defaults to desc if direction not specified.\n */\nfunction parseSort(sort?: string): SortOptions | undefined {\n if (!sort) return undefined;\n const [field, dir] = sort.split(\":\");\n if (!field) return undefined;\n return {\n field,\n direction: dir === \"asc\" ? \"asc\" : \"desc\",\n };\n}\n\nconst readonlyError = {\n status: 403 as const,\n body: { error: \"Dashboard is in readonly mode\" },\n};\n\nfunction alertsRoutes(core: WorkbenchCore): RouteDef[] {\n const am = core.alertManager;\n if (!am) return [];\n\n const store = am.getStore();\n const isReadonly = () => !!core.options.readonly;\n\n return [\n {\n method: \"get\",\n path: \"/alerts/status\",\n handler: async () => ({\n status: 200,\n body: await am.getStatus(),\n }),\n },\n {\n method: \"get\",\n path: \"/alerts/contact-points\",\n handler: async () => {\n const points = await store.getContactPoints();\n return {\n status: 200,\n body: points.map(toPublicContactPoint),\n };\n },\n },\n {\n method: \"post\",\n path: \"/alerts/contact-points\",\n handler: async ({ body }) => {\n if (isReadonly()) return readonlyError;\n const input = body as Partial<AlertContactPoint> | undefined;\n if (!input?.name || !input.url || !input.preset) {\n return {\n status: 400,\n body: { error: \"name, url, and preset are required\" },\n };\n }\n const urlError = validateContactPointUrl(input.preset, input.url);\n if (urlError) {\n return { status: 400, body: { error: urlError } };\n }\n const created = await store.createContactPoint({\n name: input.name,\n preset: input.preset,\n url: input.url,\n enabled: input.enabled ?? true,\n displayName: input.displayName,\n iconUrl: input.iconUrl,\n headers: input.headers,\n });\n return { status: 201, body: toPublicContactPoint(created) };\n },\n },\n {\n method: \"put\",\n path: \"/alerts/contact-points/:id\",\n handler: async ({ params, body }) => {\n if (isReadonly()) return readonlyError;\n const input = body as Partial<AlertContactPoint> | undefined;\n if (input?.url && input.preset) {\n const urlError = validateContactPointUrl(input.preset, input.url);\n if (urlError) {\n return { status: 400, body: { error: urlError } };\n }\n } else if (input?.url) {\n const existing = await store.getContactPoint(params.id!);\n if (existing) {\n const urlError = validateContactPointUrl(\n existing.preset,\n input.url,\n );\n if (urlError) {\n return { status: 400, body: { error: urlError } };\n }\n }\n }\n const updated = await store.updateContactPoint(params.id!, {\n name: input?.name,\n preset: input?.preset,\n url: input?.url,\n enabled: input?.enabled,\n displayName: input?.displayName,\n iconUrl: input?.iconUrl,\n headers: input?.headers,\n });\n if (!updated) {\n return { status: 404, body: { error: \"Contact point not found\" } };\n }\n return { status: 200, body: toPublicContactPoint(updated) };\n },\n },\n {\n method: \"delete\",\n path: \"/alerts/contact-points/:id\",\n handler: async ({ params }) => {\n if (isReadonly()) return readonlyError;\n const ok = await store.deleteContactPoint(params.id!);\n if (!ok) {\n return { status: 404, body: { error: \"Contact point not found\" } };\n }\n return { status: 200, body: { success: true } };\n },\n },\n {\n method: \"post\",\n path: \"/alerts/contact-points/:id/test\",\n handler: async ({ params }) => {\n if (isReadonly()) return readonlyError;\n const record = await am.sendTest(params.id!);\n return { status: 200, body: record };\n },\n },\n {\n method: \"get\",\n path: \"/alerts/rules\",\n handler: async () => ({\n status: 200,\n body: await store.getRules(),\n }),\n },\n {\n method: \"post\",\n path: \"/alerts/rules\",\n handler: async ({ body }) => {\n if (isReadonly()) return readonlyError;\n const input = body as Partial<AlertRule> | undefined;\n if (!input?.name || !input.trigger || !input.contactPointIds?.length) {\n return {\n status: 400,\n body: {\n error: \"name, trigger, and contactPointIds are required\",\n },\n };\n }\n const created = await store.createRule({\n name: input.name,\n enabled: input.enabled ?? true,\n trigger: input.trigger,\n severity: input.severity ?? \"warning\",\n queues: input.queues,\n jobNames: input.jobNames,\n threshold: input.threshold,\n contactPointIds: input.contactPointIds,\n cooldownMs: input.cooldownMs,\n });\n return { status: 201, body: created };\n },\n },\n {\n method: \"put\",\n path: \"/alerts/rules/:id\",\n handler: async ({ params, body }) => {\n if (isReadonly()) return readonlyError;\n const input = body as Partial<AlertRule> | undefined;\n const updated = await store.updateRule(params.id!, {\n name: input?.name,\n enabled: input?.enabled,\n trigger: input?.trigger,\n severity: input?.severity,\n queues: input?.queues,\n jobNames: input?.jobNames,\n threshold: input?.threshold,\n contactPointIds: input?.contactPointIds,\n cooldownMs: input?.cooldownMs,\n });\n if (!updated) {\n return { status: 404, body: { error: \"Rule not found\" } };\n }\n return { status: 200, body: updated };\n },\n },\n {\n method: \"delete\",\n path: \"/alerts/rules/:id\",\n handler: async ({ params }) => {\n if (isReadonly()) return readonlyError;\n const ok = await store.deleteRule(params.id!);\n if (!ok) {\n return { status: 404, body: { error: \"Rule not found\" } };\n }\n return { status: 200, body: { success: true } };\n },\n },\n {\n method: \"post\",\n path: \"/alerts/rules/:id/preview\",\n handler: async ({ params }) => {\n const rule = await store.getRule(params.id!);\n if (!rule) {\n return { status: 404, body: { error: \"Rule not found\" } };\n }\n return { status: 200, body: am.previewRule(rule) };\n },\n },\n ];\n}\n\n/**\n * Build the framework-agnostic route table for the Workbench API.\n *\n * Adapters iterate this list and register each route on their host framework.\n * Paths are relative to `/api`.\n */\nexport function buildRouteTable(core: WorkbenchCore): RouteDef[] {\n const qm = core.queueManager;\n const isReadonly = () => !!core.options.readonly;\n\n return [\n {\n method: \"post\",\n path: \"/refresh\",\n handler: async () => {\n qm.clearCache();\n return { status: 200, body: { success: true } };\n },\n },\n\n {\n method: \"get\",\n path: \"/overview\",\n handler: async () => ({\n status: 200,\n body: await qm.getOverview(),\n }),\n },\n\n {\n method: \"get\",\n path: \"/counts\",\n handler: async () => ({\n status: 200,\n body: await qm.getQuickCounts(),\n }),\n },\n\n {\n method: \"get\",\n path: \"/runs\",\n handler: async ({ query }) => {\n const limit = Number(query.limit) || 50;\n const cursor = query.cursor;\n const start = cursor ? Number(cursor) : 0;\n const sort = parseSort(query.sort);\n\n const status = query.status as JobStatus | undefined;\n const q = query.q;\n const from = query.from;\n const to = query.to;\n const tagsParam = query.tags;\n\n let tags: Record<string, string> | undefined;\n if (tagsParam) {\n try {\n tags = JSON.parse(tagsParam);\n } catch {\n const tagPairs = tagsParam.split(\",\");\n tags = {};\n for (const pair of tagPairs) {\n const [key, value] = pair.split(\":\");\n if (key && value) {\n tags[key.trim()] = value.trim();\n }\n }\n }\n }\n\n let timeRange: { start: number; end: number } | undefined;\n if (from && to) {\n timeRange = {\n start: Number(from),\n end: Number(to),\n };\n }\n\n let text: string | undefined;\n if (q) {\n if (!q.includes(\":\")) {\n text = q;\n } else {\n const parts = q.split(\" \");\n const textParts = parts.filter((p) => !p.includes(\":\"));\n if (textParts.length > 0) {\n text = textParts.join(\" \");\n }\n }\n }\n\n const filters =\n status || tags || text || timeRange\n ? {\n status,\n tags,\n text,\n timeRange,\n }\n : undefined;\n\n return {\n status: 200,\n body: await qm.getAllRuns(limit, start, sort, filters),\n };\n },\n },\n\n {\n method: \"get\",\n path: \"/schedulers\",\n handler: async ({ query }) => {\n const repeatableSort = parseSort(query.repeatableSort);\n const delayedSort = parseSort(query.delayedSort);\n return {\n status: 200,\n body: await qm.getSchedulers(repeatableSort, delayedSort),\n };\n },\n },\n\n {\n method: \"post\",\n path: \"/test\",\n handler: async ({ body }) => {\n if (isReadonly()) return readonlyError;\n const req = body as TestJobRequest | undefined;\n\n if (!req?.queueName || !req.jobName) {\n return {\n status: 400,\n body: { error: \"queueName and jobName are required\" },\n };\n }\n\n try {\n const result = await qm.enqueueJob(req);\n return { status: 200, body: result };\n } catch (e) {\n return { status: 400, body: { error: (e as Error).message } };\n }\n },\n },\n\n {\n method: \"get\",\n path: \"/queue-names\",\n handler: async () => ({\n status: 200,\n body: qm.getQueueNames(),\n }),\n },\n\n {\n method: \"get\",\n path: \"/queues\",\n handler: async () => ({\n status: 200,\n body: await qm.getQueues(),\n }),\n },\n\n {\n method: \"get\",\n path: \"/metrics\",\n handler: async () => ({\n status: 200,\n body: await qm.getMetrics(),\n }),\n },\n\n {\n method: \"get\",\n path: \"/activity\",\n handler: async () => ({\n status: 200,\n body: await qm.getActivityStats(),\n }),\n },\n\n {\n method: \"get\",\n path: \"/queues/:name/jobs\",\n handler: async ({ params, query }) => {\n const name = params.name!;\n const status = query.status as JobStatus | undefined;\n const limit = Number(query.limit) || 50;\n const cursor = query.cursor;\n const start = cursor ? Number(cursor) : 0;\n const sort = parseSort(query.sort);\n\n return {\n status: 200,\n body: await qm.getJobs(name, status, limit, start, sort),\n };\n },\n },\n\n {\n method: \"get\",\n path: \"/jobs/:queue/:id/logs\",\n handler: async ({ params, query }) => {\n const start = query.start !== undefined ? Number(query.start) : 0;\n const end = query.end !== undefined ? Number(query.end) : -1;\n const asc = query.asc !== \"false\";\n\n const logs = await qm.getJobLogs(\n params.queue!,\n params.id!,\n start,\n end,\n asc,\n );\n if (!logs) {\n return { status: 404, body: { error: \"Job not found\" } };\n }\n return { status: 200, body: logs };\n },\n },\n\n {\n method: \"get\",\n path: \"/jobs/:queue/:id\",\n handler: async ({ params }) => {\n const job = await qm.getJob(params.queue!, params.id!);\n if (!job) {\n return { status: 404, body: { error: \"Job not found\" } };\n }\n return { status: 200, body: job };\n },\n },\n\n {\n method: \"post\",\n path: \"/jobs/:queue/:id/retry\",\n handler: async ({ params }) => {\n if (isReadonly()) return readonlyError;\n const success = await qm.retryJob(params.queue!, params.id!);\n if (!success) {\n return { status: 400, body: { error: \"Failed to retry job\" } };\n }\n return { status: 200, body: { success: true } };\n },\n },\n\n {\n method: \"post\",\n path: \"/jobs/:queue/:id/remove\",\n handler: async ({ params }) => {\n if (isReadonly()) return readonlyError;\n const success = await qm.removeJob(params.queue!, params.id!);\n if (!success) {\n return { status: 400, body: { error: \"Failed to remove job\" } };\n }\n return { status: 200, body: { success: true } };\n },\n },\n\n {\n method: \"post\",\n path: \"/jobs/:queue/:id/promote\",\n handler: async ({ params }) => {\n if (isReadonly()) return readonlyError;\n const success = await qm.promoteJob(params.queue!, params.id!);\n if (!success) {\n return { status: 400, body: { error: \"Failed to promote job\" } };\n }\n return { status: 200, body: { success: true } };\n },\n },\n\n {\n method: \"post\",\n path: \"/schedulers/:queue/:key/run\",\n handler: async ({ params }) => {\n if (isReadonly()) return readonlyError;\n const result = await qm.runSchedulerNow(params.queue!, params.key!);\n if (!result) {\n return { status: 400, body: { error: \"Failed to run scheduler\" } };\n }\n return { status: 200, body: result };\n },\n },\n\n {\n method: \"get\",\n path: \"/search\",\n handler: async ({ query }) => {\n const q = query.q || \"\";\n const limit = Number(query.limit) || 20;\n if (!q) return { status: 200, body: { results: [] } };\n const results = await qm.search(q, limit);\n return { status: 200, body: { results } };\n },\n },\n\n {\n method: \"get\",\n path: \"/tags/:field/values\",\n handler: async ({ params, query }) => {\n const field = params.field!;\n const limit = Number(query.limit) || 50;\n\n const tagFields = qm.getTagFields();\n if (tagFields.length > 0 && !tagFields.includes(field)) {\n return {\n status: 400,\n body: {\n error: `Field \"${field}\" is not a configured tag field`,\n },\n };\n }\n\n const values = await qm.getTagValues(field, limit);\n return { status: 200, body: { field, values } };\n },\n },\n\n {\n method: \"post\",\n path: \"/queues/:name/clean\",\n handler: async ({ params, body }) => {\n if (isReadonly()) return readonlyError;\n const req = body as\n | { status: \"completed\" | \"failed\"; grace?: number }\n | undefined;\n if (!req) {\n return { status: 400, body: { error: \"Body required\" } };\n }\n const count = await qm.cleanJobs(\n params.name!,\n req.status,\n req.grace || 0,\n );\n return { status: 200, body: { removed: count } };\n },\n },\n\n {\n method: \"post\",\n path: \"/bulk/retry\",\n handler: async ({ body }) => {\n if (isReadonly()) return readonlyError;\n const req = body as\n | { jobs: { queueName: string; jobId: string }[] }\n | undefined;\n if (!req?.jobs) {\n return { status: 400, body: { error: \"jobs is required\" } };\n }\n return { status: 200, body: await qm.bulkRetry(req.jobs) };\n },\n },\n\n {\n method: \"post\",\n path: \"/bulk/delete\",\n handler: async ({ body }) => {\n if (isReadonly()) return readonlyError;\n const req = body as\n | { jobs: { queueName: string; jobId: string }[] }\n | undefined;\n if (!req?.jobs) {\n return { status: 400, body: { error: \"jobs is required\" } };\n }\n return { status: 200, body: await qm.bulkDelete(req.jobs) };\n },\n },\n\n {\n method: \"post\",\n path: \"/bulk/promote\",\n handler: async ({ body }) => {\n if (isReadonly()) return readonlyError;\n const req = body as\n | { jobs: { queueName: string; jobId: string }[] }\n | undefined;\n if (!req?.jobs) {\n return { status: 400, body: { error: \"jobs is required\" } };\n }\n return { status: 200, body: await qm.bulkPromote(req.jobs) };\n },\n },\n\n {\n method: \"post\",\n path: \"/queues/:name/pause\",\n handler: async ({ params }) => {\n if (isReadonly()) return readonlyError;\n try {\n await qm.pauseQueue(params.name!);\n return { status: 200, body: { success: true, paused: true } };\n } catch (error) {\n return {\n status: 404,\n body: {\n error:\n error instanceof Error\n ? error.message\n : \"Failed to pause queue\",\n },\n };\n }\n },\n },\n\n {\n method: \"post\",\n path: \"/queues/:name/resume\",\n handler: async ({ params }) => {\n if (isReadonly()) return readonlyError;\n try {\n await qm.resumeQueue(params.name!);\n return { status: 200, body: { success: true, paused: false } };\n } catch (error) {\n return {\n status: 404,\n body: {\n error:\n error instanceof Error\n ? error.message\n : \"Failed to resume queue\",\n },\n };\n }\n },\n },\n\n {\n method: \"get\",\n path: \"/flows\",\n handler: async ({ query }) => {\n const limit = Number(query.limit) || 50;\n const flows = await qm.getFlows(limit);\n return { status: 200, body: { flows } };\n },\n },\n\n {\n method: \"get\",\n path: \"/flows/:queueName/:jobId\",\n handler: async ({ params }) => {\n const flow = await qm.getFlow(params.queueName!, params.jobId!);\n if (!flow) {\n return { status: 404, body: { error: \"Flow not found\" } };\n }\n return { status: 200, body: flow };\n },\n },\n\n {\n method: \"post\",\n path: \"/flows\",\n handler: async ({ body }) => {\n if (isReadonly()) return readonlyError;\n const req = body as CreateFlowRequest | undefined;\n\n if (!req?.name || !req.queueName || !req.children?.length) {\n return {\n status: 400,\n body: { error: \"name, queueName, and children are required\" },\n };\n }\n\n try {\n const result = await qm.createFlow(req);\n return { status: 200, body: result };\n } catch (e) {\n return { status: 400, body: { error: (e as Error).message } };\n }\n },\n },\n\n ...alertsRoutes(core),\n ];\n}\n","import { Hono } from \"hono\";\nimport type { WorkbenchCore } from \"../core/workbench\";\nimport { buildRouteTable, type HandlerInput } from \"./handlers\";\n\n/**\n * Create API routes for Workbench as a Hono app.\n *\n * Iterates the framework-agnostic `buildRouteTable(core)` and registers\n * each route on a fresh Hono instance. Adapters that don't speak Hono can\n * use `buildRouteTable` directly — see `@getworkbench/express` and\n * `@getworkbench/fastify`.\n */\nexport function createApiRoutes(core: WorkbenchCore): Hono {\n const app = new Hono();\n\n for (const route of buildRouteTable(core)) {\n app[route.method](route.path, async (c) => {\n let body: unknown;\n const method = c.req.method;\n if (method !== \"GET\" && method !== \"HEAD\") {\n const contentType = c.req.header(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n try {\n body = await c.req.json();\n } catch {\n body = undefined;\n }\n }\n }\n\n const input: HandlerInput = {\n params: c.req.param() as Record<string, string>,\n query: c.req.query(),\n body,\n };\n\n const result = await route.handler(input);\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n });\n }\n\n return app;\n}\n","/**\n * Compute the dashboard's base path from an incoming request URL.\n *\n * The dashboard is mounted at some prefix (e.g. `/jobs`) and the client\n * router renders deep links like `/jobs/queues/email`, `/jobs/metrics`,\n * `/jobs/flows/email/123`, etc. The HTML `<base href>` needs to point at\n * the mount prefix so client-side asset URLs resolve correctly — strip\n * any client-side route segment from the pathname.\n */\nconst CLIENT_ROUTES: RegExp[] = [\n /\\/queues\\/[^/]+\\/jobs\\/[^/]+\\/?$/,\n /\\/queues\\/[^/]+\\/?$/,\n /\\/flows\\/[^/]+\\/[^/]+\\/?$/,\n /\\/schedulers\\/?$/,\n /\\/flows\\/?$/,\n /\\/metrics\\/?$/,\n /\\/test\\/?$/,\n];\n\nexport function computeBasePath(pathname: string): string {\n let basePath = pathname;\n for (const route of CLIENT_ROUTES) {\n basePath = basePath.replace(route, \"\");\n }\n if (!basePath.endsWith(\"/\")) {\n basePath = `${basePath}/`;\n }\n return basePath;\n}\n\n/**\n * Resolve the dashboard's base path, preferring an explicit override.\n *\n * Adapters where the host framework preserves the mount prefix on the\n * incoming URL (Hono `.route()`, Express `req.originalUrl`, Next.js route\n * files) can rely on auto-detection. Adapters where the prefix is stripped\n * before the handler runs (Elysia `.mount()`) require the user to pass\n * `basePath` so the dashboard's HTML still references assets under the\n * correct prefix.\n */\nexport function resolveBasePath(\n override: string | undefined,\n pathname: string,\n): string {\n if (override) {\n return override.endsWith(\"/\") ? override : `${override}/`;\n }\n return computeBasePath(pathname);\n}\n","import { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Absolute filesystem path to the bundled UI assets (index.html + /assets).\n * Adapters that don't go through {@link createFetchHandler} serve static\n * files from this directory directly.\n */\nexport const UI_DIST_PATH = join(dirname(fileURLToPath(import.meta.url)), \"ui\");\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { UI_DIST_PATH } from \"../ui-dist\";\n\nexport interface StaticAssetResult {\n status: 200 | 404;\n body: Buffer | null;\n contentType: string;\n}\n\n/**\n * Read a bundled UI asset from `UI_DIST_PATH/assets/<filename>`.\n *\n * Returns a uniform `{ status, body, contentType }` shape so each adapter\n * can serialize it onto its framework-native response without re-implementing\n * the file lookup or content-type sniffing.\n */\nexport function serveStaticAsset(filename: string): StaticAssetResult {\n return serveUiFile(join(\"assets\", filename));\n}\n\n/**\n * Read a bundled UI file from `UI_DIST_PATH/<filename>`.\n * Used for root-level assets like `app-icon.svg` that Vite copies from `public/`.\n */\nexport function serveUiFile(relativePath: string): StaticAssetResult {\n const filePath = join(UI_DIST_PATH, relativePath);\n\n if (!existsSync(filePath)) {\n return { status: 404, body: null, contentType: \"text/plain\" };\n }\n\n const body = readFileSync(filePath);\n const filename = relativePath.split(\"/\").pop() ?? relativePath;\n const contentType = filename.endsWith(\".js\")\n ? \"application/javascript\"\n : filename.endsWith(\".css\")\n ? \"text/css\"\n : filename.endsWith(\".svg\")\n ? \"image/svg+xml\"\n : filename.endsWith(\".png\")\n ? \"image/png\"\n : filename.endsWith(\".ico\")\n ? \"image/x-icon\"\n : filename.endsWith(\".woff2\")\n ? \"font/woff2\"\n : \"application/octet-stream\";\n\n return { status: 200, body, contentType };\n}\n\nexport interface IndexHtmlResult {\n body: string;\n contentType: \"text/html; charset=utf-8\";\n}\n\n/**\n * Read the bundled `index.html`, inject a `<base href>` matching the request's\n * mount path so client-side asset URLs resolve correctly, and return it.\n *\n * Falls back to a tiny \"UI assets not found\" stub when the core package has\n * not been built yet — useful for `bun run dev` against a fresh checkout.\n */\nexport function renderIndexHtml(\n basePath: string,\n title: string,\n): IndexHtmlResult {\n const indexPath = join(UI_DIST_PATH, \"index.html\");\n\n if (existsSync(indexPath)) {\n let html = readFileSync(indexPath, \"utf-8\");\n html = html.replace(\"<head>\", `<head>\\n <base href=\"${basePath}\">`);\n return { body: html, contentType: \"text/html; charset=utf-8\" };\n }\n\n return {\n body: fallbackHtml(title, basePath),\n contentType: \"text/html; charset=utf-8\",\n };\n}\n\nfunction fallbackHtml(title: string, basePath: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <base href=\"${basePath}\">\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${title}</title>\n <link rel=\"icon\" href=\"./app-icon.svg\" type=\"image/svg+xml\" />\n <link rel=\"apple-touch-icon\" href=\"./app-icon.svg\" />\n <style>\n body {\n font-family: system-ui, sans-serif;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n margin: 0;\n background: #0a0a0a;\n color: #fafafa;\n }\n .message {\n text-align: center;\n padding: 2rem;\n }\n code {\n background: #1a1a1a;\n padding: 0.5rem 1rem;\n border-radius: 0.5rem;\n display: block;\n margin-top: 1rem;\n }\n </style>\n </head>\n <body>\n <div class=\"message\">\n <h1>${title}</h1>\n <p>UI assets not found. Build @getworkbench/core first:</p>\n <code>bun run --filter=@getworkbench/core build</code>\n </div>\n </body>\n</html>`;\n}\n","import { Hono } from \"hono\";\nimport { basicAuth } from \"hono/basic-auth\";\nimport { cors } from \"hono/cors\";\nimport { createApiRoutes } from \"../api/router\";\nimport type { WorkbenchCore } from \"../core/workbench\";\nimport { resolveBasePath } from \"./base-path\";\nimport {\n renderIndexHtml,\n serveStaticAsset,\n serveUiFile,\n} from \"./static-assets\";\n\n/**\n * Build a fully-wired Hono app for Workbench:\n *\n * - `POST /api/*`, `GET /api/*` etc. — JSON API\n * - `GET /config` — UI bootstrap config\n * - `GET /assets/:file` — static asset reader\n * - `GET *` — `index.html` with `<base href>`\n * - CORS on `/api/*`\n * - Basic auth on everything when `core.requiresAuth()` is true\n *\n * Used directly by `@getworkbench/hono` (returned as-is for `.route()`\n * mounting) and indirectly by `createFetchHandler` for non-Hono adapters.\n */\nexport function buildWorkbenchApp(core: WorkbenchCore): Hono {\n const app = new Hono();\n\n app.use(\"/api/*\", cors());\n\n if (core.requiresAuth()) {\n app.use(\n \"*\",\n basicAuth({\n username: core.options.auth!.username,\n password: core.options.auth!.password,\n }),\n );\n }\n\n app.route(\"/api\", createApiRoutes(core));\n\n app.get(\"/config\", (c) => c.json(core.getConfig()));\n\n app.get(\"/assets/:file\", (c) => {\n const fileName = c.req.param(\"file\");\n const asset = serveStaticAsset(fileName);\n if (asset.status === 404 || !asset.body) {\n return c.text(\"Not found\", 404);\n }\n return new Response(new Uint8Array(asset.body), {\n status: 200,\n headers: { \"Content-Type\": asset.contentType },\n });\n });\n\n app.get(\"/app-icon.svg\", (c) => {\n const asset = serveUiFile(\"app-icon.svg\");\n if (asset.status === 404 || !asset.body) {\n return c.text(\"Not found\", 404);\n }\n return new Response(new Uint8Array(asset.body), {\n status: 200,\n headers: { \"Content-Type\": asset.contentType },\n });\n });\n\n app.get(\"*\", (c) => {\n const url = new URL(c.req.url);\n const basePath = resolveBasePath(core.options.basePath, url.pathname);\n const html = renderIndexHtml(basePath, core.options.title || \"Workbench\");\n return c.html(html.body);\n });\n\n return app;\n}\n","// src/compose.ts\nvar compose = (middleware, onError, onNotFound) => {\n return (context, next) => {\n let index = -1;\n return dispatch(0);\n async function dispatch(i) {\n if (i <= index) {\n throw new Error(\"next() called multiple times\");\n }\n index = i;\n let res;\n let isError = false;\n let handler;\n if (middleware[i]) {\n handler = middleware[i][0][0];\n context.req.routeIndex = i;\n } else {\n handler = i === middleware.length && next || void 0;\n }\n if (handler) {\n try {\n res = await handler(context, () => dispatch(i + 1));\n } catch (err) {\n if (err instanceof Error && onError) {\n context.error = err;\n res = await onError(err, context);\n isError = true;\n } else {\n throw err;\n }\n }\n } else {\n if (context.finalized === false && onNotFound) {\n res = await onNotFound(context);\n }\n }\n if (res && (context.finalized === false || isError)) {\n context.res = res;\n }\n return context;\n }\n };\n};\nexport {\n compose\n};\n","// src/http-exception.ts\nvar HTTPException = class extends Error {\n res;\n status;\n /**\n * Creates an instance of `HTTPException`.\n * @param status - HTTP status code for the exception. Defaults to 500.\n * @param options - Additional options for the exception.\n */\n constructor(status = 500, options) {\n super(options?.message, { cause: options?.cause });\n this.res = options?.res;\n this.status = status;\n }\n /**\n * Returns the response object associated with the exception.\n * If a response object is not provided, a new response is created with the error message and status code.\n * @returns The response object.\n */\n getResponse() {\n if (this.res) {\n const newResponse = new Response(this.res.body, {\n status: this.status,\n headers: this.res.headers\n });\n return newResponse;\n }\n return new Response(this.message, {\n status: this.status\n });\n }\n};\nexport {\n HTTPException\n};\n","// src/request/constants.ts\nvar GET_MATCH_RESULT = /* @__PURE__ */ Symbol();\nexport {\n GET_MATCH_RESULT\n};\n","// src/utils/body.ts\nimport { HonoRequest } from \"../request.js\";\nvar parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => {\n const { all = false, dot = false } = options;\n const headers = request instanceof HonoRequest ? request.raw.headers : request.headers;\n const contentType = headers.get(\"Content-Type\");\n if (contentType?.startsWith(\"multipart/form-data\") || contentType?.startsWith(\"application/x-www-form-urlencoded\")) {\n return parseFormData(request, { all, dot });\n }\n return {};\n};\nasync function parseFormData(request, options) {\n const formData = await request.formData();\n if (formData) {\n return convertFormDataToBodyData(formData, options);\n }\n return {};\n}\nfunction convertFormDataToBodyData(formData, options) {\n const form = /* @__PURE__ */ Object.create(null);\n formData.forEach((value, key) => {\n const shouldParseAllValues = options.all || key.endsWith(\"[]\");\n if (!shouldParseAllValues) {\n form[key] = value;\n } else {\n handleParsingAllValues(form, key, value);\n }\n });\n if (options.dot) {\n Object.entries(form).forEach(([key, value]) => {\n const shouldParseDotValues = key.includes(\".\");\n if (shouldParseDotValues) {\n handleParsingNestedValues(form, key, value);\n delete form[key];\n }\n });\n }\n return form;\n}\nvar handleParsingAllValues = (form, key, value) => {\n if (form[key] !== void 0) {\n if (Array.isArray(form[key])) {\n ;\n form[key].push(value);\n } else {\n form[key] = [form[key], value];\n }\n } else {\n if (!key.endsWith(\"[]\")) {\n form[key] = value;\n } else {\n form[key] = [value];\n }\n }\n};\nvar handleParsingNestedValues = (form, key, value) => {\n if (/(?:^|\\.)__proto__\\./.test(key)) {\n return;\n }\n let nestedForm = form;\n const keys = key.split(\".\");\n keys.forEach((key2, index) => {\n if (index === keys.length - 1) {\n nestedForm[key2] = value;\n } else {\n if (!nestedForm[key2] || typeof nestedForm[key2] !== \"object\" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) {\n nestedForm[key2] = /* @__PURE__ */ Object.create(null);\n }\n nestedForm = nestedForm[key2];\n }\n });\n};\nexport {\n parseBody\n};\n","// src/utils/url.ts\nvar splitPath = (path) => {\n const paths = path.split(\"/\");\n if (paths[0] === \"\") {\n paths.shift();\n }\n return paths;\n};\nvar splitRoutingPath = (routePath) => {\n const { groups, path } = extractGroupsFromPath(routePath);\n const paths = splitPath(path);\n return replaceGroupMarks(paths, groups);\n};\nvar extractGroupsFromPath = (path) => {\n const groups = [];\n path = path.replace(/\\{[^}]+\\}/g, (match, index) => {\n const mark = `@${index}`;\n groups.push([mark, match]);\n return mark;\n });\n return { groups, path };\n};\nvar replaceGroupMarks = (paths, groups) => {\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = paths.length - 1; j >= 0; j--) {\n if (paths[j].includes(mark)) {\n paths[j] = paths[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n return paths;\n};\nvar patternCache = {};\nvar getPattern = (label, next) => {\n if (label === \"*\") {\n return \"*\";\n }\n const match = label.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n if (match) {\n const cacheKey = `${label}#${next}`;\n if (!patternCache[cacheKey]) {\n if (match[2]) {\n patternCache[cacheKey] = next && next[0] !== \":\" && next[0] !== \"*\" ? [cacheKey, match[1], new RegExp(`^${match[2]}(?=/${next})`)] : [label, match[1], new RegExp(`^${match[2]}$`)];\n } else {\n patternCache[cacheKey] = [label, match[1], true];\n }\n }\n return patternCache[cacheKey];\n }\n return null;\n};\nvar tryDecode = (str, decoder) => {\n try {\n return decoder(str);\n } catch {\n return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {\n try {\n return decoder(match);\n } catch {\n return match;\n }\n });\n }\n};\nvar tryDecodeURI = (str) => tryDecode(str, decodeURI);\nvar getPath = (request) => {\n const url = request.url;\n const start = url.indexOf(\"/\", url.indexOf(\":\") + 4);\n let i = start;\n for (; i < url.length; i++) {\n const charCode = url.charCodeAt(i);\n if (charCode === 37) {\n const queryIndex = url.indexOf(\"?\", i);\n const hashIndex = url.indexOf(\"#\", i);\n const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);\n const path = url.slice(start, end);\n return tryDecodeURI(path.includes(\"%25\") ? path.replace(/%25/g, \"%2525\") : path);\n } else if (charCode === 63 || charCode === 35) {\n break;\n }\n }\n return url.slice(start, i);\n};\nvar getQueryStrings = (url) => {\n const queryIndex = url.indexOf(\"?\", 8);\n return queryIndex === -1 ? \"\" : \"?\" + url.slice(queryIndex + 1);\n};\nvar getPathNoStrict = (request) => {\n const result = getPath(request);\n return result.length > 1 && result.at(-1) === \"/\" ? result.slice(0, -1) : result;\n};\nvar mergePath = (base, sub, ...rest) => {\n if (rest.length) {\n sub = mergePath(sub, ...rest);\n }\n return `${base?.[0] === \"/\" ? \"\" : \"/\"}${base}${sub === \"/\" ? \"\" : `${base?.at(-1) === \"/\" ? \"\" : \"/\"}${sub?.[0] === \"/\" ? sub.slice(1) : sub}`}`;\n};\nvar checkOptionalParameter = (path) => {\n if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(\":\")) {\n return null;\n }\n const segments = path.split(\"/\");\n const results = [];\n let basePath = \"\";\n segments.forEach((segment) => {\n if (segment !== \"\" && !/\\:/.test(segment)) {\n basePath += \"/\" + segment;\n } else if (/\\:/.test(segment)) {\n if (/\\?/.test(segment)) {\n if (results.length === 0 && basePath === \"\") {\n results.push(\"/\");\n } else {\n results.push(basePath);\n }\n const optionalSegment = segment.replace(\"?\", \"\");\n basePath += \"/\" + optionalSegment;\n results.push(basePath);\n } else {\n basePath += \"/\" + segment;\n }\n }\n });\n return results.filter((v, i, a) => a.indexOf(v) === i);\n};\nvar _decodeURI = (value) => {\n if (!/[%+]/.test(value)) {\n return value;\n }\n if (value.indexOf(\"+\") !== -1) {\n value = value.replace(/\\+/g, \" \");\n }\n return value.indexOf(\"%\") !== -1 ? tryDecode(value, decodeURIComponent_) : value;\n};\nvar _getQueryParam = (url, key, multiple) => {\n let encoded;\n if (!multiple && key && !/[%+]/.test(key)) {\n let keyIndex2 = url.indexOf(\"?\", 8);\n if (keyIndex2 === -1) {\n return void 0;\n }\n if (!url.startsWith(key, keyIndex2 + 1)) {\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n while (keyIndex2 !== -1) {\n const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1);\n if (trailingKeyCode === 61) {\n const valueIndex = keyIndex2 + key.length + 2;\n const endIndex = url.indexOf(\"&\", valueIndex);\n return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex));\n } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) {\n return \"\";\n }\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n encoded = /[%+]/.test(url);\n if (!encoded) {\n return void 0;\n }\n }\n const results = {};\n encoded ??= /[%+]/.test(url);\n let keyIndex = url.indexOf(\"?\", 8);\n while (keyIndex !== -1) {\n const nextKeyIndex = url.indexOf(\"&\", keyIndex + 1);\n let valueIndex = url.indexOf(\"=\", keyIndex);\n if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) {\n valueIndex = -1;\n }\n let name = url.slice(\n keyIndex + 1,\n valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex\n );\n if (encoded) {\n name = _decodeURI(name);\n }\n keyIndex = nextKeyIndex;\n if (name === \"\") {\n continue;\n }\n let value;\n if (valueIndex === -1) {\n value = \"\";\n } else {\n value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex);\n if (encoded) {\n value = _decodeURI(value);\n }\n }\n if (multiple) {\n if (!(results[name] && Array.isArray(results[name]))) {\n results[name] = [];\n }\n ;\n results[name].push(value);\n } else {\n results[name] ??= value;\n }\n }\n return key ? results[key] : results;\n};\nvar getQueryParam = _getQueryParam;\nvar getQueryParams = (url, key) => {\n return _getQueryParam(url, key, true);\n};\nvar decodeURIComponent_ = decodeURIComponent;\nexport {\n checkOptionalParameter,\n decodeURIComponent_,\n getPath,\n getPathNoStrict,\n getPattern,\n getQueryParam,\n getQueryParams,\n getQueryStrings,\n mergePath,\n splitPath,\n splitRoutingPath,\n tryDecode,\n tryDecodeURI\n};\n","// src/request.ts\nimport { HTTPException } from \"./http-exception.js\";\nimport { GET_MATCH_RESULT } from \"./request/constants.js\";\nimport { parseBody } from \"./utils/body.js\";\nimport { decodeURIComponent_, getQueryParam, getQueryParams, tryDecode } from \"./utils/url.js\";\nvar tryDecodeURIComponent = (str) => tryDecode(str, decodeURIComponent_);\nvar HonoRequest = class {\n /**\n * `.raw` can get the raw Request object.\n *\n * @see {@link https://hono.dev/docs/api/request#raw}\n *\n * @example\n * ```ts\n * // For Cloudflare Workers\n * app.post('/', async (c) => {\n * const metadata = c.req.raw.cf?.hostMetadata?\n * ...\n * })\n * ```\n */\n raw;\n #validatedData;\n // Short name of validatedData\n #matchResult;\n routeIndex = 0;\n /**\n * `.path` can get the pathname of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#path}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const pathname = c.req.path // `/about/me`\n * })\n * ```\n */\n path;\n bodyCache = {};\n constructor(request, path = \"/\", matchResult = [[]]) {\n this.raw = request;\n this.path = path;\n this.#matchResult = matchResult;\n this.#validatedData = {};\n }\n param(key) {\n return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams();\n }\n #getDecodedParam(key) {\n const paramKey = this.#matchResult[0][this.routeIndex][1][key];\n const param = this.#getParamValue(paramKey);\n return param && /\\%/.test(param) ? tryDecodeURIComponent(param) : param;\n }\n #getAllDecodedParams() {\n const decoded = {};\n const keys = Object.keys(this.#matchResult[0][this.routeIndex][1]);\n for (const key of keys) {\n const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]);\n if (value !== void 0) {\n decoded[key] = /\\%/.test(value) ? tryDecodeURIComponent(value) : value;\n }\n }\n return decoded;\n }\n #getParamValue(paramKey) {\n return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey;\n }\n query(key) {\n return getQueryParam(this.url, key);\n }\n queries(key) {\n return getQueryParams(this.url, key);\n }\n header(name) {\n if (name) {\n return this.raw.headers.get(name) ?? void 0;\n }\n const headerData = {};\n this.raw.headers.forEach((value, key) => {\n headerData[key] = value;\n });\n return headerData;\n }\n async parseBody(options) {\n return parseBody(this, options);\n }\n #cachedBody = (key) => {\n const { bodyCache, raw } = this;\n const cachedBody = bodyCache[key];\n if (cachedBody) {\n return cachedBody;\n }\n const anyCachedKey = Object.keys(bodyCache)[0];\n if (anyCachedKey) {\n return bodyCache[anyCachedKey].then((body) => {\n if (anyCachedKey === \"json\") {\n body = JSON.stringify(body);\n }\n return new Response(body)[key]();\n });\n }\n return bodyCache[key] = raw[key]();\n };\n /**\n * `.json()` can parse Request body of type `application/json`\n *\n * @see {@link https://hono.dev/docs/api/request#json}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.json()\n * })\n * ```\n */\n json() {\n return this.#cachedBody(\"text\").then((text) => JSON.parse(text));\n }\n /**\n * `.text()` can parse Request body of type `text/plain`\n *\n * @see {@link https://hono.dev/docs/api/request#text}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.text()\n * })\n * ```\n */\n text() {\n return this.#cachedBody(\"text\");\n }\n /**\n * `.arrayBuffer()` parse Request body as an `ArrayBuffer`\n *\n * @see {@link https://hono.dev/docs/api/request#arraybuffer}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.arrayBuffer()\n * })\n * ```\n */\n arrayBuffer() {\n return this.#cachedBody(\"arrayBuffer\");\n }\n /**\n * `.bytes()` parses the request body as a `Uint8Array`.\n *\n * @see {@link https://hono.dev/docs/api/request#bytes}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.bytes()\n * })\n * ```\n */\n bytes() {\n return this.#cachedBody(\"arrayBuffer\").then((buffer) => new Uint8Array(buffer));\n }\n /**\n * Parses the request body as a `Blob`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.blob();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#blob\n */\n blob() {\n return this.#cachedBody(\"blob\");\n }\n /**\n * Parses the request body as `FormData`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.formData();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#formdata\n */\n formData() {\n return this.#cachedBody(\"formData\");\n }\n /**\n * Adds validated data to the request.\n *\n * @param target - The target of the validation.\n * @param data - The validated data to add.\n */\n addValidatedData(target, data) {\n this.#validatedData[target] = data;\n }\n valid(target) {\n return this.#validatedData[target];\n }\n /**\n * `.url()` can get the request url strings.\n *\n * @see {@link https://hono.dev/docs/api/request#url}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const url = c.req.url // `http://localhost:8787/about/me`\n * ...\n * })\n * ```\n */\n get url() {\n return this.raw.url;\n }\n /**\n * `.method()` can get the method name of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#method}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const method = c.req.method // `GET`\n * })\n * ```\n */\n get method() {\n return this.raw.method;\n }\n get [GET_MATCH_RESULT]() {\n return this.#matchResult;\n }\n /**\n * `.matchedRoutes()` can return a matched route in the handler\n *\n * @deprecated\n *\n * Use matchedRoutes helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#matchedroutes}\n *\n * @example\n * ```ts\n * app.use('*', async function logger(c, next) {\n * await next()\n * c.req.matchedRoutes.forEach(({ handler, method, path }, i) => {\n * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]')\n * console.log(\n * method,\n * ' ',\n * path,\n * ' '.repeat(Math.max(10 - path.length, 0)),\n * name,\n * i === c.req.routeIndex ? '<- respond from here' : ''\n * )\n * })\n * })\n * ```\n */\n get matchedRoutes() {\n return this.#matchResult[0].map(([[, route]]) => route);\n }\n /**\n * `routePath()` can retrieve the path registered within the handler\n *\n * @deprecated\n *\n * Use routePath helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#routepath}\n *\n * @example\n * ```ts\n * app.get('/posts/:id', (c) => {\n * return c.json({ path: c.req.routePath })\n * })\n * ```\n */\n get routePath() {\n return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path;\n }\n};\nvar cloneRawRequest = async (req) => {\n if (!req.raw.bodyUsed) {\n return req.raw.clone();\n }\n const cacheKey = Object.keys(req.bodyCache)[0];\n if (!cacheKey) {\n throw new HTTPException(500, {\n message: \"Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly.\"\n });\n }\n const requestInit = {\n body: await req[cacheKey](),\n cache: req.raw.cache,\n credentials: req.raw.credentials,\n headers: req.header(),\n integrity: req.raw.integrity,\n keepalive: req.raw.keepalive,\n method: req.method,\n mode: req.raw.mode,\n redirect: req.raw.redirect,\n referrer: req.raw.referrer,\n referrerPolicy: req.raw.referrerPolicy,\n signal: req.raw.signal\n };\n return new Request(req.url, requestInit);\n};\nexport {\n HonoRequest,\n cloneRawRequest\n};\n","// src/utils/html.ts\nvar HtmlEscapedCallbackPhase = {\n Stringify: 1,\n BeforeStream: 2,\n Stream: 3\n};\nvar raw = (value, callbacks) => {\n const escapedString = new String(value);\n escapedString.isEscaped = true;\n escapedString.callbacks = callbacks;\n return escapedString;\n};\nvar escapeRe = /[&<>'\"]/;\nvar stringBufferToString = async (buffer, callbacks) => {\n let str = \"\";\n callbacks ||= [];\n const resolvedBuffer = await Promise.all(buffer);\n for (let i = resolvedBuffer.length - 1; ; i--) {\n str += resolvedBuffer[i];\n i--;\n if (i < 0) {\n break;\n }\n let r = resolvedBuffer[i];\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n const isEscaped = r.isEscaped;\n r = await (typeof r === \"object\" ? r.toString() : r);\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n if (r.isEscaped ?? isEscaped) {\n str += r;\n } else {\n const buf = [str];\n escapeToBuffer(r, buf);\n str = buf[0];\n }\n }\n return raw(str, callbacks);\n};\nvar escapeToBuffer = (str, buffer) => {\n const match = str.search(escapeRe);\n if (match === -1) {\n buffer[0] += str;\n return;\n }\n let escape;\n let index;\n let lastIndex = 0;\n for (index = match; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escape = \""\";\n break;\n case 39:\n escape = \"'\";\n break;\n case 38:\n escape = \"&\";\n break;\n case 60:\n escape = \"<\";\n break;\n case 62:\n escape = \">\";\n break;\n default:\n continue;\n }\n buffer[0] += str.substring(lastIndex, index) + escape;\n lastIndex = index + 1;\n }\n buffer[0] += str.substring(lastIndex, index);\n};\nvar resolveCallbackSync = (str) => {\n const callbacks = str.callbacks;\n if (!callbacks?.length) {\n return str;\n }\n const buffer = [str];\n const context = {};\n callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context }));\n return buffer[0];\n};\nvar resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => {\n if (typeof str === \"object\" && !(str instanceof String)) {\n if (!(str instanceof Promise)) {\n str = str.toString();\n }\n if (str instanceof Promise) {\n str = await str;\n }\n }\n const callbacks = str.callbacks;\n if (!callbacks?.length) {\n return Promise.resolve(str);\n }\n if (buffer) {\n buffer[0] += str;\n } else {\n buffer = [str];\n }\n const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then(\n (res) => Promise.all(\n res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer))\n ).then(() => buffer[0])\n );\n if (preserveCallbacks) {\n return raw(await resStr, callbacks);\n } else {\n return resStr;\n }\n};\nexport {\n HtmlEscapedCallbackPhase,\n escapeToBuffer,\n raw,\n resolveCallback,\n resolveCallbackSync,\n stringBufferToString\n};\n","// src/context.ts\nimport { HonoRequest } from \"./request.js\";\nimport { HtmlEscapedCallbackPhase, resolveCallback } from \"./utils/html.js\";\nvar TEXT_PLAIN = \"text/plain; charset=UTF-8\";\nvar setDefaultContentType = (contentType, headers) => {\n return {\n \"Content-Type\": contentType,\n ...headers\n };\n};\nvar createResponseInstance = (body, init) => new Response(body, init);\nvar Context = class {\n #rawRequest;\n #req;\n /**\n * `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers.\n *\n * @see {@link https://hono.dev/docs/api/context#env}\n *\n * @example\n * ```ts\n * // Environment object for Cloudflare Workers\n * app.get('*', async c => {\n * const counter = c.env.COUNTER\n * })\n * ```\n */\n env = {};\n #var;\n finalized = false;\n /**\n * `.error` can get the error object from the middleware if the Handler throws an error.\n *\n * @see {@link https://hono.dev/docs/api/context#error}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * await next()\n * if (c.error) {\n * // do something...\n * }\n * })\n * ```\n */\n error;\n #status;\n #executionCtx;\n #res;\n #layout;\n #renderer;\n #notFoundHandler;\n #preparedHeaders;\n #matchResult;\n #path;\n /**\n * Creates an instance of the Context class.\n *\n * @param req - The Request object.\n * @param options - Optional configuration options for the context.\n */\n constructor(req, options) {\n this.#rawRequest = req;\n if (options) {\n this.#executionCtx = options.executionCtx;\n this.env = options.env;\n this.#notFoundHandler = options.notFoundHandler;\n this.#path = options.path;\n this.#matchResult = options.matchResult;\n }\n }\n /**\n * `.req` is the instance of {@link HonoRequest}.\n */\n get req() {\n this.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult);\n return this.#req;\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#event}\n * The FetchEvent associated with the current request.\n *\n * @throws Will throw an error if the context does not have a FetchEvent.\n */\n get event() {\n if (this.#executionCtx && \"respondWith\" in this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no FetchEvent\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#executionctx}\n * The ExecutionContext associated with the current request.\n *\n * @throws Will throw an error if the context does not have an ExecutionContext.\n */\n get executionCtx() {\n if (this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no ExecutionContext\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#res}\n * The Response object for the current request.\n */\n get res() {\n return this.#res ||= createResponseInstance(null, {\n headers: this.#preparedHeaders ??= new Headers()\n });\n }\n /**\n * Sets the Response object for the current request.\n *\n * @param _res - The Response object to set.\n */\n set res(_res) {\n if (this.#res && _res) {\n _res = createResponseInstance(_res.body, _res);\n for (const [k, v] of this.#res.headers.entries()) {\n if (k === \"content-type\") {\n continue;\n }\n if (k === \"set-cookie\") {\n const cookies = this.#res.headers.getSetCookie();\n _res.headers.delete(\"set-cookie\");\n for (const cookie of cookies) {\n _res.headers.append(\"set-cookie\", cookie);\n }\n } else {\n _res.headers.set(k, v);\n }\n }\n }\n this.#res = _res;\n this.finalized = true;\n }\n /**\n * `.render()` can create a response within a layout.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * return c.render('Hello!')\n * })\n * ```\n */\n render = (...args) => {\n this.#renderer ??= (content) => this.html(content);\n return this.#renderer(...args);\n };\n /**\n * Sets the layout for the response.\n *\n * @param layout - The layout to set.\n * @returns The layout function.\n */\n setLayout = (layout) => this.#layout = layout;\n /**\n * Gets the current layout for the response.\n *\n * @returns The current layout function.\n */\n getLayout = () => this.#layout;\n /**\n * `.setRenderer()` can set the layout in the custom middleware.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```tsx\n * app.use('*', async (c, next) => {\n * c.setRenderer((content) => {\n * return c.html(\n * <html>\n * <body>\n * <p>{content}</p>\n * </body>\n * </html>\n * )\n * })\n * await next()\n * })\n * ```\n */\n setRenderer = (renderer) => {\n this.#renderer = renderer;\n };\n /**\n * `.header()` can set headers.\n *\n * @see {@link https://hono.dev/docs/api/context#header}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n *\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n header = (name, value, options) => {\n if (this.finalized) {\n this.#res = createResponseInstance(this.#res.body, this.#res);\n }\n const headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers();\n if (value === void 0) {\n headers.delete(name);\n } else if (options?.append) {\n headers.append(name, value);\n } else {\n headers.set(name, value);\n }\n };\n status = (status) => {\n this.#status = status;\n };\n /**\n * `.set()` can set the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * c.set('message', 'Hono is hot!!')\n * await next()\n * })\n * ```\n */\n set = (key, value) => {\n this.#var ??= /* @__PURE__ */ new Map();\n this.#var.set(key, value);\n };\n /**\n * `.get()` can use the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * const message = c.get('message')\n * return c.text(`The message is \"${message}\"`)\n * })\n * ```\n */\n get = (key) => {\n return this.#var ? this.#var.get(key) : void 0;\n };\n /**\n * `.var` can access the value of a variable.\n *\n * @see {@link https://hono.dev/docs/api/context#var}\n *\n * @example\n * ```ts\n * const result = c.var.client.oneMethod()\n * ```\n */\n // c.var.propName is a read-only\n get var() {\n if (!this.#var) {\n return {};\n }\n return Object.fromEntries(this.#var);\n }\n #newResponse(data, arg, headers) {\n const responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders ?? new Headers();\n if (typeof arg === \"object\" && \"headers\" in arg) {\n const argHeaders = arg.headers instanceof Headers ? arg.headers : new Headers(arg.headers);\n for (const [key, value] of argHeaders) {\n if (key.toLowerCase() === \"set-cookie\") {\n responseHeaders.append(key, value);\n } else {\n responseHeaders.set(key, value);\n }\n }\n }\n if (headers) {\n for (const [k, v] of Object.entries(headers)) {\n if (typeof v === \"string\") {\n responseHeaders.set(k, v);\n } else {\n responseHeaders.delete(k);\n for (const v2 of v) {\n responseHeaders.append(k, v2);\n }\n }\n }\n }\n const status = typeof arg === \"number\" ? arg : arg?.status ?? this.#status;\n return createResponseInstance(data, { status, headers: responseHeaders });\n }\n newResponse = (...args) => this.#newResponse(...args);\n /**\n * `.body()` can return the HTTP response.\n * You can set headers with `.header()` and set HTTP status code with `.status`.\n * This can also be set in `.text()`, `.json()` and so on.\n *\n * @see {@link https://hono.dev/docs/api/context#body}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n * // Set HTTP status code\n * c.status(201)\n *\n * // Return the response body\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n body = (data, arg, headers) => this.#newResponse(data, arg, headers);\n /**\n * `.text()` can render text as `Content-Type:text/plain`.\n *\n * @see {@link https://hono.dev/docs/api/context#text}\n *\n * @example\n * ```ts\n * app.get('/say', (c) => {\n * return c.text('Hello!')\n * })\n * ```\n */\n text = (text, arg, headers) => {\n return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse(\n text,\n arg,\n setDefaultContentType(TEXT_PLAIN, headers)\n );\n };\n /**\n * `.json()` can render JSON as `Content-Type:application/json`.\n *\n * @see {@link https://hono.dev/docs/api/context#json}\n *\n * @example\n * ```ts\n * app.get('/api', (c) => {\n * return c.json({ message: 'Hello!' })\n * })\n * ```\n */\n json = (object, arg, headers) => {\n return this.#newResponse(\n JSON.stringify(object),\n arg,\n setDefaultContentType(\"application/json\", headers)\n );\n };\n html = (html, arg, headers) => {\n const res = (html2) => this.#newResponse(html2, arg, setDefaultContentType(\"text/html; charset=UTF-8\", headers));\n return typeof html === \"object\" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html);\n };\n /**\n * `.redirect()` can Redirect, default status code is 302.\n *\n * @see {@link https://hono.dev/docs/api/context#redirect}\n *\n * @example\n * ```ts\n * app.get('/redirect', (c) => {\n * return c.redirect('/')\n * })\n * app.get('/redirect-permanently', (c) => {\n * return c.redirect('/', 301)\n * })\n * ```\n */\n redirect = (location, status) => {\n const locationString = String(location);\n this.header(\n \"Location\",\n // Multibyes should be encoded\n // eslint-disable-next-line no-control-regex\n !/[^\\x00-\\xFF]/.test(locationString) ? locationString : encodeURI(locationString)\n );\n return this.newResponse(null, status ?? 302);\n };\n /**\n * `.notFound()` can return the Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/context#notfound}\n *\n * @example\n * ```ts\n * app.get('/notfound', (c) => {\n * return c.notFound()\n * })\n * ```\n */\n notFound = () => {\n this.#notFoundHandler ??= () => createResponseInstance();\n return this.#notFoundHandler(this);\n };\n};\nexport {\n Context,\n TEXT_PLAIN\n};\n","// src/router.ts\nvar METHOD_NAME_ALL = \"ALL\";\nvar METHOD_NAME_ALL_LOWERCASE = \"all\";\nvar METHODS = [\"get\", \"post\", \"put\", \"delete\", \"options\", \"patch\"];\nvar MESSAGE_MATCHER_IS_ALREADY_BUILT = \"Can not add a route since the matcher is already built.\";\nvar UnsupportedPathError = class extends Error {\n};\nexport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHODS,\n METHOD_NAME_ALL,\n METHOD_NAME_ALL_LOWERCASE,\n UnsupportedPathError\n};\n","// src/utils/constants.ts\nvar COMPOSED_HANDLER = \"__COMPOSED_HANDLER\";\nexport {\n COMPOSED_HANDLER\n};\n","// src/hono-base.ts\nimport { compose } from \"./compose.js\";\nimport { Context } from \"./context.js\";\nimport { METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE } from \"./router.js\";\nimport { COMPOSED_HANDLER } from \"./utils/constants.js\";\nimport { getPath, getPathNoStrict, mergePath } from \"./utils/url.js\";\nvar notFoundHandler = (c) => {\n return c.text(\"404 Not Found\", 404);\n};\nvar errorHandler = (err, c) => {\n if (\"getResponse\" in err) {\n const res = err.getResponse();\n return c.newResponse(res.body, res);\n }\n console.error(err);\n return c.text(\"Internal Server Error\", 500);\n};\nvar Hono = class _Hono {\n get;\n post;\n put;\n delete;\n options;\n patch;\n all;\n on;\n use;\n /*\n This class is like an abstract class and does not have a router.\n To use it, inherit the class and implement router in the constructor.\n */\n router;\n getPath;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n _basePath = \"/\";\n #path = \"/\";\n routes = [];\n constructor(options = {}) {\n const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE];\n allMethods.forEach((method) => {\n this[method] = (args1, ...args) => {\n if (typeof args1 === \"string\") {\n this.#path = args1;\n } else {\n this.#addRoute(method, this.#path, args1);\n }\n args.forEach((handler) => {\n this.#addRoute(method, this.#path, handler);\n });\n return this;\n };\n });\n this.on = (method, path, ...handlers) => {\n for (const p of [path].flat()) {\n this.#path = p;\n for (const m of [method].flat()) {\n handlers.map((handler) => {\n this.#addRoute(m.toUpperCase(), this.#path, handler);\n });\n }\n }\n return this;\n };\n this.use = (arg1, ...handlers) => {\n if (typeof arg1 === \"string\") {\n this.#path = arg1;\n } else {\n this.#path = \"*\";\n handlers.unshift(arg1);\n }\n handlers.forEach((handler) => {\n this.#addRoute(METHOD_NAME_ALL, this.#path, handler);\n });\n return this;\n };\n const { strict, ...optionsWithoutStrict } = options;\n Object.assign(this, optionsWithoutStrict);\n this.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict;\n }\n #clone() {\n const clone = new _Hono({\n router: this.router,\n getPath: this.getPath\n });\n clone.errorHandler = this.errorHandler;\n clone.#notFoundHandler = this.#notFoundHandler;\n clone.routes = this.routes;\n return clone;\n }\n #notFoundHandler = notFoundHandler;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n errorHandler = errorHandler;\n /**\n * `.route()` allows grouping other Hono instance in routes.\n *\n * @see {@link https://hono.dev/docs/api/routing#grouping}\n *\n * @param {string} path - base Path\n * @param {Hono} app - other Hono instance\n * @returns {Hono} routed Hono instance\n *\n * @example\n * ```ts\n * const app = new Hono()\n * const app2 = new Hono()\n *\n * app2.get(\"/user\", (c) => c.text(\"user\"))\n * app.route(\"/api\", app2) // GET /api/user\n * ```\n */\n route(path, app) {\n const subApp = this.basePath(path);\n app.routes.map((r) => {\n let handler;\n if (app.errorHandler === errorHandler) {\n handler = r.handler;\n } else {\n handler = async (c, next) => (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res;\n handler[COMPOSED_HANDLER] = r.handler;\n }\n subApp.#addRoute(r.method, r.path, handler, r.basePath);\n });\n return this;\n }\n /**\n * `.basePath()` allows base paths to be specified.\n *\n * @see {@link https://hono.dev/docs/api/routing#base-path}\n *\n * @param {string} path - base Path\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * const api = new Hono().basePath('/api')\n * ```\n */\n basePath(path) {\n const subApp = this.#clone();\n subApp._basePath = mergePath(this._basePath, path);\n return subApp;\n }\n /**\n * `.onError()` handles an error and returns a customized Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#error-handling}\n *\n * @param {ErrorHandler} handler - request Handler for error\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.onError((err, c) => {\n * console.error(`${err}`)\n * return c.text('Custom Error Message', 500)\n * })\n * ```\n */\n onError = (handler) => {\n this.errorHandler = handler;\n return this;\n };\n /**\n * `.notFound()` allows you to customize a Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#not-found}\n *\n * @param {NotFoundHandler} handler - request handler for not-found\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.notFound((c) => {\n * return c.text('Custom 404 Message', 404)\n * })\n * ```\n */\n notFound = (handler) => {\n this.#notFoundHandler = handler;\n return this;\n };\n /**\n * `.mount()` allows you to mount applications built with other frameworks into your Hono application.\n *\n * @see {@link https://hono.dev/docs/api/hono#mount}\n *\n * @param {string} path - base Path\n * @param {Function} applicationHandler - other Request Handler\n * @param {MountOptions} [options] - options of `.mount()`\n * @returns {Hono} mounted Hono instance\n *\n * @example\n * ```ts\n * import { Router as IttyRouter } from 'itty-router'\n * import { Hono } from 'hono'\n * // Create itty-router application\n * const ittyRouter = IttyRouter()\n * // GET /itty-router/hello\n * ittyRouter.get('/hello', () => new Response('Hello from itty-router'))\n *\n * const app = new Hono()\n * app.mount('/itty-router', ittyRouter.handle)\n * ```\n *\n * @example\n * ```ts\n * const app = new Hono()\n * // Send the request to another application without modification.\n * app.mount('/app', anotherApp, {\n * replaceRequest: (req) => req,\n * })\n * ```\n */\n mount(path, applicationHandler, options) {\n let replaceRequest;\n let optionHandler;\n if (options) {\n if (typeof options === \"function\") {\n optionHandler = options;\n } else {\n optionHandler = options.optionHandler;\n if (options.replaceRequest === false) {\n replaceRequest = (request) => request;\n } else {\n replaceRequest = options.replaceRequest;\n }\n }\n }\n const getOptions = optionHandler ? (c) => {\n const options2 = optionHandler(c);\n return Array.isArray(options2) ? options2 : [options2];\n } : (c) => {\n let executionContext = void 0;\n try {\n executionContext = c.executionCtx;\n } catch {\n }\n return [c.env, executionContext];\n };\n replaceRequest ||= (() => {\n const mergedPath = mergePath(this._basePath, path);\n const pathPrefixLength = mergedPath === \"/\" ? 0 : mergedPath.length;\n return (request) => {\n const url = new URL(request.url);\n url.pathname = this.getPath(request).slice(pathPrefixLength) || \"/\";\n return new Request(url, request);\n };\n })();\n const handler = async (c, next) => {\n const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c));\n if (res) {\n return res;\n }\n await next();\n };\n this.#addRoute(METHOD_NAME_ALL, mergePath(path, \"*\"), handler);\n return this;\n }\n #addRoute(method, path, handler, baseRoutePath) {\n method = method.toUpperCase();\n path = mergePath(this._basePath, path);\n const r = {\n basePath: baseRoutePath !== void 0 ? mergePath(this._basePath, baseRoutePath) : this._basePath,\n path,\n method,\n handler\n };\n this.router.add(method, path, [handler, r]);\n this.routes.push(r);\n }\n #handleError(err, c) {\n if (err instanceof Error) {\n return this.errorHandler(err, c);\n }\n throw err;\n }\n #dispatch(request, executionCtx, env, method) {\n if (method === \"HEAD\") {\n return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, \"GET\")))();\n }\n const path = this.getPath(request, { env });\n const matchResult = this.router.match(method, path);\n const c = new Context(request, {\n path,\n matchResult,\n env,\n executionCtx,\n notFoundHandler: this.#notFoundHandler\n });\n if (matchResult[0].length === 1) {\n let res;\n try {\n res = matchResult[0][0][0][0](c, async () => {\n c.res = await this.#notFoundHandler(c);\n });\n } catch (err) {\n return this.#handleError(err, c);\n }\n return res instanceof Promise ? res.then(\n (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c))\n ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c);\n }\n const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler);\n return (async () => {\n try {\n const context = await composed(c);\n if (!context.finalized) {\n throw new Error(\n \"Context is not finalized. Did you forget to return a Response object or `await next()`?\"\n );\n }\n return context.res;\n } catch (err) {\n return this.#handleError(err, c);\n }\n })();\n }\n /**\n * `.fetch()` will be entry point of your app.\n *\n * @see {@link https://hono.dev/docs/api/hono#fetch}\n *\n * @param {Request} request - request Object of request\n * @param {Env} Env - env Object\n * @param {ExecutionContext} - context of execution\n * @returns {Response | Promise<Response>} response of request\n *\n */\n fetch = (request, ...rest) => {\n return this.#dispatch(request, rest[1], rest[0], request.method);\n };\n /**\n * `.request()` is a useful method for testing.\n * You can pass a URL or pathname to send a GET request.\n * app will return a Response object.\n * ```ts\n * test('GET /hello is ok', async () => {\n * const res = await app.request('/hello')\n * expect(res.status).toBe(200)\n * })\n * ```\n * @see https://hono.dev/docs/api/hono#request\n */\n request = (input, requestInit, Env, executionCtx) => {\n if (input instanceof Request) {\n return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx);\n }\n input = input.toString();\n return this.fetch(\n new Request(\n /^https?:\\/\\//.test(input) ? input : `http://localhost${mergePath(\"/\", input)}`,\n requestInit\n ),\n Env,\n executionCtx\n );\n };\n /**\n * `.fire()` automatically adds a global fetch event listener.\n * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers.\n * @deprecated\n * Use `fire` from `hono/service-worker` instead.\n * ```ts\n * import { Hono } from 'hono'\n * import { fire } from 'hono/service-worker'\n *\n * const app = new Hono()\n * // ...\n * fire(app)\n * ```\n * @see https://hono.dev/docs/api/hono#fire\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API\n * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/\n */\n fire = () => {\n addEventListener(\"fetch\", (event) => {\n event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method));\n });\n };\n};\nexport {\n Hono as HonoBase\n};\n","// src/router/reg-exp-router/matcher.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nvar emptyParam = [];\nfunction match(method, path) {\n const matchers = this.buildAllMatchers();\n const match2 = ((method2, path2) => {\n const matcher = matchers[method2] || matchers[METHOD_NAME_ALL];\n const staticMatch = matcher[2][path2];\n if (staticMatch) {\n return staticMatch;\n }\n const match3 = path2.match(matcher[0]);\n if (!match3) {\n return [[], emptyParam];\n }\n const index = match3.indexOf(\"\", 1);\n return [matcher[1][index], match3];\n });\n this.match = match2;\n return match2(method, path);\n}\nexport {\n emptyParam,\n match\n};\n","// src/router/reg-exp-router/node.ts\nvar LABEL_REG_EXP_STR = \"[^/]+\";\nvar ONLY_WILDCARD_REG_EXP_STR = \".*\";\nvar TAIL_WILDCARD_REG_EXP_STR = \"(?:|/.*)\";\nvar PATH_ERROR = /* @__PURE__ */ Symbol();\nvar regExpMetaChars = new Set(\".\\\\+*[^]$()\");\nfunction compareKey(a, b) {\n if (a.length === 1) {\n return b.length === 1 ? a < b ? -1 : 1 : -1;\n }\n if (b.length === 1) {\n return 1;\n }\n if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) {\n return 1;\n } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) {\n return -1;\n }\n if (a === LABEL_REG_EXP_STR) {\n return 1;\n } else if (b === LABEL_REG_EXP_STR) {\n return -1;\n }\n return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length;\n}\nvar Node = class _Node {\n #index;\n #varIndex;\n #children = /* @__PURE__ */ Object.create(null);\n insert(tokens, index, paramMap, context, pathErrorCheckOnly) {\n if (tokens.length === 0) {\n if (this.#index !== void 0) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n this.#index = index;\n return;\n }\n const [token, ...restTokens] = tokens;\n const pattern = token === \"*\" ? restTokens.length === 0 ? [\"\", \"\", ONLY_WILDCARD_REG_EXP_STR] : [\"\", \"\", LABEL_REG_EXP_STR] : token === \"/*\" ? [\"\", \"\", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n let node;\n if (pattern) {\n const name = pattern[1];\n let regexpStr = pattern[2] || LABEL_REG_EXP_STR;\n if (name && pattern[2]) {\n if (regexpStr === \".*\") {\n throw PATH_ERROR;\n }\n regexpStr = regexpStr.replace(/^\\((?!\\?:)(?=[^)]+\\)$)/, \"(?:\");\n if (/\\((?!\\?:)/.test(regexpStr)) {\n throw PATH_ERROR;\n }\n }\n node = this.#children[regexpStr];\n if (!node) {\n if (Object.keys(this.#children).some(\n (k) => k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n )) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n node = this.#children[regexpStr] = new _Node();\n if (name !== \"\") {\n node.#varIndex = context.varIndex++;\n }\n }\n if (!pathErrorCheckOnly && name !== \"\") {\n paramMap.push([name, node.#varIndex]);\n }\n } else {\n node = this.#children[token];\n if (!node) {\n if (Object.keys(this.#children).some(\n (k) => k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n )) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n node = this.#children[token] = new _Node();\n }\n }\n node.insert(restTokens, index, paramMap, context, pathErrorCheckOnly);\n }\n buildRegExpStr() {\n const childKeys = Object.keys(this.#children).sort(compareKey);\n const strList = childKeys.map((k) => {\n const c = this.#children[k];\n return (typeof c.#varIndex === \"number\" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\\\${k}` : k) + c.buildRegExpStr();\n });\n if (typeof this.#index === \"number\") {\n strList.unshift(`#${this.#index}`);\n }\n if (strList.length === 0) {\n return \"\";\n }\n if (strList.length === 1) {\n return strList[0];\n }\n return \"(?:\" + strList.join(\"|\") + \")\";\n }\n};\nexport {\n Node,\n PATH_ERROR\n};\n","// src/router/reg-exp-router/trie.ts\nimport { Node } from \"./node.js\";\nvar Trie = class {\n #context = { varIndex: 0 };\n #root = new Node();\n insert(path, index, pathErrorCheckOnly) {\n const paramAssoc = [];\n const groups = [];\n for (let i = 0; ; ) {\n let replaced = false;\n path = path.replace(/\\{[^}]+\\}/g, (m) => {\n const mark = `@\\\\${i}`;\n groups[i] = [mark, m];\n i++;\n replaced = true;\n return mark;\n });\n if (!replaced) {\n break;\n }\n }\n const tokens = path.match(/(?::[^\\/]+)|(?:\\/\\*$)|./g) || [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = tokens.length - 1; j >= 0; j--) {\n if (tokens[j].indexOf(mark) !== -1) {\n tokens[j] = tokens[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n this.#root.insert(tokens, index, paramAssoc, this.#context, pathErrorCheckOnly);\n return paramAssoc;\n }\n buildRegExp() {\n let regexp = this.#root.buildRegExpStr();\n if (regexp === \"\") {\n return [/^$/, [], []];\n }\n let captureIndex = 0;\n const indexReplacementMap = [];\n const paramReplacementMap = [];\n regexp = regexp.replace(/#(\\d+)|@(\\d+)|\\.\\*\\$/g, (_, handlerIndex, paramIndex) => {\n if (handlerIndex !== void 0) {\n indexReplacementMap[++captureIndex] = Number(handlerIndex);\n return \"$()\";\n }\n if (paramIndex !== void 0) {\n paramReplacementMap[Number(paramIndex)] = ++captureIndex;\n return \"\";\n }\n return \"\";\n });\n return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap];\n }\n};\nexport {\n Trie\n};\n","// src/router/reg-exp-router/router.ts\nimport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHOD_NAME_ALL,\n UnsupportedPathError\n} from \"../../router.js\";\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { match, emptyParam } from \"./matcher.js\";\nimport { PATH_ERROR } from \"./node.js\";\nimport { Trie } from \"./trie.js\";\nvar nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)];\nvar wildcardRegExpCache = /* @__PURE__ */ Object.create(null);\nfunction buildWildcardRegExp(path) {\n return wildcardRegExpCache[path] ??= new RegExp(\n path === \"*\" ? \"\" : `^${path.replace(\n /\\/\\*$|([.\\\\+*[^\\]$()])/g,\n (_, metaChar) => metaChar ? `\\\\${metaChar}` : \"(?:|/.*)\"\n )}$`\n );\n}\nfunction clearWildcardRegExpCache() {\n wildcardRegExpCache = /* @__PURE__ */ Object.create(null);\n}\nfunction buildMatcherFromPreprocessedRoutes(routes) {\n const trie = new Trie();\n const handlerData = [];\n if (routes.length === 0) {\n return nullMatcher;\n }\n const routesWithStaticPathFlag = routes.map(\n (route) => [!/\\*|\\/:/.test(route[0]), ...route]\n ).sort(\n ([isStaticA, pathA], [isStaticB, pathB]) => isStaticA ? 1 : isStaticB ? -1 : pathA.length - pathB.length\n );\n const staticMap = /* @__PURE__ */ Object.create(null);\n for (let i = 0, j = -1, len = routesWithStaticPathFlag.length; i < len; i++) {\n const [pathErrorCheckOnly, path, handlers] = routesWithStaticPathFlag[i];\n if (pathErrorCheckOnly) {\n staticMap[path] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam];\n } else {\n j++;\n }\n let paramAssoc;\n try {\n paramAssoc = trie.insert(path, j, pathErrorCheckOnly);\n } catch (e) {\n throw e === PATH_ERROR ? new UnsupportedPathError(path) : e;\n }\n if (pathErrorCheckOnly) {\n continue;\n }\n handlerData[j] = handlers.map(([h, paramCount]) => {\n const paramIndexMap = /* @__PURE__ */ Object.create(null);\n paramCount -= 1;\n for (; paramCount >= 0; paramCount--) {\n const [key, value] = paramAssoc[paramCount];\n paramIndexMap[key] = value;\n }\n return [h, paramIndexMap];\n });\n }\n const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp();\n for (let i = 0, len = handlerData.length; i < len; i++) {\n for (let j = 0, len2 = handlerData[i].length; j < len2; j++) {\n const map = handlerData[i][j]?.[1];\n if (!map) {\n continue;\n }\n const keys = Object.keys(map);\n for (let k = 0, len3 = keys.length; k < len3; k++) {\n map[keys[k]] = paramReplacementMap[map[keys[k]]];\n }\n }\n }\n const handlerMap = [];\n for (const i in indexReplacementMap) {\n handlerMap[i] = handlerData[indexReplacementMap[i]];\n }\n return [regexp, handlerMap, staticMap];\n}\nfunction findMiddleware(middleware, path) {\n if (!middleware) {\n return void 0;\n }\n for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) {\n if (buildWildcardRegExp(k).test(path)) {\n return [...middleware[k]];\n }\n }\n return void 0;\n}\nvar RegExpRouter = class {\n name = \"RegExpRouter\";\n #middleware;\n #routes;\n constructor() {\n this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };\n this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };\n }\n add(method, path, handler) {\n const middleware = this.#middleware;\n const routes = this.#routes;\n if (!middleware || !routes) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n if (!middleware[method]) {\n ;\n [middleware, routes].forEach((handlerMap) => {\n handlerMap[method] = /* @__PURE__ */ Object.create(null);\n Object.keys(handlerMap[METHOD_NAME_ALL]).forEach((p) => {\n handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]];\n });\n });\n }\n if (path === \"/*\") {\n path = \"*\";\n }\n const paramCount = (path.match(/\\/:/g) || []).length;\n if (/\\*$/.test(path)) {\n const re = buildWildcardRegExp(path);\n if (method === METHOD_NAME_ALL) {\n Object.keys(middleware).forEach((m) => {\n middleware[m][path] ||= findMiddleware(middleware[m], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || [];\n });\n } else {\n middleware[method][path] ||= findMiddleware(middleware[method], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || [];\n }\n Object.keys(middleware).forEach((m) => {\n if (method === METHOD_NAME_ALL || method === m) {\n Object.keys(middleware[m]).forEach((p) => {\n re.test(p) && middleware[m][p].push([handler, paramCount]);\n });\n }\n });\n Object.keys(routes).forEach((m) => {\n if (method === METHOD_NAME_ALL || method === m) {\n Object.keys(routes[m]).forEach(\n (p) => re.test(p) && routes[m][p].push([handler, paramCount])\n );\n }\n });\n return;\n }\n const paths = checkOptionalParameter(path) || [path];\n for (let i = 0, len = paths.length; i < len; i++) {\n const path2 = paths[i];\n Object.keys(routes).forEach((m) => {\n if (method === METHOD_NAME_ALL || method === m) {\n routes[m][path2] ||= [\n ...findMiddleware(middleware[m], path2) || findMiddleware(middleware[METHOD_NAME_ALL], path2) || []\n ];\n routes[m][path2].push([handler, paramCount - len + i + 1]);\n }\n });\n }\n }\n match = match;\n buildAllMatchers() {\n const matchers = /* @__PURE__ */ Object.create(null);\n Object.keys(this.#routes).concat(Object.keys(this.#middleware)).forEach((method) => {\n matchers[method] ||= this.#buildMatcher(method);\n });\n this.#middleware = this.#routes = void 0;\n clearWildcardRegExpCache();\n return matchers;\n }\n #buildMatcher(method) {\n const routes = [];\n let hasOwnRoute = method === METHOD_NAME_ALL;\n [this.#middleware, this.#routes].forEach((r) => {\n const ownRoute = r[method] ? Object.keys(r[method]).map((path) => [path, r[method][path]]) : [];\n if (ownRoute.length !== 0) {\n hasOwnRoute ||= true;\n routes.push(...ownRoute);\n } else if (method !== METHOD_NAME_ALL) {\n routes.push(\n ...Object.keys(r[METHOD_NAME_ALL]).map((path) => [path, r[METHOD_NAME_ALL][path]])\n );\n }\n });\n if (!hasOwnRoute) {\n return null;\n } else {\n return buildMatcherFromPreprocessedRoutes(routes);\n }\n }\n};\nexport {\n RegExpRouter\n};\n","// src/router/smart-router/router.ts\nimport { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from \"../../router.js\";\nvar SmartRouter = class {\n name = \"SmartRouter\";\n #routers = [];\n #routes = [];\n constructor(init) {\n this.#routers = init.routers;\n }\n add(method, path, handler) {\n if (!this.#routes) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n this.#routes.push([method, path, handler]);\n }\n match(method, path) {\n if (!this.#routes) {\n throw new Error(\"Fatal error\");\n }\n const routers = this.#routers;\n const routes = this.#routes;\n const len = routers.length;\n let i = 0;\n let res;\n for (; i < len; i++) {\n const router = routers[i];\n try {\n for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) {\n router.add(...routes[i2]);\n }\n res = router.match(method, path);\n } catch (e) {\n if (e instanceof UnsupportedPathError) {\n continue;\n }\n throw e;\n }\n this.match = router.match.bind(router);\n this.#routers = [router];\n this.#routes = void 0;\n break;\n }\n if (i === len) {\n throw new Error(\"Fatal error\");\n }\n this.name = `SmartRouter + ${this.activeRouter.name}`;\n return res;\n }\n get activeRouter() {\n if (this.#routes || this.#routers.length !== 1) {\n throw new Error(\"No active router has been determined yet.\");\n }\n return this.#routers[0];\n }\n};\nexport {\n SmartRouter\n};\n","// src/router/trie-router/node.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nimport { getPattern, splitPath, splitRoutingPath } from \"../../utils/url.js\";\nvar emptyParams = /* @__PURE__ */ Object.create(null);\nvar hasChildren = (children) => {\n for (const _ in children) {\n return true;\n }\n return false;\n};\nvar Node = class _Node {\n #methods;\n #children;\n #patterns;\n #order = 0;\n #params = emptyParams;\n constructor(method, handler, children) {\n this.#children = children || /* @__PURE__ */ Object.create(null);\n this.#methods = [];\n if (method && handler) {\n const m = /* @__PURE__ */ Object.create(null);\n m[method] = { handler, possibleKeys: [], score: 0 };\n this.#methods = [m];\n }\n this.#patterns = [];\n }\n insert(method, path, handler) {\n this.#order = ++this.#order;\n let curNode = this;\n const parts = splitRoutingPath(path);\n const possibleKeys = [];\n for (let i = 0, len = parts.length; i < len; i++) {\n const p = parts[i];\n const nextP = parts[i + 1];\n const pattern = getPattern(p, nextP);\n const key = Array.isArray(pattern) ? pattern[0] : p;\n if (key in curNode.#children) {\n curNode = curNode.#children[key];\n if (pattern) {\n possibleKeys.push(pattern[1]);\n }\n continue;\n }\n curNode.#children[key] = new _Node();\n if (pattern) {\n curNode.#patterns.push(pattern);\n possibleKeys.push(pattern[1]);\n }\n curNode = curNode.#children[key];\n }\n curNode.#methods.push({\n [method]: {\n handler,\n possibleKeys: possibleKeys.filter((v, i, a) => a.indexOf(v) === i),\n score: this.#order\n }\n });\n return curNode;\n }\n #pushHandlerSets(handlerSets, node, method, nodeParams, params) {\n for (let i = 0, len = node.#methods.length; i < len; i++) {\n const m = node.#methods[i];\n const handlerSet = m[method] || m[METHOD_NAME_ALL];\n const processedSet = {};\n if (handlerSet !== void 0) {\n handlerSet.params = /* @__PURE__ */ Object.create(null);\n handlerSets.push(handlerSet);\n if (nodeParams !== emptyParams || params && params !== emptyParams) {\n for (let i2 = 0, len2 = handlerSet.possibleKeys.length; i2 < len2; i2++) {\n const key = handlerSet.possibleKeys[i2];\n const processed = processedSet[handlerSet.score];\n handlerSet.params[key] = params?.[key] && !processed ? params[key] : nodeParams[key] ?? params?.[key];\n processedSet[handlerSet.score] = true;\n }\n }\n }\n }\n }\n search(method, path) {\n const handlerSets = [];\n this.#params = emptyParams;\n const curNode = this;\n let curNodes = [curNode];\n const parts = splitPath(path);\n const curNodesQueue = [];\n const len = parts.length;\n let partOffsets = null;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n const isLast = i === len - 1;\n const tempNodes = [];\n for (let j = 0, len2 = curNodes.length; j < len2; j++) {\n const node = curNodes[j];\n const nextNode = node.#children[part];\n if (nextNode) {\n nextNode.#params = node.#params;\n if (isLast) {\n if (nextNode.#children[\"*\"]) {\n this.#pushHandlerSets(handlerSets, nextNode.#children[\"*\"], method, node.#params);\n }\n this.#pushHandlerSets(handlerSets, nextNode, method, node.#params);\n } else {\n tempNodes.push(nextNode);\n }\n }\n for (let k = 0, len3 = node.#patterns.length; k < len3; k++) {\n const pattern = node.#patterns[k];\n const params = node.#params === emptyParams ? {} : { ...node.#params };\n if (pattern === \"*\") {\n const astNode = node.#children[\"*\"];\n if (astNode) {\n this.#pushHandlerSets(handlerSets, astNode, method, node.#params);\n astNode.#params = params;\n tempNodes.push(astNode);\n }\n continue;\n }\n const [key, name, matcher] = pattern;\n if (!part && !(matcher instanceof RegExp)) {\n continue;\n }\n const child = node.#children[key];\n if (matcher instanceof RegExp) {\n if (partOffsets === null) {\n partOffsets = new Array(len);\n let offset = path[0] === \"/\" ? 1 : 0;\n for (let p = 0; p < len; p++) {\n partOffsets[p] = offset;\n offset += parts[p].length + 1;\n }\n }\n const restPathString = path.substring(partOffsets[i]);\n const m = matcher.exec(restPathString);\n if (m) {\n params[name] = m[0];\n this.#pushHandlerSets(handlerSets, child, method, node.#params, params);\n if (hasChildren(child.#children)) {\n child.#params = params;\n const componentCount = m[0].match(/\\//)?.length ?? 0;\n const targetCurNodes = curNodesQueue[componentCount] ||= [];\n targetCurNodes.push(child);\n }\n continue;\n }\n }\n if (matcher === true || matcher.test(part)) {\n params[name] = part;\n if (isLast) {\n this.#pushHandlerSets(handlerSets, child, method, params, node.#params);\n if (child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n params,\n node.#params\n );\n }\n } else {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n }\n }\n const shifted = curNodesQueue.shift();\n curNodes = shifted ? tempNodes.concat(shifted) : tempNodes;\n }\n if (handlerSets.length > 1) {\n handlerSets.sort((a, b) => {\n return a.score - b.score;\n });\n }\n return [handlerSets.map(({ handler, params }) => [handler, params])];\n }\n};\nexport {\n Node\n};\n","// src/router/trie-router/router.ts\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { Node } from \"./node.js\";\nvar TrieRouter = class {\n name = \"TrieRouter\";\n #node;\n constructor() {\n this.#node = new Node();\n }\n add(method, path, handler) {\n const results = checkOptionalParameter(path);\n if (results) {\n for (let i = 0, len = results.length; i < len; i++) {\n this.#node.insert(method, results[i], handler);\n }\n return;\n }\n this.#node.insert(method, path, handler);\n }\n match(method, path) {\n return this.#node.search(method, path);\n }\n};\nexport {\n TrieRouter\n};\n","// src/hono.ts\nimport { HonoBase } from \"./hono-base.js\";\nimport { RegExpRouter } from \"./router/reg-exp-router/index.js\";\nimport { SmartRouter } from \"./router/smart-router/index.js\";\nimport { TrieRouter } from \"./router/trie-router/index.js\";\nvar Hono = class extends HonoBase {\n /**\n * Creates an instance of the Hono class.\n *\n * @param options - Optional configuration options for the Hono instance.\n */\n constructor(options = {}) {\n super(options);\n this.router = options.router ?? new SmartRouter({\n routers: [new RegExpRouter(), new TrieRouter()]\n });\n }\n};\nexport {\n Hono\n};\n","// src/utils/encode.ts\nvar decodeBase64Url = (str) => {\n return decodeBase64(str.replace(/_|-/g, (m) => ({ _: \"/\", \"-\": \"+\" })[m] ?? m));\n};\nvar encodeBase64Url = (buf) => encodeBase64(buf).replace(/\\/|\\+/g, (m) => ({ \"/\": \"_\", \"+\": \"-\" })[m] ?? m);\nvar encodeBase64 = (buf) => {\n let binary = \"\";\n const bytes = new Uint8Array(buf);\n for (let i = 0, len = bytes.length; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n};\nvar decodeBase64 = (str) => {\n const binary = atob(str);\n const bytes = new Uint8Array(new ArrayBuffer(binary.length));\n const half = binary.length / 2;\n for (let i = 0, j = binary.length - 1; i <= half; i++, j--) {\n bytes[i] = binary.charCodeAt(i);\n bytes[j] = binary.charCodeAt(j);\n }\n return bytes;\n};\nexport {\n decodeBase64,\n decodeBase64Url,\n encodeBase64,\n encodeBase64Url\n};\n","// src/utils/basic-auth.ts\nimport { decodeBase64 } from \"./encode.js\";\nvar CREDENTIALS_REGEXP = /^ *(?:[Bb][Aa][Ss][Ii][Cc]) +([A-Za-z0-9._~+/-]+=*) *$/;\nvar USER_PASS_REGEXP = /^([^:]*):(.*)$/;\nvar utf8Decoder = new TextDecoder();\nvar auth = (req) => {\n const match = CREDENTIALS_REGEXP.exec(req.headers.get(\"Authorization\") || \"\");\n if (!match) {\n return void 0;\n }\n let userPass = void 0;\n try {\n userPass = USER_PASS_REGEXP.exec(utf8Decoder.decode(decodeBase64(match[1])));\n } catch {\n }\n if (!userPass) {\n return void 0;\n }\n return { username: userPass[1], password: userPass[2] };\n};\nexport {\n auth\n};\n","// src/utils/crypto.ts\nvar sha256 = async (data) => {\n const algorithm = { name: \"SHA-256\", alias: \"sha256\" };\n const hash = await createHash(data, algorithm);\n return hash;\n};\nvar sha1 = async (data) => {\n const algorithm = { name: \"SHA-1\", alias: \"sha1\" };\n const hash = await createHash(data, algorithm);\n return hash;\n};\nvar md5 = async (data) => {\n const algorithm = { name: \"MD5\", alias: \"md5\" };\n const hash = await createHash(data, algorithm);\n return hash;\n};\nvar createHash = async (data, algorithm) => {\n let sourceBuffer;\n if (ArrayBuffer.isView(data) || data instanceof ArrayBuffer) {\n sourceBuffer = data;\n } else {\n if (typeof data === \"object\") {\n data = JSON.stringify(data);\n }\n sourceBuffer = new TextEncoder().encode(String(data));\n }\n if (crypto && crypto.subtle) {\n const buffer = await crypto.subtle.digest(\n {\n name: algorithm.name\n },\n sourceBuffer\n );\n const hash = Array.prototype.map.call(new Uint8Array(buffer), (x) => (\"00\" + x.toString(16)).slice(-2)).join(\"\");\n return hash;\n }\n return null;\n};\nexport {\n createHash,\n md5,\n sha1,\n sha256\n};\n","// src/utils/buffer.ts\nimport { sha256 } from \"./crypto.js\";\nvar equal = (a, b) => {\n if (a === b) {\n return true;\n }\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n const va = new DataView(a);\n const vb = new DataView(b);\n let i = va.byteLength;\n while (i--) {\n if (va.getUint8(i) !== vb.getUint8(i)) {\n return false;\n }\n }\n return true;\n};\nvar constantTimeEqualString = (a, b) => {\n const aLen = a.length;\n const bLen = b.length;\n const maxLen = Math.max(aLen, bLen);\n let out = aLen ^ bLen;\n for (let i = 0; i < maxLen; i++) {\n const aChar = i < aLen ? a.charCodeAt(i) : 0;\n const bChar = i < bLen ? b.charCodeAt(i) : 0;\n out |= aChar ^ bChar;\n }\n return out === 0;\n};\nvar timingSafeEqualString = async (a, b, hashFunction) => {\n if (!hashFunction) {\n hashFunction = sha256;\n }\n const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n if (sa == null || sb == null || typeof sa !== \"string\" || typeof sb !== \"string\") {\n return false;\n }\n const hashEqual = constantTimeEqualString(sa, sb);\n const originalEqual = constantTimeEqualString(a, b);\n return hashEqual && originalEqual;\n};\nvar timingSafeEqual = async (a, b, hashFunction) => {\n if (typeof a === \"string\" && typeof b === \"string\") {\n return timingSafeEqualString(a, b, hashFunction);\n }\n if (!hashFunction) {\n hashFunction = sha256;\n }\n const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n if (!sa || !sb || typeof sa !== \"string\" || typeof sb !== \"string\") {\n return false;\n }\n return timingSafeEqualString(sa, sb);\n};\nvar bufferToString = (buffer) => {\n if (buffer instanceof ArrayBuffer) {\n const enc = new TextDecoder(\"utf-8\");\n return enc.decode(buffer);\n }\n return buffer;\n};\nvar bufferToFormData = (arrayBuffer, contentType) => {\n const response = new Response(arrayBuffer, {\n headers: {\n \"Content-Type\": contentType\n }\n });\n return response.formData();\n};\nexport {\n bufferToFormData,\n bufferToString,\n equal,\n timingSafeEqual\n};\n","// src/middleware/basic-auth/index.ts\nimport { HTTPException } from \"../../http-exception.js\";\nimport { auth } from \"../../utils/basic-auth.js\";\nimport { timingSafeEqual } from \"../../utils/buffer.js\";\nvar basicAuth = (options, ...users) => {\n const usernamePasswordInOptions = \"username\" in options && \"password\" in options;\n const verifyUserInOptions = \"verifyUser\" in options;\n if (!(usernamePasswordInOptions || verifyUserInOptions)) {\n throw new Error(\n 'basic auth middleware requires options for \"username and password\" or \"verifyUser\"'\n );\n }\n if (!options.realm) {\n options.realm = \"Secure Area\";\n }\n if (!options.invalidUserMessage) {\n options.invalidUserMessage = \"Unauthorized\";\n }\n if (usernamePasswordInOptions) {\n users.unshift({ username: options.username, password: options.password });\n }\n return async function basicAuth2(ctx, next) {\n const requestUser = auth(ctx.req.raw);\n if (requestUser) {\n if (verifyUserInOptions) {\n if (await options.verifyUser(requestUser.username, requestUser.password, ctx)) {\n if (options.onAuthSuccess) {\n await options.onAuthSuccess(ctx, requestUser.username);\n }\n await next();\n return;\n }\n } else {\n for (const user of users) {\n const [usernameEqual, passwordEqual] = await Promise.all([\n timingSafeEqual(user.username, requestUser.username, options.hashFunction),\n timingSafeEqual(user.password, requestUser.password, options.hashFunction)\n ]);\n if (usernameEqual && passwordEqual) {\n if (options.onAuthSuccess) {\n await options.onAuthSuccess(ctx, requestUser.username);\n }\n await next();\n return;\n }\n }\n }\n }\n const status = 401;\n const headers = {\n \"WWW-Authenticate\": 'Basic realm=\"' + options.realm?.replace(/\"/g, '\\\\\"') + '\"'\n };\n const responseMessage = typeof options.invalidUserMessage === \"function\" ? await options.invalidUserMessage(ctx) : options.invalidUserMessage;\n const res = typeof responseMessage === \"string\" ? new Response(responseMessage, { status, headers }) : new Response(JSON.stringify(responseMessage), {\n status,\n headers: {\n ...headers,\n \"content-type\": \"application/json\"\n }\n });\n throw new HTTPException(status, { res });\n };\n};\nexport {\n basicAuth\n};\n","// src/middleware/cors/index.ts\nvar cors = (options) => {\n const opts = {\n origin: \"*\",\n allowMethods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\"],\n allowHeaders: [],\n exposeHeaders: [],\n ...options\n };\n const findAllowOrigin = ((optsOrigin) => {\n if (typeof optsOrigin === \"string\") {\n if (optsOrigin === \"*\") {\n if (opts.credentials) {\n return (origin) => origin || null;\n }\n return () => optsOrigin;\n } else {\n return (origin) => optsOrigin === origin ? origin : null;\n }\n } else if (typeof optsOrigin === \"function\") {\n return optsOrigin;\n } else {\n return (origin) => optsOrigin.includes(origin) ? origin : null;\n }\n })(opts.origin);\n const findAllowMethods = ((optsAllowMethods) => {\n if (typeof optsAllowMethods === \"function\") {\n return optsAllowMethods;\n } else if (Array.isArray(optsAllowMethods)) {\n return () => optsAllowMethods;\n } else {\n return () => [];\n }\n })(opts.allowMethods);\n return async function cors2(c, next) {\n function set(key, value) {\n c.res.headers.set(key, value);\n }\n const allowOrigin = await findAllowOrigin(c.req.header(\"origin\") || \"\", c);\n if (allowOrigin) {\n set(\"Access-Control-Allow-Origin\", allowOrigin);\n }\n if (opts.credentials) {\n set(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (opts.exposeHeaders?.length) {\n set(\"Access-Control-Expose-Headers\", opts.exposeHeaders.join(\",\"));\n }\n if (c.req.method === \"OPTIONS\") {\n if (opts.origin !== \"*\" || opts.credentials) {\n set(\"Vary\", \"Origin\");\n }\n if (opts.maxAge != null) {\n set(\"Access-Control-Max-Age\", opts.maxAge.toString());\n }\n const allowMethods = await findAllowMethods(c.req.header(\"origin\") || \"\", c);\n if (allowMethods.length) {\n set(\"Access-Control-Allow-Methods\", allowMethods.join(\",\"));\n }\n let headers = opts.allowHeaders;\n if (!headers?.length) {\n const requestHeaders = c.req.header(\"Access-Control-Request-Headers\");\n if (requestHeaders) {\n headers = requestHeaders.split(/\\s*,\\s*/);\n }\n }\n if (headers?.length) {\n set(\"Access-Control-Allow-Headers\", headers.join(\",\"));\n c.res.headers.append(\"Vary\", \"Access-Control-Request-Headers\");\n }\n c.res.headers.delete(\"Content-Length\");\n c.res.headers.delete(\"Content-Type\");\n return new Response(null, {\n headers: c.res.headers,\n status: 204,\n statusText: \"No Content\"\n });\n }\n await next();\n if (opts.origin !== \"*\" || opts.credentials) {\n c.header(\"Vary\", \"Origin\", { append: true });\n }\n };\n};\nexport {\n cors\n};\n","import { type Queue, QueueEvents } from \"bullmq\";\nimport { deliverToContactPoint } from \"./alert-destinations\";\nimport { type AlertStore, createAlertStore } from \"./alert-store\";\nimport type { QueueManager } from \"./queue-manager\";\nimport type {\n AlertDeliveryRecord,\n AlertEvent,\n AlertRule,\n AlertRuntimeStatus,\n AlertsOptions,\n AlertTrigger,\n} from \"./types\";\n\nconst HEALTH_CHECK_INTERVAL_MS = 30_000;\nconst MAX_RECENT_EVENTS = 100;\nconst MAX_DELIVERY_RECORDS = 50;\n\ninterface CooldownEntry {\n lastFiredAt: number;\n event?: AlertEvent;\n}\n\nexport class AlertManager {\n private readonly store: AlertStore;\n private readonly persistence: \"redis\" | \"memory\" | \"custom\";\n private readonly options: AlertsOptions;\n private readonly queueManager: QueueManager;\n private readonly getQueues: () => Map<string, Queue>;\n\n private queueEvents: QueueEvents[] = [];\n private listenerStatus = new Map<string, boolean>();\n private healthTimer: ReturnType<typeof setInterval> | null = null;\n private lastHealthCheckAt?: number;\n private recentEvents: AlertEvent[] = [];\n private lastDeliveries: AlertDeliveryRecord[] = [];\n private cooldowns = new Map<string, CooldownEntry>();\n private activeHealthAlerts = new Map<string, AlertEvent>();\n private started = false;\n private closed = false;\n\n constructor(\n queueManager: QueueManager,\n getQueues: () => Map<string, Queue>,\n options: AlertsOptions,\n store?: AlertStore,\n persistence: \"redis\" | \"memory\" | \"custom\" = \"memory\",\n ) {\n this.queueManager = queueManager;\n this.getQueues = getQueues;\n this.options = options;\n this.store = store ?? createAlertStore(options, {}).store;\n this.persistence = persistence;\n }\n\n get enabled(): boolean {\n return this.options.enabled !== false;\n }\n\n getStore(): AlertStore {\n return this.store;\n }\n\n /** Start QueueEvents listeners and health-check loop */\n async start(): Promise<void> {\n if (this.options.enabled === false || this.started || this.closed) return;\n this.started = true;\n\n const queues = this.getQueues();\n for (const [name, queue] of queues) {\n const connection = queue.opts?.connection;\n if (!connection) {\n this.listenerStatus.set(name, false);\n continue;\n }\n\n try {\n const qe = new QueueEvents(name, { connection });\n this.queueEvents.push(qe);\n this.listenerStatus.set(name, true);\n\n qe.on(\"failed\", ({ jobId, failedReason }) => {\n void this.handleQueueEvent(name, \"job_failed\", {\n jobId,\n failedReason,\n });\n });\n\n qe.on(\"stalled\", ({ jobId }) => {\n void this.handleQueueEvent(name, \"job_stalled\", { jobId });\n });\n\n qe.on(\"retries-exhausted\", ({ jobId, attemptsMade }) => {\n void this.handleQueueEvent(name, \"retries_exhausted\", {\n jobId,\n attemptsMade: Number(attemptsMade),\n });\n });\n\n qe.on(\"error\", () => {\n this.listenerStatus.set(name, false);\n });\n } catch {\n this.listenerStatus.set(name, false);\n }\n }\n\n this.healthTimer = setInterval(() => {\n void this.runHealthChecks();\n }, HEALTH_CHECK_INTERVAL_MS);\n void this.runHealthChecks();\n }\n\n async close(): Promise<void> {\n await this.store.close?.();\n await this.closeListeners();\n }\n\n private async closeListeners(): Promise<void> {\n this.closed = true;\n if (this.healthTimer) {\n clearInterval(this.healthTimer);\n this.healthTimer = null;\n }\n await Promise.all(\n this.queueEvents.map(async (qe) => {\n try {\n await qe.close();\n } catch {\n // ignore close errors\n }\n }),\n );\n this.queueEvents = [];\n }\n\n async getStatus(): Promise<AlertRuntimeStatus> {\n const listeners = Array.from(this.listenerStatus.entries()).map(\n ([queue, connected]) => ({ queue, connected }),\n );\n return {\n enabled: this.options.enabled !== false,\n persistence: this.persistence,\n listenerCount: listeners.length,\n listeners,\n healthCheckIntervalMs: HEALTH_CHECK_INTERVAL_MS,\n lastHealthCheckAt: this.lastHealthCheckAt,\n recentEvents: [...this.recentEvents],\n lastDeliveries: [...this.lastDeliveries],\n defaults: {\n cooldownMs: this.options.defaults?.cooldownMs ?? 5 * 60 * 1000,\n sendResolved: this.options.defaults?.sendResolved ?? true,\n },\n };\n }\n\n /** Send a test notification through a contact point */\n async sendTest(contactPointId: string): Promise<AlertDeliveryRecord> {\n const cp = await this.store.getContactPoint(contactPointId);\n if (!cp) {\n return {\n contactPointId,\n contactPointName: \"Unknown\",\n success: false,\n error: \"Contact point not found\",\n at: Date.now(),\n };\n }\n\n const testEvent: AlertEvent = {\n id: crypto.randomUUID(),\n ruleId: \"test\",\n ruleName: \"Test notification\",\n trigger: \"job_failed\",\n severity: \"info\",\n status: \"firing\",\n fingerprint: \"test\",\n queue: \"example\",\n jobId: \"test-job\",\n jobName: \"exampleJob\",\n message: \"This is a test alert from Workbench.\",\n firedAt: Date.now(),\n };\n\n const result = await deliverToContactPoint(\n cp,\n testEvent,\n this.options.dashboardUrl,\n );\n const record: AlertDeliveryRecord = {\n contactPointId: cp.id,\n contactPointName: cp.name,\n success: result.success,\n error: result.error,\n at: Date.now(),\n };\n this.pushDelivery(record);\n return record;\n }\n\n /** Preview what a rule would look like without sending */\n previewRule(rule: AlertRule): AlertEvent {\n return {\n id: crypto.randomUUID(),\n ruleId: rule.id,\n ruleName: rule.name,\n trigger: rule.trigger,\n severity: rule.severity,\n status: \"firing\",\n fingerprint: `preview:${rule.id}`,\n queue: rule.queues?.[0] ?? \"my-queue\",\n jobId: \"12345\",\n jobName: \"exampleJob\",\n message: this.buildMessage(rule, {\n queue: rule.queues?.[0] ?? \"my-queue\",\n jobName: \"exampleJob\",\n failedReason: \"Example failure reason\",\n }),\n failedReason: \"Example failure reason\",\n firedAt: Date.now(),\n };\n }\n\n private async handleQueueEvent(\n queueName: string,\n trigger: AlertTrigger,\n ctx: { jobId: string; failedReason?: string; attemptsMade?: number },\n ): Promise<void> {\n const rules = await this.store.getRules();\n const matching = rules.filter(\n (r) =>\n r.enabled && r.trigger === trigger && this.matchesQueue(r, queueName),\n );\n if (matching.length === 0) return;\n\n let jobName: string | undefined;\n if (ctx.jobId) {\n const job = await this.queueManager.getJob(queueName, ctx.jobId);\n jobName = job?.name;\n if (jobName && matching.every((r) => !this.matchesJobName(r, jobName!))) {\n return;\n }\n }\n\n for (const rule of matching) {\n if (jobName && !this.matchesJobName(rule, jobName)) continue;\n await this.fireRule(rule, {\n queue: queueName,\n jobId: ctx.jobId,\n jobName,\n failedReason: ctx.failedReason,\n attemptsMade: ctx.attemptsMade,\n });\n }\n }\n\n private async runHealthChecks(): Promise<void> {\n if (this.options.enabled === false || this.closed) return;\n this.lastHealthCheckAt = Date.now();\n\n const rules = await this.store.getRules();\n const healthRules = rules.filter(\n (r) =>\n r.enabled &&\n (r.trigger === \"failed_backlog\" ||\n r.trigger === \"no_workers_with_backlog\"),\n );\n if (healthRules.length === 0) return;\n\n let queuesInfo: Awaited<ReturnType<QueueManager[\"getQueues\"]>>;\n try {\n queuesInfo = await this.queueManager.getQueues();\n } catch {\n return;\n }\n\n for (const rule of healthRules) {\n for (const queue of queuesInfo) {\n if (!this.matchesQueue(rule, queue.name)) continue;\n\n const backlog =\n queue.counts.waiting +\n queue.counts.prioritized +\n queue.counts[\"waiting-children\"];\n\n let firing = false;\n let message = \"\";\n const counts: AlertEvent[\"counts\"] = {\n failed: queue.counts.failed,\n backlog,\n workers: queue.workerCount,\n };\n\n if (rule.trigger === \"failed_backlog\") {\n const threshold = rule.threshold ?? 1;\n if (queue.counts.failed >= threshold) {\n firing = true;\n message = `${queue.counts.failed} failed jobs in ${queue.name} (threshold: ${threshold})`;\n }\n } else if (rule.trigger === \"no_workers_with_backlog\") {\n if (\n queue.workerCount === 0 &&\n backlog > 0 &&\n queue.workerCount !== null &&\n queue.workerCount !== undefined\n ) {\n firing = true;\n message = `${backlog} jobs waiting in ${queue.name} with no workers connected`;\n }\n }\n\n const fp = `${rule.id}:${queue.name}:${rule.trigger}`;\n const existing = this.activeHealthAlerts.get(fp);\n\n if (firing) {\n if (!existing) {\n await this.fireRule(rule, { queue: queue.name, counts, message });\n // fireRule stores in recentEvents; track active for resolve\n const last = this.recentEvents[0];\n if (last?.fingerprint === fp) {\n this.activeHealthAlerts.set(fp, last);\n }\n }\n } else if (existing && this.options.defaults?.sendResolved !== false) {\n await this.resolveHealthAlert(existing, rule);\n this.activeHealthAlerts.delete(fp);\n } else if (existing) {\n this.activeHealthAlerts.delete(fp);\n }\n }\n }\n }\n\n private async resolveHealthAlert(\n event: AlertEvent,\n rule: AlertRule,\n ): Promise<void> {\n const resolved: AlertEvent = {\n ...event,\n id: crypto.randomUUID(),\n status: \"resolved\",\n message: `Resolved: ${event.message}`,\n resolvedAt: Date.now(),\n };\n this.pushEvent(resolved);\n await this.deliver(resolved, rule);\n }\n\n private async fireRule(\n rule: AlertRule,\n ctx: {\n queue?: string;\n jobId?: string;\n jobName?: string;\n failedReason?: string;\n attemptsMade?: number;\n counts?: AlertEvent[\"counts\"];\n message?: string;\n },\n ): Promise<void> {\n const fingerprint = this.buildFingerprint(rule, ctx);\n const cooldownMs =\n rule.cooldownMs ?? this.options.defaults?.cooldownMs ?? 5 * 60 * 1000;\n const prev = this.cooldowns.get(fingerprint);\n if (prev && Date.now() - prev.lastFiredAt < cooldownMs) {\n return;\n }\n\n const event: AlertEvent = {\n id: crypto.randomUUID(),\n ruleId: rule.id,\n ruleName: rule.name,\n trigger: rule.trigger,\n severity: rule.severity,\n status: \"firing\",\n fingerprint,\n queue: ctx.queue,\n jobId: ctx.jobId,\n jobName: ctx.jobName,\n message: ctx.message ?? this.buildMessage(rule, ctx),\n failedReason: ctx.failedReason,\n attemptsMade: ctx.attemptsMade,\n counts: ctx.counts,\n firedAt: Date.now(),\n };\n\n this.cooldowns.set(fingerprint, { lastFiredAt: Date.now(), event });\n this.pushEvent(event);\n await this.deliver(event, rule);\n }\n\n private async deliver(event: AlertEvent, rule: AlertRule): Promise<void> {\n const allCps = await this.store.getContactPoints();\n const cps = allCps.filter(\n (cp) => cp.enabled && rule.contactPointIds.includes(cp.id),\n );\n\n await Promise.all(\n cps.map(async (cp) => {\n const result = await deliverToContactPoint(\n cp,\n event,\n this.options.dashboardUrl,\n );\n this.pushDelivery({\n contactPointId: cp.id,\n contactPointName: cp.name,\n success: result.success,\n error: result.error,\n at: Date.now(),\n });\n }),\n );\n }\n\n private buildFingerprint(\n rule: AlertRule,\n ctx: {\n queue?: string;\n jobId?: string;\n },\n ): string {\n const parts = [rule.id, rule.trigger, ctx.queue ?? \"all\"];\n if (\n rule.trigger === \"job_failed\" ||\n rule.trigger === \"job_stalled\" ||\n rule.trigger === \"retries_exhausted\"\n ) {\n parts.push(ctx.jobId ?? \"unknown\");\n }\n return parts.join(\":\");\n }\n\n private buildMessage(\n rule: AlertRule,\n ctx: {\n queue?: string;\n jobId?: string;\n jobName?: string;\n failedReason?: string;\n attemptsMade?: number;\n },\n ): string {\n switch (rule.trigger) {\n case \"job_failed\":\n return `Job ${ctx.jobName ?? \"unknown\"} failed in ${ctx.queue ?? \"queue\"}${ctx.failedReason ? `: ${ctx.failedReason.slice(0, 200)}` : \"\"}`;\n case \"job_stalled\":\n return `Job ${ctx.jobName ?? ctx.jobId ?? \"unknown\"} stalled in ${ctx.queue ?? \"queue\"}`;\n case \"retries_exhausted\":\n return `Job ${ctx.jobName ?? ctx.jobId ?? \"unknown\"} exhausted retries in ${ctx.queue ?? \"queue\"}${ctx.attemptsMade ? ` (${ctx.attemptsMade} attempts)` : \"\"}`;\n case \"failed_backlog\":\n return `Failed job backlog in ${ctx.queue ?? \"queue\"}`;\n case \"no_workers_with_backlog\":\n return `No workers processing ${ctx.queue ?? \"queue\"}`;\n default:\n return rule.name;\n }\n }\n\n private matchesQueue(rule: AlertRule, queueName: string): boolean {\n if (!rule.queues || rule.queues.length === 0) return true;\n return rule.queues.includes(queueName);\n }\n\n private matchesJobName(rule: AlertRule, jobName: string): boolean {\n if (!rule.jobNames || rule.jobNames.length === 0) return true;\n return rule.jobNames.includes(jobName);\n }\n\n private pushEvent(event: AlertEvent): void {\n this.recentEvents.unshift(event);\n if (this.recentEvents.length > MAX_RECENT_EVENTS) {\n this.recentEvents.length = MAX_RECENT_EVENTS;\n }\n }\n\n private pushDelivery(record: AlertDeliveryRecord): void {\n this.lastDeliveries.unshift(record);\n if (this.lastDeliveries.length > MAX_DELIVERY_RECORDS) {\n this.lastDeliveries.length = MAX_DELIVERY_RECORDS;\n }\n }\n}\n","import { Queue, type RedisOptions } from \"bullmq\";\nimport { Redis } from \"ioredis\";\n\n/**\n * Discover BullMQ queues on a Redis connection by scanning for `<prefix>:*:meta`\n * keys. Returns one `Queue` instance per discovered queue, each constructed\n * with a fresh clone of the connection options.\n *\n * Used by `WorkbenchCore.fromOptions` for the desktop client where the user\n * supplies a Redis URL but no explicit queue list.\n */\nexport async function discoverQueues(\n connection: string | RedisOptions,\n prefix = \"bull\",\n): Promise<Queue[]> {\n const normalized = normalizeConnection(connection);\n const client = createScanClient(normalized);\n\n // Surface the underlying connection error (ECONNREFUSED, NOAUTH, EAI_AGAIN,\n // ENOTFOUND, TLS errors, etc.) rather than letting ioredis bury it under a\n // \"max retries per request\" wrapper. We swap the first error in via the\n // event listener and reject the ping promise with it.\n const firstError = captureFirstError(client);\n\n try {\n await Promise.race([client.ping(), firstError.promise]);\n const names = await scanQueueNames(client, prefix);\n return names.map(\n (name) =>\n new Queue(name, {\n connection: { ...normalized },\n prefix,\n }),\n );\n } finally {\n firstError.dispose();\n client.disconnect();\n }\n}\n\nfunction captureFirstError(client: Redis): {\n promise: Promise<never>;\n dispose: () => void;\n} {\n let onError: ((err: Error) => void) | null = null;\n const promise = new Promise<never>((_, reject) => {\n onError = (err) => reject(err);\n client.once(\"error\", onError);\n });\n // Swallow further errors after the first so ioredis doesn't kill the\n // process with an \"unhandled error event\" once we've already rejected.\n client.on(\"error\", () => {});\n return {\n promise,\n dispose: () => {\n if (onError) client.off(\"error\", onError);\n },\n };\n}\n\n/**\n * Normalize a `string | RedisOptions` connection into a single `RedisOptions`\n * shape with `{ url }` (when a URL string was passed). BullMQ's `Queue`\n * accepts `{ url: \"redis://...\" }` but not a bare URL string, so this is the\n * canonical adapter form.\n */\nfunction normalizeConnection(\n connection: string | RedisOptions,\n): RedisOptions & { url?: string } {\n if (typeof connection === \"string\") {\n return { url: connection } as RedisOptions & { url?: string };\n }\n return { ...connection };\n}\n\nfunction createScanClient(opts: RedisOptions & { url?: string }): Redis {\n // ioredis accepts the `url` field directly via its constructor; we pass it\n // explicitly to make the `bun build --compile` static analysis happy.\n const { url, ...rest } = opts;\n if (url) {\n return new Redis(url, {\n ...rest,\n lazyConnect: false,\n maxRetriesPerRequest: 1,\n });\n }\n return new Redis({ ...rest, lazyConnect: false, maxRetriesPerRequest: 1 });\n}\n\n/**\n * Cursored SCAN for `<prefix>:*:meta` keys. BullMQ writes a meta key for each\n * queue on first use; using that as the discovery signal avoids matching\n * jobs, locks, or other namespaced sub-keys.\n */\nasync function scanQueueNames(\n client: Redis,\n prefix: string,\n): Promise<string[]> {\n const pattern = `${prefix}:*:meta`;\n const names = new Set<string>();\n let cursor = \"0\";\n\n do {\n const [next, batch] = await client.scan(\n cursor,\n \"MATCH\",\n pattern,\n \"COUNT\",\n 500,\n );\n cursor = next;\n for (const key of batch) {\n const name = parseQueueName(key, prefix);\n if (name) names.add(name);\n }\n } while (cursor !== \"0\");\n\n return Array.from(names).sort();\n}\n\nfunction parseQueueName(key: string, prefix: string): string | null {\n const head = `${prefix}:`;\n const tail = \":meta\";\n if (!key.startsWith(head) || !key.endsWith(tail)) return null;\n return key.slice(head.length, key.length - tail.length);\n}\n","import { FlowProducer, type Job, type JobsOptions, type Queue } from \"bullmq\";\nimport { LRUCache } from \"lru-cache\";\nimport type {\n ActivityBucket,\n ActivityStatsResponse,\n CreateFlowChildRequest,\n CreateFlowRequest,\n DelayedJobInfo,\n FlowNode,\n FlowSummary,\n HourlyBucket,\n JobInfo,\n JobLogsResponse,\n JobStatus,\n JobTags,\n MetricsResponse,\n OverviewStats,\n PaginatedResponse,\n QueueGroup,\n QueueGroupInfo,\n QueueInfo,\n RunInfo,\n RunInfoList,\n SchedulerInfo,\n SearchResult,\n SortOptions,\n TestJobRequest,\n} from \"./types\";\n\n/**\n * Manages queue operations for the Workbench dashboard\n */\nexport class QueueManager {\n private queues: Map<string, Queue> = new Map();\n private queueGroupByName: Map<string, string> = new Map();\n private queueGroups: QueueGroupInfo[] = [];\n private tagFields: string[] = [];\n private flowProducer: FlowProducer | null = null;\n\n // LRU cache for expensive operations\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private cache = new LRUCache<string, any>({\n max: 100, // Max 100 entries\n ttl: 1000 * 60, // Default 1 minute TTL\n allowStale: false, // Don't return stale entries\n updateAgeOnGet: true, // Reset TTL on access\n });\n\n private readonly CACHE_TTL = {\n metrics: 5 * 60 * 1000, // 5 minutes - metrics are expensive\n overview: 2 * 60 * 1000, // 2 minutes\n queues: 2 * 60 * 1000, // 2 minutes\n flows: 2 * 60 * 1000, // 2 minutes\n activity: 5 * 60 * 1000, // 5 minutes - activity timeline\n };\n\n constructor(\n queues: Queue[],\n tagFields: string[] = [],\n queueGroups: QueueGroup[] = [],\n ) {\n for (const queue of queues) {\n this.queues.set(queue.name, queue);\n }\n\n this.queueGroups = queueGroups.map((group) => ({\n name: group.name,\n queues: group.queues.map((queue) => queue.name),\n }));\n\n for (const group of this.queueGroups) {\n for (const queueName of group.queues) {\n this.queueGroupByName.set(queueName, group.name);\n }\n }\n\n this.tagFields = tagFields;\n\n // Initialize FlowProducer using connection from first queue\n const firstQueue = queues[0];\n if (firstQueue) {\n const connection = firstQueue.opts?.connection;\n if (connection) {\n this.flowProducer = new FlowProducer({ connection });\n }\n }\n }\n\n /**\n * Get cached value or compute and cache\n */\n private async cached<T>(\n key: string,\n ttl: number,\n compute: () => Promise<T>,\n ): Promise<T> {\n const cached = this.cache.get(key);\n if (cached !== undefined) {\n return cached as T;\n }\n\n const data = await compute();\n this.cache.set(key, data, { ttl });\n return data;\n }\n\n /**\n * Execute a promise with a timeout\n */\n private async withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage: string,\n ): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<T>((_, reject) => {\n timeoutId = setTimeout(() => reject(new Error(errorMessage)), timeoutMs);\n });\n\n try {\n return await Promise.race([promise, timeoutPromise]);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Get jobs by time range using Redis sorted sets (ZRANGEBYSCORE)\n * This is more efficient than fetching all jobs and filtering in memory\n */\n private async getJobsByTimeRange(\n queue: Queue,\n status: \"completed\" | \"failed\",\n startTime: number,\n endTime: number,\n limit: number,\n ): Promise<Job[]> {\n try {\n // Access BullMQ's Redis client\n const client = (queue as any).client;\n if (!client) {\n // Fallback to regular getJobs if client not available\n const jobs = await queue.getJobs([status], 0, limit * 2);\n return jobs.filter(\n (job): job is Job =>\n job != null &&\n !!job.finishedOn &&\n job.finishedOn >= startTime &&\n job.finishedOn <= endTime,\n );\n }\n\n // BullMQ stores jobs in sorted sets: bull:queueName:completed, bull:queueName:failed\n // The score is the finishedOn timestamp\n const queueKey = `bull:${queue.name}:${status}`;\n const jobIds = await client.zrangebyscore(\n queueKey,\n startTime,\n endTime,\n \"LIMIT\",\n 0,\n limit,\n );\n\n if (!jobIds || jobIds.length === 0) {\n return [];\n }\n\n // Fetch job data for the IDs in parallel\n const jobPromises = jobIds.map((jobId: string) => queue.getJob(jobId));\n const jobs = await Promise.all(jobPromises);\n\n // Filter out null/undefined results\n return jobs.filter(\n (job): job is Job => job !== null && job !== undefined,\n );\n } catch (_error) {\n // Fallback to regular getJobs on error\n const jobs = await queue.getJobs([status], 0, limit * 2);\n return jobs.filter(\n (job): job is Job =>\n job != null &&\n !!job.finishedOn &&\n job.finishedOn >= startTime &&\n job.finishedOn <= endTime,\n );\n }\n }\n\n /**\n * Cache for job state lookups to avoid repeated Redis calls\n */\n private jobStateCache = new LRUCache<string, JobStatus>({\n max: 1000,\n ttl: 1000 * 30, // 30 second TTL - job states don't change frequently\n });\n\n /**\n * Cache for job counts to avoid repeated Redis calls\n * Short TTL since counts change frequently but are expensive to fetch\n */\n private countCache = new LRUCache<\n string,\n Awaited<ReturnType<Queue[\"getJobCounts\"]>>\n >({\n max: 100, // Cache counts for up to 100 queues\n ttl: 1000 * 5, // 5 second TTL - counts change but not instantly\n });\n\n /**\n * Get job counts with caching\n */\n private async getCachedJobCounts(\n queue: Queue,\n ): Promise<Awaited<ReturnType<Queue[\"getJobCounts\"]>>> {\n const cacheKey = queue.name;\n const cached = this.countCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const counts = await queue.getJobCounts();\n this.countCache.set(cacheKey, counts);\n return counts;\n }\n\n /**\n * Invalidate caches related to a job or queue\n */\n private invalidateJobCache(queueName: string, jobId?: string): void {\n // Invalidate count cache for the queue\n this.countCache.delete(queueName);\n\n // Invalidate job state cache if jobId provided\n if (jobId) {\n const stateCacheKey = `${queueName}:${jobId}`;\n this.jobStateCache.delete(stateCacheKey);\n }\n\n // Invalidate main cache entries that might be affected\n // These are expensive to recompute, so we invalidate them\n // to ensure accuracy after mutations\n this.cache.delete(\"metrics\");\n this.cache.delete(\"overview\");\n this.cache.delete(\"activity\");\n }\n\n /**\n * Clear cache (useful after mutations)\n */\n clearCache(prefix?: string): void {\n if (prefix) {\n for (const key of this.cache.keys()) {\n if (key.startsWith(prefix)) {\n this.cache.delete(key);\n }\n }\n } else {\n this.cache.clear();\n }\n }\n\n /**\n * Get quick job counts across all queues (lightweight, for smart polling)\n * Returns total counts per status - cached and very fast\n */\n async getQuickCounts(): Promise<{\n waiting: number;\n active: number;\n completed: number;\n failed: number;\n delayed: number;\n prioritized: number;\n \"waiting-children\": number;\n total: number;\n timestamp: number;\n }> {\n // Use short cache for counts - they change frequently\n return this.cached(\"quick-counts\", 2000, async () => {\n const totals = {\n waiting: 0,\n active: 0,\n completed: 0,\n failed: 0,\n delayed: 0,\n prioritized: 0,\n \"waiting-children\": 0,\n total: 0,\n timestamp: Date.now(),\n };\n\n await Promise.all(\n Array.from(this.queues.values()).map(async (queue) => {\n const counts = await this.getCachedJobCounts(queue);\n totals.waiting += counts.waiting || 0;\n totals.active += counts.active || 0;\n totals.completed += counts.completed || 0;\n totals.failed += counts.failed || 0;\n totals.delayed += counts.delayed || 0;\n totals.prioritized += counts.prioritized || 0;\n totals[\"waiting-children\"] += counts[\"waiting-children\"] || 0;\n }),\n );\n\n totals.total =\n totals.waiting +\n totals.active +\n totals.completed +\n totals.failed +\n totals.delayed +\n totals.prioritized +\n totals[\"waiting-children\"];\n\n return totals;\n });\n }\n\n /**\n * Get configured tag field names\n */\n getTagFields(): string[] {\n return this.tagFields;\n }\n\n /**\n * Get just queue names (very fast, no Redis calls)\n * Used for sidebar initial render\n */\n getQueueNames(): string[] {\n return Array.from(this.queues.keys());\n }\n\n getQueueGroups(): QueueGroupInfo[] {\n return this.queueGroups;\n }\n\n /**\n * Get a queue by name\n */\n getQueue(name: string): Queue | undefined {\n return this.queues.get(name);\n }\n\n /**\n * Internal map of queue instances (for alerting and advanced integrations)\n */\n getQueueMap(): Map<string, Queue> {\n return this.queues;\n }\n\n /**\n * Get information for all queues (cached)\n */\n async getQueues(): Promise<QueueInfo[]> {\n return this.cached(\"queues\", this.CACHE_TTL.queues, async () => {\n // Parallelize queue info fetching\n const queueEntries = Array.from(this.queues.entries());\n const results = await Promise.all(\n queueEntries.map(async ([name, queue]) => {\n const [counts, isPaused, workerCount] = await Promise.all([\n this.getCachedJobCounts(queue),\n queue.isPaused(),\n queue.getWorkersCount().catch(() => null as number | null),\n ]);\n\n return {\n name,\n group: this.queueGroupByName.get(name),\n counts: {\n waiting: counts.waiting || 0,\n active: counts.active || 0,\n completed: counts.completed || 0,\n failed: counts.failed || 0,\n delayed: counts.delayed || 0,\n prioritized: counts.prioritized || 0,\n \"waiting-children\": counts[\"waiting-children\"] || 0,\n paused: counts.paused || 0,\n },\n isPaused,\n workerCount,\n };\n }),\n );\n\n return results;\n });\n }\n\n /**\n * Get overview statistics (cached)\n */\n async getOverview(): Promise<OverviewStats> {\n return this.cached(\"overview\", this.CACHE_TTL.overview, async () => {\n const queues = await this.getQueues();\n\n let totalJobs = 0;\n let activeJobs = 0;\n let failedJobs = 0;\n\n for (const queue of queues) {\n totalJobs +=\n queue.counts.waiting +\n queue.counts.active +\n queue.counts.delayed +\n queue.counts.prioritized +\n queue.counts[\"waiting-children\"];\n activeJobs += queue.counts.active;\n failedJobs += queue.counts.failed;\n }\n\n // Get completed jobs from today (approximation based on completed count)\n const completedToday = queues.reduce(\n (sum, q) => sum + q.counts.completed,\n 0,\n );\n\n return {\n totalJobs,\n activeJobs,\n failedJobs,\n completedToday,\n avgDuration: 0, // Would need metrics tracking\n queues,\n };\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Queue Control (Pause/Resume)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Pause a queue - stops processing new jobs\n */\n async pauseQueue(queueName: string): Promise<void> {\n const queue = this.queues.get(queueName);\n if (!queue) {\n throw new Error(`Queue \"${queueName}\" not found`);\n }\n await queue.pause();\n }\n\n /**\n * Resume a paused queue\n */\n async resumeQueue(queueName: string): Promise<void> {\n const queue = this.queues.get(queueName);\n if (!queue) {\n throw new Error(`Queue \"${queueName}\" not found`);\n }\n await queue.resume();\n }\n\n /**\n * Check if a queue is paused\n */\n async isQueuePaused(queueName: string): Promise<boolean> {\n const queue = this.queues.get(queueName);\n if (!queue) {\n throw new Error(`Queue \"${queueName}\" not found`);\n }\n return queue.isPaused();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Metrics\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get metrics for the last 24 hours (cached - expensive operation)\n */\n async getMetrics(): Promise<MetricsResponse> {\n return this.cached(\"metrics\", this.CACHE_TTL.metrics, async () => {\n return this.withTimeout(\n (async () => {\n const now = Date.now();\n const twentyFourHoursAgo = now - 24 * 60 * 60 * 1000;\n\n // Initialize hourly buckets for last 24 hours\n const createEmptyBuckets = (): HourlyBucket[] => {\n const buckets: HourlyBucket[] = [];\n const startHour =\n Math.floor(twentyFourHoursAgo / (60 * 60 * 1000)) *\n (60 * 60 * 1000);\n for (let i = 0; i < 24; i++) {\n buckets.push({\n hour: startHour + i * 60 * 60 * 1000,\n completed: 0,\n failed: 0,\n avgDuration: 0,\n avgWaitTime: 0,\n });\n }\n return buckets;\n };\n\n const queueMetricsMap = new Map<\n string,\n {\n buckets: HourlyBucket[];\n durations: number[][];\n waitTimes: number[][];\n }\n >();\n\n // Initialize per-queue metrics\n for (const queueName of this.queues.keys()) {\n queueMetricsMap.set(queueName, {\n buckets: createEmptyBuckets(),\n durations: Array.from({ length: 24 }, () => []),\n waitTimes: Array.from({ length: 24 }, () => []),\n });\n }\n\n // Track slowest jobs and failing job types\n const allJobs: Array<{\n name: string;\n queueName: string;\n duration: number;\n jobId: string;\n }> = [];\n const jobTypeStats = new Map<\n string,\n {\n name: string;\n queueName: string;\n completed: number;\n failed: number;\n latestFailedJobId?: string;\n latestFailedAt?: number;\n }\n >();\n\n // Fetch completed and failed jobs from each queue IN PARALLEL\n // Use time-based filtering to only get jobs within the 24-hour window\n const queueEntries = Array.from(this.queues.entries());\n\n // First, check which queues have relevant jobs using getJobCounts\n const queueChecks = await Promise.all(\n queueEntries.map(async ([queueName, queue]) => {\n const counts = await this.getCachedJobCounts(queue);\n return {\n queueName,\n queue,\n hasRelevantJobs:\n (counts.completed || 0) > 0 || (counts.failed || 0) > 0,\n };\n }),\n );\n\n // Only process queues with relevant jobs\n const relevantQueues = queueChecks.filter((q) => q.hasRelevantJobs);\n\n const queueResults = await Promise.all(\n relevantQueues.map(async ({ queueName, queue }) => {\n // Use time-based filtering - only fetch jobs within the 24-hour window\n // Reduced limit since we're filtering by time in Redis\n const [completedJobs, failedJobs] = await Promise.all([\n this.getJobsByTimeRange(\n queue,\n \"completed\",\n twentyFourHoursAgo,\n now,\n 100, // Reduced from 200 - only recent jobs needed\n ),\n this.getJobsByTimeRange(\n queue,\n \"failed\",\n twentyFourHoursAgo,\n now,\n 100, // Reduced from 200 - only recent jobs needed\n ),\n ]);\n return { queueName, completedJobs, failedJobs };\n }),\n );\n\n // Process results\n for (const { queueName, completedJobs, failedJobs } of queueResults) {\n const metrics = queueMetricsMap.get(queueName)!;\n\n // Process completed jobs\n for (const job of completedJobs) {\n if (!job?.finishedOn || job.finishedOn < twentyFourHoursAgo)\n continue;\n\n const bucketIndex = Math.floor(\n (job.finishedOn - (metrics.buckets[0]?.hour || 0)) /\n (60 * 60 * 1000),\n );\n if (bucketIndex >= 0 && bucketIndex < 24) {\n metrics.buckets[bucketIndex].completed++;\n\n const duration = job.processedOn\n ? job.finishedOn - job.processedOn\n : 0;\n const waitTime = job.processedOn\n ? job.processedOn - job.timestamp\n : 0;\n\n if (duration > 0) {\n metrics.durations[bucketIndex].push(duration);\n allJobs.push({\n name: job.name,\n queueName,\n duration,\n jobId: job.id || \"\",\n });\n }\n if (waitTime > 0) {\n metrics.waitTimes[bucketIndex].push(waitTime);\n }\n }\n\n // Track job type stats\n const key = `${queueName}:${job.name}`;\n const stats = jobTypeStats.get(key) || {\n name: job.name,\n queueName,\n completed: 0,\n failed: 0,\n };\n stats.completed++;\n jobTypeStats.set(key, stats);\n }\n\n // Process failed jobs\n for (const job of failedJobs) {\n if (!job?.finishedOn || job.finishedOn < twentyFourHoursAgo)\n continue;\n\n const bucketIndex = Math.floor(\n (job.finishedOn - (metrics.buckets[0]?.hour || 0)) /\n (60 * 60 * 1000),\n );\n if (bucketIndex >= 0 && bucketIndex < 24) {\n metrics.buckets[bucketIndex].failed++;\n }\n\n // Track job type stats\n const key = `${queueName}:${job.name}`;\n const stats = jobTypeStats.get(key) || {\n name: job.name,\n queueName,\n completed: 0,\n failed: 0,\n };\n stats.failed++;\n if (\n job.id &&\n (!stats.latestFailedAt ||\n (job.finishedOn ?? 0) > stats.latestFailedAt)\n ) {\n stats.latestFailedJobId = job.id;\n stats.latestFailedAt = job.finishedOn;\n }\n jobTypeStats.set(key, stats);\n }\n }\n\n // Calculate averages for each bucket\n for (const metrics of queueMetricsMap.values()) {\n for (let i = 0; i < 24; i++) {\n const durations = metrics.durations[i];\n const waitTimes = metrics.waitTimes[i];\n if (durations.length > 0) {\n metrics.buckets[i].avgDuration = Math.round(\n durations.reduce((a, b) => a + b, 0) / durations.length,\n );\n }\n if (waitTimes.length > 0) {\n metrics.buckets[i].avgWaitTime = Math.round(\n waitTimes.reduce((a, b) => a + b, 0) / waitTimes.length,\n );\n }\n }\n }\n\n // Skip per-queue metrics - not used by frontend (only aggregate is displayed)\n // Return empty array to maintain API compatibility\n\n // Build aggregate metrics\n const aggregateBuckets = createEmptyBuckets();\n const aggregateDurations: number[][] = Array.from(\n { length: 24 },\n () => [],\n );\n const aggregateWaitTimes: number[][] = Array.from(\n { length: 24 },\n () => [],\n );\n\n for (const metrics of queueMetricsMap.values()) {\n for (let i = 0; i < 24; i++) {\n aggregateBuckets[i].completed += metrics.buckets[i].completed;\n aggregateBuckets[i].failed += metrics.buckets[i].failed;\n aggregateDurations[i].push(...metrics.durations[i]);\n aggregateWaitTimes[i].push(...metrics.waitTimes[i]);\n }\n }\n\n // Calculate aggregate averages\n for (let i = 0; i < 24; i++) {\n if (aggregateDurations[i].length > 0) {\n aggregateBuckets[i].avgDuration = Math.round(\n aggregateDurations[i].reduce((a, b) => a + b, 0) /\n aggregateDurations[i].length,\n );\n }\n if (aggregateWaitTimes[i].length > 0) {\n aggregateBuckets[i].avgWaitTime = Math.round(\n aggregateWaitTimes[i].reduce((a, b) => a + b, 0) /\n aggregateWaitTimes[i].length,\n );\n }\n }\n\n const totalCompleted = aggregateBuckets.reduce(\n (sum, b) => sum + b.completed,\n 0,\n );\n const totalFailed = aggregateBuckets.reduce(\n (sum, b) => sum + b.failed,\n 0,\n );\n const allDurations = aggregateDurations.flat();\n const allWaitTimes = aggregateWaitTimes.flat();\n\n // Get top 10 slowest jobs\n const slowestJobs = allJobs\n .sort((a, b) => b.duration - a.duration)\n .slice(0, 10);\n\n // Get top 10 most failing job types\n const mostFailingTypes = Array.from(jobTypeStats.values())\n .filter((s) => s.failed > 0)\n .map((s) => ({\n name: s.name,\n queueName: s.queueName,\n jobId: s.latestFailedJobId ?? \"\",\n failCount: s.failed,\n totalCount: s.completed + s.failed,\n errorRate: s.failed / (s.completed + s.failed),\n }))\n .sort((a, b) => b.failCount - a.failCount)\n .slice(0, 10);\n\n return {\n queues: [], // Empty - per-queue metrics not used by frontend\n aggregate: {\n queueName: \"all\",\n buckets: aggregateBuckets,\n summary: {\n totalCompleted,\n totalFailed,\n errorRate:\n totalCompleted + totalFailed > 0\n ? totalFailed / (totalCompleted + totalFailed)\n : 0,\n avgDuration:\n allDurations.length > 0\n ? Math.round(\n allDurations.reduce((a, b) => a + b, 0) /\n allDurations.length,\n )\n : 0,\n avgWaitTime:\n allWaitTimes.length > 0\n ? Math.round(\n allWaitTimes.reduce((a, b) => a + b, 0) /\n allWaitTimes.length,\n )\n : 0,\n throughputPerHour: Math.round(\n (totalCompleted + totalFailed) / 24,\n ),\n },\n },\n slowestJobs,\n mostFailingTypes,\n computedAt: now,\n };\n })(),\n 45000, // 45 second timeout (before proxy timeout)\n \"Metrics computation timed out after 45 seconds\",\n );\n });\n }\n\n /**\n * Get activity stats for the last 7 days (cached)\n * Returns 4-hour buckets for the activity timeline\n */\n async getActivityStats(): Promise<ActivityStatsResponse> {\n return this.cached(\"activity\", this.CACHE_TTL.activity, async () => {\n const now = Date.now();\n const bucketSize = 4 * 60 * 60 * 1000; // 4 hours\n const bucketCount = 42; // 7 days * 6 buckets per day\n\n // Start from midnight 7 days ago\n const startDate = new Date(now);\n startDate.setHours(0, 0, 0, 0);\n startDate.setDate(startDate.getDate() - 6);\n const startTime = startDate.getTime();\n\n // Initialize buckets\n const buckets: ActivityBucket[] = [];\n for (let i = 0; i < bucketCount; i++) {\n buckets.push({\n time: startTime + i * bucketSize,\n completed: 0,\n failed: 0,\n });\n }\n\n // Fetch completed and failed jobs from each queue IN PARALLEL\n // Use time-based filtering to only get jobs within the 7-day window\n const queueEntries = Array.from(this.queues.entries());\n\n // First, check which queues have relevant jobs\n const queueChecks = await Promise.all(\n queueEntries.map(async ([, queue]) => {\n const counts = await this.getCachedJobCounts(queue);\n return {\n queue,\n hasRelevantJobs:\n (counts.completed || 0) > 0 || (counts.failed || 0) > 0,\n };\n }),\n );\n\n // Only process queues with relevant jobs\n const relevantQueues = queueChecks.filter((q) => q.hasRelevantJobs);\n\n const queueResults = await Promise.all(\n relevantQueues.map(async ({ queue }) => {\n // Use time-based filtering - only fetch jobs within the 7-day window\n // Reduced limit since we're filtering by time in Redis\n const [completedJobs, failedJobs] = await Promise.all([\n this.getJobsByTimeRange(\n queue,\n \"completed\",\n startTime,\n now,\n 200, // Reduced from 500 - only jobs in time range needed\n ),\n this.getJobsByTimeRange(\n queue,\n \"failed\",\n startTime,\n now,\n 200, // Reduced from 500 - only jobs in time range needed\n ),\n ]);\n return { completedJobs, failedJobs };\n }),\n );\n\n // Process results\n for (const { completedJobs, failedJobs } of queueResults) {\n // Process completed jobs\n for (const job of completedJobs) {\n if (!job?.finishedOn || job.finishedOn < startTime) continue;\n\n const bucketIndex = Math.floor(\n (job.finishedOn - startTime) / bucketSize,\n );\n if (bucketIndex >= 0 && bucketIndex < bucketCount) {\n buckets[bucketIndex].completed++;\n }\n }\n\n // Process failed jobs\n for (const job of failedJobs) {\n if (!job?.finishedOn || job.finishedOn < startTime) continue;\n\n const bucketIndex = Math.floor(\n (job.finishedOn - startTime) / bucketSize,\n );\n if (bucketIndex >= 0 && bucketIndex < bucketCount) {\n buckets[bucketIndex].failed++;\n }\n }\n }\n\n const totalCompleted = buckets.reduce((sum, b) => sum + b.completed, 0);\n const totalFailed = buckets.reduce((sum, b) => sum + b.failed, 0);\n\n return {\n buckets,\n startTime,\n endTime: now,\n bucketSize,\n totalCompleted,\n totalFailed,\n computedAt: now,\n };\n });\n }\n\n /**\n * Get jobs for a specific queue with pagination and sorting\n */\n async getJobs(\n queueName: string,\n status?: JobStatus,\n limit = 50,\n start = 0,\n sort?: SortOptions,\n ): Promise<PaginatedResponse<JobInfo>> {\n const queue = this.queues.get(queueName);\n if (!queue) {\n return { data: [], total: 0, hasMore: false };\n }\n\n const types = status\n ? [status]\n : [\n \"active\",\n \"waiting\",\n \"waiting-children\",\n \"prioritized\",\n \"completed\",\n \"failed\",\n \"delayed\",\n ];\n\n // Fetch counts once before the loop (same for all types in a queue)\n const counts = await this.getCachedJobCounts(queue);\n\n // Track jobs with their known state to avoid getState() calls\n const jobsWithState: { job: Job; state: JobStatus }[] = [];\n let total = 0;\n\n for (const type of types) {\n const typeJobs = await queue.getJobs(type as any, start, start + limit);\n jobsWithState.push(\n ...typeJobs.map((job) => ({ job, state: type as JobStatus })),\n );\n\n const typeCount = counts[type as keyof typeof counts] || 0;\n total += typeCount;\n }\n\n // Convert to JobInfo - pass known state to skip expensive getState() calls\n const jobInfos = (await Promise.all(\n jobsWithState.map(({ job, state }) => this.jobToInfo(job, \"full\", state)),\n )) as JobInfo[];\n\n // Apply sorting\n const sortField = sort?.field ?? \"timestamp\";\n const sortDir = sort?.direction === \"asc\" ? 1 : -1;\n\n jobInfos.sort((a, b) => {\n const aVal = this.getSortValue(a, sortField);\n const bVal = this.getSortValue(b, sortField);\n if (aVal < bVal) return -1 * sortDir;\n if (aVal > bVal) return 1 * sortDir;\n return 0;\n });\n\n // Take only the requested limit\n const data = jobInfos.slice(0, limit);\n\n return {\n data,\n total,\n hasMore: start + limit < total,\n cursor: start + limit < total ? String(start + limit) : undefined,\n };\n }\n\n /**\n * Get a single job by ID\n */\n async getJob(queueName: string, jobId: string): Promise<JobInfo | null> {\n const queue = this.queues.get(queueName);\n if (!queue) return null;\n\n const job = await queue.getJob(jobId);\n if (!job) return null;\n\n return this.jobToInfo(job, \"full\") as Promise<JobInfo>;\n }\n\n /**\n * Get worker logs written via job.log()\n */\n async getJobLogs(\n queueName: string,\n jobId: string,\n start = 0,\n end = -1,\n asc = true,\n ): Promise<JobLogsResponse | null> {\n const queue = this.queues.get(queueName);\n if (!queue) return null;\n\n const job = await queue.getJob(jobId);\n if (!job) return null;\n\n return queue.getJobLogs(jobId, start, end, asc);\n }\n\n /**\n * Retry a failed job\n */\n async retryJob(queueName: string, jobId: string): Promise<boolean> {\n const queue = this.queues.get(queueName);\n if (!queue) return false;\n\n const job = await queue.getJob(jobId);\n if (!job) return false;\n\n await job.retry();\n this.invalidateJobCache(queueName, jobId);\n return true;\n }\n\n /**\n * Remove a job\n */\n async removeJob(queueName: string, jobId: string): Promise<boolean> {\n const queue = this.queues.get(queueName);\n if (!queue) return false;\n\n const job = await queue.getJob(jobId);\n if (!job) return false;\n\n await job.remove();\n this.invalidateJobCache(queueName, jobId);\n return true;\n }\n\n /**\n * Promote a delayed job to waiting\n */\n async promoteJob(queueName: string, jobId: string): Promise<boolean> {\n const queue = this.queues.get(queueName);\n if (!queue) return false;\n\n const job = await queue.getJob(jobId);\n if (!job) return false;\n\n await job.promote();\n this.invalidateJobCache(queueName, jobId);\n return true;\n }\n\n /**\n * Parse search query for field:value filters\n * Returns { filters: { field: value }, text: remainingText }\n */\n private parseSearchQuery(query: string): {\n filters: Record<string, string>;\n text: string;\n } {\n const filters: Record<string, string> = {};\n const textParts: string[] = [];\n const len = query.length;\n let i = 0;\n\n while (i < len) {\n while (i < len && query[i] === \" \") i++;\n if (i >= len) break;\n\n let j = i;\n while (j < len && /\\w/.test(query[j]!)) j++;\n\n if (j > i && j < len && query[j] === \":\") {\n const field = query.slice(i, j);\n j++;\n\n let value: string;\n if (j < len && query[j] === '\"') {\n j++;\n const closeQuote = query.indexOf('\"', j);\n if (closeQuote !== -1) {\n value = query.slice(j, closeQuote);\n j = closeQuote + 1;\n } else {\n value = query.slice(j);\n j = len;\n }\n } else {\n const valueStart = j;\n while (j < len && query[j] !== \" \") j++;\n value = query.slice(valueStart, j);\n }\n\n if (value) {\n filters[field] = value;\n } else {\n textParts.push(`${field}:`);\n }\n i = j;\n } else {\n const start = i;\n while (i < len && query[i] !== \" \") i++;\n textParts.push(query.slice(start, i));\n }\n }\n\n return {\n filters,\n text: textParts.filter(Boolean).join(\" \"),\n };\n }\n\n /**\n * Check if a raw job matches all provided filters (before conversion)\n * This is more efficient than converting to JobInfo first\n */\n private jobMatchesAllFilters(\n job: Job,\n filters: {\n status?: JobStatus;\n tags?: Record<string, string>;\n text?: string;\n timeRange?: { start: number; end: number };\n },\n ): boolean {\n // Status filter is handled by fetching only the requested status types\n // So we don't need to check it here - jobs are already filtered by type\n\n // Check time range filter (cheap - uses raw timestamps)\n if (filters.timeRange) {\n const jobTime = job.processedOn || job.finishedOn || job.timestamp || 0;\n if (\n jobTime < filters.timeRange.start ||\n jobTime > filters.timeRange.end\n ) {\n return false;\n }\n }\n\n // Check tag filters (extract only needed fields from job.data)\n if (filters.tags && Object.keys(filters.tags).length > 0) {\n if (!job.data || typeof job.data !== \"object\") {\n return false;\n }\n const dataObj = job.data as Record<string, unknown>;\n for (const [field, value] of Object.entries(filters.tags)) {\n const jobValue = dataObj[field];\n if (jobValue === undefined || jobValue === null) {\n return false;\n }\n // Case-insensitive comparison for strings\n const strJobValue = String(jobValue).toLowerCase();\n const strFilterValue = value.toLowerCase();\n if (!strJobValue.includes(strFilterValue)) {\n return false;\n }\n }\n }\n\n // Check text search (only stringify if needed)\n if (filters.text) {\n const lowerText = filters.text.toLowerCase();\n const matchesId = job.id?.toLowerCase().includes(lowerText);\n const matchesName = job.name?.toLowerCase().includes(lowerText);\n\n if (!matchesId && !matchesName) {\n // Only stringify job.data if ID and name don't match\n const stringifiedData = JSON.stringify(job.data).toLowerCase();\n if (!stringifiedData.includes(lowerText)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Check if a job matches the given tag filters\n */\n private jobMatchesFilters(\n job: Job,\n filters: Record<string, string>,\n ): boolean {\n if (!job.data || typeof job.data !== \"object\") {\n return Object.keys(filters).length === 0;\n }\n\n const dataObj = job.data as Record<string, unknown>;\n for (const [field, value] of Object.entries(filters)) {\n const jobValue = dataObj[field];\n if (jobValue === undefined || jobValue === null) {\n return false;\n }\n // Case-insensitive comparison for strings\n const strJobValue = String(jobValue).toLowerCase();\n const strFilterValue = value.toLowerCase();\n if (!strJobValue.includes(strFilterValue)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Search jobs across all queues\n * Supports field:value syntax (e.g., \"teamId:abc-123 invoice\")\n * Optimized with parallel processing, early exits, and count checks\n */\n async search(query: string, limit = 20): Promise<SearchResult[]> {\n const { filters, text } = this.parseSearchQuery(query);\n const lowerText = text.toLowerCase();\n const hasFilters = Object.keys(filters).length > 0;\n const hasText = lowerText.length > 0;\n\n // Early exit if no search criteria\n if (!hasFilters && !hasText) {\n return [];\n }\n\n // Check counts first to skip empty queues\n const queueEntries = Array.from(this.queues.entries());\n const queueChecks = await Promise.all(\n queueEntries.map(async ([queueName, queue]) => {\n const counts = await this.getCachedJobCounts(queue);\n const hasJobs =\n (counts.waiting || 0) > 0 ||\n (counts.active || 0) > 0 ||\n (counts.completed || 0) > 0 ||\n (counts.failed || 0) > 0 ||\n (counts.delayed || 0) > 0 ||\n (counts.prioritized || 0) > 0 ||\n (counts[\"waiting-children\"] || 0) > 0;\n return { queueName, queue, hasJobs };\n }),\n );\n\n const relevantQueues = queueChecks.filter((q) => q.hasJobs);\n if (relevantQueues.length === 0) {\n return [];\n }\n\n // Process all queues in parallel instead of sequentially\n const types = [\n \"active\",\n \"waiting\",\n \"waiting-children\",\n \"prioritized\",\n \"completed\",\n \"failed\",\n \"delayed\",\n ];\n const fetchLimit = Math.min(limit * 2, 50); // Reduced from 100 - only fetch what we need\n\n // WeakMap for caching stringified job data\n const stringifiedDataCache = new WeakMap<Job, string>();\n\n // Process all queues concurrently\n const queueResults = await Promise.allSettled(\n relevantQueues.map(async ({ queueName, queue }) => {\n // Search in all job states in parallel\n const typeResults = await Promise.all(\n types.map(async (type) => {\n try {\n const jobs = await queue.getJobs(type as any, 0, fetchLimit);\n const matches: SearchResult[] = [];\n\n for (const job of jobs) {\n // Check field:value filters first\n if (hasFilters && !this.jobMatchesFilters(job, filters)) {\n continue;\n }\n\n // If there's text search, match by job ID, name, or data\n if (hasText) {\n const matchesId = job.id?.toLowerCase().includes(lowerText);\n const matchesName = job.name\n ?.toLowerCase()\n .includes(lowerText);\n\n // Only stringify if ID and name don't match (expensive operation)\n let matchesData = false;\n if (!matchesId && !matchesName) {\n // Use cached stringified data if available\n let stringifiedData = stringifiedDataCache.get(job);\n if (!stringifiedData) {\n stringifiedData = JSON.stringify(job.data).toLowerCase();\n stringifiedDataCache.set(job, stringifiedData);\n }\n matchesData = stringifiedData.includes(lowerText);\n }\n\n if (!matchesId && !matchesName && !matchesData) {\n continue;\n }\n }\n\n // Pass known state to skip expensive getState() calls\n matches.push({\n queue: queueName,\n job: (await this.jobToInfo(\n job,\n \"full\",\n type as JobStatus,\n )) as JobInfo,\n });\n }\n\n return matches;\n } catch {\n return [];\n }\n }),\n );\n\n return typeResults.flat();\n }),\n );\n\n // Collect all matches from all queues\n const allMatches: SearchResult[] = [];\n for (const result of queueResults) {\n if (result.status === \"fulfilled\") {\n allMatches.push(...result.value);\n }\n }\n\n // Return limited results\n return allMatches.slice(0, limit);\n }\n\n /**\n * Clean jobs from a queue\n */\n async cleanJobs(\n queueName: string,\n status: \"completed\" | \"failed\",\n grace = 0,\n ): Promise<number> {\n const queue = this.queues.get(queueName);\n if (!queue) return 0;\n\n const removed = await queue.clean(grace, 1000, status);\n return removed.length;\n }\n\n /**\n * FAST PATH: Get latest runs without filters\n * Optimized for the common case of viewing newest jobs (timestamp desc, no filters)\n * - Single getJobs call per queue (not per status type)\n * - No count checks needed\n * - Minimal Redis round-trips\n */\n private async getLatestRuns(\n limit: number,\n start: number,\n ): Promise<PaginatedResponse<RunInfoList>> {\n const queueEntries = Array.from(this.queues.entries());\n const numQueues = queueEntries.length;\n\n if (numQueues === 0) {\n return { data: [], total: -1, hasMore: false, cursor: undefined };\n }\n\n // Fetch a small number of recent jobs from each queue\n // We need enough to fill the page after sorting by timestamp\n const perQueueFetch = Math.max(5, Math.ceil((limit + 10) / numQueues) + 2);\n\n // Fetch from all queues in parallel and keep the originating state.\n const allTypes: JobStatus[] = [\n \"active\",\n \"waiting\",\n \"waiting-children\",\n \"prioritized\",\n \"completed\",\n \"failed\",\n \"delayed\",\n ];\n\n const results = await Promise.all(\n queueEntries.map(async ([queueName, queue]) => {\n const jobArrays = await Promise.all(\n allTypes.map(async (type) => {\n const jobs = await queue.getJobs(type as any, 0, perQueueFetch);\n return jobs.map((job) => ({ job, queueName, state: type }));\n }),\n );\n return jobArrays.flat();\n }),\n );\n\n // Flatten and sort by timestamp desc\n const allJobs = results.flat();\n allJobs.sort((a, b) => {\n const timeDiff = (b.job.timestamp || 0) - (a.job.timestamp || 0);\n if (timeDiff !== 0) return timeDiff;\n // Secondary sort for stability\n return a.queueName.localeCompare(b.queueName);\n });\n\n // Apply pagination\n const jobsToConvert = allJobs.slice(start, start + limit);\n\n // Convert to RunInfoList with the known state from the source list.\n const runInfos = await Promise.all(\n jobsToConvert.map(async ({ job, queueName, state }) => {\n const info = await this.jobToInfo(job, \"list\", state);\n return { ...info, queueName } as RunInfoList;\n }),\n );\n\n // Determine if there are more results\n const hasMore = allJobs.length > start + limit;\n\n return {\n data: runInfos,\n total: -1, // Don't calculate total for fast path - not needed for UI\n hasMore,\n cursor: hasMore ? String(start + runInfos.length) : undefined,\n };\n }\n\n /**\n * Get all runs (jobs) across all queues with sorting and filtering\n * Uses fast path for common case (no filters, timestamp desc)\n */\n async getAllRuns(\n limit = 50,\n start = 0,\n sort?: SortOptions,\n filters?: {\n status?: JobStatus;\n tags?: Record<string, string>;\n text?: string;\n timeRange?: { start: number; end: number };\n },\n ): Promise<PaginatedResponse<RunInfoList>> {\n const sortField = sort?.field ?? \"timestamp\";\n const sortDir = sort?.direction === \"asc\" ? 1 : -1;\n const hasFilters = !!(\n filters?.status ||\n filters?.tags ||\n filters?.text ||\n filters?.timeRange\n );\n const isTimestampSort = sortField === \"timestamp\";\n\n // FAST PATH: No filters, timestamp desc = just get newest jobs\n // This is the most common use case and should be instant\n if (!hasFilters && isTimestampSort && sortDir === -1) {\n return this.getLatestRuns(limit, start);\n }\n\n // FILTERED PATH: More complex queries need full filtering logic\n const queueEntries = Array.from(this.queues.entries());\n\n // Determine which job types to fetch based on status filter\n const types = filters?.status\n ? [filters.status]\n : [\n \"active\",\n \"waiting\",\n \"waiting-children\",\n \"prioritized\",\n \"completed\",\n \"failed\",\n \"delayed\",\n ];\n\n const hasTimeRange = !!filters?.timeRange;\n const numQueues = Math.max(queueEntries.length, 1);\n\n if (queueEntries.length === 0) {\n return {\n data: [],\n total: 0,\n hasMore: false,\n cursor: undefined,\n };\n }\n\n // For filtered queries, fetch enough to likely fill one page after filtering\n // Reduced from 50 to be smarter about distribution\n const baseFetchPerQueue = Math.max(\n Math.ceil((limit * 2) / numQueues) + 3,\n 5,\n );\n\n let allJobs: { job: Job; queueName: string; state: JobStatus }[] = [];\n\n // Helper function to fetch from a single queue\n const fetchFromQueue = async (\n queueName: string,\n queue: Queue,\n fetchCount: number,\n ) => {\n // Use time-range queries for completed/failed jobs when time range is specified\n if (hasTimeRange && filters?.timeRange) {\n const timeRangeJobs: { job: Job; state: JobStatus }[] = [];\n\n // Use efficient time-range queries for completed/failed\n if (types.includes(\"completed\")) {\n const completedJobs = await this.getJobsByTimeRange(\n queue,\n \"completed\",\n filters.timeRange.start,\n filters.timeRange.end,\n fetchCount,\n );\n timeRangeJobs.push(\n ...completedJobs.map((job) => ({\n job,\n state: \"completed\" as JobStatus,\n })),\n );\n }\n\n if (types.includes(\"failed\")) {\n const failedJobs = await this.getJobsByTimeRange(\n queue,\n \"failed\",\n filters.timeRange.start,\n filters.timeRange.end,\n fetchCount,\n );\n timeRangeJobs.push(\n ...failedJobs.map((job) => ({\n job,\n state: \"failed\" as JobStatus,\n })),\n );\n }\n\n // For other types, use regular getJobs\n const otherTypes = types.filter(\n (t) => t !== \"completed\" && t !== \"failed\",\n );\n if (otherTypes.length > 0) {\n const otherJobArrays = await Promise.all(\n otherTypes.map(async (type) => {\n const jobs = await queue.getJobs(type as any, 0, fetchCount);\n return jobs.map((job) => ({ job, state: type as JobStatus }));\n }),\n );\n timeRangeJobs.push(...otherJobArrays.flat());\n }\n\n return timeRangeJobs.map(({ job, state }) => ({\n job,\n queueName,\n state,\n }));\n }\n\n // For status filter, only fetch that type\n if (filters?.status) {\n const jobs = await queue.getJobs(filters.status as any, 0, fetchCount);\n return jobs.map((job) => ({\n job,\n queueName,\n state: filters.status as JobStatus,\n }));\n }\n\n // Regular fetching for all types - track state for each type\n const jobArrays = await Promise.all(\n types.map(async (type) => {\n const jobs = await queue.getJobs(type as any, 0, fetchCount);\n return jobs.map((job) => ({ job, state: type as JobStatus }));\n }),\n );\n return jobArrays\n .flat()\n .map(({ job, state }) => ({ job, queueName, state }));\n };\n\n // Fetch from ALL queues in parallel\n const results = await Promise.all(\n queueEntries.map(([queueName, queue]) =>\n fetchFromQueue(queueName, queue, baseFetchPerQueue),\n ),\n );\n allJobs = results.flat();\n\n // Apply filters BEFORE sorting and pagination\n if (filters) {\n allJobs = allJobs.filter(({ job }) =>\n this.jobMatchesAllFilters(job, filters),\n );\n }\n\n // Sort all filtered jobs to ensure consistent ordering\n // sortDir: 1 = asc (oldest first), -1 = desc (newest first, default)\n if (isTimestampSort) {\n allJobs.sort((a, b) => {\n const aTime = a.job.timestamp || 0;\n const bTime = b.job.timestamp || 0;\n // Primary sort by timestamp\n const timeDiff = sortDir === -1 ? bTime - aTime : aTime - bTime;\n if (timeDiff !== 0) return timeDiff;\n // Secondary sort by queueName for stability\n const queueDiff = a.queueName.localeCompare(b.queueName);\n if (queueDiff !== 0) return queueDiff;\n // Tertiary sort by job ID for complete stability\n return (a.job.id || \"\").localeCompare(b.job.id || \"\");\n });\n }\n\n // Apply pagination\n const jobsToConvert = allJobs.slice(start, start + limit);\n\n // Convert only the jobs we'll return\n const runInfos = await Promise.all(\n jobsToConvert.map(async ({ job, queueName, state }) => {\n const info = await this.jobToInfo(job, \"list\", state);\n return { ...info, queueName } as RunInfoList;\n }),\n );\n\n // For non-timestamp sorting, sort after conversion\n if (!isTimestampSort) {\n runInfos.sort((a, b) => {\n const aVal = this.getSortValueForList(a, sortField);\n const bVal = this.getSortValueForList(b, sortField);\n if (aVal < bVal) return -1 * sortDir;\n if (aVal > bVal) return 1 * sortDir;\n return 0;\n });\n }\n\n // Build cursor for next page\n const hasMore = allJobs.length > start + limit;\n\n return {\n data: runInfos,\n total: -1, // Don't calculate total - not needed for UI\n hasMore,\n cursor: hasMore ? String(start + runInfos.length) : undefined,\n };\n }\n\n /**\n * Get all schedulers (repeatable and delayed jobs) with sorting\n */\n async getSchedulers(\n repeatableSort?: SortOptions,\n delayedSort?: SortOptions,\n ): Promise<{\n repeatable: SchedulerInfo[];\n delayed: DelayedJobInfo[];\n }> {\n const repeatable: SchedulerInfo[] = [];\n const delayed: DelayedJobInfo[] = [];\n\n // Fetch from all queues in parallel\n const queueEntries = Array.from(this.queues.entries());\n const results = await Promise.all(\n queueEntries.map(async ([queueName, queue]) => {\n const [repeatableJobs, delayedJobs] = await Promise.all([\n // getJobSchedulers replaces the deprecated getRepeatableJobs (removed\n // in BullMQ v6) and exposes the scheduler id + template \"Run now\" needs.\n queue.getJobSchedulers(),\n queue.getJobs(\"delayed\", 0, 50),\n ]);\n return { queueName, repeatableJobs, delayedJobs };\n }),\n );\n\n // Process results\n for (const { queueName, repeatableJobs, delayedJobs } of results) {\n for (const job of repeatableJobs) {\n repeatable.push({\n key: job.key,\n name: job.name || \"unnamed\",\n queueName,\n pattern: job.pattern ?? undefined,\n every: job.every ?? undefined,\n next: job.next ?? undefined,\n endDate: job.endDate ?? undefined,\n tz: job.tz ?? undefined,\n });\n }\n\n for (const job of delayedJobs) {\n // Skip scheduler next-run jobs; they belong to the Repeatable tab.\n if (job.repeatJobKey) continue;\n const delay = job.opts.delay || 0;\n delayed.push({\n id: job.id || \"\",\n name: job.name,\n queueName,\n delay,\n processAt: job.timestamp + delay,\n data: job.data,\n });\n }\n }\n\n // Sort repeatable jobs\n const repeatableField = repeatableSort?.field ?? \"name\";\n const repeatableDir = repeatableSort?.direction === \"desc\" ? -1 : 1;\n repeatable.sort((a, b) => {\n const aVal = this.getSchedulerSortValue(a, repeatableField);\n const bVal = this.getSchedulerSortValue(b, repeatableField);\n if (aVal < bVal) return -1 * repeatableDir;\n if (aVal > bVal) return 1 * repeatableDir;\n return 0;\n });\n\n // Sort delayed jobs\n const delayedField = delayedSort?.field ?? \"processAt\";\n const delayedDir = delayedSort?.direction === \"desc\" ? -1 : 1;\n delayed.sort((a, b) => {\n const aVal = this.getDelayedSortValue(a, delayedField);\n const bVal = this.getDelayedSortValue(b, delayedField);\n if (aVal < bVal) return -1 * delayedDir;\n if (aVal > bVal) return 1 * delayedDir;\n return 0;\n });\n\n return { repeatable, delayed };\n }\n\n /**\n * Enqueue a new job (for testing)\n */\n async enqueueJob(request: TestJobRequest): Promise<{ id: string }> {\n const queue = this.queues.get(request.queueName);\n if (!queue) {\n throw new Error(`Queue \"${request.queueName}\" not found`);\n }\n\n const job = await queue.add(request.jobName, request.data, {\n delay: request.opts?.delay,\n priority: request.opts?.priority,\n attempts: request.opts?.attempts,\n });\n\n return { id: job.id || \"\" };\n }\n\n /**\n * Trigger an immediate, one-off run of a repeatable job scheduler.\n *\n * Enqueues a clone of the scheduler's job (name + data + opts) so the run\n * behaves like a scheduled execution, but as a standalone job. The repeat\n * schedule is left untouched, and scheduling internals are stripped so it\n * runs now and never collides with the deterministic ids of scheduled\n * iterations.\n *\n * `schedulerKey` is the scheduler's `key` from {@link getSchedulers} (the id\n * passed to upsertJobScheduler). We resolve it via getJobSchedulers rather\n * than the singular getJobScheduler, which mis-parses some keys.\n *\n * Data/opts source: modern schedulers (upsertJobScheduler) carry a `template`.\n * Legacy repeatables — `queue.add(name, data, { repeat })` — store NO template,\n * so we fall back to the next pending iteration (a delayed job tagged with this\n * scheduler's key), which carries the real payload and options.\n */\n async runSchedulerNow(\n queueName: string,\n schedulerKey: string,\n ): Promise<{ id: string } | null> {\n const queue = this.queues.get(queueName);\n if (!queue) return null;\n\n // Re-fetch so we use the scheduler's current state, not stale list data.\n const scheduler = (await queue.getJobSchedulers()).find(\n (s) => s.key === schedulerKey,\n );\n if (!scheduler) return null;\n\n let data: unknown = scheduler.template?.data;\n let rawOpts: Record<string, unknown> = { ...scheduler.template?.opts };\n\n if (data === undefined) {\n // Legacy repeatable: no template — clone the next scheduled iteration.\n const delayed = await queue.getJobs(\"delayed\", 0, -1);\n const next = delayed.find((j) => j.repeatJobKey === schedulerKey);\n if (next) {\n data = next.data;\n rawOpts = { ...next.opts };\n }\n }\n\n // Strip scheduling internals so this is a clean one-off that runs now.\n const {\n repeat: _repeat,\n jobId: _jobId,\n delay: _delay,\n repeatJobKey: _repeatJobKey,\n prevMillis: _prevMillis,\n timestamp: _timestamp,\n ...opts\n } = rawOpts;\n\n const job = await queue.add(\n scheduler.name,\n data ?? {},\n opts as JobsOptions,\n );\n\n return { id: job.id ?? \"\" };\n }\n\n /**\n * Extract tag values from job data based on configured tag fields\n */\n private extractTags(data: unknown): JobTags | undefined {\n if (!this.tagFields.length || !data || typeof data !== \"object\") {\n return undefined;\n }\n\n const tags: JobTags = {};\n const dataObj = data as Record<string, unknown>;\n\n for (const field of this.tagFields) {\n const value = dataObj[field];\n if (\n value !== undefined &&\n (typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null)\n ) {\n tags[field] = value as string | number | boolean | null;\n }\n }\n\n return Object.keys(tags).length > 0 ? tags : undefined;\n }\n\n /**\n * Get unique values for a specific tag field across all jobs\n */\n async getTagValues(\n field: string,\n limit = 50,\n ): Promise<{ value: string; count: number }[]> {\n const valueMap = new Map<string, number>();\n const types = [\n \"active\",\n \"waiting\",\n \"waiting-children\",\n \"prioritized\",\n \"completed\",\n \"failed\",\n \"delayed\",\n ];\n\n // Fetch jobs from all queues in parallel\n const queueEntries = Array.from(this.queues.entries());\n const queueResults = await Promise.all(\n queueEntries.map(async ([, queue]) => {\n const jobArrays = await Promise.all(\n types.map((type) => queue.getJobs(type as any, 0, 100)),\n );\n return jobArrays.flat();\n }),\n );\n\n // Process all jobs\n for (const jobs of queueResults) {\n for (const job of jobs) {\n if (job.data && typeof job.data === \"object\") {\n const dataObj = job.data as Record<string, unknown>;\n const value = dataObj[field];\n if (value !== undefined && value !== null) {\n const strValue = String(value);\n valueMap.set(strValue, (valueMap.get(strValue) || 0) + 1);\n }\n }\n }\n }\n\n // Sort by count descending and take top N\n const sorted = Array.from(valueMap.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, limit)\n .map(([value, count]) => ({ value, count }));\n\n return sorted;\n }\n\n /**\n * Get sortable value from JobInfo/RunInfo\n */\n private getSortValue(\n item: JobInfo | RunInfo,\n field: string,\n ): string | number {\n switch (field) {\n case \"timestamp\":\n return item.timestamp ?? 0;\n case \"name\":\n return item.name.toLowerCase();\n case \"status\":\n return item.status;\n case \"duration\":\n return item.duration ?? 0;\n case \"queueName\":\n return \"queueName\" in item ? item.queueName.toLowerCase() : \"\";\n case \"processedOn\":\n return item.processedOn ?? 0;\n default:\n return item.timestamp ?? 0;\n }\n }\n\n /**\n * Get sortable value from RunInfoList (lightweight version)\n */\n private getSortValueForList(\n item: RunInfoList,\n field: string,\n ): string | number {\n switch (field) {\n case \"timestamp\":\n return item.timestamp ?? 0;\n case \"name\":\n return item.name.toLowerCase();\n case \"status\":\n return item.status;\n case \"duration\":\n return item.duration ?? 0;\n case \"queueName\":\n return item.queueName.toLowerCase();\n case \"processedOn\":\n return item.processedOn ?? 0;\n default:\n return item.timestamp ?? 0;\n }\n }\n\n /**\n * Get sortable value from SchedulerInfo\n */\n private getSchedulerSortValue(\n item: SchedulerInfo,\n field: string,\n ): string | number {\n switch (field) {\n case \"name\":\n return item.name.toLowerCase();\n case \"queueName\":\n return item.queueName.toLowerCase();\n case \"pattern\":\n return item.pattern?.toLowerCase() ?? \"\";\n case \"next\":\n return item.next ?? 0;\n case \"tz\":\n return item.tz?.toLowerCase() ?? \"\";\n default:\n return item.name.toLowerCase();\n }\n }\n\n /**\n * Get sortable value from DelayedJobInfo\n */\n private getDelayedSortValue(\n item: DelayedJobInfo,\n field: string,\n ): string | number {\n switch (field) {\n case \"name\":\n return item.name.toLowerCase();\n case \"queueName\":\n return item.queueName.toLowerCase();\n case \"processAt\":\n return item.processAt;\n case \"delay\":\n return item.delay;\n default:\n return item.processAt;\n }\n }\n\n /**\n * Convert a BullMQ Job to JobInfo or RunInfoList\n * @param job - The BullMQ job to convert\n * @param fields - \"list\" for lightweight list view, \"full\" for complete job details\n * @param knownState - Optional: skip getState() call if state is already known from fetch\n */\n private async jobToInfo(\n job: Job,\n fields: \"list\" | \"full\" = \"full\",\n knownState?: JobStatus,\n ): Promise<JobInfo | RunInfoList> {\n // Use known state if provided (avoids expensive Redis getState() call)\n // Otherwise use cached state, or fetch and cache\n let state = knownState;\n if (!state) {\n const cacheKey = `${job.queueName}:${job.id}`;\n state = this.jobStateCache.get(cacheKey);\n if (!state) {\n state = (await job.getState()) as JobStatus;\n this.jobStateCache.set(cacheKey, state);\n }\n }\n const duration =\n job.finishedOn && job.processedOn\n ? job.finishedOn - job.processedOn\n : undefined;\n\n // Normalize progress to number or object\n let progress: number | object = 0;\n if (typeof job.progress === \"number\") {\n progress = job.progress;\n } else if (typeof job.progress === \"object\" && job.progress !== null) {\n progress = job.progress;\n }\n\n // Extract configured tag fields from job data\n const tags = this.extractTags(job.data);\n\n // Extract parent info if this job is part of a flow\n let parent: { id: string; queueName: string } | undefined;\n if (job.parent?.id) {\n parent = {\n id: job.parent.id,\n queueName:\n job.parent.queueKey?.split(\":\")[1] || job.parent.queueKey || \"\",\n };\n } else if (job.parentKey) {\n // parentKey format: \"bull:queueName:jobId\"\n const parts = job.parentKey.split(\":\");\n if (parts.length >= 3) {\n parent = {\n id: parts[parts.length - 1] || \"\",\n queueName: parts[parts.length - 2] || \"\",\n };\n }\n }\n\n if (fields === \"list\") {\n return {\n id: job.id || \"\",\n name: job.name,\n queueName: job.queueName,\n status: state as JobStatus,\n processedOn: job.processedOn,\n timestamp: job.timestamp,\n duration,\n tags,\n failedReason: job.failedReason,\n } satisfies RunInfoList;\n }\n\n return {\n id: job.id || \"\",\n name: job.name,\n data: job.data,\n opts: {\n attempts: job.opts.attempts,\n delay: job.opts.delay,\n priority: job.opts.priority,\n },\n progress,\n attemptsMade: job.attemptsMade,\n processedOn: job.processedOn,\n finishedOn: job.finishedOn,\n timestamp: job.timestamp,\n failedReason: job.failedReason,\n stacktrace: job.stacktrace ?? undefined,\n returnvalue: job.returnvalue,\n status: state as JobStatus,\n duration,\n tags,\n parent,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Bulk Operations\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Retry multiple jobs across queues\n * Processed in parallel for better performance\n */\n async bulkRetry(\n jobs: { queueName: string; jobId: string }[],\n ): Promise<{ success: number; failed: number }> {\n const results = await Promise.allSettled(\n jobs.map(async ({ queueName, jobId }) => {\n const queue = this.queues.get(queueName);\n if (!queue) {\n throw new Error(\"Queue not found\");\n }\n\n const job = await queue.getJob(jobId);\n if (!job) {\n throw new Error(\"Job not found\");\n }\n\n await job.retry();\n this.invalidateJobCache(queueName, jobId);\n return { success: true };\n }),\n );\n\n let success = 0;\n let failed = 0;\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n success++;\n } else {\n failed++;\n }\n }\n\n return { success, failed };\n }\n\n /**\n * Delete multiple jobs across queues\n * Processed in parallel for better performance\n */\n async bulkDelete(\n jobs: { queueName: string; jobId: string }[],\n ): Promise<{ success: number; failed: number }> {\n const results = await Promise.allSettled(\n jobs.map(async ({ queueName, jobId }) => {\n const queue = this.queues.get(queueName);\n if (!queue) {\n throw new Error(\"Queue not found\");\n }\n\n const job = await queue.getJob(jobId);\n if (!job) {\n throw new Error(\"Job not found\");\n }\n\n await job.remove();\n this.invalidateJobCache(queueName, jobId);\n return { success: true };\n }),\n );\n\n let success = 0;\n let failed = 0;\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n success++;\n } else {\n failed++;\n }\n }\n\n return { success, failed };\n }\n\n /**\n * Promote multiple delayed jobs across queues (move to waiting)\n * Processed in parallel for better performance\n */\n async bulkPromote(\n jobs: { queueName: string; jobId: string }[],\n ): Promise<{ success: number; failed: number }> {\n const results = await Promise.allSettled(\n jobs.map(async ({ queueName, jobId }) => {\n const queue = this.queues.get(queueName);\n if (!queue) {\n throw new Error(\"Queue not found\");\n }\n\n const job = await queue.getJob(jobId);\n if (!job) {\n throw new Error(\"Job not found\");\n }\n\n await job.promote();\n this.invalidateJobCache(queueName, jobId);\n return { success: true };\n }),\n );\n\n let success = 0;\n let failed = 0;\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n success++;\n } else {\n failed++;\n }\n }\n\n return { success, failed };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Flow Operations\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get all flows (jobs that have children or are part of a flow) - cached\n * Optimized to focus on waiting-children type first and early exit\n */\n async getFlows(limit = 50): Promise<FlowSummary[]> {\n if (!this.flowProducer) {\n return [];\n }\n\n return this.cached(`flows:${limit}`, this.CACHE_TTL.flows, async () => {\n const queueEntries = Array.from(this.queues.entries());\n\n // Check counts first to skip empty queues\n const queueChecks = await Promise.all(\n queueEntries.map(async ([queueName, queue]) => {\n const counts = await this.getCachedJobCounts(queue);\n const hasRelevantJobs =\n (counts.waiting || 0) > 0 ||\n (counts[\"waiting-children\"] || 0) > 0 ||\n (counts.active || 0) > 0;\n return { queueName, queue, hasRelevantJobs };\n }),\n );\n\n const relevantQueues = queueChecks.filter((q) => q.hasRelevantJobs);\n if (relevantQueues.length === 0) {\n return [];\n }\n\n // Focus on waiting-children first (most likely to be flows)\n // Then check other types with reduced limits\n const queueResults = await Promise.all(\n relevantQueues.map(async ({ queueName, queue }) => {\n try {\n // Fetch waiting-children first (most likely flows) with higher limit\n const waitingChildrenJobs = await queue.getJobs(\n [\"waiting-children\"],\n 0,\n 50,\n );\n\n // If we already have enough flows, skip other types\n if (waitingChildrenJobs.length >= limit) {\n return { queueName, jobs: waitingChildrenJobs };\n }\n\n // Fetch other types with reduced limits\n const otherTypes = [\n \"active\",\n \"waiting\",\n \"prioritized\",\n \"completed\",\n \"failed\",\n \"delayed\",\n ];\n const otherJobArrays = await Promise.all(\n otherTypes.map(async (type) => {\n try {\n return await queue.getJobs(type as any, 0, 30); // Reduced from 100\n } catch {\n return [];\n }\n }),\n );\n\n const allJobs = [...waitingChildrenJobs, ...otherJobArrays.flat()];\n return { queueName, jobs: allJobs };\n } catch {\n return { queueName, jobs: [] };\n }\n }),\n );\n\n // Collect potential root jobs (no parent)\n // Early exit when we have enough flows\n const seenJobIds = new Set<string>();\n const potentialRoots: { queueName: string; job: Job }[] = [];\n\n for (const { queueName, jobs } of queueResults) {\n // Early exit if we have enough flows\n if (potentialRoots.length >= limit * 2) {\n break;\n }\n\n for (const job of jobs) {\n if (!job?.id) continue;\n\n const jobKey = `${queueName}:${job.id}`;\n if (seenJobIds.has(jobKey)) continue;\n seenJobIds.add(jobKey);\n\n // Check if this is a root job (has no parent)\n const hasParent = !!job.parent || !!job.parentKey;\n if (!hasParent) {\n potentialRoots.push({ queueName, job });\n\n // Early exit if we have enough potential roots\n if (potentialRoots.length >= limit * 2) {\n break;\n }\n }\n }\n }\n\n // Check flows in parallel (batch to avoid overwhelming Redis)\n const batchSize = 20;\n const flows: FlowSummary[] = [];\n\n for (\n let i = 0;\n i < potentialRoots.length && flows.length < limit;\n i += batchSize\n ) {\n const batch = potentialRoots.slice(i, i + batchSize);\n const batchResults = await Promise.all(\n batch.map(async ({ queueName, job }) => {\n try {\n const flowTree = await this.flowProducer!.getFlow({\n id: job.id!,\n queueName,\n });\n\n if (flowTree?.children && flowTree.children.length > 0) {\n const stats = this.countFlowStats(flowTree);\n const state = await job.getState();\n\n return {\n id: job.id!,\n name: job.name,\n queueName,\n status: state as JobStatus,\n totalJobs: stats.total,\n completedJobs: stats.completed,\n failedJobs: stats.failed,\n timestamp: job.timestamp,\n duration:\n job.finishedOn && job.processedOn\n ? job.finishedOn - job.processedOn\n : undefined,\n } as FlowSummary;\n }\n } catch {\n // Job might not have a flow, skip\n }\n return null;\n }),\n );\n\n for (const result of batchResults) {\n if (result && flows.length < limit) {\n flows.push(result);\n }\n }\n }\n\n return flows.sort((a, b) => b.timestamp - a.timestamp);\n });\n }\n\n /**\n * Get a single flow tree by root job ID\n */\n async getFlow(queueName: string, jobId: string): Promise<FlowNode | null> {\n if (!this.flowProducer) {\n return null;\n }\n\n try {\n const flowTree = await this.flowProducer.getFlow({\n id: jobId,\n queueName,\n });\n\n if (!flowTree) {\n return null;\n }\n\n return this.convertFlowTree(flowTree);\n } catch {\n return null;\n }\n }\n\n /**\n * Create a new flow\n */\n async createFlow(request: CreateFlowRequest): Promise<{ id: string }> {\n if (!this.flowProducer) {\n throw new Error(\"FlowProducer not initialized\");\n }\n\n const flowJob = this.buildFlowJob(request);\n const result = await this.flowProducer.add(flowJob);\n\n return { id: result.job.id || \"\" };\n }\n\n /**\n * Build a FlowJob from CreateFlowRequest or CreateFlowChildRequest\n */\n private buildFlowJob(\n request: CreateFlowRequest | CreateFlowChildRequest,\n ): any {\n const result: any = {\n name: request.name,\n queueName: request.queueName,\n data: request.data || {},\n };\n\n if (request.children && request.children.length > 0) {\n result.children = request.children.map((child) =>\n this.buildFlowJob(child),\n );\n }\n\n return result;\n }\n\n /**\n * Convert BullMQ flow tree to our FlowNode structure\n */\n private async convertFlowTree(tree: any): Promise<FlowNode> {\n const job = tree.job;\n const state = await job.getState();\n const duration =\n job.finishedOn && job.processedOn\n ? job.finishedOn - job.processedOn\n : undefined;\n\n const jobInfo: JobInfo = {\n id: job.id || \"\",\n name: job.name,\n data: job.data,\n opts: {\n attempts: job.opts?.attempts,\n delay: job.opts?.delay,\n priority: job.opts?.priority,\n },\n progress:\n typeof job.progress === \"number\"\n ? job.progress\n : typeof job.progress === \"object\"\n ? job.progress\n : 0,\n attemptsMade: job.attemptsMade || 0,\n processedOn: job.processedOn,\n finishedOn: job.finishedOn,\n timestamp: job.timestamp,\n failedReason: job.failedReason,\n stacktrace: job.stacktrace ?? undefined,\n returnvalue: job.returnvalue,\n status: state as JobStatus,\n duration,\n tags: this.extractTags(job.data),\n };\n\n const children: FlowNode[] = [];\n if (tree.children && tree.children.length > 0) {\n for (const child of tree.children) {\n children.push(await this.convertFlowTree(child));\n }\n }\n\n return {\n job: jobInfo,\n queueName: job.queueName || tree.queueName || \"\",\n children: children.length > 0 ? children : undefined,\n };\n }\n\n /**\n * Count statistics for a flow tree\n */\n private countFlowStats(tree: any): {\n total: number;\n completed: number;\n failed: number;\n } {\n let total = 1;\n let completed = 0;\n let failed = 0;\n\n // Check current job status (synchronously from available data)\n const job = tree.job;\n if (job.finishedOn && !job.failedReason) {\n completed = 1;\n } else if (job.failedReason) {\n failed = 1;\n }\n\n if (tree.children) {\n for (const child of tree.children) {\n const childStats = this.countFlowStats(child);\n total += childStats.total;\n completed += childStats.completed;\n failed += childStats.failed;\n }\n }\n\n return { total, completed, failed };\n }\n}\n","import type { Queue, RedisOptions } from \"bullmq\";\nimport { AlertManager } from \"./alert-manager\";\nimport { createAlertStore } from \"./alert-store\";\nimport { discoverQueues } from \"./discover\";\nimport { QueueManager } from \"./queue-manager\";\nimport type { QueueGroup, WorkbenchOptions } from \"./types\";\n\n/**\n * Internal metadata produced by {@link WorkbenchCore.fromOptions} when queues\n * are auto-discovered from a Redis connection.\n */\nexport interface DiscoveryMeta {\n /** Total number of queues found on the connection (before capping). */\n total: number;\n /** True if the result was capped at `maxQueues`. */\n capped: boolean;\n /** The cap that was applied. */\n cap: number;\n}\n\n/**\n * Core Workbench class that manages the dashboard\n */\nexport class WorkbenchCore {\n readonly options: Required<Pick<WorkbenchOptions, \"title\" | \"readonly\">> &\n WorkbenchOptions;\n readonly queueManager: QueueManager;\n readonly discovery: DiscoveryMeta | null;\n readonly alertManager: AlertManager | null;\n readonly alertsPersistence: \"redis\" | \"memory\" | \"custom\" | null;\n\n constructor(\n options: WorkbenchOptions | Queue[],\n discovery: DiscoveryMeta | null = null,\n ) {\n const opts = Array.isArray(options) ? { queues: options } : options;\n const queueGroups = collectQueueGroups(opts);\n const explicit = mergeExplicitQueues(opts.queues, queueGroups);\n\n this.options = {\n title: \"Workbench\",\n readonly: false,\n ...opts,\n queues: explicit.length > 0 ? explicit : opts.queues,\n };\n\n this.discovery = discovery;\n\n const allowEmpty = !!this.options.redis;\n\n if (explicit.length === 0 && !allowEmpty) {\n throw new Error(\n \"Workbench requires at least one queue. Pass queues directly, use queueGroups, or provide a redis connection for auto-discovery.\",\n );\n }\n\n this.queueManager = new QueueManager(\n explicit,\n this.options.tags || [],\n queueGroups,\n );\n\n if (this.options.alerts?.enabled !== false) {\n const alertsOpts = this.options.alerts ?? {};\n const queueConnection = explicit[0]?.opts?.connection;\n const { store, persistence } = createAlertStore(alertsOpts, {\n queueConnection,\n redis: this.options.redis,\n prefix: this.options.prefix ?? \"bull\",\n });\n this.alertsPersistence = persistence;\n this.alertManager = new AlertManager(\n this.queueManager,\n () => this.queueManager.getQueueMap(),\n alertsOpts,\n store,\n persistence,\n );\n void this.alertManager.start().catch((err) => {\n console.error(\"[workbench] Failed to start alert manager:\", err);\n });\n } else {\n this.alertsPersistence = null;\n this.alertManager = null;\n }\n }\n\n /**\n * Async factory: build a `WorkbenchCore` from `WorkbenchOptions`, performing\n * BullMQ queue auto-discovery via `SCAN <prefix>:*:meta` when `queues` is\n * not provided.\n *\n * - When `queues` is set explicitly, behaves like `new WorkbenchCore(opts)`.\n * - When only `redis` is set, scans the connection for queues, caps at\n * `maxQueues` (default 100) to avoid connection storms with very large\n * deployments, and constructs the core with the resulting list.\n * - When no queues are discovered, the core is constructed with an empty\n * queue map so the dashboard can render an \"empty\" state instead of\n * erroring out.\n */\n static async fromOptions(opts: WorkbenchOptions): Promise<WorkbenchCore> {\n const queueGroups = collectQueueGroups(opts);\n const explicit = mergeExplicitQueues(opts.queues, queueGroups);\n if (explicit.length > 0) {\n return new WorkbenchCore({ ...opts, queues: explicit });\n }\n if (!opts.redis) {\n throw new Error(\n \"WorkbenchCore.fromOptions requires either `queues` or `redis`\",\n );\n }\n\n const prefix = opts.prefix ?? \"bull\";\n const cap = opts.maxQueues ?? 100;\n const all = await discoverQueues(opts.redis, prefix);\n const queues = all.slice(0, cap);\n\n return new WorkbenchCore(\n { ...opts, queues },\n { total: all.length, capped: all.length > cap, cap },\n );\n }\n\n /**\n * Get the queue manager instance\n */\n getQueueManager(): QueueManager {\n return this.queueManager;\n }\n\n /**\n * Check if authentication is required\n */\n requiresAuth(): boolean {\n return !!(this.options.auth?.username && this.options.auth?.password);\n }\n\n /**\n * Validate authentication credentials\n */\n validateAuth(username: string, password: string): boolean {\n if (!this.requiresAuth()) return true;\n return (\n username === this.options.auth?.username &&\n password === this.options.auth?.password\n );\n }\n\n /**\n * Get dashboard configuration for the UI\n */\n getConfig() {\n return {\n title: this.options.title,\n logo: this.options.logo,\n readonly: this.options.readonly,\n queues: this.queueManager.getQueueNames(),\n queueGroups: this.queueManager.getQueueGroups(),\n tags: this.queueManager.getTagFields(),\n discovery: this.discovery,\n alertsEnabled: this.alertManager !== null,\n alertsPersistence: this.alertsPersistence,\n };\n }\n}\n\n// Re-export for convenience: callers using `WorkbenchOptions.redis` can also\n// import the underlying connection type without depending on `bullmq` directly.\nexport type { RedisOptions };\n\nfunction collectQueueGroups(opts: WorkbenchOptions): QueueGroup[] {\n return [...(opts.queueGroups ?? []), ...(opts.groups ?? [])];\n}\n\nfunction mergeExplicitQueues(\n queues: Queue[] | undefined,\n queueGroups: QueueGroup[],\n): Queue[] {\n const merged = [...(queues ?? []), ...queueGroups.flatMap((g) => g.queues)];\n const seen = new Set<string>();\n const deduped: Queue[] = [];\n for (const queue of merged) {\n if (seen.has(queue.name)) continue;\n seen.add(queue.name);\n deduped.push(queue);\n }\n return deduped;\n}\n","import type { Queue } from \"bullmq\";\nimport type { WorkbenchOptions } from \"../core/types\";\nimport { WorkbenchCore } from \"../core/workbench\";\nimport { buildWorkbenchApp } from \"../server/hono-app\";\n\nexport interface FetchHandlerResult {\n /**\n * Web-standard fetch handler. Accepts a `Request` and returns a `Response`.\n * Suitable for Elysia's `.mount(path, handler)`, Next.js route handlers,\n * Bun.serve, and any other web-standards-friendly runtime.\n */\n fetch: (req: Request) => Promise<Response>;\n /**\n * The underlying `WorkbenchCore` instance. Exposed so adapters can read\n * config, query state, or wire up custom auth strategies.\n */\n core: WorkbenchCore;\n}\n\n/**\n * Build a self-contained web-fetch handler for Workbench: API routes,\n * `/config`, static `/assets/:file`, an `index.html` catch-all with a\n * correct `<base href>`, CORS on `/api/*`, and optional Basic Auth on\n * everything.\n *\n * This is the engine shared by every fetch-native adapter (Elysia, Next.js).\n * Express and Fastify adapters use {@link buildRouteTable} directly instead.\n *\n * When `options.basePath` is set, the handler rewrites the incoming Request\n * URL to strip that prefix before routing. This makes the bridge work\n * uniformly for both fetch hosts:\n *\n * - `Elysia.mount()` already strips the prefix before calling us — the\n * strip below is a no-op in that case.\n * - Next.js App Router preserves the full path — the strip is what lets\n * our internal routes (`/api/*`, `/config`, …) match.\n */\nexport function createFetchHandler(\n options: WorkbenchOptions | Queue[],\n): FetchHandlerResult {\n const core = new WorkbenchCore(options);\n const app = buildWorkbenchApp(core);\n const basePath = normalizeBasePath(core.options.basePath);\n\n const fetchHandler = async (req: Request): Promise<Response> => {\n if (basePath) {\n const url = new URL(req.url);\n if (\n url.pathname === basePath ||\n url.pathname.startsWith(`${basePath}/`)\n ) {\n const rewritten = url.pathname.slice(basePath.length) || \"/\";\n url.pathname = rewritten;\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n body:\n req.method === \"GET\" || req.method === \"HEAD\"\n ? undefined\n : req.body,\n // @ts-expect-error duplex is required for streaming bodies in Node 18+\n duplex: \"half\",\n redirect: req.redirect,\n };\n return app.fetch(new Request(url.toString(), init));\n }\n }\n return app.fetch(req);\n };\n\n return {\n fetch: fetchHandler,\n core,\n };\n}\n\n/**\n * Normalize a base path: trim trailing slashes so we can do exact prefix\n * comparisons without double-slashes. Returns `null` for the default mount\n * (`\"\"` or `\"/\"`) so the no-strip fast path runs.\n */\nfunction normalizeBasePath(value: string | undefined): string | null {\n if (!value) return null;\n const trimmed = value.endsWith(\"/\") ? value.slice(0, -1) : value;\n if (trimmed === \"\" || trimmed === \"/\") return null;\n return trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n}\n","/**\n * Parse a `Basic` Authorization header and check it against the configured\n * credentials. Uses constant-time comparison to avoid leaking timing info\n * about which character mismatched.\n *\n * Returns `true` when credentials are valid, `false` otherwise. Both inputs\n * being undefined or empty count as a failed check — adapters should only\n * call this when `core.requiresAuth()` is true.\n */\nexport function checkBasicAuth(\n authHeader: string | undefined,\n username: string,\n password: string,\n): boolean {\n if (!authHeader) return false;\n\n const [scheme, encoded] = authHeader.split(\" \");\n if (!scheme || scheme.toLowerCase() !== \"basic\" || !encoded) return false;\n\n let decoded: string;\n try {\n decoded = Buffer.from(encoded, \"base64\").toString(\"utf-8\");\n } catch {\n return false;\n }\n\n const idx = decoded.indexOf(\":\");\n if (idx === -1) return false;\n const user = decoded.slice(0, idx);\n const pass = decoded.slice(idx + 1);\n\n return safeEqual(user, username) && safeEqual(pass, password);\n}\n\n/**\n * Constant-time string compare. Returns false immediately on length mismatch\n * (length itself is not secret — protecting against timing leaks on the\n * character-by-character compare is what matters).\n */\nfunction safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return diff === 0;\n}\n\n/**\n * Standard 401 response body + header for an unauthenticated Basic auth\n * request. Adapters use this when `checkBasicAuth` returns false.\n */\nexport const BASIC_AUTH_CHALLENGE = {\n status: 401 as const,\n headers: { \"WWW-Authenticate\": 'Basic realm=\"Workbench\"' },\n body: \"Unauthorized\",\n};\n"],"mappings":"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MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;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","names":["flags","args","keys","require_built","toUTF8Array","generate","require_lodash","require_lodash","match","match","match","useColors","require_utils","timeout","pipeline","exec","callback","j","err","err","_a","Buffer","errorHandler","Redis","err","require_built","match","raw","Node","_Node","Node","Hono","join","match","raw","Hono","join","import_ioredis","jobs"]}
|