@dobuki/hello-worker 1.0.84 → 1.0.86

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.js.map CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/browser/utils/ice-url-provider.ts", "../src/browser/signal/impl/signal-room.ts", "../src/browser/signal/signal-room.ts", "../src/browser/utils/rtc-config.ts", "../src/browser/webrtc-peer-collector.ts", "../src/browser/enter-world.ts", "../src/browser/web-components/sync-button.ts"],
3
+ "sources": ["../src/browser/utils/ice-url-provider.ts", "../src/browser/signal/impl/signal-room.ts", "../src/browser/signal/signal-room.ts", "../src/browser/utils/rtc-config.ts", "../src/browser/webrtc-peer-collector.ts", "../src/browser/enter-world.ts", "../node_modules/ts-md5/dist/index.es.js", "../src/browser/web-components/sync-button.ts"],
4
4
  "sourcesContent": [
5
5
  "export class IceUrlProvider {\n private sendToServerFunctions = new Array<(command: \"request-ice\") => void>();\n private icePromiseResolve?: (url: {\n url: string;\n expiration: number;\n }) => void;\n private icePromise?: Promise<{ url: string; expiration: number }>;\n\n receiveIce(url: string, expiration: number) {\n this.icePromiseResolve?.({ url, expiration });\n this.icePromiseResolve = undefined;\n this.icePromise = undefined;\n }\n\n addRequester(requester: (command: \"request-ice\") => void) {\n this.sendToServerFunctions.push(requester);\n return () => {\n this.removeRequester(requester);\n };\n }\n\n removeRequester(requester: (command: \"request-ice\") => void) {\n this.sendToServerFunctions.splice(\n this.sendToServerFunctions.indexOf(requester),\n 1,\n );\n }\n\n sendToServer(command: \"request-ice\") {\n this.sendToServerFunctions[\n Math.floor(this.sendToServerFunctions.length * Math.random())\n ](command);\n }\n\n async requestIce() {\n if (!this.icePromise) {\n this.icePromise = new Promise<{ url: string; expiration: number }>(\n (resolve) => {\n this.icePromiseResolve = resolve;\n this.sendToServer(\"request-ice\");\n },\n );\n }\n return await this.icePromise;\n }\n}\n",
6
- "export interface IPeer {\n userId: string;\n joined: number;\n}\n\ntype OutMessage = { type: string; to: string; payload: any };\n\n/**\n * enterRoom connects to the signaling room via WebSocket.\n */\nexport function enterRoom<T extends string, P = any>(params: {\n userId: string;\n worldId: string;\n room: string;\n host: string;\n onOpen?: () => void;\n onClose?: (ev: Pick<CloseEvent, \"code\" | \"reason\" | \"wasClean\">) => void;\n onError?: () => void;\n logLine?: (direction: string, obj?: any) => void;\n onPeerJoined(users: IPeer[], selfJoined: number): void;\n onPeerLeft(users: { userId: string }[]): void;\n onIceUrl?(url: string, expiration: number): void;\n onMessage(type: T, payload: P, from: string): void;\n autoRejoin?: boolean;\n}): {\n exitRoom: () => void;\n send: <P extends any>(\n type: T,\n userId: \"server\" | string,\n payload?: P,\n ) => void;\n} {\n type Message = {\n type: \"peer-joined\" | \"peer-left\" | \"ice-server\" | T;\n userId: string;\n users: { userId: string; joined: number }[];\n payload: P;\n url: string;\n expiration: number;\n };\n\n const { userId, worldId, room, host, autoRejoin = true, logLine } = params;\n\n let exited = false;\n let retryCount = 0;\n let ws: WebSocket;\n let timeoutId: ReturnType<typeof setTimeout>;\n let initialConnection = true;\n\n const peers = new Map<string, IPeer>();\n const wsUrl = `wss://${host}/room/${worldId}/${room}?userId=${encodeURIComponent(\n userId,\n )}`;\n\n // Helper for sending (uses the current ws instance)\n const accumulatedMessages: OutMessage[] = [];\n let timeout: ReturnType<typeof setTimeout> = 0;\n function send(type: string, to: \"server\" | string, payload?: any) {\n if (!ws) {\n logLine?.(\"👤 âžĄī¸ ❌\", \"no ws available\");\n return false;\n }\n const obj: OutMessage = { type, to, payload };\n accumulatedMessages.push(obj);\n logLine?.(\"👤 âžĄī¸ đŸ–Ĩī¸\", obj);\n clearTimeout(timeout);\n if (exited || ws.readyState !== WebSocket.OPEN) {\n logLine?.(\"👤 âžĄī¸ ❌\", \"Not in opened state: \" + ws.readyState);\n return false;\n }\n timeout = setTimeout(() => {\n ws.send(JSON.stringify(accumulatedMessages));\n accumulatedMessages.length = 0;\n });\n return true;\n }\n\n function connect() {\n if (exited) return;\n\n ws = new WebSocket(wsUrl);\n\n ws.onopen = () => {\n if (initialConnection) {\n params.onOpen?.();\n initialConnection = false;\n }\n retryCount = 0; // Reset backoff on successful connection\n };\n\n ws.onmessage = (e: MessageEvent) => {\n try {\n const result = JSON.parse(e.data);\n const msgs: Message[] = Array.isArray(result) ? result : [result];\n msgs.forEach((msg) => {\n logLine?.(\"đŸ–Ĩī¸ âžĄī¸ 👤\", msg);\n if (msg.type === \"peer-joined\" || msg.type === \"peer-left\") {\n updatePeers(msg.users, msg);\n } else if (msg.type === \"ice-server\") {\n params.onIceUrl?.(msg.url, msg.expiration);\n } else if (msg.userId) {\n params.onMessage(msg.type, msg.payload, msg.userId);\n }\n });\n } catch {\n logLine?.(\"âš ī¸ ERROR\", { error: \"invalid-json\" });\n }\n };\n\n ws.onclose = (ev: CloseEvent) => {\n // 1. Check if we should even try to reconnect\n const recoverableCodes = [1001, 1006, 1011, 1012, 1013];\n const isRecoverable = recoverableCodes.includes(ev.code);\n\n if (autoRejoin && !exited && isRecoverable) {\n // 2. Exponential Backoff: 1s, 2s, 4s, 8s... capped at 30s\n const backoff = Math.min(Math.pow(2, retryCount) * 1000, 15000);\n // 3. Add Jitter: +/- 1000ms randomness\n const jitter = Math.random() * 1000;\n const delay = backoff + jitter;\n\n logLine?.(\"🔄 RECONNECTING\", {\n attempt: retryCount + 1,\n delayMs: Math.round(delay),\n });\n\n retryCount++;\n timeoutId = setTimeout(connect, delay);\n } else {\n params.onClose?.({\n code: ev.code,\n reason: ev.reason,\n wasClean: ev.wasClean,\n });\n }\n };\n\n ws.onerror = (ev) => {\n console.error(\"WS Error\", ev);\n params.onError?.();\n };\n }\n\n // Helper for peer tracking (logic from your original code)\n function updatePeers(\n updatedUsers: { userId: string; joined: number }[],\n msg: Message,\n ) {\n const joined: IPeer[] = [];\n const left: { userId: string }[] = [];\n const updatedPeerSet = new Set<string>();\n\n const selfPeer = updatedUsers.filter((peer) => peer.userId === userId)[0];\n if (!selfPeer) {\n logLine?.(\"âš ī¸\", \"Cannot find self in updated users\");\n return;\n }\n const selfJoined = selfPeer.joined;\n\n updatedUsers.forEach(({ userId: pUserId, joined: joinedTime }) => {\n if (pUserId === userId) return;\n if (\n !peers.has(pUserId) ||\n (msg.type === \"peer-joined\" && pUserId === msg.userId)\n ) {\n const newPeer = {\n userId: pUserId,\n joined: joinedTime,\n };\n peers.set(pUserId, newPeer);\n joined.push(newPeer);\n }\n updatedPeerSet.add(pUserId);\n });\n\n for (const pUserId of peers.keys()) {\n if (\n !updatedPeerSet.has(pUserId) ||\n (msg.type === \"peer-left\" && pUserId === msg.userId)\n ) {\n peers.delete(pUserId);\n left.push({ userId: pUserId });\n }\n }\n\n // Notify peer joined first then peer left. (avoid disconnect in case the peer leaving / joining is on the same user).\n if (joined.length) params.onPeerJoined(joined, selfJoined);\n if (left.length) params.onPeerLeft(left);\n }\n\n // Start initial connection\n connect();\n\n return {\n send(type, userId, payload) {\n send(type, userId, payload);\n },\n exitRoom: () => {\n exited = true;\n clearTimeout(timeoutId);\n ws.close();\n },\n };\n}\n",
7
- "import type { IPeer } from \"./impl/signal-room.js\";\nimport { enterRoom as baseEnterRoom } from \"./impl/signal-room.js\";\nimport { RoomEvent, WorkerCommand } from \"./signal-room.worker.js\";\n\nexport function enterRoom<T extends string, P = any>({\n userId,\n worldId,\n room,\n host,\n autoRejoin = true,\n onOpen,\n onClose,\n onError,\n onPeerJoined,\n onPeerLeft,\n onIceUrl,\n onMessage,\n logLine,\n workerUrl,\n}: {\n userId: string;\n worldId: string;\n room: string;\n host: string;\n autoRejoin?: boolean;\n onOpen?: () => void;\n onClose?: (ev: Pick<CloseEvent, \"code\" | \"reason\" | \"wasClean\">) => void;\n onError?: () => void;\n onPeerJoined: (users: IPeer[], selfJoined: number) => void;\n onPeerLeft: (users: { userId: string }[]) => void;\n onIceUrl?(url: string, expiration: number): void;\n onMessage: (type: T, payload: P, from: string) => void;\n logLine?: (direction: string, obj?: any) => void;\n\n // Pass the URL to your worker file (bundler will handle it)\n workerUrl?: URL;\n}): {\n exitRoom: () => void;\n send: <P extends any>(\n type: T,\n userId: \"server\" | string,\n payload?: P,\n ) => void;\n} {\n if (!workerUrl) {\n const CDN_WORKER_URL = `https://cdn.jsdelivr.net/npm/@dobuki/hello-worker/dist/signal-room.worker.min.js`;\n\n console.warn(\n \"Warning: enterRoom called without workerUrl; this may cause issues in some environments. You should pass workerUrl explicitly. Use:\",\n CDN_WORKER_URL,\n );\n return baseEnterRoom<T, P>({\n userId,\n worldId,\n room,\n host,\n autoRejoin,\n onOpen,\n onClose,\n onError,\n onPeerJoined,\n onPeerLeft,\n onIceUrl,\n onMessage,\n });\n }\n const worker = new Worker(workerUrl, { type: \"module\" });\n let exited = false;\n\n const onWorkerMessage = (e: MessageEvent<RoomEvent<T, P>>) => {\n const ev = e.data;\n\n if (ev.kind === \"open\") onOpen?.();\n else if (ev.kind === \"close\") {\n worker.terminate();\n onClose?.(ev.ev);\n } else if (ev.kind === \"error\") onError?.();\n else if (ev.kind === \"peer-joined\")\n onPeerJoined(\n ev.users.map((ev) => ({ userId: ev.userId, joined: ev.joined })),\n ev.joined,\n );\n else if (ev.kind === \"peer-left\") onPeerLeft(ev.users);\n else if (ev.kind === \"ice-server\") onIceUrl?.(ev.url, ev.expiration);\n else if (ev.kind === \"message\")\n onMessage(ev.type, ev.payload, ev.fromUserId);\n else if (ev.kind === \"log\") logLine?.(ev.direction, ev.obj);\n };\n\n worker.addEventListener(\"message\", onWorkerMessage);\n\n worker.postMessage({\n cmd: \"enter\",\n userId,\n worldId,\n room,\n host,\n autoRejoin,\n } as WorkerCommand);\n\n return {\n exitRoom: () => {\n exited = true;\n worker.removeEventListener(\"message\", onWorkerMessage);\n worker.postMessage({ cmd: \"exit\" } as WorkerCommand);\n },\n send: (type, toUserId, payload) => {\n worker.postMessage({\n cmd: \"send\",\n toUserId,\n host,\n room,\n type,\n payload,\n } as WorkerCommand);\n },\n };\n}\n\nexport type EnterRoom<T extends string, P> = typeof enterRoom<T, P>;\n",
6
+ "export interface IPeer {\n userId: string;\n joined: number;\n}\n\ntype OutMessage = { type: string; to: string; payload: any };\n\n/**\n * enterRoom connects to the signaling room via WebSocket.\n */\nexport function enterRoom<T extends string, P = any>(params: {\n userId: string;\n worldId: string;\n room: string;\n protocol?: string;\n host: string;\n onOpen?: () => void;\n onClose?: (ev: Pick<CloseEvent, \"code\" | \"reason\" | \"wasClean\">) => void;\n onError?: () => void;\n logLine?: (direction: string, obj?: any) => void;\n onPeerJoined(users: IPeer[], selfJoined: number): void;\n onPeerLeft(users: { userId: string }[]): void;\n onIceUrl?(url: string, expiration: number): void;\n onMessage(type: T, payload: P, from: string): void;\n autoRejoin?: boolean;\n}): {\n exitRoom: () => void;\n send: <P extends any>(\n type: T,\n userId: \"server\" | string,\n payload?: P,\n ) => void;\n} {\n type Message = {\n type: \"peer-joined\" | \"peer-left\" | \"ice-server\" | T;\n userId: string;\n users: { userId: string; joined: number }[];\n payload: P;\n url: string;\n expiration: number;\n };\n\n const {\n userId,\n worldId,\n room,\n host,\n protocol,\n autoRejoin = true,\n logLine,\n } = params;\n\n let exited = false;\n let retryCount = 0;\n let ws: WebSocket;\n let timeoutId: ReturnType<typeof setTimeout>;\n let initialConnection = true;\n\n const peers = new Map<string, IPeer>();\n const wsUrl = `${protocol ?? \"wss\"}://${host}/room/${worldId}/${room}?userId=${encodeURIComponent(\n userId,\n )}`;\n\n // Helper for sending (uses the current ws instance)\n const accumulatedMessages: OutMessage[] = [];\n let timeout: ReturnType<typeof setTimeout> = 0;\n function send(type: string, to: \"server\" | string, payload?: any) {\n if (!ws) {\n logLine?.(\"👤 âžĄī¸ ❌\", \"no ws available\");\n return false;\n }\n const obj: OutMessage = { type, to, payload };\n accumulatedMessages.push(obj);\n logLine?.(\"👤 âžĄī¸ đŸ–Ĩī¸\", obj);\n clearTimeout(timeout);\n if (exited || ws.readyState !== WebSocket.OPEN) {\n logLine?.(\"👤 âžĄī¸ ❌\", \"Not in opened state: \" + ws.readyState);\n return false;\n }\n timeout = setTimeout(() => {\n ws.send(JSON.stringify(accumulatedMessages));\n accumulatedMessages.length = 0;\n });\n return true;\n }\n\n function connect() {\n if (exited) return;\n\n ws = new WebSocket(wsUrl);\n\n ws.onopen = () => {\n if (initialConnection) {\n params.onOpen?.();\n initialConnection = false;\n }\n retryCount = 0; // Reset backoff on successful connection\n };\n\n ws.onmessage = (e: MessageEvent) => {\n try {\n const result = JSON.parse(e.data);\n const msgs: Message[] = Array.isArray(result) ? result : [result];\n msgs.forEach((msg) => {\n logLine?.(\"đŸ–Ĩī¸ âžĄī¸ 👤\", msg);\n if (msg.type === \"peer-joined\" || msg.type === \"peer-left\") {\n updatePeers(msg.users, msg);\n } else if (msg.type === \"ice-server\") {\n params.onIceUrl?.(msg.url, msg.expiration);\n } else if (msg.userId) {\n params.onMessage(msg.type, msg.payload, msg.userId);\n }\n });\n } catch {\n logLine?.(\"âš ī¸ ERROR\", { error: \"invalid-json\" });\n }\n };\n\n ws.onclose = (ev: CloseEvent) => {\n // 1. Check if we should even try to reconnect\n const recoverableCodes = [1001, 1006, 1011, 1012, 1013];\n const isRecoverable = recoverableCodes.includes(ev.code);\n\n if (autoRejoin && !exited && isRecoverable) {\n // 2. Exponential Backoff: 1s, 2s, 4s, 8s... capped at 30s\n const backoff = Math.min(Math.pow(2, retryCount) * 1000, 15000);\n // 3. Add Jitter: +/- 1000ms randomness\n const jitter = Math.random() * 1000;\n const delay = backoff + jitter;\n\n logLine?.(\"🔄 RECONNECTING\", {\n attempt: retryCount + 1,\n delayMs: Math.round(delay),\n });\n\n retryCount++;\n timeoutId = setTimeout(connect, delay);\n } else {\n params.onClose?.({\n code: ev.code,\n reason: ev.reason,\n wasClean: ev.wasClean,\n });\n }\n };\n\n ws.onerror = (ev) => {\n console.error(\"WS Error\", ev);\n params.onError?.();\n };\n }\n\n // Helper for peer tracking (logic from your original code)\n function updatePeers(\n updatedUsers: { userId: string; joined: number }[],\n msg: Message,\n ) {\n const joined: IPeer[] = [];\n const left: { userId: string }[] = [];\n const updatedPeerSet = new Set<string>();\n\n const selfPeer = updatedUsers.filter((peer) => peer.userId === userId)[0];\n if (!selfPeer) {\n logLine?.(\"âš ī¸\", \"Cannot find self in updated users\");\n return;\n }\n const selfJoined = selfPeer.joined;\n\n updatedUsers.forEach(({ userId: pUserId, joined: joinedTime }) => {\n if (pUserId === userId) return;\n if (\n !peers.has(pUserId) ||\n (msg.type === \"peer-joined\" && pUserId === msg.userId)\n ) {\n const newPeer = {\n userId: pUserId,\n joined: joinedTime,\n };\n peers.set(pUserId, newPeer);\n joined.push(newPeer);\n }\n updatedPeerSet.add(pUserId);\n });\n\n for (const pUserId of peers.keys()) {\n if (\n !updatedPeerSet.has(pUserId) ||\n (msg.type === \"peer-left\" && pUserId === msg.userId)\n ) {\n peers.delete(pUserId);\n left.push({ userId: pUserId });\n }\n }\n\n // Notify peer joined first then peer left. (avoid disconnect in case the peer leaving / joining is on the same user).\n if (joined.length) params.onPeerJoined(joined, selfJoined);\n if (left.length) params.onPeerLeft(left);\n }\n\n // Start initial connection\n connect();\n\n return {\n send(type, userId, payload) {\n send(type, userId, payload);\n },\n exitRoom: () => {\n exited = true;\n clearTimeout(timeoutId);\n ws.close();\n },\n };\n}\n",
7
+ "import type { IPeer } from \"./impl/signal-room.js\";\nimport { enterRoom as baseEnterRoom } from \"./impl/signal-room.js\";\nimport { RoomEvent, WorkerCommand } from \"./signal-room.worker.js\";\n\nexport function enterRoom<T extends string, P = any>({\n userId,\n worldId,\n room,\n protocol = \"wss\",\n host,\n autoRejoin = true,\n onOpen,\n onClose,\n onError,\n onPeerJoined,\n onPeerLeft,\n onIceUrl,\n onMessage,\n logLine,\n workerUrl,\n}: {\n userId: string;\n worldId: string;\n room: string;\n protocol?: string;\n host: string;\n autoRejoin?: boolean;\n onOpen?: () => void;\n onClose?: (ev: Pick<CloseEvent, \"code\" | \"reason\" | \"wasClean\">) => void;\n onError?: () => void;\n onPeerJoined: (users: IPeer[], selfJoined: number) => void;\n onPeerLeft: (users: { userId: string }[]) => void;\n onIceUrl?(url: string, expiration: number): void;\n onMessage: (type: T, payload: P, from: string) => void;\n logLine?: (direction: string, obj?: any) => void;\n\n // Pass the URL to your worker file (bundler will handle it)\n workerUrl?: URL;\n}): {\n exitRoom: () => void;\n send: <P extends any>(\n type: T,\n userId: \"server\" | string,\n payload?: P,\n ) => void;\n} {\n if (!workerUrl) {\n const CDN_WORKER_URL = `https://cdn.jsdelivr.net/npm/@dobuki/hello-worker/dist/signal-room.worker.min.js`;\n\n console.warn(\n \"Warning: enterRoom called without workerUrl; this may cause issues in some environments. You should pass workerUrl explicitly. Use:\",\n CDN_WORKER_URL,\n );\n return baseEnterRoom<T, P>({\n userId,\n worldId,\n room,\n protocol,\n host,\n autoRejoin,\n onOpen,\n onClose,\n onError,\n onPeerJoined,\n onPeerLeft,\n onIceUrl,\n onMessage,\n });\n }\n\n let worker: Worker | undefined;\n const res = fetch(workerUrl).then(async (res) => {\n if (!res.ok) {\n throw new Error(`Failed to load worker script: ${res.status}`);\n }\n const source = await res.text();\n\n const blob = new Blob([source], { type: \"text/javascript\" });\n const blobUrl = URL.createObjectURL(blob);\n\n worker = new Worker(blobUrl, { type: \"module\" });\n\n worker.addEventListener(\"message\", onWorkerMessage);\n\n worker.postMessage({\n cmd: \"enter\",\n userId,\n worldId,\n room,\n protocol,\n host,\n autoRejoin,\n } as WorkerCommand);\n });\n let exited = false;\n\n const onWorkerMessage = (e: MessageEvent<RoomEvent<T, P>>) => {\n const ev = e.data;\n\n if (ev.kind === \"open\") onOpen?.();\n else if (ev.kind === \"close\") {\n worker?.terminate();\n onClose?.(ev.ev);\n } else if (ev.kind === \"error\") onError?.();\n else if (ev.kind === \"peer-joined\")\n onPeerJoined(\n ev.users.map((ev) => ({ userId: ev.userId, joined: ev.joined })),\n ev.joined,\n );\n else if (ev.kind === \"peer-left\") onPeerLeft(ev.users);\n else if (ev.kind === \"ice-server\") onIceUrl?.(ev.url, ev.expiration);\n else if (ev.kind === \"message\")\n onMessage(ev.type, ev.payload, ev.fromUserId);\n else if (ev.kind === \"log\") logLine?.(ev.direction, ev.obj);\n };\n\n return {\n exitRoom: () => {\n exited = true;\n worker?.removeEventListener(\"message\", onWorkerMessage);\n worker?.postMessage({ cmd: \"exit\" } as WorkerCommand);\n },\n send: (type, toUserId, payload) => {\n worker?.postMessage({\n cmd: \"send\",\n toUserId,\n host,\n room,\n type,\n payload,\n } as WorkerCommand);\n },\n };\n}\n\nexport type EnterRoom<T extends string, P> = typeof enterRoom<T, P>;\n",
8
8
  "import { IceUrlProvider } from \"./ice-url-provider\";\n\nconst FALLBACK_RTC_CONFIG = {\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n};\n\nexport class RTCConfigProvider {\n constructor(private iceUrlProvider: IceUrlProvider) {}\n\n private rtcConfig: RTCConfiguration & { timestamp: number } = {\n ...FALLBACK_RTC_CONFIG,\n timestamp: Date.now(),\n };\n private rtcConfigPromise?: Promise<RTCConfiguration & { timestamp: number }>;\n\n async getRtcConfig(): Promise<RTCConfiguration & { timestamp: number }> {\n const now = Date.now();\n if (now - (this.rtcConfig?.timestamp ?? 0) < 10000) {\n return this.rtcConfig;\n }\n\n if (!this.rtcConfigPromise) {\n this.rtcConfigPromise = new Promise<\n RTCConfiguration & { timestamp: number }\n >(async (resolve) => {\n let retries = 3;\n for (let r = 0; r < retries; r++) {\n try {\n const iceUrl = (await this.iceUrlProvider.requestIce()).url;\n const r = await fetch(iceUrl);\n if (!r.ok) throw new Error(`ICE endpoint failed: ${r.status}`);\n const rtcConfig = (await r.json()) as RTCConfiguration & {\n timestamp: number;\n };\n resolve(rtcConfig);\n return;\n } catch (e) {\n console.warn(\"Failed fetching iceUrl\");\n }\n }\n });\n this.rtcConfig = await this.rtcConfigPromise;\n this.rtcConfigPromise = undefined;\n }\n return this.rtcConfig;\n }\n}\n",
9
- "import { IceUrlProvider } from \"./utils/ice-url-provider\";\nimport { IPeer } from \"./signal/impl/signal-room\";\nimport { EnterRoom, enterRoom } from \"./signal/signal-room\";\nimport { RTCConfigProvider } from \"./utils/rtc-config\";\n\nexport type SigType = \"offer\" | \"answer\" | \"ice\" | \"request-ice\" | \"broadcast\";\nexport type SigPayload = {\n connectionId?: string;\n offer?: RTCSessionDescriptionInit;\n answer?: RTCSessionDescriptionInit;\n ice?: RTCIceCandidateInit;\n} & Record<string, any>;\n\ninterface Connection {\n id: string;\n peerConnectionId?: string;\n pc: RTCPeerConnection;\n // ICE that arrived before we had remoteDescription\n pendingRemoteIce: RTCIceCandidateInit[];\n}\n\ntype UserState = {\n connection?: Connection;\n\n // the signaling \"user\" handle so we can send messages\n peer: string;\n joined?: number;\n\n expirationTimeout?: number;\n close(): void;\n reset(): void;\n connectionPromise?: Promise<Connection>;\n};\n\nconst DEFAULT_ENTER_ROOM = enterRoom;\n\n/**\n * Collect peers\n */\nexport function collectPeerConnections({\n userId: passedUserId,\n worldId,\n receivePeerConnection,\n peerlessUserExpiration = 5000,\n enterRoomFunction: enterRoom = DEFAULT_ENTER_ROOM,\n logLine,\n onLeaveUser,\n workerUrl,\n onRoomReady,\n onRoomClose,\n onBroadcastMessage,\n}: {\n userId?: string;\n worldId: string;\n enterRoomFunction?: EnterRoom<SigType, SigPayload>;\n onLeaveUser?: (userId: string) => void;\n logLine?: (direction: string, obj?: any) => void;\n workerUrl?: URL;\n peerlessUserExpiration?: number;\n receivePeerConnection(connection: {\n pc: RTCPeerConnection;\n userId: string;\n restart?: () => void;\n }): void;\n onRoomReady?(info: { host: string; room: string }): void;\n onRoomClose?(info: {\n host: string;\n room: string;\n ev: Pick<CloseEvent, \"reason\" | \"code\" | \"wasClean\">;\n }): void;\n onBroadcastMessage?<P extends any>(payload: P, from: string): void;\n}) {\n const userId = passedUserId ?? `user-${crypto.randomUUID()}`;\n const users: Map<string, UserState> = new Map();\n\n const roomsEntered = new Map<\n string,\n {\n room: string;\n host: string;\n exitRoom: () => void;\n broadcast: <P extends any>(payload: P) => void;\n }\n >();\n\n function leaveUser(userId: string) {\n onLeaveUser?.(userId);\n const p = users.get(userId);\n if (!p) return;\n users.delete(userId);\n try {\n p.close();\n } catch {}\n }\n\n async function flushRemoteIce(state: UserState) {\n if (!state.connection?.pc?.remoteDescription) return;\n\n const queued = state.connection.pendingRemoteIce;\n state.connection.pendingRemoteIce = [];\n\n for (const ice of queued) {\n try {\n await state.connection.pc.addIceCandidate(ice);\n } catch (e) {\n logLine?.(\"âš ī¸ ERROR\", {\n error: \"add-ice-failed\",\n userId: state.peer,\n detail: String(e),\n });\n }\n }\n }\n\n const iceUrlProvider = new IceUrlProvider();\n const rtcConfigProvider = new RTCConfigProvider(iceUrlProvider);\n\n function exit({ room, host }: { room: string; host: string }) {\n const key = `${host}/room/${room}`;\n const session = roomsEntered.get(key);\n if (session) {\n session.exitRoom();\n roomsEntered.delete(key);\n }\n }\n\n function enter({ room, host }: { room: string; host: string }) {\n return new Promise<void>(async (resolve, reject) => {\n async function setupConnection(state: UserState) {\n if (state.connectionPromise) {\n return state.connectionPromise;\n }\n const promise = new Promise<Connection>(async (resolve) => {\n state.connection = {\n id: `conn-${crypto.randomUUID()}`,\n pc: new RTCPeerConnection(await rtcConfigProvider.getRtcConfig()),\n pendingRemoteIce: [],\n };\n\n // Send local ICE candidates to this peer\n state.connection.pc.onicecandidate = (ev) => {\n if (!ev.candidate) return;\n send(\"ice\", state.peer, {\n connectionId: state.connection?.id,\n ice: ev.candidate.toJSON(),\n });\n };\n\n state.connection.pc.onconnectionstatechange = async () => {\n logLine?.(\"đŸ’Ŧ\", {\n event: \"pc-state\",\n userId: state.peer,\n state: state.connection?.pc?.connectionState,\n });\n if (state.connection?.pc?.connectionState === \"failed\") {\n // reset the connection\n state.close();\n const userState = await getPeer(state.peer, true);\n if (userState.connection?.pc) {\n receivePeerConnection({\n pc: userState.connection?.pc,\n userId: userState.peer,\n restart: () => userState.close(),\n });\n } else {\n logLine?.(\"đŸ‘¤â„šī¸\", \"no pc: \" + userState.peer);\n }\n return;\n }\n };\n\n resolve(state.connection);\n });\n state.connectionPromise = promise;\n await promise;\n state.connectionPromise = undefined;\n return promise;\n }\n\n async function getPeer(\n peer: string,\n forceReset?: boolean,\n ): Promise<UserState> {\n let state = users.get(peer);\n if (!state || forceReset) {\n const newState: UserState = {\n peer,\n close() {\n if (this.connection) {\n this.connection.pc.close();\n this.connection = undefined;\n }\n users.delete(peer);\n },\n async reset() {\n newState.close();\n\n setTimeout(async () => {\n const userState = await getPeer(peer, true);\n if (!userState.connection?.pc) {\n logLine?.(\"âš ī¸\", \"no pc\");\n return;\n }\n receivePeerConnection({\n pc: userState.connection?.pc,\n userId: userState.peer,\n restart: () => userState.close(),\n });\n await makeOffer(userState.peer);\n }, 500);\n },\n };\n state = newState;\n\n await setupConnection(newState);\n\n // New user\n users.set(state.peer, state);\n } else if (state) {\n clearTimeout(state.expirationTimeout);\n state.expirationTimeout = 0;\n if (\n !state.connection?.pc ||\n state.connection?.pc.signalingState === \"closed\"\n ) {\n await setupConnection(state);\n }\n }\n state.peer = peer;\n return state;\n }\n\n async function makeOffer(userId: string) {\n // Offer flow: createOffer -> setLocalDescription -> send localDescription\n const state = await getPeer(userId);\n const pc = state.connection?.pc;\n const offer = await pc?.createOffer();\n await pc?.setLocalDescription(offer);\n send(\"offer\", userId, {\n connectionId: state.connection?.id,\n offer: pc?.localDescription?.toJSON(),\n });\n }\n\n const { exitRoom, send } = enterRoom({\n userId,\n worldId,\n room,\n host,\n logLine,\n workerUrl,\n autoRejoin: true,\n\n onOpen() {\n onRoomReady?.({ room, host });\n resolve();\n },\n onError() {\n console.error(\"onError\");\n reject();\n },\n onClose(ev: Pick<CloseEvent, \"reason\" | \"code\" | \"wasClean\">) {\n onRoomClose?.({ room, host, ev });\n },\n\n // Existing peers initiate to the newcomer\n onPeerJoined(joiningUsers: IPeer[], selfJoined: number) {\n joiningUsers.forEach(async (user) => {\n const state = await getPeer(user.userId, true);\n state.joined = user.joined;\n const pc = state.connection?.pc;\n if (!pc) {\n logLine?.(\"đŸ‘¤â„šī¸\", \"no pc: \" + user.userId);\n return;\n }\n\n receivePeerConnection({\n pc,\n userId: user.userId,\n restart: () => state.close(),\n });\n if (\n user.joined > selfJoined ||\n (user.joined === selfJoined &&\n user.userId.localeCompare(userId) > 0)\n ) {\n await makeOffer(user.userId);\n }\n });\n },\n\n onPeerLeft(leavingUsers: { userId: string }[]) {\n leavingUsers.forEach(({ userId }) => {\n const state = users.get(userId);\n if (!state) return;\n state.expirationTimeout = setTimeout(\n () => leaveUser(userId),\n peerlessUserExpiration ?? 0,\n );\n });\n },\n\n onIceUrl(url: string, expiration: number) {\n iceUrlProvider.receiveIce(url, expiration);\n },\n\n async onMessage(type, payload, from: string) {\n if (type === \"offer\" && payload.offer) {\n // Grab state and connection\n const state = await getPeer(from, false);\n const connection =\n !state.connection ||\n state.connection.pc.signalingState === \"stable\"\n ? await setupConnection(state)\n : state.connection; // reset\n logLine?.(\"đŸ’Ŧ\", {\n type,\n signalingState: connection.pc.signalingState,\n });\n\n connection.peerConnectionId = payload.connectionId;\n receivePeerConnection({\n pc: connection.pc,\n userId: from,\n restart: () => state.close(),\n });\n // Responder: set remote offer\n await connection.pc.setRemoteDescription(payload.offer);\n\n // Create and send answer\n const answer = await connection.pc.createAnswer();\n await connection.pc.setLocalDescription(answer);\n\n send(\"answer\", from, {\n connectionId: connection.id,\n answer: connection.pc.localDescription?.toJSON(),\n });\n\n // Now safe to apply any queued ICE from this peer\n await flushRemoteIce(state);\n return;\n }\n\n if (type === \"answer\" && payload.answer) {\n const state = await getPeer(from, false);\n const connection =\n state.connection &&\n state.connection.pc.signalingState !== \"closed\"\n ? state.connection\n : await setupConnection(state);\n logLine?.(\"đŸ’Ŧ\", {\n type,\n signalingState: connection.pc.signalingState,\n });\n\n // Initiator: set remote answer\n await connection.pc.setRemoteDescription(payload.answer);\n connection.peerConnectionId = payload.connectionId;\n await flushRemoteIce(state);\n return;\n }\n\n if (type === \"ice\" && payload.ice) {\n // Grab state and connection\n const state = await getPeer(from, false);\n const connection =\n state.connection ?? (await state.connectionPromise);\n if (!connection) {\n logLine?.(\"âš ī¸\", \"No connection\");\n return;\n }\n logLine?.(\"đŸ’Ŧ\", {\n type,\n signalingState: connection.pc.signalingState,\n });\n\n if (\n connection.peerConnectionId &&\n payload.connectionId !== connection.peerConnectionId\n ) {\n logLine?.(\n \"âš ī¸\",\n \"Mismatch peerConnectionID\" +\n payload.connectionId +\n \"vs\" +\n connection.peerConnectionId,\n );\n return;\n }\n\n // If we don't have remoteDescription yet (or if connectionId doesn't match), queue it\n if (\n !connection.pc.remoteDescription ||\n !connection.peerConnectionId\n ) {\n connection.peerConnectionId = payload.connectionId;\n connection.pendingRemoteIce.push(payload.ice);\n return;\n }\n\n try {\n await connection.pc.addIceCandidate(payload.ice);\n } catch (e) {\n logLine?.(\"âš ī¸ ERROR\", {\n error: \"add-ice-failed\",\n userId: state.peer,\n detail: String(e),\n });\n }\n return;\n }\n\n if (type === \"broadcast\") {\n onBroadcastMessage?.(payload, from);\n }\n },\n });\n\n const removeRequester = iceUrlProvider.addRequester((command) =>\n send(command, \"server\"),\n );\n\n roomsEntered.set(`${host}/room/${room}`, {\n exitRoom: () => {\n exitRoom();\n removeRequester();\n },\n room,\n host,\n broadcast: (payload) => send(\"broadcast\", \"server\", payload),\n });\n });\n }\n\n return {\n userId,\n enterRoom: enter,\n exitRoom: exit,\n leaveUser,\n async reset(userId: string) {\n const userState = users.get(userId);\n userState?.reset();\n },\n broadcast<P extends any>(payload: P) {\n roomsEntered.forEach((room) => room.broadcast(payload));\n },\n end() {\n roomsEntered.forEach(({ exitRoom }) => exitRoom());\n roomsEntered.clear();\n users.forEach(({ peer }) => leaveUser(peer));\n users.clear();\n },\n };\n}\n\n/*\nTurn Token ID\n<CF_TURN_TOKEN_ID>\n\nAPI Token\n<CF_RTC_API_TOKEN>\n\nCURL\ncurl \\\n\t-H \"Authorization: Bearer <CF_RTC_API_TOKEN>\" \\\n\t-H \"Content-Type: application/json\" -d '{\"ttl\": 86400}' \\\n\thttps://rtc.live.cloudflare.com/v1/turn/keys/<CF_TURN_TOKEN_ID>/credentials/generate-ice-servers\n\nJSON\n{\n\t\"iceServers\": [\n {\n \"urls\": [\n \"stun:stun.cloudflare.com:3478\",\n \"turn:turn.cloudflare.com:3478?transport=udp\",\n \"turn:turn.cloudflare.com:3478?transport=tcp\",\n \"turns:turn.cloudflare.com:5349?transport=tcp\"\n ],\n \"username\": \"xxxx\",\n \"credential\": \"yyyy\",\n }\n ]\n}\n\n*/\n",
9
+ "import { IceUrlProvider } from \"./utils/ice-url-provider\";\nimport { IPeer } from \"./signal/impl/signal-room\";\nimport { EnterRoom, enterRoom } from \"./signal/signal-room\";\nimport { RTCConfigProvider } from \"./utils/rtc-config\";\n\nexport type SigType = \"offer\" | \"answer\" | \"ice\" | \"request-ice\" | \"broadcast\";\nexport type SigPayload = {\n connectionId?: string;\n offer?: RTCSessionDescriptionInit;\n answer?: RTCSessionDescriptionInit;\n ice?: RTCIceCandidateInit;\n} & Record<string, any>;\n\ninterface Connection {\n id: string;\n peerConnectionId?: string;\n pc: RTCPeerConnection;\n // ICE that arrived before we had remoteDescription\n pendingRemoteIce: RTCIceCandidateInit[];\n}\n\ntype UserState = {\n connection?: Connection;\n\n // the signaling \"user\" handle so we can send messages\n peer: string;\n joined?: number;\n\n expirationTimeout?: number;\n close(): void;\n reset(): void;\n connectionPromise?: Promise<Connection>;\n};\n\nconst DEFAULT_ENTER_ROOM = enterRoom;\n\n/**\n * Collect peers\n */\nexport function collectPeerConnections({\n userId: passedUserId,\n worldId,\n receivePeerConnection,\n peerlessUserExpiration = 5000,\n enterRoomFunction: enterRoom = DEFAULT_ENTER_ROOM,\n logLine,\n onLeaveUser,\n workerUrl,\n onRoomReady,\n onRoomClose,\n onBroadcastMessage,\n}: {\n userId?: string;\n worldId: string;\n enterRoomFunction?: EnterRoom<SigType, SigPayload>;\n onLeaveUser?: (userId: string) => void;\n logLine?: (direction: string, obj?: any) => void;\n workerUrl?: URL;\n peerlessUserExpiration?: number;\n receivePeerConnection(connection: {\n pc: RTCPeerConnection;\n userId: string;\n restart?: () => void;\n }): void;\n onRoomReady?(info: { host: string; room: string }): void;\n onRoomClose?(info: {\n host: string;\n room: string;\n ev: Pick<CloseEvent, \"reason\" | \"code\" | \"wasClean\">;\n }): void;\n onBroadcastMessage?<P extends any>(payload: P, from: string): void;\n}) {\n const userId = passedUserId ?? `user-${crypto.randomUUID()}`;\n const users: Map<string, UserState> = new Map();\n\n const roomsEntered = new Map<\n string,\n {\n room: string;\n host: string;\n exitRoom: () => void;\n broadcast: <P extends any>(payload: P) => void;\n }\n >();\n\n function leaveUser(userId: string) {\n onLeaveUser?.(userId);\n const p = users.get(userId);\n if (!p) return;\n users.delete(userId);\n try {\n p.close();\n } catch {}\n }\n\n async function flushRemoteIce(state: UserState) {\n if (!state.connection?.pc?.remoteDescription) return;\n\n const queued = state.connection.pendingRemoteIce;\n state.connection.pendingRemoteIce = [];\n\n for (const ice of queued) {\n try {\n await state.connection.pc.addIceCandidate(ice);\n } catch (e) {\n logLine?.(\"âš ī¸ ERROR\", {\n error: \"add-ice-failed\",\n userId: state.peer,\n detail: String(e),\n });\n }\n }\n }\n\n const iceUrlProvider = new IceUrlProvider();\n const rtcConfigProvider = new RTCConfigProvider(iceUrlProvider);\n\n function exit({ room, host }: { room: string; host: string }) {\n const key = `${host}/room/${room}`;\n const session = roomsEntered.get(key);\n if (session) {\n session.exitRoom();\n roomsEntered.delete(key);\n }\n }\n\n function enter({\n room,\n host,\n protocol,\n }: {\n room: string;\n host: string;\n protocol?: string;\n }) {\n return new Promise<void>(async (resolve, reject) => {\n async function setupConnection(state: UserState) {\n if (state.connectionPromise) {\n return state.connectionPromise;\n }\n const promise = new Promise<Connection>(async (resolve) => {\n state.connection = {\n id: `conn-${crypto.randomUUID()}`,\n pc: new RTCPeerConnection(await rtcConfigProvider.getRtcConfig()),\n pendingRemoteIce: [],\n };\n\n // Send local ICE candidates to this peer\n state.connection.pc.onicecandidate = (ev) => {\n if (!ev.candidate) return;\n send(\"ice\", state.peer, {\n connectionId: state.connection?.id,\n ice: ev.candidate.toJSON(),\n });\n };\n\n state.connection.pc.onconnectionstatechange = async () => {\n logLine?.(\"đŸ’Ŧ\", {\n event: \"pc-state\",\n userId: state.peer,\n state: state.connection?.pc?.connectionState,\n });\n if (state.connection?.pc?.connectionState === \"failed\") {\n // reset the connection\n state.close();\n const userState = await getPeer(state.peer, true);\n if (userState.connection?.pc) {\n receivePeerConnection({\n pc: userState.connection?.pc,\n userId: userState.peer,\n restart: () => userState.close(),\n });\n } else {\n logLine?.(\"đŸ‘¤â„šī¸\", \"no pc: \" + userState.peer);\n }\n return;\n }\n };\n\n resolve(state.connection);\n });\n state.connectionPromise = promise;\n await promise;\n state.connectionPromise = undefined;\n return promise;\n }\n\n async function getPeer(\n peer: string,\n forceReset?: boolean,\n ): Promise<UserState> {\n let state = users.get(peer);\n if (!state || forceReset) {\n const newState: UserState = {\n peer,\n close() {\n if (this.connection) {\n this.connection.pc.close();\n this.connection = undefined;\n }\n users.delete(peer);\n },\n async reset() {\n newState.close();\n\n setTimeout(async () => {\n const userState = await getPeer(peer, true);\n if (!userState.connection?.pc) {\n logLine?.(\"âš ī¸\", \"no pc\");\n return;\n }\n receivePeerConnection({\n pc: userState.connection?.pc,\n userId: userState.peer,\n restart: () => userState.close(),\n });\n await makeOffer(userState.peer);\n }, 500);\n },\n };\n state = newState;\n\n await setupConnection(newState);\n\n // New user\n users.set(state.peer, state);\n } else if (state) {\n clearTimeout(state.expirationTimeout);\n state.expirationTimeout = 0;\n if (\n !state.connection?.pc ||\n state.connection?.pc.signalingState === \"closed\"\n ) {\n await setupConnection(state);\n }\n }\n state.peer = peer;\n return state;\n }\n\n async function makeOffer(userId: string) {\n // Offer flow: createOffer -> setLocalDescription -> send localDescription\n const state = await getPeer(userId);\n const pc = state.connection?.pc;\n const offer = await pc?.createOffer();\n await pc?.setLocalDescription(offer);\n send(\"offer\", userId, {\n connectionId: state.connection?.id,\n offer: pc?.localDescription?.toJSON(),\n });\n }\n\n const { exitRoom, send } = enterRoom({\n userId,\n worldId,\n room,\n protocol,\n host,\n logLine,\n workerUrl,\n autoRejoin: true,\n\n onOpen() {\n onRoomReady?.({ room, host });\n resolve();\n },\n onError() {\n console.error(\"onError\");\n reject();\n },\n onClose(ev: Pick<CloseEvent, \"reason\" | \"code\" | \"wasClean\">) {\n onRoomClose?.({ room, host, ev });\n },\n\n // Existing peers initiate to the newcomer\n onPeerJoined(joiningUsers: IPeer[], selfJoined: number) {\n joiningUsers.forEach(async (user) => {\n const state = await getPeer(user.userId, true);\n state.joined = user.joined;\n const pc = state.connection?.pc;\n if (!pc) {\n logLine?.(\"đŸ‘¤â„šī¸\", \"no pc: \" + user.userId);\n return;\n }\n\n receivePeerConnection({\n pc,\n userId: user.userId,\n restart: () => state.close(),\n });\n if (\n user.joined > selfJoined ||\n (user.joined === selfJoined &&\n user.userId.localeCompare(userId) > 0)\n ) {\n await makeOffer(user.userId);\n }\n });\n },\n\n onPeerLeft(leavingUsers: { userId: string }[]) {\n leavingUsers.forEach(({ userId }) => {\n const state = users.get(userId);\n if (!state) return;\n state.expirationTimeout = setTimeout(\n () => leaveUser(userId),\n peerlessUserExpiration ?? 0,\n );\n });\n },\n\n onIceUrl(url: string, expiration: number) {\n iceUrlProvider.receiveIce(url, expiration);\n },\n\n async onMessage(type, payload, from: string) {\n if (type === \"offer\" && payload.offer) {\n // Grab state and connection\n const state = await getPeer(from, false);\n const connection =\n !state.connection ||\n state.connection.pc.signalingState === \"stable\"\n ? await setupConnection(state)\n : state.connection; // reset\n logLine?.(\"đŸ’Ŧ\", {\n type,\n signalingState: connection.pc.signalingState,\n });\n\n connection.peerConnectionId = payload.connectionId;\n receivePeerConnection({\n pc: connection.pc,\n userId: from,\n restart: () => state.close(),\n });\n // Responder: set remote offer\n await connection.pc.setRemoteDescription(payload.offer);\n\n // Create and send answer\n const answer = await connection.pc.createAnswer();\n await connection.pc.setLocalDescription(answer);\n\n send(\"answer\", from, {\n connectionId: connection.id,\n answer: connection.pc.localDescription?.toJSON(),\n });\n\n // Now safe to apply any queued ICE from this peer\n await flushRemoteIce(state);\n return;\n }\n\n if (type === \"answer\" && payload.answer) {\n const state = await getPeer(from, false);\n const connection =\n state.connection &&\n state.connection.pc.signalingState !== \"closed\"\n ? state.connection\n : await setupConnection(state);\n logLine?.(\"đŸ’Ŧ\", {\n type,\n signalingState: connection.pc.signalingState,\n });\n\n // Initiator: set remote answer\n await connection.pc.setRemoteDescription(payload.answer);\n connection.peerConnectionId = payload.connectionId;\n await flushRemoteIce(state);\n return;\n }\n\n if (type === \"ice\" && payload.ice) {\n // Grab state and connection\n const state = await getPeer(from, false);\n const connection =\n state.connection ?? (await state.connectionPromise);\n if (!connection) {\n logLine?.(\"âš ī¸\", \"No connection\");\n return;\n }\n logLine?.(\"đŸ’Ŧ\", {\n type,\n signalingState: connection.pc.signalingState,\n });\n\n if (\n connection.peerConnectionId &&\n payload.connectionId !== connection.peerConnectionId\n ) {\n logLine?.(\n \"âš ī¸\",\n \"Mismatch peerConnectionID\" +\n payload.connectionId +\n \"vs\" +\n connection.peerConnectionId,\n );\n return;\n }\n\n // If we don't have remoteDescription yet (or if connectionId doesn't match), queue it\n if (\n !connection.pc.remoteDescription ||\n !connection.peerConnectionId\n ) {\n connection.peerConnectionId = payload.connectionId;\n connection.pendingRemoteIce.push(payload.ice);\n return;\n }\n\n try {\n await connection.pc.addIceCandidate(payload.ice);\n } catch (e) {\n logLine?.(\"âš ī¸ ERROR\", {\n error: \"add-ice-failed\",\n userId: state.peer,\n detail: String(e),\n });\n }\n return;\n }\n\n if (type === \"broadcast\") {\n onBroadcastMessage?.(payload, from);\n }\n },\n });\n\n const removeRequester = iceUrlProvider.addRequester((command) =>\n send(command, \"server\"),\n );\n\n roomsEntered.set(`${host}/room/${room}`, {\n exitRoom: () => {\n exitRoom();\n removeRequester();\n },\n room,\n host,\n broadcast: (payload) => send(\"broadcast\", \"server\", payload),\n });\n });\n }\n\n return {\n userId,\n enterRoom: enter,\n exitRoom: exit,\n leaveUser,\n async reset(userId: string) {\n const userState = users.get(userId);\n userState?.reset();\n },\n broadcast<P extends any>(payload: P) {\n roomsEntered.forEach((room) => room.broadcast(payload));\n },\n end() {\n roomsEntered.forEach(({ exitRoom }) => exitRoom());\n roomsEntered.clear();\n users.forEach(({ peer }) => leaveUser(peer));\n users.clear();\n },\n };\n}\n\n/*\nTurn Token ID\n<CF_TURN_TOKEN_ID>\n\nAPI Token\n<CF_RTC_API_TOKEN>\n\nCURL\ncurl \\\n\t-H \"Authorization: Bearer <CF_RTC_API_TOKEN>\" \\\n\t-H \"Content-Type: application/json\" -d '{\"ttl\": 86400}' \\\n\thttps://rtc.live.cloudflare.com/v1/turn/keys/<CF_TURN_TOKEN_ID>/credentials/generate-ice-servers\n\nJSON\n{\n\t\"iceServers\": [\n {\n \"urls\": [\n \"stun:stun.cloudflare.com:3478\",\n \"turn:turn.cloudflare.com:3478?transport=udp\",\n \"turn:turn.cloudflare.com:3478?transport=tcp\",\n \"turns:turn.cloudflare.com:5349?transport=tcp\"\n ],\n \"username\": \"xxxx\",\n \"credential\": \"yyyy\",\n }\n ]\n}\n\n*/\n",
10
10
  "import { EnterRoom, enterRoom } from \"./signal/signal-room\";\nimport {\n SigType,\n SigPayload,\n collectPeerConnections,\n} from \"./webrtc-peer-collector\";\n\ntype UserListener = (\n user: string,\n action: \"join\" | \"leave\",\n users: string[],\n) => void;\n\nexport function enterWorld<\n S extends string | ArrayBufferView = string | ArrayBufferView,\n R extends string | ArrayBufferLike = string | ArrayBufferLike,\n>({\n userId: passedUserId,\n worldId,\n logLine,\n enterRoomFunction = enterRoom,\n peerlessUserExpiration,\n workerUrl,\n onRoomReady,\n onRoomClose,\n dataChannelOptions,\n}: {\n userId?: string;\n worldId: string;\n logLine?: (...obj: any[]) => void;\n enterRoomFunction?: EnterRoom<SigType, SigPayload>;\n peerlessUserExpiration?: number;\n workerUrl?: URL;\n onRoomReady?(info: { host: string; room: string }): void;\n onRoomClose?(info: {\n host: string;\n room: string;\n ev: Pick<CloseEvent, \"reason\" | \"code\" | \"wasClean\">;\n }): void;\n dataChannelOptions?: RTCDataChannelInit;\n}) {\n const userIds = new Set<string>();\n const dataChannels = new Map<string, RTCDataChannel>();\n const userListeners = new Set<UserListener>();\n const messagesListeners = new Set<(data: R, from: string) => void>();\n\n function createDataChannel(\n pc: RTCPeerConnection,\n peerUserId: string,\n restart?: () => void,\n ) {\n function listener(ev: RTCDataChannelEvent) {\n const dc = ev.channel;\n wireDataChannel(peerUserId, dc, restart);\n dataChannels.set(peerUserId, dc);\n }\n pc.addEventListener(\"datachannel\", listener);\n const dc = pc.createDataChannel(\"data\", dataChannelOptions);\n wireDataChannel(peerUserId, dc, restart);\n dataChannels.set(peerUserId, dc);\n return () => {\n pc.removeEventListener(\"datachannel\", listener);\n };\n }\n\n function conveyMessage(data: any, userId: string) {\n messagesListeners.forEach((listener) => listener(data, userId));\n }\n\n function wireDataChannel(\n userId: string,\n dc: RTCDataChannel,\n restart?: () => void,\n ) {\n dc.onopen = () => {\n logLine?.(\"đŸ’Ŧ\", { event: \"dc-open\", userId });\n userIds.add(userId);\n userListeners.forEach((listener) =>\n listener(userId, \"join\", [...userIds]),\n );\n };\n const onmessage = ({ data }: MessageEvent) => {\n conveyMessage(data, userId);\n };\n dc.addEventListener(\"message\", onmessage);\n dc.onclose = () => {\n logLine?.(\"đŸ’Ŧ\", { event: \"dc-close\", userId });\n userIds.delete(userId);\n userListeners.forEach((listener) =>\n listener(userId, \"leave\", [...userIds]),\n );\n dc.removeEventListener(\"message\", onmessage);\n dc.onopen = null;\n dc.onclose = null;\n dc.onerror = null;\n dc.close();\n restart?.();\n };\n dc.onerror = () => logLine?.(\"âš ī¸ ERROR\", { error: \"dc-error\", userId });\n }\n\n const {\n userId,\n enterRoom,\n exitRoom,\n leaveUser,\n broadcast,\n end: endPeerCollection,\n reset: resetPeerCollection,\n } = collectPeerConnections({\n userId: passedUserId,\n worldId,\n enterRoomFunction,\n logLine,\n workerUrl,\n peerlessUserExpiration,\n onRoomReady,\n onRoomClose,\n onLeaveUser(userId: string) {\n const dc = dataChannels.get(userId);\n try {\n dc?.close();\n } catch {}\n dataChannels.delete(userId);\n },\n receivePeerConnection({ pc, userId, restart }) {\n createDataChannel(pc, userId, restart);\n },\n onBroadcastMessage(payload, from) {\n conveyMessage(payload, from);\n logLine?.(\"đŸ“ĸ\", { event: \"broadcast\", userId, data: payload });\n },\n });\n\n function send(data: S, userId?: string) {\n dataChannels.forEach((dataChannel, pUserId) => {\n if (userId && pUserId !== userId) return;\n if (dataChannel.readyState === \"open\") {\n dataChannel.send(data as any);\n }\n });\n }\n\n function removeMessageListener(listener: (data: R, from: string) => void) {\n messagesListeners.delete(listener);\n }\n\n function addMessageListener(listener: (data: R, from: string) => void) {\n messagesListeners.add(listener);\n return () => {\n removeMessageListener(listener);\n };\n }\n\n function removeUserListener(listener: UserListener) {\n userListeners.delete(listener);\n }\n\n function addUserListener(listener: UserListener) {\n userListeners.add(listener);\n return () => {\n removeUserListener(listener);\n };\n }\n\n return {\n userId,\n send,\n broadcast,\n enterRoom,\n exitRoom,\n leaveUser,\n getUsers: () => [...userIds],\n addMessageListener,\n removeMessageListener,\n addUserListener,\n removeUserListener,\n reset() {\n userIds.forEach((userId) => {\n dataChannels.get(userId)?.close();\n dataChannels.delete(userId);\n resetPeerCollection(userId);\n });\n },\n end() {\n dataChannels.forEach((dataChannel) => {\n try {\n dataChannel.close();\n } catch {}\n });\n dataChannels.clear();\n endPeerCollection();\n userListeners.clear();\n userIds.clear();\n },\n };\n}\n",
11
- "import { enterWorld } from \"../enter-world\";\n\nconst session = enterWorld({\n worldId: \"sync-buttons\",\n dataChannelOptions: {\n ordered: false,\n },\n logLine: console.log,\n});\n\nsession.enterRoom({\n room: \"sync-button\",\n host: \"hello.dobuki.net\",\n});\n\nexport class SyncButton extends HTMLElement {\n static observedAttributes = [\"id\", \"disabled\"];\n\n private shadowButton!: HTMLButtonElement;\n private slotEl!: HTMLSlotElement;\n\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n this.onMessage = this.onMessage.bind(this);\n this.onClickButton = this.onClickButton.bind(this);\n\n this.shadowRoot!.innerHTML = `\n <style>\n :host {\n display: inline-block;\n }\n\n button {\n font: inherit;\n color: inherit;\n background: var(--sync-button-bg, ButtonFace);\n border: var(--sync-button-border, 1px solid ButtonBorder);\n padding: var(--sync-button-padding, 0.375rem 0.75rem);\n border-radius: var(--sync-button-radius, 0.375rem);\n cursor: pointer;\n }\n\n button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n </style>\n <button part=\"button\" type=\"button\">\n <slot></slot>\n </button>\n `;\n\n this.shadowButton = this.shadowRoot!.querySelector(\"button\")!;\n this.slotEl = this.shadowRoot!.querySelector(\"slot\")!;\n }\n\n connectedCallback() {\n session.addMessageListener(this.onMessage);\n this.shadowButton.addEventListener(\"click\", this.onClickButton);\n this.syncToInnerButton();\n this.upgradeProperty(\"disabled\");\n }\n\n disconnectedCallback() {\n session.removeMessageListener(this.onMessage);\n this.shadowButton.removeEventListener(\"click\", this.onClickButton);\n }\n\n attributeChangedCallback(\n _name: string,\n _oldValue: string | null,\n _newValue: string | null,\n ) {\n this.syncToInnerButton();\n }\n\n get disabled(): boolean {\n return this.hasAttribute(\"disabled\");\n }\n\n set disabled(value: boolean) {\n this.toggleAttribute(\"disabled\", Boolean(value));\n }\n\n focus(options?: FocusOptions) {\n this.shadowButton.focus(options);\n }\n\n click() {\n this.shadowButton.click();\n }\n\n private syncToInnerButton() {\n this.shadowButton.disabled = this.disabled;\n\n if (this.id) {\n this.shadowButton.id = this.id;\n } else {\n this.shadowButton.removeAttribute(\"id\");\n }\n\n this.setAttribute(\"role\", \"button\");\n this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n this.setAttribute(\"aria-disabled\", String(this.disabled));\n }\n\n private upgradeProperty(prop: \"disabled\") {\n if (Object.prototype.hasOwnProperty.call(this, prop)) {\n const value = (this as any)[prop];\n delete (this as any)[prop];\n (this as any)[prop] = value;\n }\n }\n\n private onMessage(data: string | ArrayBufferLike) {\n try {\n const { action, id } = JSON.parse(String(data));\n if (action === \"click\" && this.id === id) {\n this.shadowButton.removeEventListener(\"click\", this.onClickButton);\n this.shadowButton.click();\n this.shadowButton.addEventListener(\"click\", this.onClickButton);\n }\n } catch {\n // ignore non-json\n }\n }\n\n private onClickButton() {\n session.send(JSON.stringify({ action: \"click\", id: this.id }));\n }\n}\n\ncustomElements.define(\"sync-button\", SyncButton);\n"
11
+ "const c = new Int32Array(4);\nclass h {\n static hashStr(i, a = !1) {\n return this.onePassHasher.start().appendStr(i).end(a);\n }\n static hashAsciiStr(i, a = !1) {\n return this.onePassHasher.start().appendAsciiStr(i).end(a);\n }\n // Private Static Variables\n static stateIdentity = new Int32Array([\n 1732584193,\n -271733879,\n -1732584194,\n 271733878\n ]);\n static buffer32Identity = new Int32Array([\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]);\n static hexChars = \"0123456789abcdef\";\n static hexOut = [];\n // Permanent instance is to use for one-call hashing\n static onePassHasher = new h();\n static _hex(i) {\n const a = h.hexChars, t = h.hexOut;\n let e, s, r, n;\n for (n = 0; n < 4; n += 1)\n for (s = n * 8, e = i[n], r = 0; r < 8; r += 2)\n t[s + 1 + r] = a.charAt(e & 15), e >>>= 4, t[s + 0 + r] = a.charAt(e & 15), e >>>= 4;\n return t.join(\"\");\n }\n static _md5cycle(i, a) {\n let t = i[0], e = i[1], s = i[2], r = i[3];\n t += (e & s | ~e & r) + a[0] - 680876936 | 0, t = (t << 7 | t >>> 25) + e | 0, r += (t & e | ~t & s) + a[1] - 389564586 | 0, r = (r << 12 | r >>> 20) + t | 0, s += (r & t | ~r & e) + a[2] + 606105819 | 0, s = (s << 17 | s >>> 15) + r | 0, e += (s & r | ~s & t) + a[3] - 1044525330 | 0, e = (e << 22 | e >>> 10) + s | 0, t += (e & s | ~e & r) + a[4] - 176418897 | 0, t = (t << 7 | t >>> 25) + e | 0, r += (t & e | ~t & s) + a[5] + 1200080426 | 0, r = (r << 12 | r >>> 20) + t | 0, s += (r & t | ~r & e) + a[6] - 1473231341 | 0, s = (s << 17 | s >>> 15) + r | 0, e += (s & r | ~s & t) + a[7] - 45705983 | 0, e = (e << 22 | e >>> 10) + s | 0, t += (e & s | ~e & r) + a[8] + 1770035416 | 0, t = (t << 7 | t >>> 25) + e | 0, r += (t & e | ~t & s) + a[9] - 1958414417 | 0, r = (r << 12 | r >>> 20) + t | 0, s += (r & t | ~r & e) + a[10] - 42063 | 0, s = (s << 17 | s >>> 15) + r | 0, e += (s & r | ~s & t) + a[11] - 1990404162 | 0, e = (e << 22 | e >>> 10) + s | 0, t += (e & s | ~e & r) + a[12] + 1804603682 | 0, t = (t << 7 | t >>> 25) + e | 0, r += (t & e | ~t & s) + a[13] - 40341101 | 0, r = (r << 12 | r >>> 20) + t | 0, s += (r & t | ~r & e) + a[14] - 1502002290 | 0, s = (s << 17 | s >>> 15) + r | 0, e += (s & r | ~s & t) + a[15] + 1236535329 | 0, e = (e << 22 | e >>> 10) + s | 0, t += (e & r | s & ~r) + a[1] - 165796510 | 0, t = (t << 5 | t >>> 27) + e | 0, r += (t & s | e & ~s) + a[6] - 1069501632 | 0, r = (r << 9 | r >>> 23) + t | 0, s += (r & e | t & ~e) + a[11] + 643717713 | 0, s = (s << 14 | s >>> 18) + r | 0, e += (s & t | r & ~t) + a[0] - 373897302 | 0, e = (e << 20 | e >>> 12) + s | 0, t += (e & r | s & ~r) + a[5] - 701558691 | 0, t = (t << 5 | t >>> 27) + e | 0, r += (t & s | e & ~s) + a[10] + 38016083 | 0, r = (r << 9 | r >>> 23) + t | 0, s += (r & e | t & ~e) + a[15] - 660478335 | 0, s = (s << 14 | s >>> 18) + r | 0, e += (s & t | r & ~t) + a[4] - 405537848 | 0, e = (e << 20 | e >>> 12) + s | 0, t += (e & r | s & ~r) + a[9] + 568446438 | 0, t = (t << 5 | t >>> 27) + e | 0, r += (t & s | e & ~s) + a[14] - 1019803690 | 0, r = (r << 9 | r >>> 23) + t | 0, s += (r & e | t & ~e) + a[3] - 187363961 | 0, s = (s << 14 | s >>> 18) + r | 0, e += (s & t | r & ~t) + a[8] + 1163531501 | 0, e = (e << 20 | e >>> 12) + s | 0, t += (e & r | s & ~r) + a[13] - 1444681467 | 0, t = (t << 5 | t >>> 27) + e | 0, r += (t & s | e & ~s) + a[2] - 51403784 | 0, r = (r << 9 | r >>> 23) + t | 0, s += (r & e | t & ~e) + a[7] + 1735328473 | 0, s = (s << 14 | s >>> 18) + r | 0, e += (s & t | r & ~t) + a[12] - 1926607734 | 0, e = (e << 20 | e >>> 12) + s | 0, t += (e ^ s ^ r) + a[5] - 378558 | 0, t = (t << 4 | t >>> 28) + e | 0, r += (t ^ e ^ s) + a[8] - 2022574463 | 0, r = (r << 11 | r >>> 21) + t | 0, s += (r ^ t ^ e) + a[11] + 1839030562 | 0, s = (s << 16 | s >>> 16) + r | 0, e += (s ^ r ^ t) + a[14] - 35309556 | 0, e = (e << 23 | e >>> 9) + s | 0, t += (e ^ s ^ r) + a[1] - 1530992060 | 0, t = (t << 4 | t >>> 28) + e | 0, r += (t ^ e ^ s) + a[4] + 1272893353 | 0, r = (r << 11 | r >>> 21) + t | 0, s += (r ^ t ^ e) + a[7] - 155497632 | 0, s = (s << 16 | s >>> 16) + r | 0, e += (s ^ r ^ t) + a[10] - 1094730640 | 0, e = (e << 23 | e >>> 9) + s | 0, t += (e ^ s ^ r) + a[13] + 681279174 | 0, t = (t << 4 | t >>> 28) + e | 0, r += (t ^ e ^ s) + a[0] - 358537222 | 0, r = (r << 11 | r >>> 21) + t | 0, s += (r ^ t ^ e) + a[3] - 722521979 | 0, s = (s << 16 | s >>> 16) + r | 0, e += (s ^ r ^ t) + a[6] + 76029189 | 0, e = (e << 23 | e >>> 9) + s | 0, t += (e ^ s ^ r) + a[9] - 640364487 | 0, t = (t << 4 | t >>> 28) + e | 0, r += (t ^ e ^ s) + a[12] - 421815835 | 0, r = (r << 11 | r >>> 21) + t | 0, s += (r ^ t ^ e) + a[15] + 530742520 | 0, s = (s << 16 | s >>> 16) + r | 0, e += (s ^ r ^ t) + a[2] - 995338651 | 0, e = (e << 23 | e >>> 9) + s | 0, t += (s ^ (e | ~r)) + a[0] - 198630844 | 0, t = (t << 6 | t >>> 26) + e | 0, r += (e ^ (t | ~s)) + a[7] + 1126891415 | 0, r = (r << 10 | r >>> 22) + t | 0, s += (t ^ (r | ~e)) + a[14] - 1416354905 | 0, s = (s << 15 | s >>> 17) + r | 0, e += (r ^ (s | ~t)) + a[5] - 57434055 | 0, e = (e << 21 | e >>> 11) + s | 0, t += (s ^ (e | ~r)) + a[12] + 1700485571 | 0, t = (t << 6 | t >>> 26) + e | 0, r += (e ^ (t | ~s)) + a[3] - 1894986606 | 0, r = (r << 10 | r >>> 22) + t | 0, s += (t ^ (r | ~e)) + a[10] - 1051523 | 0, s = (s << 15 | s >>> 17) + r | 0, e += (r ^ (s | ~t)) + a[1] - 2054922799 | 0, e = (e << 21 | e >>> 11) + s | 0, t += (s ^ (e | ~r)) + a[8] + 1873313359 | 0, t = (t << 6 | t >>> 26) + e | 0, r += (e ^ (t | ~s)) + a[15] - 30611744 | 0, r = (r << 10 | r >>> 22) + t | 0, s += (t ^ (r | ~e)) + a[6] - 1560198380 | 0, s = (s << 15 | s >>> 17) + r | 0, e += (r ^ (s | ~t)) + a[13] + 1309151649 | 0, e = (e << 21 | e >>> 11) + s | 0, t += (s ^ (e | ~r)) + a[4] - 145523070 | 0, t = (t << 6 | t >>> 26) + e | 0, r += (e ^ (t | ~s)) + a[11] - 1120210379 | 0, r = (r << 10 | r >>> 22) + t | 0, s += (t ^ (r | ~e)) + a[2] + 718787259 | 0, s = (s << 15 | s >>> 17) + r | 0, e += (r ^ (s | ~t)) + a[9] - 343485551 | 0, e = (e << 21 | e >>> 11) + s | 0, i[0] = t + i[0] | 0, i[1] = e + i[1] | 0, i[2] = s + i[2] | 0, i[3] = r + i[3] | 0;\n }\n _dataLength = 0;\n _bufferLength = 0;\n _state = new Int32Array(4);\n _buffer = new ArrayBuffer(68);\n _buffer8;\n _buffer32;\n constructor() {\n this._buffer8 = new Uint8Array(this._buffer, 0, 68), this._buffer32 = new Uint32Array(this._buffer, 0, 17), this.start();\n }\n /**\n * Initialise buffer to be hashed\n */\n start() {\n return this._dataLength = 0, this._bufferLength = 0, this._state.set(h.stateIdentity), this;\n }\n // Char to code point to to array conversion:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n // #Example.3A_Fixing_charCodeAt_to_handle_non-Basic-Multilingual-Plane_characters_if_their_presence_earlier_in_the_string_is_unknown\n /**\n * Append a UTF-8 string to the hash buffer\n * @param str String to append\n */\n appendStr(i) {\n const a = this._buffer8, t = this._buffer32;\n let e = this._bufferLength, s, r;\n for (r = 0; r < i.length; r += 1) {\n if (s = i.charCodeAt(r), s < 128)\n a[e++] = s;\n else if (s < 2048)\n a[e++] = (s >>> 6) + 192, a[e++] = s & 63 | 128;\n else if (s < 55296 || s > 56319)\n a[e++] = (s >>> 12) + 224, a[e++] = s >>> 6 & 63 | 128, a[e++] = s & 63 | 128;\n else {\n if (s = (s - 55296) * 1024 + (i.charCodeAt(++r) - 56320) + 65536, s > 1114111)\n throw new Error(\n \"Unicode standard supports code points up to U+10FFFF\"\n );\n a[e++] = (s >>> 18) + 240, a[e++] = s >>> 12 & 63 | 128, a[e++] = s >>> 6 & 63 | 128, a[e++] = s & 63 | 128;\n }\n e >= 64 && (this._dataLength += 64, h._md5cycle(this._state, t), e -= 64, t[0] = t[16]);\n }\n return this._bufferLength = e, this;\n }\n /**\n * Append an ASCII string to the hash buffer\n * @param str String to append\n */\n appendAsciiStr(i) {\n const a = this._buffer8, t = this._buffer32;\n let e = this._bufferLength, s, r = 0;\n for (; ; ) {\n for (s = Math.min(i.length - r, 64 - e); s--; )\n a[e++] = i.charCodeAt(r++);\n if (e < 64)\n break;\n this._dataLength += 64, h._md5cycle(this._state, t), e = 0;\n }\n return this._bufferLength = e, this;\n }\n /**\n * Append a byte array to the hash buffer\n * @param input array to append\n */\n appendByteArray(i) {\n const a = this._buffer8, t = this._buffer32;\n let e = this._bufferLength, s, r = 0;\n for (; ; ) {\n for (s = Math.min(i.length - r, 64 - e); s--; )\n a[e++] = i[r++];\n if (e < 64)\n break;\n this._dataLength += 64, h._md5cycle(this._state, t), e = 0;\n }\n return this._bufferLength = e, this;\n }\n /**\n * Get the state of the hash buffer\n */\n getState() {\n const i = this._state;\n return {\n buffer: String.fromCharCode.apply(null, Array.from(this._buffer8)),\n buflen: this._bufferLength,\n length: this._dataLength,\n state: [i[0], i[1], i[2], i[3]]\n };\n }\n /**\n * Override the current state of the hash buffer\n * @param state New hash buffer state\n */\n setState(i) {\n const a = i.buffer, t = i.state, e = this._state;\n let s;\n for (this._dataLength = i.length, this._bufferLength = i.buflen, e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], s = 0; s < a.length; s += 1)\n this._buffer8[s] = a.charCodeAt(s);\n }\n /**\n * Hash the current state of the hash buffer and return the result\n * @param raw Whether to return the value as an `Int32Array`\n */\n end(i = !1) {\n const a = this._bufferLength, t = this._buffer8, e = this._buffer32, s = (a >> 2) + 1;\n this._dataLength += a;\n const r = this._dataLength * 8;\n if (t[a] = 128, t[a + 1] = t[a + 2] = t[a + 3] = 0, e.set(h.buffer32Identity.subarray(s), s), a > 55 && (h._md5cycle(this._state, e), e.set(h.buffer32Identity)), r <= 4294967295)\n e[14] = r;\n else {\n const n = r.toString(16).match(/(.*?)(.{0,8})$/);\n if (n === null) return i ? c : \"\";\n const o = parseInt(n[2], 16), _ = parseInt(n[1], 16) || 0;\n e[14] = o, e[15] = _;\n }\n return h._md5cycle(this._state, e), i ? this._state : h._hex(this._state);\n }\n}\nif (h.hashStr(\"hello\") !== \"5d41402abc4b2a76b9719d911017c592\")\n throw new Error(\"Md5 self test failed.\");\nclass l {\n constructor(i, a = !0, t = 1048576) {\n this._callback = i, this._async = a, this._partSize = t, this._configureReader();\n }\n _reader;\n _md5;\n _part;\n // private _length!: number;\n _blob;\n /**\n * Hash a blob of data in the worker\n * @param blob Data to hash\n */\n hash(i) {\n const a = this;\n a._blob = i, a._part = 0, a._md5 = new h(), a._processPart();\n }\n _fail() {\n this._callback({\n success: !1,\n result: \"data read failed\"\n });\n }\n _hashData(i) {\n let a = this;\n a._md5.appendByteArray(new Uint8Array(i.target.result)), a._part * a._partSize >= a._blob.size ? a._callback({\n success: !0,\n result: a._md5.end()\n }) : a._processPart();\n }\n _processPart() {\n const i = this;\n let a = 0, t;\n i._part += 1, i._blob.size > i._partSize ? (a = i._part * i._partSize, a > i._blob.size && (a = i._blob.size), t = i._blob.slice(\n (i._part - 1) * i._partSize,\n a\n )) : t = i._blob, i._async ? i._reader.readAsArrayBuffer(t) : setTimeout(() => {\n try {\n i._hashData({\n target: {\n result: i._reader.readAsArrayBuffer(\n t\n )\n }\n });\n } catch {\n i._fail();\n }\n }, 0);\n }\n _configureReader() {\n const i = this;\n i._async ? (i._reader = new FileReader(), i._reader.onload = i._hashData.bind(i), i._reader.onerror = i._fail.bind(i), i._reader.onabort = i._fail.bind(i)) : i._reader = new FileReaderSync();\n }\n}\nclass u {\n _queue = [];\n _hashWorker;\n _processing;\n _ready = !0;\n constructor(i, a) {\n const t = this;\n Worker ? (t._hashWorker = new Worker(i, a), t._hashWorker.onmessage = t._recievedMessage.bind(t), t._hashWorker.onerror = (e) => {\n t._ready = !1, console.error(\"Hash worker failure\", e);\n }) : (t._ready = !1, console.error(\"Web Workers are not supported in this browser\"));\n }\n /**\n * Hash a blob of data in the worker\n * @param blob Data to hash\n * @returns Promise of the Hashed result\n */\n hash(i) {\n const a = this;\n let t;\n return t = new Promise((e, s) => {\n a._queue.push({\n blob: i,\n resolve: e,\n reject: s\n }), a._processNext();\n }), t;\n }\n /** Terminate any existing hash requests */\n terminate() {\n this._ready = !1, this._hashWorker.terminate();\n }\n // Processes the next item in the queue\n _processNext() {\n this._ready && !this._processing && this._queue.length > 0 && (this._processing = this._queue.pop(), this._hashWorker.postMessage(this._processing.blob));\n }\n // Hash result is returned from the worker\n _recievedMessage(i) {\n const a = i.data;\n a.success ? this._processing?.resolve(a.result) : this._processing?.reject(a.result), this._processing = void 0, this._processNext();\n }\n}\nexport {\n h as Md5,\n l as Md5FileHasher,\n u as ParallelHasher\n};\n//# sourceMappingURL=index.es.js.map\n",
12
+ "import { enterWorld } from \"../enter-world\";\nimport { Md5 } from \"ts-md5\";\n\nexport class SyncButton extends HTMLElement {\n static observedAttributes = [\"id\", \"disabled\"];\n\n static session?: any;\n\n private shadowButton!: HTMLButtonElement;\n private slotEl!: HTMLSlotElement;\n\n constructor() {\n super();\n if (!SyncButton.session) {\n const session = enterWorld({\n worldId: \"sync-buttons\",\n dataChannelOptions: {\n ordered: false,\n },\n workerUrl: new URL(\n \"https://hello.dobuki.net/signal/signal-room.worker.js\",\n ),\n logLine: console.log,\n });\n\n session.enterRoom({\n room: `sync-button-${Md5.hashStr(`${location.origin}-${location.pathname}`)}`,\n host: \"hello.dobuki.net\",\n });\n SyncButton.session = session;\n }\n\n this.attachShadow({ mode: \"open\" });\n this.onMessage = this.onMessage.bind(this);\n this.onClickButton = this.onClickButton.bind(this);\n\n this.shadowRoot!.innerHTML = `\n <style>\n :host {\n display: inline-block;\n }\n\n button {\n font: inherit;\n color: inherit;\n background: var(--sync-button-bg, ButtonFace);\n border: var(--sync-button-border, 1px solid ButtonBorder);\n padding: var(--sync-button-padding, 0.375rem 0.75rem);\n border-radius: var(--sync-button-radius, 0.375rem);\n cursor: pointer;\n }\n\n button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n </style>\n <button part=\"button\" type=\"button\">\n <slot></slot>\n </button>\n `;\n\n this.shadowButton = this.shadowRoot!.querySelector(\"button\")!;\n this.slotEl = this.shadowRoot!.querySelector(\"slot\")!;\n }\n\n connectedCallback() {\n SyncButton.session.addMessageListener(this.onMessage);\n this.shadowButton.addEventListener(\"click\", this.onClickButton);\n this.syncToInnerButton();\n this.upgradeProperty(\"disabled\");\n }\n\n disconnectedCallback() {\n SyncButton.session.removeMessageListener(this.onMessage);\n this.shadowButton.removeEventListener(\"click\", this.onClickButton);\n }\n\n attributeChangedCallback(\n _name: string,\n _oldValue: string | null,\n _newValue: string | null,\n ) {\n this.syncToInnerButton();\n }\n\n get disabled(): boolean {\n return this.hasAttribute(\"disabled\");\n }\n\n set disabled(value: boolean) {\n this.toggleAttribute(\"disabled\", Boolean(value));\n }\n\n focus(options?: FocusOptions) {\n this.shadowButton.focus(options);\n }\n\n click() {\n this.shadowButton.click();\n }\n\n private syncToInnerButton() {\n this.shadowButton.disabled = this.disabled;\n\n if (this.id) {\n this.shadowButton.id = this.id;\n } else {\n this.shadowButton.removeAttribute(\"id\");\n }\n\n this.setAttribute(\"role\", \"button\");\n this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n this.setAttribute(\"aria-disabled\", String(this.disabled));\n }\n\n private upgradeProperty(prop: \"disabled\") {\n if (Object.prototype.hasOwnProperty.call(this, prop)) {\n const value = (this as any)[prop];\n delete (this as any)[prop];\n (this as any)[prop] = value;\n }\n }\n\n private onMessage(data: string | ArrayBufferLike) {\n try {\n const { action, id } = JSON.parse(String(data));\n if (action === \"click\" && this.id === id) {\n this.shadowButton.removeEventListener(\"click\", this.onClickButton);\n this.shadowButton.click();\n this.shadowButton.addEventListener(\"click\", this.onClickButton);\n }\n } catch {\n // ignore non-json\n }\n }\n\n private onClickButton() {\n SyncButton.session.send(JSON.stringify({ action: \"click\", id: this.id }));\n }\n}\n\ncustomElements.define(\"sync-button\", SyncButton);\n"
12
13
  ],
