liveblocks 1.4.1 → 1.4.2-pre1

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.
@@ -1,6 +1,6 @@
1
- import{a as Q,b as $e,c as V,d as J,e as ae,f as P,g,h as Oe,i as ze}from"./chunk-ZFPKG3IB.js";import{Promise_withResolvers as ls,tryParseJson as Bt,WebsocketCloseCodes as Ft}from"@liveblocks/core";import{ZenRelay as ms}from"@liveblocks/zenrouter";import Je from"bun";import{join as fs}from"path";import{nanoid as Oo}from"@liveblocks/core";import{ProtocolVersion as Et}from"@liveblocks/server";import{nanoid as no,WebsocketCloseCodes as We}from"@liveblocks/core";import{DefaultMap as io,Room as ao}from"@liveblocks/server";import{Database as co}from"bun:sqlite";import{mkdirSync as qe,mkdtempSync as uo,rmSync as lo}from"fs";import{tmpdir as mo}from"os";import{dirname as fo,join as ge,resolve as Xe}from"path";import{asPos as Wt,CrdtType as $,nn as qt}from"@liveblocks/core";import{makeInMemorySnapshot as Zt,NestedMap as Qt,plainLsonToNodeStream as eo,quote as G}from"@liveblocks/server";import{Database as to}from"bun:sqlite";function X(t){try{return t!==void 0?JSON.parse(t):void 0}catch{return}}function Ke(t){if(t>512)throw new Error("More than 512 params not supported");return new Array(t).fill("?").join(",")}function oo(t){return Array.isArray(t)?t:Array.from(t)}function so(t){return t.query("SELECT node_id, crdt_json FROM nodes").values().map(([e,o])=>[e,X(o)])}function de(t,e){let o=t.prepare(`INSERT INTO nodes (node_id, crdt_json)
1
+ import{a as Q,b as $e,c as V,d as J,e as ae,f as P,g,h as we,i as ze}from"./chunk-ZFPKG3IB.js";import{Promise_withResolvers as mr,tryParseJson as Bt,WebsocketCloseCodes as Ft}from"@liveblocks/core";import{ZenRelay as fr}from"@liveblocks/zenrouter";import Je from"bun";import{join as pr}from"path";import{nanoid as Co}from"@liveblocks/core";import{ProtocolVersion as Et}from"@liveblocks/server";import{nanoid as io,WebsocketCloseCodes as We}from"@liveblocks/core";import{DefaultMap as ao,Room as co}from"@liveblocks/server";import{Database as uo}from"bun:sqlite";import{mkdirSync as qe,mkdtempSync as lo,rmSync as mo}from"fs";import{tmpdir as fo}from"os";import{dirname as po,join as ge,resolve as Xe}from"path";import{asPos as Wt,CrdtType as $,nn as qt,nodeStreamToCompactNodes as Zt}from"@liveblocks/core";import{makeInMemorySnapshot as Qt,NestedMap as eo,plainLsonToNodeStream as to,quote as G}from"@liveblocks/server";import{Database as oo}from"bun:sqlite";function X(t){try{return t!==void 0?JSON.parse(t):void 0}catch{return}}function Ke(t){if(t>512)throw new Error("More than 512 params not supported");return new Array(t).fill("?").join(",")}function ro(t){return Array.isArray(t)?t:Array.from(t)}function so(t){return t.query("SELECT node_id, crdt_json FROM nodes").values().map(([e,o])=>[e,X(o)])}function de(t,e){let o=t.prepare(`INSERT INTO nodes (node_id, crdt_json)
2
2
  VALUES (?, ?)
3
- ON CONFLICT (node_id) DO UPDATE SET crdt_json = ?`);t.transaction(i=>{for(let[a,d]of i){let c=JSON.stringify(d);o.run(a,c,c)}})(e)}function He(t,e){let o=oo(e),s=o.length;t.query(`DELETE FROM nodes WHERE node_id IN (${Ke(s)})`).run(...o)}function Ye(t){let e=new Qt;for(let[o,s]of t){if(s.parentId===void 0)continue;let i=e.get(s.parentId,s.parentKey);(i===void 0||o>i)&&e.set(s.parentId,s.parentKey,o)}return e}function ro(t,e){let o=new Map(so(t));o.has("root")||o.set("root",{type:$.OBJECT,data:{}});let s=new Set,i=["root"],a=new Map,d=Ye(o);for(;i.length>0;){let v=i.pop(),_=qt(o.get(v));if(_.type===$.OBJECT)for(let h of d.keysAt(v))Object.prototype.hasOwnProperty.call(_.data,h)&&(delete _.data[h],s.add(v),e.warn(`[integrity] Found data key ${G(h)} from ${G(v)} (conflicted with child node)`));if(_.type!==$.REGISTER)i.push(...d.valuesAt(v));else if(o.get(_.parentId)?.type===$.OBJECT)continue;a.set(v,_)}let c=new Set;for(let[v,_]of o)a.has(v)||(_.parentId!==void 0&&a.has(_.parentId)?a.get(_.parentId)?.type===$.REGISTER?e.warn(`[integrity] Found unreachable node ${G(v)} (child of live register)`):e.warn(`[integrity] Found conflicting sibling ${G(v)} (conflicted with ${G(d.get(_.parentId,_.parentKey))} at ${G(_.parentKey)})`):e.warn(`[integrity] Found orphan ${G(v)}`),c.add(v),s.delete(v));if(s.size>0||c.size>0){if(s.size>0){let v=new Map;for(let _ of s){let h=a.get(_);h!==void 0&&v.set(_,h)}de(t,v)}c.size>0&&He(t,c)}let p=c.size===0?d:Ye(a);return{nodes:a,revNodes:p}}function Ve(t,e){return t?.type===$.OBJECT&&Object.prototype.hasOwnProperty.call(t.data,e)&&t.data[e]!==void 0}var pe=class{db;constructor(e){let o=new to(e,{create:!0});o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA case_sensitive_like = ON"),o.run("PRAGMA foreign_keys = ON"),o.run(`CREATE TABLE IF NOT EXISTS system (
3
+ ON CONFLICT (node_id) DO UPDATE SET crdt_json = ?`);t.transaction(i=>{for(let[a,d]of i){let c=JSON.stringify(d);o.run(a,c,c)}})(e)}function He(t,e){let o=ro(e),r=o.length;t.query(`DELETE FROM nodes WHERE node_id IN (${Ke(r)})`).run(...o)}function Ye(t){let e=new eo;for(let[o,r]of t){if(r.parentId===void 0)continue;let i=e.get(r.parentId,r.parentKey);(i===void 0||o>i)&&e.set(r.parentId,r.parentKey,o)}return e}function no(t,e){let o=new Map(so(t));o.has("root")||o.set("root",{type:$.OBJECT,data:{}});let r=new Set,i=["root"],a=new Map,d=Ye(o);for(;i.length>0;){let v=i.pop(),_=qt(o.get(v));if(_.type===$.OBJECT)for(let h of d.keysAt(v))Object.prototype.hasOwnProperty.call(_.data,h)&&(delete _.data[h],r.add(v),e.warn(`[integrity] Found data key ${G(h)} from ${G(v)} (conflicted with child node)`));if(_.type!==$.REGISTER)i.push(...d.valuesAt(v));else if(o.get(_.parentId)?.type===$.OBJECT)continue;a.set(v,_)}let c=new Set;for(let[v,_]of o)a.has(v)||(_.parentId!==void 0&&a.has(_.parentId)?a.get(_.parentId)?.type===$.REGISTER?e.warn(`[integrity] Found unreachable node ${G(v)} (child of live register)`):e.warn(`[integrity] Found conflicting sibling ${G(v)} (conflicted with ${G(d.get(_.parentId,_.parentKey))} at ${G(_.parentKey)})`):e.warn(`[integrity] Found orphan ${G(v)}`),c.add(v),r.delete(v));if(r.size>0||c.size>0){if(r.size>0){let v=new Map;for(let _ of r){let h=a.get(_);h!==void 0&&v.set(_,h)}de(t,v)}c.size>0&&He(t,c)}let p=c.size===0?d:Ye(a);return{nodes:a,revNodes:p}}function Ve(t,e){return t?.type===$.OBJECT&&Object.prototype.hasOwnProperty.call(t.data,e)&&t.data[e]!==void 0}var pe=class{db;constructor(e){let o=new oo(e,{create:!0});o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA case_sensitive_like = ON"),o.run("PRAGMA foreign_keys = ON"),o.run(`CREATE TABLE IF NOT EXISTS system (
4
4
  setting TEXT NOT NULL,
5
5
  jval TEXT NOT NULL,
6
6
  PRIMARY KEY (setting)
@@ -37,22 +37,22 @@ import{a as Q,b as $e,c as V,d as J,e as ae,f as P,g,h as Oe,i as ze}from"./chun
37
37
  updated_at INTEGER NOT NULL,
38
38
  PRIMARY KEY (feed_id, message_id),
39
39
  FOREIGN KEY (feed_id) REFERENCES feeds(feed_id) ON DELETE CASCADE
40
- )`),o.run("CREATE INDEX IF NOT EXISTS idx_feed_messages_feed_created ON feed_messages(feed_id, created_at DESC, message_id DESC)"),this.db=o}load_nodes_api(e){let o=this.db,{nodes:s,revNodes:i}=ro(o,e),a=m=>s.get(m),d=(m,l)=>i.get(m,l),c=(m,l)=>i.has(m,l);function p(m,l){let I;for(let S of i.keysAt(m)){let O=Wt(S);O>l&&(I===void 0||O<I)&&(I=O)}return I}function v(m,l,I=!1){let S=a(l.parentId);if(S===void 0)throw new Error(`No such parent ${G(l.parentId)}`);if(l.type===$.REGISTER&&S.type===$.OBJECT)throw new Error("Cannot add register under object");let O=d(l.parentId,l.parentKey);if(O!==m){let M=Ve(S,l.parentKey);if(O!==void 0||M)if(I)b(l.parentId,l.parentKey);else throw new Error(`Key ${G(l.parentKey)} already exists`);i.set(l.parentId,l.parentKey,m)}s.set(m,l),de(o,[[m,l]])}function _(m,l){let I=a(m);if(I?.parentId===void 0)return;if(c(I.parentId,l))throw new Error(`Pos ${G(l)} already taken`);i.delete(I.parentId,I.parentKey);let S={...I,parentKey:l};s.set(m,S),i.set(I.parentId,l,m),de(o,[[m,S]])}function h(m,l,I=!1){let S=a(m);if(S?.type!==$.OBJECT)return;for(let M of Object.keys(l)){let y=d(m,M);if(y!==void 0)if(I)f(y);else throw new Error(`Child node already exists under ${M}`)}let O={...S,data:{...S.data,...l}};s.set(m,O),de(o,[[m,O]])}function f(m){let l=a(m);if(l?.parentId===void 0)return;i.delete(l.parentId,l.parentKey);let I=[],S=[m];for(;S.length>0;){let O=S.pop();S.push(...i.valuesAt(O)),s.delete(O),i.deleteAll(O),I.push(O)}He(o,I)}function b(m,l){let I=a(m);if(Ve(I,l)){let{[l]:O,...M}=I.data,y={...I,data:M};s.set(m,y),de(o,[[m,y]])}let S=d(m,l);S!==void 0&&f(S)}return{get_node:a,iter_nodes:()=>s.entries(),has_node:m=>s.has(m),get_child_at:d,has_child_at:c,get_next_sibling:p,set_child:v,move_sibling:_,delete_node:f,delete_child_key:b,set_object_data:h,get_snapshot(m){return Zt(s)}}}DANGEROUSLY_reset_nodes(e){let o=this.db.prepare("DELETE FROM nodes"),s=this.db.prepare("INSERT INTO nodes (node_id, crdt_json) VALUES (?, ?)");this.db.transaction(()=>{o.run();for(let[a,d]of eo(e))s.run(a,JSON.stringify(d))})()}raw_iter_nodes(){return this.db.query("SELECT node_id, crdt_json FROM nodes").values().map(([e,o])=>[e,X(o)])}get_meta(e){let s=this.db.query("SELECT jval FROM metadata WHERE key = ?").get(e)?.jval;if(s!==void 0)return X(s)??null}put_meta(e,o){let s=JSON.stringify(o);this.db.run(`INSERT INTO metadata (key, jval)
40
+ )`),o.run("CREATE INDEX IF NOT EXISTS idx_feed_messages_feed_created ON feed_messages(feed_id, created_at DESC, message_id DESC)"),this.db=o}load_nodes_api(e){let o=this.db,{nodes:r,revNodes:i}=no(o,e),a=u=>r.get(u),d=(u,m)=>i.get(u,m),c=(u,m)=>i.has(u,m);function p(u,m){let I;for(let S of i.keysAt(u)){let w=Wt(S);w>m&&(I===void 0||w<I)&&(I=w)}return I}function v(u,m,I=!1){let S=a(m.parentId);if(S===void 0)throw new Error(`No such parent ${G(m.parentId)}`);if(m.type===$.REGISTER&&S.type===$.OBJECT)throw new Error("Cannot add register under object");let w=d(m.parentId,m.parentKey);if(w!==u){let M=Ve(S,m.parentKey);if(w!==void 0||M)if(I)b(m.parentId,m.parentKey);else throw new Error(`Key ${G(m.parentKey)} already exists`);i.set(m.parentId,m.parentKey,u)}r.set(u,m),de(o,[[u,m]])}function _(u,m){let I=a(u);if(I?.parentId===void 0)return;if(c(I.parentId,m))throw new Error(`Pos ${G(m)} already taken`);i.delete(I.parentId,I.parentKey);let S={...I,parentKey:m};r.set(u,S),i.set(I.parentId,m,u),de(o,[[u,S]])}function h(u,m,I=!1){let S=a(u);if(S?.type!==$.OBJECT)return;for(let M of Object.keys(m)){let y=d(u,M);if(y!==void 0)if(I)f(y);else throw new Error(`Child node already exists under ${M}`)}let w={...S,data:{...S.data,...m}};r.set(u,w),de(o,[[u,w]])}function f(u){let m=a(u);if(m?.parentId===void 0)return;i.delete(m.parentId,m.parentKey);let I=[],S=[u];for(;S.length>0;){let w=S.pop();S.push(...i.valuesAt(w)),r.delete(w),i.deleteAll(w),I.push(w)}He(o,I)}function b(u,m){let I=a(u);if(Ve(I,m)){let{[m]:w,...M}=I.data,y={...I,data:M};r.set(u,y),de(o,[[u,y]])}let S=d(u,m);S!==void 0&&f(S)}return{get_node:a,iter_nodes:()=>r.entries(),*iter_nodes_optimized(){for(let u of Zt(r.entries()))yield JSON.stringify(u)},has_node:u=>r.has(u),get_child_at:d,has_child_at:c,get_next_sibling:p,set_child:v,move_sibling:_,delete_node:f,delete_child_key:b,set_object_data:h,get_snapshot(u){return Qt(r)}}}DANGEROUSLY_reset_nodes(e){let o=this.db.prepare("DELETE FROM nodes"),r=this.db.prepare("INSERT INTO nodes (node_id, crdt_json) VALUES (?, ?)");this.db.transaction(()=>{o.run();for(let[a,d]of to(e))r.run(a,JSON.stringify(d))})()}raw_iter_nodes(){return this.db.query("SELECT node_id, crdt_json FROM nodes").values().map(([e,o])=>[e,X(o)])}get_meta(e){let r=this.db.query("SELECT jval FROM metadata WHERE key = ?").get(e)?.jval;if(r!==void 0)return X(r)??null}put_meta(e,o){let r=JSON.stringify(o);this.db.run(`INSERT INTO metadata (key, jval)
41
41
  VALUES (?, ?)
42
42
  ON CONFLICT (key) DO UPDATE SET jval = ?
43
- `,[e,s,s])}delete_meta(e){this.db.query("DELETE FROM metadata WHERE key = ?").run(e)}next_actor(){let e=this.db.query(`INSERT INTO system (setting, jval)
43
+ `,[e,r,r])}delete_meta(e){this.db.query("DELETE FROM metadata WHERE key = ?").run(e)}next_actor(){let e=this.db.query(`INSERT INTO system (setting, jval)
44
44
  VALUES ('last_actor_id', '0')
45
45
  ON CONFLICT (setting) DO UPDATE SET jval = json(CAST(jval AS INTEGER) + 1)
46
- RETURNING jval`).get();return JSON.parse(e.jval)}iter_y_updates(e){return this.db.query("SELECT key, data FROM ydocs WHERE doc_id = ?").values(e)}write_y_updates(e,o,s){this.db.query(`INSERT INTO ydocs
46
+ RETURNING jval`).get();return JSON.parse(e.jval)}iter_y_updates(e){return this.db.query("SELECT key, data FROM ydocs WHERE doc_id = ?").values(e)}write_y_updates(e,o,r){this.db.query(`INSERT INTO ydocs
47
47
  VALUES (?, ?, ?)
48
- ON CONFLICT (doc_id, key) DO UPDATE SET data = ?`).run(e,o,s,s)}delete_y_updates(e,o){let s=o.length;this.db.query(`DELETE FROM ydocs WHERE doc_id = ? AND key IN (${Ke(s)})`).run(e,...o)}DANGEROUSLY_wipe_all_y_updates(){this.db.query("DELETE FROM ydocs").run()}list_leased_sessions(){let e=this.db.query("SELECT session_id, jpresence, updated_at, juserinfo, ttl, actor_id FROM leased_sessions").all();return Array.from(e,o=>[o.session_id,{sessionId:o.session_id,presence:X(o.jpresence)??null,updatedAt:o.updated_at,info:X(o.juserinfo)??{name:""},ttl:o.ttl,actorId:o.actor_id}])}get_leased_session(e){let o=this.db.query("SELECT session_id, jpresence, updated_at, juserinfo, ttl, actor_id FROM leased_sessions WHERE session_id = ?").get(e);if(o!=null)return{sessionId:o.session_id,presence:X(o.jpresence)??null,updatedAt:o.updated_at,info:X(o.juserinfo)??{name:""},ttl:o.ttl,actorId:o.actor_id}}put_leased_session(e){this.db.query(`INSERT INTO leased_sessions (session_id, jpresence, updated_at, juserinfo, ttl, actor_id)
48
+ ON CONFLICT (doc_id, key) DO UPDATE SET data = ?`).run(e,o,r,r)}delete_y_updates(e,o){let r=o.length;this.db.query(`DELETE FROM ydocs WHERE doc_id = ? AND key IN (${Ke(r)})`).run(e,...o)}DANGEROUSLY_wipe_all_y_updates(){this.db.query("DELETE FROM ydocs").run()}list_leased_sessions(){let e=this.db.query("SELECT session_id, jpresence, updated_at, juserinfo, ttl, actor_id FROM leased_sessions").all();return Array.from(e,o=>[o.session_id,{sessionId:o.session_id,presence:X(o.jpresence)??null,updatedAt:o.updated_at,info:X(o.juserinfo)??{name:""},ttl:o.ttl,actorId:o.actor_id}])}get_leased_session(e){let o=this.db.query("SELECT session_id, jpresence, updated_at, juserinfo, ttl, actor_id FROM leased_sessions WHERE session_id = ?").get(e);if(o!=null)return{sessionId:o.session_id,presence:X(o.jpresence)??null,updatedAt:o.updated_at,info:X(o.juserinfo)??{name:""},ttl:o.ttl,actorId:o.actor_id}}put_leased_session(e){this.db.query(`INSERT INTO leased_sessions (session_id, jpresence, updated_at, juserinfo, ttl, actor_id)
49
49
  VALUES (?, ?, ?, ?, ?, ?)
50
50
  ON CONFLICT (session_id) DO UPDATE SET
51
51
  jpresence = excluded.jpresence,
52
52
  updated_at = excluded.updated_at,
53
53
  juserinfo = excluded.juserinfo,
54
54
  ttl = excluded.ttl,
55
- actor_id = excluded.actor_id`).run(e.sessionId,JSON.stringify(e.presence),e.updatedAt,JSON.stringify(e.info),e.ttl,e.actorId)}delete_leased_session(e){this.db.query("DELETE FROM leased_sessions WHERE session_id = ?").run(e)}list_feeds(e){let o=Math.min(e?.limit??20,100),s=e?.since,i=e?.cursor,a=e?.metadata,d="SELECT feed_id, jmetadata, created_at, updated_at FROM feeds WHERE 1=1",c=[];if(a!==void 0)for(let[h,f]of Object.entries(a)){let b=typeof f=="boolean"?Number(f):f;d+=" AND json_extract(jmetadata, '$.' || ?) = ?",c.push(h,b)}if(s!==void 0&&(d+=" AND created_at >= ?",c.push(s)),i!==void 0)try{let h=JSON.parse(Buffer.from(i.replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),[f,b]=h;d+=" AND (created_at < ? OR (created_at = ? AND feed_id < ?))",c.push(b,b,f)}catch{}d+=" ORDER BY created_at DESC, feed_id DESC LIMIT ?",c.push(o+1);let p=this.db.query(d).all(...c),v;if(p.length>o){p.pop();let h=p[p.length-1];if(h){let f=[h.feed_id,h.created_at];v=Buffer.from(JSON.stringify(f),"utf8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}return{feeds:p.map(h=>({feedId:h.feed_id,metadata:JSON.parse(h.jmetadata),createdAt:h.created_at,updatedAt:h.updated_at})),nextCursor:v}}get_feed(e){let o=this.db.query("SELECT feed_id, jmetadata, created_at, updated_at FROM feeds WHERE feed_id = ?").get(e);if(o!=null)return{feedId:o.feed_id,metadata:JSON.parse(o.jmetadata),createdAt:o.created_at,updatedAt:o.updated_at}}create_feed(e){let o=this.db.query("SELECT feed_id FROM feeds WHERE feed_id = ?").get(e.feedId);if(o!=null)throw new Error(`Feed ${e.feedId} already exists`);this.db.query("INSERT INTO feeds (feed_id, jmetadata, created_at, updated_at) VALUES (?, ?, ?, ?)").run(e.feedId,JSON.stringify(e.metadata),e.createdAt,e.updatedAt)}update_feed_metadata(e,o){let s=this.db.query("UPDATE feeds SET jmetadata = ? WHERE feed_id = ? RETURNING feed_id, jmetadata, created_at, updated_at").get(JSON.stringify(o),e);if(s==null)throw new Error(`Feed ${e} not found`)}delete_feed(e){this.db.query("DELETE FROM feeds WHERE feed_id = ?").run(e)}list_feed_messages(e,o){let s=Math.min(o?.limit??20,100),i=o?.since,a=o?.cursor,d="SELECT feed_id, message_id, jdata, created_at, updated_at FROM feed_messages WHERE feed_id = ?",c=[e];if(i!==void 0&&(d+=" AND created_at >= ?",c.push(i)),a!==void 0)try{let h=JSON.parse(Buffer.from(a.replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),[f,b]=h;d+=" AND (created_at < ? OR (created_at = ? AND message_id < ?))",c.push(b,b,f)}catch{}d+=" ORDER BY created_at DESC, message_id DESC LIMIT ?",c.push(s+1);let p=this.db.query(d).all(...c),v;if(p.length>s){p.pop();let h=p[p.length-1];if(h){let f=[h.message_id,h.created_at];v=Buffer.from(JSON.stringify(f),"utf8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}return{messages:p.map(h=>({id:h.message_id,data:JSON.parse(h.jdata),createdAt:h.created_at,updatedAt:h.updated_at})),nextCursor:v}}add_feed_message(e,o){if(this.get_feed(e)===void 0)throw new Error(`Feed ${e} not found`);this.db.query("INSERT INTO feed_messages (feed_id, message_id, jdata, created_at, updated_at) VALUES (?, ?, ?, ?, ?)").run(e,o.id,JSON.stringify(o.data),o.createdAt,o.updatedAt)}update_feed_message(e,o,s,i){let a=this.db.query("SELECT feed_id, message_id, jdata, created_at, updated_at FROM feed_messages WHERE feed_id = ? AND message_id = ?").get(e,o);if(a==null)throw new Error(`Feed message ${o} not found in feed ${e}`);let d=i??Date.now();if(d<a.updated_at)return{id:a.message_id,data:JSON.parse(a.jdata),createdAt:a.created_at,updatedAt:a.updated_at};let c=this.db.query("UPDATE feed_messages SET jdata = ?, updated_at = ? WHERE feed_id = ? AND message_id = ? AND updated_at <= ? RETURNING feed_id, message_id, jdata, created_at, updated_at").get(JSON.stringify(s),d,e,o,d);if(c==null){let p=this.db.query("SELECT feed_id, message_id, jdata, created_at, updated_at FROM feed_messages WHERE feed_id = ? AND message_id = ?").get(e,o);if(p==null)throw new Error(`Feed message ${o} not found in feed ${e}`);return{id:p.message_id,data:JSON.parse(p.jdata),createdAt:p.created_at,updatedAt:p.updated_at}}return{id:c.message_id,data:JSON.parse(c.jdata),createdAt:c.created_at,updatedAt:c.updated_at}}delete_feed_message(e,o){this.db.query("DELETE FROM feed_messages WHERE feed_id = ? AND message_id = ?").run(e,o)}close(){this.db.close()}};var po=".liveblocks/v1",he=po,Ze=!1,W=null;function Qe(){return ge(he,"rooms")}function te(){if(W)return;let t=ge(he,"db.sql");qe(fo(t),{recursive:!0});let e=new co(t,{create:!0});e.run("PRAGMA journal_mode = WAL"),e.run("PRAGMA foreign_keys = ON"),e.run(`CREATE TABLE IF NOT EXISTS rooms (
55
+ actor_id = excluded.actor_id`).run(e.sessionId,JSON.stringify(e.presence),e.updatedAt,JSON.stringify(e.info),e.ttl,e.actorId)}delete_leased_session(e){this.db.query("DELETE FROM leased_sessions WHERE session_id = ?").run(e)}list_feeds(e){let o=Math.min(e?.limit??20,100),r=e?.since,i=e?.cursor,a=e?.metadata,d="SELECT feed_id, jmetadata, created_at, updated_at FROM feeds WHERE 1=1",c=[];if(a!==void 0)for(let[h,f]of Object.entries(a)){let b=typeof f=="boolean"?Number(f):f;d+=" AND json_extract(jmetadata, '$.' || ?) = ?",c.push(h,b)}if(r!==void 0&&(d+=" AND created_at >= ?",c.push(r)),i!==void 0)try{let h=JSON.parse(Buffer.from(i.replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),[f,b]=h;d+=" AND (created_at < ? OR (created_at = ? AND feed_id < ?))",c.push(b,b,f)}catch{}d+=" ORDER BY created_at DESC, feed_id DESC LIMIT ?",c.push(o+1);let p=this.db.query(d).all(...c),v;if(p.length>o){p.pop();let h=p[p.length-1];if(h){let f=[h.feed_id,h.created_at];v=Buffer.from(JSON.stringify(f),"utf8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}return{feeds:p.map(h=>({feedId:h.feed_id,metadata:JSON.parse(h.jmetadata),createdAt:h.created_at,updatedAt:h.updated_at})),nextCursor:v}}get_feed(e){let o=this.db.query("SELECT feed_id, jmetadata, created_at, updated_at FROM feeds WHERE feed_id = ?").get(e);if(o!=null)return{feedId:o.feed_id,metadata:JSON.parse(o.jmetadata),createdAt:o.created_at,updatedAt:o.updated_at}}create_feed(e){let o=this.db.query("SELECT feed_id FROM feeds WHERE feed_id = ?").get(e.feedId);if(o!=null)throw new Error(`Feed ${e.feedId} already exists`);this.db.query("INSERT INTO feeds (feed_id, jmetadata, created_at, updated_at) VALUES (?, ?, ?, ?)").run(e.feedId,JSON.stringify(e.metadata),e.createdAt,e.updatedAt)}update_feed_metadata(e,o){let r=this.db.query("UPDATE feeds SET jmetadata = ? WHERE feed_id = ? RETURNING feed_id, jmetadata, created_at, updated_at").get(JSON.stringify(o),e);if(r==null)throw new Error(`Feed ${e} not found`)}delete_feed(e){this.db.query("DELETE FROM feeds WHERE feed_id = ?").run(e)}list_feed_messages(e,o){let r=Math.min(o?.limit??20,100),i=o?.since,a=o?.cursor,d="SELECT feed_id, message_id, jdata, created_at, updated_at FROM feed_messages WHERE feed_id = ?",c=[e];if(i!==void 0&&(d+=" AND created_at >= ?",c.push(i)),a!==void 0)try{let h=JSON.parse(Buffer.from(a.replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),[f,b]=h;d+=" AND (created_at < ? OR (created_at = ? AND message_id < ?))",c.push(b,b,f)}catch{}d+=" ORDER BY created_at DESC, message_id DESC LIMIT ?",c.push(r+1);let p=this.db.query(d).all(...c),v;if(p.length>r){p.pop();let h=p[p.length-1];if(h){let f=[h.message_id,h.created_at];v=Buffer.from(JSON.stringify(f),"utf8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}return{messages:p.map(h=>({id:h.message_id,data:JSON.parse(h.jdata),createdAt:h.created_at,updatedAt:h.updated_at})),nextCursor:v}}add_feed_message(e,o){if(this.get_feed(e)===void 0)throw new Error(`Feed ${e} not found`);this.db.query("INSERT INTO feed_messages (feed_id, message_id, jdata, created_at, updated_at) VALUES (?, ?, ?, ?, ?)").run(e,o.id,JSON.stringify(o.data),o.createdAt,o.updatedAt)}update_feed_message(e,o,r,i){let a=this.db.query("SELECT feed_id, message_id, jdata, created_at, updated_at FROM feed_messages WHERE feed_id = ? AND message_id = ?").get(e,o);if(a==null)throw new Error(`Feed message ${o} not found in feed ${e}`);let d=i??Date.now();if(d<a.updated_at)return{id:a.message_id,data:JSON.parse(a.jdata),createdAt:a.created_at,updatedAt:a.updated_at};let c=this.db.query("UPDATE feed_messages SET jdata = ?, updated_at = ? WHERE feed_id = ? AND message_id = ? AND updated_at <= ? RETURNING feed_id, message_id, jdata, created_at, updated_at").get(JSON.stringify(r),d,e,o,d);if(c==null){let p=this.db.query("SELECT feed_id, message_id, jdata, created_at, updated_at FROM feed_messages WHERE feed_id = ? AND message_id = ?").get(e,o);if(p==null)throw new Error(`Feed message ${o} not found in feed ${e}`);return{id:p.message_id,data:JSON.parse(p.jdata),createdAt:p.created_at,updatedAt:p.updated_at}}return{id:c.message_id,data:JSON.parse(c.jdata),createdAt:c.created_at,updatedAt:c.updated_at}}delete_feed_message(e,o){this.db.query("DELETE FROM feed_messages WHERE feed_id = ? AND message_id = ?").run(e,o)}close(){this.db.close()}};var go=".liveblocks/v1",he=go,Ze=!1,W=null;function Qe(){return ge(he,"rooms")}function te(){if(W)return;let t=ge(he,"db.sql");qe(po(t),{recursive:!0});let e=new uo(t,{create:!0});e.run("PRAGMA journal_mode = WAL"),e.run("PRAGMA foreign_keys = ON"),e.run(`CREATE TABLE IF NOT EXISTS rooms (
56
56
  room_id TEXT NOT NULL PRIMARY KEY,
57
57
  internal_id TEXT NOT NULL UNIQUE,
58
58
  organization_id TEXT NOT NULL,
@@ -71,13 +71,13 @@ import{a as Q,b as $e,c as V,d as J,e as ae,f as P,g,h as Oe,i as ze}from"./chun
71
71
  scopes TEXT NOT NULL,
72
72
  PRIMARY KEY (room_id, group_id),
73
73
  FOREIGN KEY (room_id) REFERENCES rooms(room_id) ON DELETE CASCADE
74
- ) STRICT`),W=e}function oe(){if(!W)throw new Error("Rooms DB not initialized");return W}function et(t){let e=oe(),o=e.query("SELECT user_id, scopes FROM room_user_permissions WHERE room_id = ?").all(t.room_id),s=e.query("SELECT group_id, scopes FROM room_group_permissions WHERE room_id = ?").all(t.room_id),i={};for(let d of o)i[d.user_id]=JSON.parse(d.scopes);let a={};for(let d of s)a[d.group_id]=JSON.parse(d.scopes);return{id:t.room_id,internalId:t.internal_id,organizationId:t.organization_id,defaultAccesses:JSON.parse(t.default_permissions),usersAccesses:i,groupsAccesses:a,metadata:JSON.parse(t.metadata),createdAt:t.created_at}}function ee(t){let e=oe().query("SELECT room_id, internal_id, organization_id, default_permissions, metadata, created_at FROM rooms WHERE room_id = ?").get(t);if(e)return et(e)}var go="default";function tt(t,e){let o=oe(),s=no(),i=new Date().toISOString(),a=e?.organizationId??go,d=e?.defaultAccesses??["room:write"],c=e?.metadata??{};if(o.run("INSERT INTO rooms (room_id, internal_id, organization_id, default_permissions, metadata, created_at) VALUES (?, ?, ?, ?, ?, ?)",[t,s,a,JSON.stringify(d),JSON.stringify(c),i]),e?.usersAccesses)for(let[p,v]of Object.entries(e.usersAccesses))o.run("INSERT INTO room_user_permissions (room_id, user_id, scopes) VALUES (?, ?, ?)",[t,p,JSON.stringify(v)]);if(e?.groupsAccesses)for(let[p,v]of Object.entries(e.groupsAccesses))o.run("INSERT INTO room_group_permissions (room_id, group_id, scopes) VALUES (?, ?, ?)",[t,p,JSON.stringify(v)]);return{id:t,internalId:s,organizationId:a,defaultAccesses:d,usersAccesses:e?.usersAccesses??{},groupsAccesses:e?.groupsAccesses??{},metadata:c,createdAt:i}}function ho(t,e){let o=oe(),s=ee(t);if(s){if(e.defaultAccesses!==void 0&&o.run("UPDATE rooms SET default_permissions = ? WHERE room_id = ?",[JSON.stringify(e.defaultAccesses),t]),e.metadata!==void 0){let i={...s.metadata,...e.metadata};o.run("UPDATE rooms SET metadata = ? WHERE room_id = ?",[JSON.stringify(i),t])}if(e.usersAccesses!==void 0)for(let[i,a]of Object.entries(e.usersAccesses))a===null?o.run("DELETE FROM room_user_permissions WHERE room_id = ? AND user_id = ?",[t,i]):o.run(`INSERT INTO room_user_permissions (room_id, user_id, scopes) VALUES (?, ?, ?)
74
+ ) STRICT`),W=e}function oe(){if(!W)throw new Error("Rooms DB not initialized");return W}function et(t){let e=oe(),o=e.query("SELECT user_id, scopes FROM room_user_permissions WHERE room_id = ?").all(t.room_id),r=e.query("SELECT group_id, scopes FROM room_group_permissions WHERE room_id = ?").all(t.room_id),i={};for(let d of o)i[d.user_id]=JSON.parse(d.scopes);let a={};for(let d of r)a[d.group_id]=JSON.parse(d.scopes);return{id:t.room_id,internalId:t.internal_id,organizationId:t.organization_id,defaultAccesses:JSON.parse(t.default_permissions),usersAccesses:i,groupsAccesses:a,metadata:JSON.parse(t.metadata),createdAt:t.created_at}}function ee(t){let e=oe().query("SELECT room_id, internal_id, organization_id, default_permissions, metadata, created_at FROM rooms WHERE room_id = ?").get(t);if(e)return et(e)}var ho="default";function tt(t,e){let o=oe(),r=io(),i=new Date().toISOString(),a=e?.organizationId??ho,d=e?.defaultAccesses??["room:write"],c=e?.metadata??{};if(o.run("INSERT INTO rooms (room_id, internal_id, organization_id, default_permissions, metadata, created_at) VALUES (?, ?, ?, ?, ?, ?)",[t,r,a,JSON.stringify(d),JSON.stringify(c),i]),e?.usersAccesses)for(let[p,v]of Object.entries(e.usersAccesses))o.run("INSERT INTO room_user_permissions (room_id, user_id, scopes) VALUES (?, ?, ?)",[t,p,JSON.stringify(v)]);if(e?.groupsAccesses)for(let[p,v]of Object.entries(e.groupsAccesses))o.run("INSERT INTO room_group_permissions (room_id, group_id, scopes) VALUES (?, ?, ?)",[t,p,JSON.stringify(v)]);return{id:t,internalId:r,organizationId:a,defaultAccesses:d,usersAccesses:e?.usersAccesses??{},groupsAccesses:e?.groupsAccesses??{},metadata:c,createdAt:i}}function vo(t,e){let o=oe(),r=ee(t);if(r){if(e.defaultAccesses!==void 0&&o.run("UPDATE rooms SET default_permissions = ? WHERE room_id = ?",[JSON.stringify(e.defaultAccesses),t]),e.metadata!==void 0){let i={...r.metadata,...e.metadata};o.run("UPDATE rooms SET metadata = ? WHERE room_id = ?",[JSON.stringify(i),t])}if(e.usersAccesses!==void 0)for(let[i,a]of Object.entries(e.usersAccesses))a===null?o.run("DELETE FROM room_user_permissions WHERE room_id = ? AND user_id = ?",[t,i]):o.run(`INSERT INTO room_user_permissions (room_id, user_id, scopes) VALUES (?, ?, ?)
75
75
  ON CONFLICT (room_id, user_id) DO UPDATE SET scopes = ?`,[t,i,JSON.stringify(a),JSON.stringify(a)]);if(e.groupsAccesses!==void 0)for(let[i,a]of Object.entries(e.groupsAccesses))a===null?o.run("DELETE FROM room_group_permissions WHERE room_id = ? AND group_id = ?",[t,i]):o.run(`INSERT INTO room_group_permissions (room_id, group_id, scopes) VALUES (?, ?, ?)
76
- ON CONFLICT (room_id, group_id) DO UPDATE SET scopes = ?`,[t,i,JSON.stringify(a),JSON.stringify(a)]);return ee(t)}}function vo(t){oe().run("DELETE FROM rooms WHERE room_id = ?",[t])}function ot(t){let e=Qe(),o=Xe(e,`${t}.sql`);if(!o.startsWith(Xe(e)+"/"))throw new Error("Invalid internal ID");return o}var U=new io(t=>{let e=ee(t)??tt(t);qe(Qe(),{recursive:!0});let o=new pe(ot(e.internalId));return new ao(t,{storage:o})});function st(){let t=uo(ge(mo(),"liveblocks-dev-"));return he=ge(t,"data"),Ze=!0,t}function C(t){return te(),ee(t)}function ve(t,e){te();let o=ee(t);if(o)return o;let s=tt(t,e);return U.getOrCreate(t),s}function rt(t){te();let e=oe(),o=[],s=[];if(t?.organizationId&&(o.push("organization_id = ?"),s.push(t.organizationId)),t?.roomId){o.push("room_id LIKE ? ESCAPE '\\'");let d=t.roomId.value.replace(/[%_\\]/g,"\\$&");s.push(`${d}%`)}if(t?.metadata)for(let[d,c]of Object.entries(t.metadata))o.push("JSON_EXTRACT(metadata, ?) = ?"),s.push(`$.${JSON.stringify(d)}`,c);let i=o.length>0?` WHERE ${o.join(" AND ")}`:"";return e.query(`SELECT room_id, internal_id, organization_id, default_permissions, metadata, created_at
76
+ ON CONFLICT (room_id, group_id) DO UPDATE SET scopes = ?`,[t,i,JSON.stringify(a),JSON.stringify(a)]);return ee(t)}}function Eo(t){oe().run("DELETE FROM rooms WHERE room_id = ?",[t])}function ot(t){let e=Qe(),o=Xe(e,`${t}.sql`);if(!o.startsWith(Xe(e)+"/"))throw new Error("Invalid internal ID");return o}var U=new ao(t=>{let e=ee(t)??tt(t);qe(Qe(),{recursive:!0});let o=new pe(ot(e.internalId));return new co(t,{storage:o})});function rt(){let t=lo(ge(fo(),"liveblocks-dev-"));return he=ge(t,"data"),Ze=!0,t}function C(t){return te(),ee(t)}function ve(t,e){te();let o=ee(t);if(o)return o;let r=tt(t,e);return U.getOrCreate(t),r}function st(t){te();let e=oe(),o=[],r=[];if(t?.organizationId&&(o.push("organization_id = ?"),r.push(t.organizationId)),t?.roomId){o.push("room_id LIKE ? ESCAPE '\\'");let d=t.roomId.value.replace(/[%_\\]/g,"\\$&");r.push(`${d}%`)}if(t?.metadata)for(let[d,c]of Object.entries(t.metadata))o.push("JSON_EXTRACT(metadata, ?) = ?"),r.push(`$.${JSON.stringify(d)}`,c);let i=o.length>0?` WHERE ${o.join(" AND ")}`:"";return e.query(`SELECT room_id, internal_id, organization_id, default_permissions, metadata, created_at
77
77
  FROM rooms
78
- ${i}`).all(...s).map(et)}function nt(t,e){return te(),ho(t,e)}async function it(t){te();let e=ee(t),o=U.get(t);if(o&&(o.endSessionBy(()=>!0,We.KICKED,"Deliberately disconnected"),o.unload(),o.driver.close(),U.delete(t)),e){let s=ot(e.internalId);try{await Bun.write(s,""),await Bun.file(s).unlink()}catch{}vo(t)}}function B(t){return te(),U.getOrCreate(t)}var Ce=null;function at(t){Ce=t;for(let e of U.values())e.runInMaintenanceMode(()=>t).catch(()=>{});t.then(()=>{Ce=null})}function dt(t){if(Ce!==null)return!0;let e=U.get(t);return e!==void 0&&e.isInMaintenance}function ce(){let t=[];for(let[e,o]of U)for(let s of o.listSessions())t.push({roomId:e,actor:s.actor,userId:s.user.id??s.user.anonymousId,connectedAt:s.createdAt,lastActiveAt:s.lastActiveAt});return t}function ct(t,e){let o=U.get(t);return o?o.endSessionBy(s=>s.actor===e,We.KICKED,"Deliberately disconnected")>0:!1}function ut(){for(let t of U.values())t.unload();U.clear()}function Le(){for(let t of U.values())t.unload(),t.driver.close();U.clear(),W&&(W.close(),W=null),Ze&&lo(he,{recursive:!0,force:!0})}import{nanoid as Io,tryParseJson as ft}from"@liveblocks/core";import{array as ht,constant as ue,enum_ as To,number as vt,object as ke,optional as Ne,record as yo,string as Ae,taggedUnion as _o}from"decoders";import{inexact as Eo,optional as lt,string as mt}from"decoders";var se=Eo({name:lt(mt),avatar:lt(mt)}).refineType();var q={RoomRead:"room:read",RoomWrite:"room:write",CommentsWrite:"comments:write",FeedsWrite:"feeds:write",RoomPresenceWrite:"room:presence:write",CommentsRead:"comments:read"};var bo=ke({alg:ue("none")}),So=ke({k:ue("acc"),pid:ue("localdev"),uid:Ae,ui:Ne(se),perms:yo(ht(To(q))),exp:vt}),Ro=ke({k:ue("id"),pid:ue("localdev"),uid:Ae,ui:Ne(se),gids:Ne(ht(Ae)),exp:vt}),wo=_o("k",{acc:So,id:Ro});function pt(t){return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function gt(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),o=e+"=".repeat((4-e.length%4)%4);return atob(o)}function Pe(t){let e=Math.floor(Date.now()/1e3),o={...t,iat:e,exp:e+3600,jti:Io(12)},s=pt(JSON.stringify({alg:"none",typ:"JWT"})),i=pt(JSON.stringify(o));return`${s}.${i}.`}function Ee(t){let e=t.split(".");if(e.length!==3)return null;let[o,s,i]=e;if(i!==""||!bo.value(ft(gt(o))))return null;let a=wo.value(ft(gt(s)));return!a||a.exp<Math.floor(Date.now()/1e3)?null:a}function Co(t,e){if(t.perms[e])return t.perms[e];for(let[o,s]of Object.entries(t.perms))if(o.endsWith("*")){let i=o.slice(0,-1);if(e.startsWith(i))return s}return[]}function Lo(t,e){let o=C(e);if(!o)return[];let s=new Set(o.defaultAccesses);if(t.gids)for(let i of t.gids)for(let a of o.groupsAccesses[i]??[])s.add(a);for(let i of o.usersAccesses[t.uid]??[])s.add(i);return Array.from(s)}function xo(t,e){return t.k==="acc"?Co(t,e):Lo(t,e)}function It(t){let e=new URL(t.url),o=e.pathname==="/v7"?Et.V7:e.pathname==="/v8"?Et.V8:null;if(o===null)return{ok:!1};let s=e.searchParams.get("roomId");if(!s)return{ok:!1};let i=e.searchParams.get("tok");if(i!==null){let d=Ee(i);if(!d)return{ok:!1};let c=xo(d,s);return c.length===0?{ok:!1}:{ok:!0,roomId:s,ticketData:{version:o,id:d.uid,info:d.ui,scopes:c}}}let a=e.searchParams.get("pubkey");return a!==null?a!=="pk_localdev"?{ok:!1,xwarn:"You can only use 'pk_localdev' as the public key"}:(ve(s,{defaultAccesses:[q.RoomWrite]}),{ok:!0,roomId:s,ticketData:{version:o,anonymousId:Oo(),scopes:[q.RoomWrite]}}):{ok:!1}}function No(t){return t.trim().split(`
79
- `).filter(Boolean).map(e=>{let o=e.match(/^(.+?):(\d+):(.*)$/);return o?{file:o[1],line:parseInt(o[2],10),text:o[3]}:null}).filter(e=>e!==null)}async function Tt(...t){try{let e=["git","grep","-nF",...t.flatMap(i=>["-e",i]),"--","."],o=Bun.spawn(e,{stdout:"pipe",stderr:"pipe"}),s=await new Response(o.stdout).text();return await o.exited,No(s)}catch{return[]}}function Ao(t){let e=t.trim();return e.startsWith("#")||e.startsWith("//")||e.startsWith("*")||e.startsWith("/*")}var De=[{pattern:"<LiveblocksProvider",expected:"baseUrl=",fixSnippet:t=>`${V("baseUrl")}=${J(`"${t}"`)}`,closePattern:">"},{pattern:"createClient(",expected:"baseUrl:",fixSnippet:t=>`${V("baseUrl")}: ${J(`"${t}"`)}`,closePattern:")"},{pattern:"new Liveblocks(",expected:"baseUrl:",fixSnippet:t=>`${V("baseUrl")}: ${J(`"${t}"`)}`,closePattern:")"}];async function yt(t){let e=De.map(c=>c.pattern),o=[...new Set(De.map(c=>c.expected))],[s,i]=await Promise.all([Tt(...e),Tt(...o)]);if(s.length===0)return[];let a=new Set(i.map(c=>c.file)),d=[];for(let c of s){if(Ao(c.text)||a.has(c.file))continue;let p=De.find(v=>c.text.includes(v.pattern));p&&d.push({match:c,check:p})}if(d.length>0){console.log(),console.warn(Q("\u26A0 Your project may not be configured for the local dev server.")),console.log(),console.log(` Missing baseUrl in the following location(s):
80
- `);for(let{match:c,check:p}of d)console.log(` ${$e(`${c.file}:${c.line}`)}`),console.log(` To fix, add ${p.fixSnippet(t)} to ${V(p.pattern)}${V(p.closePattern)}`),console.log();console.log(g(" \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E")),console.log(g(" \u2502 \u{1F4A1} ")+"Press "+P("p")+" to copy an AI fix prompt to your clipboard"+g(" \u2502")),console.log(g(" \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F")),console.log(),console.log(g(" To skip this check, use --no-check")),console.log()}return d}var ko={"<LiveblocksProvider":"baseUrl={...}","createClient(":"baseUrl: ...","new Liveblocks(":"baseUrl: ..."};function _t(t,e){let o=t.map(({match:s,check:i})=>{let a=ko[i.pattern]??"baseUrl: ...";return` - In \`${s.file}\` at line ${s.line}, add \`${a}\` to the \`${i.pattern}\` call`}).join(`
78
+ ${i}`).all(...r).map(et)}function nt(t,e){return te(),vo(t,e)}async function it(t){te();let e=ee(t),o=U.get(t);if(o&&(o.endSessionBy(()=>!0,We.KICKED,"Deliberately disconnected"),o.unload(),o.driver.close(),U.delete(t)),e){let r=ot(e.internalId);try{await Bun.write(r,""),await Bun.file(r).unlink()}catch{}Eo(t)}}function B(t){return te(),U.getOrCreate(t)}var Ce=null;function at(t){Ce=t;for(let e of U.values())e.runInMaintenanceMode(()=>t).catch(()=>{});t.then(()=>{Ce=null})}function dt(t){if(Ce!==null)return!0;let e=U.get(t);return e!==void 0&&e.isInMaintenance}function ce(){let t=[];for(let[e,o]of U)for(let r of o.listSessions())t.push({roomId:e,actor:r.actor,userId:r.user.id??r.user.anonymousId,connectedAt:r.createdAt,lastActiveAt:r.lastActiveAt});return t}function ct(t,e){let o=U.get(t);return o?o.endSessionBy(r=>r.actor===e,We.KICKED,"Deliberately disconnected")>0:!1}function ut(){for(let t of U.values())t.unload();U.clear()}function Le(){for(let t of U.values())t.unload(),t.driver.close();U.clear(),W&&(W.close(),W=null),Ze&&mo(he,{recursive:!0,force:!0})}import{nanoid as To,tryParseJson as ft}from"@liveblocks/core";import{array as ht,constant as ue,enum_ as yo,number as vt,object as ke,optional as Ne,record as _o,string as Ae,taggedUnion as bo}from"decoders";import{inexact as Io,optional as lt,string as mt}from"decoders";var re=Io({name:lt(mt),avatar:lt(mt)}).refineType();var q={RoomRead:"room:read",RoomWrite:"room:write",CommentsWrite:"comments:write",FeedsWrite:"feeds:write",RoomPresenceWrite:"room:presence:write",CommentsRead:"comments:read"};var So=ke({alg:ue("none")}),Ro=ke({k:ue("acc"),pid:ue("localdev"),uid:Ae,ui:Ne(re),perms:_o(ht(yo(q))),exp:vt}),Oo=ke({k:ue("id"),pid:ue("localdev"),uid:Ae,ui:Ne(re),gids:Ne(ht(Ae)),exp:vt}),wo=bo("k",{acc:Ro,id:Oo});function pt(t){return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function gt(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),o=e+"=".repeat((4-e.length%4)%4);return atob(o)}function Pe(t){let e=Math.floor(Date.now()/1e3),o={...t,iat:e,exp:e+3600,jti:To(12)},r=pt(JSON.stringify({alg:"none",typ:"JWT"})),i=pt(JSON.stringify(o));return`${r}.${i}.`}function Ee(t){let e=t.split(".");if(e.length!==3)return null;let[o,r,i]=e;if(i!==""||!So.value(ft(gt(o))))return null;let a=wo.value(ft(gt(r)));return!a||a.exp<Math.floor(Date.now()/1e3)?null:a}function Lo(t,e){if(t.perms[e])return t.perms[e];for(let[o,r]of Object.entries(t.perms))if(o.endsWith("*")){let i=o.slice(0,-1);if(e.startsWith(i))return r}return[]}function xo(t,e){let o=C(e);if(!o)return[];let r=new Set(o.defaultAccesses);if(t.gids)for(let i of t.gids)for(let a of o.groupsAccesses[i]??[])r.add(a);for(let i of o.usersAccesses[t.uid]??[])r.add(i);return Array.from(r)}function No(t,e){return t.k==="acc"?Lo(t,e):xo(t,e)}function It(t){let e=new URL(t.url),o=e.pathname==="/v7"?Et.V7:e.pathname==="/v8"?Et.V8:null;if(o===null)return{ok:!1};let r=e.searchParams.get("roomId");if(!r)return{ok:!1};let i=e.searchParams.get("tok");if(i!==null){let d=Ee(i);if(!d)return{ok:!1};let c=No(d,r);return c.length===0?{ok:!1}:{ok:!0,roomId:r,ticketData:{version:o,id:d.uid,info:d.ui,scopes:c}}}let a=e.searchParams.get("pubkey");return a!==null?a!=="pk_localdev"?{ok:!1,xwarn:"You can only use 'pk_localdev' as the public key"}:(ve(r,{defaultAccesses:[q.RoomWrite]}),{ok:!0,roomId:r,ticketData:{version:o,anonymousId:Co(),scopes:[q.RoomWrite]}}):{ok:!1}}function Ao(t){return t.trim().split(`
79
+ `).filter(Boolean).map(e=>{let o=e.match(/^(.+?):(\d+):(.*)$/);return o?{file:o[1],line:parseInt(o[2],10),text:o[3]}:null}).filter(e=>e!==null)}async function Tt(...t){try{let e=["git","grep","-nF",...t.flatMap(i=>["-e",i]),"--","."],o=Bun.spawn(e,{stdout:"pipe",stderr:"pipe"}),r=await new Response(o.stdout).text();return await o.exited,Ao(r)}catch{return[]}}function ko(t){let e=t.trim();return e.startsWith("#")||e.startsWith("//")||e.startsWith("*")||e.startsWith("/*")}var De=[{pattern:"<LiveblocksProvider",expected:"baseUrl=",fixSnippet:t=>`${V("baseUrl")}=${J(`"${t}"`)}`,closePattern:">"},{pattern:"createClient(",expected:"baseUrl:",fixSnippet:t=>`${V("baseUrl")}: ${J(`"${t}"`)}`,closePattern:")"},{pattern:"new Liveblocks(",expected:"baseUrl:",fixSnippet:t=>`${V("baseUrl")}: ${J(`"${t}"`)}`,closePattern:")"}];async function yt(t){let e=De.map(c=>c.pattern),o=[...new Set(De.map(c=>c.expected))],[r,i]=await Promise.all([Tt(...e),Tt(...o)]);if(r.length===0)return[];let a=new Set(i.map(c=>c.file)),d=[];for(let c of r){if(ko(c.text)||a.has(c.file))continue;let p=De.find(v=>c.text.includes(v.pattern));p&&d.push({match:c,check:p})}if(d.length>0){console.log(),console.warn(Q("\u26A0 Your project may not be configured for the local dev server.")),console.log(),console.log(` Missing baseUrl in the following location(s):
80
+ `);for(let{match:c,check:p}of d)console.log(` ${$e(`${c.file}:${c.line}`)}`),console.log(` To fix, add ${p.fixSnippet(t)} to ${V(p.pattern)}${V(p.closePattern)}`),console.log();console.log(g(" \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E")),console.log(g(" \u2502 \u{1F4A1} ")+"Press "+P("p")+" to copy an AI fix prompt to your clipboard"+g(" \u2502")),console.log(g(" \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F")),console.log(),console.log(g(" To skip this check, use --no-check")),console.log()}return d}var Po={"<LiveblocksProvider":"baseUrl={...}","createClient(":"baseUrl: ...","new Liveblocks(":"baseUrl: ..."};function _t(t,e){let o=t.map(({match:r,check:i})=>{let a=Po[i.pattern]??"baseUrl: ...";return` - In \`${r.file}\` at line ${r.line}, add \`${a}\` to the \`${i.pattern}\` call`}).join(`
81
81
  `);return`# Set up Liveblocks dev server
82
82
 
83
83
  1. Check which system the application is using for environment variables, then
@@ -138,7 +138,7 @@ new Liveblocks({
138
138
 
139
139
  Explain to the user that you've enabled the Liveblocks dev server by adding a an
140
140
  environment variable to the application, and share which file it is in. Explain
141
- that the user can disable this by setting it to "false".`}import{execSync as Po}from"child_process";function bt(t){let e=process.platform==="darwin"?"pbcopy":process.platform==="win32"?"clip.exe":"xclip -selection clipboard";Po(e,{input:t})}import Do from"bun";function St(t,e){let{promise:o,resolve:s}=Promise.withResolvers();return Do.connect({hostname:e,port:t,socket:{data(){},open(i){i.end(),s(!0)},error(){s(!1)},connectError(){s(!1)}}}),o}function je(t,e=!1){t&&console.log((e?ae:Q)(` \u26A0 ${t}`))}import{ZenRouter as Mo}from"@liveblocks/zenrouter";import{array as wt,enum_ as Uo,object as Ot,optional as Ue,record as Bo,string as Be}from"decoders";import{json as jo}from"@liveblocks/zenrouter";import{json as Rt}from"@liveblocks/zenrouter";function Me(t,e,o){return Rt(t,e,{"X-LB-Warn":o})}function N(t,e,o="This is a dummy response."){return Me(t,e,o)}function r(t="This endpoint isn't implemented in the Liveblocks dev server."){return Rt({error:"Not implemented",message:t},501,{"X-LB-Warn":t})}function Ie(t){let e=t.headers.get("Authorization");if(e==="Bearer sk_localdev")return!0;if(!e)throw jo({error:"Unauthorized",message:"Missing secret key"},401);if(e.startsWith("Bearer "))throw Me({error:"Forbidden",message:"Invalid secret key. You can only use 'sk_localdev' as a secret key"},403,"You can only use 'sk_localdev' as the secret key");return!1}var Fo=Uo(q),le=new Mo({authorize:({req:t})=>Ie(t)});le.route("POST /v2/authorize-user",Ot({userId:Be,userInfo:Ue(se),permissions:Bo(wt(Fo))}),({body:t})=>({token:Pe({k:"acc",pid:"localdev",uid:t.userId,perms:t.permissions,ui:t.userInfo})}));le.route("POST /v2/identify-user",Ot({userId:Be,userInfo:Ue(se),groupIds:Ue(wt(Be))}),({body:t})=>({token:Pe({k:"id",pid:"localdev",uid:t.userId,ui:t.userInfo,gids:t.groupIds})}));import{ZenRouter as Jo}from"@liveblocks/zenrouter";var u=new Jo({cors:{allowCredentials:!0,maxAge:600,exposeHeaders:["X-LB-Warn"]},authorize:({req:t})=>{let e=t.headers.get("Authorization");if(!e?.startsWith("Bearer "))return!1;let o=e.slice(7);return Ee(o)!==null}});u.route("GET /v2/c/threads",()=>N({threads:[],inboxNotifications:[],subscriptions:[],meta:{nextCursor:null,requestedAt:new Date().toISOString(),permissionHints:{}}}));u.route("GET /v2/c/threads/delta",()=>N({threads:[],inboxNotifications:[],subscriptions:[],meta:{requestedAt:new Date().toISOString(),permissionHints:{}}}));u.route("GET /v2/c/inbox-notifications",()=>N({inboxNotifications:[],threads:[],subscriptions:[],groups:[],meta:{nextCursor:null,requestedAt:new Date().toISOString()}}));u.route("GET /v2/c/inbox-notifications/count",()=>N({count:0}));u.route("GET /v2/c/inbox-notifications/delta",()=>N({inboxNotifications:[],threads:[],subscriptions:[],groups:[],deletedInboxNotifications:[],deletedThreads:[],deletedSubscriptions:[],meta:{requestedAt:new Date().toISOString()}}));u.route("GET /v2/c/rooms/<roomId>/threads",()=>N({data:[],inboxNotifications:[],subscriptions:[],meta:{nextCursor:null,requestedAt:new Date().toISOString(),permissionHints:{}}}));u.route("GET /v2/c/rooms/<roomId>/threads/delta",()=>N({data:[],inboxNotifications:[],subscriptions:[],deletedThreads:[],deletedInboxNotifications:[],deletedSubscriptions:[],meta:{requestedAt:new Date().toISOString(),permissionHints:{}}}));u.route("POST /v2/c/rooms/<roomId>/text-metadata",()=>N({status:"ok"}));u.route("PUT /v2/c/rooms/<roomId>/attachments/<attachmentId>/upload/<name>",()=>r()),u.route("POST /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<name>",()=>r()),u.route("PUT /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>/<partNumber>",()=>r()),u.route("POST /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>/complete",()=>r()),u.route("DELETE /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>",()=>r()),u.route("POST /v2/c/rooms/<roomId>/attachments/presigned-urls",()=>r()),u.route("POST /v2/c/rooms/<roomId>/send-message",()=>r()),u.route("GET /v2/c/rooms/<roomId>/storage",()=>r()),u.route("POST /v2/c/rooms/<roomId>/version",()=>r()),u.route("GET /v2/c/rooms/<roomId>/y-version/<version>",()=>r()),u.route("POST /v2/c/rooms/<roomId>/ai/contextual-prompt",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads/search",()=>r()),u.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/metadata",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/subscribe",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments",()=>r()),u.route("GET /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>r()),u.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/reactions",()=>r()),u.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/reactions/<emoji>",()=>r()),u.route("GET /v2/c/rooms/<roomId>/threads/comments/search",()=>r()),u.route("GET /v2/c/rooms/<roomId>/threads/<threadId>/participants",()=>r()),u.route("GET /v2/c/rooms/<roomId>/notification-settings",()=>r()),u.route("GET /v2/c/rooms/<roomId>/subscription-settings",()=>r()),u.route("POST /v2/c/rooms/<roomId>/notification-settings",()=>r()),u.route("POST /v2/c/rooms/<roomId>/subscription-settings",()=>r()),u.route("DELETE /v2/c/inbox-notifications",()=>r()),u.route("POST /v2/c/inbox-notifications/read",()=>r()),u.route("DELETE /v2/c/inbox-notifications/<inboxNotificationId>",()=>r()),u.route("POST /v2/c/rooms/<roomId>/inbox-notifications/read",()=>r()),u.route("POST /v2/c/rooms/<roomId>/text-mentions",()=>r()),u.route("DELETE /v2/c/rooms/<roomId>/text-mentions/<mentionId>",()=>r()),u.route("GET /v2/c/notification-settings",()=>r()),u.route("POST /v2/c/notification-settings",()=>r()),u.route("GET /v2/c/rooms/<roomId>/thread-with-notification/<threadId>",()=>r()),u.route("GET /v2/c/urls/metadata",()=>r()),u.route("GET /v2/c/rooms/<roomId>/versions",()=>r()),u.route("GET /v2/c/rooms/<roomId>/versions/delta",()=>r()),u.route("POST /v2/c/groups/find",()=>r());import{abort as Lt,html as $o,json as zo,ZenRouter as Yo}from"@liveblocks/zenrouter";var Ct=`<!doctype html>
141
+ that the user can disable this by setting it to "false".`}import{execSync as Do}from"child_process";function bt(t){let e=process.platform==="darwin"?"pbcopy":process.platform==="win32"?"clip.exe":"xclip -selection clipboard";Do(e,{input:t})}import jo from"bun";function St(t,e){let{promise:o,resolve:r}=Promise.withResolvers();return jo.connect({hostname:e,port:t,socket:{data(){},open(i){i.end(),r(!0)},error(){r(!1)},connectError(){r(!1)}}}),o}function je(t,e=!1){t&&console.log((e?ae:Q)(` \u26A0 ${t}`))}import{ZenRouter as Uo}from"@liveblocks/zenrouter";import{array as Ot,enum_ as Bo,object as wt,optional as Ue,record as Fo,string as Be}from"decoders";import{json as Mo}from"@liveblocks/zenrouter";import{json as Rt}from"@liveblocks/zenrouter";function Me(t,e,o){return Rt(t,e,{"X-LB-Warn":o})}function N(t,e,o="This is a dummy response."){return Me(t,e,o)}function s(t="This endpoint isn't implemented in the Liveblocks dev server."){return Rt({error:"Not implemented",message:t},501,{"X-LB-Warn":t})}function Ie(t){let e=t.headers.get("Authorization");if(e==="Bearer sk_localdev")return!0;if(!e)throw Mo({error:"Unauthorized",message:"Missing secret key"},401);if(e.startsWith("Bearer "))throw Me({error:"Forbidden",message:"Invalid secret key. You can only use 'sk_localdev' as a secret key"},403,"You can only use 'sk_localdev' as the secret key");return!1}var Jo=Bo(q),le=new Uo({authorize:({req:t})=>Ie(t)});le.route("POST /v2/authorize-user",wt({userId:Be,userInfo:Ue(re),permissions:Fo(Ot(Jo))}),({body:t})=>({token:Pe({k:"acc",pid:"localdev",uid:t.userId,perms:t.permissions,ui:t.userInfo})}));le.route("POST /v2/identify-user",wt({userId:Be,userInfo:Ue(re),groupIds:Ue(Ot(Be))}),({body:t})=>({token:Pe({k:"id",pid:"localdev",uid:t.userId,ui:t.userInfo,gids:t.groupIds})}));import{ZenRouter as Go}from"@liveblocks/zenrouter";var l=new Go({cors:{allowCredentials:!0,maxAge:600,exposeHeaders:["X-LB-Warn"]},authorize:({req:t})=>{let e=t.headers.get("Authorization");if(!e?.startsWith("Bearer "))return!1;let o=e.slice(7);return Ee(o)!==null}});l.route("GET /v2/c/threads",()=>N({threads:[],inboxNotifications:[],subscriptions:[],meta:{nextCursor:null,requestedAt:new Date().toISOString(),permissionHints:{}}}));l.route("GET /v2/c/threads/delta",()=>N({threads:[],inboxNotifications:[],subscriptions:[],meta:{requestedAt:new Date().toISOString(),permissionHints:{}}}));l.route("GET /v2/c/inbox-notifications",()=>N({inboxNotifications:[],threads:[],subscriptions:[],groups:[],meta:{nextCursor:null,requestedAt:new Date().toISOString()}}));l.route("GET /v2/c/inbox-notifications/count",()=>N({count:0}));l.route("GET /v2/c/inbox-notifications/delta",()=>N({inboxNotifications:[],threads:[],subscriptions:[],groups:[],deletedInboxNotifications:[],deletedThreads:[],deletedSubscriptions:[],meta:{requestedAt:new Date().toISOString()}}));l.route("GET /v2/c/rooms/<roomId>/threads",()=>N({data:[],inboxNotifications:[],subscriptions:[],meta:{nextCursor:null,requestedAt:new Date().toISOString(),permissionHints:{}}}));l.route("GET /v2/c/rooms/<roomId>/threads/delta",()=>N({data:[],inboxNotifications:[],subscriptions:[],deletedThreads:[],deletedInboxNotifications:[],deletedSubscriptions:[],meta:{requestedAt:new Date().toISOString(),permissionHints:{}}}));l.route("POST /v2/c/rooms/<roomId>/text-metadata",()=>N({status:"ok"}));l.route("PUT /v2/c/rooms/<roomId>/attachments/<attachmentId>/upload/<name>",()=>s()),l.route("POST /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<name>",()=>s()),l.route("PUT /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>/<partNumber>",()=>s()),l.route("POST /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>/complete",()=>s()),l.route("DELETE /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>",()=>s()),l.route("POST /v2/c/rooms/<roomId>/attachments/presigned-urls",()=>s()),l.route("POST /v2/c/rooms/<roomId>/send-message",()=>s()),l.route("GET /v2/c/rooms/<roomId>/storage",()=>s()),l.route("POST /v2/c/rooms/<roomId>/version",()=>s()),l.route("GET /v2/c/rooms/<roomId>/y-version/<version>",()=>s()),l.route("POST /v2/c/rooms/<roomId>/ai/contextual-prompt",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads/search",()=>s()),l.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/metadata",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/subscribe",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments",()=>s()),l.route("GET /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>s()),l.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),l.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/reactions",()=>s()),l.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/reactions/<emoji>",()=>s()),l.route("GET /v2/c/rooms/<roomId>/threads/comments/search",()=>s()),l.route("GET /v2/c/rooms/<roomId>/threads/<threadId>/participants",()=>s()),l.route("GET /v2/c/rooms/<roomId>/notification-settings",()=>s()),l.route("GET /v2/c/rooms/<roomId>/subscription-settings",()=>s()),l.route("POST /v2/c/rooms/<roomId>/notification-settings",()=>s()),l.route("POST /v2/c/rooms/<roomId>/subscription-settings",()=>s()),l.route("DELETE /v2/c/inbox-notifications",()=>s()),l.route("POST /v2/c/inbox-notifications/read",()=>s()),l.route("DELETE /v2/c/inbox-notifications/<inboxNotificationId>",()=>s()),l.route("POST /v2/c/rooms/<roomId>/inbox-notifications/read",()=>s()),l.route("POST /v2/c/rooms/<roomId>/text-mentions",()=>s()),l.route("DELETE /v2/c/rooms/<roomId>/text-mentions/<mentionId>",()=>s()),l.route("GET /v2/c/notification-settings",()=>s()),l.route("POST /v2/c/notification-settings",()=>s()),l.route("GET /v2/c/rooms/<roomId>/thread-with-notification/<threadId>",()=>s()),l.route("GET /v2/c/urls/metadata",()=>s()),l.route("GET /v2/c/rooms/<roomId>/versions",()=>s()),l.route("GET /v2/c/rooms/<roomId>/versions/delta",()=>s()),l.route("POST /v2/c/groups/find",()=>s());import{abort as Lt,html as zo,json as Yo,ZenRouter as Vo}from"@liveblocks/zenrouter";var Ct=`<!doctype html>
142
142
  <html lang="en">
