@cloudcare/cocos-sdk 0.1.0-alpha.3 → 0.1.0-alpha.5

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 (77) hide show
  1. package/README.md +37 -1
  2. package/bin/cli.cjs +14 -0
  3. package/components/creator2/ReplayPrivacy.ts +23 -0
  4. package/components/creator3/ReplayPrivacy.ts +25 -0
  5. package/dist/creator2/core/replay-async-transport.d.ts +4 -0
  6. package/dist/creator2/core/replay-async-transport.d.ts.map +1 -0
  7. package/dist/creator2/core/replay-async-transport.js +67 -0
  8. package/dist/creator2/core/replay-async-transport.js.map +1 -0
  9. package/dist/creator2/core/replay-file.d.ts +5 -0
  10. package/dist/creator2/core/replay-file.d.ts.map +1 -0
  11. package/dist/creator2/core/replay-file.js +101 -0
  12. package/dist/creator2/core/replay-file.js.map +1 -0
  13. package/dist/creator2/core/replay-privacy-nodes.d.ts +14 -0
  14. package/dist/creator2/core/replay-privacy-nodes.d.ts.map +1 -0
  15. package/dist/creator2/core/replay-privacy-nodes.js +18 -0
  16. package/dist/creator2/core/replay-privacy-nodes.js.map +1 -0
  17. package/dist/creator2/core/replay.d.ts +5 -3
  18. package/dist/creator2/core/replay.d.ts.map +1 -1
  19. package/dist/creator2/core/replay.js +74 -41
  20. package/dist/creator2/core/replay.js.map +1 -1
  21. package/dist/creator2/core/transport.d.ts +1 -0
  22. package/dist/creator2/core/transport.d.ts.map +1 -1
  23. package/dist/creator2/core/transport.js.map +1 -1
  24. package/dist/creator2/core/version.d.ts +1 -1
  25. package/dist/creator2/core/version.js +1 -1
  26. package/dist/creator2/creator2/capture.d.ts +1 -1
  27. package/dist/creator2/creator2/capture.d.ts.map +1 -1
  28. package/dist/creator2/creator2/capture.js +9 -16
  29. package/dist/creator2/creator2/capture.js.map +1 -1
  30. package/dist/creator2/creator2/transport.d.ts +1 -0
  31. package/dist/creator2/creator2/transport.d.ts.map +1 -1
  32. package/dist/creator2/creator2/transport.js +4 -0
  33. package/dist/creator2/creator2/transport.js.map +1 -1
  34. package/dist/creator3/core/replay-async-transport.d.ts +4 -0
  35. package/dist/creator3/core/replay-async-transport.d.ts.map +1 -0
  36. package/dist/creator3/core/replay-async-transport.js +16 -0
  37. package/dist/creator3/core/replay-async-transport.js.map +1 -0
  38. package/dist/creator3/core/replay-file.d.ts +5 -0
  39. package/dist/creator3/core/replay-file.d.ts.map +1 -0
  40. package/dist/creator3/core/replay-file.js +31 -0
  41. package/dist/creator3/core/replay-file.js.map +1 -0
  42. package/dist/creator3/core/replay-privacy-nodes.d.ts +14 -0
  43. package/dist/creator3/core/replay-privacy-nodes.d.ts.map +1 -0
  44. package/dist/creator3/core/replay-privacy-nodes.js +15 -0
  45. package/dist/creator3/core/replay-privacy-nodes.js.map +1 -0
  46. package/dist/creator3/core/replay.d.ts +5 -3
  47. package/dist/creator3/core/replay.d.ts.map +1 -1
  48. package/dist/creator3/core/replay.js +23 -9
  49. package/dist/creator3/core/replay.js.map +1 -1
  50. package/dist/creator3/core/transport.d.ts +1 -0
  51. package/dist/creator3/core/transport.d.ts.map +1 -1
  52. package/dist/creator3/core/transport.js.map +1 -1
  53. package/dist/creator3/core/version.d.ts +1 -1
  54. package/dist/creator3/core/version.js +1 -1
  55. package/dist/creator3/creator3/capture.d.ts +1 -1
  56. package/dist/creator3/creator3/capture.d.ts.map +1 -1
  57. package/dist/creator3/creator3/capture.js +6 -13
  58. package/dist/creator3/creator3/capture.js.map +1 -1
  59. package/dist/creator3/creator3/transport.d.ts +1 -0
  60. package/dist/creator3/creator3/transport.d.ts.map +1 -1
  61. package/dist/creator3/creator3/transport.js +4 -0
  62. package/dist/creator3/creator3/transport.js.map +1 -1
  63. package/extensions/creator2/install-native.cjs +126 -6
  64. package/extensions/creator2/install-spm.cjs +190 -0
  65. package/extensions/creator3/install-native.cjs +126 -6
  66. package/extensions/creator3/install-spm.cjs +190 -0
  67. package/native/android/src/main/java/com/ft/sdk/cocos/FTCocosBridge.java +4 -0
  68. package/native/android/src/main/java/com/ft/sdk/cocos/FTCocosReplayImageJobs.java +55 -0
  69. package/native/ios/FTCocosBridge.m +26 -2
  70. package/native/ios/FTCocosBridge.podspec +4 -4
  71. package/native/ios/FTCocosReplayImageJobs.h +11 -0
  72. package/native/ios/FTCocosReplayImageJobs.m +54 -0
  73. package/native/ios/Package.swift +26 -0
  74. package/native/ios/include/FTCocosBridge.h +2 -0
  75. package/native/shared/FTReplayFileBridge.h +62 -0
  76. package/native/shared/FTReplayFileWorker.h +88 -0
  77. package/package.json +2 -1
