7.2 KiB
HTTP Server Request Handling
The provided code snippet demonstrates the request handling logic of an HTTP server. Below is an explanation of the code's functionality:
Functionality:
- The code creates an HTTP server using
http.createServer((req, res) => {...}), defining a callback function to handle incoming requests. - The server sets the "Access-Control-Allow-Origin" header to allow requests from any origin (
*). - The server distinguishes between HTTP GET requests and other request methods.
- For GET requests, the server parses the query parameters from the request URL using the
url.parse(req.url, true)method.- If the URL does not contain search parameters, the server responds with an empty body.
- If search parameters are present, the server processes the request using
client.processRequestFromUser(u.query).- If processing is successful, the server sends the response as a JSON object using
res.end(JSON.stringify(result[0])). - If an error occurs during processing:
- If the error is an instance of
INVALID, the server responds with the error message and the corresponding HTTP status code. - For other errors, the server logs the error, responds with an internal error message, and sets the appropriate HTTP status code.
- If the error is an instance of
- If processing is successful, the server sends the response as a JSON object using
- For GET requests, the server parses the query parameters from the request URL using the
Request Handling Logic:
- The server's primary function is to handle GET requests containing query parameters.
- It processes the query parameters and communicates with the
clientmodule to generate a response. - Successful responses are sent back to the client in JSON format, providing the requested data.
- Error handling ensures that appropriate error messages and status codes are returned to the client, enhancing the server's reliability and user experience.
This HTTP server logic allows clients to request specific data via GET requests and receive tailored responses, enabling seamless interaction between clients and the server.
HTTP Server POST Request Handling
POST Request handles incoming HTTP POST requests. H
Functionality:
- The code checks if the incoming request method is "POST".
- For POST requests, the server processes the data sent in the request body.
- The server listens for data chunks and assembles them into a complete data string using the
req.on('data', chunk => data += chunk)event. - Once all data is received (
req.on('end', ...) event), the server processes the data usingclient.processIncomingData(data).- If processing is successful, the server sends the response as a JSON object using
res.end(JSON.stringify(result[0])). - The response data includes the processed information.
- If a processing mode (
result[1]) is provided, specific actions are taken based on the mode:- If the mode is 'DATA', 'EDIT', 'TAG', or 'NOTE', the processed data is sent to live requests using
sendToLiveRequests(result[0]). - Additionally, the processed data is forwarded to the next node in the network using
intra.forwardToNextNode(result[1], result[0]).
- If the mode is 'DATA', 'EDIT', 'TAG', or 'NOTE', the processed data is sent to live requests using
- The server also decrements the countdown timer using
refresher.countdown.
- If processing is successful, the server sends the response as a JSON object using
- If an error occurs during processing:
- If the error is an instance of
INVALID, the server responds with the error message and the corresponding HTTP status code. - For other errors, the server logs the error, responds with an internal error message, and sets the appropriate HTTP status code.
- If the error is an instance of
- The server listens for data chunks and assembles them into a complete data string using the
Request Handling Logic:
- The server's POST request handling logic focuses on processing incoming data.
- Data sent via POST requests is processed, allowing various modes of operation ('DATA', 'EDIT', 'TAG', 'NOTE') to be executed based on the content of the request.
- Processed data is sent to live requests and forwarded to the next node, facilitating real-time data synchronization and network communication.
- Error handling ensures that appropriate error messages and status codes are returned to the client, enhancing the server's reliability and user experience.
This POST request handling logic enables clients to send data to the server, trigger specific actions, and receive real-time updates, enhancing the server's interactive capabilities and data synchronization functionalities.
WebSocket Server Functionality
The provided code snippet demonstrates the functionality of a WebSocket server that handles incoming messages from clients. Here's an overview of how the server processes messages without including initialization details:
Connection Handling and Message Processing:
- When a client establishes a connection, the server listens for incoming messages on that connection.
- Upon receiving a message, the server checks if it starts with
intra.SUPERNODE_INDICATOR.- If it does, the server processes the message as a task from a supernode using
intra.processTaskFromSupernode(message, ws). - If not, the server treats the message as a JSON object sent by a user.
- If it does, the server processes the message as a task from a supernode using
- The server attempts to parse the incoming JSON request.
- If the request contains a
statusfield, indicating a status update from the user, the server processes it usingclient.processStatusFromUser(request, ws). - If the request doesn't contain a
statusfield, it is treated as a user request. The server processes the request usingclient.processRequestFromUser(request).
- If the request contains a
- If processing is successful, the server sends the response back to the user via the WebSocket connection (
ws.send(JSON.stringify(result[0]))). - Errors encountered during processing are handled. If configured (
floGlobals.sn_config.errorFeedback), appropriate error messages are sent back to the user.
Error Handling:
- If the incoming message is not in valid JSON format, the server sends an error message indicating that the request is not in JSON format.
This server setup allows bidirectional communication between clients and the server, enabling the processing of tasks and user requests in a real-time manner.
Broadcasting Data to Live Requests
The provided function sendToLiveRequests(data) broadcasts data to all live WebSocket requests based on certain conditions. Here's an explanation of how this function works:
Functionality:
- The function takes a
dataparameter, representing the data to be sent to live WebSocket requests. - It iterates over all connected WebSocket clients stored in the
wsServer.clientsset. - For each client, it checks if the client's active request (stored in
ws._liveReq) satisfies specific conditions usingclient.checkIfRequestSatisfy(ws._liveReq, data).- If the client's request matches the conditions, the function sends the
datato that client in JSON format usingws.send(JSON.stringify(data)).
- If the client's request matches the conditions, the function sends the
Broadcasting Logic:
- The function acts as a broadcast mechanism, allowing targeted messages to be sent to specific clients based on their active requests.
- The conditions specified in
client.checkIfRequestSatisfy(ws._liveReq, data)determine which clients receive the broadcasted data. - Clients with active requests that meet the specified conditions will receive the
dataobject.
This functionality enables real-time communication with clients by delivering tailored data updates to specific active requests, enhancing the efficiency and responsiveness of the WebSocket server.