@livestore/sync-electric 0.3.0-dev.25 → 0.3.0-dev.27
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 +2 -0
- package/dist/api-schema.d.ts.map +1 -1
- package/dist/api-schema.js +1 -0
- package/dist/api-schema.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -24
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/api-schema.ts +1 -0
- package/src/index.ts +16 -34
- package/tmp/pack.tgz +0 -0
package/dist/api-schema.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export declare const PullPayload: Schema.Struct<{
|
|
|
16
16
|
_tag: Schema.tag<"@livestore/sync-electric.Pull">;
|
|
17
17
|
} & {
|
|
18
18
|
storeId: typeof Schema.String;
|
|
19
|
+
payload: Schema.UndefinedOr<Schema.Schema<Schema.JsonValue, Schema.JsonValue, never>>;
|
|
19
20
|
handle: Schema.Option<Schema.Struct<{
|
|
20
21
|
offset: typeof Schema.String;
|
|
21
22
|
handle: typeof Schema.String;
|
|
@@ -25,6 +26,7 @@ export declare const ApiPayload: Schema.Union<[Schema.Struct<{
|
|
|
25
26
|
_tag: Schema.tag<"@livestore/sync-electric.Pull">;
|
|
26
27
|
} & {
|
|
27
28
|
storeId: typeof Schema.String;
|
|
29
|
+
payload: Schema.UndefinedOr<Schema.Schema<Schema.JsonValue, Schema.JsonValue, never>>;
|
|
28
30
|
handle: Schema.Option<Schema.Struct<{
|
|
29
31
|
offset: typeof Schema.String;
|
|
30
32
|
handle: typeof Schema.String;
|
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;;;;;yBAiBo3D,OAAQ,MAAM;qBAAkB,OAAQ,GAAG;YAAS,OAAQ,WAAW,iBAAiB,cAAc;kBAAuD,OAAQ,WAAW,iBAAiB,cAAc;yBAA8D,OAAQ,MAAM;0BAAuB,OAAQ,MAAM;;EAd3oE,CAAA;AAEjE,eAAO,MAAM,WAAW;;;;;;;;;EASyC,CAAA;AAEjE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;yBACq3D,OAAQ,MAAM;qBAAkB,OAAQ,GAAG;YAAS,OAAQ,WAAW,iBAAiB,cAAc;kBAAuD,OAAQ,WAAW,iBAAiB,cAAc;yBAA8D,OAAQ,MAAM;0BAAuB,OAAQ,MAAM;;IAD5oE,CAAA"}
|
package/dist/api-schema.js
CHANGED
|
@@ -6,6 +6,7 @@ export const PushPayload = Schema.TaggedStruct('@livestore/sync-electric.Push',
|
|
|
6
6
|
}).annotations({ title: '@livestore/sync-electric.PushPayload' });
|
|
7
7
|
export const PullPayload = Schema.TaggedStruct('@livestore/sync-electric.Pull', {
|
|
8
8
|
storeId: Schema.String,
|
|
9
|
+
payload: Schema.UndefinedOr(Schema.JsonValue),
|
|
9
10
|
handle: Schema.Option(Schema.Struct({
|
|
10
11
|
offset: Schema.String,
|
|
11
12
|
handle: 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,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,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,aAAa,CAAC,gBAAgB,CAAC;CACpD,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,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;CACF,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"}
|
|
1
|
+
{"version":3,"file":"api-schema.js","sourceRoot":"","sources":["../src/api-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,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,aAAa,CAAC,gBAAgB,CAAC;CACpD,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;CACF,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"}
|
package/dist/index.d.ts
CHANGED
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,KAAK,EAA+B,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA+B,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAI5F,OAAO,EAOL,MAAM,EAGP,MAAM,yBAAyB,CAAA;AAIhC,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA;AA8E5C,eAAO,MAAM,WAAW,EAAS,GAAG,CAAA;AAEpC,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,kBAAkB,EAAE,SAAS,QAAQ,aAAY,CAAA;AAErG;;;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;;;;;CAwCA,CAAA;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;;;OAOG;IACH,QAAQ,EACJ,MAAM,GACN;QACE,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;CACN;AAED,eAAO,MAAM,YAAY;;;EAIvB,CAAA;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAA;IAEd,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,eAAe,GACzB,cAAc,kBAAkB,KAAG,sBAAsB,CAAC,YAAY,CAuInE,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAE3C,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,WAG1C,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { InvalidPullError, InvalidPushError } from '@livestore/common';
|
|
1
|
+
import { InvalidPullError, InvalidPushError, UnexpectedError } from '@livestore/common';
|
|
2
2
|
import { MutationEvent } from '@livestore/common/schema';
|
|
3
3
|
import { notYetImplemented, shouldNeverHappen } from '@livestore/utils';
|
|
4
|
-
import { Chunk,
|
|
4
|
+
import { Chunk, Effect, HttpClient, HttpClientRequest, HttpClientResponse, Option, Schema, Stream, SubscriptionRef, } from '@livestore/utils/effect';
|
|
5
5
|
import * as ApiSchema from './api-schema.js';
|
|
6
6
|
export * as ApiSchema from './api-schema.js';
|
|
7
7
|
/*
|
|
@@ -104,8 +104,9 @@ export const makeElectricUrl = ({ electricHost, searchParams: providedSearchPara
|
|
|
104
104
|
searchParams.set('handle', args.handle.value.handle);
|
|
105
105
|
searchParams.set('live', 'true');
|
|
106
106
|
}
|
|
107
|
+
const payload = args.payload;
|
|
107
108
|
const url = `${endpointUrl}?${searchParams.toString()}`;
|
|
108
|
-
return { url, storeId: args.storeId, needsInit: args.handle._tag === 'None' };
|
|
109
|
+
return { url, storeId: args.storeId, needsInit: args.handle._tag === 'None', payload };
|
|
109
110
|
};
|
|
110
111
|
export const SyncMetadata = Schema.Struct({
|
|
111
112
|
offset: Schema.String,
|
|
@@ -116,15 +117,14 @@ export const makeSyncBackend = ({ endpoint }) => ({ storeId, payload }) => Effec
|
|
|
116
117
|
const isConnected = yield* SubscriptionRef.make(true);
|
|
117
118
|
const pullEndpoint = typeof endpoint === 'string' ? endpoint : endpoint.pull;
|
|
118
119
|
const pushEndpoint = typeof endpoint === 'string' ? endpoint : endpoint.push;
|
|
119
|
-
// TODO check whether we still need this
|
|
120
|
-
const pendingPushDeferredMap = new Map();
|
|
121
120
|
const pull = (handle) => Effect.gen(function* () {
|
|
122
|
-
const argsJson = yield* Schema.encode(Schema.parseJson(ApiSchema.PullPayload))(ApiSchema.PullPayload.make({ storeId, handle }));
|
|
121
|
+
const argsJson = yield* Schema.encode(Schema.parseJson(ApiSchema.PullPayload))(ApiSchema.PullPayload.make({ storeId, handle, payload }));
|
|
123
122
|
const url = `${pullEndpoint}?args=${argsJson}`;
|
|
124
123
|
const resp = yield* HttpClient.get(url);
|
|
125
124
|
if (resp.status === 401) {
|
|
125
|
+
const body = yield* resp.text.pipe(Effect.catchAll(() => Effect.succeed('-')));
|
|
126
126
|
return yield* InvalidPullError.make({
|
|
127
|
-
message: `Unauthorized (401): Couldn't connect to ElectricSQL`,
|
|
127
|
+
message: `Unauthorized (401): Couldn't connect to ElectricSQL: ${body}`,
|
|
128
128
|
});
|
|
129
129
|
}
|
|
130
130
|
const headers = yield* HttpClientResponse.schemaHeaders(ResponseHeaders)(resp);
|
|
@@ -164,32 +164,22 @@ export const makeSyncBackend = ({ endpoint }) => ({ storeId, payload }) => Effec
|
|
|
164
164
|
// if (listenForNew === false && items.length === 0) {
|
|
165
165
|
// return Option.none()
|
|
166
166
|
// }
|
|
167
|
-
for (const item of items) {
|
|
168
|
-
const deferred = pendingPushDeferredMap.get(item.mutationEventEncoded.id);
|
|
169
|
-
if (deferred !== undefined) {
|
|
170
|
-
yield* Deferred.succeed(deferred, Option.getOrThrow(item.metadata));
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
167
|
return Option.some([Chunk.fromIterable(items), Option.some(nextHandle)]);
|
|
174
168
|
}).pipe(Effect.scoped, Effect.mapError((cause) => InvalidPullError.make({ message: cause.toString() })));
|
|
169
|
+
const pullEndpointHasSameOrigin = pullEndpoint.startsWith('/') ||
|
|
170
|
+
(globalThis.location !== undefined && globalThis.location.origin === new URL(pullEndpoint).origin);
|
|
175
171
|
return {
|
|
172
|
+
// If the pull endpoint has the same origin as the current page, we can assume that we already have a connection
|
|
173
|
+
// otherwise we send a HEAD request to speed up the connection process
|
|
174
|
+
connect: pullEndpointHasSameOrigin
|
|
175
|
+
? Effect.void
|
|
176
|
+
: HttpClient.head(pullEndpoint).pipe(UnexpectedError.mapToUnexpectedError),
|
|
176
177
|
pull: (args) => Stream.unfoldChunkEffect(args.pipe(Option.map((_) => _.metadata), Option.flatten), (metadataOption) => pull(metadataOption)).pipe(Stream.chunks, Stream.map((chunk) => ({ batch: [...chunk], remaining: 0 }))),
|
|
177
178
|
push: (batch) => Effect.gen(function* () {
|
|
178
|
-
const deferreds = [];
|
|
179
|
-
for (const mutationEventEncoded of batch) {
|
|
180
|
-
const deferred = yield* Deferred.make();
|
|
181
|
-
pendingPushDeferredMap.set(mutationEventEncoded.id, deferred);
|
|
182
|
-
deferreds.push(deferred);
|
|
183
|
-
}
|
|
184
179
|
const resp = yield* HttpClientRequest.schemaBodyJson(ApiSchema.PushPayload)(HttpClientRequest.post(pushEndpoint), ApiSchema.PushPayload.make({ storeId, batch })).pipe(Effect.andThen(HttpClient.execute), Effect.andThen(HttpClientResponse.schemaBodyJson(Schema.Struct({ success: Schema.Boolean }))), Effect.scoped, Effect.mapError((cause) => InvalidPushError.make({ reason: { _tag: 'Unexpected', message: cause.toString() } })));
|
|
185
180
|
if (!resp.success) {
|
|
186
181
|
yield* InvalidPushError.make({ reason: { _tag: 'Unexpected', message: 'Push failed' } });
|
|
187
182
|
}
|
|
188
|
-
const metadata = yield* Effect.all(deferreds, { concurrency: 'unbounded' }).pipe(Effect.map((_) => _.map(Option.some)));
|
|
189
|
-
for (const mutationEventEncoded of batch) {
|
|
190
|
-
pendingPushDeferredMap.delete(mutationEventEncoded.id);
|
|
191
|
-
}
|
|
192
|
-
return { metadata };
|
|
193
183
|
}),
|
|
194
184
|
isConnected,
|
|
195
185
|
metadata: {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/sync-electric",
|
|
3
|
-
"version": "0.3.0-dev.
|
|
3
|
+
"version": "0.3.0-dev.27",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"exports": {
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
}
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@livestore/common": "0.3.0-dev.
|
|
14
|
-
"@livestore/utils": "0.3.0-dev.
|
|
13
|
+
"@livestore/common": "0.3.0-dev.27",
|
|
14
|
+
"@livestore/utils": "0.3.0-dev.27"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {},
|
|
17
17
|
"publishConfig": {
|
package/src/api-schema.ts
CHANGED
|
@@ -8,6 +8,7 @@ export const PushPayload = Schema.TaggedStruct('@livestore/sync-electric.Push',
|
|
|
8
8
|
|
|
9
9
|
export const PullPayload = Schema.TaggedStruct('@livestore/sync-electric.Pull', {
|
|
10
10
|
storeId: Schema.String,
|
|
11
|
+
payload: Schema.UndefinedOr(Schema.JsonValue),
|
|
11
12
|
handle: Schema.Option(
|
|
12
13
|
Schema.Struct({
|
|
13
14
|
offset: Schema.String,
|
package/src/index.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import type { IsOfflineError, SyncBackend, SyncBackendConstructor } from '@livestore/common'
|
|
2
|
-
import { InvalidPullError, InvalidPushError } from '@livestore/common'
|
|
3
|
-
import type { EventId } from '@livestore/common/schema'
|
|
2
|
+
import { InvalidPullError, InvalidPushError, UnexpectedError } from '@livestore/common'
|
|
4
3
|
import { MutationEvent } from '@livestore/common/schema'
|
|
5
4
|
import { notYetImplemented, shouldNeverHappen } from '@livestore/utils'
|
|
6
|
-
import type { Scope } from '@livestore/utils/effect'
|
|
7
5
|
import {
|
|
8
6
|
Chunk,
|
|
9
|
-
Deferred,
|
|
10
7
|
Effect,
|
|
11
8
|
HttpClient,
|
|
12
9
|
HttpClientRequest,
|
|
@@ -161,9 +158,11 @@ export const makeElectricUrl = ({
|
|
|
161
158
|
searchParams.set('live', 'true')
|
|
162
159
|
}
|
|
163
160
|
|
|
161
|
+
const payload = args.payload
|
|
162
|
+
|
|
164
163
|
const url = `${endpointUrl}?${searchParams.toString()}`
|
|
165
164
|
|
|
166
|
-
return { url, storeId: args.storeId, needsInit: args.handle._tag === 'None' }
|
|
165
|
+
return { url, storeId: args.storeId, needsInit: args.handle._tag === 'None', payload }
|
|
167
166
|
}
|
|
168
167
|
|
|
169
168
|
export interface SyncBackendOptions {
|
|
@@ -203,9 +202,6 @@ export const makeSyncBackend =
|
|
|
203
202
|
const pullEndpoint = typeof endpoint === 'string' ? endpoint : endpoint.pull
|
|
204
203
|
const pushEndpoint = typeof endpoint === 'string' ? endpoint : endpoint.push
|
|
205
204
|
|
|
206
|
-
// TODO check whether we still need this
|
|
207
|
-
const pendingPushDeferredMap = new Map<EventId.GlobalEventId, Deferred.Deferred<SyncMetadata>>()
|
|
208
|
-
|
|
209
205
|
const pull = (
|
|
210
206
|
handle: Option.Option<SyncMetadata>,
|
|
211
207
|
): Effect.Effect<
|
|
@@ -223,15 +219,16 @@ export const makeSyncBackend =
|
|
|
223
219
|
> =>
|
|
224
220
|
Effect.gen(function* () {
|
|
225
221
|
const argsJson = yield* Schema.encode(Schema.parseJson(ApiSchema.PullPayload))(
|
|
226
|
-
ApiSchema.PullPayload.make({ storeId, handle }),
|
|
222
|
+
ApiSchema.PullPayload.make({ storeId, handle, payload }),
|
|
227
223
|
)
|
|
228
224
|
const url = `${pullEndpoint}?args=${argsJson}`
|
|
229
225
|
|
|
230
226
|
const resp = yield* HttpClient.get(url)
|
|
231
227
|
|
|
232
228
|
if (resp.status === 401) {
|
|
229
|
+
const body = yield* resp.text.pipe(Effect.catchAll(() => Effect.succeed('-')))
|
|
233
230
|
return yield* InvalidPullError.make({
|
|
234
|
-
message: `Unauthorized (401): Couldn't connect to ElectricSQL`,
|
|
231
|
+
message: `Unauthorized (401): Couldn't connect to ElectricSQL: ${body}`,
|
|
235
232
|
})
|
|
236
233
|
}
|
|
237
234
|
|
|
@@ -279,20 +276,22 @@ export const makeSyncBackend =
|
|
|
279
276
|
// return Option.none()
|
|
280
277
|
// }
|
|
281
278
|
|
|
282
|
-
for (const item of items) {
|
|
283
|
-
const deferred = pendingPushDeferredMap.get(item.mutationEventEncoded.id)
|
|
284
|
-
if (deferred !== undefined) {
|
|
285
|
-
yield* Deferred.succeed(deferred, Option.getOrThrow(item.metadata))
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
279
|
return Option.some([Chunk.fromIterable(items), Option.some(nextHandle)] as const)
|
|
290
280
|
}).pipe(
|
|
291
281
|
Effect.scoped,
|
|
292
282
|
Effect.mapError((cause) => InvalidPullError.make({ message: cause.toString() })),
|
|
293
283
|
)
|
|
294
284
|
|
|
285
|
+
const pullEndpointHasSameOrigin =
|
|
286
|
+
pullEndpoint.startsWith('/') ||
|
|
287
|
+
(globalThis.location !== undefined && globalThis.location.origin === new URL(pullEndpoint).origin)
|
|
288
|
+
|
|
295
289
|
return {
|
|
290
|
+
// If the pull endpoint has the same origin as the current page, we can assume that we already have a connection
|
|
291
|
+
// otherwise we send a HEAD request to speed up the connection process
|
|
292
|
+
connect: pullEndpointHasSameOrigin
|
|
293
|
+
? Effect.void
|
|
294
|
+
: HttpClient.head(pullEndpoint).pipe(UnexpectedError.mapToUnexpectedError),
|
|
296
295
|
pull: (args) =>
|
|
297
296
|
Stream.unfoldChunkEffect(
|
|
298
297
|
args.pipe(
|
|
@@ -307,13 +306,6 @@ export const makeSyncBackend =
|
|
|
307
306
|
|
|
308
307
|
push: (batch) =>
|
|
309
308
|
Effect.gen(function* () {
|
|
310
|
-
const deferreds: Deferred.Deferred<SyncMetadata>[] = []
|
|
311
|
-
for (const mutationEventEncoded of batch) {
|
|
312
|
-
const deferred = yield* Deferred.make<SyncMetadata>()
|
|
313
|
-
pendingPushDeferredMap.set(mutationEventEncoded.id, deferred)
|
|
314
|
-
deferreds.push(deferred)
|
|
315
|
-
}
|
|
316
|
-
|
|
317
309
|
const resp = yield* HttpClientRequest.schemaBodyJson(ApiSchema.PushPayload)(
|
|
318
310
|
HttpClientRequest.post(pushEndpoint),
|
|
319
311
|
ApiSchema.PushPayload.make({ storeId, batch }),
|
|
@@ -329,16 +321,6 @@ export const makeSyncBackend =
|
|
|
329
321
|
if (!resp.success) {
|
|
330
322
|
yield* InvalidPushError.make({ reason: { _tag: 'Unexpected', message: 'Push failed' } })
|
|
331
323
|
}
|
|
332
|
-
|
|
333
|
-
const metadata = yield* Effect.all(deferreds, { concurrency: 'unbounded' }).pipe(
|
|
334
|
-
Effect.map((_) => _.map(Option.some)),
|
|
335
|
-
)
|
|
336
|
-
|
|
337
|
-
for (const mutationEventEncoded of batch) {
|
|
338
|
-
pendingPushDeferredMap.delete(mutationEventEncoded.id)
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
return { metadata }
|
|
342
324
|
}),
|
|
343
325
|
isConnected,
|
|
344
326
|
metadata: {
|
package/tmp/pack.tgz
CHANGED
|
Binary file
|