From a94724768e01df15cb66d5c3ea19a2eb99f2d6f4 Mon Sep 17 00:00:00 2001 From: Zef Hemel Date: Sun, 20 Aug 2023 17:51:00 +0200 Subject: [PATCH] Refactoring --- .gitignore | 2 - cli/syscalls/space.ts | 22 +++++ common/deps.ts | 2 +- .../spaces/asset_bundle_space_primitives.ts | 2 +- .../spaces/deno_kv_space_primitives.test.ts | 31 +++++++ common/spaces/deno_kv_space_primitives.ts | 83 +++++++++++++++++++ common/spaces/disk_space_primitives.ts | 7 +- common/spaces/evented_space_primitives.ts | 2 +- common/spaces/fallback_space_primitives.ts | 2 +- common/spaces/file_meta_space_primitives.ts | 2 +- common/spaces/filtered_space_primitives.ts | 2 +- common/spaces/http_space_primitives.ts | 2 +- common/spaces/indexeddb_space_primitives.ts | 2 +- common/spaces/plug_space_primitives.ts | 2 +- common/spaces/space_primitives.ts | 4 +- common/spaces/sync.ts | 2 +- common/types.ts | 10 --- plug-api/lib/secrets_page.ts | 8 +- plug-api/silverbullet-syscall/space.ts | 27 +++++- plug-api/types.ts | 9 ++ plugos/syscalls/fs.deno.test.ts | 2 +- plugos/syscalls/fs.deno.ts | 2 +- plugs/core/cloud.ts | 2 +- plugs/federation/federation.ts | 2 +- plugs/search/search.ts | 3 +- scripts/generate_fs_list.ts | 3 +- server/http_server.ts | 2 +- server/spaces/s3_space_primitives.ts | 2 +- silverbullet.ts | 3 +- web/cm_plugins/editor_paste.ts | 2 +- web/constants.ts | 1 + web/service_worker.ts | 2 +- web/space.ts | 2 +- web/syscalls/space.ts | 22 +++++ 34 files changed, 226 insertions(+), 47 deletions(-) create mode 100644 common/spaces/deno_kv_space_primitives.test.ts create mode 100644 common/spaces/deno_kv_space_primitives.ts delete mode 100644 common/types.ts create mode 100644 web/constants.ts diff --git a/.gitignore b/.gitignore index 114e103c..c5cd65a4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,3 @@ node_modules *.db test_space silverbullet -# Local Netlify folder -.netlify diff --git a/cli/syscalls/space.ts b/cli/syscalls/space.ts index d6a70064..56eec281 100644 --- a/cli/syscalls/space.ts +++ b/cli/syscalls/space.ts @@ -1,3 +1,4 @@ +import { FileMeta } from "$sb/types.ts"; import { SysCallMapping } from "../../plugos/system.ts"; import type { Space } from "../../web/space.ts"; import { AttachmentMeta, PageMeta } from "../../web/types.ts"; @@ -57,5 +58,26 @@ export function spaceSyscalls(space: Space): SysCallMapping { "space.deleteAttachment": async (_ctx, name: string) => { await space.deleteAttachment(name); }, + + // FS + "space.listFiles": (): Promise => { + return space.spacePrimitives.fetchFileList(); + }, + "space.getFileMeta": (_ctx, name: string): Promise => { + return space.spacePrimitives.getFileMeta(name); + }, + "space.readFile": async (_ctx, name: string): Promise => { + return (await space.spacePrimitives.readFile(name)).data; + }, + "space.writeFile": ( + _ctx, + name: string, + data: Uint8Array, + ): Promise => { + return space.spacePrimitives.writeFile(name, data); + }, + "space.deleteFile": (_ctx, name: string) => { + return space.spacePrimitives.deleteFile(name); + }, }; } diff --git a/common/deps.ts b/common/deps.ts index be94b7bc..6aa708d8 100644 --- a/common/deps.ts +++ b/common/deps.ts @@ -18,7 +18,7 @@ export { styleTags, Tag, tagHighlighter, tags } from "@lezer/highlight"; export * as YAML from "https://deno.land/std@0.189.0/yaml/mod.ts"; export * as path from "https://deno.land/std@0.189.0/path/mod.ts"; -export { readAll } from "https://deno.land/std@0.165.0/streams/conversion.ts"; +// export { readAll } from "https://deno.land/std@0.165.0/streams/conversion.ts"; export type { BlockContext, diff --git a/common/spaces/asset_bundle_space_primitives.ts b/common/spaces/asset_bundle_space_primitives.ts index c2e42b25..e963d66c 100644 --- a/common/spaces/asset_bundle_space_primitives.ts +++ b/common/spaces/asset_bundle_space_primitives.ts @@ -1,6 +1,6 @@ -import { FileMeta } from "../types.ts"; import { SpacePrimitives } from "./space_primitives.ts"; import { AssetBundle } from "../../plugos/asset_bundle/bundle.ts"; +import { FileMeta } from "$sb/types.ts"; export class AssetBundlePlugSpacePrimitives implements SpacePrimitives { constructor( diff --git a/common/spaces/deno_kv_space_primitives.test.ts b/common/spaces/deno_kv_space_primitives.test.ts new file mode 100644 index 00000000..9993fba4 --- /dev/null +++ b/common/spaces/deno_kv_space_primitives.test.ts @@ -0,0 +1,31 @@ +import { assertEquals } from "../../test_deps.ts"; +import { DenoKVSpacePrimitives } from "./deno_kv_space_primitives.ts"; + +Deno.test("deno_kv_space_primitives", async () => { + const tempFile = await Deno.makeTempFile({ suffix: ".db" }); + const spacePrimitives = new DenoKVSpacePrimitives(); + await spacePrimitives.init(tempFile); + await spacePrimitives.writeFile("test.txt", new TextEncoder().encode("test")); + let result = await spacePrimitives.readFile("test.txt"); + assertEquals(result.data, new TextEncoder().encode("test")); + let listing = await spacePrimitives.fetchFileList(); + assertEquals(listing.length, 1); + await spacePrimitives.writeFile( + "test.txt", + new TextEncoder().encode("test2"), + ); + result = await spacePrimitives.readFile("test.txt"); + assertEquals(result.data, new TextEncoder().encode("test2")); + await spacePrimitives.deleteFile("test.txt"); + listing = await spacePrimitives.fetchFileList(); + try { + await spacePrimitives.readFile("test.txt"); + throw new Error("Should not be here"); + } catch (e: any) { + assertEquals(e.message, "Not found"); + } + assertEquals(listing.length, 0); + + spacePrimitives.close(); + await Deno.remove(tempFile); +}); diff --git a/common/spaces/deno_kv_space_primitives.ts b/common/spaces/deno_kv_space_primitives.ts new file mode 100644 index 00000000..5fb24a30 --- /dev/null +++ b/common/spaces/deno_kv_space_primitives.ts @@ -0,0 +1,83 @@ +/// + +import { FileMeta } from "$sb/types.ts"; +import type { SpacePrimitives } from "./space_primitives.ts"; +import { mime } from "https://deno.land/x/mimetypes@v1.0.0/mod.ts"; + +export class DenoKVSpacePrimitives implements SpacePrimitives { + private kv!: Deno.Kv; + private dataAttribute = "file"; + private metaAttribute = "meta"; + + async init(path?: string) { + this.kv = await Deno.openKv(path); + } + + close() { + this.kv.close(); + } + + async fetchFileList(): Promise { + const results: FileMeta[] = []; + for await ( + const result of this.kv.list({ + prefix: [this.metaAttribute], + }) + ) { + results.push(result.value as FileMeta); + } + return results; + } + async readFile(name: string): Promise<{ data: Uint8Array; meta: FileMeta }> { + const [meta, data] = await this.kv.getMany([[this.metaAttribute, name], [ + this.dataAttribute, + name, + ]]); + if (!meta.value) { + throw new Error("Not found"); + } + return { + data: data.value as Uint8Array, + meta: meta.value as FileMeta, + }; + } + async getFileMeta(name: string): Promise { + const result = await this.kv.get([this.metaAttribute, name]); + if (result.value) { + return result.value as FileMeta; + } else { + throw new Error("Not found"); + } + } + async writeFile( + name: string, + data: Uint8Array, + _selfUpdate?: boolean | undefined, + suggestedMeta?: FileMeta | undefined, + ): Promise { + const meta: FileMeta = { + name, + lastModified: suggestedMeta?.lastModified || Date.now(), + contentType: mime.getType(name) || "application/octet-stream", + size: data.byteLength, + perm: suggestedMeta?.perm || "rw", + }; + const res = await this.kv.atomic() + .set([this.dataAttribute, name], data) + .set([this.metaAttribute, name], meta) + .commit(); + if (!res.ok) { + throw res; + } + return meta; + } + async deleteFile(name: string): Promise { + const res = await this.kv.atomic() + .delete([this.dataAttribute, name]) + .delete([this.metaAttribute, name]) + .commit(); + if (!res.ok) { + throw res; + } + } +} diff --git a/common/spaces/disk_space_primitives.ts b/common/spaces/disk_space_primitives.ts index c7d015ea..6ce8feaa 100644 --- a/common/spaces/disk_space_primitives.ts +++ b/common/spaces/disk_space_primitives.ts @@ -1,10 +1,9 @@ -// import { mkdir, readdir, readFile, stat, unlink, writeFile } from "fs/promises"; -import { path } from "../deps.ts"; -import { readAll } from "../deps.ts"; -import { FileMeta } from "../types.ts"; +import * as path from "https://deno.land/std@0.189.0/path/mod.ts"; +import { readAll } from "https://deno.land/std@0.165.0/streams/conversion.ts"; import { SpacePrimitives } from "./space_primitives.ts"; import { mime } from "https://deno.land/x/mimetypes@v1.0.0/mod.ts"; import { walk } from "https://deno.land/std@0.198.0/fs/walk.ts"; +import { FileMeta } from "$sb/types.ts"; function lookupContentType(path: string): string { return mime.getType(path) || "application/octet-stream"; diff --git a/common/spaces/evented_space_primitives.ts b/common/spaces/evented_space_primitives.ts index 6e03a89e..18f28658 100644 --- a/common/spaces/evented_space_primitives.ts +++ b/common/spaces/evented_space_primitives.ts @@ -1,6 +1,6 @@ +import { FileMeta } from "$sb/types.ts"; import { EventHook } from "../../plugos/hooks/event.ts"; -import { FileMeta } from "../types.ts"; import type { SpacePrimitives } from "./space_primitives.ts"; export class EventedSpacePrimitives implements SpacePrimitives { diff --git a/common/spaces/fallback_space_primitives.ts b/common/spaces/fallback_space_primitives.ts index dc0f98d1..964ba2e9 100644 --- a/common/spaces/fallback_space_primitives.ts +++ b/common/spaces/fallback_space_primitives.ts @@ -1,4 +1,4 @@ -import { FileMeta } from "../types.ts"; +import { FileMeta } from "$sb/types.ts"; import type { SpacePrimitives } from "./space_primitives.ts"; /** diff --git a/common/spaces/file_meta_space_primitives.ts b/common/spaces/file_meta_space_primitives.ts index a0a9a434..7fa4c002 100644 --- a/common/spaces/file_meta_space_primitives.ts +++ b/common/spaces/file_meta_space_primitives.ts @@ -1,6 +1,6 @@ -import { FileMeta } from "../types.ts"; import { SpacePrimitives } from "./space_primitives.ts"; import type { SysCallMapping } from "../../plugos/system.ts"; +import { FileMeta } from "$sb/types.ts"; // Enriches the file list listing with custom metadata from the page index export class FileMetaSpacePrimitives implements SpacePrimitives { diff --git a/common/spaces/filtered_space_primitives.ts b/common/spaces/filtered_space_primitives.ts index 947bad5e..6b3ce05f 100644 --- a/common/spaces/filtered_space_primitives.ts +++ b/common/spaces/filtered_space_primitives.ts @@ -1,4 +1,4 @@ -import { FileMeta } from "../types.ts"; +import { FileMeta } from "$sb/types.ts"; import { SpacePrimitives } from "./space_primitives.ts"; export class FilteredSpacePrimitives implements SpacePrimitives { diff --git a/common/spaces/http_space_primitives.ts b/common/spaces/http_space_primitives.ts index 49a3e046..07bf1400 100644 --- a/common/spaces/http_space_primitives.ts +++ b/common/spaces/http_space_primitives.ts @@ -1,6 +1,6 @@ -import { FileMeta } from "../types.ts"; import { SpacePrimitives } from "./space_primitives.ts"; import { flushCachesAndUnregisterServiceWorker } from "../sw_util.ts"; +import { FileMeta } from "$sb/types.ts"; export class HttpSpacePrimitives implements SpacePrimitives { constructor( diff --git a/common/spaces/indexeddb_space_primitives.ts b/common/spaces/indexeddb_space_primitives.ts index ca862881..7dcaae2a 100644 --- a/common/spaces/indexeddb_space_primitives.ts +++ b/common/spaces/indexeddb_space_primitives.ts @@ -1,7 +1,7 @@ -import type { FileMeta } from "../types.ts"; import type { SpacePrimitives } from "./space_primitives.ts"; import Dexie, { Table } from "dexie"; import { mime } from "../deps.ts"; +import { FileMeta } from "$sb/types.ts"; export type FileContent = { name: string; diff --git a/common/spaces/plug_space_primitives.ts b/common/spaces/plug_space_primitives.ts index 921b0ad3..169f0201 100644 --- a/common/spaces/plug_space_primitives.ts +++ b/common/spaces/plug_space_primitives.ts @@ -1,5 +1,5 @@ import { SpacePrimitives } from "../../common/spaces/space_primitives.ts"; -import { FileMeta } from "../../common/types.ts"; +import { FileMeta } from "$sb/types.ts"; import { NamespaceOperation, PlugNamespaceHook, diff --git a/common/spaces/space_primitives.ts b/common/spaces/space_primitives.ts index 891cd4d9..ec3cbd4e 100644 --- a/common/spaces/space_primitives.ts +++ b/common/spaces/space_primitives.ts @@ -1,8 +1,8 @@ -import type { FileMeta } from "../types.ts"; - // export type FileEncoding = "utf8" | "arraybuffer" | "dataurl"; // export type FileData = ArrayBuffer | string; +import { FileMeta } from "$sb/types.ts"; + export interface SpacePrimitives { // Returns a list of file meta data as well as the timestamp of this snapshot fetchFileList(): Promise; diff --git a/common/spaces/sync.ts b/common/spaces/sync.ts index 43515e20..e7f2036e 100644 --- a/common/spaces/sync.ts +++ b/common/spaces/sync.ts @@ -1,9 +1,9 @@ import { renderToText, replaceNodesMatching } from "../../plug-api/lib/tree.ts"; import buildMarkdown from "../markdown_parser/parser.ts"; import { parse } from "../markdown_parser/parse_tree.ts"; -import type { FileMeta } from "../types.ts"; import { SpacePrimitives } from "./space_primitives.ts"; import { EventEmitter } from "../../plugos/event.ts"; +import { FileMeta } from "$sb/types.ts"; type SyncHash = number; diff --git a/common/types.ts b/common/types.ts deleted file mode 100644 index 404e778c..00000000 --- a/common/types.ts +++ /dev/null @@ -1,10 +0,0 @@ -export const maximumAttachmentSize = 20 * 1024 * 1024; // 10 MB - -export type FileMeta = { - name: string; - lastModified: number; - contentType: string; - size: number; - perm: "ro" | "rw"; - noSync?: boolean; -} & Record; diff --git a/plug-api/lib/secrets_page.ts b/plug-api/lib/secrets_page.ts index 93012cea..3ad1f050 100644 --- a/plug-api/lib/secrets_page.ts +++ b/plug-api/lib/secrets_page.ts @@ -5,10 +5,10 @@ import { readYamlPage } from "./yaml_page.ts"; // of not decising this SECRETS page to other places export async function readSecrets(keys: string[]): Promise { try { - let allSecrets = await readYamlPage("SECRETS", ["yaml", "secrets"]); - let collectedSecrets: any[] = []; - for (let key of keys) { - let secret = allSecrets[key]; + const allSecrets = await readYamlPage("SECRETS", ["yaml", "secrets"]); + const collectedSecrets: any[] = []; + for (const key of keys) { + const secret = allSecrets[key]; if (secret) { collectedSecrets.push(secret); } else { diff --git a/plug-api/silverbullet-syscall/space.ts b/plug-api/silverbullet-syscall/space.ts index 93ea1351..a5662ce3 100644 --- a/plug-api/silverbullet-syscall/space.ts +++ b/plug-api/silverbullet-syscall/space.ts @@ -1,5 +1,6 @@ import { syscall } from "./syscall.ts"; import type { AttachmentMeta, PageMeta } from "../../web/types.ts"; +import { FileMeta } from "$sb/types.ts"; export function listPages(unfiltered = false): Promise { return syscall("space.listPages", unfiltered); @@ -27,7 +28,7 @@ export function listPlugs(): Promise { return syscall("space.listPlugs"); } -export function listAttachments(): Promise { +export function listAttachments(): Promise { return syscall("space.listAttachments"); } @@ -66,3 +67,27 @@ export function writeAttachment( export function deleteAttachment(name: string): Promise { return syscall("space.deleteAttachment", name); } + +// FS +export function listFiles(): Promise { + return syscall("space.listFiles"); +} + +export function readFile(name: string): Promise { + return syscall("space.readFile", name); +} + +export function getFileMeta(name: string): Promise { + return syscall("space.getFileMeta", name); +} + +export function writeFile( + name: string, + data: Uint8Array, +): Promise { + return syscall("space.writeFile", name, data); +} + +export function deleteFile(name: string): Promise { + return syscall("space.deleteFile", name); +} diff --git a/plug-api/types.ts b/plug-api/types.ts index 06627150..b6cdb64d 100644 --- a/plug-api/types.ts +++ b/plug-api/types.ts @@ -10,3 +10,12 @@ export type QueueStats = { processing: number; dlq: number; }; + +export type FileMeta = { + name: string; + lastModified: number; + contentType: string; + size: number; + perm: "ro" | "rw"; + noSync?: boolean; +} & Record; diff --git a/plugos/syscalls/fs.deno.test.ts b/plugos/syscalls/fs.deno.test.ts index 9b20b6dc..b7f728cc 100644 --- a/plugos/syscalls/fs.deno.test.ts +++ b/plugos/syscalls/fs.deno.test.ts @@ -1,5 +1,5 @@ +import { FileMeta } from "$sb/types.ts"; import { assert } from "../../test_deps.ts"; -import { FileMeta } from "../../common/types.ts"; import { path } from "../deps.ts"; import fileSystemSyscalls from "./fs.deno.ts"; diff --git a/plugos/syscalls/fs.deno.ts b/plugos/syscalls/fs.deno.ts index 46cd5907..9836dce1 100644 --- a/plugos/syscalls/fs.deno.ts +++ b/plugos/syscalls/fs.deno.ts @@ -1,7 +1,7 @@ import type { SysCallMapping } from "../system.ts"; import { mime, path, walk } from "../deps.ts"; import { base64DecodeDataUrl, base64Encode } from "../asset_bundle/base64.ts"; -import { FileMeta } from "../../common/types.ts"; +import { FileMeta } from "$sb/types.ts"; export default function fileSystemSyscalls(root = "/"): SysCallMapping { function resolvedPath(p: string): string { diff --git a/plugs/core/cloud.ts b/plugs/core/cloud.ts index 96be1d54..993ff0b0 100644 --- a/plugs/core/cloud.ts +++ b/plugs/core/cloud.ts @@ -1,6 +1,6 @@ import { renderToText, replaceNodesMatching } from "$sb/lib/tree.ts"; -import type { FileMeta } from "../../common/types.ts"; import { parseMarkdown } from "$sb/silverbullet-syscall/markdown.ts"; +import { FileMeta } from "$sb/types.ts"; export const cloudPrefix = "💭 "; diff --git a/plugs/federation/federation.ts b/plugs/federation/federation.ts index 99986db2..1da15ef3 100644 --- a/plugs/federation/federation.ts +++ b/plugs/federation/federation.ts @@ -1,8 +1,8 @@ import "$sb/lib/fetch.ts"; -import type { FileMeta } from "../../common/types.ts"; import { federatedPathToUrl } from "$sb/lib/resolve.ts"; import { readFederationConfigs } from "./config.ts"; import { store } from "$sb/plugos-syscall/mod.ts"; +import { FileMeta } from "$sb/types.ts"; async function responseToFileMeta( r: Response, diff --git a/plugs/search/search.ts b/plugs/search/search.ts index 7fd65d35..b488cd12 100644 --- a/plugs/search/search.ts +++ b/plugs/search/search.ts @@ -3,9 +3,8 @@ import { renderToText } from "$sb/lib/tree.ts"; import { store } from "$sb/plugos-syscall/mod.ts"; import { applyQuery } from "$sb/lib/query.ts"; import { editor, index } from "$sb/silverbullet-syscall/mod.ts"; -import { base64EncodedDataUrl } from "../../plugos/asset_bundle/base64.ts"; import { BatchKVStore, SimpleSearchEngine } from "./engine.ts"; -import { FileMeta } from "../../common/types.ts"; +import { FileMeta } from "$sb/types.ts"; const searchPrefix = "🔍 "; diff --git a/scripts/generate_fs_list.ts b/scripts/generate_fs_list.ts index 93d0dc04..73624304 100644 --- a/scripts/generate_fs_list.ts +++ b/scripts/generate_fs_list.ts @@ -1,8 +1,7 @@ -import type { FileMeta } from "../common/types.ts"; - import { walk } from "https://deno.land/std@0.165.0/fs/mod.ts"; import { resolve } from "https://deno.land/std@0.165.0/path/mod.ts"; import { mime } from "https://deno.land/x/mimetypes@v1.0.0/mod.ts"; +import { FileMeta } from "$sb/types.ts"; const rootDir = resolve("website_build"); diff --git a/server/http_server.ts b/server/http_server.ts index 4d5765cc..36e80f00 100644 --- a/server/http_server.ts +++ b/server/http_server.ts @@ -7,7 +7,7 @@ import { BuiltinSettings } from "../web/types.ts"; import { gitIgnoreCompiler } from "./deps.ts"; import { FilteredSpacePrimitives } from "../common/spaces/filtered_space_primitives.ts"; import { Authenticator } from "./auth.ts"; -import { FileMeta } from "../common/types.ts"; +import { FileMeta } from "$sb/types.ts"; export type ServerOptions = { hostname: string; diff --git a/server/spaces/s3_space_primitives.ts b/server/spaces/s3_space_primitives.ts index 1d36d648..20f51c54 100644 --- a/server/spaces/s3_space_primitives.ts +++ b/server/spaces/s3_space_primitives.ts @@ -2,8 +2,8 @@ import { S3Client } from "https://deno.land/x/s3_lite_client@0.4.0/mod.ts"; import type { ClientOptions } from "https://deno.land/x/s3_lite_client@0.4.0/client.ts"; import { SpacePrimitives } from "../../common/spaces/space_primitives.ts"; -import { FileMeta } from "../../common/types.ts"; import { mime } from "../deps.ts"; +import { FileMeta } from "$sb/types.ts"; export class S3SpacePrimitives implements SpacePrimitives { client: S3Client; diff --git a/silverbullet.ts b/silverbullet.ts index 29fb7cbb..ad273001 100755 --- a/silverbullet.ts +++ b/silverbullet.ts @@ -1,4 +1,5 @@ import.meta.main = false; +// import { Command } from "https://deno.land/x/cliffy@v1.0.0-rc.3/command/command.ts"; import { Command } from "https://deno.land/x/cliffy@v0.25.2/command/command.ts"; import { version } from "./version.ts"; @@ -30,7 +31,7 @@ await new Command() .option("-p, --port ", "Port to listen on") .option( "--user ", - "'username:password' combo for BasicAuth authentication", + "'username:password' combo for authentication", ) .option( "--auth ", diff --git a/web/cm_plugins/editor_paste.ts b/web/cm_plugins/editor_paste.ts index d739f53a..5666dbd5 100644 --- a/web/cm_plugins/editor_paste.ts +++ b/web/cm_plugins/editor_paste.ts @@ -1,5 +1,4 @@ import { EditorView, syntaxTree, ViewPlugin, ViewUpdate } from "../deps.ts"; -import { maximumAttachmentSize } from "../../common/types.ts"; import { Client } from "../client.ts"; // We use turndown to convert HTML to Markdown @@ -18,6 +17,7 @@ import { nodeAtPos, } from "../../plug-api/lib/tree.ts"; import { folderName, resolve } from "../../common/path.ts"; +import { maximumAttachmentSize } from "../constants.ts"; const turndownService = new TurndownService({ hr: "---", diff --git a/web/constants.ts b/web/constants.ts new file mode 100644 index 00000000..26d93777 --- /dev/null +++ b/web/constants.ts @@ -0,0 +1 @@ +export const maximumAttachmentSize = 1024 * 1024 * 10; // 10MB diff --git a/web/service_worker.ts b/web/service_worker.ts index f50ea00a..73f04591 100644 --- a/web/service_worker.ts +++ b/web/service_worker.ts @@ -2,7 +2,7 @@ import Dexie from "https://esm.sh/v120/dexie@3.2.2/dist/dexie.js"; import type { FileContent } from "../common/spaces/indexeddb_space_primitives.ts"; import { simpleHash } from "../common/crypto.ts"; -import type { FileMeta } from "../common/types.ts"; +import { FileMeta } from "$sb/types.ts"; const CACHE_NAME = "{{CACHE_NAME}}"; diff --git a/web/space.ts b/web/space.ts index f8ed909e..86d4110c 100644 --- a/web/space.ts +++ b/web/space.ts @@ -1,11 +1,11 @@ import { SpacePrimitives } from "../common/spaces/space_primitives.ts"; -import { FileMeta } from "../common/types.ts"; import { EventEmitter } from "../plugos/event.ts"; import { plugPrefix } from "../common/spaces/constants.ts"; import { safeRun } from "../common/util.ts"; import { AttachmentMeta, PageMeta } from "./types.ts"; import { throttle } from "../common/async_util.ts"; import { KVStore } from "../plugos/lib/kv_store.ts"; +import { FileMeta } from "$sb/types.ts"; export type SpaceEvents = { pageCreated: (meta: PageMeta) => void; diff --git a/web/syscalls/space.ts b/web/syscalls/space.ts index 644b079c..56850322 100644 --- a/web/syscalls/space.ts +++ b/web/syscalls/space.ts @@ -1,6 +1,7 @@ import { Client } from "../client.ts"; import { SysCallMapping } from "../../plugos/system.ts"; import { AttachmentMeta, PageMeta } from "../types.ts"; +import { FileMeta } from "$sb/types.ts"; export function spaceSyscalls(editor: Client): SysCallMapping { return { @@ -61,5 +62,26 @@ export function spaceSyscalls(editor: Client): SysCallMapping { "space.deleteAttachment": async (_ctx, name: string) => { await editor.space.deleteAttachment(name); }, + + // FS + "space.listFiles": (): Promise => { + return editor.space.spacePrimitives.fetchFileList(); + }, + "space.getFileMeta": (_ctx, name: string): Promise => { + return editor.space.spacePrimitives.getFileMeta(name); + }, + "space.readFile": async (_ctx, name: string): Promise => { + return (await editor.space.spacePrimitives.readFile(name)).data; + }, + "space.writeFile": ( + _ctx, + name: string, + data: Uint8Array, + ): Promise => { + return editor.space.spacePrimitives.writeFile(name, data); + }, + "space.deleteFile": (_ctx, name: string) => { + return editor.space.spacePrimitives.deleteFile(name); + }, }; }