liveblocks 1.0.11 → 1.0.13

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.
@@ -358,7 +358,7 @@ that the user can disable this by setting it to "false".`}import{execSync as lo}
358
358
  </main>
359
359
  </body>
360
360
  </html>
361
- `;var M=new xo({authorize:()=>!0});M.route("GET /v7",()=>Ne(426));M.route("GET /v8",()=>Ne(426));M.route("GET /health",()=>Oo({status:"ok"}));M.route("GET /",()=>Co(Pe.replace("__VERSION__","1.0.11")));import{jsonObjectYolo as Ro,ROOT_YDOC_ID as Q,snapshotToLossyJson_eager as Po,snapshotToPlainLson_eager as Ae}from"@liveblocks/server";import{json as No,ZenRouter as Do}from"@liveblocks/zenrouter";import{constant as jo,enum_ as Ao,object as Ue,string as Uo}from"decoders";import{Base64 as Mo}from"js-base64";import*as X from"yjs";import*as E from"yjs";function _o(o){return o.content instanceof E.ContentFormat||o.content instanceof E.ContentEmbed?"text":"arr"in o.content?"array":"str"in o.content?"text":"type"in o.content?"xml":"unknown"}function Lo(o){let e=[],t=o;for(;t!==null;){if(!t.deleted)if(t.content instanceof E.ContentType)e.push(t.content.type.toJSON());else if(t.content instanceof E.ContentString)e.push(t.content.str);else if(t.content instanceof E.ContentFormat){let{key:n,value:i}=t.content;e.push({key:n,value:i})}else t.content instanceof E.ContentEmbed&&e.push(t.content.embed);t=t.right}return e}function De(o,e,t,n=!1){if(!e._first&&e._map instanceof Map&&e._map.size>0)return o.getMap(t).toJSON();if(e._first!==null){let i=_o(e._first);if(i==="text")return n?Lo(e._first):o.getText(t).toJSON();if(i==="array")return o.getArray(t).toJSON();if(i==="xml")return o.getXmlFragment(t).toJSON()}return e.toJSON()}var ko={ytext:E.Text,yxmlfragment:E.XmlFragment,yxmltext:E.XmlText,ymap:E.Map,yarray:E.Array};function je(o,e="",t=!1,n=""){let i={};if(e.length){if(o.share.has(e)){if(n.length){let d=ko[n];if(d)return o.get(e,d).toJSON()}return{[e]:De(o,o.share.get(e),e,t)}}return{[e]:""}}for(let[d,c]of o.share)i[d]=De(o,c,d,t);return i}var Me=(t=>(t.PlainLson="plain-lson",t.LossyJson="json",t))(Me||{}),Bo=Ao(Me),s=new Do({authorize:({req:o})=>F(o)});function D(o){return No({error:"ROOM_NOT_FOUND",message:`Room with id "${o}" not found.`},404)}s.route("GET /v2/rooms/<roomId>",async({p:o})=>{if(!await C(o.roomId))throw D(o.roomId);return{type:"room",id:o.roomId,createdAt:new Date().toISOString(),metadata:{},defaultAccesses:["room:write"],groupsAccesses:{},usersAccesses:{}}});s.route("GET /v2/rooms",()=>{let e=Ee().map(t=>({type:"room",id:t,createdAt:new Date().toISOString(),metadata:{},defaultAccesses:["room:write"],groupsAccesses:{},usersAccesses:{}}));return Y({data:e,nextPage:null,nextCursor:null},200,"The Liveblocks dev server doesn't implement room permissions or pagination yet.")});s.route("POST /v2/rooms",Ue({id:Uo}),async({body:o})=>{if(await C(o.id))return new Response(JSON.stringify({error:"ROOM_ALREADY_EXISTS",message:`Room with id "${o.id}" already exists.`}),{status:409,headers:{"Content-Type":"application/json"}});try{await Te(o.id)}catch(t){if(t instanceof Error&&t.message.includes("already exists"))return new Response(JSON.stringify({error:"ROOM_ALREADY_EXISTS",message:`Room with id "${o.id}" already exists.`}),{status:409,headers:{"Content-Type":"application/json"}});throw t}return{type:"room",id:o.id,createdAt:new Date().toISOString(),metadata:{},defaultAccesses:["room:write"],groupsAccesses:{},usersAccesses:{}}});s.route("POST /v2/rooms/<roomId>",()=>r());s.route("DELETE /v2/rooms/<roomId>",async({p:o})=>(await be(o.roomId),new Response(null,{status:204})));s.route("GET /v2/rooms/<roomId>/storage",async({url:o,p:e})=>{if(!await C(e.roomId))throw D(e.roomId);let n=Bo.value(o.searchParams.get("format"))??"plain-lson",i=_(e.roomId);await i.load();let d=i.storage.loadedDriver.get_snapshot(!1),c=n==="json"?Po(d):Ae(d);return new Response(JSON.stringify(c),{status:200,headers:{"Content-Type":"application/json"}})});s.route("POST /v2/rooms/<roomId>/storage",Ue({liveblocksType:jo("LiveObject"),data:Ro}).refineType(),async({p:o,body:e})=>{if(!await C(o.roomId))throw D(o.roomId);let n=_(o.roomId);await n.load();let i=n.storage.loadedDriver.get_snapshot(!1),d=Ae(i);return Object.keys(d.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 n.driver.DANGEROUSLY_reset_nodes(e),n.unload(),new Response(JSON.stringify(e),{status:200,headers:{"Content-Type":"application/json"}}))});s.route("DELETE /v2/rooms/<roomId>/storage",async({p:o})=>{if(!await C(o.roomId))throw D(o.roomId);let t=_(o.roomId);await t.load();let n={liveblocksType:"LiveObject",data:{}};return await t.driver.DANGEROUSLY_reset_nodes(n),t.unload(),new Response(null,{status:204})});s.route("GET /v2/rooms/<roomId>/ydoc",async({url:o,p:e})=>{if(!await C(e.roomId))throw D(e.roomId);let n=_(e.roomId);await n.load();let i=o.searchParams.get("key")??"",d=o.searchParams.get("type")??"",c=o.searchParams.get("guid")??Q,l=o.searchParams.get("formatting")!==null,m=await n.yjsStorage.getYDoc(c),u=je(m,i,l,d);return new Response(JSON.stringify(u),{status:200,headers:{"Content-Type":"application/json"}})});s.route("PUT /v2/rooms/<roomId>/ydoc",async({req:o,url:e,p:t})=>{if(o.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(!await C(t.roomId))throw D(t.roomId);let i=_(t.roomId);await i.load();let d=await o.arrayBuffer(),c=Mo.fromUint8Array(new Uint8Array(d)),l=e.searchParams.get("guid"),u=e.searchParams.get("encoder")==="v2",f=l&&l!==Q?l:void 0;try{return await i.mutex.runExclusive(()=>i.yjsStorage.addYDocUpdate({},c,f,u)),new Response(JSON.stringify({success:!0}),{status:200,headers:{"Content-Type":"application/json"}})}catch(h){return new Response(JSON.stringify({error:"UNPROCESSABLE_ENTITY",message:h instanceof Error?h.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"}})}});s.route("GET /v2/rooms/<roomId>/ydoc-binary",async({url:o,p:e})=>{if(!await C(e.roomId))throw D(e.roomId);let n=_(e.roomId);await n.load();let i=o.searchParams.get("guid")??Q,d=o.searchParams.get("encoder"),c=await n.yjsStorage.getYDoc(i),l=d==="v2"?X.encodeStateAsUpdateV2(c):X.encodeStateAsUpdate(c);return new Response(l,{status:200,headers:{"Content-Type":"application/octet-stream"}})});s.route("PATCH /v2/rooms/<roomId>/storage/json-patch",()=>r()),s.route("POST /v2/rooms/<roomId>/presence",()=>r()),s.route("GET /v2/rooms/<roomId>/threads",()=>r()),s.route("POST /v2/rooms/<roomId>/upsert",()=>r()),s.route("POST /v2/rooms/<roomId>/update-room-id",()=>r()),s.route("POST /v2/rooms/<roomId>/update-tenant-id",()=>r()),s.route("POST /v2/rooms/<roomId>/update-organization-id",()=>r()),s.route("GET /v2/rooms/<roomId>/prewarm",()=>r()),s.route("POST /v2/rooms/<roomId>/request-storage-mutation",()=>r()),s.route("GET /v2/rooms/<roomId>/rippling/text-editor",()=>r()),s.route("POST /v2/rooms/<roomId>/rippling/text-editor",()=>r()),s.route("GET /v2/rooms/<roomId>/active_users",()=>r()),s.route("POST /v2/rooms/<roomId>/send-message",()=>r()),s.route("POST /v2/rooms/<roomId>/broadcast_event",()=>r()),s.route("GET /v2/rooms/<roomId>/versions",()=>r()),s.route("GET /v2/rooms/<roomId>/version/<version>",()=>r()),s.route("POST /v2/rooms/<roomId>/version",()=>r()),s.route("POST /v2/rooms/<roomId>/threads",()=>r()),s.route("GET /v2/rooms/<roomId>/threads/<threadId>",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/subscribe",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>r()),s.route("GET /v2/rooms/<roomId>/threads/<threadId>/subscriptions",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/metadata",()=>r()),s.route("DELETE /v2/rooms/<roomId>/threads/<threadId>",()=>r()),s.route("GET /v2/rooms/<roomId>/threads/<threadId>/participants",()=>r()),s.route("GET /v2/rooms/<roomId>/threads/<threadId>/inbox-notifications",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments",()=>r()),s.route("GET /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>r()),s.route("DELETE /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/add-reaction",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/remove-reaction",()=>r()),s.route("GET /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>r()),s.route("GET /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>r()),s.route("POST /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>r()),s.route("POST /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>r()),s.route("DELETE /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>r()),s.route("DELETE /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>r()),s.route("GET /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>r()),s.route("DELETE /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>r()),s.route("GET /v2/users/<userId>/inbox-notifications",()=>r()),s.route("DELETE /v2/users/<userId>/inbox-notifications",()=>r()),s.route("GET /v2/users/<userId>/notification-settings",()=>r()),s.route("POST /v2/users/<userId>/notification-settings",()=>r()),s.route("DELETE /v2/users/<userId>/notification-settings",()=>r()),s.route("GET /v2/users/<userId>/room-subscription-settings",()=>r()),s.route("GET /v2/users/<userId>/threads",()=>r()),s.route("POST /v2/inbox-notifications/trigger",()=>r()),s.route("POST /v2/inbox-notifications/<inboxNotificationId>/read",()=>r()),s.route("GET /v2/threads",()=>r()),s.route("POST /v2/groups",()=>r()),s.route("GET /v2/groups/<groupId>",()=>r()),s.route("POST /v2/groups/<groupId>/add-members",()=>r()),s.route("POST /v2/groups/<groupId>/remove-members",()=>r()),s.route("DELETE /v2/groups/<groupId>",()=>r()),s.route("GET /v2/groups",()=>r()),s.route("GET /v2/users/<userId>/groups",()=>r()),s.route("GET /v2/ai/copilots",()=>r()),s.route("GET /v2/ai/copilots/<copilotId>",()=>r()),s.route("GET /v2/ai/copilots/<copilotId>/knowledge",()=>r()),s.route("GET /v2/ai/copilots/<copilotId>/knowledge/<knowledgeSourceId>",()=>r()),s.route("GET /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>r()),s.route("GET /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>/links",()=>r()),s.route("POST /v2/ai/copilots",()=>r()),s.route("POST /v2/ai/copilots/<copilotId>",()=>r()),s.route("POST /v2/ai/copilots/<copilotId>/knowledge/web",()=>r()),s.route("DELETE /v2/ai/copilots/<copilotId>",()=>r()),s.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>r()),s.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>",()=>r()),s.route("PUT /v2/ai/copilots/<copilotId>/knowledge/file/<fileName>",()=>r()),s.route("GET /v2/management/projects",()=>r()),s.route("GET /v2/management/projects/<projectId>",()=>r()),s.route("POST /v2/management/projects",()=>r()),s.route("POST /v2/management/projects/<projectId>",()=>r()),s.route("DELETE /v2/management/projects/<projectId>",()=>r()),s.route("GET /v2/management/projects/<projectId>/webhooks",()=>r()),s.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>r()),s.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/delete-additional-headers",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/recover-failed-messages",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/secret/roll",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/test",()=>r()),s.route("DELETE /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>r()),s.route("POST /v2/management/projects/<projectId>/api-keys/public/activate",()=>r()),s.route("POST /v2/management/projects/<projectId>/api-keys/public/deactivate",()=>r()),s.route("POST /v2/management/projects/<projectId>/api-keys/public/roll",()=>r()),s.route("POST /v2/management/projects/<projectId>/api-keys/secret/roll",()=>r());function Vo(o,e,t,n){if(!o.upgrade(e,{data:{refuseConnection:{code:t,message:n}}}))return new Response("Could not upgrade to WebSocket",{status:426})}var B=new Jo;B.relay("/v2/authorize-user/*",V);B.relay("/v2/identify-user/*",V);B.relay("/v2/c/*",a);B.relay("/v2/*",s);B.relay("/*",M);var oe=1153;function Be(o){if(o===void 0)return;let e=Number(o);return Number.isInteger(e)&&e>0&&e<=65535?e:void 0}function $o(o){return process.platform==="win32"?[process.env.COMSPEC||"cmd.exe","/c",o]:["sh","-c",o]}var zo={description:"Start the local Liveblocks dev server",async run(o){let{options:e}=se(o,{port:{type:"string",short:"p",default:oe.toString()},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}});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: ${oe})`),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(" --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 t=!1;e.ci&&(t=!0,e["no-check"]=!0),e.cmd&&(t=!0,e["no-check"]=!0);let n=Be(e.port)??Be(process.env.LIVEBLOCKS_DEVSERVER_PORT)??oe,i=e.host||process.env.LIVEBLOCKS_DEVSERVER_HOST||"localhost",d=t?Ie():null;await xe(n,i)&&(console.error(`Port ${n} is already in use.
361
+ `;var M=new xo({authorize:()=>!0});M.route("GET /v7",()=>Ne(426));M.route("GET /v8",()=>Ne(426));M.route("GET /health",()=>Oo({status:"ok"}));M.route("GET /",()=>Co(Pe.replace("__VERSION__","1.0.13")));import{jsonObjectYolo as Ro,ROOT_YDOC_ID as Q,snapshotToLossyJson_eager as Po,snapshotToPlainLson_eager as Ae}from"@liveblocks/server";import{json as No,ZenRouter as Do}from"@liveblocks/zenrouter";import{constant as jo,enum_ as Ao,object as Ue,string as Uo}from"decoders";import{Base64 as Mo}from"js-base64";import*as X from"yjs";import*as E from"yjs";function _o(o){return o.content instanceof E.ContentFormat||o.content instanceof E.ContentEmbed?"text":"arr"in o.content?"array":"str"in o.content?"text":"type"in o.content?"xml":"unknown"}function Lo(o){let e=[],t=o;for(;t!==null;){if(!t.deleted)if(t.content instanceof E.ContentType)e.push(t.content.type.toJSON());else if(t.content instanceof E.ContentString)e.push(t.content.str);else if(t.content instanceof E.ContentFormat){let{key:n,value:i}=t.content;e.push({key:n,value:i})}else t.content instanceof E.ContentEmbed&&e.push(t.content.embed);t=t.right}return e}function De(o,e,t,n=!1){if(!e._first&&e._map instanceof Map&&e._map.size>0)return o.getMap(t).toJSON();if(e._first!==null){let i=_o(e._first);if(i==="text")return n?Lo(e._first):o.getText(t).toJSON();if(i==="array")return o.getArray(t).toJSON();if(i==="xml")return o.getXmlFragment(t).toJSON()}return e.toJSON()}var ko={ytext:E.Text,yxmlfragment:E.XmlFragment,yxmltext:E.XmlText,ymap:E.Map,yarray:E.Array};function je(o,e="",t=!1,n=""){let i={};if(e.length){if(o.share.has(e)){if(n.length){let d=ko[n];if(d)return o.get(e,d).toJSON()}return{[e]:De(o,o.share.get(e),e,t)}}return{[e]:""}}for(let[d,c]of o.share)i[d]=De(o,c,d,t);return i}var Me=(t=>(t.PlainLson="plain-lson",t.LossyJson="json",t))(Me||{}),Bo=Ao(Me),s=new Do({authorize:({req:o})=>F(o)});function D(o){return No({error:"ROOM_NOT_FOUND",message:`Room with id "${o}" not found.`},404)}s.route("GET /v2/rooms/<roomId>",async({p:o})=>{if(!await C(o.roomId))throw D(o.roomId);return{type:"room",id:o.roomId,createdAt:new Date().toISOString(),metadata:{},defaultAccesses:["room:write"],groupsAccesses:{},usersAccesses:{}}});s.route("GET /v2/rooms",()=>{let e=Ee().map(t=>({type:"room",id:t,createdAt:new Date().toISOString(),metadata:{},defaultAccesses:["room:write"],groupsAccesses:{},usersAccesses:{}}));return Y({data:e,nextPage:null,nextCursor:null},200,"The Liveblocks dev server doesn't implement room permissions or pagination yet.")});s.route("POST /v2/rooms",Ue({id:Uo}),async({body:o})=>{if(await C(o.id))return new Response(JSON.stringify({error:"ROOM_ALREADY_EXISTS",message:`Room with id "${o.id}" already exists.`}),{status:409,headers:{"Content-Type":"application/json"}});try{await Te(o.id)}catch(t){if(t instanceof Error&&t.message.includes("already exists"))return new Response(JSON.stringify({error:"ROOM_ALREADY_EXISTS",message:`Room with id "${o.id}" already exists.`}),{status:409,headers:{"Content-Type":"application/json"}});throw t}return{type:"room",id:o.id,createdAt:new Date().toISOString(),metadata:{},defaultAccesses:["room:write"],groupsAccesses:{},usersAccesses:{}}});s.route("POST /v2/rooms/<roomId>",()=>r());s.route("DELETE /v2/rooms/<roomId>",async({p:o})=>(await be(o.roomId),new Response(null,{status:204})));s.route("GET /v2/rooms/<roomId>/storage",async({url:o,p:e})=>{if(!await C(e.roomId))throw D(e.roomId);let n=Bo.value(o.searchParams.get("format"))??"plain-lson",i=_(e.roomId);await i.load();let d=i.storage.loadedDriver.get_snapshot(!1),c=n==="json"?Po(d):Ae(d);return new Response(JSON.stringify(c),{status:200,headers:{"Content-Type":"application/json"}})});s.route("POST /v2/rooms/<roomId>/storage",Ue({liveblocksType:jo("LiveObject"),data:Ro}).refineType(),async({p:o,body:e})=>{if(!await C(o.roomId))throw D(o.roomId);let n=_(o.roomId);await n.load();let i=n.storage.loadedDriver.get_snapshot(!1),d=Ae(i);return Object.keys(d.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 n.driver.DANGEROUSLY_reset_nodes(e),n.unload(),new Response(JSON.stringify(e),{status:200,headers:{"Content-Type":"application/json"}}))});s.route("DELETE /v2/rooms/<roomId>/storage",async({p:o})=>{if(!await C(o.roomId))throw D(o.roomId);let t=_(o.roomId);await t.load();let n={liveblocksType:"LiveObject",data:{}};return await t.driver.DANGEROUSLY_reset_nodes(n),t.unload(),new Response(null,{status:204})});s.route("GET /v2/rooms/<roomId>/ydoc",async({url:o,p:e})=>{if(!await C(e.roomId))throw D(e.roomId);let n=_(e.roomId);await n.load();let i=o.searchParams.get("key")??"",d=o.searchParams.get("type")??"",c=o.searchParams.get("guid")??Q,l=o.searchParams.get("formatting")!==null,m=await n.yjsStorage.getYDoc(c),u=je(m,i,l,d);return new Response(JSON.stringify(u),{status:200,headers:{"Content-Type":"application/json"}})});s.route("PUT /v2/rooms/<roomId>/ydoc",async({req:o,url:e,p:t})=>{if(o.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(!await C(t.roomId))throw D(t.roomId);let i=_(t.roomId);await i.load();let d=await o.arrayBuffer(),c=Mo.fromUint8Array(new Uint8Array(d)),l=e.searchParams.get("guid"),u=e.searchParams.get("encoder")==="v2",f=l&&l!==Q?l:void 0;try{return await i.mutex.runExclusive(()=>i.yjsStorage.addYDocUpdate({},c,f,u)),new Response(JSON.stringify({success:!0}),{status:200,headers:{"Content-Type":"application/json"}})}catch(h){return new Response(JSON.stringify({error:"UNPROCESSABLE_ENTITY",message:h instanceof Error?h.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"}})}});s.route("GET /v2/rooms/<roomId>/ydoc-binary",async({url:o,p:e})=>{if(!await C(e.roomId))throw D(e.roomId);let n=_(e.roomId);await n.load();let i=o.searchParams.get("guid")??Q,d=o.searchParams.get("encoder"),c=await n.yjsStorage.getYDoc(i),l=d==="v2"?X.encodeStateAsUpdateV2(c):X.encodeStateAsUpdate(c);return new Response(l,{status:200,headers:{"Content-Type":"application/octet-stream"}})});s.route("PATCH /v2/rooms/<roomId>/storage/json-patch",()=>r()),s.route("POST /v2/rooms/<roomId>/presence",()=>r()),s.route("GET /v2/rooms/<roomId>/threads",()=>r()),s.route("POST /v2/rooms/<roomId>/upsert",()=>r()),s.route("POST /v2/rooms/<roomId>/update-room-id",()=>r()),s.route("POST /v2/rooms/<roomId>/update-tenant-id",()=>r()),s.route("POST /v2/rooms/<roomId>/update-organization-id",()=>r()),s.route("GET /v2/rooms/<roomId>/prewarm",()=>r()),s.route("POST /v2/rooms/<roomId>/request-storage-mutation",()=>r()),s.route("GET /v2/rooms/<roomId>/rippling/text-editor",()=>r()),s.route("POST /v2/rooms/<roomId>/rippling/text-editor",()=>r()),s.route("GET /v2/rooms/<roomId>/active_users",()=>r()),s.route("POST /v2/rooms/<roomId>/send-message",()=>r()),s.route("POST /v2/rooms/<roomId>/broadcast_event",()=>r()),s.route("GET /v2/rooms/<roomId>/versions",()=>r()),s.route("GET /v2/rooms/<roomId>/version/<version>",()=>r()),s.route("POST /v2/rooms/<roomId>/version",()=>r()),s.route("POST /v2/rooms/<roomId>/threads",()=>r()),s.route("GET /v2/rooms/<roomId>/threads/<threadId>",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/subscribe",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>r()),s.route("GET /v2/rooms/<roomId>/threads/<threadId>/subscriptions",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/metadata",()=>r()),s.route("DELETE /v2/rooms/<roomId>/threads/<threadId>",()=>r()),s.route("GET /v2/rooms/<roomId>/threads/<threadId>/participants",()=>r()),s.route("GET /v2/rooms/<roomId>/threads/<threadId>/inbox-notifications",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments",()=>r()),s.route("GET /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>r()),s.route("DELETE /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/add-reaction",()=>r()),s.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/remove-reaction",()=>r()),s.route("GET /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>r()),s.route("GET /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>r()),s.route("POST /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>r()),s.route("POST /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>r()),s.route("DELETE /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>r()),s.route("DELETE /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>r()),s.route("GET /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>r()),s.route("DELETE /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>r()),s.route("GET /v2/users/<userId>/inbox-notifications",()=>r()),s.route("DELETE /v2/users/<userId>/inbox-notifications",()=>r()),s.route("GET /v2/users/<userId>/notification-settings",()=>r()),s.route("POST /v2/users/<userId>/notification-settings",()=>r()),s.route("DELETE /v2/users/<userId>/notification-settings",()=>r()),s.route("GET /v2/users/<userId>/room-subscription-settings",()=>r()),s.route("GET /v2/users/<userId>/threads",()=>r()),s.route("POST /v2/inbox-notifications/trigger",()=>r()),s.route("POST /v2/inbox-notifications/<inboxNotificationId>/read",()=>r()),s.route("GET /v2/threads",()=>r()),s.route("POST /v2/groups",()=>r()),s.route("GET /v2/groups/<groupId>",()=>r()),s.route("POST /v2/groups/<groupId>/add-members",()=>r()),s.route("POST /v2/groups/<groupId>/remove-members",()=>r()),s.route("DELETE /v2/groups/<groupId>",()=>r()),s.route("GET /v2/groups",()=>r()),s.route("GET /v2/users/<userId>/groups",()=>r()),s.route("GET /v2/ai/copilots",()=>r()),s.route("GET /v2/ai/copilots/<copilotId>",()=>r()),s.route("GET /v2/ai/copilots/<copilotId>/knowledge",()=>r()),s.route("GET /v2/ai/copilots/<copilotId>/knowledge/<knowledgeSourceId>",()=>r()),s.route("GET /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>r()),s.route("GET /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>/links",()=>r()),s.route("POST /v2/ai/copilots",()=>r()),s.route("POST /v2/ai/copilots/<copilotId>",()=>r()),s.route("POST /v2/ai/copilots/<copilotId>/knowledge/web",()=>r()),s.route("DELETE /v2/ai/copilots/<copilotId>",()=>r()),s.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>r()),s.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>",()=>r()),s.route("PUT /v2/ai/copilots/<copilotId>/knowledge/file/<fileName>",()=>r()),s.route("GET /v2/management/projects",()=>r()),s.route("GET /v2/management/projects/<projectId>",()=>r()),s.route("POST /v2/management/projects",()=>r()),s.route("POST /v2/management/projects/<projectId>",()=>r()),s.route("DELETE /v2/management/projects/<projectId>",()=>r()),s.route("GET /v2/management/projects/<projectId>/webhooks",()=>r()),s.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>r()),s.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/delete-additional-headers",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/recover-failed-messages",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/secret/roll",()=>r()),s.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/test",()=>r()),s.route("DELETE /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>r()),s.route("POST /v2/management/projects/<projectId>/api-keys/public/activate",()=>r()),s.route("POST /v2/management/projects/<projectId>/api-keys/public/deactivate",()=>r()),s.route("POST /v2/management/projects/<projectId>/api-keys/public/roll",()=>r()),s.route("POST /v2/management/projects/<projectId>/api-keys/secret/roll",()=>r());function Vo(o,e,t,n){if(!o.upgrade(e,{data:{refuseConnection:{code:t,message:n}}}))return new Response("Could not upgrade to WebSocket",{status:426})}var B=new Jo;B.relay("/v2/authorize-user/*",V);B.relay("/v2/identify-user/*",V);B.relay("/v2/c/*",a);B.relay("/v2/*",s);B.relay("/*",M);var oe=1153;function Be(o){if(o===void 0)return;let e=Number(o);return Number.isInteger(e)&&e>0&&e<=65535?e:void 0}function $o(o){return process.platform==="win32"?[process.env.COMSPEC||"cmd.exe","/c",o]:["sh","-c",o]}var zo={description:"Start the local Liveblocks dev server",async run(o){let{options:e}=se(o,{port:{type:"string",short:"p",default:oe.toString()},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}});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: ${oe})`),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(" --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 t=!1;e.ci&&(t=!0,e["no-check"]=!0),e.cmd&&(t=!0,e["no-check"]=!0);let n=Be(e.port)??Be(process.env.LIVEBLOCKS_DEVSERVER_PORT)??oe,i=e.host||process.env.LIVEBLOCKS_DEVSERVER_HOST||"localhost",d=t?Ie():null;await xe(n,i)&&(console.error(`Port ${n} is already in use.
362
362
  Is another dev server already running?`),process.exit(1));let c=ee.serve({hostname:i,port:n,async fetch(m,u){if(m.headers.get("Upgrade")==="websocket"){let p=ce(m);if(!p.ok)return Z(p.xwarn,!0),Vo(u,m,Go.NOT_ALLOWED,"You have no access to this room");let{roomId:v,ticketData:I}=p,T=_(v);await T.load();let O=await T.createTicket(I),k=O.sessionKey;if(u.upgrade(m,{data:{room:T,ticket:O,sessionKey:k}})){console.log(`${R("101")} WS ${new URL(m.url).pathname}${y(` - ${v}`)}`);return}return new Response("Could not upgrade to WebSocket",{status:426})}let f=new URL(m.url),h=`${m.method} ${f.pathname}`,b=await B.fetch(m),S=b.status,te=S>=500?$(String(S)):S>=400?j(String(S)):R(String(S));console.log(`${te} ${h}`);let g=b.headers.get("X-LB-Warn")??void 0;return Z(g,!b.ok),b},error(m){return console.error(m),new Response("An unknown error occurred",{status:500})},websocket:{async open(m){let{refuseConnection:u,room:f,ticket:h}=m.data;if(u){m.close(u.code,u.message);return}f&&h&&await f.startBrowserSession(h,m)},async message(m,u){let{room:f,sessionKey:h}=m.data;f&&h&&await f.handleData(h,u)},close(m,u,f){let{room:h,sessionKey:b}=m.data;h&&b&&h.endBrowserSession(b,u,f)}}}),l=m=>process.stderr.write(m+`
363
- `);if(l(`Liveblocks dev server ${y("v1.0.11")} running at http://${c.hostname}:${c.port}`),d&&e.verbose&&l(y(`Ephemeral mode, using ${d}`)),e.cmd){let m=Yo(d,"server.log");l(y(`Server logs: ${m}`));let u=ee.file(m).writer(),f=(...b)=>{u.write(b.map(String).join(" ")+`
363
+ `);if(l(`Liveblocks dev server ${y("v1.0.13")} running at http://${c.hostname}:${c.port}`),d&&e.verbose&&l(y(`Ephemeral mode, using ${d}`)),e.cmd){let m=Yo(d,"server.log");l(y(`Server logs: ${m}`));let u=ee.file(m).writer(),f=(...b)=>{u.write(b.map(String).join(" ")+`
364
364
  `),u.flush()};console.log=f,console.error=f;let h=1;try{let b=ee.spawn($o(e.cmd),{stdin:"inherit",stdout:"inherit",stderr:"inherit",env:{...process.env,LIVEBLOCKS_DEV_SERVER_HOST:i,LIVEBLOCKS_DEV_SERVER_PORT:String(n)}}),S=()=>{b.kill()};process.on("SIGTERM",S),process.on("SIGINT",S),h=await b.exited}finally{u.end(),await c.stop(),W(),l(y("Liveblocks dev server shut down"))}process.exit(h)}else{let m=`http://${i}:${n}`,u=e["no-check"]?[]:await we(m);console.log(y("Press ")+G("q")+y(" to quit, ")+G("c")+y(" to clear")),process.stdin.setRawMode?.(!0),process.stdin.resume(),process.stdin.on("data",f=>{let h=f.toString();if(h==="q"||h==="")c.stop().then(()=>{W(),process.exit(0)});else if(h==="c")console.clear();else if(h==="p")if(u.length>0){let b=Ce(u,m);Oe(b),console.log(y("Copied AI fix prompt to clipboard"))}else console.log(y("No setup issues detected"))})}}},cr=zo;export{cr as default};
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{h as r}from"./chunk-XHCECL7L.js";import{execFileSync as l,spawnSync as c}from"node: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-4TIOESGN.js")).default;case"upgrade":return(await import("./upgrade-45EU3U3M.js")).default;default:return}}var m={dev:"Start the local Liveblocks dev server",upgrade:"Upgrade all Liveblocks packages"};function f(){console.log("liveblocks v1.0.11"),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.0.11"),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{h as r}from"./chunk-XHCECL7L.js";import{execFileSync as l,spawnSync as c}from"node: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-LW36JGQO.js")).default;case"upgrade":return(await import("./upgrade-45EU3U3M.js")).default;default:return}}var m={dev:"Start the local Liveblocks dev server",upgrade:"Upgrade all Liveblocks packages"};function f(){console.log("liveblocks v1.0.13"),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.0.13"),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.0.11",
3
+ "version": "1.0.13",
4
4
  "description": "Liveblocks command line interface",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,6 +22,7 @@
22
22
  "test:typescript": "tsc --noEmit"
23
23
  },
24
24
  "license": "AGPL-3.0-or-later",
25
+ "author": "Liveblocks Inc.",
25
26
  "keywords": [
26
27
  "Liveblocks",
27
28
  "CLI",
@@ -39,9 +40,9 @@
39
40
  },
40
41
  "dependencies": {
41
42
  "@liveblocks/core": "3.14.0",
42
- "@liveblocks/server": "1.0.11",
43
- "@liveblocks/zenrouter": "1.0.11",
44
- "decoders": "^2.8.0-1",
43
+ "@liveblocks/server": "1.0.13",
44
+ "@liveblocks/zenrouter": "1.0.13",
45
+ "decoders": "^2.8.0",
45
46
  "js-base64": "^3.7.5",
46
47
  "yjs": "^13.6.10"
47
48
  }