lliquidlink 1.0.0__tar.gz

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 (170) hide show
  1. lliquidlink-1.0.0/.github/FUNDING.yml +15 -0
  2. lliquidlink-1.0.0/.github/workflows/release.yml +77 -0
  3. lliquidlink-1.0.0/.gitignore +135 -0
  4. lliquidlink-1.0.0/CHANGELOG.md +7 -0
  5. lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/EnumConverter.cs +31 -0
  6. lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/JsonSerializerChain.cs +128 -0
  7. lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/ObjectPrimitiveConverter.cs +26 -0
  8. lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/PreObjectConverter.cs +50 -0
  9. lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/RpcJsonConverter.cs +98 -0
  10. lliquidlink-1.0.0/CSharp/LLiquidLink/Converters/TypeConverter.cs +32 -0
  11. lliquidlink-1.0.0/CSharp/LLiquidLink/Core/Logger.cs +31 -0
  12. lliquidlink-1.0.0/CSharp/LLiquidLink/Core/ObjectRegistry.cs +75 -0
  13. lliquidlink-1.0.0/CSharp/LLiquidLink/Core/TypeResolver.cs +107 -0
  14. lliquidlink-1.0.0/CSharp/LLiquidLink/Models/Schema.cs +47 -0
  15. lliquidlink-1.0.0/CSharp/LLiquidLink/RpcOptions.cs +8 -0
  16. lliquidlink-1.0.0/CSharp/LLiquidLink/RpcRegistrar.cs +512 -0
  17. lliquidlink-1.0.0/CSharp/LLiquidLink/Server.cs +252 -0
  18. lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/IMainThreadDispatcher.cs +18 -0
  19. lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/ITransportServer.cs +33 -0
  20. lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/JsonRpcFraming.cs +64 -0
  21. lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/JsonRpcProtocol.cs +86 -0
  22. lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/RpcBus.cs +386 -0
  23. lliquidlink-1.0.0/CSharp/LLiquidLink/Transports/StdioTransport.cs +178 -0
  24. lliquidlink-1.0.0/CSharp/UniLiquidLink/Converters/JsonUtilityConverter.cs +41 -0
  25. lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/InstanceObjectConverter.cs +63 -0
  26. lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/MainThreadDispatcher.cs +32 -0
  27. lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/UniLiquidLinkServer.cs +201 -0
  28. lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/UniLiquidLinkServerServer.AddConverters.cs +19 -0
  29. lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/UniLiquidLinkServerServer.AddFallbackConverters.cs +15 -0
  30. lliquidlink-1.0.0/CSharp/UniLiquidLink/Unity/UnityObjectConverter.cs +9 -0
  31. lliquidlink-1.0.0/Docs/ClassDiagram.md +359 -0
  32. lliquidlink-1.0.0/Docs/LLiquidLinkPythonAPI.md +303 -0
  33. lliquidlink-1.0.0/Docs/Server.md +474 -0
  34. lliquidlink-1.0.0/Docs/UniLiquidLinkServer.md +475 -0
  35. lliquidlink-1.0.0/LICENSE +21 -0
  36. lliquidlink-1.0.0/PKG-INFO +176 -0
  37. lliquidlink-1.0.0/Python/lliquidlink/__init__.py +9 -0
  38. lliquidlink-1.0.0/Python/lliquidlink/client/__init__.py +51 -0
  39. lliquidlink-1.0.0/Python/lliquidlink/client/_client.py +138 -0
  40. lliquidlink-1.0.0/Python/lliquidlink/client/_event.py +26 -0
  41. lliquidlink-1.0.0/Python/lliquidlink/client/_proxy.py +92 -0
  42. lliquidlink-1.0.0/Python/lliquidlink/client/_schema.py +40 -0
  43. lliquidlink-1.0.0/Python/lliquidlink/client/_serialization.py +26 -0
  44. lliquidlink-1.0.0/Python/lliquidlink/client/_transports.py +97 -0
  45. lliquidlink-1.0.0/Python/lliquidlink/client/models.py +17 -0
  46. lliquidlink-1.0.0/Python/lliquidlink/core/__init__.py +20 -0
  47. lliquidlink-1.0.0/Python/lliquidlink/core/_rpc.py +178 -0
  48. lliquidlink-1.0.0/Python/lliquidlink/server/__init__.py +29 -0
  49. lliquidlink-1.0.0/Python/lliquidlink/server/__main__.py +2 -0
  50. lliquidlink-1.0.0/Python/lliquidlink/server/_transport.py +95 -0
  51. lliquidlink-1.0.0/Python/lliquidlink/server/ipc_bridge.py +36 -0
  52. lliquidlink-1.0.0/Python/lliquidlink/server/resolver.py +204 -0
  53. lliquidlink-1.0.0/Python/lliquidlink/server/server.py +135 -0
  54. lliquidlink-1.0.0/README.ja.md +149 -0
  55. lliquidlink-1.0.0/README.md +159 -0
  56. lliquidlink-1.0.0/Samples/AllFeaturesTour/AllFeaturesTourServer.cs +197 -0
  57. lliquidlink-1.0.0/Samples/AllFeaturesTour/AllFeaturesTourServerReload.cs +39 -0
  58. lliquidlink-1.0.0/Samples/AllFeaturesTour/AllFeaturesTourServerWindow.cs +52 -0
  59. lliquidlink-1.0.0/Samples/AllFeaturesTour/all_features_tour.py +130 -0
  60. lliquidlink-1.0.0/Samples/AllFeaturesTour/run_middleware_server.py +31 -0
  61. lliquidlink-1.0.0/Samples/CubeDemo/CubeDemoServer.cs +68 -0
  62. lliquidlink-1.0.0/Samples/CubeDemo/CubeDemoServerReload.cs +39 -0
  63. lliquidlink-1.0.0/Samples/CubeDemo/CubeDemoServerWindow.cs +52 -0
  64. lliquidlink-1.0.0/Samples/CubeDemo/create_and_rotate_cube.py +35 -0
  65. lliquidlink-1.0.0/Samples/CubeDemo/run_middleware_server.py +31 -0
  66. lliquidlink-1.0.0/Tests/CSharp/ConverterTests.cs +219 -0
  67. lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/.gitkeep +0 -0
  68. lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_find.json +1 -0
  69. lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_resolve_chain_chained_step.json +1 -0
  70. lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_resolve_chain_get_transform.json +1 -0
  71. lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_resolve_chain_rotate.json +1 -0
  72. lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_resolve_chain_set_position.json +1 -0
  73. lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_sample_method_int.json +1 -0
  74. lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_sample_vector3.json +1 -0
  75. lliquidlink-1.0.0/Tests/CSharp/GoldenFiles/golden_unknown_method_error.json +1 -0
  76. lliquidlink-1.0.0/Tests/CSharp/JsonRpcProtocolTests.cs +53 -0
  77. lliquidlink-1.0.0/Tests/CSharp/JsonSerializerChainTests.cs +218 -0
  78. lliquidlink-1.0.0/Tests/CSharp/JsonUtilityConverterTests.cs +132 -0
  79. lliquidlink-1.0.0/Tests/CSharp/ObjectRegistryTests.cs +86 -0
  80. lliquidlink-1.0.0/Tests/CSharp/RpcBusDispatchTests.cs +102 -0
  81. lliquidlink-1.0.0/Tests/CSharp/RpcBusSerializationTests.cs +157 -0
  82. lliquidlink-1.0.0/Tests/CSharp/RpcIntegrationTests.cs +141 -0
  83. lliquidlink-1.0.0/Tests/CSharp/RpcRegistrarAllTests.cs +451 -0
  84. lliquidlink-1.0.0/Tests/CSharp/TypeResolverTests.cs +77 -0
  85. lliquidlink-1.0.0/Tests/CSharp/golden/handle_call_unknown_method_response.json +5 -0
  86. lliquidlink-1.0.0/Tests/CSharp/golden/handle_getproperty_missing_object_response.json +5 -0
  87. lliquidlink-1.0.0/Tests/CSharp/golden/handle_invoke_missing_object_response.json +5 -0
  88. lliquidlink-1.0.0/Tests/CSharp/golden/handle_resolvechain_missing_object_response.json +5 -0
  89. lliquidlink-1.0.0/Tests/CSharp/golden/parse_value_multiple_types.json +10 -0
  90. lliquidlink-1.0.0/Tests/CSharp/golden/serialize_result_primitives.json +8 -0
  91. lliquidlink-1.0.0/Tests/CSharp/golden/serialize_result_unity_object.json +6 -0
  92. lliquidlink-1.0.0/Tests/CSharpUtils/GenerateRpcGolden.cs +101 -0
  93. lliquidlink-1.0.0/Tests/CSharpUtils/IntegrationTestServerReload.cs +38 -0
  94. lliquidlink-1.0.0/Tests/CSharpUtils/IntegrationTestServerWindow.cs +52 -0
  95. lliquidlink-1.0.0/Tests/CSharpUtils/ListLogger.cs +38 -0
  96. lliquidlink-1.0.0/Tests/CSharpUtils/NullTransport.cs +28 -0
  97. lliquidlink-1.0.0/Tests/CSharpUtils/RpcTestContext.cs +95 -0
  98. lliquidlink-1.0.0/Tests/CSharpUtils/Sample2.txt +213 -0
  99. lliquidlink-1.0.0/Tests/CSharpUtils/SetupIntegrationTest.cs +76 -0
  100. lliquidlink-1.0.0/Tests/CSharpUtils/UEAssert.cs +84 -0
  101. lliquidlink-1.0.0/Tests/CSharpUtils/UniLiquidLinkIntegrationTest.cs +206 -0
  102. lliquidlink-1.0.0/Tests/CSharpUtils/UniLiquidLinkServerTestHelper.cs +48 -0
  103. lliquidlink-1.0.0/Tests/Python/conftest.py +40 -0
  104. lliquidlink-1.0.0/Tests/Python/generate_integration_golden.py +28 -0
  105. lliquidlink-1.0.0/Tests/Python/generate_test_integration.py +75 -0
  106. lliquidlink-1.0.0/Tests/Python/golden/add_abbreviated_namespaces.json +4 -0
  107. lliquidlink-1.0.0/Tests/Python/golden/call_unknown_method.json +1 -0
  108. lliquidlink-1.0.0/Tests/Python/golden/chained_game_object.json +4 -0
  109. lliquidlink-1.0.0/Tests/Python/golden/find_test_game_object.json +4 -0
  110. lliquidlink-1.0.0/Tests/Python/golden/find_test_object.json +4 -0
  111. lliquidlink-1.0.0/Tests/Python/golden/get_transform.json +4 -0
  112. lliquidlink-1.0.0/Tests/Python/golden/load_asset_database.json +4 -0
  113. lliquidlink-1.0.0/Tests/Python/golden/load_asset_with_type.json +4 -0
  114. lliquidlink-1.0.0/Tests/Python/golden/nested_static_class.json +1 -0
  115. lliquidlink-1.0.0/Tests/Python/golden/object_method.json +4 -0
  116. lliquidlink-1.0.0/Tests/Python/golden/object_overload.json +10 -0
  117. lliquidlink-1.0.0/Tests/Python/golden/object_properties.json +8 -0
  118. lliquidlink-1.0.0/Tests/Python/golden/rotate.json +1 -0
  119. lliquidlink-1.0.0/Tests/Python/golden/sample_enum.json +4 -0
  120. lliquidlink-1.0.0/Tests/Python/golden/sample_game_object.json +4 -0
  121. lliquidlink-1.0.0/Tests/Python/golden/sample_game_object_array.json +10 -0
  122. lliquidlink-1.0.0/Tests/Python/golden/sample_game_object_dict.json +10 -0
  123. lliquidlink-1.0.0/Tests/Python/golden/sample_game_object_list.json +10 -0
  124. lliquidlink-1.0.0/Tests/Python/golden/sample_method_int.json +1 -0
  125. lliquidlink-1.0.0/Tests/Python/golden/sample_method_int_str.json +1 -0
  126. lliquidlink-1.0.0/Tests/Python/golden/sample_primitive_object_bool.json +1 -0
  127. lliquidlink-1.0.0/Tests/Python/golden/sample_primitive_object_int.json +1 -0
  128. lliquidlink-1.0.0/Tests/Python/golden/sample_primitive_object_string.json +1 -0
  129. lliquidlink-1.0.0/Tests/Python/golden/sample_vector3.json +5 -0
  130. lliquidlink-1.0.0/Tests/Python/golden/sample_vector3_array.json +12 -0
  131. lliquidlink-1.0.0/Tests/Python/golden/sample_vector3_dict.json +12 -0
  132. lliquidlink-1.0.0/Tests/Python/golden/sample_vector3_list.json +12 -0
  133. lliquidlink-1.0.0/Tests/Python/golden/set_abbreviated_classes.json +1 -0
  134. lliquidlink-1.0.0/Tests/Python/golden/set_abbreviated_classes_find.json +4 -0
  135. lliquidlink-1.0.0/Tests/Python/golden/set_transform_position.json +5 -0
  136. lliquidlink-1.0.0/Tests/Python/golden/transform_position.json +5 -0
  137. lliquidlink-1.0.0/Tests/Python/golden/transform_rotate.json +1 -0
  138. lliquidlink-1.0.0/Tests/Python/integration_client.py +198 -0
  139. lliquidlink-1.0.0/Tests/Python/test_client_tcp.py +141 -0
  140. lliquidlink-1.0.0/Tests/Python/test_event.py +51 -0
  141. lliquidlink-1.0.0/Tests/Python/test_integration.py +141 -0
  142. lliquidlink-1.0.0/Tests/Python/test_rpc_peer.py +82 -0
  143. lliquidlink-1.0.0/Tests/Python/test_serialize_list.py +56 -0
  144. lliquidlink-1.0.0/Tests/Python/test_server.py +502 -0
  145. lliquidlink-1.0.0/Tests/Python/test_stdio.py +49 -0
  146. lliquidlink-1.0.0/UniLiquidLink.asmdef +18 -0
  147. lliquidlink-1.0.0/pyproject.toml +40 -0
  148. lliquidlink-1.0.0/tools/convert_j2_block_comments.py +76 -0
  149. lliquidlink-1.0.0/tools/generate_class_diagram.py +475 -0
  150. lliquidlink-1.0.0/tools/generate_common.py +45 -0
  151. lliquidlink-1.0.0/tools/generate_converters.py +33 -0
  152. lliquidlink-1.0.0/tools/generate_converters_csv.py +12 -0
  153. lliquidlink-1.0.0/tools/generate_docs.py +312 -0
  154. lliquidlink-1.0.0/tools/generate_fallback_converters.py +36 -0
  155. lliquidlink-1.0.0/tools/generate_python_docs.py +317 -0
  156. lliquidlink-1.0.0/tools/generate_schema.py +327 -0
  157. lliquidlink-1.0.0/tools/kill_port.py +59 -0
  158. lliquidlink-1.0.0/tools/make.py +20 -0
  159. lliquidlink-1.0.0/tools/plantuml_pandoc_filter.py +41 -0
  160. lliquidlink-1.0.0/tools/schema/__init__.py +2 -0
  161. lliquidlink-1.0.0/tools/schema/codegen.py +152 -0
  162. lliquidlink-1.0.0/tools/schema/converters.py +50 -0
  163. lliquidlink-1.0.0/tools/schema/fallback_converters.py +47 -0
  164. lliquidlink-1.0.0/tools/schema_def.py +62 -0
  165. lliquidlink-1.0.0/tools/templates/add_chain_converters.cs.j2 +21 -0
  166. lliquidlink-1.0.0/tools/templates/add_converters.cs.j2 +22 -0
  167. lliquidlink-1.0.0/tools/templates/fallback_converter.cs.j2 +57 -0
  168. lliquidlink-1.0.0/tools/templates/rpc_converter.cs.j2 +111 -0
  169. lliquidlink-1.0.0/tools/unity_mcp_server.py +168 -0
  170. lliquidlink-1.0.0/tools/unity_server.py +17 -0
