@kyro-cms/core 0.12.71 → 0.13.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 (200) hide show
  1. package/README.md +6 -0
  2. package/dist/{WebhookService-DQyM9fVo.d.ts → WebhookService-BLi5Rz2m.d.ts} +1 -1
  3. package/dist/{WebhookService-bo1NrgBW.d.cts → WebhookService-BcuD8tnn.d.cts} +1 -1
  4. package/dist/WebhookService-D5PSI5t6.d.cts +143 -0
  5. package/dist/WebhookService-DPCCn_12.d.ts +143 -0
  6. package/dist/WebhookService-Dncnbgm9.d.cts +143 -0
  7. package/dist/WebhookService-UY5p89Bj.d.ts +143 -0
  8. package/dist/WebhookService-YZXBCRXA.d.ts +143 -0
  9. package/dist/WebhookService-zrDmAx7L.d.cts +143 -0
  10. package/dist/api-handler-graphql.cjs +1 -1
  11. package/dist/api-handler-graphql.js +1 -1
  12. package/dist/api-handler-trpc.cjs +1 -1
  13. package/dist/api-handler-trpc.js +1 -1
  14. package/dist/api-handler.cjs +1 -1
  15. package/dist/api-handler.js +1 -1
  16. package/dist/{base-urWvrsX8.d.cts → base-B--L0lCn.d.cts} +1 -1
  17. package/dist/base-BVoDPNjJ.d.cts +218 -0
  18. package/dist/base-CAb9EYQs.d.ts +218 -0
  19. package/dist/base-CyG7aF1e.d.cts +218 -0
  20. package/dist/{base-BcfNgOqZ.d.ts → base-DOImeJ-F.d.ts} +1 -1
  21. package/dist/base-DbnwE42-.d.cts +218 -0
  22. package/dist/base-NyiSsD-n.d.ts +218 -0
  23. package/dist/base-xflndGDO.d.ts +218 -0
  24. package/dist/bootstrap-QQ6D3OYG.js +1 -0
  25. package/dist/bootstrap-QVKSKXJF.cjs +1 -0
  26. package/dist/bootstrap-RILR44UM.cjs +1 -0
  27. package/dist/bootstrap-ZRRUPRUR.js +1 -0
  28. package/dist/chunk-262YP5XA.cjs +1 -0
  29. package/dist/chunk-2FSOHXOU.cjs +56 -0
  30. package/dist/chunk-2OS5Y4LE.cjs +1 -0
  31. package/dist/chunk-2PXXQKN3.cjs +3 -0
  32. package/dist/{chunk-K6ZW5M6S.cjs → chunk-355R4LS5.cjs} +3 -3
  33. package/dist/chunk-35IVNLMA.js +122 -0
  34. package/dist/{chunk-FSWDDVLA.js → chunk-3GXLOYM3.js} +1 -1
  35. package/dist/chunk-3KZXF4US.js +2 -0
  36. package/dist/{chunk-H7PC2ENZ.cjs → chunk-3LAWUINR.cjs} +1 -1
  37. package/dist/chunk-3O3AVMWM.cjs +1 -0
  38. package/dist/chunk-3U6MKWET.cjs +120 -0
  39. package/dist/chunk-4BMWWGJN.js +384 -0
  40. package/dist/chunk-5A7E7N4B.cjs +431 -0
  41. package/dist/chunk-6DD4J7LI.js +2 -0
  42. package/dist/chunk-6GGPY7U2.js +4 -0
  43. package/dist/chunk-6MNLRAKM.cjs +121 -0
  44. package/dist/chunk-6NBZDW53.js +133 -0
  45. package/dist/{chunk-2HATK4C5.js → chunk-73Y63IPP.js} +4 -4
  46. package/dist/chunk-7K6ZUNJM.js +4 -0
  47. package/dist/chunk-7NKNSRCB.cjs +448 -0
  48. package/dist/chunk-A3IOQOV6.js +2 -0
  49. package/dist/chunk-A3XVL6ED.cjs +3 -0
  50. package/dist/{chunk-LKQHIOPW.cjs → chunk-APDQ6ZTG.cjs} +1 -1
  51. package/dist/chunk-ATI2UZ7U.js +2 -0
  52. package/dist/chunk-B4AC23SG.js +122 -0
  53. package/dist/chunk-BD6XHMMM.cjs +2 -0
  54. package/dist/chunk-CH4TZZI5.js +449 -0
  55. package/dist/{chunk-26KFM3P6.js → chunk-CNHUCCQJ.js} +1 -1
  56. package/dist/chunk-CRP6PSCE.js +2 -0
  57. package/dist/chunk-DI6TCZSE.js +122 -0
  58. package/dist/chunk-DORUYZQV.cjs +1 -0
  59. package/dist/chunk-EFKEVWAD.js +4 -0
  60. package/dist/chunk-EI7FRSNY.js +57 -0
  61. package/dist/chunk-EON4XLKQ.cjs +1 -0
  62. package/dist/chunk-EUQAOYEO.cjs +121 -0
  63. package/dist/chunk-EVAUBT7H.js +57 -0
  64. package/dist/chunk-EYHD7HZE.cjs +1 -0
  65. package/dist/chunk-EYYIPA5N.js +432 -0
  66. package/dist/chunk-F2O4QO5N.cjs +383 -0
  67. package/dist/chunk-FBWLSWZ4.js +122 -0
  68. package/dist/chunk-FGN6IMPY.cjs +3 -0
  69. package/dist/chunk-FK2BG4HU.js +3 -0
  70. package/dist/chunk-GWIZT2P5.js +57 -0
  71. package/dist/chunk-H3FJ54KB.cjs +121 -0
  72. package/dist/chunk-HY3EAWB2.js +4 -0
  73. package/dist/chunk-I6UJVO2P.js +57 -0
  74. package/dist/chunk-IQSF6XRV.js +57 -0
  75. package/dist/chunk-IXGDTAES.js +4 -0
  76. package/dist/chunk-JA44K75G.js +2 -0
  77. package/dist/chunk-K5XGP57D.cjs +19 -0
  78. package/dist/chunk-KEITOXIP.js +2 -0
  79. package/dist/chunk-LPFRMQFQ.js +121 -0
  80. package/dist/chunk-LYU44UNN.cjs +56 -0
  81. package/dist/chunk-MDLJTZLV.cjs +1 -0
  82. package/dist/chunk-MJAODEFC.cjs +121 -0
  83. package/dist/chunk-MYHNTJLR.cjs +56 -0
  84. package/dist/chunk-N2YHO2WI.cjs +3 -0
  85. package/dist/chunk-N4FXLQE3.cjs +132 -0
  86. package/dist/chunk-NPBXLPOP.js +3 -0
  87. package/dist/chunk-ON5XJEPO.cjs +3 -0
  88. package/dist/chunk-OT2Z4XBD.cjs +1 -0
  89. package/dist/chunk-PFTBTWSC.cjs +1 -0
  90. package/dist/chunk-PTPVFLET.js +20 -0
  91. package/dist/chunk-PZDLPRJF.js +4 -0
  92. package/dist/chunk-Q5TFO66G.cjs +1 -0
  93. package/dist/chunk-QUTYCUST.js +4 -0
  94. package/dist/chunk-REKKBAQX.cjs +56 -0
  95. package/dist/chunk-REQ622YC.js +3 -0
  96. package/dist/chunk-RTNQP6BV.js +2 -0
  97. package/dist/chunk-RUJW47ZJ.js +2 -0
  98. package/dist/chunk-RXYCFZJC.cjs +121 -0
  99. package/dist/chunk-RYHOWZLK.js +2 -0
  100. package/dist/chunk-S2MZNEBQ.cjs +1 -0
  101. package/dist/chunk-S73YERS2.js +57 -0
  102. package/dist/chunk-SBNMXQNO.cjs +2 -0
  103. package/dist/chunk-T3DJ3UTP.cjs +121 -0
  104. package/dist/chunk-TJZO7ZSX.cjs +3 -0
  105. package/dist/chunk-TKUNRCRH.js +4 -0
  106. package/dist/chunk-TQLCOMKC.js +4 -0
  107. package/dist/chunk-TRXYDWGE.cjs +1 -0
  108. package/dist/chunk-TS55CUNJ.js +57 -0
  109. package/dist/chunk-UFBJ3WOZ.js +2 -0
  110. package/dist/chunk-UQRVQUVR.js +2 -0
  111. package/dist/chunk-UW5W35NP.js +122 -0
  112. package/dist/chunk-VI7WCO2J.cjs +3 -0
  113. package/dist/chunk-W2GPP6RB.js +122 -0
  114. package/dist/chunk-WHOA7YJU.cjs +1 -0
  115. package/dist/chunk-WNRUPL26.js +2 -0
  116. package/dist/chunk-WXT2XW7T.js +13 -0
  117. package/dist/chunk-XFYSADHV.cjs +2 -0
  118. package/dist/chunk-XIAJQLGS.js +2 -0
  119. package/dist/chunk-XK6UB77Q.js +4 -0
  120. package/dist/chunk-Y2VHO66Q.cjs +3 -0
  121. package/dist/chunk-Y5O2OD7J.cjs +3 -0
  122. package/dist/chunk-YARB43JG.cjs +56 -0
  123. package/dist/chunk-YLCEMVYY.cjs +56 -0
  124. package/dist/chunk-YSOM57GK.cjs +3 -0
  125. package/dist/chunk-Z3UVDGYS.cjs +56 -0
  126. package/dist/chunk-ZTLGK6R4.cjs +12 -0
  127. package/dist/chunk-ZUBJ6RLQ.cjs +1 -0
  128. package/dist/cli/index.cjs +1 -1
  129. package/dist/cli/index.js +1 -1
  130. package/dist/client.cjs +8 -8
  131. package/dist/client.d.cts +1248 -0
  132. package/dist/client.d.ts +1248 -0
  133. package/dist/client.js +8 -8
  134. package/dist/drizzle/index.cjs +1 -1
  135. package/dist/drizzle/index.d.cts +3 -3
  136. package/dist/drizzle/index.d.ts +3 -3
  137. package/dist/drizzle/index.js +1 -1
  138. package/dist/fields/index.cjs +1 -1
  139. package/dist/fields/index.d.cts +2 -2
  140. package/dist/fields/index.d.ts +2 -2
  141. package/dist/fields/index.js +1 -1
  142. package/dist/graphql/index.d.cts +3 -3
  143. package/dist/graphql/index.d.ts +3 -3
  144. package/dist/{index-d1m_oup7.d.cts → index-B9BFNOHd.d.cts} +1 -1
  145. package/dist/index-BMcYFpTv.d.cts +105 -0
  146. package/dist/index-BttsFZDa.d.ts +105 -0
  147. package/dist/index-CxA9uOv0.d.ts +105 -0
  148. package/dist/{index-4cH-BjtP.d.ts → index-D6AXbuPI.d.ts} +1 -1
  149. package/dist/index-DF0KDBaM.d.cts +105 -0
  150. package/dist/index-DG4Xu7gA.d.cts +105 -0
  151. package/dist/index-eHex8Iwj.d.ts +105 -0
  152. package/dist/index.cjs +32 -32
  153. package/dist/index.d.cts +73 -11
  154. package/dist/index.d.ts +73 -11
  155. package/dist/index.js +32 -32
  156. package/dist/lib-A2D63VXD.cjs +1 -0
  157. package/dist/lib-JQD2JAOO.js +2 -0
  158. package/dist/local-KR3AIGVA.cjs +1 -0
  159. package/dist/local-T7GISZBL.js +1 -0
  160. package/dist/mongo-auth-adapter-GR2CFFEA.js +1 -0
  161. package/dist/mongo-auth-adapter-UOO2LZUJ.cjs +1 -0
  162. package/dist/mongodb/index.cjs +1 -1
  163. package/dist/mongodb/index.d.cts +4 -3
  164. package/dist/mongodb/index.d.ts +4 -3
  165. package/dist/mongodb/index.js +1 -1
  166. package/dist/nodemailer-transport-3VWVUBM5.cjs +1 -0
  167. package/dist/nodemailer-transport-7RHATUKL.js +1 -0
  168. package/dist/nodemailer-transport-CHO2WKIY.js +1 -0
  169. package/dist/nodemailer-transport-ED2IXNGW.cjs +1 -0
  170. package/dist/rest/index.cjs +1 -1
  171. package/dist/rest/index.d.cts +4 -4
  172. package/dist/rest/index.d.ts +4 -4
  173. package/dist/rest/index.js +1 -1
  174. package/dist/templates/index.cjs +1 -1
  175. package/dist/templates/index.d.cts +2 -2
  176. package/dist/templates/index.d.ts +2 -2
  177. package/dist/templates/index.js +1 -1
  178. package/dist/trpc/index.cjs +1 -1
  179. package/dist/trpc/index.d.cts +3 -3
  180. package/dist/trpc/index.d.ts +3 -3
  181. package/dist/trpc/index.js +1 -1
  182. package/dist/types-B5Qz1svz.d.cts +822 -0
  183. package/dist/types-Bii0bhUV.d.cts +329 -0
  184. package/dist/types-Bii0bhUV.d.ts +329 -0
  185. package/dist/{types-BADIMVGF.d.ts → types-Bt2_ycUO.d.ts} +36 -1
  186. package/dist/types-C4wXHImf.d.ts +822 -0
  187. package/dist/types-DCWgPFmi.d.cts +822 -0
  188. package/dist/types-DROqAsr0.d.cts +330 -0
  189. package/dist/types-DROqAsr0.d.ts +330 -0
  190. package/dist/{types-YAVR0H9Z.d.cts → types-DsF64Wrc.d.cts} +36 -1
  191. package/dist/types-ZrjEVWfi.d.ts +811 -0
  192. package/dist/types-dEy5JxvN.d.ts +822 -0
  193. package/dist/types-tVJc9YbX.d.cts +811 -0
  194. package/dist/ws/index.cjs +1 -1
  195. package/dist/ws/index.d.cts +121 -1
  196. package/dist/ws/index.d.ts +121 -1
  197. package/dist/ws/index.js +1 -1
  198. package/package.json +2 -2
  199. package/dist/chunk-5M3FKE2V.js +0 -2
  200. package/dist/chunk-WCFHS7EZ.cjs +0 -1
