Compare commits
35
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12d2197e18 | ||
|
|
897fd5a9f5 | ||
|
|
d5dc6924aa | ||
|
|
78d1831bbc | ||
|
|
a820e9896b | ||
|
|
edafb5289e | ||
|
|
7a37aa390e | ||
|
|
e29dc20398 | ||
|
|
82050004f6 | ||
|
|
179d7b8b93 | ||
|
|
978d15bd25 | ||
|
|
4e48772950 | ||
|
|
84994ef121 | ||
|
|
166b933b71 | ||
|
|
e3d7a66646 | ||
|
|
f977e6191f | ||
|
|
593f4650a3 | ||
|
|
d56c52abf5 | ||
|
|
f5648abb00 | ||
|
|
47375c0a15 | ||
|
|
b55204ee61 | ||
|
|
51f50141ab | ||
|
|
495217ecd5 | ||
|
|
7e43e0d106 | ||
|
|
2f1d1d9f0d | ||
|
|
cc40d90070 | ||
|
|
469d970654 | ||
|
|
217e0ddf01 | ||
|
|
ea572070ef | ||
|
|
7308fc26e0 | ||
|
|
d56475d08a | ||
|
|
c2684a48fc | ||
|
|
0059a41d0d | ||
|
|
cc1ebbd66b | ||
|
|
301a65e77f |
@@ -0,0 +1,8 @@
|
||||
# Changesets
|
||||
|
||||
Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
|
||||
with multi-package repos, or single-package repos to help you version and publish your code. You can
|
||||
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
|
||||
|
||||
We have a quick list of common questions to get you started engaging with this project in
|
||||
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"$schema": "https://unpkg.com/@changesets/[email protected]/schema.json",
|
||||
"changelog": "@changesets/cli/changelog",
|
||||
"commit": false,
|
||||
"fixed": [
|
||||
["@entityseven/rage-fw-browser","@entityseven/rage-fw-client","@entityseven/rage-fw-server"]
|
||||
],
|
||||
"linked": [],
|
||||
"access": "public",
|
||||
"baseBranch": "master",
|
||||
"updateInternalDependencies": "patch",
|
||||
"ignore": []
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
env:
|
||||
node: true
|
||||
es6: true
|
||||
es2019: true
|
||||
extends:
|
||||
- 'eslint:recommended'
|
||||
- 'plugin:@typescript-eslint/recommended'
|
||||
# - 'prettier'
|
||||
parser: '@typescript-eslint/parser'
|
||||
parserOptions:
|
||||
ecmaVersion: '2019'
|
||||
sourceType: 'script'
|
||||
plugins:
|
||||
- '@typescript-eslint'
|
||||
ignorePatterns:
|
||||
- 'node_modules'
|
||||
rules: {
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-unused-vars': [
|
||||
'warn',
|
||||
{
|
||||
"argsIgnorePattern": '^_',
|
||||
"varsIgnorePattern": '^_',
|
||||
"caughtErrorsIgnorePattern": '^_'
|
||||
}
|
||||
],
|
||||
'@typescript-eslint/ban-ts-comment': 'off',
|
||||
'@typescript-eslint/ban-types': 'off',
|
||||
'consistent-return': 'warn',
|
||||
'no-empty': 'off',
|
||||
}
|
||||
@@ -28,7 +28,7 @@ body:
|
||||
- type: textarea
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: Reproduction (Optional)
|
||||
label: Reproduction
|
||||
description: Steps to reproduce the bug, if applicable
|
||||
validations:
|
||||
required: true
|
||||
@@ -57,7 +57,7 @@ body:
|
||||
- type: textarea
|
||||
id: additional_information
|
||||
attributes:
|
||||
label: Additional Information
|
||||
label: Additional Information (Optional)
|
||||
description: Add any other information that might be useful in diagnosing the issue
|
||||
validations:
|
||||
required: false
|
||||
|
||||
@@ -2,3 +2,4 @@
|
||||
node_modules
|
||||
|
||||
dist
|
||||
.nx/cache
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"dependencyTypes": ["prod", "peer", "dev"],
|
||||
"versionGroups": [
|
||||
{
|
||||
"label": "Ensure @ragempcommunity/types-* always match",
|
||||
"packages": ["**"],
|
||||
"dependencies": ["@ragempcommunity/types-cef","@ragempcommunity/types-client", "@ragempcommunity/types-server"],
|
||||
"pinVersion": "sameRange",
|
||||
"range": "^"
|
||||
},
|
||||
{
|
||||
"label": "Use workspace protocol when developing local packages",
|
||||
"packages": ["**"],
|
||||
"dependencies": ["@entityseven/rage-fw-shared-types", "@entityseven/rage-fw-rpc"]
|
||||
"pinVersion": "workspace:*",
|
||||
"range": ""
|
||||
},
|
||||
{
|
||||
"label": "Ensure @types/node match same version (for tsup)",
|
||||
"packages": ["**"],
|
||||
"dependencies": ["@types/node"],
|
||||
"pinVersion": "sameRange",
|
||||
"range": ""
|
||||
},
|
||||
{
|
||||
"label": "Ensure newest breaking Typescript version",
|
||||
"packages": ["**"],
|
||||
"dependencies": ["typescript"],
|
||||
"pinVersion": "sameRange",
|
||||
"range": "^"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
# Custom Attribution-NoDerivs Software License
|
||||
# Custom Attribution-NoDerives 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:
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
Custom Attribution-NoDerives Software License
|
||||
|
||||
Copyright (c) 2024 Entity Seven Group
|
||||
|
||||
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.
|
||||
+57
-27
@@ -1,31 +1,61 @@
|
||||
{
|
||||
"name": "@entityseven/rage-fw-browser",
|
||||
"version": "0.2.1-0.2.0-alpha.1.0",
|
||||
"private": false,
|
||||
"name": "@entityseven/rage-fw-browser",
|
||||
"version": "0.2.0",
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"readme.md",
|
||||
"LICENSE",
|
||||
"package.json"
|
||||
],
|
||||
"main": "src/index.ts",
|
||||
"exports": {
|
||||
".": "./src/index.ts"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/src/index.d.ts",
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"readme.md"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsup"
|
||||
"types": "dist/index.d.ts",
|
||||
"exports": {
|
||||
".": "./dist/index.js"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsup"
|
||||
},
|
||||
"dependencies": {
|
||||
"@entityseven/rage-fw-rpc": "workspace:*"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "22.12.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@entityseven/rage-fw-shared-types": "workspace:*",
|
||||
"@ragempcommunity/types-cef": "^2.1.8",
|
||||
"typescript": "^5.7.3"
|
||||
},
|
||||
"description": "Package used on a browser-side of your Rage:MP Server",
|
||||
"keywords": [
|
||||
"ragefw",
|
||||
"rage-fw",
|
||||
"ragemp",
|
||||
"rage:mp",
|
||||
"rage",
|
||||
"gta5"
|
||||
],
|
||||
"author": "Entity Seven Group",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Danya H",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik/"
|
||||
},
|
||||
"dependencies": {
|
||||
"@entityseven/rage-fw-rpc": "latest"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@entityseven/rage-fw-shared-types": "workspace:^",
|
||||
"@ragempcommunity/types-cef": "^2.1.8"
|
||||
},
|
||||
"description": "RageFW CEF side",
|
||||
"keywords": [],
|
||||
"author": "SashaGoncharov19",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "rilaxik",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik"
|
||||
}
|
||||
],
|
||||
"license": "MIT"
|
||||
{
|
||||
"name": "Oleksandr Honcharov",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/SashaGoncharov19/"
|
||||
}
|
||||
],
|
||||
"license": "Custom-Attribution-NoDerivs",
|
||||
"gitHead": "ffd542c1deddb3033e16e0dae7557313ae09b05f"
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,2 +1,2 @@
|
||||
# RageFW CEF
|
||||
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki/Docs)
|
||||
# RageFW Browser
|
||||
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki)
|
||||
+117
-36
@@ -1,14 +1,9 @@
|
||||
import { Helper } from './helper'
|
||||
import { FW_Helper } from './helper'
|
||||
import { rpc } from './rpc'
|
||||
import type * as T from '../types'
|
||||
import {
|
||||
RageFW_BrowserEvent,
|
||||
RageFW_ClientEvent,
|
||||
RageFW_ServerEvent,
|
||||
} from '../types'
|
||||
|
||||
/** Browser-side interactions */
|
||||
export class Browser extends Helper {
|
||||
export class FW_Browser extends FW_Helper {
|
||||
constructor() {
|
||||
super()
|
||||
}
|
||||
@@ -34,7 +29,7 @@ export class Browser extends Helper {
|
||||
*
|
||||
* @param eventName - The name of the event to register
|
||||
* @param callback - The callback function to be executed when the event is triggered
|
||||
* @returns {Browser} The current browser instance, enabling method chaining
|
||||
* @returns {FW_Browser} The current browser instance, enabling method chaining
|
||||
*
|
||||
* @example
|
||||
* // Registering an event
|
||||
@@ -44,10 +39,10 @@ export class Browser extends Helper {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public register<EventName extends T.RageFW_BrowserEvent>(
|
||||
public register<EventName extends T.FW_BrowserEvent>(
|
||||
eventName: EventName,
|
||||
callback: T.RageFW_BrowserCallback<EventName>,
|
||||
): Browser {
|
||||
callback: T.FW_BrowserCallback<EventName>,
|
||||
): FW_Browser {
|
||||
this.log_('register', eventName, callback)
|
||||
|
||||
rpc.register<
|
||||
@@ -63,7 +58,7 @@ export class Browser extends Helper {
|
||||
* Unregisters a browser event, removing the associated callback
|
||||
*
|
||||
* @param eventName - The name of the event to unregister
|
||||
* @returns {Browser} The current browser instance, enabling method chaining
|
||||
* @returns {FW_Browser} The current browser instance, enabling method chaining
|
||||
*
|
||||
* @example
|
||||
* // Unregistering an event
|
||||
@@ -71,21 +66,51 @@ export class Browser extends Helper {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public unregister<EventName extends T.RageFW_BrowserEvent>(
|
||||
public unregister<EventName extends T.FW_BrowserEvent>(
|
||||
eventName: EventName,
|
||||
): Browser {
|
||||
): FW_Browser {
|
||||
rpc.unregister<EventName>(eventName)
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers a browser event from the browser with arguments from shared types
|
||||
* Triggers a browser event from the browser with arguments from 'rage-fw-shared-types'
|
||||
*
|
||||
* Formerly known as ``call`` or ``emit``
|
||||
*
|
||||
* @param eventName - The name of the browser event to trigger
|
||||
* @param [args] - Arguments for the browser event, if present
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Triggering a browser event without arguments
|
||||
* fw.event.trigger("browserEventName")
|
||||
*
|
||||
* @example
|
||||
* // Triggering a browser event with arguments
|
||||
* fw.event.trigger("browserEventName", ["message to me"])
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public trigger<EventName extends T.FW_BrowserEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._BrowserEventHasArgs<EventName> extends true
|
||||
? [T.FW_BrowserArgs<EventName>]
|
||||
: []
|
||||
): void {
|
||||
this.log_('[RPC](trigger):', eventName, ...args)
|
||||
|
||||
rpc.call<typeof args, EventName>(eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers an asynchronous browser event from the browser with arguments from 'rage-fw-shared-types', and expects to receive a response from an event
|
||||
*
|
||||
* Formerly known as ``callAsync`` or ``emitAsync``
|
||||
*
|
||||
* @param eventName - The name of the browser event to trigger
|
||||
* @param [args] - Arguments for the browser event, if present
|
||||
* @returns {Promise} resolving to the browser's response for the event
|
||||
*
|
||||
* @example
|
||||
@@ -98,28 +123,58 @@ export class Browser extends Helper {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public async trigger<EventName extends T.RageFW_BrowserEvent>(
|
||||
public async triggerAsync<EventName extends T.FW_BrowserEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._BrowserEventHasArgs<EventName> extends true
|
||||
? [T.RageFW_BrowserArgs<EventName>]
|
||||
? [T.FW_BrowserArgs<EventName>]
|
||||
: []
|
||||
): Promise<T.RageFW_BrowserReturn<EventName>> {
|
||||
): Promise<T.FW_BrowserReturn<EventName>> {
|
||||
this.log_('[RPC](trigger):', eventName, ...args)
|
||||
|
||||
return await rpc.call<
|
||||
return await rpc.callAsync<
|
||||
typeof args,
|
||||
EventName,
|
||||
T.RageFW_BrowserReturn<EventName>
|
||||
T.FW_BrowserReturn<EventName>
|
||||
>(eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers a server event from the browser with arguments from shared types
|
||||
* Triggers a server event from the browser with arguments from 'rage-fw-shared-types'
|
||||
*
|
||||
* Formerly known as ``callServer`` or ``emitServer``
|
||||
*
|
||||
* @param eventName - The name of the server event to trigger
|
||||
* @param [args] - Arguments for the server event, if present
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Triggering a server event without arguments
|
||||
* fw.event.triggerServer("serverEventName")
|
||||
*
|
||||
* @example
|
||||
* // Triggering a server event with arguments
|
||||
* fw.event.triggerServer("serverEventName", ["message to server"])
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public triggerServer<EventName extends T.FW_ServerEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._ServerEventHasArgs<EventName> extends true
|
||||
? [T.FW_ServerArgs<EventName>]
|
||||
: []
|
||||
): void {
|
||||
this.log_('[RPC](triggerServer):', eventName, ...args)
|
||||
|
||||
rpc.callServer<typeof args, EventName>(eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers an asynchronous server event from the browser with arguments from 'rage-fw-shared-types', and expects to receive a response from an event
|
||||
*
|
||||
* Formerly known as ``callServerAsync`` or ``emitServerAsync``
|
||||
*
|
||||
* @param eventName - The name of the server event to trigger
|
||||
* @param [args] - Arguments for the server event, if present
|
||||
* @returns {Promise} resolving to the server's response for the event
|
||||
*
|
||||
* @example
|
||||
@@ -132,28 +187,58 @@ export class Browser extends Helper {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public async triggerServer<EventName extends T.RageFW_ServerEvent>(
|
||||
public async triggerServerAsync<EventName extends T.FW_ServerEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._ServerEventHasArgs<EventName> extends true
|
||||
? [T.RageFW_ServerArgs<EventName>]
|
||||
? [T.FW_ServerArgs<EventName>]
|
||||
: []
|
||||
): Promise<T.RageFW_ServerReturn<EventName>> {
|
||||
): Promise<T.FW_ServerReturn<EventName>> {
|
||||
this.log_('[RPC](triggerServer):', eventName, ...args)
|
||||
|
||||
return await rpc.callServer<
|
||||
return await rpc.callServerAsync<
|
||||
typeof args,
|
||||
EventName,
|
||||
T.RageFW_ServerReturn<EventName>
|
||||
T.FW_ServerReturn<EventName>
|
||||
>(eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers a client event from the browser with arguments from shared types
|
||||
* Triggers a browser event from the browser with arguments from 'rage-fw-shared-types'
|
||||
*
|
||||
* Formerly known as ``callClient`` or ``emitClient``
|
||||
*
|
||||
* @param eventName - The name of the client event to trigger
|
||||
* @param [args] - Arguments for the client event, if present
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Triggering a client event without arguments
|
||||
* fw.event.triggerClient("clientEventName")
|
||||
*
|
||||
* @example
|
||||
* // Triggering a client event with arguments
|
||||
* fw.event.triggerClient("clientEventName", ["message to client"])
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public triggerClient<EventName extends T.FW_ClientEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._ClientEventHasArgs<EventName> extends true
|
||||
? [T.FW_ClientArgs<EventName>]
|
||||
: []
|
||||
): void {
|
||||
this.log_('[RPC](triggerClient):', eventName, ...args)
|
||||
|
||||
rpc.callClient<typeof args, EventName>(eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers an asynchronous client event from the browser with arguments from 'rage-fw-shared-types', and expects to receive a response from an event
|
||||
*
|
||||
* Formerly known as ``callClientAsync`` or ``emitClientAsync``
|
||||
*
|
||||
* @param eventName - The name of the client event to trigger
|
||||
* @param [args] - Arguments for the client event, if present
|
||||
* @returns {Promise} resolving to the client's response for the event
|
||||
*
|
||||
* @example
|
||||
@@ -166,22 +251,18 @@ export class Browser extends Helper {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public async triggerClient<EventName extends T.RageFW_ClientEvent>(
|
||||
public async triggerClientAsync<EventName extends T.FW_ClientEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._ClientEventHasArgs<EventName> extends true
|
||||
? [T.RageFW_ClientArgs<EventName>]
|
||||
? [T.FW_ClientArgs<EventName>]
|
||||
: []
|
||||
): Promise<T.RageFW_ClientReturn<EventName>> {
|
||||
): Promise<T.FW_ClientReturn<EventName>> {
|
||||
this.log_('[RPC](triggerClient):', eventName, ...args)
|
||||
|
||||
return await rpc.callClient<
|
||||
return await rpc.callClientAsync<
|
||||
typeof args,
|
||||
EventName,
|
||||
T.RageFW_ClientReturn<EventName>
|
||||
T.FW_ClientReturn<EventName>
|
||||
>(eventName, args)
|
||||
}
|
||||
}
|
||||
|
||||
// new Browser()
|
||||
// .register('customCefEvent', async (a, b) => true)
|
||||
// .triggerServer('customServerEvent', ['', 1])
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export class Helper {
|
||||
export class FW_Helper {
|
||||
protected debugLogs_: boolean = false
|
||||
protected customLogger_:
|
||||
| undefined
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Browser, rpc } from './core'
|
||||
import { FW_Browser, rpc } from './core'
|
||||
|
||||
/**
|
||||
* Package used on a browser-side of your Rage:MP Server
|
||||
@@ -7,10 +7,7 @@ import { Browser, rpc } from './core'
|
||||
*/
|
||||
export const fw = {
|
||||
/** Browser-side interactions */
|
||||
event: new Browser(),
|
||||
event: new FW_Browser(),
|
||||
/** ``rage-fw-rpc`` instance used under the hood. It is highly recommended to use this one if you need it instead of creating a new instance */
|
||||
rpc,
|
||||
}
|
||||
;(async () => {
|
||||
await fw.event.triggerClient('cefReady')
|
||||
})()
|
||||
|
||||
@@ -1,40 +1,41 @@
|
||||
import type { RageFW_ICustomBrowserEvent } from '@entityseven/rage-fw-shared-types'
|
||||
import type { FW_ICustomBrowserEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
export type { RageFW_ICustomBrowserEvent } from '@entityseven/rage-fw-shared-types'
|
||||
export type { FW_ICustomBrowserEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
/**
|
||||
* Union of all available browser event names
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_BrowserEvent = keyof RageFW_ICustomBrowserEvent
|
||||
export type FW_BrowserEvent = keyof FW_ICustomBrowserEvent
|
||||
|
||||
/**
|
||||
* Array of arguments of an event you pass as a generic
|
||||
* These only include custom browser events
|
||||
*/
|
||||
export type RageFW_BrowserArgs<K extends RageFW_BrowserEvent> = Parameters<
|
||||
RageFW_ICustomBrowserEvent[K]
|
||||
export type FW_BrowserArgs<K extends FW_BrowserEvent> = Parameters<
|
||||
FW_ICustomBrowserEvent[K]
|
||||
>
|
||||
|
||||
/**
|
||||
* Return type of event you pass as a generic
|
||||
* These only include custom browser events
|
||||
*/
|
||||
export type RageFW_BrowserReturn<K extends RageFW_BrowserEvent> = ReturnType<
|
||||
RageFW_ICustomBrowserEvent[K]
|
||||
export type FW_BrowserReturn<K extends FW_BrowserEvent> = ReturnType<
|
||||
FW_ICustomBrowserEvent[K]
|
||||
>
|
||||
|
||||
/**
|
||||
* Callback (function) of event you pass as a generic
|
||||
* These only include custom browser events
|
||||
*/
|
||||
export type RageFW_BrowserCallback<K extends keyof RageFW_ICustomBrowserEvent> =
|
||||
(...args: RageFW_BrowserArgs<K>) => Promise<RageFW_BrowserReturn<K>>
|
||||
export type FW_BrowserCallback<K extends keyof FW_ICustomBrowserEvent> = (
|
||||
...args: FW_BrowserArgs<K>
|
||||
) => Promise<FW_BrowserReturn<K>>
|
||||
|
||||
export type _BrowserEventHasArgs<
|
||||
EventName extends keyof RageFW_ICustomBrowserEvent,
|
||||
> = keyof RageFW_ICustomBrowserEvent extends never
|
||||
EventName extends keyof FW_ICustomBrowserEvent,
|
||||
> = keyof FW_ICustomBrowserEvent extends never
|
||||
? false
|
||||
: Parameters<RageFW_ICustomBrowserEvent[EventName]>[0] extends undefined
|
||||
: Parameters<FW_ICustomBrowserEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
|
||||
+14
-15
@@ -1,33 +1,32 @@
|
||||
import type { RageFW_ICustomClientEvent } from '@entityseven/rage-fw-shared-types'
|
||||
import type { FW_ICustomClientEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
export type { RageFW_ICustomClientEvent } from '@entityseven/rage-fw-shared-types'
|
||||
export type { FW_ICustomClientEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
/**
|
||||
* Union of all available client event names
|
||||
* These only include custom events and some extras from RageFW
|
||||
* These only include custom events and some internals for RageFW
|
||||
*/
|
||||
export type RageFW_ClientEvent = keyof RageFW_ICustomClientEvent
|
||||
export type FW_ClientEvent = keyof FW_ICustomClientEvent
|
||||
|
||||
/**
|
||||
* Array of arguments of event you pass as a generic
|
||||
* These only include custom client events
|
||||
*/
|
||||
export type RageFW_ClientArgs<K extends RageFW_ClientEvent> = Parameters<
|
||||
RageFW_ICustomClientEvent[K]
|
||||
export type FW_ClientArgs<K extends FW_ClientEvent> = Parameters<
|
||||
FW_ICustomClientEvent[K]
|
||||
>
|
||||
|
||||
/**
|
||||
* Return type of event you pass as a generic
|
||||
* These only include custom client events
|
||||
*/
|
||||
export type RageFW_ClientReturn<K extends RageFW_ClientEvent> = ReturnType<
|
||||
RageFW_ICustomClientEvent[K]
|
||||
export type FW_ClientReturn<K extends FW_ClientEvent> = ReturnType<
|
||||
FW_ICustomClientEvent[K]
|
||||
>
|
||||
|
||||
export type _ClientEventHasArgs<
|
||||
EventName extends keyof RageFW_ICustomClientEvent,
|
||||
> = keyof RageFW_ICustomClientEvent extends never
|
||||
? false
|
||||
: Parameters<RageFW_ICustomClientEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
export type _ClientEventHasArgs<EventName extends keyof FW_ICustomClientEvent> =
|
||||
keyof FW_ICustomClientEvent extends never
|
||||
? false
|
||||
: Parameters<FW_ICustomClientEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
export * from './browser'
|
||||
export * from './client'
|
||||
export * from './server'
|
||||
export type * from './browser'
|
||||
export type * from './client'
|
||||
export type * from './server'
|
||||
|
||||
+13
-14
@@ -1,33 +1,32 @@
|
||||
import type { RageFW_ICustomServerEvent } from '@entityseven/rage-fw-shared-types'
|
||||
import type { FW_ICustomServerEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
export type { RageFW_ICustomServerEvent } from '@entityseven/rage-fw-shared-types'
|
||||
export type { FW_ICustomServerEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
/**
|
||||
* Union of all available server event names
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_ServerEvent = keyof RageFW_ICustomServerEvent
|
||||
export type FW_ServerEvent = keyof FW_ICustomServerEvent
|
||||
|
||||
/**
|
||||
* Array of arguments of event you pass as a generic
|
||||
* These only include custom server events
|
||||
*/
|
||||
export type RageFW_ServerArgs<K extends RageFW_ServerEvent> = Parameters<
|
||||
RageFW_ICustomServerEvent[K]
|
||||
export type FW_ServerArgs<K extends FW_ServerEvent> = Parameters<
|
||||
FW_ICustomServerEvent[K]
|
||||
>
|
||||
|
||||
/**
|
||||
* Return type of event you pass as a generic
|
||||
* These only include custom server events
|
||||
*/
|
||||
export type RageFW_ServerReturn<K extends RageFW_ServerEvent> = ReturnType<
|
||||
RageFW_ICustomServerEvent[K]
|
||||
export type FW_ServerReturn<K extends FW_ServerEvent> = ReturnType<
|
||||
FW_ICustomServerEvent[K]
|
||||
>
|
||||
|
||||
export type _ServerEventHasArgs<
|
||||
EventName extends keyof RageFW_ICustomServerEvent,
|
||||
> = keyof RageFW_ICustomServerEvent extends never
|
||||
? false
|
||||
: Parameters<RageFW_ICustomServerEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
export type _ServerEventHasArgs<EventName extends keyof FW_ICustomServerEvent> =
|
||||
keyof FW_ICustomServerEvent extends never
|
||||
? false
|
||||
: Parameters<FW_ICustomServerEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
|
||||
+4
-21
@@ -1,25 +1,8 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/tsconfig",
|
||||
"display": "Base",
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
],
|
||||
"display": "Browser",
|
||||
"compilerOptions": {
|
||||
"incremental": false,
|
||||
"composite": false,
|
||||
"target": "ES2022",
|
||||
"experimentalDecorators": true,
|
||||
"moduleDetection": "auto",
|
||||
"module": "CommonJS",
|
||||
"resolveJsonModule": true,
|
||||
"declaration": false,
|
||||
"declarationMap": false,
|
||||
"sourceMap": false,
|
||||
"downlevelIteration": false,
|
||||
"inlineSourceMap": false,
|
||||
"esModuleInterop": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"strict": true,
|
||||
"skipLibCheck": true
|
||||
}
|
||||
"types": ["./node_modules/@ragempcommunity/types-cef/index.d.ts", "node"]
|
||||
},
|
||||
"extends": ["../tsconfig.ragefw.json"]
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import { defineConfig } from 'tsup'
|
||||
|
||||
export default defineConfig({
|
||||
entry: ['src/index.ts'],
|
||||
entry: ['src/**/*.ts'],
|
||||
outDir: './dist',
|
||||
format: ['cjs'],
|
||||
noExternal: ['rage-rpc'],
|
||||
experimentalDts: true,
|
||||
splitting: false,
|
||||
bundle: false,
|
||||
sourcemap: false,
|
||||
clean: true,
|
||||
})
|
||||
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 Entity Seven Group
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
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.
|
||||
+20
-14
@@ -1,19 +1,21 @@
|
||||
{
|
||||
"name": "@entityseven/create-rage-fw",
|
||||
"version": "0.1.1",
|
||||
"version": "0.1.2",
|
||||
"bin": {
|
||||
"rage-fw": "dist/index.js"
|
||||
},
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"readme.md",
|
||||
"LICENSE"
|
||||
],
|
||||
"scripts": {
|
||||
"watch": "tsc -w",
|
||||
"build": "tsup",
|
||||
"start": "npx ./dist create"
|
||||
"start": "npx ./dist create",
|
||||
"install": "pnpm install --ignore-workspace"
|
||||
},
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"readme.md"
|
||||
],
|
||||
"dependencies": {
|
||||
"@inquirer/prompts": "^5.0.5",
|
||||
"ky": "^1.7.2",
|
||||
@@ -21,16 +23,20 @@
|
||||
"yargs": "^17.7.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.14.2",
|
||||
"@types/node": "^22.12.0",
|
||||
"@types/yargs": "^17.0.32",
|
||||
"prettier": "^3.3.2",
|
||||
"typescript": "^5.4.5"
|
||||
"typescript": "^5.7.3"
|
||||
},
|
||||
"description": "CLI to scaffold a template project for RageFW",
|
||||
"keywords": [],
|
||||
"author": "rilaxik",
|
||||
"contributors": [{
|
||||
"name": "SashaGoncharov19"
|
||||
}],
|
||||
"description": "CLI to scaffold a preview for Rage FW",
|
||||
"keywords": ["create-rage-fw","ragefw-cli", "ragefw", "rage-fw", "ragemp", "rage:mp", "rage", "gta5"],
|
||||
"author": "Entity Seven Group",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Danya H",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik/"
|
||||
}
|
||||
],
|
||||
"license": "MIT"
|
||||
}
|
||||
|
||||
Generated
+488
@@ -0,0 +1,488 @@
|
||||
lockfileVersion: '9.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
excludeLinksFromLockfile: false
|
||||
|
||||
importers:
|
||||
|
||||
.:
|
||||
dependencies:
|
||||
'@inquirer/prompts':
|
||||
specifier: ^5.0.5
|
||||
version: 5.5.0
|
||||
chalk:
|
||||
specifier: 4.1.2
|
||||
version: 4.1.2
|
||||
ky:
|
||||
specifier: ^1.7.2
|
||||
version: 1.7.4
|
||||
yargs:
|
||||
specifier: ^17.7.2
|
||||
version: 17.7.2
|
||||
devDependencies:
|
||||
'@types/node':
|
||||
specifier: ^22.12.0
|
||||
version: 22.12.0
|
||||
'@types/yargs':
|
||||
specifier: ^17.0.32
|
||||
version: 17.0.33
|
||||
prettier:
|
||||
specifier: ^3.3.2
|
||||
version: 3.4.2
|
||||
typescript:
|
||||
specifier: ^5.7.3
|
||||
version: 5.7.3
|
||||
|
||||
packages:
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@types/[email protected]':
|
||||
resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==}
|
||||
|
||||
'@types/[email protected]':
|
||||
resolution: {integrity: sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==}
|
||||
|
||||
'@types/[email protected]':
|
||||
resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==}
|
||||
|
||||
'@types/[email protected]':
|
||||
resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
|
||||
|
||||
'@types/[email protected]':
|
||||
resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
|
||||
engines: {node: '>= 12'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
|
||||
engines: {node: '>=7.0.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
|
||||
engines: {node: 6.* || 8.* || >= 10.*}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-zYEr/gh7uLW2l4su11bmQ2M9xLgQLjyvx58UyNM/6nuqyWFHPX5ktMjvpev3F8QWdjSsHUpnWew4PBCswBNuMQ==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
|
||||
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
|
||||
engines: {node: '>=14'}
|
||||
hasBin: true
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
|
||||
engines: {node: '>=14'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
|
||||
engines: {node: '>=0.6.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
|
||||
engines: {node: '>=14.17'}
|
||||
hasBin: true
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
snapshots:
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/core': 9.2.1
|
||||
'@inquirer/figures': 1.0.9
|
||||
'@inquirer/type': 1.5.5
|
||||
ansi-escapes: 4.3.2
|
||||
yoctocolors-cjs: 2.1.2
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/core': 9.2.1
|
||||
'@inquirer/type': 1.5.5
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/figures': 1.0.9
|
||||
'@inquirer/type': 2.0.0
|
||||
'@types/mute-stream': 0.0.4
|
||||
'@types/node': 22.12.0
|
||||
'@types/wrap-ansi': 3.0.0
|
||||
ansi-escapes: 4.3.2
|
||||
cli-width: 4.1.0
|
||||
mute-stream: 1.0.0
|
||||
signal-exit: 4.1.0
|
||||
strip-ansi: 6.0.1
|
||||
wrap-ansi: 6.2.0
|
||||
yoctocolors-cjs: 2.1.2
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/core': 9.2.1
|
||||
'@inquirer/type': 1.5.5
|
||||
external-editor: 3.1.0
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/core': 9.2.1
|
||||
'@inquirer/type': 1.5.5
|
||||
yoctocolors-cjs: 2.1.2
|
||||
|
||||
'@inquirer/[email protected]': {}
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/core': 9.2.1
|
||||
'@inquirer/type': 1.5.5
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/core': 9.2.1
|
||||
'@inquirer/type': 1.5.5
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/core': 9.2.1
|
||||
'@inquirer/type': 1.5.5
|
||||
ansi-escapes: 4.3.2
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/checkbox': 2.5.0
|
||||
'@inquirer/confirm': 3.2.0
|
||||
'@inquirer/editor': 2.2.0
|
||||
'@inquirer/expand': 2.3.0
|
||||
'@inquirer/input': 2.3.0
|
||||
'@inquirer/number': 1.1.0
|
||||
'@inquirer/password': 2.2.0
|
||||
'@inquirer/rawlist': 2.3.0
|
||||
'@inquirer/search': 1.1.0
|
||||
'@inquirer/select': 2.5.0
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/core': 9.2.1
|
||||
'@inquirer/type': 1.5.5
|
||||
yoctocolors-cjs: 2.1.2
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/core': 9.2.1
|
||||
'@inquirer/figures': 1.0.9
|
||||
'@inquirer/type': 1.5.5
|
||||
yoctocolors-cjs: 2.1.2
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
'@inquirer/core': 9.2.1
|
||||
'@inquirer/figures': 1.0.9
|
||||
'@inquirer/type': 1.5.5
|
||||
ansi-escapes: 4.3.2
|
||||
yoctocolors-cjs: 2.1.2
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
mute-stream: 1.0.0
|
||||
|
||||
'@inquirer/[email protected]':
|
||||
dependencies:
|
||||
mute-stream: 1.0.0
|
||||
|
||||
'@types/[email protected]':
|
||||
dependencies:
|
||||
'@types/node': 22.12.0
|
||||
|
||||
'@types/[email protected]':
|
||||
dependencies:
|
||||
undici-types: 6.20.0
|
||||
|
||||
'@types/[email protected]': {}
|
||||
|
||||
'@types/[email protected]': {}
|
||||
|
||||
'@types/[email protected]':
|
||||
dependencies:
|
||||
'@types/yargs-parser': 21.0.3
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
type-fest: 0.21.3
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
color-convert: 2.0.1
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
ansi-styles: 4.3.0
|
||||
supports-color: 7.2.0
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
string-width: 4.2.3
|
||||
strip-ansi: 6.0.1
|
||||
wrap-ansi: 7.0.0
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
color-name: 1.1.4
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
chardet: 0.7.0
|
||||
iconv-lite: 0.4.24
|
||||
tmp: 0.0.33
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
safer-buffer: 2.1.2
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
emoji-regex: 8.0.0
|
||||
is-fullwidth-code-point: 3.0.0
|
||||
strip-ansi: 6.0.1
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
ansi-regex: 5.0.1
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
has-flag: 4.0.0
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
os-tmpdir: 1.0.2
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
ansi-styles: 4.3.0
|
||||
string-width: 4.2.3
|
||||
strip-ansi: 6.0.1
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
ansi-styles: 4.3.0
|
||||
string-width: 4.2.3
|
||||
strip-ansi: 6.0.1
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
cliui: 8.0.1
|
||||
escalade: 3.2.0
|
||||
get-caller-file: 2.0.5
|
||||
require-directory: 2.1.1
|
||||
string-width: 4.2.3
|
||||
y18n: 5.0.8
|
||||
yargs-parser: 21.1.1
|
||||
|
||||
[email protected]: {}
|
||||
+25
-13
@@ -1,29 +1,41 @@
|
||||
# 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/)
|
||||
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/) and [bun](https://bun.sh/)
|
||||
|
||||
``pnpm create @entityseven/rage-fw@latest``
|
||||
|
||||
## TL;DR
|
||||
``bun create @entityseven/rage-fw@latest``
|
||||
|
||||
# TL;DR
|
||||
- ``Initialize new project`` - create new template project
|
||||
- ``Test our RPC`` - scaffold an example for ``@entityseven/rage-fw-rpc``
|
||||
- ``Install RAGE:MP updater`` - download and update RAGE:MP server files
|
||||
|
||||
## Options
|
||||
# Options
|
||||
For now, you will see a few available options. They are described in detail below
|
||||
|
||||
- ``Initialize new project``
|
||||
- ``Test our RPC``
|
||||
- ``Install RAGE:MP updater``
|
||||
|
||||
### Initialize new project
|
||||
Using this options will forward you to common project-creation menu
|
||||
## Initialize new project
|
||||
Using this option 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-example**
|
||||
|
||||
This option will specify a name for your project which is used as a folder name too. Defaults to **rage-fw**
|
||||
- ``Select front-end``
|
||||
Use selector menu to choose which front-end framework you want to use. We will do our best to expand this menu with various solutions
|
||||
|
||||
- ``Select frontend``
|
||||
## Test our RPC
|
||||
Using this option will forward you to common project creation menu
|
||||
|
||||
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)**
|
||||
- ``Enter project name``
|
||||
This option will specify a name for your project which is used as a folder name too. Defaults to **rage-fw-rpc-example**
|
||||
|
||||
### Install Rage:MP updater
|
||||
This option will simplify installation process of Rage:MP server files required to start your server
|
||||
- ``Select front-end``
|
||||
Use selector menu to choose which front-end framework you want to use. We will do our best to expand this menu with various solutions
|
||||
|
||||
## Install Rage:MP updater
|
||||
This option will simplify installation and update process of Rage:MP server files required to start your server
|
||||
|
||||
# Contribution
|
||||
If you wish to help us in expanding examples selection with different framework you are very welcome to open PRs and Issues
|
||||
+23
-15
@@ -3,9 +3,22 @@ import { input, select } from '@inquirer/prompts'
|
||||
import path from 'node:path'
|
||||
import { cloneBranch } from '../utils/cloner'
|
||||
|
||||
const choices = {
|
||||
'react-18': {
|
||||
name: 'React 18',
|
||||
value: 'react-18',
|
||||
description: 'React 18 + TypeScript (Vite) as a front-end',
|
||||
},
|
||||
'svelte-5': {
|
||||
name: 'Svelte 5',
|
||||
value: 'svelte-5',
|
||||
description: 'Svelte 5 + TypeScript (Vite) as a front-end',
|
||||
},
|
||||
} as const
|
||||
|
||||
export async function initProject() {
|
||||
let folder
|
||||
let framework
|
||||
let folder: string | undefined
|
||||
let framework: keyof typeof choices | undefined
|
||||
|
||||
if (!folder) {
|
||||
folder = await input({
|
||||
@@ -18,27 +31,21 @@ export async function initProject() {
|
||||
|
||||
if (!framework) {
|
||||
framework = await select({
|
||||
message: c.gray('Select frontend:'),
|
||||
message: c.gray('Select front-end:'),
|
||||
default: 'react-18',
|
||||
loop: true,
|
||||
choices: [
|
||||
{
|
||||
name: 'React + TypeScript (Vite)',
|
||||
value: 'react-18',
|
||||
description: 'React + TypeScript (Vite) as a frontend',
|
||||
},
|
||||
],
|
||||
choices: Object.values(choices),
|
||||
})
|
||||
} else {
|
||||
console.log(c.gray('Frontend:'), framework)
|
||||
console.log(c.gray('Front-end:'), choices[framework].name)
|
||||
}
|
||||
|
||||
console.log(
|
||||
c.gray('\nScaffolding template project into'),
|
||||
folder,
|
||||
c.gray('with'),
|
||||
framework,
|
||||
c.gray('as a frontend..'),
|
||||
choices[framework].name,
|
||||
c.gray('as a front-end..'),
|
||||
)
|
||||
|
||||
cloneBranch(
|
||||
@@ -50,11 +57,12 @@ export async function initProject() {
|
||||
console.log(c.gray('Scaffolded project into'), folder)
|
||||
console.log(
|
||||
c.gray(
|
||||
`Project was created ar dir: ${path.join(process.cwd(), folder)}`,
|
||||
`Project was created in: ${path.join(process.cwd(), folder)}`,
|
||||
),
|
||||
)
|
||||
})
|
||||
.catch(e => {
|
||||
console.log(c.red('Error occured: \n', e))
|
||||
console.log(c.red('Error occurred: \n', e))
|
||||
console.log(c.red('Please open an issue if you see this'))
|
||||
})
|
||||
}
|
||||
|
||||
@@ -5,20 +5,20 @@ import { cloneBranch } from '../utils/cloner'
|
||||
|
||||
const choices = {
|
||||
'rpc-react-18': {
|
||||
name: 'Vite + React 18 + TypeScript',
|
||||
name: 'React 18',
|
||||
value: 'rpc-react-18',
|
||||
description: 'Vite + React 18 + TypeScript as a frontend',
|
||||
description: 'Vite + React 18 + TypeScript as a front-end',
|
||||
},
|
||||
'rpc-svelte-5': {
|
||||
name: 'Vite + Svelte 5 + TypeScript',
|
||||
name: 'Svelte 5',
|
||||
value: 'rpc-svelte-5',
|
||||
description: 'Vite + Svelte 5 + TypeScript as a frontend',
|
||||
description: 'Vite + Svelte 5 + TypeScript as a front-end',
|
||||
},
|
||||
} as const
|
||||
|
||||
export async function testRpc() {
|
||||
let folder
|
||||
let framework
|
||||
let folder: string | undefined
|
||||
let framework: keyof typeof choices | undefined
|
||||
|
||||
if (!folder) {
|
||||
folder = await input({
|
||||
@@ -31,13 +31,13 @@ export async function testRpc() {
|
||||
|
||||
if (!framework) {
|
||||
framework = await select({
|
||||
message: c.gray('Select frontend:'),
|
||||
message: c.gray('Select front-end:'),
|
||||
default: 'rpc-react-18',
|
||||
loop: true,
|
||||
choices: Object.values(choices),
|
||||
})
|
||||
} else {
|
||||
console.log(c.gray('Frontend:'), framework)
|
||||
console.log(c.gray('Front-end:'), choices[framework].name)
|
||||
}
|
||||
|
||||
console.log(
|
||||
@@ -45,7 +45,7 @@ export async function testRpc() {
|
||||
folder,
|
||||
c.gray('with'),
|
||||
choices[framework].name,
|
||||
c.gray('as a frontend..'),
|
||||
c.gray('as a frontend'),
|
||||
)
|
||||
|
||||
cloneBranch(
|
||||
@@ -62,6 +62,7 @@ export async function testRpc() {
|
||||
)
|
||||
})
|
||||
.catch(e => {
|
||||
console.log(c.red('Error occured: \n', e))
|
||||
console.log(c.red('Error occurred: \n', e))
|
||||
console.log(c.red('Please open an issue if you see this'))
|
||||
})
|
||||
}
|
||||
|
||||
+14
-4
@@ -12,10 +12,19 @@ enum Actions {
|
||||
UPDATER = 'UPDATER',
|
||||
}
|
||||
|
||||
process.on('exit', () => {
|
||||
console.log(c.blueBright('\n\nRage FW CLI | Exiting..'))
|
||||
process.exit(0)
|
||||
})
|
||||
|
||||
process.on('SIGINT', () => {
|
||||
console.log(c.blueBright('\n\nRage FW CLI | Exiting..'))
|
||||
process.exit(0)
|
||||
})
|
||||
;(async () => {
|
||||
await checkForUpdates()
|
||||
|
||||
console.log(c.blueBright('Rage FW CLI | Powered by Entity Seven Group ️<3'))
|
||||
console.log(c.blueBright('Rage FW CLI | Powered by Entity Seven Group <3'))
|
||||
|
||||
const action = await select({
|
||||
message: c.gray('Select action:'),
|
||||
@@ -26,16 +35,16 @@ enum Actions {
|
||||
description: 'Initialize a new project and start developing',
|
||||
},
|
||||
{
|
||||
name: 'Test our RPC',
|
||||
name: 'Test our Rpc',
|
||||
value: Actions.TEST_RPC,
|
||||
description:
|
||||
'Initialize a new skeleton project with our RPC set up',
|
||||
'Initialize a new skeleton project with our Rpc all set',
|
||||
},
|
||||
{
|
||||
name: 'Install RAGE:MP updater',
|
||||
value: Actions.UPDATER,
|
||||
description:
|
||||
'Use our tool to download or update RAGE:MP server files in two clicks',
|
||||
'Use our tool to download or update RAGE:MP server files in just two clicks',
|
||||
},
|
||||
],
|
||||
loop: true,
|
||||
@@ -53,5 +62,6 @@ enum Actions {
|
||||
break
|
||||
default:
|
||||
console.log(c.red('Something went wrong..'))
|
||||
console.log(c.red('Please open an issue if you see this'))
|
||||
}
|
||||
})()
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es6",
|
||||
"target": "esnext",
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"lib": ["DOM", "ES6"],
|
||||
"lib": ["DOM", "esnext"],
|
||||
"declaration": true,
|
||||
"declarationMap": true,
|
||||
"sourceMap": true,
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
Custom Attribution-NoDerives Software License
|
||||
|
||||
Copyright (c) 2024 Entity Seven Group
|
||||
|
||||
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.
|
||||
+59
-28
@@ -1,32 +1,63 @@
|
||||
{
|
||||
"name": "@entityseven/rage-fw-client",
|
||||
"version": "0.2.1-0.2.0-alpha.1.0",
|
||||
"private": false,
|
||||
"name": "@entityseven/rage-fw-client",
|
||||
"version": "0.2.0",
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"readme.md",
|
||||
"LICENSE",
|
||||
"package.json"
|
||||
],
|
||||
"main": "src/index.ts",
|
||||
"exports": {
|
||||
".": "./src/index.ts"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/src/index.d.ts",
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"readme.md"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsup"
|
||||
"types": "dist/index.d.ts",
|
||||
"exports": {
|
||||
".": "./dist/index.js"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsup"
|
||||
},
|
||||
"dependencies": {
|
||||
"@entityseven/rage-fw-rpc": "workspace:*",
|
||||
"zod": "^3.24.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "22.12.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@entityseven/rage-fw-shared-types": "workspace:*",
|
||||
"@ragempcommunity/types-client": "^2.1.8",
|
||||
"typescript": "^5.7.3"
|
||||
},
|
||||
"description": "Package used on a client-side of your Rage:MP Server",
|
||||
"keywords": [
|
||||
"rage-fw-client",
|
||||
"ragefw",
|
||||
"rage-fw",
|
||||
"ragemp",
|
||||
"rage:mp",
|
||||
"rage",
|
||||
"gta5"
|
||||
],
|
||||
"author": "Entity Seven Group",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Danya H",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik/"
|
||||
},
|
||||
"dependencies": {
|
||||
"@entityseven/rage-fw-rpc": "latest"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@entityseven/rage-fw-shared-types": "workspace:^",
|
||||
"@ragempcommunity/types-client": "^2.1.8"
|
||||
},
|
||||
"description": "RageFW Client side",
|
||||
"keywords": [],
|
||||
"author": "SashaGoncharov19",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "rilaxik",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"gitHead": "053e4fd12aa120d53e11e0d2009c0df78c1a2ad0"
|
||||
{
|
||||
"name": "Oleksandr Honcharov",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/SashaGoncharov19/"
|
||||
}
|
||||
],
|
||||
"license": "Custom-Attribution-NoDerivs",
|
||||
"gitHead": "ffd542c1deddb3033e16e0dae7557313ae09b05f"
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,2 +1,2 @@
|
||||
# RageFW Client
|
||||
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki/Docs)
|
||||
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki)
|
||||
+10
-14
@@ -1,9 +1,9 @@
|
||||
import { rpc } from './rpc'
|
||||
import { Middleware } from './middleware'
|
||||
import { FW_Middleware } from './middleware'
|
||||
import type * as T from '../types'
|
||||
|
||||
/** Client-side interactions */
|
||||
export class Client {
|
||||
export class FW_Client {
|
||||
/**
|
||||
* Registers a client event with an associated callback
|
||||
*
|
||||
@@ -11,7 +11,7 @@ export class Client {
|
||||
* @param callback - The callback function to be executed when the event is triggered
|
||||
* @param [options] - Optional settings for callback execution
|
||||
* @param [options.middlewares] - Middleware functions to be checked before the callback executes
|
||||
* @returns {Client} The current client instance, enabling method chaining
|
||||
* @returns {FW_Client} The current client instance, enabling method chaining
|
||||
*
|
||||
* @example
|
||||
* // Registering an event
|
||||
@@ -40,13 +40,13 @@ export class Client {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public register<EventName extends T.RageFW_ClientEvent>(
|
||||
public register<EventName extends T.FW_ClientEvent>(
|
||||
eventName: EventName,
|
||||
callback: T.RageFW_ClientCallback<EventName>,
|
||||
callback: T.FW_ClientCallback<EventName>,
|
||||
options?: {
|
||||
middlewares?: T.RageFW_MiddlewareOptions<EventName>
|
||||
middlewares?: T.FW_MiddlewareOptions<EventName>
|
||||
},
|
||||
): Client {
|
||||
): FW_Client {
|
||||
rpc.register<
|
||||
Parameters<typeof callback>,
|
||||
ReturnType<typeof callback> | Promise<unknown>,
|
||||
@@ -54,7 +54,7 @@ export class Client {
|
||||
>(eventName, async (...data) => {
|
||||
if (!options?.middlewares) return await callback(...data)
|
||||
|
||||
await Middleware.process(options.middlewares, callback, data)
|
||||
await FW_Middleware.process(options.middlewares, callback, data)
|
||||
})
|
||||
|
||||
return this
|
||||
@@ -72,15 +72,11 @@ export class Client {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public unregister<EventName extends T.RageFW_ClientEvent>(
|
||||
public unregister<EventName extends T.FW_ClientEvent>(
|
||||
eventName: EventName,
|
||||
): Client {
|
||||
): FW_Client {
|
||||
rpc.unregister<EventName>(eventName)
|
||||
|
||||
return this
|
||||
}
|
||||
}
|
||||
|
||||
// new Client()
|
||||
// .register('customClientEvent', async (a, b) => true)
|
||||
// .unregister('customClientEvent')
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Used to log to a client in-game console
|
||||
*/
|
||||
export class Logger {
|
||||
export class FW_Logger {
|
||||
/**
|
||||
* Informational logs. Colored in white
|
||||
*
|
||||
@@ -10,7 +10,7 @@ export class Logger {
|
||||
*/
|
||||
public info(...message: unknown[]) {
|
||||
mp.console.logInfo(
|
||||
`[${new Date().toLocaleTimeString()}] [INFO] ${message.join(' ')}`,
|
||||
`[${new Date().toLocaleTimeString(undefined, { hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 2 })}] [INFO] ${message.join(' ')}`,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ export class Logger {
|
||||
*/
|
||||
public warn(...message: unknown[]) {
|
||||
mp.console.logWarning(
|
||||
`[${new Date().toLocaleTimeString()}] [WARN] ${message.join(' ')}`,
|
||||
`[${new Date().toLocaleTimeString(undefined, { hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 2 })}] [WARN] ${message.join(' ')}`,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ export class Logger {
|
||||
*/
|
||||
public error(...message: unknown[]) {
|
||||
mp.console.logError(
|
||||
`[${new Date().toLocaleTimeString()}] [ERROR] ${message.join(' ')}`,
|
||||
`[${new Date().toLocaleTimeString(undefined, { hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 2 })}] [ERROR] ${message.join(' ')}`,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import type * as T from '../types'
|
||||
|
||||
export class Middleware {
|
||||
export class FW_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> {
|
||||
private static async execute<EventName extends T.FW_ClientEvent>(
|
||||
middlewares: T.FW_MiddlewareFunction<EventName>[],
|
||||
args: T.FW_ClientArgs<EventName>,
|
||||
): Promise<T.FW_MiddlewareResponseInternal> {
|
||||
for (let i = 0; i < middlewares.length; i++) {
|
||||
const result = await middlewares[i](...args)
|
||||
|
||||
@@ -21,20 +21,20 @@ export class Middleware {
|
||||
}
|
||||
}
|
||||
|
||||
public static async process<EventName extends T.RageFW_ClientEvent>(
|
||||
middlewareOptions: T.RageFW_MiddlewareOptions<EventName>,
|
||||
callback: T.RageFW_ClientCallback<EventName>,
|
||||
args: T.RageFW_ClientArgs<EventName>,
|
||||
public static async process<EventName extends T.FW_ClientEvent>(
|
||||
middlewareOptions: T.FW_MiddlewareOptions<EventName>,
|
||||
callback: T.FW_ClientCallback<EventName>,
|
||||
args: T.FW_ClientArgs<EventName>,
|
||||
) {
|
||||
if (Array.isArray(middlewareOptions)) {
|
||||
const middlewaresResponse = await Middleware.execute(
|
||||
const middlewaresResponse = await FW_Middleware.execute(
|
||||
middlewareOptions,
|
||||
args,
|
||||
)
|
||||
|
||||
if (middlewaresResponse.success) return await callback(...args)
|
||||
} else {
|
||||
const middlewaresResponse = await Middleware.execute(
|
||||
const middlewaresResponse = await FW_Middleware.execute(
|
||||
middlewareOptions.executables,
|
||||
args,
|
||||
)
|
||||
|
||||
+106
-23
@@ -2,7 +2,7 @@ import { rpc } from './rpc'
|
||||
import type * as T from '../types'
|
||||
|
||||
/** Handles event manipulations that require player to be present in context */
|
||||
export class Player {
|
||||
export class FW_Player {
|
||||
private _browser: BrowserMp | undefined = undefined
|
||||
|
||||
/**
|
||||
@@ -14,12 +14,40 @@ export class Player {
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers a client event from the client with arguments from shared types
|
||||
* Triggers a client event from the client with arguments from 'rage-fw-shared-types'
|
||||
*
|
||||
* Formerly known as ``call`` or ``emit``
|
||||
*
|
||||
* @param eventName - The name of the client event to trigger
|
||||
* @param [args] - Arguments for the client event, if present
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Triggering a client event without arguments
|
||||
* fw.player.trigger("clientEventName")
|
||||
*
|
||||
* @example
|
||||
* // Triggering a client event with arguments
|
||||
* fw.player.trigger("clientEventName", ["message to me"])
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public trigger<EventName extends keyof T.FW_ICustomClientEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._ClientEventHasArgs<EventName> extends true
|
||||
? [T.FW_ClientArgs<EventName>]
|
||||
: []
|
||||
): void {
|
||||
rpc.call<typeof args, EventName>(eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers an asynchronous client event from the client with arguments from 'rage-fw-shared-types', and expects to receive a response from an event
|
||||
*
|
||||
* Formerly known as ``callAsync`` or ``emitAsync``
|
||||
*
|
||||
* @param eventName - The name of the client event to trigger
|
||||
* @param [args] - Arguments for the client event, if present
|
||||
* @returns {Promise} resolving to the client's response for the event
|
||||
*
|
||||
* @example
|
||||
@@ -32,26 +60,54 @@ export class Player {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public async trigger<EventName extends keyof T.RageFW_ICustomClientEvent>(
|
||||
public async triggerAsync<EventName extends keyof T.FW_ICustomClientEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._ClientEventHasArgs<EventName> extends true
|
||||
? [T.RageFW_ClientArgs<EventName>]
|
||||
? [T.FW_ClientArgs<EventName>]
|
||||
: []
|
||||
): Promise<T.RageFW_ClientReturn<EventName>> {
|
||||
return await rpc.call<
|
||||
): Promise<T.FW_ClientReturn<EventName>> {
|
||||
return await rpc.callAsync<
|
||||
typeof args,
|
||||
EventName,
|
||||
T.RageFW_ClientReturn<EventName>
|
||||
T.FW_ClientReturn<EventName>
|
||||
>(eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers a server event from the client with arguments from shared types
|
||||
* Triggers a server event from the client with arguments from 'rage-fw-shared-types'
|
||||
*
|
||||
* Formerly known as ``callServer`` or ``emitServer``
|
||||
*
|
||||
* @param eventName - The name of the server event to trigger
|
||||
* @param [args] - Arguments for the server event, if present
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Triggering a server event without arguments
|
||||
* fw.player.triggerServer("serverEventName")
|
||||
*
|
||||
* @example
|
||||
* // Triggering a server event with arguments
|
||||
* fw.player.triggerServer("serverEventName", ["message to server"])
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public triggerServer<EventName extends T.FW_ServerEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._ServerEventHasArgs<EventName> extends true
|
||||
? [T.FW_ServerArgs<EventName>]
|
||||
: []
|
||||
): void {
|
||||
rpc.callServer<typeof args, EventName>(eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers an asynchronous server event from the client with arguments from 'rage-fw-shared-types', and expects to receive a response from an event
|
||||
*
|
||||
* Formerly known as ``callServerAsync`` or ``emitServerAsync``
|
||||
*
|
||||
* @param eventName - The name of the server event to trigger
|
||||
* @param [args] - Arguments for the server event, if present
|
||||
* @returns {Promise} resolving to the server's response for the event
|
||||
*
|
||||
* @example
|
||||
@@ -64,26 +120,57 @@ export class Player {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public async triggerServer<EventName extends T.RageFW_ServerEvent>(
|
||||
public async triggerServerAsync<EventName extends T.FW_ServerEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._ServerEventHasArgs<EventName> extends true
|
||||
? [T.RageFW_ServerArgs<EventName>]
|
||||
? [T.FW_ServerArgs<EventName>]
|
||||
: []
|
||||
): Promise<T.RageFW_ClientServerReturn<EventName>> {
|
||||
return await rpc.callServer<
|
||||
): Promise<T.FW_ClientServerReturn<EventName>> {
|
||||
return await rpc.callServerAsync<
|
||||
typeof args,
|
||||
EventName,
|
||||
T.RageFW_ClientServerReturn<EventName>
|
||||
T.FW_ClientServerReturn<EventName>
|
||||
>(eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers a browser event from the client with arguments from shared types
|
||||
* Triggers a browser event from the client with arguments from 'rage-fw-shared-types'
|
||||
*
|
||||
* Formerly known as ``callBrowser`` or ``emitBrowser``
|
||||
*
|
||||
* @param eventName - The name of the browser event to trigger
|
||||
* @param [args] - Arguments for the browser event, if present
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Triggering a browser event without arguments
|
||||
* fw.player.triggerBrowser("browserEventName")
|
||||
*
|
||||
* @example
|
||||
* // Triggering a browser event with arguments
|
||||
* fw.player.triggerBrowser("browserEventName", ["message to browser"])
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public triggerBrowser<EventName extends T.FW_BrowserEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._BrowserEventHasArgs<EventName> extends true
|
||||
? [T.FW_BrowserArgs<EventName>]
|
||||
: []
|
||||
): void {
|
||||
if (!this._browser)
|
||||
throw new Error('You need to initialize browser first')
|
||||
|
||||
rpc.callBrowser<typeof args, EventName>(eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers an asynchronous browser event from the client with arguments from 'rage-fw-shared-types', and expects to receive a response from an event
|
||||
*
|
||||
* Formerly known as ``callBrowserAsync`` or ``emitBrowserAsync``
|
||||
*
|
||||
* @param eventName - The name of the browser event to trigger
|
||||
* @param [args] - Arguments for the browser event, if present
|
||||
* @returns {Promise} resolving to the browser's response for the event
|
||||
*
|
||||
* @example
|
||||
@@ -96,23 +183,19 @@ export class Player {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public async triggerBrowser<EventName extends T.RageFW_BrowserEvent>(
|
||||
public async triggerBrowserAsync<EventName extends T.FW_BrowserEvent>(
|
||||
eventName: EventName,
|
||||
...args: T._BrowserEventHasArgs<EventName> extends true
|
||||
? [T.RageFW_BrowserArgs<EventName>]
|
||||
? [T.FW_BrowserArgs<EventName>]
|
||||
: []
|
||||
): Promise<T.RageFW_BrowserReturn<EventName>> {
|
||||
): Promise<T.FW_BrowserReturn<EventName>> {
|
||||
if (!this._browser)
|
||||
throw new Error('You need to initialize browser first')
|
||||
|
||||
return await rpc.callBrowser<
|
||||
return await rpc.callBrowserAsync<
|
||||
typeof args,
|
||||
EventName,
|
||||
T.RageFW_BrowserReturn<EventName>
|
||||
T.FW_BrowserReturn<EventName>
|
||||
>(eventName, args)
|
||||
}
|
||||
}
|
||||
|
||||
// new Player().trigger('customClientEvent', ['', 1])
|
||||
// new Player().triggerServer('customServerEvent', ['', 1])
|
||||
// new Player().triggerBrowser('customCefEvent', ['', 1])
|
||||
|
||||
+5
-5
@@ -1,6 +1,6 @@
|
||||
import { Client, Logger, Player, rpc } from './core'
|
||||
import { FW_Client, FW_Logger, FW_Player, rpc } from './core'
|
||||
|
||||
export type { RageFW_MiddlewareFunction } from './types'
|
||||
export type { FW_MiddlewareFunction } from './types'
|
||||
|
||||
/**
|
||||
* Package used on a client-side of your Rage:MP Server
|
||||
@@ -9,13 +9,13 @@ export type { RageFW_MiddlewareFunction } from './types'
|
||||
*/
|
||||
export const fw = {
|
||||
/** Client-side interactions */
|
||||
event: new Client(),
|
||||
event: new FW_Client(),
|
||||
/** Handles event manipulations that require player to be present in context */
|
||||
player: new Player(),
|
||||
player: new FW_Player(),
|
||||
/** Handles functions used to interact with the client environment */
|
||||
system: {
|
||||
/** Used to log in a client in-game console */
|
||||
log: new Logger(),
|
||||
log: new FW_Logger(),
|
||||
},
|
||||
/** ``rage-fw-rpc`` instance used under the hood. It is highly recommended to use this one if you need it instead of creating a new instance */
|
||||
rpc,
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
/// <reference types="@ragempcommunity/types-client" />
|
||||
|
||||
import type { RageFW_ICustomBrowserEvent } from '@entityseven/rage-fw-shared-types'
|
||||
import type { FW_ICustomBrowserEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
/**
|
||||
* Union of all available browser event names callable from client
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_BrowserEvent = keyof RageFW_ICustomBrowserEvent
|
||||
export type FW_BrowserEvent = keyof FW_ICustomBrowserEvent
|
||||
|
||||
/**
|
||||
* Array of arguments for an event, name of which you pass as a generic
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_BrowserArgs<K extends RageFW_BrowserEvent> = Parameters<
|
||||
RageFW_ICustomBrowserEvent[K]
|
||||
export type FW_BrowserArgs<K extends FW_BrowserEvent> = Parameters<
|
||||
FW_ICustomBrowserEvent[K]
|
||||
>
|
||||
|
||||
export type RageFW_BrowserReturn<K extends RageFW_BrowserEvent> = ReturnType<
|
||||
RageFW_ICustomBrowserEvent[K]
|
||||
export type FW_BrowserReturn<K extends FW_BrowserEvent> = ReturnType<
|
||||
FW_ICustomBrowserEvent[K]
|
||||
>
|
||||
|
||||
export type _BrowserEventHasArgs<
|
||||
EventName extends keyof RageFW_ICustomBrowserEvent,
|
||||
> = keyof RageFW_ICustomBrowserEvent extends never
|
||||
EventName extends keyof FW_ICustomBrowserEvent,
|
||||
> = keyof FW_ICustomBrowserEvent extends never
|
||||
? false
|
||||
: Parameters<RageFW_ICustomBrowserEvent[EventName]>[0] extends undefined
|
||||
: Parameters<FW_ICustomBrowserEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
|
||||
+18
-21
@@ -1,24 +1,22 @@
|
||||
/// <reference types="@ragempcommunity/types-client" />
|
||||
|
||||
import type { RageFW_ICustomClientEvent } from '@entityseven/rage-fw-shared-types'
|
||||
import type { FW_ICustomClientEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
export type { RageFW_ICustomClientEvent } from '@entityseven/rage-fw-shared-types'
|
||||
export type { FW_ICustomClientEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
/**
|
||||
* Union of all available client event names
|
||||
* These include custom and system events
|
||||
*/
|
||||
export type RageFW_ClientEvent =
|
||||
| keyof RageFW_ICustomClientEvent
|
||||
| keyof IClientEvents
|
||||
export type FW_ClientEvent = keyof FW_ICustomClientEvent | keyof IClientEvents
|
||||
|
||||
/**
|
||||
* Array of arguments for an event, name of which you pass as a generic
|
||||
* These include custom and system events
|
||||
*/
|
||||
export type RageFW_ClientArgs<K extends RageFW_ClientEvent> =
|
||||
K extends keyof RageFW_ICustomClientEvent
|
||||
? Parameters<RageFW_ICustomClientEvent[K]>
|
||||
export type FW_ClientArgs<K extends FW_ClientEvent> =
|
||||
K extends keyof FW_ICustomClientEvent
|
||||
? Parameters<FW_ICustomClientEvent[K]>
|
||||
: K extends keyof IClientEvents
|
||||
? Parameters<IClientEvents[K]>
|
||||
: never
|
||||
@@ -27,9 +25,9 @@ export type RageFW_ClientArgs<K extends RageFW_ClientEvent> =
|
||||
* Return type for an event, name of which you pass as a generic
|
||||
* These include custom and system events
|
||||
*/
|
||||
export type RageFW_ClientReturn<K extends RageFW_ClientEvent> =
|
||||
K extends keyof RageFW_ICustomClientEvent
|
||||
? ReturnType<RageFW_ICustomClientEvent[K]>
|
||||
export type FW_ClientReturn<K extends FW_ClientEvent> =
|
||||
K extends keyof FW_ICustomClientEvent
|
||||
? ReturnType<FW_ICustomClientEvent[K]>
|
||||
: K extends keyof IClientEvents
|
||||
? ReturnType<IClientEvents[K]>
|
||||
: void
|
||||
@@ -38,17 +36,16 @@ export type RageFW_ClientReturn<K extends RageFW_ClientEvent> =
|
||||
* Callback (function) for an event, name of which you pass as a generic
|
||||
* These include custom and system events
|
||||
*/
|
||||
export type RageFW_ClientCallback<K extends RageFW_ClientEvent> = (
|
||||
...args: RageFW_ClientArgs<K>
|
||||
) => Promise<RageFW_ClientReturn<K>>
|
||||
export type FW_ClientCallback<K extends FW_ClientEvent> = (
|
||||
...args: FW_ClientArgs<K>
|
||||
) => Promise<FW_ClientReturn<K>>
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export type _ClientEventHasArgs<
|
||||
EventName extends keyof RageFW_ICustomClientEvent,
|
||||
> = keyof RageFW_ICustomClientEvent extends never
|
||||
? false
|
||||
: Parameters<RageFW_ICustomClientEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
export type _ClientEventHasArgs<EventName extends keyof FW_ICustomClientEvent> =
|
||||
keyof FW_ICustomClientEvent extends never
|
||||
? false
|
||||
: Parameters<FW_ICustomClientEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export * from './browser'
|
||||
export * from './client'
|
||||
export * from './middleware'
|
||||
export * from './server'
|
||||
export type * from './browser'
|
||||
export type * from './client'
|
||||
export type * from './middleware'
|
||||
export type * from './server'
|
||||
|
||||
@@ -1,26 +1,25 @@
|
||||
import type * as T from './client'
|
||||
|
||||
export type RageFW_MiddlewareResponse =
|
||||
export type FW_MiddlewareResponse =
|
||||
| {
|
||||
success: boolean
|
||||
message?: string
|
||||
}
|
||||
| boolean
|
||||
|
||||
export type RageFW_MiddlewareResponseInternal = {
|
||||
export type FW_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 FW_MiddlewareFunction<EventName extends T.FW_ClientEvent> = (
|
||||
...args: T.FW_ClientArgs<EventName>
|
||||
) => Promise<FW_MiddlewareResponse>
|
||||
|
||||
export type RageFW_MiddlewareOptions<EventName extends T.RageFW_ClientEvent> =
|
||||
| RageFW_MiddlewareFunction<EventName>[]
|
||||
export type FW_MiddlewareOptions<EventName extends T.FW_ClientEvent> =
|
||||
| FW_MiddlewareFunction<EventName>[]
|
||||
| {
|
||||
executables: RageFW_MiddlewareFunction<EventName>[]
|
||||
executables: FW_MiddlewareFunction<EventName>[]
|
||||
onError: (error: string) => unknown
|
||||
}
|
||||
|
||||
+15
-16
@@ -1,38 +1,37 @@
|
||||
/// <reference types="@ragempcommunity/types-client" />
|
||||
|
||||
import type {
|
||||
RageFW_ICustomClientEvent,
|
||||
RageFW_ICustomServerEvent,
|
||||
FW_ICustomClientEvent,
|
||||
FW_ICustomServerEvent,
|
||||
} from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
/**
|
||||
* Union of all available server event names callable from client
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_ServerEvent = keyof RageFW_ICustomServerEvent
|
||||
export type FW_ServerEvent = keyof FW_ICustomServerEvent
|
||||
|
||||
/**
|
||||
* Array of arguments for an event, name of which you pass as a generic
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_ServerArgs<K extends RageFW_ServerEvent> =
|
||||
K extends keyof RageFW_ICustomServerEvent
|
||||
? Parameters<RageFW_ICustomServerEvent[K]>
|
||||
export type FW_ServerArgs<K extends FW_ServerEvent> =
|
||||
K extends keyof FW_ICustomServerEvent
|
||||
? Parameters<FW_ICustomServerEvent[K]>
|
||||
: never
|
||||
|
||||
/**
|
||||
* Return type for an event, name of which you pass as a generic
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_ClientServerReturn<K extends RageFW_ServerEvent> =
|
||||
K extends keyof RageFW_ICustomServerEvent
|
||||
? ReturnType<RageFW_ICustomServerEvent[K]>
|
||||
export type FW_ClientServerReturn<K extends FW_ServerEvent> =
|
||||
K extends keyof FW_ICustomServerEvent
|
||||
? ReturnType<FW_ICustomServerEvent[K]>
|
||||
: never
|
||||
|
||||
export type _ServerEventHasArgs<
|
||||
EventName extends keyof RageFW_ICustomServerEvent,
|
||||
> = keyof RageFW_ICustomClientEvent extends never
|
||||
? false
|
||||
: Parameters<RageFW_ICustomServerEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
export type _ServerEventHasArgs<EventName extends keyof FW_ICustomServerEvent> =
|
||||
keyof FW_ICustomClientEvent extends never
|
||||
? false
|
||||
: Parameters<FW_ICustomServerEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
|
||||
+4
-21
@@ -1,25 +1,8 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/tsconfig",
|
||||
"display": "Base",
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
],
|
||||
"display": "Client",
|
||||
"compilerOptions": {
|
||||
"incremental": false,
|
||||
"composite": false,
|
||||
"target": "ES2022",
|
||||
"experimentalDecorators": true,
|
||||
"moduleDetection": "auto",
|
||||
"module": "CommonJS",
|
||||
"resolveJsonModule": true,
|
||||
"declaration": false,
|
||||
"declarationMap": false,
|
||||
"sourceMap": false,
|
||||
"downlevelIteration": false,
|
||||
"inlineSourceMap": false,
|
||||
"esModuleInterop": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"strict": true,
|
||||
"skipLibCheck": true
|
||||
}
|
||||
"types": ["./node_modules/@ragempcommunity/types-client/index.d.ts"]
|
||||
},
|
||||
"extends": ["../tsconfig.ragefw.json"]
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import { defineConfig } from 'tsup'
|
||||
|
||||
export default defineConfig({
|
||||
entry: ['src/index.ts'],
|
||||
entry: ['src/**/*.ts'],
|
||||
outDir: './dist',
|
||||
format: ['cjs'],
|
||||
noExternal: ['rage-rpc'],
|
||||
experimentalDts: true,
|
||||
splitting: false,
|
||||
bundle: false,
|
||||
sourcemap: false,
|
||||
clean: true,
|
||||
})
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
import globals from 'globals'
|
||||
import pluginJs from '@eslint/js'
|
||||
import tseslint from 'typescript-eslint'
|
||||
|
||||
import type { Linter } from 'eslint'
|
||||
|
||||
export default [
|
||||
{
|
||||
ignores: ['**/.*/*', '**/dist/*', '**/node_modules/*', '*.config.*'],
|
||||
},
|
||||
pluginJs.configs.recommended,
|
||||
...(tseslint.configs.recommended as Linter.Config[]),
|
||||
{
|
||||
name: 'global',
|
||||
rules: {
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-unused-vars': [
|
||||
'warn',
|
||||
{
|
||||
argsIgnorePattern: '^_',
|
||||
varsIgnorePattern: '^_',
|
||||
caughtErrorsIgnorePattern: '^_',
|
||||
},
|
||||
],
|
||||
'@typescript-eslint/ban-ts-comment': 'off',
|
||||
'@typescript-eslint/ban-types': 'off',
|
||||
'consistent-return': 'off',
|
||||
'no-empty': 'off',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'browser/rpc',
|
||||
files: ['browser/src/*.{ts,js}', 'rpc/src/*.{ts,js}'],
|
||||
languageOptions: {
|
||||
globals: { ...globals.browser, ...globals.node, ...globals.es2022 },
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'cli',
|
||||
files: ['cli/src/*.{ts,js}'],
|
||||
languageOptions: {
|
||||
globals: { ...globals.node, ...globals.es2024 },
|
||||
ecmaVersion: 2024,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'client/server/shared',
|
||||
files: [
|
||||
'client/**/*.{ts,js}',
|
||||
'server/**/*.{ts,js}',
|
||||
'shared/**/*.{ts,js}',
|
||||
],
|
||||
languageOptions: {
|
||||
globals: { ...globals.node, ...globals.es2022 },
|
||||
},
|
||||
},
|
||||
] satisfies Linter.Config[]
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
|
||||
"version": "0.2.1-0.2.0-alpha.1.0",
|
||||
"npmClient": "pnpm"
|
||||
}
|
||||
+55
-21
@@ -1,30 +1,64 @@
|
||||
{
|
||||
"private": true,
|
||||
"workspaces": [
|
||||
"*",
|
||||
"!cli"
|
||||
],
|
||||
"scripts": {
|
||||
"publish": "lerna publish --force-publish",
|
||||
"build": "lerna run build",
|
||||
"lint": "eslint --c .eslintrc.yaml --ext .ts client/ server/ shared-types/",
|
||||
|
||||
"rebuild:browser": "cd browser && pnpm build",
|
||||
"rebuild:client": "cd client && pnpm build",
|
||||
"rebuild:server": "cd server && pnpm build",
|
||||
"rebuild": "pnpm rebuild:browser && pnpm rebuild:client && pnpm rebuild:server"
|
||||
"lint": "eslint . --config eslint.config.ts",
|
||||
"_____build": "echo build",
|
||||
"build:browser": "cd browser && pnpm build",
|
||||
"build:client": "cd client && pnpm build",
|
||||
"build:server": "cd server && pnpm build",
|
||||
"build:rpc": "cd rpc && pnpm build",
|
||||
"build": "pnpm build:browser && pnpm build:client && pnpm build:server && pnpm build:rpc",
|
||||
"_____deps": "echo must be ran before lerna commands",
|
||||
"deps:check": "syncpack list-mismatches",
|
||||
"deps:fix": "syncpack fix-mismatches",
|
||||
"_____publish": "echo publish",
|
||||
"publish:check": "pnpm run deps:check && pnpm run lint",
|
||||
"publish:changeset": "pnpm changeset add",
|
||||
"publish:version": "pnpm changeset version"
|
||||
},
|
||||
"dependencies": {
|
||||
"@microsoft/api-extractor": "^7.47.0",
|
||||
"@changesets/cli": "^2.27.12",
|
||||
"@eslint/js": "^9.19.0",
|
||||
"@microsoft/api-extractor": "^7.49.1",
|
||||
"@ragempcommunity/types-cef": "^2.1.8",
|
||||
"@ragempcommunity/types-client": "^2.1.8",
|
||||
"@ragempcommunity/types-server": "^2.1.8",
|
||||
"@typescript-eslint/eslint-plugin": "^7.13.0",
|
||||
"@typescript-eslint/parser": "^7.13.0",
|
||||
"@types/node": "^22.8.1",
|
||||
"eslint": "^8.56.0",
|
||||
"lerna": "^8.1.3",
|
||||
"prettier": "^3.3.1",
|
||||
"rage-rpc": "^0.4.0",
|
||||
"tsup": "^8.1.0",
|
||||
"typescript": "^5.4.5",
|
||||
"winston": "^3.13.0"
|
||||
"eslint": "^9.19.0",
|
||||
"globals": "^15.14.0",
|
||||
"jiti": "^2.4.2",
|
||||
"prettier": "^3.4.2",
|
||||
"tsup": "^8.3.6",
|
||||
"typescript": "^5.7.3",
|
||||
"typescript-eslint": "^8.22.0",
|
||||
"winston": "^3.17.0"
|
||||
},
|
||||
"type": "module"
|
||||
"engines": {
|
||||
"node": ">=14",
|
||||
"pnpm": ">=10"
|
||||
},
|
||||
"pnpm": {
|
||||
"requiredScripts": []
|
||||
},
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "SEE INDIVIDUALLY FOR EACH PACKAGE",
|
||||
"author": "Entity Seven Group",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Danya H",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik/"
|
||||
},
|
||||
{
|
||||
"name": "Oleksandr Honcharov",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/SashaGoncharov19/"
|
||||
}
|
||||
],
|
||||
"devDependencies": {
|
||||
"syncpack": "^13.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
Generated
+3291
-8538
File diff suppressed because it is too large
Load Diff
+2
-4
@@ -1,5 +1,3 @@
|
||||
packages:
|
||||
- "server"
|
||||
- "client"
|
||||
- "browser"
|
||||
- "shared-types"
|
||||
- "*"
|
||||
- "!cli"
|
||||
Vendored
+1
-18
@@ -1,25 +1,8 @@
|
||||
export {}
|
||||
|
||||
interface Mp {
|
||||
trigger(event: string, data?: any): void
|
||||
events: {
|
||||
add(event: string, data: any): void
|
||||
call(event: string, data: any): void
|
||||
callRemote(event: string, data: any): void
|
||||
remove(event: string): void
|
||||
}
|
||||
joaat?: unknown
|
||||
game: {
|
||||
joaat?: unknown
|
||||
}
|
||||
console: {
|
||||
logInfo: (...args: unknown[]) => void
|
||||
}
|
||||
}
|
||||
declare var global: Record<string, (...args: any[]) => unknown>
|
||||
|
||||
declare global {
|
||||
const mp: Mp
|
||||
const global: Record<string, (...args: any[]) => unknown>
|
||||
interface Window {
|
||||
[p: string]: any
|
||||
}
|
||||
|
||||
+50
-39
@@ -1,42 +1,53 @@
|
||||
{
|
||||
"name": "@entityseven/rage-fw-rpc",
|
||||
"description": "Rage FW RPC",
|
||||
"version": "0.2.5",
|
||||
"scripts": {
|
||||
"build": "tsup",
|
||||
"start": "npx ./dist create"
|
||||
},
|
||||
"files": [
|
||||
"dist/**/*"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@microsoft/api-extractor": "^7.47.9",
|
||||
"prettier": "^3.3.2",
|
||||
"tsup": "^8.3.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "^5"
|
||||
},
|
||||
"keywords": [
|
||||
"ragemp",
|
||||
"rage",
|
||||
"rpc",
|
||||
"rage-rpc",
|
||||
"ragerpc"
|
||||
],
|
||||
"private": false,
|
||||
"name": "@entityseven/rage-fw-rpc",
|
||||
"version": "0.2.5",
|
||||
"main": "src/index.ts",
|
||||
"exports": {
|
||||
".": "./src/index.ts"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/src/index.d.ts",
|
||||
"author": {
|
||||
"name": "rilaxik",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "SashaGoncharov19",
|
||||
"url": "https://github.com/SashaGoncharov19"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"gitHead": "04eb7240735c4a0e4855ebabbe8d5b326819fa76"
|
||||
"types": "dist/index.d.ts",
|
||||
"exports": {
|
||||
".": "./dist/index.js"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsup",
|
||||
"start": "npx ./dist create"
|
||||
},
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"readme.md",
|
||||
"LICENSE"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@types/node": "22.12.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "^5.7.3"
|
||||
},
|
||||
"description": "Rage-FW RPC (Remote procedure caller) for Rage:MP",
|
||||
"keywords": [
|
||||
"ragefw",
|
||||
"rage-fw",
|
||||
"ragemp",
|
||||
"rage",
|
||||
"rpc",
|
||||
"rage-rpc",
|
||||
"ragerpc",
|
||||
"gta5"
|
||||
],
|
||||
"author": "Entity Seven Group",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Danya H",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik/"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"gitHead": "04eb7240735c4a0e4855ebabbe8d5b326819fa76"
|
||||
}
|
||||
|
||||
+3
-3
@@ -3,13 +3,13 @@ is an all-in package with asynchronous RPC implementation for RageMP servers in
|
||||
|
||||
# Installation
|
||||
``` shell
|
||||
npm i rage-fw-rpc
|
||||
npm i @entityseven/rage-fw-rpc
|
||||
```
|
||||
```shell
|
||||
pnpm i rage-fw-rpc
|
||||
pnpm i @entityseven/rage-fw-rpc
|
||||
```
|
||||
```shell
|
||||
yarn add rage-fw-rpc
|
||||
yarn add @entityseven/rage-fw-rpc
|
||||
```
|
||||
|
||||
Import installed package and initialize rpc:
|
||||
|
||||
+3
-1
@@ -1,3 +1,5 @@
|
||||
/// <reference types="@ragempcommunity/types-cef" />
|
||||
|
||||
import { Wrapper } from './wrapper'
|
||||
import {
|
||||
Environment,
|
||||
@@ -24,7 +26,7 @@ export class Browser extends Wrapper {
|
||||
* NOT INTENDED FOR OUT-OF-CONTEXT USE
|
||||
*/
|
||||
public _resolveEmitDestination(dataRaw: string) {
|
||||
let state = Utils.prepareExecution(dataRaw)
|
||||
const state = Utils.prepareExecution(dataRaw)
|
||||
|
||||
switch (state.calledTo) {
|
||||
case Environment.BROWSER:
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
/// <reference types="@ragempcommunity/types-client" />
|
||||
|
||||
import { Wrapper } from './wrapper'
|
||||
import {
|
||||
Environment,
|
||||
|
||||
+440
-99
@@ -77,7 +77,7 @@ class Rpc extends Wrapper {
|
||||
*
|
||||
* @template CallbackArguments - An array of argument types that the callback function accepts
|
||||
* @template CallbackReturn - The type of the value returned by the callback function
|
||||
* @template EventName - A string representing the event name or union of names
|
||||
* @template EventName - A string or union representing the event name
|
||||
*
|
||||
* @param {EventName} eventName - The name of the event to register the callback for
|
||||
* @param {(...args: CallbackArguments) => CallbackReturn} cb - The callback function that is called when the event is triggered
|
||||
@@ -91,7 +91,7 @@ class Rpc extends Wrapper {
|
||||
*/
|
||||
public register<
|
||||
CallbackArguments extends unknown[] = unknown[],
|
||||
CallbackReturn extends unknown = unknown,
|
||||
CallbackReturn = unknown,
|
||||
EventName extends string = string,
|
||||
>(
|
||||
eventName: EventName,
|
||||
@@ -116,7 +116,7 @@ class Rpc extends Wrapper {
|
||||
/**
|
||||
* Unregisters callback function for a specified event
|
||||
*
|
||||
* @template EventName - A string representing the event name or union of names
|
||||
* @template EventName - A string or union representing the event name
|
||||
*
|
||||
* @param {EventName} eventName - The name of the event to register the callback for
|
||||
*
|
||||
@@ -133,88 +133,69 @@ class Rpc extends Wrapper {
|
||||
Utils.errorUnknownEnvironment(this.environment_)
|
||||
|
||||
delete this.state_[eventName]
|
||||
mp.events.remove(eventName)
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls a client-side event from server or browser
|
||||
* Calls a client-side event from browser or server. Use 'call' to call client from client
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the client event
|
||||
* @template EventName - A string representing the client event name or union of names
|
||||
* @template Return - The type of the value returned by the client event
|
||||
* @template EventName - A string or union representing the client event name
|
||||
*
|
||||
* @param {EventName} eventName - The name of the client event to be called
|
||||
* @param {Arguments} [args] - Optional arguments to pass to the client event
|
||||
* @returns {Promise<Return>} A promise resolving to the return value of the client event
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Calls an event on client without specifying a player
|
||||
* callClient<[], string, object>('onDataRequest').then(response => {
|
||||
* console.log(`Received: ${response}`) // ^ object
|
||||
* })
|
||||
* // Calls an event on a client without specifying a player
|
||||
* callClient<[], string, object>('onDataRequest')
|
||||
*/
|
||||
public async callClient<
|
||||
public callClient<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
Return extends unknown = unknown,
|
||||
>(eventName: EventName, args?: Arguments): Promise<Return>
|
||||
>(eventName: EventName, args?: Arguments): void
|
||||
/**
|
||||
* Calls a client-side event from server or browser
|
||||
* Calls a client-side event from server or server. Use 'call' to call client from client
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the client event
|
||||
* @template EventName - A string representing the client event name or union of names
|
||||
* @template Return - The type of the value returned by the client event
|
||||
* @template EventName - A string or union representing the client event name
|
||||
*
|
||||
* @param {PlayerMp} player - The player for whom the client event is called
|
||||
* @param {EventName} eventName - The name of the client event to be called
|
||||
* @param {Arguments} [args] - Optional arguments to pass to the client event
|
||||
* @returns {Promise<Return>} A promise resolving to the return value of the client event
|
||||
* @returns {void} A promise resolving to the return value of the client event
|
||||
*
|
||||
* @example
|
||||
* // Calls an event on client for a specific player
|
||||
* callClient<[string, number], string, boolean>(player, 'onPlayerAction', ['jump', 2]).then(result => {
|
||||
* console.log(`Action success: ${result}`) // ^ boolean
|
||||
* })
|
||||
* // Calls an event on a client for a specific player
|
||||
* callClient<[string, number], string, boolean>(player, 'onPlayerAction', ['jump', 2])
|
||||
*/
|
||||
public async callClient<
|
||||
public callClient<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
Return extends unknown = unknown,
|
||||
>(player: PlayerMp, eventName: EventName, args?: Arguments): Promise<Return>
|
||||
public async callClient(
|
||||
>(player: PlayerMp, eventName: EventName, args?: Arguments): void
|
||||
public callClient(
|
||||
playerOrEventName: PlayerMp | string,
|
||||
eventNameOrArgs?: string | unknown[],
|
||||
args?: unknown[],
|
||||
) {
|
||||
_is1StParamPlayer(playerOrEventName)
|
||||
? this.log(
|
||||
'callClient',
|
||||
eventNameOrArgs as string,
|
||||
playerOrEventName,
|
||||
eventNameOrArgs,
|
||||
args,
|
||||
)
|
||||
: this.log(
|
||||
'callClient',
|
||||
playerOrEventName as string,
|
||||
eventNameOrArgs,
|
||||
)
|
||||
if (_is1StParamPlayer(playerOrEventName)) {
|
||||
this.log(
|
||||
'callClient',
|
||||
eventNameOrArgs as string,
|
||||
playerOrEventName,
|
||||
eventNameOrArgs,
|
||||
args,
|
||||
)
|
||||
} else {
|
||||
this.log('callClient', playerOrEventName as string, eventNameOrArgs)
|
||||
}
|
||||
|
||||
if (this.forceBrowserDevMode_) return
|
||||
Utils.errorUnknownEnvironment(this.environment_)
|
||||
|
||||
function _is1StParamPlayer(x: unknown): x is PlayerMp {
|
||||
return typeof x === 'object'
|
||||
}
|
||||
|
||||
function _is2NdParamEventName(x: unknown): x is string {
|
||||
return typeof x === 'string'
|
||||
}
|
||||
|
||||
if (this.environment_ === Environment.CLIENT) {
|
||||
// client
|
||||
return await this.call(
|
||||
playerOrEventName as string,
|
||||
args as unknown[],
|
||||
)
|
||||
this.call(playerOrEventName as string, args as unknown[])
|
||||
}
|
||||
|
||||
// server
|
||||
@@ -236,7 +217,6 @@ class Rpc extends Wrapper {
|
||||
const dataRaw = Utils.prepareTransfer(state)
|
||||
|
||||
playerOrEventName.call(Events.LOCAL_EVENT_LISTENER, [dataRaw])
|
||||
return (await this.responseHandler(state.uuid)).data
|
||||
}
|
||||
|
||||
// browser
|
||||
@@ -258,15 +238,213 @@ class Rpc extends Wrapper {
|
||||
const dataRaw = Utils.prepareTransfer(state)
|
||||
|
||||
mp.trigger(Events.LOCAL_EVENT_LISTENER, dataRaw)
|
||||
return (await this.responseHandler(state.uuid)).data
|
||||
}
|
||||
|
||||
function _is1StParamPlayer(x: unknown): x is PlayerMp {
|
||||
return typeof x === 'object'
|
||||
}
|
||||
|
||||
function _is2NdParamEventName(x: unknown): x is string {
|
||||
return typeof x === 'string'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls a server-side event from browser or client
|
||||
* Calls an asynchronous client-side event from server or browser, expecting a response. Use 'callAsync' to call client from client
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the client event
|
||||
* @template EventName - A string or union representing the client event name
|
||||
* @template Return - The type of the value returned by the client event
|
||||
*
|
||||
* @param {EventName} eventName - The name of the client event to be called
|
||||
* @param {Arguments} [args] - Optional arguments to pass to the client event
|
||||
* @returns {Promise<Return>} A promise resolving to the return value of the client event
|
||||
*
|
||||
* @example
|
||||
* // Calls an event on a client without specifying a player
|
||||
* callClient<[], string, object>('onDataRequest').then(response => {
|
||||
* console.log(`Received: ${response}`) // ^ object
|
||||
* })
|
||||
*/
|
||||
public async callClientAsync<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
Return = unknown,
|
||||
>(eventName: EventName, args?: Arguments): Promise<Return>
|
||||
/**
|
||||
* Calls an asynchronous client-side event from server or browser, expecting a response. Use 'callAsync' to call client from client
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the client event
|
||||
* @template EventName - A string or union representing the client event name
|
||||
* @template Return - The type of the value returned by the client event
|
||||
*
|
||||
* @param {PlayerMp} player - The player for whom the client event is called
|
||||
* @param {EventName} eventName - The name of the client event to be called
|
||||
* @param {Arguments} [args] - Optional arguments to pass to the client event
|
||||
* @returns {Promise<Return>} A promise resolving to the return value of the client event
|
||||
*
|
||||
* @example
|
||||
* // Calls an event on a client for a specific player
|
||||
* callClient<[string, number], string, boolean>(player, 'onPlayerAction', ['jump', 2]).then(result => {
|
||||
* console.log(`Action success: ${result}`) // ^ boolean
|
||||
* })
|
||||
*/
|
||||
public async callClientAsync<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
Return = unknown,
|
||||
>(player: PlayerMp, eventName: EventName, args?: Arguments): Promise<Return>
|
||||
public async callClientAsync(
|
||||
playerOrEventName: PlayerMp | string,
|
||||
eventNameOrArgs?: string | unknown[],
|
||||
args?: unknown[],
|
||||
) {
|
||||
if (_is1StParamPlayer(playerOrEventName)) {
|
||||
this.log(
|
||||
'callClientAsync',
|
||||
eventNameOrArgs as string,
|
||||
playerOrEventName,
|
||||
eventNameOrArgs,
|
||||
args,
|
||||
)
|
||||
} else {
|
||||
this.log(
|
||||
'callClientAsync',
|
||||
playerOrEventName as string,
|
||||
eventNameOrArgs,
|
||||
)
|
||||
}
|
||||
|
||||
if (this.forceBrowserDevMode_) return
|
||||
Utils.errorUnknownEnvironment(this.environment_)
|
||||
|
||||
if (this.environment_ === Environment.CLIENT) {
|
||||
// client
|
||||
return await this.callAsync(
|
||||
playerOrEventName as string,
|
||||
args as unknown[],
|
||||
)
|
||||
}
|
||||
|
||||
// server
|
||||
if (
|
||||
this.environment_ === Environment.SERVER &&
|
||||
_is1StParamPlayer(playerOrEventName) &&
|
||||
_is2NdParamEventName(eventNameOrArgs)
|
||||
) {
|
||||
let state: RPCState = {
|
||||
uuid: Utils.generateUUID(),
|
||||
eventName: eventNameOrArgs,
|
||||
calledTo: Environment.CLIENT,
|
||||
calledFrom: this.environment_,
|
||||
knownError: undefined,
|
||||
data: args as unknown[],
|
||||
type: RPCEventType.EVENT,
|
||||
}
|
||||
|
||||
const dataRaw = Utils.prepareTransfer(state)
|
||||
|
||||
playerOrEventName.call(Events.LOCAL_EVENT_LISTENER, [dataRaw])
|
||||
|
||||
return await this.responseHandler(state.uuid)
|
||||
.then(r => r.data)
|
||||
.catch((e: string) => {
|
||||
state.knownError = e
|
||||
return this.triggerError_(state)
|
||||
})
|
||||
}
|
||||
|
||||
// browser
|
||||
if (
|
||||
this.environment_ === Environment.BROWSER &&
|
||||
!_is1StParamPlayer(playerOrEventName) &&
|
||||
!_is2NdParamEventName(eventNameOrArgs)
|
||||
) {
|
||||
const state: RPCState = {
|
||||
uuid: Utils.generateUUID(),
|
||||
eventName: playerOrEventName,
|
||||
calledTo: Environment.CLIENT,
|
||||
calledFrom: this.environment_,
|
||||
knownError: undefined,
|
||||
data: eventNameOrArgs,
|
||||
type: RPCEventType.EVENT,
|
||||
}
|
||||
|
||||
const dataRaw = Utils.prepareTransfer(state)
|
||||
|
||||
mp.trigger(Events.LOCAL_EVENT_LISTENER, dataRaw)
|
||||
|
||||
return await this.responseHandler(state.uuid)
|
||||
.then(r => r.data)
|
||||
.catch((e: string) => {
|
||||
state.knownError = e
|
||||
return this.triggerError_(state)
|
||||
})
|
||||
}
|
||||
|
||||
function _is1StParamPlayer(x: unknown): x is PlayerMp {
|
||||
return typeof x === 'object'
|
||||
}
|
||||
|
||||
function _is2NdParamEventName(x: unknown): x is string {
|
||||
return typeof x === 'string'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls a server-side event from browser or client. Use 'call' to call server from server
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the server event
|
||||
* @template EventName - A string representing the server event name or union of names
|
||||
* @template EventName - A string or union representing the server event name
|
||||
*
|
||||
* @param {EventName} eventName - The name of the server event to be called
|
||||
* @param {Arguments} [args] - Optional arguments to pass to the server event
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Calls an event on a server
|
||||
* callServer<[], string, object>('onDataRequest')
|
||||
*/
|
||||
public callServer<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
>(eventName: EventName, args?: Arguments): void {
|
||||
this.log('callServer', eventName, args)
|
||||
if (this.forceBrowserDevMode_) return
|
||||
Utils.errorUnknownEnvironment(this.environment_)
|
||||
|
||||
const state: RPCState = {
|
||||
uuid: Utils.generateUUID(),
|
||||
eventName,
|
||||
calledTo: Environment.SERVER,
|
||||
calledFrom: this.environment_,
|
||||
knownError: undefined,
|
||||
data: args,
|
||||
type: RPCEventType.EVENT,
|
||||
}
|
||||
|
||||
const dataRaw = Utils.prepareTransfer(state)
|
||||
|
||||
switch (this.environment_) {
|
||||
case Environment.SERVER:
|
||||
this.callSelf(state)
|
||||
break
|
||||
|
||||
case Environment.CLIENT:
|
||||
mp.events.callRemote(Events.LOCAL_EVENT_LISTENER, dataRaw)
|
||||
break
|
||||
|
||||
case Environment.BROWSER:
|
||||
mp.trigger(Events.LOCAL_EVENT_LISTENER, dataRaw)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls an asynchronous server-side event from browser or client, expecting a response. Use 'callAsync' to call server from server
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the server event
|
||||
* @template EventName - A string or union representing the server event name
|
||||
* @template Return - The type of the value returned by the server event
|
||||
*
|
||||
* @param {EventName} eventName - The name of the server event to be called
|
||||
@@ -274,17 +452,17 @@ class Rpc extends Wrapper {
|
||||
* @returns {Promise<Return>} A promise resolving to the return value of the server event
|
||||
*
|
||||
* @example
|
||||
* // Calls an event on server
|
||||
* // Calls an event on a server
|
||||
* callServer<[], string, object>('onDataRequest').then(response => {
|
||||
* console.log(`Received: ${response}`) // ^ object
|
||||
* })
|
||||
*/
|
||||
public async callServer<
|
||||
public async callServerAsync<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
Return extends unknown = unknown,
|
||||
Return = unknown,
|
||||
>(eventName: EventName, args?: Arguments): Promise<Return> {
|
||||
this.log('callServer', eventName, args)
|
||||
this.log('callServerAsync', eventName, args)
|
||||
if (this.forceBrowserDevMode_)
|
||||
return undefined as unknown as Promise<Return>
|
||||
Utils.errorUnknownEnvironment(this.environment_)
|
||||
@@ -303,7 +481,7 @@ class Rpc extends Wrapper {
|
||||
|
||||
switch (this.environment_) {
|
||||
case Environment.SERVER:
|
||||
return this.callSelf(state)
|
||||
return this.callSelfAsync(state)
|
||||
|
||||
case Environment.CLIENT:
|
||||
mp.events.callRemote(Events.LOCAL_EVENT_LISTENER, dataRaw)
|
||||
@@ -314,14 +492,122 @@ class Rpc extends Wrapper {
|
||||
break
|
||||
}
|
||||
|
||||
return (await this.responseHandler(state.uuid)).data
|
||||
return await this.responseHandler(state.uuid)
|
||||
.then(r => r.data)
|
||||
.catch((e: string) => {
|
||||
state.knownError = e
|
||||
return this.triggerError_(state)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls a browser-side event from server or client
|
||||
* Calls a browser-side event from client or server. Use 'call' to call browser from browser
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the browser event
|
||||
* @template EventName - A string or union representing the browser event name
|
||||
*
|
||||
* @param {EventName} eventName - The name of the browser event to be called
|
||||
* @param {Arguments} [args] - Optional arguments to pass to the browser event
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Calls an event on a browser without specifying a player
|
||||
* callBrowser<[], string, object>('onDataRequest')
|
||||
*/
|
||||
public callBrowser<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
>(eventName: EventName, args?: Arguments): void
|
||||
/**
|
||||
* Calls a browser-side event from client or server. Use 'call' to call browser from browser
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the browser event
|
||||
* @template EventName - A string representing the browser event name or union of names
|
||||
*
|
||||
* @param {PlayerMp} player - The player for whom the browser event is called
|
||||
* @param {EventName} eventName - The name of the browser event to be called
|
||||
* @param {Arguments} [args] - Optional arguments to pass to the browser event
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Calls an event on a browser for a specific player
|
||||
* callBrowser<[string, number], string, boolean>(player, 'onPlayerAction', ['jump', 2])
|
||||
*/
|
||||
public callBrowser<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
>(player: PlayerMp, eventName: EventName, args?: Arguments): void
|
||||
public callBrowser(
|
||||
playerOrEventName: PlayerMp | string,
|
||||
eventNameOrArgs?: string | unknown[],
|
||||
args?: unknown[],
|
||||
) {
|
||||
if (_is1StParamPlayer(playerOrEventName)) {
|
||||
this.log(
|
||||
'callBrowser',
|
||||
eventNameOrArgs as string,
|
||||
playerOrEventName,
|
||||
eventNameOrArgs,
|
||||
args,
|
||||
)
|
||||
} else {
|
||||
this.log(
|
||||
'callBrowser',
|
||||
playerOrEventName as string,
|
||||
eventNameOrArgs,
|
||||
)
|
||||
}
|
||||
|
||||
if (this.forceBrowserDevMode_) return
|
||||
Utils.errorUnknownEnvironment(this.environment_)
|
||||
|
||||
const state: RPCState = {
|
||||
uuid: Utils.generateUUID(),
|
||||
eventName: !_is1StParamPlayer(playerOrEventName)
|
||||
? playerOrEventName
|
||||
: _is2NdParamEventName(eventNameOrArgs)
|
||||
? eventNameOrArgs
|
||||
: '',
|
||||
calledTo: Environment.BROWSER,
|
||||
calledFrom: this.environment_,
|
||||
knownError: undefined,
|
||||
data: _is1StParamPlayer(playerOrEventName) ? args : eventNameOrArgs,
|
||||
type: RPCEventType.EVENT,
|
||||
}
|
||||
|
||||
const dataRaw = Utils.prepareTransfer(state)
|
||||
|
||||
switch (this.environment_) {
|
||||
case Environment.BROWSER:
|
||||
this.callSelf(state)
|
||||
break
|
||||
|
||||
case Environment.CLIENT:
|
||||
mp.events.callRemote(Events.LOCAL_EVENT_LISTENER, dataRaw)
|
||||
break
|
||||
|
||||
case Environment.SERVER:
|
||||
;(playerOrEventName as PlayerMp).call(
|
||||
Events.LOCAL_EVENT_LISTENER,
|
||||
[dataRaw],
|
||||
)
|
||||
break
|
||||
}
|
||||
|
||||
function _is1StParamPlayer(x: unknown): x is PlayerMp {
|
||||
return typeof x === 'object'
|
||||
}
|
||||
|
||||
function _is2NdParamEventName(x: unknown): x is string {
|
||||
return typeof x === 'string'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls an asynchronous browser-side event from client or server, expecting response. Use 'callAsync' to call browser from browser
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the browser event
|
||||
* @template EventName - A string or union representing the browser event name
|
||||
* @template Return - The type of the value returned by the browser event
|
||||
*
|
||||
* @param {EventName} eventName - The name of the browser event to be called
|
||||
@@ -329,18 +615,18 @@ class Rpc extends Wrapper {
|
||||
* @returns {Promise<Return>} A promise resolving to the return value of the browser event
|
||||
*
|
||||
* @example
|
||||
* // Calls an event on browser without specifying a player
|
||||
* // Calls an event on a browser without specifying a player
|
||||
* callBrowser<[], string, object>('onDataRequest').then(response => {
|
||||
* console.log(`Received: ${response}`) // ^ object
|
||||
* })
|
||||
*/
|
||||
public async callBrowser<
|
||||
public async callBrowserAsync<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
Return extends unknown = unknown,
|
||||
Return = unknown,
|
||||
>(eventName: EventName, args?: Arguments): Promise<Return>
|
||||
/**
|
||||
* Calls a browser-side event from server or client
|
||||
* Calls an asynchronous browser-side event from client or server, expecting response. Use 'callAsync' to call browser from browser
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the browser event
|
||||
* @template EventName - A string representing the browser event name or union of names
|
||||
@@ -352,45 +638,40 @@ class Rpc extends Wrapper {
|
||||
* @returns {Promise<Return>} A promise resolving to the return value of the browser event
|
||||
*
|
||||
* @example
|
||||
* // Calls an event on a browser for a specific player
|
||||
* // Calls an asynchronous event on a browser for a specific player
|
||||
* callBrowser<[string, number], string, boolean>(player, 'onPlayerAction', ['jump', 2]).then(result => {
|
||||
* console.log(`Action success: ${result}`) // ^ boolean
|
||||
* })
|
||||
*/
|
||||
public async callBrowser<
|
||||
public async callBrowserAsync<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
Return extends unknown = unknown,
|
||||
Return = unknown,
|
||||
>(player: PlayerMp, eventName: EventName, args?: Arguments): Promise<Return>
|
||||
public async callBrowser(
|
||||
public async callBrowserAsync(
|
||||
playerOrEventName: PlayerMp | string,
|
||||
eventNameOrArgs?: string | unknown[],
|
||||
args?: unknown[],
|
||||
) {
|
||||
_is1StParamPlayer(playerOrEventName)
|
||||
? this.log(
|
||||
'DEV callClient',
|
||||
eventNameOrArgs as string,
|
||||
playerOrEventName,
|
||||
eventNameOrArgs,
|
||||
args,
|
||||
)
|
||||
: this.log(
|
||||
'DEV callClient',
|
||||
playerOrEventName as string,
|
||||
eventNameOrArgs,
|
||||
)
|
||||
if (_is1StParamPlayer(playerOrEventName)) {
|
||||
this.log(
|
||||
'callBrowserAsync',
|
||||
eventNameOrArgs as string,
|
||||
playerOrEventName,
|
||||
eventNameOrArgs,
|
||||
args,
|
||||
)
|
||||
} else {
|
||||
this.log(
|
||||
'callBrowserAsync',
|
||||
playerOrEventName as string,
|
||||
eventNameOrArgs,
|
||||
)
|
||||
}
|
||||
|
||||
if (this.forceBrowserDevMode_) return
|
||||
Utils.errorUnknownEnvironment(this.environment_)
|
||||
|
||||
function _is1StParamPlayer(x: unknown): x is PlayerMp {
|
||||
return typeof x === 'object'
|
||||
}
|
||||
|
||||
function _is2NdParamEventName(x: unknown): x is string {
|
||||
return typeof x === 'string'
|
||||
}
|
||||
|
||||
const state: RPCState = {
|
||||
uuid: Utils.generateUUID(),
|
||||
eventName: !_is1StParamPlayer(playerOrEventName)
|
||||
@@ -423,14 +704,62 @@ class Rpc extends Wrapper {
|
||||
break
|
||||
}
|
||||
|
||||
return (await this.responseHandler(state.uuid)).data
|
||||
return await this.responseHandler(state.uuid)
|
||||
.then(r => r.data)
|
||||
.catch((e: string) => {
|
||||
state.knownError = e
|
||||
return this.triggerError_(state)
|
||||
})
|
||||
|
||||
function _is1StParamPlayer(x: unknown): x is PlayerMp {
|
||||
return typeof x === 'object'
|
||||
}
|
||||
|
||||
function _is2NdParamEventName(x: unknown): x is string {
|
||||
return typeof x === 'string'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls an event in current environment
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the event
|
||||
* @template EventName - A string representing the event name or union of names
|
||||
* @template EventName - A string or union representing the event name
|
||||
*
|
||||
* @param {EventName} eventName - The name of the event to be called
|
||||
* @param {Arguments} [args] - Optional arguments to pass to the event
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Calls an event in current environment
|
||||
* call<[], string>('getSomething')
|
||||
*/
|
||||
public call<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
>(eventName: EventName, args?: Arguments): void {
|
||||
this.log('call', eventName, args)
|
||||
if (this.forceBrowserDevMode_) return
|
||||
Utils.errorUnknownEnvironment(this.environment_)
|
||||
|
||||
const state: RPCState = {
|
||||
uuid: Utils.generateUUID(),
|
||||
eventName,
|
||||
calledTo: this.environment_,
|
||||
calledFrom: this.environment_,
|
||||
knownError: undefined,
|
||||
data: args,
|
||||
type: RPCEventType.EVENT,
|
||||
}
|
||||
|
||||
this.callSelf(state)
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls an asynchronous event in current environment, expecting a response
|
||||
*
|
||||
* @template Arguments - An array of argument types to be passed to the event
|
||||
* @template EventName - A string or union representing the event name
|
||||
* @template Return - The type of the value returned by the event
|
||||
*
|
||||
* @param {EventName} eventName - The name of the event to be called
|
||||
@@ -443,17 +772,17 @@ class Rpc extends Wrapper {
|
||||
* console.log(`Received: ${response}`) // ^ number
|
||||
* })
|
||||
*/
|
||||
public async call<
|
||||
public async callAsync<
|
||||
Arguments extends unknown[] = unknown[],
|
||||
EventName extends string = string,
|
||||
Return extends unknown = unknown,
|
||||
Return = unknown,
|
||||
>(eventName: EventName, args?: Arguments): Promise<Return> {
|
||||
this.log('call', eventName, args)
|
||||
this.log('callAsync', eventName, args)
|
||||
if (this.forceBrowserDevMode_)
|
||||
return undefined as unknown as Promise<Return>
|
||||
Utils.errorUnknownEnvironment(this.environment_)
|
||||
|
||||
let state: RPCState = {
|
||||
const state: RPCState = {
|
||||
uuid: Utils.generateUUID(),
|
||||
eventName,
|
||||
calledTo: this.environment_,
|
||||
@@ -463,13 +792,25 @@ class Rpc extends Wrapper {
|
||||
type: RPCEventType.EVENT,
|
||||
}
|
||||
|
||||
return await this.callSelf<Return>(state)
|
||||
return await this.callSelfAsync<Return>(state)
|
||||
}
|
||||
|
||||
/**
|
||||
* redirects an event in cases of it calling its own environment
|
||||
*/
|
||||
private async callSelf<Return extends unknown = unknown>(
|
||||
private callSelf(state: RPCState): void {
|
||||
state = this.verifyEvent_(state)
|
||||
if (state.knownError) {
|
||||
this.triggerError_(state, state.knownError)
|
||||
}
|
||||
|
||||
this.state_[state.eventName](...state.data)
|
||||
}
|
||||
|
||||
/**
|
||||
* redirects an asynchronous event in cases of it calling its own environment
|
||||
*/
|
||||
private async callSelfAsync<Return = unknown>(
|
||||
state: RPCState,
|
||||
): Promise<Return> {
|
||||
state = this.verifyEvent_(state)
|
||||
|
||||
+5
-3
@@ -1,8 +1,10 @@
|
||||
/// <reference types="@ragempcommunity/types-server" />
|
||||
|
||||
import { Wrapper } from './wrapper'
|
||||
import {
|
||||
type PlayerMp,
|
||||
Environment,
|
||||
Events,
|
||||
type PlayerMp,
|
||||
RPCEventType,
|
||||
RPCState,
|
||||
RpcWrapperConfig,
|
||||
@@ -20,7 +22,7 @@ export class Server extends Wrapper {
|
||||
) {
|
||||
super(options)
|
||||
|
||||
if (!!options.forceBrowserDevMode) return
|
||||
if (options.forceBrowserDevMode) return
|
||||
|
||||
// specific event to save player in context as it is not available on server -> server calls
|
||||
mp.events.add(
|
||||
@@ -35,7 +37,7 @@ export class Server extends Wrapper {
|
||||
* NOT INTENDED FOR OUT-OF-CONTEXT USE
|
||||
*/
|
||||
public _resolveEmitDestination(player: PlayerMp, dataRaw: string) {
|
||||
let state = Utils.prepareExecution(dataRaw)
|
||||
const state = Utils.prepareExecution(dataRaw)
|
||||
|
||||
switch (state.calledTo) {
|
||||
case Environment.SERVER:
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ export class Wrapper {
|
||||
|
||||
// checks if event is available (registered) in current environment
|
||||
protected verifyEvent_(data: string | RPCState): RPCState {
|
||||
let rpcData =
|
||||
const rpcData =
|
||||
typeof data === 'string' ? Utils.prepareExecution(data) : data
|
||||
|
||||
if (!this.state_[rpcData.eventName]) {
|
||||
|
||||
+5
-16
@@ -1,29 +1,18 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/tsconfig",
|
||||
"display": "RPC",
|
||||
"compilerOptions": {
|
||||
"target": "es6",
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"lib": [
|
||||
"ES6",
|
||||
"es2022",
|
||||
"dom"
|
||||
],
|
||||
"declaration": true,
|
||||
"declarationMap": true,
|
||||
"sourceMap": true,
|
||||
|
||||
"outDir": "bin",
|
||||
"esModuleInterop": true,
|
||||
|
||||
"strict": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noImplicitAny": true,
|
||||
},
|
||||
"include": [
|
||||
"src/**/*",
|
||||
"./index.d.ts"
|
||||
"src"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"dist"
|
||||
]
|
||||
"extends": ["../tsconfig.ragefw.json"]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
Custom Attribution-NoDerives Software License
|
||||
|
||||
Copyright (c) 2024 Entity Seven Group
|
||||
|
||||
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.
|
||||
+59
-28
@@ -1,32 +1,63 @@
|
||||
{
|
||||
"name": "@entityseven/rage-fw-server",
|
||||
"version": "0.2.1-0.2.0-alpha.1.0",
|
||||
"private": false,
|
||||
"name": "@entityseven/rage-fw-server",
|
||||
"version": "0.2.0",
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"readme.md",
|
||||
"LICENSE",
|
||||
"package.json"
|
||||
],
|
||||
"main": "src/index.ts",
|
||||
"exports": {
|
||||
".": "./src/index.ts"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/src/index.d.ts",
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"readme.md"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsup"
|
||||
"types": "dist/index.d.ts",
|
||||
"exports": {
|
||||
".": "./dist/index.js"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsup"
|
||||
},
|
||||
"dependencies": {
|
||||
"@entityseven/rage-fw-rpc": "workspace:*",
|
||||
"zod": "^3.24.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "22.12.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@entityseven/rage-fw-shared-types": "workspace:*",
|
||||
"@ragempcommunity/types-server": "^2.1.8",
|
||||
"typescript": "^5.7.3"
|
||||
},
|
||||
"description": "Package used on a server-side of your Rage:MP Server",
|
||||
"keywords": [
|
||||
"rage-fw-server",
|
||||
"ragefw",
|
||||
"rage-fw",
|
||||
"ragemp",
|
||||
"rage:mp",
|
||||
"rage",
|
||||
"gta5"
|
||||
],
|
||||
"author": "Entity Seven Group",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Danya H",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik/"
|
||||
},
|
||||
"dependencies": {
|
||||
"@entityseven/rage-fw-rpc": "latest"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@entityseven/rage-fw-shared-types": "workspace:^",
|
||||
"@ragempcommunity/types-server": "^2.1.8"
|
||||
},
|
||||
"description": "RageFW Server side",
|
||||
"keywords": [],
|
||||
"author": "SashaGoncharov19",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "rilaxik",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"gitHead": "053e4fd12aa120d53e11e0d2009c0df78c1a2ad0"
|
||||
{
|
||||
"name": "Oleksandr Honcharov",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/SashaGoncharov19/"
|
||||
}
|
||||
],
|
||||
"license": "Custom-Attribution-NoDerivs",
|
||||
"gitHead": "ffd542c1deddb3033e16e0dae7557313ae09b05f"
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,2 +1,2 @@
|
||||
# RageFW Server
|
||||
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki/Docs)
|
||||
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki)
|
||||
@@ -3,9 +3,9 @@ import winston, { format } from 'winston'
|
||||
const { timestamp, printf, colorize } = format
|
||||
|
||||
/** Used to log in a server console */
|
||||
export class Logger {
|
||||
private format = printf(({ message, level, timestamp }) => {
|
||||
return `[${new Date(timestamp).toLocaleTimeString()}] [${level}]: ${message}`
|
||||
export class FW_Logger {
|
||||
private format = printf(({ message, level }) => {
|
||||
return `[${new Date().toLocaleTimeString(undefined, { hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 2 })}] [${level}]: ${message}`
|
||||
})
|
||||
|
||||
private systemLogger = winston.createLogger({
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import type * as T from '../types'
|
||||
|
||||
export class Middleware {
|
||||
export class FW_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> {
|
||||
private static async execute<EventName extends T.FW_ServerEvent>(
|
||||
middlewares: T.FW_MiddlewareFunction<EventName>[],
|
||||
args: T.FW_ServerArgs<EventName>,
|
||||
): Promise<T.FW_MiddlewareResponseInternal> {
|
||||
for (let i = 0; i < middlewares.length; i++) {
|
||||
const result = await middlewares[i](...args)
|
||||
|
||||
@@ -21,20 +21,20 @@ export class Middleware {
|
||||
}
|
||||
}
|
||||
|
||||
public static async process<EventName extends T.RageFW_ServerEvent>(
|
||||
middlewareOptions: T.RageFW_MiddlewareOptions<EventName>,
|
||||
callback: T.RageFW_ServerCallback<EventName>,
|
||||
args: T.RageFW_ServerArgs<EventName>,
|
||||
public static async process<EventName extends T.FW_ServerEvent>(
|
||||
middlewareOptions: T.FW_MiddlewareOptions<EventName>,
|
||||
callback: T.FW_ServerCallback<EventName>,
|
||||
args: T.FW_ServerArgs<EventName>,
|
||||
) {
|
||||
if (Array.isArray(middlewareOptions)) {
|
||||
const middlewaresResponse = await Middleware.execute(
|
||||
const middlewaresResponse = await FW_Middleware.execute(
|
||||
middlewareOptions,
|
||||
args,
|
||||
)
|
||||
|
||||
if (middlewaresResponse.success) return await callback(...args)
|
||||
} else {
|
||||
const middlewaresResponse = await Middleware.execute(
|
||||
const middlewaresResponse = await FW_Middleware.execute(
|
||||
middlewareOptions.executables,
|
||||
args,
|
||||
)
|
||||
|
||||
+80
-15
@@ -2,15 +2,45 @@ import { rpc } from './rpc'
|
||||
import type * as T from '../types'
|
||||
|
||||
/** Handles event manipulations that require player to be present in context */
|
||||
export class Player {
|
||||
export class FW_Player {
|
||||
/**
|
||||
* Triggers a client event from the server with arguments from shared types
|
||||
* Triggers a client event from the server with arguments from 'rage-fw-shared-types'
|
||||
*
|
||||
* Formerly known as ``callClient`` or ``emitClient``
|
||||
*
|
||||
* @param {PlayerMp} player - Player object as an event target
|
||||
* @param eventName - The name of the client event to trigger
|
||||
* @param [args] - Arguments for the client event, if present
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Triggering a client event without arguments
|
||||
* fw.player.triggerClient("clientEventName")
|
||||
*
|
||||
* @example
|
||||
* // Triggering a client event with arguments
|
||||
* fw.player.triggerClient("clientEventName", ["message to client"])
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public triggerClient<EventName extends T.FW_ClientEvent>(
|
||||
player: PlayerMp,
|
||||
eventName: EventName,
|
||||
...args: T._ClientEventHasArgs<EventName> extends true
|
||||
? [T.FW_ClientArgs<EventName>]
|
||||
: []
|
||||
): void {
|
||||
rpc.callClient<typeof args, EventName>(player, eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers an asynchronous client event from the server with arguments from 'rage-fw-shared-types', and expects to receive a response from an event
|
||||
*
|
||||
* Formerly known as ``callClientAsync`` or ``emitClientAsync``
|
||||
*
|
||||
* @param {PlayerMp} player - Player object as an event target
|
||||
* @param eventName - The name of the client event to trigger
|
||||
* @param [args] - Arguments for the client event, if present
|
||||
* @returns {Promise} resolving to the client's response for the event
|
||||
*
|
||||
* @example
|
||||
@@ -23,25 +53,29 @@ export class Player {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public async triggerClient<EventName extends T.RageFW_ClientEvent>(
|
||||
public async triggerClientAsync<EventName extends T.FW_ClientEvent>(
|
||||
player: PlayerMp,
|
||||
eventName: EventName,
|
||||
...args: T._ClientEventHasArgs<EventName> extends true
|
||||
? [T.RageFW_ClientArgs<EventName>]
|
||||
? [T.FW_ClientArgs<EventName>]
|
||||
: []
|
||||
): Promise<T.RageFW_ClientReturn<EventName>> {
|
||||
return await rpc.callClient(player, eventName, args)
|
||||
): Promise<T.FW_ClientReturn<EventName>> {
|
||||
return await rpc.callClientAsync<
|
||||
typeof args,
|
||||
EventName,
|
||||
T.FW_ClientReturn<EventName>
|
||||
>(player, eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers a browser event from the server with arguments from shared types
|
||||
* Triggers a browser event from the server with arguments from 'rage-fw-shared-types'
|
||||
*
|
||||
* Formerly known as ``callBrowser`` or ``emitBrowser``
|
||||
*
|
||||
* @param {PlayerMp} player - Player object as an event target
|
||||
* @param eventName - The name of the browser event to trigger
|
||||
* @param [args] - Arguments for the browser event, if present
|
||||
* @returns {Promise} resolving to the browser's response for the event
|
||||
* @returns {void}
|
||||
*
|
||||
* @example
|
||||
* // Triggering a browser event without arguments
|
||||
@@ -53,16 +87,47 @@ export class Player {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public async triggerBrowser<EventName extends T.RageFW_BrowserEvent>(
|
||||
public triggerBrowser<EventName extends T.FW_BrowserEvent>(
|
||||
player: PlayerMp,
|
||||
eventName: EventName,
|
||||
...args: T._BrowserEventHasArgs<EventName> extends true
|
||||
? [T.RageFW_BrowserArgs<EventName>]
|
||||
? [T.FW_BrowserArgs<EventName>]
|
||||
: []
|
||||
): Promise<T.RageFW_BrowserReturn<EventName>> {
|
||||
return await rpc.callBrowser(player, eventName, args)
|
||||
): void {
|
||||
rpc.callBrowser<typeof args, EventName>(player, eventName, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers an asynchronous browser event from the server with arguments from 'rage-fw-shared-types', and expects to receive a response from an event
|
||||
*
|
||||
* Formerly known as ``callBrowserAsync`` or ``emitBrowserAsync``
|
||||
*
|
||||
* @param {PlayerMp} player - Player object as an event target
|
||||
* @param eventName - The name of the browser event to trigger
|
||||
* @param [args] - Arguments for the browser event, if present
|
||||
* @returns {Promise} resolving to the browser's response for the event
|
||||
*
|
||||
* @example
|
||||
* // Triggering a browser event without arguments
|
||||
* fw.player.triggerBrowserAsync("browserEventName")
|
||||
*
|
||||
* @example
|
||||
* // Triggering a browser event with arguments
|
||||
* fw.player.triggerBrowserAsync("browserEventName", ["message to browser"])
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public async triggerBrowserAsync<EventName extends T.FW_BrowserEvent>(
|
||||
player: PlayerMp,
|
||||
eventName: EventName,
|
||||
...args: T._BrowserEventHasArgs<EventName> extends true
|
||||
? [T.FW_BrowserArgs<EventName>]
|
||||
: []
|
||||
): Promise<T.FW_BrowserReturn<EventName>> {
|
||||
return await rpc.callBrowserAsync<
|
||||
typeof args,
|
||||
EventName,
|
||||
T.FW_BrowserReturn<EventName>
|
||||
>(player, eventName, args)
|
||||
}
|
||||
}
|
||||
|
||||
// new Player().triggerBrowser({} as PlayerMp, 'customCefEvent', ['', 1])
|
||||
// new Player().triggerClient({} as PlayerMp, 'customClientEvent', ['', 1])
|
||||
|
||||
+14
-18
@@ -1,9 +1,9 @@
|
||||
import { rpc } from './rpc'
|
||||
import { Middleware } from './middleware'
|
||||
import { FW_Middleware } from './middleware'
|
||||
import type * as T from '../types'
|
||||
|
||||
/** Server-side interactions */
|
||||
export class Server {
|
||||
export class FW_Server {
|
||||
/**
|
||||
* Registers a server event with an associated callback
|
||||
*
|
||||
@@ -11,7 +11,7 @@ export class Server {
|
||||
* @param callback - The callback function to be executed when the event is triggered
|
||||
* @param [options] - Optional settings for callback execution
|
||||
* @param [options.middlewares] - Middleware functions to be checked before the callback executes
|
||||
* @returns {Server} The current server instance, enabling method chaining
|
||||
* @returns {FW_Server} The current server instance, enabling method chaining
|
||||
*
|
||||
* @example
|
||||
* // Registering an event
|
||||
@@ -40,13 +40,13 @@ export class Server {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public register<EventName extends T.RageFW_ServerEvent>(
|
||||
public register<EventName extends T.FW_ServerEvent>(
|
||||
eventName: EventName,
|
||||
callback: T.RageFW_ServerCallback<EventName>,
|
||||
callback: T.FW_ServerCallback<EventName>,
|
||||
options?: {
|
||||
middlewares?: T.RageFW_MiddlewareOptions<EventName>
|
||||
middlewares?: T.FW_MiddlewareOptions<EventName>
|
||||
},
|
||||
): Server {
|
||||
): FW_Server {
|
||||
rpc.register<
|
||||
Parameters<typeof callback>,
|
||||
ReturnType<typeof callback> | Promise<unknown>,
|
||||
@@ -54,7 +54,7 @@ export class Server {
|
||||
>(eventName, async (...data) => {
|
||||
if (!options?.middlewares) return await callback(...data)
|
||||
|
||||
await Middleware.process(options.middlewares, callback, data)
|
||||
await FW_Middleware.process(options.middlewares, callback, data)
|
||||
})
|
||||
|
||||
return this
|
||||
@@ -64,7 +64,7 @@ export class Server {
|
||||
* Unregisters a server event, removing the associated callback
|
||||
*
|
||||
* @param eventName - The name of the event to unregister
|
||||
* @returns {Server} The current server instance, enabling method chaining
|
||||
* @returns {FW_Server} The current server instance, enabling method chaining
|
||||
*
|
||||
* @example
|
||||
* // Unregistering an event
|
||||
@@ -72,25 +72,21 @@ export class Server {
|
||||
*
|
||||
* @see {@link https://git.entityseven.com/entityseven/rage-framework/wiki Wiki}
|
||||
*/
|
||||
public unregister<EventName extends T.RageFW_ServerEvent>(
|
||||
public unregister<EventName extends T.FW_ServerEvent>(
|
||||
eventName: EventName,
|
||||
): Server {
|
||||
): FW_Server {
|
||||
rpc.unregister<EventName>(eventName)
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
// fixme
|
||||
// public trigger<EventName extends keyof T.RageFW_ICustomServerEvent>(
|
||||
// public trigger<EventName extends keyof T.FW_ICustomServerEvent>(
|
||||
// eventName: EventName,
|
||||
// ...args: T._ServerEventHasArgs<EventName> extends true
|
||||
// ? [T.RageFW_ServerArgs<EventName>]
|
||||
// ? [T.FW_ServerArgs<EventName>]
|
||||
// : []
|
||||
// ): Promise<T.RageFW_ServerReturn<EventName>> {
|
||||
// ): Promise<T.FW_ServerReturn<EventName>> {
|
||||
// return rpc.call(eventName, args)
|
||||
// }
|
||||
}
|
||||
|
||||
// new Server()
|
||||
// .register('customServerEvent', async (a, b, c) => true)
|
||||
// .unregister('customServerEvent')
|
||||
|
||||
+5
-5
@@ -1,6 +1,6 @@
|
||||
import { Logger, Player, Server, rpc } from './core'
|
||||
import { FW_Logger, FW_Player, FW_Server, rpc } from './core'
|
||||
|
||||
export type { RageFW_MiddlewareFunction } from './types'
|
||||
export type { FW_MiddlewareFunction } from './types'
|
||||
|
||||
/**
|
||||
* Package used on a server-side of your Rage:MP Server
|
||||
@@ -9,13 +9,13 @@ export type { RageFW_MiddlewareFunction } from './types'
|
||||
*/
|
||||
export const fw = {
|
||||
/** Server-side interactions */
|
||||
event: new Server(),
|
||||
event: new FW_Server(),
|
||||
/** Handles event manipulations that require player to be present in context */
|
||||
player: new Player(),
|
||||
player: new FW_Player(),
|
||||
/** Handles functions used to interact with the client environment */
|
||||
system: {
|
||||
/** Used to log in a server console */
|
||||
log: new Logger(),
|
||||
log: new FW_Logger(),
|
||||
},
|
||||
/** ``rage-fw-rpc`` instance used under the hood. It is highly recommended to use this one if you need it instead of creating a new instance */
|
||||
rpc,
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
import type { RageFW_ICustomBrowserEvent } from '@entityseven/rage-fw-shared-types'
|
||||
import type { FW_ICustomBrowserEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
/**
|
||||
* Union of all available browser event names
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_BrowserEvent = keyof RageFW_ICustomBrowserEvent
|
||||
export type FW_BrowserEvent = keyof FW_ICustomBrowserEvent
|
||||
|
||||
/**
|
||||
* Array of arguments of an event you pass as a generic
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_BrowserArgs<K extends RageFW_BrowserEvent> = Parameters<
|
||||
RageFW_ICustomBrowserEvent[K]
|
||||
export type FW_BrowserArgs<K extends FW_BrowserEvent> = Parameters<
|
||||
FW_ICustomBrowserEvent[K]
|
||||
>
|
||||
|
||||
/**
|
||||
* Return type of event you pass as a generic
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_BrowserReturn<K extends RageFW_BrowserEvent> = ReturnType<
|
||||
RageFW_ICustomBrowserEvent[K]
|
||||
export type FW_BrowserReturn<K extends FW_BrowserEvent> = ReturnType<
|
||||
FW_ICustomBrowserEvent[K]
|
||||
>
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export type _BrowserEventHasArgs<
|
||||
EventName extends keyof RageFW_ICustomBrowserEvent,
|
||||
> = keyof RageFW_ICustomBrowserEvent extends never
|
||||
EventName extends keyof FW_ICustomBrowserEvent,
|
||||
> = keyof FW_ICustomBrowserEvent extends never
|
||||
? false
|
||||
: Parameters<RageFW_ICustomBrowserEvent[EventName]>[0] extends undefined
|
||||
: Parameters<FW_ICustomBrowserEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
|
||||
+14
-17
@@ -1,38 +1,35 @@
|
||||
/// <reference types="@ragempcommunity/types-server" />
|
||||
|
||||
import type { RageFW_ICustomClientEvent } from '@entityseven/rage-fw-shared-types'
|
||||
import type { FW_ICustomClientEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
/**
|
||||
* Union of all available client event names
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_ClientEvent = keyof RageFW_ICustomClientEvent
|
||||
export type FW_ClientEvent = keyof FW_ICustomClientEvent
|
||||
|
||||
/**
|
||||
* Array of arguments of an event you pass as a generic
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_ClientArgs<K extends RageFW_ClientEvent> =
|
||||
K extends RageFW_ClientEvent
|
||||
? Parameters<RageFW_ICustomClientEvent[K]>
|
||||
: never
|
||||
export type FW_ClientArgs<K extends FW_ClientEvent> = K extends FW_ClientEvent
|
||||
? Parameters<FW_ICustomClientEvent[K]>
|
||||
: never
|
||||
|
||||
/**
|
||||
* Return type of event you pass as a generic
|
||||
* These only include custom events
|
||||
*/
|
||||
export type RageFW_ClientReturn<K extends RageFW_ClientEvent> =
|
||||
K extends RageFW_ClientEvent
|
||||
? ReturnType<RageFW_ICustomClientEvent[K]>
|
||||
: never
|
||||
export type FW_ClientReturn<K extends FW_ClientEvent> = K extends FW_ClientEvent
|
||||
? ReturnType<FW_ICustomClientEvent[K]>
|
||||
: never
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export type _ClientEventHasArgs<
|
||||
EventName extends keyof RageFW_ICustomClientEvent,
|
||||
> = keyof RageFW_ICustomClientEvent extends never
|
||||
? false
|
||||
: Parameters<RageFW_ICustomClientEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
export type _ClientEventHasArgs<EventName extends keyof FW_ICustomClientEvent> =
|
||||
keyof FW_ICustomClientEvent extends never
|
||||
? false
|
||||
: Parameters<FW_ICustomClientEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export * from './browser'
|
||||
export * from './client'
|
||||
export * from './middleware'
|
||||
export * from './server'
|
||||
export type * from './browser'
|
||||
export type * from './client'
|
||||
export type * from './middleware'
|
||||
export type * from './server'
|
||||
|
||||
@@ -1,26 +1,25 @@
|
||||
import type * as T from './server'
|
||||
|
||||
export type RageFW_MiddlewareResponse =
|
||||
export type FW_MiddlewareResponse =
|
||||
| {
|
||||
success: boolean
|
||||
message?: string
|
||||
}
|
||||
| boolean
|
||||
|
||||
export type RageFW_MiddlewareResponseInternal = {
|
||||
export type FW_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 FW_MiddlewareFunction<EventName extends T.FW_ServerEvent> = (
|
||||
...args: T.FW_ServerArgs<EventName>
|
||||
) => Promise<FW_MiddlewareResponse>
|
||||
|
||||
export type RageFW_MiddlewareOptions<EventName extends T.RageFW_ServerEvent> =
|
||||
| RageFW_MiddlewareFunction<EventName>[]
|
||||
export type FW_MiddlewareOptions<EventName extends T.FW_ServerEvent> =
|
||||
| FW_MiddlewareFunction<EventName>[]
|
||||
| {
|
||||
executables: RageFW_MiddlewareFunction<EventName>[]
|
||||
executables: FW_MiddlewareFunction<EventName>[]
|
||||
onError: (error: string) => unknown
|
||||
}
|
||||
|
||||
+17
-21
@@ -1,27 +1,25 @@
|
||||
/// <reference types="@ragempcommunity/types-server" />
|
||||
|
||||
import type {
|
||||
RageFW_ICustomClientEvent,
|
||||
RageFW_ICustomServerEvent,
|
||||
FW_ICustomClientEvent,
|
||||
FW_ICustomServerEvent,
|
||||
} from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
export type { RageFW_ICustomServerEvent } from '@entityseven/rage-fw-shared-types'
|
||||
export type { FW_ICustomServerEvent } from '@entityseven/rage-fw-shared-types'
|
||||
|
||||
/**
|
||||
* Union of all available server event names
|
||||
* These also include system events
|
||||
*/
|
||||
export type RageFW_ServerEvent =
|
||||
| keyof RageFW_ICustomServerEvent
|
||||
| keyof IServerEvents
|
||||
export type FW_ServerEvent = keyof FW_ICustomServerEvent | keyof IServerEvents
|
||||
|
||||
/**
|
||||
* Array of arguments for an event, name of which you pass as a generic
|
||||
* These also include system events
|
||||
*/
|
||||
export type RageFW_ServerArgs<K extends RageFW_ServerEvent> =
|
||||
K extends keyof RageFW_ICustomServerEvent
|
||||
? [PlayerMp, ...Parameters<RageFW_ICustomServerEvent[K]>]
|
||||
export type FW_ServerArgs<K extends FW_ServerEvent> =
|
||||
K extends keyof FW_ICustomServerEvent
|
||||
? [PlayerMp, ...Parameters<FW_ICustomServerEvent[K]>]
|
||||
: K extends keyof IServerEvents
|
||||
? [PlayerMp, Parameters<IServerEvents[K]>]
|
||||
: never
|
||||
@@ -30,9 +28,9 @@ export type RageFW_ServerArgs<K extends RageFW_ServerEvent> =
|
||||
* Return type for an event, name of which you pass as a generic
|
||||
* These include system and custom events
|
||||
*/
|
||||
export type RageFW_ServerReturn<K extends RageFW_ServerEvent> =
|
||||
K extends keyof RageFW_ICustomServerEvent
|
||||
? ReturnType<RageFW_ICustomServerEvent[K]>
|
||||
export type FW_ServerReturn<K extends FW_ServerEvent> =
|
||||
K extends keyof FW_ICustomServerEvent
|
||||
? ReturnType<FW_ICustomServerEvent[K]>
|
||||
: K extends keyof IServerEvents
|
||||
? ReturnType<IServerEvents[K]>
|
||||
: void
|
||||
@@ -41,20 +39,18 @@ export type RageFW_ServerReturn<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_ServerCallback<K extends RageFW_ServerEvent> = (
|
||||
...args: RageFW_ServerArgs<K>
|
||||
) => Promise<RageFW_ServerReturn<K>>
|
||||
export type FW_ServerCallback<K extends FW_ServerEvent> = (
|
||||
...args: FW_ServerArgs<K>
|
||||
) => Promise<FW_ServerReturn<K>>
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export type _ServerEventHasArgs<EventName extends RageFW_ServerEvent> =
|
||||
EventName extends keyof RageFW_ICustomServerEvent
|
||||
? keyof RageFW_ICustomClientEvent extends never
|
||||
export type _ServerEventHasArgs<EventName extends FW_ServerEvent> =
|
||||
EventName extends keyof FW_ICustomServerEvent
|
||||
? keyof FW_ICustomClientEvent extends never
|
||||
? false
|
||||
: Parameters<
|
||||
RageFW_ICustomServerEvent[EventName]
|
||||
>[0] extends undefined
|
||||
: Parameters<FW_ICustomServerEvent[EventName]>[0] extends undefined
|
||||
? false
|
||||
: true
|
||||
: EventName extends keyof IServerEvents
|
||||
|
||||
+4
-21
@@ -1,25 +1,8 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/tsconfig",
|
||||
"display": "Base",
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
],
|
||||
"display": "Server",
|
||||
"compilerOptions": {
|
||||
"incremental": false,
|
||||
"composite": false,
|
||||
"target": "ES2022",
|
||||
"experimentalDecorators": true,
|
||||
"moduleDetection": "auto",
|
||||
"module": "CommonJS",
|
||||
"resolveJsonModule": true,
|
||||
"declaration": true,
|
||||
"declarationMap": false,
|
||||
"sourceMap": false,
|
||||
"downlevelIteration": false,
|
||||
"inlineSourceMap": false,
|
||||
"esModuleInterop": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"strict": true,
|
||||
"skipLibCheck": true
|
||||
}
|
||||
"types": ["./node_modules/@ragempcommunity/types-server/index.d.ts"]
|
||||
},
|
||||
"extends": ["../tsconfig.ragefw.json"]
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import { defineConfig } from 'tsup'
|
||||
|
||||
export default defineConfig({
|
||||
entry: ['src/index.ts'],
|
||||
entry: ['src/**/*.ts'],
|
||||
outDir: './dist',
|
||||
format: ['cjs'],
|
||||
noExternal: ['rage-rpc'],
|
||||
experimentalDts: true,
|
||||
splitting: false,
|
||||
bundle: false,
|
||||
sourcemap: false,
|
||||
clean: true,
|
||||
})
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
# Custom Attribution-NoDerives 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.
|
||||
@@ -1,12 +1,30 @@
|
||||
{
|
||||
"name": "@entityseven/rage-fw-shared-types",
|
||||
"version": "0.2.1-0.2.0-alpha.1.0",
|
||||
"types": "types/types/index.d.ts",
|
||||
"private": false,
|
||||
"files": [
|
||||
"types/**/*"
|
||||
"types/**/*",
|
||||
"readme.md",
|
||||
"LICENSE",
|
||||
"package.json"
|
||||
],
|
||||
"author": "SashaGoncharov19",
|
||||
"license": "MIT",
|
||||
"types": "types/types/index.d.ts",
|
||||
"name": "@entityseven/rage-fw-shared-types",
|
||||
"version": "0.2.0",
|
||||
"description": "Package used among all environments of your Rage-FW based server",
|
||||
"keywords": ["rage-fw-shared-types", "rage-fw-shared","ragefw", "rage-fw", "ragemp", "rage:mp", "rage", "gta5"],
|
||||
"type": "module",
|
||||
"gitHead": "053e4fd12aa120d53e11e0d2009c0df78c1a2ad0"
|
||||
"author": "Entity Seven Group",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Danya H",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/rilaxik/"
|
||||
},
|
||||
{
|
||||
"name": "Oleksandr Honcharov",
|
||||
"email": "[email protected]",
|
||||
"url": "https://github.com/SashaGoncharov19/"
|
||||
}
|
||||
],
|
||||
"license": "Custom-Attribution-NoDerives",
|
||||
"gitHead": "ffd542c1deddb3033e16e0dae7557313ae09b05f"
|
||||
}
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
# RageFW Shared types
|
||||
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki/Docs)
|
||||
[Read docs for details](https://git.entityseven.com/entityseven/rage-framework/wiki)
|
||||
Vendored
+6
-7
@@ -1,14 +1,13 @@
|
||||
declare module '@entityseven/rage-fw-shared-types' {
|
||||
export interface RageFW_ICustomServerEvent {
|
||||
customServerEvent(arg1: string, arg2: number): boolean
|
||||
export interface FW_ICustomServerEvent {
|
||||
// customServerEvent(arg1: string, arg2: number): boolean // example event
|
||||
}
|
||||
|
||||
export interface RageFW_ICustomClientEvent {
|
||||
cefReady(): void
|
||||
customClientEvent(arg1: string, arg2: number): boolean
|
||||
export interface FW_ICustomClientEvent {
|
||||
// customClientEvent(arg1: string, arg2: number): boolean // example event
|
||||
}
|
||||
|
||||
export interface RageFW_ICustomBrowserEvent {
|
||||
customCefEvent(arg1: string, arg2: number): boolean
|
||||
export interface FW_ICustomBrowserEvent {
|
||||
// customCefEvent(arg1: string, arg2: number): boolean // example event
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ESNext",
|
||||
"target": "es2022",
|
||||
"lib": [
|
||||
"ESNext",
|
||||
"ES2019",
|
||||
"es2022",
|
||||
"dom"
|
||||
],
|
||||
"moduleResolution": "node",
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"incremental": false,
|
||||
"composite": false,
|
||||
|
||||
"target": "es2022",
|
||||
"moduleDetection": "auto",
|
||||
"module": "commonjs",
|
||||
|
||||
"esModuleInterop": true,
|
||||
"experimentalDecorators": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noImplicitAny": true,
|
||||
"resolveJsonModule": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
|
||||
"declaration": false,
|
||||
"declarationMap": false,
|
||||
"downlevelIteration": false,
|
||||
"inlineSourceMap": false,
|
||||
"sourceMap": false
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"dist",
|
||||
".tsup"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user