From cc2ef4e7472b5d3308e4ca60d1ef77e6a72df6e7 Mon Sep 17 00:00:00 2001 From: Beth Griggs Date: Wed, 28 Oct 2020 02:18:01 +0000 Subject: [PATCH] Chapter 3: Samples --- Chapter03/learning-streams/async-generator.js | 15 ++++ .../learning-streams/for-await-read-stream.js | 12 +++ Chapter03/learning-streams/infinite-read.js | 9 +++ Chapter03/learning-streams/paused-stream.js | 16 ++++ Chapter03/learning-streams/read-stream.js | 11 +++ Chapter03/learning-streams/write-stream.js | 9 +++ Chapter03/object-streams/object-stream.js | 14 ++++ Chapter03/object-streams/package-lock.json | 79 +++++++++++++++++++ Chapter03/object-streams/package.json | 15 ++++ Chapter03/piping-streams/file.txt | 4 + Chapter03/piping-streams/pipe-stream.js | 5 ++ Chapter03/stream-pipelines/file.txt | 3 + Chapter03/stream-pipelines/newFile.txt | 3 + Chapter03/stream-pipelines/pipeline.js | 22 ++++++ .../stream-pipelines/promise-pipeline.js | 25 ++++++ Chapter03/transform-stream/file.txt | 3 + Chapter03/transform-stream/newFile.txt | 3 + .../transform-stream/transform-stream-es6.js | 18 +++++ .../transform-stream/transform-stream.js | 15 ++++ 19 files changed, 281 insertions(+) create mode 100644 Chapter03/learning-streams/async-generator.js create mode 100644 Chapter03/learning-streams/for-await-read-stream.js create mode 100644 Chapter03/learning-streams/infinite-read.js create mode 100644 Chapter03/learning-streams/paused-stream.js create mode 100644 Chapter03/learning-streams/read-stream.js create mode 100644 Chapter03/learning-streams/write-stream.js create mode 100644 Chapter03/object-streams/object-stream.js create mode 100644 Chapter03/object-streams/package-lock.json create mode 100644 Chapter03/object-streams/package.json create mode 100644 Chapter03/piping-streams/file.txt create mode 100644 Chapter03/piping-streams/pipe-stream.js create mode 100644 Chapter03/stream-pipelines/file.txt create mode 100644 Chapter03/stream-pipelines/newFile.txt create mode 100644 Chapter03/stream-pipelines/pipeline.js create mode 100644 Chapter03/stream-pipelines/promise-pipeline.js create mode 100644 Chapter03/transform-stream/file.txt create mode 100644 Chapter03/transform-stream/newFile.txt create mode 100644 Chapter03/transform-stream/transform-stream-es6.js create mode 100644 Chapter03/transform-stream/transform-stream.js diff --git a/Chapter03/learning-streams/async-generator.js b/Chapter03/learning-streams/async-generator.js new file mode 100644 index 0000000..a6c241e --- /dev/null +++ b/Chapter03/learning-streams/async-generator.js @@ -0,0 +1,15 @@ +const { Readable } = require("stream"); + +async function* generate() { + yield "Node.js"; + yield "is"; + yield "a"; + yield "JavaScript"; + yield "Runtime"; +} + +const readable = Readable.from(generate()); + +readable.on("data", (chunk) => { + console.log(chunk); +}); diff --git a/Chapter03/learning-streams/for-await-read-stream.js b/Chapter03/learning-streams/for-await-read-stream.js new file mode 100644 index 0000000..63241d9 --- /dev/null +++ b/Chapter03/learning-streams/for-await-read-stream.js @@ -0,0 +1,12 @@ +const fs = require("fs"); + +const rs = fs.createReadStream("./file.txt"); + +async function run() { + for await (const chunk of rs) { + console.log("Read chunk:", chunk); + } + console.log("No more data."); +} + +run(); diff --git a/Chapter03/learning-streams/infinite-read.js b/Chapter03/learning-streams/infinite-read.js new file mode 100644 index 0000000..563a21c --- /dev/null +++ b/Chapter03/learning-streams/infinite-read.js @@ -0,0 +1,9 @@ +const fs = require("fs"); + +const rs = fs.createReadStream("/dev/urandom"); + +let size = 0; +rs.on("data", (data) => { + size += data.length; + console.log("File size:", size); +}); diff --git a/Chapter03/learning-streams/paused-stream.js b/Chapter03/learning-streams/paused-stream.js new file mode 100644 index 0000000..285b906 --- /dev/null +++ b/Chapter03/learning-streams/paused-stream.js @@ -0,0 +1,16 @@ +const fs = require("fs"); + +const rs = fs.createReadStream("./file.txt"); + +rs.on("readable", () => { + // Read data + let data = rs.read(); + while (data !== null) { + console.log("Read chunk:", data); + data = rs.read(); + } +}); + +rs.on("end", () => { + console.log("No more data."); +}); diff --git a/Chapter03/learning-streams/read-stream.js b/Chapter03/learning-streams/read-stream.js new file mode 100644 index 0000000..cfe1554 --- /dev/null +++ b/Chapter03/learning-streams/read-stream.js @@ -0,0 +1,11 @@ +const fs = require("fs"); + +const rs = fs.createReadStream("./file.txt"); + +rs.on("data", (data) => { + console.log("Read chunk:", data.toString()); +}); + +rs.on("end", () => { + console.log("No more data."); +}); diff --git a/Chapter03/learning-streams/write-stream.js b/Chapter03/learning-streams/write-stream.js new file mode 100644 index 0000000..4124fc7 --- /dev/null +++ b/Chapter03/learning-streams/write-stream.js @@ -0,0 +1,9 @@ +const fs = require("fs"); + +const file = fs.createWriteStream("./file.txt"); + +for (let i = 0; i <= 1000000; i++) { + file.write( + "Node.js is a JavaScript runtime built on Google Chrome's V8 JavaScript engine.\n" + ); +} diff --git a/Chapter03/object-streams/object-stream.js b/Chapter03/object-streams/object-stream.js new file mode 100644 index 0000000..2f40ff7 --- /dev/null +++ b/Chapter03/object-streams/object-stream.js @@ -0,0 +1,14 @@ +const { Transform } = require("stream"); +const { stringify } = require("ndjson"); + +const Name = Transform({ + objectMode: true, + transform: ({ forename, surname }, encoding, callback) => { + callback(null, { name: forename + " " + surname }); + }, +}); + +Name.pipe(stringify()).pipe(process.stdout); + +Name.write({ forename: "John", surname: "Doe" }); +Name.write({ forename: "Jane", surname: "Doe" }); diff --git a/Chapter03/object-streams/package-lock.json b/Chapter03/object-streams/package-lock.json new file mode 100644 index 0000000..f6bdfff --- /dev/null +++ b/Chapter03/object-streams/package-lock.json @@ -0,0 +1,79 @@ +{ + "name": "object-streams", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "ndjson": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", + "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", + "requires": { + "json-stringify-safe": "^5.0.1", + "minimist": "^1.2.5", + "readable-stream": "^3.6.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "requires": { + "readable-stream": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } +} diff --git a/Chapter03/object-streams/package.json b/Chapter03/object-streams/package.json new file mode 100644 index 0000000..452a925 --- /dev/null +++ b/Chapter03/object-streams/package.json @@ -0,0 +1,15 @@ +{ + "name": "object-streams", + "version": "1.0.0", + "description": "", + "main": "object-stream.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "ndjson": "^2.0.0" + } +} diff --git a/Chapter03/piping-streams/file.txt b/Chapter03/piping-streams/file.txt new file mode 100644 index 0000000..7f5eac2 --- /dev/null +++ b/Chapter03/piping-streams/file.txt @@ -0,0 +1,4 @@ +Node.js is a JavaScript runtime built on Google Chrome's V8 JavaScript engine. +Node.js is a JavaScript runtime built on Google Chrome's V8 JavaScript engine. +Node.js is a JavaScript runtime built on Google Chrome's V8 JavaScript engine. + diff --git a/Chapter03/piping-streams/pipe-stream.js b/Chapter03/piping-streams/pipe-stream.js new file mode 100644 index 0000000..c91495b --- /dev/null +++ b/Chapter03/piping-streams/pipe-stream.js @@ -0,0 +1,5 @@ +const fs = require("fs"); + +const rs = fs.createReadStream("file.txt"); + +rs.pipe(process.stdout); diff --git a/Chapter03/stream-pipelines/file.txt b/Chapter03/stream-pipelines/file.txt new file mode 100644 index 0000000..a94a0b6 --- /dev/null +++ b/Chapter03/stream-pipelines/file.txt @@ -0,0 +1,3 @@ +Node.js is a JavaScript runtime built on Google Chrome's V8 JavaScript engine. +Node.js is a JavaScript runtime built on Google Chrome's V8 JavaScript engine. +Node.js is a JavaScript runtime built on Google Chrome's V8 JavaScript engine. diff --git a/Chapter03/stream-pipelines/newFile.txt b/Chapter03/stream-pipelines/newFile.txt new file mode 100644 index 0000000..d048a06 --- /dev/null +++ b/Chapter03/stream-pipelines/newFile.txt @@ -0,0 +1,3 @@ +NODE.JS IS A JAVASCRIPT RUNTIME BUILT ON GOOGLE CHROME'S V8 JAVASCRIPT ENGINE. +NODE.JS IS A JAVASCRIPT RUNTIME BUILT ON GOOGLE CHROME'S V8 JAVASCRIPT ENGINE. +NODE.JS IS A JAVASCRIPT RUNTIME BUILT ON GOOGLE CHROME'S V8 JAVASCRIPT ENGINE. diff --git a/Chapter03/stream-pipelines/pipeline.js b/Chapter03/stream-pipelines/pipeline.js new file mode 100644 index 0000000..8f91518 --- /dev/null +++ b/Chapter03/stream-pipelines/pipeline.js @@ -0,0 +1,22 @@ +const fs = require("fs"); +const { pipeline, Transform } = require("stream"); + +const uppercase = new Transform({ + transform(chunk, encoding, callback) { + // Data processing + callback(null, chunk.toString().toUpperCase()); + }, +}); + +pipeline( + fs.createReadStream("./file.txt"), + uppercase, + fs.createWriteStream("./newFile.txt"), + (err) => { + if (err) { + console.error("Pipeline failed.", err); + } else { + console.log("Pipeline succeeded."); + } + } +); diff --git a/Chapter03/stream-pipelines/promise-pipeline.js b/Chapter03/stream-pipelines/promise-pipeline.js new file mode 100644 index 0000000..fdcc65e --- /dev/null +++ b/Chapter03/stream-pipelines/promise-pipeline.js @@ -0,0 +1,25 @@ +const fs = require("fs"); +const stream = require("stream"); +const util = require("util"); + +const pipeline = util.promisify(stream.pipeline); + +const uppercase = new stream.Transform({ + transform(chunk, encoding, callback) { + // Data processing + callback(null, chunk.toString().toUpperCase()); + }, +}); + +async function run() { + await pipeline( + fs.createReadStream("./file.txt"), + uppercase, + fs.createWriteStream("./newFile.txt") + ); + console.log("Pipeline succeeded."); +} + +run().catch((err) => { + console.error("Pipeline failed.", err); +}); diff --git a/Chapter03/transform-stream/file.txt b/Chapter03/transform-stream/file.txt new file mode 100644 index 0000000..a94a0b6 --- /dev/null +++ b/Chapter03/transform-stream/file.txt @@ -0,0 +1,3 @@ +Node.js is a JavaScript runtime built on Google Chrome's V8 JavaScript engine. +Node.js is a JavaScript runtime built on Google Chrome's V8 JavaScript engine. +Node.js is a JavaScript runtime built on Google Chrome's V8 JavaScript engine. diff --git a/Chapter03/transform-stream/newFile.txt b/Chapter03/transform-stream/newFile.txt new file mode 100644 index 0000000..d048a06 --- /dev/null +++ b/Chapter03/transform-stream/newFile.txt @@ -0,0 +1,3 @@ +NODE.JS IS A JAVASCRIPT RUNTIME BUILT ON GOOGLE CHROME'S V8 JAVASCRIPT ENGINE. +NODE.JS IS A JAVASCRIPT RUNTIME BUILT ON GOOGLE CHROME'S V8 JAVASCRIPT ENGINE. +NODE.JS IS A JAVASCRIPT RUNTIME BUILT ON GOOGLE CHROME'S V8 JAVASCRIPT ENGINE. diff --git a/Chapter03/transform-stream/transform-stream-es6.js b/Chapter03/transform-stream/transform-stream-es6.js new file mode 100644 index 0000000..f8d7977 --- /dev/null +++ b/Chapter03/transform-stream/transform-stream-es6.js @@ -0,0 +1,18 @@ +const fs = require("fs"); +const { Transform } = require("stream"); + +const rs = fs.createReadStream("./file.txt"); +const newFile = fs.createWriteStream("./newFile.txt"); + +class Uppercase extends Transform { + constructor() { + super(); + } + + _transform(chunk, encoding, callback) { + this.push(chunk.toString().toUpperCase()); + callback(); + } +} + +rs.pipe(new Uppercase()).pipe(newFile); diff --git a/Chapter03/transform-stream/transform-stream.js b/Chapter03/transform-stream/transform-stream.js new file mode 100644 index 0000000..6d17b9c --- /dev/null +++ b/Chapter03/transform-stream/transform-stream.js @@ -0,0 +1,15 @@ +const fs = require("fs"); +const { Transform } = require("stream"); + +const rs = fs.createReadStream("./file.txt"); + +const newFile = fs.createWriteStream("./newFile.txt"); + +const uppercase = new Transform({ + transform(chunk, encoding, callback) { + // Data processing + callback(null, chunk.toString().toUpperCase()); + }, +}); + +rs.pipe(uppercase).pipe(newFile);