MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add node:net example

+88 -18
+88 -18
examples/demo/net.cjs
··· 1 1 const net = require('node:net'); 2 + const httpParser = require('ant:internal/http_parser'); 3 + const httpWriter = require('ant:internal/http_writer'); 2 4 3 - const httpResponse = `HTTP/1.1 200 OK\r 4 - Content-Type: text/plain\r 5 - \r 6 - Hello, World from net module! 7 - `; 5 + const TEXT_CONTENT_TYPE = 'text/plain; charset=utf-8'; 6 + const JSON_CONTENT_TYPE = 'application/json; charset=utf-8'; 7 + 8 + function send(socket, status, statusText, contentType, body) { 9 + socket.write(httpWriter.writeBasicResponse(status, statusText, contentType, body, false)); 10 + socket.end(); 11 + } 8 12 9 - const server = net.createServer(socket => { 10 - console.log('Client connected'); 13 + function sendBadRequest(socket, error) { 14 + const message = error && error.message ? error.message : 'Bad Request'; 15 + send(socket, 400, 'Bad Request', TEXT_CONTENT_TYPE, `${message}\n`); 16 + } 11 17 12 - socket.on('data', () => { 13 - socket.write(httpResponse); 14 - socket.end(); 15 - }); 18 + function sendStream(socket, request) { 19 + socket.write(httpWriter.writeHead(200, 'OK', ['Content-Type', TEXT_CONTENT_TYPE], true, 0, false)); 20 + socket.write(httpWriter.writeChunk('streamed from ant:internal/http_writer\n')); 21 + socket.write(httpWriter.writeChunk(`method=${request.method} target=${request.target}\n`)); 22 + socket.write(httpWriter.writeFinalChunk()); 23 + socket.end(); 24 + } 16 25 17 - socket.on('end', () => { 18 - console.log('Client disconnected'); 19 - }); 26 + const buildTextBody = request => 27 + [ 28 + 'Hello from ant:internal/http_parser + ant:internal/http_writer!', 29 + `method=${request.method}`, 30 + `target=${request.target}`, 31 + `httpVersion=${request.httpVersion}`, 32 + `keepAlive=${request.keepAlive}`, 33 + `bodyLength=${request.bodyLength}` 34 + ].join('\n') + '\n'; 20 35 21 - socket.on('error', err => { 22 - console.error(`Socket error: ${err.message}`); 23 - }); 36 + const buildJsonBody = request => 37 + JSON.stringify( 38 + { 39 + method: request.method, 40 + target: request.target, 41 + httpVersion: request.httpVersion, 42 + keepAlive: request.keepAlive, 43 + bodyLength: request.bodyLength, 44 + rawHeaders: request.rawHeaders 45 + }, 46 + null, 47 + 2 48 + ); 49 + 50 + function handleRequest(socket, request) { 51 + if (request.target === '/stream') { 52 + sendStream(socket, request); 53 + return; 54 + } 55 + 56 + if (request.target === '/json') { 57 + send(socket, 200, 'OK', JSON_CONTENT_TYPE, buildJsonBody(request)); 58 + return; 59 + } 60 + 61 + send(socket, 200, 'OK', TEXT_CONTENT_TYPE, buildTextBody(request)); 62 + } 63 + 64 + function appendChunk(buffered, chunk) { 65 + return buffered.length === 0 ? chunk : Buffer.concat([buffered, chunk]); 66 + } 67 + 68 + function onSocketData(socket, state, chunk) { 69 + state.buffer = appendChunk(state.buffer, chunk); 70 + 71 + try { 72 + const request = httpParser.parseRequest(state.buffer); 73 + if (!request) return; 74 + 75 + handleRequest(socket, request); 76 + 77 + if (request.consumed > 0) { 78 + state.buffer = state.buffer.subarray(request.consumed); 79 + } 80 + } catch (error) { 81 + sendBadRequest(socket, error); 82 + } 83 + } 84 + 85 + const server = net.createServer(socket => { 86 + const state = { buffer: Buffer.alloc(0) }; 87 + console.log('client connected'); 88 + 89 + socket.on('data', chunk => onSocketData(socket, state, chunk)); 90 + socket.on('end', () => console.log('client disconnected')); 91 + socket.on('error', error => console.error(`socket error: ${error.message}`)); 24 92 }); 25 93 26 - server.listen(3000, () => console.log(`server on http://localhost:3000`)); 94 + server.listen(3000, () => { 95 + console.log('server on http://localhost:3000'); 96 + });