@livestore/adapter-expo 0.3.0-dev.23 → 0.3.0-dev.24
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 +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/make-sqlite-db.d.ts +2 -2
- package/dist/make-sqlite-db.d.ts.map +1 -1
- package/dist/make-sqlite-db.js +30 -41
- package/dist/make-sqlite-db.js.map +1 -1
- package/dist/polyfill.d.ts +7 -0
- package/dist/polyfill.d.ts.map +1 -0
- package/dist/polyfill.js +13 -0
- package/dist/polyfill.js.map +1 -0
- package/dist/polyfills.d.ts +7 -0
- package/dist/polyfills.d.ts.map +1 -0
- package/dist/polyfills.js +13 -0
- package/dist/polyfills.js.map +1 -0
- package/package.json +7 -7
- package/src/index.ts +20 -3
- package/src/make-sqlite-db.ts +34 -43
- package/src/polyfill.ts +12 -0
- package/tmp/pack.tgz +0 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import './polyfill.js';
|
|
1
2
|
import type { Adapter, SyncOptions } from '@livestore/common';
|
|
2
3
|
export type MakeDbOptions = {
|
|
3
4
|
sync?: SyncOptions;
|
|
@@ -15,5 +16,8 @@ export type MakeDbOptions = {
|
|
|
15
16
|
/** @default 'expo' */
|
|
16
17
|
sessionId?: string;
|
|
17
18
|
};
|
|
18
|
-
|
|
19
|
+
declare global {
|
|
20
|
+
var RN$Bridgeless: boolean | undefined;
|
|
21
|
+
}
|
|
22
|
+
export declare const makePersistedAdapter: (options?: MakeDbOptions) => Adapter;
|
|
19
23
|
//# 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,KAAK,EACV,OAAO,EAKP,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAgB1B,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,OAAO,CAAC,EAAE;QACR;;;;;WAKG;QACH,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAA;IAED,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,OAAO,KAAK,EACV,OAAO,EAKP,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAgB1B,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,OAAO,CAAC,EAAE;QACR;;;;;WAKG;QACH,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAA;IAED,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,aAAa,EAAE,OAAO,GAAG,SAAS,CAAA;CACvC;AAKD,eAAO,MAAM,oBAAoB,GAC9B,UAAS,aAAkB,KAAG,OAyF5B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import './polyfill.js';
|
|
1
2
|
import { Devtools, liveStoreStorageFormatVersion, UnexpectedError } from '@livestore/common';
|
|
2
3
|
import { getClientHeadFromDb, LeaderThreadCtx, makeLeaderThreadLayer } from '@livestore/common/leader-thread';
|
|
3
4
|
import { MutationEvent } from '@livestore/common/schema';
|
|
@@ -6,8 +7,14 @@ import { Cause, Effect, FetchHttpClient, Fiber, Layer, Queue, Stream, Subscripti
|
|
|
6
7
|
import * as SQLite from 'expo-sqlite';
|
|
7
8
|
import { makeSqliteDb } from './make-sqlite-db.js';
|
|
8
9
|
import { makeShutdownChannel } from './shutdown-channel.js';
|
|
10
|
+
const IS_NEW_ARCH = globalThis.RN$Bridgeless === true;
|
|
9
11
|
// TODO refactor with leader-thread code from `@livestore/common/leader-thread`
|
|
10
|
-
export const
|
|
12
|
+
export const makePersistedAdapter = (options = {}) => ({ schema, connectDevtoolsToStore, shutdown, devtoolsEnabled, storeId, bootStatusQueue, syncPayload }) => Effect.gen(function* () {
|
|
13
|
+
if (IS_NEW_ARCH === false) {
|
|
14
|
+
return yield* UnexpectedError.make({
|
|
15
|
+
cause: new Error('The LiveStore Expo adapter requires the new React Native architecture (aka Fabric). See https://docs.expo.dev/guides/new-architecture'),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
11
18
|
const { storage, clientId = 'expo', sessionId = 'expo', sync: syncOptions } = options;
|
|
12
19
|
yield* Queue.offer(bootStatusQueue, { stage: 'loading' });
|
|
13
20
|
const lockStatus = yield* SubscriptionRef.make('has-lock');
|
|
@@ -70,8 +77,8 @@ const makeLeaderThread = ({ storeId, clientId, sessionId, schema, makeSqliteDb,
|
|
|
70
77
|
const directory = pathJoin(SQLite.defaultDatabaseDirectory, subDirectory, storeId);
|
|
71
78
|
const readModelDatabaseName = `${'livestore-'}${schema.hash}@${liveStoreStorageFormatVersion}.db`;
|
|
72
79
|
const dbMutationLogPath = `${'livestore-'}mutationlog@${liveStoreStorageFormatVersion}.db`;
|
|
73
|
-
const dbReadModel = yield* makeSqliteDb({ _tag: '
|
|
74
|
-
const dbMutationLog = yield* makeSqliteDb({ _tag: '
|
|
80
|
+
const dbReadModel = yield* makeSqliteDb({ _tag: 'file', databaseName: readModelDatabaseName, directory });
|
|
81
|
+
const dbMutationLog = yield* makeSqliteDb({ _tag: 'file', databaseName: dbMutationLogPath, directory });
|
|
75
82
|
const devtoolsOptions = yield* makeDevtoolsOptions({
|
|
76
83
|
devtoolsEnabled,
|
|
77
84
|
dbReadModel,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/make-sqlite-db.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { type MakeSqliteDb, type PersistenceInfo } from '@livestore/common';
|
|
2
2
|
type Metadata = {
|
|
3
|
-
_tag: '
|
|
3
|
+
_tag: 'file';
|
|
4
4
|
dbPointer: number;
|
|
5
5
|
persistenceInfo: PersistenceInfo;
|
|
6
6
|
input: ExpoDatabaseInput;
|
|
7
7
|
};
|
|
8
8
|
type ExpoDatabaseInput = {
|
|
9
|
-
_tag: '
|
|
9
|
+
_tag: 'file';
|
|
10
10
|
databaseName: string;
|
|
11
11
|
directory: string;
|
|
12
12
|
} | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-sqlite-db.d.ts","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,eAAe,EAIrB,MAAM,mBAAmB,CAAA;AAS1B,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,eAAe,CAAA;IAChC,KAAK,EAAE,iBAAiB,CAAA;CACzB,CAAA;AAED,KAAK,iBAAiB,GAClB;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB,GACD;IACE,IAAI,EAAE,WAAW,CAAA;CAClB,CAAA;AAEL,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,QAAQ,EAAE,iBAAiB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,CAAC,CAAA;AAErG,eAAO,MAAM,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"make-sqlite-db.d.ts","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,eAAe,EAIrB,MAAM,mBAAmB,CAAA;AAS1B,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,eAAe,CAAA;IAChC,KAAK,EAAE,iBAAiB,CAAA;CACzB,CAAA;AAED,KAAK,iBAAiB,GAClB;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB,GACD;IACE,IAAI,EAAE,WAAW,CAAA;CAClB,CAAA;AAEL,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,QAAQ,EAAE,iBAAiB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,CAAC,CAAA;AAErG,eAAO,MAAM,YAAY,EAAE,gBA8BvB,CAAA"}
|
package/dist/make-sqlite-db.js
CHANGED
|
@@ -1,33 +1,28 @@
|
|
|
1
1
|
import { SqliteError, } from '@livestore/common';
|
|
2
2
|
import { shouldNeverHappen } from '@livestore/utils';
|
|
3
3
|
import { Effect } from '@livestore/utils/effect';
|
|
4
|
-
// TODO remove `expo-file-system` dependency once expo-sqlite supports `import`
|
|
5
|
-
// @ts-expect-error package misses `exports`
|
|
6
|
-
import * as ExpoFs from 'expo-file-system/src/next';
|
|
7
4
|
// import * as ExpoFs from 'expo-file-system'
|
|
8
5
|
import * as SQLite from 'expo-sqlite';
|
|
9
6
|
export const makeSqliteDb = (input) => Effect.gen(function* () {
|
|
10
7
|
// console.log('makeSqliteDb', input)
|
|
11
8
|
if (input._tag === 'in-memory') {
|
|
12
|
-
|
|
9
|
+
const db = SQLite.openDatabaseSync(':memory:');
|
|
13
10
|
return makeSqliteDb_({
|
|
14
|
-
|
|
15
|
-
makeDb: () => SQLite.openDatabaseSync(':memory:'),
|
|
11
|
+
db,
|
|
16
12
|
metadata: {
|
|
17
|
-
_tag: '
|
|
13
|
+
_tag: 'file',
|
|
18
14
|
dbPointer: 0,
|
|
19
15
|
persistenceInfo: { fileName: ':memory:' },
|
|
20
16
|
input,
|
|
21
17
|
},
|
|
22
18
|
});
|
|
23
19
|
}
|
|
24
|
-
if (input._tag === '
|
|
25
|
-
|
|
20
|
+
if (input._tag === 'file') {
|
|
21
|
+
const db = SQLite.openDatabaseSync(input.databaseName, {}, input.directory);
|
|
26
22
|
return makeSqliteDb_({
|
|
27
|
-
|
|
28
|
-
makeDb: () => SQLite.openDatabaseSync(input.databaseName, {}, input.directory),
|
|
23
|
+
db,
|
|
29
24
|
metadata: {
|
|
30
|
-
_tag: '
|
|
25
|
+
_tag: 'file',
|
|
31
26
|
dbPointer: 0,
|
|
32
27
|
persistenceInfo: { fileName: `${input.directory}/${input.databaseName}` },
|
|
33
28
|
input,
|
|
@@ -35,17 +30,13 @@ export const makeSqliteDb = (input) => Effect.gen(function* () {
|
|
|
35
30
|
});
|
|
36
31
|
}
|
|
37
32
|
});
|
|
38
|
-
const makeSqliteDb_ = ({
|
|
39
|
-
// db,
|
|
40
|
-
makeDb, metadata, }) => {
|
|
33
|
+
const makeSqliteDb_ = ({ db, metadata, }) => {
|
|
41
34
|
const stmts = new Set();
|
|
42
|
-
const dbRef = { current: makeDb(), count: 0 };
|
|
43
35
|
const sqliteDb = {
|
|
44
36
|
metadata,
|
|
45
37
|
_tag: 'SqliteDb',
|
|
46
38
|
prepare: (queryStr) => {
|
|
47
39
|
try {
|
|
48
|
-
const db = dbRef.current;
|
|
49
40
|
const dbStmt = db.prepareSync(queryStr);
|
|
50
41
|
const stmt = {
|
|
51
42
|
execute: (bindValues) => {
|
|
@@ -78,7 +69,6 @@ makeDb, metadata, }) => {
|
|
|
78
69
|
}
|
|
79
70
|
},
|
|
80
71
|
execute: (queryStr, bindValues) => {
|
|
81
|
-
const db = dbRef.current;
|
|
82
72
|
const stmt = db.prepareSync(queryStr);
|
|
83
73
|
try {
|
|
84
74
|
const res = stmt.executeSync(bindValues ?? []);
|
|
@@ -89,7 +79,6 @@ makeDb, metadata, }) => {
|
|
|
89
79
|
}
|
|
90
80
|
},
|
|
91
81
|
export: () => {
|
|
92
|
-
const db = dbRef.current;
|
|
93
82
|
return db.serializeSync();
|
|
94
83
|
},
|
|
95
84
|
select: (queryStr, bindValues) => {
|
|
@@ -99,14 +88,13 @@ makeDb, metadata, }) => {
|
|
|
99
88
|
return res;
|
|
100
89
|
},
|
|
101
90
|
destroy: () => {
|
|
102
|
-
|
|
103
|
-
|
|
91
|
+
sqliteDb.close();
|
|
92
|
+
if (metadata.input._tag === 'file') {
|
|
104
93
|
SQLite.deleteDatabaseSync(metadata.input.databaseName, metadata.input.directory);
|
|
105
94
|
}
|
|
106
95
|
},
|
|
107
96
|
close: () => {
|
|
108
97
|
try {
|
|
109
|
-
const db = dbRef.current;
|
|
110
98
|
for (const stmt of stmts) {
|
|
111
99
|
stmt.finalize();
|
|
112
100
|
}
|
|
@@ -116,7 +104,7 @@ makeDb, metadata, }) => {
|
|
|
116
104
|
catch (cause) {
|
|
117
105
|
throw new SqliteError({
|
|
118
106
|
cause,
|
|
119
|
-
note: `Error closing database ${metadata.input._tag === '
|
|
107
|
+
note: `Error closing database ${metadata.input._tag === 'file' ? metadata.input.databaseName : 'in-memory'}`,
|
|
120
108
|
});
|
|
121
109
|
// console.error('Error closing database', metadata.input, e, dbCount)
|
|
122
110
|
}
|
|
@@ -125,36 +113,37 @@ makeDb, metadata, }) => {
|
|
|
125
113
|
if (!(data instanceof Uint8Array)) {
|
|
126
114
|
throw new TypeError('importing from an existing database is not yet supported in expo');
|
|
127
115
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
stmts.clear();
|
|
133
|
-
prevDb.closeSync();
|
|
134
|
-
if (metadata.input._tag === 'expo') {
|
|
135
|
-
const file = new ExpoFs.File(metadata.input.directory, metadata.input.databaseName);
|
|
136
|
-
file.write(data);
|
|
137
|
-
dbRef.count++;
|
|
138
|
-
dbRef.current = makeDb();
|
|
116
|
+
try {
|
|
117
|
+
const tmpDb = SQLite.deserializeDatabaseSync(data);
|
|
118
|
+
SQLite.backupDatabaseSync({ sourceDatabase: tmpDb, destDatabase: db });
|
|
119
|
+
tmpDb.closeSync();
|
|
139
120
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
121
|
+
catch (cause) {
|
|
122
|
+
throw new SqliteError({
|
|
123
|
+
cause,
|
|
124
|
+
note: `Error importing database ${metadata.input._tag === 'file' ? metadata.input.databaseName : 'in-memory'}`,
|
|
125
|
+
});
|
|
143
126
|
}
|
|
144
127
|
},
|
|
145
128
|
session: () => {
|
|
129
|
+
const session = db.createSessionSync();
|
|
130
|
+
session.attachSync(null);
|
|
146
131
|
return {
|
|
147
|
-
changeset: () =>
|
|
148
|
-
finish: () =>
|
|
132
|
+
changeset: () => session.createChangesetSync(),
|
|
133
|
+
finish: () => session.closeSync(),
|
|
149
134
|
};
|
|
150
135
|
},
|
|
151
136
|
makeChangeset: (data) => {
|
|
137
|
+
const session = db.createSessionSync();
|
|
138
|
+
// NOTE we're not actually attaching this particular session as we only need it to create and
|
|
139
|
+
// apply an inverted changeset
|
|
152
140
|
return {
|
|
153
141
|
invert: () => {
|
|
154
|
-
|
|
142
|
+
const inverted = session.invertChangesetSync(data);
|
|
143
|
+
return sqliteDb.makeChangeset(inverted);
|
|
155
144
|
},
|
|
156
145
|
apply: () => {
|
|
157
|
-
|
|
146
|
+
session.applyChangesetSync(data);
|
|
158
147
|
},
|
|
159
148
|
};
|
|
160
149
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-sqlite-db.js","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"make-sqlite-db.js","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../src/polyfill.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/dist/polyfill.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current limitations in Expo/React Native/Hermes that need workarounds:
|
|
3
|
+
*
|
|
4
|
+
* - No support for `Array.toSorted`: https://github.com/facebook/hermes/pull/1298
|
|
5
|
+
*/
|
|
6
|
+
// eslint-disable-next-line unicorn/no-typeof-undefined
|
|
7
|
+
if (typeof Array.prototype.toSorted === 'undefined') {
|
|
8
|
+
Array.prototype.toSorted = function (compareFn) {
|
|
9
|
+
return this.sort(compareFn);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=polyfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfill.js","sourceRoot":"","sources":["../src/polyfill.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,uDAAuD;AACvD,IAAI,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;IACpD,KAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,UAAU,SAAS;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC7B,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfills.d.ts","sourceRoot":"","sources":["../src/polyfills.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current limitations in Expo/React Native/Hermes that need workarounds:
|
|
3
|
+
*
|
|
4
|
+
* - No support for `Array.toSorted`: https://github.com/facebook/hermes/pull/1298
|
|
5
|
+
*/
|
|
6
|
+
// eslint-disable-next-line unicorn/no-typeof-undefined
|
|
7
|
+
if (typeof Array.prototype.toSorted === 'undefined') {
|
|
8
|
+
Array.prototype.toSorted = function (compareFn) {
|
|
9
|
+
return this.sort(compareFn);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=polyfills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfills.js","sourceRoot":"","sources":["../src/polyfills.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,uDAAuD;AACvD,IAAI,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;IACpD,KAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,UAAU,SAAS;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC7B,CAAC,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/adapter-expo",
|
|
3
|
-
"version": "0.3.0-dev.
|
|
3
|
+
"version": "0.3.0-dev.24",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"exports": {
|
|
@@ -12,18 +12,18 @@
|
|
|
12
12
|
"types": "./dist/index.d.ts",
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@opentelemetry/api": "1.9.0",
|
|
15
|
-
"@livestore/common": "0.3.0-dev.
|
|
16
|
-
"@livestore/devtools-expo-common": "0.3.0-dev.
|
|
17
|
-
"@livestore/utils": "0.3.0-dev.
|
|
18
|
-
"@livestore/webmesh": "0.3.0-dev.
|
|
15
|
+
"@livestore/common": "0.3.0-dev.24",
|
|
16
|
+
"@livestore/devtools-expo-common": "0.3.0-dev.24",
|
|
17
|
+
"@livestore/utils": "0.3.0-dev.24",
|
|
18
|
+
"@livestore/webmesh": "0.3.0-dev.24"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"expo-file-system": "*",
|
|
22
|
-
"expo-sqlite": "^15.
|
|
22
|
+
"expo-sqlite": "^15.2.0-canary-20250325-0a15ab6"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"expo-file-system": "*",
|
|
26
|
-
"expo-sqlite": "~15.
|
|
26
|
+
"expo-sqlite": "~15.2.0-canary-20250325-0a15ab6"
|
|
27
27
|
},
|
|
28
28
|
"publishConfig": {
|
|
29
29
|
"access": "public"
|
package/src/index.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import './polyfill.js'
|
|
2
|
+
|
|
1
3
|
import type {
|
|
2
4
|
Adapter,
|
|
3
5
|
BootStatus,
|
|
@@ -39,11 +41,26 @@ export type MakeDbOptions = {
|
|
|
39
41
|
sessionId?: string
|
|
40
42
|
}
|
|
41
43
|
|
|
44
|
+
declare global {
|
|
45
|
+
// eslint-disable-next-line no-var
|
|
46
|
+
var RN$Bridgeless: boolean | undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const IS_NEW_ARCH = globalThis.RN$Bridgeless === true
|
|
50
|
+
|
|
42
51
|
// TODO refactor with leader-thread code from `@livestore/common/leader-thread`
|
|
43
|
-
export const
|
|
52
|
+
export const makePersistedAdapter =
|
|
44
53
|
(options: MakeDbOptions = {}): Adapter =>
|
|
45
54
|
({ schema, connectDevtoolsToStore, shutdown, devtoolsEnabled, storeId, bootStatusQueue, syncPayload }) =>
|
|
46
55
|
Effect.gen(function* () {
|
|
56
|
+
if (IS_NEW_ARCH === false) {
|
|
57
|
+
return yield* UnexpectedError.make({
|
|
58
|
+
cause: new Error(
|
|
59
|
+
'The LiveStore Expo adapter requires the new React Native architecture (aka Fabric). See https://docs.expo.dev/guides/new-architecture',
|
|
60
|
+
),
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
|
|
47
64
|
const { storage, clientId = 'expo', sessionId = 'expo', sync: syncOptions } = options
|
|
48
65
|
|
|
49
66
|
yield* Queue.offer(bootStatusQueue, { stage: 'loading' })
|
|
@@ -159,8 +176,8 @@ const makeLeaderThread = ({
|
|
|
159
176
|
const readModelDatabaseName = `${'livestore-'}${schema.hash}@${liveStoreStorageFormatVersion}.db`
|
|
160
177
|
const dbMutationLogPath = `${'livestore-'}mutationlog@${liveStoreStorageFormatVersion}.db`
|
|
161
178
|
|
|
162
|
-
const dbReadModel = yield* makeSqliteDb({ _tag: '
|
|
163
|
-
const dbMutationLog = yield* makeSqliteDb({ _tag: '
|
|
179
|
+
const dbReadModel = yield* makeSqliteDb({ _tag: 'file', databaseName: readModelDatabaseName, directory })
|
|
180
|
+
const dbMutationLog = yield* makeSqliteDb({ _tag: 'file', databaseName: dbMutationLogPath, directory })
|
|
164
181
|
|
|
165
182
|
const devtoolsOptions = yield* makeDevtoolsOptions({
|
|
166
183
|
devtoolsEnabled,
|
package/src/make-sqlite-db.ts
CHANGED
|
@@ -14,7 +14,7 @@ import * as ExpoFs from 'expo-file-system/src/next'
|
|
|
14
14
|
import * as SQLite from 'expo-sqlite'
|
|
15
15
|
|
|
16
16
|
type Metadata = {
|
|
17
|
-
_tag: '
|
|
17
|
+
_tag: 'file'
|
|
18
18
|
dbPointer: number
|
|
19
19
|
persistenceInfo: PersistenceInfo
|
|
20
20
|
input: ExpoDatabaseInput
|
|
@@ -22,7 +22,7 @@ type Metadata = {
|
|
|
22
22
|
|
|
23
23
|
type ExpoDatabaseInput =
|
|
24
24
|
| {
|
|
25
|
-
_tag: '
|
|
25
|
+
_tag: 'file'
|
|
26
26
|
databaseName: string
|
|
27
27
|
directory: string
|
|
28
28
|
}
|
|
@@ -36,13 +36,12 @@ export const makeSqliteDb: MakeExpoSqliteDb = (input: ExpoDatabaseInput) =>
|
|
|
36
36
|
Effect.gen(function* () {
|
|
37
37
|
// console.log('makeSqliteDb', input)
|
|
38
38
|
if (input._tag === 'in-memory') {
|
|
39
|
-
|
|
39
|
+
const db = SQLite.openDatabaseSync(':memory:')
|
|
40
40
|
|
|
41
41
|
return makeSqliteDb_({
|
|
42
|
-
|
|
43
|
-
makeDb: () => SQLite.openDatabaseSync(':memory:'),
|
|
42
|
+
db,
|
|
44
43
|
metadata: {
|
|
45
|
-
_tag: '
|
|
44
|
+
_tag: 'file',
|
|
46
45
|
dbPointer: 0,
|
|
47
46
|
persistenceInfo: { fileName: ':memory:' },
|
|
48
47
|
input,
|
|
@@ -50,14 +49,13 @@ export const makeSqliteDb: MakeExpoSqliteDb = (input: ExpoDatabaseInput) =>
|
|
|
50
49
|
}) as any
|
|
51
50
|
}
|
|
52
51
|
|
|
53
|
-
if (input._tag === '
|
|
54
|
-
|
|
52
|
+
if (input._tag === 'file') {
|
|
53
|
+
const db = SQLite.openDatabaseSync(input.databaseName, {}, input.directory)
|
|
55
54
|
|
|
56
55
|
return makeSqliteDb_({
|
|
57
|
-
|
|
58
|
-
makeDb: () => SQLite.openDatabaseSync(input.databaseName, {}, input.directory),
|
|
56
|
+
db,
|
|
59
57
|
metadata: {
|
|
60
|
-
_tag: '
|
|
58
|
+
_tag: 'file',
|
|
61
59
|
dbPointer: 0,
|
|
62
60
|
persistenceInfo: { fileName: `${input.directory}/${input.databaseName}` },
|
|
63
61
|
input,
|
|
@@ -67,23 +65,19 @@ export const makeSqliteDb: MakeExpoSqliteDb = (input: ExpoDatabaseInput) =>
|
|
|
67
65
|
})
|
|
68
66
|
|
|
69
67
|
const makeSqliteDb_ = <TMetadata extends Metadata>({
|
|
70
|
-
|
|
71
|
-
makeDb,
|
|
68
|
+
db,
|
|
72
69
|
metadata,
|
|
73
70
|
}: {
|
|
74
|
-
|
|
75
|
-
makeDb: () => SQLite.SQLiteDatabase
|
|
71
|
+
db: SQLite.SQLiteDatabase
|
|
76
72
|
metadata: TMetadata
|
|
77
73
|
}): SqliteDb<TMetadata> => {
|
|
78
74
|
const stmts: Set<PreparedStatement> = new Set()
|
|
79
|
-
const dbRef = { current: makeDb(), count: 0 }
|
|
80
75
|
|
|
81
76
|
const sqliteDb: SqliteDb<TMetadata> = {
|
|
82
77
|
metadata,
|
|
83
78
|
_tag: 'SqliteDb',
|
|
84
79
|
prepare: (queryStr) => {
|
|
85
80
|
try {
|
|
86
|
-
const db = dbRef.current
|
|
87
81
|
const dbStmt = db.prepareSync(queryStr)
|
|
88
82
|
const stmt = {
|
|
89
83
|
execute: (bindValues) => {
|
|
@@ -114,7 +108,6 @@ const makeSqliteDb_ = <TMetadata extends Metadata>({
|
|
|
114
108
|
}
|
|
115
109
|
},
|
|
116
110
|
execute: (queryStr, bindValues) => {
|
|
117
|
-
const db = dbRef.current
|
|
118
111
|
const stmt = db.prepareSync(queryStr)
|
|
119
112
|
try {
|
|
120
113
|
const res = stmt.executeSync(bindValues ?? ([] as any))
|
|
@@ -124,7 +117,6 @@ const makeSqliteDb_ = <TMetadata extends Metadata>({
|
|
|
124
117
|
}
|
|
125
118
|
},
|
|
126
119
|
export: () => {
|
|
127
|
-
const db = dbRef.current
|
|
128
120
|
return db.serializeSync()
|
|
129
121
|
},
|
|
130
122
|
select: (queryStr, bindValues) => {
|
|
@@ -134,14 +126,14 @@ const makeSqliteDb_ = <TMetadata extends Metadata>({
|
|
|
134
126
|
return res as any
|
|
135
127
|
},
|
|
136
128
|
destroy: () => {
|
|
137
|
-
|
|
138
|
-
|
|
129
|
+
sqliteDb.close()
|
|
130
|
+
|
|
131
|
+
if (metadata.input._tag === 'file') {
|
|
139
132
|
SQLite.deleteDatabaseSync(metadata.input.databaseName, metadata.input.directory)
|
|
140
133
|
}
|
|
141
134
|
},
|
|
142
135
|
close: () => {
|
|
143
136
|
try {
|
|
144
|
-
const db = dbRef.current
|
|
145
137
|
for (const stmt of stmts) {
|
|
146
138
|
stmt.finalize()
|
|
147
139
|
}
|
|
@@ -151,7 +143,7 @@ const makeSqliteDb_ = <TMetadata extends Metadata>({
|
|
|
151
143
|
} catch (cause) {
|
|
152
144
|
throw new SqliteError({
|
|
153
145
|
cause,
|
|
154
|
-
note: `Error closing database ${metadata.input._tag === '
|
|
146
|
+
note: `Error closing database ${metadata.input._tag === 'file' ? metadata.input.databaseName : 'in-memory'}`,
|
|
155
147
|
})
|
|
156
148
|
// console.error('Error closing database', metadata.input, e, dbCount)
|
|
157
149
|
}
|
|
@@ -161,37 +153,36 @@ const makeSqliteDb_ = <TMetadata extends Metadata>({
|
|
|
161
153
|
throw new TypeError('importing from an existing database is not yet supported in expo')
|
|
162
154
|
}
|
|
163
155
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
file.write(data)
|
|
174
|
-
|
|
175
|
-
dbRef.count++
|
|
176
|
-
dbRef.current = makeDb()
|
|
177
|
-
} else {
|
|
178
|
-
dbRef.count++
|
|
179
|
-
dbRef.current = SQLite.deserializeDatabaseSync(data)
|
|
156
|
+
try {
|
|
157
|
+
const tmpDb = SQLite.deserializeDatabaseSync(data)
|
|
158
|
+
SQLite.backupDatabaseSync({ sourceDatabase: tmpDb, destDatabase: db })
|
|
159
|
+
tmpDb.closeSync()
|
|
160
|
+
} catch (cause) {
|
|
161
|
+
throw new SqliteError({
|
|
162
|
+
cause,
|
|
163
|
+
note: `Error importing database ${metadata.input._tag === 'file' ? metadata.input.databaseName : 'in-memory'}`,
|
|
164
|
+
})
|
|
180
165
|
}
|
|
181
166
|
},
|
|
182
167
|
session: () => {
|
|
168
|
+
const session = db.createSessionSync()
|
|
169
|
+
session.attachSync(null)
|
|
183
170
|
return {
|
|
184
|
-
changeset: () =>
|
|
185
|
-
finish: () =>
|
|
171
|
+
changeset: () => session.createChangesetSync(),
|
|
172
|
+
finish: () => session.closeSync(),
|
|
186
173
|
}
|
|
187
174
|
},
|
|
188
175
|
makeChangeset: (data) => {
|
|
176
|
+
const session = db.createSessionSync()
|
|
177
|
+
// NOTE we're not actually attaching this particular session as we only need it to create and
|
|
178
|
+
// apply an inverted changeset
|
|
189
179
|
return {
|
|
190
180
|
invert: () => {
|
|
191
|
-
|
|
181
|
+
const inverted = session.invertChangesetSync(data)
|
|
182
|
+
return sqliteDb.makeChangeset(inverted)
|
|
192
183
|
},
|
|
193
184
|
apply: () => {
|
|
194
|
-
|
|
185
|
+
session.applyChangesetSync(data)
|
|
195
186
|
},
|
|
196
187
|
}
|
|
197
188
|
},
|
package/src/polyfill.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current limitations in Expo/React Native/Hermes that need workarounds:
|
|
3
|
+
*
|
|
4
|
+
* - No support for `Array.toSorted`: https://github.com/facebook/hermes/pull/1298
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// eslint-disable-next-line unicorn/no-typeof-undefined
|
|
8
|
+
if (typeof Array.prototype.toSorted === 'undefined') {
|
|
9
|
+
Array.prototype.toSorted = function (compareFn) {
|
|
10
|
+
return this.sort(compareFn)
|
|
11
|
+
}
|
|
12
|
+
}
|
package/tmp/pack.tgz
CHANGED
|
Binary file
|