@upstash/redis 0.0.0-ci.fcd85d60 → 0.0.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 (165) hide show
  1. package/README.md +44 -280
  2. package/esm/deps/deno.land/x/base64@v0.2.1/base.js +100 -0
  3. package/esm/deps/deno.land/x/base64@v0.2.1/base64url.js +9 -0
  4. package/esm/deps/deno.land/x/sha1@v1.0.3/deps.js +1 -0
  5. package/esm/deps/deno.land/x/sha1@v1.0.3/mod.js +191 -0
  6. package/esm/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +50 -0
  7. package/esm/pkg/commands/command.js +12 -3
  8. package/esm/pkg/commands/getdel.js +9 -0
  9. package/esm/pkg/commands/hgetall.js +0 -4
  10. package/esm/pkg/commands/hrandfield.js +39 -0
  11. package/esm/pkg/commands/json_arrappend.js +9 -0
  12. package/esm/pkg/commands/json_arrindex.js +9 -0
  13. package/esm/pkg/commands/json_arrinsert.js +9 -0
  14. package/esm/pkg/commands/json_arrlen.js +9 -0
  15. package/esm/pkg/commands/json_arrpop.js +9 -0
  16. package/esm/pkg/commands/json_arrtrim.js +12 -0
  17. package/esm/pkg/commands/json_clear.js +9 -0
  18. package/esm/pkg/commands/json_del.js +9 -0
  19. package/esm/pkg/commands/json_forget.js +9 -0
  20. package/esm/pkg/commands/json_get.js +30 -0
  21. package/esm/pkg/commands/json_mget.js +9 -0
  22. package/esm/pkg/commands/json_numincrby.js +9 -0
  23. package/esm/pkg/commands/json_nummultby.js +9 -0
  24. package/esm/pkg/commands/json_objkeys.js +9 -0
  25. package/esm/pkg/commands/json_objlen.js +9 -0
  26. package/esm/pkg/commands/json_resp.js +9 -0
  27. package/esm/pkg/commands/json_set.js +18 -0
  28. package/esm/pkg/commands/json_strappend.js +9 -0
  29. package/esm/pkg/commands/json_strlen.js +9 -0
  30. package/esm/pkg/commands/json_toggle.js +9 -0
  31. package/esm/pkg/commands/json_type.js +9 -0
  32. package/esm/pkg/commands/lmove.js +9 -0
  33. package/esm/pkg/commands/lpos.js +19 -0
  34. package/esm/pkg/commands/mod.js +27 -0
  35. package/esm/pkg/commands/scan.js +3 -0
  36. package/esm/pkg/commands/sdiffstore.js +1 -1
  37. package/esm/pkg/commands/set.js +16 -4
  38. package/esm/pkg/commands/smismember.js +9 -0
  39. package/esm/pkg/commands/xadd.js +26 -0
  40. package/esm/pkg/commands/zdiffstore.js +9 -0
  41. package/esm/pkg/commands/zmscore.js +10 -0
  42. package/esm/pkg/commands/zrange.js +6 -0
  43. package/esm/pkg/http.js +134 -9
  44. package/esm/pkg/pipeline.js +180 -12
  45. package/esm/pkg/redis.js +227 -2
  46. package/esm/pkg/script.js +77 -0
  47. package/esm/platforms/cloudflare.js +14 -26
  48. package/esm/platforms/fastly.js +10 -25
  49. package/esm/platforms/node_with_fetch.js +30 -26
  50. package/esm/platforms/nodejs.js +28 -26
  51. package/esm/version.js +1 -0
  52. package/package.json +53 -58
  53. package/script/deps/deno.land/x/base64@v0.2.1/base.js +104 -0
  54. package/script/deps/deno.land/x/base64@v0.2.1/base64url.js +13 -0
  55. package/script/deps/deno.land/x/sha1@v1.0.3/deps.js +6 -0
  56. package/script/deps/deno.land/x/sha1@v1.0.3/mod.js +196 -0
  57. package/script/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +55 -0
  58. package/script/pkg/commands/command.js +12 -3
  59. package/script/pkg/commands/getdel.js +13 -0
  60. package/script/pkg/commands/hgetall.js +0 -4
  61. package/script/pkg/commands/hrandfield.js +43 -0
  62. package/script/pkg/commands/json_arrappend.js +13 -0
  63. package/script/pkg/commands/json_arrindex.js +13 -0
  64. package/script/pkg/commands/json_arrinsert.js +13 -0
  65. package/script/pkg/commands/json_arrlen.js +13 -0
  66. package/script/pkg/commands/json_arrpop.js +13 -0
  67. package/script/pkg/commands/json_arrtrim.js +16 -0
  68. package/script/pkg/commands/json_clear.js +13 -0
  69. package/script/pkg/commands/json_del.js +13 -0
  70. package/script/pkg/commands/json_forget.js +13 -0
  71. package/script/pkg/commands/json_get.js +34 -0
  72. package/script/pkg/commands/json_mget.js +13 -0
  73. package/script/pkg/commands/json_numincrby.js +13 -0
  74. package/script/pkg/commands/json_nummultby.js +13 -0
  75. package/script/pkg/commands/json_objkeys.js +13 -0
  76. package/script/pkg/commands/json_objlen.js +13 -0
  77. package/script/pkg/commands/json_resp.js +13 -0
  78. package/script/pkg/commands/json_set.js +22 -0
  79. package/script/pkg/commands/json_strappend.js +13 -0
  80. package/script/pkg/commands/json_strlen.js +13 -0
  81. package/script/pkg/commands/json_toggle.js +13 -0
  82. package/script/pkg/commands/json_type.js +13 -0
  83. package/script/pkg/commands/lmove.js +13 -0
  84. package/script/pkg/commands/lpos.js +23 -0
  85. package/script/pkg/commands/mod.js +27 -0
  86. package/script/pkg/commands/scan.js +3 -0
  87. package/script/pkg/commands/sdiffstore.js +1 -1
  88. package/script/pkg/commands/set.js +16 -4
  89. package/script/pkg/commands/smismember.js +13 -0
  90. package/script/pkg/commands/xadd.js +30 -0
  91. package/script/pkg/commands/zdiffstore.js +13 -0
  92. package/script/pkg/commands/zmscore.js +14 -0
  93. package/script/pkg/commands/zrange.js +6 -0
  94. package/script/pkg/http.js +134 -9
  95. package/script/pkg/pipeline.js +179 -11
  96. package/script/pkg/redis.js +226 -1
  97. package/script/pkg/script.js +81 -0
  98. package/script/platforms/cloudflare.js +14 -26
  99. package/script/platforms/fastly.js +10 -25
  100. package/script/platforms/node_with_fetch.js +30 -26
  101. package/script/platforms/nodejs.js +28 -26
  102. package/script/version.js +4 -0
  103. package/types/deps/deno.land/x/base64@v0.2.1/base.d.ts +5 -0
  104. package/types/deps/deno.land/x/base64@v0.2.1/base64url.d.ts +1 -0
  105. package/types/deps/deno.land/x/sha1@v1.0.3/deps.d.ts +1 -0
  106. package/types/deps/deno.land/x/sha1@v1.0.3/mod.d.ts +26 -0
  107. package/types/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.d.ts +3 -0
  108. package/types/pkg/commands/bitop.d.ts +0 -1
  109. package/types/pkg/commands/bitpos.d.ts +1 -1
  110. package/types/pkg/commands/command.d.ts +5 -5
  111. package/types/pkg/commands/getdel.d.ts +7 -0
  112. package/types/pkg/commands/hdel.d.ts +1 -1
  113. package/types/pkg/commands/hrandfield.d.ts +9 -0
  114. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  115. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  116. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  117. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  118. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  119. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  120. package/types/pkg/commands/json_clear.d.ts +7 -0
  121. package/types/pkg/commands/json_del.d.ts +7 -0
  122. package/types/pkg/commands/json_forget.d.ts +7 -0
  123. package/types/pkg/commands/json_get.d.ts +15 -0
  124. package/types/pkg/commands/json_mget.d.ts +7 -0
  125. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  126. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  127. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  128. package/types/pkg/commands/json_objlen.d.ts +7 -0
  129. package/types/pkg/commands/json_resp.d.ts +7 -0
  130. package/types/pkg/commands/json_set.d.ts +18 -0
  131. package/types/pkg/commands/json_strappend.d.ts +7 -0
  132. package/types/pkg/commands/json_strlen.d.ts +7 -0
  133. package/types/pkg/commands/json_toggle.d.ts +7 -0
  134. package/types/pkg/commands/json_type.d.ts +7 -0
  135. package/types/pkg/commands/lmove.d.ts +12 -0
  136. package/types/pkg/commands/lpop.d.ts +1 -1
  137. package/types/pkg/commands/lpos.d.ts +15 -0
  138. package/types/pkg/commands/mget.d.ts +1 -1
  139. package/types/pkg/commands/mod.d.ts +27 -0
  140. package/types/pkg/commands/rpop.d.ts +2 -2
  141. package/types/pkg/commands/scan.d.ts +2 -1
  142. package/types/pkg/commands/script_flush.d.ts +1 -1
  143. package/types/pkg/commands/sdiffstore.d.ts +1 -1
  144. package/types/pkg/commands/set.d.ts +31 -2
  145. package/types/pkg/commands/smembers.d.ts +2 -2
  146. package/types/pkg/commands/smismember.d.ts +7 -0
  147. package/types/pkg/commands/spop.d.ts +2 -2
  148. package/types/pkg/commands/type.d.ts +1 -1
  149. package/types/pkg/commands/xadd.d.ts +31 -0
  150. package/types/pkg/commands/zadd.d.ts +4 -4
  151. package/types/pkg/commands/zdiffstore.d.ts +7 -0
  152. package/types/pkg/commands/zinterstore.d.ts +1 -1
  153. package/types/pkg/commands/zmscore.d.ts +7 -0
  154. package/types/pkg/commands/zrange.d.ts +8 -1
  155. package/types/pkg/commands/zunionstore.d.ts +1 -1
  156. package/types/pkg/http.d.ts +73 -8
  157. package/types/pkg/pipeline.d.ts +262 -124
  158. package/types/pkg/redis.d.ts +162 -19
  159. package/types/pkg/script.d.ts +42 -0
  160. package/types/pkg/types.d.ts +27 -1
  161. package/types/platforms/cloudflare.d.ts +9 -4
  162. package/types/platforms/fastly.d.ts +3 -3
  163. package/types/platforms/node_with_fetch.d.ts +3 -3
  164. package/types/platforms/nodejs.d.ts +19 -3
  165. package/types/version.d.ts +1 -0
