@open-core/ragemp-adapter 0.1.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 (84) hide show
  1. package/README.md +51 -0
  2. package/dist/.tsbuildinfo/client.tsbuildinfo +1 -0
  3. package/dist/.tsbuildinfo/root.tsbuildinfo +1 -0
  4. package/dist/.tsbuildinfo/server.tsbuildinfo +1 -0
  5. package/dist/.tsbuildinfo/shared.tsbuildinfo +1 -0
  6. package/dist/client/create-ragemp-client-adapter.d.ts +9 -0
  7. package/dist/client/create-ragemp-client-adapter.js +48 -0
  8. package/dist/client/index.d.ts +9 -0
  9. package/dist/client/index.js +25 -0
  10. package/dist/client/key-maps.d.ts +9 -0
  11. package/dist/client/key-maps.js +128 -0
  12. package/dist/client/native-chat.d.ts +2 -0
  13. package/dist/client/native-chat.js +50 -0
  14. package/dist/client/ragemp-blip-bridge.d.ts +12 -0
  15. package/dist/client/ragemp-blip-bridge.js +139 -0
  16. package/dist/client/ragemp-hasher.d.ts +4 -0
  17. package/dist/client/ragemp-hasher.js +20 -0
  18. package/dist/client/ragemp-local-player-bridge.d.ts +8 -0
  19. package/dist/client/ragemp-local-player-bridge.js +26 -0
  20. package/dist/client/ragemp-log-console.d.ts +11 -0
  21. package/dist/client/ragemp-log-console.js +75 -0
  22. package/dist/client/ragemp-marker-bridge.d.ts +11 -0
  23. package/dist/client/ragemp-marker-bridge.js +57 -0
  24. package/dist/client/ragemp-notification-bridge.d.ts +5 -0
  25. package/dist/client/ragemp-notification-bridge.js +70 -0
  26. package/dist/client/ragemp-platform-bridge.d.ts +141 -0
  27. package/dist/client/ragemp-platform-bridge.js +479 -0
  28. package/dist/client/ragemp-runtime-bridge.d.ts +30 -0
  29. package/dist/client/ragemp-runtime-bridge.js +119 -0
  30. package/dist/client/ragemp-runtime-globals.d.ts +5 -0
  31. package/dist/client/ragemp-runtime-globals.js +57 -0
  32. package/dist/client/ragemp-spawn-bridge.d.ts +15 -0
  33. package/dist/client/ragemp-spawn-bridge.js +107 -0
  34. package/dist/client/ragemp-webview-bridge.d.ts +22 -0
  35. package/dist/client/ragemp-webview-bridge.js +131 -0
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.js +20 -0
  38. package/dist/server/create-ragemp-server-adapter.d.ts +9 -0
  39. package/dist/server/create-ragemp-server-adapter.js +54 -0
  40. package/dist/server/index.d.ts +11 -0
  41. package/dist/server/index.js +27 -0
  42. package/dist/server/ragemp-capabilities.d.ts +14 -0
  43. package/dist/server/ragemp-capabilities.js +36 -0
  44. package/dist/server/ragemp-engine-events.d.ts +11 -0
  45. package/dist/server/ragemp-engine-events.js +72 -0
  46. package/dist/server/ragemp-entity-server.d.ts +29 -0
  47. package/dist/server/ragemp-entity-server.js +122 -0
  48. package/dist/server/ragemp-exports.d.ts +7 -0
  49. package/dist/server/ragemp-exports.js +36 -0
  50. package/dist/server/ragemp-hasher.d.ts +7 -0
  51. package/dist/server/ragemp-hasher.js +23 -0
  52. package/dist/server/ragemp-npc-lifecycle-server.d.ts +9 -0
  53. package/dist/server/ragemp-npc-lifecycle-server.js +51 -0
  54. package/dist/server/ragemp-ped-server.d.ts +8 -0
  55. package/dist/server/ragemp-ped-server.js +37 -0
  56. package/dist/server/ragemp-player-appearance-lifecycle-server.d.ts +19 -0
  57. package/dist/server/ragemp-player-appearance-lifecycle-server.js +66 -0
  58. package/dist/server/ragemp-player-lifecycle-server.d.ts +7 -0
  59. package/dist/server/ragemp-player-lifecycle-server.js +40 -0
  60. package/dist/server/ragemp-player-server.d.ts +20 -0
  61. package/dist/server/ragemp-player-server.js +89 -0
  62. package/dist/server/ragemp-player-state-sync-server.d.ts +7 -0
  63. package/dist/server/ragemp-player-state-sync-server.js +29 -0
  64. package/dist/server/ragemp-playerinfo.d.ts +6 -0
  65. package/dist/server/ragemp-playerinfo.js +19 -0
  66. package/dist/server/ragemp-resourceinfo.d.ts +5 -0
  67. package/dist/server/ragemp-resourceinfo.js +25 -0
  68. package/dist/server/ragemp-tick.d.ts +7 -0
  69. package/dist/server/ragemp-tick.js +24 -0
  70. package/dist/server/ragemp-vehicle-lifecycle-server.d.ts +10 -0
  71. package/dist/server/ragemp-vehicle-lifecycle-server.js +57 -0
  72. package/dist/server/ragemp-vehicle-server.d.ts +15 -0
  73. package/dist/server/ragemp-vehicle-server.js +59 -0
  74. package/dist/shared/exports-registry.d.ts +29 -0
  75. package/dist/shared/exports-registry.js +87 -0
  76. package/dist/shared/transport/adapter.d.ts +8 -0
  77. package/dist/shared/transport/adapter.js +18 -0
  78. package/dist/shared/transport/helpers.d.ts +24 -0
  79. package/dist/shared/transport/helpers.js +70 -0
  80. package/dist/shared/transport/ragemp.events.d.ts +10 -0
  81. package/dist/shared/transport/ragemp.events.js +45 -0
  82. package/dist/shared/transport/ragemp.rpc.d.ts +27 -0
  83. package/dist/shared/transport/ragemp.rpc.js +181 -0
  84. package/package.json +64 -0
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RageMPRpc = void 0;
4
+ const contracts_1 = require("@open-core/framework/contracts");
5
+ const helpers_1 = require("./helpers");
6
+ function getCurrentResourceNameSafe() {
7
+ if (typeof __dirname !== 'string')
8
+ return 'default';
9
+ const parts = __dirname.replace(/\\/g, '/').split('/');
10
+ return parts[parts.length - 1] || 'default';
11
+ }
12
+ class RageMPRpc extends contracts_1.RpcAPI {
13
+ constructor(context) {
14
+ super();
15
+ this.context = context;
16
+ this.pending = new Map();
17
+ this.requestSeq = 0;
18
+ this.handlers = new Map();
19
+ this.channel = getCurrentResourceNameSafe();
20
+ this.requestEvent = `__oc:rpc:req:${this.channel}`;
21
+ this.responseEvent = `__oc:rpc:res:${this.channel}`;
22
+ this.defaultTimeoutMs = 7500;
23
+ (0, helpers_1.onNet)(context, this.requestEvent, (source, msg) => {
24
+ void this.handleRequestMessage(msg, source);
25
+ });
26
+ (0, helpers_1.onNet)(context, this.responseEvent, (_source, msg) => {
27
+ this.handleResponseMessage(msg);
28
+ });
29
+ }
30
+ on(name, handler) {
31
+ this.handlers.set(name, handler);
32
+ }
33
+ call(name, ...args) {
34
+ const { target, payload } = this.normalizeInvocation(name, 'call', args);
35
+ return this.sendAndWait({ kind: 'call', name, args: payload }, target);
36
+ }
37
+ notify(name, ...args) {
38
+ const { target, payload } = this.normalizeInvocation(name, 'notify', args);
39
+ return this.sendAndWait({ kind: 'notify', name, args: payload }, target);
40
+ }
41
+ normalizeInvocation(name, kind, args) {
42
+ if (this.context === 'server') {
43
+ if (args.length === 0) {
44
+ throw new Error(`RageMPRpc: missing target for '${kind}' '${name}' in server context`);
45
+ }
46
+ const [target, ...payload] = args;
47
+ if (!this.isValidTarget(target)) {
48
+ throw new Error(`RageMPRpc: invalid target for '${kind}' '${name}'`);
49
+ }
50
+ if (kind === 'call' && target === 'all') {
51
+ throw new Error(`RageMPRpc: target=all is not supported for call '${name}'`);
52
+ }
53
+ return { target, payload };
54
+ }
55
+ return { target: undefined, payload: args };
56
+ }
57
+ isValidTarget(value) {
58
+ if (value === 'all')
59
+ return true;
60
+ if (typeof value === 'number')
61
+ return true;
62
+ if (Array.isArray(value))
63
+ return value.every((item) => typeof item === 'number');
64
+ return false;
65
+ }
66
+ sendAndWait(input, target) {
67
+ const id = this.createRequestId();
68
+ const msg = {
69
+ kind: input.kind,
70
+ id,
71
+ name: input.name,
72
+ args: input.args ?? [],
73
+ };
74
+ return new Promise((resolve, reject) => {
75
+ const timeout = setTimeout(() => {
76
+ this.pending.delete(id);
77
+ reject(new Error(`RageMPRpc: timeout waiting for '${input.kind}' response for '${input.name}' (${id})`));
78
+ }, this.defaultTimeoutMs);
79
+ this.pending.set(id, { resolve: resolve, reject, timeout });
80
+ if (this.context === 'server') {
81
+ const resolvedTarget = this.resolveServerTarget(target, input.kind, input.name);
82
+ (0, helpers_1.emitNet)(this.context, this.requestEvent, resolvedTarget, msg);
83
+ }
84
+ else {
85
+ (0, helpers_1.emitNet)(this.context, this.requestEvent, -1, msg);
86
+ }
87
+ });
88
+ }
89
+ createRequestId() {
90
+ this.requestSeq += 1;
91
+ const ts = Date.now().toString(36);
92
+ const seq = this.requestSeq.toString(36);
93
+ const rand = Math.floor(Math.random() * 1000000000).toString(36);
94
+ return `${this.channel}:${this.context}:${ts}:${seq}:${rand}`;
95
+ }
96
+ resolveServerTarget(target, kind, name) {
97
+ if (target === undefined) {
98
+ throw new Error(`RageMPRpc: missing target for '${kind}' '${name}' in server context`);
99
+ }
100
+ if (kind === 'call' && target === 'all') {
101
+ throw new Error(`RageMPRpc: target=all is not supported for call '${name}'`);
102
+ }
103
+ if (target === 'all')
104
+ return -1;
105
+ return target;
106
+ }
107
+ async handleRequestMessage(msg, source) {
108
+ if (msg.kind !== 'call' && msg.kind !== 'notify')
109
+ return;
110
+ const handler = this.handlers.get(msg.name);
111
+ const sourceId = source?.id;
112
+ const replyTarget = this.context === 'server' ? sourceId : undefined;
113
+ if (!handler) {
114
+ if (msg.kind === 'call') {
115
+ this.emitResponse(replyTarget, {
116
+ kind: 'result',
117
+ id: msg.id,
118
+ ok: false,
119
+ error: { message: `RageMPRpc: no handler registered for '${msg.name}'` },
120
+ });
121
+ }
122
+ else {
123
+ this.emitResponse(replyTarget, { kind: 'ack', id: msg.id });
124
+ }
125
+ return;
126
+ }
127
+ try {
128
+ const result = await Promise.resolve(handler({
129
+ requestId: msg.id,
130
+ clientId: sourceId,
131
+ // raw is the PlayerMp object (analogous to FiveM's global.source).
132
+ raw: source,
133
+ }, ...msg.args));
134
+ if (msg.kind === 'notify') {
135
+ this.emitResponse(replyTarget, { kind: 'ack', id: msg.id });
136
+ }
137
+ else {
138
+ this.emitResponse(replyTarget, { kind: 'result', id: msg.id, ok: true, result });
139
+ }
140
+ }
141
+ catch (err) {
142
+ if (msg.kind === 'notify') {
143
+ this.emitResponse(replyTarget, { kind: 'ack', id: msg.id });
144
+ return;
145
+ }
146
+ this.emitResponse(replyTarget, {
147
+ kind: 'result',
148
+ id: msg.id,
149
+ ok: false,
150
+ error: {
151
+ message: err?.message ? String(err.message) : String(err),
152
+ name: err?.name ? String(err.name) : undefined,
153
+ },
154
+ });
155
+ }
156
+ }
157
+ handleResponseMessage(msg) {
158
+ if (msg.kind !== 'result' && msg.kind !== 'ack')
159
+ return;
160
+ const pending = this.pending.get(msg.id);
161
+ if (!pending)
162
+ return;
163
+ clearTimeout(pending.timeout);
164
+ this.pending.delete(msg.id);
165
+ if (msg.kind === 'ack') {
166
+ pending.resolve(undefined);
167
+ return;
168
+ }
169
+ if (msg.ok) {
170
+ pending.resolve(msg.result);
171
+ return;
172
+ }
173
+ const error = new Error(msg.error?.message ?? 'RageMPRpc: remote error');
174
+ error.name = msg.error?.name ?? error.name;
175
+ pending.reject(error);
176
+ }
177
+ emitResponse(target, msg) {
178
+ (0, helpers_1.emitNet)(this.context, this.responseEvent, target ?? -1, msg);
179
+ }
180
+ }
181
+ exports.RageMPRpc = RageMPRpc;
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@open-core/ragemp-adapter",
3
+ "version": "0.1.0",
4
+ "description": "External Rage Multiplayer adapter for OpenCore framework.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "commonjs",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js",
19
+ "require": "./dist/index.js"
20
+ },
21
+ "./server": {
22
+ "types": "./dist/server/index.d.ts",
23
+ "import": "./dist/server/index.js",
24
+ "require": "./dist/server/index.js"
25
+ },
26
+ "./client": {
27
+ "types": "./dist/client/index.d.ts",
28
+ "import": "./dist/client/index.js",
29
+ "require": "./dist/client/index.js"
30
+ },
31
+ "./package.json": "./package.json"
32
+ },
33
+ "keywords": [
34
+ "opencore",
35
+ "ragemp",
36
+ "rage-mp",
37
+ "adapter"
38
+ ],
39
+ "license": "MPL-2.0",
40
+ "dependencies": {
41
+ "@open-core/framework": "file:../opencore-framework"
42
+ },
43
+ "peerDependencies": {
44
+ "reflect-metadata": "^0.2.2",
45
+ "tsyringe": "^4.10.0",
46
+ "zod": "^4.3.5"
47
+ },
48
+ "devDependencies": {
49
+ "@biomejs/biome": "^2.3.11",
50
+ "@ragempcommunity/types-client": "^2.1.9",
51
+ "@ragempcommunity/types-server": "^2.1.9",
52
+ "@types/node": "^25.0.3",
53
+ "typescript": "^5.9.3"
54
+ },
55
+ "scripts": {
56
+ "build": "tsc -b",
57
+ "typecheck": "tsc -p src/shared/tsconfig.json --noEmit && tsc -p src/client/tsconfig.json --noEmit && tsc -p src/server/tsconfig.json --noEmit",
58
+ "build:shared": "tsc -b src/shared",
59
+ "build:client": "tsc -b src/client",
60
+ "build:server": "tsc -b src/server",
61
+ "check": "pnpm typecheck",
62
+ "format": "biome format --fix"
63
+ }
64
+ }