UNPKG

@liascript/exporter

Version:
1 lines β€’ 19.4 kB
!function(){function e(e,n,t,o){Object.defineProperty(e,n,{get:t,set:o,enumerable:!0,configurable:!0})}var n=("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{}).parcelRequire55a5;n.register("2OEDy",(function(t,o){e(t.exports,"Sync",(function(){return y}));var r=n("f1evb"),i=n("hnmIs"),s=n("9Klpk"),a=n("3bWnf"),c=n("eT7f3"),l=n("9WzNc"),u=n("div3d"),d=n("kb0qF"),f=n("bgoEC"),g=n("bWNdT"),h=n("32Euv"),p=n("auvHb"),v=n("9sT0C"),m=n("733OA"),y=function(e){"use strict";(0,d.default)(t,e);var n=(0,g.default)(t);function t(){var e;return(0,s.default)(this,t),e=n.apply(this,arguments),(0,c.default)((0,r.default)(e),"syncFallbackTimer",null),e}return(0,a.default)(t,[{key:"destroy",value:function(){var e;null!==this.syncFallbackTimer&&(clearTimeout(this.syncFallbackTimer),this.syncFallbackTimer=null),(0,l.default)((0,u.default)(t.prototype),"destroy",this).call(this),null===(e=this.provider)||void 0===e||e.disconnect()}},{key:"connect",value:function(e){var n=this,o=this;return(0,i.default)((function(){var r,i;return(0,h.__generator)(this,(function(s){if((0,l.default)((0,u.default)(t.prototype),"connect",n).call(o,e),o.signaling=(null===(r=e.config)||void 0===r?void 0:r.signaling)?e.config.signaling.split(",").map((function(e){return e.trim()})).filter(Boolean):void 0,!o.signaling||0===o.signaling.length)return[2,o.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(null===(i=e.config)||void 0===i?void 0:i.iceServers)try{o.iceServers=JSON.parse(e.config.iceServers)}catch(n){console.warn("SimplePeer: invalid iceServers JSON, ignoring:",e.config.iceServers)}return window.SimplePeer?o.init(!0):o.load(["//unpkg.com/simple-peer@9.11.1/simplepeer.min.js"],o),[2]}))}))()}},{key:"init",value:function(e,n){var t=this,o=this.uniqueID();if(e&&window.SimplePeer&&o)(function(e){return w.apply(this,arguments)})(o).then((function(e){var n,o=null!==(n=t.iceServers)&&void 0!==n?n:JSON.parse("null");t.transport=new(0,v.SimplePeerTransport)((0,f.default)({peer:window.SimplePeer},t.signaling?{signaling:t.signaling}:{},o?{iceServers:o}:{},t.password?{password:t.password}:{})),t.provider=new(0,m.GenericProvider)(t.db.doc,t.transport),t.db.setAwareness(t.provider.awareness);var r=!1,i=function(){r||(r=!0,null!==t.syncFallbackTimer&&(clearTimeout(t.syncFallbackTimer),t.syncFallbackTimer=null),t.sendConnect())};t.provider.on("synced",(function(e){console.log("SimplePeer: document synchronized",e.synced),i()})),t.provider.on("status",(function(e){var n=e.state;console.log("SimplePeer status: ".concat(n)),"connected"===n?t.syncFallbackTimer=setTimeout((function(){console.log("SimplePeer: sync fallback, proceeding as first peer"),i()}),2e3):"disconnected"===n&&console.warn("SimplePeer: disconnected")})),t.provider.pubsub.subscribe("*",(function(e,n){var o,r;null===(r=(o=t).onReceive)||void 0===r||r.call(o,n,e)})),t.provider.connect((0,f.default)({room:e},t.password?{password:t.password}:{}))}));else{var r="SimplePeer unknown error";n?r="Could not load resource: "+n:window.SimplePeer||(r="Could not load SimplePeer library"),this.sendDisconnectError(r)}}},{key:"pubsubSend",value:function(e,n){var t;this.provider&&(this.provider.pubsub.publish(e,n),this.replyOnReceive&&(null===(t=this.onReceive)||void 0===t||t.call(this,e,n)))}}]),t}(p.Sync);function w(){return(w=(0,i.default)((function(e){var n,t;return(0,h.__generator)(this,(function(o){switch(o.label){case 0:return n=(new TextEncoder).encode(e),[4,crypto.subtle.digest("SHA-256",n)];case 1:return t=o.sent(),[2,Array.from(new Uint8Array(t)).map((function(e){return e.toString(16).padStart(2,"0")})).join("")]}}))}))).apply(this,arguments)}})),n.register("9sT0C",(function(t,o){e(t.exports,"SimplePeerTransport",(function(){return g}));var r=n("hnmIs"),i=n("9Klpk"),s=n("3bWnf"),a=n("bgoEC"),c=n("7j4mF"),l=n("6Wo7Q"),u=n("rJmE6"),d=n("32Euv"),f=0,g=function(){"use strict";function e(n){var t,o;if((0,i.default)(this,e),this._connected=!1,this._room="",this.peers=new Map,this.signalingConns=[],this.announcedPeers=new Set,!n.peer)throw new Error('SimplePeerTransport requires the "peer" option. Please provide the simple-peer constructor: import Peer from "simple-peer"; new SimplePeerTransport({ peer: Peer, ... })');var r,s,l,u,d,f=(0,a.default)({},n.peerOpts);if(n.iceServers||!(null===(t=f.config)||void 0===t?void 0:t.iceServers)){var g,h=null!==(g=n.iceServers)&&void 0!==g?g:[{urls:"stun:stun.l.google.com:19302"}];f.config=(0,c.default)((0,a.default)({},f.config),{iceServers:h})}this.options={peer:n.peer,signaling:null!==(r=n.signaling)&&void 0!==r?r:["wss://signaling.yjs.dev"],password:null!==(s=n.password)&&void 0!==s?s:"",maxConns:null!==(l=n.maxConns)&&void 0!==l?l:20+Math.floor(15*Math.random()),peerOpts:f,debug:null!==(u=n.debug)&&void 0!==u&&u},this.peerId=this.generatePeerId(),this.log("Initialized β€” peerId: ".concat(this.peerId,", maxConns: ").concat(this.options.maxConns),"\n signaling: [".concat(this.options.signaling.join(", "),"]"),"\n iceServers: [".concat((null!==(d=null===(o=f.config)||void 0===o?void 0:o.iceServers)&&void 0!==d?d:[]).map((function(e){return Array.isArray(e.urls)?e.urls[0]:e.urls})).join(", "),"]"))}return(0,s.default)(e,[{key:"connect",value:function(e){var n=this;return(0,r.default)((function(){var t,o;return(0,d.__generator)(this,(function(r){switch(r.label){case 0:if(n._connected)throw new Error("Already connected");return n._room=e.room,n.log('πŸ”Œ Connecting to room "'.concat(e.room,'" as ').concat(n.peerId)),[4,Promise.allSettled(n.options.signaling.map((function(e){return n.connectSignaling(e)})))];case 1:return t=r.sent(),o=t.filter((function(e){return"fulfilled"===e.status})).length,t.filter((function(e){return"rejected"===e.status})).length,o>0?n.log("πŸ“‘ Signaling: ".concat(o,"/").concat(n.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."),t.forEach((function(e,t){var o,r;"rejected"===e.status&&console.warn("[SimplePeerTransport] βœ— ".concat(n.options.signaling[t],":"),null!==(r=null===(o=e.reason)||void 0===o?void 0:o.message)&&void 0!==r?r:e.reason)}))),n._connected=!0,n.log('βœ… Connected to room "'.concat(n._room,'" β€” ').concat(n.signalingConns.length,"/").concat(n.options.signaling.length," signaling server(s)")),n.announceInterval=setInterval((function(){if(n.peers.size<n.options.maxConns&&n.signalingConns.length>0){n.log("Re-announcing presence...");var e=!0,t=!1,o=void 0;try{for(var r,i=n.signalingConns[Symbol.iterator]();!(e=(r=i.next()).done);e=!0){var s=r.value;n.sendSignaling(s,{type:"publish",topic:n._room,from:n.peerId})}}catch(e){t=!0,o=e}finally{try{e||null==i.return||i.return()}finally{if(t)throw o}}}}),5e3),[2]}}))}))()}},{key:"disconnect",value:function(){if(this._connected){this.log("πŸ”Œ Disconnecting β€” ".concat(this.peers.size," peer(s), ").concat(this.signalingConns.length," signaling server(s)")),this.announceInterval&&(clearInterval(this.announceInterval),this.announceInterval=void 0);var e=!0,n=!1,t=void 0;try{for(var o,r=this.peers.values()[Symbol.iterator]();!(e=(o=r.next()).done);e=!0){o.value.peer.destroy()}}catch(e){n=!0,t=e}finally{try{e||null==r.return||r.return()}finally{if(n)throw t}}this.peers.clear();var i=!0,s=!1,a=void 0;try{for(var c,l=this.signalingConns[Symbol.iterator]();!(i=(c=l.next()).done);i=!0){c.value.close()}}catch(e){s=!0,a=e}finally{try{i||null==l.return||l.return()}finally{if(s)throw a}}this.signalingConns=[],this._connected=!1,this.announcedPeers.clear()}}},{key:"send",value:function(e){if(this._connected){var n=this.options.password?this.encrypt(e,this.options.password):e,t=0,o=!0,r=!1,i=void 0;try{for(var s,a=this.peers.values()[Symbol.iterator]();!(o=(s=a.next()).done);o=!0){var c=s.value;if(c.connected)try{this.sendToPeer(c,n),t++}catch(e){this.log("❌ Send failed to ".concat(c.peerId,":"),e.message)}}}catch(e){r=!0,i=e}finally{try{o||null==a.return||a.return()}finally{if(r)throw i}}if(0===t)this.log("⚠️ Send: 0 peers connected β€” ".concat(e.length,"B dropped"));else if(t<this.peers.size){var l=this.peers.size-t;this.log("πŸ“€ Sent ".concat(e.length,"B to ").concat(t,"/").concat(this.peers.size," peer(s) β€” ").concat(l," not yet connected"))}}else this.log("Not connected, cannot send")}},{key:"sendToPeer",value:function(e,n){if(n.length<=65535){var t=new Uint8Array(n.length+1);return t[0]=0,t.set(n,1),void e.peer.send(t)}var o=f++,r=Math.ceil(n.length/65523);this.log("πŸ“¦ Chunking ".concat(n.length,"B β†’ ").concat(r," chunks (msgId=").concat(o,")"));for(var i=[],s=0;s<r;s++){var a=65523*s,c=Math.min(a+65523,n.length),l=n.slice(a,c),u=new Uint8Array(13+l.length);u[0]=1,new DataView(u.buffer).setUint32(1,o,!0),new DataView(u.buffer).setUint32(5,s,!0),new DataView(u.buffer).setUint32(9,r,!0),u.set(l,13),i.push(u)}this.sendChunksWithFlowControl(e,i)}},{key:"sendChunksWithFlowControl",value:function(e,n){var t=this,o=0,r=e.peer,i=function(){for(var s=function(){var s=r._channel;if(s&&s.bufferedAmount>16384)return t.log("⏸️ Backpressure on ".concat(e.peerId,": buffered ").concat(s.bufferedAmount,"B, waiting...")),s.bufferedAmountLowThreshold=8192,s.onbufferedamountlow=function(){s.onbufferedamountlow=null,t.log("▢️ Buffer drained on ".concat(e.peerId,", resuming chunks")),i()},{v:void 0};try{r.send(n[o]),o++}catch(e){return t.log("Error sending chunk:",o,e),{v:void 0}}};o<n.length;){var a=s();if("object"===(0,u.default)(a))return a.v}};i()}},{key:"onMessage",value:function(e){var n=this;return this._callback=e,function(){n._callback=void 0}}},{key:"onPeerConnect",value:function(e){var n=this;return this._peerConnectCallback=e,function(){n._peerConnectCallback=void 0}}},{key:"isConnected",get:function(){return this._connected}},{key:"connectedPeers",get:function(){return Array.from(this.peers.values()).filter((function(e){return e.connected})).length}},{key:"connectSignaling",value:function(e){var n=this;return(0,r.default)((function(){return(0,d.__generator)(this,(function(t){return[2,new Promise((function(t,o){var r=new WebSocket(e),i=!1;r.onopen=function(){n.log("🟒 Signaling connected: ".concat(e)),n.sendSignaling(r,{type:"subscribe",topics:[n._room]}),n.peers.size<n.options.maxConns&&(n.sendSignaling(r,{type:"publish",topic:n._room,from:n.peerId}),n.sendSignaling(r,{type:"announce",from:n.peerId,topic:n._room})),n.signalingConns.push(r),i||(i=!0,t())},r.onmessage=function(e){try{var t,o=JSON.parse(e.data);(o.signal||"announce"===o.type)&&n.log("πŸ“© Signaling β€Ή".concat(o.type,"β€Ί"),o.from?"from=".concat(o.from.slice(0,8)):"",o.to?"to=".concat(o.to.slice(0,8)):"",o.signal?"signal=".concat(null!==(t=o.signal.type)&&void 0!==t?t:"candidate"):""),n.handleSignalingMessage(o)}catch(t){n.log("❌ Failed to parse signaling message: ".concat(t.message," raw=").concat(e.data))}},r.onerror=function(t){n.log("❌ Signaling error: ".concat(e),t),i||(i=!0,o(t))},r.onclose=function(){n.log("πŸ”΄ Signaling disconnected: ".concat(e));var t=n.signalingConns.indexOf(r);t>-1&&n.signalingConns.splice(t,1)},setTimeout((function(){i||(i=!0,n.log("⏱️ Signaling connection timeout: ".concat(e)),o(new Error("Signaling connection timeout")))}),1e4)}))]}))}))()}},{key:"handleSignalingMessage",value:function(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)){var n=this.peerId>e.from;if(this.log("πŸ“‘ Peer discovered via publish: ".concat(e.from," β€” role: ").concat(n?"initiator":"non-initiator"),"(peers: ".concat(this.peers.size+1,"/").concat(this.options.maxConns,")")),this.announcedPeers.add(e.from),this.createPeerConnection(e.from,n),!n){this.log("πŸ“’ Re-announcing so initiator can find us...");var t=!0,o=!1,r=void 0;try{for(var i,s=this.signalingConns[Symbol.iterator]();!(t=(i=s.next()).done);t=!0){var a=i.value;this.sendSignaling(a,{type:"publish",topic:this._room,from:this.peerId})}}catch(e){o=!0,r=e}finally{try{t||null==s.return||s.return()}finally{if(o)throw r}}}}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)){var c=this.peerId>e.from;this.log("πŸ“‘ Peer announced: ".concat(e.from," β€” role: ").concat(c?"initiator":"non-initiator"),"(peers: ".concat(this.peers.size+1,"/").concat(this.options.maxConns,")")),this.announcedPeers.add(e.from),this.createPeerConnection(e.from,c)}else this.peers.size>=this.options.maxConns&&this.log("⚠️ Peer limit reached (".concat(this.options.maxConns,"), ignoring announce from ").concat(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: ".concat(e.type))}}},{key:"sendSignaling",value:function(e,n){e.readyState===WebSocket.OPEN&&e.send(JSON.stringify(n))}},{key:"broadcastSignaling",value:function(e){var n=!0,t=!1,o=void 0;try{for(var r,i=this.signalingConns[Symbol.iterator]();!(n=(r=i.next()).done);n=!0){var s=r.value;this.sendSignaling(s,e)}}catch(e){t=!0,o=e}finally{try{n||null==i.return||i.return()}finally{if(t)throw o}}}},{key:"createPeerConnection",value:function(e,n){var t=this;if(this.peers.has(e))this.log("⏭️ Peer connection already exists: ".concat(e));else{this.log("🀝 Creating ".concat(n?"outbound (initiator)":"inbound (non-initiator)"," connection to ").concat(e));var o=new this.options.peer((0,a.default)({initiator:n},this.options.peerOpts)),r={peer:o,connected:!1,peerId:e,chunkBuffers:new Map};this.peers.set(e,r),o.on("signal",(function(n){var o;t.log("πŸ“€ Signal to ".concat(e,": ").concat(null!==(o=n.type)&&void 0!==o?o:"candidate")),t.broadcastSignaling({type:"publish",from:t.peerId,to:e,signal:n,topic:t._room})}));var i=function(n){var o,i;if(!r.connected){r.connected=!0;var s=Array.from(t.peers.values()).filter((function(e){return e.connected})).length;t.log("βœ… Peer channel open (".concat(n,"): ").concat(e," β€” ").concat(s,"/").concat(t.peers.size," peer(s) connected")),null===(i=(o=t)._peerConnectCallback)||void 0===i||i.call(o,e)}};o.on("connect",(function(){return i("connect")})),o._pc&&(o._pc.oniceconnectionstatechange=function(){t.log("🧊 ICE ".concat(e,": ").concat(o._pc.iceConnectionState))},o._pc.onconnectionstatechange=function(){t.log("πŸ”— Connection ".concat(e,": ").concat(o._pc.connectionState))}),o.on("data",(function(e){if(i("data"),t._callback)try{var n=new Uint8Array(e);if(0===n.length)return;var o=n[0];if(0===o){var s=n.slice(1),a=t.options.password?t.decrypt(s,t.options.password):s;t._callback(a)}else if(1===o){var c=new DataView(n.buffer,n.byteOffset),l=c.getUint32(1,!0),u=c.getUint32(5,!0),d=c.getUint32(9,!0),f=n.slice(13),g=r.chunkBuffers.get(l);if(g||(g={chunks:new Map,totalChunks:d},r.chunkBuffers.set(l,g)),g.chunks.set(u,f),g.chunks.size===d){for(var h=0,p=0;p<d;p++)h+=g.chunks.get(p).length;for(var v=new Uint8Array(h),m=0,y=0;y<d;y++){var w=g.chunks.get(y);v.set(w,m),m+=w.length}r.chunkBuffers.delete(l);var b=t.options.password?t.decrypt(v,t.options.password):v;t._callback(b),t.log("πŸ“₯ Reassembled ".concat(h,"B from ").concat(d," chunks (msgId=").concat(l,")"))}}else{var S=t.options.password?t.decrypt(n,t.options.password):n;t._callback(S)}}catch(e){t.log("Error handling peer data:",e)}})),o.on("error",(function(n){var o;t.log("❌ Peer error [".concat(e,"]: ").concat(null!==(o=n.message)&&void 0!==o?o:n)),t.removePeer(e)})),o.on("close",(function(){var n=Array.from(t.peers.values()).filter((function(n){return n.connected&&n.peerId!==e})).length;t.log("πŸ”΄ Peer channel closed: ".concat(e," β€” ").concat(n,"/").concat(t.peers.size-1," remaining")),t.removePeer(e)}))}}},{key:"handlePeerSignal",value:function(e,n){var t,o=this.peers.get(e);o||(this.log("πŸ“Ά Signal from unknown peer ".concat(e," (").concat(null!==(t=null==n?void 0:n.type)&&void 0!==t?t:"candidate",") β€” creating non-initiator connection")),this.createPeerConnection(e,!1),o=this.peers.get(e));if(o)try{o.peer.signal(n)}catch(n){this.log("❌ Failed to apply signal from ".concat(e,": ").concat(n.message))}else this.log("❌ Could not create peer connection for signal from ".concat(e))}},{key:"removePeer",value:function(e){var n=this.peers.get(e);if(n){try{n.peer.destroy()}catch(e){}this.peers.delete(e),this.announcedPeers.delete(e);var t=Array.from(this.peers.values()).filter((function(e){return e.connected})).length;this.log("πŸ—‘οΈ Removed peer ".concat(e," β€” ").concat(t," connected / ").concat(this.peers.size," total"))}}},{key:"generatePeerId",value:function(){return Date.now().toString(36)+Math.random().toString(36).substr(2,9)}},{key:"encrypt",value:function(e,n){for(var t=this.hashPassword(n),o=new Uint8Array(e.length),r=0;r<e.length;r++)o[r]=e[r]^t[r%t.length];return o}},{key:"decrypt",value:function(e,n){return this.encrypt(e,n)}},{key:"hashPassword",value:function(e){return(new TextEncoder).encode(e)}},{key:"log",value:function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];var o;this.options.debug&&(o=console).log.apply(o,["[SimplePeerTransport]"].concat((0,l.default)(n)))}}]),e}()})),n.register("84cK9",(function(e,n){var t,o,r=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function a(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{o="function"==typeof clearTimeout?clearTimeout:s}catch(e){o=s}}();var c,l=[],u=!1,d=-1;function f(){u&&c&&(u=!1,c.length?l=c.concat(l):d=-1,l.length&&g())}function g(){if(!u){var e=a(f);u=!0;for(var n=l.length;n;){for(c=l,l=[];++d<n;)c&&c[d].run();d=-1,n=l.length}c=null,u=!1,function(e){if(o===clearTimeout)return clearTimeout(e);if((o===s||!o)&&clearTimeout)return o=clearTimeout,clearTimeout(e);try{return o(e)}catch(n){try{return o.call(null,e)}catch(n){return o.call(this,e)}}}(e)}}function h(e,n){this.fun=e,this.array=n}function p(){}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];l.push(new h(e,n)),1!==l.length||u||a(g)},h.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=p,r.addListener=p,r.once=p,r.off=p,r.removeListener=p,r.removeAllListeners=p,r.emit=p,r.prependListener=p,r.prependOnceListener=p,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}}))}();