@dobuki/hello-worker 1.0.81 → 1.0.82
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.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -2
- package/dist/index.js.map +5 -4
- package/dist/sample/index.d.ts +1 -0
- package/dist/sample/index.d.ts.map +1 -1
- package/dist/web-components/index.d.ts +2 -0
- package/dist/web-components/index.d.ts.map +1 -0
- package/dist/web-components/sync-button.d.ts +18 -0
- package/dist/web-components/sync-button.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/browser/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/browser/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,cAAc,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,28 @@
|
|
|
1
|
-
class n{sendToServerFunctions=[];icePromiseResolve;icePromise;receiveIce(R,z){this.icePromiseResolve?.({url:R,expiration:z}),this.icePromiseResolve=void 0,this.icePromise=void 0}addRequester(R){return this.sendToServerFunctions.push(R),()=>{this.removeRequester(R)}}removeRequester(R){this.sendToServerFunctions.splice(this.sendToServerFunctions.indexOf(R),1)}sendToServer(R){this.sendToServerFunctions[Math.floor(this.sendToServerFunctions.length*Math.random())](R)}async requestIce(){if(!this.icePromise)this.icePromise=new Promise((R)=>{this.icePromiseResolve=R,this.sendToServer("request-ice")});return await this.icePromise}}function L(R){let{userId:z,worldId:W,room:K,host:M,autoRejoin:G=!0,logLine:Z}=R,P=!1,N=0,S,X,c=!0,$=new Map,E=`wss://${M}/room/${W}/${K}?userId=${encodeURIComponent(z)}`,Y=[],_=0;function O(V,C,T){if(!S)return Z?.("\uD83D\uDC64 ➡️ ❌","no ws available"),!1;let F={type:V,to:C,payload:T};if(Y.push(F),Z?.("\uD83D\uDC64 ➡️ \uD83D\uDDA5️",F),clearTimeout(_),P||S.readyState!==WebSocket.OPEN)return Z?.("\uD83D\uDC64 ➡️ ❌","Not in opened state: "+S.readyState),!1;return _=setTimeout(()=>{S.send(JSON.stringify(Y)),Y.length=0}),!0}function J(){if(P)return;S=new WebSocket(E),S.onopen=()=>{if(c)R.onOpen?.(),c=!1;N=0},S.onmessage=(V)=>{try{let C=JSON.parse(V.data);(Array.isArray(C)?C:[C]).forEach((F)=>{if(Z?.("\uD83D\uDDA5️ ➡️ \uD83D\uDC64",F),F.type==="peer-joined"||F.type==="peer-left")B(F.users,F);else if(F.type==="ice-server")R.onIceUrl?.(F.url,F.expiration);else if(F.userId)R.onMessage(F.type,F.payload,F.userId)})}catch{Z?.("⚠️ ERROR",{error:"invalid-json"})}},S.onclose=(V)=>{let T=[1001,1006,1011,1012,1013].includes(V.code);if(G&&!P&&T){let F=Math.min(Math.pow(2,N)*1000,15000),H=Math.random()*1000,x=F+H;Z?.("\uD83D\uDD04 RECONNECTING",{attempt:N+1,delayMs:Math.round(x)}),N++,X=setTimeout(J,x)}else R.onClose?.({code:V.code,reason:V.reason,wasClean:V.wasClean})},S.onerror=(V)=>{console.error("WS Error",V),R.onError?.()}}function B(V,C){let T=[],F=[],H=new Set,x=V.filter((Q)=>Q.userId===z)[0];if(!x){Z?.("⚠️","Cannot find self in updated users");return}let v=x.joined;V.forEach(({userId:Q,joined:w})=>{if(Q===z)return;if(!$.has(Q)||C.type==="peer-joined"&&Q===C.userId){let h={userId:Q,joined:w};$.set(Q,h),T.push(h)}H.add(Q)});for(let Q of $.keys())if(!H.has(Q)||C.type==="peer-left"&&Q===C.userId)$.delete(Q),F.push({userId:Q});if(T.length)R.onPeerJoined(T,v);if(F.length)R.onPeerLeft(F)}return J(),{send(V,C,T){O(V,C,T)},exitRoom:()=>{P=!0,clearTimeout(X),S.close()}}}function j({userId:R,worldId:z,room:W,host:K,autoRejoin:M=!0,onOpen:G,onClose:Z,onError:P,onPeerJoined:N,onPeerLeft:S,onIceUrl:X,onMessage:c,logLine:$,workerUrl:E}){if(!E)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:R,worldId:z,room:W,host:K,autoRejoin:M,onOpen:G,onClose:Z,onError:P,onPeerJoined:N,onPeerLeft:S,onIceUrl:X,onMessage:c});let Y=new Worker(E,{type:"module"}),_=!1,O=(J)=>{let B=J.data;if(B.kind==="open")G?.();else if(B.kind==="close")Y.terminate(),Z?.(B.ev);else if(B.kind==="error")P?.();else if(B.kind==="peer-joined")N(B.users.map((V)=>({userId:V.userId,joined:V.joined})),B.joined);else if(B.kind==="peer-left")S(B.users);else if(B.kind==="ice-server")X?.(B.url,B.expiration);else if(B.kind==="message")c(B.type,B.payload,B.fromUserId);else if(B.kind==="log")$?.(B.direction,B.obj)};return Y.addEventListener("message",O),Y.postMessage({cmd:"enter",userId:R,worldId:z,room:W,host:K,autoRejoin:M}),{exitRoom:()=>{_=!0,Y.removeEventListener("message",O),Y.postMessage({cmd:"exit"})},send:(J,B,V)=>{Y.postMessage({cmd:"send",toUserId:B,host:K,room:W,type:J,payload:V})}}}var m={iceServers:[{urls:"stun:stun.l.google.com:19302"}]};class g{iceUrlProvider;constructor(R){this.iceUrlProvider=R}rtcConfig={...m,timestamp:Date.now()};rtcConfigPromise;async getRtcConfig(){if(Date.now()-(this.rtcConfig?.timestamp??0)<1e4)return this.rtcConfig;if(!this.rtcConfigPromise)this.rtcConfigPromise=new Promise(async(z)=>{let W=3;for(let K=0;K<W;K++)try{let M=(await this.iceUrlProvider.requestIce()).url,G=await fetch(M);if(!G.ok)throw Error(`ICE endpoint failed: ${G.status}`);let Z=await G.json();z(Z);return}catch(M){console.warn("Failed fetching iceUrl")}}),this.rtcConfig=await this.rtcConfigPromise,this.rtcConfigPromise=void 0;return this.rtcConfig}}var y=j;function U({userId:R,worldId:z,receivePeerConnection:W,peerlessUserExpiration:K=5000,enterRoomFunction:M=y,logLine:G,onLeaveUser:Z,workerUrl:P,onRoomReady:N,onRoomClose:S,onBroadcastMessage:X}){let c=R??`user-${crypto.randomUUID()}`,$=new Map,E=new Map;function Y(C){Z?.(C);let T=$.get(C);if(!T)return;$.delete(C);try{T.close()}catch{}}async function _(C){if(!C.connection?.pc?.remoteDescription)return;let T=C.connection.pendingRemoteIce;C.connection.pendingRemoteIce=[];for(let F of T)try{await C.connection.pc.addIceCandidate(F)}catch(H){G?.("⚠️ ERROR",{error:"add-ice-failed",userId:C.peer,detail:String(H)})}}let O=new n,J=new g(O);function B({room:C,host:T}){let F=`${T}/room/${C}`,H=E.get(F);if(H)H.exitRoom(),E.delete(F)}function V({room:C,host:T}){return new Promise(async(F,H)=>{async function x(i){if(i.connectionPromise)return i.connectionPromise;let b=new Promise(async(f)=>{i.connection={id:`conn-${crypto.randomUUID()}`,pc:new RTCPeerConnection(await J.getRtcConfig()),pendingRemoteIce:[]},i.connection.pc.onicecandidate=(q)=>{if(!q.candidate)return;h("ice",i.peer,{connectionId:i.connection?.id,ice:q.candidate.toJSON()})},i.connection.pc.onconnectionstatechange=async()=>{if(G?.("\uD83D\uDCAC",{event:"pc-state",userId:i.peer,state:i.connection?.pc?.connectionState}),i.connection?.pc?.connectionState==="failed"){i.close();let q=await v(i.peer,!0);if(q.connection?.pc)W({pc:q.connection?.pc,userId:q.peer,restart:()=>q.close()});else G?.("\uD83D\uDC64ℹ️","no pc: "+q.peer);return}},f(i.connection)});return i.connectionPromise=b,await b,i.connectionPromise=void 0,b}async function v(i,b){let f=$.get(i);if(!f||b){let q={peer:i,close(){if(this.connection)this.connection.pc.close(),this.connection=void 0;$.delete(i)},async reset(){q.close(),setTimeout(async()=>{let D=await v(i,!0);if(!D.connection?.pc){G?.("⚠️","no pc");return}W({pc:D.connection?.pc,userId:D.peer,restart:()=>D.close()}),await Q(D.peer)},500)}};f=q,await x(q),$.set(f.peer,f)}else if(f){if(clearTimeout(f.expirationTimeout),f.expirationTimeout=0,!f.connection?.pc||f.connection?.pc.signalingState==="closed")await x(f)}return f.peer=i,f}async function Q(i){let b=await v(i),f=b.connection?.pc,q=await f?.createOffer();await f?.setLocalDescription(q),h("offer",i,{connectionId:b.connection?.id,offer:f?.localDescription?.toJSON()})}let{exitRoom:w,send:h}=M({userId:c,worldId:z,room:C,host:T,logLine:G,workerUrl:P,autoRejoin:!0,onOpen(){N?.({room:C,host:T}),F()},onError(){console.error("onError"),H()},onClose(i){S?.({room:C,host:T,ev:i})},onPeerJoined(i,b){i.forEach(async(f)=>{let q=await v(f.userId,!0);q.joined=f.joined;let D=q.connection?.pc;if(!D){G?.("\uD83D\uDC64ℹ️","no pc: "+f.userId);return}if(W({pc:D,userId:f.userId,restart:()=>q.close()}),f.joined>b||f.joined===b&&f.userId.localeCompare(c)>0)await Q(f.userId)})},onPeerLeft(i){i.forEach(({userId:b})=>{let f=$.get(b);if(!f)return;f.expirationTimeout=setTimeout(()=>Y(b),K??0)})},onIceUrl(i,b){O.receiveIce(i,b)},async onMessage(i,b,f){if(i==="offer"&&b.offer){let q=await v(f,!1),D=!q.connection||q.connection.pc.signalingState==="stable"?await x(q):q.connection;G?.("\uD83D\uDCAC",{type:i,signalingState:D.pc.signalingState}),D.peerConnectionId=b.connectionId,W({pc:D.pc,userId:f,restart:()=>q.close()}),await D.pc.setRemoteDescription(b.offer);let k=await D.pc.createAnswer();await D.pc.setLocalDescription(k),h("answer",f,{connectionId:D.id,answer:D.pc.localDescription?.toJSON()}),await _(q);return}if(i==="answer"&&b.answer){let q=await v(f,!1),D=q.connection&&q.connection.pc.signalingState!=="closed"?q.connection:await x(q);G?.("\uD83D\uDCAC",{type:i,signalingState:D.pc.signalingState}),await D.pc.setRemoteDescription(b.answer),D.peerConnectionId=b.connectionId,await _(q);return}if(i==="ice"&&b.ice){let q=await v(f,!1),D=q.connection??await q.connectionPromise;if(!D){G?.("⚠️","No connection");return}if(G?.("\uD83D\uDCAC",{type:i,signalingState:D.pc.signalingState}),D.peerConnectionId&&b.connectionId!==D.peerConnectionId){G?.("⚠️","Mismatch peerConnectionID"+b.connectionId+"vs"+D.peerConnectionId);return}if(!D.pc.remoteDescription||!D.peerConnectionId){D.peerConnectionId=b.connectionId,D.pendingRemoteIce.push(b.ice);return}try{await D.pc.addIceCandidate(b.ice)}catch(k){G?.("⚠️ ERROR",{error:"add-ice-failed",userId:q.peer,detail:String(k)})}return}if(i==="broadcast")X?.(b,f)}}),A=O.addRequester((i)=>h(i,"server"));E.set(`${T}/room/${C}`,{exitRoom:()=>{w(),A()},room:C,host:T,broadcast:(i)=>h("broadcast","server",i)})})}return{userId:c,enterRoom:V,exitRoom:B,leaveUser:Y,async reset(C){$.get(C)?.reset()},broadcast(C){E.forEach((T)=>T.broadcast(C))},end(){E.forEach(({exitRoom:C})=>C()),E.clear(),$.forEach(({peer:C})=>Y(C)),$.clear()}}}function u({userId:R,worldId:z,logLine:W,enterRoomFunction:K=j,peerlessUserExpiration:M,workerUrl:G,onRoomReady:Z,onRoomClose:P,dataChannelOptions:N}){let S=new Set,X=new Map,c=new Set,$=new Set;function E(h,A,i){function b(q){let D=q.channel;_(A,D,i),X.set(A,D)}h.addEventListener("datachannel",b);let f=h.createDataChannel("data",N);return _(A,f,i),X.set(A,f),()=>{h.removeEventListener("datachannel",b)}}function Y(h,A){$.forEach((i)=>i(h,A))}function _(h,A,i){A.onopen=()=>{W?.("\uD83D\uDCAC",{event:"dc-open",userId:h}),S.add(h),c.forEach((f)=>f(h,"join",[...S]))};let b=({data:f})=>{Y(f,h)};A.addEventListener("message",b),A.onclose=()=>{W?.("\uD83D\uDCAC",{event:"dc-close",userId:h}),S.delete(h),c.forEach((f)=>f(h,"leave",[...S])),A.removeEventListener("message",b),A.onopen=null,A.onclose=null,A.onerror=null,A.close(),i?.()},A.onerror=()=>W?.("⚠️ ERROR",{error:"dc-error",userId:h})}let{userId:O,enterRoom:J,exitRoom:B,leaveUser:V,broadcast:C,end:T,reset:F}=U({userId:R,worldId:z,enterRoomFunction:K,logLine:W,workerUrl:G,peerlessUserExpiration:M,onRoomReady:Z,onRoomClose:P,onLeaveUser(h){let A=X.get(h);try{A?.close()}catch{}X.delete(h)},receivePeerConnection({pc:h,userId:A,restart:i}){E(h,A,i)},onBroadcastMessage(h,A){Y(h,A),W?.("\uD83D\uDCE2",{event:"broadcast",userId:O,data:h})}});function H(h,A){X.forEach((i,b)=>{if(A&&b!==A)return;if(i.readyState==="open")i.send(h)})}function x(h){$.delete(h)}function v(h){return $.add(h),()=>{x(h)}}function Q(h){c.delete(h)}function w(h){return c.add(h),()=>{Q(h)}}return{userId:O,send:H,broadcast:C,enterRoom:J,exitRoom:B,leaveUser:V,getUsers:()=>[...S],addMessageListener:v,removeMessageListener:x,addUserListener:w,removeUserListener:Q,reset(){S.forEach((h)=>{X.get(h)?.close(),X.delete(h),F(h)})},end(){X.forEach((h)=>{try{h.close()}catch{}}),X.clear(),T(),c.clear(),S.clear()}}}export{u as enterWorld,L as enterRoom,U as collectPeerConnections};
|
|
1
|
+
class N{sendToServerFunctions=[];icePromiseResolve;icePromise;receiveIce(c,S){this.icePromiseResolve?.({url:c,expiration:S}),this.icePromiseResolve=void 0,this.icePromise=void 0}addRequester(c){return this.sendToServerFunctions.push(c),()=>{this.removeRequester(c)}}removeRequester(c){this.sendToServerFunctions.splice(this.sendToServerFunctions.indexOf(c),1)}sendToServer(c){this.sendToServerFunctions[Math.floor(this.sendToServerFunctions.length*Math.random())](c)}async requestIce(){if(!this.icePromise)this.icePromise=new Promise((c)=>{this.icePromiseResolve=c,this.sendToServer("request-ice")});return await this.icePromise}}function d(c){let{userId:S,worldId:w,room:W,host:$,autoRejoin:q=!0,logLine:D}=c,r=!1,Q=0,v,M,V=!0,E=new Map,x=`wss://${$}/room/${w}/${W}?userId=${encodeURIComponent(S)}`,k=[],l=0;function X(R,h,T){if(!v)return D?.("\uD83D\uDC64 ➡️ ❌","no ws available"),!1;let C={type:R,to:h,payload:T};if(k.push(C),D?.("\uD83D\uDC64 ➡️ \uD83D\uDDA5️",C),clearTimeout(l),r||v.readyState!==WebSocket.OPEN)return D?.("\uD83D\uDC64 ➡️ ❌","Not in opened state: "+v.readyState),!1;return l=setTimeout(()=>{v.send(JSON.stringify(k)),k.length=0}),!0}function Y(){if(r)return;v=new WebSocket(x),v.onopen=()=>{if(V)c.onOpen?.(),V=!1;Q=0},v.onmessage=(R)=>{try{let h=JSON.parse(R.data);(Array.isArray(h)?h:[h]).forEach((C)=>{if(D?.("\uD83D\uDDA5️ ➡️ \uD83D\uDC64",C),C.type==="peer-joined"||C.type==="peer-left")u(C.users,C);else if(C.type==="ice-server")c.onIceUrl?.(C.url,C.expiration);else if(C.userId)c.onMessage(C.type,C.payload,C.userId)})}catch{D?.("⚠️ ERROR",{error:"invalid-json"})}},v.onclose=(R)=>{let T=[1001,1006,1011,1012,1013].includes(R.code);if(q&&!r&&T){let C=Math.min(Math.pow(2,Q)*1000,15000),H=Math.random()*1000,G=C+H;D?.("\uD83D\uDD04 RECONNECTING",{attempt:Q+1,delayMs:Math.round(G)}),Q++,M=setTimeout(Y,G)}else c.onClose?.({code:R.code,reason:R.reason,wasClean:R.wasClean})},v.onerror=(R)=>{console.error("WS Error",R),c.onError?.()}}function u(R,h){let T=[],C=[],H=new Set,G=R.filter((F)=>F.userId===S)[0];if(!G){D?.("⚠️","Cannot find self in updated users");return}let Z=G.joined;R.forEach(({userId:F,joined:z})=>{if(F===S)return;if(!E.has(F)||h.type==="peer-joined"&&F===h.userId){let n={userId:F,joined:z};E.set(F,n),T.push(n)}H.add(F)});for(let F of E.keys())if(!H.has(F)||h.type==="peer-left"&&F===h.userId)E.delete(F),C.push({userId:F});if(T.length)c.onPeerJoined(T,Z);if(C.length)c.onPeerLeft(C)}return Y(),{send(R,h,T){X(R,h,T)},exitRoom:()=>{r=!0,clearTimeout(M),v.close()}}}function K({userId:c,worldId:S,room:w,host:W,autoRejoin:$=!0,onOpen:q,onClose:D,onError:r,onPeerJoined:Q,onPeerLeft:v,onIceUrl:M,onMessage:V,logLine:E,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"),d({userId:c,worldId:S,room:w,host:W,autoRejoin:$,onOpen:q,onClose:D,onError:r,onPeerJoined:Q,onPeerLeft:v,onIceUrl:M,onMessage:V});let k=new Worker(x,{type:"module"}),l=!1,X=(Y)=>{let u=Y.data;if(u.kind==="open")q?.();else if(u.kind==="close")k.terminate(),D?.(u.ev);else if(u.kind==="error")r?.();else if(u.kind==="peer-joined")Q(u.users.map((R)=>({userId:R.userId,joined:R.joined})),u.joined);else if(u.kind==="peer-left")v(u.users);else if(u.kind==="ice-server")M?.(u.url,u.expiration);else if(u.kind==="message")V(u.type,u.payload,u.fromUserId);else if(u.kind==="log")E?.(u.direction,u.obj)};return k.addEventListener("message",X),k.postMessage({cmd:"enter",userId:c,worldId:S,room:w,host:W,autoRejoin:$}),{exitRoom:()=>{l=!0,k.removeEventListener("message",X),k.postMessage({cmd:"exit"})},send:(Y,u,R)=>{k.postMessage({cmd:"send",toUserId:u,host:W,room:w,type:Y,payload:R})}}}var j={iceServers:[{urls:"stun:stun.l.google.com:19302"}]};class J{iceUrlProvider;constructor(c){this.iceUrlProvider=c}rtcConfig={...j,timestamp:Date.now()};rtcConfigPromise;async getRtcConfig(){if(Date.now()-(this.rtcConfig?.timestamp??0)<1e4)return this.rtcConfig;if(!this.rtcConfigPromise)this.rtcConfigPromise=new Promise(async(S)=>{let w=3;for(let W=0;W<w;W++)try{let $=(await this.iceUrlProvider.requestIce()).url,q=await fetch($);if(!q.ok)throw Error(`ICE endpoint failed: ${q.status}`);let D=await q.json();S(D);return}catch($){console.warn("Failed fetching iceUrl")}}),this.rtcConfig=await this.rtcConfigPromise,this.rtcConfigPromise=void 0;return this.rtcConfig}}var s=K;function g({userId:c,worldId:S,receivePeerConnection:w,peerlessUserExpiration:W=5000,enterRoomFunction:$=s,logLine:q,onLeaveUser:D,workerUrl:r,onRoomReady:Q,onRoomClose:v,onBroadcastMessage:M}){let V=c??`user-${crypto.randomUUID()}`,E=new Map,x=new Map;function k(h){D?.(h);let T=E.get(h);if(!T)return;E.delete(h);try{T.close()}catch{}}async function l(h){if(!h.connection?.pc?.remoteDescription)return;let T=h.connection.pendingRemoteIce;h.connection.pendingRemoteIce=[];for(let C of T)try{await h.connection.pc.addIceCandidate(C)}catch(H){q?.("⚠️ ERROR",{error:"add-ice-failed",userId:h.peer,detail:String(H)})}}let X=new N,Y=new J(X);function u({room:h,host:T}){let C=`${T}/room/${h}`,H=x.get(C);if(H)H.exitRoom(),x.delete(C)}function R({room:h,host:T}){return new Promise(async(C,H)=>{async function G(i){if(i.connectionPromise)return i.connectionPromise;let b=new Promise(async(t)=>{i.connection={id:`conn-${crypto.randomUUID()}`,pc:new RTCPeerConnection(await Y.getRtcConfig()),pendingRemoteIce:[]},i.connection.pc.onicecandidate=(f)=>{if(!f.candidate)return;n("ice",i.peer,{connectionId:i.connection?.id,ice:f.candidate.toJSON()})},i.connection.pc.onconnectionstatechange=async()=>{if(q?.("\uD83D\uDCAC",{event:"pc-state",userId:i.peer,state:i.connection?.pc?.connectionState}),i.connection?.pc?.connectionState==="failed"){i.close();let f=await Z(i.peer,!0);if(f.connection?.pc)w({pc:f.connection?.pc,userId:f.peer,restart:()=>f.close()});else q?.("\uD83D\uDC64ℹ️","no pc: "+f.peer);return}},t(i.connection)});return i.connectionPromise=b,await b,i.connectionPromise=void 0,b}async function Z(i,b){let t=E.get(i);if(!t||b){let f={peer:i,close(){if(this.connection)this.connection.pc.close(),this.connection=void 0;E.delete(i)},async reset(){f.close(),setTimeout(async()=>{let B=await Z(i,!0);if(!B.connection?.pc){q?.("⚠️","no pc");return}w({pc:B.connection?.pc,userId:B.peer,restart:()=>B.close()}),await F(B.peer)},500)}};t=f,await G(f),E.set(t.peer,t)}else if(t){if(clearTimeout(t.expirationTimeout),t.expirationTimeout=0,!t.connection?.pc||t.connection?.pc.signalingState==="closed")await G(t)}return t.peer=i,t}async function F(i){let b=await Z(i),t=b.connection?.pc,f=await t?.createOffer();await t?.setLocalDescription(f),n("offer",i,{connectionId:b.connection?.id,offer:t?.localDescription?.toJSON()})}let{exitRoom:z,send:n}=$({userId:V,worldId:S,room:h,host:T,logLine:q,workerUrl:r,autoRejoin:!0,onOpen(){Q?.({room:h,host:T}),C()},onError(){console.error("onError"),H()},onClose(i){v?.({room:h,host:T,ev:i})},onPeerJoined(i,b){i.forEach(async(t)=>{let f=await Z(t.userId,!0);f.joined=t.joined;let B=f.connection?.pc;if(!B){q?.("\uD83D\uDC64ℹ️","no pc: "+t.userId);return}if(w({pc:B,userId:t.userId,restart:()=>f.close()}),t.joined>b||t.joined===b&&t.userId.localeCompare(V)>0)await F(t.userId)})},onPeerLeft(i){i.forEach(({userId:b})=>{let t=E.get(b);if(!t)return;t.expirationTimeout=setTimeout(()=>k(b),W??0)})},onIceUrl(i,b){X.receiveIce(i,b)},async onMessage(i,b,t){if(i==="offer"&&b.offer){let f=await Z(t,!1),B=!f.connection||f.connection.pc.signalingState==="stable"?await G(f):f.connection;q?.("\uD83D\uDCAC",{type:i,signalingState:B.pc.signalingState}),B.peerConnectionId=b.connectionId,w({pc:B.pc,userId:t,restart:()=>f.close()}),await B.pc.setRemoteDescription(b.offer);let P=await B.pc.createAnswer();await B.pc.setLocalDescription(P),n("answer",t,{connectionId:B.id,answer:B.pc.localDescription?.toJSON()}),await l(f);return}if(i==="answer"&&b.answer){let f=await Z(t,!1),B=f.connection&&f.connection.pc.signalingState!=="closed"?f.connection:await G(f);q?.("\uD83D\uDCAC",{type:i,signalingState:B.pc.signalingState}),await B.pc.setRemoteDescription(b.answer),B.peerConnectionId=b.connectionId,await l(f);return}if(i==="ice"&&b.ice){let f=await Z(t,!1),B=f.connection??await f.connectionPromise;if(!B){q?.("⚠️","No connection");return}if(q?.("\uD83D\uDCAC",{type:i,signalingState:B.pc.signalingState}),B.peerConnectionId&&b.connectionId!==B.peerConnectionId){q?.("⚠️","Mismatch peerConnectionID"+b.connectionId+"vs"+B.peerConnectionId);return}if(!B.pc.remoteDescription||!B.peerConnectionId){B.peerConnectionId=b.connectionId,B.pendingRemoteIce.push(b.ice);return}try{await B.pc.addIceCandidate(b.ice)}catch(P){q?.("⚠️ ERROR",{error:"add-ice-failed",userId:f.peer,detail:String(P)})}return}if(i==="broadcast")M?.(b,t)}}),A=X.addRequester((i)=>n(i,"server"));x.set(`${T}/room/${h}`,{exitRoom:()=>{z(),A()},room:h,host:T,broadcast:(i)=>n("broadcast","server",i)})})}return{userId:V,enterRoom:R,exitRoom:u,leaveUser:k,async reset(h){E.get(h)?.reset()},broadcast(h){x.forEach((T)=>T.broadcast(h))},end(){x.forEach(({exitRoom:h})=>h()),x.clear(),E.forEach(({peer:h})=>k(h)),E.clear()}}}function _({userId:c,worldId:S,logLine:w,enterRoomFunction:W=K,peerlessUserExpiration:$,workerUrl:q,onRoomReady:D,onRoomClose:r,dataChannelOptions:Q}){let v=new Set,M=new Map,V=new Set,E=new Set;function x(n,A,i){function b(f){let B=f.channel;l(A,B,i),M.set(A,B)}n.addEventListener("datachannel",b);let t=n.createDataChannel("data",Q);return l(A,t,i),M.set(A,t),()=>{n.removeEventListener("datachannel",b)}}function k(n,A){E.forEach((i)=>i(n,A))}function l(n,A,i){A.onopen=()=>{w?.("\uD83D\uDCAC",{event:"dc-open",userId:n}),v.add(n),V.forEach((t)=>t(n,"join",[...v]))};let b=({data:t})=>{k(t,n)};A.addEventListener("message",b),A.onclose=()=>{w?.("\uD83D\uDCAC",{event:"dc-close",userId:n}),v.delete(n),V.forEach((t)=>t(n,"leave",[...v])),A.removeEventListener("message",b),A.onopen=null,A.onclose=null,A.onerror=null,A.close(),i?.()},A.onerror=()=>w?.("⚠️ ERROR",{error:"dc-error",userId:n})}let{userId:X,enterRoom:Y,exitRoom:u,leaveUser:R,broadcast:h,end:T,reset:C}=g({userId:c,worldId:S,enterRoomFunction:W,logLine:w,workerUrl:q,peerlessUserExpiration:$,onRoomReady:D,onRoomClose:r,onLeaveUser(n){let A=M.get(n);try{A?.close()}catch{}M.delete(n)},receivePeerConnection({pc:n,userId:A,restart:i}){x(n,A,i)},onBroadcastMessage(n,A){k(n,A),w?.("\uD83D\uDCE2",{event:"broadcast",userId:X,data:n})}});function H(n,A){M.forEach((i,b)=>{if(A&&b!==A)return;if(i.readyState==="open")i.send(n)})}function G(n){E.delete(n)}function Z(n){return E.add(n),()=>{G(n)}}function F(n){V.delete(n)}function z(n){return V.add(n),()=>{F(n)}}return{userId:X,send:H,broadcast:h,enterRoom:Y,exitRoom:u,leaveUser:R,getUsers:()=>[...v],addMessageListener:Z,removeMessageListener:G,addUserListener:z,removeUserListener:F,reset(){v.forEach((n)=>{M.get(n)?.close(),M.delete(n),C(n)})},end(){M.forEach((n)=>{try{n.close()}catch{}}),M.clear(),T(),V.clear(),v.clear()}}}var O=_({worldId:"sync-buttons",workerUrl:new URL("../signal/signal-room.worker.js",import.meta.url),dataChannelOptions:{ordered:!1},logLine:console.log});O.enterRoom({room:"sync-button",host:location.host});class L extends HTMLElement{static observedAttributes=["id","disabled"];shadowButton;slotEl;constructor(){super();this.attachShadow({mode:"open"}),this.onMessage=this.onMessage.bind(this),this.onClickButton=this.onClickButton.bind(this),this.shadowRoot.innerHTML=`
|
|
2
|
+
<style>
|
|
3
|
+
:host {
|
|
4
|
+
display: inline-block;
|
|
5
|
+
}
|
|
2
6
|
|
|
3
|
-
|
|
7
|
+
button {
|
|
8
|
+
font: inherit;
|
|
9
|
+
color: inherit;
|
|
10
|
+
background: var(--sync-button-bg, ButtonFace);
|
|
11
|
+
border: var(--sync-button-border, 1px solid ButtonBorder);
|
|
12
|
+
padding: var(--sync-button-padding, 0.375rem 0.75rem);
|
|
13
|
+
border-radius: var(--sync-button-radius, 0.375rem);
|
|
14
|
+
cursor: pointer;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
button:disabled {
|
|
18
|
+
cursor: not-allowed;
|
|
19
|
+
opacity: 0.6;
|
|
20
|
+
}
|
|
21
|
+
</style>
|
|
22
|
+
<button part="button" type="button">
|
|
23
|
+
<slot></slot>
|
|
24
|
+
</button>
|
|
25
|
+
`,this.shadowButton=this.shadowRoot.querySelector("button"),this.slotEl=this.shadowRoot.querySelector("slot")}connectedCallback(){O.addMessageListener(this.onMessage),this.shadowButton.addEventListener("click",this.onClickButton),this.syncToInnerButton(),this.upgradeProperty("disabled")}disconnectedCallback(){O.removeMessageListener(this.onMessage),this.shadowButton.removeEventListener("click",this.onClickButton)}attributeChangedCallback(c,S,w){this.syncToInnerButton()}get disabled(){return this.hasAttribute("disabled")}set disabled(c){this.toggleAttribute("disabled",Boolean(c))}focus(c){this.shadowButton.focus(c)}click(){this.shadowButton.click()}syncToInnerButton(){if(this.shadowButton.disabled=this.disabled,this.id)this.shadowButton.id=this.id;else this.shadowButton.removeAttribute("id");this.setAttribute("role","button"),this.setAttribute("tabindex",this.disabled?"-1":"0"),this.setAttribute("aria-disabled",String(this.disabled))}upgradeProperty(c){if(Object.prototype.hasOwnProperty.call(this,c)){let S=this[c];delete this[c],this[c]=S}}onMessage(c){try{let{action:S,id:w}=JSON.parse(String(c));if(S==="click"&&this.id===w)this.shadowButton.removeEventListener("click",this.onClickButton),this.shadowButton.click(),this.shadowButton.addEventListener("click",this.onClickButton)}catch{}}onClickButton(){O.send(JSON.stringify({action:"click",id:this.id}))}}customElements.define("sync-button",L);export{_ as enterWorld,d as enterRoom,g as collectPeerConnections,L as SyncButton};
|
|
26
|
+
|
|
27
|
+
//# debugId=A8628A51E730A0CC64756E2164756E21
|
|
4
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
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"],
|
|
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"],
|
|
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
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
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",
|
|
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
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",
|
|
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"
|
|
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 workerUrl: new URL(\"../signal/signal-room.worker.js\", import.meta.url),\n dataChannelOptions: {\n ordered: false,\n },\n logLine: console.log,\n});\n\nsession.enterRoom({\n room: \"sync-button\",\n host: location.host,\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
12
|
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "A8628A51E730A0CC64756E2164756E21",
|
|
14
15
|
"names": []
|
|
15
16
|
}
|
package/dist/sample/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/sample/index.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/web-components/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class SyncButton extends HTMLElement {
|
|
2
|
+
static observedAttributes: string[];
|
|
3
|
+
private shadowButton;
|
|
4
|
+
private slotEl;
|
|
5
|
+
constructor();
|
|
6
|
+
connectedCallback(): void;
|
|
7
|
+
disconnectedCallback(): void;
|
|
8
|
+
attributeChangedCallback(_name: string, _oldValue: string | null, _newValue: string | null): void;
|
|
9
|
+
get disabled(): boolean;
|
|
10
|
+
set disabled(value: boolean);
|
|
11
|
+
focus(options?: FocusOptions): void;
|
|
12
|
+
click(): void;
|
|
13
|
+
private syncToInnerButton;
|
|
14
|
+
private upgradeProperty;
|
|
15
|
+
private onMessage;
|
|
16
|
+
private onClickButton;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=sync-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-button.d.ts","sourceRoot":"","sources":["../../src/browser/web-components/sync-button.ts"],"names":[],"mappings":"AAgBA,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"}
|