1
0
silverbullet/common/spaces/evented_space_primitives.ts

92 lines
2.4 KiB
TypeScript
Raw Normal View History

import { EventHook } from "../../plugos/hooks/event.ts";
import { Plug } from "../../plugos/plug.ts";
2022-04-26 18:31:31 +00:00
import { FileMeta } from "../types.ts";
import { FileData, FileEncoding, SpacePrimitives } from "./space_primitives.ts";
export class EventedSpacePrimitives implements SpacePrimitives {
constructor(private wrapped: SpacePrimitives, private eventHook: EventHook) {}
2022-09-12 12:50:37 +00:00
fetchFileList(): Promise<FileMeta[]> {
return this.wrapped.fetchFileList();
}
proxySyscall(plug: Plug<any>, name: string, args: any[]): Promise<any> {
return this.wrapped.proxySyscall(plug, name, args);
}
invokeFunction(
plug: Plug<any>,
env: string,
name: string,
2022-10-12 09:47:13 +00:00
args: any[],
): Promise<any> {
return this.wrapped.invokeFunction(plug, env, name, args);
}
2022-09-12 12:50:37 +00:00
readFile(
name: string,
2022-10-12 09:47:13 +00:00
encoding: FileEncoding,
2022-09-12 12:50:37 +00:00
): Promise<{ data: FileData; meta: FileMeta }> {
return this.wrapped.readFile(name, encoding);
}
2022-09-12 12:50:37 +00:00
async writeFile(
name: string,
encoding: FileEncoding,
data: FileData,
2023-01-13 14:41:29 +00:00
selfUpdate?: boolean,
2022-09-12 12:50:37 +00:00
): Promise<FileMeta> {
const newMeta = await this.wrapped.writeFile(
name,
encoding,
data,
2022-10-12 09:47:13 +00:00
selfUpdate,
);
// This can happen async
2022-09-12 12:50:37 +00:00
if (name.endsWith(".md")) {
const pageName = name.substring(0, name.length - 3);
let text = "";
switch (encoding) {
2023-01-13 14:41:29 +00:00
case "utf8":
2022-09-12 12:50:37 +00:00
text = data as string;
break;
case "arraybuffer":
{
const decoder = new TextDecoder("utf-8");
text = decoder.decode(data as ArrayBuffer);
}
2022-09-12 12:50:37 +00:00
break;
case "dataurl":
throw Error("Data urls not supported in this context");
}
this.eventHook
2022-09-13 06:41:01 +00:00
.dispatchEvent("page:saved", pageName)
.then(() => {
return this.eventHook.dispatchEvent("page:index_text", {
name: pageName,
text,
});
})
.catch((e) => {
console.error("Error dispatching page:saved event", e);
});
}
2022-09-12 12:50:37 +00:00
return newMeta;
}
2022-09-12 12:50:37 +00:00
getFileMeta(name: string): Promise<FileMeta> {
return this.wrapped.getFileMeta(name);
}
2022-09-12 12:50:37 +00:00
async deleteFile(name: string): Promise<void> {
if (name.endsWith(".md")) {
const pageName = name.substring(0, name.length - 3);
await this.eventHook.dispatchEvent("page:deleted", pageName);
}
return this.wrapped.deleteFile(name);
}
}