memx 0.0.7 → 0.1.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 (78) hide show
  1. package/dist/buffers.cjs +50 -0
  2. package/dist/buffers.cjs.map +6 -0
  3. package/dist/buffers.d.ts +14 -0
  4. package/dist/buffers.mjs +25 -0
  5. package/dist/buffers.mjs.map +6 -0
  6. package/dist/client.cjs +251 -0
  7. package/dist/client.cjs.map +6 -0
  8. package/dist/client.d.ts +76 -0
  9. package/dist/client.mjs +216 -0
  10. package/dist/client.mjs.map +6 -0
  11. package/dist/cluster.cjs +147 -0
  12. package/dist/cluster.cjs.map +6 -0
  13. package/dist/cluster.d.ts +60 -0
  14. package/dist/cluster.mjs +112 -0
  15. package/dist/cluster.mjs.map +6 -0
  16. package/dist/connection.cjs +186 -0
  17. package/dist/connection.cjs.map +6 -0
  18. package/dist/connection.d.ts +18 -0
  19. package/dist/connection.mjs +151 -0
  20. package/dist/connection.mjs.map +6 -0
  21. package/dist/constants.cjs +140 -0
  22. package/dist/constants.cjs.map +6 -0
  23. package/dist/constants.d.ts +87 -0
  24. package/dist/constants.mjs +107 -0
  25. package/dist/constants.mjs.map +6 -0
  26. package/dist/decode.cjs +101 -0
  27. package/dist/decode.cjs.map +6 -0
  28. package/dist/decode.d.ts +16 -0
  29. package/dist/decode.mjs +66 -0
  30. package/dist/decode.mjs.map +6 -0
  31. package/dist/encode.cjs +70 -0
  32. package/dist/encode.cjs.map +6 -0
  33. package/dist/encode.d.ts +20 -0
  34. package/dist/encode.mjs +45 -0
  35. package/dist/encode.mjs.map +6 -0
  36. package/dist/fake.cjs +183 -0
  37. package/dist/fake.cjs.map +6 -0
  38. package/dist/fake.d.ts +53 -0
  39. package/dist/fake.mjs +157 -0
  40. package/dist/fake.mjs.map +6 -0
  41. package/dist/index.cjs +57 -0
  42. package/dist/index.cjs.map +6 -0
  43. package/dist/index.d.ts +12 -0
  44. package/dist/index.mjs +15 -1460
  45. package/dist/index.mjs.map +2 -2
  46. package/dist/internals.cjs +58 -0
  47. package/dist/internals.cjs.map +6 -0
  48. package/dist/internals.d.ts +7 -0
  49. package/dist/internals.mjs +21 -0
  50. package/dist/internals.mjs.map +6 -0
  51. package/dist/server.cjs +468 -0
  52. package/dist/server.cjs.map +6 -0
  53. package/dist/server.d.ts +59 -0
  54. package/dist/server.mjs +443 -0
  55. package/dist/server.mjs.map +6 -0
  56. package/dist/types.cjs +19 -0
  57. package/dist/types.cjs.map +6 -0
  58. package/dist/types.d.ts +239 -0
  59. package/dist/types.mjs +1 -0
  60. package/dist/types.mjs.map +6 -0
  61. package/dist/utils.cjs +182 -0
  62. package/dist/utils.cjs.map +6 -0
  63. package/dist/utils.d.ts +22 -0
  64. package/dist/utils.mjs +145 -0
  65. package/dist/utils.mjs.map +6 -0
  66. package/package.json +29 -27
  67. package/src/client.ts +25 -23
  68. package/src/cluster.ts +6 -3
  69. package/src/connection.ts +8 -4
  70. package/src/decode.ts +5 -2
  71. package/src/encode.ts +5 -2
  72. package/src/fake.ts +34 -33
  73. package/src/internals.ts +7 -7
  74. package/src/server.ts +47 -45
  75. package/src/utils.ts +7 -4
  76. package/dist/index.js +0 -1496
  77. package/dist/index.js.map +0 -6
  78. package/index.d.ts +0 -710
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/client.ts"],
4
+ "mappings": ";AAAA,OAAO,YAAY;AACnB,SAAS,aAAa;AAEtB,SAAS,sBAAsB;AAC/B,SAAS,cAAc,aAAa;AACpC,SAAS,uBAAuB;AAMhC,SAAS,SAAoB,KAAa,OAAiB;AACzD,MAAI,OAAO,KAAK,GAAG,MAAM;AAAU,WAAO,CAAE,oBAAoB,KAAK,GAAG,EAAE,SAAS,CAAE;AACrF,MAAI,KAAK,GAAG,aAAa;AAAM,WAAO,CAAE,kBAAkB,KAAK,GAAG,EAAE,YAAY,CAAE;AAClF,MAAI,KAAK,GAAG,aAAa;AAAK,WAAO,CAAE,iBAAiB,GAAG,KAAM;AACjE,MAAI,KAAK,GAAG,aAAa;AAAK,WAAO,CAAE,iBAAiB,GAAG,MAAM,QAAQ,CAAE;AAC3E,SAAO;AACT;AAGA,SAAS,QAAmB,MAAc,OAAiB;AACzD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAQ,MAAM,CAAC,GAAG;AAAA,MAChB,KAAK;AAAoB,eAAO,OAAO,MAAM,CAAC,CAAC;AAAA,MAC/C,KAAK;AAAkB,eAAO,IAAI,KAAK,MAAM,CAAC,CAAC;AAAA,MAC/C,KAAK;AAAiB,eAAO,IAAI,IAAI,MAAM,MAAM,CAAC,CAAC;AAAA,MACnD,KAAK;AAAiB,eAAO,IAAI,IAAI,MAAM,MAAM,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,SAAY,OAAkC,SAA+C;AACpG,MAAI,OAAO,SAAS,KAAK;AAAG,WAAO,CAAE,OAAO,EAAE,GAAG,SAAS,OAAO,MAAM,OAAO,CAAE;AAEhF,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AACH,aAAO,CAAE,OAAO,KAAK,MAAM,SAAS,GAAG,OAAO,GAAG,EAAE,GAAG,SAAS,OAAO,MAAM,OAAO,CAAE;AAAA,IACvF,KAAK;AACH,aAAO,CAAE,OAAO,MAAM,GAAG,QAAQ,MAAO,CAAI,GAAG,EAAE,GAAG,SAAS,OAAO,MAAM,QAAQ,CAAE;AAAA,IACtF,KAAK;AACH,aAAO,CAAE,OAAO,KAAK,MAAM,SAAS,GAAG,OAAO,GAAG,EAAE,GAAG,SAAS,OAAO,MAAM,OAAO,CAAE;AAAA,IACvF,KAAK;AACH,aAAO,CAAE,OAAO,KAAK,OAAO,OAAO,GAAG,EAAE,GAAG,SAAS,OAAO,MAAM,OAAO,CAAE;AAAA,IAC5E,KAAK;AACH;AAAA,IACF;AACE,aAAO,KAAK,kCAAkC,OAAO,QAAQ;AAAA,EACjE;AAGA,MAAI,MAAM,aAAa,KAAK,GAAG;AAC7B,UAAM,QAAQ,gBAAgB,KAAK;AACnC,UAAM,SAAS,OAAO,KAAK,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC3E,WAAO,CAAE,QAAQ,EAAE,GAAG,SAAS,MAAM,CAAE;AAAA,EACzC;AAGA,MAAI,UAAU;AAAM,WAAO,CAAE,cAAc,EAAE,GAAG,SAAS,OAAO,MAAM,KAAK,CAAE;AAG7E,QAAM,OAAO,KAAK,UAAU,OAAO,QAAQ;AAC3C,SAAO,CAAE,OAAO,KAAK,MAAM,OAAO,GAAG,EAAE,GAAG,SAAS,OAAO,MAAM,KAAK,CAAE;AACzE;AAQA,SAAS,WAAmC,QAAwC;AAClF,MAAI;AACF,UAAM,EAAE,OAAO,OAAO,IAAI,IAAI;AAC9B,YAAQ,OAAO;AAAA,MACb,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,OAAO,MAAM,SAAS,OAAO,CAAC,GAAQ,IAAI;AAAA,MAC5D,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,GAAQ,IAAI;AAAA,MACvC,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,OAAO,MAAM,SAAS,OAAQ,CAAC,GAAQ,IAAI;AAAA,MAC7D,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,MAAM,SAAS,OAAQ,GAAQ,IAAI;AAAA,MAErD,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,MAAW,IAAI;AAAA,MACjC,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,KAAK,MAAM,MAAM,SAAS,OAAQ,GAAG,OAAO,GAAQ,IAAI;AAAA,MAE1E,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,YAAY,KAAK,GAAQ,IAAI;AAAA,MAC9D,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,mBAAmB,KAAK,GAAQ,IAAI;AAAA,MACrE,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,aAAa,KAAK,GAAQ,IAAI;AAAA,MAC/D,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,aAAa,KAAK,GAAQ,IAAI;AAAA,MAC/D,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,WAAW,KAAK,GAAQ,IAAI;AAAA,MAC7D,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,YAAY,KAAK,GAAQ,IAAI;AAAA,MAC9D,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,YAAY,KAAK,GAAQ,IAAI;AAAA,MAC9D,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,gBAAgB,KAAK,GAAQ,IAAI;AAAA,MAClE,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,eAAe,KAAK,GAAQ,IAAI;AAAA,MACjE,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,cAAc,KAAK,GAAQ,IAAI;AAAA,MAChE,KAAK,MAAM;AACT,eAAO,EAAE,OAAO,eAAe,cAAc,KAAK,GAAQ,IAAI;AAAA,MAEhE,KAAK,MAAM;AAAA,MACX;AACE,eAAO,EAAE,OAAO,OAAO,KAAK,KAAK,GAAQ,IAAI;AAAA,IACjD;AAAA,EACF,UAAE;AACA,WAAO,QAAQ;AAAA,EACjB;AACF;AAGA,SAAS,eACL,aACA,QACC;AACH,QAAM,QAAQ,OAAO,KAAK,MAAM;AAChC,QAAM,EAAE,QAAQ,YAAY,WAAW,IAAI;AAC3C,SAAO,IAAI,YAAY,QAAQ,YAAY,aAAa,YAAY,iBAAiB;AACvF;AAqBO,IAAM,aAAN,MAAiB;AAAA,EACtB;AAAA,EACA;AAAA,EASA,YAAY,kBAA6C;AACvD,QAAI,CAAE,kBAAkB;AACtB,WAAK,WAAW,IAAI,eAAe;AAAA,IACrC,WAAW,SAAS,kBAAkB;AACpC,WAAK,WAAW;AAAA,IAClB,WAAW,WAAW,kBAAkB;AACtC,WAAK,WAAW,IAAI,eAAe,gBAAgB;AAAA,IACrD;AAEA,SAAK,UAAU;AAEf,WAAO,KAAK,UAAU,sCAAsC;AAAA,EAC9D;AAAA;AAAA,EAGA,IAAI,UAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,SAAiB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,WAAW,QAA4B;AACrC,WAAO,QAAQ,gBAAgB;AAC/B,UAAM,SAAS,IAAI,WAAW,KAAK,QAAQ;AAC3C,WAAO,UAAU;AACjB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,IAA4B,KAAqC;AACrE,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,KAAK,UAAU,GAAG;AACzD,WAAO,UAAU,WAAc,MAAM,EAAE;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,IAA4B,KAAa,KAAqC;AAClF,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,KAAK,UAAU,KAAK,GAAG;AAC9D,WAAO,UAAU,WAAc,MAAM,EAAE;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,KAA6B,KAAmD;AACpF,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,KAAK,UAAU,GAAG;AACzD,WAAO,UAAU,WAAW,MAAM;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,KAA6B,KAAa,KAAmD;AACjG,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,KAAK,UAAU,KAAK,GAAG;AAC9D,WAAO,UAAU,WAAW,MAAM;AAAA,EACpC;AAAA,EAEA,MAAM,IAAI,KAAa,OAAqB,SAAuE;AACjH,WAAO,KAAK,SAAS,IAAI,KAAK,UAAU,KAAK,GAAG,SAAS,OAAO,OAAO,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAM,IAAI,KAAa,OAAqB,SAAyD;AACnG,WAAO,KAAK,SAAS,IAAI,KAAK,UAAU,KAAK,GAAG,SAAS,OAAO,OAAO,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAM,QAAQ,KAAa,OAAqB,SAAuE;AACrH,WAAO,KAAK,SAAS,QAAQ,KAAK,UAAU,KAAK,GAAG,SAAS,OAAO,OAAO,CAAC;AAAA,EAC9E;AAAA,EAEA,OACI,KACA,OACA,SACgB;AAClB,WAAO,KAAK,SAAS,OAAO,KAAK,UAAU,KAAK,GAAG,SAAS,OAAO,OAAO,CAAC;AAAA,EAC7E;AAAA,EAEA,QACI,KACA,OACA,SACgB;AAClB,WAAO,KAAK,SAAS,QAAQ,KAAK,UAAU,KAAK,GAAG,SAAS,OAAO,OAAO,CAAC;AAAA,EAC9E;AAAA,EAEA,MAAM,UACF,KACA,OACA,SAC4B;AAC9B,UAAM,UAAU,MAAM,KAAK,SAAS,UAAU,KAAK,UAAU,KAAK,OAAO,OAAO;AAEhF,QAAK,SAAS,YAAY,UAAe,SAAS,UAAU,OAAO,QAAQ,OAAO,GAAI;AACpF,YAAM,MAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ,OAAO,EAAE,KAAK,QAAQ,KAAK,KAAK,QAAQ,IAAI,CAAC;AACzF,cAAQ,MAAM,OAAO,QAAQ;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UACF,KACA,OACA,SAC4B;AAC9B,UAAM,UAAU,MAAM,KAAK,SAAS,UAAU,KAAK,UAAU,KAAK,OAAO,OAAO;AAEhF,QAAK,SAAS,YAAY,UAAe,SAAS,UAAU,OAAO,QAAQ,OAAO,GAAI;AACpF,YAAM,MAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ,OAAO,EAAE,KAAK,QAAQ,KAAK,KAAK,QAAQ,IAAI,CAAC;AACzF,cAAQ,MAAM,OAAO,QAAQ;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MACI,KACA,KACgB;AAClB,WAAO,KAAK,SAAS,MAAM,KAAK,UAAU,KAAK,GAAG;AAAA,EACpD;AAAA,EAEA,OACI,KACA,SACgB;AAClB,WAAO,KAAK,SAAS,OAAO,KAAK,UAAU,KAAK,OAAO;AAAA,EACzD;AAAA,EAEA,MAAM,KAA6B;AACjC,WAAO,KAAK,SAAS,MAAM,GAAG;AAAA,EAChC;AAAA,EAEA,OAAsB;AACpB,WAAO,KAAK,SAAS,KAAK;AAAA,EAC5B;AAAA,EAEA,OAAsB;AACpB,WAAO,KAAK,SAAS,KAAK;AAAA,EAC5B;AAAA,EAEA,UAA2C;AACzC,WAAO,KAAK,SAAS,QAAQ;AAAA,EAC/B;AAAA,EAEA,QAAwC;AACtC,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B;AACF;",
5
+ "names": []
6
+ }
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // cluster.ts
31
+ var cluster_exports = {};
32
+ __export(cluster_exports, {
33
+ ClusterAdapter: () => ClusterAdapter
34
+ });
35
+ module.exports = __toCommonJS(cluster_exports);
36
+ var import_node_assert = __toESM(require("node:assert"));
37
+ var import_server = require("./server.cjs");
38
+ function parseHosts(hosts) {
39
+ const result = [];
40
+ if (!hosts)
41
+ return result;
42
+ for (const part of hosts.split(",")) {
43
+ const [host, p] = part.split(":");
44
+ const port = parseInt(p) || void 0;
45
+ result.push({ host, port });
46
+ }
47
+ return result;
48
+ }
49
+ var ClusterAdapter = class {
50
+ servers;
51
+ ttl;
52
+ constructor(serversOrOptions) {
53
+ if (Array.isArray(serversOrOptions)) {
54
+ this.servers = [...serversOrOptions];
55
+ } else if (serversOrOptions) {
56
+ const { ttl, timeout, hosts: defs } = serversOrOptions;
57
+ const hosts = [];
58
+ if (Array.isArray(defs)) {
59
+ defs.forEach((def) => {
60
+ if (typeof def === "string")
61
+ hosts.push(...parseHosts(def));
62
+ else
63
+ hosts.push({ port: 11211, ...def });
64
+ });
65
+ } else {
66
+ hosts.push(...parseHosts(defs));
67
+ }
68
+ this.servers = hosts.map((host) => new import_server.ServerAdapter({ ttl, timeout, ...host }));
69
+ } else {
70
+ const hosts = parseHosts(process.env.MEMCACHED_HOSTS);
71
+ const ttl = process.env.MEMCACHED_TTL && parseInt(process.env.MEMCACHED_TTL) || void 0;
72
+ const timeout = process.env.MEMCACHED_TIMEOUT && parseInt(process.env.MEMCACHED_TIMEOUT) || void 0;
73
+ this.servers = hosts.map((host) => new import_server.ServerAdapter({ ttl, timeout, ...host }));
74
+ }
75
+ if (this.servers.length < 1)
76
+ throw new Error("No hosts configured");
77
+ if (this.servers.length === 1)
78
+ this.server = () => this.servers[0];
79
+ this.ttl = this.servers[0].ttl;
80
+ this.servers.slice(1).forEach((server) => {
81
+ import_node_assert.default.equal(server.ttl, this.ttl, `TTL Mismatch (${server.ttl} != ${this.ttl})`);
82
+ });
83
+ Object.freeze(this.servers);
84
+ }
85
+ server(key) {
86
+ const length = key.length;
87
+ let hash = 0;
88
+ for (let i = 0; i < length; i++)
89
+ hash = hash * 31 + key.charCodeAt(i);
90
+ return this.servers[hash % this.servers.length];
91
+ }
92
+ get(key) {
93
+ return this.server(key).get(key);
94
+ }
95
+ gat(key, ttl) {
96
+ return this.server(key).gat(key, ttl);
97
+ }
98
+ touch(key, ttl) {
99
+ return this.server(key).touch(key, ttl);
100
+ }
101
+ set(key, value, options) {
102
+ return this.server(key).set(key, value, options);
103
+ }
104
+ add(key, value, options) {
105
+ return this.server(key).add(key, value, options);
106
+ }
107
+ replace(key, value, options) {
108
+ return this.server(key).replace(key, value, options);
109
+ }
110
+ append(key, value, options) {
111
+ return this.server(key).append(key, value, options);
112
+ }
113
+ prepend(key, value, options) {
114
+ return this.server(key).prepend(key, value, options);
115
+ }
116
+ increment(key, delta, options) {
117
+ return this.server(key).increment(key, delta, options);
118
+ }
119
+ decrement(key, delta, options) {
120
+ return this.server(key).decrement(key, delta, options);
121
+ }
122
+ delete(key, options) {
123
+ return this.server(key).delete(key, options);
124
+ }
125
+ async flush(ttl) {
126
+ await Promise.all(this.servers.map((server) => server.flush(ttl)));
127
+ }
128
+ async noop() {
129
+ await Promise.all(this.servers.map((server) => server.noop()));
130
+ }
131
+ async quit() {
132
+ await Promise.all(this.servers.map((server) => server.quit()));
133
+ }
134
+ async version() {
135
+ const versions = await Promise.all(this.servers.map((server) => server.version()));
136
+ return versions.reduce((v1, v2) => ({ ...v1, ...v2 }));
137
+ }
138
+ async stats() {
139
+ const stats = await Promise.all(this.servers.map((server) => server.stats()));
140
+ return stats.reduce((v1, v2) => ({ ...v1, ...v2 }));
141
+ }
142
+ };
143
+ // Annotate the CommonJS export names for ESM import in node:
144
+ 0 && (module.exports = {
145
+ ClusterAdapter
146
+ });
147
+ //# sourceMappingURL=cluster.cjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cluster.ts"],
4
+ "mappings": "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",
5
+ "names": ["assert"]
6
+ }
@@ -0,0 +1,60 @@
1
+ /// <reference types="node" />
2
+ import { ServerAdapter } from './server';
3
+ import type { Adapter, Counter, AdapterResult, Stats } from './types';
4
+ import type { ServerOptions } from './server';
5
+ export interface ClusterOptions {
6
+ hosts: string | string[] | ServerOptions[];
7
+ timeout?: number;
8
+ ttl?: number;
9
+ }
10
+ export declare class ClusterAdapter implements Adapter {
11
+ readonly servers: readonly ServerAdapter[];
12
+ readonly ttl: number;
13
+ constructor();
14
+ constructor(servers: ServerAdapter[]);
15
+ constructor(options: ClusterOptions);
16
+ server(key: string): ServerAdapter;
17
+ get(key: string): Promise<AdapterResult | undefined>;
18
+ gat(key: string, ttl: number): Promise<AdapterResult | undefined>;
19
+ touch(key: string, ttl?: number): Promise<boolean>;
20
+ set(key: string, value: Buffer, options?: {
21
+ flags?: number;
22
+ cas?: bigint;
23
+ ttl?: number;
24
+ }): Promise<bigint | undefined>;
25
+ add(key: string, value: Buffer, options?: {
26
+ flags?: number;
27
+ ttl?: number;
28
+ }): Promise<bigint | undefined>;
29
+ replace(key: string, value: Buffer, options?: {
30
+ flags?: number;
31
+ cas?: bigint;
32
+ ttl?: number;
33
+ }): Promise<bigint | undefined>;
34
+ append(key: string, value: Buffer, options?: {
35
+ cas?: bigint;
36
+ }): Promise<boolean>;
37
+ prepend(key: string, value: Buffer, options?: {
38
+ cas?: bigint;
39
+ }): Promise<boolean>;
40
+ increment(key: string, delta?: number | bigint, options?: {
41
+ initial?: number | bigint;
42
+ cas?: bigint;
43
+ ttl?: number;
44
+ create?: boolean;
45
+ }): Promise<Counter | undefined>;
46
+ decrement(key: string, delta?: number | bigint, options?: {
47
+ initial?: number | bigint;
48
+ cas?: bigint;
49
+ ttl?: number;
50
+ create?: boolean;
51
+ }): Promise<Counter | undefined>;
52
+ delete(key: string, options?: {
53
+ cas?: bigint;
54
+ }): Promise<boolean>;
55
+ flush(ttl?: number): Promise<void>;
56
+ noop(): Promise<void>;
57
+ quit(): Promise<void>;
58
+ version(): Promise<Record<string, string>>;
59
+ stats(): Promise<Record<string, Stats>>;
60
+ }
@@ -0,0 +1,112 @@
1
+ // cluster.ts
2
+ import assert from "node:assert";
3
+ import { ServerAdapter } from "./server.mjs";
4
+ function parseHosts(hosts) {
5
+ const result = [];
6
+ if (!hosts)
7
+ return result;
8
+ for (const part of hosts.split(",")) {
9
+ const [host, p] = part.split(":");
10
+ const port = parseInt(p) || void 0;
11
+ result.push({ host, port });
12
+ }
13
+ return result;
14
+ }
15
+ var ClusterAdapter = class {
16
+ servers;
17
+ ttl;
18
+ constructor(serversOrOptions) {
19
+ if (Array.isArray(serversOrOptions)) {
20
+ this.servers = [...serversOrOptions];
21
+ } else if (serversOrOptions) {
22
+ const { ttl, timeout, hosts: defs } = serversOrOptions;
23
+ const hosts = [];
24
+ if (Array.isArray(defs)) {
25
+ defs.forEach((def) => {
26
+ if (typeof def === "string")
27
+ hosts.push(...parseHosts(def));
28
+ else
29
+ hosts.push({ port: 11211, ...def });
30
+ });
31
+ } else {
32
+ hosts.push(...parseHosts(defs));
33
+ }
34
+ this.servers = hosts.map((host) => new ServerAdapter({ ttl, timeout, ...host }));
35
+ } else {
36
+ const hosts = parseHosts(process.env.MEMCACHED_HOSTS);
37
+ const ttl = process.env.MEMCACHED_TTL && parseInt(process.env.MEMCACHED_TTL) || void 0;
38
+ const timeout = process.env.MEMCACHED_TIMEOUT && parseInt(process.env.MEMCACHED_TIMEOUT) || void 0;
39
+ this.servers = hosts.map((host) => new ServerAdapter({ ttl, timeout, ...host }));
40
+ }
41
+ if (this.servers.length < 1)
42
+ throw new Error("No hosts configured");
43
+ if (this.servers.length === 1)
44
+ this.server = () => this.servers[0];
45
+ this.ttl = this.servers[0].ttl;
46
+ this.servers.slice(1).forEach((server) => {
47
+ assert.equal(server.ttl, this.ttl, `TTL Mismatch (${server.ttl} != ${this.ttl})`);
48
+ });
49
+ Object.freeze(this.servers);
50
+ }
51
+ server(key) {
52
+ const length = key.length;
53
+ let hash = 0;
54
+ for (let i = 0; i < length; i++)
55
+ hash = hash * 31 + key.charCodeAt(i);
56
+ return this.servers[hash % this.servers.length];
57
+ }
58
+ get(key) {
59
+ return this.server(key).get(key);
60
+ }
61
+ gat(key, ttl) {
62
+ return this.server(key).gat(key, ttl);
63
+ }
64
+ touch(key, ttl) {
65
+ return this.server(key).touch(key, ttl);
66
+ }
67
+ set(key, value, options) {
68
+ return this.server(key).set(key, value, options);
69
+ }
70
+ add(key, value, options) {
71
+ return this.server(key).add(key, value, options);
72
+ }
73
+ replace(key, value, options) {
74
+ return this.server(key).replace(key, value, options);
75
+ }
76
+ append(key, value, options) {
77
+ return this.server(key).append(key, value, options);
78
+ }
79
+ prepend(key, value, options) {
80
+ return this.server(key).prepend(key, value, options);
81
+ }
82
+ increment(key, delta, options) {
83
+ return this.server(key).increment(key, delta, options);
84
+ }
85
+ decrement(key, delta, options) {
86
+ return this.server(key).decrement(key, delta, options);
87
+ }
88
+ delete(key, options) {
89
+ return this.server(key).delete(key, options);
90
+ }
91
+ async flush(ttl) {
92
+ await Promise.all(this.servers.map((server) => server.flush(ttl)));
93
+ }
94
+ async noop() {
95
+ await Promise.all(this.servers.map((server) => server.noop()));
96
+ }
97
+ async quit() {
98
+ await Promise.all(this.servers.map((server) => server.quit()));
99
+ }
100
+ async version() {
101
+ const versions = await Promise.all(this.servers.map((server) => server.version()));
102
+ return versions.reduce((v1, v2) => ({ ...v1, ...v2 }));
103
+ }
104
+ async stats() {
105
+ const stats = await Promise.all(this.servers.map((server) => server.stats()));
106
+ return stats.reduce((v1, v2) => ({ ...v1, ...v2 }));
107
+ }
108
+ };
109
+ export {
110
+ ClusterAdapter
111
+ };
112
+ //# sourceMappingURL=cluster.mjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cluster.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // connection.ts
31
+ var connection_exports = {};
32
+ __export(connection_exports, {
33
+ Connection: () => Connection
34
+ });
35
+ module.exports = __toCommonJS(connection_exports);
36
+ var import_node_assert = __toESM(require("node:assert"));
37
+ var import_node_net = __toESM(require("node:net"));
38
+ var import_encode = require("./encode.cjs");
39
+ var import_decode = require("./decode.cjs");
40
+ var import_constants = require("./constants.cjs");
41
+ var import_internals = require("./internals.cjs");
42
+ var Deferred = class {
43
+ #resolve;
44
+ #reject;
45
+ #packets = [];
46
+ promise;
47
+ opcode;
48
+ constructor(opcode) {
49
+ this.opcode = opcode;
50
+ this.promise = new Promise((resolve, reject) => {
51
+ this.#resolve = resolve;
52
+ this.#reject = reject;
53
+ });
54
+ }
55
+ append(packet) {
56
+ this.#packets.push(packet);
57
+ }
58
+ resolve(packet) {
59
+ this.#packets.push(packet);
60
+ this.#resolve(this.#packets);
61
+ }
62
+ reject(error) {
63
+ this.#reject(error);
64
+ }
65
+ };
66
+ var Connection = class {
67
+ #decoder = new import_decode.Decoder((packet) => this.#receive(packet));
68
+ #encoder = new import_encode.Encoder();
69
+ #buffer = Buffer.allocUnsafeSlow(import_constants.BUFFERS.BUFFER_SIZE);
70
+ #defers = /* @__PURE__ */ new Map();
71
+ #factory;
72
+ #socket;
73
+ #sequence = 0;
74
+ #timeout;
75
+ #host;
76
+ #port;
77
+ constructor(options) {
78
+ (0, import_node_assert.default)(options, "No options specified");
79
+ const {
80
+ host,
81
+ port = 11211,
82
+ timeout = 1e3,
83
+ factory = import_node_net.default.connect
84
+ } = options;
85
+ this.#factory = factory;
86
+ (0, import_node_assert.default)(host, "No host name specified");
87
+ (0, import_node_assert.default)(port > 0 && port < 65536 && Math.floor(port) == port, `Invalid port ${port}`);
88
+ this.#timeout = timeout;
89
+ this.#host = host;
90
+ this.#port = port;
91
+ }
92
+ /* ======================================================================== */
93
+ get connected() {
94
+ return !!this.#socket;
95
+ }
96
+ get host() {
97
+ return this.#host;
98
+ }
99
+ get port() {
100
+ return this.#port;
101
+ }
102
+ get timeout() {
103
+ return this.#timeout;
104
+ }
105
+ /* ======================================================================== */
106
+ #connect() {
107
+ return this.#socket || (this.#socket = new Promise((resolve, reject) => {
108
+ const socket = this.#factory({
109
+ host: this.#host,
110
+ port: this.#port,
111
+ timeout: this.#timeout,
112
+ onread: {
113
+ buffer: this.#buffer,
114
+ callback: (bytes, buffer) => {
115
+ this.#decoder.append(buffer, 0, bytes);
116
+ return true;
117
+ }
118
+ }
119
+ });
120
+ socket.on("timeout", () => socket.destroy(new Error("Timeout")));
121
+ socket.on("error", reject);
122
+ socket.on("close", () => {
123
+ import_internals.socketFinalizationRegistry.unregister(this);
124
+ this.#socket = void 0;
125
+ });
126
+ socket.on("connect", () => {
127
+ import_internals.socketFinalizationRegistry.register(this, socket, this);
128
+ socket.off("error", reject);
129
+ socket.on("error", (error) => {
130
+ for (const deferred of this.#defers.values()) {
131
+ process.nextTick(() => deferred.reject(error));
132
+ }
133
+ this.#defers.clear();
134
+ this.#socket = void 0;
135
+ });
136
+ socket.unref();
137
+ resolve(socket);
138
+ });
139
+ }));
140
+ }
141
+ #receive(packet) {
142
+ const deferred = this.#defers.get(packet.sequence);
143
+ if (deferred) {
144
+ if (deferred.opcode === packet.opcode) {
145
+ if (packet.opcode === import_constants.OPCODE.STAT && packet.key.length !== 0) {
146
+ return deferred.append(packet);
147
+ }
148
+ return deferred.resolve(packet);
149
+ } else {
150
+ const sent = `0x${deferred.opcode.toString(16).padStart(2, "0")}`;
151
+ const received = `0x${packet.opcode.toString(16).padStart(2, "0")}`;
152
+ return deferred.reject(new Error(`Opcode mismatch (sent=${sent}, received=${received})`));
153
+ }
154
+ }
155
+ }
156
+ async send(packet) {
157
+ const sequence = ++this.#sequence;
158
+ const buffer = this.#encoder.encode(packet, sequence);
159
+ const deferred = new Deferred(packet.opcode);
160
+ this.#defers.set(sequence, deferred);
161
+ const socket = await this.#connect();
162
+ socket.write(buffer, (error) => {
163
+ buffer.recycle();
164
+ if (error)
165
+ return deferred.reject(error);
166
+ });
167
+ const timeout = setTimeout(() => deferred.reject(new Error("No response")), this.#timeout);
168
+ return deferred.promise.finally(() => {
169
+ clearTimeout(timeout);
170
+ this.#defers.delete(sequence);
171
+ });
172
+ }
173
+ async destroy() {
174
+ const socket = await this.#socket;
175
+ if (!socket)
176
+ return false;
177
+ return new Promise((resolve, reject) => {
178
+ socket.once("error", reject).once("close", resolve).destroy();
179
+ });
180
+ }
181
+ };
182
+ // Annotate the CommonJS export names for ESM import in node:
183
+ 0 && (module.exports = {
184
+ Connection
185
+ });
186
+ //# sourceMappingURL=connection.cjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/connection.ts"],
4
+ "mappings": "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",
5
+ "names": ["assert", "net"]
6
+ }
@@ -0,0 +1,18 @@
1
+ import type { RawIncomingPacket } from './decode';
2
+ import type { RawOutgoingPacket } from './encode';
3
+ export type RawIncomingPackets = [RawIncomingPacket, ...RawIncomingPacket[]];
4
+ export interface ConnectionOptions {
5
+ host: string;
6
+ port?: number;
7
+ timeout?: number;
8
+ }
9
+ export declare class Connection {
10
+ #private;
11
+ constructor(options: ConnectionOptions);
12
+ get connected(): boolean;
13
+ get host(): string;
14
+ get port(): number;
15
+ get timeout(): number;
16
+ send(packet: RawOutgoingPacket): Promise<RawIncomingPackets>;
17
+ destroy(): Promise<boolean>;
18
+ }