What is Node JS

graph TD;
A("<img src='https://raw.githubusercontent.com/shubham21155102/Archieve/main/Backend/v8.png'; width='30' />" <br><br> V8 Engine)-->B[("<img src='https://raw.githubusercontent.com/shubham21155102/Archieve/main/Backend/nodejs.png'; width='100' />"Node js)]
C("<img src='https://raw.githubusercontent.com/shubham21155102/Archieve/main/Backend/libuv.png'; width='50'  />" <br><br> libuv)-->B

Threading

graph RL;
A[<strong>Single Threaded</strong><br><br>all will wait until.<br> execution of prev <br> completed or not]
C1--req1-->S[Server]
S--res1<br>3 sec-->C1
C2--req2-->S
S--res2<br>6 sec-->C2
C3--req2-->S
S--res2<br>9 sec-->C3
C4--req2-->S
S--res2<br>9 sec-->C4
graph RL
A[<strong>Multi Threaded</strong><br><br>all requests will excute<br> at same time ]
C1
C2
C3
C4
subgraph Server
T1[Thread 1]
T2[Thread 2]
T3[Thread 3]
T4[Thread 4]
end
C1--req-->T1
T1--res<br>3sec-->C1
C2--req-->T2
T2--res<br>3sec-->C2
C3--req-->T3
T3--res<br>3sec-->C3
C4--req-->T4
T4--res<br>3sec-->C4
subgraph Languages
A("<img src='https://raw.githubusercontent.com/shubham21155102/Archieve/main/Backend/java.png'; width='30' />" <br><br>Java)
C("<img src='https://raw.githubusercontent.com/shubham21155102/Archieve/main/Backend/php.png'; width='50'  />" <br><br>Php)

end
graph LR;
C1-->S[(Server)]
C2-->S
C3-->S
c4-->S
subgraph Workers
Req1
Req2
Req3
Req4
end
S-->Req1
S-->Req2
S-->Req3
S-->Req4
subgraph Environment
C("<img src='https://raw.githubusercontent.com/shubham21155102/Archieve/main/Backend/nodejs.png'; width='50'  />" <br><br>Node JS)
end

Synchronous vs Asynchronous

libuv

console.log("Hii")
SetTimeOut(cb)
Promises
SetTimeOut
Promises
Promises
Promises
console.log("Bye")
	graph TD;
A[Call Stack]
B[Node Api's Browser Api]
C[Micro Tasks Queue]
D[Callback Queue]

Step 1

graph LR;
subgraph CallStack
A[Console.log-Hii]
B[Console.log-Bye]
end

Step 2

graph LR;
subgraph Node API's Browser API
S1
P1
S2
P2
P3
P4
end

Step 3

graph TD;
subgraph CallBack Queue
S1 
S2
end
subgraph Micro Tasks Queue
P1
P2 
P3
P4
end

Step 4

graph TD;
subgraph T[CallBack Queue]
S1 
S2
end
subgraph U[Micro Tasks Queue]
P1
P2 
P3
P4
end
subgraph V[Event Loop]
X[now it will decide <br>which will executes first <br>vip Micro Tasks Queue <br>will be choosen first]
P1
P2 
P3
P4
end
Output
Hii
Bye
P1
P2
P3
P4
S1
S2

Event Loop and Thread Pool

Streams

Node js Streams

Strems By Node js fs module

Readable Stream

const fs = require('fs');
let data = '';
let readStream = fs.createReadStream('input.txt');
readStream.setEncoding('UTF8');
readStream.on('data', function(chunk) {
    data += chunk;
});
readStream.on('end', function() {
    console.log(data);
});
readStream.on('error', function(err) {
    console.log(err.stack);
});
console.log("Program Ended");

Writable Stream

const fs = require('fs');
let data = 'Simply Easy Learning';
let writeStream = fs.createWriteStream('output.txt');
writeStream.write(data, 'UTF8');
writeStream.end();
writeStream.on('finish', function() {
    console.log("Write completed.");
});
writeStream.on('error', function(err) {
    console.log(err.stack);
});
console.log("Program Ended");

Piping

const fs = require('fs');
let readStream = fs.createReadStream('input.txt');
let writeStream = fs.createWriteStream('output.txt');
readStream.pipe(writeStream);
console.log("Program Ended");

Chaining

const fs = require('fs');
let zlib = require('zlib');
const gzip = zlib.createGzip();
var readStream = fs.createReadStream('input.txt');
var writeStream = fs.createWriteStream('input.txt.gz');
readStream.pipe(gzip).pipe(writeStream);
console.log("File Compressed.");

Process Model of Node JS

graph LR;
C[Client]--HTTP-->S[Node js Server]
C--HTTP-->S
C--HTTP-->S
C--HTTP-->S
C--HTTP-->S
C--HTTP-->S
subgraph Workers
X[R1 <br> for req1]
R2
R3
R4
R5
end
S-->R1
S-->R2
S-->R3
S-->R4
S-->R5

Globals

When to use Node js and when not to use Node js

setImmediate vs setTimeout vs process.nextTick

console.log("Start");
setTimeout(() => {
    console.log("Set Timeout");
}, 0);
setImmediate(() => {
    console.log("Set Immediate");
});
process.nextTick(() => {
    console.log("Process Next Tick");
});
console.log("End");
Output
Start
End
Process Next Tick
Set Timeout
Set Immediate

Child Process Module

const cp=require("child_process");
cp.execSync("mkdir hello");
const cp=require("child_process");
cp.execSync("start chrome");
const cp=require("child_process");
cp.execSync("start chrome https://www.google.com");
const cp=require("child_process");
cp.execSync("start chrome https://www.google.com");

Event Emitter

const EventEmitter=require("events");
const event=new EventEmitter();
event.on("sayMyName",()=>{
    console.log("Your name is Shubham");
});
event.on("sayMyName",()=>{
    console.log("Your name is Shubham Patel");
});
event.on("sayMyName",()=>{
    console.log("Your name is Shubham Patel and you are a web developer");
});
event.emit("sayMyName");
Output
Your name is Shubham
Your name is Shubham Patel
Your name is Shubham Patel and you are a web developer

PolyFill of Event Emitter

  class EventEmitter {
    constructor() {
      this.events = {};
    }
    on(eventName, callback) {
      if (this.events[eventName]) {
        this.events[eventName].push(callback);
      } else {
        this.events[eventName] = [callback];
      }
    }
    emit(eventName) {
      if (this.events[eventName]) {
        this.events[eventName].forEach((callback) => {
          callback();
        });
      }
    }
  }
  module.exports = EventEmitter;