@dxos/random-access-storage 0.3.11-main.fbbdc2a → 0.3.11-main.fc97a54
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 +37 -22
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +54 -14
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/browser/browser-storage.d.ts.map +1 -1
- package/dist/types/src/browser/web-fs.d.ts.map +1 -1
- package/dist/types/src/common/abstract-storage.d.ts +2 -2
- package/dist/types/src/common/abstract-storage.d.ts.map +1 -1
- package/dist/types/src/common/directory.d.ts +10 -2
- package/dist/types/src/common/directory.d.ts.map +1 -1
- package/dist/types/src/node/node-storage.d.ts +3 -0
- package/dist/types/src/node/node-storage.d.ts.map +1 -1
- package/dist/types/src/testing/storage.blueprint-test.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/browser/browser-storage.ts +2 -3
- package/src/browser/web-fs.ts +9 -9
- package/src/common/abstract-storage.ts +13 -13
- package/src/common/directory.ts +34 -11
- package/src/node/node-storage.ts +35 -1
- package/src/testing/storage.blueprint-test.ts +46 -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 this.type,\n getFullPath(this.path, sub),\n this._list.bind(this),\n (...args) => this.getOrCreateFile(...args),\n () => this._delete(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._delete('');\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(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 private _getFiles(path: string): 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(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 _delete(path: string): Promise<void> {\n await Promise.all(\n Array.from(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\n/**\n * Wraps a directory in the storage file system.\n */\nexport class Directory {\n constructor(\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 _delete: () => Promise<void>,\n private readonly _onFlush?: () => Promise<void>,\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(this.type, getFullPath(this.path, path), this._list, this._getOrCreateFile, this._delete);\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._delete();\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 { 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 } 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\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 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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,uBAAqB;AACrB,uBAAwB;AAGxB,mBAA8B;AAC9B,iBAAoB;ACLpB,IAAAA,oBAAqB;AEArB,kBAAiB;AAGjB,IAAAC,cAAoB;ACHpB,kCAAgB;AAGhB,kBAA8B;AEH9B,iBAAgB;AAChB,sBAA8B;AAC9B,IAAAD,oBAAqB;AACrB,gCAAgB;
|
|
6
|
-
"names": ["import_node_path", "import_log", "stringDiff", "first", "second", "split", "join", "getFullPath", "root", "path", "Directory", "constructor", "type", "
|
|
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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",
|
|
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":
|
|
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":14640,"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":1674,"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":22856},"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":3437},"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":9772}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-storage.d.ts","sourceRoot":"","sources":["../../../../src/browser/browser-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser-storage.d.ts","sourceRoot":"","sources":["../../../../src/browser/browser-storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAe,MAAM,WAAW,CAAC;AAEzD;;GAEG;AACH,8BAAsB,cAAe,SAAQ,eAAe;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuD;gBAExE,IAAI,EAAE,MAAM;IAKxB,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IAK1E,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,mBAAmB;cAEhF,QAAQ;CAkBlC"}
|
|
@@ -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;AAExG;;GAEG;AACH,qBAAa,KAAM,YAAW,OAAO;aAMP,IAAI,EAAE,MAAM;IALxC,QAAQ,CAAC,IAAI,qBAAqB;IAElC,SAAS,CAAC,QAAQ,CAAC,MAAM,uBAA8B;IACvD,SAAS,CAAC,KAAK,CAAC,EAAE,yBAAyB,CAAC;gBAEhB,IAAI,EAAE,MAAM;IAExC,IAAW,IAAI,WAEd;IAED,OAAO,CAAC,SAAS;YAOH,KAAK;YAwBL,WAAW;IASzB,eAAe,CAAC,GAAG,SAAK;IAaxB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAWjE,OAAO,CAAC,WAAW;YAYL,OAAO;IASf,KAAK;IASX,OAAO,CAAC,gBAAgB;IASlB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;CA6BvC;
|
|
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;AAExG;;GAEG;AACH,qBAAa,KAAM,YAAW,OAAO;aAMP,IAAI,EAAE,MAAM;IALxC,QAAQ,CAAC,IAAI,qBAAqB;IAElC,SAAS,CAAC,QAAQ,CAAC,MAAM,uBAA8B;IACvD,SAAS,CAAC,KAAK,CAAC,EAAE,yBAAyB,CAAC;gBAEhB,IAAI,EAAE,MAAM;IAExC,IAAW,IAAI,WAEd;IAED,OAAO,CAAC,SAAS;YAOH,KAAK;YAwBL,WAAW;IASzB,eAAe,CAAC,GAAG,SAAK;IAaxB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAWjE,OAAO,CAAC,WAAW;YAYL,OAAO;IASf,KAAK;IASX,OAAO,CAAC,gBAAgB;IASlB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;CA6BvC;AAID,qBAAa,OAAQ,SAAQ,YAAa,YAAW,IAAI;IAEvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAE/C;;OAEG;IACH,OAAO,CAAC,OAAO,CAA2B;IAE1C,OAAO,CAAC,kBAAkB,CAA8B;IAExD,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,aAAa,CAA8B;IAOnD,OAAO,CAAC,QAAQ,CAA2B;IAG3C,OAAO,CAAC,WAAW,CAA2B;IAG9C,OAAO,CAAC,MAAM,CAA2B;IAGzC,OAAO,CAAC,UAAU,CAA2B;IAG7C,OAAO,CAAC,OAAO,CAA2B;IAG1C,OAAO,CAAC,WAAW,CAA2B;IAE9C,IACI,WAAW,uBAEd;gBAEW,EACV,QAAQ,EACR,IAAI,EACJ,OAAO,GACR,EAAE;QACD,IAAI,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9B;IASD,IAAI,EAAE,WAAW,CAAqB;IAOtC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAQ;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAS;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAS;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAS;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAS;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAQ;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAQ;IAClC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAQ;IACnC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAQ;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAQ;IAElC,SAAS,UAAS;IAClB,SAAS,SAAM;IAEf,QAAQ,SAAM;IACd,MAAM,EAAE,mBAAmB,CAOF;YAEX,WAAW;YAMX,kBAAkB;YAKlB,WAAW;IAgBzB,OAAO,CAAC,WAAW;YAsBL,SAAS;IAQjB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAkBjC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAuBlC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAuBhC,IAAI;;;IAcJ,QAAQ,CAAC,MAAM,EAAE,MAAM;IAavB,KAAK;IAIL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO;CAId"}
|
|
@@ -34,8 +34,8 @@ export declare abstract class AbstractStorage implements Storage {
|
|
|
34
34
|
protected _openFile(file: RandomAccessStorage): RandomAccessStorage | undefined;
|
|
35
35
|
protected abstract _createFile(path: string, filename: string, opts?: any): RandomAccessStorage;
|
|
36
36
|
private _getFileIfExists;
|
|
37
|
-
|
|
37
|
+
protected _getFiles(path: string): Promise<Map<string, File>>;
|
|
38
38
|
private _closeFilesInPath;
|
|
39
|
-
protected
|
|
39
|
+
protected _remove(path: string): Promise<void>;
|
|
40
40
|
}
|
|
41
41
|
//# 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;
|
|
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;cAOf,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUrD"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { type File } from './file';
|
|
2
2
|
import { type StorageType } from './storage';
|
|
3
|
+
export type DirectoryParams = {
|
|
4
|
+
type: StorageType;
|
|
5
|
+
path: string;
|
|
6
|
+
list: (path: string) => Promise<string[]>;
|
|
7
|
+
getOrCreateFile: (path: string, filename: string, opts?: any) => File;
|
|
8
|
+
remove: () => Promise<void>;
|
|
9
|
+
onFlush?: () => Promise<void>;
|
|
10
|
+
};
|
|
3
11
|
/**
|
|
4
12
|
* Wraps a directory in the storage file system.
|
|
5
13
|
*/
|
|
@@ -8,9 +16,9 @@ export declare class Directory {
|
|
|
8
16
|
readonly path: string;
|
|
9
17
|
private readonly _list;
|
|
10
18
|
private readonly _getOrCreateFile;
|
|
11
|
-
private readonly
|
|
19
|
+
private readonly _remove;
|
|
12
20
|
private readonly _onFlush?;
|
|
13
|
-
constructor(type
|
|
21
|
+
constructor({ type, path, list, getOrCreateFile, remove, onFlush }: DirectoryParams);
|
|
14
22
|
toString(): string;
|
|
15
23
|
/**
|
|
16
24
|
* Create a new sub-directory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../../../../src/common/directory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C
|
|
1
|
+
{"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../../../../src/common/directory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACtE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,qBAAa,SAAS;IACpB,SAAgB,IAAI,EAAE,WAAW,CAAC;IAClC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAC5D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuD;IACxF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAsB;gBAEpC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,eAAe;IASnF,QAAQ;IAIR;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAUxC;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzB;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAI7C,KAAK;IAIX;;OAEG;IACG,MAAM;CAGb"}
|
|
@@ -5,8 +5,11 @@ import { AbstractStorage, type DiskInfo, type Storage, StorageType } from '../co
|
|
|
5
5
|
*/
|
|
6
6
|
export declare class NodeStorage extends AbstractStorage implements Storage {
|
|
7
7
|
type: StorageType;
|
|
8
|
+
private _initialized;
|
|
9
|
+
private _loadFiles;
|
|
8
10
|
protected _createFile(path: string, filename: string, opts?: any): RandomAccessStorage;
|
|
9
11
|
protected _destroy(): Promise<void>;
|
|
12
|
+
protected _getFiles(path: string): Promise<Map<string, import("../common").File>>;
|
|
10
13
|
getDiskInfo(): Promise<DiskInfo>;
|
|
11
14
|
}
|
|
12
15
|
//# sourceMappingURL=node-storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-storage.d.ts","sourceRoot":"","sources":["../../../../src/node/node-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"node-storage.d.ts","sourceRoot":"","sources":["../../../../src/node/node-storage.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,WAAW,EAAY,MAAM,WAAW,CAAC;AAEhG;;GAEG;AACH,qBAAa,WAAY,SAAQ,eAAgB,YAAW,OAAO;IACjD,IAAI,EAAE,WAAW,CAAoB;IACrD,OAAO,CAAC,YAAY,CAAS;YAEf,UAAU;cAuBL,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,GAAQ,GAAG,mBAAmB;cAS1E,QAAQ;cAIR,SAAS,CAAC,IAAI,EAAE,MAAM;IASzC,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;CAoBvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.blueprint-test.d.ts","sourceRoot":"","sources":["../../../../src/testing/storage.blueprint-test.ts"],"names":[],"mappings":"AAUA,OAAO,EAAa,KAAK,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAIjE,eAAO,MAAM,UAAU,cAAgD,CAAC;AAExE,eAAO,MAAM,YAAY,kBAAmB,WAAW,iBAAiB,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"storage.blueprint-test.d.ts","sourceRoot":"","sources":["../../../../src/testing/storage.blueprint-test.ts"],"names":[],"mappings":"AAUA,OAAO,EAAa,KAAK,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAIjE,eAAO,MAAM,UAAU,cAAgD,CAAC;AAExE,eAAO,MAAM,YAAY,kBAAmB,WAAW,iBAAiB,MAAM,OAAO,SA6VpF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/random-access-storage",
|
|
3
|
-
"version": "0.3.11-main.
|
|
3
|
+
"version": "0.3.11-main.fc97a54",
|
|
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.3.11-main.
|
|
28
|
-
"@dxos/
|
|
29
|
-
"@dxos/
|
|
30
|
-
"@dxos/
|
|
31
|
-
"@dxos/node-std": "0.3.11-main.
|
|
32
|
-
"@dxos/
|
|
33
|
-
"@dxos/
|
|
34
|
-
"@dxos/
|
|
27
|
+
"@dxos/async": "0.3.11-main.fc97a54",
|
|
28
|
+
"@dxos/log": "0.3.11-main.fc97a54",
|
|
29
|
+
"@dxos/invariant": "0.3.11-main.fc97a54",
|
|
30
|
+
"@dxos/debug": "0.3.11-main.fc97a54",
|
|
31
|
+
"@dxos/node-std": "0.3.11-main.fc97a54",
|
|
32
|
+
"@dxos/util": "0.3.11-main.fc97a54",
|
|
33
|
+
"@dxos/tracing": "0.3.11-main.fc97a54",
|
|
34
|
+
"@dxos/context": "0.3.11-main.fc97a54"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/pify": "^3.0.2",
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { join } from 'node:path';
|
|
6
5
|
import type { RandomAccessStorage } from 'random-access-storage';
|
|
7
6
|
|
|
8
|
-
import { AbstractStorage } from '../common';
|
|
7
|
+
import { AbstractStorage, getFullPath } from '../common';
|
|
9
8
|
|
|
10
9
|
/**
|
|
11
10
|
* Base class for random access files based on IDB.
|
|
@@ -19,7 +18,7 @@ export abstract class BrowserStorage extends AbstractStorage {
|
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
protected _createFile(path: string, filename: string): RandomAccessStorage {
|
|
22
|
-
const fullPath =
|
|
21
|
+
const fullPath = getFullPath(path, filename);
|
|
23
22
|
return this._fileStorage(fullPath);
|
|
24
23
|
}
|
|
25
24
|
|
package/src/browser/web-fs.ts
CHANGED
|
@@ -69,16 +69,16 @@ export class WebFS implements Storage {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
createDirectory(sub = '') {
|
|
72
|
-
return new Directory(
|
|
73
|
-
this.type,
|
|
74
|
-
getFullPath(this.path, sub),
|
|
75
|
-
(path) => this._list(path),
|
|
76
|
-
(...args) => this.getOrCreateFile(...args),
|
|
77
|
-
() => this._delete(sub),
|
|
78
|
-
async () => {
|
|
72
|
+
return new Directory({
|
|
73
|
+
type: this.type,
|
|
74
|
+
path: getFullPath(this.path, sub),
|
|
75
|
+
list: (path) => this._list(path),
|
|
76
|
+
getOrCreateFile: (...args) => this.getOrCreateFile(...args),
|
|
77
|
+
remove: () => this._delete(sub),
|
|
78
|
+
onFlush: async () => {
|
|
79
79
|
await Promise.all(Array.from(this._getFiles(sub)).map(([path, file]) => file.flush()));
|
|
80
80
|
},
|
|
81
|
-
);
|
|
81
|
+
});
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
getOrCreateFile(path: string, filename: string, opts?: any): File {
|
|
@@ -163,7 +163,7 @@ export class WebFS implements Storage {
|
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
// TODO(mykola): Remove EventEmitter.
|
|
166
|
-
@trace.resource()
|
|
166
|
+
// @trace.resource()
|
|
167
167
|
export class WebFile extends EventEmitter implements File {
|
|
168
168
|
@trace.info()
|
|
169
169
|
private readonly _fileName: string;
|
|
@@ -42,13 +42,13 @@ export abstract class AbstractStorage implements Storage {
|
|
|
42
42
|
// TODO(burdon): Make required.
|
|
43
43
|
public createDirectory(sub = ''): Directory {
|
|
44
44
|
// invariant(sub.length);
|
|
45
|
-
return new Directory(
|
|
46
|
-
this.type,
|
|
47
|
-
getFullPath(this.path, sub),
|
|
48
|
-
this._list.bind(this),
|
|
49
|
-
(...args) => this.getOrCreateFile(...args),
|
|
50
|
-
() => this.
|
|
51
|
-
);
|
|
45
|
+
return new Directory({
|
|
46
|
+
type: this.type,
|
|
47
|
+
path: getFullPath(this.path, sub),
|
|
48
|
+
list: this._list.bind(this),
|
|
49
|
+
getOrCreateFile: (...args) => this.getOrCreateFile(...args),
|
|
50
|
+
remove: () => this._remove(sub),
|
|
51
|
+
});
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
/**
|
|
@@ -58,7 +58,7 @@ export abstract class AbstractStorage implements Storage {
|
|
|
58
58
|
try {
|
|
59
59
|
log.info('Erasing all data...');
|
|
60
60
|
await this._closeFilesInPath('');
|
|
61
|
-
await this.
|
|
61
|
+
await this._remove('');
|
|
62
62
|
await this._destroy();
|
|
63
63
|
log('Erased...');
|
|
64
64
|
} catch (err: any) {
|
|
@@ -68,7 +68,7 @@ export abstract class AbstractStorage implements Storage {
|
|
|
68
68
|
|
|
69
69
|
protected async _list(path: string): Promise<string[]> {
|
|
70
70
|
// TODO(dmaretskyi): Fix me.
|
|
71
|
-
return Array.from(this._getFiles(path).keys()).map((filename) => {
|
|
71
|
+
return Array.from((await this._getFiles(path)).keys()).map((filename) => {
|
|
72
72
|
let name = filename.replace(path, '');
|
|
73
73
|
if (name.startsWith('/')) {
|
|
74
74
|
name = name.substring(1);
|
|
@@ -121,7 +121,7 @@ export abstract class AbstractStorage implements Storage {
|
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
protected async _getFiles(path: string): Promise<Map<string, File>> {
|
|
125
125
|
const fullPath = getFullPath(this.path, path);
|
|
126
126
|
return new Map(
|
|
127
127
|
[...this._files.entries()].filter(([path, file]) => path.includes(fullPath) && file.destroyed !== true),
|
|
@@ -130,14 +130,14 @@ export abstract class AbstractStorage implements Storage {
|
|
|
130
130
|
|
|
131
131
|
private async _closeFilesInPath(path: string): Promise<void> {
|
|
132
132
|
await Promise.all(
|
|
133
|
-
Array.from(this._getFiles(path).values()).map((file) => file.close().catch((err: any) => log.catch(err))),
|
|
133
|
+
Array.from((await this._getFiles(path)).values()).map((file) => file.close().catch((err: any) => log.catch(err))),
|
|
134
134
|
);
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
// TODO(burdon): Delete directory (not just listed files).
|
|
138
|
-
protected async
|
|
138
|
+
protected async _remove(path: string): Promise<void> {
|
|
139
139
|
await Promise.all(
|
|
140
|
-
Array.from(this._getFiles(path)).map(([path, file]) => {
|
|
140
|
+
Array.from(await this._getFiles(path)).map(([path, file]) => {
|
|
141
141
|
return file
|
|
142
142
|
.destroy()
|
|
143
143
|
.then(() => this._files.delete(path))
|
package/src/common/directory.ts
CHANGED
|
@@ -6,19 +6,36 @@ import { type File } from './file';
|
|
|
6
6
|
import { type StorageType } from './storage';
|
|
7
7
|
import { getFullPath } from './utils';
|
|
8
8
|
|
|
9
|
+
export type DirectoryParams = {
|
|
10
|
+
type: StorageType;
|
|
11
|
+
path: string;
|
|
12
|
+
// TODO(burdon): Create interface for these methods (shared with AbstractStorage).
|
|
13
|
+
list: (path: string) => Promise<string[]>;
|
|
14
|
+
getOrCreateFile: (path: string, filename: string, opts?: any) => File;
|
|
15
|
+
remove: () => Promise<void>;
|
|
16
|
+
onFlush?: () => Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
|
|
9
19
|
/**
|
|
10
20
|
* Wraps a directory in the storage file system.
|
|
11
21
|
*/
|
|
12
22
|
export class Directory {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
) {
|
|
23
|
+
public readonly type: StorageType;
|
|
24
|
+
public readonly path: string;
|
|
25
|
+
// TODO(burdon): Create interface for these methods (shared with AbstractStorage).
|
|
26
|
+
private readonly _list: (path: string) => Promise<string[]>;
|
|
27
|
+
private readonly _getOrCreateFile: (path: string, filename: string, opts?: any) => File;
|
|
28
|
+
private readonly _remove: () => Promise<void>;
|
|
29
|
+
private readonly _onFlush?: () => Promise<void>;
|
|
30
|
+
|
|
31
|
+
constructor({ type, path, list, getOrCreateFile, remove, onFlush }: DirectoryParams) {
|
|
32
|
+
this.type = type;
|
|
33
|
+
this.path = path;
|
|
34
|
+
this._list = list;
|
|
35
|
+
this._getOrCreateFile = getOrCreateFile;
|
|
36
|
+
this._remove = remove;
|
|
37
|
+
this._onFlush = onFlush;
|
|
38
|
+
}
|
|
22
39
|
|
|
23
40
|
toString() {
|
|
24
41
|
return `Directory(${JSON.stringify({ type: this.type, path: this.path })})`;
|
|
@@ -28,7 +45,13 @@ export class Directory {
|
|
|
28
45
|
* Create a new sub-directory.
|
|
29
46
|
*/
|
|
30
47
|
createDirectory(path: string): Directory {
|
|
31
|
-
return new Directory(
|
|
48
|
+
return new Directory({
|
|
49
|
+
type: this.type,
|
|
50
|
+
path: getFullPath(this.path, path),
|
|
51
|
+
list: this._list,
|
|
52
|
+
getOrCreateFile: this._getOrCreateFile,
|
|
53
|
+
remove: this._remove,
|
|
54
|
+
});
|
|
32
55
|
}
|
|
33
56
|
|
|
34
57
|
/**
|
|
@@ -53,6 +76,6 @@ export class Directory {
|
|
|
53
76
|
* Close and delete all files in the directory and all its sub-directories.
|
|
54
77
|
*/
|
|
55
78
|
async delete() {
|
|
56
|
-
await this.
|
|
79
|
+
await this._remove();
|
|
57
80
|
}
|
|
58
81
|
}
|
package/src/node/node-storage.ts
CHANGED
|
@@ -3,18 +3,43 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import del from 'del';
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
6
7
|
import { readdir, stat } from 'node:fs/promises';
|
|
7
8
|
import { join } from 'node:path';
|
|
8
9
|
import raf from 'random-access-file';
|
|
9
10
|
import { type RandomAccessStorage } from 'random-access-storage';
|
|
10
11
|
|
|
11
|
-
import { AbstractStorage, type DiskInfo, type Storage, StorageType } from '../common';
|
|
12
|
+
import { AbstractStorage, type DiskInfo, type Storage, StorageType, wrapFile } from '../common';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Storage interface implementation for Node.
|
|
15
16
|
*/
|
|
16
17
|
export class NodeStorage extends AbstractStorage implements Storage {
|
|
17
18
|
public override type: StorageType = StorageType.NODE;
|
|
19
|
+
private _initialized = false;
|
|
20
|
+
|
|
21
|
+
private async _loadFiles(path: string) {
|
|
22
|
+
// TODO(mykola): Do not load all files at once. It is a quick fix.
|
|
23
|
+
if (!existsSync(path)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Preload all files in a directory.
|
|
28
|
+
const dir = await readdir(path);
|
|
29
|
+
for (const entry of dir) {
|
|
30
|
+
const fullPath = join(path, entry);
|
|
31
|
+
if (this._files.has(fullPath)) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const entryInfo = await stat(fullPath);
|
|
35
|
+
if (entryInfo.isDirectory()) {
|
|
36
|
+
await this._loadFiles(fullPath);
|
|
37
|
+
} else if (entryInfo.isFile()) {
|
|
38
|
+
const file = this._createFile(path, entry);
|
|
39
|
+
this._files.set(fullPath, wrapFile(file, this.type));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
18
43
|
|
|
19
44
|
protected override _createFile(path: string, filename: string, opts: any = {}): RandomAccessStorage {
|
|
20
45
|
const file = raf(filename, { directory: path, ...opts });
|
|
@@ -29,6 +54,15 @@ export class NodeStorage extends AbstractStorage implements Storage {
|
|
|
29
54
|
await del(this.path, { force: true });
|
|
30
55
|
}
|
|
31
56
|
|
|
57
|
+
protected override async _getFiles(path: string) {
|
|
58
|
+
if (!this._initialized) {
|
|
59
|
+
await this._loadFiles(this.path);
|
|
60
|
+
this._initialized = true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return super._getFiles(path);
|
|
64
|
+
}
|
|
65
|
+
|
|
32
66
|
async getDiskInfo(): Promise<DiskInfo> {
|
|
33
67
|
let used = 0;
|
|
34
68
|
|