liveblocks 1.6.0 → 1.6.2
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,15 +1,15 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{a as W,b as Ke,c as Y,d as B,e as ie,f as x,g as m,h as Ne,i as Xe}from"./chunk-ZFPKG3IB.js";import{Promise_withResolvers as Cr,tryParseJson as Kt,WebsocketCloseCodes as Xt}from"@liveblocks/core";import{ZenRelay as Nr}from"@liveblocks/zenrouter";import Ye from"bun";import{join as wr}from"path";import{mergeRoomPermissionScopes as Go,nanoid as zo,Permission as Ot}from"@liveblocks/core";import{ProtocolVersion as Lt}from"@liveblocks/server";import{nanoid as _o,Permission as Io,WebsocketCloseCodes as st}from"@liveblocks/core";import{DefaultMap as To,Room as yo}from"@liveblocks/server";import{Database as bo}from"bun:sqlite";import{mkdirSync as nt,mkdtempSync as So,rmSync as Ro}from"fs";import{tmpdir as Oo}from"os";import{dirname as Lo,join as ve,resolve as rt}from"path";import{asPos as qe,CrdtType as A,raise as so}from"@liveblocks/core";import{makeInMemorySnapshot as no,plainLsonToNodeStream as io,quote as Ae}from"@liveblocks/server";import{Database as ao}from"bun:sqlite";function ae(t){try{return t!==void 0?JSON.parse(t):void 0}catch{return}}function we(t){return JSON.parse(t)}function Ze(t){let{type:e,parent_id:o,parent_key:r,jdata:n}=t;switch(e){case A.OBJECT:return o===null?{type:e,data:we(n)}:{type:e,parentId:o,parentKey:r,data:we(n)};case A.REGISTER:return{type:e,parentId:o,parentKey:r,data:we(n)};case A.LIST:case A.MAP:return{type:e,parentId:o,parentKey:r};default:so("Unhandled case")}}function Qe(t){return[t.id,Ze(t)]}function co(t){if(t>512)throw new Error("More than 512 params not supported");return new Array(t).fill("?").join(",")}function uo(t){t.run(`INSERT OR IGNORE INTO nodes (id, type, parent_id, parent_key, jdata)
|
|
2
2
|
VALUES ('root', 0, NULL, NULL, '{}')`)}function lo(t){let e=t.query(`SELECT c.id
|
|
3
3
|
FROM nodes c
|
|
4
4
|
JOIN nodes p ON p.id = c.parent_id
|
|
5
5
|
WHERE
|
|
6
|
-
(c.type = ${
|
|
6
|
+
(c.type = ${A.REGISTER} AND p.type = ${A.OBJECT})
|
|
7
7
|
OR
|
|
8
|
-
p.type = ${
|
|
8
|
+
p.type = ${A.REGISTER}`).all();for(let{id:o}of e)Ee(t,o)}function mo(t){let e=t.query(`SELECT p.id, c.parent_key AS key
|
|
9
9
|
FROM nodes p
|
|
10
10
|
JOIN nodes c ON c.parent_id = p.id
|
|
11
|
-
WHERE p.type = ${
|
|
12
|
-
AND json_type(p.jdata, '$.' || json_quote(c.parent_key)) IS NOT NULL`).all();for(let{id:o,key:r}of e)t.query("UPDATE nodes SET jdata = json_remove(jdata, '$.' || json_quote(?)) WHERE id = ?").run(r,o)}function
|
|
11
|
+
WHERE p.type = ${A.OBJECT}
|
|
12
|
+
AND json_type(p.jdata, '$.' || json_quote(c.parent_key)) IS NOT NULL`).all();for(let{id:o,key:r}of e)t.query("UPDATE nodes SET jdata = json_remove(jdata, '$.' || json_quote(?)) WHERE id = ?").run(r,o)}function et(t,e){return t?.type===A.OBJECT&&Object.prototype.hasOwnProperty.call(t.data,e)&&t.data[e]!==void 0}function q(t,e){let o=t.query("SELECT id, type, parent_id, parent_key, jdata FROM nodes WHERE id = ?").get(e);return o?Ze(o):void 0}function We(t){return t.query("SELECT id, type, parent_id, parent_key, jdata FROM nodes").all().map(Qe)}function po(t){return t.query(`SELECT
|
|
13
13
|
CASE
|
|
14
14
|
WHEN parent_id IS NULL THEN
|
|
15
15
|
'[' || json_quote(id) || ',' || jdata || ']'
|
|
@@ -20,10 +20,10 @@ import{a as q,b as We,c as Y,d as B,e as ae,f as A,g as m,h as we,i as Xe}from".
|
|
|
20
20
|
'[' || json_quote(id) || ',' || type || ',' ||
|
|
21
21
|
json_quote(parent_id) || ',' || json_quote(parent_key) || ',' || jdata || ']'
|
|
22
22
|
END AS tuple
|
|
23
|
-
FROM nodes`).all().map(e=>e.tuple)}function
|
|
23
|
+
FROM nodes`).all().map(e=>e.tuple)}function de(t,e,o){return t.query("SELECT id FROM nodes WHERE parent_id = ? AND parent_key = ?").get(e,o)?.id}function tt(t,e,o){return de(t,e,o)!==void 0}function fo(t,e,o){let r=t.query("SELECT parent_key FROM nodes WHERE parent_id = ? AND parent_key > ? ORDER BY parent_key LIMIT 1").get(e,o);return r?qe(r.parent_key):void 0}function go(t,e){let o=t.query("SELECT parent_key FROM nodes WHERE parent_id = ? ORDER BY parent_key DESC LIMIT 1").get(e);return o?qe(o.parent_key):void 0}function he(t,e,o){let r=e==="root"?null:o.parentId??null,n=e==="root"?null:o.parentKey??null,a=o.type===A.OBJECT||o.type===A.REGISTER?JSON.stringify(o.data):null;t.query(`INSERT INTO nodes (id, type, parent_id, parent_key, jdata)
|
|
24
24
|
VALUES (?, ?, ?, ?, ?)
|
|
25
25
|
ON CONFLICT (id) DO
|
|
26
|
-
UPDATE SET type = excluded.type, parent_id = excluded.parent_id, parent_key = excluded.parent_key, jdata = excluded.jdata`).run(e,o.type,r,n,a)}function
|
|
26
|
+
UPDATE SET type = excluded.type, parent_id = excluded.parent_id, parent_key = excluded.parent_key, jdata = excluded.jdata`).run(e,o.type,r,n,a)}function Ee(t,e){if(e==="root")return;let o=[{visit:e}];for(;o.length>0;){let r=o.pop();if(r.delete!==void 0)t.query("DELETE FROM nodes WHERE id = ?").run(r.delete);else{o.push({delete:r.visit});let n=t.query("SELECT id FROM nodes WHERE parent_id = ?").all(r.visit);for(let a of n)o.push({visit:a.id})}}}function ot(t,e,o){let r=q(t,e);et(r,o)&&(delete r.data[o],he(t,e,r));let n=de(t,e,o);n!==void 0&&Ee(t,n)}function ho(t,e,o,r=!1){let n=q(t,o.parentId);if(n===void 0)throw new Error(`No such parent ${Ae(o.parentId)}`);if(o.type===A.REGISTER&&n.type===A.OBJECT)throw new Error("Cannot add register under object");let a=de(t,o.parentId,o.parentKey);if(a!==e){let d=et(n,o.parentKey);if(a!==void 0||d)if(r)ot(t,o.parentId,o.parentKey);else throw new Error(`Key ${Ae(o.parentKey)} already exists`)}he(t,e,o)}function Eo(t,e,o){let r=q(t,e);if(r?.parentId===void 0)return;if(tt(t,r.parentId,o))throw new Error(`Pos ${Ae(o)} already taken`);let n={...r,parentKey:o};he(t,e,n)}function vo(t,e,o,r=!1){let n=q(t,e);if(n?.type!==A.OBJECT)return;let a=!1;for(let[d,c]of Object.entries(o)){if(d==="__proto__")continue;let l=de(t,e,d);if(l!==void 0)if(r)Ee(t,l);else throw new Error(`Child node already exists under ${d}`);n.data[d]!==c&&(n.data[d]=c,a=!0)}a&&he(t,e,n)}var ge=class{db;_nodesApi;constructor(e){let o=new ao(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 (
|
|
27
27
|
setting TEXT NOT NULL,
|
|
28
28
|
jval TEXT NOT NULL,
|
|
29
29
|
PRIMARY KEY (setting)
|
|
@@ -76,7 +76,7 @@ import{a as q,b as We,c as Y,d as B,e as ae,f as A,g as m,h as we,i as Xe}from".
|
|
|
76
76
|
updated_at INTEGER NOT NULL,
|
|
77
77
|
PRIMARY KEY (feed_id, message_id),
|
|
78
78
|
FOREIGN KEY (feed_id) REFERENCES feeds(feed_id) ON DELETE CASCADE
|
|
79
|
-
)`),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}get loadedApi(){return this._nodesApi??=this._loadNodesApi()}get_node(e){return this.loadedApi.get_node(e)}iter_nodes(){return this.loadedApi.iter_nodes()}iter_nodes_optimized(){return this.loadedApi.iter_nodes_optimized()}has_node(e){return this.loadedApi.has_node(e)}get_child_at(e,o){return this.loadedApi.get_child_at(e,o)}has_child_at(e,o){return this.loadedApi.has_child_at(e,o)}get_next_sibling(e,o){return this.loadedApi.get_next_sibling(e,o)}get_last_sibling(e){return this.loadedApi.get_last_sibling(e)}set_child(e,o,r){this.loadedApi.set_child(e,o,r)}move_sibling(e,o){this.loadedApi.move_sibling(e,o)}delete_node(e){this.loadedApi.delete_node(e)}delete_child_key(e,o){this.loadedApi.delete_child_key(e,o)}set_object_data(e,o,r){this.loadedApi.set_object_data(e,o,r)}get_snapshot(e){return this.loadedApi.get_snapshot(e)}_loadNodesApi(){let e=this.db;return uo(e),lo(e),mo(e),{get_node:r=>
|
|
79
|
+
)`),o.run("CREATE INDEX IF NOT EXISTS idx_feed_messages_feed_created ON feed_messages(feed_id, created_at DESC, message_id DESC)"),o.run("PRAGMA optimize=65554"),this.db=o}get loadedApi(){return this._nodesApi??=this._loadNodesApi()}get_node(e){return this.loadedApi.get_node(e)}iter_nodes(){return this.loadedApi.iter_nodes()}iter_nodes_optimized(){return this.loadedApi.iter_nodes_optimized()}has_node(e){return this.loadedApi.has_node(e)}get_child_at(e,o){return this.loadedApi.get_child_at(e,o)}has_child_at(e,o){return this.loadedApi.has_child_at(e,o)}get_next_sibling(e,o){return this.loadedApi.get_next_sibling(e,o)}get_last_sibling(e){return this.loadedApi.get_last_sibling(e)}set_child(e,o,r){this.loadedApi.set_child(e,o,r)}move_sibling(e,o){this.loadedApi.move_sibling(e,o)}delete_node(e){this.loadedApi.delete_node(e)}delete_child_key(e,o){this.loadedApi.delete_child_key(e,o)}set_object_data(e,o,r){this.loadedApi.set_object_data(e,o,r)}get_snapshot(e){return this.loadedApi.get_snapshot(e)}_loadNodesApi(){let e=this.db;return uo(e),lo(e),mo(e),{get_node:r=>q(e,r),iter_nodes:()=>We(e),iter_nodes_optimized:()=>po(e),has_node:r=>q(e,r)!==void 0,get_child_at:(r,n)=>de(e,r,n),has_child_at:(r,n)=>tt(e,r,n),get_next_sibling:(r,n)=>fo(e,r,n),get_last_sibling:r=>go(e,r),set_child:(r,n,a)=>ho(e,r,n,a),move_sibling:(r,n)=>Eo(e,r,n),delete_node:r=>Ee(e,r),delete_child_key:(r,n)=>ot(e,r,n),set_object_data:(r,n,a)=>vo(e,r,n,a),get_snapshot(r){return no(We(e))}}}reinitialize(){this._nodesApi=void 0}DANGEROUSLY_reset_nodes(e){this.reinitialize();let o=this.db.prepare("INSERT INTO nodes (id, type, parent_id, parent_key, jdata) VALUES (?, ?, ?, ?, ?)");this.db.transaction(()=>{this.db.run("PRAGMA defer_foreign_keys = ON"),this.db.run("DELETE FROM nodes");for(let[n,a]of io(e)){let d=n==="root"?null:a.parentId??null,c=n==="root"?null:a.parentKey??null,l=a.type===A.OBJECT||a.type===A.REGISTER?JSON.stringify(a.data):null;o.run(n,a.type,d,c,l)}})()}raw_iter_nodes(){return this.db.query("SELECT id, type, parent_id, parent_key, jdata FROM nodes").all().map(Qe)}get_meta(e){let r=this.db.query("SELECT jval FROM metadata WHERE key = ?").get(e)?.jval;if(r!==void 0)return ae(r)??null}put_meta(e,o){let r=JSON.stringify(o);this.db.run(`INSERT INTO metadata (key, jval)
|
|
80
80
|
VALUES (?, ?)
|
|
81
81
|
ON CONFLICT (key) DO UPDATE SET jval = ?
|
|
82
82
|
`,[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)
|
|
@@ -84,14 +84,14 @@ import{a as q,b as We,c as Y,d as B,e as ae,f as A,g as m,h as we,i as Xe}from".
|
|
|
84
84
|
ON CONFLICT (setting) DO UPDATE SET jval = json(CAST(jval AS INTEGER) + 1)
|
|
85
85
|
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
|
|
86
86
|
VALUES (?, ?, ?)
|
|
87
|
-
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 (${co(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:
|
|
87
|
+
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 (${co(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:ae(o.jpresence)??null,updatedAt:o.updated_at,info:ae(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:ae(o.jpresence)??null,updatedAt:o.updated_at,info:ae(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)
|
|
88
88
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
89
89
|
ON CONFLICT (session_id) DO UPDATE SET
|
|
90
90
|
jpresence = excluded.jpresence,
|
|
91
91
|
updated_at = excluded.updated_at,
|
|
92
92
|
juserinfo = excluded.juserinfo,
|
|
93
93
|
ttl = excluded.ttl,
|
|
94
|
-
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,n=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,N]of Object.entries(a)){let y=typeof N=="boolean"?Number(N):N;d+=" AND json_extract(jmetadata, '$.' || ?) = ?",c.push(g,y)}if(r!==void 0&&(d+=" AND created_at >= ?",c.push(r)),n!==void 0)try{let g=JSON.parse(Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),[N,y]=g;d+=" AND (created_at < ? OR (created_at = ? AND feed_id < ?))",c.push(y,y,N)}catch{}d+=" ORDER BY created_at DESC, feed_id DESC LIMIT ?",c.push(o+1);let l=this.db.query(d).all(...c),
|
|
94
|
+
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,n=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,N]of Object.entries(a)){let y=typeof N=="boolean"?Number(N):N;d+=" AND json_extract(jmetadata, '$.' || ?) = ?",c.push(g,y)}if(r!==void 0&&(d+=" AND created_at >= ?",c.push(r)),n!==void 0)try{let g=JSON.parse(Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),[N,y]=g;d+=" AND (created_at < ? OR (created_at = ? AND feed_id < ?))",c.push(y,y,N)}catch{}d+=" ORDER BY created_at DESC, feed_id DESC LIMIT ?",c.push(o+1);let l=this.db.query(d).all(...c),R;if(l.length>o){l.pop();let g=l[l.length-1];if(g){let N=[g.feed_id,g.created_at];R=Buffer.from(JSON.stringify(N),"utf8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}return{feeds:l.map(g=>({feedId:g.feed_id,metadata:JSON.parse(g.jmetadata),createdAt:g.created_at,updatedAt:g.updated_at})),nextCursor:R}}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),n=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(n!==void 0&&(d+=" AND created_at >= ?",c.push(n)),a!==void 0)try{let g=JSON.parse(Buffer.from(a.replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8")),[N,y]=g;d+=" AND (created_at < ? OR (created_at = ? AND message_id < ?))",c.push(y,y,N)}catch{}d+=" ORDER BY created_at DESC, message_id DESC LIMIT ?",c.push(r+1);let l=this.db.query(d).all(...c),R;if(l.length>r){l.pop();let g=l[l.length-1];if(g){let N=[g.message_id,g.created_at];R=Buffer.from(JSON.stringify(N),"utf8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}return{messages:l.map(g=>({id:g.message_id,data:JSON.parse(g.jdata),createdAt:g.created_at,updatedAt:g.updated_at})),nextCursor:R}}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,n){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=n??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 l=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(l==null)throw new Error(`Feed message ${o} not found in feed ${e}`);return{id:l.message_id,data:JSON.parse(l.jdata),createdAt:l.created_at,updatedAt:l.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 Co=".liveblocks/v2",_e=Co,it=!1,X=null;function at(){return ve(_e,"rooms")}function Q(){if(X)return;let t=ve(_e,"db.sql");nt(Lo(t),{recursive:!0});let e=new bo(t,{create:!0});e.run("PRAGMA journal_mode = WAL"),e.run("PRAGMA foreign_keys = ON"),e.run(`CREATE TABLE IF NOT EXISTS rooms (
|
|
95
95
|
room_id TEXT NOT NULL PRIMARY KEY,
|
|
96
96
|
internal_id TEXT NOT NULL UNIQUE,
|
|
97
97
|
organization_id TEXT NOT NULL,
|
|
@@ -110,13 +110,13 @@ import{a as q,b as We,c as Y,d as B,e as ae,f as A,g as m,h as we,i as Xe}from".
|
|
|
110
110
|
scopes TEXT NOT NULL,
|
|
111
111
|
PRIMARY KEY (room_id, group_id),
|
|
112
112
|
FOREIGN KEY (room_id) REFERENCES rooms(room_id) ON DELETE CASCADE
|
|
113
|
-
) STRICT`),
|
|
113
|
+
) STRICT`),X=e}function ee(){if(!X)throw new Error("Rooms DB not initialized");return X}function dt(t){let e=ee(),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),n={};for(let d of o)n[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:n,groupsAccesses:a,metadata:JSON.parse(t.metadata),createdAt:t.created_at}}function Z(t){let e=ee().query("SELECT room_id, internal_id, organization_id, default_permissions, metadata, created_at FROM rooms WHERE room_id = ?").get(t);if(e)return dt(e)}var No="default";function ct(t,e){let o=ee(),r=_o(),n=new Date().toISOString(),a=e?.organizationId??No,d=e?.defaultAccesses??[Io.RoomWrite],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),n]),e?.usersAccesses)for(let[l,R]of Object.entries(e.usersAccesses))o.run("INSERT INTO room_user_permissions (room_id, user_id, scopes) VALUES (?, ?, ?)",[t,l,JSON.stringify(R)]);if(e?.groupsAccesses)for(let[l,R]of Object.entries(e.groupsAccesses))o.run("INSERT INTO room_group_permissions (room_id, group_id, scopes) VALUES (?, ?, ?)",[t,l,JSON.stringify(R)]);return{id:t,internalId:r,organizationId:a,defaultAccesses:d,usersAccesses:e?.usersAccesses??{},groupsAccesses:e?.groupsAccesses??{},metadata:c,createdAt:n}}function wo(t,e){let o=ee(),r=Z(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 n={...r.metadata,...e.metadata};o.run("UPDATE rooms SET metadata = ? WHERE room_id = ?",[JSON.stringify(n),t])}if(e.usersAccesses!==void 0)for(let[n,a]of Object.entries(e.usersAccesses))a===null?o.run("DELETE FROM room_user_permissions WHERE room_id = ? AND user_id = ?",[t,n]):o.run(`INSERT INTO room_user_permissions (room_id, user_id, scopes) VALUES (?, ?, ?)
|
|
114
114
|
ON CONFLICT (room_id, user_id) DO UPDATE SET scopes = ?`,[t,n,JSON.stringify(a),JSON.stringify(a)]);if(e.groupsAccesses!==void 0)for(let[n,a]of Object.entries(e.groupsAccesses))a===null?o.run("DELETE FROM room_group_permissions WHERE room_id = ? AND group_id = ?",[t,n]):o.run(`INSERT INTO room_group_permissions (room_id, group_id, scopes) VALUES (?, ?, ?)
|
|
115
|
-
ON CONFLICT (room_id, group_id) DO UPDATE SET scopes = ?`,[t,n,JSON.stringify(a),JSON.stringify(a)]);return
|
|
115
|
+
ON CONFLICT (room_id, group_id) DO UPDATE SET scopes = ?`,[t,n,JSON.stringify(a),JSON.stringify(a)]);return Z(t)}}function Ao(t){ee().run("DELETE FROM rooms WHERE room_id = ?",[t])}function ut(t){let e=at(),o=rt(e,`${t}.sql`);if(!o.startsWith(rt(e)+"/"))throw new Error("Invalid internal ID");return o}var M=new To(t=>{let e=Z(t)??ct(t);nt(at(),{recursive:!0});let o=new ge(ut(e.internalId));return new yo(t,{storage:o})});function lt(){let t=So(ve(Oo(),"liveblocks-dev-"));return _e=ve(t,"data"),it=!0,t}function I(t){return Q(),Z(t)}function Ie(t,e){Q();let o=Z(t);if(o)return o;let r=ct(t,e);return M.getOrCreate(t),r}function mt(t){Q();let e=ee(),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 n=o.length>0?` WHERE ${o.join(" AND ")}`:"";return e.query(`SELECT room_id, internal_id, organization_id, default_permissions, metadata, created_at
|
|
116
116
|
FROM rooms
|
|
117
|
-
${n}`).all(...r).map(
|
|
118
|
-
`).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 Nt(...t){try{let e=["git","grep","-nF",...t.flatMap(n=>["-e",n]),"--","."],o=Bun.spawn(e,{stdout:"pipe",stderr:"pipe"}),r=await new Response(o.stdout).text();return await o.exited
|
|
119
|
-
`);for(let{match:c,check:l}of d)console.log(` ${
|
|
117
|
+
${n}`).all(...r).map(dt)}function pt(t,e){return Q(),wo(t,e)}async function ft(t){Q();let e=Z(t),o=M.get(t);if(o&&(o.endSessionBy(()=>!0,st.KICKED,"Deliberately disconnected"),o.unload(),o.driver.close(),M.delete(t)),e){let r=ut(e.internalId);try{await Bun.write(r,""),await Bun.file(r).unlink()}catch{}Ao(t)}}function U(t){return Q(),M.getOrCreate(t)}var xe=null;function gt(t){xe=t;for(let e of M.values())e.runInMaintenanceMode(()=>t).catch(()=>{});t.then(()=>{xe=null})}function ht(t){if(xe!==null)return!0;let e=M.get(t);return e!==void 0&&e.isInMaintenance}function ce(){let t=[];for(let[e,o]of M)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 Et(t,e){let o=M.get(t);return o?o.endSessionBy(r=>r.actor===e,st.KICKED,"Deliberately disconnected")>0:!1}function vt(){for(let t of M.values())t.unload();M.clear()}function ke(){for(let t of M.values())t.unload(),t.driver.close();M.clear(),X&&(X.close(),X=null),it&&Ro(_e,{recursive:!0,force:!0})}import{nanoid as ko,Permission as Po,tryParseJson as Tt}from"@liveblocks/core";import{array as St,constant as ue,enum_ as Do,number as Rt,object as Me,optional as De,record as jo,string as je,taggedUnion as Mo}from"decoders";import{inexact as xo,optional as _t,string as It}from"decoders";var te=xo({name:_t(It),avatar:_t(It)}).refineType();var Uo=Me({alg:ue("none")}),Bo=Me({k:ue("acc"),pid:ue("localdev"),uid:je,ui:De(te),perms:jo(St(Do(Po))),exp:Rt}),Fo=Me({k:ue("id"),pid:ue("localdev"),uid:je,ui:De(te),gids:De(St(je)),exp:Rt}),Jo=Mo("k",{acc:Bo,id:Fo});function yt(t){return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function bt(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),o=e+"=".repeat((4-e.length%4)%4);return atob(o)}function Ue(t){let e=Math.floor(Date.now()/1e3),o={...t,iat:e,exp:e+3600,jti:ko(12)},r=yt(JSON.stringify({alg:"none",typ:"JWT"})),n=yt(JSON.stringify(o));return`${r}.${n}.`}function Te(t){let e=t.split(".");if(e.length!==3)return null;let[o,r,n]=e;if(n!==""||!Uo.value(Tt(bt(o))))return null;let a=Jo.value(Tt(bt(r)));return!a||a.exp<Math.floor(Date.now()/1e3)?null:a}function $o(t,e){if(t.perms[e])return t.perms[e];for(let[o,r]of Object.entries(t.perms))if(o.endsWith("*")){let n=o.slice(0,-1);if(e.startsWith(n))return r}return[]}function Yo(t,e){let o=I(e);if(!o)return[];let r=(t.gids??[]).filter(n=>n in o.groupsAccesses).map(n=>o.groupsAccesses[n]);return Go({defaultAccesses:o.defaultAccesses,groupsAccesses:r,userAccesses:o.usersAccesses[t.uid]??[]})}function Vo(t,e){return t.k==="acc"?$o(t,e):Yo(t,e)}function Ct(t){let e=new URL(t.url),o=e.pathname==="/v7"?Lt.V7:e.pathname==="/v8"?Lt.V8:null;if(o===null)return{ok:!1};let r=e.searchParams.get("roomId");if(!r)return{ok:!1};let n=e.searchParams.get("tok");if(n!==null){let d=Te(n);if(!d)return{ok:!1};let c=Vo(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:[Ot.RoomWrite]}),{ok:!0,roomId:r,ticketData:{version:o,anonymousId:zo(),scopes:[Ot.RoomWrite]}}):{ok:!1}}function Ho(t){return t.trim().split(`
|
|
118
|
+
`).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 Nt(...t){try{let e=["git","grep","-nF",...t.flatMap(n=>["-e",n]),"--","."],o=Bun.spawn(e,{stdout:"pipe",stderr:"pipe"}),r=await new Response(o.stdout).text();return await o.exited,Ho(r)}catch{return[]}}function Ko(t){let e=t.trim();return e.startsWith("#")||e.startsWith("//")||e.startsWith("*")||e.startsWith("/*")}var Be=[{pattern:"<LiveblocksProvider",expected:"baseUrl=",fixSnippet:t=>`${Y("baseUrl")}=${B(`"${t}"`)}`,closePattern:">"},{pattern:"createClient(",expected:"baseUrl:",fixSnippet:t=>`${Y("baseUrl")}: ${B(`"${t}"`)}`,closePattern:")"},{pattern:"new Liveblocks(",expected:"baseUrl:",fixSnippet:t=>`${Y("baseUrl")}: ${B(`"${t}"`)}`,closePattern:")"}];async function wt(t){let e=Be.map(c=>c.pattern),o=[...new Set(Be.map(c=>c.expected))],[r,n]=await Promise.all([Nt(...e),Nt(...o)]);if(r.length===0)return[];let a=new Set(n.map(c=>c.file)),d=[];for(let c of r){if(Ko(c.text)||a.has(c.file))continue;let l=Be.find(R=>c.text.includes(R.pattern));l&&d.push({match:c,check:l})}if(d.length>0){console.log(),console.warn(W("\u26A0 Your project may not be configured for the local dev server.")),console.log(),console.log(` Missing baseUrl in the following location(s):
|
|
119
|
+
`);for(let{match:c,check:l}of d)console.log(` ${Ke(`${c.file}:${c.line}`)}`),console.log(` To fix, add ${l.fixSnippet(t)} to ${Y(l.pattern)}${Y(l.closePattern)}`),console.log();console.log(m(" \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(m(" \u2502 \u{1F4A1} ")+"Press "+x("p")+" to copy an AI fix prompt to your clipboard"+m(" \u2502")),console.log(m(" \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(m(" To skip this check, use --no-check")),console.log()}return d}var Xo={"<LiveblocksProvider":"baseUrl={...}","createClient(":"baseUrl: ...","new Liveblocks(":"baseUrl: ..."};function At(t,e){let o=t.map(({match:r,check:n})=>{let a=Xo[n.pattern]??"baseUrl: ...";return` - In \`${r.file}\` at line ${r.line}, add \`${a}\` to the \`${n.pattern}\` call`}).join(`
|
|
120
120
|
`);return`# Set up Liveblocks dev server
|
|
121
121
|
|
|
122
122
|
1. Check which system the application is using for environment variables, then
|
|
@@ -177,7 +177,7 @@ new Liveblocks({
|
|
|
177
177
|
|
|
178
178
|
Explain to the user that you've enabled the Liveblocks dev server by adding a an
|
|
179
179
|
environment variable to the application, and share which file it is in. Explain
|
|
180
|
-
that the user can disable this by setting it to "false".`}import{execSync as
|
|
180
|
+
that the user can disable this by setting it to "false".`}import{execSync as Wo}from"child_process";function xt(t){let e=process.platform==="darwin"?"pbcopy":process.platform==="win32"?"clip.exe":"xclip -selection clipboard";Wo(e,{input:t})}import qo from"bun";function kt(t,e){let{promise:o,resolve:r}=Promise.withResolvers();return qo.connect({hostname:e,port:t,socket:{data(){},open(n){n.end(),r(!0)},error(){r(!1)},connectError(){r(!1)}}}),o}function Fe(t,e=!1){t&&console.log((e?ie:W)(` \u26A0 ${t}`))}import{Permission as Qo}from"@liveblocks/core";import{ZenRouter as er}from"@liveblocks/zenrouter";import{array as Dt,enum_ as tr,object as jt,optional as Ge,record as or,string as ze}from"decoders";import{json as Zo}from"@liveblocks/zenrouter";import{json as Pt}from"@liveblocks/zenrouter";function Je(t,e,o){return Pt(t,e,{"X-LB-Warn":o})}function C(t,e,o="This is a dummy response."){return Je(t,e,o)}function s(t="This endpoint isn't implemented in the Liveblocks dev server."){return Pt({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 Zo({error:"Unauthorized",message:"Missing secret key"},401);if(e.startsWith("Bearer "))throw Je({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 rr=tr(Qo),le=new er({authorize:({req:t})=>ye(t)});le.route("POST /v2/authorize-user",jt({userId:ze,userInfo:Ge(te),permissions:or(Dt(rr))}),({body:t})=>({token:Ue({k:"acc",pid:"localdev",uid:t.userId,perms:t.permissions,ui:t.userInfo})}));le.route("POST /v2/identify-user",jt({userId:ze,userInfo:Ge(te),groupIds:Ge(Dt(ze))}),({body:t})=>({token:Ue({k:"id",pid:"localdev",uid:t.userId,ui:t.userInfo,gids:t.groupIds})}));import{ZenRouter as sr}from"@liveblocks/zenrouter";var u=new sr({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}});u.route("GET /v2/c/threads",()=>C({threads:[],inboxNotifications:[],subscriptions:[],meta:{nextCursor:null,requestedAt:new Date().toISOString(),permissionHints:{}}}));u.route("GET /v2/c/threads/delta",()=>C({threads:[],inboxNotifications:[],subscriptions:[],meta:{requestedAt:new Date().toISOString(),permissionHints:{}}}));u.route("GET /v2/c/inbox-notifications",()=>C({inboxNotifications:[],threads:[],subscriptions:[],groups:[],meta:{nextCursor:null,requestedAt:new Date().toISOString()}}));u.route("GET /v2/c/inbox-notifications/count",()=>C({count:0}));u.route("GET /v2/c/inbox-notifications/delta",()=>C({inboxNotifications:[],threads:[],subscriptions:[],groups:[],deletedInboxNotifications:[],deletedThreads:[],deletedSubscriptions:[],meta:{requestedAt:new Date().toISOString()}}));u.route("GET /v2/c/rooms/<roomId>/threads",()=>C({data:[],inboxNotifications:[],subscriptions:[],meta:{nextCursor:null,requestedAt:new Date().toISOString(),permissionHints:{}}}));u.route("GET /v2/c/rooms/<roomId>/threads/delta",()=>C({data:[],inboxNotifications:[],subscriptions:[],deletedThreads:[],deletedInboxNotifications:[],deletedSubscriptions:[],meta:{requestedAt:new Date().toISOString(),permissionHints:{}}}));u.route("POST /v2/c/rooms/<roomId>/text-metadata",()=>C({status:"ok"}));u.route("PUT /v2/c/rooms/<roomId>/attachments/<attachmentId>/upload/<name>",()=>s()),u.route("POST /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<name>",()=>s()),u.route("PUT /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>/<partNumber>",()=>s()),u.route("POST /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>/complete",()=>s()),u.route("DELETE /v2/c/rooms/<roomId>/attachments/<attachmentId>/multipart/<uploadId>",()=>s()),u.route("POST /v2/c/rooms/<roomId>/attachments/presigned-urls",()=>s()),u.route("POST /v2/c/rooms/<roomId>/send-message",()=>s()),u.route("GET /v2/c/rooms/<roomId>/storage",()=>s()),u.route("GET /v2/c/rooms/<roomId>/versions",()=>s()),u.route("GET /v2/c/rooms/<roomId>/versions/delta",()=>s()),u.route("GET /v2/c/rooms/<roomId>/versions/<versionId>/storage",()=>s()),u.route("GET /v2/c/rooms/<roomId>/versions/<versionId>/yjs",()=>s()),u.route("DELETE /v2/c/rooms/<roomId>/versions/<versionId>",()=>s()),u.alias("GET /v2/c/rooms/<roomId>/y-version/<versionId>","GET /v2/c/rooms/<roomId>/versions/<versionId>/yjs"),u.route("POST /v2/c/rooms/<roomId>/versions",()=>s()),u.alias("POST /v2/c/rooms/<roomId>/version","POST /v2/c/rooms/<roomId>/versions"),u.route("POST /v2/c/rooms/<roomId>/ai/contextual-prompt",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads/search",()=>s()),u.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/metadata",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/subscribe",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments",()=>s()),u.route("GET /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>s()),u.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),u.route("POST /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/reactions",()=>s()),u.route("DELETE /v2/c/rooms/<roomId>/threads/<threadId>/comments/<commentId>/reactions/<emoji>",()=>s()),u.route("GET /v2/c/rooms/<roomId>/threads/comments/search",()=>s()),u.route("GET /v2/c/rooms/<roomId>/threads/<threadId>/participants",()=>s()),u.route("GET /v2/c/rooms/<roomId>/subscription-settings",()=>s()),u.alias("GET /v2/c/rooms/<roomId>/notification-settings","GET /v2/c/rooms/<roomId>/subscription-settings"),u.route("POST /v2/c/rooms/<roomId>/subscription-settings",()=>s()),u.alias("POST /v2/c/rooms/<roomId>/notification-settings","POST /v2/c/rooms/<roomId>/subscription-settings"),u.route("DELETE /v2/c/inbox-notifications",()=>s()),u.route("POST /v2/c/inbox-notifications/read",()=>s()),u.route("DELETE /v2/c/inbox-notifications/<inboxNotificationId>",()=>s()),u.route("POST /v2/c/rooms/<roomId>/inbox-notifications/read",()=>s()),u.route("POST /v2/c/rooms/<roomId>/text-mentions",()=>s()),u.route("DELETE /v2/c/rooms/<roomId>/text-mentions/<mentionId>",()=>s()),u.route("GET /v2/c/notification-settings",()=>s()),u.route("POST /v2/c/notification-settings",()=>s()),u.route("GET /v2/c/rooms/<roomId>/thread-with-notification/<threadId>",()=>s()),u.route("GET /v2/c/urls/metadata",()=>s()),u.route("POST /v2/c/groups/find",()=>s());import{abort as Ut,html as ir,json as ar,ZenRouter as dr}from"@liveblocks/zenrouter";var Mt=`<!doctype html>
|
|
181
181
|
<html lang="en">
|
|
182
182
|
<head>
|
|
183
183
|
<meta charset="UTF-8" />
|
|
@@ -433,10 +433,10 @@ that the user can disable this by setting it to "false".`}import{execSync as Ho}
|
|
|
433
433
|
</main>
|
|
434
434
|
</body>
|
|
435
435
|
</html>
|
|
436
|
-
`;var re=new sr({authorize:()=>!0});re.route("GET /v7",()=>Ut(426));re.route("GET /v8",()=>Ut(426));re.route("GET /health",()=>rr({status:"ok"}));re.route("GET /",()=>or(Mt.replace("__VERSION__","1.6.0")));import{ServerMsgCode as cr}from"@liveblocks/core";import{QueryParser as ur}from"@liveblocks/query-parser";import{ConsoleTarget as zt,jsonObjectYolo as lr,Logger as $t,ROOT_YDOC_ID as Ye,snapshotToLossyJson_eager as mr,snapshotToNodeStream as pr,snapshotToPlainLson_eager as Yt,transientClientMsgDecoder as fr}from"@liveblocks/server";import{json as Re,ndjsonStream as gr,ZenRouter as hr}from"@liveblocks/zenrouter";import{array as V,constant as Er,either as vr,enum_ as _r,nullable as Gt,object as Se,optional as z,record as pe,string as k}from"decoders";function*nr(t){for(let e of t)for(let o of e)yield o}function Bt(...t){return nr(t)}import{Base64 as Ir}from"js-base64";import*as Oe from"yjs";import*as b from"yjs";function ir(t){return t.content instanceof b.ContentFormat||t.content instanceof b.ContentEmbed?"text":"arr"in t.content?"array":"str"in t.content?"text":"type"in t.content?"xml":"unknown"}function ar(t){let e=[],o=t;for(;o!==null;){if(!o.deleted)if(o.content instanceof b.ContentType)e.push(o.content.type.toJSON());else if(o.content instanceof b.ContentString)e.push(o.content.str);else if(o.content instanceof b.ContentFormat){let{key:r,value:n}=o.content;e.push({key:r,value:n})}else o.content instanceof b.ContentEmbed&&e.push(o.content.embed);o=o.right}return e}function Ft(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 n=ir(e._first);if(n==="text")return r?ar(e._first):t.getText(o).toJSON();if(n==="array")return t.getArray(o).toJSON();if(n==="xml")return t.getXmlFragment(o).toJSON()}return e.toJSON()}var dr={ytext:b.Text,yxmlfragment:b.XmlFragment,yxmltext:b.XmlText,ymap:b.Map,yarray:b.Array};function Jt(t,e="",o=!1,r=""){let n={};if(e.length){if(t.share.has(e)){if(r.length){let a=dr[r];if(a)return t.get(e,a).toJSON()}return{[e]:Ft(t,t.share.get(e),e,o)}}return{[e]:""}}for(let[a,d]of t.share)n[a]=Ft(t,d,a,o);return n}var Vt=(o=>(o.PlainLson="plain-lson",o.LossyJson="json",o))(Vt||{}),Tr=_r(Vt),Ht=pe(k,vr(k,V(k))),i=new hr({authorize:({req:t})=>be(t)});function R(t){return Re({error:"ROOM_NOT_FOUND",message:`Room with id "${t}" not found.`},404)}var yr=new ur({fields:{roomId:"string"},indexableFields:{metadata:"token"}});function br(t){let e=yr.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 Le(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}}i.route("GET /v2/rooms/<roomId>",({p:t})=>{let e=I(t.roomId);if(!e)throw R(t.roomId);return Le(e)});i.route("GET /v2/rooms",({url:t})=>{let e,o=t.searchParams.get("query");if(o)try{e=br(o)}catch(d){return Re({error:"INVALID_QUERY",message:d instanceof Error?d.message:String(d)},422)}else{let d={};for(let[c,l]of t.searchParams.entries())c.startsWith("metadata.")&&(d[c.slice(9)]=l);Object.keys(d).length>0&&(e={metadata:d})}let r=t.searchParams.get("organizationId")??void 0;return r&&(e={...e,organizationId:r}),{data:pt(e).map(Le),nextPage:null,nextCursor:null}});i.route("POST /v2/rooms",Se({id:k,organizationId:z(k),defaultAccesses:z(V(k)),metadata:z(Ht),usersAccesses:z(pe(k,V(k))),groupsAccesses:z(pe(k,V(k)))}),({body:t,url:e})=>{if(!e.searchParams.has("idempotent")&&I(t.id))return Re({error:"ROOM_ALREADY_EXISTS",message:`Room with id "${t.id}" already exists.`},409);let r=Te(t.id,{organizationId:t.organizationId,defaultAccesses:t.defaultAccesses,metadata:t.metadata,usersAccesses:t.usersAccesses,groupsAccesses:t.groupsAccesses});return Le(r)});i.route("POST /v2/rooms/<roomId>",Se({defaultAccesses:z(V(k)),metadata:z(Ht),usersAccesses:z(pe(k,Gt(V(k)))),groupsAccesses:z(pe(k,Gt(V(k))))}),({p:t,body:e})=>{let o=ft(t.roomId,{defaultAccesses:e.defaultAccesses,metadata:e.metadata,usersAccesses:e.usersAccesses,groupsAccesses:e.groupsAccesses});if(!o)throw R(t.roomId);return Le(o)});i.route("DELETE /v2/rooms/<roomId>",async({p:t})=>(await gt(t.roomId),new Response(null,{status:204})));i.route("GET /v2/rooms/<roomId>/storage",({url:t,p:e})=>{if(!I(e.roomId))throw R(e.roomId);let o=Tr.value(t.searchParams.get("format"))??"plain-lson",n=U(e.roomId).storage.driver.get_snapshot(!1),a=o==="json"?mr(n):Yt(n);return new Response(JSON.stringify(a),{status:200,headers:{"Content-Type":"application/json"}})});i.route("POST /v2/rooms/<roomId>/storage",Se({liveblocksType:Er("LiveObject"),data:lr}).refineType(),({p:t,body:e})=>{if(!I(t.roomId))throw R(t.roomId);let o=U(t.roomId),r=o.storage.driver.get_snapshot(!1),n=Yt(r);return Object.keys(n.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"}}):(o.driver.DANGEROUSLY_reset_nodes(e),o.unload(),new Response(JSON.stringify(e),{status:200,headers:{"Content-Type":"application/json"}}))});i.route("DELETE /v2/rooms/<roomId>/storage",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);let e=U(t.roomId),o={liveblocksType:"LiveObject",data:{}};return e.driver.DANGEROUSLY_reset_nodes(o),e.unload(),new Response(null,{status:204})});i.route("GET /v2/rooms/<roomId>/ydoc",({url:t,p:e})=>{if(!I(e.roomId))throw R(e.roomId);let o=U(e.roomId),r=t.searchParams.get("key")??"",n=t.searchParams.get("type")??"",a=t.searchParams.get("guid")??Ye,d=t.searchParams.get("formatting")!==null,c=new $t(new zt("warning")),l=o.yjsStorage.getYDoc(c,a),S=Jt(l,r,d,n);return new Response(JSON.stringify(S),{status:200,headers:{"Content-Type":"application/json"}})});i.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(!I(o.roomId))throw R(o.roomId);let r=U(o.roomId),n=await t.arrayBuffer(),a=Ir.fromUint8Array(new Uint8Array(n)),d=e.searchParams.get("guid"),l=e.searchParams.get("encoder")==="v2",S=d&&d!==Ye?d:void 0;try{let J=await r.mutex.runExclusive(()=>r.yjsStorage.addYDocUpdate({},a,S,l)),g=N=>{};return r.sendToAll({type:cr.UPDATE_YDOC,update:a,isSync:!1,stateVector:null,guid:S,v2:l,remoteSnapshotHash:J.snapshotHash},void 0,g),new Response(JSON.stringify({success:!0}),{status:200,headers:{"Content-Type":"application/json"}})}catch(J){return new Response(JSON.stringify({error:"UNPROCESSABLE_ENTITY",message:J instanceof Error?J.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"}})}});i.route("GET /v2/rooms/<roomId>/ydoc-binary",({url:t,p:e})=>{if(!I(e.roomId))throw R(e.roomId);let o=U(e.roomId),r=t.searchParams.get("guid")??Ye,n=t.searchParams.get("encoder"),a=new $t(new zt("warning")),d=o.yjsStorage.getYDoc(a,r),c=n==="v2"?Oe.encodeStateAsUpdateV2(d):Oe.encodeStateAsUpdate(d);return new Response(c,{status:200,headers:{"Content-Type":"application/octet-stream"}})});i.route("GET /v2/rooms/<roomId>/active_users",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);let o=U(t.roomId).listSessions().map(r=>({type:"user",connectionId:r.actor,id:r.user.id,info:r.user.info}));return Re({data:o})});i.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);return C({ok:!0})});i.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);return C({ok:!0})});i.route("GET /v2/rooms/<roomId>/feeds",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);return C({feeds:[{feedId:"123",metadata:{title:"Test Feed",description:"This is a test feed"},timestamp:new Date().getTime()}],nextCursor:null})});i.route("GET /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);return C({feedId:"123",timestamp:new Date().getTime(),metadata:{title:"Test Feed",description:"This is a test feed"}})});i.route("GET /v2/rooms/<roomId>/feeds/<feedId>/messages",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);return C({messages:[{messageId:"123",data:{content:"This is a test message"}}],nextCursor:null})});i.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);let e=Date.now();return C({feedId:t.feedId,createdAt:e,updatedAt:e,metadata:{title:"Test Feed",description:"This is a test feed"}})});i.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);let e=Date.now();return C({id:t.messageId,createdAt:e,updatedAt:e,data:{content:"This is a test message"}})});i.route("POST /v2/rooms/<roomId>/feeds",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);return C({feedId:"123",timestamp:new Date().getTime(),metadata:{title:"Test Feed",description:"This is a test feed"}})});i.route("POST /v2/rooms/<roomId>/feeds/<feedId>/messages",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);return C({id:"123",timestamp:new Date().getTime(),data:{content:"This is a test message"}})});i.route("POST /v2/rooms/<roomId>/request-storage-mutation",({p:t})=>{if(!I(t.roomId))throw R(t.roomId);let e=U(t.roomId),o=e.getNextActor(),r=e.storage.driver.get_snapshot(!1);return gr(Bt([{actor:o}],pr(r)))});i.route("POST /v2/rooms/<roomId>/send-message",Se({messages:V(fr)}),async({p:t,body:e})=>{if(!I(t.roomId))throw R(t.roomId);let o=U(t.roomId),[r,n]=o.createBackendSession_experimental();return await o.processClientMsgFromBackendSession(r,e.messages),new Response(`{"messages":[${n.join(",")}]}`,{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})});i.route("PATCH /v2/rooms/<roomId>/storage/json-patch",()=>s()),i.route("POST /v2/rooms/<roomId>/presence",()=>s()),i.route("GET /v2/rooms/<roomId>/threads",()=>s()),i.route("POST /v2/rooms/<roomId>/upsert",()=>s()),i.route("POST /v2/rooms/<roomId>/update-room-id",()=>s()),i.route("POST /v2/rooms/<roomId>/update-organization-id",()=>s()),i.route("GET /v2/rooms/<roomId>/prewarm",()=>s()),i.route("POST /v2/rooms/<roomId>/broadcast_event",()=>s()),i.route("GET /v2/rooms/<roomId>/versions",()=>s()),i.route("GET /v2/rooms/<roomId>/version/<version>",()=>s()),i.route("POST /v2/rooms/<roomId>/version",()=>s()),i.route("POST /v2/rooms/<roomId>/threads",()=>s()),i.route("GET /v2/rooms/<roomId>/threads/<threadId>",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/subscribe",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>s()),i.route("GET /v2/rooms/<roomId>/threads/<threadId>/subscriptions",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/metadata",()=>s()),i.route("DELETE /v2/rooms/<roomId>/threads/<threadId>",()=>s()),i.route("GET /v2/rooms/<roomId>/threads/<threadId>/participants",()=>s()),i.route("GET /v2/rooms/<roomId>/threads/<threadId>/inbox-notifications",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments",()=>s()),i.route("GET /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>s()),i.route("DELETE /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/add-reaction",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/remove-reaction",()=>s()),i.route("GET /v2/rooms/<roomId>/attachments/<attachmentId>",()=>s()),i.route("GET /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),i.route("GET /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),i.route("POST /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),i.route("POST /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),i.route("DELETE /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),i.route("DELETE /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),i.route("GET /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),i.route("DELETE /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),i.route("GET /v2/users/<userId>/inbox-notifications",()=>s()),i.route("DELETE /v2/users/<userId>/inbox-notifications",()=>s()),i.route("GET /v2/users/<userId>/notification-settings",()=>s()),i.route("POST /v2/users/<userId>/notification-settings",()=>s()),i.route("DELETE /v2/users/<userId>/notification-settings",()=>s()),i.route("GET /v2/users/<userId>/room-subscription-settings",()=>s()),i.route("POST /v2/inbox-notifications/trigger",()=>s()),i.route("POST /v2/inbox-notifications/<inboxNotificationId>/read",()=>s()),i.route("POST /v2/groups",()=>s()),i.route("GET /v2/groups/<groupId>",()=>s()),i.route("POST /v2/groups/<groupId>/add-members",()=>s()),i.route("POST /v2/groups/<groupId>/remove-members",()=>s()),i.route("DELETE /v2/groups/<groupId>",()=>s()),i.route("GET /v2/groups",()=>s()),i.route("GET /v2/users/<userId>/groups",()=>s()),i.route("GET /v2/ai/copilots",()=>s()),i.route("GET /v2/ai/copilots/<copilotId>",()=>s()),i.route("GET /v2/ai/copilots/<copilotId>/knowledge",()=>s()),i.route("GET /v2/ai/copilots/<copilotId>/knowledge/<knowledgeSourceId>",()=>s()),i.route("GET /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),i.route("GET /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>/links",()=>s()),i.route("POST /v2/ai/copilots",()=>s()),i.route("POST /v2/ai/copilots/<copilotId>",()=>s()),i.route("POST /v2/ai/copilots/<copilotId>/knowledge/web",()=>s()),i.route("DELETE /v2/ai/copilots/<copilotId>",()=>s()),i.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),i.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>",()=>s()),i.route("PUT /v2/ai/copilots/<copilotId>/knowledge/file/<fileName>",()=>s()),i.route("GET /v2/management/projects",()=>s()),i.route("GET /v2/management/projects/<projectId>",()=>s()),i.route("POST /v2/management/projects",()=>s()),i.route("POST /v2/management/projects/<projectId>",()=>s()),i.route("DELETE /v2/management/projects/<projectId>",()=>s()),i.route("GET /v2/management/projects/<projectId>/webhooks",()=>s()),i.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),i.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/delete-additional-headers",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/recover-failed-messages",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/secret/roll",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/test",()=>s()),i.route("DELETE /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),i.route("POST /v2/management/projects/<projectId>/api-keys/public/activate",()=>s()),i.route("POST /v2/management/projects/<projectId>/api-keys/public/deactivate",()=>s()),i.route("POST /v2/management/projects/<projectId>/api-keys/public/roll",()=>s()),i.route("POST /v2/management/projects/<projectId>/api-keys/secret/roll",()=>s());function Xt(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 se=new Sr;se.relay("/v2/authorize-user/*",me);se.relay("/v2/identify-user/*",me);se.relay("/v2/c/*",u);se.relay("/v2/*",i);se.relay("/*",re);var He=1153;function qt(t){if(t===void 0)return;let e=Number(t);return Number.isInteger(e)&&e>0&&e<=65535?e:void 0}function Lr(t){return process.platform==="win32"?[process.env.COMSPEC||"cmd.exe","/c",t]:["sh","-c",t]}function Cr(t){return"'"+t.replace(/'/g,"'\\''")+"'"}var Nr={description:"Start the local Liveblocks dev server",async run(t){let{options:e,args:o}=Xe(t,{port:{type:"string",short:"p",default:He.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 y=o.map(Cr).join(" ");e.cmd.includes("{}")?e.cmd=e.cmd.replaceAll("{}",y):e.cmd+=" "+y}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: ${He})`),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 n=e["random-port"]?0:qt(e.port)??qt(process.env.LIVEBLOCKS_DEVSERVER_PORT)??He,a=e.host||process.env.LIVEBLOCKS_DEVSERVER_HOST||"localhost",d=r?mt():null;n!==0&&await kt(n,a)&&(console.error(`Port ${n} is already in use.
|
|
437
|
-
Is another dev server already running?`),process.exit(1));let c,l=!1,
|
|
438
|
-
`);if(e.cmd){N(`Liveblocks dev server ${m("v1.6.
|
|
439
|
-
`),h.flush()};console.log=v,console.error=v;let O=1;try{let T=
|
|
436
|
+
`;var oe=new dr({authorize:()=>!0});oe.route("GET /v7",()=>Ut(426));oe.route("GET /v8",()=>Ut(426));oe.route("GET /health",()=>ar({status:"ok"}));oe.route("GET /",()=>ir(Mt.replace("__VERSION__","1.6.2")));import{ServerMsgCode as pr}from"@liveblocks/core";import{QueryParser as fr}from"@liveblocks/query-parser";import{ConsoleTarget as zt,jsonObjectYolo as gr,Logger as $t,ROOT_YDOC_ID as $e,snapshotToLossyJson_eager as hr,snapshotToNodeStream as Er,snapshotToPlainLson_eager as Yt,transientClientMsgDecoder as vr}from"@liveblocks/server";import{json as be,ndjsonStream as _r,ZenRouter as Ir}from"@liveblocks/zenrouter";import{array as V,constant as Tr,either as yr,enum_ as br,nullable as Gt,object as Se,optional as z,record as me,string as k}from"decoders";function*cr(t){for(let e of t)for(let o of e)yield o}function Bt(...t){return cr(t)}import{Base64 as Sr}from"js-base64";import*as Re from"yjs";import*as b from"yjs";function ur(t){return t.content instanceof b.ContentFormat||t.content instanceof b.ContentEmbed?"text":"arr"in t.content?"array":"str"in t.content?"text":"type"in t.content?"xml":"unknown"}function lr(t){let e=[],o=t;for(;o!==null;){if(!o.deleted)if(o.content instanceof b.ContentType)e.push(o.content.type.toJSON());else if(o.content instanceof b.ContentString)e.push(o.content.str);else if(o.content instanceof b.ContentFormat){let{key:r,value:n}=o.content;e.push({key:r,value:n})}else o.content instanceof b.ContentEmbed&&e.push(o.content.embed);o=o.right}return e}function Ft(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 n=ur(e._first);if(n==="text")return r?lr(e._first):t.getText(o).toJSON();if(n==="array")return t.getArray(o).toJSON();if(n==="xml")return t.getXmlFragment(o).toJSON()}return e.toJSON()}var mr={ytext:b.Text,yxmlfragment:b.XmlFragment,yxmltext:b.XmlText,ymap:b.Map,yarray:b.Array};function Jt(t,e="",o=!1,r=""){let n={};if(e.length){if(t.share.has(e)){if(r.length){let a=mr[r];if(a)return t.get(e,a).toJSON()}return{[e]:Ft(t,t.share.get(e),e,o)}}return{[e]:""}}for(let[a,d]of t.share)n[a]=Ft(t,d,a,o);return n}var Vt=(o=>(o.PlainLson="plain-lson",o.LossyJson="json",o))(Vt||{}),Rr=br(Vt),Ht=me(k,yr(k,V(k))),i=new Ir({authorize:({req:t})=>ye(t)});function S(t){return be({error:"ROOM_NOT_FOUND",message:`Room with id "${t}" not found.`},404)}var Or=new fr({fields:{roomId:"string"},indexableFields:{metadata:"token"}});function Lr(t){let e=Or.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 Oe(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}}i.route("GET /v2/rooms/<roomId>",({p:t})=>{let e=I(t.roomId);if(!e)throw S(t.roomId);return Oe(e)});i.route("GET /v2/rooms",({url:t})=>{let e,o=t.searchParams.get("query");if(o)try{e=Lr(o)}catch(d){return be({error:"INVALID_QUERY",message:d instanceof Error?d.message:String(d)},422)}else{let d={};for(let[c,l]of t.searchParams.entries())c.startsWith("metadata.")&&(d[c.slice(9)]=l);Object.keys(d).length>0&&(e={metadata:d})}let r=t.searchParams.get("organizationId")??void 0;return r&&(e={...e,organizationId:r}),{data:mt(e).map(Oe),nextPage:null,nextCursor:null}});i.route("POST /v2/rooms",Se({id:k,organizationId:z(k),defaultAccesses:z(V(k)),metadata:z(Ht),usersAccesses:z(me(k,V(k))),groupsAccesses:z(me(k,V(k)))}),({body:t,url:e})=>{if(!e.searchParams.has("idempotent")&&I(t.id))return be({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 Oe(r)});i.route("POST /v2/rooms/<roomId>",Se({defaultAccesses:z(V(k)),metadata:z(Ht),usersAccesses:z(me(k,Gt(V(k)))),groupsAccesses:z(me(k,Gt(V(k))))}),({p:t,body:e})=>{let o=pt(t.roomId,{defaultAccesses:e.defaultAccesses,metadata:e.metadata,usersAccesses:e.usersAccesses,groupsAccesses:e.groupsAccesses});if(!o)throw S(t.roomId);return Oe(o)});i.route("DELETE /v2/rooms/<roomId>",async({p:t})=>(await ft(t.roomId),new Response(null,{status:204})));i.route("GET /v2/rooms/<roomId>/storage",({url:t,p:e})=>{if(!I(e.roomId))throw S(e.roomId);let o=Rr.value(t.searchParams.get("format"))??"plain-lson",n=U(e.roomId).storage.driver.get_snapshot(!1),a=o==="json"?hr(n):Yt(n);return new Response(JSON.stringify(a),{status:200,headers:{"Content-Type":"application/json"}})});i.route("POST /v2/rooms/<roomId>/storage",Se({liveblocksType:Tr("LiveObject"),data:gr}).refineType(),({p:t,body:e})=>{if(!I(t.roomId))throw S(t.roomId);let o=U(t.roomId),r=o.storage.driver.get_snapshot(!1),n=Yt(r);return Object.keys(n.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"}}):(o.driver.DANGEROUSLY_reset_nodes(e),o.unload(),new Response(JSON.stringify(e),{status:200,headers:{"Content-Type":"application/json"}}))});i.route("DELETE /v2/rooms/<roomId>/storage",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);let e=U(t.roomId),o={liveblocksType:"LiveObject",data:{}};return e.driver.DANGEROUSLY_reset_nodes(o),e.unload(),new Response(null,{status:204})});i.route("GET /v2/rooms/<roomId>/ydoc",({url:t,p:e})=>{if(!I(e.roomId))throw S(e.roomId);let o=U(e.roomId),r=t.searchParams.get("key")??"",n=t.searchParams.get("type")??"",a=t.searchParams.get("guid")??$e,d=t.searchParams.get("formatting")!==null,c=new $t(new zt("warning")),l=o.yjsStorage.getYDoc(c,a),R=Jt(l,r,d,n);return new Response(JSON.stringify(R),{status:200,headers:{"Content-Type":"application/json"}})});i.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(!I(o.roomId))throw S(o.roomId);let r=U(o.roomId),n=await t.arrayBuffer(),a=Sr.fromUint8Array(new Uint8Array(n)),d=e.searchParams.get("guid"),l=e.searchParams.get("encoder")==="v2",R=d&&d!==$e?d:void 0;try{let J=await r.mutex.runExclusive(()=>r.yjsStorage.addYDocUpdate({},a,R,l)),g=N=>{};return r.sendToAll({type:pr.UPDATE_YDOC,update:a,isSync:!1,stateVector:null,guid:R,v2:l,remoteSnapshotHash:J.snapshotHash},void 0,g),new Response(JSON.stringify({success:!0}),{status:200,headers:{"Content-Type":"application/json"}})}catch(J){return new Response(JSON.stringify({error:"UNPROCESSABLE_ENTITY",message:J instanceof Error?J.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"}})}});i.route("GET /v2/rooms/<roomId>/ydoc-binary",({url:t,p:e})=>{if(!I(e.roomId))throw S(e.roomId);let o=U(e.roomId),r=t.searchParams.get("guid")??$e,n=t.searchParams.get("encoder"),a=new $t(new zt("warning")),d=o.yjsStorage.getYDoc(a,r),c=n==="v2"?Re.encodeStateAsUpdateV2(d):Re.encodeStateAsUpdate(d);return new Response(c,{status:200,headers:{"Content-Type":"application/octet-stream"}})});i.route("GET /v2/rooms/<roomId>/active-users",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);let o=U(t.roomId).listSessions().map(r=>({type:"user",connectionId:r.actor,id:r.user.id,info:r.user.info}));return be({data:o})});i.alias("GET /v2/rooms/<roomId>/active_users","GET /v2/rooms/<roomId>/active-users");i.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);return C({ok:!0})});i.route("DELETE /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);return C({ok:!0})});i.route("GET /v2/rooms/<roomId>/feeds",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);return C({feeds:[{feedId:"123",metadata:{title:"Test Feed",description:"This is a test feed"},timestamp:new Date().getTime()}],nextCursor:null})});i.route("GET /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);return C({feedId:"123",timestamp:new Date().getTime(),metadata:{title:"Test Feed",description:"This is a test feed"}})});i.route("GET /v2/rooms/<roomId>/feeds/<feedId>/messages",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);return C({messages:[{messageId:"123",data:{content:"This is a test message"}}],nextCursor:null})});i.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);let e=Date.now();return C({feedId:t.feedId,createdAt:e,updatedAt:e,metadata:{title:"Test Feed",description:"This is a test feed"}})});i.route("PATCH /v2/rooms/<roomId>/feeds/<feedId>/messages/<messageId>",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);let e=Date.now();return C({id:t.messageId,createdAt:e,updatedAt:e,data:{content:"This is a test message"}})});i.route("POST /v2/rooms/<roomId>/feeds",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);return C({feedId:"123",timestamp:new Date().getTime(),metadata:{title:"Test Feed",description:"This is a test feed"}})});i.route("POST /v2/rooms/<roomId>/feeds/<feedId>/messages",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);return C({id:"123",timestamp:new Date().getTime(),data:{content:"This is a test message"}})});i.route("POST /v2/rooms/<roomId>/request-storage-mutation",({p:t})=>{if(!I(t.roomId))throw S(t.roomId);let e=U(t.roomId),o=e.getNextActor(),r=e.storage.driver.get_snapshot(!1);return _r(Bt([{actor:o}],Er(r)))});i.route("POST /v2/rooms/<roomId>/send-message",Se({messages:V(vr)}),async({p:t,body:e})=>{if(!I(t.roomId))throw S(t.roomId);let o=U(t.roomId),[r,n]=o.createBackendSession_experimental();return await o.processClientMsgFromBackendSession(r,e.messages),new Response(`{"messages":[${n.join(",")}]}`,{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})});i.route("PATCH /v2/rooms/<roomId>/storage/json-patch",()=>s()),i.route("POST /v2/rooms/<roomId>/presence",()=>s()),i.route("GET /v2/rooms/<roomId>/threads",()=>s()),i.route("POST /v2/rooms/<roomId>/upsert",()=>s()),i.route("POST /v2/rooms/<roomId>/update-room-id",()=>s()),i.route("POST /v2/rooms/<roomId>/update-organization-id",()=>s()),i.route("GET /v2/rooms/<roomId>/prewarm",()=>s()),i.route("POST /v2/rooms/<roomId>/broadcast-event",()=>s()),i.alias("POST /v2/rooms/<roomId>/broadcast_event","POST /v2/rooms/<roomId>/broadcast-event"),i.route("GET /v2/rooms/<roomId>/versions",()=>s()),i.route("GET /v2/rooms/<roomId>/versions/<versionId>/yjs",()=>s()),i.route("DELETE /v2/rooms/<roomId>/versions/<versionId>",()=>s()),i.route("POST /v2/rooms/<roomId>/versions",()=>s()),i.route("POST /v2/rooms/<roomId>/threads",()=>s()),i.route("GET /v2/rooms/<roomId>/threads/<threadId>",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-resolved",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/mark-as-unresolved",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/subscribe",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/unsubscribe",()=>s()),i.route("GET /v2/rooms/<roomId>/threads/<threadId>/subscriptions",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/metadata",()=>s()),i.route("DELETE /v2/rooms/<roomId>/threads/<threadId>",()=>s()),i.route("GET /v2/rooms/<roomId>/threads/<threadId>/participants",()=>s()),i.route("GET /v2/rooms/<roomId>/threads/<threadId>/inbox-notifications",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments",()=>s()),i.route("GET /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/metadata",()=>s()),i.route("DELETE /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/add-reaction",()=>s()),i.route("POST /v2/rooms/<roomId>/threads/<threadId>/comments/<commentId>/remove-reaction",()=>s()),i.route("GET /v2/rooms/<roomId>/attachments/<attachmentId>",()=>s()),i.route("GET /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),i.route("GET /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),i.route("POST /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),i.route("POST /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),i.route("DELETE /v2/rooms/<roomId>/users/<userId>/notification-settings",()=>s()),i.route("DELETE /v2/rooms/<roomId>/users/<userId>/subscription-settings",()=>s()),i.route("GET /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),i.route("DELETE /v2/users/<userId>/inbox-notifications/<inboxNotificationId>",()=>s()),i.route("GET /v2/users/<userId>/inbox-notifications",()=>s()),i.route("DELETE /v2/users/<userId>/inbox-notifications",()=>s()),i.route("GET /v2/users/<userId>/notification-settings",()=>s()),i.route("POST /v2/users/<userId>/notification-settings",()=>s()),i.route("DELETE /v2/users/<userId>/notification-settings",()=>s()),i.route("GET /v2/users/<userId>/room-subscription-settings",()=>s()),i.route("POST /v2/inbox-notifications/trigger",()=>s()),i.route("POST /v2/inbox-notifications/<inboxNotificationId>/read",()=>s()),i.route("POST /v2/groups",()=>s()),i.route("GET /v2/groups/<groupId>",()=>s()),i.route("POST /v2/groups/<groupId>/add-members",()=>s()),i.route("POST /v2/groups/<groupId>/remove-members",()=>s()),i.route("DELETE /v2/groups/<groupId>",()=>s()),i.route("GET /v2/groups",()=>s()),i.route("GET /v2/users/<userId>/groups",()=>s()),i.route("GET /v2/ai/copilots",()=>s()),i.route("GET /v2/ai/copilots/<copilotId>",()=>s()),i.route("GET /v2/ai/copilots/<copilotId>/knowledge",()=>s()),i.route("GET /v2/ai/copilots/<copilotId>/knowledge/<knowledgeSourceId>",()=>s()),i.route("GET /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),i.route("GET /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>/links",()=>s()),i.route("POST /v2/ai/copilots",()=>s()),i.route("POST /v2/ai/copilots/<copilotId>",()=>s()),i.route("POST /v2/ai/copilots/<copilotId>/knowledge/web",()=>s()),i.route("DELETE /v2/ai/copilots/<copilotId>",()=>s()),i.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/file/<knowledgeSourceId>",()=>s()),i.route("DELETE /v2/ai/copilots/<copilotId>/knowledge/web/<knowledgeSourceId>",()=>s()),i.route("PUT /v2/ai/copilots/<copilotId>/knowledge/file/<fileName>",()=>s()),i.route("GET /v2/management/projects",()=>s()),i.route("GET /v2/management/projects/<projectId>",()=>s()),i.route("POST /v2/management/projects",()=>s()),i.route("POST /v2/management/projects/<projectId>",()=>s()),i.route("DELETE /v2/management/projects/<projectId>",()=>s()),i.route("GET /v2/management/projects/<projectId>/webhooks",()=>s()),i.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),i.route("GET /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/additional-headers",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/delete-additional-headers",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/recover-failed-messages",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/secret/roll",()=>s()),i.route("POST /v2/management/projects/<projectId>/webhooks/<webhookId>/test",()=>s()),i.route("DELETE /v2/management/projects/<projectId>/webhooks/<webhookId>",()=>s()),i.route("POST /v2/management/projects/<projectId>/api-keys/public/activate",()=>s()),i.route("POST /v2/management/projects/<projectId>/api-keys/public/deactivate",()=>s()),i.route("POST /v2/management/projects/<projectId>/api-keys/public/roll",()=>s()),i.route("POST /v2/management/projects/<projectId>/api-keys/secret/roll",()=>s());function Wt(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 re=new Nr;re.relay("/v2/authorize-user/*",le);re.relay("/v2/identify-user/*",le);re.relay("/v2/c/*",u);re.relay("/v2/*",i);re.relay("/*",oe);var Ve=1153;function qt(t){if(t===void 0)return;let e=Number(t);return Number.isInteger(e)&&e>0&&e<=65535?e:void 0}function Ar(t){return process.platform==="win32"?[process.env.COMSPEC||"cmd.exe","/c",t]:["sh","-c",t]}function xr(t){return"'"+t.replace(/'/g,"'\\''")+"'"}var kr={description:"Start the local Liveblocks dev server",async run(t){let{options:e,args:o}=Xe(t,{port:{type:"string",short:"p",default:Ve.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(ie("Extra arguments are only supported with --cmd (-c)")),process.exit(1)),o.length>0&&e.cmd){let y=o.map(xr).join(" ");e.cmd.includes("{}")?e.cmd=e.cmd.replaceAll("{}",y):e.cmd+=" "+y}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: ${Ve})`),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 n=e["random-port"]?0:qt(e.port)??qt(process.env.LIVEBLOCKS_DEVSERVER_PORT)??Ve,a=e.host||process.env.LIVEBLOCKS_DEVSERVER_HOST||"localhost",d=r?lt():null;n!==0&&await kt(n,a)&&(console.error(`Port ${n} is already in use.
|
|
437
|
+
Is another dev server already running?`),process.exit(1));let c,l=!1,R=n;function J(){let y=Ye.serve({hostname:a,port:R,async fetch(h,v){if(h.headers.get("Upgrade")==="websocket"){let F=Ct(h);if(!F.ok)return Fe(F.xwarn,!0),Wt(v,h,Xt.NOT_ALLOWED,"You have no access to this room");let{roomId:$,ticketData:L}=F;if(ht($))return Wt(v,h,Xt.TRY_AGAIN_LATER,"Server is undergoing maintenance, try again later");let w=U($),G=w.createTicket(L),pe=G.sessionKey;if(v.upgrade(h,{data:{room:w,ticket:G,sessionKey:pe}})){console.log(`${B("101")} WS ${new URL(h.url).pathname}${m(` - ${$}`)}`);return}return new Response("Could not upgrade to WebSocket",{status:426})}let O=new URL(h.url);if(h.method==="POST"&&O.pathname==="/crash")return console.log(`${B("204")} POST /crash`),setTimeout(()=>{g()},0),new Response(null,{status:204});let T=`${h.method} ${O.pathname}`,P;if(l)try{P=await h.clone().text()}catch{}let H=await re.fetch(h),j=H.status,se=j>=500?ie(j):j>=400?W(j):B(j);console.log(`${se} ${T}`);let _=H.headers.get("X-LB-Warn")??void 0;if(Fe(_,!H.ok),l){if(P){let L=Kt(P);L!==void 0&&console.log(m(` \u2192 ${JSON.stringify(L)}`))}let F=await H.clone().text(),$=Kt(F);$!==void 0&&console.log(m(` \u2190 ${JSON.stringify($)}`))}return H},error(h){return console.error(h),new Response("An unknown error occurred",{status:500})},websocket:{open(h){let{refuseConnection:v,room:O,ticket:T}=h.data;if(v){h.close(v.code,v.message);return}O&&T&&O.startBrowserSession(T,h)},async message(h,v){let{room:O,sessionKey:T}=h.data;O&&T&&await O.handleData(T,v)},close(h,v,O){let{room:T,sessionKey:P}=h.data;T&&P&&T.endBrowserSession(P,v,O)}}});return R=y.port,y}c=J();async function g(){vt(),await c.stop(!0),c=J(),console.log("Crash \u{1F4A5}")}let N=y=>process.stderr.write(y+`
|
|
438
|
+
`);if(e.cmd){N(`Liveblocks dev server ${m("v1.6.2")} running at http://${c.hostname}:${c.port}`),d&&e.verbose&&N(m(`Ephemeral mode, using ${d}`));let y=wr(d,"server.log");N(m(`Server logs: ${y}`));let h=Ye.file(y).writer(),v=(...T)=>{h.write(T.map(String).join(" ")+`
|
|
439
|
+
`),h.flush()};console.log=v,console.error=v;let O=1;try{let T=Ye.spawn(Ar(e.cmd),{stdin:"inherit",stdout:"inherit",stderr:"inherit",env:{...process.env,LIVEBLOCKS_DEV_SERVER_HOST:a,LIVEBLOCKS_DEV_SERVER_PORT:String(c.port)}}),P=()=>{T.kill()};process.on("SIGTERM",P),process.on("SIGINT",P),O=await T.exited}finally{h.end(),await c.stop(),ke(),N(m("Liveblocks dev server shut down"))}process.exit(O)}else{let y=`http://${a}:${c.port}`,h=e["no-check"]?[]:await wt(y),v="logs",O=null,T=null,P=null,H=`http://${c.hostname}:${c.port}`,j=()=>{let E=v==="logs"?x(" Logs "):m(" Logs "),f=v==="sockets"?x(" Sockets "):m(" Sockets "),p=E+m("|")+f,ne=(T?Y("\u23F8 maintenance")+" ":"")+m(`Liveblocks running at ${H}`),Le=process.stdout.columns??80,Ce=Math.max(1,Le-Ne(p).length-Ne(ne).length);return p+" ".repeat(Ce)+ne},se=[],_=console.log.bind(console);console.log=(...E)=>{let f=E.map(String).join(" ");se.push(f),v==="logs"&&_(f)};let F=()=>m(" ")+x("q")+m(" quit, ")+x("!")+m(" crash, ")+x("c")+m(" clear, ")+x("v")+m(l?" verbose (on)":" verbose"),$=()=>{P&&(clearInterval(P),P=null),v="logs",process.stdout.write("\x1B[2J\x1B[H"),_(j()),_(F()),_();for(let E of se)_(E)},L=0,w=[],G=E=>`${E.roomId}:${E.actor}`,pe=()=>{w=ce().map(E=>({...E,alive:!0}))},He=()=>{let E=new Set(ce().map(G));for(let p of w)p.alive=E.has(G(p));let f=new Set(w.map(G));for(let p of ce())f.has(G(p))||w.push({...p,alive:!0})},Zt=E=>{let f=Date.now()-E,p=Math.floor(f/1e3);if(p<60)return`${p}s`;let D=Math.floor(p/60);return D<60?`${D}m`:`${Math.floor(D/60)}h`},Qt=E=>{if(!E)return"";let f=Date.now()-E;return f<1e3?" "+B("\u25CF"):f<3e3?" "+m(B("\u25CF")):f<5e3?" "+m("\u25CF"):""},fe=(E,f)=>{let p=E+f;for(;p>=0&&p<w.length;){if(w[p].alive)return p;p+=f}return E},K=()=>{He();let E=w.filter(p=>p.alive).length;if(process.stdout.write("\x1B[2J\x1B[H"),_(j()),_(m(" ")+x("\u2191\u2193")+m(" navigate, ")+x("k")+m(" kill, ")+x("m")+m(T?" maintenance off, ":" maintenance on, ")+x("r")+m(" refresh")),_(),_(" "+x("Connections")+m(` (${E} alive)`)),_(),w.length===0){_(m(" No active connections"));return}if(L>=w.length&&(L=w.length-1),!w[L]?.alive){let p=fe(L,-1);L=w[p]?.alive?p:fe(L,1)}let f=new Map;for(let p of ce())f.set(G(p),p.lastActiveAt);for(let p=0;p<w.length;p++){let D=w[p];if(!D.alive){_(m(` ${D.roomId} \xB7 actor=${D.actor} \xB7 disconnected`));continue}let ne=p===L?B("\u25B6 "):" ",Le=D.userId??m("anonymous"),Ce=Zt(D.connectedAt),oo=f.get(G(D)),ro=Qt(oo);_(`${ne}${x(D.roomId)} ${m("\xB7")} actor=${D.actor} ${m("\xB7")} ${Le} ${m("\xB7")} ${m(Ce)}${ro}`)}},eo=()=>{v="sockets",L=0,pe(),K(),P=setInterval(()=>K(),1e3)},to=()=>{if(T)T(),T=null;else{let{promise:E,resolve:f}=Cr();gt(E),T=f}};process.stdout.write("\x1B[2J\x1B[H"),_(j()),_(F()),_(),d&&e.verbose&&console.log(m(`Ephemeral mode, using ${d}`)),process.stdin.setRawMode?.(!0),process.stdin.resume(),process.stdin.on("data",E=>{let f=E.toString();if(f===""||f==="q"){c.stop(!0).then(()=>{ke(),process.exit(0)});return}if(f==="m"){to(),v==="sockets"?K():(process.stdout.write("\x1B[s\x1B[H\x1B[2K"),_(j()),process.stdout.write("\x1B[u"));return}if((f==="s"||f==="\x1B[C")&&v!=="sockets"){eo();return}if((f==="l"||f==="\x1B[D")&&v!=="logs"){$();return}if(v==="sockets"){if(f==="\x1B[A")L=fe(L,-1),K();else if(f==="\x1B[B")L=fe(L,1),K();else if(f==="k"){let p=w[L];p?.alive&&(Et(p.roomId,p.actor),K())}else f==="r"&&(pe(),L=0,K());return}if(f==="!")O!==null?(clearTimeout(O),O=null,g()):(console.log("Simulating crash in 2.5s... (press ! again to crash now)"),O=setTimeout(()=>{O=null,g()},2500));else if(f==="c")se.length=0,process.stdout.write("\x1B[2J\x1B[H"),_(j()),_(F()),_();else if(f==="v")l=!l,process.stdout.write("\x1B[s\x1B[H\x1B[2K"),_(j()),process.stdout.write("\x1B[2K"),_(F()),process.stdout.write("\x1B[u"),console.log(m(l?"Verbose mode on":"Verbose mode off"));else if(f==="p")if(h.length>0){let p=At(h,y);xt(p),console.log(m("Copied AI fix prompt to clipboard"))}else console.log(m("No setup issues detected"))})}}},rn=kr;export{rn as default};
|
|
440
440
|
/*! Bundled license information:
|
|
441
441
|
|
|
442
442
|
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-B57Q2E6J.js")).default;case"upgrade":return(await import("./upgrade-VZMDFFEW.js")).default;default:return}}var m={dev:"Start the local Liveblocks dev server",upgrade:"Upgrade all Liveblocks packages"};function f(){console.log("liveblocks v1.6.2"),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.6.2"),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();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as k}from"./chunk-ZFPKG3IB.js";import{cmpSemver as b}from"@liveblocks/server";import{execFileSync as d}from"child_process";import{existsSync as c,readFileSync as h}from"fs";import{resolve as r}from"path";function g(e){return Object.keys(e??{}).filter(o=>o.startsWith("@liveblocks/"))}function y(e){if(typeof e=="string")return e;if(Array.isArray(e)&&e.length>0)return e.reduce((o,s)=>b(o,s)>=0?o:s);throw new Error("No versions found")}function S(e){try{let o=d("npm",["view",`@liveblocks/core@${e}`,"version","--json"],{encoding:"utf-8"}).trim();return y(JSON.parse(o))}catch{console.error(`Could not resolve version "${e}" from npm registry.`),process.exit(1)}}function w(){let e=process.cwd();return c(r(e,"yarn.lock"))?"yarn":c(r(e,"pnpm-lock.yaml"))?"pnpm":c(r(e,"bun.lockb"))||c(r(e,"bun.lock"))?"bun":"npm"}var x={description:"Upgrade all Liveblocks packages",run(e){let{options:o,args:s}=k(e,{help:{type:"boolean",short:"h",default:!1}},{allowPositionals:!0});if(o.help){console.log("Usage: liveblocks upgrade [version]"),console.log(),console.log("Upgrade all @liveblocks/* packages in your project to the same version."),console.log(),console.log("Arguments:"),console.log(' version Target version or tag (default: "latest")'),console.log(),console.log("Options:"),console.log(" --help, -h Show this help message");return}let m=S(String(s[0]??"latest")),v=r(process.cwd(),"package.json"),t;try{t=JSON.parse(h(v,"utf-8"))}catch{console.error("No package.json found in the current directory."),process.exit(1)}let i=Array.from(new Set([...g(t.dependencies),...g(t.devDependencies),...g(t.peerDependencies)]));i.length===0&&(console.error("No @liveblocks/* packages found in package.json."),process.exit(1));let u=i.map(n=>n==="@liveblocks/react-comments"?"@liveblocks/react-ui":n),f=i.filter(n=>n==="@liveblocks/react-comments"),l=w(),a,p;switch(l){case"yarn":case"bun":case"pnpm":a="add",p="remove";break;default:a="install",p="uninstall";break}console.log(`Upgrading all your Liveblocks dependencies to ${m}`),f.length>0&&d(l,[p,...f],{stdio:"inherit"}),u.length>0&&d(l,[a,...u.map(n=>`${n}@${m}`)],{stdio:"inherit"}),i.includes("@liveblocks/core")&&(console.log(),console.warn("Warning: @liveblocks/core contains private APIs only. It is recommended to only rely on @liveblocks/client."),console.log())}},O=x;export{O as default,y as highestVersion};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "liveblocks",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.2",
|
|
4
4
|
"description": "Liveblocks command line interface",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -36,13 +36,13 @@
|
|
|
36
36
|
"@liveblocks/eslint-config": "0.0.1"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@liveblocks/core": "
|
|
40
|
-
"@liveblocks/zenrouter": "^1.0
|
|
39
|
+
"@liveblocks/core": "v3.21.0-private3",
|
|
40
|
+
"@liveblocks/zenrouter": "^1.2.0",
|
|
41
41
|
"decoders": "^2.9.0",
|
|
42
42
|
"js-base64": "^3.7.5",
|
|
43
43
|
"yjs": "^13.6.10",
|
|
44
|
-
"@liveblocks/
|
|
45
|
-
"@liveblocks/
|
|
44
|
+
"@liveblocks/query-parser": "^0.1.1",
|
|
45
|
+
"@liveblocks/server": "^1.6.2"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
48
|
"build": "tsup",
|
package/dist/upgrade-QCUVOTDV.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{i as v}from"./chunk-ZFPKG3IB.js";import{execFileSync as k}from"child_process";import{existsSync as p,readFileSync as b}from"fs";import{resolve as a}from"path";function f(e){return Object.keys(e??{}).filter(n=>n.startsWith("@liveblocks/"))}function h(e,n){let[i,s]=e.split("-",2),[g,o]=n.split("-",2),t=i.split(".").map(Number),l=g.split(".").map(Number);for(let r=0;r<3;r++)if(t[r]!==l[r])return t[r]-l[r];return!s&&o?1:s&&!o?-1:s&&o?s<o?-1:s>o?1:0:0}function y(e){if(typeof e=="string")return e;if(Array.isArray(e)&&e.length>0)return e.reduce((n,i)=>h(n,i)>=0?n:i);throw new Error("No versions found")}function S(e){try{let n=k("npm",["view",`@liveblocks/core@${e}`,"version","--json"],{encoding:"utf-8"}).trim();return y(JSON.parse(n))}catch{console.error(`Could not resolve version "${e}" from npm registry.`),process.exit(1)}}function w(){let e=process.cwd();return p(a(e,"yarn.lock"))?"yarn":p(a(e,"pnpm-lock.yaml"))?"pnpm":p(a(e,"bun.lockb"))||p(a(e,"bun.lock"))?"bun":"npm"}var A={description:"Upgrade all Liveblocks packages",run(e){let{options:n,args:i}=v(e,{help:{type:"boolean",short:"h",default:!1}},{allowPositionals:!0});if(n.help){console.log("Usage: liveblocks upgrade [version]"),console.log(),console.log("Upgrade all @liveblocks/* packages in your project to the same version."),console.log(),console.log("Arguments:"),console.log(' version Target version or tag (default: "latest")'),console.log(),console.log("Options:"),console.log(" --help, -h Show this help message");return}let s=S(String(i[0]??"latest")),g=a(process.cwd(),"package.json"),o;try{o=JSON.parse(b(g,"utf-8"))}catch{console.error("No package.json found in the current directory."),process.exit(1)}let t=Array.from(new Set([...f(o.dependencies),...f(o.devDependencies),...f(o.peerDependencies)]));t.length===0&&(console.error("No @liveblocks/* packages found in package.json."),process.exit(1));let l=t.map(c=>c==="@liveblocks/react-comments"?"@liveblocks/react-ui":c),r=t.filter(c=>c==="@liveblocks/react-comments"),d=w(),m,u;switch(d){case"yarn":case"bun":case"pnpm":m="add",u="remove";break;default:m="install",u="uninstall";break}console.log(`Upgrading all your Liveblocks dependencies to ${s}`),r.length>0&&k(d,[u,...r],{stdio:"inherit"}),l.length>0&&k(d,[m,...l.map(c=>`${c}@${s}`)],{stdio:"inherit"}),t.includes("@liveblocks/core")&&(console.log(),console.warn("Warning: @liveblocks/core contains private APIs only. It is recommended to only rely on @liveblocks/client."),console.log())}},C=A;export{h as cmpSemver,C as default,y as highestVersion};
|