redux-cluster-ws 1.4.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.
- package/FUNDING.yml +7 -0
- package/LICENSE +21 -21
- package/README.md +394 -90
- package/dist/cjs/client.d.ts +43 -0
- package/dist/cjs/client.js +276 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/server.d.ts +31 -0
- package/dist/cjs/server.js +295 -0
- package/dist/cjs/server.js.map +1 -0
- package/dist/cjs/types.d.ts +83 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.d.ts +17 -0
- package/dist/cjs/utils.js +75 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/client.d.ts +43 -0
- package/dist/esm/client.js +282 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/server.d.ts +31 -0
- package/dist/esm/server.js +299 -0
- package/dist/esm/server.js.map +1 -0
- package/dist/esm/types.d.ts +83 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.d.ts +17 -0
- package/dist/esm/utils.js +69 -0
- package/dist/esm/utils.js.map +1 -0
- package/eslint.config.js +143 -0
- package/examples/browser-example.cjs +350 -0
- package/examples/browser.html +255 -0
- package/examples/client.cjs +155 -0
- package/examples/cross-library-browser.html +655 -0
- package/examples/cross-library-client.cjs +190 -0
- package/examples/cross-library-server.cjs +213 -0
- package/examples/server.cjs +96 -0
- package/package.json +96 -18
- package/client.js +0 -192
- package/index.js +0 -12
- package/server.js +0 -173
- package/test.auto.proc1.js +0 -100
- package/test.auto.proc2.js +0 -74
- package/test.visual.client.html +0 -37
- package/test.visual.client.js +0 -63
- package/test.visual.server.js +0 -66
- package/umd/ReduxCluster.js +0 -18
- package/webpack-src.js +0 -6
- package/webpack.config.js +0 -25
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Basic Redux-Cluster-WS Client Example
|
|
5
|
+
*
|
|
6
|
+
* This example demonstrates how to create a WebSocket client
|
|
7
|
+
* that connects to a Redux-Cluster-WS server and synchronizes state.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const { createStore } = require("redux-cluster");
|
|
11
|
+
const { client } = require("../dist/cjs/index.js");
|
|
12
|
+
const readline = require("readline");
|
|
13
|
+
|
|
14
|
+
// Same reducer as server (must be identical for proper synchronization)
|
|
15
|
+
function counterReducer(state = { count: 0, lastUpdate: null }, action) {
|
|
16
|
+
switch (action.type) {
|
|
17
|
+
case "INCREMENT":
|
|
18
|
+
return {
|
|
19
|
+
count: state.count + 1,
|
|
20
|
+
lastUpdate: new Date().toISOString(),
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
case "DECREMENT":
|
|
24
|
+
return {
|
|
25
|
+
count: state.count - 1,
|
|
26
|
+
lastUpdate: new Date().toISOString(),
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
case "RESET":
|
|
30
|
+
return {
|
|
31
|
+
count: 0,
|
|
32
|
+
lastUpdate: new Date().toISOString(),
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
default:
|
|
36
|
+
return state;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
console.log("š Starting Redux-Cluster-WS Client Example...");
|
|
41
|
+
|
|
42
|
+
// Create Redux store
|
|
43
|
+
const store = createStore(counterReducer);
|
|
44
|
+
|
|
45
|
+
// Add WebSocket client capability
|
|
46
|
+
client(store);
|
|
47
|
+
|
|
48
|
+
// Subscribe to state changes
|
|
49
|
+
store.subscribe(() => {
|
|
50
|
+
const state = store.getState();
|
|
51
|
+
console.log(
|
|
52
|
+
`\\nš State synchronized: count=${state.count}, lastUpdate=${state.lastUpdate}`
|
|
53
|
+
);
|
|
54
|
+
showMenu();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Connect to server
|
|
58
|
+
console.log("š Connecting to server...");
|
|
59
|
+
|
|
60
|
+
store.createWSClient({
|
|
61
|
+
host: "ws://localhost",
|
|
62
|
+
port: 8088,
|
|
63
|
+
login: "demo",
|
|
64
|
+
password: "demo",
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Setup interactive menu
|
|
68
|
+
const rl = readline.createInterface({
|
|
69
|
+
input: process.stdin,
|
|
70
|
+
output: process.stdout,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
function showMenu() {
|
|
74
|
+
if (store.connected) {
|
|
75
|
+
console.log("\\nš® Available actions:");
|
|
76
|
+
console.log(" [1] Increment counter");
|
|
77
|
+
console.log(" [2] Decrement counter");
|
|
78
|
+
console.log(" [3] Reset counter");
|
|
79
|
+
console.log(" [4] Show current state");
|
|
80
|
+
console.log(" [q] Quit");
|
|
81
|
+
console.log("");
|
|
82
|
+
process.stdout.write("Choose action: ");
|
|
83
|
+
} else {
|
|
84
|
+
console.log("\\nā³ Waiting for connection...");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
rl.on("line", (input) => {
|
|
89
|
+
const choice = input.trim().toLowerCase();
|
|
90
|
+
|
|
91
|
+
if (!store.connected) {
|
|
92
|
+
console.log("ā Not connected to server yet. Please wait...");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
switch (choice) {
|
|
97
|
+
case "1":
|
|
98
|
+
console.log("ā Sending INCREMENT action...");
|
|
99
|
+
store.dispatch({ type: "INCREMENT" });
|
|
100
|
+
break;
|
|
101
|
+
|
|
102
|
+
case "2":
|
|
103
|
+
console.log("ā Sending DECREMENT action...");
|
|
104
|
+
store.dispatch({ type: "DECREMENT" });
|
|
105
|
+
break;
|
|
106
|
+
|
|
107
|
+
case "3":
|
|
108
|
+
console.log("š Sending RESET action...");
|
|
109
|
+
store.dispatch({ type: "RESET" });
|
|
110
|
+
break;
|
|
111
|
+
|
|
112
|
+
case "4":
|
|
113
|
+
const state = store.getState();
|
|
114
|
+
console.log("\\nš Current state:");
|
|
115
|
+
console.log(JSON.stringify(state, null, 2));
|
|
116
|
+
showMenu();
|
|
117
|
+
break;
|
|
118
|
+
|
|
119
|
+
case "q":
|
|
120
|
+
case "quit":
|
|
121
|
+
case "exit":
|
|
122
|
+
console.log("\\nš Goodbye!");
|
|
123
|
+
process.exit(0);
|
|
124
|
+
break;
|
|
125
|
+
|
|
126
|
+
default:
|
|
127
|
+
console.log("ā Invalid choice. Please try again.");
|
|
128
|
+
showMenu();
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// Handle connection events
|
|
134
|
+
setTimeout(() => {
|
|
135
|
+
if (store.connected) {
|
|
136
|
+
console.log("ā
Connected to server!");
|
|
137
|
+
const state = store.getState();
|
|
138
|
+
console.log(`š Initial state: count=${state.count}`);
|
|
139
|
+
showMenu();
|
|
140
|
+
} else {
|
|
141
|
+
console.log("ā Failed to connect to server.");
|
|
142
|
+
console.log("š” Make sure the server is running on ws://localhost:8080");
|
|
143
|
+
console.log("š” Run: node examples/server.js");
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
}, 2000);
|
|
147
|
+
|
|
148
|
+
// Handle graceful shutdown
|
|
149
|
+
process.on("SIGINT", () => {
|
|
150
|
+
console.log("\\nš Shutting down client...");
|
|
151
|
+
rl.close();
|
|
152
|
+
process.exit(0);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
console.log("ā³ Connecting... (this may take a moment)");
|