liveblocks 1.5.0-rc1 → 1.5.0-rc2
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
|
|
1
|
+
import{a as ee,b as Ve,c as H,d as J,e as de,f as D,g as p,h as Ce,i as Ye}from"./chunk-ZFPKG3IB.js";import{Promise_withResolvers as fr,tryParseJson as Gt,WebsocketCloseCodes as $t}from"@liveblocks/core";import{ZenRelay as pr}from"@liveblocks/zenrouter";import Ge from"bun";import{join as gr}from"path";import{nanoid as Lo}from"@liveblocks/core";import{ProtocolVersion as yt}from"@liveblocks/server";import{nanoid as ao,WebsocketCloseCodes as Qe}from"@liveblocks/core";import{DefaultMap as co,Room as uo}from"@liveblocks/server";import{Database as lo}from"bun:sqlite";import{mkdirSync as et,mkdtempSync as mo,rmSync as fo}from"fs";import{tmpdir as po}from"os";import{dirname as go,join as ve,resolve as Ze}from"path";import{asPos as Ke,CrdtType as V,nn as Zt,nodeStreamToCompactNodes as Qt}from"@liveblocks/core";import{makeInMemorySnapshot as eo,NestedMap as to,plainLsonToNodeStream as oo,quote as $}from"@liveblocks/server";import{Database as ro}from"bun:sqlite";function q(t){try{return t!==void 0?JSON.parse(t):void 0}catch{return}}function We(t){if(t>512)throw new Error("More than 512 params not supported");return new Array(t).fill("?").join(",")}function so(t){return Array.isArray(t)?t:Array.from(t)}function no(t){return t.query("SELECT node_id, crdt_json FROM nodes").values().map(([e,o])=>[e,q(o)])}function ce(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
|
|
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 qe(t,e){let o=so(e),r=o.length;t.query(`DELETE FROM nodes WHERE node_id IN (${We(r)})`).run(...o)}function He(t){let e=new to;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 io(t,e){let o=new Map(no(t));o.has("root")||o.set("root",{type:V.OBJECT,data:{}});let r=new Set,i=["root"],a=new Map,d=He(o);for(;i.length>0;){let v=i.pop(),b=Zt(o.get(v));if(b.type===V.OBJECT)for(let g of d.keysAt(v))Object.prototype.hasOwnProperty.call(b.data,g)&&(delete b.data[g],r.add(v),e.warn(`[integrity] Found data key ${$(g)} from ${$(v)} (conflicted with child node)`));if(b.type!==V.REGISTER)i.push(...d.valuesAt(v));else if(o.get(b.parentId)?.type===V.OBJECT)continue;a.set(v,b)}let c=new Set;for(let[v,b]of o)a.has(v)||(b.parentId!==void 0&&a.has(b.parentId)?a.get(b.parentId)?.type===V.REGISTER?e.warn(`[integrity] Found unreachable node ${$(v)} (child of live register)`):e.warn(`[integrity] Found conflicting sibling ${$(v)} (conflicted with ${$(d.get(b.parentId,b.parentKey))} at ${$(b.parentKey)})`):e.warn(`[integrity] Found orphan ${$(v)}`),c.add(v),r.delete(v));if(r.size>0||c.size>0){if(r.size>0){let v=new Map;for(let b of r){let g=a.get(b);g!==void 0&&v.set(b,g)}ce(t,v)}c.size>0&&qe(t,c)}let f=c.size===0?d:He(a);return{nodes:a,revNodes:f}}function Xe(t,e){return t?.type===V.OBJECT&&Object.prototype.hasOwnProperty.call(t.data,e)&&t.data[e]!==void 0}var he=class{db;constructor(e){let o=new ro(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,7 +37,7 @@ import{a as Q,b as $e,c as Y,d as J,e as ae,f as j,g,h as we,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:r,revNodes:i}=
|
|
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}=io(o,e),a=l=>r.get(l),d=(l,u)=>i.get(l,u),c=(l,u)=>i.has(l,u);function f(l,u){let h;for(let y of i.keysAt(l)){let S=Ke(y);S>u&&(h===void 0||S<h)&&(h=S)}return h}function v(l){let u;for(let h of i.keysAt(l)){let y=Ke(h);(u===void 0||y>u)&&(u=y)}return u}function b(l,u,h=!1){let y=a(u.parentId);if(y===void 0)throw new Error(`No such parent ${$(u.parentId)}`);if(u.type===V.REGISTER&&y.type===V.OBJECT)throw new Error("Cannot add register under object");let S=d(u.parentId,u.parentKey);if(S!==l){let U=Xe(y,u.parentKey);if(S!==void 0||U)if(h)T(u.parentId,u.parentKey);else throw new Error(`Key ${$(u.parentKey)} already exists`);i.set(u.parentId,u.parentKey,l)}r.set(l,u),ce(o,[[l,u]])}function g(l,u){let h=a(l);if(h?.parentId===void 0)return;if(c(h.parentId,u))throw new Error(`Pos ${$(u)} already taken`);i.delete(h.parentId,h.parentKey);let y={...h,parentKey:u};r.set(l,y),i.set(h.parentId,u,l),ce(o,[[l,y]])}function L(l,u,h=!1){let y=a(l);if(y?.type!==V.OBJECT)return;for(let U of Object.keys(u)){let _=d(l,U);if(_!==void 0)if(h)O(_);else throw new Error(`Child node already exists under ${U}`)}let S={...y,data:{...y.data,...u}};r.set(l,S),ce(o,[[l,S]])}function O(l){let u=a(l);if(u?.parentId===void 0)return;i.delete(u.parentId,u.parentKey);let h=[],y=[l];for(;y.length>0;){let S=y.pop();y.push(...i.valuesAt(S)),r.delete(S),i.deleteAll(S),h.push(S)}qe(o,h)}function T(l,u){let h=a(l);if(Xe(h,u)){let{[u]:S,...U}=h.data,_={...h,data:U};r.set(l,_),ce(o,[[l,_]])}let y=d(l,u);y!==void 0&&O(y)}return{get_node:a,iter_nodes:()=>r.entries(),*iter_nodes_optimized(){for(let l of Qt(r.entries()))yield JSON.stringify(l)},has_node:l=>r.has(l),get_child_at:d,has_child_at:c,get_next_sibling:f,get_last_sibling:v,set_child:b,move_sibling:g,delete_node:O,delete_child_key:T,set_object_data:L,get_snapshot(l){return eo(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 oo(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,q(o)])}get_meta(e){let r=this.db.query("SELECT jval FROM metadata WHERE key = ?").get(e)?.jval;if(r!==void 0)return q(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
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)
|
|
@@ -45,14 +45,14 @@ import{a as Q,b as $e,c as Y,d as J,e as ae,f as j,g,h as we,i as ze}from"./chun
|
|
|
45
45
|
ON CONFLICT (setting) DO UPDATE SET jval = json(CAST(jval AS INTEGER) + 1)
|
|
46
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,r,r)}delete_y_updates(e,o){let r=o.length;this.db.query(`DELETE FROM ydocs WHERE doc_id = ? AND key IN (${
|
|
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 (${We(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:q(o.jpresence)??null,updatedAt:o.updated_at,info:q(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:q(o.jpresence)??null,updatedAt:o.updated_at,info:q(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),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[
|
|
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[g,L]of Object.entries(a)){let O=typeof L=="boolean"?Number(L):L;d+=" AND json_extract(jmetadata, '$.' || ?) = ?",c.push(g,O)}if(r!==void 0&&(d+=" AND created_at >= ?",c.push(r)),i!==void 0)try{let g=JSON.parse(Buffer.from(i.replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),[L,O]=g;d+=" AND (created_at < ? OR (created_at = ? AND feed_id < ?))",c.push(O,O,L)}catch{}d+=" ORDER BY created_at DESC, feed_id DESC LIMIT ?",c.push(o+1);let f=this.db.query(d).all(...c),v;if(f.length>o){f.pop();let g=f[f.length-1];if(g){let L=[g.feed_id,g.created_at];v=Buffer.from(JSON.stringify(L),"utf8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}return{feeds:f.map(g=>({feedId:g.feed_id,metadata:JSON.parse(g.jmetadata),createdAt:g.created_at,updatedAt:g.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 g=JSON.parse(Buffer.from(a.replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),[L,O]=g;d+=" AND (created_at < ? OR (created_at = ? AND message_id < ?))",c.push(O,O,L)}catch{}d+=" ORDER BY created_at DESC, message_id DESC LIMIT ?",c.push(r+1);let f=this.db.query(d).all(...c),v;if(f.length>r){f.pop();let g=f[f.length-1];if(g){let L=[g.message_id,g.created_at];v=Buffer.from(JSON.stringify(L),"utf8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}return{messages:f.map(g=>({id:g.message_id,data:JSON.parse(g.jdata),createdAt:g.created_at,updatedAt:g.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 f=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(f==null)throw new Error(`Feed message ${o} not found in feed ${e}`);return{id:f.message_id,data:JSON.parse(f.jdata),createdAt:f.created_at,updatedAt:f.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 ho=".liveblocks/v1",Ee=ho,tt=!1,Z=null;function ot(){return ve(Ee,"rooms")}function oe(){if(Z)return;let t=ve(Ee,"db.sql");et(go(t),{recursive:!0});let e=new lo(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 Y,d as J,e as ae,f as j,g,h as we,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`),
|
|
74
|
+
) STRICT`),Z=e}function re(){if(!Z)throw new Error("Rooms DB not initialized");return Z}function rt(t){let e=re(),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 te(t){let e=re().query("SELECT room_id, internal_id, organization_id, default_permissions, metadata, created_at FROM rooms WHERE room_id = ?").get(t);if(e)return rt(e)}var vo="default";function st(t,e){let o=re(),r=ao(),i=new Date().toISOString(),a=e?.organizationId??vo,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[f,v]of Object.entries(e.usersAccesses))o.run("INSERT INTO room_user_permissions (room_id, user_id, scopes) VALUES (?, ?, ?)",[t,f,JSON.stringify(v)]);if(e?.groupsAccesses)for(let[f,v]of Object.entries(e.groupsAccesses))o.run("INSERT INTO room_group_permissions (room_id, group_id, scopes) VALUES (?, ?, ?)",[t,f,JSON.stringify(v)]);return{id:t,internalId:r,organizationId:a,defaultAccesses:d,usersAccesses:e?.usersAccesses??{},groupsAccesses:e?.groupsAccesses??{},metadata:c,createdAt:i}}function Eo(t,e){let o=re(),r=te(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
|
|
76
|
+
ON CONFLICT (room_id, group_id) DO UPDATE SET scopes = ?`,[t,i,JSON.stringify(a),JSON.stringify(a)]);return te(t)}}function Io(t){re().run("DELETE FROM rooms WHERE room_id = ?",[t])}function nt(t){let e=ot(),o=Ze(e,`${t}.sql`);if(!o.startsWith(Ze(e)+"/"))throw new Error("Invalid internal ID");return o}var B=new co(t=>{let e=te(t)??st(t);et(ot(),{recursive:!0});let o=new he(nt(e.internalId));return new uo(t,{storage:o})});function it(){let t=mo(ve(po(),"liveblocks-dev-"));return Ee=ve(t,"data"),tt=!0,t}function C(t){return oe(),te(t)}function Ie(t,e){oe();let o=te(t);if(o)return o;let r=st(t,e);return B.getOrCreate(t),r}function at(t){oe();let e=re(),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(...r).map(
|
|
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
|
|
80
|
-
`);for(let{match:c,check:
|
|
78
|
+
${i}`).all(...r).map(rt)}function dt(t,e){return oe(),Eo(t,e)}async function ct(t){oe();let e=te(t),o=B.get(t);if(o&&(o.endSessionBy(()=>!0,Qe.KICKED,"Deliberately disconnected"),o.unload(),o.driver.close(),B.delete(t)),e){let r=nt(e.internalId);try{await Bun.write(r,""),await Bun.file(r).unlink()}catch{}Io(t)}}function F(t){return oe(),B.getOrCreate(t)}var Le=null;function ut(t){Le=t;for(let e of B.values())e.runInMaintenanceMode(()=>t).catch(()=>{});t.then(()=>{Le=null})}function lt(t){if(Le!==null)return!0;let e=B.get(t);return e!==void 0&&e.isInMaintenance}function ue(){let t=[];for(let[e,o]of B)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 mt(t,e){let o=B.get(t);return o?o.endSessionBy(r=>r.actor===e,Qe.KICKED,"Deliberately disconnected")>0:!1}function ft(){for(let t of B.values())t.unload();B.clear()}function xe(){for(let t of B.values())t.unload(),t.driver.close();B.clear(),Z&&(Z.close(),Z=null),tt&&fo(Ee,{recursive:!0,force:!0})}import{nanoid as yo,tryParseJson as ht}from"@liveblocks/core";import{array as It,constant as le,enum_ as _o,number as Tt,object as Pe,optional as Ae,record as bo,string as ke,taggedUnion as So}from"decoders";import{inexact as To,optional as pt,string as gt}from"decoders";var se=To({name:pt(gt),avatar:pt(gt)}).refineType();var Q={RoomRead:"room:read",RoomWrite:"room:write",CommentsWrite:"comments:write",FeedsWrite:"feeds:write",RoomPresenceWrite:"room:presence:write",CommentsRead:"comments:read"};var Ro=Pe({alg:le("none")}),Oo=Pe({k:le("acc"),pid:le("localdev"),uid:ke,ui:Ae(se),perms:bo(It(_o(Q))),exp:Tt}),wo=Pe({k:le("id"),pid:le("localdev"),uid:ke,ui:Ae(se),gids:Ae(It(ke)),exp:Tt}),Co=So("k",{acc:Oo,id:wo});function vt(t){return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Et(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),o=e+"=".repeat((4-e.length%4)%4);return atob(o)}function De(t){let e=Math.floor(Date.now()/1e3),o={...t,iat:e,exp:e+3600,jti:yo(12)},r=vt(JSON.stringify({alg:"none",typ:"JWT"})),i=vt(JSON.stringify(o));return`${r}.${i}.`}function Te(t){let e=t.split(".");if(e.length!==3)return null;let[o,r,i]=e;if(i!==""||!Ro.value(ht(Et(o))))return null;let a=Co.value(ht(Et(r)));return!a||a.exp<Math.floor(Date.now()/1e3)?null:a}function xo(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 No(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 Ao(t,e){return t.k==="acc"?xo(t,e):No(t,e)}function _t(t){let e=new URL(t.url),o=e.pathname==="/v7"?yt.V7:e.pathname==="/v8"?yt.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=Te(i);if(!d)return{ok:!1};let c=Ao(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"}:(Ie(r,{defaultAccesses:[Q.RoomWrite]}),{ok:!0,roomId:r,ticketData:{version:o,anonymousId:Lo(),scopes:[Q.RoomWrite]}}):{ok:!1}}function ko(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 bt(...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,ko(r)}catch{return[]}}function Po(t){let e=t.trim();return e.startsWith("#")||e.startsWith("//")||e.startsWith("*")||e.startsWith("/*")}var je=[{pattern:"<LiveblocksProvider",expected:"baseUrl=",fixSnippet:t=>`${H("baseUrl")}=${J(`"${t}"`)}`,closePattern:">"},{pattern:"createClient(",expected:"baseUrl:",fixSnippet:t=>`${H("baseUrl")}: ${J(`"${t}"`)}`,closePattern:")"},{pattern:"new Liveblocks(",expected:"baseUrl:",fixSnippet:t=>`${H("baseUrl")}: ${J(`"${t}"`)}`,closePattern:")"}];async function St(t){let e=je.map(c=>c.pattern),o=[...new Set(je.map(c=>c.expected))],[r,i]=await Promise.all([bt(...e),bt(...o)]);if(r.length===0)return[];let a=new Set(i.map(c=>c.file)),d=[];for(let c of r){if(Po(c.text)||a.has(c.file))continue;let f=je.find(v=>c.text.includes(v.pattern));f&&d.push({match:c,check:f})}if(d.length>0){console.log(),console.warn(ee("\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:f}of d)console.log(` ${Ve(`${c.file}:${c.line}`)}`),console.log(` To fix, add ${f.fixSnippet(t)} to ${H(f.pattern)}${H(f.closePattern)}`),console.log();console.log(p(" \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(p(" \u2502 \u{1F4A1} ")+"Press "+D("p")+" to copy an AI fix prompt to your clipboard"+p(" \u2502")),console.log(p(" \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(p(" To skip this check, use --no-check")),console.log()}return d}var Do={"<LiveblocksProvider":"baseUrl={...}","createClient(":"baseUrl: ...","new Liveblocks(":"baseUrl: ..."};function Rt(t,e){let o=t.map(({match:r,check:i})=>{let a=Do[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
|
|
141
|
+
that the user can disable this by setting it to "false".`}import{execSync as jo}from"child_process";function Ot(t){let e=process.platform==="darwin"?"pbcopy":process.platform==="win32"?"clip.exe":"xclip -selection clipboard";jo(e,{input:t})}import Mo from"bun";function wt(t,e){let{promise:o,resolve:r}=Promise.withResolvers();return Mo.connect({hostname:e,port:t,socket:{data(){},open(i){i.end(),r(!0)},error(){r(!1)},connectError(){r(!1)}}}),o}function Me(t,e=!1){t&&console.log((e?de:ee)(` \u26A0 ${t}`))}import{ZenRouter as Bo}from"@liveblocks/zenrouter";import{array as Lt,enum_ as Fo,object as xt,optional as Be,record as Jo,string as Fe}from"decoders";import{json as Uo}from"@liveblocks/zenrouter";import{json as Ct}from"@liveblocks/zenrouter";function Ue(t,e,o){return Ct(t,e,{"X-LB-Warn":o})}function P(t,e,o="This is a dummy response."){return Ue(t,e,o)}function s(t="This endpoint isn't implemented in the Liveblocks dev server."){return Ct({error:"Not implemented",message:t},501,{"X-LB-Warn":t})}function ye(t){let e=t.headers.get("Authorization");if(e==="Bearer sk_localdev")return!0;if(!e)throw Uo({error:"Unauthorized",message:"Missing secret key"},401);if(e.startsWith("Bearer "))throw Ue({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 Go=Fo(Q),me=new Bo({authorize:({req:t})=>ye(t)});me.route("POST /v2/authorize-user",xt({userId:Fe,userInfo:Be(se),permissions:Jo(Lt(Go))}),({body:t})=>({token:De({k:"acc",pid:"localdev",uid:t.userId,perms:t.permissions,ui:t.userInfo})}));me.route("POST /v2/identify-user",xt({userId:Fe,userInfo:Be(se),groupIds:Be(Lt(Fe))}),({body:t})=>({token:De({k:"id",pid:"localdev",uid:t.userId,ui:t.userInfo,gids:t.groupIds})}));import{ZenRouter as $o}from"@liveblocks/zenrouter";var m=new $o({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 Te(o)!==null}});m.route("GET /v2/c/threads",()=>P({threads:[],inboxNotifications:[],subscriptions:[],meta:{nextCursor:null,requestedAt:new Date().toISOString(),permissionHints:{}}}));m.route("GET /v2/c/threads/delta",()=>P({threads:[],inboxNotifications:[],subscriptions:[],meta:{requestedAt:new Date().toISOString(),permissionHints:{}}}));m.route("GET /v2/c/inbox-notifications",()=>P({inboxNotifications:[],threads:[],subscriptions:[],groups:[],meta:{nextCursor:null,requestedAt:new Date().toISOString()}}));m.route("GET /v2/c/inbox-notifications/count",()=>P({count:0}));m.route("GET /v2/c/inbox-notifications/delta",()=>P({inboxNotifications:[],threads:[],subscriptions:[],groups:[],deletedInboxNotifications:[],deletedThreads:[],deletedSubscriptions:[],meta:{requestedAt:new Date().toISOString()}}));m.route("GET /v2/c/rooms/<roomId>/threads",()=>P({data:[],inboxNotifications:[],subscriptions:[],meta:{nextCursor:null,requestedAt:new Date().toISOString(),permissionHints:{}}}));m.route("GET /v2/c/rooms/<roomId>/threads/delta",()=>P({data:[],inboxNotifications:[],subscriptions:[],deletedThreads:[],deletedInboxNotifications:[],deletedSubscriptions:[],meta:{requestedAt:new Date().toISOString(),permissionHints:{}}}));m.route("POST /v2/c/rooms/<roomId>/text-metadata",()=>P({status:"ok"}));m.route("PUT /v2/c/rooms/<roomId>/attachments/<attachmentId>/upload/<name>",()=>s()),m.route("POST /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<name>",()=>s()),m.route("PUT /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>/<partNumber>",()=>s()),m.route("POST /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>/complete",()=>s()),m.route("DELETE /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>",()=>s()),m.route("POST /v2/c/rooms/<roomId>/attachments/presigned-urls",()=>s()),m.route("POST /v2/c/rooms/<roomId>/send-message",()=>s()),m.route("GET /v2/c/rooms/<roomId>/storage",()=>s()),m.route("POST /v2/c/rooms/<roomId>/version",()=>s()),m.route("GET /v2/c/rooms/<roomId>/y-version/<version>",()=>s()),m.route("POST /v2/c/rooms/<roomId>/ai/contextual-prompt",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads/search",()=>s()),m.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/metadata",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/subscribe",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments",()=>s()),m.route("GET /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>s()),m.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),m.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/reactions",()=>s()),m.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/reactions/<emoji>",()=>s()),m.route("GET /v2/c/rooms/<roomId>/threads/comments/search",()=>s()),m.route("GET /v2/c/rooms/<roomId>/threads/<threadId>/participants",()=>s()),m.route("GET /v2/c/rooms/<roomId>/notification-settings",()=>s()),m.route("GET /v2/c/rooms/<roomId>/subscription-settings",()=>s()),m.route("POST /v2/c/rooms/<roomId>/notification-settings",()=>s()),m.route("POST /v2/c/rooms/<roomId>/subscription-settings",()=>s()),m.route("DELETE /v2/c/inbox-notifications",()=>s()),m.route("POST /v2/c/inbox-notifications/read",()=>s()),m.route("DELETE /v2/c/inbox-notifications/<inboxNotificationId>",()=>s()),m.route("POST /v2/c/rooms/<roomId>/inbox-notifications/read",()=>s()),m.route("POST /v2/c/rooms/<roomId>/text-mentions",()=>s()),m.route("DELETE /v2/c/rooms/<roomId>/text-mentions/<mentionId>",()=>s()),m.route("GET /v2/c/notification-settings",()=>s()),m.route("POST /v2/c/notification-settings",()=>s()),m.route("GET /v2/c/rooms/<roomId>/thread-with-notification/<threadId>",()=>s()),m.route("GET /v2/c/urls/metadata",()=>s()),m.route("GET /v2/c/rooms/<roomId>/versions",()=>s()),m.route("GET /v2/c/rooms/<roomId>/versions/delta",()=>s()),m.route("POST /v2/c/groups/find",()=>s());import{abort as At,html as Vo,json as Yo,ZenRouter as Ko}from"@liveblocks/zenrouter";var Nt=`<!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 Do}
|
|
|
394
394
|
</main>
|
|
395
395
|
</body>
|
|
396
396
|
</html>
|
|
397
|
-
`;var se=new Yo({authorize:()=>!0});se.route("GET /v7",()=>xt(426));se.route("GET /v8",()=>xt(426));se.route("GET /health",()=>Vo({status:"ok"}));se.route("GET /",()=>zo(Lt.replace("__VERSION__","1.5.0-rc1")));import{ServerMsgCode as qo}from"@liveblocks/core";import{QueryParser as Zo}from"@liveblocks/query-parser";import{ConsoleTarget as Dt,jsonObjectYolo as Qo,Logger as jt,ROOT_YDOC_ID as Fe,snapshotToLossyJson_eager as er,snapshotToNodeStream as tr,snapshotToPlainLson_eager as Mt,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 Pt,object as ye,optional as z,record as me,string as M}from"decoders";function*Ko(t){for(let e of t)for(let o of e)yield o}function Nt(...t){return Ko(t)}import{Base64 as dr}from"js-base64";import*as _e from"yjs";import*as x from"yjs";function Ho(t){return t.content instanceof x.ContentFormat||t.content instanceof x.ContentEmbed?"text":"arr"in t.content?"array":"str"in t.content?"text":"type"in t.content?"xml":"unknown"}function Xo(t){let e=[],o=t;for(;o!==null;){if(!o.deleted)if(o.content instanceof x.ContentType)e.push(o.content.type.toJSON());else if(o.content instanceof x.ContentString)e.push(o.content.str);else if(o.content instanceof x.ContentFormat){let{key:r,value:i}=o.content;e.push({key:r,value:i})}else o.content instanceof x.ContentEmbed&&e.push(o.content.embed);o=o.right}return e}function At(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:x.Text,yxmlfragment:x.XmlFragment,yxmltext:x.XmlText,ymap:x.Map,yarray:x.Array};function kt(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]:At(t,t.share.get(e),e,o)}}return{[e]:""}}for(let[a,d]of t.share)i[a]=At(t,d,a,o);return i}var Ut=(o=>(o.PlainLson="plain-lson",o.LossyJson="json",o))(Ut||{}),cr=ar(Ut),Bt=me(M,ir(M,K(M))),n=new sr({authorize:({req:t})=>Ie(t)});function N(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=w(t.roomId);if(!e)throw N(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:nt(e).map(be),nextPage:null,nextCursor:null}});n.route("POST /v2/rooms",ye({id:M,organizationId:z(M),defaultAccesses:z(K(M)),metadata:z(Bt),usersAccesses:z(me(M,K(M))),groupsAccesses:z(me(M,K(M)))}),({body:t,url:e})=>{if(!e.searchParams.has("idempotent")&&w(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(M)),metadata:z(Bt),usersAccesses:z(me(M,Pt(K(M)))),groupsAccesses:z(me(M,Pt(K(M))))}),({p:t,body:e})=>{let o=it(t.roomId,{defaultAccesses:e.defaultAccesses,metadata:e.metadata,usersAccesses:e.usersAccesses,groupsAccesses:e.groupsAccesses});if(!o)throw N(t.roomId);return be(o)});n.route("DELETE /v2/rooms/<roomId>",async({p:t})=>(await at(t.roomId),new Response(null,{status:204})));n.route("GET /v2/rooms/<roomId>/storage",async({url:t,p:e})=>{if(!w(e.roomId))throw N(e.roomId);let o=cr.value(t.searchParams.get("format"))??"plain-lson",r=F(e.roomId);await r.load();let i=r.storage.loadedDriver.get_snapshot(!1),a=o==="json"?er(i):Mt(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(!w(t.roomId))throw N(t.roomId);let o=F(t.roomId);await o.load();let r=o.storage.loadedDriver.get_snapshot(!1),i=Mt(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(!w(t.roomId))throw N(t.roomId);let e=F(t.roomId);await e.load();let o={liveblocksType:"LiveObject",data:{}};return await e.driver.DANGEROUSLY_reset_nodes(o),e.unload(),new Response(null,{status:204})});n.route("GET /v2/rooms/<roomId>/ydoc",async({url:t,p:e})=>{if(!w(e.roomId))throw N(e.roomId);let o=F(e.roomId);await o.load();let r=t.searchParams.get("key")??"",i=t.searchParams.get("type")??"",a=t.searchParams.get("guid")??Fe,d=t.searchParams.get("formatting")!==null,c=new jt(new Dt("warning")),p=await o.yjsStorage.getYDoc(c,a),v=kt(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(!w(o.roomId))throw N(o.roomId);let r=F(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 S=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:S.snapshotHash},void 0,h),new Response(JSON.stringify({success:!0}),{status:200,headers:{"Content-Type":"application/json"}})}catch(S){return new Response(JSON.stringify({error:"UNPROCESSABLE_ENTITY",message:S instanceof Error?S.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(!w(e.roomId))throw N(e.roomId);let o=F(e.roomId);await o.load();let r=t.searchParams.get("guid")??Fe,i=t.searchParams.get("encoder"),a=new jt(new Dt("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(!w(t.roomId))throw N(t.roomId);let o=F(t.roomId).listSessions().map(r=>({type:"user",connectionId:r.actor,id:r.user.id,info:r.user.info}));return Te({data:o})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!w(t.roomId))throw N(t.roomId);return A({ok:!0})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!w(t.roomId))throw N(t.roomId);return A({ok:!0})});n.route("GET /v2/rooms/<roomId>/feeds",({p:t})=>{if(!w(t.roomId))throw N(t.roomId);return A({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(!w(t.roomId))throw N(t.roomId);return A({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(!w(t.roomId))throw N(t.roomId);return A({messages:[{messageId:"123",data:{content:"This is a test message"}}],nextCursor:null})});n.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!w(t.roomId))throw N(t.roomId);let e=Date.now();return A({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(!w(t.roomId))throw N(t.roomId);let e=Date.now();return A({id:t.messageId,createdAt:e,updatedAt:e,data:{content:"This is a test message"}})});n.route("POST /v2/rooms/<roomId>/feeds",({p:t})=>{if(!w(t.roomId))throw N(t.roomId);return A({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(!w(t.roomId))throw N(t.roomId);return A({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(!w(t.roomId))throw N(t.roomId);let e=F(t.roomId);await e.load();let o=await e.driver.next_actor(),r=e.storage.loadedDriver.get_snapshot(!1);return rr(Nt([{actor:o}],tr(r)))});n.route("POST /v2/rooms/<roomId>/send-message",ye({messages:K(or)}),async({p:t,body:e})=>{if(!w(t.roomId))throw N(t.roomId);let o=F(t.roomId);await o.load();let[r,i]=await o.createBackendSession_experimental();return await o.processClientMsgFromBackendSession(r,e.messages),new Response(`{"messages":[${i.join(",")}]}`,{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})});n.route("PATCH /v2/rooms/<roomId>/storage/json-patch",()=>s()),n.route("POST /v2/rooms/<roomId>/presence",()=>s()),n.route("GET /v2/rooms/<roomId>/threads",()=>s()),n.route("POST /v2/rooms/<roomId>/upsert",()=>s()),n.route("POST /v2/rooms/<roomId>/update-room-id",()=>s()),n.route("POST /v2/rooms/<roomId>/update-organization-id",()=>s()),n.route("GET /v2/rooms/<roomId>/prewarm",()=>s()),n.route("POST /v2/rooms/<roomId>/broadcast_event",()=>s()),n.route("GET /v2/rooms/<roomId>/versions",()=>s()),n.route("GET /v2/rooms/<roomId>/version/<version>",()=>s()),n.route("POST /v2/rooms/<roomId>/version",()=>s()),n.route("POST /v2/rooms/<roomId>/threads",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/subscribe",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/subscriptions",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/metadata",()=>s()),n.route("DELETE /v2/rooms/<roomId>/threads/<threadId>",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/participants",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/inbox-notifications",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>s()),n.route("DELETE /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/add-reaction",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/remove-reaction",()=>s()),n.route("GET /v2/rooms/<roomId>/attachments/<attachmentId>",()=>s()),n.route("GET /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("GET /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("POST /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("POST /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("DELETE /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("DELETE /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("GET /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),n.route("DELETE /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),n.route("GET /v2/users/<userId>/inbox-notifications",()=>s()),n.route("DELETE /v2/users/<userId>/inbox-notifications",()=>s()),n.route("GET /v2/users/<userId>/notification-settings",()=>s()),n.route("POST /v2/users/<userId>/notification-settings",()=>s()),n.route("DELETE /v2/users/<userId>/notification-settings",()=>s()),n.route("GET /v2/users/<userId>/room-subscription-settings",()=>s()),n.route("POST /v2/inbox-notifications/trigger",()=>s()),n.route("POST /v2/inbox-notifications/<inboxNotificationId>/read",()=>s()),n.route("POST /v2/groups",()=>s()),n.route("GET /v2/groups/<groupId>",()=>s()),n.route("POST /v2/groups/<groupId>/add-members",()=>s()),n.route("POST /v2/groups/<groupId>/remove-members",()=>s()),n.route("DELETE /v2/groups/<groupId>",()=>s()),n.route("GET /v2/groups",()=>s()),n.route("GET /v2/users/<userId>/groups",()=>s()),n.route("GET /v2/ai/copilots",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/<knowledgeSourceId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>/links",()=>s()),n.route("POST /v2/ai/copilots",()=>s()),n.route("POST /v2/ai/copilots/<copilotId>",()=>s()),n.route("POST /v2/ai/copilots/<copilotId>/knowledge/web",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>",()=>s()),n.route("PUT /v2/ai/copilots/<copilotId>/knowledge/file/<fileName>",()=>s()),n.route("GET /v2/management/projects",()=>s()),n.route("GET /v2/management/projects/<projectId>",()=>s()),n.route("POST /v2/management/projects",()=>s()),n.route("POST /v2/management/projects/<projectId>",()=>s()),n.route("DELETE /v2/management/projects/<projectId>",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/delete-additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/recover-failed-messages",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/secret/roll",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/test",()=>s()),n.route("DELETE /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/activate",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/deactivate",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/roll",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/secret/roll",()=>s());function Gt(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 $t(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()},"random-port":{type:"boolean",short:"P",default:!1},host:{type:"string"},cmd:{type:"string",short:"c"},help:{type:"boolean",short:"h",default:!1},"no-check":{type:"boolean",default:!1},ci:{type:"boolean",default:!1},verbose:{type:"boolean",short:"v",default:!1}},{allowPositionals:!0});if(o.length>0&&!e.cmd&&(console.error(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(" --random-port, -P Bind a random free port instead of --port (no collisions,"),console.log(" ever). With --cmd, the chosen port is exposed to the command"),console.log(" via LIVEBLOCKS_DEV_SERVER_PORT. Ideal for CI."),console.log(" --host Host to bind to (default: localhost)"),console.log(" --cmd, -c Run a one-off command against a fresh server instance, then"),console.log(" shut down. Does not affect your local data in .liveblocks/."),console.log(" Extra args are appended to the command, or replace {} if"),console.log(" present. Use -- before args starting with -."),console.log(" --ci Start a fresh server instance on every boot, ideal for CI"),console.log(" --no-check Skip project setup check on start"),console.log(" --verbose, -v Show verbose output"),console.log(" --help, -h Show help");return}let r=!1;e.ci&&(r=!0,e["no-check"]=!0),e.cmd&&(r=!0,e["no-check"]=!0);let i=e["random-port"]?0:$t(e.port)??$t(process.env.LIVEBLOCKS_DEVSERVER_PORT)??Ge,a=e.host||process.env.LIVEBLOCKS_DEVSERVER_HOST||"localhost",d=r?st():null;i!==0&&await Rt(i,a)&&(console.error(`Port ${i} is already in use.
|
|
398
|
-
Is another dev server already running?`),process.exit(1));let c,
|
|
399
|
-
`);if(e.cmd){
|
|
400
|
-
`),
|
|
397
|
+
`;var ne=new Ko({authorize:()=>!0});ne.route("GET /v7",()=>At(426));ne.route("GET /v8",()=>At(426));ne.route("GET /health",()=>Yo({status:"ok"}));ne.route("GET /",()=>Vo(Nt.replace("__VERSION__","1.5.0-rc2")));import{ServerMsgCode as Zo}from"@liveblocks/core";import{QueryParser as Qo}from"@liveblocks/query-parser";import{ConsoleTarget as Mt,jsonObjectYolo as er,Logger as Ut,ROOT_YDOC_ID as Je,snapshotToLossyJson_eager as tr,snapshotToNodeStream as or,snapshotToPlainLson_eager as Bt,transientClientMsgDecoder as rr}from"@liveblocks/server";import{json as _e,ndjsonStream as sr,ZenRouter as nr}from"@liveblocks/zenrouter";import{array as X,constant as ir,either as ar,enum_ as dr,nullable as jt,object as be,optional as Y,record as fe,string as j}from"decoders";function*Ho(t){for(let e of t)for(let o of e)yield o}function kt(...t){return Ho(t)}import{Base64 as cr}from"js-base64";import*as Se from"yjs";import*as x from"yjs";function Xo(t){return t.content instanceof x.ContentFormat||t.content instanceof x.ContentEmbed?"text":"arr"in t.content?"array":"str"in t.content?"text":"type"in t.content?"xml":"unknown"}function Wo(t){let e=[],o=t;for(;o!==null;){if(!o.deleted)if(o.content instanceof x.ContentType)e.push(o.content.type.toJSON());else if(o.content instanceof x.ContentString)e.push(o.content.str);else if(o.content instanceof x.ContentFormat){let{key:r,value:i}=o.content;e.push({key:r,value:i})}else o.content instanceof x.ContentEmbed&&e.push(o.content.embed);o=o.right}return e}function Pt(t,e,o,r=!1){if(!e._first&&e._map instanceof Map&&e._map.size>0)return t.getMap(o).toJSON();if(e._first!==null){let i=Xo(e._first);if(i==="text")return r?Wo(e._first):t.getText(o).toJSON();if(i==="array")return t.getArray(o).toJSON();if(i==="xml")return t.getXmlFragment(o).toJSON()}return e.toJSON()}var qo={ytext:x.Text,yxmlfragment:x.XmlFragment,yxmltext:x.XmlText,ymap:x.Map,yarray:x.Array};function Dt(t,e="",o=!1,r=""){let i={};if(e.length){if(t.share.has(e)){if(r.length){let a=qo[r];if(a)return t.get(e,a).toJSON()}return{[e]:Pt(t,t.share.get(e),e,o)}}return{[e]:""}}for(let[a,d]of t.share)i[a]=Pt(t,d,a,o);return i}var Ft=(o=>(o.PlainLson="plain-lson",o.LossyJson="json",o))(Ft||{}),ur=dr(Ft),Jt=fe(j,ar(j,X(j))),n=new nr({authorize:({req:t})=>ye(t)});function N(t){return _e({error:"ROOM_NOT_FOUND",message:`Room with id "${t}" not found.`},404)}var lr=new Qo({fields:{roomId:"string"},indexableFields:{metadata:"token"}});function mr(t){let e=lr.parse(t),o={};for(let r of e.query.allOf)switch(r.type){case"PrefixCondition":{r.field.type==="DirectField"&&r.field.ref.name==="roomId"&&(o.roomId={value:r.prefix.value,operator:"^"});break}case"ExactCondition":{r.field.type==="KeyedField"&&r.field.base.name==="metadata"&&r.value.type==="LiteralString"&&(o.metadata??={},o.metadata[r.field.key]=r.value.value);break}}return o}function Re(t){return{type:"room",id:t.id,organizationId:t.organizationId,createdAt:t.createdAt,metadata:t.metadata,defaultAccesses:t.defaultAccesses,groupsAccesses:t.groupsAccesses,usersAccesses:t.usersAccesses}}n.route("GET /v2/rooms/<roomId>",({p:t})=>{let e=C(t.roomId);if(!e)throw N(t.roomId);return Re(e)});n.route("GET /v2/rooms",({url:t})=>{let e,o=t.searchParams.get("query");if(o)try{e=mr(o)}catch(d){return _e({error:"INVALID_QUERY",message:d instanceof Error?d.message:String(d)},422)}else{let d={};for(let[c,f]of t.searchParams.entries())c.startsWith("metadata.")&&(d[c.slice(9)]=f);Object.keys(d).length>0&&(e={metadata:d})}let r=t.searchParams.get("organizationId")??void 0;return r&&(e={...e,organizationId:r}),{data:at(e).map(Re),nextPage:null,nextCursor:null}});n.route("POST /v2/rooms",be({id:j,organizationId:Y(j),defaultAccesses:Y(X(j)),metadata:Y(Jt),usersAccesses:Y(fe(j,X(j))),groupsAccesses:Y(fe(j,X(j)))}),({body:t,url:e})=>{if(!e.searchParams.has("idempotent")&&C(t.id))return _e({error:"ROOM_ALREADY_EXISTS",message:`Room with id "${t.id}" already exists.`},409);let r=Ie(t.id,{organizationId:t.organizationId,defaultAccesses:t.defaultAccesses,metadata:t.metadata,usersAccesses:t.usersAccesses,groupsAccesses:t.groupsAccesses});return Re(r)});n.route("POST /v2/rooms/<roomId>",be({defaultAccesses:Y(X(j)),metadata:Y(Jt),usersAccesses:Y(fe(j,jt(X(j)))),groupsAccesses:Y(fe(j,jt(X(j))))}),({p:t,body:e})=>{let o=dt(t.roomId,{defaultAccesses:e.defaultAccesses,metadata:e.metadata,usersAccesses:e.usersAccesses,groupsAccesses:e.groupsAccesses});if(!o)throw N(t.roomId);return Re(o)});n.route("DELETE /v2/rooms/<roomId>",async({p:t})=>(await ct(t.roomId),new Response(null,{status:204})));n.route("GET /v2/rooms/<roomId>/storage",async({url:t,p:e})=>{if(!C(e.roomId))throw N(e.roomId);let o=ur.value(t.searchParams.get("format"))??"plain-lson",r=F(e.roomId);await r.load();let i=r.storage.loadedDriver.get_snapshot(!1),a=o==="json"?tr(i):Bt(i);return new Response(JSON.stringify(a),{status:200,headers:{"Content-Type":"application/json"}})});n.route("POST /v2/rooms/<roomId>/storage",be({liveblocksType:ir("LiveObject"),data:er}).refineType(),async({p:t,body:e})=>{if(!C(t.roomId))throw N(t.roomId);let o=F(t.roomId);await o.load();let r=o.storage.loadedDriver.get_snapshot(!1),i=Bt(r);return Object.keys(i.data).length>0?new Response(JSON.stringify({error:"CANNOT_UPDATE_EXISTING_STORAGE",message:"The room already has storage data. It's only possible to initialize the storage for an empty room.",suggestion:"Create another room or clear this room storage first."}),{status:409,headers:{"Content-Type":"application/json"}}):(await o.driver.DANGEROUSLY_reset_nodes(e),o.unload(),new Response(JSON.stringify(e),{status:200,headers:{"Content-Type":"application/json"}}))});n.route("DELETE /v2/rooms/<roomId>/storage",async({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=F(t.roomId);await e.load();let o={liveblocksType:"LiveObject",data:{}};return await e.driver.DANGEROUSLY_reset_nodes(o),e.unload(),new Response(null,{status:204})});n.route("GET /v2/rooms/<roomId>/ydoc",async({url:t,p:e})=>{if(!C(e.roomId))throw N(e.roomId);let o=F(e.roomId);await o.load();let r=t.searchParams.get("key")??"",i=t.searchParams.get("type")??"",a=t.searchParams.get("guid")??Je,d=t.searchParams.get("formatting")!==null,c=new Ut(new Mt("warning")),f=await o.yjsStorage.getYDoc(c,a),v=Dt(f,r,d,i);return new Response(JSON.stringify(v),{status:200,headers:{"Content-Type":"application/json"}})});n.route("PUT /v2/rooms/<roomId>/ydoc",async({req:t,url:e,p:o})=>{if(t.headers.get("content-type")!=="application/octet-stream")return new Response(JSON.stringify({error:"BAD_REQUEST",message:'Expected "Content-Type" header to be "application/octet-stream", and the HTTP body to be a valid binary Yjs update.'}),{status:400,headers:{"Content-Type":"application/json"}});if(!C(o.roomId))throw N(o.roomId);let r=F(o.roomId);await r.load();let i=await t.arrayBuffer(),a=cr.fromUint8Array(new Uint8Array(i)),d=e.searchParams.get("guid"),f=e.searchParams.get("encoder")==="v2",v=d&&d!==Je?d:void 0;try{let b=await r.mutex.runExclusive(()=>r.yjsStorage.addYDocUpdate({},a,v,f)),g=L=>{};return r.sendToAll({type:Zo.UPDATE_YDOC,update:a,isSync:!1,stateVector:null,guid:v,v2:f,remoteSnapshotHash:b.snapshotHash},void 0,g),new Response(JSON.stringify({success:!0}),{status:200,headers:{"Content-Type":"application/json"}})}catch(b){return new Response(JSON.stringify({error:"UNPROCESSABLE_ENTITY",message:b instanceof Error?b.message:"Could not apply update",suggestion:"Please ensure the update is correct, and you selected the correct encoder to use (v1 or v2)."}),{status:422,headers:{"Content-Type":"application/json"}})}});n.route("GET /v2/rooms/<roomId>/ydoc-binary",async({url:t,p:e})=>{if(!C(e.roomId))throw N(e.roomId);let o=F(e.roomId);await o.load();let r=t.searchParams.get("guid")??Je,i=t.searchParams.get("encoder"),a=new Ut(new Mt("warning")),d=await o.yjsStorage.getYDoc(a,r),c=i==="v2"?Se.encodeStateAsUpdateV2(d):Se.encodeStateAsUpdate(d);return new Response(c,{status:200,headers:{"Content-Type":"application/octet-stream"}})});n.route("GET /v2/rooms/<roomId>/active_users",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let o=F(t.roomId).listSessions().map(r=>({type:"user",connectionId:r.actor,id:r.user.id,info:r.user.info}));return _e({data:o})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({ok:!0})});n.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({ok:!0})});n.route("GET /v2/rooms/<roomId>/feeds",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({feeds:[{feedId:"123",metadata:{title:"Test Feed",description:"This is a test feed"},timestamp:new Date().getTime()}],nextCursor:null})});n.route("GET /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({feedId:"123",timestamp:new Date().getTime(),metadata:{title:"Test Feed",description:"This is a test feed"}})});n.route("GET /v2/rooms/<roomId>/feeds/<feedId>/messages",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({messages:[{messageId:"123",data:{content:"This is a test message"}}],nextCursor:null})});n.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=Date.now();return P({feedId:t.feedId,createdAt:e,updatedAt:e,metadata:{title:"Test Feed",description:"This is a test feed"}})});n.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=Date.now();return P({id:t.messageId,createdAt:e,updatedAt:e,data:{content:"This is a test message"}})});n.route("POST /v2/rooms/<roomId>/feeds",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({feedId:"123",timestamp:new Date().getTime(),metadata:{title:"Test Feed",description:"This is a test feed"}})});n.route("POST /v2/rooms/<roomId>/feeds/<feedId>/messages",({p:t})=>{if(!C(t.roomId))throw N(t.roomId);return P({id:"123",timestamp:new Date().getTime(),data:{content:"This is a test message"}})});n.route("POST /v2/rooms/<roomId>/request-storage-mutation",async({p:t})=>{if(!C(t.roomId))throw N(t.roomId);let e=F(t.roomId);await e.load();let o=await e.driver.next_actor(),r=e.storage.loadedDriver.get_snapshot(!1);return sr(kt([{actor:o}],or(r)))});n.route("POST /v2/rooms/<roomId>/send-message",be({messages:X(rr)}),async({p:t,body:e})=>{if(!C(t.roomId))throw N(t.roomId);let o=F(t.roomId);await o.load();let[r,i]=await o.createBackendSession_experimental();return await o.processClientMsgFromBackendSession(r,e.messages),new Response(`{"messages":[${i.join(",")}]}`,{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})});n.route("PATCH /v2/rooms/<roomId>/storage/json-patch",()=>s()),n.route("POST /v2/rooms/<roomId>/presence",()=>s()),n.route("GET /v2/rooms/<roomId>/threads",()=>s()),n.route("POST /v2/rooms/<roomId>/upsert",()=>s()),n.route("POST /v2/rooms/<roomId>/update-room-id",()=>s()),n.route("POST /v2/rooms/<roomId>/update-organization-id",()=>s()),n.route("GET /v2/rooms/<roomId>/prewarm",()=>s()),n.route("POST /v2/rooms/<roomId>/broadcast_event",()=>s()),n.route("GET /v2/rooms/<roomId>/versions",()=>s()),n.route("GET /v2/rooms/<roomId>/version/<version>",()=>s()),n.route("POST /v2/rooms/<roomId>/version",()=>s()),n.route("POST /v2/rooms/<roomId>/threads",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/subscribe",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/subscriptions",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/metadata",()=>s()),n.route("DELETE /v2/rooms/<roomId>/threads/<threadId>",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/participants",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/inbox-notifications",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments",()=>s()),n.route("GET /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>s()),n.route("DELETE /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/add-reaction",()=>s()),n.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/remove-reaction",()=>s()),n.route("GET /v2/rooms/<roomId>/attachments/<attachmentId>",()=>s()),n.route("GET /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("GET /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("POST /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("POST /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("DELETE /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),n.route("DELETE /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),n.route("GET /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),n.route("DELETE /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),n.route("GET /v2/users/<userId>/inbox-notifications",()=>s()),n.route("DELETE /v2/users/<userId>/inbox-notifications",()=>s()),n.route("GET /v2/users/<userId>/notification-settings",()=>s()),n.route("POST /v2/users/<userId>/notification-settings",()=>s()),n.route("DELETE /v2/users/<userId>/notification-settings",()=>s()),n.route("GET /v2/users/<userId>/room-subscription-settings",()=>s()),n.route("POST /v2/inbox-notifications/trigger",()=>s()),n.route("POST /v2/inbox-notifications/<inboxNotificationId>/read",()=>s()),n.route("POST /v2/groups",()=>s()),n.route("GET /v2/groups/<groupId>",()=>s()),n.route("POST /v2/groups/<groupId>/add-members",()=>s()),n.route("POST /v2/groups/<groupId>/remove-members",()=>s()),n.route("DELETE /v2/groups/<groupId>",()=>s()),n.route("GET /v2/groups",()=>s()),n.route("GET /v2/users/<userId>/groups",()=>s()),n.route("GET /v2/ai/copilots",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/<knowledgeSourceId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),n.route("GET /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>/links",()=>s()),n.route("POST /v2/ai/copilots",()=>s()),n.route("POST /v2/ai/copilots/<copilotId>",()=>s()),n.route("POST /v2/ai/copilots/<copilotId>/knowledge/web",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),n.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>",()=>s()),n.route("PUT /v2/ai/copilots/<copilotId>/knowledge/file/<fileName>",()=>s()),n.route("GET /v2/management/projects",()=>s()),n.route("GET /v2/management/projects/<projectId>",()=>s()),n.route("POST /v2/management/projects",()=>s()),n.route("POST /v2/management/projects/<projectId>",()=>s()),n.route("DELETE /v2/management/projects/<projectId>",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/delete-additional-headers",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/recover-failed-messages",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/secret/roll",()=>s()),n.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/test",()=>s()),n.route("DELETE /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/activate",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/deactivate",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/public/roll",()=>s()),n.route("POST /v2/management/projects/<projectId>/api-keys/secret/roll",()=>s());function zt(t,e,o,r){if(!t.upgrade(e,{data:{refuseConnection:{code:o,message:r}}}))return new Response("Could not upgrade to WebSocket",{status:426})}var ie=new pr;ie.relay("/v2/authorize-user/*",me);ie.relay("/v2/identify-user/*",me);ie.relay("/v2/c/*",m);ie.relay("/v2/*",n);ie.relay("/*",ne);var $e=1153;function Vt(t){if(t===void 0)return;let e=Number(t);return Number.isInteger(e)&&e>0&&e<=65535?e:void 0}function hr(t){return process.platform==="win32"?[process.env.COMSPEC||"cmd.exe","/c",t]:["sh","-c",t]}function vr(t){return"'"+t.replace(/'/g,"'\\''")+"'"}var Er={description:"Start the local Liveblocks dev server",async run(t){let{options:e,args:o}=Ye(t,{port:{type:"string",short:"p",default:$e.toString()},"random-port":{type:"boolean",short:"P",default:!1},host:{type:"string"},cmd:{type:"string",short:"c"},help:{type:"boolean",short:"h",default:!1},"no-check":{type:"boolean",default:!1},ci:{type:"boolean",default:!1},verbose:{type:"boolean",short:"v",default:!1}},{allowPositionals:!0});if(o.length>0&&!e.cmd&&(console.error(de("Extra arguments are only supported with --cmd (-c)")),process.exit(1)),o.length>0&&e.cmd){let O=o.map(vr).join(" ");e.cmd.includes("{}")?e.cmd=e.cmd.replaceAll("{}",O):e.cmd+=" "+O}if(e.help){console.log("Usage: liveblocks dev [options]"),console.log(),console.log("Start the local Liveblocks dev server"),console.log(),console.log("Options:"),console.log(` --port, -p Port to listen on (default: ${$e})`),console.log(" --random-port, -P Bind a random free port instead of --port (no collisions,"),console.log(" ever). With --cmd, the chosen port is exposed to the command"),console.log(" via LIVEBLOCKS_DEV_SERVER_PORT. Ideal for CI."),console.log(" --host Host to bind to (default: localhost)"),console.log(" --cmd, -c Run a one-off command against a fresh server instance, then"),console.log(" shut down. Does not affect your local data in .liveblocks/."),console.log(" Extra args are appended to the command, or replace {} if"),console.log(" present. Use -- before args starting with -."),console.log(" --ci Start a fresh server instance on every boot, ideal for CI"),console.log(" --no-check Skip project setup check on start"),console.log(" --verbose, -v Show verbose output"),console.log(" --help, -h Show help");return}let r=!1;e.ci&&(r=!0,e["no-check"]=!0),e.cmd&&(r=!0,e["no-check"]=!0);let i=e["random-port"]?0:Vt(e.port)??Vt(process.env.LIVEBLOCKS_DEVSERVER_PORT)??$e,a=e.host||process.env.LIVEBLOCKS_DEVSERVER_HOST||"localhost",d=r?it():null;i!==0&&await wt(i,a)&&(console.error(`Port ${i} is already in use.
|
|
398
|
+
Is another dev server already running?`),process.exit(1));let c,f=!1,v=i;function b(){let O=Ge.serve({hostname:a,port:v,async fetch(T,w){if(T.headers.get("Upgrade")==="websocket"){let G=_t(T);if(!G.ok)return Me(G.xwarn,!0),zt(w,T,$t.NOT_ALLOWED,"You have no access to this room");let{roomId:K,ticketData:A}=G;if(lt(K))return zt(w,T,$t.TRY_AGAIN_LATER,"Server is undergoing maintenance, try again later");let k=F(K);await k.load();let z=await k.createTicket(A),pe=z.sessionKey;if(w.upgrade(T,{data:{room:k,ticket:z,sessionKey:pe}})){console.log(`${J("101")} WS ${new URL(T.url).pathname}${p(` - ${K}`)}`);return}return new Response("Could not upgrade to WebSocket",{status:426})}let l=new URL(T.url);if(T.method==="POST"&&l.pathname==="/crash")return console.log(`${J("204")} POST /crash`),setTimeout(()=>{g()},0),new Response(null,{status:204});let u=`${T.method} ${l.pathname}`,h;if(f)try{h=await T.clone().text()}catch{}let y=await ie.fetch(T),S=y.status,U=S>=500?de(S):S>=400?ee(S):J(S);console.log(`${U} ${u}`);let _=y.headers.get("X-LB-Warn")??void 0;if(Me(_,!y.ok),f){if(h){let A=Gt(h);A!==void 0&&console.log(p(` \u2192 ${JSON.stringify(A)}`))}let G=await y.clone().text(),K=Gt(G);K!==void 0&&console.log(p(` \u2190 ${JSON.stringify(K)}`))}return y},error(T){return console.error(T),new Response("An unknown error occurred",{status:500})},websocket:{async open(T){let{refuseConnection:w,room:l,ticket:u}=T.data;if(w){T.close(w.code,w.message);return}l&&u&&await l.startBrowserSession(u,T)},async message(T,w){let{room:l,sessionKey:u}=T.data;l&&u&&await l.handleData(u,w)},close(T,w,l){let{room:u,sessionKey:h}=T.data;u&&h&&u.endBrowserSession(h,w,l)}}});return v=O.port,O}c=b();async function g(){ft(),await c.stop(!0),c=b(),console.log("Crash \u{1F4A5}")}let L=O=>process.stderr.write(O+`
|
|
399
|
+
`);if(e.cmd){L(`Liveblocks dev server ${p("v1.5.0-rc2")} running at http://${c.hostname}:${c.port}`),d&&e.verbose&&L(p(`Ephemeral mode, using ${d}`));let O=gr(d,"server.log");L(p(`Server logs: ${O}`));let T=Ge.file(O).writer(),w=(...u)=>{T.write(u.map(String).join(" ")+`
|
|
400
|
+
`),T.flush()};console.log=w,console.error=w;let l=1;try{let u=Ge.spawn(hr(e.cmd),{stdin:"inherit",stdout:"inherit",stderr:"inherit",env:{...process.env,LIVEBLOCKS_DEV_SERVER_HOST:a,LIVEBLOCKS_DEV_SERVER_PORT:String(c.port)}}),h=()=>{u.kill()};process.on("SIGTERM",h),process.on("SIGINT",h),l=await u.exited}finally{T.end(),await c.stop(),xe(),L(p("Liveblocks dev server shut down"))}process.exit(l)}else{let O=`http://${a}:${c.port}`,T=e["no-check"]?[]:await St(O),w="logs",l=null,u=null,h=null,y=`http://${c.hostname}:${c.port}`,S=()=>{let R=w==="logs"?D(" Logs "):p(" Logs "),I=w==="sockets"?D(" Sockets "):p(" Sockets "),E=R+p("|")+I,ae=(u?H("\u23F8 maintenance")+" ":"")+p(`Liveblocks running at ${y}`),Oe=process.stdout.columns??80,we=Math.max(1,Oe-Ce(E).length-Ce(ae).length);return E+" ".repeat(we)+ae},U=[],_=console.log.bind(console);console.log=(...R)=>{let I=R.map(String).join(" ");U.push(I),w==="logs"&&_(I)};let G=()=>p(" ")+D("q")+p(" quit, ")+D("!")+p(" crash, ")+D("c")+p(" clear, ")+D("v")+p(f?" verbose (on)":" verbose"),K=()=>{h&&(clearInterval(h),h=null),w="logs",process.stdout.write("\x1B[2J\x1B[H"),_(S()),_(G()),_();for(let R of U)_(R)},A=0,k=[],z=R=>`${R.roomId}:${R.actor}`,pe=()=>{k=ue().map(R=>({...R,alive:!0}))},ze=()=>{let R=new Set(ue().map(z));for(let E of k)E.alive=R.has(z(E));let I=new Set(k.map(z));for(let E of ue())I.has(z(E))||k.push({...E,alive:!0})},Yt=R=>{let I=Date.now()-R,E=Math.floor(I/1e3);if(E<60)return`${E}s`;let M=Math.floor(E/60);return M<60?`${M}m`:`${Math.floor(M/60)}h`},Kt=R=>{if(!R)return"";let I=Date.now()-R;return I<1e3?" "+J("\u25CF"):I<3e3?" "+p(J("\u25CF")):I<5e3?" "+p("\u25CF"):""},ge=(R,I)=>{let E=R+I;for(;E>=0&&E<k.length;){if(k[E].alive)return E;E+=I}return R},W=()=>{ze();let R=k.filter(E=>E.alive).length;if(process.stdout.write("\x1B[2J\x1B[H"),_(S()),_(p(" ")+D("\u2191\u2193")+p(" navigate, ")+D("k")+p(" kill, ")+D("m")+p(u?" maintenance off, ":" maintenance on, ")+D("r")+p(" refresh")),_(),_(" "+D("Connections")+p(` (${R} alive)`)),_(),k.length===0){_(p(" No active connections"));return}if(A>=k.length&&(A=k.length-1),!k[A]?.alive){let E=ge(A,-1);A=k[E]?.alive?E:ge(A,1)}let I=new Map;for(let E of ue())I.set(z(E),E.lastActiveAt);for(let E=0;E<k.length;E++){let M=k[E];if(!M.alive){_(p(` ${M.roomId} \xB7 actor=${M.actor} \xB7 disconnected`));continue}let ae=E===A?J("\u25B6 "):" ",Oe=M.userId??p("anonymous"),we=Yt(M.connectedAt),Wt=I.get(z(M)),qt=Kt(Wt);_(`${ae}${D(M.roomId)} ${p("\xB7")} actor=${M.actor} ${p("\xB7")} ${Oe} ${p("\xB7")} ${p(we)}${qt}`)}},Ht=()=>{w="sockets",A=0,pe(),W(),h=setInterval(()=>W(),1e3)},Xt=()=>{if(u)u(),u=null;else{let{promise:R,resolve:I}=fr();ut(R),u=I}};process.stdout.write("\x1B[2J\x1B[H"),_(S()),_(G()),_(),d&&e.verbose&&console.log(p(`Ephemeral mode, using ${d}`)),process.stdin.setRawMode?.(!0),process.stdin.resume(),process.stdin.on("data",R=>{let I=R.toString();if(I===""||I==="q"){c.stop(!0).then(()=>{xe(),process.exit(0)});return}if(I==="m"){Xt(),w==="sockets"?W():(process.stdout.write("\x1B[s\x1B[H\x1B[2K"),_(S()),process.stdout.write("\x1B[u"));return}if((I==="s"||I==="\x1B[C")&&w!=="sockets"){Ht();return}if((I==="l"||I==="\x1B[D")&&w!=="logs"){K();return}if(w==="sockets"){if(I==="\x1B[A")A=ge(A,-1),W();else if(I==="\x1B[B")A=ge(A,1),W();else if(I==="k"){let E=k[A];E?.alive&&(mt(E.roomId,E.actor),W())}else I==="r"&&(pe(),A=0,W());return}if(I==="!")l!==null?(clearTimeout(l),l=null,g()):(console.log("Simulating crash in 2.5s... (press ! again to crash now)"),l=setTimeout(()=>{l=null,g()},2500));else if(I==="c")U.length=0,process.stdout.write("\x1B[2J\x1B[H"),_(S()),_(G()),_();else if(I==="v")f=!f,process.stdout.write("\x1B[s\x1B[H\x1B[2K"),_(S()),process.stdout.write("\x1B[2K"),_(G()),process.stdout.write("\x1B[u"),console.log(p(f?"Verbose mode on":"Verbose mode off"));else if(I==="p")if(T.length>0){let E=Rt(T,O);Ot(E),console.log(p("Copied AI fix prompt to clipboard"))}else console.log(p("No setup issues detected"))})}}},Vs=Er;export{Vs as default};
|
|
401
401
|
/*! Bundled license information:
|
|
402
402
|
|
|
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-
|
|
2
|
+
import{i as r}from"./chunk-ZFPKG3IB.js";import{execFileSync as l,spawnSync as c}from"child_process";function a(){try{return l("bun",["--version"],{stdio:"ignore"}),!0}catch{return!1}}function d(){if(a()){let e=c("bun",process.argv.slice(1),{stdio:"inherit"});process.exit(e.status??1)}else console.error("The Liveblocks local dev server requires Bun."),console.error("See https://liveblocks.io/docs/get-started/dev-server for more information."),process.exit(1)}var s=process.argv.slice(2),o=s.findIndex(e=>!e.startsWith("-")),{options:t}=r(o>=0?s.slice(0,o):s,{help:{type:"boolean",short:"h",default:!1},version:{type:"boolean",default:!1}}),n=o>=0?s[o]:void 0,u=o>=0?s.slice(o+1):[];async function p(e){switch(e){case"dev":return typeof Bun>"u"&&d(),(await import("./dev-server-2XWU56GJ.js")).default;case"upgrade":return(await import("./upgrade-QCUVOTDV.js")).default;default:return}}var m={dev:"Start the local Liveblocks dev server",upgrade:"Upgrade all Liveblocks packages"};function f(){console.log("liveblocks v1.5.0-rc2"),console.log(),console.log("Usage: liveblocks <command> [options]"),console.log(),console.log("Commands:");for(let[e,i]of Object.entries(m))console.log(` ${e.padEnd(12)} ${i}`);console.log(),console.log("Options:"),console.log(" --help, -h Show this help message"),console.log(" --version Show version number")}async function v(){t.version&&(console.log("1.5.0-rc2"),process.exit(0)),(t.help||!n)&&(f(),process.exit(n?0:1));let e=await p(n);e?await e.run(u):(console.error(`Unknown command: ${n}`),console.error('Run "liveblocks --help" for usage.'),process.exit(1))}v();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "liveblocks",
|
|
3
|
-
"version": "1.5.0-
|
|
3
|
+
"version": "1.5.0-rc2",
|
|
4
4
|
"description": "Liveblocks command line interface",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"js-base64": "^3.7.5",
|
|
43
43
|
"yjs": "^13.6.10",
|
|
44
44
|
"@liveblocks/query-parser": "^0.1.1",
|
|
45
|
-
"@liveblocks/server": "^1.5.0-
|
|
45
|
+
"@liveblocks/server": "^1.5.0-rc2"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
48
|
"build": "tsup",
|