13
- "mappings": "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",
14
- "debugId": "DB76B938B1F8384E64756E2164756E21",
14
+ "mappings": "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MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,YAAY,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,aAAa,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,YAAY,GAAG,KAAK,KAAK,KAAK,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,YAAY,GAAG,KAAK,KAAK,KAAK,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,YAAY,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,WAAW,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,YAAY,GAAG,KAAK,KAAK,KAAK,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,YAAY,GAAG,KAAK,KAAK,KAAK,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,YAAY,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,aAAa,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,YAAY,GAAG,KAAK,KAAK,KAAK,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,aAAa,GAAG,KAAK,KAAK,KAAK,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,aAAa,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,WAAW,GAAG,KAAK,KAAK,IAAI,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,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",
15
+ "debugId": "84CAC7ECF570725764756E2164756E21",
15
16
  "names": []
16
17
  }
package/dist/listeners.js CHANGED
@@ -1,4 +1,24 @@
1
- class i{listenersByType=new Map;addListener(e,s){let t=this.listenersByType.get(e)??(()=>{let r=new Set;return this.listenersByType.set(e,r),r})();return t.add(s),()=>{t.delete(s)}}trigger(e){this.listenersByType.get(e.type)?.forEach((s)=>s(e))}}export{i as Listeners};
1
+ // src/browser/listeners.ts
2
+ class Listeners {
3
+ listenersByType = new Map;
4
+ addListener(type, listener) {
5
+ const listeners = this.listenersByType.get(type) ?? (() => {
6
+ const listeners2 = new Set;
7
+ this.listenersByType.set(type, listeners2);
8
+ return listeners2;
9
+ })();
10
+ listeners.add(listener);
11
+ return () => {
12
+ listeners.delete(listener);
13
+ };
14
+ }
15
+ trigger(msg) {
16
+ this.listenersByType.get(msg.type)?.forEach((listener) => listener(msg));
17
+ }
18
+ }
19
+ export {
20
+ Listeners
21
+ };
2
22
 
