@proj-airi/server-sdk 0.1.2 → 0.1.4

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/dist/index.cjs CHANGED
@@ -7,19 +7,73 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
7
7
 
8
8
  const WebSocket__default = /*#__PURE__*/_interopDefaultCompat(WebSocket);
9
9
 
10
+ function sleep(ms) {
11
+ return new Promise((resolve) => setTimeout(resolve, ms));
12
+ }
13
+
10
14
  class Client {
15
+ opts;
11
16
  websocket;
17
+ eventListeners = /* @__PURE__ */ new Map();
18
+ authenticateAttempts = 0;
12
19
  constructor(options) {
13
- const opts = defu.defu(options, { url: "ws://localhost:6121/ws", possibleEvents: [] });
14
- this.websocket = new WebSocket__default(opts.url);
20
+ this.opts = defu.defu(
21
+ options,
22
+ { url: "ws://localhost:6121/ws", possibleEvents: [] }
23
+ );
24
+ this.websocket = new WebSocket__default(this.opts.url);
25
+ this.onEvent("module:authenticated", async (event) => {
26
+ const auth = event.data.authenticated;
27
+ if (!auth) {
28
+ this.authenticateAttempts++;
29
+ await sleep(2 ** this.authenticateAttempts * 1e3);
30
+ this.tryAuthenticate();
31
+ } else {
32
+ this.tryAnnounce();
33
+ }
34
+ });
35
+ this.websocket.onmessage = this.handleMessage.bind(this);
36
+ this.websocket.onopen = () => {
37
+ if (this.opts.token) {
38
+ this.tryAuthenticate();
39
+ } else {
40
+ this.tryAnnounce();
41
+ }
42
+ };
43
+ this.websocket.onclose = () => {
44
+ this.authenticateAttempts = 0;
45
+ };
46
+ }
47
+ tryAnnounce() {
15
48
  this.send({
16
49
  type: "module:announce",
17
50
  data: {
18
- name: opts.name,
19
- possibleEvents: opts.possibleEvents
51
+ name: this.opts.name,
52
+ possibleEvents: this.opts.possibleEvents
20
53
  }
21
54
  });
22
55
  }
56
+ tryAuthenticate() {
57
+ if (this.opts.token) {
58
+ this.send({ type: "module:authenticate", data: { token: this.opts.token || "" } });
59
+ }
60
+ }
61
+ async handleMessage(event) {
62
+ const data = JSON.parse(event.data);
63
+ const listeners = this.eventListeners.get(data.type);
64
+ if (!listeners)
65
+ return;
66
+ for (const listener of listeners)
67
+ await listener(data);
68
+ }
69
+ onEvent(event, callback) {
70
+ if (!this.eventListeners.get(event)) {
71
+ this.eventListeners.set(event, []);
72
+ }
73
+ const listeners = this.eventListeners.get(event);
74
+ listeners.push(callback);
75
+ this.eventListeners.set(event, listeners);
76
+ }
23
77
  send(data) {
24
78
  this.websocket.send(JSON.stringify(data));
25
79
  }
package/dist/index.d.cts CHANGED
@@ -1,14 +1,22 @@
1
- import { WebSocketEvents, WebSocketEvent } from '@proj-airi/server-shared/types';
1
+ import { WebSocketEvents, WebSocketBaseEvent, WebSocketEvent } from '@proj-airi/server-shared/types';
2
2
  import { Blob } from 'node:buffer';
3
3
 
4
4
  interface ClientOptions {
5
5
  url?: string;
6
6
  name: string;
7
7
  possibleEvents?: Array<(keyof WebSocketEvents)>;
8
+ token?: string;
8
9
  }
9
10
  declare class Client {
11
+ private opts;
10
12
  private websocket;
13
+ private eventListeners;
14
+ private authenticateAttempts;
11
15
  constructor(options: ClientOptions);
16
+ private tryAnnounce;
17
+ private tryAuthenticate;
18
+ private handleMessage;
19
+ onEvent<E extends keyof WebSocketEvents>(event: E, callback: (data: WebSocketBaseEvent<E, WebSocketEvents[E]>) => void | Promise<void>): void;
12
20
  send(data: WebSocketEvent): void;
13
21
  sendRaw(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
14
22
  }
package/dist/index.d.mts CHANGED
@@ -1,14 +1,22 @@
1
- import { WebSocketEvents, WebSocketEvent } from '@proj-airi/server-shared/types';
1
+ import { WebSocketEvents, WebSocketBaseEvent, WebSocketEvent } from '@proj-airi/server-shared/types';
2
2
  import { Blob } from 'node:buffer';
3
3
 
4
4
  interface ClientOptions {
5
5
  url?: string;
6
6
  name: string;
7
7
  possibleEvents?: Array<(keyof WebSocketEvents)>;
8
+ token?: string;
8
9
  }
9
10
  declare class Client {
11
+ private opts;
10
12
  private websocket;
13
+ private eventListeners;
14
+ private authenticateAttempts;
11
15
  constructor(options: ClientOptions);
16
+ private tryAnnounce;
17
+ private tryAuthenticate;
18
+ private handleMessage;
19
+ onEvent<E extends keyof WebSocketEvents>(event: E, callback: (data: WebSocketBaseEvent<E, WebSocketEvents[E]>) => void | Promise<void>): void;
12
20
  send(data: WebSocketEvent): void;
13
21
  sendRaw(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
14
22
  }
package/dist/index.d.ts CHANGED
@@ -1,14 +1,22 @@
1
- import { WebSocketEvents, WebSocketEvent } from '@proj-airi/server-shared/types';
1
+ import { WebSocketEvents, WebSocketBaseEvent, WebSocketEvent } from '@proj-airi/server-shared/types';
2
2
  import { Blob } from 'node:buffer';
3
3
 
4
4
  interface ClientOptions {
5
5
  url?: string;
6
6
  name: string;
7
7
  possibleEvents?: Array<(keyof WebSocketEvents)>;
8
+ token?: string;
8
9
  }
9
10
  declare class Client {
11
+ private opts;
10
12
  private websocket;
13
+ private eventListeners;
14
+ private authenticateAttempts;
11
15
  constructor(options: ClientOptions);
16
+ private tryAnnounce;
17
+ private tryAuthenticate;
18
+ private handleMessage;
19
+ onEvent<E extends keyof WebSocketEvents>(event: E, callback: (data: WebSocketBaseEvent<E, WebSocketEvents[E]>) => void | Promise<void>): void;
12
20
  send(data: WebSocketEvent): void;
13
21
  sendRaw(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
14
22
  }
package/dist/index.mjs CHANGED
@@ -1,19 +1,73 @@
1
1
  import WebSocket from 'crossws/websocket';
2
2
  import { defu } from 'defu';
3
3
 
4
+ function sleep(ms) {
5
+ return new Promise((resolve) => setTimeout(resolve, ms));
6
+ }
7
+
4
8
  class Client {
9
+ opts;
5
10
  websocket;
11
+ eventListeners = /* @__PURE__ */ new Map();
12
+ authenticateAttempts = 0;
6
13
  constructor(options) {
7
- const opts = defu(options, { url: "ws://localhost:6121/ws", possibleEvents: [] });
8
- this.websocket = new WebSocket(opts.url);
14
+ this.opts = defu(
15
+ options,
16
+ { url: "ws://localhost:6121/ws", possibleEvents: [] }
17
+ );
18
+ this.websocket = new WebSocket(this.opts.url);
19
+ this.onEvent("module:authenticated", async (event) => {
20
+ const auth = event.data.authenticated;
21
+ if (!auth) {
22
+ this.authenticateAttempts++;
23
+ await sleep(2 ** this.authenticateAttempts * 1e3);
24
+ this.tryAuthenticate();
25
+ } else {
26
+ this.tryAnnounce();
27
+ }
28
+ });
29
+ this.websocket.onmessage = this.handleMessage.bind(this);
30
+ this.websocket.onopen = () => {
31
+ if (this.opts.token) {
32
+ this.tryAuthenticate();
33
+ } else {
34
+ this.tryAnnounce();
35
+ }
36
+ };
37
+ this.websocket.onclose = () => {
38
+ this.authenticateAttempts = 0;
39
+ };
40
+ }
41
+ tryAnnounce() {
9
42
  this.send({
10
43
  type: "module:announce",
11
44
  data: {
12
- name: opts.name,
13
- possibleEvents: opts.possibleEvents
45
+ name: this.opts.name,
46
+ possibleEvents: this.opts.possibleEvents
14
47
  }
15
48
  });
16
49
  }
50
+ tryAuthenticate() {
51
+ if (this.opts.token) {
52
+ this.send({ type: "module:authenticate", data: { token: this.opts.token || "" } });
53
+ }
54
+ }
55
+ async handleMessage(event) {
56
+ const data = JSON.parse(event.data);
57
+ const listeners = this.eventListeners.get(data.type);
58
+ if (!listeners)
59
+ return;
60
+ for (const listener of listeners)
61
+ await listener(data);
62
+ }
63
+ onEvent(event, callback) {
64
+ if (!this.eventListeners.get(event)) {
65
+ this.eventListeners.set(event, []);
66
+ }
67
+ const listeners = this.eventListeners.get(event);
68
+ listeners.push(callback);
69
+ this.eventListeners.set(event, listeners);
70
+ }
17
71
  send(data) {
18
72
  this.websocket.send(JSON.stringify(data));
19
73
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@proj-airi/server-sdk",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "private": false,
6
6
  "description": "Client-side SDK implementation for connecting to Airi server components and runtimes",
7
7
  "author": {
@@ -33,7 +33,7 @@
33
33
  "dependencies": {
34
34
  "crossws": "^0.3.1",
35
35
  "defu": "^6.1.4",
36
- "@proj-airi/server-shared": "^0.1.2"
36
+ "@proj-airi/server-shared": "^0.1.4"
37
37
  },
38
38
  "scripts": {
39
39
  "dev": "pnpm run stub",