Compare commits

...
Author SHA1 Message Date
rilaxik 1467bb65b0 fix: missing types 2024-07-21 16:27:37 +01:00
Oleksandr Honcharov f08291eace deleted types 2024-07-03 14:43:24 +03:00
rilaxik 75b528ca45 renamed types to follow similar naming pattern 2024-06-18 21:03:33 +01:00
rilaxik 22ed5c4588 refactored server file structure + init middlewares 2024-06-18 18:42:31 +01:00
Oleksandr Honcharov 22e2c6f980 v0.1.0 2024-06-15 16:47:36 +03:00
Oleksandr Honcharov 059dc7bed8 production files readme 2024-06-15 16:47:14 +03:00
sashagoncharov19 93b0cb1979 Update cli/src/utils/update.ts 2024-06-15 13:42:17 +00:00
rilaxik 37fdfa6d90 added issue template 2024-06-15 14:35:36 +01:00
rilaxik 7bf9433bef readme bump 2024-06-14 20:44:45 +01:00
rilaxik 15254a35ba readme docs reference 2024-06-14 19:06:47 +01:00
rilaxik 2b523fcbe5 license 2024-06-14 18:09:24 +01:00
rilaxik 4f4723625e readme bump 2024-06-14 17:59:16 +01:00
rilaxik 93922288b1 readme updates + wiki references 2024-06-14 17:58:04 +01:00
Oleksandr Honcharov 630c06bb91 v0.0.30-alpha.0 2024-06-13 23:08:00 +03:00
Oleksandr Honcharov 31136ad7e0 some fixes 2024-06-13 23:07:43 +03:00
Oleksandr Honcharov e9f77bf88d v0.0.29-alpha.0 2024-06-13 22:57:52 +03:00
Oleksandr Honcharov 424513dd56 v0.0.28-alpha.0 2024-06-13 22:48:02 +03:00
Oleksandr Honcharov 36c241a117 cli rework 2024-06-13 22:47:33 +03:00
37 changed files with 501 additions and 313 deletions

No files matched your search

