@w-lfpup/jackrabbit 0.2.0 → 0.3.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.
Files changed (96) hide show
  1. package/.github/workflows/browsers.json +45 -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 +24 -0
  5. package/README.md +41 -1
  6. package/browser/dist/logger.js +43 -0
  7. package/browser/dist/mod.js +26 -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 +161 -0
  28. package/nodejs/dist/mod.js +31 -0
  29. package/nodejs/dist/results.js +139 -0
  30. package/nodejs/dist/results_str.js +147 -0
  31. package/nodejs/dist/runner.js +17 -0
  32. package/nodejs/src/logger.ts +193 -0
  33. package/nodejs/src/mod.ts +37 -0
  34. package/nodejs/src/results_str.ts +234 -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 -13
  40. package/tests/dist/test_error.test.d.ts +9 -0
  41. package/tests/dist/test_error.test.js +27 -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_logger.d.ts +3 -2
  45. package/tests/dist/test_logger.js +5 -1
  46. package/tests/src/mod.ts +31 -15
  47. package/tests/src/test_error.test.ts +32 -0
  48. package/tests/src/test_logger.ts +6 -1
  49. package/tests/tsconfig.tsbuildinfo +1 -1
  50. package/tsconfig.json +1 -1
  51. package/webdriver/dist/config.js +57 -0
  52. package/webdriver/dist/eventbus.js +18 -0
  53. package/webdriver/dist/listeners.js +21 -0
  54. package/webdriver/dist/logger.js +203 -0
  55. package/webdriver/dist/mod.js +36 -0
  56. package/webdriver/dist/results_str.js +167 -0
  57. package/webdriver/dist/routes.js +172 -0
  58. package/webdriver/dist/routes2.js +163 -0
  59. package/webdriver/dist/test_hangar.js +20 -0
  60. package/webdriver/dist/webdriver.js +273 -0
  61. package/webdriver/package.json +8 -0
  62. package/webdriver/src/config.ts +89 -0
  63. package/webdriver/src/eventbus.ts +104 -0
  64. package/webdriver/src/logger.ts +247 -0
  65. package/webdriver/src/mod.ts +43 -0
  66. package/webdriver/src/results.ts +56 -0
  67. package/webdriver/src/results_str.ts +222 -0
  68. package/webdriver/src/routes.ts +211 -0
  69. package/webdriver/src/test_hangar.ts +25 -0
  70. package/webdriver/src/webdriver.ts +372 -0
  71. package/{cli → webdriver}/tsconfig.json +1 -0
  72. package/webdriver/tsconfig.tsbuildinfo +1 -0
  73. package/cli/dist/cli.d.ts +0 -3
  74. package/cli/dist/cli.js +0 -8
  75. package/cli/dist/cli_types.d.ts +0 -7
  76. package/cli/dist/config.d.ts +0 -5
  77. package/cli/dist/config.js +0 -6
  78. package/cli/dist/importer.d.ts +0 -7
  79. package/cli/dist/importer.js +0 -16
  80. package/cli/dist/logger.d.ts +0 -7
  81. package/cli/dist/logger.js +0 -88
  82. package/cli/dist/mod.d.ts +0 -6
  83. package/cli/dist/mod.js +0 -4
  84. package/cli/src/cli.ts +0 -17
  85. package/cli/src/cli_types.ts +0 -9
  86. package/cli/src/config.ts +0 -9
  87. package/cli/src/importer.ts +0 -25
  88. package/cli/src/logger.ts +0 -126
  89. package/cli/src/mod.ts +0 -7
  90. package/cli/tsconfig.tsbuildinfo +0 -1
  91. package/nodejs_cli/dist/mod.d.ts +0 -2
  92. package/nodejs_cli/dist/mod.js +0 -20
  93. package/nodejs_cli/src/mod.ts +0 -25
  94. package/nodejs_cli/tsconfig.tsbuildinfo +0 -1
  95. /package/{nodejs_cli → nodejs}/package.json +0 -0
  96. /package/{cli/dist/cli_types.js → webdriver/dist/results.js} +0 -0
