redux-cluster 1.10.0 → 2.0.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.
Files changed (57) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +345 -471
  3. package/dist/cjs/core/backup.d.ts +10 -0
  4. package/dist/cjs/core/backup.d.ts.map +1 -0
  5. package/dist/cjs/core/backup.js +166 -0
  6. package/dist/cjs/core/redux-cluster.d.ts +47 -0
  7. package/dist/cjs/core/redux-cluster.d.ts.map +1 -0
  8. package/dist/cjs/core/redux-cluster.js +370 -0
  9. package/dist/cjs/index.d.ts +22 -0
  10. package/dist/cjs/index.d.ts.map +1 -0
  11. package/dist/cjs/index.js +43 -0
  12. package/dist/cjs/network/client.d.ts +23 -0
  13. package/dist/cjs/network/client.d.ts.map +1 -0
  14. package/dist/cjs/network/client.js +251 -0
  15. package/dist/cjs/network/server.d.ts +39 -0
  16. package/dist/cjs/network/server.d.ts.map +1 -0
  17. package/dist/cjs/network/server.js +440 -0
  18. package/dist/cjs/package.json +1 -0
  19. package/dist/cjs/types/index.d.ts +125 -0
  20. package/dist/cjs/types/index.d.ts.map +1 -0
  21. package/dist/cjs/types/index.js +20 -0
  22. package/dist/cjs/utils/crypto.d.ts +22 -0
  23. package/dist/cjs/utils/crypto.d.ts.map +1 -0
  24. package/dist/cjs/utils/crypto.js +404 -0
  25. package/dist/esm/core/backup.d.ts +10 -0
  26. package/dist/esm/core/backup.d.ts.map +1 -0
  27. package/dist/esm/core/backup.js +129 -0
  28. package/dist/esm/core/redux-cluster.d.ts +47 -0
  29. package/dist/esm/core/redux-cluster.d.ts.map +1 -0
  30. package/dist/esm/core/redux-cluster.js +363 -0
  31. package/dist/esm/index.d.ts +22 -0
  32. package/dist/esm/index.d.ts.map +1 -0
  33. package/dist/esm/index.js +25 -0
  34. package/dist/esm/network/client.d.ts +23 -0
  35. package/dist/esm/network/client.d.ts.map +1 -0
  36. package/dist/esm/network/client.js +214 -0
  37. package/dist/esm/network/server.d.ts +39 -0
  38. package/dist/esm/network/server.d.ts.map +1 -0
  39. package/dist/esm/network/server.js +403 -0
  40. package/dist/esm/package.json +1 -0
  41. package/dist/esm/types/index.d.ts +125 -0
  42. package/dist/esm/types/index.d.ts.map +1 -0
  43. package/dist/esm/types/index.js +17 -0
  44. package/dist/esm/utils/crypto.d.ts +22 -0
  45. package/dist/esm/utils/crypto.d.ts.map +1 -0
  46. package/dist/esm/utils/crypto.js +351 -0
  47. package/package.json +115 -34
  48. package/index.js +0 -678
  49. package/test.auto.js +0 -94
  50. package/test.auto.proc1.js +0 -97
  51. package/test.auto.proc2.js +0 -85
  52. package/test.visual.client.highload.js +0 -102
  53. package/test.visual.client.js +0 -103
  54. package/test.visual.error.js +0 -45
  55. package/test.visual.js +0 -97
  56. package/test.visual.server.highload.js +0 -102
  57. package/test.visual.server.js +0 -103