@@ -0,0 +1 @@
1
+ 'use strict';var chunk73D2PNHD_cjs=require('./chunk-73D2PNHD.cjs'),chunkBUNLC3II_cjs=require('./chunk-BUNLC3II.cjs');chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var d=class{channels=new Map;maxListeners;constructor(e=100){this.maxListeners=e;}subscribe(e,s){this.channels.has(e)||this.channels.set(e,new Set);let t=this.channels.get(e);if(t.size>=this.maxListeners)throw new Error(`Max listeners (${this.maxListeners}) reached for channel "${e}"`);return t.add(s),()=>{t.delete(s),t.size===0&&this.channels.delete(e);}}publish(e,s){let t=this.channels.get(e);if(t)for(let r of t)try{let n=r(s);n instanceof Promise&&n.catch(i=>{console.error(`[PubSub] Error in handler for channel "${e}":`,i);});}catch(n){console.error(`[PubSub] Error in handler for channel "${e}":`,n);}}hasSubscribers(e){return this.channels.has(e)&&this.channels.get(e).size>0}getSubscriberCount(e){return this.channels.get(e)?.size||0}getChannels(){return Array.from(this.channels.keys())}clear(){this.channels.clear();}},b=class extends d{registry;constructor(e,s=100){super(s),this.registry=e;}publishCollectionEvent(e,s){this.publish(`collection:${e}`,s),this.publish("events:collection",s),s.tenantId&&(this.publish(`tenant:${s.tenantId}:collection:${e}`,s),this.publish(`tenant:${s.tenantId}:events`,s)),this.publish(`collection:${e}:${s.type}`,s);}subscribeToCollection(e,s){return this.subscribe(`collection:${e}`,s)}subscribeToCollectionEvent(e,s,t){return this.subscribe(`collection:${e}:${s}`,t)}subscribeToTenant(e,s){return this.subscribe(`tenant:${e}:events`,s)}subscribeToTenantCollection(e,s,t){return this.subscribe(`tenant:${e}:collection:${s}`,t)}subscribeToAllCollections(e){return this.subscribe("events:collection",e)}createAfterChangeHook(e){return async s=>{this.publishCollectionEvent(e,{type:s.operation==="create"?"create":"update",collection:e,doc:s.doc,originalDoc:s.originalDoc,id:s.id||s.doc?.id,tenantId:s.tenantId,timestamp:new Date().toISOString(),user:s.user});}}createAfterDeleteHook(e){return async s=>{this.publishCollectionEvent(e,{type:"delete",collection:e,doc:s.doc,originalDoc:s.originalDoc,id:s.id||s.doc?.id,tenantId:s.tenantId,timestamp:new Date().toISOString(),user:s.user});}}autoRegisterHooks(){let e=this.registry.getCollections();for(let s of e){let t=this.registry.getCollection(s.slug);t&&(t.hooks||(t.hooks={}),t.hooks.afterChange||(t.hooks.afterChange=[]),t.hooks.afterDelete||(t.hooks.afterDelete=[]),t.hooks.afterChange.push(this.createAfterChangeHook(s.slug)),t.hooks.afterDelete.push(this.createAfterDeleteHook(s.slug)));}}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var l=class{documents=new Map;defaultLockTtlMs=3e4;getOrCreateDoc(e){let s=this.documents.get(e);return s||(s={docKey:e,users:new Map,cursors:new Map,locks:new Map,comments:[]},this.documents.set(e,s)),s}join(e,s){let t=this.getOrCreateDoc(e),r={...s,color:s.color||this.generateUserColor(s.id),lastSeen:Date.now()};return t.users.set(s.id,r),Array.from(t.users.values())}leave(e,s){let t=this.documents.get(e);if(!t)return {remainingUsers:[],releasedLocks:[]};t.users.delete(s),t.cursors.delete(s);let r=[];for(let[n,i]of t.locks.entries())i.userId===s&&(t.locks.delete(n),r.push(n));return t.users.size===0&&t.locks.size===0&&t.comments.length===0&&this.documents.delete(e),{remainingUsers:Array.from(t.users.values()),releasedLocks:r}}updateCursor(e,s,t){let r=this.getOrCreateDoc(e),n=r.users.get(s);n&&(n.lastSeen=Date.now());let i={userId:s,field:t.field,position:t.position,selection:t.selection,updatedAt:Date.now()};return r.cursors.set(s,i),i}acquireLock(e,s,t,r=this.defaultLockTtlMs){let n=this.getOrCreateDoc(e),i=Date.now(),o=n.locks.get(s);if(o&&o.expiresAt>i&&o.userId!==t.id)return {success:false,currentLock:o};let a={fieldName:s,userId:t.id,userName:t.name,lockedAt:i,expiresAt:i+r};return n.locks.set(s,a),{success:true,lock:a}}releaseLock(e,s,t){let r=this.documents.get(e);if(!r)return false;let n=r.locks.get(s);return n&&(n.userId===t||n.expiresAt<=Date.now())?(r.locks.delete(s),true):false}addComment(e,s){let t=this.getOrCreateDoc(e),r={...s,createdAt:new Date().toISOString(),resolved:false};return t.comments.push(r),r}resolveComment(e,s){let t=this.documents.get(e);if(!t)return false;let r=t.comments.find(n=>n.id===s);return r?(r.resolved=true,true):false}getSnapshot(e){let s=this.documents.get(e);if(!s)return {users:[],cursors:[],locks:[],comments:[]};let t=Date.now();for(let[r,n]of s.locks.entries())n.expiresAt<=t&&s.locks.delete(r);return {users:Array.from(s.users.values()),cursors:Array.from(s.cursors.values()),locks:Array.from(s.locks.values()),comments:s.comments}}generateUserColor(e){let s=["#ef4444","#f97316","#eab308","#10b981","#06b6d4","#3b82f6","#8b5cf6","#ec4899"],t=0;for(let r=0;r<e.length;r++)t=e.charCodeAt(r)+((t<<5)-t);return s[Math.abs(t)%s.length]}};var p=class{wss;clients=new Map;pubsub;options;pingTimer;presence=new l;constructor(e){this.options=e,this.pubsub=e.pubsub,this.wss=new chunk73D2PNHD_cjs.b.default({port:e.port||8080}),this.setupServer(),this.startPingInterval();}setupServer(){this.wss.on("connection",(e,s)=>{let t=this.generateClientId();if(this.options.maxConnections&&this.clients.size>=this.options.maxConnections){e.close(1013,"Server at capacity");return}let r={id:t,ws:e,subscriptions:new Map,authenticated:false,connectedAt:new Date,lastActivity:new Date};this.clients.set(t,r),this.sendToClient(r,{type:"connected",clientId:t,timestamp:new Date().toISOString()}),e.on("message",n=>{this.handleMessage(r,n);}),e.on("error",n=>{console.error(`[WS] Client error ${t}:`,n);}),e.on("close",()=>{this.handleDisconnect(r);}),e.on("pong",()=>{r.lastActivity=new Date;});}),this.wss.on("error",e=>{console.error("[WS] Server error:",e);});}handleMessage(e,s){e.lastActivity=new Date;let t;try{t=JSON.parse(s.toString());}catch{this.sendToClient(e,{type:"error",error:"Invalid JSON"});return}switch(t.type){case "authenticate":this.handleAuthenticate(e,t);break;case "subscribe":this.handleSubscribe(e,t);break;case "unsubscribe":this.handleUnsubscribe(e,t);break;case "unsubscribeAll":this.handleUnsubscribeAll(e);break;case "list":this.handleList(e);break;case "ping":this.sendToClient(e,{type:"pong",timestamp:new Date().toISOString()});break;case "presence:join":this.handlePresenceJoin(e,t);break;case "presence:leave":this.handlePresenceLeave(e,t);break;case "presence:cursor":this.handlePresenceCursor(e,t);break;case "presence:lock":this.handlePresenceLock(e,t);break;case "presence:unlock":this.handlePresenceUnlock(e,t);break;case "presence:comment":this.handlePresenceComment(e,t);break;case "presence:snapshot":this.handlePresenceSnapshot(e,t);break;default:this.sendToClient(e,{type:"error",error:`Unknown message type: ${t.type}`});}}async handleAuthenticate(e,s){if(!this.options.requireAuth){e.authenticated=true,this.sendToClient(e,{type:"authenticated",success:true});return}if(!this.options.verifyToken){e.authenticated=true,this.sendToClient(e,{type:"authenticated",success:true});return}try{let t=await this.options.verifyToken(s.token);e.authenticated=!0,e.user=t,e.tenantId=t.tenantId,this.sendToClient(e,{type:"authenticated",success:!0,user:{id:t.id,email:t.email}});}catch(t){this.sendToClient(e,{type:"authenticated",success:false,error:t.message});}}handleSubscribe(e,s){if(this.options.requireAuth&&!e.authenticated){this.sendToClient(e,{type:"error",error:"Not authenticated"});return}let t=s.channel;if(!t){this.sendToClient(e,{type:"error",error:"Channel is required"});return}if(e.subscriptions.has(t)){this.sendToClient(e,{type:"subscribed",channel:t,success:true,message:"Already subscribed"});return}let r=this.pubsub.subscribe(t,n=>{this.sendToClient(e,{type:"event",channel:t,data:n,timestamp:new Date().toISOString()});});e.subscriptions.set(t,{channel:t,unsubscribe:r}),this.sendToClient(e,{type:"subscribed",channel:t,success:true});}handleUnsubscribe(e,s){let t=s.channel;if(!t){this.sendToClient(e,{type:"error",error:"Channel is required"});return}let r=e.subscriptions.get(t);r?(r.unsubscribe(),e.subscriptions.delete(t),this.sendToClient(e,{type:"unsubscribed",channel:t,success:true})):this.sendToClient(e,{type:"unsubscribed",channel:t,success:false,message:"Not subscribed"});}handleUnsubscribeAll(e){for(let[,s]of e.subscriptions)s.unsubscribe();e.subscriptions.clear(),this.sendToClient(e,{type:"unsubscribedAll",success:true});}handleList(e){let s=this.pubsub.getChannels();this.sendToClient(e,{type:"channels",channels:s,count:s.length});}handlePresenceJoin(e,s){let{docKey:t,user:r}=s;if(!t||!r||!r.id){this.sendToClient(e,{type:"error",error:"docKey and user object with id are required for presence:join"});return}e.activeDocKey=t;let n=this.presence.join(t,r),i=`presence:${t}`;if(!e.subscriptions.has(i)){let o=this.pubsub.subscribe(i,a=>{this.sendToClient(e,{type:"event",channel:i,data:a,timestamp:new Date().toISOString()});});e.subscriptions.set(i,{channel:i,unsubscribe:o});}this.sendToClient(e,{type:"presence:joined",docKey:t,users:n,snapshot:this.presence.getSnapshot(t)}),this.pubsub.publish(i,{type:"presence:users_changed",docKey:t,users:n});}handlePresenceLeave(e,s){let{docKey:t,userId:r}=s;if(!t||!r)return;let{remainingUsers:n,releasedLocks:i}=this.presence.leave(t,r);e.activeDocKey=void 0;let o=`presence:${t}`;this.pubsub.publish(o,{type:"presence:users_changed",docKey:t,users:n,releasedLocks:i}),this.sendToClient(e,{type:"presence:left",docKey:t,success:true});}handlePresenceCursor(e,s){let{docKey:t,userId:r,cursor:n}=s;if(!t||!r||!n)return;let i=this.presence.updateCursor(t,r,n),o=`presence:${t}`;this.pubsub.publish(o,{type:"presence:cursor_moved",docKey:t,cursor:i});}handlePresenceLock(e,s){let{docKey:t,fieldName:r,user:n,ttlMs:i}=s;if(!t||!r||!n||!n.id){this.sendToClient(e,{type:"error",error:"docKey, fieldName, and user are required to acquire lock"});return}let o=this.presence.acquireLock(t,r,n,i),a=`presence:${t}`;o.success?(this.pubsub.publish(a,{type:"presence:field_locked",docKey:t,lock:o.lock}),this.sendToClient(e,{type:"presence:lock_acquired",docKey:t,lock:o.lock})):this.sendToClient(e,{type:"presence:lock_rejected",docKey:t,fieldName:r,currentLock:o.currentLock});}handlePresenceUnlock(e,s){let{docKey:t,fieldName:r,userId:n}=s;if(!t||!r||!n)return;let i=this.presence.releaseLock(t,r,n);if(i){let o=`presence:${t}`;this.pubsub.publish(o,{type:"presence:field_unlocked",docKey:t,fieldName:r,userId:n});}this.sendToClient(e,{type:"presence:unlocked",docKey:t,fieldName:r,success:i});}handlePresenceComment(e,s){let{docKey:t,comment:r}=s;if(!t||!r||!r.id){this.sendToClient(e,{type:"error",error:"docKey and comment payload are required"});return}let n=this.presence.addComment(t,r),i=`presence:${t}`;this.pubsub.publish(i,{type:"presence:comment_added",docKey:t,comment:n}),this.sendToClient(e,{type:"presence:comment_created",docKey:t,comment:n});}handlePresenceSnapshot(e,s){let{docKey:t}=s;if(!t){this.sendToClient(e,{type:"error",error:"docKey is required for snapshot"});return}let r=this.presence.getSnapshot(t);this.sendToClient(e,{type:"presence:snapshot",docKey:t,snapshot:r});}handleDisconnect(e){if(e.activeDocKey&&e.user?.id){let{remainingUsers:s,releasedLocks:t}=this.presence.leave(e.activeDocKey,e.user.id);this.pubsub.publish(`presence:${e.activeDocKey}`,{type:"presence:users_changed",docKey:e.activeDocKey,users:s,releasedLocks:t});}for(let[,s]of e.subscriptions)s.unsubscribe();this.clients.delete(e.id);}sendToClient(e,s){e.ws.readyState===chunk73D2PNHD_cjs.a.default.OPEN&&e.ws.send(JSON.stringify(s));}generateClientId(){return `ws_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}startPingInterval(){this.options.pingInterval&&(this.pingTimer=setInterval(()=>{for(let[e,s]of this.clients)if(s.ws.readyState===chunk73D2PNHD_cjs.a.default.OPEN){if(Date.now()-s.lastActivity.getTime()>this.options.pingInterval*3){s.ws.terminate(),this.handleDisconnect(s);continue}s.ws.ping();}},this.options.pingInterval));}broadcast(e,s){this.pubsub.publish(e,s);}getConnectedClients(){return Array.from(this.clients.values())}getClientCount(){return this.clients.size}getSubscriptionCount(){let e=0;for(let s of this.clients.values())e+=s.subscriptions.size;return e}async close(){this.pingTimer&&clearInterval(this.pingTimer);for(let e of this.clients.values())e.ws.close(1001,"Server shutting down");return new Promise(e=>{this.wss.close(()=>{e();});})}getServer(){return this.wss}};function y(u){return new p(u)}exports.a=d;exports.b=b;exports.c=l;exports.d=p;exports.e=y;