@doync/client 0.3.0 → 0.3.2
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/adapter.cjs +1 -1
- package/dist/adapter.d.cts +22 -7
- package/dist/adapter.d.cts.map +1 -1
- package/dist/adapter.d.ts +22 -7
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/{client-Db0Jfwuy.js → client-C97IzM56.js} +2 -2
- package/dist/{client-Db0Jfwuy.js.map → client-C97IzM56.js.map} +1 -1
- package/dist/{client-Bv6QMenB.cjs → client-CR5SoP5D.cjs} +1 -1
- package/dist/client-OAVaC3pt.d.ts.map +1 -1
- package/dist/client-OPt8Axyp.d.cts.map +1 -1
- package/dist/internal.cjs +1 -1
- package/dist/internal.js +1 -1
- package/package.json +3 -3
- package/src/engine.ts +11 -2
- package/src/socket-reconnect.ts +177 -40
|
@@ -10,6 +10,6 @@ let e=require("@doync/core/internal"),t=require("@doync/sqlite-parser");var n=cl
|
|
|
10
10
|
cookie = excluded.cookie,
|
|
11
11
|
released_at = excluded.released_at,
|
|
12
12
|
ttl_ms = excluded.ttl_ms`,t.instance,t.cookie,t.releasedAt,t.ttlMs)}function x(e,t){e.exec(`DELETE FROM __doync_release_stamp WHERE instance = ?`,t)}function ce(e){e.exec(`DELETE FROM __doync_release_stamp`)}function S(e){return{instance:String(e.instance),cookie:Number(e.cookie),releasedAt:Number(e.released_at),ttlMs:Number(e.ttl_ms)}}function C(e,t){let n=e.exec(`SELECT instance, cookie, released_at, ttl_ms
|
|
13
|
-
FROM __doync_release_stamp WHERE instance = ?`,t)[0];return n===void 0?null:S(n)}function w(e){return e.exec(`SELECT instance, cookie, released_at, ttl_ms FROM __doync_release_stamp`).map(S)}function T(t){if(!(0,e.isSqlIdentifier)(t))throw Error(`doync: refusing to quote non-identifier ${JSON.stringify(t)}`);return`"${t}"`}function E(t,n){let r=JSON.parse(t),i=(0,e.tablePrimaryKey)(n);if(!Array.isArray(r)||r.length!==i.length)throw Error(`doync: malformed pk ${t} for table ${n.name} (expected ${i.length} key part(s))`);return r.map(t=>(0,e.decodePkValue)(t))}function D(t){return(0,e.tablePrimaryKey)(t).map(e=>`${T(e)} = ?`).join(` AND `)}function le(t,n){let r=Object.keys(n);for(let n of r)if(!(0,e.isSqlIdentifier)(n))throw Error(`doync: patch image for table ${t.name} has an invalid column name ${JSON.stringify(n)}`);return{columns:r,values:r.map(t=>(0,e.decodeImageValue)(n[t]))}}function O(e,t){let n=e.tables.find(e=>e.name===t);if(n===void 0)throw Error(`doync: no synced table named ${JSON.stringify(t)} in the client schema`);return n}function k(e){return ae(e)}function A(t,n){p(t,`schema_version`)===null&&j(t,n,0,(0,e.declaredSchemaVersion)(n))}function j(e,t,n,r){for(let i of f(t,n,r))e.execBatch(i);m(e,`schema_version`,String(r))}function M(e,t){for(let n of t.tables)e.exec(`DROP TABLE IF EXISTS ${T(n.name)}`)}function ue(t){for(let n of t.tables)if((0,e.isInternalTable)(n.name))throw Error(`doync: synced table ${n.name} uses the reserved __doync_ prefix`)}const N=`logout_behavior`,P=`connected_clock`,F=`doync_optimistic`,I=`doync_body`;var L=class{lifecycle;decode;one;#e=!1;#t=null;#n=new Set;#r=J;#i=Y;#a=!1;#o=null;constructor(e,t,n){this.lifecycle=e,this.decode=t,this.one=n}#s(e){if(this.#o?.read!==e||this.#o.generation!==e.generation){let t=e.rawRows();this.#r=this.decode?this.decode(t):t,this.#o={read:e,generation:e.generation}}return this.#r}#c(){if(this.#a)return;this.#a=!0;let e=this.lifecycle.peek();if(e!==null)this.#s(e),this.#i=e.status();else{let e=this.lifecycle.compute();this.#r=e.rows,this.#i=e.status}}current(){let e=this.lifecycle.peek();return e!==null&&e.generation>0?(this.#a=!0,this.#s(e)):(this.#c(),this.#r)}status(){let e=this.lifecycle.peek();return e===null?(this.#c(),this.#i):(this.#a=!0,this.#i=e.status(),this.#i)}onChange(e){return this.#n.add(e),()=>this.#n.delete(e)}retain(){if(this.#e)return;this.#e=!0,this.#a=!0;let e=this.lifecycle.retain();if(this.#t=e.onChange(()=>{this.#s(e),this.#i=e.status();for(let e of this.#n)e()}),e.generation>0&&(this.#o?.read!==e||this.#o.generation!==e.generation)||e.status()!==this.#i){e.generation>0&&this.#s(e),this.#i=e.status();for(let e of this.#n)e()}}release(){this.#e&&(this.#e=!1,this.#t?.(),this.#t=null,this.lifecycle.release())}},R=class{#e;#t;#n;#r;#i;#a;#o=null;#s;#c;#l=1;#u=null;#d=!1;#f=0;#p=null;#m;#h=!1;#g=null;#_=!1;#v=new Set;#y=0;#b=0;#x=null;#S;#C=new Set;#w=!1;#T=[];#E=new Map;#D=new Map;#O=new Set;#k=new Set;#A=new Map;#j=new Map;#M=new Map;#N=new Map;#P=new Map;#F=1;#I=new Map;#L=new Map;#R=new Set;#z=null;#B=[];#V=!1;#H=[];#U=new Set;constructor(e){this.#e=e.db,this.#t=e.schema,this.#n=e.mutations,this.#r=e.socket,this.#i=e.ctx??null,this.#a=e.token,this.#o=e.userId??null,this.#S=e.onSchemaEvent,this.#c=e.generateId??ve,this.#m=e.now??Date.now,this.#W(e),this.#r.setHandlers({message:e=>this.#Ee(e),open:()=>this.#xe(),close:()=>{this.#p=null,this.#rt(!1)},status:e=>this.#it(e)})}get connectedClock(){return this.#f}releaseStamp(e){return C(this.#e,e)}releaseStamps(){return w(this.#e)}get clientId(){return this.#s}get userId(){return this.#o}get cookie(){return this.#u}get errors(){return this.#B}get recoveredKeys(){return this.#O}get schemaVersion(){return this.#y}get schemaStatus(){return this.#x}#W(t){let n=this.#e;n.exec(`PRAGMA foreign_keys = OFF`),ue(this.#t);let{rolledBack:r}=k(n);r?(this.#Ge(n,(0,e.declaredSchemaVersion)(this.#t)),this.#u=null):A(n,this.#t),this.#y=(0,e.declaredSchemaVersion)(this.#t);let i=be(n);i!==null&&(console.error(`doync: durable meta "${i}" is corrupt — healing by FORGETTING the local store (fresh identity, full re-hydration). A corrupt mutation counter makes the pending queue untrustworthy, so unsynced writes are discarded rather than risk double-apply.`),this.#Ke(n)),this.#b=this.#G(n,`schema_version`)??0;let a=p(n,`client_id`);this.#s=a??t.clientId??this.#c(),a===null&&m(n,`client_id`,this.#s),this.#l=this.#G(n,`next_mutation_id`)??1,this.#u=this.#G(n,`cookie`);let o=Number(p(n,P));Number.isInteger(o)&&o>=0?this.#f=o:(p(n,`connected_clock`)!==null&&console.warn(`doync: durable connected-clock reading is corrupt — resetting to 0 (clock runs slow; GC defers, server full-hydrates)`),this.#f=0),this.#p=null,i!==null&&this.#$e(`forget`,`corrupt durable meta "${i}" — forgot the local store and reset to a fresh identity`),this.#T=n.exec(`SELECT mutation_id, name, args, idem_key FROM __doync_pending ORDER BY mutation_id ASC`).map(t=>{let n=JSON.parse(String(t.args));return{mutationId:Number(t.mutation_id),name:String(t.name),wireArgs:n,args:(0,e.decodeArgs)(n,`mutation args`),key:t.idem_key===null?void 0:String(t.idem_key)}});for(let e of this.#T){let t=this.#ut(e.mutationId,!0);e.key!==void 0&&(this.#D.set(e.key,t.pair),this.#O.add(e.key))}this.#ge({includeStampless:!1}),n.drainWrittenTables();let s=this.#Q();z(s)&&(this.#V=!0,s.then(()=>this.#J(),()=>this.#J()))}#G(e,t){let n=p(e,t);if(n===null)return null;let r=Number(n);if(!Number.isInteger(r))throw Error(`doync: durable meta "${t}" is corrupt (${JSON.stringify(n)} → ${r}) — a non-integer must never ride the wire (ADR-0019 next-id trap); the boot-time corrupt-meta heal should have caught this`);return r}#K(e){if(this.#V){this.#H.push(e);return}this.#V=!0,this.#q(e)}#q(e){let t;try{t=e()}catch(e){throw this.#V=!1,this.#Y(),e}z(t)?t.then(()=>this.#J(),e=>{this.#B.push(`doync: exclusive-chain step rejected — ${K(e)}`),this.#J()}):this.#J()}#J(){this.#V=!1,this.#Y()}#Y(){let e=this.#H.shift();if(e!==void 0){this.#V=!0,this.#q(e);return}this.#X()}#X(){if(this.#U.size===0)return;let e=[...this.#U];this.#U.clear();for(let t of e)t.recompute()&&t.notify()}#Z(e){this.#V?this.#U.add(e):e.recompute()}#Q(){return this.#e.drainWrittenTables(),this.#e.exec(`SAVEPOINT ${F}`),this.#_=!0,this.#A.clear(),B(this.#$(0),()=>{this.#R=W(this.#e.drainWrittenTables())})}#$(e){for(let t=e;t<this.#T.length;t++){let e=this.#ne(this.#T[t]);if(z(e))return e.then(()=>this.#$(t+1))}}#ee(){this.#_&&=(this.#e.exec(`ROLLBACK TO ${F}`),this.#e.exec(`RELEASE ${F}`),!1)}#te(e){let t=this.#R;this.#ee(),this.#e.drainWrittenTables(),this.#e.exec(`BEGIN`);try{e(),this.#e.exec(`COMMIT`)}catch(e){return this.#e.exec(`ROLLBACK`),B(this.#Q(),()=>{throw e})}let n=W(this.#e.drainWrittenTables());return B(this.#Q(),()=>new Set([...t,...n,...this.#R]))}#ne(e){this.#e.exec(`SAVEPOINT ${I}`);let t;try{let n=this.#n[e.name];if(n===void 0)throw Error(`unknown mutation "${e.name}"`);t=n.body({args:e.args,ctx:this.#i,sql:this.#ae()})}catch(t){this.#ie(e.mutationId,t);return}if(z(t))return t.then(()=>this.#re(e.mutationId),t=>this.#ie(e.mutationId,t));this.#re(e.mutationId)}#re(e){this.#e.exec(`RELEASE ${I}`),this.#A.delete(e)}#ie(e,t){this.#e.exec(`ROLLBACK TO ${I}`),this.#e.exec(`RELEASE ${I}`),this.#A.set(e,t)}#ae(){return{exec:(e,...t)=>this.#e.exec(e,...t.map(e=>typeof e==`boolean`?+!!e:e))}}#oe(e){this.#r.send({type:`push`,clientId:this.#s,mutationId:e.mutationId,name:e.name,args:e.wireArgs})}mutate(t,n,r){let i=r?.key;if(i!==void 0){let e=this.#D.get(i);if(e!==void 0)return e}let a=t.name;if(a===void 0||a===``)return G(Error(`doync: mutate requires a registered mutation — wrap it in defineMutations(...) so it carries a dotted name`));let o=this.#n[a];if(o===void 0)return G(Error(`doync: unknown mutation "${a}"`));let s,c;try{s=(0,e.prepareArgs)(o.args,n,`mutation args`),c=(0,e.encodeArgs)(s,`mutation args`)}catch(e){return G(e)}let l=this.#dt(!1);return i!==void 0&&this.#D.set(i,l.pair),this.#K(()=>this.#se({name:a,args:s,wireArgs:c,key:i,promise:l})),l.pair}#se(e){let t=this.#e,n=this.#l;this.#E.set(n,e.promise);let r={mutationId:n,name:e.name,args:e.args,wireArgs:e.wireArgs,key:e.key};return B(this.#te(()=>{t.exec(`INSERT INTO __doync_pending (mutation_id, name, args, idem_key) VALUES (?, ?, ?, ?)`,n,r.name,JSON.stringify(r.wireArgs??null),r.key??null),this.#l=n+1,m(t,`next_mutation_id`,String(this.#l)),this.#T.push(r)}),e=>this.#ce(r,e))}#ce(e,t){let n=e.mutationId;if(!this.#A.has(n)){this.#ft(n,null),this.#st(t),this.#d&&this.#oe(e);return}let r=this.#A.get(n),i=this.#E.get(n)?.pair;return e.key!==void 0&&this.#D.delete(e.key),B(this.#le(n,!0),e=>{this.#ft(n,r),this.#pt(n,r),i?.client.catch(()=>{}),i?.server.catch(()=>{}),this.#st(new Set([...t,...e]))})}#le(e,t=!1){let n=this.#e;return this.#te(()=>{n.exec(`DELETE FROM __doync_pending WHERE mutation_id = ?`,e),this.#T=this.#T.filter(t=>t.mutationId!==e),t&&(this.#l=e,m(n,`next_mutation_id`,String(e)))})}updateAuth(e,t,n){this.#a=e??void 0,n!==void 0&&(this.#o=n),t!==void 0&&(this.#i=t),this.#d&&!this.#w&&typeof e==`string`&&e!==``&&this.#r.send({type:`updateAuth`,jwt:e})}subscribe(e,t){if(H(e))return new V;let{query:n,args:r,options:i}=U(`subscribe`,e,t);if(i?.skip)return new V;let a=n.name,o=n.resolve({args:r,ctx:this.#i}),s={sql:o.sql,params:o.params},c=o.identity,l={name:a,args:r,ttl:i?.ttl,statement:s},u=o.decode;return new L({peek:()=>this.#M.get(c)?.read??null,retain:()=>this.#de(c,l),release:()=>this.#pe(c),compute:()=>{if(this.#V)return{rows:J,status:Y};let e=this.#e.exec(s.sql,...s.params),t=this.#M.get(c);return{rows:u?u(e):e,status:Z(t?.phase??`pending`,t?.error)}}},u,o.one??!1)}preload(e,t){if(H(e))return ge;let{query:n,args:r,options:i}=U(`preload`,e,t),a=n.name,o=n.resolve({args:r,ctx:this.#i}),s=o.identity;this.#fe(s,{name:a,args:r,ttl:i?.ttl,statement:{sql:o.sql,params:o.params}});let c=!1;return{cleanup:()=>{c||(c=!0,this.#pe(s))}}}#ue(e,t){let n=this.#M.get(e);if(n===void 0){let r=this.#Te(e);n={name:t.name,args:t.args,ttl:t.ttl,count:0,read:null,phase:`pending`,error:void 0},this.#M.set(e,n),this.#We(()=>x(this.#e,e)),this.#d&&this.#r.send({type:`subscribe`,queries:[this.#we(e,{heldAt:r})]})}else n.phase===`error`&&this.#d?(this.#lt(e,`pending`),this.#r.send({type:`subscribe`,queries:[this.#we(e)]})):t.ttl!==void 0&&(n.ttl===void 0||t.ttl>n.ttl)&&(n.ttl=t.ttl,this.#d&&this.#r.send({type:`subscribe`,queries:[this.#we(e)]}));return n.count+=1,n}#de(e,t){let r=this.#ue(e,t);if(r.read===null){let i=this.#L.get(e);if(i!==void 0)clearTimeout(i.timer),this.#L.delete(e),r.read=i.read,this.#Z(i.read);else{let i=new n({run:e=>this.#e.exec(e.sql,...e.params),readSet:()=>{let t=this.#j.get(e);return t===void 0?void 0:new Set(t.readSet)}},t.statement,e,Z(r.phase,r.error));r.read=i,this.#Z(i)}}return r.read}#fe(e,t){this.#ue(e,t)}#pe(t){let n=this.#M.get(t);n===void 0||--n.count>0||(this.#M.delete(t),this.#d&&this.#r.send({type:`unsubscribe`,queries:[{name:n.name,args:n.args===void 0?void 0:(0,e.encodeArgs)(n.args,`query args`)}]}),this.#me(t,n.ttl),n.read!==null&&this.#ve(t,n.read))}#me(e,t){let n=this.#u;if(n===null)return;let r={instance:e,cookie:n,releasedAt:this.#f,ttlMs:oe(t)};this.#K(()=>B(this.#te(()=>{se(this.#e,r),this.#ge({includeStampless:!0}),this.#he()}),e=>this.#st(e)))}#he(){m(this.#e,P,String(this.#f))}#ge(e){let t=this.#_e(e.includeStampless);if(t.length!==0){for(let e of t)this.#Le(e);this.#he()}}#_e(e){let t=this.#M,n=w(this.#e),r=new Set(n.map(e=>e.instance)),i=[];if(e){let e=this.#e.exec(`SELECT DISTINCT instance FROM __doync_membership`);for(let n of e){let e=String(n.instance);t.has(e)||r.has(e)||i.push(e)}}let a=this.#f;for(let e of n)t.has(e.instance)||(e.ttlMs<=0||a-e.releasedAt>e.ttlMs)&&i.push(e.instance);return i}#ve(e,t){let n=this.#L.get(e);n!==void 0&&clearTimeout(n.timer),this.#L.set(e,{read:t,timer:setTimeout(()=>{let n=this.#L.get(e);n===void 0||n.read!==t||(this.#L.delete(e),this.#U.delete(t))},q)})}once(t){if(H(t))return new he;let{query:n,args:r}=U(`once`,t),i=n.name,a=n.resolve({args:r,ctx:this.#i}),o;if(this.#V)o=[];else{let e=this.#e.exec(a.sql,...a.params);o=a.decode?a.decode(e):e}let s=`once-${this.#F++}`,c=r===void 0?void 0:(0,e.encodeArgs)(r,`query args`),l=new fe(o,a.decode,{start:()=>{this.#N.set(s,{view:l,name:i,args:c}),this.#d&&this.#r.send({type:`once`,id:s,name:i,args:c})},drop:()=>{this.#N.delete(s),this.#P.delete(s)}});return l}local(e,...t){let n=`local:${e}\u0000${JSON.stringify(t)}`,r={sql:e,params:t};return new L({peek:()=>this.#I.get(n)?.read??null,retain:()=>this.#ye(n,r),release:()=>this.#be(n),compute:()=>this.#V?{rows:J,status:Y}:{rows:this.#e.exec(r.sql,...r.params),status:X}},void 0,void 0)}#ye(e,t){let r=this.#I.get(e);if(r===void 0&&(r={count:0,read:null},this.#I.set(e,r)),r.count+=1,r.read===null){let i=this.#L.get(e);if(i!==void 0)clearTimeout(i.timer),this.#L.delete(e),r.read=i.read,this.#Z(i.read);else{let e=new n({run:e=>this.#e.exec(e.sql,...e.params),readSet:()=>void 0},t,void 0,X);r.read=e,this.#Z(e)}}return r.read}#be(e){let t=this.#I.get(e);t===void 0||--t.count>0||(this.#I.delete(e),t.read!==null&&this.#ve(e,t.read))}#xe(){this.#w||(this.#p=null,this.#rt(!0),this.#Ce())}#Se(){let e=this.#m();if(this.#p!==null){let t=e-this.#p;t>0&&(this.#f+=t)}this.#p=e}#Ce(){for(let e of this.#M.keys())this.#lt(e,`pending`);this.#r.send({type:`connect`,clientId:this.#s,...this.#a===void 0?{}:{jwt:this.#a},cookie:this.#u,desiredQueries:[...this.#M.keys()].map(e=>this.#we(e)),schemaVersion:this.#y});for(let e of this.#T)this.#oe(e);for(let[e,t]of this.#N)this.#r.send({type:`once`,id:e,name:t.name,args:t.args})}#we(t,n){let r=this.#M.get(t),i=n===void 0?this.#Te(t):n.heldAt;return{name:r?.name??t,args:r?.args===void 0?void 0:(0,e.encodeArgs)(r.args,`query args`),...r?.ttl===void 0?{}:{ttl:r.ttl},...i===void 0?{}:{heldAt:i}}}#Te(e){if(!(this.#e.exec(`SELECT 1 FROM __doync_membership WHERE instance = ? LIMIT 1`,e).length>0))return;if(this.#M.has(e))return this.#u??void 0;let t=C(this.#e,e);if(t!==null)return t.cookie}#Ee(e){if(this.#w){e.type===`error`&&this.#B.push(e.message);return}if(e.type===`pong`){this.#Se();return}if(e.type===`unauthorized`){this.#B.push(e.message),this.#at(!0);return}switch(this.#h&&e.type!==`error`&&this.#at(!1),e.type){case`schemaSkew`:this.#Be(e);break;case`schema`:this.#Ve(e);break;case`subscribeAck`:this.#et();for(let t of e.instances){this.#j.set(t.instance,t);let e=this.#M.get(t.instance);e!==void 0&&e.phase!==`complete`&&this.#lt(t.instance,`acked`)}break;case`pokeStart`:this.#et(),this.#z=[];break;case`pokePart`:this.#z===null?this.#B.push(`doync: pokePart arrived with no open poke`):this.#z.push(...e.patches);break;case`pokeEnd`:this.#z===null?this.#B.push(`doync: pokeEnd arrived with no open poke`):this.#Ae(e.cookie,e.lastMutationId,e.confirms);break;case`pokeReject`:this.#ze(e.mutationId,e.error,e.reason);break;case`onceStart`:this.#P.set(e.id,[]);break;case`oncePart`:{let t=this.#P.get(e.id);t===void 0?this.#B.push(`doync: oncePart arrived with no open once`):t.push(...e.rows);break}case`onceEnd`:this.#ke(e);break;case`resyncRequired`:this.#B.push(e.message),this.#K(()=>this.#Ze(`heldAt ahead of vouched baseline (instance ${e.instance}: heldAt=${e.heldAt} baseline=${e.baseline}) — ${e.message}`));break;case`error`:if(this.#B.push(e.message),xe(e.message)){this.#K(()=>this.#Ze(`cookie above the Origin head (server reset) — ${e.message}`));break}e.instances===void 0?this.#Oe(e.message):this.#De(e.instances,e.message);break;default:this.#B.push(`doync: unknown ServerMessage type ${String(e.type)}`)}}#De(e,t){let n=Error(t);for(let t of e){let e=this.#M.get(t);e!==void 0&&(e.phase===`pending`||e.phase===`acked`)&&this.#lt(t,`error`,n)}}#Oe(e){let t=Error(e);for(let[e,n]of this.#M)(n.phase===`pending`||n.phase===`acked`)&&this.#lt(e,`error`,t)}#ke(e){let t=this.#P.get(e.id)??[];this.#P.delete(e.id);let n=this.#N.get(e.id);if(n!==void 0){if(this.#N.delete(e.id),e.error!==void 0){n.view.settleError(Error(e.error));return}n.view.deliver(t.map(_e))}}#Ae(e,t,n){let r=this.#z??[];this.#z=null,this.#K(()=>this.#je(r,e,t,n))}#je(e,t,n,r){let i=this.#e,a=[];return B(this.#te(()=>{for(let t of e)t.op===`put`&&this.#Ne(t);for(let t of e)t.op===`del`&&this.#Pe(t);for(let t of e)t.op===`pks`&&this.#Fe(t);if(n!==null){for(let e of this.#T)e.mutationId<=n&&!this.#k.has(e.mutationId)&&a.push(e.mutationId);for(let e of a)i.exec(`DELETE FROM __doync_pending WHERE mutation_id = ?`,e)}this.#u=t,m(i,`cookie`,String(t)),this.#he(),this.#T=this.#T.filter(e=>!a.includes(e.mutationId))}),e=>{for(let e of a)this.#pt(e,null);for(let e of a)this.#k.delete(e);this.#st(e),this.#Me(r)})}#Me(e){if(e!==void 0)for(let t of e){let e=this.#M.get(t);e!==void 0&&e.phase===`acked`&&this.#lt(t,`complete`)}}#Ne(e){let t=this.#e,n=this.#Re(e.instance,e.level);t.exec(`INSERT INTO __doync_membership (instance, level, tbl, pk) VALUES (?, ?, ?, ?)
|
|
13
|
+
FROM __doync_release_stamp WHERE instance = ?`,t)[0];return n===void 0?null:S(n)}function w(e){return e.exec(`SELECT instance, cookie, released_at, ttl_ms FROM __doync_release_stamp`).map(S)}function T(t){if(!(0,e.isSqlIdentifier)(t))throw Error(`doync: refusing to quote non-identifier ${JSON.stringify(t)}`);return`"${t}"`}function E(t,n){let r=JSON.parse(t),i=(0,e.tablePrimaryKey)(n);if(!Array.isArray(r)||r.length!==i.length)throw Error(`doync: malformed pk ${t} for table ${n.name} (expected ${i.length} key part(s))`);return r.map(t=>(0,e.decodePkValue)(t))}function D(t){return(0,e.tablePrimaryKey)(t).map(e=>`${T(e)} = ?`).join(` AND `)}function le(t,n){let r=Object.keys(n);for(let n of r)if(!(0,e.isSqlIdentifier)(n))throw Error(`doync: patch image for table ${t.name} has an invalid column name ${JSON.stringify(n)}`);return{columns:r,values:r.map(t=>(0,e.decodeImageValue)(n[t]))}}function O(e,t){let n=e.tables.find(e=>e.name===t);if(n===void 0)throw Error(`doync: no synced table named ${JSON.stringify(t)} in the client schema`);return n}function k(e){return ae(e)}function A(t,n){p(t,`schema_version`)===null&&j(t,n,0,(0,e.declaredSchemaVersion)(n))}function j(e,t,n,r){for(let i of f(t,n,r))e.execBatch(i);m(e,`schema_version`,String(r))}function M(e,t){for(let n of t.tables)e.exec(`DROP TABLE IF EXISTS ${T(n.name)}`)}function ue(t){for(let n of t.tables)if((0,e.isInternalTable)(n.name))throw Error(`doync: synced table ${n.name} uses the reserved __doync_ prefix`)}const N=`logout_behavior`,P=`connected_clock`,F=`doync_optimistic`,I=`doync_body`;var L=class{lifecycle;decode;one;#e=!1;#t=null;#n=new Set;#r=J;#i=Y;#a=!1;#o=null;constructor(e,t,n){this.lifecycle=e,this.decode=t,this.one=n}#s(e){if(this.#o?.read!==e||this.#o.generation!==e.generation){let t=e.rawRows();this.#r=this.decode?this.decode(t):t,this.#o={read:e,generation:e.generation}}return this.#r}#c(){if(this.#a)return;this.#a=!0;let e=this.lifecycle.peek();if(e!==null)this.#s(e),this.#i=e.status();else{let e=this.lifecycle.compute();this.#r=e.rows,this.#i=e.status}}current(){let e=this.lifecycle.peek();return e!==null&&e.generation>0?(this.#a=!0,this.#s(e)):(this.#c(),this.#r)}status(){let e=this.lifecycle.peek();return e===null?(this.#c(),this.#i):(this.#a=!0,this.#i=e.status(),this.#i)}onChange(e){return this.#n.add(e),()=>this.#n.delete(e)}retain(){if(this.#e)return;this.#e=!0,this.#a=!0;let e=this.lifecycle.retain();if(this.#t=e.onChange(()=>{this.#s(e),this.#i=e.status();for(let e of this.#n)e()}),e.generation>0&&(this.#o?.read!==e||this.#o.generation!==e.generation)||e.status()!==this.#i){e.generation>0&&this.#s(e),this.#i=e.status();for(let e of this.#n)e()}}release(){this.#e&&(this.#e=!1,this.#t?.(),this.#t=null,this.lifecycle.release())}},R=class{#e;#t;#n;#r;#i;#a;#o=null;#s;#c;#l=1;#u=null;#d=!1;#f=0;#p=null;#m;#h=!1;#g=null;#_=!1;#v=new Set;#y=0;#b=0;#x=null;#S;#C=new Set;#w=!1;#T=[];#E=new Map;#D=new Map;#O=new Set;#k=new Set;#A=new Map;#j=new Map;#M=new Map;#N=new Map;#P=new Map;#F=1;#I=new Map;#L=new Map;#R=new Set;#z=null;#B=[];#V=!1;#H=[];#U=new Set;constructor(e){this.#e=e.db,this.#t=e.schema,this.#n=e.mutations,this.#r=e.socket,this.#i=e.ctx??null,this.#a=e.token,this.#o=e.userId??null,this.#S=e.onSchemaEvent,this.#c=e.generateId??ve,this.#m=e.now??Date.now,this.#W(e),this.#r.setHandlers({message:e=>this.#Ee(e),open:()=>this.#xe(),close:()=>{this.#p=null,this.#rt(!1)},status:e=>this.#it(e)})}get connectedClock(){return this.#f}releaseStamp(e){return C(this.#e,e)}releaseStamps(){return w(this.#e)}get clientId(){return this.#s}get userId(){return this.#o}get cookie(){return this.#u}get errors(){return this.#B}get recoveredKeys(){return this.#O}get schemaVersion(){return this.#y}get schemaStatus(){return this.#x}#W(t){let n=this.#e;n.exec(`PRAGMA foreign_keys = OFF`),ue(this.#t);let{rolledBack:r}=k(n);r?(this.#Ge(n,(0,e.declaredSchemaVersion)(this.#t)),this.#u=null):A(n,this.#t),this.#y=(0,e.declaredSchemaVersion)(this.#t);let i=be(n);i!==null&&(console.error(`doync: durable meta "${i}" is corrupt — healing by FORGETTING the local store (fresh identity, full re-hydration). A corrupt mutation counter makes the pending queue untrustworthy, so unsynced writes are discarded rather than risk double-apply.`),this.#Ke(n)),this.#b=this.#G(n,`schema_version`)??0;let a=p(n,`client_id`);this.#s=a??t.clientId??this.#c(),a===null&&m(n,`client_id`,this.#s),this.#l=this.#G(n,`next_mutation_id`)??1,this.#u=this.#G(n,`cookie`);let o=Number(p(n,P));Number.isInteger(o)&&o>=0?this.#f=o:(p(n,`connected_clock`)!==null&&console.warn(`doync: durable connected-clock reading is corrupt — resetting to 0 (clock runs slow; GC defers, server full-hydrates)`),this.#f=0),this.#p=null,i!==null&&this.#$e(`forget`,`corrupt durable meta "${i}" — forgot the local store and reset to a fresh identity`),this.#T=n.exec(`SELECT mutation_id, name, args, idem_key FROM __doync_pending ORDER BY mutation_id ASC`).map(t=>{let n=JSON.parse(String(t.args));return{mutationId:Number(t.mutation_id),name:String(t.name),wireArgs:n,args:(0,e.decodeArgs)(n,`mutation args`),key:t.idem_key===null?void 0:String(t.idem_key)}});for(let e of this.#T){let t=this.#ut(e.mutationId,!0);e.key!==void 0&&(this.#D.set(e.key,t.pair),this.#O.add(e.key))}this.#ge({includeStampless:!1}),n.drainWrittenTables();let s=this.#Q();z(s)&&(this.#V=!0,s.then(()=>this.#J(),()=>this.#J()))}#G(e,t){let n=p(e,t);if(n===null)return null;let r=Number(n);if(!Number.isInteger(r))throw Error(`doync: durable meta "${t}" is corrupt (${JSON.stringify(n)} → ${r}) — a non-integer must never ride the wire (ADR-0019 next-id trap); the boot-time corrupt-meta heal should have caught this`);return r}#K(e){if(this.#V){this.#H.push(e);return}this.#V=!0,this.#q(e)}#q(e){let t;try{t=e()}catch(e){throw this.#V=!1,this.#Y(),e}z(t)?t.then(()=>this.#J(),e=>{this.#B.push(`doync: exclusive-chain step rejected — ${K(e)}`),this.#J()}):this.#J()}#J(){this.#V=!1,this.#Y()}#Y(){let e=this.#H.shift();if(e!==void 0){this.#V=!0,this.#q(e);return}this.#X()}#X(){if(this.#U.size===0)return;let e=[...this.#U];this.#U.clear();for(let t of e)t.recompute()&&t.notify()}#Z(e){this.#V?this.#U.add(e):e.recompute()}#Q(){return this.#e.drainWrittenTables(),this.#e.exec(`SAVEPOINT ${F}`),this.#_=!0,this.#A.clear(),B(this.#$(0),()=>{this.#R=W(this.#e.drainWrittenTables())})}#$(e){for(let t=e;t<this.#T.length;t++){let e=this.#ne(this.#T[t]);if(z(e))return e.then(()=>this.#$(t+1))}}#ee(){this.#_&&=(this.#e.exec(`ROLLBACK TO ${F}`),this.#e.exec(`RELEASE ${F}`),!1)}#te(e){let t=this.#R;this.#ee(),this.#e.drainWrittenTables(),this.#e.exec(`BEGIN`);try{e(),this.#e.exec(`COMMIT`)}catch(e){return this.#e.exec(`ROLLBACK`),B(this.#Q(),()=>{throw e})}let n=W(this.#e.drainWrittenTables());return B(this.#Q(),()=>new Set([...t,...n,...this.#R]))}#ne(e){this.#e.exec(`SAVEPOINT ${I}`);let t;try{let n=this.#n[e.name];if(n===void 0)throw Error(`unknown mutation "${e.name}"`);t=n.body({args:e.args,ctx:this.#i,sql:this.#ae()})}catch(t){this.#ie(e.mutationId,t);return}if(z(t))return t.then(()=>this.#re(e.mutationId),t=>this.#ie(e.mutationId,t));this.#re(e.mutationId)}#re(e){this.#e.exec(`RELEASE ${I}`),this.#A.delete(e)}#ie(e,t){this.#e.exec(`ROLLBACK TO ${I}`),this.#e.exec(`RELEASE ${I}`),this.#A.set(e,t)}#ae(){return{exec:(e,...t)=>this.#e.exec(e,...t.map(e=>typeof e==`boolean`?+!!e:e))}}#oe(e){this.#r.send({type:`push`,clientId:this.#s,mutationId:e.mutationId,name:e.name,args:e.wireArgs})}mutate(t,n,r){let i=r?.key;if(i!==void 0){let e=this.#D.get(i);if(e!==void 0)return e}let a=t.name;if(a===void 0||a===``)return G(Error(`doync: mutate requires a registered mutation — wrap it in defineMutations(...) so it carries a dotted name`));let o=this.#n[a];if(o===void 0)return G(Error(`doync: unknown mutation "${a}"`));let s,c;try{s=(0,e.prepareArgs)(o.args,n,`mutation args`),c=(0,e.encodeArgs)(s,`mutation args`)}catch(e){return G(e)}let l=this.#dt(!1);return i!==void 0&&this.#D.set(i,l.pair),this.#K(()=>this.#se({name:a,args:s,wireArgs:c,key:i,promise:l})),l.pair}#se(e){let t=this.#e,n=this.#l;this.#E.set(n,e.promise);let r={mutationId:n,name:e.name,args:e.args,wireArgs:e.wireArgs,key:e.key};return B(this.#te(()=>{t.exec(`INSERT INTO __doync_pending (mutation_id, name, args, idem_key) VALUES (?, ?, ?, ?)`,n,r.name,JSON.stringify(r.wireArgs??null),r.key??null),this.#l=n+1,m(t,`next_mutation_id`,String(this.#l)),this.#T.push(r)}),e=>this.#ce(r,e))}#ce(e,t){let n=e.mutationId;if(!this.#A.has(n)){this.#ft(n,null),this.#st(t),this.#d&&this.#oe(e);return}let r=this.#A.get(n),i=this.#E.get(n)?.pair;return e.key!==void 0&&this.#D.delete(e.key),B(this.#le(n,!0),e=>{this.#ft(n,r),this.#pt(n,r),i?.client.catch(()=>{}),i?.server.catch(()=>{}),this.#st(new Set([...t,...e]))})}#le(e,t=!1){let n=this.#e;return this.#te(()=>{n.exec(`DELETE FROM __doync_pending WHERE mutation_id = ?`,e),this.#T=this.#T.filter(t=>t.mutationId!==e),t&&(this.#l=e,m(n,`next_mutation_id`,String(e)))})}updateAuth(e,t,n){this.#a=e??void 0,n!==void 0&&(this.#o=n),t!==void 0&&(this.#i=t),this.#d&&!this.#w&&typeof e==`string`&&e!==``&&this.#r.send({type:`updateAuth`,jwt:e})}subscribe(e,t){if(H(e))return new V;let{query:n,args:r,options:i}=U(`subscribe`,e,t);if(i?.skip)return new V;let a=n.name,o=n.resolve({args:r,ctx:this.#i}),s={sql:o.sql,params:o.params},c=o.identity,l={name:a,args:r,ttl:i?.ttl,statement:s},u=o.decode;return new L({peek:()=>this.#M.get(c)?.read??null,retain:()=>this.#de(c,l),release:()=>this.#pe(c),compute:()=>{if(this.#V)return{rows:J,status:Y};let e=this.#e.exec(s.sql,...s.params),t=this.#M.get(c);return{rows:u?u(e):e,status:Z(t?.phase??`pending`,t?.error)}}},u,o.one??!1)}preload(e,t){if(H(e))return ge;let{query:n,args:r,options:i}=U(`preload`,e,t),a=n.name,o=n.resolve({args:r,ctx:this.#i}),s=o.identity;this.#fe(s,{name:a,args:r,ttl:i?.ttl,statement:{sql:o.sql,params:o.params}});let c=!1;return{cleanup:()=>{c||(c=!0,this.#pe(s))}}}#ue(e,t){let n=this.#M.get(e);if(n===void 0){let r=this.#Te(e);n={name:t.name,args:t.args,ttl:t.ttl,count:0,read:null,phase:`pending`,error:void 0},this.#M.set(e,n),this.#We(()=>x(this.#e,e)),this.#d&&this.#r.send({type:`subscribe`,queries:[this.#we(e,{heldAt:r})]})}else n.phase===`error`&&this.#d?(this.#lt(e,`pending`),this.#r.send({type:`subscribe`,queries:[this.#we(e)]})):t.ttl!==void 0&&(n.ttl===void 0||t.ttl>n.ttl)&&(n.ttl=t.ttl,this.#d&&this.#r.send({type:`subscribe`,queries:[this.#we(e)]}));return n.count+=1,n}#de(e,t){let r=this.#ue(e,t);if(r.read===null){let i=this.#L.get(e);if(i!==void 0)clearTimeout(i.timer),this.#L.delete(e),r.read=i.read,this.#Z(i.read);else{let i=new n({run:e=>this.#e.exec(e.sql,...e.params),readSet:()=>{let t=this.#j.get(e);return t===void 0?void 0:new Set(t.readSet)}},t.statement,e,Z(r.phase,r.error));r.read=i,this.#Z(i)}}return r.read}#fe(e,t){this.#ue(e,t)}#pe(t){let n=this.#M.get(t);n===void 0||--n.count>0||(this.#M.delete(t),this.#d&&this.#r.send({type:`unsubscribe`,queries:[{name:n.name,args:n.args===void 0?void 0:(0,e.encodeArgs)(n.args,`query args`)}]}),this.#me(t,n.ttl),n.read!==null&&this.#ve(t,n.read))}#me(e,t){let n=this.#u;if(n===null)return;let r={instance:e,cookie:n,releasedAt:this.#f,ttlMs:oe(t)};this.#K(()=>B(this.#te(()=>{se(this.#e,r),this.#ge({includeStampless:!0}),this.#he()}),e=>this.#st(e)))}#he(){m(this.#e,P,String(this.#f))}#ge(e){let t=this.#_e(e.includeStampless);if(t.length!==0){for(let e of t)this.#Le(e);this.#he()}}#_e(e){let t=this.#M,n=w(this.#e),r=new Set(n.map(e=>e.instance)),i=[];if(e){let e=this.#e.exec(`SELECT DISTINCT instance FROM __doync_membership`);for(let n of e){let e=String(n.instance);t.has(e)||r.has(e)||i.push(e)}}let a=this.#f;for(let e of n)t.has(e.instance)||(e.ttlMs<=0||a-e.releasedAt>e.ttlMs)&&i.push(e.instance);return i}#ve(e,t){let n=this.#L.get(e);n!==void 0&&clearTimeout(n.timer),this.#L.set(e,{read:t,timer:setTimeout(()=>{let n=this.#L.get(e);n===void 0||n.read!==t||(this.#L.delete(e),this.#U.delete(t))},q)})}once(t){if(H(t))return new he;let{query:n,args:r}=U(`once`,t),i=n.name,a=n.resolve({args:r,ctx:this.#i}),o;if(this.#V)o=[];else{let e=this.#e.exec(a.sql,...a.params);o=a.decode?a.decode(e):e}let s=`once-${this.#F++}`,c=r===void 0?void 0:(0,e.encodeArgs)(r,`query args`),l=new fe(o,a.decode,{start:()=>{this.#N.set(s,{view:l,name:i,args:c}),this.#d&&this.#r.send({type:`once`,id:s,name:i,args:c})},drop:()=>{this.#N.delete(s),this.#P.delete(s)}});return l}local(e,...t){let n=`local:${e}\u0000${JSON.stringify(t)}`,r={sql:e,params:t};return new L({peek:()=>this.#I.get(n)?.read??null,retain:()=>this.#ye(n,r),release:()=>this.#be(n),compute:()=>this.#V?{rows:J,status:Y}:{rows:this.#e.exec(r.sql,...r.params),status:X}},void 0,void 0)}#ye(e,t){let r=this.#I.get(e);if(r===void 0&&(r={count:0,read:null},this.#I.set(e,r)),r.count+=1,r.read===null){let i=this.#L.get(e);if(i!==void 0)clearTimeout(i.timer),this.#L.delete(e),r.read=i.read,this.#Z(i.read);else{let e=new n({run:e=>this.#e.exec(e.sql,...e.params),readSet:()=>void 0},t,void 0,X);r.read=e,this.#Z(e)}}return r.read}#be(e){let t=this.#I.get(e);t===void 0||--t.count>0||(this.#I.delete(e),t.read!==null&&this.#ve(e,t.read))}#xe(){this.#w||(this.#p=null,this.#rt(!0),this.#Ce())}#Se(){let e=this.#m();if(this.#p!==null){let t=e-this.#p;t>0&&(this.#f+=t)}this.#p=e}#Ce(){for(let e of this.#M.keys())this.#lt(e,`pending`);this.#r.send({type:`connect`,clientId:this.#s,...this.#a===void 0?{}:{jwt:this.#a},cookie:this.#u,desiredQueries:[...this.#M.keys()].map(e=>this.#we(e)),schemaVersion:this.#y});for(let e of this.#T)this.#oe(e);for(let[e,t]of this.#N)this.#r.send({type:`once`,id:e,name:t.name,args:t.args})}#we(t,n){let r=this.#M.get(t),i=n===void 0?this.#Te(t):n.heldAt;return{name:r?.name??t,args:r?.args===void 0?void 0:(0,e.encodeArgs)(r.args,`query args`),...r?.ttl===void 0?{}:{ttl:r.ttl},...i===void 0?{}:{heldAt:i}}}#Te(e){if(!(this.#e.exec(`SELECT 1 FROM __doync_membership WHERE instance = ? LIMIT 1`,e).length>0))return;if(this.#M.has(e))return this.#u??void 0;let t=C(this.#e,e);if(t!==null)return t.cookie}#Ee(e){if(this.#w){e.type===`error`&&this.#B.push(e.message);return}if(e.type===`pong`){this.#Se();return}if(e.type===`unauthorized`){this.#B.push(e.message),this.#at(!0);return}if(e.type===`pokeStart`&&e.clientId!==this.#s){this.#B.push(`doync: pokeStart addressed to client ${e.clientId}, this engine is ${this.#s}`);return}switch(this.#h&&e.type!==`error`&&this.#at(!1),e.type){case`schemaSkew`:this.#Be(e);break;case`schema`:this.#Ve(e);break;case`subscribeAck`:this.#et();for(let t of e.instances){this.#j.set(t.instance,t);let e=this.#M.get(t.instance);e!==void 0&&e.phase!==`complete`&&this.#lt(t.instance,`acked`)}break;case`pokeStart`:this.#et(),this.#z=[];break;case`pokePart`:if(this.#z===null)this.#B.push(`doync: pokePart arrived with no open poke`);else for(let t of e.patches)this.#z.push(t);break;case`pokeEnd`:this.#z===null?this.#B.push(`doync: pokeEnd arrived with no open poke`):this.#Ae(e.cookie,e.lastMutationId,e.confirms);break;case`pokeReject`:this.#ze(e.mutationId,e.error,e.reason);break;case`onceStart`:this.#P.set(e.id,[]);break;case`oncePart`:{let t=this.#P.get(e.id);if(t===void 0)this.#B.push(`doync: oncePart arrived with no open once`);else for(let n of e.rows)t.push(n);break}case`onceEnd`:this.#ke(e);break;case`resyncRequired`:this.#B.push(e.message),this.#K(()=>this.#Ze(`heldAt ahead of vouched baseline (instance ${e.instance}: heldAt=${e.heldAt} baseline=${e.baseline}) — ${e.message}`));break;case`error`:if(this.#B.push(e.message),xe(e.message)){this.#K(()=>this.#Ze(`cookie above the Origin head (server reset) — ${e.message}`));break}e.instances===void 0?this.#Oe(e.message):this.#De(e.instances,e.message);break;default:this.#B.push(`doync: unknown ServerMessage type ${String(e.type)}`)}}#De(e,t){let n=Error(t);for(let t of e){let e=this.#M.get(t);e!==void 0&&(e.phase===`pending`||e.phase===`acked`)&&this.#lt(t,`error`,n)}}#Oe(e){let t=Error(e);for(let[e,n]of this.#M)(n.phase===`pending`||n.phase===`acked`)&&this.#lt(e,`error`,t)}#ke(e){let t=this.#P.get(e.id)??[];this.#P.delete(e.id);let n=this.#N.get(e.id);if(n!==void 0){if(this.#N.delete(e.id),e.error!==void 0){n.view.settleError(Error(e.error));return}n.view.deliver(t.map(_e))}}#Ae(e,t,n){let r=this.#z??[];this.#z=null,this.#K(()=>this.#je(r,e,t,n))}#je(e,t,n,r){let i=this.#e,a=[];return B(this.#te(()=>{for(let t of e)t.op===`put`&&this.#Ne(t);for(let t of e)t.op===`del`&&this.#Pe(t);for(let t of e)t.op===`pks`&&this.#Fe(t);if(n!==null){for(let e of this.#T)e.mutationId<=n&&!this.#k.has(e.mutationId)&&a.push(e.mutationId);for(let e of a)i.exec(`DELETE FROM __doync_pending WHERE mutation_id = ?`,e)}this.#u=t,m(i,`cookie`,String(t)),this.#he(),this.#T=this.#T.filter(e=>!a.includes(e.mutationId))}),e=>{for(let e of a)this.#pt(e,null);for(let e of a)this.#k.delete(e);this.#st(e),this.#Me(r)})}#Me(e){if(e!==void 0)for(let t of e){let e=this.#M.get(t);e!==void 0&&e.phase===`acked`&&this.#lt(t,`complete`)}}#Ne(e){let t=this.#e,n=this.#Re(e.instance,e.level);t.exec(`INSERT INTO __doync_membership (instance, level, tbl, pk) VALUES (?, ?, ?, ?)
|
|
14
14
|
ON CONFLICT (instance, level, pk) DO UPDATE SET tbl = excluded.tbl`,e.instance,e.level,n.name,e.pk);let r=E(e.pk,n);t.exec(`DELETE FROM ${T(n.name)} WHERE ${D(n)}`,...r);let{columns:i,values:a}=le(n,e.image);t.exec(`INSERT INTO ${T(n.name)} (${i.map(T).join(`, `)})
|
|
15
15
|
VALUES (${i.map(()=>`?`).join(`, `)})`,...a)}#Pe(e){this.#Ie(e.instance,e.level,e.pk)}#Fe(e){let t=new Set(e.pks),n=this.#e.exec(`SELECT pk FROM __doync_membership WHERE instance = ? AND level = ?`,e.instance,e.level);for(let r of n){let n=String(r.pk);t.has(n)||this.#Ie(e.instance,e.level,n)}}#Ie(e,t,n){let r=this.#e,i=this.#Re(e,t);r.exec(`DELETE FROM __doync_membership WHERE instance = ? AND level = ? AND pk = ?`,e,t,n);let a=r.exec(`SELECT DISTINCT instance FROM __doync_membership WHERE tbl = ? AND pk = ?`,i.name,n);if(!a.some(e=>this.#M.has(String(e.instance)))){r.exec(`DELETE FROM ${T(i.name)} WHERE ${D(i)}`,...E(n,i));for(let e of a)this.#Le(String(e.instance))}}#Le(e){let t=this.#e,n=t.exec(`SELECT DISTINCT tbl, pk FROM __doync_membership WHERE instance = ?`,e);t.exec(`DELETE FROM __doync_membership WHERE instance = ?`,e),x(t,e);for(let e of n){let n=String(e.tbl),r=String(e.pk);if(t.exec(`SELECT 1 FROM __doync_membership WHERE tbl = ? AND pk = ? LIMIT 1`,n,r).length===0){let e=O(this.#t,n);t.exec(`DELETE FROM ${T(e.name)} WHERE ${D(e)}`,...E(r,e))}}}#Re(e,t){let n=this.#j.get(e);if(n===void 0)throw Error(`doync: patch for unknown instance ${e} — a subscribeAck must precede its hydration poke`);let r=n.levels.find(e=>e.level===t);if(r===void 0)throw Error(`doync: instance ${e} has no Level ${t} in its subscribeAck`);return O(this.#t,r.table)}#ze(e,t,n){if(this.#k.add(e),n===`reaped`){let e=this.#T.length;this.#B.push(t),this.#K(()=>this.#Ze(`server forgot this client (reaped) — dropped ${e} pending write${e===1?``:`s`} — ${t}`,`reaped`));return}this.#K(()=>B(this.#le(e),n=>{this.#pt(e,Error(t)),this.#st(n)}))}#Be(e){let t=e.serverVersion===void 0?``:` (server v${e.serverVersion})`;e.reason===`client-stale`?(this.#$e(`reload`,`schema client-stale: bundle v${this.#y} is behind the Mirror${t} — reload for the new bundle`),this.#nt()):(this.#$e(`server-behind`,`schema client-ahead: bundle v${this.#y} is ahead of the Mirror${t} — backing off until it deploys`),this.#rt(!1),this.#r.reconnect())}#Ve(e){let t=e.version;if(t>this.#y){this.#$e(`reload`,`schema directive v${t} is above the bundled track v${this.#y} — reload for the new bundle`),this.#nt();return}t<=this.#b||this.#K(()=>this.#He(t))}#He(e){let t=t=>`local migration to schema v${e} failed: ${K(t)}`,n;try{n=this.#te(()=>{j(this.#e,this.#t,this.#b,e)})}catch(e){return this.#Ze(t(e))}return de(n,t=>{this.#b=e,this.#st(new Set([...t,...this.#Qe()]))},e=>this.#Ze(t(e)))}resync(){this.#K(()=>this.#Ze(`resync() requested by the consumer`))}forget(){this.#K(()=>this.#Je(`forget() requested by the consumer`))}setLogoutBehavior(e){this.#Ue(N,e)}#Ue(e,t){this.#We(()=>g(this.#e,e,t))}#We(e){this.#K(()=>B(this.#te(e),()=>{}))}#Ge(e,t=this.#y){M(e,this.#t),e.exec(`DELETE FROM __doync_membership`),ce(e),e.exec(`DELETE FROM __doync_pending`),e.exec(`DELETE FROM __doync_meta`),j(e,this.#t,0,t)}#Ke(e){this.#Ge(e),e.exec(`DELETE FROM __doync_prefs`)}#qe(e){let t=this.#e;this.#Xe(e),this.#s=this.#c(),m(t,`client_id`,this.#s),this.#u=null,this.#l=1,this.#f=0,this.#p=null,this.#T=[]}#Je(e){let t=this.#e,n=this.#te(()=>{this.#Ke(t),this.#qe(Error(`doync: ${e} — pending writes were forgotten`))});return this.#Ye(n,`forget`,`forgot the local store — ${e}`)}#Ye(e,t,n){return B(e,e=>{this.#b=this.#y,this.#j.clear(),this.#$e(t,n),this.#d&&(this.#rt(!1),this.#r.reconnect()),this.#st(new Set([...e,...this.#Qe()]))})}#Xe(e){for(let t of this.#E.keys())this.#ft(t,e),this.#pt(t,e);this.#D.clear(),this.#O.clear(),this.#k.clear(),this.#A.clear()}#Ze(e,t=`resync`){let n=this.#e,r=this.#te(()=>{this.#Ge(n),this.#qe(Error(`doync: ${e} — pending writes were dropped`))});return this.#Ye(r,t,t===`reaped`?`client state was reaped — ${e}`:`wiped and resyncing — ${e}`)}#Qe(){return this.#t.tables.map(e=>e.name)}onSchemaChange(e){return this.#C.add(e),()=>this.#C.delete(e)}#$e(e,t){let n={kind:e,message:t};this.#x=n,this.#S?.(n),this.#tt()}#et(){let e=this.#x?.kind;(e===`server-behind`||e===`resync`||e===`reaped`||e===`forget`)&&(this.#x=null,this.#tt())}#tt(){for(let e of this.#C)e()}#nt(){this.#w=!0,this.#rt(!1)}get connectionStatus(){return this.#h?`needs-auth`:this.#d?`connected`:this.#g??`disconnected`}onConnectionChange(e){return this.#v.add(e),()=>this.#v.delete(e)}#rt(e){this.#ot(()=>{this.#d=e,e&&(this.#g=null)})}#it(e){this.#ot(()=>{this.#g=e})}#at(e){this.#ot(()=>{this.#h=e})}#ot(e){let t=this.connectionStatus;if(e(),this.connectionStatus!==t)for(let e of this.#v)e()}#st(e){let t=W(e),n=new Set(this.#U);this.#U.clear();for(let e of this.#ct()){let r=e.readSet;(n.has(e)||r===void 0||[...r].some(e=>t.has(e)))&&e.recompute()&&e.notify()}}*#ct(){for(let e of this.#M.values())e.read!==null&&(yield e.read);for(let e of this.#I.values())e.read!==null&&(yield e.read)}#lt(e,t,n){let r=this.#M.get(e);if(r===void 0)return;r.phase=t,r.error=n;let i=Z(t,n);r.read!==null&&r.read.updateStatus(i)&&r.read.notify()}#ut(e,t){let n=this.#E.get(e);if(n!==void 0)return n;let r=this.#dt(t);return this.#E.set(e,r),r}#dt(e){let t,n,r,i,a=new Promise((e,r)=>{t=e,n=r}),o=new Promise((e,t)=>{r=e,i=t});return e&&(a.catch(()=>{}),o.catch(()=>{})),{pair:{client:a,server:o},resolveClient:t,rejectClient:n,resolveServer:r,rejectServer:i,clientSettled:!1,serverSettled:!1}}#ft(e,t){let n=this.#E.get(e);if(n===void 0){this.#B.push(`doync: settleClient for unknown mutation ${e} — no pending promise (a mutate() awaiting it would hang)`);return}n.clientSettled||(n.clientSettled=!0,t===null?n.resolveClient():n.rejectClient(t))}#pt(e,t){let n=this.#E.get(e);if(n===void 0){this.#B.push(`doync: settleServer for unknown mutation ${e} — no pending promise (a mutate() awaiting it would hang)`);return}n.serverSettled||(n.serverSettled=!0,t===null?n.resolveServer():n.rejectServer(t),n.clientSettled&&this.#E.delete(e))}};function z(e){return e instanceof Promise}function B(e,t){return e instanceof Promise?e.then(t):t(e)}function de(e,t,n){return e instanceof Promise?e.then(t,n):t(e)}var V=class{current(){return J}status(){return Y}onChange(){return()=>{}}retain(){}release(){}},fe=class{#e;#t=new Set;#n=!1;#r=!1;#i=Promise.withResolvers();#a=null;#o;#s;#c;constructor(e,t,n){this.#e=e,this.#o=t,this.#s=n.start,this.#c=n.drop}current(){return this.#l(),this.#e}onChange(e){return this.#l(),this.#t.add(e),()=>this.#t.delete(e)}get server(){return this.#l(),this.#i.promise}deliver(e){if(this.#r)return;let t=this.#o?this.#o(e):e;this.#e=t,this.#i.resolve(t);for(let e of this.#t)e()}settleError(e){this.#r||this.#i.reject(e)}dispose(){this.#r||this.#a===null&&(this.#a=setTimeout(()=>{this.#a=null,!this.#r&&(this.#r=!0,this.#t.clear(),this.#c())},q))}#l(){this.#r||(this.#a!==null&&(clearTimeout(this.#a),this.#a=null),!this.#n&&(this.#n=!0,this.#i=Promise.withResolvers(),this.#i.promise.catch(()=>{}),this.#s()))}};function H(e){return e===!1||e==null}function U(t,n,r){if((0,e.isBoundQuery)(n))return{query:n.query,args:n.args,options:r};throw pe(t,n)}function pe(e,t){return Error(typeof t==`function`?`doync: client.${e} expected a BoundQuery — received a function; did you forget to call it?`:`doync: client.${e} expected a BoundQuery, got ${me(t)}`)}function me(e){if(e===null)return`null`;if(Array.isArray(e))return`an array`;let t=typeof e;if(t===`object`){let t=e.kind;return typeof t==`string`?`an object with kind "${t}"`:`an object`}return t}var he=class{current(){return J}onChange(){return()=>{}}get server(){return new Promise(()=>{})}dispose(){}};const ge={cleanup(){}};function _e(t){let n={};for(let[r,i]of Object.entries(t))n[r]=(0,e.decodeImageValue)(i);return n}function W(t){return new Set([...t].filter(t=>!(0,e.isInternalTable)(t)))}function G(e){let t=Promise.reject(e),n=Promise.reject(e);return t.catch(()=>{}),n.catch(()=>{}),{client:t,server:n}}function K(e){return e instanceof Error?e.message:String(e)}const q=0,J=Object.freeze([]),Y=Object.freeze({status:`unknown`}),X=Object.freeze({status:`complete`});function Z(e,t){return e===`complete`?X:e===`error`?t===void 0?{status:`error`}:{status:`error`,error:t}:Y}const ve=()=>{let e=globalThis.crypto?.randomUUID?.();return e===void 0?`client-${Math.random().toString(16).slice(2)}-${Date.now().toString(16)}`:e},ye=[`schema_version`,`next_mutation_id`,`cookie`];function be(e){for(let t of ye){let n=p(e,t);if(n!==null&&!Number.isInteger(Number(n)))return t}return null}function xe(e){return e.includes(`above the Origin head`)}function Se(e){return Q(e)}function Q(t){t.logoutBehavior!==void 0&&(k(t.db),g(t.db,N,t.logoutBehavior));let n=$(t.authData,t.ctxValidationSchema);return new R({db:t.db,schema:t.schema,mutations:(0,e.flattenMutations)(t.mutations),socket:t.socket,ctx:n.ctx,token:n.token,userId:n.userId,clientId:t.clientId,onSchemaEvent:t.onSchemaEvent})}function $(t,n){if(t===null)return{userId:null,token:void 0,ctx:null};let r=t.ctx;return n!==void 0&&(r=(0,e.validateStandardSchema)(n,t.ctx,`auth context`)),{userId:t.userId,token:t.token,ctx:r}}Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return d}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-OAVaC3pt.d.ts","names":["Input","Output","StandardTypedV1","Props","version","vendor","types","Types","input","output","InferInput","Schema","NonNullable","InferOutput","StandardSchemaV1","validate","value","Options","options","Result","Promise","SuccessResult","FailureResult","issues","libraryOptions","Record","ReadonlyArray","Issue","message","path","PropertyKey","PathSegment","key","StandardJSONSchemaV1","jsonSchema","Converter","Target","target"],"sources":["../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../src/port.ts","../src/socket.ts","../src/replica/meta.ts","../src/replica/stamps.ts","../src/replica/index.ts","../src/engine.ts","../src/client.ts"],"x_google_ignoreList":[0],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client-OAVaC3pt.d.ts","names":["Input","Output","StandardTypedV1","Props","version","vendor","types","Types","input","output","InferInput","Schema","NonNullable","InferOutput","StandardSchemaV1","validate","value","Options","options","Result","Promise","SuccessResult","FailureResult","issues","libraryOptions","Record","ReadonlyArray","Issue","message","path","PropertyKey","PathSegment","key","StandardJSONSchemaV1","jsonSchema","Converter","Target","target"],"sources":["../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../src/port.ts","../src/socket.ts","../src/replica/meta.ts","../src/replica/stamps.ts","../src/replica/index.ts","../src/engine.ts","../src/client.ts"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-OPt8Axyp.d.cts","names":["Input","Output","StandardTypedV1","Props","version","vendor","types","Types","input","output","InferInput","Schema","NonNullable","InferOutput","StandardSchemaV1","validate","value","Options","options","Result","Promise","SuccessResult","FailureResult","issues","libraryOptions","Record","ReadonlyArray","Issue","message","path","PropertyKey","PathSegment","key","StandardJSONSchemaV1","jsonSchema","Converter","Target","target"],"sources":["../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../src/port.ts","../src/socket.ts","../src/replica/meta.ts","../src/replica/stamps.ts","../src/replica/index.ts","../src/engine.ts","../src/client.ts"],"x_google_ignoreList":[0],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client-OPt8Axyp.d.cts","names":["Input","Output","StandardTypedV1","Props","version","vendor","types","Types","input","output","InferInput","Schema","NonNullable","InferOutput","StandardSchemaV1","validate","value","Options","options","Result","Promise","SuccessResult","FailureResult","issues","libraryOptions","Record","ReadonlyArray","Issue","message","path","PropertyKey","PathSegment","key","StandardJSONSchemaV1","jsonSchema","Converter","Target","target"],"sources":["../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../src/port.ts","../src/socket.ts","../src/replica/meta.ts","../src/replica/stamps.ts","../src/replica/index.ts","../src/engine.ts","../src/client.ts"],"x_google_ignoreList":[0],"mappings":"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"}
|
package/dist/internal.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./client-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./client-CR5SoP5D.cjs");let t=require("@doync/sqlite-parser");function n(e){return encodeURIComponent(e).replaceAll(`_`,`%5F`)}function r(e,t){let r=n(e);return t===null?`doync__${r}__anon.db`:`doync__${r}__${n(t)}.db`}function i(e){let n;try{n=(0,t.parse)(e)}catch(t){return console.warn(`extractWriteTable: failed to parse SQL statement`,{sql:e,err:t}),null}switch(n.kind){case`STMT_INSERT`:case`STMT_UPDATE`:case`STMT_DELETE`:return n.table??null;default:return null}}exports.ClientEngine=e.i,exports.__CONNECTED_CLOCK_META_KEY=e.a,exports.__LOGOUT_BEHAVIOR_PREF_KEY=e.o,exports.applyBundledMigrations=e.u,exports.bundledSchemaDdl=e.v,exports.classifyClientStatement=e.y,exports.createClientEngine=e.n,exports.createEngineTables=e.d,exports.dbFileForUserId=r,exports.dropConsumerTables=e.f,exports.extractWriteTable=i,exports.isFalsyQuery=e.s,exports.normalizeQuerySurface=e.c,exports.readMeta=e.m,exports.readPref=e.h,exports.replayMigrations=e.p,exports.resolveClientAuthData=e.r,exports.settledRejection=e.l,exports.splitClientStatements=e.b,exports.writeMeta=e.g,exports.writePref=e._;
|
package/dist/internal.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{_ as e,a as t,b as n,c as r,d as i,f as a,g as o,h as s,i as c,l,m as u,n as d,o as f,p,r as m,s as h,u as g,v as _,y as v}from"./client-
|
|
1
|
+
import{_ as e,a as t,b as n,c as r,d as i,f as a,g as o,h as s,i as c,l,m as u,n as d,o as f,p,r as m,s as h,u as g,v as _,y as v}from"./client-C97IzM56.js";import{parse as y}from"@doync/sqlite-parser";function b(e){return encodeURIComponent(e).replaceAll(`_`,`%5F`)}function x(e,t){let n=b(e);return t===null?`doync__${n}__anon.db`:`doync__${n}__${b(t)}.db`}function S(e){let t;try{t=y(e)}catch(t){return console.warn(`extractWriteTable: failed to parse SQL statement`,{sql:e,err:t}),null}switch(t.kind){case`STMT_INSERT`:case`STMT_UPDATE`:case`STMT_DELETE`:return t.table??null;default:return null}}export{c as ClientEngine,t as __CONNECTED_CLOCK_META_KEY,f as __LOGOUT_BEHAVIOR_PREF_KEY,g as applyBundledMigrations,_ as bundledSchemaDdl,v as classifyClientStatement,d as createClientEngine,i as createEngineTables,x as dbFileForUserId,a as dropConsumerTables,S as extractWriteTable,h as isFalsyQuery,r as normalizeQuerySurface,u as readMeta,s as readPref,p as replayMigrations,m as resolveClientAuthData,l as settledRejection,n as splitClientStatements,o as writeMeta,e as writePref};
|
|
2
2
|
//# sourceMappingURL=internal.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@doync/client",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "doync client engine: optimistic Layer-1 savepoint/rebase over a synchronous local-DB port",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"client",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@doync/core": "0.3.
|
|
60
|
+
"@doync/core": "0.3.2",
|
|
61
61
|
"@doync/sqlite-parser": "0.3053001.1"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"typescript": "^7.0.2",
|
|
70
70
|
"unplugin-raw": "^0.7.0",
|
|
71
71
|
"vitest": "4.1.9",
|
|
72
|
-
"@doync/drizzle": "0.3.
|
|
72
|
+
"@doync/drizzle": "0.3.2"
|
|
73
73
|
},
|
|
74
74
|
"scripts": {
|
|
75
75
|
"build": "rm -rf dist && tsdown",
|
package/src/engine.ts
CHANGED
|
@@ -2103,6 +2103,15 @@ export class ClientEngine implements DoyncClient {
|
|
|
2103
2103
|
this.#setNeedsAuth(true)
|
|
2104
2104
|
return
|
|
2105
2105
|
}
|
|
2106
|
+
// Bidirectional Pin (ADR-0016 addendum / closeio/doync#400): a poke
|
|
2107
|
+
// addressed to another Client is not handshake proof and never opens the
|
|
2108
|
+
// buffer. Trailing part/end hit the existing no-open-poke arms.
|
|
2109
|
+
if (message.type === 'pokeStart' && message.clientId !== this.#clientId) {
|
|
2110
|
+
this.#errors.push(
|
|
2111
|
+
`doync: pokeStart addressed to client ${message.clientId}, this engine is ${this.#clientId}`,
|
|
2112
|
+
)
|
|
2113
|
+
return
|
|
2114
|
+
}
|
|
2106
2115
|
if (this.#needsAuth && message.type !== 'error') {
|
|
2107
2116
|
this.#setNeedsAuth(false)
|
|
2108
2117
|
}
|
|
@@ -2134,7 +2143,7 @@ export class ClientEngine implements DoyncClient {
|
|
|
2134
2143
|
if (this.#pokeBuffer === null) {
|
|
2135
2144
|
this.#errors.push('doync: pokePart arrived with no open poke')
|
|
2136
2145
|
} else {
|
|
2137
|
-
this.#pokeBuffer.push(
|
|
2146
|
+
for (const patch of message.patches) this.#pokeBuffer.push(patch)
|
|
2138
2147
|
}
|
|
2139
2148
|
break
|
|
2140
2149
|
case 'pokeEnd':
|
|
@@ -2160,7 +2169,7 @@ export class ClientEngine implements DoyncClient {
|
|
|
2160
2169
|
if (buffer === undefined) {
|
|
2161
2170
|
this.#errors.push('doync: oncePart arrived with no open once')
|
|
2162
2171
|
} else {
|
|
2163
|
-
|
|
2172
|
+
for (const row of message.rows) buffer.push(row)
|
|
2164
2173
|
}
|
|
2165
2174
|
break
|
|
2166
2175
|
}
|
package/src/socket-reconnect.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// ADR-0016; closeio/doync#90/#185 — shared reconnect policy for web and mobile.
|
|
2
|
-
// Buffers sends, exponential backoff on unexpected close, keepalive
|
|
3
|
-
// drops stale outbox on reconnect (re-handshake
|
|
2
|
+
// Buffers sends, jittered exponential backoff on unexpected close, keepalive
|
|
3
|
+
// pings with a wire watchdog, and drops stale outbox on reconnect (re-handshake
|
|
4
|
+
// resends pending).
|
|
4
5
|
|
|
5
6
|
import { PING_FRAME } from '@doync/core/internal'
|
|
6
7
|
|
|
@@ -48,8 +49,8 @@ export interface ReconnectingSocketConfig {
|
|
|
48
49
|
onDisconnected?(info: SocketCloseInfo): void
|
|
49
50
|
/** Server→client frame (JSON text). */
|
|
50
51
|
onMessage?(data: string): void
|
|
51
|
-
/** Schedule a
|
|
52
|
-
schedule?(callback: () => void, delayMs: number): void
|
|
52
|
+
/** Schedule a timer after `delayMs`; return a canceller when supported. */
|
|
53
|
+
schedule?(callback: () => void, delayMs: number): void | (() => void)
|
|
53
54
|
/**
|
|
54
55
|
* Register a repeating keepalive tick; return a canceller (defaults to
|
|
55
56
|
* `setInterval` / `clearInterval`).
|
|
@@ -59,8 +60,13 @@ export interface ReconnectingSocketConfig {
|
|
|
59
60
|
backoffBaseMs?: number
|
|
60
61
|
/** Backoff cap in ms. Default 10_000. */
|
|
61
62
|
backoffMaxMs?: number
|
|
62
|
-
/**
|
|
63
|
+
/**
|
|
64
|
+
* Keepalive ping period in ms while open. Each ping arms a 5s watchdog.
|
|
65
|
+
* Default 30_000.
|
|
66
|
+
*/
|
|
63
67
|
pingIntervalMs?: number
|
|
68
|
+
/** Random source for reconnect jitter. Defaults to `Math.random`. */
|
|
69
|
+
random?: () => number
|
|
64
70
|
}
|
|
65
71
|
|
|
66
72
|
/** Lifecycle handle for one reconnecting server socket. */
|
|
@@ -75,9 +81,19 @@ export interface ReconnectingSocket {
|
|
|
75
81
|
reconnect(): void
|
|
76
82
|
/**
|
|
77
83
|
* Skip pending backoff and dial immediately if not open. No-op while open or
|
|
78
|
-
* dial already in flight. Use for mobile foreground
|
|
84
|
+
* dial already in flight. Use for mobile foreground lifecycle nudges.
|
|
79
85
|
*/
|
|
80
86
|
reconnectNow(): void
|
|
87
|
+
/**
|
|
88
|
+
* @internal Test-only socket interruption that suppresses subsequent
|
|
89
|
+
* dialing.
|
|
90
|
+
*/
|
|
91
|
+
__simulateDisconnect(): void
|
|
92
|
+
/**
|
|
93
|
+
* @internal Test-only release of the simulated interruption followed by an
|
|
94
|
+
* immediate dial.
|
|
95
|
+
*/
|
|
96
|
+
__simulateReconnect(): void
|
|
81
97
|
/** Enqueue a client→server frame; flushed once open. */
|
|
82
98
|
send(frame: string): void
|
|
83
99
|
}
|
|
@@ -85,11 +101,14 @@ export interface ReconnectingSocket {
|
|
|
85
101
|
const DEFAULT_BACKOFF_BASE_MS = 250
|
|
86
102
|
const DEFAULT_BACKOFF_MAX_MS = 10_000
|
|
87
103
|
const DEFAULT_PING_INTERVAL_MS = 30_000
|
|
104
|
+
const WATCHDOG_TIMEOUT_MS = 5_000
|
|
105
|
+
const CONNECTION_ATTEMPT_TIMEOUT_MS = 30_000
|
|
106
|
+
const UPTIME_RESET_MS = 5_000
|
|
88
107
|
|
|
89
108
|
/**
|
|
90
|
-
* Create a reconnecting socket coordinator: buffers sends, exponential
|
|
91
|
-
* on unexpected close, keepalive
|
|
92
|
-
* reconnect (the re-handshake resends pending pushes).
|
|
109
|
+
* Create a reconnecting socket coordinator: buffers sends, jittered exponential
|
|
110
|
+
* backoff on unexpected close, keepalive pings with a wire watchdog, and drops
|
|
111
|
+
* the stale outbox on reconnect (the re-handshake resends pending pushes).
|
|
93
112
|
*/
|
|
94
113
|
export function createReconnectingSocket(
|
|
95
114
|
config: ReconnectingSocketConfig,
|
|
@@ -97,7 +116,8 @@ export function createReconnectingSocket(
|
|
|
97
116
|
const schedule =
|
|
98
117
|
config.schedule ??
|
|
99
118
|
((cb, delay) => {
|
|
100
|
-
setTimeout(cb, delay)
|
|
119
|
+
const handle = setTimeout(cb, delay)
|
|
120
|
+
return () => clearTimeout(handle)
|
|
101
121
|
})
|
|
102
122
|
const scheduleInterval =
|
|
103
123
|
config.scheduleInterval ??
|
|
@@ -108,6 +128,7 @@ export function createReconnectingSocket(
|
|
|
108
128
|
const backoffBaseMs = config.backoffBaseMs ?? DEFAULT_BACKOFF_BASE_MS
|
|
109
129
|
const backoffMaxMs = config.backoffMaxMs ?? DEFAULT_BACKOFF_MAX_MS
|
|
110
130
|
const pingIntervalMs = config.pingIntervalMs ?? DEFAULT_PING_INTERVAL_MS
|
|
131
|
+
const random = config.random ?? Math.random
|
|
111
132
|
|
|
112
133
|
let socket: ReconnectSocket | null = null
|
|
113
134
|
const outbox: string[] = []
|
|
@@ -120,27 +141,129 @@ export function createReconnectingSocket(
|
|
|
120
141
|
* outbox; reconnect drops it (re-handshake resends pending).
|
|
121
142
|
*/
|
|
122
143
|
let reopening = false
|
|
144
|
+
/**
|
|
145
|
+
* Transport error on the CURRENT socket before its close => error status vs
|
|
146
|
+
* disconnected. Reset on every dial; stale-socket handlers are detached or
|
|
147
|
+
* identity-guarded, so only the current socket writes it.
|
|
148
|
+
*/
|
|
149
|
+
let errored = false
|
|
123
150
|
/** Cancel keepalive interval; null when not open. */
|
|
124
151
|
let cancelPing: (() => void) | null = null
|
|
152
|
+
/** Suppresses all dialing while the test seam holds the socket down. */
|
|
153
|
+
let __simulatedDown = false
|
|
154
|
+
|
|
125
155
|
/**
|
|
126
|
-
*
|
|
127
|
-
*
|
|
156
|
+
* One pending timer at a time: arming replaces the previous, clearing voids
|
|
157
|
+
* it. The `active` flag makes clearing effective even for injected schedules
|
|
158
|
+
* that return no canceller (#185).
|
|
128
159
|
*/
|
|
129
|
-
|
|
160
|
+
function oneShotTimer() {
|
|
161
|
+
let cancel: (() => void) | null = null
|
|
162
|
+
return {
|
|
163
|
+
arm(callback: () => void, delayMs: number): void {
|
|
164
|
+
cancel?.()
|
|
165
|
+
let active = true
|
|
166
|
+
const c = schedule(() => {
|
|
167
|
+
if (!active) return
|
|
168
|
+
active = false
|
|
169
|
+
cancel = null
|
|
170
|
+
callback()
|
|
171
|
+
}, delayMs)
|
|
172
|
+
cancel = () => {
|
|
173
|
+
active = false
|
|
174
|
+
if (typeof c === 'function') c()
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
clear(): void {
|
|
178
|
+
cancel?.()
|
|
179
|
+
cancel = null
|
|
180
|
+
},
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Watchdog armed by the latest ping. */
|
|
185
|
+
const watchdog = oneShotTimer()
|
|
186
|
+
/** Timeout for the current connecting socket. */
|
|
187
|
+
const attemptTimeout = oneShotTimer()
|
|
188
|
+
/** Uptime gate for the current open socket. */
|
|
189
|
+
const uptimeReset = oneShotTimer()
|
|
190
|
+
/** Pending backoff dial. */
|
|
191
|
+
const backoff = oneShotTimer()
|
|
192
|
+
|
|
193
|
+
function clearDialTimers(): void {
|
|
194
|
+
attemptTimeout.clear()
|
|
195
|
+
uptimeReset.clear()
|
|
196
|
+
}
|
|
130
197
|
|
|
131
198
|
function stopPing(): void {
|
|
132
199
|
cancelPing?.()
|
|
133
200
|
cancelPing = null
|
|
201
|
+
watchdog.clear()
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function handleUnexpectedClose(
|
|
205
|
+
sock: ReconnectSocket,
|
|
206
|
+
code: number | undefined,
|
|
207
|
+
): void {
|
|
208
|
+
if (socket !== sock) return
|
|
209
|
+
socket = null
|
|
210
|
+
clearDialTimers()
|
|
211
|
+
stopPing()
|
|
212
|
+
// Report drop unless we closed; 1008 included (#102). Auth stays sticky on hub.
|
|
213
|
+
if (!closedByUs) config.onDisconnected?.({ code, wasError: errored })
|
|
214
|
+
// Unexpected close reconnects; close() stays down.
|
|
215
|
+
if (!closedByUs) scheduleReconnect()
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function detachHandlers(sock: ReconnectSocket): void {
|
|
219
|
+
sock.onclose = null
|
|
220
|
+
sock.onerror = null
|
|
221
|
+
sock.onopen = null
|
|
222
|
+
sock.onmessage = null
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function forceUnexpectedClose(sock: ReconnectSocket): void {
|
|
226
|
+
if (socket !== sock) return
|
|
227
|
+
detachHandlers(sock)
|
|
228
|
+
sock.close()
|
|
229
|
+
handleUnexpectedClose(sock, undefined)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function armWatchdog(sock: ReconnectSocket): void {
|
|
233
|
+
watchdog.arm(() => {
|
|
234
|
+
if (socket !== sock || sock.readyState !== 'open') return
|
|
235
|
+
forceUnexpectedClose(sock)
|
|
236
|
+
}, WATCHDOG_TIMEOUT_MS)
|
|
134
237
|
}
|
|
135
238
|
|
|
136
239
|
function startPing(): void {
|
|
137
240
|
stopPing()
|
|
138
241
|
cancelPing = scheduleInterval(() => {
|
|
242
|
+
const sock = socket
|
|
139
243
|
// Exact DO keepalive bytes (ADR-0016); skip if socket closed between ticks.
|
|
140
|
-
if (
|
|
244
|
+
if (sock?.readyState === 'open') {
|
|
245
|
+
armWatchdog(sock)
|
|
246
|
+
sock.send(PING_FRAME)
|
|
247
|
+
}
|
|
141
248
|
}, pingIntervalMs)
|
|
142
249
|
}
|
|
143
250
|
|
|
251
|
+
function armAttemptTimeout(sock: ReconnectSocket): void {
|
|
252
|
+
attemptTimeout.clear()
|
|
253
|
+
if (sock.readyState !== 'connecting') return
|
|
254
|
+
attemptTimeout.arm(() => {
|
|
255
|
+
if (socket !== sock || sock.readyState !== 'connecting') return
|
|
256
|
+
forceUnexpectedClose(sock)
|
|
257
|
+
}, CONNECTION_ATTEMPT_TIMEOUT_MS)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function armUptimeReset(sock: ReconnectSocket): void {
|
|
261
|
+
uptimeReset.arm(() => {
|
|
262
|
+
if (socket !== sock || sock.readyState !== 'open') return
|
|
263
|
+
attempt = 0
|
|
264
|
+
}, UPTIME_RESET_MS)
|
|
265
|
+
}
|
|
266
|
+
|
|
144
267
|
function flushOutbox(): void {
|
|
145
268
|
if (!socket || socket.readyState !== 'open') return
|
|
146
269
|
while (outbox.length > 0) {
|
|
@@ -150,30 +273,33 @@ export function createReconnectingSocket(
|
|
|
150
273
|
}
|
|
151
274
|
|
|
152
275
|
function scheduleReconnect(): void {
|
|
153
|
-
|
|
276
|
+
if (__simulatedDown) return
|
|
277
|
+
const curve = Math.min(backoffBaseMs * 2 ** attempt, backoffMaxMs)
|
|
278
|
+
const sample = Math.min(1, Math.max(0, random()))
|
|
279
|
+
const delay = curve / 2 + sample * (curve / 2)
|
|
154
280
|
attempt++
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
if (closedByUs) return
|
|
158
|
-
// reconnectNow/later schedule stole this slot — no double-dial.
|
|
159
|
-
if (gen !== reconnectGeneration) return
|
|
281
|
+
backoff.arm(() => {
|
|
282
|
+
if (closedByUs || __simulatedDown) return
|
|
160
283
|
connect()
|
|
161
284
|
}, delay)
|
|
162
285
|
}
|
|
163
286
|
|
|
164
287
|
function connect(): void {
|
|
288
|
+
if (__simulatedDown) return
|
|
165
289
|
if (socket && socket.readyState !== 'closed') return
|
|
290
|
+
clearDialTimers()
|
|
291
|
+
stopPing()
|
|
166
292
|
// Surface connecting through the whole backoff, not just first open (#102).
|
|
167
293
|
config.onConnecting?.()
|
|
168
294
|
const next = config.connect()
|
|
169
295
|
socket = next
|
|
170
|
-
|
|
171
|
-
let errored = false
|
|
296
|
+
errored = false
|
|
172
297
|
next.onopen = () => {
|
|
173
298
|
// A superseded socket (close then open before the prior onclose) must not
|
|
174
299
|
// drive handshake / ping of the abandoned dial (closeio/doync#319).
|
|
175
300
|
if (socket !== next) return
|
|
176
|
-
|
|
301
|
+
attemptTimeout.clear()
|
|
302
|
+
armUptimeReset(next)
|
|
177
303
|
// Reconnect drops stale outbox (re-handshake resends); first open keeps it.
|
|
178
304
|
if (reopening) outbox.length = 0
|
|
179
305
|
reopening = true
|
|
@@ -183,6 +309,7 @@ export function createReconnectingSocket(
|
|
|
183
309
|
}
|
|
184
310
|
next.onmessage = (data: string) => {
|
|
185
311
|
if (socket !== next) return
|
|
312
|
+
watchdog.clear()
|
|
186
313
|
config.onMessage?.(data)
|
|
187
314
|
}
|
|
188
315
|
next.onerror = () => {
|
|
@@ -195,14 +322,9 @@ export function createReconnectingSocket(
|
|
|
195
322
|
// onclose lands. The late event must not null the NEW socket or schedule a
|
|
196
323
|
// reconnect that races the intentional redial — otherwise the tab wedges
|
|
197
324
|
// `disconnected` with no usable dial (closeio/doync#319).
|
|
198
|
-
|
|
199
|
-
socket = null
|
|
200
|
-
stopPing()
|
|
201
|
-
// Report drop unless we closed; 1008 included (#102). Auth stays sticky on hub.
|
|
202
|
-
if (!closedByUs) config.onDisconnected?.({ code, wasError: errored })
|
|
203
|
-
// Unexpected close reconnects; close() stays down.
|
|
204
|
-
if (!closedByUs) scheduleReconnect()
|
|
325
|
+
handleUnexpectedClose(next, code)
|
|
205
326
|
}
|
|
327
|
+
armAttemptTimeout(next)
|
|
206
328
|
}
|
|
207
329
|
|
|
208
330
|
return {
|
|
@@ -210,14 +332,16 @@ export function createReconnectingSocket(
|
|
|
210
332
|
return socket?.readyState === 'open'
|
|
211
333
|
},
|
|
212
334
|
open(): void {
|
|
335
|
+
if (__simulatedDown) return
|
|
213
336
|
closedByUs = false
|
|
214
337
|
connect()
|
|
215
338
|
},
|
|
216
339
|
close(): void {
|
|
217
340
|
closedByUs = true
|
|
218
341
|
stopPing()
|
|
219
|
-
|
|
220
|
-
|
|
342
|
+
clearDialTimers()
|
|
343
|
+
// Cancel pending backoff so close after drop stays silent.
|
|
344
|
+
backoff.clear()
|
|
221
345
|
socket?.close()
|
|
222
346
|
socket = null
|
|
223
347
|
},
|
|
@@ -233,29 +357,42 @@ export function createReconnectingSocket(
|
|
|
233
357
|
// no-op on the detached generation. No-op if no socket. Backoff is the
|
|
234
358
|
// default recovery; callers that know the pin moved call reconnectNow()
|
|
235
359
|
// to skip it.
|
|
236
|
-
if (socket === null) return
|
|
360
|
+
if (__simulatedDown || socket === null) return
|
|
237
361
|
closedByUs = false
|
|
238
362
|
const stale = socket
|
|
239
363
|
socket = null
|
|
240
364
|
stopPing()
|
|
365
|
+
clearDialTimers()
|
|
241
366
|
// Detach handlers so a synchronous close (test fakes) or a queued
|
|
242
367
|
// browser onclose cannot double-report or double-schedule.
|
|
243
|
-
stale
|
|
244
|
-
stale.onerror = null
|
|
245
|
-
stale.onopen = null
|
|
246
|
-
stale.onmessage = null
|
|
368
|
+
detachHandlers(stale)
|
|
247
369
|
config.onDisconnected?.({})
|
|
248
370
|
scheduleReconnect()
|
|
249
371
|
stale.close()
|
|
250
372
|
},
|
|
251
373
|
reconnectNow(): void {
|
|
252
|
-
// Foreground
|
|
374
|
+
// Foreground lifecycle nudge (#185) and mid-session pin change after
|
|
253
375
|
// reconnect() (ADR-0037): skip backoff and dial now. Open is a no-op
|
|
254
376
|
// (caller must reconnect() first). Connecting is a no-op (a dial already
|
|
255
377
|
// carries the pin for this attempt).
|
|
256
|
-
if (socket && socket.readyState !== 'closed') return
|
|
378
|
+
if (__simulatedDown || (socket && socket.readyState !== 'closed')) return
|
|
379
|
+
closedByUs = false
|
|
380
|
+
// The immediate dial supersedes any pending backoff dial.
|
|
381
|
+
backoff.clear()
|
|
382
|
+
connect()
|
|
383
|
+
},
|
|
384
|
+
__simulateDisconnect(): void {
|
|
385
|
+
__simulatedDown = true
|
|
386
|
+
backoff.clear()
|
|
387
|
+
if (socket === null) return
|
|
388
|
+
// The simulated teardown reports through the unexpected-drop path.
|
|
389
|
+
closedByUs = false
|
|
390
|
+
forceUnexpectedClose(socket)
|
|
391
|
+
},
|
|
392
|
+
__simulateReconnect(): void {
|
|
393
|
+
__simulatedDown = false
|
|
257
394
|
closedByUs = false
|
|
258
|
-
|
|
395
|
+
backoff.clear()
|
|
259
396
|
connect()
|
|
260
397
|
},
|
|
261
398
|
send(frame: string): void {
|