UNPKG

@liascript/exporter

Version:
1 lines β€’ 16.4 kB
!function(e,n,t,s,i){var r="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},o="function"==typeof r[s]&&r[s],c=o.cache||{},a="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function l(n,t){if(!c[n]){if(!e[n]){var i="function"==typeof r[s]&&r[s];if(!t&&i)return i(n,!0);if(o)return o(n,!0);if(a&&"string"==typeof n)return a(n);var h=new Error("Cannot find module '"+n+"'");throw h.code="MODULE_NOT_FOUND",h}p.resolve=function(t){var s=e[n][1][t];return null!=s?s:t},p.cache={};var g=c[n]=new l.Module(n);e[n][0].call(g.exports,p,g,g.exports,this)}return c[n].exports;function p(e){var n=p.resolve(e);return!1===n?{}:l(n)}}l.isParcelRequire=!0,l.Module=function(e){this.id=e,this.bundle=l,this.exports={}},l.modules=e,l.cache=c,l.parent=o,l.register=function(n,t){e[n]=[function(e,n){n.exports=t},{}]},Object.defineProperty(l,"root",{get:function(){return r[s]}}),r[s]=l;for(var h=0;h<n.length;h++)l(n[h])}({"3Bhun":[function(e,n,t){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(t),s.export(t,"Sync",(()=>c));var i=e("../Base/index"),r=e("../../../../node_modules/y-generic/dist/providers/simple-peer/index"),o=e("y-generic");class c extends i.Sync{syncFallbackTimer=null;destroy(){null!==this.syncFallbackTimer&&(clearTimeout(this.syncFallbackTimer),this.syncFallbackTimer=null),super.destroy(),this.provider?.disconnect()}async connect(e){if(super.connect(e),this.signaling=e.config?.signaling?e.config.signaling.split(",").map((e=>e.trim())).filter(Boolean):void 0,!this.signaling||0===this.signaling.length)return this.sendDisconnectError("You have to provide at least one signaling server URL (e.g. wss://your-signaling-server.example.com). See https://github.com/yjs/y-webrtc for setup instructions.");if(e.config?.iceServers)try{this.iceServers=JSON.parse(e.config.iceServers)}catch{console.warn("SimplePeer: invalid iceServers JSON, ignoring:",e.config.iceServers)}window.SimplePeer?this.init(!0):this.load(["//unpkg.com/simple-peer@9.11.1/simplepeer.min.js"],this)}init(e,n){const t=this.uniqueID();if(e&&window.SimplePeer&&t)(async function(e){const n=(new TextEncoder).encode(e),t=await crypto.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(t)).map((e=>e.toString(16).padStart(2,"0"))).join("")})(t).then((e=>{const n=this.iceServers??JSON.parse("null");this.transport=new(0,r.SimplePeerTransport)({peer:window.SimplePeer,...this.signaling?{signaling:this.signaling}:{},...n?{iceServers:n}:{},...this.password?{password:this.password}:{}}),this.provider=new(0,o.GenericProvider)(this.db.doc,this.transport),this.db.setAwareness(this.provider.awareness);let t=!1;const s=()=>{t||(t=!0,null!==this.syncFallbackTimer&&(clearTimeout(this.syncFallbackTimer),this.syncFallbackTimer=null),this.sendConnect())};this.provider.on("synced",(e=>{console.log("SimplePeer: document synchronized",e.synced),s()})),this.provider.on("status",(e=>{const n=e.state;console.log(`SimplePeer status: ${n}`),"connected"===n?this.syncFallbackTimer=setTimeout((()=>{console.log("SimplePeer: sync fallback, proceeding as first peer"),s()}),2e3):"disconnected"===n&&console.warn("SimplePeer: disconnected")})),this.provider.pubsub.subscribe("*",((e,n)=>{this.onReceive?.(n,e)})),this.provider.connect({room:e,...this.password?{password:this.password}:{}})}));else{let e="SimplePeer unknown error";n?e="Could not load resource: "+n:window.SimplePeer||(e="Could not load SimplePeer library"),this.sendDisconnectError(e)}}pubsubSend(e,n){this.provider&&(this.provider.pubsub.publish(e,n),this.replyOnReceive&&this.onReceive?.(e,n))}}},{"../Base/index":"2cTju","../../../../node_modules/y-generic/dist/providers/simple-peer/index":"7rxqm","y-generic":"3M9RT","@parcel/transformer-js/src/esmodule-helpers.js":"XTfsy"}],"7rxqm":[function(e,n,t){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(t),s.export(t,"SimplePeerTransport",(()=>r));let i=0;class r{constructor(e){if(this._connected=!1,this._room="",this.peers=new Map,this.signalingConns=[],this.announcedPeers=new Set,!e.peer)throw new Error('SimplePeerTransport requires the "peer" option. Please provide the simple-peer constructor: import Peer from "simple-peer"; new SimplePeerTransport({ peer: Peer, ... })');const n=[{urls:"stun:stun.l.google.com:19302"}],t={...e.peerOpts};if(e.iceServers||!t.config?.iceServers){const s=e.iceServers??n;t.config={...t.config,iceServers:s}}this.options={peer:e.peer,signaling:e.signaling??["wss://signaling.yjs.dev"],password:e.password??"",maxConns:e.maxConns??20+Math.floor(15*Math.random()),peerOpts:t,debug:e.debug??!1},this.peerId=this.generatePeerId(),this.log(`Initialized β€” peerId: ${this.peerId}, maxConns: ${this.options.maxConns}`,`\n signaling: [${this.options.signaling.join(", ")}]`,`\n iceServers: [${(t.config?.iceServers??[]).map((e=>Array.isArray(e.urls)?e.urls[0]:e.urls)).join(", ")}]`)}async connect(e){if(this._connected)throw new Error("Already connected");this._room=e.room,this.log(`πŸ”Œ Connecting to room "${e.room}" as ${this.peerId}`);const n=await Promise.allSettled(this.options.signaling.map((e=>this.connectSignaling(e)))),t=n.filter((e=>"fulfilled"===e.status)).length;n.filter((e=>"rejected"===e.status)).length;t>0?this.log(`πŸ“‘ Signaling: ${t}/${this.options.signaling.length} server(s) connected`):(console.warn("[SimplePeerTransport] ⚠️ No signaling servers reachable β€” WebRTC peer discovery disabled. Cross-tab sync via BroadcastChannel will still work."),n.forEach(((e,n)=>{"rejected"===e.status&&console.warn(`[SimplePeerTransport] βœ— ${this.options.signaling[n]}:`,e.reason?.message??e.reason)}))),this._connected=!0,this.log(`βœ… Connected to room "${this._room}" β€” ${this.signalingConns.length}/${this.options.signaling.length} signaling server(s)`),this.announceInterval=setInterval((()=>{if(this.peers.size<this.options.maxConns&&this.signalingConns.length>0){this.log("Re-announcing presence...");for(const e of this.signalingConns)this.sendSignaling(e,{type:"publish",topic:this._room,from:this.peerId})}}),5e3)}disconnect(){if(this._connected){this.log(`πŸ”Œ Disconnecting β€” ${this.peers.size} peer(s), ${this.signalingConns.length} signaling server(s)`),this.announceInterval&&(clearInterval(this.announceInterval),this.announceInterval=void 0);for(const e of this.peers.values())e.peer.destroy();this.peers.clear();for(const e of this.signalingConns)e.close();this.signalingConns=[],this._connected=!1,this.announcedPeers.clear()}}send(e){if(!this._connected)return void this.log("Not connected, cannot send");const n=this.options.password?this.encrypt(e,this.options.password):e;let t=0;for(const e of this.peers.values())if(e.connected)try{this.sendToPeer(e,n),t++}catch(n){this.log(`❌ Send failed to ${e.peerId}:`,n.message)}if(0===t)this.log(`⚠️ Send: 0 peers connected β€” ${e.length}B dropped`);else if(t<this.peers.size){const n=this.peers.size-t;this.log(`πŸ“€ Sent ${e.length}B to ${t}/${this.peers.size} peer(s) β€” ${n} not yet connected`)}}sendToPeer(e,n){if(n.length<=65535){const t=new Uint8Array(n.length+1);return t[0]=0,t.set(n,1),void e.peer.send(t)}const t=i++,s=Math.ceil(n.length/65523);this.log(`πŸ“¦ Chunking ${n.length}B β†’ ${s} chunks (msgId=${t})`);const r=[];for(let e=0;e<s;e++){const i=65523*e,o=Math.min(i+65523,n.length),c=n.slice(i,o),a=new Uint8Array(13+c.length);a[0]=1,new DataView(a.buffer).setUint32(1,t,!0),new DataView(a.buffer).setUint32(5,e,!0),new DataView(a.buffer).setUint32(9,s,!0),a.set(c,13),r.push(a)}this.sendChunksWithFlowControl(e,r)}sendChunksWithFlowControl(e,n){let t=0;const s=e.peer,i=()=>{for(;t<n.length;){const r=s._channel;if(r&&r.bufferedAmount>16384)return this.log(`⏸️ Backpressure on ${e.peerId}: buffered ${r.bufferedAmount}B, waiting...`),r.bufferedAmountLowThreshold=8192,void(r.onbufferedamountlow=()=>{r.onbufferedamountlow=null,this.log(`▢️ Buffer drained on ${e.peerId}, resuming chunks`),i()});try{s.send(n[t]),t++}catch(e){return void this.log("Error sending chunk:",t,e)}}};i()}onMessage(e){return this._callback=e,()=>{this._callback=void 0}}onPeerConnect(e){return this._peerConnectCallback=e,()=>{this._peerConnectCallback=void 0}}get isConnected(){return this._connected}get connectedPeers(){return Array.from(this.peers.values()).filter((e=>e.connected)).length}async connectSignaling(e){return new Promise(((n,t)=>{const s=new WebSocket(e);let i=!1;s.onopen=()=>{this.log(`🟒 Signaling connected: ${e}`),this.sendSignaling(s,{type:"subscribe",topics:[this._room]}),this.peers.size<this.options.maxConns&&(this.sendSignaling(s,{type:"publish",topic:this._room,from:this.peerId}),this.sendSignaling(s,{type:"announce",from:this.peerId,topic:this._room})),this.signalingConns.push(s),i||(i=!0,n())},s.onmessage=e=>{try{const n=JSON.parse(e.data);(n.signal||"announce"===n.type)&&this.log(`πŸ“© Signaling β€Ή${n.type}β€Ί`,n.from?`from=${n.from.slice(0,8)}`:"",n.to?`to=${n.to.slice(0,8)}`:"",n.signal?`signal=${n.signal.type??"candidate"}`:""),this.handleSignalingMessage(n)}catch(n){this.log(`❌ Failed to parse signaling message: ${n.message} raw=${e.data}`)}},s.onerror=n=>{this.log(`❌ Signaling error: ${e}`,n),i||(i=!0,t(n))},s.onclose=()=>{this.log(`πŸ”΄ Signaling disconnected: ${e}`);const n=this.signalingConns.indexOf(s);n>-1&&this.signalingConns.splice(n,1)},setTimeout((()=>{i||(i=!0,this.log(`⏱️ Signaling connection timeout: ${e}`),t(new Error("Signaling connection timeout")))}),1e4)}))}handleSignalingMessage(e){if(!e.from||e.from!==this.peerId)switch(e.type){case"publish":if(e.from&&!this.peers.has(e.from)&&this.peers.size<this.options.maxConns&&!this.announcedPeers.has(e.from)){const n=this.peerId>e.from;if(this.log(`πŸ“‘ Peer discovered via publish: ${e.from} β€” role: ${n?"initiator":"non-initiator"}`,`(peers: ${this.peers.size+1}/${this.options.maxConns})`),this.announcedPeers.add(e.from),this.createPeerConnection(e.from,n),!n){this.log("πŸ“’ Re-announcing so initiator can find us...");for(const e of this.signalingConns)this.sendSignaling(e,{type:"publish",topic:this._room,from:this.peerId})}}e.signal&&e.from&&(e.to&&e.to!==this.peerId||this.handlePeerSignal(e.from,e.signal));break;case"announce":if(!e.from)return void this.log("Announce message missing from field");if(!this.peers.has(e.from)&&this.peers.size<this.options.maxConns&&!this.announcedPeers.has(e.from)){const n=this.peerId>e.from;this.log(`πŸ“‘ Peer announced: ${e.from} β€” role: ${n?"initiator":"non-initiator"}`,`(peers: ${this.peers.size+1}/${this.options.maxConns})`),this.announcedPeers.add(e.from),this.createPeerConnection(e.from,n)}else this.peers.size>=this.options.maxConns&&this.log(`⚠️ Peer limit reached (${this.options.maxConns}), ignoring announce from ${e.from}`);break;case"signal":if(!e.from)return void this.log("Signal message missing from field");(e.to===this.peerId&&e.signal||!e.to&&e.signal)&&this.handlePeerSignal(e.from,e.signal);break;default:this.log(`❓ Unknown signaling message type: ${e.type}`)}}sendSignaling(e,n){e.readyState===WebSocket.OPEN&&e.send(JSON.stringify(n))}broadcastSignaling(e){for(const n of this.signalingConns)this.sendSignaling(n,e)}createPeerConnection(e,n){if(this.peers.has(e))return void this.log(`⏭️ Peer connection already exists: ${e}`);this.log(`🀝 Creating ${n?"outbound (initiator)":"inbound (non-initiator)"} connection to ${e}`);const t=new this.options.peer({initiator:n,...this.options.peerOpts}),s={peer:t,connected:!1,peerId:e,chunkBuffers:new Map};this.peers.set(e,s),t.on("signal",(n=>{this.log(`πŸ“€ Signal to ${e}: ${n.type??"candidate"}`),this.broadcastSignaling({type:"publish",from:this.peerId,to:e,signal:n,topic:this._room})}));const i=n=>{if(s.connected)return;s.connected=!0;const t=Array.from(this.peers.values()).filter((e=>e.connected)).length;this.log(`βœ… Peer channel open (${n}): ${e} β€” ${t}/${this.peers.size} peer(s) connected`),this._peerConnectCallback?.(e)};t.on("connect",(()=>i("connect"))),t._pc&&(t._pc.oniceconnectionstatechange=()=>{this.log(`🧊 ICE ${e}: ${t._pc.iceConnectionState}`)},t._pc.onconnectionstatechange=()=>{this.log(`πŸ”— Connection ${e}: ${t._pc.connectionState}`)}),t.on("data",(e=>{if(i("data"),this._callback)try{const n=new Uint8Array(e);if(0===n.length)return;const t=n[0];if(0===t){const e=n.slice(1),t=this.options.password?this.decrypt(e,this.options.password):e;this._callback(t)}else if(1===t){const e=new DataView(n.buffer,n.byteOffset),t=e.getUint32(1,!0),i=e.getUint32(5,!0),r=e.getUint32(9,!0),o=n.slice(13);let c=s.chunkBuffers.get(t);if(c||(c={chunks:new Map,totalChunks:r},s.chunkBuffers.set(t,c)),c.chunks.set(i,o),c.chunks.size===r){let e=0;for(let n=0;n<r;n++)e+=c.chunks.get(n).length;const n=new Uint8Array(e);let i=0;for(let e=0;e<r;e++){const t=c.chunks.get(e);n.set(t,i),i+=t.length}s.chunkBuffers.delete(t);const o=this.options.password?this.decrypt(n,this.options.password):n;this._callback(o),this.log(`πŸ“₯ Reassembled ${e}B from ${r} chunks (msgId=${t})`)}}else{const e=this.options.password?this.decrypt(n,this.options.password):n;this._callback(e)}}catch(e){this.log("Error handling peer data:",e)}})),t.on("error",(n=>{this.log(`❌ Peer error [${e}]: ${n.message??n}`),this.removePeer(e)})),t.on("close",(()=>{const n=Array.from(this.peers.values()).filter((n=>n.connected&&n.peerId!==e)).length;this.log(`πŸ”΄ Peer channel closed: ${e} β€” ${n}/${this.peers.size-1} remaining`),this.removePeer(e)}))}handlePeerSignal(e,n){let t=this.peers.get(e);if(t||(this.log(`πŸ“Ά Signal from unknown peer ${e} (${n?.type??"candidate"}) β€” creating non-initiator connection`),this.createPeerConnection(e,!1),t=this.peers.get(e)),t)try{t.peer.signal(n)}catch(n){this.log(`❌ Failed to apply signal from ${e}: ${n.message}`)}else this.log(`❌ Could not create peer connection for signal from ${e}`)}removePeer(e){const n=this.peers.get(e);if(n){try{n.peer.destroy()}catch(e){}this.peers.delete(e),this.announcedPeers.delete(e);const t=Array.from(this.peers.values()).filter((e=>e.connected)).length;this.log(`πŸ—‘οΈ Removed peer ${e} β€” ${t} connected / ${this.peers.size} total`)}}generatePeerId(){return Date.now().toString(36)+Math.random().toString(36).substr(2,9)}encrypt(e,n){const t=this.hashPassword(n),s=new Uint8Array(e.length);for(let n=0;n<e.length;n++)s[n]=e[n]^t[n%t.length];return s}decrypt(e,n){return this.encrypt(e,n)}hashPassword(e){return(new TextEncoder).encode(e)}log(...e){this.options.debug&&console.log("[SimplePeerTransport]",...e)}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"XTfsy"}],fDdlt:[function(e,n,t){var s,i,r=n.exports={};function o(){throw new Error("setTimeout has not been defined")}function c(){throw new Error("clearTimeout has not been defined")}function a(e){if(s===setTimeout)return setTimeout(e,0);if((s===o||!s)&&setTimeout)return s=setTimeout,setTimeout(e,0);try{return s(e,0)}catch(n){try{return s.call(null,e,0)}catch(n){return s.call(this,e,0)}}}!function(){try{s="function"==typeof setTimeout?setTimeout:o}catch(e){s=o}try{i="function"==typeof clearTimeout?clearTimeout:c}catch(e){i=c}}();var l,h=[],g=!1,p=-1;function d(){g&&l&&(g=!1,l.length?h=l.concat(h):p=-1,h.length&&u())}function u(){if(!g){var e=a(d);g=!0;for(var n=h.length;n;){for(l=h,h=[];++p<n;)l&&l[p].run();p=-1,n=h.length}l=null,g=!1,function(e){if(i===clearTimeout)return clearTimeout(e);if((i===c||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(e);try{return i(e)}catch(n){try{return i.call(null,e)}catch(n){return i.call(this,e)}}}(e)}}function f(e,n){this.fun=e,this.array=n}function m(){}r.nextTick=function(e){var n=new Array(arguments.length-1);if(arguments.length>1)for(var t=1;t<arguments.length;t++)n[t-1]=arguments[t];h.push(new f(e,n)),1!==h.length||g||a(u)},f.prototype.run=function(){this.fun.apply(null,this.array)},r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={},r.on=m,r.addListener=m,r.once=m,r.off=m,r.removeListener=m,r.removeAllListeners=m,r.emit=m,r.prependListener=m,r.prependOnceListener=m,r.listeners=function(e){return[]},r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},{}]},[],0,"parcelRequire55a5");