Real-time collaboration within space (#411)

This commit is contained in:
Zef Hemel
2023-06-13 20:47:05 +02:00
committed by GitHub
parent 063a8e4767
commit 8e0a7cf177
54 changed files with 1358 additions and 187 deletions
+1 -1
View File
@@ -61,7 +61,7 @@ export {
} from "@codemirror/view";
export type { DecorationSet, KeyBinding } from "@codemirror/view";
export { markdown } from "https://esm.sh/@codemirror/lang-markdown@6.1.1?external=@codemirror/state,@lezer/common,@codemirror/language,@lezer/markdown,@codemirror/view,@lezer/highlight,@@codemirror/lang-html";
export { markdown } from "https://esm.sh/@codemirror/lang-markdown@6.1.1?external=@codemirror/state,@lezer/common,@codemirror/language,@lezer/markdown,@codemirror/view,@lezer/highlight,@codemirror/lang-html";
export {
EditorSelection,
@@ -1,9 +1,7 @@
import { FileMeta } from "../types.ts";
import { SpacePrimitives } from "./space_primitives.ts";
import { AssetBundle } from "../../plugos/asset_bundle/bundle.ts";
import { mime } from "../deps.ts";
const bootTime = Date.now();
export class AssetBundlePlugSpacePrimitives implements SpacePrimitives {
constructor(
private wrapped: SpacePrimitives,
@@ -16,8 +14,8 @@ export class AssetBundlePlugSpacePrimitives implements SpacePrimitives {
return this.assetBundle.listFiles()
.map((p) => ({
name: p,
contentType: mime.getType(p) || "application/octet-stream",
lastModified: bootTime,
contentType: this.assetBundle.getMimeType(p),
lastModified: this.assetBundle.getMtime(p),
perm: "ro",
size: -1,
} as FileMeta)).concat(files);
@@ -32,10 +30,10 @@ export class AssetBundlePlugSpacePrimitives implements SpacePrimitives {
return Promise.resolve({
data,
meta: {
lastModified: bootTime,
contentType: this.assetBundle.getMimeType(name),
lastModified: this.assetBundle.getMtime(name),
size: data.byteLength,
perm: "ro",
contentType: this.assetBundle.getMimeType(name),
} as FileMeta,
});
}
@@ -46,10 +44,10 @@ export class AssetBundlePlugSpacePrimitives implements SpacePrimitives {
if (this.assetBundle.has(name)) {
const data = this.assetBundle.readFileSync(name);
return Promise.resolve({
lastModified: bootTime,
contentType: this.assetBundle.getMimeType(name),
lastModified: this.assetBundle.getMtime(name),
size: data.byteLength,
perm: "ro",
contentType: this.assetBundle.getMimeType(name),
} as FileMeta);
}
return this.wrapped.getFileMeta(name);
+1 -1
View File
@@ -63,7 +63,7 @@ export class DiskSpacePrimitives implements SpacePrimitives {
};
} catch {
// console.error("Error while reading file", name, e);
throw Error(`Could not read file ${name}`);
throw Error("Not found");
}
}
+1 -1
View File
@@ -36,7 +36,7 @@ export class EventedSpacePrimitives implements SpacePrimitives {
text = decoder.decode(data);
this.eventHook
.dispatchEvent("page:saved", pageName)
.dispatchEvent("page:saved", pageName, newMeta)
.then(() => {
return this.eventHook.dispatchEvent("page:index_text", {
name: pageName,
+7 -1
View File
@@ -37,7 +37,10 @@ export class SpaceSync {
) {
}
async syncFiles(snapshot: Map<string, SyncStatusItem>): Promise<number> {
async syncFiles(
snapshot: Map<string, SyncStatusItem>,
isSyncCandidate = this.options.isSyncCandidate,
): Promise<number> {
let operations = 0;
console.log("[sync]", "Fetching snapshot from primary");
const primaryAllPages = this.syncCandidates(
@@ -73,6 +76,9 @@ export class SpaceSync {
// console.log("[sync]", "Iterating over all files");
let filesProcessed = 0;
for (const name of sortedFilenames) {
if (isSyncCandidate && !isSyncCandidate(name)) {
continue;
}
try {
operations += await this.syncFile(
snapshot,
+12 -7
View File
@@ -41,14 +41,19 @@ export async function ensureSettingsAndIndex(
settingsText = new TextDecoder().decode(
(await space.readFile("SETTINGS.md")).data,
);
} catch {
await space.writeFile(
"SETTINGS.md",
new TextEncoder().encode(SETTINGS_TEMPLATE),
true,
);
} catch (e: any) {
if (e.message === "Not found") {
await space.writeFile(
"SETTINGS.md",
new TextEncoder().encode(SETTINGS_TEMPLATE),
true,
);
} else {
console.error("Error reading settings", e.message);
console.error("Falling back to default settings");
}
settingsText = SETTINGS_TEMPLATE;
// Ok, then let's also write the index page
// Ok, then let's also check the index page
try {
await space.getFileMeta("index.md");
} catch {