package/esm/pkg/redis.js CHANGED
@@ -1,5 +1,8 @@
1
- import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LPopCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionStoreCommand, } from "./commands/mod.js";
1
+ import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetDelCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HRandFieldCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, JsonArrAppendCommand, JsonArrIndexCommand, JsonArrInsertCommand, JsonArrLenCommand, JsonArrPopCommand, JsonArrTrimCommand, JsonClearCommand, JsonDelCommand, JsonForgetCommand, JsonGetCommand, JsonMGetCommand, JsonNumIncrByCommand, JsonNumMultByCommand, JsonObjKeysCommand, JsonObjLenCommand, JsonRespCommand, JsonSetCommand, JsonStrAppendCommand, JsonStrLenCommand, JsonToggleCommand, JsonTypeCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LMoveCommand, LPopCommand, LPosCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMIsMemberCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionStoreCommand, } from "./commands/mod.js";
2
2
  import { Pipeline } from "./pipeline.js";
3
+ import { Script } from "./script.js";
4
+ import { ZMScoreCommand } from "./commands/zmscore.js";
5
+ import { ZDiffStoreCommand } from "./commands/zdiffstore.js";
3
6
  /**
4
7
  * Serverless redis client for upstash.
5
8
  */
@@ -28,6 +31,45 @@ export class Redis {
28
31
  writable: true,
29
32
  value: void 0
30
33
  });
