@multiplayer-app/sandbox 0.0.11 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/blocknote.agent.d.ts +6 -0
- package/dist/agents/blocknote.agent.d.ts.map +1 -0
- package/dist/agents/blocknote.agent.js +18 -0
- package/dist/agents/blocknote.agent.js.map +1 -0
- package/dist/agents/shared/blocknote-system-prompt.d.ts +2 -0
- package/dist/agents/shared/blocknote-system-prompt.d.ts.map +1 -0
- package/dist/agents/shared/blocknote-system-prompt.js +40 -0
- package/dist/agents/shared/blocknote-system-prompt.js.map +1 -0
- package/dist/builder-api-config.d.ts +3 -2
- package/dist/builder-api-config.d.ts.map +1 -1
- package/dist/builder-api-config.js +4 -1
- package/dist/builder-api-config.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/create-builder-api.d.ts +2 -0
- package/dist/create-builder-api.d.ts.map +1 -1
- package/dist/create-builder-api.js +2 -1
- package/dist/create-builder-api.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/agent-ai-service.d.ts +3 -0
- package/dist/lib/ai/agent-ai-service.d.ts.map +1 -0
- package/dist/lib/ai/agent-ai-service.js +15 -0
- package/dist/lib/ai/agent-ai-service.js.map +1 -0
- package/dist/lib/ai/ai-error-details.d.ts +13 -0
- package/dist/lib/ai/ai-error-details.d.ts.map +1 -0
- package/dist/lib/ai/ai-error-details.js +84 -0
- package/dist/lib/ai/ai-error-details.js.map +1 -0
- package/dist/lib/ai/generate-ai-text.d.ts +12 -0
- package/dist/lib/ai/generate-ai-text.d.ts.map +1 -0
- package/dist/lib/ai/generate-ai-text.js +105 -0
- package/dist/lib/ai/generate-ai-text.js.map +1 -0
- package/dist/lib/ai/run-explicit-agent.d.ts +15 -0
- package/dist/lib/ai/run-explicit-agent.d.ts.map +1 -0
- package/dist/lib/ai/run-explicit-agent.js +30 -0
- package/dist/lib/ai/run-explicit-agent.js.map +1 -0
- package/dist/lib/notebooks/notebook-assistant-prompts.d.ts +6 -0
- package/dist/lib/notebooks/notebook-assistant-prompts.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-assistant-prompts.js +42 -0
- package/dist/lib/notebooks/notebook-assistant-prompts.js.map +1 -0
- package/dist/lib/notebooks/notebook-assistant.d.ts +15 -0
- package/dist/lib/notebooks/notebook-assistant.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-assistant.js +142 -0
- package/dist/lib/notebooks/notebook-assistant.js.map +1 -0
- package/dist/lib/notebooks/notebook-content.d.ts +16 -0
- package/dist/lib/notebooks/notebook-content.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-content.js +104 -0
- package/dist/lib/notebooks/notebook-content.js.map +1 -0
- package/dist/lib/notebooks/notebook-repository.d.ts +47 -0
- package/dist/lib/notebooks/notebook-repository.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-repository.js +3 -0
- package/dist/lib/notebooks/notebook-repository.js.map +1 -0
- package/dist/lib/notebooks/notebook-sql-client.d.ts +5 -0
- package/dist/lib/notebooks/notebook-sql-client.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-sql-client.js +37 -0
- package/dist/lib/notebooks/notebook-sql-client.js.map +1 -0
- package/dist/lib/notebooks/notebook-sql-schema.d.ts +16 -0
- package/dist/lib/notebooks/notebook-sql-schema.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-sql-schema.js +117 -0
- package/dist/lib/notebooks/notebook-sql-schema.js.map +1 -0
- package/dist/lib/notebooks/notebook-sql.d.ts +9 -0
- package/dist/lib/notebooks/notebook-sql.d.ts.map +1 -0
- package/dist/lib/notebooks/notebook-sql.js +36 -0
- package/dist/lib/notebooks/notebook-sql.js.map +1 -0
- package/dist/realtime/init-realtime.d.ts +2 -2
- package/dist/realtime/init-realtime.d.ts.map +1 -1
- package/dist/realtime/init-realtime.js +31 -8
- package/dist/realtime/init-realtime.js.map +1 -1
- package/dist/realtime/notebook-document-id.d.ts +6 -0
- package/dist/realtime/notebook-document-id.d.ts.map +1 -0
- package/dist/realtime/notebook-document-id.js +30 -0
- package/dist/realtime/notebook-document-id.js.map +1 -0
- package/dist/realtime/realtime-auth.d.ts +12 -0
- package/dist/realtime/realtime-auth.d.ts.map +1 -0
- package/dist/realtime/realtime-auth.js +25 -0
- package/dist/realtime/realtime-auth.js.map +1 -0
- package/dist/realtime/session-artifact-y-socket-io.d.ts +4 -11
- package/dist/realtime/session-artifact-y-socket-io.d.ts.map +1 -1
- package/dist/realtime/session-artifact-y-socket-io.js +30 -32
- package/dist/realtime/session-artifact-y-socket-io.js.map +1 -1
- package/dist/realtime/session-artifact-yjs-store.d.ts +9 -0
- package/dist/realtime/session-artifact-yjs-store.d.ts.map +1 -1
- package/dist/realtime/session-artifact-yjs-store.js +93 -9
- package/dist/realtime/session-artifact-yjs-store.js.map +1 -1
- package/dist/realtime/yjs-account-namespace.d.ts +5 -0
- package/dist/realtime/yjs-account-namespace.d.ts.map +1 -0
- package/dist/realtime/yjs-account-namespace.js +21 -0
- package/dist/realtime/yjs-account-namespace.js.map +1 -0
- package/dist/routes/notebooks/assistant-generate.d.ts +3 -0
- package/dist/routes/notebooks/assistant-generate.d.ts.map +1 -0
- package/dist/routes/notebooks/assistant-generate.js +45 -0
- package/dist/routes/notebooks/assistant-generate.js.map +1 -0
- package/dist/routes/notebooks/errors.d.ts +3 -0
- package/dist/routes/notebooks/errors.d.ts.map +1 -0
- package/dist/routes/notebooks/errors.js +28 -0
- package/dist/routes/notebooks/errors.js.map +1 -0
- package/dist/routes/notebooks/sql-execute.d.ts +3 -0
- package/dist/routes/notebooks/sql-execute.d.ts.map +1 -0
- package/dist/routes/notebooks/sql-execute.js +45 -0
- package/dist/routes/notebooks/sql-execute.js.map +1 -0
- package/dist/routes/notebooks.d.ts +2 -0
- package/dist/routes/notebooks.d.ts.map +1 -0
- package/dist/routes/notebooks.js +134 -0
- package/dist/routes/notebooks.js.map +1 -0
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +0 -11
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/sql.d.ts +2 -0
- package/dist/routes/sql.d.ts.map +1 -0
- package/dist/routes/sql.js +50 -0
- package/dist/routes/sql.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/package.json +11 -5
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listNotebookSqlTables = listNotebookSqlTables;
|
|
4
|
+
exports.getNotebookSqlTableSchema = getNotebookSqlTableSchema;
|
|
5
|
+
const notebook_sql_client_1 = require("./notebook-sql-client");
|
|
6
|
+
const LIST_COLUMNS_SQL = `
|
|
7
|
+
SELECT
|
|
8
|
+
c.table_schema,
|
|
9
|
+
c.table_name,
|
|
10
|
+
c.column_name,
|
|
11
|
+
c.data_type,
|
|
12
|
+
c.is_nullable,
|
|
13
|
+
c.column_default,
|
|
14
|
+
c.ordinal_position
|
|
15
|
+
FROM information_schema.columns c
|
|
16
|
+
INNER JOIN information_schema.tables t
|
|
17
|
+
ON t.table_schema = c.table_schema
|
|
18
|
+
AND t.table_name = c.table_name
|
|
19
|
+
WHERE c.table_schema = 'public'
|
|
20
|
+
AND t.table_type = 'BASE TABLE'
|
|
21
|
+
ORDER BY c.table_name, c.ordinal_position
|
|
22
|
+
`;
|
|
23
|
+
const LIST_PRIMARY_KEYS_SQL = `
|
|
24
|
+
SELECT
|
|
25
|
+
tc.table_schema,
|
|
26
|
+
tc.table_name,
|
|
27
|
+
kcu.column_name
|
|
28
|
+
FROM information_schema.table_constraints tc
|
|
29
|
+
INNER JOIN information_schema.key_column_usage kcu
|
|
30
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
31
|
+
AND tc.table_schema = kcu.table_schema
|
|
32
|
+
AND tc.table_name = kcu.table_name
|
|
33
|
+
WHERE tc.constraint_type = 'PRIMARY KEY'
|
|
34
|
+
AND tc.table_schema = 'public'
|
|
35
|
+
`;
|
|
36
|
+
function buildPrimaryKeySet(rows) {
|
|
37
|
+
return new Set(rows.map(row => `${row.table_schema}.${row.table_name}.${row.column_name}`));
|
|
38
|
+
}
|
|
39
|
+
function groupColumnsByTable(columnRows, primaryKeys) {
|
|
40
|
+
const tables = new Map();
|
|
41
|
+
for (const row of columnRows) {
|
|
42
|
+
const key = `${row.table_schema}.${row.table_name}`;
|
|
43
|
+
let table = tables.get(key);
|
|
44
|
+
if (!table) {
|
|
45
|
+
table = {
|
|
46
|
+
schema: row.table_schema,
|
|
47
|
+
name: row.table_name,
|
|
48
|
+
columns: [],
|
|
49
|
+
};
|
|
50
|
+
tables.set(key, table);
|
|
51
|
+
}
|
|
52
|
+
table.columns.push({
|
|
53
|
+
name: row.column_name,
|
|
54
|
+
dataType: row.data_type,
|
|
55
|
+
isNullable: row.is_nullable === 'YES',
|
|
56
|
+
defaultValue: row.column_default,
|
|
57
|
+
isPrimaryKey: primaryKeys.has(`${row.table_schema}.${row.table_name}.${row.column_name}`),
|
|
58
|
+
ordinalPosition: row.ordinal_position,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return Array.from(tables.values());
|
|
62
|
+
}
|
|
63
|
+
async function listNotebookSqlTables() {
|
|
64
|
+
return (0, notebook_sql_client_1.withNotebookSqlClient)(async (client) => {
|
|
65
|
+
const [columnsResult, primaryKeysResult] = await Promise.all([
|
|
66
|
+
client.query(LIST_COLUMNS_SQL),
|
|
67
|
+
client.query(LIST_PRIMARY_KEYS_SQL),
|
|
68
|
+
]);
|
|
69
|
+
return groupColumnsByTable(columnsResult.rows, buildPrimaryKeySet(primaryKeysResult.rows));
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async function getNotebookSqlTableSchema(tableName) {
|
|
73
|
+
const trimmed = tableName.trim();
|
|
74
|
+
if (!trimmed) {
|
|
75
|
+
throw new Error('Table name is required');
|
|
76
|
+
}
|
|
77
|
+
return (0, notebook_sql_client_1.withNotebookSqlClient)(async (client) => {
|
|
78
|
+
var _a;
|
|
79
|
+
const columnsResult = await client.query(`
|
|
80
|
+
SELECT
|
|
81
|
+
c.table_schema,
|
|
82
|
+
c.table_name,
|
|
83
|
+
c.column_name,
|
|
84
|
+
c.data_type,
|
|
85
|
+
c.is_nullable,
|
|
86
|
+
c.column_default,
|
|
87
|
+
c.ordinal_position
|
|
88
|
+
FROM information_schema.columns c
|
|
89
|
+
INNER JOIN information_schema.tables t
|
|
90
|
+
ON t.table_schema = c.table_schema
|
|
91
|
+
AND t.table_name = c.table_name
|
|
92
|
+
WHERE c.table_schema = 'public'
|
|
93
|
+
AND t.table_type = 'BASE TABLE'
|
|
94
|
+
AND c.table_name = $1
|
|
95
|
+
ORDER BY c.ordinal_position
|
|
96
|
+
`, [trimmed]);
|
|
97
|
+
if (columnsResult.rows.length === 0) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const primaryKeysResult = await client.query(`
|
|
101
|
+
SELECT
|
|
102
|
+
tc.table_schema,
|
|
103
|
+
tc.table_name,
|
|
104
|
+
kcu.column_name
|
|
105
|
+
FROM information_schema.table_constraints tc
|
|
106
|
+
INNER JOIN information_schema.key_column_usage kcu
|
|
107
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
108
|
+
AND tc.table_schema = kcu.table_schema
|
|
109
|
+
AND tc.table_name = kcu.table_name
|
|
110
|
+
WHERE tc.constraint_type = 'PRIMARY KEY'
|
|
111
|
+
AND tc.table_schema = 'public'
|
|
112
|
+
AND tc.table_name = $1
|
|
113
|
+
`, [trimmed]);
|
|
114
|
+
return (_a = groupColumnsByTable(columnsResult.rows, buildPrimaryKeySet(primaryKeysResult.rows))[0]) !== null && _a !== void 0 ? _a : null;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=notebook-sql-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-sql-schema.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-sql-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SqlQueryResult {
|
|
2
|
+
columns: string[];
|
|
3
|
+
rows: Record<string, unknown>[];
|
|
4
|
+
rowCount: number;
|
|
5
|
+
durationMs: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function executeNotebookSqlQuery(query: string): Promise<SqlQueryResult>;
|
|
8
|
+
export { closeNotebookSqlPool } from './notebook-sql-client';
|
|
9
|
+
//# sourceMappingURL=notebook-sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-sql.d.ts","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-sql.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAYD,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAsBpF;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.closeNotebookSqlPool = void 0;
|
|
4
|
+
exports.executeNotebookSqlQuery = executeNotebookSqlQuery;
|
|
5
|
+
const notebook_sql_client_1 = require("./notebook-sql-client");
|
|
6
|
+
function rowsToResult(rows, rowCount, durationMs) {
|
|
7
|
+
const columns = rows.length > 0 ? Object.keys(rows[0]) : [];
|
|
8
|
+
return {
|
|
9
|
+
columns,
|
|
10
|
+
rows,
|
|
11
|
+
rowCount,
|
|
12
|
+
durationMs,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
async function executeNotebookSqlQuery(query) {
|
|
16
|
+
const trimmed = query.trim();
|
|
17
|
+
if (!trimmed) {
|
|
18
|
+
throw new Error('Query is empty');
|
|
19
|
+
}
|
|
20
|
+
const start = performance.now();
|
|
21
|
+
try {
|
|
22
|
+
return await (0, notebook_sql_client_1.withNotebookSqlClient)(async (client) => {
|
|
23
|
+
var _a;
|
|
24
|
+
const result = await client.query(trimmed);
|
|
25
|
+
const durationMs = Math.round(performance.now() - start);
|
|
26
|
+
return rowsToResult(result.rows, (_a = result.rowCount) !== null && _a !== void 0 ? _a : result.rows.length, durationMs);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
31
|
+
throw new Error(message);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
var notebook_sql_client_2 = require("./notebook-sql-client");
|
|
35
|
+
Object.defineProperty(exports, "closeNotebookSqlPool", { enumerable: true, get: function () { return notebook_sql_client_2.closeNotebookSqlPool; } });
|
|
36
|
+
//# sourceMappingURL=notebook-sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-sql.js","sourceRoot":"","sources":["../../../src/lib/notebooks/notebook-sql.ts"],"names":[],"mappings":";;;AAmBA,0DAsBC;AAzCD,+DAA6D;AAS7D,SAAS,YAAY,CAAC,IAA+B,EAAE,QAAgB,EAAE,UAAkB;IACzF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,OAAO;QACL,OAAO;QACP,IAAI;QACJ,QAAQ;QACR,UAAU;KACX,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,KAAa;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAE/B,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,2CAAqB,EAAC,KAAK,EAAC,MAAM,EAAC,EAAE;;YAChD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;YACxD,OAAO,YAAY,CACjB,MAAM,CAAC,IAAiC,EACxC,MAAA,MAAM,CAAC,QAAQ,mCAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EACrC,UAAU,CACX,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC;AAED,6DAA4D;AAAnD,2HAAA,oBAAoB,OAAA"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { Server as HttpServer } from 'node:http';
|
|
2
2
|
import { type RedisClientType } from 'redis';
|
|
3
|
-
import { type RealtimeServer } from '@multiplayer-app/realtime-server';
|
|
3
|
+
import { type Middleware, type RealtimeServer } from '@multiplayer-app/realtime-server';
|
|
4
4
|
import type { BuilderApiConfig } from '../builder-api-config';
|
|
5
5
|
export interface RealtimeServices {
|
|
6
6
|
realtimeServer: RealtimeServer;
|
|
7
7
|
redisClient: RedisClientType;
|
|
8
8
|
close: () => Promise<void>;
|
|
9
9
|
}
|
|
10
|
-
export declare function initRealtime(httpServer: HttpServer, config: BuilderApiConfig, redisUrl?: string): Promise<RealtimeServices | null>;
|
|
10
|
+
export declare function initRealtime(httpServer: HttpServer, config: BuilderApiConfig, redisUrl?: string, socketAuth?: Middleware): Promise<RealtimeServices | null>;
|
|
11
11
|
//# sourceMappingURL=init-realtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-realtime.d.ts","sourceRoot":"","sources":["../../src/realtime/init-realtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,OAAO,CAAA;AAC1D,OAAO,
|
|
1
|
+
{"version":3,"file":"init-realtime.d.ts","sourceRoot":"","sources":["../../src/realtime/init-realtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,OAAO,CAAA;AAC1D,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAK7D,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAA;IAC9B,WAAW,EAAE,eAAe,CAAA;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAQD,wBAAsB,YAAY,CAChC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,SAAoD,EAC5D,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA0DlC"}
|
|
@@ -5,8 +5,7 @@ const redis_1 = require("redis");
|
|
|
5
5
|
const realtime_server_1 = require("@multiplayer-app/realtime-server");
|
|
6
6
|
const logger_1 = require("../logger");
|
|
7
7
|
const session_artifact_y_socket_io_1 = require("./session-artifact-y-socket-io");
|
|
8
|
-
const
|
|
9
|
-
const REALTIME_NAMESPACE = '/';
|
|
8
|
+
const ACCOUNT_NAMESPACE = /^\/[^/]+$/;
|
|
10
9
|
function resolveCorsOrigin(corsOrigin) {
|
|
11
10
|
if (corsOrigin === true)
|
|
12
11
|
return '*';
|
|
@@ -14,7 +13,7 @@ function resolveCorsOrigin(corsOrigin) {
|
|
|
14
13
|
return corsOrigin.join(',');
|
|
15
14
|
return String(corsOrigin);
|
|
16
15
|
}
|
|
17
|
-
async function initRealtime(httpServer, config, redisUrl) {
|
|
16
|
+
async function initRealtime(httpServer, config, redisUrl, socketAuth) {
|
|
18
17
|
var _a;
|
|
19
18
|
if (redisUrl === void 0) { redisUrl = (_a = process.env.REDIS_URL) !== null && _a !== void 0 ? _a : 'redis://127.0.0.1:6379'; }
|
|
20
19
|
let redisClient;
|
|
@@ -29,16 +28,40 @@ async function initRealtime(httpServer, config, redisUrl) {
|
|
|
29
28
|
const realtimeServer = await (0, realtime_server_1.createRealtimeServer)({
|
|
30
29
|
httpServer,
|
|
31
30
|
corsOrigin: resolveCorsOrigin(config.corsOrigin),
|
|
32
|
-
namespace:
|
|
31
|
+
namespace: ACCOUNT_NAMESPACE,
|
|
33
32
|
pubClient: redisClient,
|
|
34
33
|
subClient: redisClient.duplicate(),
|
|
35
34
|
path: config.realtimeSocketPath,
|
|
36
|
-
authMiddleware:
|
|
35
|
+
authMiddleware: socketAuth,
|
|
36
|
+
getUserInfo: config.getUserInfo,
|
|
37
37
|
});
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
realtimeServer.namespace.use((0, realtime_server_1.authWrap)(socketAuth));
|
|
39
|
+
realtimeServer.namespace.use(async (socket, next) => {
|
|
40
|
+
var _a;
|
|
41
|
+
try {
|
|
42
|
+
const namespaceAccountId = socket.nsp.name.slice(1).trim();
|
|
43
|
+
const requestAccountId = String((_a = socket.request.accountId) !== null && _a !== void 0 ? _a : '').trim();
|
|
44
|
+
if (!namespaceAccountId || !requestAccountId || namespaceAccountId !== requestAccountId) {
|
|
45
|
+
return next(new realtime_server_1.SocketIOError('Invalid account namespace', 403));
|
|
46
|
+
}
|
|
47
|
+
const presentUser = await config.getUserInfo(socket);
|
|
48
|
+
if (!presentUser) {
|
|
49
|
+
return next(new realtime_server_1.SocketIOError('User not found', 404));
|
|
50
|
+
}
|
|
51
|
+
socket.data.user = presentUser;
|
|
52
|
+
socket.data.allowEdit = true;
|
|
53
|
+
next();
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
if (err instanceof realtime_server_1.SocketIOError) {
|
|
57
|
+
return next(err);
|
|
58
|
+
}
|
|
59
|
+
return next(new realtime_server_1.SocketIOError('Cannot init user data', 500));
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
const yjsServer = new session_artifact_y_socket_io_1.SessionArtifactYSocketIO(realtimeServer.namespace);
|
|
40
63
|
yjsServer.initialize();
|
|
41
|
-
(0, logger_1.getBuilderApiLogger)().info({
|
|
64
|
+
(0, logger_1.getBuilderApiLogger)().info({ yjsNamespacePattern: String(ACCOUNT_NAMESPACE) }, 'Realtime Yjs server initialized');
|
|
42
65
|
return {
|
|
43
66
|
realtimeServer,
|
|
44
67
|
redisClient,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-realtime.js","sourceRoot":"","sources":["../../src/realtime/init-realtime.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"init-realtime.js","sourceRoot":"","sources":["../../src/realtime/init-realtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function buildNotebookDocumentId(accountId: string, notebookId: string): string;
|
|
2
|
+
export declare function parseNotebookDocumentId(documentIdentifier: string): {
|
|
3
|
+
accountId: string;
|
|
4
|
+
notebookId: string;
|
|
5
|
+
} | null;
|
|
6
|
+
//# sourceMappingURL=notebook-document-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-document-id.d.ts","sourceRoot":"","sources":["../../src/realtime/notebook-document-id.ts"],"names":[],"mappings":"AAEA,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAOrF;AAED,wBAAgB,uBAAuB,CACrC,kBAAkB,EAAE,MAAM,GACzB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkBlD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildNotebookDocumentId = buildNotebookDocumentId;
|
|
4
|
+
exports.parseNotebookDocumentId = parseNotebookDocumentId;
|
|
5
|
+
const NOTEBOOK_DOCUMENT_ID_PREFIX = 'notebook:';
|
|
6
|
+
function buildNotebookDocumentId(accountId, notebookId) {
|
|
7
|
+
const normalizedAccountId = accountId.trim();
|
|
8
|
+
const normalizedNotebookId = notebookId.trim();
|
|
9
|
+
if (!normalizedAccountId || !normalizedNotebookId) {
|
|
10
|
+
throw new Error('Invalid notebook document id parts');
|
|
11
|
+
}
|
|
12
|
+
return `${NOTEBOOK_DOCUMENT_ID_PREFIX}${normalizedAccountId}:${normalizedNotebookId}`;
|
|
13
|
+
}
|
|
14
|
+
function parseNotebookDocumentId(documentIdentifier) {
|
|
15
|
+
if (!documentIdentifier.startsWith(NOTEBOOK_DOCUMENT_ID_PREFIX)) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const rest = documentIdentifier.slice(NOTEBOOK_DOCUMENT_ID_PREFIX.length);
|
|
19
|
+
const separator = rest.indexOf(':');
|
|
20
|
+
if (separator <= 0) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const accountId = rest.slice(0, separator).trim();
|
|
24
|
+
const notebookId = rest.slice(separator + 1).trim();
|
|
25
|
+
if (!accountId || !notebookId) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return { accountId, notebookId };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=notebook-document-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-document-id.js","sourceRoot":"","sources":["../../src/realtime/notebook-document-id.ts"],"names":[],"mappings":";;AAEA,0DAOC;AAED,0DAoBC;AA/BD,MAAM,2BAA2B,GAAG,WAAW,CAAA;AAE/C,SAAgB,uBAAuB,CAAC,SAAiB,EAAE,UAAkB;IAC3E,MAAM,mBAAmB,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;IAC5C,MAAM,oBAAoB,GAAG,UAAU,CAAC,IAAI,EAAE,CAAA;IAC9C,IAAI,CAAC,mBAAmB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,GAAG,2BAA2B,GAAG,mBAAmB,IAAI,oBAAoB,EAAE,CAAA;AACvF,CAAC;AAED,SAAgB,uBAAuB,CACrC,kBAA0B;IAE1B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAA;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACnD,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAA;AAClC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AuthenticatedPresentUser } from '@multiplayer-app/realtime-types';
|
|
2
|
+
import type { Middleware } from '@multiplayer-app/realtime-server';
|
|
3
|
+
export type RealtimeDocumentAuthHandler = (request: unknown) => Promise<{
|
|
4
|
+
name: string;
|
|
5
|
+
id: string;
|
|
6
|
+
color: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function toRealtimeAuthMiddleware(handler: RealtimeDocumentAuthHandler): Middleware;
|
|
9
|
+
export declare function getSocketPresentUser(socket: {
|
|
10
|
+
request: unknown;
|
|
11
|
+
}): AuthenticatedPresentUser | null;
|
|
12
|
+
//# sourceMappingURL=realtime-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-auth.d.ts","sourceRoot":"","sources":["../../src/realtime/realtime-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAA;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAElE,MAAM,MAAM,2BAA2B,GAAG,CACxC,OAAO,EAAE,OAAO,KACb,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAQzD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,2BAA2B,GAAG,UAAU,CAazF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,wBAAwB,GAAG,IAAI,CAGlG"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toRealtimeAuthMiddleware = toRealtimeAuthMiddleware;
|
|
4
|
+
exports.getSocketPresentUser = getSocketPresentUser;
|
|
5
|
+
function toRealtimeAuthMiddleware(handler) {
|
|
6
|
+
return async (request, _response, next) => {
|
|
7
|
+
try {
|
|
8
|
+
const presentUser = await handler(request);
|
|
9
|
+
const req = request;
|
|
10
|
+
req.presentUser = presentUser;
|
|
11
|
+
req.userId = presentUser.id;
|
|
12
|
+
next();
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
16
|
+
next(err);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function getSocketPresentUser(socket) {
|
|
21
|
+
var _a;
|
|
22
|
+
const req = socket.request;
|
|
23
|
+
return (_a = req.presentUser) !== null && _a !== void 0 ? _a : null;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=realtime-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-auth.js","sourceRoot":"","sources":["../../src/realtime/realtime-auth.ts"],"names":[],"mappings":";;AAaA,4DAaC;AAED,oDAGC;AAlBD,SAAgB,wBAAwB,CAAC,OAAoC;IAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;YAC1C,MAAM,GAAG,GAAG,OAAsB,CAAA;YAClC,GAAG,CAAC,WAAW,GAAG,WAAW,CAAA;YAC7B,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,CAAA;YAC3B,IAAI,EAAE,CAAA;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YACrE,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,SAAgB,oBAAoB,CAAC,MAA4B;;IAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAsB,CAAA;IACzC,OAAO,MAAA,GAAG,CAAC,WAAW,mCAAI,IAAI,CAAA;AAChC,CAAC"}
|
|
@@ -1,18 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
interface PersistedUpdateRow {
|
|
3
|
-
_id: {
|
|
4
|
-
toString(): string;
|
|
5
|
-
};
|
|
6
|
-
update?: Buffer | Uint8Array;
|
|
7
|
-
}
|
|
1
|
+
import { PersistedYSocketIO, type GenericYSocketConnection } from '@multiplayer-app/realtime-server';
|
|
8
2
|
/**
|
|
9
3
|
* Yjs relay for session artifact files. Loads initial state from disk and persists edits back.
|
|
10
4
|
*/
|
|
11
|
-
export declare class SessionArtifactYSocketIO extends
|
|
5
|
+
export declare class SessionArtifactYSocketIO extends PersistedYSocketIO {
|
|
12
6
|
private readonly store;
|
|
7
|
+
constructor(namespace: GenericYSocketConnection);
|
|
13
8
|
initialize(): void;
|
|
14
|
-
|
|
15
|
-
protected storeUpdate(_data: GenericYjsSocketData, update: Uint8Array, documentIdentifier: string): Promise<void>;
|
|
9
|
+
private relayDocCache;
|
|
16
10
|
}
|
|
17
|
-
export {};
|
|
18
11
|
//# sourceMappingURL=session-artifact-y-socket-io.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-artifact-y-socket-io.d.ts","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"session-artifact-y-socket-io.d.ts","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,KAAK,wBAAwB,EAE9B,MAAM,kCAAkC,CAAA;AAOzC;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,kBAAkB;IAC9D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAEzC,SAAS,EAAE,wBAAwB;IA6BtC,UAAU,IAAI,IAAI;IAoB3B,OAAO,CAAC,aAAa;CAGtB"}
|
|
@@ -41,9 +41,32 @@ const session_artifact_yjs_store_1 = require("./session-artifact-yjs-store");
|
|
|
41
41
|
/**
|
|
42
42
|
* Yjs relay for session artifact files. Loads initial state from disk and persists edits back.
|
|
43
43
|
*/
|
|
44
|
-
class SessionArtifactYSocketIO extends realtime_server_1.
|
|
45
|
-
constructor() {
|
|
46
|
-
|
|
44
|
+
class SessionArtifactYSocketIO extends realtime_server_1.PersistedYSocketIO {
|
|
45
|
+
constructor(namespace) {
|
|
46
|
+
const store = (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)();
|
|
47
|
+
const storageAdapter = {
|
|
48
|
+
async getDocumentStateRecord(documentIdentifier) {
|
|
49
|
+
var _a;
|
|
50
|
+
const persisted = await store.getPersistedStateRecord(documentIdentifier);
|
|
51
|
+
if ((_a = persisted === null || persisted === void 0 ? void 0 : persisted.state) === null || _a === void 0 ? void 0 : _a.byteLength) {
|
|
52
|
+
return persisted;
|
|
53
|
+
}
|
|
54
|
+
// Artifact may exist as UTF-8 on disk without a `.yjs` state file yet.
|
|
55
|
+
const doc = await store.getOrLoadDoc(documentIdentifier);
|
|
56
|
+
if (!doc) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const state = Y.encodeStateAsUpdate(doc);
|
|
60
|
+
if (!state.byteLength) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
return { id: { toString: () => documentIdentifier }, state };
|
|
64
|
+
},
|
|
65
|
+
async saveDocumentState(documentIdentifier, state) {
|
|
66
|
+
await store.persistBinaryState(documentIdentifier, state);
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
super(namespace, storageAdapter);
|
|
47
70
|
this.store = (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)();
|
|
48
71
|
}
|
|
49
72
|
initialize() {
|
|
@@ -51,6 +74,8 @@ class SessionArtifactYSocketIO extends realtime_server_1.GenericYSocketIO {
|
|
|
51
74
|
if (!update.byteLength || !(0, realtime_server_1.isValidYjsUpdate)(update)) {
|
|
52
75
|
return;
|
|
53
76
|
}
|
|
77
|
+
// Agent/tooling writes go through SessionArtifactYjsStore; drop stale relay cache.
|
|
78
|
+
this.relayDocCache().delete(documentIdentifier);
|
|
54
79
|
this.io
|
|
55
80
|
.to(this.getDocumentRoom(documentIdentifier))
|
|
56
81
|
.emit(realtime_types_1.YjsEvents.SYNC_UPDATE, {
|
|
@@ -60,35 +85,8 @@ class SessionArtifactYSocketIO extends realtime_server_1.GenericYSocketIO {
|
|
|
60
85
|
});
|
|
61
86
|
super.initialize();
|
|
62
87
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (!doc) {
|
|
66
|
-
return undefined;
|
|
67
|
-
}
|
|
68
|
-
const state = Y.encodeStateAsUpdate(doc);
|
|
69
|
-
if (!state.byteLength) {
|
|
70
|
-
return undefined;
|
|
71
|
-
}
|
|
72
|
-
return [
|
|
73
|
-
{
|
|
74
|
-
_id: { toString: () => documentIdentifier },
|
|
75
|
-
update: Buffer.from(state),
|
|
76
|
-
},
|
|
77
|
-
];
|
|
78
|
-
}
|
|
79
|
-
async storeUpdate(_data, update, documentIdentifier) {
|
|
80
|
-
const doc = await this.store.getOrLoadDoc(documentIdentifier);
|
|
81
|
-
if (!doc) {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
try {
|
|
85
|
-
Y.applyUpdate(doc, update);
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
console.warn(`Ignoring invalid Yjs update for ${documentIdentifier}:`, error);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
this.store.schedulePersist(documentIdentifier, doc);
|
|
88
|
+
relayDocCache() {
|
|
89
|
+
return this.docCache;
|
|
92
90
|
}
|
|
93
91
|
}
|
|
94
92
|
exports.SessionArtifactYSocketIO = SessionArtifactYSocketIO;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-artifact-y-socket-io.js","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"session-artifact-y-socket-io.js","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAKyC;AACzC,oEAA2D;AAC3D,uCAAwB;AACxB,6EAAyE;AAIzE;;GAEG;AACH,MAAa,wBAAyB,SAAQ,oCAAkB;IAG9D,YAAY,SAAmC;QAC7C,MAAM,KAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;QAC1C,MAAM,cAAc,GAA+B;YACjD,KAAK,CAAC,sBAAsB,CAAC,kBAA0B;;gBACrD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAA;gBACzE,IAAI,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,0CAAE,UAAU,EAAE,CAAC;oBACjC,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAED,uEAAuE;gBACvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAA;gBACxD,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAED,MAAM,KAAK,GAAG,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAA;gBACxC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oBACtB,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAED,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAA;YAC9D,CAAC;YACD,KAAK,CAAC,iBAAiB,CAAC,kBAA0B,EAAE,KAAiB;gBACnE,MAAM,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;YAC3D,CAAC;SACF,CAAA;QACD,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;QA5BjB,UAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;IA6BrD,CAAC;IAEQ,UAAU;QACjB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,EAAE;YAC1D,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,IAAA,kCAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,OAAM;YACR,CAAC;YAED,mFAAmF;YACnF,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;YAE/C,IAAI,CAAC,EAAE;iBACJ,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;iBAC5C,IAAI,CAAC,0BAAS,CAAC,WAAW,EAAE;gBAC3B,kBAAkB;gBAClB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC5B,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,UAAU,EAAE,CAAA;IACpB,CAAC;IAEO,aAAa;QACnB,OAAQ,IAA+C,CAAC,QAAQ,CAAA;IAClE,CAAC;CACF;AAvDD,4DAuDC"}
|
|
@@ -29,10 +29,19 @@ export declare class SessionArtifactYjsStore {
|
|
|
29
29
|
evictDocument(sessionId: string, artifactPath: string): void;
|
|
30
30
|
resetFromFileContent(sessionId: string, artifactPath: string): Promise<void>;
|
|
31
31
|
schedulePersist(documentIdentifier: string, doc: Y.Doc): void;
|
|
32
|
+
getPersistedStateRecord(documentIdentifier: string): Promise<{
|
|
33
|
+
id: {
|
|
34
|
+
toString(): string;
|
|
35
|
+
};
|
|
36
|
+
state?: Uint8Array;
|
|
37
|
+
} | undefined>;
|
|
38
|
+
persistBinaryState(documentIdentifier: string, state: Uint8Array): Promise<void>;
|
|
32
39
|
private persistToDisk;
|
|
33
40
|
private scheduleNamedSnapshot;
|
|
34
41
|
private clearPersistTimer;
|
|
35
42
|
private clearTimers;
|
|
43
|
+
private parseDocumentTarget;
|
|
44
|
+
private getNotebookRepository;
|
|
36
45
|
}
|
|
37
46
|
export declare function getSessionArtifactYjsStore(): SessionArtifactYjsStore;
|
|
38
47
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-artifact-yjs-store.d.ts","sourceRoot":"","sources":["../../src/realtime/session-artifact-yjs-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"session-artifact-yjs-store.d.ts","sourceRoot":"","sources":["../../src/realtime/session-artifact-yjs-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAsBxB,KAAK,eAAe,GAAG,CAAC,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;AAS/E,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmD;IACjF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmD;IAClF,OAAO,CAAC,eAAe,CAA+B;IAEtD,iBAAiB,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI;IAItC,YAAY,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;IAwBrE,8FAA8F;YAChF,yBAAyB;IAiCjC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW7E;;;OAGG;IACG,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,CAAC;IAqCvE;;;OAGG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;KAAE,CAAC;IAyB7B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAYtD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlF,eAAe,CAAC,kBAAkB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI;IAevD,uBAAuB,CAC3B,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC;QAAE,EAAE,EAAE;YAAE,QAAQ,IAAI,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,SAAS,CAAC;IAqBpE,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAwBxE,aAAa;IAuB3B,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,qBAAqB;CAO9B;AAID,wBAAgB,0BAA0B,IAAI,uBAAuB,CAKpE"}
|