@livestore/sync-electric 0.4.0 → 0.5.0-dev.1
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.d.ts +45 -50
- package/dist/api-schema.d.ts.map +1 -1
- package/dist/api-schema.js +13 -7
- package/dist/api-schema.js.map +1 -1
- package/dist/api-schema.test.d.ts +2 -0
- package/dist/api-schema.test.d.ts.map +1 -0
- package/dist/api-schema.test.js +42 -0
- package/dist/api-schema.test.js.map +1 -0
- package/dist/index.d.ts +8 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -28
- package/dist/index.js.map +1 -1
- package/dist/make-electric-url.d.ts +1 -1
- package/dist/make-electric-url.d.ts.map +1 -1
- package/dist/make-electric-url.js +5 -5
- package/dist/make-electric-url.js.map +1 -1
- package/package.json +37 -54
- package/src/api-schema.test.ts +49 -0
- package/src/api-schema.ts +18 -10
- package/src/index.ts +31 -30
- package/src/make-electric-url.ts +5 -5
package/dist/api-schema.d.ts
CHANGED
|
@@ -1,60 +1,55 @@
|
|
|
1
1
|
import { Schema } from '@livestore/utils/effect';
|
|
2
2
|
export declare const PushPayload: Schema.Struct<{
|
|
3
|
-
_tag: Schema.tag<"@livestore/sync-electric.Push">;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
sessionId: typeof Schema.String;
|
|
3
|
+
readonly _tag: Schema.tag<"@livestore/sync-electric.Push">;
|
|
4
|
+
readonly storeId: Schema.String;
|
|
5
|
+
readonly batch: Schema.$Array<Schema.Struct<{
|
|
6
|
+
readonly name: Schema.String;
|
|
7
|
+
readonly args: Schema.Any;
|
|
8
|
+
readonly seqNum: Schema.brand<Schema.Int, "GlobalEventSequenceNumber">;
|
|
9
|
+
readonly parentSeqNum: Schema.brand<Schema.Int, "GlobalEventSequenceNumber">;
|
|
10
|
+
readonly clientId: Schema.String;
|
|
11
|
+
readonly sessionId: Schema.String;
|
|
13
12
|
}>>;
|
|
14
13
|
}>;
|
|
15
14
|
export declare const PullPayload: Schema.Struct<{
|
|
16
|
-
_tag: Schema.tag<"@livestore/sync-electric.Pull">;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
live: typeof Schema.Boolean;
|
|
15
|
+
readonly _tag: Schema.tag<"@livestore/sync-electric.Pull">;
|
|
16
|
+
readonly storeId: Schema.String;
|
|
17
|
+
readonly payload: Schema.optional<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
|
|
18
|
+
readonly handle: Schema.toCodecJson<Schema.Option<Schema.Struct<{
|
|
19
|
+
readonly offset: Schema.String;
|
|
20
|
+
readonly handle: Schema.String;
|
|
21
|
+
}>>>;
|
|
22
|
+
readonly live: Schema.Boolean;
|
|
25
23
|
}>;
|
|
26
|
-
export declare const ApiPayload: Schema.Union<[Schema.Struct<{
|
|
27
|
-
_tag: Schema.tag<"@livestore/sync-electric.Pull">;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
live: typeof Schema.Boolean;
|
|
24
|
+
export declare const ApiPayload: Schema.Union<readonly [Schema.Struct<{
|
|
25
|
+
readonly _tag: Schema.tag<"@livestore/sync-electric.Pull">;
|
|
26
|
+
readonly storeId: Schema.String;
|
|
27
|
+
readonly payload: Schema.optional<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
|
|
28
|
+
readonly handle: Schema.toCodecJson<Schema.Option<Schema.Struct<{
|
|
29
|
+
readonly offset: Schema.String;
|
|
30
|
+
readonly handle: Schema.String;
|
|
31
|
+
}>>>;
|
|
32
|
+
readonly live: Schema.Boolean;
|
|
36
33
|
}>, Schema.Struct<{
|
|
37
|
-
_tag: Schema.tag<"@livestore/sync-electric.Push">;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
sessionId: typeof Schema.String;
|
|
34
|
+
readonly _tag: Schema.tag<"@livestore/sync-electric.Push">;
|
|
35
|
+
readonly storeId: Schema.String;
|
|
36
|
+
readonly batch: Schema.$Array<Schema.Struct<{
|
|
37
|
+
readonly name: Schema.String;
|
|
38
|
+
readonly args: Schema.Any;
|
|
39
|
+
readonly seqNum: Schema.brand<Schema.Int, "GlobalEventSequenceNumber">;
|
|
40
|
+
readonly parentSeqNum: Schema.brand<Schema.Int, "GlobalEventSequenceNumber">;
|
|
41
|
+
readonly clientId: Schema.String;
|
|
42
|
+
readonly sessionId: Schema.String;
|
|
47
43
|
}>>;
|
|
48
44
|
}>]>;
|
|
49
|
-
export declare const ArgsSchema: Schema.
|
|
50
|
-
_tag: Schema.tag<"@livestore/sync-electric.Pull">;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}>>>;
|
|
45
|
+
export declare const ArgsSchema: Schema.compose<Schema.fromJsonString<Schema.Struct<{
|
|
46
|
+
readonly _tag: Schema.tag<"@livestore/sync-electric.Pull">;
|
|
47
|
+
readonly storeId: Schema.String;
|
|
48
|
+
readonly payload: Schema.optional<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
|
|
49
|
+
readonly handle: Schema.toCodecJson<Schema.Option<Schema.Struct<{
|
|
50
|
+
readonly offset: Schema.String;
|
|
51
|
+
readonly handle: Schema.String;
|
|
52
|
+
}>>>;
|
|
53
|
+
readonly live: Schema.Boolean;
|
|
54
|
+
}>>, Schema.StringFromUriComponent>;
|
|
60
55
|
//# sourceMappingURL=api-schema.d.ts.map
|
package/dist/api-schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-schema.d.ts","sourceRoot":"","sources":["../src/api-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"api-schema.d.ts","sourceRoot":"","sources":["../src/api-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,eAAO,MAAM,WAAW;;;;;;;;;;;EAGsC,CAAA;AAE9D,eAAO,MAAM,WAAW;;;;;;;;;EAkBsC,CAAA;AAE9D,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;IAA2C,CAAA;AAGlE,eAAO,MAAM,UAAU;;;;;;;;;mCAA0F,CAAA"}
|
package/dist/api-schema.js
CHANGED
|
@@ -3,17 +3,23 @@ import { Schema } from '@livestore/utils/effect';
|
|
|
3
3
|
export const PushPayload = Schema.TaggedStruct('@livestore/sync-electric.Push', {
|
|
4
4
|
storeId: Schema.String,
|
|
5
5
|
batch: Schema.Array(LiveStoreEvent.Global.Encoded),
|
|
6
|
-
}).
|
|
6
|
+
}).annotate({ title: '@livestore/sync-electric.PushPayload' });
|
|
7
7
|
export const PullPayload = Schema.TaggedStruct('@livestore/sync-electric.Pull', {
|
|
8
8
|
storeId: Schema.String,
|
|
9
|
-
payload
|
|
10
|
-
|
|
9
|
+
// `optional` so an absent payload is omitted from the JSON entirely (a required key with an
|
|
10
|
+
// `undefined` value would be dropped by `JSON.stringify` and then fail decoding as "Missing key").
|
|
11
|
+
payload: Schema.optional(Schema.Json),
|
|
12
|
+
// `toCodecJson` makes the `Option` encode to its JSON-safe struct form (`{ _tag: "None" }` /
|
|
13
|
+
// `{ _tag: "Some", value }`). A bare `Schema.Option` encodes to a runtime `Option`, whose
|
|
14
|
+
// `toJSON` leaks `{"_id":"Option",...}` when `fromJsonString` runs `JSON.stringify`, and that
|
|
15
|
+
// shape then fails to decode back into an `Option`.
|
|
16
|
+
handle: Schema.toCodecJson(Schema.Option(Schema.Struct({
|
|
11
17
|
offset: Schema.String,
|
|
12
18
|
handle: Schema.String,
|
|
13
|
-
})),
|
|
19
|
+
}))),
|
|
14
20
|
live: Schema.Boolean,
|
|
15
|
-
}).
|
|
16
|
-
export const ApiPayload = Schema.Union(PullPayload, PushPayload);
|
|
21
|
+
}).annotate({ title: '@livestore/sync-electric.PullPayload' });
|
|
22
|
+
export const ApiPayload = Schema.Union([PullPayload, PushPayload]);
|
|
17
23
|
// Format for the query params
|
|
18
|
-
export const ArgsSchema = Schema.
|
|
24
|
+
export const ArgsSchema = Schema.StringFromUriComponent.pipe(Schema.decodeTo(Schema.fromJsonString(PullPayload)));
|
|
19
25
|
//# sourceMappingURL=api-schema.js.map
|
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,MAAM,CAAC,OAAO,CAAC;CACnD,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,QAAQ,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC,CAAA;AAE9D,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,+BAA+B,EAAE;IAC9E,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,4FAA4F;IAC5F,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;IACrC,6FAA6F;IAC7F,0FAA0F;IAC1F,8FAA8F;IAC9F,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,MAAM,CACX,MAAM,CAAC,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CACH,CACF;IACD,IAAI,EAAE,MAAM,CAAC,OAAO;CACrB,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC,CAAA;AAE9D,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAA;AAElE,8BAA8B;AAC9B,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-schema.test.d.ts","sourceRoot":"","sources":["../src/api-schema.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Option, Schema } from '@livestore/utils/effect';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import * as ApiSchema from './api-schema.js';
|
|
4
|
+
import { makeElectricUrl } from './make-electric-url.js';
|
|
5
|
+
const HandleStruct = { offset: 'off-1', handle: 'h-1' };
|
|
6
|
+
const cases = [
|
|
7
|
+
{ name: 'none + no payload', storeId: 's1', payload: undefined, handle: Option.none(), live: false },
|
|
8
|
+
{ name: 'some + payload', storeId: 's2', payload: { foo: 'bar' }, handle: Option.some(HandleStruct), live: true },
|
|
9
|
+
{ name: 'none + payload present', storeId: 's3', payload: { a: 1 }, handle: Option.none(), live: false },
|
|
10
|
+
{ name: 'some + no payload', storeId: 's4', payload: undefined, handle: Option.some(HandleStruct), live: true },
|
|
11
|
+
{ name: 'none + null payload', storeId: 's5', payload: null, handle: Option.none(), live: false },
|
|
12
|
+
];
|
|
13
|
+
describe('sync-electric ArgsSchema round-trip', () => {
|
|
14
|
+
for (const c of cases) {
|
|
15
|
+
it(`round-trips ${c.name}`, () => {
|
|
16
|
+
const input = ApiSchema.PullPayload.make({
|
|
17
|
+
storeId: c.storeId,
|
|
18
|
+
payload: c.payload,
|
|
19
|
+
handle: c.handle,
|
|
20
|
+
live: c.live,
|
|
21
|
+
});
|
|
22
|
+
const encoded = Schema.encodeSync(ApiSchema.ArgsSchema)(input);
|
|
23
|
+
expect(typeof encoded).toBe('string');
|
|
24
|
+
const decoded = Schema.decodeSync(ApiSchema.ArgsSchema)(encoded);
|
|
25
|
+
expect(Option.isOption(decoded.handle)).toBe(true);
|
|
26
|
+
expect(decoded.handle._tag).toBe(c.handle._tag);
|
|
27
|
+
if (Option.isSome(c.handle) === true) {
|
|
28
|
+
expect(decoded.handle.value).toEqual(HandleStruct);
|
|
29
|
+
}
|
|
30
|
+
expect(decoded.payload).toEqual(c.payload);
|
|
31
|
+
expect(decoded.storeId).toBe(c.storeId);
|
|
32
|
+
expect(decoded.live).toBe(c.live);
|
|
33
|
+
// Full path through makeElectricUrl: URLSearchParams -> Struct({ args }) -> ArgsSchema
|
|
34
|
+
const searchParams = new URLSearchParams({ args: encoded });
|
|
35
|
+
const result = makeElectricUrl({ electricHost: 'http://electric.test', searchParams });
|
|
36
|
+
expect(result.storeId).toBe(c.storeId);
|
|
37
|
+
expect(result.needsInit).toBe(Option.isNone(c.handle));
|
|
38
|
+
expect(result.payload).toEqual(c.payload);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=api-schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-schema.test.js","sourceRoot":"","sources":["../src/api-schema.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { SyncBackend } from '@livestore/common';
|
|
2
2
|
import { type Duration, Schema } from '@livestore/utils/effect';
|
|
3
|
-
declare const InvalidOperationError_base: Schema.
|
|
4
|
-
readonly
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
message: typeof Schema.String;
|
|
8
|
-
}>;
|
|
3
|
+
declare const InvalidOperationError_base: Schema.Class<InvalidOperationError, Schema.TaggedStruct<"InvalidOperationError", {
|
|
4
|
+
readonly operation: Schema.Literals<readonly ["delete", "update"]>;
|
|
5
|
+
readonly message: Schema.String;
|
|
6
|
+
}>, import("effect/Cause").YieldableError>;
|
|
9
7
|
export declare class InvalidOperationError extends InvalidOperationError_base {
|
|
10
8
|
}
|
|
11
9
|
export * as ApiSchema from './api-schema.ts';
|
|
@@ -34,17 +32,17 @@ export interface SyncBackendOptions {
|
|
|
34
32
|
* How long to wait for a ping response before timing out
|
|
35
33
|
* @default 10 seconds
|
|
36
34
|
*/
|
|
37
|
-
requestTimeout?: Duration.
|
|
35
|
+
requestTimeout?: Duration.Input;
|
|
38
36
|
/**
|
|
39
37
|
* How often to send ping requests
|
|
40
38
|
* @default 10 seconds
|
|
41
39
|
*/
|
|
42
|
-
requestInterval?: Duration.
|
|
40
|
+
requestInterval?: Duration.Input;
|
|
43
41
|
};
|
|
44
42
|
}
|
|
45
43
|
export declare const SyncMetadata: Schema.Struct<{
|
|
46
|
-
offset:
|
|
47
|
-
handle:
|
|
44
|
+
readonly offset: Schema.String;
|
|
45
|
+
readonly handle: Schema.String;
|
|
48
46
|
}>;
|
|
49
47
|
export type SyncMetadata = typeof SyncMetadata.Type;
|
|
50
48
|
/**
|
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,EAAuB,WAAW,EAAgB,MAAM,mBAAmB,CAAA;AAGlF,OAAO,EACL,KAAK,QAAQ,
|
|
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,EASb,MAAM,EAGP,MAAM,yBAAyB,CAAA;;;;;AAIhC,qBAAa,qBAAsB,SAAQ,0BAKzC;CAAG;AAEL,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA;AAC5C,cAAc,wBAAwB,CAAA;AAkFtC,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,kBAAkB,WAAW,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,KAAK,CAAA;QAC/B;;;WAGG;QACH,eAAe,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;KACjC,CAAA;CACF;AAED,eAAO,MAAM,YAAY;;;EAIvB,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,eAAO,MAAM,eAAe,6BACC,kBAAkB,KAAG,WAAW,CAAC,sBAAsB,CAAC,YAAY,CAuM3F,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { SyncBackend, UnknownError } from '@livestore/common';
|
|
2
2
|
import { LiveStoreEvent } from '@livestore/common/schema';
|
|
3
3
|
import { notYetImplemented } from '@livestore/utils';
|
|
4
|
-
import { Effect, HttpClient, HttpClientRequest, HttpClientResponse, Option, ReadonlyArray, Schedule, Schema, Stream, SubscriptionRef, } from '@livestore/utils/effect';
|
|
5
|
-
import * as ApiSchema from
|
|
4
|
+
import { Effect, HttpClient, HttpClientRequest, HttpClientResponse, Option, ReadonlyArray, Result, Schedule, Schema, Stream, SubscriptionRef, } from '@livestore/utils/effect';
|
|
5
|
+
import * as ApiSchema from './api-schema.js';
|
|
6
6
|
export class InvalidOperationError extends Schema.TaggedError('~@livestore/sync-electric/InvalidOperationError')('InvalidOperationError', {
|
|
7
|
-
operation: Schema.
|
|
7
|
+
operation: Schema.Literals(['delete', 'update']),
|
|
8
8
|
message: Schema.String,
|
|
9
9
|
}) {
|
|
10
10
|
}
|
|
11
|
-
export * as ApiSchema from
|
|
12
|
-
export * from
|
|
11
|
+
export * as ApiSchema from './api-schema.js';
|
|
12
|
+
export * from './make-electric-url.js';
|
|
13
13
|
/*
|
|
14
14
|
Example data:
|
|
15
15
|
|
|
@@ -50,33 +50,33 @@ Also see: https://github.com/electric-sql/electric/blob/main/packages/typescript
|
|
|
50
50
|
|
|
51
51
|
*/
|
|
52
52
|
const LiveStoreEventGlobalFromStringRecord = Schema.Struct({
|
|
53
|
-
seqNum: Schema.
|
|
54
|
-
parentSeqNum: Schema.
|
|
53
|
+
seqNum: Schema.FiniteFromString,
|
|
54
|
+
parentSeqNum: Schema.FiniteFromString,
|
|
55
55
|
name: Schema.String,
|
|
56
|
-
args: Schema.
|
|
56
|
+
args: Schema.fromJsonString(Schema.Any),
|
|
57
57
|
clientId: Schema.String,
|
|
58
58
|
sessionId: Schema.String,
|
|
59
59
|
})
|
|
60
|
-
.pipe(Schema.
|
|
61
|
-
.
|
|
60
|
+
.pipe(Schema.decodeTo(LiveStoreEvent.Global.Encoded))
|
|
61
|
+
.annotate({ title: '@livestore/sync-electric:LiveStoreEventGlobalFromStringRecord' });
|
|
62
62
|
const ResponseItemInsert = Schema.Struct({
|
|
63
63
|
/** Postgres path (e.g. `"public"."events_9069baf0_b3e6_42f7_980f_188416eab3fx3"/"0"`) */
|
|
64
64
|
key: Schema.optional(Schema.String),
|
|
65
65
|
value: LiveStoreEventGlobalFromStringRecord,
|
|
66
66
|
headers: Schema.Struct({ operation: Schema.Literal('insert'), relation: Schema.Array(Schema.String) }),
|
|
67
|
-
}).
|
|
67
|
+
}).annotate({ title: '@livestore/sync-electric:ResponseItemInsert' });
|
|
68
68
|
const ResponseItemInvalid = Schema.Struct({
|
|
69
69
|
/** Postgres path (e.g. `"public"."events_9069baf0_b3e6_42f7_980f_188416eab3fx3"/"0"`) */
|
|
70
70
|
key: Schema.optional(Schema.String),
|
|
71
71
|
value: Schema.Any,
|
|
72
|
-
headers: Schema.Struct({ operation: Schema.
|
|
73
|
-
}).
|
|
72
|
+
headers: Schema.Struct({ operation: Schema.Literals(['update', 'delete']), relation: Schema.Array(Schema.String) }),
|
|
73
|
+
}).annotate({ title: '@livestore/sync-electric:ResponseItemInvalid' });
|
|
74
74
|
const ResponseItemControl = Schema.Struct({
|
|
75
75
|
key: Schema.optional(Schema.String),
|
|
76
76
|
value: Schema.optional(Schema.Any),
|
|
77
77
|
headers: Schema.Struct({ control: Schema.String }),
|
|
78
|
-
}).
|
|
79
|
-
const ResponseItem = Schema.Union(ResponseItemInsert, ResponseItemInvalid, ResponseItemControl);
|
|
78
|
+
}).annotate({ title: '@livestore/sync-electric:ResponseItemControl' });
|
|
79
|
+
const ResponseItem = Schema.Union([ResponseItemInsert, ResponseItemInvalid, ResponseItemControl]);
|
|
80
80
|
const ResponseHeaders = Schema.Struct({
|
|
81
81
|
'electric-handle': Schema.String,
|
|
82
82
|
// 'electric-schema': Schema.parseJson(Schema.Any),
|
|
@@ -137,11 +137,11 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
137
137
|
const pingEndpoint = typeof endpoint === 'string' ? endpoint : endpoint.ping;
|
|
138
138
|
const httpClient = yield* HttpClient.HttpClient;
|
|
139
139
|
const runPull = (handle, { live }) => Effect.gen(function* () {
|
|
140
|
-
const argsJson = yield* Schema.
|
|
140
|
+
const argsJson = yield* Schema.encodeEffect(ApiSchema.ArgsSchema)(ApiSchema.PullPayload.make({ storeId, handle, payload, live }));
|
|
141
141
|
const url = `${pullEndpoint}?args=${argsJson}`;
|
|
142
142
|
const resp = yield* httpClient.get(url);
|
|
143
143
|
if (resp.status === 401) {
|
|
144
|
-
const body = yield* resp.text.pipe(Effect.
|
|
144
|
+
const body = yield* resp.text.pipe(Effect.orElseSucceed(() => '-'));
|
|
145
145
|
return yield* new UnknownError({
|
|
146
146
|
cause: new Error(`Unauthorized (401): Couldn't connect to ElectricSQL: ${body}`),
|
|
147
147
|
});
|
|
@@ -177,11 +177,9 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
177
177
|
if (resp.status === 204) {
|
|
178
178
|
return Option.some([[], Option.some(nextHandle)]);
|
|
179
179
|
}
|
|
180
|
-
const allItems = yield* HttpClientResponse.schemaBodyJson(Schema.Array(ResponseItem)
|
|
181
|
-
onExcessProperty: 'preserve',
|
|
182
|
-
})(resp);
|
|
180
|
+
const allItems = yield* HttpClientResponse.schemaBodyJson(Schema.Array(ResponseItem))(resp);
|
|
183
181
|
// Check for delete/update operations and throw descriptive error
|
|
184
|
-
const invalidOperations = ReadonlyArray.filterMap(allItems, (item) => Schema.is(ResponseItemInvalid)(item) === true ?
|
|
182
|
+
const invalidOperations = ReadonlyArray.filterMap(allItems, (item) => Schema.is(ResponseItemInvalid)(item) === true ? Result.succeed(item.headers.operation) : Result.failVoid);
|
|
185
183
|
if (invalidOperations.length > 0) {
|
|
186
184
|
const operation = invalidOperations[0];
|
|
187
185
|
return yield* new InvalidOperationError({
|
|
@@ -195,14 +193,17 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
195
193
|
}));
|
|
196
194
|
yield* Effect.annotateCurrentSpan({ itemsCount: items.length, nextHandle });
|
|
197
195
|
return Option.some([items, Option.some(nextHandle)]);
|
|
198
|
-
}).pipe(Effect.scoped, Effect.mapError((cause) => cause
|
|
196
|
+
}).pipe(Effect.scoped, Effect.mapError((cause) => (Schema.is(UnknownError)(cause) === true ? cause : new UnknownError({ cause }))), Effect.withSpan('electric-provider:runPull', { attributes: { handle, live } }));
|
|
199
197
|
const pullEndpointHasSameOrigin = pullEndpoint.startsWith('/') ||
|
|
200
198
|
(globalThis.location !== undefined && globalThis.location.origin === new URL(pullEndpoint).origin);
|
|
201
199
|
const pingTimeout = options.ping?.requestTimeout ?? 10_000;
|
|
202
200
|
const ping = Effect.gen(function* () {
|
|
203
201
|
yield* httpClient.pipe(HttpClient.filterStatusOk).head(pingEndpoint);
|
|
204
202
|
yield* SubscriptionRef.set(isConnected, true);
|
|
205
|
-
}).pipe(UnknownError.mapToUnknownError, Effect.
|
|
203
|
+
}).pipe(UnknownError.mapToUnknownError, Effect.timeoutOrElse({
|
|
204
|
+
duration: pingTimeout,
|
|
205
|
+
orElse: () => SubscriptionRef.set(isConnected, false),
|
|
206
|
+
}), Effect.withSpan('electric-provider:ping'));
|
|
206
207
|
const pingInterval = options.ping?.requestInterval ?? 10_000;
|
|
207
208
|
if (options.ping?.enabled !== false) {
|
|
208
209
|
// Automatically ping the server to keep the connection alive
|
|
@@ -215,23 +216,23 @@ export const makeSyncBackend = ({ endpoint, ...options }) => ({ storeId, payload
|
|
|
215
216
|
connect,
|
|
216
217
|
pull: (cursor, options) => {
|
|
217
218
|
let hasEmittedAtLeastOnce = false;
|
|
218
|
-
return Stream.
|
|
219
|
+
return Stream.unfold(cursor.pipe(Option.flatMap((_) => _.metadata)), (metadataOption) => Effect.gen(function* () {
|
|
219
220
|
const result = yield* runPull(metadataOption, { live: options?.live ?? false });
|
|
220
221
|
if (Option.isNone(result) === true)
|
|
221
|
-
return
|
|
222
|
+
return undefined;
|
|
222
223
|
const [batch, nextMetadataOption] = result.value;
|
|
223
224
|
// Continue pagination if we have data
|
|
224
225
|
if (batch.length > 0) {
|
|
225
226
|
hasEmittedAtLeastOnce = true;
|
|
226
|
-
return
|
|
227
|
+
return [{ batch, hasMore: true }, nextMetadataOption];
|
|
227
228
|
}
|
|
228
229
|
// Make sure we emit at least once even if there's no data or we're live-pulling
|
|
229
230
|
if (hasEmittedAtLeastOnce === false || options?.live === true) {
|
|
230
231
|
hasEmittedAtLeastOnce = true;
|
|
231
|
-
return
|
|
232
|
+
return [{ batch, hasMore: false }, nextMetadataOption];
|
|
232
233
|
}
|
|
233
234
|
// Stop on empty batch (when not live)
|
|
234
|
-
return
|
|
235
|
+
return undefined;
|
|
235
236
|
})).pipe(Stream.map(({ batch, hasMore }) => ({
|
|
236
237
|
batch,
|
|
237
238
|
pageInfo: hasMore === true ? SyncBackend.pageInfoMoreUnknown : SyncBackend.pageInfoNoMore,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAEL,MAAM,EACN,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,EACN,aAAa,EACb,QAAQ,EACR,MAAM,EACN,MAAM,EACN,eAAe,GAChB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA;AAE5C,MAAM,OAAO,qBAAsB,SAAQ,MAAM,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ export declare const makeElectricUrl: ({ electricHost, searchParams: providedSea
|
|
|
30
30
|
*/
|
|
31
31
|
needsInit: boolean;
|
|
32
32
|
/** Sync payload provided by the client */
|
|
33
|
-
payload: Schema.
|
|
33
|
+
payload: Schema.Json | undefined;
|
|
34
34
|
};
|
|
35
35
|
export declare const toTableName: (storeId: string) => string;
|
|
36
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-electric-url.d.ts","sourceRoot":"","sources":["../src/make-electric-url.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"make-electric-url.d.ts","sourceRoot":"","sources":["../src/make-electric-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAI9D;;;GAGG;AACH,eAAO,MAAM,eAAe,6FAMzB;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,IAAI,GAAG,SAAS,CAAA;CA4CjC,CAAA;AAED,eAAO,MAAM,WAAW,YAAa,MAAM,WAe1C,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { shouldNeverHappen } from '@livestore/utils';
|
|
2
|
-
import { Hash, Schema } from '@livestore/utils/effect';
|
|
3
|
-
import * as ApiSchema from
|
|
2
|
+
import { Hash, Result, Schema } from '@livestore/utils/effect';
|
|
3
|
+
import * as ApiSchema from './api-schema.js';
|
|
4
4
|
/**
|
|
5
5
|
* This function should be called in a trusted environment (e.g. a proxy server) as it
|
|
6
6
|
* requires access to senstive information (e.g. `apiSecret` / `sourceSecret`).
|
|
@@ -8,11 +8,11 @@ import * as ApiSchema from "./api-schema.js";
|
|
|
8
8
|
export const makeElectricUrl = ({ electricHost, searchParams: providedSearchParams, sourceId, sourceSecret, apiSecret, }) => {
|
|
9
9
|
const endpointUrl = `${electricHost}/v1/shape`;
|
|
10
10
|
const UrlParamsSchema = Schema.Struct({ args: ApiSchema.ArgsSchema });
|
|
11
|
-
const argsResult = Schema.
|
|
12
|
-
if (argsResult
|
|
11
|
+
const argsResult = Schema.decodeUnknownResult(UrlParamsSchema)(Object.fromEntries(providedSearchParams.entries()));
|
|
12
|
+
if (Result.isFailure(argsResult) === true) {
|
|
13
13
|
return shouldNeverHappen('Invalid search params provided to makeElectricUrl', providedSearchParams, Object.fromEntries(providedSearchParams.entries()));
|
|
14
14
|
}
|
|
15
|
-
const args = argsResult.
|
|
15
|
+
const args = argsResult.success.args;
|
|
16
16
|
const tableName = toTableName(args.storeId);
|
|
17
17
|
// TODO refactor with Effect URLSearchParams schema
|
|
18
18
|
// https://electric-sql.com/openapi.html
|
|
@@ -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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"}
|