@cloudcare/cocos-session-replay 0.1.0-alpha.6

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 (169) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +53 -0
  3. package/THIRD_PARTY_NOTICES +5 -0
  4. package/components/creator2/ReplayPrivacy.ts +23 -0
  5. package/components/creator3/ReplayPrivacy.ts +25 -0
  6. package/creator2/package.json +4 -0
  7. package/creator3/package.json +5 -0
  8. package/dist/creator2/core/client.d.ts +30 -0
  9. package/dist/creator2/core/client.d.ts.map +1 -0
  10. package/dist/creator2/core/client.js +115 -0
  11. package/dist/creator2/core/client.js.map +1 -0
  12. package/dist/creator2/core/replay-async-transport.d.ts +4 -0
  13. package/dist/creator2/core/replay-async-transport.d.ts.map +1 -0
  14. package/dist/creator2/core/replay-async-transport.js +67 -0
  15. package/dist/creator2/core/replay-async-transport.js.map +1 -0
  16. package/dist/creator2/core/replay-budget.d.ts +28 -0
  17. package/dist/creator2/core/replay-budget.d.ts.map +1 -0
  18. package/dist/creator2/core/replay-budget.js +126 -0
  19. package/dist/creator2/core/replay-budget.js.map +1 -0
  20. package/dist/creator2/core/replay-diagnostics.d.ts +36 -0
  21. package/dist/creator2/core/replay-diagnostics.d.ts.map +1 -0
  22. package/dist/creator2/core/replay-diagnostics.js +40 -0
  23. package/dist/creator2/core/replay-diagnostics.js.map +1 -0
  24. package/dist/creator2/core/replay-encoding.d.ts +31 -0
  25. package/dist/creator2/core/replay-encoding.d.ts.map +1 -0
  26. package/dist/creator2/core/replay-encoding.js +63 -0
  27. package/dist/creator2/core/replay-encoding.js.map +1 -0
  28. package/dist/creator2/core/replay-file.d.ts +5 -0
  29. package/dist/creator2/core/replay-file.d.ts.map +1 -0
  30. package/dist/creator2/core/replay-file.js +101 -0
  31. package/dist/creator2/core/replay-file.js.map +1 -0
  32. package/dist/creator2/core/replay-pixels.d.ts +3 -0
  33. package/dist/creator2/core/replay-pixels.d.ts.map +1 -0
  34. package/dist/creator2/core/replay-pixels.js +16 -0
  35. package/dist/creator2/core/replay-pixels.js.map +1 -0
  36. package/dist/creator2/core/replay-privacy-nodes.d.ts +14 -0
  37. package/dist/creator2/core/replay-privacy-nodes.d.ts.map +1 -0
  38. package/dist/creator2/core/replay-privacy-nodes.js +18 -0
  39. package/dist/creator2/core/replay-privacy-nodes.js.map +1 -0
  40. package/dist/creator2/core/replay-privacy.d.ts +15 -0
  41. package/dist/creator2/core/replay-privacy.d.ts.map +1 -0
  42. package/dist/creator2/core/replay-privacy.js +36 -0
  43. package/dist/creator2/core/replay-privacy.js.map +1 -0
  44. package/dist/creator2/core/replay.d.ts +102 -0
  45. package/dist/creator2/core/replay.d.ts.map +1 -0
  46. package/dist/creator2/core/replay.js +653 -0
  47. package/dist/creator2/core/replay.js.map +1 -0
  48. package/dist/creator2/core/transport.d.ts +3 -0
  49. package/dist/creator2/core/transport.d.ts.map +1 -0
  50. package/dist/creator2/core/transport.js +22 -0
  51. package/dist/creator2/core/transport.js.map +1 -0
  52. package/dist/creator2/core/types.d.ts +82 -0
  53. package/dist/creator2/core/types.d.ts.map +1 -0
  54. package/dist/creator2/core/types.js +3 -0
  55. package/dist/creator2/core/types.js.map +1 -0
  56. package/dist/creator2/core/validation.d.ts +13 -0
  57. package/dist/creator2/core/validation.d.ts.map +1 -0
  58. package/dist/creator2/core/validation.js +75 -0
  59. package/dist/creator2/core/validation.js.map +1 -0
  60. package/dist/creator2/core/version.d.ts +2 -0
  61. package/dist/creator2/core/version.d.ts.map +1 -0
  62. package/dist/creator2/core/version.js +5 -0
  63. package/dist/creator2/core/version.js.map +1 -0
  64. package/dist/creator2/creator2/capture.d.ts +17 -0
  65. package/dist/creator2/creator2/capture.d.ts.map +1 -0
  66. package/dist/creator2/creator2/capture.js +168 -0
  67. package/dist/creator2/creator2/capture.js.map +1 -0
  68. package/dist/creator2/creator2/index.d.ts +8 -0
  69. package/dist/creator2/creator2/index.d.ts.map +1 -0
  70. package/dist/creator2/creator2/index.js +19 -0
  71. package/dist/creator2/creator2/index.js.map +1 -0
  72. package/dist/creator2/creator2/pointer.d.ts +5 -0
  73. package/dist/creator2/creator2/pointer.d.ts.map +1 -0
  74. package/dist/creator2/creator2/pointer.js +49 -0
  75. package/dist/creator2/creator2/pointer.js.map +1 -0
  76. package/dist/creator2/creator2/transport.d.ts +8 -0
  77. package/dist/creator2/creator2/transport.d.ts.map +1 -0
  78. package/dist/creator2/creator2/transport.js +38 -0
  79. package/dist/creator2/creator2/transport.js.map +1 -0
  80. package/dist/creator3/core/client.d.ts +30 -0
  81. package/dist/creator3/core/client.d.ts.map +1 -0
  82. package/dist/creator3/core/client.js +97 -0
  83. package/dist/creator3/core/client.js.map +1 -0
  84. package/dist/creator3/core/replay-async-transport.d.ts +4 -0
  85. package/dist/creator3/core/replay-async-transport.d.ts.map +1 -0
  86. package/dist/creator3/core/replay-async-transport.js +16 -0
  87. package/dist/creator3/core/replay-async-transport.js.map +1 -0
  88. package/dist/creator3/core/replay-budget.d.ts +28 -0
  89. package/dist/creator3/core/replay-budget.d.ts.map +1 -0
  90. package/dist/creator3/core/replay-budget.js +118 -0
  91. package/dist/creator3/core/replay-budget.js.map +1 -0
  92. package/dist/creator3/core/replay-diagnostics.d.ts +36 -0
  93. package/dist/creator3/core/replay-diagnostics.d.ts.map +1 -0
  94. package/dist/creator3/core/replay-diagnostics.js +36 -0
  95. package/dist/creator3/core/replay-diagnostics.js.map +1 -0
  96. package/dist/creator3/core/replay-encoding.d.ts +31 -0
  97. package/dist/creator3/core/replay-encoding.d.ts.map +1 -0
  98. package/dist/creator3/core/replay-encoding.js +62 -0
  99. package/dist/creator3/core/replay-encoding.js.map +1 -0
  100. package/dist/creator3/core/replay-file.d.ts +5 -0
  101. package/dist/creator3/core/replay-file.d.ts.map +1 -0
  102. package/dist/creator3/core/replay-file.js +31 -0
  103. package/dist/creator3/core/replay-file.js.map +1 -0
  104. package/dist/creator3/core/replay-pixels.d.ts +3 -0
  105. package/dist/creator3/core/replay-pixels.d.ts.map +1 -0
  106. package/dist/creator3/core/replay-pixels.js +13 -0
  107. package/dist/creator3/core/replay-pixels.js.map +1 -0
  108. package/dist/creator3/core/replay-privacy-nodes.d.ts +14 -0
  109. package/dist/creator3/core/replay-privacy-nodes.d.ts.map +1 -0
  110. package/dist/creator3/core/replay-privacy-nodes.js +15 -0
  111. package/dist/creator3/core/replay-privacy-nodes.js.map +1 -0
  112. package/dist/creator3/core/replay-privacy.d.ts +15 -0
  113. package/dist/creator3/core/replay-privacy.d.ts.map +1 -0
  114. package/dist/creator3/core/replay-privacy.js +33 -0
  115. package/dist/creator3/core/replay-privacy.js.map +1 -0
  116. package/dist/creator3/core/replay.d.ts +102 -0
  117. package/dist/creator3/core/replay.d.ts.map +1 -0
  118. package/dist/creator3/core/replay.js +576 -0
  119. package/dist/creator3/core/replay.js.map +1 -0
  120. package/dist/creator3/core/transport.d.ts +3 -0
  121. package/dist/creator3/core/transport.d.ts.map +1 -0
  122. package/dist/creator3/core/transport.js +19 -0
  123. package/dist/creator3/core/transport.js.map +1 -0
  124. package/dist/creator3/core/types.d.ts +82 -0
  125. package/dist/creator3/core/types.d.ts.map +1 -0
  126. package/dist/creator3/core/types.js +2 -0
  127. package/dist/creator3/core/types.js.map +1 -0
  128. package/dist/creator3/core/validation.d.ts +13 -0
  129. package/dist/creator3/core/validation.d.ts.map +1 -0
  130. package/dist/creator3/core/validation.js +70 -0
  131. package/dist/creator3/core/validation.js.map +1 -0
  132. package/dist/creator3/core/version.d.ts +2 -0
  133. package/dist/creator3/core/version.d.ts.map +1 -0
  134. package/dist/creator3/core/version.js +2 -0
  135. package/dist/creator3/core/version.js.map +1 -0
  136. package/dist/creator3/creator3/capture.d.ts +17 -0
  137. package/dist/creator3/creator3/capture.d.ts.map +1 -0
  138. package/dist/creator3/creator3/capture.js +112 -0
  139. package/dist/creator3/creator3/capture.js.map +1 -0
  140. package/dist/creator3/creator3/index.d.ts +8 -0
  141. package/dist/creator3/creator3/index.d.ts.map +1 -0
  142. package/dist/creator3/creator3/index.js +14 -0
  143. package/dist/creator3/creator3/index.js.map +1 -0
  144. package/dist/creator3/creator3/pointer.d.ts +5 -0
  145. package/dist/creator3/creator3/pointer.d.ts.map +1 -0
  146. package/dist/creator3/creator3/pointer.js +29 -0
  147. package/dist/creator3/creator3/pointer.js.map +1 -0
  148. package/dist/creator3/creator3/replay-render-cycle.d.ts +9 -0
  149. package/dist/creator3/creator3/replay-render-cycle.d.ts.map +1 -0
  150. package/dist/creator3/creator3/replay-render-cycle.js +12 -0
  151. package/dist/creator3/creator3/replay-render-cycle.js.map +1 -0
  152. package/dist/creator3/creator3/transport.d.ts +9 -0
  153. package/dist/creator3/creator3/transport.d.ts.map +1 -0
  154. package/dist/creator3/creator3/transport.js +28 -0
  155. package/dist/creator3/creator3/transport.js.map +1 -0
  156. package/dist/creator3/package.json +1 -0
  157. package/native/android/src/main/java/com/ft/sdk/cocos/FTCocosReplayBridge.java +168 -0
  158. package/native/android/src/main/java/com/ft/sdk/cocos/FTCocosReplayImageJobs.java +55 -0
  159. package/native/ios/FTCocosReplayBridge.h +10 -0
  160. package/native/ios/FTCocosReplayBridge.m +275 -0
  161. package/native/ios/FTCocosReplayBridge.podspec +18 -0
  162. package/native/ios/FTCocosReplayImageJobs.h +11 -0
  163. package/native/ios/FTCocosReplayImageJobs.m +54 -0
  164. package/native/ios/Package.swift +26 -0
  165. package/native/ios/include/FTCocosReplayBridge.h +10 -0
  166. package/native/shared/FTReplayFileBridge.h +62 -0
  167. package/native/shared/FTReplayFileWorker.h +88 -0
  168. package/native-integration.json +9 -0
  169. package/package.json +58 -0