143
143
  <head>
144
144
  <meta charset="UTF-8" />
@@ -394,10 +394,10 @@ that the user can disable this by setting it to "false".`}import{execSync as Po}
394
394
  </main>
395
395
  </body>
396
396
  </html>
397
- `;var re=new Yo({authorize:()=>!0});re.route("GET /v7",()=>Lt(426));re.route("GET /v8",()=>Lt(426));re.route("GET /health",()=>zo({status:"ok"}));re.route("GET /",()=>$o(Ct.replace("__VERSION__","1.4.1")));import{ServerMsgCode as Wo}from"@liveblocks/core";import{QueryParser as qo}from"@liveblocks/query-parser";import{ConsoleTarget as Pt,jsonObjectYolo as Zo,Logger as Dt,ROOT_YDOC_ID as Fe,snapshotToLossyJson_eager as Qo,snapshotToNodeStream as es,snapshotToPlainLson_eager as jt,transientClientMsgDecoder as ts}from"@liveblocks/server";import{json as Te,ndjsonStream as os,ZenRouter as ss}from"@liveblocks/zenrouter";import{array as K,constant as rs,either as ns,enum_ as is,nullable as kt,object as ye,optional as z,record as me,string as D}from"decoders";function*Vo(t){for(let e of t)for(let o of e)yield o}function xt(...t){return Vo(t)}import{Base64 as as}from"js-base64";import*as _e from"yjs";import*as L from"yjs";function Ko(t){return t.content instanceof L.ContentFormat||t.content instanceof L.ContentEmbed?"text":"arr"in t.content?"array":"str"in t.content?"text":"type"in t.content?"xml":"unknown"}function Ho(t){let e=[],o=t;for(;o!==null;){if(!o.deleted)if(o.content instanceof L.ContentType)e.push(o.content.type.toJSON());else if(o.content instanceof L.ContentString)e.push(o.content.str);else if(o.content instanceof L.ContentFormat){let{key:s,value:i}=o.content;e.push({key:s,value:i})}else o.content instanceof L.ContentEmbed&&e.push(o.content.embed);o=o.right}return e}function Nt(t,e,o,s=!1){if(!e._first&&e._map instanceof Map&&e._map.size>0)return t.getMap(o).toJSON();if(e._first!==null){let i=Ko(e._first);if(i==="text")return s?Ho(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 Xo={ytext:L.Text,yxmlfragment:L.XmlFragment,yxmltext:L.XmlText,ymap:L.Map,yarray:L.Array};function At(t,e="",o=!1,s=""){let i={};if(e.length){if(t.share.has(e)){if(s.length){let a=Xo[s];if(a)return t.get(e,a).toJSON()}return{[e]:Nt(t,t.share.get(e),e,o)}}return{[e]:""}}for(let[a,d]of t.share)i[a]=Nt(t,d,a,o);return i}var Mt=(o=>(o.PlainLson="plain-lson",o.LossyJson="json",o))(Mt||{}),ds=is(Mt),Ut=me(D,ns(D,K(D))),n=new ss({authorize:({req:t})=>Ie(t)});function x(t){return Te({error:"ROOM_NOT_FOUND",message:`Room with id "${t}" not found.`},404)}var cs=new qo({fields:{roomId:"string"},indexableFields:{metadata:"token"}});function us(t){let e=cs.parse(t),o={};for(let s of e.query.allOf)switch(s.type){case"PrefixCondition":{s.field.type==="DirectField"&&s.field.ref.name==="roomId"&&(o.roomId={value:s.prefix.value,operator:"^"});break}case"ExactCondition":{s.field.type==="KeyedField"&&s.field.base.name==="metadata"&&s.value.type==="LiteralString"&&(o.metadata??={},o.metadata[s.field.key]=s.value.value);break}}return o}function be(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 x(t.roomId);return be(e)});n.route("GET /v2/rooms",({url:t})=>{let e,o=t.searchParams.get("query");if(o)try{e=us(o)}catch(d){return Te({error:"INVALID_QUERY",message:d instanceof Error?d.message:String(d)},422)}else{let d={};for(let[c,p]of t.searchParams.entries())c.startsWith("metadata.")&&(d[c.slice(9)]=p);Object.keys(d).length>0&&(e={metadata:d})}let s=t.searchParams.get("organizationId")??void 0;return s&&(e={...e,organizationId:s}),{data:rt(e).map(be),nextPage:null,nextCursor:null}});n.route("POST /v2/rooms",ye({id:D,organizationId:z(D),defaultAccesses:z(K(D)),metadata:z(Ut),usersAccesses:z(me(D,K(D))),groupsAccesses:z(me(D,K(D)))}),({body:t,url:e})=>{if(!e.searchParams.has("idempotent")&&C(t.id))return Te({error:"ROOM_ALREADY_EXISTS",message:`Room with id "${t.id}" already exists.`},409);let s=ve(t.id,{organizationId:t.organizationId,defaultAccesses:t.defaultAccesses,metadata:t.metadata,usersAccesses:t.usersAccesses,groupsAccesses:t.groupsAccesses});return be(s)});n.route("POST /v2/rooms/<roomId>",ye({defaultAccesses:z(K(D)),metadata:z(Ut),usersAccesses:z(me(D,kt(K(D)))),groupsAccesses:z(me(D,kt(K(D))))}),({p:t,body:e})=>{let o=nt(t.roomId,{defaultAccesses:e.defaultAccesses,metadata:e.metadata,usersAccesses:e.usersAccesses,groupsAccesses:e.groupsAccesses});if(!o)throw x(t.roomId);return be(o)});n.route("DELETE /v2/rooms/<roomId>",async({p:t})=>(await it(t.roomId),new Response(null,{status:204})));n.route("GET /v2/rooms/<roomId>/storage",async({url:t,p:e})=>{if(!C(e.roomId))throw x(e.roomId);let o=ds.value(t.searchParams.get("format"))??"plain-lson",s=B(e.roomId);await s.load();let i=s.storage.loadedDriver.get_snapshot(!1),a=o==="json"?Qo(i):jt(i);return new Response(JSON.stringify(a),{status:200,headers:{"Content-Type":"application/json"}})});n.route("POST /v2/rooms/<roomId>/storage",ye({liveblocksType:rs("LiveObject"),data:Zo}).refineType(),async({p:t,body:e})=>{if(!C(t.roomId))throw x(t.roomId);let o=B(t.roomId);await o.load();let s=o.storage.loadedDriver.get_snapshot(!1),i=jt(s);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 x(t.roomId);let e=B(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 x(e.roomId);let o=B(e.roomId);await o.load();let s=t.searchParams.get("key")??"",i=t.searchParams.get("type")??"",a=t.searchParams.get("guid")??Fe,d=t.searchParams.get("formatting")!==null,c=new Dt(new Pt("warning")),p=await o.yjsStorage.getYDoc(c,a),v=At(p,s,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 x(o.roomId);let s=B(o.roomId);await s.load();let i=await t.arrayBuffer(),a=as.fromUint8Array(new Uint8Array(i)),d=e.searchParams.get("guid"),p=e.searchParams.get("encoder")==="v2",v=d&&d!==Fe?d:void 0;try{let _=await s.mutex.runExclusive(()=>s.yjsStorage.addYDocUpdate({},a,v,p)),h=f=>{};return s.sendToAll({type:Wo.UPDATE_YDOC,update:a,isSync:!1,stateVector:null,guid:v,v2:p,remoteSnapshotHash:_.snapshotHash},void 0,h),new Response(JSON.stringify({success:!0}),{status:200,headers:{"Content-Type":"application/json"}})}catch(_){return new Response(JSON.stringify({error:"UNPROCESSABLE_ENTITY",message:_ instanceof Error?_.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 x(e.roomId);let o=B(e.roomId);await o.load();let s=t.searchParams.get("guid")??Fe,i=t.searchParams.get("encoder"),a=new Dt(new Pt("warning")),d=await o.yjsStorage.getYDoc(a,s),c=i==="v2"?_e.encodeStateAsUpdateV2(d):_e.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 x(t.roomId);let o=B(t.roomId).listSessions().map(s=>({type:"user",connectionId:s.actor,id:s.user.id,info:s.user.info}));return Te({data:o})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw x(t.roomId);return N({ok:!0})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!C(t.roomId))throw x(t.roomId);return N({ok:!0})});n.route("GET /v2/rooms/<roomId>/feeds",({p:t})=>{if(!C(t.roomId))throw x(t.roomId);return N({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 x(t.roomId);return N({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 x(t.roomId);return N({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 x(t.roomId);let e=Date.now();return N({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 x(t.roomId);let e=Date.now();return N({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 x(t.roomId);return N({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 x(t.roomId);return N({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 x(t.roomId);let e=B(t.roomId);await e.load();let o=await e.driver.next_actor(),s=e.storage.loadedDriver.get_snapshot(!1);return os(xt([{actor:o}],es(s)))});n.route("POST /v2/rooms/<roomId>/send-message",ye({messages:K(ts)}),async({p:t,body:e})=>{if(!C(t.roomId))throw x(t.roomId);let o=B(t.roomId);await o.load();let[s,i]=await o.createBackendSession_experimental();return await o.processClientMsgFromBackendSession(s,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",()=>r()),n.route("POST /v2/rooms/<roomId>/presence",()=>r()),n.route("GET /v2/rooms/<roomId>/threads",()=>r()),n.route("POST /v2/rooms/<roomId>/upsert",()=>r()),n.route("POST /v2/rooms/<roomId>/update-room-id",()=>r()),n.route("POST /v2/rooms/<roomId>/update-organization-id",()=>r()),n.route("GET /v2/rooms/<roomId>/prewarm",()=>r()),n.route("POST /v2/rooms/<roomId>/broadcast_event",()=>r()),n.route("GET /v2/rooms/<roomId>/versions",()=>r()),n.route("GET /v2/rooms/<roomId>/version/<version>",()=>r()),n.route("POST /v2/rooms/<roomId>/version",()=>r()),n.route("POST /v2/rooms/<roomId>/threads",()=>r()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>",()=>r()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>r()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>r()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/subscribe",()=>r()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>r()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/subscriptions",()=>r()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/metadata",()=>r()),n.route("DELETE /v2/rooms/<roomId>/threads/<threadId>",()=>r()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/participants",()=>r()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/inbox-notifications",()=>r()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments",()=>r()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>r()),n.route("DELETE /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>r()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/add-reaction",()=>r()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/remove-reaction",()=>r()),n.route("GET /v2/rooms/<roomId>/attachments/<attachmentId>",()=>r()),n.route("GET /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>r()),n.route("GET /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>r()),n.route("POST /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>r()),n.route("POST /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>r()),n.route("DELETE /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>r()),n.route("DELETE /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>r()),n.route("GET /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>r()),n.route("DELETE /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>r()),n.route("GET /v2/users/<userId>/inbox-notifications",()=>r()),n.route("DELETE /v2/users/<userId>/inbox-notifications",()=>r()),n.route("GET /v2/users/<userId>/notification-settings",()=>r()),n.route("POST /v2/users/<userId>/notification-settings",()=>r()),n.route("DELETE /v2/users/<userId>/notification-settings",()=>r()),n.route("GET /v2/users/<userId>/room-subscription-settings",()=>r()),n.route("POST /v2/inbox-notifications/trigger",()=>r()),n.route("POST /v2/inbox-notifications/<inboxNotificationId>/read",()=>r()),n.route("POST /v2/groups",()=>r()),n.route("GET /v2/groups/<groupId>",()=>r()),n.route("POST /v2/groups/<groupId>/add-members",()=>r()),n.route("POST /v2/groups/<groupId>/remove-members",()=>r()),n.route("DELETE /v2/groups/<groupId>",()=>r()),n.route("GET /v2/groups",()=>r()),n.route("GET /v2/users/<userId>/groups",()=>r()),n.route("GET /v2/ai/copilots",()=>r()),n.route("GET /v2/ai/copilots/<copilotId>",()=>r()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge",()=>r()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/<knowledgeSourceId>",()=>r()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>r()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>/links",()=>r()),n.route("POST /v2/ai/copilots",()=>r()),n.route("POST /v2/ai/copilots/<copilotId>",()=>r()),n.route("POST /v2/ai/copilots/<copilotId>/knowledge/web",()=>r()),n.route("DELETE /v2/ai/copilots/<copilotId>",()=>r()),n.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>r()),n.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>",()=>r()),n.route("PUT /v2/ai/copilots/<copilotId>/knowledge/file/<fileName>",()=>r()),n.route("GET /v2/management/projects",()=>r()),n.route("GET /v2/management/projects/<projectId>",()=>r()),n.route("POST /v2/management/projects",()=>r()),n.route("POST /v2/management/projects/<projectId>",()=>r()),n.route("DELETE /v2/management/projects/<projectId>",()=>r()),n.route("GET /v2/management/projects/<projectId>/webhooks",()=>r()),n.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>r()),n.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>r()),n.route("POST /v2/management/projects/<projectId>/webhooks",()=>r()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>r()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>r()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/delete-additional-headers",()=>r()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/recover-failed-messages",()=>r()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/secret/roll",()=>r()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/test",()=>r()),n.route("DELETE /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>r()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/activate",()=>r()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/deactivate",()=>r()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/roll",()=>r()),n.route("POST /v2/management/projects/<projectId>/api-keys/secret/roll",()=>r());function Jt(t,e,o,s){if(!t.upgrade(e,{data:{refuseConnection:{code:o,message:s}}}))return new Response("Could not upgrade to WebSocket",{status:426})}var ne=new ms;ne.relay("/v2/authorize-user/*",le);ne.relay("/v2/identify-user/*",le);ne.relay("/v2/c/*",u);ne.relay("/v2/*",n);ne.relay("/*",re);var Ge=1153;function Gt(t){if(t===void 0)return;let e=Number(t);return Number.isInteger(e)&&e>0&&e<=65535?e:void 0}function ps(t){return process.platform==="win32"?[process.env.COMSPEC||"cmd.exe","/c",t]:["sh","-c",t]}function gs(t){return"'"+t.replace(/'/g,"'\\''")+"'"}var hs={description:"Start the local Liveblocks dev server",async run(t){let{options:e,args:o}=ze(t,{port:{type:"string",short:"p",default:Ge.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}},{allowPositionals:!0});if(o.length>0&&!e.cmd&&(console.error(ae("Extra arguments are only supported with --cmd (-c)")),process.exit(1)),o.length>0&&e.cmd){let f=o.map(gs).join(" ");e.cmd.includes("{}")?e.cmd=e.cmd.replaceAll("{}",f):e.cmd+=" "+f}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: ${Ge})`),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 s=!1;e.ci&&(s=!0,e["no-check"]=!0),e.cmd&&(s=!0,e["no-check"]=!0);let i=Gt(e.port)??Gt(process.env.LIVEBLOCKS_DEVSERVER_PORT)??Ge,a=e.host||process.env.LIVEBLOCKS_DEVSERVER_HOST||"localhost",d=s?st():null;await St(i,a)&&(console.error(`Port ${i} is already in use.
398
- Is another dev server already running?`),process.exit(1));let c,p=!1;function v(){return Je.serve({hostname:a,port:i,async fetch(f,b){if(f.headers.get("Upgrade")==="websocket"){let y=It(f);if(!y.ok)return je(y.xwarn,!0),Jt(b,f,Ft.NOT_ALLOWED,"You have no access to this room");let{roomId:F,ticketData:Z}=y;if(dt(F))return Jt(b,f,Ft.TRY_AGAIN_LATER,"Server is undergoing maintenance, try again later");let A=B(F);await A.load();let k=await A.createTicket(Z),Y=k.sessionKey;if(b.upgrade(f,{data:{room:A,ticket:k,sessionKey:Y}})){console.log(`${J("101")} WS ${new URL(f.url).pathname}${g(` - ${F}`)}`);return}return new Response("Could not upgrade to WebSocket",{status:426})}let w=new URL(f.url);if(f.method==="POST"&&w.pathname==="/crash")return console.log(`${J("204")} POST /crash`),setTimeout(()=>{_()},0),new Response(null,{status:204});let m=`${f.method} ${w.pathname}`,l;if(p)try{l=await f.clone().text()}catch{}let I=await ne.fetch(f),S=I.status,O=S>=500?ae(S):S>=400?Q(S):J(S);console.log(`${O} ${m}`);let M=I.headers.get("X-LB-Warn")??void 0;if(je(M,!I.ok),p){if(l){let Z=Bt(l);Z!==void 0&&console.log(g(` \u2192 ${JSON.stringify(Z)}`))}let y=await I.clone().text(),F=Bt(y);F!==void 0&&console.log(g(` \u2190 ${JSON.stringify(F)}`))}return I},error(f){return console.error(f),new Response("An unknown error occurred",{status:500})},websocket:{async open(f){let{refuseConnection:b,room:w,ticket:m}=f.data;if(b){f.close(b.code,b.message);return}w&&m&&await w.startBrowserSession(m,f)},async message(f,b){let{room:w,sessionKey:m}=f.data;w&&m&&await w.handleData(m,b)},close(f,b,w){let{room:m,sessionKey:l}=f.data;m&&l&&m.endBrowserSession(l,b,w)}}})}c=v();async function _(){ut(),await c.stop(!0),c=v(),console.log("Crash \u{1F4A5}")}let h=f=>process.stderr.write(f+`
399
- `);if(e.cmd){h(`Liveblocks dev server ${g("v1.4.1")} running at http://${c.hostname}:${c.port}`),d&&e.verbose&&h(g(`Ephemeral mode, using ${d}`));let f=fs(d,"server.log");h(g(`Server logs: ${f}`));let b=Je.file(f).writer(),w=(...l)=>{b.write(l.map(String).join(" ")+`
400
- `),b.flush()};console.log=w,console.error=w;let m=1;try{let l=Je.spawn(ps(e.cmd),{stdin:"inherit",stdout:"inherit",stderr:"inherit",env:{...process.env,LIVEBLOCKS_DEV_SERVER_HOST:a,LIVEBLOCKS_DEV_SERVER_PORT:String(i)}}),I=()=>{l.kill()};process.on("SIGTERM",I),process.on("SIGINT",I),m=await l.exited}finally{b.end(),await c.stop(),Le(),h(g("Liveblocks dev server shut down"))}process.exit(m)}else{let f=`http://${a}:${i}`,b=e["no-check"]?[]:await yt(f),w="logs",m=null,l=null,I=null,S=`http://${c.hostname}:${c.port}`,O=()=>{let R=w==="logs"?P(" Logs "):g(" Logs "),T=w==="sockets"?P(" Sockets "):g(" Sockets "),E=R+g("|")+T,ie=(l?V("\u23F8 maintenance")+" ":"")+g(`Liveblocks running at ${S}`),Re=process.stdout.columns??80,we=Math.max(1,Re-Oe(E).length-Oe(ie).length);return E+" ".repeat(we)+ie},M=[],y=console.log.bind(console);console.log=(...R)=>{let T=R.map(String).join(" ");M.push(T),w==="logs"&&y(T)};let F=()=>g(" ")+P("q")+g(" quit, ")+P("!")+g(" crash, ")+P("c")+g(" clear, ")+P("v")+g(p?" verbose (on)":" verbose"),Z=()=>{I&&(clearInterval(I),I=null),w="logs",process.stdout.write("\x1B[2J\x1B[H"),y(O()),y(F()),y();for(let R of M)y(R)},A=0,k=[],Y=R=>`${R.roomId}:${R.actor}`,Se=()=>{k=ce().map(R=>({...R,alive:!0}))},$t=()=>{let R=new Set(ce().map(Y));for(let E of k)E.alive=R.has(Y(E));let T=new Set(k.map(Y));for(let E of ce())T.has(Y(E))||k.push({...E,alive:!0})},zt=R=>{let T=Date.now()-R,E=Math.floor(T/1e3);if(E<60)return`${E}s`;let j=Math.floor(E/60);return j<60?`${j}m`:`${Math.floor(j/60)}h`},Yt=R=>{if(!R)return"";let T=Date.now()-R;return T<1e3?" "+J("\u25CF"):T<3e3?" "+g(J("\u25CF")):T<5e3?" "+g("\u25CF"):""},fe=(R,T)=>{let E=R+T;for(;E>=0&&E<k.length;){if(k[E].alive)return E;E+=T}return R},H=()=>{$t();let R=k.filter(E=>E.alive).length;if(process.stdout.write("\x1B[2J\x1B[H"),y(O()),y(g(" ")+P("\u2191\u2193")+g(" navigate, ")+P("k")+g(" kill, ")+P("m")+g(l?" maintenance off, ":" maintenance on, ")+P("r")+g(" refresh")),y(),y(" "+P("Connections")+g(` (${R} alive)`)),y(),k.length===0){y(g(" No active connections"));return}if(A>=k.length&&(A=k.length-1),!k[A]?.alive){let E=fe(A,-1);A=k[E]?.alive?E:fe(A,1)}let T=new Map;for(let E of ce())T.set(Y(E),E.lastActiveAt);for(let E=0;E<k.length;E++){let j=k[E];if(!j.alive){y(g(` ${j.roomId} \xB7 actor=${j.actor} \xB7 disconnected`));continue}let ie=E===A?J("\u25B6 "):" ",Re=j.userId??g("anonymous"),we=zt(j.connectedAt),Ht=T.get(Y(j)),Xt=Yt(Ht);y(`${ie}${P(j.roomId)} ${g("\xB7")} actor=${j.actor} ${g("\xB7")} ${Re} ${g("\xB7")} ${g(we)}${Xt}`)}},Vt=()=>{w="sockets",A=0,Se(),H(),I=setInterval(()=>H(),1e3)},Kt=()=>{if(l)l(),l=null;else{let{promise:R,resolve:T}=ls();at(R),l=T}};process.stdout.write("\x1B[2J\x1B[H"),y(O()),y(F()),y(),d&&e.verbose&&console.log(g(`Ephemeral mode, using ${d}`)),process.stdin.setRawMode?.(!0),process.stdin.resume(),process.stdin.on("data",R=>{let T=R.toString();if(T===""||T==="q"){c.stop(!0).then(()=>{Le(),process.exit(0)});return}if(T==="m"){Kt(),w==="sockets"?H():(process.stdout.write("\x1B[s\x1B[H\x1B[2K"),y(O()),process.stdout.write("\x1B[u"));return}if((T==="s"||T==="\x1B[C")&&w!=="sockets"){Vt();return}if((T==="l"||T==="\x1B[D")&&w!=="logs"){Z();return}if(w==="sockets"){if(T==="\x1B[A")A=fe(A,-1),H();else if(T==="\x1B[B")A=fe(A,1),H();else if(T==="k"){let E=k[A];E?.alive&&(ct(E.roomId,E.actor),H())}else T==="r"&&(Se(),A=0,H());return}if(T==="!")m!==null?(clearTimeout(m),m=null,_()):(console.log("Simulating crash in 2.5s... (press ! again to crash now)"),m=setTimeout(()=>{m=null,_()},2500));else if(T==="c")M.length=0,process.stdout.write("\x1B[2J\x1B[H"),y(O()),y(F()),y();else if(T==="v")p=!p,process.stdout.write("\x1B[s\x1B[H\x1B[2K"),y(O()),process.stdout.write("\x1B[2K"),y(F()),process.stdout.write("\x1B[u"),console.log(g(p?"Verbose mode on":"Verbose mode off"));else if(T==="p")if(b.length>0){let E=_t(b,f);bt(E),console.log(g("Copied AI fix prompt to clipboard"))}else console.log(g("No setup issues detected"))})}}},$r=hs;export{$r as default};
397
+ `;var se=new Vo({authorize:()=>!0});se.route("GET /v7",()=>Lt(426));se.route("GET /v8",()=>Lt(426));se.route("GET /health",()=>Yo({status:"ok"}));se.route("GET /",()=>zo(Ct.replace("__VERSION__","1.4.2-pre1")));import{ServerMsgCode as qo}from"@liveblocks/core";import{QueryParser as Zo}from"@liveblocks/query-parser";import{ConsoleTarget as Pt,jsonObjectYolo as Qo,Logger as Dt,ROOT_YDOC_ID as Fe,snapshotToLossyJson_eager as er,snapshotToNodeStream as tr,snapshotToPlainLson_eager as jt,transientClientMsgDecoder as or}from"@liveblocks/server";import{json as Te,ndjsonStream as rr,ZenRouter as sr}from"@liveblocks/zenrouter";import{array as K,constant as nr,either as ir,enum_ as ar,nullable as kt,object as ye,optional as z,record as me,string as D}from"decoders";function*Ko(t){for(let e of t)for(let o of e)yield o}function xt(...t){return Ko(t)}import{Base64 as dr}from"js-base64";import*as _e from"yjs";import*as L from"yjs";function Ho(t){return t.content instanceof L.ContentFormat||t.content instanceof L.ContentEmbed?"text":"arr"in t.content?"array":"str"in t.content?"text":"type"in t.content?"xml":"unknown"}function Xo(t){let e=[],o=t;for(;o!==null;){if(!o.deleted)if(o.content instanceof L.ContentType)e.push(o.content.type.toJSON());else if(o.content instanceof L.ContentString)e.push(o.content.str);else if(o.content instanceof L.ContentFormat){let{key:r,value:i}=o.content;e.push({key:r,value:i})}else o.content instanceof L.ContentEmbed&&e.push(o.content.embed);o=o.right}return e}function Nt(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=Ho(e._first);if(i==="text")return r?Xo(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 Wo={ytext:L.Text,yxmlfragment:L.XmlFragment,yxmltext:L.XmlText,ymap:L.Map,yarray:L.Array};function At(t,e="",o=!1,r=""){let i={};if(e.length){if(t.share.has(e)){if(r.length){let a=Wo[r];if(a)return t.get(e,a).toJSON()}return{[e]:Nt(t,t.share.get(e),e,o)}}return{[e]:""}}for(let[a,d]of t.share)i[a]=Nt(t,d,a,o);return i}var Mt=(o=>(o.PlainLson="plain-lson",o.LossyJson="json",o))(Mt||{}),cr=ar(Mt),Ut=me(D,ir(D,K(D))),n=new sr({authorize:({req:t})=>Ie(t)});function x(t){return Te({error:"ROOM_NOT_FOUND",message:`Room with id "${t}" not found.`},404)}var ur=new Zo({fields:{roomId:"string"},indexableFields:{metadata:"token"}});function lr(t){let e=ur.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 be(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 x(t.roomId);return be(e)});n.route("GET /v2/rooms",({url:t})=>{let e,o=t.searchParams.get("query");if(o)try{e=lr(o)}catch(d){return Te({error:"INVALID_QUERY",message:d instanceof Error?d.message:String(d)},422)}else{let d={};for(let[c,p]of t.searchParams.entries())c.startsWith("metadata.")&&(d[c.slice(9)]=p);Object.keys(d).length>0&&(e={metadata:d})}let r=t.searchParams.get("organizationId")??void 0;return r&&(e={...e,organizationId:r}),{data:st(e).map(be),nextPage:null,nextCursor:null}});n.route("POST /v2/rooms",ye({id:D,organizationId:z(D),defaultAccesses:z(K(D)),metadata:z(Ut),usersAccesses:z(me(D,K(D))),groupsAccesses:z(me(D,K(D)))}),({body:t,url:e})=>{if(!e.searchParams.has("idempotent")&&C(t.id))return Te({error:"ROOM_ALREADY_EXISTS",message:`Room with id "${t.id}" already exists.`},409);let r=ve(t.id,{organizationId:t.organizationId,defaultAccesses:t.defaultAccesses,metadata:t.metadata,usersAccesses:t.usersAccesses,groupsAccesses:t.groupsAccesses});return be(r)});n.route("POST /v2/rooms/<roomId>",ye({defaultAccesses:z(K(D)),metadata:z(Ut),usersAccesses:z(me(D,kt(K(D)))),groupsAccesses:z(me(D,kt(K(D))))}),({p:t,body:e})=>{let o=nt(t.roomId,{defaultAccesses:e.defaultAccesses,metadata:e.metadata,usersAccesses:e.usersAccesses,groupsAccesses:e.groupsAccesses});if(!o)throw x(t.roomId);return be(o)});n.route("DELETE /v2/rooms/<roomId>",async({p:t})=>(await it(t.roomId),new Response(null,{status:204})));n.route("GET /v2/rooms/<roomId>/storage",async({url:t,p:e})=>{if(!C(e.roomId))throw x(e.roomId);let o=cr.value(t.searchParams.get("format"))??"plain-lson",r=B(e.roomId);await r.load();let i=r.storage.loadedDriver.get_snapshot(!1),a=o==="json"?er(i):jt(i);return new Response(JSON.stringify(a),{status:200,headers:{"Content-Type":"application/json"}})});n.route("POST /v2/rooms/<roomId>/storage",ye({liveblocksType:nr("LiveObject"),data:Qo}).refineType(),async({p:t,body:e})=>{if(!C(t.roomId))throw x(t.roomId);let o=B(t.roomId);await o.load();let r=o.storage.loadedDriver.get_snapshot(!1),i=jt(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 x(t.roomId);let e=B(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 x(e.roomId);let o=B(e.roomId);await o.load();let r=t.searchParams.get("key")??"",i=t.searchParams.get("type")??"",a=t.searchParams.get("guid")??Fe,d=t.searchParams.get("formatting")!==null,c=new Dt(new Pt("warning")),p=await o.yjsStorage.getYDoc(c,a),v=At(p,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 x(o.roomId);let r=B(o.roomId);await r.load();let i=await t.arrayBuffer(),a=dr.fromUint8Array(new Uint8Array(i)),d=e.searchParams.get("guid"),p=e.searchParams.get("encoder")==="v2",v=d&&d!==Fe?d:void 0;try{let _=await r.mutex.runExclusive(()=>r.yjsStorage.addYDocUpdate({},a,v,p)),h=f=>{};return r.sendToAll({type:qo.UPDATE_YDOC,update:a,isSync:!1,stateVector:null,guid:v,v2:p,remoteSnapshotHash:_.snapshotHash},void 0,h),new Response(JSON.stringify({success:!0}),{status:200,headers:{"Content-Type":"application/json"}})}catch(_){return new Response(JSON.stringify({error:"UNPROCESSABLE_ENTITY",message:_ instanceof Error?_.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 x(e.roomId);let o=B(e.roomId);await o.load();let r=t.searchParams.get("guid")??Fe,i=t.searchParams.get("encoder"),a=new Dt(new Pt("warning")),d=await o.yjsStorage.getYDoc(a,r),c=i==="v2"?_e.encodeStateAsUpdateV2(d):_e.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 x(t.roomId);let o=B(t.roomId).listSessions().map(r=>({type:"user",connectionId:r.actor,id:r.user.id,info:r.user.info}));return Te({data:o})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw x(t.roomId);return N({ok:!0})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!C(t.roomId))throw x(t.roomId);return N({ok:!0})});n.route("GET /v2/rooms/<roomId>/feeds",({p:t})=>{if(!C(t.roomId))throw x(t.roomId);return N({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 x(t.roomId);return N({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 x(t.roomId);return N({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 x(t.roomId);let e=Date.now();return N({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 x(t.roomId);let e=Date.now();return N({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 x(t.roomId);return N({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 x(t.roomId);return N({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 x(t.roomId);let e=B(t.roomId);await e.load();let o=await e.driver.next_actor(),r=e.storage.loadedDriver.get_snapshot(!1);return rr(xt([{actor:o}],tr(r)))});n.route("POST /v2/rooms/<roomId>/send-message",ye({messages:K(or)}),async({p:t,body:e})=>{if(!C(t.roomId))throw x(t.roomId);let o=B(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 Jt(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 ne=new fr;ne.relay("/v2/authorize-user/*",le);ne.relay("/v2/identify-user/*",le);ne.relay("/v2/c/*",l);ne.relay("/v2/*",n);ne.relay("/*",se);var Ge=1153;function Gt(t){if(t===void 0)return;let e=Number(t);return Number.isInteger(e)&&e>0&&e<=65535?e:void 0}function gr(t){return process.platform==="win32"?[process.env.COMSPEC||"cmd.exe","/c",t]:["sh","-c",t]}function hr(t){return"'"+t.replace(/'/g,"'\\''")+"'"}var vr={description:"Start the local Liveblocks dev server",async run(t){let{options:e,args:o}=ze(t,{port:{type:"string",short:"p",default:Ge.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}},{allowPositionals:!0});if(o.length>0&&!e.cmd&&(console.error(ae("Extra arguments are only supported with --cmd (-c)")),process.exit(1)),o.length>0&&e.cmd){let f=o.map(hr).join(" ");e.cmd.includes("{}")?e.cmd=e.cmd.replaceAll("{}",f):e.cmd+=" "+f}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: ${Ge})`),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=Gt(e.port)??Gt(process.env.LIVEBLOCKS_DEVSERVER_PORT)??Ge,a=e.host||process.env.LIVEBLOCKS_DEVSERVER_HOST||"localhost",d=r?rt():null;await St(i,a)&&(console.error(`Port ${i} is already in use.
398
+ Is another dev server already running?`),process.exit(1));let c,p=!1;function v(){return Je.serve({hostname:a,port:i,async fetch(f,b){if(f.headers.get("Upgrade")==="websocket"){let y=It(f);if(!y.ok)return je(y.xwarn,!0),Jt(b,f,Ft.NOT_ALLOWED,"You have no access to this room");let{roomId:F,ticketData:Z}=y;if(dt(F))return Jt(b,f,Ft.TRY_AGAIN_LATER,"Server is undergoing maintenance, try again later");let A=B(F);await A.load();let k=await A.createTicket(Z),Y=k.sessionKey;if(b.upgrade(f,{data:{room:A,ticket:k,sessionKey:Y}})){console.log(`${J("101")} WS ${new URL(f.url).pathname}${g(` - ${F}`)}`);return}return new Response("Could not upgrade to WebSocket",{status:426})}let O=new URL(f.url);if(f.method==="POST"&&O.pathname==="/crash")return console.log(`${J("204")} POST /crash`),setTimeout(()=>{_()},0),new Response(null,{status:204});let u=`${f.method} ${O.pathname}`,m;if(p)try{m=await f.clone().text()}catch{}let I=await ne.fetch(f),S=I.status,w=S>=500?ae(S):S>=400?Q(S):J(S);console.log(`${w} ${u}`);let M=I.headers.get("X-LB-Warn")??void 0;if(je(M,!I.ok),p){if(m){let Z=Bt(m);Z!==void 0&&console.log(g(` \u2192 ${JSON.stringify(Z)}`))}let y=await I.clone().text(),F=Bt(y);F!==void 0&&console.log(g(` \u2190 ${JSON.stringify(F)}`))}return I},error(f){return console.error(f),new Response("An unknown error occurred",{status:500})},websocket:{async open(f){let{refuseConnection:b,room:O,ticket:u}=f.data;if(b){f.close(b.code,b.message);return}O&&u&&await O.startBrowserSession(u,f)},async message(f,b){let{room:O,sessionKey:u}=f.data;O&&u&&await O.handleData(u,b)},close(f,b,O){let{room:u,sessionKey:m}=f.data;u&&m&&u.endBrowserSession(m,b,O)}}})}c=v();async function _(){ut(),await c.stop(!0),c=v(),console.log("Crash \u{1F4A5}")}let h=f=>process.stderr.write(f+`
399
+ `);if(e.cmd){h(`Liveblocks dev server ${g("v1.4.2-pre1")} running at http://${c.hostname}:${c.port}`),d&&e.verbose&&h(g(`Ephemeral mode, using ${d}`));let f=pr(d,"server.log");h(g(`Server logs: ${f}`));let b=Je.file(f).writer(),O=(...m)=>{b.write(m.map(String).join(" ")+`
400
+ `),b.flush()};console.log=O,console.error=O;let u=1;try{let m=Je.spawn(gr(e.cmd),{stdin:"inherit",stdout:"inherit",stderr:"inherit",env:{...process.env,LIVEBLOCKS_DEV_SERVER_HOST:a,LIVEBLOCKS_DEV_SERVER_PORT:String(i)}}),I=()=>{m.kill()};process.on("SIGTERM",I),process.on("SIGINT",I),u=await m.exited}finally{b.end(),await c.stop(),Le(),h(g("Liveblocks dev server shut down"))}process.exit(u)}else{let f=`http://${a}:${i}`,b=e["no-check"]?[]:await yt(f),O="logs",u=null,m=null,I=null,S=`http://${c.hostname}:${c.port}`,w=()=>{let R=O==="logs"?P(" Logs "):g(" Logs "),T=O==="sockets"?P(" Sockets "):g(" Sockets "),E=R+g("|")+T,ie=(m?V("\u23F8 maintenance")+" ":"")+g(`Liveblocks running at ${S}`),Re=process.stdout.columns??80,Oe=Math.max(1,Re-we(E).length-we(ie).length);return E+" ".repeat(Oe)+ie},M=[],y=console.log.bind(console);console.log=(...R)=>{let T=R.map(String).join(" ");M.push(T),O==="logs"&&y(T)};let F=()=>g(" ")+P("q")+g(" quit, ")+P("!")+g(" crash, ")+P("c")+g(" clear, ")+P("v")+g(p?" verbose (on)":" verbose"),Z=()=>{I&&(clearInterval(I),I=null),O="logs",process.stdout.write("\x1B[2J\x1B[H"),y(w()),y(F()),y();for(let R of M)y(R)},A=0,k=[],Y=R=>`${R.roomId}:${R.actor}`,Se=()=>{k=ce().map(R=>({...R,alive:!0}))},$t=()=>{let R=new Set(ce().map(Y));for(let E of k)E.alive=R.has(Y(E));let T=new Set(k.map(Y));for(let E of ce())T.has(Y(E))||k.push({...E,alive:!0})},zt=R=>{let T=Date.now()-R,E=Math.floor(T/1e3);if(E<60)return`${E}s`;let j=Math.floor(E/60);return j<60?`${j}m`:`${Math.floor(j/60)}h`},Yt=R=>{if(!R)return"";let T=Date.now()-R;return T<1e3?" "+J("\u25CF"):T<3e3?" "+g(J("\u25CF")):T<5e3?" "+g("\u25CF"):""},fe=(R,T)=>{let E=R+T;for(;E>=0&&E<k.length;){if(k[E].alive)return E;E+=T}return R},H=()=>{$t();let R=k.filter(E=>E.alive).length;if(process.stdout.write("\x1B[2J\x1B[H"),y(w()),y(g(" ")+P("\u2191\u2193")+g(" navigate, ")+P("k")+g(" kill, ")+P("m")+g(m?" maintenance off, ":" maintenance on, ")+P("r")+g(" refresh")),y(),y(" "+P("Connections")+g(` (${R} alive)`)),y(),k.length===0){y(g(" No active connections"));return}if(A>=k.length&&(A=k.length-1),!k[A]?.alive){let E=fe(A,-1);A=k[E]?.alive?E:fe(A,1)}let T=new Map;for(let E of ce())T.set(Y(E),E.lastActiveAt);for(let E=0;E<k.length;E++){let j=k[E];if(!j.alive){y(g(` ${j.roomId} \xB7 actor=${j.actor} \xB7 disconnected`));continue}let ie=E===A?J("\u25B6 "):" ",Re=j.userId??g("anonymous"),Oe=zt(j.connectedAt),Ht=T.get(Y(j)),Xt=Yt(Ht);y(`${ie}${P(j.roomId)} ${g("\xB7")} actor=${j.actor} ${g("\xB7")} ${Re} ${g("\xB7")} ${g(Oe)}${Xt}`)}},Vt=()=>{O="sockets",A=0,Se(),H(),I=setInterval(()=>H(),1e3)},Kt=()=>{if(m)m(),m=null;else{let{promise:R,resolve:T}=mr();at(R),m=T}};process.stdout.write("\x1B[2J\x1B[H"),y(w()),y(F()),y(),d&&e.verbose&&console.log(g(`Ephemeral mode, using ${d}`)),process.stdin.setRawMode?.(!0),process.stdin.resume(),process.stdin.on("data",R=>{let T=R.toString();if(T===""||T==="q"){c.stop(!0).then(()=>{Le(),process.exit(0)});return}if(T==="m"){Kt(),O==="sockets"?H():(process.stdout.write("\x1B[s\x1B[H\x1B[2K"),y(w()),process.stdout.write("\x1B[u"));return}if((T==="s"||T==="\x1B[C")&&O!=="sockets"){Vt();return}if((T==="l"||T==="\x1B[D")&&O!=="logs"){Z();return}if(O==="sockets"){if(T==="\x1B[A")A=fe(A,-1),H();else if(T==="\x1B[B")A=fe(A,1),H();else if(T==="k"){let E=k[A];E?.alive&&(ct(E.roomId,E.actor),H())}else T==="r"&&(Se(),A=0,H());return}if(T==="!")u!==null?(clearTimeout(u),u=null,_()):(console.log("Simulating crash in 2.5s... (press ! again to crash now)"),u=setTimeout(()=>{u=null,_()},2500));else if(T==="c")M.length=0,process.stdout.write("\x1B[2J\x1B[H"),y(w()),y(F()),y();else if(T==="v")p=!p,process.stdout.write("\x1B[s\x1B[H\x1B[2K"),y(w()),process.stdout.write("\x1B[2K"),y(F()),process.stdout.write("\x1B[u"),console.log(g(p?"Verbose mode on":"Verbose mode off"));else if(T==="p")if(b.length>0){let E=_t(b,f);bt(E),console.log(g("Copied AI fix prompt to clipboard"))}else console.log(g("No setup issues detected"))})}}},zs=vr;export{zs as default};
401
401
  /*! Bundled license information:
402
402
 
403
403
  itertools/dist/index.js:
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-VSYVR3EA.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.4.1"),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.4.1"),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-36CEUNMZ.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.4.2-pre1"),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.4.2-pre1"),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.4.1",
3
+ "version": "1.4.2-pre1",
4
4
  "description": "Liveblocks command line interface",
5
5
  "type": "module",
6
6
  "bin": {
@@ -29,7 +29,7 @@
29
29
  "eslint-plugin-license-header": "^0.9.0",
30
30
  "eslint-plugin-simple-import-sort": "^13.0.0",
31
31
  "fast-check": "^3.23.2",
32
- "itertools": "^2.3.2",
32
+ "itertools": "^2.7.1",
33
33
  "prettier": "^3.3.2",
34
34
  "publint": "^0.3.17",
35
35
  "typescript": "^5.9.3",
@@ -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.4.1"
45
+ "@liveblocks/server": "^1.4.2-pre1"
46
46
  },
47
47
  "scripts": {
48
48
  "build": "tsup",