@dobuki/hello-worker 1.0.32 → 1.0.35

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.
@@ -1,7 +1,7 @@
1
1
  import { EnterRoom } from "./signal-room";
2
2
  import { SigType, SigPayload } from "./webrtc-peer-collector";
3
3
  type UserListener = (user: string, action: "join" | "leave", users: string[]) => void;
4
- export declare function enterWorld({ appId, logLine, enterRoomFunction, peerlessUserExpiration, workerUrl, onRoomReady, onRoomClose, dataChannelOptions, }: {
4
+ export declare function enterWorld<D extends string | ArrayBufferView<ArrayBuffer>>({ appId, logLine, enterRoomFunction, peerlessUserExpiration, workerUrl, onRoomReady, onRoomClose, dataChannelOptions, }: {
5
5
  appId: string;
6
6
  logLine?: (direction: string, obj?: any) => void;
7
7
  enterRoomFunction?: EnterRoom<SigType, SigPayload>;
@@ -19,7 +19,7 @@ export declare function enterWorld({ appId, logLine, enterRoomFunction, peerless
19
19
  dataChannelOptions?: RTCDataChannelInit;
20
20
  }): {
21
21
  userId: string;
22
- send: (data: any, userId?: string) => void;
22
+ send: (data: D, userId?: string) => void;
23
23
  enterRoom: ({ room, host }: {
24
24
  room: string;
25
25
  host: string;
@@ -30,8 +30,8 @@ export declare function enterWorld({ appId, logLine, enterRoomFunction, peerless
30
30
  }) => void;
31
31
  leaveUser: (userId: string) => void;
32
32
  getUsers: () => string[];
33
- addMessageListener: (listener: (data: any, from: string) => void) => () => void;
34
- removeMessageListener: (listener: (data: any, from: string) => void) => void;
33
+ addMessageListener: (listener: (data: D, from: string) => void) => () => void;
34
+ removeMessageListener: (listener: (data: D, from: string) => void) => void;
35
35
  addUserListener: (listener: UserListener) => () => void;
36
36
  removeUserListener: (listener: UserListener) => void;
37
37
  end(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"enter-world.d.ts","sourceRoot":"","sources":["../src/browser/enter-world.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,OAAO,EACP,UAAU,EAEX,MAAM,yBAAyB,CAAC;AAEjC,KAAK,YAAY,GAAG,CAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,OAAO,EACxB,KAAK,EAAE,MAAM,EAAE,KACZ,IAAI,CAAC;AAEV,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,OAAuB,EACvB,iBAA6B,EAC7B,sBAAsB,EACtB,SAAS,EACT,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,iBAAiB,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,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,EAAE,kBAAkB,CAAC;CACzC;;iBAuFqB,GAAG,WAAW,MAAM;;;;;;;;;;;mCAWF,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI;sCAJ9B,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI;gCAevC,YAAY;mCAJT,YAAY;;EAkCnD"}
1
+ {"version":3,"file":"enter-world.d.ts","sourceRoot":"","sources":["../src/browser/enter-world.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,OAAO,EACP,UAAU,EAEX,MAAM,yBAAyB,CAAC;AAEjC,KAAK,YAAY,GAAG,CAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,OAAO,EACxB,KAAK,EAAE,MAAM,EAAE,KACZ,IAAI,CAAC;AAEV,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,EAAE,EAC1E,KAAK,EACL,OAAuB,EACvB,iBAA6B,EAC7B,sBAAsB,EACtB,SAAS,EACT,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,iBAAiB,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,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,EAAE,kBAAkB,CAAC;CACzC;;iBAuFqB,CAAC,WAAW,MAAM;;;;;;;;;;;mCAiBA,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI;sCAJ5B,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI;gCAerC,YAAY;mCAJT,YAAY;;EAkCnD"}
@@ -1,4 +1,4 @@
1
- function g(Z){let{userId:H,appId:h,room:J,host:N,autoRejoin:b=!0,logLine:q}=Z,_=!1,Q=0,V,A,X=!0,$=new Map,F=`wss://${N}/room/${h}/${J}?userId=${encodeURIComponent(H)}`;function Y(z,D,n){if(!V)return!1;if(_||V.readyState!==WebSocket.OPEN)return!1;let T={type:z,to:D,payload:n};return V.send(JSON.stringify(T)),q?.("\uD83D\uDC64 ➡️ \uD83D\uDDA5️",T),!0}function M(){if(_)return;V=new WebSocket(F),V.onopen=()=>{if(X)Z.onOpen?.(),X=!1;Q=0},V.onmessage=(z)=>{try{let D=JSON.parse(z.data);if(q?.("\uD83D\uDDA5️ ➡️ \uD83D\uDC64",D),D.type==="peer-joined"||D.type==="peer-left")W(D.users);else if(D.userId)Z.onMessage(D.type,D.payload,{userId:D.userId,receive:(n,T)=>Y(n,D.userId,T)})}catch{q?.("⚠️ ERROR",{error:"invalid-json"})}},V.onclose=(z)=>{let n=[1001,1006,1011,1012,1013].includes(z.code);if(b&&!_&&n){let T=Math.min(Math.pow(2,Q)*1000,30000),B=Math.random()*1000,K=T+B;q?.("\uD83D\uDD04 RECONNECTING",{attempt:Q+1,delayMs:Math.round(K)}),Q++,A=setTimeout(M,K)}else Z.onClose?.({code:z.code,reason:z.reason,wasClean:z.wasClean})},V.onerror=(z)=>{console.error("WS Error",z),Z.onError?.()}}function W(z){let D=[],n=[],T=new Set;z.forEach(({userId:B})=>{if(B===H)return;if(!$.has(H)){let K={userId:B,receive:(R,x)=>Y(R,B,x)};$.set(H,K),D.push(K)}T.add(H)});for(let B of $.keys())if(!T.has(B))$.delete(B),n.push({userId:B});if(D.length)Z.onPeerJoined(D);if(n.length)Z.onPeerLeft(n)}return M(),{exitRoom:()=>{_=!0,clearTimeout(A),V.close()}}}function L({userId:Z,appId:H,room:h,host:J,autoRejoin:N=!0,onOpen:b,onClose:q,onError:_,onPeerJoined:Q,onPeerLeft:V,onMessage:A,logLine:X,workerUrl:$}){if(!$)return console.warn("Warning: enterRoom called without workerUrl; this may cause issues in some environments. You should pass workerUrl explicitly. Use:","https://cdn.jsdelivr.net/npm/@dobuki/hello-worker/dist/signal-room.worker.min.js"),g({userId:Z,appId:H,room:h,host:J,autoRejoin:N,onOpen:b,onClose:q,onError:_,onPeerJoined:Q,onPeerLeft:V,onMessage:A});let F=new Worker($,{type:"module"}),Y=!1;function M({userId:z}){return{userId:z,receive:(D,n)=>{if(Y)return!1;return F.postMessage({cmd:"send",toUserId:z,host:J,room:h,type:D,payload:n}),!0}}}let W=(z)=>{let D=z.data;if(D.kind==="open")b?.();else if(D.kind==="close")F.terminate(),q?.(D.ev);else if(D.kind==="error")_?.();else if(D.kind==="peer-joined")Q(D.users.map((n)=>M({userId:n.userId})));else if(D.kind==="peer-left")V(D.users);else if(D.kind==="message")A(D.type,D.payload,M({userId:D.fromUserId}));else if(D.kind==="log")X?.(D.direction,D.obj)};return F.addEventListener("message",W),F.postMessage({cmd:"enter",userId:Z,appId:H,room:h,host:J,autoRejoin:N}),{exitRoom:()=>{Y=!0,F.removeEventListener("message",W),F.postMessage({cmd:"exit"})}}}var y=L;function j({appId:Z,receivePeerConnection:H,peerlessUserExpiration:h=5000,rtcConfig:J={iceServers:[{urls:"stun:stun.l.google.com:19302"}]},enterRoomFunction:N=y,logLine:b=console.debug,onLeaveUser:q,workerUrl:_,onRoomReady:Q,onRoomClose:V}){let A=`user-${crypto.randomUUID()}`,X=new Map;function $(n){return n.pc=new RTCPeerConnection(J),n.pc.onicecandidate=(T)=>{if(!T.candidate)return;n.peer.receive("ice",T.candidate.toJSON())},n.pc.onconnectionstatechange=()=>{b("\uD83D\uDCAC",{event:"pc-state",userId:n.userId,state:n.pc?.connectionState})},n.pc}function F(n){let T=X.get(n.userId),B=!1;if(!T){let K={userId:n.userId,pendingRemoteIce:[],peer:n};X.set(n.userId,K),$(K),T=K,X.set(T.userId,T),B=!0}else if(T)clearTimeout(T.expirationTimeout),T.expirationTimeout=0;if(!T.pc)$(T);return T.peer=n,[T,B]}function Y(n){q?.(n);let T=X.get(n);if(!T)return;try{T.pc?.close()}catch{}X.delete(n)}async function M(n){if(!n.pc?.remoteDescription)return;let T=n.pendingRemoteIce;n.pendingRemoteIce=[];for(let B of T)try{await n.pc.addIceCandidate(B)}catch(K){b("⚠️ ERROR",{error:"add-ice-failed",userId:n.userId,detail:String(K)})}}let W=new Map;function z({room:n,host:T}){let B=`${T}/room/${n}`,K=W.get(B);if(K)K.exitRoom(),W.delete(B)}function D({room:n,host:T}){return new Promise((B,K)=>{async function R(c){let[E]=F(c),C=E.pc,G=await C?.createOffer();await C?.setLocalDescription(G),c.receive("offer",C?.localDescription?.toJSON())}let{exitRoom:x}=N({userId:A,appId:Z,room:n,host:T,logLine:b,workerUrl:_,autoRejoin:!0,onOpen(){Q?.({room:n,host:T}),B()},onError(){console.error("onError"),K()},onClose(c){V?.({room:n,host:T,ev:c})},onPeerJoined(c){c.forEach((E)=>{let[C,G]=F(E);if(!G)return;let S=C.pc;if(!S)return;async function f(){let O=X.get(E.userId);if(O){O.pc=void 0;let k=$(O);H({pc:k,userId:E.userId,initiator:!0,restart:f}),await new Promise((U)=>setTimeout(U,3000)),R(E)}}H({pc:S,userId:E.userId,initiator:!0,restart:f}),R(E)})},onPeerLeft(c){c.forEach(({userId:E})=>{let C=X.get(E);if(!C)return;C.expirationTimeout=setTimeout(()=>Y(E),h??0)})},async onMessage(c,E,C){let[G]=F(C),S=G.pc;if(!S)return;if(c==="offer"){H({pc:S,userId:C.userId,initiator:!1,restart(){G.pc=void 0}}),await S.setRemoteDescription(E);let f=await S.createAnswer();await S.setLocalDescription(f),C.receive("answer",S.localDescription?.toJSON()),await M(G);return}if(c==="answer"){await S.setRemoteDescription(E),await M(G);return}if(c==="ice"){let f=E;if(!S.remoteDescription){G.pendingRemoteIce.push(f);return}try{await S.addIceCandidate(f)}catch(O){b("⚠️ ERROR",{error:"add-ice-failed",userId:G.userId,detail:String(O)})}return}}});W.set(`${T}/room/${n}`,{exitRoom:x,room:n,host:T})})}return{userId:A,enterRoom:D,exitRoom:z,leaveUser:Y,end(){W.forEach(({exitRoom:n})=>n()),W.clear(),X.forEach(({userId:n})=>Y(n)),X.clear()}}}function t({appId:Z,logLine:H=console.debug,enterRoomFunction:h=L,peerlessUserExpiration:J,workerUrl:N,onRoomReady:b,onRoomClose:q,dataChannelOptions:_}){let Q=[],V={iceServers:[{urls:"stun:stun.l.google.com:19302"}]},A=new Set;function X(c,E,C,G){if(C){let S=c.createDataChannel("data",_);$(E,S,G),F.set(E,S)}else{let S=function(f){let O=f.channel;$(E,O,G),F.set(E,O),c.ondatachannel=null};return c.addEventListener("datachannel",S),()=>{c.removeEventListener("datachannel",S)}}}function $(c,E,C){E.onopen=()=>{H("\uD83D\uDCAC",{event:"dc-open",userId:c}),Q.push(c),Y.forEach((S)=>S(c,"join",Q))};let G=({data:S})=>{A.forEach((f)=>f(S,c)),H("\uD83D\uDCAC",{event:"dc-message",userId:c,data:S})};E.addEventListener("message",G),E.addEventListener("close",()=>{H("\uD83D\uDCAC",{event:"dc-close",userId:c}),Q.splice(Q.indexOf(c),1),Y.forEach((S)=>S(c,"leave",Q)),E.removeEventListener("message",G),C?.()}),E.onerror=()=>H("⚠️ ERROR",{error:"dc-error",userId:c})}let F=new Map,Y=new Set,{userId:M,enterRoom:W,exitRoom:z,leaveUser:D,end:n}=j({appId:Z,rtcConfig:V,enterRoomFunction:h,logLine:H,workerUrl:N,peerlessUserExpiration:J,onRoomReady:b,onRoomClose:q,onLeaveUser(c){let E=F.get(c);try{E?.close()}catch{}F.delete(c)},receivePeerConnection({pc:c,userId:E,initiator:C,restart:G}){X(c,E,C,G)}});function T(c,E){F.forEach((C,G)=>{if(E&&G!==E)return;if(C.readyState==="open")C.send(c)})}function B(c){A.delete(c)}function K(c){return A.add(c),()=>{B(c)}}function R(c){Y.delete(c)}function x(c){return Y.add(c),()=>{R(c)}}return{userId:M,send:T,enterRoom:W,exitRoom:z,leaveUser:D,getUsers:()=>Q,addMessageListener:K,removeMessageListener:B,addUserListener:x,removeUserListener:R,end(){F.forEach((c)=>{try{c.close()}catch{}}),F.clear(),n(),Y.clear(),Q.length=0}}}export{t as enterWorld};
1
+ function L(Y){let{userId:F,appId:J,room:h,host:N,autoRejoin:W=!0,logLine:b}=Y,q=!1,H=0,K,$,Q=!0,Z=new Map,V=`wss://${N}/room/${J}/${h}?userId=${encodeURIComponent(F)}`;function X(E,T,n){if(!K)return!1;if(q||K.readyState!==WebSocket.OPEN)return!1;let c={type:E,to:T,payload:n};return K.send(JSON.stringify(c)),b?.("\uD83D\uDC64 ➡️ \uD83D\uDDA5️",c),!0}function M(){if(q)return;K=new WebSocket(V),K.onopen=()=>{if(Q)Y.onOpen?.(),Q=!1;H=0},K.onmessage=(E)=>{try{let T=JSON.parse(E.data);if(b?.("\uD83D\uDDA5️ ➡️ \uD83D\uDC64",T),T.type==="peer-joined"||T.type==="peer-left")C(T.users);else if(T.userId)Y.onMessage(T.type,T.payload,{userId:T.userId,receive:(n,c)=>X(n,T.userId,c)})}catch{b?.("⚠️ ERROR",{error:"invalid-json"})}},K.onclose=(E)=>{let n=[1001,1006,1011,1012,1013].includes(E.code);if(W&&!q&&n){let c=Math.min(Math.pow(2,H)*1000,30000),S=Math.random()*1000,G=c+S;b?.("\uD83D\uDD04 RECONNECTING",{attempt:H+1,delayMs:Math.round(G)}),H++,$=setTimeout(M,G)}else Y.onClose?.({code:E.code,reason:E.reason,wasClean:E.wasClean})},K.onerror=(E)=>{console.error("WS Error",E),Y.onError?.()}}function C(E){let T=[],n=[],c=new Set;E.forEach(({userId:S})=>{if(S===F)return;if(!Z.has(F)){let G={userId:S,receive:(R,x)=>X(R,S,x)};Z.set(F,G),T.push(G)}c.add(F)});for(let S of Z.keys())if(!c.has(S))Z.delete(S),n.push({userId:S});if(T.length)Y.onPeerJoined(T);if(n.length)Y.onPeerLeft(n)}return M(),{exitRoom:()=>{q=!0,clearTimeout($),K.close()}}}function g({userId:Y,appId:F,room:J,host:h,autoRejoin:N=!0,onOpen:W,onClose:b,onError:q,onPeerJoined:H,onPeerLeft:K,onMessage:$,logLine:Q,workerUrl:Z}){if(!Z)return console.warn("Warning: enterRoom called without workerUrl; this may cause issues in some environments. You should pass workerUrl explicitly. Use:","https://cdn.jsdelivr.net/npm/@dobuki/hello-worker/dist/signal-room.worker.min.js"),L({userId:Y,appId:F,room:J,host:h,autoRejoin:N,onOpen:W,onClose:b,onError:q,onPeerJoined:H,onPeerLeft:K,onMessage:$});let V=new Worker(Z,{type:"module"}),X=!1;function M({userId:E}){return{userId:E,receive:(T,n)=>{if(X)return!1;return V.postMessage({cmd:"send",toUserId:E,host:h,room:J,type:T,payload:n}),!0}}}let C=(E)=>{let T=E.data;if(T.kind==="open")W?.();else if(T.kind==="close")V.terminate(),b?.(T.ev);else if(T.kind==="error")q?.();else if(T.kind==="peer-joined")H(T.users.map((n)=>M({userId:n.userId})));else if(T.kind==="peer-left")K(T.users);else if(T.kind==="message")$(T.type,T.payload,M({userId:T.fromUserId}));else if(T.kind==="log")Q?.(T.direction,T.obj)};return V.addEventListener("message",C),V.postMessage({cmd:"enter",userId:Y,appId:F,room:J,host:h,autoRejoin:N}),{exitRoom:()=>{X=!0,V.removeEventListener("message",C),V.postMessage({cmd:"exit"})}}}var U=g;function j({appId:Y,receivePeerConnection:F,peerlessUserExpiration:J=5000,rtcConfig:h={iceServers:[{urls:"stun:stun.l.google.com:19302"}]},enterRoomFunction:N=U,logLine:W=console.debug,onLeaveUser:b,workerUrl:q,onRoomReady:H,onRoomClose:K}){let $=`user-${crypto.randomUUID()}`,Q=new Map;function Z(n){return n.pc=new RTCPeerConnection(h),n.pc.onicecandidate=(c)=>{if(!c.candidate)return;n.peer.receive("ice",c.candidate.toJSON())},n.pc.onconnectionstatechange=()=>{W("\uD83D\uDCAC",{event:"pc-state",userId:n.userId,state:n.pc?.connectionState})},n.pc}function V(n){let c=Q.get(n.userId),S=!1;if(!c){let G={userId:n.userId,pendingRemoteIce:[],peer:n};Q.set(n.userId,G),Z(G),c=G,Q.set(c.userId,c),S=!0}else if(c)clearTimeout(c.expirationTimeout),c.expirationTimeout=0;if(!c.pc)Z(c);return c.peer=n,[c,S]}function X(n){b?.(n);let c=Q.get(n);if(!c)return;try{c.pc?.close()}catch{}Q.delete(n)}async function M(n){if(!n.pc?.remoteDescription)return;let c=n.pendingRemoteIce;n.pendingRemoteIce=[];for(let S of c)try{await n.pc.addIceCandidate(S)}catch(G){W("⚠️ ERROR",{error:"add-ice-failed",userId:n.userId,detail:String(G)})}}let C=new Map;function E({room:n,host:c}){let S=`${c}/room/${n}`,G=C.get(S);if(G)G.exitRoom(),C.delete(S)}function T({room:n,host:c}){return new Promise((S,G)=>{async function R(D){let[f]=V(D),A=f.pc,z=await A?.createOffer();await A?.setLocalDescription(z),D.receive("offer",A?.localDescription?.toJSON())}let{exitRoom:x}=N({userId:$,appId:Y,room:n,host:c,logLine:W,workerUrl:q,autoRejoin:!0,onOpen(){H?.({room:n,host:c}),S()},onError(){console.error("onError"),G()},onClose(D){K?.({room:n,host:c,ev:D})},onPeerJoined(D){D.forEach((f)=>{let[A,z]=V(f);if(!z)return;let B=A.pc;if(!B)return;async function _(){let O=Q.get(f.userId);if(O){O.pc=void 0;let i=Z(O);F({pc:i,userId:f.userId,initiator:!0,restart:_}),await new Promise((k)=>setTimeout(k,3000)),R(f)}}F({pc:B,userId:f.userId,initiator:!0,restart:_}),R(f)})},onPeerLeft(D){D.forEach(({userId:f})=>{let A=Q.get(f);if(!A)return;A.expirationTimeout=setTimeout(()=>X(f),J??0)})},async onMessage(D,f,A){let[z]=V(A),B=z.pc;if(!B)return;if(D==="offer"){F({pc:B,userId:A.userId,initiator:!1,restart(){z.pc=void 0}}),await B.setRemoteDescription(f);let _=await B.createAnswer();await B.setLocalDescription(_),A.receive("answer",B.localDescription?.toJSON()),await M(z);return}if(D==="answer"){await B.setRemoteDescription(f),await M(z);return}if(D==="ice"){let _=f;if(!B.remoteDescription){z.pendingRemoteIce.push(_);return}try{await B.addIceCandidate(_)}catch(O){W("⚠️ ERROR",{error:"add-ice-failed",userId:z.userId,detail:String(O)})}return}}});C.set(`${c}/room/${n}`,{exitRoom:x,room:n,host:c})})}return{userId:$,enterRoom:T,exitRoom:E,leaveUser:X,end(){C.forEach(({exitRoom:n})=>n()),C.clear(),Q.forEach(({userId:n})=>X(n)),Q.clear()}}}function t({appId:Y,logLine:F=console.debug,enterRoomFunction:J=g,peerlessUserExpiration:h,workerUrl:N,onRoomReady:W,onRoomClose:b,dataChannelOptions:q}){let H=[],K={iceServers:[{urls:"stun:stun.l.google.com:19302"}]},$=new Set;function Q(D,f,A,z){if(A){let B=D.createDataChannel("data",q);Z(f,B,z),V.set(f,B)}else{let B=function(_){let O=_.channel;Z(f,O,z),V.set(f,O),D.ondatachannel=null};return D.addEventListener("datachannel",B),()=>{D.removeEventListener("datachannel",B)}}}function Z(D,f,A){f.onopen=()=>{F("\uD83D\uDCAC",{event:"dc-open",userId:D}),H.push(D),X.forEach((B)=>B(D,"join",H))};let z=({data:B})=>{$.forEach((_)=>_(B,D)),F("\uD83D\uDCAC",{event:"dc-message",userId:D,data:B})};f.addEventListener("message",z),f.addEventListener("close",()=>{F("\uD83D\uDCAC",{event:"dc-close",userId:D}),H.splice(H.indexOf(D),1),X.forEach((B)=>B(D,"leave",H)),f.removeEventListener("message",z),A?.()}),f.onerror=()=>F("⚠️ ERROR",{error:"dc-error",userId:D})}let V=new Map,X=new Set,{userId:M,enterRoom:C,exitRoom:E,leaveUser:T,end:n}=j({appId:Y,rtcConfig:K,enterRoomFunction:J,logLine:F,workerUrl:N,peerlessUserExpiration:h,onRoomReady:W,onRoomClose:b,onLeaveUser(D){let f=V.get(D);try{f?.close()}catch{}V.delete(D)},receivePeerConnection({pc:D,userId:f,initiator:A,restart:z}){Q(D,f,A,z)}});function c(D,f){V.forEach((A,z)=>{if(f&&z!==f)return;if(A.readyState==="open")if(typeof D==="string")A.send(D);else A.send(D)})}function S(D){$.delete(D)}function G(D){return $.add(D),()=>{S(D)}}function R(D){X.delete(D)}function x(D){return X.add(D),()=>{R(D)}}return{userId:M,send:c,enterRoom:C,exitRoom:E,leaveUser:T,getUsers:()=>H,addMessageListener:G,removeMessageListener:S,addUserListener:x,removeUserListener:R,end(){V.forEach((D)=>{try{D.close()}catch{}}),V.clear(),n(),X.clear(),H.length=0}}}export{t as enterWorld};
2
2
 
3
- //# debugId=497F41C4C4F5840E64756E2164756E21
3
+ //# debugId=92861AEDB500B4D964756E2164756E21
4
4
  //# sourceMappingURL=enter-world.js.map
@@ -5,9 +5,9 @@
5
5
  "export interface IPeer<T extends string = string, P = any> {\n userId: string;\n receive(type: T, payload: P): boolean;\n}\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 appId: 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<T, P>[]): void;\n onPeerLeft(users: { userId: string }[]): void;\n onMessage(type: T, payload: P, from: IPeer<T, P>): void;\n autoRejoin?: boolean;\n}): { exitRoom: () => void } {\n const { userId, appId, 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<T, P>>();\n const wsUrl = `wss://${host}/room/${appId}/${room}?userId=${encodeURIComponent(\n userId\n )}`;\n\n // Helper for sending (uses the current ws instance)\n function send(type: T, to: string, payload: P) {\n if (!ws) return false;\n if (exited || ws.readyState !== WebSocket.OPEN) return false;\n const obj = { type, to, payload };\n ws.send(JSON.stringify(obj));\n logLine?.(\"👤 ➡️ 🖥️\", obj);\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 // ... (keep your existing JSON parsing and updatePeers logic here)\n try {\n const msg = JSON.parse(e.data);\n logLine?.(\"🖥️ ➡️ 👤\", msg);\n if (msg.type === \"peer-joined\" || msg.type === \"peer-left\") {\n updatePeers(msg.users);\n } else if (msg.userId) {\n params.onMessage(msg.type, msg.payload, {\n userId: msg.userId,\n receive: (type: T, payload: P) => send(type, msg.userId, payload),\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, 30000);\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(updatedUsers: { userId: string }[]) {\n const joined: IPeer<T, P>[] = [];\n const left: { userId: string }[] = [];\n const updatedPeerSet = new Set<string>();\n\n updatedUsers.forEach(({ userId: pUserId }) => {\n if (pUserId === userId) return;\n if (!peers.has(userId)) {\n const newPeer = {\n userId: pUserId,\n receive: (t: T, p: P) => send(t, pUserId, p),\n };\n peers.set(userId, newPeer);\n joined.push(newPeer);\n }\n updatedPeerSet.add(userId);\n });\n\n for (const userId of peers.keys()) {\n if (!updatedPeerSet.has(userId)) {\n peers.delete(userId);\n left.push({ userId });\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);\n if (left.length) params.onPeerLeft(left);\n }\n\n // Start initial connection\n connect();\n\n return {\n exitRoom: () => {\n exited = true;\n clearTimeout(timeoutId);\n ws.close();\n },\n };\n}\n",
6
6
  "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 appId,\n room,\n host,\n autoRejoin = true,\n onOpen,\n onClose,\n onError,\n onPeerJoined,\n onPeerLeft,\n onMessage,\n logLine,\n workerUrl,\n}: {\n userId: string;\n appId: 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<T, P>[]) => void;\n onPeerLeft: (users: { userId: string }[]) => void;\n onMessage: (type: T, payload: P, from: IPeer<T, P>) => 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}): { exitRoom: () => void } {\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 appId,\n room,\n host,\n autoRejoin,\n onOpen,\n onClose,\n onError,\n onPeerJoined,\n onPeerLeft,\n onMessage,\n });\n }\n const worker = new Worker(workerUrl, { type: \"module\" });\n let exited = false;\n\n function makeUser({ userId }: { userId: string }): IPeer<T, P> {\n return {\n userId,\n receive: (type: T, payload: P) => {\n if (exited) return false;\n worker.postMessage({\n cmd: \"send\",\n toUserId: userId,\n host,\n room,\n type,\n payload,\n } as WorkerCommand);\n return true;\n },\n };\n }\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(ev.users.map((ev) => makeUser({ userId: ev.userId })));\n else if (ev.kind === \"peer-left\") onPeerLeft(ev.users);\n else if (ev.kind === \"message\")\n onMessage(ev.type, ev.payload, makeUser({ userId: 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 appId,\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 };\n}\n\nexport type EnterRoom<T extends string, P> = typeof enterRoom<T, P>;\n",
7
7
  "import { IPeer } from \"./impl/signal-room\";\nimport { EnterRoom, enterRoom } from \"./signal-room\";\n\nexport type SigType = \"offer\" | \"answer\" | \"ice\";\nexport type SigPayload = RTCSessionDescriptionInit | RTCIceCandidateInit;\n\ntype UserState = {\n userId: string;\n pc?: RTCPeerConnection;\n\n // ICE that arrived before we had remoteDescription\n pendingRemoteIce: RTCIceCandidateInit[];\n\n // the signaling \"user\" handle so we can send messages\n peer: IPeer<SigType, SigPayload>;\n\n expirationTimeout?: number;\n};\n\nconst DEFAULT_ENTER_ROOM = enterRoom;\n\nexport function collectPeerConnections({\n appId,\n receivePeerConnection,\n peerlessUserExpiration = 5000,\n rtcConfig = { iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }] },\n enterRoomFunction: enterRoom = DEFAULT_ENTER_ROOM,\n logLine = console.debug,\n onLeaveUser,\n workerUrl,\n onRoomReady,\n onRoomClose,\n}: {\n appId: string;\n rtcConfig?: RTCConfiguration;\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 initiator: boolean;\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}) {\n const userId = `user-${crypto.randomUUID()}`;\n const users: Map<string, UserState> = new Map();\n\n function setupPC(state: UserState) {\n state.pc = new RTCPeerConnection(rtcConfig);\n // Send local ICE candidates to this peer\n state.pc.onicecandidate = (ev) => {\n if (!ev.candidate) return;\n state.peer.receive(\"ice\", ev.candidate.toJSON());\n };\n\n state.pc.onconnectionstatechange = () => {\n logLine(\"💬\", {\n event: \"pc-state\",\n userId: state.userId,\n state: state.pc?.connectionState,\n });\n };\n return state.pc;\n }\n\n function getPeer(peer: IPeer<SigType, SigPayload>): [UserState, boolean] {\n let state = users.get(peer.userId);\n let isNewPeer = false;\n if (!state) {\n const newState: UserState = {\n userId: peer.userId,\n pendingRemoteIce: [],\n peer,\n };\n users.set(peer.userId, newState);\n\n setupPC(newState);\n state = newState;\n\n // New user\n users.set(state.userId, state);\n isNewPeer = true;\n } else if (state) {\n clearTimeout(state.expirationTimeout);\n state.expirationTimeout = 0;\n }\n if (!state.pc) {\n setupPC(state);\n }\n state.peer = peer;\n return [state, isNewPeer];\n }\n\n function leaveUser(userId: string) {\n onLeaveUser?.(userId);\n const p = users.get(userId);\n if (!p) return;\n try {\n p.pc?.close();\n } catch {}\n users.delete(userId);\n }\n\n async function flushRemoteIce(state: UserState) {\n if (!state.pc?.remoteDescription) return;\n\n const queued = state.pendingRemoteIce;\n state.pendingRemoteIce = [];\n\n for (const ice of queued) {\n try {\n await state.pc.addIceCandidate(ice);\n } catch (e) {\n logLine(\"⚠️ ERROR\", {\n error: \"add-ice-failed\",\n userId: state.userId,\n detail: String(e),\n });\n }\n }\n }\n\n const roomsEntered = new Map<\n string,\n { room: string; host: string; exitRoom: () => void }\n >();\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>((resolve, reject) => {\n async function makeOffer(user: IPeer) {\n // Offer flow: createOffer -> setLocalDescription -> send localDescription\n const [state] = getPeer(user);\n const pc = state.pc;\n const offer = await pc?.createOffer();\n await pc?.setLocalDescription(offer);\n user.receive(\"offer\", pc?.localDescription?.toJSON()!);\n }\n\n const { exitRoom } = enterRoom({\n userId,\n appId,\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) {\n onRoomClose?.({ room, host, ev });\n },\n\n // Existing peers initiate to the newcomer (Option 1)\n onPeerJoined(joiningUsers: IPeer<SigType, SigPayload>[]) {\n joiningUsers.forEach((user) => {\n const [state, isNewPeer] = getPeer(user);\n if (!isNewPeer) return;\n const pc = state.pc;\n if (!pc) return;\n\n async function restart() {\n const state = users.get(user.userId);\n if (state) {\n state.pc = undefined;\n const pc = setupPC(state);\n receivePeerConnection({\n pc,\n userId: user.userId,\n initiator: true,\n restart,\n });\n await new Promise((resolve) => setTimeout(resolve, 3000));\n makeOffer(user);\n }\n }\n\n receivePeerConnection({\n pc,\n userId: user.userId,\n initiator: true,\n restart,\n });\n makeOffer(user);\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 async onMessage(type: SigType, payload: any, from: IPeer) {\n const [state] = getPeer(from);\n const pc = state.pc;\n if (!pc) return;\n\n if (type === \"offer\") {\n receivePeerConnection({\n pc,\n userId: from.userId,\n initiator: false,\n restart() {\n // reset PC\n state.pc = undefined;\n },\n });\n // Responder: set remote offer\n await pc.setRemoteDescription(payload as RTCSessionDescriptionInit);\n\n // Create and send answer\n const answer = await pc.createAnswer();\n await pc.setLocalDescription(answer);\n\n from.receive(\"answer\", pc.localDescription?.toJSON()!);\n\n // Now safe to apply any queued ICE from this peer\n await flushRemoteIce(state);\n return;\n }\n\n if (type === \"answer\") {\n // Initiator: set remote answer\n await pc.setRemoteDescription(payload as RTCSessionDescriptionInit);\n await flushRemoteIce(state);\n return;\n }\n\n if (type === \"ice\") {\n const ice = payload as RTCIceCandidateInit;\n\n // If we don't have remoteDescription yet, queue it\n if (!pc.remoteDescription) {\n state.pendingRemoteIce.push(ice);\n return;\n }\n\n try {\n await pc.addIceCandidate(ice);\n } catch (e) {\n logLine(\"⚠️ ERROR\", {\n error: \"add-ice-failed\",\n userId: state.userId,\n detail: String(e),\n });\n }\n return;\n }\n },\n });\n roomsEntered.set(`${host}/room/${room}`, { exitRoom, room, host });\n });\n }\n\n return {\n userId,\n enterRoom: enter,\n exitRoom: exit,\n leaveUser,\n end() {\n roomsEntered.forEach(({ exitRoom }) => exitRoom());\n roomsEntered.clear();\n users.forEach(({ userId }) => leaveUser(userId));\n users.clear();\n },\n };\n}\n",
8
- "import { EnterRoom, enterRoom } from \"./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 appId,\n logLine = console.debug,\n enterRoomFunction = enterRoom,\n peerlessUserExpiration,\n workerUrl,\n onRoomReady,\n onRoomClose,\n dataChannelOptions,\n}: {\n appId: string;\n logLine?: (direction: string, 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: string[] = [];\n const rtcConfig: RTCConfiguration = {\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n };\n\n const messagesListeners = new Set<(data: any, from: string) => void>();\n\n function createDataChannel(\n pc: RTCPeerConnection,\n peerUserId: string,\n initiator: boolean,\n restart?: () => void\n ) {\n if (initiator) {\n const dc = pc.createDataChannel(\"data\", dataChannelOptions);\n wireDataChannel(peerUserId, dc, restart);\n dataChannels.set(peerUserId, dc);\n } else {\n function listener(ev: RTCDataChannelEvent) {\n const dc = ev.channel;\n wireDataChannel(peerUserId, dc, restart);\n dataChannels.set(peerUserId, dc);\n pc.ondatachannel = null;\n }\n pc.addEventListener(\"datachannel\", listener);\n return () => {\n pc.removeEventListener(\"datachannel\", listener);\n };\n }\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.push(userId);\n userListeners.forEach((listener) => listener(userId, \"join\", userIds));\n };\n const onmessage = ({ data }: MessageEvent) => {\n messagesListeners.forEach((listener) => listener(data as any, userId));\n logLine(\"💬\", { event: \"dc-message\", userId, data });\n };\n dc.addEventListener(\"message\", onmessage);\n dc.addEventListener(\"close\", () => {\n logLine(\"💬\", { event: \"dc-close\", userId });\n userIds.splice(userIds.indexOf(userId), 1);\n userListeners.forEach((listener) => listener(userId, \"leave\", userIds));\n dc.removeEventListener(\"message\", onmessage);\n restart?.();\n });\n dc.onerror = () => logLine(\"⚠️ ERROR\", { error: \"dc-error\", userId });\n }\n\n const dataChannels = new Map<string, RTCDataChannel>();\n const userListeners = new Set<UserListener>();\n\n const {\n userId,\n enterRoom,\n exitRoom,\n leaveUser,\n end: endPeerCollection,\n } = collectPeerConnections({\n appId,\n rtcConfig,\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, initiator, restart }) {\n createDataChannel(pc, userId, initiator, restart);\n },\n });\n\n function send(data: any, userId?: string) {\n dataChannels.forEach((dataChannel, pUserId) => {\n if (userId && pUserId !== userId) return;\n if (dataChannel.readyState === \"open\") dataChannel.send(data);\n });\n }\n\n function removeMessageListener(listener: (data: any, from: string) => void) {\n messagesListeners.delete(listener);\n }\n\n function addMessageListener(listener: (data: any, 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 enterRoom,\n exitRoom,\n leaveUser,\n getUsers: () => userIds,\n addMessageListener,\n removeMessageListener,\n addUserListener,\n removeUserListener,\n end() {\n dataChannels.forEach((dataChannel) => {\n try {\n dataChannel.close();\n } catch {}\n });\n dataChannels.clear();\n endPeerCollection();\n userListeners.clear();\n userIds.length = 0;\n },\n };\n}\n"
8
+ "import { EnterRoom, enterRoom } from \"./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<D extends string | ArrayBufferView<ArrayBuffer>>({\n appId,\n logLine = console.debug,\n enterRoomFunction = enterRoom,\n peerlessUserExpiration,\n workerUrl,\n onRoomReady,\n onRoomClose,\n dataChannelOptions,\n}: {\n appId: string;\n logLine?: (direction: string, 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: string[] = [];\n const rtcConfig: RTCConfiguration = {\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n };\n\n const messagesListeners = new Set<(data: any, from: string) => void>();\n\n function createDataChannel(\n pc: RTCPeerConnection,\n peerUserId: string,\n initiator: boolean,\n restart?: () => void\n ) {\n if (initiator) {\n const dc = pc.createDataChannel(\"data\", dataChannelOptions);\n wireDataChannel(peerUserId, dc, restart);\n dataChannels.set(peerUserId, dc);\n } else {\n function listener(ev: RTCDataChannelEvent) {\n const dc = ev.channel;\n wireDataChannel(peerUserId, dc, restart);\n dataChannels.set(peerUserId, dc);\n pc.ondatachannel = null;\n }\n pc.addEventListener(\"datachannel\", listener);\n return () => {\n pc.removeEventListener(\"datachannel\", listener);\n };\n }\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.push(userId);\n userListeners.forEach((listener) => listener(userId, \"join\", userIds));\n };\n const onmessage = ({ data }: MessageEvent) => {\n messagesListeners.forEach((listener) => listener(data as any, userId));\n logLine(\"💬\", { event: \"dc-message\", userId, data });\n };\n dc.addEventListener(\"message\", onmessage);\n dc.addEventListener(\"close\", () => {\n logLine(\"💬\", { event: \"dc-close\", userId });\n userIds.splice(userIds.indexOf(userId), 1);\n userListeners.forEach((listener) => listener(userId, \"leave\", userIds));\n dc.removeEventListener(\"message\", onmessage);\n restart?.();\n });\n dc.onerror = () => logLine(\"⚠️ ERROR\", { error: \"dc-error\", userId });\n }\n\n const dataChannels = new Map<string, RTCDataChannel>();\n const userListeners = new Set<UserListener>();\n\n const {\n userId,\n enterRoom,\n exitRoom,\n leaveUser,\n end: endPeerCollection,\n } = collectPeerConnections({\n appId,\n rtcConfig,\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, initiator, restart }) {\n createDataChannel(pc, userId, initiator, restart);\n },\n });\n\n function send(data: D, userId?: string) {\n dataChannels.forEach((dataChannel, pUserId) => {\n if (userId && pUserId !== userId) return;\n if (dataChannel.readyState === \"open\") {\n if (typeof data === \"string\") {\n dataChannel.send(data);\n } else {\n dataChannel.send(data);\n }\n }\n });\n }\n\n function removeMessageListener(listener: (data: D, from: string) => void) {\n messagesListeners.delete(listener);\n }\n\n function addMessageListener(listener: (data: D, 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 enterRoom,\n exitRoom,\n leaveUser,\n getUsers: () => userIds,\n addMessageListener,\n removeMessageListener,\n addUserListener,\n removeUserListener,\n end() {\n dataChannels.forEach((dataChannel) => {\n try {\n dataChannel.close();\n } catch {}\n });\n dataChannels.clear();\n endPeerCollection();\n userListeners.clear();\n userIds.length = 0;\n },\n };\n}\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "497F41C4C4F5840E64756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "92861AEDB500B4D964756E2164756E21",
12
12
  "names": []
13
13
  }
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- function g(W){let{userId:F,appId:h,room:J,host:R,autoRejoin:$=!0,logLine:A}=W,q=!1,H=0,K,Y,Q=!0,X=new Map,z=`wss://${R}/room/${h}/${J}?userId=${encodeURIComponent(F)}`;function V(S,D,n){if(!K)return!1;if(q||K.readyState!==WebSocket.OPEN)return!1;let T={type:S,to:D,payload:n};return K.send(JSON.stringify(T)),A?.("\uD83D\uDC64 ➡️ \uD83D\uDDA5️",T),!0}function M(){if(q)return;K=new WebSocket(z),K.onopen=()=>{if(Q)W.onOpen?.(),Q=!1;H=0},K.onmessage=(S)=>{try{let D=JSON.parse(S.data);if(A?.("\uD83D\uDDA5️ ➡️ \uD83D\uDC64",D),D.type==="peer-joined"||D.type==="peer-left")Z(D.users);else if(D.userId)W.onMessage(D.type,D.payload,{userId:D.userId,receive:(n,T)=>V(n,D.userId,T)})}catch{A?.("⚠️ ERROR",{error:"invalid-json"})}},K.onclose=(S)=>{let n=[1001,1006,1011,1012,1013].includes(S.code);if($&&!q&&n){let T=Math.min(Math.pow(2,H)*1000,30000),b=Math.random()*1000,G=T+b;A?.("\uD83D\uDD04 RECONNECTING",{attempt:H+1,delayMs:Math.round(G)}),H++,Y=setTimeout(M,G)}else W.onClose?.({code:S.code,reason:S.reason,wasClean:S.wasClean})},K.onerror=(S)=>{console.error("WS Error",S),W.onError?.()}}function Z(S){let D=[],n=[],T=new Set;S.forEach(({userId:b})=>{if(b===F)return;if(!X.has(F)){let G={userId:b,receive:(N,O)=>V(N,b,O)};X.set(F,G),D.push(G)}T.add(F)});for(let b of X.keys())if(!T.has(b))X.delete(b),n.push({userId:b});if(D.length)W.onPeerJoined(D);if(n.length)W.onPeerLeft(n)}return M(),{exitRoom:()=>{q=!0,clearTimeout(Y),K.close()}}}function L({userId:W,appId:F,room:h,host:J,autoRejoin:R=!0,onOpen:$,onClose:A,onError:q,onPeerJoined:H,onPeerLeft:K,onMessage:Y,logLine:Q,workerUrl:X}){if(!X)return console.warn("Warning: enterRoom called without workerUrl; this may cause issues in some environments. You should pass workerUrl explicitly. Use:","https://cdn.jsdelivr.net/npm/@dobuki/hello-worker/dist/signal-room.worker.min.js"),g({userId:W,appId:F,room:h,host:J,autoRejoin:R,onOpen:$,onClose:A,onError:q,onPeerJoined:H,onPeerLeft:K,onMessage:Y});let z=new Worker(X,{type:"module"}),V=!1;function M({userId:S}){return{userId:S,receive:(D,n)=>{if(V)return!1;return z.postMessage({cmd:"send",toUserId:S,host:J,room:h,type:D,payload:n}),!0}}}let Z=(S)=>{let D=S.data;if(D.kind==="open")$?.();else if(D.kind==="close")z.terminate(),A?.(D.ev);else if(D.kind==="error")q?.();else if(D.kind==="peer-joined")H(D.users.map((n)=>M({userId:n.userId})));else if(D.kind==="peer-left")K(D.users);else if(D.kind==="message")Y(D.type,D.payload,M({userId:D.fromUserId}));else if(D.kind==="log")Q?.(D.direction,D.obj)};return z.addEventListener("message",Z),z.postMessage({cmd:"enter",userId:W,appId:F,room:h,host:J,autoRejoin:R}),{exitRoom:()=>{V=!0,z.removeEventListener("message",Z),z.postMessage({cmd:"exit"})}}}var P=L;function j({appId:W,receivePeerConnection:F,peerlessUserExpiration:h=5000,rtcConfig:J={iceServers:[{urls:"stun:stun.l.google.com:19302"}]},enterRoomFunction:R=P,logLine:$=console.debug,onLeaveUser:A,workerUrl:q,onRoomReady:H,onRoomClose:K}){let Y=`user-${crypto.randomUUID()}`,Q=new Map;function X(n){return n.pc=new RTCPeerConnection(J),n.pc.onicecandidate=(T)=>{if(!T.candidate)return;n.peer.receive("ice",T.candidate.toJSON())},n.pc.onconnectionstatechange=()=>{$("\uD83D\uDCAC",{event:"pc-state",userId:n.userId,state:n.pc?.connectionState})},n.pc}function z(n){let T=Q.get(n.userId),b=!1;if(!T){let G={userId:n.userId,pendingRemoteIce:[],peer:n};Q.set(n.userId,G),X(G),T=G,Q.set(T.userId,T),b=!0}else if(T)clearTimeout(T.expirationTimeout),T.expirationTimeout=0;if(!T.pc)X(T);return T.peer=n,[T,b]}function V(n){A?.(n);let T=Q.get(n);if(!T)return;try{T.pc?.close()}catch{}Q.delete(n)}async function M(n){if(!n.pc?.remoteDescription)return;let T=n.pendingRemoteIce;n.pendingRemoteIce=[];for(let b of T)try{await n.pc.addIceCandidate(b)}catch(G){$("⚠️ ERROR",{error:"add-ice-failed",userId:n.userId,detail:String(G)})}}let Z=new Map;function S({room:n,host:T}){let b=`${T}/room/${n}`,G=Z.get(b);if(G)G.exitRoom(),Z.delete(b)}function D({room:n,host:T}){return new Promise((b,G)=>{async function N(c){let[f]=z(c),C=f.pc,B=await C?.createOffer();await C?.setLocalDescription(B),c.receive("offer",C?.localDescription?.toJSON())}let{exitRoom:O}=R({userId:Y,appId:W,room:n,host:T,logLine:$,workerUrl:q,autoRejoin:!0,onOpen(){H?.({room:n,host:T}),b()},onError(){console.error("onError"),G()},onClose(c){K?.({room:n,host:T,ev:c})},onPeerJoined(c){c.forEach((f)=>{let[C,B]=z(f);if(!B)return;let E=C.pc;if(!E)return;async function _(){let x=Q.get(f.userId);if(x){x.pc=void 0;let i=X(x);F({pc:i,userId:f.userId,initiator:!0,restart:_}),await new Promise((k)=>setTimeout(k,3000)),N(f)}}F({pc:E,userId:f.userId,initiator:!0,restart:_}),N(f)})},onPeerLeft(c){c.forEach(({userId:f})=>{let C=Q.get(f);if(!C)return;C.expirationTimeout=setTimeout(()=>V(f),h??0)})},async onMessage(c,f,C){let[B]=z(C),E=B.pc;if(!E)return;if(c==="offer"){F({pc:E,userId:C.userId,initiator:!1,restart(){B.pc=void 0}}),await E.setRemoteDescription(f);let _=await E.createAnswer();await E.setLocalDescription(_),C.receive("answer",E.localDescription?.toJSON()),await M(B);return}if(c==="answer"){await E.setRemoteDescription(f),await M(B);return}if(c==="ice"){let _=f;if(!E.remoteDescription){B.pendingRemoteIce.push(_);return}try{await E.addIceCandidate(_)}catch(x){$("⚠️ ERROR",{error:"add-ice-failed",userId:B.userId,detail:String(x)})}return}}});Z.set(`${T}/room/${n}`,{exitRoom:O,room:n,host:T})})}return{userId:Y,enterRoom:D,exitRoom:S,leaveUser:V,end(){Z.forEach(({exitRoom:n})=>n()),Z.clear(),Q.forEach(({userId:n})=>V(n)),Q.clear()}}}function U({appId:W,logLine:F=console.debug,enterRoomFunction:h=L,peerlessUserExpiration:J,workerUrl:R,onRoomReady:$,onRoomClose:A,dataChannelOptions:q}){let H=[],K={iceServers:[{urls:"stun:stun.l.google.com:19302"}]},Y=new Set;function Q(c,f,C,B){if(C){let E=c.createDataChannel("data",q);X(f,E,B),z.set(f,E)}else{let E=function(_){let x=_.channel;X(f,x,B),z.set(f,x),c.ondatachannel=null};return c.addEventListener("datachannel",E),()=>{c.removeEventListener("datachannel",E)}}}function X(c,f,C){f.onopen=()=>{F("\uD83D\uDCAC",{event:"dc-open",userId:c}),H.push(c),V.forEach((E)=>E(c,"join",H))};let B=({data:E})=>{Y.forEach((_)=>_(E,c)),F("\uD83D\uDCAC",{event:"dc-message",userId:c,data:E})};f.addEventListener("message",B),f.addEventListener("close",()=>{F("\uD83D\uDCAC",{event:"dc-close",userId:c}),H.splice(H.indexOf(c),1),V.forEach((E)=>E(c,"leave",H)),f.removeEventListener("message",B),C?.()}),f.onerror=()=>F("⚠️ ERROR",{error:"dc-error",userId:c})}let z=new Map,V=new Set,{userId:M,enterRoom:Z,exitRoom:S,leaveUser:D,end:n}=j({appId:W,rtcConfig:K,enterRoomFunction:h,logLine:F,workerUrl:R,peerlessUserExpiration:J,onRoomReady:$,onRoomClose:A,onLeaveUser(c){let f=z.get(c);try{f?.close()}catch{}z.delete(c)},receivePeerConnection({pc:c,userId:f,initiator:C,restart:B}){Q(c,f,C,B)}});function T(c,f){z.forEach((C,B)=>{if(f&&B!==f)return;if(C.readyState==="open")C.send(c)})}function b(c){Y.delete(c)}function G(c){return Y.add(c),()=>{b(c)}}function N(c){V.delete(c)}function O(c){return V.add(c),()=>{N(c)}}return{userId:M,send:T,enterRoom:Z,exitRoom:S,leaveUser:D,getUsers:()=>H,addMessageListener:G,removeMessageListener:b,addUserListener:O,removeUserListener:N,end(){z.forEach((c)=>{try{c.close()}catch{}}),z.clear(),n(),V.clear(),H.length=0}}}export{U as enterWorld,g as enterRoom,j as collectPeerConnections};
1
+ function L(Q){let{userId:z,appId:x,room:J,host:R,autoRejoin:Z=!0,logLine:$}=Q,q=!1,F=0,G,X,H=!0,W=new Map,A=`wss://${R}/room/${x}/${J}?userId=${encodeURIComponent(z)}`;function K(E,f,n){if(!G)return!1;if(q||G.readyState!==WebSocket.OPEN)return!1;let D={type:E,to:f,payload:n};return G.send(JSON.stringify(D)),$?.("\uD83D\uDC64 ➡️ \uD83D\uDDA5️",D),!0}function M(){if(q)return;G=new WebSocket(A),G.onopen=()=>{if(H)Q.onOpen?.(),H=!1;F=0},G.onmessage=(E)=>{try{let f=JSON.parse(E.data);if($?.("\uD83D\uDDA5️ ➡️ \uD83D\uDC64",f),f.type==="peer-joined"||f.type==="peer-left")Y(f.users);else if(f.userId)Q.onMessage(f.type,f.payload,{userId:f.userId,receive:(n,D)=>K(n,f.userId,D)})}catch{$?.("⚠️ ERROR",{error:"invalid-json"})}},G.onclose=(E)=>{let n=[1001,1006,1011,1012,1013].includes(E.code);if(Z&&!q&&n){let D=Math.min(Math.pow(2,F)*1000,30000),S=Math.random()*1000,C=D+S;$?.("\uD83D\uDD04 RECONNECTING",{attempt:F+1,delayMs:Math.round(C)}),F++,X=setTimeout(M,C)}else Q.onClose?.({code:E.code,reason:E.reason,wasClean:E.wasClean})},G.onerror=(E)=>{console.error("WS Error",E),Q.onError?.()}}function Y(E){let f=[],n=[],D=new Set;E.forEach(({userId:S})=>{if(S===z)return;if(!W.has(z)){let C={userId:S,receive:(N,O)=>K(N,S,O)};W.set(z,C),f.push(C)}D.add(z)});for(let S of W.keys())if(!D.has(S))W.delete(S),n.push({userId:S});if(f.length)Q.onPeerJoined(f);if(n.length)Q.onPeerLeft(n)}return M(),{exitRoom:()=>{q=!0,clearTimeout(X),G.close()}}}function g({userId:Q,appId:z,room:x,host:J,autoRejoin:R=!0,onOpen:Z,onClose:$,onError:q,onPeerJoined:F,onPeerLeft:G,onMessage:X,logLine:H,workerUrl:W}){if(!W)return console.warn("Warning: enterRoom called without workerUrl; this may cause issues in some environments. You should pass workerUrl explicitly. Use:","https://cdn.jsdelivr.net/npm/@dobuki/hello-worker/dist/signal-room.worker.min.js"),L({userId:Q,appId:z,room:x,host:J,autoRejoin:R,onOpen:Z,onClose:$,onError:q,onPeerJoined:F,onPeerLeft:G,onMessage:X});let A=new Worker(W,{type:"module"}),K=!1;function M({userId:E}){return{userId:E,receive:(f,n)=>{if(K)return!1;return A.postMessage({cmd:"send",toUserId:E,host:J,room:x,type:f,payload:n}),!0}}}let Y=(E)=>{let f=E.data;if(f.kind==="open")Z?.();else if(f.kind==="close")A.terminate(),$?.(f.ev);else if(f.kind==="error")q?.();else if(f.kind==="peer-joined")F(f.users.map((n)=>M({userId:n.userId})));else if(f.kind==="peer-left")G(f.users);else if(f.kind==="message")X(f.type,f.payload,M({userId:f.fromUserId}));else if(f.kind==="log")H?.(f.direction,f.obj)};return A.addEventListener("message",Y),A.postMessage({cmd:"enter",userId:Q,appId:z,room:x,host:J,autoRejoin:R}),{exitRoom:()=>{K=!0,A.removeEventListener("message",Y),A.postMessage({cmd:"exit"})}}}var P=g;function j({appId:Q,receivePeerConnection:z,peerlessUserExpiration:x=5000,rtcConfig:J={iceServers:[{urls:"stun:stun.l.google.com:19302"}]},enterRoomFunction:R=P,logLine:Z=console.debug,onLeaveUser:$,workerUrl:q,onRoomReady:F,onRoomClose:G}){let X=`user-${crypto.randomUUID()}`,H=new Map;function W(n){return n.pc=new RTCPeerConnection(J),n.pc.onicecandidate=(D)=>{if(!D.candidate)return;n.peer.receive("ice",D.candidate.toJSON())},n.pc.onconnectionstatechange=()=>{Z("\uD83D\uDCAC",{event:"pc-state",userId:n.userId,state:n.pc?.connectionState})},n.pc}function A(n){let D=H.get(n.userId),S=!1;if(!D){let C={userId:n.userId,pendingRemoteIce:[],peer:n};H.set(n.userId,C),W(C),D=C,H.set(D.userId,D),S=!0}else if(D)clearTimeout(D.expirationTimeout),D.expirationTimeout=0;if(!D.pc)W(D);return D.peer=n,[D,S]}function K(n){$?.(n);let D=H.get(n);if(!D)return;try{D.pc?.close()}catch{}H.delete(n)}async function M(n){if(!n.pc?.remoteDescription)return;let D=n.pendingRemoteIce;n.pendingRemoteIce=[];for(let S of D)try{await n.pc.addIceCandidate(S)}catch(C){Z("⚠️ ERROR",{error:"add-ice-failed",userId:n.userId,detail:String(C)})}}let Y=new Map;function E({room:n,host:D}){let S=`${D}/room/${n}`,C=Y.get(S);if(C)C.exitRoom(),Y.delete(S)}function f({room:n,host:D}){return new Promise((S,C)=>{async function N(c){let[T]=A(c),b=T.pc,V=await b?.createOffer();await b?.setLocalDescription(V),c.receive("offer",b?.localDescription?.toJSON())}let{exitRoom:O}=R({userId:X,appId:Q,room:n,host:D,logLine:Z,workerUrl:q,autoRejoin:!0,onOpen(){F?.({room:n,host:D}),S()},onError(){console.error("onError"),C()},onClose(c){G?.({room:n,host:D,ev:c})},onPeerJoined(c){c.forEach((T)=>{let[b,V]=A(T);if(!V)return;let B=b.pc;if(!B)return;async function _(){let h=H.get(T.userId);if(h){h.pc=void 0;let i=W(h);z({pc:i,userId:T.userId,initiator:!0,restart:_}),await new Promise((k)=>setTimeout(k,3000)),N(T)}}z({pc:B,userId:T.userId,initiator:!0,restart:_}),N(T)})},onPeerLeft(c){c.forEach(({userId:T})=>{let b=H.get(T);if(!b)return;b.expirationTimeout=setTimeout(()=>K(T),x??0)})},async onMessage(c,T,b){let[V]=A(b),B=V.pc;if(!B)return;if(c==="offer"){z({pc:B,userId:b.userId,initiator:!1,restart(){V.pc=void 0}}),await B.setRemoteDescription(T);let _=await B.createAnswer();await B.setLocalDescription(_),b.receive("answer",B.localDescription?.toJSON()),await M(V);return}if(c==="answer"){await B.setRemoteDescription(T),await M(V);return}if(c==="ice"){let _=T;if(!B.remoteDescription){V.pendingRemoteIce.push(_);return}try{await B.addIceCandidate(_)}catch(h){Z("⚠️ ERROR",{error:"add-ice-failed",userId:V.userId,detail:String(h)})}return}}});Y.set(`${D}/room/${n}`,{exitRoom:O,room:n,host:D})})}return{userId:X,enterRoom:f,exitRoom:E,leaveUser:K,end(){Y.forEach(({exitRoom:n})=>n()),Y.clear(),H.forEach(({userId:n})=>K(n)),H.clear()}}}function U({appId:Q,logLine:z=console.debug,enterRoomFunction:x=g,peerlessUserExpiration:J,workerUrl:R,onRoomReady:Z,onRoomClose:$,dataChannelOptions:q}){let F=[],G={iceServers:[{urls:"stun:stun.l.google.com:19302"}]},X=new Set;function H(c,T,b,V){if(b){let B=c.createDataChannel("data",q);W(T,B,V),A.set(T,B)}else{let B=function(_){let h=_.channel;W(T,h,V),A.set(T,h),c.ondatachannel=null};return c.addEventListener("datachannel",B),()=>{c.removeEventListener("datachannel",B)}}}function W(c,T,b){T.onopen=()=>{z("\uD83D\uDCAC",{event:"dc-open",userId:c}),F.push(c),K.forEach((B)=>B(c,"join",F))};let V=({data:B})=>{X.forEach((_)=>_(B,c)),z("\uD83D\uDCAC",{event:"dc-message",userId:c,data:B})};T.addEventListener("message",V),T.addEventListener("close",()=>{z("\uD83D\uDCAC",{event:"dc-close",userId:c}),F.splice(F.indexOf(c),1),K.forEach((B)=>B(c,"leave",F)),T.removeEventListener("message",V),b?.()}),T.onerror=()=>z("⚠️ ERROR",{error:"dc-error",userId:c})}let A=new Map,K=new Set,{userId:M,enterRoom:Y,exitRoom:E,leaveUser:f,end:n}=j({appId:Q,rtcConfig:G,enterRoomFunction:x,logLine:z,workerUrl:R,peerlessUserExpiration:J,onRoomReady:Z,onRoomClose:$,onLeaveUser(c){let T=A.get(c);try{T?.close()}catch{}A.delete(c)},receivePeerConnection({pc:c,userId:T,initiator:b,restart:V}){H(c,T,b,V)}});function D(c,T){A.forEach((b,V)=>{if(T&&V!==T)return;if(b.readyState==="open")if(typeof c==="string")b.send(c);else b.send(c)})}function S(c){X.delete(c)}function C(c){return X.add(c),()=>{S(c)}}function N(c){K.delete(c)}function O(c){return K.add(c),()=>{N(c)}}return{userId:M,send:D,enterRoom:Y,exitRoom:E,leaveUser:f,getUsers:()=>F,addMessageListener:C,removeMessageListener:S,addUserListener:O,removeUserListener:N,end(){A.forEach((c)=>{try{c.close()}catch{}}),A.clear(),n(),K.clear(),F.length=0}}}export{U as enterWorld,L as enterRoom,j as collectPeerConnections};
2
2
 
3
- //# debugId=59967B43AFDC32C064756E2164756E21
3
+ //# debugId=AD8A0D15BDA71D6664756E2164756E21
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -5,9 +5,9 @@
5
5
  "export interface IPeer<T extends string = string, P = any> {\n userId: string;\n receive(type: T, payload: P): boolean;\n}\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 appId: 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<T, P>[]): void;\n onPeerLeft(users: { userId: string }[]): void;\n onMessage(type: T, payload: P, from: IPeer<T, P>): void;\n autoRejoin?: boolean;\n}): { exitRoom: () => void } {\n const { userId, appId, 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<T, P>>();\n const wsUrl = `wss://${host}/room/${appId}/${room}?userId=${encodeURIComponent(\n userId\n )}`;\n\n // Helper for sending (uses the current ws instance)\n function send(type: T, to: string, payload: P) {\n if (!ws) return false;\n if (exited || ws.readyState !== WebSocket.OPEN) return false;\n const obj = { type, to, payload };\n ws.send(JSON.stringify(obj));\n logLine?.(\"👤 ➡️ 🖥️\", obj);\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 // ... (keep your existing JSON parsing and updatePeers logic here)\n try {\n const msg = JSON.parse(e.data);\n logLine?.(\"🖥️ ➡️ 👤\", msg);\n if (msg.type === \"peer-joined\" || msg.type === \"peer-left\") {\n updatePeers(msg.users);\n } else if (msg.userId) {\n params.onMessage(msg.type, msg.payload, {\n userId: msg.userId,\n receive: (type: T, payload: P) => send(type, msg.userId, payload),\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, 30000);\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(updatedUsers: { userId: string }[]) {\n const joined: IPeer<T, P>[] = [];\n const left: { userId: string }[] = [];\n const updatedPeerSet = new Set<string>();\n\n updatedUsers.forEach(({ userId: pUserId }) => {\n if (pUserId === userId) return;\n if (!peers.has(userId)) {\n const newPeer = {\n userId: pUserId,\n receive: (t: T, p: P) => send(t, pUserId, p),\n };\n peers.set(userId, newPeer);\n joined.push(newPeer);\n }\n updatedPeerSet.add(userId);\n });\n\n for (const userId of peers.keys()) {\n if (!updatedPeerSet.has(userId)) {\n peers.delete(userId);\n left.push({ userId });\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);\n if (left.length) params.onPeerLeft(left);\n }\n\n // Start initial connection\n connect();\n\n return {\n exitRoom: () => {\n exited = true;\n clearTimeout(timeoutId);\n ws.close();\n },\n };\n}\n",
6
6
  "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 appId,\n room,\n host,\n autoRejoin = true,\n onOpen,\n onClose,\n onError,\n onPeerJoined,\n onPeerLeft,\n onMessage,\n logLine,\n workerUrl,\n}: {\n userId: string;\n appId: 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<T, P>[]) => void;\n onPeerLeft: (users: { userId: string }[]) => void;\n onMessage: (type: T, payload: P, from: IPeer<T, P>) => 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}): { exitRoom: () => void } {\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 appId,\n room,\n host,\n autoRejoin,\n onOpen,\n onClose,\n onError,\n onPeerJoined,\n onPeerLeft,\n onMessage,\n });\n }\n const worker = new Worker(workerUrl, { type: \"module\" });\n let exited = false;\n\n function makeUser({ userId }: { userId: string }): IPeer<T, P> {\n return {\n userId,\n receive: (type: T, payload: P) => {\n if (exited) return false;\n worker.postMessage({\n cmd: \"send\",\n toUserId: userId,\n host,\n room,\n type,\n payload,\n } as WorkerCommand);\n return true;\n },\n };\n }\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(ev.users.map((ev) => makeUser({ userId: ev.userId })));\n else if (ev.kind === \"peer-left\") onPeerLeft(ev.users);\n else if (ev.kind === \"message\")\n onMessage(ev.type, ev.payload, makeUser({ userId: 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 appId,\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 };\n}\n\nexport type EnterRoom<T extends string, P> = typeof enterRoom<T, P>;\n",
7
7
  "import { IPeer } from \"./impl/signal-room\";\nimport { EnterRoom, enterRoom } from \"./signal-room\";\n\nexport type SigType = \"offer\" | \"answer\" | \"ice\";\nexport type SigPayload = RTCSessionDescriptionInit | RTCIceCandidateInit;\n\ntype UserState = {\n userId: string;\n pc?: RTCPeerConnection;\n\n // ICE that arrived before we had remoteDescription\n pendingRemoteIce: RTCIceCandidateInit[];\n\n // the signaling \"user\" handle so we can send messages\n peer: IPeer<SigType, SigPayload>;\n\n expirationTimeout?: number;\n};\n\nconst DEFAULT_ENTER_ROOM = enterRoom;\n\nexport function collectPeerConnections({\n appId,\n receivePeerConnection,\n peerlessUserExpiration = 5000,\n rtcConfig = { iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }] },\n enterRoomFunction: enterRoom = DEFAULT_ENTER_ROOM,\n logLine = console.debug,\n onLeaveUser,\n workerUrl,\n onRoomReady,\n onRoomClose,\n}: {\n appId: string;\n rtcConfig?: RTCConfiguration;\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 initiator: boolean;\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}) {\n const userId = `user-${crypto.randomUUID()}`;\n const users: Map<string, UserState> = new Map();\n\n function setupPC(state: UserState) {\n state.pc = new RTCPeerConnection(rtcConfig);\n // Send local ICE candidates to this peer\n state.pc.onicecandidate = (ev) => {\n if (!ev.candidate) return;\n state.peer.receive(\"ice\", ev.candidate.toJSON());\n };\n\n state.pc.onconnectionstatechange = () => {\n logLine(\"💬\", {\n event: \"pc-state\",\n userId: state.userId,\n state: state.pc?.connectionState,\n });\n };\n return state.pc;\n }\n\n function getPeer(peer: IPeer<SigType, SigPayload>): [UserState, boolean] {\n let state = users.get(peer.userId);\n let isNewPeer = false;\n if (!state) {\n const newState: UserState = {\n userId: peer.userId,\n pendingRemoteIce: [],\n peer,\n };\n users.set(peer.userId, newState);\n\n setupPC(newState);\n state = newState;\n\n // New user\n users.set(state.userId, state);\n isNewPeer = true;\n } else if (state) {\n clearTimeout(state.expirationTimeout);\n state.expirationTimeout = 0;\n }\n if (!state.pc) {\n setupPC(state);\n }\n state.peer = peer;\n return [state, isNewPeer];\n }\n\n function leaveUser(userId: string) {\n onLeaveUser?.(userId);\n const p = users.get(userId);\n if (!p) return;\n try {\n p.pc?.close();\n } catch {}\n users.delete(userId);\n }\n\n async function flushRemoteIce(state: UserState) {\n if (!state.pc?.remoteDescription) return;\n\n const queued = state.pendingRemoteIce;\n state.pendingRemoteIce = [];\n\n for (const ice of queued) {\n try {\n await state.pc.addIceCandidate(ice);\n } catch (e) {\n logLine(\"⚠️ ERROR\", {\n error: \"add-ice-failed\",\n userId: state.userId,\n detail: String(e),\n });\n }\n }\n }\n\n const roomsEntered = new Map<\n string,\n { room: string; host: string; exitRoom: () => void }\n >();\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>((resolve, reject) => {\n async function makeOffer(user: IPeer) {\n // Offer flow: createOffer -> setLocalDescription -> send localDescription\n const [state] = getPeer(user);\n const pc = state.pc;\n const offer = await pc?.createOffer();\n await pc?.setLocalDescription(offer);\n user.receive(\"offer\", pc?.localDescription?.toJSON()!);\n }\n\n const { exitRoom } = enterRoom({\n userId,\n appId,\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) {\n onRoomClose?.({ room, host, ev });\n },\n\n // Existing peers initiate to the newcomer (Option 1)\n onPeerJoined(joiningUsers: IPeer<SigType, SigPayload>[]) {\n joiningUsers.forEach((user) => {\n const [state, isNewPeer] = getPeer(user);\n if (!isNewPeer) return;\n const pc = state.pc;\n if (!pc) return;\n\n async function restart() {\n const state = users.get(user.userId);\n if (state) {\n state.pc = undefined;\n const pc = setupPC(state);\n receivePeerConnection({\n pc,\n userId: user.userId,\n initiator: true,\n restart,\n });\n await new Promise((resolve) => setTimeout(resolve, 3000));\n makeOffer(user);\n }\n }\n\n receivePeerConnection({\n pc,\n userId: user.userId,\n initiator: true,\n restart,\n });\n makeOffer(user);\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 async onMessage(type: SigType, payload: any, from: IPeer) {\n const [state] = getPeer(from);\n const pc = state.pc;\n if (!pc) return;\n\n if (type === \"offer\") {\n receivePeerConnection({\n pc,\n userId: from.userId,\n initiator: false,\n restart() {\n // reset PC\n state.pc = undefined;\n },\n });\n // Responder: set remote offer\n await pc.setRemoteDescription(payload as RTCSessionDescriptionInit);\n\n // Create and send answer\n const answer = await pc.createAnswer();\n await pc.setLocalDescription(answer);\n\n from.receive(\"answer\", pc.localDescription?.toJSON()!);\n\n // Now safe to apply any queued ICE from this peer\n await flushRemoteIce(state);\n return;\n }\n\n if (type === \"answer\") {\n // Initiator: set remote answer\n await pc.setRemoteDescription(payload as RTCSessionDescriptionInit);\n await flushRemoteIce(state);\n return;\n }\n\n if (type === \"ice\") {\n const ice = payload as RTCIceCandidateInit;\n\n // If we don't have remoteDescription yet, queue it\n if (!pc.remoteDescription) {\n state.pendingRemoteIce.push(ice);\n return;\n }\n\n try {\n await pc.addIceCandidate(ice);\n } catch (e) {\n logLine(\"⚠️ ERROR\", {\n error: \"add-ice-failed\",\n userId: state.userId,\n detail: String(e),\n });\n }\n return;\n }\n },\n });\n roomsEntered.set(`${host}/room/${room}`, { exitRoom, room, host });\n });\n }\n\n return {\n userId,\n enterRoom: enter,\n exitRoom: exit,\n leaveUser,\n end() {\n roomsEntered.forEach(({ exitRoom }) => exitRoom());\n roomsEntered.clear();\n users.forEach(({ userId }) => leaveUser(userId));\n users.clear();\n },\n };\n}\n",
8
- "import { EnterRoom, enterRoom } from \"./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 appId,\n logLine = console.debug,\n enterRoomFunction = enterRoom,\n peerlessUserExpiration,\n workerUrl,\n onRoomReady,\n onRoomClose,\n dataChannelOptions,\n}: {\n appId: string;\n logLine?: (direction: string, 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: string[] = [];\n const rtcConfig: RTCConfiguration = {\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n };\n\n const messagesListeners = new Set<(data: any, from: string) => void>();\n\n function createDataChannel(\n pc: RTCPeerConnection,\n peerUserId: string,\n initiator: boolean,\n restart?: () => void\n ) {\n if (initiator) {\n const dc = pc.createDataChannel(\"data\", dataChannelOptions);\n wireDataChannel(peerUserId, dc, restart);\n dataChannels.set(peerUserId, dc);\n } else {\n function listener(ev: RTCDataChannelEvent) {\n const dc = ev.channel;\n wireDataChannel(peerUserId, dc, restart);\n dataChannels.set(peerUserId, dc);\n pc.ondatachannel = null;\n }\n pc.addEventListener(\"datachannel\", listener);\n return () => {\n pc.removeEventListener(\"datachannel\", listener);\n };\n }\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.push(userId);\n userListeners.forEach((listener) => listener(userId, \"join\", userIds));\n };\n const onmessage = ({ data }: MessageEvent) => {\n messagesListeners.forEach((listener) => listener(data as any, userId));\n logLine(\"💬\", { event: \"dc-message\", userId, data });\n };\n dc.addEventListener(\"message\", onmessage);\n dc.addEventListener(\"close\", () => {\n logLine(\"💬\", { event: \"dc-close\", userId });\n userIds.splice(userIds.indexOf(userId), 1);\n userListeners.forEach((listener) => listener(userId, \"leave\", userIds));\n dc.removeEventListener(\"message\", onmessage);\n restart?.();\n });\n dc.onerror = () => logLine(\"⚠️ ERROR\", { error: \"dc-error\", userId });\n }\n\n const dataChannels = new Map<string, RTCDataChannel>();\n const userListeners = new Set<UserListener>();\n\n const {\n userId,\n enterRoom,\n exitRoom,\n leaveUser,\n end: endPeerCollection,\n } = collectPeerConnections({\n appId,\n rtcConfig,\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, initiator, restart }) {\n createDataChannel(pc, userId, initiator, restart);\n },\n });\n\n function send(data: any, userId?: string) {\n dataChannels.forEach((dataChannel, pUserId) => {\n if (userId && pUserId !== userId) return;\n if (dataChannel.readyState === \"open\") dataChannel.send(data);\n });\n }\n\n function removeMessageListener(listener: (data: any, from: string) => void) {\n messagesListeners.delete(listener);\n }\n\n function addMessageListener(listener: (data: any, 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 enterRoom,\n exitRoom,\n leaveUser,\n getUsers: () => userIds,\n addMessageListener,\n removeMessageListener,\n addUserListener,\n removeUserListener,\n end() {\n dataChannels.forEach((dataChannel) => {\n try {\n dataChannel.close();\n } catch {}\n });\n dataChannels.clear();\n endPeerCollection();\n userListeners.clear();\n userIds.length = 0;\n },\n };\n}\n"
8
+ "import { EnterRoom, enterRoom } from \"./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<D extends string | ArrayBufferView<ArrayBuffer>>({\n appId,\n logLine = console.debug,\n enterRoomFunction = enterRoom,\n peerlessUserExpiration,\n workerUrl,\n onRoomReady,\n onRoomClose,\n dataChannelOptions,\n}: {\n appId: string;\n logLine?: (direction: string, 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: string[] = [];\n const rtcConfig: RTCConfiguration = {\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n };\n\n const messagesListeners = new Set<(data: any, from: string) => void>();\n\n function createDataChannel(\n pc: RTCPeerConnection,\n peerUserId: string,\n initiator: boolean,\n restart?: () => void\n ) {\n if (initiator) {\n const dc = pc.createDataChannel(\"data\", dataChannelOptions);\n wireDataChannel(peerUserId, dc, restart);\n dataChannels.set(peerUserId, dc);\n } else {\n function listener(ev: RTCDataChannelEvent) {\n const dc = ev.channel;\n wireDataChannel(peerUserId, dc, restart);\n dataChannels.set(peerUserId, dc);\n pc.ondatachannel = null;\n }\n pc.addEventListener(\"datachannel\", listener);\n return () => {\n pc.removeEventListener(\"datachannel\", listener);\n };\n }\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.push(userId);\n userListeners.forEach((listener) => listener(userId, \"join\", userIds));\n };\n const onmessage = ({ data }: MessageEvent) => {\n messagesListeners.forEach((listener) => listener(data as any, userId));\n logLine(\"💬\", { event: \"dc-message\", userId, data });\n };\n dc.addEventListener(\"message\", onmessage);\n dc.addEventListener(\"close\", () => {\n logLine(\"💬\", { event: \"dc-close\", userId });\n userIds.splice(userIds.indexOf(userId), 1);\n userListeners.forEach((listener) => listener(userId, \"leave\", userIds));\n dc.removeEventListener(\"message\", onmessage);\n restart?.();\n });\n dc.onerror = () => logLine(\"⚠️ ERROR\", { error: \"dc-error\", userId });\n }\n\n const dataChannels = new Map<string, RTCDataChannel>();\n const userListeners = new Set<UserListener>();\n\n const {\n userId,\n enterRoom,\n exitRoom,\n leaveUser,\n end: endPeerCollection,\n } = collectPeerConnections({\n appId,\n rtcConfig,\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, initiator, restart }) {\n createDataChannel(pc, userId, initiator, restart);\n },\n });\n\n function send(data: D, userId?: string) {\n dataChannels.forEach((dataChannel, pUserId) => {\n if (userId && pUserId !== userId) return;\n if (dataChannel.readyState === \"open\") {\n if (typeof data === \"string\") {\n dataChannel.send(data);\n } else {\n dataChannel.send(data);\n }\n }\n });\n }\n\n function removeMessageListener(listener: (data: D, from: string) => void) {\n messagesListeners.delete(listener);\n }\n\n function addMessageListener(listener: (data: D, 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 enterRoom,\n exitRoom,\n leaveUser,\n getUsers: () => userIds,\n addMessageListener,\n removeMessageListener,\n addUserListener,\n removeUserListener,\n end() {\n dataChannels.forEach((dataChannel) => {\n try {\n dataChannel.close();\n } catch {}\n });\n dataChannels.clear();\n endPeerCollection();\n userListeners.clear();\n userIds.length = 0;\n },\n };\n}\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "59967B43AFDC32C064756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "AD8A0D15BDA71D6664756E2164756E21",
12
12
  "names": []
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/sample/index.ts"],"names":[],"mappings":"AAuBA,wBAAgB,QAAQ,SAEvB;AAED,wBAAgB,WAAW,eAqC1B;AAED,wBAAgB,UAAU,eAuHzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/sample/index.ts"],"names":[],"mappings":"AA0BA,wBAAgB,QAAQ,SAEvB;AAED,wBAAgB,WAAW,eAuC1B;AAED,wBAAgB,UAAU,eAwHzB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dobuki/hello-worker",
3
- "version": "1.0.32",
3
+ "version": "1.0.35",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",