UNPKG

@needle-tools/engine

Version:

Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.

46 lines (38 loc) 1.61 kB
import type { INetworkTransport } from './engine_networking_types.js'; /** Default transport that wraps the `websocket-ts` library */ export class WebsocketTransport implements INetworkTransport { private _url: string; private _ws: import('websocket-ts').Websocket | undefined; onOpen: (() => void) | null = null; onClose: (() => void) | null = null; onError: ((err: any) => void) | null = null; onMessage: ((data: string | Blob) => void) | null = null; get url() { return this._ws?.url ?? this._url; } constructor(url: string) { this._url = url; } async start() { const pkg = await import('websocket-ts'); // @ts-ignore const WebsocketBuilder = pkg.default?.WebsocketBuilder ?? pkg.WebsocketBuilder; const ExponentialBackoff = pkg.default?.ExponentialBackoff ?? pkg.ExponentialBackoff; const ws = new WebsocketBuilder(this._url) .withMaxRetries(10) .withBackoff(new ExponentialBackoff(2000, 4)) .onOpen(() => { this._ws = ws; this.onOpen?.(); }) .onClose(() => { this.onClose?.(); }) .onError(() => { this.onError?.(new Error("Websocket connection failed")); }) .onRetry(() => { console.log("Retry connecting to networking websocket"); }) .build(); ws.addEventListener(pkg.WebsocketEvent.message, (_, msg) => { this.onMessage?.(msg.data); }); } send(data: string | Uint8Array) { this._ws?.send(data); } close() { this._ws?.close(); this._ws = undefined; } }