@mikeci/pos-analytics-replay 0.2.1 → 0.3.1
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/CHANGELOG.md +15 -0
- package/README.md +35 -70
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/recorder.d.ts +7 -0
- package/dist/recorder.d.ts.map +1 -1
- package/dist/recorder.js +30 -4
- package/dist/recorder.js.map +1 -1
- package/dist/uploader.d.ts +123 -0
- package/dist/uploader.d.ts.map +1 -0
- package/dist/uploader.js +329 -0
- package/dist/uploader.js.map +1 -0
- package/package.json +2 -2
- package/dist/protocol.d.ts +0 -36
- package/dist/protocol.d.ts.map +0 -1
- package/dist/protocol.js +0 -58
- package/dist/protocol.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.1
|
|
4
|
+
|
|
5
|
+
- Cần `@mikeci/pos-replay-protocol` ^0.2.2 (`startedAtMs`, `Scene.scrolls`).
|
|
6
|
+
|
|
7
|
+
- Chunk mang `startedAtMs` (giờ thật ứng với `offsetMs = 0`) để CMS căn replay với event và nối các replay của cùng session.
|
|
8
|
+
- Sau mỗi snapshot, recorder ghi lại vị trí cuộn mới nhất của các khung cuộn có trong snapshot (kể cả lần cuộn bị bỏ do giới hạn tần suất). Trước đây quay lại một màn đã cuộn, hay tua vào giữa phiên, player vẽ danh sách ở vị trí 0. Gỡ node thì quên vị trí cuộn của nó.
|
|
9
|
+
|
|
10
|
+
## 0.3.0
|
|
11
|
+
|
|
12
|
+
- Cần `@mikeci/pos-replay-protocol` ^0.2.1 (thêm `applyRecord`, `cloneScene`; kiểm tra kích thước chunk nhanh hơn).
|
|
13
|
+
- **BREAKING:** gỡ API wireframe cũ (`maskTree`, `applyFrames`, `buildChunk`, `shouldMask`, `maskText`, kiểu `WireNode`/`WireframeFrame`) và mã chụp native `WireframeCapture` (Swift/Kotlin). Collector không còn nhận `POST /v1/replay` (trả `410`). Dùng `ReplayRecorder` + `ReplayUploader`; mask do `maskNode` của `@mikeci/pos-replay-protocol`.
|
|
14
|
+
- Thêm `ReplayUploader`: hàng đợi chunk bền vững trên AsyncStorage (mỗi chunk một khóa, tránh giới hạn 2 MB mỗi dòng trên Android), gửi theo thứ tự tới `POST /v1/replay/chunks`, retry có backoff và tôn trọng `Retry-After`, bỏ chunk server không bao giờ nhận (4xx), dừng và xóa hàng đợi khi server báo `replay_disabled`, báo `POST /v1/replay/end`, và lưu `GET /v1/sdk/config` để mở app offline vẫn biết có được ghi hay không.
|
|
15
|
+
- `uploader.attach(recorder)` tự `tick()`, chuyển chunk từ recorder sang hàng đợi và gửi định kỳ; `background()` / `stop()` đóng chunk và gửi ngay.
|
|
16
|
+
- `ReplayRecorder.settled()` chờ các lần đóng chunk chạy ngầm xong.
|
|
17
|
+
|
|
3
18
|
## 0.2.1
|
|
4
19
|
|
|
5
20
|
- Phát hành lại 0.2.0. Bản 0.2.0 bị npm giữ ở trạng thái staged và không cài được.
|
package/README.md
CHANGED
|
@@ -1,92 +1,57 @@
|
|
|
1
1
|
# @mikeci/pos-analytics-replay
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Session replay cho app React Native: ghi cây component (không quay video, không gửi bitmap), che dữ liệu nhạy cảm, lưu hàng đợi trên máy và gửi lên collector theo protocol V2 (`POST /v1/replay/chunks`).
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
npm install @mikeci/pos-analytics-replay
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
> **Đã gỡ định dạng wireframe cũ.** `maskTree`, `applyFrames`, `buildChunk`, `shouldMask`, `maskText` và mã chụp native `WireframeCapture` (Swift/Kotlin) không còn. Collector trả `410 replay_legacy_removed` cho `POST /v1/replay`. App đang dùng định dạng cũ cần chuyển sang `ReplayRecorder` + `ReplayUploader` bên dưới.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
`maskTree` đi qua cả cây. Node bị mask có `masked: true` và `text` thành `••••`. Node không có text giữ nguyên. Node đã đặt `masked: true` cũng bị che, kể cả khi type không nằm trong danh sách trên.
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
import { maskTree, shouldMask } from "@mikeci/pos-analytics-replay";
|
|
17
|
-
|
|
18
|
-
shouldMask("TextInput");
|
|
19
|
-
shouldMask("Text", { analyticsMask: true });
|
|
20
|
-
shouldMask("View");
|
|
21
|
-
|
|
22
|
-
const [field] = maskTree([
|
|
23
|
-
{ id: "phone", type: "TextInput", x: 0, y: 0, w: 200, h: 40, text: "0901234567" },
|
|
24
|
-
]);
|
|
25
|
-
field?.text;
|
|
26
|
-
// "••••"
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
`maskText` chỉ đổi một chuỗi. Chuỗi rỗng hoặc `undefined` được trả lại nguyên.
|
|
30
|
-
|
|
31
|
-
## Ghép frame
|
|
32
|
-
|
|
33
|
-
Mỗi frame là một snapshot hoặc một diff.
|
|
34
|
-
|
|
35
|
-
| Field | Ý nghĩa |
|
|
36
|
-
| --- | --- |
|
|
37
|
-
| `seq` | Số thứ tự frame |
|
|
38
|
-
| `ts` | Thời điểm ISO |
|
|
39
|
-
| `full` | `true` thì thay toàn bộ cây hiện tại |
|
|
40
|
-
| `nodes` | Node thêm hoặc cập nhật |
|
|
41
|
-
| `removed` | Id cần xóa khỏi cây hiện tại |
|
|
42
|
-
|
|
43
|
-
`applyFrames` áp dụng lần lượt, mask từng frame, rồi trả về các node gốc theo thứ tự xuất hiện. Frame `full: true` xóa trạng thái trước đó. Cùng một id được cập nhật tại chỗ và không đổi vị trí trong danh sách.
|
|
44
|
-
|
|
45
|
-
```ts
|
|
46
|
-
import { applyFrames } from "@mikeci/pos-analytics-replay";
|
|
11
|
+
## Recorder
|
|
47
12
|
|
|
48
|
-
|
|
49
|
-
{
|
|
50
|
-
seq: 1,
|
|
51
|
-
ts: "2026-09-25T00:00:00.000Z",
|
|
52
|
-
full: true,
|
|
53
|
-
nodes: [
|
|
54
|
-
{ id: "root", type: "View", x: 0, y: 0, w: 100, h: 40 },
|
|
55
|
-
{ id: "title", type: "Text", x: 0, y: 40, w: 80, h: 20, text: "Home" },
|
|
56
|
-
],
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
seq: 2,
|
|
60
|
-
ts: "2026-09-25T00:00:01.000Z",
|
|
61
|
-
full: false,
|
|
62
|
-
removed: ["title"],
|
|
63
|
-
nodes: [{ id: "next", type: "Text", x: 0, y: 40, w: 80, h: 20, text: "Next" }],
|
|
64
|
-
},
|
|
65
|
-
]);
|
|
66
|
-
```
|
|
13
|
+
`ReplayRecorder` ghi snapshot, patch và tap/scroll theo protocol mới. Hàng đợi replay tách khỏi hàng đợi event. Input và component nhạy cảm được mask trước khi vào chunk. `ReplayScreen`, `ReplayView`, `ReplayButton`, `ReplayText` và `ReplayInput` đăng ký node. Sampling và kill switch lấy từ `GET /v1/sdk/config`.
|
|
67
14
|
|
|
68
|
-
Kết quả là `root` rồi `next`.
|
|
69
15
|
|
|
70
|
-
##
|
|
16
|
+
## Gửi replay lên collector
|
|
71
17
|
|
|
72
|
-
`
|
|
18
|
+
`ReplayUploader` lưu chunk xuống máy và gửi lên collector. Hàng đợi nằm trong AsyncStorage nên không mất khi app bị kill hoặc mất mạng.
|
|
73
19
|
|
|
74
20
|
```ts
|
|
75
|
-
import
|
|
21
|
+
import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
22
|
+
import { ReplayRecorder, ReplayUploader, recorderOptionsFromConfig } from "@mikeci/pos-analytics-replay";
|
|
76
23
|
|
|
77
|
-
const
|
|
24
|
+
const uploader = new ReplayUploader({
|
|
25
|
+
endpoint: "https://ingest.example.com",
|
|
78
26
|
appId: "veso24h",
|
|
27
|
+
writeKey: CLIENT_WRITE_KEY,
|
|
79
28
|
environment: "production",
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
ts: "2026-09-25T00:00:00.000Z",
|
|
83
|
-
frame,
|
|
29
|
+
storage: AsyncStorage,
|
|
30
|
+
// compress: async (json) => pako.gzip(json), // tùy chọn: gửi gzip để tiết kiệm dữ liệu di động
|
|
84
31
|
});
|
|
85
|
-
```
|
|
86
32
|
|
|
87
|
-
|
|
33
|
+
// Chưa có mạng và chưa có cấu hình đã lưu thì trả enabled=false: không ghi, event vẫn gửi bình thường.
|
|
34
|
+
const config = await uploader.loadConfig();
|
|
35
|
+
const recorder = new ReplayRecorder({
|
|
36
|
+
replayId,
|
|
37
|
+
sessionId,
|
|
38
|
+
viewport,
|
|
39
|
+
...recorderOptionsFromConfig(config),
|
|
40
|
+
});
|
|
41
|
+
const replay = uploader.attach(recorder); // tự tick() mỗi 150 ms, gửi mỗi 5 giây
|
|
88
42
|
|
|
89
|
-
|
|
43
|
+
// AppState: 'background' -> await replay.background(); 'active' -> replay.foreground();
|
|
44
|
+
// Rời session: await replay.stop(); // gửi nốt hàng đợi và POST /v1/replay/end
|
|
45
|
+
```
|
|
90
46
|
|
|
91
|
-
|
|
47
|
+
Cách hoạt động:
|
|
48
|
+
|
|
49
|
+
| Tình huống | Hành vi |
|
|
50
|
+
| --- | --- |
|
|
51
|
+
| Mất mạng, `429`, `5xx` | Giữ chunk, thử lại theo backoff 5s → 15s → 30s → 1p → 5p (có jitter), dùng `Retry-After` nếu server gửi. Dừng ở chunk lỗi để giữ thứ tự. Quá `maxAttempts` (8) thì bỏ chunk |
|
|
52
|
+
| `400`, `401`, `409`, `413` | Bỏ chunk đó và gửi tiếp chunk sau (gửi lại cũng không thành công) |
|
|
53
|
+
| `403 replay_disabled` | Xóa hàng đợi, đặt `uploader.isDisabled = true`, không ghi thêm |
|
|
54
|
+
| Hàng đợi quá `maxChunks` (30) hoặc `maxBytes` (2 MB) | Bỏ chunk cũ nhất |
|
|
55
|
+
| Lỗi ghi storage | Bỏ chunk, không ném lỗi ra app |
|
|
92
56
|
|
|
57
|
+
Chunk đã gửi lại thì collector trả `duplicate: true` nên gửi lặp không tạo bản sao. Collector cũng mask lần hai dữ liệu cá nhân; SDK vẫn phải mask trước khi gửi.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type { ReplayChunk, ReplayNode, ReplayNodeType, ReplayViewport } from "@mikeci/pos-replay-protocol";
|
|
2
|
-
export { applyFrames, buildChunk, maskText, maskTree, shouldMask } from "./protocol.js";
|
|
3
|
-
export type { WireframeFrame, WireNode } from "./protocol.js";
|
|
4
2
|
export { ReplayRecorder, backoffMs } from "./recorder.js";
|
|
5
3
|
export { ReplayButton, ReplayInput, ReplayNodeView, ReplayProvider, ReplayScreen, ReplayText, ReplayView } from "./components.js";
|
|
4
|
+
export { ReplayUploader, recorderOptionsFromConfig, uploadBackoffMs } from "./uploader.js";
|
|
5
|
+
export type { AttachedReplay, ReplayConfig, ReplayStorage, ReplayUploaderOptions } from "./uploader.js";
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3G,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3G,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClI,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC3F,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { applyFrames, buildChunk, maskText, maskTree, shouldMask } from "./protocol.js";
|
|
2
1
|
export { ReplayRecorder, backoffMs } from "./recorder.js";
|
|
3
2
|
export { ReplayButton, ReplayInput, ReplayNodeView, ReplayProvider, ReplayScreen, ReplayText, ReplayView } from "./components.js";
|
|
3
|
+
export { ReplayUploader, recorderOptionsFromConfig, uploadBackoffMs } from "./uploader.js";
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClI,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/recorder.d.ts
CHANGED
|
@@ -38,6 +38,8 @@ export declare class ReplayRecorder {
|
|
|
38
38
|
private origin;
|
|
39
39
|
private lastPatchAt;
|
|
40
40
|
private lastScrollAt;
|
|
41
|
+
/** Vị trí cuộn mới nhất của từng khung (kể cả lần bị bỏ do giới hạn tần suất), phát lại sau mỗi snapshot. */
|
|
42
|
+
private scrolls;
|
|
41
43
|
private chunkSequence;
|
|
42
44
|
private sensitive;
|
|
43
45
|
private gapPending;
|
|
@@ -79,6 +81,9 @@ export declare class ReplayRecorder {
|
|
|
79
81
|
prepareScreen(screenInstanceId: string): void;
|
|
80
82
|
tick(): Promise<void> | Promise<ReplayChunk | null>;
|
|
81
83
|
private snapshotRecord;
|
|
84
|
+
/** Snapshot không mang vị trí cuộn: ghi lại vị trí hiện tại của các khung cuộn có trong snapshot ngay sau nó. */
|
|
85
|
+
private scrollRecords;
|
|
86
|
+
private pushSnapshot;
|
|
82
87
|
private emittedNodes;
|
|
83
88
|
private include;
|
|
84
89
|
private screenOf;
|
|
@@ -89,6 +94,8 @@ export declare class ReplayRecorder {
|
|
|
89
94
|
private fail;
|
|
90
95
|
rotate(force: boolean): Promise<ReplayChunk | null>;
|
|
91
96
|
private enqueue;
|
|
97
|
+
/** Chờ các lần đóng chunk đang chạy ngầm (`background`, `accountChanged`, `prepareScreen`) xong và vào `queue`. */
|
|
98
|
+
settled(): Promise<void>;
|
|
92
99
|
stats(): {
|
|
93
100
|
dropped: number;
|
|
94
101
|
queued: number;
|
package/dist/recorder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,WAAW,EAAE,KAAK,UAAU,EAAqB,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,WAAW,EAAE,KAAK,UAAU,EAAqB,KAAK,cAAc,EAAuB,MAAM,6BAA6B,CAAC;AAEhM,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,cAAc;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,wEAAwE;IACxE,OAAO,UAAS;IAChB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAS;IAC3C,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAA6B;IACjD,6GAA6G;IAC7G,OAAO,CAAC,OAAO,CAA6D;IAC5E,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAoC;IACpD,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,CAAM;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,OAAO,EAAE,eAAe;IAsBpC,IAAI,MAAM,YAET;IAED,SAAS,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAI3D,OAAO,CAAC,MAAM;IAId,MAAM,CAAC,IAAI,EAAE,UAAU;IAgBvB,MAAM,CAAC,EAAE,EAAE,MAAM;IAQjB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO;IAM/E,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;IAUvF,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM;IAMzC,UAAU;IAQV,UAAU;IASV,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM;IAajC,uEAAuE;IACvE,aAAa,CAAC,gBAAgB,EAAE,MAAM;IAWtC,IAAI;IAQJ,OAAO,CAAC,cAAc;IAItB,iHAAiH;IACjH,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,IAAI;IASZ,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;YAoBrC,OAAO;IAoCrB,mHAAmH;IACnH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,KAAK;;;;;;CAGN;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAc,GAAG,MAAM,CAGvE"}
|
package/dist/recorder.js
CHANGED
|
@@ -21,6 +21,8 @@ export class ReplayRecorder {
|
|
|
21
21
|
origin = 0;
|
|
22
22
|
lastPatchAt = 0;
|
|
23
23
|
lastScrollAt = new Map();
|
|
24
|
+
/** Vị trí cuộn mới nhất của từng khung (kể cả lần bị bỏ do giới hạn tần suất), phát lại sau mỗi snapshot. */
|
|
25
|
+
scrolls = new Map();
|
|
24
26
|
chunkSequence = 0;
|
|
25
27
|
sensitive = false;
|
|
26
28
|
gapPending = false;
|
|
@@ -83,11 +85,12 @@ export class ReplayRecorder {
|
|
|
83
85
|
return;
|
|
84
86
|
this.dirty.add(masked.id);
|
|
85
87
|
if (this.records.length === 0)
|
|
86
|
-
this.
|
|
88
|
+
this.pushSnapshot();
|
|
87
89
|
}
|
|
88
90
|
remove(id) {
|
|
89
91
|
if (!this.active)
|
|
90
92
|
return;
|
|
93
|
+
this.scrolls.delete(id);
|
|
91
94
|
if (!this.nodes.delete(id))
|
|
92
95
|
return;
|
|
93
96
|
this.removed.push(id);
|
|
@@ -102,6 +105,7 @@ export class ReplayRecorder {
|
|
|
102
105
|
scroll(targetId, point) {
|
|
103
106
|
if (!this.active || this.sensitive)
|
|
104
107
|
return;
|
|
108
|
+
this.scrolls.set(targetId, { scrollX: point.scrollX, scrollY: point.scrollY });
|
|
105
109
|
const at = this.now();
|
|
106
110
|
const previous = this.lastScrollAt.get(targetId) ?? 0;
|
|
107
111
|
if (!point.force && at - previous < 1000 / this.maxScrollHz)
|
|
@@ -131,7 +135,7 @@ export class ReplayRecorder {
|
|
|
131
135
|
if (this.sensitive)
|
|
132
136
|
return;
|
|
133
137
|
this.forceSnapshot = true;
|
|
134
|
-
this.
|
|
138
|
+
this.pushSnapshot();
|
|
135
139
|
}
|
|
136
140
|
accountChanged(segmentId) {
|
|
137
141
|
if (!this.sampled || this.stopped)
|
|
@@ -140,6 +144,7 @@ export class ReplayRecorder {
|
|
|
140
144
|
void this.rotate(true);
|
|
141
145
|
this.segmentId = segmentId ?? `${this.segmentId}-next`;
|
|
142
146
|
this.nodes.clear();
|
|
147
|
+
this.scrolls.clear();
|
|
143
148
|
this.dirty.clear();
|
|
144
149
|
this.removed = [];
|
|
145
150
|
this.records = [];
|
|
@@ -171,6 +176,21 @@ export class ReplayRecorder {
|
|
|
171
176
|
snapshotRecord() {
|
|
172
177
|
return { type: "snapshot", seq: this.seq++, offsetMs: this.offset(), nodes: this.emittedNodes() };
|
|
173
178
|
}
|
|
179
|
+
/** Snapshot không mang vị trí cuộn: ghi lại vị trí hiện tại của các khung cuộn có trong snapshot ngay sau nó. */
|
|
180
|
+
scrollRecords(snapshot, seq) {
|
|
181
|
+
if (!this.scrolls.size)
|
|
182
|
+
return [];
|
|
183
|
+
const present = new Set(snapshot.nodes.map((node) => node.id));
|
|
184
|
+
return [...this.scrolls].flatMap(([targetId, point]) => present.has(targetId)
|
|
185
|
+
? [{ type: "interaction", seq: seq(), offsetMs: snapshot.offsetMs, kind: "scroll", targetId, scrollX: point.scrollX, scrollY: point.scrollY }]
|
|
186
|
+
: []);
|
|
187
|
+
}
|
|
188
|
+
pushSnapshot() {
|
|
189
|
+
const snapshot = this.snapshotRecord();
|
|
190
|
+
this.push(snapshot);
|
|
191
|
+
for (const record of this.scrollRecords(snapshot, () => this.seq++))
|
|
192
|
+
this.push(record);
|
|
193
|
+
}
|
|
174
194
|
emittedNodes() {
|
|
175
195
|
return [...this.nodes.values()].filter((node) => this.include(node)).slice(0, this.nodeBudget);
|
|
176
196
|
}
|
|
@@ -242,7 +262,7 @@ export class ReplayRecorder {
|
|
|
242
262
|
return;
|
|
243
263
|
const needsSnapshot = this.forceSnapshot || this.gapPending || !this.records.some((record) => record.type === "snapshot");
|
|
244
264
|
if (needsSnapshot) {
|
|
245
|
-
this.
|
|
265
|
+
this.pushSnapshot();
|
|
246
266
|
}
|
|
247
267
|
else {
|
|
248
268
|
const upserts = [...this.dirty].flatMap((id) => {
|
|
@@ -287,7 +307,8 @@ export class ReplayRecorder {
|
|
|
287
307
|
records = [{ type: "lifecycle", seq: this.seq++, offsetMs: records[0]?.offsetMs ?? this.offset(), kind: "gap" }, ...records];
|
|
288
308
|
}
|
|
289
309
|
if (!records.some((record) => record.type === "snapshot")) {
|
|
290
|
-
|
|
310
|
+
const snapshot = { type: "snapshot", seq: 0, offsetMs: records[0]?.offsetMs ?? 0, nodes: this.emittedNodes() };
|
|
311
|
+
records = [snapshot, ...this.scrollRecords(snapshot, () => 0), ...records];
|
|
291
312
|
}
|
|
292
313
|
const segmentId = this.segmentId;
|
|
293
314
|
this.records = [];
|
|
@@ -308,6 +329,7 @@ export class ReplayRecorder {
|
|
|
308
329
|
chunkSequence: sequence,
|
|
309
330
|
sessionId: this.sessionId,
|
|
310
331
|
...(this.screenInstanceId ? { screenInstanceId: this.screenInstanceId } : {}),
|
|
332
|
+
startedAtMs: this.origin,
|
|
311
333
|
startOffsetMs: start,
|
|
312
334
|
endOffsetMs: Math.max(start, end),
|
|
313
335
|
viewport: this.viewport,
|
|
@@ -332,6 +354,10 @@ export class ReplayRecorder {
|
|
|
332
354
|
this.nodeBudget = this.maxNodes;
|
|
333
355
|
return encoded;
|
|
334
356
|
}
|
|
357
|
+
/** Chờ các lần đóng chunk đang chạy ngầm (`background`, `accountChanged`, `prepareScreen`) xong và vào `queue`. */
|
|
358
|
+
settled() {
|
|
359
|
+
return this.rotating;
|
|
360
|
+
}
|
|
335
361
|
stats() {
|
|
336
362
|
return { dropped: this.dropped, queued: this.queue.length, segmentId: this.segmentId, chunkSequence: this.chunkSequence };
|
|
337
363
|
}
|
package/dist/recorder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { ReplayChunk } from "@mikeci/pos-replay-protocol";
|
|
2
|
+
import type { ReplayRecorder } from "./recorder.js";
|
|
3
|
+
/** Cùng hình dạng với `@react-native-async-storage/async-storage` và `KeyValueStorage` của SDK analytics. */
|
|
4
|
+
export interface ReplayStorage {
|
|
5
|
+
getItem(key: string): Promise<string | null>;
|
|
6
|
+
setItem(key: string, value: string): Promise<void>;
|
|
7
|
+
removeItem(key: string): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export interface ReplayConfig {
|
|
10
|
+
replayEnabled: boolean;
|
|
11
|
+
replaySampleRate: number;
|
|
12
|
+
killSwitch: boolean;
|
|
13
|
+
limits?: {
|
|
14
|
+
maxChunkBytes?: number;
|
|
15
|
+
maxNodes?: number;
|
|
16
|
+
patchWindowMs?: number;
|
|
17
|
+
chunkWindowMs?: number;
|
|
18
|
+
maxScrollHz?: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface ReplayUploaderOptions {
|
|
22
|
+
endpoint: string;
|
|
23
|
+
appId: string;
|
|
24
|
+
writeKey: string;
|
|
25
|
+
environment?: string;
|
|
26
|
+
/** Thường là AsyncStorage. Mỗi chunk lưu ở một khóa riêng để không vượt giới hạn 2 MB mỗi dòng của AsyncStorage trên Android. */
|
|
27
|
+
storage: ReplayStorage;
|
|
28
|
+
storagePrefix?: string;
|
|
29
|
+
fetch?: typeof fetch;
|
|
30
|
+
now?: () => number;
|
|
31
|
+
random?: () => number;
|
|
32
|
+
/** Nén gzip nếu app có thư viện nén; có hàm này thì body gửi đi kèm `Content-Encoding: gzip`. */
|
|
33
|
+
compress?: (json: string) => Promise<Uint8Array>;
|
|
34
|
+
timeoutMs?: number;
|
|
35
|
+
/** Số chunk tối đa giữ trên máy. Vượt thì bỏ chunk cũ nhất. */
|
|
36
|
+
maxChunks?: number;
|
|
37
|
+
/** Tổng byte tối đa của các chunk đang chờ (mặc định 2 MB, chừa chỗ cho hàng đợi event dùng chung AsyncStorage). */
|
|
38
|
+
maxBytes?: number;
|
|
39
|
+
maxAttempts?: number;
|
|
40
|
+
configTtlMs?: number;
|
|
41
|
+
}
|
|
42
|
+
interface FlushResult {
|
|
43
|
+
sent: number;
|
|
44
|
+
dropped: number;
|
|
45
|
+
pending: number;
|
|
46
|
+
}
|
|
47
|
+
export declare function uploadBackoffMs(attempt: number, random?: () => number): number;
|
|
48
|
+
/** Tham số cho `new ReplayRecorder(...)` lấy từ `GET /v1/sdk/config`. */
|
|
49
|
+
export declare function recorderOptionsFromConfig(config: ReplayConfig | null): {
|
|
50
|
+
enabled: boolean;
|
|
51
|
+
sampleRate: number;
|
|
52
|
+
maxNodes?: number;
|
|
53
|
+
maxChunkBytes?: number;
|
|
54
|
+
patchWindowMs?: number;
|
|
55
|
+
chunkWindowMs?: number;
|
|
56
|
+
maxScrollHz?: number;
|
|
57
|
+
};
|
|
58
|
+
export interface AttachedReplay {
|
|
59
|
+
/** Gọi khi app vào background: đóng chunk hiện tại, lưu xuống máy và thử gửi. */
|
|
60
|
+
background(): Promise<void>;
|
|
61
|
+
foreground(): void;
|
|
62
|
+
/** Đóng chunk, lưu và gửi ngay những gì đang chờ. */
|
|
63
|
+
flushNow(): Promise<FlushResult>;
|
|
64
|
+
/** Kết thúc phiên ghi: rotate lần cuối, gửi nốt hàng đợi, báo `POST /v1/replay/end`, dừng timer. */
|
|
65
|
+
stop(): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
export declare class ReplayUploader {
|
|
68
|
+
private readonly options;
|
|
69
|
+
private readonly fetchImpl;
|
|
70
|
+
private readonly now;
|
|
71
|
+
private readonly random;
|
|
72
|
+
private readonly prefix;
|
|
73
|
+
private items;
|
|
74
|
+
private loaded;
|
|
75
|
+
private chain;
|
|
76
|
+
private flushing;
|
|
77
|
+
private disabled;
|
|
78
|
+
constructor(options: ReplayUploaderOptions);
|
|
79
|
+
/** `true` sau khi server báo tắt replay (403 replay_disabled): ngừng nhận và gửi chunk. */
|
|
80
|
+
get isDisabled(): boolean;
|
|
81
|
+
private exclusive;
|
|
82
|
+
private get indexKey();
|
|
83
|
+
private load;
|
|
84
|
+
private persistIndex;
|
|
85
|
+
/** Lưu một chunk xuống máy. Không ném lỗi: replay không được làm hỏng luồng của app. */
|
|
86
|
+
enqueue(chunk: ReplayChunk): Promise<void>;
|
|
87
|
+
/** Chuyển các chunk recorder đã đóng sang hàng đợi bền vững. */
|
|
88
|
+
drain(recorder: ReplayRecorder): Promise<number>;
|
|
89
|
+
private evict;
|
|
90
|
+
pending(): Promise<{
|
|
91
|
+
chunks: number;
|
|
92
|
+
bytes: number;
|
|
93
|
+
}>;
|
|
94
|
+
/** Gửi các chunk đến hạn theo thứ tự. Dừng ở lỗi tạm thời đầu tiên để giữ thứ tự. Các lần gọi đồng thời dùng chung một lượt gửi. */
|
|
95
|
+
flush(): Promise<FlushResult>;
|
|
96
|
+
private post;
|
|
97
|
+
private flushOnce;
|
|
98
|
+
private removeFirst;
|
|
99
|
+
private retryLater;
|
|
100
|
+
private purge;
|
|
101
|
+
/** Báo kết thúc một segment. Best effort: lỗi mạng chỉ bị bỏ qua. */
|
|
102
|
+
end(info: {
|
|
103
|
+
sessionId: string;
|
|
104
|
+
replayId: string;
|
|
105
|
+
segmentId: string;
|
|
106
|
+
}): Promise<boolean>;
|
|
107
|
+
/**
|
|
108
|
+
* Lấy cấu hình replay (bật/tắt, tỉ lệ mẫu, kill switch, giới hạn). Lưu bản gần nhất trong storage để
|
|
109
|
+
* lần mở app khi offline vẫn dùng được; hết hạn hoặc không có bản lưu thì trả `null` (không ghi replay).
|
|
110
|
+
*/
|
|
111
|
+
loadConfig(): Promise<ReplayConfig | null>;
|
|
112
|
+
/**
|
|
113
|
+
* Nối recorder với uploader: định kỳ `tick()`, chuyển chunk đã đóng xuống storage và gửi.
|
|
114
|
+
* Mặc định tick 150 ms (theo `patchWindowMs`), gửi mỗi 5 giây.
|
|
115
|
+
*/
|
|
116
|
+
attach(recorder: ReplayRecorder, options?: {
|
|
117
|
+
tickMs?: number;
|
|
118
|
+
flushMs?: number;
|
|
119
|
+
segmentId?: () => string;
|
|
120
|
+
}): AttachedReplay;
|
|
121
|
+
}
|
|
122
|
+
export {};
|
|
123
|
+
//# sourceMappingURL=uploader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"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"}
|
package/dist/uploader.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
const BACKOFF_STEPS_MS = [5_000, 15_000, 30_000, 60_000, 300_000];
|
|
2
|
+
export function uploadBackoffMs(attempt, random = Math.random) {
|
|
3
|
+
const base = BACKOFF_STEPS_MS[Math.min(Math.max(attempt, 0), BACKOFF_STEPS_MS.length - 1)] ?? 300_000;
|
|
4
|
+
return Math.max(0, Math.round(base + base * 0.2 * (random() * 2 - 1)));
|
|
5
|
+
}
|
|
6
|
+
/** Tham số cho `new ReplayRecorder(...)` lấy từ `GET /v1/sdk/config`. */
|
|
7
|
+
export function recorderOptionsFromConfig(config) {
|
|
8
|
+
if (!config || !config.replayEnabled || config.killSwitch)
|
|
9
|
+
return { enabled: false, sampleRate: 0 };
|
|
10
|
+
const limits = config.limits ?? {};
|
|
11
|
+
return {
|
|
12
|
+
enabled: true,
|
|
13
|
+
sampleRate: config.replaySampleRate,
|
|
14
|
+
...(limits.maxNodes ? { maxNodes: limits.maxNodes } : {}),
|
|
15
|
+
...(limits.maxChunkBytes ? { maxChunkBytes: limits.maxChunkBytes } : {}),
|
|
16
|
+
...(limits.patchWindowMs ? { patchWindowMs: limits.patchWindowMs } : {}),
|
|
17
|
+
...(limits.chunkWindowMs ? { chunkWindowMs: limits.chunkWindowMs } : {}),
|
|
18
|
+
...(limits.maxScrollHz ? { maxScrollHz: limits.maxScrollHz } : {}),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export class ReplayUploader {
|
|
22
|
+
options;
|
|
23
|
+
fetchImpl;
|
|
24
|
+
now;
|
|
25
|
+
random;
|
|
26
|
+
prefix;
|
|
27
|
+
items = [];
|
|
28
|
+
loaded = false;
|
|
29
|
+
chain = Promise.resolve();
|
|
30
|
+
flushing = null;
|
|
31
|
+
disabled = false;
|
|
32
|
+
constructor(options) {
|
|
33
|
+
this.options = options;
|
|
34
|
+
this.fetchImpl = options.fetch ?? fetch;
|
|
35
|
+
this.now = options.now ?? (() => Date.now());
|
|
36
|
+
this.random = options.random ?? Math.random;
|
|
37
|
+
this.prefix = options.storagePrefix ?? "lottery_replay";
|
|
38
|
+
}
|
|
39
|
+
/** `true` sau khi server báo tắt replay (403 replay_disabled): ngừng nhận và gửi chunk. */
|
|
40
|
+
get isDisabled() {
|
|
41
|
+
return this.disabled;
|
|
42
|
+
}
|
|
43
|
+
exclusive(work) {
|
|
44
|
+
const run = this.chain.then(work, work);
|
|
45
|
+
this.chain = run.then(() => undefined, () => undefined);
|
|
46
|
+
return run;
|
|
47
|
+
}
|
|
48
|
+
get indexKey() {
|
|
49
|
+
return `${this.prefix}:index`;
|
|
50
|
+
}
|
|
51
|
+
async load() {
|
|
52
|
+
if (this.loaded)
|
|
53
|
+
return;
|
|
54
|
+
try {
|
|
55
|
+
const raw = await this.options.storage.getItem(this.indexKey);
|
|
56
|
+
const parsed = raw ? JSON.parse(raw) : [];
|
|
57
|
+
this.items = Array.isArray(parsed) ? parsed : [];
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
this.items = [];
|
|
61
|
+
}
|
|
62
|
+
this.loaded = true;
|
|
63
|
+
}
|
|
64
|
+
async persistIndex() {
|
|
65
|
+
await this.options.storage.setItem(this.indexKey, JSON.stringify(this.items));
|
|
66
|
+
}
|
|
67
|
+
/** Lưu một chunk xuống máy. Không ném lỗi: replay không được làm hỏng luồng của app. */
|
|
68
|
+
enqueue(chunk) {
|
|
69
|
+
if (this.disabled)
|
|
70
|
+
return Promise.resolve();
|
|
71
|
+
return this.exclusive(async () => {
|
|
72
|
+
try {
|
|
73
|
+
await this.load();
|
|
74
|
+
const body = JSON.stringify(chunk);
|
|
75
|
+
const key = `${this.prefix}:chunk:${chunk.chunkId}`;
|
|
76
|
+
if (this.items.some((item) => item.chunkId === chunk.chunkId))
|
|
77
|
+
return;
|
|
78
|
+
await this.options.storage.setItem(key, body);
|
|
79
|
+
this.items.push({ chunkId: chunk.chunkId, key, bytes: body.length, attempts: 0, nextAttemptAt: 0 });
|
|
80
|
+
await this.evict();
|
|
81
|
+
await this.persistIndex();
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Hết bộ nhớ hoặc storage lỗi: bỏ chunk này.
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/** Chuyển các chunk recorder đã đóng sang hàng đợi bền vững. */
|
|
89
|
+
async drain(recorder) {
|
|
90
|
+
const chunks = recorder.queue.splice(0, recorder.queue.length);
|
|
91
|
+
for (const chunk of chunks)
|
|
92
|
+
await this.enqueue(chunk);
|
|
93
|
+
return chunks.length;
|
|
94
|
+
}
|
|
95
|
+
async evict() {
|
|
96
|
+
const maxChunks = this.options.maxChunks ?? 30;
|
|
97
|
+
const maxBytes = this.options.maxBytes ?? 2 * 1024 * 1024;
|
|
98
|
+
const total = () => this.items.reduce((sum, item) => sum + item.bytes, 0);
|
|
99
|
+
while (this.items.length > 1 && (this.items.length > maxChunks || total() > maxBytes)) {
|
|
100
|
+
const oldest = this.items.shift();
|
|
101
|
+
if (oldest)
|
|
102
|
+
await this.options.storage.removeItem(oldest.key).catch(() => undefined);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async pending() {
|
|
106
|
+
return this.exclusive(async () => {
|
|
107
|
+
await this.load();
|
|
108
|
+
return { chunks: this.items.length, bytes: this.items.reduce((sum, item) => sum + item.bytes, 0) };
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/** Gửi các chunk đến hạn theo thứ tự. Dừng ở lỗi tạm thời đầu tiên để giữ thứ tự. Các lần gọi đồng thời dùng chung một lượt gửi. */
|
|
112
|
+
flush() {
|
|
113
|
+
if (!this.flushing) {
|
|
114
|
+
this.flushing = this.exclusive(() => this.flushOnce()).finally(() => {
|
|
115
|
+
this.flushing = null;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return this.flushing;
|
|
119
|
+
}
|
|
120
|
+
async post(path, body) {
|
|
121
|
+
const json = JSON.stringify(body);
|
|
122
|
+
const headers = { "content-type": "application/json", "x-write-key": this.options.writeKey };
|
|
123
|
+
let payload = json;
|
|
124
|
+
if (this.options.compress) {
|
|
125
|
+
try {
|
|
126
|
+
payload = await this.options.compress(json);
|
|
127
|
+
headers["content-encoding"] = "gzip";
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
payload = json;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const controller = new AbortController();
|
|
134
|
+
const timer = setTimeout(() => controller.abort(), this.options.timeoutMs ?? 10_000);
|
|
135
|
+
try {
|
|
136
|
+
return await this.fetchImpl(`${this.options.endpoint.replace(/\/$/, "")}${path}`, {
|
|
137
|
+
method: "POST",
|
|
138
|
+
headers,
|
|
139
|
+
body: payload,
|
|
140
|
+
signal: controller.signal,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
clearTimeout(timer);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async flushOnce() {
|
|
148
|
+
await this.load();
|
|
149
|
+
let sent = 0;
|
|
150
|
+
let dropped = 0;
|
|
151
|
+
const maxAttempts = this.options.maxAttempts ?? 8;
|
|
152
|
+
while (!this.disabled) {
|
|
153
|
+
const item = this.items[0];
|
|
154
|
+
if (!item || item.nextAttemptAt > this.now())
|
|
155
|
+
break;
|
|
156
|
+
const raw = await this.options.storage.getItem(item.key).catch(() => null);
|
|
157
|
+
if (!raw) {
|
|
158
|
+
await this.removeFirst();
|
|
159
|
+
dropped += 1;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const chunk = JSON.parse(raw);
|
|
163
|
+
let response;
|
|
164
|
+
try {
|
|
165
|
+
response = await this.post("/v1/replay/chunks", {
|
|
166
|
+
app_id: this.options.appId,
|
|
167
|
+
environment: this.options.environment ?? "production",
|
|
168
|
+
checksum: chunk.checksum,
|
|
169
|
+
chunk,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
await this.retryLater(item, undefined, maxAttempts);
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
if (response.ok) {
|
|
177
|
+
await this.removeFirst();
|
|
178
|
+
sent += 1;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (response.status === 429 || response.status >= 500) {
|
|
182
|
+
const retryAfter = Number(response.headers.get("retry-after"));
|
|
183
|
+
await this.retryLater(item, Number.isFinite(retryAfter) && retryAfter >= 0 ? retryAfter * 1000 : undefined, maxAttempts);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
// 4xx còn lại: gửi lại cũng không thành công (chunk sai, key sai, trùng khác nội dung...).
|
|
187
|
+
let code = "";
|
|
188
|
+
try {
|
|
189
|
+
code = String((await response.json()).error ?? "");
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
code = "";
|
|
193
|
+
}
|
|
194
|
+
if (response.status === 403 && code === "replay_disabled") {
|
|
195
|
+
await this.purge();
|
|
196
|
+
this.disabled = true;
|
|
197
|
+
dropped += 1;
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
await this.removeFirst();
|
|
201
|
+
dropped += 1;
|
|
202
|
+
}
|
|
203
|
+
return { sent, dropped, pending: this.items.length };
|
|
204
|
+
}
|
|
205
|
+
async removeFirst() {
|
|
206
|
+
const item = this.items.shift();
|
|
207
|
+
if (item)
|
|
208
|
+
await this.options.storage.removeItem(item.key).catch(() => undefined);
|
|
209
|
+
await this.persistIndex().catch(() => undefined);
|
|
210
|
+
}
|
|
211
|
+
async retryLater(item, delayMs, maxAttempts) {
|
|
212
|
+
item.attempts += 1;
|
|
213
|
+
if (item.attempts >= maxAttempts) {
|
|
214
|
+
await this.removeFirst();
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
item.nextAttemptAt = this.now() + (delayMs ?? uploadBackoffMs(item.attempts - 1, this.random));
|
|
218
|
+
await this.persistIndex().catch(() => undefined);
|
|
219
|
+
}
|
|
220
|
+
async purge() {
|
|
221
|
+
const keys = this.items.map((item) => item.key);
|
|
222
|
+
this.items = [];
|
|
223
|
+
for (const key of keys)
|
|
224
|
+
await this.options.storage.removeItem(key).catch(() => undefined);
|
|
225
|
+
await this.options.storage.removeItem(this.indexKey).catch(() => undefined);
|
|
226
|
+
}
|
|
227
|
+
/** Báo kết thúc một segment. Best effort: lỗi mạng chỉ bị bỏ qua. */
|
|
228
|
+
async end(info) {
|
|
229
|
+
if (this.disabled)
|
|
230
|
+
return false;
|
|
231
|
+
try {
|
|
232
|
+
const response = await this.post("/v1/replay/end", {
|
|
233
|
+
app_id: this.options.appId,
|
|
234
|
+
environment: this.options.environment ?? "production",
|
|
235
|
+
session_id: info.sessionId,
|
|
236
|
+
replay_id: info.replayId,
|
|
237
|
+
segment_id: info.segmentId,
|
|
238
|
+
});
|
|
239
|
+
return response.ok;
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Lấy cấu hình replay (bật/tắt, tỉ lệ mẫu, kill switch, giới hạn). Lưu bản gần nhất trong storage để
|
|
247
|
+
* lần mở app khi offline vẫn dùng được; hết hạn hoặc không có bản lưu thì trả `null` (không ghi replay).
|
|
248
|
+
*/
|
|
249
|
+
async loadConfig() {
|
|
250
|
+
const key = `${this.prefix}:config`;
|
|
251
|
+
const ttl = this.options.configTtlMs ?? 60 * 60_000;
|
|
252
|
+
try {
|
|
253
|
+
const response = await this.fetchImpl(`${this.options.endpoint.replace(/\/$/, "")}/v1/sdk/config?app_id=${encodeURIComponent(this.options.appId)}`, { headers: { "x-write-key": this.options.writeKey } });
|
|
254
|
+
if (response.ok) {
|
|
255
|
+
const config = (await response.json());
|
|
256
|
+
await this.options.storage.setItem(key, JSON.stringify({ at: this.now(), config })).catch(() => undefined);
|
|
257
|
+
if (config.killSwitch || !config.replayEnabled) {
|
|
258
|
+
await this.exclusive(async () => {
|
|
259
|
+
await this.load();
|
|
260
|
+
await this.purge();
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
return config;
|
|
264
|
+
}
|
|
265
|
+
if (response.status === 401 || response.status === 403)
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// Offline: dùng bản đã lưu.
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
const raw = await this.options.storage.getItem(key);
|
|
273
|
+
const saved = raw ? JSON.parse(raw) : null;
|
|
274
|
+
return saved && this.now() - saved.at <= ttl ? saved.config : null;
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Nối recorder với uploader: định kỳ `tick()`, chuyển chunk đã đóng xuống storage và gửi.
|
|
282
|
+
* Mặc định tick 150 ms (theo `patchWindowMs`), gửi mỗi 5 giây.
|
|
283
|
+
*/
|
|
284
|
+
attach(recorder, options = {}) {
|
|
285
|
+
const tickMs = options.tickMs ?? 150;
|
|
286
|
+
const flushMs = options.flushMs ?? 5_000;
|
|
287
|
+
let stopped = false;
|
|
288
|
+
let lastFlush = this.now();
|
|
289
|
+
const tickTimer = setInterval(() => {
|
|
290
|
+
if (stopped)
|
|
291
|
+
return;
|
|
292
|
+
void recorder
|
|
293
|
+
.tick()
|
|
294
|
+
.then(() => this.drain(recorder))
|
|
295
|
+
.then(() => {
|
|
296
|
+
if (this.now() - lastFlush < flushMs)
|
|
297
|
+
return undefined;
|
|
298
|
+
lastFlush = this.now();
|
|
299
|
+
return this.flush();
|
|
300
|
+
})
|
|
301
|
+
.catch(() => undefined);
|
|
302
|
+
}, tickMs);
|
|
303
|
+
const settle = async () => {
|
|
304
|
+
await recorder.rotate(true).catch(() => null);
|
|
305
|
+
await recorder.settled();
|
|
306
|
+
await this.drain(recorder);
|
|
307
|
+
return this.flush();
|
|
308
|
+
};
|
|
309
|
+
return {
|
|
310
|
+
background: async () => {
|
|
311
|
+
recorder.background();
|
|
312
|
+
await settle();
|
|
313
|
+
},
|
|
314
|
+
foreground: () => recorder.foreground(),
|
|
315
|
+
flushNow: settle,
|
|
316
|
+
stop: async () => {
|
|
317
|
+
if (stopped)
|
|
318
|
+
return;
|
|
319
|
+
stopped = true;
|
|
320
|
+
clearInterval(tickTimer);
|
|
321
|
+
await settle();
|
|
322
|
+
const stats = recorder.stats();
|
|
323
|
+
await this.end({ sessionId: recorder.sessionId, replayId: recorder.replayId, segmentId: options.segmentId?.() ?? stats.segmentId });
|
|
324
|
+
recorder.stopped = true;
|
|
325
|
+
},
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=uploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader.js","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikeci/pos-analytics-replay",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Session replay wireframe helpers for the Pos Analytics React Native SDK.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"access": "public"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@mikeci/pos-replay-protocol": "0.2.
|
|
24
|
+
"@mikeci/pos-replay-protocol": "0.2.2"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
27
|
"react": ">=19.0.0"
|
package/dist/protocol.d.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
export interface WireNode {
|
|
2
|
-
id: string;
|
|
3
|
-
type: string;
|
|
4
|
-
x: number;
|
|
5
|
-
y: number;
|
|
6
|
-
w: number;
|
|
7
|
-
h: number;
|
|
8
|
-
text?: string;
|
|
9
|
-
masked?: boolean;
|
|
10
|
-
background?: string;
|
|
11
|
-
border?: string;
|
|
12
|
-
children?: WireNode[];
|
|
13
|
-
}
|
|
14
|
-
export interface WireframeFrame {
|
|
15
|
-
seq: number;
|
|
16
|
-
ts: string;
|
|
17
|
-
full: boolean;
|
|
18
|
-
nodes: WireNode[];
|
|
19
|
-
removed?: string[];
|
|
20
|
-
}
|
|
21
|
-
export declare function shouldMask(type: string, hints?: {
|
|
22
|
-
secure?: boolean;
|
|
23
|
-
analyticsMask?: boolean;
|
|
24
|
-
}): boolean;
|
|
25
|
-
export declare function maskText(text: string | undefined, masked: boolean): string | undefined;
|
|
26
|
-
export declare function maskTree(nodes: WireNode[]): WireNode[];
|
|
27
|
-
export declare function applyFrames(frames: WireframeFrame[]): WireNode[];
|
|
28
|
-
export declare function buildChunk(input: {
|
|
29
|
-
appId: string;
|
|
30
|
-
environment: string;
|
|
31
|
-
sessionId: string;
|
|
32
|
-
seq: number;
|
|
33
|
-
ts: string;
|
|
34
|
-
frame: WireframeFrame;
|
|
35
|
-
}): string;
|
|
36
|
-
//# sourceMappingURL=protocol.d.ts.map
|
package/dist/protocol.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAG3G;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGtF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAUtD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE,CAsBhE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,GAAG,MAAM,CASnJ"}
|
package/dist/protocol.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
const MASKED = "••••";
|
|
2
|
-
export function shouldMask(type, hints = {}) {
|
|
3
|
-
if (hints.analyticsMask || hints.secure)
|
|
4
|
-
return true;
|
|
5
|
-
return type === "TextInput" || type === "UITextField" || type === "EditText";
|
|
6
|
-
}
|
|
7
|
-
export function maskText(text, masked) {
|
|
8
|
-
if (!text)
|
|
9
|
-
return text;
|
|
10
|
-
return masked ? MASKED : text;
|
|
11
|
-
}
|
|
12
|
-
export function maskTree(nodes) {
|
|
13
|
-
return nodes.map((node) => {
|
|
14
|
-
const masked = node.masked || shouldMask(node.type);
|
|
15
|
-
return {
|
|
16
|
-
...node,
|
|
17
|
-
masked,
|
|
18
|
-
text: maskText(node.text, masked),
|
|
19
|
-
children: node.children ? maskTree(node.children) : undefined,
|
|
20
|
-
};
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
export function applyFrames(frames) {
|
|
24
|
-
const byId = new Map();
|
|
25
|
-
const order = [];
|
|
26
|
-
for (const frame of frames) {
|
|
27
|
-
if (frame.full) {
|
|
28
|
-
byId.clear();
|
|
29
|
-
order.length = 0;
|
|
30
|
-
}
|
|
31
|
-
for (const id of frame.removed ?? []) {
|
|
32
|
-
byId.delete(id);
|
|
33
|
-
const index = order.indexOf(id);
|
|
34
|
-
if (index >= 0)
|
|
35
|
-
order.splice(index, 1);
|
|
36
|
-
}
|
|
37
|
-
for (const node of maskTree(frame.nodes)) {
|
|
38
|
-
if (!byId.has(node.id))
|
|
39
|
-
order.push(node.id);
|
|
40
|
-
byId.set(node.id, node);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return order.flatMap((id) => {
|
|
44
|
-
const node = byId.get(id);
|
|
45
|
-
return node ? [node] : [];
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
export function buildChunk(input) {
|
|
49
|
-
return JSON.stringify({
|
|
50
|
-
app_id: input.appId,
|
|
51
|
-
environment: input.environment,
|
|
52
|
-
session_id: input.sessionId,
|
|
53
|
-
seq: input.seq,
|
|
54
|
-
ts: input.ts,
|
|
55
|
-
payload: input.frame,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=protocol.js.map
|
package/dist/protocol.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|