liveblocks 1.5.0-rc2 → 1.5.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.
@@ -394,9 +394,9 @@ that the user can disable this by setting it to "false".`}import{execSync as jo}
394
394
  </main>
395
395
  </body>
396
396
  </html>
397
- `;var ne=new Ko({authorize:()=>!0});ne.route("GET /v7",()=>At(426));ne.route("GET /v8",()=>At(426));ne.route("GET /health",()=>Yo({status:"ok"}));ne.route("GET /",()=>Vo(Nt.replace("__VERSION__","1.5.0-rc2")));import{ServerMsgCode as Zo}from"@liveblocks/core";import{QueryParser as Qo}from"@liveblocks/query-parser";import{ConsoleTarget as Mt,jsonObjectYolo as er,Logger as Ut,ROOT_YDOC_ID as Je,snapshotToLossyJson_eager as tr,snapshotToNodeStream as or,snapshotToPlainLson_eager as Bt,transientClientMsgDecoder as rr}from"@liveblocks/server";import{json as _e,ndjsonStream as sr,ZenRouter as nr}from"@liveblocks/zenrouter";import{array as X,constant as ir,either as ar,enum_ as dr,nullable as jt,object as be,optional as Y,record as fe,string as j}from"decoders";function*Ho(t){for(let e of t)for(let o of e)yield o}function kt(...t){return Ho(t)}import{Base64 as cr}from"js-base64";import*as Se from"yjs";import*as x from"yjs";function Xo(t){return t.content instanceof x.ContentFormat||t.content instanceof x.ContentEmbed?"text":"arr"in t.content?"array":"str"in t.content?"text":"type"in t.content?"xml":"unknown"}function Wo(t){let e=[],o=t;for(;o!==null;){if(!o.deleted)if(o.content instanceof x.ContentType)e.push(o.content.type.toJSON());else if(o.content instanceof x.ContentString)e.push(o.content.str);else if(o.content instanceof x.ContentFormat){let{key:r,value:i}=o.content;e.push({key:r,value:i})}else o.content instanceof x.ContentEmbed&&e.push(o.content.embed);o=o.right}return e}function Pt(t,e,o,r=!1){if(!e._first&&e._map instanceof Map&&e._map.size>0)return t.getMap(o).toJSON();if(e._first!==null){let i=Xo(e._first);if(i==="text")return r?Wo(e._first):t.getText(o).toJSON();if(i==="array")return t.getArray(o).toJSON();if(i==="xml")return t.getXmlFragment(o).toJSON()}return e.toJSON()}var qo={ytext:x.Text,yxmlfragment:x.XmlFragment,yxmltext:x.XmlText,ymap:x.Map,yarray:x.Array};function Dt(t,e="",o=!1,r=""){let i={};if(e.length){if(t.share.has(e)){if(r.length){let a=qo[r];if(a)return t.get(e,a).toJSON()}return{[e]:Pt(t,t.share.get(e),e,o)}}return{[e]:""}}for(let[a,d]of t.share)i[a]=Pt(t,d,a,o);return i}var Ft=(o=>(o.PlainLson="plain-lson",o.LossyJson="json",o))(Ft||{}),ur=dr(Ft),Jt=fe(j,ar(j,X(j))),n=new nr({authorize:({req:t})=>ye(t)});function N(t){return _e({error:"ROOM_NOT_FOUND",message:`Room with id "${t}" not found.`},404)}var lr=new Qo({fields:{roomId:"string"},indexableFields:{metadata:"token"}});function mr(t){let e=lr.parse(t),o={};for(let r of e.query.allOf)switch(r.type){case"PrefixCondition":{r.field.type==="DirectField"&&r.field.ref.name==="roomId"&&(o.roomId={value:r.prefix.value,operator:"^"});break}case"ExactCondition":{r.field.type==="KeyedField"&&r.field.base.name==="metadata"&&r.value.type==="LiteralString"&&(o.metadata??={},o.metadata[r.field.key]=r.value.value);break}}return o}function Re(t){return{type:"room",id:t.id,organizationId:t.organizationId,createdAt:t.createdAt,metadata:t.metadata,defaultAccesses:t.defaultAccesses,groupsAccesses:t.groupsAccesses,usersAccesses:t.usersAccesses}}n.route("GET /v2/rooms/<roomId>",({p:t})=>{let e=C(t.roomId);if(!e)throw N(t.roomId);return Re(e)});n.route("GET /v2/rooms",({url:t})=>{let e,o=t.searchParams.get("query");if(o)try{e=mr(o)}catch(d){return _e({error:"INVALID_QUERY",message:d instanceof Error?d.message:String(d)},422)}else{let d={};for(let[c,f]of t.searchParams.entries())c.startsWith("metadata.")&&(d[c.slice(9)]=f);Object.keys(d).length>0&&(e={metadata:d})}let r=t.searchParams.get("organizationId")??void 0;return r&&(e={...e,organizationId:r}),{data:at(e).map(Re),nextPage:null,nextCursor:null}});n.route("POST /v2/rooms",be({id:j,organizationId:Y(j),defaultAccesses:Y(X(j)),metadata:Y(Jt),usersAccesses:Y(fe(j,X(j))),groupsAccesses:Y(fe(j,X(j)))}),({body:t,url:e})=>{if(!e.searchParams.has("idempotent")&&C(t.id))return _e({error:"ROOM_ALREADY_EXISTS",message:`Room with id "${t.id}" already exists.`},409);let r=Ie(t.id,{organizationId:t.organizationId,defaultAccesses:t.defaultAccesses,metadata:t.metadata,usersAccesses:t.usersAccesses,groupsAccesses:t.groupsAccesses});return Re(r)});n.route("POST /v2/rooms/<roomId>",be({defaultAccesses:Y(X(j)),metadata:Y(Jt),usersAccesses:Y(fe(j,jt(X(j)))),groupsAccesses:Y(fe(j,jt(X(j))))}),({p:t,body:e})=>{let o=dt(t.roomId,{defaultAccesses:e.defaultAccesses,metadata:e.metadata,usersAccesses:e.usersAccesses,groupsAccesses:e.groupsAccesses});if(!o)throw N(t.roomId);return Re(o)});n.route("DELETE /v2/rooms/<roomId>",async({p:t})=>(await ct(t.roomId),new Response(null,{status:204})));n.route("GET /v2/rooms/<roomId>/storage",async({url:t,p:e})=>{if(!C(e.roomId))throw N(e.roomId);let o=ur.value(t.searchParams.get("format"))??"plain-lson",r=F(e.roomId);await r.load();let i=r.storage.loadedDriver.get_snapshot(!1),a=o==="json"?tr(i):Bt(i);return new Response(JSON.stringify(a),{status:200,headers:{"Content-Type":"application/json"}})});n.route("POST /v2/rooms/<roomId>/storage",be({liveblocksType:ir("LiveObject"),data:er}).refineType(),async({p:t,body:e})=>{if(!C(t.roomId))throw N(t.roomId);let o=F(t.roomId);await o.load();let r=o.storage.loadedDriver.get_snapshot(!1),i=Bt(r);return Object.keys(i.data).length>0?new Response(JSON.stringify({error:"CANNOT_UPDATE_EXISTING_STORAGE",message:"The room already has storage data. It's only possible to initialize the storage for an empty room.",suggestion:"Create another room or clear this room storage first."}),{status:409,headers:{"Content-Type":"application/json"}}):(await o.driver.DANGEROUSLY_reset_nodes(e),o.unload(),new Response(JSON.stringify(e),{status:200,headers:{"Content-Type":"application/json"}}))});n.route("DELETE /v2/rooms/<roomId>/storage",async({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=F(t.roomId);await e.load();let o={liveblocksType:"LiveObject",data:{}};return await e.driver.DANGEROUSLY_reset_nodes(o),e.unload(),new Response(null,{status:204})});n.route("GET /v2/rooms/<roomId>/ydoc",async({url:t,p:e})=>{if(!C(e.roomId))throw N(e.roomId);let o=F(e.roomId);await o.load();let r=t.searchParams.get("key")??"",i=t.searchParams.get("type")??"",a=t.searchParams.get("guid")??Je,d=t.searchParams.get("formatting")!==null,c=new Ut(new Mt("warning")),f=await o.yjsStorage.getYDoc(c,a),v=Dt(f,r,d,i);return new Response(JSON.stringify(v),{status:200,headers:{"Content-Type":"application/json"}})});n.route("PUT /v2/rooms/<roomId>/ydoc",async({req:t,url:e,p:o})=>{if(t.headers.get("content-type")!=="application/octet-stream")return new Response(JSON.stringify({error:"BAD_REQUEST",message:'Expected "Content-Type" header to be "application/octet-stream", and the HTTP body to be a valid binary Yjs update.'}),{status:400,headers:{"Content-Type":"application/json"}});if(!C(o.roomId))throw N(o.roomId);let r=F(o.roomId);await r.load();let i=await t.arrayBuffer(),a=cr.fromUint8Array(new Uint8Array(i)),d=e.searchParams.get("guid"),f=e.searchParams.get("encoder")==="v2",v=d&&d!==Je?d:void 0;try{let b=await r.mutex.runExclusive(()=>r.yjsStorage.addYDocUpdate({},a,v,f)),g=L=>{};return r.sendToAll({type:Zo.UPDATE_YDOC,update:a,isSync:!1,stateVector:null,guid:v,v2:f,remoteSnapshotHash:b.snapshotHash},void 0,g),new Response(JSON.stringify({success:!0}),{status:200,headers:{"Content-Type":"application/json"}})}catch(b){return new Response(JSON.stringify({error:"UNPROCESSABLE_ENTITY",message:b instanceof Error?b.message:"Could not apply update",suggestion:"Please ensure the update is correct, and you selected the correct encoder to use (v1 or v2)."}),{status:422,headers:{"Content-Type":"application/json"}})}});n.route("GET /v2/rooms/<roomId>/ydoc-binary",async({url:t,p:e})=>{if(!C(e.roomId))throw N(e.roomId);let o=F(e.roomId);await o.load();let r=t.searchParams.get("guid")??Je,i=t.searchParams.get("encoder"),a=new Ut(new Mt("warning")),d=await o.yjsStorage.getYDoc(a,r),c=i==="v2"?Se.encodeStateAsUpdateV2(d):Se.encodeStateAsUpdate(d);return new Response(c,{status:200,headers:{"Content-Type":"application/octet-stream"}})});n.route("GET /v2/rooms/<roomId>/active_users",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let o=F(t.roomId).listSessions().map(r=>({type:"user",connectionId:r.actor,id:r.user.id,info:r.user.info}));return _e({data:o})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({ok:!0})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({ok:!0})});n.route("GET /v2/rooms/<roomId>/feeds",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({feeds:[{feedId:"123",metadata:{title:"Test Feed",description:"This is a test feed"},timestamp:new Date().getTime()}],nextCursor:null})});n.route("GET /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({feedId:"123",timestamp:new Date().getTime(),metadata:{title:"Test Feed",description:"This is a test feed"}})});n.route("GET /v2/rooms/<roomId>/feeds/<feedId>/messages",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({messages:[{messageId:"123",data:{content:"This is a test message"}}],nextCursor:null})});n.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=Date.now();return P({feedId:t.feedId,createdAt:e,updatedAt:e,metadata:{title:"Test Feed",description:"This is a test feed"}})});n.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=Date.now();return P({id:t.messageId,createdAt:e,updatedAt:e,data:{content:"This is a test message"}})});n.route("POST /v2/rooms/<roomId>/feeds",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({feedId:"123",timestamp:new Date().getTime(),metadata:{title:"Test Feed",description:"This is a test feed"}})});n.route("POST /v2/rooms/<roomId>/feeds/<feedId>/messages",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({id:"123",timestamp:new Date().getTime(),data:{content:"This is a test message"}})});n.route("POST /v2/rooms/<roomId>/request-storage-mutation",async({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=F(t.roomId);await e.load();let o=await e.driver.next_actor(),r=e.storage.loadedDriver.get_snapshot(!1);return sr(kt([{actor:o}],or(r)))});n.route("POST /v2/rooms/<roomId>/send-message",be({messages:X(rr)}),async({p:t,body:e})=>{if(!C(t.roomId))throw N(t.roomId);let o=F(t.roomId);await o.load();let[r,i]=await o.createBackendSession_experimental();return await o.processClientMsgFromBackendSession(r,e.messages),new Response(`{"messages":[${i.join(",")}]}`,{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})});n.route("PATCH /v2/rooms/<roomId>/storage/json-patch",()=>s()),n.route("POST /v2/rooms/<roomId>/presence",()=>s()),n.route("GET /v2/rooms/<roomId>/threads",()=>s()),n.route("POST /v2/rooms/<roomId>/upsert",()=>s()),n.route("POST /v2/rooms/<roomId>/update-room-id",()=>s()),n.route("POST /v2/rooms/<roomId>/update-organization-id",()=>s()),n.route("GET /v2/rooms/<roomId>/prewarm",()=>s()),n.route("POST /v2/rooms/<roomId>/broadcast_event",()=>s()),n.route("GET /v2/rooms/<roomId>/versions",()=>s()),n.route("GET /v2/rooms/<roomId>/version/<version>",()=>s()),n.route("POST /v2/rooms/<roomId>/version",()=>s()),n.route("POST /v2/rooms/<roomId>/threads",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/subscribe",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/subscriptions",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/metadata",()=>s()),n.route("DELETE /v2/rooms/<roomId>/threads/<threadId>",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/participants",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/inbox-notifications",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>s()),n.route("DELETE /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/add-reaction",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/remove-reaction",()=>s()),n.route("GET /v2/rooms/<roomId>/attachments/<attachmentId>",()=>s()),n.route("GET /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("GET /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("POST /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("POST /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("DELETE /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("DELETE /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("GET /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),n.route("DELETE /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),n.route("GET /v2/users/<userId>/inbox-notifications",()=>s()),n.route("DELETE /v2/users/<userId>/inbox-notifications",()=>s()),n.route("GET /v2/users/<userId>/notification-settings",()=>s()),n.route("POST /v2/users/<userId>/notification-settings",()=>s()),n.route("DELETE /v2/users/<userId>/notification-settings",()=>s()),n.route("GET /v2/users/<userId>/room-subscription-settings",()=>s()),n.route("POST /v2/inbox-notifications/trigger",()=>s()),n.route("POST /v2/inbox-notifications/<inboxNotificationId>/read",()=>s()),n.route("POST /v2/groups",()=>s()),n.route("GET /v2/groups/<groupId>",()=>s()),n.route("POST /v2/groups/<groupId>/add-members",()=>s()),n.route("POST /v2/groups/<groupId>/remove-members",()=>s()),n.route("DELETE /v2/groups/<groupId>",()=>s()),n.route("GET /v2/groups",()=>s()),n.route("GET /v2/users/<userId>/groups",()=>s()),n.route("GET /v2/ai/copilots",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/<knowledgeSourceId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>/links",()=>s()),n.route("POST /v2/ai/copilots",()=>s()),n.route("POST /v2/ai/copilots/<copilotId>",()=>s()),n.route("POST /v2/ai/copilots/<copilotId>/knowledge/web",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>",()=>s()),n.route("PUT /v2/ai/copilots/<copilotId>/knowledge/file/<fileName>",()=>s()),n.route("GET /v2/management/projects",()=>s()),n.route("GET /v2/management/projects/<projectId>",()=>s()),n.route("POST /v2/management/projects",()=>s()),n.route("POST /v2/management/projects/<projectId>",()=>s()),n.route("DELETE /v2/management/projects/<projectId>",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/delete-additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/recover-failed-messages",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/secret/roll",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/test",()=>s()),n.route("DELETE /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/activate",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/deactivate",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/roll",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/secret/roll",()=>s());function zt(t,e,o,r){if(!t.upgrade(e,{data:{refuseConnection:{code:o,message:r}}}))return new Response("Could not upgrade to WebSocket",{status:426})}var ie=new pr;ie.relay("/v2/authorize-user/*",me);ie.relay("/v2/identify-user/*",me);ie.relay("/v2/c/*",m);ie.relay("/v2/*",n);ie.relay("/*",ne);var $e=1153;function Vt(t){if(t===void 0)return;let e=Number(t);return Number.isInteger(e)&&e>0&&e<=65535?e:void 0}function hr(t){return process.platform==="win32"?[process.env.COMSPEC||"cmd.exe","/c",t]:["sh","-c",t]}function vr(t){return"'"+t.replace(/'/g,"'\\''")+"'"}var Er={description:"Start the local Liveblocks dev server",async run(t){let{options:e,args:o}=Ye(t,{port:{type:"string",short:"p",default:$e.toString()},"random-port":{type:"boolean",short:"P",default:!1},host:{type:"string"},cmd:{type:"string",short:"c"},help:{type:"boolean",short:"h",default:!1},"no-check":{type:"boolean",default:!1},ci:{type:"boolean",default:!1},verbose:{type:"boolean",short:"v",default:!1}},{allowPositionals:!0});if(o.length>0&&!e.cmd&&(console.error(de("Extra arguments are only supported with --cmd (-c)")),process.exit(1)),o.length>0&&e.cmd){let O=o.map(vr).join(" ");e.cmd.includes("{}")?e.cmd=e.cmd.replaceAll("{}",O):e.cmd+=" "+O}if(e.help){console.log("Usage: liveblocks dev [options]"),console.log(),console.log("Start the local Liveblocks dev server"),console.log(),console.log("Options:"),console.log(` --port, -p Port to listen on (default: ${$e})`),console.log(" --random-port, -P Bind a random free port instead of --port (no collisions,"),console.log(" ever). With --cmd, the chosen port is exposed to the command"),console.log(" via LIVEBLOCKS_DEV_SERVER_PORT. Ideal for CI."),console.log(" --host Host to bind to (default: localhost)"),console.log(" --cmd, -c Run a one-off command against a fresh server instance, then"),console.log(" shut down. Does not affect your local data in .liveblocks/."),console.log(" Extra args are appended to the command, or replace {} if"),console.log(" present. Use -- before args starting with -."),console.log(" --ci Start a fresh server instance on every boot, ideal for CI"),console.log(" --no-check Skip project setup check on start"),console.log(" --verbose, -v Show verbose output"),console.log(" --help, -h Show help");return}let r=!1;e.ci&&(r=!0,e["no-check"]=!0),e.cmd&&(r=!0,e["no-check"]=!0);let i=e["random-port"]?0:Vt(e.port)??Vt(process.env.LIVEBLOCKS_DEVSERVER_PORT)??$e,a=e.host||process.env.LIVEBLOCKS_DEVSERVER_HOST||"localhost",d=r?it():null;i!==0&&await wt(i,a)&&(console.error(`Port ${i} is already in use.
397
+ `;var ne=new Ko({authorize:()=>!0});ne.route("GET /v7",()=>At(426));ne.route("GET /v8",()=>At(426));ne.route("GET /health",()=>Yo({status:"ok"}));ne.route("GET /",()=>Vo(Nt.replace("__VERSION__","1.5.0")));import{ServerMsgCode as Zo}from"@liveblocks/core";import{QueryParser as Qo}from"@liveblocks/query-parser";import{ConsoleTarget as Mt,jsonObjectYolo as er,Logger as Ut,ROOT_YDOC_ID as Je,snapshotToLossyJson_eager as tr,snapshotToNodeStream as or,snapshotToPlainLson_eager as Bt,transientClientMsgDecoder as rr}from"@liveblocks/server";import{json as _e,ndjsonStream as sr,ZenRouter as nr}from"@liveblocks/zenrouter";import{array as X,constant as ir,either as ar,enum_ as dr,nullable as jt,object as be,optional as Y,record as fe,string as j}from"decoders";function*Ho(t){for(let e of t)for(let o of e)yield o}function kt(...t){return Ho(t)}import{Base64 as cr}from"js-base64";import*as Se from"yjs";import*as x from"yjs";function Xo(t){return t.content instanceof x.ContentFormat||t.content instanceof x.ContentEmbed?"text":"arr"in t.content?"array":"str"in t.content?"text":"type"in t.content?"xml":"unknown"}function Wo(t){let e=[],o=t;for(;o!==null;){if(!o.deleted)if(o.content instanceof x.ContentType)e.push(o.content.type.toJSON());else if(o.content instanceof x.ContentString)e.push(o.content.str);else if(o.content instanceof x.ContentFormat){let{key:r,value:i}=o.content;e.push({key:r,value:i})}else o.content instanceof x.ContentEmbed&&e.push(o.content.embed);o=o.right}return e}function Pt(t,e,o,r=!1){if(!e._first&&e._map instanceof Map&&e._map.size>0)return t.getMap(o).toJSON();if(e._first!==null){let i=Xo(e._first);if(i==="text")return r?Wo(e._first):t.getText(o).toJSON();if(i==="array")return t.getArray(o).toJSON();if(i==="xml")return t.getXmlFragment(o).toJSON()}return e.toJSON()}var qo={ytext:x.Text,yxmlfragment:x.XmlFragment,yxmltext:x.XmlText,ymap:x.Map,yarray:x.Array};function Dt(t,e="",o=!1,r=""){let i={};if(e.length){if(t.share.has(e)){if(r.length){let a=qo[r];if(a)return t.get(e,a).toJSON()}return{[e]:Pt(t,t.share.get(e),e,o)}}return{[e]:""}}for(let[a,d]of t.share)i[a]=Pt(t,d,a,o);return i}var Ft=(o=>(o.PlainLson="plain-lson",o.LossyJson="json",o))(Ft||{}),ur=dr(Ft),Jt=fe(j,ar(j,X(j))),n=new nr({authorize:({req:t})=>ye(t)});function N(t){return _e({error:"ROOM_NOT_FOUND",message:`Room with id "${t}" not found.`},404)}var lr=new Qo({fields:{roomId:"string"},indexableFields:{metadata:"token"}});function mr(t){let e=lr.parse(t),o={};for(let r of e.query.allOf)switch(r.type){case"PrefixCondition":{r.field.type==="DirectField"&&r.field.ref.name==="roomId"&&(o.roomId={value:r.prefix.value,operator:"^"});break}case"ExactCondition":{r.field.type==="KeyedField"&&r.field.base.name==="metadata"&&r.value.type==="LiteralString"&&(o.metadata??={},o.metadata[r.field.key]=r.value.value);break}}return o}function Re(t){return{type:"room",id:t.id,organizationId:t.organizationId,createdAt:t.createdAt,metadata:t.metadata,defaultAccesses:t.defaultAccesses,groupsAccesses:t.groupsAccesses,usersAccesses:t.usersAccesses}}n.route("GET /v2/rooms/<roomId>",({p:t})=>{let e=C(t.roomId);if(!e)throw N(t.roomId);return Re(e)});n.route("GET /v2/rooms",({url:t})=>{let e,o=t.searchParams.get("query");if(o)try{e=mr(o)}catch(d){return _e({error:"INVALID_QUERY",message:d instanceof Error?d.message:String(d)},422)}else{let d={};for(let[c,f]of t.searchParams.entries())c.startsWith("metadata.")&&(d[c.slice(9)]=f);Object.keys(d).length>0&&(e={metadata:d})}let r=t.searchParams.get("organizationId")??void 0;return r&&(e={...e,organizationId:r}),{data:at(e).map(Re),nextPage:null,nextCursor:null}});n.route("POST /v2/rooms",be({id:j,organizationId:Y(j),defaultAccesses:Y(X(j)),metadata:Y(Jt),usersAccesses:Y(fe(j,X(j))),groupsAccesses:Y(fe(j,X(j)))}),({body:t,url:e})=>{if(!e.searchParams.has("idempotent")&&C(t.id))return _e({error:"ROOM_ALREADY_EXISTS",message:`Room with id "${t.id}" already exists.`},409);let r=Ie(t.id,{organizationId:t.organizationId,defaultAccesses:t.defaultAccesses,metadata:t.metadata,usersAccesses:t.usersAccesses,groupsAccesses:t.groupsAccesses});return Re(r)});n.route("POST /v2/rooms/<roomId>",be({defaultAccesses:Y(X(j)),metadata:Y(Jt),usersAccesses:Y(fe(j,jt(X(j)))),groupsAccesses:Y(fe(j,jt(X(j))))}),({p:t,body:e})=>{let o=dt(t.roomId,{defaultAccesses:e.defaultAccesses,metadata:e.metadata,usersAccesses:e.usersAccesses,groupsAccesses:e.groupsAccesses});if(!o)throw N(t.roomId);return Re(o)});n.route("DELETE /v2/rooms/<roomId>",async({p:t})=>(await ct(t.roomId),new Response(null,{status:204})));n.route("GET /v2/rooms/<roomId>/storage",async({url:t,p:e})=>{if(!C(e.roomId))throw N(e.roomId);let o=ur.value(t.searchParams.get("format"))??"plain-lson",r=F(e.roomId);await r.load();let i=r.storage.loadedDriver.get_snapshot(!1),a=o==="json"?tr(i):Bt(i);return new Response(JSON.stringify(a),{status:200,headers:{"Content-Type":"application/json"}})});n.route("POST /v2/rooms/<roomId>/storage",be({liveblocksType:ir("LiveObject"),data:er}).refineType(),async({p:t,body:e})=>{if(!C(t.roomId))throw N(t.roomId);let o=F(t.roomId);await o.load();let r=o.storage.loadedDriver.get_snapshot(!1),i=Bt(r);return Object.keys(i.data).length>0?new Response(JSON.stringify({error:"CANNOT_UPDATE_EXISTING_STORAGE",message:"The room already has storage data. It's only possible to initialize the storage for an empty room.",suggestion:"Create another room or clear this room storage first."}),{status:409,headers:{"Content-Type":"application/json"}}):(await o.driver.DANGEROUSLY_reset_nodes(e),o.unload(),new Response(JSON.stringify(e),{status:200,headers:{"Content-Type":"application/json"}}))});n.route("DELETE /v2/rooms/<roomId>/storage",async({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=F(t.roomId);await e.load();let o={liveblocksType:"LiveObject",data:{}};return await e.driver.DANGEROUSLY_reset_nodes(o),e.unload(),new Response(null,{status:204})});n.route("GET /v2/rooms/<roomId>/ydoc",async({url:t,p:e})=>{if(!C(e.roomId))throw N(e.roomId);let o=F(e.roomId);await o.load();let r=t.searchParams.get("key")??"",i=t.searchParams.get("type")??"",a=t.searchParams.get("guid")??Je,d=t.searchParams.get("formatting")!==null,c=new Ut(new Mt("warning")),f=await o.yjsStorage.getYDoc(c,a),v=Dt(f,r,d,i);return new Response(JSON.stringify(v),{status:200,headers:{"Content-Type":"application/json"}})});n.route("PUT /v2/rooms/<roomId>/ydoc",async({req:t,url:e,p:o})=>{if(t.headers.get("content-type")!=="application/octet-stream")return new Response(JSON.stringify({error:"BAD_REQUEST",message:'Expected "Content-Type" header to be "application/octet-stream", and the HTTP body to be a valid binary Yjs update.'}),{status:400,headers:{"Content-Type":"application/json"}});if(!C(o.roomId))throw N(o.roomId);let r=F(o.roomId);await r.load();let i=await t.arrayBuffer(),a=cr.fromUint8Array(new Uint8Array(i)),d=e.searchParams.get("guid"),f=e.searchParams.get("encoder")==="v2",v=d&&d!==Je?d:void 0;try{let b=await r.mutex.runExclusive(()=>r.yjsStorage.addYDocUpdate({},a,v,f)),g=L=>{};return r.sendToAll({type:Zo.UPDATE_YDOC,update:a,isSync:!1,stateVector:null,guid:v,v2:f,remoteSnapshotHash:b.snapshotHash},void 0,g),new Response(JSON.stringify({success:!0}),{status:200,headers:{"Content-Type":"application/json"}})}catch(b){return new Response(JSON.stringify({error:"UNPROCESSABLE_ENTITY",message:b instanceof Error?b.message:"Could not apply update",suggestion:"Please ensure the update is correct, and you selected the correct encoder to use (v1 or v2)."}),{status:422,headers:{"Content-Type":"application/json"}})}});n.route("GET /v2/rooms/<roomId>/ydoc-binary",async({url:t,p:e})=>{if(!C(e.roomId))throw N(e.roomId);let o=F(e.roomId);await o.load();let r=t.searchParams.get("guid")??Je,i=t.searchParams.get("encoder"),a=new Ut(new Mt("warning")),d=await o.yjsStorage.getYDoc(a,r),c=i==="v2"?Se.encodeStateAsUpdateV2(d):Se.encodeStateAsUpdate(d);return new Response(c,{status:200,headers:{"Content-Type":"application/octet-stream"}})});n.route("GET /v2/rooms/<roomId>/active_users",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let o=F(t.roomId).listSessions().map(r=>({type:"user",connectionId:r.actor,id:r.user.id,info:r.user.info}));return _e({data:o})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({ok:!0})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({ok:!0})});n.route("GET /v2/rooms/<roomId>/feeds",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({feeds:[{feedId:"123",metadata:{title:"Test Feed",description:"This is a test feed"},timestamp:new Date().getTime()}],nextCursor:null})});n.route("GET /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({feedId:"123",timestamp:new Date().getTime(),metadata:{title:"Test Feed",description:"This is a test feed"}})});n.route("GET /v2/rooms/<roomId>/feeds/<feedId>/messages",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({messages:[{messageId:"123",data:{content:"This is a test message"}}],nextCursor:null})});n.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=Date.now();return P({feedId:t.feedId,createdAt:e,updatedAt:e,metadata:{title:"Test Feed",description:"This is a test feed"}})});n.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=Date.now();return P({id:t.messageId,createdAt:e,updatedAt:e,data:{content:"This is a test message"}})});n.route("POST /v2/rooms/<roomId>/feeds",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({feedId:"123",timestamp:new Date().getTime(),metadata:{title:"Test Feed",description:"This is a test feed"}})});n.route("POST /v2/rooms/<roomId>/feeds/<feedId>/messages",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({id:"123",timestamp:new Date().getTime(),data:{content:"This is a test message"}})});n.route("POST /v2/rooms/<roomId>/request-storage-mutation",async({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=F(t.roomId);await e.load();let o=await e.driver.next_actor(),r=e.storage.loadedDriver.get_snapshot(!1);return sr(kt([{actor:o}],or(r)))});n.route("POST /v2/rooms/<roomId>/send-message",be({messages:X(rr)}),async({p:t,body:e})=>{if(!C(t.roomId))throw N(t.roomId);let o=F(t.roomId);await o.load();let[r,i]=await o.createBackendSession_experimental();return await o.processClientMsgFromBackendSession(r,e.messages),new Response(`{"messages":[${i.join(",")}]}`,{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})});n.route("PATCH /v2/rooms/<roomId>/storage/json-patch",()=>s()),n.route("POST /v2/rooms/<roomId>/presence",()=>s()),n.route("GET /v2/rooms/<roomId>/threads",()=>s()),n.route("POST /v2/rooms/<roomId>/upsert",()=>s()),n.route("POST /v2/rooms/<roomId>/update-room-id",()=>s()),n.route("POST /v2/rooms/<roomId>/update-organization-id",()=>s()),n.route("GET /v2/rooms/<roomId>/prewarm",()=>s()),n.route("POST /v2/rooms/<roomId>/broadcast_event",()=>s()),n.route("GET /v2/rooms/<roomId>/versions",()=>s()),n.route("GET /v2/rooms/<roomId>/version/<version>",()=>s()),n.route("POST /v2/rooms/<roomId>/version",()=>s()),n.route("POST /v2/rooms/<roomId>/threads",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/subscribe",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/subscriptions",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/metadata",()=>s()),n.route("DELETE /v2/rooms/<roomId>/threads/<threadId>",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/participants",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/inbox-notifications",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>s()),n.route("DELETE /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/add-reaction",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/remove-reaction",()=>s()),n.route("GET /v2/rooms/<roomId>/attachments/<attachmentId>",()=>s()),n.route("GET /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("GET /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("POST /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("POST /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("DELETE /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("DELETE /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("GET /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),n.route("DELETE /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),n.route("GET /v2/users/<userId>/inbox-notifications",()=>s()),n.route("DELETE /v2/users/<userId>/inbox-notifications",()=>s()),n.route("GET /v2/users/<userId>/notification-settings",()=>s()),n.route("POST /v2/users/<userId>/notification-settings",()=>s()),n.route("DELETE /v2/users/<userId>/notification-settings",()=>s()),n.route("GET /v2/users/<userId>/room-subscription-settings",()=>s()),n.route("POST /v2/inbox-notifications/trigger",()=>s()),n.route("POST /v2/inbox-notifications/<inboxNotificationId>/read",()=>s()),n.route("POST /v2/groups",()=>s()),n.route("GET /v2/groups/<groupId>",()=>s()),n.route("POST /v2/groups/<groupId>/add-members",()=>s()),n.route("POST /v2/groups/<groupId>/remove-members",()=>s()),n.route("DELETE /v2/groups/<groupId>",()=>s()),n.route("GET /v2/groups",()=>s()),n.route("GET /v2/users/<userId>/groups",()=>s()),n.route("GET /v2/ai/copilots",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/<knowledgeSourceId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>/links",()=>s()),n.route("POST /v2/ai/copilots",()=>s()),n.route("POST /v2/ai/copilots/<copilotId>",()=>s()),n.route("POST /v2/ai/copilots/<copilotId>/knowledge/web",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>",()=>s()),n.route("PUT /v2/ai/copilots/<copilotId>/knowledge/file/<fileName>",()=>s()),n.route("GET /v2/management/projects",()=>s()),n.route("GET /v2/management/projects/<projectId>",()=>s()),n.route("POST /v2/management/projects",()=>s()),n.route("POST /v2/management/projects/<projectId>",()=>s()),n.route("DELETE /v2/management/projects/<projectId>",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/delete-additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/recover-failed-messages",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/secret/roll",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/test",()=>s()),n.route("DELETE /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/activate",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/deactivate",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/roll",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/secret/roll",()=>s());function zt(t,e,o,r){if(!t.upgrade(e,{data:{refuseConnection:{code:o,message:r}}}))return new Response("Could not upgrade to WebSocket",{status:426})}var ie=new pr;ie.relay("/v2/authorize-user/*",me);ie.relay("/v2/identify-user/*",me);ie.relay("/v2/c/*",m);ie.relay("/v2/*",n);ie.relay("/*",ne);var $e=1153;function Vt(t){if(t===void 0)return;let e=Number(t);return Number.isInteger(e)&&e>0&&e<=65535?e:void 0}function hr(t){return process.platform==="win32"?[process.env.COMSPEC||"cmd.exe","/c",t]:["sh","-c",t]}function vr(t){return"'"+t.replace(/'/g,"'\\''")+"'"}var Er={description:"Start the local Liveblocks dev server",async run(t){let{options:e,args:o}=Ye(t,{port:{type:"string",short:"p",default:$e.toString()},"random-port":{type:"boolean",short:"P",default:!1},host:{type:"string"},cmd:{type:"string",short:"c"},help:{type:"boolean",short:"h",default:!1},"no-check":{type:"boolean",default:!1},ci:{type:"boolean",default:!1},verbose:{type:"boolean",short:"v",default:!1}},{allowPositionals:!0});if(o.length>0&&!e.cmd&&(console.error(de("Extra arguments are only supported with --cmd (-c)")),process.exit(1)),o.length>0&&e.cmd){let O=o.map(vr).join(" ");e.cmd.includes("{}")?e.cmd=e.cmd.replaceAll("{}",O):e.cmd+=" "+O}if(e.help){console.log("Usage: liveblocks dev [options]"),console.log(),console.log("Start the local Liveblocks dev server"),console.log(),console.log("Options:"),console.log(` --port, -p Port to listen on (default: ${$e})`),console.log(" --random-port, -P Bind a random free port instead of --port (no collisions,"),console.log(" ever). With --cmd, the chosen port is exposed to the command"),console.log(" via LIVEBLOCKS_DEV_SERVER_PORT. Ideal for CI."),console.log(" --host Host to bind to (default: localhost)"),console.log(" --cmd, -c Run a one-off command against a fresh server instance, then"),console.log(" shut down. Does not affect your local data in .liveblocks/."),console.log(" Extra args are appended to the command, or replace {} if"),console.log(" present. Use -- before args starting with -."),console.log(" --ci Start a fresh server instance on every boot, ideal for CI"),console.log(" --no-check Skip project setup check on start"),console.log(" --verbose, -v Show verbose output"),console.log(" --help, -h Show help");return}let r=!1;e.ci&&(r=!0,e["no-check"]=!0),e.cmd&&(r=!0,e["no-check"]=!0);let i=e["random-port"]?0:Vt(e.port)??Vt(process.env.LIVEBLOCKS_DEVSERVER_PORT)??$e,a=e.host||process.env.LIVEBLOCKS_DEVSERVER_HOST||"localhost",d=r?it():null;i!==0&&await wt(i,a)&&(console.error(`Port ${i} is already in use.
398
398
  Is another dev server already running?`),process.exit(1));let c,f=!1,v=i;function b(){let O=Ge.serve({hostname:a,port:v,async fetch(T,w){if(T.headers.get("Upgrade")==="websocket"){let G=_t(T);if(!G.ok)return Me(G.xwarn,!0),zt(w,T,$t.NOT_ALLOWED,"You have no access to this room");let{roomId:K,ticketData:A}=G;if(lt(K))return zt(w,T,$t.TRY_AGAIN_LATER,"Server is undergoing maintenance, try again later");let k=F(K);await k.load();let z=await k.createTicket(A),pe=z.sessionKey;if(w.upgrade(T,{data:{room:k,ticket:z,sessionKey:pe}})){console.log(`${J("101")} WS ${new URL(T.url).pathname}${p(` - ${K}`)}`);return}return new Response("Could not upgrade to WebSocket",{status:426})}let l=new URL(T.url);if(T.method==="POST"&&l.pathname==="/crash")return console.log(`${J("204")} POST /crash`),setTimeout(()=>{g()},0),new Response(null,{status:204});let u=`${T.method} ${l.pathname}`,h;if(f)try{h=await T.clone().text()}catch{}let y=await ie.fetch(T),S=y.status,U=S>=500?de(S):S>=400?ee(S):J(S);console.log(`${U} ${u}`);let _=y.headers.get("X-LB-Warn")??void 0;if(Me(_,!y.ok),f){if(h){let A=Gt(h);A!==void 0&&console.log(p(` \u2192 ${JSON.stringify(A)}`))}let G=await y.clone().text(),K=Gt(G);K!==void 0&&console.log(p(` \u2190 ${JSON.stringify(K)}`))}return y},error(T){return console.error(T),new Response("An unknown error occurred",{status:500})},websocket:{async open(T){let{refuseConnection:w,room:l,ticket:u}=T.data;if(w){T.close(w.code,w.message);return}l&&u&&await l.startBrowserSession(u,T)},async message(T,w){let{room:l,sessionKey:u}=T.data;l&&u&&await l.handleData(u,w)},close(T,w,l){let{room:u,sessionKey:h}=T.data;u&&h&&u.endBrowserSession(h,w,l)}}});return v=O.port,O}c=b();async function g(){ft(),await c.stop(!0),c=b(),console.log("Crash \u{1F4A5}")}let L=O=>process.stderr.write(O+`
399
- `);if(e.cmd){L(`Liveblocks dev server ${p("v1.5.0-rc2")} running at http://${c.hostname}:${c.port}`),d&&e.verbose&&L(p(`Ephemeral mode, using ${d}`));let O=gr(d,"server.log");L(p(`Server logs: ${O}`));let T=Ge.file(O).writer(),w=(...u)=>{T.write(u.map(String).join(" ")+`
399
+ `);if(e.cmd){L(`Liveblocks dev server ${p("v1.5.0")} running at http://${c.hostname}:${c.port}`),d&&e.verbose&&L(p(`Ephemeral mode, using ${d}`));let O=gr(d,"server.log");L(p(`Server logs: ${O}`));let T=Ge.file(O).writer(),w=(...u)=>{T.write(u.map(String).join(" ")+`
400
400
  `),T.flush()};console.log=w,console.error=w;let l=1;try{let u=Ge.spawn(hr(e.cmd),{stdin:"inherit",stdout:"inherit",stderr:"inherit",env:{...process.env,LIVEBLOCKS_DEV_SERVER_HOST:a,LIVEBLOCKS_DEV_SERVER_PORT:String(c.port)}}),h=()=>{u.kill()};process.on("SIGTERM",h),process.on("SIGINT",h),l=await u.exited}finally{T.end(),await c.stop(),xe(),L(p("Liveblocks dev server shut down"))}process.exit(l)}else{let O=`http://${a}:${c.port}`,T=e["no-check"]?[]:await St(O),w="logs",l=null,u=null,h=null,y=`http://${c.hostname}:${c.port}`,S=()=>{let R=w==="logs"?D(" Logs "):p(" Logs "),I=w==="sockets"?D(" Sockets "):p(" Sockets "),E=R+p("|")+I,ae=(u?H("\u23F8 maintenance")+" ":"")+p(`Liveblocks running at ${y}`),Oe=process.stdout.columns??80,we=Math.max(1,Oe-Ce(E).length-Ce(ae).length);return E+" ".repeat(we)+ae},U=[],_=console.log.bind(console);console.log=(...R)=>{let I=R.map(String).join(" ");U.push(I),w==="logs"&&_(I)};let G=()=>p(" ")+D("q")+p(" quit, ")+D("!")+p(" crash, ")+D("c")+p(" clear, ")+D("v")+p(f?" verbose (on)":" verbose"),K=()=>{h&&(clearInterval(h),h=null),w="logs",process.stdout.write("\x1B[2J\x1B[H"),_(S()),_(G()),_();for(let R of U)_(R)},A=0,k=[],z=R=>`${R.roomId}:${R.actor}`,pe=()=>{k=ue().map(R=>({...R,alive:!0}))},ze=()=>{let R=new Set(ue().map(z));for(let E of k)E.alive=R.has(z(E));let I=new Set(k.map(z));for(let E of ue())I.has(z(E))||k.push({...E,alive:!0})},Yt=R=>{let I=Date.now()-R,E=Math.floor(I/1e3);if(E<60)return`${E}s`;let M=Math.floor(E/60);return M<60?`${M}m`:`${Math.floor(M/60)}h`},Kt=R=>{if(!R)return"";let I=Date.now()-R;return I<1e3?" "+J("\u25CF"):I<3e3?" "+p(J("\u25CF")):I<5e3?" "+p("\u25CF"):""},ge=(R,I)=>{let E=R+I;for(;E>=0&&E<k.length;){if(k[E].alive)return E;E+=I}return R},W=()=>{ze();let R=k.filter(E=>E.alive).length;if(process.stdout.write("\x1B[2J\x1B[H"),_(S()),_(p(" ")+D("\u2191\u2193")+p(" navigate, ")+D("k")+p(" kill, ")+D("m")+p(u?" maintenance off, ":" maintenance on, ")+D("r")+p(" refresh")),_(),_(" "+D("Connections")+p(` (${R} alive)`)),_(),k.length===0){_(p(" No active connections"));return}if(A>=k.length&&(A=k.length-1),!k[A]?.alive){let E=ge(A,-1);A=k[E]?.alive?E:ge(A,1)}let I=new Map;for(let E of ue())I.set(z(E),E.lastActiveAt);for(let E=0;E<k.length;E++){let M=k[E];if(!M.alive){_(p(` ${M.roomId} \xB7 actor=${M.actor} \xB7 disconnected`));continue}let ae=E===A?J("\u25B6 "):" ",Oe=M.userId??p("anonymous"),we=Yt(M.connectedAt),Wt=I.get(z(M)),qt=Kt(Wt);_(`${ae}${D(M.roomId)} ${p("\xB7")} actor=${M.actor} ${p("\xB7")} ${Oe} ${p("\xB7")} ${p(we)}${qt}`)}},Ht=()=>{w="sockets",A=0,pe(),W(),h=setInterval(()=>W(),1e3)},Xt=()=>{if(u)u(),u=null;else{let{promise:R,resolve:I}=fr();ut(R),u=I}};process.stdout.write("\x1B[2J\x1B[H"),_(S()),_(G()),_(),d&&e.verbose&&console.log(p(`Ephemeral mode, using ${d}`)),process.stdin.setRawMode?.(!0),process.stdin.resume(),process.stdin.on("data",R=>{let I=R.toString();if(I===""||I==="q"){c.stop(!0).then(()=>{xe(),process.exit(0)});return}if(I==="m"){Xt(),w==="sockets"?W():(process.stdout.write("\x1B[s\x1B[H\x1B[2K"),_(S()),process.stdout.write("\x1B[u"));return}if((I==="s"||I==="\x1B[C")&&w!=="sockets"){Ht();return}if((I==="l"||I==="\x1B[D")&&w!=="logs"){K();return}if(w==="sockets"){if(I==="\x1B[A")A=ge(A,-1),W();else if(I==="\x1B[B")A=ge(A,1),W();else if(I==="k"){let E=k[A];E?.alive&&(mt(E.roomId,E.actor),W())}else I==="r"&&(pe(),A=0,W());return}if(I==="!")l!==null?(clearTimeout(l),l=null,g()):(console.log("Simulating crash in 2.5s... (press ! again to crash now)"),l=setTimeout(()=>{l=null,g()},2500));else if(I==="c")U.length=0,process.stdout.write("\x1B[2J\x1B[H"),_(S()),_(G()),_();else if(I==="v")f=!f,process.stdout.write("\x1B[s\x1B[H\x1B[2K"),_(S()),process.stdout.write("\x1B[2K"),_(G()),process.stdout.write("\x1B[u"),console.log(p(f?"Verbose mode on":"Verbose mode off"));else if(I==="p")if(T.length>0){let E=Rt(T,O);Ot(E),console.log(p("Copied AI fix prompt to clipboard"))}else console.log(p("No setup issues detected"))})}}},Vs=Er;export{Vs as default};
401
401
  /*! Bundled license information:
402
402
 
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{i as r}from"./chunk-ZFPKG3IB.js";import{execFileSync as l,spawnSync as c}from"child_process";function a(){try{return l("bun",["--version"],{stdio:"ignore"}),!0}catch{return!1}}function d(){if(a()){let e=c("bun",process.argv.slice(1),{stdio:"inherit"});process.exit(e.status??1)}else console.error("The Liveblocks local dev server requires Bun."),console.error("See https://liveblocks.io/docs/get-started/dev-server for more information."),process.exit(1)}var s=process.argv.slice(2),o=s.findIndex(e=>!e.startsWith("-")),{options:t}=r(o>=0?s.slice(0,o):s,{help:{type:"boolean",short:"h",default:!1},version:{type:"boolean",default:!1}}),n=o>=0?s[o]:void 0,u=o>=0?s.slice(o+1):[];async function p(e){switch(e){case"dev":return typeof Bun>"u"&&d(),(await import("./dev-server-2XWU56GJ.js")).default;case"upgrade":return(await import("./upgrade-QCUVOTDV.js")).default;default:return}}var m={dev:"Start the local Liveblocks dev server",upgrade:"Upgrade all Liveblocks packages"};function f(){console.log("liveblocks v1.5.0-rc2"),console.log(),console.log("Usage: liveblocks <command> [options]"),console.log(),console.log("Commands:");for(let[e,i]of Object.entries(m))console.log(` ${e.padEnd(12)} ${i}`);console.log(),console.log("Options:"),console.log(" --help, -h Show this help message"),console.log(" --version Show version number")}async function v(){t.version&&(console.log("1.5.0-rc2"),process.exit(0)),(t.help||!n)&&(f(),process.exit(n?0:1));let e=await p(n);e?await e.run(u):(console.error(`Unknown command: ${n}`),console.error('Run "liveblocks --help" for usage.'),process.exit(1))}v();
2
+ import{i as r}from"./chunk-ZFPKG3IB.js";import{execFileSync as l,spawnSync as c}from"child_process";function a(){try{return l("bun",["--version"],{stdio:"ignore"}),!0}catch{return!1}}function d(){if(a()){let e=c("bun",process.argv.slice(1),{stdio:"inherit"});process.exit(e.status??1)}else console.error("The Liveblocks local dev server requires Bun."),console.error("See https://liveblocks.io/docs/get-started/dev-server for more information."),process.exit(1)}var s=process.argv.slice(2),o=s.findIndex(e=>!e.startsWith("-")),{options:t}=r(o>=0?s.slice(0,o):s,{help:{type:"boolean",short:"h",default:!1},version:{type:"boolean",default:!1}}),n=o>=0?s[o]:void 0,u=o>=0?s.slice(o+1):[];async function p(e){switch(e){case"dev":return typeof Bun>"u"&&d(),(await import("./dev-server-NCXLW4H4.js")).default;case"upgrade":return(await import("./upgrade-QCUVOTDV.js")).default;default:return}}var m={dev:"Start the local Liveblocks dev server",upgrade:"Upgrade all Liveblocks packages"};function f(){console.log("liveblocks v1.5.0"),console.log(),console.log("Usage: liveblocks <command> [options]"),console.log(),console.log("Commands:");for(let[e,i]of Object.entries(m))console.log(` ${e.padEnd(12)} ${i}`);console.log(),console.log("Options:"),console.log(" --help, -h Show this help message"),console.log(" --version Show version number")}async function v(){t.version&&(console.log("1.5.0"),process.exit(0)),(t.help||!n)&&(f(),process.exit(n?0:1));let e=await p(n);e?await e.run(u):(console.error(`Unknown command: ${n}`),console.error('Run "liveblocks --help" for usage.'),process.exit(1))}v();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "liveblocks",
3
- "version": "1.5.0-rc2",
3
+ "version": "1.5.0",
4
4
  "description": "Liveblocks command line interface",
5
5
  "type": "module",
6
6
  "bin": {
@@ -42,7 +42,7 @@
42
42
  "js-base64": "^3.7.5",
43
43
  "yjs": "^13.6.10",
44
44
  "@liveblocks/query-parser": "^0.1.1",
45
- "@liveblocks/server": "^1.5.0-rc2"
45
+ "@liveblocks/server": "^1.5.0"
46
46
  },
47
47
  "scripts": {
48
48
  "build": "tsup",