@crvouga/mockingbird-service-redis 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/README.md +59 -0
- package/SUPPORT.md +23 -0
- package/dist/chunk-4HDEOTYJ.js +4767 -0
- package/dist/chunk-4HDEOTYJ.js.map +7 -0
- package/dist/chunk-7U5RQF7K.js +144 -0
- package/dist/chunk-7U5RQF7K.js.map +7 -0
- package/dist/chunk-BIMEYU5A.js +1 -0
- package/dist/chunk-BIMEYU5A.js.map +7 -0
- package/dist/cli.js +40 -0
- package/dist/cli.js.map +7 -0
- package/dist/index.d.ts +245 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +7 -0
- package/dist/server.d.ts +266 -0
- package/dist/server.js +12 -0
- package/dist/server.js.map +7 -0
- package/package.json +76 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import {
|
|
2
|
+
RedisConnectionError,
|
|
3
|
+
RespParser,
|
|
4
|
+
asCommand,
|
|
5
|
+
createRedis,
|
|
6
|
+
encodeReply
|
|
7
|
+
} from "./chunk-4HDEOTYJ.js";
|
|
8
|
+
|
|
9
|
+
// src/server.ts
|
|
10
|
+
import { createServer } from "node:net";
|
|
11
|
+
var DEFAULT_PORT = 8827;
|
|
12
|
+
function serve(redis, options = {}) {
|
|
13
|
+
const host = options.host ?? "127.0.0.1";
|
|
14
|
+
const port = options.port ?? 6379;
|
|
15
|
+
const sockets = /* @__PURE__ */ new Set();
|
|
16
|
+
const server = createServer({ keepAlive: true }, (socket) => {
|
|
17
|
+
sockets.add(socket);
|
|
18
|
+
attach(redis, socket, () => sockets.delete(socket));
|
|
19
|
+
});
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
const fail = (error) => reject(error);
|
|
22
|
+
server.once("error", fail);
|
|
23
|
+
server.listen(port, host, () => {
|
|
24
|
+
server.off("error", fail);
|
|
25
|
+
const address = server.address();
|
|
26
|
+
const actual = address && typeof address === "object" ? address.port : port;
|
|
27
|
+
resolve({
|
|
28
|
+
host,
|
|
29
|
+
port: actual,
|
|
30
|
+
close: () => shutdown(server, sockets, redis)
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function attach(redis, socket, onGone) {
|
|
36
|
+
const session = redis.createSession();
|
|
37
|
+
const parser = new RespParser();
|
|
38
|
+
const pending = [];
|
|
39
|
+
let pumping = false;
|
|
40
|
+
const write = (reply) => {
|
|
41
|
+
if (!socket.destroyed) socket.write(encodeReply(reply, session.protocol));
|
|
42
|
+
};
|
|
43
|
+
session.onPush = write;
|
|
44
|
+
const stop = redis.onDisconnect((dropped) => {
|
|
45
|
+
if (dropped === session) socket.destroy();
|
|
46
|
+
});
|
|
47
|
+
const finish = () => {
|
|
48
|
+
session.dead = true;
|
|
49
|
+
stop();
|
|
50
|
+
onGone();
|
|
51
|
+
};
|
|
52
|
+
socket.on("data", (chunk) => {
|
|
53
|
+
for (const reply of parser.push(chunk)) {
|
|
54
|
+
const command = asCommand(reply);
|
|
55
|
+
if ("t" in command) {
|
|
56
|
+
write(command);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
pending.push(command);
|
|
60
|
+
}
|
|
61
|
+
void pump();
|
|
62
|
+
});
|
|
63
|
+
const pump = async () => {
|
|
64
|
+
if (pumping) return;
|
|
65
|
+
pumping = true;
|
|
66
|
+
try {
|
|
67
|
+
while (pending.length > 0) {
|
|
68
|
+
const command = pending.shift();
|
|
69
|
+
if (!command) break;
|
|
70
|
+
try {
|
|
71
|
+
const reply = await redis.perform(session, command.name, command.args);
|
|
72
|
+
write(reply);
|
|
73
|
+
if (session.quit) {
|
|
74
|
+
socket.end();
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
} catch (error) {
|
|
78
|
+
if (error instanceof RedisConnectionError) {
|
|
79
|
+
socket.destroy();
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
socket.destroy();
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} finally {
|
|
87
|
+
pumping = false;
|
|
88
|
+
if (pending.length > 0 && !socket.destroyed) void pump();
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
socket.on("close", finish);
|
|
92
|
+
socket.on("error", finish);
|
|
93
|
+
}
|
|
94
|
+
function shutdown(server, sockets, redis) {
|
|
95
|
+
redis.close();
|
|
96
|
+
for (const socket of sockets) socket.destroy();
|
|
97
|
+
return new Promise((resolve) => {
|
|
98
|
+
server.close(() => resolve());
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
var attachClose;
|
|
102
|
+
var isHealth = (pathname) => {
|
|
103
|
+
const path = pathname.replace(/\/+$/, "") || "/";
|
|
104
|
+
return path === "/health" || /^\/ns\/[^/]+\/health$/.test(path);
|
|
105
|
+
};
|
|
106
|
+
var serveTarget = {
|
|
107
|
+
name: "redis",
|
|
108
|
+
defaultPort: DEFAULT_PORT,
|
|
109
|
+
async create() {
|
|
110
|
+
const redis = createRedis();
|
|
111
|
+
const tcp = await serve(redis, { host: "127.0.0.1", port: 0 });
|
|
112
|
+
const runtime = {
|
|
113
|
+
respPort: tcp.port,
|
|
114
|
+
close: () => tcp.close(),
|
|
115
|
+
fetch: async (request) => {
|
|
116
|
+
if (isHealth(new URL(request.url).pathname)) {
|
|
117
|
+
return Response.json({ status: "ok", service: "redis" });
|
|
118
|
+
}
|
|
119
|
+
return new Response("not found", { status: 404 });
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
attachClose = (http) => {
|
|
123
|
+
const closeHttp = http.close.bind(http);
|
|
124
|
+
http.close = async () => {
|
|
125
|
+
await runtime.close();
|
|
126
|
+
await closeHttp();
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
return runtime;
|
|
130
|
+
},
|
|
131
|
+
listening(http) {
|
|
132
|
+
attachClose?.(http);
|
|
133
|
+
},
|
|
134
|
+
banner(runtime) {
|
|
135
|
+
return [`resp: redis://127.0.0.1:${runtime.respPort}`];
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export {
|
|
140
|
+
DEFAULT_PORT,
|
|
141
|
+
serve,
|
|
142
|
+
serveTarget
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=chunk-7U5RQF7K.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/server.ts"],
|
|
4
|
+
"sourcesContent": ["import { createServer, type Server, type Socket } from \"node:net\"\nimport { createRedis, type Redis, RedisConnectionError } from \"./engine.ts\"\nimport { asCommand, encodeReply, type Reply, RespParser } from \"./protocol.ts\"\n\n/** HTTP port for `serve --config`. The RESP socket binds an ephemeral port. */\nexport const DEFAULT_PORT = 8827\n\nexport interface ServeOptions {\n port?: number\n host?: string\n}\n\nexport interface RedisListening {\n host: string\n port: number\n close(): Promise<void>\n}\n\nexport function serve(redis: Redis, options: ServeOptions = {}): Promise<RedisListening> {\n const host = options.host ?? \"127.0.0.1\"\n const port = options.port ?? 6379\n const sockets = new Set<Socket>()\n const server = createServer({ keepAlive: true }, (socket) => {\n sockets.add(socket)\n attach(redis, socket, () => sockets.delete(socket))\n })\n return new Promise((resolve, reject) => {\n const fail = (error: Error) => reject(error)\n server.once(\"error\", fail)\n server.listen(port, host, () => {\n server.off(\"error\", fail)\n const address = server.address()\n const actual = address && typeof address === \"object\" ? address.port : port\n resolve({\n host,\n port: actual,\n close: () => shutdown(server, sockets, redis),\n })\n })\n })\n}\n\nfunction attach(redis: Redis, socket: Socket, onGone: () => void): void {\n const session = redis.createSession()\n const parser = new RespParser()\n const pending: Array<{ name: string; args: Uint8Array[] }> = []\n let pumping = false\n const write = (reply: Reply) => {\n if (!socket.destroyed) socket.write(encodeReply(reply, session.protocol))\n }\n session.onPush = write\n const stop = redis.onDisconnect((dropped) => {\n if (dropped === session) socket.destroy()\n })\n const finish = () => {\n session.dead = true\n stop()\n onGone()\n }\n socket.on(\"data\", (chunk: Uint8Array) => {\n for (const reply of parser.push(chunk)) {\n const command = asCommand(reply)\n if (\"t\" in command) {\n write(command)\n continue\n }\n pending.push(command)\n }\n void pump()\n })\n const pump = async () => {\n if (pumping) return\n pumping = true\n try {\n while (pending.length > 0) {\n const command = pending.shift()\n if (!command) break\n try {\n const reply = await redis.perform(session, command.name, command.args)\n write(reply)\n if (session.quit) {\n socket.end()\n break\n }\n } catch (error) {\n if (error instanceof RedisConnectionError) {\n socket.destroy()\n break\n }\n socket.destroy()\n break\n }\n }\n } finally {\n pumping = false\n if (pending.length > 0 && !socket.destroyed) void pump()\n }\n }\n socket.on(\"close\", finish)\n socket.on(\"error\", finish)\n}\n\nfunction shutdown(server: Server, sockets: Set<Socket>, redis: Redis): Promise<void> {\n redis.close()\n for (const socket of sockets) socket.destroy()\n return new Promise((resolve) => {\n server.close(() => resolve())\n })\n}\n\ntype FleetRuntime = {\n fetch(request: Request): Promise<Response>\n respPort: number\n close(): Promise<void>\n}\n\ntype HttpListening = {\n close(): Promise<void>\n}\n\nlet attachClose: ((http: HttpListening) => void) | undefined\n\nconst isHealth = (pathname: string): boolean => {\n const path = pathname.replace(/\\/+$/, \"\") || \"/\"\n return path === \"/health\" || /^\\/ns\\/[^/]+\\/health$/.test(path)\n}\n\n/**\n * Fleet entry for `serve --config`. HTTP `GET /health` reports `service: redis`.\n * RESP listens on an ephemeral port named in the startup banner.\n */\nexport const serveTarget = {\n name: \"redis\",\n defaultPort: DEFAULT_PORT,\n async create(): Promise<FleetRuntime> {\n const redis = createRedis()\n const tcp = await serve(redis, { host: \"127.0.0.1\", port: 0 })\n const runtime: FleetRuntime = {\n respPort: tcp.port,\n close: () => tcp.close(),\n fetch: async (request: Request) => {\n if (isHealth(new URL(request.url).pathname)) {\n return Response.json({ status: \"ok\", service: \"redis\" })\n }\n return new Response(\"not found\", { status: 404 })\n },\n }\n attachClose = (http) => {\n const closeHttp = http.close.bind(http)\n http.close = async () => {\n await runtime.close()\n await closeHttp()\n }\n }\n return runtime\n },\n listening(http: HttpListening) {\n attachClose?.(http)\n },\n banner(runtime: FleetRuntime) {\n return [`resp: redis://127.0.0.1:${runtime.respPort}`]\n },\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAAA,SAAS,oBAA8C;AAKhD,IAAM,eAAe;AAarB,SAAS,MAAM,OAAc,UAAwB,CAAC,GAA4B;AACvF,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,SAAS,aAAa,EAAE,WAAW,KAAK,GAAG,CAAC,WAAW;AAC3D,YAAQ,IAAI,MAAM;AAClB,WAAO,OAAO,QAAQ,MAAM,QAAQ,OAAO,MAAM,CAAC;AAAA,EACpD,CAAC;AACD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,OAAO,CAAC,UAAiB,OAAO,KAAK;AAC3C,WAAO,KAAK,SAAS,IAAI;AACzB,WAAO,OAAO,MAAM,MAAM,MAAM;AAC9B,aAAO,IAAI,SAAS,IAAI;AACxB,YAAM,UAAU,OAAO,QAAQ;AAC/B,YAAM,SAAS,WAAW,OAAO,YAAY,WAAW,QAAQ,OAAO;AACvE,cAAQ;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,OAAO,MAAM,SAAS,QAAQ,SAAS,KAAK;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,OAAO,OAAc,QAAgB,QAA0B;AACtE,QAAM,UAAU,MAAM,cAAc;AACpC,QAAM,SAAS,IAAI,WAAW;AAC9B,QAAM,UAAuD,CAAC;AAC9D,MAAI,UAAU;AACd,QAAM,QAAQ,CAAC,UAAiB;AAC9B,QAAI,CAAC,OAAO,UAAW,QAAO,MAAM,YAAY,OAAO,QAAQ,QAAQ,CAAC;AAAA,EAC1E;AACA,UAAQ,SAAS;AACjB,QAAM,OAAO,MAAM,aAAa,CAAC,YAAY;AAC3C,QAAI,YAAY,QAAS,QAAO,QAAQ;AAAA,EAC1C,CAAC;AACD,QAAM,SAAS,MAAM;AACnB,YAAQ,OAAO;AACf,SAAK;AACL,WAAO;AAAA,EACT;AACA,SAAO,GAAG,QAAQ,CAAC,UAAsB;AACvC,eAAW,SAAS,OAAO,KAAK,KAAK,GAAG;AACtC,YAAM,UAAU,UAAU,KAAK;AAC/B,UAAI,OAAO,SAAS;AAClB,cAAM,OAAO;AACb;AAAA,MACF;AACA,cAAQ,KAAK,OAAO;AAAA,IACtB;AACA,SAAK,KAAK;AAAA,EACZ,CAAC;AACD,QAAM,OAAO,YAAY;AACvB,QAAI,QAAS;AACb,cAAU;AACV,QAAI;AACF,aAAO,QAAQ,SAAS,GAAG;AACzB,cAAM,UAAU,QAAQ,MAAM;AAC9B,YAAI,CAAC,QAAS;AACd,YAAI;AACF,gBAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,QAAQ,MAAM,QAAQ,IAAI;AACrE,gBAAM,KAAK;AACX,cAAI,QAAQ,MAAM;AAChB,mBAAO,IAAI;AACX;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,cAAI,iBAAiB,sBAAsB;AACzC,mBAAO,QAAQ;AACf;AAAA,UACF;AACA,iBAAO,QAAQ;AACf;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,gBAAU;AACV,UAAI,QAAQ,SAAS,KAAK,CAAC,OAAO,UAAW,MAAK,KAAK;AAAA,IACzD;AAAA,EACF;AACA,SAAO,GAAG,SAAS,MAAM;AACzB,SAAO,GAAG,SAAS,MAAM;AAC3B;AAEA,SAAS,SAAS,QAAgB,SAAsB,OAA6B;AACnF,QAAM,MAAM;AACZ,aAAW,UAAU,QAAS,QAAO,QAAQ;AAC7C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAO,MAAM,MAAM,QAAQ,CAAC;AAAA,EAC9B,CAAC;AACH;AAYA,IAAI;AAEJ,IAAM,WAAW,CAAC,aAA8B;AAC9C,QAAM,OAAO,SAAS,QAAQ,QAAQ,EAAE,KAAK;AAC7C,SAAO,SAAS,aAAa,wBAAwB,KAAK,IAAI;AAChE;AAMO,IAAM,cAAc;AAAA,EACzB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM,SAAgC;AACpC,UAAM,QAAQ,YAAY;AAC1B,UAAM,MAAM,MAAM,MAAM,OAAO,EAAE,MAAM,aAAa,MAAM,EAAE,CAAC;AAC7D,UAAM,UAAwB;AAAA,MAC5B,UAAU,IAAI;AAAA,MACd,OAAO,MAAM,IAAI,MAAM;AAAA,MACvB,OAAO,OAAO,YAAqB;AACjC,YAAI,SAAS,IAAI,IAAI,QAAQ,GAAG,EAAE,QAAQ,GAAG;AAC3C,iBAAO,SAAS,KAAK,EAAE,QAAQ,MAAM,SAAS,QAAQ,CAAC;AAAA,QACzD;AACA,eAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA,MAClD;AAAA,IACF;AACA,kBAAc,CAAC,SAAS;AACtB,YAAM,YAAY,KAAK,MAAM,KAAK,IAAI;AACtC,WAAK,QAAQ,YAAY;AACvB,cAAM,QAAQ,MAAM;AACpB,cAAM,UAAU;AAAA,MAClB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,UAAU,MAAqB;AAC7B,kBAAc,IAAI;AAAA,EACpB;AAAA,EACA,OAAO,SAAuB;AAC5B,WAAO,CAAC,2BAA2B,QAAQ,QAAQ,EAAE;AAAA,EACvD;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-BIMEYU5A.js.map
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "./chunk-BIMEYU5A.js";
|
|
3
|
+
import {
|
|
4
|
+
serve
|
|
5
|
+
} from "./chunk-7U5RQF7K.js";
|
|
6
|
+
import {
|
|
7
|
+
createRedis
|
|
8
|
+
} from "./chunk-4HDEOTYJ.js";
|
|
9
|
+
|
|
10
|
+
// src/cli.ts
|
|
11
|
+
var usage = "mockingbird-redis [--port <n>] [--host <h>] [--password <p>]";
|
|
12
|
+
var args = process.argv.slice(2);
|
|
13
|
+
var port = 6379;
|
|
14
|
+
var host = "127.0.0.1";
|
|
15
|
+
var password;
|
|
16
|
+
for (let i = 0; i < args.length; i++) {
|
|
17
|
+
const flag = args[i];
|
|
18
|
+
const next = args[i + 1];
|
|
19
|
+
if (flag === "--help" || flag === "-h") {
|
|
20
|
+
console.log(usage);
|
|
21
|
+
process.exit(0);
|
|
22
|
+
}
|
|
23
|
+
if (flag === "--port" || flag === "--host" || flag === "--password") {
|
|
24
|
+
if (next === void 0) {
|
|
25
|
+
console.error(`${flag} requires a value`);
|
|
26
|
+
process.exit(2);
|
|
27
|
+
}
|
|
28
|
+
i++;
|
|
29
|
+
if (flag === "--port") port = Number(next);
|
|
30
|
+
else if (flag === "--host") host = next;
|
|
31
|
+
else password = next;
|
|
32
|
+
} else {
|
|
33
|
+
console.error(usage);
|
|
34
|
+
process.exit(2);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
var redis = createRedis(password === void 0 ? {} : { password });
|
|
38
|
+
var listening = await serve(redis, { port, host });
|
|
39
|
+
console.log(`redis://${listening.host}:${listening.port}`);
|
|
40
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\nimport { createRedis } from \"./index.ts\"\nimport { serve } from \"./server.ts\"\n\nconst usage = \"mockingbird-redis [--port <n>] [--host <h>] [--password <p>]\"\nconst args = process.argv.slice(2)\nlet port = 6379\nlet host = \"127.0.0.1\"\nlet password: string | undefined\n\nfor (let i = 0; i < args.length; i++) {\n const flag = args[i]\n const next = args[i + 1]\n if (flag === \"--help\" || flag === \"-h\") {\n console.log(usage)\n process.exit(0)\n }\n if (flag === \"--port\" || flag === \"--host\" || flag === \"--password\") {\n if (next === undefined) {\n console.error(`${flag} requires a value`)\n process.exit(2)\n }\n i++\n if (flag === \"--port\") port = Number(next)\n else if (flag === \"--host\") host = next\n else password = next\n } else {\n console.error(usage)\n process.exit(2)\n }\n}\n\nconst redis = createRedis(password === undefined ? {} : { password })\nconst listening = await serve(redis, { port, host })\nconsole.log(`redis://${listening.host}:${listening.port}`)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;AAIA,IAAM,QAAQ;AACd,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAI,OAAO;AACX,IAAI,OAAO;AACX,IAAI;AAEJ,SAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAM,OAAO,KAAK,CAAC;AACnB,QAAM,OAAO,KAAK,IAAI,CAAC;AACvB,MAAI,SAAS,YAAY,SAAS,MAAM;AACtC,YAAQ,IAAI,KAAK;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,SAAS,YAAY,SAAS,YAAY,SAAS,cAAc;AACnE,QAAI,SAAS,QAAW;AACtB,cAAQ,MAAM,GAAG,IAAI,mBAAmB;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AACA,QAAI,SAAS,SAAU,QAAO,OAAO,IAAI;AAAA,aAChC,SAAS,SAAU,QAAO;AAAA,QAC9B,YAAW;AAAA,EAClB,OAAO;AACL,YAAQ,MAAM,KAAK;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,IAAM,QAAQ,YAAY,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS,CAAC;AACpE,IAAM,YAAY,MAAM,MAAM,OAAO,EAAE,MAAM,KAAK,CAAC;AACnD,QAAQ,IAAI,WAAW,UAAU,IAAI,IAAI,UAAU,IAAI,EAAE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
interface RedisClock {
|
|
2
|
+
now(): number;
|
|
3
|
+
advance(ms: number): void;
|
|
4
|
+
subscribe(listener: () => void): () => void;
|
|
5
|
+
readonly manual: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare function manualClock(start?: number): RedisClock;
|
|
8
|
+
declare function wallClock(): RedisClock;
|
|
9
|
+
|
|
10
|
+
type Protocol = 2 | 3;
|
|
11
|
+
type Reply = {
|
|
12
|
+
t: "simple";
|
|
13
|
+
v: string;
|
|
14
|
+
} | {
|
|
15
|
+
t: "error";
|
|
16
|
+
v: string;
|
|
17
|
+
} | {
|
|
18
|
+
t: "int";
|
|
19
|
+
v: number | bigint;
|
|
20
|
+
} | {
|
|
21
|
+
t: "bulk";
|
|
22
|
+
v: Uint8Array | null;
|
|
23
|
+
} | {
|
|
24
|
+
t: "array";
|
|
25
|
+
v: Reply[] | null;
|
|
26
|
+
} | {
|
|
27
|
+
t: "null";
|
|
28
|
+
} | {
|
|
29
|
+
t: "bool";
|
|
30
|
+
v: boolean;
|
|
31
|
+
} | {
|
|
32
|
+
t: "double";
|
|
33
|
+
v: number;
|
|
34
|
+
} | {
|
|
35
|
+
t: "map";
|
|
36
|
+
v: Array<[Reply, Reply]>;
|
|
37
|
+
} | {
|
|
38
|
+
t: "push";
|
|
39
|
+
v: Reply[];
|
|
40
|
+
};
|
|
41
|
+
declare function encodeReply(reply: Reply, protocol?: Protocol): Uint8Array;
|
|
42
|
+
|
|
43
|
+
declare class RedisConnectionError extends Error {
|
|
44
|
+
constructor(message: string);
|
|
45
|
+
}
|
|
46
|
+
declare class RedisReplyError extends Error {
|
|
47
|
+
constructor(message: string);
|
|
48
|
+
}
|
|
49
|
+
interface RedisUser {
|
|
50
|
+
name: string;
|
|
51
|
+
password: string;
|
|
52
|
+
readOnly?: boolean;
|
|
53
|
+
}
|
|
54
|
+
interface RedisOptions {
|
|
55
|
+
clock?: RedisClock;
|
|
56
|
+
databases?: number;
|
|
57
|
+
password?: string;
|
|
58
|
+
users?: RedisUser[];
|
|
59
|
+
maxmemory?: number;
|
|
60
|
+
maxmemoryPolicy?: "noeviction" | "allkeys-lru";
|
|
61
|
+
seed?: number;
|
|
62
|
+
}
|
|
63
|
+
type RedisFault = "readonly" | "oom" | "busy" | "disconnect" | "timeout" | {
|
|
64
|
+
latencyMs: number;
|
|
65
|
+
} | null;
|
|
66
|
+
interface Session {
|
|
67
|
+
id: number;
|
|
68
|
+
db: number;
|
|
69
|
+
protocol: 2 | 3;
|
|
70
|
+
name: string;
|
|
71
|
+
libName: string;
|
|
72
|
+
libVer: string;
|
|
73
|
+
authenticated: boolean;
|
|
74
|
+
username: string;
|
|
75
|
+
readOnly: boolean;
|
|
76
|
+
multi: Array<{
|
|
77
|
+
name: string;
|
|
78
|
+
args: Uint8Array[];
|
|
79
|
+
}> | null;
|
|
80
|
+
multiFailed: boolean;
|
|
81
|
+
watching: Array<{
|
|
82
|
+
db: number;
|
|
83
|
+
key: string;
|
|
84
|
+
gen: number;
|
|
85
|
+
}>;
|
|
86
|
+
channels: Set<string>;
|
|
87
|
+
patterns: Set<string>;
|
|
88
|
+
dead: boolean;
|
|
89
|
+
quit: boolean;
|
|
90
|
+
inExec: boolean;
|
|
91
|
+
onPush: (reply: Reply) => void;
|
|
92
|
+
}
|
|
93
|
+
declare class Redis {
|
|
94
|
+
readonly clock: RedisClock;
|
|
95
|
+
private readonly dbs;
|
|
96
|
+
private readonly password;
|
|
97
|
+
private readonly users;
|
|
98
|
+
private readonly authRequired;
|
|
99
|
+
readonly maxmemory: number;
|
|
100
|
+
private policy;
|
|
101
|
+
private rngState;
|
|
102
|
+
private faultValue;
|
|
103
|
+
private tail;
|
|
104
|
+
private sessions;
|
|
105
|
+
private nextClientId;
|
|
106
|
+
private waiters;
|
|
107
|
+
private channelSubs;
|
|
108
|
+
private patternSubs;
|
|
109
|
+
private scripts;
|
|
110
|
+
private invoked;
|
|
111
|
+
private scriptDepth;
|
|
112
|
+
private commandCount;
|
|
113
|
+
private closed;
|
|
114
|
+
consumersPaused: boolean;
|
|
115
|
+
private readonly disconnectListeners;
|
|
116
|
+
constructor(options?: RedisOptions);
|
|
117
|
+
client(): RedisClient;
|
|
118
|
+
advance(ms: number): void;
|
|
119
|
+
fault(value: RedisFault): void;
|
|
120
|
+
pauseConsumers(paused?: boolean): void;
|
|
121
|
+
waiterCount(): number;
|
|
122
|
+
inspect(db?: number): Array<{
|
|
123
|
+
key: string;
|
|
124
|
+
type: string;
|
|
125
|
+
pttl: number;
|
|
126
|
+
}>;
|
|
127
|
+
reset(): void;
|
|
128
|
+
close(): void;
|
|
129
|
+
onDisconnect(listener: (session: Session) => void): () => void;
|
|
130
|
+
createSession(): Session;
|
|
131
|
+
perform(session: Session, name: string, args: Uint8Array[]): Promise<Reply>;
|
|
132
|
+
private enqueue;
|
|
133
|
+
private applyLatency;
|
|
134
|
+
private dropSession;
|
|
135
|
+
private sessionOf;
|
|
136
|
+
private database;
|
|
137
|
+
private random;
|
|
138
|
+
private memory;
|
|
139
|
+
private dispatch;
|
|
140
|
+
private execCmd;
|
|
141
|
+
private guardWrite;
|
|
142
|
+
private cmdPing;
|
|
143
|
+
private cmdAuth;
|
|
144
|
+
private cmdHello;
|
|
145
|
+
private cmdSelect;
|
|
146
|
+
private cmdReset;
|
|
147
|
+
private cmdClient;
|
|
148
|
+
private clientInfo;
|
|
149
|
+
private info;
|
|
150
|
+
private keyspaceLines;
|
|
151
|
+
private cmdTime;
|
|
152
|
+
private cmdConfig;
|
|
153
|
+
private cmdRandomKey;
|
|
154
|
+
private cmdScan;
|
|
155
|
+
private cmdKeys;
|
|
156
|
+
private cmdType;
|
|
157
|
+
private cmdExists;
|
|
158
|
+
private cmdDel;
|
|
159
|
+
private cmdRename;
|
|
160
|
+
private cmdExpire;
|
|
161
|
+
private cmdTtl;
|
|
162
|
+
private cmdPersist;
|
|
163
|
+
private stringAt;
|
|
164
|
+
private cmdGet;
|
|
165
|
+
private cmdSet;
|
|
166
|
+
private cmdMget;
|
|
167
|
+
private cmdMset;
|
|
168
|
+
private cmdAppend;
|
|
169
|
+
private cmdStrlen;
|
|
170
|
+
private cmdGetRange;
|
|
171
|
+
private cmdSetRange;
|
|
172
|
+
private cmdIncr;
|
|
173
|
+
private cmdIncrBy;
|
|
174
|
+
private addInteger;
|
|
175
|
+
private cmdIncrByFloat;
|
|
176
|
+
private cmdGetDel;
|
|
177
|
+
private cmdGetEx;
|
|
178
|
+
private requireHash;
|
|
179
|
+
private cmdHash;
|
|
180
|
+
private requireList;
|
|
181
|
+
private cmdList;
|
|
182
|
+
private cmdBlockingList;
|
|
183
|
+
private takeList;
|
|
184
|
+
private requireSet;
|
|
185
|
+
private cmdSetFamily;
|
|
186
|
+
private requireZset;
|
|
187
|
+
private cmdZset;
|
|
188
|
+
private cmdZadd;
|
|
189
|
+
private cmdZrange;
|
|
190
|
+
private cmdBlockingZset;
|
|
191
|
+
private takeZset;
|
|
192
|
+
private cmdStream;
|
|
193
|
+
private stream;
|
|
194
|
+
private cmdXadd;
|
|
195
|
+
private nextId;
|
|
196
|
+
private cmdXrange;
|
|
197
|
+
private cmdXdel;
|
|
198
|
+
private cmdXtrim;
|
|
199
|
+
private cmdXgroup;
|
|
200
|
+
private cmdXread;
|
|
201
|
+
private readStreams;
|
|
202
|
+
private cmdXack;
|
|
203
|
+
private cmdXpending;
|
|
204
|
+
private cmdXclaim;
|
|
205
|
+
private cmdXinfo;
|
|
206
|
+
private cmdSub;
|
|
207
|
+
private cmdPublish;
|
|
208
|
+
private cmdPubsub;
|
|
209
|
+
private cmdExec;
|
|
210
|
+
private cmdDiscard;
|
|
211
|
+
private cmdWatch;
|
|
212
|
+
private cmdEval;
|
|
213
|
+
private cmdScript;
|
|
214
|
+
private runScript;
|
|
215
|
+
private luaDispatch;
|
|
216
|
+
private block;
|
|
217
|
+
private wake;
|
|
218
|
+
private wakeAll;
|
|
219
|
+
private satisfy;
|
|
220
|
+
private finishWaiter;
|
|
221
|
+
private failWaiter;
|
|
222
|
+
private leavePubsub;
|
|
223
|
+
}
|
|
224
|
+
declare class RedisClient {
|
|
225
|
+
private readonly redis;
|
|
226
|
+
private readonly session;
|
|
227
|
+
constructor(redis: Redis, session: Session);
|
|
228
|
+
get protocol(): 2 | 3;
|
|
229
|
+
onPush(listener: (reply: Reply) => void): void;
|
|
230
|
+
call(command: string, ...args: Array<string | number | Uint8Array>): Promise<unknown>;
|
|
231
|
+
raw(command: string, ...args: Array<string | number | Uint8Array>): Promise<Reply>;
|
|
232
|
+
pipeline(): RedisPipeline;
|
|
233
|
+
quit(): Promise<string>;
|
|
234
|
+
}
|
|
235
|
+
declare class RedisPipeline {
|
|
236
|
+
private readonly client;
|
|
237
|
+
private readonly commands;
|
|
238
|
+
constructor(client: RedisClient);
|
|
239
|
+
call(name: string, ...args: Array<string | number | Uint8Array>): this;
|
|
240
|
+
exec(): Promise<unknown[]>;
|
|
241
|
+
}
|
|
242
|
+
declare function createRedis(options?: RedisOptions): Redis;
|
|
243
|
+
|
|
244
|
+
export { Redis, RedisClient, RedisConnectionError, RedisPipeline, RedisReplyError, createRedis, encodeReply, manualClock, wallClock };
|
|
245
|
+
export type { RedisClock, RedisFault, RedisOptions, RedisUser, Reply };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import "./chunk-BIMEYU5A.js";
|
|
2
|
+
import {
|
|
3
|
+
Redis,
|
|
4
|
+
RedisClient,
|
|
5
|
+
RedisConnectionError,
|
|
6
|
+
RedisPipeline,
|
|
7
|
+
RedisReplyError,
|
|
8
|
+
createRedis,
|
|
9
|
+
encodeReply,
|
|
10
|
+
manualClock,
|
|
11
|
+
wallClock
|
|
12
|
+
} from "./chunk-4HDEOTYJ.js";
|
|
13
|
+
export {
|
|
14
|
+
Redis,
|
|
15
|
+
RedisClient,
|
|
16
|
+
RedisConnectionError,
|
|
17
|
+
RedisPipeline,
|
|
18
|
+
RedisReplyError,
|
|
19
|
+
createRedis,
|
|
20
|
+
encodeReply,
|
|
21
|
+
manualClock,
|
|
22
|
+
wallClock
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=index.js.map
|