@dxos/random-access-storage 0.4.0 → 0.4.1-main.2495eb8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +34 -22
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +4 -1
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/browser/bench.browser.test.d.ts +2 -0
- package/dist/types/src/browser/bench.browser.test.d.ts.map +1 -0
- package/dist/types/src/browser/storage.browser.test.d.ts +2 -0
- package/dist/types/src/browser/storage.browser.test.d.ts.map +1 -0
- package/dist/types/src/browser/web-fs.d.ts +1 -1
- package/dist/types/src/browser/web-fs.d.ts.map +1 -1
- package/dist/types/src/common/abstract-storage.d.ts +1 -0
- package/dist/types/src/common/abstract-storage.d.ts.map +1 -1
- package/dist/types/src/common/storage.d.ts +1 -0
- package/dist/types/src/common/storage.d.ts.map +1 -1
- package/dist/types/src/node/bench.node.test.d.ts +2 -0
- package/dist/types/src/node/bench.node.test.d.ts.map +1 -0
- package/dist/types/src/node/storage.node.test.d.ts +2 -0
- package/dist/types/src/node/storage.node.test.d.ts.map +1 -0
- package/dist/types/src/testing/benchmark.blueprint-test.d.ts +1 -1
- package/dist/types/src/testing/benchmark.blueprint-test.d.ts.map +1 -1
- package/dist/types/src/testing/storage.blueprint-test.d.ts +1 -1
- package/dist/types/src/testing/storage.blueprint-test.d.ts.map +1 -1
- package/dist/types/src/testing/wait-for-debugger.d.ts +6 -0
- package/dist/types/src/testing/wait-for-debugger.d.ts.map +1 -0
- package/package.json +9 -9
- package/src/browser/{bench.test.ts → bench.browser.test.ts} +2 -4
- package/src/browser/{storage.test.ts → storage.browser.test.ts} +1 -8
- package/src/browser/web-fs.ts +30 -9
- package/src/common/abstract-storage.ts +4 -0
- package/src/common/storage.ts +1 -0
- package/src/node/{bench.test.ts → bench.node.test.ts} +8 -7
- package/src/node/{storage.test.ts → storage.node.test.ts} +8 -7
- package/src/testing/benchmark.blueprint-test.ts +3 -3
- package/src/testing/storage.blueprint-test.ts +36 -34
- package/src/testing/wait-for-debugger.ts +22 -0
- package/dist/types/src/browser/bench.test.d.ts +0 -2
- package/dist/types/src/browser/bench.test.d.ts.map +0 -1
- package/dist/types/src/browser/storage.test.d.ts +0 -2
- package/dist/types/src/browser/storage.test.d.ts.map +0 -1
- package/dist/types/src/node/bench.test.d.ts +0 -2
- package/dist/types/src/node/bench.test.d.ts.map +0 -1
- package/dist/types/src/node/storage.test.d.ts +0 -2
- package/dist/types/src/node/storage.test.d.ts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/common/abstract-storage.ts", "../../../src/common/utils.ts", "../../../src/common/directory.ts", "../../../src/common/file.ts", "../../../src/common/memory-storage.ts", "../../../src/common/storage.ts", "../../../src/node/node-storage.ts", "../../../src/node/storage.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nimport { join } from 'node:path';\nimport { inspect } from 'node:util';\nimport type { RandomAccessStorage } from 'random-access-storage';\n\nimport { inspectObject } from '@dxos/debug';\nimport { log } from '@dxos/log';\n\nimport { Directory } from './directory';\nimport { type File, wrapFile } from './file';\nimport { type Storage, type StorageType } from './storage';\nimport { getFullPath } from './utils';\n\n/**\n * Base class for all storage implementations.\n * https://github.com/random-access-storage\n * https://github.com/random-access-storage/random-access-storage\n */\nexport abstract class AbstractStorage implements Storage {\n protected readonly _files = new Map<string, File>();\n\n public abstract readonly type: StorageType;\n\n // TODO(burdon): Make required.\n constructor(public readonly path: string) {}\n\n [inspect.custom]() {\n return inspectObject(this);\n }\n\n toJSON() {\n return { type: this.type, path: this.path };\n }\n\n public get size() {\n return this._files.size;\n }\n\n // TODO(burdon): Make required.\n public createDirectory(sub = ''): Directory {\n // invariant(sub.length);\n return new Directory({\n type: this.type,\n path: getFullPath(this.path, sub),\n list: this._list.bind(this),\n getOrCreateFile: (...args) => this.getOrCreateFile(...args),\n remove: () => this._remove(sub),\n });\n }\n\n /**\n * Delete all files.\n */\n async reset() {\n try {\n log.info('Erasing all data...');\n await this._closeFilesInPath('');\n await this._remove('');\n await this._destroy();\n log('Erased...');\n } catch (err: any) {\n log.catch(err);\n }\n }\n\n protected async _list(path: string): Promise<string[]> {\n // TODO(dmaretskyi): Fix me.\n return Array.from((await this._getFiles(path)).keys()).map((filename) => {\n let name = filename.replace(path, '');\n if (name.startsWith('/')) {\n name = name.substring(1);\n }\n return name;\n });\n }\n\n protected getOrCreateFile(path: string, filename: string, opts?: any): File {\n const fullPath = join(path, filename);\n\n let native;\n let file = this._getFileIfExists(fullPath);\n if (file) {\n if (!file.closed) {\n return file;\n }\n\n native = this._openFile(file.native);\n }\n\n if (!native) {\n native = this._createFile(path, filename, opts);\n }\n\n file = wrapFile(native, this.type);\n this._files.set(fullPath, file);\n return file;\n }\n\n protected _destroy(): Promise<void> | undefined {\n return undefined;\n }\n\n /**\n * Attempt to reopen file.\n */\n protected _openFile(file: RandomAccessStorage): RandomAccessStorage | undefined {\n return undefined;\n }\n\n protected abstract _createFile(path: string, filename: string, opts?: any): RandomAccessStorage;\n\n private _getFileIfExists(filename: string): File | undefined {\n if (this._files.has(filename)) {\n const file = this._files.get(filename);\n if (file && !file.destroyed) {\n return file;\n }\n }\n }\n\n protected async _getFiles(path: string): Promise<Map<string, File>> {\n const fullPath = getFullPath(this.path, path);\n return new Map(\n [...this._files.entries()].filter(([path, file]) => path.includes(fullPath) && file.destroyed !== true),\n );\n }\n\n private async _closeFilesInPath(path: string): Promise<void> {\n await Promise.all(\n Array.from((await this._getFiles(path)).values()).map((file) => file.close().catch((err: any) => log.catch(err))),\n );\n }\n\n // TODO(burdon): Delete directory (not just listed files).\n protected async _remove(path: string): Promise<void> {\n await Promise.all(\n Array.from(await this._getFiles(path)).map(([path, file]) => {\n return file\n .destroy()\n .then(() => this._files.delete(path))\n .catch((err: any) => log.error(err.message));\n }),\n );\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { join } from 'node:path';\n\n// TODO(burdon): Document.\nexport const stringDiff = (first: string, second: string) => first.split(second).join('');\n\nexport const getFullPath = (root: string, path: string) => join(root, stringDiff(path, root));\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type File } from './file';\nimport { type StorageType } from './storage';\nimport { getFullPath } from './utils';\n\nexport type DirectoryParams = {\n type: StorageType;\n path: string;\n // TODO(burdon): Create interface for these methods (shared with AbstractStorage).\n list: (path: string) => Promise<string[]>;\n getOrCreateFile: (path: string, filename: string, opts?: any) => File;\n remove: () => Promise<void>;\n onFlush?: () => Promise<void>;\n};\n\n/**\n * Wraps a directory in the storage file system.\n */\nexport class Directory {\n public readonly type: StorageType;\n public readonly path: string;\n // TODO(burdon): Create interface for these methods (shared with AbstractStorage).\n private readonly _list: (path: string) => Promise<string[]>;\n private readonly _getOrCreateFile: (path: string, filename: string, opts?: any) => File;\n private readonly _remove: () => Promise<void>;\n private readonly _onFlush?: () => Promise<void>;\n\n constructor({ type, path, list, getOrCreateFile, remove, onFlush }: DirectoryParams) {\n this.type = type;\n this.path = path;\n this._list = list;\n this._getOrCreateFile = getOrCreateFile;\n this._remove = remove;\n this._onFlush = onFlush;\n }\n\n toString() {\n return `Directory(${JSON.stringify({ type: this.type, path: this.path })})`;\n }\n\n /**\n * Create a new sub-directory.\n */\n createDirectory(path: string): Directory {\n return new Directory({\n type: this.type,\n path: getFullPath(this.path, path),\n list: this._list,\n getOrCreateFile: this._getOrCreateFile,\n remove: this._remove,\n });\n }\n\n /**\n * Get all files in the current directory.\n */\n list(): Promise<string[]> {\n return this._list(this.path);\n }\n\n /**\n * Get or create a new file.\n */\n getOrCreateFile(filename: string, opts?: any): File {\n return this._getOrCreateFile(this.path, filename, opts);\n }\n\n async flush() {\n await this._onFlush?.();\n }\n\n /**\n * Close and delete all files in the directory and all its sub-directories.\n */\n async delete() {\n await this._remove();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport pify from 'pify';\nimport type { FileStat, RandomAccessStorage, RandomAccessStorageProperties } from 'random-access-storage';\n\nimport { log } from '@dxos/log';\n\nimport { type StorageType } from './storage';\n\nconst MAX_STORAGE_OPERATION_TIME = 50;\n\n/**\n * Random access file wrapper.\n * https://github.com/random-access-storage/random-access-storage\n */\nexport interface File extends RandomAccessStorageProperties {\n readonly destroyed: boolean;\n\n // TODO(burdon): Can we remove these since they are not standard across implementations?\n readonly directory: string;\n readonly filename: string;\n\n // Added by factory.\n readonly type: StorageType;\n readonly native: RandomAccessStorage;\n\n write(offset: number, data: Buffer): Promise<void>;\n read(offset: number, size: number): Promise<Buffer>;\n del(offset: number, size: number): Promise<void>;\n stat(): Promise<FileStat>;\n close(): Promise<Error | void>;\n destroy(): Promise<Error | void>;\n\n /**\n * Save changes to disk.\n */\n flush?(): Promise<void>;\n\n // Not supported in node, memory.\n truncate?(offset: number): Promise<void>;\n\n // random-access-memory only.\n clone?(): RandomAccessStorage;\n}\n\nconst pifyFields = (object: any, type: StorageType, fields: string[]) => {\n for (const field of fields) {\n if (!object[field]) {\n // TODO(burdon): Suppress warning and throw error if used.\n // console.warn(`Field not supported for type: ${JSON.stringify({ type, field })}`);\n } else {\n const fn = pify(object[field].bind(object));\n object[field] = async (...args: any) => {\n const before = performance.now();\n\n const res = await fn(...args);\n\n const elapsed = performance.now() - before;\n if (elapsed > MAX_STORAGE_OPERATION_TIME) {\n log.warn('Slow storage operation', { type, operation: field, elapsed });\n }\n\n return res;\n };\n }\n }\n\n return object;\n};\n\n/**\n * Construct async File wrapper.\n * NOTE: This is safe since these are interface methods only (not used internally).\n */\nexport const wrapFile = (native: RandomAccessStorage, type: StorageType): File => {\n const file = pifyFields(native, type, ['write', 'read', 'del', 'stat', 'close', 'destroy', 'truncate']);\n return Object.assign(file, { type, native });\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport ram from 'random-access-memory';\nimport { type Callback, type RandomAccessStorage } from 'random-access-storage';\n\nimport { arrayToBuffer } from '@dxos/util';\n\nimport { AbstractStorage } from './abstract-storage';\nimport { StorageType } from './storage';\n\n/**\n * Storage interface implementation for RAM.\n * https://github.com/random-access-storage/random-access-memory\n */\nexport class MemoryStorage extends AbstractStorage {\n public override type: StorageType = StorageType.RAM;\n\n protected override _createFile(path: string, filename: string): RandomAccessStorage {\n return this._patchFile(ram());\n }\n\n protected override _openFile(file: RandomAccessStorage): RandomAccessStorage {\n const newFile = file.clone!();\n (newFile as any).closed = false;\n return this._patchFile(newFile);\n }\n\n private _patchFile(file: RandomAccessStorage): RandomAccessStorage {\n // Patch required to make consistent across platforms.\n const trueRead = file.read.bind(file);\n\n file.read = (offset: number, size: number, cb: Callback<Buffer>) =>\n trueRead(offset, size, (err: Error | null, data?: Buffer) => {\n if (err) {\n return cb(err);\n } else {\n return cb(err, arrayToBuffer(data!));\n }\n });\n\n return file;\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { type Directory } from './directory';\n\n// TODO(burdon): Reconcile with ConfigProto.\nexport enum StorageType {\n RAM = 'ram',\n IDB = 'idb',\n CHROME = 'chrome',\n FIREFOX = 'firefox',\n NODE = 'node',\n WEBFS = 'webfs',\n}\n\nexport type DiskInfo = {\n /**\n * Bytes.\n */\n used: number;\n};\n\nexport interface Storage {\n readonly path: string;\n readonly type: StorageType;\n readonly size: number;\n\n getDiskInfo?(): Promise<DiskInfo>;\n\n // TODO(burdon): Make required.\n createDirectory: (path?: string) => Directory;\n reset: () => Promise<void>;\n}\n\nexport type StorageConstructor = (params?: { type?: StorageType; root?: string }) => Storage;\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport del from 'del';\nimport { existsSync } from 'node:fs';\nimport { readdir, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport raf from 'random-access-file';\nimport { type RandomAccessStorage } from 'random-access-storage';\n\nimport { AbstractStorage, type DiskInfo, type Storage, StorageType, wrapFile } from '../common';\n\n/**\n * Storage interface implementation for Node.\n */\nexport class NodeStorage extends AbstractStorage implements Storage {\n public override type: StorageType = StorageType.NODE;\n private _initialized = false;\n\n private async _loadFiles(path: string) {\n // TODO(mykola): Do not load all files at once. It is a quick fix.\n if (!existsSync(path)) {\n return;\n }\n\n // Preload all files in a directory.\n const dir = await readdir(path);\n for (const entry of dir) {\n const fullPath = join(path, entry);\n if (this._files.has(fullPath)) {\n continue;\n }\n const entryInfo = await stat(fullPath);\n if (entryInfo.isDirectory()) {\n await this._loadFiles(fullPath);\n } else if (entryInfo.isFile()) {\n const file = this._createFile(path, entry);\n this._files.set(fullPath, wrapFile(file, this.type));\n }\n }\n }\n\n protected override _createFile(path: string, filename: string, opts: any = {}): RandomAccessStorage {\n const file = raf(filename, { directory: path, ...opts });\n\n // Empty write to create file on a drive.\n file.write(0, Buffer.from(''));\n\n return file;\n }\n\n protected override async _destroy() {\n await del(this.path, { force: true });\n }\n\n protected override async _getFiles(path: string) {\n if (!this._initialized) {\n await this._loadFiles(this.path);\n this._initialized = true;\n }\n\n return super._getFiles(path);\n }\n\n async getDiskInfo(): Promise<DiskInfo> {\n let used = 0;\n\n const recurse = async (path: string) => {\n const pathStats = await stat(path);\n\n used += pathStats.size;\n\n if (pathStats.isDirectory()) {\n const entries = await readdir(path);\n await Promise.all(entries.map((entry) => recurse(join(path, entry))));\n }\n };\n\n await recurse(this.path);\n\n return {\n used,\n };\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { NodeStorage } from './node-storage';\nimport { MemoryStorage, type Storage, type StorageConstructor, StorageType } from '../common';\n\nexport const createStorage: StorageConstructor = ({ type, root = '/tmp/dxos/testing' } = {}): Storage => {\n if (type === undefined) {\n return new NodeStorage(root);\n }\n\n switch (type) {\n case StorageType.RAM: {\n return new MemoryStorage(root);\n }\n\n case StorageType.NODE: {\n return new NodeStorage(root);\n }\n\n default: {\n throw new Error(`Invalid type: ${type}`);\n }\n }\n};\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nimport { join } from 'node:path';\nimport { inspect } from 'node:util';\nimport type { RandomAccessStorage } from 'random-access-storage';\n\nimport { inspectObject } from '@dxos/debug';\nimport { log } from '@dxos/log';\n\nimport { Directory } from './directory';\nimport { type File, wrapFile } from './file';\nimport { type Storage, type StorageType } from './storage';\nimport { getFullPath } from './utils';\n\n/**\n * Base class for all storage implementations.\n * https://github.com/random-access-storage\n * https://github.com/random-access-storage/random-access-storage\n */\nexport abstract class AbstractStorage implements Storage {\n protected readonly _files = new Map<string, File>();\n\n public abstract readonly type: StorageType;\n\n // TODO(burdon): Make required.\n constructor(public readonly path: string) {}\n\n [inspect.custom]() {\n return inspectObject(this);\n }\n\n toJSON() {\n return { type: this.type, path: this.path };\n }\n\n public get size() {\n return this._files.size;\n }\n\n // TODO(burdon): Make required.\n public createDirectory(sub = ''): Directory {\n // invariant(sub.length);\n return new Directory({\n type: this.type,\n path: getFullPath(this.path, sub),\n list: this._list.bind(this),\n getOrCreateFile: (...args) => this.getOrCreateFile(...args),\n remove: () => this._remove(sub),\n });\n }\n\n /**\n * Delete all files.\n */\n async reset() {\n try {\n log.info('Erasing all data...');\n await this._closeFilesInPath('');\n await this._remove('');\n await this._destroy();\n log('Erased...');\n } catch (err: any) {\n log.catch(err);\n }\n }\n\n protected async _list(path: string): Promise<string[]> {\n // TODO(dmaretskyi): Fix me.\n return Array.from((await this._getFiles(path)).keys()).map((filename) => {\n let name = filename.replace(path, '');\n if (name.startsWith('/')) {\n name = name.substring(1);\n }\n return name;\n });\n }\n\n protected getOrCreateFile(path: string, filename: string, opts?: any): File {\n const fullPath = join(path, filename);\n\n let native;\n let file = this._getFileIfExists(fullPath);\n if (file) {\n if (!file.closed) {\n return file;\n }\n\n native = this._openFile(file.native);\n }\n\n if (!native) {\n native = this._createFile(path, filename, opts);\n }\n\n file = wrapFile(native, this.type);\n this._files.set(fullPath, file);\n return file;\n }\n\n protected _destroy(): Promise<void> | undefined {\n return undefined;\n }\n\n /**\n * Attempt to reopen file.\n */\n protected _openFile(file: RandomAccessStorage): RandomAccessStorage | undefined {\n return undefined;\n }\n\n protected abstract _createFile(path: string, filename: string, opts?: any): RandomAccessStorage;\n\n private _getFileIfExists(filename: string): File | undefined {\n if (this._files.has(filename)) {\n const file = this._files.get(filename);\n if (file && !file.destroyed) {\n return file;\n }\n }\n }\n\n protected async _getFiles(path: string): Promise<Map<string, File>> {\n const fullPath = getFullPath(this.path, path);\n return new Map(\n [...this._files.entries()].filter(([path, file]) => path.includes(fullPath) && file.destroyed !== true),\n );\n }\n\n private async _closeFilesInPath(path: string): Promise<void> {\n await Promise.all(\n Array.from((await this._getFiles(path)).values()).map((file) => file.close().catch((err: any) => log.catch(err))),\n );\n }\n\n async close() {\n await this._closeFilesInPath('');\n }\n\n // TODO(burdon): Delete directory (not just listed files).\n protected async _remove(path: string): Promise<void> {\n await Promise.all(\n Array.from(await this._getFiles(path)).map(([path, file]) => {\n return file\n .destroy()\n .then(() => this._files.delete(path))\n .catch((err: any) => log.error(err.message));\n }),\n );\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { join } from 'node:path';\n\n// TODO(burdon): Document.\nexport const stringDiff = (first: string, second: string) => first.split(second).join('');\n\nexport const getFullPath = (root: string, path: string) => join(root, stringDiff(path, root));\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type File } from './file';\nimport { type StorageType } from './storage';\nimport { getFullPath } from './utils';\n\nexport type DirectoryParams = {\n type: StorageType;\n path: string;\n // TODO(burdon): Create interface for these methods (shared with AbstractStorage).\n list: (path: string) => Promise<string[]>;\n getOrCreateFile: (path: string, filename: string, opts?: any) => File;\n remove: () => Promise<void>;\n onFlush?: () => Promise<void>;\n};\n\n/**\n * Wraps a directory in the storage file system.\n */\nexport class Directory {\n public readonly type: StorageType;\n public readonly path: string;\n // TODO(burdon): Create interface for these methods (shared with AbstractStorage).\n private readonly _list: (path: string) => Promise<string[]>;\n private readonly _getOrCreateFile: (path: string, filename: string, opts?: any) => File;\n private readonly _remove: () => Promise<void>;\n private readonly _onFlush?: () => Promise<void>;\n\n constructor({ type, path, list, getOrCreateFile, remove, onFlush }: DirectoryParams) {\n this.type = type;\n this.path = path;\n this._list = list;\n this._getOrCreateFile = getOrCreateFile;\n this._remove = remove;\n this._onFlush = onFlush;\n }\n\n toString() {\n return `Directory(${JSON.stringify({ type: this.type, path: this.path })})`;\n }\n\n /**\n * Create a new sub-directory.\n */\n createDirectory(path: string): Directory {\n return new Directory({\n type: this.type,\n path: getFullPath(this.path, path),\n list: this._list,\n getOrCreateFile: this._getOrCreateFile,\n remove: this._remove,\n });\n }\n\n /**\n * Get all files in the current directory.\n */\n list(): Promise<string[]> {\n return this._list(this.path);\n }\n\n /**\n * Get or create a new file.\n */\n getOrCreateFile(filename: string, opts?: any): File {\n return this._getOrCreateFile(this.path, filename, opts);\n }\n\n async flush() {\n await this._onFlush?.();\n }\n\n /**\n * Close and delete all files in the directory and all its sub-directories.\n */\n async delete() {\n await this._remove();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport pify from 'pify';\nimport type { FileStat, RandomAccessStorage, RandomAccessStorageProperties } from 'random-access-storage';\n\nimport { log } from '@dxos/log';\n\nimport { type StorageType } from './storage';\n\nconst MAX_STORAGE_OPERATION_TIME = 50;\n\n/**\n * Random access file wrapper.\n * https://github.com/random-access-storage/random-access-storage\n */\nexport interface File extends RandomAccessStorageProperties {\n readonly destroyed: boolean;\n\n // TODO(burdon): Can we remove these since they are not standard across implementations?\n readonly directory: string;\n readonly filename: string;\n\n // Added by factory.\n readonly type: StorageType;\n readonly native: RandomAccessStorage;\n\n write(offset: number, data: Buffer): Promise<void>;\n read(offset: number, size: number): Promise<Buffer>;\n del(offset: number, size: number): Promise<void>;\n stat(): Promise<FileStat>;\n close(): Promise<Error | void>;\n destroy(): Promise<Error | void>;\n\n /**\n * Save changes to disk.\n */\n flush?(): Promise<void>;\n\n // Not supported in node, memory.\n truncate?(offset: number): Promise<void>;\n\n // random-access-memory only.\n clone?(): RandomAccessStorage;\n}\n\nconst pifyFields = (object: any, type: StorageType, fields: string[]) => {\n for (const field of fields) {\n if (!object[field]) {\n // TODO(burdon): Suppress warning and throw error if used.\n // console.warn(`Field not supported for type: ${JSON.stringify({ type, field })}`);\n } else {\n const fn = pify(object[field].bind(object));\n object[field] = async (...args: any) => {\n const before = performance.now();\n\n const res = await fn(...args);\n\n const elapsed = performance.now() - before;\n if (elapsed > MAX_STORAGE_OPERATION_TIME) {\n log.warn('Slow storage operation', { type, operation: field, elapsed });\n }\n\n return res;\n };\n }\n }\n\n return object;\n};\n\n/**\n * Construct async File wrapper.\n * NOTE: This is safe since these are interface methods only (not used internally).\n */\nexport const wrapFile = (native: RandomAccessStorage, type: StorageType): File => {\n const file = pifyFields(native, type, ['write', 'read', 'del', 'stat', 'close', 'destroy', 'truncate']);\n return Object.assign(file, { type, native });\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport ram from 'random-access-memory';\nimport { type Callback, type RandomAccessStorage } from 'random-access-storage';\n\nimport { arrayToBuffer } from '@dxos/util';\n\nimport { AbstractStorage } from './abstract-storage';\nimport { StorageType } from './storage';\n\n/**\n * Storage interface implementation for RAM.\n * https://github.com/random-access-storage/random-access-memory\n */\nexport class MemoryStorage extends AbstractStorage {\n public override type: StorageType = StorageType.RAM;\n\n protected override _createFile(path: string, filename: string): RandomAccessStorage {\n return this._patchFile(ram());\n }\n\n protected override _openFile(file: RandomAccessStorage): RandomAccessStorage {\n const newFile = file.clone!();\n (newFile as any).closed = false;\n return this._patchFile(newFile);\n }\n\n private _patchFile(file: RandomAccessStorage): RandomAccessStorage {\n // Patch required to make consistent across platforms.\n const trueRead = file.read.bind(file);\n\n file.read = (offset: number, size: number, cb: Callback<Buffer>) =>\n trueRead(offset, size, (err: Error | null, data?: Buffer) => {\n if (err) {\n return cb(err);\n } else {\n return cb(err, arrayToBuffer(data!));\n }\n });\n\n return file;\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { type Directory } from './directory';\n\n// TODO(burdon): Reconcile with ConfigProto.\nexport enum StorageType {\n RAM = 'ram',\n IDB = 'idb',\n CHROME = 'chrome',\n FIREFOX = 'firefox',\n NODE = 'node',\n WEBFS = 'webfs',\n}\n\nexport type DiskInfo = {\n /**\n * Bytes.\n */\n used: number;\n};\n\nexport interface Storage {\n readonly path: string;\n readonly type: StorageType;\n readonly size: number;\n\n getDiskInfo?(): Promise<DiskInfo>;\n\n // TODO(burdon): Make required.\n createDirectory: (path?: string) => Directory;\n reset: () => Promise<void>;\n close: () => Promise<void>;\n}\n\nexport type StorageConstructor = (params?: { type?: StorageType; root?: string }) => Storage;\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport del from 'del';\nimport { existsSync } from 'node:fs';\nimport { readdir, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport raf from 'random-access-file';\nimport { type RandomAccessStorage } from 'random-access-storage';\n\nimport { AbstractStorage, type DiskInfo, type Storage, StorageType, wrapFile } from '../common';\n\n/**\n * Storage interface implementation for Node.\n */\nexport class NodeStorage extends AbstractStorage implements Storage {\n public override type: StorageType = StorageType.NODE;\n private _initialized = false;\n\n private async _loadFiles(path: string) {\n // TODO(mykola): Do not load all files at once. It is a quick fix.\n if (!existsSync(path)) {\n return;\n }\n\n // Preload all files in a directory.\n const dir = await readdir(path);\n for (const entry of dir) {\n const fullPath = join(path, entry);\n if (this._files.has(fullPath)) {\n continue;\n }\n const entryInfo = await stat(fullPath);\n if (entryInfo.isDirectory()) {\n await this._loadFiles(fullPath);\n } else if (entryInfo.isFile()) {\n const file = this._createFile(path, entry);\n this._files.set(fullPath, wrapFile(file, this.type));\n }\n }\n }\n\n protected override _createFile(path: string, filename: string, opts: any = {}): RandomAccessStorage {\n const file = raf(filename, { directory: path, ...opts });\n\n // Empty write to create file on a drive.\n file.write(0, Buffer.from(''));\n\n return file;\n }\n\n protected override async _destroy() {\n await del(this.path, { force: true });\n }\n\n protected override async _getFiles(path: string) {\n if (!this._initialized) {\n await this._loadFiles(this.path);\n this._initialized = true;\n }\n\n return super._getFiles(path);\n }\n\n async getDiskInfo(): Promise<DiskInfo> {\n let used = 0;\n\n const recurse = async (path: string) => {\n const pathStats = await stat(path);\n\n used += pathStats.size;\n\n if (pathStats.isDirectory()) {\n const entries = await readdir(path);\n await Promise.all(entries.map((entry) => recurse(join(path, entry))));\n }\n };\n\n await recurse(this.path);\n\n return {\n used,\n };\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { NodeStorage } from './node-storage';\nimport { MemoryStorage, type Storage, type StorageConstructor, StorageType } from '../common';\n\nexport const createStorage: StorageConstructor = ({ type, root = '/tmp/dxos/testing' } = {}): Storage => {\n if (type === undefined) {\n return new NodeStorage(root);\n }\n\n switch (type) {\n case StorageType.RAM: {\n return new MemoryStorage(root);\n }\n\n case StorageType.NODE: {\n return new NodeStorage(root);\n }\n\n default: {\n throw new Error(`Invalid type: ${type}`);\n }\n }\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_node_path", "import_log", "stringDiff", "first", "second", "split", "join", "getFullPath", "root", "path", "Directory", "constructor", "type", "list", "getOrCreateFile", "remove", "onFlush", "_list", "_getOrCreateFile", "_remove", "_onFlush", "toString", "JSON", "stringify", "createDirectory", "filename", "opts", "flush", "delete", "MAX_STORAGE_OPERATION_TIME", "pifyFields", "object", "fields", "field", "fn", "pify", "bind", "args", "before", "performance", "now", "res", "elapsed", "log", "warn", "operation", "wrapFile", "native", "file", "Object", "assign", "AbstractStorage", "_files", "Map", "inspect", "custom", "inspectObject", "toJSON", "size", "sub", "reset", "info", "_closeFilesInPath", "_destroy", "err", "catch", "Array", "from", "_getFiles", "keys", "map", "name", "replace", "startsWith", "substring", "fullPath", "_getFileIfExists", "closed", "_openFile", "_createFile", "set", "undefined", "has", "get", "destroyed", "entries", "filter", "includes", "Promise", "all", "values", "close", "destroy", "then", "error", "message", "StorageType", "MemoryStorage", "RAM", "_patchFile", "ram", "newFile", "clone", "trueRead", "read", "offset", "cb", "data", "arrayToBuffer", "NodeStorage", "NODE", "_initialized", "_loadFiles", "existsSync", "dir", "readdir", "entry", "entryInfo", "stat", "isDirectory", "isFile", "raf", "directory", "write", "Buffer", "del", "force", "getDiskInfo", "used", "recurse", "pathStats", "createStorage", "Error"]
|
|
7
7
|
}
|
package/dist/lib/node/meta.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/common/random-access-storage/src/common/utils.ts":{"bytes":1295,"imports":[{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/directory.ts":{"bytes":6503,"imports":[{"path":"packages/common/random-access-storage/src/common/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/common/random-access-storage/src/common/file.ts":{"bytes":6374,"imports":[{"path":"pify","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/abstract-storage.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/common/random-access-storage/src/common/utils.ts":{"bytes":1295,"imports":[{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/directory.ts":{"bytes":6503,"imports":[{"path":"packages/common/random-access-storage/src/common/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/common/random-access-storage/src/common/file.ts":{"bytes":6374,"imports":[{"path":"pify","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/abstract-storage.ts":{"bytes":14868,"imports":[{"path":"node:path","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/common/random-access-storage/src/common/directory.ts","kind":"import-statement","original":"./directory"},{"path":"packages/common/random-access-storage/src/common/file.ts","kind":"import-statement","original":"./file"},{"path":"packages/common/random-access-storage/src/common/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/common/random-access-storage/src/common/storage.ts":{"bytes":1714,"imports":[],"format":"esm"},"packages/common/random-access-storage/src/common/memory-storage.ts":{"bytes":4360,"imports":[{"path":"random-access-memory","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/random-access-storage/src/common/abstract-storage.ts","kind":"import-statement","original":"./abstract-storage"},{"path":"packages/common/random-access-storage/src/common/storage.ts","kind":"import-statement","original":"./storage"}],"format":"esm"},"packages/common/random-access-storage/src/common/index.ts":{"bytes":947,"imports":[{"path":"packages/common/random-access-storage/src/common/abstract-storage.ts","kind":"import-statement","original":"./abstract-storage"},{"path":"packages/common/random-access-storage/src/common/directory.ts","kind":"import-statement","original":"./directory"},{"path":"packages/common/random-access-storage/src/common/file.ts","kind":"import-statement","original":"./file"},{"path":"packages/common/random-access-storage/src/common/memory-storage.ts","kind":"import-statement","original":"./memory-storage"},{"path":"packages/common/random-access-storage/src/common/storage.ts","kind":"import-statement","original":"./storage"},{"path":"packages/common/random-access-storage/src/common/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/common/random-access-storage/src/node/node-storage.ts":{"bytes":8334,"imports":[{"path":"del","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"random-access-file","kind":"import-statement","external":true},{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"}],"format":"esm"},"packages/common/random-access-storage/src/node/storage.ts":{"bytes":2441,"imports":[{"path":"packages/common/random-access-storage/src/node/node-storage.ts","kind":"import-statement","original":"./node-storage"},{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"}],"format":"esm"},"packages/common/random-access-storage/src/node/index.ts":{"bytes":568,"imports":[{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"packages/common/random-access-storage/src/node/storage.ts","kind":"import-statement","original":"./storage"}],"format":"esm"},"packages/common/random-access-storage/src/index.ts":{"bytes":469,"imports":[{"path":"packages/common/random-access-storage/src/node/index.ts","kind":"import-statement","original":"./node"}],"format":"esm"}},"outputs":{"packages/common/random-access-storage/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":23004},"packages/common/random-access-storage/dist/lib/node/index.cjs":{"imports":[{"path":"node:path","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pify","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"random-access-memory","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"del","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"random-access-file","kind":"import-statement","external":true}],"exports":["AbstractStorage","Directory","MemoryStorage","StorageType","createStorage","getFullPath","stringDiff","wrapFile"],"entryPoint":"packages/common/random-access-storage/src/index.ts","inputs":{"packages/common/random-access-storage/src/common/abstract-storage.ts":{"bytesInOutput":3497},"packages/common/random-access-storage/src/common/utils.ts":{"bytesInOutput":170},"packages/common/random-access-storage/src/common/directory.ts":{"bytesInOutput":1103},"packages/common/random-access-storage/src/common/file.ts":{"bytesInOutput":1149},"packages/common/random-access-storage/src/common/index.ts":{"bytesInOutput":0},"packages/common/random-access-storage/src/common/memory-storage.ts":{"bytesInOutput":693},"packages/common/random-access-storage/src/common/storage.ts":{"bytesInOutput":288},"packages/common/random-access-storage/src/node/index.ts":{"bytesInOutput":0},"packages/common/random-access-storage/src/node/node-storage.ts":{"bytesInOutput":1726},"packages/common/random-access-storage/src/node/storage.ts":{"bytesInOutput":369},"packages/common/random-access-storage/src/index.ts":{"bytesInOutput":0}},"bytes":9832}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bench.browser.test.d.ts","sourceRoot":"","sources":["../../../../src/browser/bench.browser.test.ts"],"names":[],"mappings":"AAIA,OAAO,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.browser.test.d.ts","sourceRoot":"","sources":["../../../../src/browser/storage.browser.test.ts"],"names":[],"mappings":"AAIA,OAAO,6BAA6B,CAAC"}
|
|
@@ -9,7 +9,6 @@ import { Directory, type DiskInfo, type File, type Storage, StorageType } from '
|
|
|
9
9
|
export declare class WebFS implements Storage {
|
|
10
10
|
readonly path: string;
|
|
11
11
|
readonly type = StorageType.WEBFS;
|
|
12
|
-
protected readonly _files: Map<string, WebFile>;
|
|
13
12
|
protected _root?: FileSystemDirectoryHandle;
|
|
14
13
|
constructor(path: string);
|
|
15
14
|
get size(): number;
|
|
@@ -21,6 +20,7 @@ export declare class WebFS implements Storage {
|
|
|
21
20
|
private _createFile;
|
|
22
21
|
private _delete;
|
|
23
22
|
reset(): Promise<void>;
|
|
23
|
+
close(): Promise<void>;
|
|
24
24
|
private _getFullFilename;
|
|
25
25
|
getDiskInfo(): Promise<DiskInfo>;
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fs.d.ts","sourceRoot":"","sources":["../../../../src/browser/web-fs.ts"],"names":[],"mappings":";;AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAOjE,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,OAAO,EAAE,WAAW,EAAe,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"web-fs.d.ts","sourceRoot":"","sources":["../../../../src/browser/web-fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@ export declare abstract class AbstractStorage implements Storage {
|
|
|
36
36
|
private _getFileIfExists;
|
|
37
37
|
protected _getFiles(path: string): Promise<Map<string, File>>;
|
|
38
38
|
private _closeFilesInPath;
|
|
39
|
+
close(): Promise<void>;
|
|
39
40
|
protected _remove(path: string): Promise<void>;
|
|
40
41
|
}
|
|
41
42
|
//# sourceMappingURL=abstract-storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-storage.d.ts","sourceRoot":"","sources":["../../../../src/common/abstract-storage.ts"],"names":[],"mappings":";AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAKjE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,KAAK,IAAI,EAAY,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3D;;;;GAIG;AACH,8BAAsB,eAAgB,YAAW,OAAO;aAM1B,IAAI,EAAE,MAAM;IALxC,SAAS,CAAC,QAAQ,CAAC,MAAM,oBAA2B;IAEpD,kBAAyB,IAAI,EAAE,WAAW,CAAC;gBAGf,IAAI,EAAE,MAAM;IAExC,CAAC,OAAO,CAAC,MAAM,CAAC;IAIhB,MAAM;;;;IAIN,IAAW,IAAI,WAEd;IAGM,eAAe,CAAC,GAAG,SAAK,GAAG,SAAS;IAW3C;;OAEG;IACG,KAAK;cAYK,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWtD,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAsB3E,SAAS,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IAI/C;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,GAAG,mBAAmB,GAAG,SAAS;IAI/E,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,mBAAmB;IAE/F,OAAO,CAAC,gBAAgB;cASR,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAOrD,iBAAiB;
|
|
1
|
+
{"version":3,"file":"abstract-storage.d.ts","sourceRoot":"","sources":["../../../../src/common/abstract-storage.ts"],"names":[],"mappings":";AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAKjE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,KAAK,IAAI,EAAY,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3D;;;;GAIG;AACH,8BAAsB,eAAgB,YAAW,OAAO;aAM1B,IAAI,EAAE,MAAM;IALxC,SAAS,CAAC,QAAQ,CAAC,MAAM,oBAA2B;IAEpD,kBAAyB,IAAI,EAAE,WAAW,CAAC;gBAGf,IAAI,EAAE,MAAM;IAExC,CAAC,OAAO,CAAC,MAAM,CAAC;IAIhB,MAAM;;;;IAIN,IAAW,IAAI,WAEd;IAGM,eAAe,CAAC,GAAG,SAAK,GAAG,SAAS;IAW3C;;OAEG;IACG,KAAK;cAYK,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWtD,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAsB3E,SAAS,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IAI/C;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,GAAG,mBAAmB,GAAG,SAAS;IAI/E,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,mBAAmB;IAE/F,OAAO,CAAC,gBAAgB;cASR,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAOrD,iBAAiB;IAMzB,KAAK;cAKK,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUrD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/common/storage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,oBAAY,WAAW;IACrB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAGlC,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC;IAC9C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/common/storage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,oBAAY,WAAW;IACrB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAGlC,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC;IAC9C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bench.node.test.d.ts","sourceRoot":"","sources":["../../../../src/node/bench.node.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.node.test.d.ts","sourceRoot":"","sources":["../../../../src/node/storage.node.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type Storage, type StorageType } from '../common';
|
|
2
2
|
export declare const randomText: () => string;
|
|
3
|
-
export declare const storageBenchmark: (testGroupName: StorageType, createStorage: () => Storage) => void;
|
|
3
|
+
export declare const storageBenchmark: (environment: string, testGroupName: StorageType, createStorage: () => Storage) => void;
|
|
4
4
|
//# sourceMappingURL=benchmark.blueprint-test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"benchmark.blueprint-test.d.ts","sourceRoot":"","sources":["../../../../src/testing/benchmark.blueprint-test.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE3D,eAAO,MAAM,UAAU,cAAgD,CAAC;AAGxE,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"benchmark.blueprint-test.d.ts","sourceRoot":"","sources":["../../../../src/testing/benchmark.blueprint-test.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE3D,eAAO,MAAM,UAAU,cAAgD,CAAC;AAGxE,eAAO,MAAM,gBAAgB,gBAAiB,MAAM,iBAAiB,WAAW,iBAAiB,MAAM,OAAO,SA+E7G,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Storage
|
|
1
|
+
import { StorageType, type Storage } from '../common';
|
|
2
2
|
export declare const randomText: () => string;
|
|
3
3
|
export declare const storageTests: (testGroupName: StorageType, createStorage: () => Storage) => void;
|
|
4
4
|
//# sourceMappingURL=storage.blueprint-test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.blueprint-test.d.ts","sourceRoot":"","sources":["../../../../src/testing/storage.blueprint-test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.blueprint-test.d.ts","sourceRoot":"","sources":["../../../../src/testing/storage.blueprint-test.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAa,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAEjE,eAAO,MAAM,UAAU,cAAgD,CAAC;AAExE,eAAO,MAAM,YAAY,kBAAmB,WAAW,iBAAiB,MAAM,OAAO,SAmWpF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-for-debugger.d.ts","sourceRoot":"","sources":["../../../../src/testing/wait-for-debugger.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,eAAO,MAAM,eAAe,qBAW3B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/random-access-storage",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1-main.2495eb8",
|
|
4
4
|
"description": "Multiple random storage types.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -24,14 +24,14 @@
|
|
|
24
24
|
"random-access-memory": "^4.1.0",
|
|
25
25
|
"random-access-storage": "^3.0.0",
|
|
26
26
|
"random-access-web": "^2.0.3",
|
|
27
|
-
"@dxos/async": "0.4.
|
|
28
|
-
"@dxos/context": "0.4.
|
|
29
|
-
"@dxos/debug": "0.4.
|
|
30
|
-
"@dxos/
|
|
31
|
-
"@dxos/
|
|
32
|
-
"@dxos/
|
|
33
|
-
"@dxos/
|
|
34
|
-
"@dxos/
|
|
27
|
+
"@dxos/async": "0.4.1-main.2495eb8",
|
|
28
|
+
"@dxos/context": "0.4.1-main.2495eb8",
|
|
29
|
+
"@dxos/debug": "0.4.1-main.2495eb8",
|
|
30
|
+
"@dxos/invariant": "0.4.1-main.2495eb8",
|
|
31
|
+
"@dxos/log": "0.4.1-main.2495eb8",
|
|
32
|
+
"@dxos/node-std": "0.4.1-main.2495eb8",
|
|
33
|
+
"@dxos/tracing": "0.4.1-main.2495eb8",
|
|
34
|
+
"@dxos/util": "0.4.1-main.2495eb8"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/pify": "^3.0.2",
|
|
@@ -2,11 +2,9 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
// @dxos/test platform=browser
|
|
6
|
-
|
|
7
5
|
import 'source-map-support/register';
|
|
8
6
|
|
|
9
|
-
import { describe } from '
|
|
7
|
+
import { describe } from 'vitest';
|
|
10
8
|
|
|
11
9
|
import { createStorage } from './storage';
|
|
12
10
|
import { StorageType } from '../common';
|
|
@@ -16,6 +14,6 @@ const ROOT_DIRECTORY = 'testing';
|
|
|
16
14
|
|
|
17
15
|
describe.skip('bench', () => {
|
|
18
16
|
for (const dataStore of [StorageType.RAM, StorageType.IDB] as StorageType[]) {
|
|
19
|
-
storageBenchmark(dataStore, () => createStorage({ type: dataStore, root: ROOT_DIRECTORY }));
|
|
17
|
+
storageBenchmark('browser', dataStore, () => createStorage({ type: dataStore, root: ROOT_DIRECTORY }));
|
|
20
18
|
}
|
|
21
19
|
});
|
|
@@ -2,12 +2,9 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
// @dxos/test platform=browser
|
|
6
|
-
|
|
7
|
-
import expect from 'expect';
|
|
8
5
|
import 'source-map-support/register';
|
|
9
6
|
|
|
10
|
-
import { describe, test } from '
|
|
7
|
+
import { expect, describe, test } from 'vitest';
|
|
11
8
|
|
|
12
9
|
import { createStorage } from './storage';
|
|
13
10
|
import { StorageType } from '../common';
|
|
@@ -17,10 +14,6 @@ const ROOT_DIRECTORY = 'testing';
|
|
|
17
14
|
|
|
18
15
|
describe('Tests for different storage types in different browsers', () => {
|
|
19
16
|
for (const dataStore of [StorageType.RAM, StorageType.IDB, StorageType.WEBFS] as StorageType[]) {
|
|
20
|
-
if (mochaExecutor.environment === 'webkit' && dataStore === StorageType.WEBFS) {
|
|
21
|
-
// Skip WEBFS in webkit.
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
17
|
storageTests(dataStore, () => createStorage({ type: dataStore, root: ROOT_DIRECTORY }));
|
|
25
18
|
}
|
|
26
19
|
|
package/src/browser/web-fs.ts
CHANGED
|
@@ -13,25 +13,34 @@ import { TimeSeriesCounter, trace } from '@dxos/tracing';
|
|
|
13
13
|
|
|
14
14
|
import { Directory, type DiskInfo, type File, type Storage, StorageType, getFullPath } from '../common';
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* When handles weren't shared by different WebFS instances, browser tests
|
|
18
|
+
* were sporadically failing with NonReadableError on test cases like:
|
|
19
|
+
* webFs1.createFile->createWritable->write->close
|
|
20
|
+
* webFs2.createFile->read
|
|
21
|
+
* Presumably due to some handle-level write buffering.
|
|
22
|
+
*/
|
|
23
|
+
const files = new Map<string, WebFile>();
|
|
16
24
|
/**
|
|
17
25
|
* Web file systems.
|
|
18
26
|
*/
|
|
19
27
|
export class WebFS implements Storage {
|
|
20
28
|
readonly type = StorageType.WEBFS;
|
|
21
29
|
|
|
22
|
-
protected readonly _files = new Map<string, WebFile>();
|
|
23
30
|
protected _root?: FileSystemDirectoryHandle;
|
|
24
31
|
|
|
25
32
|
constructor(public readonly path: string) {}
|
|
26
33
|
|
|
27
34
|
public get size() {
|
|
28
|
-
return
|
|
35
|
+
return files.size;
|
|
29
36
|
}
|
|
30
37
|
|
|
31
38
|
private _getFiles(path: string): Map<string, WebFile> {
|
|
32
39
|
const fullName = this._getFullFilename(this.path, path);
|
|
33
40
|
return new Map(
|
|
34
|
-
[...
|
|
41
|
+
[...files.entries()].filter(([path, file]) => {
|
|
42
|
+
return path.includes(fullName) && !file.destroyed;
|
|
43
|
+
}),
|
|
35
44
|
);
|
|
36
45
|
}
|
|
37
46
|
|
|
@@ -51,7 +60,10 @@ export class WebFS implements Storage {
|
|
|
51
60
|
const entries: string[] = [];
|
|
52
61
|
|
|
53
62
|
for await (const entry of (root as any).keys()) {
|
|
54
|
-
|
|
63
|
+
// Filter out .crswap files.
|
|
64
|
+
// https://bugs.chromium.org/p/chromium/issues/detail?id=1228068
|
|
65
|
+
// https://github.com/logseq/logseq/issues/4466#:~:text=Jun%2015%2C%202023-,.,is%20used%20to%20edit%20files.
|
|
66
|
+
if (entry.startsWith(fullName + '_') && !entry.endsWith('.crswap')) {
|
|
55
67
|
entries.push(entry.slice(fullName.length + 1));
|
|
56
68
|
}
|
|
57
69
|
}
|
|
@@ -83,12 +95,12 @@ export class WebFS implements Storage {
|
|
|
83
95
|
|
|
84
96
|
getOrCreateFile(path: string, filename: string, opts?: any): File {
|
|
85
97
|
const fullName = this._getFullFilename(path, filename);
|
|
86
|
-
const existingFile =
|
|
98
|
+
const existingFile = files.get(fullName);
|
|
87
99
|
if (existingFile) {
|
|
88
100
|
return existingFile;
|
|
89
101
|
}
|
|
90
102
|
const file = this._createFile(fullName);
|
|
91
|
-
|
|
103
|
+
files.set(fullName, file);
|
|
92
104
|
return file;
|
|
93
105
|
}
|
|
94
106
|
|
|
@@ -97,7 +109,7 @@ export class WebFS implements Storage {
|
|
|
97
109
|
fileName: fullName,
|
|
98
110
|
file: this._initialize().then((root) => root.getFileHandle(fullName, { create: true })),
|
|
99
111
|
destroy: async () => {
|
|
100
|
-
|
|
112
|
+
files.delete(fullName);
|
|
101
113
|
const root = await this._initialize();
|
|
102
114
|
return root.removeEntry(fullName);
|
|
103
115
|
},
|
|
@@ -108,7 +120,7 @@ export class WebFS implements Storage {
|
|
|
108
120
|
await Promise.all(
|
|
109
121
|
Array.from(this._getFiles(path)).map(async ([path, file]) => {
|
|
110
122
|
await file.destroy().catch((err: any) => log.warn(err));
|
|
111
|
-
|
|
123
|
+
files.delete(path);
|
|
112
124
|
}),
|
|
113
125
|
);
|
|
114
126
|
}
|
|
@@ -116,12 +128,16 @@ export class WebFS implements Storage {
|
|
|
116
128
|
async reset() {
|
|
117
129
|
await this._initialize();
|
|
118
130
|
for await (const filename of await (this._root as any).keys()) {
|
|
119
|
-
|
|
131
|
+
files.delete(filename);
|
|
120
132
|
await this._root!.removeEntry(filename, { recursive: true }).catch((err: any) => log.warn(err));
|
|
121
133
|
}
|
|
122
134
|
this._root = undefined;
|
|
123
135
|
}
|
|
124
136
|
|
|
137
|
+
async close() {
|
|
138
|
+
await Promise.all(Array.from(files.values()).map((file) => file.close()));
|
|
139
|
+
}
|
|
140
|
+
|
|
125
141
|
private _getFullFilename(path: string, filename?: string) {
|
|
126
142
|
// Replace slashes with underscores. Because we can't have slashes in filenames in Browser File Handle API.
|
|
127
143
|
if (filename) {
|
|
@@ -315,6 +331,10 @@ export class WebFile extends EventEmitter implements File {
|
|
|
315
331
|
}
|
|
316
332
|
|
|
317
333
|
async read(offset: number, size: number) {
|
|
334
|
+
if (this.destroyed) {
|
|
335
|
+
throw new Error('Read of a destroyed file');
|
|
336
|
+
}
|
|
337
|
+
|
|
318
338
|
this._operations.inc();
|
|
319
339
|
this._reads.inc();
|
|
320
340
|
this._readBytes.inc(size);
|
|
@@ -415,6 +435,7 @@ export class WebFile extends EventEmitter implements File {
|
|
|
415
435
|
|
|
416
436
|
@synchronized
|
|
417
437
|
async destroy() {
|
|
438
|
+
await this._flushNow();
|
|
418
439
|
this.destroyed = true;
|
|
419
440
|
return await this._destroy();
|
|
420
441
|
}
|
|
@@ -134,6 +134,10 @@ export abstract class AbstractStorage implements Storage {
|
|
|
134
134
|
);
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
+
async close() {
|
|
138
|
+
await this._closeFilesInPath('');
|
|
139
|
+
}
|
|
140
|
+
|
|
137
141
|
// TODO(burdon): Delete directory (not just listed files).
|
|
138
142
|
protected async _remove(path: string): Promise<void> {
|
|
139
143
|
await Promise.all(
|
package/src/common/storage.ts
CHANGED
|
@@ -31,6 +31,7 @@ export interface Storage {
|
|
|
31
31
|
// TODO(burdon): Make required.
|
|
32
32
|
createDirectory: (path?: string) => Directory;
|
|
33
33
|
reset: () => Promise<void>;
|
|
34
|
+
close: () => Promise<void>;
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
export type StorageConstructor = (params?: { type?: StorageType; root?: string }) => Storage;
|
|
@@ -2,12 +2,9 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
// @dxos/test platform=nodejs
|
|
6
|
-
|
|
7
5
|
import del from 'del';
|
|
8
6
|
import path from 'path';
|
|
9
|
-
|
|
10
|
-
import { afterAll, beforeAll, describe } from '@dxos/test';
|
|
7
|
+
import { afterAll, beforeAll, describe } from 'vitest';
|
|
11
8
|
|
|
12
9
|
import { createStorage } from './storage';
|
|
13
10
|
import { StorageType } from '../common';
|
|
@@ -19,11 +16,15 @@ const ROOT_DIRECTORY = path.resolve(path.join(__dirname, '../out', 'testing'));
|
|
|
19
16
|
* Node file system specific tests.
|
|
20
17
|
*/
|
|
21
18
|
describe.skip('storage benchmark', () => {
|
|
22
|
-
beforeAll(() =>
|
|
19
|
+
beforeAll(async () => {
|
|
20
|
+
await del(ROOT_DIRECTORY);
|
|
21
|
+
});
|
|
23
22
|
|
|
24
|
-
afterAll(() =>
|
|
23
|
+
afterAll(async () => {
|
|
24
|
+
await del(ROOT_DIRECTORY);
|
|
25
|
+
});
|
|
25
26
|
|
|
26
27
|
for (const dataStore of [StorageType.RAM, StorageType.NODE] as StorageType[]) {
|
|
27
|
-
storageBenchmark(dataStore, () => createStorage({ type: dataStore, root: ROOT_DIRECTORY }));
|
|
28
|
+
storageBenchmark('node', dataStore, () => createStorage({ type: dataStore, root: ROOT_DIRECTORY }));
|
|
28
29
|
}
|
|
29
30
|
});
|
|
@@ -2,15 +2,12 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
// @dxos/test platform=nodejs
|
|
6
|
-
|
|
7
5
|
import crypto from 'crypto';
|
|
8
6
|
import del from 'del';
|
|
9
7
|
import expect from 'expect';
|
|
10
8
|
import { promises as fs, constants } from 'fs';
|
|
11
9
|
import path from 'path';
|
|
12
|
-
|
|
13
|
-
import { afterAll, beforeAll, describe, test } from '@dxos/test';
|
|
10
|
+
import { afterAll, beforeAll, describe, test } from 'vitest';
|
|
14
11
|
|
|
15
12
|
import { createStorage } from './storage';
|
|
16
13
|
import { type File, StorageType } from '../common';
|
|
@@ -32,10 +29,14 @@ const write = async (file: File, data = 'test') => {
|
|
|
32
29
|
/**
|
|
33
30
|
* Node file system specific tests.
|
|
34
31
|
*/
|
|
35
|
-
describe('testing node storage types', () => {
|
|
36
|
-
beforeAll(() =>
|
|
32
|
+
describe('testing node storage types', (v) => {
|
|
33
|
+
beforeAll(async () => {
|
|
34
|
+
await del(ROOT_DIRECTORY);
|
|
35
|
+
});
|
|
37
36
|
|
|
38
|
-
afterAll(() =>
|
|
37
|
+
afterAll(async () => {
|
|
38
|
+
await del(ROOT_DIRECTORY);
|
|
39
|
+
});
|
|
39
40
|
|
|
40
41
|
for (const dataStore of [StorageType.RAM, StorageType.NODE] as StorageType[]) {
|
|
41
42
|
storageTests(dataStore, () => createStorage({ type: dataStore, root: ROOT_DIRECTORY }));
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import randomBytes from 'randombytes';
|
|
6
|
+
import { describe, test } from 'vitest';
|
|
6
7
|
|
|
7
8
|
import { latch } from '@dxos/async';
|
|
8
|
-
import { describe, test } from '@dxos/test';
|
|
9
9
|
import { range } from '@dxos/util';
|
|
10
10
|
|
|
11
11
|
import { type Storage, type StorageType } from '../common';
|
|
@@ -13,7 +13,7 @@ import { type Storage, type StorageType } from '../common';
|
|
|
13
13
|
export const randomText = () => Math.random().toString(36).substring(2);
|
|
14
14
|
|
|
15
15
|
// https://gist.github.com/dmaretskyi/20604a10f85704406bbc1a3c672db1e5
|
|
16
|
-
export const storageBenchmark = (testGroupName: StorageType, createStorage: () => Storage) => {
|
|
16
|
+
export const storageBenchmark = (environment: string, testGroupName: StorageType, createStorage: () => Storage) => {
|
|
17
17
|
describe(testGroupName, () => {
|
|
18
18
|
test('individual writers', async () => {
|
|
19
19
|
const DATA_SIZE = 1024;
|
|
@@ -73,7 +73,7 @@ export const storageBenchmark = (testGroupName: StorageType, createStorage: () =
|
|
|
73
73
|
|
|
74
74
|
console.log({
|
|
75
75
|
params: {
|
|
76
|
-
environment
|
|
76
|
+
environment,
|
|
77
77
|
date: new Date().toISOString(),
|
|
78
78
|
type: testGroupName,
|
|
79
79
|
DATA_SIZE,
|