@livestore/common 0.3.1 → 0.3.2-dev.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/dist/.tsbuildinfo +1 -1
- package/dist/ClientSessionLeaderThreadProxy.d.ts +35 -0
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -0
- package/dist/ClientSessionLeaderThreadProxy.js +6 -0
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -0
- package/dist/adapter-types.d.ts +10 -161
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +5 -49
- package/dist/adapter-types.js.map +1 -1
- package/dist/defs.d.ts +20 -0
- package/dist/defs.d.ts.map +1 -0
- package/dist/defs.js +12 -0
- package/dist/defs.js.map +1 -0
- package/dist/devtools/devtools-messages-client-session.d.ts +23 -21
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +6 -6
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +26 -24
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/errors.d.ts +50 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +36 -0
- package/dist/errors.js.map +1 -0
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +6 -7
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +112 -122
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +17 -6
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +32 -17
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +1 -2
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +37 -7
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +7 -1
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -0
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -0
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +13 -6
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +1 -3
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/types.d.ts +5 -7
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/make-client-session.d.ts +1 -1
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +1 -1
- package/dist/make-client-session.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +1 -1
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +10 -2
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef.d.ts +2 -2
- package/dist/schema/EventDef.d.ts.map +1 -1
- package/dist/schema/EventDef.js +2 -2
- package/dist/schema/EventDef.js.map +1 -1
- package/dist/schema/EventSequenceNumber.d.ts +20 -2
- package/dist/schema/EventSequenceNumber.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber.js +71 -19
- package/dist/schema/EventSequenceNumber.js.map +1 -1
- package/dist/schema/EventSequenceNumber.test.js +88 -3
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent.d.ts +25 -11
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent.js +12 -4
- package/dist/schema/LiveStoreEvent.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +2 -2
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/hash.js +3 -1
- package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +1 -1
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +35 -8
- package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +16 -11
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +1 -81
- package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +34 -20
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables.d.ts +67 -62
- package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables.js +8 -17
- package/dist/schema/state/sqlite/system-tables.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.d.ts +1 -1
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema-management/migrations.d.ts +3 -1
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +2 -0
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sqlite-types.d.ts +72 -0
- package/dist/sqlite-types.d.ts.map +1 -0
- package/dist/sqlite-types.js +5 -0
- package/dist/sqlite-types.js.map +1 -0
- package/dist/sync/ClientSessionSyncProcessor.d.ts +6 -2
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +16 -13
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/next/graphology.d.ts.map +1 -1
- package/dist/sync/next/graphology.js +0 -6
- package/dist/sync/next/graphology.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +1 -0
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +1 -1
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +12 -3
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync.d.ts +2 -0
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +3 -0
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +13 -4
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +23 -10
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +17 -17
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +7 -6
- package/src/ClientSessionLeaderThreadProxy.ts +40 -0
- package/src/adapter-types.ts +19 -166
- package/src/defs.ts +17 -0
- package/src/errors.ts +49 -0
- package/src/leader-thread/LeaderSyncProcessor.ts +141 -180
- package/src/leader-thread/eventlog.ts +78 -56
- package/src/leader-thread/leader-worker-devtools.ts +1 -2
- package/src/leader-thread/make-leader-thread-layer.ts +52 -8
- package/src/leader-thread/materialize-event.ts +8 -1
- package/src/leader-thread/mod.ts +1 -0
- package/src/leader-thread/recreate-db.ts +99 -91
- package/src/leader-thread/types.ts +6 -11
- package/src/make-client-session.ts +2 -2
- package/src/rematerialize-from-eventlog.ts +10 -2
- package/src/schema/EventDef.ts +5 -3
- package/src/schema/EventSequenceNumber.test.ts +120 -3
- package/src/schema/EventSequenceNumber.ts +95 -23
- package/src/schema/LiveStoreEvent.ts +20 -4
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +2 -2
- package/src/schema/state/sqlite/db-schema/hash.ts +3 -3
- package/src/schema/state/sqlite/mod.ts +1 -1
- package/src/schema/state/sqlite/query-builder/api.ts +38 -8
- package/src/schema/state/sqlite/query-builder/impl.test.ts +60 -20
- package/src/schema/state/sqlite/query-builder/impl.ts +15 -12
- package/src/schema/state/sqlite/system-tables.ts +9 -22
- package/src/schema/state/sqlite/table-def.ts +1 -1
- package/src/schema-management/migrations.ts +3 -1
- package/src/sql-queries/sql-queries.ts +2 -0
- package/src/sqlite-types.ts +76 -0
- package/src/sync/ClientSessionSyncProcessor.ts +17 -20
- package/src/sync/next/graphology.ts +0 -6
- package/src/sync/next/rebase-events.ts +1 -0
- package/src/sync/next/test/compact-events.test.ts +1 -1
- package/src/sync/next/test/event-fixtures.ts +12 -3
- package/src/sync/sync.ts +3 -0
- package/src/sync/syncstate.test.ts +17 -17
- package/src/sync/syncstate.ts +31 -10
- package/src/version.ts +1 -1
package/src/adapter-types.ts
CHANGED
@@ -1,31 +1,22 @@
|
|
1
|
-
import
|
2
|
-
|
3
|
-
|
1
|
+
import {
|
2
|
+
type Cause,
|
3
|
+
type Effect,
|
4
|
+
type Queue,
|
5
|
+
Schema,
|
6
|
+
type Scope,
|
7
|
+
type SubscriptionRef,
|
8
|
+
type WebChannel,
|
9
|
+
} from '@livestore/utils/effect'
|
10
|
+
|
11
|
+
import type { ClientSessionLeaderThreadProxy } from './ClientSessionLeaderThreadProxy.js'
|
4
12
|
import type * as Devtools from './devtools/mod.js'
|
5
|
-
import
|
6
|
-
import type {
|
7
|
-
import type {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
export interface PreparedStatement {
|
13
|
-
execute(bindValues: PreparedBindValues | undefined, options?: { onRowsChanged?: (rowsChanged: number) => void }): void
|
14
|
-
select<T>(bindValues: PreparedBindValues | undefined): ReadonlyArray<T>
|
15
|
-
finalize(): void
|
16
|
-
sql: string
|
17
|
-
}
|
18
|
-
|
19
|
-
export type SqliteDbSession = {
|
20
|
-
changeset: () => Uint8Array | undefined
|
21
|
-
finish: () => void
|
22
|
-
}
|
23
|
-
|
24
|
-
export type SqliteDbChangeset = {
|
25
|
-
// TODO combining changesets (requires changes in the SQLite WASM binding)
|
26
|
-
invert: () => SqliteDbChangeset
|
27
|
-
apply: () => void
|
28
|
-
}
|
13
|
+
import type { IntentionalShutdownCause, SyncError, UnexpectedError } from './errors.js'
|
14
|
+
import type { LiveStoreSchema } from './schema/mod.js'
|
15
|
+
import type { SqliteDb } from './sqlite-types.js'
|
16
|
+
export * as ClientSessionLeaderThreadProxy from './ClientSessionLeaderThreadProxy.js'
|
17
|
+
export * from './defs.js'
|
18
|
+
export * from './errors.js'
|
19
|
+
export * from './sqlite-types.js'
|
29
20
|
|
30
21
|
export interface ClientSession {
|
31
22
|
/** SQLite database with synchronous API running in the same thread (usually in-memory) */
|
@@ -35,91 +26,13 @@ export interface ClientSession {
|
|
35
26
|
sessionId: string
|
36
27
|
/** Status info whether current session is leader or not */
|
37
28
|
lockStatus: SubscriptionRef.SubscriptionRef<LockStatus>
|
38
|
-
shutdown: (cause: Cause.Cause<UnexpectedError | IntentionalShutdownCause>) => Effect.Effect<void>
|
29
|
+
shutdown: (cause: Cause.Cause<UnexpectedError | IntentionalShutdownCause | SyncError>) => Effect.Effect<void>
|
39
30
|
/** A proxy API to communicate with the leader thread */
|
40
31
|
leaderThread: ClientSessionLeaderThreadProxy
|
41
32
|
/** A unique identifier for the current instance of the client session. Used for debugging purposes. */
|
42
33
|
debugInstanceId: string
|
43
34
|
}
|
44
35
|
|
45
|
-
export const LeaderPullCursor = Schema.Struct({
|
46
|
-
mergeCounter: Schema.Number,
|
47
|
-
eventNum: EventSequenceNumber.EventSequenceNumber,
|
48
|
-
})
|
49
|
-
|
50
|
-
export type LeaderPullCursor = typeof LeaderPullCursor.Type
|
51
|
-
|
52
|
-
export interface ClientSessionLeaderThreadProxy {
|
53
|
-
events: {
|
54
|
-
pull: (args: {
|
55
|
-
cursor: LeaderPullCursor
|
56
|
-
}) => Stream.Stream<{ payload: typeof PayloadUpstream.Type; mergeCounter: number }, UnexpectedError>
|
57
|
-
/** It's important that a client session doesn't call `push` concurrently. */
|
58
|
-
push(batch: ReadonlyArray<LiveStoreEvent.AnyEncoded>): Effect.Effect<void, UnexpectedError | LeaderAheadError>
|
59
|
-
}
|
60
|
-
/** The initial state after the leader thread has booted */
|
61
|
-
readonly initialState: {
|
62
|
-
/** The latest event sequence number during boot. Used for the client session to resume syncing. */
|
63
|
-
readonly leaderHead: EventSequenceNumber.EventSequenceNumber
|
64
|
-
/** The migrations report from the leader thread */
|
65
|
-
readonly migrationsReport: MigrationsReport
|
66
|
-
}
|
67
|
-
export: Effect.Effect<Uint8Array, UnexpectedError>
|
68
|
-
getEventlogData: Effect.Effect<Uint8Array, UnexpectedError>
|
69
|
-
getSyncState: Effect.Effect<SyncState, UnexpectedError>
|
70
|
-
/** For debugging purposes it can be useful to manually trigger devtools messages (e.g. to reset the database) */
|
71
|
-
sendDevtoolsMessage: (message: Devtools.Leader.MessageToApp) => Effect.Effect<void, UnexpectedError>
|
72
|
-
}
|
73
|
-
|
74
|
-
/**
|
75
|
-
* Common interface for SQLite databases used by LiveStore to facilitate a consistent API across different platforms.
|
76
|
-
* Always assumes a synchronous SQLite build with the `bytecode` and `session` extensions enabled.
|
77
|
-
* Can be either in-memory or persisted to disk.
|
78
|
-
*/
|
79
|
-
export interface SqliteDb<TReq = any, TMetadata extends TReq = TReq> {
|
80
|
-
_tag: 'SqliteDb'
|
81
|
-
metadata: TMetadata
|
82
|
-
prepare(queryStr: string): PreparedStatement
|
83
|
-
execute(
|
84
|
-
queryStr: string,
|
85
|
-
bindValues?: PreparedBindValues | undefined,
|
86
|
-
options?: { onRowsChanged?: (rowsChanged: number) => void },
|
87
|
-
): void
|
88
|
-
execute(queryBuilder: QueryBuilder.Any, options?: { onRowsChanged?: (rowsChanged: number) => void }): void
|
89
|
-
|
90
|
-
select<T>(queryStr: string, bindValues?: PreparedBindValues | undefined): ReadonlyArray<T>
|
91
|
-
select<T>(queryBuilder: QueryBuilder<T, any, any>): ReadonlyArray<T>
|
92
|
-
|
93
|
-
export(): Uint8Array
|
94
|
-
import: (data: Uint8Array | SqliteDb<TReq>) => void
|
95
|
-
close(): void
|
96
|
-
destroy(): void
|
97
|
-
session(): SqliteDbSession
|
98
|
-
makeChangeset: (data: Uint8Array) => SqliteDbChangeset
|
99
|
-
}
|
100
|
-
|
101
|
-
// TODO refactor this helper type. It's quite cumbersome to use and should be revisited.
|
102
|
-
export type MakeSqliteDb<
|
103
|
-
TReq = { dbPointer: number; persistenceInfo: PersistenceInfo },
|
104
|
-
TInput_ extends { _tag: string } = { _tag: string },
|
105
|
-
TMetadata_ extends TReq = TReq,
|
106
|
-
R = never,
|
107
|
-
> = <
|
108
|
-
TInput extends TInput_,
|
109
|
-
TMetadata extends TMetadata_ & { _tag: TInput['_tag'] } = TMetadata_ & { _tag: TInput['_tag'] },
|
110
|
-
>(
|
111
|
-
input: TInput,
|
112
|
-
) => Effect.Effect<SqliteDb<TReq, Extract<TMetadata, { _tag: TInput['_tag'] }>>, SqliteError | UnexpectedError, R>
|
113
|
-
|
114
|
-
export const PersistenceInfo = Schema.Struct(
|
115
|
-
{
|
116
|
-
fileName: Schema.String,
|
117
|
-
},
|
118
|
-
{ key: Schema.String, value: Schema.Any },
|
119
|
-
).annotations({ title: 'LiveStore.PersistenceInfo' })
|
120
|
-
|
121
|
-
export type PersistenceInfo<With extends {} = {}> = typeof PersistenceInfo.Type & With
|
122
|
-
|
123
36
|
export type ResetMode = 'all-data' | 'only-app-db'
|
124
37
|
|
125
38
|
export const BootStateProgress = Schema.Struct({
|
@@ -164,50 +77,6 @@ export type SessionIdSymbol = typeof SessionIdSymbol
|
|
164
77
|
|
165
78
|
export type LockStatus = 'has-lock' | 'no-lock'
|
166
79
|
|
167
|
-
export class UnexpectedError extends Schema.TaggedError<UnexpectedError>()('LiveStore.UnexpectedError', {
|
168
|
-
cause: Schema.Defect,
|
169
|
-
note: Schema.optional(Schema.String),
|
170
|
-
payload: Schema.optional(Schema.Any),
|
171
|
-
}) {
|
172
|
-
static mapToUnexpectedError = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
|
173
|
-
effect.pipe(
|
174
|
-
Effect.mapError((cause) => (Schema.is(UnexpectedError)(cause) ? cause : new UnexpectedError({ cause }))),
|
175
|
-
Effect.catchAllDefect((cause) => new UnexpectedError({ cause })),
|
176
|
-
)
|
177
|
-
|
178
|
-
static mapToUnexpectedErrorStream = <A, E, R>(stream: Stream.Stream<A, E, R>) =>
|
179
|
-
stream.pipe(
|
180
|
-
Stream.mapError((cause) => (Schema.is(UnexpectedError)(cause) ? cause : new UnexpectedError({ cause }))),
|
181
|
-
)
|
182
|
-
}
|
183
|
-
|
184
|
-
export class IntentionalShutdownCause extends Schema.TaggedError<IntentionalShutdownCause>()(
|
185
|
-
'LiveStore.IntentionalShutdownCause',
|
186
|
-
{
|
187
|
-
reason: Schema.Literal('devtools-reset', 'devtools-import', 'adapter-reset', 'manual'),
|
188
|
-
},
|
189
|
-
) {}
|
190
|
-
|
191
|
-
export class StoreInterrupted extends Schema.TaggedError<StoreInterrupted>()('LiveStore.StoreInterrupted', {
|
192
|
-
reason: Schema.String,
|
193
|
-
}) {}
|
194
|
-
|
195
|
-
export class SqliteError extends Schema.TaggedError<SqliteError>()('LiveStore.SqliteError', {
|
196
|
-
query: Schema.optional(
|
197
|
-
Schema.Struct({
|
198
|
-
sql: Schema.String,
|
199
|
-
bindValues: Schema.Union(Schema.Record({ key: Schema.String, value: Schema.Any }), Schema.Array(Schema.Any)),
|
200
|
-
}),
|
201
|
-
),
|
202
|
-
/** The SQLite result code */
|
203
|
-
// code: Schema.optional(Schema.Number),
|
204
|
-
// Added string support for Expo SQLite (we should refactor this to have a unified error type)
|
205
|
-
code: Schema.optional(Schema.Union(Schema.Number, Schema.String)),
|
206
|
-
/** The original SQLite3 error */
|
207
|
-
cause: Schema.Defect,
|
208
|
-
note: Schema.optional(Schema.String),
|
209
|
-
}) {}
|
210
|
-
|
211
80
|
// TODO possibly allow a combination of these options
|
212
81
|
// TODO allow a way to stream the migration progress back to the app
|
213
82
|
export type MigrationOptions =
|
@@ -258,19 +127,3 @@ export interface AdapterArgs {
|
|
258
127
|
*/
|
259
128
|
syncPayload: Schema.JsonValue | undefined
|
260
129
|
}
|
261
|
-
|
262
|
-
export const MigrationsReportEntry = Schema.Struct({
|
263
|
-
tableName: Schema.String,
|
264
|
-
hashes: Schema.Struct({
|
265
|
-
expected: Schema.Number,
|
266
|
-
actual: Schema.optional(Schema.Number),
|
267
|
-
}),
|
268
|
-
})
|
269
|
-
|
270
|
-
export const MigrationsReport = Schema.Struct({
|
271
|
-
migrations: Schema.Array(MigrationsReportEntry),
|
272
|
-
})
|
273
|
-
|
274
|
-
export type MigrationsReport = typeof MigrationsReport.Type
|
275
|
-
|
276
|
-
export type MigrationsReportEntry = typeof MigrationsReportEntry.Type
|
package/src/defs.ts
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
import { Schema } from '@livestore/utils/effect'
|
2
|
+
|
3
|
+
export const MigrationsReportEntry = Schema.Struct({
|
4
|
+
tableName: Schema.String,
|
5
|
+
hashes: Schema.Struct({
|
6
|
+
expected: Schema.Number,
|
7
|
+
actual: Schema.optional(Schema.Number),
|
8
|
+
}),
|
9
|
+
})
|
10
|
+
|
11
|
+
export const MigrationsReport = Schema.Struct({
|
12
|
+
migrations: Schema.Array(MigrationsReportEntry),
|
13
|
+
})
|
14
|
+
|
15
|
+
export type MigrationsReport = typeof MigrationsReport.Type
|
16
|
+
|
17
|
+
export type MigrationsReportEntry = typeof MigrationsReportEntry.Type
|
package/src/errors.ts
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
import { Effect, Schema, Stream } from '@livestore/utils/effect'
|
2
|
+
|
3
|
+
export class UnexpectedError extends Schema.TaggedError<UnexpectedError>()('LiveStore.UnexpectedError', {
|
4
|
+
cause: Schema.Defect,
|
5
|
+
note: Schema.optional(Schema.String),
|
6
|
+
payload: Schema.optional(Schema.Any),
|
7
|
+
}) {
|
8
|
+
static mapToUnexpectedError = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
|
9
|
+
effect.pipe(
|
10
|
+
Effect.mapError((cause) => (Schema.is(UnexpectedError)(cause) ? cause : new UnexpectedError({ cause }))),
|
11
|
+
Effect.catchAllDefect((cause) => new UnexpectedError({ cause })),
|
12
|
+
)
|
13
|
+
|
14
|
+
static mapToUnexpectedErrorStream = <A, E, R>(stream: Stream.Stream<A, E, R>) =>
|
15
|
+
stream.pipe(
|
16
|
+
Stream.mapError((cause) => (Schema.is(UnexpectedError)(cause) ? cause : new UnexpectedError({ cause }))),
|
17
|
+
)
|
18
|
+
}
|
19
|
+
|
20
|
+
export class SyncError extends Schema.TaggedError<SyncError>()('LiveStore.SyncError', {
|
21
|
+
cause: Schema.Defect,
|
22
|
+
}) {}
|
23
|
+
|
24
|
+
export class IntentionalShutdownCause extends Schema.TaggedError<IntentionalShutdownCause>()(
|
25
|
+
'LiveStore.IntentionalShutdownCause',
|
26
|
+
{
|
27
|
+
reason: Schema.Literal('devtools-reset', 'devtools-import', 'adapter-reset', 'manual'),
|
28
|
+
},
|
29
|
+
) {}
|
30
|
+
|
31
|
+
export class StoreInterrupted extends Schema.TaggedError<StoreInterrupted>()('LiveStore.StoreInterrupted', {
|
32
|
+
reason: Schema.String,
|
33
|
+
}) {}
|
34
|
+
|
35
|
+
export class SqliteError extends Schema.TaggedError<SqliteError>()('LiveStore.SqliteError', {
|
36
|
+
query: Schema.optional(
|
37
|
+
Schema.Struct({
|
38
|
+
sql: Schema.String,
|
39
|
+
bindValues: Schema.Union(Schema.Record({ key: Schema.String, value: Schema.Any }), Schema.Array(Schema.Any)),
|
40
|
+
}),
|
41
|
+
),
|
42
|
+
/** The SQLite result code */
|
43
|
+
// code: Schema.optional(Schema.Number),
|
44
|
+
// Added string support for Expo SQLite (we should refactor this to have a unified error type)
|
45
|
+
code: Schema.optional(Schema.Union(Schema.Number, Schema.String)),
|
46
|
+
/** The original SQLite3 error */
|
47
|
+
cause: Schema.Defect,
|
48
|
+
note: Schema.optional(Schema.String),
|
49
|
+
}) {}
|