@proj-airi/server-sdk 0.6.1 → 0.7.0-beta.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.
- package/dist/index.mjs +7 -10
- package/dist/index.mjs.map +1 -1
- package/dist/utils/node/index.mjs.map +1 -1
- package/package.json +7 -8
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import WebSocket from "crossws/websocket";
|
|
2
|
-
import { defu } from "defu";
|
|
3
2
|
|
|
4
|
-
//#region
|
|
5
|
-
|
|
6
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
7
|
-
}
|
|
3
|
+
//#region ../../node_modules/.pnpm/@moeru+std@0.1.0-beta.4/node_modules/@moeru/std/dist/sleep/index.js
|
|
4
|
+
const sleep = async (delay) => new Promise((resolve) => setTimeout(resolve, delay));
|
|
8
5
|
|
|
9
6
|
//#endregion
|
|
10
7
|
//#region src/client.ts
|
|
@@ -16,14 +13,15 @@ var Client = class {
|
|
|
16
13
|
reconnectAttempts = 0;
|
|
17
14
|
shouldClose = false;
|
|
18
15
|
constructor(options) {
|
|
19
|
-
this.opts =
|
|
16
|
+
this.opts = {
|
|
20
17
|
url: "ws://localhost:6121/ws",
|
|
21
18
|
possibleEvents: [],
|
|
22
19
|
onError: () => {},
|
|
23
20
|
onClose: () => {},
|
|
24
21
|
autoConnect: true,
|
|
25
|
-
autoReconnect: true
|
|
26
|
-
|
|
22
|
+
autoReconnect: true,
|
|
23
|
+
...options
|
|
24
|
+
};
|
|
27
25
|
if (this.opts.autoConnect) try {
|
|
28
26
|
this.connect();
|
|
29
27
|
} catch (err) {
|
|
@@ -40,7 +38,7 @@ var Client = class {
|
|
|
40
38
|
} catch (err) {
|
|
41
39
|
console.error("Encountered an error when retrying", err);
|
|
42
40
|
await sleep(2 ** attempts * 1e3);
|
|
43
|
-
await this.retryWithExponentialBackoff(fn, attempts
|
|
41
|
+
await this.retryWithExponentialBackoff(fn, attempts + 1, maxAttempts);
|
|
44
42
|
}
|
|
45
43
|
}
|
|
46
44
|
async tryReconnectWithExponentialBackoff() {
|
|
@@ -129,7 +127,6 @@ var Client = class {
|
|
|
129
127
|
const listeners = this.eventListeners.get(event);
|
|
130
128
|
if (!listeners) return;
|
|
131
129
|
listeners.push(callback);
|
|
132
|
-
this.eventListeners.set(event, listeners);
|
|
133
130
|
}
|
|
134
131
|
send(data) {
|
|
135
132
|
this.websocket?.send(JSON.stringify(data));
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["options: ClientOptions<C>","fn: () => void | Promise<void>","event: any","event: E","callback: (data: WebSocketBaseEvent<E, WebSocketEvents<C>[E]>) => void | Promise<void>","data: WebSocketEvent<C>","data: string | ArrayBufferLike | ArrayBufferView"],"sources":["../../../node_modules/.pnpm/@moeru+std@0.1.0-beta.4/node_modules/@moeru/std/dist/sleep/index.js","../src/client.ts"],"sourcesContent":["const sleep = async (delay) => new Promise((resolve) => setTimeout(resolve, delay));\n\nexport { sleep };\n","import type { WebSocketBaseEvent, WebSocketEvent, WebSocketEvents } from '@proj-airi/server-shared/types'\n\nimport WebSocket from 'crossws/websocket'\n\nimport { sleep } from '@moeru/std'\n\nexport interface ClientOptions<C = undefined> {\n url?: string\n name: string\n possibleEvents?: Array<(keyof WebSocketEvents<C>)>\n token?: string\n onError?: (error: unknown) => void\n onClose?: () => void\n autoConnect?: boolean\n autoReconnect?: boolean\n}\n\nexport class Client<C = undefined> {\n private connected = false\n private opts: Required<Omit<ClientOptions<C>, 'token'>> & Pick<ClientOptions<C>, 'token'>\n private websocket: WebSocket | undefined\n private eventListeners: Map<keyof WebSocketEvents<C>, Array<(data: WebSocketBaseEvent<any, any>) => void | Promise<void>>> = new Map()\n\n private reconnectAttempts = 0\n private shouldClose = false\n\n constructor(options: ClientOptions<C>) {\n this.opts = {\n url: 'ws://localhost:6121/ws',\n possibleEvents: [],\n onError: () => { },\n onClose: () => { },\n autoConnect: true,\n autoReconnect: true,\n ...options,\n }\n\n if (this.opts.autoConnect) {\n try {\n this.connect()\n }\n catch (err) {\n console.error(err)\n }\n }\n }\n\n async retryWithExponentialBackoff(fn: () => void | Promise<void>, attempts = 0, maxAttempts = -1) {\n if (maxAttempts !== -1 && attempts >= maxAttempts) {\n console.error(`Maximum retry attempts (${maxAttempts}) reached`)\n return\n }\n\n try {\n await fn()\n }\n catch (err) {\n console.error('Encountered an error when retrying', err)\n await sleep(2 ** attempts * 1000)\n await this.retryWithExponentialBackoff(fn, attempts + 1, maxAttempts)\n }\n }\n\n async tryReconnectWithExponentialBackoff() {\n await this.retryWithExponentialBackoff(() => this._connect(), this.reconnectAttempts)\n }\n\n private _connect() {\n return new Promise<void>((resolve, reject) => {\n if (this.shouldClose) {\n resolve()\n return\n }\n\n if (this.connected) {\n resolve()\n return\n }\n\n this.websocket = new WebSocket(this.opts.url)\n\n this.onEvent('module:authenticated', async (event) => {\n const auth = event.data.authenticated\n if (!auth) {\n this.retryWithExponentialBackoff(() => this.tryAuthenticate())\n }\n else {\n this.tryAnnounce()\n }\n })\n\n this.websocket.onerror = (event) => {\n this.opts.onError?.(event)\n\n if ('error' in event && event.error instanceof Error) {\n if (event.error.message === 'Received network error or non-101 status code.') {\n this.connected = false\n\n if (!this.opts.autoReconnect) {\n this.opts.onError?.(event)\n this.opts.onClose?.()\n reject(event.error)\n return\n }\n\n reject(event.error)\n }\n }\n }\n\n this.websocket.onclose = () => {\n this.opts.onClose?.()\n this.connected = false\n\n if (!this.opts.autoReconnect) {\n this.opts.onClose?.()\n }\n else {\n this.tryReconnectWithExponentialBackoff()\n }\n }\n\n this.websocket.onmessage = (event) => {\n this.handleMessage(event)\n }\n\n this.websocket.onopen = () => {\n this.reconnectAttempts = 0\n\n if (this.opts.token) {\n this.tryAuthenticate()\n }\n else {\n this.tryAnnounce()\n }\n\n this.connected = true\n\n resolve()\n }\n })\n }\n\n async connect() {\n await this.tryReconnectWithExponentialBackoff()\n }\n\n private tryAnnounce() {\n this.send({\n type: 'module:announce',\n data: {\n name: this.opts.name,\n possibleEvents: this.opts.possibleEvents,\n },\n })\n }\n\n private tryAuthenticate() {\n if (this.opts.token) {\n this.send({ type: 'module:authenticate', data: { token: this.opts.token || '' } })\n }\n }\n\n private async handleMessage(event: any) {\n try {\n const data = JSON.parse(event.data) as WebSocketEvent<C>\n const listeners = this.eventListeners.get(data.type)\n if (!listeners)\n return\n\n for (const listener of listeners)\n await listener(data)\n }\n catch (err) {\n console.error('Failed to parse message:', err)\n this.opts.onError?.(err)\n }\n }\n\n onEvent<E extends keyof WebSocketEvents<C>>(\n event: E,\n callback: (data: WebSocketBaseEvent<E, WebSocketEvents<C>[E]>) => void | Promise<void>,\n ): void {\n if (!this.eventListeners.get(event)) {\n this.eventListeners.set(event, [])\n }\n\n const listeners = this.eventListeners.get(event)\n if (!listeners) {\n return\n }\n\n listeners.push(callback as unknown as (data: WebSocketBaseEvent<E, WebSocketEvents<C>[E]>) => void | Promise<void>)\n }\n\n send(data: WebSocketEvent<C>): void {\n this.websocket?.send(JSON.stringify(data))\n }\n\n sendRaw(data: string | ArrayBufferLike | ArrayBufferView): void {\n this.websocket?.send(data)\n }\n\n close(): void {\n this.shouldClose = true\n\n if (this.connected && this.websocket) {\n this.websocket.close()\n this.connected = false\n }\n }\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/utils/node/process.ts"],"sourcesContent":["import process from 'node:process'\n\nlet running = true\n\nfunction killProcess() {\n running = false\n}\n\nprocess.on('SIGTERM', () => {\n killProcess()\n})\nprocess.on('SIGINT', () => {\n killProcess()\n})\nprocess.on('uncaughtException', (e) => {\n console.error(e)\n killProcess()\n})\n\nexport function runUntilSignal() {\n setTimeout(() => {\n if (running)\n runUntilSignal()\n }, 10)\n}\n"],"mappings":";;;AAEA,IAAI,UAAU;AAEd,SAAS,cAAc;
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/utils/node/process.ts"],"sourcesContent":["import process from 'node:process'\n\nlet running = true\n\nfunction killProcess() {\n running = false\n}\n\nprocess.on('SIGTERM', () => {\n killProcess()\n})\nprocess.on('SIGINT', () => {\n killProcess()\n})\nprocess.on('uncaughtException', (e) => {\n console.error(e)\n killProcess()\n})\n\nexport function runUntilSignal() {\n setTimeout(() => {\n if (running)\n runUntilSignal()\n }, 10)\n}\n"],"mappings":";;;AAEA,IAAI,UAAU;AAEd,SAAS,cAAc;CACrB,UAAU;AACX;AAED,QAAQ,GAAG,WAAW,MAAM;CAC1B,aAAa;AACd,EAAC;AACF,QAAQ,GAAG,UAAU,MAAM;CACzB,aAAa;AACd,EAAC;AACF,QAAQ,GAAG,qBAAqB,CAAC,MAAM;CACrC,QAAQ,MAAM,EAAE;CAChB,aAAa;AACd,EAAC;AAEF,SAAgB,iBAAiB;CAC/B,WAAW,MAAM;AACf,MAAI,SACF,gBAAgB;CACnB,GAAE,GAAG;AACP"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proj-airi/server-sdk",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.7.0-beta.1",
|
|
5
5
|
"description": "Client-side SDK implementation for connecting to AIRI server components and runtimes",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Moeru AI Project AIRI Team",
|
|
@@ -17,17 +17,14 @@
|
|
|
17
17
|
"exports": {
|
|
18
18
|
".": {
|
|
19
19
|
"types": "./dist/index.d.mts",
|
|
20
|
-
"
|
|
21
|
-
"require": "./dist/index.mjs"
|
|
20
|
+
"default": "./dist/index.mjs"
|
|
22
21
|
},
|
|
23
22
|
"./utils/node": {
|
|
24
23
|
"types": "./dist/utils/node/index.d.mts",
|
|
25
|
-
"
|
|
26
|
-
"require": "./dist/utils/node/index.mjs"
|
|
24
|
+
"default": "./dist/utils/node/index.mjs"
|
|
27
25
|
}
|
|
28
26
|
},
|
|
29
27
|
"main": "./dist/index.mjs",
|
|
30
|
-
"module": "./dist/index.mjs",
|
|
31
28
|
"types": "./dist/index.d.mts",
|
|
32
29
|
"files": [
|
|
33
30
|
"README.md",
|
|
@@ -37,11 +34,13 @@
|
|
|
37
34
|
"dependencies": {
|
|
38
35
|
"crossws": "^0.4.1",
|
|
39
36
|
"defu": "^6.1.4",
|
|
40
|
-
"@proj-airi/server-shared": "^0.
|
|
37
|
+
"@proj-airi/server-shared": "^0.7.0-beta.1"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@moeru/std": "0.1.0-beta.4"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"dev": "pnpm run build",
|
|
44
|
-
"stub": "pnpm run build",
|
|
45
44
|
"build": "tsdown",
|
|
46
45
|
"typecheck": "tsc --noEmit"
|
|
47
46
|
}
|