@electric-sql/client 1.0.9 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cjs/index.cjs +421 -26
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +93 -6
- package/dist/index.browser.mjs +3 -3
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.d.ts +93 -6
- package/dist/index.legacy-esm.js +408 -26
- package/dist/index.legacy-esm.js.map +1 -1
- package/dist/index.mjs +420 -26
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -2
- package/src/client.ts +243 -8
- package/src/constants.ts +14 -0
- package/src/expired-shapes-cache.ts +72 -0
- package/src/fetch.ts +19 -1
- package/src/helpers.ts +34 -1
- package/src/index.ts +5 -1
- package/src/parser.ts +12 -1
- package/src/shape.ts +104 -14
- package/src/snapshot-tracker.ts +88 -0
- package/src/types.ts +48 -8
package/dist/cjs/index.d.cts
CHANGED
|
@@ -6,17 +6,30 @@ type Value<Extensions = never> = string | number | boolean | bigint | null | Ext
|
|
|
6
6
|
[key: string]: Value<Extensions>;
|
|
7
7
|
};
|
|
8
8
|
type Row<Extensions = never> = Record<string, Value<Extensions>>;
|
|
9
|
-
type GetExtensions<T extends Row<
|
|
10
|
-
type Offset = `-1` | `${number}_${number}` | `${bigint}_${number}`;
|
|
9
|
+
type GetExtensions<T> = [T] extends [Row<never>] ? never : [T] extends [Row<infer E>] ? E : never;
|
|
10
|
+
type Offset = `-1` | `now` | `${number}_${number}` | `${bigint}_${number}`;
|
|
11
|
+
/** Information about transaction visibility for a snapshot. All fields are encoded as strings, but should be treated as uint64. */
|
|
12
|
+
type PostgresSnapshot = {
|
|
13
|
+
xmin: `${bigint}`;
|
|
14
|
+
xmax: `${bigint}`;
|
|
15
|
+
xip_list: `${bigint}`[];
|
|
16
|
+
};
|
|
17
|
+
type NormalizedPgSnapshot = {
|
|
18
|
+
xmin: bigint;
|
|
19
|
+
xmax: bigint;
|
|
20
|
+
xip_list: bigint[];
|
|
21
|
+
};
|
|
11
22
|
interface Header {
|
|
12
23
|
[key: Exclude<string, `operation` | `control`>]: Value;
|
|
13
24
|
}
|
|
14
25
|
type Operation = `insert` | `update` | `delete`;
|
|
15
26
|
type ControlMessage = {
|
|
16
|
-
headers: Header & {
|
|
27
|
+
headers: (Header & {
|
|
17
28
|
control: `up-to-date` | `must-refetch`;
|
|
18
29
|
global_last_seen_lsn?: string;
|
|
19
|
-
}
|
|
30
|
+
}) | (Header & {
|
|
31
|
+
control: `snapshot-end`;
|
|
32
|
+
} & PostgresSnapshot);
|
|
20
33
|
};
|
|
21
34
|
type ChangeMessage<T extends Row<unknown> = Row> = {
|
|
22
35
|
key: string;
|
|
@@ -24,6 +37,7 @@ type ChangeMessage<T extends Row<unknown> = Row> = {
|
|
|
24
37
|
old_value?: Partial<T>;
|
|
25
38
|
headers: Header & {
|
|
26
39
|
operation: Operation;
|
|
40
|
+
txids?: number[];
|
|
27
41
|
};
|
|
28
42
|
};
|
|
29
43
|
type Message<T extends Row<unknown> = Row> = ControlMessage | ChangeMessage<T>;
|
|
@@ -78,6 +92,20 @@ type TypedMessages<T extends Row<unknown> = Row> = {
|
|
|
78
92
|
schema: ColumnInfo;
|
|
79
93
|
};
|
|
80
94
|
type MaybePromise<T> = T | Promise<T>;
|
|
95
|
+
/**
|
|
96
|
+
* Metadata that allows the consumer to know which changes have been incorporated into this snapshot.
|
|
97
|
+
*
|
|
98
|
+
* For any data that has a known transaction ID `xid` (and e.g. a key that's part of the snapshot):
|
|
99
|
+
* - if `xid` < `xmin` - included, change can be skipped
|
|
100
|
+
* - if `xid` < `xmax` AND `xid` not in `xip` - included, change can be skipped
|
|
101
|
+
* - if `xid` < `xmax` AND `xid` in `xip` - parallel, not included, change must be processed
|
|
102
|
+
* - if `xid` >= `xmax` - not included, change must be processed, and we can stop filtering after we see this
|
|
103
|
+
*/
|
|
104
|
+
type SnapshotMetadata = {
|
|
105
|
+
/** Random number that's reflected in the `snapshot_mark` header on the snapshot items. */
|
|
106
|
+
snapshot_mark: number;
|
|
107
|
+
database_lsn: string;
|
|
108
|
+
} & PostgresSnapshot;
|
|
81
109
|
|
|
82
110
|
type Token = string;
|
|
83
111
|
type ParseFunction<Extensions = never> = (value: Token, additionalInfo?: Omit<ColumnInfo, `type` | `dims`>) => Value<Extensions>;
|
|
@@ -88,6 +116,7 @@ type ParseFunction<Extensions = never> = (value: Token, additionalInfo?: Omit<Co
|
|
|
88
116
|
type Parser<Extensions = never> = {
|
|
89
117
|
[key: string]: ParseFunction<Extensions>;
|
|
90
118
|
};
|
|
119
|
+
type TransformFunction<Extensions = never> = (message: Row<Extensions>) => Row<Extensions>;
|
|
91
120
|
|
|
92
121
|
declare class FetchError extends Error {
|
|
93
122
|
url: string;
|
|
@@ -125,6 +154,7 @@ declare const OFFSET_QUERY_PARAM = "offset";
|
|
|
125
154
|
declare const ELECTRIC_PROTOCOL_QUERY_PARAMS: Array<string>;
|
|
126
155
|
|
|
127
156
|
type Replica = `full` | `default`;
|
|
157
|
+
type LogMode = `changes_only` | `full`;
|
|
128
158
|
/**
|
|
129
159
|
* PostgreSQL-specific shape parameters that can be provided externally
|
|
130
160
|
*/
|
|
@@ -174,7 +204,14 @@ type ExternalParamsRecord<T extends Row<unknown> = Row> = {
|
|
|
174
204
|
} & Partial<PostgresParams<T>> & {
|
|
175
205
|
[K in ReservedParamKeys]?: never;
|
|
176
206
|
};
|
|
177
|
-
type
|
|
207
|
+
type SubsetParams = {
|
|
208
|
+
where?: string;
|
|
209
|
+
params?: Record<string, string>;
|
|
210
|
+
limit?: number;
|
|
211
|
+
offset?: number;
|
|
212
|
+
orderBy?: string;
|
|
213
|
+
};
|
|
214
|
+
type ReservedParamKeys = typeof LIVE_CACHE_BUSTER_QUERY_PARAM | typeof SHAPE_HANDLE_QUERY_PARAM | typeof LIVE_QUERY_PARAM | typeof OFFSET_QUERY_PARAM | `subset__${string}`;
|
|
178
215
|
/**
|
|
179
216
|
* External headers type - what users provide.
|
|
180
217
|
* Allows string or function values for any header.
|
|
@@ -244,10 +281,15 @@ interface ShapeStreamOptions<T = never> {
|
|
|
244
281
|
* Experimental support for Server-Sent Events (SSE) for live updates.
|
|
245
282
|
*/
|
|
246
283
|
experimentalLiveSse?: boolean;
|
|
284
|
+
/**
|
|
285
|
+
* Initial data loading mode
|
|
286
|
+
*/
|
|
287
|
+
mode?: LogMode;
|
|
247
288
|
signal?: AbortSignal;
|
|
248
289
|
fetchClient?: typeof fetch;
|
|
249
290
|
backoffOptions?: BackoffOptions;
|
|
250
291
|
parser?: Parser<T>;
|
|
292
|
+
transformer?: TransformFunction<T>;
|
|
251
293
|
/**
|
|
252
294
|
* A function for handling shapestream errors.
|
|
253
295
|
* This is optional, when it is not provided any shapestream errors will be thrown.
|
|
@@ -271,7 +313,18 @@ interface ShapeStreamInterface<T extends Row<unknown> = Row> {
|
|
|
271
313
|
lastOffset: Offset;
|
|
272
314
|
shapeHandle?: string;
|
|
273
315
|
error?: unknown;
|
|
316
|
+
mode: LogMode;
|
|
274
317
|
forceDisconnectAndRefresh(): Promise<void>;
|
|
318
|
+
requestSnapshot(params: {
|
|
319
|
+
where?: string;
|
|
320
|
+
params?: Record<string, string>;
|
|
321
|
+
limit: number;
|
|
322
|
+
offset?: number;
|
|
323
|
+
orderBy: string;
|
|
324
|
+
}): Promise<{
|
|
325
|
+
metadata: SnapshotMetadata;
|
|
326
|
+
data: Array<Message<T>>;
|
|
327
|
+
}>;
|
|
275
328
|
}
|
|
276
329
|
/**
|
|
277
330
|
* Reads updates to a shape from Electric using HTTP requests and long polling or
|
|
@@ -324,6 +377,7 @@ declare class ShapeStream<T extends Row<unknown> = Row> implements ShapeStreamIn
|
|
|
324
377
|
get error(): unknown;
|
|
325
378
|
get isUpToDate(): boolean;
|
|
326
379
|
get lastOffset(): Offset;
|
|
380
|
+
get mode(): LogMode;
|
|
327
381
|
subscribe(callback: (messages: Message<T>[]) => MaybePromise<void>, onError?: (error: Error) => void): () => void;
|
|
328
382
|
unsubscribeAll(): void;
|
|
329
383
|
/** Unix time at which we last synced. Undefined when `isLoading` is true. */
|
|
@@ -343,6 +397,24 @@ declare class ShapeStream<T extends Row<unknown> = Row> implements ShapeStreamIn
|
|
|
343
397
|
* latest LSN from Postgres at that point in time.
|
|
344
398
|
*/
|
|
345
399
|
forceDisconnectAndRefresh(): Promise<void>;
|
|
400
|
+
/**
|
|
401
|
+
* Request a snapshot for subset of data.
|
|
402
|
+
*
|
|
403
|
+
* Only available when mode is `changes_only`.
|
|
404
|
+
* Returns the insertion point & the data, but more importantly injects the data
|
|
405
|
+
* into the subscribed data stream. Returned value is unlikely to be useful for the caller,
|
|
406
|
+
* unless the caller has complicated additional logic.
|
|
407
|
+
*
|
|
408
|
+
* Data will be injected in a way that's also tracking further incoming changes, and it'll
|
|
409
|
+
* skip the ones that are already in the snapshot.
|
|
410
|
+
*
|
|
411
|
+
* @param opts - The options for the snapshot request.
|
|
412
|
+
* @returns The metadata and the data for the snapshot.
|
|
413
|
+
*/
|
|
414
|
+
requestSnapshot(opts: SubsetParams): Promise<{
|
|
415
|
+
metadata: SnapshotMetadata;
|
|
416
|
+
data: Array<ChangeMessage<T>>;
|
|
417
|
+
}>;
|
|
346
418
|
}
|
|
347
419
|
|
|
348
420
|
type ShapeData<T extends Row<unknown> = Row> = Map<string, T>;
|
|
@@ -406,6 +478,13 @@ declare class Shape<T extends Row<unknown> = Row> {
|
|
|
406
478
|
isLoading(): boolean;
|
|
407
479
|
/** Indicates if we are connected to the Electric sync service. */
|
|
408
480
|
isConnected(): boolean;
|
|
481
|
+
/** Current log mode of the underlying stream */
|
|
482
|
+
get mode(): LogMode;
|
|
483
|
+
/**
|
|
484
|
+
* Request a snapshot for subset of data. Only available when mode is changes_only.
|
|
485
|
+
* Returns void; data will be emitted via the stream and processed by this Shape.
|
|
486
|
+
*/
|
|
487
|
+
requestSnapshot(params: Parameters<ShapeStreamInterface<T>[`requestSnapshot`]>[0]): Promise<void>;
|
|
409
488
|
subscribe(callback: ShapeChangedCallback<T>): () => void;
|
|
410
489
|
unsubscribeAll(): void;
|
|
411
490
|
get numSubscribers(): number;
|
|
@@ -447,5 +526,13 @@ declare function isChangeMessage<T extends Row<unknown> = Row>(message: Message<
|
|
|
447
526
|
* ```
|
|
448
527
|
*/
|
|
449
528
|
declare function isControlMessage<T extends Row<unknown> = Row>(message: Message<T>): message is ControlMessage;
|
|
529
|
+
/**
|
|
530
|
+
* Checks if a transaction is visible in a snapshot.
|
|
531
|
+
*
|
|
532
|
+
* @param txid - the transaction id to check
|
|
533
|
+
* @param snapshot - the information about the snapshot
|
|
534
|
+
* @returns true if the transaction is visible in the snapshot
|
|
535
|
+
*/
|
|
536
|
+
declare function isVisibleInSnapshot(txid: number | bigint | `${bigint}`, snapshot: PostgresSnapshot | NormalizedPgSnapshot): boolean;
|
|
450
537
|
|
|
451
|
-
export { BackoffDefaults, type BackoffOptions, type BitColumn, type BpcharColumn, type ChangeMessage, type ColumnInfo, type CommonColumnProps, type ControlMessage, ELECTRIC_PROTOCOL_QUERY_PARAMS, type ExternalHeadersRecord, type ExternalParamsRecord, FetchError, type GetExtensions, type IntervalColumn, type IntervalColumnWithPrecision, type MaybePromise, type Message, type NumericColumn, type Offset, type Operation, type PostgresParams, type RegularColumn, type Row, type Schema, Shape, type ShapeChangedCallback, type ShapeData, ShapeStream, type ShapeStreamInterface, type ShapeStreamOptions, type TimeColumn, type TypedMessages, type Value, type VarcharColumn, isChangeMessage, isControlMessage, resolveValue };
|
|
538
|
+
export { BackoffDefaults, type BackoffOptions, type BitColumn, type BpcharColumn, type ChangeMessage, type ColumnInfo, type CommonColumnProps, type ControlMessage, ELECTRIC_PROTOCOL_QUERY_PARAMS, type ExternalHeadersRecord, type ExternalParamsRecord, FetchError, type GetExtensions, type IntervalColumn, type IntervalColumnWithPrecision, type LogMode, type MaybePromise, type Message, type NormalizedPgSnapshot, type NumericColumn, type Offset, type Operation, type PostgresParams, type PostgresSnapshot, type RegularColumn, type Row, type Schema, Shape, type ShapeChangedCallback, type ShapeData, ShapeStream, type ShapeStreamInterface, type ShapeStreamOptions, type SnapshotMetadata, type SubsetParams, type TimeColumn, type TypedMessages, type Value, type VarcharColumn, isChangeMessage, isControlMessage, isVisibleInSnapshot, resolveValue };
|
package/dist/index.browser.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
var
|
|
2
|
-
`;t.forEach(
|
|
1
|
+
var Wt=Object.defineProperty,$t=Object.defineProperties;var Gt=Object.getOwnPropertyDescriptors;var _e=Object.getOwnPropertySymbols;var ft=Object.prototype.hasOwnProperty,ut=Object.prototype.propertyIsEnumerable;var dt=r=>{throw TypeError(r)};var lt=(r,e,t)=>e in r?Wt(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,b=(r,e)=>{for(var t in e||(e={}))ft.call(e,t)&<(r,t,e[t]);if(_e)for(var t of _e(e))ut.call(e,t)&<(r,t,e[t]);return r},le=(r,e)=>$t(r,Gt(e));var pt=(r,e)=>{var t={};for(var s in r)ft.call(r,s)&&e.indexOf(s)<0&&(t[s]=r[s]);if(r!=null&&_e)for(var s of _e(r))e.indexOf(s)<0&&ut.call(r,s)&&(t[s]=r[s]);return t};var Ve=(r,e,t)=>e.has(r)||dt("Cannot "+t);var n=(r,e,t)=>(Ve(r,e,"read from private field"),t?t.call(r):e.get(r)),p=(r,e,t)=>e.has(r)?dt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),h=(r,e,t,s)=>(Ve(r,e,"write to private field"),s?s.call(r,t):e.set(r,t),t),u=(r,e,t)=>(Ve(r,e,"access private method"),t);var je=(r,e,t,s)=>({set _(a){h(r,e,a,t)},get _(){return n(r,e,s)}});var g=(r,e,t)=>new Promise((s,a)=>{var o=f=>{try{c(t.next(f))}catch(d){a(d)}},i=f=>{try{c(t.throw(f))}catch(d){a(d)}},c=f=>f.done?s(f.value):Promise.resolve(f.value).then(o,i);c((t=t.apply(r,e)).next())});var y=class r extends Error{constructor(t,s,a,o,i,c){super(c||`HTTP Error ${t} at ${i}: ${s!=null?s:JSON.stringify(a)}`);this.url=i;this.name="FetchError",this.status=t,this.text=s,this.json=a,this.headers=o}static fromResponse(t,s){return g(this,null,function*(){let a=t.status,o=Object.fromEntries([...t.headers.entries()]),i,c,f=t.headers.get("content-type");return t.bodyUsed||(f&&f.includes("application/json")?c=yield t.json():i=yield t.text()),new r(a,i,c,o,s)})}},I=class extends Error{constructor(){super("Fetch with backoff aborted"),this.name="FetchBackoffAbortError"}};var xe=class extends Error{constructor(){super("Invalid shape options: missing required url parameter"),this.name="MissingShapeUrlError"}},we=class extends Error{constructor(){super("Invalid signal option. It must be an instance of AbortSignal."),this.name="InvalidSignalError"}},Te=class extends Error{constructor(){super("shapeHandle is required if this isn't an initial fetch (i.e. offset > -1)"),this.name="MissingShapeHandleError"}},Me=class extends Error{constructor(e){super(`Cannot use reserved Electric parameter names in custom params: ${e.join(", ")}`),this.name="ReservedParamError"}},ve=class extends Error{constructor(e){super(`Column "${e!=null?e:"unknown"}" does not allow NULL values`),this.name="ParserNullValueError"}};var Ce=class extends Error{constructor(e,t){let s=`The response for the shape request to ${e} didn't include the following required headers:
|
|
2
|
+
`;t.forEach(a=>{s+=`- ${a}
|
|
3
3
|
`}),s+=`
|
|
4
4
|
This is often due to a proxy not setting CORS correctly so that all Electric headers can be read by the client.`,s+=`
|
|
5
|
-
For more information visit the troubleshooting guide: /docs/guides/troubleshooting/missing-headers`,super(s)}};var me=r=>Number(r),St=r=>r==="true"||r==="t",wt=r=>BigInt(r),Be=r=>JSON.parse(r),_t=r=>r,xt={int2:me,int4:me,int8:wt,bool:St,float4:me,float8:me,json:Be,jsonb:Be};function Tt(r,e){let t=0,s=null,n="",i=!1,a=0,h;function l(d,g,ee){let R=d.slice(g,ee);return R=R==="NULL"?null:R,e?e(R):R}function m(d){let g=[];for(;t<d.length;t++){if(s=d[t],i)s==="\\"?n+=d[++t]:s==='"'?(g.push(e?e(n):n),n="",i=d[t+1]==='"',a=t+2):n+=s;else if(s==='"')i=!0;else if(s==="{")a=++t,g.push(m(d));else if(s==="}"){i=!1,a<t&&g.push(l(d,a,t)),a=t+1;break}else s===","&&h!=="}"&&h!=='"'&&(g.push(l(d,a,t)),a=t+1);h=s}return a<t&&g.push(g.push(l(d,a,t+1))),g}return m(r)[0]}var Ee=class{constructor(e){this.parser=b(b({},xt),e)}parse(e,t){return JSON.parse(e,(s,n)=>{if((s==="value"||s==="old_value")&&typeof n=="object"&&n!==null){let i=n;Object.keys(i).forEach(a=>{i[a]=this.parseRow(a,i[a],t)})}return n})}parseRow(e,t,s){var g;let n=s[e];if(!n)return t;let d=n,{type:i,dims:a}=d,h=je(d,["type","dims"]),l=(g=this.parser[i])!=null?g:_t,m=Ye(l,n,e);return a&&a>0?Ye((R,_e)=>Tt(R,m),n,e)(t):m(t,h)}};function Ye(r,e,t){var n;let s=!((n=e.not_null)!=null&&n);return i=>{if(i===null){if(!s)throw new de(t!=null?t:"unknown");return null}return r(i,e)}}function ge(r){return"key"in r}function Re(r){return!ge(r)}function Te(r){return Re(r)&&r.headers.control==="up-to-date"}function Qe(r){let e=r.headers.global_last_seen_lsn;if(e)return`${e}_0`}var Ke="electric-cursor",se="electric-handle",be="electric-offset",We="electric-schema",$e="electric-up-to-date",Ge="columns",Pe="cursor",B="handle",x="live",Y="offset",ze="table",Je="where",Xe="replica",Ze="params",et="experimental_live_sse",Ce="force-disconnect-and-refresh",ve="pause-stream",Ct=[x,B,Y,Pe];var vt=[429],Ae={initialDelay:100,maxDelay:1e4,multiplier:1.3};function tt(r,e=Ae){let{initialDelay:t,maxDelay:s,multiplier:n,debug:i=!1,onFailedAttempt:a}=e;return(...h)=>E(this,null,function*(){var ee;let l=h[0],m=h[1],d=t,g=0;for(;;)try{let R=yield r(...h);if(R.ok)return R;throw yield y.fromResponse(R,l.toString())}catch(R){if(a==null||a(),(ee=m==null?void 0:m.signal)!=null&&ee.aborted)throw new H;if(R instanceof y&&!vt.includes(R.status)&&R.status>=400&&R.status<500)throw R;yield new Promise(_e=>setTimeout(_e,d)),d=Math.min(d*n,s),i&&(g++,console.log(`Retry attempt #${g} after ${d}ms`))}})}var Mt=[201,204,205];function st(r){return(...e)=>E(this,null,function*(){let t=e[0],s=yield r(...e);try{if(s.status<200||Mt.includes(s.status))return s;let n=yield s.text();return new Response(n,s)}catch(n){throw new y(s.status,void 0,void 0,Object.fromEntries([...s.headers.entries()]),t.toString(),n instanceof Error?n.message:typeof n=="string"?n:"failed to read body")}})}var Ot={maxChunksToPrefetch:2};function rt(r,e=Ot){let{maxChunksToPrefetch:t}=e,s;return(...i)=>E(this,null,function*(){let a=i[0].toString(),h=s==null?void 0:s.consume(...i);if(h)return h;s==null||s.abort();let l=yield r(...i),m=Oe(a,l);return m&&(s=new Me({fetchClient:r,maxPrefetchedRequests:t,url:m,requestInit:i[1]})),l})}var kt=["electric-offset","electric-handle"],Ut=["electric-cursor"],Ht=["electric-schema"];function nt(r){return(...e)=>E(this,null,function*(){let t=yield r(...e);if(t.ok){let s=t.headers,n=[],i=m=>n.push(...m.filter(d=>!s.has(d)));i(kt);let h=e[0].toString(),l=new URL(h);if(l.searchParams.get(x)==="true"&&i(Ut),(!l.searchParams.has(x)||l.searchParams.get(x)==="false")&&i(Ht),n.length>0)throw new pe(h,n)}return t})}var re,ne,T,q,C,Q,ye,Me=class{constructor(e){p(this,Q);p(this,re);p(this,ne);p(this,T,new Map);p(this,q);p(this,C);var t;c(this,re,(t=e.fetchClient)!=null?t:(...s)=>fetch(...s)),c(this,ne,e.maxPrefetchedRequests),c(this,q,e.url.toString()),c(this,C,o(this,q)),f(this,Q,ye).call(this,e.url,e.requestInit)}abort(){o(this,T).forEach(([e,t])=>t.abort())}consume(...e){var n;let t=e[0].toString(),s=(n=o(this,T).get(t))==null?void 0:n[0];if(!(!s||t!==o(this,q)))return o(this,T).delete(t),s.then(i=>{let a=Oe(t,i);c(this,q,a),o(this,C)&&!o(this,T).has(o(this,C))&&f(this,Q,ye).call(this,o(this,C),e[1])}).catch(()=>{}),s}};re=new WeakMap,ne=new WeakMap,T=new WeakMap,q=new WeakMap,C=new WeakMap,Q=new WeakSet,ye=function(...e){var n,i;let t=e[0].toString();if(o(this,T).size>=o(this,ne))return;let s=new AbortController;try{let{signal:a,cleanup:h}=Lt(s,(n=e[1])==null?void 0:n.signal),l=o(this,re).call(this,t,te(b({},(i=e[1])!=null?i:{}),{signal:a}));o(this,T).set(t,[l,s]),l.then(m=>{if(!m.ok||s.signal.aborted)return;let d=Oe(t,m);if(!d||d===t){c(this,C,void 0);return}return c(this,C,d),f(this,Q,ye).call(this,d,e[1])}).catch(()=>{}).finally(h)}catch(a){}};function Oe(r,e){let t=e.headers.get(se),s=e.headers.get(be),n=e.headers.has($e);if(!t||!s||n)return;let i=new URL(r);if(!i.searchParams.has(x))return i.searchParams.set(B,t),i.searchParams.set(Y,s),i.searchParams.sort(),i.toString()}function Lt(r,e){let t=Dt;if(e)if(e.aborted)r.abort();else{let s=()=>r.abort();e.addEventListener("abort",s,{once:!0,signal:r.signal}),t=()=>e.removeEventListener("abort",s)}return{signal:r.signal,cleanup:t}}function Dt(){}import{fetchEventSource as Ft}from"@microsoft/fetch-event-source";var It=new Set([Pe,B,x,Y]);function ot(r){return E(this,null,function*(){return typeof r=="function"?r():r})}function Nt(r){return E(this,null,function*(){let e=Object.entries(r),t=yield Promise.all(e.map(i=>E(this,[i],function*([s,n]){if(n===void 0)return[s,void 0];let a=yield ot(n);return[s,Array.isArray(a)?a.join(","):a]})));return Object.fromEntries(t.filter(([s,n])=>n!==void 0))})}function qt(r){return E(this,null,function*(){if(!r)return{};let e=Object.entries(r),t=yield Promise.all(e.map(i=>E(this,[i],function*([s,n]){return[s,yield ot(n)]})));return Object.fromEntries(t)})}var ie,ae,W,$,L,v,A,M,V,D,S,O,_,F,G,w,j,k,z,J,X,u,Se,oe,it,at,Ue,He,ct,ht,lt,ut,ft,dt,Le,pt,mt,De,ke=class{constructor(e){p(this,u);p(this,ie,null);p(this,ae);p(this,W);p(this,$);p(this,L,new Map);p(this,v,!1);p(this,A,"active");p(this,M);p(this,V);p(this,D);p(this,S,!1);p(this,O,!1);p(this,_);p(this,F);p(this,G);p(this,w);p(this,j,!1);p(this,k);p(this,z);p(this,J);p(this,X,Promise.resolve([]));var i,a,h;this.options=b({subscribe:!0},e),Vt(this.options),c(this,M,(i=this.options.offset)!=null?i:"-1"),c(this,V,""),c(this,_,this.options.handle),c(this,$,new Ee(e.parser)),c(this,G,this.options.onError);let t=(a=e.fetchClient)!=null?a:(...l)=>fetch(...l),s=te(b({},(h=e.backoffOptions)!=null?h:Ae),{onFailedAttempt:()=>{var l,m;c(this,O,!1),(m=(l=e.backoffOptions)==null?void 0:l.onFailedAttempt)==null||m.call(l)}}),n=tt(t,s);c(this,W,nt(rt(n))),c(this,ae,st(o(this,W))),f(this,u,mt).call(this)}get shapeHandle(){return o(this,_)}get error(){return o(this,ie)}get isUpToDate(){return o(this,S)}get lastOffset(){return o(this,M)}subscribe(e,t=()=>{}){let s=Math.random();return o(this,L).set(s,[e,t]),o(this,v)||f(this,u,Se).call(this),()=>{o(this,L).delete(s)}}unsubscribeAll(){o(this,L).clear()}lastSyncedAt(){return o(this,D)}lastSynced(){return o(this,D)===void 0?1/0:Date.now()-o(this,D)}isConnected(){return o(this,O)}isLoading(){return!o(this,S)}hasStarted(){return o(this,v)}isPaused(){return o(this,A)==="paused"}forceDisconnectAndRefresh(){return E(this,null,function*(){var e,t;c(this,j,!0),o(this,S)&&!((e=o(this,w))!=null&&e.signal.aborted)&&((t=o(this,w))==null||t.abort(Ce)),yield f(this,u,dt).call(this),c(this,j,!1)})}};ie=new WeakMap,ae=new WeakMap,W=new WeakMap,$=new WeakMap,L=new WeakMap,v=new WeakMap,A=new WeakMap,M=new WeakMap,V=new WeakMap,D=new WeakMap,S=new WeakMap,O=new WeakMap,_=new WeakMap,F=new WeakMap,G=new WeakMap,w=new WeakMap,j=new WeakMap,k=new WeakMap,z=new WeakMap,J=new WeakMap,X=new WeakMap,u=new WeakSet,Se=function(){return E(this,null,function*(){var e;c(this,v,!0);try{yield f(this,u,oe).call(this)}catch(t){if(c(this,ie,t),o(this,G)){let s=yield o(this,G).call(this,t);typeof s=="object"&&(f(this,u,De).call(this),"params"in s&&(this.options.params=s.params),"headers"in s&&(this.options.headers=s.headers),c(this,v,!1),f(this,u,Se).call(this));return}throw t}finally{c(this,O,!1),(e=o(this,J))==null||e.call(this)}})},oe=function(){return E(this,null,function*(){var l,m;if(o(this,A)==="pause-requested"){c(this,A,"paused");return}if(!this.options.subscribe&&((l=this.options.signal)!=null&&l.aborted||o(this,S)))return;let e=o(this,A)==="paused";c(this,A,"active");let{url:t,signal:s}=this.options,{fetchUrl:n,requestHeaders:i}=yield f(this,u,it).call(this,t,e),a=yield f(this,u,at).call(this,s),h=o(this,w);try{yield f(this,u,ct).call(this,{fetchUrl:n,requestAbortController:h,headers:i,resumingFromPause:e})}catch(d){if((d instanceof y||d instanceof H)&&h.signal.aborted&&h.signal.reason===Ce)return f(this,u,oe).call(this);if(d instanceof H){h.signal.aborted&&h.signal.reason===ve&&c(this,A,"paused");return}if(!(d instanceof y))throw d;if(d.status==409){let g=d.headers[se]||`${o(this,_)}-next`;return f(this,u,De).call(this,g),yield f(this,u,Le).call(this,d.json),f(this,u,oe).call(this)}else throw f(this,u,pt).call(this,d),d}finally{a&&s&&s.removeEventListener("abort",a),c(this,w,void 0)}return(m=o(this,z))==null||m.call(this),f(this,u,oe).call(this)})},it=function(e,t){return E(this,null,function*(){let[s,n]=yield Promise.all([qt(this.options.headers),this.options.params?Nt(jt(this.options.params)):void 0]);n&&Et(n);let i=new URL(e);if(n){n.table&&K(i,ze,n.table),n.where&&K(i,Je,n.where),n.columns&&K(i,Ge,n.columns),n.replica&&K(i,Xe,n.replica),n.params&&K(i,Ze,n.params);let a=b({},n);delete a.table,delete a.where,delete a.columns,delete a.replica,delete a.params;for(let[h,l]of Object.entries(a))K(i,h,l)}return i.searchParams.set(Y,o(this,M)),o(this,S)&&(!o(this,j)&&!t&&i.searchParams.set(x,"true"),i.searchParams.set(Pe,o(this,V))),o(this,_)&&i.searchParams.set(B,o(this,_)),i.searchParams.sort(),{fetchUrl:i,requestHeaders:s}})},at=function(e){return E(this,null,function*(){var t;if(c(this,w,new AbortController),e){let s=()=>{var n;(n=o(this,w))==null||n.abort(e.reason)};return e.addEventListener("abort",s,{once:!0}),e.aborted&&((t=o(this,w))==null||t.abort(e.reason)),s}})},Ue=function(e){return E(this,null,function*(){var l;let{headers:t,status:s}=e,n=t.get(se);n&&c(this,_,n);let i=t.get(be);i&&c(this,M,i);let a=t.get(Ke);a&&c(this,V,a);let h=()=>{let m=t.get(We);return m?JSON.parse(m):{}};c(this,F,(l=o(this,F))!=null?l:h()),s===204&&c(this,D,Date.now())})},He=function(e,t=!1){return E(this,null,function*(){if(e.length>0){let s=e[e.length-1];if(Te(s)){if(t){let n=Qe(s);n&&c(this,M,n)}c(this,D,Date.now()),c(this,S,!0)}yield f(this,u,Le).call(this,e)}})},ct=function(e){return E(this,null,function*(){return o(this,S)&&this.options.experimentalLiveSse&&!o(this,j)&&!e.resumingFromPause?(e.fetchUrl.searchParams.set(et,"true"),f(this,u,lt).call(this,e)):f(this,u,ht).call(this,e)})},ht=function(e){return E(this,null,function*(){let{fetchUrl:t,requestAbortController:s,headers:n}=e,i=yield o(this,ae).call(this,t.toString(),{signal:s.signal,headers:n});c(this,O,!0),yield f(this,u,Ue).call(this,i);let a=o(this,F),l=(yield i.text())||"[]",m=o(this,$).parse(l,a);yield f(this,u,He).call(this,m)})},lt=function(e){return E(this,null,function*(){let{fetchUrl:t,requestAbortController:s,headers:n}=e,i=o(this,W);try{let a=[];yield Ft(t.toString(),{headers:n,fetch:i,onopen:h=>E(this,null,function*(){c(this,O,!0),yield f(this,u,Ue).call(this,h)}),onmessage:h=>{if(h.data){let l=o(this,F),m=o(this,$).parse(h.data,l);a.push(m),Te(m)&&(f(this,u,He).call(this,a,!0),a=[])}},onerror:h=>{throw h},signal:s.signal})}catch(a){throw s.signal.aborted?new H:a}})},ut=function(){var e;o(this,v)&&o(this,A)==="active"&&(c(this,A,"pause-requested"),(e=o(this,w))==null||e.abort(ve))},ft=function(){o(this,v)&&o(this,A)==="paused"&&f(this,u,Se).call(this)},dt=function(){return E(this,null,function*(){return o(this,k)?o(this,k):(c(this,k,new Promise((e,t)=>{c(this,z,e),c(this,J,t)})),o(this,k).finally(()=>{c(this,k,void 0),c(this,z,void 0),c(this,J,void 0)}),o(this,k))})},Le=function(e){return E(this,null,function*(){return c(this,X,o(this,X).then(()=>Promise.all(Array.from(o(this,L).values()).map(n=>E(this,[n],function*([t,s]){try{yield t(e)}catch(i){queueMicrotask(()=>{throw i})}}))))),o(this,X)})},pt=function(e){o(this,L).forEach(([t,s])=>{s==null||s(e)})},mt=function(){if(typeof document=="object"&&typeof document.hidden=="boolean"&&typeof document.addEventListener=="function"){let e=()=>{document.hidden?f(this,u,ut).call(this):f(this,u,ft).call(this)};document.addEventListener("visibilitychange",e)}},De=function(e){c(this,M,"-1"),c(this,V,""),c(this,_,e),c(this,S,!1),c(this,O,!1),c(this,F,void 0)},ke.Replica={FULL:"full",DEFAULT:"default"};function Et(r){if(!r)return;let e=Object.keys(r).filter(t=>It.has(t));if(e.length>0)throw new fe(e)}function Vt(r){if(!r.url)throw new he;if(r.signal&&!(r.signal instanceof AbortSignal))throw new le;if(r.offset!==void 0&&r.offset!=="-1"&&!r.handle)throw new ue;Et(r.params)}function K(r,e,t){if(!(t===void 0||t==null))if(typeof t=="string")r.searchParams.set(e,t);else if(typeof t=="object")for(let[s,n]of Object.entries(t))r.searchParams.set(`${e}[${s}]`,n);else r.searchParams.set(e,t.toString())}function jt(r){return Array.isArray(r.params)?te(b({},r),{params:Object.fromEntries(r.params.map((e,t)=>[t+1,e]))}):r}var U,I,Z,N,P,Rt,we,bt,Fe,gt=class{constructor(e){p(this,P);p(this,U,new Map);p(this,I,new Map);p(this,Z,"syncing");p(this,N,!1);this.stream=e,this.stream.subscribe(f(this,P,Rt).bind(this),f(this,P,bt).bind(this))}get isUpToDate(){return o(this,Z)==="up-to-date"}get lastOffset(){return this.stream.lastOffset}get handle(){return this.stream.shapeHandle}get rows(){return this.value.then(e=>Array.from(e.values()))}get currentRows(){return Array.from(this.currentValue.values())}get value(){return new Promise((e,t)=>{if(this.stream.isUpToDate)e(this.currentValue);else{let s=this.subscribe(({value:n})=>{s(),o(this,N)&&t(o(this,N)),e(n)})}})}get currentValue(){return o(this,U)}get error(){return o(this,N)}lastSyncedAt(){return this.stream.lastSyncedAt()}lastSynced(){return this.stream.lastSynced()}isLoading(){return this.stream.isLoading()}isConnected(){return this.stream.isConnected()}subscribe(e){let t=Math.random();return o(this,I).set(t,e),()=>{o(this,I).delete(t)}}unsubscribeAll(){o(this,I).clear()}get numSubscribers(){return o(this,I).size}};U=new WeakMap,I=new WeakMap,Z=new WeakMap,N=new WeakMap,P=new WeakSet,Rt=function(e){let t=!1;e.forEach(s=>{if(ge(s))switch(t=f(this,P,we).call(this,"syncing"),s.headers.operation){case"insert":o(this,U).set(s.key,s.value);break;case"update":o(this,U).set(s.key,b(b({},o(this,U).get(s.key)),s.value));break;case"delete":o(this,U).delete(s.key);break}if(Re(s))switch(s.headers.control){case"up-to-date":t=f(this,P,we).call(this,"up-to-date");break;case"must-refetch":o(this,U).clear(),c(this,N,!1),t=f(this,P,we).call(this,"syncing");break}}),t&&f(this,P,Fe).call(this)},we=function(e){let t=o(this,Z)!==e;return c(this,Z,e),t&&e==="up-to-date"},bt=function(e){e instanceof y&&(c(this,N,e),f(this,P,Fe).call(this))},Fe=function(){o(this,I).forEach(e=>{e({value:this.currentValue,rows:this.currentRows})})};export{Ae as BackoffDefaults,Ct as ELECTRIC_PROTOCOL_QUERY_PARAMS,y as FetchError,gt as Shape,ke as ShapeStream,ge as isChangeMessage,Re as isControlMessage,ot as resolveValue};
|
|
5
|
+
For more information visit the troubleshooting guide: /docs/guides/troubleshooting/missing-headers`,super(s)}};var Ue=r=>Number(r),Jt=r=>r==="true"||r==="t",zt=r=>BigInt(r),mt=r=>JSON.parse(r),Xt=r=>r,Zt={int2:Ue,int4:Ue,int8:zt,bool:Jt,float4:Ue,float8:Ue,json:mt,jsonb:mt};function es(r,e){let t=0,s=null,a="",o=!1,i=0,c;function f(m,E,Q){let S=m.slice(E,Q);return S=S==="NULL"?null:S,e?e(S):S}function d(m){let E=[];for(;t<m.length;t++){if(s=m[t],o)s==="\\"?a+=m[++t]:s==='"'?(E.push(e?e(a):a),a="",o=m[t+1]==='"',i=t+2):a+=s;else if(s==='"')o=!0;else if(s==="{")i=++t,E.push(d(m));else if(s==="}"){o=!1,i<t&&E.push(f(m,i,t)),i=t+1;break}else s===","&&c!=="}"&&c!=='"'&&(E.push(f(m,i,t)),i=t+1);c=s}return i<t&&E.push(E.push(f(m,i,t+1))),E}return d(r)[0]}var ke=class{constructor(e,t){this.parser=b(b({},Zt),e),this.transformer=t}parse(e,t){return JSON.parse(e,(s,a)=>{if((s==="value"||s==="old_value")&&typeof a=="object"&&a!==null){let o=a;Object.keys(o).forEach(i=>{o[i]=this.parseRow(i,o[i],t)}),this.transformer&&(a=this.transformer(a))}return a})}parseRow(e,t,s){var E;let a=s[e];if(!a)return t;let m=a,{type:o,dims:i}=m,c=pt(m,["type","dims"]),f=(E=this.parser[o])!=null?E:Xt,d=gt(f,a,e);return i&&i>0?gt((S,Ne)=>es(S,d),a,e)(t):d(t,c)}};function gt(r,e,t){var a;let s=!((a=e.not_null)!=null&&a);return o=>{if(o===null){if(!s)throw new ve(t!=null?t:"unknown");return null}return r(o,e)}}function z(r){return"key"in r}function Oe(r){return!z(r)}function Ye(r){return Oe(r)&&r.headers.control==="up-to-date"}function Et(r){let e=r.headers.global_last_seen_lsn;if(e)return`${e}_0`}function Qe(r,e){let t=BigInt(r),s=BigInt(e.xmin),a=BigInt(e.xmax),o=e.xip_list.map(BigInt);return t<s||t<a&&!o.includes(t)}var Rt="electric-cursor",fe="electric-handle",He="electric-offset",St="electric-schema",bt="electric-up-to-date",yt="columns",Le="cursor",Ke="expired_handle",X="handle",v="live",Z="offset",Pt="table",At="where",_t="replica",xt="params",wt="experimental_live_sse",We="force-disconnect-and-refresh",$e="pause-stream",Ge="log",ue="subset__where",de="subset__limit",pe="subset__offset",me="subset__order_by",ge="subset__params",Je=[v,X,Z,Le,Ke,Ge,ue,de,pe,me,ge];var ts=[429],Ie={initialDelay:100,maxDelay:1e4,multiplier:1.3};function Tt(r,e=Ie){let{initialDelay:t,maxDelay:s,multiplier:a,debug:o=!1,onFailedAttempt:i}=e;return(...c)=>g(this,null,function*(){var Q;let f=c[0],d=c[1],m=t,E=0;for(;;)try{let S=yield r(...c);if(S.ok)return S;throw yield y.fromResponse(S,f.toString())}catch(S){if(i==null||i(),(Q=d==null?void 0:d.signal)!=null&&Q.aborted)throw new I;if(S instanceof y&&!ts.includes(S.status)&&S.status>=400&&S.status<500)throw S;yield new Promise(Ne=>setTimeout(Ne,m)),m=Math.min(m*a,s),o&&(E++,console.log(`Retry attempt #${E} after ${m}ms`))}})}var ss=[201,204,205];function Mt(r){return(...e)=>g(this,null,function*(){let t=e[0],s=yield r(...e);try{if(s.status<200||ss.includes(s.status))return s;let a=yield s.text();return new Response(a,s)}catch(a){throw new y(s.status,void 0,void 0,Object.fromEntries([...s.headers.entries()]),t.toString(),a instanceof Error?a.message:typeof a=="string"?a:"failed to read body")}})}var rs={maxChunksToPrefetch:2};function vt(r,e=rs){let{maxChunksToPrefetch:t}=e,s;return(...o)=>g(this,null,function*(){let i=o[0].toString(),c=s==null?void 0:s.consume(...o);if(c)return c;s==null||s.abort();let f=yield r(...o),d=Xe(i,f);return d&&(s=new ze({fetchClient:r,maxPrefetchedRequests:t,url:d,requestInit:o[1]})),f})}var ns=["electric-offset","electric-handle"],as=["electric-cursor"],is=["electric-schema"];function Ct(r){return(...e)=>g(this,null,function*(){let t=yield r(...e);if(t.ok){let s=t.headers,a=[],o=m=>a.push(...m.filter(E=>!s.has(E))),c=e[0].toString(),f=new URL(c);if([ue,ge,de,pe,me].some(m=>f.searchParams.has(m)))return t;if(o(ns),f.searchParams.get(v)==="true"&&o(as),(!f.searchParams.has(v)||f.searchParams.get(v)==="false")&&o(is),a.length>0)throw new Ce(c,a)}return t})}var Ee,Re,C,K,U,ee,De,ze=class{constructor(e){p(this,ee);p(this,Ee);p(this,Re);p(this,C,new Map);p(this,K);p(this,U);var t;h(this,Ee,(t=e.fetchClient)!=null?t:(...s)=>fetch(...s)),h(this,Re,e.maxPrefetchedRequests),h(this,K,e.url.toString()),h(this,U,n(this,K)),u(this,ee,De).call(this,e.url,e.requestInit)}abort(){n(this,C).forEach(([e,t])=>t.abort())}consume(...e){var a;let t=e[0].toString(),s=(a=n(this,C).get(t))==null?void 0:a[0];if(!(!s||t!==n(this,K)))return n(this,C).delete(t),s.then(o=>{let i=Xe(t,o);h(this,K,i),n(this,U)&&!n(this,C).has(n(this,U))&&u(this,ee,De).call(this,n(this,U),e[1])}).catch(()=>{}),s}};Ee=new WeakMap,Re=new WeakMap,C=new WeakMap,K=new WeakMap,U=new WeakMap,ee=new WeakSet,De=function(...e){var a,o;let t=e[0].toString();if(n(this,C).size>=n(this,Re))return;let s=new AbortController;try{let{signal:i,cleanup:c}=os(s,(a=e[1])==null?void 0:a.signal),f=n(this,Ee).call(this,t,le(b({},(o=e[1])!=null?o:{}),{signal:i}));n(this,C).set(t,[f,s]),f.then(d=>{if(!d.ok||s.signal.aborted)return;let m=Xe(t,d);if(!m||m===t){h(this,U,void 0);return}return h(this,U,m),u(this,ee,De).call(this,m,e[1])}).catch(()=>{}).finally(c)}catch(i){}};function Xe(r,e){let t=e.headers.get(fe),s=e.headers.get(He),a=e.headers.has(bt);if(!t||!s||a)return;let o=new URL(r);if(!o.searchParams.has(v))return o.searchParams.set(X,t),o.searchParams.set(Z,s),o.searchParams.sort(),o.toString()}function os(r,e){let t=hs;if(e)if(e.aborted)r.abort();else{let s=()=>r.abort();e.addEventListener("abort",s,{once:!0,signal:r.signal}),t=()=>e.removeEventListener("abort",s)}return{signal:r.signal,cleanup:t}}function hs(){}import{fetchEventSource as cs}from"@microsoft/fetch-event-source";var Ze=class{constructor(){this.data={};this.max=250;this.storageKey="electric_expired_shapes";this.load()}getExpiredHandle(e){let t=this.data[e];return t?(t.lastUsed=Date.now(),this.save(),t.expiredHandle):null}markExpired(e,t){this.data[e]={expiredHandle:t,lastUsed:Date.now()};let s=Object.keys(this.data);if(s.length>this.max){let a=s.reduce((o,i)=>this.data[i].lastUsed<this.data[o].lastUsed?i:o);delete this.data[a]}this.save()}save(){if(typeof localStorage!="undefined")try{localStorage.setItem(this.storageKey,JSON.stringify(this.data))}catch(e){}}load(){if(typeof localStorage!="undefined")try{let e=localStorage.getItem(this.storageKey);e&&(this.data=JSON.parse(e))}catch(e){this.data={}}}clear(){this.data={},this.save()}},et=new Ze;var Be=class{constructor(){this.activeSnapshots=new Map;this.xmaxSnapshots=new Map;this.snapshotsByDatabaseLsn=new Map}addSnapshot(e,t){var o,i,c,f;this.activeSnapshots.set(e.snapshot_mark,{xmin:BigInt(e.xmin),xmax:BigInt(e.xmax),xip_list:e.xip_list.map(BigInt),keys:t});let s=(i=(o=this.xmaxSnapshots.get(BigInt(e.xmax)))==null?void 0:o.add(e.snapshot_mark))!=null?i:new Set([e.snapshot_mark]);this.xmaxSnapshots.set(BigInt(e.xmax),s);let a=(f=(c=this.snapshotsByDatabaseLsn.get(BigInt(e.database_lsn)))==null?void 0:c.add(e.snapshot_mark))!=null?f:new Set([e.snapshot_mark]);this.snapshotsByDatabaseLsn.set(BigInt(e.database_lsn),a)}removeSnapshot(e){this.activeSnapshots.delete(e)}shouldRejectMessage(e){let t=e.headers.txids||[];if(t.length===0)return!1;let s=Math.max(...t);for(let[a,o]of this.xmaxSnapshots.entries())if(s>=a)for(let i of o)this.removeSnapshot(i);return[...this.activeSnapshots.values()].some(a=>a.keys.has(e.key)&&Qe(s,a))}lastSeenUpdate(e){for(let[t,s]of this.snapshotsByDatabaseLsn.entries())if(t<=e)for(let a of s)this.removeSnapshot(a)}};var ls=new Set([Le,X,v,Z]);function kt(r){return g(this,null,function*(){return typeof r=="function"?r():r})}function fs(r){return g(this,null,function*(){let e=Object.entries(r),t=yield Promise.all(e.map(o=>g(this,[o],function*([s,a]){if(a===void 0)return[s,void 0];let i=yield kt(a);return[s,Array.isArray(i)?i.join(","):i]})));return Object.fromEntries(t.filter(([s,a])=>a!==void 0))})}function us(r){return g(this,null,function*(){if(!r)return{};let e=Object.entries(r),t=yield Promise.all(e.map(o=>g(this,[o],function*([s,a]){return[s,yield kt(a)]})));return Object.fromEntries(t)})}function Ut(r){let e=new URL(r.origin+r.pathname);for(let[t,s]of r.searchParams)Je.includes(t)||e.searchParams.set(t,s);return e.searchParams.sort(),e.toString()}var ye,te,se,W,B,M,A,k,$,F,w,G,O,_,q,H,re,T,J,L,ne,ae,ie,Pe,N,D,oe,l,Se,be,st,Ot,rt,Fe,Ht,Lt,Dt,nt,at,It,Bt,it,Ft,qt,ot,Nt,tt=class{constructor(e){p(this,l);p(this,ye,null);p(this,te);p(this,se);p(this,W);p(this,B,new Map);p(this,M,!1);p(this,A,"active");p(this,k);p(this,$);p(this,F);p(this,w,!1);p(this,G,!0);p(this,O,!1);p(this,_);p(this,q);p(this,H);p(this,re);p(this,T);p(this,J,!1);p(this,L);p(this,ne);p(this,ae);p(this,ie,Promise.resolve([]));p(this,Pe,new Be);p(this,N,0);p(this,D);p(this,oe);var o,i,c,f;this.options=b({subscribe:!0},e),ds(this.options),h(this,k,(o=this.options.offset)!=null?o:"-1"),h(this,$,""),h(this,_,this.options.handle),h(this,W,new ke(e.parser,e.transformer)),h(this,re,this.options.onError),h(this,q,(i=this.options.mode)!=null?i:"full");let t=(c=e.fetchClient)!=null?c:(...d)=>fetch(...d),s=le(b({},(f=e.backoffOptions)!=null?f:Ie),{onFailedAttempt:()=>{var d,m;h(this,O,!1),(m=(d=e.backoffOptions)==null?void 0:d.onFailedAttempt)==null||m.call(d)}}),a=Tt(t,s);h(this,se,Ct(vt(a))),h(this,te,Mt(n(this,se))),u(this,l,qt).call(this)}get shapeHandle(){return n(this,_)}get error(){return n(this,ye)}get isUpToDate(){return n(this,w)}get lastOffset(){return n(this,k)}get mode(){return n(this,q)}subscribe(e,t=()=>{}){let s=Math.random();return n(this,B).set(s,[e,t]),n(this,M)||u(this,l,Se).call(this),()=>{n(this,B).delete(s)}}unsubscribeAll(){n(this,B).clear()}lastSyncedAt(){return n(this,F)}lastSynced(){return n(this,F)===void 0?1/0:Date.now()-n(this,F)}isConnected(){return n(this,O)}isLoading(){return!n(this,w)}hasStarted(){return n(this,M)}isPaused(){return n(this,A)==="paused"}forceDisconnectAndRefresh(){return g(this,null,function*(){var e,t;h(this,J,!0),n(this,w)&&!((e=n(this,T))!=null&&e.signal.aborted)&&((t=n(this,T))==null||t.abort(We)),yield u(this,l,It).call(this),h(this,J,!1)})}requestSnapshot(e){return g(this,null,function*(){if(n(this,q)==="full")throw new Error(`Snapshot requests are not supported in ${n(this,q)} mode, as the consumer is guaranteed to observe all data`);n(this,M)||(yield u(this,l,Se).call(this)),yield u(this,l,Bt).call(this),je(this,N)._++;try{n(this,N)===1&&u(this,l,nt).call(this);let{fetchUrl:t,requestHeaders:s}=yield u(this,l,st).call(this,this.options.url,!0,e),{metadata:a,data:o}=yield u(this,l,Nt).call(this,t,s),i=o.concat([{headers:b({control:"snapshot-end"},a)}]);return n(this,Pe).addSnapshot(a,new Set(o.map(c=>c.key))),u(this,l,Fe).call(this,i,!1),{metadata:a,data:o}}finally{je(this,N)._--,n(this,N)===0&&u(this,l,at).call(this)}})}};ye=new WeakMap,te=new WeakMap,se=new WeakMap,W=new WeakMap,B=new WeakMap,M=new WeakMap,A=new WeakMap,k=new WeakMap,$=new WeakMap,F=new WeakMap,w=new WeakMap,G=new WeakMap,O=new WeakMap,_=new WeakMap,q=new WeakMap,H=new WeakMap,re=new WeakMap,T=new WeakMap,J=new WeakMap,L=new WeakMap,ne=new WeakMap,ae=new WeakMap,ie=new WeakMap,Pe=new WeakMap,N=new WeakMap,D=new WeakMap,oe=new WeakMap,l=new WeakSet,Se=function(){return g(this,null,function*(){var e;h(this,M,!0);try{yield u(this,l,be).call(this)}catch(t){if(h(this,ye,t),n(this,re)){let s=yield n(this,re).call(this,t);typeof s=="object"&&(u(this,l,ot).call(this),"params"in s&&(this.options.params=s.params),"headers"in s&&(this.options.headers=s.headers),h(this,M,!1),u(this,l,Se).call(this));return}throw t}finally{h(this,O,!1),(e=n(this,ae))==null||e.call(this)}})},be=function(){return g(this,null,function*(){var f,d;if(n(this,A)==="pause-requested"){h(this,A,"paused");return}if(!this.options.subscribe&&((f=this.options.signal)!=null&&f.aborted||n(this,w)))return;let e=n(this,A)==="paused";h(this,A,"active");let{url:t,signal:s}=this.options,{fetchUrl:a,requestHeaders:o}=yield u(this,l,st).call(this,t,e),i=yield u(this,l,Ot).call(this,s),c=n(this,T);try{yield u(this,l,Ht).call(this,{fetchUrl:a,requestAbortController:c,headers:o,resumingFromPause:e})}catch(m){if((m instanceof y||m instanceof I)&&c.signal.aborted&&c.signal.reason===We)return u(this,l,be).call(this);if(m instanceof I){c.signal.aborted&&c.signal.reason===$e&&h(this,A,"paused");return}if(!(m instanceof y))throw m;if(m.status==409){if(n(this,_)){let Q=Ut(a);et.markExpired(Q,n(this,_))}let E=m.headers[fe]||`${n(this,_)}-next`;return u(this,l,ot).call(this,E),yield u(this,l,it).call(this,m.json),u(this,l,be).call(this)}else throw u(this,l,Ft).call(this,m),m}finally{i&&s&&s.removeEventListener("abort",i),h(this,T,void 0)}return(d=n(this,ne))==null||d.call(this),u(this,l,be).call(this)})},st=function(e,t,s){return g(this,null,function*(){let[a,o]=yield Promise.all([us(this.options.headers),this.options.params?fs(ps(this.options.params)):void 0]);o&&Vt(o);let i=new URL(e);if(o){o.table&&x(i,Pt,o.table),o.where&&x(i,At,o.where),o.columns&&x(i,yt,o.columns),o.replica&&x(i,_t,o.replica),o.params&&x(i,xt,o.params);let d=b({},o);delete d.table,delete d.where,delete d.columns,delete d.replica,delete d.params;for(let[m,E]of Object.entries(d))x(i,m,E)}s&&(s.where&&x(i,ue,s.where),s.params&&x(i,ge,s.params),s.limit&&x(i,de,s.limit),s.offset&&x(i,pe,s.offset),s.orderBy&&x(i,me,s.orderBy)),i.searchParams.set(Z,n(this,k)),i.searchParams.set(Ge,n(this,q)),n(this,w)&&(!n(this,J)&&!t&&i.searchParams.set(v,"true"),i.searchParams.set(Le,n(this,$))),n(this,_)&&i.searchParams.set(X,n(this,_));let c=Ut(i),f=et.getExpiredHandle(c);return f&&i.searchParams.set(Ke,f),i.searchParams.sort(),{fetchUrl:i,requestHeaders:a}})},Ot=function(e){return g(this,null,function*(){var t;if(h(this,T,new AbortController),e){let s=()=>{var a;(a=n(this,T))==null||a.abort(e.reason)};return e.addEventListener("abort",s,{once:!0}),e.aborted&&((t=n(this,T))==null||t.abort(e.reason)),s}})},rt=function(e){return g(this,null,function*(){var f;let{headers:t,status:s}=e,a=t.get(fe);a&&h(this,_,a);let o=t.get(He);o&&h(this,k,o);let i=t.get(Rt);i&&h(this,$,i);let c=()=>{let d=t.get(St);return d?JSON.parse(d):{}};h(this,H,(f=n(this,H))!=null?f:c()),s===204&&h(this,F,Date.now())})},Fe=function(e,t=!1){return g(this,null,function*(){var s;if(e.length>0){h(this,G,!0);let a=e[e.length-1];if(Ye(a)){if(t){let i=Et(a);i&&h(this,k,i)}h(this,F,Date.now()),h(this,w,!0),h(this,G,!1),(s=n(this,oe))==null||s.call(this)}let o=e.filter(i=>z(i)?!n(this,Pe).shouldRejectMessage(i):!0);yield u(this,l,it).call(this,o)}})},Ht=function(e){return g(this,null,function*(){return n(this,w)&&this.options.experimentalLiveSse&&!n(this,J)&&!e.resumingFromPause?(e.fetchUrl.searchParams.set(wt,"true"),u(this,l,Dt).call(this,e)):u(this,l,Lt).call(this,e)})},Lt=function(e){return g(this,null,function*(){let{fetchUrl:t,requestAbortController:s,headers:a}=e,o=yield n(this,te).call(this,t.toString(),{signal:s.signal,headers:a});h(this,O,!0),yield u(this,l,rt).call(this,o);let i=n(this,H),f=(yield o.text())||"[]",d=n(this,W).parse(f,i);yield u(this,l,Fe).call(this,d)})},Dt=function(e){return g(this,null,function*(){let{fetchUrl:t,requestAbortController:s,headers:a}=e,o=n(this,se);try{let i=[];yield cs(t.toString(),{headers:a,fetch:o,onopen:c=>g(this,null,function*(){h(this,O,!0),yield u(this,l,rt).call(this,c)}),onmessage:c=>{if(c.data){let f=n(this,H),d=n(this,W).parse(c.data,f);i.push(d),Ye(d)&&(u(this,l,Fe).call(this,i,!0),i=[])}},onerror:c=>{throw c},signal:s.signal})}catch(i){throw s.signal.aborted?new I:i}})},nt=function(){var e;n(this,M)&&n(this,A)==="active"&&(h(this,A,"pause-requested"),(e=n(this,T))==null||e.abort($e))},at=function(){n(this,M)&&n(this,A)==="paused"&&u(this,l,Se).call(this)},It=function(){return g(this,null,function*(){return n(this,L)?n(this,L):(h(this,L,new Promise((e,t)=>{h(this,ne,e),h(this,ae,t)})),n(this,L).finally(()=>{h(this,L,void 0),h(this,ne,void 0),h(this,ae,void 0)}),n(this,L))})},Bt=function(){return g(this,null,function*(){if(n(this,G))return n(this,D)?n(this,D):(h(this,D,new Promise(e=>{h(this,oe,e)})),n(this,D).finally(()=>{h(this,D,void 0),h(this,oe,void 0)}),n(this,D))})},it=function(e){return g(this,null,function*(){return h(this,ie,n(this,ie).then(()=>Promise.all(Array.from(n(this,B).values()).map(a=>g(this,[a],function*([t,s]){try{yield t(e)}catch(o){queueMicrotask(()=>{throw o})}}))))),n(this,ie)})},Ft=function(e){n(this,B).forEach(([t,s])=>{s==null||s(e)})},qt=function(){if(typeof document=="object"&&typeof document.hidden=="boolean"&&typeof document.addEventListener=="function"){let e=()=>{document.hidden?u(this,l,nt).call(this):u(this,l,at).call(this)};document.addEventListener("visibilitychange",e)}},ot=function(e){h(this,k,"-1"),h(this,$,""),h(this,_,e),h(this,w,!1),h(this,G,!0),h(this,O,!1),h(this,H,void 0),h(this,N,0)},Nt=function(e,t){return g(this,null,function*(){let s=yield n(this,te).call(this,e.toString(),{headers:t});if(!s.ok)throw new y(s.status,void 0,void 0,Object.fromEntries([...s.headers.entries()]),e.toString());let{metadata:a,data:o}=yield s.json(),i=n(this,W).parse(JSON.stringify(o),n(this,H));return{metadata:a,data:i}})},tt.Replica={FULL:"full",DEFAULT:"default"};function Vt(r){if(!r)return;let e=Object.keys(r).filter(t=>ls.has(t));if(e.length>0)throw new Me(e)}function ds(r){if(!r.url)throw new xe;if(r.signal&&!(r.signal instanceof AbortSignal))throw new we;if(r.offset!==void 0&&r.offset!=="-1"&&r.offset!=="now"&&!r.handle)throw new Te;Vt(r.params)}function x(r,e,t){if(!(t===void 0||t==null))if(typeof t=="string")r.searchParams.set(e,t);else if(typeof t=="object")for(let[s,a]of Object.entries(t))r.searchParams.set(`${e}[${s}]`,a);else r.searchParams.set(e,t.toString())}function ps(r){return Array.isArray(r.params)?le(b({},r),{params:Object.fromEntries(r.params.map((e,t)=>[t+1,e]))}):r}var P,V,j,Ae,he,ce,Y,R,Yt,Qt,ht,qe,Kt,ct,jt=class{constructor(e){p(this,R);p(this,P,new Map);p(this,V,new Map);p(this,j,new Set);p(this,Ae,new Set);p(this,he,!1);p(this,ce,"syncing");p(this,Y,!1);this.stream=e,this.stream.subscribe(u(this,R,Yt).bind(this),u(this,R,Kt).bind(this))}get isUpToDate(){return n(this,ce)==="up-to-date"}get lastOffset(){return this.stream.lastOffset}get handle(){return this.stream.shapeHandle}get rows(){return this.value.then(e=>Array.from(e.values()))}get currentRows(){return Array.from(this.currentValue.values())}get value(){return new Promise((e,t)=>{if(this.stream.isUpToDate)e(this.currentValue);else{let s=this.subscribe(({value:a})=>{s(),n(this,Y)&&t(n(this,Y)),e(a)})}})}get currentValue(){return n(this,P)}get error(){return n(this,Y)}lastSyncedAt(){return this.stream.lastSyncedAt()}lastSynced(){return this.stream.lastSynced()}isLoading(){return this.stream.isLoading()}isConnected(){return this.stream.isConnected()}get mode(){return this.stream.mode}requestSnapshot(e){return g(this,null,function*(){let t=JSON.stringify(e);n(this,Ae).add(t),yield u(this,R,ht).call(this),yield this.stream.requestSnapshot(e)})}subscribe(e){let t=Math.random();return n(this,V).set(t,e),()=>{n(this,V).delete(t)}}unsubscribeAll(){n(this,V).clear()}get numSubscribers(){return n(this,V).size}};P=new WeakMap,V=new WeakMap,j=new WeakMap,Ae=new WeakMap,he=new WeakMap,ce=new WeakMap,Y=new WeakMap,R=new WeakSet,Yt=function(e){let t=!1;e.forEach(s=>{if(z(s))if(t=u(this,R,qe).call(this,"syncing"),this.mode==="full")switch(s.headers.operation){case"insert":n(this,P).set(s.key,s.value);break;case"update":n(this,P).set(s.key,b(b({},n(this,P).get(s.key)),s.value));break;case"delete":n(this,P).delete(s.key);break}else switch(s.headers.operation){case"insert":n(this,j).add(s.key),n(this,P).set(s.key,s.value);break;case"update":n(this,j).has(s.key)&&n(this,P).set(s.key,b(b({},n(this,P).get(s.key)),s.value));break;case"delete":n(this,j).has(s.key)&&(n(this,P).delete(s.key),n(this,j).delete(s.key));break}if(Oe(s))switch(s.headers.control){case"up-to-date":t=u(this,R,qe).call(this,"up-to-date"),n(this,he)&&(h(this,he,!1),u(this,R,Qt).call(this));break;case"must-refetch":n(this,P).clear(),n(this,j).clear(),h(this,Y,!1),t=u(this,R,qe).call(this,"syncing"),h(this,he,!0);break}}),t&&u(this,R,ct).call(this)},Qt=function(){return g(this,null,function*(){yield u(this,R,ht).call(this),yield Promise.all(Array.from(n(this,Ae)).map(e=>g(this,null,function*(){try{let t=JSON.parse(e);yield this.stream.requestSnapshot(t)}catch(t){}})))})},ht=function(){return g(this,null,function*(){this.stream.isUpToDate||(yield new Promise(e=>{let t=()=>{this.stream.isUpToDate&&(clearInterval(s),a(),e())},s=setInterval(t,10),a=this.stream.subscribe(()=>t(),()=>t());t()}))})},qe=function(e){let t=n(this,ce)!==e;return h(this,ce,e),t&&e==="up-to-date"},Kt=function(e){e instanceof y&&(h(this,Y,e),u(this,R,ct).call(this))},ct=function(){n(this,V).forEach(e=>{e({value:this.currentValue,rows:this.currentRows})})};export{Ie as BackoffDefaults,Je as ELECTRIC_PROTOCOL_QUERY_PARAMS,y as FetchError,jt as Shape,tt as ShapeStream,z as isChangeMessage,Oe as isControlMessage,Qe as isVisibleInSnapshot,kt as resolveValue};
|
|
6
6
|
//# sourceMappingURL=index.browser.mjs.map
|