@@ -0,0 +1,211 @@
1
+ import type { IncomingMessage, ServerResponse } from "http";
2
+ import type { EventBus } from "./eventbus.js";
3
+ import type { LoggerAction } from "../../core/dist/jackrabbit_types.js";
4
+
5
+ import * as fs from "fs";
6
+ import * as path from "path";
7
+ import { testHanger } from "./test_hangar.js";
8
+ import { ConfigInterface } from "./config.js";
9
+
10
+ let cwd = process.cwd();
11
+
12
+ // better done with URL? feels weird
13
+ let corePath = path.join(import.meta.url.substring(5), "../../../core/dist/");
14
+ let browserPath = path.join(
15
+ import.meta.url.substring(5),
16
+ "../../../browser/dist/",
17
+ );
18
+
19
+ const MIME_TYPES: Record<string, string> = {
20
+ octet: "application/octet-stream",
21
+ html: "text/html; charset=UTF-8",
22
+ js: "text/javascript",
23
+ json: "application/json",
24
+ css: "text/css",
25
+ png: "image/png",
26
+ jpg: "image/jpeg",
27
+ ico: "image/x-icon",
28
+ svg: "image/svg+xml",
29
+ };
30
+
31
+ export class Router {
32
+ #config: ConfigInterface;
33
+ #eventbus: EventBus;
34
+
35
+ constructor(config: ConfigInterface, eventbus: EventBus) {
36
+ this.#config = config;
37
+ this.#eventbus = eventbus;
38
+ }
39
+
40
+ get route() {
41
+ return this.#boundRoute;
42
+ }
43
+
44
+ #boundRoute = this.#route.bind(this);
45
+ async #route(req: IncomingMessage, res: ServerResponse) {
46
+ if (serveBadRequest(req, res)) return;
47
+ if (servePing(req, res)) return;
48
+ if (serveTestPage(req, res, this.#config)) return;
49
+ if (logAction(req, res, this.#eventbus)) return;
50
+
51
+ await serveFile(req, res);
52
+ }
53
+ }
54
+
55
+ function serveBadRequest(req: IncomingMessage, res: ServerResponse): boolean {
56
+ let { url } = req;
57
+ if (url) return false;
58
+
59
+ res.setHeader("Content-Type", "text/html");
60
+ res.writeHead(400);
61
+ res.end();
62
+
63
+ return true;
64
+ }
65
+
66
+ function servePing(req: IncomingMessage, res: ServerResponse): boolean {
67
+ let { url, method } = req;
68
+ if (url !== "/ping" || "GET" !== method) return false;
69
+
70
+ res.setHeader("Content-Type", "text/html");
71
+ res.writeHead(200);
72
+ res.end("The cookie train has arrived!");
73
+
74
+ return true;
75
+ }
76
+
77
+ function serveTestPage(
78
+ req: IncomingMessage,
79
+ res: ServerResponse,
80
+ config: ConfigInterface,
81
+ ): boolean {
82
+ let { url, method } = req;
83
+ if (url !== "/" || "GET" !== method) return false;
84
+
85
+ let hangar = testHanger({
86
+ jackrabbit_url: config.hostAndPort,
87
+ test_collections: process.argv.slice(3),
88
+ });
89
+
90
+ res.setHeader("Content-Type", "text/html");
91
+ res.writeHead(200);
92
+ res.end(hangar);
93
+
94
+ return true;
95
+ }
96
+
97
+ function logAction(
98
+ req: IncomingMessage,
99
+ res: ServerResponse,
100
+ eventbus: EventBus,
101
+ ): boolean {
102
+ let { url, method } = req;
103
+ if (!url?.startsWith("/log/") || "POST" !== method) return false;
104
+
105
+ let id: string | undefined;
106
+ let cookies = req.headers.cookie?.split(";") ?? [];
107
+ for (const cookieLine of cookies) {
108
+ if (cookieLine.startsWith("jackrabbit=")) {
109
+ let [_name, value] = cookieLine.split("=");
110
+ id = value;
111
+ }
112
+ }
113
+
114
+ if (id) {
115
+ getLoggerActionFromRequestBody(req)
116
+ .then(function (loggerAction: LoggerAction) {
117
+ eventbus.dispatchAction({
118
+ type: "log",
119
+ loggerAction,
120
+ id,
121
+ });
122
+ res.writeHead(201);
123
+ })
124
+ .catch(function () {
125
+ res.writeHead(401);
126
+ })
127
+ .finally(function () {
128
+ res.end();
129
+ });
130
+ } else {
131
+ res.writeHead(401);
132
+ res.end();
133
+ }
134
+
135
+ return true;
136
+ }
137
+
138
+ async function serveFile(req: IncomingMessage, res: ServerResponse) {
139
+ let { url, method } = req;
140
+
141
+ if (!url) {
142
+ res.setHeader("Content-Type", MIME_TYPES["html"]);
143
+ res.writeHead(400);
144
+ res.end();
145
+ return;
146
+ }
147
+
148
+ let ext = "";
149
+ if (url.endsWith("/")) ext = "index.html";
150
+ let urlNoPrefix = url;
151
+ if (url.startsWith("/jackrabbit")) urlNoPrefix = url.substring(11);
152
+ let filePath = path.join(cwd, urlNoPrefix, ext);
153
+
154
+ let stream: fs.ReadStream | undefined;
155
+ if (url.startsWith("/jackrabbit/core/") && "GET" === method) {
156
+ stream = await getDirectoryScopedFile(filePath, corePath);
157
+ }
158
+ if (url.startsWith("/jackrabbit/browser/") && "GET" === method) {
159
+ stream = await getDirectoryScopedFile(filePath, browserPath);
160
+ }
161
+
162
+ if (!url.startsWith("/jackrabbit") && "GET" === method) {
163
+ stream = await getDirectoryScopedFile(filePath, cwd);
164
+ }
165
+
166
+ if (stream) {
167
+ // throws errors if not a string
168
+ // filepath is always a string
169
+ const ext = path.extname(filePath).substring(1).toLowerCase();
170
+ let mimeType = MIME_TYPES[ext] ?? MIME_TYPES["octet"];
171
+ res.setHeader("Content-Type", mimeType);
172
+ res.writeHead(200);
173
+ stream.pipe(res);
174
+ } else {
175
+ res.setHeader("Content-Type", MIME_TYPES["html"]);
176
+ res.writeHead(404);
177
+ res.end();
178
+ }
179
+ }
180
+
181
+ function getLoggerActionFromRequestBody(
182
+ req: IncomingMessage,
183
+ ): Promise<LoggerAction> {
184
+ return new Promise(function (resolve, reject) {
185
+ let data: Uint8Array[] = [];
186
+ req.addListener("data", function (chunk) {
187
+ data.push(chunk);
188
+ });
189
+ req.addListener("end", function () {
190
+ let actionStr = Buffer.concat(data).toString();
191
+ let action = JSON.parse(actionStr) as LoggerAction;
192
+
193
+ resolve(action);
194
+ });
195
+ req.addListener("error", function (err: Error) {
196
+ reject(err);
197
+ });
198
+ });
199
+ }
200
+
201
+ async function getDirectoryScopedFile(
202
+ filePath: string,
203
+ basePath: string,
204
+ ): Promise<fs.ReadStream | undefined> {
205
+ if (!filePath.startsWith(basePath)) return;
206
+
207
+ try {
208
+ await fs.promises.access(filePath);
209
+ return fs.createReadStream(filePath);
210
+ } catch {}
211
+ }
@@ -0,0 +1,25 @@
1
+ interface TestHangerParams {
2
+ jackrabbit_url: URL;
3
+ test_collections: string[];
4
+ }
5
+
6
+ export function testHanger(params: TestHangerParams) {
7
+ return `<!DOCTYPE html>
8
+ <html>
9
+ <head>
10
+ <script type="jackrabbit_config">
11
+ ${JSON.stringify(params)}
12
+ </script>
13
+ <script type="importmap">
14
+ {
15
+ "imports": {
16
+ "jackrabbit/core/": "/jackrabbit/core/"
17
+ }
18
+ }
19
+ </script>
20
+ <script type="module" src="/jackrabbit/browser/dist/mod.js"></script>
21
+ </head>
22
+ <body></body>
23
+ </html>
24
+ `;
25
+ }
@@ -0,0 +1,372 @@
1
+ import type { ChildProcess } from "child_process";
2
+ import type { ConfigInterface, WebdriverParams } from "./config.js";
3
+ import type { EventBus } from "./eventbus.js";
4
+
5
+ import { exec } from "child_process";
6
+
7
+ let headers = new Headers([["Content-Type", "application/json"]]);
8
+
9
+ export class WebDrivers {
10
+ #config: ConfigInterface;
11
+ #eventbus: EventBus;
12
+ #webdrivers: WebdriverSession[] = [];
13
+ #currentIndex = 0;
14
+
15
+ constructor(config: ConfigInterface, eventbus: EventBus) {
16
+ this.#eventbus = eventbus;
17
+ this.#config = config;
18
+
19
+ for (const params of config.webdrivers) {
20
+ this.#webdrivers.push(
21
+ new WebdriverSession(params, config.hostAndPort, eventbus),
22
+ );
23
+ }
24
+ }
25
+
26
+ run() {
27
+ this.#eventbus.addListener("session_closed", (action) => {
28
+ if (action.id !== this.#config.webdrivers[this.#currentIndex]?.jrId)
29
+ return;
30
+
31
+ this.#currentIndex += 1;
32
+ let webdriver = this.#webdrivers[this.#currentIndex];
33
+ webdriver
34
+ ? webdriver.run()
35
+ : this.#eventbus.dispatchAction({
36
+ type: "end",
37
+ });
38
+ });
39
+
40
+ let webdriver = this.#webdrivers[this.#currentIndex];
41
+ webdriver
42
+ ? webdriver.run()
43
+ : this.#eventbus.dispatchAction({
44
+ type: "end",
45
+ });
46
+ }
47
+
48
+ runAll() {
49
+ this.#eventbus.addListener("session_closed", (action) => {
50
+ let { id } = action;
51
+ let [indexStr] = id.split(":");
52
+ let index = parseInt(indexStr);
53
+ if (this.#webdrivers[index]) {
54
+ if (id === this.#config.webdrivers[index]?.jrId)
55
+ this.#currentIndex += 1;
56
+ }
57
+
58
+ if (this.#currentIndex === this.#webdrivers.length) {
59
+ this.#eventbus.dispatchAction({
60
+ type: "end",
61
+ });
62
+ }
63
+ });
64
+
65
+ for (let webdriver of this.#webdrivers) {
66
+ webdriver.run();
67
+ }
68
+ }
69
+ }
70
+
71
+ class WebdriverSession {
72
+ #params: WebdriverParams;
73
+ #hostAndPort: URL;
74
+ #eventbus: EventBus;
75
+ #process: ChildProcess | undefined;
76
+ #signal: AbortSignal | undefined;
77
+ #abortController: AbortController;
78
+ #sessionId: string | undefined;
79
+
80
+ constructor(params: WebdriverParams, hostAndPort: URL, eventbus: EventBus) {
81
+ this.#params = params;
82
+ this.#hostAndPort = hostAndPort;
83
+ this.#eventbus = eventbus;
84
+ this.#abortController = new AbortController();
85
+
86
+ this.#eventbus.addListener("run_complete", (action) => {
87
+ if (action.id === this.#params.jrId) this.#down();
88
+ });
89
+ }
90
+
91
+ async run() {
92
+ if (this.#process) return;
93
+
94
+ let { jrId } = this.#params;
95
+
96
+ this.#eventbus.dispatchAction({
97
+ id: jrId,
98
+ type: "session_start",
99
+ });
100
+
101
+ this.#signal = setupSignal(
102
+ this.#params,
103
+ this.#eventbus,
104
+ this.#abortController.signal,
105
+ );
106
+ this.#process = setupProcess(
107
+ this.#params,
108
+ this.#eventbus,
109
+ this.#abortController.signal,
110
+ );
111
+
112
+ try {
113
+ await untilWebdriverReady(this.#params, this.#signal);
114
+ this.#sessionId = await getSession(this.#params, this.#signal);
115
+ await goToPing(
116
+ this.#params,
117
+ this.#signal,
118
+ this.#sessionId,
119
+ this.#hostAndPort,
120
+ );
121
+ await setCookie(this.#params, this.#signal, this.#sessionId);
122
+ await goToTestPage(
123
+ this.#params,
124
+ this.#signal,
125
+ this.#sessionId,
126
+ this.#hostAndPort,
127
+ );
128
+ } catch (e) {
129
+ let errOutput;
130
+ if (e instanceof Error) {
131
+ errOutput = e.name + "\n" + e.message + (e.cause ? "\n" + e.cause : "");
132
+ }
133
+ if (!errOutput) errOutput = e?.toString();
134
+
135
+ this.#eventbus.dispatchAction({
136
+ type: "session_error",
137
+ id: this.#params.jrId,
138
+ error: errOutput ?? "Unknown error creating browser session",
139
+ });
140
+ this.#abortController.abort();
141
+ }
142
+ }
143
+
144
+ async #down() {
145
+ if (!this.#process) return;
146
+ await deleteSession(
147
+ this.#params,
148
+ this.#signal,
149
+ this.#eventbus,
150
+ this.#sessionId,
151
+ );
152
+ this.#process.kill();
153
+ this.#process = undefined;
154
+ }
155
+ }
156
+
157
+ function setupSignal(
158
+ params: WebdriverParams,
159
+ eventbus: EventBus,
160
+ externalSignal: AbortSignal,
161
+ ): AbortSignal {
162
+ let { jrId, timeoutMs } = params;
163
+
164
+ let signal = AbortSignal.any([
165
+ externalSignal,
166
+ AbortSignal.timeout(timeoutMs),
167
+ ]);
168
+ signal.addEventListener("abort", function () {
169
+ eventbus.dispatchAction({
170
+ type: "session_closed",
171
+ id: jrId,
172
+ });
173
+ });
174
+
175
+ return signal;
176
+ }
177
+
178
+ function setupProcess(
179
+ params: WebdriverParams,
180
+ eventbus: EventBus,
181
+ externalSignal: AbortSignal,
182
+ ): ChildProcess {
183
+ let { command, jrId } = params;
184
+
185
+ let process = exec(
186
+ command,
187
+ { signal: externalSignal },
188
+ (error, _stdout, stderr) => {
189
+ if (stderr) {
190
+ eventbus.dispatchAction({
191
+ id: jrId,
192
+ type: "stderr",
193
+ output: stderr,
194
+ });
195
+ }
196
+ },
197
+ );
198
+ process.addListener("error", (error) => {
199
+ eventbus.dispatchAction({
200
+ id: jrId,
201
+ type: "session_error",
202
+ error: error.toString(),
203
+ });
204
+ });
205
+ process.addListener("exit", (statusCode) => {
206
+ if (statusCode) {
207
+ eventbus.dispatchAction({
208
+ type: "session_error",
209
+ id: jrId,
210
+ error: `Process returned status code: ${statusCode}`,
211
+ });
212
+ }
213
+ eventbus.dispatchAction({
214
+ type: "session_closed",
215
+ id: jrId,
216
+ });
217
+ });
218
+
219
+ return process;
220
+ }
221
+
222
+ async function untilWebdriverReady(
223
+ params: WebdriverParams,
224
+ signal: AbortSignal | undefined,
225
+ ): Promise<void> {
226
+ let { url } = params;
227
+
228
+ while (signal && !signal.aborted) {
229
+ try {
230
+ let res = await fetch(new URL("/status", url), {
231
+ method: "GET",
232
+ headers,
233
+ body: null,
234
+ signal,
235
+ });
236
+
237
+ if (200 === res.status) {
238
+ let json = await res.json();
239
+ let { ready } = json?.value;
240
+ if (typeof ready === "boolean" && ready) return;
241
+ }
242
+ } catch {}
243
+
244
+ await sleep(30);
245
+ }
246
+
247
+ throw new Error("Webdriver was never ready.");
248
+ }
249
+
250
+ async function getSession(params: WebdriverParams, signal: AbortSignal) {
251
+ let { url, capabilities } = params;
252
+
253
+ let res = await fetch(new URL("/session", url), {
254
+ method: "POST",
255
+ headers,
256
+ body: JSON.stringify({ capabilities: capabilities ?? {} }),
257
+ signal,
258
+ });
259
+ if (200 !== res.status) {
260
+ let cause = await res.text();
261
+ throw new Error("Failed to create a session", { cause });
262
+ }
263
+
264
+ let json = await res.json();
265
+ let { sessionId } = json?.value;
266
+ if (typeof sessionId !== "string") throw new Error("session is not a string");
267
+
268
+ return sessionId;
269
+ }
270
+
271
+ async function goToPing(
272
+ params: WebdriverParams,
273
+ signal: AbortSignal,
274
+ sessionId: string,
275
+ hostAndPort: URL,
276
+ ) {
277
+ let { url } = params;
278
+
279
+ let pingUrl = new URL("/ping", hostAndPort);
280
+ let getCookie = await fetch(new URL(`/session/${sessionId}/url`, url), {
281
+ method: "POST",
282
+ headers,
283
+ body: JSON.stringify({ url: pingUrl }),
284
+ signal,
285
+ });
286
+
287
+ if (200 !== getCookie.status) {
288
+ let cause = await getCookie.json();
289
+ throw new Error("go-to-cookie request failed", { cause });
290
+ }
291
+ }
292
+
293
+ async function setCookie(
294
+ params: WebdriverParams,
295
+ signal: AbortSignal,
296
+ sessionId: string,
297
+ ) {
298
+ let { url, jrId } = params;
299
+
300
+ let cookieReq = await fetch(new URL(`/session/${sessionId}/cookie`, url), {
301
+ method: "POST",
302
+ headers,
303
+ body: JSON.stringify({
304
+ cookie: {
305
+ name: "jackrabbit",
306
+ value: jrId,
307
+ // domain: this.#hostAndPort (issues in firefox)
308
+ path: "/",
309
+ httpOnly: true,
310
+ },
311
+ }),
312
+ signal,
313
+ });
314
+
315
+ if (200 !== cookieReq.status) {
316
+ let cause = await cookieReq.json();
317
+ throw new Error("set-cookie request failed", { cause });
318
+ }
319
+ }
320
+
321
+ async function goToTestPage(
322
+ params: WebdriverParams,
323
+ signal: AbortSignal,
324
+ sessionId: string,
325
+ hostAndPort: URL,
326
+ ) {
327
+ let { url } = params;
328
+
329
+ let goToUrlRes = await fetch(new URL(`/session/${sessionId}/url`, url), {
330
+ method: "POST",
331
+ headers,
332
+ body: JSON.stringify({ url: hostAndPort }),
333
+ signal,
334
+ });
335
+
336
+ if (200 !== goToUrlRes.status) throw new Error("go-to-url request failed");
337
+ }
338
+
339
+ async function deleteSession(
340
+ params: WebdriverParams,
341
+ signal: AbortSignal | undefined,
342
+ eventbus: EventBus,
343
+ sessionId: string | undefined,
344
+ ) {
345
+ let { url } = params;
346
+ try {
347
+ let delReqest = await fetch(new URL(`/session/${sessionId}`, url), {
348
+ method: "DELETE",
349
+ headers,
350
+ body: null,
351
+ signal: signal,
352
+ });
353
+ if (200 !== delReqest.status) {
354
+ let cause = await delReqest.json();
355
+ throw new Error("delete-cookie request failed", { cause });
356
+ }
357
+ } catch (e) {
358
+ eventbus.dispatchAction({
359
+ type: "session_error",
360
+ id: params.jrId,
361
+ error: e?.toString() ?? "failed to delete browser session error",
362
+ });
363
+ }
364
+ }
365
+
366
+ function sleep(timeMs: number): Promise<void> {
367
+ return new Promise(function (resolve) {
368
+ setTimeout(function () {
369
+ resolve();
370
+ }, timeMs);
371
+ });
372
+ }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "extends": "../tsconfig.json",
3
3
  "compilerOptions": {
4
+ "declaration": false,
4
5
  "rootDir": "./src",
5
6
  "outDir": "./dist"
6
7
  }
