@livestore/sync-electric 0.4.0-dev.9 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/api-schema.js +1 -1
- package/dist/api-schema.js.map +1 -1
- package/dist/index.d.ts +42 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -25
- package/dist/index.js.map +1 -1
- package/dist/make-electric-url.d.ts +21 -2
- package/dist/make-electric-url.d.ts.map +1 -1
- package/dist/make-electric-url.js +22 -3
- package/dist/make-electric-url.js.map +1 -1
- package/package.json +68 -12
- package/src/api-schema.ts +1 -1
- package/src/index.ts +75 -47
- package/src/make-electric-url.ts +23 -3
package/dist/api-schema.js
CHANGED
|
@@ -2,7 +2,7 @@ import { LiveStoreEvent } from '@livestore/common/schema';
|
|
|
2
2
|
import { Schema } from '@livestore/utils/effect';
|
|
3
3
|
export const PushPayload = Schema.TaggedStruct('@livestore/sync-electric.Push', {
|
|
4
4
|
storeId: Schema.String,
|
|
5
|
-
batch: Schema.Array(LiveStoreEvent.
|
|
5
|
+
batch: Schema.Array(LiveStoreEvent.Global.Encoded),
|
|
6
6
|
}).annotations({ title: '@livestore/sync-electric.PushPayload' });
|
|
7
7
|
export const PullPayload = Schema.TaggedStruct('@livestore/sync-electric.Pull', {
|
|
8
8
|
storeId: Schema.String,
|
package/dist/api-schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-schema.js","sourceRoot":"","sources":["../src/api-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,+BAA+B,EAAE;IAC9E,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"api-schema.js","sourceRoot":"","sources":["../src/api-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,+BAA+B,EAAE;IAC9E,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;CACnD,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,+BAA+B,EAAE;IAC9E,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC,MAAM,CACnB,MAAM,CAAC,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CACH;IACD,IAAI,EAAE,MAAM,CAAC,OAAO;CACrB,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;AAEhE,8BAA8B;AAC9B,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { type Duration, Schema } from '@livestore/utils/effect';
|
|
|
3
3
|
declare const InvalidOperationError_base: Schema.TaggedErrorClass<InvalidOperationError, "InvalidOperationError", {
|
|
4
4
|
readonly _tag: Schema.tag<"InvalidOperationError">;
|
|
5
5
|
} & {
|
|
6
|
-
operation: Schema.
|
|
6
|
+
operation: Schema.Literal<["delete", "update"]>;
|
|
7
7
|
message: typeof Schema.String;
|
|
8
8
|
}>;
|
|
9
9
|
export declare class InvalidOperationError extends InvalidOperationError_base {
|
|
@@ -47,5 +47,46 @@ export declare const SyncMetadata: Schema.Struct<{
|
|
|
47
47
|
handle: typeof Schema.String;
|
|
48
48
|
}>;
|
|
49
49
|
export type SyncMetadata = typeof SyncMetadata.Type;
|
|
50
|
+
/**
|
|
51
|
+
* Creates a sync backend that uses ElectricSQL for real-time event synchronization.
|
|
52
|
+
*
|
|
53
|
+
* ElectricSQL enables real-time sync by streaming PostgreSQL changes to clients.
|
|
54
|
+
* This backend handles push (inserting events) and pull (streaming events via Electric's
|
|
55
|
+
* shape-based sync protocol).
|
|
56
|
+
*
|
|
57
|
+
* The endpoint should typically be part of your API layer to handle authentication,
|
|
58
|
+
* rate limiting, and proxying requests to the Electric server.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* import { makeSyncBackend } from '@livestore/sync-electric'
|
|
63
|
+
*
|
|
64
|
+
* const adapter = makePersistedAdapter({
|
|
65
|
+
* sync: {
|
|
66
|
+
* backend: makeSyncBackend({
|
|
67
|
+
* endpoint: '/api/electric',
|
|
68
|
+
* }),
|
|
69
|
+
* },
|
|
70
|
+
* })
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* // With separate endpoints for push/pull/ping
|
|
76
|
+
* const backend = makeSyncBackend({
|
|
77
|
+
* endpoint: {
|
|
78
|
+
* push: '/api/push-event',
|
|
79
|
+
* pull: '/api/pull-events',
|
|
80
|
+
* ping: '/api/ping',
|
|
81
|
+
* },
|
|
82
|
+
* ping: {
|
|
83
|
+
* enabled: true,
|
|
84
|
+
* requestInterval: 15_000, // 15 seconds
|
|
85
|
+
* },
|
|
86
|
+
* })
|
|
87
|
+
* ```
|
|
88
|
+
*
|
|
89
|
+
* @see https://livestore.dev/docs/sync/electric for setup guide
|
|
90
|
+
*/
|
|
50
91
|
export declare const makeSyncBackend: ({ endpoint, ...options }: SyncBackendOptions) => SyncBackend.SyncBackendConstructor<SyncMetadata>;
|
|
51
92
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,WAAW,EAAgB,MAAM,mBAAmB,CAAA;AAGlF,OAAO,EACL,KAAK,QAAQ,EAQb,MAAM,EAGP,MAAM,yBAAyB,CAAA;;;;;;;AAIhC,qBAAa,qBAAsB,SAAQ,0BAGzC;CAAG;AAEL,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA;AAC5C,cAAc,wBAAwB,CAAA;AAkFtC,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,kBAAkB,EAAE,SAAS,QAAQ,aAAY,CAAA;AAErG,MAAM,WAAW,kBAAkB;IACjC;;;;;;;OAOG;IACH,QAAQ,EACJ,MAAM,GACN;QACE,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IAEL,IAAI,CAAC,EAAE;QACL;;WAEG;QACH,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB;;;WAGG;QACH,cAAc,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAA;QACvC;;;WAGG;QACH,eAAe,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAA;KACzC,CAAA;CACF;AAED,eAAO,MAAM,YAAY;;;EAIvB,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,eAAO,MAAM,eAAe,GACzB,0BAA0B,kBAAkB,KAAG,WAAW,CAAC,sBAAsB,CAAC,YAAY,CAyM3F,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SyncBackend, UnknownError } from '@livestore/common';
|
|
2
2
|
import { LiveStoreEvent } from '@livestore/common/schema';
|
|
3
3
|
import { notYetImplemented } from '@livestore/utils';
|
|
4
4
|
import { Effect, HttpClient, HttpClientRequest, HttpClientResponse, Option, ReadonlyArray, Schedule, Schema, Stream, SubscriptionRef, } from '@livestore/utils/effect';
|
|
5
5
|
import * as ApiSchema from "./api-schema.js";
|
|
6
|
-
export class InvalidOperationError extends Schema.TaggedError()('InvalidOperationError', {
|
|
7
|
-
operation: Schema.
|
|
6
|
+
export class InvalidOperationError extends Schema.TaggedError('~@livestore/sync-electric/InvalidOperationError')('InvalidOperationError', {
|
|
7
|
+
operation: Schema.Literal('delete', 'update'),
|
|
8
8
|
message: Schema.String,
|
|
9
9
|
}) {
|
|
10
10
|
}
|
|
@@ -57,10 +57,7 @@ const LiveStoreEventGlobalFromStringRecord = Schema.Struct({
|
|
|
57
57
|
clientId: Schema.String,
|
|
58
58
|
sessionId: Schema.String,
|
|
59
59
|
})
|
|
60
|
-
.pipe(Schema.
|
|
61
|
-
decode: (_) => _,
|
|
62
|
-
encode: (_) => _,
|
|
63
|
-
}))
|
|
60
|
+
.pipe(Schema.compose(LiveStoreEvent.Global.Encoded))
|
|
64
61
|
.annotations({ title: '@livestore/sync-electric:LiveStoreEventGlobalFromStringRecord' });
|
|
65
62
|
const ResponseItemInsert = Schema.Struct({
|
|
66
63
|
/** Postgres path (e.g. `"public"."events_9069baf0_b3e6_42f7_980f_188416eab3fx3"/"0"`) */
|
|
@@ -92,6 +89,47 @@ export const SyncMetadata = Schema.Struct({
|
|
|
92
89
|
// TODO move this into some kind of "global" sync metadata as it's the same for each event
|
|
93
90
|
handle: Schema.String,
|
|
94
91
|
});
|
|
92
|
+
/**
|
|
93
|
+
* Creates a sync backend that uses ElectricSQL for real-time event synchronization.
|
|
94
|
+
*
|
|
95
|
+
* ElectricSQL enables real-time sync by streaming PostgreSQL changes to clients.
|
|
96
|
+
* This backend handles push (inserting events) and pull (streaming events via Electric's
|
|
97
|
+
* shape-based sync protocol).
|
|
98
|
+
*
|
|
99
|
+
* The endpoint should typically be part of your API layer to handle authentication,
|
|
100
|
+
* rate limiting, and proxying requests to the Electric server.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* import { makeSyncBackend } from '@livestore/sync-electric'
|
|
105
|
+
*
|
|
106
|
+
* const adapter = makePersistedAdapter({
|
|
107
|
+
* sync: {
|
|
108
|
+
* backend: makeSyncBackend({
|
|
109
|
+
* endpoint: '/api/electric',
|
|
110
|
+
* }),
|
|
111
|
+
* },
|
|
112
|
+
* })
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```ts
|
|
117
|
+
* // With separate endpoints for push/pull/ping
|
|
118
|
+
* const backend = makeSyncBackend({
|
|
119
|
+
* endpoint: {
|
|
120
|
+
* push: '/api/push-event',
|
|
121
|
+
* pull: '/api/pull-events',
|
|
122
|
+
* ping: '/api/ping',
|
|
123
|
+
* },
|
|
124
|
+
* ping: {
|
|
125
|
+
* enabled: true,
|
|
126
|
+
* requestInterval: 15_000, // 15 seconds
|
|
127
|
+
* },
|
|
128
|
+
* })
|
|
129
|
+
* ```
|
|
130
|
+
*
|
|
131
|
+
* @see https://livestore.dev/docs/sync/electric for setup guide
|
|
132
|
+
*/
|
|
95
133
|
export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload }) => Effect.gen(function* () {
|
|
96
134
|
const isConnected = yield* SubscriptionRef.make(false);
|
|
97
135
|
const pullEndpoint = typeof endpoint === 'string' ? endpoint : endpoint.pull;
|
|
@@ -104,7 +142,7 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
104
142
|
const resp = yield* httpClient.get(url);
|
|
105
143
|
if (resp.status === 401) {
|
|
106
144
|
const body = yield* resp.text.pipe(Effect.catchAll(() => Effect.succeed('-')));
|
|
107
|
-
return yield*
|
|
145
|
+
return yield* new UnknownError({
|
|
108
146
|
cause: new Error(`Unauthorized (401): Couldn't connect to ElectricSQL: ${body}`),
|
|
109
147
|
});
|
|
110
148
|
}
|
|
@@ -127,9 +165,7 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
127
165
|
}
|
|
128
166
|
else if (resp.status < 200 || resp.status >= 300) {
|
|
129
167
|
const body = yield* resp.text;
|
|
130
|
-
return yield*
|
|
131
|
-
cause: new Error(`Unexpected status code: ${resp.status}: ${body}`),
|
|
132
|
-
});
|
|
168
|
+
return yield* new UnknownError({ cause: new Error(`Unexpected status code: ${resp.status}: ${body}`) });
|
|
133
169
|
}
|
|
134
170
|
const headers = yield* HttpClientResponse.schemaHeaders(ResponseHeaders)(resp);
|
|
135
171
|
const nextHandle = {
|
|
@@ -145,7 +181,7 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
145
181
|
onExcessProperty: 'preserve',
|
|
146
182
|
})(resp);
|
|
147
183
|
// Check for delete/update operations and throw descriptive error
|
|
148
|
-
const invalidOperations = ReadonlyArray.filterMap(allItems, (item) => Schema.is(ResponseItemInvalid)(item) ? Option.some(item.headers.operation) : Option.none());
|
|
184
|
+
const invalidOperations = ReadonlyArray.filterMap(allItems, (item) => Schema.is(ResponseItemInvalid)(item) === true ? Option.some(item.headers.operation) : Option.none());
|
|
149
185
|
if (invalidOperations.length > 0) {
|
|
150
186
|
const operation = invalidOperations[0];
|
|
151
187
|
return yield* new InvalidOperationError({
|
|
@@ -159,14 +195,14 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
159
195
|
}));
|
|
160
196
|
yield* Effect.annotateCurrentSpan({ itemsCount: items.length, nextHandle });
|
|
161
197
|
return Option.some([items, Option.some(nextHandle)]);
|
|
162
|
-
}).pipe(Effect.scoped, Effect.mapError((cause) =>
|
|
198
|
+
}).pipe(Effect.scoped, Effect.mapError((cause) => cause._tag === 'UnknownError' ? cause : new UnknownError({ cause })), Effect.withSpan('electric-provider:runPull', { attributes: { handle, live } }));
|
|
163
199
|
const pullEndpointHasSameOrigin = pullEndpoint.startsWith('/') ||
|
|
164
200
|
(globalThis.location !== undefined && globalThis.location.origin === new URL(pullEndpoint).origin);
|
|
165
201
|
const pingTimeout = options.ping?.requestTimeout ?? 10_000;
|
|
166
202
|
const ping = Effect.gen(function* () {
|
|
167
203
|
yield* httpClient.pipe(HttpClient.filterStatusOk).head(pingEndpoint);
|
|
168
204
|
yield* SubscriptionRef.set(isConnected, true);
|
|
169
|
-
}).pipe(
|
|
205
|
+
}).pipe(UnknownError.mapToUnknownError, Effect.timeout(pingTimeout), Effect.catchTag('TimeoutException', () => SubscriptionRef.set(isConnected, false)), Effect.withSpan('electric-provider:ping'));
|
|
170
206
|
const pingInterval = options.ping?.requestInterval ?? 10_000;
|
|
171
207
|
if (options.ping?.enabled !== false) {
|
|
172
208
|
// Automatically ping the server to keep the connection alive
|
|
@@ -174,16 +210,14 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
174
210
|
}
|
|
175
211
|
// If the pull endpoint has the same origin as the current page, we can assume that we already have a connection
|
|
176
212
|
// otherwise we send a HEAD request to speed up the connection process
|
|
177
|
-
const connect = pullEndpointHasSameOrigin
|
|
178
|
-
? Effect.void
|
|
179
|
-
: ping.pipe(UnexpectedError.mapToUnexpectedError);
|
|
213
|
+
const connect = pullEndpointHasSameOrigin === true ? Effect.void : ping.pipe(UnknownError.mapToUnknownError);
|
|
180
214
|
return SyncBackend.of({
|
|
181
215
|
connect,
|
|
182
216
|
pull: (cursor, options) => {
|
|
183
217
|
let hasEmittedAtLeastOnce = false;
|
|
184
218
|
return Stream.unfoldEffect(cursor.pipe(Option.flatMap((_) => _.metadata)), (metadataOption) => Effect.gen(function* () {
|
|
185
219
|
const result = yield* runPull(metadataOption, { live: options?.live ?? false });
|
|
186
|
-
if (Option.isNone(result))
|
|
220
|
+
if (Option.isNone(result) === true)
|
|
187
221
|
return Option.none();
|
|
188
222
|
const [batch, nextMetadataOption] = result.value;
|
|
189
223
|
// Continue pagination if we have data
|
|
@@ -192,7 +226,7 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
192
226
|
return Option.some([{ batch, hasMore: true }, nextMetadataOption]);
|
|
193
227
|
}
|
|
194
228
|
// Make sure we emit at least once even if there's no data or we're live-pulling
|
|
195
|
-
if (hasEmittedAtLeastOnce === false || options?.live) {
|
|
229
|
+
if (hasEmittedAtLeastOnce === false || options?.live === true) {
|
|
196
230
|
hasEmittedAtLeastOnce = true;
|
|
197
231
|
return Option.some([{ batch, hasMore: false }, nextMetadataOption]);
|
|
198
232
|
}
|
|
@@ -200,15 +234,15 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
200
234
|
return Option.none();
|
|
201
235
|
})).pipe(Stream.map(({ batch, hasMore }) => ({
|
|
202
236
|
batch,
|
|
203
|
-
pageInfo: hasMore ? SyncBackend.pageInfoMoreUnknown : SyncBackend.pageInfoNoMore,
|
|
237
|
+
pageInfo: hasMore === true ? SyncBackend.pageInfoMoreUnknown : SyncBackend.pageInfoNoMore,
|
|
204
238
|
})), Stream.withSpan('electric-provider:pull'));
|
|
205
239
|
},
|
|
206
|
-
push:
|
|
207
|
-
const resp = yield* HttpClientRequest.schemaBodyJson(ApiSchema.PushPayload)(HttpClientRequest.post(pushEndpoint), ApiSchema.PushPayload.make({ storeId, batch })).pipe(Effect.andThen(httpClient.pipe(HttpClient.filterStatusOk).execute), Effect.andThen(HttpClientResponse.schemaBodyJson(Schema.Struct({ success: Schema.Boolean }))), Effect.scoped, Effect.mapError((cause) =>
|
|
208
|
-
if (
|
|
209
|
-
return yield*
|
|
240
|
+
push: Effect.fn('electric-provider:push')(function* (batch) {
|
|
241
|
+
const resp = yield* HttpClientRequest.schemaBodyJson(ApiSchema.PushPayload)(HttpClientRequest.post(pushEndpoint), ApiSchema.PushPayload.make({ storeId, batch })).pipe(Effect.andThen(httpClient.pipe(HttpClient.filterStatusOk).execute), Effect.andThen(HttpClientResponse.schemaBodyJson(Schema.Struct({ success: Schema.Boolean }))), Effect.scoped, Effect.mapError((cause) => UnknownError.make({ cause })));
|
|
242
|
+
if (resp.success === false) {
|
|
243
|
+
return yield* new UnknownError({ cause: new Error('Push failed') });
|
|
210
244
|
}
|
|
211
|
-
})
|
|
245
|
+
}),
|
|
212
246
|
ping,
|
|
213
247
|
isConnected,
|
|
214
248
|
metadata: {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,9 +34,28 @@ export declare const makeElectricUrl: ({ electricHost, searchParams: providedSea
|
|
|
34
34
|
};
|
|
35
35
|
export declare const toTableName: (storeId: string) => string;
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
37
|
+
* CRITICAL: Increment this version whenever you modify the Postgres table schema structure.
|
|
38
38
|
*
|
|
39
|
-
*
|
|
39
|
+
* Bump required when:
|
|
40
|
+
* - Adding/removing/renaming columns in the eventlog table (see examples/web-todomvc-sync-electric/src/server/db.ts)
|
|
41
|
+
* - Changing column types or constraints
|
|
42
|
+
* - Modifying primary keys or indexes
|
|
43
|
+
*
|
|
44
|
+
* Bump NOT required when:
|
|
45
|
+
* - Changing query patterns or fetch logic
|
|
46
|
+
* - Adding new tables (as long as existing table schema remains unchanged)
|
|
47
|
+
* - Updating client-side implementation details
|
|
48
|
+
*
|
|
49
|
+
* Impact: Changing this version triggers a "soft reset" - new table names are created
|
|
50
|
+
* and old data becomes inaccessible (but remains in the database).
|
|
51
|
+
*
|
|
52
|
+
* Current schema (PostgreSQL):
|
|
53
|
+
* - seqNum (INTEGER PRIMARY KEY)
|
|
54
|
+
* - parentSeqNum (INTEGER)
|
|
55
|
+
* - name (TEXT NOT NULL)
|
|
56
|
+
* - args (JSONB NOT NULL)
|
|
57
|
+
* - clientId (TEXT NOT NULL)
|
|
58
|
+
* - sessionId (TEXT NOT NULL)
|
|
40
59
|
*/
|
|
41
60
|
export declare const PERSISTENCE_FORMAT_VERSION = 6;
|
|
42
61
|
//# sourceMappingURL=make-electric-url.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-electric-url.d.ts","sourceRoot":"","sources":["../src/make-electric-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,MAAM,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"make-electric-url.d.ts","sourceRoot":"","sources":["../src/make-electric-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAItD;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,0FAM7B;IACD,YAAY,EAAE,MAAM,CAAA;IACpB;;;;;OAKG;IACH,YAAY,EAAE,eAAe,CAAA;IAC7B,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,KAAG;IACF;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IACX,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAA;CA4CtC,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,WAe1C,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAA"}
|
|
@@ -35,7 +35,7 @@ export const makeElectricUrl = ({ electricHost, searchParams: providedSearchPara
|
|
|
35
35
|
else {
|
|
36
36
|
searchParams.set('offset', args.handle.value.offset);
|
|
37
37
|
searchParams.set('handle', args.handle.value.handle);
|
|
38
|
-
searchParams.set('live', args.live ? 'true' : 'false');
|
|
38
|
+
searchParams.set('live', args.live === true ? 'true' : 'false');
|
|
39
39
|
}
|
|
40
40
|
const payload = args.payload;
|
|
41
41
|
const url = `${endpointUrl}?${searchParams.toString()}`;
|
|
@@ -52,9 +52,28 @@ export const toTableName = (storeId) => {
|
|
|
52
52
|
return tableName;
|
|
53
53
|
};
|
|
54
54
|
/**
|
|
55
|
-
*
|
|
55
|
+
* CRITICAL: Increment this version whenever you modify the Postgres table schema structure.
|
|
56
56
|
*
|
|
57
|
-
*
|
|
57
|
+
* Bump required when:
|
|
58
|
+
* - Adding/removing/renaming columns in the eventlog table (see examples/web-todomvc-sync-electric/src/server/db.ts)
|
|
59
|
+
* - Changing column types or constraints
|
|
60
|
+
* - Modifying primary keys or indexes
|
|
61
|
+
*
|
|
62
|
+
* Bump NOT required when:
|
|
63
|
+
* - Changing query patterns or fetch logic
|
|
64
|
+
* - Adding new tables (as long as existing table schema remains unchanged)
|
|
65
|
+
* - Updating client-side implementation details
|
|
66
|
+
*
|
|
67
|
+
* Impact: Changing this version triggers a "soft reset" - new table names are created
|
|
68
|
+
* and old data becomes inaccessible (but remains in the database).
|
|
69
|
+
*
|
|
70
|
+
* Current schema (PostgreSQL):
|
|
71
|
+
* - seqNum (INTEGER PRIMARY KEY)
|
|
72
|
+
* - parentSeqNum (INTEGER)
|
|
73
|
+
* - name (TEXT NOT NULL)
|
|
74
|
+
* - args (JSONB NOT NULL)
|
|
75
|
+
* - clientId (TEXT NOT NULL)
|
|
76
|
+
* - sessionId (TEXT NOT NULL)
|
|
58
77
|
*/
|
|
59
78
|
export const PERSISTENCE_FORMAT_VERSION = 6;
|
|
60
79
|
//# sourceMappingURL=make-electric-url.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-electric-url.js","sourceRoot":"","sources":["../src/make-electric-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"make-electric-url.js","sourceRoot":"","sources":["../src/make-electric-url.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,25 +1,81 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/sync-electric",
|
|
3
|
-
"version": "0.4.0
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"license": "Apache-2.0",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/livestorejs/livestore.git"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"package.json",
|
|
12
|
+
"src"
|
|
13
|
+
],
|
|
4
14
|
"type": "module",
|
|
5
15
|
"sideEffects": false,
|
|
6
16
|
"exports": {
|
|
7
17
|
".": "./dist/index.js"
|
|
8
18
|
},
|
|
9
|
-
"dependencies": {
|
|
10
|
-
"@livestore/common": "0.4.0-dev.9",
|
|
11
|
-
"@livestore/utils": "0.4.0-dev.9"
|
|
12
|
-
},
|
|
13
|
-
"devDependencies": {},
|
|
14
|
-
"files": [
|
|
15
|
-
"package.json",
|
|
16
|
-
"src",
|
|
17
|
-
"dist"
|
|
18
|
-
],
|
|
19
|
-
"license": "Apache-2.0",
|
|
20
19
|
"publishConfig": {
|
|
21
20
|
"access": "public"
|
|
22
21
|
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@livestore/common": "^0.4.0",
|
|
24
|
+
"@livestore/utils": "^0.4.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@effect/ai": "0.35.0",
|
|
28
|
+
"@effect/cli": "0.75.1",
|
|
29
|
+
"@effect/cluster": "0.58.2",
|
|
30
|
+
"@effect/experimental": "0.60.0",
|
|
31
|
+
"@effect/opentelemetry": "0.63.0",
|
|
32
|
+
"@effect/platform": "0.96.1",
|
|
33
|
+
"@effect/platform-browser": "0.76.0",
|
|
34
|
+
"@effect/platform-bun": "0.89.0",
|
|
35
|
+
"@effect/platform-node": "0.106.0",
|
|
36
|
+
"@effect/printer": "0.49.0",
|
|
37
|
+
"@effect/printer-ansi": "0.49.0",
|
|
38
|
+
"@effect/rpc": "0.75.1",
|
|
39
|
+
"@effect/sql": "0.51.1",
|
|
40
|
+
"@effect/typeclass": "0.40.0",
|
|
41
|
+
"@effect/vitest": "0.29.0",
|
|
42
|
+
"@opentelemetry/api": "1.9.0",
|
|
43
|
+
"@opentelemetry/resources": "2.2.0",
|
|
44
|
+
"@standard-schema/spec": "1.1.0",
|
|
45
|
+
"effect": "3.21.2"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"@effect/ai": "^0.35.0",
|
|
49
|
+
"@effect/cli": "^0.75.1",
|
|
50
|
+
"@effect/cluster": "^0.58.2",
|
|
51
|
+
"@effect/experimental": "^0.60.0",
|
|
52
|
+
"@effect/opentelemetry": "^0.63.0",
|
|
53
|
+
"@effect/platform": "^0.96.1",
|
|
54
|
+
"@effect/platform-browser": "^0.76.0",
|
|
55
|
+
"@effect/platform-bun": "^0.89.0",
|
|
56
|
+
"@effect/platform-node": "^0.106.0",
|
|
57
|
+
"@effect/printer": "^0.49.0",
|
|
58
|
+
"@effect/printer-ansi": "^0.49.0",
|
|
59
|
+
"@effect/rpc": "^0.75.1",
|
|
60
|
+
"@effect/sql": "^0.51.1",
|
|
61
|
+
"@effect/typeclass": "^0.40.0",
|
|
62
|
+
"@effect/vitest": "^0.29.0",
|
|
63
|
+
"@opentelemetry/api": "^1.9.0",
|
|
64
|
+
"@opentelemetry/resources": "^2.2.0",
|
|
65
|
+
"@standard-schema/spec": "^1.1.0",
|
|
66
|
+
"effect": "^3.21.2"
|
|
67
|
+
},
|
|
68
|
+
"$genie": {
|
|
69
|
+
"source": "package.json.genie.ts",
|
|
70
|
+
"warning": "DO NOT EDIT - changes will be overwritten",
|
|
71
|
+
"workspaceClosureDirs": [
|
|
72
|
+
"packages/@livestore/common",
|
|
73
|
+
"packages/@livestore/sync-electric",
|
|
74
|
+
"packages/@livestore/utils",
|
|
75
|
+
"packages/@livestore/utils-dev",
|
|
76
|
+
"packages/@livestore/webmesh"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
23
79
|
"scripts": {
|
|
24
80
|
"build": "",
|
|
25
81
|
"test": "echo 'No tests yet'"
|
package/src/api-schema.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { Schema } from '@livestore/utils/effect'
|
|
|
3
3
|
|
|
4
4
|
export const PushPayload = Schema.TaggedStruct('@livestore/sync-electric.Push', {
|
|
5
5
|
storeId: Schema.String,
|
|
6
|
-
batch: Schema.Array(LiveStoreEvent.
|
|
6
|
+
batch: Schema.Array(LiveStoreEvent.Global.Encoded),
|
|
7
7
|
}).annotations({ title: '@livestore/sync-electric.PushPayload' })
|
|
8
8
|
|
|
9
9
|
export const PullPayload = Schema.TaggedStruct('@livestore/sync-electric.Pull', {
|