memx 0.0.7 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/buffers.cjs +50 -0
- package/dist/buffers.cjs.map +6 -0
- package/dist/buffers.d.ts +14 -0
- package/dist/buffers.mjs +25 -0
- package/dist/buffers.mjs.map +6 -0
- package/dist/client.cjs +251 -0
- package/dist/client.cjs.map +6 -0
- package/dist/client.d.ts +76 -0
- package/dist/client.mjs +216 -0
- package/dist/client.mjs.map +6 -0
- package/dist/cluster.cjs +147 -0
- package/dist/cluster.cjs.map +6 -0
- package/dist/cluster.d.ts +60 -0
- package/dist/cluster.mjs +112 -0
- package/dist/cluster.mjs.map +6 -0
- package/dist/connection.cjs +186 -0
- package/dist/connection.cjs.map +6 -0
- package/dist/connection.d.ts +18 -0
- package/dist/connection.mjs +151 -0
- package/dist/connection.mjs.map +6 -0
- package/dist/constants.cjs +140 -0
- package/dist/constants.cjs.map +6 -0
- package/dist/constants.d.ts +87 -0
- package/dist/constants.mjs +107 -0
- package/dist/constants.mjs.map +6 -0
- package/dist/decode.cjs +101 -0
- package/dist/decode.cjs.map +6 -0
- package/dist/decode.d.ts +16 -0
- package/dist/decode.mjs +66 -0
- package/dist/decode.mjs.map +6 -0
- package/dist/encode.cjs +70 -0
- package/dist/encode.cjs.map +6 -0
- package/dist/encode.d.ts +20 -0
- package/dist/encode.mjs +45 -0
- package/dist/encode.mjs.map +6 -0
- package/dist/fake.cjs +183 -0
- package/dist/fake.cjs.map +6 -0
- package/dist/fake.d.ts +53 -0
- package/dist/fake.mjs +157 -0
- package/dist/fake.mjs.map +6 -0
- package/dist/index.cjs +57 -0
- package/dist/index.cjs.map +6 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.mjs +15 -1460
- package/dist/index.mjs.map +2 -2
- package/dist/internals.cjs +61 -0
- package/dist/internals.cjs.map +6 -0
- package/dist/internals.d.ts +7 -0
- package/dist/internals.mjs +24 -0
- package/dist/internals.mjs.map +6 -0
- package/dist/server.cjs +468 -0
- package/dist/server.cjs.map +6 -0
- package/dist/server.d.ts +59 -0
- package/dist/server.mjs +443 -0
- package/dist/server.mjs.map +6 -0
- package/dist/types.cjs +19 -0
- package/dist/types.cjs.map +6 -0
- package/dist/types.d.ts +239 -0
- package/dist/types.mjs +1 -0
- package/dist/types.mjs.map +6 -0
- package/dist/utils.cjs +182 -0
- package/dist/utils.cjs.map +6 -0
- package/dist/utils.d.ts +22 -0
- package/dist/utils.mjs +145 -0
- package/dist/utils.mjs.map +6 -0
- package/package.json +29 -27
- package/src/client.ts +25 -23
- package/src/cluster.ts +6 -3
- package/src/connection.ts +8 -4
- package/src/decode.ts +5 -2
- package/src/encode.ts +5 -2
- package/src/fake.ts +34 -33
- package/src/internals.ts +8 -8
- package/src/server.ts +47 -45
- package/src/utils.ts +7 -4
- package/dist/index.js +0 -1496
- package/dist/index.js.map +0 -6
- package/index.d.ts +0 -710
package/dist/buffers.cjs
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// buffers.ts
|
|
21
|
+
var buffers_exports = {};
|
|
22
|
+
__export(buffers_exports, {
|
|
23
|
+
allocateBuffer: () => allocateBuffer
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(buffers_exports);
|
|
26
|
+
var import_constants = require("./constants.cjs");
|
|
27
|
+
var pool = new Array(import_constants.BUFFERS.POOL_SIZE);
|
|
28
|
+
var offset = -1;
|
|
29
|
+
function allocateBuffer(size) {
|
|
30
|
+
if (size > import_constants.BUFFERS.BUFFER_SIZE) {
|
|
31
|
+
const buffer2 = Buffer.allocUnsafeSlow(size);
|
|
32
|
+
buffer2.recycle = () => void 0;
|
|
33
|
+
return buffer2;
|
|
34
|
+
}
|
|
35
|
+
const buffer = offset >= 0 ? pool[offset--] : Buffer.allocUnsafeSlow(import_constants.BUFFERS.BUFFER_SIZE);
|
|
36
|
+
const recyclable = buffer.subarray(0, size);
|
|
37
|
+
let recycled = false;
|
|
38
|
+
recyclable.recycle = () => queueMicrotask(() => {
|
|
39
|
+
if (offset >= import_constants.BUFFERS.POOL_SIZE || recycled)
|
|
40
|
+
return;
|
|
41
|
+
pool[++offset] = buffer;
|
|
42
|
+
recycled = true;
|
|
43
|
+
});
|
|
44
|
+
return recyclable;
|
|
45
|
+
}
|
|
46
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
47
|
+
0 && (module.exports = {
|
|
48
|
+
allocateBuffer
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=buffers.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/buffers.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAwB;AAExB,IAAM,OAAiB,IAAI,MAAM,yBAAQ,SAAS;AAClD,IAAI,SAAS;AAeN,SAAS,eAAe,MAAgC;AAC7D,MAAI,OAAO,yBAAQ,aAAa;AAC9B,UAAMA,UAAS,OAAO,gBAAgB,IAAI;AAC1C,IAAAA,QAAO,UAAU,MAAM;AACvB,WAAOA;AAAA,EACT;AAEA,QAAM,SAAS,UAAU,IAAI,KAAK,QAAQ,IAAI,OAAO,gBAAgB,yBAAQ,WAAW;AACxF,QAAM,aAAa,OAAO,SAAS,GAAG,IAAI;AAC1C,MAAI,WAAW;AACf,aAAW,UAAU,MAAY,eAAe,MAAM;AACpD,QAAK,UAAU,yBAAQ,aAAc;AAAU;AAC/C,SAAK,EAAE,MAAM,IAAI;AACjB,eAAW;AAAA,EACb,CAAC;AAED,SAAO;AACT;",
|
|
5
|
+
"names": ["buffer"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/** A `RecyclableBuffer` is a `Buffer` that can be recycled by a pool. */
|
|
3
|
+
export interface RecyclableBuffer extends Buffer {
|
|
4
|
+
/** Recycle this buffer. */
|
|
5
|
+
recycle(): void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Allocate a {@link RecyclableBuffer} of _size_ bytes.
|
|
9
|
+
*
|
|
10
|
+
* Up to {@link BUFFERS.POOL_SIZE} (64) buffers will be recycled once their
|
|
11
|
+
* `recycle()` method is called _if_ their size is not bigger than
|
|
12
|
+
* {@link BUFFERS.BUFFER_SIZE} (8192 bytes).
|
|
13
|
+
*/
|
|
14
|
+
export declare function allocateBuffer(size: number): RecyclableBuffer;
|
package/dist/buffers.mjs
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// buffers.ts
|
|
2
|
+
import { BUFFERS } from "./constants.mjs";
|
|
3
|
+
var pool = new Array(BUFFERS.POOL_SIZE);
|
|
4
|
+
var offset = -1;
|
|
5
|
+
function allocateBuffer(size) {
|
|
6
|
+
if (size > BUFFERS.BUFFER_SIZE) {
|
|
7
|
+
const buffer2 = Buffer.allocUnsafeSlow(size);
|
|
8
|
+
buffer2.recycle = () => void 0;
|
|
9
|
+
return buffer2;
|
|
10
|
+
}
|
|
11
|
+
const buffer = offset >= 0 ? pool[offset--] : Buffer.allocUnsafeSlow(BUFFERS.BUFFER_SIZE);
|
|
12
|
+
const recyclable = buffer.subarray(0, size);
|
|
13
|
+
let recycled = false;
|
|
14
|
+
recyclable.recycle = () => queueMicrotask(() => {
|
|
15
|
+
if (offset >= BUFFERS.POOL_SIZE || recycled)
|
|
16
|
+
return;
|
|
17
|
+
pool[++offset] = buffer;
|
|
18
|
+
recycled = true;
|
|
19
|
+
});
|
|
20
|
+
return recyclable;
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
allocateBuffer
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=buffers.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/buffers.ts"],
|
|
4
|
+
"mappings": ";AAAA,SAAS,eAAe;AAExB,IAAM,OAAiB,IAAI,MAAM,QAAQ,SAAS;AAClD,IAAI,SAAS;AAeN,SAAS,eAAe,MAAgC;AAC7D,MAAI,OAAO,QAAQ,aAAa;AAC9B,UAAMA,UAAS,OAAO,gBAAgB,IAAI;AAC1C,IAAAA,QAAO,UAAU,MAAM;AACvB,WAAOA;AAAA,EACT;AAEA,QAAM,SAAS,UAAU,IAAI,KAAK,QAAQ,IAAI,OAAO,gBAAgB,QAAQ,WAAW;AACxF,QAAM,aAAa,OAAO,SAAS,GAAG,IAAI;AAC1C,MAAI,WAAW;AACf,aAAW,UAAU,MAAY,eAAe,MAAM;AACpD,QAAK,UAAU,QAAQ,aAAc;AAAU;AAC/C,SAAK,EAAE,MAAM,IAAI;AACjB,eAAW;AAAA,EACb,CAAC;AAED,SAAO;AACT;",
|
|
5
|
+
"names": ["buffer"]
|
|
6
|
+
}
|
package/dist/client.cjs
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
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
|
+
// client.ts
|
|
31
|
+
var client_exports = {};
|
|
32
|
+
__export(client_exports, {
|
|
33
|
+
MemxClient: () => MemxClient
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(client_exports);
|
|
36
|
+
var import_node_assert = __toESM(require("node:assert"));
|
|
37
|
+
var import_node_util = require("node:util");
|
|
38
|
+
var import_cluster = require("./cluster.cjs");
|
|
39
|
+
var import_constants = require("./constants.cjs");
|
|
40
|
+
var import_internals = require("./internals.cjs");
|
|
41
|
+
function replacer(key, value) {
|
|
42
|
+
if (typeof this[key] === "bigint")
|
|
43
|
+
return ["\0__$BIGINT$__\0", this[key].toString()];
|
|
44
|
+
if (this[key] instanceof Date)
|
|
45
|
+
return ["\0__$DATE$__\0", this[key].toISOString()];
|
|
46
|
+
if (this[key] instanceof Set)
|
|
47
|
+
return ["\0__$SET$__\0", ...value];
|
|
48
|
+
if (this[key] instanceof Map)
|
|
49
|
+
return ["\0__$MAP$__\0", ...value.entries()];
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
function reviver(_key, value) {
|
|
53
|
+
if (Array.isArray(value)) {
|
|
54
|
+
switch (value[0]) {
|
|
55
|
+
case "\0__$BIGINT$__\0":
|
|
56
|
+
return BigInt(value[1]);
|
|
57
|
+
case "\0__$DATE$__\0":
|
|
58
|
+
return new Date(value[1]);
|
|
59
|
+
case "\0__$SET$__\0":
|
|
60
|
+
return new Set(value.slice(1));
|
|
61
|
+
case "\0__$MAP$__\0":
|
|
62
|
+
return new Map(value.slice(1));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
function toBuffer(value, options) {
|
|
68
|
+
if (Buffer.isBuffer(value))
|
|
69
|
+
return [value, { ...options, flags: import_constants.FLAGS.BUFFER }];
|
|
70
|
+
switch (typeof value) {
|
|
71
|
+
case "bigint":
|
|
72
|
+
return [Buffer.from(value.toString(), "utf-8"), { ...options, flags: import_constants.FLAGS.BIGINT }];
|
|
73
|
+
case "boolean":
|
|
74
|
+
return [Buffer.alloc(1, value ? 255 : 0), { ...options, flags: import_constants.FLAGS.BOOLEAN }];
|
|
75
|
+
case "number":
|
|
76
|
+
return [Buffer.from(value.toString(), "utf-8"), { ...options, flags: import_constants.FLAGS.NUMBER }];
|
|
77
|
+
case "string":
|
|
78
|
+
return [Buffer.from(value, "utf-8"), { ...options, flags: import_constants.FLAGS.STRING }];
|
|
79
|
+
case "object":
|
|
80
|
+
break;
|
|
81
|
+
default:
|
|
82
|
+
import_node_assert.default.fail(`Unable to store value of type "${typeof value}"`);
|
|
83
|
+
}
|
|
84
|
+
if (import_node_util.types.isTypedArray(value)) {
|
|
85
|
+
const flags = (0, import_internals.typedArrayFlags)(value);
|
|
86
|
+
const buffer = Buffer.from(value.buffer, value.byteOffset, value.byteLength);
|
|
87
|
+
return [buffer, { ...options, flags }];
|
|
88
|
+
}
|
|
89
|
+
if (value === null)
|
|
90
|
+
return [import_constants.EMPTY_BUFFER, { ...options, flags: import_constants.FLAGS.NULL }];
|
|
91
|
+
const json = JSON.stringify(value, replacer);
|
|
92
|
+
return [Buffer.from(json, "utf-8"), { ...options, flags: import_constants.FLAGS.JSON }];
|
|
93
|
+
}
|
|
94
|
+
function fromBuffer(result) {
|
|
95
|
+
try {
|
|
96
|
+
const { flags, value, cas } = result;
|
|
97
|
+
switch (flags) {
|
|
98
|
+
case import_constants.FLAGS.BIGINT:
|
|
99
|
+
return { value: BigInt(value.toString("utf-8")), cas };
|
|
100
|
+
case import_constants.FLAGS.BOOLEAN:
|
|
101
|
+
return { value: !!value[0], cas };
|
|
102
|
+
case import_constants.FLAGS.NUMBER:
|
|
103
|
+
return { value: Number(value.toString("utf-8")), cas };
|
|
104
|
+
case import_constants.FLAGS.STRING:
|
|
105
|
+
return { value: value.toString("utf-8"), cas };
|
|
106
|
+
case import_constants.FLAGS.NULL:
|
|
107
|
+
return { value: null, cas };
|
|
108
|
+
case import_constants.FLAGS.JSON:
|
|
109
|
+
return { value: JSON.parse(value.toString("utf-8"), reviver), cas };
|
|
110
|
+
case import_constants.FLAGS.UINT8ARRAY:
|
|
111
|
+
return { value: makeTypedArray(Uint8Array, value), cas };
|
|
112
|
+
case import_constants.FLAGS.UINT8CLAMPEDARRAY:
|
|
113
|
+
return { value: makeTypedArray(Uint8ClampedArray, value), cas };
|
|
114
|
+
case import_constants.FLAGS.UINT16ARRAY:
|
|
115
|
+
return { value: makeTypedArray(Uint16Array, value), cas };
|
|
116
|
+
case import_constants.FLAGS.UINT32ARRAY:
|
|
117
|
+
return { value: makeTypedArray(Uint32Array, value), cas };
|
|
118
|
+
case import_constants.FLAGS.INT8ARRAY:
|
|
119
|
+
return { value: makeTypedArray(Int8Array, value), cas };
|
|
120
|
+
case import_constants.FLAGS.INT16ARRAY:
|
|
121
|
+
return { value: makeTypedArray(Int16Array, value), cas };
|
|
122
|
+
case import_constants.FLAGS.INT32ARRAY:
|
|
123
|
+
return { value: makeTypedArray(Int32Array, value), cas };
|
|
124
|
+
case import_constants.FLAGS.BIGUINT64ARRAY:
|
|
125
|
+
return { value: makeTypedArray(BigUint64Array, value), cas };
|
|
126
|
+
case import_constants.FLAGS.BIGINT64ARRAY:
|
|
127
|
+
return { value: makeTypedArray(BigInt64Array, value), cas };
|
|
128
|
+
case import_constants.FLAGS.FLOAT32ARRAY:
|
|
129
|
+
return { value: makeTypedArray(Float32Array, value), cas };
|
|
130
|
+
case import_constants.FLAGS.FLOAT64ARRAY:
|
|
131
|
+
return { value: makeTypedArray(Float64Array, value), cas };
|
|
132
|
+
case import_constants.FLAGS.BUFFER:
|
|
133
|
+
default:
|
|
134
|
+
return { value: Buffer.from(value), cas };
|
|
135
|
+
}
|
|
136
|
+
} finally {
|
|
137
|
+
result.recycle();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function makeTypedArray(constructor, source) {
|
|
141
|
+
const clone = Buffer.from(source);
|
|
142
|
+
const { buffer, byteOffset, byteLength } = clone;
|
|
143
|
+
return new constructor(buffer, byteOffset, byteLength / constructor.BYTES_PER_ELEMENT);
|
|
144
|
+
}
|
|
145
|
+
var MemxClient = class {
|
|
146
|
+
#adapter;
|
|
147
|
+
#prefix;
|
|
148
|
+
constructor(adapterOrOptions) {
|
|
149
|
+
if (!adapterOrOptions) {
|
|
150
|
+
this.#adapter = new import_cluster.ClusterAdapter();
|
|
151
|
+
} else if ("get" in adapterOrOptions) {
|
|
152
|
+
this.#adapter = adapterOrOptions;
|
|
153
|
+
} else if ("hosts" in adapterOrOptions) {
|
|
154
|
+
this.#adapter = new import_cluster.ClusterAdapter(adapterOrOptions);
|
|
155
|
+
}
|
|
156
|
+
this.#prefix = "";
|
|
157
|
+
(0, import_node_assert.default)(this.#adapter, "Invalid client constructor arguments");
|
|
158
|
+
}
|
|
159
|
+
/** Return the {@link Adapter} backing this {@link MemxClient} instance */
|
|
160
|
+
get adapter() {
|
|
161
|
+
return this.#adapter;
|
|
162
|
+
}
|
|
163
|
+
/** Return the prefix prepended to all keys managed by this {@link MemxClient} */
|
|
164
|
+
get prefix() {
|
|
165
|
+
return this.#prefix;
|
|
166
|
+
}
|
|
167
|
+
/** Return a new {@link MemxClient} prefixing keys with the specified `string` */
|
|
168
|
+
withPrefix(prefix) {
|
|
169
|
+
(0, import_node_assert.default)(prefix, "Invalid prefix");
|
|
170
|
+
const client = new MemxClient(this.#adapter);
|
|
171
|
+
client.#prefix = prefix;
|
|
172
|
+
return client;
|
|
173
|
+
}
|
|
174
|
+
/** Get the value (or `undefined`) associated with the given key */
|
|
175
|
+
async get(key) {
|
|
176
|
+
const result = await this.#adapter.get(this.#prefix + key);
|
|
177
|
+
return result && fromBuffer(result).value;
|
|
178
|
+
}
|
|
179
|
+
/** Get the value (or `undefined`) associated with the given key, and update its TTL */
|
|
180
|
+
async gat(key, ttl) {
|
|
181
|
+
const result = await this.#adapter.gat(this.#prefix + key, ttl);
|
|
182
|
+
return result && fromBuffer(result).value;
|
|
183
|
+
}
|
|
184
|
+
/** Get the value and _CAS_ associated with the given key */
|
|
185
|
+
async getc(key) {
|
|
186
|
+
const result = await this.#adapter.get(this.#prefix + key);
|
|
187
|
+
return result && fromBuffer(result);
|
|
188
|
+
}
|
|
189
|
+
/** Get the value and _CAS_ associated with the given key, and update its TTL */
|
|
190
|
+
async gatc(key, ttl) {
|
|
191
|
+
const result = await this.#adapter.gat(this.#prefix + key, ttl);
|
|
192
|
+
return result && fromBuffer(result);
|
|
193
|
+
}
|
|
194
|
+
async set(key, value, options) {
|
|
195
|
+
return this.#adapter.set(this.#prefix + key, ...toBuffer(value, options));
|
|
196
|
+
}
|
|
197
|
+
async add(key, value, options) {
|
|
198
|
+
return this.#adapter.add(this.#prefix + key, ...toBuffer(value, options));
|
|
199
|
+
}
|
|
200
|
+
async replace(key, value, options) {
|
|
201
|
+
return this.#adapter.replace(this.#prefix + key, ...toBuffer(value, options));
|
|
202
|
+
}
|
|
203
|
+
append(key, value, options) {
|
|
204
|
+
return this.#adapter.append(this.#prefix + key, ...toBuffer(value, options));
|
|
205
|
+
}
|
|
206
|
+
prepend(key, value, options) {
|
|
207
|
+
return this.#adapter.prepend(this.#prefix + key, ...toBuffer(value, options));
|
|
208
|
+
}
|
|
209
|
+
async increment(key, delta, options) {
|
|
210
|
+
const counter = await this.#adapter.increment(this.#prefix + key, delta, options);
|
|
211
|
+
if (options?.initial !== void 0 && counter?.value === BigInt(options.initial)) {
|
|
212
|
+
const cas = await this.replace(key, counter.value, { cas: counter.cas, ttl: options.ttl });
|
|
213
|
+
counter.cas = cas ?? counter.cas;
|
|
214
|
+
}
|
|
215
|
+
return counter;
|
|
216
|
+
}
|
|
217
|
+
async decrement(key, delta, options) {
|
|
218
|
+
const counter = await this.#adapter.decrement(this.#prefix + key, delta, options);
|
|
219
|
+
if (options?.initial !== void 0 && counter?.value === BigInt(options.initial)) {
|
|
220
|
+
const cas = await this.replace(key, counter.value, { cas: counter.cas, ttl: options.ttl });
|
|
221
|
+
counter.cas = cas ?? counter.cas;
|
|
222
|
+
}
|
|
223
|
+
return counter;
|
|
224
|
+
}
|
|
225
|
+
touch(key, ttl) {
|
|
226
|
+
return this.#adapter.touch(this.#prefix + key, ttl);
|
|
227
|
+
}
|
|
228
|
+
delete(key, options) {
|
|
229
|
+
return this.#adapter.delete(this.#prefix + key, options);
|
|
230
|
+
}
|
|
231
|
+
flush(ttl) {
|
|
232
|
+
return this.#adapter.flush(ttl);
|
|
233
|
+
}
|
|
234
|
+
noop() {
|
|
235
|
+
return this.#adapter.noop();
|
|
236
|
+
}
|
|
237
|
+
quit() {
|
|
238
|
+
return this.#adapter.quit();
|
|
239
|
+
}
|
|
240
|
+
version() {
|
|
241
|
+
return this.#adapter.version();
|
|
242
|
+
}
|
|
243
|
+
stats() {
|
|
244
|
+
return this.#adapter.stats();
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
248
|
+
0 && (module.exports = {
|
|
249
|
+
MemxClient
|
|
250
|
+
});
|
|
251
|
+
//# sourceMappingURL=client.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/client.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["assert"]
|
|
6
|
+
}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { ClusterOptions } from './cluster';
|
|
3
|
+
import type { Adapter, Counter, Stats } from './types';
|
|
4
|
+
/** Types that can be serialized by our {@link MemxClient}. */
|
|
5
|
+
export type Serializable = bigint | string | number | boolean | null | object;
|
|
6
|
+
/** Types that can be appended/prepended by our {@link MemxClient}. */
|
|
7
|
+
export type Appendable = string | NodeJS.TypedArray;
|
|
8
|
+
/** The `ClientResult` interface associate a value with its _CAS_. */
|
|
9
|
+
export interface ClientResult<T extends Serializable> {
|
|
10
|
+
/** The value returned by the {@link MemxClient} */
|
|
11
|
+
value: T;
|
|
12
|
+
/** The _CAS_ of the value being returned */
|
|
13
|
+
cas: bigint;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A `Client` represents a high-level client for a _Memcached_ server.
|
|
17
|
+
*/
|
|
18
|
+
export declare class MemxClient {
|
|
19
|
+
#private;
|
|
20
|
+
/** Construct a new {@link MemxClient} from environment variables */
|
|
21
|
+
constructor();
|
|
22
|
+
/** Construct a new {@link MemxClient} wrapping an existing {@link Adapter} */
|
|
23
|
+
constructor(adapter: Adapter);
|
|
24
|
+
/** Construct a new {@link MemxClient} given the specified {@link ClusterOptions} */
|
|
25
|
+
constructor(options: ClusterOptions);
|
|
26
|
+
/** Return the {@link Adapter} backing this {@link MemxClient} instance */
|
|
27
|
+
get adapter(): Adapter;
|
|
28
|
+
/** Return the prefix prepended to all keys managed by this {@link MemxClient} */
|
|
29
|
+
get prefix(): string;
|
|
30
|
+
/** Return a new {@link MemxClient} prefixing keys with the specified `string` */
|
|
31
|
+
withPrefix(prefix: string): MemxClient;
|
|
32
|
+
/** Get the value (or `undefined`) associated with the given key */
|
|
33
|
+
get<T extends Serializable>(key: string): Promise<T | undefined>;
|
|
34
|
+
/** Get the value (or `undefined`) associated with the given key, and update its TTL */
|
|
35
|
+
gat<T extends Serializable>(key: string, ttl: number): Promise<T | undefined>;
|
|
36
|
+
/** Get the value and _CAS_ associated with the given key */
|
|
37
|
+
getc<T extends Serializable>(key: string): Promise<ClientResult<T> | undefined>;
|
|
38
|
+
/** Get the value and _CAS_ associated with the given key, and update its TTL */
|
|
39
|
+
gatc<T extends Serializable>(key: string, ttl: number): Promise<ClientResult<T> | undefined>;
|
|
40
|
+
set(key: string, value: Serializable, options?: {
|
|
41
|
+
cas?: bigint;
|
|
42
|
+
ttl?: number;
|
|
43
|
+
}): Promise<bigint | undefined>;
|
|
44
|
+
add(key: string, value: Serializable, options?: {
|
|
45
|
+
ttl?: number;
|
|
46
|
+
}): Promise<bigint | undefined>;
|
|
47
|
+
replace(key: string, value: Serializable, options?: {
|
|
48
|
+
cas?: bigint;
|
|
49
|
+
ttl?: number;
|
|
50
|
+
}): Promise<bigint | undefined>;
|
|
51
|
+
append(key: string, value: Appendable, options?: {
|
|
52
|
+
cas?: bigint;
|
|
53
|
+
}): Promise<boolean>;
|
|
54
|
+
prepend(key: string, value: Appendable, options?: {
|
|
55
|
+
cas?: bigint;
|
|
56
|
+
}): Promise<boolean>;
|
|
57
|
+
increment(key: string, delta?: bigint | number, options?: {
|
|
58
|
+
initial?: bigint | number;
|
|
59
|
+
cas?: bigint;
|
|
60
|
+
ttl?: number;
|
|
61
|
+
}): Promise<Counter | undefined>;
|
|
62
|
+
decrement(key: string, delta?: bigint | number, options?: {
|
|
63
|
+
initial?: bigint | number;
|
|
64
|
+
cas?: bigint;
|
|
65
|
+
ttl?: number;
|
|
66
|
+
}): Promise<Counter | undefined>;
|
|
67
|
+
touch(key: string, ttl?: number): Promise<boolean>;
|
|
68
|
+
delete(key: string, options?: {
|
|
69
|
+
cas?: bigint;
|
|
70
|
+
}): Promise<boolean>;
|
|
71
|
+
flush(ttl?: number): Promise<void>;
|
|
72
|
+
noop(): Promise<void>;
|
|
73
|
+
quit(): Promise<void>;
|
|
74
|
+
version(): Promise<Record<string, string>>;
|
|
75
|
+
stats(): Promise<Record<string, Stats>>;
|
|
76
|
+
}
|
package/dist/client.mjs
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
// client.ts
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import { types } from "node:util";
|
|
4
|
+
import { ClusterAdapter } from "./cluster.mjs";
|
|
5
|
+
import { EMPTY_BUFFER, FLAGS } from "./constants.mjs";
|
|
6
|
+
import { typedArrayFlags } from "./internals.mjs";
|
|
7
|
+
function replacer(key, value) {
|
|
8
|
+
if (typeof this[key] === "bigint")
|
|
9
|
+
return ["\0__$BIGINT$__\0", this[key].toString()];
|
|
10
|
+
if (this[key] instanceof Date)
|
|
11
|
+
return ["\0__$DATE$__\0", this[key].toISOString()];
|
|
12
|
+
if (this[key] instanceof Set)
|
|
13
|
+
return ["\0__$SET$__\0", ...value];
|
|
14
|
+
if (this[key] instanceof Map)
|
|
15
|
+
return ["\0__$MAP$__\0", ...value.entries()];
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function reviver(_key, value) {
|
|
19
|
+
if (Array.isArray(value)) {
|
|
20
|
+
switch (value[0]) {
|
|
21
|
+
case "\0__$BIGINT$__\0":
|
|
22
|
+
return BigInt(value[1]);
|
|
23
|
+
case "\0__$DATE$__\0":
|
|
24
|
+
return new Date(value[1]);
|
|
25
|
+
case "\0__$SET$__\0":
|
|
26
|
+
return new Set(value.slice(1));
|
|
27
|
+
case "\0__$MAP$__\0":
|
|
28
|
+
return new Map(value.slice(1));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
function toBuffer(value, options) {
|
|
34
|
+
if (Buffer.isBuffer(value))
|
|
35
|
+
return [value, { ...options, flags: FLAGS.BUFFER }];
|
|
36
|
+
switch (typeof value) {
|
|
37
|
+
case "bigint":
|
|
38
|
+
return [Buffer.from(value.toString(), "utf-8"), { ...options, flags: FLAGS.BIGINT }];
|
|
39
|
+
case "boolean":
|
|
40
|
+
return [Buffer.alloc(1, value ? 255 : 0), { ...options, flags: FLAGS.BOOLEAN }];
|
|
41
|
+
case "number":
|
|
42
|
+
return [Buffer.from(value.toString(), "utf-8"), { ...options, flags: FLAGS.NUMBER }];
|
|
43
|
+
case "string":
|
|
44
|
+
return [Buffer.from(value, "utf-8"), { ...options, flags: FLAGS.STRING }];
|
|
45
|
+
case "object":
|
|
46
|
+
break;
|
|
47
|
+
default:
|
|
48
|
+
assert.fail(`Unable to store value of type "${typeof value}"`);
|
|
49
|
+
}
|
|
50
|
+
if (types.isTypedArray(value)) {
|
|
51
|
+
const flags = typedArrayFlags(value);
|
|
52
|
+
const buffer = Buffer.from(value.buffer, value.byteOffset, value.byteLength);
|
|
53
|
+
return [buffer, { ...options, flags }];
|
|
54
|
+
}
|
|
55
|
+
if (value === null)
|
|
56
|
+
return [EMPTY_BUFFER, { ...options, flags: FLAGS.NULL }];
|
|
57
|
+
const json = JSON.stringify(value, replacer);
|
|
58
|
+
return [Buffer.from(json, "utf-8"), { ...options, flags: FLAGS.JSON }];
|
|
59
|
+
}
|
|
60
|
+
function fromBuffer(result) {
|
|
61
|
+
try {
|
|
62
|
+
const { flags, value, cas } = result;
|
|
63
|
+
switch (flags) {
|
|
64
|
+
case FLAGS.BIGINT:
|
|
65
|
+
return { value: BigInt(value.toString("utf-8")), cas };
|
|
66
|
+
case FLAGS.BOOLEAN:
|
|
67
|
+
return { value: !!value[0], cas };
|
|
68
|
+
case FLAGS.NUMBER:
|
|
69
|
+
return { value: Number(value.toString("utf-8")), cas };
|
|
70
|
+
case FLAGS.STRING:
|
|
71
|
+
return { value: value.toString("utf-8"), cas };
|
|
72
|
+
case FLAGS.NULL:
|
|
73
|
+
return { value: null, cas };
|
|
74
|
+
case FLAGS.JSON:
|
|
75
|
+
return { value: JSON.parse(value.toString("utf-8"), reviver), cas };
|
|
76
|
+
case FLAGS.UINT8ARRAY:
|
|
77
|
+
return { value: makeTypedArray(Uint8Array, value), cas };
|
|
78
|
+
case FLAGS.UINT8CLAMPEDARRAY:
|
|
79
|
+
return { value: makeTypedArray(Uint8ClampedArray, value), cas };
|
|
80
|
+
case FLAGS.UINT16ARRAY:
|
|
81
|
+
return { value: makeTypedArray(Uint16Array, value), cas };
|
|
82
|
+
case FLAGS.UINT32ARRAY:
|
|
83
|
+
return { value: makeTypedArray(Uint32Array, value), cas };
|
|
84
|
+
case FLAGS.INT8ARRAY:
|
|
85
|
+
return { value: makeTypedArray(Int8Array, value), cas };
|
|
86
|
+
case FLAGS.INT16ARRAY:
|
|
87
|
+
return { value: makeTypedArray(Int16Array, value), cas };
|
|
88
|
+
case FLAGS.INT32ARRAY:
|
|
89
|
+
return { value: makeTypedArray(Int32Array, value), cas };
|
|
90
|
+
case FLAGS.BIGUINT64ARRAY:
|
|
91
|
+
return { value: makeTypedArray(BigUint64Array, value), cas };
|
|
92
|
+
case FLAGS.BIGINT64ARRAY:
|
|
93
|
+
return { value: makeTypedArray(BigInt64Array, value), cas };
|
|
94
|
+
case FLAGS.FLOAT32ARRAY:
|
|
95
|
+
return { value: makeTypedArray(Float32Array, value), cas };
|
|
96
|
+
case FLAGS.FLOAT64ARRAY:
|
|
97
|
+
return { value: makeTypedArray(Float64Array, value), cas };
|
|
98
|
+
case FLAGS.BUFFER:
|
|
99
|
+
default:
|
|
100
|
+
return { value: Buffer.from(value), cas };
|
|
101
|
+
}
|
|
102
|
+
} finally {
|
|
103
|
+
result.recycle();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function makeTypedArray(constructor, source) {
|
|
107
|
+
const clone = Buffer.from(source);
|
|
108
|
+
const { buffer, byteOffset, byteLength } = clone;
|
|
109
|
+
return new constructor(buffer, byteOffset, byteLength / constructor.BYTES_PER_ELEMENT);
|
|
110
|
+
}
|
|
111
|
+
var MemxClient = class {
|
|
112
|
+
#adapter;
|
|
113
|
+
#prefix;
|
|
114
|
+
constructor(adapterOrOptions) {
|
|
115
|
+
if (!adapterOrOptions) {
|
|
116
|
+
this.#adapter = new ClusterAdapter();
|
|
117
|
+
} else if ("get" in adapterOrOptions) {
|
|
118
|
+
this.#adapter = adapterOrOptions;
|
|
119
|
+
} else if ("hosts" in adapterOrOptions) {
|
|
120
|
+
this.#adapter = new ClusterAdapter(adapterOrOptions);
|
|
121
|
+
}
|
|
122
|
+
this.#prefix = "";
|
|
123
|
+
assert(this.#adapter, "Invalid client constructor arguments");
|
|
124
|
+
}
|
|
125
|
+
/** Return the {@link Adapter} backing this {@link MemxClient} instance */
|
|
126
|
+
get adapter() {
|
|
127
|
+
return this.#adapter;
|
|
128
|
+
}
|
|
129
|
+
/** Return the prefix prepended to all keys managed by this {@link MemxClient} */
|
|
130
|
+
get prefix() {
|
|
131
|
+
return this.#prefix;
|
|
132
|
+
}
|
|
133
|
+
/** Return a new {@link MemxClient} prefixing keys with the specified `string` */
|
|
134
|
+
withPrefix(prefix) {
|
|
135
|
+
assert(prefix, "Invalid prefix");
|
|
136
|
+
const client = new MemxClient(this.#adapter);
|
|
137
|
+
client.#prefix = prefix;
|
|
138
|
+
return client;
|
|
139
|
+
}
|
|
140
|
+
/** Get the value (or `undefined`) associated with the given key */
|
|
141
|
+
async get(key) {
|
|
142
|
+
const result = await this.#adapter.get(this.#prefix + key);
|
|
143
|
+
return result && fromBuffer(result).value;
|
|
144
|
+
}
|
|
145
|
+
/** Get the value (or `undefined`) associated with the given key, and update its TTL */
|
|
146
|
+
async gat(key, ttl) {
|
|
147
|
+
const result = await this.#adapter.gat(this.#prefix + key, ttl);
|
|
148
|
+
return result && fromBuffer(result).value;
|
|
149
|
+
}
|
|
150
|
+
/** Get the value and _CAS_ associated with the given key */
|
|
151
|
+
async getc(key) {
|
|
152
|
+
const result = await this.#adapter.get(this.#prefix + key);
|
|
153
|
+
return result && fromBuffer(result);
|
|
154
|
+
}
|
|
155
|
+
/** Get the value and _CAS_ associated with the given key, and update its TTL */
|
|
156
|
+
async gatc(key, ttl) {
|
|
157
|
+
const result = await this.#adapter.gat(this.#prefix + key, ttl);
|
|
158
|
+
return result && fromBuffer(result);
|
|
159
|
+
}
|
|
160
|
+
async set(key, value, options) {
|
|
161
|
+
return this.#adapter.set(this.#prefix + key, ...toBuffer(value, options));
|
|
162
|
+
}
|
|
163
|
+
async add(key, value, options) {
|
|
164
|
+
return this.#adapter.add(this.#prefix + key, ...toBuffer(value, options));
|
|
165
|
+
}
|
|
166
|
+
async replace(key, value, options) {
|
|
167
|
+
return this.#adapter.replace(this.#prefix + key, ...toBuffer(value, options));
|
|
168
|
+
}
|
|
169
|
+
append(key, value, options) {
|
|
170
|
+
return this.#adapter.append(this.#prefix + key, ...toBuffer(value, options));
|
|
171
|
+
}
|
|
172
|
+
prepend(key, value, options) {
|
|
173
|
+
return this.#adapter.prepend(this.#prefix + key, ...toBuffer(value, options));
|
|
174
|
+
}
|
|
175
|
+
async increment(key, delta, options) {
|
|
176
|
+
const counter = await this.#adapter.increment(this.#prefix + key, delta, options);
|
|
177
|
+
if (options?.initial !== void 0 && counter?.value === BigInt(options.initial)) {
|
|
178
|
+
const cas = await this.replace(key, counter.value, { cas: counter.cas, ttl: options.ttl });
|
|
179
|
+
counter.cas = cas ?? counter.cas;
|
|
180
|
+
}
|
|
181
|
+
return counter;
|
|
182
|
+
}
|
|
183
|
+
async decrement(key, delta, options) {
|
|
184
|
+
const counter = await this.#adapter.decrement(this.#prefix + key, delta, options);
|
|
185
|
+
if (options?.initial !== void 0 && counter?.value === BigInt(options.initial)) {
|
|
186
|
+
const cas = await this.replace(key, counter.value, { cas: counter.cas, ttl: options.ttl });
|
|
187
|
+
counter.cas = cas ?? counter.cas;
|
|
188
|
+
}
|
|
189
|
+
return counter;
|
|
190
|
+
}
|
|
191
|
+
touch(key, ttl) {
|
|
192
|
+
return this.#adapter.touch(this.#prefix + key, ttl);
|
|
193
|
+
}
|
|
194
|
+
delete(key, options) {
|
|
195
|
+
return this.#adapter.delete(this.#prefix + key, options);
|
|
196
|
+
}
|
|
197
|
+
flush(ttl) {
|
|
198
|
+
return this.#adapter.flush(ttl);
|
|
199
|
+
}
|
|
200
|
+
noop() {
|
|
201
|
+
return this.#adapter.noop();
|
|
202
|
+
}
|
|
203
|
+
quit() {
|
|
204
|
+
return this.#adapter.quit();
|
|
205
|
+
}
|
|
206
|
+
version() {
|
|
207
|
+
return this.#adapter.version();
|
|
208
|
+
}
|
|
209
|
+
stats() {
|
|
210
|
+
return this.#adapter.stats();
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
export {
|
|
214
|
+
MemxClient
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=client.mjs.map
|