@@ -0,0 +1 @@
1
+ {"root":["./src/config.ts","./src/eventbus.ts","./src/logger.ts","./src/mod.ts","./src/results.ts","./src/results_str.ts","./src/routes.ts","./src/test_hangar.ts","./src/webdriver.ts"],"version":"5.9.3"}
package/cli/dist/cli.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import type { ConfigInterface, ImporterInterface } from "./cli_types.ts";
2
- import type { LoggerInterface } from "../../core/dist/mod.ts";
3
- export declare function run(config: ConfigInterface, importer: ImporterInterface, logger?: LoggerInterface): Promise<void>;
package/cli/dist/cli.js DELETED
@@ -1,8 +0,0 @@
1
- import { startRun } from "../../core/dist/mod.js";
2
- import { Logger } from "./logger.js";
3
- export async function run(config, importer, logger = new Logger()) {
4
- for (const file of config.files) {
5
- const testModules = await importer.load(file);
6
- await startRun(logger, testModules);
7
- }
8
- }
@@ -1,7 +0,0 @@
1
- import type { TestModule } from "../../core/dist/mod.ts";
2
- export interface ConfigInterface {
3
- files: string[];
4
- }
5
- export interface ImporterInterface {
6
- load(url: string): Promise<TestModule[]>;
7
- }
@@ -1,5 +0,0 @@
1
- import type { ConfigInterface } from "./cli_types.ts";
2
- export declare class Config implements ConfigInterface {
3
- files: string[];
4
- constructor(args: string[]);
5
- }
@@ -1,6 +0,0 @@
1
- export class Config {
2
- files = [];
3
- constructor(args) {
4
- this.files = args;
5
- }
6
- }
@@ -1,7 +0,0 @@
1
- import type { TestModule } from "../../core/dist/mod.ts";
2
- import type { ImporterInterface } from "./cli_types.ts";
3
- export declare class Importer implements ImporterInterface {
4
- #private;
5
- constructor(cwd: string);
6
- load(uri: string): Promise<TestModule[]>;
7
- }
@@ -1,16 +0,0 @@
1
- export class Importer {
2
- #cwd;
3
- constructor(cwd) {
4
- this.#cwd = cwd;
5
- }
6
- async load(uri) {
7
- let uri_updated = uri;
8
- let absolute = uri.startsWith("/");
9
- if (!absolute) {
10
- uri_updated = this.#cwd + "/" + uri;
11
- }
12
- const { testModules } = await import(uri_updated);
13
- // verify here
14
- return testModules;
15
- }
16
- }
@@ -1,7 +0,0 @@
1
- import type { LoggerAction, LoggerInterface, TestModule } from "../../core/dist/mod.js";
2
- export declare class Logger implements LoggerInterface {
3
- #private;
4
- get failed(): boolean;
5
- get cancelled(): boolean;
6
- log(testModules: TestModule[], action: LoggerAction): void;
7
- }