@@ -0,0 +1,62 @@
1
+ #pragma once
2
+
3
+ #if __has_include("bindings/jswrapper/SeApi.h")
4
+ #define FT_COCOS_CREATOR3 1
5
+ #include "bindings/jswrapper/SeApi.h"
6
+ #else
7
+ #include "cocos/scripting/js-bindings/jswrapper/SeApi.h"
8
+ #endif
9
+ #include "FTReplayFileWorker.h"
10
+
11
+ namespace ft_cocos {
12
+
13
+ static ReplayFileWorker replayFiles;
14
+
15
+ static bool writeReplayFile(se::State& state) {
16
+ const auto& args = state.args();
17
+ if (args.size() != 2 || !args[0].isObject() || !args[1].isString()) return false;
18
+ auto* object = args[0].toObject();
19
+ if (!object->isTypedArray()) return false;
20
+ uint8_t* bytes = nullptr;
21
+ size_t size = 0;
22
+ if (!object->getTypedArrayData(&bytes, &size)) return false;
23
+ state.rval().setBoolean(replayFiles.write(bytes, size, args[1].toString()));
24
+ return true;
25
+ }
26
+ SE_BIND_FUNC(writeReplayFile)
27
+
28
+ static bool pollReplayFile(se::State& state) {
29
+ state.rval().setString(replayFiles.poll());
30
+ return true;
31
+ }
32
+ SE_BIND_FUNC(pollReplayFile)
33
+
34
+ static bool removeReplayFile(se::State& state) {
35
+ const auto& args = state.args();
36
+ if (args.size() != 1 || !args[0].isString()) return false;
37
+ state.rval().setBoolean(replayFiles.remove(args[0].toString()));
38
+ return true;
39
+ }
40
+ SE_BIND_FUNC(removeReplayFile)
41
+
42
+ static bool registerReplayFileBridge(se::Object* global) {
43
+ replayFiles.cancel();
44
+ const se::HandleObject bridge(se::Object::createPlainObject());
45
+ bridge->defineFunction("write", _SE(writeReplayFile));
46
+ bridge->defineFunction("poll", _SE(pollReplayFile));
47
+ bridge->defineFunction("remove", _SE(removeReplayFile));
48
+ global->setProperty("__ftCocosReplayFile", se::Value(bridge));
49
+ se::ScriptEngine::getInstance()->addBeforeCleanupHook([]() { replayFiles.cancel(); });
50
+ return true;
51
+ }
52
+
53
+ static void installReplayFileBridge() {
54
+ #if FT_COCOS_CREATOR3
55
+ se::ScriptEngine::getInstance()->addPermanentRegisterCallback(registerReplayFileBridge);
56
+ #else
57
+ // Creator 2 calls AppDelegate again when restarting its script VM.
58
+ se::ScriptEngine::getInstance()->addRegisterCallback(registerReplayFileBridge);
59
+ #endif
60
+ }
61
+
62
+ } // namespace ft_cocos
@@ -0,0 +1,88 @@
1
+ #pragma once
2
+
3
+ #include <atomic>
4
+ #include <cerrno>
5
+ #include <cstdio>
6
+ #include <memory>
7
+ #include <string>
8
+ #include <thread>
9
+ #include <vector>
10
+
11
+ namespace ft_cocos {
12
+
13
+ // Accessed only by the script thread. Workers own their buffers and never touch JS.
14
+ class ReplayFileWorker {
15
+ enum Status { Pending, Written, Removed, Error };
16
+ struct Job {
17
+ std::string path;
18
+ std::atomic<Status> status{Pending};
19
+ std::atomic<bool> cancelled{false};
20
+ };
21
+ std::shared_ptr<Job> current;
22
+
23
+ public:
24
+ bool write(const unsigned char* bytes, size_t size, const std::string& path) {
25
+ if (current && current->cancelled.load() && current->status.load() != Pending) current.reset();
26
+ if (current || !bytes || size == 0 || size > 2048U * 2048U * 4U || path.empty()) return false;
27
+ try {
28
+ auto job = std::make_shared<Job>();
29
+ job->path = path;
30
+ // This bounded copy is necessary because the JS buffer can be collected/reused.
31
+ std::vector<unsigned char> pixels(bytes, bytes + size);
32
+ current = job;
33
+ std::thread([job](std::vector<unsigned char> data) {
34
+ FILE* file = std::fopen(job->path.c_str(), "wb");
35
+ bool ok = false;
36
+ if (file) {
37
+ const bool written = std::fwrite(data.data(), 1, data.size(), file) == data.size();
38
+ ok = std::fclose(file) == 0 && written;
39
+ }
40
+ if (!ok || job->cancelled.load()) std::remove(job->path.c_str());
41
+ job->status.store(ok ? Written : Error);
42
+ // Covers cleanup racing with the final status transition.
43
+ if (job->cancelled.load()) std::remove(job->path.c_str());
44
+ }, std::move(pixels)).detach();
45
+ } catch (...) {
46
+ current.reset();
47
+ return false;
48
+ }
49
+ return true;
50
+ }
51
+
52
+ bool remove(const std::string& path) {
53
+ if (!current || current->path != path || current->status.load() != Written) return false;
54
+ auto job = current;
55
+ job->status.store(Pending);
56
+ try {
57
+ std::thread([job]() {
58
+ const bool ok = std::remove(job->path.c_str()) == 0 || errno == ENOENT;
59
+ job->status.store(ok ? Removed : Error);
60
+ }).detach();
61
+ } catch (...) {
62
+ job->status.store(Written);
63
+ return false;
64
+ }
65
+ return true;
66
+ }
67
+
68
+ const char* poll() {
69
+ if (!current) return "error";
70
+ switch (current->status.load()) {
71
+ case Pending: return "pending";
72
+ case Written: return "written";
73
+ case Removed: current.reset(); return "removed";
74
+ case Error: current.reset(); return "error";
75
+ }
76
+ return "error";
77
+ }
78
+
79
+ void cancel() {
80
+ if (!current) return;
81
+ auto job = current;
82
+ job->cancelled.store(true);
83
+ if (job->status.load() == Written) remove(job->path);
84
+ // Keep the slot occupied until its worker exits, including across VM restarts.
85
+ }
86
+ };
87
+
88
+ } // namespace ft_cocos
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudcare/cocos-sdk",
3
- "version": "0.1.0-alpha.3",
3
+ "version": "0.1.0-alpha.5",
4
4
  "description": "Observability SDK integration for Cocos Creator 2.4 and 3.x",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Guance Cloud",
@@ -37,6 +37,7 @@
37
37
  "creator2",
38
38
  "creator3",
39
39
  "dist",
40
+ "components",
40
41
  "extensions",
41
42
  "native",
42
43
  "bin",