@jsenv/terminal-recorder 1.5.37 → 1.5.38

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/terminal-recorder",
3
- "version": "1.5.37",
3
+ "version": "1.5.38",
4
4
  "description": "Record terminal output as .svg, .gif, .webm, .mp4",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@jsenv/humanize": "1.7.6",
38
- "@jsenv/server": "16.4.0",
38
+ "@jsenv/server": "17.0.0",
39
39
  "@jsenv/terminal-text-size": "0.0.3",
40
40
  "@playwright/browser-chromium": "1.58.1",
41
41
  "ansi-regex": "6.2.2",
@@ -0,0 +1,133 @@
1
+ const css = /* css */ `
2
+ dialog {
3
+ opacity: 0;
4
+ transition: all 0.3s allow-discrete;
5
+ }
6
+ dialog::backdrop {
7
+ background-image: linear-gradient(
8
+ 45deg,
9
+ magenta,
10
+ rebeccapurple,
11
+ dodgerblue,
12
+ green
13
+ );
14
+ opacity: 0;
15
+ transition: all 0.3s allow-discrete;
16
+ }
17
+ dialog:open {
18
+ opacity: 1;
19
+ }
20
+ dialog:open::backdrop {
21
+ opacity: 0.75;
22
+ }
23
+ `;
24
+
25
+ const html = /* html */ `<style>
26
+ ${css}
27
+ </style>
28
+ <dialog>
29
+ <p>Connection with server is lost</p>
30
+ <button autofocus name="reconnect">Retry</button>
31
+ </dialog>`;
32
+
33
+ class JsenvAutoreloadOnServerRestart extends HTMLElement {
34
+ constructor({ url } = {}) {
35
+ super();
36
+ const root = this.attachShadow({ mode: "open" });
37
+ root.innerHTML = html;
38
+
39
+ const dialog = root.querySelector("dialog");
40
+ const reconnectButton = dialog.querySelector('button[name="reconnect"]');
41
+
42
+ (async () => {
43
+ const connect = () => {
44
+ const websocket = new WebSocket(url);
45
+ const connectedPromise = new Promise((resolve) => {
46
+ websocket.onerror = () => {
47
+ resolve(null);
48
+ };
49
+ websocket.onopen = () => {
50
+ resolve(websocket);
51
+ };
52
+ });
53
+ return connectedPromise;
54
+ };
55
+
56
+ const initialWebSocket = await connect();
57
+ if (!initialWebSocket) {
58
+ return;
59
+ }
60
+ initialWebSocket.onclose = async () => {
61
+ console.info("connection to server lost, trying to reconnect");
62
+ const retry = async () => {
63
+ let attemptCount = 0;
64
+ let timeToWait = 100;
65
+ const tryToReconnect = async () => {
66
+ const newWebsocket = await connect();
67
+ if (newWebsocket) {
68
+ dialog.close();
69
+ console.info("reconnected to server, reloading the page...");
70
+ window.location.reload(true);
71
+ return;
72
+ }
73
+ attemptCount++;
74
+ if (attemptCount === 10) {
75
+ dialog.showModal();
76
+ reconnectButton.onclick = async () => {
77
+ reconnectButton.disabled = true;
78
+ const previousContext = reconnectButton.textContent;
79
+ reconnectButton.textContent = "Retrying...";
80
+ await retry();
81
+ reconnectButton.textContent = previousContext;
82
+ reconnectButton.disabled = false;
83
+ };
84
+ return;
85
+ }
86
+ timeToWait += 100;
87
+ await new Promise((resolve) => setTimeout(resolve, timeToWait));
88
+ await tryToReconnect();
89
+ };
90
+ await tryToReconnect();
91
+ };
92
+ retry();
93
+ };
94
+ })();
95
+ }
96
+ }
97
+ if (!customElements.get("jsenv-autoreload-on-server-restart")) {
98
+ customElements.define(
99
+ "jsenv-autoreload-on-server-restart",
100
+ JsenvAutoreloadOnServerRestart,
101
+ );
102
+ }
103
+
104
+ const websocketEndpoint =
105
+ document.currentScript.getAttribute("data-ws-endpoint") ||
106
+ "/.internal/alive.websocket";
107
+
108
+ const jsenvAutoreloadOnServerRestartElement =
109
+ new JsenvAutoreloadOnServerRestart({
110
+ url: (() => {
111
+ const websocketScheme =
112
+ self.location.protocol === "https:" ? "wss" : "ws";
113
+ const websocketUrl = `${websocketScheme}://${self.location.host}${websocketEndpoint}`;
114
+ return websocketUrl;
115
+ })(),
116
+ });
117
+
118
+ // script is injected into document.body
119
+ if (document.body) {
120
+ document.currentScript.parentNode.replaceChild(
121
+ jsenvAutoreloadOnServerRestartElement,
122
+ document.currentScript,
123
+ );
124
+ }
125
+ // script injected outisde document.body (likely in head)
126
+ else {
127
+ document.currentScript.parentNode.removeChild(document.currentScript);
128
+ document.onreadystatechange = () => {
129
+ if (document.readyState === "interactive") {
130
+ document.body.appendChild(jsenvAutoreloadOnServerRestartElement);
131
+ }
132
+ };
133
+ }
@@ -1312,9 +1312,9 @@ window.__supervisor__ = (() => {
1312
1312
  console.log('window "error" event received', errorEvent);
1313
1313
  }
1314
1314
  const { error, message, filename, lineno, colno } = errorEvent;
1315
- if (error && error.__handled__) {
1315
+ if (error && error.__handled_by__) {
1316
1316
  if (logs) {
1317
- console.log("ignore error event because __handled__ is set");
1317
+ console.log("ignore error event because __handled_by__ is set");
1318
1318
  }
1319
1319
  return;
1320
1320
  }
@@ -1333,6 +1333,14 @@ window.__supervisor__ = (() => {
1333
1333
  if (event.defaultPrevented) {
1334
1334
  return;
1335
1335
  }
1336
+ if (event.reason && event.reason.__handled_by__) {
1337
+ if (logs) {
1338
+ console.log(
1339
+ "ignore unhandledrejection event because __handled_by__ is set",
1340
+ );
1341
+ }
1342
+ return;
1343
+ }
1336
1344
  const exception = supervisor.createException(event.reason, {
1337
1345
  reportedBy: "window_unhandledrejection_event",
1338
1346
  });
@@ -28,7 +28,7 @@
28
28
  ]
29
29
  });
30
30
  </script>
31
- <script src="/@fs/Users/dmail/Documents/dev/jsenv/core/packages/backend/server/src/services/autoreload_on_server_restart/client/autoreload_on_server_restart.js" jsenv-injected-by="jsenv:autoreload_on_server_restart" data-ws-endpoint="/.internal/events.websocket"></script>
31
+ <script src="/@fs/Users/dmail/Documents/dev/jsenv/core/packages/backend/server/src/plugins/autoreload_on_server_restart/client/autoreload_on_server_restart.js" jsenv-injected-by="jsenv:autoreload_on_server_restart" data-ws-endpoint="/.internal/events.websocket"></script>
32
32
  <script type="module" jsenv-injected-by="jsenv:drop_to_open" content-indented="">
33
33
  import { initDropToOpen } from "/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/drop_to_open/client/drop_to_open.js";
34
34