wip fix
This commit is contained in:
parent
b9a877911e
commit
86ef473710
File diff suppressed because one or more lines are too long
|
|
@ -11,7 +11,7 @@ import { SyncConnection } from "../type";
|
||||||
import { parseJs } from "../editor/parser/parse-js";
|
import { parseJs } from "../editor/parser/parse-js";
|
||||||
import { snapshot } from "../entity/snapshot";
|
import { snapshot } from "../entity/snapshot";
|
||||||
import { validate } from "uuid";
|
import { validate } from "uuid";
|
||||||
import { gzipAsync } from "utils/diff";
|
import { gzipAsync } from "utils/diff/diff";
|
||||||
const decoder = new TextDecoder();
|
const decoder = new TextDecoder();
|
||||||
|
|
||||||
const timeout = {
|
const timeout = {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import { SAction } from "../actions";
|
||||||
import { 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";
|
||||||
import { gzipAsync } from "utils/diff";
|
import { gzipAsync } from "utils/diff/diff";
|
||||||
|
|
||||||
const history = {} as Record<string, string>;
|
const history = {} as Record<string, string>;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -170,7 +170,7 @@ export const EDGlobal = {
|
||||||
page: {
|
page: {
|
||||||
history: {
|
history: {
|
||||||
id: "",
|
id: "",
|
||||||
show: false
|
show: false,
|
||||||
},
|
},
|
||||||
root_id: "root",
|
root_id: "root",
|
||||||
cur: EmptyPage,
|
cur: EmptyPage,
|
||||||
|
|
@ -231,6 +231,7 @@ export const EDGlobal = {
|
||||||
open: {} as Record<string, string[]>,
|
open: {} as Record<string, string[]>,
|
||||||
},
|
},
|
||||||
popup: {
|
popup: {
|
||||||
|
file: { enabled: false },
|
||||||
code: {
|
code: {
|
||||||
init: false,
|
init: false,
|
||||||
open: false,
|
open: false,
|
||||||
|
|
@ -273,7 +274,7 @@ export const EDGlobal = {
|
||||||
comp: {
|
comp: {
|
||||||
preview_id: "",
|
preview_id: "",
|
||||||
open: null as null | ((comp_id: string) => void | Promise<void>),
|
open: null as null | ((comp_id: string) => void | Promise<void>),
|
||||||
import: false
|
import: false,
|
||||||
},
|
},
|
||||||
comp_group: null as null | {
|
comp_group: null as null | {
|
||||||
mouse_event: React.MouseEvent<HTMLElement, MouseEvent>;
|
mouse_event: React.MouseEvent<HTMLElement, MouseEvent>;
|
||||||
|
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
import { describe } from "bun:test";
|
|
||||||
import { readAsync } from "fs-jetpack";
|
|
||||||
import { Diff, gunzipAsync } from "./diff";
|
|
||||||
|
|
||||||
import { Packr } from "msgpackr";
|
|
||||||
|
|
||||||
const MAX_HISTORY = 10;
|
|
||||||
|
|
||||||
const packr = new Packr({});
|
|
||||||
|
|
||||||
describe("simple diff", async () => {
|
|
||||||
const server = await Diff.server<any>(await readAsync("tsconfig.json"));
|
|
||||||
const patch = await server.getPatch("new");
|
|
||||||
|
|
||||||
console.log("init", hmn(patch.length));
|
|
||||||
const client = await Diff.client<string>(patch);
|
|
||||||
|
|
||||||
console.log("\npatch1");
|
|
||||||
await server.update("rako12");
|
|
||||||
const patch1 = await server.getPatch(client.ts);
|
|
||||||
await client.applyPatch(patch1);
|
|
||||||
console.log(
|
|
||||||
hmn(patch1.length),
|
|
||||||
`|| client: ${hmn((await client.data).length)}`
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("\npatch2");
|
|
||||||
const bin = await readAsync("data/prod/main.js", "utf8");
|
|
||||||
await server.update(bin);
|
|
||||||
const patch2 = await server.getPatch(client.ts);
|
|
||||||
await client.applyPatch(patch2);
|
|
||||||
console.log(
|
|
||||||
hmn(patch2.length),
|
|
||||||
`|| client: ${hmn((await client.data).length)}`
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("\npatch3");
|
|
||||||
const ubin = "mantappu" + bin?.substring(0,100000);
|
|
||||||
await server.update(ubin);
|
|
||||||
const patch3 = await server.getPatch(client.ts);
|
|
||||||
await client.applyPatch(patch3);
|
|
||||||
console.log(
|
|
||||||
hmn(patch3.length),
|
|
||||||
`|| client: ${hmn((await client.data).length)}`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
function hmn(bytes: number): string {
|
|
||||||
const sizes = ["bytes", "KB", "MB", "GB", "TB"];
|
|
||||||
if (bytes === 0) return "0 bytes";
|
|
||||||
|
|
||||||
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
||||||
const size = i === 0 ? bytes : (bytes / Math.pow(1024, i)).toFixed(2);
|
|
||||||
|
|
||||||
return `${size} ${sizes[i]}`;
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,84 @@
|
||||||
|
import { describe } from "bun:test";
|
||||||
|
import { readAsync } from "fs-jetpack";
|
||||||
|
import { Diff, gunzipAsync } from "./diff";
|
||||||
|
|
||||||
|
import { Packr } from "msgpackr";
|
||||||
|
|
||||||
|
const MAX_HISTORY = 10;
|
||||||
|
|
||||||
|
const packr = new Packr({});
|
||||||
|
|
||||||
|
describe("simple diff", async () => {
|
||||||
|
const json = await readAsync("data/1MB.json", "json") as any[];
|
||||||
|
const server = await Diff.server<any>(json);
|
||||||
|
const patch = await server.getPatch("new");
|
||||||
|
|
||||||
|
console.log("init");
|
||||||
|
const client = await Diff.client<string>(patch);
|
||||||
|
console.log(
|
||||||
|
hmn(patch.length),
|
||||||
|
`|| client: ${hmn(JSON.stringify(await client.data).length)}`
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log("\npatch1");
|
||||||
|
json.shift();
|
||||||
|
json.shift();
|
||||||
|
json.shift();
|
||||||
|
await server.update(json);
|
||||||
|
const patch1 = await server.getPatch(client.ts);
|
||||||
|
await client.applyPatch(patch1);
|
||||||
|
console.log(
|
||||||
|
hmn(patch1.length),
|
||||||
|
`|| client: ${hmn(JSON.stringify(await client.data).length)}`
|
||||||
|
);
|
||||||
|
|
||||||
|
// console.log("\npatch15");
|
||||||
|
// await server.update({ moka: { rako: "1231" } });
|
||||||
|
// const patch15 = await server.getPatch(client.ts);
|
||||||
|
// await client.applyPatch(patch15);
|
||||||
|
// console.log(
|
||||||
|
// hmn(patch15.length),
|
||||||
|
// `|| client: ${JSON.stringify(await client.data)}`
|
||||||
|
// );
|
||||||
|
|
||||||
|
// console.log("\npatch2");
|
||||||
|
// const bin = await readAsync("data/prod/main.js", "utf8");
|
||||||
|
// await server.update(bin);
|
||||||
|
// const patch2 = await server.getPatch(client.ts);
|
||||||
|
// await client.applyPatch(patch2);
|
||||||
|
// console.log(
|
||||||
|
// hmn(patch2.length),
|
||||||
|
// `|| client: ${hmn((await client.data).length)}`
|
||||||
|
// );
|
||||||
|
|
||||||
|
// if (bin) {
|
||||||
|
// console.log("\npatch2.5");
|
||||||
|
// await server.update(bin.substring(0, 10) + "1" + bin.substring(10));
|
||||||
|
// const patch25 = await server.getPatch(client.ts);
|
||||||
|
// await client.applyPatch(patch25);
|
||||||
|
// console.log(
|
||||||
|
// hmn(patch25.length),
|
||||||
|
// `|| client: ${hmn((await client.data).length)}`
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// console.log("\npatch3");
|
||||||
|
// const ubin = "mantappu" + bin?.substring(0, 100000);
|
||||||
|
// await server.update(ubin);
|
||||||
|
// const patch3 = await server.getPatch(client.ts);
|
||||||
|
// await client.applyPatch(patch3);
|
||||||
|
// console.log(
|
||||||
|
// hmn(patch3.length),
|
||||||
|
// `|| client: ${hmn((await client.data).length)}`
|
||||||
|
// );
|
||||||
|
});
|
||||||
|
|
||||||
|
function hmn(bytes: number): string {
|
||||||
|
const sizes = ["bytes", "KB", "MB", "GB", "TB"];
|
||||||
|
if (bytes === 0) return "0 bytes";
|
||||||
|
|
||||||
|
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
||||||
|
const size = i === 0 ? bytes : (bytes / Math.pow(1024, i)).toFixed(2);
|
||||||
|
|
||||||
|
return `${size} ${sizes[i]}`;
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { applyPatch, calcPatch } from "./diff-internal";
|
|
||||||
import { Packr } from "msgpackr";
|
import { Packr } from "msgpackr";
|
||||||
import { gunzip, gzip } from "zlib";
|
import { gunzip, gzip } from "zlib";
|
||||||
|
import { applyPatch, calcPatch } from "./lib/fast-myers-diff";
|
||||||
|
|
||||||
const MAX_HISTORY = 25; // max history item
|
const MAX_HISTORY = 25; // max history item
|
||||||
const MAX_DIFF_TIMEOUT = 50; // in ms
|
const MAX_FMD_TIMEOUT = 100; // in ms
|
||||||
|
|
||||||
const packr = new Packr({});
|
const packr = new Packr({});
|
||||||
|
|
||||||
|
|
@ -12,9 +12,14 @@ type PATCH_RESULT =
|
||||||
mode: "new";
|
mode: "new";
|
||||||
ts: string;
|
ts: string;
|
||||||
data: number[];
|
data: number[];
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
mode: "patch-fmd";
|
||||||
|
ts: string;
|
||||||
|
diff: any;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
mode: "patch";
|
mode: "patch-fd";
|
||||||
ts: string;
|
ts: string;
|
||||||
diff: any;
|
diff: any;
|
||||||
};
|
};
|
||||||
|
|
@ -74,12 +79,13 @@ export class Diff<T> {
|
||||||
return old_data[key1] === this._data[key2];
|
return old_data[key1] === this._data[key2];
|
||||||
},
|
},
|
||||||
() => {
|
() => {
|
||||||
return performance.now() - now > MAX_DIFF_TIMEOUT;
|
return performance.now() - now > MAX_FMD_TIMEOUT;
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
if (performance.now() - now <= MAX_DIFF_TIMEOUT) {
|
if (performance.now() - now <= MAX_FMD_TIMEOUT) {
|
||||||
|
console.log(Math.round(performance.now() - now) + "ms");
|
||||||
done(
|
done(
|
||||||
new Uint8Array(
|
new Uint8Array(
|
||||||
packr.pack({ diff: result_diff, mode: "patch", ts: this.ts })
|
packr.pack({ diff: result_diff, mode: "patch", ts: this.ts })
|
||||||
|
|
@ -100,6 +106,7 @@ export class Diff<T> {
|
||||||
|
|
||||||
async applyPatch(_patch: Uint8Array) {
|
async applyPatch(_patch: Uint8Array) {
|
||||||
const patch = packr.unpack(_patch) as PATCH_RESULT;
|
const patch = packr.unpack(_patch) as PATCH_RESULT;
|
||||||
|
console.log(patch.mode, `size: ${hmn(_patch.length)}`);
|
||||||
if (patch.mode === "new") {
|
if (patch.mode === "new") {
|
||||||
this.ts = patch.ts;
|
this.ts = patch.ts;
|
||||||
if (patch.data) this._data = patch.data;
|
if (patch.data) this._data = patch.data;
|
||||||
|
|
@ -113,7 +120,7 @@ export class Diff<T> {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
num_array.push(num);
|
num_array.push(num);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this._data = num_array;
|
this._data = num_array;
|
||||||
}
|
}
|
||||||
|
|
@ -156,3 +163,13 @@ export const gunzipAsync = (bin: Uint8Array) => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function hmn(bytes: number): string {
|
||||||
|
const sizes = ["bytes", "KB", "MB", "GB", "TB"];
|
||||||
|
if (bytes === 0) return "0 bytes";
|
||||||
|
|
||||||
|
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
||||||
|
const size = i === 0 ? bytes : (bytes / Math.pow(1024, i)).toFixed(2);
|
||||||
|
|
||||||
|
return `${size} ${sizes[i]}`;
|
||||||
|
}
|
||||||
|
|
@ -250,9 +250,13 @@ export function diff_core(
|
||||||
): IterableIterator<Vec4> {
|
): IterableIterator<Vec4> {
|
||||||
const Z = (Math.min(N, M) + 1) * 2;
|
const Z = (Math.min(N, M) + 1) * 2;
|
||||||
const L = N + M;
|
const L = N + M;
|
||||||
const b = new (L < 256 ? Uint8Array : L < 65536 ? Uint16Array : Uint32Array)(
|
|
||||||
2 * Z
|
let constructor: any = Float64Array;
|
||||||
);
|
if (L < 256) constructor = Uint8Array;
|
||||||
|
else if (L < 65536) constructor = Uint16Array;
|
||||||
|
else if (L < 4294967297) constructor = Uint32Array;
|
||||||
|
|
||||||
|
const b = new constructor(2 * Z);
|
||||||
|
|
||||||
return new DiffGen({
|
return new DiffGen({
|
||||||
i,
|
i,
|
||||||
Loading…
Reference in New Issue