@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,82 @@
1
+ import type { FTAttributes, FTCocosConfig, FTCocosHybridConfig } from '@cloudcare/cocos-sdk/plugin-api';
2
+ /** Visual treatment applied to a Session Replay node. */
3
+ export type FTReplayPrivacyMode = 'mask' | 'hide' | 'unmask';
4
+ /** Whether Session Replay records touch positions. */
5
+ export type FTReplayTouchPrivacy = 'show' | 'hide';
6
+ /** Image quality preset used by Cocos Session Replay. */
7
+ export type FTReplayQuality = 'low' | 'medium' | 'high';
8
+ /** Image traffic controls for Cocos Session Replay. */
9
+ export interface FTReplayImagePolicy {
10
+ /** Compression, size, and traffic preset. @defaultValue `'medium'` */
11
+ quality?: FTReplayQuality;
12
+ /** Maximum encoded bytes for a normal image resource. */
13
+ maxFrameBytes?: number;
14
+ /** Maximum encoded image bytes retained in a rolling 60-second window. */
15
+ maxBytesPerMinute?: number;
16
+ /** Paces captures to the image budget and adapts quality and size as it fills. @defaultValue `true` */
17
+ adaptiveCapture?: boolean;
18
+ }
19
+ /** Session Replay configuration for standalone Cocos applications. */
20
+ export interface FTSessionReplayConfig {
21
+ /** Replay sampling rate from `0` to `1`. */
22
+ sampleRate?: number;
23
+ /** Additional replay sampling rate from `0` to `1` for sessions that contain errors. */
24
+ sessionOnErrorSampleRate?: number;
25
+ /** Canvas capture rate in frames per second. Accepts integers from `1` to `5`. @defaultValue `1` */
26
+ captureFps?: number;
27
+ /** Maximum width or height of a captured frame. Accepts `1` to `2048`. @defaultValue `720` */
28
+ maxImageDimension?: number;
29
+ /** Image compression and rolling traffic-budget controls. */
30
+ imagePolicy?: FTReplayImagePolicy;
31
+ /** Whether captured replays include touch positions. @defaultValue `'hide'` */
32
+ touchPrivacy?: FTReplayTouchPrivacy;
33
+ }
34
+ /** Cocos-side Session Replay settings when the native host owns SDK initialization. */
35
+ export interface FTHybridSessionReplayConfig {
36
+ /** Canvas capture rate in frames per second. Accepts integers from `1` to `5`. @defaultValue `1` */
37
+ captureFps?: number;
38
+ /** Maximum width or height of a captured frame. Accepts `1` to `2048`. @defaultValue `720` */
39
+ maxImageDimension?: number;
40
+ /** Image compression and rolling traffic-budget controls. */
41
+ imagePolicy?: FTReplayImagePolicy;
42
+ /** Whether captured replays include touch positions. @defaultValue `'hide'` */
43
+ touchPrivacy?: FTReplayTouchPrivacy;
44
+ }
45
+ /** Internal native RUM context used by Session Replay encoding. */
46
+ export interface FTRUMContext {
47
+ applicationId: string;
48
+ sessionId: string;
49
+ viewId: string;
50
+ globalContext?: FTAttributes;
51
+ }
52
+ /** Internal privacy rectangle projected into a captured frame. */
53
+ export interface FTPrivacyRegion {
54
+ x: number;
55
+ y: number;
56
+ width: number;
57
+ height: number;
58
+ mode: Exclude<FTReplayPrivacyMode, 'unmask'>;
59
+ }
60
+ /** Internal in-memory representation of a captured Cocos frame. */
61
+ export interface FTCapturedFrame {
62
+ rgba: Uint8Array;
63
+ width: number;
64
+ height: number;
65
+ timestamp: number;
66
+ privacyRegions?: FTPrivacyRegion[];
67
+ }
68
+ /** Internal persisted representation of a captured Cocos frame. */
69
+ export interface FTStoredFrame {
70
+ path: string;
71
+ width: number;
72
+ height: number;
73
+ timestamp: number;
74
+ fingerprint: string;
75
+ }
76
+ export interface FTCocosReplayConfig extends FTCocosConfig {
77
+ replay?: FTSessionReplayConfig;
78
+ }
79
+ export interface FTCocosHybridReplayConfig extends FTCocosHybridConfig {
80
+ replay?: FTHybridSessionReplayConfig;
81
+ }
82
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/session-replay/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAExG,yDAAyD;AACzD,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D,sDAAsD;AACtD,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,yDAAyD;AACzD,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExD,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uGAAuG;IACvG,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,sEAAsE;AACtE,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oGAAoG;IACpG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAED,uFAAuF;AACvF,MAAM,WAAW,2BAA2B;IAC1C,oGAAoG;IACpG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAED,mEAAmE;AACnE,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;CAC9C;AAED,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,eAAe,EAAE,CAAC;CACpC;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IAAG,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAAE;AAC9F,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IAAG,MAAM,CAAC,EAAE,2BAA2B,CAAC;CAAE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/session-replay/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { FTHybridSessionReplayConfig, FTReplayQuality } from './types.js';
2
+ export declare function samplingRate(value: number | undefined, name: string): number | undefined;
3
+ export declare function captureFps(value: number | undefined): number;
4
+ export interface FTResolvedReplayImagePolicy {
5
+ quality: FTReplayQuality;
6
+ compressionQuality: number;
7
+ maxImageDimension: number;
8
+ maxFrameBytes: number;
9
+ maxBytesPerMinute: number;
10
+ adaptiveCapture: boolean;
11
+ }
12
+ export declare function replayImagePolicy(config: FTHybridSessionReplayConfig): FTResolvedReplayImagePolicy;
13
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../src/session-replay/core/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMxF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAM5D;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,eAAe,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAuBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,2BAA2B,GAAG,2BAA2B,CA2BlG"}
@@ -0,0 +1,70 @@
1
+ export function samplingRate(value, name) {
2
+ if (value === undefined)
3
+ return undefined;
4
+ if (!Number.isFinite(value) || value < 0 || value > 1) {
5
+ throw new RangeError(`${name} must be between 0 and 1`);
6
+ }
7
+ return value;
8
+ }
9
+ export function captureFps(value) {
10
+ const fps = value === undefined ? 1 : value;
11
+ if (!Number.isInteger(fps) || fps < 1 || fps > 5) {
12
+ throw new RangeError('captureFps must be an integer between 1 and 5');
13
+ }
14
+ return fps;
15
+ }
16
+ const REPLAY_IMAGE_PRESETS = {
17
+ low: {
18
+ compressionQuality: 0.35,
19
+ maxImageDimension: 480,
20
+ maxFrameBytes: 20 * 1024,
21
+ maxBytesPerMinute: Math.round(0.6 * 1024 * 1024),
22
+ },
23
+ medium: {
24
+ compressionQuality: 0.45,
25
+ maxImageDimension: 720,
26
+ maxFrameBytes: 40 * 1024,
27
+ maxBytesPerMinute: Math.round(1.5 * 1024 * 1024),
28
+ },
29
+ high: {
30
+ compressionQuality: 0.6,
31
+ maxImageDimension: 960,
32
+ maxFrameBytes: 80 * 1024,
33
+ maxBytesPerMinute: 4 * 1024 * 1024,
34
+ },
35
+ };
36
+ export function replayImagePolicy(config) {
37
+ var _a, _b, _c, _d, _e;
38
+ const policy = config.imagePolicy || {};
39
+ const quality = (_a = policy.quality) !== null && _a !== void 0 ? _a : 'medium';
40
+ if (!(quality in REPLAY_IMAGE_PRESETS)) {
41
+ throw new TypeError("imagePolicy.quality must be 'low', 'medium', or 'high'");
42
+ }
43
+ if (policy.adaptiveCapture !== undefined && typeof policy.adaptiveCapture !== 'boolean') {
44
+ throw new TypeError('imagePolicy.adaptiveCapture must be a boolean');
45
+ }
46
+ const preset = REPLAY_IMAGE_PRESETS[quality];
47
+ const maxImageDimension = (_b = config.maxImageDimension) !== null && _b !== void 0 ? _b : preset.maxImageDimension;
48
+ integerInRange(maxImageDimension, 1, 2048, 'maxImageDimension');
49
+ const maxFrameBytes = (_c = policy.maxFrameBytes) !== null && _c !== void 0 ? _c : preset.maxFrameBytes;
50
+ integerInRange(maxFrameBytes, 1024, 1024 * 1024, 'imagePolicy.maxFrameBytes');
51
+ const maxBytesPerMinute = (_d = policy.maxBytesPerMinute) !== null && _d !== void 0 ? _d : preset.maxBytesPerMinute;
52
+ integerInRange(maxBytesPerMinute, 16 * 1024, 64 * 1024 * 1024, 'imagePolicy.maxBytesPerMinute');
53
+ if (maxFrameBytes > maxBytesPerMinute) {
54
+ throw new RangeError('imagePolicy.maxFrameBytes must not exceed maxBytesPerMinute');
55
+ }
56
+ return {
57
+ quality,
58
+ compressionQuality: preset.compressionQuality,
59
+ maxImageDimension,
60
+ maxFrameBytes,
61
+ maxBytesPerMinute,
62
+ adaptiveCapture: (_e = policy.adaptiveCapture) !== null && _e !== void 0 ? _e : true,
63
+ };
64
+ }
65
+ function integerInRange(value, minimum, maximum, name) {
66
+ if (!Number.isInteger(value) || value < minimum || value > maximum) {
67
+ throw new RangeError(`${name} must be an integer between ${minimum} and ${maximum}`);
68
+ }
69
+ }
70
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../src/session-replay/core/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const FT_COCOS_REPLAY_VERSION = "0.1.0-alpha.6";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../../src/session-replay/core/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const FT_COCOS_REPLAY_VERSION = '0.1.0-alpha.6';
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../../src/session-replay/core/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { FTCanvasCapture } from '../core/replay.js';
2
+ import type { FTCapturedFrame, FTReplayPrivacyMode, FTStoredFrame } from '../core/types.js';
3
+ export declare class FTCreator3CanvasCapture implements FTCanvasCapture {
4
+ private camera;
5
+ private privacy;
6
+ setCamera(camera: unknown): void;
7
+ setPrivacy(node: unknown, mode: FTReplayPrivacyMode): void;
8
+ getViewportSize(): {
9
+ width: number;
10
+ height: number;
11
+ } | undefined;
12
+ capture(maxImageDimension: number): Promise<FTCapturedFrame | undefined>;
13
+ persist(frame: FTCapturedFrame, fingerprint?: string): Promise<FTStoredFrame>;
14
+ disposeStoredFrame(frame: FTStoredFrame): Promise<void>;
15
+ private collectPrivacyRegions;
16
+ }
17
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../../../src/session-replay/creator3/capture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAmB,mBAAmB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAO7G,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,OAAO,CAA2C;IAE1D,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAIhC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAK1D,eAAe,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAK1D,OAAO,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAqCxE,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,SAA+B,GAAG,OAAO,CAAC,aAAa,CAAC;IAIzG,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,OAAO,CAAC,qBAAqB;CA6B9B"}
@@ -0,0 +1,112 @@
1
+ import { Camera, Director, EditBox, RenderTexture, UITransform, Vec3, director, native, sys, view } from 'cc';
2
+ import { frameFingerprint } from '../core/replay.js';
3
+ import { persistReplayFrame, disposeReplayFrame } from '../core/replay-file.js';
4
+ import { projectPrivacyBounds } from '../core/replay-privacy.js';
5
+ import { collectReplayPrivacyNodes } from '../core/replay-privacy-nodes.js';
6
+ import { waitForRenderTextureReadback } from './replay-render-cycle.js';
7
+ export class FTCreator3CanvasCapture {
8
+ constructor() {
9
+ this.privacy = new Map();
10
+ }
11
+ setCamera(camera) {
12
+ this.camera = camera;
13
+ }
14
+ setPrivacy(node, mode) {
15
+ if (mode === 'unmask')
16
+ this.privacy.delete(node);
17
+ else
18
+ this.privacy.set(node, mode);
19
+ }
20
+ getViewportSize() {
21
+ var _a;
22
+ const visible = ((_a = view.getVisibleSizeInPixel) === null || _a === void 0 ? void 0 : _a.call(view)) || view.getVisibleSize();
23
+ return visible ? { width: visible.width, height: visible.height } : undefined;
24
+ }
25
+ async capture(maxImageDimension) {
26
+ var _a, _b;
27
+ const camera = this.camera || ((_a = director.getScene()) === null || _a === void 0 ? void 0 : _a.getComponentInChildren(Camera));
28
+ if (!camera)
29
+ return undefined;
30
+ const visible = this.getViewportSize();
31
+ if (!visible)
32
+ return undefined;
33
+ const scale = Math.min(1, maxImageDimension / Math.max(visible.width, visible.height));
34
+ const width = Math.max(1, Math.round(visible.width * scale));
35
+ const height = Math.max(1, Math.round(visible.height * scale));
36
+ const texture = new RenderTexture();
37
+ texture.reset({ width, height });
38
+ const previous = camera.targetTexture;
39
+ let pixels;
40
+ let privacyRegions = [];
41
+ try {
42
+ camera.targetTexture = texture;
43
+ await waitForRenderTextureReadback(completeDrawCycle);
44
+ pixels = texture.readPixels(0, 0, width, height);
45
+ // worldToScreen uses the active render target dimensions. Keep the
46
+ // capture target attached so projection and pixels share one viewport.
47
+ if (pixels)
48
+ privacyRegions = this.collectPrivacyRegions(camera, width, height);
49
+ }
50
+ finally {
51
+ camera.targetTexture = previous;
52
+ texture.destroy();
53
+ }
54
+ if (!pixels)
55
+ return undefined;
56
+ // Metal returns top-down pixels on iOS. OpenGL/Vulkan-backed native
57
+ // targets use a bottom-left origin and need row reversal for PNG output.
58
+ if (sys.os !== ((_b = sys.OS) === null || _b === void 0 ? void 0 : _b.IOS))
59
+ flipRows(pixels, width, height);
60
+ return {
61
+ rgba: pixels,
62
+ width,
63
+ height,
64
+ timestamp: Date.now(),
65
+ privacyRegions,
66
+ };
67
+ }
68
+ async persist(frame, fingerprint = frameFingerprint(frame.rgba)) {
69
+ return persistReplayFrame(frame, fingerprint, native.fileUtils.getWritablePath());
70
+ }
71
+ disposeStoredFrame(frame) {
72
+ return disposeReplayFrame(frame);
73
+ }
74
+ collectPrivacyRegions(camera, width, height) {
75
+ const scene = director.getScene();
76
+ const nodes = collectReplayPrivacyNodes(this.privacy, (scene === null || scene === void 0 ? void 0 : scene.getComponentsInChildren('ReplayPrivacy')) || [], (scene === null || scene === void 0 ? void 0 : scene.getComponentsInChildren(EditBox)) || []);
77
+ const regions = [];
78
+ nodes.forEach((mode, node) => {
79
+ var _a, _b, _c, _d;
80
+ const bounds = (_c = (_b = (_a = node === null || node === void 0 ? void 0 : node.getComponent) === null || _a === void 0 ? void 0 : _a.call(node, UITransform)) === null || _b === void 0 ? void 0 : _b.getBoundingBoxToWorld) === null || _c === void 0 ? void 0 : _c.call(_b);
81
+ if (!bounds)
82
+ return;
83
+ const worldZ = ((_d = node.worldPosition) === null || _d === void 0 ? void 0 : _d.z) || 0;
84
+ const projected = projectPrivacyBounds(bounds, width, height, width, height, (x, y) => { var _a; return (_a = camera.worldToScreen) === null || _a === void 0 ? void 0 : _a.call(camera, new Vec3(x, y, worldZ)); });
85
+ if (!projected)
86
+ throw new Error('Unable to project Replay privacy bounds');
87
+ regions.push({ ...projected, mode: mode === 'hide' ? 'hide' : 'mask' });
88
+ });
89
+ return regions;
90
+ }
91
+ }
92
+ async function completeDrawCycle() {
93
+ // capture() may run after the current frame's render graph has already been
94
+ // prepared. Waiting only for EVENT_AFTER_DRAW can then read the newly bound
95
+ // RenderTexture before the camera has rendered into it, producing a black
96
+ // FullSnapshot at a Native -> Cocos boundary. Start at the next draw boundary
97
+ // so the target texture is guaranteed to participate in a complete frame.
98
+ await new Promise((resolve) => director.once(Director.EVENT_BEFORE_DRAW, resolve));
99
+ await new Promise((resolve) => director.once(Director.EVENT_AFTER_DRAW, resolve));
100
+ }
101
+ function flipRows(bytes, width, height) {
102
+ const rowSize = width * 4;
103
+ const swap = new Uint8Array(rowSize);
104
+ for (let top = 0, bottom = height - 1; top < bottom; top += 1, bottom -= 1) {
105
+ const topOffset = top * rowSize;
106
+ const bottomOffset = bottom * rowSize;
107
+ swap.set(bytes.subarray(topOffset, topOffset + rowSize));
108
+ bytes.copyWithin(topOffset, bottomOffset, bottomOffset + rowSize);
109
+ bytes.set(swap, bottomOffset);
110
+ }
111
+ }
112
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../../src/session-replay/creator3/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FTCocosSDK } from '@cloudcare/cocos-sdk/plugin-api';
2
+ import { type FTCocosReplaySDK } from '../core/client.js';
3
+ /** Adds Session Replay to the matching Creator SDK before start or attach. */
4
+ export declare function withSessionReplay(sdk: FTCocosSDK): FTCocosReplaySDK;
5
+ export type { FTCocosReplaySDK } from '../core/client.js';
6
+ export type { FTCocosReplayConfig, FTCocosHybridReplayConfig, FTSessionReplayConfig, FTHybridSessionReplayConfig, FTReplayImagePolicy, FTReplayPrivacyMode, FTReplayQuality, FTReplayTouchPrivacy } from '../core/types.js';
7
+ export { FT_COCOS_REPLAY_VERSION } from '../core/version.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/session-replay/creator3/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAKhF,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB,CAMnE;AAED,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,qBAAqB,EACjF,2BAA2B,EAAE,mBAAmB,EAAE,mBAAmB,EACrE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { composeSessionReplay } from '../core/client.js';
2
+ import { FTCreator3CanvasCapture } from './capture.js';
3
+ import { FTCreator3ReplayTransport } from './transport.js';
4
+ import { FTCreator3PointerSource } from './pointer.js';
5
+ /** Adds Session Replay to the matching Creator SDK before start or attach. */
6
+ export function withSessionReplay(sdk) {
7
+ return composeSessionReplay(sdk, 'creator3', () => ({
8
+ transport: new FTCreator3ReplayTransport(),
9
+ capture: new FTCreator3CanvasCapture(),
10
+ pointers: new FTCreator3PointerSource(),
11
+ }));
12
+ }
13
+ export { FT_COCOS_REPLAY_VERSION } from '../core/version.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/session-replay/creator3/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,GAAe;IAC/C,OAAO,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,SAAS,EAAE,IAAI,yBAAyB,EAAE;QAC1C,OAAO,EAAE,IAAI,uBAAuB,EAAE;QACtC,QAAQ,EAAE,IAAI,uBAAuB,EAAE;KACxC,CAAC,CAAC,CAAC;AACN,CAAC;AAMD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FTReplayPointerEvent, FTReplayPointerSource } from '../core/replay.js';
2
+ export declare class FTCreator3PointerSource implements FTReplayPointerSource {
3
+ onReplayPointer(callback: (event: FTReplayPointerEvent) => void): () => void;
4
+ }
5
+ //# sourceMappingURL=pointer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../../../src/session-replay/creator3/pointer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAErF,qBAAa,uBAAwB,YAAW,qBAAqB;IACnE,eAAe,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,GAAG,MAAM,IAAI;CAY7E"}
@@ -0,0 +1,29 @@
1
+ import { Input, input, view } from 'cc';
2
+ export class FTCreator3PointerSource {
3
+ onReplayPointer(callback) {
4
+ const onStart = (event) => callback(replayPointer(event, 'down'));
5
+ const onEnd = (event) => callback(replayPointer(event, 'up'));
6
+ input.on(Input.EventType.TOUCH_START, onStart);
7
+ input.on(Input.EventType.TOUCH_END, onEnd);
8
+ input.on(Input.EventType.TOUCH_CANCEL, onEnd);
9
+ return () => {
10
+ input.off(Input.EventType.TOUCH_START, onStart);
11
+ input.off(Input.EventType.TOUCH_END, onEnd);
12
+ input.off(Input.EventType.TOUCH_CANCEL, onEnd);
13
+ };
14
+ }
15
+ }
16
+ function replayPointer(event, eventType) {
17
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
18
+ const location = ((_a = event.getUILocation) === null || _a === void 0 ? void 0 : _a.call(event)) || ((_b = event.getLocation) === null || _b === void 0 ? void 0 : _b.call(event)) || { x: 0, y: 0 };
19
+ const size = ((_c = view.getVisibleSize) === null || _c === void 0 ? void 0 : _c.call(view)) || { width: 1, height: 1 };
20
+ const origin = ((_d = view.getVisibleOrigin) === null || _d === void 0 ? void 0 : _d.call(view)) || { x: 0, y: 0 };
21
+ return {
22
+ eventType,
23
+ pointerId: (_j = (_f = (_e = event.getID) === null || _e === void 0 ? void 0 : _e.call(event)) !== null && _f !== void 0 ? _f : (_h = (_g = event.touch) === null || _g === void 0 ? void 0 : _g.getID) === null || _h === void 0 ? void 0 : _h.call(_g)) !== null && _j !== void 0 ? _j : 0,
24
+ normalizedX: size.width > 0 ? (location.x - origin.x) / size.width : 0,
25
+ normalizedY: size.height > 0 ? 1 - ((location.y - origin.y) / size.height) : 0,
26
+ timestamp: Date.now(),
27
+ };
28
+ }
29
+ //# sourceMappingURL=pointer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointer.js","sourceRoot":"","sources":["../../../../../src/session-replay/creator3/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAGxC,MAAM,OAAO,uBAAuB;IAClC,eAAe,CAAC,QAA+C;QAC7D,MAAM,OAAO,GAAG,CAAC,KAAU,EAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,CAAC,KAAU,EAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACzE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3C,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAChD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC5C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC;IACJ,CAAC;CACF;AAED,SAAS,aAAa,CAAC,KAAU,EAAE,SAAwB;;IACzD,MAAM,QAAQ,GAAG,CAAA,MAAA,KAAK,CAAC,aAAa,qDAAI,MAAI,MAAA,KAAK,CAAC,WAAW,qDAAI,CAAA,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpF,MAAM,IAAI,GAAG,CAAA,MAAA,IAAI,CAAC,cAAc,oDAAI,KAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAChE,MAAM,MAAM,GAAG,CAAA,MAAA,IAAI,CAAC,gBAAgB,oDAAI,KAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3D,OAAO;QACL,SAAS;QACT,SAAS,EAAE,MAAA,MAAA,MAAA,KAAK,CAAC,KAAK,qDAAI,mCAAI,MAAA,MAAA,KAAK,CAAC,KAAK,0CAAE,KAAK,kDAAI,mCAAI,CAAC;QACzD,WAAW,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtE,WAAW,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Waits until a newly attached native RenderTexture is safe to read back.
3
+ *
4
+ * Creator 3 can submit the first draw while the target attachment is still
5
+ * being applied by the native renderer. Keeping the target attached for a
6
+ * second complete draw prevents an empty first Session Replay snapshot.
7
+ */
8
+ export declare function waitForRenderTextureReadback(drawCycle: () => Promise<void>): Promise<void>;
9
+ //# sourceMappingURL=replay-render-cycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-render-cycle.d.ts","sourceRoot":"","sources":["../../../../../src/session-replay/creator3/replay-render-cycle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhG"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Waits until a newly attached native RenderTexture is safe to read back.
3
+ *
4
+ * Creator 3 can submit the first draw while the target attachment is still
5
+ * being applied by the native renderer. Keeping the target attached for a
6
+ * second complete draw prevents an empty first Session Replay snapshot.
7
+ */
8
+ export async function waitForRenderTextureReadback(drawCycle) {
9
+ await drawCycle();
10
+ await drawCycle();
11
+ }
12
+ //# sourceMappingURL=replay-render-cycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-render-cycle.js","sourceRoot":"","sources":["../../../../../src/session-replay/creator3/replay-render-cycle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,SAA8B;IAC/E,MAAM,SAAS,EAAE,CAAC;IAClB,MAAM,SAAS,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type FTNativeTransport } from '../core/transport.js';
2
+ import type { FTValue } from '@cloudcare/cocos-sdk/plugin-api';
3
+ export declare class FTCreator3ReplayTransport implements FTNativeTransport {
4
+ readonly platform: 'android' | 'ios' | 'unsupported';
5
+ constructor();
6
+ invokeAsync<T = FTValue>(method: string, payload?: unknown): Promise<T | undefined>;
7
+ invoke<T = FTValue>(method: string, payload?: unknown): T | undefined;
8
+ }
9
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../../src/session-replay/creator3/transport.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAE/D,qBAAa,yBAA0B,YAAW,iBAAiB;IACjE,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,KAAK,GAAG,aAAa,CAAC;;IAYrD,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAInF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS;CActE"}
@@ -0,0 +1,28 @@
1
+ import { invokeReplayAsync } from '../core/replay-async-transport.js';
2
+ import { native, sys } from 'cc';
3
+ import { NATIVE } from 'cc/env';
4
+ import { parseTransportResponse } from '../core/transport.js';
5
+ export class FTCreator3ReplayTransport {
6
+ constructor() {
7
+ this.platform = !NATIVE
8
+ ? 'unsupported'
9
+ : sys.os === sys.OS.ANDROID
10
+ ? 'android'
11
+ : sys.os === sys.OS.IOS
12
+ ? 'ios'
13
+ : 'unsupported';
14
+ }
15
+ invokeAsync(method, payload) {
16
+ return invokeReplayAsync(this, method, payload);
17
+ }
18
+ invoke(method, payload) {
19
+ if (this.platform === 'unsupported')
20
+ return undefined;
21
+ const json = payload === undefined ? '{}' : JSON.stringify(payload);
22
+ const raw = this.platform === 'android'
23
+ ? native.reflection.callStaticMethod('com/ft/sdk/cocos/FTCocosReplayBridge', 'invoke', '(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;', method, json)
24
+ : native.reflection.callStaticMethod('FTCocosReplayBridge', 'invoke:payload:', method, json);
25
+ return parseTransportResponse(raw);
26
+ }
27
+ }
28
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../../src/session-replay/creator3/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAA0B,MAAM,sBAAsB,CAAC;AAGtF,MAAM,OAAO,yBAAyB;IAGpC;QACE,IAAI,CAAC,QAAQ,GAAG,CAAC,MAAM;YACrB,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,OAAO;gBACzB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG;oBACrB,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,aAAa,CAAC;IACxB,CAAC;IAED,WAAW,CAAc,MAAc,EAAE,OAAiB;QACxD,OAAO,iBAAiB,CAAI,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAc,MAAc,EAAE,OAAiB;QACnD,IAAI,IAAI,CAAC,QAAQ,KAAK,aAAa;YAAE,OAAO,SAAS,CAAC;QACtD,MAAM,IAAI,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS;YACrC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAChC,sCAAsC,EACtC,QAAQ,EACR,0DAA0D,EAC1D,MAAM,EACN,IAAI,CACL;YACH,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/F,OAAO,sBAAsB,CAAI,GAAG,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ {"type":"module"}