@nightx.co/pulsar 0.0.0-stage → 1.0.15

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.
Files changed (162) hide show
  1. package/README.md +14 -2
  2. package/dist/chunk-3sg08kqp.js +10 -0
  3. package/dist/chunk-3sg08kqp.js.map +9 -0
  4. package/dist/chunk-a9kye38b.js +54 -0
  5. package/dist/chunk-a9kye38b.js.map +12 -0
  6. package/dist/chunk-cpn1qh4e.js +10 -0
  7. package/dist/chunk-cpn1qh4e.js.map +12 -0
  8. package/dist/chunk-rrj8rm04.js +10 -0
  9. package/dist/chunk-rrj8rm04.js.map +11 -0
  10. package/dist/cluster/Nebula.d.ts +30 -0
  11. package/dist/cluster/Nebula.d.ts.map +1 -0
  12. package/dist/helpers/computeConfigDelta.d.ts +18 -0
  13. package/dist/helpers/computeConfigDelta.d.ts.map +1 -0
  14. package/dist/helpers/defineQueue.d.ts +13 -0
  15. package/dist/helpers/defineQueue.d.ts.map +1 -0
  16. package/dist/helpers/generateShaHash.d.ts +2 -0
  17. package/dist/helpers/generateShaHash.d.ts.map +1 -0
  18. package/dist/index.d.ts +6 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +8 -0
  21. package/dist/index.js.map +50 -0
  22. package/dist/integrations/PulsarEventsIntegrations.d.ts +7 -0
  23. package/dist/integrations/PulsarEventsIntegrations.d.ts.map +1 -0
  24. package/dist/integrations/PulsarLoggerIntegrations.d.ts +12 -0
  25. package/dist/integrations/PulsarLoggerIntegrations.d.ts.map +1 -0
  26. package/dist/integrations/index.d.ts +4 -0
  27. package/dist/integrations/index.d.ts.map +1 -0
  28. package/dist/integrations/index.js +8 -0
  29. package/dist/integrations/index.js.map +11 -0
  30. package/dist/modules/Queue.module.d.ts +45 -0
  31. package/dist/modules/Queue.module.d.ts.map +1 -0
  32. package/dist/modules/Scheduler.module.d.ts +42 -0
  33. package/dist/modules/Scheduler.module.d.ts.map +1 -0
  34. package/dist/modules/Tick.module.d.ts +35 -0
  35. package/dist/modules/Tick.module.d.ts.map +1 -0
  36. package/dist/modules/TickController.module.d.ts +36 -0
  37. package/dist/modules/TickController.module.d.ts.map +1 -0
  38. package/dist/monitoring/PulsarMonitoringStreamProducer.d.ts +2 -0
  39. package/dist/monitoring/PulsarMonitoringStreamProducer.d.ts.map +1 -0
  40. package/dist/monitoring/index.d.ts +2 -0
  41. package/dist/monitoring/index.d.ts.map +1 -0
  42. package/dist/monitoring/server/PulsarMonitoringStream.d.ts +2 -0
  43. package/dist/monitoring/server/PulsarMonitoringStream.d.ts.map +1 -0
  44. package/dist/network/NetworkInterface.d.ts +13 -0
  45. package/dist/network/NetworkInterface.d.ts.map +1 -0
  46. package/dist/network/UnifiedTransportManager.d.ts +21 -0
  47. package/dist/network/UnifiedTransportManager.d.ts.map +1 -0
  48. package/dist/network/abstract/BaseNetworkDriver.d.ts +17 -0
  49. package/dist/network/abstract/BaseNetworkDriver.d.ts.map +1 -0
  50. package/dist/network/auth/Authenticator.d.ts +2 -0
  51. package/dist/network/auth/Authenticator.d.ts.map +1 -0
  52. package/dist/network/drivers/HttpNetworkDriver.d.ts +31 -0
  53. package/dist/network/drivers/HttpNetworkDriver.d.ts.map +1 -0
  54. package/dist/network/drivers/WebSocketNetworkDriver.d.ts +23 -0
  55. package/dist/network/drivers/WebSocketNetworkDriver.d.ts.map +1 -0
  56. package/dist/network/helpers/httpQueueOperations.d.ts +2 -0
  57. package/dist/network/helpers/httpQueueOperations.d.ts.map +1 -0
  58. package/dist/network/interfaces/network.types.d.ts +13 -0
  59. package/dist/network/interfaces/network.types.d.ts.map +1 -0
  60. package/dist/run/Queues.d.ts +2 -0
  61. package/dist/run/Queues.d.ts.map +1 -0
  62. package/dist/run/index.d.ts +2 -0
  63. package/dist/run/index.d.ts.map +1 -0
  64. package/dist/run/index2.d.ts +2 -0
  65. package/dist/run/index2.d.ts.map +1 -0
  66. package/dist/runtimes/IsolateRuntime.d.ts +17 -0
  67. package/dist/runtimes/IsolateRuntime.d.ts.map +1 -0
  68. package/dist/runtimes/PersistentRuntime.d.ts +22 -0
  69. package/dist/runtimes/PersistentRuntime.d.ts.map +1 -0
  70. package/dist/runtimes/ServerlessRuntime.d.ts +15 -0
  71. package/dist/runtimes/ServerlessRuntime.d.ts.map +1 -0
  72. package/dist/runtimes/runtimeTypes.d.ts +15 -0
  73. package/dist/runtimes/runtimeTypes.d.ts.map +1 -0
  74. package/dist/server/PulsarRequestHandler.d.ts +41 -0
  75. package/dist/server/PulsarRequestHandler.d.ts.map +1 -0
  76. package/dist/server/helpers/acquireRedisLock.d.ts +14 -0
  77. package/dist/server/helpers/acquireRedisLock.d.ts.map +1 -0
  78. package/dist/server/helpers/checkFencingValidity.d.ts +14 -0
  79. package/dist/server/helpers/checkFencingValidity.d.ts.map +1 -0
  80. package/dist/server/helpers/performIsolateRestart.d.ts +20 -0
  81. package/dist/server/helpers/performIsolateRestart.d.ts.map +1 -0
  82. package/dist/server/index.d.ts +2 -0
  83. package/dist/server/index.d.ts.map +1 -0
  84. package/dist/server/index.js +8 -0
  85. package/dist/server/index.js.map +13 -0
  86. package/dist/server/parser/parseRequest.d.ts +10 -0
  87. package/dist/server/parser/parseRequest.d.ts.map +1 -0
  88. package/dist/server/utility/extract-headers.d.ts +14 -0
  89. package/dist/server/utility/extract-headers.d.ts.map +1 -0
  90. package/dist/service/ConfigurationStore.d.ts +23 -0
  91. package/dist/service/ConfigurationStore.d.ts.map +1 -0
  92. package/dist/service/Isolate.service.d.ts +12 -0
  93. package/dist/service/Isolate.service.d.ts.map +1 -0
  94. package/dist/service/Pulsar.service.d.ts +41 -0
  95. package/dist/service/Pulsar.service.d.ts.map +1 -0
  96. package/dist/service/PulsarBaseService.d.ts +49 -0
  97. package/dist/service/PulsarBaseService.d.ts.map +1 -0
  98. package/dist/service/PulsarEventBus.d.ts +36 -0
  99. package/dist/service/PulsarEventBus.d.ts.map +1 -0
  100. package/dist/service/SwarmBudgetTracker.d.ts +14 -0
  101. package/dist/service/SwarmBudgetTracker.d.ts.map +1 -0
  102. package/dist/service/consumers/PulsarWorker.d.ts +10 -0
  103. package/dist/service/consumers/PulsarWorker.d.ts.map +1 -0
  104. package/dist/shared/PulsarRuntimeCore.d.ts +55 -0
  105. package/dist/shared/PulsarRuntimeCore.d.ts.map +1 -0
  106. package/dist/static/TimingProfile.d.ts +9 -0
  107. package/dist/static/TimingProfile.d.ts.map +1 -0
  108. package/dist/static/static.d.ts +3 -0
  109. package/dist/static/static.d.ts.map +1 -0
  110. package/dist/storage/PulsarStorage.d.ts +42 -0
  111. package/dist/storage/PulsarStorage.d.ts.map +1 -0
  112. package/dist/storage/drivers/PostgresDriver.d.ts +20 -0
  113. package/dist/storage/drivers/PostgresDriver.d.ts.map +1 -0
  114. package/dist/storage/drivers/RedisDriver.d.ts +20 -0
  115. package/dist/storage/drivers/RedisDriver.d.ts.map +1 -0
  116. package/dist/storage/drivers/types.d.ts +27 -0
  117. package/dist/storage/drivers/types.d.ts.map +1 -0
  118. package/dist/storage/index.d.ts +4 -0
  119. package/dist/storage/index.d.ts.map +1 -0
  120. package/dist/storage/index.js +403 -0
  121. package/dist/storage/index.js.map +21 -0
  122. package/dist/storage/repositories/PostgresEngineOperationRepository.d.ts +39 -0
  123. package/dist/storage/repositories/PostgresEngineOperationRepository.d.ts.map +1 -0
  124. package/dist/storage/repositories/PostgresQueueRepository.d.ts +26 -0
  125. package/dist/storage/repositories/PostgresQueueRepository.d.ts.map +1 -0
  126. package/dist/storage/repositories/QueueRepository.d.ts +20 -0
  127. package/dist/storage/repositories/QueueRepository.d.ts.map +1 -0
  128. package/dist/storage/repositories/RedisQueueRepository.d.ts +28 -0
  129. package/dist/storage/repositories/RedisQueueRepository.d.ts.map +1 -0
  130. package/dist/subsys/DeferredTickEvaluator.d.ts +23 -0
  131. package/dist/subsys/DeferredTickEvaluator.d.ts.map +1 -0
  132. package/dist/subsys/EventBus.d.ts +13 -0
  133. package/dist/subsys/EventBus.d.ts.map +1 -0
  134. package/dist/subsys/ExecutionProfileSwitcher.d.ts +10 -0
  135. package/dist/subsys/ExecutionProfileSwitcher.d.ts.map +1 -0
  136. package/dist/subsys/LoggerService.d.ts +15 -0
  137. package/dist/subsys/LoggerService.d.ts.map +1 -0
  138. package/dist/subsys/PulsarClock.d.ts +32 -0
  139. package/dist/subsys/PulsarClock.d.ts.map +1 -0
  140. package/dist/subsys/RuntimeCacheStorage.d.ts +18 -0
  141. package/dist/subsys/RuntimeCacheStorage.d.ts.map +1 -0
  142. package/dist/subsys/RuntimeEventBridge.d.ts +16 -0
  143. package/dist/subsys/RuntimeEventBridge.d.ts.map +1 -0
  144. package/dist/types/base.types.d.ts +65 -0
  145. package/dist/types/base.types.d.ts.map +1 -0
  146. package/dist/types/config.types.d.ts +56 -0
  147. package/dist/types/config.types.d.ts.map +1 -0
  148. package/dist/types/consumer.types.d.ts +36 -0
  149. package/dist/types/consumer.types.d.ts.map +1 -0
  150. package/dist/types/engine.types.d.ts +139 -0
  151. package/dist/types/engine.types.d.ts.map +1 -0
  152. package/dist/types/eventTriggerStrategry.types.d.ts +34 -0
  153. package/dist/types/eventTriggerStrategry.types.d.ts.map +1 -0
  154. package/dist/types/integrations.types.d.ts +16 -0
  155. package/dist/types/integrations.types.d.ts.map +1 -0
  156. package/dist/types/nebula.types.d.ts +65 -0
  157. package/dist/types/nebula.types.d.ts.map +1 -0
  158. package/dist/types/queue.types.d.ts +106 -0
  159. package/dist/types/queue.types.d.ts.map +1 -0
  160. package/dist/types/runtime.types.d.ts +89 -0
  161. package/dist/types/runtime.types.d.ts.map +1 -0
  162. package/package.json +71 -5
