@upstash/redis 1.40.0 → 1.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/README.md +5 -0
  2. package/{chunk-RLVWMRRX.mjs → chunk-CGMWROAN.mjs} +557 -4
  3. package/cloudflare.d.mts +2 -2
  4. package/cloudflare.d.ts +2 -2
  5. package/cloudflare.js +557 -4
  6. package/cloudflare.mjs +1 -1
  7. package/docs/advanced.mdx +83 -0
  8. package/docs/commands/array/arcount.mdx +28 -0
  9. package/docs/commands/array/ardel.mdx +30 -0
  10. package/docs/commands/array/ardelrange.mdx +32 -0
  11. package/docs/commands/array/arget.mdx +33 -0
  12. package/docs/commands/array/argetrange.mdx +38 -0
  13. package/docs/commands/array/argrep.mdx +69 -0
  14. package/docs/commands/array/arinfo.mdx +49 -0
  15. package/docs/commands/array/arinsert.mdx +32 -0
  16. package/docs/commands/array/arlastitems.mdx +40 -0
  17. package/docs/commands/array/arlen.mdx +28 -0
  18. package/docs/commands/array/armget.mdx +31 -0
  19. package/docs/commands/array/armset.mdx +31 -0
  20. package/docs/commands/array/arnext.mdx +25 -0
  21. package/docs/commands/array/arop.mdx +44 -0
  22. package/docs/commands/array/arring.mdx +36 -0
  23. package/docs/commands/array/arscan.mdx +42 -0
  24. package/docs/commands/array/arseek.mdx +34 -0
  25. package/docs/commands/array/arset.mdx +35 -0
  26. package/docs/commands/auth/echo.mdx +24 -0
  27. package/docs/commands/auth/ping.mdx +21 -0
  28. package/docs/commands/bitmap/bitcount.mdx +39 -0
  29. package/docs/commands/bitmap/bitop.mdx +142 -0
  30. package/docs/commands/bitmap/bitpos.mdx +39 -0
  31. package/docs/commands/bitmap/getbit.mdx +28 -0
  32. package/docs/commands/bitmap/setbit.mdx +31 -0
  33. package/docs/commands/connection/client_setinfo.mdx +91 -0
  34. package/docs/commands/functions/call.mdx +72 -0
  35. package/docs/commands/functions/call_ro.mdx +57 -0
  36. package/docs/commands/functions/delete.mdx +22 -0
  37. package/docs/commands/functions/flush.mdx +16 -0
  38. package/docs/commands/functions/list.mdx +72 -0
  39. package/docs/commands/functions/load.mdx +64 -0
  40. package/docs/commands/functions/stats.mdx +46 -0
  41. package/docs/commands/generic/del.mdx +29 -0
  42. package/docs/commands/generic/exists.mdx +26 -0
  43. package/docs/commands/generic/expire.mdx +29 -0
  44. package/docs/commands/generic/expireat.mdx +29 -0
  45. package/docs/commands/generic/keys.mdx +32 -0
  46. package/docs/commands/generic/persist.mdx +23 -0
  47. package/docs/commands/generic/pexpire.mdx +28 -0
  48. package/docs/commands/generic/pexpireat.mdx +29 -0
  49. package/docs/commands/generic/pttl.mdx +23 -0
  50. package/docs/commands/generic/randomkey.mdx +21 -0
  51. package/docs/commands/generic/rename.mdx +28 -0
  52. package/docs/commands/generic/renamenx.mdx +28 -0
  53. package/docs/commands/generic/scan.mdx +38 -0
  54. package/docs/commands/generic/touch.mdx +23 -0
  55. package/docs/commands/generic/ttl.mdx +23 -0
  56. package/docs/commands/generic/type.mdx +27 -0
  57. package/docs/commands/generic/unlink.mdx +29 -0
  58. package/docs/commands/hash/hdel.mdx +28 -0
  59. package/docs/commands/hash/hexists.mdx +30 -0
  60. package/docs/commands/hash/hexpire.mdx +49 -0
  61. package/docs/commands/hash/hexpireat.mdx +48 -0
  62. package/docs/commands/hash/hexpiretime.mdx +35 -0
  63. package/docs/commands/hash/hget.mdx +29 -0
  64. package/docs/commands/hash/hgetall.mdx +27 -0
  65. package/docs/commands/hash/hgetdel.mdx +67 -0
  66. package/docs/commands/hash/hgetex.mdx +123 -0
  67. package/docs/commands/hash/hincrby.mdx +34 -0
  68. package/docs/commands/hash/hincrbyfloat.mdx +34 -0
  69. package/docs/commands/hash/hkeys.mdx +28 -0
  70. package/docs/commands/hash/hlen.mdx +28 -0
  71. package/docs/commands/hash/hmget.mdx +33 -0
  72. package/docs/commands/hash/hpersist.mdx +37 -0
  73. package/docs/commands/hash/hpexpire.mdx +50 -0
  74. package/docs/commands/hash/hpexpireat.mdx +48 -0
  75. package/docs/commands/hash/hpexpiretime.mdx +35 -0
  76. package/docs/commands/hash/hpttl.mdx +35 -0
  77. package/docs/commands/hash/hrandfield.mdx +57 -0
  78. package/docs/commands/hash/hscan.mdx +65 -0
  79. package/docs/commands/hash/hset.mdx +32 -0
  80. package/docs/commands/hash/hsetex.mdx +186 -0
  81. package/docs/commands/hash/hsetnx.mdx +30 -0
  82. package/docs/commands/hash/hstrlen.mdx +28 -0
  83. package/docs/commands/hash/httl.mdx +35 -0
  84. package/docs/commands/hash/hvals.mdx +29 -0
  85. package/docs/commands/json/arrappend.mdx +35 -0
  86. package/docs/commands/json/arrindex.mdx +37 -0
  87. package/docs/commands/json/arrinsert.mdx +34 -0
  88. package/docs/commands/json/arrlen.mdx +26 -0
  89. package/docs/commands/json/arrpop.mdx +36 -0
  90. package/docs/commands/json/arrtrim.mdx +34 -0
  91. package/docs/commands/json/clear.mdx +30 -0
  92. package/docs/commands/json/del.mdx +26 -0
  93. package/docs/commands/json/forget.mdx +26 -0
  94. package/docs/commands/json/get.mdx +53 -0
  95. package/docs/commands/json/merge.mdx +32 -0
  96. package/docs/commands/json/mget.mdx +27 -0
  97. package/docs/commands/json/mset.mdx +26 -0
  98. package/docs/commands/json/numincrby.mdx +33 -0
  99. package/docs/commands/json/nummultby.mdx +33 -0
  100. package/docs/commands/json/objkeys.mdx +27 -0
  101. package/docs/commands/json/objlen.mdx +27 -0
  102. package/docs/commands/json/set.mdx +42 -0
  103. package/docs/commands/json/strappend.mdx +32 -0
  104. package/docs/commands/json/strlen.mdx +26 -0
  105. package/docs/commands/json/toggle.mdx +28 -0
  106. package/docs/commands/json/type.mdx +28 -0
  107. package/docs/commands/list/lindex.mdx +32 -0
  108. package/docs/commands/list/linsert.mdx +41 -0
  109. package/docs/commands/list/llen.mdx +26 -0
  110. package/docs/commands/list/lmove.mdx +34 -0
  111. package/docs/commands/list/lpop.mdx +37 -0
  112. package/docs/commands/list/lpos.mdx +56 -0
  113. package/docs/commands/list/lpush.mdx +32 -0
  114. package/docs/commands/list/lpushx.mdx +38 -0
  115. package/docs/commands/list/lrange.mdx +37 -0
  116. package/docs/commands/list/lrem.mdx +33 -0
  117. package/docs/commands/list/lset.mdx +34 -0
  118. package/docs/commands/list/ltrim.mdx +33 -0
  119. package/docs/commands/list/rpop.mdx +37 -0
  120. package/docs/commands/list/rpush.mdx +32 -0
  121. package/docs/commands/list/rpushx.mdx +38 -0
  122. package/docs/commands/overview.mdx +692 -0
  123. package/docs/commands/pubsub/psubscribe.mdx +36 -0
  124. package/docs/commands/pubsub/publish.mdx +27 -0
  125. package/docs/commands/pubsub/subscribe.mdx +28 -0
  126. package/docs/commands/scripts/eval.mdx +36 -0
  127. package/docs/commands/scripts/eval_ro.mdx +36 -0
  128. package/docs/commands/scripts/evalsha.mdx +36 -0
  129. package/docs/commands/scripts/evalsha_ro.mdx +36 -0
  130. package/docs/commands/scripts/script_exists.mdx +26 -0
  131. package/docs/commands/scripts/script_flush.mdx +28 -0
  132. package/docs/commands/scripts/script_load.mdx +28 -0
  133. package/docs/commands/server/dbsize.mdx +22 -0
  134. package/docs/commands/server/flushall.mdx +25 -0
  135. package/docs/commands/server/flushdb.mdx +25 -0
  136. package/docs/commands/set/sadd.mdx +32 -0
  137. package/docs/commands/set/scard.mdx +26 -0
  138. package/docs/commands/set/sdiff.mdx +27 -0
  139. package/docs/commands/set/sdiffstore.mdx +32 -0
  140. package/docs/commands/set/sinter.mdx +27 -0
  141. package/docs/commands/set/sinterstore.mdx +33 -0
  142. package/docs/commands/set/sismember.mdx +30 -0
  143. package/docs/commands/set/smembers.mdx +25 -0
  144. package/docs/commands/set/smismember.mdx +31 -0
  145. package/docs/commands/set/smove.mdx +34 -0
  146. package/docs/commands/set/spop.mdx +36 -0
  147. package/docs/commands/set/srandmember.mdx +36 -0
  148. package/docs/commands/set/srem.mdx +29 -0
  149. package/docs/commands/set/sscan.mdx +39 -0
  150. package/docs/commands/set/sunion.mdx +27 -0
  151. package/docs/commands/set/sunionstore.mdx +33 -0
  152. package/docs/commands/stream/xack.mdx +37 -0
  153. package/docs/commands/stream/xackdel.mdx +211 -0
  154. package/docs/commands/stream/xadd.mdx +137 -0
  155. package/docs/commands/stream/xautoclaim.mdx +80 -0
  156. package/docs/commands/stream/xclaim.mdx +84 -0
  157. package/docs/commands/stream/xdel.mdx +34 -0
  158. package/docs/commands/stream/xdelex.mdx +119 -0
  159. package/docs/commands/stream/xgroup.mdx +141 -0
  160. package/docs/commands/stream/xinfo.mdx +77 -0
  161. package/docs/commands/stream/xlen.mdx +22 -0
  162. package/docs/commands/stream/xpending.mdx +75 -0
  163. package/docs/commands/stream/xrange.mdx +59 -0
  164. package/docs/commands/stream/xread.mdx +65 -0
  165. package/docs/commands/stream/xreadgroup.mdx +87 -0
  166. package/docs/commands/stream/xrevrange.mdx +65 -0
  167. package/docs/commands/stream/xtrim.mdx +75 -0
  168. package/docs/commands/string/append.mdx +28 -0
  169. package/docs/commands/string/decr.mdx +27 -0
  170. package/docs/commands/string/decrby.mdx +30 -0
  171. package/docs/commands/string/get.mdx +34 -0
  172. package/docs/commands/string/getdel.mdx +29 -0
  173. package/docs/commands/string/getrange.mdx +34 -0
  174. package/docs/commands/string/getset.mdx +28 -0
  175. package/docs/commands/string/incr.mdx +27 -0
  176. package/docs/commands/string/incrby.mdx +30 -0
  177. package/docs/commands/string/incrbyfloat.mdx +30 -0
  178. package/docs/commands/string/mget.mdx +31 -0
  179. package/docs/commands/string/mset.mdx +32 -0
  180. package/docs/commands/string/msetnx.mdx +29 -0
  181. package/docs/commands/string/set.mdx +79 -0
  182. package/docs/commands/string/setrange.mdx +38 -0
  183. package/docs/commands/string/strlen.mdx +26 -0
  184. package/docs/commands/transaction.mdx +22 -0
  185. package/docs/commands/zset/zadd.mdx +102 -0
  186. package/docs/commands/zset/zcard.mdx +31 -0
  187. package/docs/commands/zset/zcount.mdx +47 -0
  188. package/docs/commands/zset/zdiffstore.mdx +33 -0
  189. package/docs/commands/zset/zincrby.mdx +37 -0
  190. package/docs/commands/zset/zinterstore.mdx +98 -0
  191. package/docs/commands/zset/zlexcount.mdx +43 -0
  192. package/docs/commands/zset/zmscore.mdx +34 -0
  193. package/docs/commands/zset/zpopmax.mdx +25 -0
  194. package/docs/commands/zset/zpopmin.mdx +25 -0
  195. package/docs/commands/zset/zrange.mdx +85 -0
  196. package/docs/commands/zset/zrank.mdx +29 -0
  197. package/docs/commands/zset/zrem.mdx +33 -0
  198. package/docs/commands/zset/zremrangebylex.mdx +32 -0
  199. package/docs/commands/zset/zremrangebyrank.mdx +32 -0
  200. package/docs/commands/zset/zremrangebyscore.mdx +32 -0
  201. package/docs/commands/zset/zrevrank.mdx +29 -0
  202. package/docs/commands/zset/zscan.mdx +58 -0
  203. package/docs/commands/zset/zscore.mdx +34 -0
  204. package/docs/commands/zset/zunionstore.mdx +98 -0
  205. package/docs/deployment.mdx +117 -0
  206. package/docs/developing.mdx +118 -0
  207. package/docs/getstarted.mdx +68 -0
  208. package/docs/overview.mdx +29 -0
  209. package/docs/pipelining/auto-pipeline.mdx +108 -0
  210. package/docs/pipelining/pipeline-transaction.mdx +65 -0
  211. package/docs/retries.mdx +24 -0
  212. package/docs/troubleshooting.mdx +80 -0
  213. package/{error-BNzLTXJG.d.mts → error-4e36-PC0.d.mts} +838 -8
  214. package/{error-BNzLTXJG.d.ts → error-4e36-PC0.d.ts} +838 -8
  215. package/fastly.d.mts +2 -2
  216. package/fastly.d.ts +2 -2
  217. package/fastly.js +557 -4
  218. package/fastly.mjs +1 -1
  219. package/nodejs.d.mts +34 -2
  220. package/nodejs.d.ts +34 -2
  221. package/nodejs.js +586 -4
  222. package/nodejs.mjs +30 -1
  223. package/package.json +16 -5
  224. package/src/pkg/auto-pipeline.ts +284 -0
  225. package/src/pkg/commands/append.ts +12 -0
  226. package/src/pkg/commands/arcount.ts +14 -0
  227. package/src/pkg/commands/ardel.ts +19 -0
  228. package/src/pkg/commands/ardelrange.ts +19 -0
  229. package/src/pkg/commands/arget.ts +17 -0
  230. package/src/pkg/commands/argetrange.ts +20 -0
  231. package/src/pkg/commands/argrep.ts +109 -0
  232. package/src/pkg/commands/arinfo.ts +88 -0
  233. package/src/pkg/commands/arinsert.ts +24 -0
  234. package/src/pkg/commands/arlastitems.ts +29 -0
  235. package/src/pkg/commands/arlen.ts +23 -0
  236. package/src/pkg/commands/armget.ts +18 -0
  237. package/src/pkg/commands/armset.ts +26 -0
  238. package/src/pkg/commands/arnext.ts +20 -0
  239. package/src/pkg/commands/arop.ts +48 -0
  240. package/src/pkg/commands/arring.ts +23 -0
  241. package/src/pkg/commands/arscan.ts +44 -0
  242. package/src/pkg/commands/arseek.ts +17 -0
  243. package/src/pkg/commands/arset.ts +20 -0
  244. package/src/pkg/commands/bitcount.ts +30 -0
  245. package/src/pkg/commands/bitfield.ts +50 -0
  246. package/src/pkg/commands/bitop.ts +35 -0
  247. package/src/pkg/commands/bitpos.ts +15 -0
  248. package/src/pkg/commands/client_setinfo.ts +17 -0
  249. package/src/pkg/commands/command.ts +142 -0
  250. package/src/pkg/commands/copy.ts +22 -0
  251. package/src/pkg/commands/dbsize.ts +12 -0
  252. package/src/pkg/commands/decr.ts +12 -0
  253. package/src/pkg/commands/decrby.ts +12 -0
  254. package/src/pkg/commands/del.ts +12 -0
  255. package/src/pkg/commands/echo.ts +12 -0
  256. package/src/pkg/commands/eval.ts +18 -0
  257. package/src/pkg/commands/evalRo.ts +18 -0
  258. package/src/pkg/commands/evalsha.ts +18 -0
  259. package/src/pkg/commands/evalshaRo.ts +18 -0
  260. package/src/pkg/commands/exec.ts +23 -0
  261. package/src/pkg/commands/exists.ts +12 -0
  262. package/src/pkg/commands/expire.ts +13 -0
  263. package/src/pkg/commands/expireat.ts +16 -0
  264. package/src/pkg/commands/fcall.ts +15 -0
  265. package/src/pkg/commands/fcall_ro.ts +18 -0
  266. package/src/pkg/commands/flushall.ts +15 -0
  267. package/src/pkg/commands/flushdb.ts +15 -0
  268. package/src/pkg/commands/function_delete.ts +12 -0
  269. package/src/pkg/commands/function_flush.ts +12 -0
  270. package/src/pkg/commands/function_list.ts +77 -0
  271. package/src/pkg/commands/function_load.ts +31 -0
  272. package/src/pkg/commands/function_stats.ts +42 -0
  273. package/src/pkg/commands/geo_add.ts +54 -0
  274. package/src/pkg/commands/geo_dist.ts +19 -0
  275. package/src/pkg/commands/geo_hash.ts +23 -0
  276. package/src/pkg/commands/geo_pos.ts +39 -0
  277. package/src/pkg/commands/geo_search.ts +140 -0
  278. package/src/pkg/commands/geo_search_store.ts +69 -0
  279. package/src/pkg/commands/get.ts +15 -0
  280. package/src/pkg/commands/getbit.ts +12 -0
  281. package/src/pkg/commands/getdel.ts +15 -0
  282. package/src/pkg/commands/getex.ts +36 -0
  283. package/src/pkg/commands/getrange.ts +15 -0
  284. package/src/pkg/commands/getset.ts +15 -0
  285. package/src/pkg/commands/hdel.ts +12 -0
  286. package/src/pkg/commands/hexists.ts +12 -0
  287. package/src/pkg/commands/hexpire.ts +30 -0
  288. package/src/pkg/commands/hexpireat.ts +30 -0
  289. package/src/pkg/commands/hexpiretime.ts +13 -0
  290. package/src/pkg/commands/hget.ts +18 -0
  291. package/src/pkg/commands/hgetall.ts +44 -0
  292. package/src/pkg/commands/hgetdel.ts +30 -0
  293. package/src/pkg/commands/hgetex.ts +56 -0
  294. package/src/pkg/commands/hincrby.ts +15 -0
  295. package/src/pkg/commands/hincrbyfloat.ts +15 -0
  296. package/src/pkg/commands/hkeys.ts +12 -0
  297. package/src/pkg/commands/hlen.ts +12 -0
  298. package/src/pkg/commands/hmget.ts +53 -0
  299. package/src/pkg/commands/hmset.ts +14 -0
  300. package/src/pkg/commands/hpersist.ts +13 -0
  301. package/src/pkg/commands/hpexpire.ts +30 -0
  302. package/src/pkg/commands/hpexpireat.ts +30 -0
  303. package/src/pkg/commands/hpexpiretime.ts +13 -0
  304. package/src/pkg/commands/hpttl.ts +13 -0
  305. package/src/pkg/commands/hrandfield.ts +52 -0
  306. package/src/pkg/commands/hscan.ts +31 -0
  307. package/src/pkg/commands/hset.ts +15 -0
  308. package/src/pkg/commands/hsetex.ts +59 -0
  309. package/src/pkg/commands/hsetnx.ts +15 -0
  310. package/src/pkg/commands/hstrlen.ts +12 -0
  311. package/src/pkg/commands/httl.ts +13 -0
  312. package/src/pkg/commands/hvals.ts +12 -0
  313. package/src/pkg/commands/incr.ts +12 -0
  314. package/src/pkg/commands/incrby.ts +12 -0
  315. package/src/pkg/commands/incrbyfloat.ts +12 -0
  316. package/src/pkg/commands/json_arrappend.ts +18 -0
  317. package/src/pkg/commands/json_arrindex.ts +15 -0
  318. package/src/pkg/commands/json_arrinsert.ts +18 -0
  319. package/src/pkg/commands/json_arrlen.ts +15 -0
  320. package/src/pkg/commands/json_arrpop.ts +15 -0
  321. package/src/pkg/commands/json_arrtrim.ts +19 -0
  322. package/src/pkg/commands/json_clear.ts +12 -0
  323. package/src/pkg/commands/json_del.ts +12 -0
  324. package/src/pkg/commands/json_forget.ts +12 -0
  325. package/src/pkg/commands/json_get.ts +45 -0
  326. package/src/pkg/commands/json_merge.ts +18 -0
  327. package/src/pkg/commands/json_mget.ts +12 -0
  328. package/src/pkg/commands/json_mset.ts +27 -0
  329. package/src/pkg/commands/json_numincrby.ts +15 -0
  330. package/src/pkg/commands/json_nummultby.ts +15 -0
  331. package/src/pkg/commands/json_objkeys.ts +15 -0
  332. package/src/pkg/commands/json_objlen.ts +15 -0
  333. package/src/pkg/commands/json_resp.ts +11 -0
  334. package/src/pkg/commands/json_set.ts +35 -0
  335. package/src/pkg/commands/json_strappend.ts +15 -0
  336. package/src/pkg/commands/json_strlen.ts +15 -0
  337. package/src/pkg/commands/json_toggle.ts +12 -0
  338. package/src/pkg/commands/json_type.ts +12 -0
  339. package/src/pkg/commands/keys.ts +12 -0
  340. package/src/pkg/commands/lindex.ts +11 -0
  341. package/src/pkg/commands/linsert.ts +10 -0
  342. package/src/pkg/commands/llen.ts +12 -0
  343. package/src/pkg/commands/lmove.ts +20 -0
  344. package/src/pkg/commands/lmpop.ts +19 -0
  345. package/src/pkg/commands/lpop.ts +18 -0
  346. package/src/pkg/commands/lpos.ts +26 -0
  347. package/src/pkg/commands/lpush.ts +12 -0
  348. package/src/pkg/commands/lpushx.ts +12 -0
  349. package/src/pkg/commands/lrange.ts +11 -0
  350. package/src/pkg/commands/lrem.ts +10 -0
  351. package/src/pkg/commands/lset.ts +8 -0
  352. package/src/pkg/commands/ltrim.ts +8 -0
  353. package/src/pkg/commands/mget.ts +15 -0
  354. package/src/pkg/commands/mod.ts +222 -0
  355. package/src/pkg/commands/mset.ts +12 -0
  356. package/src/pkg/commands/msetnx.ts +12 -0
  357. package/src/pkg/commands/persist.ts +12 -0
  358. package/src/pkg/commands/pexpire.ts +16 -0
  359. package/src/pkg/commands/pexpireat.ts +16 -0
  360. package/src/pkg/commands/pfadd.ts +11 -0
  361. package/src/pkg/commands/pfcount.ts +11 -0
  362. package/src/pkg/commands/pfmerge.ts +11 -0
  363. package/src/pkg/commands/ping.ts +15 -0
  364. package/src/pkg/commands/psetex.ts +14 -0
  365. package/src/pkg/commands/psubscribe.ts +26 -0
  366. package/src/pkg/commands/pttl.ts +12 -0
  367. package/src/pkg/commands/publish.ts +12 -0
  368. package/src/pkg/commands/randomkey.ts +12 -0
  369. package/src/pkg/commands/rename.ts +12 -0
  370. package/src/pkg/commands/renamenx.ts +12 -0
  371. package/src/pkg/commands/rpop.ts +21 -0
  372. package/src/pkg/commands/rpush.ts +12 -0
  373. package/src/pkg/commands/rpushx.ts +12 -0
  374. package/src/pkg/commands/sadd.ts +15 -0
  375. package/src/pkg/commands/scan.ts +63 -0
  376. package/src/pkg/commands/scard.ts +11 -0
  377. package/src/pkg/commands/script_exists.ts +15 -0
  378. package/src/pkg/commands/script_flush.ts +22 -0
  379. package/src/pkg/commands/script_load.ts +12 -0
  380. package/src/pkg/commands/sdiff.ts +11 -0
  381. package/src/pkg/commands/sdiffstore.ts +14 -0
  382. package/src/pkg/commands/search/command-builder.ts +162 -0
  383. package/src/pkg/commands/search/index.ts +4 -0
  384. package/src/pkg/commands/search/schema-builder.ts +320 -0
  385. package/src/pkg/commands/search/search.ts +218 -0
  386. package/src/pkg/commands/search/types.ts +1029 -0
  387. package/src/pkg/commands/search/utils.ts +275 -0
  388. package/src/pkg/commands/set.ts +52 -0
  389. package/src/pkg/commands/setbit.ts +15 -0
  390. package/src/pkg/commands/setex.ts +11 -0
  391. package/src/pkg/commands/setnx.ts +11 -0
  392. package/src/pkg/commands/setrange.ts +15 -0
  393. package/src/pkg/commands/sinter.ts +11 -0
  394. package/src/pkg/commands/sintercard.ts +19 -0
  395. package/src/pkg/commands/sinterstore.ts +14 -0
  396. package/src/pkg/commands/sismember.ts +11 -0
  397. package/src/pkg/commands/smembers.ts +12 -0
  398. package/src/pkg/commands/smismember.ts +17 -0
  399. package/src/pkg/commands/smove.ts +14 -0
  400. package/src/pkg/commands/spop.ts +18 -0
  401. package/src/pkg/commands/srandmember.ts +18 -0
  402. package/src/pkg/commands/srem.ts +11 -0
  403. package/src/pkg/commands/sscan.ts +31 -0
  404. package/src/pkg/commands/strlen.ts +12 -0
  405. package/src/pkg/commands/subscribe.ts +254 -0
  406. package/src/pkg/commands/sunion.ts +12 -0
  407. package/src/pkg/commands/sunionstore.ts +15 -0
  408. package/src/pkg/commands/time.ts +10 -0
  409. package/src/pkg/commands/touch.ts +12 -0
  410. package/src/pkg/commands/ttl.ts +12 -0
  411. package/src/pkg/commands/type.ts +13 -0
  412. package/src/pkg/commands/types.ts +201 -0
  413. package/src/pkg/commands/unlink.ts +12 -0
  414. package/src/pkg/commands/vector/index.ts +11 -0
  415. package/src/pkg/commands/vector/types.ts +63 -0
  416. package/src/pkg/commands/vector/utils.ts +67 -0
  417. package/src/pkg/commands/vector/vector.ts +131 -0
  418. package/src/pkg/commands/vector_add.ts +18 -0
  419. package/src/pkg/commands/vector_count.ts +11 -0
  420. package/src/pkg/commands/vector_create.ts +28 -0
  421. package/src/pkg/commands/vector_del.ts +13 -0
  422. package/src/pkg/commands/vector_drop.ts +13 -0
  423. package/src/pkg/commands/vector_get.ts +18 -0
  424. package/src/pkg/commands/vector_info.ts +25 -0
  425. package/src/pkg/commands/vector_query.ts +24 -0
  426. package/src/pkg/commands/xack.ts +16 -0
  427. package/src/pkg/commands/xackdel.ts +21 -0
  428. package/src/pkg/commands/xadd.ts +70 -0
  429. package/src/pkg/commands/xautoclaim.ts +31 -0
  430. package/src/pkg/commands/xclaim.ts +56 -0
  431. package/src/pkg/commands/xdel.ts +16 -0
  432. package/src/pkg/commands/xdelex.ts +25 -0
  433. package/src/pkg/commands/xgroup.ts +101 -0
  434. package/src/pkg/commands/xinfo.ts +28 -0
  435. package/src/pkg/commands/xlen.ts +12 -0
  436. package/src/pkg/commands/xpending.ts +44 -0
  437. package/src/pkg/commands/xrange.ts +49 -0
  438. package/src/pkg/commands/xread.ts +78 -0
  439. package/src/pkg/commands/xreadgroup.ts +74 -0
  440. package/src/pkg/commands/xrevrange.ts +48 -0
  441. package/src/pkg/commands/xtrim.ts +25 -0
  442. package/src/pkg/commands/zadd.ts +54 -0
  443. package/src/pkg/commands/zcard.ts +12 -0
  444. package/src/pkg/commands/zcount.ts +14 -0
  445. package/src/pkg/commands/zdiffstore.ts +15 -0
  446. package/src/pkg/commands/zincrby.ts +14 -0
  447. package/src/pkg/commands/zinterstore.ts +51 -0
  448. package/src/pkg/commands/zlexcount.ts +11 -0
  449. package/src/pkg/commands/zmscore.ts +16 -0
  450. package/src/pkg/commands/zpopmax.ts +18 -0
  451. package/src/pkg/commands/zpopmin.ts +18 -0
  452. package/src/pkg/commands/zrange.ts +72 -0
  453. package/src/pkg/commands/zrank.ts +14 -0
  454. package/src/pkg/commands/zrem.ts +11 -0
  455. package/src/pkg/commands/zremrangebylex.ts +11 -0
  456. package/src/pkg/commands/zremrangebyrank.ts +14 -0
  457. package/src/pkg/commands/zremrangebyscore.ts +18 -0
  458. package/src/pkg/commands/zrevrank.ts +14 -0
  459. package/src/pkg/commands/zscan.ts +31 -0
  460. package/src/pkg/commands/zscore.ts +15 -0
  461. package/src/pkg/commands/zunion.ts +54 -0
  462. package/src/pkg/commands/zunionstore.ts +52 -0
  463. package/src/pkg/error.ts +28 -0
  464. package/src/pkg/http.ts +458 -0
  465. package/src/pkg/index.ts +1 -0
  466. package/src/pkg/pipeline.ts +2041 -0
  467. package/src/pkg/redis.ts +2130 -0
  468. package/src/pkg/script.ts +100 -0
  469. package/src/pkg/scriptRo.ts +98 -0
  470. package/src/pkg/types.ts +35 -0
  471. package/src/pkg/util.ts +115 -0
  472. package/src/platforms/cloudflare.ts +162 -0
  473. package/src/platforms/fastly.ts +105 -0
  474. package/src/platforms/nodejs.ts +231 -0
  475. package/src/version.ts +1 -0