34
+ Object.defineProperty(this, "enableTelemetry", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: void 0
39
+ });
40
+ /**
41
+ * Wrap a new middleware around the HTTP client.
42
+ */
43
+ Object.defineProperty(this, "use", {
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true,
47
+ value: (middleware) => {
48
+ const makeRequest = this.client.request.bind(this.client);
49
+ this.client.request = (req) => middleware(req, makeRequest);
50
+ }
51
+ });
52
+ /**
53
+ * Technically this is not private, we can hide it from intellisense by doing this
54
+ */
55
+ Object.defineProperty(this, "addTelemetry", {
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true,
59
+ value: (telemetry) => {
60
+ if (!this.enableTelemetry) {
61
+ return;
62
+ }
63
+ try {
64
+ // @ts-ignore - The `Requester` interface does not know about this method but it will be there
65
+ // as long as the user uses the standard HttpClient
66
+ this.client.mergeTelemetry(telemetry);
67
+ }
68
+ catch {
69
+ // ignore
70
+ }
71
+ }
72
+ });
31
73
  /**
32
74
  * Create a new pipeline that allows you to send requests in bulk.
33
75
  *
@@ -37,7 +79,30 @@ export class Redis {
37
79
  enumerable: true,
38
80
  configurable: true,
39
81
  writable: true,
40
- value: () => new Pipeline(this.client, this.opts)
82
+ value: () => new Pipeline({
83
+ client: this.client,
84
+ commandOptions: this.opts,
85
+ multiExec: false,
86
+ })
87
+ });
88
+ /**
89
+ * Create a new transaction to allow executing multiple steps atomically.
90
+ *
91
+ * All the commands in a transaction are serialized and executed sequentially. A request sent by
92
+ * another client will never be served in the middle of the execution of a Redis Transaction. This
93
+ * guarantees that the commands are executed as a single isolated operation.
94
+ *
95
+ * @see {@link Pipeline}
96
+ */
97
+ Object.defineProperty(this, "multi", {
98
+ enumerable: true,
99
+ configurable: true,
100
+ writable: true,
101
+ value: () => new Pipeline({
102
+ client: this.client,
103
+ commandOptions: this.opts,
104
+ multiExec: true,
105
+ })
41
106
  });
