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.
- 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 +58 -0
- package/dist/internals.cjs.map +6 -0
- package/dist/internals.d.ts +7 -0
- package/dist/internals.mjs +21 -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 +7 -7
- 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
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/client.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
package/dist/cluster.cjs
ADDED
|
@@ -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
|
+
}
|
package/dist/cluster.mjs
ADDED
|
@@ -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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAmB;AACnB,sBAAgB;AAEhB,oBAAwB;AACxB,oBAAwB;AACxB,uBAAgC;AAChC,uBAA2C;AAQ3C,IAAM,WAAN,MAAe;AAAA,EACb;AAAA,EACA;AAAA,EACA,WAAgC,CAAC;AAAA,EAExB;AAAA,EACA;AAAA,EAET,YAAY,QAAgB;AAC1B,SAAK,SAAS;AAEd,SAAK,UAAU,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC9C,WAAK,WAAW;AAChB,WAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAiC;AACtC,SAAK,SAAS,KAAK,MAAM;AAAA,EAC3B;AAAA,EAEA,QAAQ,QAAiC;AACvC,SAAK,SAAS,KAAK,MAAM;AACzB,SAAK,SAAS,KAAK,QAA8B;AAAA,EACnD;AAAA,EAEA,OAAO,OAAoB;AACzB,SAAK,QAAQ,KAAK;AAAA,EACpB;AACF;AAQO,IAAM,aAAN,MAAiB;AAAA,EACb,WAAW,IAAI,sBAAQ,CAAC,WAAW,KAAK,SAAS,MAAM,CAAC;AAAA,EACxD,WAAW,IAAI,sBAAQ;AAAA,EACvB,UAAU,OAAO,gBAAgB,yBAAQ,WAAW;AAAA,EACpD,UAAU,oBAAI,IAAsB;AAAA,EACpC;AAAA,EAET;AAAA,EACA,YAAY;AAAA,EAEH;AAAA,EACA;AAAA,EACA;AAAA,EAGT,YAAY,SAA+D;AACzE,2BAAAA,SAAO,SAAS,sBAAsB;AAEtC,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU,gBAAAC,QAAI;AAAA,IAChB,IAAI;AACJ,SAAK,WAAW;AAEhB,2BAAAD,SAAO,MAAM,wBAAwB;AACrC,2BAAAA,SAAO,OAAO,KAAK,OAAO,SAAU,KAAK,MAAM,IAAI,KAAK,MAAO,gBAAgB,MAAM;AAErF,SAAK,WAAW;AAChB,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA,EAIA,IAAI,YAAqB;AACvB,WAAO,CAAC,CAAE,KAAK;AAAA,EACjB;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAAkB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAIA,WAA4B;AAC1B,WAAO,KAAK,YAAY,KAAK,UAAU,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtE,YAAM,SAAiB,KAAK,SAAS;AAAA,QACnC,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,SAAS,KAAK;AAAA,QACd,QAAQ;AAAA,UACN,QAAQ,KAAK;AAAA,UACb,UAAU,CAAC,OAAe,WAA4B;AACpD,iBAAK,SAAS,OAAO,QAAQ,GAAG,KAAK;AACrC,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,GAAG,WAAW,MAAM,OAAO,QAAQ,IAAI,MAAM,SAAS,CAAC,CAAC;AAC/D,aAAO,GAAG,SAAS,MAAM;AAEzB,aAAO,GAAG,SAAS,MAAM;AACvB,oDAA2B,WAAW,IAAI;AAC1C,aAAK,UAAU;AAAA,MACjB,CAAC;AAED,aAAO,GAAG,WAAW,MAAM;AACzB,oDAA2B,SAAS,MAAM,QAAQ,IAAI;AAEtD,eAAO,IAAI,SAAS,MAAM;AAC1B,eAAO,GAAG,SAAS,CAAC,UAAU;AAC5B,qBAAW,YAAY,KAAK,QAAQ,OAAO,GAAG;AAC5C,oBAAQ,SAAS,MAAM,SAAS,OAAO,KAAK,CAAC;AAAA,UAC/C;AACA,eAAK,QAAQ,MAAM;AACnB,eAAK,UAAU;AAAA,QACjB,CAAC;AAED,eAAO,MAAM;AACb,gBAAQ,MAAM;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,SAAS,QAAiC;AACxC,UAAM,WAAW,KAAK,QAAQ,IAAI,OAAO,QAAQ;AACjD,QAAI,UAAU;AACZ,UAAI,SAAS,WAAW,OAAO,QAAQ;AACrC,YAAK,OAAO,WAAW,wBAAO,QAAU,OAAO,IAAI,WAAW,GAAI;AAChE,iBAAO,SAAS,OAAO,MAAM;AAAA,QAC/B;AACA,eAAO,SAAS,QAAQ,MAAM;AAAA,MAChC,OAAO;AACL,cAAM,OAAO,KAAK,SAAS,OAAO,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC9D,cAAM,WAAW,KAAK,OAAO,OAAO,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAChE,eAAO,SAAS,OAAO,IAAI,MAAM,yBAAyB,kBAAkB,WAAW,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,QAAwD;AACjE,UAAM,WAAW,EAAG,KAAK;AACzB,UAAM,SAAS,KAAK,SAAS,OAAO,QAAQ,QAAQ;AACpD,UAAM,WAAW,IAAI,SAAS,OAAO,MAAM;AAE3C,SAAK,QAAQ,IAAI,UAAU,QAAQ;AAEnC,UAAM,SAAS,MAAM,KAAK,SAAS;AACnC,WAAO,MAAM,QAAQ,CAAC,UAAU;AAC9B,aAAO,QAAQ;AACf,UAAI;AAAO,eAAO,SAAS,OAAO,KAAK;AAAA,IACzC,CAAC;AAED,UAAM,UAAU,WAAW,MAAM,SAAS,OAAO,IAAI,MAAM,aAAa,CAAC,GAAG,KAAK,QAAQ;AAEzF,WAAO,SAAS,QAAQ,QAAQ,MAAM;AACpC,mBAAa,OAAO;AACpB,WAAK,QAAQ,OAAO,QAAQ;AAAA,IAC9B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAA4B;AAChC,UAAM,SAAS,MAAM,KAAK;AAC1B,QAAI,CAAE;AAAQ,aAAO;AAErB,WAAO,IAAI,QAAiB,CAAC,SAAS,WAAW;AAC/C,aACK,KAAK,SAAS,MAAM,EACpB,KAAK,SAAS,OAAO,EACrB,QAAQ;AAAA,IACf,CAAC;AAAA,EACH;AACF;",
|
|
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
|
+
}
|