3
- //# debugId=0ECC54E6EECC2DD764756E2164756E21
23
+ //# debugId=AA73853C6ACA22ED64756E2164756E21
4
24
  //# sourceMappingURL=listeners.js.map
@@ -4,7 +4,7 @@
4
4
  "sourcesContent": [
5
5
  "interface Message<T = string> {\n type: T;\n}\n\nexport class Listeners<M extends Message> {\n private listenersByType = new Map<M[\"type\"], Set<(msg: M) => void>>();\n\n addListener(type: M[\"type\"], listener: (msg: M) => void) {\n const listeners =\n this.listenersByType.get(type) ??\n (() => {\n const listeners = new Set<(msg: M) => void>();\n this.listenersByType.set(type, listeners);\n return listeners;\n })();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n\n trigger(msg: M) {\n this.listenersByType.get(msg.type)?.forEach((listener) => listener(msg));\n }\n}\n"
6
6
  ],
7
- "mappings": "AAIO,MAAM,CAA6B,CAChC,gBAAkB,IAAI,IAE9B,WAAW,CAAC,EAAiB,EAA4B,CACvD,IAAM,EACJ,KAAK,gBAAgB,IAAI,CAAI,IAC5B,IAAM,CACL,IAAM,EAAY,IAAI,IAEtB,OADA,KAAK,gBAAgB,IAAI,EAAM,CAAS,EACjC,IACN,EAEL,OADA,EAAU,IAAI,CAAQ,EACf,IAAM,CACX,EAAU,OAAO,CAAQ,GAI7B,OAAO,CAAC,EAAQ,CACd,KAAK,gBAAgB,IAAI,EAAI,IAAI,GAAG,QAAQ,CAAC,IAAa,EAAS,CAAG,CAAC,EAE3E",
8
- "debugId": "0ECC54E6EECC2DD764756E2164756E21",
7
+ "mappings": ";AAIO,MAAM,UAA6B;AAAA,EAChC,kBAAkB,IAAI;AAAA,EAE9B,WAAW,CAAC,MAAiB,UAA4B;AAAA,IACvD,MAAM,YACJ,KAAK,gBAAgB,IAAI,IAAI,MAC5B,MAAM;AAAA,MACL,MAAM,aAAY,IAAI;AAAA,MACtB,KAAK,gBAAgB,IAAI,MAAM,UAAS;AAAA,MACxC,OAAO;AAAA,OACN;AAAA,IACL,UAAU,IAAI,QAAQ;AAAA,IACtB,OAAO,MAAM;AAAA,MACX,UAAU,OAAO,QAAQ;AAAA;AAAA;AAAA,EAI7B,OAAO,CAAC,KAAQ;AAAA,IACd,KAAK,gBAAgB,IAAI,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC;AAAA;AAE3E;",
8
+ "debugId": "AA73853C6ACA22ED64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/sample/index.ts"],"names":[],"mappings":"AAKA,cAAc,kCAAkC,CAAC;AA8BjD,wBAAgB,QAAQ,SAEvB;AAED,wBAAgB,WAAW,eAuC1B;AAGD,wBAAgB,WAAW,SAE1B;AAED,wBAAgB,UAAU,CAAC,kBAAkB,EAAE,OAAO,cA+HrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/sample/index.ts"],"names":[],"mappings":"AAKA,cAAc,kCAAkC,CAAC;AA8BjD,wBAAgB,QAAQ,SAEvB;AAED,wBAAgB,WAAW,eAwC1B;AAGD,wBAAgB,WAAW,SAE1B;AAED,wBAAgB,UAAU,CAAC,kBAAkB,EAAE,OAAO,cAgIrD"}
@@ -9,6 +9,7 @@ export declare function enterRoom<T extends string, P = any>(params: {
9
9
  userId: string;
10
10
  worldId: string;
11
11
  room: string;
12
+ protocol?: string;
12
13
  host: string;
13
14
  onOpen?: () => void;
14
15
  onClose?: (ev: Pick<CloseEvent, "code" | "reason" | "wasClean">) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"signal-room.d.ts","sourceRoot":"","sources":["../../../src/browser/signal/impl/signal-room.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAID;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC;IACzE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,UAAU,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG;IACF,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,EAClB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,QAAQ,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE,CAAC,KACR,IAAI,CAAC;CACX,CA4KA"}
1
+ {"version":3,"file":"signal-room.d.ts","sourceRoot":"","sources":["../../../src/browser/signal/impl/signal-room.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAID;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC;IACzE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,UAAU,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG;IACF,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,EAClB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,QAAQ,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE,CAAC,KACR,IAAI,CAAC;CACX,CAoLA"}
@@ -1,8 +1,9 @@
1
1
  import type { IPeer } from "./impl/signal-room.js";
2
- export declare function enterRoom<T extends string, P = any>({ userId, worldId, room, host, autoRejoin, onOpen, onClose, onError, onPeerJoined, onPeerLeft, onIceUrl, onMessage, logLine, workerUrl, }: {
2
+ export declare function enterRoom<T extends string, P = any>({ userId, worldId, room, protocol, host, autoRejoin, onOpen, onClose, onError, onPeerJoined, onPeerLeft, onIceUrl, onMessage, logLine, workerUrl, }: {
3
3
  userId: string;
4
4
  worldId: string;
5
5
  room: string;
6
+ protocol?: string;
6
7
  host: string;
7
8
  autoRejoin?: boolean;
8
9
  onOpen?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"signal-room.d.ts","sourceRoot":"","sources":["../../src/browser/signal/signal-room.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAInD,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,EACnD,MAAM,EACN,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,UAAiB,EACjB,MAAM,EACN,OAAO,EACP,OAAO,EACP,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC;IACzE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,UAAU,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB,GAAG;IACF,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,EAClB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,QAAQ,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE,CAAC,KACR,IAAI,CAAC;CACX,CA0EA;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"signal-room.d.ts","sourceRoot":"","sources":["../../src/browser/signal/signal-room.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAInD,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,EACnD,MAAM,EACN,OAAO,EACP,IAAI,EACJ,QAAgB,EAChB,IAAI,EACJ,UAAiB,EACjB,MAAM,EACN,OAAO,EACP,OAAO,EACP,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC;IACzE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,UAAU,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB,GAAG;IACF,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,EAClB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,QAAQ,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE,CAAC,KACR,IAAI,CAAC;CACX,CAwFA;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
@@ -37,6 +37,7 @@ export type WorkerCommand<T extends string = string, P = any> = {
37
37
  worldId: string;
38
38
  room: string;
39
39
  host: string;
40
+ protocol?: string;
40
41
  autoRejoin: boolean;
41
42
  } | {
42
43
  cmd: "exit";
@@ -1 +1 @@
1
- {"version":3,"file":"signal-room.worker.d.ts","sourceRoot":"","sources":["../../src/browser/signal/signal-room.worker.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,IACpD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACvD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB,GACD;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC;AAElD,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,IACxD;IACE,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;CACrB,GACD;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GACf;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,CAAC,EAAE,CAAC,CAAC;CACb,CAAC"}
1
+ {"version":3,"file":"signal-room.worker.d.ts","sourceRoot":"","sources":["../../src/browser/signal/signal-room.worker.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,IACpD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACvD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB,GACD;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC;AAElD,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,IACxD;IACE,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB,GACD;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GACf;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,CAAC,EAAE,CAAC,CAAC;CACb,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export declare class SyncButton extends HTMLElement {
2
2
  static observedAttributes: string[];
3
+ static session?: any;
3
4
  private shadowButton;
4
5
  private slotEl;
5
6
  constructor();
@@ -1 +1 @@
1
- {"version":3,"file":"sync-button.d.ts","sourceRoot":"","sources":["../../src/browser/web-components/sync-button.ts"],"names":[],"mappings":"AAeA,qBAAa,UAAW,SAAQ,WAAW;IACzC,MAAM,CAAC,kBAAkB,WAAsB;IAE/C,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,MAAM,CAAmB;;IAsCjC,iBAAiB;IAOjB,oBAAoB;IAKpB,wBAAwB,CACtB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,GAAG,IAAI;IAK1B,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAE1B;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY;IAI5B,KAAK;IAIL,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,aAAa;CAGtB"}
1
+ {"version":3,"file":"sync-button.d.ts","sourceRoot":"","sources":["../../src/browser/web-components/sync-button.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAW,SAAQ,WAAW;IACzC,MAAM,CAAC,kBAAkB,WAAsB;IAE/C,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC;IAErB,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,MAAM,CAAmB;;IAyDjC,iBAAiB;IAOjB,oBAAoB;IAKpB,wBAAwB,CACtB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,GAAG,IAAI;IAK1B,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAE1B;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY;IAI5B,KAAK;IAIL,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,aAAa;CAGtB"}
@@ -34,9 +34,10 @@ export declare function collectPeerConnections({ userId: passedUserId, worldId,
34
34
  onBroadcastMessage?<P extends any>(payload: P, from: string): void;
35
35
  }): {
36
36
  userId: string;
37
- enterRoom: ({ room, host }: {
37
+ enterRoom: ({ room, host, protocol, }: {
38
38
  room: string;
39
39
  host: string;
40
+ protocol?: string;
40
41
  }) => Promise<void>;
41
42
  exitRoom: ({ room, host }: {
42
43
  room: string;
@@ -1 +1 @@
1
- {"version":3,"file":"webrtc-peer-collector.d.ts","sourceRoot":"","sources":["../src/browser/webrtc-peer-collector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAa,MAAM,sBAAsB,CAAC;AAG5D,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,aAAa,GAAG,WAAW,CAAC;AAC/E,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,yBAAyB,CAAC;IAClC,MAAM,CAAC,EAAE,yBAAyB,CAAC;IACnC,GAAG,CAAC,EAAE,mBAAmB,CAAC;CAC3B,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAyBxB;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EAAE,YAAY,EACpB,OAAO,EACP,qBAAqB,EACrB,sBAA6B,EAC7B,iBAAiB,EAAE,SAA8B,EACjD,OAAO,EACP,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,UAAU,EAAE;QAChC,EAAE,EAAE,iBAAiB,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;KACtB,GAAG,IAAI,CAAC;IACT,WAAW,CAAC,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzD,WAAW,CAAC,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC,CAAC;KACtD,GAAG,IAAI,CAAC;IACT,kBAAkB,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACpE;;gCAuDgC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;+BAT/B;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;wBAhCjC,MAAM;kBAkWX,MAAM;cAIhB,CAAC,2BAAuB,CAAC;;EAUtC"}
1
+ {"version":3,"file":"webrtc-peer-collector.d.ts","sourceRoot":"","sources":["../src/browser/webrtc-peer-collector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAa,MAAM,sBAAsB,CAAC;AAG5D,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,aAAa,GAAG,WAAW,CAAC;AAC/E,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,yBAAyB,CAAC;IAClC,MAAM,CAAC,EAAE,yBAAyB,CAAC;IACnC,GAAG,CAAC,EAAE,mBAAmB,CAAC;CAC3B,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAyBxB;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EAAE,YAAY,EACpB,OAAO,EACP,qBAAqB,EACrB,sBAA6B,EAC7B,iBAAiB,EAAE,SAA8B,EACjD,OAAO,EACP,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,UAAU,EAAE;QAChC,EAAE,EAAE,iBAAiB,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;KACtB,GAAG,IAAI,CAAC;IACT,WAAW,CAAC,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzD,WAAW,CAAC,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC,CAAC;KACtD,GAAG,IAAI,CAAC;IACT,kBAAkB,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACpE;;2CA2DI;QACD,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;+BAjB6B;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;wBAhCjC,MAAM;kBA2WX,MAAM;cAIhB,CAAC,2BAAuB,CAAC;;EAUtC"}