@proj-airi/server-sdk 0.7.0-beta.1 → 0.7.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 +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import WebSocket from "crossws/websocket";
|
|
2
2
|
|
|
3
|
-
//#region ../../node_modules/.pnpm/@moeru+std@0.1.0-beta.
|
|
3
|
+
//#region ../../node_modules/.pnpm/@moeru+std@0.1.0-beta.7/node_modules/@moeru/std/dist/sleep/index.js
|
|
4
4
|
const sleep = async (delay) => new Promise((resolve) => setTimeout(resolve, delay));
|
|
5
5
|
|
|
6
6
|
//#endregion
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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.
|
|
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.7/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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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proj-airi/server-sdk",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.7.
|
|
4
|
+
"version": "0.7.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",
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"crossws": "^0.4.1",
|
|
36
36
|
"defu": "^6.1.4",
|
|
37
|
-
"@proj-airi/server-shared": "^0.7.
|
|
37
|
+
"@proj-airi/server-shared": "^0.7.1"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@moeru/std": "0.1.0-beta.
|
|
40
|
+
"@moeru/std": "0.1.0-beta.7"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"dev": "pnpm run build",
|