From 653e6d3d66fba082784e73f728761a3970fcf706 Mon Sep 17 00:00:00 2001 From: Michael Kochell Date: Thu, 23 Jan 2025 06:28:26 +0000 Subject: [PATCH] wip: added defineModule function --- apps/springboard-test/index.ts | 31 +++++++ package-lock.json | 46 +++++----- .../jamtools/core/modules/io/io_module.tsx | 54 ++++++------ packages/springboard/core/engine/engine.tsx | 83 ++++++++++++++++++- packages/springboard/core/engine/register.ts | 63 ++++++++++++++ 5 files changed, 226 insertions(+), 51 deletions(-) create mode 100644 apps/springboard-test/index.ts diff --git a/apps/springboard-test/index.ts b/apps/springboard-test/index.ts new file mode 100644 index 00000000..bb011e66 --- /dev/null +++ b/apps/springboard-test/index.ts @@ -0,0 +1,31 @@ +import {Springboard} from 'springboard/engine/engine'; +import {springboard} from 'springboard/engine/register'; + +const mod = springboard.defineModule('Main', { + externalDependencies: { + mything: async () => { + return { + getTheThing: async () => 'thanks', + }; + }, + }, +}, async (m, deps) => { + const myThing = await deps.externalDependencies.mything(); + + // const macroModule = m.getModule('macro'); +}); + +const engine = new Springboard({} as any, {}); + +engine.registerModule2(mod); +engine.registerModule2(mod, { + externalDependencies: { + mything: async () => { + return { + getTheThing: async () => { + return 'fegfeg'; + }, + } + } + } +}); diff --git a/package-lock.json b/package-lock.json index 1ee9c519..e9ac73c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13397,7 +13397,7 @@ }, "packages/jamtools/core": { "name": "@jamtools/core", - "version": "0.14.0", + "version": "0.14.1", "dependencies": { "easymidi": "^3.0.1", "midi-file": "^1.2.4", @@ -13407,12 +13407,12 @@ "devDependencies": {}, "peerDependencies": { "@tonejs/midi": "^2.0.0", - "springboard": "0.14.0" + "springboard": "0.14.1" } }, "packages/jamtools/features": { "name": "@jamtools/features", - "version": "0.14.0", + "version": "0.14.1", "dependencies": { "jsdom": "^25.0.0", "qrcode": "^1.5.4", @@ -13424,8 +13424,8 @@ "@types/qrcode": "^1.5.5" }, "peerDependencies": { - "@jamtools/core": "0.14.0", - "@springboardjs/shoelace": "0.14.0" + "@jamtools/core": "0.14.1", + "@springboardjs/shoelace": "0.14.1" } }, "packages/observability": { @@ -13441,7 +13441,7 @@ }, "packages/springboard/cli": { "name": "springboard-cli", - "version": "0.14.0", + "version": "0.14.1", "license": "ISC", "dependencies": { "commander": "^12.1.0", @@ -13459,15 +13459,15 @@ "tsx": "^4.19.2" }, "peerDependencies": { - "@springboardjs/platforms-browser": "0.14.0", - "@springboardjs/platforms-node": "0.14.0", - "springboard": "0.14.0", - "springboard-server": "0.14.0" + "@springboardjs/platforms-browser": "0.14.1", + "@springboardjs/platforms-node": "0.14.1", + "springboard": "0.14.1", + "springboard-server": "0.14.1" } }, "packages/springboard/core": { "name": "springboard", - "version": "0.14.0", + "version": "0.14.1", "dependencies": { "dexie": "^4.0.9", "immer": "^10.1.1", @@ -13490,7 +13490,7 @@ }, "packages/springboard/data_storage": { "name": "@springboardjs/data-storage", - "version": "0.14.0", + "version": "0.14.1", "license": "ISC", "dependencies": { "@trpc/client": "^10.45.2", @@ -13508,7 +13508,7 @@ }, "packages/springboard/external/mantine": { "name": "@springboardjs/mantine", - "version": "0.14.0", + "version": "0.14.1", "license": "ISC", "peerDependencies": { "@mantine/core": "^7.13.4", @@ -13516,49 +13516,49 @@ "@mantine/hooks": "^7.13.4", "@mantine/modals": "^7.13.4", "@mantine/notifications": "^7.13.4", - "springboard": "0.14.0" + "springboard": "0.14.1" } }, "packages/springboard/external/shoelace": { "name": "@springboardjs/shoelace", - "version": "0.14.0", + "version": "0.14.1", "license": "ISC", "dependencies": { "@shoelace-style/shoelace": "^2.16.0" }, "peerDependencies": { - "springboard": "0.14.0" + "springboard": "0.14.1" } }, "packages/springboard/platforms/node": { "name": "@springboardjs/platforms-node", - "version": "0.14.0", + "version": "0.14.1", "peerDependencies": { "isomorphic-ws": "^4.0.1", - "springboard": "0.14.0", + "springboard": "0.14.1", "ws": "^8.18.0" } }, "packages/springboard/platforms/webapp": { "name": "@springboardjs/platforms-browser", - "version": "0.14.0", + "version": "0.14.1", "peerDependencies": { "react-router-dom": "^6", - "springboard": "0.14.0" + "springboard": "0.14.1" } }, "packages/springboard/server": { "name": "springboard-server", - "version": "0.14.0", + "version": "0.14.1", "dependencies": { "@hono/node-server": "^1.13.2", "@hono/node-ws": "^1.0.4", "@hono/trpc-server": "^0.3.2" }, "peerDependencies": { - "@springboardjs/data-storage": "0.14.0", + "@springboardjs/data-storage": "0.14.1", "hono": "^4.6.7", - "springboard": "0.14.0" + "springboard": "0.14.1" } } } diff --git a/packages/jamtools/core/modules/io/io_module.tsx b/packages/jamtools/core/modules/io/io_module.tsx index 80698937..91a15f45 100644 --- a/packages/jamtools/core/modules/io/io_module.tsx +++ b/packages/jamtools/core/modules/io/io_module.tsx @@ -24,33 +24,33 @@ let createIoDependencies = (): IoDeps => { }; }; -// @platform "browser" -import {BrowserQwertyService} from '@jamtools/core/services/browser/browser_qwerty_service'; -import {BrowserMidiService} from '@jamtools/core/services/browser/browser_midi_service'; - -createIoDependencies = () => { - const qwerty = new BrowserQwertyService(document); - const midi = new BrowserMidiService(); - return { - qwerty, - midi, - }; -}; -// @platform end - -// @platform "node" -import {NodeQwertyService} from '@jamtools/core/services/node/node_qwerty_service'; -import {NodeMidiService} from '@jamtools/core/services/node/node_midi_service'; - -createIoDependencies = () => { - const qwerty = new NodeQwertyService(); - const midi = new NodeMidiService(); - return { - qwerty, - midi, - }; -}; -// @platform end +// // @platform "browser" +// import {BrowserQwertyService} from '@jamtools/core/services/browser/browser_qwerty_service'; +// import {BrowserMidiService} from '@jamtools/core/services/browser/browser_midi_service'; + +// createIoDependencies = () => { +// const qwerty = new BrowserQwertyService(document); +// const midi = new BrowserMidiService(); +// return { +// qwerty, +// midi, +// }; +// }; +// // @platform end + +// // @platform "node" +// import {NodeQwertyService} from '@jamtools/core/services/node/node_qwerty_service'; +// import {NodeMidiService} from '@jamtools/core/services/node/node_midi_service'; + +// createIoDependencies = () => { +// const qwerty = new NodeQwertyService(); +// const midi = new NodeMidiService(); +// return { +// qwerty, +// midi, +// }; +// }; +// // @platform end export const setIoDependencyCreator = (func: typeof createIoDependencies) => { createIoDependencies = func; diff --git a/packages/springboard/core/engine/engine.tsx b/packages/springboard/core/engine/engine.tsx index 1ad0ecc4..6d59349f 100644 --- a/packages/springboard/core/engine/engine.tsx +++ b/packages/springboard/core/engine/engine.tsx @@ -1,6 +1,6 @@ import {CoreDependencies, ModuleDependencies} from 'springboard/types/module_types'; -import {ClassModuleCallback, ModuleCallback, RegisterModuleOptions, springboard} from './register'; +import {ClassModuleCallback, DefineModuleFuncReturnValue, ModuleCallback, RegisterModuleOptions, springboard} from './register'; import React, {createContext, useContext, useState} from 'react'; @@ -56,6 +56,87 @@ export class Springboard { } }; + initialize2 = async () => { + const websocketConnected = await this.coreDeps.rpc.initialize(); + if (!websocketConnected) { + if ('confirm' in globalThis) { + if (confirm('failed to connect to websocket server. run in local browser mode?')) { + this.coreDeps.isMaestro = () => true; + } + } + } + + this.sharedStateService = new SharedStateService(this.coreDeps); + await this.sharedStateService.initialize(); + + this.moduleRegistry = new ModuleRegistry(); + + const registeredModules = this.preRegisteredModules; + for (const mod of registeredModules) { + await this.initializeModule(mod.definedModule, mod.options); + } + + + // const registeredClassModuleCallbacks = (springboard.registerClassModule as unknown as {calls: CapturedRegisterClassModuleCalls[]}).calls || []; + // springboard.registerClassModule = this.registerClassModule; + + // const registeredModuleCallbacks = (springboard.registerModule as unknown as {calls: CapturedRegisterModuleCalls[]}).calls || []; + // springboard.registerModule = this.registerModule; + + // for (const modClassCallback of registeredClassModuleCallbacks) { + // await this.registerClassModule(modClassCallback); + // } + + // for (const modFuncCallback of registeredModuleCallbacks) { + // await this.registerModule(modFuncCallback[0], modFuncCallback[1], modFuncCallback[2]); + // } + + for (const cb of this.initializeCallbacks) { + cb(); + } + }; + + preRegisteredModules: { + definedModule: DefineModuleFuncReturnValue; + options?: { + externalDependencies?: Partial, + } + }[] = []; + + private initializeModule = async ( + definedModule: DefineModuleFuncReturnValue, + options?: { + externalDependencies?: Partial, + }, + ) => { + const mod: Module = {moduleId: definedModule.moduleId}; + const moduleAPI = new ModuleAPI(mod, 'engine', this.coreDeps, this.makeDerivedDependencies(), this.extraModuleDependencies); + + const moduleReturnValue = await definedModule.initialize(moduleAPI, definedModule.options?.externalDependencies ? { + externalDependencies: { + ...definedModule.options!.externalDependencies!, + ...options?.externalDependencies, + }, + }: {externalDependencies: {} as any}); + + Object.assign(mod, moduleReturnValue); + + this.moduleRegistry.registerModule(mod); + return {module: mod, api: moduleReturnValue}; + } + + public registerModule2 = ( + definedModule: DefineModuleFuncReturnValue, + options?: { + externalDependencies?: Partial, + }, + ) => { + this.preRegisteredModules.push({ + definedModule, + options, + }); + }; + public registerModule = async ( moduleId: string, options: ModuleOptions, diff --git a/packages/springboard/core/engine/register.ts b/packages/springboard/core/engine/register.ts index 447b93a6..2eaa98cb 100644 --- a/packages/springboard/core/engine/register.ts +++ b/packages/springboard/core/engine/register.ts @@ -20,12 +20,66 @@ export type SpringboardRegistry = { ) => void; registerClassModule: (cb: ClassModuleCallback) => void; reset: () => void; + defineModule: , ModuleReturnValue extends object>( + moduleId: ModuleId, + options: ModuleOptions & {externalDependencies: ExternalDependencies}, + cb: DefineModuleCallback, + ) => DefineModuleFuncReturnValue; }; +export type DefineModuleCallback = (moduleAPI: ModuleAPI, deps: {externalDependencies: ExternalDependencies}) => + Promise | ModuleReturnValue; + export type RegisterModuleOptions = { }; +export type DefineModuleOptions = { + externalDependencies?: ExternalDependencies; +}; + +export type DefineModuleFuncReturnValue = { + moduleId: ModuleId; + options: DefineModuleOptions + initialize: DefineModuleCallback; +} + +const mod = springboard.defineModule('Main', { + externalDependencies: { + x: async () => { + return 'hey' + } + }, +}, async (m, deps) => { + deps.externalDependencies.x().then(s => s.length); +}); + +type RegisterModuleFunc = ( + definedModule: DefineModuleFuncReturnValue, + options?: { + externalDependencies?: Partial; + } +) => { + +} + +const registerModule2 = ( + definedModule: DefineModuleFuncReturnValue, + options?: { + externalDependencies?: Partial, + }, +) => { + +} + +registerModule2(mod, { + externalDependencies: { + x: async () => '', + }, +}); + +registerModule2(mod); + type CapturedRegisterModuleCall = [string, RegisterModuleOptions, ModuleCallback]; const registerModule = ( @@ -53,6 +107,15 @@ export const springboard: SpringboardRegistry = { springboard.registerModule = registerModule; springboard.registerClassModule = registerClassModule; }, + defineModule: (moduleId, options, cb) => { + return { + moduleId, + options, + initialize: async (moduleAPI, deps) => { + return cb(moduleAPI, deps); + }, + } + }, }; (globalThis as unknown as {springboard: SpringboardRegistry}).springboard = springboard;