update: model extended

update: plugin remote std lib
This commit is contained in:
srgooglo 2020-09-25 22:49:12 +02:00
parent 7dcad5b9bb
commit e5991cb678
8 changed files with 173 additions and 4 deletions

View File

@ -40,6 +40,7 @@
"axios": "^0.19.2",
"babel-core": "^6.26.3",
"classnames": "^2.2.6",
"concat-stream": "^2.0.0",
"cookie_js": "^1.4.0",
"dotenv": "^8.2.0",
"electron-config": "^2.0.0",
@ -80,12 +81,14 @@
"redux-socket.io": "^1.4.0",
"redux-thunk": "^2.3.0",
"request": "^2.88.2",
"requirejs": "^2.3.6",
"simple-icons": "^3.8.0",
"socket.io-client": "^2.3.0",
"stack-trace": "0.0.10",
"store": "^2.0.12",
"styled-components": "^5.2.0",
"timeago.js": "^4.0.2",
"vm": "^0.1.0",
"wait-on": "^5.2.0"
},
"devDependencies": {

26
plugins/index.js Normal file
View File

@ -0,0 +1,26 @@
import verbosity from 'core/libs/verbosity';
const http = require('http')
, vm = require('vm')
, concat = require('concat-stream')
, async = require('async');
export function http_require(url, callback) {
http.get(url, function(res) {
// console.log('fetching: ' + url)
res.setEncoding('utf8');
res.pipe(concat({encoding: 'string'}, function(data) {
callback(null, vm.runInThisContext(data));
}));
})
}
export function usePlugins(array, callback){
async.map(array, http_require, function(err, results) {
// `results` is an array of values returned by `runInThisContext`
// the rest of your program logic
if(callback){
callback(err, results)
}
})
}

View File

@ -7,7 +7,7 @@ import Sider_Default from './default'
import { connect } from 'umi'
import MenuList from 'globals/sidebar_menu.js'
@connect(({ app }) => ({ app }))
@connect(({ app, extended }) => ({ app, extended }))
class Sider extends React.PureComponent {
state = {
loading: true,
@ -61,7 +61,12 @@ class Sider extends React.PureComponent {
}
componentDidMount(){
this.menuQuery(MenuList)
const extended = this.props.extended.sidebar
if(extended){
console.log("Extending state with => ", extended)
this.setState({ ...this.state, extended })
}
this.menuQuery(MenuList)
}

View File

@ -0,0 +1,25 @@
import localforage from 'localforage'
import { package_json } from 'core'
// Dynamic secure data container processor
export class DynamicSDCP {
constructor(props){
if(props){
this.props = props
}
this.instanceConfig = {
name: props.name? props.name : `dynamicSDCP_${Math.random().toFixed()}`,
driver : localforage.WEBSQL, // Force WebSQL; same as using setDriver()
version : 1.0,
size : 4980736, // Size of database, in bytes. WebSQL-only for now.
storeName : package_json.UUID, // Should be alphanumeric, with underscores.
}
localforage.config(this.instanceConfig)
this.instance = localforage.createInstance(this.instanceConfig)
}
useInstance(){
console.log('Using ', this.instance)
}
}

View File

@ -3,5 +3,6 @@ import * as appInterface from './appInterface'
export * from './settings'
export * from './router'
export * from './verbosity'
export * from './extension'
export { v3_model, appInterface }

View File

@ -5,9 +5,11 @@ import { user, session } from 'core/helpers'
import { router, verbosity, appInterface } from 'core/libs'
import settings from 'core/libs/settings'
import { uri_resolver } from 'api/lib'
import { connect } from 'umi'
import jwt from 'jsonwebtoken'
import cookie from 'cookie_js'
import { usePlugins } from 'plugins'
export default {
namespace: 'app',
@ -57,7 +59,7 @@ export default {
})
dispatch({ type: 'updateFrames' })
dispatch({ type: 'handleValidate' })
dispatch({ type: 'query' });
dispatch({ type: 'query', payload: { dispatcher: dispatch } });
},
setupHistory({ dispatch, history }) {
history.listen(location => {
@ -89,6 +91,8 @@ export default {
const session = yield select(state => state.app.session_valid)
const sessionDataframe = yield select(state => state.app.session_data)
window.PluginGlobals = []
if (!service) {
console.error('❌ Cannot connect with validate session service!')
}
@ -124,7 +128,6 @@ export default {
verbosity.debug(res)
})
yield put({ type: 'sessionErase' })
},
*login({ payload }, { call, put, select }) {
if (!payload) return false;
@ -133,6 +136,55 @@ export default {
},
*guestLogin({ payload }, { put, select }) {
},
*initializePlugins({ payload }, { select }){
const extended = yield select(state => state.extended)
if(!payload.array){
verbosity.error("Only array map for initialize plugins","Please read SDK documentation for more info.")
return false
}
try {
usePlugins([payload.array], (err, results) => {
if (err) {
verbosity.error("Init error!", err)
appInterface.notify.error("Plugin initialize error!", err)
return false
}
const rootInit = results[0]
if (!rootInit.uuid) {
verbosity.error("Cannot initialize a plugin without UUID.","Please read SDK documentation for more info.")
appInterface.notify.error("Cannot initialize a plugin without UUID.")
return false
}
let plugin = {
uuid: null,
version: "n/a",
title: "Blank"
}
plugin = {...plugin, ...rootInit}
const rootClass = plugin.payload
class extendedPlugin extends rootClass{
constructor(props){
super(props)
}
}
window.PluginGlobals[plugin.uuid] = new extendedPlugin(extended)
appInterface.notify.open({
message: `${plugin.title} v${plugin.version}`,
description: `New plugin is now installed !`
})
})
} catch (error) {
verbosity.error("Unexpected catched exception! ", error)
}
},
*updateTheme({payload}, {put, select}){
if (!payload) return false

39
src/models/extended.js Normal file
View File

@ -0,0 +1,39 @@
import store from 'store'
import { app_config } from 'config'
import keys from 'config/app_keys'
import { user, session } from 'core/helpers'
import { router, verbosity, appInterface } from 'core/libs'
import settings from 'core/libs/settings'
import { uri_resolver } from 'api/lib'
import { DynamicSDCP } from 'core/libs/extension'
import jwt from 'jsonwebtoken'
import cookie from 'cookie_js'
export default {
namespace: 'extended',
state: {
sidebar: null,
contextMenu: null,
core: null
},
subscriptions: {
setup({ dispatch }) {
dispatch({ type: 'query' });
},
},
effects: {
*query({ payload }, { call, put, select }) {
}
},
reducers: {
updateState(state, { payload }) {
return {
...state,
...payload,
};
},
},
};

View File

@ -1,13 +1,31 @@
import React from 'react'
import * as antd from 'antd'
import * as core from 'core'
import { connect } from 'umi'
@connect(({ app, extended }) => ({ app, extended }))
export default class CoreDebug extends React.Component {
state = {
rawPluginInitInput: null
}
handleInitPlugin(e){
this.props.dispatch({
type: "app/initializePlugins",
payload: {
array: e
}
})
}
render(){
const handleGenerateUUID = () => { console.log(core.generateUUID()) }
const handleChange = (e) => { this.setState({ rawPluginInitInput: e.target.value }) }
return(
<div>
<antd.Button onClick={() => handleGenerateUUID()} >generate uuid</antd.Button>
<antd.Card>
<antd.Input onChange={handleChange} value={this.state.rawPluginInitInput} placeholder="https://api.ragestudio.net/std/example.js" />
<antd.Button onClick={() => { this.handleInitPlugin(this.state.rawPluginInitInput) }} > init </antd.Button>
</antd.Card>
</div>
)
}