@livestore/adapter-web 0.4.0-dev.2 → 0.4.0-dev.20

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.
Files changed (61) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/in-memory/in-memory-adapter.d.ts +15 -5
  3. package/dist/in-memory/in-memory-adapter.d.ts.map +1 -1
  4. package/dist/in-memory/in-memory-adapter.js +29 -15
  5. package/dist/in-memory/in-memory-adapter.js.map +1 -1
  6. package/dist/web-worker/client-session/client-session-devtools.d.ts +1 -1
  7. package/dist/web-worker/client-session/client-session-devtools.d.ts.map +1 -1
  8. package/dist/web-worker/client-session/client-session-devtools.js +14 -3
  9. package/dist/web-worker/client-session/client-session-devtools.js.map +1 -1
  10. package/dist/web-worker/client-session/persisted-adapter.d.ts +15 -0
  11. package/dist/web-worker/client-session/persisted-adapter.d.ts.map +1 -1
  12. package/dist/web-worker/client-session/persisted-adapter.js +67 -46
  13. package/dist/web-worker/client-session/persisted-adapter.js.map +1 -1
  14. package/dist/web-worker/client-session/sqlite-loader.d.ts +2 -0
  15. package/dist/web-worker/client-session/sqlite-loader.d.ts.map +1 -0
  16. package/dist/web-worker/client-session/sqlite-loader.js +16 -0
  17. package/dist/web-worker/client-session/sqlite-loader.js.map +1 -0
  18. package/dist/web-worker/common/persisted-sqlite.d.ts +23 -7
  19. package/dist/web-worker/common/persisted-sqlite.d.ts.map +1 -1
  20. package/dist/web-worker/common/persisted-sqlite.js +114 -76
  21. package/dist/web-worker/common/persisted-sqlite.js.map +1 -1
  22. package/dist/web-worker/common/shutdown-channel.d.ts +3 -2
  23. package/dist/web-worker/common/shutdown-channel.d.ts.map +1 -1
  24. package/dist/web-worker/common/shutdown-channel.js +2 -2
  25. package/dist/web-worker/common/shutdown-channel.js.map +1 -1
  26. package/dist/web-worker/common/worker-disconnect-channel.d.ts +2 -6
  27. package/dist/web-worker/common/worker-disconnect-channel.d.ts.map +1 -1
  28. package/dist/web-worker/common/worker-disconnect-channel.js +3 -2
  29. package/dist/web-worker/common/worker-disconnect-channel.js.map +1 -1
  30. package/dist/web-worker/common/worker-schema.d.ts +103 -58
  31. package/dist/web-worker/common/worker-schema.d.ts.map +1 -1
  32. package/dist/web-worker/common/worker-schema.js +48 -36
  33. package/dist/web-worker/common/worker-schema.js.map +1 -1
  34. package/dist/web-worker/leader-worker/make-leader-worker.d.ts +4 -2
  35. package/dist/web-worker/leader-worker/make-leader-worker.d.ts.map +1 -1
  36. package/dist/web-worker/leader-worker/make-leader-worker.js +47 -21
  37. package/dist/web-worker/leader-worker/make-leader-worker.js.map +1 -1
  38. package/dist/web-worker/shared-worker/make-shared-worker.d.ts +2 -1
  39. package/dist/web-worker/shared-worker/make-shared-worker.d.ts.map +1 -1
  40. package/dist/web-worker/shared-worker/make-shared-worker.js +65 -49
  41. package/dist/web-worker/shared-worker/make-shared-worker.js.map +1 -1
  42. package/dist/web-worker/vite-dev-polyfill.js +1 -0
  43. package/dist/web-worker/vite-dev-polyfill.js.map +1 -1
  44. package/package.json +8 -9
  45. package/src/in-memory/in-memory-adapter.ts +36 -20
  46. package/src/web-worker/ambient.d.ts +7 -24
  47. package/src/web-worker/client-session/client-session-devtools.ts +18 -3
  48. package/src/web-worker/client-session/persisted-adapter.ts +112 -59
  49. package/src/web-worker/client-session/sqlite-loader.ts +19 -0
  50. package/src/web-worker/common/persisted-sqlite.ts +219 -113
  51. package/src/web-worker/common/shutdown-channel.ts +10 -3
  52. package/src/web-worker/common/worker-disconnect-channel.ts +10 -3
  53. package/src/web-worker/common/worker-schema.ts +62 -35
  54. package/src/web-worker/leader-worker/make-leader-worker.ts +58 -33
  55. package/src/web-worker/shared-worker/make-shared-worker.ts +95 -75
  56. package/src/web-worker/vite-dev-polyfill.ts +1 -0
  57. package/dist/opfs-utils.d.ts +0 -5
  58. package/dist/opfs-utils.d.ts.map +0 -1
  59. package/dist/opfs-utils.js +0 -43
  60. package/dist/opfs-utils.js.map +0 -1
  61. package/src/opfs-utils.ts +0 -61
