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 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"./chunk-ZFPKG3IB.js";import{Promise_withResolvers as Rr,tryParseJson as Kt,WebsocketCloseCodes as Wt}from"@liveblocks/core";import{ZenRelay as Sr}from"@liveblocks/zenrouter";import Ve from"bun";import{join as Or}from"path";import{nanoid as Fo}from"@liveblocks/core";import{ProtocolVersion as Lt}from"@liveblocks/server";import{nanoid as _o,WebsocketCloseCodes as nt}from"@liveblocks/core";import{DefaultMap as Io,Room as To}from"@liveblocks/server";import{Database as yo}from"bun:sqlite";import{mkdirSync as it,mkdtempSync as bo,rmSync as Ro}from"fs";import{tmpdir as So}from"os";import{dirname as Oo,join as _e,resolve as st}from"path";import{asPos as Ze,CrdtType as x,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 de(t){try{return t!==void 0?JSON.parse(t):void 0}catch{return}}function xe(t){return JSON.parse(t)}function Qe(t){let{type:e,parent_id:o,parent_key:r,jdata:n}=t;switch(e){case x.OBJECT:return o===null?{type:e,data:xe(n)}:{type:e,parentId:o,parentKey:r,data:xe(n)};case x.REGISTER:return{type:e,parentId:o,parentKey:r,data:xe(n)};case x.LIST:case x.MAP:return{type:e,parentId:o,parentKey:r};default:so("Unhandled case")}}function et(t){return[t.id,Qe(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)
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 = ${x.REGISTER} AND p.type = ${x.OBJECT})
6
+ (c.type = ${A.REGISTER} AND p.type = ${A.OBJECT})
7
7
  OR
8
- p.type = ${x.REGISTER}`).all();for(let{id:o}of e)ve(t,o)}function mo(t){let e=t.query(`SELECT p.id, c.parent_key AS key
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 = ${x.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 tt(t,e){return t?.type===x.OBJECT&&Object.prototype.hasOwnProperty.call(t.data,e)&&t.data[e]!==void 0}function Z(t,e){let o=t.query("SELECT id, type, parent_id, parent_key, jdata FROM nodes WHERE id = ?").get(e);return o?Qe(o):void 0}function qe(t){return t.query("SELECT id, type, parent_id, parent_key, jdata FROM nodes").all().map(et)}function po(t){return t.query(`SELECT
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 ce(t,e,o){return t.query("SELECT id FROM nodes WHERE parent_id = ? AND parent_key = ?").get(e,o)?.id}function ot(t,e,o){return ce(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?Ze(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?Ze(o.parent_key):void 0}function Ee(t,e,o){let r=e==="root"?null:o.parentId??null,n=e==="root"?null:o.parentKey??null,a=o.type===x.OBJECT||o.type===x.REGISTER?JSON.stringify(o.data):null;t.query(`INSERT INTO nodes (id, type, parent_id, parent_key, jdata)
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 ve(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 rt(t,e,o){let r=Z(t,e);tt(r,o)&&(delete r.data[o],Ee(t,e,r));let n=ce(t,e,o);n!==void 0&&ve(t,n)}function ho(t,e,o,r=!1){let n=Z(t,o.parentId);if(n===void 0)throw new Error(`No such parent ${Ae(o.parentId)}`);if(o.type===x.REGISTER&&n.type===x.OBJECT)throw new Error("Cannot add register under object");let a=ce(t,o.parentId,o.parentKey);if(a!==e){let d=tt(n,o.parentKey);if(a!==void 0||d)if(r)rt(t,o.parentId,o.parentKey);else throw new Error(`Key ${Ae(o.parentKey)} already exists`)}Ee(t,e,o)}function Eo(t,e,o){let r=Z(t,e);if(r?.parentId===void 0)return;if(ot(t,r.parentId,o))throw new Error(`Pos ${Ae(o)} already taken`);let n={...r,parentKey:o};Ee(t,e,n)}function vo(t,e,o,r=!1){let n=Z(t,e);if(n?.type!==x.OBJECT)return;let a=!1;for(let[d,c]of Object.entries(o)){if(d==="__proto__")continue;let l=ce(t,e,d);if(l!==void 0)if(r)ve(t,l);else throw new Error(`Child node already exists under ${d}`);n.data[d]!==c&&(n.data[d]=c,a=!0)}a&&Ee(t,e,n)}var he=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 (
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=>Z(e,r),iter_nodes:()=>qe(e),iter_nodes_optimized:()=>po(e),has_node:r=>Z(e,r)!==void 0,get_child_at:(r,n)=>ce(e,r,n),has_child_at:(r,n)=>ot(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=>ve(e,r),delete_child_key:(r,n)=>rt(e,r,n),set_object_data:(r,n,a)=>vo(e,r,n,a),get_snapshot(r){return no(qe(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===x.OBJECT||a.type===x.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(et)}get_meta(e){let r=this.db.query("SELECT jval FROM metadata WHERE key = ?").get(e)?.jval;if(r!==void 0)return de(r)??null}put_meta(e,o){let r=JSON.stringify(o);this.db.run(`INSERT INTO metadata (key, jval)
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:de(o.jpresence)??null,updatedAt:o.updated_at,info:de(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:de(o.jpresence)??null,updatedAt:o.updated_at,info:de(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)
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),S;if(l.length>o){l.pop();let g=l[l.length-1];if(g){let N=[g.feed_id,g.created_at];S=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:S}}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),S;if(l.length>r){l.pop();let g=l[l.length-1];if(g){let N=[g.message_id,g.created_at];S=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:S}}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 Lo=".liveblocks/v2",Ie=Lo,at=!1,W=null;function dt(){return _e(Ie,"rooms")}function ee(){if(W)return;let t=_e(Ie,"db.sql");it(Oo(t),{recursive:!0});let e=new yo(t,{create:!0});e.run("PRAGMA journal_mode = WAL"),e.run("PRAGMA foreign_keys = ON"),e.run(`CREATE TABLE IF NOT EXISTS rooms (
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`),W=e}function te(){if(!W)throw new Error("Rooms DB not initialized");return W}function ct(t){let e=te(),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 Q(t){let e=te().query("SELECT room_id, internal_id, organization_id, default_permissions, metadata, created_at FROM rooms WHERE room_id = ?").get(t);if(e)return ct(e)}var Co="default";function ut(t,e){let o=te(),r=_o(),n=new Date().toISOString(),a=e?.organizationId??Co,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),n]),e?.usersAccesses)for(let[l,S]of Object.entries(e.usersAccesses))o.run("INSERT INTO room_user_permissions (room_id, user_id, scopes) VALUES (?, ?, ?)",[t,l,JSON.stringify(S)]);if(e?.groupsAccesses)for(let[l,S]of Object.entries(e.groupsAccesses))o.run("INSERT INTO room_group_permissions (room_id, group_id, scopes) VALUES (?, ?, ?)",[t,l,JSON.stringify(S)]);return{id:t,internalId:r,organizationId:a,defaultAccesses:d,usersAccesses:e?.usersAccesses??{},groupsAccesses:e?.groupsAccesses??{},metadata:c,createdAt:n}}function No(t,e){let o=te(),r=Q(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 (?, ?, ?)
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 Q(t)}}function wo(t){te().run("DELETE FROM rooms WHERE room_id = ?",[t])}function lt(t){let e=dt(),o=st(e,`${t}.sql`);if(!o.startsWith(st(e)+"/"))throw new Error("Invalid internal ID");return o}var M=new Io(t=>{let e=Q(t)??ut(t);it(dt(),{recursive:!0});let o=new he(lt(e.internalId));return new To(t,{storage:o})});function mt(){let t=bo(_e(So(),"liveblocks-dev-"));return Ie=_e(t,"data"),at=!0,t}function I(t){return ee(),Q(t)}function Te(t,e){ee();let o=Q(t);if(o)return o;let r=ut(t,e);return M.getOrCreate(t),r}function pt(t){ee();let e=te(),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
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(ct)}function ft(t,e){return ee(),No(t,e)}async function gt(t){ee();let e=Q(t),o=M.get(t);if(o&&(o.endSessionBy(()=>!0,nt.KICKED,"Deliberately disconnected"),o.unload(),o.driver.close(),M.delete(t)),e){let r=lt(e.internalId);try{await Bun.write(r,""),await Bun.file(r).unlink()}catch{}wo(t)}}function U(t){return ee(),M.getOrCreate(t)}var ke=null;function ht(t){ke=t;for(let e of M.values())e.runInMaintenanceMode(()=>t).catch(()=>{});t.then(()=>{ke=null})}function Et(t){if(ke!==null)return!0;let e=M.get(t);return e!==void 0&&e.isInMaintenance}function ue(){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 vt(t,e){let o=M.get(t);return o?o.endSessionBy(r=>r.actor===e,nt.KICKED,"Deliberately disconnected")>0:!1}function _t(){for(let t of M.values())t.unload();M.clear()}function Pe(){for(let t of M.values())t.unload(),t.driver.close();M.clear(),W&&(W.close(),W=null),at&&Ro(Ie,{recursive:!0,force:!0})}import{nanoid as Ao,tryParseJson as yt}from"@liveblocks/core";import{array as St,constant as le,enum_ as ko,number as Ot,object as Ue,optional as je,record as Po,string as Me,taggedUnion as Do}from"decoders";import{inexact as xo,optional as It,string as Tt}from"decoders";var oe=xo({name:It(Tt),avatar:It(Tt)}).refineType();var X={RoomRead:"room:read",RoomWrite:"room:write",CommentsWrite:"comments:write",FeedsWrite:"feeds:write",RoomPresenceWrite:"room:presence:write",CommentsRead:"comments:read"};var jo=Ue({alg:le("none")}),Mo=Ue({k:le("acc"),pid:le("localdev"),uid:Me,ui:je(oe),perms:Po(St(ko(X))),exp:Ot}),Uo=Ue({k:le("id"),pid:le("localdev"),uid:Me,ui:je(oe),gids:je(St(Me)),exp:Ot}),Bo=Do("k",{acc:Mo,id:Uo});function bt(t){return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Rt(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),o=e+"=".repeat((4-e.length%4)%4);return atob(o)}function Be(t){let e=Math.floor(Date.now()/1e3),o={...t,iat:e,exp:e+3600,jti:Ao(12)},r=bt(JSON.stringify({alg:"none",typ:"JWT"})),n=bt(JSON.stringify(o));return`${r}.${n}.`}function ye(t){let e=t.split(".");if(e.length!==3)return null;let[o,r,n]=e;if(n!==""||!jo.value(yt(Rt(o))))return null;let a=Bo.value(yt(Rt(r)));return!a||a.exp<Math.floor(Date.now()/1e3)?null:a}function Jo(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 Go(t,e){let o=I(e);if(!o)return[];let r=new Set(o.defaultAccesses);if(t.gids)for(let n of t.gids)for(let a of o.groupsAccesses[n]??[])r.add(a);for(let n of o.usersAccesses[t.uid]??[])r.add(n);return Array.from(r)}function zo(t,e){return t.k==="acc"?Jo(t,e):Go(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=ye(n);if(!d)return{ok:!1};let c=zo(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"}:(Te(r,{defaultAccesses:[X.RoomWrite]}),{ok:!0,roomId:r,ticketData:{version:o,anonymousId:Fo(),scopes:[X.RoomWrite]}}):{ok:!1}}function $o(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,$o(r)}catch{return[]}}function Yo(t){let e=t.trim();return e.startsWith("#")||e.startsWith("//")||e.startsWith("*")||e.startsWith("/*")}var Fe=[{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=Fe.map(c=>c.pattern),o=[...new Set(Fe.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(Yo(c.text)||a.has(c.file))continue;let l=Fe.find(S=>c.text.includes(S.pattern));l&&d.push({match:c,check:l})}if(d.length>0){console.log(),console.warn(q("\u26A0 Your project may not be configured for the local dev server.")),console.log(),console.log(` Missing baseUrl in the following location(s):
119
- `);for(let{match:c,check:l}of d)console.log(` ${We(`${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 "+A("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 Vo={"<LiveblocksProvider":"baseUrl={...}","createClient(":"baseUrl: ...","new Liveblocks(":"baseUrl: ..."};function xt(t,e){let o=t.map(({match:r,check:n})=>{let a=Vo[n.pattern]??"baseUrl: ...";return` - In \`${r.file}\` at line ${r.line}, add \`${a}\` to the \`${n.pattern}\` call`}).join(`
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 Ho}from"child_process";function At(t){let e=process.platform==="darwin"?"pbcopy":process.platform==="win32"?"clip.exe":"xclip -selection clipboard";Ho(e,{input:t})}import Ko from"bun";function kt(t,e){let{promise:o,resolve:r}=Promise.withResolvers();return Ko.connect({hostname:e,port:t,socket:{data(){},open(n){n.end(),r(!0)},error(){r(!1)},connectError(){r(!1)}}}),o}function Je(t,e=!1){t&&console.log((e?ae:q)(` \u26A0 ${t}`))}import{ZenRouter as Xo}from"@liveblocks/zenrouter";import{array as Dt,enum_ as qo,object as jt,optional as ze,record as Zo,string as $e}from"decoders";import{json as Wo}from"@liveblocks/zenrouter";import{json as Pt}from"@liveblocks/zenrouter";function Ge(t,e,o){return Pt(t,e,{"X-LB-Warn":o})}function C(t,e,o="This is a dummy response."){return Ge(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 be(t){let e=t.headers.get("Authorization");if(e==="Bearer sk_localdev")return!0;if(!e)throw Wo({error:"Unauthorized",message:"Missing secret key"},401);if(e.startsWith("Bearer "))throw Ge({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 Qo=qo(X),me=new Xo({authorize:({req:t})=>be(t)});me.route("POST /v2/authorize-user",jt({userId:$e,userInfo:ze(oe),permissions:Zo(Dt(Qo))}),({body:t})=>({token:Be({k:"acc",pid:"localdev",uid:t.userId,perms:t.permissions,ui:t.userInfo})}));me.route("POST /v2/identify-user",jt({userId:$e,userInfo:ze(oe),groupIds:ze(Dt($e))}),({body:t})=>({token:Be({k:"id",pid:"localdev",uid:t.userId,ui:t.userInfo,gids:t.groupIds})}));import{ZenRouter as er}from"@liveblocks/zenrouter";var u=new er({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 ye(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("POST /v2/c/rooms/<roomId>/version",()=>s()),u.route("GET /v2/c/rooms/<roomId>/y-version/<version>",()=>s()),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>/notification-settings",()=>s()),u.route("GET /v2/c/rooms/<roomId>/subscription-settings",()=>s()),u.route("POST /v2/c/rooms/<roomId>/notification-settings",()=>s()),u.route("POST /v2/c/rooms/<roomId>/subscription-settings",()=>s()),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("GET /v2/c/rooms/<roomId>/versions",()=>s()),u.route("GET /v2/c/rooms/<roomId>/versions/delta",()=>s()),u.route("POST /v2/c/groups/find",()=>s());import{abort as Ut,html as or,json as rr,ZenRouter as sr}from"@liveblocks/zenrouter";var Mt=`<!doctype html>
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,S=n;function J(){let y=Ve.serve({hostname:a,port:S,async fetch(h,v){if(h.headers.get("Upgrade")==="websocket"){let F=Ct(h);if(!F.ok)return Je(F.xwarn,!0),Xt(v,h,Wt.NOT_ALLOWED,"You have no access to this room");let{roomId:$,ticketData:L}=F;if(Et($))return Xt(v,h,Wt.TRY_AGAIN_LATER,"Server is undergoing maintenance, try again later");let w=U($),G=w.createTicket(L),fe=G.sessionKey;if(v.upgrade(h,{data:{room:w,ticket:G,sessionKey:fe}})){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 se.fetch(h),j=H.status,ne=j>=500?ae(j):j>=400?q(j):B(j);console.log(`${ne} ${T}`);let _=H.headers.get("X-LB-Warn")??void 0;if(Je(_,!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 S=y.port,y}c=J();async function g(){_t(),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.0")} running at http://${c.hostname}:${c.port}`),d&&e.verbose&&N(m(`Ephemeral mode, using ${d}`));let y=Or(d,"server.log");N(m(`Server logs: ${y}`));let h=Ve.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=Ve.spawn(Lr(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(),Pe(),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"?A(" Logs "):m(" Logs "),f=v==="sockets"?A(" Sockets "):m(" Sockets "),p=E+m("|")+f,ie=(T?Y("\u23F8 maintenance")+" ":"")+m(`Liveblocks running at ${H}`),Ce=process.stdout.columns??80,Ne=Math.max(1,Ce-we(p).length-we(ie).length);return p+" ".repeat(Ne)+ie},ne=[],_=console.log.bind(console);console.log=(...E)=>{let f=E.map(String).join(" ");ne.push(f),v==="logs"&&_(f)};let F=()=>m(" ")+A("q")+m(" quit, ")+A("!")+m(" crash, ")+A("c")+m(" clear, ")+A("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 ne)_(E)},L=0,w=[],G=E=>`${E.roomId}:${E.actor}`,fe=()=>{w=ue().map(E=>({...E,alive:!0}))},Ke=()=>{let E=new Set(ue().map(G));for(let p of w)p.alive=E.has(G(p));let f=new Set(w.map(G));for(let p of ue())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"):""},ge=(E,f)=>{let p=E+f;for(;p>=0&&p<w.length;){if(w[p].alive)return p;p+=f}return E},K=()=>{Ke();let E=w.filter(p=>p.alive).length;if(process.stdout.write("\x1B[2J\x1B[H"),_(j()),_(m(" ")+A("\u2191\u2193")+m(" navigate, ")+A("k")+m(" kill, ")+A("m")+m(T?" maintenance off, ":" maintenance on, ")+A("r")+m(" refresh")),_(),_(" "+A("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=ge(L,-1);L=w[p]?.alive?p:ge(L,1)}let f=new Map;for(let p of ue())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 ie=p===L?B("\u25B6 "):" ",Ce=D.userId??m("anonymous"),Ne=Zt(D.connectedAt),oo=f.get(G(D)),ro=Qt(oo);_(`${ie}${A(D.roomId)} ${m("\xB7")} actor=${D.actor} ${m("\xB7")} ${Ce} ${m("\xB7")} ${m(Ne)}${ro}`)}},eo=()=>{v="sockets",L=0,fe(),K(),P=setInterval(()=>K(),1e3)},to=()=>{if(T)T(),T=null;else{let{promise:E,resolve:f}=Rr();ht(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(()=>{Pe(),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=ge(L,-1),K();else if(f==="\x1B[B")L=ge(L,1),K();else if(f==="k"){let p=w[L];p?.alive&&(vt(p.roomId,p.actor),K())}else f==="r"&&(fe(),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")ne.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=xt(h,y);At(p),console.log(m("Copied AI fix prompt to clipboard"))}else console.log(m("No setup issues detected"))})}}},on=Nr;export{on as default};
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-RYOFP5XN.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.6.0"),console.log(),console.log("Usage: liveblocks <command> [options]"),console.log(),console.log("Commands:");for(let[e,i]of Object.entries(m))console.log(` ${e.padEnd(12)} ${i}`);console.log(),console.log("Options:"),console.log(" --help, -h Show this help message"),console.log(" --version Show version number")}async function v(){t.version&&(console.log("1.6.0"),process.exit(0)),(t.help||!n)&&(f(),process.exit(n?0:1));let e=await p(n);e?await e.run(u):(console.error(`Unknown command: ${n}`),console.error('Run "liveblocks --help" for usage.'),process.exit(1))}v();
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.0",
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": "3.19.5-pre1",
40
- "@liveblocks/zenrouter": "^1.0.18",
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/server": "^1.6.0",
45
- "@liveblocks/query-parser": "^0.1.1"
44
+ "@liveblocks/query-parser": "^0.1.1",
45
+ "@liveblocks/server": "^1.6.2"
46
46
  },
47
47
  "scripts": {
48
48
  "build": "tsup",
@@ -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};