@fabriktor/client 0.0.44 → 0.0.45

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.
@@ -3,6 +3,7 @@ export type WSErrorHandler = (ev: Event) => void;
3
3
  export type WSCloseHandler = (ev: CloseEvent) => void;
4
4
  export type WSConnection = {
5
5
  socket: WebSocket;
6
+ opened: Promise<void>;
6
7
  close(code?: number, reason?: string): void;
7
8
  };
8
9
  export type OpenWSOptions<T> = {
@@ -7,11 +7,14 @@ import { HTTPScheme, HTTPSScheme } from "@fabriktor/schema";
7
7
  const protocolFirebase = "firebase";
8
8
  const schemeWS = "ws:";
9
9
  const schemeWSS = "wss:";
10
+ const msgWSOpenFailed = "WebSocket failed to open.";
11
+ const msgWSClosedBeforeOpen = "WebSocket closed before opening.";
10
12
  export function openWS(opts) {
11
13
  const socket = new WebSocket(wsURL(opts.base_url, opts.path), [
12
14
  protocolFirebase,
13
15
  opts.token,
14
16
  ]);
17
+ const opened = openedWS(socket);
15
18
  socket.addEventListener("message", (ev) => {
16
19
  if (typeof ev.data !== "string") {
17
20
  return;
@@ -26,11 +29,36 @@ export function openWS(opts) {
26
29
  }
27
30
  return {
28
31
  socket,
32
+ opened,
29
33
  close(code, reason) {
30
34
  socket.close(code, reason);
31
35
  },
32
36
  };
33
37
  }
38
+ function openedWS(socket) {
39
+ return new Promise((resolve, reject) => {
40
+ function cleanup() {
41
+ socket.removeEventListener("open", onOpen);
42
+ socket.removeEventListener("error", onError);
43
+ socket.removeEventListener("close", onClose);
44
+ }
45
+ function onOpen() {
46
+ cleanup();
47
+ resolve();
48
+ }
49
+ function onError() {
50
+ cleanup();
51
+ reject(new Error(msgWSOpenFailed));
52
+ }
53
+ function onClose() {
54
+ cleanup();
55
+ reject(new Error(msgWSClosedBeforeOpen));
56
+ }
57
+ socket.addEventListener("open", onOpen);
58
+ socket.addEventListener("error", onError);
59
+ socket.addEventListener("close", onClose);
60
+ });
61
+ }
34
62
  function wsURL(base, path) {
35
63
  const u = new URL(path.replace(/^\/+/g, ""), ensureSlash(base));
36
64
  if (u.protocol === protocolOf(HTTPSScheme)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabriktor/client",
3
- "version": "0.0.44",
3
+ "version": "0.0.45",
4
4
  "description": "![Fabriktor Logo](./img/fabriktor-character.gif)",
5
5
  "type": "module",
6
6
  "exports": {