@@ -0,0 +1,16 @@
1
+ import { loadSqlite3Wasm } from '@livestore/sqlite-wasm/load-wasm';
2
+ /**
3
+ * Browser sessions benefit from downloading and compiling the wasm binary as soon as
4
+ * possible to hide network and IO latency behind the rest of the boot process. We kick
5
+ * that work off eagerly on the client while still returning the shared promise.
6
+ *
7
+ * The Cloudflare / Workerd runtime has stricter rules: async fetches during module
8
+ * evaluation are blocked, so we defer loading until the worker asks for it.
9
+ */
10
+ const isServerRuntime = String(import.meta.env?.SSR) === 'true' || typeof window === 'undefined';
11
+ let sqlite3Promise;
12
+ if (isServerRuntime === false) {
13
+ sqlite3Promise = loadSqlite3Wasm();
14
+ }
15
+ export const loadSqlite3 = () => (isServerRuntime ? loadSqlite3Wasm() : (sqlite3Promise ?? loadSqlite3Wasm()));
16
+ //# sourceMappingURL=sqlite-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-loader.js","sourceRoot":"","sources":["../../../src/web-worker/client-session/sqlite-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAElE;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,MAAM,IAAI,OAAO,MAAM,KAAK,WAAW,CAAA;AAEhG,IAAI,cAA8D,CAAA;AAElE,IAAI,eAAe,KAAK,KAAK,EAAE,CAAC;IAC9B,cAAc,GAAG,eAAe,EAAE,CAAA;AACpC,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,eAAe,EAAE,CAAC,CAAC,CAAA"}
@@ -1,24 +1,40 @@
1
- import { UnexpectedError } from '@livestore/common';
2
1
  import type { LiveStoreSchema } from '@livestore/common/schema';
2
+ import { type WebDatabaseMetadataOpfs } from '@livestore/sqlite-wasm/browser';
3
3
  import { Effect, Schema } from '@livestore/utils/effect';
4
+ import { Opfs, type WebError } from '@livestore/utils/effect/browser';
4
5
  import type * as WorkerSchema from './worker-schema.ts';
5
6
  declare const PersistedSqliteError_base: Schema.TaggedErrorClass<PersistedSqliteError, "PersistedSqliteError", {
6
7
  readonly _tag: Schema.tag<"PersistedSqliteError">;
7
8
  } & {
8
- cause: typeof Schema.Defect;
9
+ message: typeof Schema.String;
10
+ cause: Schema.optional<typeof Schema.Defect>;
9
11
  }>;
10
12
  export declare class PersistedSqliteError extends PersistedSqliteError_base {
11
13
  }
12
- export declare const readPersistedAppDbFromClientSession: ({ storageOptions, storeId, schema, }: {
14
+ export declare const readPersistedStateDbFromClientSession: (args: {
13
15
  storageOptions: WorkerSchema.StorageType;
14
16
  storeId: string;
15
17
  schema: LiveStoreSchema;
16
- }) => Effect.Effect<Uint8Array<ArrayBuffer> | undefined, never, never>;
17
- export declare const resetPersistedDataFromClientSession: ({ storageOptions, storeId, }: {
18
+ }) => Effect.Effect<Uint8Array<ArrayBuffer>, PersistedSqliteError | WebError.UnknownError | WebError.TypeError | WebError.NotFoundError | WebError.NotAllowedError | WebError.TypeMismatchError | WebError.SecurityError | Opfs.OpfsError, Opfs.Opfs>;
19
+ export declare const resetPersistedDataFromClientSession: (args_0: {
18
20
  storageOptions: WorkerSchema.StorageType;
19
21
  storeId: string;
20
- }) => Effect.Effect<void, UnexpectedError, never>;
21
- export declare const sanitizeOpfsDir: (directory: string | undefined, storeId: string) => string;
22
+ }) => Effect.Effect.AsEffect<Effect.Effect<void, PersistedSqliteError | WebError.UnknownError | WebError.TypeError | WebError.NotAllowedError | WebError.TypeMismatchError | WebError.SecurityError | Opfs.OpfsError | WebError.NoModificationAllowedError | WebError.InvalidModificationError, Opfs.Opfs>>;
23
+ export declare const sanitizeOpfsDir: (directory: string | undefined, storeId: string) => Effect.Effect<string, PersistedSqliteError, never>;
22
24
  export declare const getStateDbFileName: (schema: LiveStoreSchema) => string;
