@vicerp/rpc 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +412 -0
- package/dist/cjs/adapters/fivem/client-server.d.ts +3 -0
- package/dist/cjs/adapters/fivem/client-server.d.ts.map +1 -0
- package/dist/cjs/adapters/fivem/client-server.js +6 -0
- package/dist/cjs/adapters/fivem/client-server.js.map +1 -0
- package/dist/cjs/adapters/fivem/client.d.ts +3 -0
- package/dist/cjs/adapters/fivem/client.d.ts.map +1 -0
- package/dist/cjs/adapters/fivem/client.js +6 -0
- package/dist/cjs/adapters/fivem/client.js.map +1 -0
- package/dist/cjs/adapters/fivem/fivem-client-server.transport.d.ts +17 -0
- package/dist/cjs/adapters/fivem/fivem-client-server.transport.d.ts.map +1 -0
- package/dist/cjs/adapters/fivem/fivem-client-server.transport.js +42 -0
- package/dist/cjs/adapters/fivem/fivem-client-server.transport.js.map +1 -0
- package/dist/cjs/adapters/fivem/fivem-client.transport.d.ts +17 -0
- package/dist/cjs/adapters/fivem/fivem-client.transport.d.ts.map +1 -0
- package/dist/cjs/adapters/fivem/fivem-client.transport.js +44 -0
- package/dist/cjs/adapters/fivem/fivem-client.transport.js.map +1 -0
- package/dist/cjs/adapters/fivem/fivem-nui.transport.d.ts +17 -0
- package/dist/cjs/adapters/fivem/fivem-nui.transport.d.ts.map +1 -0
- package/dist/cjs/adapters/fivem/fivem-nui.transport.js +56 -0
- package/dist/cjs/adapters/fivem/fivem-nui.transport.js.map +1 -0
- package/dist/cjs/adapters/fivem/fivem-server.transport.d.ts +34 -0
- package/dist/cjs/adapters/fivem/fivem-server.transport.d.ts.map +1 -0
- package/dist/cjs/adapters/fivem/fivem-server.transport.js +80 -0
- package/dist/cjs/adapters/fivem/fivem-server.transport.js.map +1 -0
- package/dist/cjs/adapters/fivem/fivem.types.d.ts +18 -0
- package/dist/cjs/adapters/fivem/fivem.types.d.ts.map +1 -0
- package/dist/cjs/adapters/fivem/fivem.types.js +3 -0
- package/dist/cjs/adapters/fivem/fivem.types.js.map +1 -0
- package/dist/cjs/adapters/fivem/index.d.ts +4 -0
- package/dist/cjs/adapters/fivem/index.d.ts.map +1 -0
- package/dist/cjs/adapters/fivem/index.js +8 -0
- package/dist/cjs/adapters/fivem/index.js.map +1 -0
- package/dist/cjs/adapters/fivem/nui.d.ts +3 -0
- package/dist/cjs/adapters/fivem/nui.d.ts.map +1 -0
- package/dist/cjs/adapters/fivem/nui.js +6 -0
- package/dist/cjs/adapters/fivem/nui.js.map +1 -0
- package/dist/cjs/adapters/fivem/server.d.ts +3 -0
- package/dist/cjs/adapters/fivem/server.d.ts.map +1 -0
- package/dist/cjs/adapters/fivem/server.js +7 -0
- package/dist/cjs/adapters/fivem/server.js.map +1 -0
- package/dist/cjs/adapters/rage/browser.d.ts +3 -0
- package/dist/cjs/adapters/rage/browser.d.ts.map +1 -0
- package/dist/cjs/adapters/rage/browser.js +6 -0
- package/dist/cjs/adapters/rage/browser.js.map +1 -0
- package/dist/cjs/adapters/rage/client-server.d.ts +3 -0
- package/dist/cjs/adapters/rage/client-server.d.ts.map +1 -0
- package/dist/cjs/adapters/rage/client-server.js +6 -0
- package/dist/cjs/adapters/rage/client-server.js.map +1 -0
- package/dist/cjs/adapters/rage/client.d.ts +3 -0
- package/dist/cjs/adapters/rage/client.d.ts.map +1 -0
- package/dist/cjs/adapters/rage/client.js +6 -0
- package/dist/cjs/adapters/rage/client.js.map +1 -0
- package/dist/cjs/adapters/rage/index.d.ts +4 -0
- package/dist/cjs/adapters/rage/index.d.ts.map +1 -0
- package/dist/cjs/adapters/rage/index.js +8 -0
- package/dist/cjs/adapters/rage/index.js.map +1 -0
- package/dist/cjs/adapters/rage/rage-browser.transport.d.ts +16 -0
- package/dist/cjs/adapters/rage/rage-browser.transport.d.ts.map +1 -0
- package/dist/cjs/adapters/rage/rage-browser.transport.js +44 -0
- package/dist/cjs/adapters/rage/rage-browser.transport.js.map +1 -0
- package/dist/cjs/adapters/rage/rage-client-server.transport.d.ts +18 -0
- package/dist/cjs/adapters/rage/rage-client-server.transport.d.ts.map +1 -0
- package/dist/cjs/adapters/rage/rage-client-server.transport.js +48 -0
- package/dist/cjs/adapters/rage/rage-client-server.transport.js.map +1 -0
- package/dist/cjs/adapters/rage/rage-client.transport.d.ts +19 -0
- package/dist/cjs/adapters/rage/rage-client.transport.d.ts.map +1 -0
- package/dist/cjs/adapters/rage/rage-client.transport.js +50 -0
- package/dist/cjs/adapters/rage/rage-client.transport.js.map +1 -0
- package/dist/cjs/adapters/rage/rage-server.transport.d.ts +32 -0
- package/dist/cjs/adapters/rage/rage-server.transport.d.ts.map +1 -0
- package/dist/cjs/adapters/rage/rage-server.transport.js +82 -0
- package/dist/cjs/adapters/rage/rage-server.transport.js.map +1 -0
- package/dist/cjs/adapters/rage/rage.types.d.ts +34 -0
- package/dist/cjs/adapters/rage/rage.types.d.ts.map +1 -0
- package/dist/cjs/adapters/rage/rage.types.js +3 -0
- package/dist/cjs/adapters/rage/rage.types.js.map +1 -0
- package/dist/cjs/adapters/rage/server.d.ts +3 -0
- package/dist/cjs/adapters/rage/server.d.ts.map +1 -0
- package/dist/cjs/adapters/rage/server.js +7 -0
- package/dist/cjs/adapters/rage/server.js.map +1 -0
- package/dist/cjs/core/errors.d.ts +7 -0
- package/dist/cjs/core/errors.d.ts.map +1 -0
- package/dist/cjs/core/errors.js +18 -0
- package/dist/cjs/core/errors.js.map +1 -0
- package/dist/cjs/core/id.d.ts +2 -0
- package/dist/cjs/core/id.d.ts.map +1 -0
- package/dist/cjs/core/id.js +13 -0
- package/dist/cjs/core/id.js.map +1 -0
- package/dist/cjs/core/index.d.ts +6 -0
- package/dist/cjs/core/index.d.ts.map +1 -0
- package/dist/cjs/core/index.js +26 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/cjs/core/relay.d.ts +12 -0
- package/dist/cjs/core/relay.d.ts.map +1 -0
- package/dist/cjs/core/relay.js +23 -0
- package/dist/cjs/core/relay.js.map +1 -0
- package/dist/cjs/core/rpc.d.ts +21 -0
- package/dist/cjs/core/rpc.d.ts.map +1 -0
- package/dist/cjs/core/rpc.js +147 -0
- package/dist/cjs/core/rpc.js.map +1 -0
- package/dist/cjs/core/types.d.ts +30 -0
- package/dist/cjs/core/types.d.ts.map +1 -0
- package/dist/cjs/core/types.js +3 -0
- package/dist/cjs/core/types.js.map +1 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +18 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/react/RpcProvider.d.ts +10 -0
- package/dist/cjs/react/RpcProvider.d.ts.map +1 -0
- package/dist/cjs/react/RpcProvider.js +19 -0
- package/dist/cjs/react/RpcProvider.js.map +1 -0
- package/dist/cjs/react/index.d.ts +8 -0
- package/dist/cjs/react/index.d.ts.map +1 -0
- package/dist/cjs/react/index.js +15 -0
- package/dist/cjs/react/index.js.map +1 -0
- package/dist/cjs/react/useRpc.d.ts +3 -0
- package/dist/cjs/react/useRpc.d.ts.map +1 -0
- package/dist/cjs/react/useRpc.js +13 -0
- package/dist/cjs/react/useRpc.js.map +1 -0
- package/dist/cjs/react/useRpcCall.d.ts +13 -0
- package/dist/cjs/react/useRpcCall.d.ts.map +1 -0
- package/dist/cjs/react/useRpcCall.js +35 -0
- package/dist/cjs/react/useRpcCall.js.map +1 -0
- package/dist/cjs/react/useRpcEvent.d.ts +3 -0
- package/dist/cjs/react/useRpcEvent.d.ts.map +1 -0
- package/dist/cjs/react/useRpcEvent.js +20 -0
- package/dist/cjs/react/useRpcEvent.js.map +1 -0
- package/dist/cjs/react/useRpcRegister.d.ts +3 -0
- package/dist/cjs/react/useRpcRegister.d.ts.map +1 -0
- package/dist/cjs/react/useRpcRegister.js +20 -0
- package/dist/cjs/react/useRpcRegister.js.map +1 -0
- package/dist/esm/adapters/fivem/client-server.d.ts +3 -0
- package/dist/esm/adapters/fivem/client-server.d.ts.map +1 -0
- package/dist/esm/adapters/fivem/client-server.js +2 -0
- package/dist/esm/adapters/fivem/client-server.js.map +1 -0
- package/dist/esm/adapters/fivem/client.d.ts +3 -0
- package/dist/esm/adapters/fivem/client.d.ts.map +1 -0
- package/dist/esm/adapters/fivem/client.js +2 -0
- package/dist/esm/adapters/fivem/client.js.map +1 -0
- package/dist/esm/adapters/fivem/fivem-client-server.transport.d.ts +17 -0
- package/dist/esm/adapters/fivem/fivem-client-server.transport.d.ts.map +1 -0
- package/dist/esm/adapters/fivem/fivem-client-server.transport.js +38 -0
- package/dist/esm/adapters/fivem/fivem-client-server.transport.js.map +1 -0
- package/dist/esm/adapters/fivem/fivem-client.transport.d.ts +17 -0
- package/dist/esm/adapters/fivem/fivem-client.transport.d.ts.map +1 -0
- package/dist/esm/adapters/fivem/fivem-client.transport.js +40 -0
- package/dist/esm/adapters/fivem/fivem-client.transport.js.map +1 -0
- package/dist/esm/adapters/fivem/fivem-nui.transport.d.ts +17 -0
- package/dist/esm/adapters/fivem/fivem-nui.transport.d.ts.map +1 -0
- package/dist/esm/adapters/fivem/fivem-nui.transport.js +52 -0
- package/dist/esm/adapters/fivem/fivem-nui.transport.js.map +1 -0
- package/dist/esm/adapters/fivem/fivem-server.transport.d.ts +34 -0
- package/dist/esm/adapters/fivem/fivem-server.transport.d.ts.map +1 -0
- package/dist/esm/adapters/fivem/fivem-server.transport.js +75 -0
- package/dist/esm/adapters/fivem/fivem-server.transport.js.map +1 -0
- package/dist/esm/adapters/fivem/fivem.types.d.ts +18 -0
- package/dist/esm/adapters/fivem/fivem.types.d.ts.map +1 -0
- package/dist/esm/adapters/fivem/fivem.types.js +2 -0
- package/dist/esm/adapters/fivem/fivem.types.js.map +1 -0
- package/dist/esm/adapters/fivem/index.d.ts +4 -0
- package/dist/esm/adapters/fivem/index.d.ts.map +1 -0
- package/dist/esm/adapters/fivem/index.js +3 -0
- package/dist/esm/adapters/fivem/index.js.map +1 -0
- package/dist/esm/adapters/fivem/nui.d.ts +3 -0
- package/dist/esm/adapters/fivem/nui.d.ts.map +1 -0
- package/dist/esm/adapters/fivem/nui.js +2 -0
- package/dist/esm/adapters/fivem/nui.js.map +1 -0
- package/dist/esm/adapters/fivem/server.d.ts +3 -0
- package/dist/esm/adapters/fivem/server.d.ts.map +1 -0
- package/dist/esm/adapters/fivem/server.js +2 -0
- package/dist/esm/adapters/fivem/server.js.map +1 -0
- package/dist/esm/adapters/rage/browser.d.ts +3 -0
- package/dist/esm/adapters/rage/browser.d.ts.map +1 -0
- package/dist/esm/adapters/rage/browser.js +2 -0
- package/dist/esm/adapters/rage/browser.js.map +1 -0
- package/dist/esm/adapters/rage/client-server.d.ts +3 -0
- package/dist/esm/adapters/rage/client-server.d.ts.map +1 -0
- package/dist/esm/adapters/rage/client-server.js +2 -0
- package/dist/esm/adapters/rage/client-server.js.map +1 -0
- package/dist/esm/adapters/rage/client.d.ts +3 -0
- package/dist/esm/adapters/rage/client.d.ts.map +1 -0
- package/dist/esm/adapters/rage/client.js +2 -0
- package/dist/esm/adapters/rage/client.js.map +1 -0
- package/dist/esm/adapters/rage/index.d.ts +4 -0
- package/dist/esm/adapters/rage/index.d.ts.map +1 -0
- package/dist/esm/adapters/rage/index.js +3 -0
- package/dist/esm/adapters/rage/index.js.map +1 -0
- package/dist/esm/adapters/rage/rage-browser.transport.d.ts +16 -0
- package/dist/esm/adapters/rage/rage-browser.transport.d.ts.map +1 -0
- package/dist/esm/adapters/rage/rage-browser.transport.js +40 -0
- package/dist/esm/adapters/rage/rage-browser.transport.js.map +1 -0
- package/dist/esm/adapters/rage/rage-client-server.transport.d.ts +18 -0
- package/dist/esm/adapters/rage/rage-client-server.transport.d.ts.map +1 -0
- package/dist/esm/adapters/rage/rage-client-server.transport.js +44 -0
- package/dist/esm/adapters/rage/rage-client-server.transport.js.map +1 -0
- package/dist/esm/adapters/rage/rage-client.transport.d.ts +19 -0
- package/dist/esm/adapters/rage/rage-client.transport.d.ts.map +1 -0
- package/dist/esm/adapters/rage/rage-client.transport.js +46 -0
- package/dist/esm/adapters/rage/rage-client.transport.js.map +1 -0
- package/dist/esm/adapters/rage/rage-server.transport.d.ts +32 -0
- package/dist/esm/adapters/rage/rage-server.transport.d.ts.map +1 -0
- package/dist/esm/adapters/rage/rage-server.transport.js +77 -0
- package/dist/esm/adapters/rage/rage-server.transport.js.map +1 -0
- package/dist/esm/adapters/rage/rage.types.d.ts +34 -0
- package/dist/esm/adapters/rage/rage.types.d.ts.map +1 -0
- package/dist/esm/adapters/rage/rage.types.js +2 -0
- package/dist/esm/adapters/rage/rage.types.js.map +1 -0
- package/dist/esm/adapters/rage/server.d.ts +3 -0
- package/dist/esm/adapters/rage/server.d.ts.map +1 -0
- package/dist/esm/adapters/rage/server.js +2 -0
- package/dist/esm/adapters/rage/server.js.map +1 -0
- package/dist/esm/core/errors.d.ts +7 -0
- package/dist/esm/core/errors.d.ts.map +1 -0
- package/dist/esm/core/errors.js +13 -0
- package/dist/esm/core/errors.js.map +1 -0
- package/dist/esm/core/id.d.ts +2 -0
- package/dist/esm/core/id.d.ts.map +1 -0
- package/dist/esm/core/id.js +10 -0
- package/dist/esm/core/id.js.map +1 -0
- package/dist/esm/core/index.d.ts +6 -0
- package/dist/esm/core/index.d.ts.map +1 -0
- package/dist/esm/core/index.js +6 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/core/relay.d.ts +12 -0
- package/dist/esm/core/relay.d.ts.map +1 -0
- package/dist/esm/core/relay.js +19 -0
- package/dist/esm/core/relay.js.map +1 -0
- package/dist/esm/core/rpc.d.ts +21 -0
- package/dist/esm/core/rpc.d.ts.map +1 -0
- package/dist/esm/core/rpc.js +143 -0
- package/dist/esm/core/rpc.js.map +1 -0
- package/dist/esm/core/types.d.ts +30 -0
- package/dist/esm/core/types.d.ts.map +1 -0
- package/dist/esm/core/types.js +2 -0
- package/dist/esm/core/types.js.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/react/RpcProvider.d.ts +10 -0
- package/dist/esm/react/RpcProvider.d.ts.map +1 -0
- package/dist/esm/react/RpcProvider.js +15 -0
- package/dist/esm/react/RpcProvider.js.map +1 -0
- package/dist/esm/react/index.d.ts +8 -0
- package/dist/esm/react/index.d.ts.map +1 -0
- package/dist/esm/react/index.js +6 -0
- package/dist/esm/react/index.js.map +1 -0
- package/dist/esm/react/useRpc.d.ts +3 -0
- package/dist/esm/react/useRpc.d.ts.map +1 -0
- package/dist/esm/react/useRpc.js +10 -0
- package/dist/esm/react/useRpc.js.map +1 -0
- package/dist/esm/react/useRpcCall.d.ts +13 -0
- package/dist/esm/react/useRpcCall.d.ts.map +1 -0
- package/dist/esm/react/useRpcCall.js +32 -0
- package/dist/esm/react/useRpcCall.js.map +1 -0
- package/dist/esm/react/useRpcEvent.d.ts +3 -0
- package/dist/esm/react/useRpcEvent.d.ts.map +1 -0
- package/dist/esm/react/useRpcEvent.js +17 -0
- package/dist/esm/react/useRpcEvent.js.map +1 -0
- package/dist/esm/react/useRpcRegister.d.ts +3 -0
- package/dist/esm/react/useRpcRegister.d.ts.map +1 -0
- package/dist/esm/react/useRpcRegister.js +17 -0
- package/dist/esm/react/useRpcRegister.js.map +1 -0
- package/package.json +170 -0
package/README.md
ADDED
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
# @vicerp/rpc
|
|
2
|
+
|
|
3
|
+
Platform-agnostic bidirectional RPC library for game frameworks. Provides procedure calls, events, and relay capabilities across the full **Browser <-> Client <-> Server** chain.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Browser ──RPC──> Client ──RPC──> Server ──gRPC──> Engine
|
|
9
|
+
Browser <──RPC── Client <──RPC── Server <──gRPC── Engine
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The client acts as a pure passthrough relay. All RPC messages from the browser are forwarded to the server and vice versa. The server is where business logic lives.
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install @vicerp/rpc
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Core API
|
|
21
|
+
|
|
22
|
+
### `Rpc`
|
|
23
|
+
|
|
24
|
+
The main class for registering procedures, making calls, and sending events.
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { Rpc } from '@vicerp/rpc';
|
|
28
|
+
|
|
29
|
+
const rpc = new Rpc(transport);
|
|
30
|
+
|
|
31
|
+
// Register a procedure
|
|
32
|
+
rpc.register('inventory:split', async (args) => {
|
|
33
|
+
const { slot } = args as { slot: number };
|
|
34
|
+
// ... business logic
|
|
35
|
+
return { success: true };
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Call a remote procedure
|
|
39
|
+
const result = await rpc.call<{ success: boolean }>('inventory:split', { slot: 4 });
|
|
40
|
+
|
|
41
|
+
// Fire-and-forget event
|
|
42
|
+
rpc.trigger('inventory:update', { items: [...] });
|
|
43
|
+
|
|
44
|
+
// Listen for events
|
|
45
|
+
rpc.on('inventory:update', (args) => {
|
|
46
|
+
console.log('Inventory updated:', args);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Unsubscribe
|
|
50
|
+
rpc.off('inventory:update', handler);
|
|
51
|
+
|
|
52
|
+
// Cleanup
|
|
53
|
+
rpc.destroy();
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
#### Options
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
// Call with custom timeout (default: 10s)
|
|
60
|
+
const result = await rpc.call('procedure', args, { timeout: 5000 });
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### `RpcRelay`
|
|
64
|
+
|
|
65
|
+
Bidirectionally forwards all messages between two transports. Zero knowledge of message content — just pipes through.
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
import { RpcRelay } from '@vicerp/rpc';
|
|
69
|
+
|
|
70
|
+
const relay = new RpcRelay(transportA, transportB);
|
|
71
|
+
|
|
72
|
+
// Messages from A are forwarded to B, and vice versa
|
|
73
|
+
// Cleanup
|
|
74
|
+
relay.destroy();
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### `RpcTransport` (interface)
|
|
78
|
+
|
|
79
|
+
All transports implement this interface:
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
interface RpcTransport {
|
|
83
|
+
send(message: RpcMessage): void;
|
|
84
|
+
onMessage(handler: (message: RpcMessage) => void): void;
|
|
85
|
+
destroy(): void;
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Message Types
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// Procedure call
|
|
93
|
+
interface RpcRequest {
|
|
94
|
+
type: 'request';
|
|
95
|
+
id: string;
|
|
96
|
+
procedure: string;
|
|
97
|
+
args?: unknown;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Procedure response
|
|
101
|
+
interface RpcResponse {
|
|
102
|
+
type: 'response';
|
|
103
|
+
id: string;
|
|
104
|
+
result?: unknown;
|
|
105
|
+
error?: string;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Fire-and-forget event
|
|
109
|
+
interface RpcEvent {
|
|
110
|
+
type: 'event';
|
|
111
|
+
name: string;
|
|
112
|
+
args?: unknown;
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Adapters
|
|
117
|
+
|
|
118
|
+
### RAGE:MP
|
|
119
|
+
|
|
120
|
+
#### Browser (CEF) Transport
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
import { RageBrowserTransport } from '@vicerp/rpc/rage/browser';
|
|
124
|
+
|
|
125
|
+
// In CEF browser code
|
|
126
|
+
const transport = new RageBrowserTransport(mp);
|
|
127
|
+
const rpc = new Rpc(transport);
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### Client Transport (Client <-> Browser)
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
import { RageClientTransport } from '@vicerp/rpc/rage/client';
|
|
134
|
+
|
|
135
|
+
// In client script
|
|
136
|
+
const transport = new RageClientTransport(browser, mp);
|
|
137
|
+
const rpc = new Rpc(transport);
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
#### Client-Server Transport (Client <-> Server)
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
import { RageClientServerTransport } from '@vicerp/rpc/rage/client-server';
|
|
144
|
+
|
|
145
|
+
// In client script — sends via mp.events.callRemote(), receives via mp.events
|
|
146
|
+
const transport = new RageClientServerTransport(mp);
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
#### Server Transport (Server <-> Client)
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { RageServerTransportHub, RageServerTransport } from '@vicerp/rpc/rage/server';
|
|
153
|
+
|
|
154
|
+
// Create ONE hub per server (registers global event listener)
|
|
155
|
+
const hub = new RageServerTransportHub(mp);
|
|
156
|
+
|
|
157
|
+
// Create per-player transports
|
|
158
|
+
const transport = hub.createTransport(player);
|
|
159
|
+
const rpc = new Rpc(transport);
|
|
160
|
+
|
|
161
|
+
// Cleanup when player disconnects
|
|
162
|
+
hub.removeTransport(player);
|
|
163
|
+
|
|
164
|
+
// Shutdown
|
|
165
|
+
hub.destroy();
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
#### Client as Relay (recommended pattern)
|
|
169
|
+
|
|
170
|
+
The client doesn't need its own `Rpc` instance — it just relays between browser and server:
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
import { RpcRelay } from '@vicerp/rpc';
|
|
174
|
+
import { RageClientTransport } from '@vicerp/rpc/rage/client';
|
|
175
|
+
import { RageClientServerTransport } from '@vicerp/rpc/rage/client-server';
|
|
176
|
+
|
|
177
|
+
const browserTransport = new RageClientTransport(browser, mp);
|
|
178
|
+
const serverTransport = new RageClientServerTransport(mp);
|
|
179
|
+
const relay = new RpcRelay(browserTransport, serverTransport);
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### FiveM
|
|
183
|
+
|
|
184
|
+
#### NUI Transport (Browser side)
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
import { FiveMNuiTransport } from '@vicerp/rpc/fivem/nui';
|
|
188
|
+
|
|
189
|
+
const transport = new FiveMNuiTransport(window);
|
|
190
|
+
const rpc = new Rpc(transport);
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
#### Client Transport (Client <-> NUI)
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
import { FiveMClientTransport } from '@vicerp/rpc/fivem/client';
|
|
197
|
+
|
|
198
|
+
const transport = new FiveMClientTransport(fivem);
|
|
199
|
+
const rpc = new Rpc(transport);
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
#### Client-Server Transport (Client <-> Server)
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
import { FiveMClientServerTransport } from '@vicerp/rpc/fivem/client-server';
|
|
206
|
+
|
|
207
|
+
// Sends via TriggerServerEvent(), receives via on()
|
|
208
|
+
const transport = new FiveMClientServerTransport(fivem);
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
#### Server Transport (Server <-> Client)
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
import { FiveMServerTransportHub } from '@vicerp/rpc/fivem/server';
|
|
215
|
+
|
|
216
|
+
// Create ONE hub per server (registers global onNet listener)
|
|
217
|
+
const hub = new FiveMServerTransportHub(fivem);
|
|
218
|
+
|
|
219
|
+
// Create per-player transports (uses source for player ID)
|
|
220
|
+
const transport = hub.createTransport(playerId);
|
|
221
|
+
const rpc = new Rpc(transport);
|
|
222
|
+
|
|
223
|
+
// Cleanup
|
|
224
|
+
hub.removeTransport(playerId);
|
|
225
|
+
hub.destroy();
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## React Integration
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
import { RpcProvider, useRpc, useRpcCall, useRpcEvent, useRpcRegister } from '@vicerp/rpc/react';
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### `RpcProvider`
|
|
235
|
+
|
|
236
|
+
Wraps your app and provides an `Rpc` instance via context.
|
|
237
|
+
|
|
238
|
+
```tsx
|
|
239
|
+
<RpcProvider transport={transport}>
|
|
240
|
+
<App />
|
|
241
|
+
</RpcProvider>
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### `useRpc()`
|
|
245
|
+
|
|
246
|
+
Access the `Rpc` instance directly.
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
const rpc = useRpc();
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### `useRpcCall<T>(procedure, options?)`
|
|
253
|
+
|
|
254
|
+
Make RPC calls with loading/error state management.
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
const { data, loading, error, call } = useRpcCall<Item[]>('inventory:getItems');
|
|
258
|
+
|
|
259
|
+
// Trigger the call
|
|
260
|
+
await call();
|
|
261
|
+
|
|
262
|
+
// Or with args
|
|
263
|
+
await call({ playerId: '123' });
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### `useRpcEvent(name, handler)`
|
|
267
|
+
|
|
268
|
+
Subscribe to events (auto-cleanup on unmount).
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
useRpcEvent('inventory:update', (items) => {
|
|
272
|
+
setInventory(items);
|
|
273
|
+
});
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### `useRpcRegister(name, handler)`
|
|
277
|
+
|
|
278
|
+
Register a procedure handler (auto-cleanup on unmount).
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
useRpcRegister('ui:getState', () => {
|
|
282
|
+
return { theme: 'dark', locale: 'en' };
|
|
283
|
+
});
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Full Chain Example
|
|
287
|
+
|
|
288
|
+
Player clicks "split" button in inventory UI:
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
1. Browser: rpc.call('inventory:split', { slot: 4 })
|
|
292
|
+
2. Client: RpcRelay forwards to server
|
|
293
|
+
3. Server: Rpc handler receives, sends gRPC to engine
|
|
294
|
+
4. Engine: Processes split, responds via gRPC
|
|
295
|
+
5. Server: rpc.trigger('inventory:update', { ... })
|
|
296
|
+
6. Client: RpcRelay forwards to browser
|
|
297
|
+
7. Browser: useRpcEvent('inventory:update', ...) fires
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Browser (React)
|
|
301
|
+
|
|
302
|
+
```tsx
|
|
303
|
+
import { RpcProvider, useRpcCall, useRpcEvent } from '@vicerp/rpc/react';
|
|
304
|
+
import { RageBrowserTransport } from '@vicerp/rpc/rage/browser';
|
|
305
|
+
|
|
306
|
+
const transport = new RageBrowserTransport(mp);
|
|
307
|
+
|
|
308
|
+
function Inventory() {
|
|
309
|
+
const [items, setItems] = useState([]);
|
|
310
|
+
const { call: splitItem } = useRpcCall('inventory:split');
|
|
311
|
+
|
|
312
|
+
useRpcEvent('inventory:update', (data) => setItems(data.items));
|
|
313
|
+
|
|
314
|
+
return (
|
|
315
|
+
<button onClick={() => splitItem({ slot: 4 })}>Split</button>
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function App() {
|
|
320
|
+
return (
|
|
321
|
+
<RpcProvider transport={transport}>
|
|
322
|
+
<Inventory />
|
|
323
|
+
</RpcProvider>
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Client (RAGE:MP)
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
import { RpcRelay } from '@vicerp/rpc';
|
|
332
|
+
import { RageClientTransport } from '@vicerp/rpc/rage/client';
|
|
333
|
+
import { RageClientServerTransport } from '@vicerp/rpc/rage/client-server';
|
|
334
|
+
|
|
335
|
+
const browser = mp.browsers.new('http://localhost:3005');
|
|
336
|
+
const browserTransport = new RageClientTransport(browser, mp);
|
|
337
|
+
const serverTransport = new RageClientServerTransport(mp);
|
|
338
|
+
const relay = new RpcRelay(browserTransport, serverTransport);
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Server (RAGE:MP)
|
|
342
|
+
|
|
343
|
+
```typescript
|
|
344
|
+
import { Rpc } from '@vicerp/rpc';
|
|
345
|
+
import { RageServerTransportHub } from '@vicerp/rpc/rage/server';
|
|
346
|
+
|
|
347
|
+
const hub = new RageServerTransportHub(mp);
|
|
348
|
+
|
|
349
|
+
mp.events.add('playerReady', (player) => {
|
|
350
|
+
const transport = hub.createTransport(player);
|
|
351
|
+
const rpc = new Rpc(transport);
|
|
352
|
+
|
|
353
|
+
rpc.register('inventory:split', async (args) => {
|
|
354
|
+
const { slot } = args as { slot: number };
|
|
355
|
+
// Call engine via gRPC...
|
|
356
|
+
const result = await engineConnection.splitItem(playerId, slot);
|
|
357
|
+
// Push update back to browser
|
|
358
|
+
rpc.trigger('inventory:update', { items: result.items });
|
|
359
|
+
return { success: true };
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
## Subpath Exports
|
|
365
|
+
|
|
366
|
+
| Import path | Description |
|
|
367
|
+
|---|---|
|
|
368
|
+
| `@vicerp/rpc` | Core: `Rpc`, `RpcRelay`, types, errors |
|
|
369
|
+
| `@vicerp/rpc/rage/browser` | RAGE:MP CEF browser transport |
|
|
370
|
+
| `@vicerp/rpc/rage/client` | RAGE:MP client transport (client <-> browser) |
|
|
371
|
+
| `@vicerp/rpc/rage/client-server` | RAGE:MP client transport (client <-> server) |
|
|
372
|
+
| `@vicerp/rpc/rage/server` | RAGE:MP server transport hub + per-player transport |
|
|
373
|
+
| `@vicerp/rpc/fivem/nui` | FiveM NUI browser transport |
|
|
374
|
+
| `@vicerp/rpc/fivem/client` | FiveM client transport (client <-> NUI) |
|
|
375
|
+
| `@vicerp/rpc/fivem/client-server` | FiveM client transport (client <-> server) |
|
|
376
|
+
| `@vicerp/rpc/fivem/server` | FiveM server transport hub + per-player transport |
|
|
377
|
+
| `@vicerp/rpc/react` | React hooks and provider |
|
|
378
|
+
|
|
379
|
+
## Development
|
|
380
|
+
|
|
381
|
+
```bash
|
|
382
|
+
# Install dependencies
|
|
383
|
+
npm install
|
|
384
|
+
|
|
385
|
+
# Run tests
|
|
386
|
+
npm test
|
|
387
|
+
|
|
388
|
+
# Run tests in watch mode
|
|
389
|
+
npm run test:watch
|
|
390
|
+
|
|
391
|
+
# Run tests with coverage
|
|
392
|
+
npm run test:cov
|
|
393
|
+
|
|
394
|
+
# Build (CJS + ESM)
|
|
395
|
+
npm run build
|
|
396
|
+
|
|
397
|
+
# Clean build output
|
|
398
|
+
npm run clean
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
## Publishing
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
# From libs/vice/rpc directory:
|
|
405
|
+
npm publish --access public
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
The `prepublishOnly` script automatically runs `clean`, `build`, and `test` before publishing.
|
|
409
|
+
|
|
410
|
+
## License
|
|
411
|
+
|
|
412
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-server.d.ts","sourceRoot":"","sources":["../../../../src/adapters/fivem/client-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,mBAAmB,eAAe,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FiveMClientServerTransport = void 0;
|
|
4
|
+
var fivem_client_server_transport_1 = require("./fivem-client-server.transport");
|
|
5
|
+
Object.defineProperty(exports, "FiveMClientServerTransport", { enumerable: true, get: function () { return fivem_client_server_transport_1.FiveMClientServerTransport; } });
|
|
6
|
+
//# sourceMappingURL=client-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-server.js","sourceRoot":"","sources":["../../../../src/adapters/fivem/client-server.ts"],"names":[],"mappings":";;;AAAA,iFAA6E;AAApE,2IAAA,0BAA0B,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/adapters/fivem/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,mBAAmB,eAAe,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FiveMClientTransport = void 0;
|
|
4
|
+
var fivem_client_transport_1 = require("./fivem-client.transport");
|
|
5
|
+
Object.defineProperty(exports, "FiveMClientTransport", { enumerable: true, get: function () { return fivem_client_transport_1.FiveMClientTransport; } });
|
|
6
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/adapters/fivem/client.ts"],"names":[],"mappings":";;;AAAA,mEAAgE;AAAvD,8HAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RpcTransport, RpcMessage } from '../../core/types';
|
|
2
|
+
import { FiveMClientGlobal } from './fivem.types';
|
|
3
|
+
/**
|
|
4
|
+
* FiveM client script transport for client <-> server communication.
|
|
5
|
+
*
|
|
6
|
+
* Sends messages to the server via TriggerServerEvent().
|
|
7
|
+
* Receives messages from the server via on().
|
|
8
|
+
*/
|
|
9
|
+
export declare class FiveMClientServerTransport implements RpcTransport {
|
|
10
|
+
private readonly fivem;
|
|
11
|
+
private handler;
|
|
12
|
+
constructor(fivem: FiveMClientGlobal);
|
|
13
|
+
send(message: RpcMessage): void;
|
|
14
|
+
onMessage(handler: (message: RpcMessage) => void): void;
|
|
15
|
+
destroy(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=fivem-client-server.transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fivem-client-server.transport.d.ts","sourceRoot":"","sources":["../../../../src/adapters/fivem/fivem-client-server.transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAKlD;;;;;GAKG;AACH,qBAAa,0BAA2B,YAAW,YAAY;IAGjD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,OAAO,CAAgD;gBAElC,KAAK,EAAE,iBAAiB;IAarD,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAK/B,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAIvD,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FiveMClientServerTransport = void 0;
|
|
4
|
+
const C2S_EVENT = '__vicerpc:c2s';
|
|
5
|
+
const S2C_EVENT = '__vicerpc:s2c';
|
|
6
|
+
/**
|
|
7
|
+
* FiveM client script transport for client <-> server communication.
|
|
8
|
+
*
|
|
9
|
+
* Sends messages to the server via TriggerServerEvent().
|
|
10
|
+
* Receives messages from the server via on().
|
|
11
|
+
*/
|
|
12
|
+
class FiveMClientServerTransport {
|
|
13
|
+
fivem;
|
|
14
|
+
handler = null;
|
|
15
|
+
constructor(fivem) {
|
|
16
|
+
this.fivem = fivem;
|
|
17
|
+
this.fivem.on(S2C_EVENT, (_json) => {
|
|
18
|
+
if (!this.handler)
|
|
19
|
+
return;
|
|
20
|
+
try {
|
|
21
|
+
const json = typeof _json === 'string' ? _json : String(_json);
|
|
22
|
+
const message = JSON.parse(json);
|
|
23
|
+
this.handler(message);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Ignore malformed messages
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
send(message) {
|
|
31
|
+
const json = JSON.stringify(message);
|
|
32
|
+
this.fivem.TriggerServerEvent(C2S_EVENT, json);
|
|
33
|
+
}
|
|
34
|
+
onMessage(handler) {
|
|
35
|
+
this.handler = handler;
|
|
36
|
+
}
|
|
37
|
+
destroy() {
|
|
38
|
+
this.handler = null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.FiveMClientServerTransport = FiveMClientServerTransport;
|
|
42
|
+
//# sourceMappingURL=fivem-client-server.transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fivem-client-server.transport.js","sourceRoot":"","sources":["../../../../src/adapters/fivem/fivem-client-server.transport.ts"],"names":[],"mappings":";;;AAGA,MAAM,SAAS,GAAG,eAAe,CAAC;AAClC,MAAM,SAAS,GAAG,eAAe,CAAC;AAElC;;;;;GAKG;AACH,MAAa,0BAA0B;IAGR;IAFrB,OAAO,GAA2C,IAAI,CAAC;IAE/D,YAA6B,KAAwB;QAAxB,UAAK,GAAL,KAAK,CAAmB;QACnD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAc,EAAE,EAAE;YAC1C,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;gBAC/C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAmB;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,SAAS,CAAC,OAAsC;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF;AA5BD,gEA4BC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RpcTransport, RpcMessage } from '../../core/types';
|
|
2
|
+
import { FiveMClientGlobal } from './fivem.types';
|
|
3
|
+
/**
|
|
4
|
+
* FiveM client script side transport.
|
|
5
|
+
*
|
|
6
|
+
* Sends messages to the NUI browser via SendNUIMessage.
|
|
7
|
+
* Receives messages from the NUI browser via RegisterNUICallback.
|
|
8
|
+
*/
|
|
9
|
+
export declare class FiveMClientTransport implements RpcTransport {
|
|
10
|
+
private readonly fivem;
|
|
11
|
+
private handler;
|
|
12
|
+
constructor(fivem: FiveMClientGlobal);
|
|
13
|
+
send(message: RpcMessage): void;
|
|
14
|
+
onMessage(handler: (message: RpcMessage) => void): void;
|
|
15
|
+
destroy(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=fivem-client.transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fivem-client.transport.d.ts","sourceRoot":"","sources":["../../../../src/adapters/fivem/fivem-client.transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAKlD;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IAG3C,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,OAAO,CAAgD;gBAElC,KAAK,EAAE,iBAAiB;IAcrD,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAO/B,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAIvD,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FiveMClientTransport = void 0;
|
|
4
|
+
const RPC_ENDPOINT = '__vicerpc';
|
|
5
|
+
const RPC_MARKER = '__vicerpc';
|
|
6
|
+
/**
|
|
7
|
+
* FiveM client script side transport.
|
|
8
|
+
*
|
|
9
|
+
* Sends messages to the NUI browser via SendNUIMessage.
|
|
10
|
+
* Receives messages from the NUI browser via RegisterNUICallback.
|
|
11
|
+
*/
|
|
12
|
+
class FiveMClientTransport {
|
|
13
|
+
fivem;
|
|
14
|
+
handler = null;
|
|
15
|
+
constructor(fivem) {
|
|
16
|
+
this.fivem = fivem;
|
|
17
|
+
this.fivem.RegisterNUICallback(RPC_ENDPOINT, (data, cb) => {
|
|
18
|
+
if (this.handler) {
|
|
19
|
+
try {
|
|
20
|
+
const message = data;
|
|
21
|
+
this.handler(message);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Ignore malformed messages
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
cb({ ok: true });
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
send(message) {
|
|
31
|
+
this.fivem.SendNUIMessage({
|
|
32
|
+
[RPC_MARKER]: true,
|
|
33
|
+
payload: message,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
onMessage(handler) {
|
|
37
|
+
this.handler = handler;
|
|
38
|
+
}
|
|
39
|
+
destroy() {
|
|
40
|
+
this.handler = null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.FiveMClientTransport = FiveMClientTransport;
|
|
44
|
+
//# sourceMappingURL=fivem-client.transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fivem-client.transport.js","sourceRoot":"","sources":["../../../../src/adapters/fivem/fivem-client.transport.ts"],"names":[],"mappings":";;;AAGA,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,UAAU,GAAG,WAAW,CAAC;AAE/B;;;;;GAKG;AACH,MAAa,oBAAoB;IAGF;IAFrB,OAAO,GAA2C,IAAI,CAAC;IAE/D,YAA6B,KAAwB;QAAxB,UAAK,GAAL,KAAK,CAAmB;QACnD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAY,EAAE,CAAC,IAAa,EAAE,EAA6B,EAAE,EAAE;YAC5F,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAkB,CAAC;oBACnC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC;oBACP,4BAA4B;gBAC9B,CAAC;YACH,CAAC;YACD,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAmB;QACtB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;YACxB,CAAC,UAAU,CAAC,EAAE,IAAI;YAClB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,OAAsC;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF;AA/BD,oDA+BC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RpcTransport, RpcMessage } from '../../core/types';
|
|
2
|
+
/**
|
|
3
|
+
* FiveM NUI (browser) side transport.
|
|
4
|
+
*
|
|
5
|
+
* Sends messages to the client script via fetch POST to the resource endpoint.
|
|
6
|
+
* Receives messages from the client script via window message events.
|
|
7
|
+
*/
|
|
8
|
+
export declare class FiveMNuiTransport implements RpcTransport {
|
|
9
|
+
private handler;
|
|
10
|
+
private messageListener;
|
|
11
|
+
private resourceName;
|
|
12
|
+
constructor();
|
|
13
|
+
send(message: RpcMessage): void;
|
|
14
|
+
onMessage(handler: (message: RpcMessage) => void): void;
|
|
15
|
+
destroy(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=fivem-nui.transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fivem-nui.transport.d.ts","sourceRoot":"","sources":["../../../../src/adapters/fivem/fivem-nui.transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK5D;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,OAAO,CAAgD;IAC/D,OAAO,CAAC,eAAe,CAAgD;IACvE,OAAO,CAAC,YAAY,CAAS;;IAqB7B,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAU/B,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAIvD,OAAO,IAAI,IAAI;CAOhB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FiveMNuiTransport = void 0;
|
|
4
|
+
const RPC_ENDPOINT = '__vicerpc';
|
|
5
|
+
const RPC_MARKER = '__vicerpc';
|
|
6
|
+
/**
|
|
7
|
+
* FiveM NUI (browser) side transport.
|
|
8
|
+
*
|
|
9
|
+
* Sends messages to the client script via fetch POST to the resource endpoint.
|
|
10
|
+
* Receives messages from the client script via window message events.
|
|
11
|
+
*/
|
|
12
|
+
class FiveMNuiTransport {
|
|
13
|
+
handler = null;
|
|
14
|
+
messageListener = null;
|
|
15
|
+
resourceName;
|
|
16
|
+
constructor() {
|
|
17
|
+
const win = window;
|
|
18
|
+
this.resourceName = win.GetParentResourceName?.() ?? 'vice';
|
|
19
|
+
this.messageListener = (event) => {
|
|
20
|
+
if (!this.handler)
|
|
21
|
+
return;
|
|
22
|
+
const data = event.data;
|
|
23
|
+
if (data && typeof data === 'object' && RPC_MARKER in data) {
|
|
24
|
+
try {
|
|
25
|
+
const message = data.payload;
|
|
26
|
+
this.handler(message);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Ignore malformed messages
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
window.addEventListener('message', this.messageListener);
|
|
34
|
+
}
|
|
35
|
+
send(message) {
|
|
36
|
+
fetch(`https://${this.resourceName}/${RPC_ENDPOINT}`, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: { 'Content-Type': 'application/json' },
|
|
39
|
+
body: JSON.stringify(message),
|
|
40
|
+
}).catch(() => {
|
|
41
|
+
// Ignore fetch errors (resource may not be ready)
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
onMessage(handler) {
|
|
45
|
+
this.handler = handler;
|
|
46
|
+
}
|
|
47
|
+
destroy() {
|
|
48
|
+
this.handler = null;
|
|
49
|
+
if (this.messageListener) {
|
|
50
|
+
window.removeEventListener('message', this.messageListener);
|
|
51
|
+
this.messageListener = null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.FiveMNuiTransport = FiveMNuiTransport;
|
|
56
|
+
//# sourceMappingURL=fivem-nui.transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fivem-nui.transport.js","sourceRoot":"","sources":["../../../../src/adapters/fivem/fivem-nui.transport.ts"],"names":[],"mappings":";;;AAEA,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,UAAU,GAAG,WAAW,CAAC;AAE/B;;;;;GAKG;AACH,MAAa,iBAAiB;IACpB,OAAO,GAA2C,IAAI,CAAC;IACvD,eAAe,GAA2C,IAAI,CAAC;IAC/D,YAAY,CAAS;IAE7B;QACE,MAAM,GAAG,GAAG,MAA6D,CAAC;QAC1E,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,qBAAqB,EAAE,EAAE,IAAI,MAAM,CAAC;QAE5D,IAAI,CAAC,eAAe,GAAG,CAAC,KAAmB,EAAE,EAAE;YAC7C,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;gBAC3D,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAqB,CAAC;oBAC3C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC;oBACP,4BAA4B;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,OAAmB;QACtB,KAAK,CAAC,WAAW,IAAI,CAAC,YAAY,IAAI,YAAY,EAAE,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACZ,kDAAkD;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,OAAsC;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;CACF;AA7CD,8CA6CC"}
|