diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d5f19d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json diff --git a/data/lorem.txt b/data/lorem.txt new file mode 100644 index 0000000..8107c9a --- /dev/null +++ b/data/lorem.txt @@ -0,0 +1,13 @@ +Feugiat ante, auctor facilisis dui augue non turpis. Suspendisse mattis metus +et justo. Aliquam erat volutpat. Suspendisse potenti. Nam hendrerit lorem +commodo metus laoreet ullamcorper. Proin vel nunc a felis sollicitudin pretium. +Maecenas in metus at mi mollis posuere. Quisque ac quam sed massa adipiscing +rutrum. Vestibulum ipsum. Phasellus porta sapien. Maecenas venenatis tellus vel +tellus. + +Aliquam aliquam dolor at justo. Cum sociis natoque penatibus et magnis dis +parturient montes, nascetur ridiculus mus. Morbi pretium purus a magna. Nullam +dui tellus, blandit eu, facilisis non, pharetra consectetuer, leo. Maecenas sit +amet ante sagittis magna imperdiet pulvinar. Vestibulum a lacus at sapien +suscipit. + diff --git a/data/package.json b/data/package.json new file mode 100644 index 0000000..f791980 --- /dev/null +++ b/data/package.json @@ -0,0 +1,19 @@ +{ + "name": "filefunctions", + "version": "1.0.0", + "description": "Portion of the assignment to do with files.", + "main": "fileFunctions.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/GeneTinderholm/assignment_async_nodejs.git" + }, + "author": "Gene Tinderholm", + "license": "ISC", + "bugs": { + "url": "https://github.com/GeneTinderholm/assignment_async_nodejs/issues" + }, + "homepage": "https://github.com/GeneTinderholm/assignment_async_nodejs#readme" +} diff --git a/data/test.txt b/data/test.txt new file mode 100644 index 0000000..b861aad --- /dev/null +++ b/data/test.txt @@ -0,0 +1 @@ +Hello!Hello again! \ No newline at end of file diff --git a/emit.js b/emit.js new file mode 100644 index 0000000..b054a3f --- /dev/null +++ b/emit.js @@ -0,0 +1,81 @@ +class Event{ + constructor(eventType){ + this.eventType = eventType + } +} + +class Listener{ + constructor(eventType, callback){ + if(typeof callback != "function"){ + throw new TypeError("callback must be a function!"); + }else{ + this.eventType = eventType, + this.callback = callback + } + } +} + +class emitter { + constructor(){ + this.listenerArray = [], + + this.emit = function(eventType){ + let x = new Event(eventType); + let i = 0; + this.listenerArray.map(function(listener){ + if(x.eventType === listener.eventType){ + listener.callback(); + i++; + } + if(i === 0){ + return false; + }else{ + return true; + } + }); + } + this.on = function(eventType, callback){ + try{ + this.listenerArray[this.listenerArray.length] = new Listener(eventType, callback); + this.emit("newListener"); + return this; + } + catch(e){ + console.error(e.message); + } + } + this.removeListener = function(eventType, callback){ + try{ + let i = 0; + let newArray = []; + let x = new Listener(eventType, callback); + this.listenerArray.map(function(listener){ + if(x.eventType != listener.eventType || x.callback.toString() != listener.callback.toString()){ + newArray[i] = listener; + i++ + } + }); + this.listenerArray = newArray; + this.emit('removeListener'); + return this; + } + catch(e){ + console.error(e.message); + } + } + this.removeAllListeners = function(eventType){ + let i = 0; + let newArray = []; + this.listenerArray.map(function(listener){ + if(eventType != listener.eventType){ + newArray[i] = listener; + i++ + } + }); + this.listenerArray = newArray; + return this; + } + } +} + +module.exports = emitter; diff --git a/emitTest.js b/emitTest.js new file mode 100644 index 0000000..fa24b72 --- /dev/null +++ b/emitTest.js @@ -0,0 +1,26 @@ +let Emitter = require('./emit.js'); + +let emitter = new Emitter(); + +let test1 = function(){ + console.log("Listener 1"); +}; + +let test2 = function(){ + console.log("Listener 2"); +} +emitter.on("FGSFDS", test1); +emitter.on("FGSFDS", test2); +emitter.on("not-FGSFDS", function(){ + console.log("This shouldn't ever be called."); +}); + +emitter.emit("FGSFDS"); + +emitter.removeListener("FGSFDS", test1); + +emitter.emit("FGSFDS"); + +emitter.removeAllListeners("FGSFDS"); + +emitter.emit("FGSFDS"); diff --git a/fileFunctions.js b/fileFunctions.js new file mode 100644 index 0000000..5c0afc0 --- /dev/null +++ b/fileFunctions.js @@ -0,0 +1,39 @@ +const fs = require('fs'); + +function fsp () { + this.readFile = function(string){ + return new Promise(function(resolve,reject){ + fs.readFile(string, 'utf-8', function(err, data){ + if(err){ + throw err; + }else{ + resolve( data ); + } + }) + }); + }, + this.writeFile = function(filePath, string){ + return new Promise(function(resolve,reject){ + fs.writeFile(filePath, string, function(err){ + if(err){ + throw err; + }else{ + resolve('The file has been updated.'); + } + }); + }); + }, + this.appendFile = function(filePath, string){ + return new Promise(function(resolve,reject){ + fs.appendFile('./data/test.txt', 'Hello again!', function(err){ + if(err){ + throw err; + }else{ + resolve('The file has been appended to.'); + } + }); + }); + } +} + +module.exports = new fsp(); diff --git a/fileFunctionsTest.js b/fileFunctionsTest.js new file mode 100644 index 0000000..f5d97d6 --- /dev/null +++ b/fileFunctionsTest.js @@ -0,0 +1,28 @@ +const fsp = require('./fileFunctions'); + +fsp.readFile('./data/lorem.txt') + .then(function(data){ + console.log(data); + return data; + }) + .catch(function(err){ + console.error(err); + }); + +fsp.writeFile('./data/test.txt', 'Hello!') + .then(function(res){ + console.log(res); + return res; + }) + .catch(function(err){ + console.error(err); + }); + +fsp.appendFile('./data/test.txt', 'Hello again!') + .then(function(res){ + console.log(res); + return res; + }) + .catch(function(err){ + console.error(err); + }); diff --git a/index.js b/index.js new file mode 100644 index 0000000..e69de29 diff --git a/lib/emit.js b/lib/emit.js new file mode 100644 index 0000000..b054a3f --- /dev/null +++ b/lib/emit.js @@ -0,0 +1,81 @@ +class Event{ + constructor(eventType){ + this.eventType = eventType + } +} + +class Listener{ + constructor(eventType, callback){ + if(typeof callback != "function"){ + throw new TypeError("callback must be a function!"); + }else{ + this.eventType = eventType, + this.callback = callback + } + } +} + +class emitter { + constructor(){ + this.listenerArray = [], + + this.emit = function(eventType){ + let x = new Event(eventType); + let i = 0; + this.listenerArray.map(function(listener){ + if(x.eventType === listener.eventType){ + listener.callback(); + i++; + } + if(i === 0){ + return false; + }else{ + return true; + } + }); + } + this.on = function(eventType, callback){ + try{ + this.listenerArray[this.listenerArray.length] = new Listener(eventType, callback); + this.emit("newListener"); + return this; + } + catch(e){ + console.error(e.message); + } + } + this.removeListener = function(eventType, callback){ + try{ + let i = 0; + let newArray = []; + let x = new Listener(eventType, callback); + this.listenerArray.map(function(listener){ + if(x.eventType != listener.eventType || x.callback.toString() != listener.callback.toString()){ + newArray[i] = listener; + i++ + } + }); + this.listenerArray = newArray; + this.emit('removeListener'); + return this; + } + catch(e){ + console.error(e.message); + } + } + this.removeAllListeners = function(eventType){ + let i = 0; + let newArray = []; + this.listenerArray.map(function(listener){ + if(eventType != listener.eventType){ + newArray[i] = listener; + i++ + } + }); + this.listenerArray = newArray; + return this; + } + } +} + +module.exports = emitter; diff --git a/lib/fileFunctions.js b/lib/fileFunctions.js new file mode 100644 index 0000000..5c0afc0 --- /dev/null +++ b/lib/fileFunctions.js @@ -0,0 +1,39 @@ +const fs = require('fs'); + +function fsp () { + this.readFile = function(string){ + return new Promise(function(resolve,reject){ + fs.readFile(string, 'utf-8', function(err, data){ + if(err){ + throw err; + }else{ + resolve( data ); + } + }) + }); + }, + this.writeFile = function(filePath, string){ + return new Promise(function(resolve,reject){ + fs.writeFile(filePath, string, function(err){ + if(err){ + throw err; + }else{ + resolve('The file has been updated.'); + } + }); + }); + }, + this.appendFile = function(filePath, string){ + return new Promise(function(resolve,reject){ + fs.appendFile('./data/test.txt', 'Hello again!', function(err){ + if(err){ + throw err; + }else{ + resolve('The file has been appended to.'); + } + }); + }); + } +} + +module.exports = new fsp(); diff --git a/package.json b/package.json new file mode 100644 index 0000000..2a36d30 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "assignment_async_nodejs", + "version": "1.0.0", + "description": "File operation part of assignment.", + "main": "index.js", + "directories": { + "lib": "lib" + }, + "dependencies": { + "events": "^1.1.1", + "fs": "^0.0.1-security" + }, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/GeneTinderholm/assignment_async_nodejs.git" + }, + "author": "Gene Tinderholm", + "license": "ISC", + "bugs": { + "url": "https://github.com/GeneTinderholm/assignment_async_nodejs/issues" + }, + "homepage": "https://github.com/GeneTinderholm/assignment_async_nodejs#readme" +} diff --git a/warmup.js b/warmup.js new file mode 100644 index 0000000..d7d4349 --- /dev/null +++ b/warmup.js @@ -0,0 +1,88 @@ +p = new Promise(function(resolve){ + setTimeout(resolve, 1000, "Hello Promise"); +}); + +p + .then(function(result){ + console.log(result); + }) + .catch(function(err){ + console.error(err); + }); + +function delay(milliseconds){ + + return new Promise(function(resolve){ + setTimeout(resolve, milliseconds, milliseconds); + }); +} + +function countDown(milliseconds){ + if(milliseconds === 0){ + console.log("Done!") + }else{ + console.log(milliseconds); + return delay(milliseconds - 100); + } +} + +delay(1000) + .then(countDown) + .then(countDown) + .then(countDown) + .then(countDown) + .then(countDown) + .then(countDown) + .then(countDown) + .then(countDown) + .then(countDown) + .then(countDown) + .then(countDown); + +function squarePromiseReturn(number){ + + return new Promise(function(resolve, reject){ + if(typeof number === "number"){ + resolve(number * number); + }else{ + reject("Not A Number!"); + } + }); +} + +let promiseArray = []; + +for(i = 0; i < 9; i++){ + promiseArray[i] = squarePromiseReturn(i + 1); +} + +Promise.all(promiseArray) + .then(function(result){ + console.log(result); + }); + +function doBadThing(forRealz){ + return new Promise(function(resolve, reject){ + if(!forRealz){ + resolve("Yay!"); + }else{ + reject("Boo!"); + } + }); +} + +doBadThing(0) + .then(function(result){ + console.log(result); + }) + .catch(function(err){ + console.error(err); + }); + +doBadThing("FGSFDS") + .then(function(result){ + console.log(result); + }) + .catch(function(err){ + console.error(err); + });