+63
View File
@@ -0,0 +1,63 @@
name: Bug Report
about: Create a report to help us improve
rules:
- All issues must be reported in English
- Ensure you have searched for existing issues before creating a new one
- Provide as much detail as possible to help us resolve the issue efficiently
body:
- type: dropdown
id: package_version
attributes:
label: Package Version
description: Select the version of the package where the bug was found
options:
- 0.1.0
validations:
required: true
- type: textarea
id: bug_description
attributes:
label: Bug Description
description: Provide a detailed description of the bug
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Reproduction (Optional)
description: Steps to reproduce the bug, if applicable
validations:
required: true
- type: dropdown
id: os
attributes:
label: OS Where the Bug Was Found
description: Select the operating system where the bug was found
options:
- Windows
- macOS
- Linux
- Other (please specify at the end of bug description)
validations:
required: true
- type: input
id: cli_version
attributes:
label: CLI Version (Optional)
description: Specify the CLI version if used
validations:
required: false
- type: textarea
id: additional_information
attributes:
label: Additional Information
description: Add any other information that might be useful in diagnosing the issue
validations:
required: false
+3 -2
View File
@@ -1,10 +1,11 @@
{
"name": "rage-fw-cef",
"version": "0.0.27-alpha.0",
"version": "0.1.0",
"main": "dist/index.js",
"types": "dist/src/index.d.ts",
"files": [
"dist/**/*"
"dist/**/*",
"readme.md"
],
"scripts": {
"build": "tsup"
+2
View File
@@ -0,0 +1,2 @@
# RageFW CEF
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki/Docs)
+6 -6
View File
@@ -4,15 +4,15 @@ import {
_CefEventHasArgs,
_ClientEventHasArgs,
_ServerEventHasArgs,
RageFW_CefArguments,
RageFW_CefArgs,
RageFW_CefCallback,
RageFW_CefReturn,
RageFW_ClientArguments,
RageFW_ClientArgs,
RageFW_ClientReturn,
RageFW_ICustomCefEvent,
RageFW_ICustomClientEvent,
RageFW_ICustomServerEvent,
RageFW_ServerArguments,
RageFW_ServerArgs,
RageFW_ServerReturn,
} from './types'
@@ -29,7 +29,7 @@ class Cef {
public trigger<EventName extends keyof RageFW_ICustomCefEvent>(
eventName: EventName,
...args: _CefEventHasArgs<EventName> extends true
? [RageFW_CefArguments<EventName>]
? [RageFW_CefArgs<EventName>]
: []
): Promise<RageFW_CefReturn<EventName>> {
if ('mp' in window) {
@@ -44,7 +44,7 @@ class Cef {
public triggerServer<EventName extends keyof RageFW_ICustomServerEvent>(
eventName: EventName,
...args: _ServerEventHasArgs<EventName> extends true
? [RageFW_ServerArguments<EventName>]
? [RageFW_ServerArgs<EventName>]
: []
): Promise<RageFW_ServerReturn<EventName>> {
if ('mp' in window) {
@@ -59,7 +59,7 @@ class Cef {
public triggerClient<EventName extends keyof RageFW_ICustomClientEvent>(
eventName: EventName,
...args: _ClientEventHasArgs<EventName> extends true
? [RageFW_ClientArguments<EventName>]
? [RageFW_ClientArgs<EventName>]
: []
): Promise<RageFW_ClientReturn<EventName>> {
if ('mp' in window) {
+3 -2
View File
@@ -1,4 +1,5 @@
import { RageFW_ICustomCefEvent } from 'rage-fw-shared-types'
export { RageFW_ICustomCefEvent } from 'rage-fw-shared-types'
/**
@@ -11,7 +12,7 @@ export type RageFW_CefEvent = keyof RageFW_ICustomCefEvent
* Array of arguments of an event you pass as a generic
* These only include custom cef events
*/
export type RageFW_CefArguments<K extends RageFW_CefEvent> = Parameters<
export type RageFW_CefArgs<K extends RageFW_CefEvent> = Parameters<
RageFW_ICustomCefEvent[K]
>
@@ -28,7 +29,7 @@ export type RageFW_CefReturn<K extends RageFW_CefEvent> = ReturnType<
* These only include custom cef events
*/
export type RageFW_CefCallback<K extends keyof RageFW_ICustomCefEvent> = (
args: RageFW_CefArguments<K>,
args: RageFW_CefArgs<K>,
) => RageFW_CefReturn<K>
export type _CefEventHasArgs<EventName extends keyof RageFW_ICustomCefEvent> =
+2 -1
View File
@@ -1,4 +1,5 @@
import type { RageFW_ICustomClientEvent } from 'rage-fw-shared-types'
export type { RageFW_ICustomClientEvent } from 'rage-fw-shared-types'
/**
@@ -11,7 +12,7 @@ export type RageFW_ClientEvent = keyof RageFW_ICustomClientEvent
* Array of arguments of event you pass as a generic
* These only include custom client events
*/
export type RageFW_ClientArguments<K extends RageFW_ClientEvent> = Parameters<
export type RageFW_ClientArgs<K extends RageFW_ClientEvent> = Parameters<
RageFW_ICustomClientEvent[K]
>
+2 -1
View File
@@ -1,4 +1,5 @@
import type { RageFW_ICustomServerEvent } from 'rage-fw-shared-types'
export type { RageFW_ICustomServerEvent } from 'rage-fw-shared-types'
/**
@@ -11,7 +12,7 @@ export type RageFW_ServerEvent = keyof RageFW_ICustomServerEvent
* Array of arguments of event you pass as a generic
* These only include custom server events
*/
export type RageFW_ServerArguments<K extends RageFW_ServerEvent> = Parameters<
export type RageFW_ServerArgs<K extends RageFW_ServerEvent> = Parameters<
RageFW_ICustomServerEvent[K]
>
+3 -2
View File
@@ -1,6 +1,6 @@
{
"name": "create-rage-fw",
"version": "0.0.27-alpha.0",
"version": "0.1.0",
"bin": {
"rage-fw": "dist/index.js"
},
@@ -11,7 +11,8 @@
"start": "npx ./dist create"
},
"files": [
"dist/**/*"
"dist/**/*",
"readme.md"
],
"description": "CLI to scaffold a template project for RageFW",
"keywords": [],
+29
View File
@@ -0,0 +1,29 @@
# RageFW CLI
To make you life easier while using RageFW we created a basic CLI. At the moment automation we have only works via [pnpm](https://pnpm.io/)
``pnpm create rage-fw@latest``
## TL;DR
- ``Initialize new project`` - create new template project
- ``Install RAGE:MP updater`` - download and update RAGE:MP server files
## Options
For now, you will see a few available options. They are described in detail below
- ``Initialize new project``
- ``Install RAGE:MP updater``
### Initialize new project
Using this options will forward you to common project-creation menu
- ``Enter project name``
This option will specify a name for your project which is used as a folder name too. Defaults to **rage-fw**
- ``Select frontend``
Use this selector menu to choose which frontend framework you want to use. We will do our best to expand this menu after some time.
Defaults to **React + TypeScript (Vite)**
### Install Rage:MP updater
This option will simplify installation process of Rage:MP server files required to start your server
+6 -36
View File
@@ -1,31 +1,11 @@
import type { CommandModule, Argv, ArgumentsCamelCase } from 'yargs'
import c from 'chalk'
import { input, select } from '@inquirer/prompts'
import clone from 'git-clone'
import path from 'node:path'
import { checkForUpdate } from '../utils/update'
function builder(yargs: Argv) {
return yargs
.option('projectName', {
alias: 'p',
description: 'Name of the folder to scaffold a project to',
type: 'string',
demandOption: false,
})
.option('template', {
alias: 't',
description: 'Frontend framework to use for CEF',
type: 'string',
demandOption: false,
})
.middleware(async () => await checkForUpdate())
}
async function handler(args: ArgumentsCamelCase) {
let folder = (args.projectName as string) ?? args.p
let framework = (args.template as string) ?? args.t
export async function initProject() {
let folder
let framework
if (!folder) {
folder = await input({
@@ -68,7 +48,7 @@ async function handler(args: ArgumentsCamelCase) {
clone(
'https://git.entityseven.com/entityseven/rage-framework-example',
path.join(__dirname, folder),
path.join(process.cwd(), folder),
{},
err => {
if (err) {
@@ -77,20 +57,10 @@ async function handler(args: ArgumentsCamelCase) {
}
console.log(c.gray('Scaffolded project into'), folder)
console.log(
c.blueBright(
'Working on Rage Framework. RageFW © Powered by Entity Seven Group',
c.gray(
`Project was created ar dir: ${path.join(process.cwd(), folder)}`,
),
)
},
)
}
const init: CommandModule = {
command: 'create [folderName] [template]',
aliases: 'c',
describe: 'Scaffold a template project using RageFW',
builder,
handler,
}
export default init
+37
View File
@@ -0,0 +1,37 @@
import axios from 'axios'
import * as fs from 'node:fs'
const latestReleases =
'https://git.entityseven.com/api/v1/repos/entityseven/rage-server-downloader/releases?page=1&limit=1'
type Release = {
id: number
}
type Asset = {
browser_download_url: string
}
export async function downloadUpdater(): Promise<void> {
const id = await getLatestReleaseID()
const latestAssets = `https://git.entityseven.com/api/v1/repos/entityseven/rage-server-downloader/releases/${id}/assets?page=1&limit=1`
axios.get<Asset[]>(latestAssets).then(async ({ data }) => {
const downloadURL = data[0].browser_download_url
const file = await axios.get(data[0].browser_download_url, {
responseType: 'arraybuffer',
})
const fileData = Buffer.from(file.data, 'binary')
const fileSplit = downloadURL.split('/')
const fileName = fileSplit[fileSplit.length - 1]
fs.writeFileSync(`./${fileName}`, fileData)
})
}
async function getLatestReleaseID() {
return axios.get<Release[]>(latestReleases).then(({ data }) => data[0].id)
}
+38 -9
View File
@@ -1,11 +1,40 @@
import yargs from 'yargs'
import c from 'chalk'
import { select } from '@inquirer/prompts'
import create from './commands/create'
import { checkForUpdate } from './utils/update'
import { initProject } from './commands/create'
import { downloadUpdater } from './commands/download-updater'
yargs
.usage('<cmd> [args]')
// .scriptName('rage-fw')
// .usage('$0 <cmd> [args]')
// @ts-ignore
.command(create)
.help().argv
enum Actions {
INIT_PROJECT = 'INIT_PROJECT',
UPDATER = 'UPDATER',
}
;(async () => {
await checkForUpdate()
console.log(
c.blueBright('Rage FW CLI | Powered by Entity Seven Group ️ <3'),
)
const action = await select({
message: c.gray('Select action:'),
choices: [
{
name: 'Initialize new project',
value: Actions.INIT_PROJECT,
description: 'Initialize new project and start develop',
},
{
name: 'Install RAGE:MP updater',
value: Actions.UPDATER,
description:
'Use our custom updater to download and update RAGE:MP server files.',
},
],
loop: true,
})
if (action === Actions.INIT_PROJECT) await initProject()
if (action === Actions.UPDATER) await downloadUpdater()
})()
+2 -1
View File
@@ -18,8 +18,9 @@ export async function checkForUpdate(): Promise<void> {
.then(({ data }) => {
const latestVersion = data[0].name
if (!(latestVersion === version))
if (latestVersion !== `v${version}`)
notifyUserAboutUpdate(latestVersion)
else console.log(c.yellow(`Version: ${version}`))
})
.then(() => res()),
)
+3 -2
View File
@@ -1,10 +1,11 @@
{
"name": "rage-fw-client",
"version": "0.0.27-alpha.0",
"version": "0.1.0",
"main": "dist/index.js",
"types": "dist/src/index.d.ts",
"files": [
"dist/**/*"
"dist/**/*",
"readme.md"
],
"scripts": {
"build": "tsup"
+2
View File
@@ -0,0 +1,2 @@
# RageFW Client
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki/Docs)
+8
View File
@@ -0,0 +1,8 @@
import { Player } from './'
export class Browser extends Player {
public registerBrowser(browser: BrowserMp) {
this.browser = browser
return browser
}
}
+20
View File
@@ -0,0 +1,20 @@
import rpc from 'rage-rpc'
import { RageFW_ClientCallback, RageFW_ClientEvent } from '../types'
export class Client {
public register<EventName extends RageFW_ClientEvent>(
eventName: EventName,
callback: RageFW_ClientCallback<EventName>,
): void {
rpc.register(eventName, data => {
return callback(data)
})
}
public unregister<EventName extends RageFW_ClientEvent>(
eventName: EventName,
): void {
rpc.unregister(eventName)
}
}
+4
View File
@@ -0,0 +1,4 @@
export * from './client'
export * from './player'
export * from './browser'
export * from './logger'
@@ -1,4 +1,4 @@
export default class Logger {
export class Logger {
public error(message: unknown) {
mp.console.logError(
`[${new Date().toLocaleTimeString()}] [ERROR] ${message}`,
+49
View File
@@ -0,0 +1,49 @@
import rpc from 'rage-rpc'
import type { RageFW_ICustomClientEvent } from 'rage-fw-shared-types'
import {
_CefEventHasArgs,
_ClientEventHasArgs,
_ServerEventHasArgs,
RageFW_CefArgs,
RageFW_CefEvent,
RageFW_CefReturn,
RageFW_ClientArgs,
RageFW_ClientReturn,
RageFW_ClientServerEvent,
RageFW_ClientServerArgs,
RageFW_ClientServerReturn,
} from '../types'
export class Player {
public browser: BrowserMp | undefined
public trigger<EventName extends keyof RageFW_ICustomClientEvent>(
eventName: EventName,
...args: _ClientEventHasArgs<EventName> extends true
? [RageFW_ClientArgs<EventName>]
: []
): Promise<RageFW_ClientReturn<EventName>> {
return rpc.call<RageFW_ClientReturn<EventName>>(eventName, args)
}
public triggerServer<EventName extends RageFW_ClientServerEvent>(
eventName: EventName,
...args: _ServerEventHasArgs<EventName> extends true
? [RageFW_ClientServerArgs<EventName>]
: []
): Promise<RageFW_ClientServerReturn<EventName>> {
return rpc.callServer(eventName, args)
}
public triggerBrowser<EventName extends RageFW_CefEvent>(
eventName: EventName,
...args: _CefEventHasArgs<EventName> extends true
? [RageFW_CefArgs<EventName>]
: []
): Promise<RageFW_CefReturn<EventName>> {
if (!this.browser)
throw new Error('You need to initialize browser first!')
return rpc.callBrowser(this.browser, eventName, args)
}
}
+1 -78
View File
@@ -1,81 +1,4 @@
import rpc from 'rage-rpc'
import Logger from './logger'
import {
_CefEventHasArgs,
_ClientEventHasArgs,
_ServerEventHasArgs,
RageFW_CefArgs,
RageFW_CefEvent,
RageFW_CefReturn,
RageFW_ClientEvent,
RageFW_ClientEventArguments,
RageFW_ClientEventCallback,
RageFW_ClientEventReturn,
RageFW_ClientServerEvent,
RageFW_ClientServerEventArguments,
RageFW_ClientServerEventReturn,
} from './types'
import type { RageFW_ICustomClientEvent } from 'rage-fw-shared-types'
class Client {
public register<EventName extends RageFW_ClientEvent>(
eventName: EventName,
callback: RageFW_ClientEventCallback<EventName>,
): void {
rpc.register(eventName, data => {
return callback(data)
})
}
public unregister<EventName extends RageFW_ClientEvent>(
eventName: EventName,
): void {
rpc.unregister(eventName)
}
}
class Player {
public browser: BrowserMp | undefined
public trigger<EventName extends keyof RageFW_ICustomClientEvent>(
eventName: EventName,
...args: _ClientEventHasArgs<EventName> extends true
? [RageFW_ClientEventArguments<EventName>]
: []
): Promise<RageFW_ClientEventReturn<EventName>> {
return rpc.call<RageFW_ClientEventReturn<EventName>>(eventName, args)
}
public triggerServer<EventName extends RageFW_ClientServerEvent>(
eventName: EventName,
...args: _ServerEventHasArgs<EventName> extends true
? [RageFW_ClientServerEventArguments<EventName>]
: []
): Promise<RageFW_ClientServerEventReturn<EventName>> {
return rpc.callServer(eventName, args)
}
public triggerBrowser<EventName extends RageFW_CefEvent>(
eventName: EventName,
...args: _CefEventHasArgs<EventName> extends true
? [RageFW_CefArgs<EventName>]
: []
): Promise<RageFW_CefReturn<EventName>> {
if (!this.browser)
throw new Error('You need to initialize browser first!')
return rpc.callBrowser(this.browser, eventName, args)
}
}
class Browser extends Player {
public registerBrowser(browser: BrowserMp) {
this.browser = browser
return browser
}
}
import { Browser, Client, Logger, Player } from './core'
export const fw = {
event: new Client(),
+5 -5
View File
@@ -14,7 +14,7 @@ export type RageFW_ClientEvent =
* Array of arguments for an event, name of which you pass as a generic
* These include custom and system events
*/
export type RageFW_ClientEventArguments<K extends RageFW_ClientEvent> =
export type RageFW_ClientArgs<K extends RageFW_ClientEvent> =
K extends keyof RageFW_ICustomClientEvent
? Parameters<RageFW_ICustomClientEvent[K]>
: K extends keyof IClientEvents
@@ -25,15 +25,15 @@ export type RageFW_ClientEventArguments<K extends RageFW_ClientEvent> =
* Callback (function) for an event, name of which you pass as a generic
* These only include custom events
*/
export type RageFW_ClientEventCallback<K extends RageFW_ClientEvent> = (
args: RageFW_ClientEventArguments<K>,
) => RageFW_ClientEventReturn<K>
export type RageFW_ClientCallback<K extends RageFW_ClientEvent> = (
args: RageFW_ClientArgs<K>,
) => RageFW_ClientReturn<K>
/**
* Return type for an event, name of which you pass as a generic
* These only include custom events
*/
export type RageFW_ClientEventReturn<K extends RageFW_ClientEvent> =
export type RageFW_ClientReturn<K extends RageFW_ClientEvent> =
K extends keyof RageFW_ICustomClientEvent
? ReturnType<RageFW_ICustomClientEvent[K]>
: never
+3 -4
View File
@@ -15,9 +15,8 @@ export type RageFW_ClientServerEvent = keyof RageFW_ICustomServerEvent
* Array of arguments for an event, name of which you pass as a generic
* These only include custom events
*/
export type RageFW_ClientServerEventArguments<
K extends RageFW_ClientServerEvent,
> = K extends keyof RageFW_ICustomServerEvent
export type RageFW_ClientServerArgs<K extends RageFW_ClientServerEvent> =
K extends keyof RageFW_ICustomServerEvent
? Parameters<RageFW_ICustomServerEvent[K]>
: never
@@ -25,7 +24,7 @@ export type RageFW_ClientServerEventArguments<
* Return type for an event, name of which you pass as a generic
* These only include custom events
*/
export type RageFW_ClientServerEventReturn<K extends RageFW_ClientServerEvent> =
export type RageFW_ClientServerReturn<K extends RageFW_ClientServerEvent> =
K extends keyof RageFW_ICustomServerEvent
? ReturnType<RageFW_ICustomServerEvent[K]>
: never
+1 -1
View File
@@ -1,5 +1,5 @@
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"version": "0.0.27-alpha.0",
"version": "0.1.0",
"npmClient": "pnpm"
}
+13
View File
@@ -0,0 +1,13 @@
# Custom Attribution-NoDerivs Software License
This license allows you to use, copy, and distribute the RageFW (the "Software"), including for commercial purposes, provided that the following conditions are met:
1. **Attribution:** You must give appropriate credit to the original author of the Software, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
2. **No Derivative Works:** You may not modify, transform, or build upon the Software.
3. **Usage and Commercial Use:** You are allowed to use, sell, and gain income from projects that utilize the Software, as long as you comply with the terms of this license.
4. **No Additional Restrictions:** You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+13 -1
View File
@@ -9,7 +9,16 @@ RageFW is a type-safe framework for developing Rage:MP servers. Designed with de
- **Logging System:** Keep track of server activities and debug like a pro with our built-in, feature-rich logging system. After all, even virtual cops need evidence
## Getting Started
*soon*
You can find out more about our CLI [here](https://git.entityseven.com/entityseven/rage-framework/wiki/CLI)
At the moment automation we have only works via [pnpm](https://pnpm.io/). To scaffold a basic project with minor settings you can use our CLI:
``pnpm create rage-fw``
This will give you a few options, among them, you can find ``Initialize new project``. Use that option to scaffold a new project for yourself using the preferred frontend framework
## Documentation
[Available here](https://git.entityseven.com/entityseven/rage-framework/wiki/Docs+%40+0.0.30-alpha.0.-)
## Contributing
Join our community of developers and contribute to the ongoing development of RageFW. At the moment the only way to contribute is opening issues
@@ -17,4 +26,7 @@ Join our community of developers and contribute to the ongoing development of Ra
## Support
Need help? Reach out via our community forums or contact us directly through our support channels. We're committed to help you as we can
## License
Licensed under **Custom Attribution-NoDerivs Software License**
> *RageFW - because in the world of GTA:RP, nobody has time for type errors*
+3 -2
View File
@@ -1,10 +1,11 @@
{
"name": "rage-fw-server",
"version": "0.0.27-alpha.0",
"version": "0.1.0",
"main": "dist/index.js",
"types": "dist/src/index.d.ts",
"files": [
"dist/**/*"
"dist/**/*",
"readme.md"
],
"scripts": {
"build": "tsup"
+2
View File
@@ -0,0 +1,2 @@
# RageFW Server
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki/Docs)
+3
View File
@@ -0,0 +1,3 @@
export * from './player'
export * from './server'
export * from './logger'
@@ -1,7 +1,8 @@
import winston, { format } from 'winston'
const { timestamp, printf, colorize } = format
export default class Logger {
export class Logger {
private format = printf(({ message, level, timestamp }) => {
return `[${new Date(timestamp).toLocaleTimeString()}] [${level}]: ${message}`
})
+34
View File
@@ -0,0 +1,34 @@
import rpc from 'rage-rpc'
import {
_CefEventHasArgs,
_ClientEventHasArgs,
RageFW_CefArgs,
RageFW_CefEvent,
RageFW_CefReturn,
RageFW_ClientEvent,
RageFW_ServerClientArgs,
RageFW_ServerClientReturn,
} from '../types'
export class Player {
public triggerClient<EventName extends RageFW_ClientEvent>(
player: PlayerMp,
eventName: EventName,
...args: _ClientEventHasArgs<EventName> extends true
? [RageFW_ServerClientArgs<EventName>]
: []
): Promise<RageFW_ServerClientReturn<EventName>> {
return rpc.callClient(player, eventName, args)
}
public triggerBrowser<EventName extends RageFW_CefEvent>(
player: PlayerMp,
eventName: EventName,
...args: _CefEventHasArgs<EventName> extends true
? [RageFW_CefArgs<EventName>]
: []
): Promise<RageFW_CefReturn<EventName>> {
return rpc.callBrowsers(player, eventName, args)
}
}
+110
View File
@@ -0,0 +1,110 @@
import rpc from 'rage-rpc'
import { RageFW_ICustomServerEvent } from 'rage-fw-shared-types'
import { nativeEvents } from '../native.events'
import {
_ServerEventHasArgs,
RageFW_ServerArgs,
RageFW_ServerCallback,
RageFW_ServerCallbackCustom,
RageFW_ServerCallbackNative,
RageFW_ServerEvent,
RageFW_ServerReturn,
} from '../types'
export class Server {
private isNativeEvent(eventName: string): eventName is keyof IServerEvents {
return nativeEvents.includes(eventName)
}
private registerCustom<EventName extends keyof RageFW_ICustomServerEvent>(
eventName: EventName,
callback: RageFW_ServerCallbackCustom<EventName>,
): void {
rpc.register(
eventName,
async (args: RageFW_ServerArgs<EventName>, info) => {
callback([info.player as PlayerMp, ...args])
},
)
}
private registerNative<EventName extends keyof IServerEvents>(
eventName: EventName,
callback: RageFW_ServerCallbackNative<EventName>,
): void {
mp.events.add(
eventName,
(...args: Parameters<IServerEvents[EventName]>) =>
callback([...args]),
)
}
public register<EventName extends RageFW_ServerEvent>(
eventName: EventName,
callback: RageFW_ServerCallback<EventName>,
): void {
if (this.isNativeEvent(eventName)) {
this.registerNative(
eventName,
callback as RageFW_ServerCallbackNative,
)
} else {
this.registerCustom(
eventName,
callback as unknown as RageFW_ServerCallbackCustom,
)
}
}
public registerMany<EventName extends RageFW_ServerEvent>(events: {
[event in EventName]: RageFW_ServerCallback<event>
}): void {
Object.entries<RageFW_ServerCallback<EventName>>(events).map(
([eventName, callback]) => {
if (this.isNativeEvent(eventName)) {
this.registerNative(
eventName,
callback as RageFW_ServerCallbackNative,
)
} else {
this.registerCustom(
eventName as keyof RageFW_ICustomServerEvent,
callback as unknown as RageFW_ServerCallbackCustom,
)
}
},
)
}
private unregisterCustom<EventName extends keyof RageFW_ICustomServerEvent>(
eventName: EventName,
): void {
rpc.unregister(eventName)
}
private unregisterNative<EventName extends keyof IServerEvents>(
eventName: EventName,
): void {
mp.events.remove(eventName)
}
public unregister<EventName extends RageFW_ServerEvent>(
eventName: EventName,
): void {
if (this.isNativeEvent(eventName)) {
this.unregisterNative(eventName)
} else {
this.unregisterCustom(eventName)
}
}
public trigger<EventName extends keyof RageFW_ICustomServerEvent>(
eventName: EventName,
...args: _ServerEventHasArgs<EventName> extends true
? [RageFW_ServerArgs<EventName>]
: []
): Promise<RageFW_ServerReturn<EventName>> {
return rpc.call<RageFW_ServerReturn<EventName>>(eventName, args)
}
}
+1 -142
View File
@@ -1,145 +1,4 @@
import rpc from 'rage-rpc'
import Logger from './logger'
import {
_CefEventHasArgs,
_ClientEventHasArgs,
_ServerEventHasArgs,
RageFW_CefArgs,
RageFW_CefEvent,
RageFW_CefReturn,
RageFW_ClientEvent,
RageFW_ICustomServerEvent,
RageFW_ServerClientEventArguments,
RageFW_ServerClientEventReturn,
RageFW_ServerEvent,
RageFW_ServerEventArguments,
RageFW_ServerEventCallback,
RageFW_ServerEventCallbackCustom,
RageFW_ServerEventCallbackNative,
RageFW_ServerEventReturn,
} from './types'
import { nativeEvents } from './native.events'
class Server {
private isNativeEvent(eventName: string): eventName is keyof IServerEvents {
return nativeEvents.includes(eventName)
}
private registerCustom<EventName extends keyof RageFW_ICustomServerEvent>(
eventName: EventName,
callback: RageFW_ServerEventCallbackCustom<EventName>,
): void {
rpc.register(
eventName,
async (args: RageFW_ServerEventArguments<EventName>, info) => {
callback([info.player as PlayerMp, ...args])
},
)
}
private registerNative<EventName extends keyof IServerEvents>(
eventName: EventName,
callback: RageFW_ServerEventCallbackNative<EventName>,
): void {
mp.events.add(
eventName,
(...args: Parameters<IServerEvents[EventName]>) =>
callback([...args]),
)
}
public register<EventName extends RageFW_ServerEvent>(
eventName: EventName,
callback: RageFW_ServerEventCallback<EventName>,
): void {
if (this.isNativeEvent(eventName)) {
this.registerNative(
eventName,
callback as RageFW_ServerEventCallbackNative,
)
} else {
this.registerCustom(
eventName,
callback as unknown as RageFW_ServerEventCallbackCustom,
)
}
}
public registerMany<EventName extends RageFW_ServerEvent>(events: {
[event in EventName]: RageFW_ServerEventCallback<event>
}): void {
Object.entries<RageFW_ServerEventCallback<EventName>>(events).map(
([eventName, callback]) => {
if (this.isNativeEvent(eventName)) {
this.registerNative(
eventName,
callback as RageFW_ServerEventCallbackNative,
)
} else {
this.registerCustom(
eventName as keyof RageFW_ICustomServerEvent,
callback as unknown as RageFW_ServerEventCallbackCustom,
)
}
},
)
}
private unregisterCustom<EventName extends keyof RageFW_ICustomServerEvent>(
eventName: EventName,
): void {
rpc.unregister(eventName)
}
private unregisterNative<EventName extends keyof IServerEvents>(
eventName: EventName,
): void {
mp.events.remove(eventName)
}
public unregister<EventName extends RageFW_ServerEvent>(
eventName: EventName,
): void {
if (this.isNativeEvent(eventName)) {
this.unregisterNative(eventName)
} else {
this.unregisterCustom(eventName)
}
}
public trigger<EventName extends keyof RageFW_ICustomServerEvent>(
eventName: EventName,
...args: _ServerEventHasArgs<EventName> extends true
? [RageFW_ServerEventArguments<EventName>]
: []
): Promise<RageFW_ServerEventReturn<EventName>> {
return rpc.call<RageFW_ServerEventReturn<EventName>>(eventName, args)
}
}
class Player {
public triggerClient<EventName extends RageFW_ClientEvent>(
player: PlayerMp,
eventName: EventName,
...args: _ClientEventHasArgs<EventName> extends true
? [RageFW_ServerClientEventArguments<EventName>]
: []
): Promise<RageFW_ServerClientEventReturn<EventName>> {
return rpc.callClient(player, eventName, args)
}
public triggerBrowser<EventName extends RageFW_CefEvent>(
player: PlayerMp,
eventName: EventName,
...args: _CefEventHasArgs<EventName> extends true
? [RageFW_CefArgs<EventName>]
: []
): Promise<RageFW_CefReturn<EventName>> {
return rpc.callBrowsers(player, eventName, args)
}
}
import { Logger, Player, Server } from './core'
export const fw = {
event: new Server(),
+2 -2
View File
@@ -12,7 +12,7 @@ export type RageFW_ClientEvent = keyof RageFW_ICustomClientEvent
* Array of arguments of an event you pass as a generic
* These only include custom events
*/
export type RageFW_ServerClientEventArguments<K extends RageFW_ClientEvent> =
export type RageFW_ServerClientArgs<K extends RageFW_ClientEvent> =
K extends RageFW_ClientEvent
? Parameters<RageFW_ICustomClientEvent[K]>
: never
@@ -21,7 +21,7 @@ export type RageFW_ServerClientEventArguments<K extends RageFW_ClientEvent> =
* Return type of event you pass as a generic
* These only include custom events
*/
export type RageFW_ServerClientEventReturn<K extends RageFW_ClientEvent> =
export type RageFW_ServerClientReturn<K extends RageFW_ClientEvent> =
K extends RageFW_ClientEvent
? ReturnType<RageFW_ICustomClientEvent[K]>
: never
+22 -13
View File
@@ -18,7 +18,7 @@ export type RageFW_ServerEvent =
* Array of arguments for an event, name of which you pass as a generic
* These also include system events
*/
export type RageFW_ServerEventArguments<K extends RageFW_ServerEvent> =
export type RageFW_ServerArgs<K extends RageFW_ServerEvent> =
K extends keyof RageFW_ICustomServerEvent
? Parameters<RageFW_ICustomServerEvent[K]>
: K extends keyof IServerEvents
@@ -29,18 +29,18 @@ export type RageFW_ServerEventArguments<K extends RageFW_ServerEvent> =
* Callback (function) for an event, name of which you pass as a generic
* These include system and custom events
*/
export type RageFW_ServerEventCallback<K extends RageFW_ServerEvent> =
export type RageFW_ServerCallback<K extends RageFW_ServerEvent> =
K extends keyof RageFW_ICustomServerEvent
? RageFW_ServerEventCallbackCustom<K>
? RageFW_ServerCallbackCustom<K>
: K extends keyof IServerEvents
? RageFW_ServerEventCallbackNative<K>
? RageFW_ServerCallbackNative<K>
: never
/**
* Return type for an event, name of which you pass as a generic
* These include system and custom events
*/
export type RageFW_ServerEventReturn<K extends RageFW_ServerEvent> =
export type RageFW_ServerReturn<K extends RageFW_ServerEvent> =
K extends keyof RageFW_ICustomServerEvent
? ReturnType<RageFW_ICustomServerEvent[K]>
: K extends keyof IServerEvents
@@ -51,24 +51,33 @@ export type RageFW_ServerEventReturn<K extends RageFW_ServerEvent> =
* Array of arguments for an event, name of which you pass as a generic
* These only include custom events
*/
export type RageFW_ServerEventCallbackCustom<
export type RageFW_ServerCallbackCustom<
K extends keyof RageFW_ICustomServerEvent = keyof RageFW_ICustomServerEvent,
> = (
payload: [player: PlayerMp, ...args: RageFW_ServerEventArguments<K>],
) => RageFW_ServerEventReturn<K>
payload: [player: PlayerMp, ...args: RageFW_ServerArgs<K>],
) => RageFW_ServerReturn<K>
/**
* Array of arguments for an event, name of which you pass as a generic
* These only include system events
*/
export type RageFW_ServerEventCallbackNative<
export type RageFW_ServerCallbackNative<
K extends keyof IServerEvents = keyof IServerEvents,
> = (payload: Parameters<IServerEvents[K]>) => ReturnType<IServerEvents[K]>
export type _ServerEventHasArgs<
EventName extends keyof RageFW_ICustomServerEvent,
> = keyof RageFW_ICustomClientEvent extends never
export type _ServerEventHasArgs<EventName extends RageFW_ServerEvent> =
EventName extends keyof RageFW_ICustomServerEvent
? keyof RageFW_ICustomClientEvent extends never
? false
: Parameters<RageFW_ICustomServerEvent[EventName]>[0] extends undefined
: Parameters<
RageFW_ICustomServerEvent[EventName]
>[0] extends undefined
? false
: true
: EventName extends keyof IServerEvents
? keyof IServerEvents extends never
? false
: Parameters<IServerEvents[EventName]>[0] extends undefined
? false
: true
: false
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "rage-fw-shared-types",
"version": "0.0.27-alpha.0",
"version": "0.1.0",
"types": "types/types/index.d.ts",
"files": [
"types/**/*"
+2
View File
@@ -0,0 +1,2 @@
# RageFW Shared types
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki/Docs)