@@ -0,0 +1,440 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ClusterServer = void 0;
37
+ const net = __importStar(require("net"));
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const fs = __importStar(require("fs"));
41
+ const zlib = __importStar(require("zlib"));
42
+ const stream = __importStar(require("stream"));
43
+ const crypto = __importStar(require("crypto"));
44
+ const types_1 = require("../types");
45
+ const crypto_1 = require("../utils/crypto");
46
+ class ClusterServer {
47
+ constructor(store, settings = {}) {
48
+ this.store = store;
49
+ this.settings = settings;
50
+ this.sockets = {};
51
+ this.database = {};
52
+ this.ip2ban = {};
53
+ this.ip2banTimeout = 10800000; // 3 hours
54
+ this.shouldAutoRestart = true;
55
+ this.uid = crypto.randomUUID();
56
+ this.setupDatabase();
57
+ this.setupBanSystem();
58
+ this.setupServer();
59
+ this.setupStoreIntegration();
60
+ this.ip2banGC = setInterval(() => {
61
+ this.cleanupBannedIPs();
62
+ }, 60000);
63
+ }
64
+ setupDatabase() {
65
+ if (this.settings.logins) {
66
+ for (const login in this.settings.logins) {
67
+ const hashedLogin = (0, crypto_1.hasher)(`REDUX_CLUSTER${login}`);
68
+ const hashedPassword = (0, crypto_1.hasher)(`REDUX_CLUSTER${this.settings.logins[login]}`);
69
+ if (hashedLogin && hashedPassword) {
70
+ this.database[hashedLogin] = hashedPassword;
71
+ }
72
+ }
73
+ }
74
+ }
75
+ setupBanSystem() {
76
+ // IP ban system is initialized in constructor
77
+ }
78
+ cleanupBannedIPs() {
79
+ const now = Date.now();
80
+ for (const key in this.ip2ban) {
81
+ if (this.ip2ban[key].time + this.ip2banTimeout < now) {
82
+ delete this.ip2ban[key];
83
+ }
84
+ }
85
+ }
86
+ setupServer() {
87
+ const listenOptions = this.getListenOptions();
88
+ this.server = net.createServer((socket) => {
89
+ this.handleNewConnection(socket);
90
+ });
91
+ this.server.on("listening", () => {
92
+ this.store.connected = true;
93
+ this.store.sendtoall({
94
+ _msg: types_1.MessageType.CONN_STATUS,
95
+ _hash: this.store.RCHash,
96
+ _connected: true,
97
+ });
98
+ });
99
+ this.server.on("close", () => {
100
+ this.store.connected = false;
101
+ this.store.sendtoall({
102
+ _msg: types_1.MessageType.CONN_STATUS,
103
+ _hash: this.store.RCHash,
104
+ _connected: false,
105
+ });
106
+ this.cleanup();
107
+ // Auto-restart server after 10 seconds
108
+ if (this.shouldAutoRestart) {
109
+ setTimeout(() => {
110
+ new ClusterServer(this.store, this.settings);
111
+ }, 10000);
112
+ }
113
+ });
114
+ this.server.on("error", (err) => {
115
+ this.store.stderr(`ReduxCluster.createServer socket error: ${err.message}`);
116
+ if (typeof this.server.close === "function") {
117
+ this.server.close();
118
+ }
119
+ });
120
+ this.startListening(listenOptions);
121
+ }
122
+ getListenOptions() {
123
+ const defaultOptions = { port: 10001 };
124
+ if (typeof this.settings.path === "string") {
125
+ switch (os.platform()) {
126
+ case "win32":
127
+ return { path: path.join("\\\\?\\pipe", this.settings.path) };
128
+ default:
129
+ return { path: path.join(this.settings.path) };
130
+ }
131
+ }
132
+ const options = { ...defaultOptions };
133
+ if (typeof this.settings.host === "string") {
134
+ options.host = this.settings.host;
135
+ }
136
+ if (typeof this.settings.port === "number") {
137
+ options.port = this.settings.port;
138
+ }
139
+ return options;
140
+ }
141
+ startListening(options) {
142
+ if (typeof options.path === "string") {
143
+ // Remove existing socket file
144
+ fs.unlink(options.path, (err) => {
145
+ if (err &&
146
+ !err.message.toLowerCase().includes("no such file or directory")) {
147
+ this.store.stderr(`ReduxCluster.createServer socket error: ${err.message}`);
148
+ }
149
+ this.server.listen(options);
150
+ });
151
+ }
152
+ else {
153
+ this.server.listen(options);
154
+ }
155
+ }
156
+ handleNewConnection(socket) {
157
+ // Hash IP address for security using hasher function
158
+ const clientIP = socket.remoteAddress ? (0, crypto_1.hasher)(socket.remoteAddress) : "";
159
+ const uid = crypto.randomUUID();
160
+ const clusterSocket = socket;
161
+ clusterSocket.uid = uid;
162
+ // Check if IP is banned
163
+ if (this.isIPBanned(clientIP)) {
164
+ this.rejectConnection(clusterSocket, true);
165
+ return;
166
+ }
167
+ this.setupSocket(clusterSocket, clientIP);
168
+ }
169
+ isIPBanned(ip) {
170
+ if (!ip || !this.ip2ban[ip])
171
+ return false;
172
+ const banInfo = this.ip2ban[ip];
173
+ const now = Date.now();
174
+ return banInfo.count >= 5 && banInfo.time + this.ip2banTimeout > now;
175
+ }
176
+ rejectConnection(socket, banned = false) {
177
+ // Create rejection message
178
+ const rejectionMessage = {
179
+ _msg: types_1.MessageType.SOCKET_AUTH_STATE,
180
+ _hash: this.store.RCHash,
181
+ _value: false,
182
+ ...(banned && { _banned: true }),
183
+ };
184
+ // Manually serialize and compress since custom write is not set up yet
185
+ try {
186
+ const compressed = zlib.gzipSync(Buffer.from(JSON.stringify(rejectionMessage)));
187
+ // Use the native write method directly, not the overridden one
188
+ const originalWrite = socket.writeNEW || socket.write.bind(socket);
189
+ originalWrite(compressed);
190
+ }
191
+ catch (err) {
192
+ this.store.stderr(`ReduxCluster.rejectConnection error: ${err.message}`);
193
+ }
194
+ this.closeSocket(socket);
195
+ }
196
+ setupSocket(socket, clientIP) {
197
+ // Override write method for object mode + compression
198
+ socket.writeNEW = socket.write;
199
+ socket.write = (data) => {
200
+ try {
201
+ const compressed = zlib.gzipSync(Buffer.from(JSON.stringify(data)));
202
+ return socket.writeNEW(compressed);
203
+ }
204
+ catch (err) {
205
+ this.store.stderr(`ReduxCluster.createServer write error: ${err.message}`);
206
+ return false;
207
+ }
208
+ };
209
+ socket.on("error", (err) => {
210
+ this.store.stderr(`ReduxCluster.createServer client error: ${err.message}`);
211
+ this.closeSocket(socket);
212
+ });
213
+ this.setupSocketPipeline(socket, clientIP);
214
+ }
215
+ setupSocketPipeline(socket, clientIP) {
216
+ // Create processing pipeline
217
+ const mbstring = new stream.Transform({
218
+ transform(buffer, encoding, callback) {
219
+ this.push(buffer);
220
+ callback();
221
+ },
222
+ });
223
+ mbstring.setEncoding("utf8");
224
+ const gunzipper = zlib.createGunzip();
225
+ // For now, we'll create a simple parser instead of using external library
226
+ const parser = new stream.Transform({
227
+ transform(chunk, encoding, callback) {
228
+ try {
229
+ const data = JSON.parse(chunk.toString());
230
+ this.push(data);
231
+ }
232
+ catch {
233
+ // Invalid JSON, ignore
234
+ }
235
+ callback();
236
+ },
237
+ objectMode: true,
238
+ });
239
+ const eventHandler = new stream.Writable({
240
+ write: (data, encoding, callback) => {
241
+ this.handleSocketMessage(data, socket, clientIP);
242
+ callback();
243
+ },
244
+ objectMode: true,
245
+ });
246
+ // Setup error handlers
247
+ [gunzipper, mbstring, parser, eventHandler].forEach((stream) => {
248
+ stream.on("error", (err) => {
249
+ this.store.stderr(`ReduxCluster.createServer stream error: ${err.message}`);
250
+ });
251
+ });
252
+ // Connect pipeline
253
+ socket.pipe(gunzipper).pipe(mbstring).pipe(parser).pipe(eventHandler);
254
+ }
255
+ handleSocketMessage(data, socket, clientIP) {
256
+ if (data._hash !== this.store.RCHash)
257
+ return;
258
+ switch (data._msg) {
259
+ case types_1.MessageType.MSG_TO_MASTER:
260
+ if (this.sockets[socket.uid]) {
261
+ if (data._action.type === types_1.MessageType.SYNC &&
262
+ !data._action._internal) {
263
+ throw new Error("Please don't use REDUX_CLUSTER_SYNC action type!");
264
+ }
265
+ // Apply action to server state
266
+ // This will automatically trigger sendActionsToNodes via reducer
267
+ this.store.dispatch(data._action);
268
+ }
269
+ break;
270
+ case types_1.MessageType.START:
271
+ if (this.sockets[socket.uid]) {
272
+ socket.write({
273
+ _msg: types_1.MessageType.MSG_TO_WORKER,
274
+ _hash: this.store.RCHash,
275
+ _action: {
276
+ type: types_1.MessageType.SYNC,
277
+ payload: this.store.getState(),
278
+ _internal: true,
279
+ },
280
+ });
281
+ }
282
+ break;
283
+ case types_1.MessageType.SOCKET_AUTH:
284
+ this.handleAuthentication(data, socket, clientIP);
285
+ break;
286
+ default:
287
+ // Ignore unknown message types
288
+ break;
289
+ }
290
+ }
291
+ handleAuthentication(data, socket, clientIP) {
292
+ const { _login, _password } = data;
293
+ // If no authentication is configured (empty database), allow all connections
294
+ if (Object.keys(this.database).length === 0) {
295
+ // No authentication required
296
+ this.sockets[socket.uid] = socket;
297
+ socket.write({
298
+ _msg: types_1.MessageType.SOCKET_AUTH_STATE,
299
+ _hash: this.store.RCHash,
300
+ _value: true,
301
+ });
302
+ return;
303
+ }
304
+ if (typeof _login !== "undefined" &&
305
+ typeof _password !== "undefined" &&
306
+ typeof this.database[_login] !== "undefined" &&
307
+ this.database[_login] === _password) {
308
+ // Successful authentication
309
+ this.sockets[socket.uid] = socket;
310
+ // Clear ban if exists
311
+ if (clientIP && this.ip2ban[clientIP]) {
312
+ delete this.ip2ban[clientIP];
313
+ }
314
+ // Use the custom write method that should be set up by now
315
+ socket.write({
316
+ _msg: types_1.MessageType.SOCKET_AUTH_STATE,
317
+ _hash: this.store.RCHash,
318
+ _value: true,
319
+ });
320
+ }
321
+ else {
322
+ // Failed authentication
323
+ if (clientIP) {
324
+ this.recordFailedLogin(clientIP);
325
+ }
326
+ // Use the custom write method that should be set up by now
327
+ socket.write({
328
+ _msg: types_1.MessageType.SOCKET_AUTH_STATE,
329
+ _hash: this.store.RCHash,
330
+ _value: false,
331
+ });
332
+ this.closeSocket(socket);
333
+ }
334
+ }
335
+ recordFailedLogin(ip) {
336
+ let count = 0;
337
+ if (this.ip2ban[ip]) {
338
+ count = this.ip2ban[ip].count;
339
+ if (count >= 5)
340
+ count = 0; // Reset on timeout
341
+ }
342
+ this.ip2ban[ip] = {
343
+ time: Date.now(),
344
+ count: count + 1,
345
+ };
346
+ }
347
+ closeSocket(socket) {
348
+ if (typeof socket.end === "function") {
349
+ socket.end();
350
+ }
351
+ if (socket.uid && this.sockets[socket.uid]) {
352
+ delete this.sockets[socket.uid];
353
+ }
354
+ }
355
+ setupStoreIntegration() {
356
+ // Register with store if in action mode
357
+ if (this.store.mode === "action") {
358
+ this.store.allsock[this.uid] = this;
359
+ }
360
+ // Subscribe to store changes in snapshot mode
361
+ this.unsubscribe = this.store.subscribe(() => {
362
+ if (this.store.mode === "snapshot") {
363
+ this.sendtoall();
364
+ }
365
+ });
366
+ }
367
+ sendtoall(message) {
368
+ const msg = message || {
369
+ _msg: types_1.MessageType.MSG_TO_WORKER,
370
+ _hash: this.store.RCHash,
371
+ _action: {
372
+ type: types_1.MessageType.SYNC,
373
+ payload: this.store.getState(),
374
+ _internal: true,
375
+ },
376
+ };
377
+ for (const uid in this.sockets) {
378
+ this.sockets[uid].write(msg);
379
+ }
380
+ }
381
+ ip2banGCStop() {
382
+ clearInterval(this.ip2banGC);
383
+ }
384
+ cleanup() {
385
+ if (this.unsubscribe) {
386
+ this.unsubscribe();
387
+ }
388
+ this.ip2banGCStop();
389
+ delete this.store.allsock[this.uid];
390
+ }
391
+ close() {
392
+ return new Promise((resolve) => {
393
+ // Prevent the automatic restart handler from creating a new server
394
+ this.shouldAutoRestart = false;
395
+ // Close all connected sockets first
396
+ Object.values(this.sockets).forEach((socket) => {
397
+ if (socket) {
398
+ try {
399
+ this.closeSocket(socket);
400
+ }
401
+ catch {
402
+ // ignore
403
+ }
404
+ }
405
+ });
406
+ // Clear sockets registry
407
+ Object.keys(this.sockets).forEach((key) => {
408
+ delete this.sockets[key];
409
+ });
410
+ // Stop IP ban garbage collector
411
+ if (this.ip2banGC) {
412
+ clearInterval(this.ip2banGC);
413
+ }
414
+ // Unsubscribe from store updates
415
+ if (this.unsubscribe) {
416
+ try {
417
+ this.unsubscribe();
418
+ }
419
+ catch {
420
+ // ignore
421
+ }
422
+ this.unsubscribe = undefined;
423
+ }
424
+ // Finally close the server and resolve when closed
425
+ if (this.server && typeof this.server.close === "function") {
426
+ try {
427
+ this.server.close(() => resolve());
428
+ }
429
+ catch {
430
+ // fallback resolve
431
+ resolve();
432
+ }
433
+ }
434
+ else {
435
+ resolve();
436
+ }
437
+ });
438
+ }
439
+ }
440
+ exports.ClusterServer = ClusterServer;
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,125 @@
1
+ import { Store, Action } from "redux";
2
+ export declare enum SerializationMode {
3
+ JSON = "json",
4
+ PROTOOBJECT = "protoobject"
5
+ }
6
+ export interface ReduxClusterConfig {
7
+ serializationMode?: SerializationMode;
8
+ debug?: boolean;
9
+ mode?: SyncMode;
10
+ syncMode?: "ipc" | "tcp";
11
+ role?: Role[];
12
+ server?: ServerSettings;
13
+ client?: ClientSettings;
14
+ backup?: BackupSettings;
15
+ stderr?: ErrorHandler;
16
+ resync?: number;
17
+ }
18
+ export type ProtoObjectState = any;
19
+ export declare enum MessageType {
20
+ CONN_STATUS = "REDUX_CLUSTER_CONNSTATUS",
21
+ MSG_TO_WORKER = "REDUX_CLUSTER_MSGTOWORKER",
22
+ MSG_TO_MASTER = "REDUX_CLUSTER_MSGTOMASTER",
23
+ SOCKET_AUTH = "REDUX_CLUSTER_SOCKET_AUTH",
24
+ SOCKET_AUTH_STATE = "REDUX_CLUSTER_SOCKET_AUTHSTATE",
25
+ START = "REDUX_CLUSTER_START",
26
+ SYNC = "REDUX_CLUSTER_SYNC"
27
+ }
28
+ export interface BaseMessage {
29
+ _msg: MessageType;
30
+ _hash: string;
31
+ }
32
+ export interface ConnectionStatusMessage extends BaseMessage {
33
+ _msg: MessageType.CONN_STATUS;
34
+ _connected: boolean;
35
+ }
36
+ export interface ActionToWorkerMessage extends BaseMessage {
37
+ _msg: MessageType.MSG_TO_WORKER;
38
+ _action: Action;
39
+ }
40
+ export interface ActionToMasterMessage extends BaseMessage {
41
+ _msg: MessageType.MSG_TO_MASTER;
42
+ _action: Action;
43
+ }
44
+ export interface SocketAuthMessage extends BaseMessage {
45
+ _msg: MessageType.SOCKET_AUTH;
46
+ _login: string;
47
+ _password: string;
48
+ }
49
+ export interface SocketAuthStateMessage extends BaseMessage {
50
+ _msg: MessageType.SOCKET_AUTH_STATE;
51
+ _value: boolean;
52
+ _banned?: boolean;
53
+ }
54
+ export interface StartMessage extends BaseMessage {
55
+ _msg: MessageType.START;
56
+ }
57
+ export type ClusterMessage = ConnectionStatusMessage | ActionToWorkerMessage | ActionToMasterMessage | SocketAuthMessage | SocketAuthStateMessage | StartMessage;
58
+ export type SyncMode = "action" | "snapshot";
59
+ export type Role = "master" | "worker" | "server" | "client";
60
+ export interface ServerSettings {
61
+ host?: string;
62
+ port?: number;
63
+ path?: string;
64
+ logins?: Record<string, string>;
65
+ }
66
+ export interface ClientSettings {
67
+ host?: string;
68
+ port?: number;
69
+ path?: string;
70
+ login?: string;
71
+ password?: string;
72
+ }
73
+ export interface BackupSettings {
74
+ path: string;
75
+ key?: string;
76
+ timeout?: number;
77
+ count?: number;
78
+ }
79
+ export interface ReduxClusterStore<S = any, A extends Action = Action> extends Store<S, A> {
80
+ readonly RCHash: string;
81
+ readonly version: string;
82
+ readonly homepage: string;
83
+ readonly role: Role[];
84
+ connected: boolean;
85
+ mode: SyncMode;
86
+ resync: number;
87
+ stderr: (message: string) => void;
88
+ readonly config: ReduxClusterConfig;
89
+ createServer(settings?: ServerSettings): ClusterServer;
90
+ createClient(settings?: ClientSettings): ClusterClient;
91
+ backup(settings: BackupSettings): Promise<boolean>;
92
+ sendtoall(message?: ClusterMessage): void;
93
+ sendtoallsock(message?: ClusterMessage): void;
94
+ registerClass?(name: string, classConstructor: any): void;
95
+ getRegisteredClasses?(): string[];
96
+ }
97
+ export interface ClusterServer {
98
+ readonly uid: string;
99
+ readonly sockets: Record<string, any>;
100
+ readonly database: Record<string, string>;
101
+ readonly ip2ban: Record<string, {
102
+ time: number;
103
+ count: number;
104
+ }>;
105
+ sendtoall(message?: ClusterMessage): void;
106
+ ip2banGCStop(): void;
107
+ }
108
+ export interface ClusterClient {
109
+ login?: string;
110
+ password?: string;
111
+ }
112
+ export interface ClusterSocket {
113
+ uid: string;
114
+ writeNEW: (data: any) => boolean;
115
+ write(data: any): boolean;
116
+ on(event: string, listener: (...args: any[]) => void): any;
117
+ pipe(...args: any[]): any;
118
+ end(): void;
119
+ remoteAddress?: string;
120
+ }
121
+ export type HasherFunction = (data: string, algorithm?: string) => string | undefined;
122
+ export type EncrypterFunction = (data: string, pass: string) => string;
123
+ export type DecrypterFunction = (data: string, pass: string) => string;
124
+ export type ErrorHandler = (message: string) => void;
125
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageType = exports.SerializationMode = void 0;
4
+ // Serialization modes
5
+ var SerializationMode;
6
+ (function (SerializationMode) {
7
+ SerializationMode["JSON"] = "json";
8
+ SerializationMode["PROTOOBJECT"] = "protoobject";
9
+ })(SerializationMode || (exports.SerializationMode = SerializationMode = {}));
10
+ // Message types for IPC communication
11
+ var MessageType;
12
+ (function (MessageType) {
13
+ MessageType["CONN_STATUS"] = "REDUX_CLUSTER_CONNSTATUS";
14
+ MessageType["MSG_TO_WORKER"] = "REDUX_CLUSTER_MSGTOWORKER";
15
+ MessageType["MSG_TO_MASTER"] = "REDUX_CLUSTER_MSGTOMASTER";
16
+ MessageType["SOCKET_AUTH"] = "REDUX_CLUSTER_SOCKET_AUTH";
17
+ MessageType["SOCKET_AUTH_STATE"] = "REDUX_CLUSTER_SOCKET_AUTHSTATE";
18
+ MessageType["START"] = "REDUX_CLUSTER_START";
19
+ MessageType["SYNC"] = "REDUX_CLUSTER_SYNC";
20
+ })(MessageType || (exports.MessageType = MessageType = {}));
@@ -0,0 +1,22 @@
1
+ import * as crypto from "crypto";
2
+ import { Transform } from "stream";
3
+ import { SerializationMode } from "../types";
4
+ export declare function hasher(input: string): string;
5
+ export declare function createCipher(key: string): crypto.Cipher;
6
+ export declare function createDecipher(key: string, iv: Buffer): crypto.Decipher;
7
+ export declare function encrypter(data: string, password: string): string;
8
+ export declare function decrypter(encryptedData: string, password: string): string;
9
+ export declare function deepClone(obj: any): any;
10
+ export declare function universalClone(obj: any, mode: SerializationMode, _classRegistry?: Map<string, any>): any;
11
+ export declare function protoObjectClone(obj: any): any;
12
+ export declare function universalSerialize(obj: any, mode: SerializationMode, classRegistry?: Map<string, any>): string;
13
+ export declare function universalDeserialize(str: string, mode: SerializationMode, classRegistry?: Map<string, any>): any;
14
+ export declare function serializeProtoObject(obj: any, classRegistry?: Map<string, any>): string;
15
+ export declare function deserializeProtoObject(str: string, classRegistry?: Map<string, any>): any;
16
+ export declare function createClassRegistry(): Map<string, any>;
17
+ export declare function createObjectStreamParser(): Transform | null;
18
+ export declare function createObjectStreamStringifier(): Transform | null;
19
+ export declare function createObjectStream(): Transform | null;
20
+ export declare function createDeserializationStream(mode: SerializationMode, classRegistry?: Map<string, any>): Transform;
21
+ export declare function createSerializationStream(mode: SerializationMode, classRegistry?: Map<string, any>): Transform;
22
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/utils/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAoD7C,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAGD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAGvD;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,QAAQ,CAEvE;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAShE;AAGD,wBAAgB,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWzE;AAGD,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAKvC;AAGD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,iBAAiB,EACvB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAChC,GAAG,CAKL;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAsC9C;AAGD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,iBAAiB,EACvB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAC/B,MAAM,CAMR;AAGD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,iBAAiB,EACvB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAC/B,GAAG,CAML;AAGD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,GAAG,EACR,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAC/B,MAAM,CAmCR;AAGD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAC/B,GAAG,CAqCL;AAGD,wBAAgB,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAEtD;AAKD,wBAAgB,wBAAwB,IAAI,SAAS,GAAG,IAAI,CAK3D;AAGD,wBAAgB,6BAA6B,IAAI,SAAS,GAAG,IAAI,CAKhE;AAGD,wBAAgB,kBAAkB,IAAI,SAAS,GAAG,IAAI,CAErD;AAGD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,iBAAiB,EACvB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAC/B,SAAS,CAuBX;AAGD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,iBAAiB,EACvB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAC/B,SAAS,CAuBX"}