@w-lfpup/jackrabbit 0.2.0 → 0.3.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.
Files changed (98) hide show
  1. package/.github/workflows/browsers.json +55 -0
  2. package/.github/workflows/browsers.macos.json +51 -0
  3. package/.github/workflows/browsers.windows.json +19 -0
  4. package/.github/workflows/tests.yml +13 -0
  5. package/README.md +41 -1
  6. package/browser/dist/logger.js +43 -0
  7. package/browser/dist/mod.js +25 -0
  8. package/browser/dist/queue.js +27 -0
  9. package/browser/dist/runner.js +20 -0
  10. package/{cli → browser}/package.json +1 -1
  11. package/browser/src/logger.ts +57 -0
  12. package/browser/src/mod.ts +30 -0
  13. package/browser/src/runner.ts +22 -0
  14. package/browser/tsconfig.json +11 -0
  15. package/browser/tsconfig.tsbuildinfo +1 -0
  16. package/browsers.json +38 -0
  17. package/core/dist/jackrabbit_types.d.ts +61 -27
  18. package/core/dist/mod.d.ts +2 -2
  19. package/core/dist/mod.js +1 -1
  20. package/core/dist/run_steps.d.ts +2 -2
  21. package/core/dist/run_steps.js +83 -67
  22. package/core/src/jackrabbit_types.ts +72 -28
  23. package/core/src/mod.ts +2 -8
  24. package/core/src/run_steps.ts +111 -80
  25. package/examples/hello_world/goodbye_world.ts +1 -1
  26. package/examples/hello_world/hello_world.ts +1 -1
  27. package/nodejs/dist/logger.js +164 -0
  28. package/nodejs/dist/mod.js +33 -0
  29. package/nodejs/dist/results.js +145 -0
  30. package/nodejs/dist/results_str.js +147 -0
  31. package/nodejs/dist/runner.js +17 -0
  32. package/nodejs/src/logger.ts +200 -0
  33. package/nodejs/src/mod.ts +39 -0
  34. package/nodejs/src/results.ts +239 -0
  35. package/{nodejs_cli → nodejs}/tsconfig.json +2 -1
  36. package/nodejs/tsconfig.tsbuildinfo +1 -0
  37. package/package.json +6 -4
  38. package/tests/dist/mod.d.ts +14 -3
  39. package/tests/dist/mod.js +33 -15
  40. package/tests/dist/test_error.test.d.ts +9 -0
  41. package/tests/dist/test_error.test.js +25 -0
  42. package/tests/dist/test_errors.test.d.ts +9 -0
  43. package/tests/dist/test_errors.test.js +27 -0
  44. package/tests/dist/test_fail.test.js +0 -2
  45. package/tests/dist/test_logger.d.ts +3 -2
  46. package/tests/dist/test_logger.js +5 -1
  47. package/tests/dist/test_pass.test.js +0 -2
  48. package/tests/src/mod.ts +31 -15
  49. package/tests/src/test_error.test.ts +32 -0
  50. package/tests/src/test_logger.ts +6 -1
  51. package/tests/tsconfig.tsbuildinfo +1 -1
  52. package/tsconfig.json +3 -2
  53. package/webdriver/dist/config.js +56 -0
  54. package/webdriver/dist/eventbus.js +18 -0
  55. package/webdriver/dist/listeners.js +21 -0
  56. package/webdriver/dist/logger.js +200 -0
  57. package/webdriver/dist/mod.js +35 -0
  58. package/webdriver/dist/results.js +190 -0
  59. package/webdriver/dist/results_str.js +167 -0
  60. package/webdriver/dist/routes.js +162 -0
  61. package/webdriver/dist/routes2.js +163 -0
  62. package/webdriver/dist/test_hangar.js +20 -0
  63. package/webdriver/dist/webdriver.js +272 -0
  64. package/webdriver/package.json +8 -0
  65. package/webdriver/src/config.ts +89 -0
  66. package/webdriver/src/eventbus.ts +104 -0
  67. package/webdriver/src/logger.ts +247 -0
  68. package/webdriver/src/mod.ts +45 -0
  69. package/webdriver/src/results.ts +311 -0
  70. package/webdriver/src/routes.ts +198 -0
  71. package/webdriver/src/test_hangar.ts +25 -0
  72. package/webdriver/src/webdriver.ts +373 -0
  73. package/{cli → webdriver}/tsconfig.json +1 -0
  74. package/webdriver/tsconfig.tsbuildinfo +1 -0
  75. package/cli/dist/cli.d.ts +0 -3
  76. package/cli/dist/cli.js +0 -8
  77. package/cli/dist/cli_types.d.ts +0 -7
  78. package/cli/dist/cli_types.js +0 -1
  79. package/cli/dist/config.d.ts +0 -5
  80. package/cli/dist/config.js +0 -6
  81. package/cli/dist/importer.d.ts +0 -7
  82. package/cli/dist/importer.js +0 -16
  83. package/cli/dist/logger.d.ts +0 -7
  84. package/cli/dist/logger.js +0 -88
  85. package/cli/dist/mod.d.ts +0 -6
  86. package/cli/dist/mod.js +0 -4
  87. package/cli/src/cli.ts +0 -17
  88. package/cli/src/cli_types.ts +0 -9
  89. package/cli/src/config.ts +0 -9
  90. package/cli/src/importer.ts +0 -25
  91. package/cli/src/logger.ts +0 -126
  92. package/cli/src/mod.ts +0 -7
  93. package/cli/tsconfig.tsbuildinfo +0 -1
  94. package/nodejs_cli/dist/mod.d.ts +0 -2
  95. package/nodejs_cli/dist/mod.js +0 -20
  96. package/nodejs_cli/src/mod.ts +0 -25
  97. package/nodejs_cli/tsconfig.tsbuildinfo +0 -1
  98. /package/{nodejs_cli → nodejs}/package.json +0 -0
