import { SpacePrimitives } from "./space_primitives"; import { EventHook } from "../../plugos/hooks/event"; import { PageMeta } from "../types"; import { Plug } from "../../plugos/plug"; import { trashPrefix } from "./constants"; export class EventedSpacePrimitives implements SpacePrimitives { constructor(private wrapped: SpacePrimitives, private eventHook: EventHook) {} fetchPageList(): Promise<{ pages: Set; nowTimestamp: number }> { return this.wrapped.fetchPageList(); } proxySyscall(plug: Plug, name: string, args: any[]): Promise { return this.wrapped.proxySyscall(plug, name, args); } invokeFunction( plug: Plug, env: string, name: string, args: any[] ): Promise { return this.wrapped.invokeFunction(plug, env, name, args); } readPage(pageName: string): Promise<{ text: string; meta: PageMeta }> { return this.wrapped.readPage(pageName); } async writePage( pageName: string, text: string, selfUpdate: boolean, lastModified?: number ): Promise { const newPageMeta = await this.wrapped.writePage( pageName, text, selfUpdate, lastModified ); // This can happen async if (!pageName.startsWith(trashPrefix)) { this.eventHook .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); }); } return newPageMeta; } getPageMeta(pageName: string): Promise { return this.wrapped.getPageMeta(pageName); } async deletePage(pageName: string): Promise { await this.eventHook.dispatchEvent("page:deleted", pageName); return this.wrapped.deletePage(pageName); } }