added sockets listeners handlers & update debuggers

This commit is contained in:
srgooglo 2020-10-21 17:35:31 +02:00
parent ecaed88419
commit e71f8aa03b
7 changed files with 270 additions and 165 deletions

View File

@ -159,7 +159,7 @@ function createWindow() {
];
tray.setContextMenu(Menu.buildFromTemplate(trayMenuTemplate))
tray.setToolTip(packagejson.title)
tray.setToolTip(app_config.siteName)
tray.on('double-click', () => resumeApp())
mainWindow.loadURL(app_path)

5
package-lock.json generated
View File

@ -14932,6 +14932,11 @@
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
"integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
},
"howler": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/howler/-/howler-2.2.0.tgz",
"integrity": "sha512-sGPkrAQy7jh5mNDbkRNG0F82R2HFDYNsQXBcX4smXQT0y0F4UMsa/+jXaGwWvcrajWr2tDB7JUkH7G5qSnuIyQ=="
},
"hpack.js": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",

View File

@ -57,6 +57,7 @@
"enquire-js": "^0.2.1",
"fast-json-stringify": "^2.2.9",
"feather-reactjs": "^2.0.13",
"howler": "^2.2.0",
"html2canvas": "^1.0.0-rc.7",
"jquery": "^3.5.1",
"jsonwebtoken": "^8.5.1",

View File