@@ -0,0 +1,403 @@
1
+ /**
2
+ * Pulsar by NightX
3
+ * Copyright (c) 2026 NightX. All rights reserved.
4
+ */
5
+ import{h as U}from"../chunk-cpn1qh4e.js";import"../chunk-3sg08kqp.js";var F=90000;class N{}var UW="9223372036854775807";class q extends N{driver;constructor(Y){super();this.driver=Y;this.driver=Y}get sql(){return this.driver.getNativeClient()}get prefix(){if(!this.driver.prefix)throw Error("[PostgresQueueRepository] Driver prefix is missing. Ensure the prefix is configured by calling driver.setPrefix(string).");return this.driver.prefix}async registerWorker(Y,W,$,Q=1/0){let G=`${this.prefix}:queues:${Y}:worker_registry`,D=`${this.prefix}:global_worker_registry`,z=W.map((Z)=>Z.workerId);if(z.length===0)return[];let T=Q===1/0?2147483647:Q;return(await this.sql`
6
+ SELECT granted_worker_id
7
+ FROM register_workers(
8
+ ${G}::varchar,
9
+ ${D}::varchar,
10
+ ${$}::int,
11
+ ${T}::int,
12
+ ${F}::bigint,
13
+ ${this.sql.array(z)}::varchar[]
14
+ )
15
+ `).map((Z)=>Z.granted_worker_id)}async deregisterWorker(Y,W){if(!Y)return;let $=`${this.prefix}:queues:${W}:worker_registry`,Q=`${this.prefix}:global_worker_registry`,G=`${$}:${Y}`;await this.sql`
16
+ DELETE FROM pulsar.queue_cache
17
+ WHERE (key = ${$} AND field = ${Y})
18
+ OR (key = ${Q} AND field = ${G})
19
+ `}async getActiveWorkersCount(Y){let W=`${this.prefix}:queues:${Y}:worker_registry`,[$]=await this.sql`
20
+ SELECT COUNT(*)::int AS count
21
+ FROM pulsar.queue_cache
22
+ WHERE key = ${W} AND expires_at > pulsar.now_ms()
23
+ `;return $?.count??0}async setFutureSchedule(Y,W){let $=`${this.prefix}:queues:${Y}:next_ready_at`;await this.sql`
24
+ INSERT INTO pulsar.queue_cache (key, field, value, expires_at)
25
+ VALUES (${$}, '', ${W}, ${UW})
26
+ ON CONFLICT (key, field)
27
+ DO UPDATE SET value = EXCLUDED.value
28
+ `}async getGlobalActiveWorkersCount(){let Y=`${this.prefix}:global_worker_registry`,[W]=await this.sql`
29
+ SELECT COUNT(*)::int AS count
30
+ FROM pulsar.queue_cache
31
+ WHERE key = ${Y} AND expires_at > pulsar.now_ms()
32
+ `;return W?.count??0}async refundGlobalJobBudget(Y,W){if(Y<=0)return;let $=`${this.budgetKeyPrefix()}${W}`;await this.sql`
33
+ UPDATE pulsar.queue_cache
34
+ SET value = GREATEST(0, value::int - ${Y})::text
35
+ WHERE key = ${$} AND field = 'count'
36
+ `}budgetKeyPrefix(){return`${this.prefix}:global:job_budget`}async claimGlobalJobBudget(Y,W){if(W===1/0||W<=0)return{granted:Y,window:""};let $=this.budgetKeyPrefix();return await this.sql.begin(async(Q)=>{await Q`SELECT pg_advisory_xact_lock(hashtext(${$}))`;let[G]=await Q`
37
+ SELECT floor(pulsar.now_ms() / 1000)::float8 AS second
38
+ `,D=G.second,z=`${$}${D}`,T=(D+2)*1000;await Q`
39
+ DELETE FROM pulsar.queue_cache
40
+ WHERE starts_with(key, ${$})
41
+ AND expires_at <= pulsar.now_ms()
42
+ `;let[H]=await Q`
43
+ SELECT COALESCE(
44
+ (SELECT value::int FROM pulsar.queue_cache WHERE key = ${z} AND field = 'count'),
45
+ 0
46
+ ) AS used
47
+ `,Z=Math.max(0,Math.min(Y,W-(H?.used??0)));if(Z>0)await Q`
48
+ INSERT INTO pulsar.queue_cache (key, field, value, expires_at)
49
+ VALUES (${z}, 'count', ${String(Z)}, ${T}::bigint)
50
+ ON CONFLICT (key, field) DO UPDATE
51
+ SET value = (pulsar.queue_cache.value::int + ${Z})::text
52
+ `;return{granted:Z,window:String(D)}})}async acquireQueueLock(Y,W,$){let Q=Date.now(),G=Q+$;return(await this.sql`
53
+ INSERT INTO pulsar.queue_cache (key, field, value, expires_at)
54
+ VALUES (${`${this.prefix}:${Y}`}, '', ${W}, ${G})
55
+ ON CONFLICT (key, field) DO UPDATE
56
+ SET value = EXCLUDED.value, expires_at = EXCLUDED.expires_at
57
+ WHERE pulsar.queue_cache.expires_at IS NULL
58
+ OR pulsar.queue_cache.expires_at <= ${Q}
59
+ OR pulsar.queue_cache.value = EXCLUDED.value
60
+ RETURNING 1
61
+ `).length>0}async releaseQueueLock(Y,W){let $=Date.now();return(await this.sql`
62
+ DELETE FROM pulsar.queue_cache
63
+ WHERE key = ${`${this.prefix}:${Y}`}
64
+ AND field = ''
65
+ AND value = ${W}
66
+ AND (expires_at IS NULL OR expires_at > ${$})
67
+ RETURNING 1
68
+ `).length===1}async evaluateDeadRun(Y,W,$,Q,G=15000,D="lock:idp",z="lock:edp:"){let T=Date.now(),H=`${this.prefix}:${D}`,Z=`${this.prefix}:${z}`,X=await this.sql.begin(async(M)=>{await M`SELECT pg_advisory_xact_lock(hashtext(${`dead_run:${Y}`}))`;let w=async(h)=>{let[L]=await M`
69
+ SELECT value FROM pulsar.queue_cache
70
+ WHERE key = ${h} AND field = ''
71
+ AND (expires_at IS NULL OR expires_at > ${T})
72
+ `;return L?.value??null};if(W==="interval-driven-pooler"){let h=await w(H);if(h!==null&&h!==Q)return"IDP_LOCKED";return"ALLOWED"}if(W==="event-driven-pooler"){if($<=0)return"NO_JOBS";let h=`${Z}${Y}`,L=await w(h);if(L!==null)return L===Q?"ALLOWED":"EDP_LOCKED";if(await w(`${h}:pending`)!==null)return"EDP_DISPATCH_PENDING";return await M`
73
+ INSERT INTO pulsar.queue_cache (key, field, value, expires_at)
74
+ VALUES (${`${h}:pending`}, '', '1', ${T+G})
75
+ ON CONFLICT (key, field) DO UPDATE
76
+ SET value = EXCLUDED.value, expires_at = EXCLUDED.expires_at
77
+ `,"ALLOWED"}return"UNKNOWN_POOLER"});if(X!=="ALLOWED")console.log(`DEAD_RUN STOP REASON : ${X}`);return X==="ALLOWED"}async clearDispatchPending(Y){let W=`${Y}:pending`;await this.sql`
78
+ DELETE FROM pulsar.queue_cache
79
+ WHERE key = ${W} AND field = ''
80
+ `}async getStopSignal(){return await!1}}var b=`--[[\r
81
+ * Lua Script for Atomic Multi-Queue Worker Registration:\r
82
+ * 1. Purges expired workers from the target Queue Hash and the Global Sorted Set.\r
83
+ * 2. Checks active counts against both queue-level and swarm-level global concurrency.\r
84
+ * 3. Atomic check: slotsAvailable = MIN(localSlots, globalSlots).\r
85
+ * 4. Grants candidate IDs up to slotsAvailable and registers them in both Hash and ZSET.\r
86
+ * 5. Returns array of granted worker IDs.\r
87
+ ]]\r
88
+ \r
89
+ local queueKey = KEYS[1]\r
90
+ local globalKey = KEYS[2]\r
91
+ \r
92
+ local localConcurrency = tonumber(ARGV[1])\r
93
+ local globalConcurrency = tonumber(ARGV[2])\r
94
+ local now = tonumber(ARGV[3])\r
95
+ local ttlMs = tonumber(ARGV[4])\r
96
+ \r
97
+ local newExpireAt = now + ttlMs\r
98
+ \r
99
+ -- 1. Purge expired workers from Global Sorted Set\r
100
+ -- redis.call('ZREMRANGEBYSCORE', globalKey, '-inf', now)\r
101
+ \r
102
+ -- Optional defensive cleanup:\r
103
+ -- removes expired local fields on Redis versions/providers where expiration\r
104
+ -- may not have been processed before this script runs.\r
105
+ local localEntries = redis.call('HGETALL', queueKey)\r
106
+ local localActiveCount = 0\r
107
+ \r
108
+ for i = 1, #localEntries, 2 do\r
109
+ local workerId = localEntries[i]\r
110
+ local expireAt = tonumber(localEntries[i + 1]) or 0\r
111
+ \r
112
+ if expireAt <= now then\r
113
+ redis.call('HDEL', queueKey, workerId)\r
114
+ else\r
115
+ localActiveCount = localActiveCount + 1\r
116
+ end\r
117
+ end\r
118
+ \r
119
+ -- 3. Check active count against Global Concurrency\r
120
+ local globalActiveCount = redis.call('HLEN', globalKey)\r
121
+ local globalAvailable = globalConcurrency - globalActiveCount\r
122
+ \r
123
+ if globalAvailable <= 0 then\r
124
+ return {}\r
125
+ end\r
126
+ \r
127
+ -- 4. Check active count against Queue Local Concurrency\r
128
+ local localAvailable = localConcurrency - localActiveCount\r
129
+ \r
130
+ if localAvailable <= 0 then\r
131
+ return {}\r
132
+ end\r
133
+ \r
134
+ -- 5. Calculate true atomic capacity\r
135
+ local availableSlots = math.min(globalAvailable, localAvailable)\r
136
+ \r
137
+ -- 6. Grant candidate worker IDs up to available capacity\r
138
+ local grantedWorkers = {}\r
139
+ local candidateCount = #ARGV - 4\r
140
+ local toGrant = math.min(availableSlots, candidateCount)\r
141
+ local newExpireAt = now + ttlMs\r
142
+ \r
143
+ for i = 1, toGrant do\r
144
+ local candidateId = ARGV[4 + i]\r
145
+ \r
146
+ -- Important:\r
147
+ -- A global ID must be unique across every queue.\r
148
+ -- See the TypeScript section below.\r
149
+ local globalWorkerId = queueKey .. ':' .. candidateId\r
150
+ \r
151
+ -- Add to Queue Hash\r
152
+ redis.call('HSET', queueKey, candidateId, newExpireAt)\r
153
+ local expireResult = redis.call(\r
154
+ 'HPEXPIRE',\r
155
+ queueKey,\r
156
+ ttlMs,\r
157
+ 'FIELDS',\r
158
+ 1,\r
159
+ candidateId\r
160
+ )\r
161
+ \r
162
+ -- Add to Global ZSET (Score = Expiration Timestamp)\r
163
+ -- Global registration\r
164
+ redis.call('HSET', globalKey, globalWorkerId, newExpireAt)\r
165
+ redis.call(\r
166
+ 'HPEXPIREAT',\r
167
+ globalKey,\r
168
+ newExpireAt,\r
169
+ 'FIELDS',\r
170
+ 1,\r
171
+ globalWorkerId\r
172
+ )\r
173
+ \r
174
+ table.insert(grantedWorkers, candidateId)\r
175
+ end\r
176
+ \r
177
+ return grantedWorkers`;var g=`local lockKey = KEYS[1]\r
178
+ local ownerId = ARGV[1]\r
179
+ local ttl = tonumber(ARGV[2])\r
180
+ \r
181
+ local currentOwner = redis.call("GET", lockKey)\r
182
+ \r
183
+ if not currentOwner then\r
184
+ redis.call("SET", lockKey, ownerId, "PX", ttl)\r
185
+ return 1\r
186
+ elseif currentOwner == ownerId then\r
187
+ redis.call("PEXPIRE", lockKey, ttl)\r
188
+ return 1\r
189
+ else\r
190
+ return 0\r
191
+ end`;var c=`-- KEYS[1]: Lock key\r
192
+ -- ARGV[1]: Isolate Owner ID\r
193
+ \r
194
+ local lockKey = KEYS[1]\r
195
+ local ownerId = ARGV[1]\r
196
+ \r
197
+ if redis.call("GET", lockKey) == ownerId then\r
198
+ return redis.call("DEL", lockKey)\r
199
+ else\r
200
+ return 0\r
201
+ end`;var p=`-- KEYS[1]: IDP lock key\r
202
+ -- KEYS[2]: EDP lock key prefix\r
203
+ -- ARGV[1]: queue name\r
204
+ -- ARGV[2]: pooler type\r
205
+ -- ARGV[3]: total jobs (ready + delayed)\r
206
+ -- ARGV[4]: continuation owner id\r
207
+ -- ARGV[5]: dispatch-pending TTL (ms)\r
208
+ \r
209
+ local idpLockKey = KEYS[1]\r
210
+ local edpLockPrefix = KEYS[2]\r
211
+ local queueName = ARGV[1]\r
212
+ local poolerType = ARGV[2]\r
213
+ local totalJobs = tonumber(ARGV[3])\r
214
+ local continuationOwnerId = ARGV[4]\r
215
+ local dispatchTtlMs = tonumber(ARGV[5])\r
216
+ \r
217
+ if poolerType == "interval-driven-pooler" then\r
218
+ local idpOwner = redis.call("GET", idpLockKey)\r
219
+ \r
220
+ -- No lock: an external invocation may be started.\r
221
+ if not idpOwner then\r
222
+ return "ALLOWED"\r
223
+ end\r
224
+ \r
225
+ -- The current lock belongs to the engine continuation.\r
226
+ -- Allow the continuation to proceed.\r
227
+ if idpOwner == continuationOwnerId then\r
228
+ return "ALLOWED"\r
229
+ end\r
230
+ \r
231
+ return "IDP_LOCKED"\r
232
+ \r
233
+ elseif poolerType == "event-driven-pooler" then \r
234
+ if totalJobs <= 0 then\r
235
+ return "NO_JOBS"\r
236
+ end\r
237
+ \r
238
+ local edpLockKey = edpLockPrefix .. queueName\r
239
+ local dispatchKey = edpLockKey .. ":pending"\r
240
+ \r
241
+ local edpOwner = redis.call("GET", edpLockKey)\r
242
+ \r
243
+ -- The current execution already owns this queue lock.\r
244
+ if edpOwner then\r
245
+ if edpOwner == continuationOwnerId then\r
246
+ return "ALLOWED"\r
247
+ end\r
248
+ \r
249
+ return "EDP_LOCKED"\r
250
+ end\r
251
+ \r
252
+ -- A previous dispatch has not landed yet.\r
253
+ local dispatchPending = redis.call("GET", dispatchKey)\r
254
+ \r
255
+ if dispatchPending then\r
256
+ return "EDP_DISPATCH_PENDING"\r
257
+ end\r
258
+ \r
259
+ -- Reserve the dispatch slot atomically.\r
260
+ redis.call("SET", dispatchKey, "1", "PX", dispatchTtlMs)\r
261
+ \r
262
+ return "ALLOWED"\r
263
+ end\r
264
+ \r
265
+ return "UNKNOWN_POOLER"`;var n=`-- KEYS[1]: window key prefix (e.g. "pulsar::global:job_budget"); window second is appended here\r
266
+ -- ARGV[1]: requested\r
267
+ -- ARGV[2]: limit per window\r
268
+ -- Returns: { granted, windowSecond }\r
269
+ --\r
270
+ -- The window is derived from the Redis server clock and RETURNED, so the caller\r
271
+ -- can refund against the exact window it claimed from (even if the second rolls over).\r
272
+ \r
273
+ local prefix = KEYS[1]\r
274
+ local requested = tonumber(ARGV[1])\r
275
+ local limit = tonumber(ARGV[2])\r
276
+ \r
277
+ local t = redis.call('TIME')\r
278
+ local window = tostring(t[1])\r
279
+ local key = prefix .. ':' .. window\r
280
+ \r
281
+ local current = tonumber(redis.call('GET', key) or "0")\r
282
+ local remaining = limit - current\r
283
+ \r
284
+ if remaining <= 0 then\r
285
+ return { 0, window }\r
286
+ end\r
287
+ \r
288
+ local granted = math.min(requested, remaining)\r
289
+ redis.call('INCRBY', key, granted)\r
290
+ \r
291
+ -- Keep the window key alive for 2 seconds. Check TTL instead of "current == 0"\r
292
+ -- so a key is never left without an expiry.\r
293
+ if redis.call('TTL', key) == -1 then\r
294
+ redis.call('EXPIRE', key, 2)\r
295
+ end\r
296
+ \r
297
+ return { granted, window }`;var t=`local key = KEYS[1]\r
298
+ local refund = tonumber(ARGV[1])\r
299
+ local current = tonumber(redis.call('GET', key) or "0")\r
300
+ \r
301
+ if current > 0 then\r
302
+ local new_val = math.max(0, current - refund)\r
303
+ redis.call('SET', key, new_val, 'KEEPTTL')\r
304
+ end`;var x=`-- KEYS[1]: worker registry hash (workerId -> expireAtMs)\r
305
+ -- Returns the number of live (non-expired) entries and purges expired ones.\r
306
+ -- Replaces HLEN, which can include expired-but-not-yet-reclaimed fields.\r
307
+ \r
308
+ local key = KEYS[1]\r
309
+ \r
310
+ local t = redis.call('TIME')\r
311
+ local now = tonumber(t[1]) * 1000 + math.floor(tonumber(t[2]) / 1000)\r
312
+ \r
313
+ local entries = redis.call('HGETALL', key)\r
314
+ local active = 0\r
315
+ \r
316
+ for i = 1, #entries, 2 do\r
317
+ local expireAt = tonumber(entries[i + 1]) or 0\r
318
+ if expireAt <= now then\r
319
+ redis.call('HDEL', key, entries[i])\r
320
+ else\r
321
+ active = active + 1\r
322
+ end\r
323
+ end\r
324
+ \r
325
+ return active`;var d=`local val = redis.call('GET', KEYS[1])\r
326
+ if val == 'true' or val == '1' then\r
327
+ return 1\r
328
+ else\r
329
+ return 0\r
330
+ end`;class R extends N{driver;protocol;constructor(Y){super();this.driver=Y;this.protocol=Y.options.protocol,this.driver=Y}get redis(){return this.driver.getNativeClient()}get prefix(){if(!this.driver.prefix)throw Error("[RedisQueueRepository] Driver prefix is missing. Ensure the prefix is configured by calling driver.setPrefix(string).");return this.driver.prefix}async registerWorker(Y,W,$,Q=1/0){let G=`${this.prefix}:queues:${Y}:worker_registry`,D=`${this.prefix}:global_worker_registry`,z=Date.now(),T=[G,D],H=[$,Q===1/0?999999999:Q,z,F,...W.map((Z)=>Z.workerId)];if(this.protocol==="http")return await this.redis.eval(b,T,H)??[];else return await this.redis.eval(b,T.length,...T,...H)??[]}async deregisterWorker(Y,W){if(!Y)return;let $=`${this.prefix}:queues:${W}:worker_registry`,Q=`${this.prefix}:global_worker_registry`,G=`${$}:${Y}`,D=this.redis.pipeline();D.hdel($,Y),D.hdel(Q,G),await D.exec()}async getActiveWorkersCount(Y){let W=`${this.prefix}:queues:${Y}:worker_registry`,$=await this.evalScript(x,[W],[]);return Number($??0)}async getGlobalActiveWorkersCount(){let Y=`${this.prefix}:global_worker_registry`,W=await this.evalScript(x,[Y],[]);return Number(W??0)}async setFutureSchedule(Y,W){let $=`${this.prefix}:queues:${Y}:next_ready_at`;await this.redis.set($,W)}budgetKeyPrefix(){return`${this.prefix}:global:job_budget`}async claimGlobalJobBudget(Y,W){if(W===1/0||W<=0)return{granted:Y,window:""};let $=await this.evalScript(n,[this.budgetKeyPrefix()],[Y,W]),[Q,G]=$??[0,""];return{granted:Number(Q??0),window:String(G??"")}}async refundGlobalJobBudget(Y,W){if(Y<=0||!W)return;let $=`${this.budgetKeyPrefix()}:${W}`;await this.evalScript(t,[$],[Y])}async acquireQueueLock(Y,W,$){let Q=await this.evalScript(g,[`${this.prefix}:${Y}`],[W,$]);return Boolean(Q)}async releaseQueueLock(Y,W){return await this.evalScript(c,[`${this.prefix}:${Y}`],[W])===1}async clearDispatchPending(Y){let W=`${Y}:pending`;await this.redis.del(W)}async evaluateDeadRun(Y,W,$,Q,G=15000,D="lock:idp",z="lock:edp:"){let T=`${this.prefix}:${D}`,H=`${this.prefix}:${z}`,Z=[T,H],X=[Y,W,$,Q,G],M=await this.evalScript(p,Z,X);if(M!=="ALLOWED")console.log(`DEAD_RUN STOP REASON : ${M}`);return M==="ALLOWED"}async evalScript(Y,W,$){if(this.protocol==="http")return await this.redis.eval(Y,W,$);return await this.redis.eval(Y,W.length,...W,...$)}async getStopSignal(Y){let W=`${this.prefix}:stops:${Y}`;return await this.evalScript(d,[W],[])===1}}function r(Y,W){let $=Y.self_url!==W.self_url,Q=new Map(Y.queues.map((H)=>[H.queue,H.pooler])),G=new Map(W.queues.map((H)=>[H.queue,H.pooler])),D=[],z=[],T=[];for(let[H,Z]of G.entries())if(!Q.has(H))D.push({queue:H,pooler:Z});else{let X=Q.get(H);if(X!==Z)T.push({queue:H,oldPooler:X,newPooler:Z})}for(let[H,Z]of Q.entries())if(!G.has(H))z.push({queue:H,pooler:Z});return{urlChanged:$,addedQueues:D,removedQueues:z,modifiedQueues:T}}class O{driver;logger;constructor(Y){this.driver=Y;this.logger=new U}get sql(){return this.driver.getNativeClient()}async addRestart(Y){if(Y.length==0)return;if(Y.some((Q)=>Q.pooler=="interval-driven-pooler"))await this.sql`
331
+ WITH clear_all AS (
332
+ DELETE FROM pulsar.pulsar_restart
333
+ )
334
+ INSERT INTO pulsar.pulsar_restart (queue_name, type, created_at)
335
+ VALUES ('__GLOBAL__', 'interval-driven-pooler', NOW())
336
+ ON CONFLICT (queue_name)
337
+ DO UPDATE SET type = EXCLUDED.type, created_at = NOW();
338
+ `,this.logger.log("[Storage] : Restart added for [interval-driven-pooler].");let $=Y.filter((Q)=>Q.pooler=="event-driven-pooler");for(let{queue:Q}of $)await this.sql`
339
+ INSERT INTO pulsar.pulsar_restart (queue_name, type, created_at, owner)
340
+ VALUES (${Q}, 'event-driven-pooler', NOW(), 'engine')
341
+ ON CONFLICT (queue_name)
342
+ DO UPDATE SET type = EXCLUDED.type, created_at = NOW();
343
+ `,this.logger.log(`[Storage] : Restart added for queue (${Q}) for [event-driven-pooler]`)}async updateRestartOwnership(Y=null,W){let $=!Y?"__GLOBAL__":Y;await this.sql`
344
+ UPDATE pulsar.pulsar_restart
345
+ SET owner = ${W}
346
+ WHERE queue_name = ${$}
347
+ `,this.logger.log(`[Storage] : Ownership updated for restart [${Y}]`)}async deleteRestart(Y){await this.sql`
348
+ DELETE FROM pulsar.pulsar_restart
349
+ WHERE queue_name = ${Y} OR queue_name = '__GLOBAL__'
350
+ `}async pingHealthCheck(){await this.sql`
351
+ INSERT INTO pulsar.health_check (id, last_health_checked_at)
352
+ OVERRIDING SYSTEM VALUE
353
+ VALUES (1, NOW())
354
+ ON CONFLICT (id)
355
+ DO UPDATE SET last_health_checked_at = EXCLUDED.last_health_checked_at;
356
+ `}async checkFencingTokenValidity(Y,W){let $=typeof W==="string"?parseInt(W,10):W;if(isNaN($))return!1;return(await this.sql`
357
+ UPDATE pulsar.queue_locks
358
+ SET last_valid_token = ${$}
359
+ WHERE queue_name = ${Y}
360
+ AND fencing_token = ${$}
361
+ AND last_valid_token <= ${$}
362
+ RETURNING true AS is_valid;
363
+ `)[0]?.is_valid??!1}async verifyAndSyncConfiguration(Y,W,$,Q){let G=this.sql.json(Q);return await this.sql.begin(async(D)=>{let T=(await this.sql`
364
+ WITH existing AS (
365
+ SELECT configurations, hash FROM pulsar.meta WHERE instance_id = ${W}
366
+ ),
367
+ updated AS (
368
+ INSERT INTO pulsar.meta (host, version, url, configurations, is_active, instance_id)
369
+ VALUES (${Y}, '1.0.0', ${$}, ${G}::jsonb, true, ${W})
370
+ ON CONFLICT (instance_id)
371
+ DO UPDATE SET
372
+ host = EXCLUDED.host,
373
+ url = EXCLUDED.url,
374
+ configurations = EXCLUDED.configurations,
375
+ updated_at = CURRENT_TIMESTAMP
376
+ WHERE pulsar.meta.hash <> pulsar.generate_sha256(${G}::text)
377
+ RETURNING *
378
+ )
379
+ SELECT
380
+ (SELECT configurations FROM existing) AS old_configurations,
381
+ EXISTS (SELECT 1 FROM updated) AS is_changed,
382
+ EXISTS (SELECT 1 FROM existing) AS was_existing;
383
+ `)[0],H=!T.was_existing,Z=T.is_changed,X=T.old_configurations,M=void 0;if(Z&&!H&&X)M=r(X,Q);if(Z||H)await this.synchronizeQueueTriggers(D,X,Q,W);return{isChanged:Z,isNew:H,oldConfigurations:X,delta:M}})}async synchronizeQueueTriggers(Y,W,$,Q){let D=new Map((W?.queues||[]).filter((T)=>T.pooler==="event-driven-pooler").map((T)=>[T.queue,T.pooler])),z=new Map($.queues.filter((T)=>T.pooler==="event-driven-pooler").map((T)=>[T.queue,T.pooler]));if($.runtime==="persistent"){let T=$.event_trigger_strategy;if(T==="POSTGRES_NOTIFY"||T==="WEBHOOK"){let H=$.queues.filter((Z)=>Z.pooler==="event-driven-pooler");for(let{queue:Z}of H){let X=`pulsar_edp_trigger_${Z}_on_pgmq`,M=`pgmq.q_${Z}`;this.logger.log(`[Configuration] : Dropping trigger ${X} on ${M} due to runtime config changes`),await Y.unsafe(`DROP TRIGGER IF EXISTS ${X} ON ${M};`)}}}for(let[T]of D.entries())if(!z.has(T)){let H=`pulsar_edp_trigger_${T}_on_pgmq`,Z=`pgmq.q_${T}`;await Y.unsafe(`DROP TRIGGER IF EXISTS ${H} ON ${Z};`)}for(let[T]of z.entries()){let H=`pulsar_edp_trigger_${T}_on_pgmq`,Z=`pgmq.q_${T}`;await Y.unsafe(`DROP TRIGGER IF EXISTS ${H} ON ${Z};`),await Y.unsafe(`
384
+ CREATE TRIGGER ${H}
385
+ AFTER INSERT ON ${Z}
386
+ REFERENCING NEW TABLE AS new_table
387
+ FOR EACH STATEMENT
388
+ EXECUTE FUNCTION pulsar.handle_edp_queue_dispatch('${T}', '${Q}');
389
+ `)}}async subscribeToDatabaseEvents(Y,W,$){await this.sql.listen(Y,async(Q)=>{try{let G=JSON.parse(Q);await W(G)}catch(G){this.logger.error("[TcpListenTransport] : Failed to parse payload:",G)}},$)}async getPollingQueueEntries(Y,W=10){return(await this.sql`
390
+ SELECT *
391
+ FROM pulsar.pool_queue_entries
392
+ WHERE queue = ${Y}
393
+ ORDER BY created_at ASC
394
+ LIMIT ${W}
395
+ FOR UPDATE SKIP LOCKED;
396
+ `).map((Q)=>Q)}async deletePollingQueueEntry(Y){await this.sql`
397
+ DELETE FROM pulsar.pool_queue_entries
398
+ WHERE id = ${Y}
399
+ `}}class e{repository;cache;db;ops;logger;strategy;syncIntervalMs;isConnected=!1;constructor(Y){if(this.logger=new U,!Y.db)throw Error("[PulsarUnifiedStorage] PostgresDriver is required for core engine to operate.");this.cache=Y.cache,this.db=Y.db,this.syncIntervalMs=Y.syncIntervalMs??500,this.ops=new O(this.db);let W=Y.strategy??"AUTO";if(W==="AUTO")W=this.cache?"REDIS_CACHE":"PG_UNLOGGED";switch(this.strategy=W,this.strategy){case"REDIS_CACHE":if(!this.cache)throw Error("[PulsarUnifiedStorage] Strategy 'REDIS_CACHE' requires a valid Redis cache driver.");this.repository=new R(this.cache);break;case"PG_UNLOGGED":this.repository=new q(this.db);break;default:throw Error(`[PulsarUnifiedStorage] Unsupported storage strategy: '${this.strategy}'`)}}bindInstanceId(Y){if(this.cache)this.cache.setKeyPrefix(Y);if(this.db)this.db.setKeyPrefix(Y)}async connect(){if(this.isConnected)return;let Y=[];if(this.cache)Y.push(this.cache.connect());if(this.db)Y.push(this.db.connect());await Promise.all(Y),this.logger.log(`[PulsarStorage] Storage layer active [Strategy: ${this.strategy}]`),this.isConnected=!0}async disconnect(){this.isConnected=!1;let Y=[];if(this.cache)Y.push(this.cache.disconnect());if(this.db)Y.push(this.db.disconnect());await Promise.all(Y)}async healthCheck(){let Y={};if(this.db)Y.db=await this.db.healthCheck();return Y}}import BW from"postgres";class o{options;type="database";name="PostgresDriver";sql;isConnected=!1;prefix;logger;constructor(Y){this.options=Y;this.logger=new U}initClient(){if(this.isConnected)return;this.sql=BW(this.options.connectionString,{prepare:!1}),this.isConnected=!0}setKeyPrefix(Y){this.prefix=Y}async connect(){if(!this.isConnected){this.initClient();try{await this.sql`SELECT 1`,this.logger.log(`[PostgresDriver] : Pool connected with : ${this.options.connectionProtocol??"TCP"}`)}catch(Y){throw this.logger.log("[PostgresDriver] : Health check failed:",Y),Y}}}async disconnect(){if(this.isConnected)await this.sql.end(),this.isConnected=!1,this.logger.log("[PostgresDriver] : Pool disconnected.")}async healthCheck(){let Y=Date.now();try{if(!this.isConnected)throw Error("Connection pool is closed.");return await this.sql`SELECT 1`,{status:"up",latencyMs:Date.now()-Y}}catch(W){return{status:"down",latencyMs:Date.now()-Y,details:{error:W.message}}}}getNativeClient(){if(!this.sql)throw Error("[PostgresDriver] : Client is not initialized. Call connect() first.");return this.sql}async close(){await this.disconnect()}}import{Redis as S$}from"ioredis";import IW from"node:crypto";var _=IW.webcrypto?.subtle||{};var SW=Object.defineProperty,qW=(Y,W)=>{for(var $ in W)SW(Y,$,{get:W[$],enumerable:!0})},Q1={};qW(Q1,{UpstashError:()=>J,UpstashJSONParseError:()=>f,UrlError:()=>G1});var J=class extends Error{constructor(Y,W){super(Y,W);this.name="UpstashError"}},G1=class extends Error{constructor(Y){super(`Upstash Redis client was passed an invalid URL. You should pass a URL starting with https. Received: "${Y}". `);this.name="UrlError"}},f=class extends J{constructor(Y,W){let $=Y.length>200?Y.slice(0,200)+"...":Y;super(`Unable to parse response body: ${$}`,W);this.name="UpstashJSONParseError"}};function K(Y){return JSON.parse(V1(Y))}function V1(Y){return typeof Y==="string"&&Y.startsWith("\uFEFF")?Y.slice(1):Y}function D1(Y){let W=Array.isArray(Y)?Y.map(($)=>{try{return D1($)}catch{return $}}):K(Y);if(typeof W==="number"&&W.toString()!==V1(Y))return Y;return W}function B(Y){try{return D1(Y)}catch{return Y}}function I(Y){return[Y[0],...B(Y.slice(1))]}function bW(Y){let[W,$]=Y,Q=[];for(let G=0;G<$.length;G+=2)Q.push({key:$[G],type:$[G+1]});return[W,Q]}function xW(...Y){let W={};for(let $ of Y){if(!$)continue;for(let[Q,G]of Object.entries($))if(G!==void 0&&G!==null)W[Q]=G}return W}function P(Y){if(typeof Y==="object"&&Y!==null&&!Array.isArray(Y))return Y;if(!Array.isArray(Y))return{};let W={};for(let $=0;$<Y.length;$+=2)if(typeof Y[$]==="string")W[Y[$]]=Y[$+1];return W}var RW=1048576,z1=class{baseUrl;headers;options;readYourWrites;upstashSyncToken="";hasCredentials;retry;constructor(Y){this.options={backend:Y.options?.backend,agent:Y.agent,responseEncoding:Y.responseEncoding??!1,cache:Y.cache,signal:Y.signal,keepAlive:Y.keepAlive??!0},this.upstashSyncToken="",this.readYourWrites=Y.readYourWrites??!0,this.baseUrl=(Y.baseUrl||"").replace(/\/$/,"");let W=/^https?:\/\/[^\s#$./?].\S*$/;if(this.baseUrl&&!W.test(this.baseUrl))throw new G1(this.baseUrl);if(this.headers={"Content-Type":"application/json",...Y.headers},this.hasCredentials=Boolean(this.baseUrl&&this.headers.authorization.split(" ")[1]),this.options.responseEncoding==="base64")this.headers["Upstash-Encoding"]="base64";this.retry=typeof Y.retry==="boolean"&&!Y.retry?{attempts:1,backoff:()=>0}:{attempts:Y.retry?.retries??5,backoff:Y.retry?.backoff??(($)=>Math.exp($)*50)}}mergeTelemetry(Y){this.headers=v(this.headers,"Upstash-Telemetry-Runtime",Y.runtime),this.headers=v(this.headers,"Upstash-Telemetry-Platform",Y.platform),this.headers=v(this.headers,"Upstash-Telemetry-Sdk",Y.sdk)}async request(Y){if(this.readYourWrites)this.headers["upstash-sync-token"]=this.upstashSyncToken;let W=xW(this.headers,Y.headers??{}),$=[this.baseUrl,...Y.path??[]].join("/"),Q=W.Accept==="text/event-stream",G=Y.signal??this.options.signal,D=typeof G==="function",z={cache:this.options.cache,method:"POST",headers:W,body:JSON.stringify(Y.body),keepalive:this.options.keepAlive,agent:this.options.agent,signal:D?G():G,backend:this.options.backend};if(!this.hasCredentials)console.warn("[Upstash Redis] Redis client was initialized without url or token. Failed to execute command.");let T=null,H=null;for(let M=0;M<=this.retry.attempts;M++){if(M>0&&W["Upstash-Telemetry-Sdk"])W["Upstash-Telemetry-Retry"]=String(M);try{T=await fetch($,z);break}catch(w){if(z.signal?.aborted&&D)throw w;else if(z.signal?.aborted){let h=z.signal.reason,L=new Blob([JSON.stringify({result:h instanceof Error?null:h??null})]);T=new Response(L,{status:200,statusText:"Aborted"});break}if(H=w,M<this.retry.attempts)await new Promise((h)=>setTimeout(h,this.retry.backoff(M)))}}if(!T)throw H??Error("Exhausted all retries");if(!T.ok){let M,w=await T.text();try{M=JSON.parse(w)}catch(h){throw new f(w,{cause:h})}throw new J(`${M.error}, command was: ${JSON.stringify(Y.body)}`)}if(this.readYourWrites){let M=T.headers;this.upstashSyncToken=M.get("upstash-sync-token")??""}if(Q&&Y&&Y.onMessage&&T.body){let M=T.body.getReader(),w=new TextDecoder;return(async()=>{try{let h="";while(!0){let{value:L,done:S}=await M.read();if(S)break;h+=w.decode(L,{stream:!0});let C=h.split(`
400
+ `);if(h=C.pop()||"",h.length>RW)throw Error("Buffer size exceeded (1MB)");for(let i of C)if(i.startsWith("data: ")){let LW=i.slice(6);Y.onMessage?.(LW)}}}catch(h){if(h instanceof Error&&h.name==="AbortError");else console.error("Stream reading error:",h)}finally{try{await M.cancel()}catch{}}})(),{result:1}}let Z,X=await T.text();try{Z=JSON.parse(X)}catch(M){throw new f(X,{cause:M})}if(this.readYourWrites){let M=T.headers;this.upstashSyncToken=M.get("upstash-sync-token")??""}if(this.options.responseEncoding==="base64"){if(Array.isArray(Z))return Z.map(({result:w,error:h})=>({result:k(w),error:h}));return{result:k(Z.result),error:Z.error}}return Z}};function a(Y){let W="";try{let $=atob(Y),Q=$.length,G=new Uint8Array(Q);for(let D=0;D<Q;D++)G[D]=$.charCodeAt(D);W=new TextDecoder().decode(G)}catch{W=Y}return W}function k(Y){let W=void 0;switch(typeof Y){case"undefined":return Y;case"number":{W=Y;break}case"object":{if(Array.isArray(Y))W=Y.map(($)=>typeof $==="string"?a($):Array.isArray($)?$.map((Q)=>k(Q)):$);else W=null;break}case"string":{W=Y==="OK"?"OK":a(Y);break}default:break}return W}function v(Y,W,$){if(!$)return Y;if(!Y[W])return Y[W]=$,Y;if(!Y[W].split(",").map((G)=>G.trim()).includes($.trim()))Y[W]=[Y[W],$].join(",");return Y}var OW=(Y)=>{switch(typeof Y){case"string":case"number":case"boolean":return Y;default:return JSON.stringify(Y)}},V=class{command;serialize;deserialize;headers;path;onMessage;isStreaming;signal;constructor(Y,W){if(this.serialize=OW,this.deserialize=W?.automaticDeserialization===void 0||W.automaticDeserialization?W?.deserialize??B:($)=>$,this.command=Y.map(($)=>this.serialize($)),this.headers=W?.headers,this.path=W?.path,this.onMessage=W?.streamOptions?.onMessage,this.isStreaming=W?.streamOptions?.isStreaming??!1,this.signal=W?.streamOptions?.signal,W?.latencyLogging){let $=this.exec.bind(this);this.exec=async(Q)=>{let G=performance.now(),D=await $(Q),T=(performance.now()-G).toFixed(2);return console.log(`Latency for \x1B[38;2;19;185;39m${this.command[0].toString().toUpperCase()}\x1B[0m: \x1B[38;2;0;255;255m${T} ms\x1B[0m`),D}}}async exec(Y){let{result:W,error:$}=await Y.request({body:this.command,path:this.path,upstashSyncToken:Y.upstashSyncToken,headers:this.headers,onMessage:this.onMessage,isStreaming:this.isStreaming,signal:this.signal});if($)throw new J($);if(W===void 0)throw TypeError("Request did not return a result");return this.deserialize(W)}},E=class extends V{constructor(Y,W){let $=Y.map((Q)=>typeof Q==="string"?Q:String(Q));super($,W)}},vW=["TEXT","U64","I64","F64","BOOL","DATE","KEYWORD","FACET","HYBRID"];function T1(Y){return typeof Y==="string"&&vW.includes(Y)}function H1(Y){return typeof Y==="object"&&Y!==null&&"type"in Y&&T1(Y.type)}function fW(Y){return typeof Y==="object"&&Y!==null&&!H1(Y)}function Z1(Y,W=[]){let $=[];for(let[Q,G]of Object.entries(Y)){let D=[...W,Q],z=D.join(".");if(T1(G))$.push({path:z,type:G});else if(H1(G))$.push({path:z,type:G.type,fast:"fast"in G?G.fast:void 0,noTokenize:"noTokenize"in G?G.noTokenize:void 0,noStem:"noStem"in G?G.noStem:void 0,from:"from"in G?G.from:void 0});else if(fW(G)){let T=Z1(G,D);$.push(...T)}}return $}function kW(Y){return Y.map((W)=>{let $=W,Q=$[0],G=Number($[1]),D=$[2];if(D===void 0)return{key:Q,score:G};if(!Array.isArray(D)||D.length===0)return{key:Q,score:G,data:{}};let z={};for(let T of D){let H=T[0],Z=T[1],X=H.split(".");if(X.length===1)z[H]=Z;else{let M=z;for(let w=0;w<X.length-1;w++){let h=X[w];if(!(h in M))M[h]={};M=M[h]}M[X.at(-1)]=Z}}if("$"in z)z=z.$;return{key:Q,score:G,data:z}})}function lW(Y){let W={};for(let $=0;$<Y.length;$+=2)switch(Y[$]){case"name":{W.name=Y[$+1];break}case"type":{W.dataType=Y[$+1].toLowerCase();break}case"prefixes":{W.prefixes=Y[$+1];break}case"language":{W.language=Y[$+1];break}case"schema":{let G={};for(let D of Y[$+1]){let z=D[0],T={type:D[1]};if(D.length>2)for(let H=2;H<D.length;H++)switch(D[H]){case"NOSTEM":{T.noStem=!0;break}case"NOTOKENIZE":{T.noTokenize=!0;break}case"FAST":{T.fast=!0;break}case"FROM":{T.from=D[++H];break}}G[z]=T}W.schema=G;break}}return W}function yW(Y){return typeof Y==="number"?Y:Number.parseInt(Y,10)}function uW(Y){return X1(Y)}function X1(Y){let W={};for(let $=0;$<Y.length;$+=2){let Q=Y[$],G=Y[$+1];if(Array.isArray(G))if(G.length>0&&typeof G[0]==="string")W[Q]=G[0]==="buckets"?iW(G):j(G);else W[Q]=X1(G);else W[Q]=G}return W}function CW(Y){if(typeof Y==="string"&&Y!==""&&!Number.isNaN(Number(Y)))return Number(Y);return Y}function j(Y){let W={};for(let $=0;$<Y.length;$+=2){let Q=Y[$],G=Y[$+1];if(Array.isArray(G)&&G.length>0)if(typeof G[0]==="string")W[Q]=j(G);else if(Array.isArray(G[0])&&typeof G[0][0]==="string")W[Q]=G.map((D)=>j(D));else W[Q]=G;else W[Q]=CW(G)}return W}function iW(Y){if(Y[0]==="buckets"&&Array.isArray(Y[1])){let W={buckets:Y[1].map(($)=>{let Q={};for(let G=0;G<$.length;G+=2){let D=$[G],z=$[G+1];Q[D]=Array.isArray(z)&&z.length>0&&typeof z[0]==="string"?j(z):z}return Q})};for(let $=2;$<Y.length;$+=2)W[Y[$]]=Y[$+1];return W}return Y}function m(Y,W,$){let Q=JSON.stringify($?.filter??{}),G=[Y,W,Q];if($?.limit!==void 0)G.push("LIMIT",$.limit.toString());if($?.offset!==void 0)G.push("OFFSET",$.offset.toString());if($?.select&&Object.keys($.select).length===0)G.push("NOCONTENT");if($){if("orderBy"in $&&$.orderBy){G.push("ORDERBY");for(let[D,z]of Object.entries($.orderBy))G.push(D,z)}else if("scoreFunc"in $&&$.scoreFunc)G.push("SCOREFUNC",...gW($.scoreFunc))}if($?.highlight){if(G.push("HIGHLIGHT","FIELDS",$.highlight.fields.length.toString(),...$.highlight.fields),$.highlight.preTag&&$.highlight.postTag)G.push("TAGS",$.highlight.preTag,$.highlight.postTag)}if($?.select&&Object.keys($.select).length>0)G.push("SELECT",Object.keys($.select).length.toString(),...Object.keys($.select));return G}function gW(Y){let W=[];if(typeof Y==="string")W.push("FIELDVALUE",Y);else if("fields"in Y){if(Y.combineMode)W.push("COMBINEMODE",Y.combineMode.toUpperCase());if(Y.scoreMode)W.push("SCOREMODE",Y.scoreMode.toUpperCase());for(let $ of Y.fields)W.push(...s($))}else W.push(...s(Y));return W}function s(Y){let W=[];if(typeof Y==="string")W.push("FIELDVALUE",Y);else{if(Y.scoreMode)W.push("SCOREMODE",Y.scoreMode.toUpperCase());if(W.push("FIELDVALUE",Y.field),Y.modifier)W.push("MODIFIER",Y.modifier.toUpperCase());if(Y.factor!==void 0)W.push("FACTOR",Y.factor.toString());if(Y.missing!==void 0)W.push("MISSING",Y.missing.toString())}return W}function cW(Y){let{name:W,schema:$,dataType:Q,language:G,skipInitialScan:D,existsOk:z}=Y,T;if(Y.dataType==="stream")T=["ON","STREAM",Y.stream];else{let X=Array.isArray(Y.prefix)?Y.prefix:[Y.prefix];T=["ON",Q.toUpperCase(),"PREFIX",X.length.toString(),...X]}let H=[W,...D?["SKIPINITIALSCAN"]:[],...z?["EXISTSOK"]:[],...T,...G?["LANGUAGE",G]:[],"SCHEMA"],Z=Z1($);for(let X of Z){if(H.push(X.path,X.type),X.fast)H.push("FAST");if(X.noTokenize)H.push("NOTOKENIZE");if(X.noStem)H.push("NOSTEM");if(X.from)H.push("FROM",X.from)}return["SEARCH.CREATE",...H]}function pW(Y,W){let $=JSON.stringify(W?.filter??{}),Q=JSON.stringify(W.aggregations);return["SEARCH.AGGREGATE",Y,$,Q]}var M1=class{name;schema;client;constructor({name:Y,schema:W,client:$}){this.name=Y,this.schema=W,this.client=$}async waitIndexing(){let Y=["SEARCH.WAITINDEXING",this.name];return await new E(Y).exec(this.client)}async describe(){let Y=["SEARCH.DESCRIBE",this.name],W=await new E(Y).exec(this.client);if(!W)return null;return lW(W)}async query(Y){let W=m("SEARCH.QUERY",this.name,Y),$=await new E(W).exec(this.client);if(!$)return $;return kW($)}async aggregate(Y){let W=pW(this.name,Y),$=await new E(W).exec(this.client);return uW($)}async count({filter:Y}){let W=m("SEARCH.COUNT",this.name,{filter:Y}),$=await new E(W).exec(this.client);return{count:yW($)}}async drop(){let Y=["SEARCH.DROP",this.name];return await new E(Y).exec(this.client)}async addAlias({alias:Y}){let W=["SEARCH.ALIASADD",Y,this.name];return await new E(W).exec(this.client)}};async function nW(Y,W){let{name:$,schema:Q}=W,G=cW(W);return await new E(G).exec(Y),h1(Y,{name:$,schema:Q})}function h1(Y,W){let{name:$,schema:Q}=W;return new M1({name:$,schema:Q,client:Y})}async function tW(Y){let $=await new E(["SEARCH.LISTALIASES"]).exec(Y);if($===0||Array.isArray($)&&$.length===0)return{};if(!Array.isArray($))return{};let Q={};for(let G of $)if(Array.isArray(G)&&G.length===2){let[D,z]=G;Q[D]=z}return Q}async function dW(Y,{indexName:W,alias:$}){return await new E(["SEARCH.ALIASADD",$,W]).exec(Y)}async function rW(Y,{alias:W}){return await new E(["SEARCH.ALIASDEL",W]).exec(Y)}function eW(Y){let W=new Uint8Array(Y.length*4),$=new DataView(W.buffer);for(let[D,z]of Y.entries())$.setFloat32(D*4,z,!0);let Q="",G=32768;for(let D=0;D<W.length;D+=G)Q+=String.fromCodePoint(...W.subarray(D,D+G));return btoa(Q)}function w1(Y){if(Array.isArray(Y))return["VALUES",Y.length,...Y];if(Y instanceof Float32Array)return["BASE64-FP32",eW(Y)];return["BASE64-FP32",Y.base64]}function oW(Y){if(Y===null)return null;return Y.map(Number)}function aW(Y){return Y.map(([W,$])=>({id:String(W),score:Number($)}))}function mW(Y){if(Y===null)return null;let W=Array.isArray(Y)?Object.fromEntries(Array.from({length:Math.floor(Y.length/2)},($,Q)=>[String(Y[Q*2]),Y[Q*2+1]])):Y;return{dimension:Number(W.dimension),metric:String(W.metric).toUpperCase()}}var sW=class extends V{constructor([Y,W,$],Q){super(["VECTOR.ADD",Y,W,...w1($)],Q)}},Y$=class extends V{constructor([Y],W){super(["VECTOR.COUNT",Y],W)}},W$=class extends V{constructor([Y,W],$){let Q=["VECTOR.CREATE",Y,"DIM",W.dimension,"METRIC",W.metric];if(W.existsOk)Q.push("EXISTSOK");super(Q,$)}},$$=class extends V{constructor([Y,W],$){super(["VECTOR.DEL",Y,W],$)}},Q$=class extends V{constructor([Y],W){super(["VECTOR.DROP",Y],W)}},G$=class extends V{constructor([Y,W],$){super(["VECTOR.GET",Y,W],{deserialize:oW,...$})}},V$=class extends V{constructor([Y],W){super(["VECTOR.INFO",Y],{deserialize:mW,...W})}},D$=class extends V{constructor([Y,W],$){let Q=["VECTOR.QUERY",Y,"TOPK",W.topK];if(W.profile)Q.push("PROFILE",W.profile);Q.push(...w1(W.vector));super(Q,{deserialize:aW,...$})}},y=class{name;client;commandOptions;constructor({name:Y,client:W,commandOptions:$}){this.name=Y,this.client=W,this.commandOptions=$}add(Y,W){return new sW([this.name,Y,W],this.commandOptions).exec(this.client)}get(Y){return new G$([this.name,Y],this.commandOptions).exec(this.client)}query(Y){return new D$([this.name,Y],this.commandOptions).exec(this.client)}delete(Y){return new $$([this.name,Y],this.commandOptions).exec(this.client)}count(){return new Y$([this.name],this.commandOptions).exec(this.client)}info(){return new V$([this.name],this.commandOptions).exec(this.client)}drop(){return new Q$([this.name],this.commandOptions).exec(this.client)}};async function z$(Y,{name:W,...$},Q){return await new W$([W,$],Q).exec(Y),new y({name:W,client:Y,commandOptions:Q})}function T$(Y,W,$){return new y({name:W,client:Y,commandOptions:$})}function H$(Y){if(Y.length===0)return null;let W={};for(let $=0;$<Y.length;$+=2){let Q=Y[$],G=Y[$+1];try{W[Q]=K(G)}catch{W[Q]=G}}return W}var E1=class extends V{constructor(Y,W){let $=["hrandfield",Y[0]];if(typeof Y[1]==="number")$.push(Y[1]);if(Y[2])$.push("WITHVALUES");super($,{deserialize:Y[2]?(Q)=>H$(Q):W?.deserialize,...W})}},L1=class extends V{constructor(Y,W){super(["append",...Y],W)}},U1=class extends V{constructor(Y,W){super(["ARCOUNT",...Y],W)}},K1=class extends V{constructor(Y,W){super(["ARDEL",...Y],W)}},J1=class extends V{constructor([Y,...W],$){super(["ARDELRANGE",Y,...W.flat()],$)}},N1=class extends V{constructor(Y,W){super(["ARGET",...Y],W)}},P1=class extends V{constructor(Y,W){super(["ARGETRANGE",...Y],W)}},F1=class extends V{constructor([Y,W,$,Q],G){let D=["ARGREP",Y,W,$];for(let z of Q.predicates)if("exact"in z)D.push("EXACT",z.exact);else if("match"in z)D.push("MATCH",z.match);else if("glob"in z)D.push("GLOB",z.glob);else D.push("RE",z.re);if(Q.combine)D.push(Q.combine.toUpperCase());if(Q.noCase)D.push("NOCASE");if(Q.withValues)D.push("WITHVALUES");if(Q.limit!==void 0)D.push("LIMIT",Q.limit);super(D,{deserialize:(z)=>B(z).map((T)=>Array.isArray(T)?[String(T[0]),T[1]]:String(T)),...G})}};function Z$(Y){return Y.replaceAll(/-([a-z])/g,(W,$)=>$.toUpperCase())}function X$(Y){let W=Array.isArray(Y)?Array.from({length:Math.floor(Y.length/2)},(G,D)=>[Y[D*2],Y[D*2+1]]):Object.entries(Y),$=new Set(["len","nextInsertIndex"]),Q={};for(let[G,D]of W){let z=Z$(String(G));if($.has(z)){Q[z]=String(D);continue}let T=typeof D==="number"?D:Number(D);Q[z]=Number.isNaN(T)?D:T}return Q}var _1=class extends V{constructor([Y,W],$){let Q=["ARINFO",Y];if(W?.full)Q.push("FULL");super(Q,{deserialize:X$,...$})}},j1=class extends V{constructor(Y,W){super(["ARINSERT",...Y],{deserialize:String,...W})}},A1=class extends V{constructor([Y,W,$],Q){let G=["ARLASTITEMS",Y,W];if($?.rev)G.push("REV");super(G,Q)}},B1=class extends V{constructor(Y,W){super(["ARLEN",...Y],{deserialize:String,...W})}},I1=class extends V{constructor(Y,W){super(["ARMGET",...Y],W)}},S1=class extends V{constructor([Y,W],$){let Q=Array.isArray(W)?W:Object.entries(W);super(["ARMSET",Y,...Q.flatMap(([G,D])=>[G,D])],$)}},q1=class extends V{constructor(Y,W){super(["ARNEXT",...Y],{deserialize:($)=>$===null?null:String($),...W})}},b1=class extends V{constructor([Y,W,$,Q],G){let D=["AROP",Y,W,$];if(typeof Q==="string")D.push(Q.toUpperCase());else D.push("MATCH",Q.match);super(D,{deserialize:(z)=>z===null?null:Number(z),...G})}},x1=class extends V{constructor(Y,W){super(["ARRING",...Y],{deserialize:String,...W})}},R1=class extends V{constructor([Y,W,$,Q],G){let D=["ARSCAN",Y,W,$];if(Q?.limit!==void 0)D.push("LIMIT",Q.limit);super(D,{deserialize:(z)=>B(z).map(([T,H])=>[String(T),H]),...G})}},O1=class extends V{constructor(Y,W){super(["ARSEEK",...Y],W)}},v1=class extends V{constructor(Y,W){super(["ARSET",...Y],W)}},f1=class extends V{constructor([Y,W,$],Q){let G=["bitcount",Y];if(typeof W==="number")G.push(W);if(typeof $==="number")G.push($);super(G,Q)}},k1=class{constructor(Y,W,$,Q=(G)=>G.exec(this.client)){this.client=W,this.opts=$,this.execOperation=Q,this.command=["bitfield",...Y]}command;chain(...Y){return this.command.push(...Y),this}get(...Y){return this.chain("get",...Y)}set(...Y){return this.chain("set",...Y)}incrby(...Y){return this.chain("incrby",...Y)}overflow(Y){return this.chain("overflow",Y)}exec(){let Y=new V(this.command,this.opts);return this.execOperation(Y)}},l1=class extends V{constructor(Y,W){super(["bitop",...Y],W)}},y1=class extends V{constructor(Y,W){super(["bitpos",...Y],W)}},u1=class extends V{constructor([Y,W],$){super(["CLIENT","SETINFO",Y.toUpperCase(),W],$)}},C1=class extends V{constructor([Y,W,$],Q){super(["COPY",Y,W,...$?.replace?["REPLACE"]:[]],{...Q,deserialize(G){if(G>0)return"COPIED";return"NOT_COPIED"}})}},i1=class extends V{constructor(Y){super(["dbsize"],Y)}},g1=class extends V{constructor(Y,W){super(["decr",...Y],W)}},c1=class extends V{constructor(Y,W){super(["decrby",...Y],W)}},p1=class extends V{constructor(Y,W){super(["del",...Y],W)}},n1=class extends V{constructor(Y,W){super(["echo",...Y],W)}},t1=class extends V{constructor([Y,W,$],Q){super(["eval_ro",Y,W.length,...W,...$??[]],Q)}},d1=class extends V{constructor([Y,W,$],Q){super(["eval",Y,W.length,...W,...$??[]],Q)}},r1=class extends V{constructor([Y,W,$],Q){super(["evalsha_ro",Y,W.length,...W,...$??[]],Q)}},e1=class extends V{constructor([Y,W,$],Q){super(["evalsha",Y,W.length,...W,...$??[]],Q)}},o1=class extends V{constructor(Y,W){super(["exists",...Y],W)}},a1=class extends V{constructor(Y,W){super(["expire",...Y.filter(Boolean)],W)}},m1=class extends V{constructor(Y,W){super(["expireat",...Y],W)}},s1=class extends V{constructor([Y,W,$],Q){super(["fcall",Y,...W?[W.length,...W]:[0],...$??[]],Q)}},Y0=class extends V{constructor([Y,W,$],Q){super(["fcall_ro",Y,...W?[W.length,...W]:[0],...$??[]],Q)}},W0=class extends V{constructor(Y,W){let $=["flushall"];if(Y&&Y.length>0&&Y[0].async)$.push("async");super($,W)}},$0=class extends V{constructor([Y],W){let $=["flushdb"];if(Y?.async)$.push("async");super($,W)}},Q0=class extends V{constructor([Y],W){super(["function","delete",Y],W)}},G0=class extends V{constructor(Y){super(["function","flush"],Y)}},V0=class extends V{constructor([Y],W){let $=["function","list"];if(Y?.libraryName)$.push("libraryname",Y.libraryName);if(Y?.withCode)$.push("withcode");super($,{deserialize:M$,...W})}};function M$(Y){if(!Array.isArray(Y))return[];return Y.map((W)=>{let $=P(W),Q=$.functions.map((G)=>P(G));return{libraryName:$.library_name,engine:$.engine,functions:Q.map((G)=>({name:G.name,description:G.description??void 0,flags:G.flags})),libraryCode:$.library_code}})}var D0=class extends V{constructor([Y],W){super(["function","load",...Y.replace?["replace"]:[],Y.code],W)}},z0=class extends V{constructor(Y){super(["function","stats"],{deserialize:h$,...Y})}};function h$(Y){let W=P(P(Y).engines),$=Object.fromEntries(Object.entries(W).map(([G,D])=>[G,P(D)]));return{engines:Object.fromEntries(Object.entries($).map(([G,D])=>[G,{librariesCount:D.libraries_count,functionsCount:D.functions_count}]))}}var T0=class extends V{constructor([Y,W,...$],Q){let G=["geoadd",Y];if("nx"in W&&W.nx)G.push("nx");else if("xx"in W&&W.xx)G.push("xx");if("ch"in W&&W.ch)G.push("ch");if("latitude"in W&&W.latitude)G.push(W.longitude,W.latitude,W.member);G.push(...$.flatMap(({latitude:D,longitude:z,member:T})=>[z,D,T]));super(G,Q)}},H0=class extends V{constructor([Y,W,$,Q="M"],G){super(["GEODIST",Y,W,$,Q],G)}},Z0=class extends V{constructor(Y,W){let[$]=Y,Q=Array.isArray(Y[1])?Y[1]:Y.slice(1);super(["GEOHASH",$,...Q],W)}},X0=class extends V{constructor(Y,W){let[$]=Y,Q=Array.isArray(Y[1])?Y[1]:Y.slice(1);super(["GEOPOS",$,...Q],{deserialize:(G)=>w$(G),...W})}};function w$(Y){let W=[];for(let $ of Y){if(!$?.[0]||!$?.[1])continue;W.push({lng:Number.parseFloat($[0]),lat:Number.parseFloat($[1])})}return W}var M0=class extends V{constructor([Y,W,$,Q,G],D){let z=["GEOSEARCH",Y];if(W.type==="FROMMEMBER"||W.type==="frommember")z.push(W.type,W.member);if(W.type==="FROMLONLAT"||W.type==="fromlonlat")z.push(W.type,W.coordinate.lon,W.coordinate.lat);if($.type==="BYRADIUS"||$.type==="byradius")z.push($.type,$.radius,$.radiusType);if($.type==="BYBOX"||$.type==="bybox")z.push($.type,$.rect.width,$.rect.height,$.rectType);if(z.push(Q),G?.count)z.push("COUNT",G.count.limit,...G.count.any?["ANY"]:[]);let T=(H)=>{if(!G?.withCoord&&!G?.withDist&&!G?.withHash)return H.map((Z)=>{try{return{member:K(Z)}}catch{return{member:Z}}});return H.map((Z)=>{let X=1,M={};try{M.member=K(Z[0])}catch{M.member=Z[0]}if(G.withDist)M.dist=Number.parseFloat(Z[X++]);if(G.withHash)M.hash=Z[X++].toString();if(G.withCoord)M.coord={long:Number.parseFloat(Z[X][0]),lat:Number.parseFloat(Z[X][1])};return M})};super([...z,...G?.withCoord?["WITHCOORD"]:[],...G?.withDist?["WITHDIST"]:[],...G?.withHash?["WITHHASH"]:[]],{deserialize:T,...D})}},h0=class extends V{constructor([Y,W,$,Q,G,D],z){let T=["GEOSEARCHSTORE",Y,W];if($.type==="FROMMEMBER"||$.type==="frommember")T.push($.type,$.member);if($.type==="FROMLONLAT"||$.type==="fromlonlat")T.push($.type,$.coordinate.lon,$.coordinate.lat);if(Q.type==="BYRADIUS"||Q.type==="byradius")T.push(Q.type,Q.radius,Q.radiusType);if(Q.type==="BYBOX"||Q.type==="bybox")T.push(Q.type,Q.rect.width,Q.rect.height,Q.rectType);if(T.push(G),D?.count)T.push("COUNT",D.count.limit,...D.count.any?["ANY"]:[]);super([...T,...D?.storeDist?["STOREDIST"]:[]],z)}},w0=class extends V{constructor(Y,W){super(["get",...Y],W)}},E0=class extends V{constructor(Y,W){super(["getbit",...Y],W)}},L0=class extends V{constructor(Y,W){super(["getdel",...Y],W)}},U0=class extends V{constructor([Y,W],$){let Q=["getex",Y];if(W){if("ex"in W&&typeof W.ex==="number")Q.push("ex",W.ex);else if("px"in W&&typeof W.px==="number")Q.push("px",W.px);else if("exat"in W&&typeof W.exat==="number")Q.push("exat",W.exat);else if("pxat"in W&&typeof W.pxat==="number")Q.push("pxat",W.pxat);else if("persist"in W&&W.persist)Q.push("persist")}super(Q,$)}},K0=class extends V{constructor(Y,W){super(["getrange",...Y],W)}},J0=class extends V{constructor(Y,W){super(["getset",...Y],W)}},N0=class extends V{constructor(Y,W){super(["hdel",...Y],W)}},P0=class extends V{constructor(Y,W){super(["hexists",...Y],W)}},F0=class extends V{constructor(Y,W){let[$,Q,G,D]=Y,z=Array.isArray(Q)?Q:[Q];super(["hexpire",$,G,...D?[D]:[],"FIELDS",z.length,...z],W)}},_0=class extends V{constructor(Y,W){let[$,Q,G,D]=Y,z=Array.isArray(Q)?Q:[Q];super(["hexpireat",$,G,...D?[D]:[],"FIELDS",z.length,...z],W)}},j0=class extends V{constructor(Y,W){let[$,Q]=Y,G=Array.isArray(Q)?Q:[Q];super(["hexpiretime",$,"FIELDS",G.length,...G],W)}},A0=class extends V{constructor(Y,W){let[$,Q]=Y,G=Array.isArray(Q)?Q:[Q];super(["hpersist",$,"FIELDS",G.length,...G],W)}},B0=class extends V{constructor(Y,W){let[$,Q,G,D]=Y,z=Array.isArray(Q)?Q:[Q];super(["hpexpire",$,G,...D?[D]:[],"FIELDS",z.length,...z],W)}},I0=class extends V{constructor(Y,W){let[$,Q,G,D]=Y,z=Array.isArray(Q)?Q:[Q];super(["hpexpireat",$,G,...D?[D]:[],"FIELDS",z.length,...z],W)}},S0=class extends V{constructor(Y,W){let[$,Q]=Y,G=Array.isArray(Q)?Q:[Q];super(["hpexpiretime",$,"FIELDS",G.length,...G],W)}},q0=class extends V{constructor(Y,W){let[$,Q]=Y,G=Array.isArray(Q)?Q:[Q];super(["hpttl",$,"FIELDS",G.length,...G],W)}},b0=class extends V{constructor(Y,W){super(["hget",...Y],W)}};function E$(Y){if(Y.length===0)return null;let W={};for(let $=0;$<Y.length;$+=2){let Q=Y[$],G=Y[$+1];try{let D=!Number.isNaN(Number(G))&&!Number.isSafeInteger(Number(G));W[Q]=D?G:K(G)}catch{W[Q]=G}}return W}var x0=class extends V{constructor(Y,W){super(["hgetall",...Y],{deserialize:($)=>E$($),...W})}};function u(Y,W){if(W.every((Q)=>Q===null))return null;let $={};for(let[Q,G]of Y.entries())try{$[G]=K(W[Q])}catch{$[G]=W[Q]}return $}var R0=class extends V{constructor([Y,...W],$){super(["hmget",Y,...W],{deserialize:(Q)=>u(W,Q),...$})}},O0=class extends V{constructor([Y,...W],$){super(["hgetdel",Y,"FIELDS",W.length,...W],{deserialize:(Q)=>u(W.map(String),Q),...$})}},v0=class extends V{constructor([Y,W,...$],Q){let G=["hgetex",Y];if("ex"in W&&typeof W.ex==="number")G.push("EX",W.ex);else if("px"in W&&typeof W.px==="number")G.push("PX",W.px);else if("exat"in W&&typeof W.exat==="number")G.push("EXAT",W.exat);else if("pxat"in W&&typeof W.pxat==="number")G.push("PXAT",W.pxat);else if("persist"in W&&W.persist)G.push("PERSIST");G.push("FIELDS",$.length,...$);super(G,{deserialize:(D)=>u($.map(String),D),...Q})}},f0=class extends V{constructor(Y,W){super(["hincrby",...Y],W)}},k0=class extends V{constructor(Y,W){super(["hincrbyfloat",...Y],W)}},l0=class extends V{constructor([Y],W){super(["hkeys",Y],W)}},y0=class extends V{constructor(Y,W){super(["hlen",...Y],W)}},u0=class extends V{constructor([Y,W],$){super(["hmset",Y,...Object.entries(W).flatMap(([Q,G])=>[Q,G])],$)}},C0=class extends V{constructor([Y,W,$],Q){let G=["hscan",Y,W];if($?.match)G.push("match",$.match);if(typeof $?.count==="number")G.push("count",$.count);super(G,{deserialize:I,...Q})}},i0=class extends V{constructor([Y,W],$){super(["hset",Y,...Object.entries(W).flatMap(([Q,G])=>[Q,G])],$)}},g0=class extends V{constructor([Y,W,$],Q){let G=["hsetex",Y];if(W.conditional)G.push(W.conditional.toUpperCase());if(W.expiration){if("ex"in W.expiration&&typeof W.expiration.ex==="number")G.push("EX",W.expiration.ex);else if("px"in W.expiration&&typeof W.expiration.px==="number")G.push("PX",W.expiration.px);else if("exat"in W.expiration&&typeof W.expiration.exat==="number")G.push("EXAT",W.expiration.exat);else if("pxat"in W.expiration&&typeof W.expiration.pxat==="number")G.push("PXAT",W.expiration.pxat);else if("keepttl"in W.expiration&&W.expiration.keepttl)G.push("KEEPTTL")}let D=Object.entries($);G.push("FIELDS",D.length);for(let[z,T]of D)G.push(z,T);super(G,Q)}},c0=class extends V{constructor(Y,W){super(["hsetnx",...Y],W)}},p0=class extends V{constructor(Y,W){super(["hstrlen",...Y],W)}},n0=class extends V{constructor(Y,W){let[$,Q]=Y,G=Array.isArray(Q)?Q:[Q];super(["httl",$,"FIELDS",G.length,...G],W)}},t0=class extends V{constructor(Y,W){super(["hvals",...Y],W)}},d0=class extends V{constructor(Y,W){super(["incr",...Y],W)}},r0=class extends V{constructor(Y,W){super(["incrby",...Y],W)}},e0=class extends V{constructor(Y,W){super(["incrbyfloat",...Y],W)}},o0=class extends V{constructor(Y,W){super(["JSON.ARRAPPEND",...Y],W)}},a0=class extends V{constructor(Y,W){super(["JSON.ARRINDEX",...Y],W)}},m0=class extends V{constructor(Y,W){super(["JSON.ARRINSERT",...Y],W)}},s0=class extends V{constructor(Y,W){super(["JSON.ARRLEN",Y[0],Y[1]??"$"],W)}},YY=class extends V{constructor(Y,W){super(["JSON.ARRPOP",...Y],W)}},WY=class extends V{constructor(Y,W){let $=Y[1]??"$",Q=Y[2]??0,G=Y[3]??0;super(["JSON.ARRTRIM",Y[0],$,Q,G],W)}},$Y=class extends V{constructor(Y,W){super(["JSON.CLEAR",...Y],W)}},QY=class extends V{constructor(Y,W){super(["JSON.DEL",...Y],W)}},GY=class extends V{constructor(Y,W){super(["JSON.FORGET",...Y],W)}},VY=class extends V{constructor(Y,W){let $=["JSON.GET"];if(typeof Y[1]==="string")$.push(...Y);else{if($.push(Y[0]),Y[1]){if(Y[1].indent)$.push("INDENT",Y[1].indent);if(Y[1].newline)$.push("NEWLINE",Y[1].newline);if(Y[1].space)$.push("SPACE",Y[1].space)}$.push(...Y.slice(2))}super($,W)}},DY=class extends V{constructor(Y,W){let $=["JSON.MERGE",...Y];super($,W)}},zY=class extends V{constructor(Y,W){super(["JSON.MGET",...Y[0],Y[1]],W)}},TY=class extends V{constructor(Y,W){let $=["JSON.MSET"];for(let Q of Y)$.push(Q.key,Q.path,Q.value);super($,W)}},HY=class extends V{constructor(Y,W){super(["JSON.NUMINCRBY",...Y],W)}},ZY=class extends V{constructor(Y,W){super(["JSON.NUMMULTBY",...Y],W)}},XY=class extends V{constructor(Y,W){super(["JSON.OBJKEYS",...Y],W)}},MY=class extends V{constructor(Y,W){super(["JSON.OBJLEN",...Y],W)}},hY=class extends V{constructor(Y,W){super(["JSON.RESP",...Y],W)}},wY=class extends V{constructor(Y,W){let $=["JSON.SET",Y[0],Y[1],Y[2]];if(Y[3]){if(Y[3].nx)$.push("NX");else if(Y[3].xx)$.push("XX")}super($,W)}},EY=class extends V{constructor(Y,W){super(["JSON.STRAPPEND",...Y],W)}},LY=class extends V{constructor(Y,W){super(["JSON.STRLEN",...Y],W)}},UY=class extends V{constructor(Y,W){super(["JSON.TOGGLE",...Y],W)}},KY=class extends V{constructor(Y,W){super(["JSON.TYPE",...Y],W)}},JY=class extends V{constructor(Y,W){super(["keys",...Y],W)}},NY=class extends V{constructor(Y,W){super(["lindex",...Y],W)}},PY=class extends V{constructor(Y,W){super(["linsert",...Y],W)}},FY=class extends V{constructor(Y,W){super(["llen",...Y],W)}},_Y=class extends V{constructor(Y,W){super(["lmove",...Y],W)}},jY=class extends V{constructor(Y,W){let[$,Q,G,D]=Y;super(["LMPOP",$,...Q,G,...D?["COUNT",D]:[]],W)}},AY=class extends V{constructor(Y,W){super(["lpop",...Y],W)}},BY=class extends V{constructor(Y,W){let $=["lpos",Y[0],Y[1]];if(typeof Y[2]?.rank==="number")$.push("rank",Y[2].rank);if(typeof Y[2]?.count==="number")$.push("count",Y[2].count);if(typeof Y[2]?.maxLen==="number")$.push("maxLen",Y[2].maxLen);super($,W)}},IY=class extends V{constructor(Y,W){super(["lpush",...Y],W)}},SY=class extends V{constructor(Y,W){super(["lpushx",...Y],W)}},qY=class extends V{constructor(Y,W){super(["lrange",...Y],W)}},bY=class extends V{constructor(Y,W){super(["lrem",...Y],W)}},xY=class extends V{constructor(Y,W){super(["lset",...Y],W)}},RY=class extends V{constructor(Y,W){super(["ltrim",...Y],W)}},OY=class extends V{constructor(Y,W){let $=Array.isArray(Y[0])?Y[0]:Y;super(["mget",...$],W)}},vY=class extends V{constructor([Y],W){super(["mset",...Object.entries(Y).flatMap(([$,Q])=>[$,Q])],W)}},fY=class extends V{constructor([Y],W){super(["msetnx",...Object.entries(Y).flat()],W)}},kY=class extends V{constructor(Y,W){super(["persist",...Y],W)}},lY=class extends V{constructor(Y,W){super(["pexpire",...Y],W)}},yY=class extends V{constructor(Y,W){super(["pexpireat",...Y],W)}},uY=class extends V{constructor(Y,W){super(["pfadd",...Y],W)}},CY=class extends V{constructor(Y,W){super(["pfcount",...Y],W)}},iY=class extends V{constructor(Y,W){super(["pfmerge",...Y],W)}},gY=class extends V{constructor(Y,W){let $=["ping"];if(Y?.[0]!==void 0)$.push(Y[0]);super($,W)}},cY=class extends V{constructor(Y,W){super(["psetex",...Y],W)}},pY=class extends V{constructor(Y,W){super(["pttl",...Y],W)}},nY=class extends V{constructor(Y,W){super(["publish",...Y],W)}},tY=class extends V{constructor(Y){super(["randomkey"],Y)}},dY=class extends V{constructor(Y,W){super(["rename",...Y],W)}},rY=class extends V{constructor(Y,W){super(["renamenx",...Y],W)}},eY=class extends V{constructor(Y,W){super(["rpop",...Y],W)}},oY=class extends V{constructor(Y,W){super(["rpush",...Y],W)}},aY=class extends V{constructor(Y,W){super(["rpushx",...Y],W)}},mY=class extends V{constructor(Y,W){super(["sadd",...Y],W)}},sY=class extends V{constructor([Y,W],$){let Q=["scan",Y];if(W?.match)Q.push("match",W.match);if(typeof W?.count==="number")Q.push("count",W.count);if(W&&"withType"in W&&W.withType===!0)Q.push("withtype");else if(W&&"type"in W&&W.type&&W.type.length>0)Q.push("type",W.type);super(Q,{deserialize:W?.withType?bW:I,...$})}},Y4=class extends V{constructor(Y,W){super(["scard",...Y],W)}},W4=class extends V{constructor(Y,W){super(["script","exists",...Y],{deserialize:($)=>$,...W})}},$4=class extends V{constructor([Y],W){let $=["script","flush"];if(Y?.sync)$.push("sync");else if(Y?.async)$.push("async");super($,W)}},Q4=class extends V{constructor(Y,W){super(["script","load",...Y],W)}},G4=class extends V{constructor(Y,W){super(["sdiff",...Y],W)}},V4=class extends V{constructor(Y,W){super(["sdiffstore",...Y],W)}},D4=class extends V{constructor([Y,W,$],Q){let G=["set",Y,W];if($){if("nx"in $&&$.nx)G.push("nx");else if("xx"in $&&$.xx)G.push("xx");if("get"in $&&$.get)G.push("get");if("ex"in $&&typeof $.ex==="number")G.push("ex",$.ex);else if("px"in $&&typeof $.px==="number")G.push("px",$.px);else if("exat"in $&&typeof $.exat==="number")G.push("exat",$.exat);else if("pxat"in $&&typeof $.pxat==="number")G.push("pxat",$.pxat);else if("keepTtl"in $&&$.keepTtl)G.push("keepTtl")}super(G,Q)}},z4=class extends V{constructor(Y,W){super(["setbit",...Y],W)}},T4=class extends V{constructor(Y,W){super(["setex",...Y],W)}},H4=class extends V{constructor(Y,W){super(["setnx",...Y],W)}},Z4=class extends V{constructor(Y,W){super(["setrange",...Y],W)}},X4=class extends V{constructor(Y,W){super(["sinter",...Y],W)}},M4=class extends V{constructor(Y,W){let[$,Q]=Y,G=["sintercard",$.length,...$];if(Q?.limit!==void 0)G.push("LIMIT",Q.limit);super(G,W)}},h4=class extends V{constructor(Y,W){super(["sinterstore",...Y],W)}},w4=class extends V{constructor(Y,W){super(["sismember",...Y],W)}},E4=class extends V{constructor(Y,W){super(["smembers",...Y],W)}},L4=class extends V{constructor(Y,W){super(["smismember",Y[0],...Y[1]],W)}},U4=class extends V{constructor(Y,W){super(["smove",...Y],W)}},K4=class extends V{constructor([Y,W],$){let Q=["spop",Y];if(typeof W==="number")Q.push(W);super(Q,$)}},J4=class extends V{constructor([Y,W],$){let Q=["srandmember",Y];if(typeof W==="number")Q.push(W);super(Q,$)}},N4=class extends V{constructor(Y,W){super(["srem",...Y],W)}},P4=class extends V{constructor([Y,W,$],Q){let G=["sscan",Y,W];if($?.match)G.push("match",$.match);if(typeof $?.count==="number")G.push("count",$.count);super(G,{deserialize:I,...Q})}},F4=class extends V{constructor(Y,W){super(["strlen",...Y],W)}},_4=class extends V{constructor(Y,W){super(["sunion",...Y],W)}},j4=class extends V{constructor(Y,W){super(["sunionstore",...Y],W)}},A4=class extends V{constructor(Y){super(["time"],Y)}},B4=class extends V{constructor(Y,W){super(["touch",...Y],W)}},I4=class extends V{constructor(Y,W){super(["ttl",...Y],W)}},S4=class extends V{constructor(Y,W){super(["type",...Y],W)}},q4=class extends V{constructor(Y,W){super(["unlink",...Y],W)}},b4=class extends V{constructor([Y,W,$],Q){let G=Array.isArray($)?[...$]:[$];super(["XACK",Y,W,...G],Q)}},x4=class extends V{constructor([Y,W,$,...Q],G){let D=["XACKDEL",Y,W];D.push($.toUpperCase(),"IDS",Q.length,...Q);super(D,G)}},R4=class extends V{constructor([Y,W,$,Q],G){let D=["XADD",Y];if(Q){if(Q.nomkStream)D.push("NOMKSTREAM");if(Q.trim){if(D.push(Q.trim.type,Q.trim.comparison,Q.trim.threshold),Q.trim.limit!==void 0)D.push("LIMIT",Q.trim.limit)}}D.push(W);for(let[z,T]of Object.entries($))D.push(z,T);super(D,G)}},O4=class extends V{constructor([Y,W,$,Q,G,D],z){let T=[];if(D?.count)T.push("COUNT",D.count);if(D?.justId)T.push("JUSTID");super(["XAUTOCLAIM",Y,W,$,Q,G,...T],z)}},v4=class extends V{constructor([Y,W,$,Q,G,D],z){let T=Array.isArray(G)?[...G]:[G],H=[];if(D?.idleMS)H.push("IDLE",D.idleMS);if(D?.idleMS)H.push("TIME",D.timeMS);if(D?.retryCount)H.push("RETRYCOUNT",D.retryCount);if(D?.force)H.push("FORCE");if(D?.justId)H.push("JUSTID");if(D?.lastId)H.push("LASTID",D.lastId);super(["XCLAIM",Y,W,$,Q,...T,...H],z)}},f4=class extends V{constructor([Y,W],$){let Q=Array.isArray(W)?[...W]:[W];super(["XDEL",Y,...Q],$)}},k4=class extends V{constructor([Y,W,...$],Q){let G=["XDELEX",Y];if(W)G.push(W.toUpperCase());G.push("IDS",$.length,...$);super(G,Q)}},l4=class extends V{constructor([Y,W],$){let Q=["XGROUP"];switch(W.type){case"CREATE":{if(Q.push("CREATE",Y,W.group,W.id),W.options){if(W.options.MKSTREAM)Q.push("MKSTREAM");if(W.options.ENTRIESREAD!==void 0)Q.push("ENTRIESREAD",W.options.ENTRIESREAD.toString())}break}case"CREATECONSUMER":{Q.push("CREATECONSUMER",Y,W.group,W.consumer);break}case"DELCONSUMER":{Q.push("DELCONSUMER",Y,W.group,W.consumer);break}case"DESTROY":{Q.push("DESTROY",Y,W.group);break}case"SETID":{if(Q.push("SETID",Y,W.group,W.id),W.options?.ENTRIESREAD!==void 0)Q.push("ENTRIESREAD",W.options.ENTRIESREAD.toString());break}default:throw Error("Invalid XGROUP")}super(Q,$)}},y4=class extends V{constructor([Y,W],$){let Q=[];if(W.type==="CONSUMERS")Q.push("CONSUMERS",Y,W.group);else Q.push("GROUPS",Y);super(["XINFO",...Q],$)}},u4=class extends V{constructor(Y,W){super(["XLEN",...Y],W)}},C4=class extends V{constructor([Y,W,$,Q,G,D],z){let T=D?.consumer===void 0?[]:Array.isArray(D.consumer)?[...D.consumer]:[D.consumer];super(["XPENDING",Y,W,...D?.idleTime?["IDLE",D.idleTime]:[],$,Q,G,...T],z)}};function L$(Y){let W={};for(let $ of Y)for(let Q=0;Q<$.length;Q+=2){let G=$[Q],D=$[Q+1];if(!(G in W))W[G]={};for(let z=0;z<D.length;z+=2){let T=D[z],H=D[z+1];try{W[G][T]=K(H)}catch{W[G][T]=H}}}return W}var i4=class extends V{constructor([Y,W,$,Q],G){let D=["XRANGE",Y,W,$];if(typeof Q==="number")D.push("COUNT",Q);super(D,{deserialize:(z)=>L$(z),...G})}},U$="ERR Unbalanced XREAD list of streams: for each stream key an ID or '$' must be specified",g4=class extends V{constructor([Y,W,$],Q){if(Array.isArray(Y)&&Array.isArray(W)&&Y.length!==W.length)throw Error(U$);let G=[];if(typeof $?.count==="number")G.push("COUNT",$.count);if(typeof $?.blockMS==="number")G.push("BLOCK",$.blockMS);G.push("STREAMS",...Array.isArray(Y)?[...Y]:[Y],...Array.isArray(W)?[...W]:[W]);super(["XREAD",...G],Q)}},K$="ERR Unbalanced XREADGROUP list of streams: for each stream key an ID or '$' must be specified",c4=class extends V{constructor([Y,W,$,Q,G],D){if(Array.isArray($)&&Array.isArray(Q)&&$.length!==Q.length)throw Error(K$);let z=[];if(typeof G?.count==="number")z.push("COUNT",G.count);if(typeof G?.blockMS==="number")z.push("BLOCK",G.blockMS);if(typeof G?.NOACK==="boolean"&&G.NOACK)z.push("NOACK");z.push("STREAMS",...Array.isArray($)?[...$]:[$],...Array.isArray(Q)?[...Q]:[Q]);super(["XREADGROUP","GROUP",Y,W,...z],D)}},p4=class extends V{constructor([Y,W,$,Q],G){let D=["XREVRANGE",Y,W,$];if(typeof Q==="number")D.push("COUNT",Q);super(D,{deserialize:(z)=>J$(z),...G})}};function J$(Y){let W={};for(let $ of Y)for(let Q=0;Q<$.length;Q+=2){let G=$[Q],D=$[Q+1];if(!(G in W))W[G]={};for(let z=0;z<D.length;z+=2){let T=D[z],H=D[z+1];try{W[G][T]=K(H)}catch{W[G][T]=H}}}return W}var n4=class extends V{constructor([Y,W],$){let{limit:Q,strategy:G,threshold:D,exactness:z="~"}=W;super(["XTRIM",Y,G,z,D,...Q?["LIMIT",Q]:[]],$)}},A=class extends V{constructor([Y,W,...$],Q){let G=["zadd",Y];if("nx"in W&&W.nx)G.push("nx");else if("xx"in W&&W.xx)G.push("xx");if("ch"in W&&W.ch)G.push("ch");if("incr"in W&&W.incr)G.push("incr");if("lt"in W&&W.lt)G.push("lt");else if("gt"in W&&W.gt)G.push("gt");if("score"in W&&"member"in W)G.push(W.score,W.member);G.push(...$.flatMap(({score:D,member:z})=>[D,z]));super(G,Q)}},t4=class extends V{constructor(Y,W){super(["zcard",...Y],W)}},d4=class extends V{constructor(Y,W){super(["zcount",...Y],W)}},r4=class extends V{constructor(Y,W){super(["zincrby",...Y],W)}},e4=class extends V{constructor([Y,W,$,Q],G){let D=["zinterstore",Y,W];if(Array.isArray($))D.push(...$);else D.push($);if(Q){if("weights"in Q&&Q.weights)D.push("weights",...Q.weights);else if("weight"in Q&&typeof Q.weight==="number")D.push("weights",Q.weight);if("aggregate"in Q)D.push("aggregate",Q.aggregate)}super(D,G)}},o4=class extends V{constructor(Y,W){super(["zlexcount",...Y],W)}},a4=class extends V{constructor([Y,W],$){let Q=["zpopmax",Y];if(typeof W==="number")Q.push(W);super(Q,$)}},m4=class extends V{constructor([Y,W],$){let Q=["zpopmin",Y];if(typeof W==="number")Q.push(W);super(Q,$)}},s4=class extends V{constructor([Y,W,$,Q],G){let D=["zrange",Y,W,$];if(Q?.byScore)D.push("byscore");if(Q?.byLex)D.push("bylex");if(Q?.rev)D.push("rev");if(Q?.count!==void 0&&Q.offset!==void 0)D.push("limit",Q.offset,Q.count);if(Q?.withScores)D.push("withscores");super(D,G)}},YW=class extends V{constructor(Y,W){super(["zrank",...Y],W)}},WW=class extends V{constructor(Y,W){super(["zrem",...Y],W)}},$W=class extends V{constructor(Y,W){super(["zremrangebylex",...Y],W)}},QW=class extends V{constructor(Y,W){super(["zremrangebyrank",...Y],W)}},GW=class extends V{constructor(Y,W){super(["zremrangebyscore",...Y],W)}},VW=class extends V{constructor(Y,W){super(["zrevrank",...Y],W)}},DW=class extends V{constructor([Y,W,$],Q){let G=["zscan",Y,W];if($?.match)G.push("match",$.match);if(typeof $?.count==="number")G.push("count",$.count);super(G,{deserialize:I,...Q})}},zW=class extends V{constructor(Y,W){super(["zscore",...Y],W)}},TW=class extends V{constructor([Y,W,$],Q){let G=["zunion",Y];if(Array.isArray(W))G.push(...W);else G.push(W);if($){if("weights"in $&&$.weights)G.push("weights",...$.weights);else if("weight"in $&&typeof $.weight==="number")G.push("weights",$.weight);if("aggregate"in $)G.push("aggregate",$.aggregate);if($.withScores)G.push("withscores")}super(G,Q)}},HW=class extends V{constructor([Y,W,$,Q],G){let D=["zunionstore",Y,W];if(Array.isArray($))D.push(...$);else D.push($);if(Q){if("weights"in Q&&Q.weights)D.push("weights",...Q.weights);else if("weight"in Q&&typeof Q.weight==="number")D.push("weights",Q.weight);if("aggregate"in Q)D.push("aggregate",Q.aggregate)}super(D,G)}},ZW=class extends V{constructor(Y,W){super(["zdiffstore",...Y],W)}},XW=class extends V{constructor(Y,W){let[$,Q]=Y;super(["zmscore",$,...Q],W)}},Y1=class{client;commands;commandOptions;multiExec;constructor(Y){if(this.client=Y.client,this.commands=[],this.commandOptions=Y.commandOptions,this.multiExec=Y.multiExec??!1,this.commandOptions?.latencyLogging){let W=this.exec.bind(this);this.exec=async($)=>{let Q=performance.now(),G=await($?W($):W()),z=(performance.now()-Q).toFixed(2);return console.log(`Latency for \x1B[38;2;19;185;39m${this.multiExec?["MULTI-EXEC"]:["PIPELINE"].toString().toUpperCase()}\x1B[0m: \x1B[38;2;0;255;255m${z} ms\x1B[0m`),G}}}exec=async(Y)=>{if(this.commands.length===0)throw Error("Pipeline is empty");let W=this.multiExec?["multi-exec"]:["pipeline"],$=await this.client.request({path:W,body:Object.values(this.commands).map((Q)=>Q.command)});return Y?.keepErrors?$.map(({error:Q,result:G},D)=>{return{error:Q,result:this.commands[D].deserialize(G)}}):$.map(({error:Q,result:G},D)=>{if(Q)throw new J(`Command ${D+1} [ ${this.commands[D].command[0]} ] failed: ${Q}`);return this.commands[D].deserialize(G)})};length(){return this.commands.length}chain(Y){return this.commands.push(Y),this}append=(...Y)=>this.chain(new L1(Y,this.commandOptions));arcount=(...Y)=>this.chain(new U1(Y,this.commandOptions));ardel=(...Y)=>this.chain(new K1(Y,this.commandOptions));ardelrange=(...Y)=>this.chain(new J1(Y,this.commandOptions));arget=(...Y)=>this.chain(new N1(Y,this.commandOptions));argetrange=(...Y)=>this.chain(new P1(Y,this.commandOptions));argrep=(Y,W,$,Q)=>this.chain(new F1([Y,W,$,Q],this.commandOptions));arinfo=(...Y)=>this.chain(new _1(Y,this.commandOptions));arinsert=(Y,...W)=>this.chain(new j1([Y,...W],this.commandOptions));arlastitems=(...Y)=>this.chain(new A1(Y,this.commandOptions));arlen=(...Y)=>this.chain(new B1(Y,this.commandOptions));armget=(...Y)=>this.chain(new I1(Y,this.commandOptions));armset=(Y,W)=>this.chain(new S1([Y,W],this.commandOptions));arnext=(...Y)=>this.chain(new q1(Y,this.commandOptions));arop=(Y,W,$,Q)=>this.chain(new b1([Y,W,$,Q],this.commandOptions));arring=(Y,W,...$)=>this.chain(new x1([Y,W,...$],this.commandOptions));arscan=(...Y)=>this.chain(new R1(Y,this.commandOptions));arseek=(...Y)=>this.chain(new O1(Y,this.commandOptions));arset=(Y,W,...$)=>this.chain(new v1([Y,W,...$],this.commandOptions));bitcount=(...Y)=>this.chain(new f1(Y,this.commandOptions));bitfield=(...Y)=>new k1(Y,this.client,this.commandOptions,this.chain.bind(this));bitop=(Y,W,$,...Q)=>this.chain(new l1([Y,W,$,...Q],this.commandOptions));bitpos=(...Y)=>this.chain(new y1(Y,this.commandOptions));clientSetinfo=(...Y)=>this.chain(new u1(Y,this.commandOptions));copy=(...Y)=>this.chain(new C1(Y,this.commandOptions));zdiffstore=(...Y)=>this.chain(new ZW(Y,this.commandOptions));dbsize=()=>this.chain(new i1(this.commandOptions));decr=(...Y)=>this.chain(new g1(Y,this.commandOptions));decrby=(...Y)=>this.chain(new c1(Y,this.commandOptions));del=(...Y)=>this.chain(new p1(Y,this.commandOptions));echo=(...Y)=>this.chain(new n1(Y,this.commandOptions));evalRo=(...Y)=>this.chain(new t1(Y,this.commandOptions));eval=(...Y)=>this.chain(new d1(Y,this.commandOptions));evalshaRo=(...Y)=>this.chain(new r1(Y,this.commandOptions));evalsha=(...Y)=>this.chain(new e1(Y,this.commandOptions));exists=(...Y)=>this.chain(new o1(Y,this.commandOptions));expire=(...Y)=>this.chain(new a1(Y,this.commandOptions));expireat=(...Y)=>this.chain(new m1(Y,this.commandOptions));flushall=(Y)=>this.chain(new W0(Y,this.commandOptions));flushdb=(...Y)=>this.chain(new $0(Y,this.commandOptions));geoadd=(...Y)=>this.chain(new T0(Y,this.commandOptions));geodist=(...Y)=>this.chain(new H0(Y,this.commandOptions));geopos=(...Y)=>this.chain(new X0(Y,this.commandOptions));geohash=(...Y)=>this.chain(new Z0(Y,this.commandOptions));geosearch=(...Y)=>this.chain(new M0(Y,this.commandOptions));geosearchstore=(...Y)=>this.chain(new h0(Y,this.commandOptions));get=(...Y)=>this.chain(new w0(Y,this.commandOptions));getbit=(...Y)=>this.chain(new E0(Y,this.commandOptions));getdel=(...Y)=>this.chain(new L0(Y,this.commandOptions));getex=(...Y)=>this.chain(new U0(Y,this.commandOptions));getrange=(...Y)=>this.chain(new K0(Y,this.commandOptions));getset=(Y,W)=>this.chain(new J0([Y,W],this.commandOptions));hdel=(...Y)=>this.chain(new N0(Y,this.commandOptions));hexists=(...Y)=>this.chain(new P0(Y,this.commandOptions));hexpire=(...Y)=>this.chain(new F0(Y,this.commandOptions));hexpireat=(...Y)=>this.chain(new _0(Y,this.commandOptions));hexpiretime=(...Y)=>this.chain(new j0(Y,this.commandOptions));httl=(...Y)=>this.chain(new n0(Y,this.commandOptions));hpexpire=(...Y)=>this.chain(new B0(Y,this.commandOptions));hpexpireat=(...Y)=>this.chain(new I0(Y,this.commandOptions));hpexpiretime=(...Y)=>this.chain(new S0(Y,this.commandOptions));hpttl=(...Y)=>this.chain(new q0(Y,this.commandOptions));hpersist=(...Y)=>this.chain(new A0(Y,this.commandOptions));hget=(...Y)=>this.chain(new b0(Y,this.commandOptions));hgetall=(...Y)=>this.chain(new x0(Y,this.commandOptions));hgetdel=(...Y)=>this.chain(new O0(Y,this.commandOptions));hgetex=(...Y)=>this.chain(new v0(Y,this.commandOptions));hincrby=(...Y)=>this.chain(new f0(Y,this.commandOptions));hincrbyfloat=(...Y)=>this.chain(new k0(Y,this.commandOptions));hkeys=(...Y)=>this.chain(new l0(Y,this.commandOptions));hlen=(...Y)=>this.chain(new y0(Y,this.commandOptions));hmget=(...Y)=>this.chain(new R0(Y,this.commandOptions));hmset=(Y,W)=>this.chain(new u0([Y,W],this.commandOptions));hrandfield=(Y,W,$)=>this.chain(new E1([Y,W,$],this.commandOptions));hscan=(...Y)=>this.chain(new C0(Y,this.commandOptions));hset=(Y,W)=>this.chain(new i0([Y,W],this.commandOptions));hsetex=(...Y)=>this.chain(new g0(Y,this.commandOptions));hsetnx=(Y,W,$)=>this.chain(new c0([Y,W,$],this.commandOptions));hstrlen=(...Y)=>this.chain(new p0(Y,this.commandOptions));hvals=(...Y)=>this.chain(new t0(Y,this.commandOptions));incr=(...Y)=>this.chain(new d0(Y,this.commandOptions));incrby=(...Y)=>this.chain(new r0(Y,this.commandOptions));incrbyfloat=(...Y)=>this.chain(new e0(Y,this.commandOptions));keys=(...Y)=>this.chain(new JY(Y,this.commandOptions));lindex=(...Y)=>this.chain(new NY(Y,this.commandOptions));linsert=(Y,W,$,Q)=>this.chain(new PY([Y,W,$,Q],this.commandOptions));llen=(...Y)=>this.chain(new FY(Y,this.commandOptions));lmove=(...Y)=>this.chain(new _Y(Y,this.commandOptions));lpop=(...Y)=>this.chain(new AY(Y,this.commandOptions));lmpop=(...Y)=>this.chain(new jY(Y,this.commandOptions));lpos=(...Y)=>this.chain(new BY(Y,this.commandOptions));lpush=(Y,...W)=>this.chain(new IY([Y,...W],this.commandOptions));lpushx=(Y,...W)=>this.chain(new SY([Y,...W],this.commandOptions));lrange=(...Y)=>this.chain(new qY(Y,this.commandOptions));lrem=(Y,W,$)=>this.chain(new bY([Y,W,$],this.commandOptions));lset=(Y,W,$)=>this.chain(new xY([Y,W,$],this.commandOptions));ltrim=(...Y)=>this.chain(new RY(Y,this.commandOptions));mget=(...Y)=>this.chain(new OY(Y,this.commandOptions));mset=(Y)=>this.chain(new vY([Y],this.commandOptions));msetnx=(Y)=>this.chain(new fY([Y],this.commandOptions));persist=(...Y)=>this.chain(new kY(Y,this.commandOptions));pexpire=(...Y)=>this.chain(new lY(Y,this.commandOptions));pexpireat=(...Y)=>this.chain(new yY(Y,this.commandOptions));pfadd=(...Y)=>this.chain(new uY(Y,this.commandOptions));pfcount=(...Y)=>this.chain(new CY(Y,this.commandOptions));pfmerge=(...Y)=>this.chain(new iY(Y,this.commandOptions));ping=(Y)=>this.chain(new gY(Y,this.commandOptions));psetex=(Y,W,$)=>this.chain(new cY([Y,W,$],this.commandOptions));pttl=(...Y)=>this.chain(new pY(Y,this.commandOptions));publish=(...Y)=>this.chain(new nY(Y,this.commandOptions));randomkey=()=>this.chain(new tY(this.commandOptions));rename=(...Y)=>this.chain(new dY(Y,this.commandOptions));renamenx=(...Y)=>this.chain(new rY(Y,this.commandOptions));rpop=(...Y)=>this.chain(new eY(Y,this.commandOptions));rpush=(Y,...W)=>this.chain(new oY([Y,...W],this.commandOptions));rpushx=(Y,...W)=>this.chain(new aY([Y,...W],this.commandOptions));sadd=(Y,W,...$)=>this.chain(new mY([Y,W,...$],this.commandOptions));scan=(...Y)=>this.chain(new sY(Y,this.commandOptions));scard=(...Y)=>this.chain(new Y4(Y,this.commandOptions));scriptExists=(...Y)=>this.chain(new W4(Y,this.commandOptions));scriptFlush=(...Y)=>this.chain(new $4(Y,this.commandOptions));scriptLoad=(...Y)=>this.chain(new Q4(Y,this.commandOptions));sdiff=(...Y)=>this.chain(new G4(Y,this.commandOptions));sdiffstore=(...Y)=>this.chain(new V4(Y,this.commandOptions));set=(Y,W,$)=>this.chain(new D4([Y,W,$],this.commandOptions));setbit=(...Y)=>this.chain(new z4(Y,this.commandOptions));setex=(Y,W,$)=>this.chain(new T4([Y,W,$],this.commandOptions));setnx=(Y,W)=>this.chain(new H4([Y,W],this.commandOptions));setrange=(...Y)=>this.chain(new Z4(Y,this.commandOptions));sinter=(...Y)=>this.chain(new X4(Y,this.commandOptions));sintercard=(...Y)=>this.chain(new M4(Y,this.commandOptions));sinterstore=(...Y)=>this.chain(new h4(Y,this.commandOptions));sismember=(Y,W)=>this.chain(new w4([Y,W],this.commandOptions));smembers=(...Y)=>this.chain(new E4(Y,this.commandOptions));smismember=(Y,W)=>this.chain(new L4([Y,W],this.commandOptions));smove=(Y,W,$)=>this.chain(new U4([Y,W,$],this.commandOptions));spop=(...Y)=>this.chain(new K4(Y,this.commandOptions));srandmember=(...Y)=>this.chain(new J4(Y,this.commandOptions));srem=(Y,...W)=>this.chain(new N4([Y,...W],this.commandOptions));sscan=(...Y)=>this.chain(new P4(Y,this.commandOptions));strlen=(...Y)=>this.chain(new F4(Y,this.commandOptions));sunion=(...Y)=>this.chain(new _4(Y,this.commandOptions));sunionstore=(...Y)=>this.chain(new j4(Y,this.commandOptions));time=()=>this.chain(new A4(this.commandOptions));touch=(...Y)=>this.chain(new B4(Y,this.commandOptions));ttl=(...Y)=>this.chain(new I4(Y,this.commandOptions));type=(...Y)=>this.chain(new S4(Y,this.commandOptions));unlink=(...Y)=>this.chain(new q4(Y,this.commandOptions));zadd=(...Y)=>{if("score"in Y[1])return this.chain(new A([Y[0],Y[1],...Y.slice(2)],this.commandOptions));return this.chain(new A([Y[0],Y[1],...Y.slice(2)],this.commandOptions))};xadd=(...Y)=>this.chain(new R4(Y,this.commandOptions));xack=(...Y)=>this.chain(new b4(Y,this.commandOptions));xackdel=(...Y)=>this.chain(new x4(Y,this.commandOptions));xdel=(...Y)=>this.chain(new f4(Y,this.commandOptions));xdelex=(...Y)=>this.chain(new k4(Y,this.commandOptions));xgroup=(...Y)=>this.chain(new l4(Y,this.commandOptions));xread=(...Y)=>this.chain(new g4(Y,this.commandOptions));xreadgroup=(...Y)=>this.chain(new c4(Y,this.commandOptions));xinfo=(...Y)=>this.chain(new y4(Y,this.commandOptions));xlen=(...Y)=>this.chain(new u4(Y,this.commandOptions));xpending=(...Y)=>this.chain(new C4(Y,this.commandOptions));xclaim=(...Y)=>this.chain(new v4(Y,this.commandOptions));xautoclaim=(...Y)=>this.chain(new O4(Y,this.commandOptions));xtrim=(...Y)=>this.chain(new n4(Y,this.commandOptions));xrange=(...Y)=>this.chain(new i4(Y,this.commandOptions));xrevrange=(...Y)=>this.chain(new p4(Y,this.commandOptions));zcard=(...Y)=>this.chain(new t4(Y,this.commandOptions));zcount=(...Y)=>this.chain(new d4(Y,this.commandOptions));zincrby=(Y,W,$)=>this.chain(new r4([Y,W,$],this.commandOptions));zinterstore=(...Y)=>this.chain(new e4(Y,this.commandOptions));zlexcount=(...Y)=>this.chain(new o4(Y,this.commandOptions));zmscore=(...Y)=>this.chain(new XW(Y,this.commandOptions));zpopmax=(...Y)=>this.chain(new a4(Y,this.commandOptions));zpopmin=(...Y)=>this.chain(new m4(Y,this.commandOptions));zrange=(...Y)=>this.chain(new s4(Y,this.commandOptions));zrank=(Y,W)=>this.chain(new YW([Y,W],this.commandOptions));zrem=(Y,...W)=>this.chain(new WW([Y,...W],this.commandOptions));zremrangebylex=(...Y)=>this.chain(new $W(Y,this.commandOptions));zremrangebyrank=(...Y)=>this.chain(new QW(Y,this.commandOptions));zremrangebyscore=(...Y)=>this.chain(new GW(Y,this.commandOptions));zrevrank=(Y,W)=>this.chain(new VW([Y,W],this.commandOptions));zscan=(...Y)=>this.chain(new DW(Y,this.commandOptions));zscore=(Y,W)=>this.chain(new zW([Y,W],this.commandOptions));zunionstore=(...Y)=>this.chain(new HW(Y,this.commandOptions));zunion=(...Y)=>this.chain(new TW(Y,this.commandOptions));get json(){return{arrappend:(...Y)=>this.chain(new o0(Y,this.commandOptions)),arrindex:(...Y)=>this.chain(new a0(Y,this.commandOptions)),arrinsert:(...Y)=>this.chain(new m0(Y,this.commandOptions)),arrlen:(...Y)=>this.chain(new s0(Y,this.commandOptions)),arrpop:(...Y)=>this.chain(new YY(Y,this.commandOptions)),arrtrim:(...Y)=>this.chain(new WY(Y,this.commandOptions)),clear:(...Y)=>this.chain(new $Y(Y,this.commandOptions)),del:(...Y)=>this.chain(new QY(Y,this.commandOptions)),forget:(...Y)=>this.chain(new GY(Y,this.commandOptions)),get:(...Y)=>this.chain(new VY(Y,this.commandOptions)),merge:(...Y)=>this.chain(new DY(Y,this.commandOptions)),mget:(...Y)=>this.chain(new zY(Y,this.commandOptions)),mset:(...Y)=>this.chain(new TY(Y,this.commandOptions)),numincrby:(...Y)=>this.chain(new HY(Y,this.commandOptions)),nummultby:(...Y)=>this.chain(new ZY(Y,this.commandOptions)),objkeys:(...Y)=>this.chain(new XY(Y,this.commandOptions)),objlen:(...Y)=>this.chain(new MY(Y,this.commandOptions)),resp:(...Y)=>this.chain(new hY(Y,this.commandOptions)),set:(...Y)=>this.chain(new wY(Y,this.commandOptions)),strappend:(...Y)=>this.chain(new EY(Y,this.commandOptions)),strlen:(...Y)=>this.chain(new LY(Y,this.commandOptions)),toggle:(...Y)=>this.chain(new UY(Y,this.commandOptions)),type:(...Y)=>this.chain(new KY(Y,this.commandOptions))}}get functions(){return{load:(...Y)=>this.chain(new D0(Y,this.commandOptions)),list:(...Y)=>this.chain(new V0(Y,this.commandOptions)),delete:(...Y)=>this.chain(new Q0(Y,this.commandOptions)),flush:()=>this.chain(new G0(this.commandOptions)),stats:()=>this.chain(new z0(this.commandOptions)),call:(...Y)=>this.chain(new s1(Y,this.commandOptions)),callRo:(...Y)=>this.chain(new Y0(Y,this.commandOptions))}}},W1=1000,N$=new Set(["arcount","arget","argetrange","argrep","arinfo","arlastitems","arlen","armget","arnext","arop","arscan","get","getrange","mget","strlen","bitcount","bitpos","getbit","hexists","hget","hgetall","hkeys","hlen","hmget","hrandfield","hscan","hstrlen","httl","hvals","hexpiretime","hpexpiretime","hpttl","lindex","llen","lpos","lrange","scard","sdiff","sinter","sintercard","sismember","smembers","smismember","srandmember","sscan","sunion","zcard","zcount","zlexcount","zmscore","zrange","zrank","zrevrank","zscan","zscore","zunion","exists","type","ttl","pttl","randomkey","touch","pfcount","xinfo","xlen","xpending","xrange","xread","xrevrange","geodist","geohash","geopos","geosearch","scriptExists","evalRo","evalshaRo","dbsize","echo","ping","time","scan","keys","arrindex","arrlen","objkeys","objlen","resp","list","stats","callRo"]),P$=new Set(["scan","keys","flushdb","flushall","dbsize","hscan","hgetall","hkeys","lrange","sscan","smembers","xrange","xrevrange","zscan","zrange","exec"]);function l(Y,W="root"){let $=Y;if(!$.autoPipelineExecutor)$.autoPipelineExecutor=new F$($);return new Proxy($,{get:(Q,G)=>{if(G==="pipelineCounter")return Q.autoPipelineExecutor.pipelineCounter;if(W==="root"&&G==="json")return l(Q,"json");if(W==="root"&&G==="functions")return l(Q,"functions");if(W==="root"){let H=G in Q&&!(G in Q.autoPipelineExecutor.pipeline),Z=P$.has(G);if(H||Z)return Q[G]}let D=Q.autoPipelineExecutor.pipeline,z=W==="json"?D.json[G]:W==="functions"?D.functions[G]:D[G];if(typeof z==="function")return(...H)=>{let Z=N$.has(G)?"read":"write";return Q.autoPipelineExecutor.withAutoPipeline(Z,(X)=>{(W==="json"?X.json[G]:W==="functions"?X.functions[G]:X[G])(...H)})};return z}})}var F$=class{pipelinePromises=new WeakMap;activeReadPipeline=null;activeWritePipeline=null;readIndex=0;writeIndex=0;redis;pipeline;pipelineCounter=0;constructor(Y){this.redis=Y,this.pipeline=Y.pipeline()}async withAutoPipeline(Y,W){let $=Y==="read",Q=$?this.activeReadPipeline:this.activeWritePipeline,G=Q??this.redis.pipeline();if(!Q)if($)this.activeReadPipeline=G,this.readIndex=0;else this.activeWritePipeline=G,this.writeIndex=0;let D=$?this.readIndex++:this.writeIndex++;if(W(G),$&&this.readIndex>=W1)this.activeReadPipeline=null;else if(!$&&this.writeIndex>=W1)this.activeWritePipeline=null;let H=(await this.deferExecution().then(()=>{if(!this.pipelinePromises.has(G)){let Z=G.exec({keepErrors:!0});if(this.pipelineCounter+=1,this.pipelinePromises.set(G,Z),this.activeReadPipeline===G)this.activeReadPipeline=null;if(this.activeWritePipeline===G)this.activeWritePipeline=null}return this.pipelinePromises.get(G)}))[D];if(H.error)throw new J(`Command failed: ${H.error}`);return H.result}async deferExecution(){await Promise.resolve(),await Promise.resolve()}},_$=class extends V{constructor(Y,W){let $={Accept:"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"};super([],{...W,headers:$,path:["psubscribe",...Y],streamOptions:{isStreaming:!0,onMessage:W?.streamOptions?.onMessage,signal:W?.streamOptions?.signal}})}},$1=class extends EventTarget{subscriptions;client;listeners;opts;constructor(Y,W,$=!1,Q){super();this.client=Y,this.subscriptions=new Map,this.listeners=new Map,this.opts=Q;for(let G of W)if($)this.subscribeToPattern(G);else this.subscribeToChannel(G)}subscribeToChannel(Y){let W=new AbortController,$=new j$([Y],{streamOptions:{signal:W.signal,onMessage:(Q)=>this.handleMessage(Q,!1)}});$.exec(this.client).catch((Q)=>{if(Q.name!=="AbortError")this.dispatchToListeners("error",Q)}),this.subscriptions.set(Y,{command:$,controller:W,isPattern:!1})}subscribeToPattern(Y){let W=new AbortController,$=new _$([Y],{streamOptions:{signal:W.signal,onMessage:(Q)=>this.handleMessage(Q,!0)}});$.exec(this.client).catch((Q)=>{if(Q.name!=="AbortError")this.dispatchToListeners("error",Q)}),this.subscriptions.set(Y,{command:$,controller:W,isPattern:!0})}handleMessage(Y,W){let $=Y.replace(/^data:\s*/,""),Q=$.indexOf(","),G=$.indexOf(",",Q+1),D=W?$.indexOf(",",G+1):-1;if(Q!==-1&&G!==-1){let z=$.slice(0,Q);if(W&&z==="pmessage"&&D!==-1){let T=$.slice(Q+1,G),H=$.slice(G+1,D),Z=$.slice(D+1);try{let X=this.opts?.automaticDeserialization===!1?Z:JSON.parse(Z);this.dispatchToListeners("pmessage",{pattern:T,channel:H,message:X}),this.dispatchToListeners(`pmessage:${T}`,{pattern:T,channel:H,message:X})}catch(X){this.dispatchToListeners("error",Error(`Failed to parse message: ${X}`))}}else{let T=$.slice(Q+1,G),H=$.slice(G+1);try{if(z==="subscribe"||z==="psubscribe"||z==="unsubscribe"||z==="punsubscribe"){let Z=Number.parseInt(H);this.dispatchToListeners(z,Z)}else{let Z=this.opts?.automaticDeserialization===!1?H:A$(H);this.dispatchToListeners(z,{channel:T,message:Z}),this.dispatchToListeners(`${z}:${T}`,{channel:T,message:Z})}}catch(Z){this.dispatchToListeners("error",Error(`Failed to parse message: ${Z}`))}}}}dispatchToListeners(Y,W){let $=this.listeners.get(Y);if($)for(let Q of $)Q(W)}on(Y,W){if(!this.listeners.has(Y))this.listeners.set(Y,new Set);this.listeners.get(Y)?.add(W)}removeAllListeners(){this.listeners.clear()}async unsubscribe(Y){if(Y)for(let W of Y){let $=this.subscriptions.get(W);if($){try{$.controller.abort()}catch{}this.subscriptions.delete(W)}}else{for(let W of this.subscriptions.values())try{W.controller.abort()}catch{}this.subscriptions.clear(),this.removeAllListeners()}}getSubscribedChannels(){return[...this.subscriptions.keys()]}},j$=class extends V{constructor(Y,W){let $={Accept:"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"};super([],{...W,headers:$,path:["subscribe",...Y],streamOptions:{isStreaming:!0,onMessage:W?.streamOptions?.onMessage,signal:W?.streamOptions?.signal}})}},A$=(Y)=>{try{return JSON.parse(Y)}catch{return Y}},B$=class{script;sha1;initPromise;redis;constructor(Y,W){this.redis=Y,this.script=W,this.sha1="",this.init(W)}init(Y){if(!this.initPromise)this.initPromise=this.digest(Y).then((W)=>{this.sha1=W});return this.initPromise}async eval(Y,W){return await this.init(this.script),await this.redis.eval(this.script,Y,W)}async evalsha(Y,W){return await this.init(this.script),await this.redis.evalsha(this.sha1,Y,W)}async exec(Y,W){return await this.init(this.script),await this.redis.evalsha(this.sha1,Y,W).catch(async(Q)=>{if(Q instanceof Error&&Q.message.toLowerCase().includes("noscript"))return await this.redis.eval(this.script,Y,W);throw Q})}async digest(Y){let W=new TextEncoder().encode(Y),$=await _.digest("SHA-1",W);return[...new Uint8Array($)].map((G)=>G.toString(16).padStart(2,"0")).join("")}},I$=class{script;sha1;initPromise;redis;constructor(Y,W){this.redis=Y,this.sha1="",this.script=W,this.init(W)}init(Y){if(!this.initPromise)this.initPromise=this.digest(Y).then((W)=>{this.sha1=W});return this.initPromise}async evalRo(Y,W){return await this.init(this.script),await this.redis.evalRo(this.script,Y,W)}async evalshaRo(Y,W){return await this.init(this.script),await this.redis.evalshaRo(this.sha1,Y,W)}async exec(Y,W){return await this.init(this.script),await this.redis.evalshaRo(this.sha1,Y,W).catch(async(Q)=>{if(Q instanceof Error&&Q.message.toLowerCase().includes("noscript"))return await this.redis.evalRo(this.script,Y,W);throw Q})}async digest(Y){let W=new TextEncoder().encode(Y),$=await _.digest("SHA-1",W);return[...new Uint8Array($)].map((G)=>G.toString(16).padStart(2,"0")).join("")}},MW=class{client;opts;enableTelemetry;enableAutoPipelining;constructor(Y,W){if(this.client=Y,this.opts=W,this.enableTelemetry=W?.enableTelemetry??!0,W?.readYourWrites===!1)this.client.readYourWrites=!1;this.enableAutoPipelining=W?.enableAutoPipelining??!0}get readYourWritesSyncToken(){return this.client.upstashSyncToken}set readYourWritesSyncToken(Y){this.client.upstashSyncToken=Y}get json(){return{arrappend:(...Y)=>new o0(Y,this.opts).exec(this.client),arrindex:(...Y)=>new a0(Y,this.opts).exec(this.client),arrinsert:(...Y)=>new m0(Y,this.opts).exec(this.client),arrlen:(...Y)=>new s0(Y,this.opts).exec(this.client),arrpop:(...Y)=>new YY(Y,this.opts).exec(this.client),arrtrim:(...Y)=>new WY(Y,this.opts).exec(this.client),clear:(...Y)=>new $Y(Y,this.opts).exec(this.client),del:(...Y)=>new QY(Y,this.opts).exec(this.client),forget:(...Y)=>new GY(Y,this.opts).exec(this.client),get:(...Y)=>new VY(Y,this.opts).exec(this.client),merge:(...Y)=>new DY(Y,this.opts).exec(this.client),mget:(...Y)=>new zY(Y,this.opts).exec(this.client),mset:(...Y)=>new TY(Y,this.opts).exec(this.client),numincrby:(...Y)=>new HY(Y,this.opts).exec(this.client),nummultby:(...Y)=>new ZY(Y,this.opts).exec(this.client),objkeys:(...Y)=>new XY(Y,this.opts).exec(this.client),objlen:(...Y)=>new MY(Y,this.opts).exec(this.client),resp:(...Y)=>new hY(Y,this.opts).exec(this.client),set:(...Y)=>new wY(Y,this.opts).exec(this.client),strappend:(...Y)=>new EY(Y,this.opts).exec(this.client),strlen:(...Y)=>new LY(Y,this.opts).exec(this.client),toggle:(...Y)=>new UY(Y,this.opts).exec(this.client),type:(...Y)=>new KY(Y,this.opts).exec(this.client)}}get functions(){return{load:(...Y)=>new D0(Y,this.opts).exec(this.client),list:(...Y)=>new V0(Y,this.opts).exec(this.client),delete:(...Y)=>new Q0(Y,this.opts).exec(this.client),flush:()=>new G0(this.opts).exec(this.client),stats:()=>new z0(this.opts).exec(this.client),call:(...Y)=>new s1(Y,this.opts).exec(this.client),callRo:(...Y)=>new Y0(Y,this.opts).exec(this.client)}}use=(Y)=>{let W=this.client.request.bind(this.client);this.client.request=($)=>Y($,W)};addTelemetry=(Y)=>{if(!this.enableTelemetry)return;try{this.client.mergeTelemetry(Y)}catch{}};createScript(Y,W){return W?.readonly?new I$(this,Y):new B$(this,Y)}get search(){return{createIndex:(Y)=>{return nW(this.client,Y)},index:(Y)=>{return h1(this.client,Y)},alias:{list:()=>{return tW(this.client)},add:({indexName:Y,alias:W})=>{return dW(this.client,{indexName:Y,alias:W})},delete:({alias:Y})=>{return rW(this.client,{alias:Y})}}}}get vector(){return{createIndex:(Y)=>{return z$(this.client,Y,this.opts)},index:(Y)=>{return T$(this.client,Y,this.opts)}}}pipeline=()=>new Y1({client:this.client,commandOptions:this.opts,multiExec:!1});autoPipeline=()=>{return l(this)};multi=()=>new Y1({client:this.client,commandOptions:this.opts,multiExec:!0});bitfield=(...Y)=>new k1(Y,this.client,this.opts);append=(...Y)=>new L1(Y,this.opts).exec(this.client);arcount=(...Y)=>new U1(Y,this.opts).exec(this.client);ardel=(...Y)=>new K1(Y,this.opts).exec(this.client);ardelrange=(...Y)=>new J1(Y,this.opts).exec(this.client);arget=(...Y)=>new N1(Y,this.opts).exec(this.client);argetrange=(...Y)=>new P1(Y,this.opts).exec(this.client);argrep=(Y,W,$,Q)=>new F1([Y,W,$,Q],this.opts).exec(this.client);arinfo=(...Y)=>new _1(Y,this.opts).exec(this.client);arinsert=(Y,...W)=>new j1([Y,...W],this.opts).exec(this.client);arlastitems=(...Y)=>new A1(Y,this.opts).exec(this.client);arlen=(...Y)=>new B1(Y,this.opts).exec(this.client);armget=(...Y)=>new I1(Y,this.opts).exec(this.client);armset=(Y,W)=>new S1([Y,W],this.opts).exec(this.client);arnext=(...Y)=>new q1(Y,this.opts).exec(this.client);arop=(Y,W,$,Q)=>new b1([Y,W,$,Q],this.opts).exec(this.client);arring=(Y,W,...$)=>new x1([Y,W,...$],this.opts).exec(this.client);arscan=(...Y)=>new R1(Y,this.opts).exec(this.client);arseek=(...Y)=>new O1(Y,this.opts).exec(this.client);arset=(Y,W,...$)=>new v1([Y,W,...$],this.opts).exec(this.client);bitcount=(...Y)=>new f1(Y,this.opts).exec(this.client);bitop=(Y,W,$,...Q)=>new l1([Y,W,$,...Q],this.opts).exec(this.client);bitpos=(...Y)=>new y1(Y,this.opts).exec(this.client);clientSetinfo=(...Y)=>new u1(Y,this.opts).exec(this.client);copy=(...Y)=>new C1(Y,this.opts).exec(this.client);dbsize=()=>new i1(this.opts).exec(this.client);decr=(...Y)=>new g1(Y,this.opts).exec(this.client);decrby=(...Y)=>new c1(Y,this.opts).exec(this.client);del=(...Y)=>new p1(Y,this.opts).exec(this.client);echo=(...Y)=>new n1(Y,this.opts).exec(this.client);evalRo=(...Y)=>new t1(Y,this.opts).exec(this.client);eval=(...Y)=>new d1(Y,this.opts).exec(this.client);evalshaRo=(...Y)=>new r1(Y,this.opts).exec(this.client);evalsha=(...Y)=>new e1(Y,this.opts).exec(this.client);exec=(Y)=>new E(Y,this.opts).exec(this.client);exists=(...Y)=>new o1(Y,this.opts).exec(this.client);expire=(...Y)=>new a1(Y,this.opts).exec(this.client);expireat=(...Y)=>new m1(Y,this.opts).exec(this.client);flushall=(Y)=>new W0(Y,this.opts).exec(this.client);flushdb=(...Y)=>new $0(Y,this.opts).exec(this.client);geoadd=(...Y)=>new T0(Y,this.opts).exec(this.client);geopos=(...Y)=>new X0(Y,this.opts).exec(this.client);geodist=(...Y)=>new H0(Y,this.opts).exec(this.client);geohash=(...Y)=>new Z0(Y,this.opts).exec(this.client);geosearch=(...Y)=>new M0(Y,this.opts).exec(this.client);geosearchstore=(...Y)=>new h0(Y,this.opts).exec(this.client);get=(...Y)=>new w0(Y,this.opts).exec(this.client);getbit=(...Y)=>new E0(Y,this.opts).exec(this.client);getdel=(...Y)=>new L0(Y,this.opts).exec(this.client);getex=(...Y)=>new U0(Y,this.opts).exec(this.client);getrange=(...Y)=>new K0(Y,this.opts).exec(this.client);getset=(Y,W)=>new J0([Y,W],this.opts).exec(this.client);hdel=(...Y)=>new N0(Y,this.opts).exec(this.client);hexists=(...Y)=>new P0(Y,this.opts).exec(this.client);hexpire=(...Y)=>new F0(Y,this.opts).exec(this.client);hexpireat=(...Y)=>new _0(Y,this.opts).exec(this.client);hexpiretime=(...Y)=>new j0(Y,this.opts).exec(this.client);httl=(...Y)=>new n0(Y,this.opts).exec(this.client);hpexpire=(...Y)=>new B0(Y,this.opts).exec(this.client);hpexpireat=(...Y)=>new I0(Y,this.opts).exec(this.client);hpexpiretime=(...Y)=>new S0(Y,this.opts).exec(this.client);hpttl=(...Y)=>new q0(Y,this.opts).exec(this.client);hpersist=(...Y)=>new A0(Y,this.opts).exec(this.client);hget=(...Y)=>new b0(Y,this.opts).exec(this.client);hgetall=(...Y)=>new x0(Y,this.opts).exec(this.client);hgetdel=(...Y)=>new O0(Y,this.opts).exec(this.client);hgetex=(...Y)=>new v0(Y,this.opts).exec(this.client);hincrby=(...Y)=>new f0(Y,this.opts).exec(this.client);hincrbyfloat=(...Y)=>new k0(Y,this.opts).exec(this.client);hkeys=(...Y)=>new l0(Y,this.opts).exec(this.client);hlen=(...Y)=>new y0(Y,this.opts).exec(this.client);hmget=(...Y)=>new R0(Y,this.opts).exec(this.client);hmset=(Y,W)=>new u0([Y,W],this.opts).exec(this.client);hrandfield=(Y,W,$)=>new E1([Y,W,$],this.opts).exec(this.client);hscan=(...Y)=>new C0(Y,this.opts).exec(this.client);hset=(Y,W)=>new i0([Y,W],this.opts).exec(this.client);hsetex=(...Y)=>new g0(Y,this.opts).exec(this.client);hsetnx=(Y,W,$)=>new c0([Y,W,$],this.opts).exec(this.client);hstrlen=(...Y)=>new p0(Y,this.opts).exec(this.client);hvals=(...Y)=>new t0(Y,this.opts).exec(this.client);incr=(...Y)=>new d0(Y,this.opts).exec(this.client);incrby=(...Y)=>new r0(Y,this.opts).exec(this.client);incrbyfloat=(...Y)=>new e0(Y,this.opts).exec(this.client);keys=(...Y)=>new JY(Y,this.opts).exec(this.client);lindex=(...Y)=>new NY(Y,this.opts).exec(this.client);linsert=(Y,W,$,Q)=>new PY([Y,W,$,Q],this.opts).exec(this.client);llen=(...Y)=>new FY(Y,this.opts).exec(this.client);lmove=(...Y)=>new _Y(Y,this.opts).exec(this.client);lpop=(...Y)=>new AY(Y,this.opts).exec(this.client);lmpop=(...Y)=>new jY(Y,this.opts).exec(this.client);lpos=(...Y)=>new BY(Y,this.opts).exec(this.client);lpush=(Y,...W)=>new IY([Y,...W],this.opts).exec(this.client);lpushx=(Y,...W)=>new SY([Y,...W],this.opts).exec(this.client);lrange=(...Y)=>new qY(Y,this.opts).exec(this.client);lrem=(Y,W,$)=>new bY([Y,W,$],this.opts).exec(this.client);lset=(Y,W,$)=>new xY([Y,W,$],this.opts).exec(this.client);ltrim=(...Y)=>new RY(Y,this.opts).exec(this.client);mget=(...Y)=>new OY(Y,this.opts).exec(this.client);mset=(Y)=>new vY([Y],this.opts).exec(this.client);msetnx=(Y)=>new fY([Y],this.opts).exec(this.client);persist=(...Y)=>new kY(Y,this.opts).exec(this.client);pexpire=(...Y)=>new lY(Y,this.opts).exec(this.client);pexpireat=(...Y)=>new yY(Y,this.opts).exec(this.client);pfadd=(...Y)=>new uY(Y,this.opts).exec(this.client);pfcount=(...Y)=>new CY(Y,this.opts).exec(this.client);pfmerge=(...Y)=>new iY(Y,this.opts).exec(this.client);ping=(Y)=>new gY(Y,this.opts).exec(this.client);psetex=(Y,W,$)=>new cY([Y,W,$],this.opts).exec(this.client);psubscribe=(Y)=>{let W=Array.isArray(Y)?Y:[Y];return new $1(this.client,W,!0,this.opts)};pttl=(...Y)=>new pY(Y,this.opts).exec(this.client);publish=(...Y)=>new nY(Y,this.opts).exec(this.client);randomkey=()=>new tY().exec(this.client);rename=(...Y)=>new dY(Y,this.opts).exec(this.client);renamenx=(...Y)=>new rY(Y,this.opts).exec(this.client);rpop=(...Y)=>new eY(Y,this.opts).exec(this.client);rpush=(Y,...W)=>new oY([Y,...W],this.opts).exec(this.client);rpushx=(Y,...W)=>new aY([Y,...W],this.opts).exec(this.client);sadd=(Y,W,...$)=>new mY([Y,W,...$],this.opts).exec(this.client);scan(Y,W){return new sY([Y,W],this.opts).exec(this.client)}scard=(...Y)=>new Y4(Y,this.opts).exec(this.client);scriptExists=(...Y)=>new W4(Y,this.opts).exec(this.client);scriptFlush=(...Y)=>new $4(Y,this.opts).exec(this.client);scriptLoad=(...Y)=>new Q4(Y,this.opts).exec(this.client);sdiff=(...Y)=>new G4(Y,this.opts).exec(this.client);sdiffstore=(...Y)=>new V4(Y,this.opts).exec(this.client);set=(Y,W,$)=>new D4([Y,W,$],this.opts).exec(this.client);setbit=(...Y)=>new z4(Y,this.opts).exec(this.client);setex=(Y,W,$)=>new T4([Y,W,$],this.opts).exec(this.client);setnx=(Y,W)=>new H4([Y,W],this.opts).exec(this.client);setrange=(...Y)=>new Z4(Y,this.opts).exec(this.client);sinter=(...Y)=>new X4(Y,this.opts).exec(this.client);sintercard=(...Y)=>new M4(Y,this.opts).exec(this.client);sinterstore=(...Y)=>new h4(Y,this.opts).exec(this.client);sismember=(Y,W)=>new w4([Y,W],this.opts).exec(this.client);smismember=(Y,W)=>new L4([Y,W],this.opts).exec(this.client);smembers=(...Y)=>new E4(Y,this.opts).exec(this.client);smove=(Y,W,$)=>new U4([Y,W,$],this.opts).exec(this.client);spop=(...Y)=>new K4(Y,this.opts).exec(this.client);srandmember=(...Y)=>new J4(Y,this.opts).exec(this.client);srem=(Y,...W)=>new N4([Y,...W],this.opts).exec(this.client);sscan=(...Y)=>new P4(Y,this.opts).exec(this.client);strlen=(...Y)=>new F4(Y,this.opts).exec(this.client);subscribe=(Y)=>{let W=Array.isArray(Y)?Y:[Y];return new $1(this.client,W,!1,this.opts)};sunion=(...Y)=>new _4(Y,this.opts).exec(this.client);sunionstore=(...Y)=>new j4(Y,this.opts).exec(this.client);time=()=>new A4().exec(this.client);touch=(...Y)=>new B4(Y,this.opts).exec(this.client);ttl=(...Y)=>new I4(Y,this.opts).exec(this.client);type=(...Y)=>new S4(Y,this.opts).exec(this.client);unlink=(...Y)=>new q4(Y,this.opts).exec(this.client);xadd=(...Y)=>new R4(Y,this.opts).exec(this.client);xack=(...Y)=>new b4(Y,this.opts).exec(this.client);xackdel=(...Y)=>new x4(Y,this.opts).exec(this.client);xdel=(...Y)=>new f4(Y,this.opts).exec(this.client);xdelex=(...Y)=>new k4(Y,this.opts).exec(this.client);xgroup=(...Y)=>new l4(Y,this.opts).exec(this.client);xread=(...Y)=>new g4(Y,this.opts).exec(this.client);xreadgroup=(...Y)=>new c4(Y,this.opts).exec(this.client);xinfo=(...Y)=>new y4(Y,this.opts).exec(this.client);xlen=(...Y)=>new u4(Y,this.opts).exec(this.client);xpending=(...Y)=>new C4(Y,this.opts).exec(this.client);xclaim=(...Y)=>new v4(Y,this.opts).exec(this.client);xautoclaim=(...Y)=>new O4(Y,this.opts).exec(this.client);xtrim=(...Y)=>new n4(Y,this.opts).exec(this.client);xrange=(...Y)=>new i4(Y,this.opts).exec(this.client);xrevrange=(...Y)=>new p4(Y,this.opts).exec(this.client);zadd=(...Y)=>{if("score"in Y[1])return new A([Y[0],Y[1],...Y.slice(2)],this.opts).exec(this.client);return new A([Y[0],Y[1],...Y.slice(2)],this.opts).exec(this.client)};zcard=(...Y)=>new t4(Y,this.opts).exec(this.client);zcount=(...Y)=>new d4(Y,this.opts).exec(this.client);zdiffstore=(...Y)=>new ZW(Y,this.opts).exec(this.client);zincrby=(Y,W,$)=>new r4([Y,W,$],this.opts).exec(this.client);zinterstore=(...Y)=>new e4(Y,this.opts).exec(this.client);zlexcount=(...Y)=>new o4(Y,this.opts).exec(this.client);zmscore=(...Y)=>new XW(Y,this.opts).exec(this.client);zpopmax=(...Y)=>new a4(Y,this.opts).exec(this.client);zpopmin=(...Y)=>new m4(Y,this.opts).exec(this.client);zrange=(...Y)=>new s4(Y,this.opts).exec(this.client);zrank=(Y,W)=>new YW([Y,W],this.opts).exec(this.client);zrem=(Y,...W)=>new WW([Y,...W],this.opts).exec(this.client);zremrangebylex=(...Y)=>new $W(Y,this.opts).exec(this.client);zremrangebyrank=(...Y)=>new QW(Y,this.opts).exec(this.client);zremrangebyscore=(...Y)=>new GW(Y,this.opts).exec(this.client);zrevrank=(Y,W)=>new VW([Y,W],this.opts).exec(this.client);zscan=(...Y)=>new DW(Y,this.opts).exec(this.client);zscore=(Y,W)=>new zW([Y,W],this.opts).exec(this.client);zunion=(...Y)=>new TW(Y,this.opts).exec(this.client);zunionstore=(...Y)=>new HW(Y,this.opts).exec(this.client)},hW="v1.41.0";if(typeof atob>"u")global.atob=(Y)=>Buffer.from(Y,"base64").toString("utf8");var wW=class Y extends MW{constructor(W){if("request"in W){super(W);return}if(!W.url)console.warn("[Upstash Redis] The 'url' property is missing or undefined in your Redis config. To create a database instantly (no signup needed), run: curl -X POST https://upstash.com/start-redis");else if(W.url.startsWith(" ")||W.url.endsWith(" ")||/\r|\n/.test(W.url))console.warn("[Upstash Redis] The redis url contains whitespace or newline, which can cause errors!");if(!W.token)console.warn("[Upstash Redis] The 'token' property is missing or undefined in your Redis config. To create a database instantly (no signup needed), run: curl -X POST https://upstash.com/start-redis");else if(W.token.startsWith(" ")||W.token.endsWith(" ")||/\r|\n/.test(W.token))console.warn("[Upstash Redis] The redis token contains whitespace or newline, which can cause errors!");let $=new z1({baseUrl:W.url,retry:W.retry,headers:{authorization:`Bearer ${W.token}`},agent:W.agent,responseEncoding:W.responseEncoding,cache:W.cache??"no-store",signal:W.signal,keepAlive:W.keepAlive,readYourWrites:W.readYourWrites}),Q=typeof process==="object"&&process&&typeof process.env==="object"&&process.env?process.env:{};super($,{automaticDeserialization:W.automaticDeserialization,enableTelemetry:W.enableTelemetry??!Q.UPSTASH_DISABLE_TELEMETRY,latencyLogging:W.latencyLogging,enableAutoPipelining:W.enableAutoPipelining});let G=typeof process==="object"&&process?process.version:void 0;if(this.addTelemetry({runtime:typeof EdgeRuntime==="string"?"edge-light":G?`node@${G}`:"unknown",platform:Q.UPSTASH_CONSOLE?"console":Q.VERCEL?"vercel":Q.AWS_REGION?"aws":"unknown",sdk:`@upstash/redis@${hW}`}),this.enableAutoPipelining)return this.autoPipeline()}static fromEnv(W){if(typeof process!=="object"||!process||typeof process.env!=="object"||!process.env)throw TypeError('[Upstash Redis] Unable to get environment variables, `process.env` is undefined. If you are deploying to cloudflare, please import from "@upstash/redis/cloudflare" instead');let $=process.env.UPSTASH_REDIS_REST_URL||process.env.KV_REST_API_URL;if(!$)console.warn("[Upstash Redis] Unable to find environment variable: `UPSTASH_REDIS_REST_URL`. To create a database instantly (no signup needed), run: curl -X POST https://upstash.com/start-redis");let Q=process.env.UPSTASH_REDIS_REST_TOKEN||process.env.KV_REST_API_TOKEN;if(!Q)console.warn("[Upstash Redis] Unable to find environment variable: `UPSTASH_REDIS_REST_TOKEN`. To create a database instantly (no signup needed), run: curl -X POST https://upstash.com/start-redis");return new Y({...W,url:$,token:Q})}};class EW{options;type="cache";name="RedisDriver";tcpClient;httpClient;prefix;logger;constructor(Y){this.options=Y;this.logger=new U}initClients(){if(this.options.protocol==="http")this.httpClient=new wW({url:this.options.url,token:this.options.token});else this.tcpClient=new S$(this.options.connectionString,{lazyConnect:!0,maxRetriesPerRequest:3})}setKeyPrefix(Y){this.prefix=Y}async connect(){if(this.options.protocol=="tcp"){if(!this.tcpClient)this.initClients();if(!this.tcpClient)throw Error("TCP Client could not found");let Y=this.tcpClient.status;if(Y==="end"||Y==="close")this.initClients();if(this.tcpClient.status==="wait")await this.tcpClient.connect(),this.logger.log(`[RedisDriver] : TCP Connected to ${this.options.connectionString}`)}else if(this.options.protocol=="http"){if(!this.httpClient)this.initClients();let Y=await this.httpClient.ping();if(Y.toLowerCase()==="pong")this.logger.log("[RedisDriver] : HTTP REST client initialized.");else this.logger.warn("[RedisDriver] : HTTP REST client initialized, but ping failed with unexpected response:",Y)}}async disconnect(){if(this.options.protocol=="tcp"&&this.tcpClient){let Y=this.tcpClient.status;if(Y!=="end"&&Y!=="close")try{await this.tcpClient.quit(),this.logger.log("[RedisDriver] : TCP Disconnected.")}catch(W){this.tcpClient.disconnect()}}}async healthCheck(){let Y=Date.now();try{if(this.options.protocol==="tcp")await this.tcpClient.ping();else await this.httpClient.ping();return{status:"up",latencyMs:Date.now()-Y}}catch(W){return{status:"down",latencyMs:Date.now()-Y,details:{error:W.message}}}}getNativeClient(Y){if((Y??this.options.protocol)==="tcp"){if(!this.tcpClient)throw Error("[RedisDriver] : TCP client is not initialized.");return this.tcpClient}if(!this.httpClient)throw Error("[RedisDriver] : REST client is not initialized.");return this.httpClient}}export{EW as RedisDriver,e as PulsarUnifiedStorage,o as PostgresDriver};
401
+ /* Powered by NightX - Pulsar Engine */
402
+
403
+ //# debugId=4F2DC647A58F34CE64756E2164756E21