feat core
- server/client middlewares
This commit is contained in:
parent
d8df9fa7ef
commit
622676d189
@ -1,7 +1,6 @@
|
|||||||
import { Rpc } from '@entityseven/rage-fw-rpc'
|
import { Rpc } from '@entityseven/rage-fw-rpc'
|
||||||
|
|
||||||
export const rpc = new Rpc({
|
export const rpc = new Rpc({
|
||||||
forceBrowserDevMode:
|
forceBrowserDevMode: process.env.RageFW_forceBrowserDevMode === 'true',
|
||||||
process.env.RageFW_forceBrowserDevMode === 'true' ?? false,
|
|
||||||
debugLogs: false,
|
debugLogs: false,
|
||||||
})
|
})
|
||||||
|
@ -1,16 +1,24 @@
|
|||||||
import { rpc } from './rpc'
|
import { rpc } from './rpc'
|
||||||
|
import { Middleware } from './middleware'
|
||||||
import type * as T from '../types'
|
import type * as T from '../types'
|
||||||
|
|
||||||
export class Client {
|
export class Client {
|
||||||
public register<EventName extends T.RageFW_ClientEvent>(
|
public register<EventName extends T.RageFW_ClientEvent>(
|
||||||
eventName: EventName,
|
eventName: EventName,
|
||||||
callback: T.RageFW_ClientCallback<EventName>,
|
callback: T.RageFW_ClientCallback<EventName>,
|
||||||
|
options?: {
|
||||||
|
middlewares?: T.RageFW_MiddlewareOptions<EventName>
|
||||||
|
},
|
||||||
): Client {
|
): Client {
|
||||||
rpc.register<
|
rpc.register<
|
||||||
Parameters<typeof callback>,
|
Parameters<typeof callback>,
|
||||||
ReturnType<typeof callback>,
|
ReturnType<typeof callback> | Promise<unknown>,
|
||||||
EventName
|
EventName
|
||||||
>(eventName, async (...data) => await callback(...data))
|
>(eventName, async (...data) => {
|
||||||
|
if (!options?.middlewares) return await callback(...data)
|
||||||
|
|
||||||
|
await Middleware.process(options.middlewares, callback, data)
|
||||||
|
})
|
||||||
|
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
export * from './client'
|
export * from './client'
|
||||||
export * from './logger'
|
export * from './logger'
|
||||||
|
export * from './middleware'
|
||||||
export * from './player'
|
export * from './player'
|
||||||
export * from './rpc'
|
export * from './rpc'
|
||||||
|
54
client/src/core/middleware.ts
Normal file
54
client/src/core/middleware.ts
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import type * as T from '../types'
|
||||||
|
|
||||||
|
export class Middleware {
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
private static async execute<EventName extends T.RageFW_ClientEvent>(
|
||||||
|
middlewares: T.RageFW_MiddlewareFunction<EventName>[],
|
||||||
|
args: T.RageFW_ClientArgs<EventName>,
|
||||||
|
): Promise<T.RageFW_MiddlewareResponseInternal> {
|
||||||
|
for (let i = 0; i < middlewares.length; i++) {
|
||||||
|
const result = await middlewares[i](...args)
|
||||||
|
|
||||||
|
if (typeof result === 'boolean' && !result)
|
||||||
|
return { success: result, id: i }
|
||||||
|
if (typeof result !== 'boolean' && !result.success)
|
||||||
|
return { ...result, id: i }
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async process<EventName extends T.RageFW_ClientEvent>(
|
||||||
|
middlewareOptions: T.RageFW_MiddlewareOptions<EventName>,
|
||||||
|
callback: T.RageFW_ClientCallback<EventName>,
|
||||||
|
args: T.RageFW_ClientArgs<EventName>,
|
||||||
|
) {
|
||||||
|
if (Array.isArray(middlewareOptions)) {
|
||||||
|
const middlewaresResponse = await Middleware.execute(
|
||||||
|
middlewareOptions,
|
||||||
|
args,
|
||||||
|
)
|
||||||
|
|
||||||
|
if (middlewaresResponse.success) return await callback(...args)
|
||||||
|
} else {
|
||||||
|
const middlewaresResponse = await Middleware.execute(
|
||||||
|
middlewareOptions.executables,
|
||||||
|
args,
|
||||||
|
)
|
||||||
|
|
||||||
|
if (middlewaresResponse.success) {
|
||||||
|
return await callback(...args)
|
||||||
|
} else {
|
||||||
|
middlewareOptions.onError(
|
||||||
|
middlewaresResponse.message ??
|
||||||
|
'Middleware with id ' +
|
||||||
|
middlewaresResponse.id +
|
||||||
|
' failed',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
import { Client, Logger, Player, rpc } from './core'
|
import { Client, Logger, Player, rpc } from './core'
|
||||||
|
|
||||||
|
export type { RageFW_MiddlewareFunction } from './types'
|
||||||
|
|
||||||
export const fw = {
|
export const fw = {
|
||||||
event: new Client(),
|
event: new Client(),
|
||||||
player: new Player(),
|
player: new Player(),
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
export * from './client'
|
|
||||||
export * from './server'
|
|
||||||
export * from './browser'
|
export * from './browser'
|
||||||
|
export * from './client'
|
||||||
|
export * from './middleware'
|
||||||
|
export * from './server'
|
||||||
|
26
client/src/types/middleware.ts
Normal file
26
client/src/types/middleware.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import type * as T from './client'
|
||||||
|
|
||||||
|
export type RageFW_MiddlewareResponse =
|
||||||
|
| {
|
||||||
|
success: boolean
|
||||||
|
message?: string
|
||||||
|
}
|
||||||
|
| boolean
|
||||||
|
|
||||||
|
export type RageFW_MiddlewareResponseInternal = {
|
||||||
|
success: boolean
|
||||||
|
message?: string
|
||||||
|
id?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export type RageFW_MiddlewareFunction<EventName extends T.RageFW_ClientEvent> =
|
||||||
|
(
|
||||||
|
...args: T.RageFW_ClientArgs<EventName>
|
||||||
|
) => Promise<RageFW_MiddlewareResponse>
|
||||||
|
|
||||||
|
export type RageFW_MiddlewareOptions<EventName extends T.RageFW_ClientEvent> =
|
||||||
|
| RageFW_MiddlewareFunction<EventName>[]
|
||||||
|
| {
|
||||||
|
executables: RageFW_MiddlewareFunction<EventName>[]
|
||||||
|
onError: (error: string) => unknown
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
export * from './logger'
|
export * from './logger'
|
||||||
|
export * from './middleware'
|
||||||
export * from './player'
|
export * from './player'
|
||||||
export * from './rpc'
|
export * from './rpc'
|
||||||
export * from './server'
|
export * from './server'
|
||||||
|
54
server/src/core/middleware.ts
Normal file
54
server/src/core/middleware.ts
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import type * as T from '../types'
|
||||||
|
|
||||||
|
export class Middleware {
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
private static async execute<EventName extends T.RageFW_ServerEvent>(
|
||||||
|
middlewares: T.RageFW_MiddlewareFunction<EventName>[],
|
||||||
|
args: T.RageFW_ServerArgs<EventName>,
|
||||||
|
): Promise<T.RageFW_MiddlewareResponseInternal> {
|
||||||
|
for (let i = 0; i < middlewares.length; i++) {
|
||||||
|
const result = await middlewares[i](...args)
|
||||||
|
|
||||||
|
if (typeof result === 'boolean' && !result)
|
||||||
|
return { success: result, id: i }
|
||||||
|
if (typeof result !== 'boolean' && !result.success)
|
||||||
|
return { ...result, id: i }
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async process<EventName extends T.RageFW_ServerEvent>(
|
||||||
|
middlewareOptions: T.RageFW_MiddlewareOptions<EventName>,
|
||||||
|
callback: T.RageFW_ServerCallback<EventName>,
|
||||||
|
args: T.RageFW_ServerArgs<EventName>,
|
||||||
|
) {
|
||||||
|
if (Array.isArray(middlewareOptions)) {
|
||||||
|
const middlewaresResponse = await Middleware.execute(
|
||||||
|
middlewareOptions,
|
||||||
|
args,
|
||||||
|
)
|
||||||
|
|
||||||
|
if (middlewaresResponse.success) return await callback(...args)
|
||||||
|
} else {
|
||||||
|
const middlewaresResponse = await Middleware.execute(
|
||||||
|
middlewareOptions.executables,
|
||||||
|
args,
|
||||||
|
)
|
||||||
|
|
||||||
|
if (middlewaresResponse.success) {
|
||||||
|
return await callback(...args)
|
||||||
|
} else {
|
||||||
|
middlewareOptions.onError(
|
||||||
|
middlewaresResponse.message ??
|
||||||
|
'Middleware with id ' +
|
||||||
|
middlewaresResponse.id +
|
||||||
|
' failed',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,16 +1,24 @@
|
|||||||
import { rpc } from './rpc'
|
import { rpc } from './rpc'
|
||||||
|
import { Middleware } from './middleware'
|
||||||
import type * as T from '../types'
|
import type * as T from '../types'
|
||||||
|
|
||||||
export class Server {
|
export class Server {
|
||||||
public register<EventName extends T.RageFW_ServerEvent>(
|
public register<EventName extends T.RageFW_ServerEvent>(
|
||||||
eventName: EventName,
|
eventName: EventName,
|
||||||
callback: T.RageFW_ServerCallback<EventName>,
|
callback: T.RageFW_ServerCallback<EventName>,
|
||||||
|
options?: {
|
||||||
|
middlewares?: T.RageFW_MiddlewareOptions<EventName>
|
||||||
|
},
|
||||||
): Server {
|
): Server {
|
||||||
rpc.register<
|
rpc.register<
|
||||||
Parameters<typeof callback>,
|
Parameters<typeof callback>,
|
||||||
ReturnType<typeof callback>,
|
ReturnType<typeof callback> | Promise<unknown>,
|
||||||
EventName
|
EventName
|
||||||
>(eventName, async (...data) => await callback(...data))
|
>(eventName, async (...data) => {
|
||||||
|
if (!options?.middlewares) return await callback(...data)
|
||||||
|
|
||||||
|
await Middleware.process(options.middlewares, callback, data)
|
||||||
|
})
|
||||||
|
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
import { Logger, Player, Server, rpc } from './core'
|
import { Logger, Player, Server, rpc } from './core'
|
||||||
|
|
||||||
|
export type { RageFW_MiddlewareFunction } from './types'
|
||||||
|
|
||||||
export const fw = {
|
export const fw = {
|
||||||
event: new Server(),
|
event: new Server(),
|
||||||
player: new Player(),
|
player: new Player(),
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
export * from './client'
|
|
||||||
export * from './server'
|
|
||||||
export * from './browser'
|
export * from './browser'
|
||||||
|
export * from './client'
|
||||||
|
export * from './middleware'
|
||||||
|
export * from './server'
|
||||||
|
26
server/src/types/middleware.ts
Normal file
26
server/src/types/middleware.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import type * as T from './server'
|
||||||
|
|
||||||
|
export type RageFW_MiddlewareResponse =
|
||||||
|
| {
|
||||||
|
success: boolean
|
||||||
|
message?: string
|
||||||
|
}
|
||||||
|
| boolean
|
||||||
|
|
||||||
|
export type RageFW_MiddlewareResponseInternal = {
|
||||||
|
success: boolean
|
||||||
|
message?: string
|
||||||
|
id?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export type RageFW_MiddlewareFunction<EventName extends T.RageFW_ServerEvent> =
|
||||||
|
(
|
||||||
|
...args: T.RageFW_ServerArgs<EventName>
|
||||||
|
) => Promise<RageFW_MiddlewareResponse>
|
||||||
|
|
||||||
|
export type RageFW_MiddlewareOptions<EventName extends T.RageFW_ServerEvent> =
|
||||||
|
| RageFW_MiddlewareFunction<EventName>[]
|
||||||
|
| {
|
||||||
|
executables: RageFW_MiddlewareFunction<EventName>[]
|
||||||
|
onError: (error: string) => unknown
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user