@@ -0,0 +1,162 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { testHanger } from "./test_hangar.js";
4
+ let cwd = process.cwd();
5
+ const parentPath = path.join(import.meta.url.substring(5), "../../../");
6
+ const MIME_TYPES = {
7
+ octet: "application/octet-stream",
8
+ html: "text/html; charset=UTF-8",
9
+ js: "text/javascript",
10
+ json: "application/json",
11
+ css: "text/css",
12
+ png: "image/png",
13
+ jpg: "image/jpeg",
14
+ ico: "image/x-icon",
15
+ svg: "image/svg+xml",
16
+ };
17
+ export class Router {
18
+ #config;
19
+ #eventbus;
20
+ constructor(config, eventbus) {
21
+ this.#config = config;
22
+ this.#eventbus = eventbus;
23
+ }
24
+ get route() {
25
+ return this.#boundRoute;
26
+ }
27
+ #boundRoute = this.#route.bind(this);
28
+ async #route(req, res) {
29
+ if (serveBadRequest(req, res))
30
+ return;
31
+ if (servePing(req, res))
32
+ return;
33
+ if (serveTestPage(req, res, this.#config))
34
+ return;
35
+ if (logAction(req, res, this.#eventbus))
36
+ return;
37
+ await serveFile(req, res);
38
+ }
39
+ }
40
+ function serveBadRequest(req, res) {
41
+ let { url } = req;
42
+ if (url)
43
+ return false;
44
+ res.setHeader("Content-Type", "text/html");
45
+ res.writeHead(400);
46
+ res.end();
47
+ return true;
48
+ }
49
+ function servePing(req, res) {
50
+ let { url, method } = req;
51
+ if (url !== "/ping" || "GET" !== method)
52
+ return false;
53
+ res.setHeader("Content-Type", "text/html");
54
+ res.writeHead(200);
55
+ res.end("The cookie train has arrived!");
56
+ return true;
57
+ }
58
+ function serveTestPage(req, res, config) {
59
+ let { url, method } = req;
60
+ if (url !== "/" || "GET" !== method)
61
+ return false;
62
+ let hangar = testHanger({
63
+ jackrabbit_url: config.hostAndPort,
64
+ test_collections: process.argv.slice(3),
65
+ });
66
+ res.setHeader("Content-Type", "text/html");
67
+ res.writeHead(200);
68
+ res.end(hangar);
69
+ return true;
70
+ }
71
+ function logAction(req, res, eventbus) {
72
+ let { url, method } = req;
73
+ if (!url?.startsWith("/log/") || "POST" !== method)
74
+ return false;
75
+ let id;
76
+ let cookies = req.headers.cookie?.split(";") ?? [];
77
+ for (const cookieLine of cookies) {
78
+ if (cookieLine.startsWith("jackrabbit=")) {
79
+ let [_name, value] = cookieLine.split("=");
80
+ id = value;
81
+ }
82
+ }
83
+ if (id) {
84
+ getLoggerActionFromRequestBody(req)
85
+ .then(function (loggerAction) {
86
+ eventbus.dispatchAction({
87
+ type: "log",
88
+ loggerAction,
89
+ id,
90
+ });
91
+ res.writeHead(201);
92
+ })
93
+ .catch(function () {
94
+ res.writeHead(401);
95
+ })
96
+ .finally(function () {
97
+ res.end();
98
+ });
99
+ }
100
+ else {
101
+ res.writeHead(401);
102
+ res.end();
103
+ }
104
+ return true;
105
+ }
106
+ async function serveFile(req, res) {
107
+ let { url, method } = req;
108
+ if (!url || "GET" !== method) {
109
+ res.setHeader("Content-Type", MIME_TYPES["html"]);
110
+ res.writeHead(400);
111
+ res.end();
112
+ return;
113
+ }
114
+ let urlFilePath = path.join(url);
115
+ let extStr = "";
116
+ if (url.endsWith("/"))
117
+ extStr = "index.html";
118
+ let urlNoPrefix = url;
119
+ if (urlFilePath.startsWith("/jackrabbit")) {
120
+ let strippedUrl = urlFilePath.substring("/jackrabbit".length);
121
+ urlFilePath = path.join(parentPath, strippedUrl, extStr);
122
+ }
123
+ else {
124
+ urlFilePath = path.join(cwd, urlNoPrefix, extStr);
125
+ }
126
+ let stream = await getFile(urlFilePath);
127
+ if (stream) {
128
+ const ext = path.extname(urlFilePath).substring(1).toLowerCase();
129
+ let mimeType = MIME_TYPES[ext] ?? MIME_TYPES["octet"];
130
+ res.setHeader("Content-Type", mimeType);
131
+ res.writeHead(200);
132
+ stream.pipe(res);
133
+ }
134
+ else {
135
+ res.setHeader("Content-Type", MIME_TYPES["html"]);
136
+ res.writeHead(404);
137
+ res.end();
138
+ }
139
+ }
140
+ function getLoggerActionFromRequestBody(req) {
141
+ return new Promise(function (resolve, reject) {
142
+ let data = [];
143
+ req.addListener("data", function (chunk) {
144
+ data.push(chunk);
145
+ });
146
+ req.addListener("end", function () {
147
+ let actionStr = Buffer.concat(data).toString();
148
+ let action = JSON.parse(actionStr);
149
+ resolve(action);
150
+ });
151
+ req.addListener("error", function (err) {
152
+ reject(err);
153
+ });
154
+ });
155
+ }
156
+ async function getFile(filePath) {
157
+ try {
158
+ await fs.promises.access(filePath);
159
+ return fs.createReadStream(filePath);
160
+ }
161
+ catch { }
162
+ }
@@ -0,0 +1,163 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { testHanger } from "./test_hangar.js";
4
+ let cwd = process.cwd();
5
+ // better done with URL? feels weird
6
+ let corePath = path.join(import.meta.url.substring(5), "../../../core/dist/");
7
+ let browserPath = path.join(import.meta.url.substring(5), "../../../browser/dist/");
8
+ const MIME_TYPES = {
9
+ octet: "application/octet-stream",
10
+ html: "text/html; charset=UTF-8",
11
+ js: "text/javascript",
12
+ json: "application/json",
13
+ css: "text/css",
14
+ png: "image/png",
15
+ jpg: "image/jpeg",
16
+ ico: "image/x-icon",
17
+ svg: "image/svg+xml",
18
+ };
19
+ export class Router {
20
+ #config;
21
+ #eventbus;
22
+ constructor(config, eventbus) {
23
+ this.#config = config;
24
+ this.#eventbus = eventbus;
25
+ }
26
+ get route() {
27
+ return this.#boundRoute;
28
+ }
29
+ #boundRoute = this.#route.bind(this);
30
+ async #route(req, res) {
31
+ if (serveBadRequest(req, res))
32
+ return;
33
+ if (servePing(req, res))
34
+ return;
35
+ if (serveTestPage(req, res, this.#config))
36
+ return;
37
+ if (logAction(req, res, this.#eventbus))
38
+ return;
39
+ await serveFile(req, res);
40
+ }
41
+ }
42
+ function getLoggerActionFromRequestBody(req) {
43
+ return new Promise(function (resolve, reject) {
44
+ let data = [];
45
+ req.addListener("data", function (chunk) {
46
+ data.push(chunk);
47
+ });
48
+ req.addListener("end", function () {
49
+ let actionStr = Buffer.concat(data).toString();
50
+ let action = JSON.parse(actionStr);
51
+ resolve(action);
52
+ });
53
+ req.addListener("error", function (err) {
54
+ reject(err);
55
+ });
56
+ });
57
+ }
58
+ async function getDirectoryScopedFile(filePath, basePath) {
59
+ if (!filePath.startsWith(basePath))
60
+ return;
61
+ try {
62
+ await fs.promises.access(filePath);
63
+ return fs.createReadStream(filePath);
64
+ }
65
+ catch { }
66
+ }
67
+ function serveBadRequest(req, res) {
68
+ let { url } = req;
69
+ if (url)
70
+ return false;
71
+ res.setHeader("Content-Type", "text/html");
72
+ res.writeHead(400);
73
+ res.end();
74
+ return true;
75
+ }
76
+ function servePing(req, res) {
77
+ let { url, method } = req;
78
+ if (url !== "/ping" || "GET" !== method)
79
+ return false;
80
+ res.setHeader("Content-Type", "text/html");
81
+ res.writeHead(200);
82
+ res.end("The cookie train has arrived!");
83
+ return true;
84
+ }
85
+ function serveTestPage(req, res, config) {
86
+ let { url, method } = req;
87
+ if (url !== "/" || "GET" !== method)
88
+ return false;
89
+ let hangar = testHanger({
90
+ jackrabbit_url: config.hostAndPort,
91
+ test_collections: process.argv.slice(3),
92
+ });
93
+ res.setHeader("Content-Type", "text/html");
94
+ res.writeHead(200);
95
+ res.end(hangar);
96
+ return true;
97
+ }
98
+ function logAction(req, res, eventbus) {
99
+ let { url, method } = req;
100
+ if (url?.startsWith("/log/") && "POST" === method)
101
+ return false;
102
+ let id;
103
+ let cookies = req.headers.cookie?.split(";") ?? [];
104
+ for (const cookieLine of cookies) {
105
+ if (cookieLine.startsWith("jackrabbit=")) {
106
+ let [_name, value] = cookieLine.split("=");
107
+ id = value;
108
+ }
109
+ }
110
+ if (!id)
111
+ return false;
112
+ getLoggerActionFromRequestBody(req)
113
+ .then(function (loggerAction) {
114
+ eventbus.dispatchAction({
115
+ type: "log",
116
+ loggerAction,
117
+ id,
118
+ });
119
+ res.writeHead(200);
120
+ })
121
+ .catch(function () {
122
+ res.writeHead(403);
123
+ })
124
+ .finally(function () {
125
+ res.end();
126
+ });
127
+ return true;
128
+ }
129
+ async function serveFile(req, res) {
130
+ let { url, method } = req;
131
+ if (!url)
132
+ return;
133
+ let ext = "";
134
+ if (url.endsWith("/"))
135
+ ext = "index.html";
136
+ let urlNoPrefix = url;
137
+ if (url.startsWith("/jackrabbit"))
138
+ urlNoPrefix = url.substring(11);
139
+ let filePath = path.join(cwd, urlNoPrefix, ext);
140
+ let stream;
141
+ if (url.startsWith("/jackrabbit/core/") && "GET" === method) {
142
+ stream = await getDirectoryScopedFile(filePath, corePath);
143
+ }
144
+ if (url.startsWith("/jackrabbit/browser/") && "GET" === method) {
145
+ stream = await getDirectoryScopedFile(filePath, browserPath);
146
+ }
147
+ if (!url.startsWith("/jackrabbit") && "GET" === method) {
148
+ stream = await getDirectoryScopedFile(filePath, cwd);
149
+ }
150
+ if (stream) {
151
+ // throwing errors and stuff
152
+ const ext = path.extname(filePath).substring(1).toLowerCase();
153
+ let mimeType = MIME_TYPES[ext] ?? MIME_TYPES["octet"];
154
+ res.setHeader("Content-Type", mimeType);
155
+ res.writeHead(200);
156
+ stream.pipe(res);
157
+ }
158
+ else {
159
+ res.setHeader("Content-Type", MIME_TYPES["html"]);
160
+ res.writeHead(404);
161
+ res.end();
162
+ }
163
+ }
@@ -0,0 +1,20 @@
1
+ export function testHanger(params) {
2
+ return `<!DOCTYPE html>
3
+ <html>
4
+ <head>
5
+ <script type="jackrabbit_config">
6
+ ${JSON.stringify(params)}
7
+ </script>
8
+ <script type="importmap">
9
+ {
10
+ "imports": {
11
+ "jackrabbit/core/": "/jackrabbit/core/"
12
+ }
13
+ }
14
+ </script>
15
+ <script type="module" src="/jackrabbit/browser/dist/mod.js"></script>
16
+ </head>
17
+ <body></body>
18
+ </html>
19
+ `;
20
+ }
@@ -0,0 +1,272 @@
1
+ import { exec } from "child_process";
2
+ let headers = new Headers([["Content-Type", "application/json"]]);
3
+ export class WebDrivers {
4
+ #config;
5
+ #eventbus;
6
+ #webdrivers = [];
7
+ #currentIndex = 0;
8
+ constructor(config, eventbus) {
9
+ this.#eventbus = eventbus;
10
+ this.#config = config;
11
+ for (const params of config.webdrivers) {
12
+ this.#webdrivers.push(new WebdriverSession(params, config.hostAndPort, eventbus));
13
+ }
14
+ }
15
+ run() {
16
+ this.#eventbus.addListener("session_closed", (action) => {
17
+ if (action.id !== this.#config.webdrivers[this.#currentIndex]?.jrId)
18
+ return;
19
+ this.#currentIndex += 1;
20
+ let webdriver = this.#webdrivers[this.#currentIndex];
21
+ webdriver
22
+ ? webdriver.run()
23
+ : this.#eventbus.dispatchAction({
24
+ type: "end",
25
+ });
26
+ });
27
+ let webdriver = this.#webdrivers[this.#currentIndex];
28
+ webdriver
29
+ ? webdriver.run()
30
+ : this.#eventbus.dispatchAction({
31
+ type: "end",
32
+ });
33
+ }
34
+ runAll() {
35
+ this.#eventbus.addListener("session_closed", (action) => {
36
+ let { id } = action;
37
+ let [indexStr] = id.split(":");
38
+ let index = parseInt(indexStr);
39
+ if (this.#webdrivers[index]) {
40
+ if (id === this.#config.webdrivers[index]?.jrId)
41
+ this.#currentIndex += 1;
42
+ }
43
+ if (this.#currentIndex === this.#webdrivers.length) {
44
+ this.#eventbus.dispatchAction({
45
+ type: "end",
46
+ });
47
+ }
48
+ });
49
+ for (let webdriver of this.#webdrivers) {
50
+ webdriver.run();
51
+ }
52
+ }
53
+ }
54
+ class WebdriverSession {
55
+ #params;
56
+ #hostAndPort;
57
+ #eventbus;
58
+ #process;
59
+ #signal;
60
+ #abortController;
61
+ #sessionId;
62
+ constructor(params, hostAndPort, eventbus) {
63
+ this.#params = params;
64
+ this.#hostAndPort = hostAndPort;
65
+ this.#eventbus = eventbus;
66
+ this.#abortController = new AbortController();
67
+ this.#eventbus.addListener("run_complete", (action) => {
68
+ if (action.id === this.#params.jrId)
69
+ this.#down();
70
+ });
71
+ }
72
+ async run() {
73
+ if (this.#process)
74
+ return;
75
+ let { jrId } = this.#params;
76
+ this.#eventbus.dispatchAction({
77
+ id: jrId,
78
+ type: "session_start",
79
+ });
80
+ this.#signal = setupSignal(this.#params, this.#eventbus, this.#abortController.signal);
81
+ this.#process = setupProcess(this.#params, this.#eventbus, this.#abortController.signal);
82
+ try {
83
+ await untilWebdriverReady(this.#params, this.#signal);
84
+ this.#sessionId = await getSession(this.#params, this.#signal);
85
+ await goToPing(this.#params, this.#signal, this.#sessionId, this.#hostAndPort);
86
+ await setCookie(this.#params, this.#signal, this.#sessionId);
87
+ await goToTestPage(this.#params, this.#signal, this.#sessionId, this.#hostAndPort);
88
+ }
89
+ catch (e) {
90
+ let errOutput;
91
+ if (e instanceof Error) {
92
+ errOutput = e.name + "\n" + e.message + (e.cause ? "\n" + e.cause : "");
93
+ }
94
+ if (!errOutput)
95
+ errOutput = e?.toString();
96
+ this.#eventbus.dispatchAction({
97
+ type: "session_error",
98
+ id: this.#params.jrId,
99
+ error: errOutput ?? "Unknown error creating browser session",
100
+ });
101
+ this.#abortController.abort();
102
+ }
103
+ }
104
+ async #down() {
105
+ if (!this.#process)
106
+ return;
107
+ await deleteSession(this.#params, this.#signal, this.#eventbus, this.#sessionId);
108
+ this.#process.kill();
109
+ this.#process = undefined;
110
+ }
111
+ }
112
+ function setupSignal(params, eventbus, externalSignal) {
113
+ let { jrId, timeoutMs } = params;
114
+ let signal = AbortSignal.any([
115
+ externalSignal,
116
+ AbortSignal.timeout(timeoutMs),
117
+ ]);
118
+ signal.addEventListener("abort", function () {
119
+ eventbus.dispatchAction({
120
+ type: "session_closed",
121
+ id: jrId,
122
+ });
123
+ });
124
+ return signal;
125
+ }
126
+ function setupProcess(params, eventbus, externalSignal) {
127
+ let { command, jrId } = params;
128
+ let process = exec(command, { signal: externalSignal }, (error, _stdout, stderr) => {
129
+ if (stderr) {
130
+ eventbus.dispatchAction({
131
+ id: jrId,
132
+ type: "stderr",
133
+ output: stderr,
134
+ });
135
+ }
136
+ });
137
+ process.addListener("error", function (error) {
138
+ eventbus.dispatchAction({
139
+ id: jrId,
140
+ type: "session_error",
141
+ error: error.toString(),
142
+ });
143
+ });
144
+ process.addListener("exit", function (statusCode) {
145
+ if (statusCode) {
146
+ eventbus.dispatchAction({
147
+ type: "session_error",
148
+ id: jrId,
149
+ error: `Process returned status code: ${statusCode}`,
150
+ });
151
+ }
152
+ eventbus.dispatchAction({
153
+ type: "session_closed",
154
+ id: jrId,
155
+ });
156
+ });
157
+ return process;
158
+ }
159
+ async function untilWebdriverReady(params, signal) {
160
+ let { url } = params;
161
+ while (signal && !signal.aborted) {
162
+ try {
163
+ let res = await fetch(new URL("/status", url), {
164
+ method: "GET",
165
+ headers,
166
+ body: null,
167
+ signal,
168
+ });
169
+ if (200 === res.status) {
170
+ let json = await res.json();
171
+ let { ready } = json?.value;
172
+ if (typeof ready === "boolean" && ready)
173
+ return;
174
+ }
175
+ }
176
+ catch { }
177
+ await sleep(30);
178
+ }
179
+ throw new Error("Webdriver was never ready.");
180
+ }
181
+ async function getSession(params, signal) {
182
+ let { url, capabilities } = params;
183
+ let res = await fetch(new URL("/session", url), {
184
+ method: "POST",
185
+ headers,
186
+ body: JSON.stringify({ capabilities: capabilities ?? {} }),
187
+ signal,
188
+ });
189
+ if (200 !== res.status) {
190
+ let cause = await res.text();
191
+ throw new Error("Failed to create a session", { cause });
192
+ }
193
+ let json = await res.json();
194
+ let { sessionId } = json?.value;
195
+ if (typeof sessionId !== "string")
196
+ throw new Error("session is not a string");
197
+ return sessionId;
198
+ }
199
+ async function goToPing(params, signal, sessionId, hostAndPort) {
200
+ let { url } = params;
201
+ let pingUrl = new URL("/ping", hostAndPort);
202
+ let getCookie = await fetch(new URL(`/session/${sessionId}/url`, url), {
203
+ method: "POST",
204
+ headers,
205
+ body: JSON.stringify({ url: pingUrl }),
206
+ signal,
207
+ });
208
+ if (200 !== getCookie.status) {
209
+ let cause = await getCookie.json();
210
+ throw new Error("go-to-cookie request failed", { cause });
211
+ }
212
+ }
213
+ async function setCookie(params, signal, sessionId) {
214
+ let { url, jrId } = params;
215
+ let cookieReq = await fetch(new URL(`/session/${sessionId}/cookie`, url), {
216
+ method: "POST",
217
+ headers,
218
+ body: JSON.stringify({
219
+ cookie: {
220
+ name: "jackrabbit",
221
+ value: jrId,
222
+ path: "/",
223
+ httpOnly: true,
224
+ },
225
+ }),
226
+ signal,
227
+ });
228
+ if (200 !== cookieReq.status) {
229
+ let cause = await cookieReq.json();
230
+ throw new Error("set-cookie request failed", { cause });
231
+ }
232
+ }
233
+ async function goToTestPage(params, signal, sessionId, hostAndPort) {
234
+ let { url } = params;
235
+ let goToUrlRes = await fetch(new URL(`/session/${sessionId}/url`, url), {
236
+ method: "POST",
237
+ headers,
238
+ body: JSON.stringify({ url: hostAndPort }),
239
+ signal,
240
+ });
241
+ if (200 !== goToUrlRes.status)
242
+ throw new Error("go-to-url request failed");
243
+ }
244
+ async function deleteSession(params, signal, eventbus, sessionId) {
245
+ let { url } = params;
246
+ try {
247
+ let delReqest = await fetch(new URL(`/session/${sessionId}`, url), {
248
+ method: "DELETE",
249
+ headers,
250
+ body: null,
251
+ signal: signal,
252
+ });
253
+ if (200 !== delReqest.status) {
254
+ let cause = await delReqest.json();
255
+ throw new Error("delete-cookie request failed", { cause });
256
+ }
257
+ }
258
+ catch (e) {
259
+ eventbus.dispatchAction({
260
+ type: "session_error",
261
+ id: params.jrId,
262
+ error: e?.toString() ?? "failed to delete browser session error",
263
+ });
264
+ }
265
+ }
266
+ function sleep(timeMs) {
267
+ return new Promise(function (resolve) {
268
+ setTimeout(function () {
269
+ resolve();
270
+ }, timeMs);
271
+ });
272
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "webdriver",
3
+ "type": "module",
4
+ "main": "dist/mod.js",
5
+ "scripts": {
6
+ "build": "npx tsc --build"
7
+ }
8
+ }