@jack120/test 0.2.0 → 0.2.2
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/dist/index.d.ts +1140 -0
- package/dist/index.js +1 -2415
- package/package.json +7 -2
- package/{library/adamas-types.d.ts → types/index.d.ts} +2 -5
- package/.gitmodules +0 -3
- package/.prettierrc +0 -6
- package/.vscode/c_cpp_properties.json +0 -14
- package/.vscode/launch.json +0 -24
- package/.vscode/settings.json +0 -8
- package/CMakeLists.txt +0 -52
- package/adamas-config.json +0 -5
- package/external/CMakeLists.txt +0 -1
- package/external/Unity-NodeJS-RPC/CMakeLists.txt +0 -13
- package/external/Unity-NodeJS-RPC/README.md +0 -1
- package/external/Unity-NodeJS-RPC/RpcClient.cpp +0 -265
- package/external/Unity-NodeJS-RPC/include/RpcClient.h +0 -118
- package/external/Unity-NodeJS-RPC/main.cpp +0 -76
- package/external/Unity-NodeJS-RPC/nlohmann/json.hpp +0 -25526
- package/external/Unity-NodeJS-RPC/server/Program.cs +0 -52
- package/external/Unity-NodeJS-RPC/server/json.cs +0 -66
- package/external/Unity-NodeJS-RPC/server/rpc.cs +0 -369
- package/external/Unity-NodeJS-RPC/server/sample1.csproj +0 -10
- package/external/Unity-NodeJS-RPC/server/sample1.sln +0 -24
- package/external/Unity-NodeJS-RPC/server/unity/RpcUnity.cs.txt +0 -60
- package/index.ts +0 -36
- package/library/debug.ts +0 -7
- package/library/device.ts +0 -279
- package/library/entity.ts +0 -35
- package/library/index.ts +0 -19
- package/library/interaction/interaction.ts +0 -281
- package/library/native-bindings-osx.node +0 -0
- package/library/native-bindings-win.node +0 -0
- package/library/networking/state-sync.ts +0 -62
- package/library/physics/collider.ts +0 -252
- package/library/physics/rigidbody.ts +0 -119
- package/library/render/camera.ts +0 -172
- package/library/render/light.ts +0 -169
- package/library/render/material.ts +0 -258
- package/library/render/mesh.ts +0 -208
- package/library/render/primitives.ts +0 -76
- package/library/render/renderable.ts +0 -137
- package/library/render/renderer.ts +0 -124
- package/library/render/scene.ts +0 -89
- package/library/render/texture.ts +0 -247
- package/library/render/transform.ts +0 -259
- package/library/rpc.ts +0 -81
- package/library/utilities/base64.ts +0 -63
- package/loader-template.ts +0 -419
- package/native.cc +0 -111
- package/project.adamas.json +0 -457
- package/rusk.glb +0 -0
- package/samples/device-sample.ts +0 -30
- package/samples/interaction-sample.ts +0 -134
- package/samples/physics-sample.ts +0 -39
- package/samples/rendering-sample.ts +0 -88
- package/samples/spawn-cube.ts +0 -422
- package/samples/state-sync-sample.ts +0 -25
- package/tsconfig.json +0 -20
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jack120/test",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Adamas Typescript interface",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"compile": "npx cmake-js compile",
|
|
8
8
|
"start": "npx ts-node index.ts",
|
|
9
9
|
"format": "npx prettier . --write",
|
|
10
|
-
"esbuild": "npx esbuild library/index.ts --bundle --format=esm --outfile=dist/index.js --platform=node --external:\"*.node\" --packages=external",
|
|
10
|
+
"esbuild": "npx esbuild library/index.ts --bundle --minify --format=esm --outfile=dist/index.js --platform=node --external:\"*.node\" --packages=external",
|
|
11
11
|
"dts": "npx dts-bundle-generator -o dist/index.d.ts library/index.ts"
|
|
12
12
|
},
|
|
13
13
|
"repository": {
|
|
@@ -18,6 +18,11 @@
|
|
|
18
18
|
"bugs": {
|
|
19
19
|
"url": "https://github.com/adamas-vr/prefab-interface/issues"
|
|
20
20
|
},
|
|
21
|
+
"types": "./types/index.d.ts",
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"types"
|
|
25
|
+
],
|
|
21
26
|
"homepage": "https://github.com/adamas-vr/prefab-interface#readme",
|
|
22
27
|
"dependencies": {
|
|
23
28
|
"gl-matrix": "^3.4.4"
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
1
|
declare module "*.mat" {
|
|
4
2
|
type UUID = `${string}-${string}-${string}-${string}-${string}`;
|
|
5
3
|
const value: {
|
|
@@ -45,14 +43,13 @@ declare module "*.mat" {
|
|
|
45
43
|
}
|
|
46
44
|
|
|
47
45
|
declare module "*.tex" {
|
|
48
|
-
import { TextureFilterMode, TextureWrapMode } from "@adamas/render/texture";
|
|
49
46
|
const value: {
|
|
50
47
|
assetType: "Texture";
|
|
51
48
|
|
|
52
49
|
base64Image: string;
|
|
53
50
|
mineType: string;
|
|
54
|
-
filterMode:
|
|
55
|
-
wrapMode:
|
|
51
|
+
filterMode: number;
|
|
52
|
+
wrapMode: number;
|
|
56
53
|
};
|
|
57
54
|
export default value;
|
|
58
55
|
}
|
package/.gitmodules
DELETED
package/.prettierrc
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"configurations": [
|
|
3
|
-
{
|
|
4
|
-
"name": "MacOS",
|
|
5
|
-
"includePath": [
|
|
6
|
-
"${workspaceFolder}/**",
|
|
7
|
-
"${workspaceFolder}/node_modules/node-addon-api",
|
|
8
|
-
"~/.cmake-js/node-arm64/v22.14.0/include/node"
|
|
9
|
-
],
|
|
10
|
-
"defines": ["NAPI_VERSION=8"]
|
|
11
|
-
}
|
|
12
|
-
],
|
|
13
|
-
"version": 4
|
|
14
|
-
}
|
package/.vscode/launch.json
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// Use IntelliSense to learn about possible attributes.
|
|
3
|
-
// Hover to view descriptions of existing attributes.
|
|
4
|
-
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
5
|
-
"version": "0.2.0",
|
|
6
|
-
"configurations": [
|
|
7
|
-
{
|
|
8
|
-
"type": "cppdbg",
|
|
9
|
-
"request": "launch",
|
|
10
|
-
"name": "Debug",
|
|
11
|
-
"program": "/usr/local/bin/node",
|
|
12
|
-
"args": [
|
|
13
|
-
"-r",
|
|
14
|
-
"tsconfig-paths/register",
|
|
15
|
-
"-r",
|
|
16
|
-
"ts-node/register",
|
|
17
|
-
"--force-node-api-uncaught-exceptions-policy=true",
|
|
18
|
-
"index.ts"
|
|
19
|
-
],
|
|
20
|
-
"cwd": "${workspaceFolder}",
|
|
21
|
-
"MIMode": "lldb"
|
|
22
|
-
}
|
|
23
|
-
]
|
|
24
|
-
}
|
package/.vscode/settings.json
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
3
|
-
"prettier.configPath": ".prettierrc",
|
|
4
|
-
"editor.formatOnSave": true,
|
|
5
|
-
"editor.insertSpaces": false, // Use tabs instead of spaces
|
|
6
|
-
"editor.tabSize": 4, // Set tab size to 4
|
|
7
|
-
"editor.detectIndentation": false
|
|
8
|
-
}
|
package/CMakeLists.txt
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
cmake_minimum_required(VERSION 3.9)
|
|
2
|
-
cmake_policy(SET CMP0042 NEW)
|
|
3
|
-
set (CMAKE_CXX_STANDARD 20)
|
|
4
|
-
|
|
5
|
-
project (native-bindings)
|
|
6
|
-
include_directories(${CMAKE_JS_INC})
|
|
7
|
-
file(GLOB SOURCE_FILES "native.cc")
|
|
8
|
-
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC})
|
|
9
|
-
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
|
|
10
|
-
target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB})
|
|
11
|
-
|
|
12
|
-
# Include Node-API wrappers
|
|
13
|
-
execute_process(COMMAND node -p "require('node-addon-api').include"
|
|
14
|
-
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
15
|
-
OUTPUT_VARIABLE NODE_ADDON_API_DIR
|
|
16
|
-
)
|
|
17
|
-
string(REGEX REPLACE "[\r\n\"]" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})
|
|
18
|
-
|
|
19
|
-
target_include_directories(${PROJECT_NAME} PRIVATE ${NODE_ADDON_API_DIR})
|
|
20
|
-
|
|
21
|
-
message("-- CMAKE_JS_INC: ${CMAKE_JS_INC}")
|
|
22
|
-
message("-- NODE_ADDON_API_DIR: ${NODE_ADDON_API_DIR}")
|
|
23
|
-
|
|
24
|
-
# define NAPI_VERSION
|
|
25
|
-
add_definitions(-DNAPI_VERSION=8)
|
|
26
|
-
|
|
27
|
-
# Set output directory for post-build copy
|
|
28
|
-
set(OUTPUT_DIR "${CMAKE_SOURCE_DIR}/library")
|
|
29
|
-
|
|
30
|
-
# Ensure the output directory exists
|
|
31
|
-
file(MAKE_DIRECTORY ${OUTPUT_DIR})
|
|
32
|
-
|
|
33
|
-
if(WIN32)
|
|
34
|
-
set(PLATFORM_SUFFIX "-win")
|
|
35
|
-
elseif(APPLE)
|
|
36
|
-
set(PLATFORM_SUFFIX "-osx")
|
|
37
|
-
endif()
|
|
38
|
-
|
|
39
|
-
# Define a new name with suffix
|
|
40
|
-
set(PROJECT_NAME_WITH_SUFFIX "${PROJECT_NAME}${PLATFORM_SUFFIX}")
|
|
41
|
-
|
|
42
|
-
# Copy the built .node file to the output directory after build
|
|
43
|
-
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
|
44
|
-
COMMAND ${CMAKE_COMMAND} -E copy
|
|
45
|
-
$<TARGET_FILE:${PROJECT_NAME}>
|
|
46
|
-
${OUTPUT_DIR}/${PROJECT_NAME_WITH_SUFFIX}.node
|
|
47
|
-
COMMENT "Copying ${PROJECT_NAME}.node to ${OUTPUT_DIR}"
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
add_subdirectory(external)
|
|
51
|
-
target_link_libraries(${PROJECT_NAME} rpcClient)
|
|
52
|
-
|
package/adamas-config.json
DELETED
package/external/CMakeLists.txt
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
add_subdirectory(Unity-NodeJS-RPC)
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
set(CMAKE_CXX_STANDARD 20)
|
|
2
|
-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
option(BUILD_RPC_CLIENT_TEST "Option of building RPC client test" OFF)
|
|
6
|
-
|
|
7
|
-
add_library(rpcClient RpcClient.cpp)
|
|
8
|
-
target_include_directories(rpcClient PUBLIC include .)
|
|
9
|
-
|
|
10
|
-
if (BUILD_RPC_CLIENT_TEST)
|
|
11
|
-
add_executable(rpcMain main.cpp)
|
|
12
|
-
target_link_libraries(rpcMain rpcClient)
|
|
13
|
-
endif()
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
## Works on Windows only
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
#include "RpcClient.h"
|
|
2
|
-
|
|
3
|
-
#ifdef _WIN32
|
|
4
|
-
#include <algorithm>
|
|
5
|
-
#else
|
|
6
|
-
#include <netinet/in.h>
|
|
7
|
-
#include <sys/socket.h>
|
|
8
|
-
#include <unistd.h>
|
|
9
|
-
#endif
|
|
10
|
-
|
|
11
|
-
#include <iostream>
|
|
12
|
-
|
|
13
|
-
#define SOCKET_CHECK(status) if (status < 0) \
|
|
14
|
-
{ \
|
|
15
|
-
perror("Failed: " #status "\n"); \
|
|
16
|
-
exit(EXIT_FAILURE); \
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
#define STATUS_CHECK(status, msg) if (status) \
|
|
20
|
-
{ \
|
|
21
|
-
perror("ERROR: " #msg "\n"); \
|
|
22
|
-
exit(EXIT_FAILURE); \
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
RpcClient::RpcClient(int port, bool isNode): isNode(isNode)
|
|
26
|
-
{
|
|
27
|
-
#ifdef _WIN32
|
|
28
|
-
WSADATA wsaData;
|
|
29
|
-
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
|
|
30
|
-
if (iResult != 0) {
|
|
31
|
-
throw std::runtime_error("WSAStartup failed.\n");
|
|
32
|
-
}
|
|
33
|
-
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
|
|
34
|
-
if (clientSocket == INVALID_SOCKET) {
|
|
35
|
-
WSACleanup();
|
|
36
|
-
throw std::runtime_error("Error at socket creation.\n");
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
sockaddr_in serverAddr;
|
|
40
|
-
serverAddr.sin_family = AF_INET;
|
|
41
|
-
serverAddr.sin_port = htons(port);
|
|
42
|
-
serverAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
43
|
-
|
|
44
|
-
if (connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
|
|
45
|
-
throw std::runtime_error("Socket connection failed.\n");
|
|
46
|
-
}
|
|
47
|
-
#else
|
|
48
|
-
sockaddr_in address = {};
|
|
49
|
-
address.sin_family = AF_INET;
|
|
50
|
-
address.sin_port = htons(port);
|
|
51
|
-
address.sin_addr.s_addr = INADDR_ANY;
|
|
52
|
-
|
|
53
|
-
SOCKET_CHECK((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0);
|
|
54
|
-
SOCKET_CHECK((connect(clientSocket, (struct sockaddr*)&address, sizeof(address))) < 0);
|
|
55
|
-
#endif
|
|
56
|
-
|
|
57
|
-
size_t sizeRecv = recv(clientSocket, (char*)&responseHeader, sizeof(ResponseHeader), 0);
|
|
58
|
-
STATUS_CHECK(
|
|
59
|
-
sizeRecv != sizeof(ResponseHeader) || responseHeader.bufferSize != 0,
|
|
60
|
-
"DEBUG: Error receiving client ID."
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
rpcReturnValueReady.store(false);
|
|
64
|
-
running.store(true);
|
|
65
|
-
clientId = responseHeader.clientId;
|
|
66
|
-
printf("Client ID: %d\n", clientId);
|
|
67
|
-
|
|
68
|
-
receiver = std::thread([&, isNode]()
|
|
69
|
-
{
|
|
70
|
-
while (running)
|
|
71
|
-
{
|
|
72
|
-
while (rpcReturnValueReady == true)
|
|
73
|
-
continue;
|
|
74
|
-
|
|
75
|
-
size_t sizeRecv = recv(clientSocket, (char*)&responseHeader, sizeof(ResponseHeader), MSG_WAITALL);
|
|
76
|
-
STATUS_CHECK(sizeRecv != sizeof(ResponseHeader) && running, "DEBUG: failed to recv callback header");
|
|
77
|
-
|
|
78
|
-
if (!running)
|
|
79
|
-
return;
|
|
80
|
-
|
|
81
|
-
if (responseHeader.bufferSize != 0)
|
|
82
|
-
{
|
|
83
|
-
responseArgsJson.resize(responseHeader.bufferSize);
|
|
84
|
-
|
|
85
|
-
int bytesReceived = 0;
|
|
86
|
-
while (bytesReceived < responseHeader.bufferSize)
|
|
87
|
-
{
|
|
88
|
-
int chunkSize = std::min<int>(1024, responseHeader.bufferSize - bytesReceived);
|
|
89
|
-
char* dataPtr = responseArgsJson.data() + bytesReceived;
|
|
90
|
-
int chunkBytesReceived = recv(clientSocket, dataPtr, chunkSize, 0);
|
|
91
|
-
|
|
92
|
-
STATUS_CHECK(chunkBytesReceived == -1, "Error receiving message data");
|
|
93
|
-
bytesReceived += chunkBytesReceived;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (responseHeader.msgType == ResponseHeader::MsgType::MSG_CALLBACK)
|
|
98
|
-
{
|
|
99
|
-
if (isNode)
|
|
100
|
-
std::thread(callbackHandler, responseHeader.u.callbackId, responseArgsJson).detach();
|
|
101
|
-
else
|
|
102
|
-
std::thread(ProcessCallback, callbackRegistry, responseHeader, responseArgsJson).detach();
|
|
103
|
-
}
|
|
104
|
-
else if (responseHeader.msgType == ResponseHeader::MsgType::MSG_RETURN)
|
|
105
|
-
{
|
|
106
|
-
rpcReturnValueReady = true;
|
|
107
|
-
}
|
|
108
|
-
else
|
|
109
|
-
{
|
|
110
|
-
std::runtime_error("[RPC Client] ERROR: Corrupted response header.");
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
RpcClient::~RpcClient()
|
|
117
|
-
{
|
|
118
|
-
running.store(false);
|
|
119
|
-
#ifdef _WIN32
|
|
120
|
-
closesocket(clientSocket);
|
|
121
|
-
WSACleanup();
|
|
122
|
-
#else
|
|
123
|
-
close(clientSocket);
|
|
124
|
-
#endif
|
|
125
|
-
receiver.join();
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
nlohmann::json RpcClient::Call(
|
|
129
|
-
const std::string& functionName,
|
|
130
|
-
const std::vector<std::pair<std::string, nlohmann::json>>& dataArgs,
|
|
131
|
-
const std::vector<std::pair<std::string, Callback>>& callbackArgs)
|
|
132
|
-
{
|
|
133
|
-
std::vector<std::string> keys;
|
|
134
|
-
std::vector<std::string> values;
|
|
135
|
-
|
|
136
|
-
for (const auto& [k, v] : dataArgs) {
|
|
137
|
-
keys.push_back(k);
|
|
138
|
-
values.push_back(v.dump()); // Convert json to string
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
for (const auto& [k, cb] : callbackArgs) {
|
|
142
|
-
int id = RegisterCallback(cb);
|
|
143
|
-
keys.push_back(k);
|
|
144
|
-
values.push_back(std::to_string(id));
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
nlohmann::json args;
|
|
148
|
-
args["keys"] = keys;
|
|
149
|
-
args["values"] = values;
|
|
150
|
-
|
|
151
|
-
RpcRequest rpcRequest;
|
|
152
|
-
rpcRequest.header.clientId = clientId;
|
|
153
|
-
strncpy(
|
|
154
|
-
rpcRequest.header.functionName,
|
|
155
|
-
functionName.c_str(),
|
|
156
|
-
sizeof(rpcRequest.header.functionName) - 1
|
|
157
|
-
);
|
|
158
|
-
rpcRequest.jsonArgs = args.dump();
|
|
159
|
-
rpcRequest.header.bufferSize = rpcRequest.jsonArgs.size();
|
|
160
|
-
|
|
161
|
-
return ProcessRPC(rpcRequest);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
std::string RpcClient::Call(const std::string& functionName, const std::string& jsonArgs)
|
|
165
|
-
{
|
|
166
|
-
RpcRequest rpcRequest;
|
|
167
|
-
rpcRequest.header.clientId = clientId;
|
|
168
|
-
strncpy(
|
|
169
|
-
rpcRequest.header.functionName,
|
|
170
|
-
functionName.c_str(),
|
|
171
|
-
sizeof(rpcRequest.header.functionName) - 1
|
|
172
|
-
);
|
|
173
|
-
rpcRequest.jsonArgs = jsonArgs;
|
|
174
|
-
rpcRequest.header.bufferSize = rpcRequest.jsonArgs.size();
|
|
175
|
-
|
|
176
|
-
return ProcessRPC(rpcRequest);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
void RpcClient::RegisterCallbackHandler(std::function<void(int, const std::string&)> fn)
|
|
180
|
-
{
|
|
181
|
-
callbackHandler = fn;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
int RpcClient::RegisterCallback(Callback cb)
|
|
185
|
-
{
|
|
186
|
-
int id = Call("_RPC::AllocateCallback", {{"clientId", clientId}});
|
|
187
|
-
callbackRegistry[id] = std::move(cb);
|
|
188
|
-
return id;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
void RpcClient::ProcessCallback(
|
|
192
|
-
const std::unordered_map<int, Callback>& cbRegistry,
|
|
193
|
-
const ResponseHeader& respHeader,
|
|
194
|
-
const std::string& respArgsJson)
|
|
195
|
-
{
|
|
196
|
-
auto it = cbRegistry.find(respHeader.u.callbackId);
|
|
197
|
-
|
|
198
|
-
nlohmann::json wrapped = nlohmann::json::parse(respArgsJson, nullptr, false);
|
|
199
|
-
if (it != cbRegistry.end() && !wrapped.is_discarded() &&
|
|
200
|
-
wrapped.contains("keys") && wrapped.contains("values"))
|
|
201
|
-
{
|
|
202
|
-
nlohmann::json flat;
|
|
203
|
-
|
|
204
|
-
const auto& keys = wrapped["keys"];
|
|
205
|
-
const auto& values = wrapped["values"];
|
|
206
|
-
for (size_t i = 0; i < keys.size() && i < values.size(); ++i) {
|
|
207
|
-
std::string key = keys[i];
|
|
208
|
-
std::string valStr = values[i];
|
|
209
|
-
|
|
210
|
-
// Try to parse value string as JSON
|
|
211
|
-
nlohmann::json parsedVal = nlohmann::json::parse(valStr, nullptr, false);
|
|
212
|
-
if (!parsedVal.is_discarded()) {
|
|
213
|
-
flat[key] = parsedVal;
|
|
214
|
-
} else {
|
|
215
|
-
flat[key] = valStr;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
it->second(flat); // Invoke callback with reconstructed flat object
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
nlohmann::json RpcClient::ProcessRPC(const RpcRequest& req)
|
|
224
|
-
{
|
|
225
|
-
{
|
|
226
|
-
std::lock_guard<std::mutex> RpcLock(callMutex);
|
|
227
|
-
|
|
228
|
-
size_t sizeSent = send(clientSocket, (char*)&req, sizeof(req.header), 0);
|
|
229
|
-
STATUS_CHECK(sizeSent != sizeof(req.header), "DEBUG: failed to send header");
|
|
230
|
-
|
|
231
|
-
if (req.header.bufferSize != 0)
|
|
232
|
-
{
|
|
233
|
-
int index = 0;
|
|
234
|
-
while (index < req.header.bufferSize)
|
|
235
|
-
{
|
|
236
|
-
int chunk_size = std::min<int>(1024, req.header.bufferSize - index);
|
|
237
|
-
const char* data_ptr = req.jsonArgs.c_str() + index;
|
|
238
|
-
int bytes_sent = send(clientSocket, data_ptr, chunk_size, 0);
|
|
239
|
-
|
|
240
|
-
STATUS_CHECK(bytes_sent == -1, "DEBUG: failed to send everything");
|
|
241
|
-
index += bytes_sent;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
while (rpcReturnValueReady == false)
|
|
247
|
-
continue;
|
|
248
|
-
|
|
249
|
-
printf("RPC: %s |-> %s\n", req.header.functionName, responseArgsJson.c_str());
|
|
250
|
-
|
|
251
|
-
if (isNode)
|
|
252
|
-
{
|
|
253
|
-
std::string str = responseArgsJson;
|
|
254
|
-
rpcReturnValueReady = false;
|
|
255
|
-
return str;
|
|
256
|
-
}
|
|
257
|
-
auto str = nlohmann::json::parse(responseArgsJson)["result"].get<std::string>();
|
|
258
|
-
auto retval = nlohmann::json::parse(str, nullptr, false);
|
|
259
|
-
rpcReturnValueReady = false;
|
|
260
|
-
|
|
261
|
-
if (retval.is_discarded()) {
|
|
262
|
-
return str;
|
|
263
|
-
}
|
|
264
|
-
return retval;
|
|
265
|
-
}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#ifdef _WIN32
|
|
4
|
-
#define NOMINMAX
|
|
5
|
-
#include <WinSock2.h>
|
|
6
|
-
#pragma comment(lib, "Ws2_32.lib") // Optional backup
|
|
7
|
-
#define SOCKET_TYPE SOCKET
|
|
8
|
-
#else
|
|
9
|
-
#define SOCKET_TYPE int
|
|
10
|
-
#endif
|
|
11
|
-
|
|
12
|
-
#include <string>
|
|
13
|
-
#include <functional>
|
|
14
|
-
#include <unordered_map>
|
|
15
|
-
#include <thread>
|
|
16
|
-
#include <mutex>
|
|
17
|
-
|
|
18
|
-
#include <nlohmann/json.hpp>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
struct RpcRequest
|
|
22
|
-
{
|
|
23
|
-
struct {
|
|
24
|
-
int clientId;
|
|
25
|
-
char functionName[64];
|
|
26
|
-
int bufferSize;
|
|
27
|
-
} header;
|
|
28
|
-
|
|
29
|
-
std::string jsonArgs;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
struct ResponseHeader
|
|
33
|
-
{
|
|
34
|
-
enum class MsgType {
|
|
35
|
-
MSG_CALLBACK = 0,
|
|
36
|
-
MSG_RETURN = 1
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
int clientId;
|
|
40
|
-
MsgType msgType;
|
|
41
|
-
union {
|
|
42
|
-
int callbackId;
|
|
43
|
-
int statusCode;
|
|
44
|
-
} u;
|
|
45
|
-
|
|
46
|
-
int bufferSize;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
class RpcClient
|
|
50
|
-
{
|
|
51
|
-
public:
|
|
52
|
-
static RpcClient& Get(int port = 6969, bool isNode = false)
|
|
53
|
-
{
|
|
54
|
-
static RpcClient rpcClient{GetPort(port), isNode};
|
|
55
|
-
return rpcClient;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
using Callback = std::function<void(const nlohmann::json&)>;
|
|
59
|
-
|
|
60
|
-
// Make a call with arguments and optional callbacks
|
|
61
|
-
nlohmann::json Call(
|
|
62
|
-
const std::string& functionName,
|
|
63
|
-
const std::vector<std::pair<std::string, nlohmann::json>>& dataArgs = {},
|
|
64
|
-
const std::vector<std::pair<std::string, Callback>>& callbackArgs = {}
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
std::string Call(const std::string& functionName, const std::string& jsonArgs);
|
|
68
|
-
|
|
69
|
-
void RegisterCallbackHandler(std::function<void(int, const std::string&)> fn);
|
|
70
|
-
|
|
71
|
-
int GetClientId() { return clientId; }
|
|
72
|
-
|
|
73
|
-
private:
|
|
74
|
-
RpcClient(int port, bool isNode);
|
|
75
|
-
~RpcClient();
|
|
76
|
-
|
|
77
|
-
RpcClient(const RpcClient&) = delete;
|
|
78
|
-
const RpcClient& operator=(const RpcClient&) = delete;
|
|
79
|
-
|
|
80
|
-
nlohmann::json ProcessRPC(const RpcRequest& req);
|
|
81
|
-
int RegisterCallback(Callback cb);
|
|
82
|
-
|
|
83
|
-
static void ProcessCallback(
|
|
84
|
-
const std::unordered_map<int, Callback>& cbRegistry,
|
|
85
|
-
const ResponseHeader& respHeader,
|
|
86
|
-
const std::string& respArgsJson
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
static int GetPort(int port)
|
|
90
|
-
{
|
|
91
|
-
const char* envPort = std::getenv("SERVER_PORT");
|
|
92
|
-
if (envPort != nullptr)
|
|
93
|
-
{
|
|
94
|
-
try {
|
|
95
|
-
return std::stoi(envPort);
|
|
96
|
-
} catch (...) {
|
|
97
|
-
// Invalid value in SERVER_PORT, fallback to default
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return port;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
private:
|
|
104
|
-
SOCKET_TYPE clientSocket;
|
|
105
|
-
int clientId;
|
|
106
|
-
bool isNode;
|
|
107
|
-
|
|
108
|
-
ResponseHeader responseHeader;
|
|
109
|
-
std::string responseArgsJson;
|
|
110
|
-
|
|
111
|
-
std::atomic_bool rpcReturnValueReady;
|
|
112
|
-
std::mutex callMutex;
|
|
113
|
-
std::thread receiver;
|
|
114
|
-
std::atomic_bool running;
|
|
115
|
-
|
|
116
|
-
std::function<void(int, const std::string&)> callbackHandler;
|
|
117
|
-
std::unordered_map<int, Callback> callbackRegistry;
|
|
118
|
-
};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
#include "RpcClient.h"
|
|
3
|
-
#include <iostream>
|
|
4
|
-
|
|
5
|
-
#ifdef _WIN32
|
|
6
|
-
#include <windows.h>
|
|
7
|
-
#else
|
|
8
|
-
#include <unistd.h>
|
|
9
|
-
#endif
|
|
10
|
-
|
|
11
|
-
int main() {
|
|
12
|
-
RpcClient rpcClient{};
|
|
13
|
-
|
|
14
|
-
nlohmann::json result;
|
|
15
|
-
|
|
16
|
-
result = rpcClient.Call("sub", {
|
|
17
|
-
{"a", 2},
|
|
18
|
-
{"b", 3}
|
|
19
|
-
});
|
|
20
|
-
std::cout << "[C++] sub Response: " << result << std::endl;
|
|
21
|
-
|
|
22
|
-
result = rpcClient.Call("mul", {
|
|
23
|
-
{"a", 2},
|
|
24
|
-
{"b", 23.2}
|
|
25
|
-
});
|
|
26
|
-
std::cout << "[C++] mul Response: " << result << std::endl;
|
|
27
|
-
|
|
28
|
-
result = rpcClient.Call("echo", {
|
|
29
|
-
{"text", "echo back"}
|
|
30
|
-
});
|
|
31
|
-
std::cout << "[C++] echo Response: " << result << std::endl;
|
|
32
|
-
|
|
33
|
-
result = rpcClient.Call("do_work",
|
|
34
|
-
{
|
|
35
|
-
{"input", "Hello from C++"},
|
|
36
|
-
{"delay", 3000} // simulate work on Unity side
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
{"onComplete", [](const nlohmann::json& result) {
|
|
40
|
-
std::cout << "[Callback] Received result from Unity: " << result.dump() << std::endl;
|
|
41
|
-
}}
|
|
42
|
-
});
|
|
43
|
-
std::cout << "[C++] do_work Response: " << result << std::endl;
|
|
44
|
-
|
|
45
|
-
int handle = rpcClient.Call("timer",
|
|
46
|
-
{
|
|
47
|
-
{"text", rpcClient.GetClientId()},
|
|
48
|
-
{"interval", 1000} // simulate work on Unity side
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
{"callback", [&](const nlohmann::json& result) {
|
|
52
|
-
rpcClient.Call("AddToCounter", {{"value", 1}});
|
|
53
|
-
std::cout << "[Callback] Received result from Unity: " << result.dump() << std::endl;
|
|
54
|
-
}}
|
|
55
|
-
});
|
|
56
|
-
std::cout << "[C++] Timer response: " << handle << std::endl;
|
|
57
|
-
|
|
58
|
-
#ifdef _WIN32
|
|
59
|
-
Sleep(5000);
|
|
60
|
-
#else
|
|
61
|
-
sleep(5);
|
|
62
|
-
#endif
|
|
63
|
-
|
|
64
|
-
printf("Handle ID: %d\n", handle);
|
|
65
|
-
rpcClient.Call("dispose_timer", {{"timerHandle", handle}});
|
|
66
|
-
|
|
67
|
-
return 0;
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* 1. RPC callback
|
|
71
|
-
* 2. Debug Window API
|
|
72
|
-
* 3. Basic Platform API support
|
|
73
|
-
* 4. Master process + child Process Spawn / deallocation
|
|
74
|
-
* 5. Multi-client communication using Semaphore
|
|
75
|
-
*/
|
|
76
|
-
}
|