@ -3,13 +3,14 @@ import verbosity from 'core/libs/verbosity'
import settings from 'core/libs/settings'
import { notify } from 'core/libs/appInterface'
export default class SocketConnection{
export default class SocketConnection {
ioConn: any
state: { connAttemps: number; registeredNamespaces: any; }
state: { connAttemps: number; registeredNamespaces: any; connectionState: any; listeners: any; }
props: any
opts: any
dispatcher: any;
constructor(props:any){
constructor(props: any) {
if (!props) {
throw new Error("Mmm some props are not defined")
}
@ -17,8 +18,10 @@ export default class SocketConnection{
this.dispatcher = props.connector
this.state = {
listeners: {},
connectionState: "init",
connAttemps: Number(0),
registeredNamespaces: []
registeredNamespaces: [],
}
this.opts = {
@ -62,21 +65,60 @@ export default class SocketConnection{
extraHeaders: {},
}
if (typeof(this.props) !== "undefined") {
this.opts = { ...this.opts, ...this.props}
if (typeof (this.props) !== "undefined") {
this.opts = { ...this.opts, ...this.props }
}
verbosity([`New socket connection, with parameters =>`, this.opts], { color: "blue" })
this.ioConn = io(this.opts.hostname, this.opts)
this.ioConn.on('connect', (event:any) => {
this.ioConn.handleUpdateState = (payload) => {
this.state = { ...this.state, ...payload }
this.dispatcher({ type: "socket/updateState", payload: this.state })
}
this.ioConn.handleUpdateListener = (listenerKey, toState) => {
if (!listenerKey)
return false
const getInvert = () => {
if (this.state.listeners[listenerKey] != null) {
return !this.state.listeners[listenerKey]
} else {
return true // this set activated listener by default if not exist any entries
}
}
let updatedObj = []
updatedObj[listenerKey] = toState ?? getInvert()
let updatedState = this.state.listeners
updatedState = { ...updatedState, ...updatedObj }
this.ioConn.handleUpdateState({ listeners: updatedState })
}
this.ioConn._emit = (...context) => {
const listenerKey = context[0]
if (typeof (this.state.listeners[listenerKey]) == "undefined") {
this.ioConn.handleUpdateListener(listenerKey, true)
}
if (this.state.listeners[listenerKey] != null && !this.state.listeners[listenerKey]) {
verbosity([`Listener [${listenerKey}] is broked!`])
// setTimeout(() => {
// this.ioConn.handleUpdateListener(listenerKey)
// }, 1000)
return false
}
return this.ioConn.emit(...context)
}
this.ioConn.on('connect', (event: any) => {
notify.success("You are now online")
verbosity("Successfully connect")
this.ioConn.handleUpdateState({ connectionState: "connected" })
props.then(true) // this send an signal when the socket its successfully connected
})
this.ioConn.on("connect_error", (event:any) => {
this.ioConn.on("connect_error", (event: any) => {
if (this.state.connAttemps >= this.opts.reconnectionAttempts) {
verbosity(['Maximun nº of attemps reached => max', this.opts.reconnectionAttempts + 1])
this.ioConn.close()
@ -86,34 +128,28 @@ export default class SocketConnection{
this.state.connAttemps = this.state.connAttemps + 1
})
this.ioConn.on('reconnect', (attemptNumber:number) => {
verbosity(["Connection reconected with (", attemptNumber , ") tries"])
this.ioConn.on('reconnect', (attemptNumber: number) => {
verbosity(["Connection reconected with (", attemptNumber, ") tries"])
notify.success("You are now online")
})
this.ioConn.on('disconnected', () => {
notify.warn("You are offline")
this.ioConn.handleUpdateState({ connectionState: "connected" })
})
this.ioConn.on('error', (event:any) => {
this.ioConn.on('disconnected', () => {
notify.warn("You are offline")
this.ioConn.handleUpdateState({ connectionState: "disconnected" })
})
this.ioConn.on('error', (event: any) => {
notify.error(event)
})
this.ioConn.on('close', () => {
verbosity("Connection closed!")
})
this.ioConn.on('updateState', (event:any) => {
verbosity(["updating state > ", event])
this.dispatcher({ type: "socket/updateState", payload: event })
this.ioConn.handleUpdateState({ connectionState: "closed" })
})
this.ioConn.on('pingPong', (e:any) => {
// woops
const n = e + 1
const fart = new Audio("https://dl.ragestudio.net/pedo_cum.mp3")
fart.play()
setTimeout(() => { this.ioConn.emit("pingPong", n) }, n)
this.ioConn.on('updateState', (event: any) => {
this.ioConn.handleUpdateState(event)
})
}

View File

@ -91,7 +91,7 @@ export default {
window.PluginGlobals = []
window.Internal = []
queryIndexer([
{
match: '/s;:id',
@ -112,13 +112,13 @@ export default {
], (callback) => {
window.location = callback
})
if (!service) {
}
if (!sessionDataframe && session ) {
if (!sessionDataframe && session) {
yield put({ type: 'handleGetUserData' })
}
@ -128,14 +128,17 @@ export default {
const state = yield select(state => state)
verbosity([`Starting Auth process`])
yield put({ type: 'socket/initializeSocket', payload: {
hostname: state.app.socket_address,
reconnectionAttempts: 10
}, then: () => {
//socket.socket_conn.emit("pingPong")
}})
yield put({
type: 'socket/initializeSocket',
payload: {
hostname: state.app.socket_address,
reconnectionAttempts: 10
},
then: () => {
return console.log("recived")
}
})
},
@ -144,7 +147,7 @@ export default {
const token = yield select(state => state.app.session_token)
const sk = yield select(state => state.app.server_key)
session.deauth({ id: uuid, userToken: token, server_key: sk }, (err, res) =>{
session.deauth({ id: uuid, userToken: token, server_key: sk }, (err, res) => {
verbosity([res])
})
@ -155,104 +158,104 @@ export default {
const { user_id, access_token } = payload.authFrame
yield put({ type: 'handleLogin', payload: { user_id, access_token, user_data: payload.dataFrame } })
},
*initializePlugins({ payload }, { select }){
const extended = yield select(state => state.extended)
*initializePlugins({ payload }, { select }) {
const extended = yield select(state => state.extended)
if(!payload.array){
verbosity("Only array map for initialize plugins","Please read SDK documentation for more info.")
return false
}
try {
usePlugins([payload.array], (err, results) => {
if (err) {
verbosity(["Init error!", err])
appInterface.notify.error("Plugin initialize error!", err)
return false
}
const rootInit = results[0]
if (!rootInit.uuid) {
verbosity("Cannot initialize a plugin without UUID.","Please read SDK documentation for more info.")
appInterface.notify.error("Cannot initialize a plugin without UUID.")
if (!payload.array) {
verbosity("Only array map for initialize plugins", "Please read SDK documentation for more info.")
return false
}
try {
usePlugins([payload.array], (err, results) => {
if (err) {
verbosity(["Init error!", err])
appInterface.notify.error("Plugin initialize error!", err)
return false
}
const rootInit = results[0]
if (!rootInit.uuid) {
verbosity("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
let extendedRequire = null
class extendedPlugin extends rootClass {
constructor(props) {
super(props)
}
}
if (typeof (plugin.requireExtends) !== "undefined") {
console.log("Extending class with => ", plugin.requireExtends)
plugin.requireExtends.forEach((e) => {
const RequireFrom = e.from
const RequireImport = e.import
const existScheme = typeof (RequireImport) !== "undefined" && typeof (RequireFrom) !== "undefined"
if (!existScheme) {
verbosity("Invalid require extension!")
return false
}
let plugin = {
uuid: null,
version: "n/a",
title: "Blank"
}
plugin = {...plugin, ...rootInit}
const rootClass = plugin.payload
let extendedRequire = null
class extendedPlugin extends rootClass{
constructor(props){
super(props)
}
}
if( typeof(plugin.requireExtends) !== "undefined" ) {
console.log("Extending class with => ", plugin.requireExtends)
plugin.requireExtends.forEach((e) => {
const RequireFrom = e.from
const RequireImport = e.import
const existScheme = typeof(RequireImport) !== "undefined" && typeof(RequireFrom) !== "undefined"
if(!existScheme){
verbosity("Invalid require extension!")
return false
}
if (Array.isArray(RequireImport)) {
RequireImport.forEach((e) => {
`console`.log(`Importing " ${e} " from [ ${RequireFrom} ]`)
extendedRequire[e] = require(RequireFrom)
})
}else{
}
if (Array.isArray(RequireImport)) {
RequireImport.forEach((e) => {
`console`.log(`Importing " ${e} " from [ ${RequireFrom} ]`)
extendedRequire[e] = require(RequireFrom)
})
} else {
}
window.PluginGlobals[plugin.uuid] = new extendedPlugin({ extended, extendedRequire })
appInterface.notify.open({
message: `${plugin.title} v${plugin.version}`,
description: `New plugin is now installed !`
})
})
} catch (error) {
verbosity("Unexpected catched exception! ", error)
}
}
window.PluginGlobals[plugin.uuid] = new extendedPlugin({ extended, extendedRequire })
appInterface.notify.open({
message: `${plugin.title} v${plugin.version}`,
description: `New plugin is now installed !`
})
})
} catch (error) {
verbosity("Unexpected catched exception! ", error)
}
},
*updateTheme({payload}, {put, select}){
*updateTheme({ payload }, { put, select }) {
if (!payload) return false
let container = yield select(state => state.app.app_theme)
let style_keys = []
let tmp = []
container.forEach((e)=>{style_keys[e.key] = e.value})
container.forEach((e) => { style_keys[e.key] = e.value })
if(!style_keys[payload.key]){
tmp.push({key: payload.key, value: payload.value})
if (!style_keys[payload.key]) {
tmp.push({ key: payload.key, value: payload.value })
}
container.forEach((e) => {
let obj = {}
if(e.key === payload.key){
if (e.key === payload.key) {
obj = { key: payload.key, value: payload.value }
}else{
} else {
obj = { key: e.key, value: e.value }
}
tmp.push(obj)
})
return tmp? yield put({ type: 'handleUpdateTheme', payload: tmp }) : null
return tmp ? yield put({ type: 'handleUpdateTheme', payload: tmp }) : null
},
*updateFrames({payload}, { select, put }) {
*updateFrames({ payload }, { select, put }) {
try {
const session = yield select(state => state.app.session_valid);
let sessionAuthframe = cookie.get(app_config.session_token_storage)
@ -292,12 +295,12 @@ export default {
handleUpdateAuthFrames(state, { payload }) {
state.session_authframe = payload
state.session_token = payload.session_token,
state.session_uuid = payload.session_uuid
state.session_uuid = payload.session_uuid
},
handleUpdateDataFrames(state, { payload }) {
state.session_data = payload
},
handleValidate(state){
handleValidate(state) {
if (state.session_authframe) {
if (settings("session_noexpire")) {
state.session_valid = true
@ -308,19 +311,18 @@ export default {
const now = new Date().getTime()
verbosity(
`TOKEN EXP => ${tokenExp} ${
settings("session_noexpire") ? '( Infinite )' : `( ${tokenExpLocale} )`
`TOKEN EXP => ${tokenExp} ${settings("session_noexpire") ? '( Infinite )' : `( ${tokenExpLocale} )`
} || NOW => ${now}`
)
if (tokenExp < now) {
state.session_valid = false
}else{
} else {
state.session_valid = true
}
}
},
handleLogin(state, { payload }){
handleLogin(state, { payload }) {
if (!payload) return false
state.session_token = payload.access_token
@ -339,7 +341,7 @@ export default {
isDev: sessionData.dev,
isPro: sessionData.is_pro
}
}
jwt.sign(frame, state.server_key, (err, token) => {
@ -355,27 +357,27 @@ export default {
state.session_valid = true
location.reload()
},
handleGetUserData(state){
handleGetUserData(state) {
const frame = {
id: state.session_uuid,
access_token: state.session_token,
serverKey: state.server_key
}
user.get.data(frame, (err, res) => {
if(err) {
verbosity([err])
}
if (res) {
try {
const session_data = JSON.stringify(res.response)
sessionStorage.setItem(app_config.session_data_storage, btoa(session_data))
} catch (error) {
verbosity([error])
}
if (err) {
verbosity([err])
}
if (res) {
try {
const session_data = JSON.stringify(res.response)
sessionStorage.setItem(app_config.session_data_storage, btoa(session_data))
} catch (error) {
verbosity([error])
}
}
})
},
handleCollapseSidebar(state, { payload }){
handleCollapseSidebar(state, { payload }) {
state.sidebar_collapsed = payload
},
handleUpdateTheme(state, { payload }) {
@ -383,40 +385,40 @@ export default {
store.set(app_config.appTheme_container, payload);
state.app_theme = payload
},
requireQuery(state, { payload, callback }){
if(!payload || !callback) return false
requireQuery(state, { payload, callback }) {
if (!payload || !callback) return false
switch (payload) {
case 'login':{
case 'login': {
callback(state.session_valid)
break;
}
case 'guest':{
case 'guest': {
callback(!state.session_valid)
break;
}
case 'dev':{
if(state.session_data){
return callback(state.session_data.dev? true : false)
case 'dev': {
if (state.session_data) {
return callback(state.session_data.dev ? true : false)
}
return callback(false)
}
case 'embedded':{
callback(state.electron? true : false)
case 'embedded': {
callback(state.electron ? true : false)
break;
}
default:{
default: {
break;
}
}
},
ipcInvoke(state, {payload}){
ipcInvoke(state, { payload }) {
if (!payload || !state.embedded) {
return false
}
const ipc = state.electron.ipcRenderer
ipc.invoke(payload.key, payload.payload)
},
ipcSend(state, {payload}){
ipcSend(state, { payload }) {
if (!payload || !state.embedded) {
return false
}

View File

@ -5,45 +5,99 @@ import { user, session } from 'core/models'
import { router, verbosity, appInterface } from 'core/libs'
import settings from 'core/libs/settings'
import { __legacy__objectToArray } from 'core'
import { Howl, Howler } from 'howler'
import SocketConnection from 'core/libs/socket/index.ts'
import jwt from 'jsonwebtoken'
import cookie from 'cookie_js'
const defaultSocketAddress = "localhost:7000"
export default {
namespace: 'socket',
state: {
resolvers: null,
ioConn: null
ioConn: null,
listeners: {}
},
subscriptions: {
setup({ dispatch }) {
dispatch({ type: 'query' })
dispatch({ type: 'query' })
},
},
effects: {
*query({ payload }, { call, put, select }) {
const state = yield select(state => state)
yield put({ type: "updateState", payload: { resolvers: state.app.resolvers } })
const state = yield select(state => state)
yield put({ type: "updateState", payload: { resolvers: state.app.resolvers } })
},
*initializeSocket({payload, then}, {select, put}){
if(!payload) return false
const state = yield select(state => state)
const handleThen = () => {
if (typeof(then) !== "undefined") {
then(true)
}
}
*initializeSocket({ payload, then }, { select, put }) {
if (!payload) return false
const state = yield select(state => state)
const handleThen = () => {
if (typeof (then) !== "undefined") {
console.log("then callback activated")
return then(true)
}
}
yield put({
type: "handleSocket",
payload: new SocketConnection({ payload, connector: state.app.dispatcher, then: handleThen })
})
},
*break({ listener }, { select, put }) {
const state = yield select(state => state.socket)
state.ioConn.handleUpdateListener(listener, false)
},
*resume({ listener }, { select, put }) {
const state = yield select(state => state.socket)
state.ioConn.handleUpdateListener(listener, true)
},
*toogleListener({ listener }, { select, put }) {
const state = yield select(state => state.socket)
state.ioConn.handleUpdateListener(listener)
},
*floodTest({ ticks, offset }, { call, put, select }) {
const state = yield select(state => state)
if (ticks == null) {
ticks = 300
}
const tickSound = new Howl({
preload: true,
html5: true,
src: ["https://dl.ragestudio.net/tick.wav"]
})
const endSound = new Howl({
preload: true,
html5: true,
src: ["https://dl.ragestudio.net/tickUp.wav"]
})
state.socket.ioConn._emit("floodTest", offset ?? Number(0)) // start flood
state.socket.ioConn.on('floodTest', (e: any) => {
const n = e + 1
const canTick = n < (ticks + 1)
verbosity([`floodTest (recived)=> ${e} | sending => ${n}`])
if (canTick) {
setTimeout(() => {
state.socket.ioConn._emit("floodTest", n)
tickSound.play()
}, n)
}else{
endSound.play()
}
})
yield put({
type: "handleSocket",
payload: new SocketConnection({payload, connector: state.app.dispatcher, then: handleThen })
})
},
},
reducers: {
@ -54,8 +108,7 @@ export default {
};
},
handleSocket(state, { payload }) {
console.log(payload.ioConn)
state.ioConn = payload.ioConn
state.ioConn = payload.ioConn
},
},
};

View File

@ -1,15 +1,23 @@
import React from 'react'
import ReduxDebugger from 'debuggers/redux'
import { FloatComponent } from 'components'
import { connect } from 'umi'
@connect((store) => (store))
export default class Index extends React.Component {
handleOpenFloat() {
FloatComponent({ children: <ReduxDebugger {...this.props} />, title: "redux debugger" })
}
render() {
const dispatch = this.props.dispatch
return (
<div>
<button onClick={() => this.handleOpenFloat()}> open on float </button>
<ReduxDebugger />
<button onClick={() => dispatch({type: "socket/floodTest", ticks: 100 })}> start floodTest </button>
<button onClick={() => dispatch({type: "socket/toogleListener", listener: "floodTest" })}> break floodTest </button>
<button onClick={() => dispatch({type: "socket/break", listener: "floodTest" })}> fullbreak </button>
</div>
)
}