Bläddra i källkod

dev: add startup apps, start emulator by default

KernelDeimos 8 månader sedan
förälder
incheckning
0acd904176

+ 3 - 0
doc/devmeta/track-comments.md

@@ -57,3 +57,6 @@ Comments beginning with `// track:`. See
   It may be applicable to write an iterator in the
   It may be applicable to write an iterator in the
   future, or something will come up that require
   future, or something will come up that require
   these to be handled with a modular approach instead.
   these to be handled with a modular approach instead.
+- `track: checkpoint`
+  A location where some statement about the state of the
+  software must hold true.

+ 2 - 2
src/backend/src/services/BaseService.js

@@ -16,11 +16,11 @@
  * You should have received a copy of the GNU Affero General Public License
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
  */
-const { AdvancedBase } = require("../../../putility");
+const { concepts } = require("@heyputer/putility");
 
 
 const NOOP = async () => {};
 const NOOP = async () => {};
 
 
-class BaseService extends AdvancedBase {
+class BaseService extends concepts.Service {
     constructor (service_resources, ...a) {
     constructor (service_resources, ...a) {
         const { services, config, my_config, name, args } = service_resources;
         const { services, config, my_config, name, args } = service_resources;
         super(service_resources, ...a);
         super(service_resources, ...a);

+ 6 - 0
src/gui/src/UI/UIDesktop.js

@@ -1022,6 +1022,12 @@ async function UIDesktop(options){
     // adjust window container to take into account the toolbar height
     // adjust window container to take into account the toolbar height
     $('.window-container').css('top', window.toolbar_height);
     $('.window-container').css('top', window.toolbar_height);
 
 
+    // track: checkpoint
+    //-----------------------------
+    // GUI is ready to launch apps!
+    //-----------------------------
+
+    globalThis.services.emit('gui:ready');
 
 
     //--------------------------------------------------------------------------------------
     //--------------------------------------------------------------------------------------
     // Determine if an app was launched from URL
     // Determine if an app was launched from URL

+ 7 - 2
src/gui/src/definitions.js

@@ -17,9 +17,13 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
  */
 
 
-import { AdvancedBase } from "@heyputer/putility";
+import { concepts, AdvancedBase } from "@heyputer/putility";
 
 
-export class Service {
+export class Service extends concepts.Service {
+    // TODO: Service todo items
+    static TODO = [
+        'consolidate with BaseService from backend'
+    ];
     construct (o) {
     construct (o) {
         this.$puter = {};
         this.$puter = {};
         for ( const k in o ) this.$puter[k] = o[k];
         for ( const k in o ) this.$puter[k] = o[k];
@@ -28,6 +32,7 @@ export class Service {
     }
     }
     init (...a) {
     init (...a) {
         if ( ! this._init ) return;
         if ( ! this._init ) return;
+        this.services = a[0].services;
         return this._init(...a)
         return this._init(...a)
     }
     }
 };
 };

+ 5 - 0
src/gui/src/initgui.js

@@ -55,6 +55,11 @@ const launch_services = async function (options) {
     const services_m_ = {};
     const services_m_ = {};
     globalThis.services = {
     globalThis.services = {
         get: (name) => services_m_[name],
         get: (name) => services_m_[name],
+        emit: (id, args) => {
+            for (const [_, instance] of services_l_) {
+                instance.__on(id, args ?? []);
+            }
+        }
     };
     };
     const register = (name, instance) => {
     const register = (name, instance) => {
         services_l_.push([name, instance]);
         services_l_.push([name, instance]);

+ 17 - 0
src/gui/src/services/ProcessService.js

@@ -22,6 +22,10 @@ import { InitProcess, Service } from "../definitions.js";
 const NULL_UUID = '00000000-0000-0000-0000-000000000000';
 const NULL_UUID = '00000000-0000-0000-0000-000000000000';
 
 
 export class ProcessService extends Service {
 export class ProcessService extends Service {
+    static INITRC = [
+        'test-emu'
+    ];
+
     async _init () {
     async _init () {
         this.processes = [];
         this.processes = [];
         this.processes_map = new Map();
         this.processes_map = new Map();
@@ -33,6 +37,19 @@ export class ProcessService extends Service {
         this.register_(root);
         this.register_(root);
     }
     }
 
 
+    ['__on_gui:ready'] () {
+        const svc_exec = this.services.get('exec');
+        for ( let spec of ProcessService.INITRC ) {
+            if ( typeof spec === 'string' ) {
+                spec = { name: spec };
+            }
+
+            svc_exec.launchApp({
+                app_name: spec.name,
+            });
+        }
+    }
+
     get_init () {
     get_init () {
         return this.processes_map.get(NULL_UUID);
         return this.processes_map.get(NULL_UUID);
     }
     }

+ 4 - 0
src/putility/index.js

@@ -17,10 +17,14 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
  */
 const { AdvancedBase } = require('./src/AdvancedBase');
 const { AdvancedBase } = require('./src/AdvancedBase');
+const { Service } = require('./src/concepts/Service');
 
 
 module.exports = {
 module.exports = {
     AdvancedBase,
     AdvancedBase,
     libs: {
     libs: {
         promise: require('./src/libs/promise'),
         promise: require('./src/libs/promise'),
     },
     },
+    concepts: {
+        Service,
+    },
 };
 };

+ 26 - 0
src/putility/src/concepts/Service.js

@@ -0,0 +1,26 @@
+const { AdvancedBase } = require("../AdvancedBase");
+
+const NOOP = async () => {};
+
+/**
+ * Service will be incrementally updated to consolidate
+ * BaseService in Puter's backend with Service in Puter's frontend,
+ * becoming the common base for both and a useful utility in general.
+ */
+class Service extends AdvancedBase {
+    async __on (id, args) {
+        const handler = this.__get_event_handler(id);
+
+        return await handler(id, ...args);
+    }
+
+    __get_event_handler (id) {
+        return this[`__on_${id}`]?.bind?.(this)
+            || this.constructor[`__on_${id}`]?.bind?.(this.constructor)
+            || NOOP;
+    }
+}
+
+module.exports = {
+    Service,
+};