@push.rocks/smartpuppeteer 2.0.7 → 2.1.0

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.
@@ -3,6 +3,7 @@ import * as plugins from './smartpuppeteer.plugins.js';
3
3
  export interface IEnvAwareOptions {
4
4
  forceNoSandbox?: boolean;
5
5
  usePipe?: boolean;
6
+ launchOptions?: plugins.puppeteer.LaunchOptions;
6
7
  }
7
8
 
8
9
  export const resolveBrowserExecutablePath = (
@@ -31,20 +32,29 @@ export const getEnvAwareBrowserInstance = async (
31
32
  ...optionsArg,
32
33
  };
33
34
 
34
- let chromeArgs: string[] = [];
35
+ const launchOptions = options.launchOptions ?? {};
36
+ let chromeArgs: string[] = [...(launchOptions.args ?? [])];
35
37
  if (
36
38
  process.env.CI ||
37
39
  options.forceNoSandbox ||
38
40
  plugins.os.userInfo().username === 'root'
39
41
  ) {
40
- chromeArgs = chromeArgs.concat(['--no-sandbox', '--disable-setuid-sandbox']);
42
+ for (const sandboxArg of ['--no-sandbox', '--disable-setuid-sandbox']) {
43
+ if (!chromeArgs.includes(sandboxArg)) {
44
+ chromeArgs.push(sandboxArg);
45
+ }
46
+ }
41
47
  console.warn('********************************************************');
42
48
  console.warn('WARNING: Launching browser without sandbox. This can be insecure!');
43
49
  console.warn('********************************************************');
44
50
  }
45
51
 
46
- // Automatically choose an executable if available: prefer google-chrome, then chromium, then chromium-browser.
47
- const execPath = resolveBrowserExecutablePath();
52
+ // Automatically choose an executable only when the caller did not select one.
53
+ const callerSelectedBrowser =
54
+ launchOptions.browser !== undefined
55
+ || launchOptions.channel !== undefined
56
+ || launchOptions.executablePath !== undefined;
57
+ const execPath = callerSelectedBrowser ? undefined : resolveBrowserExecutablePath();
48
58
 
49
59
  const executablePathOptions = execPath ? { executablePath: execPath } : {};
50
60
 
@@ -52,14 +62,17 @@ export const getEnvAwareBrowserInstance = async (
52
62
  console.log(chromeArgs);
53
63
  if (execPath) {
54
64
  console.log(`Using executable: ${execPath}`);
65
+ } else if (callerSelectedBrowser) {
66
+ console.log('Using browser selection from caller launch options.');
55
67
  } else {
56
68
  console.log('No specific browser executable found; falling back to Puppeteer default.');
57
69
  }
58
70
 
59
71
  const headlessBrowser = await plugins.puppeteer.launch({
60
- args: chromeArgs,
61
- pipe: options.usePipe ?? true,
62
72
  headless: true,
73
+ ...launchOptions,
74
+ args: chromeArgs,
75
+ pipe: options.usePipe ?? launchOptions.pipe ?? true,
63
76
  ...executablePathOptions,
64
77
  });
65
78
 
@@ -0,0 +1,235 @@
1
+ import type { IEnvAwareOptions } from './smartpuppeteer.classes.smartpuppeteer.js';
2
+
3
+ export type TLiveBrowserStatus = 'stopped' | 'starting' | 'running' | 'stopping';
4
+ export type TLiveBrowserImageFormat = 'jpeg' | 'png';
5
+ export type TLiveBrowserTabStatus = 'open' | 'crashed';
6
+ export type TLiveBrowserWaitUntil =
7
+ | 'load'
8
+ | 'domcontentloaded'
9
+ | 'networkidle0'
10
+ | 'networkidle2';
11
+
12
+ export interface ILiveBrowserViewport {
13
+ width: number;
14
+ height: number;
15
+ deviceScaleFactor: number;
16
+ }
17
+
18
+ export interface ILiveBrowserScreencastOptions {
19
+ format?: TLiveBrowserImageFormat;
20
+ quality?: number;
21
+ maxWidth?: number;
22
+ maxHeight?: number;
23
+ everyNthFrame?: number;
24
+ }
25
+
26
+ export type TLiveBrowserLaunchOptions = Omit<
27
+ NonNullable<IEnvAwareOptions['launchOptions']>,
28
+ 'signal'
29
+ >;
30
+
31
+ export interface ILiveBrowserSessionOptions extends Omit<IEnvAwareOptions, 'launchOptions'> {
32
+ launchOptions?: TLiveBrowserLaunchOptions;
33
+ viewport?: ILiveBrowserViewport;
34
+ screencast?: ILiveBrowserScreencastOptions;
35
+ }
36
+
37
+ export interface ILiveBrowserTabState {
38
+ id: string;
39
+ url: string;
40
+ title: string;
41
+ active: boolean;
42
+ status: TLiveBrowserTabStatus;
43
+ generation: number;
44
+ appliedViewportRevision: number;
45
+ streaming: boolean;
46
+ }
47
+
48
+ export interface ILiveBrowserError {
49
+ code: string;
50
+ message: string;
51
+ fatal: boolean;
52
+ tabId?: string;
53
+ }
54
+
55
+ export interface ILiveBrowserState {
56
+ status: TLiveBrowserStatus;
57
+ activeTabId: string | null;
58
+ viewportRevision: number;
59
+ viewport: ILiveBrowserViewport;
60
+ tabs: ILiveBrowserTabState[];
61
+ lastError?: ILiveBrowserError;
62
+ }
63
+
64
+ export interface ILiveBrowserScreencastMetadata {
65
+ offsetTop: number;
66
+ pageScaleFactor: number;
67
+ deviceWidth: number;
68
+ deviceHeight: number;
69
+ scrollOffsetX: number;
70
+ scrollOffsetY: number;
71
+ timestamp?: number;
72
+ }
73
+
74
+ export interface ILiveBrowserFrame {
75
+ tabId: string;
76
+ sequence: number;
77
+ generation: number;
78
+ viewportRevision: number;
79
+ viewport: ILiveBrowserViewport;
80
+ format: TLiveBrowserImageFormat;
81
+ mimeType: 'image/jpeg' | 'image/png';
82
+ width: number;
83
+ height: number;
84
+ metadata: ILiveBrowserScreencastMetadata;
85
+ data: Uint8Array;
86
+ }
87
+
88
+ export interface ILiveBrowserSnapshot {
89
+ tabId: string;
90
+ viewportRevision: number;
91
+ viewport: ILiveBrowserViewport;
92
+ format: TLiveBrowserImageFormat;
93
+ mimeType: 'image/jpeg' | 'image/png';
94
+ width: number;
95
+ height: number;
96
+ data: Uint8Array;
97
+ }
98
+
99
+ export interface ILiveBrowserStateEvent {
100
+ type: 'state';
101
+ state: ILiveBrowserState;
102
+ }
103
+
104
+ export interface ILiveBrowserFrameEvent {
105
+ type: 'frame';
106
+ frame: ILiveBrowserFrame;
107
+ }
108
+
109
+ export interface ILiveBrowserErrorEvent {
110
+ type: 'error';
111
+ error: ILiveBrowserError;
112
+ }
113
+
114
+ export type TLiveBrowserEvent =
115
+ | ILiveBrowserStateEvent
116
+ | ILiveBrowserFrameEvent
117
+ | ILiveBrowserErrorEvent;
118
+
119
+ export type TLiveBrowserEventListener = (event: TLiveBrowserEvent) => void;
120
+
121
+ export interface ILiveBrowserFrameAcknowledgement {
122
+ accepted: boolean;
123
+ }
124
+
125
+ export interface ILiveBrowserFrameAcknowledgementRequest {
126
+ tabId: string;
127
+ sequence: number;
128
+ generation: number;
129
+ viewportRevision: number;
130
+ }
131
+
132
+ export interface ILiveBrowserCreateTabOptions {
133
+ url?: string;
134
+ activate?: boolean;
135
+ timeoutMs?: number;
136
+ waitUntil?: TLiveBrowserWaitUntil;
137
+ }
138
+
139
+ export interface ILiveBrowserNavigationOptions {
140
+ tabId?: string;
141
+ timeoutMs?: number;
142
+ waitUntil?: TLiveBrowserWaitUntil;
143
+ }
144
+
145
+ export interface ILiveBrowserNavigateOptions extends ILiveBrowserNavigationOptions {
146
+ url: string;
147
+ }
148
+
149
+ export interface ILiveBrowserModifierState {
150
+ alt?: boolean;
151
+ control?: boolean;
152
+ meta?: boolean;
153
+ shift?: boolean;
154
+ }
155
+
156
+ export interface ILiveBrowserInputBase {
157
+ tabId: string;
158
+ generation: number;
159
+ viewportRevision: number;
160
+ }
161
+
162
+ export interface ILiveBrowserMouseInput extends ILiveBrowserInputBase {
163
+ type: 'move' | 'down' | 'up';
164
+ x: number;
165
+ y: number;
166
+ button?: 'none' | 'left' | 'middle' | 'right' | 'back' | 'forward';
167
+ buttons?: number;
168
+ clickCount?: number;
169
+ modifiers?: ILiveBrowserModifierState;
170
+ }
171
+
172
+ export interface ILiveBrowserWheelInput extends ILiveBrowserInputBase {
173
+ x: number;
174
+ y: number;
175
+ deltaX: number;
176
+ deltaY: number;
177
+ modifiers?: ILiveBrowserModifierState;
178
+ }
179
+
180
+ export interface ILiveBrowserKeyInput extends ILiveBrowserInputBase {
181
+ type: 'down' | 'up';
182
+ key: string;
183
+ code?: string;
184
+ text?: string;
185
+ unmodifiedText?: string;
186
+ windowsVirtualKeyCode?: number;
187
+ nativeVirtualKeyCode?: number;
188
+ autoRepeat?: boolean;
189
+ isKeypad?: boolean;
190
+ location?: number;
191
+ modifiers?: ILiveBrowserModifierState;
192
+ }
193
+
194
+ export interface ILiveBrowserInsertTextInput extends ILiveBrowserInputBase {
195
+ text: string;
196
+ }
197
+
198
+ export interface ILiveBrowserSemanticActionBase extends ILiveBrowserInputBase {
199
+ selector: string;
200
+ timeoutMs?: number;
201
+ }
202
+
203
+ export interface ILiveBrowserClickOptions extends ILiveBrowserSemanticActionBase {
204
+ button?: 'left' | 'middle' | 'right';
205
+ clickCount?: number;
206
+ }
207
+
208
+ export interface ILiveBrowserFillOptions extends ILiveBrowserSemanticActionBase {
209
+ text: string;
210
+ }
211
+
212
+ export interface ILiveBrowserPressOptions extends ILiveBrowserSemanticActionBase {
213
+ key: string;
214
+ }
215
+
216
+ export interface ILiveBrowserSnapshotOptions {
217
+ tabId?: string;
218
+ format?: TLiveBrowserImageFormat;
219
+ quality?: number;
220
+ }
221
+
222
+ export interface ILiveBrowserObserveOptions {
223
+ tabId?: string;
224
+ maxCharacters?: number;
225
+ }
226
+
227
+ export interface ILiveBrowserObservation {
228
+ tabId: string;
229
+ url: string;
230
+ title: string;
231
+ tab: ILiveBrowserTabState;
232
+ state: ILiveBrowserState;
233
+ text: string;
234
+ truncated: boolean;
235
+ }
@@ -1,7 +1,8 @@
1
1
  // node native scope
2
+ import { Buffer } from 'node:buffer';
2
3
  import * as os from 'os';
3
4
 
4
- export { os };
5
+ export { Buffer, os };
5
6
 
6
7
  // @pushrocks scope
7
8
  import * as smartdelay from '@push.rocks/smartdelay';
@@ -10,7 +11,7 @@ import * as smartshell from '@push.rocks/smartshell';
10
11
  export { smartdelay, smartshell };
11
12
 
12
13
  // third party scope
13
- import puppeteer from 'puppeteer';
14
+ import * as puppeteer from 'puppeteer';
14
15
  import treeKill from 'tree-kill';
15
16
 
16
17
  export { puppeteer, treeKill };
package/dist/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import puppeteer from 'puppeteer';
2
- export declare const getEnvAwareBrowserInstance: () => Promise<puppeteer.Browser>;
3
- export { puppeteer };
package/dist/index.js DELETED
@@ -1,18 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const puppeteer_1 = __importDefault(require("puppeteer"));
7
- exports.puppeteer = puppeteer_1.default;
8
- exports.getEnvAwareBrowserInstance = async () => {
9
- let chromeArgs = [];
10
- if (process.env.CI) {
11
- chromeArgs = chromeArgs.concat(['--no-sandbox', '--disable-setuid-sandbox']);
12
- }
13
- const headlessBrowser = await puppeteer_1.default.launch({
14
- args: chromeArgs
15
- });
16
- return headlessBrowser;
17
- };
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDBEQUFrQztBQWF6QixvQkFiRixtQkFBUyxDQWFFO0FBWEwsUUFBQSwwQkFBMEIsR0FBRyxLQUFLLElBQWdDLEVBQUU7SUFDL0UsSUFBSSxVQUFVLEdBQWEsRUFBRSxDQUFDO0lBQzlCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7UUFDbEIsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0tBQzlFO0lBQ0QsTUFBTSxlQUFlLEdBQUcsTUFBTSxtQkFBUyxDQUFDLE1BQU0sQ0FBQztRQUM3QyxJQUFJLEVBQUUsVUFBVTtLQUNqQixDQUFDLENBQUM7SUFDSCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDLENBQUMifQ==