@@ -1144,158 +1144,3 @@ ws.onopen = () => {
1144
1144
</pre>
1145
1145
</div>
1146
1146
1147
- ### Redis-Like Server ### {#redis-example}
1148
-
1149
- This example demonstrates a minimalistic Redis-like key-value store server with get, set, and delete operations.
1150
-
1151
- <div class="example">
1152
- <pre class="example-code" highlight="js" title="redisWorker.js">
1153
- // Simple in-memory key-value store
1154
- const store = new Map();
1155
-
1156
- // Load data from persistent storage
1157
- const savedData = storage.get("data");
1158
- if (savedData) {
1159
- // Restore data from storage
1160
- for (const [key, value] of Object.entries(savedData)) {
1161
- store.set(key, value);
1162
- }
1163
- }
1164
-
1165
- // Save data to persistent storage
1166
- async function saveData() {
1167
- await storage.put("data", Object.fromEntries(store));
1168
- }
1169
-
1170
- export default {
1171
- connect(event) {
1172
- const port = event.ports[0] ;
1173
-
1174
- port.onmessage = async (event) => {
1175
- const { command, key, value } = event.data;
1176
- let response;
1177
-
1178
- // Handle different Redis-like commands
1179
- switch (command) {
1180
- case "GET":
1181
- response = {
1182
- status: "success",
1183
- value: store.has(key) ? store.get(key) : null
1184
- };
1185
- break;
1186
-
1187
- case "SET":
1188
- store.set(key, value);
1189
- await saveData();
1190
- response = { status: "success" };
1191
- break;
1192
-
1193
- case "DEL":
1194
- const deleted = store.delete(key);
1195
- await saveData();
1196
- response = {
1197
- status: "success",
1198
- deleted
1199
- };
1200
- break;
1201
-
1202
- default:
1203
- response = {
1204
- status: "error",
1205
- message: "Unknown command"
1206
- };
1207
- }
1208
-
1209
- port.postMessage(response);
1210
- };
1211
-
1212
- // Handle disconnection
1213
- port.addEventListener("close", () => {
1214
- // Make sure data is saved when client disconnects
1215
- waitUntil(saveData());
1216
- });
1217
- }
1218
- }
1219
- </pre>
1220
-
1221
- <pre class="example-code" highlight="js" title="server.js">
1222
- export default {
1223
- async fetch(request) {
1224
- const url = new URL(request.url);
1225
-
1226
- // Create or access the Redis worker
1227
- // We use a single worker for the entire Redis server
1228
- const worker = new ServerlessWorker("./redisWorker.js", "redis-server");
1229
- const port = worker.port;
1230
-
1231
- // Handle POST requests for Redis commands
1232
- if (request.method === "POST") {
1233
- // Parse the command from the request body
1234
- const command = await request.json();
1235
-
1236
- // Create a Promise that will be resolved with the response
1237
- const { promise, resolve } = Promise.withResolvers();
1238
-
1239
- // Set up message handler
1240
- port.onmessage = (event) => {
1241
- resolve(new Response(JSON.stringify(event.data), {
1242
- headers: { "Content-Type": "application/json" }
1243
- }));
1244
- };
1245
-
1246
- // Send the command to the worker
1247
- port.postMessage(command);
1248
-
1249
- // Wait for the response
1250
- return await promise;
1251
- }
1252
-
1253
- return new Response("Invalid method", {
1254
- status: 400,
1255
- headers: { "Content-Type": "text/plain" }
1256
- });
1257
- }
1258
- }
1259
- </pre>
1260
-
1261
- <pre class="example-code" highlight="js" title="client.js">
1262
- // Redis client example
1263
-
1264
- // Function to send a command to the Redis server
1265
- async function redisCommand(command, key, value = null) {
1266
- const payload = { command, key };
1267
- if (value !== null) {
1268
- payload.value = value;
1269
- }
1270
-
1271
- const response = await fetch("https://redis.example.com", {
1272
- method: "POST",
1273
- headers: { "Content-Type": "application/json" },
1274
- body: JSON.stringify(payload)
1275
- });
1276
-
1277
- return await response.json();
1278
- }
1279
-
1280
- // Example usage
1281
- async function example() {
1282
- // Set a value
1283
- await redisCommand("SET", "greeting", "Hello, ServerlessWorker!");
1284
- console.log("Set greeting key");
1285
-
1286
- // Get the value
1287
- const result = await redisCommand("GET", "greeting");
1288
- console.log("Get greeting:", result.value);
1289
-
1290
- // Delete the key
1291
- const deleted = await redisCommand("DEL", "greeting");
1292
- console.log("Deleted greeting:", deleted.deleted);
1293
-
1294
- // Verify it's gone
1295
- const afterDelete = await redisCommand("GET", "greeting");
1296
- console.log("After delete:", afterDelete.value);
1297
- }
1298
-
1299
- example();
1300
- </pre>
1301
- </div>
0 commit comments