42
107
  /**
43
108
  * @see https://redis.io/commands/append
@@ -201,6 +266,15 @@ export class Redis {
201
266
  writable: true,
202
267
  value: (...args) => new GetBitCommand(args, this.opts).exec(this.client)
203
268
  });
269
+ /**
270
+ * @see https://redis.io/commands/getdel
271
+ */
272
+ Object.defineProperty(this, "getdel", {
273
+ enumerable: true,
274
+ configurable: true,
275
+ writable: true,
276
+ value: (...args) => new GetDelCommand(args, this.opts).exec(this.client)
277
+ });
204
278
  /**
205
279
  * @see https://redis.io/commands/getrange
206
280
  */
@@ -309,6 +383,16 @@ export class Redis {
309
383
  writable: true,
310
384
  value: (key, kv) => new HMSetCommand([key, kv], this.opts).exec(this.client)
311
385
  });
386
+ /**
387
+ * @see https://redis.io/commands/hrandfield
388
+ */
389
+ Object.defineProperty(this, "hrandfield", {
390
+ enumerable: true,
391
+ configurable: true,
392
+ writable: true,
393
+ value: (key, count, withValues) => new HRandFieldCommand([key, count, withValues], this.opts)
394
+ .exec(this.client)
395
+ });
312
396
  /**
313
397
  * @see https://redis.io/commands/hscan
314
398
  */
@@ -417,6 +501,15 @@ export class Redis {
417
501
  writable: true,
418
502
  value: (...args) => new LLenCommand(args, this.opts).exec(this.client)
419
503
  });
504
+ /**
505
+ * @see https://redis.io/commands/lmove
506
+ */
507
+ Object.defineProperty(this, "lmove", {
508
+ enumerable: true,
509
+ configurable: true,
510
+ writable: true,
511
+ value: (...args) => new LMoveCommand(args, this.opts).exec(this.client)
512
+ });
420
513
  /**
421
514
  * @see https://redis.io/commands/lpop
422
515
  */
@@ -426,6 +519,15 @@ export class Redis {
426
519
  writable: true,
427
520
  value: (...args) => new LPopCommand(args, this.opts).exec(this.client)
428
521
  });
522
+ /**
523
+ * @see https://redis.io/commands/lpos
524
+ */
525
+ Object.defineProperty(this, "lpos", {
526
+ enumerable: true,
527
+ configurable: true,
528
+ writable: true,
529
+ value: (...args) => new LPosCommand(args, this.opts).exec(this.client)
530
+ });
429
531
  /**
430
532
  * @see https://redis.io/commands/lpush
431
533
  */
@@ -768,6 +870,15 @@ export class Redis {
768
870
  writable: true,
769
871
  value: (key, member) => new SIsMemberCommand([key, member], this.opts).exec(this.client)
770
872
  });
873
+ /**
874
+ * @see https://redis.io/commands/smismember
875
+ */
876
+ Object.defineProperty(this, "smismember", {
877
+ enumerable: true,
878
+ configurable: true,
879
+ writable: true,
880
+ value: (key, members) => new SMIsMemberCommand([key, members], this.opts).exec(this.client)
881
+ });
771
882
  /**
772
883
  * @see https://redis.io/commands/smembers
773
884
  */
@@ -894,6 +1005,10 @@ export class Redis {
894
1005
  writable: true,
895
1006
  value: (...args) => new UnlinkCommand(args, this.opts).exec(this.client)
896
1007
  });
1008
+ // /**
1009
+ // * @see https://redis.io/commands/xadd
1010
+ // */
1011
+ // xadd =
897
1012
  /**
898
1013
  * @see https://redis.io/commands/zadd
899
1014
  */
@@ -926,6 +1041,15 @@ export class Redis {
926
1041
  writable: true,
927
1042
  value: (...args) => new ZCountCommand(args, this.opts).exec(this.client)
928
1043
  });
1044
+ /**
1045
+ * @see https://redis.io/commands/zdiffstore
1046
+ */
1047
+ Object.defineProperty(this, "zdiffstore", {
1048
+ enumerable: true,
1049
+ configurable: true,
1050
+ writable: true,
1051
+ value: (...args) => new ZDiffStoreCommand(args, this.opts).exec(this.client)
1052
+ });
929
1053
  /**
930
1054
  * @see https://redis.io/commands/zincrby
931
1055
  */
@@ -953,6 +1077,15 @@ export class Redis {
953
1077
  writable: true,
954
1078
  value: (...args) => new ZLexCountCommand(args, this.opts).exec(this.client)
955
1079
  });