25
+ export declare const MAX_ARCHIVED_STATE_DBS_IN_DEV = 3;
26
+ export declare const ARCHIVE_DIR_NAME = "archive";
27
+ /**
28
+ * Cleanup old state database files after successful migration.
29
+ * This prevents OPFS file pool capacity from being exhausted by accumulated schema files.
30
+ *
31
+ * @param vfs - The AccessHandlePoolVFS instance for safe file operations
32
+ * @param currentSchema - Current schema (to avoid deleting the active database)
33
+ */
34
+ export declare const cleanupOldStateDbFiles: (options: {
35
+ vfs: WebDatabaseMetadataOpfs['vfs'];
36
+ currentSchema: LiveStoreSchema;
37
+ opfsDirectory: string;
38
+ }) => Effect.Effect<void, WebError.AbortError | WebError.DataCloneError | WebError.EvalError | WebError.InvalidModificationError | WebError.InvalidStateError | WebError.NoModificationAllowedError | WebError.NotAllowedError | WebError.NotFoundError | WebError.QuotaExceededError | WebError.RangeError | WebError.ReferenceError | WebError.SecurityError | WebError.TypeError | WebError.TypeMismatchError | WebError.URIError | WebError.UnknownError | Opfs.OpfsError | PersistedSqliteError, Opfs.Opfs>;
23
39
  export {};
24
40
  //# sourceMappingURL=persisted-sqlite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"persisted-sqlite.d.ts","sourceRoot":"","sources":["../../../src/web-worker/common/persisted-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,OAAO,EAAE,MAAM,EAAY,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGlE,OAAO,KAAK,KAAK,YAAY,MAAM,oBAAoB,CAAA;;;;;;AAEvD,qBAAa,oBAAqB,SAAQ,yBAExC;CAAG;AAEL,eAAO,MAAM,mCAAmC,GAAI,sCAIjD;IACD,cAAc,EAAE,YAAY,CAAC,WAAW,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,eAAe,CAAA;CACxB,qEAuDE,CAAA;AAEH,eAAO,MAAM,mCAAmC,GAAI,8BAGjD;IACD,cAAc,EAAE,YAAY,CAAC,WAAW,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;CAChB,gDASE,CAAA;AAgCH,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,GAAG,SAAS,EAAE,SAAS,MAAM,WAY7E,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,QAAQ,eAAe,WAIzD,CAAA"}
