@livestore/common 0.3.0-dev.1 → 0.3.0-dev.11
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/adapter-types.d.ts +47 -35
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/derived-mutations.d.ts +4 -4
- package/dist/derived-mutations.d.ts.map +1 -1
- package/dist/derived-mutations.test.js.map +1 -1
- package/dist/devtools/devtool-message-leader.d.ts +2 -0
- package/dist/devtools/devtool-message-leader.d.ts.map +1 -0
- package/dist/devtools/devtool-message-leader.js +2 -0
- package/dist/devtools/devtool-message-leader.js.map +1 -0
- package/dist/devtools/devtools-bridge.d.ts +2 -1
- package/dist/devtools/devtools-bridge.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +297 -0
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-client-session.js +61 -0
- package/dist/devtools/devtools-messages-client-session.js.map +1 -0
- package/dist/devtools/devtools-messages-common.d.ts +65 -0
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-common.js +35 -0
- package/dist/devtools/devtools-messages-common.js.map +1 -0
- package/dist/devtools/devtools-messages-leader.d.ts +261 -0
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-leader.js +85 -0
- package/dist/devtools/devtools-messages-leader.js.map +1 -0
- package/dist/devtools/devtools-messages.d.ts +3 -592
- package/dist/devtools/devtools-messages.d.ts.map +1 -1
- package/dist/devtools/devtools-messages.js +3 -171
- package/dist/devtools/devtools-messages.js.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/init-singleton-tables.d.ts +2 -2
- package/dist/init-singleton-tables.d.ts.map +1 -1
- package/dist/init-singleton-tables.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +37 -0
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
- package/dist/leader-thread/LeaderSyncProcessor.js +432 -0
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
- package/dist/leader-thread/apply-mutation.d.ts +5 -2
- package/dist/leader-thread/apply-mutation.d.ts.map +1 -1
- package/dist/leader-thread/apply-mutation.js +41 -29
- package/dist/leader-thread/apply-mutation.js.map +1 -1
- package/dist/leader-thread/connection.d.ts +4 -4
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +5 -5
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/leader-sync-processor.d.ts +2 -2
- package/dist/leader-thread/leader-sync-processor.d.ts.map +1 -1
- package/dist/leader-thread/leader-sync-processor.js +20 -12
- package/dist/leader-thread/leader-sync-processor.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +37 -81
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +12 -11
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +33 -14
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/mutationlog.d.ts +6 -19
- package/dist/leader-thread/mutationlog.d.ts.map +1 -1
- package/dist/leader-thread/mutationlog.js +7 -6
- package/dist/leader-thread/mutationlog.js.map +1 -1
- package/dist/leader-thread/pull-queue-set.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +24 -18
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/types.d.ts +36 -16
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/mutation.d.ts +9 -2
- package/dist/mutation.d.ts.map +1 -1
- package/dist/mutation.js +5 -5
- package/dist/mutation.js.map +1 -1
- package/dist/query-builder/impl.d.ts +1 -1
- package/dist/rehydrate-from-mutationlog.d.ts +5 -5
- package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
- package/dist/rehydrate-from-mutationlog.js +13 -19
- package/dist/rehydrate-from-mutationlog.js.map +1 -1
- package/dist/schema/EventId.d.ts +16 -14
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +15 -7
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/EventId.test.d.ts +2 -0
- package/dist/schema/EventId.test.d.ts.map +1 -0
- package/dist/schema/EventId.test.js +11 -0
- package/dist/schema/EventId.test.js.map +1 -0
- package/dist/schema/MutationEvent.d.ts +49 -80
- package/dist/schema/MutationEvent.d.ts.map +1 -1
- package/dist/schema/MutationEvent.js +32 -15
- package/dist/schema/MutationEvent.js.map +1 -1
- package/dist/schema/MutationEvent.test.d.ts +2 -0
- package/dist/schema/MutationEvent.test.d.ts.map +1 -0
- package/dist/schema/MutationEvent.test.js +2 -0
- package/dist/schema/MutationEvent.test.js.map +1 -0
- package/dist/schema/system-tables.d.ts +26 -26
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/system-tables.js +19 -11
- package/dist/schema/system-tables.js.map +1 -1
- package/dist/schema-management/common.d.ts +3 -3
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +4 -4
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +6 -6
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +43 -0
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
- package/dist/sync/ClientSessionSyncProcessor.js +141 -0
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
- package/dist/sync/client-session-sync-processor.d.ts +4 -4
- package/dist/sync/client-session-sync-processor.d.ts.map +1 -1
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +1 -4
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +1 -1
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +3 -3
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +3 -2
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/mutation-fixtures.d.ts +7 -7
- package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/mutation-fixtures.js +3 -9
- package/dist/sync/next/test/mutation-fixtures.js.map +1 -1
- package/dist/sync/sync.d.ts +21 -11
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +45 -23
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +56 -12
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +125 -69
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +2 -2
- package/dist/sync/validate-push-payload.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 +6 -5
- package/src/adapter-types.ts +39 -40
- package/src/derived-mutations.test.ts +1 -1
- package/src/derived-mutations.ts +9 -5
- package/src/devtools/devtools-bridge.ts +2 -1
- package/src/devtools/devtools-messages-client-session.ts +109 -0
- package/src/devtools/devtools-messages-common.ts +52 -0
- package/src/devtools/devtools-messages-leader.ts +115 -0
- package/src/devtools/devtools-messages.ts +3 -243
- package/src/index.ts +0 -6
- package/src/init-singleton-tables.ts +2 -2
- package/src/leader-thread/{leader-sync-processor.ts → LeaderSyncProcessor.ts} +306 -268
- package/src/leader-thread/apply-mutation.ts +53 -35
- package/src/leader-thread/connection.ts +7 -7
- package/src/leader-thread/leader-worker-devtools.ts +52 -124
- package/src/leader-thread/make-leader-thread-layer.ts +62 -30
- package/src/leader-thread/mutationlog.ts +14 -10
- package/src/leader-thread/recreate-db.ts +24 -20
- package/src/leader-thread/types.ts +41 -20
- package/src/mutation.ts +17 -7
- package/src/rehydrate-from-mutationlog.ts +18 -26
- package/src/schema/EventId.test.ts +12 -0
- package/src/schema/EventId.ts +23 -9
- package/src/schema/MutationEvent.ts +46 -24
- package/src/schema/system-tables.ts +19 -11
- package/src/schema-management/common.ts +3 -3
- package/src/schema-management/migrations.ts +10 -10
- package/src/sync/{client-session-sync-processor.ts → ClientSessionSyncProcessor.ts} +26 -19
- package/src/sync/index.ts +1 -1
- package/src/sync/next/history-dag-common.ts +1 -1
- package/src/sync/next/rebase-events.ts +7 -7
- package/src/sync/next/test/mutation-fixtures.ts +3 -10
- package/src/sync/sync.ts +19 -6
- package/src/sync/syncstate.test.ts +127 -67
- package/src/sync/syncstate.ts +21 -19
- package/src/sync/validate-push-payload.ts +7 -4
- package/src/version.ts +1 -1
package/package.json
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
{
|
2
2
|
"name": "@livestore/common",
|
3
|
-
"version": "0.3.0-dev.
|
3
|
+
"version": "0.3.0-dev.11",
|
4
4
|
"type": "module",
|
5
|
+
"sideEffects": false,
|
5
6
|
"exports": {
|
6
7
|
".": {
|
7
8
|
"types": "./dist/index.d.ts",
|
@@ -49,12 +50,12 @@
|
|
49
50
|
}
|
50
51
|
},
|
51
52
|
"dependencies": {
|
52
|
-
"@opentelemetry/api": "
|
53
|
+
"@opentelemetry/api": "1.9.0",
|
53
54
|
"graphology": "0.26.0-alpha1",
|
54
55
|
"graphology-dag": "0.4.1",
|
55
|
-
"graphology-types": "0.24.
|
56
|
-
"@livestore/
|
57
|
-
"@livestore/
|
56
|
+
"graphology-types": "0.24.8",
|
57
|
+
"@livestore/db-schema": "0.3.0-dev.11",
|
58
|
+
"@livestore/utils": "0.3.0-dev.11"
|
58
59
|
},
|
59
60
|
"devDependencies": {
|
60
61
|
"vitest": "^2.1.4"
|
package/src/adapter-types.ts
CHANGED
@@ -15,26 +15,51 @@ export interface PreparedStatement {
|
|
15
15
|
sql: string
|
16
16
|
}
|
17
17
|
|
18
|
-
export type
|
18
|
+
export type SqliteDbSession = {
|
19
19
|
changeset: () => Uint8Array | undefined
|
20
20
|
finish: () => void
|
21
21
|
}
|
22
22
|
|
23
|
-
export type
|
23
|
+
export type SqliteDbChangeset = {
|
24
24
|
// TODO combining changesets (requires changes in the SQLite WASM binding)
|
25
|
-
invert: () =>
|
25
|
+
invert: () => SqliteDbChangeset
|
26
26
|
apply: () => void
|
27
27
|
}
|
28
28
|
|
29
29
|
export type ClientSession = {
|
30
30
|
/** SQLite database with synchronous API running in the same thread (usually in-memory) */
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
sqliteDb: SqliteDb
|
32
|
+
devtools: { enabled: false } | { enabled: true; pullLatch: Effect.Latch; pushLatch: Effect.Latch }
|
33
|
+
clientId: string
|
34
|
+
sessionId: string
|
35
|
+
/** Status info whether current session is leader or not */
|
36
|
+
lockStatus: SubscriptionRef.SubscriptionRef<LockStatus>
|
37
|
+
shutdown: (cause: Cause.Cause<UnexpectedError | IntentionalShutdownCause>) => Effect.Effect<void>
|
38
|
+
/** A proxy API to communicate with the leader thread */
|
39
|
+
leaderThread: ClientSessionLeaderThreadProxy
|
34
40
|
}
|
35
41
|
|
36
|
-
export type
|
37
|
-
|
42
|
+
export type ClientSessionLeaderThreadProxy = {
|
43
|
+
mutations: {
|
44
|
+
pull: Stream.Stream<{ payload: PayloadUpstream; remaining: number }, UnexpectedError>
|
45
|
+
push(batch: ReadonlyArray<MutationEvent.AnyEncoded>): Effect.Effect<void, UnexpectedError | InvalidPushError>
|
46
|
+
initialMutationEventId: EventId
|
47
|
+
}
|
48
|
+
export: Effect.Effect<Uint8Array, UnexpectedError>
|
49
|
+
getMutationLogData: Effect.Effect<Uint8Array, UnexpectedError>
|
50
|
+
getSyncState: Effect.Effect<SyncState, UnexpectedError>
|
51
|
+
networkStatus: SubscriptionRef.SubscriptionRef<NetworkStatus>
|
52
|
+
/** For debugging purposes it can be useful to manually trigger devtools messages (e.g. to reset the database) */
|
53
|
+
sendDevtoolsMessage: (message: Devtools.MessageToAppLeader) => Effect.Effect<void, UnexpectedError>
|
54
|
+
}
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Common interface for SQLite databases used by LiveStore to facilitate a consistent API across different platforms.
|
58
|
+
* Always assumes a synchronous SQLite build with the `bytecode` and `session` extensions enabled.
|
59
|
+
* Can be either in-memory or persisted to disk.
|
60
|
+
*/
|
61
|
+
export type SqliteDb<TReq = any, TMetadata extends TReq = TReq> = {
|
62
|
+
_tag: 'SqliteDb'
|
38
63
|
metadata: TMetadata
|
39
64
|
prepare(queryStr: string): PreparedStatement
|
40
65
|
execute(
|
@@ -44,14 +69,14 @@ export type SynchronousDatabase<TReq = any, TMetadata extends TReq = TReq> = {
|
|
44
69
|
): void
|
45
70
|
select<T>(queryStr: string, bindValues?: PreparedBindValues | undefined): ReadonlyArray<T>
|
46
71
|
export(): Uint8Array
|
47
|
-
import: (data: Uint8Array |
|
72
|
+
import: (data: Uint8Array | SqliteDb<TReq>) => void
|
48
73
|
close(): void
|
49
74
|
destroy(): void
|
50
|
-
session():
|
51
|
-
makeChangeset: (data: Uint8Array) =>
|
75
|
+
session(): SqliteDbSession
|
76
|
+
makeChangeset: (data: Uint8Array) => SqliteDbChangeset
|
52
77
|
}
|
53
78
|
|
54
|
-
export type
|
79
|
+
export type MakeSqliteDb<
|
55
80
|
TReq = { dbPointer: number; persistenceInfo: PersistenceInfo },
|
56
81
|
TInput_ extends { _tag: string } = { _tag: string },
|
57
82
|
TMetadata_ extends TReq = TReq,
|
@@ -61,11 +86,7 @@ export type MakeSynchronousDatabase<
|
|
61
86
|
TMetadata extends TMetadata_ & { _tag: TInput['_tag'] } = TMetadata_ & { _tag: TInput['_tag'] },
|
62
87
|
>(
|
63
88
|
input: TInput,
|
64
|
-
) => Effect.Effect<
|
65
|
-
SynchronousDatabase<TReq, Extract<TMetadata, { _tag: TInput['_tag'] }>>,
|
66
|
-
SqliteError | UnexpectedError,
|
67
|
-
R
|
68
|
-
>
|
89
|
+
) => Effect.Effect<SqliteDb<TReq, Extract<TMetadata, { _tag: TInput['_tag'] }>>, SqliteError | UnexpectedError, R>
|
69
90
|
|
70
91
|
export const PersistenceInfo = Schema.Struct(
|
71
92
|
{
|
@@ -103,28 +124,6 @@ export const BootStatus = Schema.Union(
|
|
103
124
|
|
104
125
|
export type BootStatus = typeof BootStatus.Type
|
105
126
|
|
106
|
-
// TODO refactor `Coordinator` to embrace more of the "leader semantics"
|
107
|
-
export type Coordinator = {
|
108
|
-
devtools: {
|
109
|
-
enabled: boolean
|
110
|
-
// TODO incorporate sessionId and rethink appHostId
|
111
|
-
appHostId: string
|
112
|
-
}
|
113
|
-
sessionId: string
|
114
|
-
// TODO is exposing the lock status really needed (or only relevant for web adapter?)
|
115
|
-
lockStatus: SubscriptionRef.SubscriptionRef<LockStatus>
|
116
|
-
mutations: {
|
117
|
-
pull: Stream.Stream<{ payload: PayloadUpstream; remaining: number }, UnexpectedError>
|
118
|
-
push(batch: ReadonlyArray<MutationEvent.AnyEncoded>): Effect.Effect<void, UnexpectedError | InvalidPushError>
|
119
|
-
initialMutationEventId: EventId
|
120
|
-
}
|
121
|
-
export: Effect.Effect<Uint8Array, UnexpectedError>
|
122
|
-
getMutationLogData: Effect.Effect<Uint8Array, UnexpectedError>
|
123
|
-
getLeaderSyncState: Effect.Effect<SyncState, UnexpectedError>
|
124
|
-
networkStatus: SubscriptionRef.SubscriptionRef<NetworkStatus>
|
125
|
-
shutdown: (cause: Cause.Cause<UnexpectedError | IntentionalShutdownCause>) => Effect.Effect<void>
|
126
|
-
}
|
127
|
-
|
128
127
|
/**
|
129
128
|
* Can be used in queries to refer to the current session id.
|
130
129
|
* Will be replaced with the actual session id at runtime
|
@@ -198,7 +197,7 @@ export type MigrationHooks = {
|
|
198
197
|
post: MigrationHook
|
199
198
|
}
|
200
199
|
|
201
|
-
export type MigrationHook = (db:
|
200
|
+
export type MigrationHook = (db: SqliteDb) => void | Promise<void> | Effect.Effect<void, unknown>
|
202
201
|
|
203
202
|
export type MigrationOptionsFromMutationLog<TSchema extends LiveStoreSchema = LiveStoreSchema> = {
|
204
203
|
strategy: 'from-mutation-log'
|
@@ -94,7 +94,7 @@ describe('derived mutations', () => {
|
|
94
94
|
})
|
95
95
|
})
|
96
96
|
|
97
|
-
const patchId = (muationEvent: MutationEvent.
|
97
|
+
const patchId = (muationEvent: MutationEvent.PartialAnyDecoded) => {
|
98
98
|
// TODO use new id paradigm
|
99
99
|
const id = `00000000-0000-0000-0000-000000000000`
|
100
100
|
return { ...muationEvent, id }
|
package/src/derived-mutations.ts
CHANGED
@@ -136,8 +136,10 @@ export namespace DerivedMutationHelperFns {
|
|
136
136
|
> = SqliteDsl.AnyIfConstained<
|
137
137
|
TColumns,
|
138
138
|
UseShortcut<TOptions> extends true
|
139
|
-
? (
|
140
|
-
|
139
|
+
? (
|
140
|
+
values?: GetValForKey<SqliteDsl.FromColumns.InsertRowDecoded<TColumns>, 'value'>,
|
141
|
+
) => MutationEvent.PartialAnyDecoded
|
142
|
+
: (values: SqliteDsl.FromColumns.InsertRowDecoded<TColumns>) => MutationEvent.PartialAnyDecoded
|
141
143
|
>
|
142
144
|
|
143
145
|
export type UpdateMutationFn<
|
@@ -146,17 +148,19 @@ export namespace DerivedMutationHelperFns {
|
|
146
148
|
> = SqliteDsl.AnyIfConstained<
|
147
149
|
TColumns,
|
148
150
|
UseShortcut<TOptions> extends true
|
149
|
-
? (
|
151
|
+
? (
|
152
|
+
values: Partial<GetValForKey<SqliteDsl.FromColumns.RowDecoded<TColumns>, 'value'>>,
|
153
|
+
) => MutationEvent.PartialAnyDecoded
|
150
154
|
: (args: {
|
151
155
|
where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>
|
152
156
|
values: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>
|
153
|
-
}) => MutationEvent.
|
157
|
+
}) => MutationEvent.PartialAnyDecoded
|
154
158
|
>
|
155
159
|
|
156
160
|
export type DeleteMutationFn<
|
157
161
|
TColumns extends SqliteDsl.ConstraintColumns,
|
158
162
|
_TOptions extends DbSchema.TableOptions,
|
159
|
-
> = (args: { where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>> }) => MutationEvent.
|
163
|
+
> = (args: { where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>> }) => MutationEvent.PartialAnyDecoded
|
160
164
|
|
161
165
|
type UseShortcut<TOptions extends DbSchema.TableOptions> = TOptions['isSingleColumn'] extends true
|
162
166
|
? TOptions['isSingleton'] extends true
|
@@ -6,7 +6,8 @@ export type PrepareDevtoolsBridge = {
|
|
6
6
|
/** Messages coming from the app host (usually responses to requests) */
|
7
7
|
responsePubSub: PubSub.PubSub<Devtools.MessageFromAppLeader | Devtools.MessageFromAppClientSession>
|
8
8
|
sendToAppHost: (msg: Devtools.MessageToAppLeader | Devtools.MessageToAppClientSession) => Effect.Effect<void>
|
9
|
-
|
9
|
+
clientId: string
|
10
|
+
sessionId: string
|
10
11
|
copyToClipboard: (text: string) => Effect.Effect<void>
|
11
12
|
sendEscapeKey?: Effect.Effect<void>
|
12
13
|
isLeader: boolean
|
@@ -0,0 +1,109 @@
|
|
1
|
+
import { Schema } from '@livestore/utils/effect'
|
2
|
+
|
3
|
+
import { DebugInfo } from '../debug-info.js'
|
4
|
+
import { PreparedBindValues } from '../util.js'
|
5
|
+
import { Disconnect, LSDClientSessionReqResMessage } from './devtools-messages-common.js'
|
6
|
+
|
7
|
+
export class DebugInfoReq extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoReq', {}) {}
|
8
|
+
|
9
|
+
export class DebugInfoRes extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoRes', {
|
10
|
+
debugInfo: DebugInfo,
|
11
|
+
}) {}
|
12
|
+
|
13
|
+
export class DebugInfoHistorySubscribe extends LSDClientSessionReqResMessage(
|
14
|
+
'LSD.ClientSession.DebugInfoHistorySubscribe',
|
15
|
+
{},
|
16
|
+
) {}
|
17
|
+
|
18
|
+
export class DebugInfoHistoryRes extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoHistoryRes', {
|
19
|
+
debugInfoHistory: Schema.Array(DebugInfo),
|
20
|
+
}) {}
|
21
|
+
|
22
|
+
export class DebugInfoHistoryUnsubscribe extends LSDClientSessionReqResMessage(
|
23
|
+
'LSD.ClientSession.DebugInfoHistoryUnsubscribe',
|
24
|
+
{},
|
25
|
+
) {}
|
26
|
+
|
27
|
+
export class DebugInfoResetReq extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoResetReq', {}) {}
|
28
|
+
|
29
|
+
export class DebugInfoResetRes extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoResetRes', {}) {}
|
30
|
+
|
31
|
+
export class DebugInfoRerunQueryReq extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoRerunQueryReq', {
|
32
|
+
queryStr: Schema.String,
|
33
|
+
bindValues: Schema.UndefinedOr(PreparedBindValues),
|
34
|
+
queriedTables: Schema.ReadonlySet(Schema.String),
|
35
|
+
}) {}
|
36
|
+
|
37
|
+
export class DebugInfoRerunQueryRes extends LSDClientSessionReqResMessage(
|
38
|
+
'LSD.ClientSession.DebugInfoRerunQueryRes',
|
39
|
+
{},
|
40
|
+
) {}
|
41
|
+
|
42
|
+
export class ReactivityGraphSubscribe extends LSDClientSessionReqResMessage(
|
43
|
+
'LSD.ClientSession.ReactivityGraphSubscribe',
|
44
|
+
{
|
45
|
+
includeResults: Schema.Boolean,
|
46
|
+
},
|
47
|
+
) {}
|
48
|
+
|
49
|
+
export class ReactivityGraphUnsubscribe extends LSDClientSessionReqResMessage(
|
50
|
+
'LSD.ClientSession.ReactivityGraphUnsubscribe',
|
51
|
+
{},
|
52
|
+
) {}
|
53
|
+
|
54
|
+
export class ReactivityGraphRes extends LSDClientSessionReqResMessage('LSD.ClientSession.ReactivityGraphRes', {
|
55
|
+
reactivityGraph: Schema.Any,
|
56
|
+
}) {}
|
57
|
+
|
58
|
+
export class LiveQueriesSubscribe extends LSDClientSessionReqResMessage('LSD.ClientSession.LiveQueriesSubscribe', {}) {}
|
59
|
+
|
60
|
+
export class LiveQueriesUnsubscribe extends LSDClientSessionReqResMessage(
|
61
|
+
'LSD.ClientSession.LiveQueriesUnsubscribe',
|
62
|
+
{},
|
63
|
+
) {}
|
64
|
+
|
65
|
+
export class SerializedLiveQuery extends Schema.Struct({
|
66
|
+
_tag: Schema.Literal('computed', 'db', 'graphql'),
|
67
|
+
id: Schema.Number,
|
68
|
+
label: Schema.String,
|
69
|
+
runs: Schema.Number,
|
70
|
+
executionTimes: Schema.Array(Schema.Number),
|
71
|
+
lastestResult: Schema.Any,
|
72
|
+
activeSubscriptions: Schema.Array(
|
73
|
+
Schema.Struct({ frames: Schema.Array(Schema.Struct({ name: Schema.String, filePath: Schema.String })) }),
|
74
|
+
),
|
75
|
+
}) {}
|
76
|
+
|
77
|
+
export class LiveQueriesRes extends LSDClientSessionReqResMessage('LSD.ClientSession.LiveQueriesRes', {
|
78
|
+
liveQueries: Schema.Array(SerializedLiveQuery),
|
79
|
+
}) {}
|
80
|
+
|
81
|
+
export const MessageToAppClientSession = Schema.Union(
|
82
|
+
DebugInfoReq,
|
83
|
+
DebugInfoHistorySubscribe,
|
84
|
+
DebugInfoHistoryUnsubscribe,
|
85
|
+
DebugInfoResetReq,
|
86
|
+
DebugInfoRerunQueryReq,
|
87
|
+
ReactivityGraphSubscribe,
|
88
|
+
ReactivityGraphUnsubscribe,
|
89
|
+
LiveQueriesSubscribe,
|
90
|
+
LiveQueriesUnsubscribe,
|
91
|
+
Disconnect,
|
92
|
+
// TODO also introduce a ping/pong protocol for the client session <> devtools connection
|
93
|
+
// Ping,
|
94
|
+
).annotations({ identifier: 'LSD.MessageToAppClientSession' })
|
95
|
+
|
96
|
+
export type MessageToAppClientSession = typeof MessageToAppClientSession.Type
|
97
|
+
|
98
|
+
export const MessageFromAppClientSession = Schema.Union(
|
99
|
+
DebugInfoRes,
|
100
|
+
DebugInfoHistoryRes,
|
101
|
+
DebugInfoResetRes,
|
102
|
+
DebugInfoRerunQueryRes,
|
103
|
+
ReactivityGraphRes,
|
104
|
+
LiveQueriesRes,
|
105
|
+
Disconnect,
|
106
|
+
// Pong,
|
107
|
+
).annotations({ identifier: 'LSD.MessageFromAppClientSession' })
|
108
|
+
|
109
|
+
export type MessageFromAppClientSession = typeof MessageFromAppClientSession.Type
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import { Schema } from '@livestore/utils/effect'
|
2
|
+
|
3
|
+
import { liveStoreVersion as pkgVersion } from '../version.js'
|
4
|
+
|
5
|
+
const requestId = Schema.String
|
6
|
+
const clientId = Schema.String
|
7
|
+
const sessionId = Schema.String
|
8
|
+
const liveStoreVersion = Schema.Literal(pkgVersion)
|
9
|
+
|
10
|
+
export const LSDMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
|
11
|
+
Schema.TaggedStruct(tag, {
|
12
|
+
liveStoreVersion,
|
13
|
+
...fields,
|
14
|
+
}).annotations({ identifier: tag })
|
15
|
+
|
16
|
+
export const LSDChannelMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
|
17
|
+
LSDMessage(tag, {
|
18
|
+
...fields,
|
19
|
+
})
|
20
|
+
|
21
|
+
export const LSDClientSessionChannelMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(
|
22
|
+
tag: Tag,
|
23
|
+
fields: Fields,
|
24
|
+
) =>
|
25
|
+
LSDMessage(tag, {
|
26
|
+
clientId,
|
27
|
+
sessionId,
|
28
|
+
...fields,
|
29
|
+
})
|
30
|
+
|
31
|
+
export const LSDClientSessionReqResMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(
|
32
|
+
tag: Tag,
|
33
|
+
fields: Fields,
|
34
|
+
) =>
|
35
|
+
LSDMessage(tag, {
|
36
|
+
clientId,
|
37
|
+
sessionId,
|
38
|
+
requestId,
|
39
|
+
...fields,
|
40
|
+
})
|
41
|
+
|
42
|
+
export const LSDReqResMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
|
43
|
+
LSDChannelMessage(tag, {
|
44
|
+
requestId,
|
45
|
+
...fields,
|
46
|
+
})
|
47
|
+
|
48
|
+
export class Disconnect extends LSDClientSessionChannelMessage('LSD.Disconnect', {}) {}
|
49
|
+
|
50
|
+
export class Ping extends LSDReqResMessage('LSD.Ping', {}) {}
|
51
|
+
|
52
|
+
export class Pong extends LSDReqResMessage('LSD.Pong', {}) {}
|
@@ -0,0 +1,115 @@
|
|
1
|
+
import { Schema, Transferable } from '@livestore/utils/effect'
|
2
|
+
|
3
|
+
import { NetworkStatus } from '../adapter-types.js'
|
4
|
+
import * as MutationEvent from '../schema/MutationEvent.js'
|
5
|
+
import { Disconnect, LSDMessage, LSDReqResMessage, Ping, Pong } from './devtools-messages-common.js'
|
6
|
+
|
7
|
+
export class ResetAllDataReq extends LSDReqResMessage('LSD.Leader.ResetAllDataReq', {
|
8
|
+
mode: Schema.Literal('all-data', 'only-app-db'),
|
9
|
+
}) {}
|
10
|
+
|
11
|
+
export class ResetAllDataRes extends LSDReqResMessage('LSD.Leader.ResetAllDataRes', {}) {}
|
12
|
+
|
13
|
+
export class DatabaseFileInfoReq extends LSDReqResMessage('LSD.Leader.DatabaseFileInfoReq', {}) {}
|
14
|
+
|
15
|
+
export class DatabaseFileInfo extends Schema.Struct({
|
16
|
+
fileSize: Schema.Number,
|
17
|
+
persistenceInfo: Schema.Struct({ fileName: Schema.String }, { key: Schema.String, value: Schema.Any }),
|
18
|
+
}) {}
|
19
|
+
|
20
|
+
export class DatabaseFileInfoRes extends LSDReqResMessage('LSD.Leader.DatabaseFileInfoRes', {
|
21
|
+
readModel: DatabaseFileInfo,
|
22
|
+
mutationLog: DatabaseFileInfo,
|
23
|
+
}) {}
|
24
|
+
|
25
|
+
export class NetworkStatusSubscribe extends LSDReqResMessage('LSD.Leader.NetworkStatusSubscribe', {}) {}
|
26
|
+
export class NetworkStatusUnsubscribe extends LSDReqResMessage('LSD.Leader.NetworkStatusUnsubscribe', {}) {}
|
27
|
+
|
28
|
+
export class NetworkStatusRes extends LSDReqResMessage('LSD.Leader.NetworkStatusRes', {
|
29
|
+
networkStatus: NetworkStatus,
|
30
|
+
}) {}
|
31
|
+
|
32
|
+
export class SyncingInfoReq extends LSDReqResMessage('LSD.Leader.SyncingInfoReq', {}) {}
|
33
|
+
|
34
|
+
export class SyncingInfo extends Schema.Struct({
|
35
|
+
enabled: Schema.Boolean,
|
36
|
+
metadata: Schema.Record({ key: Schema.String, value: Schema.Any }),
|
37
|
+
}) {}
|
38
|
+
|
39
|
+
export class SyncingInfoRes extends LSDReqResMessage('LSD.Leader.SyncingInfoRes', {
|
40
|
+
syncingInfo: SyncingInfo,
|
41
|
+
}) {}
|
42
|
+
|
43
|
+
export class SyncHistorySubscribe extends LSDReqResMessage('LSD.Leader.SyncHistorySubscribe', {}) {}
|
44
|
+
export class SyncHistoryUnsubscribe extends LSDReqResMessage('LSD.Leader.SyncHistoryUnsubscribe', {}) {}
|
45
|
+
export class SyncHistoryRes extends LSDReqResMessage('LSD.Leader.SyncHistoryRes', {
|
46
|
+
mutationEventEncoded: MutationEvent.AnyEncodedGlobal,
|
47
|
+
metadata: Schema.Option(Schema.JsonValue),
|
48
|
+
}) {}
|
49
|
+
|
50
|
+
export class SnapshotReq extends LSDReqResMessage('LSD.Leader.SnapshotReq', {}) {}
|
51
|
+
|
52
|
+
export class SnapshotRes extends LSDReqResMessage('LSD.Leader.SnapshotRes', {
|
53
|
+
snapshot: Transferable.Uint8Array,
|
54
|
+
}) {}
|
55
|
+
|
56
|
+
export class LoadDatabaseFileReq extends LSDReqResMessage('LSD.Leader.LoadDatabaseFileReq', {
|
57
|
+
data: Transferable.Uint8Array,
|
58
|
+
}) {}
|
59
|
+
|
60
|
+
export class LoadDatabaseFileRes extends LSDReqResMessage('LSD.Leader.LoadDatabaseFileRes', {
|
61
|
+
status: Schema.Literal('ok', 'unsupported-file', 'unsupported-database'),
|
62
|
+
}) {}
|
63
|
+
|
64
|
+
// TODO refactor this to use push/pull semantics
|
65
|
+
export class MutationBroadcast extends LSDMessage('LSD.Leader.MutationBroadcast', {
|
66
|
+
mutationEventEncoded: MutationEvent.AnyEncoded,
|
67
|
+
}) {}
|
68
|
+
|
69
|
+
// TODO refactor this to use push/pull semantics
|
70
|
+
export class RunMutationReq extends LSDReqResMessage('LSD.Leader.RunMutationReq', {
|
71
|
+
mutationEventEncoded: MutationEvent.AnyEncoded.pipe(Schema.omit('id', 'parentId')),
|
72
|
+
}) {}
|
73
|
+
|
74
|
+
export class RunMutationRes extends LSDReqResMessage('LSD.Leader.RunMutationRes', {}) {}
|
75
|
+
|
76
|
+
export class MutationLogReq extends LSDReqResMessage('LSD.Leader.MutationLogReq', {}) {}
|
77
|
+
|
78
|
+
export class MutationLogRes extends LSDReqResMessage('LSD.Leader.MutationLogRes', {
|
79
|
+
mutationLog: Transferable.Uint8Array,
|
80
|
+
}) {}
|
81
|
+
|
82
|
+
export const MessageToAppLeader = Schema.Union(
|
83
|
+
SnapshotReq,
|
84
|
+
LoadDatabaseFileReq,
|
85
|
+
MutationLogReq,
|
86
|
+
ResetAllDataReq,
|
87
|
+
NetworkStatusSubscribe,
|
88
|
+
NetworkStatusUnsubscribe,
|
89
|
+
Disconnect,
|
90
|
+
RunMutationReq,
|
91
|
+
Ping,
|
92
|
+
DatabaseFileInfoReq,
|
93
|
+
SyncHistorySubscribe,
|
94
|
+
SyncHistoryUnsubscribe,
|
95
|
+
SyncingInfoReq,
|
96
|
+
).annotations({ identifier: 'LSD.MessageToAppLeader' })
|
97
|
+
|
98
|
+
export type MessageToAppLeader = typeof MessageToAppLeader.Type
|
99
|
+
|
100
|
+
export const MessageFromAppLeader = Schema.Union(
|
101
|
+
SnapshotRes,
|
102
|
+
LoadDatabaseFileRes,
|
103
|
+
MutationLogRes,
|
104
|
+
ResetAllDataRes,
|
105
|
+
Disconnect,
|
106
|
+
MutationBroadcast,
|
107
|
+
NetworkStatusRes,
|
108
|
+
RunMutationRes,
|
109
|
+
Pong,
|
110
|
+
DatabaseFileInfoRes,
|
111
|
+
SyncHistoryRes,
|
112
|
+
SyncingInfoRes,
|
113
|
+
).annotations({ identifier: 'LSD.MessageFromAppLeader' })
|
114
|
+
|
115
|
+
export type MessageFromAppLeader = typeof MessageFromAppLeader.Type
|