@livestore/sync-electric 0.4.0-dev.21 → 0.4.0-dev.23
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.map +1 -1
- package/dist/index.js +15 -19
- package/dist/index.js.map +1 -1
- package/dist/make-electric-url.d.ts.map +1 -1
- package/dist/make-electric-url.js +1 -1
- package/dist/make-electric-url.js.map +1 -1
- package/package.json +68 -12
- package/src/index.ts +30 -32
- package/src/make-electric-url.ts +2 -1
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,9 +1,9 @@
|
|
|
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', {
|
|
6
|
+
export class InvalidOperationError extends Schema.TaggedError('~@livestore/sync-electric/InvalidOperationError')('InvalidOperationError', {
|
|
7
7
|
operation: Schema.Literal('delete', 'update'),
|
|
8
8
|
message: Schema.String,
|
|
9
9
|
}) {
|
|
@@ -142,7 +142,7 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
142
142
|
const resp = yield* httpClient.get(url);
|
|
143
143
|
if (resp.status === 401) {
|
|
144
144
|
const body = yield* resp.text.pipe(Effect.catchAll(() => Effect.succeed('-')));
|
|
145
|
-
return yield*
|
|
145
|
+
return yield* new UnknownError({
|
|
146
146
|
cause: new Error(`Unauthorized (401): Couldn't connect to ElectricSQL: ${body}`),
|
|
147
147
|
});
|
|
148
148
|
}
|
|
@@ -165,9 +165,7 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
165
165
|
}
|
|
166
166
|
else if (resp.status < 200 || resp.status >= 300) {
|
|
167
167
|
const body = yield* resp.text;
|
|
168
|
-
return yield*
|
|
169
|
-
cause: new Error(`Unexpected status code: ${resp.status}: ${body}`),
|
|
170
|
-
});
|
|
168
|
+
return yield* new UnknownError({ cause: new Error(`Unexpected status code: ${resp.status}: ${body}`) });
|
|
171
169
|
}
|
|
172
170
|
const headers = yield* HttpClientResponse.schemaHeaders(ResponseHeaders)(resp);
|
|
173
171
|
const nextHandle = {
|
|
@@ -183,7 +181,7 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
183
181
|
onExcessProperty: 'preserve',
|
|
184
182
|
})(resp);
|
|
185
183
|
// Check for delete/update operations and throw descriptive error
|
|
186
|
-
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());
|
|
187
185
|
if (invalidOperations.length > 0) {
|
|
188
186
|
const operation = invalidOperations[0];
|
|
189
187
|
return yield* new InvalidOperationError({
|
|
@@ -197,7 +195,7 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
197
195
|
}));
|
|
198
196
|
yield* Effect.annotateCurrentSpan({ itemsCount: items.length, nextHandle });
|
|
199
197
|
return Option.some([items, Option.some(nextHandle)]);
|
|
200
|
-
}).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 } }));
|
|
201
199
|
const pullEndpointHasSameOrigin = pullEndpoint.startsWith('/') ||
|
|
202
200
|
(globalThis.location !== undefined && globalThis.location.origin === new URL(pullEndpoint).origin);
|
|
203
201
|
const pingTimeout = options.ping?.requestTimeout ?? 10_000;
|
|
@@ -212,16 +210,14 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
212
210
|
}
|
|
213
211
|
// If the pull endpoint has the same origin as the current page, we can assume that we already have a connection
|
|
214
212
|
// otherwise we send a HEAD request to speed up the connection process
|
|
215
|
-
const connect = pullEndpointHasSameOrigin
|
|
216
|
-
? Effect.void
|
|
217
|
-
: ping.pipe(UnknownError.mapToUnknownError);
|
|
213
|
+
const connect = pullEndpointHasSameOrigin === true ? Effect.void : ping.pipe(UnknownError.mapToUnknownError);
|
|
218
214
|
return SyncBackend.of({
|
|
219
215
|
connect,
|
|
220
216
|
pull: (cursor, options) => {
|
|
221
217
|
let hasEmittedAtLeastOnce = false;
|
|
222
218
|
return Stream.unfoldEffect(cursor.pipe(Option.flatMap((_) => _.metadata)), (metadataOption) => Effect.gen(function* () {
|
|
223
219
|
const result = yield* runPull(metadataOption, { live: options?.live ?? false });
|
|
224
|
-
if (Option.isNone(result))
|
|
220
|
+
if (Option.isNone(result) === true)
|
|
225
221
|
return Option.none();
|
|
226
222
|
const [batch, nextMetadataOption] = result.value;
|
|
227
223
|
// Continue pagination if we have data
|
|
@@ -230,7 +226,7 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
230
226
|
return Option.some([{ batch, hasMore: true }, nextMetadataOption]);
|
|
231
227
|
}
|
|
232
228
|
// Make sure we emit at least once even if there's no data or we're live-pulling
|
|
233
|
-
if (hasEmittedAtLeastOnce === false || options?.live) {
|
|
229
|
+
if (hasEmittedAtLeastOnce === false || options?.live === true) {
|
|
234
230
|
hasEmittedAtLeastOnce = true;
|
|
235
231
|
return Option.some([{ batch, hasMore: false }, nextMetadataOption]);
|
|
236
232
|
}
|
|
@@ -238,15 +234,15 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
238
234
|
return Option.none();
|
|
239
235
|
})).pipe(Stream.map(({ batch, hasMore }) => ({
|
|
240
236
|
batch,
|
|
241
|
-
pageInfo: hasMore ? SyncBackend.pageInfoMoreUnknown : SyncBackend.pageInfoNoMore,
|
|
237
|
+
pageInfo: hasMore === true ? SyncBackend.pageInfoMoreUnknown : SyncBackend.pageInfoNoMore,
|
|
242
238
|
})), Stream.withSpan('electric-provider:pull'));
|
|
243
239
|
},
|
|
244
|
-
push:
|
|
245
|
-
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) =>
|
|
246
|
-
if (
|
|
247
|
-
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') });
|
|
248
244
|
}
|
|
249
|
-
})
|
|
245
|
+
}),
|
|
250
246
|
ping,
|
|
251
247
|
isConnected,
|
|
252
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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"}
|
|
@@ -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()}`;
|
|
@@ -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-dev.
|
|
3
|
+
"version": "0.4.0-dev.23",
|
|
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.21",
|
|
11
|
-
"@livestore/utils": "0.4.0-dev.21"
|
|
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-dev.23",
|
|
24
|
+
"@livestore/utils": "^0.4.0-dev.23"
|
|
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/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type IsOfflineError, SyncBackend, UnknownError } from '@livestore/common'
|
|
2
2
|
import { LiveStoreEvent } from '@livestore/common/schema'
|
|
3
3
|
import { notYetImplemented } from '@livestore/utils'
|
|
4
4
|
import {
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
|
|
18
18
|
import * as ApiSchema from './api-schema.ts'
|
|
19
19
|
|
|
20
|
-
export class InvalidOperationError extends Schema.TaggedError<InvalidOperationError>()('InvalidOperationError', {
|
|
20
|
+
export class InvalidOperationError extends Schema.TaggedError<InvalidOperationError>('~@livestore/sync-electric/InvalidOperationError')('InvalidOperationError', {
|
|
21
21
|
operation: Schema.Literal('delete', 'update'),
|
|
22
22
|
message: Schema.String,
|
|
23
23
|
}) {}
|
|
@@ -217,7 +217,7 @@ export const makeSyncBackend =
|
|
|
217
217
|
Option.Option<SyncMetadata>,
|
|
218
218
|
]
|
|
219
219
|
>,
|
|
220
|
-
|
|
220
|
+
UnknownError | IsOfflineError
|
|
221
221
|
> =>
|
|
222
222
|
Effect.gen(function* () {
|
|
223
223
|
const argsJson = yield* Schema.encode(ApiSchema.ArgsSchema)(
|
|
@@ -229,7 +229,7 @@ export const makeSyncBackend =
|
|
|
229
229
|
|
|
230
230
|
if (resp.status === 401) {
|
|
231
231
|
const body = yield* resp.text.pipe(Effect.catchAll(() => Effect.succeed('-')))
|
|
232
|
-
return yield*
|
|
232
|
+
return yield* new UnknownError({
|
|
233
233
|
cause: new Error(`Unauthorized (401): Couldn't connect to ElectricSQL: ${body}`),
|
|
234
234
|
})
|
|
235
235
|
} else if (resp.status === 400) {
|
|
@@ -250,9 +250,7 @@ export const makeSyncBackend =
|
|
|
250
250
|
return notYetImplemented(`Electric shape not found`)
|
|
251
251
|
} else if (resp.status < 200 || resp.status >= 300) {
|
|
252
252
|
const body = yield* resp.text
|
|
253
|
-
return yield*
|
|
254
|
-
cause: new Error(`Unexpected status code: ${resp.status}: ${body}`),
|
|
255
|
-
})
|
|
253
|
+
return yield* new UnknownError({ cause: new Error(`Unexpected status code: ${resp.status}: ${body}`) })
|
|
256
254
|
}
|
|
257
255
|
|
|
258
256
|
const headers = yield* HttpClientResponse.schemaHeaders(ResponseHeaders)(resp)
|
|
@@ -273,7 +271,7 @@ export const makeSyncBackend =
|
|
|
273
271
|
|
|
274
272
|
// Check for delete/update operations and throw descriptive error
|
|
275
273
|
const invalidOperations = ReadonlyArray.filterMap(allItems, (item) =>
|
|
276
|
-
Schema.is(ResponseItemInvalid)(item) ? Option.some(item.headers.operation) : Option.none(),
|
|
274
|
+
Schema.is(ResponseItemInvalid)(item) === true ? Option.some(item.headers.operation) : Option.none(),
|
|
277
275
|
)
|
|
278
276
|
|
|
279
277
|
if (invalidOperations.length > 0) {
|
|
@@ -286,7 +284,7 @@ export const makeSyncBackend =
|
|
|
286
284
|
|
|
287
285
|
const items = allItems.filter(Schema.is(ResponseItemInsert)).map((item) => ({
|
|
288
286
|
metadata: Option.some({ offset: nextHandle.offset, handle: nextHandle.handle }),
|
|
289
|
-
eventEncoded: item.value
|
|
287
|
+
eventEncoded: item.value,
|
|
290
288
|
}))
|
|
291
289
|
|
|
292
290
|
yield* Effect.annotateCurrentSpan({ itemsCount: items.length, nextHandle })
|
|
@@ -294,7 +292,9 @@ export const makeSyncBackend =
|
|
|
294
292
|
return Option.some([items, Option.some(nextHandle)] as const)
|
|
295
293
|
}).pipe(
|
|
296
294
|
Effect.scoped,
|
|
297
|
-
Effect.mapError((cause) =>
|
|
295
|
+
Effect.mapError((cause) =>
|
|
296
|
+
cause._tag === 'UnknownError' ? cause : new UnknownError({ cause }),
|
|
297
|
+
),
|
|
298
298
|
Effect.withSpan('electric-provider:runPull', { attributes: { handle, live } }),
|
|
299
299
|
)
|
|
300
300
|
|
|
@@ -324,9 +324,8 @@ export const makeSyncBackend =
|
|
|
324
324
|
|
|
325
325
|
// If the pull endpoint has the same origin as the current page, we can assume that we already have a connection
|
|
326
326
|
// otherwise we send a HEAD request to speed up the connection process
|
|
327
|
-
const connect: SyncBackend.SyncBackend<SyncMetadata>['connect'] =
|
|
328
|
-
? Effect.void
|
|
329
|
-
: ping.pipe(UnknownError.mapToUnknownError)
|
|
327
|
+
const connect: SyncBackend.SyncBackend<SyncMetadata>['connect'] =
|
|
328
|
+
pullEndpointHasSameOrigin === true ? Effect.void : ping.pipe(UnknownError.mapToUnknownError)
|
|
330
329
|
|
|
331
330
|
return SyncBackend.of({
|
|
332
331
|
connect,
|
|
@@ -336,7 +335,7 @@ export const makeSyncBackend =
|
|
|
336
335
|
return Stream.unfoldEffect(cursor.pipe(Option.flatMap((_) => _.metadata)), (metadataOption) =>
|
|
337
336
|
Effect.gen(function* () {
|
|
338
337
|
const result = yield* runPull(metadataOption, { live: options?.live ?? false })
|
|
339
|
-
if (Option.isNone(result)) return Option.none()
|
|
338
|
+
if (Option.isNone(result) === true) return Option.none()
|
|
340
339
|
|
|
341
340
|
const [batch, nextMetadataOption] = result.value
|
|
342
341
|
|
|
@@ -347,7 +346,7 @@ export const makeSyncBackend =
|
|
|
347
346
|
}
|
|
348
347
|
|
|
349
348
|
// Make sure we emit at least once even if there's no data or we're live-pulling
|
|
350
|
-
if (hasEmittedAtLeastOnce === false || options?.live) {
|
|
349
|
+
if (hasEmittedAtLeastOnce === false || options?.live === true) {
|
|
351
350
|
hasEmittedAtLeastOnce = true
|
|
352
351
|
return Option.some([{ batch, hasMore: false }, nextMetadataOption])
|
|
353
352
|
}
|
|
@@ -358,28 +357,27 @@ export const makeSyncBackend =
|
|
|
358
357
|
).pipe(
|
|
359
358
|
Stream.map(({ batch, hasMore }) => ({
|
|
360
359
|
batch,
|
|
361
|
-
pageInfo: hasMore ? SyncBackend.pageInfoMoreUnknown : SyncBackend.pageInfoNoMore,
|
|
360
|
+
pageInfo: hasMore === true ? SyncBackend.pageInfoMoreUnknown : SyncBackend.pageInfoNoMore,
|
|
362
361
|
})),
|
|
363
362
|
Stream.withSpan('electric-provider:pull'),
|
|
364
363
|
)
|
|
365
364
|
},
|
|
366
365
|
|
|
367
|
-
push: (batch)
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
}).pipe(Effect.withSpan('electric-provider:push')),
|
|
366
|
+
push: Effect.fn('electric-provider:push')(function* (batch) {
|
|
367
|
+
const resp = yield* HttpClientRequest.schemaBodyJson(ApiSchema.PushPayload)(
|
|
368
|
+
HttpClientRequest.post(pushEndpoint),
|
|
369
|
+
ApiSchema.PushPayload.make({ storeId, batch }),
|
|
370
|
+
).pipe(
|
|
371
|
+
Effect.andThen(httpClient.pipe(HttpClient.filterStatusOk).execute),
|
|
372
|
+
Effect.andThen(HttpClientResponse.schemaBodyJson(Schema.Struct({ success: Schema.Boolean }))),
|
|
373
|
+
Effect.scoped,
|
|
374
|
+
Effect.mapError((cause) => UnknownError.make({ cause })),
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
if (resp.success === false) {
|
|
378
|
+
return yield* new UnknownError({ cause: new Error('Push failed') })
|
|
379
|
+
}
|
|
380
|
+
}),
|
|
383
381
|
ping,
|
|
384
382
|
isConnected,
|
|
385
383
|
metadata: {
|
package/src/make-electric-url.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { shouldNeverHappen } from '@livestore/utils'
|
|
2
2
|
import { Hash, Schema } from '@livestore/utils/effect'
|
|
3
|
+
|
|
3
4
|
import * as ApiSchema from './api-schema.ts'
|
|
4
5
|
|
|
5
6
|
/**
|
|
@@ -75,7 +76,7 @@ export const makeElectricUrl = ({
|
|
|
75
76
|
} else {
|
|
76
77
|
searchParams.set('offset', args.handle.value.offset)
|
|
77
78
|
searchParams.set('handle', args.handle.value.handle)
|
|
78
|
-
searchParams.set('live', args.live ? 'true' : 'false')
|
|
79
|
+
searchParams.set('live', args.live === true ? 'true' : 'false')
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
const payload = args.payload
|