You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-12-12 21:21:15 +03:00
* introduce global interceptors * move proxy stuff to new folder * implement resp framer * properly handle request/response and push * add global interceptor
44 lines
1.0 KiB
TypeScript
44 lines
1.0 KiB
TypeScript
import { EventEmitter } from "node:events";
|
|
import RespFramer from "./resp-framer";
|
|
import { Socket } from "node:net";
|
|
|
|
interface Request {
|
|
resolve: (data: Buffer) => void;
|
|
reject: (reason: any) => void;
|
|
}
|
|
|
|
export default class RespQueue extends EventEmitter {
|
|
queue: Request[] = [];
|
|
respFramer: RespFramer = new RespFramer();
|
|
|
|
constructor(private serverSocket: Socket) {
|
|
super();
|
|
this.respFramer.on("message", (msg) => this.handleMessage(msg));
|
|
this.serverSocket.on("data", (data) => this.respFramer.write(data));
|
|
}
|
|
|
|
handleMessage(data: Buffer) {
|
|
const request = this.queue.shift();
|
|
if (request) {
|
|
request.resolve(data);
|
|
} else {
|
|
this.emit("push", data);
|
|
}
|
|
}
|
|
|
|
request(data: Buffer): Promise<Buffer> {
|
|
let resolve: (data: Buffer) => void;
|
|
let reject: (reason: any) => void;
|
|
|
|
const promise = new Promise<Buffer>((rs, rj) => {
|
|
resolve = rs;
|
|
reject = rj;
|
|
});
|
|
|
|
//@ts-ignore
|
|
this.queue.push({ resolve, reject });
|
|
this.serverSocket.write(data);
|
|
return promise;
|
|
}
|
|
}
|