From 7fd3f284dd9ab8078c66049e3eb034ab52a368a5 Mon Sep 17 00:00:00 2001 From: jordan lavatai Date: Mon, 19 Jun 2017 00:17:47 -0700 Subject: [PATCH] first commit --- .gitignore | 1 + .tern-project | 16 ++++++++++++ README.md | 45 ++++++++++++++++++++++++++++++++ admin.css | 0 admin.html | 18 +++++++++++++ admin.js | 25 ++++++++++++++++++ main.js | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 22 ++++++++++++++++ renderer.html | 9 +++++++ renderer.js | 39 ++++++++++++++++++++++++++++ 10 files changed, 247 insertions(+) create mode 100644 .gitignore create mode 100644 .tern-project create mode 100644 README.md create mode 100644 admin.css create mode 100644 admin.html create mode 100644 admin.js create mode 100644 main.js create mode 100644 package.json create mode 100644 renderer.html create mode 100644 renderer.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/.tern-project b/.tern-project new file mode 100644 index 0000000..8e4dfe7 --- /dev/null +++ b/.tern-project @@ -0,0 +1,16 @@ +{ + "ecmaVersion": 6, + "libs": [], + "loadEagerly": [], + "dontLoad": [ + "node_modules/**" + ], + "plugins": { + "doc_comment": true, + "node": { + "dontLoad": "", + "load": "", + "modules": "" + } + } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..383cbfb --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# electron-quick-start + +**Clone and run for a quick way to see Electron in action.** + +This is a minimal Electron application based on the [Quick Start Guide](http://electron.atom.io/docs/tutorial/quick-start) within the Electron documentation. + +**Use this app along with the [Electron API Demos](http://electron.atom.io/#get-started) app for API code examples to help you get started.** + +A basic Electron application needs just these files: + +- `package.json` - Points to the app's main file and lists its details and dependencies. +- `main.js` - Starts the app and creates a browser window to render HTML. This is the app's **main process**. +- `index.html` - A web page to render. This is the app's **renderer process**. + +You can learn more about each of these components within the [Quick Start Guide](http://electron.atom.io/docs/tutorial/quick-start). + +## To Use + +To clone and run this repository you'll need [Git](https://git-scm.com) and [Node.js](https://nodejs.org/en/download/) (which comes with [npm](http://npmjs.com)) installed on your computer. From your command line: + +```bash +# Clone this repository +git clone https://github.com/electron/electron-quick-start +# Go into the repository +cd electron-quick-start +# Install dependencies +npm install +# Run the app +npm start +``` + +Note: If you're using Linux Bash for Windows, [see this guide](https://www.howtogeek.com/261575/how-to-run-graphical-linux-desktop-applications-from-windows-10s-bash-shell/) or use `node` from the command prompt. + +## Resources for Learning Electron + +- [electron.atom.io/docs](http://electron.atom.io/docs) - all of Electron's documentation +- [electron.atom.io/community/#boilerplates](http://electron.atom.io/community/#boilerplates) - sample starter apps created by the community +- [electron/electron-quick-start](https://github.com/electron/electron-quick-start) - a very basic starter Electron app +- [electron/simple-samples](https://github.com/electron/simple-samples) - small applications with ideas for taking them further +- [electron/electron-api-demos](https://github.com/electron/electron-api-demos) - an Electron app that teaches you how to use Electron +- [hokein/electron-sample-apps](https://github.com/hokein/electron-sample-apps) - small demo apps for the various Electron APIs + +## License + +[CC0 1.0 (Public Domain)](LICENSE.md) diff --git a/admin.css b/admin.css new file mode 100644 index 0000000..e69de29 diff --git a/admin.html b/admin.html new file mode 100644 index 0000000..4ea1ed9 --- /dev/null +++ b/admin.html @@ -0,0 +1,18 @@ + + + + + Hello World! + + +

Click 'start' to begin screen sharing

+ + + + + + + + + diff --git a/admin.js b/admin.js new file mode 100644 index 0000000..a870de6 --- /dev/null +++ b/admin.js @@ -0,0 +1,25 @@ +function makeRequest() { +console.log('Making ajax request') + httpRequest = new XMLHttpRequest(); + + if (!httpRequest) { + alert('Giving up :( Cannot create an XMLHTTP instance'); + return false; + } + httpRequest.open('GET', 'http://127.0.0.1:5140/streamlist'); + httpRequest.onreadystatechange = function(e) { + if (request.readyState === 4) { + if (request.status === 200) { + console.log(request.responseText) + } + } + } + httpRequest.send() +} + + +document.addEventListener('DOMContentLoaded', function() { + let streamlist = document.getElementById("streamlist") + console.log('Document is ready') + document.getElementById("streams").addEventListener('click', makeRequest); +}) diff --git a/main.js b/main.js new file mode 100644 index 0000000..13bcaa3 --- /dev/null +++ b/main.js @@ -0,0 +1,72 @@ +const electron = require('electron') +const http = require('http') +const path = require('path') +const url = require('url') +const fs = require('fs') +const app = electron.app +const BrowserWindow = electron.BrowserWindow +const ipcMain = electron.ipcMain + +let mainWindow + +function beginRendererProcess() { + mainWindow = new BrowserWindow({show: true, webPreferences: { webSecurity: false, experimentalFeatures: true}}) + mainWindow.loadURL(url.format({ + pathname: path.join(__dirname, 'renderer.html'), + protocol: 'file:', + slashes: true + })) + mainWindow.webContents.openDevTools() +} + +function captureStream() { + mainWindow.webContents.send('defaultStreamRequest', 'slr') + let p = new Promise((resolve,reject) => { + ipcMain.on('defaultStreamResponse', (event, arg) => { + console.log('defaultStreamResponse') + console.log(arg) + resolve(arg) + }) + }) + + return p +} + + +const routes = { + '/': function root(response) { + response.write(fs.readFileSync('admin.html')) + response.end() + }, + '/admin.js': function js(response) { + response.write(fs.readFileSync('admin.js')) + response.end() + }, + '/admin.css': function css(response) { + response.write(fs.readFileSync('admin.css')) + response.end() + }, + '/favicon.ico': function favicon() { + return 'strapp' + response.end() + }, + '/streamlist': function streamlist(response) { + let mediaStream = captureStream().then((stream) => { + console.log(stream) + }) + + //response.write(mediaStream) + } +} + +app.on('ready', function() { + beginRendererProcess() + + + http.createServer(function(request, response) { + const url = request.url + console.log('routing to ' + url); + routes[url](response) + + }).listen(5140); +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..e9ab6fa --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "strapp", + "version": "0.0.0", + "description": "A distributed desktop sharer", + "main": "main.js", + "scripts": { + "start": "electron ." + }, + "repository": "", + "keywords": [ + "WebRTC", + "Cool", + "Screen Sharing", + "Distributed", + "Prototype" + ], + "author": "Jordan Lavatai", + "license": "MIT", + "devDependencies": { + "electron": "~1.6.2" + } +} diff --git a/renderer.html b/renderer.html new file mode 100644 index 0000000..ee9a802 --- /dev/null +++ b/renderer.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/renderer.js b/renderer.js new file mode 100644 index 0000000..c6d45c5 --- /dev/null +++ b/renderer.js @@ -0,0 +1,39 @@ +const ipcRenderer = require('electron').ipcRenderer +const {desktopCapturer} = require('electron') + + +function getDefaultStream(event) { + console.log('getDefaultStream') + desktopCapturer.getSources({types: ['window', 'screen']}, (error, sources) => { + if (error) { + console.log(error) + return + } + for (let i = 0; i < sources.length; ++i) { + if (sources[i].name === 'Screen 1') { + navigator.mediaDevices.getUserMedia({ + audio: false, + video: { + mandatory: { + chromeMediaSource: 'desktop', + chromeMediaSourceId: sources[i].id, + minWidth: 1280, + maxWidth: 1280, + minHeight: 720, + maxHeight: 720 + } + } + }).then((stream) => { + console.log(stream) + event.sender.send('defaultStreamResponse', stream) + }) + } + } + return + }) +} + +ipcRenderer.on('defaultStreamRequest', (event, message) => { + console.log('defaultStreamRequest received, grabbing media stream for screen1') + getDefaultStream(event) +}) -- 2.18.0