@appsurify-testmap/rrvideo 2.1.1-alpha.2 → 2.1.1-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/package.json +3 -3
- package/build/cli.js +0 -68
- package/build/cli.js.map +0 -1
- package/build/index.d.ts +0 -11
- package/build/index.js +0 -177
- package/build/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@appsurify-testmap/rrvideo",
|
|
3
|
-
"version": "2.1.1-alpha.
|
|
3
|
+
"version": "2.1.1-alpha.6",
|
|
4
4
|
"description": "transform rrweb session into video",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"author": "yanzhen@smartx.com",
|
|
22
22
|
"license": "MIT",
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@appsurify-testmap/rrweb-types": "^2.1.1-alpha.
|
|
24
|
+
"@appsurify-testmap/rrweb-types": "^2.1.1-alpha.6",
|
|
25
25
|
"@types/fs-extra": "11.0.1",
|
|
26
26
|
"@types/jest": "^27.4.1",
|
|
27
27
|
"@types/minimist": "^1.2.1",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"ts-jest": "^27.1.3"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@appsurify-testmap/rrweb-player": "^2.1.1-alpha.
|
|
33
|
+
"@appsurify-testmap/rrweb-player": "^2.1.1-alpha.6",
|
|
34
34
|
"@open-tech-world/cli-progress-bar": "^2.0.2",
|
|
35
35
|
"fs-extra": "^11.1.1",
|
|
36
36
|
"minimist": "^1.2.5",
|
package/build/cli.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
-
if (k2 === undefined) k2 = k;
|
|
5
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
-
}
|
|
9
|
-
Object.defineProperty(o, k2, desc);
|
|
10
|
-
}) : (function(o, m, k, k2) {
|
|
11
|
-
if (k2 === undefined) k2 = k;
|
|
12
|
-
o[k2] = m[k];
|
|
13
|
-
}));
|
|
14
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
-
}) : function(o, v) {
|
|
17
|
-
o["default"] = v;
|
|
18
|
-
});
|
|
19
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
20
|
-
if (mod && mod.__esModule) return mod;
|
|
21
|
-
var result = {};
|
|
22
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
23
|
-
__setModuleDefault(result, mod);
|
|
24
|
-
return result;
|
|
25
|
-
};
|
|
26
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
27
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
28
|
-
};
|
|
29
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
const fs = __importStar(require("fs"));
|
|
31
|
-
const path = __importStar(require("path"));
|
|
32
|
-
const minimist_1 = __importDefault(require("minimist"));
|
|
33
|
-
const cli_progress_bar_1 = require("@open-tech-world/cli-progress-bar");
|
|
34
|
-
const index_1 = require("./index");
|
|
35
|
-
const argv = (0, minimist_1.default)(process.argv.slice(2));
|
|
36
|
-
if (!argv.input) {
|
|
37
|
-
throw new Error('please pass --input to your rrweb events file');
|
|
38
|
-
}
|
|
39
|
-
let config = {};
|
|
40
|
-
if (argv.config) {
|
|
41
|
-
const configPathStr = argv.config;
|
|
42
|
-
const configPath = path.isAbsolute(configPathStr)
|
|
43
|
-
? configPathStr
|
|
44
|
-
: path.resolve(process.cwd(), configPathStr);
|
|
45
|
-
config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
46
|
-
}
|
|
47
|
-
const pBar = new cli_progress_bar_1.ProgressBar({ prefix: 'Transforming' });
|
|
48
|
-
const onProgressUpdate = (percent) => {
|
|
49
|
-
if (percent < 1)
|
|
50
|
-
pBar.run({ value: percent * 100, total: 100 });
|
|
51
|
-
else
|
|
52
|
-
pBar.run({ value: 100, total: 100, prefix: 'Transformation Completed!' });
|
|
53
|
-
};
|
|
54
|
-
(0, index_1.transformToVideo)({
|
|
55
|
-
input: argv.input,
|
|
56
|
-
output: argv.output,
|
|
57
|
-
rrwebPlayer: config,
|
|
58
|
-
onProgressUpdate,
|
|
59
|
-
})
|
|
60
|
-
.then((file) => {
|
|
61
|
-
console.log(`Successfully transformed into "${file}".`);
|
|
62
|
-
})
|
|
63
|
-
.catch((error) => {
|
|
64
|
-
console.log('Failed to transform this session.');
|
|
65
|
-
console.error(error);
|
|
66
|
-
process.exit(1);
|
|
67
|
-
});
|
|
68
|
-
//# sourceMappingURL=cli.js.map
|
package/build/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAyB;AACzB,2CAA6B;AAC7B,wDAAgC;AAChC,wEAAgE;AAEhE,mCAA2C;AAE3C,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAChB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;AACnE,CAAC;AAED,IAAI,MAAM,GAAG,EAAE,CAAC;AAEhB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAgB,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC/C,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;IAC/C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAGvD,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAG,IAAI,8BAAW,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;AACzD,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,EAAE;IAC3C,IAAI,OAAO,GAAG,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;QAE9D,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF,IAAA,wBAAgB,EAAC;IACf,KAAK,EAAE,IAAI,CAAC,KAAe;IAC3B,MAAM,EAAE,IAAI,CAAC,MAAgB;IAC7B,WAAW,EAAE,MAAM;IACnB,gBAAgB;CACjB,CAAC;KACC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;IACb,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,IAAI,CAAC,CAAC;AAC1D,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/build/index.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type Player from '@appsurify-testmap/rrweb-player';
|
|
2
|
-
type RRvideoConfig = {
|
|
3
|
-
input: string;
|
|
4
|
-
output?: string;
|
|
5
|
-
headless?: boolean;
|
|
6
|
-
resolutionRatio?: number;
|
|
7
|
-
onProgressUpdate?: (percent: number) => void;
|
|
8
|
-
rrwebPlayer?: Omit<ConstructorParameters<typeof Player>[0]['props'], 'events'>;
|
|
9
|
-
};
|
|
10
|
-
export declare function transformToVideo(options: RRvideoConfig): Promise<string>;
|
|
11
|
-
export {};
|
package/build/index.js
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
-
exports.transformToVideo = void 0;
|
|
36
|
-
const fs = __importStar(require("fs-extra"));
|
|
37
|
-
const path = __importStar(require("path"));
|
|
38
|
-
const playwright_1 = require("playwright");
|
|
39
|
-
const rrweb_types_1 = require("@appsurify-testmap/rrweb-types");
|
|
40
|
-
const rrwebScriptPath = path.resolve(require.resolve('@appsurify-testmap/rrweb-player'), '../../dist/rrweb-player.umd.cjs');
|
|
41
|
-
const rrwebStylePath = path.resolve(rrwebScriptPath, '../style.css');
|
|
42
|
-
const rrwebRaw = fs.readFileSync(rrwebScriptPath, 'utf-8');
|
|
43
|
-
const rrwebStyle = fs.readFileSync(rrwebStylePath, 'utf-8');
|
|
44
|
-
// The max valid scale value for the scaling method which can improve the video quality.
|
|
45
|
-
const MaxScaleValue = 2.5;
|
|
46
|
-
const defaultConfig = {
|
|
47
|
-
input: '',
|
|
48
|
-
output: 'rrvideo-output.webm',
|
|
49
|
-
headless: true,
|
|
50
|
-
// A good trade-off value between quality and file size.
|
|
51
|
-
resolutionRatio: 0.8,
|
|
52
|
-
onProgressUpdate: () => {
|
|
53
|
-
//
|
|
54
|
-
},
|
|
55
|
-
rrwebPlayer: {},
|
|
56
|
-
};
|
|
57
|
-
function getHtml(events, config) {
|
|
58
|
-
var _a;
|
|
59
|
-
return `
|
|
60
|
-
<html>
|
|
61
|
-
<head>
|
|
62
|
-
<style>${rrwebStyle}</style>
|
|
63
|
-
<style>html, body {padding: 0; border: none; margin: 0;}</style>
|
|
64
|
-
</head>
|
|
65
|
-
<body>
|
|
66
|
-
<script>
|
|
67
|
-
${rrwebRaw};
|
|
68
|
-
/*<!--*/
|
|
69
|
-
const events = ${JSON.stringify(events).replace(/<\/script>/g, '<\\/script>')};
|
|
70
|
-
/*-->*/
|
|
71
|
-
const userConfig = ${JSON.stringify((config === null || config === void 0 ? void 0 : config.rrwebPlayer) || {})};
|
|
72
|
-
window.replayer = new rrwebPlayer.Player({
|
|
73
|
-
target: document.body,
|
|
74
|
-
width: userConfig.width,
|
|
75
|
-
height: userConfig.height,
|
|
76
|
-
props: {
|
|
77
|
-
...userConfig,
|
|
78
|
-
events,
|
|
79
|
-
showController: false,
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
window.replayer.addEventListener('finish', () => window.onReplayFinish());
|
|
83
|
-
window.replayer.addEventListener('ui-update-progress', (payload)=> window.onReplayProgressUpdate
|
|
84
|
-
(payload));
|
|
85
|
-
window.replayer.addEventListener('resize',()=>document.querySelector('.replayer-wrapper').style.transform = 'scale(${((_a = config === null || config === void 0 ? void 0 : config.resolutionRatio) !== null && _a !== void 0 ? _a : 1) * MaxScaleValue}) translate(-50%, -50%)');
|
|
86
|
-
</script>
|
|
87
|
-
</body>
|
|
88
|
-
</html>
|
|
89
|
-
`;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Preprocess all events to get a maximum view port size.
|
|
93
|
-
*/
|
|
94
|
-
function getMaxViewport(events) {
|
|
95
|
-
let maxWidth = 0, maxHeight = 0;
|
|
96
|
-
events.forEach((event) => {
|
|
97
|
-
if (event.type !== rrweb_types_1.EventType.Meta)
|
|
98
|
-
return;
|
|
99
|
-
if (event.data.width > maxWidth)
|
|
100
|
-
maxWidth = event.data.width;
|
|
101
|
-
if (event.data.height > maxHeight)
|
|
102
|
-
maxHeight = event.data.height;
|
|
103
|
-
});
|
|
104
|
-
return {
|
|
105
|
-
width: maxWidth,
|
|
106
|
-
height: maxHeight,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
function transformToVideo(options) {
|
|
110
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
-
var _a, _b, _c;
|
|
112
|
-
const defaultVideoDir = '__rrvideo__temp__';
|
|
113
|
-
const config = Object.assign({}, defaultConfig);
|
|
114
|
-
if (!options.input)
|
|
115
|
-
throw new Error('input is required');
|
|
116
|
-
// If the output is not specified or undefined, use the default value.
|
|
117
|
-
if (!options.output)
|
|
118
|
-
delete options.output;
|
|
119
|
-
Object.assign(config, options);
|
|
120
|
-
if (config.resolutionRatio > 1)
|
|
121
|
-
config.resolutionRatio = 1; // The max value is 1.
|
|
122
|
-
const eventsPath = path.isAbsolute(config.input)
|
|
123
|
-
? config.input
|
|
124
|
-
: path.resolve(process.cwd(), config.input);
|
|
125
|
-
const outputPath = path.isAbsolute(config.output)
|
|
126
|
-
? config.output
|
|
127
|
-
: path.resolve(process.cwd(), config.output);
|
|
128
|
-
const events = JSON.parse(fs.readFileSync(eventsPath, 'utf-8'));
|
|
129
|
-
// Make the browser viewport fit the player size.
|
|
130
|
-
const maxViewport = getMaxViewport(events);
|
|
131
|
-
// Use the scaling method to improve the video quality.
|
|
132
|
-
const scaledViewport = {
|
|
133
|
-
width: Math.round(maxViewport.width * ((_a = config.resolutionRatio) !== null && _a !== void 0 ? _a : 1) * MaxScaleValue),
|
|
134
|
-
height: Math.round(maxViewport.height * ((_b = config.resolutionRatio) !== null && _b !== void 0 ? _b : 1) * MaxScaleValue),
|
|
135
|
-
};
|
|
136
|
-
Object.assign(config.rrwebPlayer, scaledViewport);
|
|
137
|
-
const browser = yield playwright_1.chromium.launch({
|
|
138
|
-
headless: config.headless,
|
|
139
|
-
});
|
|
140
|
-
const context = yield browser.newContext({
|
|
141
|
-
viewport: scaledViewport,
|
|
142
|
-
recordVideo: {
|
|
143
|
-
dir: defaultVideoDir,
|
|
144
|
-
size: scaledViewport,
|
|
145
|
-
},
|
|
146
|
-
});
|
|
147
|
-
const page = yield context.newPage();
|
|
148
|
-
yield page.goto('about:blank');
|
|
149
|
-
yield page.exposeFunction('onReplayProgressUpdate', (data) => {
|
|
150
|
-
config.onProgressUpdate(data.payload);
|
|
151
|
-
});
|
|
152
|
-
// Wait for the replay to finish
|
|
153
|
-
yield new Promise((resolve) => void page
|
|
154
|
-
.exposeFunction('onReplayFinish', () => resolve())
|
|
155
|
-
.then(() => page.setContent(getHtml(events, config))));
|
|
156
|
-
const videoPath = (yield ((_c = page.video()) === null || _c === void 0 ? void 0 : _c.path())) || '';
|
|
157
|
-
const cleanFiles = (videoPath) => __awaiter(this, void 0, void 0, function* () {
|
|
158
|
-
yield fs.remove(videoPath);
|
|
159
|
-
if ((yield fs.readdir(defaultVideoDir)).length === 0) {
|
|
160
|
-
yield fs.remove(defaultVideoDir);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
yield context.close();
|
|
164
|
-
yield Promise.all([
|
|
165
|
-
fs
|
|
166
|
-
.move(videoPath, outputPath, { overwrite: true })
|
|
167
|
-
.catch((e) => {
|
|
168
|
-
console.error("Can't create video file. Please check the output path.", e);
|
|
169
|
-
})
|
|
170
|
-
.finally(() => void cleanFiles(videoPath)),
|
|
171
|
-
browser.close(),
|
|
172
|
-
]);
|
|
173
|
-
return outputPath;
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
exports.transformToVideo = transformToVideo;
|
|
177
|
-
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|