1
+ {"version":3,"file":"persisted-sqlite.d.ts","sourceRoot":"","sources":["../../../src/web-worker/common/persisted-sqlite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EAAS,MAAM,EAA2B,MAAM,EAAU,MAAM,yBAAyB,CAAA;AAChG,OAAO,EAAE,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,KAAK,KAAK,YAAY,MAAM,oBAAoB,CAAA;;;;;;;AAEvD,qBAAa,oBAAqB,SAAQ,yBAGxC;CAAG;AAEL,eAAO,MAAM,qCAAqC,EAAE,CAAC,IAAI,EAAE;IACzD,cAAc,EAAE,YAAY,CAAC,WAAW,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,eAAe,CAAA;CACxB,KAAK,MAAM,CAAC,MAAM,CACjB,UAAU,CAAC,WAAW,CAAC,EAErB,oBAAoB,GACpB,QAAQ,CAAC,YAAY,GACrB,QAAQ,CAAC,SAAS,GAClB,QAAQ,CAAC,aAAa,GACtB,QAAQ,CAAC,eAAe,GACxB,QAAQ,CAAC,iBAAiB,GAC1B,QAAQ,CAAC,aAAa,GACtB,IAAI,CAAC,SAAS,EAChB,IAAI,CAAC,IAAI,CAmDV,CAAA;AAED,eAAO,MAAM,mCAAmC;oBAGY,YAAY,CAAC,WAAW;aAAW,MAAM;2SAUpG,CAAA;AAED,eAAO,MAAM,eAAe,wGAe1B,CAAA;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,eAAe,WAIzD,CAAA;AAED,eAAO,MAAM,6BAA6B,IAAI,CAAA;AAC9C,eAAO,MAAM,gBAAgB,YAAY,CAAA;AAEzC;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,CAAC,OAAO,EAAE;IAC7C,GAAG,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAA;IACnC,aAAa,EAAE,eAAe,CAAA;IAC9B,aAAa,EAAE,MAAM,CAAA;CACtB,KAAK,MAAM,CAAC,MAAM,CACjB,IAAI,EAEF,QAAQ,CAAC,UAAU,GACnB,QAAQ,CAAC,cAAc,GACvB,QAAQ,CAAC,SAAS,GAClB,QAAQ,CAAC,wBAAwB,GACjC,QAAQ,CAAC,iBAAiB,GAC1B,QAAQ,CAAC,0BAA0B,GACnC,QAAQ,CAAC,eAAe,GACxB,QAAQ,CAAC,aAAa,GACtB,QAAQ,CAAC,kBAAkB,GAC3B,QAAQ,CAAC,UAAU,GACnB,QAAQ,CAAC,cAAc,GACvB,QAAQ,CAAC,aAAa,GACtB,QAAQ,CAAC,SAAS,GAClB,QAAQ,CAAC,iBAAiB,GAC1B,QAAQ,CAAC,QAAQ,GACjB,QAAQ,CAAC,YAAY,GACrB,IAAI,CAAC,SAAS,GACd,oBAAoB,EACtB,IAAI,CAAC,IAAI,CA+DT,CAAA"}
@@ -1,92 +1,130 @@
1
- import { liveStoreStorageFormatVersion, UnexpectedError } from '@livestore/common';
2
- import { decodeSAHPoolFilename, HEADER_OFFSET_DATA } from '@livestore/sqlite-wasm/browser';
3
- import { Effect, Schedule, Schema } from '@livestore/utils/effect';
4
- import * as OpfsUtils from "../../opfs-utils.js";
1
+ import { liveStoreStorageFormatVersion } from '@livestore/common';
2
+ import { decodeAccessHandlePoolFilename, HEADER_OFFSET_DATA, } from '@livestore/sqlite-wasm/browser';
3
+ import { isDevEnv } from '@livestore/utils';
4
+ import { Chunk, Effect, Option, Order, Schedule, Schema, Stream } from '@livestore/utils/effect';
5
+ import { Opfs } from '@livestore/utils/effect/browser';
5
6
  export class PersistedSqliteError extends Schema.TaggedError()('PersistedSqliteError', {
6
- cause: Schema.Defect,
7
+ message: Schema.String,
8
+ cause: Schema.optional(Schema.Defect),
7
9
  }) {
8
10
  }
9
- export const readPersistedAppDbFromClientSession = ({ storageOptions, storeId, schema, }) => Effect.promise(async () => {
10
- const directory = sanitizeOpfsDir(storageOptions.directory, storeId);
11
- const sahPoolOpaqueDir = await OpfsUtils.getDirHandle(directory).catch(() => undefined);
12
- if (sahPoolOpaqueDir === undefined) {
13
- return undefined;
11
+ export const readPersistedStateDbFromClientSession = Effect.fn('@livestore/adapter-web:readPersistedStateDbFromClientSession')(function* ({ storageOptions, storeId, schema }) {
12
+ const accessHandlePoolDirString = yield* sanitizeOpfsDir(storageOptions.directory, storeId);
13
+ const accessHandlePoolDirHandle = yield* Opfs.getDirectoryHandleByPath(accessHandlePoolDirString);
14
+ const stateDbFileName = `/${getStateDbFileName(schema)}`;
15
+ const handlesStream = yield* Opfs.Opfs.values(accessHandlePoolDirHandle);
16
+ const stateDbFileOption = yield* handlesStream.pipe(Stream.filter((handle) => handle.kind === 'file'), Stream.mapEffect((fileHandle) => Effect.gen(function* () {
17
+ const file = yield* Opfs.Opfs.getFile(fileHandle);
18
+ const fileName = yield* Effect.promise(() => decodeAccessHandlePoolFilename(file));
19
+ return { file, fileName };
20
+ }), { concurrency: 'unbounded' }), Stream.find(({ fileName }) => fileName === stateDbFileName), Stream.runHead);
21
+ if (Option.isNone(stateDbFileOption)) {
22
+ return yield* new PersistedSqliteError({
23
+ message: `State database file not found in client session (expected '${stateDbFileName}' in '${accessHandlePoolDirString}')`,
24
+ });
14
25
  }
15
- const tryGetDbFile = async (fileHandle) => {
16
- const file = await fileHandle.getFile();
17
- const fileName = await decodeSAHPoolFilename(file);
18
- return fileName ? { fileName, file } : undefined;
19
- };
20
- const getAllFiles = async (asyncIterator) => {
21
- const results = [];
22
- for await (const value of asyncIterator) {
23
- if (value.kind === 'file') {
24
- results.push(value);
25
- }
26
- }
27
- return results;
28
- };
29
- const files = await getAllFiles(sahPoolOpaqueDir.values());
30
- const fileResults = await Promise.all(files.map(tryGetDbFile));
31
- const appDbFileName = `/${getStateDbFileName(schema)}`;
32
- const dbFileRes = fileResults.find((_) => _?.fileName === appDbFileName);
33
- // console.debug('fileResults', fileResults, 'dbFileRes', dbFileRes)
34
- if (dbFileRes !== undefined) {
35
- const data = await dbFileRes.file.slice(HEADER_OFFSET_DATA).arrayBuffer();
36
- // console.debug('readPersistedAppDbFromClientSession', data.byteLength, data)
37
- // Given the SAH pool always eagerly creates files with empty non-header data,
38
- // we want to return undefined if the file exists but is empty
39
- if (data.byteLength === 0) {
40
- return undefined;
41
- }
42
- return new Uint8Array(data);
26
+ const stateDbBuffer = yield* Effect.promise(() => stateDbFileOption.value.file.slice(HEADER_OFFSET_DATA).arrayBuffer());
27
+ // Given the access handle pool always eagerly creates files with empty non-header data,
28
+ // we want to return undefined if the file exists but is empty
29
+ if (stateDbBuffer.byteLength === 0) {
30
+ return yield* new PersistedSqliteError({
31
+ message: `State database file is empty in client session (expected '${stateDbFileName}' in '${accessHandlePoolDirString}')`,
32
+ });
43
33
  }
44
- return undefined;
45
- }).pipe(Effect.logWarnIfTakesLongerThan({
34
+ return new Uint8Array(stateDbBuffer);
35
+ }, Effect.logWarnIfTakesLongerThan({
46
36
  duration: 1000,
47
- label: '@livestore/adapter-web:readPersistedAppDbFromClientSession',
48
- }), Effect.withPerformanceMeasure('@livestore/adapter-web:readPersistedAppDbFromClientSession'), Effect.withSpan('@livestore/adapter-web:readPersistedAppDbFromClientSession'));
49
- export const resetPersistedDataFromClientSession = ({ storageOptions, storeId, }) => Effect.gen(function* () {
50
- const directory = sanitizeOpfsDir(storageOptions.directory, storeId);
51
- yield* opfsDeleteAbs(directory);
52
- }).pipe(Effect.retry({
37
+ label: '@livestore/adapter-web:readPersistedStateDbFromClientSession',
38
+ }), Effect.withPerformanceMeasure('@livestore/adapter-web:readPersistedStateDbFromClientSession'));
39
+ export const resetPersistedDataFromClientSession = Effect.fn('@livestore/adapter-web:resetPersistedDataFromClientSession')(function* ({ storageOptions, storeId }) {
40
+ const directory = yield* sanitizeOpfsDir(storageOptions.directory, storeId);
41
+ yield* Opfs.remove(directory).pipe(
42
+ // We ignore NotFoundError here as it may not exist or have already been deleted
43
+ Effect.catchTag('@livestore/utils/Web/NotFoundError', () => Effect.void));
44
+ }, Effect.retry({
53
45
  schedule: Schedule.exponentialBackoff10Sec,
54
- }), Effect.withSpan('@livestore/adapter-web:resetPersistedDataFromClientSession'));
55
- const opfsDeleteAbs = (absPath) => Effect.promise(async () => {
56
- // Get the root directory handle
57
- const root = await OpfsUtils.rootHandlePromise;
58
- // Split the absolute path to traverse directories
59
- const pathParts = absPath.split('/').filter((part) => part.length);
60
- try {
61
- // Traverse to the target file handle
62
- let currentDir = root;
63
- for (let i = 0; i < pathParts.length - 1; i++) {
64
- currentDir = await currentDir.getDirectoryHandle(pathParts[i]);
65
- }
66
- // Delete the file
67
- await currentDir.removeEntry(pathParts.at(-1), { recursive: true });
68
- }
69
- catch (error) {
70
- if (error instanceof DOMException && error.name === 'NotFoundError') {
71
- // Can ignore as it's already been deleted or not there in the first place
72
- return;
73
- }
74
- else {
75
- throw error;
76
- }
77
- }
78
- }).pipe(UnexpectedError.mapToUnexpectedError, Effect.withSpan('@livestore/adapter-web:worker:opfsDeleteFile', { attributes: { absFilePath: absPath } }));
79
- export const sanitizeOpfsDir = (directory, storeId) => {
80
- // Root dir should be `''` not `/`
81
- if (directory === undefined || directory === '' || directory === '/')
46
+ }));
47
+ export const sanitizeOpfsDir = Effect.fn('@livestore/adapter-web:sanitizeOpfsDir')(function* (directory, storeId) {
48
+ if (directory === undefined || directory === '' || directory === '/') {
82
49
  return `livestore-${storeId}@${liveStoreStorageFormatVersion}`;
50
+ }
83
51
  if (directory.includes('/')) {
84
- throw new Error(`@livestore/adapter-web:worker:sanitizeOpfsDir: Nested directories are not yet supported ('${directory}')`);
52
+ return yield* new PersistedSqliteError({
53
+ message: `Nested directories are not yet supported ('${directory}')`,
54
+ });
85
55
  }
86
56
  return `${directory}@${liveStoreStorageFormatVersion}`;
87
- };
57
+ });
88
58
  export const getStateDbFileName = (schema) => {
89
59
  const schemaHashSuffix = schema.state.sqlite.migrations.strategy === 'manual' ? 'fixed' : schema.state.sqlite.hash.toString();
90
60
  return `state${schemaHashSuffix}.db`;
91
61
  };
62
+ export const MAX_ARCHIVED_STATE_DBS_IN_DEV = 3;
63
+ export const ARCHIVE_DIR_NAME = 'archive';
64
+ /**
65
+ * Cleanup old state database files after successful migration.
66
+ * This prevents OPFS file pool capacity from being exhausted by accumulated schema files.
67
+ *
68
+ * @param vfs - The AccessHandlePoolVFS instance for safe file operations
69
+ * @param currentSchema - Current schema (to avoid deleting the active database)
70
+ */
71
+ export const cleanupOldStateDbFiles = Effect.fn('@livestore/adapter-web:cleanupOldStateDbFiles')(function* ({ vfs, currentSchema, opfsDirectory }) {
72
+ // Only cleanup for auto migration strategy because:
73
+ // - Auto strategy: Creates new database files per schema change (e.g., state123.db, state456.db)
74
+ // which accumulate over time and can exhaust OPFS file pool capacity
75
+ // - Manual strategy: Always reuses the same database file (statefixed.db) across schema changes,
76
+ // so there are never multiple old files to clean up
77
+ if (currentSchema.state.sqlite.migrations.strategy === 'manual') {
78
+ yield* Effect.logDebug('Skipping state db cleanup - manual migration strategy uses fixed filename');
79
+ return;
80
+ }
81
+ const isDev = isDevEnv();
82
+ const currentDbFileName = getStateDbFileName(currentSchema);
83
+ const currentPath = `/${currentDbFileName}`;
84
+ const allPaths = yield* Effect.sync(() => vfs.getTrackedFilePaths());
85
+ const oldStateDbPaths = allPaths.filter((path) => path.startsWith('/state') && path.endsWith('.db') && path !== currentPath);
86
+ if (oldStateDbPaths.length === 0) {
87
+ yield* Effect.logDebug('No old database files found');
88
+ return;
89
+ }
90
+ const absoluteArchiveDirName = `${opfsDirectory}/${ARCHIVE_DIR_NAME}`;
91
+ if (isDev && !(yield* Opfs.exists(absoluteArchiveDirName)))
92
+ yield* Opfs.makeDirectory(absoluteArchiveDirName);
93
+ for (const path of oldStateDbPaths) {
94
+ const fileName = path.startsWith('/') ? path.slice(1) : path;
95
+ if (isDev) {
96
+ const archiveFileData = yield* vfs.readFilePayload(fileName);
97
+ const archiveFileName = `${Date.now()}-${fileName}`;
98
+ yield* Opfs.writeFile(`${opfsDirectory}/archive/${archiveFileName}`, new Uint8Array(archiveFileData));
99
+ }
100
+ const vfsResultCode = yield* Effect.try({
101
+ try: () => vfs.jDelete(fileName, 0),
102
+ catch: (cause) => new PersistedSqliteError({ message: `Failed to delete old state database file: ${fileName}`, cause }),
103
+ });
104
+ // 0 indicates a successful result in SQLite.
105
+ // See https://www.sqlite.org/c3ref/c_abort.html
106
+ if (vfsResultCode !== 0) {
107
+ return yield* new PersistedSqliteError({
108
+ message: `Failed to delete old state database file: ${fileName}, got result code: ${vfsResultCode}`,
109
+ });
110
+ }
111
+ yield* Effect.logDebug(`Deleted old state database file: ${fileName}`);
112
+ }
113
+ if (isDev) {
114
+ yield* pruneArchiveDirectory({
115
+ archiveDirectory: absoluteArchiveDirName,
116
+ keep: MAX_ARCHIVED_STATE_DBS_IN_DEV,
117
+ });
118
+ }
119
+ });
120
+ const pruneArchiveDirectory = Effect.fn('@livestore/adapter-web:pruneArchiveDirectory')(function* ({ archiveDirectory, keep, }) {
121
+ const archiveDirHandle = yield* Opfs.getDirectoryHandleByPath(archiveDirectory);
122
+ const handlesStream = yield* Opfs.Opfs.values(archiveDirHandle);
123
+ const filesWithMetadata = yield* handlesStream.pipe(Stream.filter((handle) => handle.kind === 'file'), Stream.mapEffect((fileHandle) => Opfs.getMetadata(fileHandle)), Stream.runCollect);
124
+ const filesToDelete = filesWithMetadata.pipe(Chunk.sort(Order.mapInput(Order.number, (entry) => entry.lastModified)), Chunk.drop(keep), Chunk.toReadonlyArray);
125
+ if (filesToDelete.length === 0)
126
+ return;
127
+ yield* Effect.forEach(filesToDelete, ({ name }) => Opfs.Opfs.removeEntry(archiveDirHandle, name));
128
+ yield* Effect.logDebug(`Pruned ${filesToDelete.length} old database file(s) from archive directory`);
129
+ });
92
130
  //# sourceMappingURL=persisted-sqlite.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persisted-sqlite.js","sourceRoot":"","sources":["../../../src/web-worker/common/persisted-sqlite.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"persisted-sqlite.js","sourceRoot":"","sources":["../../../src/web-worker/common/persisted-sqlite.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
- import { WebChannel } from '@livestore/utils/effect';
2
- export declare const makeShutdownChannel: (storeId: string) => import("effect/Effect").Effect<WebChannel.WebChannel<import("@livestore/common").UnexpectedError | import("@livestore/common").IntentionalShutdownCause | import("@livestore/common").SyncError, import("@livestore/common").UnexpectedError | import("@livestore/common").IntentionalShutdownCause | import("@livestore/common").SyncError, never>, never, import("effect/Scope").Scope>;
1
+ import { ShutdownChannel } from '@livestore/common/leader-thread';
2
+ import type { Effect, Scope, WebChannel } from '@livestore/utils/effect';
3
+ export declare const makeShutdownChannel: (storeId: string) => Effect.Effect<WebChannel.WebChannel<typeof ShutdownChannel.All.Type, typeof ShutdownChannel.All.Type>, never, Scope.Scope>;
3
4
  //# sourceMappingURL=shutdown-channel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown-channel.d.ts","sourceRoot":"","sources":["../../../src/web-worker/common/shutdown-channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,8XAI/C,CAAA"}
1
+ {"version":3,"file":"shutdown-channel.d.ts","sourceRoot":"","sources":["../../../src/web-worker/common/shutdown-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGxE,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,KACd,MAAM,CAAC,MAAM,CACd,UAAU,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EACvF,KAAK,EACL,KAAK,CAAC,KAAK,CAKT,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { ShutdownChannel } from '@livestore/common/leader-thread';
2
- import { WebChannel } from '@livestore/utils/effect';
3
- export const makeShutdownChannel = (storeId) => WebChannel.broadcastChannel({
2
+ import { WebChannelBrowser } from '@livestore/utils/effect/browser';
3
+ export const makeShutdownChannel = (storeId) => WebChannelBrowser.broadcastChannel({
4
4
  channelName: `livestore.shutdown.${storeId}`,
5
5
  schema: ShutdownChannel.All,
6
6
  });
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown-channel.js","sourceRoot":"","sources":["../../../src/web-worker/common/shutdown-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,EAAE,CACrD,UAAU,CAAC,gBAAgB,CAAC;IAC1B,WAAW,EAAE,sBAAsB,OAAO,EAAE;IAC5C,MAAM,EAAE,eAAe,CAAC,GAAG;CAC5B,CAAC,CAAA"}
1
+ {"version":3,"file":"shutdown-channel.js","sourceRoot":"","sources":["../../../src/web-worker/common/shutdown-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAe,EAKf,EAAE,CACF,iBAAiB,CAAC,gBAAgB,CAAC;IACjC,WAAW,EAAE,sBAAsB,OAAO,EAAE;IAC5C,MAAM,EAAE,eAAe,CAAC,GAAG;CAC5B,CAAC,CAAA"}
@@ -1,12 +1,8 @@
1
- import { Schema, WebChannel } from '@livestore/utils/effect';
1
+ import { type Effect, Schema, type Scope, type WebChannel } from '@livestore/utils/effect';
2
2
  declare const DedicatedWorkerDisconnectBroadcast_base: Schema.TaggedStruct<"DedicatedWorkerDisconnectBroadcast", {}>;
3
3
  export declare class DedicatedWorkerDisconnectBroadcast extends DedicatedWorkerDisconnectBroadcast_base {
4
4
  }
5
5
  /** Used across workers for leader election purposes */
6
- export declare const makeWorkerDisconnectChannel: (storeId: string) => import("effect/Effect").Effect<WebChannel.WebChannel<{
7
- readonly _tag: "DedicatedWorkerDisconnectBroadcast";
8
- }, {
9
- readonly _tag: "DedicatedWorkerDisconnectBroadcast";
10
- }, never>, never, import("effect/Scope").Scope>;
6
+ export declare const makeWorkerDisconnectChannel: (storeId: string) => Effect.Effect<WebChannel.WebChannel<typeof DedicatedWorkerDisconnectBroadcast.Type, typeof DedicatedWorkerDisconnectBroadcast.Type>, never, Scope.Scope>;
11
7
  export {};
12
8
  //# sourceMappingURL=worker-disconnect-channel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker-disconnect-channel.d.ts","sourceRoot":"","sources":["../../../src/web-worker/common/worker-disconnect-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;;AAE5D,qBAAa,kCAAmC,SAAQ,uCAA6D;CAAG;AAExH,uDAAuD;AACvD,eAAO,MAAM,2BAA2B,GAAI,SAAS,MAAM;;;;+CAIvD,CAAA"}
1
+ {"version":3,"file":"worker-disconnect-channel.d.ts","sourceRoot":"","sources":["../../../src/web-worker/common/worker-disconnect-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAA;;AAG1F,qBAAa,kCAAmC,SAAQ,uCAA6D;CAAG;AAExH,uDAAuD;AACvD,eAAO,MAAM,2BAA2B,GACtC,SAAS,MAAM,KACd,MAAM,CAAC,MAAM,CACd,UAAU,CAAC,UAAU,CAAC,OAAO,kCAAkC,CAAC,IAAI,EAAE,OAAO,kCAAkC,CAAC,IAAI,CAAC,EACrH,KAAK,EACL,KAAK,CAAC,KAAK,CAKT,CAAA"}
@@ -1,8 +1,9 @@
1
- import { Schema, WebChannel } from '@livestore/utils/effect';
1
+ import { Schema } from '@livestore/utils/effect';
2
+ import { WebChannelBrowser } from '@livestore/utils/effect/browser';
2
3
  export class DedicatedWorkerDisconnectBroadcast extends Schema.TaggedStruct('DedicatedWorkerDisconnectBroadcast', {}) {
3
4
  }
4
5
  /** Used across workers for leader election purposes */
5
- export const makeWorkerDisconnectChannel = (storeId) => WebChannel.broadcastChannel({
6
+ export const makeWorkerDisconnectChannel = (storeId) => WebChannelBrowser.broadcastChannel({
6
7
  channelName: `livestore.worker-disconnect.${storeId}`,
7
8
  schema: DedicatedWorkerDisconnectBroadcast,
8
9
  });
@@ -1 +1 @@
1
- {"version":3,"file":"worker-disconnect-channel.js","sourceRoot":"","sources":["../../../src/web-worker/common/worker-disconnect-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE5D,MAAM,OAAO,kCAAmC,SAAQ,MAAM,CAAC,YAAY,CAAC,oCAAoC,EAAE,EAAE,CAAC;CAAG;AAExH,uDAAuD;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAe,EAAE,EAAE,CAC7D,UAAU,CAAC,gBAAgB,CAAC;IAC1B,WAAW,EAAE,+BAA+B,OAAO,EAAE;IACrD,MAAM,EAAE,kCAAkC;CAC3C,CAAC,CAAA"}
1
+ {"version":3,"file":"worker-disconnect-channel.js","sourceRoot":"","sources":["../../../src/web-worker/common/worker-disconnect-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,EAA+B,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,MAAM,OAAO,kCAAmC,SAAQ,MAAM,CAAC,YAAY,CAAC,oCAAoC,EAAE,EAAE,CAAC;CAAG;AAExH,uDAAuD;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAe,EAKf,EAAE,CACF,iBAAiB,CAAC,gBAAgB,CAAC;IACjC,WAAW,EAAE,+BAA+B,OAAO,EAAE;IACrD,MAAM,EAAE,kCAAkC;CAC3C,CAAC,CAAA"}