@@ -0,0 +1,15 @@
1
+ # These are supported funding model platforms
2
+
3
+ github: hide00310 # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4
+ patreon: # Replace with a single Patreon username
5
+ open_collective: # Replace with a single Open Collective username
6
+ ko_fi: # Replace with a single Ko-fi username
7
+ tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8
+ community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9
+ liberapay: # Replace with a single Liberapay username
10
+ issuehunt: # Replace with a single IssueHunt username
11
+ lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
12
+ polar: # Replace with a single Polar username
13
+ buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
14
+ thanks_dev: # Replace with a single thanks.dev username
15
+ custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
@@ -0,0 +1,77 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.13"
21
+
22
+ - name: Install package with test dependencies
23
+ run: pip install .[test]
24
+
25
+ - name: Run unit tests (Unity-independent only)
26
+ # test_integration.py requires a running Unity Editor with the
27
+ # Integration Test Server started, so it cannot run in CI.
28
+ run: pytest --ignore=Tests/Python/test_integration.py
29
+
30
+ release:
31
+ needs: test
32
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
33
+ runs-on: ubuntu-latest
34
+ permissions:
35
+ contents: write
36
+ outputs:
37
+ released: ${{ steps.release.outputs.released }}
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+ with:
41
+ fetch-depth: 0
42
+
43
+ - uses: actions/setup-python@v5
44
+ with:
45
+ python-version: "3.13"
46
+
47
+ - name: Install python-semantic-release
48
+ run: pip install python-semantic-release
49
+
50
+ - name: Release
51
+ id: release
52
+ env:
53
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
54
+ run: semantic-release version --commit --tag --push --vcs-release
55
+
56
+ - name: Upload build artifacts
57
+ if: steps.release.outputs.released == 'true'
58
+ uses: actions/upload-artifact@v4
59
+ with:
60
+ name: dist
61
+ path: dist/
62
+
63
+ pypi-publish:
64
+ needs: release
65
+ if: needs.release.outputs.released == 'true'
66
+ runs-on: ubuntu-latest
67
+ environment: pypi
68
+ permissions:
69
+ id-token: write
70
+ steps:
71
+ - uses: actions/download-artifact@v4
72
+ with:
73
+ name: dist
74
+ path: dist/
75
+
76
+ - name: Publish to PyPI
77
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,135 @@
1
+ # This .gitignore file should be placed at the root of your Unity project directory
2
+ #
3
+ # Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
4
+ #
5
+ /[Ll]ibrary/
6
+ /[Tt]emp/
7
+ /[Oo]bj/
8
+ /[Bb]uild/
9
+ /[Bb]uilds/
10
+ /[Ll]ogs/
11
+ /[Uu]ser[Ss]ettings/
12
+
13
+ # MemoryCaptures can get excessive in size.
14
+ # They also could contain extremely sensitive data
15
+ /[Mm]emoryCaptures/
16
+
17
+ # Recordings can get excessive in size
18
+ /[Rr]ecordings/
19
+
20
+ # This .gitignore file should be placed at the root of your Unity project directory
21
+ #
22
+ # Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
23
+ #
24
+ # Recommended: add any editor/OS/tool-specific ignore rules from the Global/ templates as needed.
25
+ # See: https://github.com/github/gitignore/tree/main/Global
26
+ #
27
+ .utmp/
28
+ /[Ll]ibrary/
29
+ /[Tt]emp/
30
+ /[Oo]bj/
31
+ /[Bb]uild/
32
+ /[Bb]uilds/
33
+ /[Ll]ogs/
34
+ /[Uu]ser[Ss]ettings/
35
+ *.log
36
+
37
+ # By default unity supports Blender asset imports, *.blend1 blender files do not need to be commited to version control.
38
+ *.blend1
39
+ *.blend1.meta
40
+
41
+ # MemoryCaptures can get excessive in size.
42
+ # They also could contain extremely sensitive data
43
+ /[Mm]emoryCaptures/
44
+
45
+ # Recordings can get excessive in size
46
+ /[Rr]ecordings/
47
+
48
+ # Uncomment this line if you wish to ignore the asset store tools plugin
49
+ # /[Aa]ssets/AssetStoreTools*
50
+
51
+ # Autogenerated Jetbrains Rider plugin
52
+ /[Aa]ssets/Plugins/Editor/JetBrains*
53
+ # Jetbrains Rider personal-layer settings
54
+ *.DotSettings.user
55
+
56
+ # Visual Studio cache directory
57
+ .vs/
58
+
59
+ # Gradle cache directory
60
+ .gradle/
61
+
62
+ # Autogenerated VS/MD/Consulo solution and project files
63
+ ExportedObj/
64
+ .consulo/
65
+ *.csproj
66
+ *.unityproj
67
+ *.sln
68
+ *.slnx
69
+ *.suo
70
+ *.tmp
71
+ *.user
72
+ *.userprefs
73
+ *.pidb
74
+ *.booproj
75
+ *.svd
76
+ *.pdb
77
+ *.mdb
78
+ *.opendb
79
+ *.VC.db
80
+
81
+ # Unity3D generated meta files
82
+ *.pidb.meta
83
+ *.pdb.meta
84
+ *.mdb.meta
85
+
86
+ # Unity3D generated file on crash reports
87
+ sysinfo.txt
88
+
89
+ # Mono auto generated files
90
+ mono_crash.*
91
+
92
+ # Builds
93
+ *.apk
94
+ *.aab
95
+ *.unitypackage
96
+ *.unitypackage.meta
97
+ *.app
98
+
99
+ # Crashlytics generated file
100
+ crashlytics-build.properties
101
+
102
+ # TestRunner generated files
103
+ InitTestScene*.unity*
104
+
105
+ # Addressables default ignores, before user customizations
106
+ /ServerData
107
+ /[Aa]ssets/StreamingAssets/aa*
108
+ /[Aa]ssets/AddressableAssetsData/link.xml*
109
+ /[Aa]ssets/Addressables_Temp*
110
+ # By default, Addressables content builds will generate addressables_content_state.bin
111
+ # files in platform-specific subfolders, for example:
112
+ # /Assets/AddressableAssetsData/OSX/addressables_content_state.bin
113
+ /[Aa]ssets/AddressableAssetsData/*/*.bin*
114
+
115
+ # Visual Scripting auto-generated files
116
+ /[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Flow/UnitOptions.db
117
+ /[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Flow/UnitOptions.db.meta
118
+ /[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers
119
+ /[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers.meta
120
+
121
+ # Auto-generated scenes by play mode tests
122
+ /[Aa]ssets/[Ii]nit[Tt]est[Ss]cene*.unity*
123
+
124
+ # Auto-generated cache in Assets folder
125
+ /[Aa]ssets/[Ss]ceneDependencyCache*
126
+
127
+ *.meta
128
+
129
+ # Python
130
+ __pycache__/
131
+ /dist/
132
+ *.egg-info/
133
+
134
+ *.csv
135
+ *.html
@@ -0,0 +1,7 @@
1
+ # CHANGELOG
2
+
3
+ <!-- version list -->
4
+
5
+ ## v1.0.0 (2026-07-09)
6
+
7
+ - Initial Release
@@ -0,0 +1,31 @@
1
+ using System;
2
+ using System.Text.Json;
3
+
4
+ namespace LLiquidLink
5
+ {
6
+
7
+ public class EnumConverter : RpcJsonConverter<System.Enum, RpcEnum>
8
+ {
9
+
10
+ public override bool CanConvert(Type typeToConvert)
11
+ {
12
+ return typeToConvert.IsEnum;
13
+ }
14
+
15
+ public override System.Enum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
16
+ {
17
+ if (reader.TokenType == JsonTokenType.Null)
18
+ {
19
+ return null;
20
+ }
21
+ var rpcObj = JsonSerializer.Deserialize<RpcEnum>(ref reader, DtoOptions);
22
+ return rpcObj == null ? null : (System.Enum)Enum.Parse(typeToConvert, rpcObj.value);
23
+ }
24
+
25
+ public override void Write(Utf8JsonWriter writer, System.Enum value, JsonSerializerOptions options)
26
+ {
27
+ if (value == null) { writer.WriteNullValue(); return; }
28
+ JsonSerializer.Serialize(writer, new RpcEnum { value = value.ToString() }, DtoOptions);
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,128 @@
1
+ using System;
2
+ using System.Runtime.Serialization;
3
+ using System.Text.Json;
4
+
5
+ namespace LLiquidLink
6
+ {
7
+ /// <summary>
8
+ /// Thrown when deserialization yields a raw <see cref="JsonElement"/> instead of a converted value,
9
+ /// meaning no stage actually produced a real CLR value for the target type.
10
+ /// </summary>
11
+ public class JsonElementLeakException : Exception
12
+ {
13
+ public JsonElementLeakException()
14
+ {
15
+ }
16
+
17
+ public JsonElementLeakException(string message) : base(message)
18
+ {
19
+ }
20
+
21
+ public JsonElementLeakException(string message, Exception innerException) : base(message, innerException)
22
+ {
23
+ }
24
+
25
+ protected JsonElementLeakException(SerializationInfo info, StreamingContext context) : base(info, context)
26
+ {
27
+ }
28
+ }
29
+
30
+ /// <summary>
31
+ /// Holds the pre/main/fallback <see cref="JsonSerializerOptions"/> stages and runs
32
+ /// (de)serialization through them in order, returning the first stage's success.
33
+ /// </summary>
34
+ public class JsonSerializerChain
35
+ {
36
+ struct Stage
37
+ {
38
+ public JsonSerializerOptions Options;
39
+ public bool NullIsFailure;
40
+ public bool ReadExceptionIsFatal;
41
+ }
42
+
43
+ readonly Stage[] _stages;
44
+
45
+ /// <summary>Options for the pre stage (tried first; only succeeds for types with an explicit converter).</summary>
46
+ public JsonSerializerOptions Pre { get; }
47
+
48
+ /// <summary>Options for the main stage (the general-purpose serializer).</summary>
49
+ public JsonSerializerOptions Main { get; }
50
+
51
+ /// <summary>Options for the fallback stage (tried when main fails, e.g. Unity value types via JsonUtility).</summary>
52
+ public JsonSerializerOptions Fallback { get; }
53
+
54
+ /// <summary>Build a chain from the three stage options.</summary>
55
+ /// <param name="pre">Pre-stage options.</param>
56
+ /// <param name="main">Main-stage options.</param>
57
+ /// <param name="fallback">Fallback-stage options.</param>
58
+ public JsonSerializerChain(JsonSerializerOptions pre, JsonSerializerOptions main, JsonSerializerOptions fallback)
59
+ {
60
+ Pre = pre;
61
+ Main = main;
62
+ Fallback = fallback;
63
+
64
+ // Pre: a null result counts as failure (falls through to main); any exception is swallowed.
65
+ // Main: a null result is a valid success; RpcJsonConverterReadException is fatal (propagates,
66
+ // does not fall through to fallback) so registry/orgType mismatches surface as real errors.
67
+ // Fallback: last stage, runs unconditionally as the final attempt.
68
+ _stages = new Stage[]
69
+ {
70
+ new Stage { Options = pre, NullIsFailure = true, ReadExceptionIsFatal = false },
71
+ new Stage { Options = main, NullIsFailure = false, ReadExceptionIsFatal = true },
72
+ new Stage { Options = fallback, NullIsFailure = false, ReadExceptionIsFatal = false },
73
+ };
74
+ }
75
+
76
+ /// <summary>Deserialize <paramref name="rawJson"/> to <paramref name="type"/>, trying each stage in order.</summary>
77
+ /// <param name="rawJson">Raw JSON text to deserialize.</param>
78
+ /// <param name="type">Target .NET type.</param>
79
+ /// <returns>The deserialized value from the first successful stage.</returns>
80
+ /// <exception cref="JsonElementLeakException">
81
+ /// Thrown when <paramref name="type"/> is not <see cref="JsonElement"/> itself but no stage converted
82
+ /// the value, leaving a raw <see cref="JsonElement"/> as the result.
83
+ /// </exception>
84
+ public object Deserialize(string rawJson, Type type)
85
+ {
86
+ object ret = Run(opts => JsonSerializer.Deserialize(rawJson, type, opts));
87
+ return type != typeof(JsonElement) && ret is JsonElement
88
+ ? throw new JsonElementLeakException(string.Format(
89
+ "Deserialize to {0} yielded a raw JsonElement instead of a converted value " +
90
+ "(no stage produced a real CLR value). raw={1}", type.FullName, rawJson))
91
+ : ret;
92
+ }
93
+
94
+ /// <summary>Serialize <paramref name="value"/> to a <see cref="JsonElement"/>, trying each stage in order.</summary>
95
+ /// <param name="value">Object to serialize.</param>
96
+ /// <param name="type">Runtime type of <paramref name="value"/>.</param>
97
+ /// <returns>The serialized element from the first successful stage.</returns>
98
+ public object SerializeToElement(object value, Type type)
99
+ {
100
+ return Run(opts => JsonSerializer.SerializeToElement(value, type, opts));
101
+ }
102
+
103
+ object Run(Func<JsonSerializerOptions, object> op)
104
+ {
105
+ for (int i = 0; i < _stages.Length; i++)
106
+ {
107
+ Stage stage = _stages[i];
108
+ bool isLast = i == _stages.Length - 1;
109
+ try
110
+ {
111
+ object ret = op(stage.Options);
112
+ if (ret != null || !stage.NullIsFailure || isLast)
113
+ {
114
+ return ret;
115
+ }
116
+ }
117
+ catch (RpcJsonConverterReadException) when (stage.ReadExceptionIsFatal && !isLast)
118
+ {
119
+ throw;
120
+ }
121
+ catch (Exception) when (!isLast)
122
+ {
123
+ }
124
+ }
125
+ return null;
126
+ }
127
+ }
128
+ }
@@ -0,0 +1,26 @@
1
+ using System;
2
+ using System.Text.Json;
3
+
4
+ namespace LLiquidLink
5
+ {
6
+
7
+ public class ObjectPrimitiveConverter : RpcJsonConverter<object, object>
8
+ {
9
+
10
+ public override bool CanConvert(Type typeToConvert)
11
+ {
12
+ return typeToConvert == typeof(object);
13
+ }
14
+
15
+ public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
16
+ {
17
+ return reader.TokenType == JsonTokenType.Null ? null : JsonPrimitiveHelper.ReadRaw(ref reader);
18
+ }
19
+
20
+ public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
21
+ {
22
+ if (value == null) { writer.WriteNullValue(); return; }
23
+ JsonPrimitiveHelper.WriteRaw(writer, value);
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,50 @@
1
+ using System;
2
+ using System.Text.Json;
3
+
4
+ namespace LLiquidLink
5
+ {
6
+
7
+ public class PreObjectConverter : RpcJsonConverter<object, RpcUnityObject>
8
+ {
9
+ readonly ObjectRegistry _registry;
10
+
11
+ public PreObjectConverter(ObjectRegistry registry)
12
+ {
13
+ _registry = registry;
14
+ }
15
+
16
+ public override bool CanConvert(Type typeToConvert)
17
+ {
18
+ return typeToConvert == typeof(object);
19
+ }
20
+
21
+ public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
22
+ {
23
+ if (reader.TokenType == JsonTokenType.Null)
24
+ {
25
+ return null;
26
+ }
27
+ var rpcObj = JsonSerializer.Deserialize<RpcUnityObject>(ref reader, DtoOptions);
28
+ if (rpcObj == null)
29
+ {
30
+ return null;
31
+ }
32
+
33
+ var ret = _registry.GetObject(rpcObj.instanceId);
34
+ if (ret == null)
35
+ {
36
+ throw new ArgumentException($"Object {rpcObj.instanceId} not found");
37
+ }
38
+
39
+ return rpcObj.orgType != ret.GetType().FullName
40
+ ? throw new RpcJsonConverterReadException($"Object {rpcObj.orgType} != {ret.GetType().FullName}")
41
+ : ret;
42
+ }
43
+
44
+ public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
45
+ {
46
+ if (value == null) { writer.WriteNullValue(); return; }
47
+ throw new NotSupportedException();
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,98 @@
1
+ using System;
2
+ using System.Runtime.Serialization;
3
+ using System.Text.Json;
4
+ using System.Text.Json.Serialization;
5
+
6
+ namespace LLiquidLink
7
+ {
8
+ /// <summary>
9
+ /// Base class for JSON converters that translate between an original .NET type
10
+ /// and an RPC-wire DTO type.
11
+ /// </summary>
12
+ /// <typeparam name="TOrg">The original .NET type (e.g. <c>UnityEngine.Object</c>).</typeparam>
13
+ /// <typeparam name="TRpc">The RPC wire DTO type (e.g. <c>RpcUnityObject</c>).</typeparam>
14
+ public abstract class RpcJsonConverter<TOrg, TRpc> : JsonConverter<TOrg>
15
+ where TOrg : class
16
+ where TRpc : class
17
+ {
18
+ /// <summary>Fully qualified name of the RPC DTO type used as a discriminator on the wire.</summary>
19
+ public string rpcTypeName => typeof(TRpc).FullName;
20
+
21
+ /// <summary>The original .NET type this converter handles.</summary>
22
+ public Type orgType => typeof(TOrg);
23
+
24
+ /// <summary>
25
+ /// Options used to (de)serialize the wire DTO itself, independent of whichever
26
+ /// JsonSerializerOptions instance (main/pre/fallback) hosts this converter. The DTO
27
+ /// types only contain primitive fields, so no custom converters or resolvers are needed;
28
+ /// reusing the runtime-supplied options here would break under a restricted resolver
29
+ /// (e.g. the pre-chain's ConverterOnlyResolver) that requires every type it resolves
30
+ /// to have its own registered converter.
31
+ /// </summary>
32
+ protected static readonly JsonSerializerOptions DtoOptions =
33
+ new JsonSerializerOptions { UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow };
34
+ }
35
+
36
+ /// <summary>Shared helpers for reading/writing JSON primitives directly (no wrapper DTO).</summary>
37
+ internal static class JsonPrimitiveHelper
38
+ {
39
+ /// <summary>True for CLR primitive-ish types that should bypass the Unity-object registry envelope.</summary>
40
+ public static bool IsPrimitive(object value)
41
+ {
42
+ return value is string or bool
43
+ or int or long or short
44
+ or double or float or decimal;
45
+ }
46
+
47
+ /// <summary>Read the current JSON token directly as a boxed CLR primitive.</summary>
48
+ public static object ReadRaw(ref Utf8JsonReader reader)
49
+ {
50
+ switch (reader.TokenType)
51
+ {
52
+ case JsonTokenType.String: return reader.GetString();
53
+ case JsonTokenType.True: return true;
54
+ case JsonTokenType.False: return false;
55
+ case JsonTokenType.Number:
56
+ return reader.TryGetInt64(out long l) ? (object)l : reader.GetDouble();
57
+ default:
58
+ throw new NotSupportedException("Unsupported primitive token: " + reader.TokenType);
59
+ }
60
+ }
61
+
62
+ /// <summary>Write a boxed CLR primitive directly as its native JSON token.</summary>
63
+ public static void WriteRaw(Utf8JsonWriter writer, object value)
64
+ {
65
+ switch (value)
66
+ {
67
+ case string s: writer.WriteStringValue(s); break;
68
+ case bool b: writer.WriteBooleanValue(b); break;
69
+ case int i: writer.WriteNumberValue(i); break;
70
+ case long l: writer.WriteNumberValue(l); break;
71
+ case short sh: writer.WriteNumberValue(sh); break;
72
+ case double d: writer.WriteNumberValue(d); break;
73
+ case float f: writer.WriteNumberValue(f); break;
74
+ case decimal m: writer.WriteNumberValue(m); break;
75
+ default: throw new NotSupportedException("Unsupported primitive value: " + value.GetType());
76
+ }
77
+ }
78
+ }
79
+
80
+ public class RpcJsonConverterReadException : Exception
81
+ {
82
+ public RpcJsonConverterReadException()
83
+ {
84
+ }
85
+
86
+ public RpcJsonConverterReadException(string message) : base(message)
87
+ {
88
+ }
89
+
90
+ public RpcJsonConverterReadException(string message, Exception innerException) : base(message, innerException)
91
+ {
92
+ }
93
+
94
+ protected RpcJsonConverterReadException(SerializationInfo info, StreamingContext context) : base(info, context)
95
+ {
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,32 @@
1
+ using System;
2
+ using System.Text.Json;
3
+
4
+ namespace LLiquidLink
5
+ {
6
+
7
+ public class TypeConverter : RpcJsonConverter<Type, RpcType>
8
+ {
9
+ readonly TypeResolver _resolver;
10
+
11
+ public TypeConverter(TypeResolver resolver)
12
+ {
13
+ _resolver = resolver;
14
+ }
15
+
16
+ public override Type Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
17
+ {
18
+ if (reader.TokenType == JsonTokenType.Null)
19
+ {
20
+ return null;
21
+ }
22
+ var rpcObj = JsonSerializer.Deserialize<RpcType>(ref reader, DtoOptions);
23
+ return rpcObj == null ? null : _resolver.Resolve(rpcObj.value);
24
+ }
25
+
26
+ public override void Write(Utf8JsonWriter writer, Type value, JsonSerializerOptions options)
27
+ {
28
+ if (value == null) { writer.WriteNullValue(); return; }
29
+ JsonSerializer.Serialize(writer, new RpcType { value = value.FullName }, DtoOptions);
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,31 @@
1
+ namespace LLiquidLink.Logger
2
+ {
3
+
4
+ /// <summary>Severity levels for the built-in logger.</summary>
5
+ public enum LogLevel { Debug = 0, Info = 1, None = 2 }
6
+
7
+ /// <summary>Logging interface for Server diagnostic output.</summary>
8
+ public interface ILogger
9
+ {
10
+ /// <summary>Minimum severity level; messages below this level are suppressed.</summary>
11
+ LogLevel MinLevel { get; set; }
12
+
13
+ /// <summary>Log an informational message.</summary>
14
+ /// <param name="msg">Message text.</param>
15
+ void Info(string msg);
16
+
17
+ /// <summary>Log a debug-level message.</summary>
18
+ /// <param name="msg">Message text.</param>
19
+ void Debug(string msg);
20
+
21
+ /// <summary>Log a formatted informational message.</summary>
22
+ /// <param name="format">Format string.</param>
23
+ /// <param name="args">Format arguments.</param>
24
+ void InfoFormat(string format, params object[] args);
25
+
26
+ /// <summary>Log a formatted debug-level message.</summary>
27
+ /// <param name="format">Format string.</param>
28
+ /// <param name="args">Format arguments.</param>
29
+ void DebugFormat(string format, params object[] args);
30
+ }
31
+ }