fix y-pojo
This commit is contained in:
parent
cf01c62c88
commit
763c982946
|
|
@ -1,4 +1,3 @@
|
||||||
import { syncronize } from "y-pojo";
|
|
||||||
import { IItem, MItem } from "../../web/src/utils/types/item";
|
import { IItem, MItem } from "../../web/src/utils/types/item";
|
||||||
import { eg } from "../ws/edit/edit-global";
|
import { eg } from "../ws/edit/edit-global";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
import { syncronize } from "y-pojo";
|
|
||||||
import { MPage } from "../../web/src/utils/types/general";
|
import { MPage } from "../../web/src/utils/types/general";
|
||||||
import { WS_MSG_SET_PAGE, WS_MSG_SV_LOCAL } from "../../web/src/utils/types/ws";
|
import { WS_MSG_SET_PAGE, WS_MSG_SV_LOCAL } from "../../web/src/utils/types/ws";
|
||||||
import { eg } from "../ws/edit/edit-global";
|
import { eg } from "../ws/edit/edit-global";
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import { ExecaChildProcess } from "execa";
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
const Y: typeof Y;
|
const Y: typeof Y;
|
||||||
|
const syncronize: typeof Y.syncronize;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const glb = global as unknown as {
|
export const glb = global as unknown as {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import { ServerWebSocket } from "bun";
|
import { ServerWebSocket } from "bun";
|
||||||
import { validate } from "uuid";
|
import { validate } from "uuid";
|
||||||
import { syncronize } from "y-pojo";
|
|
||||||
import { WSData } from "../../../../../pkgs/core/server/create";
|
import { WSData } from "../../../../../pkgs/core/server/create";
|
||||||
import {
|
import {
|
||||||
WS_MSG_GET_COMP,
|
WS_MSG_GET_COMP,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import { ServerWebSocket } from "bun";
|
import { ServerWebSocket } from "bun";
|
||||||
import { validate } from "uuid";
|
import { validate } from "uuid";
|
||||||
import { syncronize } from "y-pojo";
|
|
||||||
import { WSData } from "../../../../../pkgs/core/server/create";
|
import { WSData } from "../../../../../pkgs/core/server/create";
|
||||||
import { MPage } from "../../../../web/src/utils/types/general";
|
import { MPage } from "../../../../web/src/utils/types/general";
|
||||||
import {
|
import {
|
||||||
|
|
@ -56,5 +55,5 @@ export const getPage = async (
|
||||||
type: "set_page",
|
type: "set_page",
|
||||||
changes: Y.encodeStateAsUpdate(page.doc as any).toString(),
|
changes: Y.encodeStateAsUpdate(page.doc as any).toString(),
|
||||||
};
|
};
|
||||||
sendWS(ws,JSON.stringify(sent));
|
sendWS(ws, JSON.stringify(sent));
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,93 @@
|
||||||
|
import { createId } from "@paralleldrive/cuid2";
|
||||||
|
import { WebSocketHandler } from "bun";
|
||||||
|
import { WSData } from "../../../../pkgs/core/server/create";
|
||||||
|
import { WS_MSG } from "../../../web/src/utils/types/ws";
|
||||||
|
import { diffLocal } from "./action/diff-local";
|
||||||
|
import { getComp } from "./action/get-comp";
|
||||||
|
import { getPage } from "./action/get-page";
|
||||||
|
import { svLocal } from "./action/sv-local";
|
||||||
|
import { svdiffRemote } from "./action/svdiff-remote";
|
||||||
|
import { redo, undo } from "./action/undo-redo";
|
||||||
|
import { eg } from "./edit-global";
|
||||||
|
import { sendWS } from "./send";
|
||||||
|
|
||||||
|
const site = {
|
||||||
|
saveTimeout: null as any,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const editHandler: WebSocketHandler<WSData> = {
|
||||||
|
open(ws) {
|
||||||
|
eg.edit.ws.set(ws, {
|
||||||
|
clientID: createId(),
|
||||||
|
});
|
||||||
|
},
|
||||||
|
async message(ws, raw) {
|
||||||
|
if (typeof raw === "string") {
|
||||||
|
try {
|
||||||
|
const msg = JSON.parse(raw) as WS_MSG;
|
||||||
|
|
||||||
|
if (msg.type === "ping") {
|
||||||
|
sendWS(ws, JSON.stringify({ type: "pong" }));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (msg.type) {
|
||||||
|
case "site-js":
|
||||||
|
clearTimeout(site.saveTimeout);
|
||||||
|
site.saveTimeout = setTimeout(async () => {
|
||||||
|
const js = JSON.parse(msg.src);
|
||||||
|
await db.site.update({
|
||||||
|
where: {
|
||||||
|
id: msg.id_site,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
js: js.src,
|
||||||
|
js_compiled: js.compiled,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}, 1000);
|
||||||
|
break;
|
||||||
|
case "get_page":
|
||||||
|
await getPage(ws, msg);
|
||||||
|
break;
|
||||||
|
case "get_comp":
|
||||||
|
await getComp(ws, msg);
|
||||||
|
break;
|
||||||
|
case "sv_local":
|
||||||
|
await svLocal(ws, msg);
|
||||||
|
break;
|
||||||
|
case "diff_local":
|
||||||
|
await diffLocal(ws, msg);
|
||||||
|
break;
|
||||||
|
case "svd_remote":
|
||||||
|
await svdiffRemote(ws, msg);
|
||||||
|
break;
|
||||||
|
case "undo":
|
||||||
|
undo(ws, msg);
|
||||||
|
break;
|
||||||
|
case "redo":
|
||||||
|
redo(ws, msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
close(ws, code, reason) {
|
||||||
|
eg.edit.ws.delete(ws);
|
||||||
|
|
||||||
|
for (const page of Object.values(eg.edit.page)) {
|
||||||
|
page.ws.delete(ws);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const site of Object.values(eg.edit.site)) {
|
||||||
|
site.ws.delete(ws);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const comp of Object.values(eg.edit.comp)) {
|
||||||
|
comp.ws.delete(ws);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
drain(ws) {},
|
||||||
|
};
|
||||||
|
|
@ -1,104 +1,17 @@
|
||||||
import { createId } from "@paralleldrive/cuid2";
|
|
||||||
import { WebSocketHandler } from "bun";
|
import { WebSocketHandler } from "bun";
|
||||||
import { WSData } from "../../../pkgs/core/server/create";
|
import { WSData } from "../../../pkgs/core/server/create";
|
||||||
import { WS_MSG } from "../../web/src/utils/types/ws";
|
|
||||||
import { diffLocal } from "./edit/action/diff-local";
|
|
||||||
import { getComp } from "./edit/action/get-comp";
|
|
||||||
import { getPage } from "./edit/action/get-page";
|
|
||||||
import { svLocal } from "./edit/action/sv-local";
|
|
||||||
import { svdiffRemote } from "./edit/action/svdiff-remote";
|
|
||||||
import { redo, undo } from "./edit/action/undo-redo";
|
|
||||||
import { eg } from "./edit/edit-global";
|
import { eg } from "./edit/edit-global";
|
||||||
import { sendWS } from "./edit/send";
|
|
||||||
import { syncHandler } from "./sync/sync-handler";
|
import { syncHandler } from "./sync/sync-handler";
|
||||||
|
import { editHandler } from "./edit/edit-handler";
|
||||||
|
|
||||||
(globalThis as any).Y = Y;
|
|
||||||
eg.edit = {
|
eg.edit = {
|
||||||
site: {},
|
site: {},
|
||||||
comp: {},
|
comp: {},
|
||||||
page: {},
|
page: {},
|
||||||
ws: new WeakMap(),
|
ws: new WeakMap(),
|
||||||
};
|
};
|
||||||
const site = {
|
|
||||||
saveTimeout: null as any,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const wsHandler: Record<string, WebSocketHandler<WSData>> = {
|
export const wsHandler: Record<string, WebSocketHandler<WSData>> = {
|
||||||
"/sync": syncHandler,
|
"/sync": syncHandler,
|
||||||
"/edit": {
|
"/edit": editHandler,
|
||||||
open(ws) {
|
|
||||||
eg.edit.ws.set(ws, {
|
|
||||||
clientID: createId(),
|
|
||||||
});
|
|
||||||
},
|
|
||||||
async message(ws, raw) {
|
|
||||||
if (typeof raw === "string") {
|
|
||||||
try {
|
|
||||||
const msg = JSON.parse(raw) as WS_MSG;
|
|
||||||
|
|
||||||
if (msg.type === "ping") {
|
|
||||||
sendWS(ws, JSON.stringify({ type: "pong" }));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (msg.type) {
|
|
||||||
case "site-js":
|
|
||||||
clearTimeout(site.saveTimeout);
|
|
||||||
site.saveTimeout = setTimeout(async () => {
|
|
||||||
const js = JSON.parse(msg.src);
|
|
||||||
await db.site.update({
|
|
||||||
where: {
|
|
||||||
id: msg.id_site,
|
|
||||||
},
|
|
||||||
data: {
|
|
||||||
js: js.src,
|
|
||||||
js_compiled: js.compiled,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}, 1000);
|
|
||||||
break;
|
|
||||||
case "get_page":
|
|
||||||
await getPage(ws, msg);
|
|
||||||
break;
|
|
||||||
case "get_comp":
|
|
||||||
await getComp(ws, msg);
|
|
||||||
break;
|
|
||||||
case "sv_local":
|
|
||||||
await svLocal(ws, msg);
|
|
||||||
break;
|
|
||||||
case "diff_local":
|
|
||||||
await diffLocal(ws, msg);
|
|
||||||
break;
|
|
||||||
case "svd_remote":
|
|
||||||
await svdiffRemote(ws, msg);
|
|
||||||
break;
|
|
||||||
case "undo":
|
|
||||||
undo(ws, msg);
|
|
||||||
break;
|
|
||||||
case "redo":
|
|
||||||
redo(ws, msg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
close(ws, code, reason) {
|
|
||||||
eg.edit.ws.delete(ws);
|
|
||||||
|
|
||||||
for (const page of Object.values(eg.edit.page)) {
|
|
||||||
page.ws.delete(ws);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const site of Object.values(eg.edit.site)) {
|
|
||||||
site.ws.delete(ws);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const comp of Object.values(eg.edit.comp)) {
|
|
||||||
comp.ws.delete(ws);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
drain(ws) {},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import { syncronize } from "y-pojo";
|
|
||||||
import { SAction } from "../actions";
|
import { SAction } from "../actions";
|
||||||
import { conns } from "../entity/conn";
|
import { conns } from "../entity/conn";
|
||||||
import { Y, docs } from "../entity/docs";
|
import { docs } from "../entity/docs";
|
||||||
import { snapshot } from "../entity/snapshot";
|
import { snapshot } from "../entity/snapshot";
|
||||||
import { user } from "../entity/user";
|
import { user } from "../entity/user";
|
||||||
import { gzipAsync } from "../entity/zlib";
|
import { gzipAsync } from "../entity/zlib";
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,13 @@
|
||||||
import { TypedArray } from "yjs-types";
|
import { TypedArray } from "yjs-types";
|
||||||
import { MContent } from "../../../../web/src/utils/types/general";
|
import { MItem } from "../../../../web/src/utils/types/item";
|
||||||
import { IItem, MItem } from "../../../../web/src/utils/types/item";
|
|
||||||
import { SAction } from "../actions";
|
|
||||||
import { docs } from "../entity/docs";
|
|
||||||
import { SyncConnection } from "../type";
|
|
||||||
import { syncronize } from "y-pojo";
|
|
||||||
import {
|
import {
|
||||||
FMComponent,
|
FMComponent,
|
||||||
FNComponent,
|
FNComponent,
|
||||||
} from "../../../../web/src/utils/types/meta-fn";
|
} from "../../../../web/src/utils/types/meta-fn";
|
||||||
import { MText } from "../../../../web/src/utils/types/text";
|
import { MText } from "../../../../web/src/utils/types/text";
|
||||||
|
import { SAction } from "../actions";
|
||||||
|
import { docs } from "../entity/docs";
|
||||||
|
import { SyncConnection } from "../type";
|
||||||
|
|
||||||
export const comp_new: SAction["comp"]["new"] = async function (
|
export const comp_new: SAction["comp"]["new"] = async function (
|
||||||
this: SyncConnection,
|
this: SyncConnection,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import { syncronize } from "y-pojo";
|
|
||||||
import { SAction } from "../actions";
|
import { SAction } from "../actions";
|
||||||
import { conns } from "../entity/conn";
|
import { conns } from "../entity/conn";
|
||||||
import { Y, docs } from "../entity/docs";
|
import { docs } from "../entity/docs";
|
||||||
import { snapshot } from "../entity/snapshot";
|
import { snapshot } from "../entity/snapshot";
|
||||||
import { user } from "../entity/user";
|
import { user } from "../entity/user";
|
||||||
import { gzipAsync } from "../entity/zlib";
|
import { gzipAsync } from "../entity/zlib";
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { SAction } from "../actions";
|
import { SAction } from "../actions";
|
||||||
import { Y, docs } from "../entity/docs";
|
import { docs } from "../entity/docs";
|
||||||
import { gunzipAsync } from "../entity/zlib";
|
import { gunzipAsync } from "../entity/zlib";
|
||||||
import { SyncConnection } from "../type";
|
import { SyncConnection } from "../type";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { SAction } from "../actions";
|
import { SAction } from "../actions";
|
||||||
import { Y, docs } from "../entity/docs";
|
import { docs } from "../entity/docs";
|
||||||
import { gunzipAsync, gzipAsync } from "../entity/zlib";
|
import { gunzipAsync, gzipAsync } from "../entity/zlib";
|
||||||
import { SyncConnection } from "../type";
|
import { SyncConnection } from "../type";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { SAction } from "../actions";
|
import { SAction } from "../actions";
|
||||||
import { Y, docs } from "../entity/docs";
|
import { docs } from "../entity/docs";
|
||||||
import { gunzipAsync, gzipAsync } from "../entity/zlib";
|
import { gunzipAsync, gzipAsync } from "../entity/zlib";
|
||||||
import { SyncConnection } from "../type";
|
import { SyncConnection } from "../type";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
import type * as Y from "yjs";
|
import type * as Y from "yjs";
|
||||||
|
import { syncronize } from "y-pojo";
|
||||||
|
|
||||||
export import Doc = Y.Doc;
|
export import Doc = Y.Doc;
|
||||||
export import UndoManager = Y.UndoManager;
|
export import UndoManager = Y.UndoManager;
|
||||||
export import applyUpdate = Y.applyUpdate;
|
export import applyUpdate = Y.applyUpdate;
|
||||||
|
|
@ -7,4 +9,6 @@ export import encodeStateAsUpdate = Y.encodeStateAsUpdate;
|
||||||
export import Text = Y.Text;
|
export import Text = Y.Text;
|
||||||
export import Map = Y.Map;
|
export import Map = Y.Map;
|
||||||
export import Array = Y.Array;
|
export import Array = Y.Array;
|
||||||
|
export import syncronize = syncronize;
|
||||||
|
|
||||||
export as namespace Y;
|
export as namespace Y;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import { parcelBuild } from "utils/parcel";
|
import { parcelBuild } from "utils/parcel";
|
||||||
import { generateAPIFrm } from "./server/api-frm";
|
import { generateAPIFrm } from "./server/api-frm";
|
||||||
import { prepareApiRoutes } from "./server/api-scan";
|
import { prepareApiRoutes } from "./server/api-scan";
|
||||||
import { createServer } from "./server/create";
|
|
||||||
import { prepareAPITypes } from "./server/prep-api-ts";
|
import { prepareAPITypes } from "./server/prep-api-ts";
|
||||||
import { startDevWatcher } from "./utils/dev-watcher";
|
import { startDevWatcher } from "./utils/dev-watcher";
|
||||||
import { ensureNotRunning } from "./utils/ensure";
|
import { ensureNotRunning } from "./utils/ensure";
|
||||||
|
|
@ -17,6 +16,7 @@ g.status = "init";
|
||||||
|
|
||||||
if (!g.Y) {
|
if (!g.Y) {
|
||||||
g.Y = await import("yjs");
|
g.Y = await import("yjs");
|
||||||
|
g.syncronize = (await import("y-pojo")).syncronize;
|
||||||
|
|
||||||
await createLogger();
|
await createLogger();
|
||||||
g.api = {};
|
g.api = {};
|
||||||
|
|
@ -66,6 +66,6 @@ if (!g.parcel) {
|
||||||
await parcelBuild();
|
await parcelBuild();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { createServer } = await import("./server/create");
|
||||||
await createServer();
|
await createServer();
|
||||||
g.status = "ready";
|
g.status = "ready";
|
||||||
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import { WebSocketHandler } from "bun";
|
import { WebSocketHandler } from "bun";
|
||||||
import { lookup } from "mime-types";
|
import { lookup } from "mime-types";
|
||||||
import { createRouter } from "radix3";
|
import { createRouter } from "radix3";
|
||||||
import { wsHandler } from "../../../app/srv/ws/handler";
|
|
||||||
import { dir } from "../utils/dir";
|
import { dir } from "../utils/dir";
|
||||||
import { g } from "../utils/global";
|
import { g } from "../utils/global";
|
||||||
import { serveAPI } from "./serve-api";
|
import { serveAPI } from "./serve-api";
|
||||||
|
|
@ -26,6 +25,7 @@ export const createServer = async () => {
|
||||||
g.router.insert(route.url.replace(/\*/gi, "**"), route);
|
g.router.insert(route.url.replace(/\*/gi, "**"), route);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { wsHandler } = await import("../../../app/srv/ws/handler");
|
||||||
g.server = Bun.serve({
|
g.server = Bun.serve({
|
||||||
port: g.port,
|
port: g.port,
|
||||||
websocket: {
|
websocket: {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
import { Server, Subprocess } from "bun";
|
import { Server, Subprocess } from "bun";
|
||||||
import { Logger } from "pino";
|
import { Logger } from "pino";
|
||||||
import { RadixRouter } from "radix3";
|
import { RadixRouter } from "radix3";
|
||||||
import { PrismaClient } from "../../../app/db/db";
|
import { syncronize } from "y-pojo";
|
||||||
import type * as Y from "yjs";
|
import type * as Y from "yjs";
|
||||||
|
import { PrismaClient } from "../../../app/db/db";
|
||||||
|
|
||||||
type SingleRoute = {
|
type SingleRoute = {
|
||||||
url: string;
|
url: string;
|
||||||
|
|
@ -30,4 +31,5 @@ export const g = global as unknown as {
|
||||||
parcel: Subprocess;
|
parcel: Subprocess;
|
||||||
apiPrepared: boolean;
|
apiPrepared: boolean;
|
||||||
Y: typeof Y;
|
Y: typeof Y;
|
||||||
|
syncronize: typeof syncronize;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue