UNPKG

appjs

Version:

AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS

142 lines (115 loc) 3.63 kB
var EventEmitter = require('events').EventEmitter, Router = require('./router').Router, Window = require('./window'), Menu = require('./menu'), _App = require('./bindings').App, NativeWindow = require('./bindings').NativeWindow, NativeMenu = require('./bindings').NativeMenu, NativeStatusIcon = require('./bindings').NativeStatusIcon, WindowSettings = require('./settings').WindowSettings, AppSettings = require('./settings').AppSettings; var _init = require('./bindings').init, decorate = require('./utils').decorate, inherit = require('./utils').inherit, isObject = require('./utils').isObject, staticRouter = require('./router').staticRouter, pathResolve = require('path').resolve; var concat = Array.prototype.concat; var pipedEvents = ['create', 'minimize', 'maximize', 'fullscreen', 'restore', 'move', 'resize']; module.exports = App; function App(){ var self = this; process.on('appjs-exit', function(){ self.exit(); }); process.on('appjs-request', function(request, callback){ self.emit('request', request, callback); }); this.windows = {}; this.router = new Router(this); } inherit(App, EventEmitter, [ function createMenu(options){ if (!this.settings) { this.init(); } var self = this, menu = new Menu(options); return menu; }, function createStatusIcon(options){ if (!this.settings) { this.init(); } if(options.icon) { options.icon = pathResolve(__dirname,'../../../..',options.icon); } var self = this, nativeStatusIcon = new NativeStatusIcon(options); inherit(nativeStatusIcon, EventEmitter, [ function toString(){ return '[object StatusIcon]'; } ]); return nativeStatusIcon; }, function createWindow(url, options){ if (!this.settings) { this.init(); } options = new WindowSettings(url, options); var self = this, nativeWindow = new NativeWindow(options), window = new Window(nativeWindow); nativeWindow.name = options.name; this.windows[options.name] = window; nativeWindow.on('close', function(){ window.emit('close'); delete self.windows[options.name]; }); pipedEvents.forEach(function(event){ nativeWindow.pipe(event, window); }); this.emit('create-window', window); return window; }, function exit(){ this.emit('exit'); Object.keys(this.windows).forEach(function(name){ var window = this.windows[name]; if (window && window.close) { window.close(); } }, this); process.nextTick(function(){ process.kill(process.pid); }); }, function serveFilesFrom(root){ this.router.use(staticRouter(root)); return this; }, function init(settings){ if (!this.settings) { decorate(this, true, { settings: Object.freeze(new AppSettings(settings)) }); _init(this.settings); this.emit('init', settings); } return this; }, _App.screenHeight, _App.screenWidth, ]); NativeMenu.prototype.__proto__ = process.EventEmitter.prototype; NativeWindow.prototype.__proto__ = process.EventEmitter.prototype; NativeStatusIcon.prototype.__proto__ = process.EventEmitter.prototype; decorate(NativeWindow.prototype, [ function pipe(event, target){ var emit = target.emit; this.on(event, function(){ emit.apply(target, concat.apply(event, arguments)); }); } ]);