@@ -0,0 +1,100 @@
1
+ import { subtle } from "uncrypto";
2
+ import type { Redis } from "./redis";
3
+ /**
4
+ * Creates a new script.
5
+ *
6
+ * Scripts offer the ability to optimistically try to execute a script without having to send the
7
+ * entire script to the server. If the script is loaded on the server, it tries again by sending
8
+ * the entire script. Afterwards, the script is cached on the server.
9
+ *
10
+ * Responses are JSON-parsed automatically: a stored "123" comes back as the number 123, "true" as
11
+ * true, and '{"a":1}' as an object. Pass automaticDeserialization: false to the Redis constructor
12
+ * to receive raw strings.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const redis = new Redis({...})
17
+ *
18
+ * const script = redis.createScript<string>("return ARGV[1];")
19
+ * const arg1 = await script.eval([], ["Hello World"])
20
+ * expect(arg1, "Hello World")
21
+ * ```
22
+ */
23
+ export class Script<TResult = unknown> {
24
+ public readonly script: string;
25
+ /**
26
+ * @deprecated This property is initialized to an empty string and will be set in the init method
27
+ * asynchronously. Do not use this property immidiately after the constructor.
28
+ *
29
+ * This property is only exposed for backwards compatibility and will be removed in the
30
+ * future major release.
31
+ */
32
+ public sha1: string;
33
+ private initPromise: Promise<void> | undefined;
34
+ private readonly redis: Redis;
35
+
36
+ constructor(redis: Redis, script: string) {
37
+ this.redis = redis;
38
+ this.script = script;
39
+ this.sha1 = "";
40
+ void this.init(script);
41
+ }
42
+
43
+ /**
44
+ * Initialize the script by computing its SHA-1 hash.
45
+ */
46
+ private init(script: string): Promise<void> {
47
+ if (!this.initPromise) {
48
+ this.initPromise = this.digest(script).then((sha1) => {
49
+ this.sha1 = sha1;
50
+ });
51
+ }
52
+ return this.initPromise;
53
+ }
54
+
55
+ /**
56
+ * Send an `EVAL` command to redis.
57
+ */
58
+ public async eval(keys: string[], args: string[]): Promise<TResult> {
59
+ await this.init(this.script);
60
+
61
+ return await this.redis.eval(this.script, keys, args);
62
+ }
63
+
64
+ /**
65
+ * Calculates the sha1 hash of the script and then calls `EVALSHA`.
66
+ */
67
+ public async evalsha(keys: string[], args: string[]): Promise<TResult> {
68
+ await this.init(this.script);
69
+
70
+ return await this.redis.evalsha(this.sha1, keys, args);
71
+ }
72
+
73
+ /**
74
+ * Optimistically try to run `EVALSHA` first.
75
+ * If the script is not loaded in redis, it will fall back and try again with `EVAL`.
76
+ *
77
+ * Following calls will be able to use the cached script
78
+ */
79
+ public async exec(keys: string[], args: string[]): Promise<TResult> {
80
+ await this.init(this.script);
81
+
82
+ const res = await this.redis.evalsha(this.sha1, keys, args).catch(async (error) => {
83
+ if (error instanceof Error && error.message.toLowerCase().includes("noscript")) {
84
+ return await this.redis.eval(this.script, keys, args);
85
+ }
86
+ throw error;
87
+ });
88
+ return res as TResult;
89
+ }
90
+
91
+ /**
92
+ * Compute the sha1 hash of the script and return its hex representation.
93
+ */
94
+ private async digest(s: string): Promise<string> {
95
+ const data = new TextEncoder().encode(s);
96
+ const hashBuffer = await subtle.digest("SHA-1", data);
97
+ const hashArray = [...new Uint8Array(hashBuffer)];
98
+ return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
99
+ }
100
+ }
@@ -0,0 +1,98 @@
1
+ import { subtle } from "uncrypto";
2
+ import type { Redis } from "./redis";
3
+
4
+ /**
5
+ * Creates a new script.
6
+ *
7
+ * Scripts offer the ability to optimistically try to execute a script without having to send the
8
+ * entire script to the server. If the script is loaded on the server, it tries again by sending
9
+ * the entire script. Afterwards, the script is cached on the server.
10
+ *
11
+ * Responses are JSON-parsed automatically: a stored "123" comes back as the number 123, "true" as
12
+ * true, and '{"a":1}' as an object. Pass automaticDeserialization: false to the Redis constructor
13
+ * to receive raw strings.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const redis = new Redis({...})
18
+ *
19
+ * const script = redis.createScript<string>("return ARGV[1];", { readOnly: true })
20
+ * const arg1 = await script.evalRo([], ["Hello World"])
21
+ * expect(arg1, "Hello World")
22
+ * ```
23
+ */
24
+ export class ScriptRO<TResult = unknown> {
25
+ public readonly script: string;
26
+ /**
27
+ * @deprecated This property is initialized to an empty string and will be set in the init method
28
+ * asynchronously. Do not use this property immidiately after the constructor.
29
+ *
30
+ * This property is only exposed for backwards compatibility and will be removed in the
31
+ * future major release.
32
+ */
33
+ public sha1: string;
34
+ private initPromise: Promise<void> | undefined;
35
+ private readonly redis: Redis;
36
+
37
+ constructor(redis: Redis, script: string) {
38
+ this.redis = redis;
39
+ this.sha1 = "";
40
+ this.script = script;
41
+ void this.init(script);
42
+ }
43
+
44
+ private init(script: string): Promise<void> {
45
+ if (!this.initPromise) {
46
+ this.initPromise = this.digest(script).then((sha1) => {
47
+ this.sha1 = sha1;
48
+ });
49
+ }
50
+ return this.initPromise;
51
+ }
52
+
53
+ /**
54
+ * Send an `EVAL_RO` command to redis.
55
+ */
56
+ public async evalRo(keys: string[], args: string[]): Promise<TResult> {
57
+ await this.init(this.script);
58
+
59
+ return await this.redis.evalRo(this.script, keys, args);
60
+ }
61
+
62
+ /**
63
+ * Calculates the sha1 hash of the script and then calls `EVALSHA_RO`.
64
+ */
65
+ public async evalshaRo(keys: string[], args: string[]): Promise<TResult> {
66
+ await this.init(this.script);
67
+
68
+ return await this.redis.evalshaRo(this.sha1, keys, args);
69
+ }
70
+
71
+ /**
72
+ * Optimistically try to run `EVALSHA_RO` first.
73
+ * If the script is not loaded in redis, it will fall back and try again with `EVAL_RO`.
74
+ *
75
+ * Following calls will be able to use the cached script
76
+ */
77
+ public async exec(keys: string[], args: string[]): Promise<TResult> {
78
+ await this.init(this.script);
79
+
80
+ const res = await this.redis.evalshaRo(this.sha1, keys, args).catch(async (error) => {
81
+ if (error instanceof Error && error.message.toLowerCase().includes("noscript")) {
82
+ return await this.redis.evalRo(this.script, keys, args);
83
+ }
84
+ throw error;
85
+ });
86
+ return res as TResult;
87
+ }
88
+
89
+ /**
90
+ * Compute the sha1 hash of the script and return its hex representation.
91
+ */
92
+ private async digest(s: string): Promise<string> {
93
+ const data = new TextEncoder().encode(s);
94
+ const hashBuffer = await subtle.digest("SHA-1", data);
95
+ const hashArray = [...new Uint8Array(hashBuffer)];
96
+ return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
97
+ }
98
+ }
@@ -0,0 +1,35 @@
1
+ export type CommandArgs<TCommand extends new (..._args: any) => any> =
2
+ ConstructorParameters<TCommand>[0];
3
+
4
+ export type Telemetry = {
5
+ /**
6
+ * Upstash-Telemetry-Sdk
7
+ * @example @upstash/redis@v1.1.1
8
+ */
9
+ sdk?: string;
10
+
11
+ /**
12
+ * Upstash-Telemetry-Platform
13
+ * @example cloudflare
14
+ */
15
+ platform?: string;
16
+
17
+ /**
18
+ * Upstash-Telemetry-Runtime
19
+ * @example node@v18
20
+ */
21
+ runtime?: string;
22
+ };
23
+
24
+ export type RedisOptions = {
25
+ /**
26
+ * Automatically try to deserialize the returned data from upstash using `JSON.deserialize`
27
+ *
28
+ * @default true
29
+ */
30
+ automaticDeserialization?: boolean;
31
+ latencyLogging?: boolean;
32
+ enableTelemetry?: boolean;
33
+ enableAutoPipelining?: boolean;
34
+ readYourWrites?: boolean;
35
+ };
@@ -0,0 +1,115 @@
1
+ import type { ScanResultWithType } from "./commands/scan";
2
+
3
+ /**
4
+ * JSON.parse that ignores one leading UTF-8 BOM (U+FEFF), as the base64 decoder
5
+ * (TextDecoder) used to strip it before deserialization. Callers keep the exact
6
+ * string (BOM included) when parsing fails.
7
+ */
8
+ export function parseJSON(value: string): unknown {
9
+ return JSON.parse(stripBOM(value) as string);
10
+ }
11
+
12
+ /**
13
+ * Non-string values (e.g. integer replies) are returned unchanged.
14
+ */
15
+ function stripBOM(value: unknown): unknown {
16
+ return typeof value === "string" && value.startsWith("\uFEFF") ? value.slice(1) : value;
17
+ }
18
+
19
+ function parseRecursive(obj: unknown): unknown {
20
+ const parsed = Array.isArray(obj)
21
+ ? obj.map((o) => {
22
+ try {
23
+ return parseRecursive(o);
24
+ } catch {
25
+ return o;
26
+ }
27
+ })
28
+ : parseJSON(obj as string);
29
+
30
+ /**
31
+ * Parsing very large numbers can result in MAX_SAFE_INTEGER
32
+ * overflow. In that case we return the number as string instead.
33
+ */
34
+ if (typeof parsed === "number" && parsed.toString() !== stripBOM(obj)) {
35
+ return obj;
36
+ }
37
+ return parsed;
38
+ }
39
+
40
+ export function parseResponse<TResult>(result: unknown): TResult {
41
+ try {
42
+ /**
43
+ * Try to parse the response if possible
44
+ */
45
+ return parseRecursive(result) as TResult;
46
+ } catch {
47
+ return result as TResult;
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Deserializes a scan result, excluding the cursor
53
+ * which can be string "0" or a big number string.
54
+ * Either way, we want it to stay as a string.
55
+ *
56
+ * @param result
57
+ */
58
+ export function deserializeScanResponse<TResult>(result: [string, ...any]): TResult {
59
+ return [result[0], ...parseResponse<any[]>(result.slice(1))] as TResult;
60
+ }
61
+
62
+ export function deserializeScanWithTypesResponse(result: [string, string[]]): ScanResultWithType {
63
+ const [cursor, keys] = result;
64
+
65
+ const parsedKeys: ScanResultWithType[1] = [];
66
+
67
+ for (let i = 0; i < keys.length; i += 2) {
68
+ parsedKeys.push({ key: keys[i], type: keys[i + 1] });
69
+ }
70
+
71
+ return [cursor, parsedKeys];
72
+ }
73
+
74
+ /**
75
+ * Merges multiple Records of headers into a single Record
76
+ * Later headers take precedence over earlier ones.
77
+ *
78
+ * @param headers - Array of header records to merge
79
+ * @returns A new Record containing all merged headers
80
+ *
81
+ * @example
82
+ * const defaultHeaders = { 'Content-Type': 'application/json' };
83
+ * const customHeaders = { 'Authorization': 'Bearer token' };
84
+ * const merged = mergeHeaders(defaultHeaders, customHeaders);
85
+ */
86
+ export function mergeHeaders(
87
+ ...headers: (Record<string, string> | undefined)[]
88
+ ): Record<string, string> {
89
+ const merged: Record<string, string> = {};
90
+
91
+ for (const header of headers) {
92
+ if (!header) continue;
93
+
94
+ for (const [key, value] of Object.entries(header)) {
95
+ if (value !== undefined && value !== null) {
96
+ merged[key] = value;
97
+ }
98
+ }
99
+ }
100
+
101
+ return merged;
102
+ }
103
+
104
+ /**
105
+ * Converts a kv-array `[k1, v1, k2, v2, ...]` into a Record of { k1: v1, k2: v2, ...}.
106
+ */
107
+ export function kvArrayToObject<T extends Record<string, unknown>>(v: unknown): T {
108
+ if (typeof v === "object" && v !== null && !Array.isArray(v)) return v as T;
109
+ if (!Array.isArray(v)) return {} as T;
110
+ const obj: T = {} as T;
111
+ for (let i = 0; i < v.length; i += 2) {
112
+ if (typeof v[i] === "string") obj[v[i] as keyof T] = v[i + 1] as T[keyof T];
113
+ }
114
+ return obj;
115
+ }
@@ -0,0 +1,162 @@
1
+ import type { HttpClientConfig, RequesterConfig } from "../pkg/http";
2
+ import { HttpClient } from "../pkg/http";
3
+ import * as core from "../pkg/redis";
4
+ import { VERSION } from "../version";
5
+
6
+ type Env = {
7
+ UPSTASH_DISABLE_TELEMETRY?: string;
8
+ };
9
+
10
+ export * as errors from "../pkg/error";
11
+ export type * from "../pkg/commands/types";
12
+
13
+ /**
14
+ * Connection credentials for upstash redis.
15
+ * Get them from https://console.upstash.com/redis/<uuid>
16
+ */
17
+ export type RedisConfigCloudflare = {
18
+ /**
19
+ * UPSTASH_REDIS_REST_URL
20
+ */
21
+ url: string | undefined;
22
+ /**
23
+ * UPSTASH_REDIS_REST_TOKEN
24
+ */
25
+ token: string | undefined;
26
+ /**
27
+ * The signal will allow aborting requests on the fly.
28
+ * For more check: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal
29
+ */
30
+ signal?: HttpClientConfig["signal"];
31
+ keepAlive?: boolean;
32
+
33
+ /**
34
+ * When this flag is enabled, any subsequent commands issued by this client are guaranteed to observe the effects of all earlier writes submitted by the same client.
35
+ */
36
+ readYourWrites?: boolean;
37
+ } & core.RedisOptions &
38
+ RequesterConfig &
39
+ Env;
40
+
41
+ /**
42
+ * Serverless redis client for upstash.
43
+ */
44
+ export class Redis extends core.Redis {
45
+ /**
46
+ * Create a new redis client
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const redis = new Redis({
51
+ * url: "<UPSTASH_REDIS_REST_URL>",
52
+ * token: "<UPSTASH_REDIS_REST_TOKEN>",
53
+ * });
54
+ * ```
55
+ */
56
+ constructor(config: RedisConfigCloudflare, env?: Env) {
57
+ if (!config.url) {
58
+ console.warn(
59
+ `[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`
60
+ );
61
+ } else if (config.url.startsWith(" ") || config.url.endsWith(" ") || /\r|\n/.test(config.url)) {
62
+ console.warn(
63
+ "[Upstash Redis] The redis url contains whitespace or newline, which can cause errors!"
64
+ );
65
+ }
66
+
67
+ if (!config.token) {
68
+ console.warn(
69
+ `[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`
70
+ );
71
+ } else if (
72
+ config.token.startsWith(" ") ||
73
+ config.token.endsWith(" ") ||
74
+ /\r|\n/.test(config.token!)
75
+ ) {
76
+ console.warn(
77
+ "[Upstash Redis] The redis token contains whitespace or newline, which can cause errors!"
78
+ );
79
+ }
80
+
81
+ const client = new HttpClient({
82
+ retry: config.retry,
83
+ baseUrl: config.url!,
84
+ headers: { authorization: `Bearer ${config.token}` },
85
+ responseEncoding: config.responseEncoding,
86
+ signal: config.signal,
87
+ keepAlive: config.keepAlive,
88
+ readYourWrites: config.readYourWrites,
89
+ });
90
+
91
+ super(client, {
92
+ enableTelemetry: config.enableTelemetry ?? !env?.UPSTASH_DISABLE_TELEMETRY,
93
+ automaticDeserialization: config.automaticDeserialization,
94
+ latencyLogging: config.latencyLogging,
95
+ enableAutoPipelining: config.enableAutoPipelining,
96
+ });
97
+ // This is only added of the user has not disabled telemetry
98
+ this.addTelemetry({
99
+ platform: "cloudflare",
100
+ sdk: `@upstash/redis@${VERSION}`,
101
+ });
102
+
103
+ if (this.enableAutoPipelining) {
104
+ return this.autoPipeline();
105
+ }
106
+ }
107
+
108
+ /*
109
+ * Create a new Upstash Redis instance from environment variables on cloudflare.
110
+ *
111
+ * This tries to load `UPSTASH_REDIS_REST_URL` and `UPSTASH_REDIS_REST_TOKEN` from
112
+ * the global namespace
113
+ *
114
+ * If you are using a module worker, please pass in the `env` object.
115
+ * ```ts
116
+ * const redis = Redis.fromEnv(env)
117
+ * ```
118
+ */
119
+ static fromEnv(
120
+ env?: {
121
+ UPSTASH_REDIS_REST_URL: string;
122
+ UPSTASH_REDIS_REST_TOKEN: string;
123
+ UPSTASH_DISABLE_TELEMETRY?: string;
124
+ },
125
+ opts?: Omit<RedisConfigCloudflare, "url" | "token">
126
+ ): Redis {
127
+ const url =
128
+ env?.UPSTASH_REDIS_REST_URL ??
129
+ // @ts-expect-error These will be defined by cloudflare
130
+ (typeof UPSTASH_REDIS_REST_URL === "string"
131
+ ? // @ts-expect-error These will be defined by cloudflare
132
+ UPSTASH_REDIS_REST_URL
133
+ : undefined);
134
+
135
+ const token =
136
+ env?.UPSTASH_REDIS_REST_TOKEN ??
137
+ // @ts-expect-error These will be defined by cloudflare
138
+ (typeof UPSTASH_REDIS_REST_TOKEN === "string"
139
+ ? // @ts-expect-error These will be defined by cloudflare
140
+ UPSTASH_REDIS_REST_TOKEN
141
+ : undefined);
142
+
143
+ const missing: string[] = [];
144
+ if (!url) missing.push("UPSTASH_REDIS_REST_URL");
145
+ if (!token) missing.push("UPSTASH_REDIS_REST_TOKEN");
146
+
147
+ if (missing.length > 0) {
148
+ // Both can be missing at once, so the wording and the number of
149
+ // `wrangler secret put` commands follow how many are actually missing.
150
+ const plural = missing.length > 1;
151
+ const names = missing.map((name) => `\`${name}\``).join(" and ");
152
+ const commands = missing.map((name) => `\`wrangler secret put ${name}\``).join(" and ");
153
+ console.warn(
154
+ `[Upstash Redis] Unable to find environment variable${plural ? "s" : ""}: ${names}. Please add ${plural ? "them" : "it"} via ${commands} and provide ${plural ? "them as arguments" : "it as an argument"} to the \`Redis.fromEnv\` function. To create a database instantly (no signup needed), run: curl -X POST https://upstash.com/start-redis`
155
+ );
156
+ }
157
+ return new Redis({ ...opts, url, token }, env);
158
+ }
159
+ }
160
+
161
+ export { type Requester, type UpstashRequest, type UpstashResponse } from "../pkg/http";
162
+ export { type Pipeline } from "../pkg/pipeline";
@@ -0,0 +1,105 @@
1
+ import type { RequesterConfig } from "../pkg/http";
2
+
3
+ import { HttpClient } from "../pkg/http";
4
+ import * as core from "../pkg/redis";
5
+ import { VERSION } from "../version";
6
+
7
+ export * as errors from "../pkg/error";
8
+ export type * from "../pkg/commands/types";
9
+
10
+ /**
11
+ * Connection credentials for upstash redis.
12
+ * Get them from https://console.upstash.com/redis/<uuid>
13
+ */
14
+ export type RedisConfigFastly = {
15
+ /**
16
+ * UPSTASH_REDIS_REST_URL
17
+ */
18
+ url: string | undefined;
19
+ /**
20
+ * UPSTASH_REDIS_REST_TOKEN
21
+ */
22
+ token: string | undefined;
23
+ /**
24
+ * A Request can be forwarded to any backend defined on your service. Backends
25
+ * can be created via the Fastly CLI, API, or web interface, and are
26
+ * referenced by name.
27
+ */
28
+ backend: string;
29
+ keepAlive?: boolean;
30
+
31
+ /**
32
+ * When this flag is enabled, any subsequent commands issued by this client are guaranteed to observe the effects of all earlier writes submitted by the same client.
33
+ */
34
+ readYourWrites?: boolean;
35
+ } & core.RedisOptions &
36
+ RequesterConfig;
37
+
38
+ /**
39
+ * Serverless redis client for upstash.
40
+ */
41
+ export class Redis extends core.Redis {
42
+ /**
43
+ * Create a new redis client
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * const redis = new Redis({
48
+ * url: "<UPSTASH_REDIS_REST_URL>",
49
+ * token: "<UPSTASH_REDIS_REST_TOKEN>",
50
+ * backend: "upstash-db",
51
+ * });
52
+ * ```
53
+ */
54
+ constructor(config: RedisConfigFastly) {
55
+ if (!config.url) {
56
+ console.warn(
57
+ `[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`
58
+ );
59
+ } else if (config.url.startsWith(" ") || config.url.endsWith(" ") || /\r|\n/.test(config.url)) {
60
+ console.warn(
61
+ "[Upstash Redis] The redis url contains whitespace or newline, which can cause errors!"
62
+ );
63
+ }
64
+
65
+ if (!config.token) {
66
+ console.warn(
67
+ `[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`
68
+ );
69
+ } else if (
70
+ config.token.startsWith(" ") ||
71
+ config.token.endsWith(" ") ||
72
+ /\r|\n/.test(config.token)
73
+ ) {
74
+ console.warn(
75
+ "[Upstash Redis] The redis token contains whitespace or newline, which can cause errors!"
76
+ );
77
+ }
78
+
79
+ const client = new HttpClient({
80
+ baseUrl: config.url!,
81
+ retry: config.retry,
82
+ headers: { authorization: `Bearer ${config.token}` },
83
+ options: { backend: config.backend },
84
+ responseEncoding: config.responseEncoding,
85
+ keepAlive: config.keepAlive,
86
+ readYourWrites: config.readYourWrites,
87
+ });
88
+
89
+ super(client, {
90
+ automaticDeserialization: config.automaticDeserialization,
91
+ enableAutoPipelining: config.enableAutoPipelining,
92
+ });
93
+ this.addTelemetry({
94
+ sdk: `@upstash/redis@${VERSION}`,
95
+ platform: "fastly",
96
+ });
97
+
98
+ if (this.enableAutoPipelining) {
99
+ return this.autoPipeline();
100
+ }
101
+ }
102
+ }
103
+
104
+ export { type Requester, type UpstashRequest, type UpstashResponse } from "../pkg/http";
105
+ export { type Pipeline } from "../pkg/pipeline";