1080
+ /**
1081
+ * @see https://redis.io/commands/zmscore
1082
+ */
1083
+ Object.defineProperty(this, "zmscore", {
1084
+ enumerable: true,
1085
+ configurable: true,
1086
+ writable: true,
1087
+ value: (...args) => new ZMScoreCommand(args, this.opts).exec(this.client)
1088
+ });
956
1089
  /**
957
1090
  * @see https://redis.io/commands/zpopmax
958
1091
  */
@@ -1063,5 +1196,97 @@ export class Redis {
1063
1196
  });
1064
1197
  this.client = client;
1065
1198
  this.opts = opts;
1199
+ this.enableTelemetry = opts?.enableTelemetry ?? true;
1200
+ }
1201
+ get json() {
1202
+ return {
1203
+ /**
1204
+ * @see https://redis.io/commands/json.arrappend
1205
+ */
1206
+ arrappend: (...args) => new JsonArrAppendCommand(args, this.opts).exec(this.client),
1207
+ /**
1208
+ * @see https://redis.io/commands/json.arrindex
1209
+ */
1210
+ arrindex: (...args) => new JsonArrIndexCommand(args, this.opts).exec(this.client),
1211
+ /**
1212
+ * @see https://redis.io/commands/json.arrinsert
1213
+ */
1214
+ arrinsert: (...args) => new JsonArrInsertCommand(args, this.opts).exec(this.client),
1215
+ /**
1216
+ * @see https://redis.io/commands/json.arrlen
1217
+ */
1218
+ arrlen: (...args) => new JsonArrLenCommand(args, this.opts).exec(this.client),
1219
+ /**
1220
+ * @see https://redis.io/commands/json.arrpop
1221
+ */
1222
+ arrpop: (...args) => new JsonArrPopCommand(args, this.opts).exec(this.client),
1223
+ /**
1224
+ * @see https://redis.io/commands/json.arrtrim
1225
+ */
1226
+ arrtrim: (...args) => new JsonArrTrimCommand(args, this.opts).exec(this.client),
1227
+ /**
1228
+ * @see https://redis.io/commands/json.clear
1229
+ */
1230
+ clear: (...args) => new JsonClearCommand(args, this.opts).exec(this.client),
1231
+ /**
1232
+ * @see https://redis.io/commands/json.del
1233
+ */
1234
+ del: (...args) => new JsonDelCommand(args, this.opts).exec(this.client),
1235
+ /**
1236
+ * @see https://redis.io/commands/json.forget
1237
+ */
1238
+ forget: (...args) => new JsonForgetCommand(args, this.opts).exec(this.client),
1239
+ /**
1240
+ * @see https://redis.io/commands/json.get
1241
+ */
1242
+ get: (...args) => new JsonGetCommand(args, this.opts).exec(this.client),
1243
+ /**
1244
+ * @see https://redis.io/commands/json.mget
1245
+ */
1246
+ mget: (...args) => new JsonMGetCommand(args, this.opts).exec(this.client),
1247
+ /**
1248
+ * @see https://redis.io/commands/json.numincrby
1249
+ */
1250
+ numincrby: (...args) => new JsonNumIncrByCommand(args, this.opts).exec(this.client),
1251
+ /**
1252
+ * @see https://redis.io/commands/json.nummultby
1253
+ */
1254
+ nummultby: (...args) => new JsonNumMultByCommand(args, this.opts).exec(this.client),
1255
+ /**
1256
+ * @see https://redis.io/commands/json.objkeys
1257
+ */
1258
+ objkeys: (...args) => new JsonObjKeysCommand(args, this.opts).exec(this.client),
1259
+ /**
1260
+ * @see https://redis.io/commands/json.objlen
1261
+ */
1262
+ objlen: (...args) => new JsonObjLenCommand(args, this.opts).exec(this.client),
1263
+ /**
1264
+ * @see https://redis.io/commands/json.resp
1265
+ */
1266
+ resp: (...args) => new JsonRespCommand(args, this.opts).exec(this.client),
1267
+ /**
1268
+ * @see https://redis.io/commands/json.set
1269
+ */
1270
+ set: (...args) => new JsonSetCommand(args, this.opts).exec(this.client),
1271
+ /**
1272
+ * @see https://redis.io/commands/json.strappend
1273
+ */
1274
+ strappend: (...args) => new JsonStrAppendCommand(args, this.opts).exec(this.client),
1275
+ /**
1276
+ * @see https://redis.io/commands/json.strlen
1277
+ */
1278
+ strlen: (...args) => new JsonStrLenCommand(args, this.opts).exec(this.client),
1279
+ /**
1280
+ * @see https://redis.io/commands/json.toggle
1281
+ */
1282
+ toggle: (...args) => new JsonToggleCommand(args, this.opts).exec(this.client),
1283
+ /**
1284
+ * @see https://redis.io/commands/json.type
1285
+ */
1286
+ type: (...args) => new JsonTypeCommand(args, this.opts).exec(this.client),
1287
+ };
1288
+ }
1289
+ createScript(script) {
1290
+ return new Script(this, script);
1066
1291
  }
