import { $APP, shadow$provide } from "./shared.js";
import*as esm_import$node_events from"node:events";import*as esm_import$$libp2p$crypto$keys from"@libp2p/crypto/keys";import*as esm_import$node_path from"node:path";import*as esm_import$$libp2p$peer_id from"@libp2p/peer-id";$APP.ardegazu.rooms.board={};$APP.ardegazu.rooms.board.new_room_secret=$APP.ardegazu.rooms.lib.crypto.new_room_secret;$APP.ardegazu.rooms.board.BOARD_SALT="board.ardegazu.ro/v1";$APP.ardegazu.rooms.board.DRAW_BCAST_MS=50;
$APP.ardegazu.rooms.board.DEFAULTS=$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2("relayMultiaddr /dns4/signal.ardegazu.ro/tcp/443/tls/ws/p2p/12D3KooWQzZvygPwd2F4JAqqf6tfBSJ29YtjzzftUyJ37RLCG5WT turnCredsUrl https://signal.ardegazu.ro/turn-credentials discoveryTopic _peer-discovery._p2p._pubsub".split(" "),0));
$APP.ardegazu.rooms.board.BoardClient=class extends esm_import$node_events.EventEmitter{constructor(a,b,c,d){super();this.net=a;this.log=b;this.roomId=c;this._name=d;this._elements=new Map;this._addMeta=new Map;this._editSeen=new Map;this._deleted=new Set}};$APP.ardegazu.rooms.board.sleep=function(a){return new Promise(function(b){return setTimeout(b,a)})};
$APP.ardegazu.rooms.board.encode_pts=function(a){if(a.length<2)return $APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["x",0,"y",0,"pts",[]],0));for(var b=a[0],c=a[1],d=[],e=2,f=Math.round(b*100),g=Math.round(c*100);;)if(e+1<a.length){var h=Math.round(a[e]*100),k=Math.round(a[e+1]*100);d.push(h-f);d.push(k-g);f=h;e+=2;g=k}else break;return $APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["x",
b,"y",c,"pts",d],0))};$APP.ardegazu.rooms.board.elements=function(a){var b=[];a._elements.forEach(function(c,d){return b.push(c)});return b};
$APP.ardegazu.rooms.board.draw_stroke=function(a,b,c){return Promise.resolve(null).then(function(d){if(b.length<2)throw Error("a stroke needs at least 2 points");d=$APP.ardegazu.rooms.js.truthy_QMARK_(c)?c:$APP.ardegazu.rooms.js.ordered();var e=$APP.ardegazu.rooms.lib.crypto.to_b64url($APP.ardegazu.rooms.lib.crypto.random_bytes(16)),f=$APP.ardegazu.rooms.js.nn(d.width,2),g=Math.min(Math.max($APP.ardegazu.rooms.js.nn(d.color,0),0),7),h=[];b.forEach(function(k){h.push(k.x);return h.push(k.y)});return function m(l){if(l>=
h.length)return Promise.resolve(null);var n=h.slice(l,l+512),p=l+512>=h.length;n=$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["kind","draw","id",e,"seg",n,"w",f,"c",g],0));p&&(n.done=!0);return $APP.ardegazu.rooms.lib.net.broadcast(a.net,n).then(function(q){return p?null:$APP.ardegazu.rooms.board.sleep($APP.ardegazu.rooms.board.DRAW_BCAST_MS).then(function(r){return m(l+512)})})}(0).then(function(l){l=$APP.ardegazu.rooms.board.encode_pts(h);
var m=$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["id",e,"k","stroke","x",l.x,"y",l.y,"pts",l.pts,"w",f,"c",g],0));return $APP.ardegazu.rooms.lib.log.append(a.log,$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["t","add","ts",Date.now(),"name",a._name,"el",m],0))).then(function(n){a._elements.set(e,m);return e})})})};
$APP.ardegazu.rooms.board.add_text=function(a,b,c,d,e){e=$APP.ardegazu.rooms.js.truthy_QMARK_(e)?e:$APP.ardegazu.rooms.js.ordered();var f=$APP.ardegazu.rooms.lib.crypto.to_b64url($APP.ardegazu.rooms.lib.crypto.random_bytes(16)),g=$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["id",f,"k","text","x",b,"y",c,"text",d,"size",$APP.ardegazu.rooms.js.nn(e.size,16),"c",Math.min(Math.max($APP.ardegazu.rooms.js.nn(e.color,0),0),7)],
0));return $APP.ardegazu.rooms.lib.log.append(a.log,$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["t","add","ts",Date.now(),"name",a._name,"el",g],0))).then(function(h){a._elements.set(f,g);return f})};
$APP.ardegazu.rooms.board.erase=function(a,b){return $APP.ardegazu.rooms.lib.log.append(a.log,$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["t","del","ts",Date.now(),"name",a._name,"ids",b],0))).then(function(c){b.forEach(function(d){a._deleted.add(d);a._elements.delete(d);return a._addMeta.delete(d)})})};$APP.ardegazu.rooms.board.close=function(a){return $APP.ardegazu.rooms.lib.log.close(a.log).then(function(b){return $APP.ardegazu.rooms.lib.net.close(a.net).then(function(c){})})};
$APP.ardegazu.rooms.board.add_superseded_QMARK_=function(a,b,c){var d=a.clock;a=a.hash;var e=d<b;return e?e:(b=d===b)?a<=c:b};$APP.ardegazu.rooms.board.edit_field_stale_QMARK_=function(a,b,c){var d=a.clock;a=a.hash;var e=d>b;return e?e:(b=d===b)?a>c:b};
$APP.ardegazu.rooms.board.apply_entry=function(a,b){var c=b.op,d=c.t,e=b.clock,f=b.hash;if("add"===d){var g=c.el;if(!$APP.cljs.core.truth_(function(){var r=!$APP.ardegazu.rooms.js.truthy_QMARK_(g);return r?r:(r="string"!==typeof g.id)?r:a._deleted.has(g.id)}())){c=g.id;var h=a._elements.get(c);d=a._addMeta;var k=d.get(c);$APP.cljs.core.truth_(function(){var r=$APP.ardegazu.rooms.js.truthy_QMARK_(h);return r?(r=$APP.ardegazu.rooms.js.truthy_QMARK_(k))?$APP.ardegazu.rooms.board.add_superseded_QMARK_(k,
e,f):r:r}())||(d.set(c,$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["clock",e,"hash",f],0))),a._elements.set(c,g),a.emit("element",g,b.from))}}else if("edit"===d){var l=c.id,m=a._elements.get(l),n=c.p;if(m!==void 0&&$APP.ardegazu.rooms.js.truthy_QMARK_(m)&&$APP.ardegazu.rooms.js.truthy_QMARK_(n)&&$APP.ardegazu.rooms.js.js_object_QMARK_(n)){var p=a._editSeen,q=$APP.cljs.core.volatile_BANG_(!1);Object.keys(n).forEach(function(r){var t=
""+$APP.cljs.core.str.cljs$core$IFn$_invoke$arity$1(l)+"|"+$APP.cljs.core.str.cljs$core$IFn$_invoke$arity$1(r),v=p.get(t),w=$APP.cljs.core,C=w.truth_;var J=$APP.ardegazu.rooms.js.truthy_QMARK_(v);v=J?$APP.ardegazu.rooms.board.edit_field_stale_QMARK_(v,e,f):J;C.call(w,v)||(p.set(t,$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["clock",e,"hash",f],0))),m[r]=n[r],$APP.cljs.core.vreset_BANG_(q,!0))});$APP.cljs.core.truth_($APP.cljs.core.deref(q))&&
a.emit("edited",l,n)}}else"del"===d&&(b=$APP.ardegazu.rooms.js.nn(c.ids,[]),b.forEach(function(r){a._deleted.add(r);a._elements.delete(r);return a._addMeta.delete(r)}),a.emit("deleted",b))};
$APP.ardegazu.rooms.board.join=function(a){return Promise.resolve(null).then(function(b){var c=$APP.ardegazu.rooms.js.nn(a.origin,"https://board.ardegazu.ro"),d=a.dataDir,e=$APP.ardegazu.rooms.js.nn(a.appSalt,$APP.ardegazu.rooms.board.BOARD_SALT),f=$APP.ardegazu.rooms.js.nn(a.identity,null);$APP.ardegazu.rooms.node.env.install_origin.cljs$core$IFn$_invoke$arity$1(c);$APP.ardegazu.rooms.node.env.install_browser_globals.cljs$core$IFn$_invoke$arity$1(esm_import$node_path.join(d,"kv.json"));return esm_import$$libp2p$crypto$keys.generateKeyPair("Ed25519").then(function(g){var h=
esm_import$$libp2p$peer_id.peerIdFromPrivateKey(g).toString();return $APP.ardegazu.rooms.lib.crypto.create.cljs$core$IFn$_invoke$arity$3(a.roomSecret,e,h).then(function(k){return $APP.ardegazu.rooms.lib.descriptor.resolve_relay_config.cljs$core$IFn$_invoke$arity$1(Object.assign({},$APP.ardegazu.rooms.board.DEFAULTS,a.relay)).then(function(l){l=Object.assign({},l,a.relay);var m=new $APP.ardegazu.rooms.lib.turn.IceConfig(l.turnCredsUrl,!1),n=[null];return $APP.ardegazu.rooms.lib.net.create($APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["privateKey",
g,"crypto",k,"ice",m,"wsOrigin",c,"relayMultiaddr",l.relayMultiaddr,"discoveryTopic",l.discoveryTopic,"myName",function(){var p=n[0];return $APP.ardegazu.rooms.js.truthy_QMARK_(p)?p._name:a.name},"events",$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["peerState",function(p,q,r){q=n[0];$APP.ardegazu.rooms.js.truthy_QMARK_(q)&&q.emit("peer",p,r)},"peerGone",function(p){var q=n[0];$APP.ardegazu.rooms.js.truthy_QMARK_(q)&&q.emit("peerGone",
p)},"message",function(p,q){},"binary",function(p,q){},"peerReady",function(p){},"status",function(p){var q=n[0];$APP.ardegazu.rooms.js.truthy_QMARK_(q)&&q.emit("status",p)}],0))],0))).then(function(p){return $APP.ardegazu.rooms.node.stores.open_fs_helia(p.libp2p,$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["blocks",esm_import$node_path.join(d,"blocks"),"data",esm_import$node_path.join(d,"data")],0))).then(function(q){var r=
[];return $APP.ardegazu.rooms.lib.log.open(q,k,f,$APP.ardegazu.rooms.js.ordered.cljs$core$IFn$_invoke$arity$variadic($APP.cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["onEntry",function(t){var v=n[0];$APP.ardegazu.rooms.js.truthy_QMARK_(v)?$APP.ardegazu.rooms.board.apply_entry(v,t):r.push(t)},"onError",function(t){},"directory",esm_import$node_path.join(d,"orbitdb")],0))).then(function(t){var v=new $APP.ardegazu.rooms.board.BoardClient(p,t,k.roomId,a.name);n[0]=v;for(var w=$APP.cljs.core.seq($APP.cljs.core.array_seq.cljs$core$IFn$_invoke$arity$1(r.splice(0))),
C=null,J=0,N=0;;)if(N<J){var T=C.cljs$core$IIndexed$_nth$arity$2(null,N);$APP.ardegazu.rooms.board.apply_entry(v,T);N+=1}else if(w=$APP.cljs.core.seq(w))C=w,$APP.cljs.core.chunked_seq_QMARK_(C)?(w=$APP.cljs.core.chunk_first(C),N=$APP.cljs.core.chunk_rest(C),C=w,J=$APP.cljs.core.count(w),w=N):(w=$APP.cljs.core.first(C),$APP.ardegazu.rooms.board.apply_entry(v,w),w=$APP.cljs.core.next(C),C=null,J=0),N=0;else break;return $APP.ardegazu.rooms.lib.log.load_tail(t,2E3).then(function(X){v.emit("ready");return v})})})})})})})})};
$APP.ardegazu.rooms.board.BoardClient.join=function(a){return $APP.ardegazu.rooms.board.join(a)};var proto_23892=$APP.ardegazu.rooms.board.BoardClient.prototype;proto_23892.elements=function(){return $APP.ardegazu.rooms.board.elements(this)};proto_23892.drawStroke=function(a,b){return $APP.ardegazu.rooms.board.draw_stroke(this,a,b)};proto_23892.addText=function(a,b,c,d){return $APP.ardegazu.rooms.board.add_text(this,a,b,c,d)};
proto_23892.erase=function(a){return $APP.ardegazu.rooms.board.erase(this,a)};proto_23892.close=function(){return $APP.ardegazu.rooms.board.close(this)};proto_23892._applyEntry=function(a){return $APP.ardegazu.rooms.board.apply_entry(this,a)};export const BoardClient=$APP.ardegazu.rooms.board.BoardClient;export const BOARD_SALT=$APP.ardegazu.rooms.board.BOARD_SALT;export const newRoomSecret=$APP.ardegazu.rooms.board.new_room_secret;