@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.
- package/LICENSE +202 -0
- package/README.md +53 -0
- package/THIRD_PARTY_NOTICES +5 -0
- package/components/creator2/ReplayPrivacy.ts +23 -0
- package/components/creator3/ReplayPrivacy.ts +25 -0
- package/creator2/package.json +4 -0
- package/creator3/package.json +5 -0
- package/dist/creator2/core/client.d.ts +30 -0
- package/dist/creator2/core/client.d.ts.map +1 -0
- package/dist/creator2/core/client.js +115 -0
- package/dist/creator2/core/client.js.map +1 -0
- package/dist/creator2/core/replay-async-transport.d.ts +4 -0
- package/dist/creator2/core/replay-async-transport.d.ts.map +1 -0
- package/dist/creator2/core/replay-async-transport.js +67 -0
- package/dist/creator2/core/replay-async-transport.js.map +1 -0
- package/dist/creator2/core/replay-budget.d.ts +28 -0
- package/dist/creator2/core/replay-budget.d.ts.map +1 -0
- package/dist/creator2/core/replay-budget.js +126 -0
- package/dist/creator2/core/replay-budget.js.map +1 -0
- package/dist/creator2/core/replay-diagnostics.d.ts +36 -0
- package/dist/creator2/core/replay-diagnostics.d.ts.map +1 -0
- package/dist/creator2/core/replay-diagnostics.js +40 -0
- package/dist/creator2/core/replay-diagnostics.js.map +1 -0
- package/dist/creator2/core/replay-encoding.d.ts +31 -0
- package/dist/creator2/core/replay-encoding.d.ts.map +1 -0
- package/dist/creator2/core/replay-encoding.js +63 -0
- package/dist/creator2/core/replay-encoding.js.map +1 -0
- package/dist/creator2/core/replay-file.d.ts +5 -0
- package/dist/creator2/core/replay-file.d.ts.map +1 -0
- package/dist/creator2/core/replay-file.js +101 -0
- package/dist/creator2/core/replay-file.js.map +1 -0
- package/dist/creator2/core/replay-pixels.d.ts +3 -0
- package/dist/creator2/core/replay-pixels.d.ts.map +1 -0
- package/dist/creator2/core/replay-pixels.js +16 -0
- package/dist/creator2/core/replay-pixels.js.map +1 -0
- package/dist/creator2/core/replay-privacy-nodes.d.ts +14 -0
- package/dist/creator2/core/replay-privacy-nodes.d.ts.map +1 -0
- package/dist/creator2/core/replay-privacy-nodes.js +18 -0
- package/dist/creator2/core/replay-privacy-nodes.js.map +1 -0
- package/dist/creator2/core/replay-privacy.d.ts +15 -0
- package/dist/creator2/core/replay-privacy.d.ts.map +1 -0
- package/dist/creator2/core/replay-privacy.js +36 -0
- package/dist/creator2/core/replay-privacy.js.map +1 -0
- package/dist/creator2/core/replay.d.ts +102 -0
- package/dist/creator2/core/replay.d.ts.map +1 -0
- package/dist/creator2/core/replay.js +653 -0
- package/dist/creator2/core/replay.js.map +1 -0
- package/dist/creator2/core/transport.d.ts +3 -0
- package/dist/creator2/core/transport.d.ts.map +1 -0
- package/dist/creator2/core/transport.js +22 -0
- package/dist/creator2/core/transport.js.map +1 -0
- package/dist/creator2/core/types.d.ts +82 -0
- package/dist/creator2/core/types.d.ts.map +1 -0
- package/dist/creator2/core/types.js +3 -0
- package/dist/creator2/core/types.js.map +1 -0
- package/dist/creator2/core/validation.d.ts +13 -0
- package/dist/creator2/core/validation.d.ts.map +1 -0
- package/dist/creator2/core/validation.js +75 -0
- package/dist/creator2/core/validation.js.map +1 -0
- package/dist/creator2/core/version.d.ts +2 -0
- package/dist/creator2/core/version.d.ts.map +1 -0
- package/dist/creator2/core/version.js +5 -0
- package/dist/creator2/core/version.js.map +1 -0
- package/dist/creator2/creator2/capture.d.ts +17 -0
- package/dist/creator2/creator2/capture.d.ts.map +1 -0
- package/dist/creator2/creator2/capture.js +168 -0
- package/dist/creator2/creator2/capture.js.map +1 -0
- package/dist/creator2/creator2/index.d.ts +8 -0
- package/dist/creator2/creator2/index.d.ts.map +1 -0
- package/dist/creator2/creator2/index.js +19 -0
- package/dist/creator2/creator2/index.js.map +1 -0
- package/dist/creator2/creator2/pointer.d.ts +5 -0
- package/dist/creator2/creator2/pointer.d.ts.map +1 -0
- package/dist/creator2/creator2/pointer.js +49 -0
- package/dist/creator2/creator2/pointer.js.map +1 -0
- package/dist/creator2/creator2/transport.d.ts +8 -0
- package/dist/creator2/creator2/transport.d.ts.map +1 -0
- package/dist/creator2/creator2/transport.js +38 -0
- package/dist/creator2/creator2/transport.js.map +1 -0
- package/dist/creator3/core/client.d.ts +30 -0
- package/dist/creator3/core/client.d.ts.map +1 -0
- package/dist/creator3/core/client.js +97 -0
- package/dist/creator3/core/client.js.map +1 -0
- package/dist/creator3/core/replay-async-transport.d.ts +4 -0
- package/dist/creator3/core/replay-async-transport.d.ts.map +1 -0
- package/dist/creator3/core/replay-async-transport.js +16 -0
- package/dist/creator3/core/replay-async-transport.js.map +1 -0
- package/dist/creator3/core/replay-budget.d.ts +28 -0
- package/dist/creator3/core/replay-budget.d.ts.map +1 -0
- package/dist/creator3/core/replay-budget.js +118 -0
- package/dist/creator3/core/replay-budget.js.map +1 -0
- package/dist/creator3/core/replay-diagnostics.d.ts +36 -0
- package/dist/creator3/core/replay-diagnostics.d.ts.map +1 -0
- package/dist/creator3/core/replay-diagnostics.js +36 -0
- package/dist/creator3/core/replay-diagnostics.js.map +1 -0
- package/dist/creator3/core/replay-encoding.d.ts +31 -0
- package/dist/creator3/core/replay-encoding.d.ts.map +1 -0
- package/dist/creator3/core/replay-encoding.js +62 -0
- package/dist/creator3/core/replay-encoding.js.map +1 -0
- package/dist/creator3/core/replay-file.d.ts +5 -0
- package/dist/creator3/core/replay-file.d.ts.map +1 -0
- package/dist/creator3/core/replay-file.js +31 -0
- package/dist/creator3/core/replay-file.js.map +1 -0
- package/dist/creator3/core/replay-pixels.d.ts +3 -0
- package/dist/creator3/core/replay-pixels.d.ts.map +1 -0
- package/dist/creator3/core/replay-pixels.js +13 -0
- package/dist/creator3/core/replay-pixels.js.map +1 -0
- package/dist/creator3/core/replay-privacy-nodes.d.ts +14 -0
- package/dist/creator3/core/replay-privacy-nodes.d.ts.map +1 -0
- package/dist/creator3/core/replay-privacy-nodes.js +15 -0
- package/dist/creator3/core/replay-privacy-nodes.js.map +1 -0
- package/dist/creator3/core/replay-privacy.d.ts +15 -0
- package/dist/creator3/core/replay-privacy.d.ts.map +1 -0
- package/dist/creator3/core/replay-privacy.js +33 -0
- package/dist/creator3/core/replay-privacy.js.map +1 -0
- package/dist/creator3/core/replay.d.ts +102 -0
- package/dist/creator3/core/replay.d.ts.map +1 -0
- package/dist/creator3/core/replay.js +576 -0
- package/dist/creator3/core/replay.js.map +1 -0
- package/dist/creator3/core/transport.d.ts +3 -0
- package/dist/creator3/core/transport.d.ts.map +1 -0
- package/dist/creator3/core/transport.js +19 -0
- package/dist/creator3/core/transport.js.map +1 -0
- package/dist/creator3/core/types.d.ts +82 -0
- package/dist/creator3/core/types.d.ts.map +1 -0
- package/dist/creator3/core/types.js +2 -0
- package/dist/creator3/core/types.js.map +1 -0
- package/dist/creator3/core/validation.d.ts +13 -0
- package/dist/creator3/core/validation.d.ts.map +1 -0
- package/dist/creator3/core/validation.js +70 -0
- package/dist/creator3/core/validation.js.map +1 -0
- package/dist/creator3/core/version.d.ts +2 -0
- package/dist/creator3/core/version.d.ts.map +1 -0
- package/dist/creator3/core/version.js +2 -0
- package/dist/creator3/core/version.js.map +1 -0
- package/dist/creator3/creator3/capture.d.ts +17 -0
- package/dist/creator3/creator3/capture.d.ts.map +1 -0
- package/dist/creator3/creator3/capture.js +112 -0
- package/dist/creator3/creator3/capture.js.map +1 -0
- package/dist/creator3/creator3/index.d.ts +8 -0
- package/dist/creator3/creator3/index.d.ts.map +1 -0
- package/dist/creator3/creator3/index.js +14 -0
- package/dist/creator3/creator3/index.js.map +1 -0
- package/dist/creator3/creator3/pointer.d.ts +5 -0
- package/dist/creator3/creator3/pointer.d.ts.map +1 -0
- package/dist/creator3/creator3/pointer.js +29 -0
- package/dist/creator3/creator3/pointer.js.map +1 -0
- package/dist/creator3/creator3/replay-render-cycle.d.ts +9 -0
- package/dist/creator3/creator3/replay-render-cycle.d.ts.map +1 -0
- package/dist/creator3/creator3/replay-render-cycle.js +12 -0
- package/dist/creator3/creator3/replay-render-cycle.js.map +1 -0
- package/dist/creator3/creator3/transport.d.ts +9 -0
- package/dist/creator3/creator3/transport.d.ts.map +1 -0
- package/dist/creator3/creator3/transport.js +28 -0
- package/dist/creator3/creator3/transport.js.map +1 -0
- package/dist/creator3/package.json +1 -0
- package/native/android/src/main/java/com/ft/sdk/cocos/FTCocosReplayBridge.java +168 -0
- package/native/android/src/main/java/com/ft/sdk/cocos/FTCocosReplayImageJobs.java +55 -0
- package/native/ios/FTCocosReplayBridge.h +10 -0
- package/native/ios/FTCocosReplayBridge.m +275 -0
- package/native/ios/FTCocosReplayBridge.podspec +18 -0
- package/native/ios/FTCocosReplayImageJobs.h +11 -0
- package/native/ios/FTCocosReplayImageJobs.m +54 -0
- package/native/ios/Package.swift +26 -0
- package/native/ios/include/FTCocosReplayBridge.h +10 -0
- package/native/shared/FTReplayFileBridge.h +62 -0
- package/native/shared/FTReplayFileWorker.h +88 -0
- package/native-integration.json +9 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|