1067
1292
  }
@@ -0,0 +1,77 @@
1
+ import { sha1 as digest } from "../deps/deno.land/x/sha1@v1.0.3/mod.js";
2
+ /**
3
+ * Creates a new script.
4
+ *
5
+ * Scripts offer the ability to optimistically try to execute a script without having to send the
6
+ * entire script to the server. If the script is loaded on the server, it tries again by sending
7
+ * the entire script. Afterwards, the script is cached on the server.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const redis = new Redis({...})
12
+ *
13
+ * const script = redis.createScript<string>("return ARGV[1];")
14
+ * const arg1 = await script.eval([], ["Hello World"])
15
+ * assertEquals(arg1, "Hello World")
16
+ * ```
17
+ */
18
+ export class Script {
19
+ constructor(redis, script) {
20
+ Object.defineProperty(this, "script", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: void 0
25
+ });
26
+ Object.defineProperty(this, "sha1", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: void 0
31
+ });
32
+ Object.defineProperty(this, "redis", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: void 0
37
+ });
38
+ this.redis = redis;
39
+ this.sha1 = this.digest(script);
40
+ this.script = script;
41
+ }
42
+ /**
43
+ * Send an `EVAL` command to redis.
44
+ */
45
+ async eval(keys, args) {
46
+ return await this.redis.eval(this.script, keys, args);
47
+ }
48
+ /**
49
+ * Calculates the sha1 hash of the script and then calls `EVALSHA`.
50
+ */
51
+ async evalsha(keys, args) {
52
+ return await this.redis.evalsha(this.sha1, keys, args);
53
+ }
54
+ /**
55
+ * Optimistically try to run `EVALSHA` first.
56
+ * If the script is not loaded in redis, it will fall back and try again with `EVAL`.
57
+ *
58
+ * Following calls will be able to use the cached script
59
+ */
60
+ async exec(keys, args) {
61
+ const res = await this.redis.evalsha(this.sha1, keys, args).catch(async (err) => {
62
+ if (err instanceof Error &&
63
+ err.message.toLowerCase().includes("noscript")) {
64
+ return await this.redis.eval(this.script, keys, args);
65
+ }
66
+ throw err;
67
+ });
68
+ return res;
69
+ }
70
+ /**
71
+ * Compute the sha1 hash of the script and return its hex representation.
72
+ */
73
+ digest(s) {
74
+ const hash = digest(s, "utf8", "hex");
75
+ return typeof hash === "string" ? hash : new TextDecoder().decode(hash);
76
+ }
77
+ }
@@ -1,5 +1,6 @@
1
1
  import * as core from "../pkg/redis.js";
2
- import { UpstashError } from "../pkg/error.js";
2
+ import { HttpClient } from "../pkg/http.js";
3
+ import { VERSION } from "../version.js";
3
4
  /**
4
5
  * Serverless redis client for upstash.
5
6
  */
@@ -15,7 +16,7 @@ export class Redis extends core.Redis {
15
16
  * });
16
17
  * ```
17
18
  */
18
- constructor(config) {
19
+ constructor(config, env) {
19
20
  if (config.url.startsWith(" ") ||
20
21
  config.url.endsWith(" ") ||
21
22
  /\r|\n/.test(config.url)) {
@@ -26,13 +27,21 @@ export class Redis extends core.Redis {
26
27
  /\r|\n/.test(config.token)) {
27
28
  console.warn("The redis token contains whitespace or newline, which can cause errors!");
28
29
  }
29
- const client = defaultRequester({
30
+ const client = new HttpClient({
31
+ retry: config.retry,
30
32
  baseUrl: config.url,
31
33
  headers: { authorization: `Bearer ${config.token}` },
34
+ responseEncoding: config.responseEncoding,
32
35
  });
33
36
  super(client, {
37
+ enableTelemetry: !env?.UPSTASH_DISABLE_TELEMETRY,
34
38
  automaticDeserialization: config.automaticDeserialization,
35
39
  });
40
+ // This is only added of the user has not disabled telemetry
41
+ this.addTelemetry({
42
+ platform: "cloudflare",
43
+ sdk: `@upstash/redis@${VERSION}`,
44
+ });
36
45
  }
37
46
  /*
38
47
  * Create a new Upstash Redis instance from environment variables on cloudflare.
@@ -44,9 +53,8 @@ export class Redis extends core.Redis {
44
53
  * ```ts
45
54
  * const redis = Redis.fromEnv(env)
