@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.
Files changed (266) hide show
  1. package/README.md +412 -0
  2. package/dist/cjs/adapters/fivem/client-server.d.ts +3 -0
  3. package/dist/cjs/adapters/fivem/client-server.d.ts.map +1 -0
  4. package/dist/cjs/adapters/fivem/client-server.js +6 -0
  5. package/dist/cjs/adapters/fivem/client-server.js.map +1 -0
  6. package/dist/cjs/adapters/fivem/client.d.ts +3 -0
  7. package/dist/cjs/adapters/fivem/client.d.ts.map +1 -0
  8. package/dist/cjs/adapters/fivem/client.js +6 -0
  9. package/dist/cjs/adapters/fivem/client.js.map +1 -0
  10. package/dist/cjs/adapters/fivem/fivem-client-server.transport.d.ts +17 -0
  11. package/dist/cjs/adapters/fivem/fivem-client-server.transport.d.ts.map +1 -0
  12. package/dist/cjs/adapters/fivem/fivem-client-server.transport.js +42 -0
  13. package/dist/cjs/adapters/fivem/fivem-client-server.transport.js.map +1 -0
  14. package/dist/cjs/adapters/fivem/fivem-client.transport.d.ts +17 -0
  15. package/dist/cjs/adapters/fivem/fivem-client.transport.d.ts.map +1 -0
  16. package/dist/cjs/adapters/fivem/fivem-client.transport.js +44 -0
  17. package/dist/cjs/adapters/fivem/fivem-client.transport.js.map +1 -0
  18. package/dist/cjs/adapters/fivem/fivem-nui.transport.d.ts +17 -0
  19. package/dist/cjs/adapters/fivem/fivem-nui.transport.d.ts.map +1 -0
  20. package/dist/cjs/adapters/fivem/fivem-nui.transport.js +56 -0
  21. package/dist/cjs/adapters/fivem/fivem-nui.transport.js.map +1 -0
  22. package/dist/cjs/adapters/fivem/fivem-server.transport.d.ts +34 -0
  23. package/dist/cjs/adapters/fivem/fivem-server.transport.d.ts.map +1 -0
  24. package/dist/cjs/adapters/fivem/fivem-server.transport.js +80 -0
  25. package/dist/cjs/adapters/fivem/fivem-server.transport.js.map +1 -0
  26. package/dist/cjs/adapters/fivem/fivem.types.d.ts +18 -0
  27. package/dist/cjs/adapters/fivem/fivem.types.d.ts.map +1 -0
  28. package/dist/cjs/adapters/fivem/fivem.types.js +3 -0
  29. package/dist/cjs/adapters/fivem/fivem.types.js.map +1 -0
  30. package/dist/cjs/adapters/fivem/index.d.ts +4 -0
  31. package/dist/cjs/adapters/fivem/index.d.ts.map +1 -0
  32. package/dist/cjs/adapters/fivem/index.js +8 -0
  33. package/dist/cjs/adapters/fivem/index.js.map +1 -0
  34. package/dist/cjs/adapters/fivem/nui.d.ts +3 -0
  35. package/dist/cjs/adapters/fivem/nui.d.ts.map +1 -0
  36. package/dist/cjs/adapters/fivem/nui.js +6 -0
  37. package/dist/cjs/adapters/fivem/nui.js.map +1 -0
  38. package/dist/cjs/adapters/fivem/server.d.ts +3 -0
  39. package/dist/cjs/adapters/fivem/server.d.ts.map +1 -0
  40. package/dist/cjs/adapters/fivem/server.js +7 -0
  41. package/dist/cjs/adapters/fivem/server.js.map +1 -0
  42. package/dist/cjs/adapters/rage/browser.d.ts +3 -0
  43. package/dist/cjs/adapters/rage/browser.d.ts.map +1 -0
  44. package/dist/cjs/adapters/rage/browser.js +6 -0
  45. package/dist/cjs/adapters/rage/browser.js.map +1 -0
  46. package/dist/cjs/adapters/rage/client-server.d.ts +3 -0
  47. package/dist/cjs/adapters/rage/client-server.d.ts.map +1 -0
  48. package/dist/cjs/adapters/rage/client-server.js +6 -0
  49. package/dist/cjs/adapters/rage/client-server.js.map +1 -0
  50. package/dist/cjs/adapters/rage/client.d.ts +3 -0
  51. package/dist/cjs/adapters/rage/client.d.ts.map +1 -0
  52. package/dist/cjs/adapters/rage/client.js +6 -0
  53. package/dist/cjs/adapters/rage/client.js.map +1 -0
  54. package/dist/cjs/adapters/rage/index.d.ts +4 -0
  55. package/dist/cjs/adapters/rage/index.d.ts.map +1 -0
  56. package/dist/cjs/adapters/rage/index.js +8 -0
  57. package/dist/cjs/adapters/rage/index.js.map +1 -0
  58. package/dist/cjs/adapters/rage/rage-browser.transport.d.ts +16 -0
  59. package/dist/cjs/adapters/rage/rage-browser.transport.d.ts.map +1 -0
  60. package/dist/cjs/adapters/rage/rage-browser.transport.js +44 -0
  61. package/dist/cjs/adapters/rage/rage-browser.transport.js.map +1 -0
  62. package/dist/cjs/adapters/rage/rage-client-server.transport.d.ts +18 -0
  63. package/dist/cjs/adapters/rage/rage-client-server.transport.d.ts.map +1 -0
  64. package/dist/cjs/adapters/rage/rage-client-server.transport.js +48 -0
  65. package/dist/cjs/adapters/rage/rage-client-server.transport.js.map +1 -0
  66. package/dist/cjs/adapters/rage/rage-client.transport.d.ts +19 -0
  67. package/dist/cjs/adapters/rage/rage-client.transport.d.ts.map +1 -0
  68. package/dist/cjs/adapters/rage/rage-client.transport.js +50 -0
  69. package/dist/cjs/adapters/rage/rage-client.transport.js.map +1 -0
  70. package/dist/cjs/adapters/rage/rage-server.transport.d.ts +32 -0
  71. package/dist/cjs/adapters/rage/rage-server.transport.d.ts.map +1 -0
  72. package/dist/cjs/adapters/rage/rage-server.transport.js +82 -0
  73. package/dist/cjs/adapters/rage/rage-server.transport.js.map +1 -0
  74. package/dist/cjs/adapters/rage/rage.types.d.ts +34 -0
  75. package/dist/cjs/adapters/rage/rage.types.d.ts.map +1 -0
  76. package/dist/cjs/adapters/rage/rage.types.js +3 -0
  77. package/dist/cjs/adapters/rage/rage.types.js.map +1 -0
  78. package/dist/cjs/adapters/rage/server.d.ts +3 -0
  79. package/dist/cjs/adapters/rage/server.d.ts.map +1 -0
  80. package/dist/cjs/adapters/rage/server.js +7 -0
  81. package/dist/cjs/adapters/rage/server.js.map +1 -0
  82. package/dist/cjs/core/errors.d.ts +7 -0
  83. package/dist/cjs/core/errors.d.ts.map +1 -0
  84. package/dist/cjs/core/errors.js +18 -0
  85. package/dist/cjs/core/errors.js.map +1 -0
  86. package/dist/cjs/core/id.d.ts +2 -0
  87. package/dist/cjs/core/id.d.ts.map +1 -0
  88. package/dist/cjs/core/id.js +13 -0
  89. package/dist/cjs/core/id.js.map +1 -0
  90. package/dist/cjs/core/index.d.ts +6 -0
  91. package/dist/cjs/core/index.d.ts.map +1 -0
  92. package/dist/cjs/core/index.js +26 -0
  93. package/dist/cjs/core/index.js.map +1 -0
  94. package/dist/cjs/core/relay.d.ts +12 -0
  95. package/dist/cjs/core/relay.d.ts.map +1 -0
  96. package/dist/cjs/core/relay.js +23 -0
  97. package/dist/cjs/core/relay.js.map +1 -0
  98. package/dist/cjs/core/rpc.d.ts +21 -0
  99. package/dist/cjs/core/rpc.d.ts.map +1 -0
  100. package/dist/cjs/core/rpc.js +147 -0
  101. package/dist/cjs/core/rpc.js.map +1 -0
  102. package/dist/cjs/core/types.d.ts +30 -0
  103. package/dist/cjs/core/types.d.ts.map +1 -0
  104. package/dist/cjs/core/types.js +3 -0
  105. package/dist/cjs/core/types.js.map +1 -0
  106. package/dist/cjs/index.d.ts +2 -0
  107. package/dist/cjs/index.d.ts.map +1 -0
  108. package/dist/cjs/index.js +18 -0
  109. package/dist/cjs/index.js.map +1 -0
  110. package/dist/cjs/react/RpcProvider.d.ts +10 -0
  111. package/dist/cjs/react/RpcProvider.d.ts.map +1 -0
  112. package/dist/cjs/react/RpcProvider.js +19 -0
  113. package/dist/cjs/react/RpcProvider.js.map +1 -0
  114. package/dist/cjs/react/index.d.ts +8 -0
  115. package/dist/cjs/react/index.d.ts.map +1 -0
  116. package/dist/cjs/react/index.js +15 -0
  117. package/dist/cjs/react/index.js.map +1 -0
  118. package/dist/cjs/react/useRpc.d.ts +3 -0
  119. package/dist/cjs/react/useRpc.d.ts.map +1 -0
  120. package/dist/cjs/react/useRpc.js +13 -0
  121. package/dist/cjs/react/useRpc.js.map +1 -0
  122. package/dist/cjs/react/useRpcCall.d.ts +13 -0
  123. package/dist/cjs/react/useRpcCall.d.ts.map +1 -0
  124. package/dist/cjs/react/useRpcCall.js +35 -0
  125. package/dist/cjs/react/useRpcCall.js.map +1 -0
  126. package/dist/cjs/react/useRpcEvent.d.ts +3 -0
  127. package/dist/cjs/react/useRpcEvent.d.ts.map +1 -0
  128. package/dist/cjs/react/useRpcEvent.js +20 -0
  129. package/dist/cjs/react/useRpcEvent.js.map +1 -0
  130. package/dist/cjs/react/useRpcRegister.d.ts +3 -0
  131. package/dist/cjs/react/useRpcRegister.d.ts.map +1 -0
  132. package/dist/cjs/react/useRpcRegister.js +20 -0
  133. package/dist/cjs/react/useRpcRegister.js.map +1 -0
  134. package/dist/esm/adapters/fivem/client-server.d.ts +3 -0
  135. package/dist/esm/adapters/fivem/client-server.d.ts.map +1 -0
  136. package/dist/esm/adapters/fivem/client-server.js +2 -0
  137. package/dist/esm/adapters/fivem/client-server.js.map +1 -0
  138. package/dist/esm/adapters/fivem/client.d.ts +3 -0
  139. package/dist/esm/adapters/fivem/client.d.ts.map +1 -0
  140. package/dist/esm/adapters/fivem/client.js +2 -0
  141. package/dist/esm/adapters/fivem/client.js.map +1 -0
  142. package/dist/esm/adapters/fivem/fivem-client-server.transport.d.ts +17 -0
  143. package/dist/esm/adapters/fivem/fivem-client-server.transport.d.ts.map +1 -0
  144. package/dist/esm/adapters/fivem/fivem-client-server.transport.js +38 -0
  145. package/dist/esm/adapters/fivem/fivem-client-server.transport.js.map +1 -0
  146. package/dist/esm/adapters/fivem/fivem-client.transport.d.ts +17 -0
  147. package/dist/esm/adapters/fivem/fivem-client.transport.d.ts.map +1 -0
  148. package/dist/esm/adapters/fivem/fivem-client.transport.js +40 -0
  149. package/dist/esm/adapters/fivem/fivem-client.transport.js.map +1 -0
  150. package/dist/esm/adapters/fivem/fivem-nui.transport.d.ts +17 -0
  151. package/dist/esm/adapters/fivem/fivem-nui.transport.d.ts.map +1 -0
  152. package/dist/esm/adapters/fivem/fivem-nui.transport.js +52 -0
  153. package/dist/esm/adapters/fivem/fivem-nui.transport.js.map +1 -0
  154. package/dist/esm/adapters/fivem/fivem-server.transport.d.ts +34 -0
  155. package/dist/esm/adapters/fivem/fivem-server.transport.d.ts.map +1 -0
  156. package/dist/esm/adapters/fivem/fivem-server.transport.js +75 -0
  157. package/dist/esm/adapters/fivem/fivem-server.transport.js.map +1 -0
  158. package/dist/esm/adapters/fivem/fivem.types.d.ts +18 -0
  159. package/dist/esm/adapters/fivem/fivem.types.d.ts.map +1 -0
  160. package/dist/esm/adapters/fivem/fivem.types.js +2 -0
  161. package/dist/esm/adapters/fivem/fivem.types.js.map +1 -0
  162. package/dist/esm/adapters/fivem/index.d.ts +4 -0
  163. package/dist/esm/adapters/fivem/index.d.ts.map +1 -0
  164. package/dist/esm/adapters/fivem/index.js +3 -0
  165. package/dist/esm/adapters/fivem/index.js.map +1 -0
  166. package/dist/esm/adapters/fivem/nui.d.ts +3 -0
  167. package/dist/esm/adapters/fivem/nui.d.ts.map +1 -0
  168. package/dist/esm/adapters/fivem/nui.js +2 -0
  169. package/dist/esm/adapters/fivem/nui.js.map +1 -0
  170. package/dist/esm/adapters/fivem/server.d.ts +3 -0
  171. package/dist/esm/adapters/fivem/server.d.ts.map +1 -0
  172. package/dist/esm/adapters/fivem/server.js +2 -0
  173. package/dist/esm/adapters/fivem/server.js.map +1 -0
  174. package/dist/esm/adapters/rage/browser.d.ts +3 -0
  175. package/dist/esm/adapters/rage/browser.d.ts.map +1 -0
  176. package/dist/esm/adapters/rage/browser.js +2 -0
  177. package/dist/esm/adapters/rage/browser.js.map +1 -0
  178. package/dist/esm/adapters/rage/client-server.d.ts +3 -0
  179. package/dist/esm/adapters/rage/client-server.d.ts.map +1 -0
  180. package/dist/esm/adapters/rage/client-server.js +2 -0
  181. package/dist/esm/adapters/rage/client-server.js.map +1 -0
  182. package/dist/esm/adapters/rage/client.d.ts +3 -0
  183. package/dist/esm/adapters/rage/client.d.ts.map +1 -0
  184. package/dist/esm/adapters/rage/client.js +2 -0
  185. package/dist/esm/adapters/rage/client.js.map +1 -0
  186. package/dist/esm/adapters/rage/index.d.ts +4 -0
  187. package/dist/esm/adapters/rage/index.d.ts.map +1 -0
  188. package/dist/esm/adapters/rage/index.js +3 -0
  189. package/dist/esm/adapters/rage/index.js.map +1 -0
  190. package/dist/esm/adapters/rage/rage-browser.transport.d.ts +16 -0
  191. package/dist/esm/adapters/rage/rage-browser.transport.d.ts.map +1 -0
  192. package/dist/esm/adapters/rage/rage-browser.transport.js +40 -0
  193. package/dist/esm/adapters/rage/rage-browser.transport.js.map +1 -0
  194. package/dist/esm/adapters/rage/rage-client-server.transport.d.ts +18 -0
  195. package/dist/esm/adapters/rage/rage-client-server.transport.d.ts.map +1 -0
  196. package/dist/esm/adapters/rage/rage-client-server.transport.js +44 -0
  197. package/dist/esm/adapters/rage/rage-client-server.transport.js.map +1 -0
  198. package/dist/esm/adapters/rage/rage-client.transport.d.ts +19 -0
  199. package/dist/esm/adapters/rage/rage-client.transport.d.ts.map +1 -0
  200. package/dist/esm/adapters/rage/rage-client.transport.js +46 -0
  201. package/dist/esm/adapters/rage/rage-client.transport.js.map +1 -0
  202. package/dist/esm/adapters/rage/rage-server.transport.d.ts +32 -0
  203. package/dist/esm/adapters/rage/rage-server.transport.d.ts.map +1 -0
  204. package/dist/esm/adapters/rage/rage-server.transport.js +77 -0
  205. package/dist/esm/adapters/rage/rage-server.transport.js.map +1 -0
  206. package/dist/esm/adapters/rage/rage.types.d.ts +34 -0
  207. package/dist/esm/adapters/rage/rage.types.d.ts.map +1 -0
  208. package/dist/esm/adapters/rage/rage.types.js +2 -0
  209. package/dist/esm/adapters/rage/rage.types.js.map +1 -0
  210. package/dist/esm/adapters/rage/server.d.ts +3 -0
  211. package/dist/esm/adapters/rage/server.d.ts.map +1 -0
  212. package/dist/esm/adapters/rage/server.js +2 -0
  213. package/dist/esm/adapters/rage/server.js.map +1 -0
  214. package/dist/esm/core/errors.d.ts +7 -0
  215. package/dist/esm/core/errors.d.ts.map +1 -0
  216. package/dist/esm/core/errors.js +13 -0
  217. package/dist/esm/core/errors.js.map +1 -0
  218. package/dist/esm/core/id.d.ts +2 -0
  219. package/dist/esm/core/id.d.ts.map +1 -0
  220. package/dist/esm/core/id.js +10 -0
  221. package/dist/esm/core/id.js.map +1 -0
  222. package/dist/esm/core/index.d.ts +6 -0
  223. package/dist/esm/core/index.d.ts.map +1 -0
  224. package/dist/esm/core/index.js +6 -0
  225. package/dist/esm/core/index.js.map +1 -0
  226. package/dist/esm/core/relay.d.ts +12 -0
  227. package/dist/esm/core/relay.d.ts.map +1 -0
  228. package/dist/esm/core/relay.js +19 -0
  229. package/dist/esm/core/relay.js.map +1 -0
  230. package/dist/esm/core/rpc.d.ts +21 -0
  231. package/dist/esm/core/rpc.d.ts.map +1 -0
  232. package/dist/esm/core/rpc.js +143 -0
  233. package/dist/esm/core/rpc.js.map +1 -0
  234. package/dist/esm/core/types.d.ts +30 -0
  235. package/dist/esm/core/types.d.ts.map +1 -0
  236. package/dist/esm/core/types.js +2 -0
  237. package/dist/esm/core/types.js.map +1 -0
  238. package/dist/esm/index.d.ts +2 -0
  239. package/dist/esm/index.d.ts.map +1 -0
  240. package/dist/esm/index.js +2 -0
  241. package/dist/esm/index.js.map +1 -0
  242. package/dist/esm/react/RpcProvider.d.ts +10 -0
  243. package/dist/esm/react/RpcProvider.d.ts.map +1 -0
  244. package/dist/esm/react/RpcProvider.js +15 -0
  245. package/dist/esm/react/RpcProvider.js.map +1 -0
  246. package/dist/esm/react/index.d.ts +8 -0
  247. package/dist/esm/react/index.d.ts.map +1 -0
  248. package/dist/esm/react/index.js +6 -0
  249. package/dist/esm/react/index.js.map +1 -0
  250. package/dist/esm/react/useRpc.d.ts +3 -0
  251. package/dist/esm/react/useRpc.d.ts.map +1 -0
  252. package/dist/esm/react/useRpc.js +10 -0
  253. package/dist/esm/react/useRpc.js.map +1 -0
  254. package/dist/esm/react/useRpcCall.d.ts +13 -0
  255. package/dist/esm/react/useRpcCall.d.ts.map +1 -0
  256. package/dist/esm/react/useRpcCall.js +32 -0
  257. package/dist/esm/react/useRpcCall.js.map +1 -0
  258. package/dist/esm/react/useRpcEvent.d.ts +3 -0
  259. package/dist/esm/react/useRpcEvent.d.ts.map +1 -0
  260. package/dist/esm/react/useRpcEvent.js +17 -0
  261. package/dist/esm/react/useRpcEvent.js.map +1 -0
  262. package/dist/esm/react/useRpcRegister.d.ts +3 -0
  263. package/dist/esm/react/useRpcRegister.d.ts.map +1 -0
  264. package/dist/esm/react/useRpcRegister.js +17 -0
  265. package/dist/esm/react/useRpcRegister.js.map +1 -0
  266. 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,3 @@
1
+ export { FiveMClientServerTransport } from './fivem-client-server.transport';
2
+ export type * from './fivem.types';
3
+ //# sourceMappingURL=client-server.d.ts.map
@@ -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,3 @@
1
+ export { FiveMClientTransport } from './fivem-client.transport';
2
+ export type * from './fivem.types';
3
+ //# sourceMappingURL=client.d.ts.map
@@ -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"}