@livestore/adapter-expo 0.4.0-dev.20 → 0.4.0-dev.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.d.ts +40 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -3
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +62 -5
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,12 @@ export type MakeDbOptions = {
|
|
|
4
4
|
sync?: SyncOptions;
|
|
5
5
|
storage?: {
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* The directory where the database file is located.
|
|
8
|
+
* @default SQLite.defaultDatabaseDirectory
|
|
9
|
+
*/
|
|
10
|
+
directory?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Sub-directory relative to the configured `directory` (or expo-sqlite's default directory if not specified).
|
|
8
13
|
*
|
|
9
14
|
* Example of a resulting path for `subDirectory: 'my-app'`:
|
|
10
15
|
* `/data/Containers/Data/Application/<APP_UUID>/Documents/ExponentExperienceData/@<USERNAME>/<APPNAME>/SQLite/my-app/<STORE_ID>/livestore-eventlog@3.db`
|
|
@@ -22,5 +27,39 @@ export type MakeDbOptions = {
|
|
|
22
27
|
*/
|
|
23
28
|
resetPersistence?: boolean;
|
|
24
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* Creates a persisted LiveStore adapter for Expo/React Native applications.
|
|
32
|
+
*
|
|
33
|
+
* This adapter stores data in SQLite databases on the device filesystem, providing
|
|
34
|
+
* persistence across app restarts. It supports optional sync backends for multi-device
|
|
35
|
+
* synchronization.
|
|
36
|
+
*
|
|
37
|
+
* **Requirements:**
|
|
38
|
+
* - React Native New Architecture (Fabric) must be enabled
|
|
39
|
+
* - Expo SDK 51+ recommended
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { makePersistedAdapter } from '@livestore/adapter-expo'
|
|
44
|
+
* import { makeWsSync } from '@livestore/sync-cf/client'
|
|
45
|
+
*
|
|
46
|
+
* const adapter = makePersistedAdapter({
|
|
47
|
+
* sync: {
|
|
48
|
+
* backend: makeWsSync({ url: 'wss://api.example.com/sync' }),
|
|
49
|
+
* },
|
|
50
|
+
* storage: {
|
|
51
|
+
* subDirectory: 'my-app',
|
|
52
|
+
* },
|
|
53
|
+
* })
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* // Minimal setup without sync
|
|
59
|
+
* const adapter = makePersistedAdapter()
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @see https://livestore.dev/docs/reference/adapters/expo for detailed setup guide
|
|
63
|
+
*/
|
|
25
64
|
export declare const makePersistedAdapter: (options?: MakeDbOptions) => Adapter;
|
|
26
65
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,OAAO,EACL,KAAK,OAAO,EAQZ,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,OAAO,EACL,KAAK,OAAO,EAQZ,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAA;AAgC1B,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,OAAO,CAAC,EAAE;QACR;;;WAGG;QACH,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB;;;;;WAKG;QACH,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAA;IAED,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,eAAO,MAAM,oBAAoB,GAC9B,UAAS,aAAkB,KAAG,OA6F2E,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "./polyfill.js";
|
|
2
2
|
import { ClientSessionLeaderThreadProxy, Devtools, IntentionalShutdownCause, liveStoreStorageFormatVersion, makeClientSession, UnknownError, } from '@livestore/common';
|
|
3
|
-
import { Eventlog, LeaderThreadCtx, makeLeaderThreadLayer } from '@livestore/common/leader-thread';
|
|
3
|
+
import { Eventlog, LeaderThreadCtx, makeLeaderThreadLayer, streamEventsWithSyncState, } from '@livestore/common/leader-thread';
|
|
4
4
|
import { LiveStoreEvent } from '@livestore/common/schema';
|
|
5
5
|
import { shouldNeverHappen } from '@livestore/utils';
|
|
6
6
|
import { Effect, Exit, FetchHttpClient, Fiber, Layer, Queue, Schedule, Stream, SubscriptionRef, } from '@livestore/utils/effect';
|
|
@@ -17,6 +17,40 @@ const IS_NEW_ARCH =
|
|
|
17
17
|
Boolean(globalThis.nativeFabricUIManager) ||
|
|
18
18
|
// TurboModule proxy – indicates new arch TurboModules
|
|
19
19
|
Boolean(globalThis.__turboModuleProxy);
|
|
20
|
+
/**
|
|
21
|
+
* Creates a persisted LiveStore adapter for Expo/React Native applications.
|
|
22
|
+
*
|
|
23
|
+
* This adapter stores data in SQLite databases on the device filesystem, providing
|
|
24
|
+
* persistence across app restarts. It supports optional sync backends for multi-device
|
|
25
|
+
* synchronization.
|
|
26
|
+
*
|
|
27
|
+
* **Requirements:**
|
|
28
|
+
* - React Native New Architecture (Fabric) must be enabled
|
|
29
|
+
* - Expo SDK 51+ recommended
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* import { makePersistedAdapter } from '@livestore/adapter-expo'
|
|
34
|
+
* import { makeWsSync } from '@livestore/sync-cf/client'
|
|
35
|
+
*
|
|
36
|
+
* const adapter = makePersistedAdapter({
|
|
37
|
+
* sync: {
|
|
38
|
+
* backend: makeWsSync({ url: 'wss://api.example.com/sync' }),
|
|
39
|
+
* },
|
|
40
|
+
* storage: {
|
|
41
|
+
* subDirectory: 'my-app',
|
|
42
|
+
* },
|
|
43
|
+
* })
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* // Minimal setup without sync
|
|
49
|
+
* const adapter = makePersistedAdapter()
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @see https://livestore.dev/docs/reference/adapters/expo for detailed setup guide
|
|
53
|
+
*/
|
|
20
54
|
// TODO refactor with leader-thread code from `@livestore/common/leader-thread`
|
|
21
55
|
export const makePersistedAdapter = (options = {}) => (adapterArgs) => Effect.gen(function* () {
|
|
22
56
|
if (IS_NEW_ARCH === false) {
|
|
@@ -119,8 +153,17 @@ const makeLeaderThread = ({ storeId, clientId, schema, makeSqliteDb, syncOptions
|
|
|
119
153
|
push: (batch) => syncProcessor
|
|
120
154
|
.push(batch.map((item) => new LiveStoreEvent.Client.EncodedWithMeta(item)), { waitForProcessing: true })
|
|
121
155
|
.pipe(Effect.provide(layer), Effect.scoped),
|
|
156
|
+
stream: (options) => streamEventsWithSyncState({
|
|
157
|
+
dbEventlog,
|
|
158
|
+
syncState: syncProcessor.syncState,
|
|
159
|
+
options,
|
|
160
|
+
}),
|
|
161
|
+
},
|
|
162
|
+
initialState: {
|
|
163
|
+
leaderHead: initialLeaderHead,
|
|
164
|
+
migrationsReport: initialState.migrationsReport,
|
|
165
|
+
storageMode: 'persisted',
|
|
122
166
|
},
|
|
123
|
-
initialState: { leaderHead: initialLeaderHead, migrationsReport: initialState.migrationsReport },
|
|
124
167
|
export: Effect.sync(() => db.export()),
|
|
125
168
|
getEventlogData: Effect.sync(() => dbEventlog.export()),
|
|
126
169
|
syncState: syncProcessor.syncState,
|
|
@@ -134,7 +177,8 @@ const makeLeaderThread = ({ storeId, clientId, schema, makeSqliteDb, syncOptions
|
|
|
134
177
|
const resolveExpoPersistencePaths = ({ storeId, storage, schema, }) => {
|
|
135
178
|
const subDirectory = storage?.subDirectory ? `${storage.subDirectory.replace(/\/$/, '')}/` : '';
|
|
136
179
|
const pathJoin = (...paths) => paths.join('/').replaceAll(/\/+/g, '/');
|
|
137
|
-
const
|
|
180
|
+
const directoryBasePath = storage?.directory ?? SQLite.defaultDatabaseDirectory;
|
|
181
|
+
const directory = pathJoin(directoryBasePath, subDirectory, storeId);
|
|
138
182
|
const schemaHashSuffix = schema.state.sqlite.migrations.strategy === 'manual' ? 'fixed' : schema.state.sqlite.hash.toString();
|
|
139
183
|
const stateDatabaseName = `livestore-${schemaHashSuffix}@${liveStoreStorageFormatVersion}.db`;
|
|
140
184
|
const eventlogDatabaseName = `livestore-eventlog@${liveStoreStorageFormatVersion}.db`;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,OAAO,EAGL,8BAA8B,EAC9B,QAAQ,EACR,wBAAwB,EAExB,6BAA6B,EAC7B,iBAAiB,EAEjB,YAAY,GACb,MAAM,mBAAmB,CAAA;AAE1B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/adapter-expo",
|
|
3
|
-
"version": "0.4.0-dev.
|
|
3
|
+
"version": "0.4.0-dev.22",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"exports": {
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@opentelemetry/api": "1.9.0",
|
|
11
|
-
"@livestore/common": "0.4.0-dev.
|
|
12
|
-
"@livestore/
|
|
13
|
-
"@livestore/
|
|
11
|
+
"@livestore/common": "0.4.0-dev.22",
|
|
12
|
+
"@livestore/webmesh": "0.4.0-dev.22",
|
|
13
|
+
"@livestore/utils": "0.4.0-dev.22"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"expo-application": "^7.0.7",
|
package/src/index.ts
CHANGED
|
@@ -13,7 +13,12 @@ import {
|
|
|
13
13
|
UnknownError,
|
|
14
14
|
} from '@livestore/common'
|
|
15
15
|
import type { DevtoolsOptions, LeaderSqliteDb } from '@livestore/common/leader-thread'
|
|
16
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
Eventlog,
|
|
18
|
+
LeaderThreadCtx,
|
|
19
|
+
makeLeaderThreadLayer,
|
|
20
|
+
streamEventsWithSyncState,
|
|
21
|
+
} from '@livestore/common/leader-thread'
|
|
17
22
|
import type { LiveStoreSchema } from '@livestore/common/schema'
|
|
18
23
|
import { LiveStoreEvent } from '@livestore/common/schema'
|
|
19
24
|
import { shouldNeverHappen } from '@livestore/utils'
|
|
@@ -42,7 +47,12 @@ export type MakeDbOptions = {
|
|
|
42
47
|
sync?: SyncOptions
|
|
43
48
|
storage?: {
|
|
44
49
|
/**
|
|
45
|
-
*
|
|
50
|
+
* The directory where the database file is located.
|
|
51
|
+
* @default SQLite.defaultDatabaseDirectory
|
|
52
|
+
*/
|
|
53
|
+
directory?: string
|
|
54
|
+
/**
|
|
55
|
+
* Sub-directory relative to the configured `directory` (or expo-sqlite's default directory if not specified).
|
|
46
56
|
*
|
|
47
57
|
* Example of a resulting path for `subDirectory: 'my-app'`:
|
|
48
58
|
* `/data/Containers/Data/Application/<APP_UUID>/Documents/ExponentExperienceData/@<USERNAME>/<APPNAME>/SQLite/my-app/<STORE_ID>/livestore-eventlog@3.db`
|
|
@@ -70,6 +80,40 @@ const IS_NEW_ARCH =
|
|
|
70
80
|
// TurboModule proxy – indicates new arch TurboModules
|
|
71
81
|
Boolean((globalThis as any).__turboModuleProxy)
|
|
72
82
|
|
|
83
|
+
/**
|
|
84
|
+
* Creates a persisted LiveStore adapter for Expo/React Native applications.
|
|
85
|
+
*
|
|
86
|
+
* This adapter stores data in SQLite databases on the device filesystem, providing
|
|
87
|
+
* persistence across app restarts. It supports optional sync backends for multi-device
|
|
88
|
+
* synchronization.
|
|
89
|
+
*
|
|
90
|
+
* **Requirements:**
|
|
91
|
+
* - React Native New Architecture (Fabric) must be enabled
|
|
92
|
+
* - Expo SDK 51+ recommended
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```ts
|
|
96
|
+
* import { makePersistedAdapter } from '@livestore/adapter-expo'
|
|
97
|
+
* import { makeWsSync } from '@livestore/sync-cf/client'
|
|
98
|
+
*
|
|
99
|
+
* const adapter = makePersistedAdapter({
|
|
100
|
+
* sync: {
|
|
101
|
+
* backend: makeWsSync({ url: 'wss://api.example.com/sync' }),
|
|
102
|
+
* },
|
|
103
|
+
* storage: {
|
|
104
|
+
* subDirectory: 'my-app',
|
|
105
|
+
* },
|
|
106
|
+
* })
|
|
107
|
+
* ```
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* // Minimal setup without sync
|
|
112
|
+
* const adapter = makePersistedAdapter()
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
115
|
+
* @see https://livestore.dev/docs/reference/adapters/expo for detailed setup guide
|
|
116
|
+
*/
|
|
73
117
|
// TODO refactor with leader-thread code from `@livestore/common/leader-thread`
|
|
74
118
|
export const makePersistedAdapter =
|
|
75
119
|
(options: MakeDbOptions = {}): Adapter =>
|
|
@@ -186,6 +230,7 @@ const makeLeaderThread = ({
|
|
|
186
230
|
makeSqliteDb: MakeExpoSqliteDb
|
|
187
231
|
syncOptions: SyncOptions | undefined
|
|
188
232
|
storage: {
|
|
233
|
+
directory?: string
|
|
189
234
|
subDirectory?: string
|
|
190
235
|
}
|
|
191
236
|
devtoolsEnabled: boolean
|
|
@@ -266,8 +311,18 @@ const makeLeaderThread = ({
|
|
|
266
311
|
{ waitForProcessing: true },
|
|
267
312
|
)
|
|
268
313
|
.pipe(Effect.provide(layer), Effect.scoped),
|
|
314
|
+
stream: (options) =>
|
|
315
|
+
streamEventsWithSyncState({
|
|
316
|
+
dbEventlog,
|
|
317
|
+
syncState: syncProcessor.syncState,
|
|
318
|
+
options,
|
|
319
|
+
}),
|
|
320
|
+
},
|
|
321
|
+
initialState: {
|
|
322
|
+
leaderHead: initialLeaderHead,
|
|
323
|
+
migrationsReport: initialState.migrationsReport,
|
|
324
|
+
storageMode: 'persisted',
|
|
269
325
|
},
|
|
270
|
-
initialState: { leaderHead: initialLeaderHead, migrationsReport: initialState.migrationsReport },
|
|
271
326
|
export: Effect.sync(() => db.export()),
|
|
272
327
|
getEventlogData: Effect.sync(() => dbEventlog.export()),
|
|
273
328
|
syncState: syncProcessor.syncState,
|
|
@@ -287,12 +342,14 @@ const resolveExpoPersistencePaths = ({
|
|
|
287
342
|
schema,
|
|
288
343
|
}: {
|
|
289
344
|
storeId: string
|
|
290
|
-
storage: { subDirectory?: string } | undefined
|
|
291
345
|
schema: LiveStoreSchema
|
|
346
|
+
storage: { directory?: string; subDirectory?: string } | undefined
|
|
292
347
|
}) => {
|
|
293
348
|
const subDirectory = storage?.subDirectory ? `${storage.subDirectory.replace(/\/$/, '')}/` : ''
|
|
294
349
|
const pathJoin = (...paths: string[]) => paths.join('/').replaceAll(/\/+/g, '/')
|
|
295
|
-
const
|
|
350
|
+
const directoryBasePath = storage?.directory ?? SQLite.defaultDatabaseDirectory
|
|
351
|
+
|
|
352
|
+
const directory = pathJoin(directoryBasePath, subDirectory, storeId)
|
|
296
353
|
|
|
297
354
|
const schemaHashSuffix =
|
|
298
355
|
schema.state.sqlite.migrations.strategy === 'manual' ? 'fixed' : schema.state.sqlite.hash.toString()
|