@browserless.io/browserless 2.24.0-beta-5 → 2.24.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 +22 -1
- package/bin/browserless.js +1 -1
- package/build/browsers/browsers.playwright.d.ts +1 -0
- package/build/browsers/browsers.playwright.js +3 -0
- package/build/browsers/index.d.ts +2 -1
- package/build/browsers/index.js +28 -7
- package/build/http.d.ts +5 -0
- package/build/http.js +1 -0
- package/build/routes/chrome/http/content.post.body.json +8 -8
- package/build/routes/chrome/http/content.post.query.json +4 -0
- package/build/routes/chrome/http/download.post.query.json +4 -0
- package/build/routes/chrome/http/function.post.query.json +4 -0
- package/build/routes/chrome/http/pdf.post.body.json +8 -8
- package/build/routes/chrome/http/pdf.post.query.json +4 -0
- package/build/routes/chrome/http/performance.post.query.json +4 -0
- package/build/routes/chrome/http/scrape.post.body.json +8 -8
- package/build/routes/chrome/http/scrape.post.query.json +4 -0
- package/build/routes/chrome/http/screenshot.post.body.json +8 -8
- package/build/routes/chrome/http/screenshot.post.query.json +4 -0
- package/build/routes/chrome/tests/kill-sessions.spec.d.ts +1 -0
- package/build/routes/chrome/tests/kill-sessions.spec.js +80 -0
- package/build/routes/chrome/ws/browser.query.json +4 -0
- package/build/routes/chrome/ws/cdp.query.json +4 -0
- package/build/routes/chrome/ws/page.query.json +4 -0
- package/build/routes/chrome/ws/playwright.query.json +4 -0
- package/build/routes/chromium/http/content.post.body.json +8 -8
- package/build/routes/chromium/http/content.post.query.json +4 -0
- package/build/routes/chromium/http/download.post.query.json +4 -0
- package/build/routes/chromium/http/function.post.query.json +4 -0
- package/build/routes/chromium/http/pdf.post.body.json +8 -8
- package/build/routes/chromium/http/pdf.post.query.json +4 -0
- package/build/routes/chromium/http/performance.post.query.json +4 -0
- package/build/routes/chromium/http/scrape.post.body.json +8 -8
- package/build/routes/chromium/http/scrape.post.query.json +4 -0
- package/build/routes/chromium/http/screenshot.post.body.json +8 -8
- package/build/routes/chromium/http/screenshot.post.query.json +4 -0
- package/build/routes/chromium/tests/kill-sessions.spec.d.ts +1 -0
- package/build/routes/chromium/tests/kill-sessions.spec.js +80 -0
- package/build/routes/chromium/tests/websocket.spec.js +23 -0
- package/build/routes/chromium/ws/browser.query.json +4 -0
- package/build/routes/chromium/ws/cdp.query.json +4 -0
- package/build/routes/chromium/ws/page.query.json +4 -0
- package/build/routes/chromium/ws/playwright.query.json +4 -0
- package/build/routes/firefox/tests/kill-sessions.spec.d.ts +1 -0
- package/build/routes/firefox/tests/kill-sessions.spec.js +72 -0
- package/build/routes/firefox/ws/playwright.query.json +4 -0
- package/build/routes/management/http/kill.get.d.ts +21 -0
- package/build/routes/management/http/kill.get.js +19 -0
- package/build/routes/management/http/kill.get.query.json +193 -0
- package/build/routes/management/http/meta.get.js +3 -2
- package/build/routes/management/http/sessions.get.query.json +1 -0
- package/build/routes/management/tests/management.spec.js +12 -0
- package/build/routes/webkit/tests/kill-sessions.spec.d.ts +1 -0
- package/build/routes/webkit/tests/kill-sessions.spec.js +72 -0
- package/build/routes/webkit/ws/playwright.query.json +4 -0
- package/build/shared/utils/performance/main.js +2 -1
- package/build/types.d.ts +2 -0
- package/build/types.js +1 -0
- package/build/utils.d.ts +1 -1
- package/build/utils.js +1 -10
- package/package.json +13 -13
- package/src/browsers/browsers.playwright.ts +3 -0
- package/src/browsers/index.ts +33 -12
- package/src/http.ts +6 -0
- package/src/routes/chrome/tests/kill-sessions.spec.ts +99 -0
- package/src/routes/chromium/tests/kill-sessions.spec.ts +99 -0
- package/src/routes/chromium/tests/websocket.spec.ts +29 -0
- package/src/routes/firefox/tests/kill-sessions.spec.ts +99 -0
- package/src/routes/management/http/kill.get.ts +40 -0
- package/src/routes/management/http/meta.get.ts +12 -10
- package/src/routes/management/tests/management.spec.ts +19 -0
- package/src/routes/webkit/tests/kill-sessions.spec.ts +99 -0
- package/src/shared/utils/performance/main.ts +2 -8
- package/src/types.ts +1 -0
- package/src/utils.ts +2 -11
- package/static/docs/swagger.json +297 -10
- package/static/docs/swagger.min.json +296 -9
- package/static/function/client.js +157 -42
- package/static/function/index.html +157 -42
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Browserless, Config, Metrics } from '@browserless.io/browserless';
|
|
2
|
+
import { expect } from 'chai';
|
|
3
|
+
import puppeteer from 'puppeteer-core';
|
|
4
|
+
|
|
5
|
+
describe('/kill API', function () {
|
|
6
|
+
let browserless: Browserless;
|
|
7
|
+
|
|
8
|
+
const start = ({
|
|
9
|
+
config = new Config(),
|
|
10
|
+
metrics = new Metrics(),
|
|
11
|
+
}: { config?: Config; metrics?: Metrics } = {}) => {
|
|
12
|
+
config.setToken('6R0W53R135510');
|
|
13
|
+
browserless = new Browserless({ config, metrics });
|
|
14
|
+
return browserless.start();
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await browserless.stop();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('Kill all sessions', async () => {
|
|
22
|
+
await start();
|
|
23
|
+
const browser1 = await puppeteer.connect({
|
|
24
|
+
browserWSEndpoint: `ws://localhost:3000/chrome?token=6R0W53R135510`,
|
|
25
|
+
});
|
|
26
|
+
const browser2 = await puppeteer.connect({
|
|
27
|
+
browserWSEndpoint: `ws://localhost:3000/chrome?token=6R0W53R135510`,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
await fetch('http://localhost:3000/kill/all?token=6R0W53R135510').then(
|
|
31
|
+
async (res) => {
|
|
32
|
+
expect(res.status).to.equal(204);
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
let errorThrown1;
|
|
37
|
+
try {
|
|
38
|
+
await browser1.newPage();
|
|
39
|
+
} catch (e) {
|
|
40
|
+
errorThrown1 = e;
|
|
41
|
+
}
|
|
42
|
+
let errorThrown2;
|
|
43
|
+
try {
|
|
44
|
+
await browser2.newPage();
|
|
45
|
+
} catch (e) {
|
|
46
|
+
errorThrown2 = e;
|
|
47
|
+
}
|
|
48
|
+
expect((errorThrown1 as Error).message).contains('closed');
|
|
49
|
+
expect((errorThrown2 as Error).message).contains('closed');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('Kill session by browserId', async () => {
|
|
53
|
+
await start();
|
|
54
|
+
const browser = await puppeteer.connect({
|
|
55
|
+
browserWSEndpoint: `ws://localhost:3000/chrome?token=6R0W53R135510`,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
await fetch('http://localhost:3000/sessions?token=6R0W53R135510').then(
|
|
59
|
+
async (res) => {
|
|
60
|
+
const sessions = await res.json();
|
|
61
|
+
const browserId = sessions[0].browserId;
|
|
62
|
+
await fetch(
|
|
63
|
+
`http://localhost:3000/kill/${browserId}?token=6R0W53R135510`,
|
|
64
|
+
).then(async (res) => {
|
|
65
|
+
expect(res.status).to.equal(204);
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
let errorThrown;
|
|
71
|
+
try {
|
|
72
|
+
await browser.newPage();
|
|
73
|
+
} catch (e) {
|
|
74
|
+
errorThrown = e;
|
|
75
|
+
}
|
|
76
|
+
expect((errorThrown as Error).message).contains('closed');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('Kill session by trackingId', async () => {
|
|
80
|
+
await start();
|
|
81
|
+
const browser = await puppeteer.connect({
|
|
82
|
+
browserWSEndpoint: `ws://localhost:3000/chrome?token=6R0W53R135510&trackingId=session-1`,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
await fetch(
|
|
86
|
+
'http://localhost:3000/kill/session-1?token=6R0W53R135510',
|
|
87
|
+
).then(async (res) => {
|
|
88
|
+
expect(res.status).to.equal(204);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
let errorThrown;
|
|
92
|
+
try {
|
|
93
|
+
await browser.newPage();
|
|
94
|
+
} catch (e) {
|
|
95
|
+
errorThrown = e;
|
|
96
|
+
}
|
|
97
|
+
expect((errorThrown as Error).message).contains('closed');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Browserless, Config, Metrics } from '@browserless.io/browserless';
|
|
2
|
+
import { expect } from 'chai';
|
|
3
|
+
import puppeteer from 'puppeteer-core';
|
|
4
|
+
|
|
5
|
+
describe('/kill API', function () {
|
|
6
|
+
let browserless: Browserless;
|
|
7
|
+
|
|
8
|
+
const start = ({
|
|
9
|
+
config = new Config(),
|
|
10
|
+
metrics = new Metrics(),
|
|
11
|
+
}: { config?: Config; metrics?: Metrics } = {}) => {
|
|
12
|
+
config.setToken('6R0W53R135510');
|
|
13
|
+
browserless = new Browserless({ config, metrics });
|
|
14
|
+
return browserless.start();
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await browserless.stop();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('Kill all sessions', async () => {
|
|
22
|
+
await start();
|
|
23
|
+
const browser1 = await puppeteer.connect({
|
|
24
|
+
browserWSEndpoint: `ws://localhost:3000/chromium?token=6R0W53R135510`,
|
|
25
|
+
});
|
|
26
|
+
const browser2 = await puppeteer.connect({
|
|
27
|
+
browserWSEndpoint: `ws://localhost:3000/chromium?token=6R0W53R135510`,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
await fetch('http://localhost:3000/kill/all?token=6R0W53R135510').then(
|
|
31
|
+
async (res) => {
|
|
32
|
+
expect(res.status).to.equal(204);
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
let errorThrown1;
|
|
37
|
+
try {
|
|
38
|
+
await browser1.newPage();
|
|
39
|
+
} catch (e) {
|
|
40
|
+
errorThrown1 = e;
|
|
41
|
+
}
|
|
42
|
+
let errorThrown2;
|
|
43
|
+
try {
|
|
44
|
+
await browser2.newPage();
|
|
45
|
+
} catch (e) {
|
|
46
|
+
errorThrown2 = e;
|
|
47
|
+
}
|
|
48
|
+
expect((errorThrown1 as Error).message).contains('closed');
|
|
49
|
+
expect((errorThrown2 as Error).message).contains('closed');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('Kill session by browserId', async () => {
|
|
53
|
+
await start();
|
|
54
|
+
const browser = await puppeteer.connect({
|
|
55
|
+
browserWSEndpoint: `ws://localhost:3000/chromium?token=6R0W53R135510`,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
await fetch('http://localhost:3000/sessions?token=6R0W53R135510').then(
|
|
59
|
+
async (res) => {
|
|
60
|
+
const sessions = await res.json();
|
|
61
|
+
const browserId = sessions[0].browserId;
|
|
62
|
+
await fetch(
|
|
63
|
+
`http://localhost:3000/kill/${browserId}?token=6R0W53R135510`,
|
|
64
|
+
).then(async (res) => {
|
|
65
|
+
expect(res.status).to.equal(204);
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
let errorThrown;
|
|
71
|
+
try {
|
|
72
|
+
await browser.newPage();
|
|
73
|
+
} catch (e) {
|
|
74
|
+
errorThrown = e;
|
|
75
|
+
}
|
|
76
|
+
expect((errorThrown as Error).message).contains('closed');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('Kill session by trackingId', async () => {
|
|
80
|
+
await start();
|
|
81
|
+
const browser = await puppeteer.connect({
|
|
82
|
+
browserWSEndpoint: `ws://localhost:3000/chromium?token=6R0W53R135510&trackingId=session-1`,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
await fetch(
|
|
86
|
+
'http://localhost:3000/kill/session-1?token=6R0W53R135510',
|
|
87
|
+
).then(async (res) => {
|
|
88
|
+
expect(res.status).to.equal(204);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
let errorThrown;
|
|
92
|
+
try {
|
|
93
|
+
await browser.newPage();
|
|
94
|
+
} catch (e) {
|
|
95
|
+
errorThrown = e;
|
|
96
|
+
}
|
|
97
|
+
expect((errorThrown as Error).message).contains('closed');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -513,4 +513,33 @@ describe('Chromium WebSocket API', function () {
|
|
|
513
513
|
|
|
514
514
|
await browser.disconnect();
|
|
515
515
|
});
|
|
516
|
+
|
|
517
|
+
it('Throws an error while creating a session with invalid trackingId', async () => {
|
|
518
|
+
await start();
|
|
519
|
+
|
|
520
|
+
const didError = await puppeteer
|
|
521
|
+
.connect({
|
|
522
|
+
browserWSEndpoint: `ws://localhost:3000/chromium?trackingId=all`,
|
|
523
|
+
})
|
|
524
|
+
.then(() => false)
|
|
525
|
+
.catch(() => true);
|
|
526
|
+
|
|
527
|
+
expect(didError).to.be.true;
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
it('Throws an error while creating a session with duplicated trackingId', async () => {
|
|
531
|
+
await start();
|
|
532
|
+
|
|
533
|
+
await puppeteer.connect({
|
|
534
|
+
browserWSEndpoint: `ws://localhost:3000/chromium?trackingId=duplicated`,
|
|
535
|
+
});
|
|
536
|
+
const didError = await puppeteer
|
|
537
|
+
.connect({
|
|
538
|
+
browserWSEndpoint: `ws://localhost:3000/chromium?trackingId=duplicated`,
|
|
539
|
+
})
|
|
540
|
+
.then(() => false)
|
|
541
|
+
.catch(() => true);
|
|
542
|
+
|
|
543
|
+
expect(didError).to.be.true;
|
|
544
|
+
});
|
|
516
545
|
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Browserless, Config, Metrics } from '@browserless.io/browserless';
|
|
2
|
+
import { expect } from 'chai';
|
|
3
|
+
import { firefox } from 'playwright-core';
|
|
4
|
+
|
|
5
|
+
describe('/kill API firefox', function () {
|
|
6
|
+
let browserless: Browserless;
|
|
7
|
+
|
|
8
|
+
const start = ({
|
|
9
|
+
config = new Config(),
|
|
10
|
+
metrics = new Metrics(),
|
|
11
|
+
}: { config?: Config; metrics?: Metrics } = {}) => {
|
|
12
|
+
config.setToken('browserless');
|
|
13
|
+
browserless = new Browserless({ config, metrics });
|
|
14
|
+
return browserless.start();
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await browserless.stop();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('Kill all sessions', async () => {
|
|
22
|
+
await start();
|
|
23
|
+
const browser1 = await firefox.connect(
|
|
24
|
+
`ws://localhost:3000/playwright/firefox?token=browserless`,
|
|
25
|
+
);
|
|
26
|
+
const browser2 = await firefox.connect(
|
|
27
|
+
`ws://localhost:3000/playwright/firefox?token=browserless`,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
await fetch('http://localhost:3000/kill/all?token=browserless').then(
|
|
31
|
+
async (res) => {
|
|
32
|
+
expect(res.status).to.equal(204);
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
let errorThrown1;
|
|
37
|
+
try {
|
|
38
|
+
await browser1.newPage();
|
|
39
|
+
} catch (e) {
|
|
40
|
+
errorThrown1 = e;
|
|
41
|
+
}
|
|
42
|
+
let errorThrown2;
|
|
43
|
+
try {
|
|
44
|
+
await browser2.newPage();
|
|
45
|
+
} catch (e) {
|
|
46
|
+
errorThrown2 = e;
|
|
47
|
+
}
|
|
48
|
+
expect((errorThrown1 as Error).message).contains('closed');
|
|
49
|
+
expect((errorThrown2 as Error).message).contains('closed');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('Kill session by browserId', async () => {
|
|
53
|
+
await start();
|
|
54
|
+
const browser = await firefox.connect(
|
|
55
|
+
`ws://localhost:3000/playwright/firefox?token=browserless`,
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
await fetch('http://localhost:3000/sessions?token=browserless').then(
|
|
59
|
+
async (res) => {
|
|
60
|
+
const sessions = await res.json();
|
|
61
|
+
const browserId = sessions[0].browserId;
|
|
62
|
+
await fetch(
|
|
63
|
+
`http://localhost:3000/kill/${browserId}?token=browserless`,
|
|
64
|
+
).then(async (res) => {
|
|
65
|
+
expect(res.status).to.equal(204);
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
let errorThrown;
|
|
71
|
+
try {
|
|
72
|
+
await browser.newPage();
|
|
73
|
+
} catch (e) {
|
|
74
|
+
errorThrown = e;
|
|
75
|
+
}
|
|
76
|
+
expect((errorThrown as Error).message).contains('closed');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('Kill session by trackingId', async () => {
|
|
80
|
+
await start();
|
|
81
|
+
const browser = await firefox.connect(
|
|
82
|
+
`ws://localhost:3000/playwright/firefox?token=browserless&trackingId=session-1`,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
await fetch('http://localhost:3000/kill/session-1?token=browserless').then(
|
|
86
|
+
async (res) => {
|
|
87
|
+
expect(res.status).to.equal(204);
|
|
88
|
+
},
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
let errorThrown;
|
|
92
|
+
try {
|
|
93
|
+
await browser.newPage();
|
|
94
|
+
} catch (e) {
|
|
95
|
+
errorThrown = e;
|
|
96
|
+
}
|
|
97
|
+
expect((errorThrown as Error).message).contains('closed');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {
|
|
2
|
+
APITags,
|
|
3
|
+
BrowserlessRoutes,
|
|
4
|
+
HTTPManagementRoutes,
|
|
5
|
+
HTTPRoute,
|
|
6
|
+
Methods,
|
|
7
|
+
Request,
|
|
8
|
+
SystemQueryParameters,
|
|
9
|
+
contentTypes,
|
|
10
|
+
writeResponse,
|
|
11
|
+
} from '@browserless.io/browserless';
|
|
12
|
+
import { ServerResponse } from 'http';
|
|
13
|
+
|
|
14
|
+
export type ResponseSchema = string;
|
|
15
|
+
|
|
16
|
+
export interface QuerySchema extends SystemQueryParameters {
|
|
17
|
+
token: string;
|
|
18
|
+
browserId?: string;
|
|
19
|
+
trackingId?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export default class KillGetRoute extends HTTPRoute {
|
|
23
|
+
name = BrowserlessRoutes.KillGetRoute;
|
|
24
|
+
accepts = [contentTypes.any];
|
|
25
|
+
auth = true;
|
|
26
|
+
browser = null;
|
|
27
|
+
concurrency = false;
|
|
28
|
+
contentTypes = [contentTypes.json];
|
|
29
|
+
description = `Kill running sessions based on BrowserId or TrackingId.`;
|
|
30
|
+
method = Methods.get;
|
|
31
|
+
path = HTTPManagementRoutes.kill;
|
|
32
|
+
tags = [APITags.management];
|
|
33
|
+
|
|
34
|
+
async handler(req: Request, res: ServerResponse): Promise<void> {
|
|
35
|
+
const target = req.parsed.pathname.split('/')[2];
|
|
36
|
+
const browserManager = this.browserManager();
|
|
37
|
+
await browserManager.killSessions(target);
|
|
38
|
+
return writeResponse(res, 204, '');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
} from '@browserless.io/browserless';
|
|
15
15
|
import { ServerResponse } from 'http';
|
|
16
16
|
import { createRequire } from 'module';
|
|
17
|
+
import path from 'path';
|
|
17
18
|
|
|
18
19
|
export interface ResponseSchema {
|
|
19
20
|
/**
|
|
@@ -49,16 +50,17 @@ export interface ResponseSchema {
|
|
|
49
50
|
|
|
50
51
|
const semverReg = /(\*|\^|>|=|<|~)/gi;
|
|
51
52
|
const require = createRequire(import.meta.url);
|
|
52
|
-
const blessPackageJSON = require('
|
|
53
|
-
const { browsers } =
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
53
|
+
const blessPackageJSON = require(path.join(process.cwd(), 'package.json'));
|
|
54
|
+
const { browsers } = require(
|
|
55
|
+
path.join(process.cwd(), 'node_modules', 'playwright-core', 'browsers.json'),
|
|
56
|
+
) as {
|
|
57
|
+
browsers: [
|
|
58
|
+
{
|
|
59
|
+
name: string;
|
|
60
|
+
browserVersion: string;
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
};
|
|
62
64
|
const chromium = browsers.find((b) => b.name === 'chromium')!.browserVersion;
|
|
63
65
|
const firefox = browsers.find((b) => b.name === 'firefox')!.browserVersion;
|
|
64
66
|
const webkit = browsers.find((b) => b.name === 'webkit')!.browserVersion;
|
|
@@ -120,4 +120,23 @@ describe('Management APIs', function () {
|
|
|
120
120
|
expect(res.status).to.equal(204);
|
|
121
121
|
});
|
|
122
122
|
});
|
|
123
|
+
|
|
124
|
+
it('allows requests to /kill', async () => {
|
|
125
|
+
await start();
|
|
126
|
+
|
|
127
|
+
await fetch('http://localhost:3000/kill/all?token=6R0W53R135510').then(
|
|
128
|
+
async (res) => {
|
|
129
|
+
expect(res.status).to.equal(204);
|
|
130
|
+
},
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
it('Throws an error trying to kill invalid session', async () => {
|
|
134
|
+
await start();
|
|
135
|
+
|
|
136
|
+
await fetch(
|
|
137
|
+
`http://localhost:3000/kill/invalid-session?token=6R0W53R135510`,
|
|
138
|
+
).then(async (res) => {
|
|
139
|
+
expect(res.status).to.equal(404);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
123
142
|
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Browserless, Config, Metrics } from '@browserless.io/browserless';
|
|
2
|
+
import { expect } from 'chai';
|
|
3
|
+
import { webkit } from 'playwright-core';
|
|
4
|
+
|
|
5
|
+
describe('/kill API webkit', function () {
|
|
6
|
+
let browserless: Browserless;
|
|
7
|
+
|
|
8
|
+
const start = ({
|
|
9
|
+
config = new Config(),
|
|
10
|
+
metrics = new Metrics(),
|
|
11
|
+
}: { config?: Config; metrics?: Metrics } = {}) => {
|
|
12
|
+
config.setToken('browserless');
|
|
13
|
+
browserless = new Browserless({ config, metrics });
|
|
14
|
+
return browserless.start();
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await browserless.stop();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('Kill all sessions', async () => {
|
|
22
|
+
await start();
|
|
23
|
+
const browser1 = await webkit.connect(
|
|
24
|
+
`ws://localhost:3000/webkit/playwright?token=browserless&trackingId=session-1`,
|
|
25
|
+
);
|
|
26
|
+
const browser2 = await webkit.connect(
|
|
27
|
+
`ws://localhost:3000/webkit/playwright?token=browserless&trackingId=session-2`,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
await fetch('http://localhost:3000/kill/all?token=browserless').then(
|
|
31
|
+
async (res) => {
|
|
32
|
+
expect(res.status).to.equal(204);
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
let errorThrown1;
|
|
37
|
+
try {
|
|
38
|
+
await browser1.newPage();
|
|
39
|
+
} catch (e) {
|
|
40
|
+
errorThrown1 = e;
|
|
41
|
+
}
|
|
42
|
+
let errorThrown2;
|
|
43
|
+
try {
|
|
44
|
+
await browser2.newPage();
|
|
45
|
+
} catch (e) {
|
|
46
|
+
errorThrown2 = e;
|
|
47
|
+
}
|
|
48
|
+
expect((errorThrown1 as Error).message).contains('closed');
|
|
49
|
+
expect((errorThrown2 as Error).message).contains('closed');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('Kill session by browserId', async () => {
|
|
53
|
+
await start();
|
|
54
|
+
const browser = await webkit.connect(
|
|
55
|
+
`ws://localhost:3000/webkit/playwright?token=browserless`,
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
await fetch('http://localhost:3000/sessions?token=browserless').then(
|
|
59
|
+
async (res) => {
|
|
60
|
+
const sessions = await res.json();
|
|
61
|
+
const browserId = sessions[0].browserId;
|
|
62
|
+
await fetch(
|
|
63
|
+
`http://localhost:3000/kill/${browserId}?token=browserless`,
|
|
64
|
+
).then(async (res) => {
|
|
65
|
+
expect(res.status).to.equal(204);
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
let errorThrown;
|
|
71
|
+
try {
|
|
72
|
+
await browser.newPage();
|
|
73
|
+
} catch (e) {
|
|
74
|
+
errorThrown = e;
|
|
75
|
+
}
|
|
76
|
+
expect((errorThrown as Error).message).contains('closed');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('Kill session by trackingId', async () => {
|
|
80
|
+
await start();
|
|
81
|
+
const browser = await webkit.connect(
|
|
82
|
+
`ws://localhost:3000/webkit/playwright?token=browserless&trackingId=session-1`,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
await fetch('http://localhost:3000/kill/session-1?token=browserless').then(
|
|
86
|
+
async (res) => {
|
|
87
|
+
expect(res.status).to.equal(204);
|
|
88
|
+
},
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
let errorThrown;
|
|
92
|
+
try {
|
|
93
|
+
await browser.newPage();
|
|
94
|
+
} catch (e) {
|
|
95
|
+
errorThrown = e;
|
|
96
|
+
}
|
|
97
|
+
expect((errorThrown as Error).message).contains('closed');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -2,6 +2,7 @@ import { Message, mainOptions } from './types.js';
|
|
|
2
2
|
import { fork } from 'child_process';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
|
|
5
|
+
const __dirname = import.meta.dirname;
|
|
5
6
|
const DEFAULT_AUDIT_CONFIG = {
|
|
6
7
|
extends: 'lighthouse:default',
|
|
7
8
|
};
|
|
@@ -13,14 +14,7 @@ export default async ({
|
|
|
13
14
|
timeout,
|
|
14
15
|
}: mainOptions): Promise<unknown> => {
|
|
15
16
|
return new Promise((resolve, reject) => {
|
|
16
|
-
const childPath = path.join(
|
|
17
|
-
'./',
|
|
18
|
-
'build',
|
|
19
|
-
'shared',
|
|
20
|
-
'utils',
|
|
21
|
-
'performance',
|
|
22
|
-
'child.js',
|
|
23
|
-
);
|
|
17
|
+
const childPath = path.join(__dirname, 'child.js');
|
|
24
18
|
|
|
25
19
|
logger.trace(`Starting up child at ${childPath}`);
|
|
26
20
|
|
package/src/types.ts
CHANGED
|
@@ -661,6 +661,7 @@ export const BrowserlessWebKitRoutes = {
|
|
|
661
661
|
export const BrowserlessManagementRoutes = {
|
|
662
662
|
ActiveGetRoute: 'ActiveGetRoute',
|
|
663
663
|
ConfigGetRoute: 'ConfigGetRoute',
|
|
664
|
+
KillGetRoute: 'KillGetRoute',
|
|
664
665
|
MetaGetRoute: 'MetaGetRoute',
|
|
665
666
|
MetricsGetRoute: 'MetricsGetRoute',
|
|
666
667
|
MetricsTotalGetRoute: 'MetricsTotalGetRoute',
|
package/src/utils.ts
CHANGED
|
@@ -743,23 +743,14 @@ export const parseStringParam = (
|
|
|
743
743
|
params: URLSearchParams,
|
|
744
744
|
name: string,
|
|
745
745
|
defaultValue: string,
|
|
746
|
-
) => {
|
|
746
|
+
): string => {
|
|
747
747
|
const value = params.get(name);
|
|
748
748
|
|
|
749
749
|
if (value === null) {
|
|
750
750
|
return defaultValue;
|
|
751
751
|
}
|
|
752
752
|
|
|
753
|
-
|
|
754
|
-
if (value === '') {
|
|
755
|
-
return true;
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
try {
|
|
759
|
-
return JSON.parse(value);
|
|
760
|
-
} catch {
|
|
761
|
-
return value;
|
|
762
|
-
}
|
|
753
|
+
return value;
|
|
763
754
|
};
|
|
764
755
|
|
|
765
756
|
export const encrypt = (text: string, secret: Buffer) => {
|