@net-mesh/browser 0.37.0

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.
Files changed (110) hide show
  1. package/CHANGELOG.md +517 -0
  2. package/LICENSE-APACHE +190 -0
  3. package/LICENSE-MIT +21 -0
  4. package/README.md +666 -0
  5. package/dist/async-queue.d.ts +26 -0
  6. package/dist/async-queue.js +62 -0
  7. package/dist/credential.d.ts +70 -0
  8. package/dist/credential.js +95 -0
  9. package/dist/errors.d.ts +400 -0
  10. package/dist/errors.js +726 -0
  11. package/dist/events.d.ts +232 -0
  12. package/dist/events.js +298 -0
  13. package/dist/identity.d.ts +40 -0
  14. package/dist/identity.js +78 -0
  15. package/dist/index.bundle.js +2 -0
  16. package/dist/index.d.ts +38 -0
  17. package/dist/index.js +46 -0
  18. package/dist/leader/events.d.ts +111 -0
  19. package/dist/leader/events.js +116 -0
  20. package/dist/leader/index.d.ts +14 -0
  21. package/dist/leader/index.js +11 -0
  22. package/dist/leader/session.d.ts +539 -0
  23. package/dist/leader/session.js +770 -0
  24. package/dist/leader/wasm.d.ts +123 -0
  25. package/dist/leader/wasm.js +39 -0
  26. package/dist/lobby.d.ts +183 -0
  27. package/dist/lobby.js +504 -0
  28. package/dist/local.d.ts +80 -0
  29. package/dist/local.js +160 -0
  30. package/dist/net_leaf.d.ts +1494 -0
  31. package/dist/net_leaf.js +3753 -0
  32. package/dist/net_leaf_bg.wasm +0 -0
  33. package/dist/net_leaf_bg.wasm.d.ts +137 -0
  34. package/dist/netcode/client.d.ts +102 -0
  35. package/dist/netcode/client.js +296 -0
  36. package/dist/netcode/clock.d.ts +45 -0
  37. package/dist/netcode/clock.js +54 -0
  38. package/dist/netcode/host.d.ts +118 -0
  39. package/dist/netcode/host.js +276 -0
  40. package/dist/netcode/index.d.ts +19 -0
  41. package/dist/netcode/index.js +14 -0
  42. package/dist/netcode/interpolate.d.ts +50 -0
  43. package/dist/netcode/interpolate.js +100 -0
  44. package/dist/netcode/wire.d.ts +125 -0
  45. package/dist/netcode/wire.js +117 -0
  46. package/dist/node.d.ts +908 -0
  47. package/dist/node.js +1085 -0
  48. package/dist/org.d.ts +412 -0
  49. package/dist/org.js +567 -0
  50. package/dist/peer-driver.d.ts +117 -0
  51. package/dist/peer-driver.js +224 -0
  52. package/dist/store/assembly.d.ts +176 -0
  53. package/dist/store/assembly.js +325 -0
  54. package/dist/store/chunker.d.ts +83 -0
  55. package/dist/store/chunker.js +190 -0
  56. package/dist/store/core.d.ts +136 -0
  57. package/dist/store/core.js +477 -0
  58. package/dist/store/definition.d.ts +23 -0
  59. package/dist/store/definition.js +83 -0
  60. package/dist/store/errors.d.ts +77 -0
  61. package/dist/store/errors.js +94 -0
  62. package/dist/store/host.d.ts +247 -0
  63. package/dist/store/host.js +675 -0
  64. package/dist/store/index.d.ts +50 -0
  65. package/dist/store/index.js +40 -0
  66. package/dist/store/interest.d.ts +40 -0
  67. package/dist/store/interest.js +77 -0
  68. package/dist/store/inventory.d.ts +81 -0
  69. package/dist/store/inventory.js +140 -0
  70. package/dist/store/join.d.ts +118 -0
  71. package/dist/store/join.js +724 -0
  72. package/dist/store/json.d.ts +50 -0
  73. package/dist/store/json.js +283 -0
  74. package/dist/store/ledger.d.ts +187 -0
  75. package/dist/store/ledger.js +292 -0
  76. package/dist/store/owner.d.ts +616 -0
  77. package/dist/store/owner.js +1711 -0
  78. package/dist/store/patch.d.ts +70 -0
  79. package/dist/store/patch.js +166 -0
  80. package/dist/store/player.d.ts +65 -0
  81. package/dist/store/player.js +261 -0
  82. package/dist/store/replica.d.ts +187 -0
  83. package/dist/store/replica.js +740 -0
  84. package/dist/store/state.d.ts +42 -0
  85. package/dist/store/state.js +165 -0
  86. package/dist/store/types.d.ts +200 -0
  87. package/dist/store/types.js +25 -0
  88. package/dist/store/visibility.d.ts +118 -0
  89. package/dist/store/visibility.js +282 -0
  90. package/dist/store/wire.d.ts +309 -0
  91. package/dist/store/wire.js +834 -0
  92. package/dist/stream.d.ts +174 -0
  93. package/dist/stream.js +238 -0
  94. package/dist/three/index.d.ts +109 -0
  95. package/dist/three/index.js +130 -0
  96. package/dist/udp-probe.d.ts +159 -0
  97. package/dist/udp-probe.js +245 -0
  98. package/dist/wasm.d.ts +642 -0
  99. package/dist/wasm.js +98 -0
  100. package/dist/world/border.d.ts +84 -0
  101. package/dist/world/border.js +99 -0
  102. package/dist/world/handoff.d.ts +187 -0
  103. package/dist/world/handoff.js +222 -0
  104. package/dist/world/index.d.ts +13 -0
  105. package/dist/world/index.js +9 -0
  106. package/dist/world/link.d.ts +179 -0
  107. package/dist/world/link.js +476 -0
  108. package/dist/world/regions.d.ts +154 -0
  109. package/dist/world/regions.js +314 -0
  110. package/package.json +72 -0
@@ -0,0 +1,2 @@
1
+ var we=class{constructor(e=()=>{}){this.detach=e}detach;buffered=[];waiting=null;ended=!1;push(e){if(this.ended)return;let t=this.waiting;if(t){this.waiting=null,t({value:e,done:!1});return}this.buffered.push(e)}end(){if(this.ended)return;this.ended=!0;let e=this.waiting;e&&(this.waiting=null,e({value:void 0,done:!0}))}next(){let e=this.buffered.shift();if(e!==void 0)return Promise.resolve({value:e,done:!1});if(this.ended)return Promise.resolve({value:void 0,done:!0});let{promise:t,resolve:r}=Promise.withResolvers();return this.waiting=r,t}return(){return this.detach(),this.end(),Promise.resolve({value:void 0,done:!0})}[Symbol.asyncIterator](){return this}};function ot(n,e,t){return!n||!e||t.length===0?null:{bootstrapOk:!0,stunProbeFailed:!0,probed:t}}var z=class extends Error{constructor(e){super(e),this.name="LeafError"}},et=class extends z{constructor(t){super(`wire: ${t}`);this.detail=t;this.name="WireError"}detail;kind="wire"},Oe=class extends z{constructor(t){super(`session: ${t}`);this.detail=t;this.name="SessionError"}detail;kind="session"},tt=class extends z{constructor(t){super(`control plane: ${t}`);this.detail=t;this.name="ControlPlaneError"}detail;kind="control-plane"},ge=class extends z{constructor(t){super(`identity: ${t}`);this.detail=t;this.name="IdentityError"}detail;kind="identity"},nt=class extends z{constructor(t,r){super(`ice configuration: the iceServers entry ${t} names this connection's peer RTC endpoint ${r}; a peer cannot be its own STUN server. Omit iceServers to use the STUN endpoint the anchor announces (the stun_addr field of GET /rtc/anchor), or name a STUN server that is not this peer`);this.entry=t;this.peerRtcAddr=r;this.name="IceServerConflictError"}entry;peerRtcAddr;kind="ice-server-conflict"},rt=class extends z{constructor(t,r=null){super(r===null?`not the leader: this tab holds generation ${t}`:`not the leader: this tab holds generation ${t}, the leader holds ${r}`);this.presented=t;this.current=r;this.name="NotLeaderError"}presented;current;kind="not-leader"},pe=class extends z{constructor(t){super(`rtc: ${wi(t)}`);this.failure=t;this.name="RtcError",this.kind=bi[t.type]}failure;kind},it=class extends z{constructor(t){super(`rpc: ${vi(t)}`);this.failure=t;this.name="RpcError",this.kind=Si[t.type]}failure;kind},Ne=class extends z{constructor(t,r){super(t);this.cause=r;this.name="UnknownLeafError"}cause;kind="unknown"},Q=class extends z{},ue=class extends Q{constructor(t,r){super(r??`org:admission_denied:${gi[t]}`);this.coarse=t;this.name="OrgAdmissionDeniedError"}coarse;kind="org-admission-denied"},xe=class extends ue{kind="org-revoked";constructor(e="org:admission_denied:denied"){super("denied",e),this.name="OrgRevokedError"}},ke=class extends Q{kind="org-timeout";constructor(e="org:rpc:timeout"){super(e),this.name="OrgTimeoutError"}},D=class extends Q{kind="org-cancelled";constructor(e="org:rpc:cancelled"){super(e),this.name="OrgCancelledError"}},Z=class extends Q{constructor(t,r="org:rpc:leader_lost"){super(r);this.generation=t;this.name="OrgLeaderLostError"}generation;kind="org-leader-lost"},Ee=class extends Q{kind="org-session-lost";constructor(e="org:rpc:session_lost"){super(e),this.name="OrgSessionLostError"}},Je=class extends Q{constructor(t,r="org:rpc:indeterminate"){super(r);this.deadlineMs=t;this.name="OrgIndeterminateError"}deadlineMs;kind="org-indeterminate"},Fe=class extends Q{constructor(t,r="org:rpc:refused"){super(r);this.status=t;this.name="OrgRefusedError"}status;kind="org-refused"},ve=class extends Q{kind="org-internal";constructor(e="org:rpc:internal"){super(e),this.name="OrgInternalError"}},We=class extends Q{kind="org-malformed";constructor(e="org:rpc:malformed"){super(e),this.name="OrgMalformedError"}},at="org: the response sink is closed: the call was retired";var Ln="org:",gi={denied:"denied","not-supported":"not_supported",unavailable:"unavailable"};function st(n){let e=(n??"").trim();return e==="unavailable"?"unavailable":e==="not_supported"||e==="not-supported"?"not-supported":e==="\0"||e==="0"?"denied":e===""||e==="1"?"not-supported":e===""||e==="2"?"unavailable":"denied"}function mi(n){switch(n){case"timeout":return new ke;case"revoked":return new xe;case"session-lost":return new Ee;case"leader-lost":return new Z("");case"cancelled":case"node-closed":case"replaced":return new D;case"resource-exhausted":return new ue("unavailable")}}function qt(n){let e=n.message;switch(n.kind){case"admission-denied":return new ue(st(n.coarse),e);case"revoked":return e===void 0?new xe:new xe(e);case"timeout":return e===void 0?new ke:new ke(e);case"cancelled":return e===void 0?new D:new D(e);case"leader-lost":return new Z(n.generation??"",e);case"session-lost":return e===void 0?new Ee:new Ee(e);case"indeterminate":return new Je(n.deadlineMs??0,e);case"refused":return new Fe(n.status??0,e);case"malformed":return e===void 0?new We:new We(e);case"internal":return e===void 0?new ve:new ve(e);default:return new ve(`org:rpc:internal: unrecognized terminal kind ${JSON.stringify(n.kind)}`+(e===void 0?"":`: ${e}`))}}function lt(n){switch(n){case"timeout":case"cancelled":case"revoked":case"session-lost":case"leader-lost":case"node-closed":case"replaced":case"resource-exhausted":return n;default:return"replaced"}}function Tn(n){if(/^org: .+ is closed: the call was retired$/.test(n))return new D(n);if(/^org: .+ is closed: the call's byte budget refused the item and retired the call$/.test(n))return new ue("unavailable",n);if(n.startsWith(Ln)){let t=n.slice(Ln.length),r=t.indexOf(":");if(r<=0)return null;let i=t.slice(0,r),s=t.slice(r+1),o=s.indexOf(":"),a=o===-1?s:s.slice(0,o);if(a.length===0)return null;if(i==="admission_denied")return new ue(st(a),n);if(i!=="rpc")return null;switch(a){case"revoked":return new xe(n);case"timeout":return new ke(n);case"cancelled":return new D(n);case"leader_lost":case"leader-lost":return new Z("",n);case"session_lost":case"session-lost":return new Ee(n);case"indeterminate":return new Je(0,n);case"refused":case"server_error":case"capability_denied":return new Fe(0,n);case"malformed":case"codec_encode":case"codec_decode":return new We(n);case"internal":case"no_route":case"transport":return new ve(n);default:return null}}let e=/^rpc: refused \(9\): ([\s\S]*)$/.exec(n);return e?new ue(st(e[1]),n):null}var bi={iceTimeout:"ice-timeout",udpBlocked:"udp-blocked",channelClosed:"channel-closed",unsupported:"rtc-unsupported"},Si={refused:"rpc-refused",timeout:"rpc-timeout",sessionLost:"session-lost",leaderLost:"leader-lost",indeterminate:"rpc-indeterminate",malformed:"rpc-malformed"},Dn="ICE did not connect inside the deadline (this does not establish that UDP is blocked)";function wi(n){switch(n.type){case"iceTimeout":return Dn;case"udpBlocked":return`UDP appears blocked: the anchor's HTTPS bootstrap succeeded but a STUN binding to ${n.evidence.probed} was unanswered`;case"channelClosed":return`the DataChannel closed: ${n.detail}`;case"unsupported":return`this browser refused the attempt: ${n.detail}`}}function vi(n){switch(n.type){case"refused":return`refused (${n.status}): ${n.message}`;case"timeout":return"the call's deadline elapsed";case"sessionLost":return"the session carrying the call went away";case"leaderLost":return`the leader holding generation ${n.generation} was replaced`;case"indeterminate":return`the local deadline of ${n.deadlineMs}ms elapsed before the tab running the node answered; the remote operation may still have executed (it was not retried)`;case"malformed":return`the reply did not decode: ${n.detail}`}}function S(n){if(n instanceof z)return n;let e=Oi(n);return Mn(e)??new Ne(e,n)}function Oi(n){if(typeof n=="string")return n;if(n instanceof Error)return n.message;if(n!==null&&typeof n=="object"&&"message"in n){let e=n.message;if(typeof e=="string")return e}return String(n)}function Mn(n){let e=Tn(n);if(e!==null)return e;let t=se(n,"rtc: ");if(t!==null){let l=qn(t);return l===null?null:new pe(l)}let r=se(n,"rpc: ");if(r!==null){let l=Nn(r);return l===null?null:new it(l)}let i=se(n,"wire: ");if(i!==null)return new et(i);let s=se(n,"session: ");if(s!==null)return new Oe(s);let o=se(n,"control plane: ");if(o!==null)return new tt(o);let a=se(n,"identity: ");if(a!==null)return new ge(a);let d=se(n,"ice configuration: ");if(d!==null){let l=/^the iceServers entry (.+?) names this connection's peer RTC endpoint (.+?); a peer cannot be its own STUN server\./.exec(d);if(l)return new nt(l[1]??"",l[2]??"")}let c=/^not the leader: this tab holds generation (\d+)(?:, the leader holds (\d+))?$/.exec(n);if(c){let l=Number(c[1]),u=c[2]===void 0?null:Number(c[2]);return new rt(l,u)}return null}function qn(n){if(n===Dn)return{type:"iceTimeout"};let e=/^UDP appears blocked: the anchor's HTTPS bootstrap succeeded but a STUN binding to (.+) was unanswered$/.exec(n);if(e){let i=e[1]??"",s=ot(!0,!0,i);return s===null?null:{type:"udpBlocked",evidence:s}}let t=se(n,"the DataChannel closed: ");if(t!==null)return{type:"channelClosed",detail:t};let r=se(n,"this browser refused the attempt: ");return r!==null?{type:"unsupported",detail:r}:null}function Nn(n){let e=/^refused \((\d+)\): ([\s\S]*)$/.exec(n);if(e)return{type:"refused",status:Number(e[1]),message:e[2]??""};if(n==="the call's deadline elapsed")return{type:"timeout"};if(n==="the session carrying the call went away")return{type:"sessionLost"};let t=/^the leader holding generation (\d+) was replaced$/.exec(n);if(t)return{type:"leaderLost",generation:Number(t[1])};let r=/^the local deadline of (\d+)ms elapsed before the tab running the node answered; the remote operation may still have executed \(it was not retried\)$/.exec(n);if(r)return{type:"indeterminate",deadlineMs:Number(r[1])};let i=se(n,"the reply did not decode: ");return i!==null?{type:"malformed",detail:i}:null}function xi(n){return n instanceof pe&&n.failure.type==="udpBlocked"}function se(n,e){return n.startsWith(e)?n.slice(e.length):null}var $n=["node_id","peer_node","channel_hash","origin_hash","stream_id","dialog","not_after","call_id","seq","generation","incarnation","version","from","to"];function me(n){let e;try{e=ct(n)}catch{return{type:"unknown",tag:null,raw:n}}if(e===null||typeof e!="object")return{type:"unknown",tag:null,raw:e};let t=e,r=typeof t.type=="string"?t.type:null;switch(r){case"connected":return{type:"connected",nodeIdHex:$(t,"node_id_hex"),peerNode:$(t,"peer_node"),rtcAddr:Un(t,"rtc_addr")};case"disconnected":return{type:"disconnected",reason:$(t,"reason")};case"channel_message":return{type:"channel_message",channelHash:$(t,"channel_hash"),originHash:$(t,"origin_hash"),payload:Wt(t,"payload")};case"stream_data":return{type:"stream_data",peerNode:$(t,"peer_node"),incarnation:$(t,"incarnation"),streamId:$(t,"stream_id"),seq:Nt(t,"seq"),payload:Wt(t,"payload")};case"announcement":return{type:"announcement",nodeId:$(t,"node_id"),capabilities:ki(t,"capabilities"),rtcAddr:Un(t,"rtc_addr"),verified:t.verified===!0};case"signal":return{type:"signal",from:$(t,"from"),to:$(t,"to"),dialog:$(t,"dialog"),kind:$(t,"kind"),payload:Wt(t,"payload"),notAfter:$(t,"not_after")};case"rpc_response":return{type:"rpc_response",callId:$(t,"call_id"),status:Nt(t,"status")};case"dropped":return{type:"dropped",reason:$(t,"reason"),subprotocol:Nt(t,"subprotocol")};case"rtc_failure":return{type:"rtc_failure",error:S($(t,"error"))};default:return{type:"unknown",tag:r,raw:t}}}var Ae=class{typed=new Map;any=new Set;queues=new Set;on(e,t){let r=this.typed.get(e)??new Set;this.typed.set(e,r);let i=t;return r.add(i),()=>{r.delete(i)}}onAny(e){return this.any.add(e),()=>{this.any.delete(e)}}events(){let e=new we(()=>this.queues.delete(e));return this.queues.add(e),e}deliver(e,t){this.dispatch(t?t(e):me(e))}dispatch(e){for(let t of this.typed.get(e.type)??[])Wn(t,e);for(let t of this.any)Wn(t,e);for(let t of this.queues)t.push(e)}close(){this.typed.clear(),this.any.clear();for(let e of[...this.queues])e.end();this.queues.clear()}};function Wn(n,e){try{n(e)}catch(t){console.error("[@net-mesh/browser] event listener threw",t)}}function ct(n){let e=$n.join("|"),t=n.replace(new RegExp(`("(?:${e})"\\s*:\\s*)(\\d+)`,"g"),'$1"$2"');return JSON.parse(t)}function $(n,e){let t=n[e];return typeof t=="string"?t:typeof t=="number"||typeof t=="boolean"?String(t):""}function Un(n,e){let t=n[e];return typeof t=="string"&&t.length>0?t:null}function Nt(n,e){let t=n[e];if(typeof t=="number")return t;if(typeof t=="string"){let r=Number(t);return Number.isFinite(r)?r:0}return 0}function ki(n,e){let t=n[e];return Array.isArray(t)?t.filter(r=>typeof r=="string"):[]}function Wt(n,e){let t=n[e];return t instanceof Uint8Array?t:typeof t!="string"?new Uint8Array(0):Bn(t)}function Bn(n){let e=atob(n),t=new Uint8Array(e.length);for(let r=0;r<e.length;r+=1)t[r]=e.charCodeAt(r);return t}function Ut(n){let e="";for(let t of n)e+=String.fromCharCode(t);return btoa(e)}var Re=class{live=new Set;add(e){this.live.add(e)}delete(e){this.live.delete(e)}retireAll(e){let t=[...this.live];this.live.clear();let r=[];for(let i of t)try{i.retire(e)}catch(s){r.push(s)}return r}},be=class{constructor(e,t,r){this.inner=e;this.onCancel=t;this.onDone=r}inner;onCancel;onDone;terminal=null;failure=null;handleDropped=!1;waiters=[];next(){if(this.failure!==null)return Promise.reject(this.failure);if(this.terminal!==null)return Promise.resolve(this.terminal);let{promise:e,resolve:t,reject:r}=Promise.withResolvers(),i={resolve:t,reject:r};return this.waiters.push(i),this.inner.next().then(s=>{Ue(this.waiters,i);let o=Ei(s);o.done&&this.complete(o),t(o)},s=>{Ue(this.waiters,i);let o=S(s);this.fail(o),r(o)}),e}cancel(){this.retire(new D)}retire(e){this.terminal!==null||this.failure!==null||(this.dropHandle(),this.complete({done:!0,error:e}))}[Symbol.asyncIterator](){let e=!1;return{next:async()=>{if(e)return{done:!0,value:void 0};let t=await this.next();if(t.error!==void 0)throw t.error;return t.value===void 0?(e=!0,{done:!0,value:void 0}):(t.done&&(e=!0),{done:!1,value:t.value})},return:async()=>(e=!0,this.cancel(),{done:!0,value:void 0})}}complete(e){if(this.terminal!==null)return;this.terminal=e,this.onDone?.();let t=[...this.waiters];this.waiters.length=0;for(let r of t)r.resolve(e)}fail(e){if(this.terminal!==null||this.failure!==null)return;this.failure=e,this.onDone?.();let t=[...this.waiters];this.waiters.length=0;for(let r of t)r.reject(e)}dropHandle(){if(!this.handleDropped){this.handleDropped=!0;try{this.onCancel()}catch{}}}},_e=class{constructor(e,t){this.inner=e;this.onDone=t}inner;onDone;failure=null;handleDropped=!1;waiters=[];async send(e){if(this.failure!==null)throw this.failure;try{await this.inner.send(e)}catch(t){throw S(t)}}finish(){if(this.failure!==null)return Promise.reject(this.failure);let{promise:e,resolve:t,reject:r}=Promise.withResolvers(),i={reject:r};return this.waiters.push(i),this.inner.finish().then(s=>{Ue(this.waiters,i),this.onDone?.(),t(s)},s=>{Ue(this.waiters,i),this.onDone?.(),r(S(s))}),e}cancel(){this.retire(new D)}retire(e){if(this.failure!==null)return;if(this.failure=e,!this.handleDropped){this.handleDropped=!0;try{this.inner.cancel()}catch{}}this.onDone?.();let t=[...this.waiters];this.waiters.length=0;for(let r of t)r.reject(e)}},Pe=class{constructor(e,t){this.inner=e;this.onDone=t;this.stream=new be(e.stream(),()=>this.dropHandle(),()=>this.onDone?.()),this.sink={send:async r=>{if(this.failure!==null)throw this.failure;try{await this.inner.send(r)}catch(i){throw S(i)}},finishSending:async()=>{if(this.failure!==null)throw this.failure;try{await this.inner.finish_sending()}catch(r){throw S(r)}},cancel:()=>{this.retire(new D)}}}inner;onDone;handleDropped=!1;failure=null;sink;stream;retire(e){this.failure??=e,this.dropHandle(),this.stream.retire(e),this.onDone?.()}dropHandle(){if(!this.handleDropped){this.handleDropped=!0;try{this.inner.cancel()}catch{}}}},Ve=class{constructor(e){this.inner=e;this.retired=e.retired().then(t=>(this.verdict??=lt(t),this.verdict),()=>(this.verdict??="replaced",this.verdict))}inner;retired;verdict=null;async send(e){if(this.verdict!==null)throw new D(at);try{await this.inner.send(e)}catch(t){throw S(t)}}async close(){if(this.verdict!==null)throw new D(at);try{await this.inner.close()}catch(e){throw S(e)}}},Ke=class{constructor(e){this.inner=e;this.retired=e.retired().then(t=>(this.settle(lt(t)),this.verdict),()=>(this.settle("replaced"),this.verdict))}inner;retired;verdict=null;waiters=[];next(){if(this.verdict!==null)return Promise.resolve({done:!0});let{promise:e,resolve:t}=Promise.withResolvers();return this.waiters.push(t),this.inner.next().then(r=>{Ue(this.waiters,t),t(Ai(r))},()=>{Ue(this.waiters,t),t({done:!0})}),e}[Symbol.asyncIterator](){return{next:async()=>{let e=await this.next();return e.done||e.value===void 0?{done:!0,value:void 0}:{done:!1,value:e.value}},return:async()=>({done:!0,value:void 0})}}settle(e){if(this.verdict!==null)return;this.verdict=e;let t=[...this.waiters];this.waiters.length=0;for(let r of t)r({done:!0})}},X=class{constructor(e,t){this.inner=e;this.onDone=t}inner;onDone;closed=!1;get service(){return this.inner.service()}close(){this.closed||(this.closed=!0,this.onDone?.(),this.inner.close())}retire(e){this.close()}};function ne(n){return{credentials:{membership:n.credentials.membership,dispatcher:n.credentials.dispatcher,...n.credentials.capabilityGrant===void 0?{}:{capabilityGrant:n.credentials.capabilityGrant},actingOrg:n.credentials.actingOrg,providerOwnerOrg:n.credentials.providerOwnerOrg,provider:n.credentials.provider,...n.credentials.proofTtlSecs===void 0?{}:{proofTtlSecs:n.credentials.proofTtlSecs}},...n.deadlineMs===void 0?{}:{deadlineMs:n.deadlineMs},...n.streamWindowInitial===void 0?{}:{streamWindowInitial:n.streamWindowInitial},...n.requestWindowInitial===void 0?{}:{requestWindowInitial:n.requestWindowInitial}}}function re(n){return{ownerOrg:n.ownerOrg}}function ze(n){let e=JSON.parse(n);if(e===null||typeof e!="object")throw new Ne("the caller attribution is not an OrgCaller object");let t=e;return{entity:String(t.entity??""),actingOrg:String(t.actingOrg??""),providerOrg:String(t.providerOrg??""),provider:String(t.provider??""),capability:String(t.capability??""),isSameOrg:t.isSameOrg===!0}}function dt(n){return async(e,t)=>await n(ze(e),t)}function ut(n){return async(e,t,r)=>{await n(ze(e),t,new Ve(r))}}function pt(n){return async(e,t)=>await n(ze(e),new Ke(t))}function ft(n){return async(e,t,r)=>{await n(ze(e),new Ke(t),new Ve(r))}}function Ue(n,e){let t=n.indexOf(e);t>=0&&n.splice(t,1)}function Ei(n){return n.done?n.error!==void 0?{done:!0,error:qt(n.error)}:n.value===void 0?{done:!0}:{done:!0,value:n.value}:{done:!1,value:n.value}}function Ai(n){return n.done?{done:!0}:{done:!1,value:n.value}}var $t=class extends Oe{constructor(e){super(e),this.name="StreamIdentityError"}},je=class{constructor(e,t,r="required"){this.inner=e;this.onClosed=t;if(this.wireId=Jn(()=>e.stream_id_hex()),this.peerId=Jn(()=>e.peer_node_hex()),r==="required"&&this.peerId===null)throw new $t("the stream did not report a readable peer, so its frames cannot be attributed");e.on_message(i=>this.receive(i))}inner;onClosed;queues=new Set;listeners=new Set;pending=[];closed=!1;wireId;peerId;get peerNode(){return this.inner.peer_node_hex()}get reliability(){return this.inner.is_reliable()?"reliable":"fireAndForget"}get streamId(){return this.inner.stream_id_hex()}async send(e){if(this.closed)throw new Oe("the stream is closed");try{await this.inner.send(e)}catch(t){throw S(t)}}onMessage(e){this.listeners.add(e);let t=this.pending.splice(0,this.pending.length);for(let r of t)e(r);return()=>{this.listeners.delete(e)}}[Symbol.asyncIterator](){let e=new we(()=>this.queues.delete(e));this.queues.add(e);let t=this.pending.splice(0,this.pending.length);for(let r of t)e.push(r);return this.closed&&e.end(),e}close(){if(!this.closed){this.closed=!0;for(let e of[...this.queues])e.end();this.queues.clear(),this.listeners.clear(),this.onClosed?.(),this.inner.close()}}receive(e){let t=this.decode(e);if(!(t===null||this.closed)){if(this.queues.size===0&&this.listeners.size===0){this.pending.push(t);return}for(let r of this.listeners)try{r(t)}catch(i){console.error("[@net-mesh/browser] stream listener threw",i)}for(let r of this.queues)r.push(t)}}decode(e){if(e instanceof Uint8Array)return e;if(typeof e!="string")return console.error("[@net-mesh/browser] stream callback received",typeof e,"not the leaf event JSON"),null;let t=me(e);return t.type!=="stream_data"||!/^\d+$/.test(t.streamId)||this.wireId!==null&&BigInt(t.streamId)!==this.wireId||this.peerId!==null&&(!/^\d+$/.test(t.peerNode)||BigInt(t.peerNode)!==this.peerId)?null:t.payload}};function Jn(n){let e;try{e=n()}catch{return null}return e===void 0||!/^[0-9a-fA-F]{1,16}$/.test(e)?null:BigInt(`0x${e}`)}var Fn="no verified announcement for",Ri="no live attempt with",_i="no verified offer from",Pi="is not the live attempt",ji=50,Ii=5e3;async function ht(n,e,t){let r;try{r=await e.offer(n)}catch(s){let o=S(s);if(o.message.includes(Fn))return{type:"noAnnouncement",peer:n,detail:o.message};throw o}let i=await Vn(n,r,s=>s.state==="open",e,t);return i.type!=="direct"?i:Bt(n,r,e)}async function yt(n,e,t){let r=null,i=Date.now()+Ii;for(;;)try{r=await e.acceptOffer(n);break}catch(s){let o=S(s);if(o.message.includes(Fn))return{type:"noAnnouncement",peer:n,detail:o.message};if(!o.message.includes(_i)||Date.now()>=i)throw o;await zn()}return Vn(n,r,s=>s.direct,e,t)}async function Bt(n,e,t){let r;try{r=await t.handshake(n,e)}catch(i){let s=Kn(i,n,e);return s!==null?s:{type:"handshakeFailed",peer:n,dialog:e,detail:S(i).message}}return r!==e?{type:"superseded",peer:n,dialog:e,liveDialog:r}:{type:"direct",peer:n,dialog:e}}async function Vn(n,e,t,r,i){for(;;){let s;try{s=i(await r.candidate(n,e))}catch(o){let a=Kn(o,n,e);if(a!==null)return a;throw S(o)}if(s.dialog!==e)return{type:"superseded",peer:n,dialog:e,liveDialog:s.dialog};if(t(s))return{type:"direct",peer:n,dialog:e};if(s.state==="iceTimeout")return{type:"iceTimeout",peer:n,dialog:e};if(s.state==="udpBlocked")return{type:"udpBlocked",peer:n,dialog:e};if(s.state==="failed")return{type:"handshakeFailed",peer:n,dialog:e,detail:s.candidateError??"the attempt reached its terminal transition without installing a session"};await zn()}}function Kn(n,e,t){let{message:r}=S(n);return r.includes(Pi)?{type:"superseded",peer:e,dialog:t,liveDialog:Ci(r)}:r.includes(Ri)?{type:"superseded",peer:e,dialog:t,liveDialog:null}:null}function Ci(n){return/\(dialog ([0-9a-f]{16}) is\)/.exec(n)?.[1]??null}async function zn(){let n=Promise.withResolvers();setTimeout(n.resolve,ji),await n.promise}function Gn(n){let{bootstrapOk:e,stunProbe:t,probed:r}=n;if(t.type!=="unanswered")return{type:"iceTimeout"};let i=ot(e,!0,r??"");return i===null?{type:"iceTimeout"}:{type:"udpBlocked",evidence:i}}function Ft(n){return new pe(Gn(n))}var Hi=2500,Li=700,Jt=3478;async function Vt(n,e={}){let t=Yn(n);if(t===null)return{type:"notRun",reason:`not an address: ${n}`};let r=e.peerConnectionFactory??Di();if(r===null)return{type:"unsupported",detail:"RTCPeerConnection is not available in this context"};let i=e.timeoutMs??Hi,{promise:s,resolve:o}=Promise.withResolvers(),a;try{a=r({iceServers:[{urls:t}],iceCandidatePoolSize:0})}catch(f){return{type:"unsupported",detail:String(f)}}let d=!1,c=f=>{d||(d=!0,o(f))},l=null,u=setTimeout(()=>c({type:"unanswered",detail:l??"no answer inside the probe deadline"}),i),p=()=>{c({type:"unanswered",detail:l??"gathering completed with no reflexive candidate"})};a.onicecandidate=f=>{let y=f.candidate;if(y===null){p();return}let O=Qn(y);O!==null&&c({type:"reflexive",address:O})},a.onicecandidateerror=f=>{let y=f.errorCode,O=`${y}: ${f.errorText} (${f.url})`;if(y<Li){c({type:"stunError",code:y,detail:O});return}l=O},a.onicegatheringstatechange=()=>{a.iceGatheringState==="complete"&&p()};try{a.createDataChannel("net-udp-probe"),await a.setLocalDescription(await a.createOffer())}catch(f){c({type:"unsupported",detail:String(f)})}try{return await s}finally{clearTimeout(u),a.onicecandidate=null,a.onicecandidateerror=null,a.onicegatheringstatechange=null,a.close()}}var Ti=3e3;async function Kt(n,e={}){let t=e.fetchImpl??globalThis.fetch;if(typeof t!="function")return!1;try{return await t(n,{method:"GET",mode:"no-cors",cache:"no-store",redirect:"follow",signal:AbortSignal.timeout(e.timeoutMs??Ti)}),!0}catch{return!1}}function Yn(n){let e=n.trim();if(e.length===0)return null;if(e.startsWith("stun:")||e.startsWith("stuns:"))return e;let t=/^\[([0-9a-fA-F:.]+)\](?::(\d+))?$/.exec(e);if(t)return`stun:[${t[1]??""}]:${t[2]??Jt}`;if((e.match(/:/g)?.length??0)>1)return`stun:[${e}]:${Jt}`;let r=/^([A-Za-z0-9._-]+)(?::(\d+))?$/.exec(e);return r===null?null:`stun:${r[1]??""}:${r[2]??Jt}`}function Qn(n){return n.type==="srflx"?n.address??Xn(n.candidate):n.type!==null?null:/ typ srflx /.test(n.candidate)?Xn(n.candidate):null}function Xn(n){let e=n.split(" "),t=e[4]??"",r=e[5]??"";return r.length>0?`${t}:${r}`:t}function Di(){return typeof RTCPeerConnection>"u"?null:n=>new RTCPeerConnection(n)}var zt=new Map;async function Xe(n={}){if(n.wasm)return n.wasm;let e=n.wasmModule??new URL("./net_leaf.js",import.meta.url).href,t=`${e}|${String(n.wasmUrl??"")}`,r=zt.get(t);if(r)return r;let i=Mi(e,n.wasmUrl);zt.set(t,i);try{return await i}catch(s){throw zt.delete(t),s}}async function Mi(n,e){let t=await import(n),r=qi(t,n);return r.default&&await r.default(e===void 0?void 0:{module_or_path:e}),r}function qi(n,e){if(n===null||typeof n!="object"||!("LeafNode"in n))throw new Error(`${e} is not a net-mesh-leaf module: no LeafNode export`);let t=n.LeafNode;if(typeof t!="function"||!("connect"in t))throw new Error(`${e} exports a LeafNode without a static connect()`);if(typeof t.connect!="function")throw new Error(`${e} exports a LeafNode whose connect is not callable`);return n}function Ie(n,e){if(typeof n=="string")return n;let t=typeof n=="object"&&n!==null?Object.prototype.toString.call(n):String(n);throw new TypeError(`${t} is not a ${e} id: a ${e} id crosses this boundary as 16 hex digits as a STRING \u2014 the spelling this boundary hands out; a ${typeof n} is refused rather than coerced, because a number cannot carry a u64 id`)}function er(n){if(!/^\d+$/.test(n))throw new TypeError(`a decimal node id is digits only, got ${JSON.stringify(n)}`);let e=BigInt(n);if(e>0xffffffffffffffffn)throw new TypeError(`${n} does not fit in a u64 node id`);return e.toString(16).padStart(16,"0")}var mt=class{constructor(e,t,r,i){this.inner=e;this.bootstrapUrl=t;this.failureTyping=r;this.nodeId=e.node_id_hex(),this.anchorRtcAddr=i,e.on_event(s=>this.ingest(s))}inner;bootstrapUrl;failureTyping;hub=new Ae;nodeId;closed=!1;streams=new Set;orgHandles=new Re;anchorRtcAddr;bootstrapObserved=!1;nodeIdHex(){return this.nodeId}anchorIdHex(){return this.inner.anchor_id_hex()}originHashHex(){return this.inner.origin_hash_hex()}async enroll(){try{await this.inner.enroll()}catch(e){throw S(e)}}isEnrolled(){return this.inner.is_enrolled()}async call(e,t,r){try{return await this.inner.call(e,t,r)}catch(i){throw S(i)}}async subscribe(e){try{await this.inner.subscribe(e)}catch(t){throw S(t)}}async publish(e,t){try{await this.inner.publish(e,t)}catch(r){throw S(r)}}openStream(e){let t;try{t=this.inner.open_stream(e)}catch(i){throw S(i)}let r=new je(t,()=>this.streams.delete(r));return this.streams.add(r),r}async callOrg(e,t,r){try{return await this.inner.call_org(e,t,ne(r))}catch(i){throw S(i)}}async callOrgStreaming(e,t,r){try{let i=await this.inner.call_org_streaming(e,t,ne(r)),s=new be(i,()=>i.cancel(),()=>this.orgHandles.delete(s));return this.orgHandles.add(s),s}catch(i){throw S(i)}}async callOrgClientStream(e,t){try{let r=await this.inner.call_org_client_stream(e,ne(t)),i=new _e(r,()=>this.orgHandles.delete(i));return this.orgHandles.add(i),i}catch(r){throw S(r)}}async callOrgDuplex(e,t){try{let r=await this.inner.call_org_duplex(e,ne(t)),i=new Pe(r,()=>this.orgHandles.delete(i));return this.orgHandles.add(i),i}catch(r){throw S(r)}}serveOrg(e,t,r,i){try{let s=new X(this.inner.serve_org(e,t,dt(r),re(i)),()=>this.orgHandles.delete(s));return this.orgHandles.add(s),s}catch(s){throw S(s)}}serveOrgStreaming(e,t,r,i){try{let s=new X(this.inner.serve_org_streaming(e,t,ut(r),re(i)),()=>this.orgHandles.delete(s));return this.orgHandles.add(s),s}catch(s){throw S(s)}}serveOrgClientStream(e,t,r,i){try{let s=new X(this.inner.serve_org_client_stream(e,t,pt(r),re(i)),()=>this.orgHandles.delete(s));return this.orgHandles.add(s),s}catch(s){throw S(s)}}serveOrgDuplex(e,t,r,i){try{let s=new X(this.inner.serve_org_duplex(e,t,ft(r),re(i)),()=>this.orgHandles.delete(s));return this.orgHandles.add(s),s}catch(s){throw S(s)}}async signal(e,t,r,i){try{await this.inner.signal(Ie(e,"peer"),Ie(t,"dialog"),r,i)}catch(s){throw S(s)}}async connectPeer(e){let t;try{t=this.inner.peer_direct_dialog(Ie(e,"peer"))}catch(r){throw S(r)}return t!=null?{type:"direct",peer:e,dialog:t}:ht(e,this.peerPrimitives(),Ce)}peerPrimitives(){return{offer:e=>this.inner.peer_offer(e),acceptOffer:e=>this.inner.peer_accept_offer(e),candidate:(e,t)=>this.inner.peer_candidate_in(e,t),handshake:(e,t)=>this.inner.peer_handshake_in(e,t)}}async handshakePeer(e,t){return Bt(e,t,this.peerPrimitives())}async acceptPeer(e){return yt(e,this.peerPrimitives(),Ce)}async peerAttempt(e){try{return Ce(await this.inner.peer_candidate(e))}catch(t){throw S(t)}}counters(){return St(this.inner.counters_json())}rtcStats(){return tr(this.inner.rtc_stats_json())}enableNetworkRetry(){try{this.inner.arm_network_retry()}catch(e){throw S(e)}}retryReport(){return nr(this.inner.retry_report())}async announce(e){try{await this.inner.announce([...e])}catch(t){throw S(t)}}async query(e){let t;try{t=await this.inner.query(e)}catch(r){throw S(r)}return wt(t)}on(e,t){return this.hub.on(e,t)}onEvent(e){return this.hub.onAny(e)}events(){return this.hub.events()}async refineIceFailure(e){return Xt(e,{bootstrapUrl:this.bootstrapUrl,bootstrapObserved:this.bootstrapObserved,anchorRtcAddr:this.anchorRtcAddr,failureTyping:this.failureTyping})}close(){if(this.closed)return;this.closed=!0;let e=[];for(let r of this.orgHandles.retireAll(new D("org:rpc:cancelled: the node is closed")))e.push(S(r));let t=[...this.streams];this.streams.clear();for(let r of t)try{r.close()}catch(i){e.push(S(i))}try{this.hub.close()}catch(r){e.push(S(r))}try{this.inner.close()}catch(r){e.push(S(r))}if(e.length>0)throw new AggregateError(e,`close: ${e.length} of this node's teardown steps failed`)}ingest(e){let t=me(e);t.type==="connected"&&(this.bootstrapObserved=!0,t.rtcAddr!==null&&(this.anchorRtcAddr=t.rtcAddr)),this.hub.dispatch(t)}};async function Ni(n){let e=bt(n),t=n.failureTyping??{},r=await Xe(n);try{let i=await r.LeafNode.connect(e);return new mt(i,n.bootstrapUrl??null,t,n.anchorRtcAddr??null)}catch(i){throw await Xt(S(i),{bootstrapUrl:n.bootstrapUrl??null,bootstrapObserved:!1,anchorRtcAddr:n.anchorRtcAddr??null,failureTyping:t})}}function bt(n){return{credentialB64:$i(n),origin:n.origin??Bi(),...n.bootstrapUrl===void 0?{}:{bootstrapUrl:n.bootstrapUrl},...n.iceServers?{iceServers:n.iceServers}:{},...Wi(n)}}function St(n){let e=JSON.parse(n);if(e===null||typeof e!="object")return{};let t={};for(let[r,i]of Object.entries(e))t[r]=typeof i=="string"?i:String(i);return t}function Ce(n){let e=JSON.parse(n);if(e===null||typeof e!="object")throw new TypeError(`peer_candidate did not answer an object: ${n}`);let t=e,r=t.state;if(r!=="gathering"&&r!=="open"&&r!=="iceTimeout"&&r!=="udpBlocked"&&r!=="failed")throw new TypeError(`peer_candidate answered an unknown state: ${String(r)}`);let i=t.candidateError;return{dialog:String(t.dialog??""),state:r,sent:Number(t.sent??0),applied:Number(t.applied??0),answered:t.answered===!0,direct:t.direct===!0,remainingMs:String(t.remainingMs??"0"),candidateError:typeof i=="string"?i:null}}function tr(n){let e=JSON.parse(n);if(e===null||typeof e!="object")throw new TypeError(`rtc_stats_json did not answer an object: ${n}`);let t={},r={};for(let[i,s]of Object.entries(e)){if(i==="not_applicable"){if(s===null||typeof s!="object")continue;for(let[o,a]of Object.entries(s))r[o]=String(a);continue}t[i]=typeof s=="string"?s:String(s)}return{counters:t,notApplicable:r}}function nr(n){let e=JSON.parse(n);if(e===null||typeof e!="object")throw new TypeError(`retry_report did not answer an object: ${n}`);let t=e;return{armed:t.armed===!0,online:String(t.online??"0"),iceFailed:String(t.iceFailed??"0"),triggers:String(t.triggers??"0"),started:String(t.started??"0"),coalesced:String(t.coalesced??"0"),notEligible:String(t.notEligible??"0"),openEpisodes:Number(t.openEpisodes??0),owned:Number(t.owned??0),last:typeof t.last=="string"?t.last:null}}async function Xt(n,e){if(!(n instanceof pe)||n.failure.type!=="iceTimeout"||e.failureTyping.probeOnIceTimeout===!1)return n;let t=e.anchorRtcAddr;if(t===null)return n;let r=await Vt(t,e.failureTyping.stun);if(r.type!=="unanswered")return n;let i=e.bootstrapObserved||e.bootstrapUrl!==null&&await Kt(e.bootstrapUrl,e.failureTyping.bootstrap);return Ft({bootstrapOk:i,stunProbe:r,probed:t})}function wt(n){let e=ct(n);if(!Array.isArray(e))return[];let t=[];for(let r of e){if(r===null||typeof r!="object")continue;let i={...r},s=i.capabilities,o=Ui(i.node_id);t.push({nodeId:o,peerIdHex:er(o),entityId:gt(i.entity_id),capabilities:Array.isArray(s)?s.filter(a=>typeof a=="string"):[],rtcAddr:gt(i.rtc_addr),noisePubkey:gt(i.noise_pubkey),version:gt(i.version)})}return t}var Zn=/^[0-9a-fA-F]{64}$/;function Wi(n){let{entitySecretHex:e,noiseSecretHex:t}=n;if(e===void 0){if(t!==void 0)throw new ge("noiseSecretHex was supplied without entitySecretHex: the leaf would generate the entity half, so the identity would not be the one you meant to inject");return{}}if(!Zn.test(e))throw new ge(`entitySecretHex must be 32 bytes of hex (64 hex digits), got ${e.length} characters`);if(t===void 0)return{entitySecretHex:e};if(!Zn.test(t))throw new ge(`noiseSecretHex must be 32 bytes of hex (64 hex digits), got ${t.length} characters`);return{entitySecretHex:e,noiseSecretHex:t}}function Ui(n){return typeof n=="string"?n:typeof n=="number"?String(n):""}function gt(n){return typeof n=="string"?n.length>0?n:null:typeof n=="number"?String(n):null}function $i(n){if(n.credentialB64!==void 0)return n.credentialB64;let e=n.credential;if(typeof e=="string")return e;if(e instanceof Uint8Array)return Ut(e);throw new Error("connect() needs a credential: pass credentialB64 or credential")}function Bi(){let n=globalThis.location?.origin;if(typeof n=="string"&&n.length>0)return n;throw new Error("connect() needs an origin: there is no location.origin in this context")}function Gt(n){let e=me(n);return e.type!=="unknown"?e:Ji(e)??e}function Yt(n){switch(n.type){case"leader_changed":case"subscription_restored":case"leader_lost":case"generation_fenced":case"not_leader":case"promotion_failed":return!0;default:return!1}}function Ji(n){let e=n.raw;if(e===null||typeof e!="object")return null;let t={...e};switch(n.tag){case"leader_changed":return{type:"leader_changed",generation:He(t.generation)};case"subscription_restored":return{type:"subscription_restored",channel:typeof t.channel=="string"?t.channel:""};case"leader_lost":{let r=Number(t.failed);return{type:"leader_lost",generation:He(t.generation),failed:Number.isFinite(r)?r:0}}case"generation_fenced":return{type:"generation_fenced",presented:He(t.presented),current:He(t.current)};case"not_leader":return{type:"not_leader",presented:He(t.presented),current:He(t.current)};case"promotion_failed":return{type:"promotion_failed",generation:He(t.generation),detail:typeof t.detail=="string"?t.detail:""};default:return null}}function He(n){return typeof n=="string"?n:typeof n=="number"&&Number.isFinite(n)?String(n):"0"}function Qt(n){let e=n.MeshSession;if(!(e!==null&&(typeof e=="object"||typeof e=="function")&&"open"in e&&typeof e.open=="function"))throw new Error("this net-mesh-leaf bundle has no MeshSession: leader election and the follower proxy need a wasm build from Stage 5 slice 3 or later");return n}var vt=class{constructor(e){this.inner=e;this.streamGeneration=e.generation(),e.on_event(t=>this.hub.deliver(t,Gt)),this.hub.onAny(t=>{if(t.type==="leader_lost"||t.type==="not_leader"){this.orgHandles.retireAll(new Z(this.streamGeneration)),this.endStreams();return}let r=this.inner.generation();if(r===this.streamGeneration)return;let i=this.streamGeneration;this.streamGeneration=r,this.orgHandles.retireAll(new Z(i)),this.endStreams()})}inner;hub=new Ae;streams=new Set;streamGeneration;orgHandles=new Re;closed=!1;role(){return this.inner.role()==="leader"?"leader":"follower"}generation(){return this.inner.generation()}nodeIdHex(){return this.inner.node_id_hex()??null}fingerprint(){return this.inner.fingerprint()}scope(){return this.inner.scope()}interruptionMs(){return this.inner.interruption_ms()??null}async call(e,t,r){return await this.guard(()=>this.inner.call(e,t,r))}async subscribe(e){await this.guard(()=>this.inner.subscribe(e))}async unsubscribe(e){await this.guard(()=>this.inner.unsubscribe(e))}async publish(e,t){await this.guard(()=>this.inner.publish(e,t))}async announce(e){await this.guard(()=>this.inner.announce([...e]))}async query(e){return wt(await this.guard(()=>this.inner.query(e)))}async counters(){return St(await this.guard(()=>this.inner.counters_json()))}async enroll(){await this.guard(()=>this.inner.enroll())}async isEnrolled(){return await this.guard(()=>this.inner.is_enrolled())}async signal(e,t,r,i){await this.guard(()=>this.inner.signal(Ie(e,"peer"),Ie(t,"dialog"),r,i))}async connectPeer(e){let t;try{t=await this.inner.peer_direct_dialog(e)??void 0}catch{t=void 0}return t!==void 0?{type:"direct",peer:e,dialog:t}:ht(e,this.peerPrimitives(),Ce)}async acceptPeer(e){return yt(e,this.peerPrimitives(),Ce)}peerPrimitives(){return{offer:e=>this.guard(()=>this.inner.peer_offer(e)),acceptOffer:e=>this.guard(()=>this.inner.peer_accept_offer(e)),candidate:(e,t)=>this.guard(()=>this.inner.peer_candidate(e,t)),handshake:(e,t)=>this.guard(()=>this.inner.peer_handshake(e,t))}}async openStream(e){let t=this.inner.generation(),r=new je(await this.guard(()=>this.inner.open_stream(e)));return this.closed||this.inner.generation()!==t?(r.close(),r):(this.streams.add(r),r)}async callOrg(e,t,r){return await this.guard(()=>this.inner.call_org(e,t,ne(r)))}async callOrgStreaming(e,t,r){let i=this.inner.generation(),s;try{let o=await this.inner.call_org_streaming(e,t,ne(r));s=new be(o,()=>o.cancel(),()=>this.orgHandles.delete(s))}catch(o){throw S(o)}return this.closed||this.inner.generation()!==i?(s.retire(this.closed?new D("org:rpc:cancelled: the session is closed"):new Z(i)),s):(this.orgHandles.add(s),s)}async callOrgClientStream(e,t){let r=this.inner.generation(),i;try{let s=await this.inner.call_org_client_stream(e,ne(t));i=new _e(s,()=>this.orgHandles.delete(i))}catch(s){throw S(s)}return this.closed||this.inner.generation()!==r?(i.retire(this.closed?new D("org:rpc:cancelled: the session is closed"):new Z(r)),i):(this.orgHandles.add(i),i)}async callOrgDuplex(e,t){let r=this.inner.generation(),i;try{let s=await this.inner.call_org_duplex(e,ne(t));i=new Pe(s,()=>this.orgHandles.delete(i))}catch(s){throw S(s)}return this.closed||this.inner.generation()!==r?(i.retire(this.closed?new D("org:rpc:cancelled: the session is closed"):new Z(r)),i):(this.orgHandles.add(i),i)}serveOrg(e,t,r,i){try{let s=new X(this.inner.serve_org(e,t,dt(r),re(i)),()=>this.orgHandles.delete(s));return this.orgHandles.add(s),s}catch(s){throw S(s)}}serveOrgStreaming(e,t,r,i){try{let s=new X(this.inner.serve_org_streaming(e,t,ut(r),re(i)),()=>this.orgHandles.delete(s));return this.orgHandles.add(s),s}catch(s){throw S(s)}}serveOrgClientStream(e,t,r,i){try{let s=new X(this.inner.serve_org_client_stream(e,t,pt(r),re(i)),()=>this.orgHandles.delete(s));return this.orgHandles.add(s),s}catch(s){throw S(s)}}serveOrgDuplex(e,t,r,i){try{let s=new X(this.inner.serve_org_duplex(e,t,ft(r),re(i)),()=>this.orgHandles.delete(s));return this.orgHandles.add(s),s}catch(s){throw S(s)}}on(e,t){return this.hub.on(e,t)}onEvent(e){return this.hub.onAny(e)}onLifecycle(e){return this.hub.onAny(t=>{Yt(t)&&e(t)})}events(){return this.hub.events()}close(){this.closed||(this.closed=!0,this.orgHandles.retireAll(new D("org:rpc:cancelled: the session is closed")),this.endStreams(),this.hub.close(),this.inner.close())}endStreams(){let e=[...this.streams];this.streams.clear();for(let t of e)t.close()}async guard(e){try{return await e()}catch(t){throw S(t)}}};async function Fi(n){let e=Qt(await Xe(n)),t={...bt(n),...n.capabilities?{capabilities:[...n.capabilities]}:{},...n.subscriptions?{subscriptions:[...n.subscriptions]}:{},...n.dbName===void 0?{}:{dbName:n.dbName},...n.lockScope===void 0?{}:{lockScope:n.lockScope}};try{return new vt(await e.MeshSession.open(t))}catch(r){throw S(r)}}var rr=["invalid-data","version-mismatch","forbidden","not-ready","capacity","timeout","aborted","indeterminate","owner-lost","closed","action-rejected","result-expired"],h=class extends Error{code;constructor(e,t,r){super(t,r),this.name="StoreError",this.code=e}};function Ot(n){return(n instanceof Error?n.message:String(n)).includes("stale stream handle")}var xt=Object.freeze({$hidden:!0});function kt(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)&&Object.keys(n).length===1&&n.$hidden===!0}function Vi(n){return e=>kt(e)?xt:n(e)}var ir=Object.freeze({"card-game":Object.freeze({"players.*.hand":"owner",deck:"nobody","deck.length":"everyone"})}),Ki=/^(\*|[^.*]+)$/;function Le(n){let e;if(n==="open")e={};else if(typeof n=="string"){let i=ir[n];if(i===void 0)throw new h("invalid-data",`unknown visibility preset '${n}'`);e={...i}}else if(typeof n=="object"&&n!==null){let{preset:i,...s}=n;if(e={},i!==void 0){let o=ir[i];if(o===void 0)throw new h("invalid-data",`unknown visibility preset '${String(i)}'`);Object.assign(e,o)}Object.assign(e,s)}else throw new h("invalid-data","visibility is a preset name or an object of path \u2192 rule");let t=[],r=!1;for(let[i,s]of Object.entries(e)){let o=i.split(".");if(i.length===0||!o.every(c=>Ki.test(c)))throw new h("invalid-data",`visibility path '${i}' is not dot-separated keys and '*'`);let a=o.length>1&&o[o.length-1]==="length";if(!(s==="everyone"||s==="nobody"||s==="owner"||Array.isArray(s)&&s.length>0&&s.every(c=>typeof c=="string"&&c.length>0)))throw new h("invalid-data",`visibility rule for '${i}' must be 'everyone', 'nobody', 'owner' or a non-empty list of audiences`);if(s==="owner"){if(!o.includes("*"))throw new h("invalid-data",`'owner' needs a '*' in the path to name the owner: '${i}'`);r=!0}t.push(Object.freeze({path:i,segments:Object.freeze(o),rule:s,counts:a}))}return t.sort((i,s)=>i.segments.length-s.segments.length),Object.freeze({rules:Object.freeze(t),perPlayer:r})}function sr(n,e,t){return n==="everyone"?!0:n==="nobody"||t===null?!1:n==="owner"?e[0]===t.peer:n.some(r=>t.audience.includes(r))}function zi(n,e){let t=[],r=(i,s,o,a)=>{if(s===e.length){t.push({keys:[...o],captures:[...a],value:i});return}if(typeof i!="object"||i===null)return;let d=e[s];if(d==="*"){let c=Array.isArray(i)?i.map((l,u)=>[u,l]):Object.entries(i);for(let[l,u]of c)r(u,s+1,[...o,l],[...a,String(l)]);return}Array.isArray(i)||!Object.prototype.hasOwnProperty.call(i,d)||r(i[d],s+1,[...o,d],a)};return r(n,0,[],[]),t}var Zt=Symbol("drop");function Xi(n,e,t){let r=n;for(let i of e){let s=r.children.get(i);s===void 0&&(s={children:new Map},r.children.set(i,s)),r=s}r.value=t}function en(n,e){if("value"in e)return e.value;if(e.children.size===0||typeof n!="object"||n===null)return n;if(Array.isArray(n)){let r=[];return n.forEach((i,s)=>{let o=e.children.get(s),a=o===void 0?i:en(i,o);a!==Zt&&r.push(a)}),r}let t={};for(let[r,i]of Object.entries(n)){let s=e.children.get(r),o=s===void 0?i:en(i,s);o!==Zt&&(t[r]=o)}return t}var or="\0";function Te(n,e,t){if(n.rules.length===0)return e;let r={children:new Map},i=new Set,s=!1;for(let o of n.rules){if(o.counts)continue;let a=n.rules.find(c=>c.counts&&c.segments.length===o.segments.length+1&&c.segments.slice(0,-1).every((l,u)=>l===o.segments[u])),d=o.segments[o.segments.length-1]==="*";for(let c of zi(e,o.segments)){let l="",u=!1;for(let f=0;f<c.keys.length-1&&!u;f+=1)l=f===0?String(c.keys[0]):`${l}${or}${String(c.keys[f])}`,u=i.has(l);if(u||sr(o.rule,c.captures,t))continue;let p=d?Zt:xt;a!==void 0&&Array.isArray(c.value)&&sr(a.rule,c.captures,t)&&(p=c.value.map(()=>xt)),Xi(r,c.keys,p),i.add(c.keys.map(String).join(or)),s=!0}}return s?en(e,r):e}function ar(n,e,t){return n.visibility===void 0?e:Te(Le(n.visibility),e,t)}function Gi(n,e,t,r){let i=ar(n,e,t);for(let s of r){let o=i;for(let d of s.split(".")){if(typeof o!="object"||o===null||!Object.prototype.hasOwnProperty.call(o,d)){o=void 0;break}o=o[d]}if(o!==void 0&&!kt(o)&&!(Array.isArray(o)&&o.every(d=>kt(d))))throw new Error(`'${s}' is visible to ${t===null?"nobody in particular":t.peer}`)}}function Yi(n){if(n.id.length===0)throw new h("invalid-data","a store definition needs a non-empty id");if(!Number.isSafeInteger(n.version)||n.version<1)throw new h("invalid-data",`store '${n.id}' needs a positive integer version, got ${String(n.version)}`);let e;try{e=n.empty()}catch(t){throw new h("invalid-data",`store '${n.id}' could not build its empty state: ${String(t)}`,{cause:t})}try{n.state(e)}catch(t){throw new h("invalid-data",`store '${n.id}': empty() is not a valid state, so a replica could not clear a projection with it: ${String(t)}`,{cause:t})}if(n.visibility!==void 0)try{Le(n.visibility)}catch(t){throw new h("invalid-data",`store '${n.id}': ${t instanceof Error?t.message:String(t)}`,{cause:t})}if(n.interest!==void 0){for(let[t,r]of Object.entries(n.interest))if(t.length===0||t.includes(".")||typeof r!="function")throw new h("invalid-data",`store '${n.id}': interest maps a top-level collection name to a key function, got '${t}'`)}if(n.entities!==void 0)for(let[t,r]of Object.entries(n.entities)){if(t.length===0||t.includes(".")||typeof r!="function")throw new h("invalid-data",`store '${n.id}': entities maps a top-level collection name to a per-entity parser, got '${t}'`);let i=e[t];if(i!==void 0&&!tn(i))throw new h("invalid-data",`store '${n.id}': entities names '${t}', but empty().${t} is not a record of entities`)}return Object.freeze({...n})}function tn(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var T=class extends Error{constructor(t,r){super(t);this.reason=t;this.at=r}reason;at};function De(n){let e=new nn(n);try{return{ok:!0,value:e.document()}}catch(t){if(t instanceof T)return{ok:!1,reason:t.reason,at:t.at};throw t}}var nn=class{constructor(e){this.src=e}src;i=0;document(){if(this.skipWhitespace(),this.i>=this.src.length)throw new T("empty",this.i);let e=this.value(0);if(this.skipWhitespace(),this.i!==this.src.length)throw new T("trailing-content",this.i);return e}value(e){let t=this.src.charCodeAt(this.i);switch(t){case 123:return this.object(e+1);case 91:return this.array(e+1);case 34:return this.string();default:break}if(t===45||t>=48&&t<=57)return this.number();if(this.src.startsWith("true",this.i))return this.i+=4,!0;if(this.src.startsWith("false",this.i))return this.i+=5,!1;if(this.src.startsWith("null",this.i))return this.i+=4,null;throw new T(Number.isNaN(t)?"unexpected-end":"literal",this.i)}object(e){if(e>16)throw new T("depth-exceeded",this.i);this.i+=1;let t=Object.create(null);if(this.skipWhitespace(),this.peek()===125)return this.i+=1,t;for(;;){if(this.skipWhitespace(),this.peek()!==34)throw new T("unexpected-token",this.i);let r=this.i,i=this.string();if(Object.prototype.hasOwnProperty.call(t,i))throw new T("duplicate-key",r);if(this.skipWhitespace(),this.peek()!==58)throw new T("unexpected-token",this.i);this.i+=1,this.skipWhitespace(),t[i]=this.value(e),this.skipWhitespace();let s=this.peek();if(s===44){this.i+=1;continue}if(s===125)return this.i+=1,t;throw new T(s===-1?"unexpected-end":"unexpected-token",this.i)}}array(e){if(e>16)throw new T("depth-exceeded",this.i);this.i+=1;let t=[];if(this.skipWhitespace(),this.peek()===93)return this.i+=1,t;for(;;){this.skipWhitespace(),t.push(this.value(e)),this.skipWhitespace();let r=this.peek();if(r===44){this.i+=1;continue}if(r===93)return this.i+=1,t;throw new T(r===-1?"unexpected-end":"unexpected-token",this.i)}}string(){this.i+=1;let e="";for(;;){if(this.i>=this.src.length)throw new T("unexpected-end",this.i);let t=this.src.charCodeAt(this.i);if(t===34)return this.i+=1,e;if(t===92){e+=this.escape();continue}if(t<32)throw new T("string-control-char",this.i);e+=this.src[this.i],this.i+=1}}escape(){this.i+=1;let e=this.src[this.i];switch(this.i+=1,e){case'"':return'"';case"\\":return"\\";case"/":return"/";case"b":return"\b";case"f":return"\f";case"n":return`
2
+ `;case"r":return"\r";case"t":return" ";case"u":{let t=this.src.slice(this.i,this.i+4);if(!/^[0-9a-fA-F]{4}$/.test(t))throw new T("string-escape",this.i);return this.i+=4,String.fromCharCode(Number.parseInt(t,16))}default:throw new T("string-escape",this.i-1)}}number(){let e=this.i;if(this.peek()===45&&(this.i+=1),this.peek()===48){if(this.i+=1,this.isDigit(this.peek()))throw new T("number-grammar",e)}else if(this.isDigit(this.peek()))for(;this.isDigit(this.peek());)this.i+=1;else throw new T("number-grammar",e);if(this.peek()===46){if(this.i+=1,!this.isDigit(this.peek()))throw new T("number-grammar",e);for(;this.isDigit(this.peek());)this.i+=1}let t=this.src[this.i];if(t==="e"||t==="E"){this.i+=1;let i=this.peek();if((i===43||i===45)&&(this.i+=1),!this.isDigit(this.peek()))throw new T("number-grammar",e);for(;this.isDigit(this.peek());)this.i+=1}let r=Number(this.src.slice(e,this.i));if(!Number.isFinite(r))throw new T("number-not-finite",e);return r}isDigit(e){return e>=48&&e<=57}peek(){return this.i>=this.src.length?-1:this.src.charCodeAt(this.i)}skipWhitespace(){for(;;){let e=this.peek();if(e===32||e===9||e===10||e===13){this.i+=1;continue}return}}};var cr=1,G=32,fe=16,on=16,Qi=32,Zi=128,dr=256,ur=64,Se=1024*1024,oe=255,an=256,ln=8,Ge=64,es=256,ts=18446744073709551615n,ns=20,rs=["join","resume","resync","act","in","aud","alive","leave","int"],is=["man","snap","delta","res","ok","no"],ss={join:{required:["v","k","q","def","ver","store","key","aud"],optional:["int"]},resume:{required:["v","k","q","h","aud"],optional:["int"]},int:{required:["v","k","q","h","int"],optional:[]},resync:{required:["v","k","q","h","g","have"],optional:[]},aud:{required:["v","k","q","h","aud"],optional:[]},alive:{required:["v","k","q","h"],optional:[]},leave:{required:["v","k","q","h"],optional:[]},act:{required:["v","k","q","h","s","name","in"],optional:[]},in:{required:["v","k","h","name","s","in"],optional:[]},man:{required:["v","k","h","inc","g","r","n","bytes"],optional:["q"]},snap:{required:["v","k","h","g","r","i","n","d"],optional:[]},delta:{required:["v","k","h","g","base","r","ops"],optional:[]},res:{required:["v","k","q","h","s","out"],optional:[]},ok:{required:["v","k","q","h"],optional:[]},no:{required:["v","k","code"],optional:["q","h","s","detail"]}},os={join:["v","k","q","def","ver","store","key","aud","int"],resume:["v","k","q","h","aud","int"],int:["v","k","q","h","int"],resync:["v","k","q","h","g","have"],aud:["v","k","q","h","aud"],alive:["v","k","q","h"],leave:["v","k","q","h"],act:["v","k","q","h","s","name","in"],in:["v","k","h","name","s","in"],man:["v","k","q","h","inc","g","r","n","bytes"],snap:["v","k","h","g","r","i","n","d"],delta:["v","k","h","g","base","r","ops"],res:["v","k","q","h","s","out"],ok:["v","k","q","h"],no:["v","k","q","h","code","s","detail"]},rn=new Set(rs),lr=new Set(is),as=new Set(rr),ls=/^[A-Za-z0-9+/]+={0,2}$/;function B(n,e,t="invalid-data"){return{ok:!1,code:t,stage:n,reason:e}}var Et=class{constructor(e){this.refusal=e}refusal};function L(n,e,t="invalid-data"){return new Et(B(n,e,t))}function v(n){return n instanceof Et}function U(n){let e=0;for(let t=0;t<n.length;t+=1){let r=n.codePointAt(t);r>65535&&(t+=1),e+=r<=127?1:r<=2047?2:r<=65535?3:4}return e}function Me(n,e){if(U(n)>e.maxBytes)return B("bytes","frame-too-large","capacity");let r=De(n);if(!r.ok)return B("json",r.reason);let i=r.value;if(typeof i!="object"||i===null||Array.isArray(i))return B("json","not-an-object");let s=i;if(s.v!==cr)return B("envelope","unknown-version");let o=s.k;if(typeof o!="string"||!(rn.has(o)||lr.has(o)))return B("envelope","unknown-kind");let a=o;if(!(e.as==="owner"?rn:lr).has(a))return B("direction",`wrong-direction:${a}`);let c=ss[a],l=new Set([...c.required,...c.optional]);for(let u of Object.keys(s))if(!l.has(u))return B("payload","unknown-field");for(let u of c.required)if(!Object.prototype.hasOwnProperty.call(s,u))return B("payload","missing-field");return cs(a,s)}function cs(n,e){let t=(c,l)=>{let u=e[c];return typeof u!="string"||u.length!==l||!us(u)?L("payload",`non-canonical-hex:${c}`):u},r=c=>{let l=e[c];return typeof l!="string"||!pr(l)?L("payload",`non-canonical-decimal:${c}`):l},i=(c,l,u)=>{let p=e[c];return typeof p!="number"||!Number.isInteger(p)||p<l||p>u?L("payload",`bad-integer:${c}`):p},s=c=>{let l=e[c];return typeof l!="string"||l.length===0?L("payload",`bad-string:${c}`):l},o=c=>{let l=e[c];return typeof l!="object"||l===null||Array.isArray(l)?L("payload",`bad-object:${c}`):l},a=()=>{let c=e.aud;if(!Array.isArray(c))return L("payload","bad-audience");if(c.length>Qi)return L("payload","audience-too-many","capacity");let l=[];for(let u of c){if(typeof u!="string"||u.length===0)return L("payload","bad-audience-label");if(U(u)>Zi)return L("payload","audience-label-too-long","capacity");l.push(u)}return l},d=c=>{if(!Object.prototype.hasOwnProperty.call(e,"int"))return c?L("payload","missing-field"):void 0;let l=e.int;if(!Array.isArray(l))return L("payload","bad-interest");if(l.length>dr)return L("payload","interest-too-many","capacity");let u=[];for(let p of l){if(typeof p!="string"||p.length===0)return L("payload","bad-interest-key");if(U(p)>ur)return L("payload","interest-key-too-long","capacity");u.push(p)}return u};switch(n){case"int":{let c=t("q",fe);if(v(c))return c.refusal;let l=t("h",G);if(v(l))return l.refusal;let u=d(!0);return v(u)?u.refusal:{ok:!0,message:{k:n,q:c,h:l,int:u}}}case"join":{let c=t("q",fe);if(v(c))return c.refusal;let l=s("def");if(v(l))return l.refusal;let u=i("ver",0,Number.MAX_SAFE_INTEGER);if(v(u))return u.refusal;let p=s("store");if(v(p))return p.refusal;let f=s("key");if(v(f))return f.refusal;let y=a();if(v(y))return y.refusal;let O=d(!1);return v(O)?O.refusal:{ok:!0,message:O===void 0?{k:n,q:c,def:l,ver:u,store:p,key:f,aud:y}:{k:n,q:c,def:l,ver:u,store:p,key:f,aud:y,int:O}}}case"resume":case"aud":{let c=t("q",fe);if(v(c))return c.refusal;let l=t("h",G);if(v(l))return l.refusal;let u=a();if(v(u))return u.refusal;if(n==="resume"){let p=d(!1);return v(p)?p.refusal:{ok:!0,message:p===void 0?{k:n,q:c,h:l,aud:u}:{k:n,q:c,h:l,aud:u,int:p}}}return{ok:!0,message:{k:n,q:c,h:l,aud:u}}}case"resync":{let c=t("q",fe);if(v(c))return c.refusal;let l=t("h",G);if(v(l))return l.refusal;let u=r("g");if(v(u))return u.refusal;let p=r("have");return v(p)?p.refusal:{ok:!0,message:{k:n,q:c,h:l,g:u,have:p}}}case"alive":case"leave":case"ok":{let c=t("q",fe);if(v(c))return c.refusal;let l=t("h",G);return v(l)?l.refusal:{ok:!0,message:{k:n,q:c,h:l}}}case"act":{let c=t("q",fe);if(v(c))return c.refusal;let l=t("h",G);if(v(l))return l.refusal;let u=r("s");if(v(u))return u.refusal;let p=s("name");if(v(p))return p.refusal;let f=o("in");return v(f)?f.refusal:{ok:!0,message:{k:n,q:c,h:l,s:u,name:p,in:f}}}case"in":{let c=t("h",G);if(v(c))return c.refusal;let l=s("name");if(v(l))return l.refusal;let u=r("s");if(v(u))return u.refusal;let p=o("in");return v(p)?p.refusal:{ok:!0,message:{k:n,h:c,name:l,s:u,in:p}}}case"res":{let c=t("q",fe);if(v(c))return c.refusal;let l=t("h",G);if(v(l))return l.refusal;let u=r("s");if(v(u))return u.refusal;let p=o("out");return v(p)?p.refusal:{ok:!0,message:{k:n,q:c,h:l,s:u,out:p}}}case"man":{let c=t("h",G);if(v(c))return c.refusal;let l=t("inc",on);if(v(l))return l.refusal;let u=r("g");if(v(u))return u.refusal;let p=r("r");if(v(p))return p.refusal;let f=i("n",1,oe);if(v(f))return f.refusal;let y=r("bytes");if(v(y))return y.refusal;if(BigInt(y)>BigInt(Se))return B("payload","snapshot-too-large","capacity");if(Object.prototype.hasOwnProperty.call(e,"q")){let O=t("q",fe);return v(O)?O.refusal:{ok:!0,message:{k:n,q:O,h:c,inc:l,g:u,r:p,n:f,bytes:y}}}return{ok:!0,message:{k:n,h:c,inc:l,g:u,r:p,n:f,bytes:y}}}case"snap":{let c=t("h",G);if(v(c))return c.refusal;let l=r("g");if(v(l))return l.refusal;let u=r("r");if(v(u))return u.refusal;let p=i("n",1,oe);if(v(p))return p.refusal;let f=i("i",0,p-1);if(v(f))return f.refusal;let y=e.d;return typeof y!="string"||!cn(y)?B("payload","non-canonical-base64:d"):{ok:!0,message:{k:n,h:c,g:l,r:u,i:f,n:p,d:y}}}case"delta":{let c=t("h",G);if(v(c))return c.refusal;let l=r("g");if(v(l))return l.refusal;let u=r("base");if(v(u))return u.refusal;let p=r("r");if(v(p))return p.refusal;let f=ds(e.ops);return v(f)?f.refusal:{ok:!0,message:{k:n,h:c,g:l,base:u,r:p,ops:f}}}case"no":{let c=e.code;if(typeof c!="string"||!as.has(c))return B("payload","unknown-code");let l=Object.prototype.hasOwnProperty.call(e,"q"),u=Object.prototype.hasOwnProperty.call(e,"h"),p=Object.prototype.hasOwnProperty.call(e,"s");if(!l&&!u)return B("payload","no-names-nothing");if(!l){if(c!=="closed"&&c!=="owner-lost")return B("payload","unsolicited-no-must-be-closed-or-owner-lost");if(p)return B("payload","unsolicited-no-carries-no-sequence")}let f={k:"no",code:c};if(l){let y=t("q",fe);if(v(y))return y.refusal;f.q=y}if(u){let y=t("h",G);if(v(y))return y.refusal;f.h=y}if(p){let y=r("s");if(v(y))return y.refusal;f.s=y}if(Object.prototype.hasOwnProperty.call(e,"detail")){let y=e.detail;if(typeof y!="string")return B("payload","bad-string:detail");if(U(y)>es)return B("payload","detail-too-long","capacity");f.detail=y}return{ok:!0,message:f}}}}function ds(n){if(!Array.isArray(n))return L("payload","bad-ops");if(n.length>an)return L("payload","ops-too-many","capacity");let e=[];for(let t of n){if(typeof t!="object"||t===null||Array.isArray(t))return L("payload","bad-op");let r=t,i=r.o;if(i!=="r"&&i!=="x")return L("payload","bad-op-kind");let s=i==="r"?["o","p","val"]:["o","p"];for(let d of Object.keys(r))if(!s.includes(d))return L("payload","unknown-field");if(i==="r"&&!Object.prototype.hasOwnProperty.call(r,"val"))return L("payload","missing-field");let o=r.p;if(!Array.isArray(o))return L("payload","bad-path");if(o.length>ln)return L("payload","path-too-deep","capacity");let a=[];for(let d of o){if(typeof d!="string"||d.length===0)return L("payload","bad-segment");if(U(d)>Ge)return L("payload","segment-too-long","capacity");a.push(d)}e.push(i==="r"?{o:i,p:a,val:r.val}:{o:i,p:a})}return e}function us(n){for(let e=0;e<n.length;e+=1){let t=n.charCodeAt(e),r=t>=48&&t<=57,i=t>=97&&t<=102;if(!r&&!i)return!1}return n.length>0}function pr(n){if(n.length===0||n.length>ns)return!1;for(let e=0;e<n.length;e+=1){let t=n.charCodeAt(e);if(t<48||t>57)return!1}return n.length>1&&n.charCodeAt(0)===48?!1:BigInt(n)<=ts}function cn(n){if(n.length===0)return!0;if(n.length%4!==0||!ls.test(n))return!1;let e=n.endsWith("==")?2:n.endsWith("=")?1:0;if(e===0)return!0;let t=n.charCodeAt(n.length-e-1),r=ps(t);return r<0?!1:(r&(e===2?15:3))===0}function ps(n){return n>=65&&n<=90?n-65:n>=97&&n<=122?n-97+26:n>=48&&n<=57?n-48+52:n===43?62:n===47?63:-1}function ae(n){if(!pr(n))throw new RangeError(`not a canonical decimal: ${JSON.stringify(n)}`);return BigInt(n)}function dn(n,e){return sn(n,e,new Set)}function sn(n,e,t){if(n===null)return null;switch(typeof n){case"boolean":case"string":return null;case"number":return Number.isFinite(n)?null:`non-finite-number:${e}`;case"object":{let r=n;if(t.has(r))return`circular:${e}`;if("toJSON"in r)return`to-json-transform:${e}`;if(r instanceof Map||r instanceof Set||r instanceof WeakMap||r instanceof WeakSet)return`map-or-set:${e}`;if(Object.getOwnPropertySymbols(r).length>0)return`symbol-key:${e}`;t.add(r);try{if(Array.isArray(n)){for(let i=0;i<n.length;i+=1){let s=sn(n[i],`${e}[${i}]`,t);if(s!==null)return s}return null}for(let[i,s]of Object.entries(n)){let o=sn(s,`${e}.${i}`,t);if(o!==null)return o}return null}finally{t.delete(r)}}default:return`not-json:${e}`}}function fs(n){switch(n.k){case"act":case"in":return[["in",n.in]];case"res":return[["out",n.out]];case"delta":return n.ops.flatMap((e,t)=>e.o==="r"?[[`ops[${t}].val`,e.val]]:[]);default:return[]}}function R(n){for(let[o,a]of fs(n)){let d=dn(a,o);if(d!==null)throw new RangeError(`refusing to encode an invalid ${n.k}: ${d}`)}let e={v:cr,k:n.k},t=n;for(let o of os[n.k]){if(o==="v"||o==="k"||!Object.prototype.hasOwnProperty.call(t,o))continue;let a=t[o];a!==void 0&&(e[o]=a)}let r=JSON.stringify(e),i=rn.has(n.k)?"owner":"replica",s=Me(r,{maxBytes:Number.MAX_SAFE_INTEGER,as:i});if(!s.ok)throw new RangeError(`refusing to encode an invalid ${n.k}: ${s.reason}`);return r}var hs=192,fr=1024,hr=197;function ys(n){return Math.floor((n-hs)/4)*3}function gr(n){if(!Number.isFinite(n)||!Number.isInteger(n)||n<=0)throw new h("capacity",`the transport reported no usable event size (${String(n)})`);if(hr>n)throw new h("capacity",`the frozen envelopes need ${hr} B and the transport allows ${n} B`);let e=ys(n);if(e<fr)throw new h("capacity",`a ${n} B event leaves ${e} B per chunk, below the ${fr} B floor`);if(e*oe<Se)throw new h("capacity",`a ${n} B event leaves ${e} B per chunk: ${oe} of them cover ${e*oe} B, below the ${Se} B snapshot bound`);return e}function mr(n,e){if(e<1)throw new h("capacity",`a chunk budget of ${e} B cannot carry anything`);try{let s=dn(n,"state");if(s!==null)throw new h("invalid-data",`the projected state is not JSON: ${s}`)}catch(s){throw s instanceof h?s:new h("invalid-data",`the projected state is not JSON: ${String(s)}`,{cause:s})}let t;try{t=JSON.stringify(n)}catch(s){throw new h("invalid-data","the projected state is not JSON",{cause:s})}if(t===void 0)throw new h("invalid-data","the projected state is not JSON");let r=new TextEncoder().encode(t);if(r.length>Se)throw new h("capacity",`the projection is ${r.length} B and the bound is ${Se} B`);let i=[];for(let s=0;s<r.length;s+=e)i.push(gs(r.subarray(s,s+e)));if(i.length>oe)throw new h("capacity",`the projection needs ${i.length} chunks and the bound is ${oe}`);return{bytes:r.length,n:i.length,pieces:i}}var yr=32768;function gs(n){let e="";for(let t=0;t<n.length;t+=yr)e+=String.fromCharCode(...n.subarray(t,t+yr));return btoa(e)}function br(n){let e=atob(n),t=new Uint8Array(e.length);for(let r=0;r<e.length;r+=1)t[r]=e.charCodeAt(r);return t}var pn=1e4,ms=8*1024*1024;function V(n,e,t="invalid-data"){return{ok:!1,code:t,reason:n,fatal:e}}var un=class{constructor(e,t){this.manifest=e;this.openedAt=t;this.pieces=new Array(e.n),this.encoded=new Array(e.n)}manifest;openedAt;pieces;encoded;admitted=0;held=0;closed=!1;get bytesHeld(){return this.held}get bytesReserved(){return this.closed?0:Math.max(Number(this.manifest.bytes),this.held)}get have(){return this.admitted}get reclaimed(){return this.closed}reclaim(){this.closed=!0,this.pieces.fill(void 0),this.encoded.fill(void 0),this.admitted=0,this.held=0}expired(e){return e-this.openedAt>=pn}accept(e,t,r){if(this.closed)return V("chunk-wrong-assembly",!1);if(this.expired(r))return this.reclaim(),V("deadline",!0,"timeout");let i=this.manifest;if(e.h!==i.h||e.g!==i.g||e.r!==i.r||e.n!==i.n)return V("chunk-wrong-assembly",!1);if(!Number.isInteger(e.i)||e.i<0||e.i>=i.n)return V("chunk-index",!1);if(!cn(e.d))return V("chunk-non-canonical",!1);let s=this.encoded[e.i];if(s!==void 0)return s===e.d?{ok:!0,done:!1,have:this.admitted}:(this.reclaim(),V("chunk-conflict",!0));let o=br(e.d),a=Number(i.bytes);if(this.held+o.length>a)return this.reclaim(),V("byte-total-mismatch",!0);if(this.encoded[e.i]=e.d,this.pieces[e.i]=o,this.admitted+=1,this.held+=o.length,this.admitted<i.n)return{ok:!0,done:!1,have:this.admitted};if(this.held!==a)return this.reclaim(),V("byte-total-mismatch",!0);let d=new Uint8Array(this.held),c=0;for(let p of this.pieces){if(p===void 0)return this.reclaim(),V("byte-total-mismatch",!0);d.set(p,c),c+=p.length}let l=new TextDecoder("utf-8",{fatal:!0}),u;try{let p=De(l.decode(d));if(!p.ok)return this.reclaim(),V("assembled-not-json",!0);u=p.value}catch{return this.reclaim(),V("assembled-not-json",!0)}try{t(u)}catch{return this.reclaim(),V("assembled-invalid",!0)}return this.reclaim(),{ok:!0,done:!0,document:u}}},At=class n{constructor(e=ms){this.maxTotalBytes=e}maxTotalBytes;live=new Map;static key(e,t){return`${e}/${t}`}get bytesHeld(){let e=0;for(let t of this.live.values())e+=t.bytesHeld;return e}get bytesReserved(){let e=0;for(let t of this.live.values())e+=t.bytesReserved;return e}get size(){return this.live.size}get(e,t){return this.live.get(n.key(e,t))}open(e,t){if(!Number.isInteger(e.n)||e.n<1||e.n>oe)return V("manifest-chunk-count",!0);let r=Number(e.bytes);if(!Number.isSafeInteger(r)||r<0||r>Se)return V("manifest-bytes",!0,"capacity");let i=n.key(e.h,e.g),s=this.live.get(i),o=s?.bytesReserved??0;if(this.bytesReserved-o+r>this.maxTotalBytes)return V("assembly-too-large",!0,"capacity");s?.reclaim(),this.live.delete(i);let a=new un(e,t);return this.live.set(i,a),a}reclaim(e,t){let r=n.key(e,t);this.live.get(r)?.reclaim(),this.live.delete(r)}reclaimHandle(e){for(let[t,r]of[...this.live])t.startsWith(`${e}/`)&&(r.reclaim(),this.live.delete(t))}sweep(e){let t=0;for(let[r,i]of[...this.live])i.expired(e)&&(i.reclaim(),this.live.delete(r),t+=1);return t}clear(){for(let e of this.live.values())e.reclaim();this.live.clear()}};function le(n,e){if(Object.is(n,e))return e;if(Array.isArray(e)){let t=e;if(!Array.isArray(n))return wr(t,void 0);let r=wr(t,n);return n.length===t.length&&bs(n,r)?n:r}if(Sr(e)){if(!Sr(n))return vr(e,void 0);let t=vr(e,n),r=Object.keys(e);return r.length===Object.keys(n).length&&r.every(i=>Or(n,i)&&Object.is(n[i],t[i]))?n:t}return e}function Rt(n,e){let t=Object.keys(e);if(t.length===0)return n;let r=!1,i={...n};for(let s of t){let o=xr(n,s),a=le(o,e[s]);Object.is(o,a)||(Object.defineProperty(i,s,{value:a,enumerable:!0,writable:!0,configurable:!0}),r=!0)}return r?Object.freeze(i):n}function Sr(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function bs(n,e){for(let t=0;t<e.length;t+=1)if(!Object.is(n[t],e[t]))return!1;return!0}function wr(n,e){let t=new Array(n.length);for(let r=0;r<n.length;r+=1)t[r]=le(e?.[r],n[r]);return Object.freeze(t)}function Or(n,e){return Object.prototype.hasOwnProperty.call(n,e)}function xr(n,e){if(n!==void 0)return Or(n,e)?n[e]:void 0}function vr(n,e){let t={};for(let r of Object.keys(n))Object.defineProperty(t,r,{value:le(xr(e,r),n[r]),enumerable:!0,writable:!1,configurable:!1});return Object.freeze(t)}var Ss=["__proto__","constructor","prototype"],ws=new Set(Ss);function ce(n,e,t="invalid-data"){return{ok:!1,code:t,reason:n,resync:e}}function kr(n,e,t){if(e.length>an)return ce("ops-too-many",!1,"capacity");for(let a of e){if(a.p.length>ln)return ce("path-too-deep",!1,"capacity");for(let d of a.p){if(U(d)>Ge)return ce("segment-too-long",!1,"capacity");if(ws.has(d))return ce("segment-forbidden",!1)}if(a.o==="x"&&a.p.length===0)return ce("root-remove",!1)}let r=n,i=new WeakSet;for(let a of e){if(a.p.length===0){a.o==="r"&&(r=a.val);continue}if(!Rr(r))return ce("parent-not-object",!0);let d=_r(r,i);r=d;let c=vs(d,a.p.slice(0,-1),i);if(c===Er)return ce("missing-parent",!0);if(c===Ar)return ce("parent-not-object",!0);let l=c,u=a.p[a.p.length-1];if(a.o==="x"){if(!Object.prototype.hasOwnProperty.call(l,u))return ce("missing-key",!0);delete l[u];continue}l[u]=a.val}let s;try{s=t(r)}catch{return ce("invalid-state",!0)}let o=le(n,s);return{ok:!0,next:o,changed:!Object.is(o,n)}}var Er=Symbol("missing-parent"),Ar=Symbol("parent-not-object");function vs(n,e,t){let r=n;for(let i of e){let s=r;if(!Object.prototype.hasOwnProperty.call(s,i))return Er;let o=s[i];if(!Rr(o))return Ar;let a=_r(o,t);s[i]=a,r=a}return r}function Rr(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function _r(n,e){if(e.has(n))return n;let t=Object.assign(Object.create(null),n);return e.add(t),t}var he=class{#e;#t=new Set;#s=new Set;#n;#r;#b=0;#l=null;#o=0;#u=!1;constructor(e){this.#e=e.definition,this.#n=le(void 0,this.#d(e.initialState)),this.#r=Object.freeze({phase:e.phase??"ready",stale:!1,error:null})}getState(){return this.#n}get revision(){return this.#b}get inTransaction(){return this.#l!==null&&this.#l.active}subscribe(e,t,r){let i=t===void 0?this.#y(e):this.#O(e,t,r);this.#t.add(i);let s=!0;return()=>{s&&(s=!1,this.#t.delete(i))}}getStatus(){return this.#r}subscribeStatus(e){this.#s.add(e);let t=!0;return()=>{t&&(t=!1,this.#s.delete(e))}}setStatus(e){let t=this.#r,r={phase:e.phase??t.phase,stale:e.stale??t.stale,error:e.error===void 0?t.error:e.error};if(!(r.phase===t.phase&&r.stale===t.stale&&Object.is(r.error,t.error))){this.#r=Object.freeze(r);for(let i of[...this.#s])this.#s.has(i)&&_t(()=>i(this.#r,t))}}transact(e,t){if(this.#a(),this.#l!==null)throw new h("action-rejected","a store transaction is already open on this store; handlers are synchronous and must not nest");let r={staged:this.#n,active:!0};this.#l=r;try{let i=e(this.#c(r,t));if(Os(i))throw new h("action-rejected","a store handler returned a thenable; handlers are synchronous so that a throw can discard the whole transaction");return this.#m(r.staged),i}finally{r.active=!1,this.#l=null}}applyOwnerUpdate(e){this.#a();let t=this.#l;if(t!==null&&t.active){t.staged=this.#f(t.staged,e);return}let r=this.#f(this.#n,e);this.#m(r)}applySnapshot(e){this.#a();let t=this.#l;if(t!==null&&t.active){t.staged=this.#d(e);return}this.#m(this.#d(e))}applyEntities(e,t){this.#a();let r=this.#e.entities?.[e];if(r===void 0||!Object.prototype.hasOwnProperty.call(this.#e.entities,e))throw new h("invalid-data",`store '${this.#e.id}' declares no per-entity parser for '${e}'; declare it in \`entities\` or write through setState`);let i=this.#l,s=i!==null&&i.active?i.staged:this.#n,o=s[e];if(o!==void 0&&!tn(o))throw new h("invalid-data",`store '${this.#e.id}': '${e}' is not an entity map in the current state`);let a=[];for(let p of Object.keys(t)){if(p.length===0)throw new h("invalid-data",`store '${this.#e.id}': an entity id in '${e}' is empty`);let f=t[p];if(f===void 0){a.push([p,void 0]);continue}try{a.push([p,this.runReadOnly(()=>r(f))])}catch(y){throw y instanceof h?y:new h("invalid-data",`entity '${e}.${p}' failed the '${this.#e.id}' entity validator: ${String(y)}`,{cause:y})}}if(i!==null&&i.active){let p={...o??{}};for(let[f,y]of a)y===void 0?delete p[f]:fn(p,f,y);i.staged=Rt(s,{[e]:p});return}let d=!1,c=[];for(let[p,f]of a){let y=o!==void 0&&Object.prototype.hasOwnProperty.call(o,p),O=y?o[p]:void 0;if(f===void 0){y&&(d=!0),c.push([p,void 0]);continue}let _=le(O,f);Object.is(O,_)||(d=!0),c.push([p,_])}if(!d)return;let l={...o??{}};for(let[p,f]of c)f===void 0?delete l[p]:fn(l,p,f);let u={...s};fn(u,e,Object.freeze(l)),this.#p(Object.freeze(u))}applyDelta(e){this.#a();let t=kr(this.#n,e,r=>this.#d(r));return t.ok&&t.changed&&this.#h(t.next),t}runReadOnly(e){this.#o+=1;try{return e()}finally{this.#o-=1}}close(){this.#u||(this.#u=!0,this.setStatus({phase:"closed",stale:!0}),this.#t.clear(),this.#s.clear())}#c(e,t){return{peer:t,getState:()=>(this.#w(e),e.staged),setState:r=>{if(this.#w(e),this.#o>0)throw new h("action-rejected","a read-only store callback may not write state; validators, authorize, project and update functions run with setters fenced");e.staged=this.#f(e.staged,r)}}}#f(e,t){let r=typeof t=="function"?this.runReadOnly(()=>t(e)):t;return Rt(e,r)}#m(e){this.#h(this.#d(e))}#h(e){let t=le(this.#n,e);Object.is(t,this.#n)||this.#p(t)}#p(e){let t=this.#n;this.#n=e,this.#b+=1;for(let r of[...this.#t])this.#t.has(r)&&r.notify(e,t)}#d(e){try{return this.runReadOnly(()=>this.#e.state(e))}catch(t){throw t instanceof h?t:new h("invalid-data",`state failed the '${this.#e.id}' validator: ${String(t)}`,{cause:t})}}#y(e){return{notify:(t,r)=>{_t(()=>e(t,r))}}}#O(e,t,r){let i=r?.equality??Object.is,s=this.runReadOnly(()=>e(this.#n));return r?.fireImmediately===!0&&_t(()=>t(s,s)),{notify:o=>{let a=this.runReadOnly(()=>e(o)),d=s;i(a,d)||(s=a,_t(()=>t(a,d)))}}}#w(e){if(!e.active)throw new h("action-rejected","this store transaction has already ended; its context cannot read or write from a later turn")}#a(){if(this.#u)throw new h("closed","this store handle is closed")}};function Os(n){return n===null||typeof n!="object"&&typeof n!="function"?!1:typeof n.then=="function"}function _t(n){try{n()}catch(e){console.error("[@net-mesh/browser] store listener threw",e)}}function fn(n,e,t){Object.defineProperty(n,e,{value:t,enumerable:!0,writable:!0,configurable:!0})}var xs=32,ks=64*1024,Es=6e4,As=2048,Rs=(1n<<64n)-1n,_s="";function Pr(n,e){return`${n}${_s}${hn(e)}`}function hn(n){if(n===null||typeof n=="boolean")return String(n);if(typeof n=="number"){if(!Number.isFinite(n))throw new h("invalid-data","a canonical request cannot contain a non-finite number");return String(n)}if(typeof n=="string")return JSON.stringify(n);if(Array.isArray(n))return`[${n.map(i=>hn(i)).join(",")}]`;let e=n;return`{${Object.keys(e).sort().map(i=>`${JSON.stringify(i)}:${hn(e[i])}`).join(",")}}`}function Ps(n){return new TextEncoder().encode(n).byteLength}function mn(n){return Ps(n)>As}function jr(n){if(mn(n))throw new h("invalid-data","this canonical form needs the digest path");return{form:"inline",value:n}}async function Ir(n){let e=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(n)),t=new Uint8Array(e),r="";for(let i of t)r+=i.toString(16).padStart(2,"0");return{form:"digest",value:r}}function js(n,e){return n.form===e.form&&n.value===e.value}var yn=class{constructor(e=xs,t=ks,r=Es){this.maxEntries=e;this.maxBytes=t;this.maxAgeMs=r}maxEntries;maxBytes;maxAgeMs;#e=0n;#t=new Map;#s=0;get floor(){return this.#e.toString()}get size(){return this.#t.size}get bytesHeld(){return this.#s}disposition(e,t,r){if(this.expire(r),e>=Rs)return{kind:"exhausted"};let i=this.#t.get(e.toString());return i!==void 0?js(i.binding,t)?{kind:"replay",outcome:i.outcome}:{kind:"conflict"}:e<=this.#e?{kind:"expired"}:{kind:"execute"}}retain(e,t,r,i){let s=Is(t,r);this.#t.set(e.toString(),{s:e,binding:t,outcome:r,bytes:s,at:i}),this.#s+=s,this.evict(i)}expire(e){for(let t of this.ordered()){if(e-t.at<this.maxAgeMs)break;this.drop(t)}}evict(e){for(this.expire(e);this.#t.size>this.maxEntries||this.#s>this.maxBytes;){let t=this.ordered()[0];if(t===void 0)return;this.drop(t)}}drop(e){this.#t.delete(e.s.toString()),this.#s-=e.bytes,e.s>this.#e&&(this.#e=e.s)}ordered(){return[...this.#t.values()].sort((e,t)=>e.s<t.s?-1:e.s>t.s?1:0)}};function Is(n,e){let t=e.kind==="result"?JSON.stringify(e.out):e.code;return U(n.value)+U(t)}var gn=class{#e=new Map;#t=0;get dropped(){return this.#t}admit(e,t){let r=this.#e.get(e);return r!==void 0&&t<=r?(this.#t+=1,!1):(this.#e.set(e,t),!0)}latest(e){let t=this.#e.get(e);return t===void 0?null:t.toString()}},Pt=class{#e=new Map;#t=new Map;ledger(e){let t=this.#e.get(e);return t===void 0&&(t=new yn,this.#e.set(e,t)),t}inputs(e){let t=this.#t.get(e);return t===void 0&&(t=new gn,this.#t.set(e,t)),t}forget(e){this.#e.delete(e),this.#t.delete(e)}get size(){return this.#e.size}};var Cs=32,Hs=256,Cr=6e4,Tr=256;function ye(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}var Ls="0".repeat(16),Ts="0".repeat(32),jt=class{constructor(e){this.deps=e;if(this.chunkBytes=gr(e.maxEventBytes),this.incarnation=e.newIncarnation(),this.incarnation.length!==on)throw new h("invalid-data","newIncarnation must return 16 lowercase hex");let t=(typeof e.project=="function"?1:0)+(typeof e.projectFor=="function"?1:0),r=e.definition.visibility;if(t>1||t===0&&r===void 0)throw new h("invalid-data","a host needs one of `project` and `projectFor`, or a definition that declares `visibility`");this.visibility=r===void 0?null:Le(r),this.perPlayer=typeof e.projectFor=="function"||this.visibility?.perPlayer===!0,this.core=new he({definition:e.definition,initialState:e.definition.empty()})}deps;handles=new Map;counters={};chunkBytes;incarnation;core;pending=0;ledgers=new Pt;deferred=new Map;revisionBeforeCommit=0;perPlayer;visibility;warned=new Set;warnOnce(e){if(!(this.deps.warn===void 0||this.warned.has(e))){this.warned.add(e);try{this.deps.warn(e)}catch{}}}viewKey(e,t){return this.perPlayer?JSON.stringify([e,t]):JSON.stringify(t)}get sparseViews(){return this.sparseViewCount}sparseViewCount=0;snapshotCounters(){return{...this.counters}}get handleCount(){return this.handles.size}handle(e){return this.handles.get(e)}commit(e){let t=this.core.inTransaction,r=this.core.getState();if(t||(this.revisionBeforeCommit=this.core.revision),this.core.applySnapshot(e),t)return this.accept([]);let i=this.core.getState();return Object.is(r,i)?this.accept([]):this.accept(this.propagate(r,i))}commitEntities(e,t){let r=this.core.inTransaction,i=this.core.getState();if(r||(this.revisionBeforeCommit=this.core.revision),this.core.applyEntities(e,t),r)return this.accept([]);let s=this.core.getState();return Object.is(i,s)?this.accept([]):this.accept(this.propagate(i,s))}propagate(e,t){let r=[],i=String(this.core.revision),s=new Map,o=new Map,a;for(let d of[...this.handles.values()]){if(this.deferred.has(d.h))continue;if(!this.permitsRead(d.peer,d.audience)){this.forget(d.h,"refused"),r.push(this.no(d.peer,d.h,"closed",null));continue}let c=this.viewKey(d.peer,d.audience),l;if(this.interestFns.length>0&&d.interest!==null){let f=s.get(c);if(f===void 0){if(a===void 0&&(a=this.entityDelta(e,t)),f=a===null?void 0:this.sparseInterestDiff(d.peer,d.audience,a),f===void 0){let y=this.project(d.peer,d.audience,e),O=this.project(d.peer,d.audience,t);f=y===null||O===null?null:this.interestDiff(y,O)}else this.sparseViewCount+=1;s.set(c,f)}l=f===null?null:this.interestOps(f,d.interest)}else if(l=o.get(c),l===void 0){let f=this.project(d.peer,d.audience,e),y=this.project(d.peer,d.audience,t);l=f===null||y===null?null:Hr(f,y),o.set(c,l)}if(l===null){this.forget(d.h),r.push(this.no(d.peer,d.h,"closed",null));continue}if(l.length===0)continue;let u=Lr({k:"delta",h:d.h,g:String(d.generation),base:String(d.revision),r:i,ops:l},this.deps.maxEventBytes);if(u!==null){r.push({peer:d.peer,h:d.h,frame:u}),this.handles.set(d.h,{...d,revision:this.core.revision});continue}let p=this.install(d,null);if(p===null){this.forget(d.h),r.push(this.no(d.peer,d.h,"closed",null));continue}r.push(...p)}return r}getState(){return this.core.getState()}subscribe(e){return this.core.subscribe((t,r)=>{e(t,r)})}get currentRevision(){return this.core.revision}localRead(e,t){return this.permitsRead(e,t)}localView(e,t,r=null){let i=this.project(e,t);return i===null?null:this.filterInterest(i,r)}localAct(e,t,r){if(!Object.prototype.hasOwnProperty.call(this.deps.definition.actions,e))return{outcome:{kind:"refusal",code:"invalid-data"},dispatched:this.refuse("local-act-unknown-name")};if(!this.permitsAction(r,e,t))return{outcome:{kind:"refusal",code:"forbidden"},dispatched:this.refuse("local-act-forbidden")};let i=this.deps.definition.actions[e],s=this.core.getState();this.revisionBeforeCommit=this.core.revision;let o;try{let c=this.deps.actions[e];o={kind:"result",out:this.core.transact(u=>{let p=i.output(c(i.input(t),u)),f=R({k:"res",q:Ls,h:Ts,s:"1",out:p});if(U(f)>this.deps.maxEventBytes)throw new h("capacity","the result does not fit the message budget");return p},r)}}catch(c){o={kind:"refusal",code:c instanceof h&&c.code==="capacity"?"capacity":"action-rejected"}}let a=this.core.getState(),d=Object.is(s,a)?[]:this.propagate(s,a);return{outcome:o,dispatched:o.kind==="refusal"?this.refuse(`local-act-${o.code}`,d):this.accept(d)}}localInput(e,t,r){if(!Object.prototype.hasOwnProperty.call(this.deps.definition.inputs,e))return this.refuse("local-in-unknown-name");if(!this.permitsInput(r,e,t))return this.refuse("local-in-forbidden");let i=this.core.getState();this.revisionBeforeCommit=this.core.revision;try{this.core.transact(o=>{let a=this.deps.definition.inputs[e],d=this.deps.inputs[e];d(a(t),o)},r)}catch{return this.refuse("local-in-rejected")}let s=this.core.getState();return this.accept(Object.is(i,s)?[]:this.propagate(i,s))}receive(e,t,r=this.deps.now()){let i=Me(e,{maxBytes:this.deps.maxEventBytes,as:"owner"});if(!i.ok)return this.refuse(i.reason,[]);let s=i.message;if(s.k==="join")return this.join(s,t,r);let o=this.bind(s.h,t,r);if(typeof o=="string")return this.refuse(o,[this.no(t,s.h,"closed",qs(s))]);switch(s.k){case"alive":return this.handles.set(o.h,{...o,lastSeen:r}),this.accept([{peer:t,h:o.h,frame:R({k:"ok",q:s.q,h:o.h})}]);case"leave":return this.forget(o.h,"left"),this.accept([{peer:t,h:o.h,frame:R({k:"ok",q:s.q,h:o.h})}]);case"int":return this.interestChange(s,o,t,r);case"act":return this.action(s,o,t,r);case"in":return this.input(s,o,t,r);case"resync":{if(!this.permitsRead(t,o.audience))return this.refuse("resync-forbidden",[this.no(t,o.h,"forbidden",s.q)]);let a={...o,lastSeen:r};this.handles.set(o.h,a);let d=this.install(a,s.q);return d===null?(this.forget(o.h),this.refuse("resync-projection-capacity",[this.no(t,o.h,"capacity",s.q)])):this.accept(d)}case"aud":case"resume":{if(!this.permitsRead(t,s.aud))return this.refuse(`${s.k}-forbidden`,[this.no(t,o.h,"forbidden",s.q)]);let a={...o,audience:[...s.aud],interest:s.k==="resume"&&s.int!==void 0?[...s.int]:o.interest,lastSeen:r};if(this.handles.set(a.h,a),!this.deps.canProject())return this.deferred.set(a.h,{q:s.q,peer:t}),this.accept([]);let d=this.install(a,s.q);return d===null?(this.forget(a.h),this.refuse(`${s.k}-projection-capacity`,[this.no(t,a.h,"capacity",s.q)])):this.accept(d)}default:return this.refuse("unreachable-kind")}}action(e,t,r,i){let s=e.name;if(!Object.prototype.hasOwnProperty.call(this.deps.definition.actions,s))return this.refuse("act-unknown-name",[this.no(r,t.h,"invalid-data",e.q)]);let o;try{o=Pr(s,e.in)}catch{return this.refuse("act-uncanonical",[this.no(r,t.h,"invalid-data",e.q)])}if(!mn(o))return this.decide(e,t,r,i,jr(o));if(this.pending>=Cs)return this.refuse("act-pending-bound",[this.no(r,t.h,"capacity",e.q)]);this.pending+=1;let a=Ir(o).then(d=>{let c=this.deps.now(),l=this.bind(e.h,r,c);return typeof l=="string"?this.refuse(l,[this.no(r,e.h,"closed",e.q)]):this.decide(e,l,r,c,d)}).catch(()=>this.refuse("act-digest-failed",[this.no(r,e.h,"indeterminate",e.q)])).finally(()=>{this.pending-=1});return{out:[],refused:null,deferred:a}}decide(e,t,r,i,s){let o=this.ledgers.ledger(t.h),a=ae(e.s),d=o.disposition(a,s,i);switch(d.kind){case"exhausted":return this.refuse("act-sequence-exhausted",[this.no(r,t.h,"capacity",e.q)]);case"conflict":return this.refuse("act-binding-mismatch",[this.no(r,t.h,"invalid-data",e.q)]);case"expired":return this.refuse("act-result-expired",[this.no(r,t.h,"result-expired",e.q)]);case"replay":return this.permitsAction(r,e.name,e.in)?(this.renew(t,i),this.accept([this.reply(t,r,e.q,a,d.outcome)])):this.refuse("act-forbidden-replay",[this.no(r,t.h,"forbidden",e.q)]);case"execute":break}if(!this.permitsAction(r,e.name,e.in))return o.retain(a,s,{kind:"refusal",code:"forbidden"},i),this.renew(t,i),this.refuse("act-forbidden",[this.no(r,t.h,"forbidden",e.q)]);let c=this.deps.definition.actions[e.name],l=this.core.getState();this.revisionBeforeCommit=this.core.revision;let u;try{let y=this.deps.actions[e.name];u={kind:"result",out:this.core.transact(_=>{let P=c.input(e.in),M=c.output(y(P,_)),H=R({k:"res",q:e.q,h:t.h,s:e.s,out:M});if(U(H)>this.deps.maxEventBytes)throw new h("capacity","the result does not fit the message budget");return M},r)}}catch(y){u={kind:"refusal",code:y instanceof h&&y.code==="capacity"?"capacity":"action-rejected"}}o.retain(a,s,u,i),this.renew(t,i);let p=this.core.getState(),f=Object.is(l,p)?[]:this.propagate(l,p);return this.accept([this.reply(t,r,e.q,a,u),...f])}input(e,t,r,i){let s=e.name;if(!Object.prototype.hasOwnProperty.call(this.deps.definition.inputs,s))return this.refuse("in-unknown-name");if(!this.ledgers.inputs(t.h).admit(s,ae(e.s)))return this.refuse("in-stale-sequence");if(!this.permitsInput(r,s,e.in))return this.refuse("in-forbidden");let o=this.core.getState();this.revisionBeforeCommit=this.core.revision;try{this.core.transact(d=>{let c=this.deps.definition.inputs[s],l=this.deps.inputs[s];l(c(e.in),d)},r)}catch{return this.refuse("in-rejected")}this.renew(t,i);let a=this.core.getState();return this.accept(Object.is(o,a)?[]:this.propagate(o,a))}reply(e,t,r,i,s){let o=s.kind==="result"?R({k:"res",q:r,h:e.h,s:i.toString(),out:s.out}):R({k:"no",q:r,h:e.h,code:s.code,s:i.toString()});return{peer:t,h:e.h,frame:o}}permitsAction(e,t,r){let i={type:"action",peer:e,name:t,input:r};try{return this.deps.authorize(i)===!0}catch{return!1}}permitsInput(e,t,r){let i={type:"input",peer:e,name:t,input:r};try{return this.deps.authorize(i)===!0}catch{return!1}}renew(e,t){let r=this.handles.get(e.h);r!==void 0&&this.handles.set(e.h,{...r,lastSeen:t})}forget(e,t="dropped"){let r=this.handles.get(e);this.handles.delete(e),this.ledgers.forget(e),this.deferred.delete(e),r!==void 0&&(this.presenceChanged(r.peer,t),this.membershipChanged())}present=new Set;localPlayers=new Set;pendingEvents=[];areas=new Map;areasAt=-1;ending=!1;get wantsEvents(){return this.deps.onEvent!==void 0||this.deps.areaOf!==void 0}isPresent(e){if(this.localPlayers.has(e))return!0;for(let t of this.handles.values())if(t.peer===e)return!0;return!1}presenceChanged(e,t,r=[]){if(!this.wantsEvents||this.ending)return;let i=this.isPresent(e),s=this.present.has(e);i!==s&&(i?(this.present.add(e),this.pendingEvents.push(Object.freeze({type:"join",peer:e,audience:Object.freeze([...r])}))):(this.present.delete(e),this.areas.delete(e),this.pendingEvents.push(Object.freeze({type:"leave",peer:e,reason:t??"dropped"}))))}localPresence(e,t,r=[],i="left"){t?this.localPlayers.add(e):this.localPlayers.delete(e),this.presenceChanged(e,t?null:i,r)}detectAreas(){let e=this.deps.areaOf;if(e===void 0||this.ending||this.areasAt===this.core.revision&&[...this.present].every(r=>this.areas.has(r)))return;this.areasAt=this.core.revision;let t=this.core.getState();for(let r of this.present){let i;try{let a=this.core.runReadOnly(()=>e(t,r));i=typeof a=="string"?a:null}catch{i=null}let s=this.areas.has(r),o=s?this.areas.get(r)??null:null;this.areas.set(r,i),(s?o!==i:i!==null)&&this.pendingEvents.push(Object.freeze({type:"area",peer:r,from:o,to:i}))}}drainEvents(){let e=[];if(!this.wantsEvents)return this.accept(e);for(let t=0;;t+=1){this.pendingEvents.length===0&&this.detectAreas();let r=this.pendingEvents.shift();if(r===void 0)break;if(t>=Tr){this.pendingEvents.length=0,this.counters["event-rounds-bound"]=(this.counters["event-rounds-bound"]??0)+1;break}let i=this.deps.onEvent;if(i===void 0)continue;let s=this.core.getState();this.revisionBeforeCommit=this.core.revision;try{this.core.transact(a=>i(r,a),r.peer)}catch{this.counters["event-rejected"]=(this.counters["event-rejected"]??0)+1;continue}let o=this.core.getState();Object.is(s,o)||e.push(...this.propagate(s,o))}return this.accept(e)}membership=new Set;membershipChanged(){for(let e of[...this.membership])try{e()}catch{}}onMembership(e){return this.membership.add(e),()=>{this.membership.delete(e)}}peers(){return[...new Set([...this.handles.values()].map(e=>e.peer))]}reauthorize(){let e=[];for(let t of[...this.handles.values()])this.permitsRead(t.peer,t.audience)||(this.forget(t.h,"refused"),e.push(this.no(t.peer,t.h,"closed",null)));return this.accept(e)}resumeDeferred(e=this.deps.now()){if(!this.deps.canProject())return this.accept([]);let t=[];for(let[r,i]of[...this.deferred]){this.deferred.delete(r);let s=this.bind(r,i.peer,e);if(typeof s=="string"){this.counters[`deferred-${s}`]=(this.counters[`deferred-${s}`]??0)+1;continue}let o=this.install(s,i.q);if(o===null){this.forget(r),t.push(this.no(i.peer,r,"capacity",i.q));continue}t.push(...o)}return this.accept(t)}get deferredCount(){return this.deferred.size}get ledgerCount(){return this.ledgers.size}accept(e,t=null){return{out:e,refused:null,deferred:t}}sweep(e){let t=[];for(let[r,i]of[...this.handles])e-i.lastSeen>=Cr&&(this.forget(r,"expired"),t.push({h:r,peer:i.peer}));return t}farewell(){this.ending=!0,this.pendingEvents.length=0;let e=[];for(let[t,r]of[...this.handles])this.forget(t),e.push(this.no(r.peer,t,"owner-lost",null));return e}get incarnationHex(){return this.incarnation}join(e,t,r){if(e.store!==this.deps.store)return this.refuse("join-other-store",[]);if(e.def!==this.deps.definition.id)return this.refuse("join-wrong-definition",[this.no(t,null,"version-mismatch",e.q)]);if(e.ver!==this.deps.definition.version)return this.refuse("join-wrong-version",[this.no(t,null,"version-mismatch",e.q)]);if(this.handles.size>=Hs)return this.refuse("join-capacity",[this.no(t,null,"capacity",e.q)]);if(!this.permitsRead(t,e.aud))return this.refuse("join-forbidden",[this.no(t,null,"forbidden",e.q)]);let i=this.newHandle();if(i===null||i.length!==G||this.handles.has(i))return this.refuse("join-handle-unusable",[this.no(t,null,"owner-lost",e.q)]);let s={h:i,inc:this.incarnation,peer:t,audience:[...e.aud],interest:e.int===void 0?null:[...e.int],generation:0,revision:this.core.revision,lastSeen:r};this.handles.set(i,s);let o=this.install(s,e.q);return o===null?(this.forget(i),this.refuse("join-projection-capacity",[this.no(t,null,"capacity",e.q)])):(this.presenceChanged(t,null,e.aud),this.membershipChanged(),this.accept(o))}install(e,t){let r=this.project(e.peer,e.audience),i=r===null?null:this.filterInterest(r,e.interest);if(i===null)return null;let s;try{s=mr(i,this.chunkBytes)}catch{return null}let o=e.generation+1;this.handles.set(e.h,{...e,generation:o,revision:this.core.revision});let a=String(o),d=String(this.core.revision),c=[{peer:e.peer,h:e.h,frame:R(t===null?{k:"man",h:e.h,inc:e.inc,g:a,r:d,n:s.n,bytes:String(s.bytes)}:{k:"man",q:t,h:e.h,inc:e.inc,g:a,r:d,n:s.n,bytes:String(s.bytes)})}];for(let l=0;l<s.n;l+=1)c.push({peer:e.peer,h:e.h,frame:R({k:"snap",h:e.h,g:a,r:d,i:l,n:s.n,d:s.pieces[l]})});return c}permitsRead(e,t){let r={type:"read",peer:e,audience:[...t]};try{return this.deps.authorize(r)===!0}catch{return!1}}newHandle(){try{return this.deps.newHandle()}catch{return null}}get interestFns(){return this.#e??=Object.entries(this.deps.definition.interest??{}).map(([e,t])=>[e,t]),this.#e}#e;interestKey(e,t,r){try{let i=this.core.runReadOnly(()=>e(t,r));return typeof i=="string"?i:null}catch{return null}}filterInterest(e,t){if(t===null||this.interestFns.length===0)return e;let r=new Set(t),i={...e};for(let[s,o]of this.interestFns){let a=i[s];if(!ye(a))continue;let d={};for(let[c,l]of Object.entries(a)){let u=this.interestKey(o,l,c);(u===null||r.has(u))&&(d[c]=l)}i[s]=d}return i}entityDelta(e,t){if(this.deps.project!==void 0||this.deps.projectFor!==void 0)return null;let r=this.deps.definition.entities;if(r===void 0)return null;let i=new Set(this.interestFns.map(([d])=>d)),s=e,o=t,a=[];for(let d of new Set([...Object.keys(s),...Object.keys(o)])){let c=Object.prototype.hasOwnProperty.call(s,d)?s[d]:void 0,l=Object.prototype.hasOwnProperty.call(o,d)?o[d]:void 0;if(Object.is(c,l))continue;if(!i.has(d)||!Object.prototype.hasOwnProperty.call(r,d)||!ye(c)||!ye(l))return null;let u=[];for(let p of new Set([...Object.keys(c),...Object.keys(l)])){let f=Object.prototype.hasOwnProperty.call(c,p)?c[p]:void 0,y=Object.prototype.hasOwnProperty.call(l,p)?l[p]:void 0;Object.is(f,y)||u.push(p)}a.push({collection:d,ids:u,before:c,after:l})}return{collections:a}}sparseInterestDiff(e,t,r){let i=Object.freeze({peer:e,audience:Object.freeze([...t])}),s=(f,y,O)=>{Object.defineProperty(f,y,{value:O,enumerable:!0,writable:!0,configurable:!0})},o={},a={};for(let{collection:f,ids:y,before:O,after:_}of r.collections){let P={},M={};for(let H of y)Object.prototype.hasOwnProperty.call(O,H)&&s(P,H,O[H]),Object.prototype.hasOwnProperty.call(_,H)&&s(M,H,_[H]);s(o,f,P),s(a,f,M)}let d=this.visibility===null?o:Te(this.visibility,o,i),c=this.visibility===null?a:Te(this.visibility,a,i),l=new Map(this.interestFns),u=this.deps.definition.entities,p=[];for(let{collection:f,ids:y}of r.collections){let O=d[f],_=c[f];if(!ye(O)||!ye(_))return;let P=u[f],M=l.get(f),H=(k,E)=>{if(k===void 0||!E)return{ok:!0,value:k};try{return{ok:!0,value:this.core.runReadOnly(()=>P(k))}}catch{return{ok:!1,value:void 0}}};for(let k of y){let E=H(Object.prototype.hasOwnProperty.call(O,k)?O[k]:void 0,d!==o),j=H(Object.prototype.hasOwnProperty.call(_,k)?_[k]:void 0,c!==a);if(!E.ok||!j.ok)return;Object.is(E.value,j.value)||E.value!==void 0&&j.value!==void 0&&JSON.stringify(E.value)===JSON.stringify(j.value)||p.push({collection:f,id:k,before:E.value,after:j.value,beforeKey:E.value===void 0?null:this.interestKey(M,E.value,k),afterKey:j.value===void 0?null:this.interestKey(M,j.value,k)})}}return{rest:[],entities:p,whole:[]}}interestDiff(e,t){let r=new Set(this.interestFns.map(([d])=>d)),i=d=>{let c={};for(let[l,u]of Object.entries(d))r.has(l)||(c[l]=u);return c},s=Hr(i(e),i(t)),o=[],a=[];for(let[d,c]of this.interestFns){let l=e[d],u=t[d];if(!ye(l)||!ye(u)){JSON.stringify(l)!==JSON.stringify(u)&&a.push({collection:d,after:u});continue}for(let p of new Set([...Object.keys(l),...Object.keys(u)])){let f=Object.prototype.hasOwnProperty.call(l,p)?l[p]:void 0,y=Object.prototype.hasOwnProperty.call(u,p)?u[p]:void 0;Object.is(f,y)||f!==void 0&&y!==void 0&&JSON.stringify(f)===JSON.stringify(y)||o.push({collection:d,id:p,before:f,after:y,beforeKey:f===void 0?null:this.interestKey(c,f,p),afterKey:y===void 0?null:this.interestKey(c,y,p)})}}return{rest:s,entities:o,whole:a}}interestOps(e,t){let r=new Set(t),i=o=>o===null||r.has(o),s=[...e.rest];for(let o of e.entities){let a=o.before!==void 0&&i(o.beforeKey);o.after!==void 0&&i(o.afterKey)?s.push({o:"r",p:[o.collection,o.id],val:o.after}):a&&s.push({o:"x",p:[o.collection,o.id]})}for(let o of e.whole){let a=this.filterInterest({[o.collection]:o.after},t);s.push({o:"r",p:[o.collection],val:a[o.collection]})}return s}interestChange(e,t,r,i){let s={...t,interest:[...e.int],lastSeen:i};this.handles.set(s.h,s);let o={peer:r,h:t.h,frame:R({k:"ok",q:e.q,h:t.h})};if(this.interestFns.length===0||this.deferred.has(t.h))return this.accept([o]);let a=this.project(r,t.audience);if(a===null)return this.forget(t.h),this.refuse("int-projection-capacity",[this.no(r,t.h,"capacity",e.q)]);let d=this.filterInterest(a,t.interest),c=this.filterInterest(a,s.interest),l=[];for(let[y]of this.interestFns){let O=d[y],_=c[y];if(!(!ye(O)||!ye(_))){for(let P of Object.keys(_))Object.prototype.hasOwnProperty.call(O,P)||l.push({o:"r",p:[y,P],val:_[P]});for(let P of Object.keys(O))Object.prototype.hasOwnProperty.call(_,P)||l.push({o:"x",p:[y,P]})}}if(l.length===0)return this.accept([o]);let u=String(this.core.revision),p=t.revision===this.core.revision?Lr({k:"delta",h:t.h,g:String(t.generation),base:u,r:u,ops:l},this.deps.maxEventBytes):null;if(p!==null)return this.accept([{peer:r,h:t.h,frame:p},o]);let f=this.install(s,null);return f===null?(this.forget(t.h),this.refuse("int-projection-capacity",[this.no(r,t.h,"capacity",e.q)])):this.accept([...f,o])}project(e,t,r=this.core.getState()){try{let i=Object.freeze({peer:e,audience:Object.freeze([...t])}),s=this.deps.projectFor!==void 0?this.deps.projectFor(r,i):this.deps.project!==void 0?this.deps.project(r,t):r;this.visibility===null&&s===r&&this.warnOnce(`store '${this.deps.definition.id}': every player receives the full state. Declare \`visibility: 'open'\` on the definition if that is intended, or rules for what is secret.`);let o=this.visibility===null?s:Te(this.visibility,s,i);if(o===r)return r;try{return this.deps.definition.state(o)}catch(a){throw this.warnOnce(`store '${this.deps.definition.id}': a projection failed the state validator, so the player got empty() \u2014 ${a instanceof Error?a.message:String(a)}`+(this.visibility===null?"":" (a hidden field is the HIDDEN marker: wrap its parser with hiddenOr)")),a}}catch{try{return this.deps.definition.empty()}catch{return null}}}bind(e,t,r){let i=this.handles.get(e);return i===void 0?"handle-unknown":r-i.lastSeen>=Cr?(this.forget(e,"expired"),"handle-expired"):i.peer!==t?"handle-foreign-peer":i}no(e,t,r,i){return{peer:e,h:t,frame:R(i===null?{k:"no",h:t,code:r}:t===null?{k:"no",q:i,code:r}:{k:"no",q:i,h:t,code:r})}}refuse(e,t=[]){return this.counters[e]=(this.counters[e]??0)+1,{out:t,refused:e,deferred:null}}};function Hr(n,e){let t=[];for(let r of Object.keys(e)){let i=e[r];if(Object.prototype.hasOwnProperty.call(n,r)&&Object.is(n[r],i))continue;let s=Object.prototype.hasOwnProperty.call(n,r)?n[r]:void 0,o=s===void 0?null:Ms(r,s,i);if(o!==null){t.push(...o);continue}s!==void 0&&JSON.stringify(s)===JSON.stringify(i)||t.push({o:"r",p:[r],val:i})}for(let r of Object.keys(n))Object.prototype.hasOwnProperty.call(e,r)||t.push({o:"x",p:[r]});return t}var Ds=128;function Ms(n,e,t){let r=a=>typeof a=="object"&&a!==null&&!Array.isArray(a);if(!r(e)||!r(t))return null;let i=[],s=Math.min(Ds,Math.max(1,Math.floor(Object.keys(t).length/2))),o=a=>U(a)<=Ge&&!["__proto__","constructor","prototype"].includes(a);for(let a of Object.keys(t)){let d=t[a];if(!(Object.prototype.hasOwnProperty.call(e,a)&&(Object.is(e[a],d)||JSON.stringify(e[a])===JSON.stringify(d)))&&(!o(a)||(i.push({o:"r",p:[n,a],val:d}),i.length>s)))return null}for(let a of Object.keys(e))if(!Object.prototype.hasOwnProperty.call(t,a)&&(!o(a)||(i.push({o:"x",p:[n,a]}),i.length>s)))return null;return i}function Lr(n,e){let t;try{t=R(n)}catch{return null}return U(t)<=e?t:null}function qs(n){return"q"in n&&typeof n.q=="string"?n.q:null}var Nr=5e3,Dr=500;function $e(n){let e=/^\d+$/.test(n),t=/^(0x)?[0-9a-f]{1,16}$/i.test(n);try{if(e)return BigInt(n).toString(16).padStart(16,"0");if(t)return BigInt(n.startsWith("0x")?n:`0x${n}`).toString(16).padStart(16,"0")}catch{return null}return null}function Sn(n,e){let t=$e(n),r=$e(e);return t!==null&&t===r}var bn=new WeakMap,It=new WeakMap;function Ns(n){try{let e=JSON.parse(n);return e!==null&&typeof e=="object"&&e.k!=="join"&&typeof e.h=="string"?e.h:null}catch{return null}}var Wr=new WeakMap;function Ct(n){return Wr.get(n)}function Mr(n){let e=new Uint8Array(n);crypto.getRandomValues(e);let t="";for(let r of e)t+=r.toString(16).padStart(2,"0");return t}var qr=new TextEncoder,Ws=new TextDecoder;function wn(n){let e=n.streamId??`store/${n.definition.id}`,t=n.store??n.definition.id,r=bn.get(n.transport)??new Set;if(r.has(t))throw new h("invalid-data",`a store named ${t} is already hosted on this transport: name each store of one definition, or a join for that name is ambiguous`);r.add(t),bn.set(n.transport,r);let i=new jt({definition:n.definition,store:t,authorize:n.authorize,project:n.project,projectFor:n.projectFor,onEvent:n.onEvent,areaOf:n.areaOf,warn:n.dev===!0?w=>console.warn(`[@net-mesh/browser] ${w}`):typeof n.dev=="function"?n.dev:void 0,actions:n.actions,inputs:n.inputs,maxEventBytes:n.maxEventBytes,now:n.now??(()=>Date.now()),newHandle:n.newHandle??(()=>Mr(16)),newIncarnation:n.newIncarnation??(()=>Mr(8)),canProject:n.canProject??(()=>!0)});if(n.definition.visibility!==void 0){let w=Te(Le(n.definition.visibility),n.initialState,null);try{n.definition.state(w)}catch(A){throw new h("invalid-data",`store '${n.definition.id}': the state validator rejects a view with secrets hidden \u2014 wrap each field a rule hides with hiddenOr(\u2026): ${A instanceof Error?A.message:String(A)}`,{cause:A})}}i.commit(n.initialState);let s=new Map,o=null,a=new Map,d={},c=!1,l=null;async function u(w){let A=s.get(w);if(A!==void 0)return A;let I=a.get(w);if(I!==void 0)return I;let F=Promise.resolve(n.transport.openStream({reliability:"reliable",peer:w,label:e})).then(g=>{if(a.delete(w),c){try{g.close()}catch{}throw new h("closed","the store closed while its stream was opening")}return s.set(w,g),g}).catch(g=>{throw a.delete(w),g});return a.set(w,F),F}async function p(w){for(let A of w){if(c)return;let I=qr.encode(A.frame),q=await u(A.peer);try{await q.send(I)}catch(F){if(c)return;if(!Ot(F))throw F;if(s.get(A.peer)===q){s.delete(A.peer),a.delete(A.peer),d["reopened-stream"]=(d["reopened-stream"]??0)+1;try{q.close()}catch{}}await(await u(A.peer)).send(I)}}}function f(w){w.catch(()=>{d["send-failed"]=(d["send-failed"]??0)+1})}function y(w){f(p(w.out)),w.deferred!==null&&f(w.deferred.then(A=>y(A))),_()}let O=!1;function _(){if(!(O||c)){O=!0;try{let w=i.drainEvents();w.out.length>0&&f(p(w.out))}finally{O=!1}}}let P=It.get(n.transport)??new Set;P.add(i),It.set(n.transport,P);let M=n.transport.onEvent(w=>{if(w.type!=="stream_data")return;let A=w.peerNode;if(typeof A!="string"||A.length===0){d["no-authenticated-peer"]=(d["no-authenticated-peer"]??0)+1;return}let I=w.payload;if(I===void 0){d["no-payload"]=(d["no-payload"]??0)+1;return}let q=w.streamId;if(o!==null&&q!==void 0&&q!==o){d["foreign-stream"]=(d["foreign-stream"]??0)+1;return}let F;try{F=Ws.decode(I)}catch{d["undecodable-frame"]=(d["undecodable-frame"]??0)+1;return}let g=$e(A);if(g===null){d["unusable-peer"]=(d["unusable-peer"]??0)+1;return}let m=It.get(n.transport);if(m!==void 0&&m.size>1){let x=Ns(F);if(x!==null&&i.handle(x)===void 0){let C=!1;for(let W of m)W!==i&&W.handle(x)!==void 0&&(C=!0);if(C||m.values().next().value!==i){d["sibling-handle"]=(d["sibling-handle"]??0)+1;return}}}let b=i.receive(F,g);q!==void 0&&o===null&&b.refused===null&&(o=q),y(b)}),H=n.schedule??((w,A)=>{let I=setInterval(w,A);return()=>{clearInterval(I)}}),k=H(()=>{if(c)return;let w=(n.now??(()=>Date.now()))(),A=i.sweep(w);A.length>0&&f(p(A.filter(I=>s.has(I.peer)).map(I=>({peer:I.peer,h:I.h,frame:R({k:"no",h:I.h,code:"closed"})})))),y(i.resumeDeferred(w))},Nr);async function E(){c=!0,k(),M();let w=i.farewell();await Promise.all(w.map(async A=>{let I=s.get(A.peer);if(I===void 0){d["farewell-unreachable"]=(d["farewell-unreachable"]??0)+1;return}try{await j(Promise.resolve(I.send(qr.encode(A.frame))))}catch{d["farewell-failed"]=(d["farewell-failed"]??0)+1}}));for(let A of s.values())try{A.close()}catch{d["stream-close-failed"]=(d["stream-close-failed"]??0)+1}s.clear(),a.clear(),bn.get(n.transport)?.delete(t),It.get(n.transport)?.delete(i)}function j(w){return new Promise((A,I)=>{let q=()=>{m(),I(new h("timeout","the farewell did not flush before the deadline"))},F=H(q,Dr),g=setTimeout(q,Dr),m=()=>{F(),clearTimeout(g)};w.then(()=>{m(),A()},b=>{m(),I(b instanceof Error?b:new Error(String(b)))})})}let Y=n.transport.nodeIdHex()??i.incarnationHex,ee=new Set,ie={authority:Y,definition:n.definition,getState:()=>i.getState(),subscribe:w=>i.subscribe(w),setState:w=>{y(i.commit(w))},setEntities:(w,A)=>{y(i.commitEntities(w,A))},setEntity:(w,A,I)=>{let q={};Object.defineProperty(q,A,{value:I,enumerable:!0,writable:!0,configurable:!0}),y(i.commitEntities(w,q))},counts:()=>({handles:i.handleCount,ledgers:i.ledgerCount,deferred:i.deferredCount,sparseViews:i.sparseViews}),counters:()=>({...i.snapshotCounters(),...d}),close:()=>{if(l===null){l=E();for(let w of[...ee])w();ee.clear()}return l}};return Wr.set(ie,{owner:i,peer:$e(Y)??Y,maxEventBytes:n.maxEventBytes,dispatched:y,isClosed:()=>c,onClose:w=>{ee.add(w)}}),ie}var Us=3,Ht=class{constructor(e){this.deps=e;this.#d=[...e.audience],this.#a=e.interest===void 0?null:[...e.interest]}deps;#e="joining";#t=null;#s=null;#n=null;#r=null;#b=null;#l=0n;#o=null;#u=!1;#c=null;#f=null;#m=0;#h=0;#p=null;#d;#y=0;#O=new At;#w={};#a;get interest(){return this.#a===null?null:[...this.#a]}set interest(e){this.#a=e===null?null:[...e]}get desired(){return[...this.#d]}get waiters(){return this.#y}get state(){return this.#e}get handle(){return this.#t}get installed(){return this.#n===null?null:this.#n.toString()}get revision(){return this.#r===null?null:this.#r.toString()}get retired(){return this.#l.toString()}get skipped(){return this.#o===null?null:this.#o.toString()}get dropped(){return{...this.#w}}join(){if(this.#e==="closed")throw new h("closed","a closed replica cannot join again");this.#h+=1,this.#y=1,this.#E();let e=this.deps.newQ();return this.#c=e,this.#f=this.deps.now(),this.#m=0,this.#e="joining",this.deps.core.setStatus({phase:"connecting",stale:this.#v()}),{kind:"join",q:e,frame:R({k:"join",q:e,def:this.deps.definition.id,store:this.deps.store,ver:this.deps.definition.version,key:this.deps.key,aud:[...this.#d],...this.#a===null?{}:{int:[...this.#a]}})}}setAudience(e){if(this.#e==="closed")throw new h("closed","a closed replica cannot change audience");this.#h+=1;let t=[...e];if(this.#e==="installing"&&Bs(t,this.#d))return this.#y+=1,[];this.#d=t;let r=this.#t;if(this.#g(),this.#n=null,this.#r=null,this.#o=null,this.#u=!1,this.deps.core.applySnapshot(this.deps.definition.empty()),this.deps.core.setStatus({phase:"syncing",stale:!1,error:null}),r===null)return this.#y=1,[this.join()];let i=this.deps.newQ();return this.#c=i,this.#f=this.deps.now(),this.#y=1,this.#e="installing",[{kind:"aud",q:i,frame:R({k:"aud",q:i,h:r,aud:t})}]}reconnect(){if(this.#e==="closed")throw new h("closed","a closed replica cannot reconnect");this.#h+=1;let e=this.#t;if(this.#g(),e===null)return[this.join()];let t=this.deps.newQ();return this.#c=t,this.#e="installing",this.deps.core.setStatus({phase:"reconnecting",stale:this.#v()}),[{kind:"resume",q:t,frame:R({k:"resume",q:t,h:e,aud:[...this.#d],...this.#a===null?{}:{int:[...this.#a]}})}]}cancelWaiter(){this.#y>0&&(this.#y-=1),!(this.#y>0)&&this.#e==="installing"&&this.cancel()}receive(e){if(this.#e==="closed")return this.#i("closed");let t=Me(e,{maxBytes:this.deps.maxEventBytes,as:"replica"});if(!t.ok)return this.#i(t.reason);let r=t.message;if("h"in r&&r.h!==void 0&&this.#t!==null&&r.h!==this.#t)return this.#i("foreign-handle");switch(r.k){case"man":return this.#A(r);case"snap":return this.#R(r);case"delta":return this.#P(r);case"no":return this.#j(r.code,r.q);case"ok":case"res":return this.#i("unimplemented-kind")}}tick(){let e=this.deps.now();if(this.#e==="installing"&&this.#p!==null)return this.#p.expired(e)?this.#k("assembly-deadline"):[];if(this.#f===null||e-this.#f<pn)return[];if(this.#e!=="joining"&&this.#e!=="installing")return[];if(this.#m>=Us)return this.#f=null,this.#e="fenced",this.#c=null,this.#g(),this.#S("failed",new h("timeout",`no store named ${this.deps.store} answered the join`)),[];let t=this.#m,r=this.join();return this.#m=t+1,[r]}cancel(){this.#e!=="closed"&&(this.#h+=1,this.#g(),this.#c=null,this.#e="fenced",this.#o=null,this.#u=!1,this.#S("failed"))}#A(e){let t=ae(e.g),r=e.q!==void 0&&e.q===this.#c;if(e.q!==void 0&&!r)return this.#i("stale-correlation");if(t<=this.#l)return this.#i("stale-generation");if(r){if(this.#e!=="joining"&&this.#e!=="installing"&&this.#e!=="fenced")return this.#i("unexpected-manifest")}else{if(this.#e==="fenced")return this.#i("fenced");if(this.#e!=="ready")return this.#o=this.#o===null?t:$s(this.#o,t),this.#i("mid-transition")}if(this.#t===null)this.#t=e.h,this.#s=e.inc;else if(this.#s!==null&&e.inc!==this.#s)return this.#i("foreign-incarnation");this.#g(),this.#l=t;let i={h:e.h,g:e.g,r:e.r,n:e.n,bytes:e.bytes},s=this.#O.open(i,this.deps.now());return"accept"in s?(this.#b=t,this.#p=s,this.#e="installing",this.deps.core.setStatus({phase:"syncing",stale:this.#v()}),{out:[],dropped:null}):{out:this.#k(s.reason),dropped:s.reason}}#R(e){let t=this.#p;if(t===null)return this.#i("no-open-assembly");let r=this.#h,i=t.accept({h:e.h,g:e.g,r:e.r,n:e.n,i:e.i,d:e.d},s=>this.deps.definition.state(s),this.deps.now());return this.#h!==r?this.#i("superseded-installation"):i.ok?i.done?this.#_(i.document,e.g,e.r,r):{out:[],dropped:null}:i.fatal?{out:this.#k(i.reason),dropped:i.reason}:this.#i(i.reason)}#_(e,t,r,i){return this.deps.core.applySnapshot(e),this.#b=null,this.#p=null,this.#O.reclaim(this.#t,t),this.#h!==i?(this.#n=null,this.#r=null,this.#S("failed"),this.#i("superseded-installation")):(this.#n=ae(t),this.#r=ae(r),this.#c=null,this.#e="ready",this.deps.core.setStatus({phase:"ready",stale:!1,error:null}),{out:this.#I(),dropped:null})}#P(e){if(this.#e!=="ready")return this.#u=!0,this.#i("not-ready");let t=ae(e.g),r=this.#n;if(r===null||t!==r)return r!==null&&t>r?{out:this.#x("generation-ahead"),dropped:"generation-ahead"}:this.#i("stale-generation");if(this.#r===null||ae(e.base)!==this.#r)return{out:this.#x("gap"),dropped:"gap"};let i=this.deps.core.applyDelta(e.ops);return i.ok?(this.#r=ae(e.r),{out:[],dropped:null}):{out:this.#x(i.reason),dropped:i.reason}}#j(e,t){if(e==="owner-lost")return this.#g(),this.#e="closed",this.#t=null,this.#S("closed"),{out:[],dropped:"owner-lost"};if(e==="closed"){let r=this.#e==="fenced";return this.#E(),r?(this.#S("failed"),{out:[],dropped:"closed-while-fenced"}):(this.#S("connecting"),{out:[this.join()],dropped:"closed"})}return t===void 0||t!==this.#c?this.#i("stale-correlation"):(this.#g(),this.#c=null,this.#e="fenced",this.#S("failed",new h(e,`the request was refused: ${e}`)),{out:[],dropped:`refused-${e}`})}#k(e){return this.#g(),this.#b=null,this.#e="installing",this.deps.core.setStatus({phase:"syncing",stale:this.#v()}),this.#x(e)}#x(e){let t=this.#t;if(t===null)return[];let r=this.deps.newQ();return this.#c=r,this.#f=this.deps.now(),this.#e="installing",this.#o=null,this.#u=!1,this.deps.core.setStatus({phase:this.#v()?"reconnecting":"syncing",stale:this.#v()}),[{kind:"resync",q:r,frame:R({k:"resync",q:r,h:t,g:this.#n===null?"0":this.#n.toString(),have:this.#r===null?"0":this.#r.toString()})}]}#I(){let e=this.#o,t=this.#u;return!t&&(e===null||this.#n===null||e<=this.#n)?(this.#o=null,this.#u=!1,[]):this.#x(t?"behind":"skipped-refresh")}#E(){this.#g(),this.#t=null,this.#s=null,this.#n=null,this.#r=null,this.#l=0n,this.#o=null,this.#u=!1,this.#c=null}#g(){this.#p!==null&&(this.#p.reclaim(),this.#p=null),this.#t!==null&&this.#O.reclaimHandle(this.#t),this.#b=null}#v(){return this.#n!==null}#S(e,t=null){this.#n=null,this.#r=null,this.deps.core.applySnapshot(this.deps.definition.empty()),this.deps.core.setStatus({phase:e,stale:!1,error:t})}#i(e){return this.#w[e]=(this.#w[e]??0)+1,{out:[],dropped:e}}};function $s(n,e){return n>e?n:e}function Bs(n,e){return n.length===e.length&&n.every((t,r)=>t===e[r])}var $r=2e4,vn=1e4,Js=6e4,Fs=1e3,On=64,Ur=new TextEncoder,Vs=new TextDecoder;function Ye(n){let e=new Uint8Array(n);crypto.getRandomValues(e);let t="";for(let r of e)t+=r.toString(16).padStart(2,"0");return t}function xn(n){let e=n.transport.nodeIdHex();if(e!==null&&Sn(e,n.host))throw new h("invalid-data","a replica cannot join the node it runs on: hold the hostStore handle instead");let t=n.streamId??`store/${n.definition.id}`,r=n.now??(()=>Date.now()),i=n.schedule??((g,m)=>{let b=setInterval(g,m);return()=>{clearInterval(b)}}),s=new he({definition:n.definition,initialState:n.definition.empty()}),o=new Ht({definition:n.definition,core:s,maxEventBytes:n.maxEventBytes,now:r,newQ:()=>(n.newQ??(()=>Ye(8)))(),audience:n.audience,store:n.store??n.definition.id,key:n.key,...n.interest===void 0?{}:{interest:n.interest}}),a=new Map,d=new Map,c=0n,l=!1,u=null,p=null,f=[],y=null;async function O(){if(u!==null)return u;if(p!==null)return p;let g=$e(n.host);return g===null?Promise.reject(new h("invalid-data",`the host id is not a node id: ${n.host}`)):(p=Promise.resolve(n.transport.connectPeer?.(g)).catch(()=>{}).then(()=>n.transport.openStream({reliability:"reliable",peer:g,label:t})).then(m=>{if(p=null,l){try{m.close()}catch{}throw new h("closed","the store closed while its stream was opening")}return u=m,m}).catch(m=>{throw p=null,m}),p)}async function _(g){for(let m of g){if(l)return;let b=Ur.encode(m),x=await O();try{await x.send(b)}catch(C){if(l)return;if(!Ot(C))throw C;if(u===x){u=null,p=null;try{x.close()}catch{}}await(await O()).send(b)}}}function P(g){let m=g instanceof h?g:new h("indeterminate",`the transport could not carry a store frame: ${String(g)}`);for(let b of f.splice(0,f.length))b.reject(m);E(m);for(let[b,x]of[...a])a.delete(b),x.reject(m)}function M(g){_(g).catch(P)}let H=g=>g.map(m=>m.frame);function k(g){if(o.state==="ready"){E(null);for(let b of f.splice(0,f.length))b.resolve();return}if(o.state!=="fenced"&&o.state!=="closed")return;let m=g??new h(o.state==="closed"?"owner-lost":"aborted",`the store handle is ${o.state}`);E(m);for(let b of f.splice(0,f.length))b.reject(m)}function E(g){let m=y;if(m!==null){y=null,m.q!==null&&a.delete(m.q);for(let b of[...m.calls])m.calls.delete(b),g===null?b.resolve():b.reject(g)}}function j(g){return E(new h("aborted","a newer transition superseded this one before it installed")),y={q:g,calls:new Set},g===null?null:a.size>=On?new h("capacity","too many requests are already outstanding"):(a.set(g,{resolve:()=>E(null),reject:m=>E(m),at:r(),transition:!0}),null)}function Y(){return new Promise((g,m)=>{let b={resolve:g,reject:m,deadlineAt:r()+Js},x=y??{q:null,calls:new Set};y=x,x.calls.add(b)})}let ee=n.transport.onEvent(g=>{if(l||g.type!=="stream_data"||typeof g.peerNode!="string"||!Sn(g.peerNode,n.host))return;let m=g.payload;if(m===void 0)return;let b=Vs.decode(m),x=Me(b,{maxBytes:n.maxEventBytes,as:"replica"});if(x.ok&&"q"in x.message&&typeof x.message.q=="string"){let K=a.get(x.message.q);if(K!==void 0&&(x.message.k==="res"||x.message.k==="ok")){a.delete(x.message.q),K.resolve(x.message.k==="res"?x.message.out:void 0);return}K!==void 0&&x.message.k==="no"&&(a.delete(x.message.q),K.reject(new h(x.message.code,`the store refused: ${x.message.code}`)))}let C=null;x.ok&&x.message.k==="no"&&(C=new h(x.message.code,`the store refused: ${x.message.code}`));let W=o.receive(b);M(H(W.out)),k(C)}),ie=i(()=>{if(l)return;let g=o.handle;g!==null&&M([R({k:"alive",q:Ye(8),h:g})])},$r),w=i(()=>{if(l)return;let g=r(),m=y;if(m!==null){for(let b of[...m.calls])g<b.deadlineAt||(m.calls.delete(b),o.cancelWaiter(),b.reject(new h("indeterminate","the transition did not install before its deadline")));m.q!==null&&m.calls.size===0&&E(null)}for(let[b,x]of[...a])x.transition||g-x.at<vn||(a.delete(b),x.reject(new h("indeterminate","the store did not answer before the deadline")))},vn),A=i(()=>{l||(M(H(o.tick())),k(s.getStatus().error??null))},Fs),I;try{I=o.join()}catch(g){throw new h("invalid-data","the join request cannot be encoded",{cause:g})}j(null),M(H([I]));function q(g){return a.size>=On?Promise.reject(new h("capacity","too many requests are already outstanding")):new Promise((m,b)=>{a.set(g,{resolve:x=>{m(x)},reject:b,at:r(),transition:!1})})}let F={getState:()=>s.getState(),subscribe:g=>s.subscribe(g),getStatus:()=>s.getStatus(),subscribeStatus:g=>s.subscribeStatus(g),ready:()=>new Promise((g,m)=>{if(l){m(new h("closed","this store handle is closed"));return}if(o.state==="ready"){g();return}if(o.state==="closed"){m(new h("owner-lost","the store owner closed this handle"));return}f.push({resolve:g,reject:m})}),act:async(g,m)=>{if(l)throw new h("closed","this store handle is closed");if(o.state==="closed")throw new h("owner-lost","the store owner closed this handle");let b=o.handle;if(b===null)throw new h("not-ready","no handle yet: the join has not been answered");c+=1n;let x=(n.newQ??(()=>Ye(8)))(),C;try{C=R({k:"act",q:x,h:b,s:c.toString(),name:g,in:m})}catch(K){throw new h("invalid-data",`the input for '${g}' cannot be encoded`,{cause:K})}let W=q(x);return W.catch(()=>{}),await _([C]),await W},input:(g,m)=>{if(l)return{type:"dropped",reason:"not-ready"};let b=o.handle;if(b===null||o.state!=="ready")return{type:"dropped",reason:"not-ready"};let x=(d.get(g)??0n)+1n;d.set(g,x);let C;try{C=R({k:"in",h:b,s:x.toString(),name:g,in:m})}catch(W){throw new h("invalid-data",`the input for '${g}' cannot be encoded`,{cause:W})}return M([C]),{type:x===1n?"queued":"replaced"}},setAudience:async g=>{if(l)throw new h("closed","this store handle is closed");let m;try{m=o.setAudience(g)}catch(C){throw new h("invalid-data","the audience cannot be encoded",{cause:C})}let b=m[0];if(b!==void 0){let C=j(b.q);if(C!==null)throw C}let x=Y();x.catch(()=>{}),b!==void 0&&await _(H(m)),await x},setInterest:async g=>{if(l)throw new h("closed","this store handle is closed");let m=[...g],b="0".repeat(32),x;try{x=R({k:"int",q:"0".repeat(16),h:b,int:m})}catch(Be){throw new h("invalid-data","the interest set cannot be encoded",{cause:Be})}if(U(x)>n.maxEventBytes)throw new h("capacity","the interest set does not fit one message");o.interest=m;let C=o.handle;if(C===null||o.state!=="ready")return await F.ready(),o.interest===null||o.interest.join("\0")!==m.join("\0")?void 0:F.setInterest(m);let W=(n.newQ??(()=>Ye(8)))(),K=q(W);K.catch(()=>{}),await _([R({k:"int",q:W,h:C,int:m})]),await K},reconnect:async()=>{if(l)throw new h("closed","this store handle is closed");u=null,p=null;let g;try{g=o.reconnect()}catch(m){throw new h("invalid-data","the reconnect request cannot be encoded",{cause:m})}g[0]!==void 0&&j(null),await _(H(g))},close:async()=>{if(l)return;l=!0,ie(),w(),A();let g=o.handle;if(g!==null)try{await(await O()).send(Ur.encode(R({k:"leave",q:Ye(8),h:g})))}catch{}ee(),E(new h("aborted","the store handle closed before this request was answered"));for(let m of a.values())m.reject(new h("aborted","the store handle closed before this request was answered"));a.clear();for(let m of f.splice(0,f.length))m.reject(new h("closed","the store handle closed before a view was installed"));u?.close(),u=null,s.close()}};return F}var Jr="0".repeat(16),kn="0".repeat(32);function Br(n,e,t){let r;try{r=t==="act"?R({k:"act",q:Jr,h:kn,s:"1",name:n,in:e}):R({k:"in",h:kn,s:"1",name:n,in:e})}catch(s){throw new h("invalid-data",`the input for '${n}' cannot be encoded`,{cause:s})}let i=De(r);if(!i.ok||typeof i.value!="object"||i.value===null||Array.isArray(i.value))throw new h("invalid-data",`the input for '${n}' cannot be encoded`);return i.value.in}function Ks(n){let e=De(JSON.stringify(n));return e.ok?e.value:n}function En(n,e){let t=Ct(n);if(t===void 0)throw new h("invalid-data","hostPlayer needs a handle returned by hostStore");let{owner:r,peer:i}=t,s=n.definition,o=new he({definition:s,initialState:s.empty(),phase:"syncing"}),a=[...e.audience],d=e.interest===void 0?null:[...e.interest],c=!1,l=!1,u=new Map;function p(k,E){l=!0,E?.code==="forbidden"&&queueMicrotask(()=>_("refused")),o.applySnapshot(s.empty()),o.setStatus({phase:k,stale:!1,error:E})}function f(){if(c||l)return;if(t.isClosed()){p("closed",null);return}if(!r.localRead(i,a)){p("failed",new h("forbidden","the store refused: forbidden"));return}let k=r.localView(i,a,d);if(k===null){p("failed",new h("capacity","the store refused: capacity"));return}o.applySnapshot(k),o.setStatus({phase:"ready",stale:!1,error:null})}let y=r.subscribe(()=>{f()});t.onClose(()=>{y(),!c&&!l&&p("closed",null)}),f();let O=!1;o.getStatus().phase==="ready"&&(O=!0,r.localPresence(i,!0,a),t.dispatched({out:[],refused:null,deferred:null}));function _(k){!O||t.isClosed()||(O=!1,r.localPresence(i,!1,a,k),t.dispatched({out:[],refused:null,deferred:null}))}function P(){return c?new h("closed","this store handle is closed"):t.isClosed()?new h("owner-lost","the store owner closed this handle"):l?o.getStatus().error??new h("owner-lost","the store owner closed this handle"):null}function M(){let k=[...u];if(u.clear(),P()===null)for(let[E,j]of k)t.dispatched(r.localInput(E,j,i))}function H(k,E,j){return E===void 0?o.subscribe(k):o.subscribe(k,E,j)}return{getState:()=>o.getState(),subscribe:H,getStatus:()=>o.getStatus(),subscribeStatus:k=>o.subscribeStatus(k),ready:()=>{let k=o.getStatus();return k.phase==="ready"?Promise.resolve():Promise.reject(k.error??new h(c?"closed":"owner-lost","this store handle is not ready"))},act:async(k,E)=>{let j=P();if(j!==null)throw j;let Y=Br(k,E,"act");await Promise.resolve();let ee=P();if(ee!==null)throw ee;let{outcome:ie,dispatched:w}=r.localAct(k,Y,i);if(t.dispatched(w),ie.kind==="refusal")throw new h(ie.code,`the store refused: ${ie.code}`);return Ks(ie.out)},input:(k,E)=>{if(P()!==null||o.getStatus().phase!=="ready")return{type:"dropped",reason:"not-ready"};let j=Br(k,E,"in"),Y=u.size===0,ee=u.has(k);return u.set(k,j),Y&&queueMicrotask(M),{type:ee?"replaced":"queued"}},setAudience:async k=>{let E=P();if(E!==null)throw E;try{R({k:"aud",q:Jr,h:kn,aud:[...k]})}catch(Y){throw new h("invalid-data","the audience cannot be encoded",{cause:Y})}await Promise.resolve();let j=P();if(j!==null)throw j;if(!r.localRead(i,k))throw new h("forbidden","the store refused: forbidden");a=[...k],f()},setInterest:async k=>{let E=P();if(E!==null)throw E;let j=[...k];await Promise.resolve(),d=j,f()},reconnect:()=>Promise.resolve(),close:()=>(c||(c=!0,_("left"),u.clear(),y(),o.close()),Promise.resolve())}}var de=class extends Error{constructor(t,r){super(r);this.code=t;this.name="InventoryError"}code},An=64,Rn=Object.freeze({});function zs(){return Rn}function Fr(n){if(typeof n!="string"||n.length===0||n.length>An||n==="__proto__")throw new de("invalid",`an item id is 1-${An} characters, got ${JSON.stringify(n)}`)}function Vr(n){if(!Number.isSafeInteger(n)||n<1)throw new de("invalid",`a count is a whole number of at least 1, got ${String(n)}`)}function Xs(n,e){let t=e?.maxCount;return t===void 0?Number.MAX_SAFE_INTEGER:typeof t=="number"?t:Object.prototype.hasOwnProperty.call(t,n)?t[n]:Number.MAX_SAFE_INTEGER}function Lt(n,e){return n===void 0||!Object.prototype.hasOwnProperty.call(n,e)?0:n[e]??0}function Gs(n,e,t=1){return Lt(n,e)>=t}function Kr(n,e,t,r){Fr(e),Vr(t);let i=Lt(n,e),s=i+t;if(!Number.isSafeInteger(s)||s>Xs(e,r))throw new de("full",`no room for ${String(t)} more ${e}`);if(i===0&&r?.maxKinds!==void 0&&Object.keys(n).length>=r.maxKinds)throw new de("full",`no room for another kind of item (${String(r.maxKinds)} at most)`);return Object.freeze({...n,[e]:s})}function Ys(n,e,t){Fr(e),Vr(t);let r=Lt(n,e);if(r<t)throw new de("insufficient",`has ${String(r)} ${e}, needs ${String(t)}`);let i={...n};return r===t?delete i[e]:i[e]=r-t,Object.freeze(i)}function Qs(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw new de("invalid","an inventory is an object of item id \u2192 count");let t=Rn;for(let[r,i]of Object.entries(n)){if(typeof i!="number")throw new de("invalid",`the count of ${r} is not a number`);t=Kr(t,r,i,e)}return t}function Zs(n,e){return Object.prototype.hasOwnProperty.call(n,e)?n[e]:Rn}function eo(n,e){return Object.prototype.hasOwnProperty.call(n,e)?{[e]:n[e]}:{}}function zr(n){if(!(n>0)||!Number.isFinite(n))throw new RangeError(`a cell size is a positive number, got ${String(n)}`)}function to(n,e,t){return zr(t),`${String(Math.floor(n/t))}:${String(Math.floor(e/t))}`}function no(n){let e=/^(-?\d+):(-?\d+)$/.exec(n);return e===null?null:[Number(e[1]),Number(e[2])]}function Xr(n,e,t){zr(t.size);let r=t.radius??1,i=Math.floor(n/t.size),s=Math.floor(e/t.size),o=[`${String(i)}:${String(s)}`];for(let a=-r;a<=r;a+=1)for(let d=-r;d<=r;d+=1)(a!==0||d!==0)&&o.push(`${String(i+a)}:${String(s+d)}`);return o}function ro(n,e,t,r){let i=Xr(e,t,r),o=(r.radius??1)+(r.margin??1),a=Math.floor(e/r.size),d=Math.floor(t/r.size),c=new Set(i);for(let l of n){if(c.has(l))continue;let u=no(l);u!==null&&Math.abs(u[0]-a)<=o&&Math.abs(u[1]-d)<=o&&(i.push(l),c.add(l))}return i}function io(n,e){if(n.length!==e.length)return!1;let t=new Set(n);return e.every(r=>t.has(r))}var J=class extends Error{constructor(t,r){super(r);this.code=t;this.name="LobbyError"}code},Gr=64,Yr=256,_n=512,Qr=256,Tt="ABCDEFGHJKMNPQRSTUVWXYZ23456789",Pn=6,ei=2e3,ti=8104,so=/^[a-z0-9][a-z0-9._-]{0,63}$/,ni=1,Qe=new TextEncoder,oo=new TextDecoder;function jn(n){if(!so.test(n))throw new J("invalid",`a game name is 1-64 of a-z 0-9 . _ - (starting with a letter or digit), got ${JSON.stringify(n)}`)}function In(n){let e=n.toUpperCase().replace(/[\s-]/g,"");if(e.length!==Pn||[...e].some(t=>!Tt.includes(t)))throw new J("invalid",`not a lobby code: ${JSON.stringify(n)}`);return e}function ao(){let n=256-256%Tt.length,e="";for(;e.length<Pn;){let t=new Uint8Array(16);crypto.getRandomValues(t);for(let r of t)r<n&&e.length<Pn&&(e+=Tt[r%Tt.length])}return e}function lo(n,e){return`net-lobby:${n}:seek:${e}`}function ri(n){return`net-lobby:${n}`}function Cn(n){return`net-lobby:${n}:rec:`}async function ii(n,e){let t=new Uint8Array(await crypto.subtle.digest("SHA-256",Qe.encode(`net-lobby${n}${e}`))),r="";for(let i of t.subarray(0,16))r+=i.toString(16).padStart(2,"0");return`net-lobby:${n}:code:${r}`}function co(n){let e="";for(let t of n)e+=String.fromCharCode(t);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function uo(n){if(!/^[A-Za-z0-9_-]*$/.test(n))return null;try{let e=atob(n.replace(/-/g,"+").replace(/_/g,"/"));return Uint8Array.from(e,t=>t.charCodeAt(0))}catch{return null}}function si(n){if(typeof n!="object"||n===null||Array.isArray(n))throw new J("invalid","lobby info is a flat object of strings, numbers and booleans");let e={};for(let[t,r]of Object.entries(n)){if(typeof r=="number"?!Number.isFinite(r):typeof r!="string"&&typeof r!="boolean")throw new J("invalid",`lobby info.${t} must be a string, a finite number or a boolean`);e[t]=r}if(Qe.encode(JSON.stringify(e)).length>Yr)throw new J("invalid",`lobby info is over ${Yr} bytes of JSON`);return Object.freeze(e)}function oi(n){if(typeof n!="string"||n.trim().length===0||[...n].length>Gr)throw new J("invalid",`a lobby name is 1-${Gr} characters`);return n}function ai(n){if(typeof n!="number"||!Number.isInteger(n)||n<1||n>Qr)throw new J("invalid",`capacity is a whole number from 1 to ${Qr}`);return n}function Zr(n,e){let t=JSON.stringify({v:ni,c:e.code,n:e.name,p:e.players,m:e.capacity,s:e.store,i:e.info}),r=Cn(n)+co(Qe.encode(t));if(Qe.encode(r).length>_n)throw new J("invalid",`the lobby record is over ${_n} bytes: shorten the name or info`);return r}function po(n,e){if(Qe.encode(e).length>_n)return null;let t=uo(e.slice(Cn(n).length));if(t===null)return null;let r;try{r=JSON.parse(oo.decode(t))}catch{return null}if(typeof r!="object"||r===null)return null;let i=r;try{if(i.v!==ni||typeof i.c!="string"||typeof i.s!="string"||i.s.length>200)return null;let s=ai(i.m),o=i.p;return typeof o!="number"||!Number.isInteger(o)||o<0||o>s?null:{code:In(i.c),name:oi(i.n),players:o,capacity:s,store:i.s,info:si(i.i??{})}}catch{return null}}function Dt(n){let e=n.startsWith("0x")?n.slice(2):n;if(/^[0-9a-fA-F]{1,16}$/.test(e))return e.toLowerCase().padStart(16,"0");throw new J("invalid",`not a peer id: ${JSON.stringify(n)}`)}async function Rl(n){let{node:e,game:t}=n;jn(t);let r=oi(n.name),i=ai(n.capacity),s=si(n.info??{}),o=n.visibility??"public",a=ao(),d=`${n.definition.id}@${n.definition.version}`,c=await ii(t,a);Zr(t,{code:a,name:r,players:i,capacity:i,store:d,info:s});let l=e.nodeIdHex();if(l===null)throw new J("invalid","the node has no id yet: connect it before opening a lobby");let u=Dt(l),p=new Set,f=n.authorize??(()=>!0),y=()=>[],O=N=>{let te=N.peer;return p.has(te)||N.type==="read"&&te!==u&&!y().includes(te)&&1+y().filter(yi=>yi!==u).length>=i?!1:f(N)},{audience:_,tags:P,announceEveryMs:M,maxEventBytes:H}=n,{node:k,game:E,name:j,capacity:Y,visibility:ee,info:ie,audience:w,tags:A,announceEveryMs:I,maxEventBytes:q,authorize:F,...g}=n,m=wn({...g,transport:e,maxEventBytes:H??ti,authorize:O}),b=Ct(m);y=()=>b.owner.peers();let x=En(m,{audience:_??[]});function C(){return[u,...b.owner.peers().filter(N=>N!==u)]}let W=new Set,K=!1,Be=null,Mt=!1;function pi(){let N=[...P??[],c];return o==="public"&&N.push(ri(t),Zr(t,{code:a,name:r,players:C().length,capacity:i,store:d,info:s})),N}function Ze(){if(!K){if(Be!==null){Mt=!0;return}Be=e.announce(pi()).catch(()=>{}).finally(()=>{Be=null,Mt&&(Mt=!1,Ze())})}}let Hn=C().join(),fi=b.owner.onMembership(()=>{queueMicrotask(()=>{if(K)return;let N=C();if(N.join()!==Hn){Hn=N.join(),Ze();for(let te of[...W])try{te(N)}catch{}}})});Ze();let hi=setInterval(Ze,M??ei);return{code:a,game:t,visibility:o,host:m,self:x,players:C,subscribePlayers:N=>(W.add(N),()=>{W.delete(N)}),link:N=>{let te=new URL(N??globalThis.location?.href??"about:blank");return te.searchParams.set("lobby",a),te.toString()},kick:N=>{let te=Dt(N);if(te===u)throw new J("invalid","the host cannot kick itself; close the lobby instead");p.add(te),b.dispatched(b.owner.reauthorize())},close:async()=>{K||(K=!0,clearInterval(hi),fi(),W.clear(),await x.close(),await m.close(),await e.announce([...P??[]]).catch(()=>{}))}}}async function _l(n){jn(n.game);let e=Cn(n.game),t=[],r=new Set;for(let i of await n.node.query(ri(n.game))){if(r.has(i.peerIdHex))continue;let s=i.capabilities.find(a=>a.startsWith(e));if(s===void 0)continue;let o=po(n.game,s);o!==null&&(r.add(i.peerIdHex),t.push({...o,host:i.peerIdHex}))}return t}async function Pl(n){jn(n.game);let e;if(n.lobby!==void 0)e=Dt(n.lobby.host);else if(n.code!==void 0){let p=await ii(n.game,In(n.code)),f=Date.now()+(n.timeoutMs??2e4),y=[];for(;y=[...new Set((await n.node.query(p)).map(O=>O.peerIdHex))],!(y.length>0||Date.now()>=f);)await new Promise(O=>setTimeout(O,250));if(y.length===0)throw new J("not-found",`no lobby answered to code ${n.code}`);if(y.length>1)throw new J("ambiguous",`${y.length} nodes claim code ${n.code}; join from the list instead`);e=y[0]}else throw new J("invalid","joinLobby needs a code or a lobby");let t=n.node.nodeIdHex();if(t!==null&&Dt(t)===e)throw new h("invalid-data","this node hosts that lobby: use lobby.self to play in it");let r=n.node,i=[...n.tags??[]],s=[...i,lo(n.game,e)],o=!1,a=()=>{o||r.announce(s).catch(()=>{})};a();let d=setInterval(a,ei),c=()=>{o||(o=!0,clearInterval(d),r.announce(i).catch(()=>{}))};if(r.connectPeer!==void 0){let p=Date.now()+(n.timeoutMs??2e4);for(;;)try{await r.connectPeer(e);break}catch(f){if(Date.now()>=p)throw c(),new J("not-found",`could not reach the lobby's host ${e}: ${String(f?.message??f)}`);await new Promise(y=>setTimeout(y,500))}}let l;try{l=xn({definition:n.definition,transport:r,host:e,audience:n.audience??[],key:n.key??"player",maxEventBytes:n.maxEventBytes??ti,...n.interest===void 0?{}:{interest:n.interest}})}catch(p){throw c(),p}let u=l.close.bind(l);return l.close=async()=>{c(),await u()},l}function jl(n){try{let e=new URL(n??globalThis.location?.href??"").searchParams.get("lobby");return e===null?null:In(e)}catch{return null}}var di="net-mesh:identity";function li(n){let e=new Uint8Array(n);return globalThis.crypto.getRandomValues(e),Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}var ci=/^[0-9a-f]{64}$/;function fo(n){if(n===null)return null;try{let e=JSON.parse(n);if(typeof e.entitySecretHex=="string"&&typeof e.noiseSecretHex=="string"&&ci.test(e.entitySecretHex)&&ci.test(e.noiseSecretHex))return{entitySecretHex:e.entitySecretHex,noiseSecretHex:e.noiseSecretHex}}catch{}return null}function ho(n=di,e){let t=e;try{t??=globalThis.localStorage}catch{t=void 0}let r=null;try{r=fo(t?.getItem(n)??null)}catch{t=void 0}if(r!==null)return r;let i={entitySecretHex:li(32),noiseSecretHex:li(32)};try{t?.setItem(n,JSON.stringify(i))}catch{}return i}var qe=class extends Error{constructor(t,r,i=null){super(r);this.kind=t;this.status=i}kind;status;name="CredentialRequestError"},ui={unknown_game:"unknown-game",rate_limited:"rate-limited",malformed_request:"malformed-request"};async function yo(n){let e=n.fetch??globalThis.fetch;if(typeof e!="function")throw new qe("unreachable","requestCredential needs fetch");let t=`${n.anchorUrl.replace(/\/+$/,"")}/credential`,r;try{r=await e(t,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({game:n.game}),...n.signal===void 0?{}:{signal:n.signal}})}catch(o){throw n.signal?.aborted?o:new qe("unreachable",`could not reach ${t}: ${String(o)}`)}let i=null;try{i=await r.json()}catch{}if(!r.ok){let o=i?.refusal,a=i?.message,d=typeof o=="string"&&o in ui?ui[o]:r.status===404?"unreachable":"unexpected",c=d==="unreachable"?`${t} issues no credentials (is the anchor started with --game?)`:typeof a=="string"?a:`the anchor answered ${r.status}`;throw new qe(d,c,r.status)}let s=i;if(typeof s?.credentialB64!="string"||typeof s.bootstrapUrl!="string"||typeof s.game!="string")throw new qe("unexpected","the anchor answered without a credential",r.status);return{credentialB64:s.credentialB64,bootstrapUrl:s.bootstrapUrl,game:s.game}}export{$r as ALIVE_INTERVAL_MS,we as AsyncQueue,mt as BrowserNode,tt as ControlPlaneError,qe as CredentialRequestError,di as DEFAULT_IDENTITY_KEY,Ae as EventHub,xt as HIDDEN,Nr as HOST_SWEEP_MS,nt as IceServerConflictError,ge as IdentityError,de as InventoryError,ei as LOBBY_ANNOUNCE_MS,Tt as LOBBY_CODE_ALPHABET,Pn as LOBBY_CODE_LENGTH,z as LeafError,je as LeafStream,J as LobbyError,Tr as MAX_EVENT_ROUNDS,dr as MAX_INTEREST_KEYS,ur as MAX_INTEREST_KEY_BYTES,An as MAX_ITEM_ID_CHARS,Qr as MAX_LOBBY_CAPACITY,Yr as MAX_LOBBY_INFO_BYTES,Gr as MAX_LOBBY_NAME_CHARS,_n as MAX_LOBBY_RECORD_TAG_BYTES,On as MAX_OUTSTANDING,vt as MeshSession,rt as NotLeaderError,at as ORG_SINK_CLOSED_REFUSAL,ue as OrgAdmissionDeniedError,D as OrgCancelledError,Pe as OrgDuplex,Re as OrgHandleRegistry,Je as OrgIndeterminateError,ve as OrgInternalError,Z as OrgLeaderLostError,We as OrgMalformedError,Fe as OrgRefusedError,Ke as OrgRequests,xe as OrgRevokedError,X as OrgServe,Ee as OrgSessionLostError,Ve as OrgSink,be as OrgStream,Q as OrgStreamError,ke as OrgTimeoutError,_e as OrgUpload,vn as REQUEST_DEADLINE_MS,it as RpcError,pe as RtcError,Oe as SessionError,he as StoreCore,h as StoreError,$n as U64_EVENT_KEYS,Ne as UnknownLeafError,et as WireError,Kr as addItems,Qt as asSessionModule,Gi as assertHidden,bt as buildConnectRequest,to as cellKey,Xr as cellsAround,Ft as classifyRtcError,Gn as classifyRtcFailure,st as coarseAdmissionReason,Ni as connect,Lt as countItems,Rl as createLobby,Yi as defineStore,Yn as diagnosticStunUrl,zs as emptyInventory,Bn as fromBase64,S as fromWasmError,Gs as hasItems,Vi as hiddenOr,En as hostPlayer,wn as hostStore,Zs as inventoryOf,kt as isHidden,Yt as isLifecycleEvent,xi as isUdpBlocked,Pl as joinLobby,xn as joinStore,_l as listLobbies,Xe as loadLeafWasm,jl as lobbyCodeFromUrl,Rt as mergeShallow,In as normalizeLobbyCode,eo as onlyOwn,Fi as openSession,mi as orgRetireError,lt as orgRetireReason,qt as orgTerminalError,Ce as parseAttemptStatus,St as parseCounters,wt as parseDescriptors,me as parseEvent,Qs as parseInventory,ct as parseJsonPreservingU64,Mn as parseLeafError,ze as parseOrgCaller,Tn as parseOrgError,nr as parseRetryReport,Nn as parseRpcFailure,qn as parseRtcFailure,tr as parseRtcStats,Gt as parseSessionEvent,er as peerIdHex,Kt as probeBootstrapReachable,Vt as probeStunBinding,ar as projectVisible,le as reconcile,Xt as refineIceFailure,Qn as reflexiveAddress,ho as rememberedIdentity,Ys as removeItems,yo as requestCredential,io as sameCells,ro as stickyCells,Ut as toBase64,ne as toWasmOrgCallOptions,re as toWasmOrgServeOptions,ot as udpBlockedEvidence};
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `@net-mesh/browser` — a Net mesh node in the browser.
3
+ *
4
+ * ```typescript
5
+ * import { connect, isUdpBlocked } from '@net-mesh/browser';
6
+ *
7
+ * // `bootstrapUrl` is the anchor's base URL (the credential carries one).
8
+ * const node = await connect({ credentialB64, bootstrapUrl: 'https://anchor.example' });
9
+ * await node.announce(['transcribe']);
10
+ * const reply = await node.call('summarise', new TextEncoder().encode('…'), 5_000);
11
+ * ```
12
+ *
13
+ * A sibling of `@net-mesh/sdk`, not a sub-path of it: the SDK's every
14
+ * entry point resolves `@net-mesh/core`, the napi native binding,
15
+ * which a browser bundle must never try to resolve. See the README.
16
+ */
17
+ export { connect, BrowserNode, buildConnectRequest, parseAttemptStatus, parseCounters, parseDescriptors, parseRetryReport, parseRtcStats, peerIdHex, refineIceFailure, } from './node.js';
18
+ export type { ConnectOptions, FailureTypingOptions, NodeDescriptor, PeerAttemptStatus, PeerConnectOutcome, RetryReport, RtcStatsReading, } from './node.js';
19
+ export { LeafStream } from './stream.js';
20
+ export type { OpenStreamOptions } from './stream.js';
21
+ export { OrgDuplex, OrgHandleRegistry, OrgRequests, OrgServe, OrgSink, OrgStream, OrgUpload, parseOrgCaller, toWasmOrgCallOptions, toWasmOrgServeOptions, } from './org.js';
22
+ export type { OrgAccess, OrgByteStream, OrgCallCredentials, OrgCallHandle, OrgCallOptions, OrgCaller, OrgClientStreamHandler, OrgDuplexHandler, OrgDuplexHandles, OrgDuplexSink, OrgRequestStream, OrgResponseSink, OrgServeHandle, OrgServeOptions, OrgStreamingHandler, OrgUnaryHandler, OrgUploadCall, } from './org.js';
23
+ export { EventHub, fromBase64, parseEvent, parseJsonPreservingU64, toBase64, U64_EVENT_KEYS, } from './events.js';
24
+ export type { AnnouncementEvent, ChannelMessageEvent, ConnectedEvent, DisconnectedEvent, DroppedEvent, LeafEvent, LeafEventOf, RpcResponseEvent, RtcFailureEvent, SignalEvent, StreamDataEvent, UnknownEvent, Unsubscribe, } from './events.js';
25
+ export { ControlPlaneError, IceServerConflictError, IdentityError, isUdpBlocked, LeafError, NotLeaderError, OrgAdmissionDeniedError, OrgCancelledError, OrgIndeterminateError, OrgInternalError, OrgLeaderLostError, OrgMalformedError, OrgRefusedError, OrgRevokedError, OrgSessionLostError, OrgStreamError, OrgTimeoutError, ORG_SINK_CLOSED_REFUSAL, coarseAdmissionReason, orgRetireError, orgRetireReason, orgTerminalError, parseLeafError, parseOrgError, parseRpcFailure, parseRtcFailure, RpcError, RtcError, SessionError, udpBlockedEvidence, UnknownLeafError, WireError, fromWasmError, } from './errors.js';
26
+ export type { CoarseAdmissionReason, LeafErrorKind, OrgErrorKind, OrgRetireReason, RpcErrorFailure, RtcErrorFailure, UdpBlockedEvidence, } from './errors.js';
27
+ export { classifyRtcError, classifyRtcFailure, diagnosticStunUrl, probeBootstrapReachable, probeStunBinding, reflexiveAddress, } from './udp-probe.js';
28
+ export type { BootstrapProbeOptions, IceFailureClassification, RtcFailureObservations, StunProbeOptions, StunProbeOutcome, } from './udp-probe.js';
29
+ export { loadLeafWasm } from './wasm.js';
30
+ export type { LeafWasmConnectOptions, LeafWasmModule, LeafWasmNode, LeafWasmProxyStream, LeafWasmStream, LeafWasmStreamLike, LeafWasmStreamOptions, StreamCallbackPayload, StreamReliability, WasmSource, } from './wasm.js';
31
+ export { AsyncQueue } from './async-queue.js';
32
+ export * from './leader/index.js';
33
+ export * from './store/index.js';
34
+ export * from './lobby.js';
35
+ export { rememberedIdentity, DEFAULT_IDENTITY_KEY } from './identity.js';
36
+ export type { IdentitySecrets } from './identity.js';
37
+ export { requestCredential, CredentialRequestError } from './credential.js';
38
+ export type { AnchorCredential, CredentialRequestErrorKind, RequestCredentialOptions, } from './credential.js';
package/dist/index.js ADDED
@@ -0,0 +1,46 @@
1
+ /**
2
+ * `@net-mesh/browser` — a Net mesh node in the browser.
3
+ *
4
+ * ```typescript
5
+ * import { connect, isUdpBlocked } from '@net-mesh/browser';
6
+ *
7
+ * // `bootstrapUrl` is the anchor's base URL (the credential carries one).
8
+ * const node = await connect({ credentialB64, bootstrapUrl: 'https://anchor.example' });
9
+ * await node.announce(['transcribe']);
10
+ * const reply = await node.call('summarise', new TextEncoder().encode('…'), 5_000);
11
+ * ```
12
+ *
13
+ * A sibling of `@net-mesh/sdk`, not a sub-path of it: the SDK's every
14
+ * entry point resolves `@net-mesh/core`, the napi native binding,
15
+ * which a browser bundle must never try to resolve. See the README.
16
+ */
17
+ export { connect, BrowserNode, buildConnectRequest, parseAttemptStatus, parseCounters, parseDescriptors, parseRetryReport, parseRtcStats, peerIdHex, refineIceFailure, } from './node.js';
18
+ export { LeafStream } from './stream.js';
19
+ // Organization-scoped streaming (plan §4.5): the eight org verbs'
20
+ // handle types and their handler vocabulary. `BrowserNode` and
21
+ // `MeshSession` both expose `callOrg*` / `serveOrg*`; these are what
22
+ // those verbs hand back and take.
23
+ export { OrgDuplex, OrgHandleRegistry, OrgRequests, OrgServe, OrgSink, OrgStream, OrgUpload, parseOrgCaller, toWasmOrgCallOptions, toWasmOrgServeOptions, } from './org.js';
24
+ export { EventHub, fromBase64, parseEvent, parseJsonPreservingU64, toBase64, U64_EVENT_KEYS, } from './events.js';
25
+ export { ControlPlaneError, IceServerConflictError, IdentityError, isUdpBlocked, LeafError, NotLeaderError, OrgAdmissionDeniedError, OrgCancelledError, OrgIndeterminateError, OrgInternalError, OrgLeaderLostError, OrgMalformedError, OrgRefusedError, OrgRevokedError, OrgSessionLostError, OrgStreamError, OrgTimeoutError, ORG_SINK_CLOSED_REFUSAL, coarseAdmissionReason, orgRetireError, orgRetireReason, orgTerminalError, parseLeafError, parseOrgError, parseRpcFailure, parseRtcFailure, RpcError, RtcError, SessionError, udpBlockedEvidence, UnknownLeafError, WireError, fromWasmError, } from './errors.js';
26
+ export { classifyRtcError, classifyRtcFailure, diagnosticStunUrl, probeBootstrapReachable, probeStunBinding, reflexiveAddress, } from './udp-probe.js';
27
+ export { loadLeafWasm } from './wasm.js';
28
+ export { AsyncQueue } from './async-queue.js';
29
+ // §8's leader/follower surface: `openSession`, `MeshSession`, the five
30
+ // lifecycle events and their boundary types. A page that might be open
31
+ // in more than one tab — which is every real page — uses `openSession`
32
+ // rather than `connect`, because two nodes on one origin contend for
33
+ // one identity.
34
+ export * from './leader/index.js';
35
+ // The networked game store (Stage 7). `defineStore` plus the local
36
+ // store core; `hostStore` / `joinStore` arrive with the leader-proxy
37
+ // peer and subscription lifecycle they require, and are absent rather
38
+ // than stubbed until then — see `store/index.ts`.
39
+ export * from './store/index.js';
40
+ // Lobbies: host a game others can find, list the open ones, join by
41
+ // code or link — `createLobby` / `listLobbies` / `joinLobby`.
42
+ export * from './lobby.js';
43
+ // The same player on every visit, for connect().
44
+ export { rememberedIdentity, DEFAULT_IDENTITY_KEY } from './identity.js';
45
+ // Anonymous visitor credentials from a game anchor.
46
+ export { requestCredential, CredentialRequestError } from './credential.js';
@@ -0,0 +1,111 @@
1
+ /**
2
+ * §8's lifecycle, as events.
3
+ *
4
+ * A session emits every {@link LeafEvent} the direct surface does,
5
+ * plus five tags of its own. They are here rather than in
6
+ * `src/events.ts` because they describe the *lifecycle*, not the node:
7
+ * a page using {@link BrowserNode} never sees them, and a page using a
8
+ * session cannot explain a leader change without them.
9
+ *
10
+ * `parseEvent` carries an unknown tag through intact, so a bundle
11
+ * whose leaf is newer than its wrapper stays legible; this module
12
+ * refines exactly the five it knows and leaves the rest as they
13
+ * arrived.
14
+ */
15
+ import { type LeafEvent } from '../events.js';
16
+ /** The Web Lock changed hands; this tab's generation moved. */
17
+ export interface LeaderChangedEvent {
18
+ readonly type: 'leader_changed';
19
+ /** The new generation, exact decimal. */
20
+ readonly generation: string;
21
+ }
22
+ /**
23
+ * A channel subscription was (re-)established by the leader.
24
+ *
25
+ * Carries the channel **name**, not its hash: the leader restores by
26
+ * name, and a page that declared `subscriptions` recognises the name
27
+ * it asked for.
28
+ */
29
+ export interface SubscriptionRestoredEvent {
30
+ readonly type: 'subscription_restored';
31
+ readonly channel: string;
32
+ }
33
+ /**
34
+ * The leader stood down, and the work of `generation` has been failed.
35
+ *
36
+ * `failed` is how many in-flight requests were rejected — a count, so
37
+ * a `number` is exact; it is not a `u64`.
38
+ */
39
+ export interface LeaderLostEvent {
40
+ readonly type: 'leader_lost';
41
+ /** The generation whose in-flight work just died, exact decimal. */
42
+ readonly generation: string;
43
+ readonly failed: number;
44
+ }
45
+ /**
46
+ * This tab refused a message from a superseded generation.
47
+ *
48
+ * The fence firing, surfaced rather than swallowed: a page debugging a
49
+ * resumed or restored tab needs to see the refusal, and a silent drop
50
+ * looks exactly like a lost message.
51
+ */
52
+ export interface GenerationFencedEvent {
53
+ readonly type: 'generation_fenced';
54
+ /** What the sender presented, exact decimal. */
55
+ readonly presented: string;
56
+ /** What is in force, exact decimal. */
57
+ readonly current: string;
58
+ }
59
+ /**
60
+ * This tab discovered it was superseded and stood down.
61
+ *
62
+ * The other side of {@link GenerationFencedEvent}: not "somebody sent
63
+ * me a stale message" but "I am the stale one".
64
+ */
65
+ export interface NotLeaderEvent {
66
+ readonly type: 'not_leader';
67
+ /** The generation this tab held, exact decimal. */
68
+ readonly presented: string;
69
+ /** The generation now in force, exact decimal. */
70
+ readonly current: string;
71
+ }
72
+ /**
73
+ * This tab was granted the lock and then failed to re-bootstrap its
74
+ * node.
75
+ *
76
+ * It is a follower again, re-declared to whoever takes the lock next,
77
+ * and it will ask for the lock again shortly — the origin has no node
78
+ * after a failed promotion, so somebody has to keep trying. Surfaced
79
+ * rather than logged because "the page briefly had no node and you
80
+ * could not see why" is the symptom this used to produce.
81
+ */
82
+ export interface PromotionFailedEvent {
83
+ readonly type: 'promotion_failed';
84
+ /** The generation the failed acquisition had been allocated. */
85
+ readonly generation: string;
86
+ /** The typed failure, as its message. */
87
+ readonly detail: string;
88
+ }
89
+ /** The six lifecycle tags a session adds. */
90
+ export type SessionLifecycleEvent = LeaderChangedEvent | SubscriptionRestoredEvent | LeaderLostEvent | GenerationFencedEvent | NotLeaderEvent | PromotionFailedEvent;
91
+ /** Everything a session can deliver. */
92
+ export type SessionEvent = LeafEvent | SessionLifecycleEvent;
93
+ /** `SessionEvent` narrowed by its tag. */
94
+ export type SessionEventOf<T extends SessionEvent['type']> = Extract<SessionEvent, {
95
+ type: T;
96
+ }>;
97
+ /**
98
+ * Parse one event JSON string from a session.
99
+ *
100
+ * Never throws: this runs inside a callback the wasm module invokes,
101
+ * and an exception there would unwind through Rust. Anything that is
102
+ * not one of the five lifecycle tags goes to `parseEvent`, so the node
103
+ * events and the unknown-tag passthrough behave exactly as they do on
104
+ * the direct surface.
105
+ */
106
+ export declare function parseSessionEvent(json: string): SessionEvent;
107
+ /**
108
+ * `true` for the six tags a session adds, so a page can filter the
109
+ * lifecycle out of the event stream without listing them.
110
+ */
111
+ export declare function isLifecycleEvent(event: SessionEvent): event is SessionLifecycleEvent;