diff --git a/.gitignore b/.gitignore index 5bc53a1..d2b21d4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,4 @@ conf *.ts !src/**/* -node_modules +node_modules \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2cacbba..fb4cc6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -637,6 +637,14 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.19.tgz", "integrity": "sha512-tLRDU1hmcWamtgRT2iVRdraAQVGFQGgtcqracSo9XyMN1VeZLSVGb8RJJxVqab7UGbijoUijGPVFMjmqzyZIUw==" }, + "@types/node-fetch": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.0.tgz", + "integrity": "sha512-TLFRywthBgL68auWj+ziWu+vnmmcHCDFC/sqCOQf1xTz4hRq8cu79z8CtHU9lncExGBsB8fXA4TiLDLt6xvMzw==", + "requires": { + "@types/node": "*" + } + }, "@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", @@ -3908,7 +3916,7 @@ "bitcoinjs-lib": "^5.0.4", "bsock": "^0.1.9", "express": "^4.16.4", - "frontblock-generic": "^0.22.0", + "frontblock-generic": "^0.23.0", "hdkey": "^1.1.1", "key-file-storage": "^2.2.1", "log4js": "^4.3.1", @@ -3918,12 +3926,35 @@ "rxjs": "^6.5.2", "rxjs-compat": "^6.5.2", "uuid": "^3.3.2" + }, + "dependencies": { + "frontblock-generic": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/frontblock-generic/-/frontblock-generic-0.23.0.tgz", + "integrity": "sha512-5KukScUCAsomGP9xMp6gQjA5xKBMfctTSQhIoaoxEkXpXoX9F2pjlYIkfP11NYNSsk2gVf3xg7VIhhSzhizy/A==", + "requires": { + "@types/node": "^12.7.1", + "bsock": "^0.1.9", + "http": "0.0.0", + "key-file-storage": "^2.2.4", + "log4js": "^4.2.0", + "minimist": "^1.2.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "@types/node": { + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", + "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==" + } + } + } } }, "frontblock-generic": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/frontblock-generic/-/frontblock-generic-0.22.0.tgz", - "integrity": "sha512-hhojVEeQYt1wakBTBTZAKuCNqvw4CxI9+WuWb7Ark2gaJJMD2+q/FxkrE+VAPDv82Uy7AT3Pn39DkMbyF52hCg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/frontblock-generic/-/frontblock-generic-0.23.0.tgz", + "integrity": "sha512-5KukScUCAsomGP9xMp6gQjA5xKBMfctTSQhIoaoxEkXpXoX9F2pjlYIkfP11NYNSsk2gVf3xg7VIhhSzhizy/A==", "requires": { "@types/node": "^12.7.1", "bsock": "^0.1.9", @@ -3935,12 +3966,17 @@ }, "dependencies": { "@types/node": { - "version": "12.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.1.tgz", - "integrity": "sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw==" + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", + "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==" } } }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -4631,6 +4667,18 @@ "assert-plus": "^1.0.0" } }, + "git-cherrypicker": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/git-cherrypicker/-/git-cherrypicker-0.0.3.tgz", + "integrity": "sha512-zvKaHO33rp05u68IrWz6toYZBWlzrZEccf2fbtJOqZ+hLKSQ9BLffYZ7FtkOd53gmuMW8DhhnhEBp7fdL9H2Ew==", + "requires": { + "@types/node-fetch": "^2.5.0", + "fs": "0.0.1-security", + "node-fetch": "^2.6.0", + "path": "^0.12.7", + "simple-git": "^1.124.0" + } + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -7678,6 +7726,25 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "requires": { + "process": "^0.11.1", + "util": "^0.10.3" + }, + "dependencies": { + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + } + } + } + }, "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", @@ -8450,8 +8517,7 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { "version": "2.0.1", @@ -9627,6 +9693,29 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "simple-git": { + "version": "1.124.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.124.0.tgz", + "integrity": "sha512-ks9mBoO4ODQy/xGLC8Cc+YDvj/hho/IKgPhi6h5LI/sA+YUdHc3v0DEoHzM29VmulubpGCxMJUSFmyXNsjNMEA==", + "requires": { + "debug": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", diff --git a/package.json b/package.json index a5cdb33..14ad7c6 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,9 @@ "tsc": "tsc", "start": "npm run build; node lib/FrontblockAdmin.js", "build": "npm run clean; npm run build-backend; npm run build-frontend", - "build-backend": "tsc; webpack --display-error-details --config src/backend/webpack.prod.js --progress --colors; cp -r lib/PluginManager/* .", - "build-frontend": "npm run build-dashboard; npm run build-widget", - "build-dashboard": "git submodule init && git submodule update --merge; cd src/frontend/dashboard; npm i && npm run build; cp -r dist/dashboard ../../../static", + "build-backend": "tsc; webpack --display-error-details --config src/backend/webpack.prod.js --progress --colors;", + "build-frontend": "npm run build-dashboard", + "build-dashboard": "git submodule init && git submodule update --merge; cd src/frontend/dashboard; npm i && npm run build; cp -r dist/* ../../../static", "build-widget": "rollup -c src/frontend/widget/rollup.config.js; mkdir -p plugins/PluginManager; cp FrontendPlugin.js plugins/PluginManager", "clean": "rm -rf lib static plugins data conf dist widget .rpt2_cache *.js *.ts src/frontend/dashboard/dist", "update-frontblock": "rm -rf node_modules/frontblock*; npm install", @@ -41,6 +41,7 @@ "express": "^4.16.4", "frontblock": "^0.9.9", "frontblock-generic": "latest", + "git-cherrypicker": "0.0.3", "hdkey": "^1.1.1", "http": "0.0.0", "key-file-storage": "^2.2.4", @@ -48,6 +49,7 @@ "memfs": "^2.15.5", "minimist": "^1.2.0", "node-fetch": "^2.6.0", + "path": "^0.12.7", "rollup": "^0.55.1", "rollup-plugin-node-externals": "^2.0.0", "rxjs": "^6.5.2", diff --git a/src/backend/FrontblockAdmin.ts b/src/backend/FrontblockAdmin.ts index 7993c2c..b3d9536 100644 --- a/src/backend/FrontblockAdmin.ts +++ b/src/backend/FrontblockAdmin.ts @@ -3,10 +3,12 @@ import * as Logger from 'log4js' import { socketioRPC, ConfigLoader } from 'frontblock-generic/Plugin'; import { ErrorResponse, SuccessResponse } from 'frontblock-generic/Types'; -import { default as PluginManagerPlugin } from './PluginManager/Plugin' import express = require('express'); import http = require('http'); import bsock = require('bsock'); +import { FrontblockCherryPicker } from "git-cherrypicker" +import { basename } from "path" +import { promises as fs } from "fs" const kfs = require("key-file-storage").default('kfs') @@ -67,11 +69,10 @@ export class FrontblockAdmin extends ConfigLoader{ private httpServer private io = bsock.createServer() private wsServer = http.createServer() - private pm: PluginManagerPlugin + private pm constructor(){ super("FrontblockAdmin") - this.pm = new PluginManagerPlugin() this.initialize() } @@ -81,6 +82,13 @@ export class FrontblockAdmin extends ConfigLoader{ } private async initialize(){ + await fs.mkdir("plugins/PluginManager", {recursive: true}) + await (new FrontblockCherryPicker("fb-dist/pluginmanager", "master", "Plugin.js")).write("plugins/PluginManager/Plugin.js") + await (new FrontblockCherryPicker("fb-dist/pluginmanager", "master", "FrontendPlugin.js")).write("plugins/PluginManager/FrontendPlugin.js") + let str = "../plugins/PluginManager/Plugin" + const PM = await import(str) + this.pm = new PM.default() + this.startWebsocket() this.startWebserver() } @@ -104,11 +112,20 @@ export class FrontblockAdmin extends ConfigLoader{ type:'call', fn: () => { return rpcInfos } } + },{ + owner: 'Admin', + name: 'installPluginManager', + args: '', + info: { + type: 'call', + fn: () => {} + } } ] //translate RPCs to socket-bound function metadata + const loadedPlugins = this.pm.getLoadedPlugins() for(const name in loadedPlugins){ loadedPlugins[name].backend.exportRPCs().forEach(rpc => { @@ -116,6 +133,7 @@ export class FrontblockAdmin extends ConfigLoader{ rpcInfos.push(info) }) } + //Hook up all the functions for(const api of rpcInfos){ @@ -173,6 +191,10 @@ export class FrontblockAdmin extends ConfigLoader{ }) }) } + + private installPluginManager(){ + + } private startWebserver(){ if(this.httpServer != null || this.express != null){ @@ -204,7 +226,7 @@ export class FrontblockAdmin extends ConfigLoader{ /** * redirect all the other traffic to the single - * side app to the main entry point from where + * page app to the main entry point from where * a webpacked and rolled up index.html is serverd * and angular takes over routing */ diff --git a/src/backend/FrontblockLib.ts b/src/backend/FrontblockLib.ts index 143a3b0..c4a60ae 100644 --- a/src/backend/FrontblockLib.ts +++ b/src/backend/FrontblockLib.ts @@ -1,5 +1,4 @@ import { parseSubResponse, parseResponse } from "frontblock-generic/Types"; -import PluginManager from "./PluginManager/PluginManager"; var bsock = require('bsock') /** @@ -78,7 +77,7 @@ export class FrontblockConfigLib{ window['fb'] = new FrontblockConfigLib() -declare const fb:{PluginManager:PluginManager} +declare const fb:{PluginManager:any} window['setup'] = async() => { await Promise.all([ fb.PluginManager.installPlugin("ApiClient"), diff --git a/src/frontend/dashboard b/src/frontend/dashboard index 738b251..73c9c97 160000 --- a/src/frontend/dashboard +++ b/src/frontend/dashboard @@ -1 +1 @@ -Subproject commit 738b2518249aaa5eb5d5e565e62ce91c0211532d +Subproject commit 73c9c973f841e6b49745f3e9eb187397215a0dbf