@browserless.io/browserless 2.2.0-beta-2 → 2.2.0-beta-3
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/build/browsers/index.js +9 -3
- package/build/router.js +13 -6
- package/build/routes/chromium/http/content-post.body.json +15 -19
- package/build/routes/chromium/http/content-post.d.ts +1 -1
- package/build/routes/chromium/http/content-post.js +2 -4
- package/build/routes/chromium/http/pdf-post.body.json +15 -19
- package/build/routes/chromium/http/pdf-post.d.ts +1 -1
- package/build/routes/chromium/http/pdf-post.js +10 -6
- package/build/routes/chromium/http/scrape-post.body.json +15 -19
- package/build/routes/chromium/http/scrape-post.d.ts +3 -3
- package/build/routes/chromium/http/scrape-post.js +2 -4
- package/build/routes/chromium/http/scrape-post.response.json +22 -38
- package/build/routes/chromium/http/screenshot-post.body.json +15 -19
- package/build/routes/chromium/http/screenshot-post.d.ts +1 -1
- package/build/routes/chromium/http/screenshot-post.js +2 -4
- package/build/routes/chromium/tests/content.spec.js +27 -1
- package/build/routes/chromium/tests/websocket.spec.js +53 -4
- package/build/routes/chromium/ws/browser.js +1 -1
- package/build/routes/management/http/sessions-get.response.json +4 -0
- package/build/types.d.ts +1 -0
- package/package.json +3 -3
- package/src/browsers/index.ts +11 -4
- package/src/router.ts +13 -7
- package/src/routes/chromium/http/content-post.ts +3 -4
- package/src/routes/chromium/http/pdf-post.ts +13 -6
- package/src/routes/chromium/http/scrape-post.ts +5 -6
- package/src/routes/chromium/http/screenshot-post.ts +3 -4
- package/src/routes/chromium/tests/content.spec.ts +28 -1
- package/src/routes/chromium/tests/websocket.spec.ts +70 -4
- package/src/routes/chromium/ws/browser.ts +1 -1
- package/src/types.ts +1 -0
- package/static/docs/swagger.json +70 -98
- package/static/function/client.js +192 -488
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Browserless,
|
|
3
|
+
BrowserlessSessionJSON,
|
|
3
4
|
Config,
|
|
4
5
|
Metrics,
|
|
5
6
|
exists,
|
|
7
|
+
fetchJson,
|
|
6
8
|
sleep,
|
|
7
9
|
} from '@browserless.io/browserless';
|
|
8
10
|
import { chromium } from 'playwright-core';
|
|
@@ -85,6 +87,70 @@ describe('WebSocket API', function () {
|
|
|
85
87
|
await Promise.all([browser.disconnect(), browserTwo.disconnect()]);
|
|
86
88
|
});
|
|
87
89
|
|
|
90
|
+
it('does not close browsers when multiple clients are connected', async () => {
|
|
91
|
+
const config = new Config();
|
|
92
|
+
config.setToken('browserless');
|
|
93
|
+
const metrics = new Metrics();
|
|
94
|
+
await start({ config, metrics });
|
|
95
|
+
|
|
96
|
+
// Single session
|
|
97
|
+
const browser = await puppeteer.connect({
|
|
98
|
+
browserWSEndpoint: `ws://localhost:3000?token=browserless`,
|
|
99
|
+
});
|
|
100
|
+
const [session] = (await fetchJson(
|
|
101
|
+
'http://localhost:3000/sessions?token=browserless',
|
|
102
|
+
)) as BrowserlessSessionJSON[];
|
|
103
|
+
expect(session.numbConnected).to.equal(1);
|
|
104
|
+
|
|
105
|
+
// Two sessions
|
|
106
|
+
const browserTwo = await puppeteer.connect({
|
|
107
|
+
browserWSEndpoint: `ws://localhost:3000/devtools/browser/${session.browserId}?token=browserless`,
|
|
108
|
+
});
|
|
109
|
+
const [twoSessions] = (await fetchJson(
|
|
110
|
+
'http://localhost:3000/sessions?token=browserless',
|
|
111
|
+
)) as BrowserlessSessionJSON[];
|
|
112
|
+
expect(twoSessions.numbConnected).to.equal(2);
|
|
113
|
+
|
|
114
|
+
// Back to a single session
|
|
115
|
+
await browser.disconnect();
|
|
116
|
+
await sleep(50);
|
|
117
|
+
const [oneSession] = (await fetchJson(
|
|
118
|
+
'http://localhost:3000/sessions?token=browserless',
|
|
119
|
+
)) as BrowserlessSessionJSON[];
|
|
120
|
+
expect(oneSession.numbConnected).to.equal(1);
|
|
121
|
+
|
|
122
|
+
// No sessions connected
|
|
123
|
+
await browserTwo.disconnect();
|
|
124
|
+
await sleep(50);
|
|
125
|
+
const sessionsFinal = (await fetchJson(
|
|
126
|
+
'http://localhost:3000/sessions?token=browserless',
|
|
127
|
+
)) as BrowserlessSessionJSON[];
|
|
128
|
+
expect(sessionsFinal).to.have.length(0);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('disconnects all clients when the timeout is reached', async () => {
|
|
132
|
+
const config = new Config();
|
|
133
|
+
config.setToken('browserless');
|
|
134
|
+
config.setTimeout(1000);
|
|
135
|
+
config.setConcurrent(2);
|
|
136
|
+
const metrics = new Metrics();
|
|
137
|
+
await start({ config, metrics });
|
|
138
|
+
const browser = await puppeteer.connect({
|
|
139
|
+
browserWSEndpoint: `ws://localhost:3000?token=browserless`,
|
|
140
|
+
});
|
|
141
|
+
const [session] = (await fetchJson(
|
|
142
|
+
'http://localhost:3000/sessions?token=browserless',
|
|
143
|
+
)) as BrowserlessSessionJSON[];
|
|
144
|
+
const browserTwo = await puppeteer.connect({
|
|
145
|
+
browserWSEndpoint: `ws://localhost:3000/devtools/browser/${session.browserId}?token=browserless`,
|
|
146
|
+
});
|
|
147
|
+
await sleep(3000);
|
|
148
|
+
expect(metrics.get().successful).to.equal(0);
|
|
149
|
+
expect(metrics.get().timedout).to.equal(2);
|
|
150
|
+
expect(browser.connected).to.be.false;
|
|
151
|
+
expect(browserTwo.connected).to.be.false;
|
|
152
|
+
});
|
|
153
|
+
|
|
88
154
|
it('rejects websocket requests', async () => {
|
|
89
155
|
const config = new Config();
|
|
90
156
|
config.setToken('browserless');
|
|
@@ -261,13 +327,13 @@ describe('WebSocket API', function () {
|
|
|
261
327
|
await start({ config, metrics });
|
|
262
328
|
|
|
263
329
|
const browser = await puppeteer.connect({
|
|
264
|
-
browserWSEndpoint: `ws://localhost:3000?timeout=
|
|
330
|
+
browserWSEndpoint: `ws://localhost:3000?timeout=1000&token=browserless`,
|
|
265
331
|
});
|
|
266
|
-
|
|
267
|
-
await sleep(
|
|
268
|
-
browser.disconnect();
|
|
332
|
+
expect(browser.connected).to.be.true;
|
|
333
|
+
await sleep(1200);
|
|
269
334
|
expect(metrics.get().timedout).to.equal(1);
|
|
270
335
|
expect(metrics.get().successful).to.equal(0);
|
|
336
|
+
expect(browser.connected).to.be.false;
|
|
271
337
|
});
|
|
272
338
|
|
|
273
339
|
it('allows the file-chooser', async () =>
|
|
@@ -16,7 +16,7 @@ export interface QuerySchema extends SystemQueryParameters {
|
|
|
16
16
|
export default class CDPExistingBrowser extends BrowserWebsocketRoute {
|
|
17
17
|
auth = true;
|
|
18
18
|
browser = CDPChromium;
|
|
19
|
-
concurrency =
|
|
19
|
+
concurrency = true;
|
|
20
20
|
description = `Connect to an already-running Chromium with a library like puppeteer, or others, that work over chrome-devtools-protocol.`;
|
|
21
21
|
path = WebsocketRoutes.browser;
|
|
22
22
|
tags = [APITags.browserWS];
|