Skip to content

Commit

Permalink
Launcher simulado (#250)
Browse files Browse the repository at this point in the history
  • Loading branch information
kaisermann authored and Pedroglp committed Nov 14, 2018
1 parent 1f2e67f commit 78c6240
Show file tree
Hide file tree
Showing 17 changed files with 484 additions and 123 deletions.
2 changes: 1 addition & 1 deletion packages/cli/namespaces/app/commands/start.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ module.exports = {
description: 'Enable debug level log.',
alias: ['d'],
default: false,
choices: [false, 1, 2],
choices: [false, 1, 2, 3],
},
}),
};
72 changes: 72 additions & 0 deletions packages/pos/simulator/plugins/app/includes/eventCollector.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/**
* This file overrides the default add/remove event listeners to collect possible loose ones
* when unlisten them when the current app closes.
*/

export default AppManager => {
const originalAddEventListener = EventTarget.prototype.addEventListener;
const originalRemoveEventListener = EventTarget.prototype.removeEventListener;

EventTarget.prototype.addEventListener = function addEventListener(
type,
fn,
capture,
) {
originalAddEventListener.call(this, type, fn, capture);

const currentApp = AppManager.getCurrentApp();

/** Only collect events if there's an app running */
if (currentApp && currentApp.runtime) {
const targetConstructor = this.constructor.name;

if (
targetConstructor === 'Window' ||
targetConstructor === 'HTMLDocument'
) {
const { collectedEvents } = currentApp.runtime;
if (!collectedEvents[targetConstructor]) {
collectedEvents[targetConstructor] = {};
}

if (!collectedEvents[targetConstructor][type]) {
collectedEvents[targetConstructor][type] = [];
}

collectedEvents[targetConstructor][type].push(fn);
}
}
};

EventTarget.prototype.removeEventListener = function addEventListener(
type,
fn,
) {
originalRemoveEventListener.call(this, type, fn);

const currentApp = AppManager.getCurrentApp();

/** Only remove collected events if an app is opened */
if (currentApp && currentApp.runtime) {
const targetConstructor = this.constructor.name;

if (
targetConstructor === 'Window' ||
targetConstructor === 'HTMLDocument'
) {
const { collectedEvents } = currentApp.runtime;
if (collectedEvents[targetConstructor][type]) {
const fnIndex = collectedEvents[targetConstructor][type].indexOf(fn);

if (fnIndex > -1) {
collectedEvents[targetConstructor][type].splice(fnIndex, 1);
}

if (!collectedEvents[targetConstructor][type].length) {
delete collectedEvents[targetConstructor][type];
}
}
}
}
};
};
91 changes: 67 additions & 24 deletions packages/pos/simulator/plugins/app/manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,26 @@ import Signal from '../../libs/signal.js';
import App from '../../../api/app.js';
import extendDriver from '../../../drivers/extend.js';
import { log, warn } from '../../libs/utils.js';
import initEventCollector from './includes/eventCollector.js';

const AppManager = extendDriver({});
const AppManager = extendDriver({}, initEventCollector);

const Apps = new Map();
let currentApp = null;

Signal.register(AppManager, ['opened', 'closed']);
Signal.register(AppManager, [
'appInstalled',
'willOpen',
'opened',
'willClose',
'closed',
]);

AppManager.getLoaded = () => Apps;
AppManager.getCurrent = () => currentApp;
AppManager.getInstalledApps = () => Apps;
AppManager.getCurrentApp = () => currentApp;

AppManager.register = (AppConstructor, manifest) => {
if (!Apps.has(AppConstructor)) {
AppManager.installApp = (AppConstructor, manifest) => {
if (!Apps.has(manifest.slug)) {
const appMetaObj = {
constructor: AppConstructor,
manifest,
Expand All @@ -27,52 +34,88 @@ AppManager.register = (AppConstructor, manifest) => {
DriverManager.clearLooseDrivers();
}

Apps.set(AppConstructor, appMetaObj);
Apps.set(manifest.slug, appMetaObj);

AppManager.fire('appInstalled', appMetaObj);
}
};

AppManager.open = (AppConstructor, target) => {
AppConstructor = AppConstructor || currentApp.constructor;
target = target || currentApp.target;
AppManager.open = (appSlug, target) => {
AppManager.fire('willOpen');

target = target || document.getElementById('app-root');

/** First time opening an app */
const appMetaObj = Apps.get(AppConstructor);
const appMetaObj = Apps.get(appSlug);

if (__DEV__) log(`Opening App: ${appMetaObj.manifest.appName}`);

appMetaObj.instance = new AppConstructor({ target });
appMetaObj.target = target;
if (!target) {
if (__DEV__) {
console.warn('App target root element not found.');
}
return;
}

appMetaObj.runtime = {
target,
collectedEvents: {},
};

currentApp = appMetaObj;
currentApp.runtime.instance = new appMetaObj.constructor({ target });

App.opened();
AppManager.fire('opened');
App.fire('opened');
};

AppManager.close = () => {
if (__DEV__) log('Closing App');
AppManager.fire('willClose');

App.closed();
if (__DEV__) log('Closing App');

if (currentApp.instance) {
currentApp.instance.destroy();
currentApp.instance = null;
App.fire('closed');

if (currentApp.runtime.instance) {
const { runtime } = currentApp;
runtime.instance.destroy();
delete currentApp.runtime;

const collectedEventsKeys = Object.keys(runtime.collectedEvents);
collectedEventsKeys.forEach(targetConstructor => {
let node;

if (targetConstructor === 'Window') node = window;
if (targetConstructor === 'HTMLDocument') node = document;

if (node) {
const eventTypes = Object.keys(
runtime.collectedEvents[targetConstructor],
);
eventTypes.forEach(eventType => {
runtime.collectedEvents[targetConstructor][eventType].forEach(fn => {
node.removeEventListener(eventType, fn);
if (__DEBUG_LVL__ >= 3) {
log('Removing collected DOM event listener: ');
console.log([node, eventType, fn]);
}
});
});
}
});

if (currentApp.drivers) {
currentApp.drivers.forEach(driverModule => {
DriverManager.resetDriverState(driverModule);
});
}

currentApp = null;
} else if (__DEV__) {
warn('App already closed');
}

AppManager.fire('closed');
};

AppManager.restart = () => {
AppManager.once('closed', () => AppManager.open());
AppManager.close();
};

export default AppManager;
36 changes: 36 additions & 0 deletions packages/pos/simulator/plugins/registry/includes/clock.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
export default Registry => {
const initDate = new Date();

const time = {
hours: String(initDate.getHours()).padStart(2, '0'),
minutes: String(initDate.getMinutes()).padStart(2, '0'),
};

Registry.getCurrentTime = () => time;

const timer = () => {
let hours = Number.parseInt(time.hours, 10);
let minutes = Number.parseInt(time.minutes, 10);

minutes++;
if (minutes === 60) {
hours++;
if (hours === 24) {
hours = 0;
}
minutes = 0;
}

time.hours = String(hours).padStart(2, '0');
time.minutes = String(minutes).padStart(2, '0');

Registry.fire('clock', time.hours, time.minutes);

return timer;
};

setTimeout(
() => setInterval(timer(), 60000),
(60 - initDate.getSeconds()) * 1000,
);
};
46 changes: 46 additions & 0 deletions packages/pos/simulator/plugins/registry/includes/data.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { log } from '../../../libs/utils.js';

export default Registry => {
/** Data */
Registry.get = keyPath => {
if (keyPath === undefined) {
return Registry._data;
}

const keys = keyPath.replace(/\[(\d+)\]/g, '.$1').split('.');
let value = Registry._data[keys[0]];
for (let i = 1; i < keys.length; i++) {
value = value[keys[i]];
}
return value;
};

Registry.set = (keyPath, value, fireSignal = true) => {
if (keyPath === undefined) {
return;
}

const keys = keyPath.replace(/\[(\d+)\]/g, '.$1').split('.');
const lastKey = keys.pop();

if (__DEBUG_LVL__ >= 2 && __BROWSER__) {
log(`"${keyPath}" = ${JSON.stringify(value)}`);
}

// If not a nested keyPath
if (keys[0] === undefined) {
Registry._data[lastKey] = value;
return;
}

let object = Registry._data[keys[0]];
for (let i = 1; i < keys.length; i++) {
object = object[keys[i]];
}
object[lastKey] = value;

if (fireSignal) {
Registry.settingsChanged(Registry._data);
}
};
};
66 changes: 18 additions & 48 deletions packages/pos/simulator/plugins/registry/manager.js
Original file line number Diff line number Diff line change
@@ -1,62 +1,32 @@
/**
* This file is the boilerplate for the simulator core driver;
* */
import { log } from '../../libs/utils.js';
import Signal from '../../libs/signal.js';
import extendDriver from '../../../drivers/extend.js';

const RegistryManager = extendDriver({
_booted: false,
_data: {},
});
import initClock from './includes/clock.js';
import initData from './includes/data.js';

Signal.register(RegistryManager, ['settingsChanged']);
const RegistryManager = extendDriver(
{
_version: '2.5.0',
_clock: { hours: null, min: null },
_booted: false,
_data: {},
},
initClock,
initData,
);

RegistryManager.setBoot = isBooted => {
if (RegistryManager._booted) return;
RegistryManager._booted = isBooted;
};

RegistryManager.get = keyPath => {
if (keyPath === undefined) {
return RegistryManager._data;
}

const keys = keyPath.replace(/\[(\d+)\]/g, '.$1').split('.');
let value = RegistryManager._data[keys[0]];
for (let i = 1; i < keys.length; i++) {
value = value[keys[i]];
}
return value;
};

RegistryManager.set = (keyPath, value, fireSignal = true) => {
if (keyPath === undefined) {
return;
}
Signal.register(RegistryManager, ['settingsChanged', 'clock']);

const keys = keyPath.replace(/\[(\d+)\]/g, '.$1').split('.');
const lastKey = keys.pop();

if (__DEBUG_LVL__ >= 2 && __BROWSER__) {
log(`"${keyPath}" = ${JSON.stringify(value)}`);
}

// If not a nested keyPath
if (keys[0] === undefined) {
RegistryManager._data[lastKey] = value;
RegistryManager.setBoot = isBooted => {
if (RegistryManager._booted) {
return;
}

let object = RegistryManager._data[keys[0]];
for (let i = 1; i < keys.length; i++) {
object = object[keys[i]];
}
object[lastKey] = value;

if (fireSignal) {
RegistryManager.settingsChanged(RegistryManager._data);
}
RegistryManager._booted = isBooted;
};

RegistryManager.getVersion = () => RegistryManager._version;

export default RegistryManager;
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
</div>

<script>
import Core from '../../../core.js';
import Core from '../../core.js';

let lastKeypressTime = 0;

Expand Down
Loading

0 comments on commit 78c6240

Please sign in to comment.