46
55
  * ```
47
- *
48
56
  */
49
- static fromEnv(env) {
57
+ static fromEnv(env, opts) {
50
58
  // @ts-ignore These will be defined by cloudflare
51
59
  const url = env?.UPSTASH_REDIS_REST_URL ?? UPSTASH_REDIS_REST_URL;
52
60
  // @ts-ignore These will be defined by cloudflare
@@ -57,26 +65,6 @@ export class Redis extends core.Redis {
57
65
  if (!token) {
58
66
  throw new Error("Unable to find environment variable: `UPSTASH_REDIS_REST_TOKEN`. Please add it via `wrangler secret put UPSTASH_REDIS_REST_TOKEN`");
59
67
  }
60
- return new Redis({ url, token });
68
+ return new Redis({ ...opts, url, token }, env);
61
69
  }
62
70
  }
63
- function defaultRequester(config) {
64
- return {
65
- request: async function (req) {
66
- if (!req.path) {
67
- req.path = [];
68
- }
69
- const res = await fetch([config.baseUrl, ...req.path].join("/"), {
70
- method: "POST",
71
- headers: { "Content-Type": "application/json", ...config.headers },
72
- body: JSON.stringify(req.body),
73
- keepalive: true,
74
- });
75
- const body = (await res.json());
76
- if (!res.ok) {
77
- throw new UpstashError(body.error);
78
- }
79
- return body;
80
- },
81
- };
82
- }
@@ -1,5 +1,6 @@
1
1
  import * as core from "../pkg/redis.js";
2
- import { UpstashError } from "../pkg/error.js";
2
+ import { HttpClient } from "../pkg/http.js";
3
+ import { VERSION } from "../version.js";
3
4
  /**
4
5
  * Serverless redis client for upstash.
5
6
  */
@@ -27,35 +28,19 @@ export class Redis extends core.Redis {
27
28
  /\r|\n/.test(config.token)) {
28
29
  console.warn("The redis token contains whitespace or newline, which can cause errors!");
29
30
  }
30
- const client = defaultRequester({
31
+ const client = new HttpClient({
31
32
  baseUrl: config.url,
33
+ retry: config.retry,
32
34
  headers: { authorization: `Bearer ${config.token}` },
33
- backend: config.backend,
35
+ options: { backend: config.backend },
36
+ responseEncoding: config.responseEncoding,
34
37
  });
35
38
  super(client, {
36
39
  automaticDeserialization: config.automaticDeserialization,
37
40
  });
41
+ this.addTelemetry({
42
+ sdk: `@upstash/redis@${VERSION}`,
43
+ platform: "fastly",
44
+ });
38
45
  }
39
46
  }
40
- function defaultRequester(config) {
41
- return {
42
- request: async function (req) {
43
- if (!req.path) {
44
- req.path = [];
45
- }
46
- const res = await fetch([config.baseUrl, ...req.path].join("/"), {
47
- method: "POST",
48
- headers: { "Content-Type": "application/json", ...config.headers },
49
- body: JSON.stringify(req.body),
50
- keepalive: true,
51
- // @ts-expect-error fastly requires `backend`
52
- backend: config.backend,
53
- });
54
- const body = (await res.json());
55
- if (!res.ok) {
56
- throw new UpstashError(body.error);
57
- }
58
- return body;
59
- },
60
- };
61
- }
@@ -1,7 +1,21 @@
1
1
  // deno-lint-ignore-file
2
2
  import * as core from "../pkg/redis.js";
3
- import { UpstashError } from "../pkg/error.js";
3
+ import { HttpClient, } from "../pkg/http.js";
4
+ import { VERSION } from "../version.js";
4
5
  import "isomorphic-fetch";
6
+ // @ts-ignore Deno can't compile
7
+ // import https from "https";
8
+ // @ts-ignore Deno can't compile
9
+ // import http from "http";
10
+ // import "isomorphic-fetch";
11
+ /**
12
+ * Workaround for nodejs 14, where atob is not included in the standardlib
13
+ */
14
+ if (typeof atob === "undefined") {
15
+ global.atob = function (b64) {
16
+ return Buffer.from(b64, "base64").toString("utf-8");
17
+ };
18
+ }
5
19
  /**
6
20
  * Serverless redis client for upstash.
7
21
  */
@@ -21,13 +35,25 @@ export class Redis extends core.Redis {
21
35
  /\r|\n/.test(configOrRequester.token)) {
22
36
  console.warn("The redis token contains whitespace or newline, which can cause errors!");
23
37
  }
24
- const client = defaultRequester({
38
+ const client = new HttpClient({
25
39
  baseUrl: configOrRequester.url,
40
+ retry: configOrRequester.retry,
26
41
  headers: { authorization: `Bearer ${configOrRequester.token}` },
27
- // agent: configOrRequester.agent,
42
+ // agent: configOrRequester.agent,
43
+ responseEncoding: configOrRequester.responseEncoding,
28
44
  });
29
45
  super(client, {
30
46
  automaticDeserialization: configOrRequester.automaticDeserialization,
47
+ enableTelemetry: !process.env.UPSTASH_DISABLE_TELEMETRY,
48
+ });
49
+ this.addTelemetry({
50
+ runtime: `node@${process.version}`,
51
+ platform: process.env.VERCEL
52
+ ? "vercel"
53
+ : process.env.AWS_REGION
54
+ ? "aws"
55
+ : "unknown",
56
+ sdk: `@upstash/redis@${VERSION}`,
31
57
  });
32
58
  }
33
59
  /**
@@ -54,28 +80,6 @@ export class Redis extends core.Redis {
54
80
  if (!token) {
55
81
  throw new Error("Unable to find environment variable: `UPSTASH_REDIS_REST_TOKEN`");
56
82
  }
57
- return new Redis({ url, token, ...config });
83
+ return new Redis({ ...config, url, token });
58
84
  }
59
85
  }
60
- function defaultRequester(config) {
61
- return {
62
- request: async function (req) {
63
- if (!req.path) {
64
- req.path = [];
65
- }
66
- const res = await fetch([config.baseUrl, ...req.path].join("/"), {
67
- method: "POST",
68
- headers: { "Content-Type": "application/json", ...config.headers },
69
- body: JSON.stringify(req.body),
70
- keepalive: true,
71
- // @ts-ignore
72
- agent: config.agent,
73
- });
74
- const body = (await res.json());
75
- if (!res.ok) {
76
- throw new UpstashError(body.error);
77
- }
78
- return body;
79
- },
80
- };
81
- }
@@ -1,6 +1,15 @@
1
1
  // deno-lint-ignore-file
2
2
  import * as core from "../pkg/redis.js";
3
- import { UpstashError } from "../pkg/error.js";
3
+ import { HttpClient, } from "../pkg/http.js";
4
+ import { VERSION } from "../version.js";
5
+ /**
6
+ * Workaround for nodejs 14, where atob is not included in the standardlib
7
+ */
8
+ if (typeof atob === "undefined") {
9
+ global.atob = function (b64) {
10
+ return Buffer.from(b64, "base64").toString("utf-8");
11
+ };
12
+ }
4
13
  /**
5
14
  * Serverless redis client for upstash.
6
15
  */
@@ -20,13 +29,28 @@ export class Redis extends core.Redis {
20
29
  /\r|\n/.test(configOrRequester.token)) {
21
30
  console.warn("The redis token contains whitespace or newline, which can cause errors!");
22
31
  }
23
- const client = defaultRequester({
32
+ const client = new HttpClient({
24
33
  baseUrl: configOrRequester.url,
34
+ retry: configOrRequester.retry,
25
35
  headers: { authorization: `Bearer ${configOrRequester.token}` },
26
- // agent: configOrRequester.agent,
36
+ agent: configOrRequester.agent,
37
+ responseEncoding: configOrRequester.responseEncoding,
38
+ cache: configOrRequester.cache || "no-store",
27
39
  });
28
40
  super(client, {
29
41
  automaticDeserialization: configOrRequester.automaticDeserialization,
42
+ enableTelemetry: !process.env.UPSTASH_DISABLE_TELEMETRY,
43
+ });
44
+ this.addTelemetry({
45
+ runtime: typeof EdgeRuntime === "string"
46
+ ? "edge-light"
47
+ : `node@${process.version}`,
48
+ platform: process.env.VERCEL
49
+ ? "vercel"
50
+ : process.env.AWS_REGION
51
+ ? "aws"
52
+ : "unknown",
53
+ sdk: `@upstash/redis@${VERSION}`,
30
54
  });
31
55
  }
32
56
  /**
@@ -53,28 +77,6 @@ export class Redis extends core.Redis {
53
77
  if (!token) {
54
78
  throw new Error("Unable to find environment variable: `UPSTASH_REDIS_REST_TOKEN`");
55
79
  }
56
- return new Redis({ url, token, ...config });
80
+ return new Redis({ ...config, url, token });
57
81
  }
58
82
  }
59
- function defaultRequester(config) {
60
- return {
61
- request: async function (req) {
62
- if (!req.path) {
63
- req.path = [];
64
- }
65
- const res = await fetch([config.baseUrl, ...req.path].join("/"), {
66
- method: "POST",
67
- headers: { "Content-Type": "application/json", ...config.headers },
68
- body: JSON.stringify(req.body),
69
- keepalive: true,
70
- // @ts-ignore
71
- agent: config.agent,
72
- });
73
- const body = (await res.json());
74
- if (!res.ok) {
75
- throw new UpstashError(body.error);
76
- }
77
- return body;
78
- },
79
- };
80
- }
package/esm/version.js ADDED
@@ -0,0 +1 @@
1
+ export const VERSION = "v0.0.0";