@@ -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
@@ -0,0 +1,9 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "name": "@cloudcare/cocos-session-replay",
4
+ "version": "0.1.0-alpha.6",
5
+ "baseVersion": "0.1.0-alpha.6",
6
+ "iosSdkVersion": "1.6.8-alpha.5",
7
+ "androidReplay": "com.cloudcare.ft.mobile.sdk.tracker.agent:ft-session-replay:0.1.9-alpha03",
8
+ "androidFragment": "androidx.fragment:fragment:1.8.0"
9
+ }
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@cloudcare/cocos-session-replay",
3
+ "version": "0.1.0-alpha.6",
4
+ "description": "Optional Session Replay for the Guance Cocos Creator SDK",
5
+ "license": "Apache-2.0",
6
+ "author": "Guance Cloud",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/GuanceCloud/datakit-cocos.git",
10
+ "directory": "packages/cocos-session-replay"
11
+ },
12
+ "homepage": "https://github.com/GuanceCloud/datakit-cocos#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/GuanceCloud/datakit-cocos/issues"
15
+ },
16
+ "keywords": [
17
+ "guance",
18
+ "cocos-creator",
19
+ "session-replay"
20
+ ],
21
+ "exports": {
22
+ "./creator2": {
23
+ "types": "./dist/creator2/creator2/index.d.ts",
24
+ "require": "./dist/creator2/creator2/index.js",
25
+ "default": "./dist/creator2/creator2/index.js"
26
+ },
27
+ "./creator3": {
28
+ "types": "./dist/creator3/creator3/index.d.ts",
29
+ "import": "./dist/creator3/creator3/index.js",
30
+ "default": "./dist/creator3/creator3/index.js"
31
+ },
32
+ "./package.json": "./package.json"
33
+ },
34
+ "files": [
35
+ "creator2",
36
+ "creator3",
37
+ "dist",
38
+ "components",
39
+ "native",
40
+ "native-integration.json",
41
+ "README.md",
42
+ "LICENSE",
43
+ "THIRD_PARTY_NOTICES"
44
+ ],
45
+ "engines": {
46
+ "node": ">=14"
47
+ },
48
+ "cocosSdk": {
49
+ "creator2": "2.4.5-2.4.15",
50
+ "creator3": "3.6.3-3.8.x"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public"
54
+ },
55
+ "peerDependencies": {
56
+ "@cloudcare/cocos-sdk": "0.1.0-alpha.6"
57
+ }
58
+ }