@livestore/adapter-web 0.4.0-dev.8 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/.tsbuildinfo +1 -1
- package/dist/in-memory/in-memory-adapter.d.ts +49 -5
- package/dist/in-memory/in-memory-adapter.d.ts.map +1 -1
- package/dist/in-memory/in-memory-adapter.js +77 -20
- package/dist/in-memory/in-memory-adapter.js.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/single-tab/mod.d.ts +15 -0
- package/dist/single-tab/mod.d.ts.map +1 -0
- package/dist/single-tab/mod.js +15 -0
- package/dist/single-tab/mod.js.map +1 -0
- package/dist/single-tab/single-tab-adapter.d.ts +108 -0
- package/dist/single-tab/single-tab-adapter.d.ts.map +1 -0
- package/dist/single-tab/single-tab-adapter.js +271 -0
- package/dist/single-tab/single-tab-adapter.js.map +1 -0
- package/dist/web-worker/client-session/client-session-devtools.d.ts +2 -2
- package/dist/web-worker/client-session/client-session-devtools.d.ts.map +1 -1
- package/dist/web-worker/client-session/client-session-devtools.js +20 -9
- package/dist/web-worker/client-session/client-session-devtools.js.map +1 -1
- package/dist/web-worker/client-session/persisted-adapter.d.ts +18 -0
- package/dist/web-worker/client-session/persisted-adapter.d.ts.map +1 -1
- package/dist/web-worker/client-session/persisted-adapter.js +141 -67
- package/dist/web-worker/client-session/persisted-adapter.js.map +1 -1
- package/dist/web-worker/client-session/sqlite-loader.d.ts +2 -0
- package/dist/web-worker/client-session/sqlite-loader.d.ts.map +1 -0
- package/dist/web-worker/client-session/sqlite-loader.js +16 -0
- package/dist/web-worker/client-session/sqlite-loader.js.map +1 -0
- package/dist/web-worker/common/persisted-sqlite.d.ts +13 -20
- package/dist/web-worker/common/persisted-sqlite.d.ts.map +1 -1
- package/dist/web-worker/common/persisted-sqlite.js +95 -102
- package/dist/web-worker/common/persisted-sqlite.js.map +1 -1
- package/dist/web-worker/common/shutdown-channel.d.ts +3 -2
- package/dist/web-worker/common/shutdown-channel.d.ts.map +1 -1
- package/dist/web-worker/common/shutdown-channel.js +2 -2
- package/dist/web-worker/common/shutdown-channel.js.map +1 -1
- package/dist/web-worker/common/worker-disconnect-channel.d.ts +2 -6
- package/dist/web-worker/common/worker-disconnect-channel.d.ts.map +1 -1
- package/dist/web-worker/common/worker-disconnect-channel.js +3 -2
- package/dist/web-worker/common/worker-disconnect-channel.js.map +1 -1
- package/dist/web-worker/common/worker-schema.d.ts +152 -58
- package/dist/web-worker/common/worker-schema.d.ts.map +1 -1
- package/dist/web-worker/common/worker-schema.js +55 -37
- package/dist/web-worker/common/worker-schema.js.map +1 -1
- package/dist/web-worker/leader-worker/make-leader-worker.d.ts +5 -3
- package/dist/web-worker/leader-worker/make-leader-worker.d.ts.map +1 -1
- package/dist/web-worker/leader-worker/make-leader-worker.js +99 -38
- package/dist/web-worker/leader-worker/make-leader-worker.js.map +1 -1
- package/dist/web-worker/shared-worker/make-shared-worker.d.ts +2 -1
- package/dist/web-worker/shared-worker/make-shared-worker.d.ts.map +1 -1
- package/dist/web-worker/shared-worker/make-shared-worker.js +62 -52
- package/dist/web-worker/shared-worker/make-shared-worker.js.map +1 -1
- package/package.json +56 -18
- package/src/in-memory/in-memory-adapter.ts +92 -26
- package/src/index.ts +15 -1
- package/src/single-tab/mod.ts +15 -0
- package/src/single-tab/single-tab-adapter.ts +499 -0
- package/src/web-worker/ambient.d.ts +7 -24
- package/src/web-worker/client-session/client-session-devtools.ts +32 -18
- package/src/web-worker/client-session/persisted-adapter.ts +199 -103
- package/src/web-worker/client-session/sqlite-loader.ts +19 -0
- package/src/web-worker/common/persisted-sqlite.ts +215 -170
- package/src/web-worker/common/shutdown-channel.ts +10 -3
- package/src/web-worker/common/worker-disconnect-channel.ts +10 -3
- package/src/web-worker/common/worker-schema.ts +78 -38
- package/src/web-worker/leader-worker/make-leader-worker.ts +149 -71
- package/src/web-worker/shared-worker/make-shared-worker.ts +78 -90
- package/dist/opfs-utils.d.ts +0 -5
- package/dist/opfs-utils.d.ts.map +0 -1
- package/dist/opfs-utils.js +0 -43
- package/dist/opfs-utils.js.map +0 -1
- package/src/opfs-utils.ts +0 -61
|
@@ -1,95 +1,66 @@
|
|
|
1
|
-
import { liveStoreStorageFormatVersion
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
|
|
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';
|
|
6
|
+
export class PersistedSqliteError extends Schema.TaggedError('~@livestore/adapter-web/PersistedSqliteError')('PersistedSqliteError', {
|
|
6
7
|
message: Schema.String,
|
|
7
|
-
cause: Schema.Defect,
|
|
8
|
+
cause: Schema.optional(Schema.Defect),
|
|
8
9
|
}) {
|
|
9
10
|
}
|
|
10
|
-
export const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
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) === true) {
|
|
22
|
+
return yield* new PersistedSqliteError({
|
|
23
|
+
message: `State database file not found in client session (expected '${stateDbFileName}' in '${accessHandlePoolDirString}')`,
|
|
24
|
+
});
|
|
15
25
|
}
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
for await (const value of asyncIterator) {
|
|
24
|
-
if (value.kind === 'file') {
|
|
25
|
-
results.push(value);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return results;
|
|
29
|
-
};
|
|
30
|
-
const files = await getAllFiles(sahPoolOpaqueDir.values());
|
|
31
|
-
const fileResults = await Promise.all(files.map(tryGetDbFile));
|
|
32
|
-
const appDbFileName = `/${getStateDbFileName(schema)}`;
|
|
33
|
-
const dbFileRes = fileResults.find((_) => _?.fileName === appDbFileName);
|
|
34
|
-
// console.debug('fileResults', fileResults, 'dbFileRes', dbFileRes)
|
|
35
|
-
if (dbFileRes !== undefined) {
|
|
36
|
-
const data = await dbFileRes.file.slice(HEADER_OFFSET_DATA).arrayBuffer();
|
|
37
|
-
// console.debug('readPersistedAppDbFromClientSession', data.byteLength, data)
|
|
38
|
-
// Given the SAH pool always eagerly creates files with empty non-header data,
|
|
39
|
-
// we want to return undefined if the file exists but is empty
|
|
40
|
-
if (data.byteLength === 0) {
|
|
41
|
-
return undefined;
|
|
42
|
-
}
|
|
43
|
-
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
|
+
});
|
|
44
33
|
}
|
|
45
|
-
return
|
|
46
|
-
}
|
|
34
|
+
return new Uint8Array(stateDbBuffer);
|
|
35
|
+
}, Effect.logWarnIfTakesLongerThan({
|
|
47
36
|
duration: 1000,
|
|
48
|
-
label: '@livestore/adapter-web:
|
|
49
|
-
}), Effect.withPerformanceMeasure('@livestore/adapter-web:
|
|
50
|
-
export const resetPersistedDataFromClientSession = ({ storageOptions, storeId
|
|
51
|
-
const directory = sanitizeOpfsDir(storageOptions.directory, storeId);
|
|
52
|
-
yield*
|
|
53
|
-
|
|
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, { recursive: true }).pipe(
|
|
42
|
+
// We ignore NotFoundError here as it may not exist or have already been deleted
|
|
43
|
+
Effect.catchTag('NotFoundError', () => Effect.void));
|
|
44
|
+
}, Effect.retry({
|
|
54
45
|
schedule: Schedule.exponentialBackoff10Sec,
|
|
55
|
-
})
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
const root = await OpfsUtils.rootHandlePromise;
|
|
59
|
-
// Split the absolute path to traverse directories
|
|
60
|
-
const pathParts = absPath.split('/').filter((part) => part.length);
|
|
61
|
-
try {
|
|
62
|
-
// Traverse to the target file handle
|
|
63
|
-
let currentDir = root;
|
|
64
|
-
for (let i = 0; i < pathParts.length - 1; i++) {
|
|
65
|
-
currentDir = await currentDir.getDirectoryHandle(pathParts[i]);
|
|
66
|
-
}
|
|
67
|
-
// Delete the file
|
|
68
|
-
await currentDir.removeEntry(pathParts.at(-1), { recursive: true });
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
if (error instanceof DOMException && error.name === 'NotFoundError') {
|
|
72
|
-
// Can ignore as it's already been deleted or not there in the first place
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
throw error;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}).pipe(UnexpectedError.mapToUnexpectedError, Effect.withSpan('@livestore/adapter-web:worker:opfsDeleteFile', { attributes: { absFilePath: absPath } }));
|
|
80
|
-
export const sanitizeOpfsDir = (directory, storeId) => {
|
|
81
|
-
// Root dir should be `''` not `/`
|
|
82
|
-
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 === '/') {
|
|
83
49
|
return `livestore-${storeId}@${liveStoreStorageFormatVersion}`;
|
|
84
|
-
|
|
85
|
-
|
|
50
|
+
}
|
|
51
|
+
if (directory.includes('/') === true) {
|
|
52
|
+
return yield* new PersistedSqliteError({
|
|
53
|
+
message: `Nested directories are not yet supported ('${directory}')`,
|
|
54
|
+
});
|
|
86
55
|
}
|
|
87
56
|
return `${directory}@${liveStoreStorageFormatVersion}`;
|
|
88
|
-
};
|
|
57
|
+
});
|
|
89
58
|
export const getStateDbFileName = (schema) => {
|
|
90
59
|
const schemaHashSuffix = schema.state.sqlite.migrations.strategy === 'manual' ? 'fixed' : schema.state.sqlite.hash.toString();
|
|
91
60
|
return `state${schemaHashSuffix}.db`;
|
|
92
61
|
};
|
|
62
|
+
export const MAX_ARCHIVED_STATE_DBS_IN_DEV = 3;
|
|
63
|
+
export const ARCHIVE_DIR_NAME = 'archive';
|
|
93
64
|
/**
|
|
94
65
|
* Cleanup old state database files after successful migration.
|
|
95
66
|
* This prevents OPFS file pool capacity from being exhausted by accumulated schema files.
|
|
@@ -97,7 +68,7 @@ export const getStateDbFileName = (schema) => {
|
|
|
97
68
|
* @param vfs - The AccessHandlePoolVFS instance for safe file operations
|
|
98
69
|
* @param currentSchema - Current schema (to avoid deleting the active database)
|
|
99
70
|
*/
|
|
100
|
-
export const cleanupOldStateDbFiles = Effect.fn('@livestore/adapter-web:cleanupOldStateDbFiles')(function* ({ vfs, currentSchema }) {
|
|
71
|
+
export const cleanupOldStateDbFiles = Effect.fn('@livestore/adapter-web:cleanupOldStateDbFiles')(function* ({ vfs, currentSchema, opfsDirectory }) {
|
|
101
72
|
// Only cleanup for auto migration strategy because:
|
|
102
73
|
// - Auto strategy: Creates new database files per schema change (e.g., state123.db, state456.db)
|
|
103
74
|
// which accumulate over time and can exhaust OPFS file pool capacity
|
|
@@ -107,44 +78,66 @@ export const cleanupOldStateDbFiles = Effect.fn('@livestore/adapter-web:cleanupO
|
|
|
107
78
|
yield* Effect.logDebug('Skipping state db cleanup - manual migration strategy uses fixed filename');
|
|
108
79
|
return;
|
|
109
80
|
}
|
|
81
|
+
const isDev = isDevEnv();
|
|
110
82
|
const currentDbFileName = getStateDbFileName(currentSchema);
|
|
111
83
|
const currentPath = `/${currentDbFileName}`;
|
|
112
84
|
const allPaths = yield* Effect.sync(() => vfs.getTrackedFilePaths());
|
|
113
85
|
const oldStateDbPaths = allPaths.filter((path) => path.startsWith('/state') && path.endsWith('.db') && path !== currentPath);
|
|
114
86
|
if (oldStateDbPaths.length === 0) {
|
|
115
|
-
yield* Effect.logDebug('
|
|
87
|
+
yield* Effect.logDebug('No old database files found');
|
|
116
88
|
return;
|
|
117
89
|
}
|
|
118
|
-
|
|
119
|
-
|
|
90
|
+
const absoluteArchiveDirName = `${opfsDirectory}/${ARCHIVE_DIR_NAME}`;
|
|
91
|
+
if (isDev === true && (yield* Opfs.exists(absoluteArchiveDirName)) === false)
|
|
92
|
+
yield* Opfs.makeDirectory(absoluteArchiveDirName);
|
|
120
93
|
for (const path of oldStateDbPaths) {
|
|
121
|
-
const fileName = path.startsWith('/') ? path.slice(1) : path;
|
|
94
|
+
const fileName = path.startsWith('/') === true ? path.slice(1) : path;
|
|
95
|
+
if (isDev === true) {
|
|
96
|
+
const archiveFileData = yield* vfs.readFilePayload(fileName);
|
|
97
|
+
const archiveFileName = `${Date.now()}-${fileName}`;
|
|
98
|
+
const archivePath = `${opfsDirectory}/archive/${archiveFileName}`;
|
|
99
|
+
const archiveData = new Uint8Array(archiveFileData);
|
|
100
|
+
// Prefer writeFile (atomic) when createWritable is available (Chrome, Firefox, Safari 26+),
|
|
101
|
+
// fall back to syncWriteFile (non-atomic) for Safari 18.x compatibility.
|
|
102
|
+
// TODO: Remove feature detection and use writeFile directly when Safari >= 26 is widely available.
|
|
103
|
+
const supportsCreateWritable = typeof FileSystemFileHandle !== 'undefined' && 'createWritable' in FileSystemFileHandle.prototype;
|
|
104
|
+
if (supportsCreateWritable === true) {
|
|
105
|
+
yield* Opfs.writeFile(archivePath, archiveData);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
yield* Opfs.syncWriteFile(archivePath, archiveData);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
122
111
|
const vfsResultCode = yield* Effect.try({
|
|
123
112
|
try: () => vfs.jDelete(fileName, 0),
|
|
124
|
-
catch: (cause) => new
|
|
113
|
+
catch: (cause) => new PersistedSqliteError({ message: `Failed to delete old state database file: ${fileName}`, cause }),
|
|
125
114
|
});
|
|
126
115
|
// 0 indicates a successful result in SQLite.
|
|
127
116
|
// See https://www.sqlite.org/c3ref/c_abort.html
|
|
128
117
|
if (vfsResultCode !== 0) {
|
|
129
|
-
return yield* new
|
|
130
|
-
|
|
131
|
-
fileName,
|
|
132
|
-
vfsResultCode,
|
|
118
|
+
return yield* new PersistedSqliteError({
|
|
119
|
+
message: `Failed to delete old state database file: ${fileName}, got result code: ${vfsResultCode}`,
|
|
133
120
|
});
|
|
134
121
|
}
|
|
135
|
-
|
|
136
|
-
yield* Effect.logDebug(`Successfully deleted old state database file: ${fileName}`);
|
|
122
|
+
yield* Effect.logDebug(`Deleted old state database file: ${fileName}`);
|
|
137
123
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
124
|
+
if (isDev === true) {
|
|
125
|
+
yield* pruneArchiveDirectory({
|
|
126
|
+
archiveDirectory: absoluteArchiveDirName,
|
|
127
|
+
keep: MAX_ARCHIVED_STATE_DBS_IN_DEV,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
const pruneArchiveDirectory = Effect.fn('@livestore/adapter-web:pruneArchiveDirectory')(function* ({ archiveDirectory, keep, }) {
|
|
132
|
+
const archiveDirHandle = yield* Opfs.getDirectoryHandleByPath(archiveDirectory);
|
|
133
|
+
const handlesStream = yield* Opfs.Opfs.values(archiveDirHandle);
|
|
134
|
+
const filesWithMetadata = yield* handlesStream.pipe(Stream.filter((handle) => handle.kind === 'file'), Stream.mapEffect((fileHandle) => Opfs.getMetadata(fileHandle)), Stream.runCollect);
|
|
135
|
+
const filesToDelete = filesWithMetadata.pipe(
|
|
136
|
+
// oxlint-disable-next-line unicorn/no-array-sort -- false positive: Effect Chunk.sort is immutable, not Array#sort (https://github.com/oxc-project/oxc/issues/19110)
|
|
137
|
+
Chunk.sort(Order.mapInput(Order.number, (entry) => entry.lastModified)), Chunk.drop(keep), Chunk.toReadonlyArray);
|
|
138
|
+
if (filesToDelete.length === 0)
|
|
139
|
+
return;
|
|
140
|
+
yield* Effect.forEach(filesToDelete, ({ name }) => Opfs.Opfs.removeEntry(archiveDirHandle, name));
|
|
141
|
+
yield* Effect.logDebug(`Pruned ${filesToDelete.length} old database file(s) from archive directory`);
|
|
142
|
+
});
|
|
150
143
|
//# 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":"AAAA,OAAO,EAAE,6BAA6B,EAAE,
|
|
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 {
|
|
2
|
-
|
|
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":"
|
|
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 {
|
|
3
|
-
export const makeShutdownChannel = (storeId) =>
|
|
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;
|
|
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) =>
|
|
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;;
|
|
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
|
|
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) =>
|
|
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,
|
|
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"}
|