@dxos/random-access-storage 0.4.8 → 0.4.9-main.1057b49

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.
@@ -348,13 +348,89 @@ var FirefoxStorage = class extends BrowserStorage {
348
348
 
349
349
  // packages/common/random-access-storage/src/browser/idb-storage.ts
350
350
  import idb from "random-access-idb";
351
+ import { invariant } from "@dxos/invariant";
352
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/random-access-storage/src/browser/idb-storage.ts";
353
+ var DELIM = "\0";
351
354
  var IDbStorage = class extends BrowserStorage {
352
355
  constructor() {
353
356
  super(...arguments);
354
357
  this.type = StorageType.IDB;
358
+ this._store = "data";
359
+ this._initialized = false;
355
360
  }
356
361
  _createFileStorage(path) {
357
- return idb(path);
362
+ const database = idb(path);
363
+ let res;
364
+ this._db = new Promise((resolve) => {
365
+ res = resolve;
366
+ });
367
+ database.getdb(res);
368
+ return database.create;
369
+ }
370
+ _createFile(path, filename) {
371
+ const file = this._fileStorage(getFullPath(path, filename));
372
+ file.destroy = (cb) => {
373
+ void this._db.then((db) => {
374
+ const lowerBound = getFullPath(path, filename);
375
+ const upperBound = `${lowerBound}\uFFFF`;
376
+ const range = IDBKeyRange.bound(lowerBound, upperBound);
377
+ const transaction = db.transaction(this._store, "readwrite");
378
+ const objectStore = transaction.objectStore(this._store);
379
+ objectStore.delete(range);
380
+ transaction.oncomplete = () => {
381
+ file.destroyed = true;
382
+ file.unlinked = true;
383
+ file.closed = true;
384
+ cb(null);
385
+ };
386
+ transaction.onerror = () => cb(transaction.error);
387
+ });
388
+ };
389
+ file.deletable = true;
390
+ return file;
391
+ }
392
+ async _loadFiles(path) {
393
+ const db = await this._db;
394
+ invariant(db, "Database is not initialized.", {
395
+ F: __dxlog_file3,
396
+ L: 63,
397
+ S: this,
398
+ A: [
399
+ "db",
400
+ "'Database is not initialized.'"
401
+ ]
402
+ });
403
+ const lowerBound = path;
404
+ const upperBound = `${path}\uFFFF`;
405
+ const range = IDBKeyRange.bound(lowerBound, upperBound);
406
+ const transaction = db.transaction(this._store);
407
+ const objectStore = transaction.objectStore(this._store);
408
+ const request = objectStore.openCursor(range);
409
+ return new Promise((resolve, reject) => {
410
+ transaction.onerror = () => {
411
+ reject(request.error);
412
+ };
413
+ request.onsuccess = (event) => {
414
+ const cursor = event.target.result;
415
+ if (cursor) {
416
+ const filename = String(cursor.key).split(DELIM)[0];
417
+ if (filename && !this._files.has(getFullPath(this.path, filename))) {
418
+ const file = this._createFile(path, filename);
419
+ this._files.set(getFullPath(this.path, filename), wrapFile(file, this.type));
420
+ }
421
+ cursor.continue();
422
+ } else {
423
+ resolve();
424
+ }
425
+ };
426
+ });
427
+ }
428
+ async _getFiles(path) {
429
+ if (!this._initialized) {
430
+ await this._loadFiles(this.path);
431
+ this._initialized = true;
432
+ }
433
+ return super._getFiles(path);
358
434
  }
359
435
  };
360
436
 
@@ -362,7 +438,7 @@ var IDbStorage = class extends BrowserStorage {
362
438
  import { EventEmitter } from "@dxos/node-std/events";
363
439
  import { callbackify } from "@dxos/node-std/util";
364
440
  import { synchronized } from "@dxos/async";
365
- import { invariant } from "@dxos/invariant";
441
+ import { invariant as invariant2 } from "@dxos/invariant";
366
442
  import { log as log3 } from "@dxos/log";
367
443
  import { TimeSeriesCounter, trace } from "@dxos/tracing";
368
444
  function _ts_decorate(decorators, target, key, desc) {
@@ -375,7 +451,7 @@ function _ts_decorate(decorators, target, key, desc) {
375
451
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
376
452
  return c > 3 && r && Object.defineProperty(target, key, r), r;
377
453
  }
378
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/random-access-storage/src/browser/web-fs.ts";
454
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/common/random-access-storage/src/browser/web-fs.ts";
379
455
  var WebFS = class {
380
456
  constructor(path) {
381
457
  this.path = path;
@@ -409,8 +485,8 @@ var WebFS = class {
409
485
  return this._root;
410
486
  }
411
487
  this._root = await navigator.storage.getDirectory();
412
- invariant(this._root, "Root is undefined", {
413
- F: __dxlog_file3,
488
+ invariant2(this._root, "Root is undefined", {
489
+ F: __dxlog_file4,
414
490
  L: 73,
415
491
  S: this,
416
492
  A: [
@@ -458,7 +534,7 @@ var WebFS = class {
458
534
  async _delete(path) {
459
535
  await Promise.all(Array.from(this._getFiles(path)).map(async ([path2, file]) => {
460
536
  await file.destroy().catch((err) => log3.warn(err, void 0, {
461
- F: __dxlog_file3,
537
+ F: __dxlog_file4,
462
538
  L: 116,
463
539
  S: this,
464
540
  C: (f, a) => f(...a)
@@ -475,7 +551,7 @@ var WebFS = class {
475
551
  filename,
476
552
  err
477
553
  }, {
478
- F: __dxlog_file3,
554
+ F: __dxlog_file4,
479
555
  L: 126,
480
556
  S: this,
481
557
  C: (f, a) => f(...a)
@@ -490,7 +566,7 @@ var WebFS = class {
490
566
  file: file.fileName,
491
567
  e
492
568
  }, {
493
- F: __dxlog_file3,
569
+ F: __dxlog_file4,
494
570
  L: 136,
495
571
  S: this,
496
572
  C: (f, a) => f(...a)
@@ -606,8 +682,8 @@ var WebFile = class extends EventEmitter {
606
682
  this._flushSequence = sequence + 1;
607
683
  this._flushes.inc();
608
684
  await this._loadBufferGuarded();
609
- invariant(this._buffer, void 0, {
610
- F: __dxlog_file3,
685
+ invariant2(this._buffer, void 0, {
686
+ F: __dxlog_file4,
611
687
  L: 300,
612
688
  S: this,
613
689
  A: [
@@ -635,7 +711,7 @@ var WebFile = class extends EventEmitter {
635
711
  await this._flushPromise;
636
712
  this._flushScheduled = false;
637
713
  this._flushPromise = this._flushCache(sequence).catch((err) => log3.warn(err, void 0, {
638
- F: __dxlog_file3,
714
+ F: __dxlog_file4,
639
715
  L: 318,
640
716
  S: this,
641
717
  C: (f, a) => f(...a)
@@ -646,7 +722,7 @@ var WebFile = class extends EventEmitter {
646
722
  async _flushNow() {
647
723
  await this._flushPromise;
648
724
  this._flushPromise = this._flushCache(this._flushSequence).catch((err) => log3.warn(err, void 0, {
649
- F: __dxlog_file3,
725
+ F: __dxlog_file4,
650
726
  L: 326,
651
727
  S: this,
652
728
  C: (f, a) => f(...a)
@@ -660,8 +736,8 @@ var WebFile = class extends EventEmitter {
660
736
  this._readBytes.inc(size);
661
737
  if (!this._buffer) {
662
738
  await this._loadBufferGuarded();
663
- invariant(this._buffer, void 0, {
664
- F: __dxlog_file3,
739
+ invariant2(this._buffer, void 0, {
740
+ F: __dxlog_file4,
665
741
  L: 339,
666
742
  S: this,
667
743
  A: [
@@ -682,8 +758,8 @@ var WebFile = class extends EventEmitter {
682
758
  this._writeBytes.inc(data.length);
683
759
  if (!this._buffer) {
684
760
  await this._loadBufferGuarded();
685
- invariant(this._buffer, void 0, {
686
- F: __dxlog_file3,
761
+ invariant2(this._buffer, void 0, {
762
+ F: __dxlog_file4,
687
763
  L: 359,
688
764
  S: this,
689
765
  A: [
@@ -710,8 +786,8 @@ var WebFile = class extends EventEmitter {
710
786
  }
711
787
  if (!this._buffer) {
712
788
  await this._loadBufferGuarded();
713
- invariant(this._buffer, void 0, {
714
- F: __dxlog_file3,
789
+ invariant2(this._buffer, void 0, {
790
+ F: __dxlog_file4,
715
791
  L: 386,
716
792
  S: this,
717
793
  A: [
@@ -733,8 +809,8 @@ var WebFile = class extends EventEmitter {
733
809
  this._operations.inc();
734
810
  if (!this._buffer) {
735
811
  await this._loadBufferGuarded();
736
- invariant(this._buffer, void 0, {
737
- F: __dxlog_file3,
812
+ invariant2(this._buffer, void 0, {
813
+ F: __dxlog_file4,
738
814
  L: 408,
739
815
  S: this,
740
816
  A: [
@@ -752,8 +828,8 @@ var WebFile = class extends EventEmitter {
752
828
  this._operations.inc();
753
829
  if (!this._buffer) {
754
830
  await this._loadBufferGuarded();
755
- invariant(this._buffer, void 0, {
756
- F: __dxlog_file3,
831
+ invariant2(this._buffer, void 0, {
832
+ F: __dxlog_file4,
757
833
  L: 423,
758
834
  S: this,
759
835
  A: [
@@ -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/browser/firefox-storage.ts", "../../../src/browser/browser-storage.ts", "../../../src/browser/idb-storage.ts", "../../../src/browser/web-fs.ts", "../../../src/browser/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 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.info('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 { type DiskInfo, 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 async getDiskInfo(): Promise<DiskInfo> {\n let used = 0;\n\n for (const file of this._files.values()) {\n const size = (file as any).length;\n used += Number.isNaN(size) ? 0 : size;\n }\n\n return {\n used,\n };\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\n// NOTE: Removing the .js extension here breaks usage in create-react-app.\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport raw from 'random-access-web/mutable-file-wrapper.js';\n\nimport { BrowserStorage } from './browser-storage';\nimport { StorageType } from '../common';\n\n/**\n * Storage interface implementation for Firefox browser.\n * https://github.com/random-access-storage/random-access-web\n */\nexport class FirefoxStorage extends BrowserStorage {\n public override type: StorageType = StorageType.FIREFOX;\n\n protected override _createFileStorage(path: string) {\n return raw({ name: path });\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport type { RandomAccessStorage } from 'random-access-storage';\n\nimport { AbstractStorage, getFullPath } from '../common';\n\n/**\n * Base class for random access files based on IDB.\n */\nexport abstract class BrowserStorage extends AbstractStorage {\n private readonly _fileStorage: (filename: string, opts?: {}) => RandomAccessStorage;\n\n constructor(path: string) {\n super(path);\n this._fileStorage = this._createFileStorage(path);\n }\n\n protected _createFile(path: string, filename: string): RandomAccessStorage {\n const fullPath = getFullPath(path, filename);\n return this._fileStorage(fullPath);\n }\n\n protected abstract _createFileStorage(path: string): (filename: string, opts?: {}) => RandomAccessStorage;\n\n protected override async _destroy() {\n // eslint-disable-next-line no-undef\n return new Promise<void>((resolve, reject) => {\n const request = indexedDB.deleteDatabase(this.path);\n request.onsuccess = () => {\n resolve();\n };\n request.onupgradeneeded = () => {\n reject(new Error('Upgrade needed.'));\n };\n request.onblocked = () => {\n reject(new Error('Blocked.'));\n };\n request.onerror = (err: any) => {\n reject(err);\n };\n });\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport idb from 'random-access-idb';\n\nimport { BrowserStorage } from './browser-storage';\nimport { StorageType } from '../common';\n\n/**\n * Storage interface implementation for index DB.\n * https://github.com/random-access-storage/random-access-idb\n */\nexport class IDbStorage extends BrowserStorage {\n public override type: StorageType = StorageType.IDB;\n\n protected override _createFileStorage(path: string) {\n return idb(path);\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { EventEmitter } from 'node:events';\nimport { callbackify } from 'node:util';\nimport { type RandomAccessStorage } from 'random-access-storage';\n\nimport { synchronized } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { TimeSeriesCounter, trace } from '@dxos/tracing';\n\nimport { Directory, type DiskInfo, type File, type Storage, StorageType, getFullPath } from '../common';\n\n/**\n * Web file systems.\n */\nexport class WebFS implements Storage {\n private readonly _files = new Map<string, WebFile>();\n\n readonly type = StorageType.WEBFS;\n\n protected _root?: FileSystemDirectoryHandle;\n\n constructor(public readonly path: string) {}\n\n public get size() {\n return this._files.size;\n }\n\n private _getFiles(path: string): Map<string, WebFile> {\n const fullName = this._getFullFilename(this.path, path);\n return new Map(\n [...this._files.entries()].filter(([path, file]) => {\n return path.includes(fullName) && !file.destroyed;\n }),\n );\n }\n\n private async _list(path: string): Promise<string[]> {\n const fullName = this._getFullFilename(path);\n\n const root = await this._initialize();\n\n // TODO(dmaretskyi): While we're storing all files in flat namespace we just iterate the root.\n // console.log({ path, fullName })\n // let dir: FileSystemDirectoryHandle;\n // if (path === '') {\n // dir = root;\n // } else {\n // dir = await root.getDirectoryHandle(fullName, { create: true });\n // }\n const entries: string[] = [];\n\n for await (const entry of (root as any).keys()) {\n // Filter out .crswap files.\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1228068\n // https://github.com/logseq/logseq/issues/4466#:~:text=Jun%2015%2C%202023-,.,is%20used%20to%20edit%20files.\n if (entry.startsWith(fullName + '_') && !entry.endsWith('.crswap')) {\n entries.push(entry.slice(fullName.length + 1));\n }\n }\n return entries;\n }\n\n @synchronized\n private async _initialize() {\n if (this._root) {\n return this._root;\n }\n this._root = await navigator.storage.getDirectory();\n invariant(this._root, 'Root is undefined');\n return this._root;\n }\n\n createDirectory(sub = '') {\n return new Directory({\n type: this.type,\n path: getFullPath(this.path, sub),\n list: (path) => this._list(path),\n getOrCreateFile: (...args) => this.getOrCreateFile(...args),\n remove: () => this._delete(sub),\n onFlush: async () => {\n await Promise.all(Array.from(this._getFiles(sub)).map(([_, file]) => file.flush()));\n },\n });\n }\n\n getOrCreateFile(path: string, filename: string, opts?: any): File {\n const fullName = this._getFullFilename(path, filename);\n const existingFile = this._files.get(fullName);\n if (existingFile) {\n return existingFile;\n }\n const file = this._createFile(fullName);\n this._files.set(fullName, file);\n return file;\n }\n\n private _createFile(fullName: string) {\n return new WebFile({\n fileName: fullName,\n file: this._initialize().then((root) => root.getFileHandle(fullName, { create: true })),\n destroy: async () => {\n this._files.delete(fullName);\n const root = await this._initialize();\n return root.removeEntry(fullName);\n },\n });\n }\n\n private async _delete(path: string): Promise<void> {\n await Promise.all(\n Array.from(this._getFiles(path)).map(async ([path, file]) => {\n await file.destroy().catch((err: any) => log.warn(err));\n this._files.delete(path);\n }),\n );\n }\n\n async reset() {\n await this._initialize();\n for await (const filename of await (this._root as any).keys()) {\n await this._root!.removeEntry(filename, { recursive: true }).catch((err: any) =>\n log.warn('failed to remove an entry', { filename, err }),\n );\n this._files.delete(filename);\n }\n this._root = undefined;\n }\n\n async close() {\n await Promise.all(\n Array.from(this._files.values()).map((file) => {\n return file.close().catch((e) => log.warn('failed to close a file', { file: file.fileName, e }));\n }),\n );\n }\n\n private _getFullFilename(path: string, filename?: string) {\n // Replace slashes with underscores. Because we can't have slashes in filenames in Browser File Handle API.\n if (filename) {\n return getFullPath(path, filename).replace(/\\//g, '_');\n } else {\n return path.replace(/\\//g, '_');\n }\n }\n\n async getDiskInfo(): Promise<DiskInfo> {\n let used = 0;\n\n const recurse = async (handle: FileSystemDirectoryHandle) => {\n const promises = [];\n\n for await (const entry of (handle as any).values()) {\n promises.push(\n (async () => {\n switch (entry.kind) {\n case 'file':\n used += await (entry as FileSystemFileHandle).getFile().then((f) => f.size);\n break;\n case 'directory':\n await recurse(entry as FileSystemDirectoryHandle);\n break;\n }\n })(),\n );\n }\n await Promise.all(promises);\n };\n\n await recurse(this._root!);\n\n return {\n used,\n };\n }\n}\n\n// TODO(mykola): Remove EventEmitter.\n// @trace.resource()\nexport class WebFile extends EventEmitter implements File {\n @trace.info()\n readonly fileName: string;\n\n private readonly _fileHandle: Promise<FileSystemFileHandle>;\n private readonly _destroy: () => Promise<void>;\n\n /**\n * Current view of the file contents.\n */\n private _buffer: Uint8Array | null = null;\n\n private _loadBufferPromise: Promise<void> | null = null;\n\n private _flushScheduled = false;\n private _flushPromise: Promise<void> = Promise.resolve();\n /**\n * Used to discard unnecessary scheduled flushes.\n * If _flushNow() is called with a lower sequence number it should early exit.\n */\n private _flushSequence = 0;\n\n //\n // Metrics\n //\n\n @trace.metricsCounter()\n private _flushes = new TimeSeriesCounter();\n\n @trace.metricsCounter()\n private _operations = new TimeSeriesCounter();\n\n @trace.metricsCounter()\n private _reads = new TimeSeriesCounter();\n\n @trace.metricsCounter()\n private _readBytes = new TimeSeriesCounter();\n\n @trace.metricsCounter()\n private _writes = new TimeSeriesCounter();\n\n @trace.metricsCounter()\n private _writeBytes = new TimeSeriesCounter();\n\n @trace.info()\n get _bufferSize() {\n return this._buffer?.length;\n }\n\n constructor({\n fileName,\n file,\n destroy,\n }: {\n file: Promise<FileSystemFileHandle>;\n fileName: string;\n destroy: () => Promise<void>;\n }) {\n super();\n this.fileName = fileName;\n this._fileHandle = file;\n this._destroy = destroy;\n\n void this._loadBufferGuarded();\n }\n\n type: StorageType = StorageType.WEBFS;\n\n //\n // random-access-storage library compatibility\n //\n\n // TODO(dmaretskyi): Are those all needed?\n readonly opened: boolean = true;\n readonly suspended: boolean = false;\n readonly closed: boolean = false;\n readonly unlinked: boolean = false;\n readonly writing: boolean = false;\n readonly readable: boolean = true;\n readonly writable: boolean = true;\n readonly deletable: boolean = true;\n readonly truncatable: boolean = true;\n readonly statable: boolean = true;\n\n destroyed = false;\n directory = '';\n // TODO(dmaretskyi): is this used?\n filename = '';\n native: RandomAccessStorage = {\n write: callbackify(this.write.bind(this)),\n read: callbackify(this.read.bind(this)),\n del: callbackify(this.del.bind(this)),\n stat: callbackify(this.stat.bind(this)),\n destroy: callbackify(this.destroy.bind(this)),\n truncate: callbackify(this.truncate?.bind(this)),\n } as RandomAccessStorage;\n\n private async _loadBuffer() {\n const fileHandle = await this._fileHandle;\n const file = await fileHandle.getFile();\n this._buffer = new Uint8Array(await file.arrayBuffer());\n }\n\n private async _loadBufferGuarded() {\n await (this._loadBufferPromise ??= this._loadBuffer());\n }\n\n // Do not call directly, use _flushLater or _flushNow.\n private async _flushCache(sequence: number) {\n if (this.destroyed || sequence < this._flushSequence) {\n return;\n }\n this._flushSequence = sequence + 1;\n\n this._flushes.inc();\n\n await this._loadBufferGuarded();\n invariant(this._buffer);\n\n const fileHandle = await this._fileHandle;\n const writable = await fileHandle.createWritable({ keepExistingData: true });\n await writable.write({ type: 'write', data: this._buffer, position: 0 });\n await writable.close();\n }\n\n private _flushLater() {\n if (this._flushScheduled) {\n return;\n }\n\n const sequence = this._flushSequence;\n setTimeout(async () => {\n // Making sure only one flush can run at a time.\n await this._flushPromise;\n this._flushScheduled = false;\n this._flushPromise = this._flushCache(sequence).catch((err) => log.warn(err));\n });\n\n this._flushScheduled = true;\n }\n\n private async _flushNow() {\n await this._flushPromise;\n this._flushPromise = this._flushCache(this._flushSequence).catch((err) => log.warn(err));\n await this._flushPromise;\n }\n\n async read(offset: number, size: number) {\n this.assertNotDestroyed('Read');\n\n this._operations.inc();\n this._reads.inc();\n this._readBytes.inc(size);\n\n if (!this._buffer) {\n await this._loadBufferGuarded();\n invariant(this._buffer);\n }\n\n if (offset + size > this._buffer.length) {\n throw new Error('Read out of bounds');\n }\n\n // Copy data into a new buffer.\n return Buffer.from(this._buffer.slice(offset, offset + size));\n }\n\n async write(offset: number, data: Buffer) {\n this.assertNotDestroyed('Write');\n\n this._operations.inc();\n this._writes.inc();\n this._writeBytes.inc(data.length);\n\n if (!this._buffer) {\n await this._loadBufferGuarded();\n invariant(this._buffer);\n }\n\n if (offset + data.length <= this._buffer.length) {\n this._buffer.set(data, offset);\n } else {\n // TODO(dmaretskyi): Optimize re-allocations.\n const newCache = new Uint8Array(offset + data.length);\n newCache.set(this._buffer);\n newCache.set(data, offset);\n this._buffer = newCache;\n }\n\n this._flushLater();\n }\n\n async del(offset: number, size: number) {\n this.assertNotDestroyed('Del');\n\n this._operations.inc();\n\n if (offset < 0 || size <= 0) {\n return;\n }\n\n if (!this._buffer) {\n await this._loadBufferGuarded();\n invariant(this._buffer);\n }\n\n let leftoverSize = 0;\n if (offset + size < this._buffer.length) {\n leftoverSize = this._buffer.length - (offset + size);\n this._buffer.set(this._buffer.slice(offset + size, offset + size + leftoverSize), offset);\n }\n\n this._buffer = this._buffer.slice(0, offset + leftoverSize);\n\n this._flushLater();\n }\n\n async stat() {\n this.assertNotDestroyed('Truncate');\n\n this._operations.inc();\n\n // NOTE: This will load all data from the file just to get it's size. While this is a lot of overhead, this works ok for out use cases.\n if (!this._buffer) {\n await this._loadBufferGuarded();\n invariant(this._buffer);\n }\n\n return {\n size: this._buffer.length,\n };\n }\n\n async truncate(offset: number) {\n this.assertNotDestroyed('Truncate');\n\n this._operations.inc();\n\n if (!this._buffer) {\n await this._loadBufferGuarded();\n invariant(this._buffer);\n }\n\n this._buffer = this._buffer.slice(0, offset);\n\n this._flushLater();\n }\n\n async flush() {\n this.assertNotDestroyed('Flush');\n\n await this._flushNow();\n }\n\n /**\n * It's best to avoid using this method as it doesn't really close a file.\n * We could update the _opened flag and add a guard like for destroyed, but this would break\n * the FileSystemFileHandle sharing required for browser tests to run, where writes are\n * not immediately visible if using different file handles.\n */\n async close(): Promise<void> {\n await this._flushNow();\n }\n\n @synchronized\n async destroy() {\n if (!this.destroyed) {\n // We need to flush the buffer before destroying a file so that the call to a storage API\n // finds an entry for deletion\n await this._flushNow();\n this.destroyed = true;\n return await this._destroy();\n }\n }\n\n private assertNotDestroyed(operation: string) {\n if (this.destroyed) {\n throw new Error(`${operation} on a destroyed or closed file`);\n }\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { FirefoxStorage } from './firefox-storage';\nimport { IDbStorage } from './idb-storage';\nimport { WebFS } from './web-fs';\nimport { MemoryStorage, type Storage, type StorageConstructor, StorageType } from '../common';\n\nexport const createStorage: StorageConstructor = ({ type, root = '' } = {}): Storage => {\n if (type === undefined) {\n if (\n navigator &&\n navigator.storage &&\n typeof navigator.storage.getDirectory === 'function' &&\n FileSystemFileHandle &&\n typeof (FileSystemFileHandle.prototype as any).createWritable === 'function'\n ) {\n return new WebFS(root);\n } else {\n return new IDbStorage(root);\n }\n }\n\n switch (type) {\n case StorageType.RAM: {\n return new MemoryStorage(root);\n }\n\n case StorageType.IDB:\n case StorageType.CHROME: {\n return new IDbStorage(root);\n }\n\n case StorageType.FIREFOX: {\n return new FirefoxStorage(root);\n }\n\n case StorageType.WEBFS: {\n return new WebFS(root);\n }\n\n default: {\n throw new Error(`Invalid type: ${type}`);\n }\n }\n};\n"],
5
- "mappings": ";;;;;;;;;;AAIA,SAASA,QAAAA,aAAY;AACrB,SAASC,eAAe;AAGxB,SAASC,qBAAqB;AAC9B,SAASC,OAAAA,YAAW;;;ACLpB,SAASC,YAAY;AAGd,IAAMC,aAAa,CAACC,OAAeC,WAAmBD,MAAME,MAAMD,MAAAA,EAAQE,KAAK,EAAA;AAE/E,IAAMC,cAAc,CAACC,MAAcC,SAAiBH,KAAKE,MAAMN,WAAWO,MAAMD,IAAAA,CAAAA;;;ACYhF,IAAME,YAAN,MAAMA,WAAAA;EASXC,YAAY,EAAEC,MAAMC,MAAMC,MAAMC,iBAAiBC,QAAQC,QAAO,GAAqB;AACnF,SAAKL,OAAOA;AACZ,SAAKC,OAAOA;AACZ,SAAKK,QAAQJ;AACb,SAAKK,mBAAmBJ;AACxB,SAAKK,UAAUJ;AACf,SAAKK,WAAWJ;EAClB;EAEAK,WAAW;AACT,WAAO,aAAaC,KAAKC,UAAU;MAAEZ,MAAM,KAAKA;MAAMC,MAAM,KAAKA;IAAK,CAAA,CAAA;EACxE;;;;EAKAY,gBAAgBZ,MAAyB;AACvC,WAAO,IAAIH,WAAU;MACnBE,MAAM,KAAKA;MACXC,MAAMa,YAAY,KAAKb,MAAMA,IAAAA;MAC7BC,MAAM,KAAKI;MACXH,iBAAiB,KAAKI;MACtBH,QAAQ,KAAKI;IACf,CAAA;EACF;;;;EAKAN,OAA0B;AACxB,WAAO,KAAKI,MAAM,KAAKL,IAAI;EAC7B;;;;EAKAE,gBAAgBY,UAAkBC,MAAkB;AAClD,WAAO,KAAKT,iBAAiB,KAAKN,MAAMc,UAAUC,IAAAA;EACpD;EAEA,MAAMC,QAAQ;AACZ,UAAM,KAAKR,WAAQ;EACrB;;;;EAKA,MAAMS,SAAS;AACb,UAAM,KAAKV,QAAO;EACpB;AACF;;;AC5EA,OAAOW,UAAU;AAGjB,SAASC,WAAW;;AAIpB,IAAMC,6BAA6B;AAoCnC,IAAMC,aAAa,CAACC,QAAaC,MAAmBC,WAAAA;AAClD,aAAWC,SAASD,QAAQ;AAC1B,QAAI,CAACF,OAAOG,KAAAA,GAAQ;IAGpB,OAAO;AACL,YAAMC,KAAKR,KAAKI,OAAOG,KAAAA,EAAOE,KAAKL,MAAAA,CAAAA;AACnCA,aAAOG,KAAAA,IAAS,UAAUG,SAAAA;AACxB,cAAMC,SAASC,YAAYC,IAAG;AAE9B,cAAMC,MAAM,MAAMN,GAAAA,GAAME,IAAAA;AAExB,cAAMK,UAAUH,YAAYC,IAAG,IAAKF;AACpC,YAAII,UAAUb,4BAA4B;AACxCD,cAAIe,KAAK,0BAA0B;YAAEX;YAAMY,WAAWV;YAAOQ;UAAQ,GAAA;;;;;;QACvE;AAEA,eAAOD;MACT;IACF;EACF;AAEA,SAAOV;AACT;AAMO,IAAMc,WAAW,CAACC,QAA6Bd,SAAAA;AACpD,QAAMe,OAAOjB,WAAWgB,QAAQd,MAAM;IAAC;IAAS;IAAQ;IAAO;IAAQ;IAAS;IAAW;GAAW;AACtG,SAAOgB,OAAOC,OAAOF,MAAM;IAAEf;IAAMc;EAAO,CAAA;AAC5C;;;;AH1DO,IAAeI,kBAAf,MAAeA;;EAMpBC,YAA4BC,MAAc;SAAdA,OAAAA;SALTC,SAAS,oBAAIC,IAAAA;EAKW;EAE3C,CAACC,QAAQC,MAAM,IAAI;AACjB,WAAOC,cAAc,IAAI;EAC3B;EAEAC,SAAS;AACP,WAAO;MAAEC,MAAM,KAAKA;MAAMP,MAAM,KAAKA;IAAK;EAC5C;EAEA,IAAWQ,OAAO;AAChB,WAAO,KAAKP,OAAOO;EACrB;;EAGOC,gBAAgBC,MAAM,IAAe;AAE1C,WAAO,IAAIC,UAAU;MACnBJ,MAAM,KAAKA;MACXP,MAAMY,YAAY,KAAKZ,MAAMU,GAAAA;MAC7BG,MAAM,KAAKC,MAAMC,KAAK,IAAI;MAC1BC,iBAAiB,IAAIC,SAAS,KAAKD,gBAAe,GAAIC,IAAAA;MACtDC,QAAQ,MAAM,KAAKC,QAAQT,GAAAA;IAC7B,CAAA;EACF;;;;EAKA,MAAMU,QAAQ;AACZ,QAAI;AACFC,MAAAA,KAAIC,KAAK,uBAAA,QAAA;;;;;;AACT,YAAM,KAAKC,kBAAkB,EAAA;AAC7B,YAAM,KAAKJ,QAAQ,EAAA;AACnB,YAAM,KAAKK,SAAQ;AACnBH,MAAAA,KAAI,aAAA,QAAA;;;;;;IACN,SAASI,KAAU;AACjBJ,MAAAA,KAAIK,MAAMD,KAAAA,QAAAA;;;;;;IACZ;EACF;EAEA,MAAgBX,MAAMd,MAAiC;AAErD,WAAO2B,MAAMC,MAAM,MAAM,KAAKC,UAAU7B,IAAAA,GAAO8B,KAAI,CAAA,EAAIC,IAAI,CAACC,aAAAA;AAC1D,UAAIC,OAAOD,SAASE,QAAQlC,MAAM,EAAA;AAClC,UAAIiC,KAAKE,WAAW,GAAA,GAAM;AACxBF,eAAOA,KAAKG,UAAU,CAAA;MACxB;AACA,aAAOH;IACT,CAAA;EACF;EAEUjB,gBAAgBhB,MAAcgC,UAAkBK,MAAkB;AAC1E,UAAMC,WAAWC,MAAKvC,MAAMgC,QAAAA;AAE5B,QAAIQ;AACJ,QAAIC,OAAO,KAAKC,iBAAiBJ,QAAAA;AACjC,QAAIG,MAAM;AACR,UAAI,CAACA,KAAKE,QAAQ;AAChB,eAAOF;MACT;AAEAD,eAAS,KAAKI,UAAUH,KAAKD,MAAM;IACrC;AAEA,QAAI,CAACA,QAAQ;AACXA,eAAS,KAAKK,YAAY7C,MAAMgC,UAAUK,IAAAA;IAC5C;AAEAI,WAAOK,SAASN,QAAQ,KAAKjC,IAAI;AACjC,SAAKN,OAAO8C,IAAIT,UAAUG,IAAAA;AAC1B,WAAOA;EACT;EAEUjB,WAAsC;AAC9C,WAAOwB;EACT;;;;EAKUJ,UAAUH,MAA4D;AAC9E,WAAOO;EACT;EAIQN,iBAAiBV,UAAoC;AAC3D,QAAI,KAAK/B,OAAOgD,IAAIjB,QAAAA,GAAW;AAC7B,YAAMS,OAAO,KAAKxC,OAAOiD,IAAIlB,QAAAA;AAC7B,UAAIS,QAAQ,CAACA,KAAKU,WAAW;AAC3B,eAAOV;MACT;IACF;EACF;EAEA,MAAgBZ,UAAU7B,MAA0C;AAClE,UAAMsC,WAAW1B,YAAY,KAAKZ,MAAMA,IAAAA;AACxC,WAAO,IAAIE,IACT;SAAI,KAAKD,OAAOmD,QAAO;MAAIC,OAAO,CAAC,CAACrD,OAAMyC,IAAAA,MAAUzC,MAAKsD,SAAShB,QAAAA,KAAaG,KAAKU,cAAc,IAAA,CAAA;EAEtG;EAEA,MAAc5B,kBAAkBvB,MAA6B;AAC3D,UAAMuD,QAAQC,IACZ7B,MAAMC,MAAM,MAAM,KAAKC,UAAU7B,IAAAA,GAAOyD,OAAM,CAAA,EAAI1B,IAAI,CAACU,SAASA,KAAKiB,MAAK,EAAGhC,MAAM,CAACD,QAAaJ,KAAIK,MAAMD,KAAAA,QAAAA;;;;;;EAE/G;EAEA,MAAMiC,QAAQ;AACZ,UAAM,KAAKnC,kBAAkB,EAAA;EAC/B;;EAGA,MAAgBJ,QAAQnB,MAA6B;AACnD,UAAMuD,QAAQC,IACZ7B,MAAMC,KAAK,MAAM,KAAKC,UAAU7B,IAAAA,CAAAA,EAAO+B,IAAI,CAAC,CAAC/B,OAAMyC,IAAAA,MAAK;AACtD,aAAOA,KACJkB,QAAO,EACPC,KAAK,MAAM,KAAK3D,OAAO4D,OAAO7D,KAAAA,CAAAA,EAC9B0B,MAAM,CAACD,QAAaJ,KAAIyC,MAAMrC,IAAIsC,SAAO,QAAA;;;;;;IAC9C,CAAA,CAAA;EAEJ;AACF;;;AInJA,OAAOC,SAAS;AAGhB,SAASC,qBAAqB;;;;UCAlBC,cAAAA;;;;;;;GAAAA,gBAAAA,cAAAA,CAAAA,EAAAA;;;ADSL,IAAMC,gBAAN,cAA4BC,gBAAAA;EAA5B;;AACWC,gBAAoBC,YAAYC;;EAE7BC,YAAYC,MAAcC,UAAuC;AAClF,WAAO,KAAKC,WAAWC,IAAAA,CAAAA;EACzB;EAEmBC,UAAUC,MAAgD;AAC3E,UAAMC,UAAUD,KAAKE,MAAK;AACzBD,YAAgBE,SAAS;AAC1B,WAAO,KAAKN,WAAWI,OAAAA;EACzB;EAEQJ,WAAWG,MAAgD;AAEjE,UAAMI,WAAWJ,KAAKK,KAAKC,KAAKN,IAAAA;AAEhCA,SAAKK,OAAO,CAACE,QAAgBC,MAAcC,OACzCL,SAASG,QAAQC,MAAM,CAACE,KAAmBC,SAAAA;AACzC,UAAID,KAAK;AACP,eAAOD,GAAGC,GAAAA;MACZ,OAAO;AACL,eAAOD,GAAGC,KAAKE,cAAcD,IAAAA,CAAAA;MAC/B;IACF,CAAA;AAEF,WAAOX;EACT;EAEA,MAAMa,cAAiC;AACrC,QAAIC,OAAO;AAEX,eAAWd,QAAQ,KAAKe,OAAOC,OAAM,GAAI;AACvC,YAAMR,OAAQR,KAAaiB;AAC3BH,cAAQI,OAAOC,MAAMX,IAAAA,IAAQ,IAAIA;IACnC;AAEA,WAAO;MACLM;IACF;EACF;AACF;;;AElDA,OAAOM,SAAS;;;ACIT,IAAeC,iBAAf,cAAsCC,gBAAAA;EAG3CC,YAAYC,MAAc;AACxB,UAAMA,IAAAA;AACN,SAAKC,eAAe,KAAKC,mBAAmBF,IAAAA;EAC9C;EAEUG,YAAYH,MAAcI,UAAuC;AACzE,UAAMC,WAAWC,YAAYN,MAAMI,QAAAA;AACnC,WAAO,KAAKH,aAAaI,QAAAA;EAC3B;EAIA,MAAyBE,WAAW;AAElC,WAAO,IAAIC,QAAc,CAACC,SAASC,WAAAA;AACjC,YAAMC,UAAUC,UAAUC,eAAe,KAAKb,IAAI;AAClDW,cAAQG,YAAY,MAAA;AAClBL,gBAAAA;MACF;AACAE,cAAQI,kBAAkB,MAAA;AACxBL,eAAO,IAAIM,MAAM,iBAAA,CAAA;MACnB;AACAL,cAAQM,YAAY,MAAA;AAClBP,eAAO,IAAIM,MAAM,UAAA,CAAA;MACnB;AACAL,cAAQO,UAAU,CAACC,QAAAA;AACjBT,eAAOS,GAAAA;MACT;IACF,CAAA;EACF;AACF;;;AD5BO,IAAMC,iBAAN,cAA6BC,eAAAA;EAA7B;;AACWC,gBAAoBC,YAAYC;;EAE7BC,mBAAmBC,MAAc;AAClD,WAAOC,IAAI;MAAEC,MAAMF;IAAK,CAAA;EAC1B;AACF;;;AElBA,OAAOG,SAAS;AAST,IAAMC,aAAN,cAAyBC,eAAAA;EAAzB;;AACWC,gBAAoBC,YAAYC;;EAE7BC,mBAAmBC,MAAc;AAClD,WAAOC,IAAID,IAAAA;EACb;AACF;;;ACfA,SAASE,oBAAoB;AAC7B,SAASC,mBAAmB;AAG5B,SAASC,oBAAoB;AAC7B,SAASC,iBAAiB;AAC1B,SAASC,OAAAA,YAAW;AACpB,SAASC,mBAAmBC,aAAa;;;;;;;;;;;;AAOlC,IAAMC,QAAN,MAAMA;EAOXC,YAA4BC,MAAc;SAAdA,OAAAA;SANXC,SAAS,oBAAIC,IAAAA;SAErBC,OAAOC,YAAYC;EAIe;EAE3C,IAAWC,OAAO;AAChB,WAAO,KAAKL,OAAOK;EACrB;EAEQC,UAAUP,MAAoC;AACpD,UAAMQ,WAAW,KAAKC,iBAAiB,KAAKT,MAAMA,IAAAA;AAClD,WAAO,IAAIE,IACT;SAAI,KAAKD,OAAOS,QAAO;MAAIC,OAAO,CAAC,CAACX,OAAMY,IAAAA,MAAK;AAC7C,aAAOZ,MAAKa,SAASL,QAAAA,KAAa,CAACI,KAAKE;IAC1C,CAAA,CAAA;EAEJ;EAEA,MAAcC,MAAMf,MAAiC;AACnD,UAAMQ,WAAW,KAAKC,iBAAiBT,IAAAA;AAEvC,UAAMgB,OAAO,MAAM,KAAKC,YAAW;AAUnC,UAAMP,UAAoB,CAAA;AAE1B,qBAAiBQ,SAAUF,KAAaG,KAAI,GAAI;AAI9C,UAAID,MAAME,WAAWZ,WAAW,GAAA,KAAQ,CAACU,MAAMG,SAAS,SAAA,GAAY;AAClEX,gBAAQY,KAAKJ,MAAMK,MAAMf,SAASgB,SAAS,CAAA,CAAA;MAC7C;IACF;AACA,WAAOd;EACT;EAEA,MACcO,cAAc;AAC1B,QAAI,KAAKQ,OAAO;AACd,aAAO,KAAKA;IACd;AACA,SAAKA,QAAQ,MAAMC,UAAUC,QAAQC,aAAY;AACjDC,cAAU,KAAKJ,OAAO,qBAAA;;;;;;;;;AACtB,WAAO,KAAKA;EACd;EAEAK,gBAAgBC,MAAM,IAAI;AACxB,WAAO,IAAIC,UAAU;MACnB7B,MAAM,KAAKA;MACXH,MAAMiC,YAAY,KAAKjC,MAAM+B,GAAAA;MAC7BG,MAAM,CAAClC,SAAS,KAAKe,MAAMf,IAAAA;MAC3BmC,iBAAiB,IAAIC,SAAS,KAAKD,gBAAe,GAAIC,IAAAA;MACtDC,QAAQ,MAAM,KAAKC,QAAQP,GAAAA;MAC3BQ,SAAS,YAAA;AACP,cAAMC,QAAQC,IAAIC,MAAMC,KAAK,KAAKpC,UAAUwB,GAAAA,CAAAA,EAAMa,IAAI,CAAC,CAACC,GAAGjC,IAAAA,MAAUA,KAAKkC,MAAK,CAAA,CAAA;MACjF;IACF,CAAA;EACF;EAEAX,gBAAgBnC,MAAc+C,UAAkBC,MAAkB;AAChE,UAAMxC,WAAW,KAAKC,iBAAiBT,MAAM+C,QAAAA;AAC7C,UAAME,eAAe,KAAKhD,OAAOiD,IAAI1C,QAAAA;AACrC,QAAIyC,cAAc;AAChB,aAAOA;IACT;AACA,UAAMrC,OAAO,KAAKuC,YAAY3C,QAAAA;AAC9B,SAAKP,OAAOmD,IAAI5C,UAAUI,IAAAA;AAC1B,WAAOA;EACT;EAEQuC,YAAY3C,UAAkB;AACpC,WAAO,IAAI6C,QAAQ;MACjBC,UAAU9C;MACVI,MAAM,KAAKK,YAAW,EAAGsC,KAAK,CAACvC,SAASA,KAAKwC,cAAchD,UAAU;QAAEiD,QAAQ;MAAK,CAAA,CAAA;MACpFC,SAAS,YAAA;AACP,aAAKzD,OAAO0D,OAAOnD,QAAAA;AACnB,cAAMQ,OAAO,MAAM,KAAKC,YAAW;AACnC,eAAOD,KAAK4C,YAAYpD,QAAAA;MAC1B;IACF,CAAA;EACF;EAEA,MAAc8B,QAAQtC,MAA6B;AACjD,UAAMwC,QAAQC,IACZC,MAAMC,KAAK,KAAKpC,UAAUP,IAAAA,CAAAA,EAAO4C,IAAI,OAAO,CAAC5C,OAAMY,IAAAA,MAAK;AACtD,YAAMA,KAAK8C,QAAO,EAAGG,MAAM,CAACC,QAAaC,KAAIC,KAAKF,KAAAA,QAAAA;;;;;;AAClD,WAAK7D,OAAO0D,OAAO3D,KAAAA;IACrB,CAAA,CAAA;EAEJ;EAEA,MAAMiE,QAAQ;AACZ,UAAM,KAAKhD,YAAW;AACtB,qBAAiB8B,YAAY,MAAO,KAAKtB,MAAcN,KAAI,GAAI;AAC7D,YAAM,KAAKM,MAAOmC,YAAYb,UAAU;QAAEmB,WAAW;MAAK,CAAA,EAAGL,MAAM,CAACC,QAClEC,KAAIC,KAAK,6BAA6B;QAAEjB;QAAUe;MAAI,GAAA;;;;;;AAExD,WAAK7D,OAAO0D,OAAOZ,QAAAA;IACrB;AACA,SAAKtB,QAAQ0C;EACf;EAEA,MAAMC,QAAQ;AACZ,UAAM5B,QAAQC,IACZC,MAAMC,KAAK,KAAK1C,OAAOoE,OAAM,CAAA,EAAIzB,IAAI,CAAChC,SAAAA;AACpC,aAAOA,KAAKwD,MAAK,EAAGP,MAAM,CAACS,MAAMP,KAAIC,KAAK,0BAA0B;QAAEpD,MAAMA,KAAK0C;QAAUgB;MAAE,GAAA;;;;;;IAC/F,CAAA,CAAA;EAEJ;EAEQ7D,iBAAiBT,MAAc+C,UAAmB;AAExD,QAAIA,UAAU;AACZ,aAAOd,YAAYjC,MAAM+C,QAAAA,EAAUwB,QAAQ,OAAO,GAAA;IACpD,OAAO;AACL,aAAOvE,KAAKuE,QAAQ,OAAO,GAAA;IAC7B;EACF;EAEA,MAAMC,cAAiC;AACrC,QAAIC,OAAO;AAEX,UAAMC,UAAU,OAAOC,WAAAA;AACrB,YAAMC,WAAW,CAAA;AAEjB,uBAAiB1D,SAAUyD,OAAeN,OAAM,GAAI;AAClDO,iBAAStD,MACN,YAAA;AACC,kBAAQJ,MAAM2D,MAAI;YAChB,KAAK;AACHJ,sBAAQ,MAAOvD,MAA+B4D,QAAO,EAAGvB,KAAK,CAACwB,MAAMA,EAAEzE,IAAI;AAC1E;YACF,KAAK;AACH,oBAAMoE,QAAQxD,KAAAA;AACd;UACJ;QACF,GAAA,CAAA;MAEJ;AACA,YAAMsB,QAAQC,IAAImC,QAAAA;IACpB;AAEA,UAAMF,QAAQ,KAAKjD,KAAK;AAExB,WAAO;MACLgD;IACF;EACF;AACF;;EAhHGO;GAhDUlF,MAAAA,WAAAA,eAAAA,IAAAA;AAoKN,IAAMuD,UAAN,cAAsB4B,aAAAA;EAiD3BlF,YAAY,EACVuD,UACA1C,MACA8C,QAAO,GAKN;AACD,UAAK;AAhDCwB;;;mBAA6B;AAE7BC,8BAA2C;AAE3CC,2BAAkB;AAClBC,yBAA+B7C,QAAQ8C,QAAO;AAK9CC;;;;0BAAiB;AAOjBC;;;oBAAW,IAAIC,kBAAAA;AAGfC,uBAAc,IAAID,kBAAAA;AAGlBE,kBAAS,IAAIF,kBAAAA;AAGbG,sBAAa,IAAIH,kBAAAA;AAGjBI,mBAAU,IAAIJ,kBAAAA;AAGdK,uBAAc,IAAIL,kBAAAA;AAwB1BtF,gBAAoBC,YAAYC;AAOvB0F;;;;kBAAkB;AAClBC,qBAAqB;AACrBC,kBAAkB;AAClBC,oBAAoB;AACpBC,mBAAmB;AACnBC,oBAAoB;AACpBC,oBAAoB;AACpBC,qBAAqB;AACrBC,uBAAuB;AACvBC,oBAAoB;AAE7B1F,qBAAY;AACZ2F,qBAAY;AAEZ1D;oBAAW;AACX2D,kBAA8B;MAC5BC,OAAOC,YAAY,KAAKD,MAAME,KAAK,IAAI,CAAA;MACvCC,MAAMF,YAAY,KAAKE,KAAKD,KAAK,IAAI,CAAA;MACrCE,KAAKH,YAAY,KAAKG,IAAIF,KAAK,IAAI,CAAA;MACnCG,MAAMJ,YAAY,KAAKI,KAAKH,KAAK,IAAI,CAAA;MACrCnD,SAASkD,YAAY,KAAKlD,QAAQmD,KAAK,IAAI,CAAA;MAC3CI,UAAUL,YAAY,KAAKK,UAAUJ,KAAK,IAAI,CAAA;IAChD;AApCE,SAAKvD,WAAWA;AAChB,SAAK4D,cAActG;AACnB,SAAKuG,WAAWzD;AAEhB,SAAK,KAAK0D,mBAAkB;EAC9B;EApBA,IACIC,cAAc;AAChB,WAAO,KAAKnC,SAAS1D;EACvB;EAkDA,MAAc8F,cAAc;AAC1B,UAAMC,aAAa,MAAM,KAAKL;AAC9B,UAAMtG,OAAO,MAAM2G,WAAWzC,QAAO;AACrC,SAAKI,UAAU,IAAIsC,WAAW,MAAM5G,KAAK6G,YAAW,CAAA;EACtD;EAEA,MAAcL,qBAAqB;AACjC,WAAO,KAAKjC,uBAAuB,KAAKmC,YAAW;EACrD;;EAGA,MAAcI,YAAYC,UAAkB;AAC1C,QAAI,KAAK7G,aAAa6G,WAAW,KAAKpC,gBAAgB;AACpD;IACF;AACA,SAAKA,iBAAiBoC,WAAW;AAEjC,SAAKnC,SAASoC,IAAG;AAEjB,UAAM,KAAKR,mBAAkB;AAC7BvF,cAAU,KAAKqD,SAAO,QAAA;;;;;;;;;AAEtB,UAAMqC,aAAa,MAAM,KAAKL;AAC9B,UAAMb,WAAW,MAAMkB,WAAWM,eAAe;MAAEC,kBAAkB;IAAK,CAAA;AAC1E,UAAMzB,SAASM,MAAM;MAAExG,MAAM;MAAS4H,MAAM,KAAK7C;MAAS8C,UAAU;IAAE,CAAA;AACtE,UAAM3B,SAASjC,MAAK;EACtB;EAEQ6D,cAAc;AACpB,QAAI,KAAK7C,iBAAiB;AACxB;IACF;AAEA,UAAMuC,WAAW,KAAKpC;AACtB2C,eAAW,YAAA;AAET,YAAM,KAAK7C;AACX,WAAKD,kBAAkB;AACvB,WAAKC,gBAAgB,KAAKqC,YAAYC,QAAAA,EAAU9D,MAAM,CAACC,QAAQC,KAAIC,KAAKF,KAAAA,QAAAA;;;;;;IAC1E,CAAA;AAEA,SAAKsB,kBAAkB;EACzB;EAEA,MAAc+C,YAAY;AACxB,UAAM,KAAK9C;AACX,SAAKA,gBAAgB,KAAKqC,YAAY,KAAKnC,cAAc,EAAE1B,MAAM,CAACC,QAAQC,KAAIC,KAAKF,KAAAA,QAAAA;;;;;;AACnF,UAAM,KAAKuB;EACb;EAEA,MAAMyB,KAAKsB,QAAgB9H,MAAc;AACvC,SAAK+H,mBAAmB,MAAA;AAExB,SAAK3C,YAAYkC,IAAG;AACpB,SAAKjC,OAAOiC,IAAG;AACf,SAAKhC,WAAWgC,IAAItH,IAAAA;AAEpB,QAAI,CAAC,KAAK4E,SAAS;AACjB,YAAM,KAAKkC,mBAAkB;AAC7BvF,gBAAU,KAAKqD,SAAO,QAAA;;;;;;;;;IACxB;AAEA,QAAIkD,SAAS9H,OAAO,KAAK4E,QAAQ1D,QAAQ;AACvC,YAAM,IAAI8G,MAAM,oBAAA;IAClB;AAGA,WAAOC,OAAO5F,KAAK,KAAKuC,QAAQ3D,MAAM6G,QAAQA,SAAS9H,IAAAA,CAAAA;EACzD;EAEA,MAAMqG,MAAMyB,QAAgBL,MAAc;AACxC,SAAKM,mBAAmB,OAAA;AAExB,SAAK3C,YAAYkC,IAAG;AACpB,SAAK/B,QAAQ+B,IAAG;AAChB,SAAK9B,YAAY8B,IAAIG,KAAKvG,MAAM;AAEhC,QAAI,CAAC,KAAK0D,SAAS;AACjB,YAAM,KAAKkC,mBAAkB;AAC7BvF,gBAAU,KAAKqD,SAAO,QAAA;;;;;;;;;IACxB;AAEA,QAAIkD,SAASL,KAAKvG,UAAU,KAAK0D,QAAQ1D,QAAQ;AAC/C,WAAK0D,QAAQ9B,IAAI2E,MAAMK,MAAAA;IACzB,OAAO;AAEL,YAAMI,WAAW,IAAIhB,WAAWY,SAASL,KAAKvG,MAAM;AACpDgH,eAASpF,IAAI,KAAK8B,OAAO;AACzBsD,eAASpF,IAAI2E,MAAMK,MAAAA;AACnB,WAAKlD,UAAUsD;IACjB;AAEA,SAAKP,YAAW;EAClB;EAEA,MAAMlB,IAAIqB,QAAgB9H,MAAc;AACtC,SAAK+H,mBAAmB,KAAA;AAExB,SAAK3C,YAAYkC,IAAG;AAEpB,QAAIQ,SAAS,KAAK9H,QAAQ,GAAG;AAC3B;IACF;AAEA,QAAI,CAAC,KAAK4E,SAAS;AACjB,YAAM,KAAKkC,mBAAkB;AAC7BvF,gBAAU,KAAKqD,SAAO,QAAA;;;;;;;;;IACxB;AAEA,QAAIuD,eAAe;AACnB,QAAIL,SAAS9H,OAAO,KAAK4E,QAAQ1D,QAAQ;AACvCiH,qBAAe,KAAKvD,QAAQ1D,UAAU4G,SAAS9H;AAC/C,WAAK4E,QAAQ9B,IAAI,KAAK8B,QAAQ3D,MAAM6G,SAAS9H,MAAM8H,SAAS9H,OAAOmI,YAAAA,GAAeL,MAAAA;IACpF;AAEA,SAAKlD,UAAU,KAAKA,QAAQ3D,MAAM,GAAG6G,SAASK,YAAAA;AAE9C,SAAKR,YAAW;EAClB;EAEA,MAAMjB,OAAO;AACX,SAAKqB,mBAAmB,UAAA;AAExB,SAAK3C,YAAYkC,IAAG;AAGpB,QAAI,CAAC,KAAK1C,SAAS;AACjB,YAAM,KAAKkC,mBAAkB;AAC7BvF,gBAAU,KAAKqD,SAAO,QAAA;;;;;;;;;IACxB;AAEA,WAAO;MACL5E,MAAM,KAAK4E,QAAQ1D;IACrB;EACF;EAEA,MAAMyF,SAASmB,QAAgB;AAC7B,SAAKC,mBAAmB,UAAA;AAExB,SAAK3C,YAAYkC,IAAG;AAEpB,QAAI,CAAC,KAAK1C,SAAS;AACjB,YAAM,KAAKkC,mBAAkB;AAC7BvF,gBAAU,KAAKqD,SAAO,QAAA;;;;;;;;;IACxB;AAEA,SAAKA,UAAU,KAAKA,QAAQ3D,MAAM,GAAG6G,MAAAA;AAErC,SAAKH,YAAW;EAClB;EAEA,MAAMnF,QAAQ;AACZ,SAAKuF,mBAAmB,OAAA;AAExB,UAAM,KAAKF,UAAS;EACtB;;;;;;;EAQA,MAAM/D,QAAuB;AAC3B,UAAM,KAAK+D,UAAS;EACtB;EAEA,MACMzE,UAAU;AACd,QAAI,CAAC,KAAK5C,WAAW;AAGnB,YAAM,KAAKqH,UAAS;AACpB,WAAKrH,YAAY;AACjB,aAAO,MAAM,KAAKqG,SAAQ;IAC5B;EACF;EAEQkB,mBAAmBK,WAAmB;AAC5C,QAAI,KAAK5H,WAAW;AAClB,YAAM,IAAIwH,MAAM,GAAGI,SAAAA,gCAAyC;IAC9D;EACF;AACF;;EAvRGC,MAAMC,KAAI;GADAvF,QAAAA,WAAAA,YAAAA,MAAAA;;EA0BVsF,MAAME,eAAc;GA1BVxF,QAAAA,WAAAA,YAAAA,MAAAA;;EA6BVsF,MAAME,eAAc;GA7BVxF,QAAAA,WAAAA,eAAAA,MAAAA;;EAgCVsF,MAAME,eAAc;GAhCVxF,QAAAA,WAAAA,UAAAA,MAAAA;;EAmCVsF,MAAME,eAAc;GAnCVxF,QAAAA,WAAAA,cAAAA,MAAAA;;EAsCVsF,MAAME,eAAc;GAtCVxF,QAAAA,WAAAA,WAAAA,MAAAA;;EAyCVsF,MAAME,eAAc;GAzCVxF,QAAAA,WAAAA,eAAAA,MAAAA;;EA4CVsF,MAAMC,KAAI;GA5CAvF,QAAAA,WAAAA,eAAAA,IAAAA;;EAwQV2B;GAxQU3B,QAAAA,WAAAA,WAAAA,IAAAA;;;AC7KN,IAAMyF,gBAAoC,CAAC,EAAEC,MAAMC,OAAO,GAAE,IAAK,CAAC,MAAC;AACxE,MAAID,SAASE,QAAW;AACtB,QACEC,aACAA,UAAUC,WACV,OAAOD,UAAUC,QAAQC,iBAAiB,cAC1CC,wBACA,OAAQA,qBAAqBC,UAAkBC,mBAAmB,YAClE;AACA,aAAO,IAAIC,MAAMR,IAAAA;IACnB,OAAO;AACL,aAAO,IAAIS,WAAWT,IAAAA;IACxB;EACF;AAEA,UAAQD,MAAAA;IACN,KAAKW,YAAYC,KAAK;AACpB,aAAO,IAAIC,cAAcZ,IAAAA;IAC3B;IAEA,KAAKU,YAAYG;IACjB,KAAKH,YAAYI,QAAQ;AACvB,aAAO,IAAIL,WAAWT,IAAAA;IACxB;IAEA,KAAKU,YAAYK,SAAS;AACxB,aAAO,IAAIC,eAAehB,IAAAA;IAC5B;IAEA,KAAKU,YAAYO,OAAO;AACtB,aAAO,IAAIT,MAAMR,IAAAA;IACnB;IAEA,SAAS;AACP,YAAM,IAAIkB,MAAM,iBAAiBnB,IAAAA,EAAM;IACzC;EACF;AACF;",
6
- "names": ["join", "inspect", "inspectObject", "log", "join", "stringDiff", "first", "second", "split", "join", "getFullPath", "root", "path", "Directory", "constructor", "type", "path", "list", "getOrCreateFile", "remove", "onFlush", "_list", "_getOrCreateFile", "_remove", "_onFlush", "toString", "JSON", "stringify", "createDirectory", "getFullPath", "filename", "opts", "flush", "delete", "pify", "log", "MAX_STORAGE_OPERATION_TIME", "pifyFields", "object", "type", "fields", "field", "fn", "bind", "args", "before", "performance", "now", "res", "elapsed", "info", "operation", "wrapFile", "native", "file", "Object", "assign", "AbstractStorage", "constructor", "path", "_files", "Map", "inspect", "custom", "inspectObject", "toJSON", "type", "size", "createDirectory", "sub", "Directory", "getFullPath", "list", "_list", "bind", "getOrCreateFile", "args", "remove", "_remove", "reset", "log", "info", "_closeFilesInPath", "_destroy", "err", "catch", "Array", "from", "_getFiles", "keys", "map", "filename", "name", "replace", "startsWith", "substring", "opts", "fullPath", "join", "native", "file", "_getFileIfExists", "closed", "_openFile", "_createFile", "wrapFile", "set", "undefined", "has", "get", "destroyed", "entries", "filter", "includes", "Promise", "all", "values", "close", "destroy", "then", "delete", "error", "message", "ram", "arrayToBuffer", "StorageType", "MemoryStorage", "AbstractStorage", "type", "StorageType", "RAM", "_createFile", "path", "filename", "_patchFile", "ram", "_openFile", "file", "newFile", "clone", "closed", "trueRead", "read", "bind", "offset", "size", "cb", "err", "data", "arrayToBuffer", "getDiskInfo", "used", "_files", "values", "length", "Number", "isNaN", "raw", "BrowserStorage", "AbstractStorage", "constructor", "path", "_fileStorage", "_createFileStorage", "_createFile", "filename", "fullPath", "getFullPath", "_destroy", "Promise", "resolve", "reject", "request", "indexedDB", "deleteDatabase", "onsuccess", "onupgradeneeded", "Error", "onblocked", "onerror", "err", "FirefoxStorage", "BrowserStorage", "type", "StorageType", "FIREFOX", "_createFileStorage", "path", "raw", "name", "idb", "IDbStorage", "BrowserStorage", "type", "StorageType", "IDB", "_createFileStorage", "path", "idb", "EventEmitter", "callbackify", "synchronized", "invariant", "log", "TimeSeriesCounter", "trace", "WebFS", "constructor", "path", "_files", "Map", "type", "StorageType", "WEBFS", "size", "_getFiles", "fullName", "_getFullFilename", "entries", "filter", "file", "includes", "destroyed", "_list", "root", "_initialize", "entry", "keys", "startsWith", "endsWith", "push", "slice", "length", "_root", "navigator", "storage", "getDirectory", "invariant", "createDirectory", "sub", "Directory", "getFullPath", "list", "getOrCreateFile", "args", "remove", "_delete", "onFlush", "Promise", "all", "Array", "from", "map", "_", "flush", "filename", "opts", "existingFile", "get", "_createFile", "set", "WebFile", "fileName", "then", "getFileHandle", "create", "destroy", "delete", "removeEntry", "catch", "err", "log", "warn", "reset", "recursive", "undefined", "close", "values", "e", "replace", "getDiskInfo", "used", "recurse", "handle", "promises", "kind", "getFile", "f", "synchronized", "EventEmitter", "_buffer", "_loadBufferPromise", "_flushScheduled", "_flushPromise", "resolve", "_flushSequence", "_flushes", "TimeSeriesCounter", "_operations", "_reads", "_readBytes", "_writes", "_writeBytes", "opened", "suspended", "closed", "unlinked", "writing", "readable", "writable", "deletable", "truncatable", "statable", "directory", "native", "write", "callbackify", "bind", "read", "del", "stat", "truncate", "_fileHandle", "_destroy", "_loadBufferGuarded", "_bufferSize", "_loadBuffer", "fileHandle", "Uint8Array", "arrayBuffer", "_flushCache", "sequence", "inc", "createWritable", "keepExistingData", "data", "position", "_flushLater", "setTimeout", "_flushNow", "offset", "assertNotDestroyed", "Error", "Buffer", "newCache", "leftoverSize", "operation", "trace", "info", "metricsCounter", "createStorage", "type", "root", "undefined", "navigator", "storage", "getDirectory", "FileSystemFileHandle", "prototype", "createWritable", "WebFS", "IDbStorage", "StorageType", "RAM", "MemoryStorage", "IDB", "CHROME", "FIREFOX", "FirefoxStorage", "WEBFS", "Error"]
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.info('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 { type DiskInfo, 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 async getDiskInfo(): Promise<DiskInfo> {\n let used = 0;\n\n for (const file of this._files.values()) {\n const size = (file as any).length;\n used += Number.isNaN(size) ? 0 : size;\n }\n\n return {\n used,\n };\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\n// NOTE: Removing the .js extension here breaks usage in create-react-app.\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport raw from 'random-access-web/mutable-file-wrapper.js';\n\nimport { BrowserStorage } from './browser-storage';\nimport { StorageType } from '../common';\n\n/**\n * Storage interface implementation for Firefox browser.\n * https://github.com/random-access-storage/random-access-web\n */\nexport class FirefoxStorage extends BrowserStorage {\n public override type: StorageType = StorageType.FIREFOX;\n\n protected override _createFileStorage(path: string) {\n return raw({ name: path });\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport type { RandomAccessStorage } from 'random-access-storage';\n\nimport { AbstractStorage, getFullPath } from '../common';\n\n/**\n * Base class for random access files based on IDB.\n */\nexport abstract class BrowserStorage extends AbstractStorage {\n protected readonly _fileStorage: (filename: string, opts?: {}) => RandomAccessStorage;\n\n constructor(path: string) {\n super(path);\n this._fileStorage = this._createFileStorage(path);\n }\n\n protected _createFile(path: string, filename: string): RandomAccessStorage {\n const fullPath = getFullPath(path, filename);\n return this._fileStorage(fullPath);\n }\n\n protected abstract _createFileStorage(path: string): (filename: string, opts?: {}) => RandomAccessStorage;\n\n protected override async _destroy() {\n // eslint-disable-next-line no-undef\n return new Promise<void>((resolve, reject) => {\n const request = indexedDB.deleteDatabase(this.path);\n request.onsuccess = () => {\n resolve();\n };\n request.onupgradeneeded = () => {\n reject(new Error('Upgrade needed.'));\n };\n request.onblocked = () => {\n reject(new Error('Blocked.'));\n };\n request.onerror = (err: any) => {\n reject(err);\n };\n });\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport idb from 'random-access-idb';\nimport { type RandomAccessStorage } from 'random-access-storage';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { BrowserStorage } from './browser-storage';\nimport { StorageType, getFullPath, wrapFile } from '../common';\n\nconst DELIM = '\\0';\n/**\n * Storage interface implementation for index DB.\n * https://github.com/random-access-storage/random-access-idb\n */\nexport class IDbStorage extends BrowserStorage {\n public override type: StorageType = StorageType.IDB;\n private _db!: Promise<IDBDatabase>;\n private readonly _store = 'data';\n private _initialized = false;\n\n protected override _createFileStorage(path: string) {\n // Note: We use patched version of random-access-idb here that exposes the getdb method.\n const database = idb(path);\n let res: (db: IDBDatabase) => void;\n this._db = new Promise((resolve) => {\n res = resolve;\n });\n\n database.getdb(res!);\n return database.create;\n }\n\n protected override _createFile(path: string, filename: string): RandomAccessStorage {\n const file = this._fileStorage(getFullPath(path, filename));\n file.destroy = (cb: (err: Error | null) => void) => {\n void this._db.then((db) => {\n const lowerBound = getFullPath(path, filename);\n const upperBound = `${lowerBound}\\uffff`;\n const range = IDBKeyRange.bound(lowerBound, upperBound);\n\n const transaction = db.transaction(this._store, 'readwrite');\n const objectStore = transaction.objectStore(this._store);\n objectStore.delete(range);\n transaction.oncomplete = () => {\n (file as any).destroyed = true;\n (file as any).unlinked = true;\n (file as any).closed = true;\n cb(null);\n };\n transaction.onerror = () => cb(transaction.error);\n });\n };\n (file as any).deletable = true;\n\n return file;\n }\n\n async _loadFiles(path: string): Promise<void> {\n const db = await this._db;\n invariant(db, 'Database is not initialized.');\n const lowerBound = path;\n const upperBound = `${path}\\uffff`;\n const range = IDBKeyRange.bound(lowerBound, upperBound);\n\n const transaction = db.transaction(this._store);\n const objectStore = transaction.objectStore(this._store);\n const request = objectStore.openCursor(range);\n\n return new Promise((resolve, reject) => {\n transaction.onerror = () => {\n reject(request.error);\n };\n\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest).result as IDBCursorWithValue;\n if (cursor) {\n // NOTE: The key contains some metadata at the end added by random-access-idb, so we need to split it.\n const filename = String(cursor.key).split(DELIM)[0];\n if (filename && !this._files.has(getFullPath(this.path, filename))) {\n const file = this._createFile(path, filename);\n this._files.set(getFullPath(this.path, filename), wrapFile(file, this.type));\n }\n cursor.continue();\n } else {\n resolve();\n }\n };\n });\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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { EventEmitter } from 'node:events';\nimport { callbackify } from 'node:util';\nimport { type RandomAccessStorage } from 'random-access-storage';\n\nimport { synchronized } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { TimeSeriesCounter, trace } from '@dxos/tracing';\n\nimport { Directory, type DiskInfo, type File, type Storage, StorageType, getFullPath } from '../common';\n\n/**\n * Web file systems.\n */\nexport class WebFS implements Storage {\n private readonly _files = new Map<string, WebFile>();\n\n readonly type = StorageType.WEBFS;\n\n protected _root?: FileSystemDirectoryHandle;\n\n constructor(public readonly path: string) {}\n\n public get size() {\n return this._files.size;\n }\n\n private _getFiles(path: string): Map<string, WebFile> {\n const fullName = this._getFullFilename(this.path, path);\n return new Map(\n [...this._files.entries()].filter(([path, file]) => {\n return path.includes(fullName) && !file.destroyed;\n }),\n );\n }\n\n private async _list(path: string): Promise<string[]> {\n const fullName = this._getFullFilename(path);\n\n const root = await this._initialize();\n\n // TODO(dmaretskyi): While we're storing all files in flat namespace we just iterate the root.\n // console.log({ path, fullName })\n // let dir: FileSystemDirectoryHandle;\n // if (path === '') {\n // dir = root;\n // } else {\n // dir = await root.getDirectoryHandle(fullName, { create: true });\n // }\n const entries: string[] = [];\n\n for await (const entry of (root as any).keys()) {\n // Filter out .crswap files.\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1228068\n // https://github.com/logseq/logseq/issues/4466#:~:text=Jun%2015%2C%202023-,.,is%20used%20to%20edit%20files.\n if (entry.startsWith(fullName + '_') && !entry.endsWith('.crswap')) {\n entries.push(entry.slice(fullName.length + 1));\n }\n }\n return entries;\n }\n\n @synchronized\n private async _initialize() {\n if (this._root) {\n return this._root;\n }\n this._root = await navigator.storage.getDirectory();\n invariant(this._root, 'Root is undefined');\n return this._root;\n }\n\n createDirectory(sub = '') {\n return new Directory({\n type: this.type,\n path: getFullPath(this.path, sub),\n list: (path) => this._list(path),\n getOrCreateFile: (...args) => this.getOrCreateFile(...args),\n remove: () => this._delete(sub),\n onFlush: async () => {\n await Promise.all(Array.from(this._getFiles(sub)).map(([_, file]) => file.flush()));\n },\n });\n }\n\n getOrCreateFile(path: string, filename: string, opts?: any): File {\n const fullName = this._getFullFilename(path, filename);\n const existingFile = this._files.get(fullName);\n if (existingFile) {\n return existingFile;\n }\n const file = this._createFile(fullName);\n this._files.set(fullName, file);\n return file;\n }\n\n private _createFile(fullName: string) {\n return new WebFile({\n fileName: fullName,\n file: this._initialize().then((root) => root.getFileHandle(fullName, { create: true })),\n destroy: async () => {\n this._files.delete(fullName);\n const root = await this._initialize();\n return root.removeEntry(fullName);\n },\n });\n }\n\n private async _delete(path: string): Promise<void> {\n await Promise.all(\n Array.from(this._getFiles(path)).map(async ([path, file]) => {\n await file.destroy().catch((err: any) => log.warn(err));\n this._files.delete(path);\n }),\n );\n }\n\n async reset() {\n await this._initialize();\n for await (const filename of await (this._root as any).keys()) {\n await this._root!.removeEntry(filename, { recursive: true }).catch((err: any) =>\n log.warn('failed to remove an entry', { filename, err }),\n );\n this._files.delete(filename);\n }\n this._root = undefined;\n }\n\n async close() {\n await Promise.all(\n Array.from(this._files.values()).map((file) => {\n return file.close().catch((e) => log.warn('failed to close a file', { file: file.fileName, e }));\n }),\n );\n }\n\n private _getFullFilename(path: string, filename?: string) {\n // Replace slashes with underscores. Because we can't have slashes in filenames in Browser File Handle API.\n if (filename) {\n return getFullPath(path, filename).replace(/\\//g, '_');\n } else {\n return path.replace(/\\//g, '_');\n }\n }\n\n async getDiskInfo(): Promise<DiskInfo> {\n let used = 0;\n\n const recurse = async (handle: FileSystemDirectoryHandle) => {\n const promises = [];\n\n for await (const entry of (handle as any).values()) {\n promises.push(\n (async () => {\n switch (entry.kind) {\n case 'file':\n used += await (entry as FileSystemFileHandle).getFile().then((f) => f.size);\n break;\n case 'directory':\n await recurse(entry as FileSystemDirectoryHandle);\n break;\n }\n })(),\n );\n }\n await Promise.all(promises);\n };\n\n await recurse(this._root!);\n\n return {\n used,\n };\n }\n}\n\n// TODO(mykola): Remove EventEmitter.\n// @trace.resource()\nexport class WebFile extends EventEmitter implements File {\n @trace.info()\n readonly fileName: string;\n\n private readonly _fileHandle: Promise<FileSystemFileHandle>;\n private readonly _destroy: () => Promise<void>;\n\n /**\n * Current view of the file contents.\n */\n private _buffer: Uint8Array | null = null;\n\n private _loadBufferPromise: Promise<void> | null = null;\n\n private _flushScheduled = false;\n private _flushPromise: Promise<void> = Promise.resolve();\n /**\n * Used to discard unnecessary scheduled flushes.\n * If _flushNow() is called with a lower sequence number it should early exit.\n */\n private _flushSequence = 0;\n\n //\n // Metrics\n //\n\n @trace.metricsCounter()\n private _flushes = new TimeSeriesCounter();\n\n @trace.metricsCounter()\n private _operations = new TimeSeriesCounter();\n\n @trace.metricsCounter()\n private _reads = new TimeSeriesCounter();\n\n @trace.metricsCounter()\n private _readBytes = new TimeSeriesCounter();\n\n @trace.metricsCounter()\n private _writes = new TimeSeriesCounter();\n\n @trace.metricsCounter()\n private _writeBytes = new TimeSeriesCounter();\n\n @trace.info()\n get _bufferSize() {\n return this._buffer?.length;\n }\n\n constructor({\n fileName,\n file,\n destroy,\n }: {\n file: Promise<FileSystemFileHandle>;\n fileName: string;\n destroy: () => Promise<void>;\n }) {\n super();\n this.fileName = fileName;\n this._fileHandle = file;\n this._destroy = destroy;\n\n void this._loadBufferGuarded();\n }\n\n type: StorageType = StorageType.WEBFS;\n\n //\n // random-access-storage library compatibility\n //\n\n // TODO(dmaretskyi): Are those all needed?\n readonly opened: boolean = true;\n readonly suspended: boolean = false;\n readonly closed: boolean = false;\n readonly unlinked: boolean = false;\n readonly writing: boolean = false;\n readonly readable: boolean = true;\n readonly writable: boolean = true;\n readonly deletable: boolean = true;\n readonly truncatable: boolean = true;\n readonly statable: boolean = true;\n\n destroyed = false;\n directory = '';\n // TODO(dmaretskyi): is this used?\n filename = '';\n native: RandomAccessStorage = {\n write: callbackify(this.write.bind(this)),\n read: callbackify(this.read.bind(this)),\n del: callbackify(this.del.bind(this)),\n stat: callbackify(this.stat.bind(this)),\n destroy: callbackify(this.destroy.bind(this)),\n truncate: callbackify(this.truncate?.bind(this)),\n } as RandomAccessStorage;\n\n private async _loadBuffer() {\n const fileHandle = await this._fileHandle;\n const file = await fileHandle.getFile();\n this._buffer = new Uint8Array(await file.arrayBuffer());\n }\n\n private async _loadBufferGuarded() {\n await (this._loadBufferPromise ??= this._loadBuffer());\n }\n\n // Do not call directly, use _flushLater or _flushNow.\n private async _flushCache(sequence: number) {\n if (this.destroyed || sequence < this._flushSequence) {\n return;\n }\n this._flushSequence = sequence + 1;\n\n this._flushes.inc();\n\n await this._loadBufferGuarded();\n invariant(this._buffer);\n\n const fileHandle = await this._fileHandle;\n const writable = await fileHandle.createWritable({ keepExistingData: true });\n await writable.write({ type: 'write', data: this._buffer, position: 0 });\n await writable.close();\n }\n\n private _flushLater() {\n if (this._flushScheduled) {\n return;\n }\n\n const sequence = this._flushSequence;\n setTimeout(async () => {\n // Making sure only one flush can run at a time.\n await this._flushPromise;\n this._flushScheduled = false;\n this._flushPromise = this._flushCache(sequence).catch((err) => log.warn(err));\n });\n\n this._flushScheduled = true;\n }\n\n private async _flushNow() {\n await this._flushPromise;\n this._flushPromise = this._flushCache(this._flushSequence).catch((err) => log.warn(err));\n await this._flushPromise;\n }\n\n async read(offset: number, size: number) {\n this.assertNotDestroyed('Read');\n\n this._operations.inc();\n this._reads.inc();\n this._readBytes.inc(size);\n\n if (!this._buffer) {\n await this._loadBufferGuarded();\n invariant(this._buffer);\n }\n\n if (offset + size > this._buffer.length) {\n throw new Error('Read out of bounds');\n }\n\n // Copy data into a new buffer.\n return Buffer.from(this._buffer.slice(offset, offset + size));\n }\n\n async write(offset: number, data: Buffer) {\n this.assertNotDestroyed('Write');\n\n this._operations.inc();\n this._writes.inc();\n this._writeBytes.inc(data.length);\n\n if (!this._buffer) {\n await this._loadBufferGuarded();\n invariant(this._buffer);\n }\n\n if (offset + data.length <= this._buffer.length) {\n this._buffer.set(data, offset);\n } else {\n // TODO(dmaretskyi): Optimize re-allocations.\n const newCache = new Uint8Array(offset + data.length);\n newCache.set(this._buffer);\n newCache.set(data, offset);\n this._buffer = newCache;\n }\n\n this._flushLater();\n }\n\n async del(offset: number, size: number) {\n this.assertNotDestroyed('Del');\n\n this._operations.inc();\n\n if (offset < 0 || size <= 0) {\n return;\n }\n\n if (!this._buffer) {\n await this._loadBufferGuarded();\n invariant(this._buffer);\n }\n\n let leftoverSize = 0;\n if (offset + size < this._buffer.length) {\n leftoverSize = this._buffer.length - (offset + size);\n this._buffer.set(this._buffer.slice(offset + size, offset + size + leftoverSize), offset);\n }\n\n this._buffer = this._buffer.slice(0, offset + leftoverSize);\n\n this._flushLater();\n }\n\n async stat() {\n this.assertNotDestroyed('Truncate');\n\n this._operations.inc();\n\n // NOTE: This will load all data from the file just to get it's size. While this is a lot of overhead, this works ok for out use cases.\n if (!this._buffer) {\n await this._loadBufferGuarded();\n invariant(this._buffer);\n }\n\n return {\n size: this._buffer.length,\n };\n }\n\n async truncate(offset: number) {\n this.assertNotDestroyed('Truncate');\n\n this._operations.inc();\n\n if (!this._buffer) {\n await this._loadBufferGuarded();\n invariant(this._buffer);\n }\n\n this._buffer = this._buffer.slice(0, offset);\n\n this._flushLater();\n }\n\n async flush() {\n this.assertNotDestroyed('Flush');\n\n await this._flushNow();\n }\n\n /**\n * It's best to avoid using this method as it doesn't really close a file.\n * We could update the _opened flag and add a guard like for destroyed, but this would break\n * the FileSystemFileHandle sharing required for browser tests to run, where writes are\n * not immediately visible if using different file handles.\n */\n async close(): Promise<void> {\n await this._flushNow();\n }\n\n @synchronized\n async destroy() {\n if (!this.destroyed) {\n // We need to flush the buffer before destroying a file so that the call to a storage API\n // finds an entry for deletion\n await this._flushNow();\n this.destroyed = true;\n return await this._destroy();\n }\n }\n\n private assertNotDestroyed(operation: string) {\n if (this.destroyed) {\n throw new Error(`${operation} on a destroyed or closed file`);\n }\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { FirefoxStorage } from './firefox-storage';\nimport { IDbStorage } from './idb-storage';\nimport { WebFS } from './web-fs';\nimport { MemoryStorage, type Storage, type StorageConstructor, StorageType } from '../common';\n\nexport const createStorage: StorageConstructor = ({ type, root = '' } = {}): Storage => {\n if (type === undefined) {\n if (\n navigator &&\n navigator.storage &&\n typeof navigator.storage.getDirectory === 'function' &&\n FileSystemFileHandle &&\n typeof (FileSystemFileHandle.prototype as any).createWritable === 'function'\n ) {\n return new WebFS(root);\n } else {\n return new IDbStorage(root);\n }\n }\n\n switch (type) {\n case StorageType.RAM: {\n return new MemoryStorage(root);\n }\n\n case StorageType.IDB:\n case StorageType.CHROME: {\n return new IDbStorage(root);\n }\n\n case StorageType.FIREFOX: {\n return new FirefoxStorage(root);\n }\n\n case StorageType.WEBFS: {\n return new WebFS(root);\n }\n\n default: {\n throw new Error(`Invalid type: ${type}`);\n }\n }\n};\n"],
5
+ "mappings": ";;;;;;;;;;AAIA,SAASA,QAAAA,aAAY;AACrB,SAASC,eAAe;AAGxB,SAASC,qBAAqB;AAC9B,SAASC,OAAAA,YAAW;;;ACLpB,SAASC,YAAY;AAGd,IAAMC,aAAa,CAACC,OAAeC,WAAmBD,MAAME,MAAMD,MAAAA,EAAQE,KAAK,EAAA;AAE/E,IAAMC,cAAc,CAACC,MAAcC,SAAiBH,KAAKE,MAAMN,WAAWO,MAAMD,IAAAA,CAAAA;;;ACYhF,IAAME,YAAN,MAAMA,WAAAA;EASXC,YAAY,EAAEC,MAAMC,MAAMC,MAAMC,iBAAiBC,QAAQC,QAAO,GAAqB;AACnF,SAAKL,OAAOA;AACZ,SAAKC,OAAOA;AACZ,SAAKK,QAAQJ;AACb,SAAKK,mBAAmBJ;AACxB,SAAKK,UAAUJ;AACf,SAAKK,WAAWJ;EAClB;EAEAK,WAAW;AACT,WAAO,aAAaC,KAAKC,UAAU;MAAEZ,MAAM,KAAKA;MAAMC,MAAM,KAAKA;IAAK,CAAA,CAAA;EACxE;;;;EAKAY,gBAAgBZ,MAAyB;AACvC,WAAO,IAAIH,WAAU;MACnBE,MAAM,KAAKA;MACXC,MAAMa,YAAY,KAAKb,MAAMA,IAAAA;MAC7BC,MAAM,KAAKI;MACXH,iBAAiB,KAAKI;MACtBH,QAAQ,KAAKI;IACf,CAAA;EACF;;;;EAKAN,OAA0B;AACxB,WAAO,KAAKI,MAAM,KAAKL,IAAI;EAC7B;;;;EAKAE,gBAAgBY,UAAkBC,MAAkB;AAClD,WAAO,KAAKT,iBAAiB,KAAKN,MAAMc,UAAUC,IAAAA;EACpD;EAEA,MAAMC,QAAQ;AACZ,UAAM,KAAKR,WAAQ;EACrB;;;;EAKA,MAAMS,SAAS;AACb,UAAM,KAAKV,QAAO;EACpB;AACF;;;AC5EA,OAAOW,UAAU;AAGjB,SAASC,WAAW;;AAIpB,IAAMC,6BAA6B;AAoCnC,IAAMC,aAAa,CAACC,QAAaC,MAAmBC,WAAAA;AAClD,aAAWC,SAASD,QAAQ;AAC1B,QAAI,CAACF,OAAOG,KAAAA,GAAQ;IAGpB,OAAO;AACL,YAAMC,KAAKR,KAAKI,OAAOG,KAAAA,EAAOE,KAAKL,MAAAA,CAAAA;AACnCA,aAAOG,KAAAA,IAAS,UAAUG,SAAAA;AACxB,cAAMC,SAASC,YAAYC,IAAG;AAE9B,cAAMC,MAAM,MAAMN,GAAAA,GAAME,IAAAA;AAExB,cAAMK,UAAUH,YAAYC,IAAG,IAAKF;AACpC,YAAII,UAAUb,4BAA4B;AACxCD,cAAIe,KAAK,0BAA0B;YAAEX;YAAMY,WAAWV;YAAOQ;UAAQ,GAAA;;;;;;QACvE;AAEA,eAAOD;MACT;IACF;EACF;AAEA,SAAOV;AACT;AAMO,IAAMc,WAAW,CAACC,QAA6Bd,SAAAA;AACpD,QAAMe,OAAOjB,WAAWgB,QAAQd,MAAM;IAAC;IAAS;IAAQ;IAAO;IAAQ;IAAS;IAAW;GAAW;AACtG,SAAOgB,OAAOC,OAAOF,MAAM;IAAEf;IAAMc;EAAO,CAAA;AAC5C;;;;AH1DO,IAAeI,kBAAf,MAAeA;;EAMpBC,YAA4BC,MAAc;SAAdA,OAAAA;SALTC,SAAS,oBAAIC,IAAAA;EAKW;EAE3C,CAACC,QAAQC,MAAM,IAAI;AACjB,WAAOC,cAAc,IAAI;EAC3B;EAEAC,SAAS;AACP,WAAO;MAAEC,MAAM,KAAKA;MAAMP,MAAM,KAAKA;IAAK;EAC5C;EAEA,IAAWQ,OAAO;AAChB,WAAO,KAAKP,OAAOO;EACrB;;EAGOC,gBAAgBC,MAAM,IAAe;AAE1C,WAAO,IAAIC,UAAU;MACnBJ,MAAM,KAAKA;MACXP,MAAMY,YAAY,KAAKZ,MAAMU,GAAAA;MAC7BG,MAAM,KAAKC,MAAMC,KAAK,IAAI;MAC1BC,iBAAiB,IAAIC,SAAS,KAAKD,gBAAe,GAAIC,IAAAA;MACtDC,QAAQ,MAAM,KAAKC,QAAQT,GAAAA;IAC7B,CAAA;EACF;;;;EAKA,MAAMU,QAAQ;AACZ,QAAI;AACFC,MAAAA,KAAIC,KAAK,uBAAA,QAAA;;;;;;AACT,YAAM,KAAKC,kBAAkB,EAAA;AAC7B,YAAM,KAAKJ,QAAQ,EAAA;AACnB,YAAM,KAAKK,SAAQ;AACnBH,MAAAA,KAAI,aAAA,QAAA;;;;;;IACN,SAASI,KAAU;AACjBJ,MAAAA,KAAIK,MAAMD,KAAAA,QAAAA;;;;;;IACZ;EACF;EAEA,MAAgBX,MAAMd,MAAiC;AAErD,WAAO2B,MAAMC,MAAM,MAAM,KAAKC,UAAU7B,IAAAA,GAAO8B,KAAI,CAAA,EAAIC,IAAI,CAACC,aAAAA;AAC1D,UAAIC,OAAOD,SAASE,QAAQlC,MAAM,EAAA;AAClC,UAAIiC,KAAKE,WAAW,GAAA,GAAM;AACxBF,eAAOA,KAAKG,UAAU,CAAA;MACxB;AACA,aAAOH;IACT,CAAA;EACF;EAEUjB,gBAAgBhB,MAAcgC,UAAkBK,MAAkB;AAC1E,UAAMC,WAAWC,MAAKvC,MAAMgC,QAAAA;AAE5B,QAAIQ;AACJ,QAAIC,OAAO,KAAKC,iBAAiBJ,QAAAA;AACjC,QAAIG,MAAM;AACR,UAAI,CAACA,KAAKE,QAAQ;AAChB,eAAOF;MACT;AAEAD,eAAS,KAAKI,UAAUH,KAAKD,MAAM;IACrC;AAEA,QAAI,CAACA,QAAQ;AACXA,eAAS,KAAKK,YAAY7C,MAAMgC,UAAUK,IAAAA;IAC5C;AAEAI,WAAOK,SAASN,QAAQ,KAAKjC,IAAI;AACjC,SAAKN,OAAO8C,IAAIT,UAAUG,IAAAA;AAC1B,WAAOA;EACT;EAEUjB,WAAsC;AAC9C,WAAOwB;EACT;;;;EAKUJ,UAAUH,MAA4D;AAC9E,WAAOO;EACT;EAIQN,iBAAiBV,UAAoC;AAC3D,QAAI,KAAK/B,OAAOgD,IAAIjB,QAAAA,GAAW;AAC7B,YAAMS,OAAO,KAAKxC,OAAOiD,IAAIlB,QAAAA;AAC7B,UAAIS,QAAQ,CAACA,KAAKU,WAAW;AAC3B,eAAOV;MACT;IACF;EACF;EAEA,MAAgBZ,UAAU7B,MAA0C;AAClE,UAAMsC,WAAW1B,YAAY,KAAKZ,MAAMA,IAAAA;AACxC,WAAO,IAAIE,IACT;SAAI,KAAKD,OAAOmD,QAAO;MAAIC,OAAO,CAAC,CAACrD,OAAMyC,IAAAA,MAAUzC,MAAKsD,SAAShB,QAAAA,KAAaG,KAAKU,cAAc,IAAA,CAAA;EAEtG;EAEA,MAAc5B,kBAAkBvB,MAA6B;AAC3D,UAAMuD,QAAQC,IACZ7B,MAAMC,MAAM,MAAM,KAAKC,UAAU7B,IAAAA,GAAOyD,OAAM,CAAA,EAAI1B,IAAI,CAACU,SAASA,KAAKiB,MAAK,EAAGhC,MAAM,CAACD,QAAaJ,KAAIK,MAAMD,KAAAA,QAAAA;;;;;;EAE/G;EAEA,MAAMiC,QAAQ;AACZ,UAAM,KAAKnC,kBAAkB,EAAA;EAC/B;;EAGA,MAAgBJ,QAAQnB,MAA6B;AACnD,UAAMuD,QAAQC,IACZ7B,MAAMC,KAAK,MAAM,KAAKC,UAAU7B,IAAAA,CAAAA,EAAO+B,IAAI,CAAC,CAAC/B,OAAMyC,IAAAA,MAAK;AACtD,aAAOA,KACJkB,QAAO,EACPC,KAAK,MAAM,KAAK3D,OAAO4D,OAAO7D,KAAAA,CAAAA,EAC9B0B,MAAM,CAACD,QAAaJ,KAAIyC,MAAMrC,IAAIsC,SAAO,QAAA;;;;;;IAC9C,CAAA,CAAA;EAEJ;AACF;;;AInJA,OAAOC,SAAS;AAGhB,SAASC,qBAAqB;;;;UCAlBC,cAAAA;;;;;;;GAAAA,gBAAAA,cAAAA,CAAAA,EAAAA;;;ADSL,IAAMC,gBAAN,cAA4BC,gBAAAA;EAA5B;;AACWC,gBAAoBC,YAAYC;;EAE7BC,YAAYC,MAAcC,UAAuC;AAClF,WAAO,KAAKC,WAAWC,IAAAA,CAAAA;EACzB;EAEmBC,UAAUC,MAAgD;AAC3E,UAAMC,UAAUD,KAAKE,MAAK;AACzBD,YAAgBE,SAAS;AAC1B,WAAO,KAAKN,WAAWI,OAAAA;EACzB;EAEQJ,WAAWG,MAAgD;AAEjE,UAAMI,WAAWJ,KAAKK,KAAKC,KAAKN,IAAAA;AAEhCA,SAAKK,OAAO,CAACE,QAAgBC,MAAcC,OACzCL,SAASG,QAAQC,MAAM,CAACE,KAAmBC,SAAAA;AACzC,UAAID,KAAK;AACP,eAAOD,GAAGC,GAAAA;MACZ,OAAO;AACL,eAAOD,GAAGC,KAAKE,cAAcD,IAAAA,CAAAA;MAC/B;IACF,CAAA;AAEF,WAAOX;EACT;EAEA,MAAMa,cAAiC;AACrC,QAAIC,OAAO;AAEX,eAAWd,QAAQ,KAAKe,OAAOC,OAAM,GAAI;AACvC,YAAMR,OAAQR,KAAaiB;AAC3BH,cAAQI,OAAOC,MAAMX,IAAAA,IAAQ,IAAIA;IACnC;AAEA,WAAO;MACLM;IACF;EACF;AACF;;;AElDA,OAAOM,SAAS;;;ACIT,IAAeC,iBAAf,cAAsCC,gBAAAA;EAG3CC,YAAYC,MAAc;AACxB,UAAMA,IAAAA;AACN,SAAKC,eAAe,KAAKC,mBAAmBF,IAAAA;EAC9C;EAEUG,YAAYH,MAAcI,UAAuC;AACzE,UAAMC,WAAWC,YAAYN,MAAMI,QAAAA;AACnC,WAAO,KAAKH,aAAaI,QAAAA;EAC3B;EAIA,MAAyBE,WAAW;AAElC,WAAO,IAAIC,QAAc,CAACC,SAASC,WAAAA;AACjC,YAAMC,UAAUC,UAAUC,eAAe,KAAKb,IAAI;AAClDW,cAAQG,YAAY,MAAA;AAClBL,gBAAAA;MACF;AACAE,cAAQI,kBAAkB,MAAA;AACxBL,eAAO,IAAIM,MAAM,iBAAA,CAAA;MACnB;AACAL,cAAQM,YAAY,MAAA;AAClBP,eAAO,IAAIM,MAAM,UAAA,CAAA;MACnB;AACAL,cAAQO,UAAU,CAACC,QAAAA;AACjBT,eAAOS,GAAAA;MACT;IACF,CAAA;EACF;AACF;;;AD5BO,IAAMC,iBAAN,cAA6BC,eAAAA;EAA7B;;AACWC,gBAAoBC,YAAYC;;EAE7BC,mBAAmBC,MAAc;AAClD,WAAOC,IAAI;MAAEC,MAAMF;IAAK,CAAA;EAC1B;AACF;;;AElBA,OAAOG,SAAS;AAGhB,SAASC,iBAAiB;;AAK1B,IAAMC,QAAQ;AAKP,IAAMC,aAAN,cAAyBC,eAAAA;EAAzB;;AACWC,gBAAoBC,YAAYC;AAE/BC,kBAAS;AAClBC,wBAAe;;EAEJC,mBAAmBC,MAAc;AAElD,UAAMC,WAAWC,IAAIF,IAAAA;AACrB,QAAIG;AACJ,SAAKC,MAAM,IAAIC,QAAQ,CAACC,YAAAA;AACtBH,YAAMG;IACR,CAAA;AAEAL,aAASM,MAAMJ,GAAAA;AACf,WAAOF,SAASO;EAClB;EAEmBC,YAAYT,MAAcU,UAAuC;AAClF,UAAMC,OAAO,KAAKC,aAAaC,YAAYb,MAAMU,QAAAA,CAAAA;AACjDC,SAAKG,UAAU,CAACC,OAAAA;AACd,WAAK,KAAKX,IAAIY,KAAK,CAACC,OAAAA;AAClB,cAAMC,aAAaL,YAAYb,MAAMU,QAAAA;AACrC,cAAMS,aAAa,GAAGD,UAAAA;AACtB,cAAME,QAAQC,YAAYC,MAAMJ,YAAYC,UAAAA;AAE5C,cAAMI,cAAcN,GAAGM,YAAY,KAAK1B,QAAQ,WAAA;AAChD,cAAM2B,cAAcD,YAAYC,YAAY,KAAK3B,MAAM;AACvD2B,oBAAYC,OAAOL,KAAAA;AACnBG,oBAAYG,aAAa,MAAA;AACtBf,eAAagB,YAAY;AACzBhB,eAAaiB,WAAW;AACxBjB,eAAakB,SAAS;AACvBd,aAAG,IAAA;QACL;AACAQ,oBAAYO,UAAU,MAAMf,GAAGQ,YAAYQ,KAAK;MAClD,CAAA;IACF;AACCpB,SAAaqB,YAAY;AAE1B,WAAOrB;EACT;EAEA,MAAMsB,WAAWjC,MAA6B;AAC5C,UAAMiB,KAAK,MAAM,KAAKb;AACtB8B,cAAUjB,IAAI,gCAAA;;;;;;;;;AACd,UAAMC,aAAalB;AACnB,UAAMmB,aAAa,GAAGnB,IAAAA;AACtB,UAAMoB,QAAQC,YAAYC,MAAMJ,YAAYC,UAAAA;AAE5C,UAAMI,cAAcN,GAAGM,YAAY,KAAK1B,MAAM;AAC9C,UAAM2B,cAAcD,YAAYC,YAAY,KAAK3B,MAAM;AACvD,UAAMsC,UAAUX,YAAYY,WAAWhB,KAAAA;AAEvC,WAAO,IAAIf,QAAQ,CAACC,SAAS+B,WAAAA;AAC3Bd,kBAAYO,UAAU,MAAA;AACpBO,eAAOF,QAAQJ,KAAK;MACtB;AAEAI,cAAQG,YAAY,CAACC,UAAAA;AACnB,cAAMC,SAAUD,MAAME,OAAsBC;AAC5C,YAAIF,QAAQ;AAEV,gBAAM9B,WAAWiC,OAAOH,OAAOI,GAAG,EAAEC,MAAMtD,KAAAA,EAAO,CAAA;AACjD,cAAImB,YAAY,CAAC,KAAKoC,OAAOC,IAAIlC,YAAY,KAAKb,MAAMU,QAAAA,CAAAA,GAAY;AAClE,kBAAMC,OAAO,KAAKF,YAAYT,MAAMU,QAAAA;AACpC,iBAAKoC,OAAOE,IAAInC,YAAY,KAAKb,MAAMU,QAAAA,GAAWuC,SAAStC,MAAM,KAAKjB,IAAI,CAAA;UAC5E;AACA8C,iBAAOU,SAAQ;QACjB,OAAO;AACL5C,kBAAAA;QACF;MACF;IACF,CAAA;EACF;EAEA,MAAyB6C,UAAUnD,MAAc;AAC/C,QAAI,CAAC,KAAKF,cAAc;AACtB,YAAM,KAAKmC,WAAW,KAAKjC,IAAI;AAC/B,WAAKF,eAAe;IACtB;AAEA,WAAO,MAAMqD,UAAUnD,IAAAA;EACzB;AACF;;;ACjGA,SAASoD,oBAAoB;AAC7B,SAASC,mBAAmB;AAG5B,SAASC,oBAAoB;AAC7B,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,OAAAA,YAAW;AACpB,SAASC,mBAAmBC,aAAa;;;;;;;;;;;;AAOlC,IAAMC,QAAN,MAAMA;EAOXC,YAA4BC,MAAc;SAAdA,OAAAA;SANXC,SAAS,oBAAIC,IAAAA;SAErBC,OAAOC,YAAYC;EAIe;EAE3C,IAAWC,OAAO;AAChB,WAAO,KAAKL,OAAOK;EACrB;EAEQC,UAAUP,MAAoC;AACpD,UAAMQ,WAAW,KAAKC,iBAAiB,KAAKT,MAAMA,IAAAA;AAClD,WAAO,IAAIE,IACT;SAAI,KAAKD,OAAOS,QAAO;MAAIC,OAAO,CAAC,CAACX,OAAMY,IAAAA,MAAK;AAC7C,aAAOZ,MAAKa,SAASL,QAAAA,KAAa,CAACI,KAAKE;IAC1C,CAAA,CAAA;EAEJ;EAEA,MAAcC,MAAMf,MAAiC;AACnD,UAAMQ,WAAW,KAAKC,iBAAiBT,IAAAA;AAEvC,UAAMgB,OAAO,MAAM,KAAKC,YAAW;AAUnC,UAAMP,UAAoB,CAAA;AAE1B,qBAAiBQ,SAAUF,KAAaG,KAAI,GAAI;AAI9C,UAAID,MAAME,WAAWZ,WAAW,GAAA,KAAQ,CAACU,MAAMG,SAAS,SAAA,GAAY;AAClEX,gBAAQY,KAAKJ,MAAMK,MAAMf,SAASgB,SAAS,CAAA,CAAA;MAC7C;IACF;AACA,WAAOd;EACT;EAEA,MACcO,cAAc;AAC1B,QAAI,KAAKQ,OAAO;AACd,aAAO,KAAKA;IACd;AACA,SAAKA,QAAQ,MAAMC,UAAUC,QAAQC,aAAY;AACjDC,IAAAA,WAAU,KAAKJ,OAAO,qBAAA;;;;;;;;;AACtB,WAAO,KAAKA;EACd;EAEAK,gBAAgBC,MAAM,IAAI;AACxB,WAAO,IAAIC,UAAU;MACnB7B,MAAM,KAAKA;MACXH,MAAMiC,YAAY,KAAKjC,MAAM+B,GAAAA;MAC7BG,MAAM,CAAClC,SAAS,KAAKe,MAAMf,IAAAA;MAC3BmC,iBAAiB,IAAIC,SAAS,KAAKD,gBAAe,GAAIC,IAAAA;MACtDC,QAAQ,MAAM,KAAKC,QAAQP,GAAAA;MAC3BQ,SAAS,YAAA;AACP,cAAMC,QAAQC,IAAIC,MAAMC,KAAK,KAAKpC,UAAUwB,GAAAA,CAAAA,EAAMa,IAAI,CAAC,CAACC,GAAGjC,IAAAA,MAAUA,KAAKkC,MAAK,CAAA,CAAA;MACjF;IACF,CAAA;EACF;EAEAX,gBAAgBnC,MAAc+C,UAAkBC,MAAkB;AAChE,UAAMxC,WAAW,KAAKC,iBAAiBT,MAAM+C,QAAAA;AAC7C,UAAME,eAAe,KAAKhD,OAAOiD,IAAI1C,QAAAA;AACrC,QAAIyC,cAAc;AAChB,aAAOA;IACT;AACA,UAAMrC,OAAO,KAAKuC,YAAY3C,QAAAA;AAC9B,SAAKP,OAAOmD,IAAI5C,UAAUI,IAAAA;AAC1B,WAAOA;EACT;EAEQuC,YAAY3C,UAAkB;AACpC,WAAO,IAAI6C,QAAQ;MACjBC,UAAU9C;MACVI,MAAM,KAAKK,YAAW,EAAGsC,KAAK,CAACvC,SAASA,KAAKwC,cAAchD,UAAU;QAAEiD,QAAQ;MAAK,CAAA,CAAA;MACpFC,SAAS,YAAA;AACP,aAAKzD,OAAO0D,OAAOnD,QAAAA;AACnB,cAAMQ,OAAO,MAAM,KAAKC,YAAW;AACnC,eAAOD,KAAK4C,YAAYpD,QAAAA;MAC1B;IACF,CAAA;EACF;EAEA,MAAc8B,QAAQtC,MAA6B;AACjD,UAAMwC,QAAQC,IACZC,MAAMC,KAAK,KAAKpC,UAAUP,IAAAA,CAAAA,EAAO4C,IAAI,OAAO,CAAC5C,OAAMY,IAAAA,MAAK;AACtD,YAAMA,KAAK8C,QAAO,EAAGG,MAAM,CAACC,QAAaC,KAAIC,KAAKF,KAAAA,QAAAA;;;;;;AAClD,WAAK7D,OAAO0D,OAAO3D,KAAAA;IACrB,CAAA,CAAA;EAEJ;EAEA,MAAMiE,QAAQ;AACZ,UAAM,KAAKhD,YAAW;AACtB,qBAAiB8B,YAAY,MAAO,KAAKtB,MAAcN,KAAI,GAAI;AAC7D,YAAM,KAAKM,MAAOmC,YAAYb,UAAU;QAAEmB,WAAW;MAAK,CAAA,EAAGL,MAAM,CAACC,QAClEC,KAAIC,KAAK,6BAA6B;QAAEjB;QAAUe;MAAI,GAAA;;;;;;AAExD,WAAK7D,OAAO0D,OAAOZ,QAAAA;IACrB;AACA,SAAKtB,QAAQ0C;EACf;EAEA,MAAMC,QAAQ;AACZ,UAAM5B,QAAQC,IACZC,MAAMC,KAAK,KAAK1C,OAAOoE,OAAM,CAAA,EAAIzB,IAAI,CAAChC,SAAAA;AACpC,aAAOA,KAAKwD,MAAK,EAAGP,MAAM,CAACS,MAAMP,KAAIC,KAAK,0BAA0B;QAAEpD,MAAMA,KAAK0C;QAAUgB;MAAE,GAAA;;;;;;IAC/F,CAAA,CAAA;EAEJ;EAEQ7D,iBAAiBT,MAAc+C,UAAmB;AAExD,QAAIA,UAAU;AACZ,aAAOd,YAAYjC,MAAM+C,QAAAA,EAAUwB,QAAQ,OAAO,GAAA;IACpD,OAAO;AACL,aAAOvE,KAAKuE,QAAQ,OAAO,GAAA;IAC7B;EACF;EAEA,MAAMC,cAAiC;AACrC,QAAIC,OAAO;AAEX,UAAMC,UAAU,OAAOC,WAAAA;AACrB,YAAMC,WAAW,CAAA;AAEjB,uBAAiB1D,SAAUyD,OAAeN,OAAM,GAAI;AAClDO,iBAAStD,MACN,YAAA;AACC,kBAAQJ,MAAM2D,MAAI;YAChB,KAAK;AACHJ,sBAAQ,MAAOvD,MAA+B4D,QAAO,EAAGvB,KAAK,CAACwB,MAAMA,EAAEzE,IAAI;AAC1E;YACF,KAAK;AACH,oBAAMoE,QAAQxD,KAAAA;AACd;UACJ;QACF,GAAA,CAAA;MAEJ;AACA,YAAMsB,QAAQC,IAAImC,QAAAA;IACpB;AAEA,UAAMF,QAAQ,KAAKjD,KAAK;AAExB,WAAO;MACLgD;IACF;EACF;AACF;;EAhHGO;GAhDUlF,MAAAA,WAAAA,eAAAA,IAAAA;AAoKN,IAAMuD,UAAN,cAAsB4B,aAAAA;EAiD3BlF,YAAY,EACVuD,UACA1C,MACA8C,QAAO,GAKN;AACD,UAAK;AAhDCwB;;;mBAA6B;AAE7BC,8BAA2C;AAE3CC,2BAAkB;AAClBC,yBAA+B7C,QAAQ8C,QAAO;AAK9CC;;;;0BAAiB;AAOjBC;;;oBAAW,IAAIC,kBAAAA;AAGfC,uBAAc,IAAID,kBAAAA;AAGlBE,kBAAS,IAAIF,kBAAAA;AAGbG,sBAAa,IAAIH,kBAAAA;AAGjBI,mBAAU,IAAIJ,kBAAAA;AAGdK,uBAAc,IAAIL,kBAAAA;AAwB1BtF,gBAAoBC,YAAYC;AAOvB0F;;;;kBAAkB;AAClBC,qBAAqB;AACrBC,kBAAkB;AAClBC,oBAAoB;AACpBC,mBAAmB;AACnBC,oBAAoB;AACpBC,oBAAoB;AACpBC,qBAAqB;AACrBC,uBAAuB;AACvBC,oBAAoB;AAE7B1F,qBAAY;AACZ2F,qBAAY;AAEZ1D;oBAAW;AACX2D,kBAA8B;MAC5BC,OAAOC,YAAY,KAAKD,MAAME,KAAK,IAAI,CAAA;MACvCC,MAAMF,YAAY,KAAKE,KAAKD,KAAK,IAAI,CAAA;MACrCE,KAAKH,YAAY,KAAKG,IAAIF,KAAK,IAAI,CAAA;MACnCG,MAAMJ,YAAY,KAAKI,KAAKH,KAAK,IAAI,CAAA;MACrCnD,SAASkD,YAAY,KAAKlD,QAAQmD,KAAK,IAAI,CAAA;MAC3CI,UAAUL,YAAY,KAAKK,UAAUJ,KAAK,IAAI,CAAA;IAChD;AApCE,SAAKvD,WAAWA;AAChB,SAAK4D,cAActG;AACnB,SAAKuG,WAAWzD;AAEhB,SAAK,KAAK0D,mBAAkB;EAC9B;EApBA,IACIC,cAAc;AAChB,WAAO,KAAKnC,SAAS1D;EACvB;EAkDA,MAAc8F,cAAc;AAC1B,UAAMC,aAAa,MAAM,KAAKL;AAC9B,UAAMtG,OAAO,MAAM2G,WAAWzC,QAAO;AACrC,SAAKI,UAAU,IAAIsC,WAAW,MAAM5G,KAAK6G,YAAW,CAAA;EACtD;EAEA,MAAcL,qBAAqB;AACjC,WAAO,KAAKjC,uBAAuB,KAAKmC,YAAW;EACrD;;EAGA,MAAcI,YAAYC,UAAkB;AAC1C,QAAI,KAAK7G,aAAa6G,WAAW,KAAKpC,gBAAgB;AACpD;IACF;AACA,SAAKA,iBAAiBoC,WAAW;AAEjC,SAAKnC,SAASoC,IAAG;AAEjB,UAAM,KAAKR,mBAAkB;AAC7BvF,IAAAA,WAAU,KAAKqD,SAAO,QAAA;;;;;;;;;AAEtB,UAAMqC,aAAa,MAAM,KAAKL;AAC9B,UAAMb,WAAW,MAAMkB,WAAWM,eAAe;MAAEC,kBAAkB;IAAK,CAAA;AAC1E,UAAMzB,SAASM,MAAM;MAAExG,MAAM;MAAS4H,MAAM,KAAK7C;MAAS8C,UAAU;IAAE,CAAA;AACtE,UAAM3B,SAASjC,MAAK;EACtB;EAEQ6D,cAAc;AACpB,QAAI,KAAK7C,iBAAiB;AACxB;IACF;AAEA,UAAMuC,WAAW,KAAKpC;AACtB2C,eAAW,YAAA;AAET,YAAM,KAAK7C;AACX,WAAKD,kBAAkB;AACvB,WAAKC,gBAAgB,KAAKqC,YAAYC,QAAAA,EAAU9D,MAAM,CAACC,QAAQC,KAAIC,KAAKF,KAAAA,QAAAA;;;;;;IAC1E,CAAA;AAEA,SAAKsB,kBAAkB;EACzB;EAEA,MAAc+C,YAAY;AACxB,UAAM,KAAK9C;AACX,SAAKA,gBAAgB,KAAKqC,YAAY,KAAKnC,cAAc,EAAE1B,MAAM,CAACC,QAAQC,KAAIC,KAAKF,KAAAA,QAAAA;;;;;;AACnF,UAAM,KAAKuB;EACb;EAEA,MAAMyB,KAAKsB,QAAgB9H,MAAc;AACvC,SAAK+H,mBAAmB,MAAA;AAExB,SAAK3C,YAAYkC,IAAG;AACpB,SAAKjC,OAAOiC,IAAG;AACf,SAAKhC,WAAWgC,IAAItH,IAAAA;AAEpB,QAAI,CAAC,KAAK4E,SAAS;AACjB,YAAM,KAAKkC,mBAAkB;AAC7BvF,MAAAA,WAAU,KAAKqD,SAAO,QAAA;;;;;;;;;IACxB;AAEA,QAAIkD,SAAS9H,OAAO,KAAK4E,QAAQ1D,QAAQ;AACvC,YAAM,IAAI8G,MAAM,oBAAA;IAClB;AAGA,WAAOC,OAAO5F,KAAK,KAAKuC,QAAQ3D,MAAM6G,QAAQA,SAAS9H,IAAAA,CAAAA;EACzD;EAEA,MAAMqG,MAAMyB,QAAgBL,MAAc;AACxC,SAAKM,mBAAmB,OAAA;AAExB,SAAK3C,YAAYkC,IAAG;AACpB,SAAK/B,QAAQ+B,IAAG;AAChB,SAAK9B,YAAY8B,IAAIG,KAAKvG,MAAM;AAEhC,QAAI,CAAC,KAAK0D,SAAS;AACjB,YAAM,KAAKkC,mBAAkB;AAC7BvF,MAAAA,WAAU,KAAKqD,SAAO,QAAA;;;;;;;;;IACxB;AAEA,QAAIkD,SAASL,KAAKvG,UAAU,KAAK0D,QAAQ1D,QAAQ;AAC/C,WAAK0D,QAAQ9B,IAAI2E,MAAMK,MAAAA;IACzB,OAAO;AAEL,YAAMI,WAAW,IAAIhB,WAAWY,SAASL,KAAKvG,MAAM;AACpDgH,eAASpF,IAAI,KAAK8B,OAAO;AACzBsD,eAASpF,IAAI2E,MAAMK,MAAAA;AACnB,WAAKlD,UAAUsD;IACjB;AAEA,SAAKP,YAAW;EAClB;EAEA,MAAMlB,IAAIqB,QAAgB9H,MAAc;AACtC,SAAK+H,mBAAmB,KAAA;AAExB,SAAK3C,YAAYkC,IAAG;AAEpB,QAAIQ,SAAS,KAAK9H,QAAQ,GAAG;AAC3B;IACF;AAEA,QAAI,CAAC,KAAK4E,SAAS;AACjB,YAAM,KAAKkC,mBAAkB;AAC7BvF,MAAAA,WAAU,KAAKqD,SAAO,QAAA;;;;;;;;;IACxB;AAEA,QAAIuD,eAAe;AACnB,QAAIL,SAAS9H,OAAO,KAAK4E,QAAQ1D,QAAQ;AACvCiH,qBAAe,KAAKvD,QAAQ1D,UAAU4G,SAAS9H;AAC/C,WAAK4E,QAAQ9B,IAAI,KAAK8B,QAAQ3D,MAAM6G,SAAS9H,MAAM8H,SAAS9H,OAAOmI,YAAAA,GAAeL,MAAAA;IACpF;AAEA,SAAKlD,UAAU,KAAKA,QAAQ3D,MAAM,GAAG6G,SAASK,YAAAA;AAE9C,SAAKR,YAAW;EAClB;EAEA,MAAMjB,OAAO;AACX,SAAKqB,mBAAmB,UAAA;AAExB,SAAK3C,YAAYkC,IAAG;AAGpB,QAAI,CAAC,KAAK1C,SAAS;AACjB,YAAM,KAAKkC,mBAAkB;AAC7BvF,MAAAA,WAAU,KAAKqD,SAAO,QAAA;;;;;;;;;IACxB;AAEA,WAAO;MACL5E,MAAM,KAAK4E,QAAQ1D;IACrB;EACF;EAEA,MAAMyF,SAASmB,QAAgB;AAC7B,SAAKC,mBAAmB,UAAA;AAExB,SAAK3C,YAAYkC,IAAG;AAEpB,QAAI,CAAC,KAAK1C,SAAS;AACjB,YAAM,KAAKkC,mBAAkB;AAC7BvF,MAAAA,WAAU,KAAKqD,SAAO,QAAA;;;;;;;;;IACxB;AAEA,SAAKA,UAAU,KAAKA,QAAQ3D,MAAM,GAAG6G,MAAAA;AAErC,SAAKH,YAAW;EAClB;EAEA,MAAMnF,QAAQ;AACZ,SAAKuF,mBAAmB,OAAA;AAExB,UAAM,KAAKF,UAAS;EACtB;;;;;;;EAQA,MAAM/D,QAAuB;AAC3B,UAAM,KAAK+D,UAAS;EACtB;EAEA,MACMzE,UAAU;AACd,QAAI,CAAC,KAAK5C,WAAW;AAGnB,YAAM,KAAKqH,UAAS;AACpB,WAAKrH,YAAY;AACjB,aAAO,MAAM,KAAKqG,SAAQ;IAC5B;EACF;EAEQkB,mBAAmBK,WAAmB;AAC5C,QAAI,KAAK5H,WAAW;AAClB,YAAM,IAAIwH,MAAM,GAAGI,SAAAA,gCAAyC;IAC9D;EACF;AACF;;EAvRGC,MAAMC,KAAI;GADAvF,QAAAA,WAAAA,YAAAA,MAAAA;;EA0BVsF,MAAME,eAAc;GA1BVxF,QAAAA,WAAAA,YAAAA,MAAAA;;EA6BVsF,MAAME,eAAc;GA7BVxF,QAAAA,WAAAA,eAAAA,MAAAA;;EAgCVsF,MAAME,eAAc;GAhCVxF,QAAAA,WAAAA,UAAAA,MAAAA;;EAmCVsF,MAAME,eAAc;GAnCVxF,QAAAA,WAAAA,cAAAA,MAAAA;;EAsCVsF,MAAME,eAAc;GAtCVxF,QAAAA,WAAAA,WAAAA,MAAAA;;EAyCVsF,MAAME,eAAc;GAzCVxF,QAAAA,WAAAA,eAAAA,MAAAA;;EA4CVsF,MAAMC,KAAI;GA5CAvF,QAAAA,WAAAA,eAAAA,IAAAA;;EAwQV2B;GAxQU3B,QAAAA,WAAAA,WAAAA,IAAAA;;;AC7KN,IAAMyF,gBAAoC,CAAC,EAAEC,MAAMC,OAAO,GAAE,IAAK,CAAC,MAAC;AACxE,MAAID,SAASE,QAAW;AACtB,QACEC,aACAA,UAAUC,WACV,OAAOD,UAAUC,QAAQC,iBAAiB,cAC1CC,wBACA,OAAQA,qBAAqBC,UAAkBC,mBAAmB,YAClE;AACA,aAAO,IAAIC,MAAMR,IAAAA;IACnB,OAAO;AACL,aAAO,IAAIS,WAAWT,IAAAA;IACxB;EACF;AAEA,UAAQD,MAAAA;IACN,KAAKW,YAAYC,KAAK;AACpB,aAAO,IAAIC,cAAcZ,IAAAA;IAC3B;IAEA,KAAKU,YAAYG;IACjB,KAAKH,YAAYI,QAAQ;AACvB,aAAO,IAAIL,WAAWT,IAAAA;IACxB;IAEA,KAAKU,YAAYK,SAAS;AACxB,aAAO,IAAIC,eAAehB,IAAAA;IAC5B;IAEA,KAAKU,YAAYO,OAAO;AACtB,aAAO,IAAIT,MAAMR,IAAAA;IACnB;IAEA,SAAS;AACP,YAAM,IAAIkB,MAAM,iBAAiBnB,IAAAA,EAAM;IACzC;EACF;AACF;",
6
+ "names": ["join", "inspect", "inspectObject", "log", "join", "stringDiff", "first", "second", "split", "join", "getFullPath", "root", "path", "Directory", "constructor", "type", "path", "list", "getOrCreateFile", "remove", "onFlush", "_list", "_getOrCreateFile", "_remove", "_onFlush", "toString", "JSON", "stringify", "createDirectory", "getFullPath", "filename", "opts", "flush", "delete", "pify", "log", "MAX_STORAGE_OPERATION_TIME", "pifyFields", "object", "type", "fields", "field", "fn", "bind", "args", "before", "performance", "now", "res", "elapsed", "info", "operation", "wrapFile", "native", "file", "Object", "assign", "AbstractStorage", "constructor", "path", "_files", "Map", "inspect", "custom", "inspectObject", "toJSON", "type", "size", "createDirectory", "sub", "Directory", "getFullPath", "list", "_list", "bind", "getOrCreateFile", "args", "remove", "_remove", "reset", "log", "info", "_closeFilesInPath", "_destroy", "err", "catch", "Array", "from", "_getFiles", "keys", "map", "filename", "name", "replace", "startsWith", "substring", "opts", "fullPath", "join", "native", "file", "_getFileIfExists", "closed", "_openFile", "_createFile", "wrapFile", "set", "undefined", "has", "get", "destroyed", "entries", "filter", "includes", "Promise", "all", "values", "close", "destroy", "then", "delete", "error", "message", "ram", "arrayToBuffer", "StorageType", "MemoryStorage", "AbstractStorage", "type", "StorageType", "RAM", "_createFile", "path", "filename", "_patchFile", "ram", "_openFile", "file", "newFile", "clone", "closed", "trueRead", "read", "bind", "offset", "size", "cb", "err", "data", "arrayToBuffer", "getDiskInfo", "used", "_files", "values", "length", "Number", "isNaN", "raw", "BrowserStorage", "AbstractStorage", "constructor", "path", "_fileStorage", "_createFileStorage", "_createFile", "filename", "fullPath", "getFullPath", "_destroy", "Promise", "resolve", "reject", "request", "indexedDB", "deleteDatabase", "onsuccess", "onupgradeneeded", "Error", "onblocked", "onerror", "err", "FirefoxStorage", "BrowserStorage", "type", "StorageType", "FIREFOX", "_createFileStorage", "path", "raw", "name", "idb", "invariant", "DELIM", "IDbStorage", "BrowserStorage", "type", "StorageType", "IDB", "_store", "_initialized", "_createFileStorage", "path", "database", "idb", "res", "_db", "Promise", "resolve", "getdb", "create", "_createFile", "filename", "file", "_fileStorage", "getFullPath", "destroy", "cb", "then", "db", "lowerBound", "upperBound", "range", "IDBKeyRange", "bound", "transaction", "objectStore", "delete", "oncomplete", "destroyed", "unlinked", "closed", "onerror", "error", "deletable", "_loadFiles", "invariant", "request", "openCursor", "reject", "onsuccess", "event", "cursor", "target", "result", "String", "key", "split", "_files", "has", "set", "wrapFile", "continue", "_getFiles", "EventEmitter", "callbackify", "synchronized", "invariant", "log", "TimeSeriesCounter", "trace", "WebFS", "constructor", "path", "_files", "Map", "type", "StorageType", "WEBFS", "size", "_getFiles", "fullName", "_getFullFilename", "entries", "filter", "file", "includes", "destroyed", "_list", "root", "_initialize", "entry", "keys", "startsWith", "endsWith", "push", "slice", "length", "_root", "navigator", "storage", "getDirectory", "invariant", "createDirectory", "sub", "Directory", "getFullPath", "list", "getOrCreateFile", "args", "remove", "_delete", "onFlush", "Promise", "all", "Array", "from", "map", "_", "flush", "filename", "opts", "existingFile", "get", "_createFile", "set", "WebFile", "fileName", "then", "getFileHandle", "create", "destroy", "delete", "removeEntry", "catch", "err", "log", "warn", "reset", "recursive", "undefined", "close", "values", "e", "replace", "getDiskInfo", "used", "recurse", "handle", "promises", "kind", "getFile", "f", "synchronized", "EventEmitter", "_buffer", "_loadBufferPromise", "_flushScheduled", "_flushPromise", "resolve", "_flushSequence", "_flushes", "TimeSeriesCounter", "_operations", "_reads", "_readBytes", "_writes", "_writeBytes", "opened", "suspended", "closed", "unlinked", "writing", "readable", "writable", "deletable", "truncatable", "statable", "directory", "native", "write", "callbackify", "bind", "read", "del", "stat", "truncate", "_fileHandle", "_destroy", "_loadBufferGuarded", "_bufferSize", "_loadBuffer", "fileHandle", "Uint8Array", "arrayBuffer", "_flushCache", "sequence", "inc", "createWritable", "keepExistingData", "data", "position", "_flushLater", "setTimeout", "_flushNow", "offset", "assertNotDestroyed", "Error", "Buffer", "newCache", "leftoverSize", "operation", "trace", "info", "metricsCounter", "createStorage", "type", "root", "undefined", "navigator", "storage", "getDirectory", "FileSystemFileHandle", "prototype", "createWritable", "WebFS", "IDbStorage", "StorageType", "RAM", "MemoryStorage", "IDB", "CHROME", "FIREFOX", "FirefoxStorage", "WEBFS", "Error"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"inject-globals:@inject-globals":{"bytes":384,"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/utils.ts":{"bytes":1295,"imports":[{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@inject-globals","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"},{"path":"@inject-globals","kind":"import-statement","external":true}],"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},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/abstract-storage.ts":{"bytes":14868,"imports":[{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/node-std/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"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/storage.ts":{"bytes":1714,"imports":[{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/memory-storage.ts":{"bytes":5312,"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"},{"path":"@inject-globals","kind":"import-statement","external":true}],"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"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/browser-storage.ts":{"bytes":4333,"imports":[{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/firefox-storage.ts":{"bytes":2391,"imports":[{"path":"random-access-web/mutable-file-wrapper.js","kind":"import-statement","external":true},{"path":"packages/common/random-access-storage/src/browser/browser-storage.ts","kind":"import-statement","original":"./browser-storage"},{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/idb-storage.ts":{"bytes":1799,"imports":[{"path":"random-access-idb","kind":"import-statement","external":true},{"path":"packages/common/random-access-storage/src/browser/browser-storage.ts","kind":"import-statement","original":"./browser-storage"},{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/web-fs.ts":{"bytes":48272,"imports":[{"path":"@dxos/node-std/events","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/storage.ts":{"bytes":4408,"imports":[{"path":"packages/common/random-access-storage/src/browser/firefox-storage.ts","kind":"import-statement","original":"./firefox-storage"},{"path":"packages/common/random-access-storage/src/browser/idb-storage.ts","kind":"import-statement","original":"./idb-storage"},{"path":"packages/common/random-access-storage/src/browser/web-fs.ts","kind":"import-statement","original":"./web-fs"},{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/index.ts":{"bytes":571,"imports":[{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"packages/common/random-access-storage/src/browser/storage.ts","kind":"import-statement","original":"./storage"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"packages/common/random-access-storage/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":46990},"packages/common/random-access-storage/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/node-std/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":"random-access-web/mutable-file-wrapper.js","kind":"import-statement","external":true},{"path":"random-access-idb","kind":"import-statement","external":true},{"path":"@dxos/node-std/events","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true}],"exports":["AbstractStorage","Directory","MemoryStorage","StorageType","createStorage","getFullPath","stringDiff","wrapFile"],"entryPoint":"packages/common/random-access-storage/src/browser/index.ts","inputs":{"inject-globals:@inject-globals":{"bytesInOutput":79},"packages/common/random-access-storage/src/common/abstract-storage.ts":{"bytesInOutput":3517},"packages/common/random-access-storage/src/common/utils.ts":{"bytesInOutput":180},"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":900},"packages/common/random-access-storage/src/common/storage.ts":{"bytesInOutput":288},"packages/common/random-access-storage/src/browser/index.ts":{"bytesInOutput":0},"packages/common/random-access-storage/src/browser/firefox-storage.ts":{"bytesInOutput":275},"packages/common/random-access-storage/src/browser/browser-storage.ts":{"bytesInOutput":722},"packages/common/random-access-storage/src/browser/idb-storage.ts":{"bytesInOutput":223},"packages/common/random-access-storage/src/browser/web-fs.ts":{"bytesInOutput":12869},"packages/common/random-access-storage/src/browser/storage.ts":{"bytesInOutput":765}},"bytes":23264}}}
1
+ {"inputs":{"inject-globals:@inject-globals":{"bytes":384,"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/utils.ts":{"bytes":1295,"imports":[{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@inject-globals","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"},{"path":"@inject-globals","kind":"import-statement","external":true}],"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},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/abstract-storage.ts":{"bytes":14868,"imports":[{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/node-std/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"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/storage.ts":{"bytes":1714,"imports":[{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/common/memory-storage.ts":{"bytes":5312,"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"},{"path":"@inject-globals","kind":"import-statement","external":true}],"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"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/browser-storage.ts":{"bytes":4337,"imports":[{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/firefox-storage.ts":{"bytes":2391,"imports":[{"path":"random-access-web/mutable-file-wrapper.js","kind":"import-statement","external":true},{"path":"packages/common/random-access-storage/src/browser/browser-storage.ts","kind":"import-statement","original":"./browser-storage"},{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/idb-storage.ts":{"bytes":12146,"imports":[{"path":"random-access-idb","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"packages/common/random-access-storage/src/browser/browser-storage.ts","kind":"import-statement","original":"./browser-storage"},{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/web-fs.ts":{"bytes":48272,"imports":[{"path":"@dxos/node-std/events","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/storage.ts":{"bytes":4408,"imports":[{"path":"packages/common/random-access-storage/src/browser/firefox-storage.ts","kind":"import-statement","original":"./firefox-storage"},{"path":"packages/common/random-access-storage/src/browser/idb-storage.ts","kind":"import-statement","original":"./idb-storage"},{"path":"packages/common/random-access-storage/src/browser/web-fs.ts","kind":"import-statement","original":"./web-fs"},{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/random-access-storage/src/browser/index.ts":{"bytes":571,"imports":[{"path":"packages/common/random-access-storage/src/common/index.ts","kind":"import-statement","original":"../common"},{"path":"packages/common/random-access-storage/src/browser/storage.ts","kind":"import-statement","original":"./storage"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"packages/common/random-access-storage/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":52296},"packages/common/random-access-storage/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/node-std/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":"random-access-web/mutable-file-wrapper.js","kind":"import-statement","external":true},{"path":"random-access-idb","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/node-std/events","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true}],"exports":["AbstractStorage","Directory","MemoryStorage","StorageType","createStorage","getFullPath","stringDiff","wrapFile"],"entryPoint":"packages/common/random-access-storage/src/browser/index.ts","inputs":{"inject-globals:@inject-globals":{"bytesInOutput":79},"packages/common/random-access-storage/src/common/abstract-storage.ts":{"bytesInOutput":3517},"packages/common/random-access-storage/src/common/utils.ts":{"bytesInOutput":180},"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":900},"packages/common/random-access-storage/src/common/storage.ts":{"bytesInOutput":288},"packages/common/random-access-storage/src/browser/index.ts":{"bytesInOutput":0},"packages/common/random-access-storage/src/browser/firefox-storage.ts":{"bytesInOutput":275},"packages/common/random-access-storage/src/browser/browser-storage.ts":{"bytesInOutput":722},"packages/common/random-access-storage/src/browser/idb-storage.ts":{"bytesInOutput":2741},"packages/common/random-access-storage/src/browser/web-fs.ts":{"bytesInOutput":12890},"packages/common/random-access-storage/src/browser/storage.ts":{"bytesInOutput":765}},"bytes":25803}}}
@@ -4,7 +4,7 @@ import { AbstractStorage } from '../common';
4
4
  * Base class for random access files based on IDB.
5
5
  */
6
6
  export declare abstract class BrowserStorage extends AbstractStorage {
7
- private readonly _fileStorage;
7
+ protected readonly _fileStorage: (filename: string, opts?: {}) => RandomAccessStorage;
8
8
  constructor(path: string);
9
9
  protected _createFile(path: string, filename: string): RandomAccessStorage;
10
10
  protected abstract _createFileStorage(path: string): (filename: string, opts?: {}) => RandomAccessStorage;
@@ -1 +1 @@
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
+ {"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,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,mBAAmB,CAAC;gBAE1E,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,3 +1,4 @@
1
+ import { type RandomAccessStorage } from 'random-access-storage';
1
2
  import { BrowserStorage } from './browser-storage';
2
3
  import { StorageType } from '../common';
3
4
  /**
@@ -6,6 +7,12 @@ import { StorageType } from '../common';
6
7
  */
7
8
  export declare class IDbStorage extends BrowserStorage {
8
9
  type: StorageType;
10
+ private _db;
11
+ private readonly _store;
12
+ private _initialized;
9
13
  protected _createFileStorage(path: string): any;
14
+ protected _createFile(path: string, filename: string): RandomAccessStorage;
15
+ _loadFiles(path: string): Promise<void>;
16
+ protected _getFiles(path: string): Promise<Map<string, import("../common").File>>;
10
17
  }
11
18
  //# sourceMappingURL=idb-storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"idb-storage.d.ts","sourceRoot":"","sources":["../../../../src/browser/idb-storage.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;GAGG;AACH,qBAAa,UAAW,SAAQ,cAAc;IAC5B,IAAI,EAAE,WAAW,CAAmB;cAEjC,kBAAkB,CAAC,IAAI,EAAE,MAAM;CAGnD"}
1
+ {"version":3,"file":"idb-storage.d.ts","sourceRoot":"","sources":["../../../../src/browser/idb-storage.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAIjE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAyB,MAAM,WAAW,CAAC;AAG/D;;;GAGG;AACH,qBAAa,UAAW,SAAQ,cAAc;IAC5B,IAAI,EAAE,WAAW,CAAmB;IACpD,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,YAAY,CAAS;cAEV,kBAAkB,CAAC,IAAI,EAAE,MAAM;cAY/B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IAyB7E,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAiCpB,SAAS,CAAC,IAAI,EAAE,MAAM;CAQhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.blueprint-test.d.ts","sourceRoot":"","sources":["../../../../src/testing/storage.blueprint-test.ts"],"names":[],"mappings":"AASA,OAAO,EAAa,KAAK,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEjE,eAAO,MAAM,UAAU,cAAkB,CAAC;AAE1C,eAAO,MAAM,YAAY,kBAAmB,WAAW,iBAAiB,MAAM,OAAO,SA2bpF,CAAC"}
1
+ {"version":3,"file":"storage.blueprint-test.d.ts","sourceRoot":"","sources":["../../../../src/testing/storage.blueprint-test.ts"],"names":[],"mappings":"AASA,OAAO,EAAa,KAAK,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEjE,eAAO,MAAM,UAAU,cAAkB,CAAC;AAE1C,eAAO,MAAM,YAAY,kBAAmB,WAAW,iBAAiB,MAAM,OAAO,SAwbpF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/random-access-storage",
3
- "version": "0.4.8",
3
+ "version": "0.4.9-main.1057b49",
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.8",
28
- "@dxos/context": "0.4.8",
29
- "@dxos/invariant": "0.4.8",
30
- "@dxos/debug": "0.4.8",
31
- "@dxos/log": "0.4.8",
32
- "@dxos/node-std": "0.4.8",
33
- "@dxos/util": "0.4.8",
34
- "@dxos/tracing": "0.4.8"
27
+ "@dxos/context": "0.4.9-main.1057b49",
28
+ "@dxos/async": "0.4.9-main.1057b49",
29
+ "@dxos/debug": "0.4.9-main.1057b49",
30
+ "@dxos/invariant": "0.4.9-main.1057b49",
31
+ "@dxos/log": "0.4.9-main.1057b49",
32
+ "@dxos/tracing": "0.4.9-main.1057b49",
33
+ "@dxos/node-std": "0.4.9-main.1057b49",
34
+ "@dxos/util": "0.4.9-main.1057b49"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/pify": "^3.0.2",
@@ -10,7 +10,7 @@ import { AbstractStorage, getFullPath } from '../common';
10
10
  * Base class for random access files based on IDB.
11
11
  */
12
12
  export abstract class BrowserStorage extends AbstractStorage {
13
- private readonly _fileStorage: (filename: string, opts?: {}) => RandomAccessStorage;
13
+ protected readonly _fileStorage: (filename: string, opts?: {}) => RandomAccessStorage;
14
14
 
15
15
  constructor(path: string) {
16
16
  super(path);
@@ -3,18 +3,100 @@
3
3
  //
4
4
 
5
5
  import idb from 'random-access-idb';
6
+ import { type RandomAccessStorage } from 'random-access-storage';
7
+
8
+ import { invariant } from '@dxos/invariant';
6
9
 
7
10
  import { BrowserStorage } from './browser-storage';
8
- import { StorageType } from '../common';
11
+ import { StorageType, getFullPath, wrapFile } from '../common';
9
12
 
13
+ const DELIM = '\0';
10
14
  /**
11
15
  * Storage interface implementation for index DB.
12
16
  * https://github.com/random-access-storage/random-access-idb
13
17
  */
14
18
  export class IDbStorage extends BrowserStorage {
15
19
  public override type: StorageType = StorageType.IDB;
20
+ private _db!: Promise<IDBDatabase>;
21
+ private readonly _store = 'data';
22
+ private _initialized = false;
16
23
 
17
24
  protected override _createFileStorage(path: string) {
18
- return idb(path);
25
+ // Note: We use patched version of random-access-idb here that exposes the getdb method.
26
+ const database = idb(path);
27
+ let res: (db: IDBDatabase) => void;
28
+ this._db = new Promise((resolve) => {
29
+ res = resolve;
30
+ });
31
+
32
+ database.getdb(res!);
33
+ return database.create;
34
+ }
35
+
36
+ protected override _createFile(path: string, filename: string): RandomAccessStorage {
37
+ const file = this._fileStorage(getFullPath(path, filename));
38
+ file.destroy = (cb: (err: Error | null) => void) => {
39
+ void this._db.then((db) => {
40
+ const lowerBound = getFullPath(path, filename);
41
+ const upperBound = `${lowerBound}\uffff`;
42
+ const range = IDBKeyRange.bound(lowerBound, upperBound);
43
+
44
+ const transaction = db.transaction(this._store, 'readwrite');
45
+ const objectStore = transaction.objectStore(this._store);
46
+ objectStore.delete(range);
47
+ transaction.oncomplete = () => {
48
+ (file as any).destroyed = true;
49
+ (file as any).unlinked = true;
50
+ (file as any).closed = true;
51
+ cb(null);
52
+ };
53
+ transaction.onerror = () => cb(transaction.error);
54
+ });
55
+ };
56
+ (file as any).deletable = true;
57
+
58
+ return file;
59
+ }
60
+
61
+ async _loadFiles(path: string): Promise<void> {
62
+ const db = await this._db;
63
+ invariant(db, 'Database is not initialized.');
64
+ const lowerBound = path;
65
+ const upperBound = `${path}\uffff`;
66
+ const range = IDBKeyRange.bound(lowerBound, upperBound);
67
+
68
+ const transaction = db.transaction(this._store);
69
+ const objectStore = transaction.objectStore(this._store);
70
+ const request = objectStore.openCursor(range);
71
+
72
+ return new Promise((resolve, reject) => {
73
+ transaction.onerror = () => {
74
+ reject(request.error);
75
+ };
76
+
77
+ request.onsuccess = (event) => {
78
+ const cursor = (event.target as IDBRequest).result as IDBCursorWithValue;
79
+ if (cursor) {
80
+ // NOTE: The key contains some metadata at the end added by random-access-idb, so we need to split it.
81
+ const filename = String(cursor.key).split(DELIM)[0];
82
+ if (filename && !this._files.has(getFullPath(this.path, filename))) {
83
+ const file = this._createFile(path, filename);
84
+ this._files.set(getFullPath(this.path, filename), wrapFile(file, this.type));
85
+ }
86
+ cursor.continue();
87
+ } else {
88
+ resolve();
89
+ }
90
+ };
91
+ });
92
+ }
93
+
94
+ protected override async _getFiles(path: string) {
95
+ if (!this._initialized) {
96
+ await this._loadFiles(this.path);
97
+ this._initialized = true;
98
+ }
99
+
100
+ return super._getFiles(path);
19
101
  }
20
102
  }
@@ -115,9 +115,6 @@ export const storageTests = (testGroupName: StorageType, createStorage: () => St
115
115
  });
116
116
 
117
117
  test('destroy clears all data', async () => {
118
- if (new Set([StorageType.IDB, StorageType.CHROME, StorageType.FIREFOX]).has(testGroupName)) {
119
- return;
120
- }
121
118
  const storage = createStorage();
122
119
  const directory = storage.createDirectory();
123
120
  const fileName = randomText();
@@ -390,7 +387,7 @@ export const storageTests = (testGroupName: StorageType, createStorage: () => St
390
387
  });
391
388
 
392
389
  test('list all files after reopen', async (t) => {
393
- if (testGroupName !== StorageType.WEBFS && testGroupName !== StorageType.NODE) {
390
+ if (testGroupName === StorageType.RAM) {
394
391
  t.skip();
395
392
  }
396
393